From c3e4c9a25c2910d2d66d52215b3406b13d5b23d5 Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Sun, 29 Jun 2014 12:34:32 +0300 Subject: Add more board models --- boards/dk-tm4c123g/Makefile | 76 + boards/dk-tm4c123g/bitband/Makefile | 87 + boards/dk-tm4c123g/bitband/bitband.c | 292 + boards/dk-tm4c123g/bitband/bitband.ewd | 614 + boards/dk-tm4c123g/bitband/bitband.ewp | 792 + boards/dk-tm4c123g/bitband/bitband.icf | 78 + boards/dk-tm4c123g/bitband/bitband.ld | 57 + boards/dk-tm4c123g/bitband/bitband.sct | 47 + boards/dk-tm4c123g/bitband/bitband.uvopt | 317 + boards/dk-tm4c123g/bitband/bitband.uvproj | 434 + boards/dk-tm4c123g/bitband/bitband_ccs.cmd | 70 + boards/dk-tm4c123g/bitband/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/bitband/ccs/.ccsproject | 10 + boards/dk-tm4c123g/bitband/ccs/.cproject | 191 + boards/dk-tm4c123g/bitband/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c123g/bitband/ccs/Debug/bitband.bin | Bin 0 -> 5880 bytes boards/dk-tm4c123g/bitband/ccs/Debug/bitband.out | Bin 0 -> 122303 bytes boards/dk-tm4c123g/bitband/ccs/macros.ini_initial | 1 + boards/dk-tm4c123g/bitband/ccs/target_config.ccxml | 13 + boards/dk-tm4c123g/bitband/ewarm/Exe/bitband.bin | Bin 0 -> 5208 bytes boards/dk-tm4c123g/bitband/ewarm/Exe/bitband.out | Bin 0 -> 89804 bytes boards/dk-tm4c123g/bitband/gcc/bitband.axf | Bin 0 -> 68740 bytes boards/dk-tm4c123g/bitband/gcc/bitband.bin | Bin 0 -> 5323 bytes boards/dk-tm4c123g/bitband/readme.txt | 29 + boards/dk-tm4c123g/bitband/rvmdk/bitband.axf | Bin 0 -> 115400 bytes boards/dk-tm4c123g/bitband/rvmdk/bitband.bin | Bin 0 -> 5432 bytes boards/dk-tm4c123g/bitband/startup_ccs.c | 295 + boards/dk-tm4c123g/bitband/startup_ewarm.c | 326 + boards/dk-tm4c123g/bitband/startup_gcc.c | 342 + boards/dk-tm4c123g/bitband/startup_rvmdk.S | 351 + boards/dk-tm4c123g/blinky/Makefile | 77 + boards/dk-tm4c123g/blinky/blinky.c | 93 + boards/dk-tm4c123g/blinky/blinky.ewd | 614 + boards/dk-tm4c123g/blinky/blinky.ewp | 777 + boards/dk-tm4c123g/blinky/blinky.icf | 78 + boards/dk-tm4c123g/blinky/blinky.ld | 57 + boards/dk-tm4c123g/blinky/blinky.sct | 47 + boards/dk-tm4c123g/blinky/blinky.uvopt | 268 + boards/dk-tm4c123g/blinky/blinky.uvproj | 414 + boards/dk-tm4c123g/blinky/blinky_ccs.cmd | 70 + boards/dk-tm4c123g/blinky/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/blinky/ccs/.ccsproject | 10 + boards/dk-tm4c123g/blinky/ccs/.cproject | 183 + boards/dk-tm4c123g/blinky/ccs/.project | 50 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c123g/blinky/ccs/Debug/blinky.bin | Bin 0 -> 1424 bytes boards/dk-tm4c123g/blinky/ccs/Debug/blinky.out | Bin 0 -> 32086 bytes boards/dk-tm4c123g/blinky/ccs/macros.ini_initial | 1 + boards/dk-tm4c123g/blinky/ccs/target_config.ccxml | 13 + boards/dk-tm4c123g/blinky/ewarm/Exe/blinky.bin | Bin 0 -> 848 bytes boards/dk-tm4c123g/blinky/ewarm/Exe/blinky.out | Bin 0 -> 13424 bytes boards/dk-tm4c123g/blinky/gcc/blinky.axf | Bin 0 -> 34684 bytes boards/dk-tm4c123g/blinky/gcc/blinky.bin | Bin 0 -> 804 bytes boards/dk-tm4c123g/blinky/readme.txt | 23 + boards/dk-tm4c123g/blinky/rvmdk/blinky.axf | Bin 0 -> 10328 bytes boards/dk-tm4c123g/blinky/rvmdk/blinky.bin | Bin 0 -> 852 bytes boards/dk-tm4c123g/blinky/startup_ccs.c | 295 + boards/dk-tm4c123g/blinky/startup_ewarm.c | 326 + boards/dk-tm4c123g/blinky/startup_gcc.c | 342 + boards/dk-tm4c123g/blinky/startup_rvmdk.S | 351 + boards/dk-tm4c123g/boot_demo1/Makefile | 92 + boards/dk-tm4c123g/boot_demo1/boot_demo1.c | 267 + boards/dk-tm4c123g/boot_demo1/boot_demo1.ewd | 614 + boards/dk-tm4c123g/boot_demo1/boot_demo1.ewp | 801 + boards/dk-tm4c123g/boot_demo1/boot_demo1.icf | 78 + boards/dk-tm4c123g/boot_demo1/boot_demo1.ld | 57 + boards/dk-tm4c123g/boot_demo1/boot_demo1.sct | 47 + boards/dk-tm4c123g/boot_demo1/boot_demo1.uvopt | 331 + boards/dk-tm4c123g/boot_demo1/boot_demo1.uvproj | 439 + boards/dk-tm4c123g/boot_demo1/boot_demo1_ccs.cmd | 70 + boards/dk-tm4c123g/boot_demo1/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/boot_demo1/ccs/.ccsproject | 10 + boards/dk-tm4c123g/boot_demo1/ccs/.cproject | 197 + boards/dk-tm4c123g/boot_demo1/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../boot_demo1/ccs/Debug/boot_demo1.bin | Bin 0 -> 6456 bytes .../boot_demo1/ccs/Debug/boot_demo1.out | Bin 0 -> 127413 bytes .../dk-tm4c123g/boot_demo1/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/boot_demo1/ccs/target_config.ccxml | 13 + .../boot_demo1/ewarm/Exe/boot_demo1.bin | Bin 0 -> 5716 bytes .../boot_demo1/ewarm/Exe/boot_demo1.out | Bin 0 -> 100412 bytes boards/dk-tm4c123g/boot_demo1/gcc/boot_demo1.axf | Bin 0 -> 36034 bytes boards/dk-tm4c123g/boot_demo1/gcc/boot_demo1.bin | Bin 0 -> 5915 bytes boards/dk-tm4c123g/boot_demo1/readme.txt | 48 + boards/dk-tm4c123g/boot_demo1/rvmdk/boot_demo1.axf | Bin 0 -> 120952 bytes boards/dk-tm4c123g/boot_demo1/rvmdk/boot_demo1.bin | Bin 0 -> 6148 bytes boards/dk-tm4c123g/boot_demo1/startup_ccs.c | 364 + boards/dk-tm4c123g/boot_demo1/startup_ewarm.c | 395 + boards/dk-tm4c123g/boot_demo1/startup_gcc.c | 411 + boards/dk-tm4c123g/boot_demo1/startup_rvmdk.S | 359 + boards/dk-tm4c123g/boot_demo2/Makefile | 93 + boards/dk-tm4c123g/boot_demo2/boot_demo2.c | 311 + boards/dk-tm4c123g/boot_demo2/boot_demo2.ewd | 614 + boards/dk-tm4c123g/boot_demo2/boot_demo2.ewp | 804 + boards/dk-tm4c123g/boot_demo2/boot_demo2.icf | 78 + boards/dk-tm4c123g/boot_demo2/boot_demo2.ld | 57 + boards/dk-tm4c123g/boot_demo2/boot_demo2.sct | 47 + boards/dk-tm4c123g/boot_demo2/boot_demo2.uvopt | 345 + boards/dk-tm4c123g/boot_demo2/boot_demo2.uvproj | 444 + boards/dk-tm4c123g/boot_demo2/boot_demo2_ccs.cmd | 70 + boards/dk-tm4c123g/boot_demo2/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/boot_demo2/ccs/.ccsproject | 10 + boards/dk-tm4c123g/boot_demo2/ccs/.cproject | 197 + boards/dk-tm4c123g/boot_demo2/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../boot_demo2/ccs/Debug/boot_demo2.bin | Bin 0 -> 7240 bytes .../boot_demo2/ccs/Debug/boot_demo2.out | Bin 0 -> 138939 bytes .../dk-tm4c123g/boot_demo2/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/boot_demo2/ccs/target_config.ccxml | 13 + .../boot_demo2/ewarm/Exe/boot_demo2.bin | Bin 0 -> 6436 bytes .../boot_demo2/ewarm/Exe/boot_demo2.out | Bin 0 -> 116868 bytes boards/dk-tm4c123g/boot_demo2/gcc/boot_demo2.axf | Bin 0 -> 36570 bytes boards/dk-tm4c123g/boot_demo2/gcc/boot_demo2.bin | Bin 0 -> 6704 bytes boards/dk-tm4c123g/boot_demo2/readme.txt | 49 + boards/dk-tm4c123g/boot_demo2/rvmdk/boot_demo2.axf | Bin 0 -> 126864 bytes boards/dk-tm4c123g/boot_demo2/rvmdk/boot_demo2.bin | Bin 0 -> 6884 bytes boards/dk-tm4c123g/boot_demo2/startup_ccs.c | 364 + boards/dk-tm4c123g/boot_demo2/startup_ewarm.c | 395 + boards/dk-tm4c123g/boot_demo2/startup_gcc.c | 411 + boards/dk-tm4c123g/boot_demo2/startup_rvmdk.S | 359 + boards/dk-tm4c123g/boot_serial/Makefile | 98 + boards/dk-tm4c123g/boot_serial/bl_config.h | 1137 + boards/dk-tm4c123g/boot_serial/boot_serial.ewd | 614 + boards/dk-tm4c123g/boot_serial/boot_serial.ewp | 821 + boards/dk-tm4c123g/boot_serial/boot_serial.uvopt | 450 + boards/dk-tm4c123g/boot_serial/boot_serial.uvproj | 479 + boards/dk-tm4c123g/boot_serial/ccs/.ccsimportspec | 6 + boards/dk-tm4c123g/boot_serial/ccs/.ccsproject | 10 + boards/dk-tm4c123g/boot_serial/ccs/.cproject | 191 + boards/dk-tm4c123g/boot_serial/ccs/.project | 115 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../boot_serial/ccs/Debug/boot_serial.bin | Bin 0 -> 1284 bytes .../boot_serial/ccs/Debug/boot_serial.out | Bin 0 -> 36761 bytes .../dk-tm4c123g/boot_serial/ccs/macros.ini_initial | 1 + .../boot_serial/ccs/target_config.ccxml | 13 + .../boot_serial/ewarm/Exe/boot_serial.bin | Bin 0 -> 1260 bytes .../boot_serial/ewarm/Exe/boot_serial.out | Bin 0 -> 40312 bytes boards/dk-tm4c123g/boot_serial/gcc/boot_serial.axf | Bin 0 -> 36412 bytes boards/dk-tm4c123g/boot_serial/gcc/boot_serial.bin | Bin 0 -> 1280 bytes .../dk-tm4c123g/boot_serial/rvmdk/boot_serial.axf | Bin 0 -> 25472 bytes .../dk-tm4c123g/boot_serial/rvmdk/boot_serial.bin | Bin 0 -> 1192 bytes boards/dk-tm4c123g/boot_usb/Makefile | 98 + boards/dk-tm4c123g/boot_usb/bl_config.h | 1137 + boards/dk-tm4c123g/boot_usb/boot_usb.ewd | 614 + boards/dk-tm4c123g/boot_usb/boot_usb.ewp | 821 + boards/dk-tm4c123g/boot_usb/boot_usb.uvopt | 450 + boards/dk-tm4c123g/boot_usb/boot_usb.uvproj | 479 + boards/dk-tm4c123g/boot_usb/ccs/.ccsimportspec | 6 + boards/dk-tm4c123g/boot_usb/ccs/.ccsproject | 10 + boards/dk-tm4c123g/boot_usb/ccs/.cproject | 191 + boards/dk-tm4c123g/boot_usb/ccs/.project | 115 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c123g/boot_usb/ccs/Debug/boot_usb.bin | Bin 0 -> 4009 bytes boards/dk-tm4c123g/boot_usb/ccs/Debug/boot_usb.out | Bin 0 -> 95910 bytes boards/dk-tm4c123g/boot_usb/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/boot_usb/ccs/target_config.ccxml | 13 + boards/dk-tm4c123g/boot_usb/ewarm/Exe/boot_usb.bin | Bin 0 -> 3812 bytes boards/dk-tm4c123g/boot_usb/ewarm/Exe/boot_usb.out | Bin 0 -> 90844 bytes boards/dk-tm4c123g/boot_usb/gcc/boot_usb.axf | Bin 0 -> 43052 bytes boards/dk-tm4c123g/boot_usb/gcc/boot_usb.bin | Bin 0 -> 4162 bytes boards/dk-tm4c123g/boot_usb/rvmdk/boot_usb.axf | Bin 0 -> 60692 bytes boards/dk-tm4c123g/boot_usb/rvmdk/boot_usb.bin | Bin 0 -> 3920 bytes boards/dk-tm4c123g/can/Makefile | 89 + boards/dk-tm4c123g/can/can.c | 847 + boards/dk-tm4c123g/can/can.ewd | 614 + boards/dk-tm4c123g/can/can.ewp | 795 + boards/dk-tm4c123g/can/can.icf | 78 + boards/dk-tm4c123g/can/can.ld | 57 + boards/dk-tm4c123g/can/can.sct | 47 + boards/dk-tm4c123g/can/can.uvopt | 331 + boards/dk-tm4c123g/can/can.uvproj | 439 + boards/dk-tm4c123g/can/can_ccs.cmd | 70 + boards/dk-tm4c123g/can/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/can/ccs/.ccsproject | 10 + boards/dk-tm4c123g/can/ccs/.cproject | 191 + boards/dk-tm4c123g/can/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c123g/can/ccs/Debug/can.bin | Bin 0 -> 10056 bytes boards/dk-tm4c123g/can/ccs/Debug/can.out | Bin 0 -> 194565 bytes boards/dk-tm4c123g/can/ccs/macros.ini_initial | 1 + boards/dk-tm4c123g/can/ccs/target_config.ccxml | 13 + boards/dk-tm4c123g/can/ewarm/Exe/can.bin | Bin 0 -> 8968 bytes boards/dk-tm4c123g/can/ewarm/Exe/can.out | Bin 0 -> 157896 bytes boards/dk-tm4c123g/can/gcc/can.axf | Bin 0 -> 71082 bytes boards/dk-tm4c123g/can/gcc/can.bin | Bin 0 -> 9279 bytes boards/dk-tm4c123g/can/readme.txt | 56 + boards/dk-tm4c123g/can/rvmdk/can.axf | Bin 0 -> 152148 bytes boards/dk-tm4c123g/can/rvmdk/can.bin | Bin 0 -> 10384 bytes boards/dk-tm4c123g/can/startup_ccs.c | 302 + boards/dk-tm4c123g/can/startup_ewarm.c | 333 + boards/dk-tm4c123g/can/startup_gcc.c | 349 + boards/dk-tm4c123g/can/startup_rvmdk.S | 358 + boards/dk-tm4c123g/dk-tm4c123g.eww | 240 + boards/dk-tm4c123g/dk-tm4c123g.uvmpw | 175 + boards/dk-tm4c123g/drivers/buttons.c | 186 + boards/dk-tm4c123g/drivers/buttons.h | 103 + boards/dk-tm4c123g/drivers/cfal96x64x16.c | 816 + boards/dk-tm4c123g/drivers/cfal96x64x16.h | 37 + boards/dk-tm4c123g/drivers/slidemenuwidget.c | 1424 + boards/dk-tm4c123g/drivers/slidemenuwidget.h | 457 + boards/dk-tm4c123g/drivers/stripchartwidget.c | 672 + boards/dk-tm4c123g/drivers/stripchartwidget.h | 392 + boards/dk-tm4c123g/drivers/usb_sound.c | 804 + boards/dk-tm4c123g/drivers/usb_sound.h | 81 + boards/dk-tm4c123g/grlib_demo/Makefile | 87 + boards/dk-tm4c123g/grlib_demo/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/grlib_demo/ccs/.ccsproject | 10 + boards/dk-tm4c123g/grlib_demo/ccs/.cproject | 191 + boards/dk-tm4c123g/grlib_demo/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../grlib_demo/ccs/Debug/grlib_demo.bin | Bin 0 -> 9336 bytes .../grlib_demo/ccs/Debug/grlib_demo.out | Bin 0 -> 162991 bytes .../dk-tm4c123g/grlib_demo/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/grlib_demo/ccs/target_config.ccxml | 13 + .../grlib_demo/ewarm/Exe/grlib_demo.bin | Bin 0 -> 8416 bytes .../grlib_demo/ewarm/Exe/grlib_demo.out | Bin 0 -> 135612 bytes boards/dk-tm4c123g/grlib_demo/gcc/grlib_demo.axf | Bin 0 -> 69242 bytes boards/dk-tm4c123g/grlib_demo/gcc/grlib_demo.bin | Bin 0 -> 8535 bytes boards/dk-tm4c123g/grlib_demo/grlib_demo.c | 248 + boards/dk-tm4c123g/grlib_demo/grlib_demo.ewd | 614 + boards/dk-tm4c123g/grlib_demo/grlib_demo.ewp | 792 + boards/dk-tm4c123g/grlib_demo/grlib_demo.icf | 78 + boards/dk-tm4c123g/grlib_demo/grlib_demo.ld | 57 + boards/dk-tm4c123g/grlib_demo/grlib_demo.sct | 47 + boards/dk-tm4c123g/grlib_demo/grlib_demo.uvopt | 317 + boards/dk-tm4c123g/grlib_demo/grlib_demo.uvproj | 434 + boards/dk-tm4c123g/grlib_demo/grlib_demo_ccs.cmd | 70 + boards/dk-tm4c123g/grlib_demo/readme.txt | 26 + boards/dk-tm4c123g/grlib_demo/rvmdk/grlib_demo.axf | Bin 0 -> 129844 bytes boards/dk-tm4c123g/grlib_demo/rvmdk/grlib_demo.bin | Bin 0 -> 8932 bytes boards/dk-tm4c123g/grlib_demo/startup_ccs.c | 295 + boards/dk-tm4c123g/grlib_demo/startup_ewarm.c | 326 + boards/dk-tm4c123g/grlib_demo/startup_gcc.c | 342 + boards/dk-tm4c123g/grlib_demo/startup_rvmdk.S | 351 + boards/dk-tm4c123g/hello/Makefile | 89 + boards/dk-tm4c123g/hello/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/hello/ccs/.ccsproject | 10 + boards/dk-tm4c123g/hello/ccs/.cproject | 191 + boards/dk-tm4c123g/hello/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c123g/hello/ccs/Debug/hello.bin | Bin 0 -> 7424 bytes boards/dk-tm4c123g/hello/ccs/Debug/hello.out | Bin 0 -> 147936 bytes boards/dk-tm4c123g/hello/ccs/macros.ini_initial | 1 + boards/dk-tm4c123g/hello/ccs/target_config.ccxml | 13 + boards/dk-tm4c123g/hello/ewarm/Exe/hello.bin | Bin 0 -> 6528 bytes boards/dk-tm4c123g/hello/ewarm/Exe/hello.out | Bin 0 -> 108980 bytes boards/dk-tm4c123g/hello/gcc/hello.axf | Bin 0 -> 69220 bytes boards/dk-tm4c123g/hello/gcc/hello.bin | Bin 0 -> 6530 bytes boards/dk-tm4c123g/hello/hello.c | 183 + boards/dk-tm4c123g/hello/hello.ewd | 614 + boards/dk-tm4c123g/hello/hello.ewp | 795 + boards/dk-tm4c123g/hello/hello.icf | 78 + boards/dk-tm4c123g/hello/hello.ld | 57 + boards/dk-tm4c123g/hello/hello.sct | 47 + boards/dk-tm4c123g/hello/hello.uvopt | 331 + boards/dk-tm4c123g/hello/hello.uvproj | 439 + boards/dk-tm4c123g/hello/hello_ccs.cmd | 70 + boards/dk-tm4c123g/hello/readme.txt | 27 + boards/dk-tm4c123g/hello/rvmdk/hello.axf | Bin 0 -> 125072 bytes boards/dk-tm4c123g/hello/rvmdk/hello.bin | Bin 0 -> 6688 bytes boards/dk-tm4c123g/hello/startup_ccs.c | 295 + boards/dk-tm4c123g/hello/startup_ewarm.c | 326 + boards/dk-tm4c123g/hello/startup_gcc.c | 342 + boards/dk-tm4c123g/hello/startup_rvmdk.S | 351 + boards/dk-tm4c123g/hibernate/Makefile | 91 + boards/dk-tm4c123g/hibernate/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/hibernate/ccs/.ccsproject | 10 + boards/dk-tm4c123g/hibernate/ccs/.cproject | 191 + boards/dk-tm4c123g/hibernate/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c123g/hibernate/ccs/Debug/hibernate.bin | Bin 0 -> 9080 bytes .../dk-tm4c123g/hibernate/ccs/Debug/hibernate.out | Bin 0 -> 186051 bytes .../dk-tm4c123g/hibernate/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/hibernate/ccs/target_config.ccxml | 13 + .../dk-tm4c123g/hibernate/ewarm/Exe/hibernate.bin | Bin 0 -> 7776 bytes .../dk-tm4c123g/hibernate/ewarm/Exe/hibernate.out | Bin 0 -> 171432 bytes boards/dk-tm4c123g/hibernate/gcc/hibernate.axf | Bin 0 -> 70911 bytes boards/dk-tm4c123g/hibernate/gcc/hibernate.bin | Bin 0 -> 8292 bytes boards/dk-tm4c123g/hibernate/hibernate.c | 536 + boards/dk-tm4c123g/hibernate/hibernate.ewd | 614 + boards/dk-tm4c123g/hibernate/hibernate.ewp | 801 + boards/dk-tm4c123g/hibernate/hibernate.icf | 78 + boards/dk-tm4c123g/hibernate/hibernate.ld | 57 + boards/dk-tm4c123g/hibernate/hibernate.sct | 47 + boards/dk-tm4c123g/hibernate/hibernate.uvopt | 359 + boards/dk-tm4c123g/hibernate/hibernate.uvproj | 449 + boards/dk-tm4c123g/hibernate/hibernate_ccs.cmd | 70 + boards/dk-tm4c123g/hibernate/readme.txt | 30 + boards/dk-tm4c123g/hibernate/rvmdk/hibernate.axf | Bin 0 -> 142440 bytes boards/dk-tm4c123g/hibernate/rvmdk/hibernate.bin | Bin 0 -> 8416 bytes boards/dk-tm4c123g/hibernate/startup_ccs.c | 302 + boards/dk-tm4c123g/hibernate/startup_ewarm.c | 333 + boards/dk-tm4c123g/hibernate/startup_gcc.c | 349 + boards/dk-tm4c123g/hibernate/startup_rvmdk.S | 358 + boards/dk-tm4c123g/interrupts/Makefile | 87 + boards/dk-tm4c123g/interrupts/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/interrupts/ccs/.ccsproject | 10 + boards/dk-tm4c123g/interrupts/ccs/.cproject | 191 + boards/dk-tm4c123g/interrupts/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../interrupts/ccs/Debug/interrupts.bin | Bin 0 -> 6904 bytes .../interrupts/ccs/Debug/interrupts.out | Bin 0 -> 127764 bytes .../dk-tm4c123g/interrupts/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/interrupts/ccs/target_config.ccxml | 13 + .../interrupts/ewarm/Exe/interrupts.bin | Bin 0 -> 6020 bytes .../interrupts/ewarm/Exe/interrupts.out | Bin 0 -> 106900 bytes boards/dk-tm4c123g/interrupts/gcc/interrupts.axf | Bin 0 -> 69084 bytes boards/dk-tm4c123g/interrupts/gcc/interrupts.bin | Bin 0 -> 6327 bytes boards/dk-tm4c123g/interrupts/interrupts.c | 592 + boards/dk-tm4c123g/interrupts/interrupts.ewd | 614 + boards/dk-tm4c123g/interrupts/interrupts.ewp | 792 + boards/dk-tm4c123g/interrupts/interrupts.icf | 78 + boards/dk-tm4c123g/interrupts/interrupts.ld | 57 + boards/dk-tm4c123g/interrupts/interrupts.sct | 47 + boards/dk-tm4c123g/interrupts/interrupts.uvopt | 317 + boards/dk-tm4c123g/interrupts/interrupts.uvproj | 434 + boards/dk-tm4c123g/interrupts/interrupts_ccs.cmd | 70 + boards/dk-tm4c123g/interrupts/readme.txt | 33 + boards/dk-tm4c123g/interrupts/rvmdk/interrupts.axf | Bin 0 -> 118408 bytes boards/dk-tm4c123g/interrupts/rvmdk/interrupts.bin | Bin 0 -> 6336 bytes boards/dk-tm4c123g/interrupts/startup_ccs.c | 304 + boards/dk-tm4c123g/interrupts/startup_ewarm.c | 335 + boards/dk-tm4c123g/interrupts/startup_gcc.c | 351 + boards/dk-tm4c123g/interrupts/startup_rvmdk.S | 360 + boards/dk-tm4c123g/mpu_fault/Makefile | 87 + boards/dk-tm4c123g/mpu_fault/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/mpu_fault/ccs/.ccsproject | 10 + boards/dk-tm4c123g/mpu_fault/ccs/.cproject | 191 + boards/dk-tm4c123g/mpu_fault/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c123g/mpu_fault/ccs/Debug/mpu_fault.bin | Bin 0 -> 6184 bytes .../dk-tm4c123g/mpu_fault/ccs/Debug/mpu_fault.out | Bin 0 -> 122016 bytes .../dk-tm4c123g/mpu_fault/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/mpu_fault/ccs/target_config.ccxml | 13 + .../dk-tm4c123g/mpu_fault/ewarm/Exe/mpu_fault.bin | Bin 0 -> 5488 bytes .../dk-tm4c123g/mpu_fault/ewarm/Exe/mpu_fault.out | Bin 0 -> 95628 bytes boards/dk-tm4c123g/mpu_fault/gcc/mpu_fault.axf | Bin 0 -> 68870 bytes boards/dk-tm4c123g/mpu_fault/gcc/mpu_fault.bin | Bin 0 -> 5683 bytes boards/dk-tm4c123g/mpu_fault/mpu_fault.c | 413 + boards/dk-tm4c123g/mpu_fault/mpu_fault.ewd | 614 + boards/dk-tm4c123g/mpu_fault/mpu_fault.ewp | 792 + boards/dk-tm4c123g/mpu_fault/mpu_fault.icf | 78 + boards/dk-tm4c123g/mpu_fault/mpu_fault.ld | 57 + boards/dk-tm4c123g/mpu_fault/mpu_fault.sct | 47 + boards/dk-tm4c123g/mpu_fault/mpu_fault.uvopt | 317 + boards/dk-tm4c123g/mpu_fault/mpu_fault.uvproj | 434 + boards/dk-tm4c123g/mpu_fault/mpu_fault_ccs.cmd | 70 + boards/dk-tm4c123g/mpu_fault/readme.txt | 25 + boards/dk-tm4c123g/mpu_fault/rvmdk/mpu_fault.axf | Bin 0 -> 115348 bytes boards/dk-tm4c123g/mpu_fault/rvmdk/mpu_fault.bin | Bin 0 -> 5624 bytes boards/dk-tm4c123g/mpu_fault/startup_ccs.c | 302 + boards/dk-tm4c123g/mpu_fault/startup_ewarm.c | 333 + boards/dk-tm4c123g/mpu_fault/startup_gcc.c | 349 + boards/dk-tm4c123g/mpu_fault/startup_rvmdk.S | 358 + boards/dk-tm4c123g/qs-logger/Makefile | 109 + boards/dk-tm4c123g/qs-logger/acquire.c | 1349 + boards/dk-tm4c123g/qs-logger/acquire.h | 57 + boards/dk-tm4c123g/qs-logger/ccs/.ccsimportspec | 27 + boards/dk-tm4c123g/qs-logger/ccs/.ccsproject | 10 + boards/dk-tm4c123g/qs-logger/ccs/.cproject | 197 + boards/dk-tm4c123g/qs-logger/ccs/.project | 135 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c123g/qs-logger/ccs/Debug/qs-logger.bin | Bin 0 -> 65408 bytes .../dk-tm4c123g/qs-logger/ccs/Debug/qs-logger.out | Bin 0 -> 1240943 bytes .../dk-tm4c123g/qs-logger/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/qs-logger/ccs/target_config.ccxml | 13 + boards/dk-tm4c123g/qs-logger/clocksetwidget.c | 1031 + boards/dk-tm4c123g/qs-logger/clocksetwidget.h | 273 + .../dk-tm4c123g/qs-logger/ewarm/Exe/qs-logger.bin | Bin 0 -> 60396 bytes .../dk-tm4c123g/qs-logger/ewarm/Exe/qs-logger.out | Bin 0 -> 1052176 bytes boards/dk-tm4c123g/qs-logger/flashstore.c | 625 + boards/dk-tm4c123g/qs-logger/flashstore.h | 60 + boards/dk-tm4c123g/qs-logger/gcc/qs-logger.axf | Bin 0 -> 146940 bytes boards/dk-tm4c123g/qs-logger/gcc/qs-logger.bin | Bin 0 -> 69464 bytes boards/dk-tm4c123g/qs-logger/images.c | 865 + boards/dk-tm4c123g/qs-logger/images.h | 37 + boards/dk-tm4c123g/qs-logger/menus.c | 782 + boards/dk-tm4c123g/qs-logger/menus.h | 85 + boards/dk-tm4c123g/qs-logger/qs-logger.c | 1333 + boards/dk-tm4c123g/qs-logger/qs-logger.ewd | 614 + boards/dk-tm4c123g/qs-logger/qs-logger.ewp | 848 + boards/dk-tm4c123g/qs-logger/qs-logger.h | 186 + boards/dk-tm4c123g/qs-logger/qs-logger.icf | 78 + boards/dk-tm4c123g/qs-logger/qs-logger.ld | 57 + boards/dk-tm4c123g/qs-logger/qs-logger.sct | 47 + boards/dk-tm4c123g/qs-logger/qs-logger.uvopt | 569 + boards/dk-tm4c123g/qs-logger/qs-logger.uvproj | 524 + boards/dk-tm4c123g/qs-logger/qs-logger_ccs.cmd | 70 + boards/dk-tm4c123g/qs-logger/readme.txt | 97 + boards/dk-tm4c123g/qs-logger/rvmdk/qs-logger.axf | Bin 0 -> 724752 bytes boards/dk-tm4c123g/qs-logger/rvmdk/qs-logger.bin | Bin 0 -> 66464 bytes boards/dk-tm4c123g/qs-logger/startup_ccs.c | 307 + boards/dk-tm4c123g/qs-logger/startup_ewarm.c | 338 + boards/dk-tm4c123g/qs-logger/startup_gcc.c | 354 + boards/dk-tm4c123g/qs-logger/startup_rvmdk.S | 363 + boards/dk-tm4c123g/qs-logger/stripchartmanager.c | 456 + boards/dk-tm4c123g/qs-logger/stripchartmanager.h | 63 + boards/dk-tm4c123g/qs-logger/usb_serial_structs.c | 217 + boards/dk-tm4c123g/qs-logger/usb_serial_structs.h | 49 + boards/dk-tm4c123g/qs-logger/usbserial.c | 459 + boards/dk-tm4c123g/qs-logger/usbserial.h | 56 + boards/dk-tm4c123g/qs-logger/usbstick.c | 818 + boards/dk-tm4c123g/qs-logger/usbstick.h | 58 + boards/dk-tm4c123g/sd_card/Makefile | 97 + boards/dk-tm4c123g/sd_card/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/sd_card/ccs/.ccsproject | 10 + boards/dk-tm4c123g/sd_card/ccs/.cproject | 195 + boards/dk-tm4c123g/sd_card/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c123g/sd_card/ccs/Debug/sd_card.bin | Bin 0 -> 46792 bytes boards/dk-tm4c123g/sd_card/ccs/Debug/sd_card.out | Bin 0 -> 337558 bytes boards/dk-tm4c123g/sd_card/ccs/macros.ini_initial | 1 + boards/dk-tm4c123g/sd_card/ccs/target_config.ccxml | 13 + boards/dk-tm4c123g/sd_card/ewarm/Exe/sd_card.bin | Bin 0 -> 45916 bytes boards/dk-tm4c123g/sd_card/ewarm/Exe/sd_card.out | Bin 0 -> 278564 bytes boards/dk-tm4c123g/sd_card/gcc/sd_card.axf | Bin 0 -> 107156 bytes boards/dk-tm4c123g/sd_card/gcc/sd_card.bin | Bin 0 -> 47116 bytes boards/dk-tm4c123g/sd_card/readme.txt | 34 + boards/dk-tm4c123g/sd_card/rvmdk/sd_card.axf | Bin 0 -> 221376 bytes boards/dk-tm4c123g/sd_card/rvmdk/sd_card.bin | Bin 0 -> 45392 bytes boards/dk-tm4c123g/sd_card/sd_card.c | 922 + boards/dk-tm4c123g/sd_card/sd_card.ewd | 614 + boards/dk-tm4c123g/sd_card/sd_card.ewp | 810 + boards/dk-tm4c123g/sd_card/sd_card.icf | 78 + boards/dk-tm4c123g/sd_card/sd_card.ld | 57 + boards/dk-tm4c123g/sd_card/sd_card.sct | 47 + boards/dk-tm4c123g/sd_card/sd_card.uvopt | 387 + boards/dk-tm4c123g/sd_card/sd_card.uvproj | 459 + boards/dk-tm4c123g/sd_card/sd_card_ccs.cmd | 70 + boards/dk-tm4c123g/sd_card/startup_ccs.c | 302 + boards/dk-tm4c123g/sd_card/startup_ewarm.c | 333 + boards/dk-tm4c123g/sd_card/startup_gcc.c | 349 + boards/dk-tm4c123g/sd_card/startup_rvmdk.S | 358 + boards/dk-tm4c123g/sine_demo/Makefile | 88 + boards/dk-tm4c123g/sine_demo/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/sine_demo/ccs/.ccsproject | 10 + boards/dk-tm4c123g/sine_demo/ccs/.cproject | 191 + boards/dk-tm4c123g/sine_demo/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c123g/sine_demo/ccs/Debug/sine_demo.bin | Bin 0 -> 12888 bytes .../dk-tm4c123g/sine_demo/ccs/Debug/sine_demo.out | Bin 0 -> 235735 bytes .../dk-tm4c123g/sine_demo/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/sine_demo/ccs/target_config.ccxml | 13 + .../dk-tm4c123g/sine_demo/ewarm/Exe/sine_demo.bin | Bin 0 -> 11628 bytes .../dk-tm4c123g/sine_demo/ewarm/Exe/sine_demo.out | Bin 0 -> 176416 bytes boards/dk-tm4c123g/sine_demo/gcc/sine_demo.axf | Bin 0 -> 79873 bytes boards/dk-tm4c123g/sine_demo/gcc/sine_demo.bin | Bin 0 -> 17960 bytes boards/dk-tm4c123g/sine_demo/readme.txt | 24 + boards/dk-tm4c123g/sine_demo/rvmdk/sine_demo.axf | Bin 0 -> 183428 bytes boards/dk-tm4c123g/sine_demo/rvmdk/sine_demo.bin | Bin 0 -> 12112 bytes boards/dk-tm4c123g/sine_demo/sine_demo.c | 332 + boards/dk-tm4c123g/sine_demo/sine_demo.ewd | 614 + boards/dk-tm4c123g/sine_demo/sine_demo.ewp | 795 + boards/dk-tm4c123g/sine_demo/sine_demo.icf | 78 + boards/dk-tm4c123g/sine_demo/sine_demo.ld | 57 + boards/dk-tm4c123g/sine_demo/sine_demo.sct | 47 + boards/dk-tm4c123g/sine_demo/sine_demo.uvopt | 331 + boards/dk-tm4c123g/sine_demo/sine_demo.uvproj | 439 + boards/dk-tm4c123g/sine_demo/sine_demo_ccs.cmd | 70 + boards/dk-tm4c123g/sine_demo/startup_ccs.c | 302 + boards/dk-tm4c123g/sine_demo/startup_ewarm.c | 333 + boards/dk-tm4c123g/sine_demo/startup_gcc.c | 349 + boards/dk-tm4c123g/sine_demo/startup_rvmdk.S | 358 + boards/dk-tm4c123g/softuart_echo/Makefile | 89 + .../dk-tm4c123g/softuart_echo/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/softuart_echo/ccs/.ccsproject | 10 + boards/dk-tm4c123g/softuart_echo/ccs/.cproject | 191 + boards/dk-tm4c123g/softuart_echo/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../softuart_echo/ccs/Debug/softuart_echo.bin | Bin 0 -> 8152 bytes .../softuart_echo/ccs/Debug/softuart_echo.out | Bin 0 -> 167095 bytes .../softuart_echo/ccs/macros.ini_initial | 1 + .../softuart_echo/ccs/target_config.ccxml | 13 + .../softuart_echo/ewarm/Exe/softuart_echo.bin | Bin 0 -> 7228 bytes .../softuart_echo/ewarm/Exe/softuart_echo.out | Bin 0 -> 136296 bytes .../softuart_echo/gcc/softuart_echo.axf | Bin 0 -> 70670 bytes .../softuart_echo/gcc/softuart_echo.bin | Bin 0 -> 7815 bytes boards/dk-tm4c123g/softuart_echo/readme.txt | 27 + .../softuart_echo/rvmdk/softuart_echo.axf | Bin 0 -> 141096 bytes .../softuart_echo/rvmdk/softuart_echo.bin | Bin 0 -> 7524 bytes boards/dk-tm4c123g/softuart_echo/softuart_echo.c | 368 + boards/dk-tm4c123g/softuart_echo/softuart_echo.ewd | 614 + boards/dk-tm4c123g/softuart_echo/softuart_echo.ewp | 795 + boards/dk-tm4c123g/softuart_echo/softuart_echo.icf | 78 + boards/dk-tm4c123g/softuart_echo/softuart_echo.ld | 57 + boards/dk-tm4c123g/softuart_echo/softuart_echo.sct | 47 + .../dk-tm4c123g/softuart_echo/softuart_echo.uvopt | 331 + .../dk-tm4c123g/softuart_echo/softuart_echo.uvproj | 439 + .../softuart_echo/softuart_echo_ccs.cmd | 70 + boards/dk-tm4c123g/softuart_echo/startup_ccs.c | 304 + boards/dk-tm4c123g/softuart_echo/startup_ewarm.c | 335 + boards/dk-tm4c123g/softuart_echo/startup_gcc.c | 351 + boards/dk-tm4c123g/softuart_echo/startup_rvmdk.S | 360 + boards/dk-tm4c123g/timers/Makefile | 87 + boards/dk-tm4c123g/timers/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/timers/ccs/.ccsproject | 10 + boards/dk-tm4c123g/timers/ccs/.cproject | 191 + boards/dk-tm4c123g/timers/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c123g/timers/ccs/Debug/timers.bin | Bin 0 -> 5840 bytes boards/dk-tm4c123g/timers/ccs/Debug/timers.out | Bin 0 -> 121339 bytes boards/dk-tm4c123g/timers/ccs/macros.ini_initial | 1 + boards/dk-tm4c123g/timers/ccs/target_config.ccxml | 13 + boards/dk-tm4c123g/timers/ewarm/Exe/timers.bin | Bin 0 -> 5160 bytes boards/dk-tm4c123g/timers/ewarm/Exe/timers.out | Bin 0 -> 90352 bytes boards/dk-tm4c123g/timers/gcc/timers.axf | Bin 0 -> 68756 bytes boards/dk-tm4c123g/timers/gcc/timers.bin | Bin 0 -> 5259 bytes boards/dk-tm4c123g/timers/readme.txt | 26 + boards/dk-tm4c123g/timers/rvmdk/timers.axf | Bin 0 -> 115064 bytes boards/dk-tm4c123g/timers/rvmdk/timers.bin | Bin 0 -> 5376 bytes boards/dk-tm4c123g/timers/startup_ccs.c | 303 + boards/dk-tm4c123g/timers/startup_ewarm.c | 334 + boards/dk-tm4c123g/timers/startup_gcc.c | 350 + boards/dk-tm4c123g/timers/startup_rvmdk.S | 359 + boards/dk-tm4c123g/timers/timers.c | 234 + boards/dk-tm4c123g/timers/timers.ewd | 614 + boards/dk-tm4c123g/timers/timers.ewp | 792 + boards/dk-tm4c123g/timers/timers.icf | 78 + boards/dk-tm4c123g/timers/timers.ld | 57 + boards/dk-tm4c123g/timers/timers.sct | 47 + boards/dk-tm4c123g/timers/timers.uvopt | 317 + boards/dk-tm4c123g/timers/timers.uvproj | 434 + boards/dk-tm4c123g/timers/timers_ccs.cmd | 70 + boards/dk-tm4c123g/uart_echo/Makefile | 87 + boards/dk-tm4c123g/uart_echo/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/uart_echo/ccs/.ccsproject | 10 + boards/dk-tm4c123g/uart_echo/ccs/.cproject | 191 + boards/dk-tm4c123g/uart_echo/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c123g/uart_echo/ccs/Debug/uart_echo.bin | Bin 0 -> 5888 bytes .../dk-tm4c123g/uart_echo/ccs/Debug/uart_echo.out | Bin 0 -> 121266 bytes .../dk-tm4c123g/uart_echo/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/uart_echo/ccs/target_config.ccxml | 13 + .../dk-tm4c123g/uart_echo/ewarm/Exe/uart_echo.bin | Bin 0 -> 5084 bytes .../dk-tm4c123g/uart_echo/ewarm/Exe/uart_echo.out | Bin 0 -> 92292 bytes boards/dk-tm4c123g/uart_echo/gcc/uart_echo.axf | Bin 0 -> 68662 bytes boards/dk-tm4c123g/uart_echo/gcc/uart_echo.bin | Bin 0 -> 5279 bytes boards/dk-tm4c123g/uart_echo/readme.txt | 26 + boards/dk-tm4c123g/uart_echo/rvmdk/uart_echo.axf | Bin 0 -> 114976 bytes boards/dk-tm4c123g/uart_echo/rvmdk/uart_echo.bin | Bin 0 -> 5400 bytes boards/dk-tm4c123g/uart_echo/startup_ccs.c | 302 + boards/dk-tm4c123g/uart_echo/startup_ewarm.c | 333 + boards/dk-tm4c123g/uart_echo/startup_gcc.c | 349 + boards/dk-tm4c123g/uart_echo/startup_rvmdk.S | 358 + boards/dk-tm4c123g/uart_echo/uart_echo.c | 225 + boards/dk-tm4c123g/uart_echo/uart_echo.ewd | 614 + boards/dk-tm4c123g/uart_echo/uart_echo.ewp | 792 + boards/dk-tm4c123g/uart_echo/uart_echo.icf | 78 + boards/dk-tm4c123g/uart_echo/uart_echo.ld | 57 + boards/dk-tm4c123g/uart_echo/uart_echo.sct | 47 + boards/dk-tm4c123g/uart_echo/uart_echo.uvopt | 317 + boards/dk-tm4c123g/uart_echo/uart_echo.uvproj | 434 + boards/dk-tm4c123g/uart_echo/uart_echo_ccs.cmd | 70 + boards/dk-tm4c123g/udma_demo/Makefile | 90 + boards/dk-tm4c123g/udma_demo/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/udma_demo/ccs/.ccsproject | 10 + boards/dk-tm4c123g/udma_demo/ccs/.cproject | 191 + boards/dk-tm4c123g/udma_demo/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c123g/udma_demo/ccs/Debug/udma_demo.bin | Bin 0 -> 7824 bytes .../dk-tm4c123g/udma_demo/ccs/Debug/udma_demo.out | Bin 0 -> 154630 bytes .../dk-tm4c123g/udma_demo/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/udma_demo/ccs/target_config.ccxml | 13 + .../dk-tm4c123g/udma_demo/ewarm/Exe/udma_demo.bin | Bin 0 -> 6808 bytes .../dk-tm4c123g/udma_demo/ewarm/Exe/udma_demo.out | Bin 0 -> 121120 bytes boards/dk-tm4c123g/udma_demo/gcc/udma_demo.axf | Bin 0 -> 70476 bytes boards/dk-tm4c123g/udma_demo/gcc/udma_demo.bin | Bin 0 -> 7199 bytes boards/dk-tm4c123g/udma_demo/readme.txt | 25 + boards/dk-tm4c123g/udma_demo/rvmdk/udma_demo.axf | Bin 0 -> 128864 bytes boards/dk-tm4c123g/udma_demo/rvmdk/udma_demo.bin | Bin 0 -> 7252 bytes boards/dk-tm4c123g/udma_demo/startup_ccs.c | 305 + boards/dk-tm4c123g/udma_demo/startup_ewarm.c | 336 + boards/dk-tm4c123g/udma_demo/startup_gcc.c | 352 + boards/dk-tm4c123g/udma_demo/startup_rvmdk.S | 361 + boards/dk-tm4c123g/udma_demo/udma_demo.c | 916 + boards/dk-tm4c123g/udma_demo/udma_demo.ewd | 614 + boards/dk-tm4c123g/udma_demo/udma_demo.ewp | 798 + boards/dk-tm4c123g/udma_demo/udma_demo.icf | 78 + boards/dk-tm4c123g/udma_demo/udma_demo.ld | 57 + boards/dk-tm4c123g/udma_demo/udma_demo.sct | 47 + boards/dk-tm4c123g/udma_demo/udma_demo.uvopt | 345 + boards/dk-tm4c123g/udma_demo/udma_demo.uvproj | 444 + boards/dk-tm4c123g/udma_demo/udma_demo_ccs.cmd | 70 + boards/dk-tm4c123g/usb_dev_bulk/Makefile | 92 + boards/dk-tm4c123g/usb_dev_bulk/ccs/.ccsimportspec | 10 + boards/dk-tm4c123g/usb_dev_bulk/ccs/.ccsproject | 10 + boards/dk-tm4c123g/usb_dev_bulk/ccs/.cproject | 195 + boards/dk-tm4c123g/usb_dev_bulk/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin | Bin 0 -> 18288 bytes .../usb_dev_bulk/ccs/Debug/usb_dev_bulk.out | Bin 0 -> 516486 bytes .../usb_dev_bulk/ccs/macros.ini_initial | 1 + .../usb_dev_bulk/ccs/target_config.ccxml | 13 + .../usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin | Bin 0 -> 16876 bytes .../usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out | Bin 0 -> 378112 bytes .../dk-tm4c123g/usb_dev_bulk/gcc/usb_dev_bulk.axf | Bin 0 -> 81822 bytes .../dk-tm4c123g/usb_dev_bulk/gcc/usb_dev_bulk.bin | Bin 0 -> 17685 bytes boards/dk-tm4c123g/usb_dev_bulk/readme.txt | 43 + .../usb_dev_bulk/rvmdk/usb_dev_bulk.axf | Bin 0 -> 332212 bytes .../usb_dev_bulk/rvmdk/usb_dev_bulk.bin | Bin 0 -> 18744 bytes boards/dk-tm4c123g/usb_dev_bulk/startup_ccs.c | 304 + boards/dk-tm4c123g/usb_dev_bulk/startup_ewarm.c | 335 + boards/dk-tm4c123g/usb_dev_bulk/startup_gcc.c | 351 + boards/dk-tm4c123g/usb_dev_bulk/startup_rvmdk.S | 360 + boards/dk-tm4c123g/usb_dev_bulk/usb_bulk_structs.c | 200 + boards/dk-tm4c123g/usb_dev_bulk/usb_bulk_structs.h | 48 + boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.c | 694 + boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ewd | 614 + boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ewp | 805 + boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.icf | 78 + boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ld | 57 + boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.sct | 47 + boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.uvopt | 373 + .../dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.uvproj | 454 + .../dk-tm4c123g/usb_dev_bulk/usb_dev_bulk_ccs.cmd | 70 + boards/dk-tm4c123g/usb_dev_keyboard/Makefile | 92 + .../usb_dev_keyboard/ccs/.ccsimportspec | 10 + .../dk-tm4c123g/usb_dev_keyboard/ccs/.ccsproject | 10 + boards/dk-tm4c123g/usb_dev_keyboard/ccs/.cproject | 212 + boards/dk-tm4c123g/usb_dev_keyboard/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/usb_dev_keyboard.bin | Bin 0 -> 19448 bytes .../ccs/Debug/usb_dev_keyboard.out | Bin 0 -> 523619 bytes .../usb_dev_keyboard/ccs/macros.ini_initial | 1 + .../usb_dev_keyboard/ccs/target_config.ccxml | 13 + .../ewarm/Exe/usb_dev_keyboard.bin | Bin 0 -> 17868 bytes .../ewarm/Exe/usb_dev_keyboard.out | Bin 0 -> 389940 bytes .../usb_dev_keyboard/gcc/usb_dev_keyboard.axf | Bin 0 -> 82263 bytes .../usb_dev_keyboard/gcc/usb_dev_keyboard.bin | Bin 0 -> 18994 bytes boards/dk-tm4c123g/usb_dev_keyboard/readme.txt | 36 + .../usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf | Bin 0 -> 346456 bytes .../usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin | Bin 0 -> 19880 bytes boards/dk-tm4c123g/usb_dev_keyboard/startup_ccs.c | 304 + .../dk-tm4c123g/usb_dev_keyboard/startup_ewarm.c | 335 + boards/dk-tm4c123g/usb_dev_keyboard/startup_gcc.c | 351 + .../dk-tm4c123g/usb_dev_keyboard/startup_rvmdk.S | 360 + .../usb_dev_keyboard/usb_dev_keyboard.c | 730 + .../usb_dev_keyboard/usb_dev_keyboard.ewd | 614 + .../usb_dev_keyboard/usb_dev_keyboard.ewp | 805 + .../usb_dev_keyboard/usb_dev_keyboard.icf | 78 + .../usb_dev_keyboard/usb_dev_keyboard.ld | 57 + .../usb_dev_keyboard/usb_dev_keyboard.sct | 47 + .../usb_dev_keyboard/usb_dev_keyboard.uvopt | 373 + .../usb_dev_keyboard/usb_dev_keyboard.uvproj | 454 + .../usb_dev_keyboard/usb_dev_keyboard_ccs.cmd | 70 + .../usb_dev_keyboard/usb_keyb_structs.c | 149 + .../usb_dev_keyboard/usb_keyb_structs.h | 35 + boards/dk-tm4c123g/usb_dev_msc/Makefile | 96 + boards/dk-tm4c123g/usb_dev_msc/ccs/.ccsimportspec | 12 + boards/dk-tm4c123g/usb_dev_msc/ccs/.ccsproject | 10 + boards/dk-tm4c123g/usb_dev_msc/ccs/.cproject | 212 + boards/dk-tm4c123g/usb_dev_msc/ccs/.project | 75 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_msc/ccs/Debug/usb_dev_msc.bin | Bin 0 -> 20424 bytes .../usb_dev_msc/ccs/Debug/usb_dev_msc.out | Bin 0 -> 502793 bytes .../dk-tm4c123g/usb_dev_msc/ccs/macros.ini_initial | 1 + .../usb_dev_msc/ccs/target_config.ccxml | 13 + .../usb_dev_msc/ewarm/Exe/usb_dev_msc.bin | Bin 0 -> 18840 bytes .../usb_dev_msc/ewarm/Exe/usb_dev_msc.out | Bin 0 -> 388092 bytes boards/dk-tm4c123g/usb_dev_msc/gcc/usb_dev_msc.axf | Bin 0 -> 85210 bytes boards/dk-tm4c123g/usb_dev_msc/gcc/usb_dev_msc.bin | Bin 0 -> 23816 bytes boards/dk-tm4c123g/usb_dev_msc/readme.txt | 27 + .../dk-tm4c123g/usb_dev_msc/rvmdk/usb_dev_msc.axf | Bin 0 -> 335104 bytes .../dk-tm4c123g/usb_dev_msc/rvmdk/usb_dev_msc.bin | Bin 0 -> 20484 bytes boards/dk-tm4c123g/usb_dev_msc/startup_ccs.c | 303 + boards/dk-tm4c123g/usb_dev_msc/startup_ewarm.c | 334 + boards/dk-tm4c123g/usb_dev_msc/startup_gcc.c | 350 + boards/dk-tm4c123g/usb_dev_msc/startup_rvmdk.S | 359 + boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.c | 617 + boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ewd | 614 + boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ewp | 809 + boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.icf | 78 + boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ld | 57 + boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.sct | 47 + boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.uvopt | 387 + boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.uvproj | 459 + boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc_ccs.cmd | 70 + boards/dk-tm4c123g/usb_dev_msc/usb_msc_structs.c | 191 + boards/dk-tm4c123g/usb_dev_msc/usb_msc_structs.h | 43 + boards/dk-tm4c123g/usb_dev_msc/usbdsdcard.c | 257 + boards/dk-tm4c123g/usb_dev_msc/usbdsdcard.h | 43 + boards/dk-tm4c123g/usb_dev_serial/Makefile | 92 + .../dk-tm4c123g/usb_dev_serial/ccs/.ccsimportspec | 10 + boards/dk-tm4c123g/usb_dev_serial/ccs/.ccsproject | 10 + boards/dk-tm4c123g/usb_dev_serial/ccs/.cproject | 212 + boards/dk-tm4c123g/usb_dev_serial/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_serial/ccs/Debug/usb_dev_serial.bin | Bin 0 -> 20520 bytes .../usb_dev_serial/ccs/Debug/usb_dev_serial.out | Bin 0 -> 550036 bytes .../usb_dev_serial/ccs/macros.ini_initial | 1 + .../usb_dev_serial/ccs/target_config.ccxml | 13 + .../usb_dev_serial/ewarm/Exe/usb_dev_serial.bin | Bin 0 -> 19052 bytes .../usb_dev_serial/ewarm/Exe/usb_dev_serial.out | Bin 0 -> 411648 bytes .../usb_dev_serial/gcc/usb_dev_serial.axf | Bin 0 -> 83087 bytes .../usb_dev_serial/gcc/usb_dev_serial.bin | Bin 0 -> 19993 bytes boards/dk-tm4c123g/usb_dev_serial/readme.txt | 32 + .../usb_dev_serial/rvmdk/usb_dev_serial.axf | Bin 0 -> 382660 bytes .../usb_dev_serial/rvmdk/usb_dev_serial.bin | Bin 0 -> 21328 bytes boards/dk-tm4c123g/usb_dev_serial/startup_ccs.c | 304 + boards/dk-tm4c123g/usb_dev_serial/startup_ewarm.c | 335 + boards/dk-tm4c123g/usb_dev_serial/startup_gcc.c | 351 + boards/dk-tm4c123g/usb_dev_serial/startup_rvmdk.S | 360 + boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.c | 1441 + .../dk-tm4c123g/usb_dev_serial/usb_dev_serial.ewd | 614 + .../dk-tm4c123g/usb_dev_serial/usb_dev_serial.ewp | 805 + .../dk-tm4c123g/usb_dev_serial/usb_dev_serial.icf | 78 + .../dk-tm4c123g/usb_dev_serial/usb_dev_serial.ld | 57 + .../dk-tm4c123g/usb_dev_serial/usb_dev_serial.sct | 47 + .../usb_dev_serial/usb_dev_serial.uvopt | 373 + .../usb_dev_serial/usb_dev_serial.uvproj | 454 + .../usb_dev_serial/usb_dev_serial_ccs.cmd | 70 + .../usb_dev_serial/usb_serial_structs.c | 215 + .../usb_dev_serial/usb_serial_structs.h | 49 + boards/dk-tm4c123g/usb_host_audio/Makefile | 100 + .../dk-tm4c123g/usb_host_audio/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/usb_host_audio/ccs/.ccsproject | 10 + boards/dk-tm4c123g/usb_host_audio/ccs/.cproject | 214 + boards/dk-tm4c123g/usb_host_audio/ccs/.project | 90 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_host_audio/ccs/Debug/usb_host_audio.bin | Bin 0 -> 41096 bytes .../usb_host_audio/ccs/Debug/usb_host_audio.out | Bin 0 -> 894080 bytes .../usb_host_audio/ccs/macros.ini_initial | 1 + .../usb_host_audio/ccs/target_config.ccxml | 13 + .../usb_host_audio/ewarm/Exe/usb_host_audio.bin | Bin 0 -> 38324 bytes .../usb_host_audio/ewarm/Exe/usb_host_audio.out | Bin 0 -> 729188 bytes .../usb_host_audio/gcc/usb_host_audio.axf | Bin 0 -> 126763 bytes .../usb_host_audio/gcc/usb_host_audio.bin | Bin 0 -> 41968 bytes boards/dk-tm4c123g/usb_host_audio/readme.txt | 32 + .../usb_host_audio/rvmdk/usb_host_audio.axf | Bin 0 -> 542644 bytes .../usb_host_audio/rvmdk/usb_host_audio.bin | Bin 0 -> 42196 bytes boards/dk-tm4c123g/usb_host_audio/startup_ccs.c | 303 + boards/dk-tm4c123g/usb_host_audio/startup_ewarm.c | 334 + boards/dk-tm4c123g/usb_host_audio/startup_gcc.c | 350 + boards/dk-tm4c123g/usb_host_audio/startup_rvmdk.S | 359 + boards/dk-tm4c123g/usb_host_audio/usb_host_audio.c | 1987 + .../dk-tm4c123g/usb_host_audio/usb_host_audio.ewd | 614 + .../dk-tm4c123g/usb_host_audio/usb_host_audio.ewp | 820 + .../dk-tm4c123g/usb_host_audio/usb_host_audio.icf | 78 + .../dk-tm4c123g/usb_host_audio/usb_host_audio.ld | 57 + .../dk-tm4c123g/usb_host_audio/usb_host_audio.sct | 47 + .../usb_host_audio/usb_host_audio.uvopt | 429 + .../usb_host_audio/usb_host_audio.uvproj | 474 + .../usb_host_audio/usb_host_audio_ccs.cmd | 70 + boards/dk-tm4c123g/usb_host_keyboard/Makefile | 90 + .../usb_host_keyboard/ccs/.ccsimportspec | 8 + .../dk-tm4c123g/usb_host_keyboard/ccs/.ccsproject | 10 + boards/dk-tm4c123g/usb_host_keyboard/ccs/.cproject | 210 + boards/dk-tm4c123g/usb_host_keyboard/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/usb_host_keyboard.bin | Bin 0 -> 26048 bytes .../ccs/Debug/usb_host_keyboard.out | Bin 0 -> 625198 bytes .../usb_host_keyboard/ccs/macros.ini_initial | 1 + .../usb_host_keyboard/ccs/target_config.ccxml | 13 + .../ewarm/Exe/usb_host_keyboard.bin | Bin 0 -> 23932 bytes .../ewarm/Exe/usb_host_keyboard.out | Bin 0 -> 478336 bytes .../usb_host_keyboard/gcc/usb_host_keyboard.axf | Bin 0 -> 84749 bytes .../usb_host_keyboard/gcc/usb_host_keyboard.bin | Bin 0 -> 25598 bytes boards/dk-tm4c123g/usb_host_keyboard/readme.txt | 30 + .../usb_host_keyboard/rvmdk/usb_host_keyboard.axf | Bin 0 -> 386124 bytes .../usb_host_keyboard/rvmdk/usb_host_keyboard.bin | Bin 0 -> 27236 bytes boards/dk-tm4c123g/usb_host_keyboard/startup_ccs.c | 303 + .../dk-tm4c123g/usb_host_keyboard/startup_ewarm.c | 334 + boards/dk-tm4c123g/usb_host_keyboard/startup_gcc.c | 350 + .../dk-tm4c123g/usb_host_keyboard/startup_rvmdk.S | 359 + .../usb_host_keyboard/usb_host_keyboard.c | 1143 + .../usb_host_keyboard/usb_host_keyboard.ewd | 614 + .../usb_host_keyboard/usb_host_keyboard.ewp | 798 + .../usb_host_keyboard/usb_host_keyboard.icf | 78 + .../usb_host_keyboard/usb_host_keyboard.ld | 57 + .../usb_host_keyboard/usb_host_keyboard.sct | 47 + .../usb_host_keyboard/usb_host_keyboard.uvopt | 345 + .../usb_host_keyboard/usb_host_keyboard.uvproj | 444 + .../usb_host_keyboard/usb_host_keyboard_ccs.cmd | 70 + boards/dk-tm4c123g/usb_host_mouse/Makefile | 91 + .../dk-tm4c123g/usb_host_mouse/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/usb_host_mouse/ccs/.ccsproject | 10 + boards/dk-tm4c123g/usb_host_mouse/ccs/.cproject | 210 + boards/dk-tm4c123g/usb_host_mouse/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_host_mouse/ccs/Debug/usb_host_mouse.bin | Bin 0 -> 24864 bytes .../usb_host_mouse/ccs/Debug/usb_host_mouse.out | Bin 0 -> 598193 bytes .../usb_host_mouse/ccs/macros.ini_initial | 1 + .../usb_host_mouse/ccs/target_config.ccxml | 13 + .../usb_host_mouse/ewarm/Exe/usb_host_mouse.bin | Bin 0 -> 22624 bytes .../usb_host_mouse/ewarm/Exe/usb_host_mouse.out | Bin 0 -> 484256 bytes .../usb_host_mouse/gcc/usb_host_mouse.axf | Bin 0 -> 83804 bytes .../usb_host_mouse/gcc/usb_host_mouse.bin | Bin 0 -> 24578 bytes boards/dk-tm4c123g/usb_host_mouse/readme.txt | 25 + .../usb_host_mouse/rvmdk/usb_host_mouse.axf | Bin 0 -> 359528 bytes .../usb_host_mouse/rvmdk/usb_host_mouse.bin | Bin 0 -> 26392 bytes boards/dk-tm4c123g/usb_host_mouse/startup_ccs.c | 303 + boards/dk-tm4c123g/usb_host_mouse/startup_ewarm.c | 334 + boards/dk-tm4c123g/usb_host_mouse/startup_gcc.c | 350 + boards/dk-tm4c123g/usb_host_mouse/startup_rvmdk.S | 359 + boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.c | 803 + .../dk-tm4c123g/usb_host_mouse/usb_host_mouse.ewd | 614 + .../dk-tm4c123g/usb_host_mouse/usb_host_mouse.ewp | 801 + .../dk-tm4c123g/usb_host_mouse/usb_host_mouse.icf | 78 + .../dk-tm4c123g/usb_host_mouse/usb_host_mouse.ld | 57 + .../dk-tm4c123g/usb_host_mouse/usb_host_mouse.sct | 47 + .../usb_host_mouse/usb_host_mouse.uvopt | 359 + .../usb_host_mouse/usb_host_mouse.uvproj | 449 + .../usb_host_mouse/usb_host_mouse_ccs.cmd | 70 + boards/dk-tm4c123g/usb_host_msc/Makefile | 98 + boards/dk-tm4c123g/usb_host_msc/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/usb_host_msc/ccs/.ccsproject | 10 + boards/dk-tm4c123g/usb_host_msc/ccs/.cproject | 212 + boards/dk-tm4c123g/usb_host_msc/ccs/.project | 85 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_host_msc/ccs/Debug/usb_host_msc.bin | Bin 0 -> 34616 bytes .../usb_host_msc/ccs/Debug/usb_host_msc.out | Bin 0 -> 786951 bytes .../usb_host_msc/ccs/macros.ini_initial | 1 + .../usb_host_msc/ccs/target_config.ccxml | 13 + .../usb_host_msc/ewarm/Exe/usb_host_msc.bin | Bin 0 -> 32272 bytes .../usb_host_msc/ewarm/Exe/usb_host_msc.out | Bin 0 -> 625232 bytes .../dk-tm4c123g/usb_host_msc/gcc/usb_host_msc.axf | Bin 0 -> 122016 bytes .../dk-tm4c123g/usb_host_msc/gcc/usb_host_msc.bin | Bin 0 -> 35356 bytes boards/dk-tm4c123g/usb_host_msc/readme.txt | 29 + .../usb_host_msc/rvmdk/usb_host_msc.axf | Bin 0 -> 483000 bytes .../usb_host_msc/rvmdk/usb_host_msc.bin | Bin 0 -> 36048 bytes boards/dk-tm4c123g/usb_host_msc/startup_ccs.c | 303 + boards/dk-tm4c123g/usb_host_msc/startup_ewarm.c | 334 + boards/dk-tm4c123g/usb_host_msc/startup_gcc.c | 350 + boards/dk-tm4c123g/usb_host_msc/startup_rvmdk.S | 359 + boards/dk-tm4c123g/usb_host_msc/usb_host_msc.c | 1549 + boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ewd | 614 + boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ewp | 815 + boards/dk-tm4c123g/usb_host_msc/usb_host_msc.icf | 78 + boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ld | 57 + boards/dk-tm4c123g/usb_host_msc/usb_host_msc.sct | 47 + boards/dk-tm4c123g/usb_host_msc/usb_host_msc.uvopt | 415 + .../dk-tm4c123g/usb_host_msc/usb_host_msc.uvproj | 469 + .../dk-tm4c123g/usb_host_msc/usb_host_msc_ccs.cmd | 70 + boards/dk-tm4c123g/usb_stick_demo/Makefile | 87 + .../dk-tm4c123g/usb_stick_demo/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/usb_stick_demo/ccs/.ccsproject | 10 + boards/dk-tm4c123g/usb_stick_demo/ccs/.cproject | 208 + boards/dk-tm4c123g/usb_stick_demo/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_stick_demo/ccs/Debug/usb_stick_demo.bin | Bin 0 -> 6416 bytes .../usb_stick_demo/ccs/Debug/usb_stick_demo.out | Bin 0 -> 125605 bytes .../usb_stick_demo/ccs/macros.ini_initial | 1 + .../usb_stick_demo/ccs/target_config.ccxml | 13 + .../usb_stick_demo/ewarm/Exe/usb_stick_demo.bin | Bin 0 -> 5512 bytes .../usb_stick_demo/ewarm/Exe/usb_stick_demo.out | Bin 0 -> 105720 bytes .../usb_stick_demo/gcc/usb_stick_demo.axf | Bin 0 -> 36034 bytes .../usb_stick_demo/gcc/usb_stick_demo.bin | Bin 0 -> 5763 bytes boards/dk-tm4c123g/usb_stick_demo/readme.txt | 39 + .../usb_stick_demo/rvmdk/usb_stick_demo.axf | Bin 0 -> 119232 bytes .../usb_stick_demo/rvmdk/usb_stick_demo.bin | Bin 0 -> 5888 bytes boards/dk-tm4c123g/usb_stick_demo/startup_ccs.c | 295 + boards/dk-tm4c123g/usb_stick_demo/startup_ewarm.c | 326 + boards/dk-tm4c123g/usb_stick_demo/startup_gcc.c | 342 + boards/dk-tm4c123g/usb_stick_demo/startup_rvmdk.S | 351 + boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.c | 274 + .../dk-tm4c123g/usb_stick_demo/usb_stick_demo.ewd | 614 + .../dk-tm4c123g/usb_stick_demo/usb_stick_demo.ewp | 792 + .../dk-tm4c123g/usb_stick_demo/usb_stick_demo.icf | 78 + .../dk-tm4c123g/usb_stick_demo/usb_stick_demo.ld | 57 + .../dk-tm4c123g/usb_stick_demo/usb_stick_demo.sct | 47 + .../usb_stick_demo/usb_stick_demo.uvopt | 317 + .../usb_stick_demo/usb_stick_demo.uvproj | 434 + .../usb_stick_demo/usb_stick_demo_ccs.cmd | 70 + boards/dk-tm4c123g/usb_stick_update/Makefile | 86 + .../usb_stick_update/ccs/.ccsimportspec | 10 + .../dk-tm4c123g/usb_stick_update/ccs/.ccsproject | 10 + boards/dk-tm4c123g/usb_stick_update/ccs/.cproject | 206 + boards/dk-tm4c123g/usb_stick_update/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/usb_stick_update.bin | Bin 0 -> 16112 bytes .../ccs/Debug/usb_stick_update.out | Bin 0 -> 411239 bytes .../usb_stick_update/ccs/macros.ini_initial | 1 + .../usb_stick_update/ccs/target_config.ccxml | 13 + .../ewarm/Exe/usb_stick_update.bin | Bin 0 -> 14728 bytes .../ewarm/Exe/usb_stick_update.out | Bin 0 -> 314984 bytes .../usb_stick_update/gcc/usb_stick_update.axf | Bin 0 -> 79206 bytes .../usb_stick_update/gcc/usb_stick_update.bin | Bin 0 -> 16078 bytes boards/dk-tm4c123g/usb_stick_update/readme.txt | 49 + .../usb_stick_update/rvmdk/usb_stick_update.axf | Bin 0 -> 225636 bytes .../usb_stick_update/rvmdk/usb_stick_update.bin | Bin 0 -> 17400 bytes boards/dk-tm4c123g/usb_stick_update/simple_fs.c | 865 + boards/dk-tm4c123g/usb_stick_update/simple_fs.h | 105 + boards/dk-tm4c123g/usb_stick_update/startup_ccs.c | 303 + .../dk-tm4c123g/usb_stick_update/startup_ewarm.c | 334 + boards/dk-tm4c123g/usb_stick_update/startup_gcc.c | 350 + .../dk-tm4c123g/usb_stick_update/startup_rvmdk.S | 359 + .../usb_stick_update/usb_stick_update.c | 929 + .../usb_stick_update/usb_stick_update.ewd | 614 + .../usb_stick_update/usb_stick_update.ewp | 790 + .../usb_stick_update/usb_stick_update.icf | 78 + .../usb_stick_update/usb_stick_update.ld | 57 + .../usb_stick_update/usb_stick_update.sct | 47 + .../usb_stick_update/usb_stick_update.uvopt | 317 + .../usb_stick_update/usb_stick_update.uvproj | 434 + .../usb_stick_update/usb_stick_update_ccs.cmd | 70 + boards/dk-tm4c123g/watchdog/Makefile | 88 + boards/dk-tm4c123g/watchdog/ccs/.ccsimportspec | 8 + boards/dk-tm4c123g/watchdog/ccs/.ccsproject | 10 + boards/dk-tm4c123g/watchdog/ccs/.cproject | 208 + boards/dk-tm4c123g/watchdog/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c123g/watchdog/ccs/Debug/watchdog.bin | Bin 0 -> 6832 bytes boards/dk-tm4c123g/watchdog/ccs/Debug/watchdog.out | Bin 0 -> 137604 bytes boards/dk-tm4c123g/watchdog/ccs/macros.ini_initial | 1 + .../dk-tm4c123g/watchdog/ccs/target_config.ccxml | 13 + boards/dk-tm4c123g/watchdog/ewarm/Exe/watchdog.bin | Bin 0 -> 5968 bytes boards/dk-tm4c123g/watchdog/ewarm/Exe/watchdog.out | Bin 0 -> 116528 bytes boards/dk-tm4c123g/watchdog/gcc/watchdog.axf | Bin 0 -> 69292 bytes boards/dk-tm4c123g/watchdog/gcc/watchdog.bin | Bin 0 -> 6217 bytes boards/dk-tm4c123g/watchdog/readme.txt | 28 + boards/dk-tm4c123g/watchdog/rvmdk/watchdog.axf | Bin 0 -> 123284 bytes boards/dk-tm4c123g/watchdog/rvmdk/watchdog.bin | Bin 0 -> 6276 bytes boards/dk-tm4c123g/watchdog/startup_ccs.c | 302 + boards/dk-tm4c123g/watchdog/startup_ewarm.c | 333 + boards/dk-tm4c123g/watchdog/startup_gcc.c | 349 + boards/dk-tm4c123g/watchdog/startup_rvmdk.S | 358 + boards/dk-tm4c123g/watchdog/watchdog.c | 268 + boards/dk-tm4c123g/watchdog/watchdog.ewd | 614 + boards/dk-tm4c123g/watchdog/watchdog.ewp | 795 + boards/dk-tm4c123g/watchdog/watchdog.icf | 78 + boards/dk-tm4c123g/watchdog/watchdog.ld | 57 + boards/dk-tm4c123g/watchdog/watchdog.sct | 47 + boards/dk-tm4c123g/watchdog/watchdog.uvopt | 331 + boards/dk-tm4c123g/watchdog/watchdog.uvproj | 439 + boards/dk-tm4c123g/watchdog/watchdog_ccs.cmd | 70 + boards/dk-tm4c129x/Makefile | 108 + boards/dk-tm4c129x/aes_cbc_decrypt/Makefile | 91 + .../dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.c | 691 + .../aes_cbc_decrypt/aes_cbc_decrypt.ewd | 614 + .../aes_cbc_decrypt/aes_cbc_decrypt.ewp | 801 + .../aes_cbc_decrypt/aes_cbc_decrypt.icf | 78 + .../dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ld | 57 + .../aes_cbc_decrypt/aes_cbc_decrypt.sct | 47 + .../aes_cbc_decrypt/aes_cbc_decrypt.uvopt | 359 + .../aes_cbc_decrypt/aes_cbc_decrypt.uvproj | 449 + .../aes_cbc_decrypt/aes_cbc_decrypt_ccs.cmd | 70 + .../dk-tm4c129x/aes_cbc_decrypt/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.ccsproject | 10 + boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.cproject | 191 + boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../aes_cbc_decrypt/ccs/Debug/aes_cbc_decrypt.bin | Bin 0 -> 31328 bytes .../aes_cbc_decrypt/ccs/Debug/aes_cbc_decrypt.out | Bin 0 -> 241401 bytes .../aes_cbc_decrypt/ccs/macros.ini_initial | 1 + .../aes_cbc_decrypt/ccs/target_config.ccxml | 13 + .../aes_cbc_decrypt/ewarm/Exe/aes_cbc_decrypt.bin | Bin 0 -> 28924 bytes .../aes_cbc_decrypt/ewarm/Exe/aes_cbc_decrypt.out | Bin 0 -> 212992 bytes .../aes_cbc_decrypt/gcc/aes_cbc_decrypt.axf | Bin 0 -> 72358 bytes .../aes_cbc_decrypt/gcc/aes_cbc_decrypt.bin | Bin 0 -> 29528 bytes boards/dk-tm4c129x/aes_cbc_decrypt/readme.txt | 27 + .../aes_cbc_decrypt/rvmdk/aes_cbc_decrypt.axf | Bin 0 -> 219956 bytes .../aes_cbc_decrypt/rvmdk/aes_cbc_decrypt.bin | Bin 0 -> 29540 bytes boards/dk-tm4c129x/aes_cbc_decrypt/startup_ccs.c | 275 + boards/dk-tm4c129x/aes_cbc_decrypt/startup_ewarm.c | 306 + boards/dk-tm4c129x/aes_cbc_decrypt/startup_gcc.c | 322 + boards/dk-tm4c129x/aes_cbc_decrypt/startup_rvmdk.S | 331 + boards/dk-tm4c129x/aes_cbc_encrypt/Makefile | 91 + .../dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.c | 689 + .../aes_cbc_encrypt/aes_cbc_encrypt.ewd | 614 + .../aes_cbc_encrypt/aes_cbc_encrypt.ewp | 801 + .../aes_cbc_encrypt/aes_cbc_encrypt.icf | 78 + .../dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ld | 57 + .../aes_cbc_encrypt/aes_cbc_encrypt.sct | 47 + .../aes_cbc_encrypt/aes_cbc_encrypt.uvopt | 359 + .../aes_cbc_encrypt/aes_cbc_encrypt.uvproj | 449 + .../aes_cbc_encrypt/aes_cbc_encrypt_ccs.cmd | 70 + .../dk-tm4c129x/aes_cbc_encrypt/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.ccsproject | 10 + boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.cproject | 191 + boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../aes_cbc_encrypt/ccs/Debug/aes_cbc_encrypt.bin | Bin 0 -> 31320 bytes .../aes_cbc_encrypt/ccs/Debug/aes_cbc_encrypt.out | Bin 0 -> 241423 bytes .../aes_cbc_encrypt/ccs/macros.ini_initial | 1 + .../aes_cbc_encrypt/ccs/target_config.ccxml | 13 + .../aes_cbc_encrypt/ewarm/Exe/aes_cbc_encrypt.bin | Bin 0 -> 28900 bytes .../aes_cbc_encrypt/ewarm/Exe/aes_cbc_encrypt.out | Bin 0 -> 211772 bytes .../aes_cbc_encrypt/gcc/aes_cbc_encrypt.axf | Bin 0 -> 72358 bytes .../aes_cbc_encrypt/gcc/aes_cbc_encrypt.bin | Bin 0 -> 29532 bytes boards/dk-tm4c129x/aes_cbc_encrypt/readme.txt | 27 + .../aes_cbc_encrypt/rvmdk/aes_cbc_encrypt.axf | Bin 0 -> 219940 bytes .../aes_cbc_encrypt/rvmdk/aes_cbc_encrypt.bin | Bin 0 -> 29524 bytes boards/dk-tm4c129x/aes_cbc_encrypt/startup_ccs.c | 275 + boards/dk-tm4c129x/aes_cbc_encrypt/startup_ewarm.c | 306 + boards/dk-tm4c129x/aes_cbc_encrypt/startup_gcc.c | 322 + boards/dk-tm4c129x/aes_cbc_encrypt/startup_rvmdk.S | 331 + boards/dk-tm4c129x/aes_ccm_decrypt/Makefile | 91 + .../dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.c | 1036 + .../aes_ccm_decrypt/aes_ccm_decrypt.ewd | 614 + .../aes_ccm_decrypt/aes_ccm_decrypt.ewp | 801 + .../aes_ccm_decrypt/aes_ccm_decrypt.icf | 78 + .../dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ld | 57 + .../aes_ccm_decrypt/aes_ccm_decrypt.sct | 47 + .../aes_ccm_decrypt/aes_ccm_decrypt.uvopt | 359 + .../aes_ccm_decrypt/aes_ccm_decrypt.uvproj | 449 + .../aes_ccm_decrypt/aes_ccm_decrypt_ccs.cmd | 70 + .../dk-tm4c129x/aes_ccm_decrypt/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.ccsproject | 10 + boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.cproject | 191 + boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../aes_ccm_decrypt/ccs/Debug/aes_ccm_decrypt.bin | Bin 0 -> 32552 bytes .../aes_ccm_decrypt/ccs/Debug/aes_ccm_decrypt.out | Bin 0 -> 244867 bytes .../aes_ccm_decrypt/ccs/macros.ini_initial | 1 + .../aes_ccm_decrypt/ccs/target_config.ccxml | 13 + .../aes_ccm_decrypt/ewarm/Exe/aes_ccm_decrypt.bin | Bin 0 -> 30212 bytes .../aes_ccm_decrypt/ewarm/Exe/aes_ccm_decrypt.out | Bin 0 -> 217688 bytes .../aes_ccm_decrypt/gcc/aes_ccm_decrypt.axf | Bin 0 -> 73198 bytes .../aes_ccm_decrypt/gcc/aes_ccm_decrypt.bin | Bin 0 -> 31396 bytes boards/dk-tm4c129x/aes_ccm_decrypt/readme.txt | 27 + .../aes_ccm_decrypt/rvmdk/aes_ccm_decrypt.axf | Bin 0 -> 220432 bytes .../aes_ccm_decrypt/rvmdk/aes_ccm_decrypt.bin | Bin 0 -> 30436 bytes boards/dk-tm4c129x/aes_ccm_decrypt/startup_ccs.c | 275 + boards/dk-tm4c129x/aes_ccm_decrypt/startup_ewarm.c | 306 + boards/dk-tm4c129x/aes_ccm_decrypt/startup_gcc.c | 322 + boards/dk-tm4c129x/aes_ccm_decrypt/startup_rvmdk.S | 331 + boards/dk-tm4c129x/aes_ccm_encrypt/Makefile | 91 + .../dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.c | 1031 + .../aes_ccm_encrypt/aes_ccm_encrypt.ewd | 614 + .../aes_ccm_encrypt/aes_ccm_encrypt.ewp | 801 + .../aes_ccm_encrypt/aes_ccm_encrypt.icf | 78 + .../dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ld | 57 + .../aes_ccm_encrypt/aes_ccm_encrypt.sct | 47 + .../aes_ccm_encrypt/aes_ccm_encrypt.uvopt | 359 + .../aes_ccm_encrypt/aes_ccm_encrypt.uvproj | 449 + .../aes_ccm_encrypt/aes_ccm_encrypt_ccs.cmd | 70 + .../dk-tm4c129x/aes_ccm_encrypt/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.ccsproject | 10 + boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.cproject | 191 + boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../aes_ccm_encrypt/ccs/Debug/aes_ccm_encrypt.bin | Bin 0 -> 32544 bytes .../aes_ccm_encrypt/ccs/Debug/aes_ccm_encrypt.out | Bin 0 -> 244863 bytes .../aes_ccm_encrypt/ccs/macros.ini_initial | 1 + .../aes_ccm_encrypt/ccs/target_config.ccxml | 13 + .../aes_ccm_encrypt/ewarm/Exe/aes_ccm_encrypt.bin | Bin 0 -> 30204 bytes .../aes_ccm_encrypt/ewarm/Exe/aes_ccm_encrypt.out | Bin 0 -> 217604 bytes .../aes_ccm_encrypt/gcc/aes_ccm_encrypt.axf | Bin 0 -> 73198 bytes .../aes_ccm_encrypt/gcc/aes_ccm_encrypt.bin | Bin 0 -> 31388 bytes boards/dk-tm4c129x/aes_ccm_encrypt/readme.txt | 27 + .../aes_ccm_encrypt/rvmdk/aes_ccm_encrypt.axf | Bin 0 -> 220392 bytes .../aes_ccm_encrypt/rvmdk/aes_ccm_encrypt.bin | Bin 0 -> 30428 bytes boards/dk-tm4c129x/aes_ccm_encrypt/startup_ccs.c | 275 + boards/dk-tm4c129x/aes_ccm_encrypt/startup_ewarm.c | 306 + boards/dk-tm4c129x/aes_ccm_encrypt/startup_gcc.c | 322 + boards/dk-tm4c129x/aes_ccm_encrypt/startup_rvmdk.S | 331 + boards/dk-tm4c129x/aes_cmac/Makefile | 91 + boards/dk-tm4c129x/aes_cmac/aes_cmac.c | 957 + boards/dk-tm4c129x/aes_cmac/aes_cmac.ewd | 614 + boards/dk-tm4c129x/aes_cmac/aes_cmac.ewp | 801 + boards/dk-tm4c129x/aes_cmac/aes_cmac.icf | 78 + boards/dk-tm4c129x/aes_cmac/aes_cmac.ld | 57 + boards/dk-tm4c129x/aes_cmac/aes_cmac.sct | 47 + boards/dk-tm4c129x/aes_cmac/aes_cmac.uvopt | 359 + boards/dk-tm4c129x/aes_cmac/aes_cmac.uvproj | 449 + boards/dk-tm4c129x/aes_cmac/aes_cmac_ccs.cmd | 70 + boards/dk-tm4c129x/aes_cmac/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/aes_cmac/ccs/.ccsproject | 10 + boards/dk-tm4c129x/aes_cmac/ccs/.cproject | 191 + boards/dk-tm4c129x/aes_cmac/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/aes_cmac/ccs/Debug/aes_cmac.bin | Bin 0 -> 31752 bytes boards/dk-tm4c129x/aes_cmac/ccs/Debug/aes_cmac.out | Bin 0 -> 243750 bytes boards/dk-tm4c129x/aes_cmac/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/aes_cmac/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/aes_cmac/ewarm/Exe/aes_cmac.bin | Bin 0 -> 29472 bytes boards/dk-tm4c129x/aes_cmac/ewarm/Exe/aes_cmac.out | Bin 0 -> 214324 bytes boards/dk-tm4c129x/aes_cmac/gcc/aes_cmac.axf | Bin 0 -> 72818 bytes boards/dk-tm4c129x/aes_cmac/gcc/aes_cmac.bin | Bin 0 -> 30156 bytes boards/dk-tm4c129x/aes_cmac/readme.txt | 31 + boards/dk-tm4c129x/aes_cmac/rvmdk/aes_cmac.axf | Bin 0 -> 220228 bytes boards/dk-tm4c129x/aes_cmac/rvmdk/aes_cmac.bin | Bin 0 -> 29732 bytes boards/dk-tm4c129x/aes_cmac/startup_ccs.c | 275 + boards/dk-tm4c129x/aes_cmac/startup_ewarm.c | 306 + boards/dk-tm4c129x/aes_cmac/startup_gcc.c | 322 + boards/dk-tm4c129x/aes_cmac/startup_rvmdk.S | 331 + boards/dk-tm4c129x/aes_ecb_decrypt/Makefile | 91 + .../dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.c | 698 + .../aes_ecb_decrypt/aes_ecb_decrypt.ewd | 614 + .../aes_ecb_decrypt/aes_ecb_decrypt.ewp | 801 + .../aes_ecb_decrypt/aes_ecb_decrypt.icf | 78 + .../dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ld | 57 + .../aes_ecb_decrypt/aes_ecb_decrypt.sct | 47 + .../aes_ecb_decrypt/aes_ecb_decrypt.uvopt | 359 + .../aes_ecb_decrypt/aes_ecb_decrypt.uvproj | 449 + .../aes_ecb_decrypt/aes_ecb_decrypt_ccs.cmd | 70 + .../dk-tm4c129x/aes_ecb_decrypt/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.ccsproject | 10 + boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.cproject | 191 + boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../aes_ecb_decrypt/ccs/Debug/aes_ecb_decrypt.bin | Bin 0 -> 31320 bytes .../aes_ecb_decrypt/ccs/Debug/aes_ecb_decrypt.out | Bin 0 -> 239518 bytes .../aes_ecb_decrypt/ccs/macros.ini_initial | 1 + .../aes_ecb_decrypt/ccs/target_config.ccxml | 13 + .../aes_ecb_decrypt/ewarm/Exe/aes_ecb_decrypt.bin | Bin 0 -> 28920 bytes .../aes_ecb_decrypt/ewarm/Exe/aes_ecb_decrypt.out | Bin 0 -> 210696 bytes .../aes_ecb_decrypt/gcc/aes_ecb_decrypt.axf | Bin 0 -> 72234 bytes .../aes_ecb_decrypt/gcc/aes_ecb_decrypt.bin | Bin 0 -> 29520 bytes boards/dk-tm4c129x/aes_ecb_decrypt/readme.txt | 27 + .../aes_ecb_decrypt/rvmdk/aes_ecb_decrypt.axf | Bin 0 -> 218324 bytes .../aes_ecb_decrypt/rvmdk/aes_ecb_decrypt.bin | Bin 0 -> 29484 bytes boards/dk-tm4c129x/aes_ecb_decrypt/startup_ccs.c | 275 + boards/dk-tm4c129x/aes_ecb_decrypt/startup_ewarm.c | 306 + boards/dk-tm4c129x/aes_ecb_decrypt/startup_gcc.c | 322 + boards/dk-tm4c129x/aes_ecb_decrypt/startup_rvmdk.S | 331 + boards/dk-tm4c129x/aes_ecb_encrypt/Makefile | 91 + .../dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.c | 701 + .../aes_ecb_encrypt/aes_ecb_encrypt.ewd | 614 + .../aes_ecb_encrypt/aes_ecb_encrypt.ewp | 801 + .../aes_ecb_encrypt/aes_ecb_encrypt.icf | 78 + .../dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ld | 57 + .../aes_ecb_encrypt/aes_ecb_encrypt.sct | 47 + .../aes_ecb_encrypt/aes_ecb_encrypt.uvopt | 359 + .../aes_ecb_encrypt/aes_ecb_encrypt.uvproj | 449 + .../aes_ecb_encrypt/aes_ecb_encrypt_ccs.cmd | 70 + .../dk-tm4c129x/aes_ecb_encrypt/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.ccsproject | 10 + boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.cproject | 191 + boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../aes_ecb_encrypt/ccs/Debug/aes_ecb_encrypt.bin | Bin 0 -> 31320 bytes .../aes_ecb_encrypt/ccs/Debug/aes_ecb_encrypt.out | Bin 0 -> 239784 bytes .../aes_ecb_encrypt/ccs/macros.ini_initial | 1 + .../aes_ecb_encrypt/ccs/target_config.ccxml | 13 + .../aes_ecb_encrypt/ewarm/Exe/aes_ecb_encrypt.bin | Bin 0 -> 28888 bytes .../aes_ecb_encrypt/ewarm/Exe/aes_ecb_encrypt.out | Bin 0 -> 211588 bytes .../aes_ecb_encrypt/gcc/aes_ecb_encrypt.axf | Bin 0 -> 72234 bytes .../aes_ecb_encrypt/gcc/aes_ecb_encrypt.bin | Bin 0 -> 29532 bytes boards/dk-tm4c129x/aes_ecb_encrypt/readme.txt | 27 + .../aes_ecb_encrypt/rvmdk/aes_ecb_encrypt.axf | Bin 0 -> 218348 bytes .../aes_ecb_encrypt/rvmdk/aes_ecb_encrypt.bin | Bin 0 -> 29468 bytes boards/dk-tm4c129x/aes_ecb_encrypt/startup_ccs.c | 275 + boards/dk-tm4c129x/aes_ecb_encrypt/startup_ewarm.c | 306 + boards/dk-tm4c129x/aes_ecb_encrypt/startup_gcc.c | 322 + boards/dk-tm4c129x/aes_ecb_encrypt/startup_rvmdk.S | 331 + boards/dk-tm4c129x/aes_gcm_decrypt/Makefile | 91 + .../dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.c | 1190 + .../aes_gcm_decrypt/aes_gcm_decrypt.ewd | 614 + .../aes_gcm_decrypt/aes_gcm_decrypt.ewp | 801 + .../aes_gcm_decrypt/aes_gcm_decrypt.icf | 78 + .../dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ld | 57 + .../aes_gcm_decrypt/aes_gcm_decrypt.sct | 47 + .../aes_gcm_decrypt/aes_gcm_decrypt.uvopt | 359 + .../aes_gcm_decrypt/aes_gcm_decrypt.uvproj | 449 + .../aes_gcm_decrypt/aes_gcm_decrypt_ccs.cmd | 70 + .../dk-tm4c129x/aes_gcm_decrypt/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.ccsproject | 10 + boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.cproject | 191 + boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../aes_gcm_decrypt/ccs/Debug/aes_gcm_decrypt.bin | Bin 0 -> 33376 bytes .../aes_gcm_decrypt/ccs/Debug/aes_gcm_decrypt.out | Bin 0 -> 251368 bytes .../aes_gcm_decrypt/ccs/macros.ini_initial | 1 + .../aes_gcm_decrypt/ccs/target_config.ccxml | 13 + .../aes_gcm_decrypt/ewarm/Exe/aes_gcm_decrypt.bin | Bin 0 -> 30652 bytes .../aes_gcm_decrypt/ewarm/Exe/aes_gcm_decrypt.out | Bin 0 -> 224512 bytes .../aes_gcm_decrypt/gcc/aes_gcm_decrypt.axf | Bin 0 -> 82943 bytes .../aes_gcm_decrypt/gcc/aes_gcm_decrypt.bin | Bin 0 -> 40924 bytes boards/dk-tm4c129x/aes_gcm_decrypt/readme.txt | 28 + .../aes_gcm_decrypt/rvmdk/aes_gcm_decrypt.axf | Bin 0 -> 224728 bytes .../aes_gcm_decrypt/rvmdk/aes_gcm_decrypt.bin | Bin 0 -> 31408 bytes boards/dk-tm4c129x/aes_gcm_decrypt/startup_ccs.c | 275 + boards/dk-tm4c129x/aes_gcm_decrypt/startup_ewarm.c | 306 + boards/dk-tm4c129x/aes_gcm_decrypt/startup_gcc.c | 322 + boards/dk-tm4c129x/aes_gcm_decrypt/startup_rvmdk.S | 331 + boards/dk-tm4c129x/aes_gcm_encrypt/Makefile | 91 + .../dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.c | 1190 + .../aes_gcm_encrypt/aes_gcm_encrypt.ewd | 614 + .../aes_gcm_encrypt/aes_gcm_encrypt.ewp | 801 + .../aes_gcm_encrypt/aes_gcm_encrypt.icf | 78 + .../dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ld | 57 + .../aes_gcm_encrypt/aes_gcm_encrypt.sct | 47 + .../aes_gcm_encrypt/aes_gcm_encrypt.uvopt | 359 + .../aes_gcm_encrypt/aes_gcm_encrypt.uvproj | 449 + .../aes_gcm_encrypt/aes_gcm_encrypt_ccs.cmd | 70 + .../dk-tm4c129x/aes_gcm_encrypt/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.ccsproject | 10 + boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.cproject | 191 + boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../aes_gcm_encrypt/ccs/Debug/aes_gcm_encrypt.bin | Bin 0 -> 33376 bytes .../aes_gcm_encrypt/ccs/Debug/aes_gcm_encrypt.out | Bin 0 -> 251376 bytes .../aes_gcm_encrypt/ccs/macros.ini_initial | 1 + .../aes_gcm_encrypt/ccs/target_config.ccxml | 13 + .../aes_gcm_encrypt/ewarm/Exe/aes_gcm_encrypt.bin | Bin 0 -> 30652 bytes .../aes_gcm_encrypt/ewarm/Exe/aes_gcm_encrypt.out | Bin 0 -> 224516 bytes .../aes_gcm_encrypt/gcc/aes_gcm_encrypt.axf | Bin 0 -> 82943 bytes .../aes_gcm_encrypt/gcc/aes_gcm_encrypt.bin | Bin 0 -> 40924 bytes boards/dk-tm4c129x/aes_gcm_encrypt/readme.txt | 28 + .../aes_gcm_encrypt/rvmdk/aes_gcm_encrypt.axf | Bin 0 -> 224732 bytes .../aes_gcm_encrypt/rvmdk/aes_gcm_encrypt.bin | Bin 0 -> 31408 bytes boards/dk-tm4c129x/aes_gcm_encrypt/startup_ccs.c | 275 + boards/dk-tm4c129x/aes_gcm_encrypt/startup_ewarm.c | 306 + boards/dk-tm4c129x/aes_gcm_encrypt/startup_gcc.c | 322 + boards/dk-tm4c129x/aes_gcm_encrypt/startup_rvmdk.S | 331 + boards/dk-tm4c129x/bitband/Makefile | 89 + boards/dk-tm4c129x/bitband/bitband.c | 275 + boards/dk-tm4c129x/bitband/bitband.ewd | 614 + boards/dk-tm4c129x/bitband/bitband.ewp | 798 + boards/dk-tm4c129x/bitband/bitband.icf | 78 + boards/dk-tm4c129x/bitband/bitband.ld | 57 + boards/dk-tm4c129x/bitband/bitband.sct | 47 + boards/dk-tm4c129x/bitband/bitband.uvopt | 345 + boards/dk-tm4c129x/bitband/bitband.uvproj | 444 + boards/dk-tm4c129x/bitband/bitband_ccs.cmd | 70 + boards/dk-tm4c129x/bitband/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/bitband/ccs/.ccsproject | 10 + boards/dk-tm4c129x/bitband/ccs/.cproject | 191 + boards/dk-tm4c129x/bitband/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/bitband/ccs/Debug/bitband.bin | Bin 0 -> 25400 bytes boards/dk-tm4c129x/bitband/ccs/Debug/bitband.out | Bin 0 -> 200134 bytes boards/dk-tm4c129x/bitband/ccs/macros.ini_initial | 1 + boards/dk-tm4c129x/bitband/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/bitband/ewarm/Exe/bitband.bin | Bin 0 -> 23240 bytes boards/dk-tm4c129x/bitband/ewarm/Exe/bitband.out | Bin 0 -> 174004 bytes boards/dk-tm4c129x/bitband/gcc/bitband.axf | Bin 0 -> 61506 bytes boards/dk-tm4c129x/bitband/gcc/bitband.bin | Bin 0 -> 23744 bytes boards/dk-tm4c129x/bitband/readme.txt | 29 + boards/dk-tm4c129x/bitband/rvmdk/bitband.axf | Bin 0 -> 162696 bytes boards/dk-tm4c129x/bitband/rvmdk/bitband.bin | Bin 0 -> 23920 bytes boards/dk-tm4c129x/bitband/startup_ccs.c | 268 + boards/dk-tm4c129x/bitband/startup_ewarm.c | 299 + boards/dk-tm4c129x/bitband/startup_gcc.c | 315 + boards/dk-tm4c129x/bitband/startup_rvmdk.S | 324 + boards/dk-tm4c129x/ble_btool/Makefile | 91 + boards/dk-tm4c129x/ble_btool/ble_btool.c | 283 + boards/dk-tm4c129x/ble_btool/ble_btool.ewd | 614 + boards/dk-tm4c129x/ble_btool/ble_btool.ewp | 801 + boards/dk-tm4c129x/ble_btool/ble_btool.icf | 78 + boards/dk-tm4c129x/ble_btool/ble_btool.ld | 57 + boards/dk-tm4c129x/ble_btool/ble_btool.sct | 47 + boards/dk-tm4c129x/ble_btool/ble_btool.uvopt | 359 + boards/dk-tm4c129x/ble_btool/ble_btool.uvproj | 449 + boards/dk-tm4c129x/ble_btool/ble_btool_ccs.cmd | 70 + boards/dk-tm4c129x/ble_btool/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/ble_btool/ccs/.ccsproject | 10 + boards/dk-tm4c129x/ble_btool/ccs/.cproject | 191 + boards/dk-tm4c129x/ble_btool/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c129x/ble_btool/ccs/Debug/ble_btool.bin | Bin 0 -> 25728 bytes .../dk-tm4c129x/ble_btool/ccs/Debug/ble_btool.out | Bin 0 -> 204126 bytes .../dk-tm4c129x/ble_btool/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/ble_btool/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/ble_btool/ewarm/Exe/ble_btool.bin | Bin 0 -> 23520 bytes .../dk-tm4c129x/ble_btool/ewarm/Exe/ble_btool.out | Bin 0 -> 191620 bytes boards/dk-tm4c129x/ble_btool/gcc/ble_btool.axf | Bin 0 -> 62032 bytes boards/dk-tm4c129x/ble_btool/gcc/ble_btool.bin | Bin 0 -> 24028 bytes boards/dk-tm4c129x/ble_btool/readme.txt | 45 + boards/dk-tm4c129x/ble_btool/rvmdk/ble_btool.axf | Bin 0 -> 164808 bytes boards/dk-tm4c129x/ble_btool/rvmdk/ble_btool.bin | Bin 0 -> 24180 bytes boards/dk-tm4c129x/ble_btool/startup_ccs.c | 276 + boards/dk-tm4c129x/ble_btool/startup_ewarm.c | 307 + boards/dk-tm4c129x/ble_btool/startup_gcc.c | 323 + boards/dk-tm4c129x/ble_btool/startup_rvmdk.S | 332 + boards/dk-tm4c129x/ble_central/Makefile | 94 + boards/dk-tm4c129x/ble_central/ble_central.c | 2551 + boards/dk-tm4c129x/ble_central/ble_central.ewd | 614 + boards/dk-tm4c129x/ble_central/ble_central.ewp | 810 + boards/dk-tm4c129x/ble_central/ble_central.icf | 78 + boards/dk-tm4c129x/ble_central/ble_central.ld | 57 + boards/dk-tm4c129x/ble_central/ble_central.sct | 47 + boards/dk-tm4c129x/ble_central/ble_central.uvopt | 401 + boards/dk-tm4c129x/ble_central/ble_central.uvproj | 464 + boards/dk-tm4c129x/ble_central/ble_central_ccs.cmd | 70 + boards/dk-tm4c129x/ble_central/ccs/.ccsimportspec | 10 + boards/dk-tm4c129x/ble_central/ccs/.ccsproject | 10 + boards/dk-tm4c129x/ble_central/ccs/.cproject | 191 + boards/dk-tm4c129x/ble_central/ccs/.project | 85 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ble_central/ccs/Debug/ble_central.bin | Bin 0 -> 47088 bytes .../ble_central/ccs/Debug/ble_central.out | Bin 0 -> 387039 bytes .../dk-tm4c129x/ble_central/ccs/macros.ini_initial | 1 + .../ble_central/ccs/target_config.ccxml | 13 + .../ble_central/ewarm/Exe/ble_central.bin | Bin 0 -> 44044 bytes .../ble_central/ewarm/Exe/ble_central.out | Bin 0 -> 372024 bytes boards/dk-tm4c129x/ble_central/gap.c | 371 + boards/dk-tm4c129x/ble_central/gcc/ble_central.axf | Bin 0 -> 116065 bytes boards/dk-tm4c129x/ble_central/gcc/ble_central.bin | Bin 0 -> 47533 bytes boards/dk-tm4c129x/ble_central/hci.h | 329 + boards/dk-tm4c129x/ble_central/readme.txt | 94 + .../dk-tm4c129x/ble_central/rvmdk/ble_central.axf | Bin 0 -> 297060 bytes .../dk-tm4c129x/ble_central/rvmdk/ble_central.bin | Bin 0 -> 45124 bytes boards/dk-tm4c129x/ble_central/startup_ccs.c | 277 + boards/dk-tm4c129x/ble_central/startup_ewarm.c | 308 + boards/dk-tm4c129x/ble_central/startup_gcc.c | 324 + boards/dk-tm4c129x/ble_central/startup_rvmdk.S | 333 + boards/dk-tm4c129x/blinky/Makefile | 77 + boards/dk-tm4c129x/blinky/blinky.c | 93 + boards/dk-tm4c129x/blinky/blinky.ewd | 614 + boards/dk-tm4c129x/blinky/blinky.ewp | 777 + boards/dk-tm4c129x/blinky/blinky.icf | 78 + boards/dk-tm4c129x/blinky/blinky.ld | 57 + boards/dk-tm4c129x/blinky/blinky.sct | 47 + boards/dk-tm4c129x/blinky/blinky.uvopt | 268 + boards/dk-tm4c129x/blinky/blinky.uvproj | 414 + boards/dk-tm4c129x/blinky/blinky_ccs.cmd | 70 + boards/dk-tm4c129x/blinky/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/blinky/ccs/.ccsproject | 10 + boards/dk-tm4c129x/blinky/ccs/.cproject | 183 + boards/dk-tm4c129x/blinky/ccs/.project | 50 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/blinky/ccs/Debug/blinky.bin | Bin 0 -> 1320 bytes boards/dk-tm4c129x/blinky/ccs/Debug/blinky.out | Bin 0 -> 31974 bytes boards/dk-tm4c129x/blinky/ccs/macros.ini_initial | 1 + boards/dk-tm4c129x/blinky/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/blinky/ewarm/Exe/blinky.bin | Bin 0 -> 744 bytes boards/dk-tm4c129x/blinky/ewarm/Exe/blinky.out | Bin 0 -> 13320 bytes boards/dk-tm4c129x/blinky/gcc/blinky.axf | Bin 0 -> 34580 bytes boards/dk-tm4c129x/blinky/gcc/blinky.bin | Bin 0 -> 700 bytes boards/dk-tm4c129x/blinky/readme.txt | 23 + boards/dk-tm4c129x/blinky/rvmdk/blinky.axf | Bin 0 -> 10220 bytes boards/dk-tm4c129x/blinky/rvmdk/blinky.bin | Bin 0 -> 744 bytes boards/dk-tm4c129x/blinky/startup_ccs.c | 268 + boards/dk-tm4c129x/blinky/startup_ewarm.c | 299 + boards/dk-tm4c129x/blinky/startup_gcc.c | 315 + boards/dk-tm4c129x/blinky/startup_rvmdk.S | 324 + boards/dk-tm4c129x/boot_demo_emac_flash/Makefile | 100 + .../boot_demo_emac_flash/boot_demo_emac_flash.c | 426 + .../boot_demo_emac_flash/boot_demo_emac_flash.ewd | 614 + .../boot_demo_emac_flash/boot_demo_emac_flash.ewp | 821 + .../boot_demo_emac_flash/boot_demo_emac_flash.icf | 78 + .../boot_demo_emac_flash/boot_demo_emac_flash.ld | 57 + .../boot_demo_emac_flash/boot_demo_emac_flash.sct | 47 + .../boot_demo_emac_flash.uvopt | 387 + .../boot_demo_emac_flash.uvproj | 459 + .../boot_demo_emac_flash_ccs.cmd | 70 + .../boot_demo_emac_flash/ccs/.ccsimportspec | 9 + .../boot_demo_emac_flash/ccs/.ccsproject | 10 + .../dk-tm4c129x/boot_demo_emac_flash/ccs/.cproject | 205 + .../dk-tm4c129x/boot_demo_emac_flash/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/boot_demo_emac_flash.bin | Bin 0 -> 55024 bytes .../ccs/Debug/boot_demo_emac_flash.out | Bin 0 -> 706020 bytes .../boot_demo_emac_flash/ccs/macros.ini_initial | 1 + .../boot_demo_emac_flash/ccs/target_config.ccxml | 13 + .../ewarm/Exe/boot_demo_emac_flash.bin | Bin 0 -> 50300 bytes .../ewarm/Exe/boot_demo_emac_flash.out | Bin 0 -> 601676 bytes .../gcc/boot_demo_emac_flash.axf | Bin 0 -> 120235 bytes .../gcc/boot_demo_emac_flash.bin | Bin 0 -> 53764 bytes boards/dk-tm4c129x/boot_demo_emac_flash/lwipopts.h | 433 + boards/dk-tm4c129x/boot_demo_emac_flash/readme.txt | 44 + .../rvmdk/boot_demo_emac_flash.axf | Bin 0 -> 491656 bytes .../rvmdk/boot_demo_emac_flash.bin | Bin 0 -> 52064 bytes .../dk-tm4c129x/boot_demo_emac_flash/startup_ccs.c | 276 + .../boot_demo_emac_flash/startup_ewarm.c | 307 + .../dk-tm4c129x/boot_demo_emac_flash/startup_gcc.c | 323 + .../boot_demo_emac_flash/startup_rvmdk.S | 332 + boards/dk-tm4c129x/boot_demo_flash/Makefile | 100 + .../dk-tm4c129x/boot_demo_flash/boot_demo_flash.c | 512 + .../boot_demo_flash/boot_demo_flash.ewd | 614 + .../boot_demo_flash/boot_demo_flash.ewp | 821 + .../boot_demo_flash/boot_demo_flash.icf | 78 + .../dk-tm4c129x/boot_demo_flash/boot_demo_flash.ld | 57 + .../boot_demo_flash/boot_demo_flash.sct | 47 + .../boot_demo_flash/boot_demo_flash.uvopt | 387 + .../boot_demo_flash/boot_demo_flash.uvproj | 459 + .../boot_demo_flash/boot_demo_flash_ccs.cmd | 70 + .../dk-tm4c129x/boot_demo_flash/ccs/.ccsimportspec | 9 + boards/dk-tm4c129x/boot_demo_flash/ccs/.ccsproject | 10 + boards/dk-tm4c129x/boot_demo_flash/ccs/.cproject | 205 + boards/dk-tm4c129x/boot_demo_flash/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../boot_demo_flash/ccs/Debug/boot_demo_flash.bin | Bin 0 -> 56560 bytes .../boot_demo_flash/ccs/Debug/boot_demo_flash.out | Bin 0 -> 718405 bytes .../boot_demo_flash/ccs/macros.ini_initial | 1 + .../boot_demo_flash/ccs/target_config.ccxml | 13 + .../boot_demo_flash/ewarm/Exe/boot_demo_flash.bin | Bin 0 -> 51876 bytes .../boot_demo_flash/ewarm/Exe/boot_demo_flash.out | Bin 0 -> 625160 bytes .../boot_demo_flash/gcc/boot_demo_flash.axf | Bin 0 -> 120693 bytes .../boot_demo_flash/gcc/boot_demo_flash.bin | Bin 0 -> 55452 bytes boards/dk-tm4c129x/boot_demo_flash/lwipopts.h | 433 + boards/dk-tm4c129x/boot_demo_flash/readme.txt | 43 + .../boot_demo_flash/rvmdk/boot_demo_flash.axf | Bin 0 -> 501916 bytes .../boot_demo_flash/rvmdk/boot_demo_flash.bin | Bin 0 -> 53692 bytes boards/dk-tm4c129x/boot_demo_flash/startup_ccs.c | 277 + boards/dk-tm4c129x/boot_demo_flash/startup_ewarm.c | 308 + boards/dk-tm4c129x/boot_demo_flash/startup_gcc.c | 324 + boards/dk-tm4c129x/boot_demo_flash/startup_rvmdk.S | 333 + boards/dk-tm4c129x/boot_demo_uart/Makefile | 90 + boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.c | 224 + .../dk-tm4c129x/boot_demo_uart/boot_demo_uart.ewd | 614 + .../dk-tm4c129x/boot_demo_uart/boot_demo_uart.ewp | 801 + .../dk-tm4c129x/boot_demo_uart/boot_demo_uart.icf | 78 + .../dk-tm4c129x/boot_demo_uart/boot_demo_uart.ld | 57 + .../dk-tm4c129x/boot_demo_uart/boot_demo_uart.sct | 47 + .../boot_demo_uart/boot_demo_uart.uvopt | 359 + .../boot_demo_uart/boot_demo_uart.uvproj | 449 + .../boot_demo_uart/boot_demo_uart_ccs.cmd | 70 + .../dk-tm4c129x/boot_demo_uart/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/boot_demo_uart/ccs/.ccsproject | 10 + boards/dk-tm4c129x/boot_demo_uart/ccs/.cproject | 191 + boards/dk-tm4c129x/boot_demo_uart/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../boot_demo_uart/ccs/Debug/boot_demo_uart.bin | Bin 0 -> 26640 bytes .../boot_demo_uart/ccs/Debug/boot_demo_uart.out | Bin 0 -> 215026 bytes .../boot_demo_uart/ccs/macros.ini_initial | 1 + .../boot_demo_uart/ccs/target_config.ccxml | 13 + .../boot_demo_uart/ewarm/Exe/boot_demo_uart.bin | Bin 0 -> 24520 bytes .../boot_demo_uart/ewarm/Exe/boot_demo_uart.out | Bin 0 -> 194792 bytes .../boot_demo_uart/gcc/boot_demo_uart.axf | Bin 0 -> 71339 bytes .../boot_demo_uart/gcc/boot_demo_uart.bin | Bin 0 -> 25058 bytes boards/dk-tm4c129x/boot_demo_uart/readme.txt | 27 + .../boot_demo_uart/rvmdk/boot_demo_uart.axf | Bin 0 -> 171396 bytes .../boot_demo_uart/rvmdk/boot_demo_uart.bin | Bin 0 -> 25156 bytes boards/dk-tm4c129x/boot_demo_uart/startup_ccs.c | 275 + boards/dk-tm4c129x/boot_demo_uart/startup_ewarm.c | 306 + boards/dk-tm4c129x/boot_demo_uart/startup_gcc.c | 322 + boards/dk-tm4c129x/boot_demo_uart/startup_rvmdk.S | 331 + boards/dk-tm4c129x/boot_demo_usb/Makefile | 93 + boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.c | 821 + boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ewd | 614 + boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ewp | 807 + boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.icf | 78 + boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ld | 57 + boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.sct | 47 + .../dk-tm4c129x/boot_demo_usb/boot_demo_usb.uvopt | 387 + .../dk-tm4c129x/boot_demo_usb/boot_demo_usb.uvproj | 459 + .../boot_demo_usb/boot_demo_usb_ccs.cmd | 70 + .../dk-tm4c129x/boot_demo_usb/ccs/.ccsimportspec | 10 + boards/dk-tm4c129x/boot_demo_usb/ccs/.ccsproject | 10 + boards/dk-tm4c129x/boot_demo_usb/ccs/.cproject | 193 + boards/dk-tm4c129x/boot_demo_usb/ccs/.project | 75 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../boot_demo_usb/ccs/Debug/boot_demo_usb.bin | Bin 0 -> 40840 bytes .../boot_demo_usb/ccs/Debug/boot_demo_usb.out | Bin 0 -> 666984 bytes .../boot_demo_usb/ccs/macros.ini_initial | 1 + .../boot_demo_usb/ccs/target_config.ccxml | 13 + .../boot_demo_usb/ewarm/Exe/boot_demo_usb.bin | Bin 0 -> 38108 bytes .../boot_demo_usb/ewarm/Exe/boot_demo_usb.out | Bin 0 -> 509724 bytes .../boot_demo_usb/gcc/boot_demo_usb.axf | Bin 0 -> 119014 bytes .../boot_demo_usb/gcc/boot_demo_usb.bin | Bin 0 -> 39528 bytes boards/dk-tm4c129x/boot_demo_usb/readme.txt | 90 + .../boot_demo_usb/rvmdk/boot_demo_usb.axf | Bin 0 -> 411572 bytes .../boot_demo_usb/rvmdk/boot_demo_usb.bin | Bin 0 -> 40688 bytes boards/dk-tm4c129x/boot_demo_usb/startup_ccs.c | 277 + boards/dk-tm4c129x/boot_demo_usb/startup_ewarm.c | 308 + boards/dk-tm4c129x/boot_demo_usb/startup_gcc.c | 324 + boards/dk-tm4c129x/boot_demo_usb/startup_rvmdk.S | 333 + .../dk-tm4c129x/boot_demo_usb/usb_hiddfu_structs.c | 246 + .../dk-tm4c129x/boot_demo_usb/usb_hiddfu_structs.h | 40 + boards/dk-tm4c129x/boot_emac_flash/Makefile | 98 + boards/dk-tm4c129x/boot_emac_flash/bl_config.h | 1137 + .../dk-tm4c129x/boot_emac_flash/boot_emac_flash.c | 52 + .../boot_emac_flash/boot_emac_flash.ewd | 614 + .../boot_emac_flash/boot_emac_flash.ewp | 821 + .../boot_emac_flash/boot_emac_flash.uvopt | 450 + .../boot_emac_flash/boot_emac_flash.uvproj | 479 + .../dk-tm4c129x/boot_emac_flash/ccs/.ccsimportspec | 6 + boards/dk-tm4c129x/boot_emac_flash/ccs/.ccsproject | 10 + boards/dk-tm4c129x/boot_emac_flash/ccs/.cproject | 191 + boards/dk-tm4c129x/boot_emac_flash/ccs/.project | 115 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../boot_emac_flash/ccs/Debug/boot_emac_flash.bin | Bin 0 -> 4730 bytes .../boot_emac_flash/ccs/Debug/boot_emac_flash.out | Bin 0 -> 84728 bytes .../boot_emac_flash/ccs/macros.ini_initial | 1 + .../boot_emac_flash/ccs/target_config.ccxml | 13 + .../boot_emac_flash/ewarm/Exe/boot_emac_flash.bin | Bin 0 -> 4016 bytes .../boot_emac_flash/ewarm/Exe/boot_emac_flash.out | Bin 0 -> 69064 bytes .../boot_emac_flash/gcc/boot_emac_flash.axf | Bin 0 -> 41712 bytes .../boot_emac_flash/gcc/boot_emac_flash.bin | Bin 0 -> 4438 bytes .../boot_emac_flash/rvmdk/boot_emac_flash.axf | Bin 0 -> 69740 bytes .../boot_emac_flash/rvmdk/boot_emac_flash.bin | Bin 0 -> 4388 bytes boards/dk-tm4c129x/calibrate/Makefile | 92 + boards/dk-tm4c129x/calibrate/calibrate.c | 331 + boards/dk-tm4c129x/calibrate/calibrate.ewd | 614 + boards/dk-tm4c129x/calibrate/calibrate.ewp | 804 + boards/dk-tm4c129x/calibrate/calibrate.icf | 78 + boards/dk-tm4c129x/calibrate/calibrate.ld | 57 + boards/dk-tm4c129x/calibrate/calibrate.sct | 47 + boards/dk-tm4c129x/calibrate/calibrate.uvopt | 373 + boards/dk-tm4c129x/calibrate/calibrate.uvproj | 454 + boards/dk-tm4c129x/calibrate/calibrate_ccs.cmd | 70 + boards/dk-tm4c129x/calibrate/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/calibrate/ccs/.ccsproject | 10 + boards/dk-tm4c129x/calibrate/ccs/.cproject | 191 + boards/dk-tm4c129x/calibrate/ccs/.project | 75 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c129x/calibrate/ccs/Debug/calibrate.bin | Bin 0 -> 30192 bytes .../dk-tm4c129x/calibrate/ccs/Debug/calibrate.out | Bin 0 -> 234549 bytes .../dk-tm4c129x/calibrate/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/calibrate/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/calibrate/ewarm/Exe/calibrate.bin | Bin 0 -> 27888 bytes .../dk-tm4c129x/calibrate/ewarm/Exe/calibrate.out | Bin 0 -> 211428 bytes boards/dk-tm4c129x/calibrate/gcc/calibrate.axf | Bin 0 -> 71494 bytes boards/dk-tm4c129x/calibrate/gcc/calibrate.bin | Bin 0 -> 28594 bytes boards/dk-tm4c129x/calibrate/readme.txt | 32 + boards/dk-tm4c129x/calibrate/rvmdk/calibrate.axf | Bin 0 -> 204760 bytes boards/dk-tm4c129x/calibrate/rvmdk/calibrate.bin | Bin 0 -> 28756 bytes boards/dk-tm4c129x/calibrate/startup_ccs.c | 275 + boards/dk-tm4c129x/calibrate/startup_ewarm.c | 306 + boards/dk-tm4c129x/calibrate/startup_gcc.c | 322 + boards/dk-tm4c129x/calibrate/startup_rvmdk.S | 331 + boards/dk-tm4c129x/crc32/Makefile | 91 + boards/dk-tm4c129x/crc32/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/crc32/ccs/.ccsproject | 10 + boards/dk-tm4c129x/crc32/ccs/.cproject | 191 + boards/dk-tm4c129x/crc32/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/crc32/ccs/Debug/crc32.bin | Bin 0 -> 29968 bytes boards/dk-tm4c129x/crc32/ccs/Debug/crc32.out | Bin 0 -> 231438 bytes boards/dk-tm4c129x/crc32/ccs/macros.ini_initial | 1 + boards/dk-tm4c129x/crc32/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/crc32/crc32.c | 482 + boards/dk-tm4c129x/crc32/crc32.ewd | 614 + boards/dk-tm4c129x/crc32/crc32.ewp | 801 + boards/dk-tm4c129x/crc32/crc32.icf | 78 + boards/dk-tm4c129x/crc32/crc32.ld | 57 + boards/dk-tm4c129x/crc32/crc32.sct | 47 + boards/dk-tm4c129x/crc32/crc32.uvopt | 359 + boards/dk-tm4c129x/crc32/crc32.uvproj | 449 + boards/dk-tm4c129x/crc32/crc32_ccs.cmd | 70 + boards/dk-tm4c129x/crc32/ewarm/Exe/crc32.bin | Bin 0 -> 27612 bytes boards/dk-tm4c129x/crc32/ewarm/Exe/crc32.out | Bin 0 -> 202196 bytes boards/dk-tm4c129x/crc32/gcc/crc32.axf | Bin 0 -> 71357 bytes boards/dk-tm4c129x/crc32/gcc/crc32.bin | Bin 0 -> 28100 bytes boards/dk-tm4c129x/crc32/readme.txt | 26 + boards/dk-tm4c129x/crc32/rvmdk/crc32.axf | Bin 0 -> 214152 bytes boards/dk-tm4c129x/crc32/rvmdk/crc32.bin | Bin 0 -> 28192 bytes boards/dk-tm4c129x/crc32/startup_ccs.c | 268 + boards/dk-tm4c129x/crc32/startup_ewarm.c | 299 + boards/dk-tm4c129x/crc32/startup_gcc.c | 315 + boards/dk-tm4c129x/crc32/startup_rvmdk.S | 324 + boards/dk-tm4c129x/dk-tm4c129x.eww | 464 + boards/dk-tm4c129x/dk-tm4c129x.uvmpw | 335 + boards/dk-tm4c129x/drivers/buttons.c | 261 + boards/dk-tm4c129x/drivers/buttons.h | 105 + boards/dk-tm4c129x/drivers/frame.c | 1539 + boards/dk-tm4c129x/drivers/frame.h | 55 + .../dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c | 1056 + .../dk-tm4c129x/drivers/kentec320x240x16_ssd2119.h | 58 + boards/dk-tm4c129x/drivers/mx66l51235f.c | 534 + boards/dk-tm4c129x/drivers/mx66l51235f.h | 71 + boards/dk-tm4c129x/drivers/pinout.c | 282 + boards/dk-tm4c129x/drivers/pinout.h | 59 + boards/dk-tm4c129x/drivers/sound.c | 688 + boards/dk-tm4c129x/drivers/sound.h | 65 + boards/dk-tm4c129x/drivers/touch.c | 762 + boards/dk-tm4c129x/drivers/touch.h | 61 + boards/dk-tm4c129x/drivers/usb_sound.c | 769 + boards/dk-tm4c129x/drivers/usb_sound.h | 81 + boards/dk-tm4c129x/enet_io/Makefile | 105 + boards/dk-tm4c129x/enet_io/ccs/.ccsimportspec | 33 + boards/dk-tm4c129x/enet_io/ccs/.ccsproject | 10 + boards/dk-tm4c129x/enet_io/ccs/.cproject | 203 + boards/dk-tm4c129x/enet_io/ccs/.project | 100 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/enet_io/ccs/Debug/enet_io.bin | Bin 0 -> 161560 bytes boards/dk-tm4c129x/enet_io/ccs/Debug/enet_io.out | Bin 0 -> 921236 bytes boards/dk-tm4c129x/enet_io/ccs/macros.ini_initial | 1 + boards/dk-tm4c129x/enet_io/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/enet_io/cgifuncs.c | 551 + boards/dk-tm4c129x/enet_io/cgifuncs.h | 45 + boards/dk-tm4c129x/enet_io/enet_io.c | 927 + boards/dk-tm4c129x/enet_io/enet_io.ewd | 614 + boards/dk-tm4c129x/enet_io/enet_io.ewp | 831 + boards/dk-tm4c129x/enet_io/enet_io.icf | 78 + boards/dk-tm4c129x/enet_io/enet_io.ld | 57 + boards/dk-tm4c129x/enet_io/enet_io.sct | 47 + boards/dk-tm4c129x/enet_io/enet_io.uvopt | 443 + boards/dk-tm4c129x/enet_io/enet_io.uvproj | 479 + boards/dk-tm4c129x/enet_io/enet_io_ccs.cmd | 70 + boards/dk-tm4c129x/enet_io/ewarm/Exe/enet_io.bin | Bin 0 -> 156948 bytes boards/dk-tm4c129x/enet_io/ewarm/Exe/enet_io.out | Bin 0 -> 795200 bytes boards/dk-tm4c129x/enet_io/fs/404.htm | 12 + boards/dk-tm4c129x/enet_io/fs/about.htm | 33 + boards/dk-tm4c129x/enet_io/fs/block.htm | 18 + boards/dk-tm4c129x/enet_io/fs/block.jpg | Bin 0 -> 50426 bytes boards/dk-tm4c129x/enet_io/fs/dk-tm4c129x.jpg | Bin 0 -> 10720 bytes boards/dk-tm4c129x/enet_io/fs/favicon.ico | Bin 0 -> 1718 bytes boards/dk-tm4c129x/enet_io/fs/index.htm | 57 + boards/dk-tm4c129x/enet_io/fs/io_cgi.ssi | 146 + boards/dk-tm4c129x/enet_io/fs/io_http.htm | 63 + boards/dk-tm4c129x/enet_io/fs/javascript.js | 191 + boards/dk-tm4c129x/enet_io/fs/javascript_load.js | 11 + boards/dk-tm4c129x/enet_io/fs/overview.htm | 30 + boards/dk-tm4c129x/enet_io/fs/perror.htm | 74 + boards/dk-tm4c129x/enet_io/fs/styles.css | 104 + boards/dk-tm4c129x/enet_io/fs/ti.jpg | Bin 0 -> 7156 bytes boards/dk-tm4c129x/enet_io/fs/tm4c.jpg | Bin 0 -> 3369 bytes boards/dk-tm4c129x/enet_io/gcc/enet_io.axf | Bin 0 -> 223416 bytes boards/dk-tm4c129x/enet_io/gcc/enet_io.bin | Bin 0 -> 162598 bytes boards/dk-tm4c129x/enet_io/io.c | 259 + boards/dk-tm4c129x/enet_io/io.h | 58 + boards/dk-tm4c129x/enet_io/io_fs.c | 316 + boards/dk-tm4c129x/enet_io/io_fsdata.h | 12700 +++++ boards/dk-tm4c129x/enet_io/lwipopts.h | 439 + boards/dk-tm4c129x/enet_io/readme.txt | 78 + boards/dk-tm4c129x/enet_io/rvmdk/enet_io.axf | Bin 0 -> 631608 bytes boards/dk-tm4c129x/enet_io/rvmdk/enet_io.bin | Bin 0 -> 158412 bytes boards/dk-tm4c129x/enet_io/startup_ccs.c | 277 + boards/dk-tm4c129x/enet_io/startup_ewarm.c | 308 + boards/dk-tm4c129x/enet_io/startup_gcc.c | 324 + boards/dk-tm4c129x/enet_io/startup_rvmdk.S | 333 + boards/dk-tm4c129x/enet_lwip/Makefile | 106 + boards/dk-tm4c129x/enet_lwip/ccs/.ccsimportspec | 26 + boards/dk-tm4c129x/enet_lwip/ccs/.ccsproject | 10 + boards/dk-tm4c129x/enet_lwip/ccs/.cproject | 203 + boards/dk-tm4c129x/enet_lwip/ccs/.project | 100 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c129x/enet_lwip/ccs/Debug/enet_lwip.bin | Bin 0 -> 189576 bytes .../dk-tm4c129x/enet_lwip/ccs/Debug/enet_lwip.out | Bin 0 -> 982762 bytes .../dk-tm4c129x/enet_lwip/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/enet_lwip/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/enet_lwip/enet_fs.c | 338 + boards/dk-tm4c129x/enet_lwip/enet_fs.h | 36 + boards/dk-tm4c129x/enet_lwip/enet_fsdata.h | 16229 +++++++ boards/dk-tm4c129x/enet_lwip/enet_lwip.c | 455 + boards/dk-tm4c129x/enet_lwip/enet_lwip.ewd | 614 + boards/dk-tm4c129x/enet_lwip/enet_lwip.ewp | 831 + boards/dk-tm4c129x/enet_lwip/enet_lwip.icf | 78 + boards/dk-tm4c129x/enet_lwip/enet_lwip.ld | 57 + boards/dk-tm4c129x/enet_lwip/enet_lwip.sct | 47 + boards/dk-tm4c129x/enet_lwip/enet_lwip.uvopt | 443 + boards/dk-tm4c129x/enet_lwip/enet_lwip.uvproj | 479 + boards/dk-tm4c129x/enet_lwip/enet_lwip_ccs.cmd | 70 + .../dk-tm4c129x/enet_lwip/ewarm/Exe/enet_lwip.bin | Bin 0 -> 184872 bytes .../dk-tm4c129x/enet_lwip/ewarm/Exe/enet_lwip.out | Bin 0 -> 857612 bytes boards/dk-tm4c129x/enet_lwip/fs/404.htm | 9 + boards/dk-tm4c129x/enet_lwip/fs/about.htm | 32 + boards/dk-tm4c129x/enet_lwip/fs/block.htm | 17 + boards/dk-tm4c129x/enet_lwip/fs/block.jpg | Bin 0 -> 90569 bytes boards/dk-tm4c129x/enet_lwip/fs/dk-tm4c129x.jpg | Bin 0 -> 16832 bytes boards/dk-tm4c129x/enet_lwip/fs/favicon.ico | Bin 0 -> 1718 bytes boards/dk-tm4c129x/enet_lwip/fs/index.htm | 54 + boards/dk-tm4c129x/enet_lwip/fs/javascript.js | 53 + boards/dk-tm4c129x/enet_lwip/fs/overview.htm | 29 + boards/dk-tm4c129x/enet_lwip/fs/styles.css | 104 + boards/dk-tm4c129x/enet_lwip/fs/ti.jpg | Bin 0 -> 7156 bytes boards/dk-tm4c129x/enet_lwip/fs/tm4c.jpg | Bin 0 -> 3369 bytes boards/dk-tm4c129x/enet_lwip/gcc/enet_lwip.axf | Bin 0 -> 255946 bytes boards/dk-tm4c129x/enet_lwip/gcc/enet_lwip.bin | Bin 0 -> 190739 bytes boards/dk-tm4c129x/enet_lwip/lwipopts.h | 439 + boards/dk-tm4c129x/enet_lwip/readme.txt | 41 + boards/dk-tm4c129x/enet_lwip/rvmdk/enet_lwip.axf | Bin 0 -> 651124 bytes boards/dk-tm4c129x/enet_lwip/rvmdk/enet_lwip.bin | Bin 0 -> 186256 bytes boards/dk-tm4c129x/enet_lwip/startup_ccs.c | 276 + boards/dk-tm4c129x/enet_lwip/startup_ewarm.c | 307 + boards/dk-tm4c129x/enet_lwip/startup_gcc.c | 323 + boards/dk-tm4c129x/enet_lwip/startup_rvmdk.S | 332 + boards/dk-tm4c129x/enet_uip/Makefile | 106 + boards/dk-tm4c129x/enet_uip/ccs/.ccsimportspec | 10 + boards/dk-tm4c129x/enet_uip/ccs/.ccsproject | 10 + boards/dk-tm4c129x/enet_uip/ccs/.cproject | 205 + boards/dk-tm4c129x/enet_uip/ccs/.project | 100 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/enet_uip/ccs/Debug/enet_uip.bin | Bin 0 -> 38264 bytes boards/dk-tm4c129x/enet_uip/ccs/Debug/enet_uip.out | Bin 0 -> 386272 bytes boards/dk-tm4c129x/enet_uip/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/enet_uip/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/enet_uip/clock-arch.h | 41 + boards/dk-tm4c129x/enet_uip/enet_uip.c | 1065 + boards/dk-tm4c129x/enet_uip/enet_uip.ewd | 614 + boards/dk-tm4c129x/enet_uip/enet_uip.ewp | 831 + boards/dk-tm4c129x/enet_uip/enet_uip.icf | 78 + boards/dk-tm4c129x/enet_uip/enet_uip.ld | 57 + boards/dk-tm4c129x/enet_uip/enet_uip.sct | 47 + boards/dk-tm4c129x/enet_uip/enet_uip.uvopt | 443 + boards/dk-tm4c129x/enet_uip/enet_uip.uvproj | 479 + boards/dk-tm4c129x/enet_uip/enet_uip_ccs.cmd | 70 + boards/dk-tm4c129x/enet_uip/ewarm/Exe/enet_uip.bin | Bin 0 -> 35324 bytes boards/dk-tm4c129x/enet_uip/ewarm/Exe/enet_uip.out | Bin 0 -> 310236 bytes boards/dk-tm4c129x/enet_uip/gcc/enet_uip.axf | Bin 0 -> 109049 bytes boards/dk-tm4c129x/enet_uip/gcc/enet_uip.bin | Bin 0 -> 37146 bytes boards/dk-tm4c129x/enet_uip/readme.txt | 33 + boards/dk-tm4c129x/enet_uip/rvmdk/enet_uip.axf | Bin 0 -> 316940 bytes boards/dk-tm4c129x/enet_uip/rvmdk/enet_uip.bin | Bin 0 -> 35764 bytes boards/dk-tm4c129x/enet_uip/startup_ccs.c | 276 + boards/dk-tm4c129x/enet_uip/startup_ewarm.c | 307 + boards/dk-tm4c129x/enet_uip/startup_gcc.c | 323 + boards/dk-tm4c129x/enet_uip/startup_rvmdk.S | 332 + boards/dk-tm4c129x/enet_uip/uip-conf.h | 162 + boards/dk-tm4c129x/fontview/Makefile | 102 + boards/dk-tm4c129x/fontview/ccs/.ccsimportspec | 10 + boards/dk-tm4c129x/fontview/ccs/.ccsproject | 10 + boards/dk-tm4c129x/fontview/ccs/.cproject | 197 + boards/dk-tm4c129x/fontview/ccs/.project | 100 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/fontview/ccs/Debug/fontview.bin | Bin 0 -> 58768 bytes boards/dk-tm4c129x/fontview/ccs/Debug/fontview.out | Bin 0 -> 476809 bytes boards/dk-tm4c129x/fontview/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/fontview/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/fontview/ewarm/Exe/fontview.bin | Bin 0 -> 55868 bytes boards/dk-tm4c129x/fontview/ewarm/Exe/fontview.out | Bin 0 -> 436292 bytes boards/dk-tm4c129x/fontview/fatwrapper.c | 858 + boards/dk-tm4c129x/fontview/fatwrapper.h | 45 + boards/dk-tm4c129x/fontview/fontview.c | 705 + boards/dk-tm4c129x/fontview/fontview.ewd | 614 + boards/dk-tm4c129x/fontview/fontview.ewp | 824 + boards/dk-tm4c129x/fontview/fontview.icf | 78 + boards/dk-tm4c129x/fontview/fontview.ld | 57 + boards/dk-tm4c129x/fontview/fontview.sct | 47 + boards/dk-tm4c129x/fontview/fontview.uvopt | 443 + boards/dk-tm4c129x/fontview/fontview.uvproj | 479 + boards/dk-tm4c129x/fontview/fontview_ccs.cmd | 70 + boards/dk-tm4c129x/fontview/gcc/fontview.axf | Bin 0 -> 113159 bytes boards/dk-tm4c129x/fontview/gcc/fontview.bin | Bin 0 -> 57400 bytes boards/dk-tm4c129x/fontview/readme.txt | 30 + boards/dk-tm4c129x/fontview/rvmdk/fontview.axf | Bin 0 -> 368912 bytes boards/dk-tm4c129x/fontview/rvmdk/fontview.bin | Bin 0 -> 56228 bytes boards/dk-tm4c129x/fontview/startup_ccs.c | 277 + boards/dk-tm4c129x/fontview/startup_ewarm.c | 308 + boards/dk-tm4c129x/fontview/startup_gcc.c | 324 + boards/dk-tm4c129x/fontview/startup_rvmdk.S | 333 + boards/dk-tm4c129x/freertos_demo/FreeRTOSConfig.h | 107 + boards/dk-tm4c129x/freertos_demo/Makefile | 124 + .../dk-tm4c129x/freertos_demo/ccs/.ccsimportspec | 59 + boards/dk-tm4c129x/freertos_demo/ccs/.ccsproject | 10 + boards/dk-tm4c129x/freertos_demo/ccs/.cproject | 211 + boards/dk-tm4c129x/freertos_demo/ccs/.project | 175 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../freertos_demo/ccs/Debug/freertos_demo.bin | Bin 0 -> 461448 bytes .../freertos_demo/ccs/Debug/freertos_demo.out | Bin 0 -> 1447152 bytes .../freertos_demo/ccs/macros.ini_initial | 1 + .../freertos_demo/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/freertos_demo/cgifuncs.c | 552 + boards/dk-tm4c129x/freertos_demo/cgifuncs.h | 46 + boards/dk-tm4c129x/freertos_demo/display_task.c | 329 + boards/dk-tm4c129x/freertos_demo/display_task.h | 41 + .../freertos_demo/ewarm/Exe/freertos_demo.bin | Bin 0 -> 455852 bytes .../freertos_demo/ewarm/Exe/freertos_demo.out | Bin 0 -> 1290620 bytes boards/dk-tm4c129x/freertos_demo/freertos_demo.c | 275 + boards/dk-tm4c129x/freertos_demo/freertos_demo.ewd | 614 + boards/dk-tm4c129x/freertos_demo/freertos_demo.ewp | 883 + boards/dk-tm4c129x/freertos_demo/freertos_demo.h | 35 + boards/dk-tm4c129x/freertos_demo/freertos_demo.icf | 78 + boards/dk-tm4c129x/freertos_demo/freertos_demo.ld | 57 + boards/dk-tm4c129x/freertos_demo/freertos_demo.sct | 47 + .../dk-tm4c129x/freertos_demo/freertos_demo.uvopt | 639 + .../dk-tm4c129x/freertos_demo/freertos_demo.uvproj | 549 + .../freertos_demo/freertos_demo_ccs.cmd | 70 + boards/dk-tm4c129x/freertos_demo/fs.c | 236 + .../freertos_demo/gcc/freertos_demo.axf | Bin 0 -> 561272 bytes .../freertos_demo/gcc/freertos_demo.bin | Bin 0 -> 462254 bytes boards/dk-tm4c129x/freertos_demo/html/404.htm | 9 + boards/dk-tm4c129x/freertos_demo/html/block.htm | 27 + boards/dk-tm4c129x/freertos_demo/html/family.htm | 45 + boards/dk-tm4c129x/freertos_demo/html/favicon.ico | Bin 0 -> 1718 bytes boards/dk-tm4c129x/freertos_demo/html/footer.htm | 38 + boards/dk-tm4c129x/freertos_demo/html/freertos.htm | 30 + boards/dk-tm4c129x/freertos_demo/html/header.htm | 51 + .../dk-tm4c129x/freertos_demo/html/images/apps.jpg | Bin 0 -> 55996 bytes .../html/images/c-c-c-communicate-small.jpg | Bin 0 -> 8037 bytes .../html/images/c-c-c-connect-small.jpg | Bin 0 -> 8256 bytes .../html/images/c-c-c-control-small.jpg | Bin 0 -> 7379 bytes .../freertos_demo/html/images/cortex.jpg | Bin 0 -> 6399 bytes .../freertos_demo/html/images/freertos.jpg | Bin 0 -> 3680 bytes .../freertos_demo/html/images/mcu_side-by-side.jpg | Bin 0 -> 77835 bytes .../dk-tm4c129x/freertos_demo/html/images/ti.gif | Bin 0 -> 720 bytes .../freertos_demo/html/images/ti_logo.gif | Bin 0 -> 3301 bytes .../dk-tm4c129x/freertos_demo/html/images/tiva.jpg | Bin 0 -> 164196 bytes .../freertos_demo/html/images/tiva_globe-small.gif | Bin 0 -> 15436 bytes boards/dk-tm4c129x/freertos_demo/html/index.htm | 19 + boards/dk-tm4c129x/freertos_demo/html/io.ssi | 44 + boards/dk-tm4c129x/freertos_demo/html/lwipstat.ssi | 110 + boards/dk-tm4c129x/freertos_demo/html/perror.htm | 25 + boards/dk-tm4c129x/freertos_demo/html/side.htm | 33 + boards/dk-tm4c129x/freertos_demo/html/styles.css | 31 + boards/dk-tm4c129x/freertos_demo/html/ti.htm | 43 + boards/dk-tm4c129x/freertos_demo/htmldata.h | 46756 +++++++++++++++++++ boards/dk-tm4c129x/freertos_demo/idle_task.c | 460 + boards/dk-tm4c129x/freertos_demo/idle_task.h | 35 + boards/dk-tm4c129x/freertos_demo/images.c | 4602 ++ boards/dk-tm4c129x/freertos_demo/images.h | 51 + boards/dk-tm4c129x/freertos_demo/led_task.c | 120 + boards/dk-tm4c129x/freertos_demo/led_task.h | 36 + boards/dk-tm4c129x/freertos_demo/lwip_task.c | 378 + boards/dk-tm4c129x/freertos_demo/lwip_task.h | 35 + boards/dk-tm4c129x/freertos_demo/lwipopts.h | 446 + boards/dk-tm4c129x/freertos_demo/priorities.h | 39 + boards/dk-tm4c129x/freertos_demo/random.c | 176 + boards/dk-tm4c129x/freertos_demo/random.h | 37 + boards/dk-tm4c129x/freertos_demo/readme.txt | 66 + .../freertos_demo/rvmdk/freertos_demo.axf | Bin 0 -> 1059100 bytes .../freertos_demo/rvmdk/freertos_demo.bin | Bin 0 -> 457328 bytes boards/dk-tm4c129x/freertos_demo/spider_task.c | 855 + boards/dk-tm4c129x/freertos_demo/spider_task.h | 44 + boards/dk-tm4c129x/freertos_demo/startup_ccs.c | 279 + boards/dk-tm4c129x/freertos_demo/startup_ewarm.c | 310 + boards/dk-tm4c129x/freertos_demo/startup_gcc.c | 326 + boards/dk-tm4c129x/freertos_demo/startup_rvmdk.S | 335 + boards/dk-tm4c129x/gpio_jtag/Makefile | 90 + boards/dk-tm4c129x/gpio_jtag/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/gpio_jtag/ccs/.ccsproject | 10 + boards/dk-tm4c129x/gpio_jtag/ccs/.cproject | 191 + boards/dk-tm4c129x/gpio_jtag/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c129x/gpio_jtag/ccs/Debug/gpio_jtag.bin | Bin 0 -> 28960 bytes .../dk-tm4c129x/gpio_jtag/ccs/Debug/gpio_jtag.out | Bin 0 -> 217256 bytes .../dk-tm4c129x/gpio_jtag/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/gpio_jtag/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/gpio_jtag/ewarm/Exe/gpio_jtag.bin | Bin 0 -> 26792 bytes .../dk-tm4c129x/gpio_jtag/ewarm/Exe/gpio_jtag.out | Bin 0 -> 194052 bytes boards/dk-tm4c129x/gpio_jtag/gcc/gpio_jtag.axf | Bin 0 -> 71437 bytes boards/dk-tm4c129x/gpio_jtag/gcc/gpio_jtag.bin | Bin 0 -> 27350 bytes boards/dk-tm4c129x/gpio_jtag/gpio_jtag.c | 262 + boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ewd | 614 + boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ewp | 801 + boards/dk-tm4c129x/gpio_jtag/gpio_jtag.icf | 78 + boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ld | 57 + boards/dk-tm4c129x/gpio_jtag/gpio_jtag.sct | 47 + boards/dk-tm4c129x/gpio_jtag/gpio_jtag.uvopt | 359 + boards/dk-tm4c129x/gpio_jtag/gpio_jtag.uvproj | 449 + boards/dk-tm4c129x/gpio_jtag/gpio_jtag_ccs.cmd | 70 + boards/dk-tm4c129x/gpio_jtag/readme.txt | 28 + boards/dk-tm4c129x/gpio_jtag/rvmdk/gpio_jtag.axf | Bin 0 -> 197492 bytes boards/dk-tm4c129x/gpio_jtag/rvmdk/gpio_jtag.bin | Bin 0 -> 27440 bytes boards/dk-tm4c129x/gpio_jtag/startup_ccs.c | 275 + boards/dk-tm4c129x/gpio_jtag/startup_ewarm.c | 306 + boards/dk-tm4c129x/gpio_jtag/startup_gcc.c | 322 + boards/dk-tm4c129x/gpio_jtag/startup_rvmdk.S | 331 + boards/dk-tm4c129x/grlib_demo/Makefile | 95 + boards/dk-tm4c129x/grlib_demo/ccs/.ccsimportspec | 10 + boards/dk-tm4c129x/grlib_demo/ccs/.ccsproject | 10 + boards/dk-tm4c129x/grlib_demo/ccs/.cproject | 191 + boards/dk-tm4c129x/grlib_demo/ccs/.project | 90 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../grlib_demo/ccs/Debug/grlib_demo.bin | Bin 0 -> 65712 bytes .../grlib_demo/ccs/Debug/grlib_demo.out | Bin 0 -> 436321 bytes .../dk-tm4c129x/grlib_demo/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/grlib_demo/ccs/target_config.ccxml | 13 + .../grlib_demo/ewarm/Exe/grlib_demo.bin | Bin 0 -> 61580 bytes .../grlib_demo/ewarm/Exe/grlib_demo.out | Bin 0 -> 426024 bytes boards/dk-tm4c129x/grlib_demo/gcc/grlib_demo.axf | Bin 0 -> 114964 bytes boards/dk-tm4c129x/grlib_demo/gcc/grlib_demo.bin | Bin 0 -> 65288 bytes boards/dk-tm4c129x/grlib_demo/grlib_demo.c | 1324 + boards/dk-tm4c129x/grlib_demo/grlib_demo.ewd | 614 + boards/dk-tm4c129x/grlib_demo/grlib_demo.ewp | 813 + boards/dk-tm4c129x/grlib_demo/grlib_demo.icf | 78 + boards/dk-tm4c129x/grlib_demo/grlib_demo.ld | 57 + boards/dk-tm4c129x/grlib_demo/grlib_demo.sct | 47 + boards/dk-tm4c129x/grlib_demo/grlib_demo.uvopt | 415 + boards/dk-tm4c129x/grlib_demo/grlib_demo.uvproj | 469 + boards/dk-tm4c129x/grlib_demo/grlib_demo_ccs.cmd | 70 + boards/dk-tm4c129x/grlib_demo/images.c | 1131 + boards/dk-tm4c129x/grlib_demo/images.h | 43 + boards/dk-tm4c129x/grlib_demo/readme.txt | 70 + boards/dk-tm4c129x/grlib_demo/rvmdk/grlib_demo.axf | Bin 0 -> 521008 bytes boards/dk-tm4c129x/grlib_demo/rvmdk/grlib_demo.bin | Bin 0 -> 63000 bytes boards/dk-tm4c129x/grlib_demo/startup_ccs.c | 276 + boards/dk-tm4c129x/grlib_demo/startup_ewarm.c | 307 + boards/dk-tm4c129x/grlib_demo/startup_gcc.c | 323 + boards/dk-tm4c129x/grlib_demo/startup_rvmdk.S | 332 + boards/dk-tm4c129x/grlib_driver_test/Makefile | 93 + .../grlib_driver_test/ccs/.ccsimportspec | 11 + .../dk-tm4c129x/grlib_driver_test/ccs/.ccsproject | 10 + boards/dk-tm4c129x/grlib_driver_test/ccs/.cproject | 191 + boards/dk-tm4c129x/grlib_driver_test/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/grlib_driver_test.bin | Bin 0 -> 35328 bytes .../ccs/Debug/grlib_driver_test.out | Bin 0 -> 324736 bytes .../grlib_driver_test/ccs/macros.ini_initial | 1 + .../grlib_driver_test/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/grlib_driver_test/driver_config.h | 137 + .../ewarm/Exe/grlib_driver_test.bin | Bin 0 -> 33060 bytes .../ewarm/Exe/grlib_driver_test.out | Bin 0 -> 329664 bytes .../grlib_driver_test/gcc/grlib_driver_test.axf | Bin 0 -> 107901 bytes .../grlib_driver_test/gcc/grlib_driver_test.bin | Bin 0 -> 34084 bytes .../grlib_driver_test/grlib_driver_test.c | 2544 + .../grlib_driver_test/grlib_driver_test.ewd | 614 + .../grlib_driver_test/grlib_driver_test.ewp | 807 + .../grlib_driver_test/grlib_driver_test.icf | 78 + .../grlib_driver_test/grlib_driver_test.ld | 57 + .../grlib_driver_test/grlib_driver_test.sct | 47 + .../grlib_driver_test/grlib_driver_test.uvopt | 387 + .../grlib_driver_test/grlib_driver_test.uvproj | 459 + .../grlib_driver_test/grlib_driver_test_ccs.cmd | 70 + boards/dk-tm4c129x/grlib_driver_test/images.c | 551 + boards/dk-tm4c129x/grlib_driver_test/images.h | 41 + boards/dk-tm4c129x/grlib_driver_test/readme.txt | 117 + .../grlib_driver_test/rvmdk/grlib_driver_test.axf | Bin 0 -> 243204 bytes .../grlib_driver_test/rvmdk/grlib_driver_test.bin | Bin 0 -> 33644 bytes boards/dk-tm4c129x/grlib_driver_test/startup_ccs.c | 275 + .../dk-tm4c129x/grlib_driver_test/startup_ewarm.c | 306 + boards/dk-tm4c129x/grlib_driver_test/startup_gcc.c | 322 + .../dk-tm4c129x/grlib_driver_test/startup_rvmdk.S | 331 + boards/dk-tm4c129x/hello/Makefile | 89 + boards/dk-tm4c129x/hello/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/hello/ccs/.ccsproject | 10 + boards/dk-tm4c129x/hello/ccs/.cproject | 191 + boards/dk-tm4c129x/hello/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/hello/ccs/Debug/hello.bin | Bin 0 -> 30072 bytes boards/dk-tm4c129x/hello/ccs/Debug/hello.out | Bin 0 -> 200875 bytes boards/dk-tm4c129x/hello/ccs/macros.ini_initial | 1 + boards/dk-tm4c129x/hello/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/hello/ewarm/Exe/hello.bin | Bin 0 -> 27920 bytes boards/dk-tm4c129x/hello/ewarm/Exe/hello.out | Bin 0 -> 176480 bytes boards/dk-tm4c129x/hello/gcc/hello.axf | Bin 0 -> 66022 bytes boards/dk-tm4c129x/hello/gcc/hello.bin | Bin 0 -> 28344 bytes boards/dk-tm4c129x/hello/hello.c | 118 + boards/dk-tm4c129x/hello/hello.ewd | 614 + boards/dk-tm4c129x/hello/hello.ewp | 798 + boards/dk-tm4c129x/hello/hello.icf | 78 + boards/dk-tm4c129x/hello/hello.ld | 57 + boards/dk-tm4c129x/hello/hello.sct | 47 + boards/dk-tm4c129x/hello/hello.uvopt | 345 + boards/dk-tm4c129x/hello/hello.uvproj | 444 + boards/dk-tm4c129x/hello/hello_ccs.cmd | 70 + boards/dk-tm4c129x/hello/readme.txt | 27 + boards/dk-tm4c129x/hello/rvmdk/hello.axf | Bin 0 -> 191452 bytes boards/dk-tm4c129x/hello/rvmdk/hello.bin | Bin 0 -> 28560 bytes boards/dk-tm4c129x/hello/startup_ccs.c | 268 + boards/dk-tm4c129x/hello/startup_ewarm.c | 299 + boards/dk-tm4c129x/hello/startup_gcc.c | 315 + boards/dk-tm4c129x/hello/startup_rvmdk.S | 324 + boards/dk-tm4c129x/hello_widget/Makefile | 91 + boards/dk-tm4c129x/hello_widget/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/hello_widget/ccs/.ccsproject | 10 + boards/dk-tm4c129x/hello_widget/ccs/.cproject | 191 + boards/dk-tm4c129x/hello_widget/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../hello_widget/ccs/Debug/hello_widget.bin | Bin 0 -> 36144 bytes .../hello_widget/ccs/Debug/hello_widget.out | Bin 0 -> 271996 bytes .../hello_widget/ccs/macros.ini_initial | 1 + .../hello_widget/ccs/target_config.ccxml | 13 + .../hello_widget/ewarm/Exe/hello_widget.bin | Bin 0 -> 34044 bytes .../hello_widget/ewarm/Exe/hello_widget.out | Bin 0 -> 254908 bytes .../dk-tm4c129x/hello_widget/gcc/hello_widget.axf | Bin 0 -> 106093 bytes .../dk-tm4c129x/hello_widget/gcc/hello_widget.bin | Bin 0 -> 34628 bytes boards/dk-tm4c129x/hello_widget/hello_widget.c | 258 + boards/dk-tm4c129x/hello_widget/hello_widget.ewd | 614 + boards/dk-tm4c129x/hello_widget/hello_widget.ewp | 801 + boards/dk-tm4c129x/hello_widget/hello_widget.icf | 78 + boards/dk-tm4c129x/hello_widget/hello_widget.ld | 57 + boards/dk-tm4c129x/hello_widget/hello_widget.sct | 47 + boards/dk-tm4c129x/hello_widget/hello_widget.uvopt | 359 + .../dk-tm4c129x/hello_widget/hello_widget.uvproj | 449 + .../dk-tm4c129x/hello_widget/hello_widget_ccs.cmd | 70 + boards/dk-tm4c129x/hello_widget/readme.txt | 26 + .../hello_widget/rvmdk/hello_widget.axf | Bin 0 -> 271912 bytes .../hello_widget/rvmdk/hello_widget.bin | Bin 0 -> 34984 bytes boards/dk-tm4c129x/hello_widget/startup_ccs.c | 275 + boards/dk-tm4c129x/hello_widget/startup_ewarm.c | 306 + boards/dk-tm4c129x/hello_widget/startup_gcc.c | 322 + boards/dk-tm4c129x/hello_widget/startup_rvmdk.S | 331 + boards/dk-tm4c129x/hibernate/Makefile | 94 + boards/dk-tm4c129x/hibernate/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/hibernate/ccs/.ccsproject | 10 + boards/dk-tm4c129x/hibernate/ccs/.cproject | 195 + boards/dk-tm4c129x/hibernate/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c129x/hibernate/ccs/Debug/hibernate.bin | Bin 0 -> 40856 bytes .../dk-tm4c129x/hibernate/ccs/Debug/hibernate.out | Bin 0 -> 381834 bytes .../dk-tm4c129x/hibernate/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/hibernate/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/hibernate/ewarm/Exe/hibernate.bin | Bin 0 -> 36988 bytes .../dk-tm4c129x/hibernate/ewarm/Exe/hibernate.out | Bin 0 -> 360712 bytes boards/dk-tm4c129x/hibernate/gcc/hibernate.axf | Bin 0 -> 113666 bytes boards/dk-tm4c129x/hibernate/gcc/hibernate.bin | Bin 0 -> 40360 bytes boards/dk-tm4c129x/hibernate/hibernate.c | 1568 + boards/dk-tm4c129x/hibernate/hibernate.ewd | 614 + boards/dk-tm4c129x/hibernate/hibernate.ewp | 810 + boards/dk-tm4c129x/hibernate/hibernate.icf | 78 + boards/dk-tm4c129x/hibernate/hibernate.ld | 57 + boards/dk-tm4c129x/hibernate/hibernate.sct | 47 + boards/dk-tm4c129x/hibernate/hibernate.uvopt | 387 + boards/dk-tm4c129x/hibernate/hibernate.uvproj | 459 + boards/dk-tm4c129x/hibernate/hibernate_ccs.cmd | 70 + boards/dk-tm4c129x/hibernate/readme.txt | 37 + boards/dk-tm4c129x/hibernate/rvmdk/hibernate.axf | Bin 0 -> 312416 bytes boards/dk-tm4c129x/hibernate/rvmdk/hibernate.bin | Bin 0 -> 38408 bytes boards/dk-tm4c129x/hibernate/startup_ccs.c | 275 + boards/dk-tm4c129x/hibernate/startup_ewarm.c | 306 + boards/dk-tm4c129x/hibernate/startup_gcc.c | 322 + boards/dk-tm4c129x/hibernate/startup_rvmdk.S | 331 + boards/dk-tm4c129x/interrupts/Makefile | 89 + boards/dk-tm4c129x/interrupts/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/interrupts/ccs/.ccsproject | 10 + boards/dk-tm4c129x/interrupts/ccs/.cproject | 191 + boards/dk-tm4c129x/interrupts/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../interrupts/ccs/Debug/interrupts.bin | Bin 0 -> 29320 bytes .../interrupts/ccs/Debug/interrupts.out | Bin 0 -> 212413 bytes .../dk-tm4c129x/interrupts/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/interrupts/ccs/target_config.ccxml | 13 + .../interrupts/ewarm/Exe/interrupts.bin | Bin 0 -> 26884 bytes .../interrupts/ewarm/Exe/interrupts.out | Bin 0 -> 202892 bytes boards/dk-tm4c129x/interrupts/gcc/interrupts.axf | Bin 0 -> 65962 bytes boards/dk-tm4c129x/interrupts/gcc/interrupts.bin | Bin 0 -> 27684 bytes boards/dk-tm4c129x/interrupts/interrupts.c | 593 + boards/dk-tm4c129x/interrupts/interrupts.ewd | 614 + boards/dk-tm4c129x/interrupts/interrupts.ewp | 798 + boards/dk-tm4c129x/interrupts/interrupts.icf | 78 + boards/dk-tm4c129x/interrupts/interrupts.ld | 57 + boards/dk-tm4c129x/interrupts/interrupts.sct | 47 + boards/dk-tm4c129x/interrupts/interrupts.uvopt | 345 + boards/dk-tm4c129x/interrupts/interrupts.uvproj | 444 + boards/dk-tm4c129x/interrupts/interrupts_ccs.cmd | 70 + boards/dk-tm4c129x/interrupts/readme.txt | 34 + boards/dk-tm4c129x/interrupts/rvmdk/interrupts.axf | Bin 0 -> 195528 bytes boards/dk-tm4c129x/interrupts/rvmdk/interrupts.bin | Bin 0 -> 27800 bytes boards/dk-tm4c129x/interrupts/startup_ccs.c | 277 + boards/dk-tm4c129x/interrupts/startup_ewarm.c | 308 + boards/dk-tm4c129x/interrupts/startup_gcc.c | 324 + boards/dk-tm4c129x/interrupts/startup_rvmdk.S | 333 + boards/dk-tm4c129x/lang_demo/Makefile | 102 + boards/dk-tm4c129x/lang_demo/ccs/.ccsimportspec | 10 + boards/dk-tm4c129x/lang_demo/ccs/.ccsproject | 10 + boards/dk-tm4c129x/lang_demo/ccs/.cproject | 195 + boards/dk-tm4c129x/lang_demo/ccs/.project | 110 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c129x/lang_demo/ccs/Debug/lang_demo.bin | Bin 0 -> 61872 bytes .../dk-tm4c129x/lang_demo/ccs/Debug/lang_demo.out | Bin 0 -> 363276 bytes .../dk-tm4c129x/lang_demo/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/lang_demo/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/lang_demo/ewarm/Exe/lang_demo.bin | Bin 0 -> 59320 bytes .../dk-tm4c129x/lang_demo/ewarm/Exe/lang_demo.out | Bin 0 -> 353828 bytes boards/dk-tm4c129x/lang_demo/gcc/lang_demo.axf | Bin 0 -> 109268 bytes boards/dk-tm4c129x/lang_demo/gcc/lang_demo.bin | Bin 0 -> 60400 bytes boards/dk-tm4c129x/lang_demo/images.c | 170 + boards/dk-tm4c129x/lang_demo/images.h | 36 + boards/dk-tm4c129x/lang_demo/lang_demo.c | 852 + boards/dk-tm4c129x/lang_demo/lang_demo.ewd | 614 + boards/dk-tm4c129x/lang_demo/lang_demo.ewp | 829 + boards/dk-tm4c129x/lang_demo/lang_demo.icf | 78 + boards/dk-tm4c129x/lang_demo/lang_demo.ld | 57 + boards/dk-tm4c129x/lang_demo/lang_demo.sct | 47 + boards/dk-tm4c129x/lang_demo/lang_demo.uvopt | 471 + boards/dk-tm4c129x/lang_demo/lang_demo.uvproj | 489 + boards/dk-tm4c129x/lang_demo/lang_demo_ccs.cmd | 70 + boards/dk-tm4c129x/lang_demo/readme.txt | 56 + boards/dk-tm4c129x/lang_demo/rvmdk/lang_demo.axf | Bin 0 -> 312096 bytes boards/dk-tm4c129x/lang_demo/rvmdk/lang_demo.bin | Bin 0 -> 60528 bytes boards/dk-tm4c129x/lang_demo/startup_ccs.c | 275 + boards/dk-tm4c129x/lang_demo/startup_ewarm.c | 306 + boards/dk-tm4c129x/lang_demo/startup_gcc.c | 322 + boards/dk-tm4c129x/lang_demo/startup_rvmdk.S | 331 + boards/dk-tm4c129x/mpu_fault/Makefile | 89 + boards/dk-tm4c129x/mpu_fault/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/mpu_fault/ccs/.ccsproject | 10 + boards/dk-tm4c129x/mpu_fault/ccs/.cproject | 191 + boards/dk-tm4c129x/mpu_fault/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c129x/mpu_fault/ccs/Debug/mpu_fault.bin | Bin 0 -> 28376 bytes .../dk-tm4c129x/mpu_fault/ccs/Debug/mpu_fault.out | Bin 0 -> 204918 bytes .../dk-tm4c129x/mpu_fault/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/mpu_fault/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/mpu_fault/ewarm/Exe/mpu_fault.bin | Bin 0 -> 26192 bytes .../dk-tm4c129x/mpu_fault/ewarm/Exe/mpu_fault.out | Bin 0 -> 184044 bytes boards/dk-tm4c129x/mpu_fault/gcc/mpu_fault.axf | Bin 0 -> 64885 bytes boards/dk-tm4c129x/mpu_fault/gcc/mpu_fault.bin | Bin 0 -> 26800 bytes boards/dk-tm4c129x/mpu_fault/mpu_fault.c | 504 + boards/dk-tm4c129x/mpu_fault/mpu_fault.ewd | 614 + boards/dk-tm4c129x/mpu_fault/mpu_fault.ewp | 798 + boards/dk-tm4c129x/mpu_fault/mpu_fault.icf | 78 + boards/dk-tm4c129x/mpu_fault/mpu_fault.ld | 57 + boards/dk-tm4c129x/mpu_fault/mpu_fault.sct | 47 + boards/dk-tm4c129x/mpu_fault/mpu_fault.uvopt | 345 + boards/dk-tm4c129x/mpu_fault/mpu_fault.uvproj | 444 + boards/dk-tm4c129x/mpu_fault/mpu_fault_ccs.cmd | 70 + boards/dk-tm4c129x/mpu_fault/readme.txt | 26 + boards/dk-tm4c129x/mpu_fault/rvmdk/mpu_fault.axf | Bin 0 -> 191980 bytes boards/dk-tm4c129x/mpu_fault/rvmdk/mpu_fault.bin | Bin 0 -> 26788 bytes boards/dk-tm4c129x/mpu_fault/startup_ccs.c | 275 + boards/dk-tm4c129x/mpu_fault/startup_ewarm.c | 306 + boards/dk-tm4c129x/mpu_fault/startup_gcc.c | 322 + boards/dk-tm4c129x/mpu_fault/startup_rvmdk.S | 331 + boards/dk-tm4c129x/qs_weather/Makefile | 106 + boards/dk-tm4c129x/qs_weather/ccs/.ccsimportspec | 16 + boards/dk-tm4c129x/qs_weather/ccs/.ccsproject | 10 + boards/dk-tm4c129x/qs_weather/ccs/.cproject | 205 + boards/dk-tm4c129x/qs_weather/ccs/.project | 110 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../qs_weather/ccs/Debug/qs_weather.bin | Bin 0 -> 155448 bytes .../qs_weather/ccs/Debug/qs_weather.out | Bin 0 -> 1042929 bytes .../dk-tm4c129x/qs_weather/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/qs_weather/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/qs_weather/debug.h | 38 + boards/dk-tm4c129x/qs_weather/eth_client.c | 1309 + boards/dk-tm4c129x/qs_weather/eth_client.h | 163 + .../qs_weather/ewarm/Exe/qs_weather.bin | Bin 0 -> 148420 bytes .../qs_weather/ewarm/Exe/qs_weather.out | Bin 0 -> 916700 bytes boards/dk-tm4c129x/qs_weather/gcc/qs_weather.axf | Bin 0 -> 235946 bytes boards/dk-tm4c129x/qs_weather/gcc/qs_weather.bin | Bin 0 -> 155872 bytes boards/dk-tm4c129x/qs_weather/images.c | 7176 +++ boards/dk-tm4c129x/qs_weather/images.h | 42 + boards/dk-tm4c129x/qs_weather/json.c | 843 + boards/dk-tm4c129x/qs_weather/json.h | 41 + boards/dk-tm4c129x/qs_weather/lwipopts.h | 444 + boards/dk-tm4c129x/qs_weather/qs_weather.c | 2896 ++ boards/dk-tm4c129x/qs_weather/qs_weather.ewd | 614 + boards/dk-tm4c129x/qs_weather/qs_weather.ewp | 838 + boards/dk-tm4c129x/qs_weather/qs_weather.icf | 78 + boards/dk-tm4c129x/qs_weather/qs_weather.ld | 57 + boards/dk-tm4c129x/qs_weather/qs_weather.sct | 47 + boards/dk-tm4c129x/qs_weather/qs_weather.uvopt | 471 + boards/dk-tm4c129x/qs_weather/qs_weather.uvproj | 489 + boards/dk-tm4c129x/qs_weather/qs_weather_ccs.cmd | 70 + boards/dk-tm4c129x/qs_weather/readme.txt | 43 + boards/dk-tm4c129x/qs_weather/rvmdk/qs_weather.axf | Bin 0 -> 829760 bytes boards/dk-tm4c129x/qs_weather/rvmdk/qs_weather.bin | Bin 0 -> 150744 bytes boards/dk-tm4c129x/qs_weather/startup_ccs.c | 277 + boards/dk-tm4c129x/qs_weather/startup_ewarm.c | 308 + boards/dk-tm4c129x/qs_weather/startup_gcc.c | 324 + boards/dk-tm4c129x/qs_weather/startup_rvmdk.S | 333 + boards/dk-tm4c129x/scribble/Makefile | 93 + boards/dk-tm4c129x/scribble/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/scribble/ccs/.ccsproject | 10 + boards/dk-tm4c129x/scribble/ccs/.cproject | 191 + boards/dk-tm4c129x/scribble/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/scribble/ccs/Debug/scribble.bin | Bin 0 -> 29880 bytes boards/dk-tm4c129x/scribble/ccs/Debug/scribble.out | Bin 0 -> 248956 bytes boards/dk-tm4c129x/scribble/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/scribble/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/scribble/ewarm/Exe/scribble.bin | Bin 0 -> 27740 bytes boards/dk-tm4c129x/scribble/ewarm/Exe/scribble.out | Bin 0 -> 224260 bytes boards/dk-tm4c129x/scribble/gcc/scribble.axf | Bin 0 -> 72669 bytes boards/dk-tm4c129x/scribble/gcc/scribble.bin | Bin 0 -> 28270 bytes boards/dk-tm4c129x/scribble/readme.txt | 28 + boards/dk-tm4c129x/scribble/rvmdk/scribble.axf | Bin 0 -> 212184 bytes boards/dk-tm4c129x/scribble/rvmdk/scribble.bin | Bin 0 -> 28436 bytes boards/dk-tm4c129x/scribble/scribble.c | 399 + boards/dk-tm4c129x/scribble/scribble.ewd | 614 + boards/dk-tm4c129x/scribble/scribble.ewp | 807 + boards/dk-tm4c129x/scribble/scribble.icf | 78 + boards/dk-tm4c129x/scribble/scribble.ld | 57 + boards/dk-tm4c129x/scribble/scribble.sct | 47 + boards/dk-tm4c129x/scribble/scribble.uvopt | 387 + boards/dk-tm4c129x/scribble/scribble.uvproj | 459 + boards/dk-tm4c129x/scribble/scribble_ccs.cmd | 70 + boards/dk-tm4c129x/scribble/startup_ccs.c | 275 + boards/dk-tm4c129x/scribble/startup_ewarm.c | 306 + boards/dk-tm4c129x/scribble/startup_gcc.c | 322 + boards/dk-tm4c129x/scribble/startup_rvmdk.S | 331 + boards/dk-tm4c129x/sd_card/Makefile | 101 + boards/dk-tm4c129x/sd_card/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/sd_card/ccs/.ccsproject | 10 + boards/dk-tm4c129x/sd_card/ccs/.cproject | 188 + boards/dk-tm4c129x/sd_card/ccs/.project | 100 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/sd_card/ccs/Debug/sd_card.bin | Bin 0 -> 78656 bytes boards/dk-tm4c129x/sd_card/ccs/Debug/sd_card.out | Bin 0 -> 543690 bytes boards/dk-tm4c129x/sd_card/ccs/macros.ini_initial | 1 + boards/dk-tm4c129x/sd_card/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/sd_card/ewarm/Exe/sd_card.bin | Bin 0 -> 75968 bytes boards/dk-tm4c129x/sd_card/ewarm/Exe/sd_card.out | Bin 0 -> 489660 bytes boards/dk-tm4c129x/sd_card/gcc/sd_card.axf | Bin 0 -> 147246 bytes boards/dk-tm4c129x/sd_card/gcc/sd_card.bin | Bin 0 -> 78236 bytes boards/dk-tm4c129x/sd_card/readme.txt | 35 + boards/dk-tm4c129x/sd_card/rvmdk/sd_card.axf | Bin 0 -> 431996 bytes boards/dk-tm4c129x/sd_card/rvmdk/sd_card.bin | Bin 0 -> 76240 bytes boards/dk-tm4c129x/sd_card/sd_card.c | 1579 + boards/dk-tm4c129x/sd_card/sd_card.ewd | 614 + boards/dk-tm4c129x/sd_card/sd_card.ewp | 823 + boards/dk-tm4c129x/sd_card/sd_card.icf | 78 + boards/dk-tm4c129x/sd_card/sd_card.ld | 57 + boards/dk-tm4c129x/sd_card/sd_card.sct | 47 + boards/dk-tm4c129x/sd_card/sd_card.uvopt | 443 + boards/dk-tm4c129x/sd_card/sd_card.uvproj | 479 + boards/dk-tm4c129x/sd_card/sd_card_ccs.cmd | 70 + boards/dk-tm4c129x/sd_card/startup_ccs.c | 277 + boards/dk-tm4c129x/sd_card/startup_ewarm.c | 308 + boards/dk-tm4c129x/sd_card/startup_gcc.c | 324 + boards/dk-tm4c129x/sd_card/startup_rvmdk.S | 333 + boards/dk-tm4c129x/sha1_hash/Makefile | 91 + boards/dk-tm4c129x/sha1_hash/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/sha1_hash/ccs/.ccsproject | 10 + boards/dk-tm4c129x/sha1_hash/ccs/.cproject | 182 + boards/dk-tm4c129x/sha1_hash/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c129x/sha1_hash/ccs/Debug/sha1_hash.bin | Bin 0 -> 31888 bytes .../dk-tm4c129x/sha1_hash/ccs/Debug/sha1_hash.out | Bin 0 -> 238054 bytes .../dk-tm4c129x/sha1_hash/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/sha1_hash/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/sha1_hash/ewarm/Exe/sha1_hash.bin | Bin 0 -> 29448 bytes .../dk-tm4c129x/sha1_hash/ewarm/Exe/sha1_hash.out | Bin 0 -> 207584 bytes boards/dk-tm4c129x/sha1_hash/gcc/sha1_hash.axf | Bin 0 -> 72738 bytes boards/dk-tm4c129x/sha1_hash/gcc/sha1_hash.bin | Bin 0 -> 30040 bytes boards/dk-tm4c129x/sha1_hash/readme.txt | 26 + boards/dk-tm4c129x/sha1_hash/rvmdk/sha1_hash.axf | Bin 0 -> 217912 bytes boards/dk-tm4c129x/sha1_hash/rvmdk/sha1_hash.bin | Bin 0 -> 30128 bytes boards/dk-tm4c129x/sha1_hash/sha1_hash.c | 670 + boards/dk-tm4c129x/sha1_hash/sha1_hash.ewd | 614 + boards/dk-tm4c129x/sha1_hash/sha1_hash.ewp | 801 + boards/dk-tm4c129x/sha1_hash/sha1_hash.icf | 78 + boards/dk-tm4c129x/sha1_hash/sha1_hash.ld | 57 + boards/dk-tm4c129x/sha1_hash/sha1_hash.sct | 47 + boards/dk-tm4c129x/sha1_hash/sha1_hash.uvopt | 359 + boards/dk-tm4c129x/sha1_hash/sha1_hash.uvproj | 449 + boards/dk-tm4c129x/sha1_hash/sha1_hash_ccs.cmd | 70 + boards/dk-tm4c129x/sha1_hash/startup_ccs.c | 275 + boards/dk-tm4c129x/sha1_hash/startup_ewarm.c | 306 + boards/dk-tm4c129x/sha1_hash/startup_gcc.c | 322 + boards/dk-tm4c129x/sha1_hash/startup_rvmdk.S | 331 + boards/dk-tm4c129x/sha1_hmac/Makefile | 91 + boards/dk-tm4c129x/sha1_hmac/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/sha1_hmac/ccs/.ccsproject | 10 + boards/dk-tm4c129x/sha1_hmac/ccs/.cproject | 182 + boards/dk-tm4c129x/sha1_hmac/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c129x/sha1_hmac/ccs/Debug/sha1_hmac.bin | Bin 0 -> 32192 bytes .../dk-tm4c129x/sha1_hmac/ccs/Debug/sha1_hmac.out | Bin 0 -> 239750 bytes .../dk-tm4c129x/sha1_hmac/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/sha1_hmac/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/sha1_hmac/ewarm/Exe/sha1_hmac.bin | Bin 0 -> 29728 bytes .../dk-tm4c129x/sha1_hmac/ewarm/Exe/sha1_hmac.out | Bin 0 -> 210392 bytes boards/dk-tm4c129x/sha1_hmac/gcc/sha1_hmac.axf | Bin 0 -> 72885 bytes boards/dk-tm4c129x/sha1_hmac/gcc/sha1_hmac.bin | Bin 0 -> 30336 bytes boards/dk-tm4c129x/sha1_hmac/readme.txt | 23 + boards/dk-tm4c129x/sha1_hmac/rvmdk/sha1_hmac.axf | Bin 0 -> 218572 bytes boards/dk-tm4c129x/sha1_hmac/rvmdk/sha1_hmac.bin | Bin 0 -> 30464 bytes boards/dk-tm4c129x/sha1_hmac/sha1_hmac.c | 733 + boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ewd | 614 + boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ewp | 801 + boards/dk-tm4c129x/sha1_hmac/sha1_hmac.icf | 78 + boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ld | 57 + boards/dk-tm4c129x/sha1_hmac/sha1_hmac.sct | 47 + boards/dk-tm4c129x/sha1_hmac/sha1_hmac.uvopt | 359 + boards/dk-tm4c129x/sha1_hmac/sha1_hmac.uvproj | 449 + boards/dk-tm4c129x/sha1_hmac/sha1_hmac_ccs.cmd | 70 + boards/dk-tm4c129x/sha1_hmac/startup_ccs.c | 275 + boards/dk-tm4c129x/sha1_hmac/startup_ewarm.c | 306 + boards/dk-tm4c129x/sha1_hmac/startup_gcc.c | 322 + boards/dk-tm4c129x/sha1_hmac/startup_rvmdk.S | 331 + boards/dk-tm4c129x/synth/Makefile | 93 + boards/dk-tm4c129x/synth/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/synth/ccs/.ccsproject | 10 + boards/dk-tm4c129x/synth/ccs/.cproject | 182 + boards/dk-tm4c129x/synth/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/synth/ccs/Debug/synth.bin | Bin 0 -> 29568 bytes boards/dk-tm4c129x/synth/ccs/Debug/synth.out | Bin 0 -> 251640 bytes boards/dk-tm4c129x/synth/ccs/macros.ini_initial | 1 + boards/dk-tm4c129x/synth/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/synth/ewarm/Exe/synth.bin | Bin 0 -> 27372 bytes boards/dk-tm4c129x/synth/ewarm/Exe/synth.out | Bin 0 -> 235708 bytes boards/dk-tm4c129x/synth/gcc/synth.axf | Bin 0 -> 72720 bytes boards/dk-tm4c129x/synth/gcc/synth.bin | Bin 0 -> 27990 bytes boards/dk-tm4c129x/synth/readme.txt | 25 + boards/dk-tm4c129x/synth/rvmdk/synth.axf | Bin 0 -> 188412 bytes boards/dk-tm4c129x/synth/rvmdk/synth.bin | Bin 0 -> 28140 bytes boards/dk-tm4c129x/synth/startup_ccs.c | 276 + boards/dk-tm4c129x/synth/startup_ewarm.c | 307 + boards/dk-tm4c129x/synth/startup_gcc.c | 323 + boards/dk-tm4c129x/synth/startup_rvmdk.S | 332 + boards/dk-tm4c129x/synth/synth.c | 1438 + boards/dk-tm4c129x/synth/synth.ewd | 614 + boards/dk-tm4c129x/synth/synth.ewp | 807 + boards/dk-tm4c129x/synth/synth.icf | 78 + boards/dk-tm4c129x/synth/synth.ld | 57 + boards/dk-tm4c129x/synth/synth.sct | 47 + boards/dk-tm4c129x/synth/synth.uvopt | 387 + boards/dk-tm4c129x/synth/synth.uvproj | 459 + boards/dk-tm4c129x/synth/synth_ccs.cmd | 70 + boards/dk-tm4c129x/tamper/Makefile | 92 + boards/dk-tm4c129x/tamper/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/tamper/ccs/.ccsproject | 10 + boards/dk-tm4c129x/tamper/ccs/.cproject | 182 + boards/dk-tm4c129x/tamper/ccs/.project | 75 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/tamper/ccs/Debug/tamper.bin | Bin 0 -> 46656 bytes boards/dk-tm4c129x/tamper/ccs/Debug/tamper.out | Bin 0 -> 423563 bytes boards/dk-tm4c129x/tamper/ccs/macros.ini_initial | 1 + boards/dk-tm4c129x/tamper/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/tamper/ewarm/Exe/tamper.bin | Bin 0 -> 42512 bytes boards/dk-tm4c129x/tamper/ewarm/Exe/tamper.out | Bin 0 -> 399472 bytes boards/dk-tm4c129x/tamper/gcc/tamper.axf | Bin 0 -> 115519 bytes boards/dk-tm4c129x/tamper/gcc/tamper.bin | Bin 0 -> 46356 bytes boards/dk-tm4c129x/tamper/readme.txt | 46 + boards/dk-tm4c129x/tamper/rvmdk/tamper.axf | Bin 0 -> 390392 bytes boards/dk-tm4c129x/tamper/rvmdk/tamper.bin | Bin 0 -> 44444 bytes boards/dk-tm4c129x/tamper/startup_ccs.c | 258 + boards/dk-tm4c129x/tamper/startup_ewarm.c | 289 + boards/dk-tm4c129x/tamper/startup_gcc.c | 305 + boards/dk-tm4c129x/tamper/startup_rvmdk.S | 323 + boards/dk-tm4c129x/tamper/tamper.c | 2052 + boards/dk-tm4c129x/tamper/tamper.ewd | 614 + boards/dk-tm4c129x/tamper/tamper.ewp | 804 + boards/dk-tm4c129x/tamper/tamper.icf | 78 + boards/dk-tm4c129x/tamper/tamper.ld | 57 + boards/dk-tm4c129x/tamper/tamper.sct | 47 + boards/dk-tm4c129x/tamper/tamper.uvopt | 373 + boards/dk-tm4c129x/tamper/tamper.uvproj | 454 + boards/dk-tm4c129x/tamper/tamper_ccs.cmd | 70 + boards/dk-tm4c129x/tdes_cbc_decrypt/Makefile | 91 + .../tdes_cbc_decrypt/ccs/.ccsimportspec | 8 + .../dk-tm4c129x/tdes_cbc_decrypt/ccs/.ccsproject | 10 + boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.cproject | 182 + boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/tdes_cbc_decrypt.bin | Bin 0 -> 30944 bytes .../ccs/Debug/tdes_cbc_decrypt.out | Bin 0 -> 237780 bytes .../tdes_cbc_decrypt/ccs/macros.ini_initial | 1 + .../tdes_cbc_decrypt/ccs/target_config.ccxml | 13 + .../ewarm/Exe/tdes_cbc_decrypt.bin | Bin 0 -> 28552 bytes .../ewarm/Exe/tdes_cbc_decrypt.out | Bin 0 -> 209308 bytes .../tdes_cbc_decrypt/gcc/tdes_cbc_decrypt.axf | Bin 0 -> 71950 bytes .../tdes_cbc_decrypt/gcc/tdes_cbc_decrypt.bin | Bin 0 -> 29100 bytes boards/dk-tm4c129x/tdes_cbc_decrypt/readme.txt | 31 + .../tdes_cbc_decrypt/rvmdk/tdes_cbc_decrypt.axf | Bin 0 -> 217528 bytes .../tdes_cbc_decrypt/rvmdk/tdes_cbc_decrypt.bin | Bin 0 -> 29096 bytes boards/dk-tm4c129x/tdes_cbc_decrypt/startup_ccs.c | 275 + .../dk-tm4c129x/tdes_cbc_decrypt/startup_ewarm.c | 306 + boards/dk-tm4c129x/tdes_cbc_decrypt/startup_gcc.c | 322 + .../dk-tm4c129x/tdes_cbc_decrypt/startup_rvmdk.S | 331 + .../tdes_cbc_decrypt/tdes_cbc_decrypt.c | 657 + .../tdes_cbc_decrypt/tdes_cbc_decrypt.ewd | 614 + .../tdes_cbc_decrypt/tdes_cbc_decrypt.ewp | 801 + .../tdes_cbc_decrypt/tdes_cbc_decrypt.icf | 78 + .../tdes_cbc_decrypt/tdes_cbc_decrypt.ld | 57 + .../tdes_cbc_decrypt/tdes_cbc_decrypt.sct | 47 + .../tdes_cbc_decrypt/tdes_cbc_decrypt.uvopt | 359 + .../tdes_cbc_decrypt/tdes_cbc_decrypt.uvproj | 449 + .../tdes_cbc_decrypt/tdes_cbc_decrypt_ccs.cmd | 70 + boards/dk-tm4c129x/tdes_cbc_encrypt/Makefile | 91 + .../tdes_cbc_encrypt/ccs/.ccsimportspec | 8 + .../dk-tm4c129x/tdes_cbc_encrypt/ccs/.ccsproject | 10 + boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.cproject | 182 + boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/tdes_cbc_encrypt.bin | Bin 0 -> 30944 bytes .../ccs/Debug/tdes_cbc_encrypt.out | Bin 0 -> 237780 bytes .../tdes_cbc_encrypt/ccs/macros.ini_initial | 1 + .../tdes_cbc_encrypt/ccs/target_config.ccxml | 13 + .../ewarm/Exe/tdes_cbc_encrypt.bin | Bin 0 -> 28556 bytes .../ewarm/Exe/tdes_cbc_encrypt.out | Bin 0 -> 209372 bytes .../tdes_cbc_encrypt/gcc/tdes_cbc_encrypt.axf | Bin 0 -> 71950 bytes .../tdes_cbc_encrypt/gcc/tdes_cbc_encrypt.bin | Bin 0 -> 29100 bytes boards/dk-tm4c129x/tdes_cbc_encrypt/readme.txt | 31 + .../tdes_cbc_encrypt/rvmdk/tdes_cbc_encrypt.axf | Bin 0 -> 217528 bytes .../tdes_cbc_encrypt/rvmdk/tdes_cbc_encrypt.bin | Bin 0 -> 29096 bytes boards/dk-tm4c129x/tdes_cbc_encrypt/startup_ccs.c | 275 + .../dk-tm4c129x/tdes_cbc_encrypt/startup_ewarm.c | 306 + boards/dk-tm4c129x/tdes_cbc_encrypt/startup_gcc.c | 322 + .../dk-tm4c129x/tdes_cbc_encrypt/startup_rvmdk.S | 331 + .../tdes_cbc_encrypt/tdes_cbc_encrypt.c | 657 + .../tdes_cbc_encrypt/tdes_cbc_encrypt.ewd | 614 + .../tdes_cbc_encrypt/tdes_cbc_encrypt.ewp | 801 + .../tdes_cbc_encrypt/tdes_cbc_encrypt.icf | 78 + .../tdes_cbc_encrypt/tdes_cbc_encrypt.ld | 57 + .../tdes_cbc_encrypt/tdes_cbc_encrypt.sct | 47 + .../tdes_cbc_encrypt/tdes_cbc_encrypt.uvopt | 359 + .../tdes_cbc_encrypt/tdes_cbc_encrypt.uvproj | 449 + .../tdes_cbc_encrypt/tdes_cbc_encrypt_ccs.cmd | 70 + boards/dk-tm4c129x/timers/Makefile | 89 + boards/dk-tm4c129x/timers/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/timers/ccs/.ccsproject | 10 + boards/dk-tm4c129x/timers/ccs/.cproject | 182 + boards/dk-tm4c129x/timers/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/timers/ccs/Debug/timers.bin | Bin 0 -> 25352 bytes boards/dk-tm4c129x/timers/ccs/Debug/timers.out | Bin 0 -> 197286 bytes boards/dk-tm4c129x/timers/ccs/macros.ini_initial | 1 + boards/dk-tm4c129x/timers/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/timers/ewarm/Exe/timers.bin | Bin 0 -> 23164 bytes boards/dk-tm4c129x/timers/ewarm/Exe/timers.out | Bin 0 -> 174548 bytes boards/dk-tm4c129x/timers/gcc/timers.axf | Bin 0 -> 61466 bytes boards/dk-tm4c129x/timers/gcc/timers.bin | Bin 0 -> 23688 bytes boards/dk-tm4c129x/timers/readme.txt | 26 + boards/dk-tm4c129x/timers/rvmdk/timers.axf | Bin 0 -> 161692 bytes boards/dk-tm4c129x/timers/rvmdk/timers.bin | Bin 0 -> 23852 bytes boards/dk-tm4c129x/timers/startup_ccs.c | 276 + boards/dk-tm4c129x/timers/startup_ewarm.c | 307 + boards/dk-tm4c129x/timers/startup_gcc.c | 323 + boards/dk-tm4c129x/timers/startup_rvmdk.S | 332 + boards/dk-tm4c129x/timers/timers.c | 216 + boards/dk-tm4c129x/timers/timers.ewd | 614 + boards/dk-tm4c129x/timers/timers.ewp | 798 + boards/dk-tm4c129x/timers/timers.icf | 78 + boards/dk-tm4c129x/timers/timers.ld | 57 + boards/dk-tm4c129x/timers/timers.sct | 47 + boards/dk-tm4c129x/timers/timers.uvopt | 345 + boards/dk-tm4c129x/timers/timers.uvproj | 444 + boards/dk-tm4c129x/timers/timers_ccs.cmd | 70 + boards/dk-tm4c129x/uart_echo/Makefile | 89 + boards/dk-tm4c129x/uart_echo/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/uart_echo/ccs/.ccsproject | 10 + boards/dk-tm4c129x/uart_echo/ccs/.cproject | 182 + boards/dk-tm4c129x/uart_echo/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c129x/uart_echo/ccs/Debug/uart_echo.bin | Bin 0 -> 25448 bytes .../dk-tm4c129x/uart_echo/ccs/Debug/uart_echo.out | Bin 0 -> 203028 bytes .../dk-tm4c129x/uart_echo/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/uart_echo/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/uart_echo/ewarm/Exe/uart_echo.bin | Bin 0 -> 23284 bytes .../dk-tm4c129x/uart_echo/ewarm/Exe/uart_echo.out | Bin 0 -> 184500 bytes boards/dk-tm4c129x/uart_echo/gcc/uart_echo.axf | Bin 0 -> 61653 bytes boards/dk-tm4c129x/uart_echo/gcc/uart_echo.bin | Bin 0 -> 23752 bytes boards/dk-tm4c129x/uart_echo/readme.txt | 26 + boards/dk-tm4c129x/uart_echo/rvmdk/uart_echo.axf | Bin 0 -> 163968 bytes boards/dk-tm4c129x/uart_echo/rvmdk/uart_echo.bin | Bin 0 -> 23936 bytes boards/dk-tm4c129x/uart_echo/startup_ccs.c | 275 + boards/dk-tm4c129x/uart_echo/startup_ewarm.c | 306 + boards/dk-tm4c129x/uart_echo/startup_gcc.c | 322 + boards/dk-tm4c129x/uart_echo/startup_rvmdk.S | 331 + boards/dk-tm4c129x/uart_echo/uart_echo.c | 207 + boards/dk-tm4c129x/uart_echo/uart_echo.ewd | 614 + boards/dk-tm4c129x/uart_echo/uart_echo.ewp | 798 + boards/dk-tm4c129x/uart_echo/uart_echo.icf | 78 + boards/dk-tm4c129x/uart_echo/uart_echo.ld | 57 + boards/dk-tm4c129x/uart_echo/uart_echo.sct | 47 + boards/dk-tm4c129x/uart_echo/uart_echo.uvopt | 345 + boards/dk-tm4c129x/uart_echo/uart_echo.uvproj | 444 + boards/dk-tm4c129x/uart_echo/uart_echo_ccs.cmd | 70 + boards/dk-tm4c129x/udma_demo/Makefile | 92 + boards/dk-tm4c129x/udma_demo/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/udma_demo/ccs/.ccsproject | 10 + boards/dk-tm4c129x/udma_demo/ccs/.cproject | 182 + boards/dk-tm4c129x/udma_demo/ccs/.project | 75 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../dk-tm4c129x/udma_demo/ccs/Debug/udma_demo.bin | Bin 0 -> 29592 bytes .../dk-tm4c129x/udma_demo/ccs/Debug/udma_demo.out | Bin 0 -> 237618 bytes .../dk-tm4c129x/udma_demo/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/udma_demo/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/udma_demo/ewarm/Exe/udma_demo.bin | Bin 0 -> 27048 bytes .../dk-tm4c129x/udma_demo/ewarm/Exe/udma_demo.out | Bin 0 -> 213484 bytes boards/dk-tm4c129x/udma_demo/gcc/udma_demo.axf | Bin 0 -> 67580 bytes boards/dk-tm4c129x/udma_demo/gcc/udma_demo.bin | Bin 0 -> 27904 bytes boards/dk-tm4c129x/udma_demo/readme.txt | 25 + boards/dk-tm4c129x/udma_demo/rvmdk/udma_demo.axf | Bin 0 -> 204424 bytes boards/dk-tm4c129x/udma_demo/rvmdk/udma_demo.bin | Bin 0 -> 27984 bytes boards/dk-tm4c129x/udma_demo/startup_ccs.c | 278 + boards/dk-tm4c129x/udma_demo/startup_ewarm.c | 309 + boards/dk-tm4c129x/udma_demo/startup_gcc.c | 325 + boards/dk-tm4c129x/udma_demo/startup_rvmdk.S | 334 + boards/dk-tm4c129x/udma_demo/udma_demo.c | 924 + boards/dk-tm4c129x/udma_demo/udma_demo.ewd | 614 + boards/dk-tm4c129x/udma_demo/udma_demo.ewp | 804 + boards/dk-tm4c129x/udma_demo/udma_demo.icf | 78 + boards/dk-tm4c129x/udma_demo/udma_demo.ld | 57 + boards/dk-tm4c129x/udma_demo/udma_demo.sct | 47 + boards/dk-tm4c129x/udma_demo/udma_demo.uvopt | 373 + boards/dk-tm4c129x/udma_demo/udma_demo.uvproj | 454 + boards/dk-tm4c129x/udma_demo/udma_demo_ccs.cmd | 70 + boards/dk-tm4c129x/usb_dev_bulk/Makefile | 94 + boards/dk-tm4c129x/usb_dev_bulk/ccs/.ccsimportspec | 10 + boards/dk-tm4c129x/usb_dev_bulk/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_dev_bulk/ccs/.cproject | 186 + boards/dk-tm4c129x/usb_dev_bulk/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin | Bin 0 -> 37952 bytes .../usb_dev_bulk/ccs/Debug/usb_dev_bulk.out | Bin 0 -> 595180 bytes .../usb_dev_bulk/ccs/macros.ini_initial | 1 + .../usb_dev_bulk/ccs/target_config.ccxml | 13 + .../usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin | Bin 0 -> 35132 bytes .../usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out | Bin 0 -> 460652 bytes .../dk-tm4c129x/usb_dev_bulk/gcc/usb_dev_bulk.axf | Bin 0 -> 116580 bytes .../dk-tm4c129x/usb_dev_bulk/gcc/usb_dev_bulk.bin | Bin 0 -> 36297 bytes boards/dk-tm4c129x/usb_dev_bulk/readme.txt | 43 + .../usb_dev_bulk/rvmdk/usb_dev_bulk.axf | Bin 0 -> 378700 bytes .../usb_dev_bulk/rvmdk/usb_dev_bulk.bin | Bin 0 -> 37420 bytes boards/dk-tm4c129x/usb_dev_bulk/startup_ccs.c | 277 + boards/dk-tm4c129x/usb_dev_bulk/startup_ewarm.c | 308 + boards/dk-tm4c129x/usb_dev_bulk/startup_gcc.c | 324 + boards/dk-tm4c129x/usb_dev_bulk/startup_rvmdk.S | 333 + boards/dk-tm4c129x/usb_dev_bulk/usb_bulk_structs.c | 199 + boards/dk-tm4c129x/usb_dev_bulk/usb_bulk_structs.h | 48 + boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.c | 655 + boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ewd | 614 + boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ewp | 811 + boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.icf | 78 + boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ld | 57 + boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.sct | 47 + boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.uvopt | 401 + .../dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.uvproj | 464 + .../dk-tm4c129x/usb_dev_bulk/usb_dev_bulk_ccs.cmd | 70 + boards/dk-tm4c129x/usb_dev_chid/Makefile | 96 + boards/dk-tm4c129x/usb_dev_chid/ccs/.ccsimportspec | 14 + boards/dk-tm4c129x/usb_dev_chid/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_dev_chid/ccs/.cproject | 186 + boards/dk-tm4c129x/usb_dev_chid/ccs/.project | 90 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_chid/ccs/Debug/usb_dev_chid.bin | Bin 0 -> 49992 bytes .../usb_dev_chid/ccs/Debug/usb_dev_chid.out | Bin 0 -> 778282 bytes .../usb_dev_chid/ccs/macros.ini_initial | 1 + .../usb_dev_chid/ccs/target_config.ccxml | 13 + .../usb_dev_chid/ewarm/Exe/usb_dev_chid.bin | Bin 0 -> 47140 bytes .../usb_dev_chid/ewarm/Exe/usb_dev_chid.out | Bin 0 -> 608788 bytes .../dk-tm4c129x/usb_dev_chid/gcc/usb_dev_chid.axf | Bin 0 -> 122868 bytes .../dk-tm4c129x/usb_dev_chid/gcc/usb_dev_chid.bin | Bin 0 -> 49108 bytes boards/dk-tm4c129x/usb_dev_chid/readme.txt | 31 + .../usb_dev_chid/rvmdk/usb_dev_chid.axf | Bin 0 -> 541068 bytes .../usb_dev_chid/rvmdk/usb_dev_chid.bin | Bin 0 -> 50256 bytes boards/dk-tm4c129x/usb_dev_chid/startup_ccs.c | 277 + boards/dk-tm4c129x/usb_dev_chid/startup_ewarm.c | 308 + boards/dk-tm4c129x/usb_dev_chid/startup_gcc.c | 324 + boards/dk-tm4c129x/usb_dev_chid/startup_rvmdk.S | 333 + boards/dk-tm4c129x/usb_dev_chid/ui.c | 718 + boards/dk-tm4c129x/usb_dev_chid/ui.h | 85 + boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.c | 209 + boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ewd | 614 + boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ewp | 817 + boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.icf | 78 + boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ld | 57 + boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.sct | 47 + boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.uvopt | 429 + .../dk-tm4c129x/usb_dev_chid/usb_dev_chid.uvproj | 474 + .../dk-tm4c129x/usb_dev_chid/usb_dev_chid_ccs.cmd | 70 + boards/dk-tm4c129x/usb_dev_chid/usb_keyboard.c | 314 + boards/dk-tm4c129x/usb_dev_chid/usb_mouse.c | 323 + boards/dk-tm4c129x/usb_dev_chid/usb_structs.c | 255 + boards/dk-tm4c129x/usb_dev_chid/usb_structs.h | 118 + boards/dk-tm4c129x/usb_dev_gamepad/Makefile | 94 + .../dk-tm4c129x/usb_dev_gamepad/ccs/.ccsimportspec | 10 + boards/dk-tm4c129x/usb_dev_gamepad/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_dev_gamepad/ccs/.cproject | 184 + boards/dk-tm4c129x/usb_dev_gamepad/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.bin | Bin 0 -> 38208 bytes .../usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.out | Bin 0 -> 582860 bytes .../usb_dev_gamepad/ccs/macros.ini_initial | 1 + .../usb_dev_gamepad/ccs/target_config.ccxml | 13 + .../usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.bin | Bin 0 -> 35572 bytes .../usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.out | Bin 0 -> 448820 bytes .../usb_dev_gamepad/gcc/usb_dev_gamepad.axf | Bin 0 -> 116423 bytes .../usb_dev_gamepad/gcc/usb_dev_gamepad.bin | Bin 0 -> 36850 bytes boards/dk-tm4c129x/usb_dev_gamepad/readme.txt | 28 + .../usb_dev_gamepad/rvmdk/usb_dev_gamepad.axf | Bin 0 -> 413428 bytes .../usb_dev_gamepad/rvmdk/usb_dev_gamepad.bin | Bin 0 -> 37828 bytes boards/dk-tm4c129x/usb_dev_gamepad/startup_ccs.c | 276 + boards/dk-tm4c129x/usb_dev_gamepad/startup_ewarm.c | 307 + boards/dk-tm4c129x/usb_dev_gamepad/startup_gcc.c | 323 + boards/dk-tm4c129x/usb_dev_gamepad/startup_rvmdk.S | 332 + .../dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.c | 507 + .../usb_dev_gamepad/usb_dev_gamepad.ewd | 614 + .../usb_dev_gamepad/usb_dev_gamepad.ewp | 810 + .../usb_dev_gamepad/usb_dev_gamepad.icf | 78 + .../dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ld | 57 + .../usb_dev_gamepad/usb_dev_gamepad.sct | 47 + .../usb_dev_gamepad/usb_dev_gamepad.uvopt | 401 + .../usb_dev_gamepad/usb_dev_gamepad.uvproj | 464 + .../usb_dev_gamepad/usb_dev_gamepad_ccs.cmd | 70 + .../usb_dev_gamepad/usb_gamepad_structs.c | 221 + .../usb_dev_gamepad/usb_gamepad_structs.h | 56 + boards/dk-tm4c129x/usb_dev_keyboard/Makefile | 94 + .../usb_dev_keyboard/ccs/.ccsimportspec | 10 + .../dk-tm4c129x/usb_dev_keyboard/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_dev_keyboard/ccs/.cproject | 186 + boards/dk-tm4c129x/usb_dev_keyboard/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/usb_dev_keyboard.bin | Bin 0 -> 45384 bytes .../ccs/Debug/usb_dev_keyboard.out | Bin 0 -> 645461 bytes .../usb_dev_keyboard/ccs/macros.ini_initial | 1 + .../usb_dev_keyboard/ccs/target_config.ccxml | 13 + .../ewarm/Exe/usb_dev_keyboard.bin | Bin 0 -> 42044 bytes .../ewarm/Exe/usb_dev_keyboard.out | Bin 0 -> 523612 bytes .../usb_dev_keyboard/gcc/usb_dev_keyboard.axf | Bin 0 -> 119651 bytes .../usb_dev_keyboard/gcc/usb_dev_keyboard.bin | Bin 0 -> 43742 bytes boards/dk-tm4c129x/usb_dev_keyboard/readme.txt | 36 + .../usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf | Bin 0 -> 469020 bytes .../usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin | Bin 0 -> 44644 bytes boards/dk-tm4c129x/usb_dev_keyboard/startup_ccs.c | 278 + .../dk-tm4c129x/usb_dev_keyboard/startup_ewarm.c | 309 + boards/dk-tm4c129x/usb_dev_keyboard/startup_gcc.c | 325 + .../dk-tm4c129x/usb_dev_keyboard/startup_rvmdk.S | 334 + .../usb_dev_keyboard/usb_dev_keyboard.c | 2355 + .../usb_dev_keyboard/usb_dev_keyboard.ewd | 614 + .../usb_dev_keyboard/usb_dev_keyboard.ewp | 811 + .../usb_dev_keyboard/usb_dev_keyboard.icf | 78 + .../usb_dev_keyboard/usb_dev_keyboard.ld | 57 + .../usb_dev_keyboard/usb_dev_keyboard.sct | 47 + .../usb_dev_keyboard/usb_dev_keyboard.uvopt | 401 + .../usb_dev_keyboard/usb_dev_keyboard.uvproj | 464 + .../usb_dev_keyboard/usb_dev_keyboard_ccs.cmd | 70 + .../usb_dev_keyboard/usb_keyb_structs.c | 148 + .../usb_dev_keyboard/usb_keyb_structs.h | 35 + boards/dk-tm4c129x/usb_dev_msc/Makefile | 98 + boards/dk-tm4c129x/usb_dev_msc/ccs/.ccsimportspec | 12 + boards/dk-tm4c129x/usb_dev_msc/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_dev_msc/ccs/.cproject | 186 + boards/dk-tm4c129x/usb_dev_msc/ccs/.project | 90 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_msc/ccs/Debug/usb_dev_msc.bin | Bin 0 -> 40104 bytes .../usb_dev_msc/ccs/Debug/usb_dev_msc.out | Bin 0 -> 588142 bytes .../dk-tm4c129x/usb_dev_msc/ccs/macros.ini_initial | 1 + .../usb_dev_msc/ccs/target_config.ccxml | 13 + .../usb_dev_msc/ewarm/Exe/usb_dev_msc.bin | Bin 0 -> 37220 bytes .../usb_dev_msc/ewarm/Exe/usb_dev_msc.out | Bin 0 -> 474908 bytes boards/dk-tm4c129x/usb_dev_msc/gcc/usb_dev_msc.axf | Bin 0 -> 120103 bytes boards/dk-tm4c129x/usb_dev_msc/gcc/usb_dev_msc.bin | Bin 0 -> 42436 bytes boards/dk-tm4c129x/usb_dev_msc/readme.txt | 27 + .../dk-tm4c129x/usb_dev_msc/rvmdk/usb_dev_msc.axf | Bin 0 -> 382452 bytes .../dk-tm4c129x/usb_dev_msc/rvmdk/usb_dev_msc.bin | Bin 0 -> 39268 bytes boards/dk-tm4c129x/usb_dev_msc/startup_ccs.c | 276 + boards/dk-tm4c129x/usb_dev_msc/startup_ewarm.c | 307 + boards/dk-tm4c129x/usb_dev_msc/startup_gcc.c | 323 + boards/dk-tm4c129x/usb_dev_msc/startup_rvmdk.S | 332 + boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.c | 616 + boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ewd | 614 + boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ewp | 818 + boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.icf | 78 + boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ld | 57 + boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.sct | 47 + boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.uvopt | 429 + boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.uvproj | 474 + boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc_ccs.cmd | 70 + boards/dk-tm4c129x/usb_dev_msc/usb_msc_structs.c | 184 + boards/dk-tm4c129x/usb_dev_msc/usb_msc_structs.h | 46 + boards/dk-tm4c129x/usb_dev_msc/usbdspiflash.c | 259 + boards/dk-tm4c129x/usb_dev_msc/usbdspiflash.h | 47 + boards/dk-tm4c129x/usb_dev_serial/Makefile | 93 + .../dk-tm4c129x/usb_dev_serial/ccs/.ccsimportspec | 10 + boards/dk-tm4c129x/usb_dev_serial/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_dev_serial/ccs/.cproject | 184 + boards/dk-tm4c129x/usb_dev_serial/ccs/.project | 75 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_serial/ccs/Debug/usb_dev_serial.bin | Bin 0 -> 42776 bytes .../usb_dev_serial/ccs/Debug/usb_dev_serial.out | Bin 0 -> 637462 bytes .../usb_dev_serial/ccs/macros.ini_initial | 1 + .../usb_dev_serial/ccs/target_config.ccxml | 13 + .../usb_dev_serial/ewarm/Exe/usb_dev_serial.bin | Bin 0 -> 39928 bytes .../usb_dev_serial/ewarm/Exe/usb_dev_serial.out | Bin 0 -> 504184 bytes .../usb_dev_serial/gcc/usb_dev_serial.axf | Bin 0 -> 118054 bytes .../usb_dev_serial/gcc/usb_dev_serial.bin | Bin 0 -> 41305 bytes boards/dk-tm4c129x/usb_dev_serial/readme.txt | 39 + .../usb_dev_serial/rvmdk/usb_dev_serial.axf | Bin 0 -> 458828 bytes .../usb_dev_serial/rvmdk/usb_dev_serial.bin | Bin 0 -> 42652 bytes boards/dk-tm4c129x/usb_dev_serial/startup_ccs.c | 277 + boards/dk-tm4c129x/usb_dev_serial/startup_ewarm.c | 308 + boards/dk-tm4c129x/usb_dev_serial/startup_gcc.c | 324 + boards/dk-tm4c129x/usb_dev_serial/startup_rvmdk.S | 333 + boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.c | 1455 + .../dk-tm4c129x/usb_dev_serial/usb_dev_serial.ewd | 614 + .../dk-tm4c129x/usb_dev_serial/usb_dev_serial.ewp | 807 + .../dk-tm4c129x/usb_dev_serial/usb_dev_serial.icf | 78 + .../dk-tm4c129x/usb_dev_serial/usb_dev_serial.ld | 57 + .../dk-tm4c129x/usb_dev_serial/usb_dev_serial.sct | 47 + .../usb_dev_serial/usb_dev_serial.uvopt | 387 + .../usb_dev_serial/usb_dev_serial.uvproj | 459 + .../usb_dev_serial/usb_dev_serial_ccs.cmd | 70 + .../usb_dev_serial/usb_serial_structs.c | 217 + .../usb_dev_serial/usb_serial_structs.h | 49 + boards/dk-tm4c129x/usb_host_audio/Makefile | 102 + .../dk-tm4c129x/usb_host_audio/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/usb_host_audio/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_host_audio/ccs/.cproject | 188 + boards/dk-tm4c129x/usb_host_audio/ccs/.project | 100 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_host_audio/ccs/Debug/usb_host_audio.bin | Bin 0 -> 61104 bytes .../usb_host_audio/ccs/Debug/usb_host_audio.out | Bin 0 -> 916299 bytes .../usb_host_audio/ccs/macros.ini_initial | 1 + .../usb_host_audio/ccs/target_config.ccxml | 13 + .../usb_host_audio/ewarm/Exe/usb_host_audio.bin | Bin 0 -> 57192 bytes .../usb_host_audio/ewarm/Exe/usb_host_audio.out | Bin 0 -> 771388 bytes .../usb_host_audio/gcc/usb_host_audio.axf | Bin 0 -> 127387 bytes .../usb_host_audio/gcc/usb_host_audio.bin | Bin 0 -> 61008 bytes boards/dk-tm4c129x/usb_host_audio/readme.txt | 38 + .../usb_host_audio/rvmdk/usb_host_audio.axf | Bin 0 -> 623608 bytes .../usb_host_audio/rvmdk/usb_host_audio.bin | Bin 0 -> 60720 bytes boards/dk-tm4c129x/usb_host_audio/startup_ccs.c | 277 + boards/dk-tm4c129x/usb_host_audio/startup_ewarm.c | 308 + boards/dk-tm4c129x/usb_host_audio/startup_gcc.c | 324 + boards/dk-tm4c129x/usb_host_audio/startup_rvmdk.S | 333 + boards/dk-tm4c129x/usb_host_audio/usb_host_audio.c | 1554 + .../dk-tm4c129x/usb_host_audio/usb_host_audio.ewd | 614 + .../dk-tm4c129x/usb_host_audio/usb_host_audio.ewp | 826 + .../dk-tm4c129x/usb_host_audio/usb_host_audio.icf | 78 + .../dk-tm4c129x/usb_host_audio/usb_host_audio.ld | 57 + .../dk-tm4c129x/usb_host_audio/usb_host_audio.sct | 47 + .../usb_host_audio/usb_host_audio.uvopt | 457 + .../usb_host_audio/usb_host_audio.uvproj | 484 + .../usb_host_audio/usb_host_audio_ccs.cmd | 70 + boards/dk-tm4c129x/usb_host_audio_in/Makefile | 95 + .../usb_host_audio_in/ccs/.ccsimportspec | 8 + .../dk-tm4c129x/usb_host_audio_in/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_host_audio_in/ccs/.cproject | 184 + boards/dk-tm4c129x/usb_host_audio_in/ccs/.project | 85 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/usb_host_audio_in.bin | Bin 0 -> 49936 bytes .../ccs/Debug/usb_host_audio_in.out | Bin 0 -> 766712 bytes .../usb_host_audio_in/ccs/macros.ini_initial | 1 + .../usb_host_audio_in/ccs/target_config.ccxml | 13 + .../ewarm/Exe/usb_host_audio_in.bin | Bin 0 -> 46464 bytes .../ewarm/Exe/usb_host_audio_in.out | Bin 0 -> 623540 bytes .../usb_host_audio_in/gcc/usb_host_audio_in.axf | Bin 0 -> 121720 bytes .../usb_host_audio_in/gcc/usb_host_audio_in.bin | Bin 0 -> 49100 bytes boards/dk-tm4c129x/usb_host_audio_in/readme.txt | 35 + .../usb_host_audio_in/rvmdk/usb_host_audio_in.axf | Bin 0 -> 494272 bytes .../usb_host_audio_in/rvmdk/usb_host_audio_in.bin | Bin 0 -> 50476 bytes boards/dk-tm4c129x/usb_host_audio_in/startup_ccs.c | 277 + .../dk-tm4c129x/usb_host_audio_in/startup_ewarm.c | 308 + boards/dk-tm4c129x/usb_host_audio_in/startup_gcc.c | 324 + .../dk-tm4c129x/usb_host_audio_in/startup_rvmdk.S | 333 + .../usb_host_audio_in/usb_host_audio_in.c | 791 + .../usb_host_audio_in/usb_host_audio_in.ewd | 614 + .../usb_host_audio_in/usb_host_audio_in.ewp | 813 + .../usb_host_audio_in/usb_host_audio_in.icf | 78 + .../usb_host_audio_in/usb_host_audio_in.ld | 57 + .../usb_host_audio_in/usb_host_audio_in.sct | 47 + .../usb_host_audio_in/usb_host_audio_in.uvopt | 415 + .../usb_host_audio_in/usb_host_audio_in.uvproj | 469 + .../usb_host_audio_in/usb_host_audio_in_ccs.cmd | 70 + boards/dk-tm4c129x/usb_host_hub/Makefile | 100 + boards/dk-tm4c129x/usb_host_hub/ccs/.ccsimportspec | 11 + boards/dk-tm4c129x/usb_host_hub/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_host_hub/ccs/.cproject | 186 + boards/dk-tm4c129x/usb_host_hub/ccs/.project | 95 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_host_hub/ccs/Debug/usb_host_hub.bin | Bin 0 -> 55856 bytes .../usb_host_hub/ccs/Debug/usb_host_hub.out | Bin 0 -> 898461 bytes .../usb_host_hub/ccs/macros.ini_initial | 1 + .../usb_host_hub/ccs/target_config.ccxml | 13 + .../usb_host_hub/ewarm/Exe/usb_host_hub.bin | Bin 0 -> 52220 bytes .../usb_host_hub/ewarm/Exe/usb_host_hub.out | Bin 0 -> 710124 bytes .../dk-tm4c129x/usb_host_hub/gcc/usb_host_hub.axf | Bin 0 -> 124924 bytes .../dk-tm4c129x/usb_host_hub/gcc/usb_host_hub.bin | Bin 0 -> 55536 bytes boards/dk-tm4c129x/usb_host_hub/readme.txt | 44 + .../usb_host_hub/rvmdk/usb_host_hub.axf | Bin 0 -> 540148 bytes .../usb_host_hub/rvmdk/usb_host_hub.bin | Bin 0 -> 55952 bytes boards/dk-tm4c129x/usb_host_hub/startup_ccs.c | 275 + boards/dk-tm4c129x/usb_host_hub/startup_ewarm.c | 306 + boards/dk-tm4c129x/usb_host_hub/startup_gcc.c | 322 + boards/dk-tm4c129x/usb_host_hub/startup_rvmdk.S | 331 + boards/dk-tm4c129x/usb_host_hub/usb_host_hub.c | 1133 + boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ewd | 614 + boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ewp | 821 + boards/dk-tm4c129x/usb_host_hub/usb_host_hub.h | 50 + boards/dk-tm4c129x/usb_host_hub/usb_host_hub.icf | 78 + boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ld | 57 + boards/dk-tm4c129x/usb_host_hub/usb_host_hub.sct | 47 + boards/dk-tm4c129x/usb_host_hub/usb_host_hub.uvopt | 443 + .../dk-tm4c129x/usb_host_hub/usb_host_hub.uvproj | 479 + .../dk-tm4c129x/usb_host_hub/usb_host_hub_ccs.cmd | 70 + .../dk-tm4c129x/usb_host_hub/usb_host_keyboard.c | 351 + boards/dk-tm4c129x/usb_host_hub/usb_host_msc.c | 946 + boards/dk-tm4c129x/usb_host_keyboard/Makefile | 92 + .../usb_host_keyboard/ccs/.ccsimportspec | 10 + .../dk-tm4c129x/usb_host_keyboard/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_host_keyboard/ccs/.cproject | 184 + boards/dk-tm4c129x/usb_host_keyboard/ccs/.project | 75 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/usb_host_keyboard.bin | Bin 0 -> 42000 bytes .../ccs/Debug/usb_host_keyboard.out | Bin 0 -> 594254 bytes .../usb_host_keyboard/ccs/macros.ini_initial | 1 + .../usb_host_keyboard/ccs/target_config.ccxml | 13 + .../ewarm/Exe/usb_host_keyboard.bin | Bin 0 -> 38956 bytes .../ewarm/Exe/usb_host_keyboard.out | Bin 0 -> 475900 bytes .../usb_host_keyboard/gcc/usb_host_keyboard.axf | Bin 0 -> 116668 bytes .../usb_host_keyboard/gcc/usb_host_keyboard.bin | Bin 0 -> 40786 bytes boards/dk-tm4c129x/usb_host_keyboard/keyboard_ui.c | 578 + boards/dk-tm4c129x/usb_host_keyboard/keyboard_ui.h | 71 + boards/dk-tm4c129x/usb_host_keyboard/readme.txt | 37 + .../usb_host_keyboard/rvmdk/usb_host_keyboard.axf | Bin 0 -> 420140 bytes .../usb_host_keyboard/rvmdk/usb_host_keyboard.bin | Bin 0 -> 41936 bytes boards/dk-tm4c129x/usb_host_keyboard/startup_ccs.c | 276 + .../dk-tm4c129x/usb_host_keyboard/startup_ewarm.c | 307 + boards/dk-tm4c129x/usb_host_keyboard/startup_gcc.c | 323 + .../dk-tm4c129x/usb_host_keyboard/startup_rvmdk.S | 332 + .../usb_host_keyboard/usb_host_keyboard.c | 561 + .../usb_host_keyboard/usb_host_keyboard.ewd | 614 + .../usb_host_keyboard/usb_host_keyboard.ewp | 807 + .../usb_host_keyboard/usb_host_keyboard.icf | 78 + .../usb_host_keyboard/usb_host_keyboard.ld | 57 + .../usb_host_keyboard/usb_host_keyboard.sct | 47 + .../usb_host_keyboard/usb_host_keyboard.uvopt | 387 + .../usb_host_keyboard/usb_host_keyboard.uvproj | 459 + .../usb_host_keyboard/usb_host_keyboard_ccs.cmd | 70 + boards/dk-tm4c129x/usb_host_mouse/Makefile | 93 + .../dk-tm4c129x/usb_host_mouse/ccs/.ccsimportspec | 10 + boards/dk-tm4c129x/usb_host_mouse/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_host_mouse/ccs/.cproject | 184 + boards/dk-tm4c129x/usb_host_mouse/ccs/.project | 75 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_host_mouse/ccs/Debug/usb_host_mouse.bin | Bin 0 -> 40368 bytes .../usb_host_mouse/ccs/Debug/usb_host_mouse.out | Bin 0 -> 577440 bytes .../usb_host_mouse/ccs/macros.ini_initial | 1 + .../usb_host_mouse/ccs/target_config.ccxml | 13 + .../usb_host_mouse/ewarm/Exe/usb_host_mouse.bin | Bin 0 -> 37232 bytes .../usb_host_mouse/ewarm/Exe/usb_host_mouse.out | Bin 0 -> 463616 bytes .../usb_host_mouse/gcc/usb_host_mouse.axf | Bin 0 -> 115436 bytes .../usb_host_mouse/gcc/usb_host_mouse.bin | Bin 0 -> 38994 bytes boards/dk-tm4c129x/usb_host_mouse/mouse_ui.c | 429 + boards/dk-tm4c129x/usb_host_mouse/mouse_ui.h | 94 + boards/dk-tm4c129x/usb_host_mouse/readme.txt | 36 + .../usb_host_mouse/rvmdk/usb_host_mouse.axf | Bin 0 -> 395396 bytes .../usb_host_mouse/rvmdk/usb_host_mouse.bin | Bin 0 -> 40392 bytes boards/dk-tm4c129x/usb_host_mouse/startup_ccs.c | 275 + boards/dk-tm4c129x/usb_host_mouse/startup_ewarm.c | 306 + boards/dk-tm4c129x/usb_host_mouse/startup_gcc.c | 322 + boards/dk-tm4c129x/usb_host_mouse/startup_rvmdk.S | 331 + boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.c | 553 + .../dk-tm4c129x/usb_host_mouse/usb_host_mouse.ewd | 614 + .../dk-tm4c129x/usb_host_mouse/usb_host_mouse.ewp | 807 + .../dk-tm4c129x/usb_host_mouse/usb_host_mouse.icf | 78 + .../dk-tm4c129x/usb_host_mouse/usb_host_mouse.ld | 57 + .../dk-tm4c129x/usb_host_mouse/usb_host_mouse.sct | 47 + .../usb_host_mouse/usb_host_mouse.uvopt | 387 + .../usb_host_mouse/usb_host_mouse.uvproj | 459 + .../usb_host_mouse/usb_host_mouse_ccs.cmd | 70 + boards/dk-tm4c129x/usb_host_msc/Makefile | 98 + boards/dk-tm4c129x/usb_host_msc/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/usb_host_msc/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_host_msc/ccs/.cproject | 186 + boards/dk-tm4c129x/usb_host_msc/ccs/.project | 85 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_host_msc/ccs/Debug/usb_host_msc.bin | Bin 0 -> 58168 bytes .../usb_host_msc/ccs/Debug/usb_host_msc.out | Bin 0 -> 845080 bytes .../usb_host_msc/ccs/macros.ini_initial | 1 + .../usb_host_msc/ccs/target_config.ccxml | 13 + .../usb_host_msc/ewarm/Exe/usb_host_msc.bin | Bin 0 -> 54600 bytes .../usb_host_msc/ewarm/Exe/usb_host_msc.out | Bin 0 -> 702720 bytes .../dk-tm4c129x/usb_host_msc/gcc/usb_host_msc.axf | Bin 0 -> 124569 bytes .../dk-tm4c129x/usb_host_msc/gcc/usb_host_msc.bin | Bin 0 -> 58188 bytes boards/dk-tm4c129x/usb_host_msc/readme.txt | 35 + .../usb_host_msc/rvmdk/usb_host_msc.axf | Bin 0 -> 601080 bytes .../usb_host_msc/rvmdk/usb_host_msc.bin | Bin 0 -> 58280 bytes boards/dk-tm4c129x/usb_host_msc/startup_ccs.c | 277 + boards/dk-tm4c129x/usb_host_msc/startup_ewarm.c | 308 + boards/dk-tm4c129x/usb_host_msc/startup_gcc.c | 324 + boards/dk-tm4c129x/usb_host_msc/startup_rvmdk.S | 333 + boards/dk-tm4c129x/usb_host_msc/usb_host_msc.c | 1591 + boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ewd | 614 + boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ewp | 815 + boards/dk-tm4c129x/usb_host_msc/usb_host_msc.icf | 78 + boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ld | 57 + boards/dk-tm4c129x/usb_host_msc/usb_host_msc.sct | 47 + boards/dk-tm4c129x/usb_host_msc/usb_host_msc.uvopt | 415 + .../dk-tm4c129x/usb_host_msc/usb_host_msc.uvproj | 469 + .../dk-tm4c129x/usb_host_msc/usb_host_msc_ccs.cmd | 70 + boards/dk-tm4c129x/usb_otg_mouse/Makefile | 99 + .../dk-tm4c129x/usb_otg_mouse/ccs/.ccsimportspec | 13 + boards/dk-tm4c129x/usb_otg_mouse/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_otg_mouse/ccs/.cproject | 186 + boards/dk-tm4c129x/usb_otg_mouse/ccs/.project | 90 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_otg_mouse/ccs/Debug/usb_otg_mouse.bin | Bin 0 -> 50336 bytes .../usb_otg_mouse/ccs/Debug/usb_otg_mouse.out | Bin 0 -> 827656 bytes .../usb_otg_mouse/ccs/macros.ini_initial | 1 + .../usb_otg_mouse/ccs/target_config.ccxml | 13 + .../usb_otg_mouse/ewarm/Exe/usb_otg_mouse.bin | Bin 0 -> 46624 bytes .../usb_otg_mouse/ewarm/Exe/usb_otg_mouse.out | Bin 0 -> 642824 bytes .../usb_otg_mouse/gcc/usb_otg_mouse.axf | Bin 0 -> 124621 bytes .../usb_otg_mouse/gcc/usb_otg_mouse.bin | Bin 0 -> 48962 bytes boards/dk-tm4c129x/usb_otg_mouse/readme.txt | 34 + .../usb_otg_mouse/rvmdk/usb_otg_mouse.axf | Bin 0 -> 546568 bytes .../usb_otg_mouse/rvmdk/usb_otg_mouse.bin | Bin 0 -> 50820 bytes boards/dk-tm4c129x/usb_otg_mouse/startup_ccs.c | 277 + boards/dk-tm4c129x/usb_otg_mouse/startup_ewarm.c | 308 + boards/dk-tm4c129x/usb_otg_mouse/startup_gcc.c | 324 + boards/dk-tm4c129x/usb_otg_mouse/startup_rvmdk.S | 333 + boards/dk-tm4c129x/usb_otg_mouse/usb_dev_mouse.c | 556 + boards/dk-tm4c129x/usb_otg_mouse/usb_host_mouse.c | 740 + .../dk-tm4c129x/usb_otg_mouse/usb_mouse_structs.c | 147 + .../dk-tm4c129x/usb_otg_mouse/usb_mouse_structs.h | 33 + boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.c | 322 + boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ewd | 614 + boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ewp | 818 + boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.h | 49 + boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.icf | 78 + boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ld | 57 + boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.sct | 47 + .../dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.uvopt | 429 + .../dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.uvproj | 474 + .../usb_otg_mouse/usb_otg_mouse_ccs.cmd | 70 + boards/dk-tm4c129x/usb_stick_demo/Makefile | 90 + .../dk-tm4c129x/usb_stick_demo/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/usb_stick_demo/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_stick_demo/ccs/.cproject | 182 + boards/dk-tm4c129x/usb_stick_demo/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_stick_demo/ccs/Debug/usb_stick_demo.bin | Bin 0 -> 31384 bytes .../usb_stick_demo/ccs/Debug/usb_stick_demo.out | Bin 0 -> 212894 bytes .../usb_stick_demo/ccs/macros.ini_initial | 1 + .../usb_stick_demo/ccs/target_config.ccxml | 13 + .../usb_stick_demo/ewarm/Exe/usb_stick_demo.bin | Bin 0 -> 29160 bytes .../usb_stick_demo/ewarm/Exe/usb_stick_demo.out | Bin 0 -> 196964 bytes .../usb_stick_demo/gcc/usb_stick_demo.axf | Bin 0 -> 67738 bytes .../usb_stick_demo/gcc/usb_stick_demo.bin | Bin 0 -> 29708 bytes boards/dk-tm4c129x/usb_stick_demo/readme.txt | 39 + .../usb_stick_demo/rvmdk/usb_stick_demo.axf | Bin 0 -> 223488 bytes .../usb_stick_demo/rvmdk/usb_stick_demo.bin | Bin 0 -> 29908 bytes boards/dk-tm4c129x/usb_stick_demo/startup_ccs.c | 268 + boards/dk-tm4c129x/usb_stick_demo/startup_ewarm.c | 299 + boards/dk-tm4c129x/usb_stick_demo/startup_gcc.c | 315 + boards/dk-tm4c129x/usb_stick_demo/startup_rvmdk.S | 324 + boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.c | 261 + .../dk-tm4c129x/usb_stick_demo/usb_stick_demo.ewd | 614 + .../dk-tm4c129x/usb_stick_demo/usb_stick_demo.ewp | 798 + .../dk-tm4c129x/usb_stick_demo/usb_stick_demo.icf | 78 + .../dk-tm4c129x/usb_stick_demo/usb_stick_demo.ld | 57 + .../dk-tm4c129x/usb_stick_demo/usb_stick_demo.sct | 47 + .../usb_stick_demo/usb_stick_demo.uvopt | 345 + .../usb_stick_demo/usb_stick_demo.uvproj | 444 + .../usb_stick_demo/usb_stick_demo_ccs.cmd | 70 + boards/dk-tm4c129x/usb_stick_update/Makefile | 87 + .../usb_stick_update/ccs/.ccsimportspec | 10 + .../dk-tm4c129x/usb_stick_update/ccs/.ccsproject | 10 + boards/dk-tm4c129x/usb_stick_update/ccs/.cproject | 182 + boards/dk-tm4c129x/usb_stick_update/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/usb_stick_update.bin | Bin 0 -> 17008 bytes .../ccs/Debug/usb_stick_update.out | Bin 0 -> 420525 bytes .../usb_stick_update/ccs/macros.ini_initial | 1 + .../usb_stick_update/ccs/target_config.ccxml | 13 + .../ewarm/Exe/usb_stick_update.bin | Bin 0 -> 15476 bytes .../ewarm/Exe/usb_stick_update.out | Bin 0 -> 322876 bytes .../usb_stick_update/gcc/usb_stick_update.axf | Bin 0 -> 79550 bytes .../usb_stick_update/gcc/usb_stick_update.bin | Bin 0 -> 16974 bytes boards/dk-tm4c129x/usb_stick_update/readme.txt | 49 + .../usb_stick_update/rvmdk/usb_stick_update.axf | Bin 0 -> 228224 bytes .../usb_stick_update/rvmdk/usb_stick_update.bin | Bin 0 -> 17976 bytes boards/dk-tm4c129x/usb_stick_update/simple_fs.c | 865 + boards/dk-tm4c129x/usb_stick_update/simple_fs.h | 105 + boards/dk-tm4c129x/usb_stick_update/startup_ccs.c | 276 + .../dk-tm4c129x/usb_stick_update/startup_ewarm.c | 307 + boards/dk-tm4c129x/usb_stick_update/startup_gcc.c | 323 + .../dk-tm4c129x/usb_stick_update/startup_rvmdk.S | 332 + .../usb_stick_update/usb_stick_update.c | 942 + .../usb_stick_update/usb_stick_update.ewd | 614 + .../usb_stick_update/usb_stick_update.ewp | 792 + .../usb_stick_update/usb_stick_update.icf | 78 + .../usb_stick_update/usb_stick_update.ld | 57 + .../usb_stick_update/usb_stick_update.sct | 47 + .../usb_stick_update/usb_stick_update.uvopt | 317 + .../usb_stick_update/usb_stick_update.uvproj | 434 + .../usb_stick_update/usb_stick_update_ccs.cmd | 70 + boards/dk-tm4c129x/watchdog/Makefile | 92 + boards/dk-tm4c129x/watchdog/ccs/.ccsimportspec | 8 + boards/dk-tm4c129x/watchdog/ccs/.ccsproject | 10 + boards/dk-tm4c129x/watchdog/ccs/.cproject | 182 + boards/dk-tm4c129x/watchdog/ccs/.project | 75 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/dk-tm4c129x/watchdog/ccs/Debug/watchdog.bin | Bin 0 -> 32080 bytes boards/dk-tm4c129x/watchdog/ccs/Debug/watchdog.out | Bin 0 -> 240230 bytes boards/dk-tm4c129x/watchdog/ccs/macros.ini_initial | 1 + .../dk-tm4c129x/watchdog/ccs/target_config.ccxml | 13 + boards/dk-tm4c129x/watchdog/ewarm/Exe/watchdog.bin | Bin 0 -> 29668 bytes boards/dk-tm4c129x/watchdog/ewarm/Exe/watchdog.out | Bin 0 -> 219092 bytes boards/dk-tm4c129x/watchdog/gcc/watchdog.axf | Bin 0 -> 71971 bytes boards/dk-tm4c129x/watchdog/gcc/watchdog.bin | Bin 0 -> 30400 bytes boards/dk-tm4c129x/watchdog/readme.txt | 33 + boards/dk-tm4c129x/watchdog/rvmdk/watchdog.axf | Bin 0 -> 232952 bytes boards/dk-tm4c129x/watchdog/rvmdk/watchdog.bin | Bin 0 -> 30516 bytes boards/dk-tm4c129x/watchdog/startup_ccs.c | 276 + boards/dk-tm4c129x/watchdog/startup_ewarm.c | 307 + boards/dk-tm4c129x/watchdog/startup_gcc.c | 323 + boards/dk-tm4c129x/watchdog/startup_rvmdk.S | 332 + boards/dk-tm4c129x/watchdog/watchdog.c | 356 + boards/dk-tm4c129x/watchdog/watchdog.ewd | 614 + boards/dk-tm4c129x/watchdog/watchdog.ewp | 804 + boards/dk-tm4c129x/watchdog/watchdog.icf | 78 + boards/dk-tm4c129x/watchdog/watchdog.ld | 57 + boards/dk-tm4c129x/watchdog/watchdog.sct | 47 + boards/dk-tm4c129x/watchdog/watchdog.uvopt | 373 + boards/dk-tm4c129x/watchdog/watchdog.uvproj | 454 + boards/dk-tm4c129x/watchdog/watchdog_ccs.cmd | 70 + boards/ek-lm4f232/Makefile | 74 + boards/ek-lm4f232/bitband/Makefile | 87 + boards/ek-lm4f232/bitband/bitband.c | 292 + boards/ek-lm4f232/bitband/bitband.ewd | 614 + boards/ek-lm4f232/bitband/bitband.ewp | 792 + boards/ek-lm4f232/bitband/bitband.icf | 78 + boards/ek-lm4f232/bitband/bitband.ld | 57 + boards/ek-lm4f232/bitband/bitband.sct | 47 + boards/ek-lm4f232/bitband/bitband.uvopt | 317 + boards/ek-lm4f232/bitband/bitband.uvproj | 434 + boards/ek-lm4f232/bitband/bitband_ccs.cmd | 70 + boards/ek-lm4f232/bitband/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/bitband/ccs/.ccsproject | 10 + boards/ek-lm4f232/bitband/ccs/.cproject | 191 + boards/ek-lm4f232/bitband/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-lm4f232/bitband/ccs/Debug/bitband.bin | Bin 0 -> 5880 bytes boards/ek-lm4f232/bitband/ccs/Debug/bitband.out | Bin 0 -> 122215 bytes boards/ek-lm4f232/bitband/ccs/macros.ini_initial | 1 + boards/ek-lm4f232/bitband/ccs/target_config.ccxml | 13 + boards/ek-lm4f232/bitband/ewarm/Exe/bitband.bin | Bin 0 -> 5208 bytes boards/ek-lm4f232/bitband/ewarm/Exe/bitband.out | Bin 0 -> 89728 bytes boards/ek-lm4f232/bitband/gcc/bitband.axf | Bin 0 -> 68740 bytes boards/ek-lm4f232/bitband/gcc/bitband.bin | Bin 0 -> 5323 bytes boards/ek-lm4f232/bitband/readme.txt | 29 + boards/ek-lm4f232/bitband/rvmdk/bitband.axf | Bin 0 -> 115384 bytes boards/ek-lm4f232/bitband/rvmdk/bitband.bin | Bin 0 -> 5432 bytes boards/ek-lm4f232/bitband/startup_ccs.c | 295 + boards/ek-lm4f232/bitband/startup_ewarm.c | 326 + boards/ek-lm4f232/bitband/startup_gcc.c | 342 + boards/ek-lm4f232/bitband/startup_rvmdk.S | 351 + boards/ek-lm4f232/blinky/Makefile | 77 + boards/ek-lm4f232/blinky/blinky.c | 93 + boards/ek-lm4f232/blinky/blinky.ewd | 614 + boards/ek-lm4f232/blinky/blinky.ewp | 777 + boards/ek-lm4f232/blinky/blinky.icf | 78 + boards/ek-lm4f232/blinky/blinky.ld | 57 + boards/ek-lm4f232/blinky/blinky.sct | 47 + boards/ek-lm4f232/blinky/blinky.uvopt | 268 + boards/ek-lm4f232/blinky/blinky.uvproj | 414 + boards/ek-lm4f232/blinky/blinky_ccs.cmd | 70 + boards/ek-lm4f232/blinky/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/blinky/ccs/.ccsproject | 10 + boards/ek-lm4f232/blinky/ccs/.cproject | 183 + boards/ek-lm4f232/blinky/ccs/.project | 50 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-lm4f232/blinky/ccs/Debug/blinky.bin | Bin 0 -> 1424 bytes boards/ek-lm4f232/blinky/ccs/Debug/blinky.out | Bin 0 -> 32074 bytes boards/ek-lm4f232/blinky/ccs/macros.ini_initial | 1 + boards/ek-lm4f232/blinky/ccs/target_config.ccxml | 13 + boards/ek-lm4f232/blinky/ewarm/Exe/blinky.bin | Bin 0 -> 848 bytes boards/ek-lm4f232/blinky/ewarm/Exe/blinky.out | Bin 0 -> 13384 bytes boards/ek-lm4f232/blinky/gcc/blinky.axf | Bin 0 -> 34684 bytes boards/ek-lm4f232/blinky/gcc/blinky.bin | Bin 0 -> 804 bytes boards/ek-lm4f232/blinky/readme.txt | 23 + boards/ek-lm4f232/blinky/rvmdk/blinky.axf | Bin 0 -> 10328 bytes boards/ek-lm4f232/blinky/rvmdk/blinky.bin | Bin 0 -> 852 bytes boards/ek-lm4f232/blinky/startup_ccs.c | 295 + boards/ek-lm4f232/blinky/startup_ewarm.c | 326 + boards/ek-lm4f232/blinky/startup_gcc.c | 342 + boards/ek-lm4f232/blinky/startup_rvmdk.S | 351 + boards/ek-lm4f232/boot_demo1/Makefile | 92 + boards/ek-lm4f232/boot_demo1/boot_demo1.c | 267 + boards/ek-lm4f232/boot_demo1/boot_demo1.ewd | 614 + boards/ek-lm4f232/boot_demo1/boot_demo1.ewp | 801 + boards/ek-lm4f232/boot_demo1/boot_demo1.icf | 78 + boards/ek-lm4f232/boot_demo1/boot_demo1.ld | 57 + boards/ek-lm4f232/boot_demo1/boot_demo1.sct | 47 + boards/ek-lm4f232/boot_demo1/boot_demo1.uvopt | 331 + boards/ek-lm4f232/boot_demo1/boot_demo1.uvproj | 439 + boards/ek-lm4f232/boot_demo1/boot_demo1_ccs.cmd | 70 + boards/ek-lm4f232/boot_demo1/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/boot_demo1/ccs/.ccsproject | 10 + boards/ek-lm4f232/boot_demo1/ccs/.cproject | 197 + boards/ek-lm4f232/boot_demo1/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ek-lm4f232/boot_demo1/ccs/Debug/boot_demo1.bin | Bin 0 -> 6456 bytes .../ek-lm4f232/boot_demo1/ccs/Debug/boot_demo1.out | Bin 0 -> 127325 bytes .../ek-lm4f232/boot_demo1/ccs/macros.ini_initial | 1 + .../ek-lm4f232/boot_demo1/ccs/target_config.ccxml | 13 + .../ek-lm4f232/boot_demo1/ewarm/Exe/boot_demo1.bin | Bin 0 -> 5716 bytes .../ek-lm4f232/boot_demo1/ewarm/Exe/boot_demo1.out | Bin 0 -> 100288 bytes boards/ek-lm4f232/boot_demo1/gcc/boot_demo1.axf | Bin 0 -> 36034 bytes boards/ek-lm4f232/boot_demo1/gcc/boot_demo1.bin | Bin 0 -> 5915 bytes boards/ek-lm4f232/boot_demo1/readme.txt | 48 + boards/ek-lm4f232/boot_demo1/rvmdk/boot_demo1.axf | Bin 0 -> 120940 bytes boards/ek-lm4f232/boot_demo1/rvmdk/boot_demo1.bin | Bin 0 -> 6148 bytes boards/ek-lm4f232/boot_demo1/startup_ccs.c | 364 + boards/ek-lm4f232/boot_demo1/startup_ewarm.c | 395 + boards/ek-lm4f232/boot_demo1/startup_gcc.c | 411 + boards/ek-lm4f232/boot_demo1/startup_rvmdk.S | 359 + boards/ek-lm4f232/boot_demo2/Makefile | 93 + boards/ek-lm4f232/boot_demo2/boot_demo2.c | 311 + boards/ek-lm4f232/boot_demo2/boot_demo2.ewd | 614 + boards/ek-lm4f232/boot_demo2/boot_demo2.ewp | 804 + boards/ek-lm4f232/boot_demo2/boot_demo2.icf | 78 + boards/ek-lm4f232/boot_demo2/boot_demo2.ld | 57 + boards/ek-lm4f232/boot_demo2/boot_demo2.sct | 47 + boards/ek-lm4f232/boot_demo2/boot_demo2.uvopt | 345 + boards/ek-lm4f232/boot_demo2/boot_demo2.uvproj | 444 + boards/ek-lm4f232/boot_demo2/boot_demo2_ccs.cmd | 70 + boards/ek-lm4f232/boot_demo2/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/boot_demo2/ccs/.ccsproject | 10 + boards/ek-lm4f232/boot_demo2/ccs/.cproject | 197 + boards/ek-lm4f232/boot_demo2/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ek-lm4f232/boot_demo2/ccs/Debug/boot_demo2.bin | Bin 0 -> 7240 bytes .../ek-lm4f232/boot_demo2/ccs/Debug/boot_demo2.out | Bin 0 -> 138835 bytes .../ek-lm4f232/boot_demo2/ccs/macros.ini_initial | 1 + .../ek-lm4f232/boot_demo2/ccs/target_config.ccxml | 13 + .../ek-lm4f232/boot_demo2/ewarm/Exe/boot_demo2.bin | Bin 0 -> 6436 bytes .../ek-lm4f232/boot_demo2/ewarm/Exe/boot_demo2.out | Bin 0 -> 116708 bytes boards/ek-lm4f232/boot_demo2/gcc/boot_demo2.axf | Bin 0 -> 36570 bytes boards/ek-lm4f232/boot_demo2/gcc/boot_demo2.bin | Bin 0 -> 6704 bytes boards/ek-lm4f232/boot_demo2/readme.txt | 49 + boards/ek-lm4f232/boot_demo2/rvmdk/boot_demo2.axf | Bin 0 -> 126852 bytes boards/ek-lm4f232/boot_demo2/rvmdk/boot_demo2.bin | Bin 0 -> 6884 bytes boards/ek-lm4f232/boot_demo2/startup_ccs.c | 364 + boards/ek-lm4f232/boot_demo2/startup_ewarm.c | 395 + boards/ek-lm4f232/boot_demo2/startup_gcc.c | 411 + boards/ek-lm4f232/boot_demo2/startup_rvmdk.S | 359 + boards/ek-lm4f232/boot_serial/Makefile | 98 + boards/ek-lm4f232/boot_serial/bl_config.h | 1137 + boards/ek-lm4f232/boot_serial/boot_serial.ewd | 614 + boards/ek-lm4f232/boot_serial/boot_serial.ewp | 821 + boards/ek-lm4f232/boot_serial/boot_serial.uvopt | 450 + boards/ek-lm4f232/boot_serial/boot_serial.uvproj | 479 + boards/ek-lm4f232/boot_serial/ccs/.ccsimportspec | 6 + boards/ek-lm4f232/boot_serial/ccs/.ccsproject | 10 + boards/ek-lm4f232/boot_serial/ccs/.cproject | 191 + boards/ek-lm4f232/boot_serial/ccs/.project | 115 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../boot_serial/ccs/Debug/boot_serial.bin | Bin 0 -> 1284 bytes .../boot_serial/ccs/Debug/boot_serial.out | Bin 0 -> 36737 bytes .../ek-lm4f232/boot_serial/ccs/macros.ini_initial | 1 + .../ek-lm4f232/boot_serial/ccs/target_config.ccxml | 13 + .../boot_serial/ewarm/Exe/boot_serial.bin | Bin 0 -> 1260 bytes .../boot_serial/ewarm/Exe/boot_serial.out | Bin 0 -> 40216 bytes boards/ek-lm4f232/boot_serial/gcc/boot_serial.axf | Bin 0 -> 36412 bytes boards/ek-lm4f232/boot_serial/gcc/boot_serial.bin | Bin 0 -> 1280 bytes .../ek-lm4f232/boot_serial/rvmdk/boot_serial.axf | Bin 0 -> 25444 bytes .../ek-lm4f232/boot_serial/rvmdk/boot_serial.bin | Bin 0 -> 1192 bytes boards/ek-lm4f232/boot_usb/Makefile | 98 + boards/ek-lm4f232/boot_usb/bl_config.h | 1137 + boards/ek-lm4f232/boot_usb/boot_usb.ewd | 614 + boards/ek-lm4f232/boot_usb/boot_usb.ewp | 821 + boards/ek-lm4f232/boot_usb/boot_usb.uvopt | 450 + boards/ek-lm4f232/boot_usb/boot_usb.uvproj | 479 + boards/ek-lm4f232/boot_usb/ccs/.ccsimportspec | 6 + boards/ek-lm4f232/boot_usb/ccs/.ccsproject | 10 + boards/ek-lm4f232/boot_usb/ccs/.cproject | 191 + boards/ek-lm4f232/boot_usb/ccs/.project | 115 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-lm4f232/boot_usb/ccs/Debug/boot_usb.bin | Bin 0 -> 4009 bytes boards/ek-lm4f232/boot_usb/ccs/Debug/boot_usb.out | Bin 0 -> 95838 bytes boards/ek-lm4f232/boot_usb/ccs/macros.ini_initial | 1 + boards/ek-lm4f232/boot_usb/ccs/target_config.ccxml | 13 + boards/ek-lm4f232/boot_usb/ewarm/Exe/boot_usb.bin | Bin 0 -> 3812 bytes boards/ek-lm4f232/boot_usb/ewarm/Exe/boot_usb.out | Bin 0 -> 90744 bytes boards/ek-lm4f232/boot_usb/gcc/boot_usb.axf | Bin 0 -> 43052 bytes boards/ek-lm4f232/boot_usb/gcc/boot_usb.bin | Bin 0 -> 4162 bytes boards/ek-lm4f232/boot_usb/rvmdk/boot_usb.axf | Bin 0 -> 60640 bytes boards/ek-lm4f232/boot_usb/rvmdk/boot_usb.bin | Bin 0 -> 3920 bytes boards/ek-lm4f232/drivers/buttons.c | 186 + boards/ek-lm4f232/drivers/buttons.h | 103 + boards/ek-lm4f232/drivers/cfal96x64x16.c | 816 + boards/ek-lm4f232/drivers/cfal96x64x16.h | 37 + boards/ek-lm4f232/drivers/slidemenuwidget.c | 1424 + boards/ek-lm4f232/drivers/slidemenuwidget.h | 457 + boards/ek-lm4f232/drivers/stripchartwidget.c | 672 + boards/ek-lm4f232/drivers/stripchartwidget.h | 392 + boards/ek-lm4f232/drivers/usb_sound.c | 804 + boards/ek-lm4f232/drivers/usb_sound.h | 81 + boards/ek-lm4f232/ek-lm4f232.eww | 226 + boards/ek-lm4f232/ek-lm4f232.uvmpw | 165 + boards/ek-lm4f232/hello/Makefile | 89 + boards/ek-lm4f232/hello/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/hello/ccs/.ccsproject | 10 + boards/ek-lm4f232/hello/ccs/.cproject | 191 + boards/ek-lm4f232/hello/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-lm4f232/hello/ccs/Debug/hello.bin | Bin 0 -> 7424 bytes boards/ek-lm4f232/hello/ccs/Debug/hello.out | Bin 0 -> 147844 bytes boards/ek-lm4f232/hello/ccs/macros.ini_initial | 1 + boards/ek-lm4f232/hello/ccs/target_config.ccxml | 13 + boards/ek-lm4f232/hello/ewarm/Exe/hello.bin | Bin 0 -> 6528 bytes boards/ek-lm4f232/hello/ewarm/Exe/hello.out | Bin 0 -> 108896 bytes boards/ek-lm4f232/hello/gcc/hello.axf | Bin 0 -> 69220 bytes boards/ek-lm4f232/hello/gcc/hello.bin | Bin 0 -> 6530 bytes boards/ek-lm4f232/hello/hello.c | 183 + boards/ek-lm4f232/hello/hello.ewd | 614 + boards/ek-lm4f232/hello/hello.ewp | 795 + boards/ek-lm4f232/hello/hello.icf | 78 + boards/ek-lm4f232/hello/hello.ld | 57 + boards/ek-lm4f232/hello/hello.sct | 47 + boards/ek-lm4f232/hello/hello.uvopt | 331 + boards/ek-lm4f232/hello/hello.uvproj | 439 + boards/ek-lm4f232/hello/hello_ccs.cmd | 70 + boards/ek-lm4f232/hello/readme.txt | 27 + boards/ek-lm4f232/hello/rvmdk/hello.axf | Bin 0 -> 125048 bytes boards/ek-lm4f232/hello/rvmdk/hello.bin | Bin 0 -> 6688 bytes boards/ek-lm4f232/hello/startup_ccs.c | 295 + boards/ek-lm4f232/hello/startup_ewarm.c | 326 + boards/ek-lm4f232/hello/startup_gcc.c | 342 + boards/ek-lm4f232/hello/startup_rvmdk.S | 351 + boards/ek-lm4f232/hibernate/Makefile | 91 + boards/ek-lm4f232/hibernate/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/hibernate/ccs/.ccsproject | 10 + boards/ek-lm4f232/hibernate/ccs/.cproject | 191 + boards/ek-lm4f232/hibernate/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ek-lm4f232/hibernate/ccs/Debug/hibernate.bin | Bin 0 -> 9240 bytes .../ek-lm4f232/hibernate/ccs/Debug/hibernate.out | Bin 0 -> 186275 bytes boards/ek-lm4f232/hibernate/ccs/macros.ini_initial | 1 + .../ek-lm4f232/hibernate/ccs/target_config.ccxml | 13 + .../ek-lm4f232/hibernate/ewarm/Exe/hibernate.bin | Bin 0 -> 7856 bytes .../ek-lm4f232/hibernate/ewarm/Exe/hibernate.out | Bin 0 -> 175304 bytes boards/ek-lm4f232/hibernate/gcc/hibernate.axf | Bin 0 -> 70911 bytes boards/ek-lm4f232/hibernate/gcc/hibernate.bin | Bin 0 -> 8448 bytes boards/ek-lm4f232/hibernate/hibernate.c | 545 + boards/ek-lm4f232/hibernate/hibernate.ewd | 614 + boards/ek-lm4f232/hibernate/hibernate.ewp | 801 + boards/ek-lm4f232/hibernate/hibernate.icf | 78 + boards/ek-lm4f232/hibernate/hibernate.ld | 57 + boards/ek-lm4f232/hibernate/hibernate.sct | 47 + boards/ek-lm4f232/hibernate/hibernate.uvopt | 359 + boards/ek-lm4f232/hibernate/hibernate.uvproj | 449 + boards/ek-lm4f232/hibernate/hibernate_ccs.cmd | 70 + boards/ek-lm4f232/hibernate/readme.txt | 30 + boards/ek-lm4f232/hibernate/rvmdk/hibernate.axf | Bin 0 -> 142640 bytes boards/ek-lm4f232/hibernate/rvmdk/hibernate.bin | Bin 0 -> 8556 bytes boards/ek-lm4f232/hibernate/startup_ccs.c | 302 + boards/ek-lm4f232/hibernate/startup_ewarm.c | 333 + boards/ek-lm4f232/hibernate/startup_gcc.c | 349 + boards/ek-lm4f232/hibernate/startup_rvmdk.S | 358 + boards/ek-lm4f232/interrupts/Makefile | 87 + boards/ek-lm4f232/interrupts/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/interrupts/ccs/.ccsproject | 10 + boards/ek-lm4f232/interrupts/ccs/.cproject | 191 + boards/ek-lm4f232/interrupts/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ek-lm4f232/interrupts/ccs/Debug/interrupts.bin | Bin 0 -> 6904 bytes .../ek-lm4f232/interrupts/ccs/Debug/interrupts.out | Bin 0 -> 127672 bytes .../ek-lm4f232/interrupts/ccs/macros.ini_initial | 1 + .../ek-lm4f232/interrupts/ccs/target_config.ccxml | 13 + .../ek-lm4f232/interrupts/ewarm/Exe/interrupts.bin | Bin 0 -> 6020 bytes .../ek-lm4f232/interrupts/ewarm/Exe/interrupts.out | Bin 0 -> 106732 bytes boards/ek-lm4f232/interrupts/gcc/interrupts.axf | Bin 0 -> 69084 bytes boards/ek-lm4f232/interrupts/gcc/interrupts.bin | Bin 0 -> 6327 bytes boards/ek-lm4f232/interrupts/interrupts.c | 592 + boards/ek-lm4f232/interrupts/interrupts.ewd | 614 + boards/ek-lm4f232/interrupts/interrupts.ewp | 792 + boards/ek-lm4f232/interrupts/interrupts.icf | 78 + boards/ek-lm4f232/interrupts/interrupts.ld | 57 + boards/ek-lm4f232/interrupts/interrupts.sct | 47 + boards/ek-lm4f232/interrupts/interrupts.uvopt | 317 + boards/ek-lm4f232/interrupts/interrupts.uvproj | 434 + boards/ek-lm4f232/interrupts/interrupts_ccs.cmd | 70 + boards/ek-lm4f232/interrupts/readme.txt | 33 + boards/ek-lm4f232/interrupts/rvmdk/interrupts.axf | Bin 0 -> 118404 bytes boards/ek-lm4f232/interrupts/rvmdk/interrupts.bin | Bin 0 -> 6336 bytes boards/ek-lm4f232/interrupts/startup_ccs.c | 304 + boards/ek-lm4f232/interrupts/startup_ewarm.c | 335 + boards/ek-lm4f232/interrupts/startup_gcc.c | 351 + boards/ek-lm4f232/interrupts/startup_rvmdk.S | 360 + boards/ek-lm4f232/mpu_fault/Makefile | 87 + boards/ek-lm4f232/mpu_fault/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/mpu_fault/ccs/.ccsproject | 10 + boards/ek-lm4f232/mpu_fault/ccs/.cproject | 191 + boards/ek-lm4f232/mpu_fault/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ek-lm4f232/mpu_fault/ccs/Debug/mpu_fault.bin | Bin 0 -> 6184 bytes .../ek-lm4f232/mpu_fault/ccs/Debug/mpu_fault.out | Bin 0 -> 121928 bytes boards/ek-lm4f232/mpu_fault/ccs/macros.ini_initial | 1 + .../ek-lm4f232/mpu_fault/ccs/target_config.ccxml | 13 + .../ek-lm4f232/mpu_fault/ewarm/Exe/mpu_fault.bin | Bin 0 -> 5488 bytes .../ek-lm4f232/mpu_fault/ewarm/Exe/mpu_fault.out | Bin 0 -> 95544 bytes boards/ek-lm4f232/mpu_fault/gcc/mpu_fault.axf | Bin 0 -> 68870 bytes boards/ek-lm4f232/mpu_fault/gcc/mpu_fault.bin | Bin 0 -> 5683 bytes boards/ek-lm4f232/mpu_fault/mpu_fault.c | 413 + boards/ek-lm4f232/mpu_fault/mpu_fault.ewd | 614 + boards/ek-lm4f232/mpu_fault/mpu_fault.ewp | 792 + boards/ek-lm4f232/mpu_fault/mpu_fault.icf | 78 + boards/ek-lm4f232/mpu_fault/mpu_fault.ld | 57 + boards/ek-lm4f232/mpu_fault/mpu_fault.sct | 47 + boards/ek-lm4f232/mpu_fault/mpu_fault.uvopt | 317 + boards/ek-lm4f232/mpu_fault/mpu_fault.uvproj | 434 + boards/ek-lm4f232/mpu_fault/mpu_fault_ccs.cmd | 70 + boards/ek-lm4f232/mpu_fault/readme.txt | 25 + boards/ek-lm4f232/mpu_fault/rvmdk/mpu_fault.axf | Bin 0 -> 115316 bytes boards/ek-lm4f232/mpu_fault/rvmdk/mpu_fault.bin | Bin 0 -> 5624 bytes boards/ek-lm4f232/mpu_fault/startup_ccs.c | 302 + boards/ek-lm4f232/mpu_fault/startup_ewarm.c | 333 + boards/ek-lm4f232/mpu_fault/startup_gcc.c | 349 + boards/ek-lm4f232/mpu_fault/startup_rvmdk.S | 358 + boards/ek-lm4f232/qs-logger/Makefile | 108 + boards/ek-lm4f232/qs-logger/acquire.c | 965 + boards/ek-lm4f232/qs-logger/acquire.h | 57 + boards/ek-lm4f232/qs-logger/ccs/.ccsimportspec | 27 + boards/ek-lm4f232/qs-logger/ccs/.ccsproject | 10 + boards/ek-lm4f232/qs-logger/ccs/.cproject | 195 + boards/ek-lm4f232/qs-logger/ccs/.project | 135 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ek-lm4f232/qs-logger/ccs/Debug/qs-logger.bin | Bin 0 -> 59472 bytes .../ek-lm4f232/qs-logger/ccs/Debug/qs-logger.out | Bin 0 -> 1147339 bytes boards/ek-lm4f232/qs-logger/ccs/macros.ini_initial | 1 + .../ek-lm4f232/qs-logger/ccs/target_config.ccxml | 13 + boards/ek-lm4f232/qs-logger/clocksetwidget.c | 1031 + boards/ek-lm4f232/qs-logger/clocksetwidget.h | 273 + .../ek-lm4f232/qs-logger/ewarm/Exe/qs-logger.bin | Bin 0 -> 55076 bytes .../ek-lm4f232/qs-logger/ewarm/Exe/qs-logger.out | Bin 0 -> 955736 bytes boards/ek-lm4f232/qs-logger/flashstore.c | 625 + boards/ek-lm4f232/qs-logger/flashstore.h | 60 + boards/ek-lm4f232/qs-logger/gcc/qs-logger.axf | Bin 0 -> 139804 bytes boards/ek-lm4f232/qs-logger/gcc/qs-logger.bin | Bin 0 -> 61648 bytes boards/ek-lm4f232/qs-logger/images.c | 865 + boards/ek-lm4f232/qs-logger/images.h | 37 + boards/ek-lm4f232/qs-logger/menus.c | 704 + boards/ek-lm4f232/qs-logger/menus.h | 83 + boards/ek-lm4f232/qs-logger/qs-logger.c | 1260 + boards/ek-lm4f232/qs-logger/qs-logger.ewd | 614 + boards/ek-lm4f232/qs-logger/qs-logger.ewp | 845 + boards/ek-lm4f232/qs-logger/qs-logger.h | 180 + boards/ek-lm4f232/qs-logger/qs-logger.icf | 78 + boards/ek-lm4f232/qs-logger/qs-logger.ld | 57 + boards/ek-lm4f232/qs-logger/qs-logger.sct | 47 + boards/ek-lm4f232/qs-logger/qs-logger.uvopt | 555 + boards/ek-lm4f232/qs-logger/qs-logger.uvproj | 519 + boards/ek-lm4f232/qs-logger/qs-logger_ccs.cmd | 70 + boards/ek-lm4f232/qs-logger/readme.txt | 93 + boards/ek-lm4f232/qs-logger/rvmdk/qs-logger.axf | Bin 0 -> 677900 bytes boards/ek-lm4f232/qs-logger/rvmdk/qs-logger.bin | Bin 0 -> 60312 bytes boards/ek-lm4f232/qs-logger/startup_ccs.c | 305 + boards/ek-lm4f232/qs-logger/startup_ewarm.c | 336 + boards/ek-lm4f232/qs-logger/startup_gcc.c | 352 + boards/ek-lm4f232/qs-logger/startup_rvmdk.S | 361 + boards/ek-lm4f232/qs-logger/stripchartmanager.c | 445 + boards/ek-lm4f232/qs-logger/stripchartmanager.h | 63 + boards/ek-lm4f232/qs-logger/usb_serial_structs.c | 217 + boards/ek-lm4f232/qs-logger/usb_serial_structs.h | 49 + boards/ek-lm4f232/qs-logger/usbserial.c | 459 + boards/ek-lm4f232/qs-logger/usbserial.h | 56 + boards/ek-lm4f232/qs-logger/usbstick.c | 814 + boards/ek-lm4f232/qs-logger/usbstick.h | 58 + boards/ek-lm4f232/sd_card/Makefile | 97 + boards/ek-lm4f232/sd_card/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/sd_card/ccs/.ccsproject | 10 + boards/ek-lm4f232/sd_card/ccs/.cproject | 195 + boards/ek-lm4f232/sd_card/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-lm4f232/sd_card/ccs/Debug/sd_card.bin | Bin 0 -> 46768 bytes boards/ek-lm4f232/sd_card/ccs/Debug/sd_card.out | Bin 0 -> 332773 bytes boards/ek-lm4f232/sd_card/ccs/macros.ini_initial | 1 + boards/ek-lm4f232/sd_card/ccs/target_config.ccxml | 13 + boards/ek-lm4f232/sd_card/ewarm/Exe/sd_card.bin | Bin 0 -> 45880 bytes boards/ek-lm4f232/sd_card/ewarm/Exe/sd_card.out | Bin 0 -> 274756 bytes boards/ek-lm4f232/sd_card/gcc/sd_card.axf | Bin 0 -> 107081 bytes boards/ek-lm4f232/sd_card/gcc/sd_card.bin | Bin 0 -> 47092 bytes boards/ek-lm4f232/sd_card/readme.txt | 34 + boards/ek-lm4f232/sd_card/rvmdk/sd_card.axf | Bin 0 -> 219408 bytes boards/ek-lm4f232/sd_card/rvmdk/sd_card.bin | Bin 0 -> 45360 bytes boards/ek-lm4f232/sd_card/sd_card.c | 915 + boards/ek-lm4f232/sd_card/sd_card.ewd | 614 + boards/ek-lm4f232/sd_card/sd_card.ewp | 810 + boards/ek-lm4f232/sd_card/sd_card.icf | 78 + boards/ek-lm4f232/sd_card/sd_card.ld | 57 + boards/ek-lm4f232/sd_card/sd_card.sct | 47 + boards/ek-lm4f232/sd_card/sd_card.uvopt | 387 + boards/ek-lm4f232/sd_card/sd_card.uvproj | 459 + boards/ek-lm4f232/sd_card/sd_card_ccs.cmd | 70 + boards/ek-lm4f232/sd_card/startup_ccs.c | 302 + boards/ek-lm4f232/sd_card/startup_ewarm.c | 333 + boards/ek-lm4f232/sd_card/startup_gcc.c | 349 + boards/ek-lm4f232/sd_card/startup_rvmdk.S | 358 + boards/ek-lm4f232/sine_demo/Makefile | 88 + boards/ek-lm4f232/sine_demo/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/sine_demo/ccs/.ccsproject | 10 + boards/ek-lm4f232/sine_demo/ccs/.cproject | 191 + boards/ek-lm4f232/sine_demo/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ek-lm4f232/sine_demo/ccs/Debug/sine_demo.bin | Bin 0 -> 12872 bytes .../ek-lm4f232/sine_demo/ccs/Debug/sine_demo.out | Bin 0 -> 235469 bytes boards/ek-lm4f232/sine_demo/ccs/macros.ini_initial | 1 + .../ek-lm4f232/sine_demo/ccs/target_config.ccxml | 13 + .../ek-lm4f232/sine_demo/ewarm/Exe/sine_demo.bin | Bin 0 -> 11456 bytes .../ek-lm4f232/sine_demo/ewarm/Exe/sine_demo.out | Bin 0 -> 175656 bytes boards/ek-lm4f232/sine_demo/gcc/sine_demo.axf | Bin 0 -> 79857 bytes boards/ek-lm4f232/sine_demo/gcc/sine_demo.bin | Bin 0 -> 17944 bytes boards/ek-lm4f232/sine_demo/readme.txt | 24 + boards/ek-lm4f232/sine_demo/rvmdk/sine_demo.axf | Bin 0 -> 183384 bytes boards/ek-lm4f232/sine_demo/rvmdk/sine_demo.bin | Bin 0 -> 12096 bytes boards/ek-lm4f232/sine_demo/sine_demo.c | 332 + boards/ek-lm4f232/sine_demo/sine_demo.ewd | 614 + boards/ek-lm4f232/sine_demo/sine_demo.ewp | 795 + boards/ek-lm4f232/sine_demo/sine_demo.icf | 78 + boards/ek-lm4f232/sine_demo/sine_demo.ld | 57 + boards/ek-lm4f232/sine_demo/sine_demo.sct | 47 + boards/ek-lm4f232/sine_demo/sine_demo.uvopt | 331 + boards/ek-lm4f232/sine_demo/sine_demo.uvproj | 439 + boards/ek-lm4f232/sine_demo/sine_demo_ccs.cmd | 70 + boards/ek-lm4f232/sine_demo/startup_ccs.c | 302 + boards/ek-lm4f232/sine_demo/startup_ewarm.c | 333 + boards/ek-lm4f232/sine_demo/startup_gcc.c | 349 + boards/ek-lm4f232/sine_demo/startup_rvmdk.S | 358 + boards/ek-lm4f232/softuart_echo/Makefile | 89 + boards/ek-lm4f232/softuart_echo/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/softuart_echo/ccs/.ccsproject | 10 + boards/ek-lm4f232/softuart_echo/ccs/.cproject | 191 + boards/ek-lm4f232/softuart_echo/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../softuart_echo/ccs/Debug/softuart_echo.bin | Bin 0 -> 8152 bytes .../softuart_echo/ccs/Debug/softuart_echo.out | Bin 0 -> 166975 bytes .../softuart_echo/ccs/macros.ini_initial | 1 + .../softuart_echo/ccs/target_config.ccxml | 13 + .../softuart_echo/ewarm/Exe/softuart_echo.bin | Bin 0 -> 7228 bytes .../softuart_echo/ewarm/Exe/softuart_echo.out | Bin 0 -> 136204 bytes .../ek-lm4f232/softuart_echo/gcc/softuart_echo.axf | Bin 0 -> 70670 bytes .../ek-lm4f232/softuart_echo/gcc/softuart_echo.bin | Bin 0 -> 7815 bytes boards/ek-lm4f232/softuart_echo/readme.txt | 27 + .../softuart_echo/rvmdk/softuart_echo.axf | Bin 0 -> 141052 bytes .../softuart_echo/rvmdk/softuart_echo.bin | Bin 0 -> 7524 bytes boards/ek-lm4f232/softuart_echo/softuart_echo.c | 368 + boards/ek-lm4f232/softuart_echo/softuart_echo.ewd | 614 + boards/ek-lm4f232/softuart_echo/softuart_echo.ewp | 795 + boards/ek-lm4f232/softuart_echo/softuart_echo.icf | 78 + boards/ek-lm4f232/softuart_echo/softuart_echo.ld | 57 + boards/ek-lm4f232/softuart_echo/softuart_echo.sct | 47 + .../ek-lm4f232/softuart_echo/softuart_echo.uvopt | 331 + .../ek-lm4f232/softuart_echo/softuart_echo.uvproj | 439 + .../ek-lm4f232/softuart_echo/softuart_echo_ccs.cmd | 70 + boards/ek-lm4f232/softuart_echo/startup_ccs.c | 304 + boards/ek-lm4f232/softuart_echo/startup_ewarm.c | 335 + boards/ek-lm4f232/softuart_echo/startup_gcc.c | 351 + boards/ek-lm4f232/softuart_echo/startup_rvmdk.S | 360 + boards/ek-lm4f232/timers/Makefile | 87 + boards/ek-lm4f232/timers/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/timers/ccs/.ccsproject | 10 + boards/ek-lm4f232/timers/ccs/.cproject | 191 + boards/ek-lm4f232/timers/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-lm4f232/timers/ccs/Debug/timers.bin | Bin 0 -> 5840 bytes boards/ek-lm4f232/timers/ccs/Debug/timers.out | Bin 0 -> 121243 bytes boards/ek-lm4f232/timers/ccs/macros.ini_initial | 1 + boards/ek-lm4f232/timers/ccs/target_config.ccxml | 13 + boards/ek-lm4f232/timers/ewarm/Exe/timers.bin | Bin 0 -> 5160 bytes boards/ek-lm4f232/timers/ewarm/Exe/timers.out | Bin 0 -> 90240 bytes boards/ek-lm4f232/timers/gcc/timers.axf | Bin 0 -> 68756 bytes boards/ek-lm4f232/timers/gcc/timers.bin | Bin 0 -> 5259 bytes boards/ek-lm4f232/timers/readme.txt | 26 + boards/ek-lm4f232/timers/rvmdk/timers.axf | Bin 0 -> 115056 bytes boards/ek-lm4f232/timers/rvmdk/timers.bin | Bin 0 -> 5376 bytes boards/ek-lm4f232/timers/startup_ccs.c | 303 + boards/ek-lm4f232/timers/startup_ewarm.c | 334 + boards/ek-lm4f232/timers/startup_gcc.c | 350 + boards/ek-lm4f232/timers/startup_rvmdk.S | 359 + boards/ek-lm4f232/timers/timers.c | 234 + boards/ek-lm4f232/timers/timers.ewd | 614 + boards/ek-lm4f232/timers/timers.ewp | 792 + boards/ek-lm4f232/timers/timers.icf | 78 + boards/ek-lm4f232/timers/timers.ld | 57 + boards/ek-lm4f232/timers/timers.sct | 47 + boards/ek-lm4f232/timers/timers.uvopt | 317 + boards/ek-lm4f232/timers/timers.uvproj | 434 + boards/ek-lm4f232/timers/timers_ccs.cmd | 70 + boards/ek-lm4f232/uart_echo/Makefile | 87 + boards/ek-lm4f232/uart_echo/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/uart_echo/ccs/.ccsproject | 10 + boards/ek-lm4f232/uart_echo/ccs/.cproject | 191 + boards/ek-lm4f232/uart_echo/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ek-lm4f232/uart_echo/ccs/Debug/uart_echo.bin | Bin 0 -> 5888 bytes .../ek-lm4f232/uart_echo/ccs/Debug/uart_echo.out | Bin 0 -> 121186 bytes boards/ek-lm4f232/uart_echo/ccs/macros.ini_initial | 1 + .../ek-lm4f232/uart_echo/ccs/target_config.ccxml | 13 + .../ek-lm4f232/uart_echo/ewarm/Exe/uart_echo.bin | Bin 0 -> 5084 bytes .../ek-lm4f232/uart_echo/ewarm/Exe/uart_echo.out | Bin 0 -> 92212 bytes boards/ek-lm4f232/uart_echo/gcc/uart_echo.axf | Bin 0 -> 68662 bytes boards/ek-lm4f232/uart_echo/gcc/uart_echo.bin | Bin 0 -> 5279 bytes boards/ek-lm4f232/uart_echo/readme.txt | 26 + boards/ek-lm4f232/uart_echo/rvmdk/uart_echo.axf | Bin 0 -> 114952 bytes boards/ek-lm4f232/uart_echo/rvmdk/uart_echo.bin | Bin 0 -> 5400 bytes boards/ek-lm4f232/uart_echo/startup_ccs.c | 302 + boards/ek-lm4f232/uart_echo/startup_ewarm.c | 333 + boards/ek-lm4f232/uart_echo/startup_gcc.c | 349 + boards/ek-lm4f232/uart_echo/startup_rvmdk.S | 358 + boards/ek-lm4f232/uart_echo/uart_echo.c | 226 + boards/ek-lm4f232/uart_echo/uart_echo.ewd | 614 + boards/ek-lm4f232/uart_echo/uart_echo.ewp | 792 + boards/ek-lm4f232/uart_echo/uart_echo.icf | 78 + boards/ek-lm4f232/uart_echo/uart_echo.ld | 57 + boards/ek-lm4f232/uart_echo/uart_echo.sct | 47 + boards/ek-lm4f232/uart_echo/uart_echo.uvopt | 317 + boards/ek-lm4f232/uart_echo/uart_echo.uvproj | 434 + boards/ek-lm4f232/uart_echo/uart_echo_ccs.cmd | 70 + boards/ek-lm4f232/udma_demo/Makefile | 90 + boards/ek-lm4f232/udma_demo/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/udma_demo/ccs/.ccsproject | 10 + boards/ek-lm4f232/udma_demo/ccs/.cproject | 191 + boards/ek-lm4f232/udma_demo/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ek-lm4f232/udma_demo/ccs/Debug/udma_demo.bin | Bin 0 -> 7824 bytes .../ek-lm4f232/udma_demo/ccs/Debug/udma_demo.out | Bin 0 -> 154518 bytes boards/ek-lm4f232/udma_demo/ccs/macros.ini_initial | 1 + .../ek-lm4f232/udma_demo/ccs/target_config.ccxml | 13 + .../ek-lm4f232/udma_demo/ewarm/Exe/udma_demo.bin | Bin 0 -> 6808 bytes .../ek-lm4f232/udma_demo/ewarm/Exe/udma_demo.out | Bin 0 -> 121016 bytes boards/ek-lm4f232/udma_demo/gcc/udma_demo.axf | Bin 0 -> 70476 bytes boards/ek-lm4f232/udma_demo/gcc/udma_demo.bin | Bin 0 -> 7199 bytes boards/ek-lm4f232/udma_demo/readme.txt | 25 + boards/ek-lm4f232/udma_demo/rvmdk/udma_demo.axf | Bin 0 -> 128824 bytes boards/ek-lm4f232/udma_demo/rvmdk/udma_demo.bin | Bin 0 -> 7252 bytes boards/ek-lm4f232/udma_demo/startup_ccs.c | 305 + boards/ek-lm4f232/udma_demo/startup_ewarm.c | 336 + boards/ek-lm4f232/udma_demo/startup_gcc.c | 352 + boards/ek-lm4f232/udma_demo/startup_rvmdk.S | 361 + boards/ek-lm4f232/udma_demo/udma_demo.c | 916 + boards/ek-lm4f232/udma_demo/udma_demo.ewd | 614 + boards/ek-lm4f232/udma_demo/udma_demo.ewp | 798 + boards/ek-lm4f232/udma_demo/udma_demo.icf | 78 + boards/ek-lm4f232/udma_demo/udma_demo.ld | 57 + boards/ek-lm4f232/udma_demo/udma_demo.sct | 47 + boards/ek-lm4f232/udma_demo/udma_demo.uvopt | 345 + boards/ek-lm4f232/udma_demo/udma_demo.uvproj | 444 + boards/ek-lm4f232/udma_demo/udma_demo_ccs.cmd | 70 + boards/ek-lm4f232/usb_dev_bulk/Makefile | 92 + boards/ek-lm4f232/usb_dev_bulk/ccs/.ccsimportspec | 10 + boards/ek-lm4f232/usb_dev_bulk/ccs/.ccsproject | 10 + boards/ek-lm4f232/usb_dev_bulk/ccs/.cproject | 195 + boards/ek-lm4f232/usb_dev_bulk/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin | Bin 0 -> 18392 bytes .../usb_dev_bulk/ccs/Debug/usb_dev_bulk.out | Bin 0 -> 518500 bytes .../ek-lm4f232/usb_dev_bulk/ccs/macros.ini_initial | 1 + .../usb_dev_bulk/ccs/target_config.ccxml | 13 + .../usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin | Bin 0 -> 16960 bytes .../usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out | Bin 0 -> 379132 bytes .../ek-lm4f232/usb_dev_bulk/gcc/usb_dev_bulk.axf | Bin 0 -> 81939 bytes .../ek-lm4f232/usb_dev_bulk/gcc/usb_dev_bulk.bin | Bin 0 -> 17781 bytes boards/ek-lm4f232/usb_dev_bulk/readme.txt | 43 + .../ek-lm4f232/usb_dev_bulk/rvmdk/usb_dev_bulk.axf | Bin 0 -> 332804 bytes .../ek-lm4f232/usb_dev_bulk/rvmdk/usb_dev_bulk.bin | Bin 0 -> 18832 bytes boards/ek-lm4f232/usb_dev_bulk/startup_ccs.c | 304 + boards/ek-lm4f232/usb_dev_bulk/startup_ewarm.c | 335 + boards/ek-lm4f232/usb_dev_bulk/startup_gcc.c | 351 + boards/ek-lm4f232/usb_dev_bulk/startup_rvmdk.S | 360 + boards/ek-lm4f232/usb_dev_bulk/usb_bulk_structs.c | 200 + boards/ek-lm4f232/usb_dev_bulk/usb_bulk_structs.h | 48 + boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.c | 709 + boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ewd | 614 + boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ewp | 805 + boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.icf | 78 + boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ld | 57 + boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.sct | 47 + boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.uvopt | 373 + boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.uvproj | 454 + .../ek-lm4f232/usb_dev_bulk/usb_dev_bulk_ccs.cmd | 70 + boards/ek-lm4f232/usb_dev_keyboard/Makefile | 92 + .../ek-lm4f232/usb_dev_keyboard/ccs/.ccsimportspec | 10 + boards/ek-lm4f232/usb_dev_keyboard/ccs/.ccsproject | 10 + boards/ek-lm4f232/usb_dev_keyboard/ccs/.cproject | 195 + boards/ek-lm4f232/usb_dev_keyboard/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/usb_dev_keyboard.bin | Bin 0 -> 19448 bytes .../ccs/Debug/usb_dev_keyboard.out | Bin 0 -> 523487 bytes .../usb_dev_keyboard/ccs/macros.ini_initial | 1 + .../usb_dev_keyboard/ccs/target_config.ccxml | 13 + .../ewarm/Exe/usb_dev_keyboard.bin | Bin 0 -> 17868 bytes .../ewarm/Exe/usb_dev_keyboard.out | Bin 0 -> 389760 bytes .../usb_dev_keyboard/gcc/usb_dev_keyboard.axf | Bin 0 -> 82263 bytes .../usb_dev_keyboard/gcc/usb_dev_keyboard.bin | Bin 0 -> 18994 bytes boards/ek-lm4f232/usb_dev_keyboard/readme.txt | 37 + .../usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf | Bin 0 -> 346412 bytes .../usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin | Bin 0 -> 19880 bytes boards/ek-lm4f232/usb_dev_keyboard/startup_ccs.c | 304 + boards/ek-lm4f232/usb_dev_keyboard/startup_ewarm.c | 335 + boards/ek-lm4f232/usb_dev_keyboard/startup_gcc.c | 351 + boards/ek-lm4f232/usb_dev_keyboard/startup_rvmdk.S | 360 + .../ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.c | 731 + .../usb_dev_keyboard/usb_dev_keyboard.ewd | 614 + .../usb_dev_keyboard/usb_dev_keyboard.ewp | 805 + .../usb_dev_keyboard/usb_dev_keyboard.icf | 78 + .../usb_dev_keyboard/usb_dev_keyboard.ld | 57 + .../usb_dev_keyboard/usb_dev_keyboard.sct | 47 + .../usb_dev_keyboard/usb_dev_keyboard.uvopt | 373 + .../usb_dev_keyboard/usb_dev_keyboard.uvproj | 454 + .../usb_dev_keyboard/usb_dev_keyboard_ccs.cmd | 70 + .../ek-lm4f232/usb_dev_keyboard/usb_keyb_structs.c | 149 + .../ek-lm4f232/usb_dev_keyboard/usb_keyb_structs.h | 35 + boards/ek-lm4f232/usb_dev_msc/Makefile | 96 + boards/ek-lm4f232/usb_dev_msc/ccs/.ccsimportspec | 12 + boards/ek-lm4f232/usb_dev_msc/ccs/.ccsproject | 10 + boards/ek-lm4f232/usb_dev_msc/ccs/.cproject | 195 + boards/ek-lm4f232/usb_dev_msc/ccs/.project | 75 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_msc/ccs/Debug/usb_dev_msc.bin | Bin 0 -> 20424 bytes .../usb_dev_msc/ccs/Debug/usb_dev_msc.out | Bin 0 -> 502557 bytes .../ek-lm4f232/usb_dev_msc/ccs/macros.ini_initial | 1 + .../ek-lm4f232/usb_dev_msc/ccs/target_config.ccxml | 13 + .../usb_dev_msc/ewarm/Exe/usb_dev_msc.bin | Bin 0 -> 18840 bytes .../usb_dev_msc/ewarm/Exe/usb_dev_msc.out | Bin 0 -> 387896 bytes boards/ek-lm4f232/usb_dev_msc/gcc/usb_dev_msc.axf | Bin 0 -> 85209 bytes boards/ek-lm4f232/usb_dev_msc/gcc/usb_dev_msc.bin | Bin 0 -> 23816 bytes boards/ek-lm4f232/usb_dev_msc/readme.txt | 27 + .../ek-lm4f232/usb_dev_msc/rvmdk/usb_dev_msc.axf | Bin 0 -> 335020 bytes .../ek-lm4f232/usb_dev_msc/rvmdk/usb_dev_msc.bin | Bin 0 -> 20484 bytes boards/ek-lm4f232/usb_dev_msc/startup_ccs.c | 303 + boards/ek-lm4f232/usb_dev_msc/startup_ewarm.c | 334 + boards/ek-lm4f232/usb_dev_msc/startup_gcc.c | 350 + boards/ek-lm4f232/usb_dev_msc/startup_rvmdk.S | 359 + boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.c | 617 + boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ewd | 614 + boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ewp | 809 + boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.icf | 78 + boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ld | 57 + boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.sct | 47 + boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.uvopt | 387 + boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.uvproj | 459 + boards/ek-lm4f232/usb_dev_msc/usb_dev_msc_ccs.cmd | 70 + boards/ek-lm4f232/usb_dev_msc/usb_msc_structs.c | 191 + boards/ek-lm4f232/usb_dev_msc/usb_msc_structs.h | 43 + boards/ek-lm4f232/usb_dev_msc/usbdsdcard.c | 257 + boards/ek-lm4f232/usb_dev_msc/usbdsdcard.h | 43 + boards/ek-lm4f232/usb_dev_serial/Makefile | 92 + .../ek-lm4f232/usb_dev_serial/ccs/.ccsimportspec | 10 + boards/ek-lm4f232/usb_dev_serial/ccs/.ccsproject | 10 + boards/ek-lm4f232/usb_dev_serial/ccs/.cproject | 195 + boards/ek-lm4f232/usb_dev_serial/ccs/.project | 70 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_serial/ccs/Debug/usb_dev_serial.bin | Bin 0 -> 20520 bytes .../usb_dev_serial/ccs/Debug/usb_dev_serial.out | Bin 0 -> 549916 bytes .../usb_dev_serial/ccs/macros.ini_initial | 1 + .../usb_dev_serial/ccs/target_config.ccxml | 13 + .../usb_dev_serial/ewarm/Exe/usb_dev_serial.bin | Bin 0 -> 19052 bytes .../usb_dev_serial/ewarm/Exe/usb_dev_serial.out | Bin 0 -> 411448 bytes .../usb_dev_serial/gcc/usb_dev_serial.axf | Bin 0 -> 83087 bytes .../usb_dev_serial/gcc/usb_dev_serial.bin | Bin 0 -> 19993 bytes boards/ek-lm4f232/usb_dev_serial/readme.txt | 32 + .../usb_dev_serial/rvmdk/usb_dev_serial.axf | Bin 0 -> 382612 bytes .../usb_dev_serial/rvmdk/usb_dev_serial.bin | Bin 0 -> 21328 bytes boards/ek-lm4f232/usb_dev_serial/startup_ccs.c | 304 + boards/ek-lm4f232/usb_dev_serial/startup_ewarm.c | 335 + boards/ek-lm4f232/usb_dev_serial/startup_gcc.c | 351 + boards/ek-lm4f232/usb_dev_serial/startup_rvmdk.S | 360 + boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.c | 1441 + .../ek-lm4f232/usb_dev_serial/usb_dev_serial.ewd | 614 + .../ek-lm4f232/usb_dev_serial/usb_dev_serial.ewp | 805 + .../ek-lm4f232/usb_dev_serial/usb_dev_serial.icf | 78 + boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ld | 57 + .../ek-lm4f232/usb_dev_serial/usb_dev_serial.sct | 47 + .../ek-lm4f232/usb_dev_serial/usb_dev_serial.uvopt | 373 + .../usb_dev_serial/usb_dev_serial.uvproj | 454 + .../usb_dev_serial/usb_dev_serial_ccs.cmd | 70 + .../ek-lm4f232/usb_dev_serial/usb_serial_structs.c | 215 + .../ek-lm4f232/usb_dev_serial/usb_serial_structs.h | 49 + boards/ek-lm4f232/usb_host_audio/Makefile | 100 + .../ek-lm4f232/usb_host_audio/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/usb_host_audio/ccs/.ccsproject | 10 + boards/ek-lm4f232/usb_host_audio/ccs/.cproject | 197 + boards/ek-lm4f232/usb_host_audio/ccs/.project | 90 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_host_audio/ccs/Debug/usb_host_audio.bin | Bin 0 -> 41096 bytes .../usb_host_audio/ccs/Debug/usb_host_audio.out | Bin 0 -> 893628 bytes .../usb_host_audio/ccs/macros.ini_initial | 1 + .../usb_host_audio/ccs/target_config.ccxml | 13 + .../usb_host_audio/ewarm/Exe/usb_host_audio.bin | Bin 0 -> 38324 bytes .../usb_host_audio/ewarm/Exe/usb_host_audio.out | Bin 0 -> 728840 bytes .../usb_host_audio/gcc/usb_host_audio.axf | Bin 0 -> 126762 bytes .../usb_host_audio/gcc/usb_host_audio.bin | Bin 0 -> 41968 bytes boards/ek-lm4f232/usb_host_audio/readme.txt | 32 + .../usb_host_audio/rvmdk/usb_host_audio.axf | Bin 0 -> 542484 bytes .../usb_host_audio/rvmdk/usb_host_audio.bin | Bin 0 -> 42196 bytes boards/ek-lm4f232/usb_host_audio/startup_ccs.c | 303 + boards/ek-lm4f232/usb_host_audio/startup_ewarm.c | 334 + boards/ek-lm4f232/usb_host_audio/startup_gcc.c | 350 + boards/ek-lm4f232/usb_host_audio/startup_rvmdk.S | 359 + boards/ek-lm4f232/usb_host_audio/usb_host_audio.c | 1987 + .../ek-lm4f232/usb_host_audio/usb_host_audio.ewd | 614 + .../ek-lm4f232/usb_host_audio/usb_host_audio.ewp | 820 + .../ek-lm4f232/usb_host_audio/usb_host_audio.icf | 78 + boards/ek-lm4f232/usb_host_audio/usb_host_audio.ld | 57 + .../ek-lm4f232/usb_host_audio/usb_host_audio.sct | 47 + .../ek-lm4f232/usb_host_audio/usb_host_audio.uvopt | 429 + .../usb_host_audio/usb_host_audio.uvproj | 474 + .../usb_host_audio/usb_host_audio_ccs.cmd | 70 + boards/ek-lm4f232/usb_host_keyboard/Makefile | 90 + .../usb_host_keyboard/ccs/.ccsimportspec | 8 + .../ek-lm4f232/usb_host_keyboard/ccs/.ccsproject | 10 + boards/ek-lm4f232/usb_host_keyboard/ccs/.cproject | 193 + boards/ek-lm4f232/usb_host_keyboard/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/usb_host_keyboard.bin | Bin 0 -> 26048 bytes .../ccs/Debug/usb_host_keyboard.out | Bin 0 -> 625082 bytes .../usb_host_keyboard/ccs/macros.ini_initial | 1 + .../usb_host_keyboard/ccs/target_config.ccxml | 13 + .../ewarm/Exe/usb_host_keyboard.bin | Bin 0 -> 23932 bytes .../ewarm/Exe/usb_host_keyboard.out | Bin 0 -> 478228 bytes .../usb_host_keyboard/gcc/usb_host_keyboard.axf | Bin 0 -> 84749 bytes .../usb_host_keyboard/gcc/usb_host_keyboard.bin | Bin 0 -> 25598 bytes boards/ek-lm4f232/usb_host_keyboard/readme.txt | 30 + .../usb_host_keyboard/rvmdk/usb_host_keyboard.axf | Bin 0 -> 386088 bytes .../usb_host_keyboard/rvmdk/usb_host_keyboard.bin | Bin 0 -> 27236 bytes boards/ek-lm4f232/usb_host_keyboard/startup_ccs.c | 303 + .../ek-lm4f232/usb_host_keyboard/startup_ewarm.c | 334 + boards/ek-lm4f232/usb_host_keyboard/startup_gcc.c | 350 + .../ek-lm4f232/usb_host_keyboard/startup_rvmdk.S | 359 + .../usb_host_keyboard/usb_host_keyboard.c | 1143 + .../usb_host_keyboard/usb_host_keyboard.ewd | 614 + .../usb_host_keyboard/usb_host_keyboard.ewp | 798 + .../usb_host_keyboard/usb_host_keyboard.icf | 78 + .../usb_host_keyboard/usb_host_keyboard.ld | 57 + .../usb_host_keyboard/usb_host_keyboard.sct | 47 + .../usb_host_keyboard/usb_host_keyboard.uvopt | 345 + .../usb_host_keyboard/usb_host_keyboard.uvproj | 444 + .../usb_host_keyboard/usb_host_keyboard_ccs.cmd | 70 + boards/ek-lm4f232/usb_host_mouse/Makefile | 91 + .../ek-lm4f232/usb_host_mouse/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/usb_host_mouse/ccs/.ccsproject | 10 + boards/ek-lm4f232/usb_host_mouse/ccs/.cproject | 193 + boards/ek-lm4f232/usb_host_mouse/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_host_mouse/ccs/Debug/usb_host_mouse.bin | Bin 0 -> 24864 bytes .../usb_host_mouse/ccs/Debug/usb_host_mouse.out | Bin 0 -> 598089 bytes .../usb_host_mouse/ccs/macros.ini_initial | 1 + .../usb_host_mouse/ccs/target_config.ccxml | 13 + .../usb_host_mouse/ewarm/Exe/usb_host_mouse.bin | Bin 0 -> 22624 bytes .../usb_host_mouse/ewarm/Exe/usb_host_mouse.out | Bin 0 -> 484016 bytes .../usb_host_mouse/gcc/usb_host_mouse.axf | Bin 0 -> 83804 bytes .../usb_host_mouse/gcc/usb_host_mouse.bin | Bin 0 -> 24578 bytes boards/ek-lm4f232/usb_host_mouse/readme.txt | 25 + .../usb_host_mouse/rvmdk/usb_host_mouse.axf | Bin 0 -> 359508 bytes .../usb_host_mouse/rvmdk/usb_host_mouse.bin | Bin 0 -> 26392 bytes boards/ek-lm4f232/usb_host_mouse/startup_ccs.c | 303 + boards/ek-lm4f232/usb_host_mouse/startup_ewarm.c | 334 + boards/ek-lm4f232/usb_host_mouse/startup_gcc.c | 350 + boards/ek-lm4f232/usb_host_mouse/startup_rvmdk.S | 359 + boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.c | 803 + .../ek-lm4f232/usb_host_mouse/usb_host_mouse.ewd | 614 + .../ek-lm4f232/usb_host_mouse/usb_host_mouse.ewp | 801 + .../ek-lm4f232/usb_host_mouse/usb_host_mouse.icf | 78 + boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ld | 57 + .../ek-lm4f232/usb_host_mouse/usb_host_mouse.sct | 47 + .../ek-lm4f232/usb_host_mouse/usb_host_mouse.uvopt | 359 + .../usb_host_mouse/usb_host_mouse.uvproj | 449 + .../usb_host_mouse/usb_host_mouse_ccs.cmd | 70 + boards/ek-lm4f232/usb_host_msc/Makefile | 98 + boards/ek-lm4f232/usb_host_msc/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/usb_host_msc/ccs/.ccsproject | 10 + boards/ek-lm4f232/usb_host_msc/ccs/.cproject | 195 + boards/ek-lm4f232/usb_host_msc/ccs/.project | 85 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_host_msc/ccs/Debug/usb_host_msc.bin | Bin 0 -> 34616 bytes .../usb_host_msc/ccs/Debug/usb_host_msc.out | Bin 0 -> 786715 bytes .../ek-lm4f232/usb_host_msc/ccs/macros.ini_initial | 1 + .../usb_host_msc/ccs/target_config.ccxml | 13 + .../usb_host_msc/ewarm/Exe/usb_host_msc.bin | Bin 0 -> 32272 bytes .../usb_host_msc/ewarm/Exe/usb_host_msc.out | Bin 0 -> 625004 bytes .../ek-lm4f232/usb_host_msc/gcc/usb_host_msc.axf | Bin 0 -> 122016 bytes .../ek-lm4f232/usb_host_msc/gcc/usb_host_msc.bin | Bin 0 -> 35356 bytes boards/ek-lm4f232/usb_host_msc/readme.txt | 29 + .../ek-lm4f232/usb_host_msc/rvmdk/usb_host_msc.axf | Bin 0 -> 482912 bytes .../ek-lm4f232/usb_host_msc/rvmdk/usb_host_msc.bin | Bin 0 -> 36048 bytes boards/ek-lm4f232/usb_host_msc/startup_ccs.c | 303 + boards/ek-lm4f232/usb_host_msc/startup_ewarm.c | 334 + boards/ek-lm4f232/usb_host_msc/startup_gcc.c | 350 + boards/ek-lm4f232/usb_host_msc/startup_rvmdk.S | 359 + boards/ek-lm4f232/usb_host_msc/usb_host_msc.c | 1549 + boards/ek-lm4f232/usb_host_msc/usb_host_msc.ewd | 614 + boards/ek-lm4f232/usb_host_msc/usb_host_msc.ewp | 815 + boards/ek-lm4f232/usb_host_msc/usb_host_msc.icf | 78 + boards/ek-lm4f232/usb_host_msc/usb_host_msc.ld | 57 + boards/ek-lm4f232/usb_host_msc/usb_host_msc.sct | 47 + boards/ek-lm4f232/usb_host_msc/usb_host_msc.uvopt | 415 + boards/ek-lm4f232/usb_host_msc/usb_host_msc.uvproj | 469 + .../ek-lm4f232/usb_host_msc/usb_host_msc_ccs.cmd | 70 + boards/ek-lm4f232/usb_stick_demo/Makefile | 87 + .../ek-lm4f232/usb_stick_demo/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/usb_stick_demo/ccs/.ccsproject | 10 + boards/ek-lm4f232/usb_stick_demo/ccs/.cproject | 191 + boards/ek-lm4f232/usb_stick_demo/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_stick_demo/ccs/Debug/usb_stick_demo.bin | Bin 0 -> 6416 bytes .../usb_stick_demo/ccs/Debug/usb_stick_demo.out | Bin 0 -> 125517 bytes .../usb_stick_demo/ccs/macros.ini_initial | 1 + .../usb_stick_demo/ccs/target_config.ccxml | 13 + .../usb_stick_demo/ewarm/Exe/usb_stick_demo.bin | Bin 0 -> 5512 bytes .../usb_stick_demo/ewarm/Exe/usb_stick_demo.out | Bin 0 -> 105600 bytes .../usb_stick_demo/gcc/usb_stick_demo.axf | Bin 0 -> 36034 bytes .../usb_stick_demo/gcc/usb_stick_demo.bin | Bin 0 -> 5763 bytes boards/ek-lm4f232/usb_stick_demo/readme.txt | 39 + .../usb_stick_demo/rvmdk/usb_stick_demo.axf | Bin 0 -> 119224 bytes .../usb_stick_demo/rvmdk/usb_stick_demo.bin | Bin 0 -> 5888 bytes boards/ek-lm4f232/usb_stick_demo/startup_ccs.c | 295 + boards/ek-lm4f232/usb_stick_demo/startup_ewarm.c | 326 + boards/ek-lm4f232/usb_stick_demo/startup_gcc.c | 342 + boards/ek-lm4f232/usb_stick_demo/startup_rvmdk.S | 351 + boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.c | 274 + .../ek-lm4f232/usb_stick_demo/usb_stick_demo.ewd | 614 + .../ek-lm4f232/usb_stick_demo/usb_stick_demo.ewp | 792 + .../ek-lm4f232/usb_stick_demo/usb_stick_demo.icf | 78 + boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ld | 57 + .../ek-lm4f232/usb_stick_demo/usb_stick_demo.sct | 47 + .../ek-lm4f232/usb_stick_demo/usb_stick_demo.uvopt | 317 + .../usb_stick_demo/usb_stick_demo.uvproj | 434 + .../usb_stick_demo/usb_stick_demo_ccs.cmd | 70 + boards/ek-lm4f232/usb_stick_update/Makefile | 86 + .../ek-lm4f232/usb_stick_update/ccs/.ccsimportspec | 10 + boards/ek-lm4f232/usb_stick_update/ccs/.ccsproject | 10 + boards/ek-lm4f232/usb_stick_update/ccs/.cproject | 189 + boards/ek-lm4f232/usb_stick_update/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/usb_stick_update.bin | Bin 0 -> 16112 bytes .../ccs/Debug/usb_stick_update.out | Bin 0 -> 411199 bytes .../usb_stick_update/ccs/macros.ini_initial | 1 + .../usb_stick_update/ccs/target_config.ccxml | 13 + .../ewarm/Exe/usb_stick_update.bin | Bin 0 -> 14728 bytes .../ewarm/Exe/usb_stick_update.out | Bin 0 -> 314912 bytes .../usb_stick_update/gcc/usb_stick_update.axf | Bin 0 -> 79206 bytes .../usb_stick_update/gcc/usb_stick_update.bin | Bin 0 -> 16078 bytes boards/ek-lm4f232/usb_stick_update/readme.txt | 49 + .../usb_stick_update/rvmdk/usb_stick_update.axf | Bin 0 -> 225604 bytes .../usb_stick_update/rvmdk/usb_stick_update.bin | Bin 0 -> 17400 bytes boards/ek-lm4f232/usb_stick_update/simple_fs.c | 865 + boards/ek-lm4f232/usb_stick_update/simple_fs.h | 105 + boards/ek-lm4f232/usb_stick_update/startup_ccs.c | 303 + boards/ek-lm4f232/usb_stick_update/startup_ewarm.c | 334 + boards/ek-lm4f232/usb_stick_update/startup_gcc.c | 350 + boards/ek-lm4f232/usb_stick_update/startup_rvmdk.S | 359 + .../ek-lm4f232/usb_stick_update/usb_stick_update.c | 929 + .../usb_stick_update/usb_stick_update.ewd | 614 + .../usb_stick_update/usb_stick_update.ewp | 790 + .../usb_stick_update/usb_stick_update.icf | 78 + .../usb_stick_update/usb_stick_update.ld | 57 + .../usb_stick_update/usb_stick_update.sct | 47 + .../usb_stick_update/usb_stick_update.uvopt | 317 + .../usb_stick_update/usb_stick_update.uvproj | 434 + .../usb_stick_update/usb_stick_update_ccs.cmd | 70 + boards/ek-lm4f232/watchdog/Makefile | 88 + boards/ek-lm4f232/watchdog/ccs/.ccsimportspec | 8 + boards/ek-lm4f232/watchdog/ccs/.ccsproject | 10 + boards/ek-lm4f232/watchdog/ccs/.cproject | 191 + boards/ek-lm4f232/watchdog/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-lm4f232/watchdog/ccs/Debug/watchdog.bin | Bin 0 -> 6832 bytes boards/ek-lm4f232/watchdog/ccs/Debug/watchdog.out | Bin 0 -> 137496 bytes boards/ek-lm4f232/watchdog/ccs/macros.ini_initial | 1 + boards/ek-lm4f232/watchdog/ccs/target_config.ccxml | 13 + boards/ek-lm4f232/watchdog/ewarm/Exe/watchdog.bin | Bin 0 -> 5968 bytes boards/ek-lm4f232/watchdog/ewarm/Exe/watchdog.out | Bin 0 -> 116396 bytes boards/ek-lm4f232/watchdog/gcc/watchdog.axf | Bin 0 -> 69292 bytes boards/ek-lm4f232/watchdog/gcc/watchdog.bin | Bin 0 -> 6217 bytes boards/ek-lm4f232/watchdog/readme.txt | 28 + boards/ek-lm4f232/watchdog/rvmdk/watchdog.axf | Bin 0 -> 123256 bytes boards/ek-lm4f232/watchdog/rvmdk/watchdog.bin | Bin 0 -> 6276 bytes boards/ek-lm4f232/watchdog/startup_ccs.c | 302 + boards/ek-lm4f232/watchdog/startup_ewarm.c | 333 + boards/ek-lm4f232/watchdog/startup_gcc.c | 349 + boards/ek-lm4f232/watchdog/startup_rvmdk.S | 358 + boards/ek-lm4f232/watchdog/watchdog.c | 268 + boards/ek-lm4f232/watchdog/watchdog.ewd | 614 + boards/ek-lm4f232/watchdog/watchdog.ewp | 795 + boards/ek-lm4f232/watchdog/watchdog.icf | 78 + boards/ek-lm4f232/watchdog/watchdog.ld | 57 + boards/ek-lm4f232/watchdog/watchdog.sct | 47 + boards/ek-lm4f232/watchdog/watchdog.uvopt | 331 + boards/ek-lm4f232/watchdog/watchdog.uvproj | 439 + boards/ek-lm4f232/watchdog/watchdog_ccs.cmd | 70 + boards/ek-tm4c123gxl/Makefile | 61 + boards/ek-tm4c123gxl/bitband/Makefile | 86 + boards/ek-tm4c123gxl/bitband/bitband.c | 262 + boards/ek-tm4c123gxl/bitband/bitband.ewd | 614 + boards/ek-tm4c123gxl/bitband/bitband.ewp | 789 + boards/ek-tm4c123gxl/bitband/bitband.icf | 78 + boards/ek-tm4c123gxl/bitband/bitband.ld | 57 + boards/ek-tm4c123gxl/bitband/bitband.sct | 47 + boards/ek-tm4c123gxl/bitband/bitband.uvopt | 303 + boards/ek-tm4c123gxl/bitband/bitband.uvproj | 429 + boards/ek-tm4c123gxl/bitband/bitband_ccs.cmd | 70 + boards/ek-tm4c123gxl/bitband/ccs/.ccsimportspec | 8 + boards/ek-tm4c123gxl/bitband/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/bitband/ccs/.cproject | 189 + boards/ek-tm4c123gxl/bitband/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-tm4c123gxl/bitband/ccs/Debug/bitband.bin | Bin 0 -> 2728 bytes boards/ek-tm4c123gxl/bitband/ccs/Debug/bitband.out | Bin 0 -> 61905 bytes .../ek-tm4c123gxl/bitband/ccs/macros.ini_initial | 1 + .../ek-tm4c123gxl/bitband/ccs/target_config.ccxml | 13 + boards/ek-tm4c123gxl/bitband/ewarm/Exe/bitband.bin | Bin 0 -> 1968 bytes boards/ek-tm4c123gxl/bitband/ewarm/Exe/bitband.out | Bin 0 -> 34720 bytes boards/ek-tm4c123gxl/bitband/gcc/bitband.axf | Bin 0 -> 36359 bytes boards/ek-tm4c123gxl/bitband/gcc/bitband.bin | Bin 0 -> 1820 bytes boards/ek-tm4c123gxl/bitband/readme.txt | 29 + boards/ek-tm4c123gxl/bitband/rvmdk/bitband.axf | Bin 0 -> 20300 bytes boards/ek-tm4c123gxl/bitband/rvmdk/bitband.bin | Bin 0 -> 1824 bytes boards/ek-tm4c123gxl/bitband/startup_ccs.c | 295 + boards/ek-tm4c123gxl/bitband/startup_ewarm.c | 326 + boards/ek-tm4c123gxl/bitband/startup_gcc.c | 342 + boards/ek-tm4c123gxl/bitband/startup_rvmdk.S | 351 + boards/ek-tm4c123gxl/blinky/Makefile | 77 + boards/ek-tm4c123gxl/blinky/blinky.c | 94 + boards/ek-tm4c123gxl/blinky/blinky.ewd | 614 + boards/ek-tm4c123gxl/blinky/blinky.ewp | 777 + boards/ek-tm4c123gxl/blinky/blinky.icf | 78 + boards/ek-tm4c123gxl/blinky/blinky.ld | 57 + boards/ek-tm4c123gxl/blinky/blinky.sct | 47 + boards/ek-tm4c123gxl/blinky/blinky.uvopt | 268 + boards/ek-tm4c123gxl/blinky/blinky.uvproj | 414 + boards/ek-tm4c123gxl/blinky/blinky_ccs.cmd | 70 + boards/ek-tm4c123gxl/blinky/ccs/.ccsimportspec | 8 + boards/ek-tm4c123gxl/blinky/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/blinky/ccs/.cproject | 183 + boards/ek-tm4c123gxl/blinky/ccs/.project | 50 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-tm4c123gxl/blinky/ccs/Debug/blinky.bin | Bin 0 -> 1424 bytes boards/ek-tm4c123gxl/blinky/ccs/Debug/blinky.out | Bin 0 -> 32106 bytes boards/ek-tm4c123gxl/blinky/ccs/macros.ini_initial | 1 + .../ek-tm4c123gxl/blinky/ccs/target_config.ccxml | 13 + boards/ek-tm4c123gxl/blinky/ewarm/Exe/blinky.bin | Bin 0 -> 848 bytes boards/ek-tm4c123gxl/blinky/ewarm/Exe/blinky.out | Bin 0 -> 13476 bytes boards/ek-tm4c123gxl/blinky/gcc/blinky.axf | Bin 0 -> 34684 bytes boards/ek-tm4c123gxl/blinky/gcc/blinky.bin | Bin 0 -> 804 bytes boards/ek-tm4c123gxl/blinky/readme.txt | 24 + boards/ek-tm4c123gxl/blinky/rvmdk/blinky.axf | Bin 0 -> 10336 bytes boards/ek-tm4c123gxl/blinky/rvmdk/blinky.bin | Bin 0 -> 852 bytes boards/ek-tm4c123gxl/blinky/startup_ccs.c | 295 + boards/ek-tm4c123gxl/blinky/startup_ewarm.c | 326 + boards/ek-tm4c123gxl/blinky/startup_gcc.c | 342 + boards/ek-tm4c123gxl/blinky/startup_rvmdk.S | 351 + boards/ek-tm4c123gxl/drivers/buttons.c | 196 + boards/ek-tm4c123gxl/drivers/buttons.h | 107 + boards/ek-tm4c123gxl/drivers/rgb.c | 404 + boards/ek-tm4c123gxl/drivers/rgb.h | 142 + boards/ek-tm4c123gxl/ek-tm4c123gxl.eww | 128 + boards/ek-tm4c123gxl/ek-tm4c123gxl.uvmpw | 95 + .../ek-tm4c123gxl/freertos_demo/FreeRTOSConfig.h | 107 + boards/ek-tm4c123gxl/freertos_demo/Makefile | 105 + .../ek-tm4c123gxl/freertos_demo/ccs/.ccsimportspec | 14 + boards/ek-tm4c123gxl/freertos_demo/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/freertos_demo/ccs/.cproject | 199 + boards/ek-tm4c123gxl/freertos_demo/ccs/.project | 110 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../freertos_demo/ccs/Debug/freertos_demo.bin | Bin 0 -> 8240 bytes .../freertos_demo/ccs/Debug/freertos_demo.out | Bin 0 -> 203333 bytes .../freertos_demo/ccs/macros.ini_initial | 1 + .../freertos_demo/ccs/target_config.ccxml | 13 + .../freertos_demo/ewarm/Exe/freertos_demo.bin | Bin 0 -> 7588 bytes .../freertos_demo/ewarm/Exe/freertos_demo.out | Bin 0 -> 156456 bytes boards/ek-tm4c123gxl/freertos_demo/freertos_demo.c | 218 + .../ek-tm4c123gxl/freertos_demo/freertos_demo.ewd | 614 + .../ek-tm4c123gxl/freertos_demo/freertos_demo.ewp | 832 + .../ek-tm4c123gxl/freertos_demo/freertos_demo.icf | 78 + .../ek-tm4c123gxl/freertos_demo/freertos_demo.ld | 57 + .../ek-tm4c123gxl/freertos_demo/freertos_demo.sct | 47 + .../freertos_demo/freertos_demo.uvopt | 443 + .../freertos_demo/freertos_demo.uvproj | 479 + .../freertos_demo/freertos_demo_ccs.cmd | 70 + .../freertos_demo/gcc/freertos_demo.axf | Bin 0 -> 77184 bytes .../freertos_demo/gcc/freertos_demo.bin | Bin 0 -> 8100 bytes boards/ek-tm4c123gxl/freertos_demo/led_task.c | 237 + boards/ek-tm4c123gxl/freertos_demo/led_task.h | 35 + boards/ek-tm4c123gxl/freertos_demo/priorities.h | 37 + boards/ek-tm4c123gxl/freertos_demo/readme.txt | 51 + .../freertos_demo/rvmdk/freertos_demo.axf | Bin 0 -> 97968 bytes .../freertos_demo/rvmdk/freertos_demo.bin | Bin 0 -> 6872 bytes boards/ek-tm4c123gxl/freertos_demo/startup_ccs.c | 304 + boards/ek-tm4c123gxl/freertos_demo/startup_ewarm.c | 335 + boards/ek-tm4c123gxl/freertos_demo/startup_gcc.c | 351 + boards/ek-tm4c123gxl/freertos_demo/startup_rvmdk.S | 360 + boards/ek-tm4c123gxl/freertos_demo/switch_task.c | 177 + boards/ek-tm4c123gxl/freertos_demo/switch_task.h | 35 + boards/ek-tm4c123gxl/gpio_jtag/Makefile | 88 + boards/ek-tm4c123gxl/gpio_jtag/ccs/.ccsimportspec | 8 + boards/ek-tm4c123gxl/gpio_jtag/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/gpio_jtag/ccs/.cproject | 189 + boards/ek-tm4c123gxl/gpio_jtag/ccs/.project | 60 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../gpio_jtag/ccs/Debug/gpio_jtag.bin | Bin 0 -> 3576 bytes .../gpio_jtag/ccs/Debug/gpio_jtag.out | Bin 0 -> 76307 bytes .../ek-tm4c123gxl/gpio_jtag/ccs/macros.ini_initial | 1 + .../gpio_jtag/ccs/target_config.ccxml | 13 + .../gpio_jtag/ewarm/Exe/gpio_jtag.bin | Bin 0 -> 2816 bytes .../gpio_jtag/ewarm/Exe/gpio_jtag.out | Bin 0 -> 56412 bytes boards/ek-tm4c123gxl/gpio_jtag/gcc/gpio_jtag.axf | Bin 0 -> 68172 bytes boards/ek-tm4c123gxl/gpio_jtag/gcc/gpio_jtag.bin | Bin 0 -> 2713 bytes boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.c | 316 + boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ewd | 614 + boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ewp | 792 + boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.icf | 78 + boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ld | 57 + boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.sct | 47 + boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.uvopt | 317 + boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.uvproj | 434 + boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag_ccs.cmd | 70 + boards/ek-tm4c123gxl/gpio_jtag/readme.txt | 33 + boards/ek-tm4c123gxl/gpio_jtag/rvmdk/gpio_jtag.axf | Bin 0 -> 30276 bytes boards/ek-tm4c123gxl/gpio_jtag/rvmdk/gpio_jtag.bin | Bin 0 -> 3068 bytes boards/ek-tm4c123gxl/gpio_jtag/startup_ccs.c | 302 + boards/ek-tm4c123gxl/gpio_jtag/startup_ewarm.c | 333 + boards/ek-tm4c123gxl/gpio_jtag/startup_gcc.c | 349 + boards/ek-tm4c123gxl/gpio_jtag/startup_rvmdk.S | 358 + boards/ek-tm4c123gxl/hello/Makefile | 85 + boards/ek-tm4c123gxl/hello/ccs/.ccsimportspec | 8 + boards/ek-tm4c123gxl/hello/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/hello/ccs/.cproject | 187 + boards/ek-tm4c123gxl/hello/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-tm4c123gxl/hello/ccs/Debug/hello.bin | Bin 0 -> 2904 bytes boards/ek-tm4c123gxl/hello/ccs/Debug/hello.out | Bin 0 -> 63079 bytes boards/ek-tm4c123gxl/hello/ccs/macros.ini_initial | 1 + boards/ek-tm4c123gxl/hello/ccs/target_config.ccxml | 13 + boards/ek-tm4c123gxl/hello/ewarm/Exe/hello.bin | Bin 0 -> 2248 bytes boards/ek-tm4c123gxl/hello/ewarm/Exe/hello.out | Bin 0 -> 41692 bytes boards/ek-tm4c123gxl/hello/gcc/hello.axf | Bin 0 -> 36780 bytes boards/ek-tm4c123gxl/hello/gcc/hello.bin | Bin 0 -> 2096 bytes boards/ek-tm4c123gxl/hello/hello.c | 167 + boards/ek-tm4c123gxl/hello/hello.ewd | 614 + boards/ek-tm4c123gxl/hello/hello.ewp | 787 + boards/ek-tm4c123gxl/hello/hello.icf | 78 + boards/ek-tm4c123gxl/hello/hello.ld | 57 + boards/ek-tm4c123gxl/hello/hello.sct | 47 + boards/ek-tm4c123gxl/hello/hello.uvopt | 303 + boards/ek-tm4c123gxl/hello/hello.uvproj | 429 + boards/ek-tm4c123gxl/hello/hello_ccs.cmd | 70 + boards/ek-tm4c123gxl/hello/readme.txt | 27 + boards/ek-tm4c123gxl/hello/rvmdk/hello.axf | Bin 0 -> 24180 bytes boards/ek-tm4c123gxl/hello/rvmdk/hello.bin | Bin 0 -> 2480 bytes boards/ek-tm4c123gxl/hello/startup_ccs.c | 295 + boards/ek-tm4c123gxl/hello/startup_ewarm.c | 326 + boards/ek-tm4c123gxl/hello/startup_gcc.c | 342 + boards/ek-tm4c123gxl/hello/startup_rvmdk.S | 351 + boards/ek-tm4c123gxl/interrupts/Makefile | 85 + boards/ek-tm4c123gxl/interrupts/ccs/.ccsimportspec | 8 + boards/ek-tm4c123gxl/interrupts/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/interrupts/ccs/.cproject | 187 + boards/ek-tm4c123gxl/interrupts/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../interrupts/ccs/Debug/interrupts.bin | Bin 0 -> 3472 bytes .../interrupts/ccs/Debug/interrupts.out | Bin 0 -> 67259 bytes .../interrupts/ccs/macros.ini_initial | 1 + .../interrupts/ccs/target_config.ccxml | 13 + .../interrupts/ewarm/Exe/interrupts.bin | Bin 0 -> 2580 bytes .../interrupts/ewarm/Exe/interrupts.out | Bin 0 -> 45900 bytes boards/ek-tm4c123gxl/interrupts/gcc/interrupts.axf | Bin 0 -> 37518 bytes boards/ek-tm4c123gxl/interrupts/gcc/interrupts.bin | Bin 0 -> 2608 bytes boards/ek-tm4c123gxl/interrupts/interrupts.c | 549 + boards/ek-tm4c123gxl/interrupts/interrupts.ewd | 614 + boards/ek-tm4c123gxl/interrupts/interrupts.ewp | 787 + boards/ek-tm4c123gxl/interrupts/interrupts.icf | 78 + boards/ek-tm4c123gxl/interrupts/interrupts.ld | 57 + boards/ek-tm4c123gxl/interrupts/interrupts.sct | 47 + boards/ek-tm4c123gxl/interrupts/interrupts.uvopt | 303 + boards/ek-tm4c123gxl/interrupts/interrupts.uvproj | 429 + boards/ek-tm4c123gxl/interrupts/interrupts_ccs.cmd | 70 + boards/ek-tm4c123gxl/interrupts/readme.txt | 33 + .../ek-tm4c123gxl/interrupts/rvmdk/interrupts.axf | Bin 0 -> 23628 bytes .../ek-tm4c123gxl/interrupts/rvmdk/interrupts.bin | Bin 0 -> 2564 bytes boards/ek-tm4c123gxl/interrupts/startup_ccs.c | 304 + boards/ek-tm4c123gxl/interrupts/startup_ewarm.c | 335 + boards/ek-tm4c123gxl/interrupts/startup_gcc.c | 351 + boards/ek-tm4c123gxl/interrupts/startup_rvmdk.S | 360 + boards/ek-tm4c123gxl/mpu_fault/Makefile | 86 + boards/ek-tm4c123gxl/mpu_fault/ccs/.ccsimportspec | 8 + boards/ek-tm4c123gxl/mpu_fault/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/mpu_fault/ccs/.cproject | 187 + boards/ek-tm4c123gxl/mpu_fault/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../mpu_fault/ccs/Debug/mpu_fault.bin | Bin 0 -> 3072 bytes .../mpu_fault/ccs/Debug/mpu_fault.out | Bin 0 -> 62527 bytes .../ek-tm4c123gxl/mpu_fault/ccs/macros.ini_initial | 1 + .../mpu_fault/ccs/target_config.ccxml | 13 + .../mpu_fault/ewarm/Exe/mpu_fault.bin | Bin 0 -> 2264 bytes .../mpu_fault/ewarm/Exe/mpu_fault.out | Bin 0 -> 37400 bytes boards/ek-tm4c123gxl/mpu_fault/gcc/mpu_fault.axf | Bin 0 -> 36868 bytes boards/ek-tm4c123gxl/mpu_fault/gcc/mpu_fault.bin | Bin 0 -> 2172 bytes boards/ek-tm4c123gxl/mpu_fault/mpu_fault.c | 419 + boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ewd | 614 + boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ewp | 789 + boards/ek-tm4c123gxl/mpu_fault/mpu_fault.icf | 78 + boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ld | 57 + boards/ek-tm4c123gxl/mpu_fault/mpu_fault.sct | 47 + boards/ek-tm4c123gxl/mpu_fault/mpu_fault.uvopt | 303 + boards/ek-tm4c123gxl/mpu_fault/mpu_fault.uvproj | 429 + boards/ek-tm4c123gxl/mpu_fault/mpu_fault_ccs.cmd | 70 + boards/ek-tm4c123gxl/mpu_fault/readme.txt | 28 + boards/ek-tm4c123gxl/mpu_fault/rvmdk/mpu_fault.axf | Bin 0 -> 21096 bytes boards/ek-tm4c123gxl/mpu_fault/rvmdk/mpu_fault.bin | Bin 0 -> 2120 bytes boards/ek-tm4c123gxl/mpu_fault/startup_ccs.c | 302 + boards/ek-tm4c123gxl/mpu_fault/startup_ewarm.c | 333 + boards/ek-tm4c123gxl/mpu_fault/startup_gcc.c | 349 + boards/ek-tm4c123gxl/mpu_fault/startup_rvmdk.S | 358 + boards/ek-tm4c123gxl/project0/Makefile | 86 + boards/ek-tm4c123gxl/project0/ccs/.ccsimportspec | 8 + boards/ek-tm4c123gxl/project0/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/project0/ccs/.cproject | 189 + boards/ek-tm4c123gxl/project0/ccs/.project | 50 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ek-tm4c123gxl/project0/ccs/Debug/project0.bin | Bin 0 -> 2080 bytes .../ek-tm4c123gxl/project0/ccs/Debug/project0.out | Bin 0 -> 46032 bytes .../ek-tm4c123gxl/project0/ccs/macros.ini_initial | 1 + .../ek-tm4c123gxl/project0/ccs/target_config.ccxml | 13 + .../ek-tm4c123gxl/project0/ewarm/Exe/project0.bin | Bin 0 -> 1440 bytes .../ek-tm4c123gxl/project0/ewarm/Exe/project0.out | Bin 0 -> 29452 bytes boards/ek-tm4c123gxl/project0/gcc/project0.axf | Bin 0 -> 35847 bytes boards/ek-tm4c123gxl/project0/gcc/project0.bin | Bin 0 -> 1544 bytes boards/ek-tm4c123gxl/project0/project0.c | 114 + boards/ek-tm4c123gxl/project0/project0.ewd | 614 + boards/ek-tm4c123gxl/project0/project0.ewp | 786 + boards/ek-tm4c123gxl/project0/project0.icf | 78 + boards/ek-tm4c123gxl/project0/project0.ld | 57 + boards/ek-tm4c123gxl/project0/project0.sct | 47 + boards/ek-tm4c123gxl/project0/project0.uvopt | 289 + boards/ek-tm4c123gxl/project0/project0.uvproj | 424 + boards/ek-tm4c123gxl/project0/project0_ccs.cmd | 70 + boards/ek-tm4c123gxl/project0/readme.txt | 27 + boards/ek-tm4c123gxl/project0/rvmdk/project0.axf | Bin 0 -> 16876 bytes boards/ek-tm4c123gxl/project0/rvmdk/project0.bin | Bin 0 -> 1552 bytes boards/ek-tm4c123gxl/project0/startup_ccs.c | 295 + boards/ek-tm4c123gxl/project0/startup_ewarm.c | 326 + boards/ek-tm4c123gxl/project0/startup_gcc.c | 342 + boards/ek-tm4c123gxl/project0/startup_rvmdk.S | 351 + boards/ek-tm4c123gxl/qs-rgb/Makefile | 93 + boards/ek-tm4c123gxl/qs-rgb/ccs/.ccsimportspec | 11 + boards/ek-tm4c123gxl/qs-rgb/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/qs-rgb/ccs/.cproject | 193 + boards/ek-tm4c123gxl/qs-rgb/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-tm4c123gxl/qs-rgb/ccs/Debug/qs-rgb.bin | Bin 0 -> 8760 bytes boards/ek-tm4c123gxl/qs-rgb/ccs/Debug/qs-rgb.out | Bin 0 -> 174334 bytes boards/ek-tm4c123gxl/qs-rgb/ccs/macros.ini_initial | 1 + .../ek-tm4c123gxl/qs-rgb/ccs/target_config.ccxml | 13 + boards/ek-tm4c123gxl/qs-rgb/ewarm/Exe/qs-rgb.bin | Bin 0 -> 7624 bytes boards/ek-tm4c123gxl/qs-rgb/ewarm/Exe/qs-rgb.out | Bin 0 -> 139572 bytes boards/ek-tm4c123gxl/qs-rgb/gcc/qs-rgb.axf | Bin 0 -> 80625 bytes boards/ek-tm4c123gxl/qs-rgb/gcc/qs-rgb.bin | Bin 0 -> 12668 bytes boards/ek-tm4c123gxl/qs-rgb/qs-rgb.c | 714 + boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ewd | 614 + boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ewp | 808 + boards/ek-tm4c123gxl/qs-rgb/qs-rgb.h | 90 + boards/ek-tm4c123gxl/qs-rgb/qs-rgb.icf | 78 + boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ld | 57 + boards/ek-tm4c123gxl/qs-rgb/qs-rgb.sct | 47 + boards/ek-tm4c123gxl/qs-rgb/qs-rgb.uvopt | 387 + boards/ek-tm4c123gxl/qs-rgb/qs-rgb.uvproj | 459 + boards/ek-tm4c123gxl/qs-rgb/qs-rgb_ccs.cmd | 70 + boards/ek-tm4c123gxl/qs-rgb/readme.txt | 47 + boards/ek-tm4c123gxl/qs-rgb/rgb_commands.c | 223 + boards/ek-tm4c123gxl/qs-rgb/rgb_commands.h | 51 + boards/ek-tm4c123gxl/qs-rgb/rvmdk/qs-rgb.axf | Bin 0 -> 68036 bytes boards/ek-tm4c123gxl/qs-rgb/rvmdk/qs-rgb.bin | Bin 0 -> 7612 bytes boards/ek-tm4c123gxl/qs-rgb/startup_ccs.c | 303 + boards/ek-tm4c123gxl/qs-rgb/startup_ewarm.c | 334 + boards/ek-tm4c123gxl/qs-rgb/startup_gcc.c | 350 + boards/ek-tm4c123gxl/qs-rgb/startup_rvmdk.S | 359 + boards/ek-tm4c123gxl/timers/Makefile | 85 + boards/ek-tm4c123gxl/timers/ccs/.ccsimportspec | 8 + boards/ek-tm4c123gxl/timers/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/timers/ccs/.cproject | 187 + boards/ek-tm4c123gxl/timers/ccs/.project | 55 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + boards/ek-tm4c123gxl/timers/ccs/Debug/timers.bin | Bin 0 -> 2952 bytes boards/ek-tm4c123gxl/timers/ccs/Debug/timers.out | Bin 0 -> 63652 bytes boards/ek-tm4c123gxl/timers/ccs/macros.ini_initial | 1 + .../ek-tm4c123gxl/timers/ccs/target_config.ccxml | 13 + boards/ek-tm4c123gxl/timers/ewarm/Exe/timers.bin | Bin 0 -> 2156 bytes boards/ek-tm4c123gxl/timers/ewarm/Exe/timers.out | Bin 0 -> 39836 bytes boards/ek-tm4c123gxl/timers/gcc/timers.axf | Bin 0 -> 36758 bytes boards/ek-tm4c123gxl/timers/gcc/timers.bin | Bin 0 -> 2076 bytes boards/ek-tm4c123gxl/timers/readme.txt | 29 + boards/ek-tm4c123gxl/timers/rvmdk/timers.axf | Bin 0 -> 21388 bytes boards/ek-tm4c123gxl/timers/rvmdk/timers.bin | Bin 0 -> 2080 bytes boards/ek-tm4c123gxl/timers/startup_ccs.c | 303 + boards/ek-tm4c123gxl/timers/startup_ewarm.c | 334 + boards/ek-tm4c123gxl/timers/startup_gcc.c | 350 + boards/ek-tm4c123gxl/timers/startup_rvmdk.S | 359 + boards/ek-tm4c123gxl/timers/timers.c | 262 + boards/ek-tm4c123gxl/timers/timers.ewd | 614 + boards/ek-tm4c123gxl/timers/timers.ewp | 787 + boards/ek-tm4c123gxl/timers/timers.icf | 78 + boards/ek-tm4c123gxl/timers/timers.ld | 57 + boards/ek-tm4c123gxl/timers/timers.sct | 47 + boards/ek-tm4c123gxl/timers/timers.uvopt | 303 + boards/ek-tm4c123gxl/timers/timers.uvproj | 429 + boards/ek-tm4c123gxl/timers/timers_ccs.cmd | 70 + boards/ek-tm4c123gxl/uart_echo/Makefile | 79 + boards/ek-tm4c123gxl/uart_echo/ccs/.ccsimportspec | 8 + boards/ek-tm4c123gxl/uart_echo/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/uart_echo/ccs/.cproject | 187 + boards/ek-tm4c123gxl/uart_echo/ccs/.project | 50 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../uart_echo/ccs/Debug/uart_echo.bin | Bin 0 -> 2288 bytes .../uart_echo/ccs/Debug/uart_echo.out | Bin 0 -> 46534 bytes .../ek-tm4c123gxl/uart_echo/ccs/macros.ini_initial | 1 + .../uart_echo/ccs/target_config.ccxml | 13 + .../uart_echo/ewarm/Exe/uart_echo.bin | Bin 0 -> 1736 bytes .../uart_echo/ewarm/Exe/uart_echo.out | Bin 0 -> 27268 bytes boards/ek-tm4c123gxl/uart_echo/gcc/uart_echo.axf | Bin 0 -> 36134 bytes boards/ek-tm4c123gxl/uart_echo/gcc/uart_echo.bin | Bin 0 -> 1752 bytes boards/ek-tm4c123gxl/uart_echo/readme.txt | 26 + boards/ek-tm4c123gxl/uart_echo/rvmdk/uart_echo.axf | Bin 0 -> 20460 bytes boards/ek-tm4c123gxl/uart_echo/rvmdk/uart_echo.bin | Bin 0 -> 2508 bytes boards/ek-tm4c123gxl/uart_echo/startup_ccs.c | 302 + boards/ek-tm4c123gxl/uart_echo/startup_ewarm.c | 333 + boards/ek-tm4c123gxl/uart_echo/startup_gcc.c | 349 + boards/ek-tm4c123gxl/uart_echo/startup_rvmdk.S | 358 + boards/ek-tm4c123gxl/uart_echo/uart_echo.c | 206 + boards/ek-tm4c123gxl/uart_echo/uart_echo.ewd | 614 + boards/ek-tm4c123gxl/uart_echo/uart_echo.ewp | 784 + boards/ek-tm4c123gxl/uart_echo/uart_echo.icf | 78 + boards/ek-tm4c123gxl/uart_echo/uart_echo.ld | 57 + boards/ek-tm4c123gxl/uart_echo/uart_echo.sct | 47 + boards/ek-tm4c123gxl/uart_echo/uart_echo.uvopt | 289 + boards/ek-tm4c123gxl/uart_echo/uart_echo.uvproj | 424 + boards/ek-tm4c123gxl/uart_echo/uart_echo_ccs.cmd | 70 + boards/ek-tm4c123gxl/udma_demo/Makefile | 87 + boards/ek-tm4c123gxl/udma_demo/ccs/.ccsimportspec | 8 + boards/ek-tm4c123gxl/udma_demo/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/udma_demo/ccs/.cproject | 187 + boards/ek-tm4c123gxl/udma_demo/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../udma_demo/ccs/Debug/udma_demo.bin | Bin 0 -> 4896 bytes .../udma_demo/ccs/Debug/udma_demo.out | Bin 0 -> 90511 bytes .../ek-tm4c123gxl/udma_demo/ccs/macros.ini_initial | 1 + .../udma_demo/ccs/target_config.ccxml | 13 + .../udma_demo/ewarm/Exe/udma_demo.bin | Bin 0 -> 4068 bytes .../udma_demo/ewarm/Exe/udma_demo.out | Bin 0 -> 65648 bytes boards/ek-tm4c123gxl/udma_demo/gcc/udma_demo.axf | Bin 0 -> 40352 bytes boards/ek-tm4c123gxl/udma_demo/gcc/udma_demo.bin | Bin 0 -> 4032 bytes boards/ek-tm4c123gxl/udma_demo/readme.txt | 28 + boards/ek-tm4c123gxl/udma_demo/rvmdk/udma_demo.axf | Bin 0 -> 35004 bytes boards/ek-tm4c123gxl/udma_demo/rvmdk/udma_demo.bin | Bin 0 -> 4300 bytes boards/ek-tm4c123gxl/udma_demo/startup_ccs.c | 305 + boards/ek-tm4c123gxl/udma_demo/startup_ewarm.c | 336 + boards/ek-tm4c123gxl/udma_demo/startup_gcc.c | 352 + boards/ek-tm4c123gxl/udma_demo/startup_rvmdk.S | 361 + boards/ek-tm4c123gxl/udma_demo/udma_demo.c | 1012 + boards/ek-tm4c123gxl/udma_demo/udma_demo.ewd | 614 + boards/ek-tm4c123gxl/udma_demo/udma_demo.ewp | 793 + boards/ek-tm4c123gxl/udma_demo/udma_demo.icf | 78 + boards/ek-tm4c123gxl/udma_demo/udma_demo.ld | 57 + boards/ek-tm4c123gxl/udma_demo/udma_demo.sct | 47 + boards/ek-tm4c123gxl/udma_demo/udma_demo.uvopt | 331 + boards/ek-tm4c123gxl/udma_demo/udma_demo.uvproj | 439 + boards/ek-tm4c123gxl/udma_demo/udma_demo_ccs.cmd | 70 + boards/ek-tm4c123gxl/usb_dev_bulk/Makefile | 89 + .../ek-tm4c123gxl/usb_dev_bulk/ccs/.ccsimportspec | 10 + boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.cproject | 191 + boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin | Bin 0 -> 14424 bytes .../usb_dev_bulk/ccs/Debug/usb_dev_bulk.out | Bin 0 -> 439878 bytes .../usb_dev_bulk/ccs/macros.ini_initial | 1 + .../usb_dev_bulk/ccs/target_config.ccxml | 13 + .../usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin | Bin 0 -> 13324 bytes .../usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out | Bin 0 -> 313720 bytes .../usb_dev_bulk/gcc/usb_dev_bulk.axf | Bin 0 -> 80335 bytes .../usb_dev_bulk/gcc/usb_dev_bulk.bin | Bin 0 -> 13753 bytes boards/ek-tm4c123gxl/usb_dev_bulk/readme.txt | 43 + .../usb_dev_bulk/rvmdk/usb_dev_bulk.axf | Bin 0 -> 217400 bytes .../usb_dev_bulk/rvmdk/usb_dev_bulk.bin | Bin 0 -> 14612 bytes boards/ek-tm4c123gxl/usb_dev_bulk/startup_ccs.c | 304 + boards/ek-tm4c123gxl/usb_dev_bulk/startup_ewarm.c | 335 + boards/ek-tm4c123gxl/usb_dev_bulk/startup_gcc.c | 351 + boards/ek-tm4c123gxl/usb_dev_bulk/startup_rvmdk.S | 360 + .../ek-tm4c123gxl/usb_dev_bulk/usb_bulk_structs.c | 200 + .../ek-tm4c123gxl/usb_dev_bulk/usb_bulk_structs.h | 48 + boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.c | 644 + boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ewd | 614 + boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ewp | 797 + boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.icf | 78 + boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ld | 57 + boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.sct | 47 + .../ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.uvopt | 345 + .../ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.uvproj | 444 + .../usb_dev_bulk/usb_dev_bulk_ccs.cmd | 70 + boards/ek-tm4c123gxl/usb_dev_gamepad/Makefile | 90 + .../usb_dev_gamepad/ccs/.ccsimportspec | 10 + .../ek-tm4c123gxl/usb_dev_gamepad/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.cproject | 193 + boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.bin | Bin 0 -> 15336 bytes .../usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.out | Bin 0 -> 449845 bytes .../usb_dev_gamepad/ccs/macros.ini_initial | 1 + .../usb_dev_gamepad/ccs/target_config.ccxml | 13 + .../usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.bin | Bin 0 -> 14172 bytes .../usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.out | Bin 0 -> 321120 bytes .../usb_dev_gamepad/gcc/usb_dev_gamepad.axf | Bin 0 -> 80741 bytes .../usb_dev_gamepad/gcc/usb_dev_gamepad.bin | Bin 0 -> 14786 bytes boards/ek-tm4c123gxl/usb_dev_gamepad/readme.txt | 31 + .../usb_dev_gamepad/rvmdk/usb_dev_gamepad.axf | Bin 0 -> 273452 bytes .../usb_dev_gamepad/rvmdk/usb_dev_gamepad.bin | Bin 0 -> 15624 bytes boards/ek-tm4c123gxl/usb_dev_gamepad/startup_ccs.c | 303 + .../ek-tm4c123gxl/usb_dev_gamepad/startup_ewarm.c | 334 + boards/ek-tm4c123gxl/usb_dev_gamepad/startup_gcc.c | 350 + .../ek-tm4c123gxl/usb_dev_gamepad/startup_rvmdk.S | 359 + .../usb_dev_gamepad/usb_dev_gamepad.c | 552 + .../usb_dev_gamepad/usb_dev_gamepad.ewd | 614 + .../usb_dev_gamepad/usb_dev_gamepad.ewp | 799 + .../usb_dev_gamepad/usb_dev_gamepad.icf | 78 + .../usb_dev_gamepad/usb_dev_gamepad.ld | 57 + .../usb_dev_gamepad/usb_dev_gamepad.sct | 47 + .../usb_dev_gamepad/usb_dev_gamepad.uvopt | 345 + .../usb_dev_gamepad/usb_dev_gamepad.uvproj | 444 + .../usb_dev_gamepad/usb_dev_gamepad_ccs.cmd | 70 + .../usb_dev_gamepad/usb_gamepad_structs.c | 151 + .../usb_dev_gamepad/usb_gamepad_structs.h | 33 + boards/ek-tm4c123gxl/usb_dev_serial/Makefile | 90 + .../usb_dev_serial/ccs/.ccsimportspec | 10 + .../ek-tm4c123gxl/usb_dev_serial/ccs/.ccsproject | 10 + boards/ek-tm4c123gxl/usb_dev_serial/ccs/.cproject | 193 + boards/ek-tm4c123gxl/usb_dev_serial/ccs/.project | 65 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../usb_dev_serial/ccs/Debug/usb_dev_serial.bin | Bin 0 -> 14720 bytes .../usb_dev_serial/ccs/Debug/usb_dev_serial.out | Bin 0 -> 440636 bytes .../usb_dev_serial/ccs/macros.ini_initial | 1 + .../usb_dev_serial/ccs/target_config.ccxml | 13 + .../usb_dev_serial/ewarm/Exe/usb_dev_serial.bin | Bin 0 -> 13604 bytes .../usb_dev_serial/ewarm/Exe/usb_dev_serial.out | Bin 0 -> 319852 bytes .../usb_dev_serial/gcc/usb_dev_serial.axf | Bin 0 -> 80734 bytes .../usb_dev_serial/gcc/usb_dev_serial.bin | Bin 0 -> 14185 bytes boards/ek-tm4c123gxl/usb_dev_serial/readme.txt | 32 + .../usb_dev_serial/rvmdk/usb_dev_serial.axf | Bin 0 -> 244684 bytes .../usb_dev_serial/rvmdk/usb_dev_serial.bin | Bin 0 -> 15376 bytes boards/ek-tm4c123gxl/usb_dev_serial/startup_ccs.c | 304 + .../ek-tm4c123gxl/usb_dev_serial/startup_ewarm.c | 335 + boards/ek-tm4c123gxl/usb_dev_serial/startup_gcc.c | 351 + .../ek-tm4c123gxl/usb_dev_serial/startup_rvmdk.S | 360 + .../ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.c | 1222 + .../usb_dev_serial/usb_dev_serial.ewd | 614 + .../usb_dev_serial/usb_dev_serial.ewp | 799 + .../usb_dev_serial/usb_dev_serial.icf | 78 + .../ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ld | 57 + .../usb_dev_serial/usb_dev_serial.sct | 47 + .../usb_dev_serial/usb_dev_serial.uvopt | 345 + .../usb_dev_serial/usb_dev_serial.uvproj | 444 + .../usb_dev_serial/usb_dev_serial_ccs.cmd | 70 + .../usb_dev_serial/usb_serial_structs.c | 215 + .../usb_dev_serial/usb_serial_structs.h | 49 + 4278 files changed, 813811 insertions(+) create mode 100644 boards/dk-tm4c123g/Makefile create mode 100644 boards/dk-tm4c123g/bitband/Makefile create mode 100644 boards/dk-tm4c123g/bitband/bitband.c create mode 100644 boards/dk-tm4c123g/bitband/bitband.ewd create mode 100644 boards/dk-tm4c123g/bitband/bitband.ewp create mode 100644 boards/dk-tm4c123g/bitband/bitband.icf create mode 100644 boards/dk-tm4c123g/bitband/bitband.ld create mode 100644 boards/dk-tm4c123g/bitband/bitband.sct create mode 100644 boards/dk-tm4c123g/bitband/bitband.uvopt create mode 100644 boards/dk-tm4c123g/bitband/bitband.uvproj create mode 100644 boards/dk-tm4c123g/bitband/bitband_ccs.cmd create mode 100644 boards/dk-tm4c123g/bitband/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/bitband/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/bitband/ccs/.cproject create mode 100644 boards/dk-tm4c123g/bitband/ccs/.project create mode 100644 boards/dk-tm4c123g/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/bitband/ccs/Debug/bitband.bin create mode 100644 boards/dk-tm4c123g/bitband/ccs/Debug/bitband.out create mode 100644 boards/dk-tm4c123g/bitband/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/bitband/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/bitband/ewarm/Exe/bitband.bin create mode 100644 boards/dk-tm4c123g/bitband/ewarm/Exe/bitband.out create mode 100644 boards/dk-tm4c123g/bitband/gcc/bitband.axf create mode 100644 boards/dk-tm4c123g/bitband/gcc/bitband.bin create mode 100644 boards/dk-tm4c123g/bitband/readme.txt create mode 100644 boards/dk-tm4c123g/bitband/rvmdk/bitband.axf create mode 100644 boards/dk-tm4c123g/bitband/rvmdk/bitband.bin create mode 100644 boards/dk-tm4c123g/bitband/startup_ccs.c create mode 100644 boards/dk-tm4c123g/bitband/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/bitband/startup_gcc.c create mode 100644 boards/dk-tm4c123g/bitband/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/blinky/Makefile create mode 100644 boards/dk-tm4c123g/blinky/blinky.c create mode 100644 boards/dk-tm4c123g/blinky/blinky.ewd create mode 100644 boards/dk-tm4c123g/blinky/blinky.ewp create mode 100644 boards/dk-tm4c123g/blinky/blinky.icf create mode 100644 boards/dk-tm4c123g/blinky/blinky.ld create mode 100644 boards/dk-tm4c123g/blinky/blinky.sct create mode 100644 boards/dk-tm4c123g/blinky/blinky.uvopt create mode 100644 boards/dk-tm4c123g/blinky/blinky.uvproj create mode 100644 boards/dk-tm4c123g/blinky/blinky_ccs.cmd create mode 100644 boards/dk-tm4c123g/blinky/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/blinky/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/blinky/ccs/.cproject create mode 100644 boards/dk-tm4c123g/blinky/ccs/.project create mode 100644 boards/dk-tm4c123g/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/blinky/ccs/Debug/blinky.bin create mode 100644 boards/dk-tm4c123g/blinky/ccs/Debug/blinky.out create mode 100644 boards/dk-tm4c123g/blinky/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/blinky/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/blinky/ewarm/Exe/blinky.bin create mode 100644 boards/dk-tm4c123g/blinky/ewarm/Exe/blinky.out create mode 100644 boards/dk-tm4c123g/blinky/gcc/blinky.axf create mode 100644 boards/dk-tm4c123g/blinky/gcc/blinky.bin create mode 100644 boards/dk-tm4c123g/blinky/readme.txt create mode 100644 boards/dk-tm4c123g/blinky/rvmdk/blinky.axf create mode 100644 boards/dk-tm4c123g/blinky/rvmdk/blinky.bin create mode 100644 boards/dk-tm4c123g/blinky/startup_ccs.c create mode 100644 boards/dk-tm4c123g/blinky/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/blinky/startup_gcc.c create mode 100644 boards/dk-tm4c123g/blinky/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/boot_demo1/Makefile create mode 100644 boards/dk-tm4c123g/boot_demo1/boot_demo1.c create mode 100644 boards/dk-tm4c123g/boot_demo1/boot_demo1.ewd create mode 100644 boards/dk-tm4c123g/boot_demo1/boot_demo1.ewp create mode 100644 boards/dk-tm4c123g/boot_demo1/boot_demo1.icf create mode 100644 boards/dk-tm4c123g/boot_demo1/boot_demo1.ld create mode 100644 boards/dk-tm4c123g/boot_demo1/boot_demo1.sct create mode 100644 boards/dk-tm4c123g/boot_demo1/boot_demo1.uvopt create mode 100644 boards/dk-tm4c123g/boot_demo1/boot_demo1.uvproj create mode 100644 boards/dk-tm4c123g/boot_demo1/boot_demo1_ccs.cmd create mode 100644 boards/dk-tm4c123g/boot_demo1/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/boot_demo1/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/boot_demo1/ccs/.cproject create mode 100644 boards/dk-tm4c123g/boot_demo1/ccs/.project create mode 100644 boards/dk-tm4c123g/boot_demo1/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/boot_demo1/ccs/Debug/boot_demo1.bin create mode 100644 boards/dk-tm4c123g/boot_demo1/ccs/Debug/boot_demo1.out create mode 100644 boards/dk-tm4c123g/boot_demo1/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/boot_demo1/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/boot_demo1/ewarm/Exe/boot_demo1.bin create mode 100644 boards/dk-tm4c123g/boot_demo1/ewarm/Exe/boot_demo1.out create mode 100644 boards/dk-tm4c123g/boot_demo1/gcc/boot_demo1.axf create mode 100644 boards/dk-tm4c123g/boot_demo1/gcc/boot_demo1.bin create mode 100644 boards/dk-tm4c123g/boot_demo1/readme.txt create mode 100644 boards/dk-tm4c123g/boot_demo1/rvmdk/boot_demo1.axf create mode 100644 boards/dk-tm4c123g/boot_demo1/rvmdk/boot_demo1.bin create mode 100644 boards/dk-tm4c123g/boot_demo1/startup_ccs.c create mode 100644 boards/dk-tm4c123g/boot_demo1/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/boot_demo1/startup_gcc.c create mode 100644 boards/dk-tm4c123g/boot_demo1/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/boot_demo2/Makefile create mode 100644 boards/dk-tm4c123g/boot_demo2/boot_demo2.c create mode 100644 boards/dk-tm4c123g/boot_demo2/boot_demo2.ewd create mode 100644 boards/dk-tm4c123g/boot_demo2/boot_demo2.ewp create mode 100644 boards/dk-tm4c123g/boot_demo2/boot_demo2.icf create mode 100644 boards/dk-tm4c123g/boot_demo2/boot_demo2.ld create mode 100644 boards/dk-tm4c123g/boot_demo2/boot_demo2.sct create mode 100644 boards/dk-tm4c123g/boot_demo2/boot_demo2.uvopt create mode 100644 boards/dk-tm4c123g/boot_demo2/boot_demo2.uvproj create mode 100644 boards/dk-tm4c123g/boot_demo2/boot_demo2_ccs.cmd create mode 100644 boards/dk-tm4c123g/boot_demo2/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/boot_demo2/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/boot_demo2/ccs/.cproject create mode 100644 boards/dk-tm4c123g/boot_demo2/ccs/.project create mode 100644 boards/dk-tm4c123g/boot_demo2/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/boot_demo2/ccs/Debug/boot_demo2.bin create mode 100644 boards/dk-tm4c123g/boot_demo2/ccs/Debug/boot_demo2.out create mode 100644 boards/dk-tm4c123g/boot_demo2/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/boot_demo2/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/boot_demo2/ewarm/Exe/boot_demo2.bin create mode 100644 boards/dk-tm4c123g/boot_demo2/ewarm/Exe/boot_demo2.out create mode 100644 boards/dk-tm4c123g/boot_demo2/gcc/boot_demo2.axf create mode 100644 boards/dk-tm4c123g/boot_demo2/gcc/boot_demo2.bin create mode 100644 boards/dk-tm4c123g/boot_demo2/readme.txt create mode 100644 boards/dk-tm4c123g/boot_demo2/rvmdk/boot_demo2.axf create mode 100644 boards/dk-tm4c123g/boot_demo2/rvmdk/boot_demo2.bin create mode 100644 boards/dk-tm4c123g/boot_demo2/startup_ccs.c create mode 100644 boards/dk-tm4c123g/boot_demo2/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/boot_demo2/startup_gcc.c create mode 100644 boards/dk-tm4c123g/boot_demo2/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/boot_serial/Makefile create mode 100644 boards/dk-tm4c123g/boot_serial/bl_config.h create mode 100644 boards/dk-tm4c123g/boot_serial/boot_serial.ewd create mode 100644 boards/dk-tm4c123g/boot_serial/boot_serial.ewp create mode 100644 boards/dk-tm4c123g/boot_serial/boot_serial.uvopt create mode 100644 boards/dk-tm4c123g/boot_serial/boot_serial.uvproj create mode 100644 boards/dk-tm4c123g/boot_serial/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/boot_serial/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/boot_serial/ccs/.cproject create mode 100644 boards/dk-tm4c123g/boot_serial/ccs/.project create mode 100644 boards/dk-tm4c123g/boot_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/boot_serial/ccs/Debug/boot_serial.bin create mode 100644 boards/dk-tm4c123g/boot_serial/ccs/Debug/boot_serial.out create mode 100644 boards/dk-tm4c123g/boot_serial/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/boot_serial/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/boot_serial/ewarm/Exe/boot_serial.bin create mode 100644 boards/dk-tm4c123g/boot_serial/ewarm/Exe/boot_serial.out create mode 100644 boards/dk-tm4c123g/boot_serial/gcc/boot_serial.axf create mode 100644 boards/dk-tm4c123g/boot_serial/gcc/boot_serial.bin create mode 100644 boards/dk-tm4c123g/boot_serial/rvmdk/boot_serial.axf create mode 100644 boards/dk-tm4c123g/boot_serial/rvmdk/boot_serial.bin create mode 100644 boards/dk-tm4c123g/boot_usb/Makefile create mode 100644 boards/dk-tm4c123g/boot_usb/bl_config.h create mode 100644 boards/dk-tm4c123g/boot_usb/boot_usb.ewd create mode 100644 boards/dk-tm4c123g/boot_usb/boot_usb.ewp create mode 100644 boards/dk-tm4c123g/boot_usb/boot_usb.uvopt create mode 100644 boards/dk-tm4c123g/boot_usb/boot_usb.uvproj create mode 100644 boards/dk-tm4c123g/boot_usb/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/boot_usb/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/boot_usb/ccs/.cproject create mode 100644 boards/dk-tm4c123g/boot_usb/ccs/.project create mode 100644 boards/dk-tm4c123g/boot_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/boot_usb/ccs/Debug/boot_usb.bin create mode 100644 boards/dk-tm4c123g/boot_usb/ccs/Debug/boot_usb.out create mode 100644 boards/dk-tm4c123g/boot_usb/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/boot_usb/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/boot_usb/ewarm/Exe/boot_usb.bin create mode 100644 boards/dk-tm4c123g/boot_usb/ewarm/Exe/boot_usb.out create mode 100644 boards/dk-tm4c123g/boot_usb/gcc/boot_usb.axf create mode 100644 boards/dk-tm4c123g/boot_usb/gcc/boot_usb.bin create mode 100644 boards/dk-tm4c123g/boot_usb/rvmdk/boot_usb.axf create mode 100644 boards/dk-tm4c123g/boot_usb/rvmdk/boot_usb.bin create mode 100644 boards/dk-tm4c123g/can/Makefile create mode 100644 boards/dk-tm4c123g/can/can.c create mode 100644 boards/dk-tm4c123g/can/can.ewd create mode 100644 boards/dk-tm4c123g/can/can.ewp create mode 100644 boards/dk-tm4c123g/can/can.icf create mode 100644 boards/dk-tm4c123g/can/can.ld create mode 100644 boards/dk-tm4c123g/can/can.sct create mode 100644 boards/dk-tm4c123g/can/can.uvopt create mode 100644 boards/dk-tm4c123g/can/can.uvproj create mode 100644 boards/dk-tm4c123g/can/can_ccs.cmd create mode 100644 boards/dk-tm4c123g/can/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/can/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/can/ccs/.cproject create mode 100644 boards/dk-tm4c123g/can/ccs/.project create mode 100644 boards/dk-tm4c123g/can/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/can/ccs/Debug/can.bin create mode 100644 boards/dk-tm4c123g/can/ccs/Debug/can.out create mode 100644 boards/dk-tm4c123g/can/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/can/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/can/ewarm/Exe/can.bin create mode 100644 boards/dk-tm4c123g/can/ewarm/Exe/can.out create mode 100644 boards/dk-tm4c123g/can/gcc/can.axf create mode 100644 boards/dk-tm4c123g/can/gcc/can.bin create mode 100644 boards/dk-tm4c123g/can/readme.txt create mode 100644 boards/dk-tm4c123g/can/rvmdk/can.axf create mode 100644 boards/dk-tm4c123g/can/rvmdk/can.bin create mode 100644 boards/dk-tm4c123g/can/startup_ccs.c create mode 100644 boards/dk-tm4c123g/can/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/can/startup_gcc.c create mode 100644 boards/dk-tm4c123g/can/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/dk-tm4c123g.eww create mode 100644 boards/dk-tm4c123g/dk-tm4c123g.uvmpw create mode 100644 boards/dk-tm4c123g/drivers/buttons.c create mode 100644 boards/dk-tm4c123g/drivers/buttons.h create mode 100644 boards/dk-tm4c123g/drivers/cfal96x64x16.c create mode 100644 boards/dk-tm4c123g/drivers/cfal96x64x16.h create mode 100644 boards/dk-tm4c123g/drivers/slidemenuwidget.c create mode 100644 boards/dk-tm4c123g/drivers/slidemenuwidget.h create mode 100644 boards/dk-tm4c123g/drivers/stripchartwidget.c create mode 100644 boards/dk-tm4c123g/drivers/stripchartwidget.h create mode 100644 boards/dk-tm4c123g/drivers/usb_sound.c create mode 100644 boards/dk-tm4c123g/drivers/usb_sound.h create mode 100644 boards/dk-tm4c123g/grlib_demo/Makefile create mode 100644 boards/dk-tm4c123g/grlib_demo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/grlib_demo/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/grlib_demo/ccs/.cproject create mode 100644 boards/dk-tm4c123g/grlib_demo/ccs/.project create mode 100644 boards/dk-tm4c123g/grlib_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/grlib_demo/ccs/Debug/grlib_demo.bin create mode 100644 boards/dk-tm4c123g/grlib_demo/ccs/Debug/grlib_demo.out create mode 100644 boards/dk-tm4c123g/grlib_demo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/grlib_demo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/grlib_demo/ewarm/Exe/grlib_demo.bin create mode 100644 boards/dk-tm4c123g/grlib_demo/ewarm/Exe/grlib_demo.out create mode 100644 boards/dk-tm4c123g/grlib_demo/gcc/grlib_demo.axf create mode 100644 boards/dk-tm4c123g/grlib_demo/gcc/grlib_demo.bin create mode 100644 boards/dk-tm4c123g/grlib_demo/grlib_demo.c create mode 100644 boards/dk-tm4c123g/grlib_demo/grlib_demo.ewd create mode 100644 boards/dk-tm4c123g/grlib_demo/grlib_demo.ewp create mode 100644 boards/dk-tm4c123g/grlib_demo/grlib_demo.icf create mode 100644 boards/dk-tm4c123g/grlib_demo/grlib_demo.ld create mode 100644 boards/dk-tm4c123g/grlib_demo/grlib_demo.sct create mode 100644 boards/dk-tm4c123g/grlib_demo/grlib_demo.uvopt create mode 100644 boards/dk-tm4c123g/grlib_demo/grlib_demo.uvproj create mode 100644 boards/dk-tm4c123g/grlib_demo/grlib_demo_ccs.cmd create mode 100644 boards/dk-tm4c123g/grlib_demo/readme.txt create mode 100644 boards/dk-tm4c123g/grlib_demo/rvmdk/grlib_demo.axf create mode 100644 boards/dk-tm4c123g/grlib_demo/rvmdk/grlib_demo.bin create mode 100644 boards/dk-tm4c123g/grlib_demo/startup_ccs.c create mode 100644 boards/dk-tm4c123g/grlib_demo/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/grlib_demo/startup_gcc.c create mode 100644 boards/dk-tm4c123g/grlib_demo/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/hello/Makefile create mode 100644 boards/dk-tm4c123g/hello/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/hello/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/hello/ccs/.cproject create mode 100644 boards/dk-tm4c123g/hello/ccs/.project create mode 100644 boards/dk-tm4c123g/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/hello/ccs/Debug/hello.bin create mode 100644 boards/dk-tm4c123g/hello/ccs/Debug/hello.out create mode 100644 boards/dk-tm4c123g/hello/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/hello/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/hello/ewarm/Exe/hello.bin create mode 100644 boards/dk-tm4c123g/hello/ewarm/Exe/hello.out create mode 100644 boards/dk-tm4c123g/hello/gcc/hello.axf create mode 100644 boards/dk-tm4c123g/hello/gcc/hello.bin create mode 100644 boards/dk-tm4c123g/hello/hello.c create mode 100644 boards/dk-tm4c123g/hello/hello.ewd create mode 100644 boards/dk-tm4c123g/hello/hello.ewp create mode 100644 boards/dk-tm4c123g/hello/hello.icf create mode 100644 boards/dk-tm4c123g/hello/hello.ld create mode 100644 boards/dk-tm4c123g/hello/hello.sct create mode 100644 boards/dk-tm4c123g/hello/hello.uvopt create mode 100644 boards/dk-tm4c123g/hello/hello.uvproj create mode 100644 boards/dk-tm4c123g/hello/hello_ccs.cmd create mode 100644 boards/dk-tm4c123g/hello/readme.txt create mode 100644 boards/dk-tm4c123g/hello/rvmdk/hello.axf create mode 100644 boards/dk-tm4c123g/hello/rvmdk/hello.bin create mode 100644 boards/dk-tm4c123g/hello/startup_ccs.c create mode 100644 boards/dk-tm4c123g/hello/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/hello/startup_gcc.c create mode 100644 boards/dk-tm4c123g/hello/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/hibernate/Makefile create mode 100644 boards/dk-tm4c123g/hibernate/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/hibernate/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/hibernate/ccs/.cproject create mode 100644 boards/dk-tm4c123g/hibernate/ccs/.project create mode 100644 boards/dk-tm4c123g/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/hibernate/ccs/Debug/hibernate.bin create mode 100644 boards/dk-tm4c123g/hibernate/ccs/Debug/hibernate.out create mode 100644 boards/dk-tm4c123g/hibernate/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/hibernate/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/hibernate/ewarm/Exe/hibernate.bin create mode 100644 boards/dk-tm4c123g/hibernate/ewarm/Exe/hibernate.out create mode 100644 boards/dk-tm4c123g/hibernate/gcc/hibernate.axf create mode 100644 boards/dk-tm4c123g/hibernate/gcc/hibernate.bin create mode 100644 boards/dk-tm4c123g/hibernate/hibernate.c create mode 100644 boards/dk-tm4c123g/hibernate/hibernate.ewd create mode 100644 boards/dk-tm4c123g/hibernate/hibernate.ewp create mode 100644 boards/dk-tm4c123g/hibernate/hibernate.icf create mode 100644 boards/dk-tm4c123g/hibernate/hibernate.ld create mode 100644 boards/dk-tm4c123g/hibernate/hibernate.sct create mode 100644 boards/dk-tm4c123g/hibernate/hibernate.uvopt create mode 100644 boards/dk-tm4c123g/hibernate/hibernate.uvproj create mode 100644 boards/dk-tm4c123g/hibernate/hibernate_ccs.cmd create mode 100644 boards/dk-tm4c123g/hibernate/readme.txt create mode 100644 boards/dk-tm4c123g/hibernate/rvmdk/hibernate.axf create mode 100644 boards/dk-tm4c123g/hibernate/rvmdk/hibernate.bin create mode 100644 boards/dk-tm4c123g/hibernate/startup_ccs.c create mode 100644 boards/dk-tm4c123g/hibernate/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/hibernate/startup_gcc.c create mode 100644 boards/dk-tm4c123g/hibernate/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/interrupts/Makefile create mode 100644 boards/dk-tm4c123g/interrupts/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/interrupts/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/interrupts/ccs/.cproject create mode 100644 boards/dk-tm4c123g/interrupts/ccs/.project create mode 100644 boards/dk-tm4c123g/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/interrupts/ccs/Debug/interrupts.bin create mode 100644 boards/dk-tm4c123g/interrupts/ccs/Debug/interrupts.out create mode 100644 boards/dk-tm4c123g/interrupts/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/interrupts/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/interrupts/ewarm/Exe/interrupts.bin create mode 100644 boards/dk-tm4c123g/interrupts/ewarm/Exe/interrupts.out create mode 100644 boards/dk-tm4c123g/interrupts/gcc/interrupts.axf create mode 100644 boards/dk-tm4c123g/interrupts/gcc/interrupts.bin create mode 100644 boards/dk-tm4c123g/interrupts/interrupts.c create mode 100644 boards/dk-tm4c123g/interrupts/interrupts.ewd create mode 100644 boards/dk-tm4c123g/interrupts/interrupts.ewp create mode 100644 boards/dk-tm4c123g/interrupts/interrupts.icf create mode 100644 boards/dk-tm4c123g/interrupts/interrupts.ld create mode 100644 boards/dk-tm4c123g/interrupts/interrupts.sct create mode 100644 boards/dk-tm4c123g/interrupts/interrupts.uvopt create mode 100644 boards/dk-tm4c123g/interrupts/interrupts.uvproj create mode 100644 boards/dk-tm4c123g/interrupts/interrupts_ccs.cmd create mode 100644 boards/dk-tm4c123g/interrupts/readme.txt create mode 100644 boards/dk-tm4c123g/interrupts/rvmdk/interrupts.axf create mode 100644 boards/dk-tm4c123g/interrupts/rvmdk/interrupts.bin create mode 100644 boards/dk-tm4c123g/interrupts/startup_ccs.c create mode 100644 boards/dk-tm4c123g/interrupts/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/interrupts/startup_gcc.c create mode 100644 boards/dk-tm4c123g/interrupts/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/mpu_fault/Makefile create mode 100644 boards/dk-tm4c123g/mpu_fault/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/mpu_fault/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/mpu_fault/ccs/.cproject create mode 100644 boards/dk-tm4c123g/mpu_fault/ccs/.project create mode 100644 boards/dk-tm4c123g/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/mpu_fault/ccs/Debug/mpu_fault.bin create mode 100644 boards/dk-tm4c123g/mpu_fault/ccs/Debug/mpu_fault.out create mode 100644 boards/dk-tm4c123g/mpu_fault/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/mpu_fault/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/mpu_fault/ewarm/Exe/mpu_fault.bin create mode 100644 boards/dk-tm4c123g/mpu_fault/ewarm/Exe/mpu_fault.out create mode 100644 boards/dk-tm4c123g/mpu_fault/gcc/mpu_fault.axf create mode 100644 boards/dk-tm4c123g/mpu_fault/gcc/mpu_fault.bin create mode 100644 boards/dk-tm4c123g/mpu_fault/mpu_fault.c create mode 100644 boards/dk-tm4c123g/mpu_fault/mpu_fault.ewd create mode 100644 boards/dk-tm4c123g/mpu_fault/mpu_fault.ewp create mode 100644 boards/dk-tm4c123g/mpu_fault/mpu_fault.icf create mode 100644 boards/dk-tm4c123g/mpu_fault/mpu_fault.ld create mode 100644 boards/dk-tm4c123g/mpu_fault/mpu_fault.sct create mode 100644 boards/dk-tm4c123g/mpu_fault/mpu_fault.uvopt create mode 100644 boards/dk-tm4c123g/mpu_fault/mpu_fault.uvproj create mode 100644 boards/dk-tm4c123g/mpu_fault/mpu_fault_ccs.cmd create mode 100644 boards/dk-tm4c123g/mpu_fault/readme.txt create mode 100644 boards/dk-tm4c123g/mpu_fault/rvmdk/mpu_fault.axf create mode 100644 boards/dk-tm4c123g/mpu_fault/rvmdk/mpu_fault.bin create mode 100644 boards/dk-tm4c123g/mpu_fault/startup_ccs.c create mode 100644 boards/dk-tm4c123g/mpu_fault/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/mpu_fault/startup_gcc.c create mode 100644 boards/dk-tm4c123g/mpu_fault/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/qs-logger/Makefile create mode 100644 boards/dk-tm4c123g/qs-logger/acquire.c create mode 100644 boards/dk-tm4c123g/qs-logger/acquire.h create mode 100644 boards/dk-tm4c123g/qs-logger/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/qs-logger/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/qs-logger/ccs/.cproject create mode 100644 boards/dk-tm4c123g/qs-logger/ccs/.project create mode 100644 boards/dk-tm4c123g/qs-logger/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/qs-logger/ccs/Debug/qs-logger.bin create mode 100644 boards/dk-tm4c123g/qs-logger/ccs/Debug/qs-logger.out create mode 100644 boards/dk-tm4c123g/qs-logger/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/qs-logger/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/qs-logger/clocksetwidget.c create mode 100644 boards/dk-tm4c123g/qs-logger/clocksetwidget.h create mode 100644 boards/dk-tm4c123g/qs-logger/ewarm/Exe/qs-logger.bin create mode 100644 boards/dk-tm4c123g/qs-logger/ewarm/Exe/qs-logger.out create mode 100644 boards/dk-tm4c123g/qs-logger/flashstore.c create mode 100644 boards/dk-tm4c123g/qs-logger/flashstore.h create mode 100644 boards/dk-tm4c123g/qs-logger/gcc/qs-logger.axf create mode 100644 boards/dk-tm4c123g/qs-logger/gcc/qs-logger.bin create mode 100644 boards/dk-tm4c123g/qs-logger/images.c create mode 100644 boards/dk-tm4c123g/qs-logger/images.h create mode 100644 boards/dk-tm4c123g/qs-logger/menus.c create mode 100644 boards/dk-tm4c123g/qs-logger/menus.h create mode 100644 boards/dk-tm4c123g/qs-logger/qs-logger.c create mode 100644 boards/dk-tm4c123g/qs-logger/qs-logger.ewd create mode 100644 boards/dk-tm4c123g/qs-logger/qs-logger.ewp create mode 100644 boards/dk-tm4c123g/qs-logger/qs-logger.h create mode 100644 boards/dk-tm4c123g/qs-logger/qs-logger.icf create mode 100644 boards/dk-tm4c123g/qs-logger/qs-logger.ld create mode 100644 boards/dk-tm4c123g/qs-logger/qs-logger.sct create mode 100644 boards/dk-tm4c123g/qs-logger/qs-logger.uvopt create mode 100644 boards/dk-tm4c123g/qs-logger/qs-logger.uvproj create mode 100644 boards/dk-tm4c123g/qs-logger/qs-logger_ccs.cmd create mode 100644 boards/dk-tm4c123g/qs-logger/readme.txt create mode 100644 boards/dk-tm4c123g/qs-logger/rvmdk/qs-logger.axf create mode 100644 boards/dk-tm4c123g/qs-logger/rvmdk/qs-logger.bin create mode 100644 boards/dk-tm4c123g/qs-logger/startup_ccs.c create mode 100644 boards/dk-tm4c123g/qs-logger/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/qs-logger/startup_gcc.c create mode 100644 boards/dk-tm4c123g/qs-logger/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/qs-logger/stripchartmanager.c create mode 100644 boards/dk-tm4c123g/qs-logger/stripchartmanager.h create mode 100644 boards/dk-tm4c123g/qs-logger/usb_serial_structs.c create mode 100644 boards/dk-tm4c123g/qs-logger/usb_serial_structs.h create mode 100644 boards/dk-tm4c123g/qs-logger/usbserial.c create mode 100644 boards/dk-tm4c123g/qs-logger/usbserial.h create mode 100644 boards/dk-tm4c123g/qs-logger/usbstick.c create mode 100644 boards/dk-tm4c123g/qs-logger/usbstick.h create mode 100644 boards/dk-tm4c123g/sd_card/Makefile create mode 100644 boards/dk-tm4c123g/sd_card/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/sd_card/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/sd_card/ccs/.cproject create mode 100644 boards/dk-tm4c123g/sd_card/ccs/.project create mode 100644 boards/dk-tm4c123g/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/sd_card/ccs/Debug/sd_card.bin create mode 100644 boards/dk-tm4c123g/sd_card/ccs/Debug/sd_card.out create mode 100644 boards/dk-tm4c123g/sd_card/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/sd_card/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/sd_card/ewarm/Exe/sd_card.bin create mode 100644 boards/dk-tm4c123g/sd_card/ewarm/Exe/sd_card.out create mode 100644 boards/dk-tm4c123g/sd_card/gcc/sd_card.axf create mode 100644 boards/dk-tm4c123g/sd_card/gcc/sd_card.bin create mode 100644 boards/dk-tm4c123g/sd_card/readme.txt create mode 100644 boards/dk-tm4c123g/sd_card/rvmdk/sd_card.axf create mode 100644 boards/dk-tm4c123g/sd_card/rvmdk/sd_card.bin create mode 100644 boards/dk-tm4c123g/sd_card/sd_card.c create mode 100644 boards/dk-tm4c123g/sd_card/sd_card.ewd create mode 100644 boards/dk-tm4c123g/sd_card/sd_card.ewp create mode 100644 boards/dk-tm4c123g/sd_card/sd_card.icf create mode 100644 boards/dk-tm4c123g/sd_card/sd_card.ld create mode 100644 boards/dk-tm4c123g/sd_card/sd_card.sct create mode 100644 boards/dk-tm4c123g/sd_card/sd_card.uvopt create mode 100644 boards/dk-tm4c123g/sd_card/sd_card.uvproj create mode 100644 boards/dk-tm4c123g/sd_card/sd_card_ccs.cmd create mode 100644 boards/dk-tm4c123g/sd_card/startup_ccs.c create mode 100644 boards/dk-tm4c123g/sd_card/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/sd_card/startup_gcc.c create mode 100644 boards/dk-tm4c123g/sd_card/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/sine_demo/Makefile create mode 100644 boards/dk-tm4c123g/sine_demo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/sine_demo/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/sine_demo/ccs/.cproject create mode 100644 boards/dk-tm4c123g/sine_demo/ccs/.project create mode 100644 boards/dk-tm4c123g/sine_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/sine_demo/ccs/Debug/sine_demo.bin create mode 100644 boards/dk-tm4c123g/sine_demo/ccs/Debug/sine_demo.out create mode 100644 boards/dk-tm4c123g/sine_demo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/sine_demo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/sine_demo/ewarm/Exe/sine_demo.bin create mode 100644 boards/dk-tm4c123g/sine_demo/ewarm/Exe/sine_demo.out create mode 100644 boards/dk-tm4c123g/sine_demo/gcc/sine_demo.axf create mode 100644 boards/dk-tm4c123g/sine_demo/gcc/sine_demo.bin create mode 100644 boards/dk-tm4c123g/sine_demo/readme.txt create mode 100644 boards/dk-tm4c123g/sine_demo/rvmdk/sine_demo.axf create mode 100644 boards/dk-tm4c123g/sine_demo/rvmdk/sine_demo.bin create mode 100644 boards/dk-tm4c123g/sine_demo/sine_demo.c create mode 100644 boards/dk-tm4c123g/sine_demo/sine_demo.ewd create mode 100644 boards/dk-tm4c123g/sine_demo/sine_demo.ewp create mode 100644 boards/dk-tm4c123g/sine_demo/sine_demo.icf create mode 100644 boards/dk-tm4c123g/sine_demo/sine_demo.ld create mode 100644 boards/dk-tm4c123g/sine_demo/sine_demo.sct create mode 100644 boards/dk-tm4c123g/sine_demo/sine_demo.uvopt create mode 100644 boards/dk-tm4c123g/sine_demo/sine_demo.uvproj create mode 100644 boards/dk-tm4c123g/sine_demo/sine_demo_ccs.cmd create mode 100644 boards/dk-tm4c123g/sine_demo/startup_ccs.c create mode 100644 boards/dk-tm4c123g/sine_demo/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/sine_demo/startup_gcc.c create mode 100644 boards/dk-tm4c123g/sine_demo/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/softuart_echo/Makefile create mode 100644 boards/dk-tm4c123g/softuart_echo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/softuart_echo/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/softuart_echo/ccs/.cproject create mode 100644 boards/dk-tm4c123g/softuart_echo/ccs/.project create mode 100644 boards/dk-tm4c123g/softuart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/softuart_echo/ccs/Debug/softuart_echo.bin create mode 100644 boards/dk-tm4c123g/softuart_echo/ccs/Debug/softuart_echo.out create mode 100644 boards/dk-tm4c123g/softuart_echo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/softuart_echo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/softuart_echo/ewarm/Exe/softuart_echo.bin create mode 100644 boards/dk-tm4c123g/softuart_echo/ewarm/Exe/softuart_echo.out create mode 100644 boards/dk-tm4c123g/softuart_echo/gcc/softuart_echo.axf create mode 100644 boards/dk-tm4c123g/softuart_echo/gcc/softuart_echo.bin create mode 100644 boards/dk-tm4c123g/softuart_echo/readme.txt create mode 100644 boards/dk-tm4c123g/softuart_echo/rvmdk/softuart_echo.axf create mode 100644 boards/dk-tm4c123g/softuart_echo/rvmdk/softuart_echo.bin create mode 100644 boards/dk-tm4c123g/softuart_echo/softuart_echo.c create mode 100644 boards/dk-tm4c123g/softuart_echo/softuart_echo.ewd create mode 100644 boards/dk-tm4c123g/softuart_echo/softuart_echo.ewp create mode 100644 boards/dk-tm4c123g/softuart_echo/softuart_echo.icf create mode 100644 boards/dk-tm4c123g/softuart_echo/softuart_echo.ld create mode 100644 boards/dk-tm4c123g/softuart_echo/softuart_echo.sct create mode 100644 boards/dk-tm4c123g/softuart_echo/softuart_echo.uvopt create mode 100644 boards/dk-tm4c123g/softuart_echo/softuart_echo.uvproj create mode 100644 boards/dk-tm4c123g/softuart_echo/softuart_echo_ccs.cmd create mode 100644 boards/dk-tm4c123g/softuart_echo/startup_ccs.c create mode 100644 boards/dk-tm4c123g/softuart_echo/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/softuart_echo/startup_gcc.c create mode 100644 boards/dk-tm4c123g/softuart_echo/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/timers/Makefile create mode 100644 boards/dk-tm4c123g/timers/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/timers/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/timers/ccs/.cproject create mode 100644 boards/dk-tm4c123g/timers/ccs/.project create mode 100644 boards/dk-tm4c123g/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/timers/ccs/Debug/timers.bin create mode 100644 boards/dk-tm4c123g/timers/ccs/Debug/timers.out create mode 100644 boards/dk-tm4c123g/timers/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/timers/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/timers/ewarm/Exe/timers.bin create mode 100644 boards/dk-tm4c123g/timers/ewarm/Exe/timers.out create mode 100644 boards/dk-tm4c123g/timers/gcc/timers.axf create mode 100644 boards/dk-tm4c123g/timers/gcc/timers.bin create mode 100644 boards/dk-tm4c123g/timers/readme.txt create mode 100644 boards/dk-tm4c123g/timers/rvmdk/timers.axf create mode 100644 boards/dk-tm4c123g/timers/rvmdk/timers.bin create mode 100644 boards/dk-tm4c123g/timers/startup_ccs.c create mode 100644 boards/dk-tm4c123g/timers/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/timers/startup_gcc.c create mode 100644 boards/dk-tm4c123g/timers/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/timers/timers.c create mode 100644 boards/dk-tm4c123g/timers/timers.ewd create mode 100644 boards/dk-tm4c123g/timers/timers.ewp create mode 100644 boards/dk-tm4c123g/timers/timers.icf create mode 100644 boards/dk-tm4c123g/timers/timers.ld create mode 100644 boards/dk-tm4c123g/timers/timers.sct create mode 100644 boards/dk-tm4c123g/timers/timers.uvopt create mode 100644 boards/dk-tm4c123g/timers/timers.uvproj create mode 100644 boards/dk-tm4c123g/timers/timers_ccs.cmd create mode 100644 boards/dk-tm4c123g/uart_echo/Makefile create mode 100644 boards/dk-tm4c123g/uart_echo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/uart_echo/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/uart_echo/ccs/.cproject create mode 100644 boards/dk-tm4c123g/uart_echo/ccs/.project create mode 100644 boards/dk-tm4c123g/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/uart_echo/ccs/Debug/uart_echo.bin create mode 100644 boards/dk-tm4c123g/uart_echo/ccs/Debug/uart_echo.out create mode 100644 boards/dk-tm4c123g/uart_echo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/uart_echo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/uart_echo/ewarm/Exe/uart_echo.bin create mode 100644 boards/dk-tm4c123g/uart_echo/ewarm/Exe/uart_echo.out create mode 100644 boards/dk-tm4c123g/uart_echo/gcc/uart_echo.axf create mode 100644 boards/dk-tm4c123g/uart_echo/gcc/uart_echo.bin create mode 100644 boards/dk-tm4c123g/uart_echo/readme.txt create mode 100644 boards/dk-tm4c123g/uart_echo/rvmdk/uart_echo.axf create mode 100644 boards/dk-tm4c123g/uart_echo/rvmdk/uart_echo.bin create mode 100644 boards/dk-tm4c123g/uart_echo/startup_ccs.c create mode 100644 boards/dk-tm4c123g/uart_echo/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/uart_echo/startup_gcc.c create mode 100644 boards/dk-tm4c123g/uart_echo/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/uart_echo/uart_echo.c create mode 100644 boards/dk-tm4c123g/uart_echo/uart_echo.ewd create mode 100644 boards/dk-tm4c123g/uart_echo/uart_echo.ewp create mode 100644 boards/dk-tm4c123g/uart_echo/uart_echo.icf create mode 100644 boards/dk-tm4c123g/uart_echo/uart_echo.ld create mode 100644 boards/dk-tm4c123g/uart_echo/uart_echo.sct create mode 100644 boards/dk-tm4c123g/uart_echo/uart_echo.uvopt create mode 100644 boards/dk-tm4c123g/uart_echo/uart_echo.uvproj create mode 100644 boards/dk-tm4c123g/uart_echo/uart_echo_ccs.cmd create mode 100644 boards/dk-tm4c123g/udma_demo/Makefile create mode 100644 boards/dk-tm4c123g/udma_demo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/udma_demo/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/udma_demo/ccs/.cproject create mode 100644 boards/dk-tm4c123g/udma_demo/ccs/.project create mode 100644 boards/dk-tm4c123g/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/udma_demo/ccs/Debug/udma_demo.bin create mode 100644 boards/dk-tm4c123g/udma_demo/ccs/Debug/udma_demo.out create mode 100644 boards/dk-tm4c123g/udma_demo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/udma_demo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/udma_demo/ewarm/Exe/udma_demo.bin create mode 100644 boards/dk-tm4c123g/udma_demo/ewarm/Exe/udma_demo.out create mode 100644 boards/dk-tm4c123g/udma_demo/gcc/udma_demo.axf create mode 100644 boards/dk-tm4c123g/udma_demo/gcc/udma_demo.bin create mode 100644 boards/dk-tm4c123g/udma_demo/readme.txt create mode 100644 boards/dk-tm4c123g/udma_demo/rvmdk/udma_demo.axf create mode 100644 boards/dk-tm4c123g/udma_demo/rvmdk/udma_demo.bin create mode 100644 boards/dk-tm4c123g/udma_demo/startup_ccs.c create mode 100644 boards/dk-tm4c123g/udma_demo/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/udma_demo/startup_gcc.c create mode 100644 boards/dk-tm4c123g/udma_demo/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/udma_demo/udma_demo.c create mode 100644 boards/dk-tm4c123g/udma_demo/udma_demo.ewd create mode 100644 boards/dk-tm4c123g/udma_demo/udma_demo.ewp create mode 100644 boards/dk-tm4c123g/udma_demo/udma_demo.icf create mode 100644 boards/dk-tm4c123g/udma_demo/udma_demo.ld create mode 100644 boards/dk-tm4c123g/udma_demo/udma_demo.sct create mode 100644 boards/dk-tm4c123g/udma_demo/udma_demo.uvopt create mode 100644 boards/dk-tm4c123g/udma_demo/udma_demo.uvproj create mode 100644 boards/dk-tm4c123g/udma_demo/udma_demo_ccs.cmd create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/Makefile create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/ccs/.cproject create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/ccs/.project create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/gcc/usb_dev_bulk.axf create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/gcc/usb_dev_bulk.bin create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/readme.txt create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/rvmdk/usb_dev_bulk.axf create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/rvmdk/usb_dev_bulk.bin create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/startup_ccs.c create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/startup_gcc.c create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/usb_bulk_structs.c create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/usb_bulk_structs.h create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.c create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ewd create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ewp create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.icf create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ld create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.sct create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.uvopt create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.uvproj create mode 100644 boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk_ccs.cmd create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/Makefile create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/ccs/.cproject create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/ccs/.project create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/gcc/usb_dev_keyboard.axf create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/gcc/usb_dev_keyboard.bin create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/readme.txt create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/startup_ccs.c create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/startup_gcc.c create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.c create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ewd create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ewp create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.icf create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ld create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.sct create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.uvopt create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.uvproj create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/usb_keyb_structs.c create mode 100644 boards/dk-tm4c123g/usb_dev_keyboard/usb_keyb_structs.h create mode 100644 boards/dk-tm4c123g/usb_dev_msc/Makefile create mode 100644 boards/dk-tm4c123g/usb_dev_msc/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/usb_dev_msc/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/usb_dev_msc/ccs/.cproject create mode 100644 boards/dk-tm4c123g/usb_dev_msc/ccs/.project create mode 100644 boards/dk-tm4c123g/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/usb_dev_msc/ccs/Debug/usb_dev_msc.bin create mode 100644 boards/dk-tm4c123g/usb_dev_msc/ccs/Debug/usb_dev_msc.out create mode 100644 boards/dk-tm4c123g/usb_dev_msc/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/usb_dev_msc/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin create mode 100644 boards/dk-tm4c123g/usb_dev_msc/ewarm/Exe/usb_dev_msc.out create mode 100644 boards/dk-tm4c123g/usb_dev_msc/gcc/usb_dev_msc.axf create mode 100644 boards/dk-tm4c123g/usb_dev_msc/gcc/usb_dev_msc.bin create mode 100644 boards/dk-tm4c123g/usb_dev_msc/readme.txt create mode 100644 boards/dk-tm4c123g/usb_dev_msc/rvmdk/usb_dev_msc.axf create mode 100644 boards/dk-tm4c123g/usb_dev_msc/rvmdk/usb_dev_msc.bin create mode 100644 boards/dk-tm4c123g/usb_dev_msc/startup_ccs.c create mode 100644 boards/dk-tm4c123g/usb_dev_msc/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/usb_dev_msc/startup_gcc.c create mode 100644 boards/dk-tm4c123g/usb_dev_msc/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.c create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ewd create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ewp create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.icf create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ld create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.sct create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.uvopt create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.uvproj create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc_ccs.cmd create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usb_msc_structs.c create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usb_msc_structs.h create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usbdsdcard.c create mode 100644 boards/dk-tm4c123g/usb_dev_msc/usbdsdcard.h create mode 100644 boards/dk-tm4c123g/usb_dev_serial/Makefile create mode 100644 boards/dk-tm4c123g/usb_dev_serial/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/usb_dev_serial/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/usb_dev_serial/ccs/.cproject create mode 100644 boards/dk-tm4c123g/usb_dev_serial/ccs/.project create mode 100644 boards/dk-tm4c123g/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/usb_dev_serial/ccs/Debug/usb_dev_serial.bin create mode 100644 boards/dk-tm4c123g/usb_dev_serial/ccs/Debug/usb_dev_serial.out create mode 100644 boards/dk-tm4c123g/usb_dev_serial/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/usb_dev_serial/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin create mode 100644 boards/dk-tm4c123g/usb_dev_serial/ewarm/Exe/usb_dev_serial.out create mode 100644 boards/dk-tm4c123g/usb_dev_serial/gcc/usb_dev_serial.axf create mode 100644 boards/dk-tm4c123g/usb_dev_serial/gcc/usb_dev_serial.bin create mode 100644 boards/dk-tm4c123g/usb_dev_serial/readme.txt create mode 100644 boards/dk-tm4c123g/usb_dev_serial/rvmdk/usb_dev_serial.axf create mode 100644 boards/dk-tm4c123g/usb_dev_serial/rvmdk/usb_dev_serial.bin create mode 100644 boards/dk-tm4c123g/usb_dev_serial/startup_ccs.c create mode 100644 boards/dk-tm4c123g/usb_dev_serial/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/usb_dev_serial/startup_gcc.c create mode 100644 boards/dk-tm4c123g/usb_dev_serial/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.c create mode 100644 boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ewd create mode 100644 boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ewp create mode 100644 boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.icf create mode 100644 boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ld create mode 100644 boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.sct create mode 100644 boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.uvopt create mode 100644 boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.uvproj create mode 100644 boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial_ccs.cmd create mode 100644 boards/dk-tm4c123g/usb_dev_serial/usb_serial_structs.c create mode 100644 boards/dk-tm4c123g/usb_dev_serial/usb_serial_structs.h create mode 100644 boards/dk-tm4c123g/usb_host_audio/Makefile create mode 100644 boards/dk-tm4c123g/usb_host_audio/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/usb_host_audio/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/usb_host_audio/ccs/.cproject create mode 100644 boards/dk-tm4c123g/usb_host_audio/ccs/.project create mode 100644 boards/dk-tm4c123g/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/usb_host_audio/ccs/Debug/usb_host_audio.bin create mode 100644 boards/dk-tm4c123g/usb_host_audio/ccs/Debug/usb_host_audio.out create mode 100644 boards/dk-tm4c123g/usb_host_audio/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/usb_host_audio/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/usb_host_audio/ewarm/Exe/usb_host_audio.bin create mode 100644 boards/dk-tm4c123g/usb_host_audio/ewarm/Exe/usb_host_audio.out create mode 100644 boards/dk-tm4c123g/usb_host_audio/gcc/usb_host_audio.axf create mode 100644 boards/dk-tm4c123g/usb_host_audio/gcc/usb_host_audio.bin create mode 100644 boards/dk-tm4c123g/usb_host_audio/readme.txt create mode 100644 boards/dk-tm4c123g/usb_host_audio/rvmdk/usb_host_audio.axf create mode 100644 boards/dk-tm4c123g/usb_host_audio/rvmdk/usb_host_audio.bin create mode 100644 boards/dk-tm4c123g/usb_host_audio/startup_ccs.c create mode 100644 boards/dk-tm4c123g/usb_host_audio/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/usb_host_audio/startup_gcc.c create mode 100644 boards/dk-tm4c123g/usb_host_audio/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/usb_host_audio/usb_host_audio.c create mode 100644 boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ewd create mode 100644 boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ewp create mode 100644 boards/dk-tm4c123g/usb_host_audio/usb_host_audio.icf create mode 100644 boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ld create mode 100644 boards/dk-tm4c123g/usb_host_audio/usb_host_audio.sct create mode 100644 boards/dk-tm4c123g/usb_host_audio/usb_host_audio.uvopt create mode 100644 boards/dk-tm4c123g/usb_host_audio/usb_host_audio.uvproj create mode 100644 boards/dk-tm4c123g/usb_host_audio/usb_host_audio_ccs.cmd create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/Makefile create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/ccs/.cproject create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/ccs/.project create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/gcc/usb_host_keyboard.axf create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/gcc/usb_host_keyboard.bin create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/readme.txt create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/rvmdk/usb_host_keyboard.axf create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/rvmdk/usb_host_keyboard.bin create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/startup_ccs.c create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/startup_gcc.c create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.c create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ewd create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ewp create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.icf create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ld create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.sct create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.uvopt create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.uvproj create mode 100644 boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard_ccs.cmd create mode 100644 boards/dk-tm4c123g/usb_host_mouse/Makefile create mode 100644 boards/dk-tm4c123g/usb_host_mouse/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/usb_host_mouse/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/usb_host_mouse/ccs/.cproject create mode 100644 boards/dk-tm4c123g/usb_host_mouse/ccs/.project create mode 100644 boards/dk-tm4c123g/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/usb_host_mouse/ccs/Debug/usb_host_mouse.bin create mode 100644 boards/dk-tm4c123g/usb_host_mouse/ccs/Debug/usb_host_mouse.out create mode 100644 boards/dk-tm4c123g/usb_host_mouse/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/usb_host_mouse/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin create mode 100644 boards/dk-tm4c123g/usb_host_mouse/ewarm/Exe/usb_host_mouse.out create mode 100644 boards/dk-tm4c123g/usb_host_mouse/gcc/usb_host_mouse.axf create mode 100644 boards/dk-tm4c123g/usb_host_mouse/gcc/usb_host_mouse.bin create mode 100644 boards/dk-tm4c123g/usb_host_mouse/readme.txt create mode 100644 boards/dk-tm4c123g/usb_host_mouse/rvmdk/usb_host_mouse.axf create mode 100644 boards/dk-tm4c123g/usb_host_mouse/rvmdk/usb_host_mouse.bin create mode 100644 boards/dk-tm4c123g/usb_host_mouse/startup_ccs.c create mode 100644 boards/dk-tm4c123g/usb_host_mouse/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/usb_host_mouse/startup_gcc.c create mode 100644 boards/dk-tm4c123g/usb_host_mouse/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.c create mode 100644 boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ewd create mode 100644 boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ewp create mode 100644 boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.icf create mode 100644 boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ld create mode 100644 boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.sct create mode 100644 boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.uvopt create mode 100644 boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.uvproj create mode 100644 boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse_ccs.cmd create mode 100644 boards/dk-tm4c123g/usb_host_msc/Makefile create mode 100644 boards/dk-tm4c123g/usb_host_msc/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/usb_host_msc/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/usb_host_msc/ccs/.cproject create mode 100644 boards/dk-tm4c123g/usb_host_msc/ccs/.project create mode 100644 boards/dk-tm4c123g/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/usb_host_msc/ccs/Debug/usb_host_msc.bin create mode 100644 boards/dk-tm4c123g/usb_host_msc/ccs/Debug/usb_host_msc.out create mode 100644 boards/dk-tm4c123g/usb_host_msc/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/usb_host_msc/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/usb_host_msc/ewarm/Exe/usb_host_msc.bin create mode 100644 boards/dk-tm4c123g/usb_host_msc/ewarm/Exe/usb_host_msc.out create mode 100644 boards/dk-tm4c123g/usb_host_msc/gcc/usb_host_msc.axf create mode 100644 boards/dk-tm4c123g/usb_host_msc/gcc/usb_host_msc.bin create mode 100644 boards/dk-tm4c123g/usb_host_msc/readme.txt create mode 100644 boards/dk-tm4c123g/usb_host_msc/rvmdk/usb_host_msc.axf create mode 100644 boards/dk-tm4c123g/usb_host_msc/rvmdk/usb_host_msc.bin create mode 100644 boards/dk-tm4c123g/usb_host_msc/startup_ccs.c create mode 100644 boards/dk-tm4c123g/usb_host_msc/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/usb_host_msc/startup_gcc.c create mode 100644 boards/dk-tm4c123g/usb_host_msc/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/usb_host_msc/usb_host_msc.c create mode 100644 boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ewd create mode 100644 boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ewp create mode 100644 boards/dk-tm4c123g/usb_host_msc/usb_host_msc.icf create mode 100644 boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ld create mode 100644 boards/dk-tm4c123g/usb_host_msc/usb_host_msc.sct create mode 100644 boards/dk-tm4c123g/usb_host_msc/usb_host_msc.uvopt create mode 100644 boards/dk-tm4c123g/usb_host_msc/usb_host_msc.uvproj create mode 100644 boards/dk-tm4c123g/usb_host_msc/usb_host_msc_ccs.cmd create mode 100644 boards/dk-tm4c123g/usb_stick_demo/Makefile create mode 100644 boards/dk-tm4c123g/usb_stick_demo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/usb_stick_demo/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/usb_stick_demo/ccs/.cproject create mode 100644 boards/dk-tm4c123g/usb_stick_demo/ccs/.project create mode 100644 boards/dk-tm4c123g/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/usb_stick_demo/ccs/Debug/usb_stick_demo.bin create mode 100644 boards/dk-tm4c123g/usb_stick_demo/ccs/Debug/usb_stick_demo.out create mode 100644 boards/dk-tm4c123g/usb_stick_demo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/usb_stick_demo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin create mode 100644 boards/dk-tm4c123g/usb_stick_demo/ewarm/Exe/usb_stick_demo.out create mode 100644 boards/dk-tm4c123g/usb_stick_demo/gcc/usb_stick_demo.axf create mode 100644 boards/dk-tm4c123g/usb_stick_demo/gcc/usb_stick_demo.bin create mode 100644 boards/dk-tm4c123g/usb_stick_demo/readme.txt create mode 100644 boards/dk-tm4c123g/usb_stick_demo/rvmdk/usb_stick_demo.axf create mode 100644 boards/dk-tm4c123g/usb_stick_demo/rvmdk/usb_stick_demo.bin create mode 100644 boards/dk-tm4c123g/usb_stick_demo/startup_ccs.c create mode 100644 boards/dk-tm4c123g/usb_stick_demo/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/usb_stick_demo/startup_gcc.c create mode 100644 boards/dk-tm4c123g/usb_stick_demo/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.c create mode 100644 boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ewd create mode 100644 boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ewp create mode 100644 boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.icf create mode 100644 boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ld create mode 100644 boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.sct create mode 100644 boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.uvopt create mode 100644 boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.uvproj create mode 100644 boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo_ccs.cmd create mode 100644 boards/dk-tm4c123g/usb_stick_update/Makefile create mode 100644 boards/dk-tm4c123g/usb_stick_update/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/usb_stick_update/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/usb_stick_update/ccs/.cproject create mode 100644 boards/dk-tm4c123g/usb_stick_update/ccs/.project create mode 100644 boards/dk-tm4c123g/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/usb_stick_update/ccs/Debug/usb_stick_update.bin create mode 100644 boards/dk-tm4c123g/usb_stick_update/ccs/Debug/usb_stick_update.out create mode 100644 boards/dk-tm4c123g/usb_stick_update/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/usb_stick_update/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/usb_stick_update/ewarm/Exe/usb_stick_update.bin create mode 100644 boards/dk-tm4c123g/usb_stick_update/ewarm/Exe/usb_stick_update.out create mode 100644 boards/dk-tm4c123g/usb_stick_update/gcc/usb_stick_update.axf create mode 100644 boards/dk-tm4c123g/usb_stick_update/gcc/usb_stick_update.bin create mode 100644 boards/dk-tm4c123g/usb_stick_update/readme.txt create mode 100644 boards/dk-tm4c123g/usb_stick_update/rvmdk/usb_stick_update.axf create mode 100644 boards/dk-tm4c123g/usb_stick_update/rvmdk/usb_stick_update.bin create mode 100644 boards/dk-tm4c123g/usb_stick_update/simple_fs.c create mode 100644 boards/dk-tm4c123g/usb_stick_update/simple_fs.h create mode 100644 boards/dk-tm4c123g/usb_stick_update/startup_ccs.c create mode 100644 boards/dk-tm4c123g/usb_stick_update/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/usb_stick_update/startup_gcc.c create mode 100644 boards/dk-tm4c123g/usb_stick_update/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/usb_stick_update/usb_stick_update.c create mode 100644 boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ewd create mode 100644 boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ewp create mode 100644 boards/dk-tm4c123g/usb_stick_update/usb_stick_update.icf create mode 100644 boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ld create mode 100644 boards/dk-tm4c123g/usb_stick_update/usb_stick_update.sct create mode 100644 boards/dk-tm4c123g/usb_stick_update/usb_stick_update.uvopt create mode 100644 boards/dk-tm4c123g/usb_stick_update/usb_stick_update.uvproj create mode 100644 boards/dk-tm4c123g/usb_stick_update/usb_stick_update_ccs.cmd create mode 100644 boards/dk-tm4c123g/watchdog/Makefile create mode 100644 boards/dk-tm4c123g/watchdog/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c123g/watchdog/ccs/.ccsproject create mode 100644 boards/dk-tm4c123g/watchdog/ccs/.cproject create mode 100644 boards/dk-tm4c123g/watchdog/ccs/.project create mode 100644 boards/dk-tm4c123g/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c123g/watchdog/ccs/Debug/watchdog.bin create mode 100644 boards/dk-tm4c123g/watchdog/ccs/Debug/watchdog.out create mode 100644 boards/dk-tm4c123g/watchdog/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c123g/watchdog/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c123g/watchdog/ewarm/Exe/watchdog.bin create mode 100644 boards/dk-tm4c123g/watchdog/ewarm/Exe/watchdog.out create mode 100644 boards/dk-tm4c123g/watchdog/gcc/watchdog.axf create mode 100644 boards/dk-tm4c123g/watchdog/gcc/watchdog.bin create mode 100644 boards/dk-tm4c123g/watchdog/readme.txt create mode 100644 boards/dk-tm4c123g/watchdog/rvmdk/watchdog.axf create mode 100644 boards/dk-tm4c123g/watchdog/rvmdk/watchdog.bin create mode 100644 boards/dk-tm4c123g/watchdog/startup_ccs.c create mode 100644 boards/dk-tm4c123g/watchdog/startup_ewarm.c create mode 100644 boards/dk-tm4c123g/watchdog/startup_gcc.c create mode 100644 boards/dk-tm4c123g/watchdog/startup_rvmdk.S create mode 100644 boards/dk-tm4c123g/watchdog/watchdog.c create mode 100644 boards/dk-tm4c123g/watchdog/watchdog.ewd create mode 100644 boards/dk-tm4c123g/watchdog/watchdog.ewp create mode 100644 boards/dk-tm4c123g/watchdog/watchdog.icf create mode 100644 boards/dk-tm4c123g/watchdog/watchdog.ld create mode 100644 boards/dk-tm4c123g/watchdog/watchdog.sct create mode 100644 boards/dk-tm4c123g/watchdog/watchdog.uvopt create mode 100644 boards/dk-tm4c123g/watchdog/watchdog.uvproj create mode 100644 boards/dk-tm4c123g/watchdog/watchdog_ccs.cmd create mode 100644 boards/dk-tm4c129x/Makefile create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/Makefile create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.c create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ewd create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ewp create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.icf create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ld create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.sct create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.uvopt create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.uvproj create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt_ccs.cmd create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.cproject create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.project create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/ccs/Debug/aes_cbc_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/ccs/Debug/aes_cbc_decrypt.out create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/ewarm/Exe/aes_cbc_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/ewarm/Exe/aes_cbc_decrypt.out create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/gcc/aes_cbc_decrypt.axf create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/gcc/aes_cbc_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/readme.txt create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/rvmdk/aes_cbc_decrypt.axf create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/rvmdk/aes_cbc_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/startup_ccs.c create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/startup_gcc.c create mode 100644 boards/dk-tm4c129x/aes_cbc_decrypt/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/Makefile create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.c create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ewd create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ewp create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.icf create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ld create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.sct create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.uvopt create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.uvproj create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt_ccs.cmd create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.cproject create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.project create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/ccs/Debug/aes_cbc_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/ccs/Debug/aes_cbc_encrypt.out create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/ewarm/Exe/aes_cbc_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/ewarm/Exe/aes_cbc_encrypt.out create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/gcc/aes_cbc_encrypt.axf create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/gcc/aes_cbc_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/readme.txt create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/rvmdk/aes_cbc_encrypt.axf create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/rvmdk/aes_cbc_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/startup_ccs.c create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/startup_gcc.c create mode 100644 boards/dk-tm4c129x/aes_cbc_encrypt/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/Makefile create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.c create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ewd create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ewp create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.icf create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ld create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.sct create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.uvopt create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.uvproj create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt_ccs.cmd create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.cproject create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.project create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/ccs/Debug/aes_ccm_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/ccs/Debug/aes_ccm_decrypt.out create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/ewarm/Exe/aes_ccm_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/ewarm/Exe/aes_ccm_decrypt.out create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/gcc/aes_ccm_decrypt.axf create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/gcc/aes_ccm_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/readme.txt create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/rvmdk/aes_ccm_decrypt.axf create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/rvmdk/aes_ccm_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/startup_ccs.c create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/startup_gcc.c create mode 100644 boards/dk-tm4c129x/aes_ccm_decrypt/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/Makefile create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.c create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ewd create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ewp create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.icf create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ld create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.sct create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.uvopt create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.uvproj create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt_ccs.cmd create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.cproject create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.project create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/ccs/Debug/aes_ccm_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/ccs/Debug/aes_ccm_encrypt.out create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/ewarm/Exe/aes_ccm_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/ewarm/Exe/aes_ccm_encrypt.out create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/gcc/aes_ccm_encrypt.axf create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/gcc/aes_ccm_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/readme.txt create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/rvmdk/aes_ccm_encrypt.axf create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/rvmdk/aes_ccm_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/startup_ccs.c create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/startup_gcc.c create mode 100644 boards/dk-tm4c129x/aes_ccm_encrypt/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/aes_cmac/Makefile create mode 100644 boards/dk-tm4c129x/aes_cmac/aes_cmac.c create mode 100644 boards/dk-tm4c129x/aes_cmac/aes_cmac.ewd create mode 100644 boards/dk-tm4c129x/aes_cmac/aes_cmac.ewp create mode 100644 boards/dk-tm4c129x/aes_cmac/aes_cmac.icf create mode 100644 boards/dk-tm4c129x/aes_cmac/aes_cmac.ld create mode 100644 boards/dk-tm4c129x/aes_cmac/aes_cmac.sct create mode 100644 boards/dk-tm4c129x/aes_cmac/aes_cmac.uvopt create mode 100644 boards/dk-tm4c129x/aes_cmac/aes_cmac.uvproj create mode 100644 boards/dk-tm4c129x/aes_cmac/aes_cmac_ccs.cmd create mode 100644 boards/dk-tm4c129x/aes_cmac/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/aes_cmac/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/aes_cmac/ccs/.cproject create mode 100644 boards/dk-tm4c129x/aes_cmac/ccs/.project create mode 100644 boards/dk-tm4c129x/aes_cmac/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/aes_cmac/ccs/Debug/aes_cmac.bin create mode 100644 boards/dk-tm4c129x/aes_cmac/ccs/Debug/aes_cmac.out create mode 100644 boards/dk-tm4c129x/aes_cmac/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/aes_cmac/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/aes_cmac/ewarm/Exe/aes_cmac.bin create mode 100644 boards/dk-tm4c129x/aes_cmac/ewarm/Exe/aes_cmac.out create mode 100644 boards/dk-tm4c129x/aes_cmac/gcc/aes_cmac.axf create mode 100644 boards/dk-tm4c129x/aes_cmac/gcc/aes_cmac.bin create mode 100644 boards/dk-tm4c129x/aes_cmac/readme.txt create mode 100644 boards/dk-tm4c129x/aes_cmac/rvmdk/aes_cmac.axf create mode 100644 boards/dk-tm4c129x/aes_cmac/rvmdk/aes_cmac.bin create mode 100644 boards/dk-tm4c129x/aes_cmac/startup_ccs.c create mode 100644 boards/dk-tm4c129x/aes_cmac/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/aes_cmac/startup_gcc.c create mode 100644 boards/dk-tm4c129x/aes_cmac/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/Makefile create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.c create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ewd create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ewp create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.icf create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ld create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.sct create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.uvopt create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.uvproj create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt_ccs.cmd create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.cproject create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.project create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/ccs/Debug/aes_ecb_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/ccs/Debug/aes_ecb_decrypt.out create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/ewarm/Exe/aes_ecb_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/ewarm/Exe/aes_ecb_decrypt.out create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/gcc/aes_ecb_decrypt.axf create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/gcc/aes_ecb_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/readme.txt create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/rvmdk/aes_ecb_decrypt.axf create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/rvmdk/aes_ecb_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/startup_ccs.c create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/startup_gcc.c create mode 100644 boards/dk-tm4c129x/aes_ecb_decrypt/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/Makefile create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.c create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ewd create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ewp create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.icf create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ld create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.sct create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.uvopt create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.uvproj create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt_ccs.cmd create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.cproject create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.project create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/ccs/Debug/aes_ecb_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/ccs/Debug/aes_ecb_encrypt.out create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/ewarm/Exe/aes_ecb_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/ewarm/Exe/aes_ecb_encrypt.out create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/gcc/aes_ecb_encrypt.axf create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/gcc/aes_ecb_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/readme.txt create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/rvmdk/aes_ecb_encrypt.axf create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/rvmdk/aes_ecb_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/startup_ccs.c create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/startup_gcc.c create mode 100644 boards/dk-tm4c129x/aes_ecb_encrypt/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/Makefile create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.c create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ewd create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ewp create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.icf create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ld create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.sct create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.uvopt create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.uvproj create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt_ccs.cmd create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.cproject create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.project create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/ccs/Debug/aes_gcm_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/ccs/Debug/aes_gcm_decrypt.out create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/ewarm/Exe/aes_gcm_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/ewarm/Exe/aes_gcm_decrypt.out create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/gcc/aes_gcm_decrypt.axf create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/gcc/aes_gcm_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/readme.txt create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/rvmdk/aes_gcm_decrypt.axf create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/rvmdk/aes_gcm_decrypt.bin create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/startup_ccs.c create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/startup_gcc.c create mode 100644 boards/dk-tm4c129x/aes_gcm_decrypt/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/Makefile create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.c create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ewd create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ewp create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.icf create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ld create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.sct create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.uvopt create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.uvproj create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt_ccs.cmd create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.cproject create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.project create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/ccs/Debug/aes_gcm_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/ccs/Debug/aes_gcm_encrypt.out create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/ewarm/Exe/aes_gcm_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/ewarm/Exe/aes_gcm_encrypt.out create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/gcc/aes_gcm_encrypt.axf create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/gcc/aes_gcm_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/readme.txt create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/rvmdk/aes_gcm_encrypt.axf create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/rvmdk/aes_gcm_encrypt.bin create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/startup_ccs.c create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/startup_gcc.c create mode 100644 boards/dk-tm4c129x/aes_gcm_encrypt/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/bitband/Makefile create mode 100644 boards/dk-tm4c129x/bitband/bitband.c create mode 100644 boards/dk-tm4c129x/bitband/bitband.ewd create mode 100644 boards/dk-tm4c129x/bitband/bitband.ewp create mode 100644 boards/dk-tm4c129x/bitband/bitband.icf create mode 100644 boards/dk-tm4c129x/bitband/bitband.ld create mode 100644 boards/dk-tm4c129x/bitband/bitband.sct create mode 100644 boards/dk-tm4c129x/bitband/bitband.uvopt create mode 100644 boards/dk-tm4c129x/bitband/bitband.uvproj create mode 100644 boards/dk-tm4c129x/bitband/bitband_ccs.cmd create mode 100644 boards/dk-tm4c129x/bitband/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/bitband/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/bitband/ccs/.cproject create mode 100644 boards/dk-tm4c129x/bitband/ccs/.project create mode 100644 boards/dk-tm4c129x/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/bitband/ccs/Debug/bitband.bin create mode 100644 boards/dk-tm4c129x/bitband/ccs/Debug/bitband.out create mode 100644 boards/dk-tm4c129x/bitband/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/bitband/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/bitband/ewarm/Exe/bitband.bin create mode 100644 boards/dk-tm4c129x/bitband/ewarm/Exe/bitband.out create mode 100644 boards/dk-tm4c129x/bitband/gcc/bitband.axf create mode 100644 boards/dk-tm4c129x/bitband/gcc/bitband.bin create mode 100644 boards/dk-tm4c129x/bitband/readme.txt create mode 100644 boards/dk-tm4c129x/bitband/rvmdk/bitband.axf create mode 100644 boards/dk-tm4c129x/bitband/rvmdk/bitband.bin create mode 100644 boards/dk-tm4c129x/bitband/startup_ccs.c create mode 100644 boards/dk-tm4c129x/bitband/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/bitband/startup_gcc.c create mode 100644 boards/dk-tm4c129x/bitband/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/ble_btool/Makefile create mode 100644 boards/dk-tm4c129x/ble_btool/ble_btool.c create mode 100644 boards/dk-tm4c129x/ble_btool/ble_btool.ewd create mode 100644 boards/dk-tm4c129x/ble_btool/ble_btool.ewp create mode 100644 boards/dk-tm4c129x/ble_btool/ble_btool.icf create mode 100644 boards/dk-tm4c129x/ble_btool/ble_btool.ld create mode 100644 boards/dk-tm4c129x/ble_btool/ble_btool.sct create mode 100644 boards/dk-tm4c129x/ble_btool/ble_btool.uvopt create mode 100644 boards/dk-tm4c129x/ble_btool/ble_btool.uvproj create mode 100644 boards/dk-tm4c129x/ble_btool/ble_btool_ccs.cmd create mode 100644 boards/dk-tm4c129x/ble_btool/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/ble_btool/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/ble_btool/ccs/.cproject create mode 100644 boards/dk-tm4c129x/ble_btool/ccs/.project create mode 100644 boards/dk-tm4c129x/ble_btool/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/ble_btool/ccs/Debug/ble_btool.bin create mode 100644 boards/dk-tm4c129x/ble_btool/ccs/Debug/ble_btool.out create mode 100644 boards/dk-tm4c129x/ble_btool/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/ble_btool/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/ble_btool/ewarm/Exe/ble_btool.bin create mode 100644 boards/dk-tm4c129x/ble_btool/ewarm/Exe/ble_btool.out create mode 100644 boards/dk-tm4c129x/ble_btool/gcc/ble_btool.axf create mode 100644 boards/dk-tm4c129x/ble_btool/gcc/ble_btool.bin create mode 100644 boards/dk-tm4c129x/ble_btool/readme.txt create mode 100644 boards/dk-tm4c129x/ble_btool/rvmdk/ble_btool.axf create mode 100644 boards/dk-tm4c129x/ble_btool/rvmdk/ble_btool.bin create mode 100644 boards/dk-tm4c129x/ble_btool/startup_ccs.c create mode 100644 boards/dk-tm4c129x/ble_btool/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/ble_btool/startup_gcc.c create mode 100644 boards/dk-tm4c129x/ble_btool/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/ble_central/Makefile create mode 100644 boards/dk-tm4c129x/ble_central/ble_central.c create mode 100644 boards/dk-tm4c129x/ble_central/ble_central.ewd create mode 100644 boards/dk-tm4c129x/ble_central/ble_central.ewp create mode 100644 boards/dk-tm4c129x/ble_central/ble_central.icf create mode 100644 boards/dk-tm4c129x/ble_central/ble_central.ld create mode 100644 boards/dk-tm4c129x/ble_central/ble_central.sct create mode 100644 boards/dk-tm4c129x/ble_central/ble_central.uvopt create mode 100644 boards/dk-tm4c129x/ble_central/ble_central.uvproj create mode 100644 boards/dk-tm4c129x/ble_central/ble_central_ccs.cmd create mode 100644 boards/dk-tm4c129x/ble_central/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/ble_central/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/ble_central/ccs/.cproject create mode 100644 boards/dk-tm4c129x/ble_central/ccs/.project create mode 100644 boards/dk-tm4c129x/ble_central/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/ble_central/ccs/Debug/ble_central.bin create mode 100644 boards/dk-tm4c129x/ble_central/ccs/Debug/ble_central.out create mode 100644 boards/dk-tm4c129x/ble_central/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/ble_central/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/ble_central/ewarm/Exe/ble_central.bin create mode 100644 boards/dk-tm4c129x/ble_central/ewarm/Exe/ble_central.out create mode 100644 boards/dk-tm4c129x/ble_central/gap.c create mode 100644 boards/dk-tm4c129x/ble_central/gcc/ble_central.axf create mode 100644 boards/dk-tm4c129x/ble_central/gcc/ble_central.bin create mode 100644 boards/dk-tm4c129x/ble_central/hci.h create mode 100644 boards/dk-tm4c129x/ble_central/readme.txt create mode 100644 boards/dk-tm4c129x/ble_central/rvmdk/ble_central.axf create mode 100644 boards/dk-tm4c129x/ble_central/rvmdk/ble_central.bin create mode 100644 boards/dk-tm4c129x/ble_central/startup_ccs.c create mode 100644 boards/dk-tm4c129x/ble_central/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/ble_central/startup_gcc.c create mode 100644 boards/dk-tm4c129x/ble_central/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/blinky/Makefile create mode 100644 boards/dk-tm4c129x/blinky/blinky.c create mode 100644 boards/dk-tm4c129x/blinky/blinky.ewd create mode 100644 boards/dk-tm4c129x/blinky/blinky.ewp create mode 100644 boards/dk-tm4c129x/blinky/blinky.icf create mode 100644 boards/dk-tm4c129x/blinky/blinky.ld create mode 100644 boards/dk-tm4c129x/blinky/blinky.sct create mode 100644 boards/dk-tm4c129x/blinky/blinky.uvopt create mode 100644 boards/dk-tm4c129x/blinky/blinky.uvproj create mode 100644 boards/dk-tm4c129x/blinky/blinky_ccs.cmd create mode 100644 boards/dk-tm4c129x/blinky/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/blinky/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/blinky/ccs/.cproject create mode 100644 boards/dk-tm4c129x/blinky/ccs/.project create mode 100644 boards/dk-tm4c129x/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/blinky/ccs/Debug/blinky.bin create mode 100644 boards/dk-tm4c129x/blinky/ccs/Debug/blinky.out create mode 100644 boards/dk-tm4c129x/blinky/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/blinky/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/blinky/ewarm/Exe/blinky.bin create mode 100644 boards/dk-tm4c129x/blinky/ewarm/Exe/blinky.out create mode 100644 boards/dk-tm4c129x/blinky/gcc/blinky.axf create mode 100644 boards/dk-tm4c129x/blinky/gcc/blinky.bin create mode 100644 boards/dk-tm4c129x/blinky/readme.txt create mode 100644 boards/dk-tm4c129x/blinky/rvmdk/blinky.axf create mode 100644 boards/dk-tm4c129x/blinky/rvmdk/blinky.bin create mode 100644 boards/dk-tm4c129x/blinky/startup_ccs.c create mode 100644 boards/dk-tm4c129x/blinky/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/blinky/startup_gcc.c create mode 100644 boards/dk-tm4c129x/blinky/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/Makefile create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.c create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ewd create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ewp create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.icf create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ld create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.sct create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.uvopt create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.uvproj create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash_ccs.cmd create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.cproject create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.project create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/ccs/Debug/boot_demo_emac_flash.bin create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/ccs/Debug/boot_demo_emac_flash.out create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/ewarm/Exe/boot_demo_emac_flash.bin create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/ewarm/Exe/boot_demo_emac_flash.out create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/gcc/boot_demo_emac_flash.axf create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/gcc/boot_demo_emac_flash.bin create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/lwipopts.h create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/readme.txt create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/rvmdk/boot_demo_emac_flash.axf create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/rvmdk/boot_demo_emac_flash.bin create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/startup_ccs.c create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/startup_gcc.c create mode 100644 boards/dk-tm4c129x/boot_demo_emac_flash/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/boot_demo_flash/Makefile create mode 100644 boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.c create mode 100644 boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ewd create mode 100644 boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ewp create mode 100644 boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.icf create mode 100644 boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ld create mode 100644 boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.sct create mode 100644 boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.uvopt create mode 100644 boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.uvproj create mode 100644 boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash_ccs.cmd create mode 100644 boards/dk-tm4c129x/boot_demo_flash/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/boot_demo_flash/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/boot_demo_flash/ccs/.cproject create mode 100644 boards/dk-tm4c129x/boot_demo_flash/ccs/.project create mode 100644 boards/dk-tm4c129x/boot_demo_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/boot_demo_flash/ccs/Debug/boot_demo_flash.bin create mode 100644 boards/dk-tm4c129x/boot_demo_flash/ccs/Debug/boot_demo_flash.out create mode 100644 boards/dk-tm4c129x/boot_demo_flash/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/boot_demo_flash/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/boot_demo_flash/ewarm/Exe/boot_demo_flash.bin create mode 100644 boards/dk-tm4c129x/boot_demo_flash/ewarm/Exe/boot_demo_flash.out create mode 100644 boards/dk-tm4c129x/boot_demo_flash/gcc/boot_demo_flash.axf create mode 100644 boards/dk-tm4c129x/boot_demo_flash/gcc/boot_demo_flash.bin create mode 100644 boards/dk-tm4c129x/boot_demo_flash/lwipopts.h create mode 100644 boards/dk-tm4c129x/boot_demo_flash/readme.txt create mode 100644 boards/dk-tm4c129x/boot_demo_flash/rvmdk/boot_demo_flash.axf create mode 100644 boards/dk-tm4c129x/boot_demo_flash/rvmdk/boot_demo_flash.bin create mode 100644 boards/dk-tm4c129x/boot_demo_flash/startup_ccs.c create mode 100644 boards/dk-tm4c129x/boot_demo_flash/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/boot_demo_flash/startup_gcc.c create mode 100644 boards/dk-tm4c129x/boot_demo_flash/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/boot_demo_uart/Makefile create mode 100644 boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.c create mode 100644 boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ewd create mode 100644 boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ewp create mode 100644 boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.icf create mode 100644 boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ld create mode 100644 boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.sct create mode 100644 boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.uvopt create mode 100644 boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.uvproj create mode 100644 boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart_ccs.cmd create mode 100644 boards/dk-tm4c129x/boot_demo_uart/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/boot_demo_uart/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/boot_demo_uart/ccs/.cproject create mode 100644 boards/dk-tm4c129x/boot_demo_uart/ccs/.project create mode 100644 boards/dk-tm4c129x/boot_demo_uart/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/boot_demo_uart/ccs/Debug/boot_demo_uart.bin create mode 100644 boards/dk-tm4c129x/boot_demo_uart/ccs/Debug/boot_demo_uart.out create mode 100644 boards/dk-tm4c129x/boot_demo_uart/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/boot_demo_uart/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/boot_demo_uart/ewarm/Exe/boot_demo_uart.bin create mode 100644 boards/dk-tm4c129x/boot_demo_uart/ewarm/Exe/boot_demo_uart.out create mode 100644 boards/dk-tm4c129x/boot_demo_uart/gcc/boot_demo_uart.axf create mode 100644 boards/dk-tm4c129x/boot_demo_uart/gcc/boot_demo_uart.bin create mode 100644 boards/dk-tm4c129x/boot_demo_uart/readme.txt create mode 100644 boards/dk-tm4c129x/boot_demo_uart/rvmdk/boot_demo_uart.axf create mode 100644 boards/dk-tm4c129x/boot_demo_uart/rvmdk/boot_demo_uart.bin create mode 100644 boards/dk-tm4c129x/boot_demo_uart/startup_ccs.c create mode 100644 boards/dk-tm4c129x/boot_demo_uart/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/boot_demo_uart/startup_gcc.c create mode 100644 boards/dk-tm4c129x/boot_demo_uart/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/boot_demo_usb/Makefile create mode 100644 boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.c create mode 100644 boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ewd create mode 100644 boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ewp create mode 100644 boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.icf create mode 100644 boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ld create mode 100644 boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.sct create mode 100644 boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.uvopt create mode 100644 boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.uvproj create mode 100644 boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb_ccs.cmd create mode 100644 boards/dk-tm4c129x/boot_demo_usb/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/boot_demo_usb/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/boot_demo_usb/ccs/.cproject create mode 100644 boards/dk-tm4c129x/boot_demo_usb/ccs/.project create mode 100644 boards/dk-tm4c129x/boot_demo_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/boot_demo_usb/ccs/Debug/boot_demo_usb.bin create mode 100644 boards/dk-tm4c129x/boot_demo_usb/ccs/Debug/boot_demo_usb.out create mode 100644 boards/dk-tm4c129x/boot_demo_usb/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/boot_demo_usb/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/boot_demo_usb/ewarm/Exe/boot_demo_usb.bin create mode 100644 boards/dk-tm4c129x/boot_demo_usb/ewarm/Exe/boot_demo_usb.out create mode 100644 boards/dk-tm4c129x/boot_demo_usb/gcc/boot_demo_usb.axf create mode 100644 boards/dk-tm4c129x/boot_demo_usb/gcc/boot_demo_usb.bin create mode 100644 boards/dk-tm4c129x/boot_demo_usb/readme.txt create mode 100644 boards/dk-tm4c129x/boot_demo_usb/rvmdk/boot_demo_usb.axf create mode 100644 boards/dk-tm4c129x/boot_demo_usb/rvmdk/boot_demo_usb.bin create mode 100644 boards/dk-tm4c129x/boot_demo_usb/startup_ccs.c create mode 100644 boards/dk-tm4c129x/boot_demo_usb/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/boot_demo_usb/startup_gcc.c create mode 100644 boards/dk-tm4c129x/boot_demo_usb/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/boot_demo_usb/usb_hiddfu_structs.c create mode 100644 boards/dk-tm4c129x/boot_demo_usb/usb_hiddfu_structs.h create mode 100644 boards/dk-tm4c129x/boot_emac_flash/Makefile create mode 100644 boards/dk-tm4c129x/boot_emac_flash/bl_config.h create mode 100644 boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.c create mode 100644 boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.ewd create mode 100644 boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.ewp create mode 100644 boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.uvopt create mode 100644 boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.uvproj create mode 100644 boards/dk-tm4c129x/boot_emac_flash/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/boot_emac_flash/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/boot_emac_flash/ccs/.cproject create mode 100644 boards/dk-tm4c129x/boot_emac_flash/ccs/.project create mode 100644 boards/dk-tm4c129x/boot_emac_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/boot_emac_flash/ccs/Debug/boot_emac_flash.bin create mode 100644 boards/dk-tm4c129x/boot_emac_flash/ccs/Debug/boot_emac_flash.out create mode 100644 boards/dk-tm4c129x/boot_emac_flash/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/boot_emac_flash/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/boot_emac_flash/ewarm/Exe/boot_emac_flash.bin create mode 100644 boards/dk-tm4c129x/boot_emac_flash/ewarm/Exe/boot_emac_flash.out create mode 100644 boards/dk-tm4c129x/boot_emac_flash/gcc/boot_emac_flash.axf create mode 100644 boards/dk-tm4c129x/boot_emac_flash/gcc/boot_emac_flash.bin create mode 100644 boards/dk-tm4c129x/boot_emac_flash/rvmdk/boot_emac_flash.axf create mode 100644 boards/dk-tm4c129x/boot_emac_flash/rvmdk/boot_emac_flash.bin create mode 100644 boards/dk-tm4c129x/calibrate/Makefile create mode 100644 boards/dk-tm4c129x/calibrate/calibrate.c create mode 100644 boards/dk-tm4c129x/calibrate/calibrate.ewd create mode 100644 boards/dk-tm4c129x/calibrate/calibrate.ewp create mode 100644 boards/dk-tm4c129x/calibrate/calibrate.icf create mode 100644 boards/dk-tm4c129x/calibrate/calibrate.ld create mode 100644 boards/dk-tm4c129x/calibrate/calibrate.sct create mode 100644 boards/dk-tm4c129x/calibrate/calibrate.uvopt create mode 100644 boards/dk-tm4c129x/calibrate/calibrate.uvproj create mode 100644 boards/dk-tm4c129x/calibrate/calibrate_ccs.cmd create mode 100644 boards/dk-tm4c129x/calibrate/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/calibrate/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/calibrate/ccs/.cproject create mode 100644 boards/dk-tm4c129x/calibrate/ccs/.project create mode 100644 boards/dk-tm4c129x/calibrate/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/calibrate/ccs/Debug/calibrate.bin create mode 100644 boards/dk-tm4c129x/calibrate/ccs/Debug/calibrate.out create mode 100644 boards/dk-tm4c129x/calibrate/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/calibrate/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/calibrate/ewarm/Exe/calibrate.bin create mode 100644 boards/dk-tm4c129x/calibrate/ewarm/Exe/calibrate.out create mode 100644 boards/dk-tm4c129x/calibrate/gcc/calibrate.axf create mode 100644 boards/dk-tm4c129x/calibrate/gcc/calibrate.bin create mode 100644 boards/dk-tm4c129x/calibrate/readme.txt create mode 100644 boards/dk-tm4c129x/calibrate/rvmdk/calibrate.axf create mode 100644 boards/dk-tm4c129x/calibrate/rvmdk/calibrate.bin create mode 100644 boards/dk-tm4c129x/calibrate/startup_ccs.c create mode 100644 boards/dk-tm4c129x/calibrate/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/calibrate/startup_gcc.c create mode 100644 boards/dk-tm4c129x/calibrate/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/crc32/Makefile create mode 100644 boards/dk-tm4c129x/crc32/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/crc32/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/crc32/ccs/.cproject create mode 100644 boards/dk-tm4c129x/crc32/ccs/.project create mode 100644 boards/dk-tm4c129x/crc32/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/crc32/ccs/Debug/crc32.bin create mode 100644 boards/dk-tm4c129x/crc32/ccs/Debug/crc32.out create mode 100644 boards/dk-tm4c129x/crc32/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/crc32/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/crc32/crc32.c create mode 100644 boards/dk-tm4c129x/crc32/crc32.ewd create mode 100644 boards/dk-tm4c129x/crc32/crc32.ewp create mode 100644 boards/dk-tm4c129x/crc32/crc32.icf create mode 100644 boards/dk-tm4c129x/crc32/crc32.ld create mode 100644 boards/dk-tm4c129x/crc32/crc32.sct create mode 100644 boards/dk-tm4c129x/crc32/crc32.uvopt create mode 100644 boards/dk-tm4c129x/crc32/crc32.uvproj create mode 100644 boards/dk-tm4c129x/crc32/crc32_ccs.cmd create mode 100644 boards/dk-tm4c129x/crc32/ewarm/Exe/crc32.bin create mode 100644 boards/dk-tm4c129x/crc32/ewarm/Exe/crc32.out create mode 100644 boards/dk-tm4c129x/crc32/gcc/crc32.axf create mode 100644 boards/dk-tm4c129x/crc32/gcc/crc32.bin create mode 100644 boards/dk-tm4c129x/crc32/readme.txt create mode 100644 boards/dk-tm4c129x/crc32/rvmdk/crc32.axf create mode 100644 boards/dk-tm4c129x/crc32/rvmdk/crc32.bin create mode 100644 boards/dk-tm4c129x/crc32/startup_ccs.c create mode 100644 boards/dk-tm4c129x/crc32/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/crc32/startup_gcc.c create mode 100644 boards/dk-tm4c129x/crc32/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/dk-tm4c129x.eww create mode 100644 boards/dk-tm4c129x/dk-tm4c129x.uvmpw create mode 100644 boards/dk-tm4c129x/drivers/buttons.c create mode 100644 boards/dk-tm4c129x/drivers/buttons.h create mode 100644 boards/dk-tm4c129x/drivers/frame.c create mode 100644 boards/dk-tm4c129x/drivers/frame.h create mode 100644 boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c create mode 100644 boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.h create mode 100644 boards/dk-tm4c129x/drivers/mx66l51235f.c create mode 100644 boards/dk-tm4c129x/drivers/mx66l51235f.h create mode 100644 boards/dk-tm4c129x/drivers/pinout.c create mode 100644 boards/dk-tm4c129x/drivers/pinout.h create mode 100644 boards/dk-tm4c129x/drivers/sound.c create mode 100644 boards/dk-tm4c129x/drivers/sound.h create mode 100644 boards/dk-tm4c129x/drivers/touch.c create mode 100644 boards/dk-tm4c129x/drivers/touch.h create mode 100644 boards/dk-tm4c129x/drivers/usb_sound.c create mode 100644 boards/dk-tm4c129x/drivers/usb_sound.h create mode 100644 boards/dk-tm4c129x/enet_io/Makefile create mode 100644 boards/dk-tm4c129x/enet_io/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/enet_io/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/enet_io/ccs/.cproject create mode 100644 boards/dk-tm4c129x/enet_io/ccs/.project create mode 100644 boards/dk-tm4c129x/enet_io/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/enet_io/ccs/Debug/enet_io.bin create mode 100644 boards/dk-tm4c129x/enet_io/ccs/Debug/enet_io.out create mode 100644 boards/dk-tm4c129x/enet_io/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/enet_io/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/enet_io/cgifuncs.c create mode 100644 boards/dk-tm4c129x/enet_io/cgifuncs.h create mode 100644 boards/dk-tm4c129x/enet_io/enet_io.c create mode 100644 boards/dk-tm4c129x/enet_io/enet_io.ewd create mode 100644 boards/dk-tm4c129x/enet_io/enet_io.ewp create mode 100644 boards/dk-tm4c129x/enet_io/enet_io.icf create mode 100644 boards/dk-tm4c129x/enet_io/enet_io.ld create mode 100644 boards/dk-tm4c129x/enet_io/enet_io.sct create mode 100644 boards/dk-tm4c129x/enet_io/enet_io.uvopt create mode 100644 boards/dk-tm4c129x/enet_io/enet_io.uvproj create mode 100644 boards/dk-tm4c129x/enet_io/enet_io_ccs.cmd create mode 100644 boards/dk-tm4c129x/enet_io/ewarm/Exe/enet_io.bin create mode 100644 boards/dk-tm4c129x/enet_io/ewarm/Exe/enet_io.out create mode 100644 boards/dk-tm4c129x/enet_io/fs/404.htm create mode 100644 boards/dk-tm4c129x/enet_io/fs/about.htm create mode 100644 boards/dk-tm4c129x/enet_io/fs/block.htm create mode 100644 boards/dk-tm4c129x/enet_io/fs/block.jpg create mode 100644 boards/dk-tm4c129x/enet_io/fs/dk-tm4c129x.jpg create mode 100644 boards/dk-tm4c129x/enet_io/fs/favicon.ico create mode 100644 boards/dk-tm4c129x/enet_io/fs/index.htm create mode 100644 boards/dk-tm4c129x/enet_io/fs/io_cgi.ssi create mode 100644 boards/dk-tm4c129x/enet_io/fs/io_http.htm create mode 100644 boards/dk-tm4c129x/enet_io/fs/javascript.js create mode 100644 boards/dk-tm4c129x/enet_io/fs/javascript_load.js create mode 100644 boards/dk-tm4c129x/enet_io/fs/overview.htm create mode 100644 boards/dk-tm4c129x/enet_io/fs/perror.htm create mode 100644 boards/dk-tm4c129x/enet_io/fs/styles.css create mode 100644 boards/dk-tm4c129x/enet_io/fs/ti.jpg create mode 100644 boards/dk-tm4c129x/enet_io/fs/tm4c.jpg create mode 100644 boards/dk-tm4c129x/enet_io/gcc/enet_io.axf create mode 100644 boards/dk-tm4c129x/enet_io/gcc/enet_io.bin create mode 100644 boards/dk-tm4c129x/enet_io/io.c create mode 100644 boards/dk-tm4c129x/enet_io/io.h create mode 100644 boards/dk-tm4c129x/enet_io/io_fs.c create mode 100644 boards/dk-tm4c129x/enet_io/io_fsdata.h create mode 100644 boards/dk-tm4c129x/enet_io/lwipopts.h create mode 100644 boards/dk-tm4c129x/enet_io/readme.txt create mode 100644 boards/dk-tm4c129x/enet_io/rvmdk/enet_io.axf create mode 100644 boards/dk-tm4c129x/enet_io/rvmdk/enet_io.bin create mode 100644 boards/dk-tm4c129x/enet_io/startup_ccs.c create mode 100644 boards/dk-tm4c129x/enet_io/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/enet_io/startup_gcc.c create mode 100644 boards/dk-tm4c129x/enet_io/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/enet_lwip/Makefile create mode 100644 boards/dk-tm4c129x/enet_lwip/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/enet_lwip/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/enet_lwip/ccs/.cproject create mode 100644 boards/dk-tm4c129x/enet_lwip/ccs/.project create mode 100644 boards/dk-tm4c129x/enet_lwip/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/enet_lwip/ccs/Debug/enet_lwip.bin create mode 100644 boards/dk-tm4c129x/enet_lwip/ccs/Debug/enet_lwip.out create mode 100644 boards/dk-tm4c129x/enet_lwip/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/enet_lwip/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_fs.c create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_fs.h create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_fsdata.h create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_lwip.c create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_lwip.ewd create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_lwip.ewp create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_lwip.icf create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_lwip.ld create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_lwip.sct create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_lwip.uvopt create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_lwip.uvproj create mode 100644 boards/dk-tm4c129x/enet_lwip/enet_lwip_ccs.cmd create mode 100644 boards/dk-tm4c129x/enet_lwip/ewarm/Exe/enet_lwip.bin create mode 100644 boards/dk-tm4c129x/enet_lwip/ewarm/Exe/enet_lwip.out create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/404.htm create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/about.htm create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/block.htm create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/block.jpg create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/dk-tm4c129x.jpg create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/favicon.ico create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/index.htm create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/javascript.js create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/overview.htm create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/styles.css create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/ti.jpg create mode 100644 boards/dk-tm4c129x/enet_lwip/fs/tm4c.jpg create mode 100644 boards/dk-tm4c129x/enet_lwip/gcc/enet_lwip.axf create mode 100644 boards/dk-tm4c129x/enet_lwip/gcc/enet_lwip.bin create mode 100644 boards/dk-tm4c129x/enet_lwip/lwipopts.h create mode 100644 boards/dk-tm4c129x/enet_lwip/readme.txt create mode 100644 boards/dk-tm4c129x/enet_lwip/rvmdk/enet_lwip.axf create mode 100644 boards/dk-tm4c129x/enet_lwip/rvmdk/enet_lwip.bin create mode 100644 boards/dk-tm4c129x/enet_lwip/startup_ccs.c create mode 100644 boards/dk-tm4c129x/enet_lwip/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/enet_lwip/startup_gcc.c create mode 100644 boards/dk-tm4c129x/enet_lwip/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/enet_uip/Makefile create mode 100644 boards/dk-tm4c129x/enet_uip/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/enet_uip/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/enet_uip/ccs/.cproject create mode 100644 boards/dk-tm4c129x/enet_uip/ccs/.project create mode 100644 boards/dk-tm4c129x/enet_uip/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/enet_uip/ccs/Debug/enet_uip.bin create mode 100644 boards/dk-tm4c129x/enet_uip/ccs/Debug/enet_uip.out create mode 100644 boards/dk-tm4c129x/enet_uip/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/enet_uip/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/enet_uip/clock-arch.h create mode 100644 boards/dk-tm4c129x/enet_uip/enet_uip.c create mode 100644 boards/dk-tm4c129x/enet_uip/enet_uip.ewd create mode 100644 boards/dk-tm4c129x/enet_uip/enet_uip.ewp create mode 100644 boards/dk-tm4c129x/enet_uip/enet_uip.icf create mode 100644 boards/dk-tm4c129x/enet_uip/enet_uip.ld create mode 100644 boards/dk-tm4c129x/enet_uip/enet_uip.sct create mode 100644 boards/dk-tm4c129x/enet_uip/enet_uip.uvopt create mode 100644 boards/dk-tm4c129x/enet_uip/enet_uip.uvproj create mode 100644 boards/dk-tm4c129x/enet_uip/enet_uip_ccs.cmd create mode 100644 boards/dk-tm4c129x/enet_uip/ewarm/Exe/enet_uip.bin create mode 100644 boards/dk-tm4c129x/enet_uip/ewarm/Exe/enet_uip.out create mode 100644 boards/dk-tm4c129x/enet_uip/gcc/enet_uip.axf create mode 100644 boards/dk-tm4c129x/enet_uip/gcc/enet_uip.bin create mode 100644 boards/dk-tm4c129x/enet_uip/readme.txt create mode 100644 boards/dk-tm4c129x/enet_uip/rvmdk/enet_uip.axf create mode 100644 boards/dk-tm4c129x/enet_uip/rvmdk/enet_uip.bin create mode 100644 boards/dk-tm4c129x/enet_uip/startup_ccs.c create mode 100644 boards/dk-tm4c129x/enet_uip/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/enet_uip/startup_gcc.c create mode 100644 boards/dk-tm4c129x/enet_uip/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/enet_uip/uip-conf.h create mode 100644 boards/dk-tm4c129x/fontview/Makefile create mode 100644 boards/dk-tm4c129x/fontview/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/fontview/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/fontview/ccs/.cproject create mode 100644 boards/dk-tm4c129x/fontview/ccs/.project create mode 100644 boards/dk-tm4c129x/fontview/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/fontview/ccs/Debug/fontview.bin create mode 100644 boards/dk-tm4c129x/fontview/ccs/Debug/fontview.out create mode 100644 boards/dk-tm4c129x/fontview/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/fontview/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/fontview/ewarm/Exe/fontview.bin create mode 100644 boards/dk-tm4c129x/fontview/ewarm/Exe/fontview.out create mode 100644 boards/dk-tm4c129x/fontview/fatwrapper.c create mode 100644 boards/dk-tm4c129x/fontview/fatwrapper.h create mode 100644 boards/dk-tm4c129x/fontview/fontview.c create mode 100644 boards/dk-tm4c129x/fontview/fontview.ewd create mode 100644 boards/dk-tm4c129x/fontview/fontview.ewp create mode 100644 boards/dk-tm4c129x/fontview/fontview.icf create mode 100644 boards/dk-tm4c129x/fontview/fontview.ld create mode 100644 boards/dk-tm4c129x/fontview/fontview.sct create mode 100644 boards/dk-tm4c129x/fontview/fontview.uvopt create mode 100644 boards/dk-tm4c129x/fontview/fontview.uvproj create mode 100644 boards/dk-tm4c129x/fontview/fontview_ccs.cmd create mode 100644 boards/dk-tm4c129x/fontview/gcc/fontview.axf create mode 100644 boards/dk-tm4c129x/fontview/gcc/fontview.bin create mode 100644 boards/dk-tm4c129x/fontview/readme.txt create mode 100644 boards/dk-tm4c129x/fontview/rvmdk/fontview.axf create mode 100644 boards/dk-tm4c129x/fontview/rvmdk/fontview.bin create mode 100644 boards/dk-tm4c129x/fontview/startup_ccs.c create mode 100644 boards/dk-tm4c129x/fontview/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/fontview/startup_gcc.c create mode 100644 boards/dk-tm4c129x/fontview/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/freertos_demo/FreeRTOSConfig.h create mode 100644 boards/dk-tm4c129x/freertos_demo/Makefile create mode 100644 boards/dk-tm4c129x/freertos_demo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/freertos_demo/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/freertos_demo/ccs/.cproject create mode 100644 boards/dk-tm4c129x/freertos_demo/ccs/.project create mode 100644 boards/dk-tm4c129x/freertos_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/freertos_demo/ccs/Debug/freertos_demo.bin create mode 100644 boards/dk-tm4c129x/freertos_demo/ccs/Debug/freertos_demo.out create mode 100644 boards/dk-tm4c129x/freertos_demo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/freertos_demo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/freertos_demo/cgifuncs.c create mode 100644 boards/dk-tm4c129x/freertos_demo/cgifuncs.h create mode 100644 boards/dk-tm4c129x/freertos_demo/display_task.c create mode 100644 boards/dk-tm4c129x/freertos_demo/display_task.h create mode 100644 boards/dk-tm4c129x/freertos_demo/ewarm/Exe/freertos_demo.bin create mode 100644 boards/dk-tm4c129x/freertos_demo/ewarm/Exe/freertos_demo.out create mode 100644 boards/dk-tm4c129x/freertos_demo/freertos_demo.c create mode 100644 boards/dk-tm4c129x/freertos_demo/freertos_demo.ewd create mode 100644 boards/dk-tm4c129x/freertos_demo/freertos_demo.ewp create mode 100644 boards/dk-tm4c129x/freertos_demo/freertos_demo.h create mode 100644 boards/dk-tm4c129x/freertos_demo/freertos_demo.icf create mode 100644 boards/dk-tm4c129x/freertos_demo/freertos_demo.ld create mode 100644 boards/dk-tm4c129x/freertos_demo/freertos_demo.sct create mode 100644 boards/dk-tm4c129x/freertos_demo/freertos_demo.uvopt create mode 100644 boards/dk-tm4c129x/freertos_demo/freertos_demo.uvproj create mode 100644 boards/dk-tm4c129x/freertos_demo/freertos_demo_ccs.cmd create mode 100644 boards/dk-tm4c129x/freertos_demo/fs.c create mode 100644 boards/dk-tm4c129x/freertos_demo/gcc/freertos_demo.axf create mode 100644 boards/dk-tm4c129x/freertos_demo/gcc/freertos_demo.bin create mode 100644 boards/dk-tm4c129x/freertos_demo/html/404.htm create mode 100644 boards/dk-tm4c129x/freertos_demo/html/block.htm create mode 100644 boards/dk-tm4c129x/freertos_demo/html/family.htm create mode 100644 boards/dk-tm4c129x/freertos_demo/html/favicon.ico create mode 100644 boards/dk-tm4c129x/freertos_demo/html/footer.htm create mode 100644 boards/dk-tm4c129x/freertos_demo/html/freertos.htm create mode 100644 boards/dk-tm4c129x/freertos_demo/html/header.htm create mode 100644 boards/dk-tm4c129x/freertos_demo/html/images/apps.jpg create mode 100644 boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-communicate-small.jpg create mode 100644 boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-connect-small.jpg create mode 100644 boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-control-small.jpg create mode 100644 boards/dk-tm4c129x/freertos_demo/html/images/cortex.jpg create mode 100644 boards/dk-tm4c129x/freertos_demo/html/images/freertos.jpg create mode 100644 boards/dk-tm4c129x/freertos_demo/html/images/mcu_side-by-side.jpg create mode 100644 boards/dk-tm4c129x/freertos_demo/html/images/ti.gif create mode 100644 boards/dk-tm4c129x/freertos_demo/html/images/ti_logo.gif create mode 100644 boards/dk-tm4c129x/freertos_demo/html/images/tiva.jpg create mode 100644 boards/dk-tm4c129x/freertos_demo/html/images/tiva_globe-small.gif create mode 100644 boards/dk-tm4c129x/freertos_demo/html/index.htm create mode 100644 boards/dk-tm4c129x/freertos_demo/html/io.ssi create mode 100644 boards/dk-tm4c129x/freertos_demo/html/lwipstat.ssi create mode 100644 boards/dk-tm4c129x/freertos_demo/html/perror.htm create mode 100644 boards/dk-tm4c129x/freertos_demo/html/side.htm create mode 100644 boards/dk-tm4c129x/freertos_demo/html/styles.css create mode 100644 boards/dk-tm4c129x/freertos_demo/html/ti.htm create mode 100644 boards/dk-tm4c129x/freertos_demo/htmldata.h create mode 100644 boards/dk-tm4c129x/freertos_demo/idle_task.c create mode 100644 boards/dk-tm4c129x/freertos_demo/idle_task.h create mode 100644 boards/dk-tm4c129x/freertos_demo/images.c create mode 100644 boards/dk-tm4c129x/freertos_demo/images.h create mode 100644 boards/dk-tm4c129x/freertos_demo/led_task.c create mode 100644 boards/dk-tm4c129x/freertos_demo/led_task.h create mode 100644 boards/dk-tm4c129x/freertos_demo/lwip_task.c create mode 100644 boards/dk-tm4c129x/freertos_demo/lwip_task.h create mode 100644 boards/dk-tm4c129x/freertos_demo/lwipopts.h create mode 100644 boards/dk-tm4c129x/freertos_demo/priorities.h create mode 100644 boards/dk-tm4c129x/freertos_demo/random.c create mode 100644 boards/dk-tm4c129x/freertos_demo/random.h create mode 100644 boards/dk-tm4c129x/freertos_demo/readme.txt create mode 100644 boards/dk-tm4c129x/freertos_demo/rvmdk/freertos_demo.axf create mode 100644 boards/dk-tm4c129x/freertos_demo/rvmdk/freertos_demo.bin create mode 100644 boards/dk-tm4c129x/freertos_demo/spider_task.c create mode 100644 boards/dk-tm4c129x/freertos_demo/spider_task.h create mode 100644 boards/dk-tm4c129x/freertos_demo/startup_ccs.c create mode 100644 boards/dk-tm4c129x/freertos_demo/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/freertos_demo/startup_gcc.c create mode 100644 boards/dk-tm4c129x/freertos_demo/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/gpio_jtag/Makefile create mode 100644 boards/dk-tm4c129x/gpio_jtag/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/gpio_jtag/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/gpio_jtag/ccs/.cproject create mode 100644 boards/dk-tm4c129x/gpio_jtag/ccs/.project create mode 100644 boards/dk-tm4c129x/gpio_jtag/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/gpio_jtag/ccs/Debug/gpio_jtag.bin create mode 100644 boards/dk-tm4c129x/gpio_jtag/ccs/Debug/gpio_jtag.out create mode 100644 boards/dk-tm4c129x/gpio_jtag/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/gpio_jtag/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/gpio_jtag/ewarm/Exe/gpio_jtag.bin create mode 100644 boards/dk-tm4c129x/gpio_jtag/ewarm/Exe/gpio_jtag.out create mode 100644 boards/dk-tm4c129x/gpio_jtag/gcc/gpio_jtag.axf create mode 100644 boards/dk-tm4c129x/gpio_jtag/gcc/gpio_jtag.bin create mode 100644 boards/dk-tm4c129x/gpio_jtag/gpio_jtag.c create mode 100644 boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ewd create mode 100644 boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ewp create mode 100644 boards/dk-tm4c129x/gpio_jtag/gpio_jtag.icf create mode 100644 boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ld create mode 100644 boards/dk-tm4c129x/gpio_jtag/gpio_jtag.sct create mode 100644 boards/dk-tm4c129x/gpio_jtag/gpio_jtag.uvopt create mode 100644 boards/dk-tm4c129x/gpio_jtag/gpio_jtag.uvproj create mode 100644 boards/dk-tm4c129x/gpio_jtag/gpio_jtag_ccs.cmd create mode 100644 boards/dk-tm4c129x/gpio_jtag/readme.txt create mode 100644 boards/dk-tm4c129x/gpio_jtag/rvmdk/gpio_jtag.axf create mode 100644 boards/dk-tm4c129x/gpio_jtag/rvmdk/gpio_jtag.bin create mode 100644 boards/dk-tm4c129x/gpio_jtag/startup_ccs.c create mode 100644 boards/dk-tm4c129x/gpio_jtag/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/gpio_jtag/startup_gcc.c create mode 100644 boards/dk-tm4c129x/gpio_jtag/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/grlib_demo/Makefile create mode 100644 boards/dk-tm4c129x/grlib_demo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/grlib_demo/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/grlib_demo/ccs/.cproject create mode 100644 boards/dk-tm4c129x/grlib_demo/ccs/.project create mode 100644 boards/dk-tm4c129x/grlib_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/grlib_demo/ccs/Debug/grlib_demo.bin create mode 100644 boards/dk-tm4c129x/grlib_demo/ccs/Debug/grlib_demo.out create mode 100644 boards/dk-tm4c129x/grlib_demo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/grlib_demo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/grlib_demo/ewarm/Exe/grlib_demo.bin create mode 100644 boards/dk-tm4c129x/grlib_demo/ewarm/Exe/grlib_demo.out create mode 100644 boards/dk-tm4c129x/grlib_demo/gcc/grlib_demo.axf create mode 100644 boards/dk-tm4c129x/grlib_demo/gcc/grlib_demo.bin create mode 100644 boards/dk-tm4c129x/grlib_demo/grlib_demo.c create mode 100644 boards/dk-tm4c129x/grlib_demo/grlib_demo.ewd create mode 100644 boards/dk-tm4c129x/grlib_demo/grlib_demo.ewp create mode 100644 boards/dk-tm4c129x/grlib_demo/grlib_demo.icf create mode 100644 boards/dk-tm4c129x/grlib_demo/grlib_demo.ld create mode 100644 boards/dk-tm4c129x/grlib_demo/grlib_demo.sct create mode 100644 boards/dk-tm4c129x/grlib_demo/grlib_demo.uvopt create mode 100644 boards/dk-tm4c129x/grlib_demo/grlib_demo.uvproj create mode 100644 boards/dk-tm4c129x/grlib_demo/grlib_demo_ccs.cmd create mode 100644 boards/dk-tm4c129x/grlib_demo/images.c create mode 100644 boards/dk-tm4c129x/grlib_demo/images.h create mode 100644 boards/dk-tm4c129x/grlib_demo/readme.txt create mode 100644 boards/dk-tm4c129x/grlib_demo/rvmdk/grlib_demo.axf create mode 100644 boards/dk-tm4c129x/grlib_demo/rvmdk/grlib_demo.bin create mode 100644 boards/dk-tm4c129x/grlib_demo/startup_ccs.c create mode 100644 boards/dk-tm4c129x/grlib_demo/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/grlib_demo/startup_gcc.c create mode 100644 boards/dk-tm4c129x/grlib_demo/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/grlib_driver_test/Makefile create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/.cproject create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/.project create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.bin create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.out create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/grlib_driver_test/driver_config.h create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.bin create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.out create mode 100644 boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.axf create mode 100644 boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.bin create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.c create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ewd create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ewp create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.icf create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ld create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.sct create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.uvopt create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.uvproj create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test_ccs.cmd create mode 100644 boards/dk-tm4c129x/grlib_driver_test/images.c create mode 100644 boards/dk-tm4c129x/grlib_driver_test/images.h create mode 100644 boards/dk-tm4c129x/grlib_driver_test/readme.txt create mode 100644 boards/dk-tm4c129x/grlib_driver_test/rvmdk/grlib_driver_test.axf create mode 100644 boards/dk-tm4c129x/grlib_driver_test/rvmdk/grlib_driver_test.bin create mode 100644 boards/dk-tm4c129x/grlib_driver_test/startup_ccs.c create mode 100644 boards/dk-tm4c129x/grlib_driver_test/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/grlib_driver_test/startup_gcc.c create mode 100644 boards/dk-tm4c129x/grlib_driver_test/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/hello/Makefile create mode 100644 boards/dk-tm4c129x/hello/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/hello/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/hello/ccs/.cproject create mode 100644 boards/dk-tm4c129x/hello/ccs/.project create mode 100644 boards/dk-tm4c129x/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/hello/ccs/Debug/hello.bin create mode 100644 boards/dk-tm4c129x/hello/ccs/Debug/hello.out create mode 100644 boards/dk-tm4c129x/hello/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/hello/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/hello/ewarm/Exe/hello.bin create mode 100644 boards/dk-tm4c129x/hello/ewarm/Exe/hello.out create mode 100644 boards/dk-tm4c129x/hello/gcc/hello.axf create mode 100644 boards/dk-tm4c129x/hello/gcc/hello.bin create mode 100644 boards/dk-tm4c129x/hello/hello.c create mode 100644 boards/dk-tm4c129x/hello/hello.ewd create mode 100644 boards/dk-tm4c129x/hello/hello.ewp create mode 100644 boards/dk-tm4c129x/hello/hello.icf create mode 100644 boards/dk-tm4c129x/hello/hello.ld create mode 100644 boards/dk-tm4c129x/hello/hello.sct create mode 100644 boards/dk-tm4c129x/hello/hello.uvopt create mode 100644 boards/dk-tm4c129x/hello/hello.uvproj create mode 100644 boards/dk-tm4c129x/hello/hello_ccs.cmd create mode 100644 boards/dk-tm4c129x/hello/readme.txt create mode 100644 boards/dk-tm4c129x/hello/rvmdk/hello.axf create mode 100644 boards/dk-tm4c129x/hello/rvmdk/hello.bin create mode 100644 boards/dk-tm4c129x/hello/startup_ccs.c create mode 100644 boards/dk-tm4c129x/hello/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/hello/startup_gcc.c create mode 100644 boards/dk-tm4c129x/hello/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/hello_widget/Makefile create mode 100644 boards/dk-tm4c129x/hello_widget/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/hello_widget/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/hello_widget/ccs/.cproject create mode 100644 boards/dk-tm4c129x/hello_widget/ccs/.project create mode 100644 boards/dk-tm4c129x/hello_widget/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/hello_widget/ccs/Debug/hello_widget.bin create mode 100644 boards/dk-tm4c129x/hello_widget/ccs/Debug/hello_widget.out create mode 100644 boards/dk-tm4c129x/hello_widget/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/hello_widget/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/hello_widget/ewarm/Exe/hello_widget.bin create mode 100644 boards/dk-tm4c129x/hello_widget/ewarm/Exe/hello_widget.out create mode 100644 boards/dk-tm4c129x/hello_widget/gcc/hello_widget.axf create mode 100644 boards/dk-tm4c129x/hello_widget/gcc/hello_widget.bin create mode 100644 boards/dk-tm4c129x/hello_widget/hello_widget.c create mode 100644 boards/dk-tm4c129x/hello_widget/hello_widget.ewd create mode 100644 boards/dk-tm4c129x/hello_widget/hello_widget.ewp create mode 100644 boards/dk-tm4c129x/hello_widget/hello_widget.icf create mode 100644 boards/dk-tm4c129x/hello_widget/hello_widget.ld create mode 100644 boards/dk-tm4c129x/hello_widget/hello_widget.sct create mode 100644 boards/dk-tm4c129x/hello_widget/hello_widget.uvopt create mode 100644 boards/dk-tm4c129x/hello_widget/hello_widget.uvproj create mode 100644 boards/dk-tm4c129x/hello_widget/hello_widget_ccs.cmd create mode 100644 boards/dk-tm4c129x/hello_widget/readme.txt create mode 100644 boards/dk-tm4c129x/hello_widget/rvmdk/hello_widget.axf create mode 100644 boards/dk-tm4c129x/hello_widget/rvmdk/hello_widget.bin create mode 100644 boards/dk-tm4c129x/hello_widget/startup_ccs.c create mode 100644 boards/dk-tm4c129x/hello_widget/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/hello_widget/startup_gcc.c create mode 100644 boards/dk-tm4c129x/hello_widget/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/hibernate/Makefile create mode 100644 boards/dk-tm4c129x/hibernate/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/hibernate/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/hibernate/ccs/.cproject create mode 100644 boards/dk-tm4c129x/hibernate/ccs/.project create mode 100644 boards/dk-tm4c129x/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/hibernate/ccs/Debug/hibernate.bin create mode 100644 boards/dk-tm4c129x/hibernate/ccs/Debug/hibernate.out create mode 100644 boards/dk-tm4c129x/hibernate/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/hibernate/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/hibernate/ewarm/Exe/hibernate.bin create mode 100644 boards/dk-tm4c129x/hibernate/ewarm/Exe/hibernate.out create mode 100644 boards/dk-tm4c129x/hibernate/gcc/hibernate.axf create mode 100644 boards/dk-tm4c129x/hibernate/gcc/hibernate.bin create mode 100644 boards/dk-tm4c129x/hibernate/hibernate.c create mode 100644 boards/dk-tm4c129x/hibernate/hibernate.ewd create mode 100644 boards/dk-tm4c129x/hibernate/hibernate.ewp create mode 100644 boards/dk-tm4c129x/hibernate/hibernate.icf create mode 100644 boards/dk-tm4c129x/hibernate/hibernate.ld create mode 100644 boards/dk-tm4c129x/hibernate/hibernate.sct create mode 100644 boards/dk-tm4c129x/hibernate/hibernate.uvopt create mode 100644 boards/dk-tm4c129x/hibernate/hibernate.uvproj create mode 100644 boards/dk-tm4c129x/hibernate/hibernate_ccs.cmd create mode 100644 boards/dk-tm4c129x/hibernate/readme.txt create mode 100644 boards/dk-tm4c129x/hibernate/rvmdk/hibernate.axf create mode 100644 boards/dk-tm4c129x/hibernate/rvmdk/hibernate.bin create mode 100644 boards/dk-tm4c129x/hibernate/startup_ccs.c create mode 100644 boards/dk-tm4c129x/hibernate/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/hibernate/startup_gcc.c create mode 100644 boards/dk-tm4c129x/hibernate/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/interrupts/Makefile create mode 100644 boards/dk-tm4c129x/interrupts/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/interrupts/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/interrupts/ccs/.cproject create mode 100644 boards/dk-tm4c129x/interrupts/ccs/.project create mode 100644 boards/dk-tm4c129x/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/interrupts/ccs/Debug/interrupts.bin create mode 100644 boards/dk-tm4c129x/interrupts/ccs/Debug/interrupts.out create mode 100644 boards/dk-tm4c129x/interrupts/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/interrupts/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/interrupts/ewarm/Exe/interrupts.bin create mode 100644 boards/dk-tm4c129x/interrupts/ewarm/Exe/interrupts.out create mode 100644 boards/dk-tm4c129x/interrupts/gcc/interrupts.axf create mode 100644 boards/dk-tm4c129x/interrupts/gcc/interrupts.bin create mode 100644 boards/dk-tm4c129x/interrupts/interrupts.c create mode 100644 boards/dk-tm4c129x/interrupts/interrupts.ewd create mode 100644 boards/dk-tm4c129x/interrupts/interrupts.ewp create mode 100644 boards/dk-tm4c129x/interrupts/interrupts.icf create mode 100644 boards/dk-tm4c129x/interrupts/interrupts.ld create mode 100644 boards/dk-tm4c129x/interrupts/interrupts.sct create mode 100644 boards/dk-tm4c129x/interrupts/interrupts.uvopt create mode 100644 boards/dk-tm4c129x/interrupts/interrupts.uvproj create mode 100644 boards/dk-tm4c129x/interrupts/interrupts_ccs.cmd create mode 100644 boards/dk-tm4c129x/interrupts/readme.txt create mode 100644 boards/dk-tm4c129x/interrupts/rvmdk/interrupts.axf create mode 100644 boards/dk-tm4c129x/interrupts/rvmdk/interrupts.bin create mode 100644 boards/dk-tm4c129x/interrupts/startup_ccs.c create mode 100644 boards/dk-tm4c129x/interrupts/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/interrupts/startup_gcc.c create mode 100644 boards/dk-tm4c129x/interrupts/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/lang_demo/Makefile create mode 100644 boards/dk-tm4c129x/lang_demo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/lang_demo/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/lang_demo/ccs/.cproject create mode 100644 boards/dk-tm4c129x/lang_demo/ccs/.project create mode 100644 boards/dk-tm4c129x/lang_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/lang_demo/ccs/Debug/lang_demo.bin create mode 100644 boards/dk-tm4c129x/lang_demo/ccs/Debug/lang_demo.out create mode 100644 boards/dk-tm4c129x/lang_demo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/lang_demo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/lang_demo/ewarm/Exe/lang_demo.bin create mode 100644 boards/dk-tm4c129x/lang_demo/ewarm/Exe/lang_demo.out create mode 100644 boards/dk-tm4c129x/lang_demo/gcc/lang_demo.axf create mode 100644 boards/dk-tm4c129x/lang_demo/gcc/lang_demo.bin create mode 100644 boards/dk-tm4c129x/lang_demo/images.c create mode 100644 boards/dk-tm4c129x/lang_demo/images.h create mode 100644 boards/dk-tm4c129x/lang_demo/lang_demo.c create mode 100644 boards/dk-tm4c129x/lang_demo/lang_demo.ewd create mode 100644 boards/dk-tm4c129x/lang_demo/lang_demo.ewp create mode 100644 boards/dk-tm4c129x/lang_demo/lang_demo.icf create mode 100644 boards/dk-tm4c129x/lang_demo/lang_demo.ld create mode 100644 boards/dk-tm4c129x/lang_demo/lang_demo.sct create mode 100644 boards/dk-tm4c129x/lang_demo/lang_demo.uvopt create mode 100644 boards/dk-tm4c129x/lang_demo/lang_demo.uvproj create mode 100644 boards/dk-tm4c129x/lang_demo/lang_demo_ccs.cmd create mode 100644 boards/dk-tm4c129x/lang_demo/readme.txt create mode 100644 boards/dk-tm4c129x/lang_demo/rvmdk/lang_demo.axf create mode 100644 boards/dk-tm4c129x/lang_demo/rvmdk/lang_demo.bin create mode 100644 boards/dk-tm4c129x/lang_demo/startup_ccs.c create mode 100644 boards/dk-tm4c129x/lang_demo/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/lang_demo/startup_gcc.c create mode 100644 boards/dk-tm4c129x/lang_demo/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/mpu_fault/Makefile create mode 100644 boards/dk-tm4c129x/mpu_fault/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/mpu_fault/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/mpu_fault/ccs/.cproject create mode 100644 boards/dk-tm4c129x/mpu_fault/ccs/.project create mode 100644 boards/dk-tm4c129x/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/mpu_fault/ccs/Debug/mpu_fault.bin create mode 100644 boards/dk-tm4c129x/mpu_fault/ccs/Debug/mpu_fault.out create mode 100644 boards/dk-tm4c129x/mpu_fault/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/mpu_fault/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/mpu_fault/ewarm/Exe/mpu_fault.bin create mode 100644 boards/dk-tm4c129x/mpu_fault/ewarm/Exe/mpu_fault.out create mode 100644 boards/dk-tm4c129x/mpu_fault/gcc/mpu_fault.axf create mode 100644 boards/dk-tm4c129x/mpu_fault/gcc/mpu_fault.bin create mode 100644 boards/dk-tm4c129x/mpu_fault/mpu_fault.c create mode 100644 boards/dk-tm4c129x/mpu_fault/mpu_fault.ewd create mode 100644 boards/dk-tm4c129x/mpu_fault/mpu_fault.ewp create mode 100644 boards/dk-tm4c129x/mpu_fault/mpu_fault.icf create mode 100644 boards/dk-tm4c129x/mpu_fault/mpu_fault.ld create mode 100644 boards/dk-tm4c129x/mpu_fault/mpu_fault.sct create mode 100644 boards/dk-tm4c129x/mpu_fault/mpu_fault.uvopt create mode 100644 boards/dk-tm4c129x/mpu_fault/mpu_fault.uvproj create mode 100644 boards/dk-tm4c129x/mpu_fault/mpu_fault_ccs.cmd create mode 100644 boards/dk-tm4c129x/mpu_fault/readme.txt create mode 100644 boards/dk-tm4c129x/mpu_fault/rvmdk/mpu_fault.axf create mode 100644 boards/dk-tm4c129x/mpu_fault/rvmdk/mpu_fault.bin create mode 100644 boards/dk-tm4c129x/mpu_fault/startup_ccs.c create mode 100644 boards/dk-tm4c129x/mpu_fault/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/mpu_fault/startup_gcc.c create mode 100644 boards/dk-tm4c129x/mpu_fault/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/qs_weather/Makefile create mode 100644 boards/dk-tm4c129x/qs_weather/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/qs_weather/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/qs_weather/ccs/.cproject create mode 100644 boards/dk-tm4c129x/qs_weather/ccs/.project create mode 100644 boards/dk-tm4c129x/qs_weather/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/qs_weather/ccs/Debug/qs_weather.bin create mode 100644 boards/dk-tm4c129x/qs_weather/ccs/Debug/qs_weather.out create mode 100644 boards/dk-tm4c129x/qs_weather/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/qs_weather/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/qs_weather/debug.h create mode 100644 boards/dk-tm4c129x/qs_weather/eth_client.c create mode 100644 boards/dk-tm4c129x/qs_weather/eth_client.h create mode 100644 boards/dk-tm4c129x/qs_weather/ewarm/Exe/qs_weather.bin create mode 100644 boards/dk-tm4c129x/qs_weather/ewarm/Exe/qs_weather.out create mode 100644 boards/dk-tm4c129x/qs_weather/gcc/qs_weather.axf create mode 100644 boards/dk-tm4c129x/qs_weather/gcc/qs_weather.bin create mode 100644 boards/dk-tm4c129x/qs_weather/images.c create mode 100644 boards/dk-tm4c129x/qs_weather/images.h create mode 100644 boards/dk-tm4c129x/qs_weather/json.c create mode 100644 boards/dk-tm4c129x/qs_weather/json.h create mode 100644 boards/dk-tm4c129x/qs_weather/lwipopts.h create mode 100644 boards/dk-tm4c129x/qs_weather/qs_weather.c create mode 100644 boards/dk-tm4c129x/qs_weather/qs_weather.ewd create mode 100644 boards/dk-tm4c129x/qs_weather/qs_weather.ewp create mode 100644 boards/dk-tm4c129x/qs_weather/qs_weather.icf create mode 100644 boards/dk-tm4c129x/qs_weather/qs_weather.ld create mode 100644 boards/dk-tm4c129x/qs_weather/qs_weather.sct create mode 100644 boards/dk-tm4c129x/qs_weather/qs_weather.uvopt create mode 100644 boards/dk-tm4c129x/qs_weather/qs_weather.uvproj create mode 100644 boards/dk-tm4c129x/qs_weather/qs_weather_ccs.cmd create mode 100644 boards/dk-tm4c129x/qs_weather/readme.txt create mode 100644 boards/dk-tm4c129x/qs_weather/rvmdk/qs_weather.axf create mode 100644 boards/dk-tm4c129x/qs_weather/rvmdk/qs_weather.bin create mode 100644 boards/dk-tm4c129x/qs_weather/startup_ccs.c create mode 100644 boards/dk-tm4c129x/qs_weather/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/qs_weather/startup_gcc.c create mode 100644 boards/dk-tm4c129x/qs_weather/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/scribble/Makefile create mode 100644 boards/dk-tm4c129x/scribble/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/scribble/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/scribble/ccs/.cproject create mode 100644 boards/dk-tm4c129x/scribble/ccs/.project create mode 100644 boards/dk-tm4c129x/scribble/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/scribble/ccs/Debug/scribble.bin create mode 100644 boards/dk-tm4c129x/scribble/ccs/Debug/scribble.out create mode 100644 boards/dk-tm4c129x/scribble/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/scribble/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/scribble/ewarm/Exe/scribble.bin create mode 100644 boards/dk-tm4c129x/scribble/ewarm/Exe/scribble.out create mode 100644 boards/dk-tm4c129x/scribble/gcc/scribble.axf create mode 100644 boards/dk-tm4c129x/scribble/gcc/scribble.bin create mode 100644 boards/dk-tm4c129x/scribble/readme.txt create mode 100644 boards/dk-tm4c129x/scribble/rvmdk/scribble.axf create mode 100644 boards/dk-tm4c129x/scribble/rvmdk/scribble.bin create mode 100644 boards/dk-tm4c129x/scribble/scribble.c create mode 100644 boards/dk-tm4c129x/scribble/scribble.ewd create mode 100644 boards/dk-tm4c129x/scribble/scribble.ewp create mode 100644 boards/dk-tm4c129x/scribble/scribble.icf create mode 100644 boards/dk-tm4c129x/scribble/scribble.ld create mode 100644 boards/dk-tm4c129x/scribble/scribble.sct create mode 100644 boards/dk-tm4c129x/scribble/scribble.uvopt create mode 100644 boards/dk-tm4c129x/scribble/scribble.uvproj create mode 100644 boards/dk-tm4c129x/scribble/scribble_ccs.cmd create mode 100644 boards/dk-tm4c129x/scribble/startup_ccs.c create mode 100644 boards/dk-tm4c129x/scribble/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/scribble/startup_gcc.c create mode 100644 boards/dk-tm4c129x/scribble/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/sd_card/Makefile create mode 100644 boards/dk-tm4c129x/sd_card/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/sd_card/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/sd_card/ccs/.cproject create mode 100644 boards/dk-tm4c129x/sd_card/ccs/.project create mode 100644 boards/dk-tm4c129x/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/sd_card/ccs/Debug/sd_card.bin create mode 100644 boards/dk-tm4c129x/sd_card/ccs/Debug/sd_card.out create mode 100644 boards/dk-tm4c129x/sd_card/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/sd_card/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/sd_card/ewarm/Exe/sd_card.bin create mode 100644 boards/dk-tm4c129x/sd_card/ewarm/Exe/sd_card.out create mode 100644 boards/dk-tm4c129x/sd_card/gcc/sd_card.axf create mode 100644 boards/dk-tm4c129x/sd_card/gcc/sd_card.bin create mode 100644 boards/dk-tm4c129x/sd_card/readme.txt create mode 100644 boards/dk-tm4c129x/sd_card/rvmdk/sd_card.axf create mode 100644 boards/dk-tm4c129x/sd_card/rvmdk/sd_card.bin create mode 100644 boards/dk-tm4c129x/sd_card/sd_card.c create mode 100644 boards/dk-tm4c129x/sd_card/sd_card.ewd create mode 100644 boards/dk-tm4c129x/sd_card/sd_card.ewp create mode 100644 boards/dk-tm4c129x/sd_card/sd_card.icf create mode 100644 boards/dk-tm4c129x/sd_card/sd_card.ld create mode 100644 boards/dk-tm4c129x/sd_card/sd_card.sct create mode 100644 boards/dk-tm4c129x/sd_card/sd_card.uvopt create mode 100644 boards/dk-tm4c129x/sd_card/sd_card.uvproj create mode 100644 boards/dk-tm4c129x/sd_card/sd_card_ccs.cmd create mode 100644 boards/dk-tm4c129x/sd_card/startup_ccs.c create mode 100644 boards/dk-tm4c129x/sd_card/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/sd_card/startup_gcc.c create mode 100644 boards/dk-tm4c129x/sd_card/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/sha1_hash/Makefile create mode 100644 boards/dk-tm4c129x/sha1_hash/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/sha1_hash/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/sha1_hash/ccs/.cproject create mode 100644 boards/dk-tm4c129x/sha1_hash/ccs/.project create mode 100644 boards/dk-tm4c129x/sha1_hash/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/sha1_hash/ccs/Debug/sha1_hash.bin create mode 100644 boards/dk-tm4c129x/sha1_hash/ccs/Debug/sha1_hash.out create mode 100644 boards/dk-tm4c129x/sha1_hash/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/sha1_hash/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/sha1_hash/ewarm/Exe/sha1_hash.bin create mode 100644 boards/dk-tm4c129x/sha1_hash/ewarm/Exe/sha1_hash.out create mode 100644 boards/dk-tm4c129x/sha1_hash/gcc/sha1_hash.axf create mode 100644 boards/dk-tm4c129x/sha1_hash/gcc/sha1_hash.bin create mode 100644 boards/dk-tm4c129x/sha1_hash/readme.txt create mode 100644 boards/dk-tm4c129x/sha1_hash/rvmdk/sha1_hash.axf create mode 100644 boards/dk-tm4c129x/sha1_hash/rvmdk/sha1_hash.bin create mode 100644 boards/dk-tm4c129x/sha1_hash/sha1_hash.c create mode 100644 boards/dk-tm4c129x/sha1_hash/sha1_hash.ewd create mode 100644 boards/dk-tm4c129x/sha1_hash/sha1_hash.ewp create mode 100644 boards/dk-tm4c129x/sha1_hash/sha1_hash.icf create mode 100644 boards/dk-tm4c129x/sha1_hash/sha1_hash.ld create mode 100644 boards/dk-tm4c129x/sha1_hash/sha1_hash.sct create mode 100644 boards/dk-tm4c129x/sha1_hash/sha1_hash.uvopt create mode 100644 boards/dk-tm4c129x/sha1_hash/sha1_hash.uvproj create mode 100644 boards/dk-tm4c129x/sha1_hash/sha1_hash_ccs.cmd create mode 100644 boards/dk-tm4c129x/sha1_hash/startup_ccs.c create mode 100644 boards/dk-tm4c129x/sha1_hash/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/sha1_hash/startup_gcc.c create mode 100644 boards/dk-tm4c129x/sha1_hash/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/sha1_hmac/Makefile create mode 100644 boards/dk-tm4c129x/sha1_hmac/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/sha1_hmac/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/sha1_hmac/ccs/.cproject create mode 100644 boards/dk-tm4c129x/sha1_hmac/ccs/.project create mode 100644 boards/dk-tm4c129x/sha1_hmac/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/sha1_hmac/ccs/Debug/sha1_hmac.bin create mode 100644 boards/dk-tm4c129x/sha1_hmac/ccs/Debug/sha1_hmac.out create mode 100644 boards/dk-tm4c129x/sha1_hmac/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/sha1_hmac/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/sha1_hmac/ewarm/Exe/sha1_hmac.bin create mode 100644 boards/dk-tm4c129x/sha1_hmac/ewarm/Exe/sha1_hmac.out create mode 100644 boards/dk-tm4c129x/sha1_hmac/gcc/sha1_hmac.axf create mode 100644 boards/dk-tm4c129x/sha1_hmac/gcc/sha1_hmac.bin create mode 100644 boards/dk-tm4c129x/sha1_hmac/readme.txt create mode 100644 boards/dk-tm4c129x/sha1_hmac/rvmdk/sha1_hmac.axf create mode 100644 boards/dk-tm4c129x/sha1_hmac/rvmdk/sha1_hmac.bin create mode 100644 boards/dk-tm4c129x/sha1_hmac/sha1_hmac.c create mode 100644 boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ewd create mode 100644 boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ewp create mode 100644 boards/dk-tm4c129x/sha1_hmac/sha1_hmac.icf create mode 100644 boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ld create mode 100644 boards/dk-tm4c129x/sha1_hmac/sha1_hmac.sct create mode 100644 boards/dk-tm4c129x/sha1_hmac/sha1_hmac.uvopt create mode 100644 boards/dk-tm4c129x/sha1_hmac/sha1_hmac.uvproj create mode 100644 boards/dk-tm4c129x/sha1_hmac/sha1_hmac_ccs.cmd create mode 100644 boards/dk-tm4c129x/sha1_hmac/startup_ccs.c create mode 100644 boards/dk-tm4c129x/sha1_hmac/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/sha1_hmac/startup_gcc.c create mode 100644 boards/dk-tm4c129x/sha1_hmac/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/synth/Makefile create mode 100644 boards/dk-tm4c129x/synth/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/synth/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/synth/ccs/.cproject create mode 100644 boards/dk-tm4c129x/synth/ccs/.project create mode 100644 boards/dk-tm4c129x/synth/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/synth/ccs/Debug/synth.bin create mode 100644 boards/dk-tm4c129x/synth/ccs/Debug/synth.out create mode 100644 boards/dk-tm4c129x/synth/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/synth/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/synth/ewarm/Exe/synth.bin create mode 100644 boards/dk-tm4c129x/synth/ewarm/Exe/synth.out create mode 100644 boards/dk-tm4c129x/synth/gcc/synth.axf create mode 100644 boards/dk-tm4c129x/synth/gcc/synth.bin create mode 100644 boards/dk-tm4c129x/synth/readme.txt create mode 100644 boards/dk-tm4c129x/synth/rvmdk/synth.axf create mode 100644 boards/dk-tm4c129x/synth/rvmdk/synth.bin create mode 100644 boards/dk-tm4c129x/synth/startup_ccs.c create mode 100644 boards/dk-tm4c129x/synth/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/synth/startup_gcc.c create mode 100644 boards/dk-tm4c129x/synth/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/synth/synth.c create mode 100644 boards/dk-tm4c129x/synth/synth.ewd create mode 100644 boards/dk-tm4c129x/synth/synth.ewp create mode 100644 boards/dk-tm4c129x/synth/synth.icf create mode 100644 boards/dk-tm4c129x/synth/synth.ld create mode 100644 boards/dk-tm4c129x/synth/synth.sct create mode 100644 boards/dk-tm4c129x/synth/synth.uvopt create mode 100644 boards/dk-tm4c129x/synth/synth.uvproj create mode 100644 boards/dk-tm4c129x/synth/synth_ccs.cmd create mode 100644 boards/dk-tm4c129x/tamper/Makefile create mode 100644 boards/dk-tm4c129x/tamper/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/tamper/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/tamper/ccs/.cproject create mode 100644 boards/dk-tm4c129x/tamper/ccs/.project create mode 100644 boards/dk-tm4c129x/tamper/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/tamper/ccs/Debug/tamper.bin create mode 100644 boards/dk-tm4c129x/tamper/ccs/Debug/tamper.out create mode 100644 boards/dk-tm4c129x/tamper/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/tamper/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/tamper/ewarm/Exe/tamper.bin create mode 100644 boards/dk-tm4c129x/tamper/ewarm/Exe/tamper.out create mode 100644 boards/dk-tm4c129x/tamper/gcc/tamper.axf create mode 100644 boards/dk-tm4c129x/tamper/gcc/tamper.bin create mode 100644 boards/dk-tm4c129x/tamper/readme.txt create mode 100644 boards/dk-tm4c129x/tamper/rvmdk/tamper.axf create mode 100644 boards/dk-tm4c129x/tamper/rvmdk/tamper.bin create mode 100644 boards/dk-tm4c129x/tamper/startup_ccs.c create mode 100644 boards/dk-tm4c129x/tamper/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/tamper/startup_gcc.c create mode 100644 boards/dk-tm4c129x/tamper/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/tamper/tamper.c create mode 100644 boards/dk-tm4c129x/tamper/tamper.ewd create mode 100644 boards/dk-tm4c129x/tamper/tamper.ewp create mode 100644 boards/dk-tm4c129x/tamper/tamper.icf create mode 100644 boards/dk-tm4c129x/tamper/tamper.ld create mode 100644 boards/dk-tm4c129x/tamper/tamper.sct create mode 100644 boards/dk-tm4c129x/tamper/tamper.uvopt create mode 100644 boards/dk-tm4c129x/tamper/tamper.uvproj create mode 100644 boards/dk-tm4c129x/tamper/tamper_ccs.cmd create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/Makefile create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.cproject create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.project create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/Debug/tdes_cbc_decrypt.bin create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/Debug/tdes_cbc_decrypt.out create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/ewarm/Exe/tdes_cbc_decrypt.bin create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/ewarm/Exe/tdes_cbc_decrypt.out create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/gcc/tdes_cbc_decrypt.axf create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/gcc/tdes_cbc_decrypt.bin create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/readme.txt create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/rvmdk/tdes_cbc_decrypt.axf create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/rvmdk/tdes_cbc_decrypt.bin create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/startup_ccs.c create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/startup_gcc.c create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.c create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ewd create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ewp create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.icf create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ld create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.sct create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.uvopt create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.uvproj create mode 100644 boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt_ccs.cmd create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/Makefile create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.cproject create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.project create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/Debug/tdes_cbc_encrypt.bin create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/Debug/tdes_cbc_encrypt.out create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/ewarm/Exe/tdes_cbc_encrypt.bin create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/ewarm/Exe/tdes_cbc_encrypt.out create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/gcc/tdes_cbc_encrypt.axf create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/gcc/tdes_cbc_encrypt.bin create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/readme.txt create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/rvmdk/tdes_cbc_encrypt.axf create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/rvmdk/tdes_cbc_encrypt.bin create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/startup_ccs.c create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/startup_gcc.c create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.c create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ewd create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ewp create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.icf create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ld create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.sct create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.uvopt create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.uvproj create mode 100644 boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt_ccs.cmd create mode 100644 boards/dk-tm4c129x/timers/Makefile create mode 100644 boards/dk-tm4c129x/timers/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/timers/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/timers/ccs/.cproject create mode 100644 boards/dk-tm4c129x/timers/ccs/.project create mode 100644 boards/dk-tm4c129x/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/timers/ccs/Debug/timers.bin create mode 100644 boards/dk-tm4c129x/timers/ccs/Debug/timers.out create mode 100644 boards/dk-tm4c129x/timers/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/timers/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/timers/ewarm/Exe/timers.bin create mode 100644 boards/dk-tm4c129x/timers/ewarm/Exe/timers.out create mode 100644 boards/dk-tm4c129x/timers/gcc/timers.axf create mode 100644 boards/dk-tm4c129x/timers/gcc/timers.bin create mode 100644 boards/dk-tm4c129x/timers/readme.txt create mode 100644 boards/dk-tm4c129x/timers/rvmdk/timers.axf create mode 100644 boards/dk-tm4c129x/timers/rvmdk/timers.bin create mode 100644 boards/dk-tm4c129x/timers/startup_ccs.c create mode 100644 boards/dk-tm4c129x/timers/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/timers/startup_gcc.c create mode 100644 boards/dk-tm4c129x/timers/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/timers/timers.c create mode 100644 boards/dk-tm4c129x/timers/timers.ewd create mode 100644 boards/dk-tm4c129x/timers/timers.ewp create mode 100644 boards/dk-tm4c129x/timers/timers.icf create mode 100644 boards/dk-tm4c129x/timers/timers.ld create mode 100644 boards/dk-tm4c129x/timers/timers.sct create mode 100644 boards/dk-tm4c129x/timers/timers.uvopt create mode 100644 boards/dk-tm4c129x/timers/timers.uvproj create mode 100644 boards/dk-tm4c129x/timers/timers_ccs.cmd create mode 100644 boards/dk-tm4c129x/uart_echo/Makefile create mode 100644 boards/dk-tm4c129x/uart_echo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/uart_echo/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/uart_echo/ccs/.cproject create mode 100644 boards/dk-tm4c129x/uart_echo/ccs/.project create mode 100644 boards/dk-tm4c129x/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/uart_echo/ccs/Debug/uart_echo.bin create mode 100644 boards/dk-tm4c129x/uart_echo/ccs/Debug/uart_echo.out create mode 100644 boards/dk-tm4c129x/uart_echo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/uart_echo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/uart_echo/ewarm/Exe/uart_echo.bin create mode 100644 boards/dk-tm4c129x/uart_echo/ewarm/Exe/uart_echo.out create mode 100644 boards/dk-tm4c129x/uart_echo/gcc/uart_echo.axf create mode 100644 boards/dk-tm4c129x/uart_echo/gcc/uart_echo.bin create mode 100644 boards/dk-tm4c129x/uart_echo/readme.txt create mode 100644 boards/dk-tm4c129x/uart_echo/rvmdk/uart_echo.axf create mode 100644 boards/dk-tm4c129x/uart_echo/rvmdk/uart_echo.bin create mode 100644 boards/dk-tm4c129x/uart_echo/startup_ccs.c create mode 100644 boards/dk-tm4c129x/uart_echo/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/uart_echo/startup_gcc.c create mode 100644 boards/dk-tm4c129x/uart_echo/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/uart_echo/uart_echo.c create mode 100644 boards/dk-tm4c129x/uart_echo/uart_echo.ewd create mode 100644 boards/dk-tm4c129x/uart_echo/uart_echo.ewp create mode 100644 boards/dk-tm4c129x/uart_echo/uart_echo.icf create mode 100644 boards/dk-tm4c129x/uart_echo/uart_echo.ld create mode 100644 boards/dk-tm4c129x/uart_echo/uart_echo.sct create mode 100644 boards/dk-tm4c129x/uart_echo/uart_echo.uvopt create mode 100644 boards/dk-tm4c129x/uart_echo/uart_echo.uvproj create mode 100644 boards/dk-tm4c129x/uart_echo/uart_echo_ccs.cmd create mode 100644 boards/dk-tm4c129x/udma_demo/Makefile create mode 100644 boards/dk-tm4c129x/udma_demo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/udma_demo/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/udma_demo/ccs/.cproject create mode 100644 boards/dk-tm4c129x/udma_demo/ccs/.project create mode 100644 boards/dk-tm4c129x/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/udma_demo/ccs/Debug/udma_demo.bin create mode 100644 boards/dk-tm4c129x/udma_demo/ccs/Debug/udma_demo.out create mode 100644 boards/dk-tm4c129x/udma_demo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/udma_demo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/udma_demo/ewarm/Exe/udma_demo.bin create mode 100644 boards/dk-tm4c129x/udma_demo/ewarm/Exe/udma_demo.out create mode 100644 boards/dk-tm4c129x/udma_demo/gcc/udma_demo.axf create mode 100644 boards/dk-tm4c129x/udma_demo/gcc/udma_demo.bin create mode 100644 boards/dk-tm4c129x/udma_demo/readme.txt create mode 100644 boards/dk-tm4c129x/udma_demo/rvmdk/udma_demo.axf create mode 100644 boards/dk-tm4c129x/udma_demo/rvmdk/udma_demo.bin create mode 100644 boards/dk-tm4c129x/udma_demo/startup_ccs.c create mode 100644 boards/dk-tm4c129x/udma_demo/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/udma_demo/startup_gcc.c create mode 100644 boards/dk-tm4c129x/udma_demo/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/udma_demo/udma_demo.c create mode 100644 boards/dk-tm4c129x/udma_demo/udma_demo.ewd create mode 100644 boards/dk-tm4c129x/udma_demo/udma_demo.ewp create mode 100644 boards/dk-tm4c129x/udma_demo/udma_demo.icf create mode 100644 boards/dk-tm4c129x/udma_demo/udma_demo.ld create mode 100644 boards/dk-tm4c129x/udma_demo/udma_demo.sct create mode 100644 boards/dk-tm4c129x/udma_demo/udma_demo.uvopt create mode 100644 boards/dk-tm4c129x/udma_demo/udma_demo.uvproj create mode 100644 boards/dk-tm4c129x/udma_demo/udma_demo_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/Makefile create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/gcc/usb_dev_bulk.axf create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/gcc/usb_dev_bulk.bin create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/readme.txt create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/rvmdk/usb_dev_bulk.axf create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/rvmdk/usb_dev_bulk.bin create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/usb_bulk_structs.c create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/usb_bulk_structs.h create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.c create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ewd create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ewp create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.icf create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ld create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.sct create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.uvopt create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.uvproj create mode 100644 boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_dev_chid/Makefile create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ccs/Debug/usb_dev_chid.bin create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ccs/Debug/usb_dev_chid.out create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ewarm/Exe/usb_dev_chid.bin create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ewarm/Exe/usb_dev_chid.out create mode 100644 boards/dk-tm4c129x/usb_dev_chid/gcc/usb_dev_chid.axf create mode 100644 boards/dk-tm4c129x/usb_dev_chid/gcc/usb_dev_chid.bin create mode 100644 boards/dk-tm4c129x/usb_dev_chid/readme.txt create mode 100644 boards/dk-tm4c129x/usb_dev_chid/rvmdk/usb_dev_chid.axf create mode 100644 boards/dk-tm4c129x/usb_dev_chid/rvmdk/usb_dev_chid.bin create mode 100644 boards/dk-tm4c129x/usb_dev_chid/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_dev_chid/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_dev_chid/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_dev_chid/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ui.c create mode 100644 boards/dk-tm4c129x/usb_dev_chid/ui.h create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.c create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ewd create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ewp create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.icf create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ld create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.sct create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.uvopt create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.uvproj create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_keyboard.c create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_mouse.c create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_structs.c create mode 100644 boards/dk-tm4c129x/usb_dev_chid/usb_structs.h create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/Makefile create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.bin create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.out create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.bin create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.out create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/gcc/usb_dev_gamepad.axf create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/gcc/usb_dev_gamepad.bin create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/readme.txt create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/rvmdk/usb_dev_gamepad.axf create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/rvmdk/usb_dev_gamepad.bin create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.c create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ewd create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ewp create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.icf create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ld create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.sct create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.uvopt create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.uvproj create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/usb_gamepad_structs.c create mode 100644 boards/dk-tm4c129x/usb_dev_gamepad/usb_gamepad_structs.h create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/Makefile create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/gcc/usb_dev_keyboard.axf create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/gcc/usb_dev_keyboard.bin create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/readme.txt create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.c create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ewd create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ewp create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.icf create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ld create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.sct create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.uvopt create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.uvproj create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/usb_keyb_structs.c create mode 100644 boards/dk-tm4c129x/usb_dev_keyboard/usb_keyb_structs.h create mode 100644 boards/dk-tm4c129x/usb_dev_msc/Makefile create mode 100644 boards/dk-tm4c129x/usb_dev_msc/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_dev_msc/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_dev_msc/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_dev_msc/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_dev_msc/ccs/Debug/usb_dev_msc.bin create mode 100644 boards/dk-tm4c129x/usb_dev_msc/ccs/Debug/usb_dev_msc.out create mode 100644 boards/dk-tm4c129x/usb_dev_msc/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_dev_msc/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin create mode 100644 boards/dk-tm4c129x/usb_dev_msc/ewarm/Exe/usb_dev_msc.out create mode 100644 boards/dk-tm4c129x/usb_dev_msc/gcc/usb_dev_msc.axf create mode 100644 boards/dk-tm4c129x/usb_dev_msc/gcc/usb_dev_msc.bin create mode 100644 boards/dk-tm4c129x/usb_dev_msc/readme.txt create mode 100644 boards/dk-tm4c129x/usb_dev_msc/rvmdk/usb_dev_msc.axf create mode 100644 boards/dk-tm4c129x/usb_dev_msc/rvmdk/usb_dev_msc.bin create mode 100644 boards/dk-tm4c129x/usb_dev_msc/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_dev_msc/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_dev_msc/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_dev_msc/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.c create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ewd create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ewp create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.icf create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ld create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.sct create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.uvopt create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.uvproj create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usb_msc_structs.c create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usb_msc_structs.h create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usbdspiflash.c create mode 100644 boards/dk-tm4c129x/usb_dev_msc/usbdspiflash.h create mode 100644 boards/dk-tm4c129x/usb_dev_serial/Makefile create mode 100644 boards/dk-tm4c129x/usb_dev_serial/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_dev_serial/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_dev_serial/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_dev_serial/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_dev_serial/ccs/Debug/usb_dev_serial.bin create mode 100644 boards/dk-tm4c129x/usb_dev_serial/ccs/Debug/usb_dev_serial.out create mode 100644 boards/dk-tm4c129x/usb_dev_serial/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_dev_serial/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin create mode 100644 boards/dk-tm4c129x/usb_dev_serial/ewarm/Exe/usb_dev_serial.out create mode 100644 boards/dk-tm4c129x/usb_dev_serial/gcc/usb_dev_serial.axf create mode 100644 boards/dk-tm4c129x/usb_dev_serial/gcc/usb_dev_serial.bin create mode 100644 boards/dk-tm4c129x/usb_dev_serial/readme.txt create mode 100644 boards/dk-tm4c129x/usb_dev_serial/rvmdk/usb_dev_serial.axf create mode 100644 boards/dk-tm4c129x/usb_dev_serial/rvmdk/usb_dev_serial.bin create mode 100644 boards/dk-tm4c129x/usb_dev_serial/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_dev_serial/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_dev_serial/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_dev_serial/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.c create mode 100644 boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ewd create mode 100644 boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ewp create mode 100644 boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.icf create mode 100644 boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ld create mode 100644 boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.sct create mode 100644 boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.uvopt create mode 100644 boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.uvproj create mode 100644 boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_dev_serial/usb_serial_structs.c create mode 100644 boards/dk-tm4c129x/usb_dev_serial/usb_serial_structs.h create mode 100644 boards/dk-tm4c129x/usb_host_audio/Makefile create mode 100644 boards/dk-tm4c129x/usb_host_audio/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_host_audio/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_host_audio/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_host_audio/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_host_audio/ccs/Debug/usb_host_audio.bin create mode 100644 boards/dk-tm4c129x/usb_host_audio/ccs/Debug/usb_host_audio.out create mode 100644 boards/dk-tm4c129x/usb_host_audio/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_host_audio/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_host_audio/ewarm/Exe/usb_host_audio.bin create mode 100644 boards/dk-tm4c129x/usb_host_audio/ewarm/Exe/usb_host_audio.out create mode 100644 boards/dk-tm4c129x/usb_host_audio/gcc/usb_host_audio.axf create mode 100644 boards/dk-tm4c129x/usb_host_audio/gcc/usb_host_audio.bin create mode 100644 boards/dk-tm4c129x/usb_host_audio/readme.txt create mode 100644 boards/dk-tm4c129x/usb_host_audio/rvmdk/usb_host_audio.axf create mode 100644 boards/dk-tm4c129x/usb_host_audio/rvmdk/usb_host_audio.bin create mode 100644 boards/dk-tm4c129x/usb_host_audio/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_host_audio/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_host_audio/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_host_audio/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_host_audio/usb_host_audio.c create mode 100644 boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ewd create mode 100644 boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ewp create mode 100644 boards/dk-tm4c129x/usb_host_audio/usb_host_audio.icf create mode 100644 boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ld create mode 100644 boards/dk-tm4c129x/usb_host_audio/usb_host_audio.sct create mode 100644 boards/dk-tm4c129x/usb_host_audio/usb_host_audio.uvopt create mode 100644 boards/dk-tm4c129x/usb_host_audio/usb_host_audio.uvproj create mode 100644 boards/dk-tm4c129x/usb_host_audio/usb_host_audio_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/Makefile create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/ccs/Debug/usb_host_audio_in.bin create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/ccs/Debug/usb_host_audio_in.out create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/ewarm/Exe/usb_host_audio_in.bin create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/ewarm/Exe/usb_host_audio_in.out create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/gcc/usb_host_audio_in.axf create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/gcc/usb_host_audio_in.bin create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/readme.txt create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/rvmdk/usb_host_audio_in.axf create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/rvmdk/usb_host_audio_in.bin create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.c create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ewd create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ewp create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.icf create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ld create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.sct create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.uvopt create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.uvproj create mode 100644 boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_host_hub/Makefile create mode 100644 boards/dk-tm4c129x/usb_host_hub/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_host_hub/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_host_hub/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_host_hub/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_host_hub/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_host_hub/ccs/Debug/usb_host_hub.bin create mode 100644 boards/dk-tm4c129x/usb_host_hub/ccs/Debug/usb_host_hub.out create mode 100644 boards/dk-tm4c129x/usb_host_hub/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_host_hub/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_host_hub/ewarm/Exe/usb_host_hub.bin create mode 100644 boards/dk-tm4c129x/usb_host_hub/ewarm/Exe/usb_host_hub.out create mode 100644 boards/dk-tm4c129x/usb_host_hub/gcc/usb_host_hub.axf create mode 100644 boards/dk-tm4c129x/usb_host_hub/gcc/usb_host_hub.bin create mode 100644 boards/dk-tm4c129x/usb_host_hub/readme.txt create mode 100644 boards/dk-tm4c129x/usb_host_hub/rvmdk/usb_host_hub.axf create mode 100644 boards/dk-tm4c129x/usb_host_hub/rvmdk/usb_host_hub.bin create mode 100644 boards/dk-tm4c129x/usb_host_hub/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_host_hub/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_host_hub/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_host_hub/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_hub.c create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ewd create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ewp create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_hub.h create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_hub.icf create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ld create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_hub.sct create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_hub.uvopt create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_hub.uvproj create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_hub_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_keyboard.c create mode 100644 boards/dk-tm4c129x/usb_host_hub/usb_host_msc.c create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/Makefile create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/gcc/usb_host_keyboard.axf create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/gcc/usb_host_keyboard.bin create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/keyboard_ui.c create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/keyboard_ui.h create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/readme.txt create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/rvmdk/usb_host_keyboard.axf create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/rvmdk/usb_host_keyboard.bin create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.c create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ewd create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ewp create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.icf create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ld create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.sct create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.uvopt create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.uvproj create mode 100644 boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_host_mouse/Makefile create mode 100644 boards/dk-tm4c129x/usb_host_mouse/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_host_mouse/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_host_mouse/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_host_mouse/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_host_mouse/ccs/Debug/usb_host_mouse.bin create mode 100644 boards/dk-tm4c129x/usb_host_mouse/ccs/Debug/usb_host_mouse.out create mode 100644 boards/dk-tm4c129x/usb_host_mouse/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_host_mouse/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin create mode 100644 boards/dk-tm4c129x/usb_host_mouse/ewarm/Exe/usb_host_mouse.out create mode 100644 boards/dk-tm4c129x/usb_host_mouse/gcc/usb_host_mouse.axf create mode 100644 boards/dk-tm4c129x/usb_host_mouse/gcc/usb_host_mouse.bin create mode 100644 boards/dk-tm4c129x/usb_host_mouse/mouse_ui.c create mode 100644 boards/dk-tm4c129x/usb_host_mouse/mouse_ui.h create mode 100644 boards/dk-tm4c129x/usb_host_mouse/readme.txt create mode 100644 boards/dk-tm4c129x/usb_host_mouse/rvmdk/usb_host_mouse.axf create mode 100644 boards/dk-tm4c129x/usb_host_mouse/rvmdk/usb_host_mouse.bin create mode 100644 boards/dk-tm4c129x/usb_host_mouse/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_host_mouse/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_host_mouse/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_host_mouse/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.c create mode 100644 boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ewd create mode 100644 boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ewp create mode 100644 boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.icf create mode 100644 boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ld create mode 100644 boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.sct create mode 100644 boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.uvopt create mode 100644 boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.uvproj create mode 100644 boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_host_msc/Makefile create mode 100644 boards/dk-tm4c129x/usb_host_msc/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_host_msc/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_host_msc/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_host_msc/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_host_msc/ccs/Debug/usb_host_msc.bin create mode 100644 boards/dk-tm4c129x/usb_host_msc/ccs/Debug/usb_host_msc.out create mode 100644 boards/dk-tm4c129x/usb_host_msc/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_host_msc/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_host_msc/ewarm/Exe/usb_host_msc.bin create mode 100644 boards/dk-tm4c129x/usb_host_msc/ewarm/Exe/usb_host_msc.out create mode 100644 boards/dk-tm4c129x/usb_host_msc/gcc/usb_host_msc.axf create mode 100644 boards/dk-tm4c129x/usb_host_msc/gcc/usb_host_msc.bin create mode 100644 boards/dk-tm4c129x/usb_host_msc/readme.txt create mode 100644 boards/dk-tm4c129x/usb_host_msc/rvmdk/usb_host_msc.axf create mode 100644 boards/dk-tm4c129x/usb_host_msc/rvmdk/usb_host_msc.bin create mode 100644 boards/dk-tm4c129x/usb_host_msc/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_host_msc/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_host_msc/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_host_msc/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_host_msc/usb_host_msc.c create mode 100644 boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ewd create mode 100644 boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ewp create mode 100644 boards/dk-tm4c129x/usb_host_msc/usb_host_msc.icf create mode 100644 boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ld create mode 100644 boards/dk-tm4c129x/usb_host_msc/usb_host_msc.sct create mode 100644 boards/dk-tm4c129x/usb_host_msc/usb_host_msc.uvopt create mode 100644 boards/dk-tm4c129x/usb_host_msc/usb_host_msc.uvproj create mode 100644 boards/dk-tm4c129x/usb_host_msc/usb_host_msc_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/Makefile create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/ccs/Debug/usb_otg_mouse.bin create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/ccs/Debug/usb_otg_mouse.out create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/ewarm/Exe/usb_otg_mouse.bin create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/ewarm/Exe/usb_otg_mouse.out create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/gcc/usb_otg_mouse.axf create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/gcc/usb_otg_mouse.bin create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/readme.txt create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/rvmdk/usb_otg_mouse.axf create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/rvmdk/usb_otg_mouse.bin create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_dev_mouse.c create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_host_mouse.c create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_mouse_structs.c create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_mouse_structs.h create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.c create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ewd create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ewp create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.h create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.icf create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ld create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.sct create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.uvopt create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.uvproj create mode 100644 boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_stick_demo/Makefile create mode 100644 boards/dk-tm4c129x/usb_stick_demo/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_stick_demo/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_stick_demo/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_stick_demo/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_stick_demo/ccs/Debug/usb_stick_demo.bin create mode 100644 boards/dk-tm4c129x/usb_stick_demo/ccs/Debug/usb_stick_demo.out create mode 100644 boards/dk-tm4c129x/usb_stick_demo/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_stick_demo/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin create mode 100644 boards/dk-tm4c129x/usb_stick_demo/ewarm/Exe/usb_stick_demo.out create mode 100644 boards/dk-tm4c129x/usb_stick_demo/gcc/usb_stick_demo.axf create mode 100644 boards/dk-tm4c129x/usb_stick_demo/gcc/usb_stick_demo.bin create mode 100644 boards/dk-tm4c129x/usb_stick_demo/readme.txt create mode 100644 boards/dk-tm4c129x/usb_stick_demo/rvmdk/usb_stick_demo.axf create mode 100644 boards/dk-tm4c129x/usb_stick_demo/rvmdk/usb_stick_demo.bin create mode 100644 boards/dk-tm4c129x/usb_stick_demo/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_stick_demo/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_stick_demo/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_stick_demo/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.c create mode 100644 boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ewd create mode 100644 boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ewp create mode 100644 boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.icf create mode 100644 boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ld create mode 100644 boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.sct create mode 100644 boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.uvopt create mode 100644 boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.uvproj create mode 100644 boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo_ccs.cmd create mode 100644 boards/dk-tm4c129x/usb_stick_update/Makefile create mode 100644 boards/dk-tm4c129x/usb_stick_update/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/usb_stick_update/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/usb_stick_update/ccs/.cproject create mode 100644 boards/dk-tm4c129x/usb_stick_update/ccs/.project create mode 100644 boards/dk-tm4c129x/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/usb_stick_update/ccs/Debug/usb_stick_update.bin create mode 100644 boards/dk-tm4c129x/usb_stick_update/ccs/Debug/usb_stick_update.out create mode 100644 boards/dk-tm4c129x/usb_stick_update/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/usb_stick_update/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/usb_stick_update/ewarm/Exe/usb_stick_update.bin create mode 100644 boards/dk-tm4c129x/usb_stick_update/ewarm/Exe/usb_stick_update.out create mode 100644 boards/dk-tm4c129x/usb_stick_update/gcc/usb_stick_update.axf create mode 100644 boards/dk-tm4c129x/usb_stick_update/gcc/usb_stick_update.bin create mode 100644 boards/dk-tm4c129x/usb_stick_update/readme.txt create mode 100644 boards/dk-tm4c129x/usb_stick_update/rvmdk/usb_stick_update.axf create mode 100644 boards/dk-tm4c129x/usb_stick_update/rvmdk/usb_stick_update.bin create mode 100644 boards/dk-tm4c129x/usb_stick_update/simple_fs.c create mode 100644 boards/dk-tm4c129x/usb_stick_update/simple_fs.h create mode 100644 boards/dk-tm4c129x/usb_stick_update/startup_ccs.c create mode 100644 boards/dk-tm4c129x/usb_stick_update/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/usb_stick_update/startup_gcc.c create mode 100644 boards/dk-tm4c129x/usb_stick_update/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/usb_stick_update/usb_stick_update.c create mode 100644 boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ewd create mode 100644 boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ewp create mode 100644 boards/dk-tm4c129x/usb_stick_update/usb_stick_update.icf create mode 100644 boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ld create mode 100644 boards/dk-tm4c129x/usb_stick_update/usb_stick_update.sct create mode 100644 boards/dk-tm4c129x/usb_stick_update/usb_stick_update.uvopt create mode 100644 boards/dk-tm4c129x/usb_stick_update/usb_stick_update.uvproj create mode 100644 boards/dk-tm4c129x/usb_stick_update/usb_stick_update_ccs.cmd create mode 100644 boards/dk-tm4c129x/watchdog/Makefile create mode 100644 boards/dk-tm4c129x/watchdog/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/watchdog/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/watchdog/ccs/.cproject create mode 100644 boards/dk-tm4c129x/watchdog/ccs/.project create mode 100644 boards/dk-tm4c129x/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/watchdog/ccs/Debug/watchdog.bin create mode 100644 boards/dk-tm4c129x/watchdog/ccs/Debug/watchdog.out create mode 100644 boards/dk-tm4c129x/watchdog/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/watchdog/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/watchdog/ewarm/Exe/watchdog.bin create mode 100644 boards/dk-tm4c129x/watchdog/ewarm/Exe/watchdog.out create mode 100644 boards/dk-tm4c129x/watchdog/gcc/watchdog.axf create mode 100644 boards/dk-tm4c129x/watchdog/gcc/watchdog.bin create mode 100644 boards/dk-tm4c129x/watchdog/readme.txt create mode 100644 boards/dk-tm4c129x/watchdog/rvmdk/watchdog.axf create mode 100644 boards/dk-tm4c129x/watchdog/rvmdk/watchdog.bin create mode 100644 boards/dk-tm4c129x/watchdog/startup_ccs.c create mode 100644 boards/dk-tm4c129x/watchdog/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/watchdog/startup_gcc.c create mode 100644 boards/dk-tm4c129x/watchdog/startup_rvmdk.S create mode 100644 boards/dk-tm4c129x/watchdog/watchdog.c create mode 100644 boards/dk-tm4c129x/watchdog/watchdog.ewd create mode 100644 boards/dk-tm4c129x/watchdog/watchdog.ewp create mode 100644 boards/dk-tm4c129x/watchdog/watchdog.icf create mode 100644 boards/dk-tm4c129x/watchdog/watchdog.ld create mode 100644 boards/dk-tm4c129x/watchdog/watchdog.sct create mode 100644 boards/dk-tm4c129x/watchdog/watchdog.uvopt create mode 100644 boards/dk-tm4c129x/watchdog/watchdog.uvproj create mode 100644 boards/dk-tm4c129x/watchdog/watchdog_ccs.cmd create mode 100644 boards/ek-lm4f232/Makefile create mode 100644 boards/ek-lm4f232/bitband/Makefile create mode 100644 boards/ek-lm4f232/bitband/bitband.c create mode 100644 boards/ek-lm4f232/bitband/bitband.ewd create mode 100644 boards/ek-lm4f232/bitband/bitband.ewp create mode 100644 boards/ek-lm4f232/bitband/bitband.icf create mode 100644 boards/ek-lm4f232/bitband/bitband.ld create mode 100644 boards/ek-lm4f232/bitband/bitband.sct create mode 100644 boards/ek-lm4f232/bitband/bitband.uvopt create mode 100644 boards/ek-lm4f232/bitband/bitband.uvproj create mode 100644 boards/ek-lm4f232/bitband/bitband_ccs.cmd create mode 100644 boards/ek-lm4f232/bitband/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/bitband/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/bitband/ccs/.cproject create mode 100644 boards/ek-lm4f232/bitband/ccs/.project create mode 100644 boards/ek-lm4f232/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/bitband/ccs/Debug/bitband.bin create mode 100644 boards/ek-lm4f232/bitband/ccs/Debug/bitband.out create mode 100644 boards/ek-lm4f232/bitband/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/bitband/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/bitband/ewarm/Exe/bitband.bin create mode 100644 boards/ek-lm4f232/bitband/ewarm/Exe/bitband.out create mode 100644 boards/ek-lm4f232/bitband/gcc/bitband.axf create mode 100644 boards/ek-lm4f232/bitband/gcc/bitband.bin create mode 100644 boards/ek-lm4f232/bitband/readme.txt create mode 100644 boards/ek-lm4f232/bitband/rvmdk/bitband.axf create mode 100644 boards/ek-lm4f232/bitband/rvmdk/bitband.bin create mode 100644 boards/ek-lm4f232/bitband/startup_ccs.c create mode 100644 boards/ek-lm4f232/bitband/startup_ewarm.c create mode 100644 boards/ek-lm4f232/bitband/startup_gcc.c create mode 100644 boards/ek-lm4f232/bitband/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/blinky/Makefile create mode 100644 boards/ek-lm4f232/blinky/blinky.c create mode 100644 boards/ek-lm4f232/blinky/blinky.ewd create mode 100644 boards/ek-lm4f232/blinky/blinky.ewp create mode 100644 boards/ek-lm4f232/blinky/blinky.icf create mode 100644 boards/ek-lm4f232/blinky/blinky.ld create mode 100644 boards/ek-lm4f232/blinky/blinky.sct create mode 100644 boards/ek-lm4f232/blinky/blinky.uvopt create mode 100644 boards/ek-lm4f232/blinky/blinky.uvproj create mode 100644 boards/ek-lm4f232/blinky/blinky_ccs.cmd create mode 100644 boards/ek-lm4f232/blinky/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/blinky/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/blinky/ccs/.cproject create mode 100644 boards/ek-lm4f232/blinky/ccs/.project create mode 100644 boards/ek-lm4f232/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/blinky/ccs/Debug/blinky.bin create mode 100644 boards/ek-lm4f232/blinky/ccs/Debug/blinky.out create mode 100644 boards/ek-lm4f232/blinky/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/blinky/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/blinky/ewarm/Exe/blinky.bin create mode 100644 boards/ek-lm4f232/blinky/ewarm/Exe/blinky.out create mode 100644 boards/ek-lm4f232/blinky/gcc/blinky.axf create mode 100644 boards/ek-lm4f232/blinky/gcc/blinky.bin create mode 100644 boards/ek-lm4f232/blinky/readme.txt create mode 100644 boards/ek-lm4f232/blinky/rvmdk/blinky.axf create mode 100644 boards/ek-lm4f232/blinky/rvmdk/blinky.bin create mode 100644 boards/ek-lm4f232/blinky/startup_ccs.c create mode 100644 boards/ek-lm4f232/blinky/startup_ewarm.c create mode 100644 boards/ek-lm4f232/blinky/startup_gcc.c create mode 100644 boards/ek-lm4f232/blinky/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/boot_demo1/Makefile create mode 100644 boards/ek-lm4f232/boot_demo1/boot_demo1.c create mode 100644 boards/ek-lm4f232/boot_demo1/boot_demo1.ewd create mode 100644 boards/ek-lm4f232/boot_demo1/boot_demo1.ewp create mode 100644 boards/ek-lm4f232/boot_demo1/boot_demo1.icf create mode 100644 boards/ek-lm4f232/boot_demo1/boot_demo1.ld create mode 100644 boards/ek-lm4f232/boot_demo1/boot_demo1.sct create mode 100644 boards/ek-lm4f232/boot_demo1/boot_demo1.uvopt create mode 100644 boards/ek-lm4f232/boot_demo1/boot_demo1.uvproj create mode 100644 boards/ek-lm4f232/boot_demo1/boot_demo1_ccs.cmd create mode 100644 boards/ek-lm4f232/boot_demo1/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/boot_demo1/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/boot_demo1/ccs/.cproject create mode 100644 boards/ek-lm4f232/boot_demo1/ccs/.project create mode 100644 boards/ek-lm4f232/boot_demo1/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/boot_demo1/ccs/Debug/boot_demo1.bin create mode 100644 boards/ek-lm4f232/boot_demo1/ccs/Debug/boot_demo1.out create mode 100644 boards/ek-lm4f232/boot_demo1/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/boot_demo1/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/boot_demo1/ewarm/Exe/boot_demo1.bin create mode 100644 boards/ek-lm4f232/boot_demo1/ewarm/Exe/boot_demo1.out create mode 100644 boards/ek-lm4f232/boot_demo1/gcc/boot_demo1.axf create mode 100644 boards/ek-lm4f232/boot_demo1/gcc/boot_demo1.bin create mode 100644 boards/ek-lm4f232/boot_demo1/readme.txt create mode 100644 boards/ek-lm4f232/boot_demo1/rvmdk/boot_demo1.axf create mode 100644 boards/ek-lm4f232/boot_demo1/rvmdk/boot_demo1.bin create mode 100644 boards/ek-lm4f232/boot_demo1/startup_ccs.c create mode 100644 boards/ek-lm4f232/boot_demo1/startup_ewarm.c create mode 100644 boards/ek-lm4f232/boot_demo1/startup_gcc.c create mode 100644 boards/ek-lm4f232/boot_demo1/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/boot_demo2/Makefile create mode 100644 boards/ek-lm4f232/boot_demo2/boot_demo2.c create mode 100644 boards/ek-lm4f232/boot_demo2/boot_demo2.ewd create mode 100644 boards/ek-lm4f232/boot_demo2/boot_demo2.ewp create mode 100644 boards/ek-lm4f232/boot_demo2/boot_demo2.icf create mode 100644 boards/ek-lm4f232/boot_demo2/boot_demo2.ld create mode 100644 boards/ek-lm4f232/boot_demo2/boot_demo2.sct create mode 100644 boards/ek-lm4f232/boot_demo2/boot_demo2.uvopt create mode 100644 boards/ek-lm4f232/boot_demo2/boot_demo2.uvproj create mode 100644 boards/ek-lm4f232/boot_demo2/boot_demo2_ccs.cmd create mode 100644 boards/ek-lm4f232/boot_demo2/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/boot_demo2/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/boot_demo2/ccs/.cproject create mode 100644 boards/ek-lm4f232/boot_demo2/ccs/.project create mode 100644 boards/ek-lm4f232/boot_demo2/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/boot_demo2/ccs/Debug/boot_demo2.bin create mode 100644 boards/ek-lm4f232/boot_demo2/ccs/Debug/boot_demo2.out create mode 100644 boards/ek-lm4f232/boot_demo2/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/boot_demo2/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/boot_demo2/ewarm/Exe/boot_demo2.bin create mode 100644 boards/ek-lm4f232/boot_demo2/ewarm/Exe/boot_demo2.out create mode 100644 boards/ek-lm4f232/boot_demo2/gcc/boot_demo2.axf create mode 100644 boards/ek-lm4f232/boot_demo2/gcc/boot_demo2.bin create mode 100644 boards/ek-lm4f232/boot_demo2/readme.txt create mode 100644 boards/ek-lm4f232/boot_demo2/rvmdk/boot_demo2.axf create mode 100644 boards/ek-lm4f232/boot_demo2/rvmdk/boot_demo2.bin create mode 100644 boards/ek-lm4f232/boot_demo2/startup_ccs.c create mode 100644 boards/ek-lm4f232/boot_demo2/startup_ewarm.c create mode 100644 boards/ek-lm4f232/boot_demo2/startup_gcc.c create mode 100644 boards/ek-lm4f232/boot_demo2/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/boot_serial/Makefile create mode 100644 boards/ek-lm4f232/boot_serial/bl_config.h create mode 100644 boards/ek-lm4f232/boot_serial/boot_serial.ewd create mode 100644 boards/ek-lm4f232/boot_serial/boot_serial.ewp create mode 100644 boards/ek-lm4f232/boot_serial/boot_serial.uvopt create mode 100644 boards/ek-lm4f232/boot_serial/boot_serial.uvproj create mode 100644 boards/ek-lm4f232/boot_serial/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/boot_serial/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/boot_serial/ccs/.cproject create mode 100644 boards/ek-lm4f232/boot_serial/ccs/.project create mode 100644 boards/ek-lm4f232/boot_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/boot_serial/ccs/Debug/boot_serial.bin create mode 100644 boards/ek-lm4f232/boot_serial/ccs/Debug/boot_serial.out create mode 100644 boards/ek-lm4f232/boot_serial/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/boot_serial/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/boot_serial/ewarm/Exe/boot_serial.bin create mode 100644 boards/ek-lm4f232/boot_serial/ewarm/Exe/boot_serial.out create mode 100644 boards/ek-lm4f232/boot_serial/gcc/boot_serial.axf create mode 100644 boards/ek-lm4f232/boot_serial/gcc/boot_serial.bin create mode 100644 boards/ek-lm4f232/boot_serial/rvmdk/boot_serial.axf create mode 100644 boards/ek-lm4f232/boot_serial/rvmdk/boot_serial.bin create mode 100644 boards/ek-lm4f232/boot_usb/Makefile create mode 100644 boards/ek-lm4f232/boot_usb/bl_config.h create mode 100644 boards/ek-lm4f232/boot_usb/boot_usb.ewd create mode 100644 boards/ek-lm4f232/boot_usb/boot_usb.ewp create mode 100644 boards/ek-lm4f232/boot_usb/boot_usb.uvopt create mode 100644 boards/ek-lm4f232/boot_usb/boot_usb.uvproj create mode 100644 boards/ek-lm4f232/boot_usb/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/boot_usb/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/boot_usb/ccs/.cproject create mode 100644 boards/ek-lm4f232/boot_usb/ccs/.project create mode 100644 boards/ek-lm4f232/boot_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/boot_usb/ccs/Debug/boot_usb.bin create mode 100644 boards/ek-lm4f232/boot_usb/ccs/Debug/boot_usb.out create mode 100644 boards/ek-lm4f232/boot_usb/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/boot_usb/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/boot_usb/ewarm/Exe/boot_usb.bin create mode 100644 boards/ek-lm4f232/boot_usb/ewarm/Exe/boot_usb.out create mode 100644 boards/ek-lm4f232/boot_usb/gcc/boot_usb.axf create mode 100644 boards/ek-lm4f232/boot_usb/gcc/boot_usb.bin create mode 100644 boards/ek-lm4f232/boot_usb/rvmdk/boot_usb.axf create mode 100644 boards/ek-lm4f232/boot_usb/rvmdk/boot_usb.bin create mode 100644 boards/ek-lm4f232/drivers/buttons.c create mode 100644 boards/ek-lm4f232/drivers/buttons.h create mode 100644 boards/ek-lm4f232/drivers/cfal96x64x16.c create mode 100644 boards/ek-lm4f232/drivers/cfal96x64x16.h create mode 100644 boards/ek-lm4f232/drivers/slidemenuwidget.c create mode 100644 boards/ek-lm4f232/drivers/slidemenuwidget.h create mode 100644 boards/ek-lm4f232/drivers/stripchartwidget.c create mode 100644 boards/ek-lm4f232/drivers/stripchartwidget.h create mode 100644 boards/ek-lm4f232/drivers/usb_sound.c create mode 100644 boards/ek-lm4f232/drivers/usb_sound.h create mode 100644 boards/ek-lm4f232/ek-lm4f232.eww create mode 100644 boards/ek-lm4f232/ek-lm4f232.uvmpw create mode 100644 boards/ek-lm4f232/hello/Makefile create mode 100644 boards/ek-lm4f232/hello/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/hello/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/hello/ccs/.cproject create mode 100644 boards/ek-lm4f232/hello/ccs/.project create mode 100644 boards/ek-lm4f232/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/hello/ccs/Debug/hello.bin create mode 100644 boards/ek-lm4f232/hello/ccs/Debug/hello.out create mode 100644 boards/ek-lm4f232/hello/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/hello/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/hello/ewarm/Exe/hello.bin create mode 100644 boards/ek-lm4f232/hello/ewarm/Exe/hello.out create mode 100644 boards/ek-lm4f232/hello/gcc/hello.axf create mode 100644 boards/ek-lm4f232/hello/gcc/hello.bin create mode 100644 boards/ek-lm4f232/hello/hello.c create mode 100644 boards/ek-lm4f232/hello/hello.ewd create mode 100644 boards/ek-lm4f232/hello/hello.ewp create mode 100644 boards/ek-lm4f232/hello/hello.icf create mode 100644 boards/ek-lm4f232/hello/hello.ld create mode 100644 boards/ek-lm4f232/hello/hello.sct create mode 100644 boards/ek-lm4f232/hello/hello.uvopt create mode 100644 boards/ek-lm4f232/hello/hello.uvproj create mode 100644 boards/ek-lm4f232/hello/hello_ccs.cmd create mode 100644 boards/ek-lm4f232/hello/readme.txt create mode 100644 boards/ek-lm4f232/hello/rvmdk/hello.axf create mode 100644 boards/ek-lm4f232/hello/rvmdk/hello.bin create mode 100644 boards/ek-lm4f232/hello/startup_ccs.c create mode 100644 boards/ek-lm4f232/hello/startup_ewarm.c create mode 100644 boards/ek-lm4f232/hello/startup_gcc.c create mode 100644 boards/ek-lm4f232/hello/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/hibernate/Makefile create mode 100644 boards/ek-lm4f232/hibernate/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/hibernate/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/hibernate/ccs/.cproject create mode 100644 boards/ek-lm4f232/hibernate/ccs/.project create mode 100644 boards/ek-lm4f232/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/hibernate/ccs/Debug/hibernate.bin create mode 100644 boards/ek-lm4f232/hibernate/ccs/Debug/hibernate.out create mode 100644 boards/ek-lm4f232/hibernate/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/hibernate/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/hibernate/ewarm/Exe/hibernate.bin create mode 100644 boards/ek-lm4f232/hibernate/ewarm/Exe/hibernate.out create mode 100644 boards/ek-lm4f232/hibernate/gcc/hibernate.axf create mode 100644 boards/ek-lm4f232/hibernate/gcc/hibernate.bin create mode 100644 boards/ek-lm4f232/hibernate/hibernate.c create mode 100644 boards/ek-lm4f232/hibernate/hibernate.ewd create mode 100644 boards/ek-lm4f232/hibernate/hibernate.ewp create mode 100644 boards/ek-lm4f232/hibernate/hibernate.icf create mode 100644 boards/ek-lm4f232/hibernate/hibernate.ld create mode 100644 boards/ek-lm4f232/hibernate/hibernate.sct create mode 100644 boards/ek-lm4f232/hibernate/hibernate.uvopt create mode 100644 boards/ek-lm4f232/hibernate/hibernate.uvproj create mode 100644 boards/ek-lm4f232/hibernate/hibernate_ccs.cmd create mode 100644 boards/ek-lm4f232/hibernate/readme.txt create mode 100644 boards/ek-lm4f232/hibernate/rvmdk/hibernate.axf create mode 100644 boards/ek-lm4f232/hibernate/rvmdk/hibernate.bin create mode 100644 boards/ek-lm4f232/hibernate/startup_ccs.c create mode 100644 boards/ek-lm4f232/hibernate/startup_ewarm.c create mode 100644 boards/ek-lm4f232/hibernate/startup_gcc.c create mode 100644 boards/ek-lm4f232/hibernate/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/interrupts/Makefile create mode 100644 boards/ek-lm4f232/interrupts/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/interrupts/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/interrupts/ccs/.cproject create mode 100644 boards/ek-lm4f232/interrupts/ccs/.project create mode 100644 boards/ek-lm4f232/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/interrupts/ccs/Debug/interrupts.bin create mode 100644 boards/ek-lm4f232/interrupts/ccs/Debug/interrupts.out create mode 100644 boards/ek-lm4f232/interrupts/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/interrupts/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/interrupts/ewarm/Exe/interrupts.bin create mode 100644 boards/ek-lm4f232/interrupts/ewarm/Exe/interrupts.out create mode 100644 boards/ek-lm4f232/interrupts/gcc/interrupts.axf create mode 100644 boards/ek-lm4f232/interrupts/gcc/interrupts.bin create mode 100644 boards/ek-lm4f232/interrupts/interrupts.c create mode 100644 boards/ek-lm4f232/interrupts/interrupts.ewd create mode 100644 boards/ek-lm4f232/interrupts/interrupts.ewp create mode 100644 boards/ek-lm4f232/interrupts/interrupts.icf create mode 100644 boards/ek-lm4f232/interrupts/interrupts.ld create mode 100644 boards/ek-lm4f232/interrupts/interrupts.sct create mode 100644 boards/ek-lm4f232/interrupts/interrupts.uvopt create mode 100644 boards/ek-lm4f232/interrupts/interrupts.uvproj create mode 100644 boards/ek-lm4f232/interrupts/interrupts_ccs.cmd create mode 100644 boards/ek-lm4f232/interrupts/readme.txt create mode 100644 boards/ek-lm4f232/interrupts/rvmdk/interrupts.axf create mode 100644 boards/ek-lm4f232/interrupts/rvmdk/interrupts.bin create mode 100644 boards/ek-lm4f232/interrupts/startup_ccs.c create mode 100644 boards/ek-lm4f232/interrupts/startup_ewarm.c create mode 100644 boards/ek-lm4f232/interrupts/startup_gcc.c create mode 100644 boards/ek-lm4f232/interrupts/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/mpu_fault/Makefile create mode 100644 boards/ek-lm4f232/mpu_fault/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/mpu_fault/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/mpu_fault/ccs/.cproject create mode 100644 boards/ek-lm4f232/mpu_fault/ccs/.project create mode 100644 boards/ek-lm4f232/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/mpu_fault/ccs/Debug/mpu_fault.bin create mode 100644 boards/ek-lm4f232/mpu_fault/ccs/Debug/mpu_fault.out create mode 100644 boards/ek-lm4f232/mpu_fault/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/mpu_fault/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/mpu_fault/ewarm/Exe/mpu_fault.bin create mode 100644 boards/ek-lm4f232/mpu_fault/ewarm/Exe/mpu_fault.out create mode 100644 boards/ek-lm4f232/mpu_fault/gcc/mpu_fault.axf create mode 100644 boards/ek-lm4f232/mpu_fault/gcc/mpu_fault.bin create mode 100644 boards/ek-lm4f232/mpu_fault/mpu_fault.c create mode 100644 boards/ek-lm4f232/mpu_fault/mpu_fault.ewd create mode 100644 boards/ek-lm4f232/mpu_fault/mpu_fault.ewp create mode 100644 boards/ek-lm4f232/mpu_fault/mpu_fault.icf create mode 100644 boards/ek-lm4f232/mpu_fault/mpu_fault.ld create mode 100644 boards/ek-lm4f232/mpu_fault/mpu_fault.sct create mode 100644 boards/ek-lm4f232/mpu_fault/mpu_fault.uvopt create mode 100644 boards/ek-lm4f232/mpu_fault/mpu_fault.uvproj create mode 100644 boards/ek-lm4f232/mpu_fault/mpu_fault_ccs.cmd create mode 100644 boards/ek-lm4f232/mpu_fault/readme.txt create mode 100644 boards/ek-lm4f232/mpu_fault/rvmdk/mpu_fault.axf create mode 100644 boards/ek-lm4f232/mpu_fault/rvmdk/mpu_fault.bin create mode 100644 boards/ek-lm4f232/mpu_fault/startup_ccs.c create mode 100644 boards/ek-lm4f232/mpu_fault/startup_ewarm.c create mode 100644 boards/ek-lm4f232/mpu_fault/startup_gcc.c create mode 100644 boards/ek-lm4f232/mpu_fault/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/qs-logger/Makefile create mode 100644 boards/ek-lm4f232/qs-logger/acquire.c create mode 100644 boards/ek-lm4f232/qs-logger/acquire.h create mode 100644 boards/ek-lm4f232/qs-logger/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/qs-logger/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/qs-logger/ccs/.cproject create mode 100644 boards/ek-lm4f232/qs-logger/ccs/.project create mode 100644 boards/ek-lm4f232/qs-logger/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/qs-logger/ccs/Debug/qs-logger.bin create mode 100644 boards/ek-lm4f232/qs-logger/ccs/Debug/qs-logger.out create mode 100644 boards/ek-lm4f232/qs-logger/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/qs-logger/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/qs-logger/clocksetwidget.c create mode 100644 boards/ek-lm4f232/qs-logger/clocksetwidget.h create mode 100644 boards/ek-lm4f232/qs-logger/ewarm/Exe/qs-logger.bin create mode 100644 boards/ek-lm4f232/qs-logger/ewarm/Exe/qs-logger.out create mode 100644 boards/ek-lm4f232/qs-logger/flashstore.c create mode 100644 boards/ek-lm4f232/qs-logger/flashstore.h create mode 100644 boards/ek-lm4f232/qs-logger/gcc/qs-logger.axf create mode 100644 boards/ek-lm4f232/qs-logger/gcc/qs-logger.bin create mode 100644 boards/ek-lm4f232/qs-logger/images.c create mode 100644 boards/ek-lm4f232/qs-logger/images.h create mode 100644 boards/ek-lm4f232/qs-logger/menus.c create mode 100644 boards/ek-lm4f232/qs-logger/menus.h create mode 100644 boards/ek-lm4f232/qs-logger/qs-logger.c create mode 100644 boards/ek-lm4f232/qs-logger/qs-logger.ewd create mode 100644 boards/ek-lm4f232/qs-logger/qs-logger.ewp create mode 100644 boards/ek-lm4f232/qs-logger/qs-logger.h create mode 100644 boards/ek-lm4f232/qs-logger/qs-logger.icf create mode 100644 boards/ek-lm4f232/qs-logger/qs-logger.ld create mode 100644 boards/ek-lm4f232/qs-logger/qs-logger.sct create mode 100644 boards/ek-lm4f232/qs-logger/qs-logger.uvopt create mode 100644 boards/ek-lm4f232/qs-logger/qs-logger.uvproj create mode 100644 boards/ek-lm4f232/qs-logger/qs-logger_ccs.cmd create mode 100644 boards/ek-lm4f232/qs-logger/readme.txt create mode 100644 boards/ek-lm4f232/qs-logger/rvmdk/qs-logger.axf create mode 100644 boards/ek-lm4f232/qs-logger/rvmdk/qs-logger.bin create mode 100644 boards/ek-lm4f232/qs-logger/startup_ccs.c create mode 100644 boards/ek-lm4f232/qs-logger/startup_ewarm.c create mode 100644 boards/ek-lm4f232/qs-logger/startup_gcc.c create mode 100644 boards/ek-lm4f232/qs-logger/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/qs-logger/stripchartmanager.c create mode 100644 boards/ek-lm4f232/qs-logger/stripchartmanager.h create mode 100644 boards/ek-lm4f232/qs-logger/usb_serial_structs.c create mode 100644 boards/ek-lm4f232/qs-logger/usb_serial_structs.h create mode 100644 boards/ek-lm4f232/qs-logger/usbserial.c create mode 100644 boards/ek-lm4f232/qs-logger/usbserial.h create mode 100644 boards/ek-lm4f232/qs-logger/usbstick.c create mode 100644 boards/ek-lm4f232/qs-logger/usbstick.h create mode 100644 boards/ek-lm4f232/sd_card/Makefile create mode 100644 boards/ek-lm4f232/sd_card/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/sd_card/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/sd_card/ccs/.cproject create mode 100644 boards/ek-lm4f232/sd_card/ccs/.project create mode 100644 boards/ek-lm4f232/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/sd_card/ccs/Debug/sd_card.bin create mode 100644 boards/ek-lm4f232/sd_card/ccs/Debug/sd_card.out create mode 100644 boards/ek-lm4f232/sd_card/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/sd_card/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/sd_card/ewarm/Exe/sd_card.bin create mode 100644 boards/ek-lm4f232/sd_card/ewarm/Exe/sd_card.out create mode 100644 boards/ek-lm4f232/sd_card/gcc/sd_card.axf create mode 100644 boards/ek-lm4f232/sd_card/gcc/sd_card.bin create mode 100644 boards/ek-lm4f232/sd_card/readme.txt create mode 100644 boards/ek-lm4f232/sd_card/rvmdk/sd_card.axf create mode 100644 boards/ek-lm4f232/sd_card/rvmdk/sd_card.bin create mode 100644 boards/ek-lm4f232/sd_card/sd_card.c create mode 100644 boards/ek-lm4f232/sd_card/sd_card.ewd create mode 100644 boards/ek-lm4f232/sd_card/sd_card.ewp create mode 100644 boards/ek-lm4f232/sd_card/sd_card.icf create mode 100644 boards/ek-lm4f232/sd_card/sd_card.ld create mode 100644 boards/ek-lm4f232/sd_card/sd_card.sct create mode 100644 boards/ek-lm4f232/sd_card/sd_card.uvopt create mode 100644 boards/ek-lm4f232/sd_card/sd_card.uvproj create mode 100644 boards/ek-lm4f232/sd_card/sd_card_ccs.cmd create mode 100644 boards/ek-lm4f232/sd_card/startup_ccs.c create mode 100644 boards/ek-lm4f232/sd_card/startup_ewarm.c create mode 100644 boards/ek-lm4f232/sd_card/startup_gcc.c create mode 100644 boards/ek-lm4f232/sd_card/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/sine_demo/Makefile create mode 100644 boards/ek-lm4f232/sine_demo/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/sine_demo/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/sine_demo/ccs/.cproject create mode 100644 boards/ek-lm4f232/sine_demo/ccs/.project create mode 100644 boards/ek-lm4f232/sine_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/sine_demo/ccs/Debug/sine_demo.bin create mode 100644 boards/ek-lm4f232/sine_demo/ccs/Debug/sine_demo.out create mode 100644 boards/ek-lm4f232/sine_demo/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/sine_demo/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/sine_demo/ewarm/Exe/sine_demo.bin create mode 100644 boards/ek-lm4f232/sine_demo/ewarm/Exe/sine_demo.out create mode 100644 boards/ek-lm4f232/sine_demo/gcc/sine_demo.axf create mode 100644 boards/ek-lm4f232/sine_demo/gcc/sine_demo.bin create mode 100644 boards/ek-lm4f232/sine_demo/readme.txt create mode 100644 boards/ek-lm4f232/sine_demo/rvmdk/sine_demo.axf create mode 100644 boards/ek-lm4f232/sine_demo/rvmdk/sine_demo.bin create mode 100644 boards/ek-lm4f232/sine_demo/sine_demo.c create mode 100644 boards/ek-lm4f232/sine_demo/sine_demo.ewd create mode 100644 boards/ek-lm4f232/sine_demo/sine_demo.ewp create mode 100644 boards/ek-lm4f232/sine_demo/sine_demo.icf create mode 100644 boards/ek-lm4f232/sine_demo/sine_demo.ld create mode 100644 boards/ek-lm4f232/sine_demo/sine_demo.sct create mode 100644 boards/ek-lm4f232/sine_demo/sine_demo.uvopt create mode 100644 boards/ek-lm4f232/sine_demo/sine_demo.uvproj create mode 100644 boards/ek-lm4f232/sine_demo/sine_demo_ccs.cmd create mode 100644 boards/ek-lm4f232/sine_demo/startup_ccs.c create mode 100644 boards/ek-lm4f232/sine_demo/startup_ewarm.c create mode 100644 boards/ek-lm4f232/sine_demo/startup_gcc.c create mode 100644 boards/ek-lm4f232/sine_demo/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/softuart_echo/Makefile create mode 100644 boards/ek-lm4f232/softuart_echo/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/softuart_echo/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/softuart_echo/ccs/.cproject create mode 100644 boards/ek-lm4f232/softuart_echo/ccs/.project create mode 100644 boards/ek-lm4f232/softuart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/softuart_echo/ccs/Debug/softuart_echo.bin create mode 100644 boards/ek-lm4f232/softuart_echo/ccs/Debug/softuart_echo.out create mode 100644 boards/ek-lm4f232/softuart_echo/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/softuart_echo/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/softuart_echo/ewarm/Exe/softuart_echo.bin create mode 100644 boards/ek-lm4f232/softuart_echo/ewarm/Exe/softuart_echo.out create mode 100644 boards/ek-lm4f232/softuart_echo/gcc/softuart_echo.axf create mode 100644 boards/ek-lm4f232/softuart_echo/gcc/softuart_echo.bin create mode 100644 boards/ek-lm4f232/softuart_echo/readme.txt create mode 100644 boards/ek-lm4f232/softuart_echo/rvmdk/softuart_echo.axf create mode 100644 boards/ek-lm4f232/softuart_echo/rvmdk/softuart_echo.bin create mode 100644 boards/ek-lm4f232/softuart_echo/softuart_echo.c create mode 100644 boards/ek-lm4f232/softuart_echo/softuart_echo.ewd create mode 100644 boards/ek-lm4f232/softuart_echo/softuart_echo.ewp create mode 100644 boards/ek-lm4f232/softuart_echo/softuart_echo.icf create mode 100644 boards/ek-lm4f232/softuart_echo/softuart_echo.ld create mode 100644 boards/ek-lm4f232/softuart_echo/softuart_echo.sct create mode 100644 boards/ek-lm4f232/softuart_echo/softuart_echo.uvopt create mode 100644 boards/ek-lm4f232/softuart_echo/softuart_echo.uvproj create mode 100644 boards/ek-lm4f232/softuart_echo/softuart_echo_ccs.cmd create mode 100644 boards/ek-lm4f232/softuart_echo/startup_ccs.c create mode 100644 boards/ek-lm4f232/softuart_echo/startup_ewarm.c create mode 100644 boards/ek-lm4f232/softuart_echo/startup_gcc.c create mode 100644 boards/ek-lm4f232/softuart_echo/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/timers/Makefile create mode 100644 boards/ek-lm4f232/timers/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/timers/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/timers/ccs/.cproject create mode 100644 boards/ek-lm4f232/timers/ccs/.project create mode 100644 boards/ek-lm4f232/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/timers/ccs/Debug/timers.bin create mode 100644 boards/ek-lm4f232/timers/ccs/Debug/timers.out create mode 100644 boards/ek-lm4f232/timers/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/timers/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/timers/ewarm/Exe/timers.bin create mode 100644 boards/ek-lm4f232/timers/ewarm/Exe/timers.out create mode 100644 boards/ek-lm4f232/timers/gcc/timers.axf create mode 100644 boards/ek-lm4f232/timers/gcc/timers.bin create mode 100644 boards/ek-lm4f232/timers/readme.txt create mode 100644 boards/ek-lm4f232/timers/rvmdk/timers.axf create mode 100644 boards/ek-lm4f232/timers/rvmdk/timers.bin create mode 100644 boards/ek-lm4f232/timers/startup_ccs.c create mode 100644 boards/ek-lm4f232/timers/startup_ewarm.c create mode 100644 boards/ek-lm4f232/timers/startup_gcc.c create mode 100644 boards/ek-lm4f232/timers/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/timers/timers.c create mode 100644 boards/ek-lm4f232/timers/timers.ewd create mode 100644 boards/ek-lm4f232/timers/timers.ewp create mode 100644 boards/ek-lm4f232/timers/timers.icf create mode 100644 boards/ek-lm4f232/timers/timers.ld create mode 100644 boards/ek-lm4f232/timers/timers.sct create mode 100644 boards/ek-lm4f232/timers/timers.uvopt create mode 100644 boards/ek-lm4f232/timers/timers.uvproj create mode 100644 boards/ek-lm4f232/timers/timers_ccs.cmd create mode 100644 boards/ek-lm4f232/uart_echo/Makefile create mode 100644 boards/ek-lm4f232/uart_echo/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/uart_echo/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/uart_echo/ccs/.cproject create mode 100644 boards/ek-lm4f232/uart_echo/ccs/.project create mode 100644 boards/ek-lm4f232/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/uart_echo/ccs/Debug/uart_echo.bin create mode 100644 boards/ek-lm4f232/uart_echo/ccs/Debug/uart_echo.out create mode 100644 boards/ek-lm4f232/uart_echo/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/uart_echo/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/uart_echo/ewarm/Exe/uart_echo.bin create mode 100644 boards/ek-lm4f232/uart_echo/ewarm/Exe/uart_echo.out create mode 100644 boards/ek-lm4f232/uart_echo/gcc/uart_echo.axf create mode 100644 boards/ek-lm4f232/uart_echo/gcc/uart_echo.bin create mode 100644 boards/ek-lm4f232/uart_echo/readme.txt create mode 100644 boards/ek-lm4f232/uart_echo/rvmdk/uart_echo.axf create mode 100644 boards/ek-lm4f232/uart_echo/rvmdk/uart_echo.bin create mode 100644 boards/ek-lm4f232/uart_echo/startup_ccs.c create mode 100644 boards/ek-lm4f232/uart_echo/startup_ewarm.c create mode 100644 boards/ek-lm4f232/uart_echo/startup_gcc.c create mode 100644 boards/ek-lm4f232/uart_echo/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/uart_echo/uart_echo.c create mode 100644 boards/ek-lm4f232/uart_echo/uart_echo.ewd create mode 100644 boards/ek-lm4f232/uart_echo/uart_echo.ewp create mode 100644 boards/ek-lm4f232/uart_echo/uart_echo.icf create mode 100644 boards/ek-lm4f232/uart_echo/uart_echo.ld create mode 100644 boards/ek-lm4f232/uart_echo/uart_echo.sct create mode 100644 boards/ek-lm4f232/uart_echo/uart_echo.uvopt create mode 100644 boards/ek-lm4f232/uart_echo/uart_echo.uvproj create mode 100644 boards/ek-lm4f232/uart_echo/uart_echo_ccs.cmd create mode 100644 boards/ek-lm4f232/udma_demo/Makefile create mode 100644 boards/ek-lm4f232/udma_demo/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/udma_demo/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/udma_demo/ccs/.cproject create mode 100644 boards/ek-lm4f232/udma_demo/ccs/.project create mode 100644 boards/ek-lm4f232/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/udma_demo/ccs/Debug/udma_demo.bin create mode 100644 boards/ek-lm4f232/udma_demo/ccs/Debug/udma_demo.out create mode 100644 boards/ek-lm4f232/udma_demo/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/udma_demo/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/udma_demo/ewarm/Exe/udma_demo.bin create mode 100644 boards/ek-lm4f232/udma_demo/ewarm/Exe/udma_demo.out create mode 100644 boards/ek-lm4f232/udma_demo/gcc/udma_demo.axf create mode 100644 boards/ek-lm4f232/udma_demo/gcc/udma_demo.bin create mode 100644 boards/ek-lm4f232/udma_demo/readme.txt create mode 100644 boards/ek-lm4f232/udma_demo/rvmdk/udma_demo.axf create mode 100644 boards/ek-lm4f232/udma_demo/rvmdk/udma_demo.bin create mode 100644 boards/ek-lm4f232/udma_demo/startup_ccs.c create mode 100644 boards/ek-lm4f232/udma_demo/startup_ewarm.c create mode 100644 boards/ek-lm4f232/udma_demo/startup_gcc.c create mode 100644 boards/ek-lm4f232/udma_demo/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/udma_demo/udma_demo.c create mode 100644 boards/ek-lm4f232/udma_demo/udma_demo.ewd create mode 100644 boards/ek-lm4f232/udma_demo/udma_demo.ewp create mode 100644 boards/ek-lm4f232/udma_demo/udma_demo.icf create mode 100644 boards/ek-lm4f232/udma_demo/udma_demo.ld create mode 100644 boards/ek-lm4f232/udma_demo/udma_demo.sct create mode 100644 boards/ek-lm4f232/udma_demo/udma_demo.uvopt create mode 100644 boards/ek-lm4f232/udma_demo/udma_demo.uvproj create mode 100644 boards/ek-lm4f232/udma_demo/udma_demo_ccs.cmd create mode 100644 boards/ek-lm4f232/usb_dev_bulk/Makefile create mode 100644 boards/ek-lm4f232/usb_dev_bulk/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/usb_dev_bulk/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/usb_dev_bulk/ccs/.cproject create mode 100644 boards/ek-lm4f232/usb_dev_bulk/ccs/.project create mode 100644 boards/ek-lm4f232/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin create mode 100644 boards/ek-lm4f232/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out create mode 100644 boards/ek-lm4f232/usb_dev_bulk/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/usb_dev_bulk/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin create mode 100644 boards/ek-lm4f232/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out create mode 100644 boards/ek-lm4f232/usb_dev_bulk/gcc/usb_dev_bulk.axf create mode 100644 boards/ek-lm4f232/usb_dev_bulk/gcc/usb_dev_bulk.bin create mode 100644 boards/ek-lm4f232/usb_dev_bulk/readme.txt create mode 100644 boards/ek-lm4f232/usb_dev_bulk/rvmdk/usb_dev_bulk.axf create mode 100644 boards/ek-lm4f232/usb_dev_bulk/rvmdk/usb_dev_bulk.bin create mode 100644 boards/ek-lm4f232/usb_dev_bulk/startup_ccs.c create mode 100644 boards/ek-lm4f232/usb_dev_bulk/startup_ewarm.c create mode 100644 boards/ek-lm4f232/usb_dev_bulk/startup_gcc.c create mode 100644 boards/ek-lm4f232/usb_dev_bulk/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/usb_dev_bulk/usb_bulk_structs.c create mode 100644 boards/ek-lm4f232/usb_dev_bulk/usb_bulk_structs.h create mode 100644 boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.c create mode 100644 boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ewd create mode 100644 boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ewp create mode 100644 boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.icf create mode 100644 boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ld create mode 100644 boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.sct create mode 100644 boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.uvopt create mode 100644 boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.uvproj create mode 100644 boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk_ccs.cmd create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/Makefile create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/ccs/.cproject create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/ccs/.project create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/gcc/usb_dev_keyboard.axf create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/gcc/usb_dev_keyboard.bin create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/readme.txt create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/startup_ccs.c create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/startup_ewarm.c create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/startup_gcc.c create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.c create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ewd create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ewp create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.icf create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ld create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.sct create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.uvopt create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.uvproj create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/usb_keyb_structs.c create mode 100644 boards/ek-lm4f232/usb_dev_keyboard/usb_keyb_structs.h create mode 100644 boards/ek-lm4f232/usb_dev_msc/Makefile create mode 100644 boards/ek-lm4f232/usb_dev_msc/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/usb_dev_msc/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/usb_dev_msc/ccs/.cproject create mode 100644 boards/ek-lm4f232/usb_dev_msc/ccs/.project create mode 100644 boards/ek-lm4f232/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/usb_dev_msc/ccs/Debug/usb_dev_msc.bin create mode 100644 boards/ek-lm4f232/usb_dev_msc/ccs/Debug/usb_dev_msc.out create mode 100644 boards/ek-lm4f232/usb_dev_msc/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/usb_dev_msc/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin create mode 100644 boards/ek-lm4f232/usb_dev_msc/ewarm/Exe/usb_dev_msc.out create mode 100644 boards/ek-lm4f232/usb_dev_msc/gcc/usb_dev_msc.axf create mode 100644 boards/ek-lm4f232/usb_dev_msc/gcc/usb_dev_msc.bin create mode 100644 boards/ek-lm4f232/usb_dev_msc/readme.txt create mode 100644 boards/ek-lm4f232/usb_dev_msc/rvmdk/usb_dev_msc.axf create mode 100644 boards/ek-lm4f232/usb_dev_msc/rvmdk/usb_dev_msc.bin create mode 100644 boards/ek-lm4f232/usb_dev_msc/startup_ccs.c create mode 100644 boards/ek-lm4f232/usb_dev_msc/startup_ewarm.c create mode 100644 boards/ek-lm4f232/usb_dev_msc/startup_gcc.c create mode 100644 boards/ek-lm4f232/usb_dev_msc/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.c create mode 100644 boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ewd create mode 100644 boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ewp create mode 100644 boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.icf create mode 100644 boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ld create mode 100644 boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.sct create mode 100644 boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.uvopt create mode 100644 boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.uvproj create mode 100644 boards/ek-lm4f232/usb_dev_msc/usb_dev_msc_ccs.cmd create mode 100644 boards/ek-lm4f232/usb_dev_msc/usb_msc_structs.c create mode 100644 boards/ek-lm4f232/usb_dev_msc/usb_msc_structs.h create mode 100644 boards/ek-lm4f232/usb_dev_msc/usbdsdcard.c create mode 100644 boards/ek-lm4f232/usb_dev_msc/usbdsdcard.h create mode 100644 boards/ek-lm4f232/usb_dev_serial/Makefile create mode 100644 boards/ek-lm4f232/usb_dev_serial/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/usb_dev_serial/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/usb_dev_serial/ccs/.cproject create mode 100644 boards/ek-lm4f232/usb_dev_serial/ccs/.project create mode 100644 boards/ek-lm4f232/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/usb_dev_serial/ccs/Debug/usb_dev_serial.bin create mode 100644 boards/ek-lm4f232/usb_dev_serial/ccs/Debug/usb_dev_serial.out create mode 100644 boards/ek-lm4f232/usb_dev_serial/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/usb_dev_serial/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin create mode 100644 boards/ek-lm4f232/usb_dev_serial/ewarm/Exe/usb_dev_serial.out create mode 100644 boards/ek-lm4f232/usb_dev_serial/gcc/usb_dev_serial.axf create mode 100644 boards/ek-lm4f232/usb_dev_serial/gcc/usb_dev_serial.bin create mode 100644 boards/ek-lm4f232/usb_dev_serial/readme.txt create mode 100644 boards/ek-lm4f232/usb_dev_serial/rvmdk/usb_dev_serial.axf create mode 100644 boards/ek-lm4f232/usb_dev_serial/rvmdk/usb_dev_serial.bin create mode 100644 boards/ek-lm4f232/usb_dev_serial/startup_ccs.c create mode 100644 boards/ek-lm4f232/usb_dev_serial/startup_ewarm.c create mode 100644 boards/ek-lm4f232/usb_dev_serial/startup_gcc.c create mode 100644 boards/ek-lm4f232/usb_dev_serial/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.c create mode 100644 boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ewd create mode 100644 boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ewp create mode 100644 boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.icf create mode 100644 boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ld create mode 100644 boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.sct create mode 100644 boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.uvopt create mode 100644 boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.uvproj create mode 100644 boards/ek-lm4f232/usb_dev_serial/usb_dev_serial_ccs.cmd create mode 100644 boards/ek-lm4f232/usb_dev_serial/usb_serial_structs.c create mode 100644 boards/ek-lm4f232/usb_dev_serial/usb_serial_structs.h create mode 100644 boards/ek-lm4f232/usb_host_audio/Makefile create mode 100644 boards/ek-lm4f232/usb_host_audio/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/usb_host_audio/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/usb_host_audio/ccs/.cproject create mode 100644 boards/ek-lm4f232/usb_host_audio/ccs/.project create mode 100644 boards/ek-lm4f232/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/usb_host_audio/ccs/Debug/usb_host_audio.bin create mode 100644 boards/ek-lm4f232/usb_host_audio/ccs/Debug/usb_host_audio.out create mode 100644 boards/ek-lm4f232/usb_host_audio/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/usb_host_audio/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/usb_host_audio/ewarm/Exe/usb_host_audio.bin create mode 100644 boards/ek-lm4f232/usb_host_audio/ewarm/Exe/usb_host_audio.out create mode 100644 boards/ek-lm4f232/usb_host_audio/gcc/usb_host_audio.axf create mode 100644 boards/ek-lm4f232/usb_host_audio/gcc/usb_host_audio.bin create mode 100644 boards/ek-lm4f232/usb_host_audio/readme.txt create mode 100644 boards/ek-lm4f232/usb_host_audio/rvmdk/usb_host_audio.axf create mode 100644 boards/ek-lm4f232/usb_host_audio/rvmdk/usb_host_audio.bin create mode 100644 boards/ek-lm4f232/usb_host_audio/startup_ccs.c create mode 100644 boards/ek-lm4f232/usb_host_audio/startup_ewarm.c create mode 100644 boards/ek-lm4f232/usb_host_audio/startup_gcc.c create mode 100644 boards/ek-lm4f232/usb_host_audio/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/usb_host_audio/usb_host_audio.c create mode 100644 boards/ek-lm4f232/usb_host_audio/usb_host_audio.ewd create mode 100644 boards/ek-lm4f232/usb_host_audio/usb_host_audio.ewp create mode 100644 boards/ek-lm4f232/usb_host_audio/usb_host_audio.icf create mode 100644 boards/ek-lm4f232/usb_host_audio/usb_host_audio.ld create mode 100644 boards/ek-lm4f232/usb_host_audio/usb_host_audio.sct create mode 100644 boards/ek-lm4f232/usb_host_audio/usb_host_audio.uvopt create mode 100644 boards/ek-lm4f232/usb_host_audio/usb_host_audio.uvproj create mode 100644 boards/ek-lm4f232/usb_host_audio/usb_host_audio_ccs.cmd create mode 100644 boards/ek-lm4f232/usb_host_keyboard/Makefile create mode 100644 boards/ek-lm4f232/usb_host_keyboard/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/usb_host_keyboard/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/usb_host_keyboard/ccs/.cproject create mode 100644 boards/ek-lm4f232/usb_host_keyboard/ccs/.project create mode 100644 boards/ek-lm4f232/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin create mode 100644 boards/ek-lm4f232/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out create mode 100644 boards/ek-lm4f232/usb_host_keyboard/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/usb_host_keyboard/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin create mode 100644 boards/ek-lm4f232/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out create mode 100644 boards/ek-lm4f232/usb_host_keyboard/gcc/usb_host_keyboard.axf create mode 100644 boards/ek-lm4f232/usb_host_keyboard/gcc/usb_host_keyboard.bin create mode 100644 boards/ek-lm4f232/usb_host_keyboard/readme.txt create mode 100644 boards/ek-lm4f232/usb_host_keyboard/rvmdk/usb_host_keyboard.axf create mode 100644 boards/ek-lm4f232/usb_host_keyboard/rvmdk/usb_host_keyboard.bin create mode 100644 boards/ek-lm4f232/usb_host_keyboard/startup_ccs.c create mode 100644 boards/ek-lm4f232/usb_host_keyboard/startup_ewarm.c create mode 100644 boards/ek-lm4f232/usb_host_keyboard/startup_gcc.c create mode 100644 boards/ek-lm4f232/usb_host_keyboard/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.c create mode 100644 boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ewd create mode 100644 boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ewp create mode 100644 boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.icf create mode 100644 boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ld create mode 100644 boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.sct create mode 100644 boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.uvopt create mode 100644 boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.uvproj create mode 100644 boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard_ccs.cmd create mode 100644 boards/ek-lm4f232/usb_host_mouse/Makefile create mode 100644 boards/ek-lm4f232/usb_host_mouse/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/usb_host_mouse/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/usb_host_mouse/ccs/.cproject create mode 100644 boards/ek-lm4f232/usb_host_mouse/ccs/.project create mode 100644 boards/ek-lm4f232/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/usb_host_mouse/ccs/Debug/usb_host_mouse.bin create mode 100644 boards/ek-lm4f232/usb_host_mouse/ccs/Debug/usb_host_mouse.out create mode 100644 boards/ek-lm4f232/usb_host_mouse/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/usb_host_mouse/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin create mode 100644 boards/ek-lm4f232/usb_host_mouse/ewarm/Exe/usb_host_mouse.out create mode 100644 boards/ek-lm4f232/usb_host_mouse/gcc/usb_host_mouse.axf create mode 100644 boards/ek-lm4f232/usb_host_mouse/gcc/usb_host_mouse.bin create mode 100644 boards/ek-lm4f232/usb_host_mouse/readme.txt create mode 100644 boards/ek-lm4f232/usb_host_mouse/rvmdk/usb_host_mouse.axf create mode 100644 boards/ek-lm4f232/usb_host_mouse/rvmdk/usb_host_mouse.bin create mode 100644 boards/ek-lm4f232/usb_host_mouse/startup_ccs.c create mode 100644 boards/ek-lm4f232/usb_host_mouse/startup_ewarm.c create mode 100644 boards/ek-lm4f232/usb_host_mouse/startup_gcc.c create mode 100644 boards/ek-lm4f232/usb_host_mouse/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.c create mode 100644 boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ewd create mode 100644 boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ewp create mode 100644 boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.icf create mode 100644 boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ld create mode 100644 boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.sct create mode 100644 boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.uvopt create mode 100644 boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.uvproj create mode 100644 boards/ek-lm4f232/usb_host_mouse/usb_host_mouse_ccs.cmd create mode 100644 boards/ek-lm4f232/usb_host_msc/Makefile create mode 100644 boards/ek-lm4f232/usb_host_msc/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/usb_host_msc/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/usb_host_msc/ccs/.cproject create mode 100644 boards/ek-lm4f232/usb_host_msc/ccs/.project create mode 100644 boards/ek-lm4f232/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/usb_host_msc/ccs/Debug/usb_host_msc.bin create mode 100644 boards/ek-lm4f232/usb_host_msc/ccs/Debug/usb_host_msc.out create mode 100644 boards/ek-lm4f232/usb_host_msc/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/usb_host_msc/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/usb_host_msc/ewarm/Exe/usb_host_msc.bin create mode 100644 boards/ek-lm4f232/usb_host_msc/ewarm/Exe/usb_host_msc.out create mode 100644 boards/ek-lm4f232/usb_host_msc/gcc/usb_host_msc.axf create mode 100644 boards/ek-lm4f232/usb_host_msc/gcc/usb_host_msc.bin create mode 100644 boards/ek-lm4f232/usb_host_msc/readme.txt create mode 100644 boards/ek-lm4f232/usb_host_msc/rvmdk/usb_host_msc.axf create mode 100644 boards/ek-lm4f232/usb_host_msc/rvmdk/usb_host_msc.bin create mode 100644 boards/ek-lm4f232/usb_host_msc/startup_ccs.c create mode 100644 boards/ek-lm4f232/usb_host_msc/startup_ewarm.c create mode 100644 boards/ek-lm4f232/usb_host_msc/startup_gcc.c create mode 100644 boards/ek-lm4f232/usb_host_msc/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/usb_host_msc/usb_host_msc.c create mode 100644 boards/ek-lm4f232/usb_host_msc/usb_host_msc.ewd create mode 100644 boards/ek-lm4f232/usb_host_msc/usb_host_msc.ewp create mode 100644 boards/ek-lm4f232/usb_host_msc/usb_host_msc.icf create mode 100644 boards/ek-lm4f232/usb_host_msc/usb_host_msc.ld create mode 100644 boards/ek-lm4f232/usb_host_msc/usb_host_msc.sct create mode 100644 boards/ek-lm4f232/usb_host_msc/usb_host_msc.uvopt create mode 100644 boards/ek-lm4f232/usb_host_msc/usb_host_msc.uvproj create mode 100644 boards/ek-lm4f232/usb_host_msc/usb_host_msc_ccs.cmd create mode 100644 boards/ek-lm4f232/usb_stick_demo/Makefile create mode 100644 boards/ek-lm4f232/usb_stick_demo/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/usb_stick_demo/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/usb_stick_demo/ccs/.cproject create mode 100644 boards/ek-lm4f232/usb_stick_demo/ccs/.project create mode 100644 boards/ek-lm4f232/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/usb_stick_demo/ccs/Debug/usb_stick_demo.bin create mode 100644 boards/ek-lm4f232/usb_stick_demo/ccs/Debug/usb_stick_demo.out create mode 100644 boards/ek-lm4f232/usb_stick_demo/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/usb_stick_demo/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin create mode 100644 boards/ek-lm4f232/usb_stick_demo/ewarm/Exe/usb_stick_demo.out create mode 100644 boards/ek-lm4f232/usb_stick_demo/gcc/usb_stick_demo.axf create mode 100644 boards/ek-lm4f232/usb_stick_demo/gcc/usb_stick_demo.bin create mode 100644 boards/ek-lm4f232/usb_stick_demo/readme.txt create mode 100644 boards/ek-lm4f232/usb_stick_demo/rvmdk/usb_stick_demo.axf create mode 100644 boards/ek-lm4f232/usb_stick_demo/rvmdk/usb_stick_demo.bin create mode 100644 boards/ek-lm4f232/usb_stick_demo/startup_ccs.c create mode 100644 boards/ek-lm4f232/usb_stick_demo/startup_ewarm.c create mode 100644 boards/ek-lm4f232/usb_stick_demo/startup_gcc.c create mode 100644 boards/ek-lm4f232/usb_stick_demo/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.c create mode 100644 boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ewd create mode 100644 boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ewp create mode 100644 boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.icf create mode 100644 boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ld create mode 100644 boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.sct create mode 100644 boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.uvopt create mode 100644 boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.uvproj create mode 100644 boards/ek-lm4f232/usb_stick_demo/usb_stick_demo_ccs.cmd create mode 100644 boards/ek-lm4f232/usb_stick_update/Makefile create mode 100644 boards/ek-lm4f232/usb_stick_update/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/usb_stick_update/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/usb_stick_update/ccs/.cproject create mode 100644 boards/ek-lm4f232/usb_stick_update/ccs/.project create mode 100644 boards/ek-lm4f232/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/usb_stick_update/ccs/Debug/usb_stick_update.bin create mode 100644 boards/ek-lm4f232/usb_stick_update/ccs/Debug/usb_stick_update.out create mode 100644 boards/ek-lm4f232/usb_stick_update/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/usb_stick_update/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/usb_stick_update/ewarm/Exe/usb_stick_update.bin create mode 100644 boards/ek-lm4f232/usb_stick_update/ewarm/Exe/usb_stick_update.out create mode 100644 boards/ek-lm4f232/usb_stick_update/gcc/usb_stick_update.axf create mode 100644 boards/ek-lm4f232/usb_stick_update/gcc/usb_stick_update.bin create mode 100644 boards/ek-lm4f232/usb_stick_update/readme.txt create mode 100644 boards/ek-lm4f232/usb_stick_update/rvmdk/usb_stick_update.axf create mode 100644 boards/ek-lm4f232/usb_stick_update/rvmdk/usb_stick_update.bin create mode 100644 boards/ek-lm4f232/usb_stick_update/simple_fs.c create mode 100644 boards/ek-lm4f232/usb_stick_update/simple_fs.h create mode 100644 boards/ek-lm4f232/usb_stick_update/startup_ccs.c create mode 100644 boards/ek-lm4f232/usb_stick_update/startup_ewarm.c create mode 100644 boards/ek-lm4f232/usb_stick_update/startup_gcc.c create mode 100644 boards/ek-lm4f232/usb_stick_update/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/usb_stick_update/usb_stick_update.c create mode 100644 boards/ek-lm4f232/usb_stick_update/usb_stick_update.ewd create mode 100644 boards/ek-lm4f232/usb_stick_update/usb_stick_update.ewp create mode 100644 boards/ek-lm4f232/usb_stick_update/usb_stick_update.icf create mode 100644 boards/ek-lm4f232/usb_stick_update/usb_stick_update.ld create mode 100644 boards/ek-lm4f232/usb_stick_update/usb_stick_update.sct create mode 100644 boards/ek-lm4f232/usb_stick_update/usb_stick_update.uvopt create mode 100644 boards/ek-lm4f232/usb_stick_update/usb_stick_update.uvproj create mode 100644 boards/ek-lm4f232/usb_stick_update/usb_stick_update_ccs.cmd create mode 100644 boards/ek-lm4f232/watchdog/Makefile create mode 100644 boards/ek-lm4f232/watchdog/ccs/.ccsimportspec create mode 100644 boards/ek-lm4f232/watchdog/ccs/.ccsproject create mode 100644 boards/ek-lm4f232/watchdog/ccs/.cproject create mode 100644 boards/ek-lm4f232/watchdog/ccs/.project create mode 100644 boards/ek-lm4f232/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-lm4f232/watchdog/ccs/Debug/watchdog.bin create mode 100644 boards/ek-lm4f232/watchdog/ccs/Debug/watchdog.out create mode 100644 boards/ek-lm4f232/watchdog/ccs/macros.ini_initial create mode 100644 boards/ek-lm4f232/watchdog/ccs/target_config.ccxml create mode 100644 boards/ek-lm4f232/watchdog/ewarm/Exe/watchdog.bin create mode 100644 boards/ek-lm4f232/watchdog/ewarm/Exe/watchdog.out create mode 100644 boards/ek-lm4f232/watchdog/gcc/watchdog.axf create mode 100644 boards/ek-lm4f232/watchdog/gcc/watchdog.bin create mode 100644 boards/ek-lm4f232/watchdog/readme.txt create mode 100644 boards/ek-lm4f232/watchdog/rvmdk/watchdog.axf create mode 100644 boards/ek-lm4f232/watchdog/rvmdk/watchdog.bin create mode 100644 boards/ek-lm4f232/watchdog/startup_ccs.c create mode 100644 boards/ek-lm4f232/watchdog/startup_ewarm.c create mode 100644 boards/ek-lm4f232/watchdog/startup_gcc.c create mode 100644 boards/ek-lm4f232/watchdog/startup_rvmdk.S create mode 100644 boards/ek-lm4f232/watchdog/watchdog.c create mode 100644 boards/ek-lm4f232/watchdog/watchdog.ewd create mode 100644 boards/ek-lm4f232/watchdog/watchdog.ewp create mode 100644 boards/ek-lm4f232/watchdog/watchdog.icf create mode 100644 boards/ek-lm4f232/watchdog/watchdog.ld create mode 100644 boards/ek-lm4f232/watchdog/watchdog.sct create mode 100644 boards/ek-lm4f232/watchdog/watchdog.uvopt create mode 100644 boards/ek-lm4f232/watchdog/watchdog.uvproj create mode 100644 boards/ek-lm4f232/watchdog/watchdog_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/Makefile create mode 100644 boards/ek-tm4c123gxl/bitband/Makefile create mode 100644 boards/ek-tm4c123gxl/bitband/bitband.c create mode 100644 boards/ek-tm4c123gxl/bitband/bitband.ewd create mode 100644 boards/ek-tm4c123gxl/bitband/bitband.ewp create mode 100644 boards/ek-tm4c123gxl/bitband/bitband.icf create mode 100644 boards/ek-tm4c123gxl/bitband/bitband.ld create mode 100644 boards/ek-tm4c123gxl/bitband/bitband.sct create mode 100644 boards/ek-tm4c123gxl/bitband/bitband.uvopt create mode 100644 boards/ek-tm4c123gxl/bitband/bitband.uvproj create mode 100644 boards/ek-tm4c123gxl/bitband/bitband_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/bitband/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/bitband/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/bitband/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/bitband/ccs/.project create mode 100644 boards/ek-tm4c123gxl/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/bitband/ccs/Debug/bitband.bin create mode 100644 boards/ek-tm4c123gxl/bitband/ccs/Debug/bitband.out create mode 100644 boards/ek-tm4c123gxl/bitband/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/bitband/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/bitband/ewarm/Exe/bitband.bin create mode 100644 boards/ek-tm4c123gxl/bitband/ewarm/Exe/bitband.out create mode 100644 boards/ek-tm4c123gxl/bitband/gcc/bitband.axf create mode 100644 boards/ek-tm4c123gxl/bitband/gcc/bitband.bin create mode 100644 boards/ek-tm4c123gxl/bitband/readme.txt create mode 100644 boards/ek-tm4c123gxl/bitband/rvmdk/bitband.axf create mode 100644 boards/ek-tm4c123gxl/bitband/rvmdk/bitband.bin create mode 100644 boards/ek-tm4c123gxl/bitband/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/bitband/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/bitband/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/bitband/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/blinky/Makefile create mode 100644 boards/ek-tm4c123gxl/blinky/blinky.c create mode 100644 boards/ek-tm4c123gxl/blinky/blinky.ewd create mode 100644 boards/ek-tm4c123gxl/blinky/blinky.ewp create mode 100644 boards/ek-tm4c123gxl/blinky/blinky.icf create mode 100644 boards/ek-tm4c123gxl/blinky/blinky.ld create mode 100644 boards/ek-tm4c123gxl/blinky/blinky.sct create mode 100644 boards/ek-tm4c123gxl/blinky/blinky.uvopt create mode 100644 boards/ek-tm4c123gxl/blinky/blinky.uvproj create mode 100644 boards/ek-tm4c123gxl/blinky/blinky_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/blinky/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/blinky/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/blinky/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/blinky/ccs/.project create mode 100644 boards/ek-tm4c123gxl/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/blinky/ccs/Debug/blinky.bin create mode 100644 boards/ek-tm4c123gxl/blinky/ccs/Debug/blinky.out create mode 100644 boards/ek-tm4c123gxl/blinky/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/blinky/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/blinky/ewarm/Exe/blinky.bin create mode 100644 boards/ek-tm4c123gxl/blinky/ewarm/Exe/blinky.out create mode 100644 boards/ek-tm4c123gxl/blinky/gcc/blinky.axf create mode 100644 boards/ek-tm4c123gxl/blinky/gcc/blinky.bin create mode 100644 boards/ek-tm4c123gxl/blinky/readme.txt create mode 100644 boards/ek-tm4c123gxl/blinky/rvmdk/blinky.axf create mode 100644 boards/ek-tm4c123gxl/blinky/rvmdk/blinky.bin create mode 100644 boards/ek-tm4c123gxl/blinky/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/blinky/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/blinky/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/blinky/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/drivers/buttons.c create mode 100644 boards/ek-tm4c123gxl/drivers/buttons.h create mode 100644 boards/ek-tm4c123gxl/drivers/rgb.c create mode 100644 boards/ek-tm4c123gxl/drivers/rgb.h create mode 100644 boards/ek-tm4c123gxl/ek-tm4c123gxl.eww create mode 100644 boards/ek-tm4c123gxl/ek-tm4c123gxl.uvmpw create mode 100644 boards/ek-tm4c123gxl/freertos_demo/FreeRTOSConfig.h create mode 100644 boards/ek-tm4c123gxl/freertos_demo/Makefile create mode 100644 boards/ek-tm4c123gxl/freertos_demo/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/freertos_demo/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/freertos_demo/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/freertos_demo/ccs/.project create mode 100644 boards/ek-tm4c123gxl/freertos_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/freertos_demo/ccs/Debug/freertos_demo.bin create mode 100644 boards/ek-tm4c123gxl/freertos_demo/ccs/Debug/freertos_demo.out create mode 100644 boards/ek-tm4c123gxl/freertos_demo/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/freertos_demo/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/freertos_demo/ewarm/Exe/freertos_demo.bin create mode 100644 boards/ek-tm4c123gxl/freertos_demo/ewarm/Exe/freertos_demo.out create mode 100644 boards/ek-tm4c123gxl/freertos_demo/freertos_demo.c create mode 100644 boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ewd create mode 100644 boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ewp create mode 100644 boards/ek-tm4c123gxl/freertos_demo/freertos_demo.icf create mode 100644 boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ld create mode 100644 boards/ek-tm4c123gxl/freertos_demo/freertos_demo.sct create mode 100644 boards/ek-tm4c123gxl/freertos_demo/freertos_demo.uvopt create mode 100644 boards/ek-tm4c123gxl/freertos_demo/freertos_demo.uvproj create mode 100644 boards/ek-tm4c123gxl/freertos_demo/freertos_demo_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/freertos_demo/gcc/freertos_demo.axf create mode 100644 boards/ek-tm4c123gxl/freertos_demo/gcc/freertos_demo.bin create mode 100644 boards/ek-tm4c123gxl/freertos_demo/led_task.c create mode 100644 boards/ek-tm4c123gxl/freertos_demo/led_task.h create mode 100644 boards/ek-tm4c123gxl/freertos_demo/priorities.h create mode 100644 boards/ek-tm4c123gxl/freertos_demo/readme.txt create mode 100644 boards/ek-tm4c123gxl/freertos_demo/rvmdk/freertos_demo.axf create mode 100644 boards/ek-tm4c123gxl/freertos_demo/rvmdk/freertos_demo.bin create mode 100644 boards/ek-tm4c123gxl/freertos_demo/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/freertos_demo/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/freertos_demo/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/freertos_demo/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/freertos_demo/switch_task.c create mode 100644 boards/ek-tm4c123gxl/freertos_demo/switch_task.h create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/Makefile create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/ccs/.project create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/ccs/Debug/gpio_jtag.bin create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/ccs/Debug/gpio_jtag.out create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/ewarm/Exe/gpio_jtag.bin create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/ewarm/Exe/gpio_jtag.out create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/gcc/gpio_jtag.axf create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/gcc/gpio_jtag.bin create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.c create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ewd create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ewp create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.icf create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ld create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.sct create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.uvopt create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.uvproj create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/readme.txt create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/rvmdk/gpio_jtag.axf create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/rvmdk/gpio_jtag.bin create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/gpio_jtag/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/hello/Makefile create mode 100644 boards/ek-tm4c123gxl/hello/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/hello/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/hello/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/hello/ccs/.project create mode 100644 boards/ek-tm4c123gxl/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/hello/ccs/Debug/hello.bin create mode 100644 boards/ek-tm4c123gxl/hello/ccs/Debug/hello.out create mode 100644 boards/ek-tm4c123gxl/hello/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/hello/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/hello/ewarm/Exe/hello.bin create mode 100644 boards/ek-tm4c123gxl/hello/ewarm/Exe/hello.out create mode 100644 boards/ek-tm4c123gxl/hello/gcc/hello.axf create mode 100644 boards/ek-tm4c123gxl/hello/gcc/hello.bin create mode 100644 boards/ek-tm4c123gxl/hello/hello.c create mode 100644 boards/ek-tm4c123gxl/hello/hello.ewd create mode 100644 boards/ek-tm4c123gxl/hello/hello.ewp create mode 100644 boards/ek-tm4c123gxl/hello/hello.icf create mode 100644 boards/ek-tm4c123gxl/hello/hello.ld create mode 100644 boards/ek-tm4c123gxl/hello/hello.sct create mode 100644 boards/ek-tm4c123gxl/hello/hello.uvopt create mode 100644 boards/ek-tm4c123gxl/hello/hello.uvproj create mode 100644 boards/ek-tm4c123gxl/hello/hello_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/hello/readme.txt create mode 100644 boards/ek-tm4c123gxl/hello/rvmdk/hello.axf create mode 100644 boards/ek-tm4c123gxl/hello/rvmdk/hello.bin create mode 100644 boards/ek-tm4c123gxl/hello/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/hello/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/hello/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/hello/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/interrupts/Makefile create mode 100644 boards/ek-tm4c123gxl/interrupts/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/interrupts/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/interrupts/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/interrupts/ccs/.project create mode 100644 boards/ek-tm4c123gxl/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/interrupts/ccs/Debug/interrupts.bin create mode 100644 boards/ek-tm4c123gxl/interrupts/ccs/Debug/interrupts.out create mode 100644 boards/ek-tm4c123gxl/interrupts/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/interrupts/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/interrupts/ewarm/Exe/interrupts.bin create mode 100644 boards/ek-tm4c123gxl/interrupts/ewarm/Exe/interrupts.out create mode 100644 boards/ek-tm4c123gxl/interrupts/gcc/interrupts.axf create mode 100644 boards/ek-tm4c123gxl/interrupts/gcc/interrupts.bin create mode 100644 boards/ek-tm4c123gxl/interrupts/interrupts.c create mode 100644 boards/ek-tm4c123gxl/interrupts/interrupts.ewd create mode 100644 boards/ek-tm4c123gxl/interrupts/interrupts.ewp create mode 100644 boards/ek-tm4c123gxl/interrupts/interrupts.icf create mode 100644 boards/ek-tm4c123gxl/interrupts/interrupts.ld create mode 100644 boards/ek-tm4c123gxl/interrupts/interrupts.sct create mode 100644 boards/ek-tm4c123gxl/interrupts/interrupts.uvopt create mode 100644 boards/ek-tm4c123gxl/interrupts/interrupts.uvproj create mode 100644 boards/ek-tm4c123gxl/interrupts/interrupts_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/interrupts/readme.txt create mode 100644 boards/ek-tm4c123gxl/interrupts/rvmdk/interrupts.axf create mode 100644 boards/ek-tm4c123gxl/interrupts/rvmdk/interrupts.bin create mode 100644 boards/ek-tm4c123gxl/interrupts/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/interrupts/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/interrupts/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/interrupts/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/mpu_fault/Makefile create mode 100644 boards/ek-tm4c123gxl/mpu_fault/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/mpu_fault/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/mpu_fault/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/mpu_fault/ccs/.project create mode 100644 boards/ek-tm4c123gxl/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/mpu_fault/ccs/Debug/mpu_fault.bin create mode 100644 boards/ek-tm4c123gxl/mpu_fault/ccs/Debug/mpu_fault.out create mode 100644 boards/ek-tm4c123gxl/mpu_fault/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/mpu_fault/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/mpu_fault/ewarm/Exe/mpu_fault.bin create mode 100644 boards/ek-tm4c123gxl/mpu_fault/ewarm/Exe/mpu_fault.out create mode 100644 boards/ek-tm4c123gxl/mpu_fault/gcc/mpu_fault.axf create mode 100644 boards/ek-tm4c123gxl/mpu_fault/gcc/mpu_fault.bin create mode 100644 boards/ek-tm4c123gxl/mpu_fault/mpu_fault.c create mode 100644 boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ewd create mode 100644 boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ewp create mode 100644 boards/ek-tm4c123gxl/mpu_fault/mpu_fault.icf create mode 100644 boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ld create mode 100644 boards/ek-tm4c123gxl/mpu_fault/mpu_fault.sct create mode 100644 boards/ek-tm4c123gxl/mpu_fault/mpu_fault.uvopt create mode 100644 boards/ek-tm4c123gxl/mpu_fault/mpu_fault.uvproj create mode 100644 boards/ek-tm4c123gxl/mpu_fault/mpu_fault_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/mpu_fault/readme.txt create mode 100644 boards/ek-tm4c123gxl/mpu_fault/rvmdk/mpu_fault.axf create mode 100644 boards/ek-tm4c123gxl/mpu_fault/rvmdk/mpu_fault.bin create mode 100644 boards/ek-tm4c123gxl/mpu_fault/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/mpu_fault/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/mpu_fault/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/mpu_fault/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/project0/Makefile create mode 100644 boards/ek-tm4c123gxl/project0/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/project0/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/project0/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/project0/ccs/.project create mode 100644 boards/ek-tm4c123gxl/project0/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/project0/ccs/Debug/project0.bin create mode 100644 boards/ek-tm4c123gxl/project0/ccs/Debug/project0.out create mode 100644 boards/ek-tm4c123gxl/project0/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/project0/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/project0/ewarm/Exe/project0.bin create mode 100644 boards/ek-tm4c123gxl/project0/ewarm/Exe/project0.out create mode 100644 boards/ek-tm4c123gxl/project0/gcc/project0.axf create mode 100644 boards/ek-tm4c123gxl/project0/gcc/project0.bin create mode 100644 boards/ek-tm4c123gxl/project0/project0.c create mode 100644 boards/ek-tm4c123gxl/project0/project0.ewd create mode 100644 boards/ek-tm4c123gxl/project0/project0.ewp create mode 100644 boards/ek-tm4c123gxl/project0/project0.icf create mode 100644 boards/ek-tm4c123gxl/project0/project0.ld create mode 100644 boards/ek-tm4c123gxl/project0/project0.sct create mode 100644 boards/ek-tm4c123gxl/project0/project0.uvopt create mode 100644 boards/ek-tm4c123gxl/project0/project0.uvproj create mode 100644 boards/ek-tm4c123gxl/project0/project0_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/project0/readme.txt create mode 100644 boards/ek-tm4c123gxl/project0/rvmdk/project0.axf create mode 100644 boards/ek-tm4c123gxl/project0/rvmdk/project0.bin create mode 100644 boards/ek-tm4c123gxl/project0/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/project0/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/project0/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/project0/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/qs-rgb/Makefile create mode 100644 boards/ek-tm4c123gxl/qs-rgb/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/qs-rgb/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/qs-rgb/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/qs-rgb/ccs/.project create mode 100644 boards/ek-tm4c123gxl/qs-rgb/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/qs-rgb/ccs/Debug/qs-rgb.bin create mode 100644 boards/ek-tm4c123gxl/qs-rgb/ccs/Debug/qs-rgb.out create mode 100644 boards/ek-tm4c123gxl/qs-rgb/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/qs-rgb/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/qs-rgb/ewarm/Exe/qs-rgb.bin create mode 100644 boards/ek-tm4c123gxl/qs-rgb/ewarm/Exe/qs-rgb.out create mode 100644 boards/ek-tm4c123gxl/qs-rgb/gcc/qs-rgb.axf create mode 100644 boards/ek-tm4c123gxl/qs-rgb/gcc/qs-rgb.bin create mode 100644 boards/ek-tm4c123gxl/qs-rgb/qs-rgb.c create mode 100644 boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ewd create mode 100644 boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ewp create mode 100644 boards/ek-tm4c123gxl/qs-rgb/qs-rgb.h create mode 100644 boards/ek-tm4c123gxl/qs-rgb/qs-rgb.icf create mode 100644 boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ld create mode 100644 boards/ek-tm4c123gxl/qs-rgb/qs-rgb.sct create mode 100644 boards/ek-tm4c123gxl/qs-rgb/qs-rgb.uvopt create mode 100644 boards/ek-tm4c123gxl/qs-rgb/qs-rgb.uvproj create mode 100644 boards/ek-tm4c123gxl/qs-rgb/qs-rgb_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/qs-rgb/readme.txt create mode 100644 boards/ek-tm4c123gxl/qs-rgb/rgb_commands.c create mode 100644 boards/ek-tm4c123gxl/qs-rgb/rgb_commands.h create mode 100644 boards/ek-tm4c123gxl/qs-rgb/rvmdk/qs-rgb.axf create mode 100644 boards/ek-tm4c123gxl/qs-rgb/rvmdk/qs-rgb.bin create mode 100644 boards/ek-tm4c123gxl/qs-rgb/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/qs-rgb/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/qs-rgb/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/qs-rgb/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/timers/Makefile create mode 100644 boards/ek-tm4c123gxl/timers/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/timers/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/timers/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/timers/ccs/.project create mode 100644 boards/ek-tm4c123gxl/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/timers/ccs/Debug/timers.bin create mode 100644 boards/ek-tm4c123gxl/timers/ccs/Debug/timers.out create mode 100644 boards/ek-tm4c123gxl/timers/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/timers/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/timers/ewarm/Exe/timers.bin create mode 100644 boards/ek-tm4c123gxl/timers/ewarm/Exe/timers.out create mode 100644 boards/ek-tm4c123gxl/timers/gcc/timers.axf create mode 100644 boards/ek-tm4c123gxl/timers/gcc/timers.bin create mode 100644 boards/ek-tm4c123gxl/timers/readme.txt create mode 100644 boards/ek-tm4c123gxl/timers/rvmdk/timers.axf create mode 100644 boards/ek-tm4c123gxl/timers/rvmdk/timers.bin create mode 100644 boards/ek-tm4c123gxl/timers/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/timers/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/timers/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/timers/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/timers/timers.c create mode 100644 boards/ek-tm4c123gxl/timers/timers.ewd create mode 100644 boards/ek-tm4c123gxl/timers/timers.ewp create mode 100644 boards/ek-tm4c123gxl/timers/timers.icf create mode 100644 boards/ek-tm4c123gxl/timers/timers.ld create mode 100644 boards/ek-tm4c123gxl/timers/timers.sct create mode 100644 boards/ek-tm4c123gxl/timers/timers.uvopt create mode 100644 boards/ek-tm4c123gxl/timers/timers.uvproj create mode 100644 boards/ek-tm4c123gxl/timers/timers_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/uart_echo/Makefile create mode 100644 boards/ek-tm4c123gxl/uart_echo/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/uart_echo/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/uart_echo/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/uart_echo/ccs/.project create mode 100644 boards/ek-tm4c123gxl/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/uart_echo/ccs/Debug/uart_echo.bin create mode 100644 boards/ek-tm4c123gxl/uart_echo/ccs/Debug/uart_echo.out create mode 100644 boards/ek-tm4c123gxl/uart_echo/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/uart_echo/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/uart_echo/ewarm/Exe/uart_echo.bin create mode 100644 boards/ek-tm4c123gxl/uart_echo/ewarm/Exe/uart_echo.out create mode 100644 boards/ek-tm4c123gxl/uart_echo/gcc/uart_echo.axf create mode 100644 boards/ek-tm4c123gxl/uart_echo/gcc/uart_echo.bin create mode 100644 boards/ek-tm4c123gxl/uart_echo/readme.txt create mode 100644 boards/ek-tm4c123gxl/uart_echo/rvmdk/uart_echo.axf create mode 100644 boards/ek-tm4c123gxl/uart_echo/rvmdk/uart_echo.bin create mode 100644 boards/ek-tm4c123gxl/uart_echo/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/uart_echo/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/uart_echo/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/uart_echo/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/uart_echo/uart_echo.c create mode 100644 boards/ek-tm4c123gxl/uart_echo/uart_echo.ewd create mode 100644 boards/ek-tm4c123gxl/uart_echo/uart_echo.ewp create mode 100644 boards/ek-tm4c123gxl/uart_echo/uart_echo.icf create mode 100644 boards/ek-tm4c123gxl/uart_echo/uart_echo.ld create mode 100644 boards/ek-tm4c123gxl/uart_echo/uart_echo.sct create mode 100644 boards/ek-tm4c123gxl/uart_echo/uart_echo.uvopt create mode 100644 boards/ek-tm4c123gxl/uart_echo/uart_echo.uvproj create mode 100644 boards/ek-tm4c123gxl/uart_echo/uart_echo_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/udma_demo/Makefile create mode 100644 boards/ek-tm4c123gxl/udma_demo/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/udma_demo/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/udma_demo/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/udma_demo/ccs/.project create mode 100644 boards/ek-tm4c123gxl/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/udma_demo/ccs/Debug/udma_demo.bin create mode 100644 boards/ek-tm4c123gxl/udma_demo/ccs/Debug/udma_demo.out create mode 100644 boards/ek-tm4c123gxl/udma_demo/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/udma_demo/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/udma_demo/ewarm/Exe/udma_demo.bin create mode 100644 boards/ek-tm4c123gxl/udma_demo/ewarm/Exe/udma_demo.out create mode 100644 boards/ek-tm4c123gxl/udma_demo/gcc/udma_demo.axf create mode 100644 boards/ek-tm4c123gxl/udma_demo/gcc/udma_demo.bin create mode 100644 boards/ek-tm4c123gxl/udma_demo/readme.txt create mode 100644 boards/ek-tm4c123gxl/udma_demo/rvmdk/udma_demo.axf create mode 100644 boards/ek-tm4c123gxl/udma_demo/rvmdk/udma_demo.bin create mode 100644 boards/ek-tm4c123gxl/udma_demo/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/udma_demo/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/udma_demo/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/udma_demo/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/udma_demo/udma_demo.c create mode 100644 boards/ek-tm4c123gxl/udma_demo/udma_demo.ewd create mode 100644 boards/ek-tm4c123gxl/udma_demo/udma_demo.ewp create mode 100644 boards/ek-tm4c123gxl/udma_demo/udma_demo.icf create mode 100644 boards/ek-tm4c123gxl/udma_demo/udma_demo.ld create mode 100644 boards/ek-tm4c123gxl/udma_demo/udma_demo.sct create mode 100644 boards/ek-tm4c123gxl/udma_demo/udma_demo.uvopt create mode 100644 boards/ek-tm4c123gxl/udma_demo/udma_demo.uvproj create mode 100644 boards/ek-tm4c123gxl/udma_demo/udma_demo_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/Makefile create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.project create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/gcc/usb_dev_bulk.axf create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/gcc/usb_dev_bulk.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/readme.txt create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/rvmdk/usb_dev_bulk.axf create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/rvmdk/usb_dev_bulk.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/usb_bulk_structs.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/usb_bulk_structs.h create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ewd create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ewp create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.icf create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ld create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.sct create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.uvopt create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.uvproj create mode 100644 boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/Makefile create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.project create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.out create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.out create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/gcc/usb_dev_gamepad.axf create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/gcc/usb_dev_gamepad.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/readme.txt create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/rvmdk/usb_dev_gamepad.axf create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/rvmdk/usb_dev_gamepad.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ewd create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ewp create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.icf create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ld create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.sct create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.uvopt create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.uvproj create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/usb_gamepad_structs.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_gamepad/usb_gamepad_structs.h create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/Makefile create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/ccs/.ccsimportspec create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/ccs/.ccsproject create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/ccs/.cproject create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/ccs/.project create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/ccs/Debug/usb_dev_serial.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/ccs/Debug/usb_dev_serial.out create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/ccs/macros.ini_initial create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/ccs/target_config.ccxml create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/ewarm/Exe/usb_dev_serial.out create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/gcc/usb_dev_serial.axf create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/gcc/usb_dev_serial.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/readme.txt create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/rvmdk/usb_dev_serial.axf create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/rvmdk/usb_dev_serial.bin create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/startup_ccs.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/startup_ewarm.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/startup_gcc.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/startup_rvmdk.S create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ewd create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ewp create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.icf create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ld create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.sct create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.uvopt create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.uvproj create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial_ccs.cmd create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/usb_serial_structs.c create mode 100644 boards/ek-tm4c123gxl/usb_dev_serial/usb_serial_structs.h diff --git a/boards/dk-tm4c123g/Makefile b/boards/dk-tm4c123g/Makefile new file mode 100644 index 0000000..04379ac --- /dev/null +++ b/boards/dk-tm4c123g/Makefile @@ -0,0 +1,76 @@ +#****************************************************************************** +# +# Makefile - Rules for building the dk-tm4c123g examples. +# +# Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# A list of the directories containing the examples. +# +DIRS=bitband \ + blinky \ + boot_demo1 \ + boot_demo2 \ + boot_serial \ + boot_usb \ + can \ + grlib_demo \ + hello \ + hibernate \ + interrupts \ + mpu_fault \ + qs-logger \ + sd_card \ + sine_demo \ + softuart_echo \ + timers \ + uart_echo \ + udma_demo \ + usb_dev_bulk \ + usb_dev_keyboard \ + usb_dev_msc \ + usb_dev_serial \ + usb_host_audio \ + usb_host_keyboard \ + usb_host_mouse \ + usb_host_msc \ + usb_stick_demo \ + usb_stick_update \ + watchdog + +# +# The default rule, which causes the examples to be built. +# +all: + @for i in ${DIRS}; \ + do \ + make -C $${i} || exit $$?; \ + done + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${wildcard *~} __dummy__ + @-for i in ${DIRS}; \ + do \ + make -C $${i} clean; \ + done diff --git a/boards/dk-tm4c123g/bitband/Makefile b/boards/dk-tm4c123g/bitband/Makefile new file mode 100644 index 0000000..025411f --- /dev/null +++ b/boards/dk-tm4c123g/bitband/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the bitband example. +# +# Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the bitband example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/bitband.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the bitband example. +# +${COMPILER}/bitband.axf: ${COMPILER}/bitband.o +${COMPILER}/bitband.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/bitband.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/bitband.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/bitband.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/bitband.axf: bitband.ld +SCATTERgcc_bitband=bitband.ld +ENTRY_bitband=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/bitband/bitband.c b/boards/dk-tm4c123g/bitband/bitband.c new file mode 100644 index 0000000..9add8ee --- /dev/null +++ b/boards/dk-tm4c123g/bitband/bitband.c @@ -0,0 +1,292 @@ +//***************************************************************************** +// +// bitband.c - Bit-band manipulation example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/fpu.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Bit-Banding (bitband)

+//! +//! This example application demonstrates the use of the bit-banding +//! capabilities of the Cortex-M3 microprocessor. All of SRAM and all of the +//! peripherals reside within bit-band regions, meaning that bit-banding +//! operations can be applied to any of them. In this example, a variable in +//! SRAM is set to a particular value one bit at a time using bit-banding +//! operations (it would be more efficient to do a single non-bit-banded write; +//! this simply demonstrates the operation of bit-banding). +// +//***************************************************************************** + +//***************************************************************************** +// +// A map of hex nibbles to ASCII characters. +// +//***************************************************************************** +static const char * const pcHex = "0123456789ABCDEF"; + +//***************************************************************************** +// +// The value that is to be modified via bit-banding. +// +//***************************************************************************** +static volatile uint32_t g_ui32Value; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Delay for the specified number of seconds. Depending upon the current +// SysTick value, the delay will be between N-1 and N seconds (i.e. N-1 full +// seconds are guaranteed, aint32_t with the remainder of the current second). +// +//***************************************************************************** +void +Delay(uint32_t ui32Seconds) +{ + // + // Loop while there are more seconds to wait. + // + while(ui32Seconds--) + { + // + // Wait until the SysTick value is less than 1000. + // + while(ROM_SysTickValueGet() > 1000) + { + } + + // + // Wait until the SysTick value is greater than 1000. + // + while(ROM_SysTickValueGet() < 1000) + { + } + } +} + +//***************************************************************************** +// +// Print the given value as a hexadecimal string on the CSTN. +// +//***************************************************************************** +void +PrintValue(uint32_t ui32Value) +{ + char pcBuffer[9]; + + pcBuffer[0] = pcHex[(ui32Value >> 28) & 15]; + pcBuffer[1] = pcHex[(ui32Value >> 24) & 15]; + pcBuffer[2] = pcHex[(ui32Value >> 20) & 15]; + pcBuffer[3] = pcHex[(ui32Value >> 16) & 15]; + pcBuffer[4] = pcHex[(ui32Value >> 12) & 15]; + pcBuffer[5] = pcHex[(ui32Value >> 8) & 15]; + pcBuffer[6] = pcHex[(ui32Value >> 4) & 15]; + pcBuffer[7] = pcHex[(ui32Value >> 0) & 15]; + pcBuffer[8] = '\0'; + + GrStringDrawCentered(&g_sContext, pcBuffer, -1, + GrContextDpyWidthGet(&g_sContext) / 2, 28, 1); +} + +//***************************************************************************** +// +// This example demonstrates the use of bit-banding to set individual bits +// within a word of SRAM. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + uint32_t ui32Errors, ui32Idx; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "bitband", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Set up and enable the SysTick timer. It will be used as a reference + // for delay loops. The SysTick timer period will be set up for one + // second. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet()); + ROM_SysTickEnable(); + + // + // Set the value and error count to zero. + // + g_ui32Value = 0; + ui32Errors = 0; + + // + // Print the initial value to the CSTN. + // + PrintValue(g_ui32Value); + + // + // Delay for 1 second. + // + Delay(1); + + // + // Set the value to 0xdecafbad using bit band accesses to each individual + // bit. + // + for(ui32Idx = 0; ui32Idx < 32; ui32Idx++) + { + // + // Set this bit. + // + HWREGBITW(&g_ui32Value, 31 - ui32Idx) = + (0xdecafbad >> (31 - ui32Idx)) & 1; + + // + // Print the current value to the CSTN. + // + PrintValue(g_ui32Value); + + // + // Delay for 1 second. + // + Delay(1); + } + + // + // Make sure that the value is 0xdecafbad. + // + if(g_ui32Value != 0xdecafbad) + { + ui32Errors++; + } + + // + // Make sure that the individual bits read back correctly. + // + for(ui32Idx = 0; ui32Idx < 32; ui32Idx++) + { + if(HWREGBITW(&g_ui32Value, ui32Idx) != ((0xdecafbad >> ui32Idx) & 1)) + { + ui32Errors++; + } + } + + // + // Delay for 2 seconds. + // + Delay(2); + + // + // Print out the result. + // + if(ui32Errors) + { + GrStringDrawCentered(&g_sContext, "Errors!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 48, 0); + } + else + { + GrStringDrawCentered(&g_sContext, "Success!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 48, 0); + } + + // + // Flush any cached drawing operations. + // + GrFlush(&g_sContext); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/bitband/bitband.ewd b/boards/dk-tm4c123g/bitband/bitband.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/bitband/bitband.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/bitband/bitband.ewp b/boards/dk-tm4c123g/bitband/bitband.ewp new file mode 100644 index 0000000..ff6b705 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/bitband.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\bitband.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/dk-tm4c123g/bitband/bitband.icf b/boards/dk-tm4c123g/bitband/bitband.icf new file mode 100644 index 0000000..79cc5f6 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/bitband.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// bitband.icf - Linker configuration file for bitband. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/bitband/bitband.ld b/boards/dk-tm4c123g/bitband/bitband.ld new file mode 100644 index 0000000..f6276c9 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/bitband.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * bitband.ld - Linker configuration file for bitband. + * + * Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/bitband/bitband.sct b/boards/dk-tm4c123g/bitband/bitband.sct new file mode 100644 index 0000000..afdd549 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/bitband.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; bitband.sct - Linker configuration file for bitband. +; +; Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/bitband/bitband.uvopt b/boards/dk-tm4c123g/bitband/bitband.uvopt new file mode 100644 index 0000000..938f782 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/bitband.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + bitband + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\bitband.c + bitband.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/bitband/bitband.uvproj b/boards/dk-tm4c123g/bitband/bitband.uvproj new file mode 100644 index 0000000..1c13c37 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/bitband.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + bitband + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + bitband + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\bitband.bin .\rvmdk\bitband.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + bitband.sct + + + --entry Reset_Handler + + + + + + + + Source + + + bitband.c + 1 + .\bitband.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/bitband/bitband_ccs.cmd b/boards/dk-tm4c123g/bitband/bitband_ccs.cmd new file mode 100644 index 0000000..53ff254 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/bitband_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * bitband_ccs.cmd - CCS linker configuration file for bitband. + * + * Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c123g/bitband/ccs/.ccsimportspec b/boards/dk-tm4c123g/bitband/ccs/.ccsimportspec new file mode 100644 index 0000000..9748e3c --- /dev/null +++ b/boards/dk-tm4c123g/bitband/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/bitband/ccs/.ccsproject b/boards/dk-tm4c123g/bitband/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/bitband/ccs/.cproject b/boards/dk-tm4c123g/bitband/ccs/.cproject new file mode 100644 index 0000000..d1ce178 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/bitband/ccs/.project b/boards/dk-tm4c123g/bitband/ccs/.project new file mode 100644 index 0000000..49900ac --- /dev/null +++ b/boards/dk-tm4c123g/bitband/ccs/.project @@ -0,0 +1,55 @@ + + + bitband + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + bitband.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/bitband/bitband.c + + + bitband_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/bitband/bitband_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/bitband/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/bitband/ccs/Debug/bitband.bin b/boards/dk-tm4c123g/bitband/ccs/Debug/bitband.bin new file mode 100644 index 0000000..ee066fd Binary files /dev/null and b/boards/dk-tm4c123g/bitband/ccs/Debug/bitband.bin differ diff --git a/boards/dk-tm4c123g/bitband/ccs/Debug/bitband.out b/boards/dk-tm4c123g/bitband/ccs/Debug/bitband.out new file mode 100644 index 0000000..82149cc Binary files /dev/null and b/boards/dk-tm4c123g/bitband/ccs/Debug/bitband.out differ diff --git a/boards/dk-tm4c123g/bitband/ccs/macros.ini_initial b/boards/dk-tm4c123g/bitband/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/bitband/ccs/target_config.ccxml b/boards/dk-tm4c123g/bitband/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/bitband/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/bitband/ewarm/Exe/bitband.bin b/boards/dk-tm4c123g/bitband/ewarm/Exe/bitband.bin new file mode 100644 index 0000000..10aae13 Binary files /dev/null and b/boards/dk-tm4c123g/bitband/ewarm/Exe/bitband.bin differ diff --git a/boards/dk-tm4c123g/bitband/ewarm/Exe/bitband.out b/boards/dk-tm4c123g/bitband/ewarm/Exe/bitband.out new file mode 100644 index 0000000..59802a3 Binary files /dev/null and b/boards/dk-tm4c123g/bitband/ewarm/Exe/bitband.out differ diff --git a/boards/dk-tm4c123g/bitband/gcc/bitband.axf b/boards/dk-tm4c123g/bitband/gcc/bitband.axf new file mode 100644 index 0000000..02828d9 Binary files /dev/null and b/boards/dk-tm4c123g/bitband/gcc/bitband.axf differ diff --git a/boards/dk-tm4c123g/bitband/gcc/bitband.bin b/boards/dk-tm4c123g/bitband/gcc/bitband.bin new file mode 100644 index 0000000..55d76f3 Binary files /dev/null and b/boards/dk-tm4c123g/bitband/gcc/bitband.bin differ diff --git a/boards/dk-tm4c123g/bitband/readme.txt b/boards/dk-tm4c123g/bitband/readme.txt new file mode 100644 index 0000000..667b9a1 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/readme.txt @@ -0,0 +1,29 @@ +Bit-Banding + +This example application demonstrates the use of the bit-banding +capabilities of the Cortex-M3 microprocessor. All of SRAM and all of the +peripherals reside within bit-band regions, meaning that bit-banding +operations can be applied to any of them. In this example, a variable in +SRAM is set to a particular value one bit at a time using bit-banding +operations (it would be more efficient to do a single non-bit-banded write; +this simply demonstrates the operation of bit-banding). + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/bitband/rvmdk/bitband.axf b/boards/dk-tm4c123g/bitband/rvmdk/bitband.axf new file mode 100644 index 0000000..731034b Binary files /dev/null and b/boards/dk-tm4c123g/bitband/rvmdk/bitband.axf differ diff --git a/boards/dk-tm4c123g/bitband/rvmdk/bitband.bin b/boards/dk-tm4c123g/bitband/rvmdk/bitband.bin new file mode 100644 index 0000000..4059a83 Binary files /dev/null and b/boards/dk-tm4c123g/bitband/rvmdk/bitband.bin differ diff --git a/boards/dk-tm4c123g/bitband/startup_ccs.c b/boards/dk-tm4c123g/bitband/startup_ccs.c new file mode 100644 index 0000000..1dcde2c --- /dev/null +++ b/boards/dk-tm4c123g/bitband/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/bitband/startup_ewarm.c b/boards/dk-tm4c123g/bitband/startup_ewarm.c new file mode 100644 index 0000000..bdc5525 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/bitband/startup_gcc.c b/boards/dk-tm4c123g/bitband/startup_gcc.c new file mode 100644 index 0000000..e0de548 --- /dev/null +++ b/boards/dk-tm4c123g/bitband/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/bitband/startup_rvmdk.S b/boards/dk-tm4c123g/bitband/startup_rvmdk.S new file mode 100644 index 0000000..0fd6baf --- /dev/null +++ b/boards/dk-tm4c123g/bitband/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/blinky/Makefile b/boards/dk-tm4c123g/blinky/Makefile new file mode 100644 index 0000000..cfb3f0f --- /dev/null +++ b/boards/dk-tm4c123g/blinky/Makefile @@ -0,0 +1,77 @@ +#****************************************************************************** +# +# Makefile - Rules for building the blinky example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the blinky example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/blinky.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the blinky example. +# +${COMPILER}/blinky.axf: ${COMPILER}/blinky.o +${COMPILER}/blinky.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/blinky.axf: blinky.ld +SCATTERgcc_blinky=blinky.ld +ENTRY_blinky=ResetISR + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/blinky/blinky.c b/boards/dk-tm4c123g/blinky/blinky.c new file mode 100644 index 0000000..ca2b590 --- /dev/null +++ b/boards/dk-tm4c123g/blinky/blinky.c @@ -0,0 +1,93 @@ +//***************************************************************************** +// +// blinky.c - Simple example to blink the on-board LED. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/tm4c123gh6pge.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Blinky (blinky)

+//! +//! A very simple example that blinks the on-board LED. +// +//***************************************************************************** + +//***************************************************************************** +// +// Blink the on-board LED. +// +//***************************************************************************** +int +main(void) +{ + volatile uint32_t ui32Loop; + + // + // Enable the GPIO port that is used for the on-board LED. + // + SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOG; + + // + // Do a dummy read to insert a few cycles after enabling the peripheral. + // + ui32Loop = SYSCTL_RCGC2_R; + + // + // Enable the GPIO pin for the LED (PG2). Set the direction as output, and + // enable the GPIO pin for digital function. + // + GPIO_PORTG_DIR_R = 0x04; + GPIO_PORTG_DEN_R = 0x04; + + // + // Loop forever. + // + while(1) + { + // + // Turn on the LED. + // + GPIO_PORTG_DATA_R |= 0x04; + + // + // Delay for a bit. + // + for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++) + { + } + + // + // Turn off the LED. + // + GPIO_PORTG_DATA_R &= ~(0x04); + + // + // Delay for a bit. + // + for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++) + { + } + } +} diff --git a/boards/dk-tm4c123g/blinky/blinky.ewd b/boards/dk-tm4c123g/blinky/blinky.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/blinky/blinky.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/blinky/blinky.ewp b/boards/dk-tm4c123g/blinky/blinky.ewp new file mode 100644 index 0000000..44d8705 --- /dev/null +++ b/boards/dk-tm4c123g/blinky/blinky.ewp @@ -0,0 +1,777 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Source + + $PROJ_DIR$\blinky.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/dk-tm4c123g/blinky/blinky.icf b/boards/dk-tm4c123g/blinky/blinky.icf new file mode 100644 index 0000000..f38b77e --- /dev/null +++ b/boards/dk-tm4c123g/blinky/blinky.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// blinky.icf - Linker configuration file for blinky. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/blinky/blinky.ld b/boards/dk-tm4c123g/blinky/blinky.ld new file mode 100644 index 0000000..474440b --- /dev/null +++ b/boards/dk-tm4c123g/blinky/blinky.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * blinky.ld - Linker configuration file for blinky. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/blinky/blinky.sct b/boards/dk-tm4c123g/blinky/blinky.sct new file mode 100644 index 0000000..4a7154c --- /dev/null +++ b/boards/dk-tm4c123g/blinky/blinky.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; blinky.sct - Linker configuration file for blinky. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/blinky/blinky.uvopt b/boards/dk-tm4c123g/blinky/blinky.uvopt new file mode 100644 index 0000000..f88b9bd --- /dev/null +++ b/boards/dk-tm4c123g/blinky/blinky.uvopt @@ -0,0 +1,268 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + blinky + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\blinky.c + blinky.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Documentation + 1 + 0 + 0 + + 2 + 3 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/blinky/blinky.uvproj b/boards/dk-tm4c123g/blinky/blinky.uvproj new file mode 100644 index 0000000..8c62c70 --- /dev/null +++ b/boards/dk-tm4c123g/blinky/blinky.uvproj @@ -0,0 +1,414 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + blinky + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + blinky + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\blinky.bin .\rvmdk\blinky.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + blinky.sct + + + --entry Reset_Handler + + + + + + + + Source + + + blinky.c + 1 + .\blinky.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/blinky/blinky_ccs.cmd b/boards/dk-tm4c123g/blinky/blinky_ccs.cmd new file mode 100644 index 0000000..ffd0e0c --- /dev/null +++ b/boards/dk-tm4c123g/blinky/blinky_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * blinky_ccs.cmd - CCS linker configuration file for blinky. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 256; diff --git a/boards/dk-tm4c123g/blinky/ccs/.ccsimportspec b/boards/dk-tm4c123g/blinky/ccs/.ccsimportspec new file mode 100644 index 0000000..60cba3f --- /dev/null +++ b/boards/dk-tm4c123g/blinky/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/blinky/ccs/.ccsproject b/boards/dk-tm4c123g/blinky/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/blinky/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/blinky/ccs/.cproject b/boards/dk-tm4c123g/blinky/ccs/.cproject new file mode 100644 index 0000000..3defd51 --- /dev/null +++ b/boards/dk-tm4c123g/blinky/ccs/.cproject @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/blinky/ccs/.project b/boards/dk-tm4c123g/blinky/ccs/.project new file mode 100644 index 0000000..610bca6 --- /dev/null +++ b/boards/dk-tm4c123g/blinky/ccs/.project @@ -0,0 +1,50 @@ + + + blinky + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + blinky.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/blinky/blinky.c + + + blinky_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/blinky/blinky_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/blinky/startup_ccs.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/blinky/ccs/Debug/blinky.bin b/boards/dk-tm4c123g/blinky/ccs/Debug/blinky.bin new file mode 100644 index 0000000..640cec2 Binary files /dev/null and b/boards/dk-tm4c123g/blinky/ccs/Debug/blinky.bin differ diff --git a/boards/dk-tm4c123g/blinky/ccs/Debug/blinky.out b/boards/dk-tm4c123g/blinky/ccs/Debug/blinky.out new file mode 100644 index 0000000..5e1bf57 Binary files /dev/null and b/boards/dk-tm4c123g/blinky/ccs/Debug/blinky.out differ diff --git a/boards/dk-tm4c123g/blinky/ccs/macros.ini_initial b/boards/dk-tm4c123g/blinky/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/blinky/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/blinky/ccs/target_config.ccxml b/boards/dk-tm4c123g/blinky/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/blinky/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/blinky/ewarm/Exe/blinky.bin b/boards/dk-tm4c123g/blinky/ewarm/Exe/blinky.bin new file mode 100644 index 0000000..42ee325 Binary files /dev/null and b/boards/dk-tm4c123g/blinky/ewarm/Exe/blinky.bin differ diff --git a/boards/dk-tm4c123g/blinky/ewarm/Exe/blinky.out b/boards/dk-tm4c123g/blinky/ewarm/Exe/blinky.out new file mode 100644 index 0000000..0b247f7 Binary files /dev/null and b/boards/dk-tm4c123g/blinky/ewarm/Exe/blinky.out differ diff --git a/boards/dk-tm4c123g/blinky/gcc/blinky.axf b/boards/dk-tm4c123g/blinky/gcc/blinky.axf new file mode 100644 index 0000000..fb271f8 Binary files /dev/null and b/boards/dk-tm4c123g/blinky/gcc/blinky.axf differ diff --git a/boards/dk-tm4c123g/blinky/gcc/blinky.bin b/boards/dk-tm4c123g/blinky/gcc/blinky.bin new file mode 100644 index 0000000..9c52458 Binary files /dev/null and b/boards/dk-tm4c123g/blinky/gcc/blinky.bin differ diff --git a/boards/dk-tm4c123g/blinky/readme.txt b/boards/dk-tm4c123g/blinky/readme.txt new file mode 100644 index 0000000..ebd06d7 --- /dev/null +++ b/boards/dk-tm4c123g/blinky/readme.txt @@ -0,0 +1,23 @@ +Blinky + +A very simple example that blinks the on-board LED. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/blinky/rvmdk/blinky.axf b/boards/dk-tm4c123g/blinky/rvmdk/blinky.axf new file mode 100644 index 0000000..b791ed0 Binary files /dev/null and b/boards/dk-tm4c123g/blinky/rvmdk/blinky.axf differ diff --git a/boards/dk-tm4c123g/blinky/rvmdk/blinky.bin b/boards/dk-tm4c123g/blinky/rvmdk/blinky.bin new file mode 100644 index 0000000..a8e61b4 Binary files /dev/null and b/boards/dk-tm4c123g/blinky/rvmdk/blinky.bin differ diff --git a/boards/dk-tm4c123g/blinky/startup_ccs.c b/boards/dk-tm4c123g/blinky/startup_ccs.c new file mode 100644 index 0000000..47f191e --- /dev/null +++ b/boards/dk-tm4c123g/blinky/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/blinky/startup_ewarm.c b/boards/dk-tm4c123g/blinky/startup_ewarm.c new file mode 100644 index 0000000..9e552bc --- /dev/null +++ b/boards/dk-tm4c123g/blinky/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/blinky/startup_gcc.c b/boards/dk-tm4c123g/blinky/startup_gcc.c new file mode 100644 index 0000000..3dbd01b --- /dev/null +++ b/boards/dk-tm4c123g/blinky/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/blinky/startup_rvmdk.S b/boards/dk-tm4c123g/blinky/startup_rvmdk.S new file mode 100644 index 0000000..f93f490 --- /dev/null +++ b/boards/dk-tm4c123g/blinky/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000100 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/boot_demo1/Makefile b/boards/dk-tm4c123g/boot_demo1/Makefile new file mode 100644 index 0000000..696c1c6 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the boot_demo1 example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/bget +IPATH+=../../../../third_party + +# +# The default rule, which causes the boot_demo1 example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_demo1.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the boot_demo1 example. +# +${COMPILER}/boot_demo1.axf: ${COMPILER}/boot_demo1.o +${COMPILER}/boot_demo1.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/boot_demo1.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/boot_demo1.axf: ${COMPILER}/ustdlib.o +${COMPILER}/boot_demo1.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/boot_demo1.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/boot_demo1.axf: boot_demo1.ld +SCATTERgcc_boot_demo1=boot_demo1.ld +ENTRY_boot_demo1=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/boot_demo1/boot_demo1.c b/boards/dk-tm4c123g/boot_demo1/boot_demo1.c new file mode 100644 index 0000000..ec84f9f --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/boot_demo1.c @@ -0,0 +1,267 @@ +//***************************************************************************** +// +// boot_demo1.c - First boot loader example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_flash.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_gpio.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/pin_map.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/flash.h" +#include "driverlib/uart.h" +#include "driverlib/rom.h" +#include "utils/ustdlib.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Boot Loader Demo 1 (boot_demo1)

+//! +//! An example to demonstrate the use of a flash-based boot loader. At +//! startup, the application will configure the UART and USB peripherals, +//! and then branch to the boot loader to await the start of an +//! update. If using the serial boot loader (boot_serial), the UART will +//! always be configured at 115,200 baud and does not require the use of +//! auto-bauding. +//! +//! This application is intended for use with any of the three flash-based boot +//! loader flavors (boot_serial or boot_usb) included in the software +//! release. To accommodate the largest of these (boot_usb), the link address +//! is set to 0x2800. If you are using serial, you may change this +//! address to a 1KB boundary higher than the last address occupied +//! by the boot loader binary as long as you also rebuild the boot +//! loader itself after modifying its bl_config.h file to set APP_START_ADDRESS +//! to the same value. +//! +//! The boot_demo2 application can be used along with this application to +//! easily demonstrate that the boot loader is actually updating the on-chip +//! flash. +//! +//! Note that the TM4C123G and other Blizzard-class devices also +//! support the serial and USB boot loaders in ROM. To make use of this +//! function, link your application to run at address 0x0000 in flash and enter +//! the bootloader using the ROM_UpdateSerial and ROM_UpdateUSB functions +//! (defined in rom.h). This mechanism is used in the utils/swupdate.c +//! module when built specifically targeting a suitable Blizzard-class device. +// +//***************************************************************************** + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Passes control to the bootloader and initiates a remote software update. +// +// This function passes control to the bootloader and initiates an update of +// the main application firmware image via UART0 or USB depending +// upon the specific boot loader binary in use. +// +// \return Never returns. +// +//***************************************************************************** +void +JumpToBootLoader(void) +{ + // + // Disable all processor interrupts. Instead of disabling them + // one at a time, a direct write to NVIC is done to disable all + // peripheral interrupts. + // + HWREG(NVIC_DIS0) = 0xffffffff; + HWREG(NVIC_DIS1) = 0xffffffff; + + // + // Return control to the boot loader. This is a call to the SVC + // handler in the boot loader. + // + (*((void (*)(void))(*(uint32_t *)0x2c)))(); +} + +//***************************************************************************** +// +// Initialize UART0 and set the appropriate communication parameters. +// +//***************************************************************************** +void +SetupForUART(void) +{ + // + // We need to make sure that UART0 and its associated GPIO port are + // enabled before we pass control to the boot loader. The serial boot + // loader does not enable or configure these peripherals for us if we + // enter it via its SVC vector. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Set GPIO A0 and A1 as UART. + // + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure the UART for 115200, n, 8, 1 + // + ROM_UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, + (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | + UART_CONFIG_WLEN_8)); + + // + // Enable the UART operation. + // + ROM_UARTEnable(UART0_BASE); +} + +//***************************************************************************** +// +// Enable the USB controller +// +//***************************************************************************** +void +SetupForUSB(void) +{ + // + // The USB boot loader takes care of all required USB initialization so, + // if the application itself doesn't need to use the USB controller, we + // don't actually need to enable it here. The only requirement imposed by + // the USB boot loader is that the system clock is running from the PLL + // when the boot loader is entered. + // +} + +//***************************************************************************** +// +// Demonstrate the use of the boot loader. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + tContext sContext; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Initialize the peripherals that each of the boot loader flavors + // supports. Since this example is intended for use with any of the + // boot loaders and we don't know which is actually in use, we cover all + // bases and initialize for serial and USB use here. + // + SetupForUART(); + SetupForUSB(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "boot-demo1", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Indicate what is happening. + // + GrStringDrawCentered(&sContext, "The boot loader", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, false); + GrStringDrawCentered(&sContext, "is now running", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, false); + GrStringDrawCentered(&sContext, "and awaiting", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, false); + GrStringDrawCentered(&sContext, "an update.", -1, + GrContextDpyWidthGet(&sContext) / 2, 50, false); + + // + // Pass control to whichever flavor of boot loader the board is configured + // with. + // + JumpToBootLoader(); + + // + // The previous function never returns but we need to stick in a return + // code here to keep the compiler from generating a warning. + // + return(0); +} diff --git a/boards/dk-tm4c123g/boot_demo1/boot_demo1.ewd b/boards/dk-tm4c123g/boot_demo1/boot_demo1.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/boot_demo1.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/boot_demo1/boot_demo1.ewp b/boards/dk-tm4c123g/boot_demo1/boot_demo1.ewp new file mode 100644 index 0000000..8eea9aa --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/boot_demo1.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\boot_demo1.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c123g/boot_demo1/boot_demo1.icf b/boards/dk-tm4c123g/boot_demo1/boot_demo1.icf new file mode 100644 index 0000000..0a50f41 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/boot_demo1.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// boot_demo1.icf - Linker configuration file for boot_demo1. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00002800 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/boot_demo1/boot_demo1.ld b/boards/dk-tm4c123g/boot_demo1/boot_demo1.ld new file mode 100644 index 0000000..2711000 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/boot_demo1.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * boot_demo1.ld - Linker configuration file for boot_demo1. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00002800, LENGTH = 0x0003d800 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/boot_demo1/boot_demo1.sct b/boards/dk-tm4c123g/boot_demo1/boot_demo1.sct new file mode 100644 index 0000000..6c0df3d --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/boot_demo1.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; boot_demo1.sct - Linker configuration file for boot_demo1. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00002800 0x0003d800 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00002800 0x0003d800 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/boot_demo1/boot_demo1.uvopt b/boards/dk-tm4c123g/boot_demo1/boot_demo1.uvopt new file mode 100644 index 0000000..e89f13c --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/boot_demo1.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_demo1 + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\boot_demo1.c + boot_demo1.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/boot_demo1/boot_demo1.uvproj b/boards/dk-tm4c123g/boot_demo1/boot_demo1.uvproj new file mode 100644 index 0000000..dc96422 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/boot_demo1.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + boot_demo1 + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_demo1 + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_demo1.bin .\rvmdk\boot_demo1.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + .;..;..\..\..\..;..\..\..\..\third_party\bget;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + boot_demo1.sct + + + --entry Reset_Handler + + + + + + + + Source + + + boot_demo1.c + 1 + .\boot_demo1.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/boot_demo1/boot_demo1_ccs.cmd b/boards/dk-tm4c123g/boot_demo1/boot_demo1_ccs.cmd new file mode 100644 index 0000000..e5587a3 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/boot_demo1_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * boot_demo1_ccs.cmd - CCS linker configuration file for boot_demo1. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00002800 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x0003d800 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/boot_demo1/ccs/.ccsimportspec b/boards/dk-tm4c123g/boot_demo1/ccs/.ccsimportspec new file mode 100644 index 0000000..fe6aa3d --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_demo1/ccs/.ccsproject b/boards/dk-tm4c123g/boot_demo1/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_demo1/ccs/.cproject b/boards/dk-tm4c123g/boot_demo1/ccs/.cproject new file mode 100644 index 0000000..380b150 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/ccs/.cproject @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_demo1/ccs/.project b/boards/dk-tm4c123g/boot_demo1/ccs/.project new file mode 100644 index 0000000..9ef1ced --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/ccs/.project @@ -0,0 +1,60 @@ + + + boot_demo1 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_demo1.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/boot_demo1/boot_demo1.c + + + boot_demo1_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/boot_demo1/boot_demo1_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/boot_demo1/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/boot_demo1/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/boot_demo1/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/boot_demo1/ccs/Debug/boot_demo1.bin b/boards/dk-tm4c123g/boot_demo1/ccs/Debug/boot_demo1.bin new file mode 100644 index 0000000..1b0d788 Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo1/ccs/Debug/boot_demo1.bin differ diff --git a/boards/dk-tm4c123g/boot_demo1/ccs/Debug/boot_demo1.out b/boards/dk-tm4c123g/boot_demo1/ccs/Debug/boot_demo1.out new file mode 100644 index 0000000..141c9e1 Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo1/ccs/Debug/boot_demo1.out differ diff --git a/boards/dk-tm4c123g/boot_demo1/ccs/macros.ini_initial b/boards/dk-tm4c123g/boot_demo1/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/boot_demo1/ccs/target_config.ccxml b/boards/dk-tm4c123g/boot_demo1/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_demo1/ewarm/Exe/boot_demo1.bin b/boards/dk-tm4c123g/boot_demo1/ewarm/Exe/boot_demo1.bin new file mode 100644 index 0000000..c21d2b5 Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo1/ewarm/Exe/boot_demo1.bin differ diff --git a/boards/dk-tm4c123g/boot_demo1/ewarm/Exe/boot_demo1.out b/boards/dk-tm4c123g/boot_demo1/ewarm/Exe/boot_demo1.out new file mode 100644 index 0000000..c003068 Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo1/ewarm/Exe/boot_demo1.out differ diff --git a/boards/dk-tm4c123g/boot_demo1/gcc/boot_demo1.axf b/boards/dk-tm4c123g/boot_demo1/gcc/boot_demo1.axf new file mode 100644 index 0000000..ca939c6 Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo1/gcc/boot_demo1.axf differ diff --git a/boards/dk-tm4c123g/boot_demo1/gcc/boot_demo1.bin b/boards/dk-tm4c123g/boot_demo1/gcc/boot_demo1.bin new file mode 100644 index 0000000..363e0b0 Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo1/gcc/boot_demo1.bin differ diff --git a/boards/dk-tm4c123g/boot_demo1/readme.txt b/boards/dk-tm4c123g/boot_demo1/readme.txt new file mode 100644 index 0000000..94420cf --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/readme.txt @@ -0,0 +1,48 @@ +Boot Loader Demo 1 + +An example to demonstrate the use of a flash-based boot loader. At +startup, the application will configure the UART and USB peripherals, +and then branch to the boot loader to await the start of an +update. If using the serial boot loader (boot_serial), the UART will +always be configured at 115,200 baud and does not require the use of +auto-bauding. + +This application is intended for use with any of the three flash-based boot +loader flavors (boot_serial or boot_usb) included in the software +release. To accommodate the largest of these (boot_usb), the link address +is set to 0x2800. If you are using serial, you may change this +address to a 1KB boundary higher than the last address occupied +by the boot loader binary as long as you also rebuild the boot +loader itself after modifying its bl_config.h file to set APP_START_ADDRESS +to the same value. + +The boot_demo2 application can be used along with this application to +easily demonstrate that the boot loader is actually updating the on-chip +flash. + +Note that the TM4C123G and other Blizzard-class devices also +support the serial and USB boot loaders in ROM. To make use of this +function, link your application to run at address 0x0000 in flash and enter +the bootloader using the ROM_UpdateSerial and ROM_UpdateUSB functions +(defined in rom.h). This mechanism is used in the utils/swupdate.c +module when built specifically targeting a suitable Blizzard-class device. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/boot_demo1/rvmdk/boot_demo1.axf b/boards/dk-tm4c123g/boot_demo1/rvmdk/boot_demo1.axf new file mode 100644 index 0000000..5820c9c Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo1/rvmdk/boot_demo1.axf differ diff --git a/boards/dk-tm4c123g/boot_demo1/rvmdk/boot_demo1.bin b/boards/dk-tm4c123g/boot_demo1/rvmdk/boot_demo1.bin new file mode 100644 index 0000000..65dde5d Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo1/rvmdk/boot_demo1.bin differ diff --git a/boards/dk-tm4c123g/boot_demo1/startup_ccs.c b/boards/dk-tm4c123g/boot_demo1/startup_ccs.c new file mode 100644 index 0000000..d0f7f0a --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/startup_ccs.c @@ -0,0 +1,364 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/boot_demo1/startup_ewarm.c b/boards/dk-tm4c123g/boot_demo1/startup_ewarm.c new file mode 100644 index 0000000..f06e67c --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/startup_ewarm.c @@ -0,0 +1,395 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/boot_demo1/startup_gcc.c b/boards/dk-tm4c123g/boot_demo1/startup_gcc.c new file mode 100644 index 0000000..a0b8fe8 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/startup_gcc.c @@ -0,0 +1,411 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/boot_demo1/startup_rvmdk.S b/boards/dk-tm4c123g/boot_demo1/startup_rvmdk.S new file mode 100644 index 0000000..b740b25 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo1/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + DCD 0xFF01FF02 ; HEADER PREFIX 0 + DCD 0xFF03FF04 ; HEADER PREFIX 1 + DCD 0xFFFFFFFF ; HEADER IMAGE LEN + DCD 0xFFFFFFFF ; HEADER CRC32 + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/boot_demo2/Makefile b/boards/dk-tm4c123g/boot_demo2/Makefile new file mode 100644 index 0000000..1db1015 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/Makefile @@ -0,0 +1,93 @@ +#****************************************************************************** +# +# Makefile - Rules for building the boot_demo2 example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/bget +IPATH+=../../../../third_party + +# +# The default rule, which causes the boot_demo2 example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_demo2.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the boot_demo2 example. +# +${COMPILER}/boot_demo2.axf: ${COMPILER}/boot_demo2.o +${COMPILER}/boot_demo2.axf: ${COMPILER}/buttons.o +${COMPILER}/boot_demo2.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/boot_demo2.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/boot_demo2.axf: ${COMPILER}/ustdlib.o +${COMPILER}/boot_demo2.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/boot_demo2.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/boot_demo2.axf: boot_demo2.ld +SCATTERgcc_boot_demo2=boot_demo2.ld +ENTRY_boot_demo2=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/boot_demo2/boot_demo2.c b/boards/dk-tm4c123g/boot_demo2/boot_demo2.c new file mode 100644 index 0000000..5edac16 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/boot_demo2.c @@ -0,0 +1,311 @@ +//***************************************************************************** +// +// boot_demo2.c - Second boot loader example. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/flash.h" +#include "driverlib/uart.h" +#include "driverlib/uart.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/pin_map.h" +#include "utils/ustdlib.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Boot Loader Demo 2 (boot_demo2)

+//! +//! An example to demonstrate the use of a flash-based boot loader. At startup, +//! the application will configure the UART, USB and Ethernet peripherals, wait +//! for a widget on the screen to be pressed, and then branch to the boot +//! loader to await the start of an update. If using the serial boot loader +//! (boot_serial), the UART will always be configured at 115,200 baud and does +//! not require the use of auto-bauding. +//! +//! This application is intended for use with any of the three flash-based boot +//! loader flavors (boot_eth, boot_serial or boot_usb) included in the software +//! release. To accommodate the largest of these (boot_usb), the link address +//! is set to 0x2800. If you are using serial or Ethernet boot loader, you +//! may change this address to a 1KB boundary higher than the last address +//! occupied by the boot loader binary as long as you also rebuild the boot +//! loader itself after modifying its bl_config.h file to set APP_START_ADDRESS +//! to the same value. +//! +//! The boot_demo1 application can be used along with this application to +//! easily demonstrate that the boot loader is actually updating the on-chip +//! flash. +//! +//! Note that the TM4C123G and other Blizzard-class devices also the +//! support serial and USB boot loaders in ROM. To make use of this +//! function, link your application to run at address 0x0000 in flash and enter +//! the bootloader using either the ROM_UpdateUSB or ROM_UpdateSerial +//! functions (defined in rom.h). This mechanism is used in the +//! utils/swupdate.c module when built specifically targeting a suitable +//! Blizzard-class device. +// +//***************************************************************************** + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 + +//***************************************************************************** +// +// A global we use to keep track of when the user presses the "Update now" +// button. +// +//***************************************************************************** +volatile bool g_bFirmwareUpdate = false; + +//***************************************************************************** +// +// Buffers used to hold the Ethernet MAC and IP addresses for the board. +// +//***************************************************************************** +#define SIZE_MAC_ADDR_BUFFER 32 +#define SIZE_IP_ADDR_BUFFER 32 +int8_t g_pi8MACAddr[SIZE_MAC_ADDR_BUFFER]; +int8_t g_pi8IPAddr[SIZE_IP_ADDR_BUFFER]; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Passes control to the bootloader and initiates a remote software update. +// +// This function passes control to the bootloader and initiates an update of +// the main application firmware image via UART0, Ethernet or USB depending +// upon the specific boot loader binary in use. +// +// \return Never returns. +// +//***************************************************************************** +void +JumpToBootLoader(void) +{ + // + // We must make sure we turn off SysTick and its interrupt before entering + // the boot loader! + // + ROM_SysTickIntDisable(); + ROM_SysTickDisable(); + + // + // Disable all processor interrupts. Instead of disabling them + // one at a time, a direct write to NVIC is done to disable all + // peripheral interrupts. + // + HWREG(NVIC_DIS0) = 0xffffffff; + HWREG(NVIC_DIS1) = 0xffffffff; + + // + // Return control to the boot loader. This is a call to the SVC + // handler in the boot loader. + // + (*((void (*)(void))(*(uint32_t *)0x2c)))(); +} + +//***************************************************************************** +// +// Initialize UART0 and set the appropriate communication parameters. +// +//***************************************************************************** +void +SetupForUART(void) +{ + // + // We need to make sure that UART0 and its associated GPIO port are + // enabled before we pass control to the boot loader. The serial boot + // loader does not enable or configure these peripherals for us if we + // enter it via its SVC vector. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Set GPIO A0 and A1 as UART. + // + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure the UART for 115200, n, 8, 1 + // + ROM_UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, + (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | + UART_CONFIG_WLEN_8)); + + // + // Enable the UART operation. + // + ROM_UARTEnable(UART0_BASE); +} + +//***************************************************************************** +// +// Enable the USB controller +// +//***************************************************************************** +void +SetupForUSB(void) +{ + // + // The USB boot loader takes care of all required USB initialization so, + // if the application itself doesn't need to use the USB controller, we + // don't actually need to enable it here. The only requirement imposed by + // the USB boot loader is that the system clock is running from the PLL + // when the boot loader is entered. + // +} + +//***************************************************************************** +// +// A simple application demonstrating use of the boot loader, +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + tContext sContext; + uint32_t ui32SysClock; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + ui32SysClock = ROM_SysCtlClockGet(); + + // + // Initialize the peripherals that each of the boot loader flavors + // supports. Since this example is intended for use with any of the + // boot loaders and we don't know which is actually in use, we cover all + // bases and initialize for serial, Ethernet and USB use here. + // + SetupForUART(); + SetupForUSB(); + + // + // Initialize the buttons driver. + // + ButtonsInit(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "boot-demo2", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + GrStringDrawCentered(&sContext, "Press select", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, false); + GrStringDrawCentered(&sContext, "button to", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, false); + GrStringDrawCentered(&sContext, "update.", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, false); + + // + // Wait for select button to be pressed. + // + while ((ButtonsPoll(0, 0) & SELECT_BUTTON) == 0) + { + ROM_SysCtlDelay(ui32SysClock / 1000); + } + + GrStringDrawCentered(&sContext, " ", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, true); + GrStringDrawCentered(&sContext, " Updating... ", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, true); + GrStringDrawCentered(&sContext, " ", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, true); + + // + // Transfer control to the boot loader. + // + JumpToBootLoader(); + + // + // The previous function never returns but we need to stick in a return + // code here to keep the compiler from generating a warning. + // + return(0); +} diff --git a/boards/dk-tm4c123g/boot_demo2/boot_demo2.ewd b/boards/dk-tm4c123g/boot_demo2/boot_demo2.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/boot_demo2.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/boot_demo2/boot_demo2.ewp b/boards/dk-tm4c123g/boot_demo2/boot_demo2.ewp new file mode 100644 index 0000000..c70da23 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/boot_demo2.ewp @@ -0,0 +1,804 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\boot_demo2.c + + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c123g/boot_demo2/boot_demo2.icf b/boards/dk-tm4c123g/boot_demo2/boot_demo2.icf new file mode 100644 index 0000000..d951ce9 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/boot_demo2.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// boot_demo2.icf - Linker configuration file for boot_demo2. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00002800 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/boot_demo2/boot_demo2.ld b/boards/dk-tm4c123g/boot_demo2/boot_demo2.ld new file mode 100644 index 0000000..56e2c41 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/boot_demo2.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * boot_demo2.ld - Linker configuration file for boot_demo2. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00002800, LENGTH = 0x0003d800 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/boot_demo2/boot_demo2.sct b/boards/dk-tm4c123g/boot_demo2/boot_demo2.sct new file mode 100644 index 0000000..4a0b0c4 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/boot_demo2.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; boot_demo2.sct - Linker configuration file for boot_demo2. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00002800 0x0003d800 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00002800 0x0003d800 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/boot_demo2/boot_demo2.uvopt b/boards/dk-tm4c123g/boot_demo2/boot_demo2.uvopt new file mode 100644 index 0000000..5be2dfe --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/boot_demo2.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_demo2 + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\boot_demo2.c + boot_demo2.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/boot_demo2/boot_demo2.uvproj b/boards/dk-tm4c123g/boot_demo2/boot_demo2.uvproj new file mode 100644 index 0000000..437f20e --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/boot_demo2.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + boot_demo2 + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_demo2 + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_demo2.bin .\rvmdk\boot_demo2.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + .;..;..\..\..\..;..\..\..\..\third_party\bget;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + boot_demo2.sct + + + --entry Reset_Handler + + + + + + + + Source + + + boot_demo2.c + 1 + .\boot_demo2.c + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/boot_demo2/boot_demo2_ccs.cmd b/boards/dk-tm4c123g/boot_demo2/boot_demo2_ccs.cmd new file mode 100644 index 0000000..82e04b8 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/boot_demo2_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * boot_demo2_ccs.cmd - CCS linker configuration file for boot_demo2. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00002800 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x0003d800 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/boot_demo2/ccs/.ccsimportspec b/boards/dk-tm4c123g/boot_demo2/ccs/.ccsimportspec new file mode 100644 index 0000000..1a6970a --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_demo2/ccs/.ccsproject b/boards/dk-tm4c123g/boot_demo2/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_demo2/ccs/.cproject b/boards/dk-tm4c123g/boot_demo2/ccs/.cproject new file mode 100644 index 0000000..3f55b34 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/ccs/.cproject @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_demo2/ccs/.project b/boards/dk-tm4c123g/boot_demo2/ccs/.project new file mode 100644 index 0000000..fe57ad0 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/ccs/.project @@ -0,0 +1,65 @@ + + + boot_demo2 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_demo2.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/boot_demo2/boot_demo2.c + + + boot_demo2_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/boot_demo2/boot_demo2_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/boot_demo2/startup_ccs.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/boot_demo2/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/boot_demo2/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/boot_demo2/ccs/Debug/boot_demo2.bin b/boards/dk-tm4c123g/boot_demo2/ccs/Debug/boot_demo2.bin new file mode 100644 index 0000000..b490c71 Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo2/ccs/Debug/boot_demo2.bin differ diff --git a/boards/dk-tm4c123g/boot_demo2/ccs/Debug/boot_demo2.out b/boards/dk-tm4c123g/boot_demo2/ccs/Debug/boot_demo2.out new file mode 100644 index 0000000..547277c Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo2/ccs/Debug/boot_demo2.out differ diff --git a/boards/dk-tm4c123g/boot_demo2/ccs/macros.ini_initial b/boards/dk-tm4c123g/boot_demo2/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/boot_demo2/ccs/target_config.ccxml b/boards/dk-tm4c123g/boot_demo2/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_demo2/ewarm/Exe/boot_demo2.bin b/boards/dk-tm4c123g/boot_demo2/ewarm/Exe/boot_demo2.bin new file mode 100644 index 0000000..cfef7da Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo2/ewarm/Exe/boot_demo2.bin differ diff --git a/boards/dk-tm4c123g/boot_demo2/ewarm/Exe/boot_demo2.out b/boards/dk-tm4c123g/boot_demo2/ewarm/Exe/boot_demo2.out new file mode 100644 index 0000000..d18191c Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo2/ewarm/Exe/boot_demo2.out differ diff --git a/boards/dk-tm4c123g/boot_demo2/gcc/boot_demo2.axf b/boards/dk-tm4c123g/boot_demo2/gcc/boot_demo2.axf new file mode 100644 index 0000000..b60b464 Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo2/gcc/boot_demo2.axf differ diff --git a/boards/dk-tm4c123g/boot_demo2/gcc/boot_demo2.bin b/boards/dk-tm4c123g/boot_demo2/gcc/boot_demo2.bin new file mode 100644 index 0000000..6203bab Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo2/gcc/boot_demo2.bin differ diff --git a/boards/dk-tm4c123g/boot_demo2/readme.txt b/boards/dk-tm4c123g/boot_demo2/readme.txt new file mode 100644 index 0000000..8fbe91e --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/readme.txt @@ -0,0 +1,49 @@ +Boot Loader Demo 2 + +An example to demonstrate the use of a flash-based boot loader. At startup, +the application will configure the UART, USB and Ethernet peripherals, wait +for a widget on the screen to be pressed, and then branch to the boot +loader to await the start of an update. If using the serial boot loader +(boot_serial), the UART will always be configured at 115,200 baud and does +not require the use of auto-bauding. + +This application is intended for use with any of the three flash-based boot +loader flavors (boot_eth, boot_serial or boot_usb) included in the software +release. To accommodate the largest of these (boot_usb), the link address +is set to 0x2800. If you are using serial or Ethernet boot loader, you +may change this address to a 1KB boundary higher than the last address +occupied by the boot loader binary as long as you also rebuild the boot +loader itself after modifying its bl_config.h file to set APP_START_ADDRESS +to the same value. + +The boot_demo1 application can be used along with this application to +easily demonstrate that the boot loader is actually updating the on-chip +flash. + +Note that the TM4C123G and other Blizzard-class devices also the +support serial and USB boot loaders in ROM. To make use of this +function, link your application to run at address 0x0000 in flash and enter +the bootloader using either the ROM_UpdateUSB or ROM_UpdateSerial +functions (defined in rom.h). This mechanism is used in the +utils/swupdate.c module when built specifically targeting a suitable +Blizzard-class device. + +------------------------------------------------------------------------------- + +Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/boot_demo2/rvmdk/boot_demo2.axf b/boards/dk-tm4c123g/boot_demo2/rvmdk/boot_demo2.axf new file mode 100644 index 0000000..57eebe3 Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo2/rvmdk/boot_demo2.axf differ diff --git a/boards/dk-tm4c123g/boot_demo2/rvmdk/boot_demo2.bin b/boards/dk-tm4c123g/boot_demo2/rvmdk/boot_demo2.bin new file mode 100644 index 0000000..514baf5 Binary files /dev/null and b/boards/dk-tm4c123g/boot_demo2/rvmdk/boot_demo2.bin differ diff --git a/boards/dk-tm4c123g/boot_demo2/startup_ccs.c b/boards/dk-tm4c123g/boot_demo2/startup_ccs.c new file mode 100644 index 0000000..d0f7f0a --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/startup_ccs.c @@ -0,0 +1,364 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/boot_demo2/startup_ewarm.c b/boards/dk-tm4c123g/boot_demo2/startup_ewarm.c new file mode 100644 index 0000000..f06e67c --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/startup_ewarm.c @@ -0,0 +1,395 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/boot_demo2/startup_gcc.c b/boards/dk-tm4c123g/boot_demo2/startup_gcc.c new file mode 100644 index 0000000..a0b8fe8 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/startup_gcc.c @@ -0,0 +1,411 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/boot_demo2/startup_rvmdk.S b/boards/dk-tm4c123g/boot_demo2/startup_rvmdk.S new file mode 100644 index 0000000..b740b25 --- /dev/null +++ b/boards/dk-tm4c123g/boot_demo2/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + DCD 0xFF01FF02 ; HEADER PREFIX 0 + DCD 0xFF03FF04 ; HEADER PREFIX 1 + DCD 0xFFFFFFFF ; HEADER IMAGE LEN + DCD 0xFFFFFFFF ; HEADER CRC32 + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/boot_serial/Makefile b/boards/dk-tm4c123g/boot_serial/Makefile new file mode 100644 index 0000000..2fa8c6c --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/Makefile @@ -0,0 +1,98 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Serial Port Boot Loader. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../boot_loader + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=../../../.. +IPATH+=../../../../boot_loader + +# +# The default rule, which causes the Serial Port Boot Loader to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_serial.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Serial Port Boot Loader. +# +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_autobaud.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_can.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_check.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_crc32.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_decrypt.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_emac.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_flash.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_i2c.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_main.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_packet.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_ssi.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_startup_${COMPILER}.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_uart.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_usb.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_usbfuncs.o +${COMPILER}/boot_serial.axf: ../../../../boot_loader/bl_link.ld +SCATTERgcc_boot_serial=../../../../boot_loader/bl_link.ld +ENTRY_boot_serial=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/boot_serial/bl_config.h b/boards/dk-tm4c123g/boot_serial/bl_config.h new file mode 100644 index 0000000..dcf32af --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/bl_config.h @@ -0,0 +1,1137 @@ +//***************************************************************************** +// +// bl_config.h - The configurable parameters of the boot loader. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __BL_CONFIG_H__ +#define __BL_CONFIG_H__ + +//***************************************************************************** +// +// The following defines are used to configure the operation of the boot +// loader. For each define, its interactions with other defines are described. +// First is the dependencies (in other words, the defines that must also be +// defined if it is defined), next are the exclusives (in other words, the +// defines that can not be defined if it is defined), and finally are the +// requirements (in other words, the defines that must be defined if it is +// defined). +// +// The following defines must be defined in order for the boot loader to +// operate: +// +// One of CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, UART_ENABLE_UPDATE, or USB_ENABLE_UPDATE +// APP_START_ADDRESS +// VTABLE_START_ADDRESS +// FLASH_PAGE_SIZE +// STACK_SIZE +// +//***************************************************************************** + +//***************************************************************************** +// +// The frequency of the crystal used to clock the microcontroller. +// +// This defines the crystal frequency used by the microcontroller running the +// boot loader. If this is unknown at the time of production, then use the +// UART_AUTOBAUD feature to properly configure the UART. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define CRYSTAL_FREQ 16000000 + +//***************************************************************************** +// +// The starting address of the application. This must be a multiple of 1024 +// bytes (making it aligned to a page boundary). A vector table is expected at +// this location, and the perceived validity of the vector table (stack located +// in SRAM, reset vector located in flash) is used as an indication of the +// validity of the application image. +// +// The flash image of the boot loader must not be larger than this value. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define APP_START_ADDRESS 0x2800 + +//***************************************************************************** +// +// The address at which the application locates its exception vector table. +// This must be a multiple of 1024 bytes (making it aligned to a page +// boundary). Typically, an application will start with its vector table and +// this value should be set to APP_START_ADDRESS. This option is provided to +// cater for applications which run from external memory which may not be +// accessible by the NVIC (the vector table offset register is only 30 bits +// long). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define VTABLE_START_ADDRESS 0x2800 + +//***************************************************************************** +// +// The size of a single, erasable page in the flash. This must be a power +// of 2. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define FLASH_PAGE_SIZE 0x00000400 + +//***************************************************************************** +// +// The amount of space at the end of flash to reserved. This must be a +// multiple of 1024 bytes (making it aligned to a page boundary). This +// reserved space is not erased when the application is updated, providing +// non-volatile storage that can be used for parameters. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define FLASH_RSVD_SPACE 0x00000800 + +//***************************************************************************** +// +// The number of words of stack space to reserve for the boot loader. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define STACK_SIZE 48 + +//***************************************************************************** +// +// The number of words in the data buffer used for receiving packets. This +// value must be at least 3. If using auto-baud on the UART, this must be at +// least 20. The maximum usable value is 65 (larger values will result in +// unused space in the buffer). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define BUFFER_SIZE 20 + +//***************************************************************************** +// +// Enables updates to the boot loader. Updating the boot loader is an unsafe +// operation since it is not fully fault tolerant (losing power to the device +// part way though could result in the boot loader no longer being present in +// flash). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_BL_UPDATE + +//***************************************************************************** +// +// Enables runtime and download CRC32 checking of the main firmware image. +// If this is defined, the boot loader will scan the main firmware image for +// an image information header (stored immediately above the vector table and +// marked by the words 0xFF01FF02 and 0xFF03FF04). If the header is found and +// the CRC32 value it contains matches that calculated for the image, the +// firmware is run. If the CRC32 does not match or the image information +// is not found, the boot loader retains control and waits for a new download. +// To aid debugging, if this option is used without ENFORCE_CRC being set, the +// image will also be booted if the header is present but the length field is +// set to 0xFFFFFFFF, typically indicating that the firmware file has not been +// run through the post-processing tool which inserts the length and CRC values. +// +// Note that firmware images intended for use with CRC checking must have been +// built with an 8 word image header appended to the top of the vector table +// and the binary must have been processed by a tool such as tools/binpack.exe +// to ensure that the required length (3rd word) and CRC32 (4th word) fields +// are populated in the header. +// +// Depends on: ENFORCE_CRC +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CHECK_CRC + +//***************************************************************************** +// +// This definition may be used alongside CHECK_CRC to remove the debug behavior +// which will allow an image with an uninitialized header to be run. With +// ENFORCE_CRC defined firmware images will only be booted if they contain a +// valid image information header and if the embedded CRC32 in that header +// matches the calculated value. +// +// Depends on: None +// Exclusive of: None +// Requires: CHECK_CRC +// +//***************************************************************************** +//#define ENFORCE_CRC + +//***************************************************************************** +// +// This definition will cause the the boot loader to erase the entire flash on +// updates to the boot loader or to erase the entire application area when the +// application is updated. This erases any unused sections in the flash before +// the firmware is updated. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define FLASH_CODE_PROTECTION + +//***************************************************************************** +// +// Enables the call to decrypt the downloaded data before writing it into +// flash. The decryption routine is empty in the reference boot loader source, +// which simply provides a placeholder for adding an actual decryption +// algorithm. Although this option is retained for backwards compatibility, it +// is recommended that a decryption function be specified using the newer hook +// function mechanism and BL_DECRYPT_FN_HOOK instead. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_DECRYPTION + +//***************************************************************************** +// +// Enables support for the MOSCFAIL handler in the NMI interrupt. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_MOSCFAIL_HANDLER + +//***************************************************************************** +// +// Enables the pin-based forced update check. When enabled, the boot loader +// will go into update mode instead of calling the application if a pin is read +// at a particular polarity, forcing an update operation. In either case, the +// application is still able to return control to the boot loader in order to +// start an update. For applications which need to perform more complex +// checking than is possible using a single GPIO, a hook function may be +// provided using BL_CHECK_UPDATE_FN_HOOK instead. +// +// Depends on: None +// Exclusive of: None +// Requires: FORCED_UPDATE_PERIPH, FORCED_UPDATE_PORT, FORCED_UPDATE_PIN, +// FORCED_UPDATE_POLARITY +// +//***************************************************************************** +//#define ENABLE_UPDATE_CHECK + +//***************************************************************************** +// +// The GPIO module to enable in order to check for a forced update. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// FORCED_UPDATE_PORT. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PERIPH SYSCTL_RCGC2_GPIOB + +//***************************************************************************** +// +// The GPIO port to check for a forced update. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for +// FORCED_UPDATE_PERIPH. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// The pin to check for a forced update. This is a value between 0 and 7. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PIN 4 + +//***************************************************************************** +// +// The polarity of the GPIO pin that results in a forced update. This value +// should be 0 if the pin should be low and 1 if the pin should be high. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_POLARITY 0 + +//***************************************************************************** +// +// This enables a weak pull-up or pull-down for the GPIO pin used in a forced +// update. Only one of FORCED_UPDATE_WPU or FORCED_UPDATE_WPD should be +// defined, or neither if a weak pull-up or pull-down is not required. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_WPU +//#define FORCED_UPDATE_WPD + +//***************************************************************************** +// +// This enables the use of the GPIO_LOCK mechanism for configuration of +// protected GPIO pins (for example JTAG pins). If this value is not defined, +// the locking mechanism will not be used. The only legal values for this +// feature are GPIO_LOCK_KEY for Fury devices and GPIO_LOCK_KEY_DD for all +// other devices except Sandstorm devices, which do not support this feature. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_KEY GPIO_LOCK_KEY +//#define FORCED_UPDATE_KEY GPIO_LOCK_KEY_DD + +//***************************************************************************** +// +// Selects the UART as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: UART_AUTOBAUD or UART_FIXED_BAUDRATE, BUFFER_SIZE +// +//***************************************************************************** +#define UART_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables automatic baud rate detection. This can be used if the crystal +// frequency is unknown, or if operation at different baud rates is desired. +// +// Depends on: UART_ENABLE_UPDATE +// Exclusive of: UART_FIXED_BAUDRATE +// Requires: None +// +//***************************************************************************** +//#define UART_AUTOBAUD + +//***************************************************************************** +// +// Selects the baud rate to be used for the UART. +// +// Depends on: UART_ENABLE_UPDATE, CRYSTAL_FREQ +// Exclusive of: UART_AUTOBAUD +// Requires: None +// +//***************************************************************************** +#define UART_FIXED_BAUDRATE 115200 + +//***************************************************************************** +// +// Selects the SSI port as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: BUFFER_SIZE +// +//***************************************************************************** +//#define SSI_ENABLE_UPDATE + +//***************************************************************************** +// +// Selects the I2C port as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: I2C_SLAVE_ADDR, BUFFER_SIZE +// +//***************************************************************************** +//#define I2C_ENABLE_UPDATE + +//***************************************************************************** +// +// Specifies the I2C address of the boot loader. +// +// Depends on: I2C_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define I2C_SLAVE_ADDR 0x42 + +//***************************************************************************** +// +// Selects Ethernet update via the BOOTP/TFTP protocol. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, I2C_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: CRYSTAL_FREQ +// +//***************************************************************************** +//#define ENET_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables the use of the Ethernet status LED outputs to indicate traffic and +// connection status. +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_ENABLE_LEDS + +//***************************************************************************** +// +// Specifies the hard coded MAC address for the Ethernet interface. There are +// six individual values (ENET_MAC_ADDR0 through ENET_MAC_ADDR5) that provide +// the six bytes of the MAC address, where ENET_MAC_ADDR0 though ENET_MAC_ADDR2 +// provide the organizationally unique identifier (OUI) and ENET_MAC_ADDR3 +// through ENET_MAC_ADDR5 provide the extension identifier. If these values +// are not provided, the MAC address will be extracted from the user registers. +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_MAC_ADDR0 0x00 +//#define ENET_MAC_ADDR1 0x00 +//#define ENET_MAC_ADDR2 0x00 +//#define ENET_MAC_ADDR3 0x00 +//#define ENET_MAC_ADDR4 0x00 +//#define ENET_MAC_ADDR5 0x00 + +//***************************************************************************** +// +// Specifies the name of the BOOTP server from which to request information. +// The use of this specifier allows a board-specific BOOTP server to co-exist +// on a network with the DHCP server that may be part of the network +// infrastructure. The BOOTP server provided by Texas Instruments requires +// that this be set to "stellaris". +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_BOOTP_SERVER "stellaris" + +//***************************************************************************** +// +// Selects USB update via Device Firmware Update class. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, UART_ENABLE_UPDATE, +// Requires: CRYSTAL_FREQ, USB_VENDOR_ID, USB_PRODUCT_ID, USB_DEVICE_ID, +// USB_MAX_POWER +// +//***************************************************************************** +//#define USB_ENABLE_UPDATE + +//***************************************************************************** +// +// The USB vendor ID published by the DFU device. This value is the TI +// Tiva vendor ID. Change this to the vendor ID you have been assigned by the +// USB-IF. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VENDOR_ID 0x1cbe + +//***************************************************************************** +// +// The USB device ID published by the DFU device. If you are using your own +// vendor ID, chose a device ID that is different from the ID you use in +// non-update operation. If you have sublicensed TI's vendor ID, you must +// use an assigned product ID here. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_PRODUCT_ID 0x00ff + +//***************************************************************************** +// +// Selects the BCD USB device release number published in the device +// descriptor. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DEVICE_ID 0x0001 + +//***************************************************************************** +// +// Sets the maximum power consumption that the DFU device will report to the +// USB host in the configuration descriptor. Units are milliamps. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MAX_POWER 150 + +//***************************************************************************** +// +// Specifies whether the DFU device reports to the host that it is self-powered +// (defined as 0) or bus-powered (defined as 1). +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_BUS_POWERED 1 + +//***************************************************************************** +// +// Specifies whether the target board uses a multiplexer to select between USB +// host and device modes. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_MUX_PERIPH, USB_MUX_PORT, USB_MUX_PIN, USB_MUX_DEVICE +// +//***************************************************************************** +//#define USB_HAS_MUX + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used to select +// between USB host and device modes. The value is of the form +// SYSCTL_RCGC2_GPIOx, where GPIOx represents the required GPIO port. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PERIPH SYSCTL_RCGC2_GPIOH + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used to select between +// USB host and device modes. The value is of the form GPIO_PORTx_BASE, where +// PORTx represents the required GPIO port. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PORT GPIO_PORTH_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used to select between USB host and device +// modes. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PIN 2 + +//***************************************************************************** +// +// Specifies the state of the GPIO pin required to select USB device-mode +// operation. Valid values are 0 (low) or 1 (high). +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_DEVICE 1 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for VBUS. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_VBUS_PERIPH, USB_VBUS_PORT, USB_VBUS_PIN +// +//***************************************************************************** +//#define USB_VBUS_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for VBUS. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VBUS_PERIPH SYSCTL_RCGCGPIO_R1 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for VBUS. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VBUS_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for VBUS. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VBUS_PIN 1 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for ID. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_ID_PERIPH, USB_ID_PORT, USB_ID_PIN +// +//***************************************************************************** +//#define USB_ID_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for ID. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_ID_PERIPH SYSCTL_RCGCGPIO_R1 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for ID. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_ID_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for ID. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_ID_PIN 0 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for DP. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_DP_PERIPH, USB_DP_PORT, USB_DP_PIN +// +//***************************************************************************** +//#define USB_DP_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for DP. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DP_PERIPH SYSCTL_RCGCGPIO_R10 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for DP. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DP_PORT GPIO_PORTL_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for DP. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DP_PIN 6 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for DM. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_DM_PERIPH, USB_DM_PORT, USB_DM_PIN +// +//***************************************************************************** +//#define USB_DM_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for DM. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DM_PERIPH SYSCTL_RCGCGPIO_R10 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for DM. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DM_PORT GPIO_PORTL_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for DM. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DM_PIN 7 + +//***************************************************************************** +// +// Selects an update via the CAN port. +// +// Depends on: None +// Exclusive of: ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: CAN_RX_PERIPH, CAN_RX_PORT, CAN_RX_PIN, CAN_TX_PERIPH, +// CAN_TX_PORT, CAN_TX_PIN, CAN_BIT_RATE, CRYSTAL_FREQ. +// +//***************************************************************************** +//#define CAN_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables the UART to CAN bridging for use when the CAN port is selected for +// communicating with the boot loader. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_UART_BRIDGE + +//***************************************************************************** +// +// The GPIO module to enable in order to configure the CAN0 Rx pin. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// CAN_RX_PORT. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PERIPH SYSCTL_RCGC2_GPIOA + +//***************************************************************************** +// +// The GPIO port used to configure the CAN0 Rx pin. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for CAN_RX_PERIPH. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PORT GPIO_PORTA_BASE + +//***************************************************************************** +// +// The GPIO pin that is shared with the CAN0 Rx pin. This is a value between 0 +// and 7. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PIN 4 + +//***************************************************************************** +// +// The GPIO module to enable in order to configure the CAN0 Tx pin. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// CAN_TX_PORT. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PERIPH SYSCTL_RCGC2_GPIOA + +//***************************************************************************** +// +// The GPIO port used to configure the CAN0 Tx pin. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for CAN_TX_PERIPH. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PORT GPIO_PORTA_BASE + +//***************************************************************************** +// +// The GPIO pin that is shared with the CAN0 Tx pin. This is a value between 0 +// and 7. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PIN 5 + +//***************************************************************************** +// +// The bit rate used on the CAN bus. This must be one of 20000, 50000, 125000, +// 250000, 500000, or 1000000. The CAN bit rate must be less than or equal to +// the crystal frequency divided by 8 (CRYSTAL_FREQ / 8). +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_BIT_RATE 1000000 + +//***************************************************************************** +// +// Performs application-specific low level hardware initialization on system +// reset. If hooked, this function will be called immediately after the boot +// loader code relocation completes. An application may perform any required +// low-level hardware initialization during this function. Note that the +// system clock has not been set when this function is called. Initialization +// that assumes the system clock is set may be performed in the BL_INIT_FN_HOOK +// function instead. +// +// void MyHwInitFunc(void); +// +//***************************************************************************** +//#define BL_HW_INIT_FN_HOOK MyHwInitFunc + +//***************************************************************************** +// +// Performs application-specific initialization on system reset. If hooked, +// this function will be called during boot loader initialization to perform +// any board- or application-specific initialization which is required. The +// function is called following a reset immediately after the selected boot +// loader peripheral has been configured and the system clock has been set. +// +// void MyInitFunc(void); +// +//***************************************************************************** +//#define BL_INIT_FN_HOOK MyInitFunc + +//***************************************************************************** +// +// Performs application-specific reinitialization on boot loader entry via SVC. +// If hooked, this function will be called during boot loader reinitialization +// to perform any board- or application-specific initialization which is +// required. The function is called following boot loader entry from an +// application, after any system clock rate adjustments have been made. +// +// void MyReinitFunc(void); +// +//***************************************************************************** +//#define BL_REINIT_FN_HOOK MyReinitFunc + +//***************************************************************************** +// +// Informs an application that a download is starting. If hooked, this +// function will be called when a firmware download is about to begin. The +// function is called after the first data packet of the download is received +// but before it has been written to flash. +// +// void MyStartFunc(void); +// +//***************************************************************************** +//#define BL_START_FN_HOOK MyStartFunc + +//***************************************************************************** +// +// Informs an application of download progress. If hooked, this function will +// be called periodically during a firmware download to provide progress +// information. The function is called after each data packet is received from +// the host. Parameters provide the number of bytes of data received and, in +// cases other than Ethernet update, the expected total number of bytes in the +// download (the TFTP protocol used by the Ethernet boot loader does not send +// the final image size before the download starts so in this case the ulTotal +// parameter is set to 0 to indicate that the size is unknown). +// +// void MyProgressFunc(unsigned long ulCompleted, unsigned long ulTotal); +// +//***************************************************************************** +//#define BL_PROGRESS_FN_HOOK MyProgressFunc + +//***************************************************************************** +// +// Informs an application that a download has completed. If hooked, this +// function will be called when a firmware download has just completed. The +// function is called after the final data packet of the download has been +// written to flash. +// +// void MyEndFunc(void); +// +//***************************************************************************** +//#define BL_END_FN_HOOK MyEndFunc + +//***************************************************************************** +// +// Allows an application to perform in-place data decryption during download. +// If hooked, this function will be called to perform in-place decryption of +// each data packet received during a firmware download. +// +// void MyDecryptionFunc(unsigned char *pucBuffer, unsigned long ulSize); +// +// This value takes precedence over ENABLE_DECRYPTION. If both are defined, +// the hook function defined using BL_DECRYPT_FN_HOOK is called rather than the +// previously-defined DecryptData() stub function. +// +//***************************************************************************** +//#define BL_DECRYPT_FN_HOOK MyDecryptionFunc + +//***************************************************************************** +// +// Allows an application to force a new firmware download. If hooked, this +// function will be called during boot loader initialization to determine +// whether a firmware update should be performed regardless of whether a valid +// main code image is already present. If the function returns 0, the existing +// main code image is booted (if present), otherwise the boot loader will wait +// for a new firmware image to be downloaded. +// +// unsigned long MyCheckUpdateFunc(void); +// +// This value takes precedence over ENABLE_UPDATE_CHECK} if both are defined. +// If you wish to perform a GPIO check in addition to any other update check +// processing required, the GPIO code must be included within the hook function +// itself. +// +//***************************************************************************** +//#define BL_CHECK_UPDATE_FN_HOOK MyCheckUpdateFunc + +//***************************************************************************** +// +// Allows an application to replace the flash block erase function. If hooked, +// this function will be called whenever a block of flash is to be erased. The +// function must erase the block and wait until the operation has completed. +// The size of the block which will be erased is defined by FLASH_BLOCK_SIZE. +// +// void MyFlashEraseFunc(unsigned long ulBlockAddr); +// +//***************************************************************************** +//#define BL_FLASH_ERASE_FN_HOOK MyFlashEraseFunc + +//***************************************************************************** +// +// Allows an application to replace the flash programming function. If hooked, +// this function will be called to program the flash with firmware image data +// received during download operations. The function must program the supplied +// data and wait until the operation has completed. +// +// void MyFlashProgramFunc(unsigned long ulDstAddr, +// unsigned char *pucSrcData, +// unsigned long ulLength); +// +//***************************************************************************** +//#define BL_FLASH_PROGRAM_FN_HOOK MyFlashProgramFunc + +//***************************************************************************** +// +// Allows an application to replace the flash error clear function. If hooked, +// this function must clear any flash error indicators and prepare to detect +// access violations that may occur in a future erase or program operations. +// +// void MyFlashClearErrorFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_CL_ERR_FN_HOOK MyFlashClearErrorFunc + +//***************************************************************************** +// +// Reports whether or not a flash access violation error has occurred. If +// hooked, this function will be called after flash erase or program +// operations. The return code indicates whether or not an access violation +// error occurred since the last call to the function defined by +// BL_FLASH_CL_ERR_FN_HOOK, with 0 indicating no errors and non-zero indicating +// an error. +// +// unsigned long MyFlashErrorFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_ERROR_FN_HOOK MyFlashErrorFunc + +//***************************************************************************** +// +// Reports the total size of the device flash. If hooked, this function will +// be called to determine the size of the supported flash device. The return +// code is the number of bytes of flash in the device. Note that this does not +// take into account any reserved space defined via the FLASH_RSVD_SPACE value. +// +// unsigned long MyFlashSizeFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_SIZE_FN_HOOK MyFlashSizeFunc + +//***************************************************************************** +// +// Reports the address of the first byte after the end of the device flash. If +// hooked, this function will be called to determine the address of the end of +// valid flash. Note that this does not take into account any reserved space +// defined via the FLASH_RSVD_SPACE value. +// +// unsigned long MyFlashEndFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_END_FN_HOOK MyFlashEndFunc + +//***************************************************************************** +// +// Checks whether the start address and size of an image are valid. If hooked, +// this function will be called when a new firmware download is about to start. +// Parameters provided are the requested start address for the new download +// and, when using protocols which transmit the image length in advance, the +// size of the image that is to be downloaded. The return code will be +// non-zero to indicate that the start address is valid and the image will fit +// in the available space, or 0 if either the address is invalid or the image +// is too large for the device. +// +// unsigned long MyFlashAddrCheckFunc(unsigned long ulAddr, +// unsigned long ulSize); +// +//***************************************************************************** +//#define BL_FLASH_AD_CHECK_FN_HOOK MyFlashAddrCheckFunc + +#endif // __BL_CONFIG_H__ diff --git a/boards/dk-tm4c123g/boot_serial/boot_serial.ewd b/boards/dk-tm4c123g/boot_serial/boot_serial.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/boot_serial.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/boot_serial/boot_serial.ewp b/boards/dk-tm4c123g/boot_serial/boot_serial.ewp new file mode 100644 index 0000000..daa53be --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/boot_serial.ewp @@ -0,0 +1,821 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Source + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_autobaud.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_can.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_check.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_crc32.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_decrypt.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_emac.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_flash.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_i2c.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_main.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_packet.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_ssi.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_startup_ewarm.S + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_uart.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_usb.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_usbfuncs.c + + + diff --git a/boards/dk-tm4c123g/boot_serial/boot_serial.uvopt b/boards/dk-tm4c123g/boot_serial/boot_serial.uvopt new file mode 100644 index 0000000..aa8da10 --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/boot_serial.uvopt @@ -0,0 +1,450 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_serial + 0x4 + ARM-ADS + + 16000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S2 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_autobaud.c + bl_autobaud.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_can.c + bl_can.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_check.c + bl_check.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_crc32.c + bl_crc32.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_decrypt.c + bl_decrypt.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_emac.c + bl_emac.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_flash.c + bl_flash.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_i2c.c + bl_i2c.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_main.c + bl_main.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_packet.c + bl_packet.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_ssi.c + bl_ssi.c + + + 1 + 12 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_startup_rvmdk.S + bl_startup_rvmdk.S + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_uart.c + bl_uart.c + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_usb.c + bl_usb.c + + + 1 + 15 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_usbfuncs.c + bl_usbfuncs.c + + + + + Documentation + 1 + 0 + 0 + + 2 + 16 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + ..\..\..\..\boot_loader\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + ..\..\..\..\boot_loader\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/boot_serial/boot_serial.uvproj b/boards/dk-tm4c123g/boot_serial/boot_serial.uvproj new file mode 100644 index 0000000..22a4a70 --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/boot_serial.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + boot_serial + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(16000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_serial + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + armcc --device DLM -I . -E -o bl_config.inc ..\..\..\..\boot_loader\bl_config.c + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_serial.bin .\rvmdk\boot_serial.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + .;..\..\..\..;..\..\..\..\boot_loader; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + ..\..\..\..\boot_loader\bl_link.sct + + + --entry Reset_Handler + + + + + + + + Source + + + bl_autobaud.c + 1 + ..\..\..\..\boot_loader\bl_autobaud.c + + + bl_can.c + 1 + ..\..\..\..\boot_loader\bl_can.c + + + bl_check.c + 1 + ..\..\..\..\boot_loader\bl_check.c + + + bl_crc32.c + 1 + ..\..\..\..\boot_loader\bl_crc32.c + + + bl_decrypt.c + 1 + ..\..\..\..\boot_loader\bl_decrypt.c + + + bl_emac.c + 1 + ..\..\..\..\boot_loader\bl_emac.c + + + bl_flash.c + 1 + ..\..\..\..\boot_loader\bl_flash.c + + + bl_i2c.c + 1 + ..\..\..\..\boot_loader\bl_i2c.c + + + bl_main.c + 1 + ..\..\..\..\boot_loader\bl_main.c + + + bl_packet.c + 1 + ..\..\..\..\boot_loader\bl_packet.c + + + bl_ssi.c + 1 + ..\..\..\..\boot_loader\bl_ssi.c + + + bl_startup_rvmdk.S + 2 + ..\..\..\..\boot_loader\bl_startup_rvmdk.S + + + bl_uart.c + 1 + ..\..\..\..\boot_loader\bl_uart.c + + + bl_usb.c + 1 + ..\..\..\..\boot_loader\bl_usb.c + + + bl_usbfuncs.c + 1 + ..\..\..\..\boot_loader\bl_usbfuncs.c + + + + + Documentation + + + readme.txt + 5 + ..\..\..\..\boot_loader\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/boot_serial/ccs/.ccsimportspec b/boards/dk-tm4c123g/boot_serial/ccs/.ccsimportspec new file mode 100644 index 0000000..34afca1 --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/ccs/.ccsimportspec @@ -0,0 +1,6 @@ + + + + + + diff --git a/boards/dk-tm4c123g/boot_serial/ccs/.ccsproject b/boards/dk-tm4c123g/boot_serial/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_serial/ccs/.cproject b/boards/dk-tm4c123g/boot_serial/ccs/.cproject new file mode 100644 index 0000000..2fad57f --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_serial/ccs/.project b/boards/dk-tm4c123g/boot_serial/ccs/.project new file mode 100644 index 0000000..6f5cb26 --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/ccs/.project @@ -0,0 +1,115 @@ + + + boot_serial + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_loader/bl_autobaud.c + 1 + SW_ROOT/boot_loader/bl_autobaud.c + + + boot_loader/bl_can.c + 1 + SW_ROOT/boot_loader/bl_can.c + + + boot_loader/bl_check.c + 1 + SW_ROOT/boot_loader/bl_check.c + + + boot_loader/bl_crc32.c + 1 + SW_ROOT/boot_loader/bl_crc32.c + + + boot_loader/bl_decrypt.c + 1 + SW_ROOT/boot_loader/bl_decrypt.c + + + boot_loader/bl_emac.c + 1 + SW_ROOT/boot_loader/bl_emac.c + + + boot_loader/bl_flash.c + 1 + SW_ROOT/boot_loader/bl_flash.c + + + boot_loader/bl_i2c.c + 1 + SW_ROOT/boot_loader/bl_i2c.c + + + boot_loader/bl_link_ccs.cmd + 1 + SW_ROOT/boot_loader/bl_link_ccs.cmd + + + boot_loader/bl_main.c + 1 + SW_ROOT/boot_loader/bl_main.c + + + boot_loader/bl_packet.c + 1 + SW_ROOT/boot_loader/bl_packet.c + + + boot_loader/bl_ssi.c + 1 + SW_ROOT/boot_loader/bl_ssi.c + + + boot_loader/bl_startup_ccs.s + 1 + SW_ROOT/boot_loader/bl_startup_ccs.s + + + boot_loader/bl_uart.c + 1 + SW_ROOT/boot_loader/bl_uart.c + + + boot_loader/bl_usb.c + 1 + SW_ROOT/boot_loader/bl_usb.c + + + boot_loader/bl_usbfuncs.c + 1 + SW_ROOT/boot_loader/bl_usbfuncs.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/boot_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/boot_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/boot_serial/ccs/Debug/boot_serial.bin b/boards/dk-tm4c123g/boot_serial/ccs/Debug/boot_serial.bin new file mode 100644 index 0000000..4e706c3 Binary files /dev/null and b/boards/dk-tm4c123g/boot_serial/ccs/Debug/boot_serial.bin differ diff --git a/boards/dk-tm4c123g/boot_serial/ccs/Debug/boot_serial.out b/boards/dk-tm4c123g/boot_serial/ccs/Debug/boot_serial.out new file mode 100644 index 0000000..a6e1279 Binary files /dev/null and b/boards/dk-tm4c123g/boot_serial/ccs/Debug/boot_serial.out differ diff --git a/boards/dk-tm4c123g/boot_serial/ccs/macros.ini_initial b/boards/dk-tm4c123g/boot_serial/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/boot_serial/ccs/target_config.ccxml b/boards/dk-tm4c123g/boot_serial/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/boot_serial/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_serial/ewarm/Exe/boot_serial.bin b/boards/dk-tm4c123g/boot_serial/ewarm/Exe/boot_serial.bin new file mode 100644 index 0000000..2b9857b Binary files /dev/null and b/boards/dk-tm4c123g/boot_serial/ewarm/Exe/boot_serial.bin differ diff --git a/boards/dk-tm4c123g/boot_serial/ewarm/Exe/boot_serial.out b/boards/dk-tm4c123g/boot_serial/ewarm/Exe/boot_serial.out new file mode 100644 index 0000000..3261afa Binary files /dev/null and b/boards/dk-tm4c123g/boot_serial/ewarm/Exe/boot_serial.out differ diff --git a/boards/dk-tm4c123g/boot_serial/gcc/boot_serial.axf b/boards/dk-tm4c123g/boot_serial/gcc/boot_serial.axf new file mode 100644 index 0000000..4f0b22d Binary files /dev/null and b/boards/dk-tm4c123g/boot_serial/gcc/boot_serial.axf differ diff --git a/boards/dk-tm4c123g/boot_serial/gcc/boot_serial.bin b/boards/dk-tm4c123g/boot_serial/gcc/boot_serial.bin new file mode 100644 index 0000000..43f1b3e Binary files /dev/null and b/boards/dk-tm4c123g/boot_serial/gcc/boot_serial.bin differ diff --git a/boards/dk-tm4c123g/boot_serial/rvmdk/boot_serial.axf b/boards/dk-tm4c123g/boot_serial/rvmdk/boot_serial.axf new file mode 100644 index 0000000..bc0c9d5 Binary files /dev/null and b/boards/dk-tm4c123g/boot_serial/rvmdk/boot_serial.axf differ diff --git a/boards/dk-tm4c123g/boot_serial/rvmdk/boot_serial.bin b/boards/dk-tm4c123g/boot_serial/rvmdk/boot_serial.bin new file mode 100644 index 0000000..16b8bae Binary files /dev/null and b/boards/dk-tm4c123g/boot_serial/rvmdk/boot_serial.bin differ diff --git a/boards/dk-tm4c123g/boot_usb/Makefile b/boards/dk-tm4c123g/boot_usb/Makefile new file mode 100644 index 0000000..46470f5 --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/Makefile @@ -0,0 +1,98 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB Boot Loader. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../boot_loader + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=../../../.. +IPATH+=../../../../boot_loader + +# +# The default rule, which causes the USB Boot Loader to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_usb.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB Boot Loader. +# +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_autobaud.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_can.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_check.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_crc32.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_decrypt.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_emac.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_flash.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_i2c.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_main.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_packet.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_ssi.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_startup_${COMPILER}.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_uart.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_usb.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_usbfuncs.o +${COMPILER}/boot_usb.axf: ../../../../boot_loader/bl_link.ld +SCATTERgcc_boot_usb=../../../../boot_loader/bl_link.ld +ENTRY_boot_usb=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/boot_usb/bl_config.h b/boards/dk-tm4c123g/boot_usb/bl_config.h new file mode 100644 index 0000000..d33b60c --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/bl_config.h @@ -0,0 +1,1137 @@ +//***************************************************************************** +// +// bl_config.h - The configurable parameters of the boot loader. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __BL_CONFIG_H__ +#define __BL_CONFIG_H__ + +//***************************************************************************** +// +// The following defines are used to configure the operation of the boot +// loader. For each define, its interactions with other defines are described. +// First is the dependencies (in other words, the defines that must also be +// defined if it is defined), next are the exclusives (in other words, the +// defines that can not be defined if it is defined), and finally are the +// requirements (in other words, the defines that must be defined if it is +// defined). +// +// The following defines must be defined in order for the boot loader to +// operate: +// +// One of CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, UART_ENABLE_UPDATE, or USB_ENABLE_UPDATE +// APP_START_ADDRESS +// VTABLE_START_ADDRESS +// FLASH_PAGE_SIZE +// STACK_SIZE +// +//***************************************************************************** + +//***************************************************************************** +// +// The frequency of the crystal used to clock the microcontroller. +// +// This defines the crystal frequency used by the microcontroller running the +// boot loader. If this is unknown at the time of production, then use the +// UART_AUTOBAUD feature to properly configure the UART. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define CRYSTAL_FREQ 16000000 + +//***************************************************************************** +// +// The starting address of the application. This must be a multiple of 1024 +// bytes (making it aligned to a page boundary). A vector table is expected at +// this location, and the perceived validity of the vector table (stack located +// in SRAM, reset vector located in flash) is used as an indication of the +// validity of the application image. +// +// The flash image of the boot loader must not be larger than this value. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define APP_START_ADDRESS 0x2800 + +//***************************************************************************** +// +// The address at which the application locates its exception vector table. +// This must be a multiple of 1024 bytes (making it aligned to a page +// boundary). Typically, an application will start with its vector table and +// this value should be set to APP_START_ADDRESS. This option is provided to +// cater for applications which run from external memory which may not be +// accessible by the NVIC (the vector table offset register is only 30 bits +// long). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define VTABLE_START_ADDRESS 0x2800 + +//***************************************************************************** +// +// The size of a single, erasable page in the flash. This must be a power +// of 2. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define FLASH_PAGE_SIZE 0x00000400 + +//***************************************************************************** +// +// The amount of space at the end of flash to reserved. This must be a +// multiple of 1024 bytes (making it aligned to a page boundary). This +// reserved space is not erased when the application is updated, providing +// non-volatile storage that can be used for parameters. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define FLASH_RSVD_SPACE 0x00000800 + +//***************************************************************************** +// +// The number of words of stack space to reserve for the boot loader. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define STACK_SIZE 128 + +//***************************************************************************** +// +// The number of words in the data buffer used for receiving packets. This +// value must be at least 3. If using auto-baud on the UART, this must be at +// least 20. The maximum usable value is 65 (larger values will result in +// unused space in the buffer). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define BUFFER_SIZE 20 + +//***************************************************************************** +// +// Enables updates to the boot loader. Updating the boot loader is an unsafe +// operation since it is not fully fault tolerant (losing power to the device +// part way though could result in the boot loader no longer being present in +// flash). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_BL_UPDATE + +//***************************************************************************** +// +// Enables runtime and download CRC32 checking of the main firmware image. +// If this is defined, the boot loader will scan the main firmware image for +// an image information header (stored immediately above the vector table and +// marked by the words 0xFF01FF02 and 0xFF03FF04). If the header is found and +// the CRC32 value it contains matches that calculated for the image, the +// firmware is run. If the CRC32 does not match or the image information +// is not found, the boot loader retains control and waits for a new download. +// To aid debugging, if this option is used without ENFORCE_CRC being set, the +// image will also be booted if the header is present but the length field is +// set to 0xFFFFFFFF, typically indicating that the firmware file has not been +// run through the post-processing tool which inserts the length and CRC values. +// +// Note that firmware images intended for use with CRC checking must have been +// built with an 8 word image header appended to the top of the vector table +// and the binary must have been processed by a tool such as tools/binpack.exe +// to ensure that the required length (3rd word) and CRC32 (4th word) fields +// are populated in the header. +// +// Depends on: ENFORCE_CRC +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CHECK_CRC + +//***************************************************************************** +// +// This definition may be used alongside CHECK_CRC to remove the debug behavior +// which will allow an image with an uninitialized header to be run. With +// ENFORCE_CRC defined firmware images will only be booted if they contain a +// valid image information header and if the embedded CRC32 in that header +// matches the calculated value. +// +// Depends on: None +// Exclusive of: None +// Requires: CHECK_CRC +// +//***************************************************************************** +//#define ENFORCE_CRC + +//***************************************************************************** +// +// This definition will cause the the boot loader to erase the entire flash on +// updates to the boot loader or to erase the entire application area when the +// application is updated. This erases any unused sections in the flash before +// the firmware is updated. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define FLASH_CODE_PROTECTION + +//***************************************************************************** +// +// Enables the call to decrypt the downloaded data before writing it into +// flash. The decryption routine is empty in the reference boot loader source, +// which simply provides a placeholder for adding an actual decryption +// algorithm. Although this option is retained for backwards compatibility, it +// is recommended that a decryption function be specified using the newer hook +// function mechanism and BL_DECRYPT_FN_HOOK instead. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_DECRYPTION + +//***************************************************************************** +// +// Enables support for the MOSCFAIL handler in the NMI interrupt. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_MOSCFAIL_HANDLER + +//***************************************************************************** +// +// Enables the pin-based forced update check. When enabled, the boot loader +// will go into update mode instead of calling the application if a pin is read +// at a particular polarity, forcing an update operation. In either case, the +// application is still able to return control to the boot loader in order to +// start an update. For applications which need to perform more complex +// checking than is possible using a single GPIO, a hook function may be +// provided using BL_CHECK_UPDATE_FN_HOOK instead. +// +// Depends on: None +// Exclusive of: None +// Requires: FORCED_UPDATE_PERIPH, FORCED_UPDATE_PORT, FORCED_UPDATE_PIN, +// FORCED_UPDATE_POLARITY +// +//***************************************************************************** +//#define ENABLE_UPDATE_CHECK + +//***************************************************************************** +// +// The GPIO module to enable in order to check for a forced update. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// FORCED_UPDATE_PORT. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PERIPH SYSCTL_RCGC2_GPIOB + +//***************************************************************************** +// +// The GPIO port to check for a forced update. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for +// FORCED_UPDATE_PERIPH. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// The pin to check for a forced update. This is a value between 0 and 7. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PIN 4 + +//***************************************************************************** +// +// The polarity of the GPIO pin that results in a forced update. This value +// should be 0 if the pin should be low and 1 if the pin should be high. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_POLARITY 0 + +//***************************************************************************** +// +// This enables a weak pull-up or pull-down for the GPIO pin used in a forced +// update. Only one of FORCED_UPDATE_WPU or FORCED_UPDATE_WPD should be +// defined, or neither if a weak pull-up or pull-down is not required. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_WPU +//#define FORCED_UPDATE_WPD + +//***************************************************************************** +// +// This enables the use of the GPIO_LOCK mechanism for configuration of +// protected GPIO pins (for example JTAG pins). If this value is not defined, +// the locking mechanism will not be used. The only legal values for this +// feature are GPIO_LOCK_KEY for Fury devices and GPIO_LOCK_KEY_DD for all +// other devices except Sandstorm devices, which do not support this feature. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_KEY GPIO_LOCK_KEY +//#define FORCED_UPDATE_KEY GPIO_LOCK_KEY_DD + +//***************************************************************************** +// +// Selects the UART as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: UART_AUTOBAUD or UART_FIXED_BAUDRATE, BUFFER_SIZE +// +//***************************************************************************** +//#define UART_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables automatic baud rate detection. This can be used if the crystal +// frequency is unknown, or if operation at different baud rates is desired. +// +// Depends on: UART_ENABLE_UPDATE +// Exclusive of: UART_FIXED_BAUDRATE +// Requires: None +// +//***************************************************************************** +//#define UART_AUTOBAUD + +//***************************************************************************** +// +// Selects the baud rate to be used for the UART. +// +// Depends on: UART_ENABLE_UPDATE, CRYSTAL_FREQ +// Exclusive of: UART_AUTOBAUD +// Requires: None +// +//***************************************************************************** +//#define UART_FIXED_BAUDRATE 115200 + +//***************************************************************************** +// +// Selects the SSI port as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: BUFFER_SIZE +// +//***************************************************************************** +//#define SSI_ENABLE_UPDATE + +//***************************************************************************** +// +// Selects the I2C port as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: I2C_SLAVE_ADDR, BUFFER_SIZE +// +//***************************************************************************** +//#define I2C_ENABLE_UPDATE + +//***************************************************************************** +// +// Specifies the I2C address of the boot loader. +// +// Depends on: I2C_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define I2C_SLAVE_ADDR 0x42 + +//***************************************************************************** +// +// Selects Ethernet update via the BOOTP/TFTP protocol. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, I2C_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: CRYSTAL_FREQ +// +//***************************************************************************** +//#define ENET_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables the use of the Ethernet status LED outputs to indicate traffic and +// connection status. +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_ENABLE_LEDS + +//***************************************************************************** +// +// Specifies the hard coded MAC address for the Ethernet interface. There are +// six individual values (ENET_MAC_ADDR0 through ENET_MAC_ADDR5) that provide +// the six bytes of the MAC address, where ENET_MAC_ADDR0 though ENET_MAC_ADDR2 +// provide the organizationally unique identifier (OUI) and ENET_MAC_ADDR3 +// through ENET_MAC_ADDR5 provide the extension identifier. If these values +// are not provided, the MAC address will be extracted from the user registers. +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_MAC_ADDR0 0x00 +//#define ENET_MAC_ADDR1 0x00 +//#define ENET_MAC_ADDR2 0x00 +//#define ENET_MAC_ADDR3 0x00 +//#define ENET_MAC_ADDR4 0x00 +//#define ENET_MAC_ADDR5 0x00 + +//***************************************************************************** +// +// Specifies the name of the BOOTP server from which to request information. +// The use of this specifier allows a board-specific BOOTP server to co-exist +// on a network with the DHCP server that may be part of the network +// infrastructure. The BOOTP server provided by Texas Instruments requires +// that this be set to "stellaris". +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_BOOTP_SERVER "stellaris" + +//***************************************************************************** +// +// Selects USB update via Device Firmware Update class. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, UART_ENABLE_UPDATE, +// Requires: CRYSTAL_FREQ, USB_VENDOR_ID, USB_PRODUCT_ID, USB_DEVICE_ID, +// USB_MAX_POWER +// +//***************************************************************************** +#define USB_ENABLE_UPDATE + +//***************************************************************************** +// +// The USB vendor ID published by the DFU device. This value is the TI +// Tiva vendor ID. Change this to the vendor ID you have been assigned by the +// USB-IF. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_VENDOR_ID 0x1cbe + +//***************************************************************************** +// +// The USB device ID published by the DFU device. If you are using your own +// vendor ID, chose a device ID that is different from the ID you use in +// non-update operation. If you have sublicensed TI's vendor ID, you must +// use an assigned product ID here. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_PRODUCT_ID 0x00FF + +//***************************************************************************** +// +// Selects the BCD USB device release number published in the device +// descriptor. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DEVICE_ID 0x0001 + +//***************************************************************************** +// +// Sets the maximum power consumption that the DFU device will report to the +// USB host in the configuration descriptor. Units are milliamps. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_MAX_POWER 150 + +//***************************************************************************** +// +// Specifies whether the DFU device reports to the host that it is self-powered +// (defined as 0) or bus-powered (defined as 1). +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_BUS_POWERED 1 + +//***************************************************************************** +// +// Specifies whether the target board uses a multiplexer to select between USB +// host and device modes. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_MUX_PERIPH, USB_MUX_PORT, USB_MUX_PIN, USB_MUX_DEVICE +// +//***************************************************************************** +//#define USB_HAS_MUX + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used to select +// between USB host and device modes. The value is of the form +// SYSCTL_RCGC2_GPIOx, where GPIOx represents the required GPIO port. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PERIPH SYSCTL_RCGC2_GPIOH + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used to select between +// USB host and device modes. The value is of the form GPIO_PORTx_BASE, where +// PORTx represents the required GPIO port. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PORT GPIO_PORTH_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used to select between USB host and device +// modes. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PIN 2 + +//***************************************************************************** +// +// Specifies the state of the GPIO pin required to select USB device-mode +// operation. Valid values are 0 (low) or 1 (high). +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_DEVICE 1 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for VBUS. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_VBUS_PERIPH, USB_VBUS_PORT, USB_VBUS_PIN +// +//***************************************************************************** +#define USB_VBUS_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for VBUS. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_VBUS_PERIPH SYSCTL_RCGCGPIO_R1 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for VBUS. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_VBUS_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for VBUS. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_VBUS_PIN 1 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for ID. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_ID_PERIPH, USB_ID_PORT, USB_ID_PIN +// +//***************************************************************************** +#define USB_ID_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for ID. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_ID_PERIPH SYSCTL_RCGCGPIO_R1 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for ID. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_ID_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for ID. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_ID_PIN 0 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for DP. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_DP_PERIPH, USB_DP_PORT, USB_DP_PIN +// +//***************************************************************************** +#define USB_DP_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for DP. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DP_PERIPH SYSCTL_RCGCGPIO_R10 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for DP. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DP_PORT GPIO_PORTL_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for DP. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DP_PIN 6 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for DM. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_DM_PERIPH, USB_DM_PORT, USB_DM_PIN +// +//***************************************************************************** +#define USB_DM_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for DM. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DM_PERIPH SYSCTL_RCGCGPIO_R10 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for DM. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DM_PORT GPIO_PORTL_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for DM. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DM_PIN 7 + +//***************************************************************************** +// +// Selects an update via the CAN port. +// +// Depends on: None +// Exclusive of: ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: CAN_RX_PERIPH, CAN_RX_PORT, CAN_RX_PIN, CAN_TX_PERIPH, +// CAN_TX_PORT, CAN_TX_PIN, CAN_BIT_RATE, CRYSTAL_FREQ. +// +//***************************************************************************** +//#define CAN_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables the UART to CAN bridging for use when the CAN port is selected for +// communicating with the boot loader. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_UART_BRIDGE + +//***************************************************************************** +// +// The GPIO module to enable in order to configure the CAN0 Rx pin. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// CAN_RX_PORT. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PERIPH SYSCTL_RCGC2_GPIOA + +//***************************************************************************** +// +// The GPIO port used to configure the CAN0 Rx pin. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for CAN_RX_PERIPH. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PORT GPIO_PORTA_BASE + +//***************************************************************************** +// +// The GPIO pin that is shared with the CAN0 Rx pin. This is a value between 0 +// and 7. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PIN 4 + +//***************************************************************************** +// +// The GPIO module to enable in order to configure the CAN0 Tx pin. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// CAN_TX_PORT. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PERIPH SYSCTL_RCGC2_GPIOA + +//***************************************************************************** +// +// The GPIO port used to configure the CAN0 Tx pin. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for CAN_TX_PERIPH. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PORT GPIO_PORTA_BASE + +//***************************************************************************** +// +// The GPIO pin that is shared with the CAN0 Tx pin. This is a value between 0 +// and 7. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PIN 5 + +//***************************************************************************** +// +// The bit rate used on the CAN bus. This must be one of 20000, 50000, 125000, +// 250000, 500000, or 1000000. The CAN bit rate must be less than or equal to +// the crystal frequency divided by 8 (CRYSTAL_FREQ / 8). +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_BIT_RATE 1000000 + +//***************************************************************************** +// +// Performs application-specific low level hardware initialization on system +// reset. If hooked, this function will be called immediately after the boot +// loader code relocation completes. An application may perform any required +// low-level hardware initialization during this function. Note that the +// system clock has not been set when this function is called. Initialization +// that assumes the system clock is set may be performed in the BL_INIT_FN_HOOK +// function instead. +// +// void MyHwInitFunc(void); +// +//***************************************************************************** +//#define BL_HW_INIT_FN_HOOK MyHwInitFunc + +//***************************************************************************** +// +// Performs application-specific initialization on system reset. If hooked, +// this function will be called during boot loader initialization to perform +// any board- or application-specific initialization which is required. The +// function is called following a reset immediately after the selected boot +// loader peripheral has been configured and the system clock has been set. +// +// void MyInitFunc(void); +// +//***************************************************************************** +//#define BL_INIT_FN_HOOK MyInitFunc + +//***************************************************************************** +// +// Performs application-specific reinitialization on boot loader entry via SVC. +// If hooked, this function will be called during boot loader reinitialization +// to perform any board- or application-specific initialization which is +// required. The function is called following boot loader entry from an +// application, after any system clock rate adjustments have been made. +// +// void MyReinitFunc(void); +// +//***************************************************************************** +//#define BL_REINIT_FN_HOOK MyReinitFunc + +//***************************************************************************** +// +// Informs an application that a download is starting. If hooked, this +// function will be called when a firmware download is about to begin. The +// function is called after the first data packet of the download is received +// but before it has been written to flash. +// +// void MyStartFunc(void); +// +//***************************************************************************** +//#define BL_START_FN_HOOK MyStartFunc + +//***************************************************************************** +// +// Informs an application of download progress. If hooked, this function will +// be called periodically during a firmware download to provide progress +// information. The function is called after each data packet is received from +// the host. Parameters provide the number of bytes of data received and, in +// cases other than Ethernet update, the expected total number of bytes in the +// download (the TFTP protocol used by the Ethernet boot loader does not send +// the final image size before the download starts so in this case the ulTotal +// parameter is set to 0 to indicate that the size is unknown). +// +// void MyProgressFunc(unsigned long ulCompleted, unsigned long ulTotal); +// +//***************************************************************************** +//#define BL_PROGRESS_FN_HOOK MyProgressFunc + +//***************************************************************************** +// +// Informs an application that a download has completed. If hooked, this +// function will be called when a firmware download has just completed. The +// function is called after the final data packet of the download has been +// written to flash. +// +// void MyEndFunc(void); +// +//***************************************************************************** +//#define BL_END_FN_HOOK MyEndFunc + +//***************************************************************************** +// +// Allows an application to perform in-place data decryption during download. +// If hooked, this function will be called to perform in-place decryption of +// each data packet received during a firmware download. +// +// void MyDecryptionFunc(unsigned char *pucBuffer, unsigned long ulSize); +// +// This value takes precedence over ENABLE_DECRYPTION. If both are defined, +// the hook function defined using BL_DECRYPT_FN_HOOK is called rather than the +// previously-defined DecryptData() stub function. +// +//***************************************************************************** +//#define BL_DECRYPT_FN_HOOK MyDecryptionFunc + +//***************************************************************************** +// +// Allows an application to force a new firmware download. If hooked, this +// function will be called during boot loader initialization to determine +// whether a firmware update should be performed regardless of whether a valid +// main code image is already present. If the function returns 0, the existing +// main code image is booted (if present), otherwise the boot loader will wait +// for a new firmware image to be downloaded. +// +// unsigned long MyCheckUpdateFunc(void); +// +// This value takes precedence over ENABLE_UPDATE_CHECK} if both are defined. +// If you wish to perform a GPIO check in addition to any other update check +// processing required, the GPIO code must be included within the hook function +// itself. +// +//***************************************************************************** +//#define BL_CHECK_UPDATE_FN_HOOK MyCheckUpdateFunc + +//***************************************************************************** +// +// Allows an application to replace the flash block erase function. If hooked, +// this function will be called whenever a block of flash is to be erased. The +// function must erase the block and wait until the operation has completed. +// The size of the block which will be erased is defined by FLASH_BLOCK_SIZE. +// +// void MyFlashEraseFunc(unsigned long ulBlockAddr); +// +//***************************************************************************** +//#define BL_FLASH_ERASE_FN_HOOK MyFlashEraseFunc + +//***************************************************************************** +// +// Allows an application to replace the flash programming function. If hooked, +// this function will be called to program the flash with firmware image data +// received during download operations. The function must program the supplied +// data and wait until the operation has completed. +// +// void MyFlashProgramFunc(unsigned long ulDstAddr, +// unsigned char *pucSrcData, +// unsigned long ulLength); +// +//***************************************************************************** +//#define BL_FLASH_PROGRAM_FN_HOOK MyFlashProgramFunc + +//***************************************************************************** +// +// Allows an application to replace the flash error clear function. If hooked, +// this function must clear any flash error indicators and prepare to detect +// access violations that may occur in a future erase or program operations. +// +// void MyFlashClearErrorFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_CL_ERR_FN_HOOK MyFlashClearErrorFunc + +//***************************************************************************** +// +// Reports whether or not a flash access violation error has occurred. If +// hooked, this function will be called after flash erase or program +// operations. The return code indicates whether or not an access violation +// error occurred since the last call to the function defined by +// BL_FLASH_CL_ERR_FN_HOOK, with 0 indicating no errors and non-zero indicating +// an error. +// +// unsigned long MyFlashErrorFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_ERROR_FN_HOOK MyFlashErrorFunc + +//***************************************************************************** +// +// Reports the total size of the device flash. If hooked, this function will +// be called to determine the size of the supported flash device. The return +// code is the number of bytes of flash in the device. Note that this does not +// take into account any reserved space defined via the FLASH_RSVD_SPACE value. +// +// unsigned long MyFlashSizeFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_SIZE_FN_HOOK MyFlashSizeFunc + +//***************************************************************************** +// +// Reports the address of the first byte after the end of the device flash. If +// hooked, this function will be called to determine the address of the end of +// valid flash. Note that this does not take into account any reserved space +// defined via the FLASH_RSVD_SPACE value. +// +// unsigned long MyFlashEndFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_END_FN_HOOK MyFlashEndFunc + +//***************************************************************************** +// +// Checks whether the start address and size of an image are valid. If hooked, +// this function will be called when a new firmware download is about to start. +// Parameters provided are the requested start address for the new download +// and, when using protocols which transmit the image length in advance, the +// size of the image that is to be downloaded. The return code will be +// non-zero to indicate that the start address is valid and the image will fit +// in the available space, or 0 if either the address is invalid or the image +// is too large for the device. +// +// unsigned long MyFlashAddrCheckFunc(unsigned long ulAddr, +// unsigned long ulSize); +// +//***************************************************************************** +//#define BL_FLASH_AD_CHECK_FN_HOOK MyFlashAddrCheckFunc + +#endif // __BL_CONFIG_H__ diff --git a/boards/dk-tm4c123g/boot_usb/boot_usb.ewd b/boards/dk-tm4c123g/boot_usb/boot_usb.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/boot_usb.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/boot_usb/boot_usb.ewp b/boards/dk-tm4c123g/boot_usb/boot_usb.ewp new file mode 100644 index 0000000..a080a18 --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/boot_usb.ewp @@ -0,0 +1,821 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Source + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_autobaud.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_can.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_check.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_crc32.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_decrypt.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_emac.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_flash.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_i2c.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_main.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_packet.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_ssi.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_startup_ewarm.S + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_uart.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_usb.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_usbfuncs.c + + + diff --git a/boards/dk-tm4c123g/boot_usb/boot_usb.uvopt b/boards/dk-tm4c123g/boot_usb/boot_usb.uvopt new file mode 100644 index 0000000..565fa51 --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/boot_usb.uvopt @@ -0,0 +1,450 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_usb + 0x4 + ARM-ADS + + 16000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S2 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_autobaud.c + bl_autobaud.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_can.c + bl_can.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_check.c + bl_check.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_crc32.c + bl_crc32.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_decrypt.c + bl_decrypt.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_emac.c + bl_emac.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_flash.c + bl_flash.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_i2c.c + bl_i2c.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_main.c + bl_main.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_packet.c + bl_packet.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_ssi.c + bl_ssi.c + + + 1 + 12 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_startup_rvmdk.S + bl_startup_rvmdk.S + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_uart.c + bl_uart.c + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_usb.c + bl_usb.c + + + 1 + 15 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_usbfuncs.c + bl_usbfuncs.c + + + + + Documentation + 1 + 0 + 0 + + 2 + 16 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + ..\..\..\..\boot_loader\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + ..\..\..\..\boot_loader\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/boot_usb/boot_usb.uvproj b/boards/dk-tm4c123g/boot_usb/boot_usb.uvproj new file mode 100644 index 0000000..5ae45d8 --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/boot_usb.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + boot_usb + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(16000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_usb + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + armcc --device DLM -I . -E -o bl_config.inc ..\..\..\..\boot_loader\bl_config.c + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_usb.bin .\rvmdk\boot_usb.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + .;..\..\..\..;..\..\..\..\boot_loader; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + ..\..\..\..\boot_loader\bl_link.sct + + + --entry Reset_Handler + + + + + + + + Source + + + bl_autobaud.c + 1 + ..\..\..\..\boot_loader\bl_autobaud.c + + + bl_can.c + 1 + ..\..\..\..\boot_loader\bl_can.c + + + bl_check.c + 1 + ..\..\..\..\boot_loader\bl_check.c + + + bl_crc32.c + 1 + ..\..\..\..\boot_loader\bl_crc32.c + + + bl_decrypt.c + 1 + ..\..\..\..\boot_loader\bl_decrypt.c + + + bl_emac.c + 1 + ..\..\..\..\boot_loader\bl_emac.c + + + bl_flash.c + 1 + ..\..\..\..\boot_loader\bl_flash.c + + + bl_i2c.c + 1 + ..\..\..\..\boot_loader\bl_i2c.c + + + bl_main.c + 1 + ..\..\..\..\boot_loader\bl_main.c + + + bl_packet.c + 1 + ..\..\..\..\boot_loader\bl_packet.c + + + bl_ssi.c + 1 + ..\..\..\..\boot_loader\bl_ssi.c + + + bl_startup_rvmdk.S + 2 + ..\..\..\..\boot_loader\bl_startup_rvmdk.S + + + bl_uart.c + 1 + ..\..\..\..\boot_loader\bl_uart.c + + + bl_usb.c + 1 + ..\..\..\..\boot_loader\bl_usb.c + + + bl_usbfuncs.c + 1 + ..\..\..\..\boot_loader\bl_usbfuncs.c + + + + + Documentation + + + readme.txt + 5 + ..\..\..\..\boot_loader\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/boot_usb/ccs/.ccsimportspec b/boards/dk-tm4c123g/boot_usb/ccs/.ccsimportspec new file mode 100644 index 0000000..34afca1 --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/ccs/.ccsimportspec @@ -0,0 +1,6 @@ + + + + + + diff --git a/boards/dk-tm4c123g/boot_usb/ccs/.ccsproject b/boards/dk-tm4c123g/boot_usb/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_usb/ccs/.cproject b/boards/dk-tm4c123g/boot_usb/ccs/.cproject new file mode 100644 index 0000000..e3732e0 --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_usb/ccs/.project b/boards/dk-tm4c123g/boot_usb/ccs/.project new file mode 100644 index 0000000..94250c3 --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/ccs/.project @@ -0,0 +1,115 @@ + + + boot_usb + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_loader/bl_autobaud.c + 1 + SW_ROOT/boot_loader/bl_autobaud.c + + + boot_loader/bl_can.c + 1 + SW_ROOT/boot_loader/bl_can.c + + + boot_loader/bl_check.c + 1 + SW_ROOT/boot_loader/bl_check.c + + + boot_loader/bl_crc32.c + 1 + SW_ROOT/boot_loader/bl_crc32.c + + + boot_loader/bl_decrypt.c + 1 + SW_ROOT/boot_loader/bl_decrypt.c + + + boot_loader/bl_emac.c + 1 + SW_ROOT/boot_loader/bl_emac.c + + + boot_loader/bl_flash.c + 1 + SW_ROOT/boot_loader/bl_flash.c + + + boot_loader/bl_i2c.c + 1 + SW_ROOT/boot_loader/bl_i2c.c + + + boot_loader/bl_link_ccs.cmd + 1 + SW_ROOT/boot_loader/bl_link_ccs.cmd + + + boot_loader/bl_main.c + 1 + SW_ROOT/boot_loader/bl_main.c + + + boot_loader/bl_packet.c + 1 + SW_ROOT/boot_loader/bl_packet.c + + + boot_loader/bl_ssi.c + 1 + SW_ROOT/boot_loader/bl_ssi.c + + + boot_loader/bl_startup_ccs.s + 1 + SW_ROOT/boot_loader/bl_startup_ccs.s + + + boot_loader/bl_uart.c + 1 + SW_ROOT/boot_loader/bl_uart.c + + + boot_loader/bl_usb.c + 1 + SW_ROOT/boot_loader/bl_usb.c + + + boot_loader/bl_usbfuncs.c + 1 + SW_ROOT/boot_loader/bl_usbfuncs.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/boot_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/boot_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/boot_usb/ccs/Debug/boot_usb.bin b/boards/dk-tm4c123g/boot_usb/ccs/Debug/boot_usb.bin new file mode 100644 index 0000000..304fed8 Binary files /dev/null and b/boards/dk-tm4c123g/boot_usb/ccs/Debug/boot_usb.bin differ diff --git a/boards/dk-tm4c123g/boot_usb/ccs/Debug/boot_usb.out b/boards/dk-tm4c123g/boot_usb/ccs/Debug/boot_usb.out new file mode 100644 index 0000000..8a886ed Binary files /dev/null and b/boards/dk-tm4c123g/boot_usb/ccs/Debug/boot_usb.out differ diff --git a/boards/dk-tm4c123g/boot_usb/ccs/macros.ini_initial b/boards/dk-tm4c123g/boot_usb/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/boot_usb/ccs/target_config.ccxml b/boards/dk-tm4c123g/boot_usb/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/boot_usb/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/boot_usb/ewarm/Exe/boot_usb.bin b/boards/dk-tm4c123g/boot_usb/ewarm/Exe/boot_usb.bin new file mode 100644 index 0000000..dd07b1d Binary files /dev/null and b/boards/dk-tm4c123g/boot_usb/ewarm/Exe/boot_usb.bin differ diff --git a/boards/dk-tm4c123g/boot_usb/ewarm/Exe/boot_usb.out b/boards/dk-tm4c123g/boot_usb/ewarm/Exe/boot_usb.out new file mode 100644 index 0000000..f902ddc Binary files /dev/null and b/boards/dk-tm4c123g/boot_usb/ewarm/Exe/boot_usb.out differ diff --git a/boards/dk-tm4c123g/boot_usb/gcc/boot_usb.axf b/boards/dk-tm4c123g/boot_usb/gcc/boot_usb.axf new file mode 100644 index 0000000..accdbe2 Binary files /dev/null and b/boards/dk-tm4c123g/boot_usb/gcc/boot_usb.axf differ diff --git a/boards/dk-tm4c123g/boot_usb/gcc/boot_usb.bin b/boards/dk-tm4c123g/boot_usb/gcc/boot_usb.bin new file mode 100644 index 0000000..ed269be Binary files /dev/null and b/boards/dk-tm4c123g/boot_usb/gcc/boot_usb.bin differ diff --git a/boards/dk-tm4c123g/boot_usb/rvmdk/boot_usb.axf b/boards/dk-tm4c123g/boot_usb/rvmdk/boot_usb.axf new file mode 100644 index 0000000..4830de5 Binary files /dev/null and b/boards/dk-tm4c123g/boot_usb/rvmdk/boot_usb.axf differ diff --git a/boards/dk-tm4c123g/boot_usb/rvmdk/boot_usb.bin b/boards/dk-tm4c123g/boot_usb/rvmdk/boot_usb.bin new file mode 100644 index 0000000..1175813 Binary files /dev/null and b/boards/dk-tm4c123g/boot_usb/rvmdk/boot_usb.bin differ diff --git a/boards/dk-tm4c123g/can/Makefile b/boards/dk-tm4c123g/can/Makefile new file mode 100644 index 0000000..e177556 --- /dev/null +++ b/boards/dk-tm4c123g/can/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the can example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the can example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/can.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the can example. +# +${COMPILER}/can.axf: ${COMPILER}/can.o +${COMPILER}/can.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/can.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/can.axf: ${COMPILER}/uartstdio.o +${COMPILER}/can.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/can.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/can.axf: can.ld +SCATTERgcc_can=can.ld +ENTRY_can=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/can/can.c b/boards/dk-tm4c123g/can/can.c new file mode 100644 index 0000000..ad7ca2d --- /dev/null +++ b/boards/dk-tm4c123g/can/can.c @@ -0,0 +1,847 @@ +//***************************************************************************** +// +// can.c - Simple CAN example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_can.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/fpu.h" +#include "driverlib/can.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" +#include "utils/uartstdio.h" +#include "driverlib/interrupt.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

CAN Example (can)

+//! +//! This example application utilizes CAN to send characters back and forth +//! between two boards. It uses the UART to read / write the characters to +//! the UART terminal. It also uses the graphical display on the board to show +//! the last character transmited / received. Error handling is also included. +//! +//! CAN HARDWARE SETUP: +//! +//! To use this example you will need to hook up two DK-TM4C123G boards +//! together in a CAN network. This involves hooking the CANH screw terminals +//! together and the CANL terminals together. In addition 120ohm termination +//! resistors will need to be added to the edges of the network between CANH +//! and CANL. In the two board setup this means hooking a 120 ohm resistor +//! between CANH and CANL on both boards. +//! +//! See diagram below for visual. '---' represents wire. +//! +//! \verbatim +//! CANH--+--------------------------+--CANH +//! | | +//! .-. .-. +//! | |120ohm | |120ohm +//! | | | | +//! '-' '-' +//! | | +//! CANL--+--------------------------+--CANL +//! \endverbatim +//! +//! SOFTWARE SETUP: +//! +//! Once the hardware connections are setup connect both boards to the computer +//! via the In-Circuit Debug Interface USB port next to the graphical display. +//! Attach a UART terminal to each board configured 115,200 baud, 8-n-1 mode. +//! +//! Anything you type into one terminal will show up in the other terminal and +//! vice versa. The last character sent / received will also be displayed on +//! the graphical display on the board. +// +//***************************************************************************** + +//***************************************************************************** +// +// A counter that keeps track of the number of times the TX & RX interrupt has +// occurred, which should match the number of messages that were transmitted / +// received. +// +//***************************************************************************** +volatile uint32_t g_ui32RXMsgCount = 0; +volatile uint32_t g_ui32TXMsgCount = 0; + +//***************************************************************************** +// +// A flag for the interrupt handler to indicate that a message was received. +// +//***************************************************************************** +volatile bool g_bRXFlag = 0; + +//***************************************************************************** +// +// A global to keep track of the error flags that have been thrown so they may +// be processed. This is necessary because reading the error register clears +// the flags, so it is necessary to save them somewhere for processing. +// +//***************************************************************************** +volatile uint32_t g_ui32ErrFlag = 0; + +//***************************************************************************** +// +// CAN message Objects for data being sent / received +// +//***************************************************************************** +tCANMsgObject g_sCAN0RxMessage; +tCANMsgObject g_sCAN0TxMessage; + +//***************************************************************************** +// +// Message Identifiers and Objects +// RXID is set to 0 so all messages are received +// +//***************************************************************************** +#define CAN0RXID 0 +#define RXOBJECT 1 +#define CAN0TXID 2 +#define TXOBJECT 2 + +//***************************************************************************** +// +// Variables to hold character being sent / reveived +// +//***************************************************************************** +uint8_t g_ui8TXMsgData; +uint8_t g_ui8RXMsgData; + +//***************************************************************************** +// +// Global context for text printed on graphics display +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Screen line deffinitions, offsets from top in pixels +// +//***************************************************************************** +#define SCREENLINE1 10 +#define SCREENLINE2 20 +#define SCREENLINE3 30 +#define SCREENLINE4 40 +#define SCREENLINE5 50 + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// CAN 0 Interrupt Handler. It checks for the cause of the interrupt, and +// maintains a count of all messages that have been transmitted / received +// +//***************************************************************************** +void +CAN0IntHandler(void) +{ + uint32_t ui32Status; + + // + // Read the CAN interrupt status to find the cause of the interrupt + // + // CAN_INT_STS_CAUSE register values + // 0x0000 = No Interrupt Pending + // 0x0001-0x0020 = Number of message object that caused the interrupt + // 0x8000 = Status interrupt + // all other numbers are reserved and have no meaning in this system + // + ui32Status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE); + + // + // If this was a status interrupt acknowledge it by reading the CAN + // controller status register. + // + if(ui32Status == CAN_INT_INTID_STATUS) + { + // + // Read the controller status. This will return a field of status + // error bits that can indicate various errors. Refer to the + // API documentation for details about the error status bits. + // The act of reading this status will clear the interrupt. + // + ui32Status = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL); + + // + // Add ERROR flags to list of current errors. To be handled + // later, because it would take too much time here in the + // interrupt. + // + g_ui32ErrFlag |= ui32Status; + } + + // + // Check if the cause is message object RXOBJECT, which we are using + // for receiving messages. + // + else if(ui32Status == RXOBJECT) + { + // + // Getting to this point means that the RX interrupt occurred on + // message object RXOBJECT, and the message reception is complete. + // Clear the message object interrupt. + // + CANIntClear(CAN0_BASE, RXOBJECT); + + // + // Increment a counter to keep track of how many messages have been + // received. In a real application this could be used to set flags to + // indicate when a message is received. + // + g_ui32RXMsgCount++; + + // + // Set flag to indicate received message is pending. + // + g_bRXFlag = true; + + // + // Since a message was received, clear any error flags. + // This is done because before the message is received it triggers + // a Status Interrupt for RX complete. by clearing the flag here we + // prevent unnecessary error handling from happeneing + // + g_ui32ErrFlag = 0; + } + + // + // Check if the cause is message object TXOBJECT, which we are using + // for transmitting messages. + // + else if(ui32Status == TXOBJECT) + { + // + // Getting to this point means that the TX interrupt occurred on + // message object TXOBJECT, and the message reception is complete. + // Clear the message object interrupt. + // + CANIntClear(CAN0_BASE, TXOBJECT); + + // + // Increment a counter to keep track of how many messages have been + // transmitted. In a real application this could be used to set + // flags to indicate when a message is transmitted. + // + g_ui32TXMsgCount++; + + // + // Since a message was transmitted, clear any error flags. + // This is done because before the message is transmitted it triggers + // a Status Interrupt for TX complete. by clearing the flag here we + // prevent unnecessary error handling from happeneing + // + g_ui32ErrFlag = 0; + } + + // + // Otherwise, something unexpected caused the interrupt. This should + // never happen. + // + else + { + // + // Spurious interrupt handling can go here. + // + } +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// Setup CAN0 to both send and receive at 500KHz. +// Interrupts on +// Use PE4 / PE5 +// +//***************************************************************************** +void +InitCAN0(void) +{ + // + // For this example CAN0 is used with RX and TX pins on port E4 and E5. + // GPIO port E needs to be enabled so these pins can be used. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); + + // + // Configure the GPIO pin muxing to select CAN0 functions for these pins. + // This step selects which alternate function is available for these pins. + // + GPIOPinConfigure(GPIO_PE4_CAN0RX); + GPIOPinConfigure(GPIO_PE5_CAN0TX); + + // + // Enable the alternate function on the GPIO pins. The above step selects + // which alternate function is available. This step actually enables the + // alternate function instead of GPIO for these pins. + // + GPIOPinTypeCAN(GPIO_PORTE_BASE, GPIO_PIN_4 | GPIO_PIN_5); + + // + // The GPIO port and pins have been set up for CAN. The CAN peripheral + // must be enabled. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); + + // + // Initialize the CAN controller + // + CANInit(CAN0_BASE); + + // + // Set up the bit rate for the CAN bus. This function sets up the CAN + // bus timing for a nominal configuration. You can achieve more control + // over the CAN bus timing by using the function CANBitTimingSet() instead + // of this one, if needed. + // In this example, the CAN bus is set to 500 kHz. + // + CANBitRateSet(CAN0_BASE, SysCtlClockGet(), 500000); + + // + // Enable interrupts on the CAN peripheral. This example uses static + // allocation of interrupt handlers which means the name of the handler + // is in the vector table of startup code. + // + CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); + + // + // Enable the CAN interrupt on the processor (NVIC). + // + IntEnable(INT_CAN0); + + // + // Enable the CAN for operation. + // + CANEnable(CAN0_BASE); + + // + // Initialize a message object to be used for receiving CAN messages with + // any CAN ID. In order to receive any CAN ID, the ID and mask must both + // be set to 0, and the ID filter enabled. + // + g_sCAN0RxMessage.ui32MsgID = CAN0RXID; + g_sCAN0RxMessage.ui32MsgIDMask = 0; + g_sCAN0RxMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER; + g_sCAN0RxMessage.ui32MsgLen = sizeof(g_ui8RXMsgData); + + // + // Now load the message object into the CAN peripheral. Once loaded the + // CAN will receive any message on the bus, and an interrupt will occur. + // Use message object RXOBJECT for receiving messages (this is not the + //same as the CAN ID which can be any value in this example). + // + CANMessageSet(CAN0_BASE, RXOBJECT, &g_sCAN0RxMessage, MSG_OBJ_TYPE_RX); + + // + // Initialize the message object that will be used for sending CAN + // messages. The message will be 1 bytes that will contain the character + // received from the other controller. Initially it will be set to 0. + // + g_ui8TXMsgData = 0; + g_sCAN0TxMessage.ui32MsgID = CAN0TXID; + g_sCAN0TxMessage.ui32MsgIDMask = 0; + g_sCAN0TxMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE; + g_sCAN0TxMessage.ui32MsgLen = sizeof(g_ui8TXMsgData); + g_sCAN0TxMessage.pui8MsgData = (uint8_t *)&g_ui8TXMsgData; +} + +//***************************************************************************** +// +// Set up the OLED Graphical Display +// +//***************************************************************************** +void +InitGraphics(void) +{ + tRectangle sRect; + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top 24 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "CAN Example", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + + // + // Flush any cached drawing operations. + // + GrFlush(&g_sContext); +} + +//***************************************************************************** +// +// Can ERROR handling. When a message is received if there is an erro it is +// saved to g_ui32ErrFlag, the Error Flag Set. Below the flags are checked +// and cleared. It is left up to the user to add handling fuctionality if so +// desiered. +// +// For more information on the error flags please see the CAN section of the +// microcontroller datasheet. +// +// NOTE: you may experience errors during setup when only one board is powered +// on. This is caused by one board sending signals and there not being another +// board there to acknoledge it. Dont worry about these errors, they can be +// disregarded. +// +//***************************************************************************** +void +CANErrorHandler(void) +{ + // + // CAN controller has entered a Bus Off state. + // + if(g_ui32ErrFlag & CAN_STATUS_BUS_OFF) + { + // + // Handle Error Condition here + // + UARTprintf(" ERROR: CAN_STATUS_BUS_OFF \n"); + + // + // Clear CAN_STATUS_BUS_OFF Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_BUS_OFF); + + } + + // + // CAN controller error level has reached warning level. + // + if(g_ui32ErrFlag & CAN_STATUS_EWARN) + { + // + // Handle Error Condition here + // + //UARTprintf(" ERROR: CAN_STATUS_EWARN \n"); + + // + // Clear CAN_STATUS_EWARN Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_EWARN); + } + + // + // CAN controller error level has reached error passive level. + // + if(g_ui32ErrFlag & CAN_STATUS_EPASS) + { + // + // Handle Error Condition here + // + + // + // Clear CAN_STATUS_EPASS Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_EPASS); + } + + // + // A message was received successfully since the last read of this status. + // + if(g_ui32ErrFlag & CAN_STATUS_RXOK) + { + // + // Handle Error Condition here + // + + // + // Clear CAN_STATUS_RXOK Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_RXOK); + } + + // + // A message was transmitted successfully since the last read of this + // status. + // + if(g_ui32ErrFlag & CAN_STATUS_TXOK) + { + // + // Handle Error Condition here + // + + // + // Clear CAN_STATUS_TXOK Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_TXOK); + } + + // + // This is the mask for the last error code field. + // + if(g_ui32ErrFlag & CAN_STATUS_LEC_MSK) + { + // + // Handle Error Condition here + // + + // + // Clear CAN_STATUS_LEC_MSK Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_LEC_MSK); + } + + // + // A bit stuffing error has occurred. + // + if(g_ui32ErrFlag & CAN_STATUS_LEC_STUFF) + { + // + // Handle Error Condition here + // + + // + // Clear CAN_STATUS_LEC_STUFF Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_LEC_STUFF); + } + + // + // A formatting error has occurred. + // + if(g_ui32ErrFlag & CAN_STATUS_LEC_FORM) + { + // + // Handle Error Condition here + // + + // + // Clear CAN_STATUS_LEC_FORM Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_LEC_FORM); + } + + // + // An acknowledge error has occurred. + // + if(g_ui32ErrFlag & CAN_STATUS_LEC_ACK) + { + // + // Handle Error Condition here + // + + // + // Clear CAN_STATUS_LEC_ACK Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_LEC_ACK); + } + + // + // The bus remained a bit level of 1 for longer than is allowed. + // + if(g_ui32ErrFlag & CAN_STATUS_LEC_BIT1) + { + // + // Handle Error Condition here + // + + // + // Clear CAN_STATUS_LEC_BIT1 Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_LEC_BIT1); + } + + // + // The bus remained a bit level of 0 for longer than is allowed. + // + if(g_ui32ErrFlag & CAN_STATUS_LEC_BIT0) + { + // + // Handle Error Condition here + // + + // + // Clear CAN_STATUS_LEC_BIT0 Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_LEC_BIT0); + } + + // + // A CRC error has occurred. + // + if(g_ui32ErrFlag & CAN_STATUS_LEC_CRC) + { + // + // Handle Error Condition here + // + + // + // Clear CAN_STATUS_LEC_CRC Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_LEC_CRC); + } + + // + // This is the mask for the CAN Last Error Code (LEC). + // + if(g_ui32ErrFlag & CAN_STATUS_LEC_MASK) + { + // + // Handle Error Condition here + // + + // + // Clear CAN_STATUS_LEC_MASK Flag + // + g_ui32ErrFlag &= ~(CAN_STATUS_LEC_MASK); + } + + // + // If there are any bits still set in g_ui32ErrFlag then something unhandled + // has happened. Print the value of g_ui32ErrFlag. + // + if(g_ui32ErrFlag !=0) + { + UARTprintf(" Unhandled ERROR: %x \n",g_ui32ErrFlag); + } +} + +//***************************************************************************** +// +// Set up the system, initialize the UART, Graphics, and CAN. Then poll the +// UART for data. If there is any data send it, if there is any thing received +// print it out to the UART. If there are errors call the error handling +// function. +// +//***************************************************************************** +int +main(void) +{ + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Initialize the UART + // + ConfigureUART(); + + // + // Initialize the graphical display + // + InitGraphics(); + + // + // Initialize CAN0 + // + InitCAN0(); + + // + // Print welcome message + // + UARTprintf("\nCAN Example App\n"); + UARTprintf("Type something to see it show up on the other terminal: \n\n"); + + // + // Poll UART for data, transmit across CAN when something is entered + // + while(1) + { + // + // If the flag is set, that means that the RX interrupt occurred and + // there is a message ready to be read from the CAN + // + if(g_bRXFlag) + { + // + // Reuse the same message object that was used earlier to configure + // the CAN for receiving messages. A buffer for storing the + // received data must also be provided, so set the buffer pointer + // within the message object. + // + g_sCAN0RxMessage.pui8MsgData = (uint8_t *) &g_ui8RXMsgData; + + // + // Read the message from the CAN. Message object RXOBJECT is used + // (which is not the same thing as CAN ID). The interrupt clearing + // flag is not set because this interrupt was already cleared in + // the interrupt handler. + // + CANMessageGet(CAN0_BASE, RXOBJECT, &g_sCAN0RxMessage, 0); + + // + // Clear the pending message flag so that the interrupt handler can + // set it again when the next message arrives. + // + g_bRXFlag = 0; + + // + // Check to see if there is an indication that some messages were + // lost. + // + if(g_sCAN0RxMessage.ui32Flags & MSG_OBJ_DATA_LOST) + { + UARTprintf("\nCAN message loss detected\n"); + } + + // + // Print the received character to the UART terminal + // + UARTprintf("%c", g_ui8RXMsgData); + + // + // Print the received character to the display, + // clear line with spaces + // + GrStringDrawCentered(&g_sContext, "RX Data", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + SCREENLINE2, 0); + GrStringDrawCentered(&g_sContext, (const char *) &g_ui8RXMsgData, + 1, GrContextDpyWidthGet(&g_sContext) / 2, + SCREENLINE3, true); + GrFlush(&g_sContext); + } + else + { + // + // Error Handling + // + if(g_ui32ErrFlag != 0) + { + CANErrorHandler(); + } + + // + // See if there is something new to transmit + // + while(ROM_UARTCharsAvail(UART0_BASE)) + { + // + // Read the next character from the UART terminal + // + g_ui8TXMsgData = ROM_UARTCharGetNonBlocking(UART0_BASE); + + // + // Write the character to the display + // clear line with spaces + // + GrStringDrawCentered(&g_sContext, "TX Data", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + SCREENLINE4, true); + GrStringDrawCentered(&g_sContext, + (const char *)&g_ui8TXMsgData, 1, + GrContextDpyWidthGet(&g_sContext) / 2, + SCREENLINE5, true); + GrFlush(&g_sContext); + + // + // Send the CAN message using object number TXOBJECT (not the + // same thing as CAN ID, which is also TXOBJECT in this + // example). This function will cause the message to be + // transmitted right away. + // + CANMessageSet(CAN0_BASE, TXOBJECT, &g_sCAN0TxMessage, + MSG_OBJ_TYPE_TX); + } + } + } +} diff --git a/boards/dk-tm4c123g/can/can.ewd b/boards/dk-tm4c123g/can/can.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/can/can.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/can/can.ewp b/boards/dk-tm4c123g/can/can.ewp new file mode 100644 index 0000000..7451b9e --- /dev/null +++ b/boards/dk-tm4c123g/can/can.ewp @@ -0,0 +1,795 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\can.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c123g/can/can.icf b/boards/dk-tm4c123g/can/can.icf new file mode 100644 index 0000000..2997c46 --- /dev/null +++ b/boards/dk-tm4c123g/can/can.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// can.icf - Linker configuration file for can. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/can/can.ld b/boards/dk-tm4c123g/can/can.ld new file mode 100644 index 0000000..f687a5a --- /dev/null +++ b/boards/dk-tm4c123g/can/can.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * can.ld - Linker configuration file for can. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/can/can.sct b/boards/dk-tm4c123g/can/can.sct new file mode 100644 index 0000000..0693454 --- /dev/null +++ b/boards/dk-tm4c123g/can/can.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; can.sct - Linker configuration file for can. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/can/can.uvopt b/boards/dk-tm4c123g/can/can.uvopt new file mode 100644 index 0000000..6af248b --- /dev/null +++ b/boards/dk-tm4c123g/can/can.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + can + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\can.c + can.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/can/can.uvproj b/boards/dk-tm4c123g/can/can.uvproj new file mode 100644 index 0000000..e1e62a3 --- /dev/null +++ b/boards/dk-tm4c123g/can/can.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + can + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + can + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\can.bin .\rvmdk\can.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + can.sct + + + --entry Reset_Handler + + + + + + + + Source + + + can.c + 1 + .\can.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/can/can_ccs.cmd b/boards/dk-tm4c123g/can/can_ccs.cmd new file mode 100644 index 0000000..22d2d62 --- /dev/null +++ b/boards/dk-tm4c123g/can/can_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * can_ccs.cmd - CCS linker configuration file for can. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c123g/can/ccs/.ccsimportspec b/boards/dk-tm4c123g/can/ccs/.ccsimportspec new file mode 100644 index 0000000..cd502ab --- /dev/null +++ b/boards/dk-tm4c123g/can/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/can/ccs/.ccsproject b/boards/dk-tm4c123g/can/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/can/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/can/ccs/.cproject b/boards/dk-tm4c123g/can/ccs/.cproject new file mode 100644 index 0000000..e6812be --- /dev/null +++ b/boards/dk-tm4c123g/can/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/can/ccs/.project b/boards/dk-tm4c123g/can/ccs/.project new file mode 100644 index 0000000..7ed2595 --- /dev/null +++ b/boards/dk-tm4c123g/can/ccs/.project @@ -0,0 +1,60 @@ + + + can + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + can.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/can/can.c + + + can_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/can/can_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/can/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/can/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/can/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/can/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/can/ccs/Debug/can.bin b/boards/dk-tm4c123g/can/ccs/Debug/can.bin new file mode 100644 index 0000000..6cb787a Binary files /dev/null and b/boards/dk-tm4c123g/can/ccs/Debug/can.bin differ diff --git a/boards/dk-tm4c123g/can/ccs/Debug/can.out b/boards/dk-tm4c123g/can/ccs/Debug/can.out new file mode 100644 index 0000000..d1a65af Binary files /dev/null and b/boards/dk-tm4c123g/can/ccs/Debug/can.out differ diff --git a/boards/dk-tm4c123g/can/ccs/macros.ini_initial b/boards/dk-tm4c123g/can/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/can/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/can/ccs/target_config.ccxml b/boards/dk-tm4c123g/can/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/can/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/can/ewarm/Exe/can.bin b/boards/dk-tm4c123g/can/ewarm/Exe/can.bin new file mode 100644 index 0000000..f445fd3 Binary files /dev/null and b/boards/dk-tm4c123g/can/ewarm/Exe/can.bin differ diff --git a/boards/dk-tm4c123g/can/ewarm/Exe/can.out b/boards/dk-tm4c123g/can/ewarm/Exe/can.out new file mode 100644 index 0000000..244f7bd Binary files /dev/null and b/boards/dk-tm4c123g/can/ewarm/Exe/can.out differ diff --git a/boards/dk-tm4c123g/can/gcc/can.axf b/boards/dk-tm4c123g/can/gcc/can.axf new file mode 100644 index 0000000..4ec63c0 Binary files /dev/null and b/boards/dk-tm4c123g/can/gcc/can.axf differ diff --git a/boards/dk-tm4c123g/can/gcc/can.bin b/boards/dk-tm4c123g/can/gcc/can.bin new file mode 100644 index 0000000..2c91cb9 Binary files /dev/null and b/boards/dk-tm4c123g/can/gcc/can.bin differ diff --git a/boards/dk-tm4c123g/can/readme.txt b/boards/dk-tm4c123g/can/readme.txt new file mode 100644 index 0000000..b0f715a --- /dev/null +++ b/boards/dk-tm4c123g/can/readme.txt @@ -0,0 +1,56 @@ +CAN Example + +This example application utilizes CAN to send characters back and forth +between two boards. It uses the UART to read / write the characters to +the UART terminal. It also uses the graphical display on the board to show +the last character transmited / received. Error handling is also included. + +CAN HARDWARE SETUP: + +To use this example you will need to hook up two DK-TM4C123G boards +together in a CAN network. This involves hooking the CANH screw terminals +together and the CANL terminals together. In addition 120ohm termination +resistors will need to be added to the edges of the network between CANH +and CANL. In the two board setup this means hooking a 120 ohm resistor +between CANH and CANL on both boards. + +See diagram below for visual. '---' represents wire. + + CANH--+--------------------------+--CANH + | | + .-. .-. + | |120ohm | |120ohm + | | | | + '-' '-' + | | + CANL--+--------------------------+--CANL + +SOFTWARE SETUP: + +Once the hardware connections are setup connect both boards to the computer +via the In-Circuit Debug Interface USB port next to the graphical display. +Attach a UART terminal to each board configured 115,200 baud, 8-n-1 mode. + +Anything you type into one terminal will show up in the other terminal and +vice versa. The last character sent / received will also be displayed on +the graphical display on the board. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/can/rvmdk/can.axf b/boards/dk-tm4c123g/can/rvmdk/can.axf new file mode 100644 index 0000000..a65eb7d Binary files /dev/null and b/boards/dk-tm4c123g/can/rvmdk/can.axf differ diff --git a/boards/dk-tm4c123g/can/rvmdk/can.bin b/boards/dk-tm4c123g/can/rvmdk/can.bin new file mode 100644 index 0000000..ac2aaca Binary files /dev/null and b/boards/dk-tm4c123g/can/rvmdk/can.bin differ diff --git a/boards/dk-tm4c123g/can/startup_ccs.c b/boards/dk-tm4c123g/can/startup_ccs.c new file mode 100644 index 0000000..c40bb28 --- /dev/null +++ b/boards/dk-tm4c123g/can/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void CAN0IntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + CAN0IntHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/can/startup_ewarm.c b/boards/dk-tm4c123g/can/startup_ewarm.c new file mode 100644 index 0000000..a0bf949 --- /dev/null +++ b/boards/dk-tm4c123g/can/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void CAN0IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + CAN0IntHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/can/startup_gcc.c b/boards/dk-tm4c123g/can/startup_gcc.c new file mode 100644 index 0000000..df2ae9a --- /dev/null +++ b/boards/dk-tm4c123g/can/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void CAN0IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + CAN0IntHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/can/startup_rvmdk.S b/boards/dk-tm4c123g/can/startup_rvmdk.S new file mode 100644 index 0000000..a7cc279 --- /dev/null +++ b/boards/dk-tm4c123g/can/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN CAN0IntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD CAN0IntHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/dk-tm4c123g.eww b/boards/dk-tm4c123g/dk-tm4c123g.eww new file mode 100644 index 0000000..7bc9c30 --- /dev/null +++ b/boards/dk-tm4c123g/dk-tm4c123g.eww @@ -0,0 +1,240 @@ + + + + + $WS_DIR$\..\..\..\driverlib\driverlib.ewp + + + $WS_DIR$\..\..\..\grlib\grlib.ewp + + + $WS_DIR$\..\..\..\usblib\usblib.ewp + + + $WS_DIR$\bitband\bitband.ewp + + + $WS_DIR$\blinky\blinky.ewp + + + $WS_DIR$\boot_demo1\boot_demo1.ewp + + + $WS_DIR$\boot_demo2\boot_demo2.ewp + + + $WS_DIR$\boot_serial\boot_serial.ewp + + + $WS_DIR$\boot_usb\boot_usb.ewp + + + $WS_DIR$\can\can.ewp + + + $WS_DIR$\grlib_demo\grlib_demo.ewp + + + $WS_DIR$\hello\hello.ewp + + + $WS_DIR$\hibernate\hibernate.ewp + + + $WS_DIR$\interrupts\interrupts.ewp + + + $WS_DIR$\mpu_fault\mpu_fault.ewp + + + $WS_DIR$\qs-logger\qs-logger.ewp + + + $WS_DIR$\sd_card\sd_card.ewp + + + $WS_DIR$\sine_demo\sine_demo.ewp + + + $WS_DIR$\softuart_echo\softuart_echo.ewp + + + $WS_DIR$\timers\timers.ewp + + + $WS_DIR$\uart_echo\uart_echo.ewp + + + $WS_DIR$\udma_demo\udma_demo.ewp + + + $WS_DIR$\usb_dev_bulk\usb_dev_bulk.ewp + + + $WS_DIR$\usb_dev_keyboard\usb_dev_keyboard.ewp + + + $WS_DIR$\usb_dev_msc\usb_dev_msc.ewp + + + $WS_DIR$\usb_dev_serial\usb_dev_serial.ewp + + + $WS_DIR$\usb_host_audio\usb_host_audio.ewp + + + $WS_DIR$\usb_host_keyboard\usb_host_keyboard.ewp + + + $WS_DIR$\usb_host_mouse\usb_host_mouse.ewp + + + $WS_DIR$\usb_host_msc\usb_host_msc.ewp + + + $WS_DIR$\usb_stick_demo\usb_stick_demo.ewp + + + $WS_DIR$\usb_stick_update\usb_stick_update.ewp + + + $WS_DIR$\watchdog\watchdog.ewp + + + + All Examples + + driverlib + Debug + + + grlib + Debug + + + usblib + Debug + + + bitband + Debug + + + blinky + Debug + + + boot_demo1 + Debug + + + boot_demo2 + Debug + + + boot_serial + Debug + + + boot_usb + Debug + + + can + Debug + + + grlib_demo + Debug + + + hello + Debug + + + hibernate + Debug + + + interrupts + Debug + + + mpu_fault + Debug + + + qs-logger + Debug + + + sd_card + Debug + + + sine_demo + Debug + + + softuart_echo + Debug + + + timers + Debug + + + uart_echo + Debug + + + udma_demo + Debug + + + usb_dev_bulk + Debug + + + usb_dev_keyboard + Debug + + + usb_dev_msc + Debug + + + usb_dev_serial + Debug + + + usb_host_audio + Debug + + + usb_host_keyboard + Debug + + + usb_host_mouse + Debug + + + usb_host_msc + Debug + + + usb_stick_demo + Debug + + + usb_stick_update + Debug + + + watchdog + Debug + + + + diff --git a/boards/dk-tm4c123g/dk-tm4c123g.uvmpw b/boards/dk-tm4c123g/dk-tm4c123g.uvmpw new file mode 100644 index 0000000..9dda6ae --- /dev/null +++ b/boards/dk-tm4c123g/dk-tm4c123g.uvmpw @@ -0,0 +1,175 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + dk-tm4c123g + + + ..\..\..\driverlib\driverlib.uvproj + 1 + + + + ..\..\..\grlib\grlib.uvproj + 1 + + + + ..\..\..\usblib\usblib.uvproj + 1 + + + + .\bitband\bitband.uvproj + 1 + + + + .\blinky\blinky.uvproj + 1 + + + + .\boot_demo1\boot_demo1.uvproj + 1 + + + + .\boot_demo2\boot_demo2.uvproj + 1 + + + + .\boot_serial\boot_serial.uvproj + 1 + + + + .\boot_usb\boot_usb.uvproj + 1 + + + + .\can\can.uvproj + 1 + + + + .\grlib_demo\grlib_demo.uvproj + 1 + + + + .\hello\hello.uvproj + 1 + + + + .\hibernate\hibernate.uvproj + 1 + + + + .\interrupts\interrupts.uvproj + 1 + + + + .\mpu_fault\mpu_fault.uvproj + 1 + + + + .\qs-logger\qs-logger.uvproj + 1 + + + + .\sd_card\sd_card.uvproj + 1 + + + + .\sine_demo\sine_demo.uvproj + 1 + + + + .\softuart_echo\softuart_echo.uvproj + 1 + + + + .\timers\timers.uvproj + 1 + + + + .\uart_echo\uart_echo.uvproj + 1 + + + + .\udma_demo\udma_demo.uvproj + 1 + + + + .\usb_dev_bulk\usb_dev_bulk.uvproj + 1 + + + + .\usb_dev_keyboard\usb_dev_keyboard.uvproj + 1 + + + + .\usb_dev_msc\usb_dev_msc.uvproj + 1 + + + + .\usb_dev_serial\usb_dev_serial.uvproj + 1 + + + + .\usb_host_audio\usb_host_audio.uvproj + 1 + + + + .\usb_host_keyboard\usb_host_keyboard.uvproj + 1 + + + + .\usb_host_mouse\usb_host_mouse.uvproj + 1 + + + + .\usb_host_msc\usb_host_msc.uvproj + 1 + + + + .\usb_stick_demo\usb_stick_demo.uvproj + 1 + + + + .\usb_stick_update\usb_stick_update.uvproj + 1 + + + + .\watchdog\watchdog.uvproj + 1 + + +
diff --git a/boards/dk-tm4c123g/drivers/buttons.c b/boards/dk-tm4c123g/drivers/buttons.c new file mode 100644 index 0000000..dbaf642 --- /dev/null +++ b/boards/dk-tm4c123g/drivers/buttons.c @@ -0,0 +1,186 @@ +//***************************************************************************** +// +// buttons.c - Evaluation board driver for push buttons. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "buttons.h" + +//***************************************************************************** +// +//! \addtogroup buttons_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Holds the current, debounced state of each button. A 0 in a bit indicates +// that that button is currently pressed, otherwise it is released. +// We assume that we start with all the buttons released (though if one is +// pressed when the application starts, this will be detected). +// +//***************************************************************************** +static uint8_t g_ui8ButtonStates = ALL_BUTTONS; + +//***************************************************************************** +// +//! Polls the current state of the buttons and determines which have changed. +//! +//! \param pui8Delta points to a character that will be written to indicate +//! which button states changed since the last time this function was called. +//! This value is derived from the debounced state of the buttons. +//! \param pui8RawState points to a location where the raw button state will +//! be stored. +//! +//! This function should be called periodically by the application to poll the +//! pushbuttons. It determines both the current debounced state of the buttons +//! and also which buttons have changed state since the last time the function +//! was called. +//! +//! In order for button debouncing to work properly, this function should be +//! caled at a regular interval, even if the state of the buttons is not needed +//! that often. +//! +//! If button debouncing is not required, the the caller can pass a pointer +//! for the \e pui8RawState parameter in order to get the raw state of the +//! buttons. The value returned in \e pui8RawState will be a bit mask where +//! a 1 indicates the buttons is pressed. +//! +//! \return Returns the current debounced state of the buttons where a 1 in the +//! button ID's position indicates that the button is pressed and a 0 +//! indicates that it is released. +// +//***************************************************************************** +uint8_t +ButtonsPoll(uint8_t *pui8Delta, uint8_t *pui8RawState) +{ + uint32_t ui32Delta; + uint32_t ui32Data; + static uint8_t ui8SwitchClockA = 0; + static uint8_t ui8SwitchClockB = 0; + + // + // Read the raw state of the push buttons. Save the raw state + // (inverting the bit sense) if the caller supplied storage for the + // raw value. + // + ui32Data = (MAP_GPIOPinRead(BUTTONS_GPIO_BASE, ALL_BUTTONS)); + if(pui8RawState) + { + *pui8RawState = (uint8_t)~ui32Data; + } + + // + // Determine the switches that are at a different state than the debounced + // state. + // + ui32Delta = ui32Data ^ g_ui8ButtonStates; + + // + // Increment the clocks by one. + // + ui8SwitchClockA ^= ui8SwitchClockB; + ui8SwitchClockB = ~ui8SwitchClockB; + + // + // Reset the clocks corresponding to switches that have not changed state. + // + ui8SwitchClockA &= ui32Delta; + ui8SwitchClockB &= ui32Delta; + + // + // Get the new debounced switch state. + // + g_ui8ButtonStates &= ui8SwitchClockA | ui8SwitchClockB; + g_ui8ButtonStates |= (~(ui8SwitchClockA | ui8SwitchClockB)) & ui32Data; + + // + // Determine the switches that just changed debounced state. + // + ui32Delta ^= (ui8SwitchClockA | ui8SwitchClockB); + + // + // Store the bit mask for the buttons that have changed for return to + // caller. + // + if(pui8Delta) + { + *pui8Delta = (uint8_t)ui32Delta; + } + + // + // Return the debounced buttons states to the caller. Invert the bit + // sense so that a '1' indicates the button is pressed, which is a + // sensible way to interpret the return value. + // + return(~g_ui8ButtonStates); +} + +//***************************************************************************** +// +//! Initializes the GPIO pins used by the board pushbuttons. +//! +//! This function must be called during application initialization to +//! configure the GPIO pins to which the pushbuttons are attached. It enables +//! the port used by the buttons and configures each button GPIO as an input +//! with a weak pull-up. +//! +//! \return None. +// +//***************************************************************************** +void +ButtonsInit(void) +{ + // + // Enable the GPIO port to which the pushbuttons are connected. + // + MAP_SysCtlPeripheralEnable(BUTTONS_GPIO_PERIPH); + + // + // Set each of the button GPIO pins as an input with a pull-up. + // + MAP_GPIODirModeSet(BUTTONS_GPIO_BASE, ALL_BUTTONS, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(BUTTONS_GPIO_BASE, ALL_BUTTONS, + GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); + + // + // Initialize the debounced button state with the current state read from + // the GPIO bank. + // + g_ui8ButtonStates = MAP_GPIOPinRead(BUTTONS_GPIO_BASE, ALL_BUTTONS); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c123g/drivers/buttons.h b/boards/dk-tm4c123g/drivers/buttons.h new file mode 100644 index 0000000..16bf640 --- /dev/null +++ b/boards/dk-tm4c123g/drivers/buttons.h @@ -0,0 +1,103 @@ +//***************************************************************************** +// +// buttons.h - Prototypes for the evaluation board buttons driver. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __BUTTONS_H__ +#define __BUTTONS_H__ + +//***************************************************************************** +// +// Defines for the hardware resources used by the pushbuttons. +// +// The switches are on the following ports/pins: +// +// PM0 - Up +// PM1 - Down +// PM2 - Left +// PM3 - Right +// PM4 - Select/Wake +// +// The switches tie the GPIO to ground, so the GPIOs need to be configured +// with pull-ups, and a value of 0 means the switch is pressed. +// +//***************************************************************************** +#define BUTTONS_GPIO_PERIPH SYSCTL_PERIPH_GPIOM +#define BUTTONS_GPIO_BASE GPIO_PORTM_BASE + +#define NUM_BUTTONS 5 +#define UP_BUTTON GPIO_PIN_0 +#define DOWN_BUTTON GPIO_PIN_1 +#define LEFT_BUTTON GPIO_PIN_2 +#define RIGHT_BUTTON GPIO_PIN_3 +#define SELECT_BUTTON GPIO_PIN_4 + +#define ALL_BUTTONS (LEFT_BUTTON | RIGHT_BUTTON | UP_BUTTON | \ + DOWN_BUTTON | SELECT_BUTTON) + +//***************************************************************************** +// +// Useful macros for detecting button events. +// +//***************************************************************************** +#define BUTTON_PRESSED(button, buttons, changed) \ + (((button) & (changed)) && ((button) & (buttons))) + +#define BUTTON_RELEASED(button, buttons, changed) \ + (((button) & (changed)) && !((button) & (buttons))) + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Functions exported from buttons.c +// +//***************************************************************************** +extern void ButtonsInit(void); +extern uint8_t ButtonsPoll(uint8_t *pui8Delta, + uint8_t *pui8Raw); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** + +#endif // __BUTTONS_H__ diff --git a/boards/dk-tm4c123g/drivers/cfal96x64x16.c b/boards/dk-tm4c123g/drivers/cfal96x64x16.c new file mode 100644 index 0000000..c5d4510 --- /dev/null +++ b/boards/dk-tm4c123g/drivers/cfal96x64x16.c @@ -0,0 +1,816 @@ +//***************************************************************************** +// +// cfal96x64x16.c - Display driver for the Crystalfontz CFAL9664-F-B1 OLED +// display with an SSD1332. This version uses an SSI +// interface to the display controller. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup display_api +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/gpio.h" +#include "driverlib/ssi.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/pin_map.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +// Defines the SSI and GPIO peripherals that are used for this display. +// +//***************************************************************************** +#define DISPLAY_SSI_PERIPH SYSCTL_PERIPH_SSI2 +#define DISPLAY_SSI_GPIO_PERIPH SYSCTL_PERIPH_GPIOH +#define DISPLAY_RST_GPIO_PERIPH SYSCTL_PERIPH_GPIOG + +//***************************************************************************** +// +// Defines the GPIO pin configuration macros for the pins that are used for +// the SSI function. +// +//***************************************************************************** +#define DISPLAY_PINCFG_SSICLK GPIO_PH4_SSI2CLK +#define DISPLAY_PINCFG_SSIFSS GPIO_PH5_SSI2FSS +#define DISPLAY_PINCFG_SSITX GPIO_PH7_SSI2TX + +//***************************************************************************** +// +// Defines the port and pins for the SSI peripheral. +// +//***************************************************************************** +#define DISPLAY_SSI_PORT GPIO_PORTH_BASE +#define DISPLAY_SSI_PINS (GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7) + +//***************************************************************************** +// +// Defines the port and pins for the display voltage enable signal. +// +//***************************************************************************** +#define DISPLAY_ENV_PORT GPIO_PORTG_BASE +#define DISPLAY_ENV_PIN GPIO_PIN_0 + +//***************************************************************************** +// +// Defines the port and pins for the display reset signal. +// +//***************************************************************************** +#define DISPLAY_RST_PORT GPIO_PORTG_BASE +#define DISPLAY_RST_PIN GPIO_PIN_1 + +//***************************************************************************** +// +// Defines the port and pins for the display Data/Command (D/C) signal. +// +//***************************************************************************** +#define DISPLAY_D_C_PORT GPIO_PORTH_BASE +#define DISPLAY_D_C_PIN GPIO_PIN_6 + +//***************************************************************************** +// +// Defines the SSI peripheral used and the data speed. +// +//***************************************************************************** +#define DISPLAY_SSI_BASE SSI2_BASE // SSI2 +#define DISPLAY_SSI_CLOCK 4000000 + +//***************************************************************************** +// +// An array that holds a set of commands that are sent to the display when +// it is initialized. +// +//***************************************************************************** +static +uint8_t g_ui8DisplayInitCommands[] = +{ +// 0xAE, // display off + 0x87, 0x07, // master control current 7/16 + 0x81, 0xA0, // contrast A control + 0x82, 0x60, // contrast B control + 0x83, 0xB0, // contrast C control + 0xA0, 0x20,//00 // remap and data format - use 8-bit color mode + 0xBB, 0x1F, // Vpa + 0xBC, 0x1F, // Vpb + 0xBD, 0x1F, // Vpc +// 0xAD, 0x8E, // internal Vp, external supply + 0x26, 0x01, // rectangle fill enabled + 0xAF // display on +}; +#define NUM_INIT_BYTES sizeof(g_ui8DisplayInitCommands) + +//***************************************************************************** +// +// Translates a 24-bit RGB color to a display driver-specific color. +// +// \param c is the 24-bit RGB color. The least-significant byte is the blue +// channel, the next byte is the green channel, and the third byte is the red +// channel. +// +// This macro translates a 24-bit RGB color into a value that can be written +// into the display's frame buffer in order to reproduce that color, or the +// closest possible approximation of that color. +// +// \return Returns the display-driver specific color. +// +// 24-bit format: XXXX XXXX RRRR RRRR GGGG GGGG BBBB BBBB +// 16-bit format: ---- ---- ---- ---- RRRR RGGG GGGB BBBB +// 8-bit format: ---- ---- ---- ---- ---- ---- RRRG GGBB +// +// +//***************************************************************************** +#define DPYCOLORTRANSLATE16(c) ((((c) & 0x00f80000) >> 8) | \ + (((c) & 0x0000fc00) >> 5) | \ + (((c) & 0x000000f8) >> 3)) +#define DPYCOLORTRANSLATE8(c) ((((c) & 0x00e00000) >> 16) | \ + (((c) & 0x0000e000) >> 11) | \ + (((c) & 0x000000c0) >> 6)) +#define DPYCOLORTRANSLATE DPYCOLORTRANSLATE8 + +//***************************************************************************** +// +//! Write a set of command bytes to the display controller. +// +//! \param pi8Cmd is a pointer to a set of command bytes. +//! \param ui32Count is the count of command bytes. +//! +//! This function provides a way to send multiple command bytes to the display +//! controller. It can be used for single commands, or multiple commands +//! chained together in a buffer. It will wait for any previous operation to +//! finish, and then copy all the command bytes to the controller. It will +//! not return until the last command byte has been written to the SSI FIFO, +//! but data could still be shifting out to the display controller when this +//! function returns. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16WriteCommand(const uint8_t *pi8Cmd, uint32_t ui32Count) +{ + // + // Wait for any previous SSI operation to finish. + // + while(ROM_SSIBusy(DISPLAY_SSI_BASE)) + { + } + + // + // Set the D/C pin low to indicate command + // + ROM_GPIOPinWrite(DISPLAY_D_C_PORT, DISPLAY_D_C_PIN, 0); + + // + // Send all the command bytes to the display + // + while(ui32Count--) + { + ROM_SSIDataPut(DISPLAY_SSI_BASE, *pi8Cmd); + pi8Cmd++; + } +} + +//***************************************************************************** +// +//! Write a set of data bytes to the display controller. +// +//! \param pi8Data is a pointer to a set of data bytes, containing pixel data. +//! \param ui32Count is the count of command bytes. +//! +//! This function provides a way to send a set of pixel data to the display. +//! The data will draw pixels according to whatever the most recent col, row +//! settings are for the display. It will wait for any previous operation to +//! finish, and then copy all the data bytes to the controller. It will +//! not return until the last data byte has been written to the SSI FIFO, +//! but data could still be shifting out to the display controller when this +//! function returns. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16WriteData(const uint8_t *pi8Data, uint32_t ui32Count) +{ + // + // Wait for any previous SSI operation to finish. + // + while(ROM_SSIBusy(DISPLAY_SSI_BASE)) + { + } + + // + // Set the D/C pin high to indicate data + // + ROM_GPIOPinWrite(DISPLAY_D_C_PORT, DISPLAY_D_C_PIN, DISPLAY_D_C_PIN); + + // + // Send all the data bytes to the display + // + while(ui32Count--) + { + ROM_SSIDataPut(DISPLAY_SSI_BASE, *pi8Data); + pi8Data++; + } +} + +//***************************************************************************** +// +//! Draws a pixel on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X is the X coordinate of the pixel. +//! \param i32Y is the Y coordinate of the pixel. +//! \param ui32Value is the color of the pixel. +//! +//! This function sets the given pixel to a particular color. The coordinates +//! of the pixel are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16PixelDraw(void *pvDisplayData, int32_t i32X, int32_t i32Y, + uint32_t ui32Value) +{ + uint8_t ui8Cmd[8]; + + // + // Load column command, start and end column + // + ui8Cmd[0] = 0x15; + ui8Cmd[1] = (uint8_t)i32X; + ui8Cmd[2] = (uint8_t)i32X; + + // + // Load row command, start and end row + // + ui8Cmd[3] = 0x75; + ui8Cmd[4] = (uint8_t)i32Y; + ui8Cmd[5] = (uint8_t)i32Y; + + // + // Send the column, row commands to the display + // + CFAL96x64x16WriteCommand(ui8Cmd, 6); + + // + // Send the data value representing the pixel to the display + // + CFAL96x64x16WriteData((uint8_t *)&ui32Value, 1); +} + +//***************************************************************************** +// +//! Draws a horizontal sequence of pixels on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X is the X coordinate of the first pixel. +//! \param i32Y is the Y coordinate of the first pixel. +//! \param i32X0 is sub-pixel offset within the pixel data, which is valid for 1 +//! or 4 bit per pixel formats. +//! \param i32Count is the number of pixels to draw. +//! \param i32BPP is the number of bits per pixel; must be 1, 4, or 8 optionally +//! ORed with various flags unused by this driver. +//! \param pui8Data is a pointer to the pixel data. For 1 and 4 bit per pixel +//! formats, the most significant bit(s) represent the left-most pixel. +//! \param pui8Palette is a pointer to the palette used to draw the pixels. +//! +//! This function draws a horizontal sequence of pixels on the screen, using +//! the supplied palette. For 1 bit per pixel format, the palette contains +//! pre-translated colors; for 4 and 8 bit per pixel formats, the palette +//! contains 24-bit RGB values that must be translated before being written to +//! the display. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16PixelDrawMultiple(void *pvDisplayData, int32_t i32X, int32_t i32Y, int32_t i32X0, + int32_t i32Count, int32_t i32BPP, + const uint8_t *pui8Data, + const uint8_t *pui8Palette) +{ + uint32_t ui32Byte; + uint8_t ui8Cmd[8]; + + // + // Load column command. Use the specified X for the start and just set + // the end to the rightmost column since we dont know where the data ends. + // + ui8Cmd[0] = 0x15; + ui8Cmd[1] = (uint8_t)i32X; + ui8Cmd[2] = 95; + + // + // Load row command. Use the specified Y for the start row and just set + // the end row to the bottom row since we dont know where the data ends. + // + ui8Cmd[3] = 0x75; + ui8Cmd[4] = (uint8_t)i32Y; + ui8Cmd[5] = 63; + + // + // Send the column, row commands to the display + // + CFAL96x64x16WriteCommand(ui8Cmd, 6); + + // + // Determine how to interpret the pixel data based on the number of bits + // per pixel. + // + switch(i32BPP & 0xFF) + { + // + // The pixel data is in 1 bit per pixel format. + // + case 1: + { + // + // Loop while there are more pixels to draw. + // + while(i32Count) + { + // + // Get the next byte of image data. + // + ui32Byte = *pui8Data++; + + // + // Loop through the pixels in this byte of image data. + // + for(; (i32X0 < 8) && i32Count; i32X0++, i32Count--) + { + // + // Draw this pixel in the appropriate color. + // + uint8_t ui8BPP = ((uint32_t *)pui8Palette) + [(ui32Byte >> (7 - i32X0)) & 1]; + CFAL96x64x16WriteData(&ui8BPP, 1); + } + + // + // Start at the beginning of the next byte of image data. + // + i32X0 = 0; + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 4 bit per pixel format. + // + case 4: + { + // + // Loop while there are more pixels to draw. "Duff's device" is + // used to jump into the middle of the loop if the first nibble of + // the pixel data should not be used. Duff's device makes use of + // the fact that a case statement is legal anywhere within a + // sub-block of a switch statement. See + // http://en.wikipedia.org/wiki/Duff's_device for detailed + // information about Duff's device. + // + switch(i32X0 & 1) + { + case 0: + while(i32Count) + { + uint8_t ui8Color; + + // + // Get the upper nibble of the next byte of pixel data + // and extract the corresponding entry from the + // palette. + // + ui32Byte = (*pui8Data >> 4) * 3; + ui32Byte = (*(uint32_t *)(pui8Palette + ui32Byte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + ui8Color = DPYCOLORTRANSLATE(ui32Byte); + CFAL96x64x16WriteData(&ui8Color, 1); + + // + // Decrement the count of pixels to draw. + // + i32Count--; + + // + // See if there is another pixel to draw. + // + if(i32Count) + { + case 1: + // + // Get the lower nibble of the next byte of pixel + // data and extract the corresponding entry from + // the palette. + // + ui32Byte = (*pui8Data++ & 15) * 3; + ui32Byte = (*(uint32_t *)(pui8Palette + ui32Byte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + ui8Color = DPYCOLORTRANSLATE(ui32Byte); + CFAL96x64x16WriteData(&ui8Color, 1); + + // + // Decrement the count of pixels to draw. + // + i32Count--; + } + } + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 8 bit per pixel format. + // + case 8: + { + // + // Loop while there are more pixels to draw. + // + while(i32Count--) + { + uint8_t ui8Color; + + // + // Get the next byte of pixel data and extract the + // corresponding entry from the palette. + // + ui32Byte = *pui8Data++ * 3; + ui32Byte = *(uint32_t *)(pui8Palette + ui32Byte) & 0x00ffffff; + + // + // Translate this palette entry and write it to the screen. + // + ui8Color = DPYCOLORTRANSLATE(ui32Byte); + CFAL96x64x16WriteData(&ui8Color, 1); + } + + // + // The image data has been drawn. + // + break; + } + } +} + +//***************************************************************************** +// +//! Draws a horizontal line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X1 is the X coordinate of the start of the line. +//! \param i32X2 is the X coordinate of the end of the line. +//! \param i32Y is the Y coordinate of the line. +//! \param ui32Value is the color of the line. +//! +//! This function draws a horizontal line on the display. The coordinates of +//! the line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16LineDrawH(void *pvDisplayData, int32_t i32X1, int32_t i32X2, int32_t i32Y, + uint32_t ui32Value) +{ + uint8_t ui8LineBuf[16]; + unsigned int uIdx; + + // + // Send command for starting row and column + // + ui8LineBuf[0] = 0x15; + ui8LineBuf[1] = i32X1 < i32X2 ? i32X1 : i32X2; + ui8LineBuf[2] = 95; + ui8LineBuf[3] = 0x75; + ui8LineBuf[4] = i32Y; + ui8LineBuf[5] = 63; + CFAL96x64x16WriteCommand(ui8LineBuf, 6); + + // + // Use buffer of pixels to draw line, so multiple bytes can be sent at + // one time. Fill the buffer with the line color. + // + for(uIdx = 0; uIdx < sizeof(ui8LineBuf); uIdx++) + { + ui8LineBuf[uIdx] = ui32Value; + } + + uIdx = (i32X1 < i32X2) ? (i32X2 - i32X1) : (i32X1 - i32X2); + uIdx += 1; + while(uIdx) + { + CFAL96x64x16WriteData(ui8LineBuf, (uIdx < 16) ? uIdx : 16); + uIdx -= (uIdx < 16) ? uIdx : 16; + } +} + +//***************************************************************************** +// +//! Draws a vertical line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X is the X coordinate of the line. +//! \param i32Y1 is the Y coordinate of the start of the line. +//! \param i32Y2 is the Y coordinate of the end of the line. +//! \param ui32Value is the color of the line. +//! +//! This function draws a vertical line on the display. The coordinates of the +//! line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16LineDrawV(void *pvDisplayData, int32_t i32X, int32_t i32Y1, int32_t i32Y2, + uint32_t ui32Value) +{ + uint8_t ui8LineBuf[16]; + unsigned int uIdx; + + // + // Send command for starting row and column. Also, set vertical + // address increment. + // + ui8LineBuf[0] = 0x15; + ui8LineBuf[1] = i32X; + ui8LineBuf[2] = 95; + ui8LineBuf[3] = 0x75; + ui8LineBuf[4] = i32Y1 < i32Y2 ? i32Y1 : i32Y2; + ui8LineBuf[5] = 63; + ui8LineBuf[6] = 0xA0; + ui8LineBuf[7] = 0x21; + CFAL96x64x16WriteCommand(ui8LineBuf, 8); + + // + // Use buffer of pixels to draw line, so multiple bytes can be sent at + // one time. Fill the buffer with the line color. + // + for(uIdx = 0; uIdx < sizeof(ui8LineBuf); uIdx++) + { + ui8LineBuf[uIdx] = ui32Value; + } + + uIdx = (i32Y1 < i32Y2) ? (i32Y2 - i32Y1) : (i32Y1 - i32Y2); + uIdx += 1; + while(uIdx) + { + CFAL96x64x16WriteData(ui8LineBuf, (uIdx < 16) ? uIdx : 16); + uIdx -= (uIdx < 16) ? uIdx : 16; + } + + // + // Restore horizontal address increment + // + ui8LineBuf[0] = 0xA0; + ui8LineBuf[1] = 0x20; + CFAL96x64x16WriteCommand(ui8LineBuf, 2); +} + +//***************************************************************************** +// +//! Fills a rectangle. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param pRect is a pointer to the structure describing the rectangle. +//! \param ui32Value is the color of the rectangle. +//! +//! This function fills a rectangle on the display. The coordinates of the +//! rectangle are assumed to be within the extents of the display, and the +//! rectangle specification is fully inclusive (in other words, both i16XMin and +//! i16XMax are drawn, aint32_t with i16YMin and i16YMax). +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16RectFill(void *pvDisplayData, const tRectangle *pRect, + uint32_t ui32Value) +{ + unsigned int uY; + + for(uY = pRect->i16YMin; uY <= pRect->i16YMax; uY++) + { + CFAL96x64x16LineDrawH(0, pRect->i16XMin, pRect->i16XMax, uY, ui32Value); + } +} + +//***************************************************************************** +// +//! Translates a 24-bit RGB color to a display driver-specific color. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param ui32Value is the 24-bit RGB color. The least-significant byte is the +//! blue channel, the next byte is the green channel, and the third byte is the +//! red channel. +//! +//! This function translates a 24-bit RGB color into a value that can be +//! written into the display's frame buffer in order to reproduce that color, +//! or the closest possible approximation of that color. +//! +//! \return Returns the display-driver specific color. +// +//***************************************************************************** +static uint32_t +CFAL96x64x16ColorTranslate(void *pvDisplayData, uint32_t ui32Value) +{ + // + // Translate from a 24-bit RGB color to a 3-3-2 RGB color. + // + return(DPYCOLORTRANSLATE(ui32Value)); +} + +//***************************************************************************** +// +//! Flushes any cached drawing operations. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! +//! This functions flushes any cached drawing operations to the display. This +//! is useful when a local frame buffer is used for drawing operations, and the +//! flush would copy the local frame buffer to the display. Since no memory +//! based frame buffer is used for this driver, the flush is a no operation. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16Flush(void *pvDisplayData) +{ + // + // There is nothing to be done. + // +} + +//***************************************************************************** +// +//! The display structure that describes the driver for the Crystalfontz +//! CFAL9664-F-B1 OLED panel with SSD 1332 controller. +// +//***************************************************************************** +const tDisplay g_sCFAL96x64x16 = +{ + sizeof(tDisplay), + 0, + 96, + 64, + CFAL96x64x16PixelDraw, + CFAL96x64x16PixelDrawMultiple, + CFAL96x64x16LineDrawH, + CFAL96x64x16LineDrawV, + CFAL96x64x16RectFill, + CFAL96x64x16ColorTranslate, + CFAL96x64x16Flush +}; + +//***************************************************************************** +// +//! Initializes the display driver. +//! +//! This function initializes the SSD1332 display controller on the panel, +//! preparing it to display data. +//! +//! \return None. +// +//***************************************************************************** +void +CFAL96x64x16Init(void) +{ + tRectangle sRect; + + // + // Enable the peripherals used by this driver + // + ROM_SysCtlPeripheralEnable(DISPLAY_SSI_PERIPH); + ROM_SysCtlPeripheralEnable(DISPLAY_SSI_GPIO_PERIPH); + ROM_SysCtlPeripheralEnable(DISPLAY_RST_GPIO_PERIPH); + + // + // Select the SSI function for the appropriate pins + // + ROM_GPIOPinConfigure(DISPLAY_PINCFG_SSICLK); + ROM_GPIOPinConfigure(DISPLAY_PINCFG_SSIFSS); + ROM_GPIOPinConfigure(DISPLAY_PINCFG_SSITX); + + + // + // Configure the pins for the SSI function + // + ROM_GPIOPinTypeSSI(DISPLAY_SSI_PORT, DISPLAY_SSI_PINS); + + // + // Configure display control pins as GPIO output + // + ROM_GPIOPinTypeGPIOOutput(DISPLAY_RST_PORT, DISPLAY_RST_PIN); + ROM_GPIOPinTypeGPIOOutput(DISPLAY_ENV_PORT, DISPLAY_ENV_PIN); + ROM_GPIOPinTypeGPIOOutput(DISPLAY_D_C_PORT, DISPLAY_D_C_PIN); + + // + // Reset pin high, power off + // + ROM_GPIOPinWrite(DISPLAY_RST_PORT, DISPLAY_RST_PIN, DISPLAY_RST_PIN); + ROM_GPIOPinWrite(DISPLAY_ENV_PORT, DISPLAY_ENV_PIN, 0); + ROM_SysCtlDelay(1000); + + // + // Drive the reset pin low while we do other stuff + // + ROM_GPIOPinWrite(DISPLAY_RST_PORT, DISPLAY_RST_PIN, 0); + + // + // Configure the SSI port + // + ROM_SSIDisable(DISPLAY_SSI_BASE); + ROM_SSIConfigSetExpClk(DISPLAY_SSI_BASE, ROM_SysCtlClockGet(), + SSI_FRF_MOTO_MODE_3, SSI_MODE_MASTER, + DISPLAY_SSI_CLOCK, 8); + ROM_SSIEnable(DISPLAY_SSI_BASE); + + // + // Take the display out of reset + // + ROM_SysCtlDelay(1000); + ROM_GPIOPinWrite(DISPLAY_RST_PORT, DISPLAY_RST_PIN, DISPLAY_RST_PIN); + ROM_SysCtlDelay(1000); + + // + // Enable display power supply + // + ROM_GPIOPinWrite(DISPLAY_ENV_PORT, DISPLAY_ENV_PIN, DISPLAY_ENV_PIN); + ROM_SysCtlDelay(1000); + + // + // Send the initial configuration command bytes to the display + // + CFAL96x64x16WriteCommand(g_ui8DisplayInitCommands, + sizeof(g_ui8DisplayInitCommands)); + ROM_SysCtlDelay(1000); + + // + // Fill the entire display with a black rectangle, to clear it. + // + sRect.i16XMin = 0; + sRect.i16XMax = 95; + sRect.i16YMin = 0; + sRect.i16YMax = 63; + CFAL96x64x16RectFill(0, &sRect, 0); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c123g/drivers/cfal96x64x16.h b/boards/dk-tm4c123g/drivers/cfal96x64x16.h new file mode 100644 index 0000000..04dc99d --- /dev/null +++ b/boards/dk-tm4c123g/drivers/cfal96x64x16.h @@ -0,0 +1,37 @@ +//***************************************************************************** +// +// cfal96x64x16.h - Prototypes for the Crystalfontz CFAL9664-F-B1 OLED display +// with an SSD1332 controller. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __CFAL96X64X16_H__ +#define __CFAL96X64X16_H__ + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** +extern void CFAL96x64x16Init(void); +extern const tDisplay g_sCFAL96x64x16; + +#endif // __CFAL96X64X16_H__ diff --git a/boards/dk-tm4c123g/drivers/slidemenuwidget.c b/boards/dk-tm4c123g/drivers/slidemenuwidget.c new file mode 100644 index 0000000..08b1abf --- /dev/null +++ b/boards/dk-tm4c123g/drivers/slidemenuwidget.c @@ -0,0 +1,1424 @@ +//***************************************************************************** +// +// slidemenuwidget.c - A sliding menu drawing widget. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "utils/uartstdio.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "slidemenuwidget.h" + +//***************************************************************************** +// +//! \addtogroup slidemenuwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// This is a custom widget for drawing a menu system on the display. The +// widget presents the menus using a "sliding" animation. The menu items +// are shown in a vertical list, and as the user scrolls through the list +// of menu items, the menu slides up and down the display. When a menu item +// is selected to descend in the menu tree, the widget slides the old menu +// off the to left while the new menu slides in from the right. Likewise, +// going up in the menu tree, the higher level menu slides back onto the +// screen from the left. +// +// Additional structures are provided to implement a menu, and menu items. +// Each menu contains menu items, and each menu item can have a child menu. +// These structures can be used to build a menu tree. The menu widget will +// show one menu at any given time, the menu that is displayed on the screen. +// +// In addition to child menus, any menu item can have instead a child widget. +// If this is used, then when the user selects a menu item, a new widget can +// be activated to perform some function. When the function of the child +// widget completes, then the widget slides back off the screen (to the right) +// and the parent menu is displayed again. +// +// A given menu can have menu items that are individually selectable or +// multiple-selectable. For individually selectable menu items, the item +// is selected by leaving the menu with the focus on the selected item. For +// example navigating down to a submenu with choices A, B and C, and then +// navigating until the focus is on item B will cause item B to be selected. +// The menu will remember that item B was selected even when navigating away +// from that menu. +// +// If a menu is configured to be multiple-selectable, then each menu item has +// a check box that is checked by pressing the select button. When the item +// is selected the box will show an X. Any or all or none can be selected in +// this way. When a menu is configured to be multi-selectable, the menu items +// cannot have any child menus or widgets. +// +// The menu widget provides some visual clues to the user about how to +// navigate the menu tree. Whenever a menu item has a child menu or child +// widget, then a small right arrow is shown on the right side of the menu +// item that has the focus. This tells the user to press the "right" button +// to descend to the next menu or widget. When it is possible to go up a +// level in the menu tree (when showing a child menu), a small left arrow +// will be shown on the menu item with the focus. This is an indication to the +// user that they should press the "left" button. +// +// This widget is meant to work with key/button presses. It expects there +// to be up/down/left/right and select buttons. The widget will need to be +// modified in order to work with a pointer input. +// +// In order to perform the sliding animation, the menu widget requires that +// it be provided with two off-screen displays. The menu widget renders the +// two menus (the old and the new) into the two buffers, and then repeatedly +// paints both to the physical display while adjusting the coordinates as +// appropriate. This will cause the menus to appear animated and move across +// the display. When the menus are being animated, the menu widget is taking +// all the non-interrupt processor time in order to draw the buffers to the +// display. This operation occurs in response to the widget processing of the +// key/button events and will occur in the thread that calls +// WidgetMessageQueueProcess(). The programmer should be aware of this +// processing burden when designing an application that uses the sliding +// menu widget. +// +//***************************************************************************** + +//***************************************************************************** +// +// A graphics image of a small right arrow icon. +// +//***************************************************************************** +const uint8_t g_ui8RtArrow[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 4, 0, + 8, 0, + + 0x80, + 0xC0, + 0xE0, + 0xF0, + 0xE0, + 0xC0, + 0x80, + 0 +}; + +//***************************************************************************** +// +// A graphics image of a small left arrow icon. +// +//***************************************************************************** +const uint8_t g_ui8LtArrow[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 4, 0, + 8, 0, + + 0x10, + 0x30, + 0x70, + 0xF0, + 0x70, + 0x30, + 0x10, + 0 +}; + +//***************************************************************************** +// +// A graphics image of a small unchecked box icon. +// +//***************************************************************************** +const uint8_t g_ui8Unchecked[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 7, 0, + 8, 0, + + 0xFE, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0xFE, + 0 +}; + +//***************************************************************************** +// +// A graphics image of a small checked box icon. +// +//***************************************************************************** +const uint8_t g_ui8Checked[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 7, 0, + 8, 0, + + 0xFE, + 0xC6, + 0xAA, + 0x92, + 0xAA, + 0xC6, + 0xFE, + 0 +}; + +//***************************************************************************** +// +//! Draws the current menu into a drawing context, off-screen buffer. +//! +//! \param psMenuWidget points at the SlideMenuWidget being processed. +//! \param psContext points to the context where all drawing should be done. +//! \param i32OffsetY is the Y offset for drawing the menu. +//! +//! This function renders a menu (set of menu items), into a drawing context. +//! It assumes that the drawing context is an off-screen buffer, and that +//! the entire buffer belongs to this widget. The vertical position of the +//! menu can be adjusted by using the parameter i32OffsetY. This value can be +//! positive or negative and can cause the menu to be rendered above or below +//! the normal position in the display. +//! +//! \return None. +// +//***************************************************************************** +void +SlideMenuDraw(tSlideMenuWidget *psMenuWidget, tContext *psContext, + int32_t i32OffsetY) +{ + tSlideMenu *psMenu; + uint32_t ui32Idx; + tRectangle sRect; + + // + // Check the arguments + // + ASSERT(psMenuWidget); + ASSERT(psContext); + + // + // Set the foreground color for the rectangle fill to match what we want + // as the menu background. + // + GrContextForegroundSet(psContext, psMenuWidget->ui32ColorBackground); + GrRectFill(psContext, &psContext->sClipRegion); + + // + // Get the current menu that is being displayed + // + psMenu = psMenuWidget->psSlideMenu; + + // + // Set the foreground to the color we want for the menu item boundaries + // and text color, text font. + // + GrContextForegroundSet(psContext, psMenuWidget->ui32ColorForeground); + GrContextFontSet(psContext, psMenuWidget->psFont); + + // + // Set the rectangle bounds for the first menu item. + // The starting Y value is calculated based on which menu item is currently + // centered. Y coordinates are subtracted to find the Y start location + // of the first menu item, which could even be off the display. + // + // Set the X coords of the menu item to the extents of the display + // + sRect.i16XMin = 0; + sRect.i16XMax = psContext->sClipRegion.i16XMax; + + // + // Find the Y coordinate of the centered menu item + // + sRect.i16YMin = (psContext->psDisplay->ui16Height / 2) - + (psMenuWidget->ui32MenuItemHeight / 2); + + // + // Adjust to find Y coordinate of first menu item + // + sRect.i16YMin -= psMenu->ui32CenterIndex * psMenuWidget->ui32MenuItemHeight; + + // + // Now adjust for the offset that was passed in by caller. This allows + // for drawing menu items above or below the main display. + // + sRect.i16YMin += i32OffsetY; + + // + // Find the ending Y coordinate of first menu item + // + sRect.i16YMax = sRect.i16YMin + psMenuWidget->ui32MenuItemHeight - 1; + + // + // Start the index at the first menu item. It is possible that this + // menu item is off the display. + // + ui32Idx = 0; + + // + // Loop through all menu items, drawing on the display. Note that some + // may not be on the screen, but they will be clipped. + // + while(ui32Idx < psMenu->ui32Items) + { + // + // If this index is the one that is highlighted, then change the + // background + // + if(ui32Idx == psMenu->ui32FocusIndex) + { + // + // Set the foreground to the highlight color, and fill the + // rectangle of the background of this menu item. + // + GrContextForegroundSet(psContext, psMenuWidget->ui32ColorHighlight); + GrRectFill(psContext, &sRect); + + // + // Set the new foreground to the normal foreground color, and + // set the background to the highlight color. This is so + // remaining drawing operations will have the correct background + // and foreground colors for this highlighted menu item cell. + // + GrContextForegroundSet(psContext, psMenuWidget->ui32ColorForeground); + GrContextBackgroundSet(psContext, psMenuWidget->ui32ColorHighlight); + + // + // If this menu has a parent, then draw a left arrow icon on the + // focused menu item. + // + if(psMenu->psParent) + { + GrImageDraw(psContext, g_ui8LtArrow, sRect.i16XMin + 4, + sRect.i16YMin + + (psMenuWidget->ui32MenuItemHeight / 2) - 4); + } + + // + // If this menu has a child menu or child widget, then draw a + // right arrow icon on the focused menu item. + // + if(psMenu->psSlideMenuItems[ui32Idx].psChildMenu || + psMenu->psSlideMenuItems[ui32Idx].psChildWidget) + { + GrImageDraw(psContext, g_ui8RtArrow, sRect.i16XMax - 8, + sRect.i16YMin + + (psMenuWidget->ui32MenuItemHeight / 2) - 4); + } + } + + // + // Otherwise this is a normal, non-highlighted menu item cell, + // so set the normal background color. + // + else + { + GrContextBackgroundSet(psContext, psMenuWidget->ui32ColorBackground); + } + + // + // If the current menu is multi-selectable, then draw a checkbox on + // the menu item. Draw a checked or unchecked box depending on whether + // the item has been selected. + // + if(psMenu->bMultiSelectable) + { + if(psMenu->ui32SelectedFlags & (1 << ui32Idx)) + { + GrImageDraw(psContext, g_ui8Checked, sRect.i16XMax - 12, + sRect.i16YMin + + (psMenuWidget->ui32MenuItemHeight / 2) - 4); + } + else + { + GrImageDraw(psContext, g_ui8Unchecked, sRect.i16XMax - 12, + sRect.i16YMin + + (psMenuWidget->ui32MenuItemHeight / 2) - 4); + } + + } + + // + // Draw the rectangle representing the menu item + // + GrRectDraw(psContext, &sRect); + + // + // Draw the text for this menu item in the middle of the menu item + // rectangle (cell). + // + GrStringDrawCentered(psContext, + psMenu->psSlideMenuItems[ui32Idx].pcText, + -1, + psMenuWidget->sBase.psDisplay->ui16Width / 2, + sRect.i16YMin + \ + (psMenuWidget->ui32MenuItemHeight / 2) - 1, 0); + + // + // Advance to the next menu item, and update the menu item rectangle + // bounds to the next position + // + ui32Idx++; + sRect.i16YMin += psMenuWidget->ui32MenuItemHeight; + sRect.i16YMax += psMenuWidget->ui32MenuItemHeight; + + // + // Note that this may attempt to render menu items that run off the + // bottom of the drawing area, but these will just be clipped and a + // little bit of processing time is wasted. + // + } +} + +//***************************************************************************** +// +//! Paints a menu, menu items on a display. +//! +//! \param psWidget is a pointer to the slide menu widget to be drawn. +//! +//! This function draws the contents of a slide menu on the display. This is +//! called in response to a \b WIDGET_MSG_PAINT message. +//! +//! \return None. +// +//***************************************************************************** +static void +SlideMenuPaint(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tContext sContext; + + // + // Check the arguments. + // + ASSERT(psWidget); + + // + // If this widget has a child widget, that means that the menu has + // slid off the screen and the child widget is in control. Therefore + // there is nothing to paint here. Just exit and the child widget will + // be painted. + // + if(psWidget->psChild) + { + return; + } + + // + // Convert the generic widget pointer into a slide menu widget pointer, + // and get a pointer to its context. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Render the menu into the off-screen buffer, using normal vertical + // position. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Now copy the rendered menu into the physical display. This will show + // the menu on the display. + // + GrImageDraw(&sContext, psMenuWidget->psDisplayA->pvDisplayData, + psWidget->sPosition.i16XMin, psWidget->sPosition.i16YMin); +} + +//***************************************************************************** +// +//! Performs the sliding menu operation, in response to the "down" button. +//! +//! \param psWidget is a pointer to the slide menu widget to move down. +//! +//! This function will respond to the "down" key/button event. The down +//! button is used to select the next menu item down the list, and the effect +//! is that the menu itself slides up, leaving the highlighted menu item +//! in the middle of the screen. +//! +//! This function repeatedly draws the menu onto the display until the sliding +//! animation is finished and will not return to the caller until then. This +//! function is usually called from the thread context of +//! WidgetMessageQueueProcess(). +//! +//! \return Returns a non-zero value if the menu was moved or was not moved +//! because it is already at the last position. If a child widget is active +//! then this function does nothing and returns a 0. +// +//***************************************************************************** +static int32_t +SlideMenuDown(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tSlideMenu *psMenu; + tContext sContext; + uint32_t ui32MenuHeight; + uint32_t ui32Y; + + // + // If this menu widget has a child widget, that means the child widget + // is in control of the display, and there is nothing to do here. + // + if(psWidget->psChild) + { + return(0); + } + + // + // Get handy pointers to the menu widget, and the menu that is currently + // displayed. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + psMenu = psMenuWidget->psSlideMenu; + + // + // If we are already at the end of the list of menu items, then there + // is nothing else to do. + // + if(psMenu->ui32FocusIndex >= (psMenu->ui32Items - 1)) + { + return(1); + } + + // + // Increment focus menu item. This has the effect of selecting the next + // menu item in the list. + // + psMenu->ui32FocusIndex++; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Render the menu into the off-screen buffer. This will be the same + // menu appearance as before, except the highlighted item has changed + // to the next menu item down. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Draw a continuation of this menu in the second offscreen buffer. + // This is the part of the menu that would be drawn if the display were + // twice as tall. We are effectively creating a virtual display that is + // twice as tall as the physical display. + // + GrContextInit(&sContext, psMenuWidget->psDisplayB); + SlideMenuDraw(psMenuWidget, &sContext, -1 * + (psMenuWidget->sBase.sPosition.i16YMax - + psMenuWidget->sBase.sPosition.i16YMin)); + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Get the height of the displayed part of the menu. + // + ui32MenuHeight = psMenuWidget->psDisplayA->ui16Height; + + // + // Now copy the rendered menu into the physical display + // + // Iterate over the Y displacement of one menu item cell. This loop + // will repeatedly draw both off screen buffers to the physical display, + // adjusting the position of each by one pixel each time it is drawn. Each + // time the offset is changed so that both buffers are drawn one higher + // than the previous time. This will have the effect of "sliding" the + // entire menu up by the height of one menu item cell. + // The speed of the animation is controlled entirely by the speed of the + // processor and the speed of the interface to the physical display. + // + for(ui32Y = 0; ui32Y <= psMenuWidget->ui32MenuItemHeight; ui32Y++) + { + GrImageDraw(&sContext, psMenuWidget->psDisplayA->pvDisplayData, + psWidget->sPosition.i16XMin, + psWidget->sPosition.i16YMin - ui32Y); + GrImageDraw(&sContext, psMenuWidget->psDisplayB->pvDisplayData, + psWidget->sPosition.i16XMin, + psWidget->sPosition.i16YMin + ui32MenuHeight - ui32Y); + } + + // + // Increment centered menu item. This will now match the menu item with + // the focus. When the menu is repainted again, the newly selected + // menu item will be centered and highlighted. + // + psMenu->ui32CenterIndex = psMenu->ui32FocusIndex; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Render the menu into the off-screen buffer. This will be the same + // menu appearance as before, except the highlighted item has changed + // to the next menu item down. Now when a repaint occurs the menu + // will be redrawn with the newly highlighted menu item. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Return indication that we handled the key event. + // + return(1); +} + +//***************************************************************************** +// +//! Performs the sliding menu operation, in response to the "up" button. +//! +//! \param psWidget is a pointer to the slide menu widget to move up. +//! +//! This function will respond to the "up" key/button event. The up +//! button is used to select the previous menu item down the list, and the +//! effect is that the menu itself slides down, leaving the highlighted menu +//! item in the middle of the screen. +//! +//! This function repeatedly draws the menu onto the display until the sliding +//! animation is finished and will not return to the caller until then. This +//! function is usually called from the thread context of +//! WidgetMessageQueueProcess(). +//! +//! \return Returns a non-zero value if the menu was moved or was not moved +//! because it is already at the first position. If a child widget is active +//! then this function does nothing and returns a 0. +// +//***************************************************************************** +static int32_t +SlideMenuUp(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tSlideMenu *psMenu; + tContext sContext; + uint32_t ui32MenuHeight; + uint32_t ui32Y; + + // + // If this menu widget has a child widget, that means the child widget + // is in control of the display, and there is nothing to do here. + // + if(psWidget->psChild) + { + return(0); + } + + // + // Get handy pointers to the menu widget, and the menu that is currently + // displayed. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + psMenu = psMenuWidget->psSlideMenu; + + // + // If we are already at the start of the list of menu items, then there + // is nothing else to do. + // + if(psMenu->ui32FocusIndex == 0) + { + return(1); + } + + // + // Decrement the focus menu item. This has the effect of selecting the + // previous menu item in the list. + // + psMenu->ui32FocusIndex--; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Render the menu into the off-screen buffer. This will be the same + // menu appearance as before, except the highlighted item has changed + // to the previous menu item up. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Draw a continuation of this menu in the second offscreen buffer. + // This is the part of the menu that would be drawn above this menu if the + // display were twice as tall. We are effectively creating a virtual + // display that is twice as tall as the physical display. + // + GrContextInit(&sContext, psMenuWidget->psDisplayB); + SlideMenuDraw(psMenuWidget, &sContext, + (psMenuWidget->sBase.sPosition.i16YMax - + psMenuWidget->sBase.sPosition.i16YMin)); + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Get the height of the displayed part of the menu. + // + ui32MenuHeight = psMenuWidget->psDisplayA->ui16Height; + + // + // Now copy the rendered menu into the physical display + // + // Iterate over the Y displacement of one menu item cell. This loop + // will repeatedly draw both off screen buffers to the physical display, + // adjusting the position of each by one pixel each time it is drawn. Each + // time the offset is changed so that both buffers are drawn one lower + // than the previous time. This will have the effect of "sliding" the + // entire menu down by the height of one menu item cell. + // The speed of the animation is controlled entirely by the speed of the + // processor and the speed of the interface to the physical display. + // + for(ui32Y = 0; ui32Y <= psMenuWidget->ui32MenuItemHeight; ui32Y++) + { + GrImageDraw(&sContext, psMenuWidget->psDisplayB->pvDisplayData, + psWidget->sPosition.i16XMin, + psWidget->sPosition.i16YMin + ui32Y - ui32MenuHeight); + GrImageDraw(&sContext, psMenuWidget->psDisplayA->pvDisplayData, + psWidget->sPosition.i16XMin, + psWidget->sPosition.i16YMin + ui32Y); + } + + // + // Decrement the centered menu item. This will now match the menu item + // with the focus. When the menu is repainted again, the newly selected + // menu item will be centered and highlighted. + // + psMenu->ui32CenterIndex = psMenu->ui32FocusIndex; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Render the menu into the off-screen buffer. This will be the same + // menu appearance as before, except the highlighted item has changed + // to the next menu item up. Now when a repaint occurs the menu + // will be redrawn with the newly highlighted menu item. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Return indication that we handled the key event. + // + return(1); +} + +//***************************************************************************** +// +//! Performs the sliding menu operation, in response to the "right" button. +//! +//! \param psWidget is a pointer to the slide menu widget to move to the right. +//! +//! This function will respond to the "right" key/button event. The right +//! button is used to select the next menu level below the current menu item, +//! or a widget that is activated by the menu item. The effect is that the +//! menu itself slides off to the left, and the new menu or widget slides in +//! from the right. +//! +//! This function repeatedly draws the menu onto the display until the sliding +//! animation is finished and will not return to the caller until then. This +//! function is usually called from the thread context of +//! WidgetMessageQueueProcess(). +//! +//! \return Returns a non-zero value if the menu was moved or was not moved +//! because it is already at the last position. If a child widget is active +//! then this function does nothing and returns a 0. +// +//***************************************************************************** +static int32_t +SlideMenuRight(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tSlideMenu *psMenu; + tSlideMenu *psChildMenu; + tContext sContext; + tWidget *psChildWidget; + uint32_t ui32X; + uint32_t ui32MenuWidth; + + // + // If this menu widget has a child widget, that means the child widget + // is in control of the display, and there is nothing to do here. + // + if(psWidget->psChild) + { + return(0); + } + + // + // Get handy pointers to the menu widget, and the current menu, and the + // child menu and widget if they exist. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + psMenu = psMenuWidget->psSlideMenu; + psChildMenu = psMenu->psSlideMenuItems[psMenu->ui32FocusIndex].psChildMenu; + psChildWidget = psMenu->psSlideMenuItems[psMenu->ui32FocusIndex].psChildWidget; + + // + // Initialize a context for the secondary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayB); + + // + // Render the current menu into off-screen buffer B. This + // will be the same menu appearance as is already being shown. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Now set up context for drawing into off-screen buffer A + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Process child menu of this menu item + // + if(psChildMenu) + { + // + // Switch the active menu for this SlideMenuWidget to be the child + // menu + // + psMenuWidget->psSlideMenu = psChildMenu; + + // + // Draw the new (child) menu into off-screen buffer A + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + } + + // + // Process child widget of this menu item. This only happens if there + // is no child menu. + // + else if(psChildWidget) + { + // + // Call the widget activated callback function. This will notify + // the application that a child widget has been activated by the + // menu system. + // + if(psMenuWidget->pfnActive) + { + psMenuWidget->pfnActive(psChildWidget, + &psMenu->psSlideMenuItems[psMenu->ui32FocusIndex], + 1); + } + + // + // Link the new child widget into this SlideMenuWidget so + // it appears as a child to this widget. Normally the menu widget + // has no child widget. + // + psWidget->psChild = psChildWidget; + psChildWidget->psParent = psWidget; + + // + // Fill a rectangle with the new child widget background color. + // This is done in off-screen buffer A. When the menu slides off, + // it will be replaced by a blank background that will then be + // controlled by the new child widget. + // + GrContextForegroundSet( + &sContext, + psMenu->psSlideMenuItems[psMenu->ui32FocusIndex].ui32ChildWidgetColor); + GrRectFill(&sContext, &sContext.sClipRegion); + + // + // Request a repaint for the child widget so it can draw itself once + // the menu slide is done. + // + WidgetPaint(psChildWidget); + } + + // + // There is no child menu or child widget, so there is nothing to change + // on the display. + // + else + { + return(1); + } + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Get the width of the menu widget which is used in calculations below + // + ui32MenuWidth = psMenuWidget->psDisplayA->ui16Width; + + // + // The following loop draws the two off-screen buffers onto the physical + // display using a right-to-left-wipe. This will provide an appearance + // of sliding to the left. The new child menu, or child widget background + // will slide in from the right. The "old" menu is being held in + // off-screen buffer B and the new one is in buffer A. So when we are + // done, the correct image will be in buffer A. + // + for(ui32X = 0; ui32X <= ui32MenuWidth; ui32X += 8) + { + GrImageDraw(&sContext, psMenuWidget->psDisplayB->pvDisplayData, + psWidget->sPosition.i16XMin - ui32X, + psWidget->sPosition.i16YMin); + GrImageDraw(&sContext, psMenuWidget->psDisplayA->pvDisplayData, + psWidget->sPosition.i16XMin + ui32MenuWidth - ui32X, + psWidget->sPosition.i16YMin); + } + + // + // Return indication that we handled the key event. + // + return(1); +} + +//***************************************************************************** +// +//! Performs the sliding menu operation, in response to the "left" button. +//! +//! \param psWidget is a pointer to the slide menu widget to move to the left. +//! +//! This function will respond to the "left" key/button event. The left +//! button is used to ascend to the next menu up in the menu tree. The effect +//! is that the current menu, or active widget, slides off to the right, while +//! the parent menu slides in from the left. +//! +//! This function repeatedly draws the menu onto the display until the sliding +//! animation is finished and will not return to the caller until then. This +//! function is usually called from the thread context of +//! WidgetMessageQueueProcess(). +//! +//! \return Returns a non-zero value if the menu was moved or was not moved +//! because it is already at the last position. If a child widget is active +//! then this function does nothing and returns a 0. +// +//***************************************************************************** +static int32_t +SlideMenuLeft(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tSlideMenu *psMenu; + tSlideMenu *psParentMenu; + tContext sContext; + uint32_t ui32X; + uint32_t ui32MenuWidth; + + // + // Get handy pointers to the menu widget and active menu, and the parent + // menu if there is one. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + psMenu = psMenuWidget->psSlideMenu; + psParentMenu = psMenu->psParent; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayB); + + // + // If this widget has a child, that means that the child widget is in + // control, and we are requested to go back to the previous menu item. + // Process the child widget. + // + if(psWidget->psChild) + { + // + // Call the widget de-activated callback function. This notifies the + // application that the widget is being deactivated. + // + if(psMenuWidget->pfnActive) + { + psMenuWidget->pfnActive(psWidget->psChild, + &psMenu->psSlideMenuItems[psMenu->ui32FocusIndex], + 0); + } + + // + // Unlink the child widget from the slide menu widget. The menu + // widget will now no longer have a child widget. + // + psWidget->psChild->psParent = 0; + psWidget->psChild = 0; + + // + // Fill a rectangle with the child widget background color. This will + // erase everything else that is shown on the widget but leave the + // background, which will make the change visually less jarring. + // This is done in off-screen buffer B, which is the buffer that is + // going to be slid off the screen. + // + GrContextForegroundSet( + &sContext, + psMenu->psSlideMenuItems[psMenu->ui32FocusIndex].ui32ChildWidgetColor); + GrRectFill(&sContext, &sContext.sClipRegion); + } + + // + // Otherwise there is not a child widget in control, so process the parent + // menu, if there is one. + // + else if(psParentMenu) + { + // + // Render the current menu into the off-screen buffer B. This will be + // the same menu appearance that is currently on the display. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Now switch the widget to the parent menu + // + psMenuWidget->psSlideMenu = psParentMenu; + } + + // + // Otherwise, we are already at the top level menu and there is nothing + // else to do. + // + else + { + return(1); + } + + // + // Draw the new menu in the second offscreen buffer. This is the menu + // that will be on the display when the animation is over. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Get the width of the menu widget. + // + ui32MenuWidth = psMenuWidget->psDisplayA->ui16Width; + + // + // The following loop draws the two off-screen buffers onto the physical + // display using a left-to-right. This will provide an appearance + // of sliding to the right. The parent menu will slide in from the left. + // The "old" child menu is being held in off-screen buffer B and the new + // one is in buffer A. So when we are done, the correct image will be in + // buffer A. + // + for(ui32X = 0; ui32X <= ui32MenuWidth; ui32X += 8) + { + GrImageDraw(&sContext, psMenuWidget->psDisplayB->pvDisplayData, + psWidget->sPosition.i16XMin + ui32X, + psWidget->sPosition.i16YMin); + GrImageDraw(&sContext, psMenuWidget->psDisplayA->pvDisplayData, + psWidget->sPosition.i16XMin + ui32X - ui32MenuWidth, + psWidget->sPosition.i16YMin); + } + + // + // Return indication that we handled the key event. + // + return(1); +} + +//***************************************************************************** +// +//! Handles menu selection, in response to the "select" button. +//! +//! \param psWidget is a pointer to the slide menu widget to use for a +//! select operation. +//! +//! This function will allow for checking or unchecking multi-selectable +//! menu items. If the menu does not allow multiple selection, then it +//! treats it as a "right" button press. +//! +//! \return Returns a non-zero value if the key was handled. Returns 0 if the +//! key was not handled. +// +//***************************************************************************** +static int32_t +SlideMenuClick(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tSlideMenu *psMenu; + + // + // If a child widget is in control then there is nothing to do. + // + if(psWidget->psChild) + { + return(0); + } + + // + // Get handy pointers to the menu widget and current menu. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + psMenu = psMenuWidget->psSlideMenu; + + // + // Check to see if this menu allows multiple selection. + // + if(psMenu->bMultiSelectable) + { + // + // Toggle the selection status of the currently highlighted menu + // item, and then repaint it. + // + psMenu->ui32SelectedFlags ^= 1 << psMenu->ui32FocusIndex; + SlideMenuPaint(psWidget); + + // + // We are done so return indication that we handled the key event. + // + return(1); + } + + // + // Otherwise, treat the select button the same as a right button. + // + return(SlideMenuRight(psWidget)); +} + +//***************************************************************************** +// +//! Process key/button event to decide how to move the sliding menu. +//! +//! \param psWidget is a pointer to the slide menu widget to process. +//! \param ui32Msg is the message containing the key event. +//! +//! This function is used to specifically handle key events destined for the +//! slide menu widget. It decides which menu movement function should be +//! called for each key event. +//! +//! \return Returns an indication if the key was handled. Non-zero if the +//! key event was handled or else 0. +// +//***************************************************************************** +static int32_t +SlideMenuMove(tWidget *psWidget, uint32_t ui32Msg) +{ + // + // Process the key event. + // + switch(ui32Msg) + { + // + // User presses select button. + // + case WIDGET_MSG_KEY_SELECT: + { + return(SlideMenuClick(psWidget)); + } + + // + // User presses up button. + // + case WIDGET_MSG_KEY_UP: + { + return(SlideMenuUp(psWidget)); + } + + // + // User presses down button. + // + case WIDGET_MSG_KEY_DOWN: + { + return(SlideMenuDown(psWidget)); + } + + // + // User presses left button. + // + case WIDGET_MSG_KEY_LEFT: + { + return(SlideMenuLeft(psWidget)); + } + + // + // User presses right button. + // + case WIDGET_MSG_KEY_RIGHT: + { + return(SlideMenuRight(psWidget)); + } + + // + // This is an unexpected event. Return an indication that the event + // was not handled. + // + default: + { + return(0); + } + } +} + +//***************************************************************************** +// +//! Handles messages for a slide menu widget. +//! +//! \param psWidget is a pointer to the slide menu widget. +//! \param ui32Msg is the message. +//! \param ui32Param1 is the first parameter to the message. +//! \param ui32Param2 is the second parameter to the message. +//! +//! This function receives messages intended for this slide menu widget and +//! processes them accordingly. The processing of the message varies based on +//! the message in question. +//! +//! Unrecognized messages are handled by calling WidgetDefaultMsgProc(). +//! +//! \return Returns a value appropriate to the supplied message. +// +//***************************************************************************** +int32_t +SlideMenuMsgProc(tWidget *psWidget, uint32_t ui32Msg, uint32_t ui32Param1, + uint32_t ui32Param2) +{ + // + // Check the arguments. + // + ASSERT(psWidget); + + // + // Determine which message is being sent. + // + switch(ui32Msg) + { + // + // The widget paint request has been sent. + // + case WIDGET_MSG_PAINT: + { + // + // Handle the widget paint request. + // + SlideMenuPaint(psWidget); + + // + // Return one to indicate that the message was successfully + // processed. + // + return(1); + } + + // + // A key event has been received. By convention, this widget will + // process the key events if ui32Param1 is set to this widget. + // Otherwise a different widget has the "focus" for key events. + // + case WIDGET_MSG_KEY_SELECT: + case WIDGET_MSG_KEY_UP: + case WIDGET_MSG_KEY_DOWN: + case WIDGET_MSG_KEY_LEFT: + case WIDGET_MSG_KEY_RIGHT: + { + // + // If this key event is for us, then process the event. + // + if((tWidget *)ui32Param1 == psWidget) + { + return(SlideMenuMove(psWidget, ui32Msg)); + } + } + + // + // An unknown request has been sent. This widget does not handle + // pointer events, so they get dumped here if they occur. + // + default: + { + // + // Let the default message handler process this message. + // + return(WidgetDefaultMsgProc(psWidget, ui32Msg, ui32Param1, + ui32Param2)); + } + } +} + +//***************************************************************************** +// +//! Initializes a slide menu widget. +//! +//! \param psWidget is a pointer to the slide menu widget to initialize. +//! \param psDisplay is a pointer to the display on which to draw the menu. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param psDisplayOffA is one of two off-screen displays used for rendering. +//! \param psDisplayOffB is one of two off-screen displays used for rendering. +//! \param ui32ItemHeight is the height of a menu item +//! \param ui32Foreground is the foreground color used for menu item boundaries +//! and text. +//! \param ui32Background is the background color of a menu item. +//! \param ui32Highlight is the color of a highlighted menu item. +//! \param psFont is a pointer to the font that should be used for text. +//! \param psMenu is the initial menu to display +//! +//! This function initializes the caller provided slide menu widget. +//! +//! \return None. +// +//***************************************************************************** +void +SlideMenuInit(tSlideMenuWidget *psWidget, const tDisplay *psDisplay, + int32_t i32X, int32_t i32Y, int32_t i32Width, int32_t i32Height, + tDisplay *psDisplayOffA, tDisplay *psDisplayOffB, + uint32_t ui32ItemHeight, uint32_t ui32Foreground, + uint32_t ui32Background, uint32_t ui32Highlight, + tFont *psFont, tSlideMenu *psMenu) +{ + uint32_t ui32Idx; + + // + // Check the arguments. + // + ASSERT(psWidget); + ASSERT(psDisplay); + ASSERT(psDisplayOffA); + ASSERT(psDisplayOffB); + ASSERT(psFont); + ASSERT(psMenu); + + // + // Clear out the widget structure. + // + for(ui32Idx = 0; ui32Idx < sizeof(tSlideMenuWidget); ui32Idx += 4) + { + ((uint32_t *)psWidget)[ui32Idx / 4] = 0; + } + + // + // Set the size of the widget structure. + // + psWidget->sBase.i32Size = sizeof(tSlideMenuWidget); + + // + // Mark this widget as fully disconnected. + // + psWidget->sBase.psParent = 0; + psWidget->sBase.psNext = 0; + psWidget->sBase.psChild = 0; + + // + // Save the display pointer. + // + psWidget->sBase.psDisplay = psDisplay; + + // + // Set the extents of the display area. + // + psWidget->sBase.sPosition.i16XMin = i32X; + psWidget->sBase.sPosition.i16YMin = i32Y; + psWidget->sBase.sPosition.i16XMax = i32X + i32Width - 1; + psWidget->sBase.sPosition.i16YMax = i32Y + i32Height - 1; + + // + // Initialize the widget fields + // + psWidget->psDisplayA = psDisplayOffA; + psWidget->psDisplayB = psDisplayOffB; + psWidget->ui32MenuItemHeight = ui32ItemHeight; + psWidget->ui32ColorForeground = ui32Foreground; + psWidget->ui32ColorBackground = ui32Background; + psWidget->ui32ColorHighlight = ui32Highlight; + psWidget->psFont = psFont; + psWidget->psSlideMenu = psMenu; + + // + // Use the slide menu message handler to process messages to this widget. + // + psWidget->sBase.pfnMsgProc = SlideMenuMsgProc; +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c123g/drivers/slidemenuwidget.h b/boards/dk-tm4c123g/drivers/slidemenuwidget.h new file mode 100644 index 0000000..82faa97 --- /dev/null +++ b/boards/dk-tm4c123g/drivers/slidemenuwidget.h @@ -0,0 +1,457 @@ +//***************************************************************************** +// +// slidemenuwidget.h - Prototypes for a sliding menu widget. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __SLIDEMENUWIDGET_H__ +#define __SLIDEMENUWIDGET_H__ + +//***************************************************************************** +// +//! \addtogroup slidemenuwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! The structure that describes a menu item in the menu tree. +// +//***************************************************************************** +typedef struct _SlideMenuItem +{ + // + //! A pointer to text to be rendered within the node. + // + char *pcText; + + // + //! A child menu that is activated by this menu item, if any. Can be NULL. + // + struct _SlideMenu *psChildMenu; + + // + //! A child widget that is activated by this menu item, if any. Can be + //! NULL. If both child menu and child widget are specified, the child + //! menu will be used. + // + tWidget *psChildWidget; + + // + //! A color that is used when a child widget is activated. This is the + //! color that is used as a background when the menu slides off to make + //! the screen available for the child widget. By choosing this color to + //! match the background that is used in the child widget, the sliding + //! animation and widget painting appears smoother. + // + uint32_t ui32ChildWidgetColor; +} +tSlideMenuItem; + +//***************************************************************************** +// +//! The structure that describes a menu. +// +//***************************************************************************** +typedef struct _SlideMenu +{ + // + //! The parent menu of this menu. + // + struct _SlideMenu *psParent; + + // + //! The total number of items in this menu. + // + uint32_t ui32Items; + + // + //! A pointer to the array of menu item structures. + // + tSlideMenuItem *psSlideMenuItems; + + // + //! The menu item index of the item shown on the center of the screen. + //! Normally this is the same as the menu item that has the focus, but + //! can be different during the time when the menu is "sliding". When this + //! is 0, the first menu item is shown in the center of the screen and the + //! successive items are shown below it. When non-zero, then this menu + //! item is shown in the center, with preceding menu items shown above + //! and successive items shown below. + // + uint32_t ui32CenterIndex; + + // + //! The menu item index that has the focus. + // + uint32_t ui32FocusIndex; + + // + //! A flag to indicate if more than one menu item is selectable. + // + bool bMultiSelectable; + + // + //! A set of bit flags to indicate which menu items are selected. + // + uint32_t ui32SelectedFlags; +} tSlideMenu; + +//***************************************************************************** +// +//! The structure that describes a slide menu widget. +// +//***************************************************************************** +typedef struct +{ + // + //! The generic widget information. + // + tWidget sBase; + + // + //! A pointer to an off-screen display that is used for rendering the + //! menus prior to showing on the widget's area of the screen. There + //! are two off-screen displays. Each should be the size of the widget + //! area. The palette should include any colors that are used by this + //! widget. + // + tDisplay *psDisplayA; + + // + //! A pointer to a second off-screen display. + // + tDisplay *psDisplayB; + + // + //! The height, in pixels, of a single menu item (a cell). + // + uint32_t ui32MenuItemHeight; + + // + //! The color used for drawing menu item cell boundaries and text. + // + uint32_t ui32ColorForeground; + + // + //! The background color of menu item cells. + // + uint32_t ui32ColorBackground; + + // + //! The color of a highlighted menu item. + // + uint32_t ui32ColorHighlight; + + // + //! The font to use for menu text. + // + const tFont *psFont; + + // + //! The current menu to display. + // + tSlideMenu *psSlideMenu; + + // + // A function to call when a child widget becomes active or inactive + // + void (*pfnActive)(tWidget *psWidget, tSlideMenuItem *psMenuItem, + bool bActivated); +} +tSlideMenuWidget; + +//***************************************************************************** +// +//! Declares an initialized slide menu widget data structure. +//! +//! \param pParent is a pointer to the parent widget. +//! \param pNext is a pointer to the sibling widget. +//! \param pChild is a pointer to the first child widget. +//! \param pDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param psDisplayA is one of two off-screen displays for rendering menus. +//! \param psDisplayB is one of two off-screen displays for rendering menus. +//! \param ui32MenuItemHeight is the height of a menu item. +//! \param ui32Foreground is the foreground color for menu item boundaries and +//! text. +//! \param ui32Background is the background color of the menu items. +//! \param ui32Highlight is the color of a highlighted menu item. +//! \param psFont is the font to use for the menu text. +//! \param psMenu is the initial menu to display. +//! \param pfnWidgetActive is a pointer to a function that will be called when +//! a child widget is activated or deactivated. +//! +//! This macro provides an initialized slide menu widget data structure, which +//! can be used to construct the widget tree at compile time in global variables +//! (as opposed to run-time via function calls). This must be assigned to a +//! variable, such as: +//! +//! \verbatim +//! tSlideMenuWidget g_i16SlideMenu = SlideMenuStruct(...); +//! \endverbatim +//! +//! Or, in an array of variables: +//! +//! \verbatim +//! tSlideMenuWidget g_pi16SlideMenu[] = +//! { +//! SlideMenuStruct(...), +//! SlideMenuStruct(...) +//! }; +//! \endverbatim +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define SlideMenuStruct(pParent, pNext, pChild, pDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + psDisplayA, psDisplayB, \ + ui32MenuItemHeight, ui32Foreground, ui32Background, \ + ui32Highlight, psFont, psMenu, pfnWidgetActive) \ + { \ + { \ + sizeof(tSlideMenuWidget), \ + (tWidget *)(pParent), \ + (tWidget *)(pNext), \ + (tWidget *)(pChild), \ + pDisplay, \ + { \ + i32X, \ + i32Y, \ + (i32X) + (i32Width) - 1, \ + (i32Y) + (i32Height) - 1 \ + }, \ + SlideMenuMsgProc \ + }, \ + psDisplayA, \ + psDisplayB, \ + ui32MenuItemHeight, \ + ui32Foreground, \ + ui32Background, \ + ui32Highlight, \ + psFont, \ + psMenu, \ + pfnWidgetActive \ + } + +//***************************************************************************** +// +//! Declares an initialized variable containing a slide menu widget data +//! structure. +//! +//! \param i16Name is the name of the variable to be declared. +//! \param pParent is a pointer to the parent widget. +//! \param pNext is a pointer to the sibling widget. +//! \param pChild is a pointer to the first child widget. +//! \param pDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param psDisplayA is one of two off-screen displays for rendering menus. +//! \param psDisplayB is one of two off-screen displays for rendering menus. +//! \param ui32MenuItemHeight is the height of a menu item. +//! \param ui32Foreground is the foreground color for menu item boundaries and +//! text. +//! \param ui32Background is the background color of the menu items. +//! \param ui32Highlight is the color of a highlighted menu item. +//! \param psFont is the font to use for the menu text. +//! \param psMenu is the initial menu to display. +//! \param pfnWidgetActive is a pointer to a function that will be called when +//! a child widget is activated or deactivated. +//! +//! This macro declares a variable containing an initialized slide menu widget +//! data structure, which can be used to construct the widget tree at compile +//! time in global variables (as opposed to run-time via function calls). +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define SlideMenu(i16Name, pParent, pNext, pChild, pDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + psDisplayA, psDisplayB, \ + ui32MenuItemHeight, ui32Foreground, ui32Background, \ + ui32Highlight, psFont, psMenu, pfnWidgetActive) \ + tSlideMenuWidget i16Name = \ + SlideMenuStruct(pParent, pNext, pChild, pDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + psDisplayA, psDisplayB, \ + ui32MenuItemHeight, ui32Foreground, ui32Background,\ + ui32Highlight, psFont, psMenu, pfnWidgetActive) + +//***************************************************************************** +// +//! Sets the active menu of the slide menu widget. +//! +//! \param psSlideMenuWidget is a pointer to the slide menu widget to modify. +//! \param psMenu is the new slide menu to make active. +//! +//! This function sets the active menu for the widget. +//! +//! \return None. +// +//***************************************************************************** +#define SlideMenuMenuSet(psSlideMenuWidget, psMenu) \ + do \ + { \ + (psSlideMenuWidget)->psSlideMenu = (psMenu); \ + } while(0) + +//***************************************************************************** +// +//! Sets the active callback function for a slide menu widget. +//! +//! \param psSlideMenuWidget is a pointer to the slide menu widget to modify. +//! \param pfnActivated is a function pointer to the function that should +//! be called when the menu system activates or deactivates a child widget. +//! +//! This function sets the child widget active callback function. +//! +//! \return None. +// +//***************************************************************************** +#define SlideMenuActiveCallbackSet(psSlideMenuWidget, pfnActivated) \ + do \ + { \ + (psSlideMenuWidget)->pfnActive = (pfnActivated); \ + } while(0) + +//***************************************************************************** +// +//! Gets the index of the menu item that has the focus. +//! +//! \param psSlideMenu is a pointer to the menu to query for item index. +//! +//! This function returns the index of the menu item that has the focus for +//! the specified menu. +//! +//! \return Index of the menu item that has the focus. +// +//***************************************************************************** +#define SlideMenuFocusItemGet(psSlideMenu) \ + ((psSlideMenu)->ui32FocusIndex) + +//***************************************************************************** +// +//! Gets the selected items mask for a menu. +//! +//! \param psSlideMenu is a pointer to the menu to query for selected items. +//! +//! This function returns a value that is a bit mask of any menu items that +//! are selected in the current menu. This is meant to work when a menu is +//! configured to be selectable. Then multiple menu items can be selected and +//! the selection mask indicates which are selected. +//! +//! \return Selection bit mask of selected menu items. +// +//***************************************************************************** +#define SlideMenuSelectedGet(psSlideMenu) \ + ((psSlideMenu)->ui32SelectedFlags) + +//***************************************************************************** +// +//! Sets the focus item index for a menu. +//! +//! \param psSlideMenu is a pointer to the menu to set the focus item. +//! \param ui32Focus is the index of the menu item that should have the focus. +//! +//! This function is used to specify which menu item should have the focus. +//! +//! \return None. +// +//***************************************************************************** +#define SlideMenuFocusItemSet(psSlideMenu, ui32Focus) \ + do \ + { \ + (psSlideMenu)->ui32FocusIndex = (ui32Focus); \ + (psSlideMenu)->ui32CenterIndex = (ui32Focus); \ + } while(0) + +//***************************************************************************** +// +//! Sets the selected items bit mask for a menu. +//! +//! \param psSlideMenu is a pointer to the menu to set the selection mask. +//! \param ui32Selected is a bit mask indicating which menu items should be +//! marked as selected. +//! +//! This function is used to specify which menu items are pre-selected. +//! +//! \return None. +// +//***************************************************************************** +#define SlideMenuSelectedSet(psSlideMenu, ui32Selected) \ + do \ + { \ + (psSlideMenu)->ui32SelectedFlags = (ui32Selected); \ + } while(0) + +//***************************************************************************** +// +// Prototypes for the slide menu widget APIs. +// +//***************************************************************************** +extern int32_t SlideMenuMsgProc(tWidget *psWidget, uint32_t ui32Msg, + uint32_t ui32Param1, uint32_t ui32Param2); +void SlideMenuDraw(tSlideMenuWidget *psMenuWidget, tContext *pContext, + int32_t i32OffsetY); +extern void SlideMenuInit(tSlideMenuWidget *psWidget, const tDisplay *pDisplay, + int32_t i32X, int32_t i32Y, int32_t i32Width, int32_t i32Height, + tDisplay *pDisplayOffA, tDisplay *pDisplayOffB, + uint32_t ui32ItemHeight, + uint32_t ui32Foreground, + uint32_t ui32Background, + uint32_t ui32Highlight, + tFont *psFont, tSlideMenu *psMenu); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#endif // __SLIDEMENUWIDGET_H__ diff --git a/boards/dk-tm4c123g/drivers/stripchartwidget.c b/boards/dk-tm4c123g/drivers/stripchartwidget.c new file mode 100644 index 0000000..7b1ce76 --- /dev/null +++ b/boards/dk-tm4c123g/drivers/stripchartwidget.c @@ -0,0 +1,672 @@ +//***************************************************************************** +// +// stripchartwidget.c - A simple strip chart widget. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/debug.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "stripchartwidget.h" + +//***************************************************************************** +// +//! \addtogroup stripchartwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// This is a custom widget for drawing a simple strip chart. The strip +// chart can be configured with an X/Y grid, and data series can be added +// to and displayed on the strip chart. The strip chart can be "advanced" +// so that the grid lines will move on the display. Before advancing +// the chart, the application must update the series data in the buffers. +// The strip chart will only display whatever is in the series buffers, the +// application must scroll the data in the series data buffers. By adjusting +// the data in the series data buffers, advancing the strip chart, and +// repainting, the strip chart can be made to scroll the data across the +// display. +// +//***************************************************************************** + +//***************************************************************************** +// +//! Draws the strip chart into a drawing context, off-screen buffer. +//! +//! \param psChartWidget points at the StripsChartWidget being processed. +//! \param psContext points to the context where all drawing should be done. +//! +//! This function renders a strip chart into a drawing context. +//! It assumes that the drawing context is an off-screen buffer, and that +//! the entire buffer belongs to this widget. +//! +//! \return None. +// +//***************************************************************************** +void +StripChartDraw(tStripChartWidget *psChartWidget, tContext *psContext) +{ + tStripChartAxis *psAxisY; + int32_t i32Y; + int32_t i32Ygrid; + int32_t i32X; + int32_t i32GridRange; + int32_t i32DispRange; + int32_t i32GridMin; + int32_t i32DispMax; + tStripChartSeries *psSeries; + + // + // Check the parameters + // + ASSERT(psChartWidget); + ASSERT(psContext); + ASSERT(psChartWidget->psAxisY); + + // + // Get handy pointer to Y axis + // + psAxisY = psChartWidget->psAxisY; + + // + // Find the range of Y axis in Y axis units + // + i32GridRange = psAxisY->i32Max - psAxisY->i32Min; + + // + // Find the range of the Y axis in display units (pixels) + // + i32DispRange = (psContext->sClipRegion.i16YMax - + psContext->sClipRegion.i16YMin); + + // + // Find the minimum Y units value to be shown, and the maximum of the + // clipping region. + // + i32GridMin = psAxisY->i32Min; + i32DispMax = psContext->sClipRegion.i16YMax; + + // + // Set the fg color for the rectangle fill to match what we want as the + // chart background. + // + GrContextForegroundSet(psContext, psChartWidget->ui32BackgroundColor); + GrRectFill(psContext, &psContext->sClipRegion); + + // + // Draw vertical grid lines + // + GrContextForegroundSet(psContext, psChartWidget->ui32GridColor); + for(i32X = psChartWidget->i32GridX; i32X < psContext->sClipRegion.i16XMax; + i32X += psChartWidget->psAxisX->i32GridInterval) + { + GrLineDrawV(psContext, psContext->sClipRegion.i16XMax - i32X, + psContext->sClipRegion.i16YMin, + psContext->sClipRegion.i16YMax); + } + + // + // Draw horizontal grid lines + // + for(i32Ygrid = psAxisY->i32Min; i32Ygrid < psAxisY->i32Max; + i32Ygrid += psAxisY->i32GridInterval) + { + i32Y = ((i32Ygrid - i32GridMin) * i32DispRange) / i32GridRange; + i32Y = i32DispMax - i32Y; + GrLineDrawH(psContext, psContext->sClipRegion.i16XMin, + psContext->sClipRegion.i16XMax, i32Y); + } + + // + // Compute location of Y=0 line, and draw it + // + i32Y = ((-i32GridMin) * i32DispRange) / i32GridRange; + i32Y = i32DispMax - i32Y; + GrLineDrawH(psContext, psContext->sClipRegion.i16XMin, + psContext->sClipRegion.i16XMax, i32Y); + + // + // Iterate through each series to draw it + // + psSeries = psChartWidget->psSeries; + while(psSeries) + { + int idx = 0; + + // + // Find the starting X position on the display for this series. + // If the series has less data points than can fit on the display + // then starting X can be somewhere in the middle of the screen. + // + i32X = 1 + psContext->sClipRegion.i16XMax - psSeries->ui16NumItems; + + // + // If the starting X is off the left side of the screen, then the + // staring index (idx) for reading data needs to be adjusted to the + // first value in the series that will be visible on the screen + // + if(i32X < psContext->sClipRegion.i16XMin) + { + idx = psContext->sClipRegion.i16XMin - i32X; + i32X = psContext->sClipRegion.i16XMin; + } + + // + // Set the drawing color for this series + // + GrContextForegroundSet(psContext, psSeries->ui32Color); + + // + // Scan through all possible X values, find the Y value, and draw the + // pixel. + // + for(; i32X <= psContext->sClipRegion.i16XMax; i32X++) + { + // + // Find the Y value at each position in the data series. Take into + // account the data size and the stride + // + if(psSeries->ui8DataTypeSize == 1) + { + i32Y = + ((int8_t *)psSeries->pvData)[idx * psSeries->ui8Stride]; + } + else if(psSeries->ui8DataTypeSize == 2) + { + i32Y = + ((int16_t *)psSeries->pvData)[idx * psSeries->ui8Stride]; + } + else if(psSeries->ui8DataTypeSize == 4) + { + i32Y = + ((int32_t *)psSeries->pvData)[idx * psSeries->ui8Stride]; + } + else + { + // + // If there is an invalid data size, then just force Y value + // to be off the display + // + i32Y = i32DispMax + 1; + break; + } + + // + // Advance to the next position in the data series. + // + idx++; + + // + // Now scale the Y value according to the axis scaling + // + i32Y = ((i32Y - i32GridMin) * i32DispRange) / i32GridRange; + i32Y = i32DispMax - i32Y; + + // + // Draw the pixel on the display + // + GrPixelDraw(psContext, i32X, i32Y); + } + + // + // Advance to the next series until there are no more. + // + psSeries = psSeries->psNextSeries; + } + + // + // Draw a frame around the entire chart. + // + GrContextForegroundSet(psContext, psChartWidget->ui32Y0Color); + GrRectDraw(psContext, &psContext->sClipRegion); + + // + // Draw titles + // + GrContextForegroundSet(psContext, psChartWidget->ui32TextColor); + GrContextFontSet(psContext, psChartWidget->psFont); + + // + // Draw the chart title, if there is one + // + if(psChartWidget->pcTitle) + { + GrStringDrawCentered(psContext, psChartWidget->pcTitle, -1, + psContext->sClipRegion.i16XMax / 2, + GrFontHeightGet(psChartWidget->psFont), 0); + } + + // + // Draw the Y axis max label, if there is one + // + if(psChartWidget->psAxisY->pcMaxLabel) + { + GrStringDraw(psContext, psChartWidget->psAxisY->pcMaxLabel, -1, + psContext->sClipRegion.i16XMin + + GrFontMaxWidthGet(psChartWidget->psFont) / 2, + GrFontHeightGet(psChartWidget->psFont) / 2, 0); + } + + // + // Draw the Y axis min label, if there is one + // + if(psChartWidget->psAxisY->pcMinLabel) + { + GrStringDraw(psContext, psChartWidget->psAxisY->pcMinLabel, -1, + psContext->sClipRegion.i16XMin + + GrFontMaxWidthGet(psChartWidget->psFont) / 2, + psContext->sClipRegion.i16YMax - + (GrFontHeightGet(psChartWidget->psFont) + + (GrFontHeightGet(psChartWidget->psFont) / 2)), + 0); + } + + // + // Draw a label for the name of the Y axis, if there is one + // + if(psChartWidget->psAxisY->pcName) + { + GrStringDraw(psContext, psChartWidget->psAxisY->pcName, -1, + psContext->sClipRegion.i16XMin + 1, + (psContext->sClipRegion.i16YMax / 2) - + (GrFontHeightGet(psChartWidget->psFont) / 2), + 1); + } +} + +//***************************************************************************** +// +//! Paints the strip chart on the display. +//! +//! \param psWidget is a pointer to the strip chart widget to be drawn. +//! +//! This function draws the contents of a strip chart on the display. This is +//! called in response to a \b WIDGET_MSG_PAINT message. +//! +//! \return None. +// +//***************************************************************************** +static void +StripChartPaint(tWidget *psWidget) +{ + tStripChartWidget *psChartWidget; + tContext sContext; + + // + // Check the arguments. + // + ASSERT(psWidget); + ASSERT(psWidget->psDisplay); + + // + // Convert the generic widget pointer into a strip chart widget pointer. + // + psChartWidget = (tStripChartWidget *)psWidget; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + ASSERT(psChartWidget->psOffscreenDisplay); + GrContextInit(&sContext, psChartWidget->psOffscreenDisplay); + + // + // Render the strip chart into the off-screen buffer + // + StripChartDraw(psChartWidget, &sContext); + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Now copy the rendered strip chart into the physical display + // + GrImageDraw(&sContext, psChartWidget->psOffscreenDisplay->pvDisplayData, + psWidget->sPosition.i16XMin, psWidget->sPosition.i16YMin); +} + +//***************************************************************************** +// +//! Advances the strip chart X grid by a certain number of pixels. +//! +//! \param psChartWidget is a pointer to the strip chart widget to be advanced. +//! \param i32Count is the number of positions to advance the grid. +//! +//! This function advances the X grid of the strip chart by the specified +//! number of positions. By using this function to advance the grid in +//! combination with updating the data in the series data buffers, the strip +//! chart can be made to appear to scroll across the display. +//! +//! \return None. +// +//***************************************************************************** +void +StripChartAdvance(tStripChartWidget *psChartWidget, int32_t i32Count) +{ + // + // Adjust the starting point of the X-grid + // + psChartWidget->i32GridX += i32Count; + psChartWidget->i32GridX %= psChartWidget->psAxisX->i32GridInterval; +} + +//***************************************************************************** +// +//! Adds a data series to the strip chart. +//! +//! \param psWidget is a pointer to the strip chart widget to be modified. +//! \param psNewSeries is a strip chart data series to be added to the strip +//! chart. +//! +//! This function will add a data series to the strip chart. This function +//! just links the series into the strip chart. It is up to the application +//! to make sure that the data series is initialized correctly. +//! +//! \return None. +// +//***************************************************************************** +void +StripChartSeriesAdd(tStripChartWidget *psWidget, + tStripChartSeries *psNewSeries) +{ + // + // If there is already at least one series in this chart, then link + // in to the existing chain. + // + if(psWidget->psSeries) + { + tStripChartSeries *psSeries = psWidget->psSeries; + while(psSeries->psNextSeries) + { + psSeries = psSeries->psNextSeries; + } + psSeries->psNextSeries = psNewSeries; + } + + // + // Otherwise, there is not already a series in this chart, so set this + // new series as the first series for the chart. + // + else + { + psWidget->psSeries = psNewSeries; + } + psNewSeries->psNextSeries = 0; +} + +//***************************************************************************** +// +//! Removes a data series from the strip chart. +//! +//! \param psWidget is a pointer to the strip chart widget to be modified. +//! \param psOldSeries is a strip chart data series that is to be removed +//! from the strip chart. +//! +//! This function will remove an existing data series from a strip chart. It +//! will search the list of data series for the specified series, and if +//! found it will be unlinked from the chain of data series for this strip +//! chart. +//! +//! \return None. +// +//***************************************************************************** +void +StripChartSeriesRemove(tStripChartWidget *psWidget, + tStripChartSeries *psOldSeries) +{ + // + // If the series to be removed is the first one, then find the next + // series in the chain and set it to be first. + // + if(psWidget->psSeries == psOldSeries) + { + psWidget->psSeries = psOldSeries->psNextSeries; + } + + // + // Otherwise, scan through the chain to find the old series + // + else + { + tStripChartSeries *psSeries = psWidget->psSeries; + while(psSeries->psNextSeries) + { + // + // If the old series is found, unlink it from the chain + // + if(psSeries->psNextSeries == psOldSeries) + { + psSeries->psNextSeries = psOldSeries->psNextSeries; + break; + } + else + { + psSeries = psSeries->psNextSeries; + } + } + } + + // + // Finally, set the "next" pointer of the old series to null so that + // there will not be any confusing chain fragments if this series is + // reused. + // + psOldSeries->psNextSeries = 0; +} + +//***************************************************************************** +// +//! Handles messages for a strip chart widget. +//! +//! \param psWidget is a pointer to the strip chart widget. +//! \param ui32Msg is the message. +//! \param ui32Param1 is the first parameter to the message. +//! \param ui32Param2 is the second parameter to the message. +//! +//! This function receives messages intended for this strip chart widget and +//! processes them accordingly. The processing of the message varies based on +//! the message in question. +//! +//! Unrecognized messages are handled by calling WidgetDefaultMsgProc(). +//! +//! \return Returns a value appropriate to the supplied message. +// +//***************************************************************************** +int32_t +StripChartMsgProc(tWidget *psWidget, uint32_t ui32Msg, uint32_t ui32Param1, + uint32_t ui32Param2) +{ + // + // Check the arguments. + // + ASSERT(psWidget); + + // + // Determine which message is being sent. + // + switch(ui32Msg) + { + // + // The widget paint request has been sent. + // + case WIDGET_MSG_PAINT: + { + // + // Handle the widget paint request. + // + StripChartPaint(psWidget); + + // + // Return one to indicate that the message was successfully + // processed. + // + return(1); + } + + // + // Deliberately ignore all button press messages. They may be handled + // by another widget. + // + case WIDGET_MSG_KEY_SELECT: + case WIDGET_MSG_KEY_UP: + case WIDGET_MSG_KEY_DOWN: + case WIDGET_MSG_KEY_LEFT: + case WIDGET_MSG_KEY_RIGHT: + { + return(0); + } + + // + // An unknown request has been sent. + // + default: + { + // + // Let the default message handler process this message. + // + return(WidgetDefaultMsgProc(psWidget, ui32Msg, ui32Param1, + ui32Param2)); + } + } +} + +//***************************************************************************** +// +//! Initializes a strip chart widget. +//! +//! \param psWidget is a pointer to the strip chart widget to initialize. +//! \param psDisplay is a pointer to the display on which to draw the chart. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param pcTitle is the label text for the strip chart +//! \param psFont is the font to use for drawing text on the chart. +//! \param ui32BackgroundColor is the colr of the background for the chart. +//! \param ui32TextColor is the color used for drawing text. +//! \param ui32Y0Color is the color used for drawing the Y=0 line and the frame +//! around the chart. +//! \param ui32GridColor is the color of the X/Y grid +//! \param psAxisX is a pointer to the X-axis object +//! \param psAxisY is a pointer to the Y-axis object +//! \param psOffscreenDisplay is a pointer to an offscreen display that will +//! be used for rendering the strip chart prior to drawing it on the +//! physical display. +//! +//! This function initializes the caller provided strip chart widget. +//! +//! \return None. +// +//***************************************************************************** +void +StripChartInit(tStripChartWidget *psWidget, const tDisplay *psDisplay, + int32_t i32X, int32_t i32Y, int32_t i32Width, int32_t i32Height, + char * pcTitle, tFont *psFont, + uint32_t ui32BackgroundColor, + uint32_t ui32TextColor, + uint32_t ui32Y0Color, + uint32_t ui32GridColor, + tStripChartAxis *psAxisX, tStripChartAxis *psAxisY, + tDisplay *psOffscreenDisplay) +{ + uint32_t ui32Idx; + + // + // Check the arguments. + // + ASSERT(psWidget); + ASSERT(psDisplay); + ASSERT(psAxisX); + ASSERT(psAxisY); + ASSERT(psOffscreenDisplay); + + // + // Clear out the widget structure. + // + for(ui32Idx = 0; ui32Idx < sizeof(tStripChartWidget); ui32Idx += 4) + { + ((uint32_t *)psWidget)[ui32Idx / 4] = 0; + } + + // + // Set the size of the widget structure. + // + psWidget->sBase.i32Size = sizeof(tStripChartWidget); + + // + // Mark this widget as fully disconnected. + // + psWidget->sBase.psParent = 0; + psWidget->sBase.psNext = 0; + psWidget->sBase.psChild = 0; + + // + // Save the display pointer. + // + psWidget->sBase.psDisplay = psDisplay; + + // + // Set the extents of the display area. + // + psWidget->sBase.sPosition.i16XMin = i32X; + psWidget->sBase.sPosition.i16YMin = i32Y; + psWidget->sBase.sPosition.i16XMax = i32X + i32Width - 1; + psWidget->sBase.sPosition.i16YMax = i32Y + i32Height - 1; + + // + // Initialize the widget fields + // + psWidget->pcTitle = pcTitle; + psWidget->psFont = psFont; + psWidget->ui32BackgroundColor = ui32BackgroundColor; + psWidget->ui32TextColor = ui32TextColor; + psWidget->ui32Y0Color = ui32Y0Color; + psWidget->ui32GridColor = ui32GridColor; + psWidget->psAxisX = psAxisX; + psWidget->psAxisY = psAxisY; + psWidget->psOffscreenDisplay = psOffscreenDisplay; + + // + // Use the strip chart message handler to process messages to this widget. + // + psWidget->sBase.pfnMsgProc = StripChartMsgProc; +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + diff --git a/boards/dk-tm4c123g/drivers/stripchartwidget.h b/boards/dk-tm4c123g/drivers/stripchartwidget.h new file mode 100644 index 0000000..060ba5d --- /dev/null +++ b/boards/dk-tm4c123g/drivers/stripchartwidget.h @@ -0,0 +1,392 @@ +//***************************************************************************** +// +// stripchartwidget.h - Prototypes for a strip chart widget. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __STRIPCHARTWIDGET_H__ +#define __STRIPCHARTWIDGET_H__ + +//***************************************************************************** +// +//! \addtogroup stripchartwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! A structure that represents a data series to be shown on the strip chart. +// +//***************************************************************************** +typedef struct _StripChartSeries +{ + // + //! A pointer to the next series in the chart. + // + struct _StripChartSeries *psNextSeries; + + // + //! A pointer to the brief name of the data set + // + char *pcName; + + // + //! The color of the data series. + // + uint32_t ui32Color; + + // + //! The number of bytes of the data type (1, 2, or 4) + // + uint8_t ui8DataTypeSize; + + // + //! The stride of the data. This can be used when this data set is + //! part of a larger set of samples that appear in a large array + //! interleaved at a regular interval. Use a value of 1 if the data set + //! is not interleaved. + // + uint8_t ui8Stride; + + // + //! The number of items in the data set + // + uint16_t ui16NumItems; + + // + //! A pointer to the first data item. + // + void *pvData; +} +tStripChartSeries; + +//***************************************************************************** +// +//! A structure that represents an axis of the strip chart. +// +//***************************************************************************** +typedef struct _StripChartAxis +{ + // + //! A brief name for the axis. Leave null for no name to be shown. + // + char *pcName; + + // + //! Label for the minimum extent of the axis. Leave null for no label. + // + char *pcMinLabel; + + // + //! Label for the max extent of the axis. Leave null for no label. + // + char *pcMaxLabel; + + // + //! The minimum units value for the axis. + // + int32_t i32Min; + + // + //! The maximum units value for the axis + // + int32_t i32Max; + + // + //! The grid interval for the axis. Use 0 for no grid. + // + int32_t i32GridInterval; +} tStripChartAxis; + +//***************************************************************************** +// +//! A structure that represents a strip chart widget. +// +//***************************************************************************** +typedef struct _StripChartWidget +{ + // + //! The generic widget information. + // + tWidget sBase; + + // + //! The title for the strip chart. Leave null for no title. + // + char *pcTitle; + + // + //! The font to use for drawing text on the chart. + // + const tFont *psFont; + + // + //! The background color of the chart. + // + uint32_t ui32BackgroundColor; + + // + //! The color for text that is drawn on the chart (titles, etc). + // + uint32_t ui32TextColor; + + // + //! The color of the Y-axis 0-crossing line. + // + uint32_t ui32Y0Color; + + // + //! The color of the grid lines. + // + uint32_t ui32GridColor; + + // + //! The X axis + // + tStripChartAxis *psAxisX; + + // + //! The Y axis + // + tStripChartAxis *psAxisY; + + // + //! A pointer to the first data series for the strip chart. + // + tStripChartSeries *psSeries; + + // + //! A pointer to an off-screen display to be used for rendering the chart. + // + const tDisplay *psOffscreenDisplay; + + // + //! The current X-grid alignment. This value changes in order to give the + //! appearance of the grid moving as the strip chart advances. + // + int32_t i32GridX; +} tStripChartWidget; + +//***************************************************************************** +// +//! Declares an initialized strip chart widget data structure. +//! +//! \param psParent is a pointer to the parent widget. +//! \param psNext is a pointer to the sibling widget. +//! \param psChild is a pointer to the first child widget. +//! \param psDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param pcTitle is a string for the chart title, NULL for no title. +//! \param psFont is the font used for rendering text on the chart. +//! \param ui32BackgroundColor is the background color for the chart. +//! \param ui32TextColor is the color of text (titles, labels, etc.) +//! \param ui32Y0Color is the color of the Y-axis gridline at Y=0 +//! \param ui32GridColor is the color of grid lines. +//! \param psAxisX is a pointer to the axis structure for the X-axis. +//! \param psAxisY is a pointer to the axis structure for the Y-axis. +//! \param psOffscreenDisplay is a buffer for rendering the chart before +//! showing on the physical display. The dimensions of the off-screen display +//! should match the drawing area of psDisplay. +//! +//! This macro provides an initialized strip chart widget data structure, which +//! can be used to construct the widget tree at compile time in global +//! variables (as opposed to run-time via function calls). This must be +//! assigned to a variable, such as: +//! +//! \verbatim +//! tStripChartWidget g_sStripChart = StripChartStruct(...); +//! \endverbatim +//! +//! Or, in an array of variables: +//! +//! \verbatim +//! tStripChartWidget g_psStripChart[] = +//! { +//! StripChartStruct(...), +//! StripChartStruct(...) +//! }; +//! \endverbatim +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define StripChartStruct(psParent, psNext, psChild, psDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + pcTitle, psFont, ui32BackgroundColor, ui32TextColor, \ + ui32Y0Color, ui32GridColor, psAxisX, psAxisY, \ + psOffscreenDisplay) \ + { \ + { \ + sizeof(tStripChartWidget), \ + (tWidget *)(psParent), \ + (tWidget *)(psNext), \ + (tWidget *)(psChild), \ + psDisplay, \ + { \ + i32X, \ + i32Y, \ + (i32X) + (i32Width) - 1, \ + (i32Y) + (i32Height) - 1 \ + }, \ + StripChartMsgProc \ + }, \ + pcTitle, psFont, ui32BackgroundColor, ui32TextColor, ui32Y0Color, \ + ui32GridColor, psAxisX, psAxisY, 0, psOffscreenDisplay, 0 \ + } + +//***************************************************************************** +// +//! Declares an initialized variable containing a strip chart widget data +//! structure. +//! +//! \param sName is the name of the variable to be declared. +//! \param psParent is a pointer to the parent widget. +//! \param psNext is a pointer to the sibling widget. +//! \param psChild is a pointer to the first child widget. +//! \param psDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param pcTitle is a string for the chart title, NULL for no title. +//! \param psFont is the font used for rendering text on the chart. +//! \param ui32BackgroundColor is the background color for the chart. +//! \param ui32TextColor is the color of text (titles, labels, etc.) +//! \param ui32Y0Color is the color of the Y-axis gridline at Y=0 +//! \param ui32GridColor is the color of grid lines. +//! \param psAxisX is a pointer to the axis structure for the X-axis. +//! \param psAxisY is a pointer to the axis structure for the Y-axis. +//! \param psOffscreenDisplay is a buffer for rendering the chart before +//! showing on the physical display. The dimensions of the off-screen display +//! should match the drawing area of psDisplay. +//! +//! This macro declares a variable containing an initialized strip chart widget +//! data structure, which can be used to construct the widget tree at compile +//! time in global variables (as opposed to run-time via function calls). +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define StripChart(sName, psParent, psNext, psChild, psDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + pcTitle, psFont, ui32BackgroundColor, ui32TextColor, \ + ui32Y0Color, ui32GridColor, psAxisX, psAxisY, \ + psOffscreenDisplay) \ + tStripChartWidget sName = \ + StripChartStruct(psParent, psNext, psChild, psDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + pcTitle, psFont, ui32BackgroundColor, \ + ui32TextColor, ui32Y0Color, ui32GridColor, \ + psAxisX, psAxisY, psOffscreenDisplay) + +//***************************************************************************** +// +//! Sets the X-axis of the strip chart. +//! +//! \param psStripChartWidget is a pointer to the strip chart widget to modify. +//! \param psAxis is the new X-axis structure for the strip chart. +//! +//! This function sets the X-axis for the widget. +//! +//! \return None. +// +//***************************************************************************** +#define StripChartXAxisSet(psStripChartWidget, psAxis) \ + do \ + { \ + (psStripChartWidget)->psAxisX = psAxis; \ + } while(0) + +//***************************************************************************** +// +//! Sets the Y-axis of the strip chart. +//! +//! \param psStripChartWidget is a pointer to the strip chart widget to modify. +//! \param psAxis is the new Y-axis structure for the strip chart. +//! +//! This function sets the Y-axis for the widget. +//! +//! \return None. +// +//***************************************************************************** +#define StripChartYAxisSet(psStripChartWidget, psAxis) \ + do \ + { \ + (psStripChartWidget)->psAxisY = psAxis; \ + } while(0) + +//***************************************************************************** +// +// Prototypes for the strip chart widget APIs. +// +//***************************************************************************** +extern int32_t StripChartMsgProc(tWidget *psWidget, uint32_t ui32Msg, + uint32_t ui32Param1, uint32_t ui32Param2); +extern void StripChartInit(tStripChartWidget *psWidget, + const tDisplay *psDisplay, + int32_t i32X, int32_t i32Y, + int32_t i32Width, int32_t i32Height, + char * pcTitle, tFont *psFont, + uint32_t ui32BackgroundColor, + uint32_t ui32TextColor, + uint32_t ui32Y0Color, + uint32_t ui32GridColor, + tStripChartAxis *psAxisX, tStripChartAxis *psAxisY, + tDisplay *psOffscreenDisplay); +extern void StripChartSeriesAdd(tStripChartWidget *psWidget, + tStripChartSeries *psSeries); +extern void StripChartSeriesRemove(tStripChartWidget *psWidget, + tStripChartSeries *psSeries); +extern void StripChartAdvance(tStripChartWidget *psChartWidget, + int32_t i32Count); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#endif // __STRIPCHARTWIDGET_H__ diff --git a/boards/dk-tm4c123g/drivers/usb_sound.c b/boards/dk-tm4c123g/drivers/usb_sound.c new file mode 100644 index 0000000..1fa4bc8 --- /dev/null +++ b/boards/dk-tm4c123g/drivers/usb_sound.c @@ -0,0 +1,804 @@ +//***************************************************************************** +// +// usb_sound.c - USB host audio handling functions. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "drivers/usb_sound.h" +#include "driverlib/gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhaudio.h" + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 768 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pHCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// The instance data for the USB host audio driver. +// +//***************************************************************************** +tUSBHostAudioInstance *g_psAudioInstance = 0; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// This structure holds the state information for the USB audio device. +// +//***************************************************************************** +static struct +{ + // + // Save the application provided callback function. + // + tUSBBufferCallback pfnCallbackOut; + + // + // Save the application provided callback function. + // + tUSBBufferCallback pfnCallbackIn; + + // + // The event callback for the application. + // + tEventCallback pfnCallbackEvent; + + // + // Volume control multipliers calculated from the information received + // from the audio device. + // + uint32_t pui32Steps[3]; + + // + // The currently pending audio device events. + // + uint32_t ui32EventFlags; + + // + // The current state for the audio device. + // + volatile enum + { + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Audio device is ready. + // + STATE_DEVICE_READY, + + // + // An unsupported device has been attached. + // + STATE_UNKNOWN_DEVICE, + + // + // A power fault has occurred. + // + STATE_POWER_FAULT + } eState; + +} g_sAudioState; + +//***************************************************************************** +// +// These defines are used with the ui32EventFlags in the g_sAudioState structure. +// +//***************************************************************************** +#define EVENT_OPEN 0x00000001 +#define EVENT_CLOSE 0x00000002 + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the host audio class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostAudioClassDriver + ,&g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. In this application uDMA is only used for USB, +// so only the first 6 channels are needed. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_sDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_sDMAControlTable, 1024) +tDMAControlTable g_sDMAControlTable[64]; +#else +tDMAControlTable g_sDMAControlTable[64] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// This function was the callback function registered with the USB host audio +// class driver. The only two events that are handled at this point are the +// USBH_AUDIO_EVENT_OPEN and USBH_AUDIO_EVENT_CLOSE which indicate that a new +// audio device has been found or that an existing audio device has been +// disconnected. +// +//***************************************************************************** +static void +AudioCallback(tUSBHostAudioInstance *psAudioInstance, + uint32_t ui32Event, + uint32_t ui32MsgParam, + void *pvBuffer) +{ + switch(ui32Event) + { + // + // New USB audio device has been enabled. + // + case USBH_AUDIO_EVENT_OPEN: + { + // + // Set the EVENT_OPEN flag and let the main routine handle it. + // + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_OPEN) = 1; + + break; + } + + // + // USB audio device has been removed. + // + case USBH_AUDIO_EVENT_CLOSE: + { + // + // Set the EVENT_CLOSE flag and let the main routine handle it. + // + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_CLOSE) = 1; + + break; + } + default: + { + } + } +} + +//***************************************************************************** +// +// Initializes the sound output. +// +// \param ui32Flags is unused as this point but is included for future +// functionality. +// \param pfnCallback is the event callback function for audio devices. +// +// This function prepares the sound driver to enumerate an audio device and +// prepares to play audio once a valid audio device is detected. The +// \e pfnCallback function can be used to receive callbacks when there are +// changes related to the audio device. The ui32Event parameter to the callback +// will be one of the SOUND_EVENT_* values. +// +// \return None +// +//***************************************************************************** +void +USBSoundInit(uint32_t ui32Flags, tEventCallback pfnCallback) +{ + // + // Enable the peripherals used by this example. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Set the USB power pins to be controlled by the USB controller. + // + GPIOPinTypeUSBDigital(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7); + + // + // Enable the uDMA controller and set up the control table base. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + uDMAEnable(); + uDMAControlBaseSet(g_sDMAControlTable); + + // + // Initialize the USB stack mode to OTG. + // + USBStackModeSet(0, eUSBModeOTG, 0); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the audio class driver. + // + g_psAudioInstance = USBHostAudioOpen(0, AudioCallback); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Initialize the USB controller for OTG operation with a 2ms polling + // rate. + // + USBOTGModeInit(0, 2000, g_pHCDPool, HCD_MEMORY_SIZE); + + // + // Save the event callback function. + // + g_sAudioState.pfnCallbackEvent = pfnCallback; +} + +//***************************************************************************** +// +// Sets the volume of the audio device. +// +// \param ui32Percent is the volume percentage, which must be between 0% +// (silence) and 100% (full volume), inclusive. +// +// This function sets the volume of the sound output to a value between +// silence (0%) and full volume (100%). +// +// \return None. +// +//***************************************************************************** +void +USBSoundVolumeSet(uint32_t ui32Percent) +{ + uint32_t ui32Value; + + // + // Ignore volume changes if there is no device present. + // + if(g_sAudioState.eState == STATE_DEVICE_READY) + { + // + // Scale the voltage percentage to the decibel range provided by the + // USB audio device. + // + ui32Value = (g_sAudioState.pui32Steps[1] * ui32Percent) / 100; + USBHostAudioVolumeSet(g_psAudioInstance, 0, 1, ui32Value); + + ui32Value = (g_sAudioState.pui32Steps[2] * ui32Percent) / 100; + USBHostAudioVolumeSet(g_psAudioInstance, 0, 2, ui32Value); + } +} + +//***************************************************************************** +// +// Returns the current volume level. +// +// \param ui32Channel is the 0 based channel number to query. +// +// This function returns the current volume, specified as a percentage between +// 0% (silence) and 100% (full volume), inclusive. The \e ui32Channel value +// starts with 0 which is the master audio volume control interface. The +// remaining \e ui32Channel values provide access to various other audio +// channels, with 1 and 2 being left and right audio channels. +// +// \return Returns the current volume. +// +//***************************************************************************** +uint32_t +USBSoundVolumeGet(uint32_t ui32Channel) +{ + uint32_t ui32Volume; + + // + // Initialize the return value in case there is no USB device present. + // + ui32Volume = 0xffffffff; + + // + // Ignore volume request if there is no device present. + // + if(g_sAudioState.eState == STATE_DEVICE_READY) + { + ui32Volume = USBHostAudioVolumeGet(g_psAudioInstance, 0, ui32Channel); + } + + return(ui32Volume); +} + +//***************************************************************************** +// +// This will set the current output audio format of the USB audio device. +// +// \param ui32SampleRate is the sample rate. +// \param ui32BitsPerSample is the number of bits per sample. +// \param ui32Channels is the number of channels. +// +// This sets the current audio format for the USB device that is currently +// connected. If there is no USB device connected or the format is not +// supported then the function will return a non-zero value. The function +// will return zero if the USB audio device was successfully configured to the +// requested audio format. +// +// \return Returns zero if the format was successfully set or returns an +// non-zero value if the format was not able to be set. +// +//***************************************************************************** +uint32_t +USBSoundOutputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32BitsPerSample, uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(1); + } + + // + // Call the USB Host Audio function to set the format. + // + return(USBHostAudioFormatSet(g_psAudioInstance, ui32SampleRate, + ui32BitsPerSample, ui32Channels, + USBH_AUDIO_FORMAT_OUT)); +} + +//***************************************************************************** +// +// This will set the current input audio format of the USB audio device +// +// \param ui32SampleRate is the sample rate. +// \param ui32BitsPerSample is the number of bits per sample. +// \param ui32Channels is the number of channels. +// +// This sets the current format for the USB device that is currently connect. +// If there is no USB device connected or the format is not supported then the +// function will return 0. The function will return 1 if the USB audio device +// was successfully configured to the requested format. +// +// \return Returns 1 if the format was successfully set or returns 0 if the +// format was not changed. +// +//***************************************************************************** +uint32_t +USBSoundInputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32BitsPerSample, uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(0); + } + + return(USBHostAudioFormatSet(g_psAudioInstance, ui32SampleRate, + ui32BitsPerSample, ui32Channels, + USBH_AUDIO_FORMAT_IN)); +} + +//***************************************************************************** +// +// Returns the current sample rate. +// +// This function returns the sample rate that was set by a call to +// USBSoundSetFormat(). This is needed to retrieve the exact sample rate that is +// in use in case the requested rate could not be matched exactly. +// +// \return The current sample rate in samples/second. +// +//***************************************************************************** +uint32_t +USBSoundOutputFormatGet(uint32_t ui32SampleRate, uint32_t ui32Bits, + uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(0); + } + + return(USBHostAudioFormatGet(g_psAudioInstance, ui32SampleRate, ui32Bits, + ui32Channels, USBH_AUDIO_FORMAT_OUT)); +} + +//***************************************************************************** +// +// Returns the current sample rate. +// +// This function returns the sample rate that was set by a call to +// USBSoundSetFormat(). This is needed to retrieve the exact sample rate that is +// in use in case the requested rate could not be matched exactly. +// +// \return The current sample rate in samples/second. +// +//***************************************************************************** +uint32_t +USBSoundInputFormatGet(uint32_t ui32SampleRate, uint32_t ui32Bits, + uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(0); + } + + return(USBHostAudioFormatGet(g_psAudioInstance, ui32SampleRate, ui32Bits, + ui32Channels, USBH_AUDIO_FORMAT_IN)); +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// \param pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the audio device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenerii8EventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +// \return None. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *psEventInfo; + + // + // Cast this pointer to its actual type. + // + psEventInfo = (tEventInfo *)pvData; + + switch(psEventInfo->ui32Event) + { + // + // Unknown device detected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + // + // An unknown device was detected. + // + g_sAudioState.eState = STATE_UNKNOWN_DEVICE; + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_UNKNOWN_DEV, 1); + } + + break; + } + + // + // Device unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Handle the case where an unknown device is disconnected. + // + if(g_sAudioState.eState == STATE_UNKNOWN_DEVICE) + { + g_sAudioState.eState = STATE_NO_DEVICE; + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_UNKNOWN_DEV, 0); + } + } + else + { + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_DISCONNECT, 0); + } + } + + break; + } + + // + // A power fault has occurred. + // + case USB_EVENT_POWER_FAULT: + { + // + // No power means no device is present. + // + g_sAudioState.eState = STATE_POWER_FAULT; + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This function passes along a buffer callback from the USB host audio driver +// so that the application can process or release the buffers. +// +//***************************************************************************** +void +USBHostAudioCallback(tUSBHostAudioInstance *psAudioInstance, + uint32_t ui32Event, uint32_t ui32Param, void *pvBuffer) +{ + // + // Only call the callback if it is actually present. + // + if(g_sAudioState.pfnCallbackOut) + { + g_sAudioState.pfnCallbackOut(pvBuffer, ui32Event); + } + + // + // Only call the callback if it is actually present. + // + if(g_sAudioState.pfnCallbackIn) + { + g_sAudioState.pfnCallbackIn(pvBuffer, ui32Event); + } +} + +//***************************************************************************** +// +// Starts output of a block of PCM audio samples. +// +// \param pvBuffer is a pointer to the audio data to play. +// \param ui32Size is the length of the data in bytes. +// \param pfnCallback is a function to call when this buffer has be played. +// +// This function starts the output of a block of PCM audio samples. +// +// \return This function returns a non-zero value if the buffer was accepted, +// and returns zero if the buffer was not accepted. +// +//***************************************************************************** +uint32_t +USBSoundBufferOut(const void *pvBuffer, uint32_t ui32Size, + tUSBBufferCallback pfnCallback) +{ + // + // If there is no device present or there is a pending buffer then just + // return with a failure. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(0); + } + + // + // Save this buffer callback. + // + g_sAudioState.pfnCallbackOut = pfnCallback; + + // + // Pass the buffer aint32_t to the USB host audio driver for playback. + // + return(USBHostAudioPlay(g_psAudioInstance, (void *)pvBuffer, ui32Size, + USBHostAudioCallback)); +} + +//***************************************************************************** +// +// Requests a new block of PCM audio samples from a USB audio device. +// +// \param pvBuffer is a pointer to a location to store the audio data. +// \param ui32Size is the size of the pvData buffer in bytes. +// \param pfnCallback is a function to call when this buffer has new data. +// +// This function request a new block of PCM audio samples from a USB audio +// device. +// +// \return This function returns a non-zero value if the buffer was accepted, +// and returns zero if the buffer was not accepted. +// +//***************************************************************************** +uint32_t +USBSoundBufferIn(const void *pvBuffer, uint32_t ui32Size, + tUSBBufferCallback pfnCallback) +{ + // + // If there is no device present or there is a pending buffer then just + // return with a failure. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(0); + } + + // + // Save this buffer callback. + // + g_sAudioState.pfnCallbackIn = pfnCallback; + + // + // Pass the buffer aint32_t to the USB host audio driver for input. + // + return(USBHostAudioRecord(g_psAudioInstance, (void *)pvBuffer, ui32Size, + USBHostAudioCallback)); +} + +//***************************************************************************** +// +// This function reads the audio volume settings for the USB audio device and +// saves them so that the volume can be scaled correctly. +// +//***************************************************************************** +static void +GetVolumeParameters(void) +{ + uint32_t ui32Max, ui32Min, ui32Res, ui32Channel; + + for(ui32Channel = 0; ui32Channel < 3; ui32Channel++) + { + ui32Max = USBHostAudioVolumeMaxGet(g_psAudioInstance, 0, ui32Channel); + ui32Min = USBHostAudioVolumeMinGet(g_psAudioInstance, 0, ui32Channel); + ui32Res = USBHostAudioVolumeResGet(g_psAudioInstance, 0, ui32Channel); + + g_sAudioState.pui32Steps[ui32Channel] = (ui32Max - ui32Min) / ui32Res; + } +} + +//***************************************************************************** +// +// The main routine for handling USB audio, this should be called periodically +// by the main program and pass in the amount of time in milliseconds that has +// elapsed since the last call. +// +//***************************************************************************** +void +USBMain(uint32_t ui32Ticks) +{ + // + // Tell the OTG library code how much time has passed in + // milliseconds since the last call. + // + USBOTGMain(ui32Ticks); + + switch(g_sAudioState.eState) + { + // + // This is the running state where buttons are checked and the + // screen is updated. + // + case STATE_DEVICE_READY: + { + if(HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_CLOSE)) + { + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_CLOSE) = 0; + g_sAudioState.eState = STATE_NO_DEVICE; + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_DISCONNECT, 0); + } + } + break; + } + + // + // If there is no device then just wait for one. + // + case STATE_NO_DEVICE: + { + if(HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_OPEN)) + { + g_sAudioState.eState = STATE_DEVICE_READY; + + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_OPEN) = 0; + + GetVolumeParameters(); + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_READY, 0); + } + } + break; + } + + // + // An unknown device was connected. + // + case STATE_UNKNOWN_DEVICE: + { + break; + } + + // + // Something has caused a power fault. + // + case STATE_POWER_FAULT: + { + break; + } + + default: + { + break; + } + } +} diff --git a/boards/dk-tm4c123g/drivers/usb_sound.h b/boards/dk-tm4c123g/drivers/usb_sound.h new file mode 100644 index 0000000..c9bbe8e --- /dev/null +++ b/boards/dk-tm4c123g/drivers/usb_sound.h @@ -0,0 +1,81 @@ +//***************************************************************************** +// +// usb_sound.h - USB host audio handling header definitions. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef USB_SOUND_H_ +#define USB_SOUND_H_ + +//***************************************************************************** +// +// The following are defines for the ui32Event value that is returned with the +// tEventCallback function provided to the USBSoundInit() function. +// +//***************************************************************************** + +// +// A USB audio device has been connected. +// +#define SOUND_EVENT_READY 0x00000001 + +// +// A USB device has been disconnected. +// +#define SOUND_EVENT_DISCONNECT 0x00000002 + +// +// An unknown device has been connected. +// +#define SOUND_EVENT_UNKNOWN_DEV 0x00000003 + +typedef void (* tUSBBufferCallback)(void *pvBuffer, uint32_t ui32Event); +typedef void (* tEventCallback)(uint32_t ui32Event, uint32_t ui32Param); + +extern void USBMain(uint32_t ui32Ticks); + +extern void USBSoundInit(uint32_t ui32EnableReceive, + tEventCallback pfnCallback); +extern void USBSoundVolumeSet(uint32_t ui32Percent); +extern uint32_t USBSoundVolumeGet(uint32_t ui32Channel); + +extern uint32_t USBSoundOutputFormatGet(uint32_t ui32SampleRate, + uint32_t ui32Bits, + uint32_t ui32Channels); +extern uint32_t USBSoundOutputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32Bits, + uint32_t ui32Channels); +extern uint32_t USBSoundInputFormatGet(uint32_t ui32SampleRate, + uint32_t ui32BitsPerSample, + uint32_t ui32Channels); +extern uint32_t USBSoundInputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32Bits, + uint32_t ui32Channels); + +extern uint32_t USBSoundBufferOut(const void *pvData, + uint32_t ui32Length, + tUSBBufferCallback pfnCallback); + +extern uint32_t USBSoundBufferIn(const void *pvData, + uint32_t ui32Length, + tUSBBufferCallback pfnCallback); + +#endif diff --git a/boards/dk-tm4c123g/grlib_demo/Makefile b/boards/dk-tm4c123g/grlib_demo/Makefile new file mode 100644 index 0000000..4586288 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the grlib_demo example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the grlib_demo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/grlib_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the grlib_demo example. +# +${COMPILER}/grlib_demo.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/grlib_demo.axf: ${COMPILER}/grlib_demo.o +${COMPILER}/grlib_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/grlib_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/grlib_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/grlib_demo.axf: grlib_demo.ld +SCATTERgcc_grlib_demo=grlib_demo.ld +ENTRY_grlib_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/grlib_demo/ccs/.ccsimportspec b/boards/dk-tm4c123g/grlib_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..e3668a1 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/grlib_demo/ccs/.ccsproject b/boards/dk-tm4c123g/grlib_demo/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/grlib_demo/ccs/.cproject b/boards/dk-tm4c123g/grlib_demo/ccs/.cproject new file mode 100644 index 0000000..892c826 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/grlib_demo/ccs/.project b/boards/dk-tm4c123g/grlib_demo/ccs/.project new file mode 100644 index 0000000..025c74b --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/ccs/.project @@ -0,0 +1,55 @@ + + + grlib_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + grlib_demo.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/grlib_demo/grlib_demo.c + + + grlib_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/grlib_demo/grlib_demo_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/grlib_demo/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/grlib_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/grlib_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/grlib_demo/ccs/Debug/grlib_demo.bin b/boards/dk-tm4c123g/grlib_demo/ccs/Debug/grlib_demo.bin new file mode 100644 index 0000000..bfb8004 Binary files /dev/null and b/boards/dk-tm4c123g/grlib_demo/ccs/Debug/grlib_demo.bin differ diff --git a/boards/dk-tm4c123g/grlib_demo/ccs/Debug/grlib_demo.out b/boards/dk-tm4c123g/grlib_demo/ccs/Debug/grlib_demo.out new file mode 100644 index 0000000..0c808ff Binary files /dev/null and b/boards/dk-tm4c123g/grlib_demo/ccs/Debug/grlib_demo.out differ diff --git a/boards/dk-tm4c123g/grlib_demo/ccs/macros.ini_initial b/boards/dk-tm4c123g/grlib_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/grlib_demo/ccs/target_config.ccxml b/boards/dk-tm4c123g/grlib_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/grlib_demo/ewarm/Exe/grlib_demo.bin b/boards/dk-tm4c123g/grlib_demo/ewarm/Exe/grlib_demo.bin new file mode 100644 index 0000000..8c6d1eb Binary files /dev/null and b/boards/dk-tm4c123g/grlib_demo/ewarm/Exe/grlib_demo.bin differ diff --git a/boards/dk-tm4c123g/grlib_demo/ewarm/Exe/grlib_demo.out b/boards/dk-tm4c123g/grlib_demo/ewarm/Exe/grlib_demo.out new file mode 100644 index 0000000..6ce37da Binary files /dev/null and b/boards/dk-tm4c123g/grlib_demo/ewarm/Exe/grlib_demo.out differ diff --git a/boards/dk-tm4c123g/grlib_demo/gcc/grlib_demo.axf b/boards/dk-tm4c123g/grlib_demo/gcc/grlib_demo.axf new file mode 100644 index 0000000..c175959 Binary files /dev/null and b/boards/dk-tm4c123g/grlib_demo/gcc/grlib_demo.axf differ diff --git a/boards/dk-tm4c123g/grlib_demo/gcc/grlib_demo.bin b/boards/dk-tm4c123g/grlib_demo/gcc/grlib_demo.bin new file mode 100644 index 0000000..ec5be81 Binary files /dev/null and b/boards/dk-tm4c123g/grlib_demo/gcc/grlib_demo.bin differ diff --git a/boards/dk-tm4c123g/grlib_demo/grlib_demo.c b/boards/dk-tm4c123g/grlib_demo/grlib_demo.c new file mode 100644 index 0000000..e6382bc --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/grlib_demo.c @@ -0,0 +1,248 @@ +//***************************************************************************** +// +// grlib_demo.c - Demonstration of the TivaWare Graphics Library. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Graphics Library Demonstration (grlib_demo)

+//! +//! This application provides a demonstration of the capabilities of the +//! TivaWare Graphics Library. The display will be configured to demonstrate +//! the available drawing primitives: lines, circles, rectangles, strings, and +//! images. +// +//***************************************************************************** + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The image of the TI logo. +// +//***************************************************************************** +const uint8_t g_pui8Logo[] = +{ + IMAGE_FMT_4BPP_COMP, + 30, 0, + 30, 0, + + 15, + 0x00, 0x00, 0x00, + 0x03, 0x02, 0x12, + 0x06, 0x05, 0x2b, + 0x0a, 0x08, 0x43, + 0x0d, 0x0a, 0x57, + 0x10, 0x0d, 0x69, + 0x12, 0x0e, 0x76, + 0x14, 0x10, 0x87, + 0x17, 0x12, 0x96, + 0x19, 0x14, 0xa6, + 0x1b, 0x15, 0xb1, + 0x1d, 0x17, 0xbe, + 0x1e, 0x18, 0xc8, + 0x21, 0x19, 0xd7, + 0x23, 0x1b, 0xe4, + 0x24, 0x1c, 0xed, + + 0x84, 0x02, 0x79, 0x88, 0x8a, 0x50, 0x07, 0x00, 0x00, 0x08, 0xdf, 0xff, + 0xff, 0x80, 0x07, 0x00, 0x00, 0xbf, 0x90, 0x8a, 0x35, 0x30, 0x8f, 0xff, + 0xff, 0x70, 0x01, 0x31, 0xef, 0xa0, 0x8f, 0x89, 0x03, 0xff, 0x60, 0x17, + 0x90, 0x12, 0x33, 0x10, 0x17, 0xff, 0xff, 0xca, 0x13, 0x04, 0x98, 0x16, + 0xa9, 0x9a, 0x60, 0x16, 0xff, 0x18, 0x04, 0xfd, 0x1d, 0xff, 0xff, 0x90, + 0x16, 0xfc, 0x0b, 0x04, 0xf7, 0x2f, 0xff, 0xff, 0x80, 0x15, 0xfd, 0x84, + 0x08, 0x1e, 0xf5, 0x28, 0xbf, 0x8f, 0xf7, 0x00, 0x4f, 0x00, 0xf4, 0x00, + 0x6f, 0xff, 0x90, 0x00, 0x67, 0x66, 0x0a, 0x66, 0x66, 0xdf, 0xff, 0xa1, + 0xf2, 0x51, 0xe2, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x00, 0x30, 0x9f, 0xb0, 0x34, 0xef, 0xff, 0xfc, 0x20, 0x42, 0x0b, 0x8b, + 0xff, 0xd0, 0xbf, 0x71, 0x42, 0x80, 0x22, 0x01, 0xbf, 0x0b, 0x82, 0xef, + 0x42, 0x42, 0x70, 0x22, 0x00, 0x1b, 0x0b, 0x42, 0xff, 0x35, 0x8c, 0x02, + 0x89, 0x13, 0x25, 0xff, 0x1a, 0x14, 0x00, 0xaf, 0x09, 0x04, 0xfe, 0x24, + 0x86, 0x04, 0x8f, 0x09, 0x60, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc5, 0x8f, + 0xfb, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xfd, 0x73, 0x10, 0x00, 0x00, + 0x04, 0x07, 0xfc, 0x10, 0x09, 0xfc, 0x89, 0x5f, 0xfe, 0x40, 0x51, 0x59, + 0x00, 0x00, 0x21, 0x00, 0x01, 0xef, 0x06, 0x72, 0x22, 0x21, 0x9f, 0x92, + 0x93, 0x6a, 0x7f, 0x08, 0xff, 0xee, 0xee, 0xfa, 0x97, 0x00, 0x2f, 0xff, + 0x12, 0xff, 0xff, 0xd1, 0x8f, 0x00, 0x08, 0x89, 0x50, 0x94, 0x17, 0x00, + 0x02, 0x11, 0x20, 0x17, 0x00, 0x00, 0x61, 0x4f, 0x8f, 0x03, 0x05, 0xff, + 0xff, 0x50, 0x17, 0x8c, 0x01, 0x3a, 0xdd, 0x60, 0x8f, 0x01, 0x04, 0x88, + 0x70, 0x40, 0x17, 0x47, 0x77 +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// A simple demonstration of the features of the TivaWare Graphics Library. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Idx; + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top 12 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 11; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "grlib_demo", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 5, 0); + + // + // Draw a vertical sweep of lines from red to green. + // + for(ui32Idx = 0; ui32Idx <= 8; ui32Idx++) + { + GrContextForegroundSet(&g_sContext, + (((((10 - ui32Idx) * 255) / 8) << ClrRedShift) | + (((ui32Idx * 255) / 8) << ClrGreenShift))); + GrLineDraw(&g_sContext, 60, 60, 0, 60 - (5 * ui32Idx)); + } + + // + // Draw a horizontal sweep of lines from green to blue. + // + for(ui32Idx = 1; ui32Idx <= 11; ui32Idx++) + { + GrContextForegroundSet(&g_sContext, + (((((11 - ui32Idx) * 255) / 11) << + ClrGreenShift) | + (((ui32Idx * 255) / 11) << ClrBlueShift))); + GrLineDraw(&g_sContext, 60, 60, (ui32Idx * 5), 20); + } + + // + // Draw a filled circle with an overlapping circle. + // + GrContextForegroundSet(&g_sContext, ClrBlue); + GrCircleFill(&g_sContext, 80, 30, 15); + GrContextForegroundSet(&g_sContext, ClrWhite); + GrCircleDraw(&g_sContext, 80, 30, 15); + + // + // Draw a filled rectangle with an overlapping rectangle. + // + GrContextForegroundSet(&g_sContext, ClrGray); + sRect.i16XMin = 8; + sRect.i16YMin = 45; + sRect.i16XMax = 46; + sRect.i16YMax = 51; + GrRectFill(&g_sContext, &sRect); + GrContextForegroundSet(&g_sContext, ClrWhite); + sRect.i16XMin += 4; + sRect.i16YMin += 4; + sRect.i16XMax += 4; + sRect.i16YMax += 4; + GrRectDraw(&g_sContext, &sRect); + + // + // Draw a piece of text in fonts of increasing size. + // + GrContextForegroundSet(&g_sContext, ClrBlack); + GrStringDraw(&g_sContext, "Strings", -1, 6, 16, 0); + GrContextForegroundSet(&g_sContext, ClrSilver); + GrStringDraw(&g_sContext, "Strings", -1, 7, 17, 0); + + // + // Draw an image. + // + GrTransparentImageDraw(&g_sContext, g_pui8Logo, 64, 34, ClrBlack); +#if 0 + GrImageDraw(&g_sContext, g_pui8Logo, 64, 34); +#endif + + // + // Flush any cached drawing operations. + // + GrFlush(&g_sContext); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/grlib_demo/grlib_demo.ewd b/boards/dk-tm4c123g/grlib_demo/grlib_demo.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/grlib_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/grlib_demo/grlib_demo.ewp b/boards/dk-tm4c123g/grlib_demo/grlib_demo.ewp new file mode 100644 index 0000000..e4ce289 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/grlib_demo.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\grlib_demo.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/dk-tm4c123g/grlib_demo/grlib_demo.icf b/boards/dk-tm4c123g/grlib_demo/grlib_demo.icf new file mode 100644 index 0000000..a69b15c --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/grlib_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// grlib_demo.icf - Linker configuration file for grlib_demo. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/grlib_demo/grlib_demo.ld b/boards/dk-tm4c123g/grlib_demo/grlib_demo.ld new file mode 100644 index 0000000..90d9ef8 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/grlib_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * grlib_demo.ld - Linker configuration file for grlib_demo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/grlib_demo/grlib_demo.sct b/boards/dk-tm4c123g/grlib_demo/grlib_demo.sct new file mode 100644 index 0000000..060fcdd --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/grlib_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; grlib_demo.sct - Linker configuration file for grlib_demo. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/grlib_demo/grlib_demo.uvopt b/boards/dk-tm4c123g/grlib_demo/grlib_demo.uvopt new file mode 100644 index 0000000..982429a --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/grlib_demo.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + grlib_demo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\grlib_demo.c + grlib_demo.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/grlib_demo/grlib_demo.uvproj b/boards/dk-tm4c123g/grlib_demo/grlib_demo.uvproj new file mode 100644 index 0000000..a76bfb6 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/grlib_demo.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + grlib_demo + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + grlib_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\grlib_demo.bin .\rvmdk\grlib_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + grlib_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + grlib_demo.c + 1 + .\grlib_demo.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/grlib_demo/grlib_demo_ccs.cmd b/boards/dk-tm4c123g/grlib_demo/grlib_demo_ccs.cmd new file mode 100644 index 0000000..87386d5 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/grlib_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * grlib_demo_ccs.cmd - CCS linker configuration file for grlib_demo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/grlib_demo/readme.txt b/boards/dk-tm4c123g/grlib_demo/readme.txt new file mode 100644 index 0000000..fbeba07 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/readme.txt @@ -0,0 +1,26 @@ +Graphics Library Demonstration + +This application provides a demonstration of the capabilities of the +TivaWare Graphics Library. The display will be configured to demonstrate +the available drawing primitives: lines, circles, rectangles, strings, and +images. + +------------------------------------------------------------------------------- + +Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/grlib_demo/rvmdk/grlib_demo.axf b/boards/dk-tm4c123g/grlib_demo/rvmdk/grlib_demo.axf new file mode 100644 index 0000000..bcf7f55 Binary files /dev/null and b/boards/dk-tm4c123g/grlib_demo/rvmdk/grlib_demo.axf differ diff --git a/boards/dk-tm4c123g/grlib_demo/rvmdk/grlib_demo.bin b/boards/dk-tm4c123g/grlib_demo/rvmdk/grlib_demo.bin new file mode 100644 index 0000000..d267ecd Binary files /dev/null and b/boards/dk-tm4c123g/grlib_demo/rvmdk/grlib_demo.bin differ diff --git a/boards/dk-tm4c123g/grlib_demo/startup_ccs.c b/boards/dk-tm4c123g/grlib_demo/startup_ccs.c new file mode 100644 index 0000000..90e87d8 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/grlib_demo/startup_ewarm.c b/boards/dk-tm4c123g/grlib_demo/startup_ewarm.c new file mode 100644 index 0000000..efc04f3 --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/grlib_demo/startup_gcc.c b/boards/dk-tm4c123g/grlib_demo/startup_gcc.c new file mode 100644 index 0000000..bb6936d --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/grlib_demo/startup_rvmdk.S b/boards/dk-tm4c123g/grlib_demo/startup_rvmdk.S new file mode 100644 index 0000000..12e33df --- /dev/null +++ b/boards/dk-tm4c123g/grlib_demo/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/hello/Makefile b/boards/dk-tm4c123g/hello/Makefile new file mode 100644 index 0000000..de002bf --- /dev/null +++ b/boards/dk-tm4c123g/hello/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the hello example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the hello example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/hello.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the hello example. +# +${COMPILER}/hello.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/hello.axf: ${COMPILER}/hello.o +${COMPILER}/hello.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/hello.axf: ${COMPILER}/uartstdio.o +${COMPILER}/hello.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/hello.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/hello.axf: hello.ld +SCATTERgcc_hello=hello.ld +ENTRY_hello=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/hello/ccs/.ccsimportspec b/boards/dk-tm4c123g/hello/ccs/.ccsimportspec new file mode 100644 index 0000000..77b03f5 --- /dev/null +++ b/boards/dk-tm4c123g/hello/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/hello/ccs/.ccsproject b/boards/dk-tm4c123g/hello/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/hello/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/hello/ccs/.cproject b/boards/dk-tm4c123g/hello/ccs/.cproject new file mode 100644 index 0000000..00136e4 --- /dev/null +++ b/boards/dk-tm4c123g/hello/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/hello/ccs/.project b/boards/dk-tm4c123g/hello/ccs/.project new file mode 100644 index 0000000..f8d5501 --- /dev/null +++ b/boards/dk-tm4c123g/hello/ccs/.project @@ -0,0 +1,60 @@ + + + hello + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + hello.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/hello/hello.c + + + hello_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/hello/hello_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/hello/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/hello/ccs/Debug/hello.bin b/boards/dk-tm4c123g/hello/ccs/Debug/hello.bin new file mode 100644 index 0000000..012beb3 Binary files /dev/null and b/boards/dk-tm4c123g/hello/ccs/Debug/hello.bin differ diff --git a/boards/dk-tm4c123g/hello/ccs/Debug/hello.out b/boards/dk-tm4c123g/hello/ccs/Debug/hello.out new file mode 100644 index 0000000..a9aa361 Binary files /dev/null and b/boards/dk-tm4c123g/hello/ccs/Debug/hello.out differ diff --git a/boards/dk-tm4c123g/hello/ccs/macros.ini_initial b/boards/dk-tm4c123g/hello/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/hello/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/hello/ccs/target_config.ccxml b/boards/dk-tm4c123g/hello/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/hello/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/hello/ewarm/Exe/hello.bin b/boards/dk-tm4c123g/hello/ewarm/Exe/hello.bin new file mode 100644 index 0000000..304947c Binary files /dev/null and b/boards/dk-tm4c123g/hello/ewarm/Exe/hello.bin differ diff --git a/boards/dk-tm4c123g/hello/ewarm/Exe/hello.out b/boards/dk-tm4c123g/hello/ewarm/Exe/hello.out new file mode 100644 index 0000000..6847a88 Binary files /dev/null and b/boards/dk-tm4c123g/hello/ewarm/Exe/hello.out differ diff --git a/boards/dk-tm4c123g/hello/gcc/hello.axf b/boards/dk-tm4c123g/hello/gcc/hello.axf new file mode 100644 index 0000000..0921cf4 Binary files /dev/null and b/boards/dk-tm4c123g/hello/gcc/hello.axf differ diff --git a/boards/dk-tm4c123g/hello/gcc/hello.bin b/boards/dk-tm4c123g/hello/gcc/hello.bin new file mode 100644 index 0000000..02f0f9d Binary files /dev/null and b/boards/dk-tm4c123g/hello/gcc/hello.bin differ diff --git a/boards/dk-tm4c123g/hello/hello.c b/boards/dk-tm4c123g/hello/hello.c new file mode 100644 index 0000000..bb4d731 --- /dev/null +++ b/boards/dk-tm4c123g/hello/hello.c @@ -0,0 +1,183 @@ +//***************************************************************************** +// +// hello.c - Simple hello world example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/fpu.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/pin_map.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" +#include "utils/uartstdio.h" +#include "driverlib/gpio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Hello World (hello)

+//! +//! A very simple ``hello world'' example. It simply displays ``Hello World!'' +//! on the display and is a starting point for more complicated applications. +//! This example uses calls to the TivaWare Graphics Library graphics +//! primitives functions to update the display. For a similar example using +//! widgets, please see ``hello_widget''. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// Print "Hello World!" to the display. +// +//***************************************************************************** +int +main(void) +{ + tContext sContext; + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Initialize the UART. + // + ConfigureUART(); + + UARTprintf("Hello, world!\n"); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top 24 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 23; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&sContext, ClrWhite); + GrRectDraw(&sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontCm12); + GrStringDrawCentered(&sContext, "hello", -1, + GrContextDpyWidthGet(&sContext) / 2, 10, 0); + + // + // Say hello using the Computer Modern 40 point font. + // + GrContextFontSet(&sContext, g_psFontCm12/*g_psFontFixed6x8*/); + GrStringDrawCentered(&sContext, "Hello World!", -1, + GrContextDpyWidthGet(&sContext) / 2, + ((GrContextDpyHeightGet(&sContext) - 24) / 2) + 24, + 0); + + // + // Flush any cached drawing operations. + // + GrFlush(&sContext); + + // + // We are finished. Hang around doing nothing. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/hello/hello.ewd b/boards/dk-tm4c123g/hello/hello.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/hello/hello.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/hello/hello.ewp b/boards/dk-tm4c123g/hello/hello.ewp new file mode 100644 index 0000000..0fe2c79 --- /dev/null +++ b/boards/dk-tm4c123g/hello/hello.ewp @@ -0,0 +1,795 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\hello.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c123g/hello/hello.icf b/boards/dk-tm4c123g/hello/hello.icf new file mode 100644 index 0000000..07be76c --- /dev/null +++ b/boards/dk-tm4c123g/hello/hello.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// hello.icf - Linker configuration file for hello. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/hello/hello.ld b/boards/dk-tm4c123g/hello/hello.ld new file mode 100644 index 0000000..7e56bb5 --- /dev/null +++ b/boards/dk-tm4c123g/hello/hello.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * hello.ld - Linker configuration file for hello. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/hello/hello.sct b/boards/dk-tm4c123g/hello/hello.sct new file mode 100644 index 0000000..336b457 --- /dev/null +++ b/boards/dk-tm4c123g/hello/hello.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; hello.sct - Linker configuration file for hello. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/hello/hello.uvopt b/boards/dk-tm4c123g/hello/hello.uvopt new file mode 100644 index 0000000..9c0c424 --- /dev/null +++ b/boards/dk-tm4c123g/hello/hello.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + hello + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\hello.c + hello.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/hello/hello.uvproj b/boards/dk-tm4c123g/hello/hello.uvproj new file mode 100644 index 0000000..0aeff66 --- /dev/null +++ b/boards/dk-tm4c123g/hello/hello.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + hello + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + hello + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\hello.bin .\rvmdk\hello.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + hello.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + hello.c + 1 + .\hello.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/hello/hello_ccs.cmd b/boards/dk-tm4c123g/hello/hello_ccs.cmd new file mode 100644 index 0000000..51043e7 --- /dev/null +++ b/boards/dk-tm4c123g/hello/hello_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * hello_ccs.cmd - CCS linker configuration file for hello. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c123g/hello/readme.txt b/boards/dk-tm4c123g/hello/readme.txt new file mode 100644 index 0000000..d8f5ce8 --- /dev/null +++ b/boards/dk-tm4c123g/hello/readme.txt @@ -0,0 +1,27 @@ +Hello World + +A very simple ``hello world'' example. It simply displays ``Hello World!'' +on the display and is a starting point for more complicated applications. +This example uses calls to the TivaWare Graphics Library graphics +primitives functions to update the display. For a similar example using +widgets, please see ``hello_widget''. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/hello/rvmdk/hello.axf b/boards/dk-tm4c123g/hello/rvmdk/hello.axf new file mode 100644 index 0000000..887c7e6 Binary files /dev/null and b/boards/dk-tm4c123g/hello/rvmdk/hello.axf differ diff --git a/boards/dk-tm4c123g/hello/rvmdk/hello.bin b/boards/dk-tm4c123g/hello/rvmdk/hello.bin new file mode 100644 index 0000000..d9ea5ab Binary files /dev/null and b/boards/dk-tm4c123g/hello/rvmdk/hello.bin differ diff --git a/boards/dk-tm4c123g/hello/startup_ccs.c b/boards/dk-tm4c123g/hello/startup_ccs.c new file mode 100644 index 0000000..47f191e --- /dev/null +++ b/boards/dk-tm4c123g/hello/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/hello/startup_ewarm.c b/boards/dk-tm4c123g/hello/startup_ewarm.c new file mode 100644 index 0000000..e2074d3 --- /dev/null +++ b/boards/dk-tm4c123g/hello/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/hello/startup_gcc.c b/boards/dk-tm4c123g/hello/startup_gcc.c new file mode 100644 index 0000000..35da318 --- /dev/null +++ b/boards/dk-tm4c123g/hello/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/hello/startup_rvmdk.S b/boards/dk-tm4c123g/hello/startup_rvmdk.S new file mode 100644 index 0000000..b48f9e1 --- /dev/null +++ b/boards/dk-tm4c123g/hello/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/hibernate/Makefile b/boards/dk-tm4c123g/hibernate/Makefile new file mode 100644 index 0000000..3c40719 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the hibernation example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the hibernation example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/hibernate.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the hibernation example. +# +${COMPILER}/hibernate.axf: ${COMPILER}/buttons.o +${COMPILER}/hibernate.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/hibernate.axf: ${COMPILER}/hibernate.o +${COMPILER}/hibernate.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/hibernate.axf: ${COMPILER}/uartstdio.o +${COMPILER}/hibernate.axf: ${COMPILER}/ustdlib.o +${COMPILER}/hibernate.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/hibernate.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/hibernate.axf: hibernate.ld +SCATTERgcc_hibernate=hibernate.ld +ENTRY_hibernate=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/hibernate/ccs/.ccsimportspec b/boards/dk-tm4c123g/hibernate/ccs/.ccsimportspec new file mode 100644 index 0000000..160e565 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/hibernate/ccs/.ccsproject b/boards/dk-tm4c123g/hibernate/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/hibernate/ccs/.cproject b/boards/dk-tm4c123g/hibernate/ccs/.cproject new file mode 100644 index 0000000..a3f3447 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/hibernate/ccs/.project b/boards/dk-tm4c123g/hibernate/ccs/.project new file mode 100644 index 0000000..41178e5 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/ccs/.project @@ -0,0 +1,70 @@ + + + hibernate + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + hibernate.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/hibernate/hibernate.c + + + hibernate_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/hibernate/hibernate_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/hibernate/startup_ccs.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/hibernate/ccs/Debug/hibernate.bin b/boards/dk-tm4c123g/hibernate/ccs/Debug/hibernate.bin new file mode 100644 index 0000000..5a8a198 Binary files /dev/null and b/boards/dk-tm4c123g/hibernate/ccs/Debug/hibernate.bin differ diff --git a/boards/dk-tm4c123g/hibernate/ccs/Debug/hibernate.out b/boards/dk-tm4c123g/hibernate/ccs/Debug/hibernate.out new file mode 100644 index 0000000..1942b0e Binary files /dev/null and b/boards/dk-tm4c123g/hibernate/ccs/Debug/hibernate.out differ diff --git a/boards/dk-tm4c123g/hibernate/ccs/macros.ini_initial b/boards/dk-tm4c123g/hibernate/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/hibernate/ccs/target_config.ccxml b/boards/dk-tm4c123g/hibernate/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/hibernate/ewarm/Exe/hibernate.bin b/boards/dk-tm4c123g/hibernate/ewarm/Exe/hibernate.bin new file mode 100644 index 0000000..7cd657b Binary files /dev/null and b/boards/dk-tm4c123g/hibernate/ewarm/Exe/hibernate.bin differ diff --git a/boards/dk-tm4c123g/hibernate/ewarm/Exe/hibernate.out b/boards/dk-tm4c123g/hibernate/ewarm/Exe/hibernate.out new file mode 100644 index 0000000..fa4a45c Binary files /dev/null and b/boards/dk-tm4c123g/hibernate/ewarm/Exe/hibernate.out differ diff --git a/boards/dk-tm4c123g/hibernate/gcc/hibernate.axf b/boards/dk-tm4c123g/hibernate/gcc/hibernate.axf new file mode 100644 index 0000000..fdd15be Binary files /dev/null and b/boards/dk-tm4c123g/hibernate/gcc/hibernate.axf differ diff --git a/boards/dk-tm4c123g/hibernate/gcc/hibernate.bin b/boards/dk-tm4c123g/hibernate/gcc/hibernate.bin new file mode 100644 index 0000000..e22ead6 Binary files /dev/null and b/boards/dk-tm4c123g/hibernate/gcc/hibernate.bin differ diff --git a/boards/dk-tm4c123g/hibernate/hibernate.c b/boards/dk-tm4c123g/hibernate/hibernate.c new file mode 100644 index 0000000..65abc92 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/hibernate.c @@ -0,0 +1,536 @@ +//***************************************************************************** +// +// hibernate.c - Hibernation example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/hibernate.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/rom.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" +#include "inc/hw_hibernate.h" +#include "driverlib/pin_map.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Hibernate Example (hibernate)

+//! +//! An example to demonstrate the use of the Hibernation module. The user +//! can put the microcontroller in hibernation by pressing the select +//! button. The microcontroller will then wake on its own after 5 seconds, +//! or immediately if the user presses the select button again. The program +//! keeps a count of the number of times it has entered hibernation. The +//! value of the counter is stored in the battery backed memory of the +//! Hibernation module so that it can be retrieved when the microcontroller +//! wakes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Macros to convert character based display rows and columns into the pixel +// based X and Y coordinates needed for display drawing functions. +// +//***************************************************************************** +#define Col(c) ((c) * 6) +#define Row(r) ((r) * 8) + +//***************************************************************************** +// +// A counter that counts the number of ticks of the SysTick interrupt. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount = 0; + +//***************************************************************************** +// +// A buffer to hold character strings that will be printed to the display. +// +//***************************************************************************** +static char g_pcBuf[40]; + +//***************************************************************************** +// +// Text that will be displayed if there is an error. +// +//***************************************************************************** +static char *g_pcErrorText[] = +{ + "The controller", + "did not enter", + "hibernate mode.", + "---------------------", + " PRESS BUTTON", + " TO RESTART", + 0 +}; + +//***************************************************************************** +// +// A flag to indicate the select button was pressed. +// +//***************************************************************************** +static volatile bool bSelectPressed = 0; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Delay a certain number of SysTick timer ticks. +// +//***************************************************************************** +void +SysTickWait(uint32_t ui32Ticks) +{ + ui32Ticks += g_ui32SysTickCount; + while(g_ui32SysTickCount <= ui32Ticks) + { + } +} + +//***************************************************************************** +// +// The SysTick handler. Increments a tick counter and debounces the push +// button. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + uint8_t ui8Data, ui8Delta; + + // + // Increment the tick counter. + // + g_ui32SysTickCount++; + + // + // Get buttons status using button debouncer driver + // + ui8Data = ButtonsPoll(&ui8Delta, 0); + + // + // See if the select button was just pressed. + // + if(BUTTON_PRESSED(SELECT_BUTTON, ui8Data, ui8Delta)) + { + // + // Set a flag to indicate that the select button was just pressed. + // + bSelectPressed = 1; + } + + // + // Else, see if the select button was just released. + // + if(BUTTON_RELEASED(SELECT_BUTTON, ui8Data, ui8Delta)) + { + // + // Clear the button pressed flag. + // + bSelectPressed = 0; + } +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// Run the hibernate example. Use a loop to put the microcontroller into +// hibernate mode, and to wake up based on time. Also allow the user to cause +// it to hibernate and/or wake up based on button presses. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Idx; + uint32_t ui32Status = 0; + uint32_t ui32HibernateCount = 0; + tContext sContext; + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the UART. + // + ConfigureUART(); + + // + // Initialize the OLED display + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top 24 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "hibernate", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Initialize the buttons driver + // + ButtonsInit(); + + // + // Set up systick to generate interrupts at 100 Hz. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / 100); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Enable the Hibernation module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); + + // + // Print wake cause message on display. + // + GrStringDrawCentered(&sContext, "Wake due to:", -1, + GrContextDpyWidthGet(&sContext) / 2, Row(2) + 4, + true); + + // + // Check to see if Hibernation module is already active, which could mean + // that the processor is waking from a hibernation. + // + if(HibernateIsActive()) + { + // + // Read the status bits to see what caused the wake. + // + ui32Status = HibernateIntStatus(0); + HibernateIntClear(ui32Status); + + // + // Wake was due to the push button. + // + if(ui32Status & HIBERNATE_INT_PIN_WAKE) + { + GrStringDrawCentered(&sContext, "BUTTON", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(3) + 4, true); + } + + // + // Wake was due to RTC match + // + else if(ui32Status & HIBERNATE_INT_RTC_MATCH_0) + { + GrStringDrawCentered(&sContext, "TIMEOUT", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(3) + 4, true); + } + + // + // Wake is due to neither button nor RTC, so it must have been a hard + // reset. + // + else + { + GrStringDrawCentered(&sContext, "RESET", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(3) + 4, true); + } + + // + // If the wake is due to button or RTC, then read the first location + // from the battery backed memory, as the hibernation count. + // + if(ui32Status & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0)) + { + HibernateDataGet(&ui32HibernateCount, 1); + } + } + + // + // Enable the Hibernation module. This should always be called, even if + // the module was already enabled, because this function also initializes + // some timing parameters. + // + HibernateEnableExpClk(ROM_SysCtlClockGet()); + + // + // If the wake was not due to button or RTC match, then it was a reset. + // + if(!(ui32Status & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0))) + { + // + // Configure the module clock source. + // + HibernateClockConfig(HIBERNATE_OSC_LOWDRIVE); + + // + // Finish the wake cause message. + // + GrStringDrawCentered(&sContext, "RESET", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(3) + 4, true); + + // + // Wait a couple of seconds in case we need to break in with the + // debugger. + // + SysTickWait(3 * 100); + + // + // Allow time for the crystal to power up. This line is separated from + // the above to make it clear this is still needed, even if the above + // delay is removed. + // + SysTickWait(15); + } + + // + // Print the count of times that hibernate has occurred. + // + usnprintf(g_pcBuf, sizeof(g_pcBuf), "Hib count=%4u", ui32HibernateCount); + GrStringDrawCentered(&sContext, g_pcBuf, -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(1) + 4, true); + + // + // Print messages on the screen about hibernation. + // + GrStringDrawCentered(&sContext, "Select to Hib", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(4) + 4, true); + GrStringDrawCentered(&sContext, "Wake in 5 s,", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(5) + 4, true); + GrStringDrawCentered(&sContext, "or press Select", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(6) + 4, true); + GrStringDrawCentered(&sContext, "for immed. wake.", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(7) + 4, true); + + // + // Clear the button pressed flag, in case it was held down at the + // beginning. + // + bSelectPressed = 0; + + // + // Wait for user to press the button. + // + while(!bSelectPressed) + { + // + // Wait a bit before looping again. + // + SysTickWait(10); + } + + // + // Tell user to release the button. + // + GrStringDrawCentered(&sContext, " ", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(4) + 4, true); + GrStringDrawCentered(&sContext, " Release the ", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(5) + 4, true); + GrStringDrawCentered(&sContext, " button. ", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(6) + 4, true); + GrStringDrawCentered(&sContext, " ", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(7) + 4, true); + + // + // Wait for user to release the button. + // + while(bSelectPressed) + { + } + + // + // If hibernation count is very large, it may be that there was already + // a value in the hibernate memory, so reset the count. + // + ui32HibernateCount = (ui32HibernateCount > 10000) ? 0 : ui32HibernateCount; + + // + // Increment the hibernation count, and store it in the battery backed + // memory. + // + ui32HibernateCount++; + HibernateDataSet(&ui32HibernateCount, 1); + + // + // Clear and enable the RTC and set the match registers to 5 seconds in the + // future. Set both to same, though they could be set differently, the + // first to match will cause a wake. + // + HibernateRTCSet(0); + HibernateRTCEnable(); + HibernateRTCMatchSet(0, 5); + + // + // Set wake condition on pin or RTC match. Board will wake when 5 seconds + // elapses, or when the button is pressed. + // + HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC); + + // + // Request hibernation. + // + HibernateRequest(); + + // + // Give it time to activate, it should never get past this wait. + // + SysTickWait(100); + + // + // Should not have got here, something is wrong. Print an error message to + // the user. + // + sRect.i16XMin = 0; + sRect.i16XMax = 95; + sRect.i16YMin = 0; + sRect.i16YMax = 63; + GrContextForegroundSet(&sContext, ClrBlack); + GrRectFill(&sContext, &sRect); + GrContextForegroundSet(&sContext, ClrWhite); + ui32Idx = 0; + while(g_pcErrorText[ui32Idx]) + { + GrStringDraw(&sContext, g_pcErrorText[ui32Idx], -1, Col(0), + Row(ui32Idx), true); + ui32Idx++; + } + + // + // Wait for the user to press the button, then restart the app. + // + bSelectPressed = 0; + while(!bSelectPressed) + { + } + + // + // Reset the processor. + // + ROM_SysCtlReset(); + + // + // Finished. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/hibernate/hibernate.ewd b/boards/dk-tm4c123g/hibernate/hibernate.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/hibernate.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/hibernate/hibernate.ewp b/boards/dk-tm4c123g/hibernate/hibernate.ewp new file mode 100644 index 0000000..688ec14 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/hibernate.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\hibernate.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c123g/hibernate/hibernate.icf b/boards/dk-tm4c123g/hibernate/hibernate.icf new file mode 100644 index 0000000..9838916 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/hibernate.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// hibernate.icf - Linker configuration file for hibernate. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/hibernate/hibernate.ld b/boards/dk-tm4c123g/hibernate/hibernate.ld new file mode 100644 index 0000000..608f678 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/hibernate.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * hibernate.ld - Linker configuration file for hibernate. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/hibernate/hibernate.sct b/boards/dk-tm4c123g/hibernate/hibernate.sct new file mode 100644 index 0000000..e3ddf00 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/hibernate.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; hibernate.sct - Linker configuration file for hibernate. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/hibernate/hibernate.uvopt b/boards/dk-tm4c123g/hibernate/hibernate.uvopt new file mode 100644 index 0000000..1674e39 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/hibernate.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + hibernate + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\hibernate.c + hibernate.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/hibernate/hibernate.uvproj b/boards/dk-tm4c123g/hibernate/hibernate.uvproj new file mode 100644 index 0000000..21d5cf2 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/hibernate.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + hibernate + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + hibernate + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\hibernate.bin .\rvmdk\hibernate.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + hibernate.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + hibernate.c + 1 + .\hibernate.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/hibernate/hibernate_ccs.cmd b/boards/dk-tm4c123g/hibernate/hibernate_ccs.cmd new file mode 100644 index 0000000..6b6c7ce --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/hibernate_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * hibernate_ccs.cmd - CCS linker configuration file for hibernate. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c123g/hibernate/readme.txt b/boards/dk-tm4c123g/hibernate/readme.txt new file mode 100644 index 0000000..f5fe49b --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/readme.txt @@ -0,0 +1,30 @@ +Hibernate Example + +An example to demonstrate the use of the Hibernation module. The user +can put the microcontroller in hibernation by pressing the select +button. The microcontroller will then wake on its own after 5 seconds, +or immediately if the user presses the select button again. The program +keeps a count of the number of times it has entered hibernation. The +value of the counter is stored in the battery backed memory of the +Hibernation module so that it can be retrieved when the microcontroller +wakes. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/hibernate/rvmdk/hibernate.axf b/boards/dk-tm4c123g/hibernate/rvmdk/hibernate.axf new file mode 100644 index 0000000..25e151d Binary files /dev/null and b/boards/dk-tm4c123g/hibernate/rvmdk/hibernate.axf differ diff --git a/boards/dk-tm4c123g/hibernate/rvmdk/hibernate.bin b/boards/dk-tm4c123g/hibernate/rvmdk/hibernate.bin new file mode 100644 index 0000000..8fd2775 Binary files /dev/null and b/boards/dk-tm4c123g/hibernate/rvmdk/hibernate.bin differ diff --git a/boards/dk-tm4c123g/hibernate/startup_ccs.c b/boards/dk-tm4c123g/hibernate/startup_ccs.c new file mode 100644 index 0000000..f8caf41 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/hibernate/startup_ewarm.c b/boards/dk-tm4c123g/hibernate/startup_ewarm.c new file mode 100644 index 0000000..db40455 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/hibernate/startup_gcc.c b/boards/dk-tm4c123g/hibernate/startup_gcc.c new file mode 100644 index 0000000..2ffa03c --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/hibernate/startup_rvmdk.S b/boards/dk-tm4c123g/hibernate/startup_rvmdk.S new file mode 100644 index 0000000..d86f250 --- /dev/null +++ b/boards/dk-tm4c123g/hibernate/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/interrupts/Makefile b/boards/dk-tm4c123g/interrupts/Makefile new file mode 100644 index 0000000..62cd88a --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the interrupts example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the interrupts example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/interrupts.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the interrupts example. +# +${COMPILER}/interrupts.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/interrupts.axf: ${COMPILER}/interrupts.o +${COMPILER}/interrupts.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/interrupts.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/interrupts.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/interrupts.axf: interrupts.ld +SCATTERgcc_interrupts=interrupts.ld +ENTRY_interrupts=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/interrupts/ccs/.ccsimportspec b/boards/dk-tm4c123g/interrupts/ccs/.ccsimportspec new file mode 100644 index 0000000..9033256 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/interrupts/ccs/.ccsproject b/boards/dk-tm4c123g/interrupts/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/interrupts/ccs/.cproject b/boards/dk-tm4c123g/interrupts/ccs/.cproject new file mode 100644 index 0000000..4547831 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/interrupts/ccs/.project b/boards/dk-tm4c123g/interrupts/ccs/.project new file mode 100644 index 0000000..6c9a969 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/ccs/.project @@ -0,0 +1,55 @@ + + + interrupts + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + interrupts.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/interrupts/interrupts.c + + + interrupts_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/interrupts/interrupts_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/interrupts/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/interrupts/ccs/Debug/interrupts.bin b/boards/dk-tm4c123g/interrupts/ccs/Debug/interrupts.bin new file mode 100644 index 0000000..8dce1f5 Binary files /dev/null and b/boards/dk-tm4c123g/interrupts/ccs/Debug/interrupts.bin differ diff --git a/boards/dk-tm4c123g/interrupts/ccs/Debug/interrupts.out b/boards/dk-tm4c123g/interrupts/ccs/Debug/interrupts.out new file mode 100644 index 0000000..aa7aa4b Binary files /dev/null and b/boards/dk-tm4c123g/interrupts/ccs/Debug/interrupts.out differ diff --git a/boards/dk-tm4c123g/interrupts/ccs/macros.ini_initial b/boards/dk-tm4c123g/interrupts/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/interrupts/ccs/target_config.ccxml b/boards/dk-tm4c123g/interrupts/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/interrupts/ewarm/Exe/interrupts.bin b/boards/dk-tm4c123g/interrupts/ewarm/Exe/interrupts.bin new file mode 100644 index 0000000..3ede8df Binary files /dev/null and b/boards/dk-tm4c123g/interrupts/ewarm/Exe/interrupts.bin differ diff --git a/boards/dk-tm4c123g/interrupts/ewarm/Exe/interrupts.out b/boards/dk-tm4c123g/interrupts/ewarm/Exe/interrupts.out new file mode 100644 index 0000000..8d094cb Binary files /dev/null and b/boards/dk-tm4c123g/interrupts/ewarm/Exe/interrupts.out differ diff --git a/boards/dk-tm4c123g/interrupts/gcc/interrupts.axf b/boards/dk-tm4c123g/interrupts/gcc/interrupts.axf new file mode 100644 index 0000000..d6b412a Binary files /dev/null and b/boards/dk-tm4c123g/interrupts/gcc/interrupts.axf differ diff --git a/boards/dk-tm4c123g/interrupts/gcc/interrupts.bin b/boards/dk-tm4c123g/interrupts/gcc/interrupts.bin new file mode 100644 index 0000000..034d8f2 Binary files /dev/null and b/boards/dk-tm4c123g/interrupts/gcc/interrupts.bin differ diff --git a/boards/dk-tm4c123g/interrupts/interrupts.c b/boards/dk-tm4c123g/interrupts/interrupts.c new file mode 100644 index 0000000..7f82785 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/interrupts.c @@ -0,0 +1,592 @@ +//***************************************************************************** +// +// interrupts.c - Interrupt preemption and tail-chaining example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/systick.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Interrupts (interrupts)

+//! +//! This example application demonstrates the interrupt preemption and +//! tail-chaining capabilities of Cortex-M4 microprocessor and NVIC. Nested +//! interrupts are synthesized when the interrupts have the same priority, +//! increasing priorities, and decreasing priorities. With increasing +//! priorities, preemption will occur; in the other two cases tail-chaining +//! will occur. The currently pending interrupts and the currently executing +//! interrupt will be displayed on the display; GPIO pins D0, D1 and D2 will +//! be asserted upon interrupt handler entry and de-asserted before interrupt +//! handler exit so that the off-to-on time can be observed with a scope or +//! logic analyzer to see the speed of tail-chaining (for the two cases where +//! tail-chaining is occurring). +// +//***************************************************************************** + +//***************************************************************************** +// +// The count of interrupts received. This is incremented as each interrupt +// handler runs, and its value saved into interrupt handler specific values to +// determine the order in which the interrupt handlers were executed. +// +//***************************************************************************** +volatile uint32_t g_ui32Index; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOA interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOa; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOB interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOb; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOC interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOc; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Delay for the specified number of seconds. Depending upon the current +// SysTick value, the delay will be between N-1 and N seconds (i.e. N-1 full +// seconds are guaranteed, along with the remainder of the current second). +// +//***************************************************************************** +void +Delay(uint32_t ui32Seconds) +{ + // + // Loop while there are more seconds to wait. + // + while(ui32Seconds--) + { + // + // Wait until the SysTick value is less than 1000. + // + while(ROM_SysTickValueGet() > 1000) + { + } + + // + // Wait until the SysTick value is greater than 1000. + // + while(ROM_SysTickValueGet() < 1000) + { + } + } +} + +//***************************************************************************** +// +// Display the interrupt state on the CSTN. The currently active and pending +// interrupts are displayed. +// +//***************************************************************************** +void +DisplayIntStatus(void) +{ + uint32_t ui32Temp; + char pcBuffer[6]; + + // + // Display the currently active interrupts. + // + ui32Temp = HWREG(NVIC_ACTIVE0); + pcBuffer[0] = ' '; + pcBuffer[1] = (ui32Temp & 1) ? '1' : ' '; + pcBuffer[2] = (ui32Temp & 2) ? '2' : ' '; + pcBuffer[3] = (ui32Temp & 4) ? '3' : ' '; + pcBuffer[4] = ' '; + pcBuffer[5] = '\0'; + GrStringDraw(&g_sContext, pcBuffer, -1, 48, 32, 1); + + // + // Display the currently pending interrupts. + // + ui32Temp = HWREG(NVIC_PEND0); + pcBuffer[1] = (ui32Temp & 1) ? '1' : ' '; + pcBuffer[2] = (ui32Temp & 2) ? '2' : ' '; + pcBuffer[3] = (ui32Temp & 4) ? '3' : ' '; + GrStringDraw(&g_sContext, pcBuffer, -1, 48, 44, 1); + + // + // Flush the display. + // + GrFlush(&g_sContext); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOA. It simply saves the interrupt sequence +// number. +// +//***************************************************************************** +void +IntGPIOa(void) +{ + // + // Set PB3 high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, GPIO_PIN_0); + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOa = g_ui32Index++; + + // + // Set PB3 low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 0); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOB. It triggers INT_GPIOA and saves the +// interrupt sequence number. +// +//***************************************************************************** +void +IntGPIOb(void) +{ + // + // Set PF2 high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1, GPIO_PIN_1); + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Trigger the INT_GPIOA interrupt. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOA - 16; + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOb = g_ui32Index++; + + // + // Set PDF2 low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1, 0); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOC. It triggers INT_GPIOB and saves the +// interrupt sequence number. +// +//***************************************************************************** +void +IntGPIOc(void) +{ + // + // Set PF3 high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_2, GPIO_PIN_2); + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Trigger the INT_GPIOB interrupt. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOB - 16; + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOc = g_ui32Index++; + + // + // Set PF3 low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_2, 0); +} + +//***************************************************************************** +// +// This is the main example program. It checks to see that the interrupts are +// processed in the correct order when they have identical priorities, +// increasing priorities, and decreasing priorities. This exercises interrupt +// preemption and tail chaining. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + uint_fast8_t ui8Error; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "interrupts", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Put the status header text on the display. + // + GrStringDraw(&g_sContext, "Active:", -1, 6, 32, 0); + GrStringDraw(&g_sContext, "Pending:", -1, 0, 44, 0); + + // + // Configure the PB0-PB2 to be outputs to indicate entry/exit of one + // of the interrupt handlers. + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | + GPIO_PIN_3); + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, 0); + + // + // Set up and enable the SysTick timer. It will be used as a reference + // for delay loops in the interrupt handlers. The SysTick timer period + // will be set up for one second. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet()); + ROM_SysTickEnable(); + + // + // Reset the error indicator. + // + ui8Error = 0; + + // + // Enable interrupts to the processor. + // + ROM_IntMasterEnable(); + + // + // Enable the interrupts. + // + ROM_IntEnable(INT_GPIOA); + ROM_IntEnable(INT_GPIOB); + ROM_IntEnable(INT_GPIOC); + + // + // Indicate that the equal interrupt priority test is beginning. + // + GrStringDrawCentered(&g_sContext, "Equal Pri", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 20, 1); + + // + // Set the interrupt priorities so they are all equal. + // + ROM_IntPrioritySet(INT_GPIOA, 0x00); + ROM_IntPrioritySet(INT_GPIOB, 0x00); + ROM_IntPrioritySet(INT_GPIOC, 0x00); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the LCD. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 3) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 1)) + { + ui8Error |= 1; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Indicate that the decreasing interrupt priority test is beginning. + // + GrStringDrawCentered(&g_sContext, " Decreasing Pri ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 20, 1); + + // + // Set the interrupt priorities so that they are decreasing (i.e. C > B > + // A). + // + ROM_IntPrioritySet(INT_GPIOA, 0x80); + ROM_IntPrioritySet(INT_GPIOB, 0x40); + ROM_IntPrioritySet(INT_GPIOC, 0x00); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the CSTN. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 3) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 1)) + { + ui8Error |= 2; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Indicate that the increasing interrupt priority test is beginning. + // + GrStringDrawCentered(&g_sContext, " Increasing Pri ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 20, 1); + + // + // Set the interrupt priorities so that they are increasing (i.e. C < B < + // A). + // + ROM_IntPrioritySet(INT_GPIOA, 0x00); + ROM_IntPrioritySet(INT_GPIOB, 0x40); + ROM_IntPrioritySet(INT_GPIOC, 0x80); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the CSTN. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 1) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 3)) + { + ui8Error |= 4; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Disable the interrupts. + // + ROM_IntDisable(INT_GPIOA); + ROM_IntDisable(INT_GPIOB); + ROM_IntDisable(INT_GPIOC); + + // + // Disable interrupts to the processor. + // + ROM_IntMasterDisable(); + + // + // Print out results if error occurred. + // + if(ui8Error) + { + GrStringDraw(&g_sContext, "Equal: P ", -1, 0, 32, 1); + GrStringDraw(&g_sContext, " Inc: P ", -1, 0, 44, 1); + GrStringDraw(&g_sContext, " Dec: P ", -1, 0, 56, 1); + if(ui8Error & 1) + { + GrStringDraw(&g_sContext, "F ", -1, 42, 32, 1); + } + if(ui8Error & 2) + { + GrStringDraw(&g_sContext, "F ", -1, 42, 44, 1); + } + if(ui8Error & 4) + { + GrStringDraw(&g_sContext, "F ", -1, 42, 56, 1); + } + } + else + { + GrStringDrawCentered(&g_sContext, " Success! ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 20, 1); + } + + // + // Flush the display. + // + GrFlush(&g_sContext); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/interrupts/interrupts.ewd b/boards/dk-tm4c123g/interrupts/interrupts.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/interrupts.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/interrupts/interrupts.ewp b/boards/dk-tm4c123g/interrupts/interrupts.ewp new file mode 100644 index 0000000..6f5250d --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/interrupts.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\interrupts.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/dk-tm4c123g/interrupts/interrupts.icf b/boards/dk-tm4c123g/interrupts/interrupts.icf new file mode 100644 index 0000000..6e3a240 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/interrupts.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// interrupts.icf - Linker configuration file for interrupts. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/interrupts/interrupts.ld b/boards/dk-tm4c123g/interrupts/interrupts.ld new file mode 100644 index 0000000..f954ad3 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/interrupts.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * interrupts.ld - Linker configuration file for interrupts. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/interrupts/interrupts.sct b/boards/dk-tm4c123g/interrupts/interrupts.sct new file mode 100644 index 0000000..1b7fd68 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/interrupts.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; interrupts.sct - Linker configuration file for interrupts. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/interrupts/interrupts.uvopt b/boards/dk-tm4c123g/interrupts/interrupts.uvopt new file mode 100644 index 0000000..9742887 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/interrupts.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + interrupts + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\interrupts.c + interrupts.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/interrupts/interrupts.uvproj b/boards/dk-tm4c123g/interrupts/interrupts.uvproj new file mode 100644 index 0000000..d432586 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/interrupts.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + interrupts + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + interrupts + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\interrupts.bin .\rvmdk\interrupts.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + interrupts.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + interrupts.c + 1 + .\interrupts.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/interrupts/interrupts_ccs.cmd b/boards/dk-tm4c123g/interrupts/interrupts_ccs.cmd new file mode 100644 index 0000000..21e7074 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/interrupts_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * interrupts_ccs.cmd - CCS linker configuration file for interrupts. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/interrupts/readme.txt b/boards/dk-tm4c123g/interrupts/readme.txt new file mode 100644 index 0000000..5f21a24 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/readme.txt @@ -0,0 +1,33 @@ +Interrupts + +This example application demonstrates the interrupt preemption and +tail-chaining capabilities of Cortex-M4 microprocessor and NVIC. Nested +interrupts are synthesized when the interrupts have the same priority, +increasing priorities, and decreasing priorities. With increasing +priorities, preemption will occur; in the other two cases tail-chaining +will occur. The currently pending interrupts and the currently executing +interrupt will be displayed on the display; GPIO pins D0, D1 and D2 will +be asserted upon interrupt handler entry and de-asserted before interrupt +handler exit so that the off-to-on time can be observed with a scope or +logic analyzer to see the speed of tail-chaining (for the two cases where +tail-chaining is occurring). + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/interrupts/rvmdk/interrupts.axf b/boards/dk-tm4c123g/interrupts/rvmdk/interrupts.axf new file mode 100644 index 0000000..7027fba Binary files /dev/null and b/boards/dk-tm4c123g/interrupts/rvmdk/interrupts.axf differ diff --git a/boards/dk-tm4c123g/interrupts/rvmdk/interrupts.bin b/boards/dk-tm4c123g/interrupts/rvmdk/interrupts.bin new file mode 100644 index 0000000..72077ec Binary files /dev/null and b/boards/dk-tm4c123g/interrupts/rvmdk/interrupts.bin differ diff --git a/boards/dk-tm4c123g/interrupts/startup_ccs.c b/boards/dk-tm4c123g/interrupts/startup_ccs.c new file mode 100644 index 0000000..483e640 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/interrupts/startup_ewarm.c b/boards/dk-tm4c123g/interrupts/startup_ewarm.c new file mode 100644 index 0000000..ad8a003 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/interrupts/startup_gcc.c b/boards/dk-tm4c123g/interrupts/startup_gcc.c new file mode 100644 index 0000000..1d09e42 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/interrupts/startup_rvmdk.S b/boards/dk-tm4c123g/interrupts/startup_rvmdk.S new file mode 100644 index 0000000..2623172 --- /dev/null +++ b/boards/dk-tm4c123g/interrupts/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN IntGPIOa + EXTERN IntGPIOb + EXTERN IntGPIOc + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntGPIOa ; GPIO Port A + DCD IntGPIOb ; GPIO Port B + DCD IntGPIOc ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/mpu_fault/Makefile b/boards/dk-tm4c123g/mpu_fault/Makefile new file mode 100644 index 0000000..dba04e8 --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the MPU example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the MPU example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/mpu_fault.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the MPU example. +# +${COMPILER}/mpu_fault.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/mpu_fault.axf: ${COMPILER}/mpu_fault.o +${COMPILER}/mpu_fault.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/mpu_fault.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/mpu_fault.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/mpu_fault.axf: mpu_fault.ld +SCATTERgcc_mpu_fault=mpu_fault.ld +ENTRY_mpu_fault=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/mpu_fault/ccs/.ccsimportspec b/boards/dk-tm4c123g/mpu_fault/ccs/.ccsimportspec new file mode 100644 index 0000000..2bef69c --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/mpu_fault/ccs/.ccsproject b/boards/dk-tm4c123g/mpu_fault/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/mpu_fault/ccs/.cproject b/boards/dk-tm4c123g/mpu_fault/ccs/.cproject new file mode 100644 index 0000000..659a20e --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/mpu_fault/ccs/.project b/boards/dk-tm4c123g/mpu_fault/ccs/.project new file mode 100644 index 0000000..f18a075 --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/ccs/.project @@ -0,0 +1,55 @@ + + + mpu_fault + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + mpu_fault.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/mpu_fault/mpu_fault.c + + + mpu_fault_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/mpu_fault/mpu_fault_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/mpu_fault/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/mpu_fault/ccs/Debug/mpu_fault.bin b/boards/dk-tm4c123g/mpu_fault/ccs/Debug/mpu_fault.bin new file mode 100644 index 0000000..0e2182e Binary files /dev/null and b/boards/dk-tm4c123g/mpu_fault/ccs/Debug/mpu_fault.bin differ diff --git a/boards/dk-tm4c123g/mpu_fault/ccs/Debug/mpu_fault.out b/boards/dk-tm4c123g/mpu_fault/ccs/Debug/mpu_fault.out new file mode 100644 index 0000000..4804141 Binary files /dev/null and b/boards/dk-tm4c123g/mpu_fault/ccs/Debug/mpu_fault.out differ diff --git a/boards/dk-tm4c123g/mpu_fault/ccs/macros.ini_initial b/boards/dk-tm4c123g/mpu_fault/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/mpu_fault/ccs/target_config.ccxml b/boards/dk-tm4c123g/mpu_fault/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/mpu_fault/ewarm/Exe/mpu_fault.bin b/boards/dk-tm4c123g/mpu_fault/ewarm/Exe/mpu_fault.bin new file mode 100644 index 0000000..30c867e Binary files /dev/null and b/boards/dk-tm4c123g/mpu_fault/ewarm/Exe/mpu_fault.bin differ diff --git a/boards/dk-tm4c123g/mpu_fault/ewarm/Exe/mpu_fault.out b/boards/dk-tm4c123g/mpu_fault/ewarm/Exe/mpu_fault.out new file mode 100644 index 0000000..c5b3b2a Binary files /dev/null and b/boards/dk-tm4c123g/mpu_fault/ewarm/Exe/mpu_fault.out differ diff --git a/boards/dk-tm4c123g/mpu_fault/gcc/mpu_fault.axf b/boards/dk-tm4c123g/mpu_fault/gcc/mpu_fault.axf new file mode 100644 index 0000000..31fed82 Binary files /dev/null and b/boards/dk-tm4c123g/mpu_fault/gcc/mpu_fault.axf differ diff --git a/boards/dk-tm4c123g/mpu_fault/gcc/mpu_fault.bin b/boards/dk-tm4c123g/mpu_fault/gcc/mpu_fault.bin new file mode 100644 index 0000000..4104af0 Binary files /dev/null and b/boards/dk-tm4c123g/mpu_fault/gcc/mpu_fault.bin differ diff --git a/boards/dk-tm4c123g/mpu_fault/mpu_fault.c b/boards/dk-tm4c123g/mpu_fault/mpu_fault.c new file mode 100644 index 0000000..9ade1bb --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/mpu_fault.c @@ -0,0 +1,413 @@ +//***************************************************************************** +// +// mpu_fault.c - MPU example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/interrupt.h" +#include "driverlib/mpu.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

MPU (mpu_fault)

+//! +//! This example application demonstrates the use of the MPU to protect a +//! region of memory from access, and to generate a memory management fault +//! when there is an access violation. +// +//***************************************************************************** + +//***************************************************************************** +// +// Variables to hold the state of the fault status when the fault occurs and +// the faulting address. +// +//***************************************************************************** +static volatile uint32_t g_ui32MMAR; +static volatile uint32_t g_ui32FaultStatus; + +//***************************************************************************** +// +// A counter to track the number of times the fault handler has been entered. +// +//***************************************************************************** +static volatile uint32_t g_ui32MPUFaultCount; + +//***************************************************************************** +// +// A location for storing data read from various addresses. Volatile forces +// the compiler to use it and not optimize the access away. +// +//***************************************************************************** +static volatile uint32_t g_ui32Value; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The exception handler for memory management faults, which are caused by MPU +// access violations. This handler will verify the cause of the fault and +// clear the NVIC fault status register. +// +//***************************************************************************** +void +MPUFaultHandler(void) +{ + // + // Preserve the value of the MMAR (the address causing the fault). + // Preserve the fault status register value, then clear it. + // + g_ui32MMAR = HWREG(NVIC_MM_ADDR); + g_ui32FaultStatus = HWREG(NVIC_FAULT_STAT); + HWREG(NVIC_FAULT_STAT) = g_ui32FaultStatus; + + // + // Increment a counter to indicate the fault occurred. + // + g_ui32MPUFaultCount++; + + // + // Disable the MPU so that this handler can return and cause no more + // faults. The actual instruction that faulted will be re-executed. + // + ROM_MPUDisable(); +} + +//***************************************************************************** +// +// This example demonstrates how to configure MPU regions for different levels +// of memory protection. The following memory map is set up: +// +// 0000.0000 - 0000.1C00 - rgn 0: executable read-only, flash +// 0000.1C00 - 0000.2000 - rgn 0: no access, flash (disabled sub-region 7) +// 2000.0000 - 2000.4000 - rgn 1: read-write, RAM +// 2000.4000 - 2000.6000 - rgn 2: read-only, RAM (disabled sub-rgn 4 of rgn 1) +// 2000.6000 - 2000.7FFF - rgn 1: read-write, RAM +// 4000.0000 - 4001.0000 - rgn 3: read-write, peripherals +// 4001.0000 - 4002.0000 - rgn 3: no access (disabled sub-region 1) +// 4002.0000 - 4006.0000 - rgn 3: read-write, peripherals +// 4006.0000 - 4008.0000 - rgn 3: no access (disabled sub-region 6, 7) +// E000.E000 - E000.F000 - rgn 4: read-write, NVIC +// 0100.0000 - 0100.FFFF - rgn 5: executable read-only, ROM +// +// The example code will attempt to perform the following operations and check +// the faulting behavior: +// +// - write to flash (should fault) +// - read from the disabled area of flash (should fault) +// - read from the read-only area of RAM (should not fault) +// - write to the read-only section of RAM (should fault) +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + unsigned int bFail = 0; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "mpu-fault", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Configure an executable, read-only MPU region for flash. It is a 16 KB + // region with the last 2 KB disabled to result in a 14 KB executable + // region. This region is needed so that the program can execute from + // flash. + // + ROM_MPURegionSet(0, FLASH_BASE, + MPU_RGN_SIZE_16K | MPU_RGN_PERM_EXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_SUB_RGN_DISABLE_7 | + MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for RAM. It is a 32 KB region. There + // is a 4 KB sub-region in the middle that is disabled in order to open up + // a hole in which different permissions can be applied. + // + ROM_MPURegionSet(1, SRAM_BASE, + MPU_RGN_SIZE_32K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_SUB_RGN_DISABLE_4 | + MPU_RGN_ENABLE); + + // + // Configure a read-only MPU region for the 4 KB of RAM that is disabled in + // the previous region. This region is used for demonstrating read-only + // permissions. + // + ROM_MPURegionSet(2, SRAM_BASE + 0x4000, + MPU_RGN_SIZE_2K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for peripherals. The region is 512 KB + // total size, with several sub-regions disabled to prevent access to areas + // where there are no peripherals. This region is needed because the + // program needs access to some peripherals. + // + ROM_MPURegionSet(3, 0x40000000, + MPU_RGN_SIZE_512K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_SUB_RGN_DISABLE_1 | + MPU_SUB_RGN_DISABLE_6 | MPU_SUB_RGN_DISABLE_7 | + MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for access to the NVIC. The region is + // 4 KB in size. This region is needed because NVIC registers are needed + // in order to control the MPU. + // + ROM_MPURegionSet(4, NVIC_BASE, + MPU_RGN_SIZE_4K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_RGN_ENABLE); + + // + // Configure an executable, read-only MPU region for ROM. It is a 64 KB + // region. This region is needed so that ROM library calls work. + // + ROM_MPURegionSet(5, (uint32_t)ROM_APITABLE & 0xFFFF0000, + MPU_RGN_SIZE_64K | MPU_RGN_PERM_EXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_RGN_ENABLE); + + // + // Need to clear the NVIC fault status register to make sure there is no + // status hanging around from a previous program. + // + g_ui32FaultStatus = HWREG(NVIC_FAULT_STAT); + HWREG(NVIC_FAULT_STAT) = g_ui32FaultStatus; + + // + // Enable the MPU fault. + // + ROM_IntEnable(FAULT_MPU); + + // + // Enable the MPU. This will begin to enforce the memory protection + // regions. The MPU is configured so that when in the hard fault or NMI + // exceptions, a default map will be used. Neither of these should occur + // in this example program. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to write to the flash. This should cause a protection fault due + // to the fact that this region is read-only. + // + GrStringDraw(&g_sContext, "Flash write", -1, 0, 12, 0); + g_ui32MPUFaultCount = 0; + HWREG(0x100) = 0x12345678; + + // + // Verify that the fault occurred, at the expected address. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x100)) + { + GrStringDraw(&g_sContext, " OK", -1, 72, 12, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 72, 12, 0); + } + + // + // The MPU was disabled when the previous fault occurred, so it needs to be + // re-enabled. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to read from the disabled section of flash, the upper 2 KB of + // the 16 KB region. + // + GrStringDraw(&g_sContext, "Flash read", -1, 0, 22, 0); + g_ui32MPUFaultCount = 0; + g_ui32Value = HWREG(0x3820); + + // + // Verify that the fault occurred, at the expected address. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x3820)) + { + GrStringDraw(&g_sContext, " OK", -1, 72, 22, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 72, 22, 0); + } + + // + // The MPU was disabled when the previous fault occurred, so it needs to be + // re-enabled. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to read from the read-only area of RAM, the middle 4 KB of the + // 32 KB region. + // + GrStringDraw(&g_sContext, "RAM read", -1, 0, 32, 0); + g_ui32MPUFaultCount = 0; + g_ui32Value = HWREG(0x20004440); + + // + // Verify that the RAM read did not cause a fault. + // + if(g_ui32MPUFaultCount == 0) + { + GrStringDraw(&g_sContext, " OK", -1, 72, 32, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 72, 32, 0); + } + + // + // The MPU should not have been disabled since the last access was not + // supposed to cause a fault. But if it did cause a fault, then the MPU + // will be disabled, so re-enable it here anyway, just in case. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to write to the read-only area of RAM, the middle 4 KB of the + // 32 KB region. + // + GrStringDraw(&g_sContext, "RAM write", -1, 0, 42, 0); + g_ui32MPUFaultCount = 0; + HWREG(0x20004460) = 0xabcdef00; + + // + // Verify that the RAM write caused a fault. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x20004460)) + { + GrStringDraw(&g_sContext, " OK", -1, 72, 42, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 72, 42, 0); + } + + // + // Display the results of the example program. + // + if(bFail) + { + GrStringDrawCentered(&g_sContext, "Failure!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 56, 0); + } + else + { + GrStringDrawCentered(&g_sContext, "Success!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 56, 0); + } + + // + // Disable the MPU, so there are no lingering side effects if another + // program is run. + // + ROM_MPUDisable(); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/mpu_fault/mpu_fault.ewd b/boards/dk-tm4c123g/mpu_fault/mpu_fault.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/mpu_fault.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/mpu_fault/mpu_fault.ewp b/boards/dk-tm4c123g/mpu_fault/mpu_fault.ewp new file mode 100644 index 0000000..51c4aa5 --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/mpu_fault.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\mpu_fault.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/dk-tm4c123g/mpu_fault/mpu_fault.icf b/boards/dk-tm4c123g/mpu_fault/mpu_fault.icf new file mode 100644 index 0000000..2959cfd --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/mpu_fault.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// mpu_fault.icf - Linker configuration file for mpu_fault. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/mpu_fault/mpu_fault.ld b/boards/dk-tm4c123g/mpu_fault/mpu_fault.ld new file mode 100644 index 0000000..81f90fc --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/mpu_fault.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * mpu_fault.ld - Linker configuration file for mpu_fault. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/mpu_fault/mpu_fault.sct b/boards/dk-tm4c123g/mpu_fault/mpu_fault.sct new file mode 100644 index 0000000..094bafd --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/mpu_fault.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; mpu_fault.sct - Linker configuration file for mpu_fault. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/mpu_fault/mpu_fault.uvopt b/boards/dk-tm4c123g/mpu_fault/mpu_fault.uvopt new file mode 100644 index 0000000..dd39fad --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/mpu_fault.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + mpu_fault + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\mpu_fault.c + mpu_fault.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/mpu_fault/mpu_fault.uvproj b/boards/dk-tm4c123g/mpu_fault/mpu_fault.uvproj new file mode 100644 index 0000000..1b9f988 --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/mpu_fault.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + mpu_fault + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + mpu_fault + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\mpu_fault.bin .\rvmdk\mpu_fault.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + mpu_fault.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + mpu_fault.c + 1 + .\mpu_fault.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/mpu_fault/mpu_fault_ccs.cmd b/boards/dk-tm4c123g/mpu_fault/mpu_fault_ccs.cmd new file mode 100644 index 0000000..e4fe62f --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/mpu_fault_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * mpu_fault_ccs.cmd - CCS linker configuration file for mpu_fault. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c123g/mpu_fault/readme.txt b/boards/dk-tm4c123g/mpu_fault/readme.txt new file mode 100644 index 0000000..9a06d00 --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/readme.txt @@ -0,0 +1,25 @@ +MPU + +This example application demonstrates the use of the MPU to protect a +region of memory from access, and to generate a memory management fault +when there is an access violation. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/mpu_fault/rvmdk/mpu_fault.axf b/boards/dk-tm4c123g/mpu_fault/rvmdk/mpu_fault.axf new file mode 100644 index 0000000..70b9a85 Binary files /dev/null and b/boards/dk-tm4c123g/mpu_fault/rvmdk/mpu_fault.axf differ diff --git a/boards/dk-tm4c123g/mpu_fault/rvmdk/mpu_fault.bin b/boards/dk-tm4c123g/mpu_fault/rvmdk/mpu_fault.bin new file mode 100644 index 0000000..cad0bc6 Binary files /dev/null and b/boards/dk-tm4c123g/mpu_fault/rvmdk/mpu_fault.bin differ diff --git a/boards/dk-tm4c123g/mpu_fault/startup_ccs.c b/boards/dk-tm4c123g/mpu_fault/startup_ccs.c new file mode 100644 index 0000000..4d2928f --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/mpu_fault/startup_ewarm.c b/boards/dk-tm4c123g/mpu_fault/startup_ewarm.c new file mode 100644 index 0000000..ddebdaf --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/mpu_fault/startup_gcc.c b/boards/dk-tm4c123g/mpu_fault/startup_gcc.c new file mode 100644 index 0000000..ea51e14 --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/mpu_fault/startup_rvmdk.S b/boards/dk-tm4c123g/mpu_fault/startup_rvmdk.S new file mode 100644 index 0000000..74194c2 --- /dev/null +++ b/boards/dk-tm4c123g/mpu_fault/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN MPUFaultHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD MPUFaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/qs-logger/Makefile b/boards/dk-tm4c123g/qs-logger/Makefile new file mode 100644 index 0000000..6299d2e --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/Makefile @@ -0,0 +1,109 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Data logger quickstart example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the Data logger quickstart example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/qs-logger.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Data logger quickstart example. +# +${COMPILER}/qs-logger.axf: ${COMPILER}/acquire.o +${COMPILER}/qs-logger.axf: ${COMPILER}/buttons.o +${COMPILER}/qs-logger.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/qs-logger.axf: ${COMPILER}/clocksetwidget.o +${COMPILER}/qs-logger.axf: ${COMPILER}/fat_usbmsc.o +${COMPILER}/qs-logger.axf: ${COMPILER}/ff.o +${COMPILER}/qs-logger.axf: ${COMPILER}/flashstore.o +${COMPILER}/qs-logger.axf: ${COMPILER}/images.o +${COMPILER}/qs-logger.axf: ${COMPILER}/menus.o +${COMPILER}/qs-logger.axf: ${COMPILER}/qs-logger.o +${COMPILER}/qs-logger.axf: ${COMPILER}/slidemenuwidget.o +${COMPILER}/qs-logger.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/qs-logger.axf: ${COMPILER}/stripchartmanager.o +${COMPILER}/qs-logger.axf: ${COMPILER}/stripchartwidget.o +${COMPILER}/qs-logger.axf: ${COMPILER}/uartstdio.o +${COMPILER}/qs-logger.axf: ${COMPILER}/usb_serial_structs.o +${COMPILER}/qs-logger.axf: ${COMPILER}/usbserial.o +${COMPILER}/qs-logger.axf: ${COMPILER}/usbstick.o +${COMPILER}/qs-logger.axf: ${COMPILER}/ustdlib.o +${COMPILER}/qs-logger.axf: ${ROOT}/sensorlib/${COMPILER}/libsensor.a +${COMPILER}/qs-logger.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/qs-logger.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/qs-logger.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/qs-logger.axf: qs-logger.ld +SCATTERgcc_qs-logger=qs-logger.ld +ENTRY_qs-logger=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/qs-logger/acquire.c b/boards/dk-tm4c123g/qs-logger/acquire.c new file mode 100644 index 0000000..cfd284a --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/acquire.c @@ -0,0 +1,1349 @@ +//***************************************************************************** +// +// acquire.c - Data acquisition module for data logger application. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include +#include "driverlib/debug.h" +#include "driverlib/adc.h" +#include "driverlib/gpio.h" +#include "driverlib/hibernate.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_ints.h" +#include "inc/hw_gpio.h" +#include "utils/ustdlib.h" +#include "drivers/slidemenuwidget.h" +#include "drivers/stripchartwidget.h" +#include "stripchartmanager.h" +#include "clocksetwidget.h" +#include "qs-logger.h" +#include "usbstick.h" +#include "usbserial.h" +#include "flashstore.h" +#include "menus.h" +#include "acquire.h" +#include "sensorlib/hw_mpu9150.h" +#include "sensorlib/hw_ak8975.h" +#include "sensorlib/i2cm_drv.h" +#include "sensorlib/ak8975.h" +#include "sensorlib/mpu9150.h" +#include "sensorlib/comp_dcm.h" +#include "driverlib/pin_map.h" + +//***************************************************************************** +// +// This is the data acquisition module. It performs acquisition of data from +// selected channels, starting and stopping data logging, storing acquired +// data, and running the strip chart display. +// +//***************************************************************************** + +//***************************************************************************** +// +// Define MPU9150 I2C Address. +// +//***************************************************************************** +#define MPU9150_I2C_ADDRESS 0x69 + +//***************************************************************************** +// +// The following defines which ADC channel control should be used for each +// kind of data item. Basically it maps how the ADC channels are connected +// on the board. This is a hardware configuration. +// +// The Accelerometer, Gyro, and Compass info is brought across I2C3 as a +// single data chunk an then unpacked. +// +//***************************************************************************** +#define CHAN_USER0 ADC_CTL_CH0 +#define CHAN_USER1 ADC_CTL_CH1 +#define CHAN_USER2 ADC_CTL_CH2 +#define CHAN_USER3 ADC_CTL_CH3 +#define CHAN_EXTTEMP ADC_CTL_CH20 +#define CHAN_CURRENT ADC_CTL_CH23 +#define CHAN_INTTEMP ADC_CTL_TS + +//***************************************************************************** +// +// The following are indexes for values returned from the ADC's. These index's +// map directly to g_pui32ADCSeq[] +// +//***************************************************************************** +#define ADCSEQ_USER0 0 +#define ADCSEQ_USER1 1 +#define ADCSEQ_USER2 2 +#define ADCSEQ_USER3 3 +#define ADCSEQ_EXTTEMP 4 +#define ADCSEQ_INTTEMP 5 +#define ADCSEQ_CURRENT 6 + +//***************************************************************************** +// +// The following maps the order that items are acquired and stored by the +// ADC sequencers. Note that 16 samples are specified, using 2 of the +// 8 sample sequencers. The current is sampled multiple times deliberately +// because that value tends to bounce around. It is sampled multiple +// times and will be averaged. +// +//***************************************************************************** +uint32_t g_pui32ADCSeq[] = +{ + CHAN_USER0, CHAN_USER1, CHAN_USER2, CHAN_USER3, CHAN_EXTTEMP, CHAN_INTTEMP, + CHAN_CURRENT, CHAN_CURRENT,CHAN_CURRENT, CHAN_CURRENT, CHAN_CURRENT, + CHAN_CURRENT, CHAN_CURRENT, +}; +#define NUM_ADC_CHANNELS (sizeof(g_pui32ADCSeq) / \ + sizeof(g_pui32ADCSeq[0])) +#define NUM_CURRENT_SAMPLES 7 + +//***************************************************************************** +// +// Global storage for most recent Sensor Data +// +//***************************************************************************** +// +// Index values for sensor data +// +#define X 0 +#define Y 1 +#define Z 2 +// +// Floating point data from SensorLib code +// +float g_pfAccel[3]; +float g_pfGyro[3]; +float g_pfMag[3]; +// +// 16bit values post translation from floating point +// +int16_t g_i16Accel[3]; +int16_t g_i16Gyro[3]; +int16_t g_i16Mag[3]; + +//***************************************************************************** +// +// Global instance structure for the I2C master driver. +// +//***************************************************************************** +tI2CMInstance g_sI2CInst; + +//***************************************************************************** +// +// Global instance structure for the MPU9150 sensor driver. +// +//***************************************************************************** +tMPU9150 g_sMPU9150Inst; + +//***************************************************************************** +// +// Global flags to alert main that MPU9150 I2C transaction is complete +// +//***************************************************************************** +volatile uint_fast8_t g_vui8I2CDoneFlag; + +//***************************************************************************** +// +// Global flags to alert main that MPU9150 I2C transaction error has occurred. +// +//***************************************************************************** +volatile uint_fast8_t g_vui8ErrorFlag; + +//***************************************************************************** +// +// Global flags to alert main that MPU9150 data is ready to be retrieved. +// +//***************************************************************************** +volatile uint_fast8_t g_vui8DataFlag; + +//***************************************************************************** +// +// A buffer to hold one set of ADC data that is acquired per sample time. +// +//***************************************************************************** +static uint32_t g_pui32ADCData[NUM_ADC_CHANNELS]; + +//***************************************************************************** +// +// The following variables hold the current time stamp, the next match time +// for sampling, and the period of time between samples. All are stored in +// a 32.15 second.subsecond format. +// +//***************************************************************************** +static volatile uint32_t g_pui32TimeStamp[2]; +static volatile uint32_t g_pui32NextMatch[2]; +static uint32_t g_pui32MatchPeriod[2]; + +//***************************************************************************** +// +// The number of data items that are selected for acquisition. +// +//***************************************************************************** +static uint32_t g_ui32NumItems; + +//***************************************************************************** +// +// A counter for the ADC interrupt handler. It is used to track when new +// ADC data is acquired. +// +//***************************************************************************** +static volatile uint32_t g_ui32ADCCount; +static uint32_t g_ui32LastADCCount = 0; + +//***************************************************************************** +// +// A counter for the RTC interrupt handler. +// +//***************************************************************************** +static volatile uint32_t g_pui32RTCInts; + +//***************************************************************************** +// +// A flag to indicate that a keep alive packet is needed (when logging to host +// PC). +// +//***************************************************************************** +static volatile bool g_bNeedKeepAlive = false; + +//***************************************************************************** +// +// Storage for a single record of acquired data. This needs to be large +// enough to hold the time stamp and item mask (defined in the structure +// above) and as many possible data items that can be collected. Force the +// buffer to be a multiple of 32-bits. +// +//***************************************************************************** +#define RECORD_SIZE (sizeof(tLogRecord) + (NUM_LOG_ITEMS * 2)) +static union +{ + uint32_t g_pui32RecordBuf[(RECORD_SIZE + 3) / sizeof(uint32_t)]; + tLogRecord sRecord; +} +g_sRecordBuf; + +//***************************************************************************** +// +// Holds a pointer to the current configuration state, that is determined by +// the user's menu selections. +// +//***************************************************************************** +static tConfigState *g_psConfigState; + +//***************************************************************************** +// +// MPU9150 Sensor callback function. Called at the end of MPU9150 sensor +// driver transactions. This is called from I2C interrupt context. Therefore, +// we just set a flag and let main do the bulk of the computations and display. +// +//***************************************************************************** +void +MPU9150AppCallback(void *pvCallbackData, uint_fast8_t ui8Status) +{ + // + // If the transaction succeeded set the data flag to indicate to + // application that this transaction is complete and data may be ready. + // + if(ui8Status == I2CM_STATUS_SUCCESS) + { + g_vui8I2CDoneFlag = 1; + } + + // + // Store the most recent status in case it was an error condition + // + g_vui8ErrorFlag = ui8Status; +} + +//***************************************************************************** +// +// Function to wait for the MPU9150 transactions to complete. Use this to spin +// wait on the I2C bus. +// +//***************************************************************************** +void +MPU9150AppI2CWait(char *pcFilename, uint_fast32_t ui32Line) +{ + // + // Put the processor to sleep while we wait for the I2C driver to + // indicate that the transaction is complete. + // + while((g_vui8I2CDoneFlag == 0) && (g_vui8ErrorFlag == 0)) + { + // + // Do Nothing + // + } + + // + // If an error occurred call the error handler immediately. + // + if(g_vui8ErrorFlag) + { + //MPU9150AppErrorHandler(pcFilename, ui32Line); + //UARTprintf("ERROR in MPU9150AppErrorHandler\n"); + } + + // + // clear the data flag for next use. + // + g_vui8I2CDoneFlag = 0; +} + +//***************************************************************************** +// +// Called by the NVIC as a result of GPIO port B interrupt event. For this +// application GPIO port B pin 2 is the interrupt line for the MPU9150 +// +//***************************************************************************** +void +IntGPIOb(void) +{ + unsigned long ulStatus; + + ulStatus = GPIOIntStatus(GPIO_PORTB_BASE, true); + + // + // Clear all the pin interrupts that are set + // + GPIOIntClear(GPIO_PORTB_BASE, ulStatus); + + if(ulStatus & GPIO_PIN_2) + { + // + // MPU9150 Data is ready for retrieval and processing. + // + MPU9150DataRead(&g_sMPU9150Inst, MPU9150AppCallback, &g_sMPU9150Inst); + } +} + +//***************************************************************************** +// +// Called by the NVIC as a result of I2C3 Interrupt. I2C3 is the I2C connection +// to the MPU9150. +// +//***************************************************************************** +void +MPU9150I2CIntHandler(void) +{ + // + // Pass through to the I2CM interrupt handler provided by sensor library. + // This is required to be at application level so that I2CMIntHandler can + // receive the instance structure pointer as an argument. + // + I2CMIntHandler(&g_sI2CInst); +} + +//***************************************************************************** +// +// This function is called when in VIEW mode. The acquired data is written +// as text strings which will appear on the eval board display. +// +//***************************************************************************** +static void +UpdateViewerData(const tLogRecord *psRecord) +{ + static char pcViewerBuf[24]; + uint32_t ui32Idx, pui32RTC; + struct tm sTime; + + // + // Loop through the analog channels and update the text display strings. + // + for(ui32Idx = LOG_ITEM_USER0; ui32Idx <= LOG_ITEM_USER3; ui32Idx++) + { + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " CH%u: %u.%03u V ", + ui32Idx - LOG_ITEM_USER0, psRecord->pi16Items[ui32Idx] / 1000, + psRecord->pi16Items[ui32Idx] % 1000); + MenuUpdateText(ui32Idx, pcViewerBuf); + } + + // + // Loop through the accel channels and update the text display strings. + // + for(ui32Idx = LOG_ITEM_ACCELX; ui32Idx <= LOG_ITEM_ACCELZ; ui32Idx++) + { + int16_t i16Accel = psRecord->pi16Items[ui32Idx]; + i16Accel *= (i16Accel < 0) ? -1 : 1; + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " %c: %c%d.%02u g ", + (ui32Idx - LOG_ITEM_ACCELX) + 'X', + psRecord->pi16Items[ui32Idx] < 0 ? '-' : '+', + i16Accel / 100, i16Accel % 100); + MenuUpdateText(ui32Idx, pcViewerBuf); + } + + // + // Update the display string for internal temperature. + // + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " INT: %d.%01u C ", + psRecord->pi16Items[LOG_ITEM_INTTEMP] / 10, + psRecord->pi16Items[LOG_ITEM_INTTEMP] % 10); + MenuUpdateText(LOG_ITEM_INTTEMP, pcViewerBuf); + + // + // Update the display string for external temperature. + // + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " EXT: %d.%01u C ", + psRecord->pi16Items[LOG_ITEM_EXTTEMP] / 10, + psRecord->pi16Items[LOG_ITEM_EXTTEMP] % 10); + MenuUpdateText(LOG_ITEM_EXTTEMP, pcViewerBuf); + + // + // Update the display string for processor current. + // + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " %u.%01u mA ", + psRecord->pi16Items[LOG_ITEM_CURRENT] / 10, + psRecord->pi16Items[LOG_ITEM_CURRENT] % 10); + MenuUpdateText(LOG_ITEM_CURRENT, pcViewerBuf); + + // + // Update the display strings for time and data. + // + pui32RTC = HibernateRTCGet(); + ulocaltime(pui32RTC, &sTime); + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), "%4u/%02u/%02u", + sTime.tm_year+1900, sTime.tm_mon + 1, sTime.tm_mday); + MenuUpdateText(TEXT_ITEM_DATE, pcViewerBuf); + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), "%02u:%02u:%02u", + sTime.tm_hour, sTime.tm_min, sTime.tm_sec); + MenuUpdateText(TEXT_ITEM_TIME, pcViewerBuf); + + // + // Loop through the gyro channels and update the text display strings. + // + for(ui32Idx = LOG_ITEM_GYROX; ui32Idx <= LOG_ITEM_GYROZ; ui32Idx++) + { + int16_t i16Gyro = psRecord->pi16Items[ui32Idx]; + i16Gyro *= (i16Gyro < 0) ? -1 : 1; + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " %c: %c%d.%02u rad/s", + (ui32Idx - LOG_ITEM_GYROX) + 'X', + psRecord->pi16Items[ui32Idx] < 0 ? '-' : '+', + i16Gyro / 100, i16Gyro % 100); + MenuUpdateText(ui32Idx, pcViewerBuf); + } + + // + // Loop through the mag channels and update the text display strings. + // + for(ui32Idx = LOG_ITEM_COMPASSX; ui32Idx <= LOG_ITEM_COMPASSZ; ui32Idx++) + { + int16_t i16Compass = psRecord->pi16Items[ui32Idx]; + i16Compass *= (i16Compass < 0) ? -1 : 1; + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " %c: %c%d uT ", + (ui32Idx - LOG_ITEM_COMPASSX) + 'X', + psRecord->pi16Items[ui32Idx] < 0 ? '-' : '+', + i16Compass); + MenuUpdateText(ui32Idx, pcViewerBuf); + } +} + + +//***************************************************************************** +// +// This function is called from the AcquireRun() function and should be in +// context of the main thread. It pulls data items from the ADC data buffer, +// and the I2C 9 axis data, converts units as needed, and stores the results +// in a log record that is pointed at by the function parameter. +// +//***************************************************************************** +static void +ProcessDataItems(tLogRecord *psRecord) +{ + int32_t i32TempC; + uint32_t ui32SelectedMask, ui32Millivolts, ui32Current; + uint_fast8_t ui8Idx, ui8ItemIdx; + + // + // Initialize locals. + // + ui8ItemIdx = 0; + ui32SelectedMask = g_psConfigState->ui16SelectedMask; + ui32Current = 0; + + // + // Save the time stamp that was saved when the ADC data was acquired. + // Also save into the record the bit mask of the selected data items. + // + psRecord->ui32Seconds = g_pui32TimeStamp[0]; + psRecord->ui16Subseconds = (uint16_t)g_pui32TimeStamp[1]; + psRecord->ui16ItemMask = (uint16_t)ui32SelectedMask; + + // + // Process the user analog input channels. These will be converted and + // stored as millivolts. + // + for(ui8Idx = LOG_ITEM_USER0; ui8Idx <= LOG_ITEM_USER3; ui8Idx++) + { + // + // Check to see if this item should be logged + // + if((1 << ui8Idx) & ui32SelectedMask) + { + ui32Millivolts = (g_pui32ADCData[ui8Idx] * 4100) / 819; + psRecord->pi16Items[ui8ItemIdx++] = (int16_t)ui32Millivolts; + } + } + + // + // Process the accelerometer data, because the data all comes across + // I2C in one chunk if any accelerometer is desired just go ahead and + // process them all to save time. + // + // floating point data provided in m/s^2. + // divide by 9.81 to convert m/s^2 to g's + // multiply by 100 to provide 2 decimal points of precision. + // + if( ((1 << LOG_ITEM_ACCELX) & ui32SelectedMask) | + ((1 << LOG_ITEM_ACCELY) & ui32SelectedMask) | + ((1 << LOG_ITEM_ACCELZ) & ui32SelectedMask) ) + { + // Get floating point version of the Accel Data in m/s^2. + MPU9150DataAccelGetFloat(&g_sMPU9150Inst, &g_pfAccel[X], &g_pfAccel[Y], + &g_pfAccel[Z]); + + g_i16Accel[0]= (int16_t) ((g_pfAccel[0] /9.81f)*100.f); + g_i16Accel[1]= (int16_t) ((g_pfAccel[1] /9.81f)*100.f); + g_i16Accel[2]= (int16_t) ((g_pfAccel[2] /9.81f)*100.f); + // Log selected data to the record + if((1 << LOG_ITEM_ACCELX) & ui32SelectedMask){ + psRecord->pi16Items[ui8ItemIdx++] = g_i16Accel[X];} + if((1 << LOG_ITEM_ACCELY) & ui32SelectedMask){ + psRecord->pi16Items[ui8ItemIdx++] = g_i16Accel[Y];} + if((1 << LOG_ITEM_ACCELZ) & ui32SelectedMask){ + psRecord->pi16Items[ui8ItemIdx++] = g_i16Accel[Z];} + } + + // + // Process the external temperature. The temperature is stored in units + // of 1/10 C. + // + if((1 << LOG_ITEM_EXTTEMP) & ui32SelectedMask) + { + i32TempC = (1866300 - ((200000 * g_pui32ADCData[ADCSEQ_EXTTEMP]) / + 273)) / 1169; + psRecord->pi16Items[ui8ItemIdx++] = (int16_t)i32TempC; + } + + // + // Process the internal temperature. The temperature is stored in units + // of 1/10 C. + // + if((1 << LOG_ITEM_INTTEMP) & ui32SelectedMask) + { + i32TempC = 1475 - ((2250 * g_pui32ADCData[ADCSEQ_INTTEMP]) / 4095); + psRecord->pi16Items[ui8ItemIdx++] = (int16_t)i32TempC; + } + + // + // Process the current. The current is stored in units of 100 uA, + // (or 1/10000 A). Multiple current samples were taken in order + // to average and smooth the data. + // + if((1 << LOG_ITEM_CURRENT) & ui32SelectedMask) + { + // + // Average all the current samples that are available in the ADC + // buffer. + // + for(ui8Idx = ADCSEQ_CURRENT; + ui8Idx < (ADCSEQ_CURRENT + NUM_CURRENT_SAMPLES); ui8Idx++) + { + ui32Current += g_pui32ADCData[ui8Idx]; + } + ui32Current /= NUM_CURRENT_SAMPLES; + + // + // Convert the averaged current into units + // + ui32Current = (ui32Current * 200) / 273; + psRecord->pi16Items[ui8ItemIdx++] = (int16_t)ui32Current; + } + + // + // Process the Gyro data, because the data all comes across + // I2C in one chunk if any gyro is desired just go ahead and + // process them all to save time. + // + // floating data provided in rad/sec + // multiply by 100 to provide 2 decimal points of precision. + // + if( ((1 << LOG_ITEM_GYROX) & ui32SelectedMask) | + ((1 << LOG_ITEM_GYROY) & ui32SelectedMask) | + ((1 << LOG_ITEM_GYROZ) & ui32SelectedMask) ) + { + // Get floating point version of angular velocities in rad/sec + MPU9150DataGyroGetFloat(&g_sMPU9150Inst, &g_pfGyro[X], &g_pfGyro[Y], + &g_pfGyro[Z]); + + g_i16Gyro[X]= (int16_t) (g_pfGyro[X] *100.f); + g_i16Gyro[Y]= (int16_t) (g_pfGyro[Y] *100.f); + g_i16Gyro[Z]= (int16_t) (g_pfGyro[Z] *100.f); + + // Log selected data to the record + if((1 << LOG_ITEM_GYROX) & ui32SelectedMask){ + psRecord->pi16Items[ui8ItemIdx++] = g_i16Gyro[X];} + if((1 << LOG_ITEM_GYROY) & ui32SelectedMask){ + psRecord->pi16Items[ui8ItemIdx++] = g_i16Gyro[Y];} + if((1 << LOG_ITEM_GYROZ) & ui32SelectedMask){ + psRecord->pi16Items[ui8ItemIdx++] = g_i16Gyro[Z];} + } + + // + // Process the Compass data, because the data all comes across + // I2C in one chunk if any Compass is desired just go ahead and + // process them all to save time. + // + // floating point data provided in tesla + // multiply by 1,000,000 to human friendly micro tesla unit + if( ((1 << LOG_ITEM_COMPASSX) & ui32SelectedMask) | + ((1 << LOG_ITEM_COMPASSY) & ui32SelectedMask) | + ((1 << LOG_ITEM_COMPASSZ) & ui32SelectedMask) ) + { + // Get floating point version of magnetic fields strength in tesla + MPU9150DataMagnetoGetFloat(&g_sMPU9150Inst, &g_pfMag[X], &g_pfMag[Y], + &g_pfMag[Z]); + + //convert to micro-tesla + g_i16Mag[X]= (int16_t) (g_pfMag[X] *1000000.f); + g_i16Mag[Y]= (int16_t) (g_pfMag[Y] *1000000.f); + g_i16Mag[Z]= (int16_t) (g_pfMag[Z] *1000000.f); + + // Log selected data to the record + if((1 << LOG_ITEM_COMPASSX) & ui32SelectedMask){ + psRecord->pi16Items[ui8ItemIdx++] = g_i16Mag[X];} + if((1 << LOG_ITEM_COMPASSY) & ui32SelectedMask){ + psRecord->pi16Items[ui8ItemIdx++] = g_i16Mag[Y];} + if((1 << LOG_ITEM_COMPASSZ) & ui32SelectedMask){ + psRecord->pi16Items[ui8ItemIdx++] = g_i16Mag[Z];} + } + + + +} + +//***************************************************************************** +// +// This is the handler for the ADC interrupt. Even though more than one +// sequencer is used, they are configured so that this one runs last. +// Therefore when this ADC sequencer interrupt occurs, we know all of the ADC +// data has been acquired. +// +//***************************************************************************** +void +ADC0SS0Handler(void) +{ + // + // Clear the interrupts for all ADC sequencers that are used. + // + MAP_ADCIntClear(ADC0_BASE, 0); + MAP_ADCIntClear(ADC1_BASE, 0); + + // + // Retrieve the data from all ADC sequencers + // + MAP_ADCSequenceDataGet(ADC0_BASE, 0, &g_pui32ADCData[0]); + MAP_ADCSequenceDataGet(ADC1_BASE, 0, &g_pui32ADCData[8]); + + // + // Set the time stamp, assume it is what was set for the last match + // value. This will be close to the actual time that the samples were + // acquired, within a few microseconds. + // + g_pui32TimeStamp[0] = g_pui32NextMatch[0]; + g_pui32TimeStamp[1] = g_pui32NextMatch[1]; + + // + // Increment the ADC interrupt count + // + g_ui32ADCCount++; +} + +//***************************************************************************** +// +// This is the handler for the RTC interrupt from the hibernate peripheral. +// It occurs on RTC match. This handler will initiate an ADC acquisition, +// which will run all of the ADC sequencers. Then it computes the next +// match value and sets it in the RTC. +// +//***************************************************************************** +void +RTCHandler(void) +{ + uint32_t ui32Status, ui32Seconds; + + // + // Increment RTC interrupt counter + // + g_pui32RTCInts++; + + // + // Clear the RTC interrupts (this can be slow for hib module) + // + ui32Status = HibernateIntStatus(1); + HibernateIntClear(ui32Status); + + // + // Read and save the current value of the seconds counter. + // + ui32Seconds = HibernateRTCGet(); + + // + // If we are sleep logging, then there will be no remembered value for + // the next match value, which is also used as the time stamp when + // data is collected. In this case we will just use the current + // RTC seconds. This is safe because if sleep-logging is used, it + // is only with periods of whole seconds, 1 second or longer. + // + if(g_psConfigState->ui32SleepLogging) + { + g_pui32NextMatch[0] = ui32Seconds; + g_pui32NextMatch[1] = 0; + } + + // + // If we are logging data to PC and using a period greater than one + // second, then use special handling. For PC logging, if no data is + // collected, then we must send a keep-alive packet once per second. + // + if((g_psConfigState->ui8Storage == CONFIG_STORAGE_HOSTPC) && + (g_pui32MatchPeriod[0] > 1)) + { + // + // If the current seconds count is less than the match value, that + // means we got the interrupt due to one-second keep alive for the + // host PC. + // + if(ui32Seconds < g_pui32NextMatch[0]) + { + // + // Set the next match for one second ahead (next keep-alive) + // + HibernateRTCMatchSet(0, ui32Seconds + 1); + + // + // Set flag to indicate that a keep alive packet is needed + // + g_bNeedKeepAlive = true; + + // + // Nothing else to do except wait for next keep alive or match + // + return; + } + + // + // Else, this is a real match so proceed to below to do a normal + // acquisition. + // + } + + // + // Kick off the next ADC acquisition. When these are done they will + // cause an ADC interrupt. + // + MAP_ADCProcessorTrigger(ADC1_BASE, 0); + MAP_ADCProcessorTrigger(ADC0_BASE, 0); + + // + // Set the next RTC match. Add the match period to the previous match + // value. We are making an assumption here that there is enough time from + // when the match interrupt occurred, to this point in the code, that we + // are still setting the match time in the future. If the period is too + // long, then we could miss a match and never get another RTC interrupt. + // + g_pui32NextMatch[0] += g_pui32MatchPeriod[0]; + g_pui32NextMatch[1] += g_pui32MatchPeriod[1]; + if(g_pui32NextMatch[1] > 32767) + { + // + // Handle subseconds rollover + // + g_pui32NextMatch[1] &= 32767; + g_pui32NextMatch[0]++; + } + + // + // If logging to host PC at greater than 1 second period, then set the + // next RTC wakeup for 1 second from now. This will cause a keep alive + // packet to be sent to the PC + // + if((g_psConfigState->ui8Storage == CONFIG_STORAGE_HOSTPC) && + (g_pui32MatchPeriod[0] > 1)) + { + HibernateRTCMatchSet(0, ui32Seconds + 1); + } + else + { + // + // Otherwise this is a normal match and the next match should also be a + // normal match, so set the next wakeup to the calculated match time. + // + HibernateRTCMatchSet(0, g_pui32NextMatch[0]); + HibernateRTCSSMatchSet(0, g_pui32NextMatch[1]); + } + + // + // Toggle the LED on the board so the user can see that the acquisition + // is running. + // + MAP_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, + ~MAP_GPIOPinRead(GPIO_PORTG_BASE, GPIO_PIN_2)); + + // + // Now exit the int handler. The ADC will trigger an interrupt when + // it is finished, and the RTC is set up for the next match. + // +} + +//***************************************************************************** +// +// This function is called from the application main loop to keep the +// acquisition running. It checks to see if there is any new ADC data, and +// if so it processes the new ADC data. +// +// The function returns non-zero if data was acquired, 0 if no data was +// acquired. +// +//***************************************************************************** +int32_t +AcquireRun(void) +{ + tLogRecord *psRecord = &g_sRecordBuf.sRecord; + + // + // Make sure we are properly configured to run + // + if(!g_psConfigState) + { + return(0); + } + + // + // Check to see if new ADC data is available + // + if((g_ui32ADCCount != g_ui32LastADCCount) & (g_vui8I2CDoneFlag ==1) ) + { + + g_ui32LastADCCount = g_ui32ADCCount; + + // + // Process the ADC data and store it in the record buffer. + // + ProcessDataItems(psRecord); + + // + // Reset data ready flag for I2C accel/gyro/compass data- + // + g_vui8I2CDoneFlag=0; + + // + // Add the newly processed data to the strip chart. Do not add to + // strip start if sleep-logging. + // + if((g_psConfigState->ui8Storage != CONFIG_STORAGE_VIEWER) && + !g_psConfigState->ui32SleepLogging) + { + StripChartMgrAddItems(psRecord->pi16Items); + } + + // + // If USB stick is used, write the record to the USB stick + // + if(g_psConfigState->ui8Storage == CONFIG_STORAGE_USB) + { + USBStickWriteRecord(psRecord); + } + + // + // If host PC is used, write data to USB serial port + // + if(g_psConfigState->ui8Storage == CONFIG_STORAGE_HOSTPC) + { + USBSerialWriteRecord(psRecord); + } + + // + // If flash storage is used, write data to the flash + // + if(g_psConfigState->ui8Storage == CONFIG_STORAGE_FLASH) + { + FlashStoreWriteRecord(psRecord); + + // + // If we are sleep logging, then save the storage address for + // use in the next cycle. + // + if(g_psConfigState->ui32SleepLogging) + { + g_psConfigState->ui32FlashStore = FlashStoreGetAddr(); + } + } + else if(g_psConfigState->ui8Storage == CONFIG_STORAGE_VIEWER) + { + // + // If in viewer mode, then update the viewer text strings. + // + UpdateViewerData(psRecord); + } + + // + // Return indication to caller that data was processed. + // + return(1); + } + else if((g_psConfigState->ui8Storage == CONFIG_STORAGE_HOSTPC) && + (g_bNeedKeepAlive == true)) + { + // + // Else there is no new data to process, but check to see if we are + // logging to PC and a keep alive packet is needed. + // + // Clear keep-alive needed flag + // + g_bNeedKeepAlive = false; + + // + // Make a keep alive packet by creating a record with timestamp of 0. + // + psRecord->ui32Seconds = 0; + psRecord->ui16Subseconds = 0; + psRecord->ui16ItemMask = 0; + + // + // Transmit the dummy record to host PC. + // + USBSerialWriteRecord(psRecord); + } + + // + // Return indication that data was not processed. + // + return(0); +} + +//***************************************************************************** +// +// This function is called to start an acquisition running. It determines +// which channels are to be logged, enables the ADC/I2C sequencers, and computes +// the first RTC match value. This will start the acquisition running. +// +//***************************************************************************** +void +AcquireStart(tConfigState *psConfig) +{ + uint32_t ui32Idx, pui32RTC[2], ui32SelectedMask; + + // + // Check the parameters + // + ASSERT(psConfig); + if(!psConfig) + { + return; + } + + // + // Update the config state pointer, save the selected item mask + // + g_psConfigState = psConfig; + ui32SelectedMask = psConfig->ui16SelectedMask; + + // + // Get the logging period from the logger configuration. Split the + // period into seconds and subseconds pieces and save for later use in + // generating RTC match values. + // + g_pui32MatchPeriod[0] = psConfig->ui32Period >> 8; + g_pui32MatchPeriod[1] = (psConfig->ui32Period & 0xFF) << 8; + + // + // Determine how many channels are to be logged + // + ui32Idx = ui32SelectedMask; + g_ui32NumItems = 0; + while(ui32Idx) + { + if(ui32Idx & 1) + { + g_ui32NumItems++; + } + ui32Idx >>= 1; + } + + // + // Initialize the strip chart manager for a new run. Don't bother with + // the strip chart if we are using viewer mode, or sleep-logging. + // + if((psConfig->ui8Storage != CONFIG_STORAGE_VIEWER) && + !psConfig->ui32SleepLogging) + { + StripChartMgrInit(); + StripChartMgrConfigure(ui32SelectedMask); + } + + // + // Configure USB for memory stick if USB storage is chosen + // + if(psConfig->ui8Storage == CONFIG_STORAGE_USB) + { + USBStickOpenLogFile(0); + } + else if(psConfig->ui8Storage == CONFIG_STORAGE_FLASH) + { + + // + // Flash storage is to be used, prepare the flash storage module. + // If already sleep-logging, then pass in the saved flash address + // so it does not need to be searched. + // + if(psConfig->ui32SleepLogging) + { + FlashStoreOpenLogFile(psConfig->ui32FlashStore); + } + else + { + // + // Otherwise not sleep logging, so just initialize the flash store, + // this will cause it to search for the starting storage address. + // + FlashStoreOpenLogFile(0); + } + } + + // + // Enable the ADC sequencers + // + MAP_ADCSequenceEnable(ADC0_BASE, 0); + MAP_ADCSequenceEnable(ADC1_BASE, 0); + + // + // Flush the ADC sequencers to be sure there is no lingering data. + // + MAP_ADCSequenceDataGet(ADC0_BASE, 0, g_pui32ADCData); + MAP_ADCSequenceDataGet(ADC1_BASE, 0, g_pui32ADCData); + + // + // Enable ADC interrupts + // + MAP_ADCIntClear(ADC0_BASE, 0); + MAP_ADCIntClear(ADC1_BASE, 0); + MAP_ADCIntEnable(ADC0_BASE, 0); + MAP_IntEnable(INT_ADC0SS0); + + // + // Enable data ready interrupt from accel/gyro/compass + // + MAP_IntEnable(INT_GPIOB); + + + + // + // If we are not already sleep-logging, then initialize the RTC match. + // If we are sleep logging then this does not need to be set up. + // + if(!psConfig->ui32SleepLogging) + { + // + // Get the current RTC value + // + do + { + pui32RTC[0] = HibernateRTCGet(); + pui32RTC[1] = HibernateRTCSSGet(); + } + while(pui32RTC[0] != HibernateRTCGet()); + + // + // Set an initial next match value. Start with the subseconds always + // 0 so the first match value will always be an even multiple of the + // subsecond match. Add 2 seconds to the current RTC just to be clear + // of an imminent rollover. This means that the first match will occur + // between 1 and 2 seconds from now. + // + g_pui32NextMatch[0] = pui32RTC[0] + 2; + g_pui32NextMatch[1] = 0; + + // + // Now set the match value + // + HibernateRTCMatchSet(0, g_pui32NextMatch[0]); + HibernateRTCSSMatchSet(0, g_pui32NextMatch[1]); + } + + // + // If we are configured to sleep, but not sleeping yet, then enter sleep + // logging mode if allowed. + // + if(psConfig->bSleep && !psConfig->ui32SleepLogging) + { + // + // Allow sleep logging if storing to flash at a period of 1 second + // or greater. + // + if((psConfig->ui8Storage == CONFIG_STORAGE_FLASH) && + (psConfig->ui32Period >= 0x100)) + { + psConfig->ui32SleepLogging = 1; + } + } + + // + // Enable the RTC interrupts from the hibernate module + // + HibernateIntClear(HibernateIntStatus(0)); + HibernateIntEnable(HIBERNATE_INT_RTC_MATCH_0 | HIBERNATE_INT_PIN_WAKE); + MAP_IntEnable(INT_HIBERNATE); + + // + // Logging data should now start running + // +} + +//***************************************************************************** +// +// This function is called to stop an acquisition running. It disables the +// ADC sequencers and the RTC match interrupt. +// +//***************************************************************************** +void +AcquireStop(void) +{ + // + // Disable RTC interrupts + // + MAP_IntDisable(INT_HIBERNATE); + + // + // Disable 9axis IRQ signal + // + MAP_IntDisable(INT_GPIOB); + + // + // Disable ADC interrupts + // + MAP_IntDisable(INT_ADC0SS0); + MAP_IntDisable(INT_ADC1SS0); + + // + // Disable ADC sequencers + // + MAP_ADCSequenceDisable(ADC0_BASE, 0); + MAP_ADCSequenceDisable(ADC1_BASE, 0); + + // + // If USB stick is being used, then close the file so it will flush + // the buffers to the USB stick. + // + if(g_psConfigState->ui8Storage == CONFIG_STORAGE_USB) + { + USBStickCloseFile(); + } + + // + // Disable the configuration pointer, which acts as a flag to indicate + // if we are properly configured for data acquisition. + // + g_psConfigState = 0; +} + +//***************************************************************************** +// +// This function initializes the ADC hardware in preparation for data +// acquisition. +// +//***************************************************************************** +void +AcquireInit(void) +{ + uint32_t ui32Chan, ui32Base, ui32Seq, ui32ChCtl; + + + // + // Enable the ADC peripherals and the associated GPIO port + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP); + + // + // Enable I2C & associated GPIO ports + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + + // + // Configure I2C Pins + // + MAP_GPIOPinConfigure(GPIO_PD0_I2C3SCL); + MAP_GPIOPinConfigure(GPIO_PD1_I2C3SDA); + MAP_GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_0); + MAP_GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_1); + MAP_GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_2); + GPIOIntEnable(GPIO_PORTB_BASE, GPIO_PIN_2); + MAP_GPIOIntTypeSet(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_FALLING_EDGE); + MAP_IntEnable(INT_GPIOB); + + // + // Enabled LED GPIO + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + MAP_GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE, GPIO_PIN_2); + + // + // Configure the pins to be used as analog inputs. + // + MAP_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | + GPIO_PIN_7 | GPIO_PIN_3); + MAP_GPIOPinTypeADC(GPIO_PORTP_BASE, GPIO_PIN_0); + + // + // Select the external reference for greatest accuracy. + // + MAP_ADCReferenceSet(ADC0_BASE, ADC_REF_EXT_3V); + MAP_ADCReferenceSet(ADC1_BASE, ADC_REF_EXT_3V); + + // + // Apply workaround for erratum 6.1, in order to use the + // external reference. + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + HWREG(GPIO_PORTB_BASE + GPIO_O_AMSEL) |= GPIO_PIN_6; + + // + // Initialize both ADC peripherals using sequencer 0 and processor trigger. + // + MAP_ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); + MAP_ADCSequenceConfigure(ADC1_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); + + // + // Enter loop to configure all of the ADC sequencer steps needed to + // acquire the data for the data logger. Multiple ADC and sequencers + // will be used in order to acquire all the channels. + // + for(ui32Chan = 0; ui32Chan < NUM_ADC_CHANNELS; ui32Chan++) + { + // + // If this is the first ADC then set the base for ADC0 + // + if(ui32Chan < 8) + { + ui32Base = ADC0_BASE; + ui32Seq = 0; + } + else if(ui32Chan < 16) + { + // + // Second ADC, set the base for ADC1 + // + ui32Base = ADC1_BASE; + ui32Seq = 0; + } + + // + // Get the channel control for each channel. Test to see if it is the + // last channel for the sequencer, and if so then also set the + // interrupt and "end" flags. + // + ui32ChCtl = g_pui32ADCSeq[ui32Chan]; + if((ui32Chan == 7) || (ui32Chan == 15) || + (ui32Chan == (NUM_ADC_CHANNELS - 1))) + { + ui32ChCtl |= ADC_CTL_IE | ADC_CTL_END; + } + + // + // Configure the sequence step + // + MAP_ADCSequenceStepConfigure(ui32Base, ui32Seq, ui32Chan % 8, + ui32ChCtl); + } + + // + // Initialize I2C3 Peripheral + // + I2CMInit(&g_sI2CInst, I2C3_BASE, INT_I2C3, 0xff, 0xff, + MAP_SysCtlClockGet()); + + // + // Initialize the MPU9150 Driver. + // + MPU9150Init(&g_sMPU9150Inst, &g_sI2CInst, MPU9150_I2C_ADDRESS, + MPU9150AppCallback, &g_sMPU9150Inst); + + // + // Wait for transaction to complete + // + MPU9150AppI2CWait(__FILE__, __LINE__); + + // + // Write application specifice sensor configuration such as filter settings + // and sensor range settings. + // + g_sMPU9150Inst.pui8Data[0] = MPU9150_CONFIG_DLPF_CFG_94_98; + g_sMPU9150Inst.pui8Data[1] = MPU9150_GYRO_CONFIG_FS_SEL_250; + g_sMPU9150Inst.pui8Data[2] = (MPU9150_ACCEL_CONFIG_ACCEL_HPF_5HZ | + MPU9150_ACCEL_CONFIG_AFS_SEL_2G); + MPU9150Write(&g_sMPU9150Inst, MPU9150_O_CONFIG, g_sMPU9150Inst.pui8Data, 3, + MPU9150AppCallback, &g_sMPU9150Inst); + + // + // Wait for transaction to complete + // + MPU9150AppI2CWait(__FILE__, __LINE__); + + // + // Configure the data ready interrupt pin output of the MPU9150. + // + g_sMPU9150Inst.pui8Data[0] = MPU9150_INT_PIN_CFG_INT_LEVEL | + MPU9150_INT_PIN_CFG_INT_RD_CLEAR | + MPU9150_INT_PIN_CFG_LATCH_INT_EN; + g_sMPU9150Inst.pui8Data[1] = MPU9150_INT_ENABLE_DATA_RDY_EN; + MPU9150Write(&g_sMPU9150Inst, MPU9150_O_INT_PIN_CFG, + g_sMPU9150Inst.pui8Data, 2, MPU9150AppCallback, + &g_sMPU9150Inst); + + // + // Wait for transaction to complete + // + MPU9150AppI2CWait(__FILE__, __LINE__); + + // + // Initialize the DCM system. 50 hz sample rate. + // accel weight = .2, gyro weight = .8, mag weight = .2 + // + //CompDCMInit(&g_sCompDCMInst, 1.0f / 50.0f, 0.2f, 0.6f, 0.2f); + + // + // Erase the configuration in case there was a prior configuration. + // + g_psConfigState = 0; +} diff --git a/boards/dk-tm4c123g/qs-logger/acquire.h b/boards/dk-tm4c123g/qs-logger/acquire.h new file mode 100644 index 0000000..0ea531f --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/acquire.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// acquire.h - Prototypes and definitions for data acquisition module. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** +#ifndef __ACQUIRE_H__ +#define __ACQUIRE_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Module function prototypes. +// +//***************************************************************************** +extern void AcquireInit(void); +extern void AcquireStart(tConfigState *psConfig); +extern void AcquireStop(void); +extern int32_t AcquireRun(void); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif diff --git a/boards/dk-tm4c123g/qs-logger/ccs/.ccsimportspec b/boards/dk-tm4c123g/qs-logger/ccs/.ccsimportspec new file mode 100644 index 0000000..4afea22 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/ccs/.ccsimportspec @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/qs-logger/ccs/.ccsproject b/boards/dk-tm4c123g/qs-logger/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/qs-logger/ccs/.cproject b/boards/dk-tm4c123g/qs-logger/ccs/.cproject new file mode 100644 index 0000000..0f17f39 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/ccs/.cproject @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/qs-logger/ccs/.project b/boards/dk-tm4c123g/qs-logger/ccs/.project new file mode 100644 index 0000000..4aa50f1 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/ccs/.project @@ -0,0 +1,135 @@ + + + qs-logger + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + acquire.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/acquire.c + + + clocksetwidget.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/clocksetwidget.c + + + flashstore.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/flashstore.c + + + images.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/images.c + + + menus.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/menus.c + + + qs-logger.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/qs-logger.c + + + qs-logger_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/qs-logger_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/startup_ccs.c + + + stripchartmanager.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/stripchartmanager.c + + + usb_serial_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/usb_serial_structs.c + + + usbserial.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/usbserial.c + + + usbstick.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/qs-logger/usbstick.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + drivers/slidemenuwidget.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/slidemenuwidget.c + + + drivers/stripchartwidget.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/stripchartwidget.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/fatfs/port/fat_usbmsc.c + 1 + SW_ROOT/third_party/fatfs/port/fat_usbmsc.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/qs-logger/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/qs-logger/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/qs-logger/ccs/Debug/qs-logger.bin b/boards/dk-tm4c123g/qs-logger/ccs/Debug/qs-logger.bin new file mode 100644 index 0000000..be8dc49 Binary files /dev/null and b/boards/dk-tm4c123g/qs-logger/ccs/Debug/qs-logger.bin differ diff --git a/boards/dk-tm4c123g/qs-logger/ccs/Debug/qs-logger.out b/boards/dk-tm4c123g/qs-logger/ccs/Debug/qs-logger.out new file mode 100644 index 0000000..b9a8bac Binary files /dev/null and b/boards/dk-tm4c123g/qs-logger/ccs/Debug/qs-logger.out differ diff --git a/boards/dk-tm4c123g/qs-logger/ccs/macros.ini_initial b/boards/dk-tm4c123g/qs-logger/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/qs-logger/ccs/target_config.ccxml b/boards/dk-tm4c123g/qs-logger/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/qs-logger/clocksetwidget.c b/boards/dk-tm4c123g/qs-logger/clocksetwidget.c new file mode 100644 index 0000000..9cf8395 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/clocksetwidget.c @@ -0,0 +1,1031 @@ +//***************************************************************************** +// +// clocksetwidget.c - A widget for setting clock date/time. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "utils/uartstdio.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "utils/ustdlib.h" +#include "clocksetwidget.h" + +//***************************************************************************** +// +//! \addtogroup clocksetwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// This is a custom widget for setting the date/time of a clock. The widget +// will display the year, month, day, hour and minute on the display. The +// user can highlight the fields with the left/right keys, and can change the +// value of each with the up/down keys. When finished the user highlights +// the OK field on the screen and presses the select button. +// +//***************************************************************************** + +//***************************************************************************** +// +// Define indices for each of the fields used for date and time. +// +//***************************************************************************** +#define FIELD_YEAR 0 +#define FIELD_MONTH 1 +#define FIELD_DAY 2 +#define FIELD_HOUR 3 +#define FIELD_MINUTE 4 +#define FIELD_OK 5 +#define FIELD_CANCEL 6 +#define FIELD_LAST 6 +#define NUM_FIELDS 7 + +//***************************************************************************** +// +//! Paints the clock set widget on the display. +//! +//! \param psWidget is a pointer to the clock setting widget to be drawn. +//! +//! This function draws the date and time fields of the clock setting widget +//! onto the display. One of the fields can be highlighted. This is +//! called in response to a \b WIDGET_MSG_PAINT message. +//! +//! \return None. +// +//***************************************************************************** +static void +ClockSetPaint(tWidget *psWidget) +{ + tClockSetWidget *psClockWidget; + tContext sContext; + tRectangle sRect, sRectSel; + struct tm *psTime; + char pcBuf[8]; + int32_t i32X, i32Y, i32Width, i32Height; + uint32_t ui32Idx, ui32FontHeight, ui32FontWidth, ui32SelWidth; + + // + // Check the arguments. + // + ASSERT(psWidget); + ASSERT(psWidget->psDisplay); + + // + // Convert the generic widget pointer into a clock set widget pointer. + // + psClockWidget = (tClockSetWidget *)psWidget; + ASSERT(psClockWidget->psTime); + + // + // Get pointer to the time structure + // + psTime = psClockWidget->psTime; + + // + // Initialize a drawing context. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region based on the extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Set the font for the context, and get font height and width - they + // are used a lot later. + // + GrContextFontSet(&sContext, psClockWidget->psFont); + ui32FontHeight = GrFontHeightGet(psClockWidget->psFont); + ui32FontWidth = GrFontMaxWidthGet(psClockWidget->psFont); + + // + // Fill the widget with the background color. + // + GrContextForegroundSet(&sContext, psClockWidget->ui32BackgroundColor); + GrRectFill(&sContext, &sContext.sClipRegion); + + // + // Draw a border around the widget + // + GrContextForegroundSet(&sContext, psClockWidget->ui32ForegroundColor); + GrContextBackgroundSet(&sContext, psClockWidget->ui32BackgroundColor); + GrRectDraw(&sContext, &sContext.sClipRegion); + + // + // Compute a rectangle for the screen title. Put it at the top of + // the widget display, and sized to be the height of the font, plus + // a few pixels of space. + // + sRect.i16XMin = sContext.sClipRegion.i16XMin; + sRect.i16XMax = sContext.sClipRegion.i16XMax; + sRect.i16YMin = sContext.sClipRegion.i16YMin; + sRect.i16YMax = ui32FontHeight * 2; + GrRectDraw(&sContext, &sRect); + + // + // Print a title for the widget + // + GrContextFontSet(&sContext, psClockWidget->psFont); + GrStringDrawCentered(&sContext, "CLOCK SET", -1, + (1 + sRect.i16XMax - sRect.i16XMin) / 2, + (1 + sRect.i16YMax - sRect.i16YMin) / 2, 1); + + // + // Reset the rectangle to cover the non-title area of the display + // + sRect.i16YMin = sRect.i16YMax + 1; + sRect.i16YMax = sContext.sClipRegion.i16YMax; + + // + // Compute the width and height of the area remaining for showing the + // clock fields. + // + i32Width = 1 + (sRect.i16XMax - sRect.i16XMin); + i32Height = 1 + (sRect.i16YMax - sRect.i16YMin); + + // + // Compute the X and Y starting point for the row that will show the + // date. + // + i32X = sRect.i16XMin + (i32Width - (ui32FontWidth * 10)) / 2; + i32Y = sRect.i16YMin + ((i32Height * 1) / 6) - (ui32FontHeight / 2); + + // + // Draw the date field separators on the date row. + // + GrStringDraw(&sContext, "/", -1, i32X + (ui32FontWidth * 4), i32Y, 0); + GrStringDraw(&sContext, "/", -1, i32X + (ui32FontWidth * 7), i32Y, 0); + + // + // Compute the X and Y starting point for the row that will show the + // time. + // + i32X = sRect.i16XMin + (i32Width - (ui32FontWidth * 5)) / 2; + i32Y = sRect.i16YMin + ((i32Height * 3) / 6) - (ui32FontHeight / 2); + + // + // Draw the time field separators on the time row. + // + GrStringDraw(&sContext, ":", -1, i32X + (ui32FontWidth * 2), i32Y, 0); + + // + // Process each of the fields to be shown on the widget + // + for(ui32Idx = 0; ui32Idx < NUM_FIELDS; ui32Idx++) + { + // + // Compute the X and Y for the text for each field, and print the + // text into a buffer. + // + switch(ui32Idx) + { + // + // Year + // + case FIELD_YEAR: + { + usnprintf(pcBuf, sizeof(pcBuf), "%4u", psTime->tm_year + 1900); + i32X = sRect.i16XMin + (i32Width - (ui32FontWidth * 10)) / 2; + i32Y = sRect.i16YMin + ((i32Height * 1) / 6) - + (ui32FontHeight / 2); + ui32SelWidth = 4; + break; + } + + // + // Month + // + case FIELD_MONTH: + { + usnprintf(pcBuf, sizeof(pcBuf), "%02u", psTime->tm_mon + 1); + i32X += ui32FontWidth * 5; + ui32SelWidth = 2; + break; + } + + // + // Day + // + case FIELD_DAY: + { + usnprintf(pcBuf, sizeof(pcBuf), "%02u", psTime->tm_mday); + i32X += ui32FontWidth * 3; + ui32SelWidth = 2; + break; + } + + // + // Hour + // + case FIELD_HOUR: + { + usnprintf(pcBuf, sizeof(pcBuf), "%02u", psTime->tm_hour); + i32X = sRect.i16XMin + (i32Width - (ui32FontWidth * 5)) / 2; + i32Y = sRect.i16YMin + ((i32Height * 3) / 6) - + (ui32FontHeight / 2); + ui32SelWidth = 2; + break; + } + + // + // Minute + // + case FIELD_MINUTE: + { + usnprintf(pcBuf, sizeof(pcBuf), "%02u", psTime->tm_min); + i32X += ui32FontWidth * 3; + ui32SelWidth = 2; + break; + } + + // + // OK + // + case FIELD_OK: + { + usnprintf(pcBuf, sizeof(pcBuf), "OK"); + i32X = (i32Width - (ui32FontWidth * 9)) / 2; + i32X += sRect.i16XMin; + i32Y = ((i32Height * 5) / 6) - (ui32FontHeight / 2); + i32Y += sRect.i16YMin; + ui32SelWidth = 2; + break; + } + + // + // CANCEL (default case is purely to keep the compiler from + // issuing a warning that ui32SelWidth may be used ininitialized). + // + case FIELD_CANCEL: + default: + { + usnprintf(pcBuf, sizeof(pcBuf), "CANCEL"); + i32X += ui32FontWidth * 3; + ui32SelWidth = 6; + break; + } + } + + + // + // If the current field index is the highlighted field, then this + // text field will be drawn with highlighting. + // + if(ui32Idx == psClockWidget->ui32Highlight) + { + // + // Compute a rectangle for the highlight area. + // + sRectSel.i16XMin = i32X; + sRectSel.i16XMax = (ui32SelWidth * ui32FontWidth) + i32X; + sRectSel.i16YMin = i32Y - 2; + sRectSel.i16YMax = ui32FontHeight + i32Y + 2; + + // + // Set the foreground color to the text color, and then fill the + // highlight rectangle. The text field will be highlighted by + // inverting the normal colors. + // Then draw the highlighting rectangle. + // + GrContextForegroundSet(&sContext, + psClockWidget->ui32ForegroundColor); + GrRectFill(&sContext, &sRectSel); + + // + // Change the foreground color to the normal background color. + // This will be used for drawing the text for the highlighted + // field, which has the colors inverted (FG <--> BG) + // + GrContextForegroundSet(&sContext, + psClockWidget->ui32BackgroundColor); + } + else + { + // + // This text field is not highlighted so just set the normal + // foreground color. + // + GrContextForegroundSet(&sContext, + psClockWidget->ui32ForegroundColor); + } + + // + // Print the text from the buffer to the display at the computed + // location. + // + GrStringDraw(&sContext, pcBuf, -1, i32X, i32Y, 0); + } +} + +//***************************************************************************** +// +//! Determine the number of days in a month. +//! +//! \param tm_mon is the month number to use for determining the number of +//! days. The month begins with 0 meaning January and 11 meaning December. +//! +//! This function returns the highest day number for the specified month. +//! It does not account for leap year, so February always returns 28 days. +//! +//! \return Returns the highest day number for the month. +// +//***************************************************************************** +static uint8_t +MaxDayOfMonth(uint8_t tm_mon) +{ + // + // Process the month + // + switch(tm_mon) + { + // + // February returns 28 days + // + case 1: + { + return(28); + } + + // + // April, June, September and November return 30 + // + case 3: + case 5: + case 8: + case 10: + { + return(30); + } + + // + // Remaining months have 31 days. + // + default: + { + return(31); + } + } +} + +//***************************************************************************** +// +//! Handle the UP button event. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! +//! This function handles the event when the user has pressed the up button. +//! It will increment the currently highlighted date/time field if it is not +//! already at the maximum value. If the month or day of the month is being +//! changed then it enforces the maximum number of days for the month. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeyUp(tClockSetWidget *psWidget) +{ + // + // Get pointer to the time structure to be modified. + // + struct tm *psTime = psWidget->psTime; + + // + // Determine which field is highlighted. + // + switch(psWidget->ui32Highlight) + { + // + // Increment the year. Cap it at 2037 to keep things simple. + // + case FIELD_YEAR: + { + if(psTime->tm_year+1900 < 2037) + { + psTime->tm_year++; + } + break; + } + + // + // Increment the month. Adjust the day of the month if needed. + // + case FIELD_MONTH: + { + if(psTime->tm_mon < 11) + { + psTime->tm_mon++; + } + if(psTime->tm_mday > MaxDayOfMonth(psTime->tm_mon)) + { + psTime->tm_mday = MaxDayOfMonth(psTime->tm_mon); + } + break; + } + + // + // Increment the day. Cap it at the max number of days for the + // current value of month. + // + case FIELD_DAY: + { + if(psTime->tm_mday < MaxDayOfMonth(psTime->tm_mon)) + { + psTime->tm_mday++; + } + break; + } + + // + // Increment the hour. + // + case FIELD_HOUR: + { + if(psTime->tm_hour < 23) + { + psTime->tm_hour++; + } + break; + } + + // + // Increment the minute. + // + case FIELD_MINUTE: + { + if(psTime->tm_min < 59) + { + psTime->tm_min++; + } + break; + } + + // + // Bad value for field index - ignore. + // + default: + { + break; + } + } + + // + // Since something may have been changed in the clock value, request + // a repaint of the widget. + // + WidgetPaint(&psWidget->sBase); + + // + // Return indication that the button event was handled. + // + return(1); +} + +//***************************************************************************** +// +//! Handle the DOWN button event. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! +//! This function handles the event when the user has pressed the down button. +//! It will decrement the currently highlighted date/time field if it is not +//! already at the minimum value. If the month is being changed then it +//! enforces the maximum number of days for the month. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeyDown(tClockSetWidget *psWidget) +{ + // + // Get pointer to the time structure to be modified. + // + struct tm *psTime = psWidget->psTime; + + // + // Determine which field is highlighted. + // + switch(psWidget->ui32Highlight) + { + // + // Decrement the year. Minimum year is 1970. + // + case FIELD_YEAR: + { + if(psTime->tm_year+1900 > 1970) + { + psTime->tm_year--; + } + break; + } + + // + // Decrement the month. If the month has changed, check that the + // day is valid for this month, and enforce the maximum day number + // for this month. + // + case FIELD_MONTH: + { + if(psTime->tm_mon > 0) + { + psTime->tm_mon--; + } + if(psTime->tm_mday > MaxDayOfMonth(psTime->tm_mon)) + { + psTime->tm_mday = MaxDayOfMonth(psTime->tm_mon); + } + break; + } + + // + // Decrement the day + // + case FIELD_DAY: + { + if(psTime->tm_mday > 1) + { + psTime->tm_mday--; + } + break; + } + + // + // Decrement the hour + // + case FIELD_HOUR: + { + if(psTime->tm_hour > 0) + { + psTime->tm_hour--; + } + break; + } + + // + // Decrement the minute + // + case FIELD_MINUTE: + { + if(psTime->tm_min > 0) + { + psTime->tm_min--; + } + break; + } + + // + // Bad value for field index - ignore. + // + default: + { + break; + } + } + + // + // Since something may have been changed in the clock value, request + // a repaint of the widget. + // + WidgetPaint(&psWidget->sBase); + + // + // Return indication that the button event was handled. + // + return(1); +} + +//***************************************************************************** +// +//! Handle the LEFT button event. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! +//! This function handles the event when the user has pressed the left button. +//! It will change the highlighted field to the previous field. If it is +//! at the first field in the display, it will wrap around to the last. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeyLeft(tClockSetWidget *psWidget) +{ + // + // If not already at the minimum, decrement the highlighted field index. + // + if(psWidget->ui32Highlight) + { + psWidget->ui32Highlight--; + } + else + { + // + // Already at the first field, so reset to the last field. + // + psWidget->ui32Highlight = FIELD_LAST; + } + + // + // The highlighted field changed, so request a repaint of the widget. + // + WidgetPaint(&psWidget->sBase); + + // + // Return indication that the button event was handled. + // + return(1); +} + +//***************************************************************************** +// +//! Handle the RIGHT button event. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! +//! This function handles the event when the user has pressed the right button. +//! It will change the highlighted field to the next field. If it is already +//! at the last field in the display, it will wrap around to the first. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeyRight(tClockSetWidget *psWidget) +{ + // + // If not already at the last field, increment the highlighted field index. + // + if(psWidget->ui32Highlight < FIELD_LAST) + { + psWidget->ui32Highlight++; + } + else + { + // + // Already at the last field, so reset to the first field. + // + psWidget->ui32Highlight = 0; + } + + // + // The highlighted field changed, so request a repaint of the widget. + // + WidgetPaint(&psWidget->sBase); + + // + // Return indication that the button event was handled. + // + return(1); +} + +//***************************************************************************** +// +//! Handle the select button event. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! +//! This function handles the event when the user has pressed the select +//! button. If either the OK or CANCEL fields is highlighted, then the +//! function will call the callback function to notify the application that +//! an action has been taken and the widget should be dismissed. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeySelect(tClockSetWidget *psWidget) +{ + bool bOk; + + // + // Determine if the OK text field is highlighted and set a flag. + // + bOk = (psWidget->ui32Highlight == FIELD_OK) ? true : false; + + // + // If there is a callback function installed, and either the OK or CANCEL + // fields is highlighted, then take action. + // + if(psWidget->pfnOnOkClick && ((psWidget->ui32Highlight == FIELD_OK) || + (psWidget->ui32Highlight == FIELD_CANCEL))) + { + // + // Call the callback function and pass the flag to indicate if OK + // was selected (otherwise it was CANCEL). + // + psWidget->pfnOnOkClick(&psWidget->sBase, bOk); + + // + // Set the default highlighted field. This is the field that will + // be highlighted the next time this widget is activated. + // + psWidget->ui32Highlight = FIELD_CANCEL; + + // + // Return to caller, indicating the button event was handled. + // + return(1); + } + else + { + // + // There is no callback function, or neither the OK or CANCEL fields is + // highlighted. In this case ingore the button event. + // + return(0); + } +} + +//***************************************************************************** +// +//! Dispatch button events destined for this widget. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! \param ui32Msg is the widget message to process. +//! +//! This function receives button/key event messages that are meant for +//! this widget. It then calls the appropriate function to handle the +//! button event. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeyHandler(tWidget *psWidget, uint32_t ui32Msg) +{ + tClockSetWidget *psClockWidget; + + ASSERT(psWidget); + + // + // Get pointer to the clock setting widget. + // + psClockWidget = (tClockSetWidget *)psWidget; + + // + // Process the key event + // + switch(ui32Msg) + { + // + // Select key + // + case WIDGET_MSG_KEY_SELECT: + { + return(ClockSetKeySelect(psClockWidget)); + } + + // + // Up button + // + case WIDGET_MSG_KEY_UP: + { + return(ClockSetKeyUp(psClockWidget)); + } + + // + // Down button + // + case WIDGET_MSG_KEY_DOWN: + { + return(ClockSetKeyDown(psClockWidget)); + } + + // + // Left button + // + case WIDGET_MSG_KEY_LEFT: + { + return(ClockSetKeyLeft(psClockWidget)); + } + + // + // Right button + // + case WIDGET_MSG_KEY_RIGHT: + { + return(ClockSetKeyRight(psClockWidget)); + } + + // + // This is an unexpected event. Return an indication that the event + // was not handled. + // + default: + { + return(0); + } + } +} + +//***************************************************************************** +// +//! Handles messages for a clock setting widget. +//! +//! \param psWidget is a pointer to the clock set widget. +//! \param ui32Msg is the message. +//! \param ui32Param1 is the first parameter to the message. +//! \param ui32Param2 is the second parameter to the message. +//! +//! This function receives messages intended for this clock set widget and +//! processes them accordingly. The processing of the message varies based on +//! the message in question. +//! +//! Unrecognized messages are handled by calling WidgetDefaultMsgProc(). +//! +//! \return Returns a value appropriate to the supplied message. +// +//***************************************************************************** +int32_t +ClockSetMsgProc(tWidget *psWidget, uint32_t ui32Msg, uint32_t ui32Param1, + uint32_t ui32Param2) +{ + // + // Check the arguments. + // + ASSERT(psWidget); + + // + // Determine which message is being sent. + // + switch(ui32Msg) + { + // + // The widget paint request has been sent. + // + case WIDGET_MSG_PAINT: + { + // + // Handle the widget paint request. + // + ClockSetPaint(psWidget); + + // + // Return one to indicate that the message was successfully + // processed. + // + return(1); + } + + // + // Process any button/key event messages. + // + case WIDGET_MSG_KEY_SELECT: + case WIDGET_MSG_KEY_UP: + case WIDGET_MSG_KEY_DOWN: + case WIDGET_MSG_KEY_LEFT: + case WIDGET_MSG_KEY_RIGHT: + { + // + // If the key event is for this widget, then process the key event + // + if((tWidget *)ui32Param1 == psWidget) + { + return(ClockSetKeyHandler(psWidget, ui32Msg)); + } + } + + // + // An unknown request has been sent. + // + default: + { + // + // Let the default message handler process this message. + // + return(WidgetDefaultMsgProc(psWidget, ui32Msg, ui32Param1, + ui32Param2)); + } + } +} + +//***************************************************************************** +// +//! Initializes a clock setting widget. +//! +//! \param psWidget is a pointer to the clock set widget to initialize. +//! \param psDisplay is a pointer to the display on which to draw the widget. +//! \param i32X is the X coordinate of the upper left corner of the widget. +//! \param i32Y is the Y coordinate of the upper left corner of the widget. +//! \param i32Width is the width of the widget. +//! \param i32Height is the height of the widget. +//! \param psFont is the font to use for drawing text on the widget. +//! \param ui32ForegroundColor is the color of the text and lines on the +//! widget. +//! \param ui32BackgroundColor is the color of the widget background. +//! \param psTime is a pointer to the time structure to use for clock fields. +//! \param pfnOnOkClick is a callback function that is called when the user +//! selects the OK field on the display. +//! +//! This function initializes the caller provided clock setting widget. +//! +//! \return None. +// +//***************************************************************************** +void +ClockSetInit(tClockSetWidget *psWidget, const tDisplay *psDisplay, + int32_t i32X, int32_t i32Y, int32_t i32Width, int32_t i32Height, + tFont *psFont, uint32_t ui32ForegroundColor, + uint32_t ui32BackgroundColor, struct tm *psTime, + void (*pfnOnOkClick)(tWidget *psWidget, bool bOk)) +{ + uint32_t ui32Idx; + + // + // Check the arguments. + // + ASSERT(psWidget); + ASSERT(psDisplay); + + // + // Clear out the widget structure. + // + for(ui32Idx = 0; ui32Idx < sizeof(tClockSetWidget); ui32Idx += 4) + { + ((uint32_t *)psWidget)[ui32Idx / 4] = 0; + } + + // + // Set the size of the widget structure. + // + psWidget->sBase.i32Size = sizeof(tClockSetWidget); + + // + // Mark this widget as fully disconnected. + // + psWidget->sBase.psParent = 0; + psWidget->sBase.psNext = 0; + psWidget->sBase.psChild = 0; + + // + // Save the display pointer. + // + psWidget->sBase.psDisplay = psDisplay; + + // + // Set the extents of the display area. + // + psWidget->sBase.sPosition.i16XMin = i32X; + psWidget->sBase.sPosition.i16YMin = i32Y; + psWidget->sBase.sPosition.i16XMax = i32X + i32Width - 1; + psWidget->sBase.sPosition.i16YMax = i32Y + i32Height - 1; + + // + // Initialize the widget fields + // + psWidget->psFont = psFont; + psWidget->ui32ForegroundColor = ui32ForegroundColor; + psWidget->ui32BackgroundColor = ui32BackgroundColor; + psWidget->psTime = psTime; + psWidget->pfnOnOkClick = pfnOnOkClick; + + // + // Use the clock set message handler to process messages to this widget. + // + psWidget->sBase.pfnMsgProc = ClockSetMsgProc; +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + diff --git a/boards/dk-tm4c123g/qs-logger/clocksetwidget.h b/boards/dk-tm4c123g/qs-logger/clocksetwidget.h new file mode 100644 index 0000000..dde9df7 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/clocksetwidget.h @@ -0,0 +1,273 @@ +//***************************************************************************** +// +// clocksetwidget.h - Prototypes for a widget to set a clock date/time. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __CLOCKSETWIDGET_H__ +#define __CLOCKSETWIDGET_H__ + +//***************************************************************************** +// +//! \addtogroup clocksetwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! A structure that represents a clock setting widget. +// +//***************************************************************************** +typedef struct _ClockSetWidget +{ + // + //! The generic widget information. + // + tWidget sBase; + + // + //! The font to use for drawing text on the widget. + // + const tFont *psFont; + + // + //! The foreground color of the widget. This is the color that will be + //! used for drawing text and lines, and will also be used as the highlight + //! color for a selected field on the widget. + // + uint32_t ui32ForegroundColor; + + // + //! The background color of the widget. + // + uint32_t ui32BackgroundColor; + + // + //! An index for the date/time field that is highlighted + // + uint32_t ui32Highlight; + + // + //! A pointer to a time structure that is used for showing and editing + //! the date and time. The application should supply the storage for this + //! structure, and this widget will modify it as the user changes the + //! date/time. + // + struct tm *psTime; + + // + //! A pointer to the function to be called when the OK or cancel button is + //! selected. The OK button is used to indicate the user is done setting + //! the time. The CANCEL button is used to indicate that the user does + //! not want to update the time. The flag bOk is true if the OK button + //! was selected, false otherwise. The callback function can be used by + //! the application to detect when the clock setting widget can be removed + //! from the screen and whether or not to update the time. + // + void (*pfnOnOkClick)(tWidget *psWidget, bool bOk); +} tClockSetWidget; + +//***************************************************************************** +// +//! Declares an initialized strip chart widget data structure. +//! +//! \param psParent is a pointer to the parent widget. +//! \param psNext is a pointer to the sibling widget. +//! \param psChild is a pointer to the first child widget. +//! \param psDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param psFont is the font used for rendering text on the widget. +//! \param ui32ForegroundColor is the foreground color for the widget. +//! \param ui32BackgroundColor is the background color for the chart. +//! \param psTime is a pointer to storage for the time structure that the +//! widget will modify. +//! \param pfnOnOkClick is a callback function that is called when the user +//! selects the OK or CANCEL button on the widget. +//! +//! This macro provides an initialized clock setting widget data structure, +//! which can be used to construct the widget tree at compile time in global +//! variables (as opposed to run-time via function calls). This must be +//! assigned to a variable, such as: +//! +//! \verbatim +//! tClockSetWidget g_sClockSetter = ClockSetStruct(...); +//! \endverbatim +//! +//! Or, in an array of variables: +//! +//! \verbatim +//! tClockSetWidget g_psClockSetters[] = +//! { +//! ClockSetStruct(...), +//! ClockSetStruct(...) +//! }; +//! \endverbatim +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define ClockSetStruct(psParent, psNext, psChild, psDisplay, i32X, i32Y, \ + i32Width, i32Height, psFont, ui32ForegroundColor, \ + ui32BackgroundColor, psTime, pfnOnOkClick) \ + { \ + { \ + sizeof(tClockSetWidget), \ + (tWidget *)(psParent), \ + (tWidget *)(psNext), \ + (tWidget *)(psChild), \ + psDisplay, \ + { \ + i32X, \ + i32Y, \ + (i32X) + (i32Width) - 1, \ + (i32Y) + (i32Height) - 1 \ + }, \ + ClockSetMsgProc \ + }, \ + psFont, ui32ForegroundColor, ui32BackgroundColor, 6, psTime, \ + pfnOnOkClick \ + } + +//***************************************************************************** +// +//! Declares an initialized variable containing a clock setting widget data +//! structure. +//! +//! \param sName is the name of the variable to be declared. +//! \param psParent is a pointer to the parent widget. +//! \param psNext is a pointer to the sibling widget. +//! \param psChild is a pointer to the first child widget. +//! \param psDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param psFont is the font used for rendering text on the widget. +//! \param ui32ForegroundColor is the foreground color for the widget. +//! \param ui32BackgroundColor is the background color for the chart. +//! \param psTime is a pointer to storage for the time structure that the +//! widget will modify. +//! \param pfnOnOkClick is a callback function that is called when the user +//! selects the OK or CANCEL button on the widget. +//! +//! This macro declares a variable containing an initialized clock setting +//! widget data structure, which can be used to construct the widget tree at +//! compile time in global variables (as opposed to run-time via function +//! calls). +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define ClockSet(sName, psParent, psNext, psChild, psDisplay, i32X, i32Y, \ + i32Width, i32Height, psFont, ui32ForegroundColor, \ + ui32BackgroundColor, psTime, pfnOnOkClick) \ + tClockSetWidget sName = ClockSetStruct(psParent, psNext, psChild, \ + psDisplay, i32X, i32Y, \ + i32Width, i32Height, psFont, \ + ui32ForegroundColor, \ + ui32BackgroundColor, psTime, \ + pfnOnOkClick) + +//***************************************************************************** +// +//! Sets the pointer to the time structure for the clock set widget. +//! +//! \param psClockSetWidget is a pointer to the clock set widget to modify. +//! \param psTime is a pointer to the a time structure to use for clock +//! setting. +//! +//! This function sets the time structure used by the widget. +//! +//! \return None. +// +//***************************************************************************** +#define ClockSetTimePtrSet(psClockSetWidget, psTime) \ + do \ + { \ + (pClockSetWidget)->psTime = (psTime); \ + } \ + while(0) + +//***************************************************************************** +// +//! Sets the callback function to be used when OK or CANCEL is selected. +//! +//! \param pClockSetWidget is a pointer to the clock set widget to modify. +//! \param pfnCB is a pointer to function to call when OK is selected by the +//! user. +//! +//! This function sets the OK click callback function used by the widget. +//! +//! \return None. +// +//***************************************************************************** +#define ClockSetCallbackSet(pClockSetWidget, pfnCB) \ + do \ + { \ + (pClockSetWidget)->pfnOnOkClick = (pfnCB); \ + } while(0) + +//***************************************************************************** +// +// Prototypes for the clock set widget APIs. +// +//***************************************************************************** +extern void ClockSetInit(tClockSetWidget *psWidget, const tDisplay *psDisplay, + int32_t i32X, int32_t i32Y, int32_t i32Width, + int32_t i32Height, tFont *psFont, + uint32_t ui32ForegroundColor, + uint32_t ui32BackgroundColor, struct tm *psTime, + void (*pfnOnOkClick)(tWidget *psWidget, bool bOk)); +extern int32_t ClockSetMsgProc(tWidget *psWidget, uint32_t ui32Msg, + uint32_t ui32Param1, uint32_t ui32Param2); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#endif // __CLOCKSETWIDGET_H__ diff --git a/boards/dk-tm4c123g/qs-logger/ewarm/Exe/qs-logger.bin b/boards/dk-tm4c123g/qs-logger/ewarm/Exe/qs-logger.bin new file mode 100644 index 0000000..88ec8ee Binary files /dev/null and b/boards/dk-tm4c123g/qs-logger/ewarm/Exe/qs-logger.bin differ diff --git a/boards/dk-tm4c123g/qs-logger/ewarm/Exe/qs-logger.out b/boards/dk-tm4c123g/qs-logger/ewarm/Exe/qs-logger.out new file mode 100644 index 0000000..4f1894a Binary files /dev/null and b/boards/dk-tm4c123g/qs-logger/ewarm/Exe/qs-logger.out differ diff --git a/boards/dk-tm4c123g/qs-logger/flashstore.c b/boards/dk-tm4c123g/qs-logger/flashstore.c new file mode 100644 index 0000000..5001a38 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/flashstore.c @@ -0,0 +1,625 @@ +//***************************************************************************** +// +// flashstore.c - Data logger module to handle storage in flash. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/flash.h" +#include "utils/ustdlib.h" +#include "qs-logger.h" +#include "usbstick.h" +#include "flashstore.h" + +//***************************************************************************** +// +// This module manages the storage of data logger data into flash memory. +// +//***************************************************************************** + +//***************************************************************************** +// +// Define the beginning and end of the flash storage area. You must make sure +// that this area is well clear of any space occupied by the application +// binary, and that this space is not used for any other purpose. +// The start and end addresses must be 1K aligned. The end address is +// exclusive - it is 1 value greater than the last valid location used for +// storage. +// +//***************************************************************************** +#define FLASH_STORE_START_ADDR 0x20000 +#define FLASH_STORE_END_ADDR 0x40000 + +//***************************************************************************** +// +// The next address in flash, that will be used for storing a data record. +// +//***************************************************************************** +static uint32_t g_ui32StoreAddr; + +//***************************************************************************** +// +// A buffer used to assemble a complete record of data prior to storing it +// in the flash. +// +//***************************************************************************** +static uint32_t g_pui32RecordBuf[32]; + +//***************************************************************************** +// +// Initializes the flash storage. This is a stub because there is nothing +// special to do. +// +//***************************************************************************** +void +FlashStoreInit(void) +{ +} + +//***************************************************************************** +// +// Saves data records that are stored in the flash to an externally connected +// USB memory storage device (USB stick). +// The flash memory is scanned for the presence of store data records. When +// records are found they are written in CSV format to the USB stick. This +// function assumes a non-corrupted storage area, and that any records, once +// found, are contiguous with all stored records. It will find the oldest +// record and start with that when storing. +// +//***************************************************************************** +int32_t +FlashStoreSave(void) +{ + uint32_t ui32Addr, ui32OldestRecord, ui32OldestSeconds, ui32Count, + ui32PartialCount; + tLogRecord *psRecord; + + // + // Initialize locals. + // + ui32OldestRecord = FLASH_STORE_START_ADDR; + ui32OldestSeconds = 0xFFFFFFFF; + + // + // Show a message to the user. + // + SetStatusText("SAVE", "SCANNING", "FLASH", 0); + + // + // Start at beginning of flash storage area + // + ui32Addr = FLASH_STORE_START_ADDR; + + // + // Search all of flash area checking every stored record. + // + while(ui32Addr < FLASH_STORE_END_ADDR) + { + // + // If a record signature is found, check for oldest record, then + // increment to the next record + // + if((HWREG(ui32Addr) & 0xFFFFFF00) == 0x53554100) + { + // + // Get a pointer to the data record (account for flash header word) + // + psRecord = (tLogRecord *)(ui32Addr + 4); + + // + // If the seconds in this record are older than any found so far + // then save the seconds value, and the address of this record + // + if(psRecord->ui32Seconds < ui32OldestSeconds) + { + ui32OldestSeconds = psRecord->ui32Seconds; + ui32OldestRecord = ui32Addr; + } + + // + // Advance the address to the next record. + // + ui32Addr += HWREG(ui32Addr) & 0xFF; + } + else + { + // + // A record was not found so just advance to the next location in + // flash + // + ui32Addr += 4; + } + } + + // + // If no "oldest" seconds was found, then there is no valid data stored + // + if(ui32OldestSeconds == 0xFFFFFFFF) + { + SetStatusText("SAVE", "NO RECORDS", "FOUND", "PRESS <"); + return(1); + } + + // + // Open the output file on the USB stick. It will return NULL if there + // was any problem. + // + if(!USBStickOpenLogFile(0)) + { + SetStatusText("SAVE", 0, "USB ERROR", "PRESS <"); + return(1); + } + + // + // Notify user we are saving data to USB + // + SetStatusText("SAVE", "SAVING", "TO USB", 0); + + // + // Start reading records from flash, start at the address of the oldest + // record, as found above. We scan through records, assuming the flash + // store is not corrupted. Continue scanning until a blank space is + // found which should indicate the end of recorded data, or until we + // have read all the records. + // + ui32Addr = ui32OldestRecord; + while(HWREG(ui32Addr) != 0xFFFFFFFF) + { + // + // If a record signature is found (which it should be), extract the + // record data and send it to USB stick. + // + if((HWREG(ui32Addr) & 0xFFFFFF00) == 0x53554100) + { + // + // Get byte count for this record + // + ui32Count = HWREG(ui32Addr) & 0xFF; + + // + // Adjust the count and the address to remove the flash header + // + ui32Count -= 4; + ui32Addr += 4; + + // + // Adjust for memory wrap + // + if(ui32Addr >= FLASH_STORE_END_ADDR) + { + ui32Addr = FLASH_STORE_START_ADDR; + } + + // + // If the contents of this record go past the end of the memory + // storage area, then perform a partial copy first. + // + ui32PartialCount = 0; + if((ui32Addr + ui32Count) >= FLASH_STORE_END_ADDR) + { + // + // Find how many bytes are left on this page + // + ui32PartialCount = FLASH_STORE_END_ADDR - ui32Addr; + + // + // Copy the portion until the end of memory store, adjust + // remaining count and address + // + memcpy(g_pui32RecordBuf, (void *)ui32Addr, ui32PartialCount); + ui32Count -= ui32PartialCount; + ui32Addr = FLASH_STORE_START_ADDR; + } + + // + // Copy entire record (or remaining part of record if memory wrap) + // into record buffer + // + memcpy(&g_pui32RecordBuf[ui32PartialCount / 4], (void *)ui32Addr, + ui32Count); + + // + // Update address pointer to next record + // + ui32Addr += ui32Count; + + // + // Now we have an entire data logger record copied from flash + // storage into a local (contiguous) memory buffer. Pass it + // to the USB file writing function to write the record to the + // USB stick. + // + USBStickWriteRecord((tLogRecord *)g_pui32RecordBuf); + } + else + { + // + // This should not happen, but it means we ended up in a non-blank + // location that is not the start of a record. In this case just + // advance through memory until either a blank location or another + // record is found. + // + // Increment to next word in flash, adjust for memory wrap. + // + ui32Addr += 4; + if(ui32Addr >= FLASH_STORE_END_ADDR) + { + ui32Addr = FLASH_STORE_START_ADDR; + } + } + } + + // + // Close the USB stick file so that any buffers will be flushed. + // + USBStickCloseFile(); + + // + // Inform user that save is complete. + // + SetStatusText("SAVE", "USB SAVE", "COMPLETE", "PRESS <"); + + // + // Return success + // + return(0); +} + +//***************************************************************************** +// +// This is called at the start of logging to prepare space in flash for +// storage of logged data. It searches for the first blank area in the +// flash storage to be used for storing records. +// +// If a starting address is specified then the search is skipped and it goes +// directly to the new address. If the starting address is 0, then it performs +// the search. +// +//***************************************************************************** +int32_t +FlashStoreOpenLogFile(uint32_t ui32StartAddr) +{ + uint32_t ui32Addr; + + // + // If a valid starting address is specified, then just use that and skip + // the search below. + // + if((ui32StartAddr >= FLASH_STORE_START_ADDR) && + (ui32StartAddr < FLASH_STORE_END_ADDR)) + { + g_ui32StoreAddr = ui32StartAddr; + return(0); + } + + // + // Start at beginning of flash storage area + // + ui32Addr = FLASH_STORE_START_ADDR; + + // + // Search until a blank is found or the end of flash storage area + // + while((HWREG(ui32Addr) != 0xFFFFFFFF) && (ui32Addr < FLASH_STORE_END_ADDR)) + { + // + // If a record signature is found, then increment to the next record + // + if((HWREG(ui32Addr) & 0xFFFFFF00) == 0x53554100) + { + ui32Addr += HWREG(ui32Addr) & 0xFF; + } + else + { + // + // Just advance to the next location in flash + // + ui32Addr += 4; + } + } + + // + // If we are at the end of flash that means no blank area was found. + // So reset to the beginning and erase the first page. + // + if(ui32Addr >= FLASH_STORE_END_ADDR) + { + ui32Addr = FLASH_STORE_START_ADDR; + FlashErase(ui32Addr); + } + + // + // When we reach here we either found a blank location, or made a new + // blank location by erasing the first page. + // To keep things simple we are making an assumption that the flash store + // is not corrupted and that the first blank location implies the start + // of a blank area suitable for storing data records. + // + g_ui32StoreAddr = ui32Addr; + + // + // Return success indication to caller + // + return(0); +} + +//***************************************************************************** +// +// This is called each time there is a new data record to log to the flash +// storage area. A simple algorithm is used which rotates programming +// data log records through an area of flash. It is assumed that the current +// page is blank. Records are stored on the current page until a page +// boundary is crossed. If the page boundary is crossed and the new page +// is not blank (testing only the first location), then the new page is +// erased. Finally the entire record is programmed into flash and the +// storage pointers are updated. +// +// While storing and when crossing to a new page, if the flash page is not +// blank it is erased. So this algorithm overwrites old data. +// +// The data is stored in flash as a record, with a flash header prepended, +// and with the record length padded to be a multiple of 4 bytes. The flash +// header is a 3-byte magic number and one byte of record length. +// +//***************************************************************************** +int32_t +FlashStoreWriteRecord(tLogRecord *psRecord) +{ + uint32_t ui32Idx, ui32ItemCount, *pui32Record; + + // + // Check the arguments + // + ASSERT(psRecord); + if(!psRecord) + { + return(1); + } + + // + // Determine how many channels are to be logged + // + ui32Idx = psRecord->ui16ItemMask; + ui32ItemCount = 0; + while(ui32Idx) + { + if(ui32Idx & 1) + { + ui32ItemCount++; + } + ui32Idx >>= 1; + } + + // + // Add 16-bit count equivalent of record header, time stamp, and + // selected items mask. This is the total number of 16 bit words + // of the record. + // + ui32ItemCount += 6; + + // + // Convert the count to bytes, be sure to pad to 32-bit alignment. + // + ui32ItemCount = ((ui32ItemCount * 2) + 3) & ~3; + + // + // Create the flash record header, which is a 3-byte signature and a + // one byte count of bytes in the record. Save it at the beginning + // of the write buffer. + // + ui32Idx = 0x53554100 | (ui32ItemCount & 0xFF); + g_pui32RecordBuf[0] = ui32Idx; + + // + // Copy the rest of the record to the buffer, and get a pointer to + // the buffer. + // + memcpy(&g_pui32RecordBuf[1], psRecord, ui32ItemCount - 4); + pui32Record = g_pui32RecordBuf; + + // + // Check to see if the record is going to cross a page boundary. + // + if(((g_ui32StoreAddr & 0x3FF) + ui32ItemCount) > 0x3FF) + { + // + // Find number of bytes remaining on this page + // + ui32Idx = 0x400 - (g_ui32StoreAddr & 0x3FF); + + // + // Program part of the record on the space remaining on the current + // page + // + FlashProgram(pui32Record, g_ui32StoreAddr, ui32Idx); + + // + // Increment the store address by the amount just written, which + // should make the new store address be at the beginning of the next + // flash page. + // + g_ui32StoreAddr += ui32Idx; + + // + // Adjust the remaining bytes to program, and the pointer to the + // remainder of the record data. + // + ui32ItemCount -= ui32Idx; + pui32Record = &g_pui32RecordBuf[ui32Idx / 4]; + + // + // Check to see if the new page is past the end of store and adjust + // + if(g_ui32StoreAddr >= FLASH_STORE_END_ADDR) + { + g_ui32StoreAddr = FLASH_STORE_START_ADDR; + } + + // + // If new page is not blank, then erase it + // + if(HWREG(g_ui32StoreAddr) != 0xFFFFFFFF) + { + FlashErase(g_ui32StoreAddr); + } + } + + // + // Now program the remaining part of the record (if we crossed a page + // boundary above) or the full record to the current location in flash + // + FlashProgram(pui32Record, g_ui32StoreAddr, ui32ItemCount); + + // + // Increment the storage address to the next location. + // + g_ui32StoreAddr += ui32ItemCount; + + // + // Return success indication to caller. + // + return(0); +} + +//***************************************************************************** +// +// Return the current address being used for storing records. +// +//***************************************************************************** +uint32_t +FlashStoreGetAddr(void) +{ + return(g_ui32StoreAddr); +} + +//***************************************************************************** +// +// Erase the data storage area of flash. +// +//***************************************************************************** +void +FlashStoreErase(void) +{ + uint32_t ui32Addr; + + // + // Inform user we are erasing + // + SetStatusText("ERASE", 0, "ERASING", 0); + + // + // Loop through entire storage area and erase each page. + // + for(ui32Addr = FLASH_STORE_START_ADDR; ui32Addr < FLASH_STORE_END_ADDR; + ui32Addr += 0x400) + { + FlashErase(ui32Addr); + } + + // + // Inform user the erase is done. + // + SetStatusText("SAVE", "ERASE", "COMPLETE", "PRESS <"); +} + +//***************************************************************************** +// +// Determine if the flash block that contains the address is blank. +// +//***************************************************************************** +static int32_t +IsBlockFree(uint32_t ui32BaseAddr) +{ + uint32_t ui32Addr; + + // + // Make sure we start at the beginning of a 1K block + // + ui32BaseAddr &= ~0x3FF; + + // + // Loop through every address in this block and test if it is blank. + // + for(ui32Addr = 0; ui32Addr < 0x400; ui32Addr += 4) + { + if(HWREG(ui32BaseAddr + ui32Addr) != 0xFFFFFFFF) + { + // + // Found a non-blank location, so return indication that block + // is not free. + // + return(0); + } + } + + // + // If we made it to here then every location in this block is erased, + // so return indication that the block is free. + // + return(1); +} + +//***************************************************************************** +// +// Report to the user the amount of free space and used space in the data +// storage area. +// +//***************************************************************************** +void +FlashStoreReport(void) +{ + uint32_t ui32Addr, ui32FreeBlocks, ui32UsedBlocks = 0; + static char pcBufFree[16], pcBufUsed[16]; + + // + // Initialize locals. + // + ui32FreeBlocks = 0; + ui32UsedBlocks = 0; + + // + // Loop through each block of the storage area and count how many blocks + // are free and non-free. + // + for(ui32Addr = FLASH_STORE_START_ADDR; ui32Addr < FLASH_STORE_END_ADDR; + ui32Addr += 0x400) + { + if(IsBlockFree(ui32Addr)) + { + ui32FreeBlocks++; + } + else + { + ui32UsedBlocks++; + } + } + + // + // Report the result to the user via a status display screen. + // + usnprintf(pcBufFree, sizeof(pcBufFree), "FREE: %3uK", ui32FreeBlocks); + usnprintf(pcBufUsed, sizeof(pcBufUsed), "USED: %3uK", ui32UsedBlocks); + SetStatusText("FREE FLASH", pcBufFree, pcBufUsed, "PRESS <"); +} diff --git a/boards/dk-tm4c123g/qs-logger/flashstore.h b/boards/dk-tm4c123g/qs-logger/flashstore.h new file mode 100644 index 0000000..02ef312 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/flashstore.h @@ -0,0 +1,60 @@ +//***************************************************************************** +// +// flashstore.h - Prototypes and definitions for flash storage module. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** +#ifndef __FLASHSTORE_H__ +#define __FLASHSTORE_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Module function prototypes. +// +//***************************************************************************** +extern void FlashStoreInit(void); +extern int32_t FlashStoreOpenLogFile(uint32_t ui32StartAddr); +extern int32_t FlashStoreWriteRecord(tLogRecord *psRecord); +extern int32_t FlashStoreSave(void); +extern void FlashStoreErase(void); +extern void FlashStoreReport(void); +extern uint32_t FlashStoreGetAddr(void); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __FLASHSTORE_H__ diff --git a/boards/dk-tm4c123g/qs-logger/gcc/qs-logger.axf b/boards/dk-tm4c123g/qs-logger/gcc/qs-logger.axf new file mode 100644 index 0000000..a026dff Binary files /dev/null and b/boards/dk-tm4c123g/qs-logger/gcc/qs-logger.axf differ diff --git a/boards/dk-tm4c123g/qs-logger/gcc/qs-logger.bin b/boards/dk-tm4c123g/qs-logger/gcc/qs-logger.bin new file mode 100644 index 0000000..72d2dc0 Binary files /dev/null and b/boards/dk-tm4c123g/qs-logger/gcc/qs-logger.bin differ diff --git a/boards/dk-tm4c123g/qs-logger/images.c b/boards/dk-tm4c123g/qs-logger/images.c new file mode 100644 index 0000000..f3282e6 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/images.c @@ -0,0 +1,865 @@ +//***************************************************************************** +// +// images.c - Data for images used in the user interface. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// This image contains the TI logo with black background. +// +//***************************************************************************** +const uint8_t g_pui8Image_TI_Black[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x11, 0x11, 0x15, + 0x0d, 0x0a, 0x55, + 0x2d, 0x2d, 0x2d, + 0x18, 0x13, 0xa1, + 0x4c, 0x4c, 0x4c, + 0x23, 0x1c, 0xea, + 0x6b, 0x6b, 0x6b, + 0x87, 0x87, 0x87, + 0x9b, 0x9b, 0x9b, + 0xa8, 0xa8, 0xa8, + 0xb9, 0xb9, 0xb9, + 0xc8, 0xc8, 0xc8, + 0xd7, 0xd7, 0xd7, + 0xe6, 0xe6, 0xe6, + 0xfe, 0xfe, 0xfe, + + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x8f, 0x03, 0x44, 0x44, 0x20, 0x07, + 0x07, 0x77, 0x2f, 0x83, 0x07, 0x66, 0x66, 0x20, 0x02, 0x10, 0x07, 0x07, + 0xe0, 0x77, 0x2f, 0x05, 0x66, 0x66, 0x20, 0x26, 0x20, 0xf8, 0x07, 0x07, + 0x77, 0x2f, 0x05, 0x66, 0x66, 0x20, 0x2f, 0x24, 0x10, 0x03, 0x01, 0x07, + 0x07, 0x77, 0x2f, 0x00, 0x00, 0x66, 0x66, 0x62, 0x24, 0x14, 0x44, 0x20, + 0x07, 0x00, 0x7d, 0xbc, 0xcb, 0xc1, 0x07, 0x07, 0x77, 0x80, 0x2f, 0x66, + 0x66, 0x62, 0x64, 0x26, 0x66, 0x40, 0x00, 0x00, 0x75, 0x3f, 0xc3, 0x85, + 0x33, 0x01, 0x31, 0x01, 0x00, 0x31, 0x00, 0x10, 0x00, 0x05, 0x10, 0x07, + 0xc0, 0xbf, 0x76, 0x66, 0x66, 0x22, 0x64, 0x14, 0x66, 0x00, 0x20, 0x00, + 0x00, 0x0f, 0x90, 0x7e, 0xaa, 0x95, 0x00, 0xfd, 0x08, 0xe3, 0x0a, 0xf1, + 0x03, 0xba, 0xc8, 0xe0, 0x07, 0xbf, 0x73, 0x22, 0x22, 0x22, 0x66, 0x62, + 0x00, 0x02, 0x62, 0x02, 0x66, 0x40, 0x00, 0x00, 0x0f, 0x00, 0x90, 0x8f, + 0x00, 0x50, 0x7f, 0x5a, 0x30, 0x3c, 0x0e, 0xf9, 0x0c, 0xf0, 0x05, 0x05, + 0xcd, 0x97, 0x46, 0x00, 0x66, 0x66, 0x66, 0x64, 0x12, 0x62, 0x24, 0x66, + 0x00, 0x62, 0x00, 0x00, 0x0f, 0x90, 0x7f, 0x8a, 0x70, 0x00, 0x0a, 0xf3, + 0x00, 0x85, 0x5f, 0x05, 0xff, 0xb3, 0xe0, 0x05, 0xcd, 0x97, 0x02, 0x66, + 0x66, 0x66, 0x66, 0x00, 0x24, 0x62, 0x66, 0x66, 0x64, 0x00, 0x00, 0x0f, + 0x00, 0x90, 0x8f, 0x57, 0x30, 0x08, 0xf9, 0x00, 0xd8, 0x07, 0x8f, 0x50, + 0x18, 0xdf, 0x30, 0x04, 0xd4, 0xa7, 0x00, 0x00, 0x00, 0x26, 0x66, 0x66, + 0x66, 0x26, 0x42, 0x00, 0x66, 0x66, 0x64, 0x00, 0x00, 0x0f, 0xa0, 0x8f, + 0x00, 0x00, 0x31, 0x88, 0x3f, 0x73, 0xc7, 0x7e, 0xc7, 0x1c, 0x50, 0x1f, + 0x50, 0x05, 0xcd, 0x97, 0x04, 0x66, 0x00, 0x66, 0x66, 0x26, 0x22, 0x66, + 0x66, 0x64, 0x00, 0x00, 0x00, 0x3d, 0x90, 0x8e, 0xaa, 0xb7, 0xd3, 0x0c, + 0x03, 0xdc, 0x80, 0x09, 0xe9, 0xca, 0xc8, 0x06, 0xc6, 0x80, 0x86, 0x02, + 0x66, 0x22, 0x66, 0x00, 0x00, 0x26, 0x00, 0x64, 0x21, 0x00, 0x00, 0x31, + 0x31, 0x10, 0x33, 0x00, 0x01, 0x10, 0x00, 0x11, 0x00, 0x00, 0x10, 0x03, + 0x70, 0x10, 0x06, 0xc6, 0x87, 0x22, 0x00, 0x46, 0x10, 0x13, 0x00, 0x46, + 0x20, 0x01, 0x3d, 0xa1, 0x07, 0x07, 0xc0, 0x77, 0x2f, 0x00, 0x00, 0x06, + 0x66, 0x66, 0x62, 0x80, 0x02, 0x0f, 0x90, 0x30, 0x01, 0x31, 0x03, 0x51, + 0x00, 0x03, 0x51, 0x53, 0x13, 0x35, 0x00, 0x33, 0x30, 0x00, 0x13, 0x33, + 0x10, 0x00, 0x03, 0x33, 0x15, 0x51, 0x00, 0x13, 0x00, 0x13, 0x13, 0x31, + 0x53, 0x01, 0x53, 0x18, 0x00, 0x00, 0x00, 0xe9, 0xd1, 0x04, 0x66, 0x66, + 0x40, 0x20, 0x9a, 0x0f, 0x81, 0xfd, 0x00, 0xe7, 0x7b, 0x00, 0xab, 0x8a, + 0xbf, 0xa9, 0x7f, 0xba, 0xe5, 0x5f, 0x00, 0x70, 0x3e, 0x39, 0xf3, 0x00, + 0xef, 0x3a, 0xf9, 0x08, 0xb8, 0x5f, 0xb0, 0x1d, 0x69, 0x5b, 0x9c, 0x93, + 0x10, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x01, 0x66, 0x40, 0x66, 0xab, + 0x0f, 0x90, 0xaf, 0xc0, 0x87, 0xf7, 0x00, 0x01, 0x50, 0x3f, 0x01, 0x5f, + 0x30, 0xef, 0x1f, 0x00, 0x30, 0x0b, 0x07, 0xfc, 0x05, 0xfe, 0x09, 0xf0, + 0x00, 0x03, 0x3c, 0xf8, 0x09, 0x70, 0x5f, 0x01, 0xee, 0x06, 0x00, 0x33, + 0x00, 0x00, 0x00, 0xe9, 0xd1, 0x26, 0x20, 0x66, 0x20, 0xa2, 0x0f, 0x90, + 0x95, 0xf9, 0x85, 0x00, 0x8f, 0xf8, 0x00, 0x5f, 0x10, 0x1f, 0x97, 0xc7, + 0x00, 0x1f, 0x30, 0x0b, 0x17, 0xaf, 0x37, 0xbe, 0x08, 0x00, 0xf8, 0xb3, + 0x08, 0x5f, 0x89, 0x10, 0x7f, 0x00, 0x03, 0x3f, 0xfc, 0x30, 0x00, 0x00, + 0x00, 0xe9, 0xd1, 0x10, 0x02, 0x44, 0x20, 0xa2, 0x0f, 0x90, 0xb0, 0x3f, + 0x00, 0xf3, 0x03, 0x8f, 0xc0, 0x5f, 0x10, 0x3f, 0x8b, 0x00, 0xe0, 0x1f, + 0x30, 0x0b, 0x18, 0x5a, 0xf5, 0x5f, 0x00, 0x08, 0xe3, 0x51, 0x1b, 0x07, + 0xfd, 0x00, 0x7f, 0x01, 0x10, 0x00, 0x7b, 0xfb, 0x00, 0x00, 0x00, 0xe9, + 0xc0, 0xd4, 0xa2, 0x0f, 0xa0, 0xc3, 0x07, 0xf7, 0x81, 0x00, 0x0c, 0xe0, + 0x5f, 0x10, 0x3f, 0x10, 0xfb, 0x0f, 0x00, 0x80, 0x5e, 0x09, 0x53, 0xf0, + 0x7f, 0x0a, 0xf0, 0x00, 0x05, 0x7b, 0x00, 0x9f, 0x10, 0x7f, 0x00, 0x87, + 0x07, 0x03, 0xfd, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa2, 0x00, 0x3d, 0x93, + 0xc5, 0x00, 0x75, 0x8b, 0xab, 0x30, 0x00, 0x7e, 0x50, 0x5e, 0x70, 0x5f, + 0x75, 0xc9, 0xb5, 0x00, 0x0c, 0x70, 0x70, 0x9d, 0x38, 0xd9, 0xa9, 0x7c, + 0x00, 0x30, 0x08, 0x30, 0x8e, 0x50, 0x5c, 0xac, 0x73, 0x1f, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xc0, 0x07, 0x07, +}; + +//***************************************************************************** +// +// This image contains a splash screen image. +// +//***************************************************************************** +const uint8_t g_pui8Image_Splash1[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x28, 0x28, 0x28, + 0x41, 0x41, 0x41, + 0x55, 0x55, 0x55, + 0x67, 0x67, 0x67, + 0x77, 0x77, 0x77, + 0x86, 0x86, 0x86, + 0x96, 0x96, 0x96, + 0xa7, 0xa7, 0xa7, + 0xb7, 0xb7, 0xb7, + 0xc6, 0xc6, 0xc6, + 0xd8, 0xd8, 0xd8, + 0xe6, 0xe6, 0xe6, + 0xf0, 0xf0, 0xf0, + 0xf9, 0xf9, 0xf9, + 0xff, 0xff, 0xff, + + 0x1f, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xdf, 0x07, 0x06, 0x76, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0x0f, 0xff, 0xff, 0x20, 0x5f, 0x07, 0x07, 0x77, 0x2f, + 0x8f, 0x07, 0xff, 0x36, 0x05, 0x07, 0x07, 0x77, 0x2f, 0x87, 0x07, 0xff, + 0x27, 0xe0, 0x9f, 0x07, 0x07, 0x77, 0xc4, 0x2f, 0x07, 0x26, 0xf6, 0x1f, + 0x03, 0xf8, 0x5f, 0xe8, 0x07, 0x07, 0x77, 0xcd, 0x27, 0xff, 0x36, 0xff, + 0x4e, 0x15, 0x03, 0x70, 0x1c, 0x07, 0x1f, 0x3b, 0xfe, 0x00, 0x42, 0x24, + 0x42, 0x22, 0x35, 0x45, 0xbf, 0xea, 0x00, 0x88, 0x99, 0xab, 0xcf, 0xff, + 0xff, 0x35, 0xff, 0x47, 0x81, 0x02, 0xb2, 0x29, 0x3d, 0x05, 0xcd, 0x97, + 0x00, 0x50, 0x3a, 0xb0, 0x1a, 0xfb, 0x02, 0x63, 0x01, 0x00, 0x11, 0x22, + 0x21, 0x21, 0x11, 0x24, 0x8f, 0x63, 0x00, 0xff, 0xf1, 0x7f, 0xff, 0xff, + 0xf9, 0x06, 0xf9, 0x70, 0x2f, 0x05, 0xcd, 0x96, 0x90, 0x41, 0x7f, 0xf1, + 0x00, 0x8f, 0xf7, 0x1f, 0xff, 0x62, 0xaf, 0xff, 0xff, 0x00, 0xee, 0xc9, + 0x53, 0x22, 0x11, 0xff, 0xf3, 0x3f, 0x8e, 0x51, 0x9f, 0xf6, 0x2f, 0x04, + 0xd4, 0xa6, 0xfa, 0x00, 0x52, 0x08, 0xf5, 0x2f, 0xf1, 0x6f, 0xf3, 0x2f, + 0x40, 0xeb, 0x15, 0xfd, 0x60, 0xaf, 0xf6, 0x1f, 0xff, 0x07, 0xff, 0x16, + 0xff, 0xf2, 0x5f, 0x75, 0x3d, 0x03, 0x00, 0xc5, 0x12, 0x63, 0x1f, 0xf9, + 0x1f, 0xf2, 0x5f, 0x10, 0xf2, 0x4f, 0x63, 0x16, 0xf5, 0x2f, 0xfa, 0x1d, + 0x03, 0xff, 0xf7, 0x1f, 0xff, 0x91, 0xdf, 0x76, 0x36, 0x00, 0xff, 0xff, + 0xb3, 0x12, 0x9f, 0xfd, 0x19, 0xfc, 0x02, 0x1b, 0xf3, 0x4f, 0xf1, 0x6f, + 0x18, 0x17, 0x18, 0x01, 0xff, 0x11, 0x7f, 0xf1, 0x5f, 0xff, 0x15, 0x7f, + 0x80, 0x37, 0xb2, 0x04, 0xcf, 0xff, 0xff, 0x34, 0xff, 0x02, 0x19, 0xf4, + 0x4f, 0xf1, 0xab, 0x1f, 0x0f, 0x71, 0x03, 0xff, 0x32, 0x32, 0x81, 0xef, + 0xf2, 0x7f, 0x3f, 0x10, 0xf4, 0x04, 0xdf, 0x0b, 0x25, 0xf5, 0x3f, 0xe1, + 0x20, 0xc6, 0x3f, 0x0f, 0xf2, 0x4f, 0x62, 0xf9, 0x06, 0x31, 0xfd, 0x12, + 0x87, 0x3e, 0xfb, 0x01, 0xcf, 0x02, 0x00, 0xd1, 0xbf, 0x53, 0xf7, 0x2f, + 0xb1, 0xe3, 0x6f, 0x80, 0x07, 0xfc, 0x0b, 0xf1, 0x14, 0x1f, 0xe0, 0x4f, + 0xc8, 0x87, 0x3e, 0x90, 0x5f, 0x03, 0xf2, 0x5f, 0x92, 0x04, 0xfa, 0x2f, + 0xa2, 0xd1, 0xaf, 0x07, 0xff, 0x43, 0x0c, 0xfb, 0x67, 0xef, 0x15, 0x8f, + 0x46, 0xfb, 0x07, 0x80, 0x04, 0xf5, 0x3f, 0xd1, 0xcd, 0x1f, 0xa2, 0xb1, + 0x50, 0xdf, 0x01, 0xee, 0x04, 0x81, 0xff, 0xff, 0xfd, 0x72, 0x1a, 0x1c, + 0x7c, 0x4b, 0xf0, 0x5f, 0x14, 0xfb, 0x02, 0x1d, 0xf2, 0x7f, 0x1d, 0x93, + 0xa1, 0x02, 0x5a, 0xa7, 0x04, 0x16, 0x01, 0x70, 0xdf, 0x14, 0x74, 0x1a, + 0x40, 0x32, 0x7e, 0x26, 0xf3, 0x4f, 0x1a, 0x94, 0x91, 0xa4, 0x0a, 0xce, + 0x03, 0xf4, 0x2f, 0x01, 0xf1, 0x3f, 0xc8, 0x0e, 0xc5, 0xf9, 0x0c, 0x7e, + 0x52, 0xf6, 0x2f, 0x11, 0x28, 0x85, 0x72, 0x0f, 0xff, 0xc1, 0xaf, 0x01, + 0x32, 0xfe, 0x08, 0x7f, 0x34, 0xf2, 0x3f, 0x06, 0xb1, 0x04, 0xfb, 0x1f, + 0x45, 0x85, 0x72, 0x0d, 0x87, 0xff, 0x2c, 0xff, 0x52, 0x03, 0x61, 0x0e, + 0x3d, 0xc1, 0xbf, 0x81, 0x7e, 0xf2, 0x8f, 0x2d, 0x84, 0x86, 0x72, 0x0d, + 0x04, 0xaa, 0xff, 0xff, 0x22, 0xef, 0x02, 0xf1, 0x4f, 0xd0, 0x06, 0x34, + 0x41, 0x8f, 0xf5, 0x3f, 0x38, 0xa3, 0x24, 0x66, 0x72, 0x12, 0xf7, 0xaf, + 0x01, 0xf9, 0x12, 0x4d, 0xcf, 0x02, 0xf8, 0x1f, 0x06, 0xc4, 0x15, 0x8c, + 0x00, 0xfe, 0xbe, 0xff, 0xfa, 0x1f, 0x55, 0xc3, 0x56, 0x01, 0x82, 0xff, + 0xf7, 0x8f, 0xff, 0xf6, 0xaf, 0x01, 0x00, 0xf3, 0x04, 0xdf, 0xff, 0xff, + 0xfb, 0xbf, 0xff, 0x60, 0x57, 0x03, 0xda, 0xb7, 0xcf, 0xff, 0xff, 0xfe, + 0x40, 0x19, 0x8c, 0xfc, 0x6e, 0xff, 0xff, 0x1b, 0xa2, 0x06, 0xd4, 0x46, + 0x82, 0xff, 0xfb, 0x51, 0x02, 0xf2, 0x00, 0x33, 0xbf, 0xff, 0xff, 0x51, + 0x5c, 0xff, 0x93, 0xc0, 0x8c, 0x59, 0x60, 0x2f, 0xff, 0xff, 0xfc, 0x1a, + 0x90, 0x12, 0xfd, 0x6d, 0x5a, 0x36, 0xf2, 0xb4, 0x37, 0x40, 0xa1, 0x17, + 0xf3, 0x44, 0x9f, 0xff, 0xff, 0x6a, 0x08, 0xff, 0xff, 0xf2, 0xbf, 0x6e, + 0xb1, 0x05, 0xff, 0x00, 0xff, 0xfc, 0x1b, 0xff, 0xff, 0x76, 0xff, 0xfd, + 0x41, 0x9e, 0x62, 0x73, 0xf2, 0x95, 0x36, 0xb1, 0x1e, 0x00, 0xff, 0xf7, + 0x13, 0x5f, 0xff, 0xff, 0xf4, 0x0a, 0x10, 0xff, 0xf3, 0x8f, 0x6e, 0xf3, + 0x22, 0xbf, 0xff, 0x04, 0xfc, 0x1b, 0xff, 0xff, 0xaa, 0x7d, 0xc2, 0xf3, + 0x00, 0x76, 0x35, 0xd1, 0xdf, 0xff, 0xfa, 0xcf, 0xff, 0x00, 0xff, 0xf8, + 0xbf, 0xff, 0xfa, 0x11, 0x0e, 0xff, 0x02, 0xff, 0xf2, 0x03, 0x9f, 0xf3, + 0x6f, 0x0d, 0xff, 0x02, 0xf6, 0x10, 0x6f, 0xff, 0xfd, 0x19, 0x96, 0xc5, + 0x00, 0xef, 0xf1, 0xb6, 0x57, 0x35, 0xf1, 0xbf, 0xff, 0x00, 0xf6, 0xaf, + 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xfc, 0x00, 0x00, 0x02, 0xef, 0xff, 0x78, + 0x91, 0x7f, 0xf5, 0x40, 0x4f, 0x04, 0xff, 0xff, 0xfb, 0x15, 0x2f, 0xff, + 0x20, 0xff, 0x16, 0x91, 0xfc, 0xef, 0xff, 0xfc, 0xbf, 0x00, 0xc8, 0xff, + 0xf3, 0x79, 0x56, 0x34, 0xf1, 0x9f, 0x80, 0x16, 0xfd, 0x13, 0x10, 0x08, + 0xff, 0x72, 0x47, 0x10, 0xff, 0xf8, 0x3f, 0x76, 0xff, 0x26, 0x1b, 0xff, + 0x20, 0xff, 0x43, 0x01, 0xa4, 0xff, 0xff, 0xf8, 0x6f, 0x00, 0xff, 0xff, + 0xf5, 0x4c, 0x45, 0x44, 0xf2, 0x7f, 0x80, 0x14, 0xda, 0xef, 0xfb, 0x2f, + 0x60, 0x00, 0x2d, 0x06, 0xfd, 0xcf, 0xff, 0xfb, 0x3e, 0x74, 0x41, 0x15, + 0x00, 0x17, 0xff, 0xff, 0x91, 0xff, 0xfb, 0xbf, 0xdd, 0x10, 0xff, 0xff, + 0xfe, 0x59, 0xf8, 0x2c, 0x55, 0x43, 0x20, 0xb6, 0x4f, 0x12, 0xfb, 0xdf, + 0xd8, 0xef, 0xf9, 0x05, 0x3b, 0x1b, 0x23, 0x50, 0x9f, 0x49, 0x39, 0x72, + 0x80, 0x52, 0xff, 0x17, 0x15, 0xff, 0xff, 0xf2, 0x4f, 0x20, 0xf7, 0x8f, + 0x7c, 0xc9, 0xfb, 0x2b, 0x43, 0x55, 0x24, 0x89, 0x2f, 0x12, 0xf6, 0xbf, + 0xe1, 0x10, 0x6f, 0x16, 0x35, 0xf8, 0x09, 0x29, 0x44, 0x0c, 0x41, 0x25, + 0x04, 0x33, 0xff, 0xff, 0xfb, 0x0a, 0x8e, 0xa5, 0xff, 0x04, 0x2a, 0x43, + 0x66, 0x4f, 0x1b, 0x16, 0xf2, 0x07, 0x00, 0xf8, 0x0f, 0xff, 0x80, 0xaf, + 0xff, 0xff, 0xa1, 0x8c, 0x76, 0xff, 0x29, 0x61, 0x19, 0x69, 0xb4, 0xff, + 0x00, 0xf7, 0x6f, 0xf8, 0x8f, 0xff, 0xff, 0x44, 0x43, 0x10, 0x26, 0x26, + 0x24, 0x16, 0x10, 0xff, 0xb0, 0x8f, 0x01, 0xff, 0xf6, 0x0f, 0xff, 0xff, + 0xf3, 0x5f, 0x6e, 0x00, 0x50, 0x41, 0xbf, 0xff, 0xff, 0xf8, 0x0a, 0xff, + 0x00, 0xc8, 0xff, 0xfb, 0xbf, 0xf8, 0x8f, 0xff, 0xff, 0x01, 0x23, 0xdd, + 0xab, 0xb7, 0xe1, 0x07, 0xcf, 0x0b, 0x08, 0xb0, 0x26, 0x4b, 0x04, 0xb9, + 0x23, 0xff, 0xff, 0x31, 0xfb, 0x0b, 0x7b, 0x51, 0x81, 0xf1, 0x1f, 0x21, + 0x20, 0xc0, 0x6f, 0x85, 0xf1, 0x2f, 0xff, 0xff, 0xd8, 0x00, 0x23, 0x84, + 0x22, 0x34, 0x6a, 0xcb, 0xb9, 0x63, 0x0a, 0x16, 0xff, 0x40, 0xaf, 0x19, + 0xb0, 0xd9, 0x51, 0x84, 0x05, 0xff, 0xf2, 0x26, 0x12, 0x69, 0x81, 0x01, + 0x80, 0x3a, 0xff, 0xff, 0xf9, 0x00, 0x46, 0x44, 0x33, 0x00, 0x33, 0x7f, + 0xff, 0xd8, 0x53, 0x41, 0x01, 0x00, 0x04, 0x00, 0xbf, 0xff, 0xf5, 0x3f, + 0x19, 0xf5, 0x1f, 0x0c, 0xff, 0xff, 0xf1, 0x5f, 0x03, 0x9a, 0xf2, 0x03, + 0x00, 0x89, 0x51, 0x0f, 0xa0, 0x00, 0x4b, 0xff, 0xff, 0x01, 0xfc, 0x94, + 0x00, 0x9f, 0x97, 0x78, 0x9c, 0x33, 0x00, 0xf2, 0x35, 0xc5, 0x25, 0x0c, + 0xff, 0xff, 0x13, 0x83, 0x9a, 0x11, 0xff, 0xff, 0xfa, 0x1a, 0x53, 0x29, + 0x00, 0x22, 0xf4, 0x4b, 0x20, 0xa9, 0x3c, 0x40, 0x00, 0x02, 0x52, 0x01, + 0x22, 0x10, 0x00, 0x03, 0x56, 0xff, 0x00, 0x33, 0xcb, 0xf8, 0x1f, 0x41, + 0xff, 0xff, 0xe1, 0x41, 0xaf, 0x71, 0xf1, 0x1c, 0xff, 0xff, 0x44, 0x36, + 0x00, 0xf2, 0x10, 0x8f, 0x63, 0xf3, 0x00, 0x02, 0x08, 0x01, 0xff, 0x81, + 0x00, 0x00, 0x02, 0xc0, 0x4f, 0x4d, 0x00, 0xfa, 0x0b, 0x8c, 0xf6, 0x2f, + 0xf1, 0x6f, 0xff, 0x21, 0xf5, 0x3f, 0x7a, 0x40, 0x36, 0xab, 0x14, 0x3d, + 0x00, 0xff, 0xff, 0x93, 0x00, 0x00, 0x00, 0x02, 0x8b, 0x00, 0x2c, 0xfe, + 0xd6, 0x03, 0x90, 0x1c, 0xa9, 0x12, 0x20, 0x88, 0xdf, 0x3c, 0x24, 0xff, + 0xf6, 0x1f, 0xf3, 0x08, 0x0b, 0xff, 0xfa, 0x1f, 0x8a, 0xfd, 0x74, 0x33, + 0x60, 0x5f, 0x4c, 0x1a, 0xc7, 0x44, 0x59, 0xef, 0xf3, 0x00, 0x3f, 0xf4, + 0x04, 0x9f, 0xf0, 0x2b, 0xef, 0xc2, 0x10, 0x32, 0x13, 0xcf, 0x33, 0x61, + 0xff, 0xff, 0x34, 0x07, 0xdf, 0x24, 0xff, 0x65, 0x4a, 0x93, 0x6b, 0xb7, + 0x00, 0xff, 0xff, 0xfb, 0x31, 0xdf, 0xf2, 0x4f, 0xff, 0x01, 0xfa, 0x20, + 0x8f, 0xff, 0xfc, 0x20, 0x2f, 0x03, 0x00, 0xd0, 0x7f, 0xed, 0x74, 0x1a, + 0x83, 0x54, 0x70, 0x70, 0x3b, 0x03, 0x6b, 0xb7, 0xff, 0xfa, 0x13, 0x2a, + 0x00, 0xff, 0xf1, 0x9f, 0xff, 0xff, 0xc3, 0x1a, 0xff, 0x10, 0x90, 0x12, + 0x06, 0x6c, 0x0b, 0x44, 0x23, 0x30, 0x0e, 0x36, 0x22, 0x50, 0x0c, 0x93, + 0x6b, 0xb7, 0xff, 0x04, 0xf4, 0x0b, 0xff, 0xff, 0x51, 0x3a, 0x80, 0x6f, + 0x10, 0xb2, 0x02, 0xbb, 0x04, 0x61, 0x80, 0x11, 0xae, 0x0e, 0x70, 0x21, + 0x15, 0x8f, 0x94, 0x64, 0xa5, 0xfc, 0x04, 0x10, 0x12, 0xb5, 0xa9, 0x0a, + 0x3a, 0xfb, 0x22, 0x20, 0x35, 0x59, 0x05, 0xf5, 0x03, 0x53, 0xef, 0xa1, + 0x38, 0x91, 0x5f, 0x95, 0x5d, 0x24, 0xfa, 0x12, 0x00, 0x12, 0x10, 0x20, + 0x9f, 0x33, 0xf8, 0x7f, 0x06, 0xfe, 0x78, 0x9d, 0xda, 0x96, 0x56, 0x15, + 0x66, 0x82, 0x3c, 0xff, 0x37, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, + 0xc0, 0x07, 0x07, +}; + +const uint8_t g_pui8Image_Splash2[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x28, 0x28, 0x28, + 0x42, 0x42, 0x42, + 0x55, 0x55, 0x55, + 0x65, 0x65, 0x65, + 0x78, 0x78, 0x78, + 0x86, 0x86, 0x86, + 0x96, 0x96, 0x96, + 0xa6, 0xa6, 0xa6, + 0xbb, 0xbb, 0xbb, + 0xcf, 0xcf, 0xcf, + 0xe0, 0xe0, 0xe0, + 0xea, 0xea, 0xea, + 0xf2, 0xf2, 0xf2, + 0xf9, 0xf9, 0xf9, + 0xff, 0xff, 0xff, + + 0x1f, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0xff, 0x1f, 0xff, 0xa5, 0xdf, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0x17, 0xff, 0x60, 0x8f, 0x03, 0xbb, 0x07, 0x07, 0x77, 0xcb, 0x2f, 0x02, + 0x52, 0x27, 0x03, 0x21, 0x07, 0x07, 0xe2, 0x77, 0x2f, 0x02, 0x54, 0xf1, + 0x7f, 0x01, 0xf8, 0x3e, 0x03, 0xef, 0x07, 0x07, 0x77, 0x2f, 0x01, 0x62, + 0x23, 0xfa, 0x1b, 0x01, 0xe1, 0x85, 0xaf, 0x07, 0x07, 0x80, 0x75, 0xc6, + 0x67, 0xd7, 0x34, 0x77, 0x69, 0xff, 0x08, 0xff, 0xa9, 0xaa, 0xcf, 0x01, + 0x72, 0xff, 0x62, 0x8e, 0x01, 0x24, 0xf3, 0x9f, 0x07, 0xbf, 0x74, 0xa4, + 0x00, 0x14, 0x63, 0x03, 0x88, 0x14, 0x64, 0x47, 0x41, 0x00, 0x23, 0x33, + 0x22, 0x57, 0x9b, 0xff, 0x92, 0xff, 0x01, 0xf2, 0x7f, 0xff, 0xf8, 0x1f, + 0xf3, 0x9f, 0x06, 0xc0, 0xc6, 0x85, 0xb1, 0x21, 0x9f, 0xfd, 0xae, 0xf6, + 0x00, 0x3f, 0xff, 0x30, 0x49, 0xff, 0xff, 0xf9, 0x43, 0x00, 0x33, 0x34, + 0x41, 0xdf, 0xf8, 0x3f, 0xff, 0xf2, 0x1c, 0x7f, 0xd2, 0xbf, 0x05, 0xcd, + 0x96, 0xb8, 0x05, 0x00, 0xf5, 0x5f, 0xf7, 0xbf, 0xf3, 0x5f, 0xf8, 0x1e, + 0x80, 0x85, 0x51, 0x8f, 0xfc, 0x2c, 0xff, 0xb2, 0xef, 0x70, 0x82, 0x05, + 0xcd, 0x95, 0xf9, 0x43, 0x33, 0x7f, 0x00, 0xf7, 0x2f, 0xf1, 0x8f, 0xf2, + 0x8f, 0xf3, 0x8f, 0x80, 0x05, 0xf8, 0x1f, 0xff, 0x29, 0xff, 0x83, 0xff, + 0x70, 0x34, 0x8d, 0x55, 0x1c, 0xf7, 0x23, 0x6a, 0xfd, 0x00, 0x6f, 0xff, + 0x2a, 0xf2, 0x6f, 0xf2, 0x9f, 0xba, 0x80, 0x07, 0x26, 0xff, 0x31, 0xbf, + 0x73, 0xfb, 0x1b, 0xc2, 0x87, 0x3f, 0xff, 0xfb, 0x21, 0x9f, 0x0a, 0x35, + 0x04, 0xf3, 0x4f, 0xf2, 0xaf, 0x2a, 0x07, 0xa1, 0xef, 0x06, 0x61, 0x2a, + 0x73, 0xf3, 0x3f, 0x87, 0x3f, 0xff, 0x20, 0x70, 0x6f, 0x01, 0x53, 0xff, + 0x82, 0xf7, 0x2f, 0x20, 0xf3, 0xd9, 0x07, 0xff, 0xf3, 0x4f, 0x84, 0xf6, + 0x19, 0x08, 0xf1, 0xaf, 0x87, 0x3f, 0xc3, 0x1a, 0x02, 0x00, 0xa1, 0xef, + 0xb1, 0xfa, 0x1f, 0xf2, 0xf5, 0x3f, 0x81, 0x07, 0xfa, 0x2e, 0xf3, 0x57, + 0x1f, 0x73, 0x8f, 0x90, 0x47, 0xfa, 0x05, 0x03, 0xf3, 0x8f, 0xf2, 0x9f, + 0x08, 0x1d, 0xe2, 0xf3, 0x5f, 0x07, 0xff, 0x45, 0xfe, 0x19, 0x78, 0xcf, + 0x46, 0x8f, 0x47, 0x90, 0x9f, 0x03, 0x00, 0xf6, 0x3f, 0xf4, 0x5f, 0x2a, + 0xd3, 0xf3, 0x8f, 0x15, 0xff, 0xff, 0x99, 0x05, 0x92, 0x01, 0x65, 0xa5, + 0xc8, 0x6d, 0x31, 0xfa, 0x09, 0xc5, 0x2d, 0xf7, 0x3f, 0x01, 0x38, 0xd2, + 0xf2, 0x9f, 0xff, 0xff, 0x89, 0x05, 0x4c, 0x52, 0x01, 0xc2, 0xbf, 0x9d, + 0x65, 0xff, 0xff, 0x20, 0xf1, 0x7f, 0x0d, 0x28, 0xfa, 0x2f, 0x47, 0xd3, + 0x42, 0xe2, 0x06, 0xba, 0xff, 0xfa, 0x1c, 0x01, 0xf3, 0x62, 0x3f, 0x15, + 0x4d, 0xff, 0xff, 0x62, 0x7e, 0x64, 0x00, 0xfe, 0x1f, 0x56, 0xd3, 0xd2, + 0xcf, 0xfa, 0x8f, 0x84, 0x03, 0xa7, 0xff, 0xf2, 0x5f, 0x01, 0xfe, 0x19, + 0xc2, 0x0e, 0x53, 0xba, 0xff, 0xff, 0x1a, 0x7e, 0xa2, 0x00, 0xff, 0x2a, + 0x75, 0xd4, 0xc2, 0xcf, 0xfa, 0x8f, 0xac, 0x05, 0x71, 0x3b, 0x52, 0x0e, + 0x53, 0x60, 0xaf, 0x20, 0xf8, 0x3f, 0x7e, 0xf3, 0x7f, 0x47, 0x94, 0xc4, + 0x00, 0xb2, 0xef, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0x97, 0x93, 0x01, 0x30, + 0x7f, 0x32, 0xf2, 0x9f, 0x06, 0x92, 0x08, 0x80, 0x3f, 0xf5, 0x6f, 0x86, + 0xf5, 0x3f, 0x75, 0x10, 0xb2, 0xb4, 0xb2, 0x11, 0xfc, 0x7e, 0xff, 0xcb, + 0x04, 0xff, 0xa9, 0xf8, 0x37, 0x9f, 0x32, 0xf7, 0x1f, 0xc2, 0x06, 0x92, + 0xa0, 0x2f, 0xf3, 0xaf, 0x86, 0xfa, 0x04, 0x2f, 0x94, 0xd3, 0x84, 0xb3, + 0x16, 0xa8, 0xf4, 0x2c, 0x6f, 0xbf, 0x33, 0x18, 0x06, 0x32, 0x91, 0x2e, + 0x40, 0x92, 0x8f, 0xff, 0x7e, 0xb3, 0xd3, 0x66, 0xa3, 0x80, 0x17, 0xf3, + 0xa5, 0x5f, 0xff, 0xff, 0xf8, 0x49, 0x31, 0xff, 0x82, 0x07, 0x29, 0x70, + 0x1f, 0x54, 0x8f, 0x02, 0xff, 0x95, 0xf3, 0xc4, 0x46, 0xb3, 0x17, 0xf4, + 0x00, 0x77, 0x4f, 0xff, 0xff, 0x22, 0x99, 0xff, 0xf2, 0x41, 0x9f, 0x6f, + 0xff, 0xff, 0x41, 0x1f, 0x46, 0x05, 0x00, 0xf7, 0xbf, 0xff, 0xa2, 0xf3, + 0x95, 0x36, 0xf2, 0x40, 0xcf, 0x12, 0xa9, 0xff, 0xff, 0xba, 0xf7, 0x02, + 0x00, 0x4f, 0xff, 0xfb, 0x49, 0x7e, 0xff, 0xf3, 0x6f, 0xc2, 0x03, 0xdb, + 0xff, 0x12, 0x4f, 0x36, 0x01, 0xf9, 0x00, 0xaf, 0xfb, 0x9f, 0xf8, 0xcc, + 0xbf, 0xf2, 0xb5, 0x00, 0x86, 0x45, 0xf3, 0xaf, 0xff, 0xff, 0x8b, 0xff, + 0x00, 0x87, 0xff, 0xff, 0xa7, 0xf9, 0x00, 0x1f, 0xff, 0x00, 0xff, 0xf2, + 0x09, 0xff, 0xf5, 0x3f, 0xff, 0xff, 0x61, 0xff, 0xe9, 0xd2, 0xf9, 0x21, + 0x3f, 0x36, 0xca, 0x00, 0xaf, 0xfb, 0x7f, 0xff, 0xf8, 0x8f, 0xf4, 0x86, + 0x01, 0x88, 0x25, 0xf3, 0x8f, 0xff, 0xff, 0x9b, 0x03, 0x00, 0xfb, 0x00, + 0x04, 0xff, 0xff, 0xfa, 0xa3, 0x6f, 0x30, 0xf8, 0x2f, 0x8b, 0x63, 0xf7, + 0x12, 0x5f, 0x44, 0x80, 0x94, 0xfd, 0xdf, 0xac, 0xff, 0xf6, 0x77, 0x6a, + 0x10, 0x34, 0xf5, 0x6f, 0x16, 0xfd, 0x46, 0x00, 0x1a, 0x02, 0xff, 0x59, + 0xb0, 0xaf, 0xfc, 0x2c, 0x76, 0xff, 0x00, 0xff, 0xf5, 0x10, 0x9f, 0x63, + 0xff, 0xff, 0xd9, 0x00, 0xff, 0xfb, 0xaf, 0xf7, 0x8f, 0x59, 0xff, 0xf9, + 0x00, 0x46, 0x5b, 0x34, 0xd8, 0x5f, 0xff, 0xf8, 0xaf, 0x10, 0xff, 0xff, + 0xbb, 0x01, 0x3d, 0x90, 0x00, 0x4f, 0x07, 0x82, 0x29, 0xff, 0xff, 0x28, + 0xa1, 0x89, 0xd2, 0x00, 0xf5, 0x21, 0x9f, 0xc2, 0xbf, 0xff, 0xd9, 0xff, + 0x00, 0xfa, 0x8f, 0xfe, 0xdf, 0xff, 0xff, 0xfb, 0x46, 0x02, 0x5b, 0x44, + 0x9c, 0x6f, 0xff, 0xfb, 0xa9, 0x98, 0x00, 0xf9, 0x9f, 0xff, 0x2c, 0x42, + 0x32, 0x21, 0xff, 0x0c, 0xff, 0xff, 0xff, 0x35, 0xda, 0xba, 0xff, 0xff, + 0x05, 0xf7, 0x00, 0x7f, 0xf4, 0x4f, 0xbb, 0xaf, 0x32, 0x04, 0x44, 0x5b, + 0x64, 0x5f, 0x3f, 0x14, 0xf8, 0x9f, 0x02, 0xfa, 0x44, 0x1f, 0x73, 0xf2, + 0x1f, 0x19, 0x53, 0xc0, 0x74, 0x42, 0xf7, 0x35, 0x3f, 0xfc, 0x19, 0xff, + 0x00, 0xfe, 0xef, 0xff, 0xfc, 0xcf, 0x99, 0xfb, 0xaf, 0x00, 0xff, 0x34, + 0x8f, 0xf7, 0x2f, 0x27, 0xff, 0xfc, 0x10, 0x8e, 0xff, 0xab, 0x01, 0xf3, + 0x03, 0xbf, 0x17, 0x2e, 0xff, 0x12, 0xb9, 0x91, 0x99, 0x81, 0xd2, 0xfa, + 0x00, 0x22, 0x1f, 0xff, 0x70, 0xcf, 0xf8, 0x9f, 0xff, 0x00, 0xbc, 0xee, + 0xbb, 0xf9, 0x8f, 0xff, 0x88, 0xa7, 0x00, 0x7b, 0x18, 0x72, 0xff, 0xfd, + 0xaf, 0xff, 0x89, 0x80, 0x01, 0x90, 0x13, 0xe6, 0x1f, 0xff, 0xf1, 0x3f, + 0x0e, 0xff, 0xff, 0xf2, 0x9f, 0x91, 0x79, 0x61, 0xfc, 0x00, 0x04, 0x19, + 0xff, 0xf5, 0x0c, 0xfe, 0xef, 0xff, 0x00, 0x9a, 0x99, 0xf9, 0xdf, 0xff, + 0xff, 0x62, 0x45, 0x08, 0x46, 0xa5, 0xc3, 0x0c, 0x14, 0xf5, 0x00, 0x06, + 0x05, 0x50, 0xbf, 0xff, 0xfd, 0x09, 0xb1, 0x3f, 0x74, 0x81, 0x42, 0x38, + 0x90, 0xdf, 0xff, 0x71, 0xef, 0x02, 0x00, 0xe7, 0xbf, 0xff, 0xf7, 0x0c, + 0xff, 0xff, 0xf9, 0x00, 0x23, 0x61, 0x59, 0xbb, 0xce, 0xcd, 0xfe, 0x74, + 0x0a, 0x20, 0x00, 0x00, 0x2f, 0x41, 0x81, 0x19, 0x17, 0xc0, 0x02, 0xe2, + 0xff, 0xff, 0x90, 0x55, 0x0b, 0xff, 0x20, 0x90, 0x07, 0x85, 0x50, 0x35, + 0x43, 0x32, 0x12, 0x00, 0x8f, 0xfd, 0x64, 0x65, 0x54, 0x45, 0x34, 0x34, + 0x00, 0x94, 0x03, 0x69, 0x13, 0x7c, 0xff, 0xff, 0xf2, 0x06, 0x2f, 0xff, + 0xff, 0xa1, 0xcf, 0x04, 0xd1, 0xf1, 0x00, 0x0f, 0x80, 0x51, 0x45, 0x00, + 0x17, 0xbe, 0xef, 0x00, 0xff, 0xfd, 0xa7, 0x61, 0x0c, 0xf8, 0x66, 0x78, + 0x40, 0xdf, 0x2a, 0xfc, 0xff, 0x17, 0xff, 0xf2, 0x3c, 0x04, 0x4a, 0xb5, + 0x32, 0x4a, 0xff, 0xb1, 0xff, 0xf4, 0x60, 0x2f, 0x5a, 0x3a, 0xff, 0xfc, + 0x00, 0x34, 0xc2, 0x00, 0x67, 0x00, 0x00, 0x10, 0x11, 0x22, 0x33, 0x24, + 0x40, 0x23, 0x57, 0xff, 0xff, 0x26, 0xff, 0xf2, 0x01, 0x00, 0xb8, 0xcf, + 0xff, 0x10, 0x9f, 0xff, 0x90, 0xaf, 0x10, 0xff, 0xff, 0x19, 0x37, 0xff, + 0xb0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x3f, 0x67, + 0x80, 0x1a, 0x43, 0xff, 0xf2, 0x75, 0x15, 0xdf, 0xb8, 0x06, 0x70, 0x0a, + 0xff, 0xf8, 0x08, 0x92, 0x1f, 0xfd, 0x00, 0x52, 0x11, 0x41, 0x00, 0x02, + 0x33, 0xe8, 0xab, 0x40, 0x06, 0x67, 0xff, 0xff, 0xfe, 0xff, 0x71, 0xff, + 0x00, 0xf3, 0x2f, 0xa2, 0x23, 0xa4, 0x31, 0x0b, 0xff, 0x06, 0xff, 0x91, + 0x26, 0xa5, 0x19, 0x27, 0x02, 0xf1, 0x01, 0x04, 0x24, 0x91, 0xff, 0xff, + 0xa0, 0x8f, 0x5f, 0x00, 0xff, 0xfe, 0xff, 0xb1, 0xaf, 0xff, 0x12, 0xcf, + 0x08, 0xf6, 0x13, 0x00, 0x7f, 0x01, 0x93, 0x23, 0xbf, 0xc0, 0x2f, 0x02, + 0x60, 0xbf, 0x38, 0xf2, 0x0d, 0xff, 0x30, 0xf9, 0x09, 0x5f, 0x11, 0xf2, + 0x3f, 0xff, 0xe2, 0x0c, 0x12, 0x9f, 0xb3, 0x5f, 0x67, 0x1f, 0xff, 0xff, + 0x00, 0x14, 0xf8, 0x3f, 0xff, 0x50, 0x8f, 0xff, 0x61, 0x20, 0x11, 0x2a, + 0x17, 0xff, 0xfb, 0x1a, 0xfa, 0x9c, 0x38, 0x44, 0x07, 0x87, 0x3f, 0x01, + 0xf9, 0x1f, 0xf1, 0x00, 0x2f, 0xff, 0xfa, 0x06, 0xff, 0xfc, 0x30, 0x0a, + 0x80, 0x07, 0xff, 0xff, 0x50, 0xae, 0x25, 0x30, 0x19, 0xe0, 0x87, 0x3f, + 0x01, 0xfa, 0x0b, 0xa2, 0x10, 0x9f, 0x02, 0xff, 0x90, 0x9f, 0xf8, 0x12, + 0x05, 0x07, 0xff, 0x03, 0xff, 0xf8, 0x33, 0x30, 0x56, 0xcf, 0x87, 0x3f, + 0x80, 0x02, 0x06, 0xf2, 0x40, 0x1f, 0xff, 0xf7, 0x06, 0x19, 0x3b, 0x90, + 0x2e, 0x07, 0x01, 0xfc, 0x89, 0x97, 0xc0, 0x4f, 0x04, 0x70, 0x96, 0x10, + 0x2f, 0xff, 0xff, 0x0f, 0x60, 0x01, 0x71, 0x5f, 0x07, 0x07, 0x77, 0x2f, + 0x00, 0xff, 0xff, 0xf9, 0x36, 0x42, 0xaf, 0xff, 0xff, 0x1e, 0xfa, 0xce, + 0x89, 0x07, 0x07, 0x77, 0x2f, +}; + +const uint8_t g_pui8Image_Splash3[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x2a, 0x2a, 0x2a, + 0x44, 0x44, 0x44, + 0x56, 0x56, 0x56, + 0x67, 0x67, 0x67, + 0x76, 0x76, 0x76, + 0x87, 0x87, 0x87, + 0x97, 0x97, 0x97, + 0xa5, 0xa5, 0xa5, + 0xb7, 0xb7, 0xb7, + 0xc8, 0xc8, 0xc8, + 0xd6, 0xd6, 0xd6, + 0xe2, 0xe2, 0xe2, + 0xec, 0xec, 0xec, + 0xf7, 0xf7, 0xf7, + 0xff, 0xff, 0xff, + + 0x1f, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x02, 0x3e, 0xfb, 0x4e, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xff, + 0x3e, 0xf9, 0x05, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xff, 0x1f, 0xf5, 0x11, + 0xbf, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x1f, 0xf1, 0x84, 0x3f, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0x1e, 0xf1, 0xba, 0x1e, 0x07, 0x07, 0x77, 0x29, 0xdc, + 0x08, 0xd9, 0x77, 0xca, 0x8c, 0x07, 0xff, 0xc1, 0xdf, 0x4e, 0x18, 0x02, + 0xfe, 0xcf, 0x6f, 0x27, 0x03, 0x61, 0x00, 0x31, 0x03, 0x34, 0x01, 0x32, + 0x27, 0xf9, 0x33, 0x08, 0x33, 0x33, 0x12, 0x4b, 0x01, 0xa1, 0xff, 0x24, + 0x8e, 0x01, 0xfa, 0x41, 0x1f, 0x05, 0xcd, 0x95, 0xfe, 0x00, 0x61, 0x08, + 0xf8, 0x1f, 0xff, 0x08, 0xff, 0xa1, 0x00, 0x01, 0x59, 0xab, 0x96, 0x65, + 0x20, 0x13, 0x7f, 0x00, 0xff, 0x92, 0xff, 0x51, 0xff, 0xff, 0xfb, 0x11, + 0x38, 0x72, 0x3f, 0x03, 0xdb, 0xb7, 0xfd, 0x75, 0x31, 0x00, 0x27, 0x9f, + 0xfc, 0x8f, 0xfa, 0x2d, 0xff, 0xa1, 0x40, 0x5f, 0x0a, 0xfe, 0x94, 0x11, + 0x3e, 0xc2, 0xef, 0x01, 0x61, 0xff, 0xff, 0x80, 0x5f, 0xe1, 0xaf, 0x7a, + 0xc0, 0x5a, 0xc6, 0xff, 0xff, 0xe6, 0x22, 0x25, 0x14, 0x00, 0xfe, 0xcf, + 0xf9, 0x6f, 0xfe, 0xef, 0xfa, 0x09, 0x80, 0x15, 0xf9, 0x20, 0x32, 0xdf, + 0x51, 0xff, 0xf8, 0x1c, 0x09, 0xff, 0x22, 0x7d, 0x45, 0x0a, 0xc3, 0x02, + 0x00, 0x7d, 0xff, 0xbc, 0xfe, 0x18, 0xf9, 0x1f, 0xf6, 0x10, 0x8f, 0xfb, + 0xaf, 0x0e, 0xfc, 0x10, 0xcf, 0x33, 0x06, 0xff, 0xa0, 0x9f, 0xf7, 0x0e, + 0x7e, 0x3e, 0xff, 0x00, 0xf4, 0x02, 0xbf, 0xff, 0xfe, 0x1a, 0xff, 0x32, + 0x08, 0xfb, 0x1b, 0xf3, 0x6f, 0x1f, 0xff, 0xff, 0xf2, 0x01, 0x7f, 0x24, + 0xff, 0x14, 0xff, 0x90, 0x9f, 0x6f, 0x88, 0x25, 0xfa, 0x01, 0xcf, 0x01, + 0x41, 0xff, 0x81, 0x08, 0xff, 0x17, 0xf2, 0x7f, 0x1f, 0xff, 0xff, 0xf4, + 0x03, 0x2f, 0x30, 0xda, 0x0f, 0xf6, 0x07, 0x77, 0x2e, 0x20, 0x60, 0x7f, + 0x02, 0xe1, 0x8f, 0xd1, 0xbf, 0x34, 0x20, 0xf1, 0x8f, 0x17, 0xff, 0xff, + 0xfb, 0x1f, 0x60, 0x0c, 0x00, 0x9f, 0x10, 0xaf, 0x77, 0x2d, 0xf5, 0x0b, + 0x81, 0x03, 0xf3, 0x2f, 0xf2, 0x6f, 0x44, 0xf1, 0x17, 0x83, 0x02, 0x34, + 0xf5, 0x37, 0xf1, 0x2f, 0x7f, 0x36, 0x20, 0x50, 0xcf, 0x03, 0xfa, 0x1c, + 0xf4, 0x3f, 0x53, 0x02, 0xf1, 0xbf, 0x39, 0xff, 0xfb, 0x8f, 0x05, 0xfe, + 0x0e, 0x05, 0xff, 0xff, 0x51, 0xa5, 0x6d, 0x31, 0xfa, 0x40, 0x0a, 0x0d, + 0x24, 0xf8, 0x1f, 0x73, 0xd1, 0xed, 0x08, 0x1c, 0xff, 0xfb, 0x7f, 0x05, + 0xf1, 0x1f, 0xff, 0x1d, 0xff, 0xb0, 0xaf, 0x15, 0x65, 0x51, 0x5f, 0x0d, + 0x01, 0x71, 0xfc, 0x1e, 0xa2, 0xb1, 0xf8, 0x1f, 0x05, 0x0b, 0xee, 0xff, + 0xff, 0x21, 0x01, 0xf4, 0x86, 0x4d, 0x10, 0xff, 0xff, 0x61, 0x7e, 0xe1, + 0x9f, 0x19, 0xe1, 0x04, 0x92, 0xf6, 0x2f, 0xe8, 0xef, 0x02, 0xfe, 0x4b, + 0x16, 0xff, 0xf8, 0x0d, 0x02, 0x07, 0x0e, 0xc6, 0x18, 0xa0, 0x0a, 0xb6, + 0x29, 0xf3, 0x4f, 0x26, 0xf2, 0x71, 0x00, 0xf4, 0x3f, 0xd8, 0xef, 0xff, + 0xf5, 0x9f, 0xff, 0x04, 0xfe, 0xcf, 0xff, 0xf1, 0x7f, 0x02, 0x90, 0xef, + 0xe4, 0x02, 0xb2, 0xc4, 0xf9, 0x1e, 0x52, 0xdc, 0xff, 0x00, 0xfc, 0xaf, + 0xf8, 0x2f, 0x53, 0xf2, 0x52, 0xf4, 0x4a, 0x5f, 0x09, 0xfa, 0xdf, 0x02, + 0x81, 0x03, 0xf1, 0x72, 0x4f, 0xcb, 0xa3, 0x52, 0xf4, 0x2f, 0x84, 0xf9, + 0x00, 0x7f, 0xfe, 0x1c, 0x92, 0xf2, 0x52, 0xf3, 0x6f, 0xa6, 0x0f, 0x22, + 0x03, 0xf8, 0x1e, 0x7f, 0x33, 0xf1, 0x10, 0x7f, 0xff, 0x69, 0x75, 0x25, + 0xe2, 0xf3, 0x22, 0x27, 0xf3, 0x7f, 0x0f, 0x16, 0xaf, 0xcc, 0x7f, 0x33, + 0x08, 0xa1, 0xdf, 0xff, 0xbd, 0x75, 0x62, 0xf2, 0xf4, 0x00, 0x13, 0xf2, + 0x7f, 0xff, 0xfc, 0xdf, 0xff, 0xfa, 0x00, 0xaf, 0xff, 0xff, 0xfc, 0x29, + 0x4f, 0xff, 0xff, 0x0d, 0xfe, 0xbe, 0xff, 0x51, 0x15, 0xcd, 0x71, 0x8a, + 0x40, 0xa5, 0x63, 0xb1, 0xe2, 0xb6, 0x13, 0xd2, 0x8f, 0x00, 0xff, 0xf7, + 0x9f, 0xff, 0xf9, 0x8f, 0xfe, 0x6c, 0x00, 0xfa, 0x2a, 0x3f, 0xff, 0xff, + 0x91, 0x14, 0xff, 0x3a, 0xa1, 0xcf, 0x1b, 0xdb, 0xb1, 0x61, 0x92, 0xdb, + 0x00, 0xff, 0xff, 0xd6, 0xef, 0xff, 0xf2, 0xb4, 0x87, 0x10, 0x23, 0xd2, + 0x7f, 0x14, 0xfe, 0xad, 0xfa, 0x2c, 0x00, 0x1b, 0xff, 0xff, 0x45, 0xfb, + 0xef, 0xf1, 0x6f, 0xc1, 0x74, 0x44, 0xff, 0x52, 0xff, 0xff, 0xda, 0x7a, + 0x82, 0xd9, 0xf3, 0x86, 0x68, 0x13, 0xe3, 0x17, 0xfd, 0x00, 0x17, 0x36, + 0xff, 0xff, 0xf7, 0x17, 0xff, 0xf4, 0x61, 0x2f, 0x76, 0x33, 0x32, 0xff, + 0xe9, 0xa7, 0x7d, 0x02, 0xf5, 0x58, 0x47, 0x23, 0xc4, 0x4f, 0x17, 0x10, + 0x00, 0x42, 0xef, 0xff, 0xb9, 0xf9, 0x5f, 0xf8, 0x1f, 0xc2, 0x77, 0x2a, + 0x32, 0xff, 0xd6, 0xef, 0x01, 0x66, 0x00, 0xff, 0xda, 0xef, 0xf9, 0x28, + 0x46, 0x44, 0x97, 0x40, 0x2f, 0x11, 0xfd, 0xdf, 0xff, 0xfc, 0x6e, 0xff, + 0x00, 0x20, 0x21, 0x1f, 0xff, 0x82, 0x60, 0x4f, 0xfc, 0x72, 0x1a, 0x09, + 0x59, 0xd4, 0xff, 0x91, 0x01, 0xfe, 0x00, 0xff, 0xff, 0xcc, 0xff, 0xb6, + 0xff, 0xfd, 0x26, 0x08, 0x47, 0x45, 0x79, 0x1f, 0x11, 0xf8, 0x9f, 0xff, + 0x00, 0xfc, 0x7f, 0xff, 0x22, 0x10, 0x00, 0x8f, 0xf9, 0x0d, 0x5a, 0xff, + 0xff, 0x17, 0x71, 0x59, 0xba, 0xcc, 0x04, 0xd1, 0xaf, 0xff, 0xff, 0xa6, + 0x74, 0xff, 0x26, 0x00, 0x47, 0x56, 0x4d, 0x1c, 0xff, 0xfe, 0x7d, 0xff, + 0x20, 0xff, 0xbd, 0x19, 0x18, 0x40, 0x11, 0x13, 0xdf, 0xa4, 0x31, 0x23, + 0x14, 0x50, 0x9f, 0xc3, 0xf2, 0x3f, 0x10, 0xff, 0xff, 0xed, 0x74, 0xff, + 0x26, 0x44, 0x5a, 0x00, 0x2f, 0x18, 0xff, 0xff, 0xbf, 0xda, 0xff, 0x79, + 0x00, 0xff, 0xff, 0xfd, 0x28, 0x14, 0x94, 0xf5, 0x09, 0xa0, 0x31, 0x61, + 0x14, 0xa0, 0x05, 0xba, 0xb8, 0x9f, 0x10, 0xff, 0xff, 0xfb, 0x6a, 0xf8, + 0x7f, 0xfe, 0x9e, 0x82, 0x31, 0x25, 0x45, 0x8f, 0x5d, 0x53, 0x11, 0xb7, + 0x80, 0x02, 0xf6, 0x39, 0x08, 0x56, 0xff, 0x60, 0xcf, 0x08, 0xff, 0xff, + 0xb1, 0xbf, 0x8a, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x02, 0x51, 0x9f, 0xff, + 0xff, 0x50, 0xff, 0x02, 0xff, 0x87, 0xfc, 0xcf, 0xfd, 0x6e, 0x59, 0x79, + 0x04, 0xfb, 0x8f, 0x52, 0x80, 0xcf, 0x13, 0xff, 0xff, 0x01, 0xf1, 0x10, + 0x24, 0x2f, 0xff, 0xf5, 0x0f, 0xb9, 0x40, 0x5f, 0x74, 0xb7, 0x56, 0x12, + 0x72, 0x04, 0xff, 0x04, 0xff, 0xf2, 0x2f, 0xff, 0xaa, 0x7c, 0xff, 0xb4, + 0x04, 0x22, 0x02, 0x44, 0x71, 0x09, 0x9d, 0x40, 0x00, 0x00, 0x22, 0xdf, + 0xff, 0xff, 0x13, 0xff, 0xff, 0xfa, 0x40, 0x0c, 0x0d, 0xff, 0xf9, 0x01, + 0xf1, 0x3f, 0xff, 0x20, 0xf9, 0x04, 0x8e, 0xfa, 0x07, 0xbe, 0xfd, 0xab, + 0x08, 0x32, 0x41, 0x24, 0xaf, 0x01, 0xfe, 0x81, 0x00, 0x2a, 0x00, 0x3d, + 0x39, 0xb1, 0x99, 0x22, 0x05, 0xff, 0x00, 0xff, 0xf2, 0x37, 0x04, 0xfb, + 0x30, 0x61, 0x1b, 0x80, 0x85, 0xf1, 0x05, 0x66, 0x43, 0x11, 0x4e, 0xff, + 0x00, 0xa5, 0x22, 0x24, 0x46, 0x75, 0x30, 0x00, 0x01, 0x20, 0xa3, 0x5f, + 0x41, 0xf4, 0x1f, 0xff, 0xff, 0xd1, 0x60, 0x9f, 0x04, 0x89, 0x20, 0x43, + 0x11, 0x72, 0x31, 0x20, 0x00, 0x3a, 0x83, 0xd6, 0x02, 0xe6, 0x43, 0x35, + 0x40, 0xaf, 0x29, 0xfa, 0x54, 0x41, 0x00, 0x02, 0x10, 0x10, 0x2f, 0xfb, + 0x1c, 0x4a, 0x06, 0xff, 0xff, 0xf5, 0x60, 0x1f, 0x03, 0x92, 0xf5, 0x01, + 0x01, 0x30, 0x00, 0x00, 0x3c, 0x10, 0x12, 0x22, 0x12, 0x11, 0x32, 0x22, + 0x40, 0x8f, 0x4f, 0xf5, 0x00, 0x7f, 0x35, 0x3d, 0xff, 0x41, 0x23, 0x82, + 0xb0, 0x9f, 0xff, 0xff, 0x18, 0x3f, 0x00, 0xff, 0xa2, 0x00, 0x00, 0x28, + 0xf9, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x09, 0xdf, 0x57, 0xff, 0xe1, + 0x00, 0x05, 0xf9, 0x1f, 0x61, 0xff, 0xe1, 0x14, 0x6c, 0x01, 0xff, 0xff, + 0xf7, 0x0d, 0xff, 0xff, 0x62, 0x37, 0x80, 0x03, 0xf3, 0x03, 0x10, 0x00, + 0x9f, 0xff, 0x15, 0x80, 0x5f, 0xff, 0xfd, 0x00, 0x7f, 0xf1, 0x6f, 0xf1, + 0x00, 0x7f, 0xfc, 0x67, 0x21, 0x4f, 0xff, 0xff, 0x71, 0x18, 0x58, 0x74, + 0x12, 0x2f, 0x03, 0x20, 0x7f, 0xf0, 0x04, 0x59, 0x16, 0xff, 0xc0, 0x9f, + 0x57, 0xf2, 0x3f, 0x00, 0xff, 0x12, 0xff, 0xfb, 0x08, 0xff, 0xfd, 0x30, + 0x01, 0x1e, 0xff, 0xff, 0xfa, 0x43, 0x44, 0x8f, 0x37, 0x90, 0x02, 0xe1, + 0x06, 0x11, 0xc0, 0x3f, 0xf7, 0x04, 0x40, 0xef, 0x4e, 0xb1, 0xdf, 0xe1, + 0x0c, 0xff, 0xff, 0x07, 0xa1, 0x25, 0x51, 0x00, 0x3f, 0x6e, 0x2e, 0x01, + 0x00, 0x14, 0xff, 0xf0, 0x2f, 0xff, 0xfc, 0x09, 0xff, 0x20, 0x80, 0x06, + 0x1e, 0x80, 0x25, 0x00, 0x8f, 0xff, 0x03, 0xff, 0xfd, 0x77, 0x65, 0x06, + 0xdf, 0x6e, 0x2e, 0x02, 0xff, 0xff, 0xfe, 0x1b, 0xb4, 0x05, 0x51, 0x60, + 0x08, 0x9f, 0x80, 0x01, 0xef, 0x15, 0x50, 0x00, 0x18, 0xb8, 0x04, 0xed, + 0x7d, 0x45, 0x0c, 0x41, 0x21, 0x07, 0x84, 0x11, 0xf8, 0x02, 0x10, 0x0a, + 0x16, 0xed, 0x8d, 0xe1, 0x07, 0xbf, 0x77, 0xff, 0xb0, 0x00, 0x05, 0x0a, + 0x1e, 0xf6, 0x22, 0xcf, 0x07, 0x07, 0x77, 0x2f, 0xff, 0x0f, 0xff, 0xf9, + 0x45, 0xbf, 0x07, 0x07, 0x77, 0x2f, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, +}; + +const uint8_t g_pui8Image_Splash4[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x29, 0x29, 0x29, + 0x42, 0x42, 0x42, + 0x55, 0x55, 0x55, + 0x66, 0x66, 0x66, + 0x77, 0x77, 0x77, + 0x88, 0x88, 0x88, + 0x98, 0x98, 0x98, + 0xa5, 0xa5, 0xa5, + 0xb4, 0xb4, 0xb4, + 0xc6, 0xc6, 0xc6, + 0xd8, 0xd8, 0xd8, + 0xe6, 0xe6, 0xe6, + 0xf1, 0xf1, 0xf1, + 0xfa, 0xfa, 0xfa, + 0xff, 0xff, 0xff, + + 0x1f, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe7, 0x07, 0x07, 0x01, 0xfc, 0xaf, + 0x07, 0x07, 0x77, 0xc7, 0x2f, 0x07, 0xff, 0xf3, 0x0d, 0x07, 0x07, 0x77, + 0xc7, 0x2f, 0x07, 0xff, 0xa1, 0x17, 0x07, 0x07, 0x77, 0xc7, 0x2f, 0x07, + 0xff, 0x45, 0x72, 0x07, 0x07, 0x77, 0xc7, 0x2f, 0x07, 0xff, 0x28, 0xb1, + 0x07, 0x07, 0x77, 0x88, 0x2a, 0xed, 0xff, 0xef, 0x07, 0xff, 0xff, 0xfc, + 0x1c, 0x1b, 0xe1, 0xbf, 0x07, 0x47, 0x07, 0xfd, 0x55, 0x00, 0x42, 0x12, + 0x22, 0x11, 0x18, 0xff, 0xfc, 0xab, 0x21, 0x9a, 0xce, 0x03, 0xf7, 0x1f, + 0xd1, 0xaf, 0x01, 0x70, 0xa8, 0x05, 0xcd, 0x96, 0xb6, 0x50, 0x24, 0x05, + 0x00, 0xcf, 0x51, 0xca, 0x51, 0x54, 0x12, 0x23, 0x33, 0x10, 0x33, 0x33, + 0x5b, 0x01, 0xf4, 0x2f, 0xe1, 0xaf, 0x0e, 0xff, 0xff, 0x83, 0x01, 0x04, + 0xd4, 0xa7, 0xd2, 0x00, 0x03, 0x59, 0xff, 0x6b, 0xff, 0x6a, 0xff, 0xff, + 0x00, 0x10, 0x6e, 0xff, 0xff, 0xdc, 0xb7, 0x31, 0x19, 0x00, 0xff, 0xff, + 0xf2, 0x4f, 0xd1, 0xaf, 0xff, 0xa0, 0x38, 0x1a, 0x25, 0x03, 0xdb, 0xb6, + 0xfb, 0x53, 0x42, 0x00, 0x02, 0xcf, 0xbc, 0xff, 0xff, 0xfc, 0x1b, 0xff, + 0x20, 0xe1, 0x1e, 0x0b, 0xfc, 0x52, 0x14, 0xbf, 0xf2, 0x01, 0x6f, 0xc1, + 0xaf, 0xf6, 0x05, 0xfb, 0x1d, 0x7b, 0xc0, 0x53, 0xb5, 0xf6, 0x11, 0x47, + 0x86, 0x2b, 0xff, 0x01, 0x41, 0xff, 0xff, 0xfa, 0x1f, 0xff, 0x02, 0x16, + 0x00, 0xb4, 0x04, 0xf2, 0x8f, 0x91, 0xdf, 0x50, 0xbf, 0x30, 0xf2, 0x5f, + 0x76, 0x36, 0xfa, 0x11, 0x7f, 0xff, 0x00, 0xff, 0xcc, 0xff, 0xa1, 0xef, + 0x4b, 0xf9, 0x1f, 0x20, 0xfa, 0x2e, 0x17, 0xd2, 0x11, 0x8f, 0x52, 0xf6, + 0x19, 0x0b, 0xff, 0x50, 0x7f, 0x36, 0x30, 0x7f, 0x01, 0x01, 0xf2, 0x8f, + 0xf2, 0x7f, 0x19, 0xf7, 0x2f, 0x1f, 0x80, 0x01, 0x60, 0x8f, 0x27, 0xc0, + 0xaf, 0xf7, 0x0b, 0xc8, 0x6f, 0x25, 0xc0, 0x1d, 0x02, 0xf4, 0x1f, 0xf4, + 0x0c, 0x3f, 0x17, 0xf6, 0x2f, 0x1f, 0x6a, 0x3f, 0x2b, 0x0c, 0x25, 0xff, + 0x30, 0xaf, 0x6f, 0x24, 0xf9, 0x05, 0x80, 0x03, 0xfe, 0x18, 0xf9, 0x1f, + 0x34, 0xf5, 0x2f, 0xc0, 0x1f, 0x01, 0xfa, 0x1d, 0x20, 0x2f, 0xc0, 0x1c, + 0xc8, 0x77, 0x2d, 0xa0, 0x6f, 0x04, 0x32, 0xfd, 0x1d, 0x18, 0x52, 0xf3, + 0x3f, 0x17, 0x01, 0xf7, 0x0f, 0xb4, 0x32, 0xcb, 0x04, 0x7f, 0x35, 0xfb, + 0x07, 0x05, 0x90, 0x06, 0xff, 0x19, 0x92, 0xf2, 0x4f, 0x0f, 0x01, 0x70, + 0x0c, 0x9f, 0xff, 0xf0, 0x7f, 0x7f, 0x35, 0xf1, 0x3f, 0x81, 0xbe, 0x8f, + 0x26, 0xb1, 0xf3, 0x4f, 0x2c, 0x07, 0x01, 0xff, 0xf5, 0x0a, 0xff, 0xff, + 0xf2, 0x5f, 0x87, 0xa0, 0x3d, 0x51, 0x06, 0xf4, 0x3f, 0x53, 0xc1, 0xf4, + 0x20, 0x5b, 0x1f, 0x07, 0xff, 0x70, 0xaf, 0xff, 0xff, 0x34, 0xfa, 0x1b, + 0x87, 0x3d, 0x06, 0x06, 0xf9, 0x1f, 0x04, 0x82, 0xd1, 0xf5, 0x47, 0x2f, + 0x07, 0xfb, 0x08, 0xb2, 0x02, 0x32, 0x87, 0x3c, 0xf9, 0x0e, 0x7f, 0x19, + 0x04, 0xc2, 0xd2, 0xd6, 0x44, 0x3f, 0x01, 0xfd, 0x5c, 0xa3, 0x02, 0xf2, + 0xaa, 0xff, 0xd0, 0x9f, 0x07, 0xbb, 0x90, 0x54, 0xff, 0x6b, 0x21, 0x33, + 0xf1, 0xd2, 0xb8, 0x00, 0x33, 0x6f, 0xd6, 0xdf, 0xff, 0xfe, 0xae, 0xff, + 0x04, 0xfd, 0xef, 0xff, 0xa1, 0xcf, 0x02, 0xf6, 0x2f, 0xe5, 0x03, 0xdb, + 0x82, 0xb0, 0xaf, 0x83, 0xbd, 0x21, 0x00, 0x71, 0xf2, 0xb3, 0xa9, 0x12, + 0x8f, 0xd9, 0xdf, 0x42, 0xf8, 0x69, 0xf5, 0xbf, 0xff, 0x32, 0x03, 0xfd, + 0x74, 0x1a, 0x03, 0xa3, 0x7a, 0x51, 0x8d, 0xf9, 0xbf, 0x00, 0xff, 0xd1, + 0xc3, 0xa4, 0x89, 0x12, 0xaf, 0xff, 0x20, 0xff, 0xf7, 0xe1, 0xfd, 0xef, + 0xff, 0x16, 0xdf, 0xb1, 0x2b, 0x33, 0x04, 0xd4, 0xff, 0xff, 0x32, 0x5b, + 0x00, 0xef, 0xf6, 0x8a, 0xcb, 0x9f, 0xf2, 0x94, 0x85, 0x00, 0x69, 0x02, + 0xcf, 0xfe, 0xef, 0xff, 0xff, 0xf7, 0x02, 0x9f, 0xff, 0xff, 0xfd, 0x18, + 0x2d, 0x01, 0x79, 0x3a, 0xff, 0x81, 0x02, 0xe2, 0xc4, 0x23, 0x31, 0xbf, + 0x00, 0xf6, 0x7f, 0xfb, 0xcf, 0xfb, 0x9f, 0xf4, 0x56, 0x00, 0x76, 0x58, + 0x03, 0xff, 0xe4, 0xbf, 0xff, 0xff, 0x00, 0xf9, 0xaf, 0xf7, 0xbf, 0xfb, + 0x1a, 0x2b, 0xff, 0x00, 0xff, 0xf2, 0x43, 0x5f, 0xf1, 0x9f, 0xff, 0xff, + 0x60, 0xff, 0xe9, 0xd4, 0xff, 0x15, 0xff, 0xff, 0xfa, 0x10, 0x4f, 0xfc, + 0xcf, 0x62, 0xf8, 0x45, 0x68, 0x49, 0x04, 0x03, 0xff, 0xfc, 0xfa, 0x7f, + 0x01, 0xf6, 0xbf, 0x00, 0xfd, 0x06, 0x38, 0xff, 0xff, 0xb1, 0x78, 0xaf, + 0x30, 0xf3, 0x5f, 0x22, 0x02, 0xff, 0xff, 0xeb, 0xad, 0x08, 0xff, 0x16, + 0xff, 0xf9, 0x02, 0xaa, 0xff, 0xfc, 0x00, 0xdf, 0xfc, 0x24, 0x59, 0x3a, + 0x02, 0xff, 0xff, 0x22, 0xfc, 0xaf, 0x03, 0xfd, 0x01, 0x35, 0x41, 0x01, + 0x18, 0xff, 0xf6, 0x3f, 0x8b, 0x62, 0xf7, 0x10, 0x00, 0x08, 0x3f, 0x24, + 0xff, 0xfb, 0x02, 0x87, 0xff, 0xf6, 0x01, 0xaf, 0xff, 0x24, 0x48, 0x39, + 0x12, 0xcf, 0x12, 0x20, 0xfe, 0x7d, 0xe1, 0x10, 0x01, 0xdf, 0xff, 0xe4, + 0x0c, 0x79, 0x3d, 0xfa, 0x1e, 0x72, 0x52, 0xff, 0x20, 0x08, 0x10, 0x00, + 0x11, 0x14, 0x01, 0xfb, 0x7f, 0xa9, 0x80, 0x63, 0x24, 0x49, 0x39, 0x11, + 0xaf, 0xff, 0x89, 0x08, 0xff, 0xff, 0xfe, 0x7c, 0x01, 0x10, 0x00, 0x2d, + 0x03, 0xff, 0xf4, 0x30, 0x3f, 0xff, 0x19, 0x23, 0x01, 0x02, 0xf5, 0x23, + 0x02, 0xa4, 0x02, 0x02, 0x31, 0xfb, 0x08, 0x8f, 0x98, 0xff, 0xfe, 0x51, + 0x25, 0x39, 0x29, 0x00, 0x31, 0x5f, 0xff, 0xbb, 0xff, 0x49, 0xff, 0xff, + 0x00, 0xe7, 0xcf, 0xff, 0x24, 0x20, 0x00, 0x5f, 0xff, 0x0c, 0x71, 0xaf, + 0xff, 0x34, 0x31, 0x19, 0xff, 0xff, 0x00, 0xf2, 0x00, 0x4f, 0xff, 0x11, + 0x30, 0xaf, 0xff, 0x40, 0xfe, 0x7a, 0xf8, 0x9f, 0xff, 0xff, 0x25, 0x9a, + 0x10, 0x2a, 0x42, 0x3f, 0x11, 0xab, 0xff, 0xff, 0xf9, 0x01, 0xcf, 0xfe, + 0x19, 0xf2, 0x01, 0x01, 0xcf, 0x29, 0x60, 0x52, 0x0a, 0xe2, 0xf2, 0x40, + 0x89, 0xdf, 0x30, 0x08, 0x22, 0x4f, 0xff, 0xb5, 0x7a, 0xfd, 0xdf, 0xff, + 0x02, 0xff, 0x25, 0xff, 0xcf, 0x36, 0x2b, 0x12, 0xf6, 0x00, 0xaf, 0xff, + 0xff, 0xfb, 0x1d, 0x80, 0x42, 0xe3, 0x58, 0x0b, 0x29, 0x81, 0x0a, 0x52, + 0xf1, 0x31, 0x50, 0x00, 0x44, 0x12, 0x4c, 0x09, 0xff, 0xdc, 0xff, 0xb6, + 0x80, 0x49, 0xf9, 0xaf, 0xff, 0x33, 0x8b, 0xaf, 0xef, 0x00, 0x44, 0xff, + 0xfc, 0x7e, 0xff, 0xf9, 0xbf, 0xff, 0x01, 0xff, 0xf6, 0x1f, 0x11, 0x35, + 0xff, 0x60, 0xb9, 0x30, 0xd1, 0xaf, 0x11, 0xe9, 0xff, 0xf1, 0x11, 0x83, + 0x00, 0x00, 0x00, 0xcf, 0x50, 0xdf, 0xff, 0xff, 0xdc, 0x00, 0xff, 0xcb, + 0xfe, 0xdc, 0xdf, 0xff, 0x22, 0x16, 0x02, 0x17, 0x56, 0x80, 0x7d, 0xfc, + 0x7e, 0x14, 0x75, 0x00, 0x41, 0x0b, 0xff, 0xf4, 0x0f, 0xff, 0xff, 0xf3, + 0x60, 0x5f, 0x83, 0xb9, 0x21, 0x4f, 0x75, 0x8d, 0xff, 0x20, 0xf5, 0x0d, + 0x0a, 0x96, 0xfc, 0x7f, 0xff, 0xfc, 0x01, 0x12, 0x66, 0x86, 0x72, 0x00, + 0x11, 0x2a, 0x0b, 0x00, 0xfd, 0x21, 0x21, 0xab, 0x52, 0xcf, 0xff, 0x13, + 0x08, 0xff, 0xff, 0xf8, 0x1f, 0x7b, 0xff, 0xff, 0xf7, 0x22, 0x2f, 0x15, + 0x29, 0xf2, 0x12, 0xaf, 0x83, 0xef, 0x00, 0xff, 0xf4, 0x02, 0x65, 0x65, + 0x43, 0x4b, 0xfb, 0x00, 0x31, 0x24, 0x67, 0x8a, 0xcb, 0xa8, 0x50, 0x00, + 0x00, 0x01, 0x2b, 0xf2, 0x4f, 0xff, 0xb0, 0x8f, 0xff, 0x30, 0xff, 0x09, + 0x03, 0xd9, 0x22, 0x43, 0x36, 0x78, 0x02, 0x62, 0x07, 0xf0, 0x02, 0x8b, + 0xef, 0x72, 0xfe, 0x04, 0x10, 0xb9, 0x76, 0x58, 0xae, 0x21, 0x94, 0x33, + 0x00, 0x31, 0x00, 0x00, 0x00, 0x21, 0x22, 0x07, 0xf2, 0x01, 0x5f, 0xff, + 0xf7, 0x0c, 0xff, 0xff, 0x42, 0x12, 0x80, 0xe2, 0x90, 0x38, 0x02, 0x40, + 0x2a, 0x22, 0x10, 0x00, 0x12, 0x00, 0x01, 0x34, 0x43, 0x24, 0x46, 0x61, + 0x40, 0x1c, 0x46, 0xff, 0xf9, 0x05, 0x79, 0x12, 0xff, 0x00, 0xff, 0x61, + 0xf1, 0x6f, 0xff, 0xff, 0x21, 0xff, 0x10, 0xff, 0xc1, 0xaf, 0x3d, 0xfd, + 0x20, 0x00, 0x10, 0x00, 0x13, 0x00, 0x04, 0x82, 0xc9, 0x50, 0x00, 0x04, + 0x18, 0x10, 0x00, 0x0b, 0x55, 0x19, 0xfa, 0x1d, 0xff, 0x00, 0x35, 0xff, + 0xff, 0xd1, 0x00, 0xaf, 0xff, 0xff, 0x04, 0xd0, 0x4f, 0xff, 0xf4, 0x2f, + 0x36, 0xfb, 0x94, 0x00, 0x22, 0x10, 0x24, 0xaf, 0x71, 0xff, 0xf5, 0x03, + 0x08, 0x6b, 0xff, 0xf7, 0x02, 0x56, 0xff, 0xff, 0xf8, 0x01, 0x1f, 0xff, + 0x18, 0xff, 0xff, 0xd0, 0x01, 0x71, 0x06, 0xfb, 0x01, 0xcf, 0xfe, 0x19, + 0x37, 0x03, 0xf0, 0x03, 0x3f, 0xfe, 0x10, 0x01, 0x47, 0xc4, 0x12, 0x3d, + 0x00, 0xf7, 0x1f, 0xff, 0x21, 0xbf, 0xff, 0xfa, 0x6c, 0x86, 0x02, 0xe3, + 0x01, 0x57, 0x16, 0x37, 0x03, 0xfe, 0x01, 0x03, 0xff, 0xa4, 0x10, 0x02, + 0x10, 0x1a, 0x57, 0x01, 0xff, 0xf8, 0x1f, 0xff, 0xf5, 0x02, 0xcf, 0x05, + 0x18, 0xc5, 0x22, 0x5e, 0x37, 0x04, 0xf1, 0x18, 0xdf, 0x08, 0x70, 0x1f, + 0xc5, 0xbf, 0x57, 0xff, 0xff, 0x21, 0x1c, 0xef, 0xb6, 0x10, 0x87, 0x47, + 0x06, 0xfb, 0x23, 0x18, 0x21, 0x00, 0x6f, 0x17, 0x02, 0xf2, 0x07, 0x70, + 0x71, 0x05, 0x7f, 0x37, 0x07, 0xff, 0xc6, 0x29, 0x17, 0x8f, 0x04, 0xa2, + 0x32, 0x7f, 0x77, 0x2f, 0x77, 0x2f, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xe0, 0x07, 0x07, 0x07, +}; + +const uint8_t g_pui8Image_Splash5[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x29, 0x29, 0x29, + 0x43, 0x43, 0x43, + 0x57, 0x57, 0x57, + 0x67, 0x67, 0x67, + 0x77, 0x77, 0x77, + 0x86, 0x86, 0x86, + 0x98, 0x98, 0x98, + 0xa9, 0xa9, 0xa9, + 0xba, 0xba, 0xba, + 0xca, 0xca, 0xca, + 0xd8, 0xd8, 0xd8, + 0xe7, 0xe7, 0xe7, + 0xf4, 0xf4, 0xf4, + 0xfb, 0xfb, 0xfb, + 0xff, 0xff, 0xff, + + 0x1f, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x12, 0x3e, 0xfe, 0x06, + 0x07, 0x07, 0x77, 0x2f, 0x07, 0xff, 0x27, 0xf7, 0x02, 0x03, 0xf6, 0x4f, + 0x07, 0x07, 0x77, 0xc4, 0x2f, 0x01, 0xf2, 0x42, 0x9f, 0x02, 0x30, 0x3f, + 0xf8, 0x07, 0x07, 0x77, 0x2f, 0x01, 0xf1, 0xa5, 0x4f, 0x9f, 0x01, 0xe1, + 0x58, 0xd2, 0x07, 0xa7, 0x5f, 0x17, 0x11, 0xb1, 0xf9, 0x1f, 0x01, 0x22, + 0xf7, 0x3f, 0x07, 0xe0, 0x07, 0x77, 0x2a, 0xb8, 0x64, 0x43, 0x46, 0xac, + 0x00, 0x99, 0xdf, 0xff, 0x91, 0xff, 0x17, 0xff, 0xff, 0x0e, 0xf5, 0x1f, + 0xf5, 0x4f, 0x07, 0xbf, 0x77, 0xff, 0x00, 0xff, 0x94, 0x22, 0x11, 0x23, + 0x44, 0x32, 0x11, 0x00, 0x01, 0x13, 0xaf, 0x72, 0xff, 0x33, 0xff, 0xff, + 0x0e, 0xe0, 0x8f, 0xf3, 0x7f, 0x07, 0xbf, 0x77, 0xf9, 0x08, 0x30, 0x13, + 0x6a, 0xdf, 0x01, 0xfa, 0xaf, 0xc4, 0x00, 0x14, 0x72, 0xff, 0x71, 0xff, + 0xff, 0x43, 0xff, 0x38, 0xb2, 0xef, 0x07, 0xbf, 0x73, 0xd9, 0x53, 0x43, + 0x10, 0x33, 0x20, 0x28, 0x1f, 0xd2, 0x02, 0xff, 0xb1, 0x07, 0xef, 0xfe, + 0x08, 0xff, 0x43, 0x77, 0x2f, 0x03, 0x02, 0x92, 0x12, 0x36, 0x77, 0x76, + 0x7d, 0x1f, 0xff, 0x00, 0xff, 0x60, 0xcf, 0xb1, 0xdf, 0xf4, 0x1f, 0xfe, + 0x70, 0x1a, 0x6f, 0x27, 0x01, 0xfc, 0x42, 0x03, 0xbf, 0xc0, 0x3f, 0x03, + 0xb8, 0xf1, 0x3f, 0xb1, 0xdf, 0xc1, 0x1c, 0x8f, 0xf5, 0x3f, 0x4f, 0x07, + 0x01, 0x90, 0x28, 0x02, 0xef, 0xff, 0xff, 0xb5, 0xff, 0x68, 0x1f, 0xf9, + 0x00, 0x03, 0xfb, 0x1f, 0x71, 0xff, 0x21, 0xff, 0x90, 0x61, 0xbf, 0x6f, + 0x27, 0xff, 0xfe, 0x94, 0x06, 0x52, 0x10, 0xb2, 0xef, 0x26, 0x1f, 0xb0, + 0x6f, 0xfe, 0x1d, 0x06, 0x70, 0x62, 0x0c, 0xf9, 0x07, 0x77, 0x2f, 0xff, + 0x00, 0xfa, 0x21, 0x24, 0xaf, 0xff, 0x87, 0xff, 0x58, 0x10, 0xf2, 0xcf, + 0x17, 0x17, 0x13, 0xff, 0xff, 0x6c, 0x06, 0xe9, 0x53, 0xcf, 0x60, 0x8f, + 0x77, 0x2f, 0xff, 0x20, 0x40, 0x4b, 0x59, 0x71, 0xff, 0x53, 0xf2, 0x9f, + 0x49, 0xad, 0x16, 0xf9, 0x0d, 0x03, 0xf6, 0x0a, 0x7e, 0xc8, 0x3e, 0x01, + 0xd1, 0x1c, 0x22, 0xf1, 0x6f, 0xa2, 0x08, 0xf3, 0x7f, 0xd9, 0xef, 0x01, + 0xc9, 0xff, 0xeb, 0x13, 0xef, 0xf2, 0x2f, 0x03, 0xf3, 0x8f, 0xcb, 0xa3, + 0x90, 0xb6, 0xfa, 0x02, 0x2a, 0xfb, 0xb8, 0x2f, 0xf2, 0x10, 0xc4, 0x6f, + 0x80, 0x0a, 0xa6, 0xff, 0xc6, 0xdf, 0x2e, 0xf0, 0x9f, 0x03, 0xf3, 0xcc, + 0xa3, 0xb6, 0x60, 0x40, 0x7f, 0x2a, 0xfa, 0x0c, 0x37, 0xf2, 0x87, 0x5f, + 0x45, 0x71, 0x0e, 0x91, 0xdf, 0x49, 0x02, 0xf3, 0x23, 0xc8, 0x5e, 0x1b, + 0xf3, 0x0a, 0x6c, 0x25, 0x82, 0xf5, 0x11, 0x59, 0x3f, 0x71, 0x0e, 0x61, + 0xfd, 0x19, 0x02, 0x32, 0xf4, 0x6f, 0x7e, 0x3e, 0xff, 0x20, 0x75, 0xb1, + 0x01, 0x72, 0xfa, 0x38, 0x3f, 0x80, 0xff, 0x98, 0x04, 0x13, 0x71, 0xfa, + 0x1d, 0x02, 0xf5, 0x3f, 0x15, 0xcd, 0xa0, 0x71, 0x0d, 0x75, 0xf2, 0x54, + 0x7f, 0x37, 0x3f, 0x02, 0x81, 0xff, 0x87, 0xff, 0xf7, 0x9f, 0x01, 0x90, + 0x26, 0xfa, 0x1f, 0x02, 0xf7, 0x2f, 0x15, 0xcd, 0xff, 0x10, 0xff, 0xa0, + 0xaf, 0x75, 0xf9, 0x26, 0x2f, 0x45, 0x00, 0x4b, 0xb0, 0xef, 0xff, 0xff, + 0xfb, 0xcf, 0xff, 0x04, 0x89, 0xff, 0x91, 0xfb, 0x1e, 0x02, 0xfa, 0x2f, + 0xc4, 0x15, 0xcd, 0xff, 0xff, 0x13, 0x7c, 0xdf, 0xff, 0x01, 0xff, 0x26, + 0x3d, 0x84, 0x48, 0xd1, 0xcf, 0x03, 0x00, 0x68, 0xff, 0xa1, 0xcf, 0x1b, + 0xff, 0xfa, 0x7c, 0x1c, 0xff, 0xfb, 0x1d, 0x0c, 0xd4, 0x21, 0xf6, 0x0f, + 0x80, 0x7b, 0xf8, 0x6f, 0xff, 0xff, 0x43, 0x56, 0xd3, 0x01, 0x45, 0xe0, + 0xcf, 0xff, 0xff, 0xfc, 0x9f, 0x01, 0x00, 0xf1, 0x8f, 0x17, 0xff, 0x72, + 0x66, 0xff, 0xfb, 0x72, 0x2d, 0x0b, 0xdb, 0xb3, 0xf1, 0x5f, 0x7b, 0xfd, + 0x00, 0xcf, 0xff, 0xff, 0x92, 0x74, 0xf3, 0x25, 0xf1, 0x08, 0xbf, 0xff, + 0xff, 0xf9, 0x6a, 0xf2, 0x1f, 0x52, 0x03, 0xff, 0xb7, 0x9f, 0xff, 0xfa, + 0x1f, 0x0b, 0xdb, 0x90, 0xb3, 0xa0, 0xcf, 0x7f, 0xf1, 0x73, 0xf5, 0x25, + 0x08, 0xe1, 0x9f, 0xff, 0xac, 0x03, 0xf4, 0x04, 0xa1, 0x03, 0xfd, 0x92, + 0x07, 0x8f, 0xf8, 0x2f, 0x0f, 0xbc, 0x40, 0x52, 0x85, 0xfd, 0x5c, 0xff, + 0xf3, 0x64, 0x98, 0x04, 0x25, 0xd1, 0x7f, 0xff, 0x49, 0x03, 0xf5, 0x21, + 0x01, 0x94, 0x8f, 0x23, 0x51, 0x9f, 0xf5, 0x2f, 0x05, 0x90, 0xcd, 0xff, + 0x24, 0x85, 0xfe, 0x9d, 0xff, 0xf6, 0x04, 0x36, 0x6a, 0x34, 0xd2, 0x5f, + 0x03, 0xf8, 0x7f, 0x00, 0xf7, 0x2a, 0x11, 0x6f, 0xb6, 0x57, 0xff, 0xf2, + 0x64, 0x6f, 0x05, 0xcd, 0xff, 0x17, 0x02, 0xf7, 0x8f, 0x81, 0x52, 0xf9, + 0x27, 0x4b, 0x43, 0xb5, 0x2f, 0x03, 0x02, 0xf9, 0x7f, 0xf9, 0x1f, 0xa0, + 0x3f, 0x01, 0xc1, 0x74, 0xbf, 0x83, 0x5b, 0x33, 0x18, 0x02, 0xfb, 0xcb, + 0x40, 0xaf, 0x21, 0xfd, 0x18, 0x4a, 0x53, 0x8b, 0x1f, 0xa2, 0x01, 0x96, + 0x01, 0xfc, 0x1c, 0xd0, 0xaa, 0x42, 0xe0, 0x0a, 0xe2, 0xc5, 0xfd, 0x19, + 0xff, 0xff, 0xfa, 0x08, 0x7f, 0xff, 0xf8, 0x7f, 0x42, 0x17, 0x59, 0x53, + 0x40, 0x4f, 0x81, 0xff, 0xaa, 0xf7, 0xdf, 0xff, 0xfb, 0x17, 0x1e, 0x91, + 0x1d, 0x01, 0x18, 0x42, 0x22, 0xc6, 0x06, 0x17, 0xff, 0xff, 0xfb, 0x8f, + 0x39, 0xda, 0x27, 0x00, 0x68, 0x54, 0x3f, 0x23, 0xff, 0xfb, 0x5f, 0xff, + 0x00, 0xc6, 0xef, 0xff, 0xf9, 0x0f, 0x52, 0x2e, 0xff, 0x17, 0xff, 0xf6, + 0x1f, 0x29, 0xef, 0x09, 0xc9, 0xd4, 0x40, 0x34, 0x9c, 0xfa, 0xcc, 0x7f, + 0xff, 0xff, 0x45, 0x01, 0x68, 0x54, 0x4f, 0x71, 0xff, 0xfc, 0x9f, 0x02, + 0x00, 0xf4, 0x2e, 0x38, 0x1f, 0xff, 0xff, 0xf2, 0x4f, 0xe9, 0x0c, 0xd4, + 0x42, 0x91, 0x7c, 0xf7, 0x8f, 0x39, 0x02, 0x64, 0x89, 0xba, 0xff, 0x90, + 0xbf, 0x04, 0x30, 0x01, 0xf3, 0x78, 0x1f, 0xff, 0xff, 0xf1, 0x9f, 0x0c, + 0xca, 0x64, 0x32, 0xf1, 0x8f, 0x01, 0x9a, 0x54, 0x62, 0x04, 0xff, 0xa8, + 0xf1, 0x20, 0x6f, 0x02, 0xfa, 0x30, 0x01, 0x13, 0x23, 0xe0, 0x1f, 0xff, + 0xff, 0x91, 0x3c, 0xd0, 0x0c, 0xa3, 0xf3, 0x51, 0xff, 0x68, 0xff, 0xff, + 0x00, 0xc7, 0xdf, 0xff, 0xff, 0x72, 0x2c, 0x80, 0x23, 0x00, 0x20, 0x10, + 0x45, 0x45, 0x56, 0x41, 0x12, 0x38, 0x01, 0xf7, 0x03, 0x42, 0x2e, 0xff, + 0xff, 0x63, 0x19, 0xe4, 0x01, 0xd4, 0xa3, 0xfe, 0x17, 0x6c, 0xc5, 0xef, + 0x00, 0xff, 0xff, 0x50, 0x26, 0x36, 0x85, 0x18, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x04, 0x8f, 0xf8, 0x22, 0x07, 0x1f, 0x1a, 0xff, 0xff, 0x35, + 0x1c, 0xd4, 0xa4, 0x20, 0x80, 0x9f, 0x66, 0xfa, 0x01, 0x75, 0x23, 0x11, + 0x00, 0xaf, 0xfb, 0x20, 0x16, 0x79, 0xcf, 0x70, 0x1f, 0x01, 0xfb, 0x1f, + 0x26, 0x46, 0xff, 0xff, 0x26, 0x26, 0x84, 0xc6, 0xff, 0xff, 0x36, 0x16, + 0x66, 0x80, 0x36, 0x00, 0x43, 0x46, 0xbf, 0xff, 0xff, 0xfb, 0x44, 0x54, + 0x01, 0x42, 0x42, 0x2f, 0xfa, 0x1f, 0xb2, 0x53, 0x19, 0xc0, 0x26, 0xc6, + 0xff, 0xf6, 0x2f, 0x50, 0x12, 0x7d, 0x01, 0xfe, 0xff, 0xff, 0xec, 0xb8, + 0x31, 0x19, 0x1e, 0x00, 0xc8, 0x8b, 0xf6, 0x1f, 0xf6, 0x2f, 0xf4, 0x72, + 0x1a, 0x8f, 0xff, 0x35, 0x6e, 0x2a, 0xfe, 0x02, 0xf5, 0x00, 0x06, 0x20, + 0x87, 0x43, 0x03, 0x33, 0x23, 0x34, 0x20, 0x00, 0x4b, 0x27, 0xff, 0xff, + 0xc0, 0x9f, 0xf2, 0x03, 0x3f, 0xf4, 0x8a, 0x0b, 0xff, 0x35, 0x67, 0x1e, + 0x00, 0xf3, 0x38, 0x02, 0xff, 0xf1, 0x1c, 0xc6, 0x09, 0x08, 0xad, 0xe7, + 0x43, 0x3a, 0x1f, 0xff, 0xa0, 0x4f, 0x01, 0xf0, 0x2f, 0xf3, 0x8f, 0x80, + 0x4a, 0x17, 0x6f, 0x80, 0x26, 0xf4, 0x5a, 0x04, 0xff, 0x41, 0xff, 0xfa, + 0x02, 0x13, 0x43, 0x4a, 0xba, 0x42, 0x6f, 0x17, 0xf5, 0x00, 0x01, 0x10, + 0x4f, 0xf3, 0x9f, 0xfb, 0x21, 0x3f, 0xc0, 0x77, 0x2e, 0xf8, 0x01, 0x05, + 0xff, 0x90, 0x8f, 0x01, 0xff, 0xdd, 0xdd, 0x70, 0x2f, 0xf7, 0x07, 0x17, + 0x03, 0xfc, 0x40, 0x35, 0x2f, 0xa1, 0xdf, 0x8f, 0x47, 0x80, 0x31, 0x14, + 0x03, 0xff, 0xf9, 0x11, 0xaf, 0xff, 0x04, 0xff, 0x90, 0x0b, 0xb0, 0x08, + 0x07, 0xff, 0xfb, 0x1c, 0xf3, 0x0d, 0x81, 0x97, 0x4f, 0x02, 0x27, 0x30, + 0x00, 0xcf, 0xff, 0xf5, 0x12, 0x32, 0x33, 0x10, 0x12, 0x20, 0x00, 0x4e, + 0x07, 0xff, 0xff, 0xc0, 0x00, 0x08, 0xe0, 0x97, 0x4f, 0x02, 0x82, 0x60, + 0x8f, 0xff, 0xff, 0x03, 0xe9, 0x9a, 0xa9, 0x86, 0x8d, 0x9b, 0x07, 0x01, + 0x1c, 0xf8, 0x73, 0x5f, 0x8f, 0x47, 0x02, 0xf1, 0x21, 0x7c, 0x2f, 0x3f, + 0x07, 0x77, 0x2f, 0x07, 0xf3, 0x68, 0x7c, 0x0f, 0x07, 0x07, 0x77, 0x2f, + 0x07, 0xf6, 0x4c, 0x7c, 0x1e, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xf9, 0x02, + 0x7c, 0x1f, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xf8, 0x24, 0x7c, 0x1f, 0x07, + 0x07, 0x77, 0x2f, 0x07, 0xf4, 0x56, 0x7c, 0x3f, 0x07, 0x07, 0x77, 0x2f, + 0x07, 0xf1, 0x62, 0x7c, 0xaf, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x71, 0x03, + 0xf8, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xfa, 0x12, 0x0c, 0xf8, 0x07, 0x07, + 0x77, 0x2f, 0x04, 0xfe, 0xff, 0xff, 0x1f, 0x50, 0x01, 0xbf, 0x07, 0x07, + 0x77, 0x2f, 0x06, 0x1f, 0xf5, 0x00, 0x2c, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0x3e, 0xf1, 0x05, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xff, 0x3f, 0xf8, 0x6f, + 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xf0, 0x07, 0x07, 0x07, 0x07, +}; + +const uint8_t *g_ppui8Image_Splash[] = +{ + g_pui8Image_Splash1, g_pui8Image_Splash2, g_pui8Image_Splash3, + g_pui8Image_Splash4, g_pui8Image_Splash5 +}; diff --git a/boards/dk-tm4c123g/qs-logger/images.h b/boards/dk-tm4c123g/qs-logger/images.h new file mode 100644 index 0000000..a7da2b9 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/images.h @@ -0,0 +1,37 @@ +//***************************************************************************** +// +// images.h - Header file for graphics images. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __IMAGES_H__ +#define __IMAGES_H__ + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** +extern const uint8_t g_pui8Image_TI_Black[]; +extern const uint8_t *g_ppui8Image_Splash[]; + +#endif // __IMAGES_H__ + diff --git a/boards/dk-tm4c123g/qs-logger/menus.c b/boards/dk-tm4c123g/qs-logger/menus.c new file mode 100644 index 0000000..6a32c70 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/menus.c @@ -0,0 +1,782 @@ +//***************************************************************************** +// +// menus.c - Application menus definition and supporting functions. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** +#include +#include +#include +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/slidemenuwidget.h" +#include "drivers/stripchartwidget.h" +#include "utils/ustdlib.h" +#include "stripchartmanager.h" +#include "clocksetwidget.h" +#include "qs-logger.h" +#include "acquire.h" +#include "menus.h" + +//***************************************************************************** +// +// This is the menus module of the data logger example application. It +// contains the definitions of all the menus that are used by the application +// and provides some helper functions. +// +//***************************************************************************** + +//***************************************************************************** +// +// Define two offscreen buffers and display structures. These are used for +// off-screen drawing for animation effects. Only limited colors are needed +// so 4bpp buffers are used to save memory. +// +//***************************************************************************** +#define OFFSCREEN_BUF_SIZE GrOffScreen4BPPSize(96, 64) +uint8_t g_pui8OffscreenBufA[OFFSCREEN_BUF_SIZE]; +uint8_t g_pui8OffscreenBufB[OFFSCREEN_BUF_SIZE]; +tDisplay g_sOffscreenDisplayA; +tDisplay g_sOffscreenDisplayB; + +//***************************************************************************** +// +// Create a palette that is used by the on-screen menus and anything else that +// uses the (above) off-screen buffers. This palette should contain any +// colors that are used by any widget using the offscreen buffers. There can +// be up to 16 colors in this palette. +// The numerical values of colors in the list below were selected as colors +// that produced good results on the display and did not already have named +// values. +// +//***************************************************************************** +uint32_t g_pui32Palette[] = +{ + ClrBlack, + ClrWhite, + ClrDarkBlue, + ClrLightBlue, + ClrRed, + ClrDarkGreen, + ClrYellow, + ClrBlue, + ClrGreen, + 0x000040, + ClrLime, + ClrAqua, + 0x004000, + ClrFuchsia, + 0xC00040, + 0x60E080, +}; +#define NUM_PALETTE_ENTRIES (sizeof(g_pui32Palette) / sizeof(uint32_t)) + +//***************************************************************************** +// +// Define the length of text strings used for holding data values. +// +//***************************************************************************** +#define TEXT_FIELD_LENGTH 20 + +//***************************************************************************** +// +// Defines a set of text fields that are used by various widgets for dynamic +// updating of text. +// +//***************************************************************************** +static char g_pcTextFields[NUM_TEXT_ITEMS][TEXT_FIELD_LENGTH]; + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the temperature +// on a simple screen with an outline and a title. +// +//***************************************************************************** +tCanvasWidget g_sTempContainerCanvas; +Canvas(g_sTempExtValueCanvas, &g_sTempContainerCanvas, 0, 0, + &g_sCFAL96x64x16, 0, 44, 96, 20, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_EXTTEMP], 0, 0); +Canvas(g_sTempIntValueCanvas, &g_sTempContainerCanvas, &g_sTempExtValueCanvas, + 0, &g_sCFAL96x64x16, 0, 24, 96, 20, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_INTTEMP], 0, 0); +Canvas(g_sTempTitleCanvas, &g_sTempContainerCanvas, &g_sTempIntValueCanvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 24, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, "TEMPERATURE", 0, 0); +Canvas(g_sTempContainerCanvas, 0, 0, &g_sTempTitleCanvas, &g_sCFAL96x64x16, 0, + 0, 96, 64, 0, ClrDarkBlue, ClrWhite, ClrWhite, 0, 0, 0, 0); + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the accelerometer +// data on a simple screen with an outline and a title. +// +//***************************************************************************** +tCanvasWidget g_sAccelContainerCanvas; +Canvas(g_sAccelZCanvas, &g_sAccelContainerCanvas, 0, 0, &g_sCFAL96x64x16, 0, + 48, 96, 16, (CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_ACCELZ], 0, 0); +Canvas(g_sAccelYCanvas, &g_sAccelContainerCanvas, &g_sAccelZCanvas, 0, + &g_sCFAL96x64x16, 0, 32, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_ACCELY], 0, 0); +Canvas(g_sAccelXCanvas, &g_sAccelContainerCanvas, &g_sAccelYCanvas, 0, + &g_sCFAL96x64x16, 0, 16, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_ACCELX], 0, 0); +Canvas(g_sAccelTitleCanvas, &g_sAccelContainerCanvas, &g_sAccelXCanvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 16, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, "ACCEL", 0, 0); +Canvas(g_sAccelContainerCanvas, 0, 0, &g_sAccelTitleCanvas, &g_sCFAL96x64x16, + 0, 0, 96, 64, 0, ClrDarkBlue, ClrWhite, ClrWhite, 0, 0, 0, 0); + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the gyro +// data on a simple screen with an outline and a title. +// +//***************************************************************************** +tCanvasWidget g_sGyroContainerCanvas; +Canvas(g_sGyroZCanvas, &g_sGyroContainerCanvas, 0, 0, &g_sCFAL96x64x16, 0, + 48, 96, 16, (CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_GYROZ], 0, 0); +Canvas(g_sGyroYCanvas, &g_sGyroContainerCanvas, &g_sGyroZCanvas, 0, + &g_sCFAL96x64x16, 0, 32, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_GYROY], 0, 0); +Canvas(g_sGyroXCanvas, &g_sGyroContainerCanvas, &g_sGyroYCanvas, 0, + &g_sCFAL96x64x16, 0, 16, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_GYROX], 0, 0); +Canvas(g_sGyroTitleCanvas, &g_sGyroContainerCanvas, &g_sGyroXCanvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 16, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, "Gyro", 0, 0); +Canvas(g_sGyroContainerCanvas, 0, 0, &g_sGyroTitleCanvas, &g_sCFAL96x64x16, + 0, 0, 96, 64, 0, ClrDarkBlue, ClrWhite, ClrWhite, 0, 0, 0, 0); + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the mag/compass +// data on a simple screen with an outline and a title. +// +//***************************************************************************** +tCanvasWidget g_sMagContainerCanvas; +Canvas(g_sMagZCanvas, &g_sMagContainerCanvas, 0, 0, &g_sCFAL96x64x16, 0, + 48, 96, 16, (CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_COMPASSZ], 0, 0); +Canvas(g_sMagYCanvas, &g_sMagContainerCanvas, &g_sMagZCanvas, 0, + &g_sCFAL96x64x16, 0, 32, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_COMPASSY], 0, 0); +Canvas(g_sMagXCanvas, &g_sMagContainerCanvas, &g_sMagYCanvas, 0, + &g_sCFAL96x64x16, 0, 16, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_COMPASSX], 0, 0); +Canvas(g_sMagTitleCanvas, &g_sMagContainerCanvas, &g_sMagXCanvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 16, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, "Mag", 0, 0); +Canvas(g_sMagContainerCanvas, 0, 0, &g_sMagTitleCanvas, &g_sCFAL96x64x16, + 0, 0, 96, 64, 0, ClrDarkBlue, ClrWhite, ClrWhite, 0, 0, 0, 0); + + + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the analog input +// data on a simple screen with no decorations. +// +//***************************************************************************** +tCanvasWidget g_sAINContainerCanvas; +Canvas(g_sAIN3Canvas, &g_sAINContainerCanvas, 0, 0, &g_sCFAL96x64x16, 0, 48, + 96, 16, (CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | CANVAS_STYLE_TEXT_VCENTER), + ClrDarkGreen, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_USER3], 0, 0); +Canvas(g_sAIN2Canvas, &g_sAINContainerCanvas, &g_sAIN3Canvas, 0, + &g_sCFAL96x64x16, 0, 32, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkGreen, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_USER2], 0, 0); +Canvas(g_sAIN1Canvas, &g_sAINContainerCanvas, &g_sAIN2Canvas, 0, + &g_sCFAL96x64x16, 0, 16, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkGreen, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_USER1], 0, 0); +Canvas(g_sAIN0Canvas, &g_sAINContainerCanvas, &g_sAIN1Canvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkGreen, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_USER0], 0, 0); +Canvas(g_sAINContainerCanvas, 0, 0, &g_sAIN0Canvas, &g_sCFAL96x64x16, 0, 0, 96, + 64, 0, ClrDarkGreen, ClrWhite, ClrWhite, 0, 0, 0, 0); + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the current +// on a simple screen with an outline and a title. +// +//***************************************************************************** +tCanvasWidget g_sCurrentContainerCanvas; +Canvas(g_sCurrentValueCanvas, &g_sCurrentContainerCanvas, 0, 0, + &g_sCFAL96x64x16, 0, 24, 96, 40, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrBlack, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_CURRENT], 0, 0); +Canvas(g_sCurrentTitleCanvas, &g_sCurrentContainerCanvas, + &g_sCurrentValueCanvas, 0, &g_sCFAL96x64x16, 0, 0, 96, 24, + (CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | CANVAS_STYLE_TEXT_VCENTER), + ClrBlack, ClrWhite, ClrWhite, &g_sFontFixed6x8, "CURRENT", 0, 0); +Canvas(g_sCurrentContainerCanvas, 0, 0, &g_sCurrentTitleCanvas, + &g_sCFAL96x64x16, 0, 0, 96, 64, 0, ClrBlack, ClrWhite, ClrWhite, 0, 0, + 0, 0); + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the clock date +// and time. +// +//***************************************************************************** +tCanvasWidget g_sClockContainerCanvas; +Canvas(g_sClockTimeCanvas, &g_sClockContainerCanvas, 0, 0, &g_sCFAL96x64x16, 0, + 38, 96, 16, (CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_TIME], 0, 0); +Canvas(g_sClockDateCanvas, &g_sClockContainerCanvas, &g_sClockTimeCanvas, + 0, &g_sCFAL96x64x16, 0, 22, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_DATE], 0, 0); +Canvas(g_sClockTitleCanvas, &g_sClockContainerCanvas, &g_sClockDateCanvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 16, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, "CLOCK", 0, 0); +Canvas(g_sClockContainerCanvas, 0, 0, &g_sClockTitleCanvas, &g_sCFAL96x64x16, + 0, 0, 96, 64, CANVAS_STYLE_OUTLINE, ClrDarkBlue, ClrWhite, ClrWhite, 0, + 0, 0, 0); + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing a status +// screen. It is a simple canvas container that can show a title and 3 +// lines of text. +// +//***************************************************************************** +tCanvasWidget g_sStatusContainerCanvas; +Canvas(g_sStatus3Canvas, &g_sStatusContainerCanvas, 0, 0, &g_sCFAL96x64x16, 1, + 48, 94, 12, (CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrRed, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_STATUS3], 0, 0); +Canvas(g_sStatus2Canvas, &g_sStatusContainerCanvas, &g_sStatus3Canvas, 0, + &g_sCFAL96x64x16, 1, 30, 94, 12, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_FILL | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrRed, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_STATUS2], 0, 0); +Canvas(g_sStatus1Canvas, &g_sStatusContainerCanvas, &g_sStatus2Canvas, 0, + &g_sCFAL96x64x16, 1, 18, 94, 12, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_FILL | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrRed, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_STATUS1], 0, 0); +Canvas(g_sStatusTitleCanvas, &g_sStatusContainerCanvas, &g_sStatus1Canvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 16, (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrWhite, ClrWhite, ClrBlack, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_STATUS_TITLE], 0, 0); +Canvas(g_sStatusContainerCanvas, 0, 0, &g_sStatusTitleCanvas, &g_sCFAL96x64x16, + 0, 0, 96, 64, CANVAS_STYLE_OUTLINE, ClrRed, ClrWhite, ClrWhite, 0, 0, 0, + 0); + +//***************************************************************************** +// +// Allocate space for a time structure that is used with the clock setting +// widget. +// +//***************************************************************************** +struct tm g_sTimeClock; + +//***************************************************************************** +// +// Define a clock setting widget. It is used to allow the user to set the +// RTC (real time clock). +// +//***************************************************************************** +ClockSet(g_sClockSetter, 0, 0, 0, &g_sCFAL96x64x16, 0, 0, 96, 64, + g_psFontFixed6x8, ClrWhite, ClrDarkGreen, &g_sTimeClock, 0); + +//***************************************************************************** +// +// Define the main (root) menu. +// +//***************************************************************************** +tSlideMenu g_sConfigMenu; +tSlideMenu g_sViewMenu; +tSlideMenu g_sConfirmMenu; +tSlideMenuItem g_psMainMenuItems[] = +{ + {"CONFIG", &g_sConfigMenu, 0, 0}, + {"START", 0, &g_sStripChart.sBase, ClrBlack}, + {"VIEW", &g_sViewMenu, 0, 0}, + {"SAVE", 0, &g_sStatusContainerCanvas.sBase, ClrRed}, + {"ERASE", &g_sConfirmMenu, 0, 0} +}; +tSlideMenu g_psMainMenu = +{ + 0, (sizeof(g_psMainMenuItems) / sizeof(tSlideMenuItem)), g_psMainMenuItems, + 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the configuration (CONFIG) sub-menu. +// +// (root)-->CONFIG +// +//***************************************************************************** +tSlideMenu g_sChannelsMenu; +tSlideMenu g_sPeriodMenu; +tSlideMenu g_sStorageMenu; +tSlideMenu g_sSleepMenu; +tSlideMenuItem g_psConfigMenuItems[] = +{ + {"CHANNELS", &g_sChannelsMenu, 0, 0}, {"PERIOD", &g_sPeriodMenu, 0, 0}, + {"STORAGE", &g_sStorageMenu, 0, 0}, {"SLEEP", &g_sSleepMenu, 0, 0}, + {"CLOCK", 0, &g_sClockSetter.sBase, ClrDarkGreen} +}; +tSlideMenu g_sConfigMenu = +{ + &g_psMainMenu, (sizeof(g_psConfigMenuItems) / sizeof(tSlideMenuItem)), + g_psConfigMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the channel selection sub-menu. +// +// (root)-->CONFIG-->CHANNELS +// +//***************************************************************************** +tSlideMenuItem g_psChannelsMenuItems[] = +{ + {"CHAN 0", 0, 0, 0}, {"CHAN 1", 0, 0, 0}, {"CHAN 2", 0, 0, 0}, + {"CHAN 3", 0, 0, 0}, {"ACCEL X", 0, 0, 0}, {"ACCEL Y", 0, 0, 0}, + {"ACCEL Z", 0, 0, 0},{"EXT TEMP", 0, 0, 0}, {"INT TEMP", 0, 0, 0}, + {"CURRENT", 0, 0, 0}, {"GYRO X", 0, 0, 0}, {"GYRO Y", 0, 0, 0}, + {"GYRO Z", 0, 0, 0}, {"MAG X", 0, 0, 0}, {"MAG Y", 0, 0, 0}, + {"MAG Z", 0, 0, 0}, +}; +tSlideMenu g_sChannelsMenu = +{ + &g_sConfigMenu, (sizeof(g_psChannelsMenuItems) / sizeof(tSlideMenuItem)), + g_psChannelsMenuItems, 0, 0, 1, 0 +}; + +//***************************************************************************** +// +// Define the logging period sub-menu. +// +// (root)-->CONFIG-->PERIOD +// +//***************************************************************************** +#define MENU_CONFIG_PERIOD_DEFAULT 3 +tSlideMenuItem g_psPeriodMenuItems[] = +{ + {"1/32 sec", 0, 0, 0}, {"1/16 sec", 0, 0, 0}, {"1/8 sec", 0, 0, 0}, + {"1/4 sec", 0, 0, 0}, {"1/2 sec", 0, 0, 0}, {"1 sec", 0, 0, 0}, + {"5 sec", 0, 0, 0}, {"10 sec", 0, 0, 0}, {"1 min", 0, 0, 0}, + {"5 min", 0, 0, 0}, {"10 min", 0, 0, 0}, {"1 hour", 0, 0, 0}, + {"5 hour", 0, 0, 0}, {"10 hour", 0, 0, 0}, {"1 day", 0, 0, 0}, +}; +tSlideMenu g_sPeriodMenu = +{ + &g_sConfigMenu, (sizeof(g_psPeriodMenuItems) / sizeof(tSlideMenuItem)), + g_psPeriodMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Maps items from the period menu to match values for RTC. Lower 8 bits +// is subsecond value, upper 24 bits is seconds. The lower 8 bits represent +// subseconds in 7 bits, right-justififed. So 0x01 is 1/128 of a second. +// The order of the values here needs to match what appears in the PERIOD +// menu in menus.c. +// +//***************************************************************************** +static uint32_t g_pui32LogPeriod[] = +{ + 0x00000004, // 1/32 + 0x00000008, // 1/16 + 0x00000010, // 1/8 + 0x00000020, // 1/4 + 0x00000040, // 1/2 + 0x00000100, // 1s + 0x00000500, // 5s + 0x00000A00, // 10s + 0x00003C00, // 1m - 60s + 0x00012C00, // 5m - 300s + 0x00025800, // 10m - 600s + 0x000E1000, // 1hr - 3600s + 0x00465000, // 5hr - 18000s + 0x008CA000, // 10hr - 36000s + 0x01518000, // 1d - 86400s +}; + +//***************************************************************************** +// +// Define the storage options sub-menu. +// +// (root)-->CONFIG-->STORAGE +// +//***************************************************************************** +tSlideMenuItem g_psStorageMenuItems[] = +{ + {"NONE", 0, 0, 0}, {"USB", 0, 0, 0}, {"HOST PC", 0, 0, 0}, + {"FLASH", 0, 0, 0}, +}; +tSlideMenu g_sStorageMenu = +{ + &g_sConfigMenu, (sizeof(g_psStorageMenuItems) / sizeof(tSlideMenuItem)), + g_psStorageMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the sleep option sub-menu. +// +// (root)-->CONFIG-->SLEEP +// +//***************************************************************************** +tSlideMenuItem g_psSleepMenuItems[] = +{ + {"NO", 0, 0, 0}, {"YES", 0, 0, 0}, +}; + +tSlideMenu g_sSleepMenu = +{ + &g_sConfigMenu, (sizeof(g_psSleepMenuItems) / sizeof(tSlideMenuItem)), + g_psSleepMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the view options sub-menu. +// +// (root)-->VIEW +// +//***************************************************************************** +tSlideMenuItem g_psViewMenuItems[] = +{ + {"AIN0-3", 0, (tWidget *)&g_sAINContainerCanvas, ClrDarkGreen}, + {"ACCEL", 0, (tWidget *)&g_sAccelContainerCanvas, ClrDarkBlue}, + {"TEMPERATURE", 0, (tWidget *)&g_sTempContainerCanvas, ClrDarkBlue}, + {"CURRENT", 0, (tWidget *)&g_sCurrentContainerCanvas, ClrBlack}, + {"GYRO", 0, (tWidget *)&g_sGyroContainerCanvas, ClrDarkBlue}, + {"MAG", 0, (tWidget *)&g_sMagContainerCanvas, ClrDarkBlue}, + {"CLOCK", 0, &g_sClockContainerCanvas.sBase, ClrDarkBlue}, + {"FLASH SPACE", 0, &g_sStatusContainerCanvas.sBase, ClrRed}, +}; +tSlideMenu g_sViewMenu = +{ + &g_psMainMenu, (sizeof(g_psViewMenuItems) / sizeof(tSlideMenuItem)), + g_psViewMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the ERASE confirmation menu. +// +// (root)-->ERASE +// +//***************************************************************************** +tSlideMenuItem g_sConfirmMenuItems[] = +{ + {"ERASE DATA?", 0, &g_sStatusContainerCanvas.sBase, ClrRed}, +}; +tSlideMenu g_sConfirmMenu = +{ + &g_psMainMenu, (sizeof(g_sConfirmMenuItems) / sizeof(tSlideMenuItem)), + g_sConfirmMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the slide menu widget. This is the wigdet that controls and +// displays all the above menus. +// +//***************************************************************************** +SlideMenu(g_sMenuWidget, WIDGET_ROOT, 0, 0, &g_sCFAL96x64x16, 0, 0, 96, 64, + &g_sOffscreenDisplayA, &g_sOffscreenDisplayB, 16, ClrWhite, ClrRed, + ClrBlack, &g_sFontFixed6x8, &g_psMainMenu, 0); + +//***************************************************************************** +// +// This function allows dynamic text fields to be updated. +// +//***************************************************************************** +void +MenuUpdateText(uint32_t ui32TextID, const char *pcText) +{ + // + // If the text field ID is valid, then update the string for that text + // field. The next time the associated widget is painted, the new text + // will be shown. + // + if(ui32TextID < NUM_TEXT_ITEMS) + { + usnprintf(g_pcTextFields[ui32TextID], TEXT_FIELD_LENGTH, "%s", pcText); + } +} + +//***************************************************************************** +// +// Get the state defined by the configuration menu items. +// This function will query the configuration menus to determine the current +// choices for channels, period, etc. These will be stored in the structure +// that was passed to the function. +// +//***************************************************************************** +void +MenuGetState(tConfigState *psState) +{ + int32_t ui32Temp; + + // + // Check the arguments + // + ASSERT(psState); + + if(!psState) + { + return; + } + + // + // Read the various configuration menus and store their state + // + if(SlideMenuFocusItemGet(&g_sSleepMenu) > 0) + { + psState->bSleep = true; + } + else + { + psState->bSleep = false; + } + ui32Temp = SlideMenuFocusItemGet(&g_sStorageMenu);; + psState->ui8Storage = (uint8_t)ui32Temp; + ui32Temp = SlideMenuSelectedGet(&g_sChannelsMenu); + psState->ui16SelectedMask = (uint16_t)ui32Temp; + ui32Temp = g_pui32LogPeriod[SlideMenuFocusItemGet(&g_sPeriodMenu)]; + psState->ui32Period = ui32Temp; +} + +//***************************************************************************** +// +// Set the configuration menu state. +// This function is used to set the state of the configuration menus. This +// is used to "remember" a prior setting when the application is restarted +// or wakes from sleep. +// +//***************************************************************************** +void +MenuSetState(tConfigState *psState) +{ + uint32_t ui32Idx; + + // + // Check the parameters + // + ASSERT(psState); + ASSERT(psState->ui8Storage < CONFIG_STORAGE_CHOICES); + ASSERT(psState->ui32Period & (psState->ui32Period < 0x2000000)); + + // + // Update each configuration menu item to match the new state + // + SlideMenuFocusItemSet(&g_sSleepMenu, psState->bSleep); + SlideMenuFocusItemSet(&g_sStorageMenu, psState->ui8Storage); + SlideMenuSelectedSet(&g_sChannelsMenu, psState->ui16SelectedMask); + + // + // For the period, search the values table to find the index + // + for(ui32Idx = 0; ui32Idx < (sizeof(g_pui32LogPeriod) / sizeof(uint32_t)); + ui32Idx++) + { + if(psState->ui32Period == g_pui32LogPeriod[ui32Idx]) + { + SlideMenuFocusItemSet(&g_sPeriodMenu, ui32Idx); + + // + // Everything has been updated now so return to caller + // + return; + } + } + + // + // If we get to this point, that means that there was no match for the + // period. In that case, set it to default value. + // + SlideMenuFocusItemSet(&g_sPeriodMenu, MENU_CONFIG_PERIOD_DEFAULT); + psState->ui32Period = g_pui32LogPeriod[MENU_CONFIG_PERIOD_DEFAULT]; +} + +//***************************************************************************** +// +// Set the default values for the menu configuration. +// This function is used to initialize the application state configuration with +// some default values for the menu settings. +// +//***************************************************************************** +void +MenuGetDefaultState(tConfigState *psState) +{ + // + // Check the parameters. + // + ASSERT(psState); + + // + // Set default values for all the menu items + // + if(psState) + { + psState->bSleep = false; + psState->ui8Storage = CONFIG_STORAGE_NONE; + psState->ui16SelectedMask = 0; + psState->ui32Period = 0x00000100; // 1 second + } +} + +//***************************************************************************** +// +// Initialize the offscreen buffers and the menu structure. This should be +// called before using the application menus. +// The parameter is a function pointer to a callback function whenever the +// menu widget activates or deactivates a child widget. +// +//***************************************************************************** +void +MenuInit(void (*pfnActive)(tWidget *, tSlideMenuItem *, bool)) +{ + uint32_t ui32Idx; + + // + // Initialize two offscreen displays and assign the palette. These + // buffers are used by the slide menu widget and other parts of the + // application to allow for animation effects. + // + GrOffScreen4BPPInit(&g_sOffscreenDisplayA, g_pui8OffscreenBufA, 96, 64); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayA, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + GrOffScreen4BPPInit(&g_sOffscreenDisplayB, g_pui8OffscreenBufB, 96, 64); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayB, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + + // + // Initialize each of the text fields with a "blank" indication. + // + for(ui32Idx = 0; ui32Idx < NUM_LOG_ITEMS; ui32Idx++) + { + usnprintf(g_pcTextFields[ui32Idx], TEXT_FIELD_LENGTH, "----"); + } + + // + // Set the slide menu widget callback function. + // + SlideMenuActiveCallbackSet(&g_sMenuWidget, pfnActive); +} diff --git a/boards/dk-tm4c123g/qs-logger/menus.h b/boards/dk-tm4c123g/qs-logger/menus.h new file mode 100644 index 0000000..1e282ad --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/menus.h @@ -0,0 +1,85 @@ +//***************************************************************************** +// +// menus.h - Prototypes and definitions for application menus. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __MENUS_H__ +#define __MENUS_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Declare off-screen displays, buffers and menus for access by the rest of the +// application. +// +//***************************************************************************** +extern uint8_t g_pui8OffscreenBufA[]; +extern uint8_t g_pui8OffscreenBufB[]; +extern tDisplay g_sOffscreenDisplayA; +extern tDisplay g_sOffscreenDisplayB; +extern tSlideMenuWidget g_sMenuWidget; +extern tStripChartWidget g_sStripChart; +extern tSlideMenu g_sChannelsMenu; +extern tSlideMenu g_sPeriodMenu; +extern tCanvasWidget g_sAINContainerCanvas; +extern tCanvasWidget g_sAccelContainerCanvas; +extern tCanvasWidget g_sTempContainerCanvas; +extern tCanvasWidget g_sCurrentContainerCanvas; +extern tCanvasWidget g_sGyroContainerCanvas; +extern tCanvasWidget g_sMagContainerCanvas; +extern tCanvasWidget g_sClockContainerCanvas; +extern tCanvasWidget g_sStatusContainerCanvas; +extern tClockSetWidget g_sClockSetter; +extern struct tm g_sTimeClock; + +//***************************************************************************** +// +// Module function prototypes. +// +//***************************************************************************** +extern void MenuInit(void (*pfnActive)(tWidget *, tSlideMenuItem *, bool)); +extern void MenuUpdateText(uint32_t ui32TextID, const char *pcText); +extern void MenuGetState(tConfigState *pState); +extern void MenuSetState(tConfigState *pState); +extern void MenuGetDefaultState(tConfigState *pState); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/boards/dk-tm4c123g/qs-logger/qs-logger.c b/boards/dk-tm4c123g/qs-logger/qs-logger.c new file mode 100644 index 0000000..cc31c48 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/qs-logger.c @@ -0,0 +1,1333 @@ +//***************************************************************************** +// +// qs-logger.c - Data logger Quickstart application for DK-TM4C123G +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include +#include "driverlib/adc.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/hibernate.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "inc/hw_gpio.h" +#include "inc/hw_hibernate.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" +#include "usblib/usblib.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" +#include "drivers/slidemenuwidget.h" +#include "drivers/stripchartwidget.h" +#include "clocksetwidget.h" +#include "qs-logger.h" +#include "images.h" +#include "menus.h" +#include "acquire.h" +#include "usbstick.h" +#include "usbserial.h" +#include "flashstore.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Data Logger (qs-logger)

+//! +//! This example application is a data logger. It can be configured to collect +//! data from up to 10 data sources. The possible data sources are: +//! - 4 analog inputs, 0-20V +//! - 9-axis I2C fusion data (3axis gyro, 3axis accelorometer, 3axis compass) +//! - internal and external temperature sensors +//! - processor current consumption +//! +//! The data logger provides a menu navigation that is operated by the buttons +//! on the board (up, down, left, right, select). The data logger +//! can be configured by using the menus. The following items can be +//! configured: +//! - data sources to be logged +//! - sample rate +//! - storage location +//! - sleep modes +//! - clock +//! +//! Using the data logger: +//! +//! Use the CONFIG menu to configure the data logger. The following choices +//! are provided: +//! +//! - CHANNELS - enable specific channels of data that will be logged +//! - PERIOD - select the sample period +//! - STORAGE - select where the collected data will be stored: +//! - FLASH - stored in the internal flash memory +//! - USB - stored on a connected USB memory stick +//! - HOST PC - transmitted to a host PC via USB OTG virtual serial port +//! - NONE - the data will only be displayed and not stored +//! - SLEEP - select whether or not the board sleeps between samples. Sleep +//! mode is allowed when storing to flash at with a period of 1 second or +//! longer. +//! - CLOCK - allows setting of internal time-of-day clock that is used for +//! time stamping of the sampled data +//! +//! Use the START menu to start the data logger running. It will begin +//! collecting and storing the data. It will continue to collect data until +//! stopped by pressing the left button or select button. +//! +//! While the data logger is collecting data and it is not configured to +//! sleep, a simple strip chart showing the collected data will appear on the +//! display. If the data logger is configured to sleep, then no strip chart +//! will be shown. +//! +//! If the data logger is storing to internal flash memory, it will overwrite +//! the oldest data. If storing to a USB memory device it will store data +//! until the device is full. +//! +//! The VIEW menu allows viewing the values of the data sources in numerical +//! format. When viewed this way the data is not stored. +//! +//! The SAVE menu allows saving data that was stored in internal flash memory +//! to a USB stick. The data will be saved in a text file in CSV format. +//! +//! The ERASE menu is used to erase the internal memory so more data can be +//! saved. +//! +//! When the board running qs-logger is connected to a host PC via +//! the USB OTG connection for the first time, Windows will prompt for a device +//! driver for the board. +//! This can be found in /ti/TivaWare_C_Series-x.x/windows_drivers +//! assuming you installed the software in the default folder. +//! +//! A companion Windows application, logger, can be found in the +//! /ti/TivaWare_C_Series-x.x/tools/bin directory. When the data logger's +//! STORAGE option is set to "HOST PC" and the board is connected to a PC +//! via the USB OTG connection, captured data will be transfered back to the PC +//! using the virtual serial port that the EK board offers. When the logger +//! application is run, it will search for the first connected board +//! and display any sample data received. The application also offers the +//! option to log the data to a file on the PC. +//! +//! Please note that this code will not run on a EK-LM4F232 board due to +//! hardware differences. If tried an error will be show on the screen. +//! For DK-EM4F232 code please see the examples/boards/ek-lm4f232 directory. +// +//***************************************************************************** + +//***************************************************************************** +// +// The clock rate for the SysTick interrupt and a counter of system clock +// ticks. The SysTick interrupt is used for basic timing in the application. +// +//***************************************************************************** +#define CLOCK_RATE 100 +#define MS_PER_SYSTICK (1000 / CLOCK_RATE) +static volatile uint32_t g_ui32TickCount; +uint32_t g_ui32LastTick = 0; + +//***************************************************************************** +// +// A widget handle of the widget that should receive the focus of any button +// events. +// +//***************************************************************************** +static uint32_t g_ui32KeyFocusWidgetHandle; + +//***************************************************************************** +// +// Tracks the data logging state. +// +//***************************************************************************** +typedef enum +{ + eSTATE_IDLE, + eSTATE_LOGGING, + eSTATE_VIEWING, + eSTATE_SAVING, + eSTATE_ERASING, + eSTATE_FREEFLASH, + eSTATE_CLOCKSET, + eSTATE_CLOCKEXIT, +} tLoggerState; +static tLoggerState g_iLoggerState = eSTATE_IDLE; + +//***************************************************************************** +// +// The configuration of the application. This holds the information that +// will need to be saved if sleeping is used. +// +//***************************************************************************** +static tConfigState g_sConfigState; + +//***************************************************************************** +// +// The current state of USB OTG in the system based on the detected mode. +// +//***************************************************************************** +volatile tUSBMode g_iCurrentUSBMode = eUSBModeNone; + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// Forward declaration of callback function used for clock setter widget. +// +//***************************************************************************** +static void ClockSetOkCallback(tWidget *pWidget, bool bOk); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Provide a simple function so other parts of the application can update +// a status display. +// +//***************************************************************************** +void +SetStatusText(const char *pcTitle, const char *pcLine1, const char *pcLine2, + const char *pcLine3) +{ + static const char pcBlankLine[] = " "; + + // + // Check to see if each parameter was passed, and if so then update its + // text field on the status dislay. + // + pcTitle = pcTitle ? pcTitle : pcBlankLine; + MenuUpdateText(TEXT_ITEM_STATUS_TITLE, pcTitle); + pcLine1 = pcLine1 ? pcLine1 : pcBlankLine; + MenuUpdateText(TEXT_ITEM_STATUS1, pcLine1); + pcLine2 = pcLine2 ? pcLine2 : pcBlankLine; + MenuUpdateText(TEXT_ITEM_STATUS2, pcLine2); + pcLine3 = pcLine3 ? pcLine3 : pcBlankLine; + MenuUpdateText(TEXT_ITEM_STATUS3, pcLine3); + + // + // Force a repaint after all the status text fields have been updated. + // + WidgetPaint(WIDGET_ROOT); + WidgetMessageQueueProcess(); +} +//***************************************************************************** +// +// Handles the SysTick timeout interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Increment the tick count. + // + g_ui32TickCount++; +} + +//***************************************************************************** +// +// This function returns the number of ticks since the last time this function +// was called. +// +//***************************************************************************** +uint32_t +GetTickms(void) +{ + uint32_t ui32RetVal, ui32Saved; + + ui32RetVal = g_ui32TickCount; + ui32Saved = ui32RetVal; + + if(ui32Saved > g_ui32LastTick) + { + ui32RetVal = ui32Saved - g_ui32LastTick; + } + else + { + ui32RetVal = g_ui32LastTick - ui32Saved; + } + + // + // This could miss a few milliseconds but the timings here are on a + // much larger scale. + // + g_ui32LastTick = ui32Saved; + + // + // Return the number of milliseconds since the last time this was called. + // + return(ui32RetVal * MS_PER_SYSTICK); +} + +//***************************************************************************** +// +// Callback function for USB OTG mode changes. +// +//***************************************************************************** +static void +ModeCallback(uint32_t ui32Index, tUSBMode iMode) +{ + // + // Save the new mode. + // + g_iCurrentUSBMode = iMode; + + // + // Mode-specific handling code could go here. + // + switch(iMode) + { + case eUSBModeHost: + { + break; + } + case eUSBModeDevice: + { + break; + } + case eUSBModeNone: + { + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// Gets the logger configuration from battery backed memory. +// The configuration is read from the memory in the Hibernate module. +// It is checked for validity. If found to be valid the function returns a +// 0. If not valid, then it returns non-zero. +// +//***************************************************************************** +static int32_t +GetSavedState(tConfigState *psState) +{ + uint32_t ui32StateLen; + uint16_t ui16Crc16; + + // + // Check the arguments + // + ASSERT(psState); + if(!psState) + { + return(1); + } + + // + // Initialize locals. + // + ui32StateLen = sizeof(tConfigState) / 4; + + // + // Read a block from hibernation memory into the application state + // structure. + // + HibernateDataGet((uint32_t *)psState, ui32StateLen); + + // + // Check first to see if the "cookie" value is correct. + // + if(psState->ui32Cookie != STATE_COOKIE) + { + return(1); + } + + // + // Find the 16-bit CRC of the block. The CRC is stored in the last + // location, so subtract 1 word from the count. + // + ui16Crc16 = ROM_Crc16Array(ui32StateLen - 1, (const uint32_t *)psState); + + // + // If the CRC does not match, then the block is not good. + // + if(psState->ui32Crc16 != (uint32_t)ui16Crc16) + { + return(1); + } + + // + // At this point the state structure that was retrieved from the + // battery backed memory has been validated, so return it as a valid + // logger state configuration. + // + return(0); +} + +//***************************************************************************** +// +// Stores the logger configuration to battery backed memory in the +// Hibernation module. The configuration is saved with a cookie value and +// a CRC in order to ensure validity. +// +//***************************************************************************** +static void +SetSavedState(tConfigState *psState) +{ + uint32_t ui32StateLen; + uint16_t ui16Crc16; + + // + // Check the arguments. + // + ASSERT(psState); + + // + // Initialize locals. + // + ui32StateLen = sizeof(tConfigState) / 4; + + if(psState) + { + // + // Write the cookie value to the block + // + psState->ui32Cookie = STATE_COOKIE; + + // + // Find the 16-bit CRC of the block. The CRC is stored in the last + // location, so subtract 1 word from the count. + // + ui16Crc16 = ROM_Crc16Array(ui32StateLen - 1, + (const uint32_t *)psState); + + // + // Save the computed CRC into the structure. + // + psState->ui32Crc16 = (uint32_t)ui16Crc16; + + // + // Now write the entire block to the Hibernate memory. + // + HibernateDataSet((uint32_t *)psState, ui32StateLen); + } +} + +//***************************************************************************** +// +// Populate the application configuration with default values. +// +//***************************************************************************** +static void +GetDefaultState(tConfigState *psState) +{ + // + // Check the arguments + // + ASSERT(psState); + if(psState) + { + // + // get the default values from the menu system + // + MenuGetDefaultState(psState); + + // + // Set the filename to a null string + // + psState->pcFilename[0] = 0; + + // + // Set bogus address for flash storage + // + psState->ui32FlashStore = 0; + + // + // Turn off sleep logging + // + psState->ui32SleepLogging = 0; + } +} + +//***************************************************************************** +// +// Sends a button press message to whichever widget has the button focus. +// +//***************************************************************************** +static void +SendWidgetKeyMessage(uint32_t ui32Msg) +{ + WidgetMessageQueueAdd(WIDGET_ROOT, ui32Msg, g_ui32KeyFocusWidgetHandle, 0, + 1, 1); +} + +//***************************************************************************** +// +// Callback function from the menu widget. This function is called whenever +// the menu is used to activate a child widget that is associated with the +// menu. It is also called when the widget is deactivated and control is +// returned to the menu widget. It can be used to trigger different actions +// depending on which menus are chosen, and to track the state of the +// application and control focus for the user interface. +// +// This function is called in the context of widget tree message processing +// so care should be taken if doing any operation that affects the display +// or widget tree. +// +//***************************************************************************** +static void +WidgetActivated(tWidget *psWidget, tSlideMenuItem *psMenuItem, bool bActivated) +{ + char *pcMenuText; + uint32_t ui32RTC; + + // + // Handle the activation or deactivation of the strip chart. The strip + // chart widget is activated when the user selects the START menu. + // + if(psWidget == &g_sStripChart.sBase) + { + // + // If the strip chart is activated, start the logger running. + // + if(bActivated) + { + // + // Get the current state of the menus + // + MenuGetState(&g_sConfigState); + + // + // Save the state in battery backed memory + // + SetSavedState(&g_sConfigState); + + // + // Start logger and update the logger state + // + AcquireStart(&g_sConfigState); + g_iLoggerState = eSTATE_LOGGING; + } + else + { + // + // If the strip chart is deactivated, stop the logger. + // + AcquireStop(); + g_iLoggerState = eSTATE_IDLE; + } + } + else if((psWidget == &g_sAINContainerCanvas.sBase) || + (psWidget == &g_sAccelContainerCanvas.sBase) || + (psWidget == &g_sCurrentContainerCanvas.sBase) || + (psWidget == &g_sClockContainerCanvas.sBase) || + (psWidget == &g_sTempContainerCanvas.sBase) || + (psWidget == &g_sGyroContainerCanvas.sBase) || + (psWidget == &g_sMagContainerCanvas.sBase)) + { + // + // Handle the activation or deactivation of any of the container + // canvas that is used for showing the acquired data as a numerical + // display. This happens when the VIEW menu is used. + // + // A viewer has been activated. + // + if(bActivated) + { + static tConfigState sLocalState; + + // + // Get the current menu configuration state and save it in a local + // storage. + // + MenuGetState(&sLocalState); + + // + // Modify the state to set values that are suitable for using + // with the viewer. The acquisition rate is set to 1/2 second + // and all channels are selected. The storage medium is set to + // "viewer" so the acquistion module will write the value of + // acquired data to the appropriate viewing canvas. + // + sLocalState.ui8Storage = CONFIG_STORAGE_VIEWER; + sLocalState.ui32Period = 0x00000040; + sLocalState.ui16SelectedMask = 0xffff; + + // + // Start the acquisition module running. + // + AcquireStart(&sLocalState); + g_iLoggerState = eSTATE_VIEWING; + } + else + { + // + // The viewer has been deactivated so turn off the acquisition + // module. + // + AcquireStop(); + g_iLoggerState = eSTATE_IDLE; + } + } + else if(psWidget == &g_sStatusContainerCanvas.sBase) + { + // + // Handle the case when a status display has been activated. This can + // occur when any of several menu items are selected. + // + // Get pointer to the text of the current menu item. + // + if(psMenuItem) + { + pcMenuText = psMenuItem->pcText; + } + else + { + return; + } + + // + // If activated from the SAVE menu, then the flash data needs to be + // saved to USB stick. Enter the saving state. + // + if(!strcmp(pcMenuText, "SAVE")) + { + if(bActivated) + { + g_iLoggerState = eSTATE_SAVING; + } + else + { + g_iLoggerState = eSTATE_IDLE; + } + } + else if(!strcmp(pcMenuText, "ERASE DATA?")) + { + // + // If activated from the ERASE menu, then the flash data needs to + // be erased. Enter the erasing state. + // + if(bActivated) + { + g_iLoggerState = eSTATE_ERASING; + } + else + { + g_iLoggerState = eSTATE_IDLE; + } + } + else if(!strcmp(pcMenuText, "FLASH SPACE")) + { + // + // If activated from the FLASH SPACE menu, then the user will be + // shown a report on the amount of free space in flash. Enter the + // reporting state. + // + if(bActivated) + { + g_iLoggerState = eSTATE_FREEFLASH; + } + else + { + g_iLoggerState = eSTATE_IDLE; + } + } + } + else if(psWidget == &g_sClockSetter.sBase) + { + // + // Handle the activation of the clock setting widget. Deactivation is + // handled through a separate callback. + // + // If the clock setter is activated, load the time structure fields. + // + if(bActivated) + { + // + // Get the current time in seconds from the RTC. + // + ui32RTC = HibernateRTCGet(); + + // + // Convert the RTC time to a time structure. + // + ulocaltime(ui32RTC, &g_sTimeClock); + + // + // Set the callback that will be called when the clock setting + // widget is deactivated. Since the clock setting widget needs + // to take over the focus for button events, it uses a separate + // callback when it is finsihed. + // + ClockSetCallbackSet((tClockSetWidget *)psWidget, + ClockSetOkCallback); + + // + // Give the clock setter widget focus for the button events + // + g_ui32KeyFocusWidgetHandle = (uint32_t)psWidget; + g_iLoggerState = eSTATE_CLOCKSET; + } + } +} + +//***************************************************************************** +// +// This function is called when the user clicks OK or CANCEL in the clock +// setting widget. +// +//***************************************************************************** +static void +ClockSetOkCallback(tWidget *psWidget, bool bOk) +{ + uint32_t ui32RTC; + + // + // Only update the RTC if the OK button was selected. + // + if(bOk) + { + // + // Convert the time structure that was altered by the clock setting + // widget into seconds. + // + ui32RTC = umktime(&g_sTimeClock); + + // + // If the conversion was valid, then write the updated clock to the + // Hibernate RTC. + // + if(ui32RTC != (uint32_t)(-1)) + { + HibernateRTCSet(ui32RTC); + } + } + + // + // Set the state to clock exit so some cleanup can be done from the + // main loop. + // + g_iLoggerState = eSTATE_CLOCKEXIT; +} + +//***************************************************************************** +// +// CheckBoardRevision uses PD1 with a weak pull down resistor to detect the +// development board hardware revision. Code for the LM4F board can run on the +// TM4C, but not vice versa. This function checks for the board verion and +// warns the user if they are using the wrong board / software. +// +// The EK-LM4F232 (green) board uses an analog accelorometer. The DK-TM4C123G +//(red) board uses a digitial I2C 9 axis accel, mag, gyro. +// +//***************************************************************************** +void +CheckBoardRevision(void) +{ + uint32_t ui32BoardType; + tContext sDisplayContext; + // + // Check if board is TM4C123G (red) or LM4F232 (green). This code + // should not be run on green board. + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); + MAP_GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_1, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(GPIO_PORTD_BASE, GPIO_PIN_1, + GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD); + ui32BoardType=MAP_GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_1); + if(ui32BoardType==0) + { + // + // The board is green, print error message and hang. + // + CFAL96x64x16Init(); + GrContextInit(&sDisplayContext, &g_sCFAL96x64x16); + GrContextForegroundSet(&sDisplayContext, ClrWhite); + GrContextFontSet(&sDisplayContext, g_psFontFixed6x8); + GrStringDrawCentered(&sDisplayContext, "ERROR:", -1, + GrContextDpyWidthGet(&sDisplayContext) / 2, 4, 0); + GrStringDrawCentered(&sDisplayContext, "Due to different", -1, + GrContextDpyWidthGet(&sDisplayContext) / 2, 20, false); + GrStringDrawCentered(&sDisplayContext, "hardware this", -1, + GrContextDpyWidthGet(&sDisplayContext) / 2, 30, false); + GrStringDrawCentered(&sDisplayContext, "code cannot run", -1, + GrContextDpyWidthGet(&sDisplayContext) / 2, 40, false); + GrStringDrawCentered(&sDisplayContext, "on this board", -1, + GrContextDpyWidthGet(&sDisplayContext) / 2, 50, false); + GrStringDrawCentered(&sDisplayContext, "Try diff code.", -1, + GrContextDpyWidthGet(&sDisplayContext) / 2, 60, false); + while(1) + { + // Hang here. + } + } + else + { + // + // The board is red, exit & continue as normal. + // + return ; + } +} +//***************************************************************************** +// +// Initialize and operate the data logger. +// +//***************************************************************************** +int +main(void) +{ + tContext sDisplayContext, sBufferContext; + uint32_t ui32HibIntStatus, ui32SysClock, ui32LastTickCount; + bool bSkipSplash; + uint8_t ui8ButtonState, ui8ButtonChanged; + uint_fast8_t ui8X, ui8Y; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + MAP_FPULazyStackingEnable(); + + // + // Set the clocking to run at 50 MHz. + // + MAP_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + ui32SysClock = MAP_SysCtlClockGet(); + + // + // Initialize locals. + // + bSkipSplash = false; + ui32LastTickCount = 0; + + // + // Check Board Revision, report if software / hardware are incompatible + // + CheckBoardRevision(); + + // + // Initialize the data acquisition module. This initializes the ADC + // hardware. + // + AcquireInit(); + + // Enable interrupts to the processor. + // + ROM_IntMasterEnable(); + + // + // Enable access to the hibernate peripheral. If the hibernate peripheral + // was already running then this will have no effect. + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); + + // + // Check to see if the hiberate module is already active and if so then + // read the saved configuration state. If both are okay, then proceed + // to check and see if we are logging data using sleep mode. + // + if(HibernateIsActive() && !GetSavedState(&g_sConfigState)) + { + // + // Read the status of the hibernate module. + // + ui32HibIntStatus = HibernateIntStatus(1); + + // + // If this is a pin wake, that means the user pressed the select + // button and we should terminate the sleep logging. In this case + // we will fall out of this conditional section, and go through the + // normal startup below, but skipping the splash screen so the user + // gets immediate response. + // + if(ui32HibIntStatus & HIBERNATE_INT_PIN_WAKE) + { + // + // Clear the interrupt flag so it is not seen again until another + // wake. + // + HibernateIntClear(HIBERNATE_INT_PIN_WAKE); + bSkipSplash = true; + } + + // + // Otherwise if we are waking from hibernate and it was not a pin + // wake, then it must be from RTC match. Check to see if we are + // sleep logging and if so then go through an abbreviated startup + // in order to collect the data and go back to sleep. + // + else if(g_sConfigState.ui32SleepLogging && + (ui32HibIntStatus & HIBERNATE_INT_RTC_MATCH_0)) + { + // + // Start logger and pass the configuration. The logger should + // configure itself to take one sample. + // + AcquireStart(&g_sConfigState); + g_iLoggerState = eSTATE_LOGGING; + + // + // Enter a forever loop to run the acquisition. This will run + // until a new sample has been taken and stored. + // + while(!AcquireRun()) + { + } + + // + // Getting here means that a data acquisition was performed and we + // can now go back to sleep. Save the configuration and then + // activate the hibernate. + // + SetSavedState(&g_sConfigState); + + // + // Set wake condition on pin-wake or RTC match. Then put the + // processor in hibernation. + // + HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC); + HibernateRequest(); + + // + // Hibernating takes a finite amount of time to occur, so wait + // here forever until hibernate activates and the processor + // power is removed. + // + for(;;) + { + } + } + + // + // Otherwise, this was not a pin wake, and we were not sleep logging, + // so just fall out of this conditional and go through the normal + // startup below. + // + } + else + { + // + // In this case, either the hibernate module was not already active, or + // the saved configuration was not valid. Initialize the configuration + // to the default state and then go through the normal startup below. + // + GetDefaultState(&g_sConfigState); + } + + // + // Enable the Hibernate module to run. + // + HibernateEnableExpClk(SysCtlClockGet()); + + // + // The hibernate peripheral trim register must be set per silicon + // erratum 2.1 + // + HibernateRTCTrimSet(0x7FFF); + + // + // Start the RTC running. If it was already running then this will have + // no effect. + // + HibernateRTCEnable(); + + // + // In case we were sleep logging and are now finished (due to user + // pressing select button), then disable sleep logging so it doesnt + // try to start up again. + // + g_sConfigState.ui32SleepLogging = 0; + SetSavedState(&g_sConfigState); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the buttons driver. + // + ButtonsInit(); + + // + // Pass the restored state to the menu system. + // + MenuSetState(&g_sConfigState); + + // + // Enable the USB peripheral + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Configure the required pins for USB operation. + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + MAP_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + MAP_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + MAP_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + MAP_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Erratum workaround for silicon revision A1. VBUS must have pull-down. + // + if(CLASS_IS_TM4C123 && REVISION_IS_A1) + { + HWREG(GPIO_PORTB_BASE + GPIO_O_PDR) |= GPIO_PIN_1; + } + + // + // Initialize the USB stack mode and pass in a mode callback. + // + USBStackModeSet(0, eUSBModeOTG, ModeCallback); + + // + // Initialize the stack to be used with USB stick. + // + USBStickInit(); + + // + // Initialize the stack to be used as a serial device. + // + USBSerialInit(); + + // + // Initialize the USB controller for dual mode operation with a 2ms polling + // rate. + // + USBOTGModeInit(0, 2000, g_pui8HCDPool, HCD_MEMORY_SIZE); + + // + // Initialize the menus module. This module will control the user + // interface menuing system. + // + MenuInit(WidgetActivated); + + // + // Configure SysTick to periodically interrupt. + // + g_ui32TickCount = 0; + MAP_SysTickPeriodSet(ui32SysClock / CLOCK_RATE); + MAP_SysTickIntEnable(); + MAP_SysTickEnable(); + + // + // Initialize the display context and another context that is used + // as an offscreen drawing buffer for display animation effect + // + GrContextInit(&sDisplayContext, &g_sCFAL96x64x16); + GrContextInit(&sBufferContext, &g_sOffscreenDisplayA); + + // + // Show the splash screen if we are not skipping it. The only reason to + // skip it is if the application was in sleep-logging mode and the user + // just waked it up with the select button. + // + if(!bSkipSplash) + { + const uint8_t *pui8SplashLogo = g_pui8Image_TI_Black; + + // + // Draw the TI logo on the display. Use an animation effect where the + // logo will "slide" onto the screen. Allow select button to break + // out of animation. + // + for(ui8X = 0; ui8X < 96; ui8X++) + { + if(ButtonsPoll(0, 0) & SELECT_BUTTON) + { + break; + } + GrImageDraw(&sDisplayContext, pui8SplashLogo, 95 - ui8X, 0); + } + + // + // Leave the logo on the screen for a long duration. Monitor the + // buttons so that if the user presses the select button, the logo + // display is terminated and the application starts immediately. + // + while(g_ui32TickCount < 400) + { + if(ButtonsPoll(0, 0) & SELECT_BUTTON) + { + break; + } + } + + // + // Extended splash sequence + // + if(ButtonsPoll(0, 0) & UP_BUTTON) + { + for(ui8X = 0; ui8X < 96; ui8X += 4) + { + GrImageDraw(&sDisplayContext, + g_ppui8Image_Splash[(ui8X / 4) & 3], + (int32_t)ui8X - 96L, 0); + GrImageDraw(&sDisplayContext, pui8SplashLogo, ui8X, 0); + MAP_SysCtlDelay(ui32SysClock / 12); + } + MAP_SysCtlDelay(ui32SysClock / 3); + pui8SplashLogo = g_ppui8Image_Splash[4]; + GrImageDraw(&sDisplayContext, pui8SplashLogo, 0, 0); + MAP_SysCtlDelay(ui32SysClock / 12); + } + + // + // Draw the initial menu into the offscreen buffer. + // + SlideMenuDraw(&g_sMenuWidget, &sBufferContext, 0); + + // + // Now, draw both the TI logo splash screen (from above) and the initial + // menu on the screen at the same time, moving the coordinates so that + // the logo "slides" off the display and the menu "slides" onto the + // display. + // + for(ui8Y = 0; ui8Y < 64; ui8Y++) + { + GrImageDraw(&sDisplayContext, pui8SplashLogo, 0, -ui8Y); + GrImageDraw(&sDisplayContext, g_pui8OffscreenBufA, 0, 63 - ui8Y); + } + } + + // + // Add the menu widget to the widget tree and send an initial paint + // request. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sMenuWidget); + WidgetPaint(WIDGET_ROOT); + + // + // Set the focus handle to the menu widget. Any button events will be + // sent to this widget + // + g_ui32KeyFocusWidgetHandle = (uint32_t)&g_sMenuWidget; + + // + // Forever loop to run the application + // + while(1) + { + + // + // Each time the timer tick occurs, process any button events. + // + if(g_ui32TickCount != ui32LastTickCount) + { + // + // Remember last tick count + // + ui32LastTickCount = g_ui32TickCount; + + // + // Read the debounced state of the buttons. + // + ui8ButtonState = ButtonsPoll(&ui8ButtonChanged, 0); + + // + // Pass any button presses through to the widget message + // processing mechanism. The widget that has the button event + // focus (probably the menu widget) will catch these button events. + // + if(BUTTON_PRESSED(SELECT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_SELECT); + } + if(BUTTON_PRESSED(UP_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_UP); + } + if(BUTTON_PRESSED(DOWN_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_DOWN); + } + if(BUTTON_PRESSED(LEFT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_LEFT); + } + if(BUTTON_PRESSED(RIGHT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_RIGHT); + } + } + + // + // Tell the OTG library code how much time has passed in milliseconds + // since the last call. + // + USBOTGMain(GetTickms()); + + // + // Call functions as needed to keep the host or device mode running. + // + if(g_iCurrentUSBMode == eUSBModeDevice) + { + USBSerialRun(); + } + else if(g_iCurrentUSBMode == eUSBModeHost) + { + USBStickRun(); + } + + // + // If in the logging state, then call the logger run function. This + // keeps the data acquisition running. + // + if((g_iLoggerState == eSTATE_LOGGING) || + (g_iLoggerState == eSTATE_VIEWING)) + { + if(AcquireRun() && g_sConfigState.ui32SleepLogging) + { + // + // If sleep logging is enabled, then at this point we have + // stored the first data item, now save the state and start + // hibernation. Wait for the power to be cut. + // + SetSavedState(&g_sConfigState); + HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC); + HibernateRequest(); + for(;;) + { + } + } + + // + // If viewing instead of logging then request a repaint to keep + // the viewing window updated. + // + if(g_iLoggerState == eSTATE_VIEWING) + { + WidgetPaint(WIDGET_ROOT); + } + } + + // + // If in the saving state, then save data from flash storage to + // USB stick. + // + if(g_iLoggerState == eSTATE_SAVING) + { + // + // Save data from flash to USB + // + FlashStoreSave(); + + // + // Return to idle state + // + g_iLoggerState = eSTATE_IDLE; + } + + // + // If in the erasing state, then erase the data stored in flash. + // + if(g_iLoggerState == eSTATE_ERASING) + { + // + // Save data from flash to USB + // + FlashStoreErase(); + + // + // Return to idle state + // + g_iLoggerState = eSTATE_IDLE; + } + + // + // If in the flash reporting state, then show the report of the amount + // of used and free flash memory. + // + if(g_iLoggerState == eSTATE_FREEFLASH) + { + // + // Report free flash space + // + FlashStoreReport(); + + // + // Return to idle state + // + g_iLoggerState = eSTATE_IDLE; + } + + // + // If we are exiting the clock setting widget, that means that control + // needs to be given back to the menu system. + // + if(g_iLoggerState == eSTATE_CLOCKEXIT) + { + // + // Give the button event focus back to the menu system + // + g_ui32KeyFocusWidgetHandle = (uint32_t)&g_sMenuWidget; + + // + // Send a button event to the menu widget that means the left + // key was pressed. This signals the menu widget to deactivate + // the current child widget (which was the clock setting wigdet). + // This will cause the menu widget to slide the clock set widget + // off the screen and resume control of the display. + // + SendWidgetKeyMessage(WIDGET_MSG_KEY_LEFT); + g_iLoggerState = eSTATE_IDLE; + } + + // + // Process any new messages that are in the widget queue. This keeps + // the user interface running. + // + WidgetMessageQueueProcess(); + } +} diff --git a/boards/dk-tm4c123g/qs-logger/qs-logger.ewd b/boards/dk-tm4c123g/qs-logger/qs-logger.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/qs-logger.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/qs-logger/qs-logger.ewp b/boards/dk-tm4c123g/qs-logger/qs-logger.ewp new file mode 100644 index 0000000..68e94ee --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/qs-logger.ewp @@ -0,0 +1,848 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\sensorlib\ewarm\Exe\sensorlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\acquire.c + + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\clocksetwidget.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\flashstore.c + + + $PROJ_DIR$\images.c + + + $PROJ_DIR$\menus.c + + + $PROJ_DIR$\qs-logger.c + + + $PROJ_DIR$\..\drivers\slidemenuwidget.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\stripchartmanager.c + + + $PROJ_DIR$\..\drivers\stripchartwidget.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_serial_structs.c + + + $PROJ_DIR$\usbserial.c + + + $PROJ_DIR$\usbstick.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c123g/qs-logger/qs-logger.h b/boards/dk-tm4c123g/qs-logger/qs-logger.h new file mode 100644 index 0000000..651c108 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/qs-logger.h @@ -0,0 +1,186 @@ +//***************************************************************************** +// +// qs-logger.h - Defines data types used in the data logger application. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __QS_LOGGER_H__ +#define __QS_LOGGER_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines the order of data items to log. It must match the +// order that they appear in the "CHANNELS" menu (see menus.c), and also +// the order they are stored in the ADC data buffer (see acquire.c). +// +//***************************************************************************** +#define LOG_ITEM_USER0 0 +#define LOG_ITEM_USER1 1 +#define LOG_ITEM_USER2 2 +#define LOG_ITEM_USER3 3 +#define LOG_ITEM_ACCELX 4 +#define LOG_ITEM_ACCELY 5 +#define LOG_ITEM_ACCELZ 6 +#define LOG_ITEM_EXTTEMP 7 +#define LOG_ITEM_INTTEMP 8 +#define LOG_ITEM_CURRENT 9 +#define LOG_ITEM_GYROX 10 +#define LOG_ITEM_GYROY 11 +#define LOG_ITEM_GYROZ 12 +#define LOG_ITEM_COMPASSX 13 +#define LOG_ITEM_COMPASSY 14 +#define LOG_ITEM_COMPASSZ 15 +#define NUM_LOG_ITEMS 16 + +//***************************************************************************** +// +// These are additional definitions of items that may be displayed on the +// screen that are not acquired data. These are used for updating dynamic +// text screens on the display. +// +//***************************************************************************** +#define TEXT_ITEM_STATUS1 16 +#define TEXT_ITEM_STATUS2 17 +#define TEXT_ITEM_STATUS3 18 +#define TEXT_ITEM_STATUS_TITLE 19 +#define TEXT_ITEM_DATE 20 +#define TEXT_ITEM_TIME 21 +#define NUM_TEXT_ITEMS 22 + +//***************************************************************************** +// +// A structure that defines a data record. This is the binary format of the +// acquired data that will be stored. +// +//***************************************************************************** +typedef struct +{ + uint32_t ui32Seconds; // 32 bits of seconds + uint16_t ui16Subseconds; // 15 bits of subseconds + uint16_t ui16ItemMask; // 16 bits means maximum 16 items + int16_t pi16Items[]; +} +tLogRecord; + +//***************************************************************************** +// +// This structure defines a container to hold the state of all the +// configuration items. It is used both for passing configuration +// between modules and for persistent storage of the configuration. +// +//***************************************************************************** +typedef struct +{ + // + // A value used to identify this structure + // + uint32_t ui32Cookie; + + // + // A flag to indicate if the data logger is current logging data + // using the sleep mode. The data logger uses this to determine if + // it needs to continue taking samples once it wakes from hibernate. + // This is a 32-bit type just to keep the entire struct 32-bit aligned. + // + uint32_t ui32SleepLogging; + + // + // The period for sampling data. It is stored as a 24.8 seconds.frac + // format. The lower 8 bits represent power-of-2 fractional seconds + // with a resolution of 1/128 seconds (only lower 7 bits are used). + // + uint32_t ui32Period; + + // + // Saved location for writing records to flash. + // + uint32_t ui32FlashStore; + + // + // The name of the USB file currently opened for logging + // + char pcFilename[8]; + + // + // The bit mask of the channels selected for logging. + // + uint16_t ui16SelectedMask; + + // + // A flag indicating whether the data logger should sleep between samples. + // + bool bSleep; + + // + // A value that is used to select the storage medium. + // + uint8_t ui8Storage; + + // + // A checksum for the structure + // + uint32_t ui32Crc16; +} +tConfigState; + +#define STATE_COOKIE 0x0355AAC0 + +//***************************************************************************** +// +// The values indicating which storage medium is to be used for logging data. +// +//***************************************************************************** +#define CONFIG_STORAGE_NONE 0 +#define CONFIG_STORAGE_USB 1 +#define CONFIG_STORAGE_HOSTPC 2 +#define CONFIG_STORAGE_FLASH 3 +#define CONFIG_STORAGE_VIEWER 4 +#define CONFIG_STORAGE_CHOICES 5 + +//***************************************************************************** +// +// Function prototypes. +// +//***************************************************************************** +extern void SetStatusText(const char *pcTitle, const char *pcLine1, + const char *pcLine2, const char *pcLine3); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __QS_LOGGER_H__ diff --git a/boards/dk-tm4c123g/qs-logger/qs-logger.icf b/boards/dk-tm4c123g/qs-logger/qs-logger.icf new file mode 100644 index 0000000..78eafd8 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/qs-logger.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// qs-logger.icf - Linker configuration file for qs-logger. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/qs-logger/qs-logger.ld b/boards/dk-tm4c123g/qs-logger/qs-logger.ld new file mode 100644 index 0000000..a06ce70 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/qs-logger.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * qs-logger.ld - Linker configuration file for qs-logger. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/qs-logger/qs-logger.sct b/boards/dk-tm4c123g/qs-logger/qs-logger.sct new file mode 100644 index 0000000..f497cb7 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/qs-logger.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; qs-logger.sct - Linker configuration file for qs-logger. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/qs-logger/qs-logger.uvopt b/boards/dk-tm4c123g/qs-logger/qs-logger.uvopt new file mode 100644 index 0000000..4e0087e --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/qs-logger.uvopt @@ -0,0 +1,569 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + qs-logger + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\acquire.c + acquire.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\clocksetwidget.c + clocksetwidget.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + fat_usbmsc.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\flashstore.c + flashstore.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\images.c + images.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\menus.c + menus.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\qs-logger.c + qs-logger.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\slidemenuwidget.c + slidemenuwidget.c + + + 1 + 12 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\stripchartmanager.c + stripchartmanager.c + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\stripchartwidget.c + stripchartwidget.c + + + 1 + 15 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 16 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_serial_structs.c + usb_serial_structs.c + + + 1 + 17 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usbserial.c + usbserial.c + + + 1 + 18 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usbstick.c + usbstick.c + + + 1 + 19 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 20 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 21 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 22 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\sensorlib\rvmdk\sensorlib.lib + sensorlib.lib + + + 2 + 23 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 24 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/qs-logger/qs-logger.uvproj b/boards/dk-tm4c123g/qs-logger/qs-logger.uvproj new file mode 100644 index 0000000..74e4c0f --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/qs-logger.uvproj @@ -0,0 +1,524 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + qs-logger + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + qs-logger + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\qs-logger.bin .\rvmdk\qs-logger.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + qs-logger.sct + + + --entry Reset_Handler + + + + + + + + Source + + + acquire.c + 1 + .\acquire.c + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + clocksetwidget.c + 1 + .\clocksetwidget.c + + + fat_usbmsc.c + 1 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + flashstore.c + 1 + .\flashstore.c + + + images.c + 1 + .\images.c + + + menus.c + 1 + .\menus.c + + + qs-logger.c + 1 + .\qs-logger.c + + + slidemenuwidget.c + 1 + ..\drivers\slidemenuwidget.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + stripchartmanager.c + 1 + .\stripchartmanager.c + + + stripchartwidget.c + 1 + ..\drivers\stripchartwidget.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_serial_structs.c + 1 + .\usb_serial_structs.c + + + usbserial.c + 1 + .\usbserial.c + + + usbstick.c + 1 + .\usbstick.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + sensorlib.lib + 4 + ..\..\..\..\sensorlib\rvmdk\sensorlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/qs-logger/qs-logger_ccs.cmd b/boards/dk-tm4c123g/qs-logger/qs-logger_ccs.cmd new file mode 100644 index 0000000..59d7ecf --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/qs-logger_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * qs-logger_ccs.cmd - CCS linker configuration file for qs-logger. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/qs-logger/readme.txt b/boards/dk-tm4c123g/qs-logger/readme.txt new file mode 100644 index 0000000..6d12d0e --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/readme.txt @@ -0,0 +1,97 @@ +Data Logger + +This example application is a data logger. It can be configured to collect +data from up to 10 data sources. The possible data sources are: +- 4 analog inputs, 0-20V +- 9-axis I2C fusion data (3axis gyro, 3axis accelorometer, 3axis compass) +- internal and external temperature sensors +- processor current consumption + +The data logger provides a menu navigation that is operated by the buttons +on the board (up, down, left, right, select). The data logger +can be configured by using the menus. The following items can be +configured: +- data sources to be logged +- sample rate +- storage location +- sleep modes +- clock + +Using the data logger: + +Use the CONFIG menu to configure the data logger. The following choices +are provided: + +- CHANNELS - enable specific channels of data that will be logged +- PERIOD - select the sample period +- STORAGE - select where the collected data will be stored: + - FLASH - stored in the internal flash memory + - USB - stored on a connected USB memory stick + - HOST PC - transmitted to a host PC via USB OTG virtual serial port + - NONE - the data will only be displayed and not stored +- SLEEP - select whether or not the board sleeps between samples. Sleep +mode is allowed when storing to flash at with a period of 1 second or +longer. +- CLOCK - allows setting of internal time-of-day clock that is used for +time stamping of the sampled data + +Use the START menu to start the data logger running. It will begin +collecting and storing the data. It will continue to collect data until +stopped by pressing the left button or select button. + +While the data logger is collecting data and it is not configured to +sleep, a simple strip chart showing the collected data will appear on the +display. If the data logger is configured to sleep, then no strip chart +will be shown. + +If the data logger is storing to internal flash memory, it will overwrite +the oldest data. If storing to a USB memory device it will store data +until the device is full. + +The VIEW menu allows viewing the values of the data sources in numerical +format. When viewed this way the data is not stored. + +The SAVE menu allows saving data that was stored in internal flash memory +to a USB stick. The data will be saved in a text file in CSV format. + +The ERASE menu is used to erase the internal memory so more data can be +saved. + +When the board running qs-logger is connected to a host PC via +the USB OTG connection for the first time, Windows will prompt for a device +driver for the board. +This can be found in /ti/TivaWare_C_Series-x.x/windows_drivers +assuming you installed the software in the default folder. + +A companion Windows application, logger, can be found in the +/ti/TivaWare_C_Series-x.x/tools/bin directory. When the data logger's +STORAGE option is set to "HOST PC" and the board is connected to a PC +via the USB OTG connection, captured data will be transfered back to the PC +using the virtual serial port that the EK board offers. When the logger +application is run, it will search for the first connected board +and display any sample data received. The application also offers the +option to log the data to a file on the PC. + +Please note that this code will not run on a EK-LM4F232 board due to +hardware differences. If tried an error will be show on the screen. +For DK-EM4F232 code please see the examples/boards/ek-lm4f232 directory. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/qs-logger/rvmdk/qs-logger.axf b/boards/dk-tm4c123g/qs-logger/rvmdk/qs-logger.axf new file mode 100644 index 0000000..5aad35c Binary files /dev/null and b/boards/dk-tm4c123g/qs-logger/rvmdk/qs-logger.axf differ diff --git a/boards/dk-tm4c123g/qs-logger/rvmdk/qs-logger.bin b/boards/dk-tm4c123g/qs-logger/rvmdk/qs-logger.bin new file mode 100644 index 0000000..794aab6 Binary files /dev/null and b/boards/dk-tm4c123g/qs-logger/rvmdk/qs-logger.bin differ diff --git a/boards/dk-tm4c123g/qs-logger/startup_ccs.c b/boards/dk-tm4c123g/qs-logger/startup_ccs.c new file mode 100644 index 0000000..3a0ae7d --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/startup_ccs.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void ADC0SS0Handler(void); +extern void IntGPIOb(void); +extern void RTCHandler(void); +extern void MPU9150I2CIntHandler(void); +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntGPIOb, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + ADC0SS0Handler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + RTCHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + MPU9150I2CIntHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/qs-logger/startup_ewarm.c b/boards/dk-tm4c123g/qs-logger/startup_ewarm.c new file mode 100644 index 0000000..ecf005c --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/startup_ewarm.c @@ -0,0 +1,338 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void ADC0SS0Handler(void); +extern void IntGPIOb(void); +extern void RTCHandler(void); +extern void MPU9150I2CIntHandler(void); +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntGPIOb, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + ADC0SS0Handler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + RTCHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + MPU9150I2CIntHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/qs-logger/startup_gcc.c b/boards/dk-tm4c123g/qs-logger/startup_gcc.c new file mode 100644 index 0000000..c8cee2a --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/startup_gcc.c @@ -0,0 +1,354 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void ADC0SS0Handler(void); +extern void IntGPIOb(void); +extern void RTCHandler(void); +extern void MPU9150I2CIntHandler(void); +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntGPIOb, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + ADC0SS0Handler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + RTCHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + MPU9150I2CIntHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/qs-logger/startup_rvmdk.S b/boards/dk-tm4c123g/qs-logger/startup_rvmdk.S new file mode 100644 index 0000000..8c84cb1 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/startup_rvmdk.S @@ -0,0 +1,363 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN ADC0SS0Handler + EXTERN IntGPIOb + EXTERN RTCHandler + EXTERN MPU9150I2CIntHandler + EXTERN SysTickIntHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntGPIOb ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD ADC0SS0Handler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD RTCHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD MPU9150I2CIntHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/qs-logger/stripchartmanager.c b/boards/dk-tm4c123g/qs-logger/stripchartmanager.c new file mode 100644 index 0000000..8e05d5e --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/stripchartmanager.c @@ -0,0 +1,456 @@ +//***************************************************************************** +// +// stripchartmanager.c - Manages a strip chart widget for the data logger. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_types.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/slidemenuwidget.h" +#include "drivers/stripchartwidget.h" +#include "stripchartmanager.h" +#include "clocksetwidget.h" +#include "qs-logger.h" +#include "menus.h" +#include "utils/ustdlib.h" + +//***************************************************************************** +// +// This module manages a strip chart widget for the data logger application. +// It provides functions to make it easy to configure a strip chart for the +// user-selected data series, and to add new data to the strip chart. The +// functions in this module maintain buffers that hold the data for each data +// series that is selected for display on the strip chart. +// +//***************************************************************************** + +//***************************************************************************** +// +// Define a scaling range for each data series. Since multiple kinds of data +// will be shown on the strip chart, no one particular set of units can be +// selected. Instead the strip chart Y axis will just be maintained in units +// of pixels, and the table below maps the Y axis range to min and max values +// for each data series. +// +//***************************************************************************** +typedef struct +{ + int16_t i16Min; + int16_t i16Max; +} tDisplayScaling; + +tDisplayScaling g_psScaling[] = +{ + { 0, 20000 }, // analog channel inputs, + { 0, 20000 }, // 0-20V (20000 mV) + { 0, 20000 }, + { 0, 20000 }, + { -200, 200 }, // accelerometer axes, -10 - 10g + { -200, 200 }, // (units of 1/100g) + { -200, 200 }, + { 0, 500 }, // temperature, 0 - 50C (units of + { 0, 500 }, // 1/10C) + { 0, 400 }, // current, 0 - 40mA (units of 100uA) + { -1200, 1200 }, // Gyrometer -250 to 250 rad/sec + { -1200, 1200 }, // (units of 1/100) + { -1200, 1200 }, + { -60, 60 }, // Magnometer in microTesla -.1mT to .1mT + { -60, 60 }, // to be human friendly + { -60, 60 }, // (unit of 1/100 uT) +}; + +//***************************************************************************** +// +// Defines the maximum number of items that are stored in a data series. This +// matches the width of the strip chart in pixels. +// +//***************************************************************************** +#define SERIES_LENGTH 96 + +//***************************************************************************** +// +// Create an array of strip chart data series, one for each channel of data +// that the data logger can acquire. Fields that are unchanging, such as +// the name of each series, are pre-populated here, while other fields that +// may change are updated by functions. These are the data series that get +// added to the strip chart for each item that is selected for logging. +// +//***************************************************************************** +static tStripChartSeries g_psSeries[] = +{ + { 0, "CH0", 0x000040, 1, 1, 0, 0 }, + { 0, "CH1", ClrLime, 1, 1, 0, 0 }, + { 0, "CH2", ClrAqua, 1, 1, 0, 0 }, + { 0, "CH3", ClrRed, 1, 1, 0, 0 }, + { 0, "ACCELX", ClrBlue, 1, 1, 0, 0 }, + { 0, "ACCELY", 0x00A000, 1, 1, 0, 0 }, + { 0, "ACCELZ", ClrFuchsia, 1, 1, 0, 0 }, + { 0, "CURRENT", ClrYellow, 1, 1, 0, 0 }, + { 0, "EXT TEMP", 0xC00040, 1, 1, 0, 0 }, + { 0, "INT TEMP", 0x60E080, 1, 1, 0, 0 }, + { 0, "GYROX", ClrBlue, 1, 1, 0, 0 }, + { 0, "GYROY", 0x00A000, 1, 1, 0, 0 }, + { 0, "GYROZ", ClrFuchsia, 1, 1, 0, 0 }, + { 0, "MAGX", ClrBlue, 1, 1, 0, 0 }, + { 0, "MAGY", 0x00A000, 1, 1, 0, 0 }, + { 0, "MAGZ", ClrFuchsia, 1, 1, 0, 0 }, +}; +#define MAX_NUM_SERIES (sizeof(g_psSeries) / \ + sizeof(tStripChartSeries)) + +//***************************************************************************** +// +// Defines the X-axis for the strip chart. +// +//***************************************************************************** +static tStripChartAxis g_sAxisX = +{ + "X-AXIS", // title of axis + 0, // label for minimum of axis + 0, // label for maximum of axis + 0, // minimum value for the axis + 95, // maximum value for the axis + 10 // grid interval for the axis +}; + +//***************************************************************************** +// +// Defines the Y-axis for the strip chart. +// +//***************************************************************************** +static tStripChartAxis g_sAxisY = +{ + 0, // title of the axis + 0, // label for minimum of axis + 0, // label for maximum of axis + 0, // minimum value for the axis + 63, // maximum value for the axis + 16 // grid interval for the axis +}; + +//***************************************************************************** +// +// Defines the strip chart widget. This structure must be fully initialized +// by calling the function StripChartMgrInit(). +// +//***************************************************************************** +StripChart(g_sStripChart, 0, 0, 0, 0, 0, 0, 96, 64, 0, g_psFontFixed6x8, + ClrBlack, ClrWhite, ClrWhite, ClrDarkGreen, &g_sAxisX, + &g_sAxisY, 0); + +//***************************************************************************** +// +// Creates a buffer space for the values in the data series. The buffer +// must be large enough to hold all of the data for the maximum possible +// number of data items that are selected. If less than the maximum number +// are selected then some of the buffer space will be unused. +// +//***************************************************************************** +static uint8_t g_pui8SeriesData[MAX_NUM_SERIES * SERIES_LENGTH]; + +//***************************************************************************** +// +// The count of data series that are selected for showing on the strip chart. +// This value is set when the client calls the function StripChartConfigure(). +// +//***************************************************************************** +static uint32_t g_ui32SelectedCount; + +//***************************************************************************** +// +// The number of items (per series) that have been added to the strip chart. +// +//***************************************************************************** +static uint32_t g_ui32ItemCount; + +//***************************************************************************** +// +// A bit mask of the specific data items that have been selected for logging. +// +//***************************************************************************** +static uint32_t g_ui32SelectedMask; + +//***************************************************************************** +// +// Configure the strip chart for a selected set of data series. The selected +// series is passed in as a bit mask. Each bit that is set in the bit mask +// represents a selected series. This function will go through the possible +// set of data series and for each that is selected it will be initialized +// and added to the strip chart. +// +//***************************************************************************** +void +StripChartMgrConfigure(uint32_t ui32SelectedMask) +{ + uint32_t ui32Idx, ui32ItemIdx; + tStripChartSeries *psSeries; + + // + // Save the channel mask for later use + // + g_ui32SelectedMask = ui32SelectedMask; + + // + // Determine how many series are to appear in the strip chart. + // + g_ui32SelectedCount = 0; + ui32Idx = ui32SelectedMask; + while(ui32Idx) + { + if(ui32Idx & 1) + { + g_ui32SelectedCount++; + } + ui32Idx >>= 1; + } + + // + // Reset the number of items that have been stored in the series buffers. + // + g_ui32ItemCount = 0; + + // + // Remove any series that were already added to the strip chart. + // + g_sStripChart.psSeries = 0; + + // + // Loop through all series, and configure the selected series and add + // them to the strip chart. + // + ui32ItemIdx = 0; + for(ui32Idx = 0; ui32Idx < MAX_NUM_SERIES; ui32Idx++) + { + // + // Check to see if this series is selected + // + if((1 << ui32Idx) & ui32SelectedMask) + { + // + // Get a pointer to this series. + // + psSeries = &g_psSeries[ui32Idx]; + + // + // Set the stride for this series. It will be the same as the + // number of enabled data items. + // + psSeries->ui8Stride = g_ui32SelectedCount; + + // + // Set the series data pointer to start at the first location + // in the series buffer where this data item will appear. + // + psSeries->pvData = &g_pui8SeriesData[ui32ItemIdx]; + + // + // Add the series to the strip chart. + // + StripChartSeriesAdd(&g_sStripChart, psSeries); + + // + // Increment the index of selected series. + // + ui32ItemIdx++; + } + } +} + +//***************************************************************************** +// +// Scales the input data value to a Y pixel range according to the scaling +// table at the top of this file. +// +//***************************************************************************** +static uint8_t +ScaleDataToPixelY(int16_t i16Data, int16_t i16Min, int16_t i16Max) +{ + int32_t i32Y; + int16_t i16Range; + + // + // Adjust the input value so that the min will be the bottom of display. + // + i16Data -= i16Min; + + // + // Compute the range of the input that will appear on the display + // + i16Range = i16Max - i16Min; + + // + // Scale the input to the Y pixel range of the display + // + i32Y = (int32_t)i16Data * 63L; + + // + // Add in half of divisor to get proper rounding + // + i32Y += (int32_t)i16Range / 2L; + + // + // Apply final divisor to get Y pixel value on display + // + i32Y /= (int32_t)i16Range; + + // + // If the Y coordinate is out of the range of the display, force the + // value to be just off the display, in order to avoid aliasing to a + // bogus Y pixel value when the return value is converted to a smaller + // data type. + // + if((i32Y < 0) || (i32Y > 63)) + { + i32Y = 64; + } + + // + // Return the Y pixel value + // + return((uint8_t)i32Y); +} + +//***************************************************************************** +// +// Add data items to the strip chart and advance the strip chart position. +// This function will add the items pointed to by the parameter to the data +// series buffer and the strip chart will be updated to reflect the newly +// added data items. +// This function will assume that the number of items passed by the pointer +// is the same as was selected by the function StripChartMgrConfigure(). +// up to the caller to ensure that the amount of data passed matches the +// number of items that were selected when the strip chart was configured. +// +//***************************************************************************** +void +StripChartMgrAddItems(int16_t *pi16DataItems) +{ + uint32_t ui32Idx, ui32SelectedMask = g_ui32SelectedMask; + uint8_t *pui8NewData; + + // + // Check for valid input data pointer + // + if(!pi16DataItems) + { + return; + } + + // + // If the number count of items in the strip chart is at the maximum, then + // the items need to "slide down" and new data added to the end of the + // buffer. + // + if(g_ui32ItemCount == SERIES_LENGTH) + { + memmove(&g_pui8SeriesData[0], &g_pui8SeriesData[g_ui32SelectedCount], + SERIES_LENGTH * g_ui32SelectedCount); + + // + // Set the pointer for newly added data to be the end of the series + // buffer. + // + pui8NewData = &g_pui8SeriesData[(SERIES_LENGTH - 1) * + g_ui32SelectedCount]; + } + else + { + + // + // Otherwise, the series data buffer is less than full so compute the + // correct location in the buffer for the new data to be added. + // + pui8NewData = &g_pui8SeriesData[g_ui32ItemCount * + g_ui32SelectedCount]; + + // + // Increment the number of items that have been added to the strip + // chart series data buffer. + // + g_ui32ItemCount++; + + // + // Since the count of data items has changed, it must be updated for + // each series. + // + for(ui32Idx = 0; ui32Idx < MAX_NUM_SERIES; ui32Idx++) + { + g_psSeries[ui32Idx].ui16NumItems = g_ui32ItemCount; + } + } + + // + // Convert each of the input data items being added to the strip chart + // to a scaled Y pixel value. + // + ui32Idx = 0; + while(ui32SelectedMask) + { + // + // Is this data item being added to the chart? + // + if(ui32SelectedMask & 1) + { + // + // Scale the data item and add it to the series buffer + // + *pui8NewData = ScaleDataToPixelY(*pi16DataItems, + g_psScaling[ui32Idx].i16Min, + g_psScaling[ui32Idx].i16Max); + + // + // Increment the from/to pointers + // + pui8NewData++; + pi16DataItems++; + } + ui32Idx++; + ui32SelectedMask >>= 1; + } + + // + // Now that data has been added to the strip chart series buffers, either + // at the end or in the middle, advance the strip chart position by 1. + // Add a request for painting the strip chart widget. + // + StripChartAdvance(&g_sStripChart, 1); + WidgetPaint(WIDGET_ROOT); +} + +//***************************************************************************** +// +// Initializes the strip chart manager. The strip chart needs an on-screen +// and off-screen display for drawing. These are passed using the init +// function. +// +//***************************************************************************** +void +StripChartMgrInit(void) +{ + g_sStripChart.sBase.psDisplay = &g_sCFAL96x64x16; + g_sStripChart.psOffscreenDisplay = &g_sOffscreenDisplayA; +} diff --git a/boards/dk-tm4c123g/qs-logger/stripchartmanager.h b/boards/dk-tm4c123g/qs-logger/stripchartmanager.h new file mode 100644 index 0000000..f56d47f --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/stripchartmanager.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// stripchartmanager.h - Header for data logger strip chart manager. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** +#ifndef __STRIPCHARTMANAGER_H__ +#define __STRIPCHARTMANAGER_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Public data. +// +//***************************************************************************** +extern tStripChartWidget g_sStripChart; + +//***************************************************************************** +// +// Function prototypes. +// +//***************************************************************************** +extern void StripChartMgrConfigure(uint32_t ui32SelectedMask); +extern void StripChartMgrAddItems(int16_t *pi16DataItems); +extern void StripChartMgrInit(void); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __STRIPCHARTMANAGER_H__ diff --git a/boards/dk-tm4c123g/qs-logger/usb_serial_structs.c b/boards/dk-tm4c123g/qs-logger/usb_serial_structs.c new file mode 100644 index 0000000..2996e94 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/usb_serial_structs.c @@ -0,0 +1,217 @@ +//***************************************************************************** +// +// usb_serial_structs.c - Data structures defining this CDC USB device. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "usb_serial_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + 2 + (30 * 2), + USB_DTYPE_STRING, + 'S', 0, 't', 0, 'e', 0, 'l', 0, 'l', 0, 'a', 0, 'r', 0, 'i', 0, + 's', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, 'a', 0, ' ', 0, 'L', 0, + 'o', 0, 'g', 0, 'g', 0, 'e', 0, 'r', 0, ' ', 0, 'C', 0, 'O', 0, + 'M', 0, ' ', 0, 'P', 0, 'o', 0, 'r', 0, 't', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + 2 + (8 * 2), + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The control interface description string. +// +//***************************************************************************** +const uint8_t g_pui8ControlInterfaceString[] = +{ + 2 + (21 * 2), + USB_DTYPE_STRING, + 'A', 0, 'C', 0, 'M', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 't', 0, + 'r', 0, 'o', 0, 'l', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, + 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + 2 + (26 * 2), + USB_DTYPE_STRING, + 'S', 0, 'e', 0, 'l', 0, 'f', 0, ' ', 0, 'P', 0, 'o', 0, 'w', 0, + 'e', 0, 'r', 0, 'e', 0, 'd', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, + 'f', 0, 'i', 0, 'g', 0, 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, + 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_pui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8ControlInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_pui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// CDC device callback function prototypes. +// +//***************************************************************************** +uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData); +uint32_t TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData); +uint32_t ControlHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +//***************************************************************************** +// +// The CDC device initialization and customization structures. In this case, +// we are using USBBuffers between the CDC device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the CDC channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our CDC instance structure. +// +//***************************************************************************** +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; + +tUSBDCDCDevice g_sCDCDevice = +{ + USB_VID_TI_1CBE, + USB_PID_DATA_LOGGER, + 0, + USB_CONF_ATTR_SELF_PWR, + ControlHandler, + (void *)&g_sCDCDevice, + USBBufferEventCallback, + (void *)&g_sRxBuffer, + USBBufferEventCallback, + (void *)&g_sTxBuffer, + g_pui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; + +//***************************************************************************** +// +// Receive buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBRxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8RxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sRxBuffer = +{ + false, // This is a receive buffer. + RxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device ptr. + USBDCDCPacketRead, // pfnTransfer + USBDCDCRxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pui8USBRxBuffer, // pui8Buffer + UART_BUFFER_SIZE, // ui32BufferSize + g_pui8RxBufferWorkspace // pvWorkspace +}; + +//***************************************************************************** +// +// Transmit buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBTxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8TxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sTxBuffer = +{ + true, // This is a transmit buffer. + TxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device ptr. + USBDCDCPacketWrite, // pfnTransfer + USBDCDCTxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pui8USBTxBuffer, // pi8Buffer + UART_BUFFER_SIZE, // ui32BufferSize + g_pui8TxBufferWorkspace // pvWorkspace +}; diff --git a/boards/dk-tm4c123g/qs-logger/usb_serial_structs.h b/boards/dk-tm4c123g/qs-logger/usb_serial_structs.h new file mode 100644 index 0000000..34d48b4 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/usb_serial_structs.h @@ -0,0 +1,49 @@ +//***************************************************************************** +// +// usb_serial_structs.h - Data structures defining this USB CDC device. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_SERIAL_STRUCTS_H_ +#define _USB_SERIAL_STRUCTS_H_ + +//***************************************************************************** +// +// The size of the transmit and receive buffers used for the redirected UART. +// This number should be a power of 2 for best performance. 256 is chosen +// pretty much at random though the buffer should be at least twice the size of +// a maxmum-sized USB packet. +// +//***************************************************************************** +#define UART_BUFFER_SIZE 256 + +extern uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +extern uint32_t TxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; +extern tUSBDCDCDevice g_sCDCDevice; +extern uint8_t g_pui8USBTxBuffer[]; +extern uint8_t g_pui8USBRxBuffer[]; + +#endif diff --git a/boards/dk-tm4c123g/qs-logger/usbserial.c b/boards/dk-tm4c123g/qs-logger/usbserial.c new file mode 100644 index 0000000..ac17ca9 --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/usbserial.c @@ -0,0 +1,459 @@ +//***************************************************************************** +// +// usbserial.c - Data logger module to handle serial device functions. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "driverlib/debug.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "usb_serial_structs.h" +#include "qs-logger.h" + +//***************************************************************************** +// +// This module manages the USB serial device function. It is used when the +// eval board is connected to a host PC as a serial device, and can transmit +// data log records to the host PC through a virtual serial port. +// +//***************************************************************************** + +//***************************************************************************** +// +// Global flag indicating that a USB device configuration is made. +// +//***************************************************************************** +static volatile bool g_bUSBDevConnected = false; + +//***************************************************************************** +// +// The line coding parameters for the virtual serial port. Since there is +// no physical port this does not have any real effect, but we have a default +// set of values to report if asked, and will remember whatever the host +// configures. +// +//***************************************************************************** +static tLineCoding g_sLineCoding = +{ + 115200, USB_CDC_STOP_BITS_1, USB_CDC_PARITY_NONE, 8 +}; + +//***************************************************************************** +// +// Set the communication parameters for the virtual serial port. +// +//***************************************************************************** +static bool +SetLineCoding(tLineCoding *psLineCoding) +{ + // + // Copy whatever the host passes into our copy of line parameters. + // + memcpy(&g_sLineCoding, psLineCoding, sizeof(tLineCoding)); + + // + // ALways return success + // + return(true); +} + +//***************************************************************************** +// +// Get the communication parameters in use on the UART. +// +//***************************************************************************** +static void +GetLineCoding(tLineCoding *psLineCoding) +{ + // + // Copy whatever we have stored as the line parameter to the host. + // + memcpy(psLineCoding, &g_sLineCoding, sizeof(tLineCoding)); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to control and setup of the device. +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to perform control-related +// operations on behalf of the USB host. These functions include setting +// and querying the serial communication parameters, setting handshake line +// states and sending break conditions. +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +ControlHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData) +{ + // + // Which event are we being asked to process? + // + switch(ui32Event) + { + // + // We are connected to a host and communication is now possible. + // + case USB_EVENT_CONNECTED: + { + g_bUSBDevConnected = true; + + // + // Flush our buffers. + // + USBBufferFlush(&g_sTxBuffer); + USBBufferFlush(&g_sRxBuffer); + break; + } + + // + // The host has disconnected. + // + case USB_EVENT_DISCONNECTED: + { + g_bUSBDevConnected = false; + break; + } + + // + // Return the current serial communication parameters. + // + case USBD_CDC_EVENT_GET_LINE_CODING: + { + GetLineCoding(pvMsgData); + break; + } + + // + // Set the current serial communication parameters. + // + case USBD_CDC_EVENT_SET_LINE_CODING: + { + SetLineCoding(pvMsgData); + break; + } + + // + // The following line control events can be ignored because there is + // no physical serial port to manage. + // + case USBD_CDC_EVENT_SET_CONTROL_LINE_STATE: + case USBD_CDC_EVENT_SEND_BREAK: + case USBD_CDC_EVENT_CLEAR_BREAK: + { + break; + } + + // + // Ignore SUSPEND and RESUME for now. + // + case USB_EVENT_SUSPEND: + case USB_EVENT_RESUME: + { + break; + } + + // + // An unknown event occurred. + // + default: + { + break; + } + } + + // + // Return control to USB stack + // + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the transmit channel (data to +// the USB host). +// +// \param ui32CBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event have we been sent? + // + switch(ui32Event) + { + case USB_EVENT_TX_COMPLETE: + { + // + // Since we are using the USBBuffer, we don't need to do anything + // here. + // + break; + } + + // + // We don't expect to receive any other events. + // + default: + { + break; + } + } + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the receive channel (data from +// the USB host). +// +// \param ui32CBData is the client-supplied callback data value for this +// channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event are we being sent? + // + switch(ui32Event) + { + // + // A new packet has been received. + // + case USB_EVENT_RX_AVAILABLE: + { + // + // We do not ever expect to receive serial data, so just flush + // the RX buffer if any data actually comes in. + // + USBBufferFlush(&g_sRxBuffer); + break; + } + + // + // We are being asked how much unprocessed data we have still to + // process. Since there is no actual serial port and we are not + // processing any RX data, just return 0. + // + case USB_EVENT_DATA_REMAINING: + { + return(0); + } + + // + // We are being asked to provide a buffer into which the next packet + // can be read. We do not support this mode of receiving data so let + // the driver know by returning 0. The CDC driver should not be sending + // this message but this is included just for illustration and + // completeness. + // + case USB_EVENT_REQUEST_BUFFER: + { + return(0); + } + + // + // We don't expect to receive any other events. + // + default: + { + break; + } + } + return(0); +} + +//***************************************************************************** +// +// Initializes the USB serial device. +// +//***************************************************************************** +void +USBSerialInit(void) +{ + // + // Initialize the transmit and receive buffers. + // + USBBufferInit((tUSBBuffer *)&g_sTxBuffer); + USBBufferInit((tUSBBuffer *)&g_sRxBuffer); + + // + // Initialize the USB library CDC device function. + // + USBDCDCInit(0, (tUSBDCDCDevice *)&g_sCDCDevice); +} + +//***************************************************************************** +// +// This is called by the application main loop to perform regular processing. +// This is just a stub here because everything is event or interrupt driven. +// +//***************************************************************************** +void +USBSerialRun(void) +{ +} + +//***************************************************************************** +// +// Write a data record to the serial port. An acquired data record is passed +// in and is composed into a binary packet and sent on the serial port. The +// host PC, if connected will receive this packet via the virtual serial port, +// and can decode and display the data. +// +// The binary packet has the following format: +// - 16-bit header, value 0x5351 +// - 32-bit seconds time stamp +// - 16-bit fractional seconds time stamp (1/32768 resolution) +// - 16-bit data item selection mask (which items are included in the record) +// - multiple 16-bit data item values, per selection mask +// - 16-bit checksum which when added to the 16-bit sum of the entire packet +// will result in 0. +// +// The entire packet is transmitted bytewise over the virtual serial port, +// little-endian format. +// +//***************************************************************************** +int32_t +USBSerialWriteRecord(tLogRecord *psRecord) +{ + uint32_t ui32Idx; + uint16_t ui16Checksum; + uint32_t ui32ItemCount; + uint16_t *pui16Buf; + + // + // Check the arguments + // + ASSERT(psRecord); + if(!psRecord) + { + return(1); + } + + // + // Check state for ready device + // + if(!g_bUSBDevConnected) + { + return(1); + } + + // + // Determine how many channels are to be logged + // + ui32Idx = psRecord->ui16ItemMask; + ui32ItemCount = 0; + while(ui32Idx) + { + if(ui32Idx & 1) + { + ui32ItemCount++; + } + ui32Idx >>= 1; + } + + // + // Add to item count the equivalent number of 16-bit words for timestamp + // and selection mask. + // + ui32ItemCount += 4; + + // + // Put the header word in the USB buffer + // + ui16Checksum = 0x5351; + USBBufferWrite((tUSBBuffer *)&g_sTxBuffer, (uint8_t *)&ui16Checksum, 2); + + // + // Compute the checksum over the entire record + // + pui16Buf = (uint16_t *)psRecord; + for(ui32Idx = 0; ui32Idx < ui32ItemCount; ui32Idx++) + { + ui16Checksum += pui16Buf[ui32Idx]; + } + + // + // Convert item count to bytes. This now represents the entire record + // size in bytes, not including the checksum. The header has already + // been sent + // + ui32ItemCount *= 2; + + // + // Transmit the record, which includes the time stamp, selection mask + // and all selected data item, to the USB buffer + // + USBBufferWrite((tUSBBuffer *)&g_sTxBuffer, (uint8_t *)pui16Buf, + ui32ItemCount); + + // + // Adjust the checksum so that when added (as uint16_t) to the sum of the + // rest of the packet, the result will be 0 + // + ui16Checksum = (uint16_t)(0x10000L - (uint32_t)ui16Checksum); + + // + // Transmit the checksum which is the end of the packet + // + USBBufferWrite((tUSBBuffer *)&g_sTxBuffer, (uint8_t *)&ui16Checksum, 2); + + // + // Return success to the caller + // + return(0); +} diff --git a/boards/dk-tm4c123g/qs-logger/usbserial.h b/boards/dk-tm4c123g/qs-logger/usbserial.h new file mode 100644 index 0000000..b1777fe --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/usbserial.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// usbserial.h - Prototypes and definitions for USB serial module. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** +#ifndef __USBSERIAL_H__ +#define __USBSERIAL_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Module function prototypes. +// +//***************************************************************************** +extern void USBSerialInit(void); +extern void USBSerialRun(void); +extern int USBSerialWriteRecord(tLogRecord *psRecord); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __USBSERIAL_H__ diff --git a/boards/dk-tm4c123g/qs-logger/usbstick.c b/boards/dk-tm4c123g/qs-logger/usbstick.c new file mode 100644 index 0000000..90ed5cd --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/usbstick.c @@ -0,0 +1,818 @@ +//***************************************************************************** +// +// usbstick.c - Data logger module to handle USB mass storage. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "driverlib/debug.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhmsc.h" +#include "utils/ustdlib.h" +#include "third_party/fatfs/src/ff.h" +#include "qs-logger.h" +#include "usbstick.h" + +//***************************************************************************** +// +// This module manages the USB host mass storage function. It is used when +// there is a USB memory stick attached to the evaluation board. It manages +// the USB connection and stores data log records to the attached mass +// storage device. +// +//***************************************************************************** + +//***************************************************************************** +// +// A line of text that is written to the start of a CSV file, to provide +// column headings. +// +//***************************************************************************** +static const char g_pcCSVHeaderLine[] = + "Time(s),Frac. seconds," \ + "CH0(mV),CH1(mV),CH2(mV),CH3(mV)," \ + "AccelX(.01g),AccelY(.01g),AccelZ(.01g)," \ + "Ext. Temp(.1C),Int. Temp(.1C),Current(100uA)," \ + "GyroX(.01 rad/s),GyroY(.01 rad/s),GyroZ(.01 rad/s)," \ + "MagX(uT),MagY(uT),MagZ(uT)\r\n"; + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static FIL g_sFileObject; + +//***************************************************************************** +// +// Holds global flags for the system. +// +//***************************************************************************** +static volatile uint32_t g_ui32Flags = 0; + +//***************************************************************************** +// +// Flag indicating that some USB device is connected. +// +//***************************************************************************** +#define FLAGS_DEVICE_PRESENT 0x00000001 +#define FLAGS_FILE_OPENED 0x00000002 + +//***************************************************************************** +// +// Hold the current state for the application. +// +//***************************************************************************** +volatile enum +{ + // + // No device is present. + // + eSTATE_NO_DEVICE, + + // + // Mass storage device is being enumerated. + // + eSTATE_DEVICE_ENUM, + + // + // Mass storage device is ready. + // + eSTATE_DEVICE_READY, + + // + // An unsupported device has been attached. + // + eSTATE_UNKNOWN_DEVICE, + + // + // A power fault has occurred. + // + eSTATE_POWER_FAULT +} +g_iState; + +//***************************************************************************** +// +// The instance data for the MSC driver. +// +//***************************************************************************** +tUSBHMSCInstance *g_psMSCInstance = 0; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the MSC class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostMSCClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. In this application uDMA is only used for USB, +// so only the first 6 channels are needed. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[6]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[6]; +#else +tDMAControlTable g_psDMAControlTable[6] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// Initializes the file system module. +// +// \param None. +// +// This function initializes the third party FAT implementation. +// +// \return Returns \e true on success or \e false on failure. +// +//***************************************************************************** +static bool +FileInit(void) +{ + // + // Mount the file system, using logical disk 0. + // + if(f_mount(0, &g_sFatFs) != FR_OK) + { + return(false); + } + return(true); +} + +//***************************************************************************** +// +// This is the callback from the MSC driver. +// +// \param ui32Instance is the driver instance which is needed when +// communicating with the driver. +// \param ui32Event is one of the events defined by the driver. +// \param pvData is a pointer to data passed into the initial call to register +// the callback. +// +// This function handles callback events from the MSC driver. The only events +// currently handled are the MSC_EVENT_OPEN and MSC_EVENT_CLOSE. This allows +// the main routine to know when an MSC device has been detected and +// enumerated and when an MSC device has been removed from the system. +// +// \return None +// +//***************************************************************************** +static void +MSCCallback(tUSBHMSCInstance *psMSCInstance, uint32_t ui32Event, void *pvData) +{ + // + // Determine the event. + // + switch(ui32Event) + { + // + // Called when the device driver has successfully enumerated an MSC + // device. + // + case MSC_EVENT_OPEN: + { + // + // Proceed to the enumeration state. + // + g_iState = eSTATE_DEVICE_ENUM; + + break; + } + + // + // Called when the device driver has been unloaded due to error or + // the device is no longer present. + // + case MSC_EVENT_CLOSE: + { + // + // Go back to the "no device" state and wait for a new connection. + // + g_iState = eSTATE_NO_DEVICE; + + // + // Re-initialize the file system. + // + FileInit(); + + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the mass storage device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *psEventInfo; + + // + // Cast this pointer to its actual type. + // + psEventInfo = (tEventInfo *)pvData; + + // + // Process each kind of event + // + switch(psEventInfo->ui32Event) + { + // + // An unknown device has been connected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + // + // An unknown device was detected. + // + g_iState = eSTATE_UNKNOWN_DEVICE; + break; + } + + // + // The unknown device has been been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Unknown device has been removed. + // + g_iState = eSTATE_NO_DEVICE; + break; + } + + // + // A bus power fault was detected. + // + case USB_EVENT_POWER_FAULT: + { + // + // No power means no device is present. + // + g_iState = eSTATE_POWER_FAULT; + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// Initializes the USB stack for mass storage. +// +//***************************************************************************** +void +USBStickInit(void) +{ + // + // Enable the uDMA controller and set up the control table base. + // The uDMA controller is used by the USB library. + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + MAP_uDMAEnable(); + MAP_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initially wait for device connection. + // + g_iState = eSTATE_NO_DEVICE; + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the mass storage class driver. + // + g_psMSCInstance = USBHMSCDriveOpen(0, MSCCallback); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Run initial pass through USB host stack. + // + USBHCDMain(); + + // + // Initialize the file system. + // + FileInit(); +} + +//***************************************************************************** +// +// This is called by the application main loop to perform regular processing. +// It keeps the USB host stack running and tracks the state of the attached +// device. +// +//***************************************************************************** +void +USBStickRun(void) +{ + // + // Call the USB stack to keep it running. + // + USBHCDMain(); + + // + // Take action based on the application state. + // + switch(g_iState) + { + // + // A device has enumerated. + // + case eSTATE_DEVICE_ENUM: + { + // + // Check to see if the device is ready. If not then stay + // in this state and we will check it again on the next pass. + // + if(USBHMSCDriveReady(g_psMSCInstance) != 0) + { + // + // Wait about 500ms before attempting to check if the + // device is ready again. + // + MAP_SysCtlDelay(MAP_SysCtlClockGet()/3); + break; + } + + // + // If there were no errors reported, we are ready for + // MSC operation. + // + g_iState = eSTATE_DEVICE_READY; + + // + // Set the Device Present flag. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + + break; + } + + // + // If there is no device then just wait for one. + // + case eSTATE_NO_DEVICE: + { + if(g_ui32Flags == FLAGS_DEVICE_PRESENT) + { + // + // Clear the Device Present flag. + // + g_ui32Flags &= ~(FLAGS_DEVICE_PRESENT | FLAGS_FILE_OPENED); + } + break; + } + + // + // An unknown device was connected. + // + case eSTATE_UNKNOWN_DEVICE: + { + // + // If this is a new device then change the status. + // + if((g_ui32Flags & FLAGS_DEVICE_PRESENT) == 0) + { + // + // Unknown device is present + // + } + + // + // Set the Device Present flag even though the unknown device + // is not useful to us. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + break; + } + + // + // The device is ready and in use. + // + case eSTATE_DEVICE_READY: + { + break; + } + + // + // Something has caused a power fault. + // + case eSTATE_POWER_FAULT: + { + break; + } + + // + // Unexpected USB state. Set back to default. + // + default: + { + g_iState = eSTATE_NO_DEVICE; + g_ui32Flags &= ~(FLAGS_DEVICE_PRESENT | FLAGS_FILE_OPENED); + break; + } + } +} + +//***************************************************************************** +// +// This is called when the data logging is stopped. It performs a sync +// to the file system which should flush any buffered data to the storage +// device. +// +//***************************************************************************** +void +USBStickCloseFile(void) +{ + f_close(&g_sFileObject); + g_ui32Flags &= ~FLAGS_FILE_OPENED; +} + +//***************************************************************************** +// +// Create a file name for the file to be saved on the memory stick. +// This function uses an incrementing numerical search scheme to determine +// an available file name. It tries opening file names in succession until +// it finds a file that does not yet exist. +// The file name will be of the form LOGnnnn.CSV. +// The caller supplies storage for the file name through the pcFilename +// parameter. +// The function will return 0 if successful and non-zero if a file name could +// not be found. +// +//***************************************************************************** +static int32_t +CreateFileName(char *pcFilename, uint32_t ui32Len) +{ + FRESULT iFResult; + uint32_t ui32FileNum = 0; + + // + // Enter loop to search for available file name + // + do + { + // + // Prepare a numerical based file name and attempt to open it + // + usnprintf(pcFilename, ui32Len, "LOG%04d.CSV", ui32FileNum); + iFResult = f_open(&g_sFileObject, pcFilename, FA_OPEN_EXISTING); + + // + // If file does not exist, then we have found a useable file name + // + if(iFResult == FR_NO_FILE) + { + // + // Return to caller, indicating that a file name has been found. + // + return(0); + } + + // + // Otherwise, advance to the next number in the file name sequence. + // + ui32FileNum++; + + } while(ui32FileNum < 1000); + + // + // If we reach this point, it means that no useable file name was found + // after attempting 10000 file names. + // + return(1); +} + +//***************************************************************************** +// +// This is called at the start of logging to open a file on the storage +// device in preparation for saving data. If no file name is specified, then +// a new file will be created. +// +// If a file name is specified, then that will be used instead of searching +// for an available file. The file name that is passed in must be a maximum +// of 8 characters (9 including trailing 0) and represents the first part of +// the file name not including the extension. +// +// The function returns a pointer to the first part of the file name +// (without file extension). It can be up to 8 characters (9 including the +// trailing 0). If there is any error then a NULL pointer is returned. +// +//***************************************************************************** +char * +USBStickOpenLogFile(char *pcFilename8) +{ + FRESULT iFResult; + uint32_t ui32BytesWritten; + static char pcFilename[16]; + uint32_t ui32Len; + + // + // Check state for ready device + // + g_ui32Flags &= ~FLAGS_FILE_OPENED; + if(g_iState == eSTATE_DEVICE_READY) + { + // + // If a file name is specified then open that file + // + if(pcFilename8 && pcFilename8[0]) + { + // + // Copy the filename into local storage and cap at 8 characters + // length. + // + memcpy(pcFilename, pcFilename8, 8); + pcFilename[8] = 0; + + // + // Find the actual length of the string (8 chars or less) so we + // know where to add the extension. + // + ui32Len = strlen(pcFilename); + + // + // Add the extension to the file name. + // + usnprintf(&pcFilename[ui32Len], 5, ".CSV"); + } + + // + // Otherwise no file name was specified so create a new one. + // + else + { + if(CreateFileName(pcFilename, sizeof(pcFilename))) + { + // + // There was a problem creating a file name so return an error + // + return(0); + } + } + + // + // Open the file by name that was determined above. If the file exists + // it will be opened, and if not it will be created. + // + iFResult = f_open(&g_sFileObject, pcFilename, (FA_OPEN_ALWAYS | + FA_WRITE)); + if(iFResult != FR_OK) + { + return(0); + } + + // + // Since it is possible that the file already existed when opened, + // seek to the end of the file so new data will be appended. If this + // is a new file then this will just be the beginning of the file. + // + iFResult = f_lseek(&g_sFileObject, g_sFileObject.fsize); + if(iFResult != FR_OK) + { + return(0); + } + + // + // Set flag to indicate file is now opened. + // + g_ui32Flags |= FLAGS_FILE_OPENED; + + // + // If no file name was specified, then this is a new file so write a + // header line with column titles to the CSV file. + // + if(!pcFilename8 || !pcFilename8[0]) + { + // + // Write a header line to the CSV file + // + iFResult = f_write(&g_sFileObject, g_pcCSVHeaderLine, + sizeof(g_pcCSVHeaderLine), + (UINT *)&ui32BytesWritten); + if(iFResult != FR_OK) + { + g_ui32Flags &= ~FLAGS_FILE_OPENED; + return(0); + } + + // + // Since no file name was specified that means a file name was + // created. Terminate the new file name at the '.' separator + // and return it to the caller. We know that created file names + // are always 7 characters. Return the newly created file name + // (the part before the '.') + // + pcFilename[7] = 0; + return(pcFilename); + } + + // + // Otherwise, a file name was specified, so no need to write a + // header row. The caller's file name is unchanged so return the + // same value back. + // + else + { + return(pcFilename8); + } + } + + else + { + // + // Device not ready so return NULL. + // + return(0); + } +} + +//***************************************************************************** +// +// This is called each time there is a new data record to log to the storage +// device. A line of text in CSV format will be written to the file. +// +//***************************************************************************** +int32_t +USBStickWriteRecord(tLogRecord *psRecord) +{ + static char pcBuf[256]; + uint32_t ui32Idx, ui32BufIdx = 0, ui32RecordIdx, ui32Selected; + FRESULT iFResult; + uint32_t ui32BytesWritten; + + // + // Check the arguments + // + ASSERT(psRecord); + if(!psRecord) + { + return(1); + } + + // + // Check state for ready device and opened file + // + if((g_iState != eSTATE_DEVICE_READY) || !(g_ui32Flags & FLAGS_FILE_OPENED)) + { + return(1); + } + + // + // Print time stamp columns + // + ui32BufIdx += usnprintf(&pcBuf[ui32BufIdx], sizeof(pcBuf) - ui32BufIdx, + "%u,%u", psRecord->ui32Seconds, + psRecord->ui16Subseconds); + + // + // Iterate through selected data items and print to CSV buffer + // + ui32RecordIdx = 0; + ui32Selected = psRecord->ui16ItemMask; + for(ui32Idx = 0; ui32Idx < NUM_LOG_ITEMS; ui32Idx++) + { + // + // If this data item is selected, then print a value to the CSV buffer + // + if(ui32Selected & 1) + { + ui32BufIdx += usnprintf(&pcBuf[ui32BufIdx], + (sizeof(pcBuf) - ui32BufIdx), ",%d", + psRecord->pi16Items[ui32RecordIdx]); + ui32RecordIdx++; + } + else + { + // + // Otherwise, this column of data is not selected so emit just a + // comma + // + ui32BufIdx += usnprintf(&pcBuf[ui32BufIdx], + (sizeof(pcBuf) - ui32BufIdx), ","); + } + + // + // Next selected item ... + // + ui32Selected >>= 1; + } + + // + // Append a CRLF to the end + // + ui32BufIdx += usnprintf(&pcBuf[ui32BufIdx], (sizeof(pcBuf) - ui32BufIdx), + "\r\n"); + + // + // Now write the entire buffer to the USB stick file + // + iFResult = f_write(&g_sFileObject, pcBuf, ui32BufIdx, + (UINT *)&ui32BytesWritten); + + // + // Check for errors + // + if((iFResult != FR_OK) || (ui32BytesWritten != ui32BufIdx)) + { + // + // Some error occurred + // + g_ui32Flags &= ~FLAGS_FILE_OPENED; + return(1); + } + else + { + // + // No errors occurred, return success + // + return(0); + } +} diff --git a/boards/dk-tm4c123g/qs-logger/usbstick.h b/boards/dk-tm4c123g/qs-logger/usbstick.h new file mode 100644 index 0000000..5ddb9be --- /dev/null +++ b/boards/dk-tm4c123g/qs-logger/usbstick.h @@ -0,0 +1,58 @@ +//***************************************************************************** +// +// usbstick.h - Prototypes and definitions for USB mass storage module. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** +#ifndef __USBSTICK_H__ +#define __USBSTICK_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Module function prototypes. +// +//***************************************************************************** +extern void USBStickInit(void); +extern void USBStickRun(void); +extern void USBStickCloseFile(void); +extern char *USBStickOpenLogFile(char *pcFilename); +extern int32_t USBStickWriteRecord(tLogRecord *psRecord); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __USBSTICK_H__ diff --git a/boards/dk-tm4c123g/sd_card/Makefile b/boards/dk-tm4c123g/sd_card/Makefile new file mode 100644 index 0000000..0b019ac --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/Makefile @@ -0,0 +1,97 @@ +#****************************************************************************** +# +# Makefile - Rules for building the SD card example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/src/option +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the SD card example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/sd_card.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the SD card example. +# +${COMPILER}/sd_card.axf: ${COMPILER}/cc932.o +${COMPILER}/sd_card.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/sd_card.axf: ${COMPILER}/cmdline.o +${COMPILER}/sd_card.axf: ${COMPILER}/ff.o +${COMPILER}/sd_card.axf: ${COMPILER}/mmc-dk-tm4c123g.o +${COMPILER}/sd_card.axf: ${COMPILER}/sd_card.o +${COMPILER}/sd_card.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/sd_card.axf: ${COMPILER}/uartstdio.o +${COMPILER}/sd_card.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/sd_card.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/sd_card.axf: sd_card.ld +SCATTERgcc_sd_card=sd_card.ld +ENTRY_sd_card=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 -DENABLE_LFN + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/sd_card/ccs/.ccsimportspec b/boards/dk-tm4c123g/sd_card/ccs/.ccsimportspec new file mode 100644 index 0000000..67417bd --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/sd_card/ccs/.ccsproject b/boards/dk-tm4c123g/sd_card/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/sd_card/ccs/.cproject b/boards/dk-tm4c123g/sd_card/ccs/.cproject new file mode 100644 index 0000000..239493d --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/ccs/.cproject @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/sd_card/ccs/.project b/boards/dk-tm4c123g/sd_card/ccs/.project new file mode 100644 index 0000000..d787629 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/ccs/.project @@ -0,0 +1,80 @@ + + + sd_card + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + sd_card.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/sd_card/sd_card.c + + + sd_card_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/sd_card/sd_card_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/sd_card/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/cmdline.c + 1 + SW_ROOT/utils/cmdline.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + third_party/fatfs/port/mmc-dk-tm4c123g.c + 1 + SW_ROOT/third_party/fatfs/port/mmc-dk-tm4c123g.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + third_party/fatfs/src/option/cc932.c + 1 + SW_ROOT/third_party/fatfs/src/option/cc932.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/sd_card/ccs/Debug/sd_card.bin b/boards/dk-tm4c123g/sd_card/ccs/Debug/sd_card.bin new file mode 100644 index 0000000..9ef9cd0 Binary files /dev/null and b/boards/dk-tm4c123g/sd_card/ccs/Debug/sd_card.bin differ diff --git a/boards/dk-tm4c123g/sd_card/ccs/Debug/sd_card.out b/boards/dk-tm4c123g/sd_card/ccs/Debug/sd_card.out new file mode 100644 index 0000000..70a5387 Binary files /dev/null and b/boards/dk-tm4c123g/sd_card/ccs/Debug/sd_card.out differ diff --git a/boards/dk-tm4c123g/sd_card/ccs/macros.ini_initial b/boards/dk-tm4c123g/sd_card/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/sd_card/ccs/target_config.ccxml b/boards/dk-tm4c123g/sd_card/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/sd_card/ewarm/Exe/sd_card.bin b/boards/dk-tm4c123g/sd_card/ewarm/Exe/sd_card.bin new file mode 100644 index 0000000..2bcb150 Binary files /dev/null and b/boards/dk-tm4c123g/sd_card/ewarm/Exe/sd_card.bin differ diff --git a/boards/dk-tm4c123g/sd_card/ewarm/Exe/sd_card.out b/boards/dk-tm4c123g/sd_card/ewarm/Exe/sd_card.out new file mode 100644 index 0000000..c9aa944 Binary files /dev/null and b/boards/dk-tm4c123g/sd_card/ewarm/Exe/sd_card.out differ diff --git a/boards/dk-tm4c123g/sd_card/gcc/sd_card.axf b/boards/dk-tm4c123g/sd_card/gcc/sd_card.axf new file mode 100644 index 0000000..75031d4 Binary files /dev/null and b/boards/dk-tm4c123g/sd_card/gcc/sd_card.axf differ diff --git a/boards/dk-tm4c123g/sd_card/gcc/sd_card.bin b/boards/dk-tm4c123g/sd_card/gcc/sd_card.bin new file mode 100644 index 0000000..2f4139a Binary files /dev/null and b/boards/dk-tm4c123g/sd_card/gcc/sd_card.bin differ diff --git a/boards/dk-tm4c123g/sd_card/readme.txt b/boards/dk-tm4c123g/sd_card/readme.txt new file mode 100644 index 0000000..6308d2d --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/readme.txt @@ -0,0 +1,34 @@ +SD card using FAT file system + +This example application demonstrates reading a file system from an SD +card. It makes use of FatFs, a FAT file system driver. It provides a +simple command console via a serial port for issuing commands to view and +navigate the file system on the SD card. + +The first UART, which is connected to the USB debug virtual serial port on +the evaluation board, is configured for 115,200 bits per second, and 8-N-1 +mode. When the program is started a message will be printed to the +terminal. Type ``help'' for command help. + +For additional details about FatFs, see the following site: +http://elm-chan.org/fsw/ff/00index_e.html + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/sd_card/rvmdk/sd_card.axf b/boards/dk-tm4c123g/sd_card/rvmdk/sd_card.axf new file mode 100644 index 0000000..6716d14 Binary files /dev/null and b/boards/dk-tm4c123g/sd_card/rvmdk/sd_card.axf differ diff --git a/boards/dk-tm4c123g/sd_card/rvmdk/sd_card.bin b/boards/dk-tm4c123g/sd_card/rvmdk/sd_card.bin new file mode 100644 index 0000000..dbb2c3b Binary files /dev/null and b/boards/dk-tm4c123g/sd_card/rvmdk/sd_card.bin differ diff --git a/boards/dk-tm4c123g/sd_card/sd_card.c b/boards/dk-tm4c123g/sd_card/sd_card.c new file mode 100644 index 0000000..14030c9 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/sd_card.c @@ -0,0 +1,922 @@ +//***************************************************************************** +// +// sd_card.c - Example program for reading files from an SD card. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "utils/cmdline.h" +#include "utils/uartstdio.h" +#include "fatfs/src/ff.h" +#include "fatfs/src/diskio.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

SD card using FAT file system (sd_card)

+//! +//! This example application demonstrates reading a file system from an SD +//! card. It makes use of FatFs, a FAT file system driver. It provides a +//! simple command console via a serial port for issuing commands to view and +//! navigate the file system on the SD card. +//! +//! The first UART, which is connected to the USB debug virtual serial port on +//! the evaluation board, is configured for 115,200 bits per second, and 8-N-1 +//! mode. When the program is started a message will be printed to the +//! terminal. Type ``help'' for command help. +//! +//! For additional details about FatFs, see the following site: +//! http://elm-chan.org/fsw/ff/00index_e.html +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines the size of the buffers that hold the path, or temporary data from +// the SD card. There are two buffers allocated of this size. The buffer size +// must be large enough to hold the longest expected full path name, including +// the file name, and a trailing null character. +// +//***************************************************************************** +#define PATH_BUF_SIZE 80 + +//***************************************************************************** +// +// Defines the size of the buffer that holds the command line. +// +//***************************************************************************** +#define CMD_BUF_SIZE 64 + +//***************************************************************************** +// +// This buffer holds the full path to the current working directory. Initially +// it is root ("/"). +// +//***************************************************************************** +static char g_pcCwdBuf[PATH_BUF_SIZE] = "/"; + +//***************************************************************************** +// +// A temporary data buffer used when manipulating file paths, or reading data +// from the SD card. +// +//***************************************************************************** +static char g_pcTmpBuf[PATH_BUF_SIZE]; + +//***************************************************************************** +// +// The buffer that holds the command line. +// +//***************************************************************************** +static char g_pcCmdBuf[CMD_BUF_SIZE]; + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static DIR g_sDirObject; +static FILINFO g_sFileInfo; +static FIL g_sFileObject; + +//***************************************************************************** +// +// A structure that holds a mapping between an FRESULT numerical code, and a +// string representation. FRESULT codes are returned from the FatFs FAT file +// system driver. +// +//***************************************************************************** +typedef struct +{ + FRESULT iFResult; + char *pcResultStr; +} +tFResultString; + +//***************************************************************************** +// +// A macro to make it easy to add result codes to the table. +// +//***************************************************************************** +#define FRESULT_ENTRY(f) { (f), (#f) } + +//***************************************************************************** +// +// A table that holds a mapping between the numerical FRESULT code and it's +// name as a string. This is used for looking up error codes for printing to +// the console. +// +//***************************************************************************** +tFResultString g_psFResultStrings[] = +{ + FRESULT_ENTRY(FR_OK), + FRESULT_ENTRY(FR_DISK_ERR), + FRESULT_ENTRY(FR_INT_ERR), + FRESULT_ENTRY(FR_NOT_READY), + FRESULT_ENTRY(FR_NO_FILE), + FRESULT_ENTRY(FR_NO_PATH), + FRESULT_ENTRY(FR_INVALID_NAME), + FRESULT_ENTRY(FR_DENIED), + FRESULT_ENTRY(FR_EXIST), + FRESULT_ENTRY(FR_INVALID_OBJECT), + FRESULT_ENTRY(FR_WRITE_PROTECTED), + FRESULT_ENTRY(FR_INVALID_DRIVE), + FRESULT_ENTRY(FR_NOT_ENABLED), + FRESULT_ENTRY(FR_NO_FILESYSTEM), + FRESULT_ENTRY(FR_MKFS_ABORTED), + FRESULT_ENTRY(FR_TIMEOUT), + FRESULT_ENTRY(FR_LOCKED), + FRESULT_ENTRY(FR_NOT_ENOUGH_CORE), + FRESULT_ENTRY(FR_TOO_MANY_OPEN_FILES), + FRESULT_ENTRY(FR_INVALID_PARAMETER), +}; + +//***************************************************************************** +// +// A macro that holds the number of result codes. +// +//***************************************************************************** +#define NUM_FRESULT_CODES (sizeof(g_psFResultStrings) / \ + sizeof(tFResultString)) + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// This function returns a string representation of an error code that was +// returned from a function call to FatFs. It can be used for printing human +// readable error messages. +// +//***************************************************************************** +const char * +StringFromFResult(FRESULT iFResult) +{ + uint_fast8_t ui8Idx; + + // + // Enter a loop to search the error code table for a matching error code. + // + for(ui8Idx = 0; ui8Idx < NUM_FRESULT_CODES; ui8Idx++) + { + // + // If a match is found, then return the string name of the error code. + // + if(g_psFResultStrings[ui8Idx].iFResult == iFResult) + { + return(g_psFResultStrings[ui8Idx].pcResultStr); + } + } + + // + // At this point no matching code was found, so return a string indicating + // an unknown error. + // + return("UNKNOWN ERROR CODE"); +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. FatFs requires a timer tick +// every 10 ms for internal timing purposes. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Call the FatFs tick timer. + // + disk_timerproc(); +} + +//***************************************************************************** +// +// This function implements the "ls" command. It opens the current directory +// and enumerates through the contents, and prints a line for each item it +// finds. It shows details such as file attributes, time and date, and the +// file size, along with the name. It shows a summary of file sizes at the end +// along with free space. +// +//***************************************************************************** +int +Cmd_ls(int argc, char *argv[]) +{ + uint32_t ui32TotalSize; + uint32_t ui32FileCount; + uint32_t ui32DirCount; + FRESULT iFResult; + FATFS *psFatFs; + char *pcFileName; +#if _USE_LFN + char pucLfn[_MAX_LFN + 1]; + g_sFileInfo.lfname = pucLfn; + g_sFileInfo.lfsize = sizeof(pucLfn); +#endif + + + // + // Open the current directory for access. + // + iFResult = f_opendir(&g_sDirObject, g_pcCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + return((int)iFResult); + } + + ui32TotalSize = 0; + ui32FileCount = 0; + ui32DirCount = 0; + + // + // Give an extra blank line before the listing. + // + UARTprintf("\n"); + + // + // Enter loop to enumerate through all directory entries. + // + for(;;) + { + // + // Read an entry from the directory. + // + iFResult = f_readdir(&g_sDirObject, &g_sFileInfo); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + return((int)iFResult); + } + + // + // If the file name is blank, then this is the end of the listing. + // + if(!g_sFileInfo.fname[0]) + { + break; + } + + // + // If the attribue is directory, then increment the directory count. + // + if(g_sFileInfo.fattrib & AM_DIR) + { + ui32DirCount++; + } + + // + // Otherwise, it is a file. Increment the file count, and add in the + // file size to the total. + // + else + { + ui32FileCount++; + ui32TotalSize += g_sFileInfo.fsize; + } + +#if _USE_LFN + pcFileName = ((*g_sFileInfo.lfname)?g_sFileInfo.lfname:g_sFileInfo.fname); +#else + pcFileName = g_sFileInfo.fname; +#endif + // + // Print the entry information on a single line with formatting to show + // the attributes, date, time, size, and name. + // + UARTprintf("%c%c%c%c%c %u/%02u/%02u %02u:%02u %9u %s\n", + (g_sFileInfo.fattrib & AM_DIR) ? 'D' : '-', + (g_sFileInfo.fattrib & AM_RDO) ? 'R' : '-', + (g_sFileInfo.fattrib & AM_HID) ? 'H' : '-', + (g_sFileInfo.fattrib & AM_SYS) ? 'S' : '-', + (g_sFileInfo.fattrib & AM_ARC) ? 'A' : '-', + (g_sFileInfo.fdate >> 9) + 1980, + (g_sFileInfo.fdate >> 5) & 15, + g_sFileInfo.fdate & 31, + (g_sFileInfo.ftime >> 11), + (g_sFileInfo.ftime >> 5) & 63, + g_sFileInfo.fsize, + pcFileName); + } + + // + // Print summary lines showing the file, dir, and size totals. + // + UARTprintf("\n%4u File(s),%10u bytes total\n%4u Dir(s)", + ui32FileCount, ui32TotalSize, ui32DirCount); + + // + // Get the free space. + // + iFResult = f_getfree("/", (DWORD *)&ui32TotalSize, &psFatFs); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + return((int)iFResult); + } + + // + // Display the amount of free space that was calculated. + // + UARTprintf(", %10uK bytes free\n", (ui32TotalSize * + psFatFs->free_clust / 2)); + + // + // Made it to here, return with no errors. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "cd" command. It takes an argument that +// specifies the directory to make the current working directory. Path +// separators must use a forward slash "/". The argument to cd can be one of +// the following: +// +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so dont try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory to +// make sure it exists. If the new path is opened successfully, then the +// current working directory (cwd) is changed to the new path. +// +//***************************************************************************** +int +Cmd_cd(int argc, char *argv[]) +{ + uint_fast8_t ui8Idx; + FRESULT iFResult; + + // + // Copy the current working path into a temporary buffer so it can be + // manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If the first character is /, then this is a fully specified path, and it + // should just be used as-is. + // + if(argv[1][0] == '/') + { + // + // Make sure the new path is not bigger than the cwd buffer. + // + if(strlen(argv[1]) + 1 > sizeof(g_pcCwdBuf)) + { + UARTprintf("Resulting path name is too long\n"); + return(0); + } + + // + // If the new path name (in argv[1]) is not too long, then copy it + // into the temporary buffer so it can be checked. + // + else + { + strncpy(g_pcTmpBuf, argv[1], sizeof(g_pcTmpBuf)); + } + } + + // + // If the argument is .. then attempt to remove the lowest level on the + // CWD. + // + else if(!strcmp(argv[1], "..")) + { + // + // Get the index to the last character in the current path. + // + ui8Idx = strlen(g_pcTmpBuf) - 1; + + // + // Back up from the end of the path name until a separator (/) is + // found, or until we bump up to the start of the path. + // + while((g_pcTmpBuf[ui8Idx] != '/') && (ui8Idx > 1)) + { + // + // Back up one character. + // + ui8Idx--; + } + + // + // Now we are either at the lowest level separator in the current path, + // or at the beginning of the string (root). So set the new end of + // string here, effectively removing that last part of the path. + // + g_pcTmpBuf[ui8Idx] = 0; + } + + // + // Otherwise this is just a normal path name from the current directory, + // and it needs to be appended to the current path. + // + else + { + // + // Test to make sure that when the new additional path is added on to + // the current path, there is room in the buffer for the full new path. + // It needs to include a new separator, and a trailing null character. + // + if(strlen(g_pcTmpBuf) + strlen(argv[1]) + 1 + 1 > sizeof(g_pcCwdBuf)) + { + UARTprintf("Resulting path name is too long\n"); + return(0); + } + + // + // The new path is okay, so add the separator and then append the new + // directory to the path. + // + else + { + // + // If not already at the root level, then append a / + // + if(strcmp(g_pcTmpBuf, "/")) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Append the new directory to the path. + // + strcat(g_pcTmpBuf, argv[1]); + } + } + + // + // At this point, a candidate new directory path is in chTmpBuf. Try to + // open it to make sure it is valid. + // + iFResult = f_opendir(&g_sDirObject, g_pcTmpBuf); + + // + // If it can't be opened, then it is a bad path. Inform the user and + // return. + // + if(iFResult != FR_OK) + { + UARTprintf("cd: %s\n", g_pcTmpBuf); + return((int)iFResult); + } + + // + // Otherwise, it is a valid new path, so copy it into the CWD. + // + else + { + strncpy(g_pcCwdBuf, g_pcTmpBuf, sizeof(g_pcCwdBuf)); + } + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "pwd" command. It simply prints the current +// working directory. +// +//***************************************************************************** +int +Cmd_pwd(int argc, char *argv[]) +{ + // + // Print the CWD to the console. + // + UARTprintf("%s\n", g_pcCwdBuf); + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "cat" command. It reads the contents of a file +// and prints it to the console. This should only be used on text files. If +// it is used on a binary file, then a bunch of garbage is likely to printed on +// the console. +// +//***************************************************************************** +int +Cmd_cat(int argc, char *argv[]) +{ + FRESULT iFResult; + uint32_t ui32BytesRead; + + // + // First, check to make sure that the current path (CWD), plus the file + // name, plus a separator and trailing null, will all fit in the temporary + // buffer that will be used to hold the file name. The file name must be + // fully specified, with path, to FatFs. + // + if(strlen(g_pcCwdBuf) + strlen(argv[1]) + 1 + 1 > sizeof(g_pcTmpBuf)) + { + UARTprintf("Resulting path name is too long\n"); + return(0); + } + + // + // Copy the current path to the temporary buffer so it can be manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If not already at the root level, then append a separator. + // + if(strcmp("/", g_pcCwdBuf)) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Now finally, append the file name to result in a fully specified file. + // + strcat(g_pcTmpBuf, argv[1]); + + // + // Open the file for reading. + // + iFResult = f_open(&g_sFileObject, g_pcTmpBuf, FA_READ); + + // + // If there was some problem opening the file, then return an error. + // + if(iFResult != FR_OK) + { + return((int)iFResult); + } + + // + // Enter a loop to repeatedly read data from the file and display it, until + // the end of the file is reached. + // + do + { + // + // Read a block of data from the file. Read as much as can fit in the + // temporary buffer, including a space for the trailing null. + // + iFResult = f_read(&g_sFileObject, g_pcTmpBuf, sizeof(g_pcTmpBuf) - 1, + (UINT *)&ui32BytesRead); + + // + // If there was an error reading, then print a newline and return the + // error to the user. + // + if(iFResult != FR_OK) + { + UARTprintf("\n"); + return((int)iFResult); + } + + // + // Null terminate the last block that was read to make it a null + // terminated string that can be used with printf. + // + g_pcTmpBuf[ui32BytesRead] = 0; + + // + // Print the last chunk of the file that was received. + // + UARTprintf("%s", g_pcTmpBuf); + } + while(ui32BytesRead == sizeof(g_pcTmpBuf) - 1); + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "help" command. It prints a simple list of the +// available commands with a brief description. +// +//***************************************************************************** +int +Cmd_help(int argc, char *argv[]) +{ + tCmdLineEntry *psEntry; + + // + // Print some header text. + // + UARTprintf("\nAvailable commands\n"); + UARTprintf("------------------\n"); + + // + // Point at the beginning of the command table. + // + psEntry = &g_psCmdTable[0]; + + // + // Enter a loop to read each entry from the command table. The end of the + // table has been reached when the command name is NULL. + // + while(psEntry->pcCmd) + { + // + // Print the command name and the brief description. + // + UARTprintf("%6s: %s\n", psEntry->pcCmd, psEntry->pcHelp); + + // + // Advance to the next entry in the table. + // + psEntry++; + } + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This is the table that holds the command names, implementing functions, and +// brief description. +// +//***************************************************************************** +tCmdLineEntry g_psCmdTable[] = +{ + { "help", Cmd_help, "Display list of commands" }, + { "h", Cmd_help, "alias for help" }, + { "?", Cmd_help, "alias for help" }, + { "ls", Cmd_ls, "Display list of files" }, + { "chdir", Cmd_cd, "Change directory" }, + { "cd", Cmd_cd, "alias for chdir" }, + { "pwd", Cmd_pwd, "Show current working directory" }, + { "cat", Cmd_cat, "Show contents of a text file" }, + { 0, 0, 0 } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// The program main function. It performs initialization, then runs a command +// processing loop to read commands from the console. +// +//***************************************************************************** +int +main(void) +{ + int nStatus; + FRESULT iFResult; + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + + // + // Configure SysTick for a 100Hz interrupt. The FatFs driver wants a 10 ms + // tick. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / 100); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the UART as a console for text I/O. + // + ConfigureUART(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "sd_card", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + + // + // Show some instructions on the display + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "Connect a", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 20, false); + GrStringDrawCentered(&g_sContext, "terminal", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 30, false); + GrStringDrawCentered(&g_sContext, "to UART0.", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 40, false); + GrStringDrawCentered(&g_sContext, "115000,N,8,1", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 50, false); + + // + // Print hello message to user. + // + UARTprintf("\n\nSD Card Example Program\n"); + UARTprintf("Type \'help\' for help.\n"); + + // + // Mount the file system, using logical disk 0. + // + iFResult = f_mount(0, &g_sFatFs); + if(iFResult != FR_OK) + { + UARTprintf("f_mount error: %s\n", StringFromFResult(iFResult)); + return(1); + } + + // + // Enter an infinite loop for reading and processing commands from the + // user. + // + while(1) + { + // + // Print a prompt to the console. Show the CWD. + // + UARTprintf("\n%s> ", g_pcCwdBuf); + + // + // Get a line of text from the user. + // + UARTgets(g_pcCmdBuf, sizeof(g_pcCmdBuf)); + + // + // Pass the line from the user to the command processor. It will be + // parsed and valid commands executed. + // + nStatus = CmdLineProcess(g_pcCmdBuf); + + // + // Handle the case of bad command. + // + if(nStatus == CMDLINE_BAD_CMD) + { + UARTprintf("Bad command!\n"); + } + + // + // Handle the case of too many arguments. + // + else if(nStatus == CMDLINE_TOO_MANY_ARGS) + { + UARTprintf("Too many arguments for command processor!\n"); + } + + // + // Otherwise the command was executed. Print the error code if one was + // returned. + // + else if(nStatus != 0) + { + UARTprintf("Command returned error code %s\n", + StringFromFResult((FRESULT)nStatus)); + } + } +} diff --git a/boards/dk-tm4c123g/sd_card/sd_card.ewd b/boards/dk-tm4c123g/sd_card/sd_card.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/sd_card.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/sd_card/sd_card.ewp b/boards/dk-tm4c123g/sd_card/sd_card.ewp new file mode 100644 index 0000000..0ebab06 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/sd_card.ewp @@ -0,0 +1,810 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\option\cc932.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\utils\cmdline.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c123g.c + + + $PROJ_DIR$\sd_card.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c123g/sd_card/sd_card.icf b/boards/dk-tm4c123g/sd_card/sd_card.icf new file mode 100644 index 0000000..b21ea18 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/sd_card.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// sd_card.icf - Linker configuration file for sd_card. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/sd_card/sd_card.ld b/boards/dk-tm4c123g/sd_card/sd_card.ld new file mode 100644 index 0000000..786965b --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/sd_card.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * sd_card.ld - Linker configuration file for sd_card. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/sd_card/sd_card.sct b/boards/dk-tm4c123g/sd_card/sd_card.sct new file mode 100644 index 0000000..bbc25b8 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/sd_card.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; sd_card.sct - Linker configuration file for sd_card. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/sd_card/sd_card.uvopt b/boards/dk-tm4c123g/sd_card/sd_card.uvopt new file mode 100644 index 0000000..b1fc357 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/sd_card.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + sd_card + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\option\cc932.c + cc932.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\cmdline.c + cmdline.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c123g.c + mmc-dk-tm4c123g.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\sd_card.c + sd_card.c + + + 1 + 7 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/sd_card/sd_card.uvproj b/boards/dk-tm4c123g/sd_card/sd_card.uvproj new file mode 100644 index 0000000..3aa1ba4 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/sd_card.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + sd_card + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + sd_card + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\sd_card.bin .\rvmdk\sd_card.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 ENABLE_LFN + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + sd_card.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cc932.c + 1 + ..\..\..\..\third_party\fatfs\src\option\cc932.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + cmdline.c + 1 + ..\..\..\..\utils\cmdline.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + mmc-dk-tm4c123g.c + 1 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c123g.c + + + sd_card.c + 1 + .\sd_card.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/sd_card/sd_card_ccs.cmd b/boards/dk-tm4c123g/sd_card/sd_card_ccs.cmd new file mode 100644 index 0000000..2003d70 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/sd_card_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * sd_card_ccs.cmd - CCS linker configuration file for sd_card. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/sd_card/startup_ccs.c b/boards/dk-tm4c123g/sd_card/startup_ccs.c new file mode 100644 index 0000000..f8caf41 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/sd_card/startup_ewarm.c b/boards/dk-tm4c123g/sd_card/startup_ewarm.c new file mode 100644 index 0000000..da9042d --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/sd_card/startup_gcc.c b/boards/dk-tm4c123g/sd_card/startup_gcc.c new file mode 100644 index 0000000..ef1fb11 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/sd_card/startup_rvmdk.S b/boards/dk-tm4c123g/sd_card/startup_rvmdk.S new file mode 100644 index 0000000..707a0a3 --- /dev/null +++ b/boards/dk-tm4c123g/sd_card/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/sine_demo/Makefile b/boards/dk-tm4c123g/sine_demo/Makefile new file mode 100644 index 0000000..9ba2106 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/Makefile @@ -0,0 +1,88 @@ +#****************************************************************************** +# +# Makefile - Rules for building the sine_demo example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the sine_demo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/sine_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the sine_demo example. +# +${COMPILER}/sine_demo.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/sine_demo.axf: ${COMPILER}/sine_demo.o +${COMPILER}/sine_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/sine_demo.axf: ${COMPILER}/stripchartwidget.o +${COMPILER}/sine_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/sine_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/sine_demo.axf: sine_demo.ld +SCATTERgcc_sine_demo=sine_demo.ld +ENTRY_sine_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/sine_demo/ccs/.ccsimportspec b/boards/dk-tm4c123g/sine_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..ca635fe --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/sine_demo/ccs/.ccsproject b/boards/dk-tm4c123g/sine_demo/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/sine_demo/ccs/.cproject b/boards/dk-tm4c123g/sine_demo/ccs/.cproject new file mode 100644 index 0000000..8cc7827 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/sine_demo/ccs/.project b/boards/dk-tm4c123g/sine_demo/ccs/.project new file mode 100644 index 0000000..c0b0684 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/ccs/.project @@ -0,0 +1,60 @@ + + + sine_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + sine_demo.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/sine_demo/sine_demo.c + + + sine_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/sine_demo/sine_demo_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/sine_demo/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + drivers/stripchartwidget.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/stripchartwidget.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/sine_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/sine_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/sine_demo/ccs/Debug/sine_demo.bin b/boards/dk-tm4c123g/sine_demo/ccs/Debug/sine_demo.bin new file mode 100644 index 0000000..d15d61d Binary files /dev/null and b/boards/dk-tm4c123g/sine_demo/ccs/Debug/sine_demo.bin differ diff --git a/boards/dk-tm4c123g/sine_demo/ccs/Debug/sine_demo.out b/boards/dk-tm4c123g/sine_demo/ccs/Debug/sine_demo.out new file mode 100644 index 0000000..530871f Binary files /dev/null and b/boards/dk-tm4c123g/sine_demo/ccs/Debug/sine_demo.out differ diff --git a/boards/dk-tm4c123g/sine_demo/ccs/macros.ini_initial b/boards/dk-tm4c123g/sine_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/sine_demo/ccs/target_config.ccxml b/boards/dk-tm4c123g/sine_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/sine_demo/ewarm/Exe/sine_demo.bin b/boards/dk-tm4c123g/sine_demo/ewarm/Exe/sine_demo.bin new file mode 100644 index 0000000..7a0d3ac Binary files /dev/null and b/boards/dk-tm4c123g/sine_demo/ewarm/Exe/sine_demo.bin differ diff --git a/boards/dk-tm4c123g/sine_demo/ewarm/Exe/sine_demo.out b/boards/dk-tm4c123g/sine_demo/ewarm/Exe/sine_demo.out new file mode 100644 index 0000000..df01cfc Binary files /dev/null and b/boards/dk-tm4c123g/sine_demo/ewarm/Exe/sine_demo.out differ diff --git a/boards/dk-tm4c123g/sine_demo/gcc/sine_demo.axf b/boards/dk-tm4c123g/sine_demo/gcc/sine_demo.axf new file mode 100644 index 0000000..b4f5106 Binary files /dev/null and b/boards/dk-tm4c123g/sine_demo/gcc/sine_demo.axf differ diff --git a/boards/dk-tm4c123g/sine_demo/gcc/sine_demo.bin b/boards/dk-tm4c123g/sine_demo/gcc/sine_demo.bin new file mode 100644 index 0000000..fc7647a Binary files /dev/null and b/boards/dk-tm4c123g/sine_demo/gcc/sine_demo.bin differ diff --git a/boards/dk-tm4c123g/sine_demo/readme.txt b/boards/dk-tm4c123g/sine_demo/readme.txt new file mode 100644 index 0000000..3f2a259 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/readme.txt @@ -0,0 +1,24 @@ +Sine Demo + +This example uses the floating point capabilities of the Tiva C Series +processor to compute a sine wave and show it on the display. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/sine_demo/rvmdk/sine_demo.axf b/boards/dk-tm4c123g/sine_demo/rvmdk/sine_demo.axf new file mode 100644 index 0000000..f9b351a Binary files /dev/null and b/boards/dk-tm4c123g/sine_demo/rvmdk/sine_demo.axf differ diff --git a/boards/dk-tm4c123g/sine_demo/rvmdk/sine_demo.bin b/boards/dk-tm4c123g/sine_demo/rvmdk/sine_demo.bin new file mode 100644 index 0000000..93dca16 Binary files /dev/null and b/boards/dk-tm4c123g/sine_demo/rvmdk/sine_demo.bin differ diff --git a/boards/dk-tm4c123g/sine_demo/sine_demo.c b/boards/dk-tm4c123g/sine_demo/sine_demo.c new file mode 100644 index 0000000..fcd90c0 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/sine_demo.c @@ -0,0 +1,332 @@ +//***************************************************************************** +// +// sine_demo.c - Computes a sine wave and displays it on the screen. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include +#include "driverlib/fpu.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/stripchartwidget.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Sine Demo (sine_demo)

+//! +//! This example uses the floating point capabilities of the Tiva C Series +//! processor to compute a sine wave and show it on the display. +// +//***************************************************************************** + +//***************************************************************************** +// +// Provide a definition for M_PI, if it was not provided by math.h. +// +//***************************************************************************** +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 20 +#define FSECONDS_PER_TICK (1.0 / (float)TICKS_PER_SECOND) + +//***************************************************************************** +// +// A counter for system clock ticks, used for tracking time. +// +//***************************************************************************** +static volatile uint32_t g_ui32TickCount; + +//***************************************************************************** +// +// Define an off-screen buffer and display structure. This is used by the +// strip chart widget for drawing a scrolling display. +// +//***************************************************************************** +#define OFFSCREEN_BUF_SIZE GrOffScreen4BPPSize(96, 64) +uint8_t g_pui8OffscreenBuf[OFFSCREEN_BUF_SIZE]; +tDisplay g_sOffscreenDisplay; + +//***************************************************************************** +// +// Create a palette for the off-screen buffer that is used by the strip chart. +// +//***************************************************************************** +uint32_t g_pui32Palette[] = +{ + ClrBlack, + ClrWhite, + ClrRed, + ClrDarkGreen, +}; +#define NUM_PALETTE_ENTRIES (sizeof(g_pui32Palette) / sizeof(uint32_t)) + +//***************************************************************************** +// +// Define the series for the strip chart. The SERIES_LENGTH is the maximum +// number of points that will be shown on the chart. +// +//***************************************************************************** +#define SERIES_LENGTH 96 +static tStripChartSeries g_sSeries = +{ + 0, "SINE", ClrRed, 1, 1, 0, 0 +}; + +//***************************************************************************** +// +// Defines the X-axis for the strip chart +// +//***************************************************************************** +static tStripChartAxis i16Axis16X = +{ + "TIME", // title of axis + 0, // label for minimum of axis + 0, // label for maximum of axis + 0, // minimum value for the axis + 95, // maximum value for the axis + TICKS_PER_SECOND // grid interval for the axis +}; + +//***************************************************************************** +// +// Defines the Y-axis for the strip chart. +// +//***************************************************************************** +static tStripChartAxis i16Axis16Y = +{ + "SIN(2pi*t/4)*0.5", // title of the axis + "-1", // label for minimum of axis + "+1", // label for maximum of axis + -32, // minimum value for the axis + 31, // maximum value for the axis + 16 // grid interval for the axis +}; + +//***************************************************************************** +// +// Defines the strip chart widget. This structure requires additional +// run-time initialization. +// +//***************************************************************************** +StripChart(g_sStripChart, WIDGET_ROOT, 0, 0, &g_sCFAL96x64x16, 0, 0, 96, 64, + 0, g_psFontFixed6x8, ClrBlack, ClrWhite, ClrWhite, ClrDarkGreen, + &i16Axis16X, &i16Axis16Y, &g_sOffscreenDisplay); + +//***************************************************************************** +// +// Creates a buffer for holding the values of the data series. It must be +// large enough to hold the maximum number of data points in the series that +// will be shown on the strip chart. +// +//***************************************************************************** +static int8_t g_i8SeriesData[SERIES_LENGTH]; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. It simply increments a +// counter that is used for timing. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Update our tick counter. + // + g_ui32TickCount++; +} + +//***************************************************************************** +// +// Compute and display a sine wave. +// +//***************************************************************************** +int +main(void) +{ + uint_fast16_t ui16ItemCount = 0; + uint32_t ui32LastTickCount = 0; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly at 50 MHz. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Configure SysTick to generate a periodic time tick interrupt. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize an offscreen display and assign the palette. This offscreen + // buffer is needed by the strip chart widget. + // + GrOffScreen4BPPInit(&g_sOffscreenDisplay, g_pui8OffscreenBuf, 96, 64); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplay, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + + // + // Set the data series buffer pointer to point at the storage where the + // series data points will be stored. + // + g_sSeries.pvData = g_i8SeriesData; + + // + // Add the series to the strip chart + // + StripChartSeriesAdd(&g_sStripChart, &g_sSeries); + + // + // Add the strip chart to the widget tree. + // + WidgetAdd(WIDGET_ROOT, &g_sStripChart.sBase); + + // + // Enter a loop to continuously calculate a sine wave. + // + while(1) + { + float fElapsedTime; + float fRadians; + float fSine; + + // + // Wait for the next timer tick. + // + while(ui32LastTickCount == g_ui32TickCount) + { + } + ui32LastTickCount = g_ui32TickCount; + + // + // Preparing to add a new data point to the strip chart ... + // If the number count of items in the strip chart has reached the + // maximum value, then the data points need to "slide down" in the + // buffer so new data can be added at the end. + // + if(ui16ItemCount == SERIES_LENGTH) + { + memmove(&g_i8SeriesData[0], &g_i8SeriesData[1], SERIES_LENGTH - 1); + } + + // + // Otherwise, the series data buffer is less than full so just + // increment the count of data points. + // + else + { + // + // Increment the number of items that have been added to the strip + // chart series data buffer. + // + ui16ItemCount++; + + // + // Since the count of data items has changed, it must be updated in + // the data series. + // + g_sSeries.ui16NumItems = ui16ItemCount; + } + + // + // Compute the elapsed time in decimal seconds, in floating point + // format. + // + fElapsedTime = (float)g_ui32TickCount * FSECONDS_PER_TICK; + + // + // Convert the time to radians. + // + fRadians = fElapsedTime * 2.0 * M_PI; + + // + // Adjust the period of the wave. This will give us a wave period + // of 4 seconds, or 0.25 Hz. This number was chosen arbitrarily to + // provide a nice looking wave on the display. + // + fRadians /= 4.0; + + // + // Compute the sine. Multiply by 0.5 to reduce the amplitude. + // + fSine = sinf(fRadians) * 0.5; + + // + // Finally, save the sine value into the last location in the series + // data point buffer. Convert the sine amplitude to display pixels. + // (Amplitude 1 = 32 pixels) + // + g_i8SeriesData[ui16ItemCount - 1] = (int8_t)(fSine * 32.0); + + // + // Now that a new data point has been added to the series, advance + // the strip chart. + // + StripChartAdvance(&g_sStripChart, 1); + + // + // Request a repaint and run the widget processing queue. + // + WidgetPaint(WIDGET_ROOT); + WidgetMessageQueueProcess(); + } +} diff --git a/boards/dk-tm4c123g/sine_demo/sine_demo.ewd b/boards/dk-tm4c123g/sine_demo/sine_demo.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/sine_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/sine_demo/sine_demo.ewp b/boards/dk-tm4c123g/sine_demo/sine_demo.ewp new file mode 100644 index 0000000..cb0baa8 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/sine_demo.ewp @@ -0,0 +1,795 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\sine_demo.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\stripchartwidget.c + + + diff --git a/boards/dk-tm4c123g/sine_demo/sine_demo.icf b/boards/dk-tm4c123g/sine_demo/sine_demo.icf new file mode 100644 index 0000000..26c2dff --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/sine_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// sine_demo.icf - Linker configuration file for sine_demo. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/sine_demo/sine_demo.ld b/boards/dk-tm4c123g/sine_demo/sine_demo.ld new file mode 100644 index 0000000..2b7b547 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/sine_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * sine_demo.ld - Linker configuration file for sine_demo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/sine_demo/sine_demo.sct b/boards/dk-tm4c123g/sine_demo/sine_demo.sct new file mode 100644 index 0000000..570d1f3 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/sine_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; sine_demo.sct - Linker configuration file for sine_demo. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/sine_demo/sine_demo.uvopt b/boards/dk-tm4c123g/sine_demo/sine_demo.uvopt new file mode 100644 index 0000000..999661b --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/sine_demo.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + sine_demo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\sine_demo.c + sine_demo.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\stripchartwidget.c + stripchartwidget.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/sine_demo/sine_demo.uvproj b/boards/dk-tm4c123g/sine_demo/sine_demo.uvproj new file mode 100644 index 0000000..ebc335c --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/sine_demo.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + sine_demo + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + sine_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\sine_demo.bin .\rvmdk\sine_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + sine_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + sine_demo.c + 1 + .\sine_demo.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + stripchartwidget.c + 1 + ..\drivers\stripchartwidget.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/sine_demo/sine_demo_ccs.cmd b/boards/dk-tm4c123g/sine_demo/sine_demo_ccs.cmd new file mode 100644 index 0000000..7966256 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/sine_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * sine_demo_ccs.cmd - CCS linker configuration file for sine_demo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/sine_demo/startup_ccs.c b/boards/dk-tm4c123g/sine_demo/startup_ccs.c new file mode 100644 index 0000000..f8caf41 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/sine_demo/startup_ewarm.c b/boards/dk-tm4c123g/sine_demo/startup_ewarm.c new file mode 100644 index 0000000..da9042d --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/sine_demo/startup_gcc.c b/boards/dk-tm4c123g/sine_demo/startup_gcc.c new file mode 100644 index 0000000..ef1fb11 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/sine_demo/startup_rvmdk.S b/boards/dk-tm4c123g/sine_demo/startup_rvmdk.S new file mode 100644 index 0000000..707a0a3 --- /dev/null +++ b/boards/dk-tm4c123g/sine_demo/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/softuart_echo/Makefile b/boards/dk-tm4c123g/softuart_echo/Makefile new file mode 100644 index 0000000..a8d40a6 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the softuart_echo example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the softuart_echo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/softuart_echo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the softuart_echo example. +# +${COMPILER}/softuart_echo.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/softuart_echo.axf: ${COMPILER}/softuart.o +${COMPILER}/softuart_echo.axf: ${COMPILER}/softuart_echo.o +${COMPILER}/softuart_echo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/softuart_echo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/softuart_echo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/softuart_echo.axf: softuart_echo.ld +SCATTERgcc_softuart_echo=softuart_echo.ld +ENTRY_softuart_echo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/softuart_echo/ccs/.ccsimportspec b/boards/dk-tm4c123g/softuart_echo/ccs/.ccsimportspec new file mode 100644 index 0000000..d6f1e4d --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/softuart_echo/ccs/.ccsproject b/boards/dk-tm4c123g/softuart_echo/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/softuart_echo/ccs/.cproject b/boards/dk-tm4c123g/softuart_echo/ccs/.cproject new file mode 100644 index 0000000..b48960f --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/softuart_echo/ccs/.project b/boards/dk-tm4c123g/softuart_echo/ccs/.project new file mode 100644 index 0000000..fbf3d81 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/ccs/.project @@ -0,0 +1,60 @@ + + + softuart_echo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + softuart_echo.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/softuart_echo/softuart_echo.c + + + softuart_echo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/softuart_echo/softuart_echo_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/softuart_echo/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/softuart.c + 1 + SW_ROOT/utils/softuart.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/softuart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/softuart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/softuart_echo/ccs/Debug/softuart_echo.bin b/boards/dk-tm4c123g/softuart_echo/ccs/Debug/softuart_echo.bin new file mode 100644 index 0000000..343b1e3 Binary files /dev/null and b/boards/dk-tm4c123g/softuart_echo/ccs/Debug/softuart_echo.bin differ diff --git a/boards/dk-tm4c123g/softuart_echo/ccs/Debug/softuart_echo.out b/boards/dk-tm4c123g/softuart_echo/ccs/Debug/softuart_echo.out new file mode 100644 index 0000000..e3acfe5 Binary files /dev/null and b/boards/dk-tm4c123g/softuart_echo/ccs/Debug/softuart_echo.out differ diff --git a/boards/dk-tm4c123g/softuart_echo/ccs/macros.ini_initial b/boards/dk-tm4c123g/softuart_echo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/softuart_echo/ccs/target_config.ccxml b/boards/dk-tm4c123g/softuart_echo/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/softuart_echo/ewarm/Exe/softuart_echo.bin b/boards/dk-tm4c123g/softuart_echo/ewarm/Exe/softuart_echo.bin new file mode 100644 index 0000000..2c3aca4 Binary files /dev/null and b/boards/dk-tm4c123g/softuart_echo/ewarm/Exe/softuart_echo.bin differ diff --git a/boards/dk-tm4c123g/softuart_echo/ewarm/Exe/softuart_echo.out b/boards/dk-tm4c123g/softuart_echo/ewarm/Exe/softuart_echo.out new file mode 100644 index 0000000..6e11e53 Binary files /dev/null and b/boards/dk-tm4c123g/softuart_echo/ewarm/Exe/softuart_echo.out differ diff --git a/boards/dk-tm4c123g/softuart_echo/gcc/softuart_echo.axf b/boards/dk-tm4c123g/softuart_echo/gcc/softuart_echo.axf new file mode 100644 index 0000000..abb646f Binary files /dev/null and b/boards/dk-tm4c123g/softuart_echo/gcc/softuart_echo.axf differ diff --git a/boards/dk-tm4c123g/softuart_echo/gcc/softuart_echo.bin b/boards/dk-tm4c123g/softuart_echo/gcc/softuart_echo.bin new file mode 100644 index 0000000..cddbacf Binary files /dev/null and b/boards/dk-tm4c123g/softuart_echo/gcc/softuart_echo.bin differ diff --git a/boards/dk-tm4c123g/softuart_echo/readme.txt b/boards/dk-tm4c123g/softuart_echo/readme.txt new file mode 100644 index 0000000..0af2974 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/readme.txt @@ -0,0 +1,27 @@ +SoftUART Echo + +This example application utilizes the SoftUART to echo text. The SoftUART +is configured to use the same pins as the first UART (connected to the FTDI +virtual serial port on the evaluation board), at 115,200 baud, 8-n-1 mode. +All characters received on the SoftUART are transmitted back to the +SoftUART. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/softuart_echo/rvmdk/softuart_echo.axf b/boards/dk-tm4c123g/softuart_echo/rvmdk/softuart_echo.axf new file mode 100644 index 0000000..f0658f5 Binary files /dev/null and b/boards/dk-tm4c123g/softuart_echo/rvmdk/softuart_echo.axf differ diff --git a/boards/dk-tm4c123g/softuart_echo/rvmdk/softuart_echo.bin b/boards/dk-tm4c123g/softuart_echo/rvmdk/softuart_echo.bin new file mode 100644 index 0000000..6ea4936 Binary files /dev/null and b/boards/dk-tm4c123g/softuart_echo/rvmdk/softuart_echo.bin differ diff --git a/boards/dk-tm4c123g/softuart_echo/softuart_echo.c b/boards/dk-tm4c123g/softuart_echo/softuart_echo.c new file mode 100644 index 0000000..24d0121 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/softuart_echo.c @@ -0,0 +1,368 @@ +//***************************************************************************** +// +// softuart_echo.c - Example for reading data from and writing data to the +// SoftUART. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" +#include "utils/softuart.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

SoftUART Echo (softuart_echo)

+//! +//! This example application utilizes the SoftUART to echo text. The SoftUART +//! is configured to use the same pins as the first UART (connected to the FTDI +//! virtual serial port on the evaluation board), at 115,200 baud, 8-n-1 mode. +//! All characters received on the SoftUART are transmitted back to the +//! SoftUART. +// +//***************************************************************************** + +//***************************************************************************** +// +// The instance data for the SoftUART module. +// +//***************************************************************************** +static tSoftUART g_sUART; + +//***************************************************************************** +// +// The buffer to be used for the SoftUART transmit buffer. +// +//***************************************************************************** +static uint8_t g_pui8TxBuffer[64]; + +//***************************************************************************** +// +// The buffer to be used for the SoftUART receive buffer. +// +//***************************************************************************** +static uint16_t g_pui16RxBuffer[64]; + +//***************************************************************************** +// +// The number of processor clocks in the time period of a single bit on the +// SoftUART interface. +// +//***************************************************************************** +static uint32_t g_ui32BitTime; + +//***************************************************************************** +// +// A flag that is set in the SoftUART "interrupt" handler when there are +// characters in the receive buffer that need to be read. +// +//***************************************************************************** +static volatile uint32_t g_ui32Flag = 0; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the SoftUART transmit timer interrupt. +// +//***************************************************************************** +void +Timer0AIntHandler(void) +{ + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); + + // + // Call the SoftUART transmit timer tick function. + // + SoftUARTTxTimerTick(&g_sUART); +} + +//***************************************************************************** +// +// The interrupt handler for the SoftUART receive timer interrupt. +// +//***************************************************************************** +void +Timer0BIntHandler(void) +{ + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMB_TIMEOUT); + + // + // Call the SoftUART receive timer tick function, and see if the timer + // should be disabled. + // + if(SoftUARTRxTick(&g_sUART, false) == SOFTUART_RXTIMER_END) + { + // + // Disable the timer interrupt since the SoftUART doesn't need it any + // longer. + // + ROM_TimerDisable(TIMER0_BASE, TIMER_B); + } +} + +//***************************************************************************** +// +// The interrupt handler for the SoftUART GPIO edge interrupt. +// +//***************************************************************************** +void +GPIOAIntHandler(void) +{ + // + // Configure the SoftUART receive timer so that it will sample at the + // mid-bit time of this character. + // + ROM_TimerDisable(TIMER0_BASE, TIMER_B); + ROM_TimerLoadSet(TIMER0_BASE, TIMER_B, g_ui32BitTime); + ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMB_TIMEOUT); + ROM_TimerEnable(TIMER0_BASE, TIMER_B); + + // + // Call the SoftUART receive timer tick function. + // + SoftUARTRxTick(&g_sUART, true); +} + +//***************************************************************************** +// +// The SoftUART "interrupt" handler. +// +//***************************************************************************** +void +SoftUARTIntHandler(void) +{ + uint32_t ui32Status; + + // + // Get the interrrupt status. + // + ui32Status = SoftUARTIntStatus(&g_sUART, true); + + // + // Clear the asserted interrupts. + // + SoftUARTIntClear(&g_sUART, ui32Status); + + // + // Set the flag indicating that there are characters to be read from the + // receive buffer. This is done instead of reading the characters here in + // order to minimize the amount of time spent in the "interrupt" handler + // (which is important at higher baud rates). + // + g_ui32Flag = 1; +} + +//***************************************************************************** +// +// Send a string to the UART. +// +//***************************************************************************** +void +UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count) +{ + // + // Loop while there are more characters to send. + // + while(ui32Count--) + { + // + // Write the next character to the UART. + // + SoftUARTCharPut(&g_sUART, *pui8Buffer++); + } +} + +//***************************************************************************** +// +// This example demonstrates how to send a string of data to the UART. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + tContext sContext; + + // + // Set the clocking to run at 50 MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "softuart-echo", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Initialize the display and write some instructions. + // + GrStringDrawCentered(&sContext, "Connect a", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, false); + GrStringDrawCentered(&sContext, "terminal", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, false); + GrStringDrawCentered(&sContext, "to UART0.", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, false); + GrStringDrawCentered(&sContext, "115000,N,8,1", -1, + GrContextDpyWidthGet(&sContext) / 2, 50, false); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); + + // + // Compute the bit time for 115,200 baud. + // + g_ui32BitTime = (ROM_SysCtlClockGet() / 115200) - 1; + + // + // Configure the SoftUART for 8-N-1 operation. + // + SoftUARTInit(&g_sUART); + SoftUARTRxGPIOSet(&g_sUART, GPIO_PORTA_BASE, GPIO_PIN_0); + SoftUARTTxGPIOSet(&g_sUART, GPIO_PORTA_BASE, GPIO_PIN_1); + SoftUARTRxBufferSet(&g_sUART, g_pui16RxBuffer, + sizeof(g_pui16RxBuffer) / sizeof(g_pui16RxBuffer[0])); + SoftUARTTxBufferSet(&g_sUART, g_pui8TxBuffer, sizeof(g_pui8TxBuffer)); + SoftUARTCallbackSet(&g_sUART, SoftUARTIntHandler); + SoftUARTConfigSet(&g_sUART, + (SOFTUART_CONFIG_WLEN_8 | SOFTUART_CONFIG_STOP_ONE | + SOFTUART_CONFIG_PAR_NONE)); + + // + // Configure the timer for the SoftUART transmitter. + // + ROM_TimerConfigure(TIMER0_BASE, + (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODIC | + TIMER_CFG_B_PERIODIC)); + ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, g_ui32BitTime); + ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT | TIMER_TIMB_TIMEOUT); + ROM_TimerEnable(TIMER0_BASE, TIMER_A); + + // + // Set the priorities of the interrupts associated with the SoftUART. The + // receiver is higher priority than the transmitter, and the receiver edge + // interrupt is higher priority than the receiver timer interrupt. + // + ROM_IntPrioritySet(INT_GPIOA, 0x00); + ROM_IntPrioritySet(INT_TIMER0B, 0x40); + ROM_IntPrioritySet(INT_TIMER0A, 0x80); + + // + // Enable the interrupts associated with the SoftUART. + // + ROM_IntEnable(INT_TIMER0A); + ROM_IntEnable(INT_TIMER0B); + ROM_IntEnable(INT_GPIOA); + + // + // Prompt for text to be entered. + // + UARTSend((uint8_t *)"\033[2JEnter text: ", 16); + + // + // Enable the SoftUART interrupt. + // + SoftUARTIntEnable(&g_sUART, SOFTUART_INT_RX | SOFTUART_INT_RT); + + // + // Loop forever echoing data through the UART. + // + while(1) + { + // + // Wait until there are characters available in the receive buffer. + // + while(g_ui32Flag == 0) + { + } + g_ui32Flag = 0; + + // + // Loop while there are characters in the receive buffer. + // + while(SoftUARTCharsAvail(&g_sUART)) + { + // + // Read the next character from the UART and write it back to the + // UART. + // + SoftUARTCharPutNonBlocking(&g_sUART, + SoftUARTCharGetNonBlocking(&g_sUART)); + } + } +} diff --git a/boards/dk-tm4c123g/softuart_echo/softuart_echo.ewd b/boards/dk-tm4c123g/softuart_echo/softuart_echo.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/softuart_echo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/softuart_echo/softuart_echo.ewp b/boards/dk-tm4c123g/softuart_echo/softuart_echo.ewp new file mode 100644 index 0000000..7553594 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/softuart_echo.ewp @@ -0,0 +1,795 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\utils\softuart.c + + + $PROJ_DIR$\softuart_echo.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/dk-tm4c123g/softuart_echo/softuart_echo.icf b/boards/dk-tm4c123g/softuart_echo/softuart_echo.icf new file mode 100644 index 0000000..0dc9f7b --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/softuart_echo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// softuart_echo.icf - Linker configuration file for softuart_echo. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/softuart_echo/softuart_echo.ld b/boards/dk-tm4c123g/softuart_echo/softuart_echo.ld new file mode 100644 index 0000000..0cba273 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/softuart_echo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * softuart_echo.ld - Linker configuration file for softuart_echo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/softuart_echo/softuart_echo.sct b/boards/dk-tm4c123g/softuart_echo/softuart_echo.sct new file mode 100644 index 0000000..3ea14c8 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/softuart_echo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; softuart_echo.sct - Linker configuration file for softuart_echo. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/softuart_echo/softuart_echo.uvopt b/boards/dk-tm4c123g/softuart_echo/softuart_echo.uvopt new file mode 100644 index 0000000..469d637 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/softuart_echo.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + softuart_echo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\softuart.c + softuart.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\softuart_echo.c + softuart_echo.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/softuart_echo/softuart_echo.uvproj b/boards/dk-tm4c123g/softuart_echo/softuart_echo.uvproj new file mode 100644 index 0000000..4a8bb8b --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/softuart_echo.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + softuart_echo + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + softuart_echo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\softuart_echo.bin .\rvmdk\softuart_echo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + softuart_echo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + softuart.c + 1 + ..\..\..\..\utils\softuart.c + + + softuart_echo.c + 1 + .\softuart_echo.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/softuart_echo/softuart_echo_ccs.cmd b/boards/dk-tm4c123g/softuart_echo/softuart_echo_ccs.cmd new file mode 100644 index 0000000..2cc9c0e --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/softuart_echo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * softuart_echo_ccs.cmd - CCS linker configuration file for softuart_echo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c123g/softuart_echo/startup_ccs.c b/boards/dk-tm4c123g/softuart_echo/startup_ccs.c new file mode 100644 index 0000000..ab5ded8 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void GPIOAIntHandler(void); +extern void Timer0AIntHandler(void); +extern void Timer0BIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + GPIOAIntHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0AIntHandler, // Timer 0 subtimer A + Timer0BIntHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/softuart_echo/startup_ewarm.c b/boards/dk-tm4c123g/softuart_echo/startup_ewarm.c new file mode 100644 index 0000000..64f2502 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void GPIOAIntHandler(void); +extern void Timer0AIntHandler(void); +extern void Timer0BIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + GPIOAIntHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0AIntHandler, // Timer 0 subtimer A + Timer0BIntHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/softuart_echo/startup_gcc.c b/boards/dk-tm4c123g/softuart_echo/startup_gcc.c new file mode 100644 index 0000000..34b7a69 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void GPIOAIntHandler(void); +extern void Timer0AIntHandler(void); +extern void Timer0BIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + GPIOAIntHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0AIntHandler, // Timer 0 subtimer A + Timer0BIntHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/softuart_echo/startup_rvmdk.S b/boards/dk-tm4c123g/softuart_echo/startup_rvmdk.S new file mode 100644 index 0000000..5274004 --- /dev/null +++ b/boards/dk-tm4c123g/softuart_echo/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN GPIOAIntHandler + EXTERN Timer0AIntHandler + EXTERN Timer0BIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD GPIOAIntHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD Timer0AIntHandler ; Timer 0 subtimer A + DCD Timer0BIntHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/timers/Makefile b/boards/dk-tm4c123g/timers/Makefile new file mode 100644 index 0000000..8df9763 --- /dev/null +++ b/boards/dk-tm4c123g/timers/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the timers example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the timers example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/timers.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the timers example. +# +${COMPILER}/timers.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/timers.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/timers.axf: ${COMPILER}/timers.o +${COMPILER}/timers.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/timers.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/timers.axf: timers.ld +SCATTERgcc_timers=timers.ld +ENTRY_timers=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/timers/ccs/.ccsimportspec b/boards/dk-tm4c123g/timers/ccs/.ccsimportspec new file mode 100644 index 0000000..e61983c --- /dev/null +++ b/boards/dk-tm4c123g/timers/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/timers/ccs/.ccsproject b/boards/dk-tm4c123g/timers/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/timers/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/timers/ccs/.cproject b/boards/dk-tm4c123g/timers/ccs/.cproject new file mode 100644 index 0000000..e62ac40 --- /dev/null +++ b/boards/dk-tm4c123g/timers/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/timers/ccs/.project b/boards/dk-tm4c123g/timers/ccs/.project new file mode 100644 index 0000000..b8a16a2 --- /dev/null +++ b/boards/dk-tm4c123g/timers/ccs/.project @@ -0,0 +1,55 @@ + + + timers + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/timers/startup_ccs.c + + + timers.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/timers/timers.c + + + timers_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/timers/timers_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/timers/ccs/Debug/timers.bin b/boards/dk-tm4c123g/timers/ccs/Debug/timers.bin new file mode 100644 index 0000000..e16aed5 Binary files /dev/null and b/boards/dk-tm4c123g/timers/ccs/Debug/timers.bin differ diff --git a/boards/dk-tm4c123g/timers/ccs/Debug/timers.out b/boards/dk-tm4c123g/timers/ccs/Debug/timers.out new file mode 100644 index 0000000..d8fdad4 Binary files /dev/null and b/boards/dk-tm4c123g/timers/ccs/Debug/timers.out differ diff --git a/boards/dk-tm4c123g/timers/ccs/macros.ini_initial b/boards/dk-tm4c123g/timers/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/timers/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/timers/ccs/target_config.ccxml b/boards/dk-tm4c123g/timers/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/timers/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/timers/ewarm/Exe/timers.bin b/boards/dk-tm4c123g/timers/ewarm/Exe/timers.bin new file mode 100644 index 0000000..33de757 Binary files /dev/null and b/boards/dk-tm4c123g/timers/ewarm/Exe/timers.bin differ diff --git a/boards/dk-tm4c123g/timers/ewarm/Exe/timers.out b/boards/dk-tm4c123g/timers/ewarm/Exe/timers.out new file mode 100644 index 0000000..8a86a70 Binary files /dev/null and b/boards/dk-tm4c123g/timers/ewarm/Exe/timers.out differ diff --git a/boards/dk-tm4c123g/timers/gcc/timers.axf b/boards/dk-tm4c123g/timers/gcc/timers.axf new file mode 100644 index 0000000..fe81ee2 Binary files /dev/null and b/boards/dk-tm4c123g/timers/gcc/timers.axf differ diff --git a/boards/dk-tm4c123g/timers/gcc/timers.bin b/boards/dk-tm4c123g/timers/gcc/timers.bin new file mode 100644 index 0000000..9705675 Binary files /dev/null and b/boards/dk-tm4c123g/timers/gcc/timers.bin differ diff --git a/boards/dk-tm4c123g/timers/readme.txt b/boards/dk-tm4c123g/timers/readme.txt new file mode 100644 index 0000000..584356c --- /dev/null +++ b/boards/dk-tm4c123g/timers/readme.txt @@ -0,0 +1,26 @@ +Timer + +This example application demonstrates the use of the timers to generate +periodic interrupts. One timer is set up to interrupt once per second and +the other to interrupt twice per second; each interrupt handler will toggle +its own indicator on the display. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/timers/rvmdk/timers.axf b/boards/dk-tm4c123g/timers/rvmdk/timers.axf new file mode 100644 index 0000000..a71f3ec Binary files /dev/null and b/boards/dk-tm4c123g/timers/rvmdk/timers.axf differ diff --git a/boards/dk-tm4c123g/timers/rvmdk/timers.bin b/boards/dk-tm4c123g/timers/rvmdk/timers.bin new file mode 100644 index 0000000..d15d0cc Binary files /dev/null and b/boards/dk-tm4c123g/timers/rvmdk/timers.bin differ diff --git a/boards/dk-tm4c123g/timers/startup_ccs.c b/boards/dk-tm4c123g/timers/startup_ccs.c new file mode 100644 index 0000000..79b7cc0 --- /dev/null +++ b/boards/dk-tm4c123g/timers/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/timers/startup_ewarm.c b/boards/dk-tm4c123g/timers/startup_ewarm.c new file mode 100644 index 0000000..139418a --- /dev/null +++ b/boards/dk-tm4c123g/timers/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/timers/startup_gcc.c b/boards/dk-tm4c123g/timers/startup_gcc.c new file mode 100644 index 0000000..2bb405c --- /dev/null +++ b/boards/dk-tm4c123g/timers/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/timers/startup_rvmdk.S b/boards/dk-tm4c123g/timers/startup_rvmdk.S new file mode 100644 index 0000000..2bc2795 --- /dev/null +++ b/boards/dk-tm4c123g/timers/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN Timer0IntHandler + EXTERN Timer1IntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD Timer0IntHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD Timer1IntHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/timers/timers.c b/boards/dk-tm4c123g/timers/timers.c new file mode 100644 index 0000000..5d68ee7 --- /dev/null +++ b/boards/dk-tm4c123g/timers/timers.c @@ -0,0 +1,234 @@ +//***************************************************************************** +// +// timers.c - Timers example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Timer (timers)

+//! +//! This example application demonstrates the use of the timers to generate +//! periodic interrupts. One timer is set up to interrupt once per second and +//! the other to interrupt twice per second; each interrupt handler will toggle +//! its own indicator on the display. +// +//***************************************************************************** + +//***************************************************************************** +// +// Flags that contain the current value of the interrupt indicator as displayed +// on the CSTN display. +// +//***************************************************************************** +uint32_t g_ui32Flags; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the first timer interrupt. +// +//***************************************************************************** +void +Timer0IntHandler(void) +{ + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); + + // + // Toggle the flag for the first timer. + // + HWREGBITW(&g_ui32Flags, 0) ^= 1; + + // + // Update the interrupt status on the display. + // + ROM_IntMasterDisable(); + GrStringDraw(&g_sContext, (HWREGBITW(&g_ui32Flags, 0) ? "1" : "0"), -1, 68, + 26, 1); + ROM_IntMasterEnable(); +} + +//***************************************************************************** +// +// The interrupt handler for the second timer interrupt. +// +//***************************************************************************** +void +Timer1IntHandler(void) +{ + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); + + // + // Toggle the flag for the second timer. + // + HWREGBITW(&g_ui32Flags, 1) ^= 1; + + // + // Update the interrupt status on the display. + // + ROM_IntMasterDisable(); + GrStringDraw(&g_sContext, (HWREGBITW(&g_ui32Flags, 1) ? "1" : "0"), -1, 68, + 36, 1); + ROM_IntMasterEnable(); +} + +//***************************************************************************** +// +// This example application demonstrates the use of the timers to generate +// periodic interrupts. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "timers", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + + // + // Initialize timer status display. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDraw(&g_sContext, "Timer 0:", -1, 16, 26, 0); + GrStringDraw(&g_sContext, "Timer 1:", -1, 16, 36, 0); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); + + // + // Enable processor interrupts. + // + ROM_IntMasterEnable(); + + // + // Configure the two 32-bit periodic timers. + // + ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); + ROM_TimerConfigure(TIMER1_BASE, TIMER_CFG_PERIODIC); + ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ROM_SysCtlClockGet()); + ROM_TimerLoadSet(TIMER1_BASE, TIMER_A, ROM_SysCtlClockGet() / 2); + + // + // Setup the interrupts for the timer timeouts. + // + ROM_IntEnable(INT_TIMER0A); + ROM_IntEnable(INT_TIMER1A); + ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); + ROM_TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); + + // + // Enable the timers. + // + ROM_TimerEnable(TIMER0_BASE, TIMER_A); + ROM_TimerEnable(TIMER1_BASE, TIMER_A); + + // + // Loop forever while the timers run. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/timers/timers.ewd b/boards/dk-tm4c123g/timers/timers.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/timers/timers.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/timers/timers.ewp b/boards/dk-tm4c123g/timers/timers.ewp new file mode 100644 index 0000000..c7ce3b6 --- /dev/null +++ b/boards/dk-tm4c123g/timers/timers.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\timers.c + + + diff --git a/boards/dk-tm4c123g/timers/timers.icf b/boards/dk-tm4c123g/timers/timers.icf new file mode 100644 index 0000000..dab1055 --- /dev/null +++ b/boards/dk-tm4c123g/timers/timers.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// timers.icf - Linker configuration file for timers. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/timers/timers.ld b/boards/dk-tm4c123g/timers/timers.ld new file mode 100644 index 0000000..1f10007 --- /dev/null +++ b/boards/dk-tm4c123g/timers/timers.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * timers.ld - Linker configuration file for timers. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/timers/timers.sct b/boards/dk-tm4c123g/timers/timers.sct new file mode 100644 index 0000000..0af8a83 --- /dev/null +++ b/boards/dk-tm4c123g/timers/timers.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; timers.sct - Linker configuration file for timers. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/timers/timers.uvopt b/boards/dk-tm4c123g/timers/timers.uvopt new file mode 100644 index 0000000..6f4178e --- /dev/null +++ b/boards/dk-tm4c123g/timers/timers.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + timers + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\timers.c + timers.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/timers/timers.uvproj b/boards/dk-tm4c123g/timers/timers.uvproj new file mode 100644 index 0000000..fe1ff37 --- /dev/null +++ b/boards/dk-tm4c123g/timers/timers.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + timers + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + timers + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\timers.bin .\rvmdk\timers.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + timers.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + timers.c + 1 + .\timers.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/timers/timers_ccs.cmd b/boards/dk-tm4c123g/timers/timers_ccs.cmd new file mode 100644 index 0000000..8b8d04f --- /dev/null +++ b/boards/dk-tm4c123g/timers/timers_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * timers_ccs.cmd - CCS linker configuration file for timers. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/uart_echo/Makefile b/boards/dk-tm4c123g/uart_echo/Makefile new file mode 100644 index 0000000..191215e --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the uart_echo example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the uart_echo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/uart_echo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the uart_echo example. +# +${COMPILER}/uart_echo.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/uart_echo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/uart_echo.axf: ${COMPILER}/uart_echo.o +${COMPILER}/uart_echo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/uart_echo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/uart_echo.axf: uart_echo.ld +SCATTERgcc_uart_echo=uart_echo.ld +ENTRY_uart_echo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/uart_echo/ccs/.ccsimportspec b/boards/dk-tm4c123g/uart_echo/ccs/.ccsimportspec new file mode 100644 index 0000000..9a02fa9 --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/uart_echo/ccs/.ccsproject b/boards/dk-tm4c123g/uart_echo/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/uart_echo/ccs/.cproject b/boards/dk-tm4c123g/uart_echo/ccs/.cproject new file mode 100644 index 0000000..cbedebe --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/uart_echo/ccs/.project b/boards/dk-tm4c123g/uart_echo/ccs/.project new file mode 100644 index 0000000..062e517 --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/ccs/.project @@ -0,0 +1,55 @@ + + + uart_echo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/uart_echo/startup_ccs.c + + + uart_echo.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/uart_echo/uart_echo.c + + + uart_echo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/uart_echo/uart_echo_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/uart_echo/ccs/Debug/uart_echo.bin b/boards/dk-tm4c123g/uart_echo/ccs/Debug/uart_echo.bin new file mode 100644 index 0000000..a2161a8 Binary files /dev/null and b/boards/dk-tm4c123g/uart_echo/ccs/Debug/uart_echo.bin differ diff --git a/boards/dk-tm4c123g/uart_echo/ccs/Debug/uart_echo.out b/boards/dk-tm4c123g/uart_echo/ccs/Debug/uart_echo.out new file mode 100644 index 0000000..b6babf5 Binary files /dev/null and b/boards/dk-tm4c123g/uart_echo/ccs/Debug/uart_echo.out differ diff --git a/boards/dk-tm4c123g/uart_echo/ccs/macros.ini_initial b/boards/dk-tm4c123g/uart_echo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/uart_echo/ccs/target_config.ccxml b/boards/dk-tm4c123g/uart_echo/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/uart_echo/ewarm/Exe/uart_echo.bin b/boards/dk-tm4c123g/uart_echo/ewarm/Exe/uart_echo.bin new file mode 100644 index 0000000..b6d467d Binary files /dev/null and b/boards/dk-tm4c123g/uart_echo/ewarm/Exe/uart_echo.bin differ diff --git a/boards/dk-tm4c123g/uart_echo/ewarm/Exe/uart_echo.out b/boards/dk-tm4c123g/uart_echo/ewarm/Exe/uart_echo.out new file mode 100644 index 0000000..a96d318 Binary files /dev/null and b/boards/dk-tm4c123g/uart_echo/ewarm/Exe/uart_echo.out differ diff --git a/boards/dk-tm4c123g/uart_echo/gcc/uart_echo.axf b/boards/dk-tm4c123g/uart_echo/gcc/uart_echo.axf new file mode 100644 index 0000000..7364fec Binary files /dev/null and b/boards/dk-tm4c123g/uart_echo/gcc/uart_echo.axf differ diff --git a/boards/dk-tm4c123g/uart_echo/gcc/uart_echo.bin b/boards/dk-tm4c123g/uart_echo/gcc/uart_echo.bin new file mode 100644 index 0000000..168e164 Binary files /dev/null and b/boards/dk-tm4c123g/uart_echo/gcc/uart_echo.bin differ diff --git a/boards/dk-tm4c123g/uart_echo/readme.txt b/boards/dk-tm4c123g/uart_echo/readme.txt new file mode 100644 index 0000000..64da99a --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/readme.txt @@ -0,0 +1,26 @@ +UART Echo + +This example application utilizes the UART to echo text. The first UART +(connected to the USB debug virtual serial port on the evaluation board) +will be configured in 115,200 baud, 8-n-1 mode. All characters received on +the UART are transmitted back to the UART. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/uart_echo/rvmdk/uart_echo.axf b/boards/dk-tm4c123g/uart_echo/rvmdk/uart_echo.axf new file mode 100644 index 0000000..5a459e1 Binary files /dev/null and b/boards/dk-tm4c123g/uart_echo/rvmdk/uart_echo.axf differ diff --git a/boards/dk-tm4c123g/uart_echo/rvmdk/uart_echo.bin b/boards/dk-tm4c123g/uart_echo/rvmdk/uart_echo.bin new file mode 100644 index 0000000..994d35f Binary files /dev/null and b/boards/dk-tm4c123g/uart_echo/rvmdk/uart_echo.bin differ diff --git a/boards/dk-tm4c123g/uart_echo/startup_ccs.c b/boards/dk-tm4c123g/uart_echo/startup_ccs.c new file mode 100644 index 0000000..2fd7aae --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/uart_echo/startup_ewarm.c b/boards/dk-tm4c123g/uart_echo/startup_ewarm.c new file mode 100644 index 0000000..3b30f91 --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/uart_echo/startup_gcc.c b/boards/dk-tm4c123g/uart_echo/startup_gcc.c new file mode 100644 index 0000000..6dfbaa1 --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/uart_echo/startup_rvmdk.S b/boards/dk-tm4c123g/uart_echo/startup_rvmdk.S new file mode 100644 index 0000000..16d5b46 --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN UARTIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/uart_echo/uart_echo.c b/boards/dk-tm4c123g/uart_echo/uart_echo.c new file mode 100644 index 0000000..6a664f1 --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/uart_echo.c @@ -0,0 +1,225 @@ +//***************************************************************************** +// +// uart_echo.c - Example for reading data from and writing data to the UART in +// an interrupt driven fashion. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

UART Echo (uart_echo)

+//! +//! This example application utilizes the UART to echo text. The first UART +//! (connected to the USB debug virtual serial port on the evaluation board) +//! will be configured in 115,200 baud, 8-n-1 mode. All characters received on +//! the UART are transmitted back to the UART. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The UART interrupt handler. +// +//***************************************************************************** +void +UARTIntHandler(void) +{ + uint32_t ui32Status; + + // + // Get the interrrupt status. + // + ui32Status = ROM_UARTIntStatus(UART0_BASE, true); + + // + // Clear the asserted interrupts. + // + ROM_UARTIntClear(UART0_BASE, ui32Status); + + // + // Loop while there are characters in the receive FIFO. + // + while(ROM_UARTCharsAvail(UART0_BASE)) + { + // + // Read the next character from the UART and write it back to the UART. + // + ROM_UARTCharPutNonBlocking(UART0_BASE, + ROM_UARTCharGetNonBlocking(UART0_BASE)); + } +} + +//***************************************************************************** +// +// Send a string to the UART. +// +//***************************************************************************** +void +UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count) +{ + // + // Loop while there are more characters to send. + // + while(ui32Count--) + { + // + // Write the next character to the UART. + // + ROM_UARTCharPutNonBlocking(UART0_BASE, *pui8Buffer++); + } +} + +//***************************************************************************** +// +// This example demonstrates how to send a string of data to the UART. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + tContext sContext; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "uart-echo", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Initialize the display and write some instructions. + // + GrStringDrawCentered(&sContext, "Connect a", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, false); + GrStringDrawCentered(&sContext, "terminal", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, false); + GrStringDrawCentered(&sContext, "to UART0.", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, false); + GrStringDrawCentered(&sContext, "115000,N,8,1", -1, + GrContextDpyWidthGet(&sContext) / 2, 50, false); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Enable processor interrupts. + // + ROM_IntMasterEnable(); + + // + // Set GPIO A0 and A1 as UART pins. + // + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure the UART for 115,200, 8-N-1 operation. + // + ROM_UARTConfigSetExpClk(UART0_BASE, ROM_SysCtlClockGet(), 115200, + (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | + UART_CONFIG_PAR_NONE)); + + // + // Enable the UART interrupt. + // + ROM_IntEnable(INT_UART0); + ROM_UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT); + + // + // Prompt for text to be entered. + // + UARTSend((uint8_t *)"Enter text: ", 12); + + // + // Loop forever echoing data through the UART. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/uart_echo/uart_echo.ewd b/boards/dk-tm4c123g/uart_echo/uart_echo.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/uart_echo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/uart_echo/uart_echo.ewp b/boards/dk-tm4c123g/uart_echo/uart_echo.ewp new file mode 100644 index 0000000..783ae7e --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/uart_echo.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\uart_echo.c + + + diff --git a/boards/dk-tm4c123g/uart_echo/uart_echo.icf b/boards/dk-tm4c123g/uart_echo/uart_echo.icf new file mode 100644 index 0000000..612970d --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/uart_echo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// uart_echo.icf - Linker configuration file for uart_echo. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/uart_echo/uart_echo.ld b/boards/dk-tm4c123g/uart_echo/uart_echo.ld new file mode 100644 index 0000000..6f8b55d --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/uart_echo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * uart_echo.ld - Linker configuration file for uart_echo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/uart_echo/uart_echo.sct b/boards/dk-tm4c123g/uart_echo/uart_echo.sct new file mode 100644 index 0000000..3440990 --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/uart_echo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; uart_echo.sct - Linker configuration file for uart_echo. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/uart_echo/uart_echo.uvopt b/boards/dk-tm4c123g/uart_echo/uart_echo.uvopt new file mode 100644 index 0000000..ad57975 --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/uart_echo.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + uart_echo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\uart_echo.c + uart_echo.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/uart_echo/uart_echo.uvproj b/boards/dk-tm4c123g/uart_echo/uart_echo.uvproj new file mode 100644 index 0000000..a90b15f --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/uart_echo.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + uart_echo + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + uart_echo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\uart_echo.bin .\rvmdk\uart_echo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + uart_echo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uart_echo.c + 1 + .\uart_echo.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/uart_echo/uart_echo_ccs.cmd b/boards/dk-tm4c123g/uart_echo/uart_echo_ccs.cmd new file mode 100644 index 0000000..3bab8ce --- /dev/null +++ b/boards/dk-tm4c123g/uart_echo/uart_echo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * uart_echo_ccs.cmd - CCS linker configuration file for uart_echo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c123g/udma_demo/Makefile b/boards/dk-tm4c123g/udma_demo/Makefile new file mode 100644 index 0000000..57adb34 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/Makefile @@ -0,0 +1,90 @@ +#****************************************************************************** +# +# Makefile - Rules for building the uDMA example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the uDMA example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/udma_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the uDMA example. +# +${COMPILER}/udma_demo.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/udma_demo.axf: ${COMPILER}/cpu_usage.o +${COMPILER}/udma_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/udma_demo.axf: ${COMPILER}/udma_demo.o +${COMPILER}/udma_demo.axf: ${COMPILER}/ustdlib.o +${COMPILER}/udma_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/udma_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/udma_demo.axf: udma_demo.ld +SCATTERgcc_udma_demo=udma_demo.ld +ENTRY_udma_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/udma_demo/ccs/.ccsimportspec b/boards/dk-tm4c123g/udma_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..aea8941 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/udma_demo/ccs/.ccsproject b/boards/dk-tm4c123g/udma_demo/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/udma_demo/ccs/.cproject b/boards/dk-tm4c123g/udma_demo/ccs/.cproject new file mode 100644 index 0000000..31d491e --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/udma_demo/ccs/.project b/boards/dk-tm4c123g/udma_demo/ccs/.project new file mode 100644 index 0000000..541d865 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/ccs/.project @@ -0,0 +1,65 @@ + + + udma_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/udma_demo/startup_ccs.c + + + udma_demo.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/udma_demo/udma_demo.c + + + udma_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/udma_demo/udma_demo_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/cpu_usage.c + 1 + SW_ROOT/utils/cpu_usage.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/udma_demo/ccs/Debug/udma_demo.bin b/boards/dk-tm4c123g/udma_demo/ccs/Debug/udma_demo.bin new file mode 100644 index 0000000..92f7302 Binary files /dev/null and b/boards/dk-tm4c123g/udma_demo/ccs/Debug/udma_demo.bin differ diff --git a/boards/dk-tm4c123g/udma_demo/ccs/Debug/udma_demo.out b/boards/dk-tm4c123g/udma_demo/ccs/Debug/udma_demo.out new file mode 100644 index 0000000..74f1ced Binary files /dev/null and b/boards/dk-tm4c123g/udma_demo/ccs/Debug/udma_demo.out differ diff --git a/boards/dk-tm4c123g/udma_demo/ccs/macros.ini_initial b/boards/dk-tm4c123g/udma_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/udma_demo/ccs/target_config.ccxml b/boards/dk-tm4c123g/udma_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/udma_demo/ewarm/Exe/udma_demo.bin b/boards/dk-tm4c123g/udma_demo/ewarm/Exe/udma_demo.bin new file mode 100644 index 0000000..1393334 Binary files /dev/null and b/boards/dk-tm4c123g/udma_demo/ewarm/Exe/udma_demo.bin differ diff --git a/boards/dk-tm4c123g/udma_demo/ewarm/Exe/udma_demo.out b/boards/dk-tm4c123g/udma_demo/ewarm/Exe/udma_demo.out new file mode 100644 index 0000000..270857a Binary files /dev/null and b/boards/dk-tm4c123g/udma_demo/ewarm/Exe/udma_demo.out differ diff --git a/boards/dk-tm4c123g/udma_demo/gcc/udma_demo.axf b/boards/dk-tm4c123g/udma_demo/gcc/udma_demo.axf new file mode 100644 index 0000000..1a7fe58 Binary files /dev/null and b/boards/dk-tm4c123g/udma_demo/gcc/udma_demo.axf differ diff --git a/boards/dk-tm4c123g/udma_demo/gcc/udma_demo.bin b/boards/dk-tm4c123g/udma_demo/gcc/udma_demo.bin new file mode 100644 index 0000000..393a4f2 Binary files /dev/null and b/boards/dk-tm4c123g/udma_demo/gcc/udma_demo.bin differ diff --git a/boards/dk-tm4c123g/udma_demo/readme.txt b/boards/dk-tm4c123g/udma_demo/readme.txt new file mode 100644 index 0000000..a2b1c60 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/readme.txt @@ -0,0 +1,25 @@ +uDMA + +This example application demonstrates the use of the uDMA controller to +transfer data between memory buffers, and to transfer data to and from a +UART. The test runs for 10 seconds before exiting. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/udma_demo/rvmdk/udma_demo.axf b/boards/dk-tm4c123g/udma_demo/rvmdk/udma_demo.axf new file mode 100644 index 0000000..39df6c4 Binary files /dev/null and b/boards/dk-tm4c123g/udma_demo/rvmdk/udma_demo.axf differ diff --git a/boards/dk-tm4c123g/udma_demo/rvmdk/udma_demo.bin b/boards/dk-tm4c123g/udma_demo/rvmdk/udma_demo.bin new file mode 100644 index 0000000..731dd23 Binary files /dev/null and b/boards/dk-tm4c123g/udma_demo/rvmdk/udma_demo.bin differ diff --git a/boards/dk-tm4c123g/udma_demo/startup_ccs.c b/boards/dk-tm4c123g/udma_demo/startup_ccs.c new file mode 100644 index 0000000..0eaffa7 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/startup_ccs.c @@ -0,0 +1,305 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART0IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/udma_demo/startup_ewarm.c b/boards/dk-tm4c123g/udma_demo/startup_ewarm.c new file mode 100644 index 0000000..9c63b36 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/startup_ewarm.c @@ -0,0 +1,336 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART0IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/udma_demo/startup_gcc.c b/boards/dk-tm4c123g/udma_demo/startup_gcc.c new file mode 100644 index 0000000..b2dd911 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/startup_gcc.c @@ -0,0 +1,352 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART0IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/udma_demo/startup_rvmdk.S b/boards/dk-tm4c123g/udma_demo/startup_rvmdk.S new file mode 100644 index 0000000..381c18f --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/startup_rvmdk.S @@ -0,0 +1,361 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN UART0IntHandler + EXTERN uDMAIntHandler + EXTERN uDMAErrorHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UART0IntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD uDMAIntHandler ; uDMA Software Transfer + DCD uDMAErrorHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/udma_demo/udma_demo.c b/boards/dk-tm4c123g/udma_demo/udma_demo.c new file mode 100644 index 0000000..bdf4aeb --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/udma_demo.c @@ -0,0 +1,916 @@ +//***************************************************************************** +// +// udma_demo.c - uDMA example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_uart.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "utils/cpu_usage.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

uDMA (udma_demo)

+//! +//! This example application demonstrates the use of the uDMA controller to +//! transfer data between memory buffers, and to transfer data to and from a +//! UART. The test runs for 10 seconds before exiting. +// +//***************************************************************************** + +//***************************************************************************** +// +// The number of SysTick ticks per second used for the SysTick interrupt. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 + +//***************************************************************************** +// +// The size of the memory transfer source and destination buffers (in words). +// +//***************************************************************************** +#define MEM_BUFFER_SIZE 1024 + +//***************************************************************************** +// +// The size of the UART transmit and receive buffers. They do not need to be +// the same size. +// +//***************************************************************************** +#define UART_TXBUF_SIZE 256 +#define UART_RXBUF_SIZE 256 + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +static tContext g_sContext; + +//***************************************************************************** +// +// The source and destination buffers used for memory transfers. +// +//***************************************************************************** +static uint32_t g_ui32SrcBuf[MEM_BUFFER_SIZE]; +static uint32_t g_ui32DstBuf[MEM_BUFFER_SIZE]; + +//***************************************************************************** +// +// The transmit and receive buffers used for the UART transfers. There is one +// transmit buffer and a pair of recieve ping-pong buffers. +// +//***************************************************************************** +static uint8_t g_ui8TxBuf[UART_TXBUF_SIZE]; +static uint8_t g_ui8RxBufA[UART_RXBUF_SIZE]; +static uint8_t g_ui8RxBufB[UART_RXBUF_SIZE]; + +//***************************************************************************** +// +// The count of uDMA errors. This value is incremented by the uDMA error +// handler. +// +//***************************************************************************** +static uint32_t g_ui32uDMAErrCount = 0; + +//***************************************************************************** +// +// The count of times the uDMA interrupt occurred but the uDMA transfer was not +// complete. This should remain 0. +// +//***************************************************************************** +static uint32_t g_ui32BadISR = 0; + +//***************************************************************************** +// +// The count of UART buffers filled, one for each ping-pong buffer. +// +//***************************************************************************** +static uint32_t g_ui32RxBufACount = 0; +static uint32_t g_ui32RxBufBCount = 0; + +//***************************************************************************** +// +// The count of memory uDMA transfer blocks. This value is incremented by the +// uDMA interrupt handler whenever a memory block transfer is completed. +// +//***************************************************************************** +static uint32_t g_ui32MemXferCount = 0; + +//***************************************************************************** +// +// The CPU usage in percent, in 16.16 fixed point format. +// +//***************************************************************************** +static uint32_t g_ui32CPUUsage; + +//***************************************************************************** +// +// The number of seconds elapsed since the start of the program. This value is +// maintained by the SysTick interrupt handler. +// +//***************************************************************************** +static uint32_t g_ui32Seconds = 0; + +//***************************************************************************** +// +// The number of ticks elapsed since the start of the program. This value is +// maintained by the SysTick interrupt handler. +// +//***************************************************************************** +static uint32_t g_ui32TickCount = 0; + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +uint8_t ui8ControlTable[1024]; +#elif defined(ccs) +#pragma DATA_ALIGN(ui8ControlTable, 1024) +uint8_t ui8ControlTable[1024]; +#else +uint8_t ui8ControlTable[1024] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the SysTick timer. This handler will increment a +// seconds counter whenever the appropriate number of ticks has occurred. It +// will also call the CPU usage tick function to find the CPU usage percent. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Increment the tick counter. + // + g_ui32TickCount++; + + // + // If the number of ticks per second has occurred, then increment the + // seconds counter. + // + if(!(g_ui32TickCount % SYSTICKS_PER_SECOND)) + { + g_ui32Seconds++; + } + + // + // Call the CPU usage tick function. This function will compute the amount + // of cycles used by the CPU since the last call and return the result in + // percent in fixed point 16.16 format. + // + g_ui32CPUUsage = CPUUsageTick(); +} + +//***************************************************************************** +// +// The interrupt handler for uDMA errors. This interrupt will occur if the +// uDMA encounters a bus error while trying to perform a transfer. This +// handler just increments a counter if an error occurs. +// +//***************************************************************************** +void +uDMAErrorHandler(void) +{ + uint32_t ui32Status; + + // + // Check for uDMA error bit + // + ui32Status = ROM_uDMAErrorStatusGet(); + + // + // If there is a uDMA error, then clear the error and increment + // the error counter. + // + if(ui32Status) + { + ROM_uDMAErrorStatusClear(); + g_ui32uDMAErrCount++; + } +} + +//***************************************************************************** +// +// The interrupt handler for uDMA interrupts from the memory channel. This +// interrupt will increment a counter, and then restart another memory +// transfer. +// +//***************************************************************************** +void +uDMAIntHandler(void) +{ + uint32_t ui32Mode; + + // + // Check for the primary control structure to indicate complete. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_SW); + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment the count of completed transfers. + // + g_ui32MemXferCount++; + + // + // Configure it for another transfer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_SW, UDMA_MODE_AUTO, + g_ui32SrcBuf, g_ui32DstBuf, + MEM_BUFFER_SIZE); + + // + // Initiate another transfer. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_SW); + ROM_uDMAChannelRequest(UDMA_CHANNEL_SW); + } + + // + // If the channel is not stopped, then something is wrong. + // + else + { + g_ui32BadISR++; + } +} + +//***************************************************************************** +// +// The interrupt handler for UART0. This interrupt will occur when a DMA +// transfer is complete using the UART0 uDMA channel. It will also be +// triggered if the peripheral signals an error. This interrupt handler will +// switch between receive ping-pong buffers A and B. It will also restart a TX +// uDMA transfer if the prior transfer is complete. This will keep the UART +// running continuously (looping TX data back to RX). +// +//***************************************************************************** +void +UART0IntHandler(void) +{ + uint32_t ui32Status; + uint32_t ui32Mode; + + // + // Read the interrupt status of the UART. + // + ui32Status = ROM_UARTIntStatus(UART0_BASE, 1); + + // + // Clear any pending status, even though there should be none since no UART + // interrupts were enabled. If UART error interrupts were enabled, then + // those interrupts could occur here and should be handled. Since uDMA is + // used for both the RX and TX, then neither of those interrupts should be + // enabled. + // + ROM_UARTIntClear(UART0_BASE, ui32Status); + + // + // Check the DMA control table to see if the ping-pong "A" transfer is + // complete. The "A" transfer uses receive buffer "A", and the primary + // control structure. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT); + + // + // If the primary control structure indicates stop, that means the "A" + // receive buffer is done. The uDMA controller should still be receiving + // data into the "B" buffer. + // + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment a counter to indicate data was received into buffer A. In + // a real application this would be used to signal the main thread that + // data was received so the main thread can process the data. + // + g_ui32RxBufACount++; + + // + // Set up the next transfer for the "A" buffer, using the primary + // control structure. When the ongoing receive into the "B" buffer is + // done, the uDMA controller will switch back to this one. This + // example re-uses buffer A, but a more sophisticated application could + // use a rotating set of buffers to increase the amount of time that + // the main thread has to process the data in the buffer before it is + // reused. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufA, sizeof(g_ui8RxBufA)); + } + + // + // Check the DMA control table to see if the ping-pong "B" transfer is + // complete. The "B" transfer uses receive buffer "B", and the alternate + // control structure. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT); + + // + // If the alternate control structure indicates stop, that means the "B" + // receive buffer is done. The uDMA controller should still be receiving + // data into the "A" buffer. + // + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment a counter to indicate data was received into buffer A. In + // a real application this would be used to signal the main thread that + // data was received so the main thread can process the data. + // + g_ui32RxBufBCount++; + + // + // Set up the next transfer for the "B" buffer, using the alternate + // control structure. When the ongoing receive into the "A" buffer is + // done, the uDMA controller will switch back to this one. This + // example re-uses buffer B, but a more sophisticated application could + // use a rotating set of buffers to increase the amount of time that + // the main thread has to process the data in the buffer before it is + // reused. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufB, sizeof(g_ui8RxBufB)); + } + + // + // If the UART0 DMA TX channel is disabled, that means the TX DMA transfer + // is done. + // + if(!ROM_uDMAChannelIsEnabled(UDMA_CHANNEL_UART0TX)) + { + // + // Start another DMA transfer to UART0 TX. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, g_ui8TxBuf, + (void *)(UART0_BASE + UART_O_DR), + sizeof(g_ui8TxBuf)); + + // + // The uDMA TX channel must be re-enabled. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART0TX); + } +} + +//***************************************************************************** +// +// Initializes the UART0 peripheral and sets up the TX and RX uDMA channels. +// The UART is configured for loopback mode so that any data sent on TX will be +// received on RX. The uDMA channels are configured so that the TX channel +// will copy data from a buffer to the UART TX output. And the uDMA RX channel +// will receive any incoming data into a pair of buffers in ping-pong mode. +// +//***************************************************************************** +void +InitUART0Transfer(void) +{ + uint_fast16_t ui16Idx; + + // + // Fill the TX buffer with a simple data pattern. + // + for(ui16Idx = 0; ui16Idx < UART_TXBUF_SIZE; ui16Idx++) + { + g_ui8TxBuf[ui16Idx] = ui16Idx; + } + + // + // Enable the UART peripheral, and configure it to operate even if the CPU + // is in sleep. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART0); + + // + // Configure the UART communication parameters. + // + ROM_UARTConfigSetExpClk(UART0_BASE, ROM_SysCtlClockGet(), 115200, + UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | + UART_CONFIG_PAR_NONE); + + // + // Set both the TX and RX trigger thresholds to 4. This will be used by + // the uDMA controller to signal when more data should be transferred. The + // uDMA TX and RX channels will be configured so that it can transfer 4 + // bytes in a burst when the UART is ready to transfer more data. + // + ROM_UARTFIFOLevelSet(UART0_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8); + + // + // Enable the UART for operation, and enable the uDMA interface for both TX + // and RX channels. + // + ROM_UARTEnable(UART0_BASE); + ROM_UARTDMAEnable(UART0_BASE, UART_DMA_RX | UART_DMA_TX); + + // + // This register write will set the UART to operate in loopback mode. Any + // data sent on the TX output will be received on the RX input. + // + HWREG(UART0_BASE + UART_O_CTL) |= UART_CTL_LBE; + + // + // Enable the UART peripheral interrupts. Note that no UART interrupts + // were enabled, but the uDMA controller will cause an interrupt on the + // UART interrupt signal when a uDMA transfer is complete. + // + ROM_IntEnable(INT_UART0); + + // + // Put the attributes in a known state for the uDMA UART0RX channel. These + // should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0RX, + UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + + // + // Configure the control parameters for the primary control structure for + // the UART RX channel. The primary contol structure is used for the "A" + // part of the ping-pong receive. The transfer data size is 8 bits, the + // source address does not increment since it will be reading from a + // register. The destination address increment is byte 8-bit bytes. The + // arbitration size is set to 4 to match the RX FIFO trigger threshold. + // The uDMA controller will use a 4 byte burst transfer if possible. This + // will be somewhat more effecient that single byte transfers. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | + UDMA_ARB_4); + + // + // Configure the control parameters for the alternate control structure for + // the UART RX channel. The alternate contol structure is used for the "B" + // part of the ping-pong receive. The configuration is identical to the + // primary/A control structure. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | + UDMA_ARB_4); + + // + // Set up the transfer parameters for the UART RX primary control + // structure. The mode is set to ping-pong, the transfer source is the + // UART data register, and the destination is the receive "A" buffer. The + // transfer size is set to match the size of the buffer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufA, sizeof(g_ui8RxBufA)); + + // + // Set up the transfer parameters for the UART RX alternate control + // structure. The mode is set to ping-pong, the transfer source is the + // UART data register, and the destination is the receive "B" buffer. The + // transfer size is set to match the size of the buffer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufB, sizeof(g_ui8RxBufB)); + + // + // Put the attributes in a known state for the uDMA UART0TX channel. These + // should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0TX, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + + // + // Set the USEBURST attribute for the uDMA UART TX channel. This will + // force the controller to always use a burst when transferring data from + // the TX buffer to the UART. This is somewhat more effecient bus usage + // than the default which allows single or burst transfers. + // + ROM_uDMAChannelAttributeEnable(UDMA_CHANNEL_UART0TX, UDMA_ATTR_USEBURST); + + // + // Configure the control parameters for the UART TX. The uDMA UART TX + // channel is used to transfer a block of data from a buffer to the UART. + // The data size is 8 bits. The source address increment is 8-bit bytes + // since the data is coming from a buffer. The destination increment is + // none since the data is to be written to the UART data register. The + // arbitration size is set to 4, which matches the UART TX FIFO trigger + // threshold. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | + UDMA_ARB_4); + + // + // Set up the transfer parameters for the uDMA UART TX channel. This will + // configure the transfer source and destination and the transfer size. + // Basic mode is used because the peripheral is making the uDMA transfer + // request. The source is the TX buffer and the destination is the UART + // data register. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, g_ui8TxBuf, + (void *)(UART0_BASE + UART_O_DR), + sizeof(g_ui8TxBuf)); + + // + // Now both the uDMA UART TX and RX channels are primed to start a + // transfer. As soon as the channels are enabled, the peripheral will + // issue a transfer request and the data transfers will begin. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART0RX); + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART0TX); +} + +//***************************************************************************** +// +// Initializes the uDMA software channel to perform a memory to memory uDMA +// transfer. +// +//***************************************************************************** +void +InitSWTransfer(void) +{ + uint_fast16_t ui16Idx; + + // + // Fill the source memory buffer with a simple incrementing pattern. + // + for(ui16Idx = 0; ui16Idx < MEM_BUFFER_SIZE; ui16Idx++) + { + g_ui32SrcBuf[ui16Idx] = ui16Idx; + } + + // + // Enable interrupts from the uDMA software channel. + // + ROM_IntEnable(INT_UDMA); + + // + // Put the attributes in a known state for the uDMA software channel. + // These should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_SW, + UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT | + (UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK)); + + // + // Configure the control parameters for the SW channel. The SW channel + // will be used to transfer between two memory buffers, 32 bits at a time. + // Therefore the data size is 32 bits, and the address increment is 32 bits + // for both source and destination. The arbitration size will be set to 8, + // which causes the uDMA controller to rearbitrate after 8 items are + // transferred. This keeps this channel from hogging the uDMA controller + // once the transfer is started, and allows other channels cycles if they + // are higher priority. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_SW | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | UDMA_DST_INC_32 | + UDMA_ARB_8); + + // + // Set up the transfer parameters for the software channel. This will + // configure the transfer buffers and the transfer size. Auto mode must be + // used for software transfers. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_SW | UDMA_PRI_SELECT, + UDMA_MODE_AUTO, g_ui32SrcBuf, g_ui32DstBuf, + MEM_BUFFER_SIZE); + + // + // Now the software channel is primed to start a transfer. The channel + // must be enabled. For software based transfers, a request must be + // issued. After this, the uDMA memory transfer begins. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_SW); + ROM_uDMAChannelRequest(UDMA_CHANNEL_SW); +} + +//***************************************************************************** +// +// This example demonstrates how to use the uDMA controller to transfer data +// between memory buffers and to and from a peripheral, in this case a UART. +// The uDMA controller is configured to repeatedly transfer a block of data +// from one memory buffer to another. It is also set up to repeatedly copy a +// block of data from a buffer to the UART output. The UART data is looped +// back so the same data is received, and the uDMA controlled is configured to +// continuously receive the UART data using ping-pong buffers. +// +// The processor is put to sleep when it is not doing anything, and this allows +// collection of CPU usage data to see how much CPU is being used while the +// data transfers are ongoing. +// +//***************************************************************************** +int +main(void) +{ + static uint32_t ui32PrevSeconds; + static uint32_t ui32PrevXferCount; + static uint32_t ui32PrevUARTCount = 0; + static char pcStrBuf[40]; + tRectangle sRect; + uint32_t ui32CenterX; + uint32_t ui32XfersCompleted; + uint32_t ui32BytesTransferred; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL at 50 MHz. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Enable peripherals to operate when CPU is in sleep. + // + ROM_SysCtlPeripheralClockGating(true); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Get the center X coordinate of the screen, since it is used a lot. + // + ui32CenterX = GrContextDpyWidthGet(&g_sContext) / 2; + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "udma-demo", -1, ui32CenterX, 4, 0); + + // + // Show the clock frequency on the display. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + usnprintf(pcStrBuf, sizeof(pcStrBuf), "%u MHz", + ROM_SysCtlClockGet() / 1000000); + GrStringDrawCentered(&g_sContext, pcStrBuf, -1, ui32CenterX, 14, 0); + + // + // Show static text and field labels on the display. + // + GrStringDraw(&g_sContext, "Mem", -1, 0, 22, 0); + GrStringDraw(&g_sContext, "UART", -1, 0, 32, 0); + + // + // Configure SysTick to occur 100 times per second, to use as a time + // reference. Enable SysTick to generate interrupts. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Initialize the CPU usage measurement routine. + // + CPUUsageInit(ROM_SysCtlClockGet(), SYSTICKS_PER_SECOND, 2); + + // + // Enable the uDMA controller at the system level. Enable it to continue + // to run while the processor is in sleep. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UDMA); + + // + // Enable the uDMA controller error interrupt. This interrupt will occur + // if there is a bus error during a transfer. + // + ROM_IntEnable(INT_UDMAERR); + + // + // Enable the uDMA controller. + // + ROM_uDMAEnable(); + + // + // Point at the control table to use for channel control structures. + // + ROM_uDMAControlBaseSet(ui8ControlTable); + + // + // Initialize the uDMA memory to memory transfers. + // + InitSWTransfer(); + + // + // Initialize the uDMA UART transfers. + // + InitUART0Transfer(); + + // + // Remember the current SysTick seconds count. + // + ui32PrevSeconds = g_ui32Seconds; + + // + // Remember the current count of memory buffer transfers. + // + ui32PrevXferCount = g_ui32MemXferCount; + + // + // Loop until the button is pressed. The processor is put to sleep + // in this loop so that CPU utilization can be measured. + // + while(1) + { + // + // Check to see if one second has elapsed. If so, the make some + // updates. + // + if(g_ui32Seconds != ui32PrevSeconds) + { + // + // Print a message to the display showing the CPU usage percent. + // The fractional part of the percent value is ignored. + // + usnprintf(pcStrBuf, sizeof(pcStrBuf), "CPU %2u%%", + g_ui32CPUUsage >> 16); + GrStringDrawCentered(&g_sContext, pcStrBuf, -1, ui32CenterX, 44, + 1); + + // + // Tell the user how many seconds we have to go before ending. + // + usnprintf(pcStrBuf, sizeof(pcStrBuf), " %d seconds ", + 10 - g_ui32Seconds); + GrStringDrawCentered(&g_sContext, pcStrBuf, -1, ui32CenterX, 54, + 1); + + // + // Remember the new seconds count. + // + ui32PrevSeconds = g_ui32Seconds; + + // + // Calculate how many memory transfers have occurred since the last + // second. + // + ui32XfersCompleted = g_ui32MemXferCount - ui32PrevXferCount; + + // + // Remember the new transfer count. + // + ui32PrevXferCount = g_ui32MemXferCount; + + // + // Compute how many bytes were transferred in the memory transfer + // since the last second. + // + ui32BytesTransferred = ui32XfersCompleted * MEM_BUFFER_SIZE * 4; + + // + // Print a message to the display showing the memory transfer rate. + // + usnprintf(pcStrBuf, sizeof(pcStrBuf), "%8u B/s ", + ui32BytesTransferred); + GrStringDraw(&g_sContext, pcStrBuf, -1, 24, 22, 1); + + // + // Calculate how many UART transfers have occurred since the last + // second. + // + ui32XfersCompleted = (g_ui32RxBufACount + g_ui32RxBufBCount - + ui32PrevUARTCount); + + // + // Remember the new UART transfer count. + // + ui32PrevUARTCount = g_ui32RxBufACount + g_ui32RxBufBCount; + + // + // Compute how many bytes were transferred by the UART. The number + // of bytes received is multiplied by 2 so that the TX bytes + // transferred are also accounted for. + // + ui32BytesTransferred = ui32XfersCompleted * UART_RXBUF_SIZE * 2; + + // + // Print a message to the display showing the UART transfer rate. + // + usnprintf(pcStrBuf, sizeof(pcStrBuf), "%7u B/s ", + ui32BytesTransferred); + GrStringDraw(&g_sContext, pcStrBuf, -1, 30, 32, 1); + } + + // + // Put the processor to sleep if there is nothing to do. This allows + // the CPU usage routine to measure the number of free CPU cycles. + // If the processor is sleeping a lot, it can be hard to connect to + // the target with the debugger. + // + ROM_SysCtlSleep(); + + // + // See if we have run int32_t enough and exit the loop if so. + // + if(g_ui32Seconds >= 10) + { + break; + } + } + + // + // Indicate on the display that the example is stopped. + // + GrContextForegroundSet(&g_sContext, ClrRed); + GrStringDrawCentered(&g_sContext, " Stopped ", -1, + ui32CenterX, 54, 1); + + // + // Loop forever with the CPU not sleeping, so the debugger can connect. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/udma_demo/udma_demo.ewd b/boards/dk-tm4c123g/udma_demo/udma_demo.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/udma_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/udma_demo/udma_demo.ewp b/boards/dk-tm4c123g/udma_demo/udma_demo.ewp new file mode 100644 index 0000000..2708996 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/udma_demo.ewp @@ -0,0 +1,798 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\utils\cpu_usage.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\udma_demo.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c123g/udma_demo/udma_demo.icf b/boards/dk-tm4c123g/udma_demo/udma_demo.icf new file mode 100644 index 0000000..52e4d24 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/udma_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// udma_demo.icf - Linker configuration file for udma_demo. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/udma_demo/udma_demo.ld b/boards/dk-tm4c123g/udma_demo/udma_demo.ld new file mode 100644 index 0000000..c8fddb6 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/udma_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * udma_demo.ld - Linker configuration file for udma_demo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/udma_demo/udma_demo.sct b/boards/dk-tm4c123g/udma_demo/udma_demo.sct new file mode 100644 index 0000000..d0eeaa1 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/udma_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; udma_demo.sct - Linker configuration file for udma_demo. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/udma_demo/udma_demo.uvopt b/boards/dk-tm4c123g/udma_demo/udma_demo.uvopt new file mode 100644 index 0000000..4d26a8e --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/udma_demo.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + udma_demo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\cpu_usage.c + cpu_usage.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\udma_demo.c + udma_demo.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/udma_demo/udma_demo.uvproj b/boards/dk-tm4c123g/udma_demo/udma_demo.uvproj new file mode 100644 index 0000000..9f799b7 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/udma_demo.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + udma_demo + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + udma_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\udma_demo.bin .\rvmdk\udma_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + udma_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + cpu_usage.c + 1 + ..\..\..\..\utils\cpu_usage.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + udma_demo.c + 1 + .\udma_demo.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/udma_demo/udma_demo_ccs.cmd b/boards/dk-tm4c123g/udma_demo/udma_demo_ccs.cmd new file mode 100644 index 0000000..0bae047 --- /dev/null +++ b/boards/dk-tm4c123g/udma_demo/udma_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * udma_demo_ccs.cmd - CCS linker configuration file for udma_demo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/usb_dev_bulk/Makefile b/boards/dk-tm4c123g/usb_dev_bulk/Makefile new file mode 100644 index 0000000..42a0fd5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device bulk example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device bulk example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_bulk.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device bulk example. +# +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/usb_bulk_structs.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/usb_dev_bulk.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_dev_bulk.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_bulk.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_bulk.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_bulk.axf: usb_dev_bulk.ld +SCATTERgcc_usb_dev_bulk=usb_dev_bulk.ld +ENTRY_usb_dev_bulk=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/usb_dev_bulk/ccs/.ccsimportspec b/boards/dk-tm4c123g/usb_dev_bulk/ccs/.ccsimportspec new file mode 100644 index 0000000..6c9f4a0 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_bulk/ccs/.ccsproject b/boards/dk-tm4c123g/usb_dev_bulk/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_bulk/ccs/.cproject b/boards/dk-tm4c123g/usb_dev_bulk/ccs/.cproject new file mode 100644 index 0000000..1637525 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/ccs/.cproject @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_bulk/ccs/.project b/boards/dk-tm4c123g/usb_dev_bulk/ccs/.project new file mode 100644 index 0000000..be6919d --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/ccs/.project @@ -0,0 +1,70 @@ + + + usb_dev_bulk + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_bulk/startup_ccs.c + + + usb_bulk_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_bulk/usb_bulk_structs.c + + + usb_dev_bulk.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.c + + + usb_dev_bulk_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin b/boards/dk-tm4c123g/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin new file mode 100644 index 0000000..c853ec6 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out b/boards/dk-tm4c123g/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out new file mode 100644 index 0000000..3f0cf49 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out differ diff --git a/boards/dk-tm4c123g/usb_dev_bulk/ccs/macros.ini_initial b/boards/dk-tm4c123g/usb_dev_bulk/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/usb_dev_bulk/ccs/target_config.ccxml b/boards/dk-tm4c123g/usb_dev_bulk/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin b/boards/dk-tm4c123g/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin new file mode 100644 index 0000000..73935e7 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out b/boards/dk-tm4c123g/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out new file mode 100644 index 0000000..d8dd2fc Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out differ diff --git a/boards/dk-tm4c123g/usb_dev_bulk/gcc/usb_dev_bulk.axf b/boards/dk-tm4c123g/usb_dev_bulk/gcc/usb_dev_bulk.axf new file mode 100644 index 0000000..6098dff Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_bulk/gcc/usb_dev_bulk.axf differ diff --git a/boards/dk-tm4c123g/usb_dev_bulk/gcc/usb_dev_bulk.bin b/boards/dk-tm4c123g/usb_dev_bulk/gcc/usb_dev_bulk.bin new file mode 100644 index 0000000..eaa7600 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_bulk/gcc/usb_dev_bulk.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_bulk/readme.txt b/boards/dk-tm4c123g/usb_dev_bulk/readme.txt new file mode 100644 index 0000000..89482f8 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/readme.txt @@ -0,0 +1,43 @@ +USB Generic Bulk Device + +This example provides a generic USB device offering simple bulk data +transfer to and from the host. The device uses a vendor-specific class ID +and supports a single bulk IN endpoint and a single bulk OUT endpoint. +Data received from the host is assumed to be ASCII text and it is +echoed back with the case of all alphabetic characters swapped. + +A Windows INF file for the device is provided on the installation CD and +in the C:/ti/TivaWare_C_Series-x.x/windows_drivers directory of TivaWare +releases. This INF contains information required to install the WinUSB +subsystem on WindowsXP and Vista PCs. WinUSB is a Windows subsystem +allowing user mode applications to access the USB device without the need +for a vendor-specific kernel mode driver. + +A sample Windows command-line application, usb_bulk_example, illustrating +how to connect to and communicate with the bulk device is also provided. +The application binary is installed as part of the ``TivaWare for C Series +PC Companion Utilities'' package (SW-TM4C-USB-WIN) on the installation CD +or via download from http://www.ti.com/tivaware . Project files are +included to allow the examples to be built using +Microsoft Visual Studio 2008. Source code for this application can be +found in directory ti/TivaWare_C_Series-x.x/tools/usb_bulk_example. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/usb_dev_bulk/rvmdk/usb_dev_bulk.axf b/boards/dk-tm4c123g/usb_dev_bulk/rvmdk/usb_dev_bulk.axf new file mode 100644 index 0000000..8850db1 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_bulk/rvmdk/usb_dev_bulk.axf differ diff --git a/boards/dk-tm4c123g/usb_dev_bulk/rvmdk/usb_dev_bulk.bin b/boards/dk-tm4c123g/usb_dev_bulk/rvmdk/usb_dev_bulk.bin new file mode 100644 index 0000000..5d16b98 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_bulk/rvmdk/usb_dev_bulk.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_bulk/startup_ccs.c b/boards/dk-tm4c123g/usb_dev_bulk/startup_ccs.c new file mode 100644 index 0000000..ffa387c --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_bulk/startup_ewarm.c b/boards/dk-tm4c123g/usb_dev_bulk/startup_ewarm.c new file mode 100644 index 0000000..886c1d0 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_bulk/startup_gcc.c b/boards/dk-tm4c123g/usb_dev_bulk/startup_gcc.c new file mode 100644 index 0000000..ff9e178 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_bulk/startup_rvmdk.S b/boards/dk-tm4c123g/usb_dev_bulk/startup_rvmdk.S new file mode 100644 index 0000000..67e9441 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN UARTStdioIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTStdioIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/usb_dev_bulk/usb_bulk_structs.c b/boards/dk-tm4c123g/usb_dev_bulk/usb_bulk_structs.c new file mode 100644 index 0000000..7f82e51 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/usb_bulk_structs.c @@ -0,0 +1,200 @@ +//***************************************************************************** +// +// usb_bulk_structs.c - Data structures defining this bulk USB device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdbulk.h" +#include "usb_bulk_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'G', 0, 'e', 0, 'n', 0, 'e', 0, 'r', 0, 'i', 0, 'c', 0, ' ', 0, 'B', 0, + 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, + 'e', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The data interface description string. +// +//***************************************************************************** +const uint8_t g_pui8DataInterfaceString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, + 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (23 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, 'i', 0, 'g', 0, + 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t *const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8DataInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The bulk device initialization and customization structures. In this case, +// we are using USBBuffers between the bulk device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the bulk channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our bulk instance structure. +// +//***************************************************************************** +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; + +tUSBDBulkDevice g_sBulkDevice = +{ + USB_VID_TI_1CBE, + USB_PID_BULK, + 500, + USB_CONF_ATTR_SELF_PWR, + USBBufferEventCallback, + (void *)&g_sRxBuffer, + USBBufferEventCallback, + (void *)&g_sTxBuffer, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; + +//***************************************************************************** +// +// Receive buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBRxBuffer[BULK_BUFFER_SIZE]; +uint8_t g_pui8RxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sRxBuffer = +{ + false, // This is a receive buffer. + RxHandler, // pfnCallback + (void *)&g_sBulkDevice, // Callback data is our device pointer. + USBDBulkPacketRead, // pfnTransfer + USBDBulkRxPacketAvailable, // pfnAvailable + (void *)&g_sBulkDevice, // pvHandle + g_pui8USBRxBuffer, // pi8Buffer + BULK_BUFFER_SIZE, // ui32BufferSize + g_pui8RxBufferWorkspace // pvWorkspace +}; + +//***************************************************************************** +// +// Transmit buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBTxBuffer[BULK_BUFFER_SIZE]; +uint8_t g_pui8TxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sTxBuffer = +{ + true, // This is a transmit buffer. + TxHandler, // pfnCallback + (void *)&g_sBulkDevice, // Callback data is our device pointer. + USBDBulkPacketWrite, // pfnTransfer + USBDBulkTxPacketAvailable, // pfnAvailable + (void *)&g_sBulkDevice, // pvHandle + g_pui8USBTxBuffer, // pi8Buffer + BULK_BUFFER_SIZE, // ui32BufferSize + g_pui8TxBufferWorkspace // pvWorkspace +}; diff --git a/boards/dk-tm4c123g/usb_dev_bulk/usb_bulk_structs.h b/boards/dk-tm4c123g/usb_dev_bulk/usb_bulk_structs.h new file mode 100644 index 0000000..3abaa3e --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/usb_bulk_structs.h @@ -0,0 +1,48 @@ +//***************************************************************************** +// +// usb_bulk_structs.h - Data structures defining this bulk USB device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_BULK_STRUCTS_H_ +#define _USB_BULK_STRUCTS_H_ + +//***************************************************************************** +// +// The size of the transmit and receive buffers used. 256 is chosen pretty +// much at random though the buffer should be at least twice the size of +// a maximum-sized USB packet. +// +//***************************************************************************** +#define BULK_BUFFER_SIZE 256 + +extern uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +extern uint32_t TxHandler(void *pvi32CBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; +extern tUSBDBulkDevice g_sBulkDevice; +extern uint8_t g_pui8USBTxBuffer[]; +extern uint8_t g_pui8USBRxBuffer[]; + +#endif diff --git a/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.c b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.c new file mode 100644 index 0000000..27ee733 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.c @@ -0,0 +1,694 @@ +//***************************************************************************** +// +// usb_dev_bulk.c - Main routines for the generic bulk device example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/timer.h" +#include "driverlib/uart.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdbulk.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" +#include "usb_bulk_structs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

USB Generic Bulk Device (usb_dev_bulk)

+//! +//! This example provides a generic USB device offering simple bulk data +//! transfer to and from the host. The device uses a vendor-specific class ID +//! and supports a single bulk IN endpoint and a single bulk OUT endpoint. +//! Data received from the host is assumed to be ASCII text and it is +//! echoed back with the case of all alphabetic characters swapped. +//! +//! A Windows INF file for the device is provided on the installation CD and +//! in the C:/ti/TivaWare_C_Series-x.x/windows_drivers directory of TivaWare +//! releases. This INF contains information required to install the WinUSB +//! subsystem on WindowsXP and Vista PCs. WinUSB is a Windows subsystem +//! allowing user mode applications to access the USB device without the need +//! for a vendor-specific kernel mode driver. +//! +//! A sample Windows command-line application, usb_bulk_example, illustrating +//! how to connect to and communicate with the bulk device is also provided. +//! The application binary is installed as part of the ``TivaWare for C Series +//! PC Companion Utilities'' package (SW-TM4C-USB-WIN) on the installation CD +//! or via download from http://www.ti.com/tivaware . Project files are +//! included to allow the examples to be built using +//! Microsoft Visual Studio 2008. Source code for this application can be +//! found in directory ti/TivaWare_C_Series-x.x/tools/usb_bulk_example. +// +//***************************************************************************** + +//***************************************************************************** +// +// The system tick rate expressed both as ticks per second and a millisecond +// period. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 +#define SYSTICK_PERIOD_MS (1000 / SYSTICKS_PER_SECOND) + +//***************************************************************************** +// +// The global system tick counter. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount = 0; + +//***************************************************************************** +// +// Variables tracking transmit and receive counts. +// +//***************************************************************************** +volatile uint32_t g_ui32TxCount = 0; +volatile uint32_t g_ui32RxCount = 0; +#ifdef DEBUG +uint32_t g_ui32UARTRxErrors = 0; +#endif + +//***************************************************************************** +// +// Debug-related definitions and declarations. +// +// Debug output is available via UART0 if DEBUG is defined during build. +// +//***************************************************************************** +#ifdef DEBUG +//***************************************************************************** +// +// Map all debug print calls to UARTprintf in debug builds. +// +//***************************************************************************** +#define DEBUG_PRINT UARTprintf + +#else + +//***************************************************************************** +// +// Compile out all debug print calls in release builds. +// +//***************************************************************************** +#define DEBUG_PRINT while(0) ((int32_t (*)(char *, ...))0) +#endif + +//***************************************************************************** +// +// Graphics context used to show text on the color LCD display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Flags used to pass commands from interrupt context to the main loop. +// +//***************************************************************************** +#define COMMAND_PACKET_RECEIVED 0x00000001 +#define COMMAND_STATUS_UPDATE 0x00000002 + +volatile uint32_t g_ui32Flags = 0; +char *g_pcStatus; + +//***************************************************************************** +// +// Global flag indicating that a USB configuration has been set. +// +//***************************************************************************** +static volatile bool g_bUSBConfigured = false; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + UARTprintf("Error at line %d of %s\n", ui32Line, pcFilename); + while(1) + { + } +} +#endif + +//***************************************************************************** +// +// Interrupt handler for the system tick counter. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Update our system tick counter. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// Receive new data and echo it back to the host. +// +// \param psDevice points to the instance data for the device whose data is to +// be processed. +// \param pi8Data points to the newly received data in the USB receive buffer. +// \param ui32NumBytes is the number of bytes of data available to be processed. +// +// This function is called whenever we receive a notification that data is +// available from the host. We read the data, byte-by-byte and swap the case +// of any alphabetical characters found then write it back out to be +// transmitted back to the host. +// +// \return Returns the number of bytes of data processed. +// +//***************************************************************************** +static uint32_t +EchoNewDataToHost(tUSBDBulkDevice *psDevice, uint8_t *pi8Data, + uint_fast32_t ui32NumBytes) +{ + uint_fast32_t ui32Loop, ui32Space, ui32Count; + uint_fast32_t ui32ReadIndex; + uint_fast32_t ui32WriteIndex; + tUSBRingBufObject sTxRing; + + // + // Get the current buffer information to allow us to write directly to + // the transmit buffer (we already have enough information from the + // parameters to access the receive buffer directly). + // + USBBufferInfoGet(&g_sTxBuffer, &sTxRing); + + // + // How much space is there in the transmit buffer? + // + ui32Space = USBBufferSpaceAvailable(&g_sTxBuffer); + + // + // How many characters can we process this time round? + // + ui32Loop = (ui32Space < ui32NumBytes) ? ui32Space : ui32NumBytes; + ui32Count = ui32Loop; + + // + // Update our receive counter. + // + g_ui32RxCount += ui32NumBytes; + + // + // Dump a debug message. + // + DEBUG_PRINT("Received %d bytes\n", ui32NumBytes); + + // + // Set up to process the characters by directly accessing the USB buffers. + // + ui32ReadIndex = (uint32_t)(pi8Data - g_pui8USBRxBuffer); + ui32WriteIndex = sTxRing.ui32WriteIndex; + + while(ui32Loop) + { + // + // Copy from the receive buffer to the transmit buffer converting + // character case on the way. + // + + // + // Is this a lower case character? + // + if((g_pui8USBRxBuffer[ui32ReadIndex] >= 'a') && + (g_pui8USBRxBuffer[ui32ReadIndex] <= 'z')) + { + // + // Convert to upper case and write to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + (g_pui8USBRxBuffer[ui32ReadIndex] - 'a') + 'A'; + } + else + { + // + // Is this an upper case character? + // + if((g_pui8USBRxBuffer[ui32ReadIndex] >= 'A') && + (g_pui8USBRxBuffer[ui32ReadIndex] <= 'Z')) + { + // + // Convert to lower case and write to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + (g_pui8USBRxBuffer[ui32ReadIndex] - 'Z') + 'z'; + } + else + { + // + // Copy the received character to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + g_pui8USBRxBuffer[ui32ReadIndex]; + } + } + + // + // Move to the next character taking care to adjust the pointer for + // the buffer wrap if necessary. + // + ui32WriteIndex++; + ui32WriteIndex = + (ui32WriteIndex == BULK_BUFFER_SIZE) ? 0 : ui32WriteIndex; + + ui32ReadIndex++; + ui32ReadIndex = (ui32ReadIndex == BULK_BUFFER_SIZE) ? 0 : ui32ReadIndex; + + ui32Loop--; + } + + // + // We've processed the data in place so now send the processed data + // back to the host. + // + USBBufferDataWritten(&g_sTxBuffer, ui32Count); + + DEBUG_PRINT("Wrote %d bytes\n", ui32Count); + + // + // We processed as much data as we can directly from the receive buffer so + // we need to return the number of bytes to allow the lower layer to + // update its read pointer appropriately. + // + return(ui32Count); +} + +//***************************************************************************** +// +// Shows the status string on the display. +// +// \param psContext is a pointer to the graphics context representing the +// display. +// \param pi8Status is a pointer to the string to be shown. +// +//***************************************************************************** +void +DisplayStatus(tContext *psContext, char *pcStatus) +{ + // + // Clear the line with black. + // + GrContextForegroundSet(&g_sContext, ClrBlack); + GrStringDrawCentered(psContext, " ", -1, + GrContextDpyWidthGet(psContext) / 2, 16, true); + + // + // Draw the new status string + // + DEBUG_PRINT("%s\n", pcStatus); + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(psContext, pcStatus, -1, + GrContextDpyWidthGet(psContext) / 2, 16, true); +} + +//***************************************************************************** +// +// Handles bulk driver notifications related to the transmit channel (data to +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // We are not required to do anything in response to any transmit event + // in this example. All we do is update our transmit counter. + // + if(ui32Event == USB_EVENT_TX_COMPLETE) + { + g_ui32TxCount += ui32MsgValue; + } + + // + // Dump a debug message. + // + DEBUG_PRINT("TX complete %d\n", ui32MsgValue); + + return(0); +} + +//***************************************************************************** +// +// Handles bulk driver notifications related to the receive channel (data from +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event are we being sent? + // + switch(ui32Event) + { + // + // We are connected to a host and communication is now possible. + // + case USB_EVENT_CONNECTED: + { + g_bUSBConfigured = true; + g_pcStatus = "Host connected."; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + + // + // Flush our buffers. + // + USBBufferFlush(&g_sTxBuffer); + USBBufferFlush(&g_sRxBuffer); + + break; + } + + // + // The host has disconnected. + // + case USB_EVENT_DISCONNECTED: + { + g_bUSBConfigured = false; + g_pcStatus = "Host disconn."; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + break; + } + + // + // A new packet has been received. + // + case USB_EVENT_RX_AVAILABLE: + { + tUSBDBulkDevice *psDevice; + + // + // Get a pointer to our instance data from the callback data + // parameter. + // + psDevice = (tUSBDBulkDevice *)pvCBData; + + // + // Read the new packet and echo it back to the host. + // + return(EchoNewDataToHost(psDevice, pvMsgData, ui32MsgValue)); + } + + // + // Ignore SUSPEND and RESUME for now. + // + case USB_EVENT_SUSPEND: + case USB_EVENT_RESUME: + break; + + // + // Ignore all other events and return 0. + // + default: + break; + } + + return(0); +} + +#ifdef DEBUG +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); + // + UARTStdioConfig(0, 115200, 16000000); +} +#endif + +//***************************************************************************** +// +// This is the main application entry function. +// +//***************************************************************************** +int +main(void) +{ + uint_fast32_t ui32TxCount; + uint_fast32_t ui32RxCount; + tRectangle sRect; + char pcBuffer[16]; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL at 50MHz + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + +#ifdef DEBUG + // + // Configure the UART for debug output. + // + ConfigureUART(); +#endif + + // + // Not configured initially. + // + g_bUSBConfigured = false; + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "usb-dev-bulk", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + + // + // Show the various static text elements on the color STN display. + // + GrStringDraw(&g_sContext, "Tx bytes:", -1, 0, 32, false); + GrStringDraw(&g_sContext, "Rx bytes:", -1, 0, 42, false); + + // + // Enable the GPIO peripheral used for USB, and configure the USB + // pins. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + + // + // Enable the system tick. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Show the application name on the display and UART output. + // + DEBUG_PRINT("\nTiva C Series USB bulk device example\n"); + DEBUG_PRINT("---------------------------------\n\n"); + + // + // Tell the user what we are up to. + // + DisplayStatus(&g_sContext, "Configuring USB"); + + // + // Initialize the transmit and receive buffers. + // + USBBufferInit(&g_sTxBuffer); + USBBufferInit(&g_sRxBuffer); + + // + // Pass our device information to the USB library and place the device + // on the bus. + // + USBDBulkInit(0, &g_sBulkDevice); + + // + // Wait for initial configuration to complete. + // + DisplayStatus(&g_sContext, "Waiting for host"); + + // + // Clear our local byte counters. + // + ui32RxCount = 0; + ui32TxCount = 0; + + // + // Main application loop. + // + while(1) + { + + // + // Have we been asked to update the status display? + // + if(g_ui32Flags & COMMAND_STATUS_UPDATE) + { + // + // Clear the command flag + // + g_ui32Flags &= ~COMMAND_STATUS_UPDATE; + DisplayStatus(&g_sContext, g_pcStatus); + } + + // + // Has there been any transmit traffic since we last checked? + // + if(ui32TxCount != g_ui32TxCount) + { + // + // Take a snapshot of the latest transmit count. + // + ui32TxCount = g_ui32TxCount; + + // + // Update the display of bytes transmitted by the UART. + // + usnprintf(pcBuffer, 16, " %d ", ui32TxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 48, 32, true); + } + + // + // Has there been any receive traffic since we last checked? + // + if(ui32RxCount != g_ui32RxCount) + { + // + // Take a snapshot of the latest receive count. + // + ui32RxCount = g_ui32RxCount; + + // + // Update the display of bytes received by the UART. + // + usnprintf(pcBuffer, 16, " %d ", ui32RxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 48, 42, true); + } + } +} diff --git a/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ewd b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ewp b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ewp new file mode 100644 index 0000000..c2ef28d --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ewp @@ -0,0 +1,805 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_bulk_structs.c + + + $PROJ_DIR$\usb_dev_bulk.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.icf b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.icf new file mode 100644 index 0000000..2c364fd --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_bulk.icf - Linker configuration file for usb_dev_bulk. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ld b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ld new file mode 100644 index 0000000..ca63fdb --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_bulk.ld - Linker configuration file for usb_dev_bulk. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.sct b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.sct new file mode 100644 index 0000000..78e35f5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_bulk.sct - Linker configuration file for usb_dev_bulk. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.uvopt b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.uvopt new file mode 100644 index 0000000..4ddda85 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.uvopt @@ -0,0 +1,373 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_bulk + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_bulk_structs.c + usb_bulk_structs.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_bulk.c + usb_dev_bulk.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 10 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.uvproj b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.uvproj new file mode 100644 index 0000000..dab087b --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk.uvproj @@ -0,0 +1,454 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + usb_dev_bulk + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_bulk + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_bulk.bin .\rvmdk\usb_dev_bulk.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_bulk.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_bulk_structs.c + 1 + .\usb_bulk_structs.c + + + usb_dev_bulk.c + 1 + .\usb_dev_bulk.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk_ccs.cmd b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk_ccs.cmd new file mode 100644 index 0000000..a8bbf13 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_bulk/usb_dev_bulk_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_bulk_ccs.cmd - CCS linker configuration file for usb_dev_bulk. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/Makefile b/boards/dk-tm4c123g/usb_dev_keyboard/Makefile new file mode 100644 index 0000000..257beb2 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device keyboard example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device keyboard example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_keyboard.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device keyboard example. +# +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/buttons.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/usb_dev_keyboard.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/usb_keyb_structs.o +${COMPILER}/usb_dev_keyboard.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_keyboard.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_keyboard.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_keyboard.axf: usb_dev_keyboard.ld +SCATTERgcc_usb_dev_keyboard=usb_dev_keyboard.ld +ENTRY_usb_dev_keyboard=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.ccsimportspec b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.ccsimportspec new file mode 100644 index 0000000..4a82f9a --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.ccsproject b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.cproject b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.cproject new file mode 100644 index 0000000..683cc76 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.cproject @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.project b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.project new file mode 100644 index 0000000..70f8f8b --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.project @@ -0,0 +1,70 @@ + + + usb_dev_keyboard + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_keyboard/startup_ccs.c + + + usb_dev_keyboard.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.c + + + usb_dev_keyboard_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd + + + usb_keyb_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_keyboard/usb_keyb_structs.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin new file mode 100644 index 0000000..8277ca3 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out new file mode 100644 index 0000000..b93f94a Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out differ diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/ccs/macros.ini_initial b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/ccs/target_config.ccxml b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin b/boards/dk-tm4c123g/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin new file mode 100644 index 0000000..11d274a Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out b/boards/dk-tm4c123g/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out new file mode 100644 index 0000000..aa52cdf Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out differ diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/gcc/usb_dev_keyboard.axf b/boards/dk-tm4c123g/usb_dev_keyboard/gcc/usb_dev_keyboard.axf new file mode 100644 index 0000000..892a54a Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_keyboard/gcc/usb_dev_keyboard.axf differ diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/gcc/usb_dev_keyboard.bin b/boards/dk-tm4c123g/usb_dev_keyboard/gcc/usb_dev_keyboard.bin new file mode 100644 index 0000000..92c6679 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_keyboard/gcc/usb_dev_keyboard.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/readme.txt b/boards/dk-tm4c123g/usb_dev_keyboard/readme.txt new file mode 100644 index 0000000..cc38460 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/readme.txt @@ -0,0 +1,36 @@ +USB HID Keyboard Device + +This example application turns the evaluation board into a USB keyboard +supporting the Human Interface Device class. When the push button is +pressed, a sequence of key presses is simulated to type a string. Care +should be taken to ensure that the active window can safely receive the +text; enter is not pressed at any point so no actions are attempted by the +host if a terminal window is used (for example). The status LED is used to +indicate the current Caps Lock state and is updated in response to any +other keyboard attached to the same USB host system. + +The device implemented by this application also supports USB remote wakeup +allowing it to request the host to reactivate a suspended bus. If the bus +is suspended (as indicated on the application display), pressing the +push button will request a remote wakeup assuming the host has not +specifically disabled such requests. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf b/boards/dk-tm4c123g/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf new file mode 100644 index 0000000..a7266d4 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf differ diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin b/boards/dk-tm4c123g/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin new file mode 100644 index 0000000..34b3140 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/startup_ccs.c b/boards/dk-tm4c123g/usb_dev_keyboard/startup_ccs.c new file mode 100644 index 0000000..ffa387c --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/startup_ewarm.c b/boards/dk-tm4c123g/usb_dev_keyboard/startup_ewarm.c new file mode 100644 index 0000000..886c1d0 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/startup_gcc.c b/boards/dk-tm4c123g/usb_dev_keyboard/startup_gcc.c new file mode 100644 index 0000000..ff9e178 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/startup_rvmdk.S b/boards/dk-tm4c123g/usb_dev_keyboard/startup_rvmdk.S new file mode 100644 index 0000000..67e9441 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN UARTStdioIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTStdioIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.c b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.c new file mode 100644 index 0000000..c62cc5b --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.c @@ -0,0 +1,730 @@ +//***************************************************************************** +// +// usb_dev_keyboard.c - Main routines for the keyboard example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_gpio.h" +#include "inc/hw_sysctl.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidkeyb.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" +#include "usb_keyb_structs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

USB HID Keyboard Device (usb_dev_keyboard)

+//! +//! This example application turns the evaluation board into a USB keyboard +//! supporting the Human Interface Device class. When the push button is +//! pressed, a sequence of key presses is simulated to type a string. Care +//! should be taken to ensure that the active window can safely receive the +//! text; enter is not pressed at any point so no actions are attempted by the +//! host if a terminal window is used (for example). The status LED is used to +//! indicate the current Caps Lock state and is updated in response to any +//! other keyboard attached to the same USB host system. +//! +//! The device implemented by this application also supports USB remote wakeup +//! allowing it to request the host to reactivate a suspended bus. If the bus +//! is suspended (as indicated on the application display), pressing the +//! push button will request a remote wakeup assuming the host has not +//! specifically disabled such requests. +// +//***************************************************************************** + +//***************************************************************************** +// +// The system tick timer period. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 + +//***************************************************************************** +// +// A mapping from the ASCII value received from the UART to the corresponding +// USB HID usage code. +// +//***************************************************************************** +static const int8_t g_ppi8KeyUsageCodes[][2] = +{ + { 0, HID_KEYB_USAGE_SPACE }, // 0x20 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_1 }, // ! 0x21 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_FQUOTE }, // " 0x22 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_3 }, // # 0x23 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_4 }, // $ 0x24 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_5 }, // % 0x25 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_7 }, // & 0x26 + { 0, HID_KEYB_USAGE_FQUOTE }, // ' 0x27 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_9 }, // ( 0x28 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_0 }, // ) 0x29 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_8 }, // * 0x2a + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_EQUAL }, // + 0x2b + { 0, HID_KEYB_USAGE_COMMA }, // , 0x2c + { 0, HID_KEYB_USAGE_MINUS }, // - 0x2d + { 0, HID_KEYB_USAGE_PERIOD }, // . 0x2e + { 0, HID_KEYB_USAGE_FSLASH }, // / 0x2f + { 0, HID_KEYB_USAGE_0 }, // 0 0x30 + { 0, HID_KEYB_USAGE_1 }, // 1 0x31 + { 0, HID_KEYB_USAGE_2 }, // 2 0x32 + { 0, HID_KEYB_USAGE_3 }, // 3 0x33 + { 0, HID_KEYB_USAGE_4 }, // 4 0x34 + { 0, HID_KEYB_USAGE_5 }, // 5 0x35 + { 0, HID_KEYB_USAGE_6 }, // 6 0x36 + { 0, HID_KEYB_USAGE_7 }, // 7 0x37 + { 0, HID_KEYB_USAGE_8 }, // 8 0x38 + { 0, HID_KEYB_USAGE_9 }, // 9 0x39 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_SEMICOLON }, // : 0x3a + { 0, HID_KEYB_USAGE_SEMICOLON }, // ; 0x3b + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_COMMA }, // < 0x3c + { 0, HID_KEYB_USAGE_EQUAL }, // = 0x3d + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_PERIOD }, // > 0x3e + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_FSLASH }, // ? 0x3f + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_2 }, // @ 0x40 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_A }, // A 0x41 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_B }, // B 0x42 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_C }, // C 0x43 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_D }, // D 0x44 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_E }, // E 0x45 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_F }, // F 0x46 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_G }, // G 0x47 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_H }, // H 0x48 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_I }, // I 0x49 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_J }, // J 0x4a + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_K }, // K 0x4b + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_L }, // L 0x4c + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_M }, // M 0x4d + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_N }, // N 0x4e + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_O }, // O 0x4f + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_P }, // P 0x50 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_Q }, // Q 0x51 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_R }, // R 0x52 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_S }, // S 0x53 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_T }, // T 0x54 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_U }, // U 0x55 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_V }, // V 0x56 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_W }, // W 0x57 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_X }, // X 0x58 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_Y }, // Y 0x59 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_Z }, // Z 0x5a + { 0, HID_KEYB_USAGE_LBRACKET }, // [ 0x5b + { 0, HID_KEYB_USAGE_BSLASH }, // \ 0x5c + { 0, HID_KEYB_USAGE_RBRACKET }, // ] 0x5d + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_6 }, // ^ 0x5e + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_MINUS }, // _ 0x5f + { 0, HID_KEYB_USAGE_BQUOTE }, // ` 0x60 + { 0, HID_KEYB_USAGE_A }, // a 0x61 + { 0, HID_KEYB_USAGE_B }, // b 0x62 + { 0, HID_KEYB_USAGE_C }, // c 0x63 + { 0, HID_KEYB_USAGE_D }, // d 0x64 + { 0, HID_KEYB_USAGE_E }, // e 0x65 + { 0, HID_KEYB_USAGE_F }, // f 0x66 + { 0, HID_KEYB_USAGE_G }, // g 0x67 + { 0, HID_KEYB_USAGE_H }, // h 0x68 + { 0, HID_KEYB_USAGE_I }, // i 0x69 + { 0, HID_KEYB_USAGE_J }, // j 0x6a + { 0, HID_KEYB_USAGE_K }, // k 0x6b + { 0, HID_KEYB_USAGE_L }, // l 0x6c + { 0, HID_KEYB_USAGE_M }, // m 0x6d + { 0, HID_KEYB_USAGE_N }, // n 0x6e + { 0, HID_KEYB_USAGE_O }, // o 0x6f + { 0, HID_KEYB_USAGE_P }, // p 0x70 + { 0, HID_KEYB_USAGE_Q }, // q 0x71 + { 0, HID_KEYB_USAGE_R }, // r 0x72 + { 0, HID_KEYB_USAGE_S }, // s 0x73 + { 0, HID_KEYB_USAGE_T }, // t 0x74 + { 0, HID_KEYB_USAGE_U }, // u 0x75 + { 0, HID_KEYB_USAGE_V }, // v 0x76 + { 0, HID_KEYB_USAGE_W }, // w 0x77 + { 0, HID_KEYB_USAGE_X }, // x 0x78 + { 0, HID_KEYB_USAGE_Y }, // y 0x79 + { 0, HID_KEYB_USAGE_Z }, // z 0x7a + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_LBRACKET }, // { 0x7b + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_BSLASH }, // | 0x7c + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_RBRACKET }, // } 0x7d + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_BQUOTE }, // ~ 0x7e +}; + +//***************************************************************************** +// +// This global indicates whether or not we are connected to a USB host. +// +//***************************************************************************** +volatile bool g_bConnected = false; + +//***************************************************************************** +// +// This global indicates whether or not the USB bus is currently in the suspend +// state. +// +//***************************************************************************** +volatile bool g_bSuspended = false; + +//***************************************************************************** +// +// Global system tick counter holds elapsed time since the application started +// expressed in 100ths of a second. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount; + +//***************************************************************************** +// +// The number of system ticks to wait for each USB packet to be sent before +// we assume the host has disconnected. The value 50 equates to half a second. +// +//***************************************************************************** +#define MAX_SEND_DELAY 50 + +//***************************************************************************** +// +// This global is set to true if the host sends a request to set or clear +// any keyboard LED. +// +//***************************************************************************** +volatile bool g_bDisplayUpdateRequired; + +//***************************************************************************** +// +// This enumeration holds the various states that the keyboard can be in during +// normal operation. +// +//***************************************************************************** +volatile enum +{ + // + // Unconfigured. + // + STATE_UNCONFIGURED, + + // + // No keys to send and not waiting on data. + // + STATE_IDLE, + + // + // Waiting on data to be sent out. + // + STATE_SENDING +} +g_eKeyboardState = STATE_UNCONFIGURED; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Handles asynchronous events from the HID keyboard driver. +// +// \param pvCBData is the event callback pointer provided during +// USBDHIDKeyboardInit(). This is a pointer to our keyboard device structure +// (&g_sKeyboardDevice). +// \param ui32Event identifies the event we are being called back for. +// \param ui32MsgData is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the HID keyboard driver to inform the application +// of particular asynchronous events related to operation of the keyboard HID +// device. +// +// \return Returns 0 in all cases. +// +//***************************************************************************** +uint32_t +KeyboardHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgData, + void *pvMsgData) +{ + switch (ui32Event) + { + // + // The host has connected to us and configured the device. + // + case USB_EVENT_CONNECTED: + { + g_bConnected = true; + g_bSuspended = false; + break; + } + + // + // The host has disconnected from us. + // + case USB_EVENT_DISCONNECTED: + { + g_bConnected = false; + break; + } + + // + // We receive this event every time the host acknowledges transmission + // of a report. It is used here purely as a way of determining whether + // the host is still talking to us or not. + // + case USB_EVENT_TX_COMPLETE: + { + // + // Enter the idle state since we finished sending something. + // + g_eKeyboardState = STATE_IDLE; + break; + } + + // + // This event indicates that the host has suspended the USB bus. + // + case USB_EVENT_SUSPEND: + { + g_bSuspended = true; + break; + } + + // + // This event signals that the host has resumed signalling on the bus. + // + case USB_EVENT_RESUME: + { + g_bSuspended = false; + break; + } + + // + // This event indicates that the host has sent us an Output or + // Feature report and that the report is now in the buffer we provided + // on the previous USBD_HID_EVENT_GET_REPORT_BUFFER callback. + // + case USBD_HID_KEYB_EVENT_SET_LEDS: + { + // + // Set the LED to match the current state of the caps lock LED. + // + ROM_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, + (ui32MsgData & HID_KEYB_CAPS_LOCK) ? GPIO_PIN_2 : + 0); + + break; + } + + // + // We ignore all other events. + // + default: + { + break; + } + } + + return(0); +} + +//*************************************************************************** +// +// Wait for a period of time for the state to become idle. +// +// \param ui32TimeoutTick is the number of system ticks to wait before +// declaring a timeout and returning \b false. +// +// This function polls the current keyboard state for ui32TimeoutTicks system +// ticks waiting for it to become idle. If the state becomes idle, the +// function returns true. If it ui32TimeoutTicks occur prior to the state +// becoming idle, false is returned to indicate a timeout. +// +// \return Returns \b true on success or \b false on timeout. +// +//*************************************************************************** +bool +WaitForSendIdle(uint_fast32_t ui32TimeoutTicks) +{ + uint32_t ui32Start; + uint32_t ui32Now; + uint32_t ui32Elapsed; + + ui32Start = g_ui32SysTickCount; + ui32Elapsed = 0; + + while(ui32Elapsed < ui32TimeoutTicks) + { + // + // Is the keyboard is idle, return immediately. + // + if(g_eKeyboardState == STATE_IDLE) + { + return(true); + } + + // + // Determine how much time has elapsed since we started waiting. This + // should be safe across a wrap of g_ui32SysTickCount. + // + ui32Now = g_ui32SysTickCount; + ui32Elapsed = ((ui32Start < ui32Now) ? (ui32Now - ui32Start) : + (((uint32_t)0xFFFFFFFF - ui32Start) + ui32Now + 1)); + } + + // + // If we get here, we timed out so return a bad return code to let the + // caller know. + // + return(false); +} + +//***************************************************************************** +// +// Sends a string of characters via the USB HID keyboard interface. +// +//***************************************************************************** +void +SendString(char *pcStr) +{ + uint32_t ui32Char; + + // + // Loop while there are more characters in the string. + // + while(*pcStr) + { + // + // Get the next character from the string. + // + ui32Char = *pcStr++; + + // + // Skip this character if it is a non-printable character. + // + if((ui32Char < ' ') || (ui32Char > '~')) + { + continue; + } + + // + // Convert the character into an index into the keyboard usage code + // table. + // + ui32Char -= ' '; + + // + // Send the key press message. + // + g_eKeyboardState = STATE_SENDING; + if(USBDHIDKeyboardKeyStateChange((void *)&g_sKeyboardDevice, + g_ppi8KeyUsageCodes[ui32Char][0], + g_ppi8KeyUsageCodes[ui32Char][1], + true) != KEYB_SUCCESS) + { + return; + } + + // + // Wait until the key press message has been sent. + // + if(!WaitForSendIdle(MAX_SEND_DELAY)) + { + g_bConnected = 0; + return; + } + + // + // Send the key release message. + // + g_eKeyboardState = STATE_SENDING; + if(USBDHIDKeyboardKeyStateChange((void *)&g_sKeyboardDevice, + 0, g_ppi8KeyUsageCodes[ui32Char][1], + false) != KEYB_SUCCESS) + { + return; + } + + // + // Wait until the key release message has been sent. + // + if(!WaitForSendIdle(MAX_SEND_DELAY)) + { + g_bConnected = 0; + return; + } + } +} + +//***************************************************************************** +// +// This is the interrupt handler for the SysTick interrupt. It is used to +// update our local tick count which, in turn, is used to check for transmit +// timeouts. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + uint_fast32_t ui32LastTickCount; + bool bLastSuspend; + tRectangle sRect; + tContext sContext; + int_fast32_t i32CenterX; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL at 50MHz. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Erratum workaround for silicon revision A1. VBUS must have pull-down. + // + if(CLASS_IS_TM4C123 && REVISION_IS_A1) + { + HWREG(GPIO_PORTB_BASE + GPIO_O_PDR) |= GPIO_PIN_1; + } + + // + // Enable the GPIO that is used for the on-board LED. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE, GPIO_PIN_2); + ROM_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, 0); + + // + // Initialize the buttons driver + // + ButtonsInit(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + i32CenterX = GrContextDpyWidthGet(&sContext) / 2; + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "usb-dev-keyboard", -1, i32CenterX, 4, 0); + + // + // Not configured initially. + // + g_bConnected = false; + g_bSuspended = false; + bLastSuspend = false; + + // + // Initialize the USB stack for device mode. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Pass our device information to the USB HID device class driver, + // initialize the USB + // controller and connect the device to the bus. + // + USBDHIDKeyboardInit(0, &g_sKeyboardDevice); + + // + // Set the system tick to fire 100 times per second. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // The main loop starts here. We begin by waiting for a host connection + // then drop into the main keyboard handling section. If the host + // disconnects, we return to the top and wait for a new connection. + // + while(1) + { + uint8_t ui8Buttons; + uint8_t ui8ButtonsChanged; + + // + // Tell the user what we are doing and provide some basic instructions. + // + GrStringDrawCentered(&sContext, " Waiting ", + -1, i32CenterX, 22, 1); + GrStringDrawCentered(&sContext, " for host ... ", -1, + i32CenterX, 32, 1); + + // + // Wait here until USB device is connected to a host. + // + while(!g_bConnected) + { + } + + // + // Update the status. + // + GrStringDrawCentered(&sContext, " Host ", + -1, i32CenterX, 22, 1); + GrStringDrawCentered(&sContext, " connected ... ", + -1, i32CenterX, 32, 1); + + // + // Enter the idle state. + // + g_eKeyboardState = STATE_IDLE; + + // + // Assume that the bus is not currently suspended if we have just been + // configured. + // + bLastSuspend = false; + + // + // Keep transferring characters from the UART to the USB host for as + // long as we are connected to the host. + // + while(g_bConnected) + { + // + // Remember the current time. + // + ui32LastTickCount = g_ui32SysTickCount; + + // + // Has the suspend state changed since last time we checked? + // + if(bLastSuspend != g_bSuspended) + { + // + // Yes - the state changed so update the display. + // + bLastSuspend = g_bSuspended; + if(bLastSuspend) + { + GrStringDrawCentered(&sContext, " Bus ", -1, + i32CenterX, 22, 1); + GrStringDrawCentered(&sContext, " suspended ... ", -1, + i32CenterX, 32, 1); + } + else + { + GrStringDrawCentered(&sContext, " Host ", -1, + i32CenterX, 22, 1); + GrStringDrawCentered(&sContext, " connected ... ", + -1, i32CenterX, 32, 1); + } + } + + // + // See if the button was just pressed. + // + ui8Buttons = ButtonsPoll(&ui8ButtonsChanged, 0); + if(BUTTON_PRESSED(SELECT_BUTTON, ui8Buttons, ui8ButtonsChanged)) + { + // + // If the bus is suspended then resume it. Otherwise, type + // some "random" characters. + // + if(g_bSuspended) + { + USBDHIDKeyboardRemoteWakeupRequest( + (void *)&g_sKeyboardDevice); + } + else + { + SendString("Make the Switch to TI Microcontrollers!"); + } + } + + // + // Wait for at least 1 system tick to have gone by before we poll + // the buttons again. + // + while(g_ui32SysTickCount == ui32LastTickCount) + { + } + } + } +} diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ewd b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ewp b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ewp new file mode 100644 index 0000000..9d351f6 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ewp @@ -0,0 +1,805 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_dev_keyboard.c + + + $PROJ_DIR$\usb_keyb_structs.c + + + diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.icf b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.icf new file mode 100644 index 0000000..24f29eb --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_keyboard.icf - Linker configuration file for usb_dev_keyboard. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ld b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ld new file mode 100644 index 0000000..ab42218 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_keyboard.ld - Linker configuration file for usb_dev_keyboard. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.sct b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.sct new file mode 100644 index 0000000..50e476b --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_keyboard.sct - Linker configuration file for usb_dev_keyboard. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.uvopt b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.uvopt new file mode 100644 index 0000000..76a34a0 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.uvopt @@ -0,0 +1,373 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_keyboard + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_keyboard.c + usb_dev_keyboard.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_keyb_structs.c + usb_keyb_structs.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 10 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.uvproj b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.uvproj new file mode 100644 index 0000000..f9e2f0d --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard.uvproj @@ -0,0 +1,454 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + usb_dev_keyboard + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_keyboard + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_keyboard.bin .\rvmdk\usb_dev_keyboard.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_keyboard.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_dev_keyboard.c + 1 + .\usb_dev_keyboard.c + + + usb_keyb_structs.c + 1 + .\usb_keyb_structs.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd new file mode 100644 index 0000000..419e77a --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_keyboard_ccs.cmd - CCS linker configuration file for usb_dev_keyboard. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/usb_keyb_structs.c b/boards/dk-tm4c123g/usb_dev_keyboard/usb_keyb_structs.c new file mode 100644 index 0000000..849a526 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/usb_keyb_structs.c @@ -0,0 +1,149 @@ +//***************************************************************************** +// +// usb_keyb_structs.c - Data structures defining the USB keyboard device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidkeyb.h" +#include "usb_keyb_structs.h" + +//**************************************************************************** +// +// The languages supported by this device. +// +//**************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//**************************************************************************** +// +// The manufacturer string. +// +//**************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//**************************************************************************** +// +// The product string. +// +//**************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (16 + 1) * 2, + USB_DTYPE_STRING, + 'K', 0, 'e', 0, 'y', 0, 'b', 0, 'o', 0, 'a', 0, 'r', 0, 'd', 0, ' ', 0, + 'E', 0, 'x', 0, 'a', 0, 'm', 0, 'p', 0, 'l', 0, 'e', 0 +}; + +//**************************************************************************** +// +// The serial number string. +// +//**************************************************************************** +const uint8_t g_pui8SeriailNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The interface description string. +// +//***************************************************************************** +const uint8_t g_pui8HIDInterfaceString[] = +{ + (22 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'K', 0, 'e', 0, 'y', 0, 'b', 0, + 'o', 0, 'a', 0, 'r', 0, 'd', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, + 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (26 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'K', 0, 'e', 0, 'y', 0, 'b', 0, + 'o', 0, 'a', 0, 'r', 0, 'd', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, + 'f', 0, 'i', 0, 'g', 0, 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, + 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SeriailNumberString, + g_pui8HIDInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The HID keyboard device initialization and customization structures. +// +//***************************************************************************** +tUSBDHIDKeyboardDevice g_sKeyboardDevice = +{ + USB_VID_TI_1CBE, + USB_PID_KEYBOARD, + 500, + USB_CONF_ATTR_SELF_PWR | USB_CONF_ATTR_RWAKE, + KeyboardHandler, + (void *)&g_sKeyboardDevice, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; diff --git a/boards/dk-tm4c123g/usb_dev_keyboard/usb_keyb_structs.h b/boards/dk-tm4c123g/usb_dev_keyboard/usb_keyb_structs.h new file mode 100644 index 0000000..ca6b3f0 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_keyboard/usb_keyb_structs.h @@ -0,0 +1,35 @@ +//***************************************************************************** +// +// usb_keyb_structs.h - Data structures defining the keyboard USB device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_KEYB_STRUCTS_H_ +#define _USB_KEYB_STRUCTS_H_ + +extern uint32_t KeyboardHandler(void *pvCBData, + uint32_t ui32Event, + uint32_t ui32MsgData, + void *pvMsgData); + +extern tUSBDHIDKeyboardDevice g_sKeyboardDevice; + +#endif diff --git a/boards/dk-tm4c123g/usb_dev_msc/Makefile b/boards/dk-tm4c123g/usb_dev_msc/Makefile new file mode 100644 index 0000000..f62750e --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/Makefile @@ -0,0 +1,96 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Mass Storage Class example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the Mass Storage Class example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_msc.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Mass Storage Class example. +# +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/mmc-dk-tm4c123g.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/usb_dev_msc.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/usb_msc_structs.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/usbdsdcard.o +${COMPILER}/usb_dev_msc.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_msc.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_msc.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_msc.axf: usb_dev_msc.ld +SCATTERgcc_usb_dev_msc=usb_dev_msc.ld +ENTRY_usb_dev_msc=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/usb_dev_msc/ccs/.ccsimportspec b/boards/dk-tm4c123g/usb_dev_msc/ccs/.ccsimportspec new file mode 100644 index 0000000..e530bf9 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/ccs/.ccsimportspec @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_msc/ccs/.ccsproject b/boards/dk-tm4c123g/usb_dev_msc/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_msc/ccs/.cproject b/boards/dk-tm4c123g/usb_dev_msc/ccs/.cproject new file mode 100644 index 0000000..c86f24e --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/ccs/.cproject @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_msc/ccs/.project b/boards/dk-tm4c123g/usb_dev_msc/ccs/.project new file mode 100644 index 0000000..b6bef61 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/ccs/.project @@ -0,0 +1,75 @@ + + + usb_dev_msc + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_msc/startup_ccs.c + + + usb_dev_msc.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.c + + + usb_dev_msc_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc_ccs.cmd + + + usb_msc_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_msc/usb_msc_structs.c + + + usbdsdcard.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_msc/usbdsdcard.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + third_party/fatfs/port/mmc-dk-tm4c123g.c + 1 + SW_ROOT/third_party/fatfs/port/mmc-dk-tm4c123g.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/usb_dev_msc/ccs/Debug/usb_dev_msc.bin b/boards/dk-tm4c123g/usb_dev_msc/ccs/Debug/usb_dev_msc.bin new file mode 100644 index 0000000..348f6ff Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_msc/ccs/Debug/usb_dev_msc.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_msc/ccs/Debug/usb_dev_msc.out b/boards/dk-tm4c123g/usb_dev_msc/ccs/Debug/usb_dev_msc.out new file mode 100644 index 0000000..e6e78d2 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_msc/ccs/Debug/usb_dev_msc.out differ diff --git a/boards/dk-tm4c123g/usb_dev_msc/ccs/macros.ini_initial b/boards/dk-tm4c123g/usb_dev_msc/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/usb_dev_msc/ccs/target_config.ccxml b/boards/dk-tm4c123g/usb_dev_msc/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin b/boards/dk-tm4c123g/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin new file mode 100644 index 0000000..70add2c Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_msc/ewarm/Exe/usb_dev_msc.out b/boards/dk-tm4c123g/usb_dev_msc/ewarm/Exe/usb_dev_msc.out new file mode 100644 index 0000000..5d847ae Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_msc/ewarm/Exe/usb_dev_msc.out differ diff --git a/boards/dk-tm4c123g/usb_dev_msc/gcc/usb_dev_msc.axf b/boards/dk-tm4c123g/usb_dev_msc/gcc/usb_dev_msc.axf new file mode 100644 index 0000000..3667806 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_msc/gcc/usb_dev_msc.axf differ diff --git a/boards/dk-tm4c123g/usb_dev_msc/gcc/usb_dev_msc.bin b/boards/dk-tm4c123g/usb_dev_msc/gcc/usb_dev_msc.bin new file mode 100644 index 0000000..ff5e834 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_msc/gcc/usb_dev_msc.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_msc/readme.txt b/boards/dk-tm4c123g/usb_dev_msc/readme.txt new file mode 100644 index 0000000..adc0f94 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/readme.txt @@ -0,0 +1,27 @@ +USB MSC Device + +This example application turns the evaluation board into a USB mass storage +class device. The application will use the microSD card for the storage +media for the mass storage device. The screen will display the current +action occurring on the device ranging from disconnected, no media, reading, +writing and idle. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/usb_dev_msc/rvmdk/usb_dev_msc.axf b/boards/dk-tm4c123g/usb_dev_msc/rvmdk/usb_dev_msc.axf new file mode 100644 index 0000000..bb732bf Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_msc/rvmdk/usb_dev_msc.axf differ diff --git a/boards/dk-tm4c123g/usb_dev_msc/rvmdk/usb_dev_msc.bin b/boards/dk-tm4c123g/usb_dev_msc/rvmdk/usb_dev_msc.bin new file mode 100644 index 0000000..b5ea132 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_msc/rvmdk/usb_dev_msc.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_msc/startup_ccs.c b/boards/dk-tm4c123g/usb_dev_msc/startup_ccs.c new file mode 100644 index 0000000..429f50e --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_msc/startup_ewarm.c b/boards/dk-tm4c123g/usb_dev_msc/startup_ewarm.c new file mode 100644 index 0000000..5c28dc7 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_msc/startup_gcc.c b/boards/dk-tm4c123g/usb_dev_msc/startup_gcc.c new file mode 100644 index 0000000..af008ad --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_msc/startup_rvmdk.S b/boards/dk-tm4c123g/usb_dev_msc/startup_rvmdk.S new file mode 100644 index 0000000..abc3339 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.c b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.c new file mode 100644 index 0000000..e9e4f3f --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.c @@ -0,0 +1,617 @@ +//***************************************************************************** +// +// usb_dev_msc.c - Main routines for the device mass storage class example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/systick.h" +#include "driverlib/usb.h" +#include "driverlib/gpio.h" +#include "driverlib/udma.h" +#include "driverlib/pin_map.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdmsc.h" +#include "drivers/cfal96x64x16.h" +#include "usb_msc_structs.h" +#include "third_party/fatfs/src/diskio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

USB MSC Device (usb_dev_msc)

+//! +//! This example application turns the evaluation board into a USB mass storage +//! class device. The application will use the microSD card for the storage +//! media for the mass storage device. The screen will display the current +//! action occurring on the device ranging from disconnected, no media, reading, +//! writing and idle. +// +//***************************************************************************** + +//***************************************************************************** +// +// These defines are used to define the screen constraints to the application. +// +//***************************************************************************** +#define DISPLAY_BANNER_HEIGHT 11 +#define DISPLAY_BANNER_BG ClrDarkBlue +#define DISPLAY_BANNER_FG ClrWhite + +//***************************************************************************** +// +// The number of ticks to wait before falling back to the idle state. Since +// the tick rate is 100Hz this is approximately 3 seconds. +// +//***************************************************************************** +#define USBMSC_ACTIVITY_TIMEOUT 300 + +//***************************************************************************** +// +// This enumeration holds the various states that the device can be in during +// normal operation. +// +//***************************************************************************** +volatile enum +{ + // + // Unconfigured. + // + MSC_DEV_DISCONNECTED, + + // + // Connected but not yet fully enumerated. + // + MSC_DEV_CONNECTED, + + // + // Connected and fully enumerated but not currently handling a command. + // + MSC_DEV_IDLE, + + // + // Currently reading the SD card. + // + MSC_DEV_READ, + + // + // Currently writing the SD card. + // + MSC_DEV_WRITE, +} +g_eMSCState; + +//***************************************************************************** +// +// The Flags that handle updates to the status area to avoid drawing when no +// updates are required.. +// +//***************************************************************************** +#define FLAG_UPDATE_STATUS 1 +static uint32_t g_ui32Flags; +static uint32_t g_ui32IdleTimeout; + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//****************************************************************************** +// +// The DMA control structure table. +// +//****************************************************************************** +#ifdef ewarm +#pragma data_alignment=1024 +tDMAControlTable sDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(sDMAControlTable, 1024) +tDMAControlTable sDMAControlTable[64]; +#else +tDMAControlTable sDMAControlTable[64] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// Handles bulk driver notifications related to the receive channel (data from +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint_fast32_t ui32Event, + uint_fast32_t ui32MsgValue, void *pvMsgData) +{ + return(0); +} + +//***************************************************************************** +// +// Handles bulk driver notifications related to the transmit channel (data to +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint_fast32_t ui32Event, uint_fast32_t ui32MsgValue, + void *pvMsgData) +{ + return(0); +} + +//***************************************************************************** +// +// This function updates the status area of the screen. It uses the current +// state of the application to print the status bar. +// +//***************************************************************************** +void +UpdateStatus(char *pcString, bool bClrBackground) +{ + tRectangle sRect; + + // + // + // + GrContextBackgroundSet(&g_sContext, DISPLAY_BANNER_BG); + + if(bClrBackground) + { + // + // Fill the bottom rows of the screen with blue to create the status area. + // + sRect.i16XMin = 0; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = sRect.i16YMin + DISPLAY_BANNER_HEIGHT - 1; + + // + // Draw the background of the banner. + // + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_FG); + GrRectDraw(&g_sContext, &sRect); + } + else + { + // + // Fill the bottom rows of the screen with blue to create the status area. + // + sRect.i16XMin = 1; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT + 1; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 2; + sRect.i16YMax = sRect.i16YMin + DISPLAY_BANNER_HEIGHT - 3; + + // + // Draw the background of the banner. + // + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // White text in the banner. + // + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_FG); + } + + // + // Write the current state to the left of the status area. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Update the status on the screen. + // + if(pcString != 0) + { + GrStringDrawCentered(&g_sContext, pcString, + -1, GrContextDpyWidthGet(&g_sContext) / 2, + 58, 1); + } +} + +//***************************************************************************** +// +// This function is the call back notification function provided to the USB +// library's mass storage class. +// +//***************************************************************************** +uint32_t +USBDMSCEventCallback(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgParam, + void *pvMsgData) +{ + // + // Reset the time out every time an event occurs. + // + g_ui32IdleTimeout = USBMSC_ACTIVITY_TIMEOUT; + + switch(ui32Event) + { + // + // Writing to the device. + // + case USBD_MSC_EVENT_WRITING: + { + // + // Only update if this is a change. + // + if(g_eMSCState != MSC_DEV_WRITE) + { + // + // Go to the write state. + // + g_eMSCState = MSC_DEV_WRITE; + + // + // Cause the main loop to update the screen. + // + g_ui32Flags |= FLAG_UPDATE_STATUS; + } + + break; + } + + // + // Reading from the device. + // + case USBD_MSC_EVENT_READING: + { + // + // Only update if this is a change. + // + if(g_eMSCState != MSC_DEV_READ) + { + // + // Go to the read state. + // + g_eMSCState = MSC_DEV_READ; + + // + // Cause the main loop to update the screen. + // + g_ui32Flags |= FLAG_UPDATE_STATUS; + } + + break; + } + // + // The USB host has disconnected from the device. + // + case USB_EVENT_DISCONNECTED: + { + // + // Go to the disconnected state. + // + g_eMSCState = MSC_DEV_DISCONNECTED; + + // + // Cause the main loop to update the screen. + // + g_ui32Flags |= FLAG_UPDATE_STATUS; + + break; + } + // + // The USB host has connected to the device. + // + case USB_EVENT_CONNECTED: + { + // + // Go to the idle state to wait for read/writes. + // + g_eMSCState = MSC_DEV_IDLE; + + break; + } + case USBD_MSC_EVENT_IDLE: + default: + { + break; + } + } + + return(0); +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. FatFs requires a timer tick +// every 10 ms for internal timing purposes. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Call the FatFs tick timer. + // + disk_timerproc(); + + if(g_ui32IdleTimeout != 0) + { + g_ui32IdleTimeout--; + } +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + uint_fast32_t ui32Retcode; + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure SysTick for a 100Hz interrupt. The FatFs driver wants a 10 ms + // tick. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / 100); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Configure and enable uDMA + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + SysCtlDelay(10); + ROM_uDMAControlBaseSet(&sDMAControlTable[0]); + ROM_uDMAEnable(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top 15 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = DISPLAY_BANNER_HEIGHT - 1; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "usb-dev-msc", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 5, 0); + + // + // Initialize the idle timeout and reset all flags. + // + g_ui32IdleTimeout = 0; + g_ui32Flags = 0; + + // + // Initialize the state to idle. + // + g_eMSCState = MSC_DEV_DISCONNECTED; + + // + // Draw the status bar and set it to idle. + // + UpdateStatus("Disconnected", 1); + + // + // Enable the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Set the USB pins to be controlled by the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Set the USB stack mode to Device mode with VBUS monitoring. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Pass our device information to the USB library and place the device + // on the bus. + // + USBDMSCInit(0, &g_sMSCDevice); + + // + // Determine whether or not an SDCard is installed. If not, print a + // warning and have the user install one and restart. + // + ui32Retcode = disk_initialize(0); + + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + if(ui32Retcode != RES_OK) + { + GrStringDrawCentered(&g_sContext, "No SDCard Found", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 16, 0); + GrStringDrawCentered(&g_sContext, "Please insert", + -1, GrContextDpyWidthGet(&g_sContext) / 2, 26, 0); + GrStringDrawCentered(&g_sContext, "a card and", + -1, GrContextDpyWidthGet(&g_sContext) / 2, 36, 0); + GrStringDrawCentered(&g_sContext, "reset the board.", + -1, GrContextDpyWidthGet(&g_sContext) / 2, 46, 0); + } + else + { + GrStringDrawCentered(&g_sContext, "SDCard Found", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 30, 0); + } + + // + // Drop into the main loop. + // + while(1) + { + switch(g_eMSCState) + { + case MSC_DEV_READ: + { + // + // Update the screen if necessary. + // + if(g_ui32Flags & FLAG_UPDATE_STATUS) + { + UpdateStatus("Reading", 0); + g_ui32Flags &= ~FLAG_UPDATE_STATUS; + } + + // + // If there is no activity then return to the idle state. + // + if(g_ui32IdleTimeout == 0) + { + UpdateStatus("Idle", 0); + g_eMSCState = MSC_DEV_IDLE; + } + + break; + } + case MSC_DEV_WRITE: + { + // + // Update the screen if necessary. + // + if(g_ui32Flags & FLAG_UPDATE_STATUS) + { + UpdateStatus("Writing", 0); + g_ui32Flags &= ~FLAG_UPDATE_STATUS; + } + + // + // If there is no activity then return to the idle state. + // + if(g_ui32IdleTimeout == 0) + { + UpdateStatus("Idle", 0); + g_eMSCState = MSC_DEV_IDLE; + } + break; + } + case MSC_DEV_DISCONNECTED: + { + // + // Update the screen if necessary. + // + if(g_ui32Flags & FLAG_UPDATE_STATUS) + { + UpdateStatus("Disconnected", 0); + g_ui32Flags &= ~FLAG_UPDATE_STATUS; + } + break; + } + case MSC_DEV_IDLE: + { + break; + } + default: + { + break; + } + } + } +} + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + while(1) + { + // + // Hang on runtime error. + // + } +} +#endif + diff --git a/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ewd b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ewp b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ewp new file mode 100644 index 0000000..cd36414 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ewp @@ -0,0 +1,809 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c123g.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_dev_msc.c + + + $PROJ_DIR$\usb_msc_structs.c + + + $PROJ_DIR$\usbdsdcard.c + + + diff --git a/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.icf b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.icf new file mode 100644 index 0000000..7e77232 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_msc.icf - Linker configuration file for usb_dev_msc. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ld b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ld new file mode 100644 index 0000000..3332e0f --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_msc.ld - Linker configuration file for usb_dev_msc. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.sct b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.sct new file mode 100644 index 0000000..25c55d9 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_msc.sct - Linker configuration file for usb_dev_msc. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.uvopt b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.uvopt new file mode 100644 index 0000000..0552663 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_msc + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c123g.c + mmc-dk-tm4c123g.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_msc.c + usb_dev_msc.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_msc_structs.c + usb_msc_structs.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usbdsdcard.c + usbdsdcard.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.uvproj b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.uvproj new file mode 100644 index 0000000..a9fe8b4 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + usb_dev_msc + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_msc + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_msc.bin .\rvmdk\usb_dev_msc.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_msc.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + mmc-dk-tm4c123g.c + 1 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c123g.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_dev_msc.c + 1 + .\usb_dev_msc.c + + + usb_msc_structs.c + 1 + .\usb_msc_structs.c + + + usbdsdcard.c + 1 + .\usbdsdcard.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc_ccs.cmd b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc_ccs.cmd new file mode 100644 index 0000000..7a1cf02 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usb_dev_msc_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_msc_ccs.cmd - CCS linker configuration file for usb_dev_msc. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/usb_dev_msc/usb_msc_structs.c b/boards/dk-tm4c123g/usb_dev_msc/usb_msc_structs.c new file mode 100644 index 0000000..74065be --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usb_msc_structs.c @@ -0,0 +1,191 @@ +//***************************************************************************** +// +// usb_bulk_structs.c - Data structures defining the mass storage USB device. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdmsc.h" +#include "usb_msc_structs.h" +#include "usbdsdcard.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'M', 0, 'a', 0, 's', 0, 's', 0, ' ', 0, 'S', 0, 't', 0, 'o', 0, 'r', 0, + 'a', 0, 'g', 0, 'e', 0, ' ', 0, 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, + 'e', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The data interface description string. +// +//***************************************************************************** +const uint8_t g_pui8DataInterfaceString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, + 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (23 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, 'i', 0, 'g', 0, + 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8DataInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The bulk device initialization and customization structures. In this case, +// we are using USBBuffers between the bulk device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the bulk channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our bulk instance structure. +// +//***************************************************************************** +tUSBDMSCDevice g_sMSCDevice = +{ + // + // Vendor ID. + // + USB_VID_TI_1CBE, + + // + // Product ID. + // + USB_PID_MSC, + + // + // Vendor Information. + // + "TI ", + + // + // Product Identification. + // + "Mass Storage ", + + // + // Revision. + // + "1.00", + 500, + USB_CONF_ATTR_SELF_PWR, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS, + { + USBDMSCStorageOpen, + USBDMSCStorageClose, + USBDMSCStorageRead, + USBDMSCStorageWrite, + USBDMSCStorageNumBlocks, + 0, + }, + USBDMSCEventCallback +}; + +//***************************************************************************** +// +// The size of the transmit and receive buffers used. +// +//***************************************************************************** +#define MSC_BUFFER_SIZE 512 diff --git a/boards/dk-tm4c123g/usb_dev_msc/usb_msc_structs.h b/boards/dk-tm4c123g/usb_dev_msc/usb_msc_structs.h new file mode 100644 index 0000000..70cb1e7 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usb_msc_structs.h @@ -0,0 +1,43 @@ +//***************************************************************************** +// +// usb_msc_structs.h - Data structures defining the mass storage USB device. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __USB_MSC_STRUCTS_H__ +#define __USB_MSC_STRUCTS_H__ + +//***************************************************************************** +// +// The mass storage class device structure. +// +//***************************************************************************** +extern tUSBDMSCDevice g_sMSCDevice; + +//***************************************************************************** +// +// The externally provided mass storage class event call back function. +// +//***************************************************************************** +extern uint32_t USBDMSCEventCallback(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgParam, void *pvMsgData); + +#endif diff --git a/boards/dk-tm4c123g/usb_dev_msc/usbdsdcard.c b/boards/dk-tm4c123g/usb_dev_msc/usbdsdcard.c new file mode 100644 index 0000000..02fd8f5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usbdsdcard.c @@ -0,0 +1,257 @@ +//***************************************************************************** +// +// usbdsdcard.c - Routines supplied for use by the mass storage class device +// class. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/sysctl.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/systick.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdmsc.h" +#include "usb_msc_structs.h" +#include "third_party/fatfs/src/diskio.h" +#include "drivers/cfal96x64x16.h" + +#define SDCARD_PRESENT 0x00000001 +#define SDCARD_IN_USE 0x00000002 +struct +{ + uint32_t ui32Flags; +} +g_sDriveInformation; + +//***************************************************************************** +// +// This function opens the drive number and prepares it for use by the Mass +// storage class device. +// +// /param ui32Drive is the driver number to open. +// +// This function is used to initialize and open the physical drive number +// associated with the parameter /e ui32Drive. The function will return zero if +// the drive could not be opened for some reason. In the case of removable +// device like an SD card this function should return zero if the SD card is +// not present. +// +// /return Returns a pointer to data that should be passed to other APIs or it +// will return 0 if no drive was found. +// +//***************************************************************************** +void * +USBDMSCStorageOpen(uint_fast32_t ui32Drive) +{ + uint_fast32_t ui32Temp; + + ASSERT(ui32Drive == 0); + + // + // Return if already in use. + // + if(g_sDriveInformation.ui32Flags & SDCARD_IN_USE) + { + return(0); + } + + // + // Initialize the drive if it is present. + // + ui32Temp = disk_initialize(0); + + if(ui32Temp == RES_OK) + { + // + // Card is present and in use. + // + g_sDriveInformation.ui32Flags = SDCARD_PRESENT | SDCARD_IN_USE; + } + else if(ui32Temp == STA_NODISK) + { + // + // Allocate the card but it is not present. + // + g_sDriveInformation.ui32Flags = SDCARD_IN_USE; + } + else + { + return(0); + } + + return((void *)&g_sDriveInformation); +} + +//***************************************************************************** +// +// This function close the drive number in use by the mass storage class device. +// +// /param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// +// This function is used to close the physical drive number associated with the +// parameter /e pvDrive. This function will return 0 if the drive was closed +// successfully and any other value will indicate a failure. +// +// /return Returns 0 if the drive was successfully closed or non-zero for a +// failure. +// +//***************************************************************************** +void +USBDMSCStorageClose(void * pvDrive) +{ + uint_fast8_t ui8Power; + + ASSERT(pvDrive != 0); + + // + // Clear all flags. + // + g_sDriveInformation.ui32Flags = 0; + + // + // Power up the card. + // + ui8Power = 0; + + // + // Turn off the power to the card. + // + disk_ioctl(0, CTRL_POWER, &ui8Power); +} + +//***************************************************************************** +// +// This function will read a block from a device opened by the +// USBDMSCStorageOpen() call. +// +// /param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// /param pui8Data is the buffer that data will be written into. +// /param ui32NumBlocks is the number of blocks to read. +// +// This function is use to read blocks from a physical device and return them +// in the /e pui8Data buffer. The data area pointed to by /e pui8Data should be +// at least /e ui32NumBlocks * Block Size bytes to prevent overwriting data. +// +// /return Returns the number of bytes that were read from the device. +// +//***************************************************************************** +uint32_t USBDMSCStorageRead(void * pvDrive, + uint8_t *pui8Data, + uint_fast32_t ui32Sector, + uint_fast32_t ui32NumBlocks) +{ + ASSERT(pvDrive != 0); + + if(disk_read (0, pui8Data, ui32Sector, ui32NumBlocks) == RES_OK) + { + // TODO remove fixed 512 + return(ui32NumBlocks * 512); + } + return(0); +} + +//***************************************************************************** +// +// This function will write a block to a device opened by the +// USBDMSCStorageOpen() call. +// +// /param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// /param pui8Data is the buffer that data will be used for writing. +// /param ui32NumBlocks is the number of blocks to write. +// +// This function is use to write blocks to a physical device from the buffer +// pointed to by the /e pui8Data buffer. If the number of blocks is greater than +// one then the block address will increment and write to the next block until +// /e ui32NumBlocks * Block Size bytes have been written. +// +// /return Returns the number of bytes that were written to the device. +// +//***************************************************************************** +uint32_t USBDMSCStorageWrite(void * pvDrive, + uint8_t *pui8Data, + uint_fast32_t ui32Sector, + uint_fast32_t ui32NumBlocks) +{ + ASSERT(pvDrive != 0); + + if(disk_write(0, pui8Data, ui32Sector, ui32NumBlocks) == RES_OK) + { + return(ui32NumBlocks * 512); + } + return(0); +} + +//***************************************************************************** +// +// This function will return the number of blocks present on a device. +// +// /param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// +// This function is used to return the total number of blocks on a physical +// device based on the /e pvDrive parameter. +// +// /return Returns the number of blocks that are present in a device. +// +//***************************************************************************** +uint32_t +USBDMSCStorageNumBlocks(void * pvDrive) +{ + uint_fast32_t ui32SectorCount; + + // + // Read the number of sectors. + // + disk_ioctl(0, GET_SECTOR_COUNT, &ui32SectorCount); + + return(ui32SectorCount); +} + +//***************************************************************************** +// +// This function will return the current status of a device. +// +// /param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// +// This function is used to return the current status of the device indicated by +// the /e pvDrive parameter. This can be used to see if the device is busy, +// or if it is present. +// +// /return Returns the size in bytes of blocks that in a device. +// +//***************************************************************************** +#define USBDMSC_IDLE 0x00000000 +#define USBDMSC_NOT_PRESENT 0x00000001 +uint32_t USBDMSCStorageStatus(void * pvDrive); diff --git a/boards/dk-tm4c123g/usb_dev_msc/usbdsdcard.h b/boards/dk-tm4c123g/usb_dev_msc/usbdsdcard.h new file mode 100644 index 0000000..1562033 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_msc/usbdsdcard.h @@ -0,0 +1,43 @@ +//***************************************************************************** +// +// usbdsdcard.h - Prototypes for functions supplied for use by the mass storage +// class device. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __USBDSDCARD_H__ +#define __USBDSDCARD_H__ + +//***************************************************************************** +// +// +//***************************************************************************** +extern void * USBDMSCStorageOpen(uint32_t ui32Drive); +extern void USBDMSCStorageClose(void * pvDrive); +extern uint32_t USBDMSCStorageRead(void * pvDrive, uint8_t *pui8Data, + uint32_t ui32Sector, + uint32_t ui32NumBlocks); +extern uint32_t USBDMSCStorageWrite(void * pvDrive, uint8_t *pui8Data, + uint32_t ui32Sector, + uint32_t ui32NumBlocks); +uint32_t USBDMSCStorageNumBlocks(void * pvDrive); + +#endif diff --git a/boards/dk-tm4c123g/usb_dev_serial/Makefile b/boards/dk-tm4c123g/usb_dev_serial/Makefile new file mode 100644 index 0000000..04bbcfd --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device serial example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device serial example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_serial.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device serial example. +# +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/usb_dev_serial.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/usb_serial_structs.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_dev_serial.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_serial.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_serial.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_serial.axf: usb_dev_serial.ld +SCATTERgcc_usb_dev_serial=usb_dev_serial.ld +ENTRY_usb_dev_serial=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/usb_dev_serial/ccs/.ccsimportspec b/boards/dk-tm4c123g/usb_dev_serial/ccs/.ccsimportspec new file mode 100644 index 0000000..c5ecbbf --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_serial/ccs/.ccsproject b/boards/dk-tm4c123g/usb_dev_serial/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_serial/ccs/.cproject b/boards/dk-tm4c123g/usb_dev_serial/ccs/.cproject new file mode 100644 index 0000000..de3993a --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/ccs/.cproject @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_serial/ccs/.project b/boards/dk-tm4c123g/usb_dev_serial/ccs/.project new file mode 100644 index 0000000..07961c2 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/ccs/.project @@ -0,0 +1,70 @@ + + + usb_dev_serial + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_serial/startup_ccs.c + + + usb_dev_serial.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.c + + + usb_dev_serial_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial_ccs.cmd + + + usb_serial_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_dev_serial/usb_serial_structs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/usb_dev_serial/ccs/Debug/usb_dev_serial.bin b/boards/dk-tm4c123g/usb_dev_serial/ccs/Debug/usb_dev_serial.bin new file mode 100644 index 0000000..7b46059 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_serial/ccs/Debug/usb_dev_serial.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_serial/ccs/Debug/usb_dev_serial.out b/boards/dk-tm4c123g/usb_dev_serial/ccs/Debug/usb_dev_serial.out new file mode 100644 index 0000000..a4bf33a Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_serial/ccs/Debug/usb_dev_serial.out differ diff --git a/boards/dk-tm4c123g/usb_dev_serial/ccs/macros.ini_initial b/boards/dk-tm4c123g/usb_dev_serial/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/usb_dev_serial/ccs/target_config.ccxml b/boards/dk-tm4c123g/usb_dev_serial/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin b/boards/dk-tm4c123g/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin new file mode 100644 index 0000000..66f4d1a Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_serial/ewarm/Exe/usb_dev_serial.out b/boards/dk-tm4c123g/usb_dev_serial/ewarm/Exe/usb_dev_serial.out new file mode 100644 index 0000000..52c9c80 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_serial/ewarm/Exe/usb_dev_serial.out differ diff --git a/boards/dk-tm4c123g/usb_dev_serial/gcc/usb_dev_serial.axf b/boards/dk-tm4c123g/usb_dev_serial/gcc/usb_dev_serial.axf new file mode 100644 index 0000000..0389315 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_serial/gcc/usb_dev_serial.axf differ diff --git a/boards/dk-tm4c123g/usb_dev_serial/gcc/usb_dev_serial.bin b/boards/dk-tm4c123g/usb_dev_serial/gcc/usb_dev_serial.bin new file mode 100644 index 0000000..ff555b4 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_serial/gcc/usb_dev_serial.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_serial/readme.txt b/boards/dk-tm4c123g/usb_dev_serial/readme.txt new file mode 100644 index 0000000..fbac511 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/readme.txt @@ -0,0 +1,32 @@ +USB Serial Device + +This example application turns the evaluation kit into a virtual serial +port when connected to the USB host system. The application supports the +USB Communication Device Class, Abstract Control Model to redirect UART0 +traffic to and from the USB host system. + +Assuming you installed TivaWare in the default directory, a +driver information (INF) file for use with Windows XP, Windows Vista and +Windows7 can be found in C:/ti/TivaWare_C_Series-x.x/windows_drivers. +For Windows 2000, the required INF file is in +C:/ti/TivaWare_C_Series-x.x/windows_drivers/win2K. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/usb_dev_serial/rvmdk/usb_dev_serial.axf b/boards/dk-tm4c123g/usb_dev_serial/rvmdk/usb_dev_serial.axf new file mode 100644 index 0000000..3326ab3 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_serial/rvmdk/usb_dev_serial.axf differ diff --git a/boards/dk-tm4c123g/usb_dev_serial/rvmdk/usb_dev_serial.bin b/boards/dk-tm4c123g/usb_dev_serial/rvmdk/usb_dev_serial.bin new file mode 100644 index 0000000..66c86f8 Binary files /dev/null and b/boards/dk-tm4c123g/usb_dev_serial/rvmdk/usb_dev_serial.bin differ diff --git a/boards/dk-tm4c123g/usb_dev_serial/startup_ccs.c b/boards/dk-tm4c123g/usb_dev_serial/startup_ccs.c new file mode 100644 index 0000000..7006d5f --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_serial/startup_ewarm.c b/boards/dk-tm4c123g/usb_dev_serial/startup_ewarm.c new file mode 100644 index 0000000..c4b3fba --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_serial/startup_gcc.c b/boards/dk-tm4c123g/usb_dev_serial/startup_gcc.c new file mode 100644 index 0000000..056d10e --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_dev_serial/startup_rvmdk.S b/boards/dk-tm4c123g/usb_dev_serial/startup_rvmdk.S new file mode 100644 index 0000000..18d3551 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN USBUARTIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD USBUARTIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.c b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.c new file mode 100644 index 0000000..2cdcfd0 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.c @@ -0,0 +1,1441 @@ +//***************************************************************************** +// +// usb_dev_serial.c - Main routines for the USB CDC serial example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_gpio.h" +#include "inc/hw_uart.h" +#include "inc/hw_sysctl.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/timer.h" +#include "driverlib/uart.h" +#include "driverlib/usb.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" +#include "usb_serial_structs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

USB Serial Device (usb_dev_serial)

+//! +//! This example application turns the evaluation kit into a virtual serial +//! port when connected to the USB host system. The application supports the +//! USB Communication Device Class, Abstract Control Model to redirect UART0 +//! traffic to and from the USB host system. +//! +//! Assuming you installed TivaWare in the default directory, a +//! driver information (INF) file for use with Windows XP, Windows Vista and +//! Windows7 can be found in C:/ti/TivaWare_C_Series-x.x/windows_drivers. +//! For Windows 2000, the required INF file is in +//! C:/ti/TivaWare_C_Series-x.x/windows_drivers/win2K. +// +//***************************************************************************** + +//***************************************************************************** +// +// Note: +// +// This example is intended to run on Tiva C Series evaluation kit hardware +// where the UARTs are wired solely for TX and RX, and do not have GPIOs +// connected to act as handshake signals. As a result, this example mimics +// the case where communication is always possible. It reports DSR, DCD +// and CTS as high to ensure that the USB host recognizes that data can be +// sent and merely ignores the host's requested DTR and RTS states. "TODO" +// comments in the code indicate where code would be required to add support +// for real handshakes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration and tuning parameters. +// +//***************************************************************************** + +//***************************************************************************** +// +// The system tick rate expressed both as ticks per second and a millisecond +// period. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 +#define SYSTICK_PERIOD_MS (1000 / SYSTICKS_PER_SECOND) + +//***************************************************************************** +// +// Variables tracking transmit and receive counts. +// +//***************************************************************************** +volatile uint32_t g_ui32UARTTxCount = 0; +volatile uint32_t g_ui32UARTRxCount = 0; +#ifdef DEBUG +uint32_t g_ui32UARTRxErrors = 0; +#endif + +//***************************************************************************** +// +// The base address, peripheral ID and interrupt ID of the UART that is to +// be redirected. +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines required to redirect UART0 via USB. +// +//***************************************************************************** +#define USB_UART_BASE UART0_BASE +#define USB_UART_PERIPH SYSCTL_PERIPH_UART0 +#define USB_UART_INT INT_UART0 + +//***************************************************************************** +// +// Default line coding settings for the redirected UART. +// +//***************************************************************************** +#define DEFAULT_BIT_RATE 115200 +#define DEFAULT_UART_CONFIG (UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | \ + UART_CONFIG_STOP_ONE) + +//***************************************************************************** +// +// GPIO peripherals and pins muxed with the redirected UART. These will depend +// upon the IC in use and the UART selected in USB_UART_BASE. Be careful that +// these settings all agree with the hardware you are using. +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines required to redirect UART0 via USB. +// +//***************************************************************************** +#define TX_GPIO_BASE GPIO_PORTA_BASE +#define TX_GPIO_PERIPH SYSCTL_PERIPH_GPIOA +#define TX_GPIO_PIN GPIO_PIN_1 + +#define RX_GPIO_BASE GPIO_PORTA_BASE +#define RX_GPIO_PERIPH SYSCTL_PERIPH_GPIOA +#define RX_GPIO_PIN GPIO_PIN_0 + +//***************************************************************************** +// +// Flag indicating whether or not we are currently sending a Break condition. +// +//***************************************************************************** +static bool g_bSendingBreak = false; + +//***************************************************************************** +// +// Global system tick counter +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount = 0; + +//***************************************************************************** +// +// Graphics context used to show text on the color STN display. +// +//***************************************************************************** +tContext g_sContext; +#define TEXT_FONT g_psFontFixed6x8 +#define TEXT_HEIGHT (GrFontHeightGet(TEXT_FONT)) +#define BUFFER_METER_HEIGHT TEXT_HEIGHT +#define BUFFER_METER_WIDTH 56 + +//***************************************************************************** +// +// Flags used to pass commands from interrupt context to the main loop. +// +//***************************************************************************** +#define COMMAND_PACKET_RECEIVED 0x00000001 +#define COMMAND_STATUS_UPDATE 0x00000002 + +volatile uint32_t g_ui32Flags = 0; +char *g_pcStatus; + +//***************************************************************************** +// +// Global flag indicating that a USB configuration has been set. +// +//***************************************************************************** +static volatile bool g_bUSBConfigured = false; + +//***************************************************************************** +// +// Internal function prototypes. +// +//***************************************************************************** +static void USBUARTPrimeTransmit(uint32_t ui32Base); +static void CheckForSerialStateChange(const tUSBDCDCDevice *psDevice, + int32_t i32Errors); +static void SetControlLineState(uint16_t ui16State); +static bool SetLineCoding(tLineCoding *psLineCoding); +static void GetLineCoding(tLineCoding *psLineCoding); +static void SendBreak(bool bSend); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + while(1) + { + } +} +#endif + +//***************************************************************************** +// +// This function is called whenever serial data is received from the UART. +// It is passed the accumulated error flags from each character received in +// this interrupt and determines from them whether or not an interrupt +// notification to the host is required. +// +// If a notification is required and the control interrupt endpoint is idle, +// we send the notification immediately. If the endpoint is not idle, we +// accumulate the errors in a global variable which will be checked on +// completion of the previous notification and used to send a second one +// if necessary. +// +//***************************************************************************** +static void +CheckForSerialStateChange(const tUSBDCDCDevice *psDevice, int32_t i32Errors) +{ + uint16_t ui16SerialState; + + // + // Clear our USB serial state. Since we are faking the handshakes, always + // set the TXCARRIER (DSR) and RXCARRIER (DCD) bits. + // + ui16SerialState = USB_CDC_SERIAL_STATE_TXCARRIER | + USB_CDC_SERIAL_STATE_RXCARRIER; + + // + // Are any error bits set? + // + if(i32Errors) + { + // + // At least one error is being notified so translate from our hardware + // error bits into the correct state markers for the USB notification. + // + if(i32Errors & UART_DR_OE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_OVERRUN; + } + + if(i32Errors & UART_DR_PE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_PARITY; + } + + if(i32Errors & UART_DR_FE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_FRAMING; + } + + if(i32Errors & UART_DR_BE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_BREAK; + } + + // Call the CDC driver to notify the state change. + USBDCDCSerialStateChange((void *)psDevice, ui16SerialState); + } +} + +//***************************************************************************** +// +// Read as many characters from the UART FIFO as we can and move them into +// the CDC transmit buffer. +// +// \return Returns UART error flags read during data reception. +// +//***************************************************************************** +static int32_t +ReadUARTData(void) +{ + int32_t i32Char, i32Errors; + uint8_t ui8Char; + uint32_t ui32Space; + + // + // Clear our error indicator. + // + i32Errors = 0; + + // + // How much space do we have in the buffer? + // + ui32Space = USBBufferSpaceAvailable((tUSBBuffer *)&g_sTxBuffer); + + // + // Read data from the UART FIFO until there is none left or we run + // out of space in our receive buffer. + // + while(ui32Space && ROM_UARTCharsAvail(USB_UART_BASE)) + { + // + // Read a character from the UART FIFO into the ring buffer if no + // errors are reported. + // + i32Char = ROM_UARTCharGetNonBlocking(USB_UART_BASE); + + // + // If the character did not contain any error notifications, + // copy it to the output buffer. + // + if(!(i32Char & ~0xFF)) + { + ui8Char = (uint8_t)(i32Char & 0xFF); + USBBufferWrite((tUSBBuffer *)&g_sTxBuffer, + (uint8_t *)&ui8Char, 1); + + // + // Decrement the number of bytes we know the buffer can accept. + // + ui32Space--; + } + else + { +#ifdef DEBUG + // + // Increment our receive error counter. + // + g_ui32UARTRxErrors++; +#endif + // + // Update our error accumulator. + // + i32Errors |= i32Char; + } + + // + // Update our count of bytes received via the UART. + // + g_ui32UARTRxCount++; + } + + // + // Pass back the accumulated error indicators. + // + return(i32Errors); +} + +//***************************************************************************** +// +// Take as many bytes from the transmit buffer as we have space for and move +// them into the USB UART's transmit FIFO. +// +//***************************************************************************** +static void +USBUARTPrimeTransmit(uint32_t ui32Base) +{ + uint32_t ui32Read; + uint8_t ui8Char; + + // + // If we are currently sending a break condition, don't receive any + // more data. We will resume transmission once the break is turned off. + // + if(g_bSendingBreak) + { + return; + } + + // + // If there is space in the UART FIFO, try to read some characters + // from the receive buffer to fill it again. + // + while(ROM_UARTSpaceAvail(ui32Base)) + { + // + // Get a character from the buffer. + // + ui32Read = USBBufferRead((tUSBBuffer *)&g_sRxBuffer, &ui8Char, 1); + + // + // Did we get a character? + // + if(ui32Read) + { + // + // Place the character in the UART transmit FIFO. + // + ROM_UARTCharPutNonBlocking(ui32Base, ui8Char); + + // + // Update our count of bytes transmitted via the UART. + // + g_ui32UARTTxCount++; + } + else + { + // + // We ran out of characters so exit the function. + // + return; + } + } +} + +//***************************************************************************** +// +// Interrupt handler for the system tick counter. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Update our system time. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// Interrupt handler for the UART which we are redirecting via USB. +// +//***************************************************************************** +void +USBUARTIntHandler(void) +{ + uint32_t ui32Ints; + int32_t i32Errors; + + // + // Get and clear the current interrupt source(s) + // + ui32Ints = ROM_UARTIntStatus(USB_UART_BASE, true); + ROM_UARTIntClear(USB_UART_BASE, ui32Ints); + + // + // Are we being interrupted because the TX FIFO has space available? + // + if(ui32Ints & UART_INT_TX) + { + // + // Move as many bytes as we can into the transmit FIFO. + // + USBUARTPrimeTransmit(USB_UART_BASE); + + // + // If the output buffer is empty, turn off the transmit interrupt. + // + if(!USBBufferDataAvailable(&g_sRxBuffer)) + { + ROM_UARTIntDisable(USB_UART_BASE, UART_INT_TX); + } + } + + // + // Handle receive interrupts. + // + if(ui32Ints & (UART_INT_RX | UART_INT_RT)) + { + // + // Read the UART's characters into the buffer. + // + i32Errors = ReadUARTData(); + + // + // Check to see if we need to notify the host of any errors we just + // detected. + // + CheckForSerialStateChange(&g_sCDCDevice, i32Errors); + } +} + +//***************************************************************************** +// +// Set the state of the RS232 RTS and DTR signals. +// +//***************************************************************************** +static void +SetControlLineState(uint16_t ui16State) +{ + // + // TODO: If configured with GPIOs controlling the handshake lines, + // set them appropriately depending upon the flags passed in the wValue + // field of the request structure passed. + // +} + +//***************************************************************************** +// +// Set the communication parameters to use on the UART. +// +//***************************************************************************** +static bool +SetLineCoding(tLineCoding *psLineCoding) +{ + uint32_t ui32Config; + bool bRetcode; + + // + // Assume everything is OK until we detect any problem. + // + bRetcode = true; + + // + // Word length. For invalid values, the default is to set 8 bits per + // character and return an error. + // + switch(psLineCoding->ui8Databits) + { + case 5: + { + ui32Config = UART_CONFIG_WLEN_5; + break; + } + + case 6: + { + ui32Config = UART_CONFIG_WLEN_6; + break; + } + + case 7: + { + ui32Config = UART_CONFIG_WLEN_7; + break; + } + + case 8: + { + ui32Config = UART_CONFIG_WLEN_8; + break; + } + + default: + { + ui32Config = UART_CONFIG_WLEN_8; + bRetcode = false; + break; + } + } + + // + // Parity. For any invalid values, we set no parity and return an error. + // + switch(psLineCoding->ui8Parity) + { + case USB_CDC_PARITY_NONE: + { + ui32Config |= UART_CONFIG_PAR_NONE; + break; + } + + case USB_CDC_PARITY_ODD: + { + ui32Config |= UART_CONFIG_PAR_ODD; + break; + } + + case USB_CDC_PARITY_EVEN: + { + ui32Config |= UART_CONFIG_PAR_EVEN; + break; + } + + case USB_CDC_PARITY_MARK: + { + ui32Config |= UART_CONFIG_PAR_ONE; + break; + } + + case USB_CDC_PARITY_SPACE: + { + ui32Config |= UART_CONFIG_PAR_ZERO; + break; + } + + default: + { + ui32Config |= UART_CONFIG_PAR_NONE; + bRetcode = false; + break; + } + } + + // + // Stop bits. Our hardware only supports 1 or 2 stop bits whereas CDC + // allows the host to select 1.5 stop bits. If passed 1.5 (or any other + // invalid or unsupported value of ui8Stop, we set up for 1 stop bit but + // return an error in case the caller needs to Stall or otherwise report + // this back to the host. + // + switch(psLineCoding->ui8Stop) + { + // + // One stop bit requested. + // + case USB_CDC_STOP_BITS_1: + { + ui32Config |= UART_CONFIG_STOP_ONE; + break; + } + + // + // Two stop bits requested. + // + case USB_CDC_STOP_BITS_2: + { + ui32Config |= UART_CONFIG_STOP_TWO; + break; + } + + // + // Other cases are either invalid values of ui8Stop or values that we + // cannot support so set 1 stop bit but return an error. + // + default: + { + ui32Config = UART_CONFIG_STOP_ONE; + bRetcode |= false; + break; + } + } + + // + // Set the UART mode appropriately. + // + ROM_UARTConfigSetExpClk(USB_UART_BASE, ROM_SysCtlClockGet(), + psLineCoding->ui32Rate, ui32Config); + + // + // Let the caller know if we had a problem or not. + // + return(bRetcode); +} + +//***************************************************************************** +// +// Get the communication parameters in use on the UART. +// +//***************************************************************************** +static void +GetLineCoding(tLineCoding *psLineCoding) +{ + uint32_t ui32Config; + uint32_t ui32Rate; + + // + // Get the current line coding set in the UART. + // + ROM_UARTConfigGetExpClk(USB_UART_BASE, ROM_SysCtlClockGet(), &ui32Rate, + &ui32Config); + psLineCoding->ui32Rate = ui32Rate; + + // + // Translate the configuration word length field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_WLEN_MASK) + { + case UART_CONFIG_WLEN_8: + { + psLineCoding->ui8Databits = 8; + break; + } + + case UART_CONFIG_WLEN_7: + { + psLineCoding->ui8Databits = 7; + break; + } + + case UART_CONFIG_WLEN_6: + { + psLineCoding->ui8Databits = 6; + break; + } + + case UART_CONFIG_WLEN_5: + { + psLineCoding->ui8Databits = 5; + break; + } + } + + // + // Translate the configuration parity field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_PAR_MASK) + { + case UART_CONFIG_PAR_NONE: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_NONE; + break; + } + + case UART_CONFIG_PAR_ODD: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_ODD; + break; + } + + case UART_CONFIG_PAR_EVEN: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_EVEN; + break; + } + + case UART_CONFIG_PAR_ONE: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_MARK; + break; + } + + case UART_CONFIG_PAR_ZERO: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_SPACE; + break; + } + } + + // + // Translate the configuration stop bits field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_STOP_MASK) + { + case UART_CONFIG_STOP_ONE: + { + psLineCoding->ui8Stop = USB_CDC_STOP_BITS_1; + break; + } + + case UART_CONFIG_STOP_TWO: + { + psLineCoding->ui8Stop = USB_CDC_STOP_BITS_2; + break; + } + } +} + +//***************************************************************************** +// +// This function sets or clears a break condition on the redirected UART RX +// line. A break is started when the function is called with \e bSend set to +// \b true and persists until the function is called again with \e bSend set +// to \b false. +// +//***************************************************************************** +static void +SendBreak(bool bSend) +{ + // + // Are we being asked to start or stop the break condition? + // + if(!bSend) + { + // + // Remove the break condition on the line. + // + ROM_UARTBreakCtl(USB_UART_BASE, false); + g_bSendingBreak = false; + } + else + { + // + // Start sending a break condition on the line. + // + ROM_UARTBreakCtl(USB_UART_BASE, true); + g_bSendingBreak = true; + } +} + +//***************************************************************************** +// +// Shows the status string on the color STN display. +// +// \param psContext is a pointer to the graphics context representing the +// display. +// \param pcStatus is a pointer to the string to be shown. +// +// This implementation assumes we are using a 6 pixel wide font, giving us +// space for 16 characters across the display. +// +//***************************************************************************** +void +DisplayStatus(tContext *psContext, char *pcStatus) +{ + tRectangle sRectLine; + + // + // Determine the bounding rectangle for this line of text. + // + sRectLine.i16XMin = 0; + sRectLine.i16XMax = GrContextDpyWidthGet(psContext) - 1; + sRectLine.i16YMin = GrContextDpyHeightGet(psContext) - (TEXT_HEIGHT + 2); + sRectLine.i16YMax = sRectLine.i16YMin + GrFontHeightGet(TEXT_FONT) + 1; + + // + // Clear the line with black. + // + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(psContext, &sRectLine); + + // + // Draw the new status string + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(psContext, pcStatus, -1, + GrContextDpyWidthGet(psContext) / 2, + sRectLine.i16YMin + (TEXT_HEIGHT / 2), false); +} + +//***************************************************************************** +// +// Draw a horizontal meter at a given position on the display and fill it +// with green. +// +//***************************************************************************** +void +DrawBufferMeter(tContext *psContext, int32_t i32X, int32_t i32Y) +{ + tRectangle sRect; + int32_t i32CorrectedY; + + // + // Correct the Y coordinate so that the meter is centered on the same line + // as the text caption to its left. + // + i32CorrectedY = i32Y - ((BUFFER_METER_HEIGHT - TEXT_HEIGHT) / 2); + + // + // Determine the bounding rectangle of the meter. + // + sRect.i16XMin = i32X; + sRect.i16XMax = i32X + BUFFER_METER_WIDTH - 1; + sRect.i16YMin = i32CorrectedY; + sRect.i16YMax = i32CorrectedY + BUFFER_METER_HEIGHT - 1; + + // + // Fill the meter with green to indicate empty + // + GrContextForegroundSet(psContext, ClrGreen); + GrRectFill(psContext, &sRect); + + // + // Put a white box around the meter. + // + GrContextForegroundSet(psContext, ClrWhite); + GrRectDraw(psContext, &sRect); +} + +//***************************************************************************** +// +// Draw green and red blocks within a graphical meter on the display to +// indicate percentage fullness of some quantity (transmit and receive buffers +// in this case). +// +//***************************************************************************** +void +UpdateBufferMeter(tContext *psContext, uint32_t ui32FullPercent, int32_t i32X, + int32_t i32Y) +{ + tRectangle sRect; + int32_t i32CorrectedY; + int32_t i32XBreak; + + // + // Correct the Y coordinate so that the meter is centered on the same line + // as the text caption to its left and so that we avoid the meter's 1 pixel + // white border. + // + i32CorrectedY = i32Y - ((BUFFER_METER_HEIGHT - TEXT_HEIGHT) / 2) + 1; + + // + // Determine where the break point between full (red) and empty (green) + // sections occurs. + // + i32XBreak = (i32X + 1) + (ui32FullPercent * (BUFFER_METER_WIDTH - 2)) / 100; + + // + // Determine the bounding rectangle of the full section. + // + sRect.i16XMin = i32X + 1; + sRect.i16XMax = i32XBreak; + sRect.i16YMin = i32CorrectedY; + sRect.i16YMax = i32CorrectedY + BUFFER_METER_HEIGHT - 3; + + // + // Fill the full section with red (if there is anything to draw) + // + if(ui32FullPercent) + { + GrContextForegroundSet(psContext, ClrRed); + GrRectFill(psContext, &sRect); + } + + // + // Fill the empty section with green. + // + sRect.i16XMin = i32XBreak; + sRect.i16XMax = i32X + BUFFER_METER_WIDTH - 2; + if(sRect.i16XMax > sRect.i16XMin) + { + GrContextForegroundSet(psContext, ClrGreen); + GrRectFill(psContext, &sRect); + } + + // + // Revert to white for text drawing which may occur later. + // + GrContextForegroundSet(psContext, ClrWhite); + +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to control and setup of the device. +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to perform control-related +// operations on behalf of the USB host. These functions include setting +// and querying the serial communication parameters, setting handshake line +// states and sending break conditions. +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +ControlHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData) +{ + uint32_t ui32IntsOff; + + // + // Which event are we being asked to process? + // + switch(ui32Event) + { + // + // We are connected to a host and communication is now possible. + // + case USB_EVENT_CONNECTED: + g_bUSBConfigured = true; + + // + // Flush our buffers. + // + USBBufferFlush(&g_sTxBuffer); + USBBufferFlush(&g_sRxBuffer); + + // + // Tell the main loop to update the display. + // + ui32IntsOff = ROM_IntMasterDisable(); + g_pcStatus = "Connected"; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + if(!ui32IntsOff) + { + ROM_IntMasterEnable(); + } + break; + + // + // The host has disconnected. + // + case USB_EVENT_DISCONNECTED: + g_bUSBConfigured = false; + ui32IntsOff = ROM_IntMasterDisable(); + g_pcStatus = "Disconnected"; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + if(!ui32IntsOff) + { + ROM_IntMasterEnable(); + } + break; + + // + // Return the current serial communication parameters. + // + case USBD_CDC_EVENT_GET_LINE_CODING: + GetLineCoding(pvMsgData); + break; + + // + // Set the current serial communication parameters. + // + case USBD_CDC_EVENT_SET_LINE_CODING: + SetLineCoding(pvMsgData); + break; + + // + // Set the current serial communication parameters. + // + case USBD_CDC_EVENT_SET_CONTROL_LINE_STATE: + SetControlLineState((uint16_t)ui32MsgValue); + break; + + // + // Send a break condition on the serial line. + // + case USBD_CDC_EVENT_SEND_BREAK: + SendBreak(true); + break; + + // + // Clear the break condition on the serial line. + // + case USBD_CDC_EVENT_CLEAR_BREAK: + SendBreak(false); + break; + + // + // Ignore SUSPEND and RESUME for now. + // + case USB_EVENT_SUSPEND: + case USB_EVENT_RESUME: + break; + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: +#ifdef DEBUG + while(1); +#else + break; +#endif + + } + + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the transmit channel (data to +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event have we been sent? + // + switch(ui32Event) + { + case USB_EVENT_TX_COMPLETE: + // + // Since we are using the USBBuffer, we don't need to do anything + // here. + // + break; + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: +#ifdef DEBUG + while(1); +#else + break; +#endif + + } + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the receive channel (data from +// the USB host). +// +// \param pvCBData is the client-supplied callback data value for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + uint32_t ui32Count; + + // + // Which event are we being sent? + // + switch(ui32Event) + { + // + // A new packet has been received. + // + case USB_EVENT_RX_AVAILABLE: + { + // + // Feed some characters into the UART TX FIFO and enable the + // interrupt so we are told when there is more space. + // + USBUARTPrimeTransmit(USB_UART_BASE); + ROM_UARTIntEnable(USB_UART_BASE, UART_INT_TX); + break; + } + + // + // We are being asked how much unprocessed data we have still to + // process. We return 0 if the UART is currently idle or 1 if it is + // in the process of transmitting something. The actual number of + // bytes in the UART FIFO is not important here, merely whether or + // not everything previously sent to us has been transmitted. + // + case USB_EVENT_DATA_REMAINING: + { + // + // Get the number of bytes in the buffer and add 1 if some data + // still has to clear the transmitter. + // + ui32Count = ROM_UARTBusy(USB_UART_BASE) ? 1 : 0; + return(ui32Count); + } + + // + // We are being asked to provide a buffer into which the next packet + // can be read. We do not support this mode of receiving data so let + // the driver know by returning 0. The CDC driver should not be sending + // this message but this is included just for illustration and + // completeness. + // + case USB_EVENT_REQUEST_BUFFER: + { + return(0); + } + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: +#ifdef DEBUG + while(1); +#else + break; +#endif + } + + return(0); +} + +//***************************************************************************** +// +// This is the main application entry function. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32TxCount; + uint32_t ui32RxCount; + tRectangle sRect; + char pcBuffer[16]; + uint32_t ui32Fullness; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL at 50MHz + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Erratum workaround for silicon revision A1. VBUS must have pull-down. + // + if(CLASS_IS_TM4C123 && REVISION_IS_A1) + { + HWREG(GPIO_PORTB_BASE + GPIO_O_PDR) |= GPIO_PIN_1; + } + + // + // Not configured initially. + // + g_bUSBConfigured = false; + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top 15 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "usb-dev-serial", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + + // + // Show the various static text elements on the color STN display. + // + GrStringDraw(&g_sContext, "Tx #",-1, 0, 12, false); + GrStringDraw(&g_sContext, "Tx buf", -1, 0, 22, false); + GrStringDraw(&g_sContext, "Rx #", -1, 0, 32, false); + GrStringDraw(&g_sContext, "Rx buf", -1, 0, 42, false); + DrawBufferMeter(&g_sContext, 40, 22); + DrawBufferMeter(&g_sContext, 40, 42); + + // + // Enable the UART that we will be redirecting. + // + ROM_SysCtlPeripheralEnable(USB_UART_PERIPH); + + // + // Enable and configure the UART RX and TX pins + // + ROM_SysCtlPeripheralEnable(TX_GPIO_PERIPH); + ROM_SysCtlPeripheralEnable(RX_GPIO_PERIPH); + ROM_GPIOPinTypeUART(TX_GPIO_BASE, TX_GPIO_PIN); + ROM_GPIOPinTypeUART(RX_GPIO_BASE, RX_GPIO_PIN); + + // + // TODO: Add code to configure handshake GPIOs if required. + // + + // + // Set the default UART configuration. + // + ROM_UARTConfigSetExpClk(USB_UART_BASE, ROM_SysCtlClockGet(), + DEFAULT_BIT_RATE, DEFAULT_UART_CONFIG); + ROM_UARTFIFOLevelSet(USB_UART_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8); + + // + // Configure and enable UART interrupts. + // + ROM_UARTIntClear(USB_UART_BASE, ROM_UARTIntStatus(USB_UART_BASE, false)); + ROM_UARTIntEnable(USB_UART_BASE, (UART_INT_OE | UART_INT_BE | UART_INT_PE | + UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX)); + + // + // Enable the system tick. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Tell the user what we are up to. + // + DisplayStatus(&g_sContext, " Configuring... "); + + // + // Initialize the transmit and receive buffers. + // + USBBufferInit(&g_sTxBuffer); + USBBufferInit(&g_sRxBuffer); + + // + // Set the USB stack mode to Device mode with VBUS monitoring. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Pass our device information to the USB library and place the device + // on the bus. + // + USBDCDCInit(0, &g_sCDCDevice); + + // + // Wait for initial configuration to complete. + // + DisplayStatus(&g_sContext, "Waiting for host"); + + // + // Clear our local byte counters. + // + ui32RxCount = 0; + ui32TxCount = 0; + + // + // Enable interrupts now that the application is ready to start. + // + ROM_IntEnable(USB_UART_INT); + + // + // Main application loop. + // + while(1) + { + + // + // Have we been asked to update the status display? + // + if(g_ui32Flags & COMMAND_STATUS_UPDATE) + { + // + // Clear the command flag + // + ROM_IntMasterDisable(); + g_ui32Flags &= ~COMMAND_STATUS_UPDATE; + ROM_IntMasterEnable(); + + DisplayStatus(&g_sContext, g_pcStatus); + } + + // + // Has there been any transmit traffic since we last checked? + // + if(ui32TxCount != g_ui32UARTTxCount) + { + // + // Take a snapshot of the latest transmit count. + // + ui32TxCount = g_ui32UARTTxCount; + + // + // Update the display of bytes transmitted by the UART. + // + usnprintf(pcBuffer, 16, "%d ", ui32TxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 40, 12, true); + + // + // Update the RX buffer fullness. Remember that the buffers are + // named relative to the USB whereas the status display is from + // the UART's perspective. The USB's receive buffer is the UART's + // transmit buffer. + // + ui32Fullness = ((USBBufferDataAvailable(&g_sRxBuffer) * 100) / + UART_BUFFER_SIZE); + + UpdateBufferMeter(&g_sContext, ui32Fullness, 40, 22); + } + + // + // Has there been any receive traffic since we last checked? + // + if(ui32RxCount != g_ui32UARTRxCount) + { + // + // Take a snapshot of the latest receive count. + // + ui32RxCount = g_ui32UARTRxCount; + + // + // Update the display of bytes received by the UART. + // + usnprintf(pcBuffer, 16, "%d ", ui32RxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 40, 32, true); + + // + // Update the TX buffer fullness. Remember that the buffers are + // named relative to the USB whereas the status display is from + // the UART's perspective. The USB's transmit buffer is the UART's + // receive buffer. + // + ui32Fullness = ((USBBufferDataAvailable(&g_sTxBuffer) * 100) / + UART_BUFFER_SIZE); + + UpdateBufferMeter(&g_sContext, ui32Fullness, 40, 42); + } + } +} diff --git a/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ewd b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ewp b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ewp new file mode 100644 index 0000000..1c00765 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ewp @@ -0,0 +1,805 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_dev_serial.c + + + $PROJ_DIR$\usb_serial_structs.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.icf b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.icf new file mode 100644 index 0000000..30308fb --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_serial.icf - Linker configuration file for usb_dev_serial. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ld b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ld new file mode 100644 index 0000000..82a5546 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_serial.ld - Linker configuration file for usb_dev_serial. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.sct b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.sct new file mode 100644 index 0000000..45ed537 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_serial.sct - Linker configuration file for usb_dev_serial. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.uvopt b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.uvopt new file mode 100644 index 0000000..75fd78c --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.uvopt @@ -0,0 +1,373 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_serial + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_serial.c + usb_dev_serial.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_serial_structs.c + usb_serial_structs.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 10 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.uvproj b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.uvproj new file mode 100644 index 0000000..6e77bba --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial.uvproj @@ -0,0 +1,454 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + usb_dev_serial + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_serial + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_serial.bin .\rvmdk\usb_dev_serial.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_serial.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_dev_serial.c + 1 + .\usb_dev_serial.c + + + usb_serial_structs.c + 1 + .\usb_serial_structs.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial_ccs.cmd b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial_ccs.cmd new file mode 100644 index 0000000..f847601 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/usb_dev_serial_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_serial_ccs.cmd - CCS linker configuration file for usb_dev_serial. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/usb_dev_serial/usb_serial_structs.c b/boards/dk-tm4c123g/usb_dev_serial/usb_serial_structs.c new file mode 100644 index 0000000..57701a6 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/usb_serial_structs.c @@ -0,0 +1,215 @@ +//***************************************************************************** +// +// usb_serial_structs.c - Data structures defining this CDC USB device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "usb_serial_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProdectString[] = +{ + 2 + (16 * 2), + USB_DTYPE_STRING, + 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, 'a', 0, 'l', 0, ' ', 0, + 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, 'o', 0, 'r', 0, 't', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + 2 + (8 * 2), + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The control interface description string. +// +//***************************************************************************** +const uint8_t g_pui8ControlInterfaceString[] = +{ + 2 + (21 * 2), + USB_DTYPE_STRING, + 'A', 0, 'C', 0, 'M', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 't', 0, + 'r', 0, 'o', 0, 'l', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, + 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + 2 + (26 * 2), + USB_DTYPE_STRING, + 'S', 0, 'e', 0, 'l', 0, 'f', 0, ' ', 0, 'P', 0, 'o', 0, 'w', 0, + 'e', 0, 'r', 0, 'e', 0, 'd', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, + 'f', 0, 'i', 0, 'g', 0, 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, + 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_pui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProdectString, + g_pui8SerialNumberString, + g_pui8ControlInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_pui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// CDC device callback function prototypes. +// +//***************************************************************************** +uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +uint32_t TxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +uint32_t ControlHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +//***************************************************************************** +// +// The CDC device initialization and customization structures. In this case, +// we are using USBBuffers between the CDC device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the CDC channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our CDC instance structure. +// +//***************************************************************************** +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; + +tUSBDCDCDevice g_sCDCDevice = +{ + USB_VID_TI_1CBE, + USB_PID_SERIAL, + 0, + USB_CONF_ATTR_SELF_PWR, + ControlHandler, + (void *)&g_sCDCDevice, + USBBufferEventCallback, + (void *)&g_sRxBuffer, + USBBufferEventCallback, + (void *)&g_sTxBuffer, + g_pui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; + +//***************************************************************************** +// +// Receive buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pi8USBRxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8RxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sRxBuffer = +{ + false, // This is a receive buffer. + RxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device pointer. + USBDCDCPacketRead, // pfnTransfer + USBDCDCRxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pi8USBRxBuffer, // pi8Buffer + UART_BUFFER_SIZE, // ui32BufferSize + g_pui8RxBufferWorkspace // pvWorkspace +}; + +//***************************************************************************** +// +// Transmit buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pi8USBTxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8TxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sTxBuffer = +{ + true, // This is a transmit buffer. + TxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device pointer. + USBDCDCPacketWrite, // pfnTransfer + USBDCDCTxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pi8USBTxBuffer, // pi8Buffer + UART_BUFFER_SIZE, // ui32BufferSize + g_pui8TxBufferWorkspace // pvWorkspace +}; diff --git a/boards/dk-tm4c123g/usb_dev_serial/usb_serial_structs.h b/boards/dk-tm4c123g/usb_dev_serial/usb_serial_structs.h new file mode 100644 index 0000000..0555e90 --- /dev/null +++ b/boards/dk-tm4c123g/usb_dev_serial/usb_serial_structs.h @@ -0,0 +1,49 @@ +//***************************************************************************** +// +// usb_serial_structs.h - Data structures defining this USB CDC device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_SERIAL_STRUCTS_H_ +#define _USB_SERIAL_STRUCTS_H_ + +//***************************************************************************** +// +// The size of the transmit and receive buffers used for the redirected UART. +// This number should be a power of 2 for best performance. 256 is chosen +// pretty much at random though the buffer should be at least twice the size of +// a maxmum-sized USB packet. +// +//***************************************************************************** +#define UART_BUFFER_SIZE 256 + +extern uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +extern uint32_t TxHandler(void *pvi32CBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; +extern tUSBDCDCDevice g_sCDCDevice; +extern uint8_t g_pui8USBTxBuffer[]; +extern uint8_t g_pui8USBRxBuffer[]; + +#endif diff --git a/boards/dk-tm4c123g/usb_host_audio/Makefile b/boards/dk-tm4c123g/usb_host_audio/Makefile new file mode 100644 index 0000000..f1f2ae6 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/Makefile @@ -0,0 +1,100 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host audio example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party +IPATH+=../../../../utils + +# +# The default rule, which causes the USB host audio example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_audio.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host audio example. +# +${COMPILER}/usb_host_audio.axf: ${COMPILER}/buttons.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/ff.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/mmc-dk-tm4c123g.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/slidemenuwidget.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/usb_host_audio.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/usb_sound.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/wavfile.o +${COMPILER}/usb_host_audio.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_audio.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_audio.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_audio.axf: usb_host_audio.ld +SCATTERgcc_usb_host_audio=usb_host_audio.ld +ENTRY_usb_host_audio=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/usb_host_audio/ccs/.ccsimportspec b/boards/dk-tm4c123g/usb_host_audio/ccs/.ccsimportspec new file mode 100644 index 0000000..fbf85a1 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_audio/ccs/.ccsproject b/boards/dk-tm4c123g/usb_host_audio/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_audio/ccs/.cproject b/boards/dk-tm4c123g/usb_host_audio/ccs/.cproject new file mode 100644 index 0000000..4c91c21 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/ccs/.cproject @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_audio/ccs/.project b/boards/dk-tm4c123g/usb_host_audio/ccs/.project new file mode 100644 index 0000000..cee1b50 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/ccs/.project @@ -0,0 +1,90 @@ + + + usb_host_audio + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_audio/startup_ccs.c + + + usb_host_audio.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.c + + + usb_host_audio_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_audio/usb_host_audio_ccs.cmd + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + drivers/slidemenuwidget.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/slidemenuwidget.c + + + drivers/usb_sound.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/usb_sound.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + utils/wavfile.c + 1 + SW_ROOT/utils/wavfile.c + + + third_party/fatfs/port/mmc-dk-tm4c123g.c + 1 + SW_ROOT/third_party/fatfs/port/mmc-dk-tm4c123g.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/usb_host_audio/ccs/Debug/usb_host_audio.bin b/boards/dk-tm4c123g/usb_host_audio/ccs/Debug/usb_host_audio.bin new file mode 100644 index 0000000..a5ca953 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_audio/ccs/Debug/usb_host_audio.bin differ diff --git a/boards/dk-tm4c123g/usb_host_audio/ccs/Debug/usb_host_audio.out b/boards/dk-tm4c123g/usb_host_audio/ccs/Debug/usb_host_audio.out new file mode 100644 index 0000000..d730694 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_audio/ccs/Debug/usb_host_audio.out differ diff --git a/boards/dk-tm4c123g/usb_host_audio/ccs/macros.ini_initial b/boards/dk-tm4c123g/usb_host_audio/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/usb_host_audio/ccs/target_config.ccxml b/boards/dk-tm4c123g/usb_host_audio/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_audio/ewarm/Exe/usb_host_audio.bin b/boards/dk-tm4c123g/usb_host_audio/ewarm/Exe/usb_host_audio.bin new file mode 100644 index 0000000..b71bde8 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_audio/ewarm/Exe/usb_host_audio.bin differ diff --git a/boards/dk-tm4c123g/usb_host_audio/ewarm/Exe/usb_host_audio.out b/boards/dk-tm4c123g/usb_host_audio/ewarm/Exe/usb_host_audio.out new file mode 100644 index 0000000..d995beb Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_audio/ewarm/Exe/usb_host_audio.out differ diff --git a/boards/dk-tm4c123g/usb_host_audio/gcc/usb_host_audio.axf b/boards/dk-tm4c123g/usb_host_audio/gcc/usb_host_audio.axf new file mode 100644 index 0000000..03497fa Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_audio/gcc/usb_host_audio.axf differ diff --git a/boards/dk-tm4c123g/usb_host_audio/gcc/usb_host_audio.bin b/boards/dk-tm4c123g/usb_host_audio/gcc/usb_host_audio.bin new file mode 100644 index 0000000..0e8e4bf Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_audio/gcc/usb_host_audio.bin differ diff --git a/boards/dk-tm4c123g/usb_host_audio/readme.txt b/boards/dk-tm4c123g/usb_host_audio/readme.txt new file mode 100644 index 0000000..42cc956 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/readme.txt @@ -0,0 +1,32 @@ +USB host audio example application using SD Card FAT file system + + +This example application demonstrates playing .wav files from an SD card +that is formatted with a FAT file system using USB host audio class. The +application will only look in the root directory of the SD card and display +all files that are found. Files can be selected to show their format and +then played if the application determines that they are a valid .wav file. +Only PCM format (uncompressed) files may be played. + +For additional details about FatFs, see the following site: +http://elm-chan.org/fsw/ff/00index_e.html + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/usb_host_audio/rvmdk/usb_host_audio.axf b/boards/dk-tm4c123g/usb_host_audio/rvmdk/usb_host_audio.axf new file mode 100644 index 0000000..7a2249c Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_audio/rvmdk/usb_host_audio.axf differ diff --git a/boards/dk-tm4c123g/usb_host_audio/rvmdk/usb_host_audio.bin b/boards/dk-tm4c123g/usb_host_audio/rvmdk/usb_host_audio.bin new file mode 100644 index 0000000..37e5857 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_audio/rvmdk/usb_host_audio.bin differ diff --git a/boards/dk-tm4c123g/usb_host_audio/startup_ccs.c b/boards/dk-tm4c123g/usb_host_audio/startup_ccs.c new file mode 100644 index 0000000..1aeae03 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_audio/startup_ewarm.c b/boards/dk-tm4c123g/usb_host_audio/startup_ewarm.c new file mode 100644 index 0000000..a31efdb --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_audio/startup_gcc.c b/boards/dk-tm4c123g/usb_host_audio/startup_gcc.c new file mode 100644 index 0000000..aefc6b8 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_audio/startup_rvmdk.S b/boards/dk-tm4c123g/usb_host_audio/startup_rvmdk.S new file mode 100644 index 0000000..4dcb12d --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.c b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.c new file mode 100644 index 0000000..6bea38b --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.c @@ -0,0 +1,1987 @@ +//***************************************************************************** +// +// usb_host_audio.c - Main routine for the USB host audio example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_ints.h" +#include "driverlib/flash.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "driverlib/systick.h" +#include "driverlib/pin_map.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/slider.h" +#include "grlib/listbox.h" +#include "grlib/pushbutton.h" +#include "utils/ustdlib.h" +#include "third_party/fatfs/src/ff.h" +#include "third_party/fatfs/src/diskio.h" +#include "drivers/usb_sound.h" +#include "utils/wavfile.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" +#include "drivers/slidemenuwidget.h" +#include "usblib/usblib.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

USB host audio example application using SD Card FAT file system +//! (usb_host_audio)

+//! +//! This example application demonstrates playing .wav files from an SD card +//! that is formatted with a FAT file system using USB host audio class. The +//! application will only look in the root directory of the SD card and display +//! all files that are found. Files can be selected to show their format and +//! then played if the application determines that they are a valid .wav file. +//! Only PCM format (uncompressed) files may be played. +//! +//! For additional details about FatFs, see the following site: +//! http://elm-chan.org/fsw/ff/00index_e.html +// +//***************************************************************************** + +//***************************************************************************** +// +// Our running system tick counter and a global used to determine the time +// elapsed since last call to GetTickms(). +// +//***************************************************************************** +static uint32_t g_ui32SysTickCount; +static uint32_t g_ui32LastTick; +static uint32_t GetTickms(void); + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static DIR g_sDirObject; +static FILINFO g_sFileInfo; + +//***************************************************************************** +// +// A structure that holds a mapping between an FRESULT numerical code, +// and a string representation. FRESULT codes are returned from the FatFs +// FAT file system driver. +// +//***************************************************************************** +typedef struct +{ + FRESULT fresult; + char *pcResultStr; +} +tFresultString; + +//***************************************************************************** +// +// A macro to make it easy to add result codes to the table. +// +//***************************************************************************** +#define FRESULT_ENTRY(f) { (f), (#f) } + +//***************************************************************************** +// +// A table that holds a mapping between the numerical FRESULT code and +// it's name as a string. This is used for looking up error codes and +// providing a human-readable string. +// +//***************************************************************************** +tFresultString g_sFresultStrings[] = +{ + FRESULT_ENTRY(FR_OK), + FRESULT_ENTRY(FR_DISK_ERR), + FRESULT_ENTRY(FR_INT_ERR), + FRESULT_ENTRY(FR_NOT_READY), + FRESULT_ENTRY(FR_NO_FILE), + FRESULT_ENTRY(FR_NO_PATH), + FRESULT_ENTRY(FR_INVALID_NAME), + FRESULT_ENTRY(FR_DENIED), + FRESULT_ENTRY(FR_EXIST), + FRESULT_ENTRY(FR_INVALID_OBJECT), + FRESULT_ENTRY(FR_WRITE_PROTECTED), + FRESULT_ENTRY(FR_INVALID_DRIVE), + FRESULT_ENTRY(FR_NOT_ENABLED), + FRESULT_ENTRY(FR_NO_FILESYSTEM), + FRESULT_ENTRY(FR_MKFS_ABORTED), + FRESULT_ENTRY(FR_TIMEOUT), + FRESULT_ENTRY(FR_LOCKED), + FRESULT_ENTRY(FR_NOT_ENOUGH_CORE), + FRESULT_ENTRY(FR_TOO_MANY_OPEN_FILES), + FRESULT_ENTRY(FR_INVALID_PARAMETER), +}; + +//***************************************************************************** +// +// A macro that holds the number of result codes. +// +//***************************************************************************** +#define NUM_FRESULT_CODES (sizeof(g_sFresultStrings) / sizeof(tFresultString)) + +//***************************************************************************** +// +// Error reasons returned by ChangeToDirectory(). +// +//***************************************************************************** +#define NAME_TOO_LONG_ERROR 1 +#define OPENDIR_ERROR 2 + +//***************************************************************************** +// +// Define a pair of buffers that are used for holding path information. +// The buffer size must be large enough to hold the longest expected +// full path name, including the file name, and a trailing null character. +// The initial path is set to root "/". +// +//***************************************************************************** +#define PATH_BUF_SIZE 80 +static char g_pcCwdBuf[PATH_BUF_SIZE] = "/"; +static char g_pcTmpBuf[PATH_BUF_SIZE]; + +//***************************************************************************** +// +// A set of string pointers that are used for showing status on the display. +// Five lines of text are accommodated, which is the reasonable limit for +// this display. +// +//***************************************************************************** +static char *g_pcStatusLines[5]; + +//***************************************************************************** +// +// A variable to track the current level in the directory tree. The root +// level is level 0. +// +//***************************************************************************** +static uint32_t g_ui32Level; + +//***************************************************************************** +// +// A variable to track the current level in the directory tree. The root +// level is level 0. +// +//***************************************************************************** +static uint32_t g_ui32Level; + +//***************************************************************************** +// +// Declare a pair of off-screen buffers and associated display structures. +// These are used by the slide menu widget for animated menu effects. +// +//***************************************************************************** +#define OFFSCREEN_BUF_SIZE GrOffScreen4BPPSize(96, 40) +static uint8_t g_pui8OffscreenBufA[OFFSCREEN_BUF_SIZE]; +static uint8_t g_pui8OffscreenBufB[OFFSCREEN_BUF_SIZE]; +static tDisplay g_sOffscreenDisplayA; +static tDisplay g_sOffscreenDisplayB; + +//***************************************************************************** +// +// Create a palette that is used by the on-screen menus and anything else that +// uses the (above) off-screen buffers. This palette should contain any +// colors that are used by any widget using the offscreen buffers. There can +// be up to 16 colors in this palette. +// +//***************************************************************************** +static uint32_t g_pui32Palette[] = +{ + ClrBlack, + ClrWhite, + ClrDarkBlue, + ClrLightBlue, + ClrRed, + ClrDarkGreen, + ClrYellow, + ClrBlue +}; +#define NUM_PALETTE_ENTRIES (sizeof(g_pui32Palette) / sizeof(uint32_t)) + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / TICKS_PER_SECOND) + +//***************************************************************************** +// +// Audio buffering definitions, these are optimized to deal with USB audio. +// AUDIO_TRANSFER_SIZE define one frame of audio at 48000 Stereo 16 bit +// and AUDIO_BUFFERS declares 16 frames(16ms) of audio buffering. +// +//***************************************************************************** +#define AUDIO_TRANSFER_SIZE (192) +#define AUDIO_BUFFERS (16) +#define AUDIO_BUFFER_SIZE (AUDIO_TRANSFER_SIZE * AUDIO_BUFFERS) +uint32_t g_ui32TransferSize; +uint32_t g_ui32BufferSize; + +//***************************************************************************** +// +// The main audio buffer and it's pointers. +// +//***************************************************************************** +uint8_t g_pui8AudioBuffer[AUDIO_BUFFER_SIZE]; +uint8_t *g_pui8Read; +uint8_t *g_pui8Write; +uint32_t g_ui32ValidBytes; + +//***************************************************************************** +// +// Holds global flags for the system. +// +//***************************************************************************** +uint32_t g_ui32Flags = 0; + +// +// Currently streaming audio to the USB device. +// +#define FLAGS_PLAYING 1 + +// +// The last transfer has competed so a new one can be started. +// +#define FLAGS_TX_COMPLETE 2 + +// +// New audio device present. +// +#define FLAGS_DEVICE_CONNECT 3 + +// +// New audio device present. +// +#define FLAGS_DEVICE_READY 4 + +// +// Play Screen is being displayed +// +#define FLAGS_PLAY_SCREEN 5 + +//***************************************************************************** +// +// These are the global .wav file states used by the application. +// +//***************************************************************************** +tWavFile g_sWavFile; +tWavHeader g_sWavHeader; + +//***************************************************************************** +// +// Define the maximum number of files that can appear at any directory level. +// This is used for allocating space for holding the file information. +// Define the maximum depth of subdirectories, also used to allocating space +// for directory structures. +// Define the maximum number of characters allowed to be stored for a file +// name. +// +//***************************************************************************** +#define MAX_FILES_PER_MENU 64 +#define MAX_SUBDIR_DEPTH 32 +#define MAX_FILENAME_STRING_LEN 16 + +//***************************************************************************** +// +// Widget definitions +// +//***************************************************************************** + +//***************************************************************************** +// +// Declare a set of menu items and matching strings that are used to hold +// file information. There are two alternating sets. Two are needed because +// the file information must be retained for the current directory, and the +// new directory (up or down the tree). +// +//***************************************************************************** +static char g_pcFileNames[2][MAX_FILES_PER_MENU][MAX_FILENAME_STRING_LEN]; +static tSlideMenuItem g_psFileMenuItems[2][MAX_FILES_PER_MENU]; + +//***************************************************************************** +// +// Declare a set of menus, one for each level of directory. +// +//***************************************************************************** +static tSlideMenu g_psFileMenus[MAX_SUBDIR_DEPTH]; + +//***************************************************************************** +// +// Define the slide menu widget. This is the wigdet that is used for +// displaying the file information. +// +//***************************************************************************** +SlideMenu(g_sFileMenuWidget, WIDGET_ROOT, 0, 0, &g_sCFAL96x64x16, 0, 12, 96, 40, + &g_sOffscreenDisplayA, &g_sOffscreenDisplayB, 16, + ClrWhite, ClrRed, ClrBlack, &g_sFontFixed6x8, &g_psFileMenus[0], + 0); + +//***************************************************************************** +// +// The canvas widgets for the wav file information. +// +//***************************************************************************** +extern tCanvasWidget g_sWaveInfoBackground; + +char g_pcVolume[16] = ""; +Canvas(g_sWaveInfoVolume, &g_sWaveInfoBackground, 0, 0, + &g_sCFAL96x64x16, 0, 42, 96, 10, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE, ClrRed, ClrWhite, ClrWhite, g_psFontFixed6x8, + g_pcVolume, 0, 0); + +char g_pcTime[16] = ""; +Canvas(g_sWaveInfoTime, &g_sWaveInfoBackground, &g_sWaveInfoVolume, 0, + &g_sCFAL96x64x16, 0, 32, 96, 10, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE, ClrRed, ClrWhite, ClrWhite, g_psFontFixed6x8, + g_pcTime, 0, 0); + +char g_pcFormat[16] = ""; +Canvas(g_sWaveInfoSample, &g_sWaveInfoBackground, &g_sWaveInfoTime, 0, + &g_sCFAL96x64x16, 0, 22, 96, 10, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE, ClrRed, ClrWhite, ClrWhite, g_psFontFixed6x8, + g_pcFormat, 0, 0); + +char g_pcFileName[16] = ""; +Canvas(g_sWaveInfoFileName, &g_sWaveInfoBackground, &g_sWaveInfoSample, 0, + &g_sCFAL96x64x16, 0, 12, 96, 10, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE, + ClrRed, ClrWhite, ClrWhite, g_psFontFixed6x8, + g_pcFileName, 0, 0); + +#define INITIAL_VOLUME_PERCENT 20 +uint32_t g_ui32CurrentVolume; + +//***************************************************************************** +// +// The canvas widget acting as the background for the wav file information. +// +//***************************************************************************** +Canvas(g_sWaveInfoBackground, WIDGET_ROOT, 0, + &g_sWaveInfoFileName, &g_sCFAL96x64x16, 0, 12, 96, 40, + CANVAS_STYLE_OUTLINE | CANVAS_STYLE_FILL, ClrBlack, ClrWhite, ClrWhite, + g_psFontFixed6x8, 0, 0, 0); + +//***************************************************************************** +// +// The status line. +// +//***************************************************************************** +#define STATUS_TEXT_SIZE 40 +char g_pcStatusText[STATUS_TEXT_SIZE] = ""; +Canvas(g_sStatus, WIDGET_ROOT, 0, 0, + &g_sCFAL96x64x16, 0, 64 - 12, 96, 12, + (CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT), + ClrDarkBlue, ClrWhite, ClrWhite, g_psFontFixed6x8, g_pcStatusText, 0, 0); + +//***************************************************************************** +// +// The heading containing the application title. +// +//***************************************************************************** +Canvas(g_sHeading, WIDGET_ROOT, 0, 0, + &g_sCFAL96x64x16, 0, 0, 96, 12, + (CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT), + ClrDarkBlue, ClrWhite, ClrWhite, g_psFontFixed6x8, "usb-host-audio", 0, 0); + +//***************************************************************************** +// +// State information for keep track of time. +// +//***************************************************************************** +static uint32_t g_ui32BytesPlayed; +static uint32_t g_ui32NextUpdate; + +//***************************************************************************** +// +// Globals used to track play back position. +// +//***************************************************************************** +static uint16_t g_ui16Minutes; +static uint16_t g_ui16Seconds; + +//***************************************************************************** +// +// Fill the audio buffer with data from the open file. +// +//***************************************************************************** +void +FillAudioBuffer(void) +{ + uint32_t ui32Count, ui32Size; + uint8_t *pui8Read; + + // + // If already full return. + // + if(g_ui32ValidBytes == g_ui32BufferSize) + { + return; + } + + // + // Snap shot the read pointer since it might change while we are filling + // the buffer. If the read pointer moved due to an interrupt we will + // get the update on the next call to this function. + // + pui8Read = g_pui8Read; + + // + // If write is ahead of read then fill to the end of the buffer if + // possible. + // + if(pui8Read <= g_pui8Write) + { + // + // Calculate the amount of space we have. + // + ui32Size = g_ui32BufferSize - + (uint32_t)(g_pui8Write - g_pui8AudioBuffer); + ui32Count = WavRead(&g_sWavFile, g_pui8Write, ui32Size); + + g_pui8Write += ui32Count; + g_ui32ValidBytes += ui32Count; + + if(g_pui8Write == (g_pui8AudioBuffer + g_ui32BufferSize)) + { + g_pui8Write = g_pui8AudioBuffer; + } + } + + // + // If read is now ahead of write then fill to the read pointer. + // + if(pui8Read > g_pui8Write) + { + // + // Calculate the amount of space we have. + // + ui32Size = (uint32_t)(pui8Read - g_pui8Write); + ui32Count = WavRead(&g_sWavFile, g_pui8Write, ui32Size); + + g_pui8Write += ui32Count; + g_ui32ValidBytes += ui32Count; + } +} + +//***************************************************************************** +// +// This function handles the callback from the USB audio device when a buffer +// has been played or a new buffer has been received. +// +//***************************************************************************** +static void +USBAudioOutCallback(void *pvBuffer, uint32_t ui32Event) +{ + // + // If a buffer has been played then schedule a new one to play. + // + if((ui32Event == USB_EVENT_TX_COMPLETE) && + (HWREGBITW(&g_ui32Flags, FLAGS_PLAYING))) + { + // + // Indicate that a transfer was complete so that the non-interrupt + // code can read in more data from the file. + // + HWREGBITW(&g_ui32Flags, FLAGS_TX_COMPLETE) = 1; + + // + // Increment the read pointer. + // + g_pui8Read += g_ui32TransferSize; + + // + // Remove the specified number of bytes from the buffer. + // + if(g_ui32ValidBytes > g_ui32TransferSize) + { + g_ui32ValidBytes -= g_ui32TransferSize; + } + else + { + g_ui32ValidBytes = 0; + } + + // + // Wrap the read pointer if necessary. + // + if(g_pui8Read >= (g_pui8AudioBuffer + g_ui32BufferSize)) + { + g_pui8Read = g_pui8AudioBuffer; + } + + // + // Increment the number of bytes that have been played. + // + g_ui32BytesPlayed += g_ui32TransferSize; + + // + // Schedule a new USB audio buffer to be transmitted to the USB + // audio device. + // + USBSoundBufferOut(g_pui8Read, g_ui32TransferSize, USBAudioOutCallback); + } +} + +//***************************************************************************** +// +// This function is used to update the current volume being using for play +// back. +// +//***************************************************************************** +static void +DisplayVolume(void) +{ + // + // Print the volume string in the format Volume dd% + // + usprintf(g_pcVolume, "Volume %0d%%", g_ui32CurrentVolume); + + // + // Display the updated time on the screen. + // + WidgetPaint((tWidget *)&g_sWaveInfoVolume); +} + +//***************************************************************************** +// +// This function is used to tell when to update the play back times for a file. +// It will only update the screen at 1 second intervals but can be called more +// often with no result. +// +//***************************************************************************** +static void +DisplayTime(uint32_t ui32ForceUpdate) +{ + uint32_t ui32Seconds; + uint32_t ui32Minutes; + + // + // Only display on the screen once per second. + // + if((g_ui32BytesPlayed >= g_ui32NextUpdate) || (ui32ForceUpdate != 0)) + { + // + // Set the next update time to one second later. + // + g_ui32NextUpdate = g_ui32BytesPlayed + g_sWavHeader.ui32AvgByteRate; + + // + // Calculate the integer number of minutes and seconds. + // + ui32Seconds = g_ui32BytesPlayed / g_sWavHeader.ui32AvgByteRate; + ui32Minutes = ui32Seconds / 60; + ui32Seconds -= ui32Minutes * 60; + + // + // Print the time string in the format mm.ss/mm.ss + // + usprintf(g_pcTime, "%2d:%02d/%d:%02d", ui32Minutes,ui32Seconds, + g_ui16Minutes, g_ui16Seconds); + + // + // Display the updated time on the screen. + // + WidgetPaint((tWidget *)&g_sWaveInfoTime); + } +} + +//***************************************************************************** +// +// This function will handle stopping the play back of audio. It will not do +// this immediately but will defer stopping audio at a later time. This allows +// this function to be called from an interrupt handler. +// +//***************************************************************************** +static void +WaveStop(void) +{ + uint32_t ui32Idx; + uint32_t *pui32Buffer; + + // + // Stop playing audio. + // + HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) = 0; + + // + // Do unsigned long accesses to clear out the buffer. + // + pui32Buffer = (uint32_t *)g_pui8AudioBuffer; + + // + // Zero out the buffer. + // + for(ui32Idx = 0; ui32Idx < (AUDIO_BUFFER_SIZE >> 2); ui32Idx++) + { + pui32Buffer[ui32Idx] = 0; + } + + // + // Reset the number of bytes played and for a time update on the screen. + // + g_ui32BytesPlayed = 0; + DisplayTime(1); + + // + // Change the status text on the button to Stopped. + // + strcpy(g_pcStatusText, "Stopped"); + WidgetPaint((tWidget *)&g_sStatus); +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. FatFs requires a +// timer tick every 10ms for internal timing purposes. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Increment the system tick count. + // + g_ui32SysTickCount++; + + // + // Call the FatFs tick timer. + // + disk_timerproc(); +} + +//***************************************************************************** +// +// This function returns the number of ticks since the last time this function +// was called. +// +//***************************************************************************** +static uint32_t +GetTickms(void) +{ + uint32_t ui32RetVal; + uint32_t ui32Saved; + + ui32RetVal = g_ui32SysTickCount; + ui32Saved = ui32RetVal; + + if(ui32Saved > g_ui32LastTick) + { + ui32RetVal = ui32Saved - g_ui32LastTick; + } + else + { + ui32RetVal = g_ui32LastTick - ui32Saved; + } + + // + // This could miss a few milliseconds but the timings here are on a + // much larger scale. + // + g_ui32LastTick = ui32Saved; + + // + // Return the number of milliseconds since the last time this was called. + // + return(ui32RetVal * MS_PER_SYSTICK); +} + +//***************************************************************************** +// +// This function returns a string representation of an error code +// that was returned from a function call to FatFs. It can be used +// for printing human readable error messages. +// +//***************************************************************************** +static const char * +StringFromFresult(FRESULT fresult) +{ + uint32_t ui32Idx; + + // + // Enter a loop to search the error code table for a matching + // error code. + // + for(ui32Idx = 0; ui32Idx < NUM_FRESULT_CODES; ui32Idx++) + { + // + // If a match is found, then return the string name of the + // error code. + // + if(g_sFresultStrings[ui32Idx].fresult == fresult) + { + return(g_sFresultStrings[ui32Idx].pcResultStr); + } + } + + // + // At this point no matching code was found, so return a + // string indicating unknown error. + // + return("UNKNOWN ERR"); +} + +//***************************************************************************** +// +// This function shows a status screen. It draws a banner at the top of the +// screen with the name of the application, and then up to 5 lines of text +// in the remaining screen area. The caller specifies a pointer to a set of +// strings, and the count of number of lines of text (up to 5). This +// function attempts to vertically center the strings on the display. +// +//***************************************************************************** +static void +ShowStatusScreen(char *pcStatus[], uint32_t ui32Count) +{ + tContext sContext; + tRectangle sRect; + uint32_t ui32Idx; + int32_t i32Y; + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the rest of the display with black, to clear whatever was there + // before. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMin = 12; + sRect.i16YMax = 63 - 12; + GrContextForegroundSet(&sContext, ClrBlack); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Cap the max number of status lines to 4 + // + ui32Count = (ui32Count > 4) ? 4 : ui32Count; + + // + // Compute the starting Y coordinate based on the number of lines. + // + i32Y = 36 - (ui32Count * 5); + + // + // Display the status lines + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + for(ui32Idx = 0; ui32Idx < ui32Count; ui32Idx++) + { + GrStringDrawCentered(&sContext, pcStatus[ui32Idx], -1, + GrContextDpyWidthGet(&sContext) / 2, i32Y, 0); + i32Y += 10; + } +} + +//***************************************************************************** +// +// Initializes the file system module. +// +// \param None. +// +// This function initializes the third party FAT implementation. +// +// \return Returns \e true on success or \e false on failure. +// +//***************************************************************************** +static bool +FileInit(void) +{ + // + // Mount the file system, using logical disk 0. + // + if(f_mount(0, &g_sFatFs) != FR_OK) + { + return(false); + } + return(true); +} + +//***************************************************************************** +// +// This function handled global level events for the USB host audio. This +// function was passed into the USBSoundInit() function. +// +//***************************************************************************** +static void +AudioEvent(uint32_t ui32Event, uint32_t ui32Param) +{ + switch(ui32Event) + { + case SOUND_EVENT_READY: + { + // + // Flag that a new audio device is present. + // + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 1; + + // + // Change the text to reflect the change. + // + strcpy(g_pcStatusText, "Ready"); + WidgetPaint((tWidget *)&g_sStatus); + + break; + } + case SOUND_EVENT_DISCONNECT: + { + // + // Device is no longer present. + // + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_READY) = 0; + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 0; + HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) = 0; + HWREGBITW(&g_ui32Flags, FLAGS_PLAY_SCREEN) = 0; + + // + // Change the text to reflect the change. + // + strcpy(g_pcStatusText, "No Device"); + WidgetPaint((tWidget *)&g_sStatus); + + // + // Display the SD card found message again. This + // should replace the slide menu. + // + g_pcStatusLines[0] = "SD Card Found"; + ShowStatusScreen(g_pcStatusLines, 1); + + break; + } + case SOUND_EVENT_UNKNOWN_DEV: + { + if(ui32Param == 1) + { + // + // Unknown device connected. + // + strcpy(g_pcStatusText, "Unknown Device"); + WidgetPaint((tWidget *)&g_sStatus); + } + else + { + // + // Unknown device disconnected. + // + strcpy(g_pcStatusText, "No Device"); + WidgetPaint((tWidget *)&g_sStatus); + } + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} + +#endif + +//***************************************************************************** +// +// This function is called to read the contents of the current directory from +// the USB stick and populate a set of menu items, one for each file in the +// directory. A subdirectory within the directory counts as a file item. +// +// This function returns the number of file items that were found, or 0 if +// there is any error detected. +// +//***************************************************************************** +static uint32_t +PopulateFileList(uint32_t ui32Level) +{ + uint32_t ui32ItemCount; + FRESULT fresult; + + // + // Open the current directory for access. + // + fresult = f_opendir(&g_sDirObject, g_pcCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(fresult != FR_OK) + { + // + // Ensure that the error is reported. + // + g_pcStatusLines[0] = "Error from"; + g_pcStatusLines[1] = "SD Card"; + g_pcStatusLines[2] = (char *)StringFromFresult(fresult); + ShowStatusScreen(g_pcStatusLines, 3); + return(0); + } + + // + // Initialize the count of files in this directory + // + ui32ItemCount = 0; + + // + // Enter loop to enumerate through all directory entries. + // + for(;;) + { + // + // Read an entry from the directory. + // + fresult = f_readdir(&g_sDirObject, &g_sFileInfo); + + // + // Check for error and return if there is a problem. + // + if(fresult != FR_OK) + { + g_pcStatusLines[0] = "Error from"; + g_pcStatusLines[1] = "USB disk"; + g_pcStatusLines[2] = (char *)StringFromFresult(fresult); + ShowStatusScreen(g_pcStatusLines, 3); + return(0); + } + + // + // If the file name is blank, then this is the end of the + // listing. + // + if(!g_sFileInfo.fname[0]) + { + break; + } + + // + // Add the information to a menu item + // + if(ui32ItemCount < MAX_FILES_PER_MENU) + { + tSlideMenuItem *psMenuItem; + + // + // Get a pointer to the current menu item. Use the directory + // level to determine which of the two sets of menu items to use. + // (ui32Level & 1]. This lets us alternate between the current + // set of menu items and the new set (up or down the tree). + // + psMenuItem = &g_psFileMenuItems[ui32Level & 1][ui32ItemCount]; + + // + // Add the file name to the menu item + // + usnprintf(g_pcFileNames[ui32Level & 1][ui32ItemCount], + MAX_FILENAME_STRING_LEN, "%s", g_sFileInfo.fname); + psMenuItem->pcText = g_pcFileNames[ui32Level & 1][ui32ItemCount]; + + // + // If this is a directory, then add the next level menu so that + // when displayed it will be showed with a submenu option + // (next level down in directory tree). Otherwise it is a file + // so clear the child menu so that there is no submenu option + // shown. + // + psMenuItem->psChildMenu = (g_sFileInfo.fattrib & AM_DIR) ? + &g_psFileMenus[ui32Level + 1] : 0; + + // + // Move to the next entry in the item array we use to populate the + // list box. + // + ui32ItemCount++; + } + } + + // + // Made it to here, return the count of files that were populated. + // + return(ui32ItemCount); +} + +//***************************************************************************** +// +// This function is used to change to a new directory in the file system. +// It takes a parameter that specifies the directory to make the current +// working directory. +// Path separators must use a forward slash "/". The directory parameter +// can be one of the following: +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so dont try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory +// to make sure it exists. If the new path is opened successfully, then +// the current working directory (cwd) is changed to the new path. +// +// In cases of error, the pui32Reason parameter will be written with one of +// the following values: +// +// NAME_TOO_LONG_ERROR - combination of paths are too long for the buffer +// OPENDIR_ERROR - there is some problem opening the new directory +// +//***************************************************************************** +static FRESULT +ChangeToDirectory(char *pcDirectory, uint32_t *pui32Reason) +{ + uint32_t ui32Idx; + FRESULT fresult; + + // + // Copy the current working path into a temporary buffer so + // it can be manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If the first character is /, then this is a fully specified + // path, and it should just be used as-is. + // + if(pcDirectory[0] == '/') + { + // + // Make sure the new path is not bigger than the cwd buffer. + // + if(strlen(pcDirectory) + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_OK); + } + + // + // If the new path name (in argv[1]) is not too long, then + // copy it into the temporary buffer so it can be checked. + // + else + { + strncpy(g_pcTmpBuf, pcDirectory, sizeof(g_pcTmpBuf)); + } + } + + // + // If the argument is .. then attempt to remove the lowest level + // on the CWD. + // + else if(!strcmp(pcDirectory, "..")) + { + // + // Get the index to the last character in the current path. + // + ui32Idx = strlen(g_pcTmpBuf) - 1; + + // + // Back up from the end of the path name until a separator (/) + // is found, or until we bump up to the start of the path. + // + while((g_pcTmpBuf[ui32Idx] != '/') && (ui32Idx > 1)) + { + // + // Back up one character. + // + ui32Idx--; + } + + // + // Now we are either at the lowest level separator in the + // current path, or at the beginning of the string (root). + // So set the new end of string here, effectively removing + // that last part of the path. + // + g_pcTmpBuf[ui32Idx] = 0; + } + + // + // Otherwise this is just a normal path name from the current + // directory, and it needs to be appended to the current path. + // + else + { + // + // Test to make sure that when the new additional path is + // added on to the current path, there is room in the buffer + // for the full new path. It needs to include a new separator, + // and a trailing null character. + // + if(strlen(g_pcTmpBuf) + strlen(pcDirectory) + 1 + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_INVALID_OBJECT); + } + + // + // The new path is okay, so add the separator and then append + // the new directory to the path. + // + else + { + // + // If not already at the root level, then append a / + // + if(strcmp(g_pcTmpBuf, "/")) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Append the new directory to the path. + // + strcat(g_pcTmpBuf, pcDirectory); + } + } + + // + // At this point, a candidate new directory path is in g_pcTmpBuf. + // Try to open it to make sure it is valid. + // + fresult = f_opendir(&g_sDirObject, g_pcTmpBuf); + + // + // If it can't be opened, then it is a bad path. Return an error. + // + if(fresult != FR_OK) + { + *pui32Reason = OPENDIR_ERROR; + return(fresult); + } + + // + // Otherwise, it is a valid new path, so copy it into the CWD. + // + else + { + strncpy(g_pcCwdBuf, g_pcTmpBuf, sizeof(g_pcCwdBuf)); + } + + // + // Return success. + // + return(FR_OK); +} + +//***************************************************************************** +// +// Sends a button/key press message to the slide menu widget that is showing +// files. +// +//***************************************************************************** +static void +SendWidgetKeyMessage(uint32_t ui32Msg) +{ + WidgetMessageQueueAdd(WIDGET_ROOT, + ui32Msg, (uint32_t)&g_sFileMenuWidget, 0, 1, 1); +} + +//***************************************************************************** +// +// This function performs actions that are common whenever the directory +// level is changed up or down. It populates the correct menu structure with +// the list of files in the directory. +// +//***************************************************************************** +static bool +ProcessDirChange(char *pcDir, uint32_t ui32Level) +{ + FRESULT fresult; + uint32_t ui32Reason; + uint32_t ui32FileCount; + + // + // Attempt to change to the new directory. + // + fresult = ChangeToDirectory(pcDir, &ui32Reason); + + // + // If the directory change was successful, populate the + // list of files for the new subdirectory. + // + if((fresult == FR_OK) && (ui32Level < MAX_SUBDIR_DEPTH)) + { + // + // Get a pointer to the current menu for this CWD. + // + tSlideMenu *psMenu = &g_psFileMenus[ui32Level]; + + // + // Populate the menu items with the file list for the new CWD. + // + ui32FileCount = PopulateFileList(ui32Level); + + // + // Initialize the file menu with the list of menu items, + // which are just files and dirs in the root directory + // + psMenu->psSlideMenuItems = g_psFileMenuItems[ui32Level & 1]; + psMenu->ui32Items = ui32FileCount; + + // + // Set the parent directory, if there is one. If at level 0 + // (CWD is root), then there is no parent directory. + // + if(ui32Level) + { + psMenu->psParent = &g_psFileMenus[ui32Level - 1]; + } + else + { + psMenu->psParent = 0; + } + + // + // If we are descending into a new subdir, then initialize the other + // menu item fields to default values. + // + if(ui32Level > g_ui32Level) + { + psMenu->ui32CenterIndex = 0; + psMenu->ui32FocusIndex = 0; + psMenu->bMultiSelectable = 0; + } + + // + // Return a success indication + // + return(true); + } + + // + // Directory change was not successful + // + else + { + // + // Return failure indication + // + return(false); + } +} + +//***************************************************************************** +// +// The program main function. It performs initialization, then handles wav +// file playback. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Temp; + uint32_t ui32Retcode; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(SysCtlClockGet() / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the buttons driver. + // + ButtonsInit(); + + // + // Initialize two offscreen displays and assign the palette. These + // buffers are used by the slide menu widget to allow animation effects. + // + GrOffScreen4BPPInit(&g_sOffscreenDisplayA, g_pui8OffscreenBufA, 96, 40); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayA, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + GrOffScreen4BPPInit(&g_sOffscreenDisplayB, g_pui8OffscreenBufB, 96, 40); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayB, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sHeading); + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sStatus); + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sFileMenuWidget); + + // + // Initialize the status text. + // + strcpy(g_pcStatusText, "No Device"); + + // + // Issue the initial paint request to the widgets then immediately call + // the widget manager to process the paint message. This ensures that the + // display is drawn as quickly as possible and saves the delay we would + // otherwise experience if we processed the paint message after mounting + // and reading the SD card. + // + WidgetPaint(WIDGET_ROOT); + WidgetMessageQueueProcess(); + + // + // Determine whether or not an SD Card is installed. If not, print a + // warning and have the user install one and restart. + // + ui32Retcode = disk_initialize(0); + + if(ui32Retcode != RES_OK) + { + g_pcStatusLines[0] = "No SD Card Found"; + g_pcStatusLines[1] = "Please insert"; + g_pcStatusLines[2] = "a card and"; + g_pcStatusLines[3] = "reset the board."; + ShowStatusScreen(g_pcStatusLines, 4); + return (1); + } + else + { + g_pcStatusLines[0] = "SD Card Found"; + ShowStatusScreen(g_pcStatusLines, 1); + + // + // Mount the file system, using logical disk 0. + // + f_mount(0, &g_sFatFs); + if(!FileInit()) + { + return(1); + } + } + + // + // Not playing anything right now. + // + g_ui32Flags = 0; + g_ui32SysTickCount = 0; + g_ui32LastTick = 0; + g_ui32CurrentVolume = INITIAL_VOLUME_PERCENT; + + // + // Configure the USB host output. + // + USBSoundInit(0, AudioEvent); + + // + // Enter an (almost) infinite loop for reading and processing commands from + // the user. + // + while(1) + { + uint32_t ui32LastTickCount = 0; + + // + // On connect change the device state to ready. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT)) + { + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 0; + + // + // Getting here means the device is ready. + // Reset the CWD to the root directory. + // + g_pcCwdBuf[0] = '/'; + g_pcCwdBuf[1] = 0; + + // + // Set the initial directory level to the root + // + g_ui32Level = 0; + + // + // We need to reset the indexes of the root menu to 0, so that + // it will start at the top of the file list, and reset the + // slide menu widget to start with the root menu. + // + g_psFileMenus[g_ui32Level].ui32CenterIndex = 0; + g_psFileMenus[g_ui32Level].ui32FocusIndex = 0; + SlideMenuMenuSet(&g_sFileMenuWidget, &g_psFileMenus[g_ui32Level]); + + // + // Initiate a directory change to the root. This will + // populate a menu structure representing the root directory. + // + if(ProcessDirChange("/", g_ui32Level)) + { + // + // Request a repaint so the file menu will be shown + // + WidgetPaint(WIDGET_ROOT); + } + else + { + g_pcStatusLines[0] = "ERROR"; + g_pcStatusLines[1] = "Unable to change"; + g_pcStatusLines[2] = "directory."; + ShowStatusScreen(g_pcStatusLines, 3); + return(1); + } + + // + // Attempt to set the audio format to 44100 16 bit stereo by + // default otherwise try 48000 16 bit stereo. + // + if(USBSoundOutputFormatSet(44100, 16, 2) == 0) + { + ui32Temp = 44100; + } + else if(USBSoundOutputFormatSet(48000, 16, 2) == 0) + { + ui32Temp = 48000; + } + else + { + ui32Temp = 0; + } + + // + // If the audio device was support put the sample rate in the + // status line. + // + if(ui32Temp != 0) + { + // + // Calculate the number of bytes per USB frame. + // + g_ui32TransferSize = (ui32Temp * 4) / 1000; + + // + // Calculate the size of the audio buffer. + // + g_ui32BufferSize = AUDIO_BUFFERS * g_ui32TransferSize; + + // + // Print the time string in the format mm.ss/mm.ss + // + + if(ui32Temp == 44100) + { + usprintf(g_pcStatusText, "44.1 kHz Ready"); + } + else if(ui32Temp == 48000) + { + usprintf(g_pcStatusText, "48 kHz Ready"); + } + + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_READY) = 1; + } + else + { + strcpy(g_pcStatusText, "Not Supported"); + return (1); + } + + // + // Set initial volume. + // + USBSoundVolumeSet(g_ui32CurrentVolume); + + // + // Update the status line. + // + WidgetPaint((tWidget *)&g_sStatus); + } + + // + // Process occurrence of timer tick. Check for user input + // once each tick. + // + if((g_ui32SysTickCount != ui32LastTickCount) && + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_READY) && + (HWREGBITW(&g_ui32Flags, FLAGS_PLAY_SCREEN) == 0)) + { + uint8_t ui8ButtonState; + uint8_t ui8ButtonChanged; + + ui32LastTickCount = g_ui32SysTickCount; + + // + // Get the current debounced state of the buttons. + // + ui8ButtonState = ButtonsPoll(&ui8ButtonChanged, 0); + + // + // If select button or right button is pressed, then we + // are trying to descend into another directory + // + if(BUTTON_PRESSED(SELECT_BUTTON, + ui8ButtonState, ui8ButtonChanged) || + BUTTON_PRESSED(RIGHT_BUTTON, + ui8ButtonState, ui8ButtonChanged)) + { + uint32_t ui32NewLevel; + uint32_t ui32ItemIdx; + char *pcItemName; + + // + // Get a pointer to the current menu for this CWD. + // + tSlideMenu *psMenu = &g_psFileMenus[g_ui32Level]; + + // + // Get the highlighted index in the current file list. + // This is the currently highlighted file or dir + // on the display. Then get the name of the file at + // this index. + // + ui32ItemIdx = SlideMenuFocusItemGet(psMenu); + pcItemName = psMenu->psSlideMenuItems[ui32ItemIdx].pcText; + + // + // Make sure we are not yet past the maximum tree + // depth. + // + if(g_ui32Level < MAX_SUBDIR_DEPTH) + { + // + // Potential new level is one greater than the + // current level. + // + ui32NewLevel = g_ui32Level + 1; + + // + // Process the directory change to the new + // directory. This function will populate a menu + // structure with the files and subdirs in the new + // directory. + // + if(ProcessDirChange(pcItemName, ui32NewLevel)) + { + // + // If the change was successful, then update + // the level. + // + g_ui32Level = ui32NewLevel; + + // + // Now that all the prep is done, send the + // KEY_RIGHT message to the widget and it will + // "slide" from the previous file list to the + // new file list of the CWD. + // + SendWidgetKeyMessage(WIDGET_MSG_KEY_RIGHT); + + } + + // + // We have selected a file to play. Display + // the file information and if it is a valid + // wav file, allow playback. + // + else + { + + // + // Update the file name information. + // + strncpy(g_pcFileName, pcItemName, 16); + + if(WavOpen(g_pcFileName, &g_sWavFile) == 0) + { + // + // Read the .wav file format. + // + WavGetFormat(&g_sWavFile, &g_sWavHeader); + + // + // Print the formatted string so that it can be + // displayed. + // + usprintf(g_pcFormat, "%d Hz %d bit ", + g_sWavHeader.ui32SampleRate / 1000, + g_sWavHeader.ui16BitsPerSample); + + // + // Concatenate the number of channels. + // + if(g_sWavHeader.ui16NumChannels == 1) + { + strcat(g_pcFormat, "Mo"); + } + else + { + strcat(g_pcFormat, "St"); + } + + // + // Calculate the minutes and seconds in the file. + // + g_ui16Seconds = g_sWavHeader.ui32DataSize / + g_sWavHeader.ui32AvgByteRate; + g_ui16Minutes = g_ui16Seconds / 60; + g_ui16Seconds -= g_ui16Minutes * 60; + + // + // Close the file, it will be re-opened on play. + // + WavClose(&g_sWavFile); + + // + // Update the file time information. + // + DisplayTime(1); + + // + // Update the volume information + // + DisplayVolume(); + } + else + { + // + // Set the time and volume strings to null strings. + // + g_pcTime[0] = 0; + g_pcVolume[0] = 0; + + // + // Print message about invalid wav format + // + usprintf(g_pcFormat, "Invalid Wav"); + } + + // + // Update the file name line. + // + WidgetPaint((tWidget *)&g_sWaveInfoBackground); + + // + // Set a flag to change the button functions. + // + HWREGBITW(&g_ui32Flags, FLAGS_PLAY_SCREEN) = 1; + } + } + } + + // + // If the UP button is pressed, just pass it to the widget + // which will handle scrolling the list of files. + // + if(BUTTON_PRESSED(UP_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_UP); + } + + // + // If the DOWN button is pressed, just pass it to the widget + // which will handle scrolling the list of files. + // + if(BUTTON_PRESSED(DOWN_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_DOWN); + } + + // + // If the LEFT button is pressed, then we are attempting + // to go up a level in the file system. + // + if(BUTTON_PRESSED(LEFT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + uint32_t ui32NewLevel; + + // + // Make sure we are not already at the top of the + // directory tree (at root). + // + if(g_ui32Level) + { + // + // Potential new level is one less than the + // current level. + // + ui32NewLevel = g_ui32Level - 1; + + // + // Process the directory change to the new + // directory. This function will populate a menu + // structure with the files and subdirs in the new + // directory. + // + if(ProcessDirChange("..", ui32NewLevel)) + { + // + // If the change was successful, then update + // the level. + // + g_ui32Level = ui32NewLevel; + + // + // Now that all the prep is done, send the + // KEY_LEFT message to the widget and it will + // "slide" from the previous file list to the + // new file list of the CWD. + // + SendWidgetKeyMessage(WIDGET_MSG_KEY_LEFT); + } + } + } + } + + // + // If we are in the play back screen, change the function of the + // buttons. + // + if((g_ui32SysTickCount != ui32LastTickCount) && + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_READY) && + (HWREGBITW(&g_ui32Flags, FLAGS_PLAY_SCREEN))) + { + uint8_t ui8ButtonState; + uint8_t ui8ButtonChanged; + + ui32LastTickCount = g_ui32SysTickCount; + + // + // Get the current debounced state of the buttons. + // + ui8ButtonState = ButtonsPoll(&ui8ButtonChanged, 0); + + // + // If the left button is pressed, we need to return to + // the file menu. + // + if(BUTTON_PRESSED(LEFT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + // + // It is possible we have already started playback. + // + WaveStop(); + + // + // Redraw the menu over the play screen. + // + HWREGBITW(&g_ui32Flags, FLAGS_PLAY_SCREEN) = 0; + WidgetPaint(WIDGET_ROOT); + } + + // + // If the select or right button is pressed, we will + // start play back of the wav file. + // + if(BUTTON_PRESSED(SELECT_BUTTON, + ui8ButtonState, ui8ButtonChanged) || + BUTTON_PRESSED(RIGHT_BUTTON, + ui8ButtonState, ui8ButtonChanged)) + { + // + // If we are stopped, then start playing. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) == 0) + { + HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) = 1; + // + // Don't play anything but 16 bit audio since most USB + // devices do not support 8 bit formats. + // + if(g_sWavHeader.ui16BitsPerSample != 16) + { + return(1); + } + + // + // See if this is a valid .wav file that can be opened. + // + if(WavOpen(g_pcFileName, &g_sWavFile) == 0) + { + // + // Change the text on the button to playing. + // + strcpy(g_pcStatusText, "Playing"); + WidgetPaint((tWidget *)&g_sStatus); + + // + // Indicate that wave play back should start. + // + HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) = 1; + } + else + { + HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) = 0; + return(1); + } + + // + // Initialize the read and write pointers. + // + g_pui8Read = g_pui8AudioBuffer; + g_pui8Write = g_pui8AudioBuffer; + g_ui32ValidBytes = 0; + + // + // Fill the audio buffer from the file. + // + FillAudioBuffer(); + + // + // Start the audio playback. + // + USBSoundBufferOut(g_pui8Read, g_ui32TransferSize, + USBAudioOutCallback); + } + + // + // Stop play back if we are playing. + // + else + { + WaveStop(); + } + } + + // + // If the UP button is pressed, increase the volume by 5%. + // + if(BUTTON_PRESSED(UP_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + if(g_ui32CurrentVolume < 100) + { + g_ui32CurrentVolume += 5; + USBSoundVolumeSet(g_ui32CurrentVolume); + DisplayVolume(); + } + } + + // + // If the DOWN button is pressed, decrease the volume by 5%. + // + if(BUTTON_PRESSED(DOWN_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + if((g_ui32CurrentVolume <= 100) && (g_ui32CurrentVolume > 0)) + { + g_ui32CurrentVolume -= 5; + USBSoundVolumeSet(g_ui32CurrentVolume); + DisplayVolume(); + } + } + } + + // + // Handle the case when the wave file is playing. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_PLAYING)) + { + // + // Handle the transmit complete event. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_TX_COMPLETE)) + { + // + // Clear the transmit complete flag. + // + HWREGBITW(&g_ui32Flags, FLAGS_TX_COMPLETE) = 0; + + // + // If there is space available then fill the buffer. + // + FillAudioBuffer(); + + // + // If we run out of valid bytes then stop the playback. + // + if(g_ui32ValidBytes == 0) + { + // + // No more data or error so stop playing. + // + WaveStop(); + } + + // + // Update the real display time. + // + DisplayTime(0); + } + } + + // + // Need to periodically call the USBMain() routine so that + // non-interrupt gets a chance to run. + // + USBMain(GetTickms()); + + // + // Process any messages in the widget message queue. + // + WidgetMessageQueueProcess(); + } +} + diff --git a/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ewd b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ewp b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ewp new file mode 100644 index 0000000..64a8486 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ewp @@ -0,0 +1,820 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c123g.c + + + $PROJ_DIR$\..\drivers\slidemenuwidget.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_host_audio.c + + + $PROJ_DIR$\..\drivers\usb_sound.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + $PROJ_DIR$\..\..\..\..\utils\wavfile.c + + + diff --git a/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.icf b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.icf new file mode 100644 index 0000000..e8d2975 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_audio.icf - Linker configuration file for usb_host_audio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ld b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ld new file mode 100644 index 0000000..8a232b8 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_audio.ld - Linker configuration file for usb_host_audio. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.sct b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.sct new file mode 100644 index 0000000..f269374 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_audio.sct - Linker configuration file for usb_host_audio. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.uvopt b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.uvopt new file mode 100644 index 0000000..1f33e01 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.uvopt @@ -0,0 +1,429 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_audio + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c123g.c + mmc-dk-tm4c123g.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\slidemenuwidget.c + slidemenuwidget.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_audio.c + usb_host_audio.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\usb_sound.c + usb_sound.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\wavfile.c + wavfile.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 12 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 14 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.uvproj b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.uvproj new file mode 100644 index 0000000..e716597 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio.uvproj @@ -0,0 +1,474 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + usb_host_audio + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_audio + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_audio.bin .\rvmdk\usb_host_audio.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..;..\..\..\..\third_party;..\..\..\..\utils; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_audio.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + mmc-dk-tm4c123g.c + 1 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c123g.c + + + slidemenuwidget.c + 1 + ..\drivers\slidemenuwidget.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_host_audio.c + 1 + .\usb_host_audio.c + + + usb_sound.c + 1 + ..\drivers\usb_sound.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + wavfile.c + 1 + ..\..\..\..\utils\wavfile.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/usb_host_audio/usb_host_audio_ccs.cmd b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio_ccs.cmd new file mode 100644 index 0000000..2c518a4 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_audio/usb_host_audio_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_audio_ccs.cmd - CCS linker configuration file for usb_host_audio. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/dk-tm4c123g/usb_host_keyboard/Makefile b/boards/dk-tm4c123g/usb_host_keyboard/Makefile new file mode 100644 index 0000000..e443e29 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/Makefile @@ -0,0 +1,90 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host keyboard example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB host keyboard example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_keyboard.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host keyboard example. +# +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/usb_host_keyboard.o +${COMPILER}/usb_host_keyboard.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_keyboard.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_keyboard.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_keyboard.axf: usb_host_keyboard.ld +SCATTERgcc_usb_host_keyboard=usb_host_keyboard.ld +ENTRY_usb_host_keyboard=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/usb_host_keyboard/ccs/.ccsimportspec b/boards/dk-tm4c123g/usb_host_keyboard/ccs/.ccsimportspec new file mode 100644 index 0000000..daa301e --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_keyboard/ccs/.ccsproject b/boards/dk-tm4c123g/usb_host_keyboard/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_keyboard/ccs/.cproject b/boards/dk-tm4c123g/usb_host_keyboard/ccs/.cproject new file mode 100644 index 0000000..c0ac44e --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/ccs/.cproject @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_keyboard/ccs/.project b/boards/dk-tm4c123g/usb_host_keyboard/ccs/.project new file mode 100644 index 0000000..9534e4d --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/ccs/.project @@ -0,0 +1,60 @@ + + + usb_host_keyboard + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_keyboard/startup_ccs.c + + + usb_host_keyboard.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.c + + + usb_host_keyboard_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin b/boards/dk-tm4c123g/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin new file mode 100644 index 0000000..d369fd1 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin differ diff --git a/boards/dk-tm4c123g/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out b/boards/dk-tm4c123g/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out new file mode 100644 index 0000000..727307e Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out differ diff --git a/boards/dk-tm4c123g/usb_host_keyboard/ccs/macros.ini_initial b/boards/dk-tm4c123g/usb_host_keyboard/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/usb_host_keyboard/ccs/target_config.ccxml b/boards/dk-tm4c123g/usb_host_keyboard/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin b/boards/dk-tm4c123g/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin new file mode 100644 index 0000000..497d42b Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin differ diff --git a/boards/dk-tm4c123g/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out b/boards/dk-tm4c123g/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out new file mode 100644 index 0000000..4b37db6 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out differ diff --git a/boards/dk-tm4c123g/usb_host_keyboard/gcc/usb_host_keyboard.axf b/boards/dk-tm4c123g/usb_host_keyboard/gcc/usb_host_keyboard.axf new file mode 100644 index 0000000..ec1b6dd Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_keyboard/gcc/usb_host_keyboard.axf differ diff --git a/boards/dk-tm4c123g/usb_host_keyboard/gcc/usb_host_keyboard.bin b/boards/dk-tm4c123g/usb_host_keyboard/gcc/usb_host_keyboard.bin new file mode 100644 index 0000000..46bdb39 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_keyboard/gcc/usb_host_keyboard.bin differ diff --git a/boards/dk-tm4c123g/usb_host_keyboard/readme.txt b/boards/dk-tm4c123g/usb_host_keyboard/readme.txt new file mode 100644 index 0000000..8baa9f3 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/readme.txt @@ -0,0 +1,30 @@ +USB HID Keyboard Host + +This example application demonstrates how to support a USB keyboard +attached to the evaluation kit board. The display will show if a keyboard +is currently connected and the current state of the Caps Lock key on the +keyboard that is connected on the bottom status area of the screen. +Pressing any keys on the keyboard will cause them to be printed on the +screen and to be sent out the UART at 115200 baud with no parity, 8 bits +and 1 stop bit. Any keyboard that supports the USB HID BIOS protocol +should work with this demo application. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/usb_host_keyboard/rvmdk/usb_host_keyboard.axf b/boards/dk-tm4c123g/usb_host_keyboard/rvmdk/usb_host_keyboard.axf new file mode 100644 index 0000000..c6cd481 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_keyboard/rvmdk/usb_host_keyboard.axf differ diff --git a/boards/dk-tm4c123g/usb_host_keyboard/rvmdk/usb_host_keyboard.bin b/boards/dk-tm4c123g/usb_host_keyboard/rvmdk/usb_host_keyboard.bin new file mode 100644 index 0000000..4a4b124 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_keyboard/rvmdk/usb_host_keyboard.bin differ diff --git a/boards/dk-tm4c123g/usb_host_keyboard/startup_ccs.c b/boards/dk-tm4c123g/usb_host_keyboard/startup_ccs.c new file mode 100644 index 0000000..74b4867 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_keyboard/startup_ewarm.c b/boards/dk-tm4c123g/usb_host_keyboard/startup_ewarm.c new file mode 100644 index 0000000..70867ff --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_keyboard/startup_gcc.c b/boards/dk-tm4c123g/usb_host_keyboard/startup_gcc.c new file mode 100644 index 0000000..7b0e2b4 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_keyboard/startup_rvmdk.S b/boards/dk-tm4c123g/usb_host_keyboard/startup_rvmdk.S new file mode 100644 index 0000000..901dc1d --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.c b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.c new file mode 100644 index 0000000..b4daec8 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.c @@ -0,0 +1,1143 @@ +//***************************************************************************** +// +// usb_host_keyboard.c - main application code for the host keyboard example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/rom.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhhid.h" +#include "usblib/host/usbhhidkeyboard.h" +#include "utils/uartstdio.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

USB HID Keyboard Host (usb_host_keyboard)

+//! +//! This example application demonstrates how to support a USB keyboard +//! attached to the evaluation kit board. The display will show if a keyboard +//! is currently connected and the current state of the Caps Lock key on the +//! keyboard that is connected on the bottom status area of the screen. +//! Pressing any keys on the keyboard will cause them to be printed on the +//! screen and to be sent out the UART at 115200 baud with no parity, 8 bits +//! and 1 stop bit. Any keyboard that supports the USB HID BIOS protocol +//! should work with this demo application. +// +//***************************************************************************** + +//***************************************************************************** +// +// The ASCII code for a backspace character. +// +//***************************************************************************** +#define ASCII_BACKSPACE 0x08 + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// The size of the keyboard device interface's memory pool in bytes. +// +//***************************************************************************** +#define KEYBOARD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the keyboard device. +// +//***************************************************************************** +uint8_t g_pui8Buffer[KEYBOARD_MEMORY_SIZE]; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the Keyboard class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHIDClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / TICKS_PER_SECOND) + +//***************************************************************************** +// +// Our running system tick counter and a global used to determine the time +// elapsed since last call to GetTickms(). +// +//***************************************************************************** +uint32_t g_ui32SysTickCount; +uint32_t g_ui32LastTick; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The global value used to store the keyboard instance value. +// +//***************************************************************************** +static tUSBHKeyboard *g_psKeyboardInstance; + +//***************************************************************************** +// +// This enumerated type is used to hold the states of the keyboard. +// +//***************************************************************************** +enum +{ + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Keyboard has been detected and needs to be initialized in the main + // loop. + // + STATE_KEYBOARD_INIT, + + // + // Keyboard is connected and waiting for events. + // + STATE_KEYBOARD_CONNECTED, + + // + // Keyboard has received a key press that requires updating the keyboard + // in the main loop. + // + STATE_KEYBOARD_UPDATE, + + // + // An unsupported device has been attached. + // + STATE_UNKNOWN_DEVICE, + + // + // A power fault has occurred. + // + STATE_POWER_FAULT +} +g_eUSBState; + +extern const tHIDKeyboardUsageTable g_sUSKeyboardMap; + +//***************************************************************************** +// +// The current USB operating mode - Host, Device or unknown. +// +//***************************************************************************** +tUSBMode g_eCurrentUSBMode; + +//***************************************************************************** +// +// These defines are used to define the screen constraints to the application. +// +//***************************************************************************** +#define DISPLAY_BANNER_HEIGHT 10 +#define DISPLAY_BANNER_BG ClrDarkBlue +#define DISPLAY_TEXT_BORDER 2 +#define DISPLAY_TEXT_FG ClrWhite +#define DISPLAY_TEXT_BG ClrBlack + +//***************************************************************************** +// +// This variable holds the current status of the modifiers keys. +// +//***************************************************************************** +uint32_t g_ui32Modifiers = 0; + +//***************************************************************************** +// +// This is the number of characters that will fit on a line in the text area. +// +//***************************************************************************** +uint32_t g_ui32CharsPerLine; + +//***************************************************************************** +// +// This is the number of lines that will fit in the text area. +// +//***************************************************************************** +uint32_t g_ui32LinesPerScreen; + +//***************************************************************************** +// +// This is the current line for printing in the text area. +// +//***************************************************************************** +uint32_t g_ui32Line = 0; + +//***************************************************************************** +// +// This is the current column for printing in the text area. +// +//***************************************************************************** +uint32_t g_ui32Column = 0; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Update our tick counter. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// This function prints the character out the UART and into the text area of +// the screen. +// +// \param cChar is the character to print out. +// +// This function handles all of the detail of printing a character to both the +// UART and to the text area of the screen on the evaluation board. The text +// area of the screen will be cleared any time the text goes beyond the end +// of the text area. +// +// \return None. +// +//***************************************************************************** +void +PrintChar(const char cChar) +{ + tRectangle sRect; + + // + // If both the line and column have gone to zero then clear the screen. + // + if((g_ui32Line == 0) && (g_ui32Column == 0)) + { + // + // Form the rectangle that makes up the text box. + // + sRect.i16XMin = 0; + sRect.i16YMin = (2 * DISPLAY_BANNER_HEIGHT) + DISPLAY_TEXT_BORDER; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - DISPLAY_TEXT_BORDER; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT - DISPLAY_TEXT_BORDER; + + // + // Change the foreground color to black and draw black rectangle to + // clear the screen. + // + GrContextForegroundSet(&g_sContext, DISPLAY_TEXT_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Reset the foreground color to the text color. + // + GrContextForegroundSet(&g_sContext, DISPLAY_TEXT_FG); + } + + // + // Send the character to the UART. + // + UARTprintf("%c", cChar); + + // + // Allow new lines to cause the column to go back to zero. + // + if(cChar != '\n') + { + // + // Did we get a backspace character? + // + if(cChar != ASCII_BACKSPACE) + { + // + // This is not a backspace so print the character to the screen. + // + GrStringDraw(&g_sContext, &cChar, 1, + GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column, + (2 * DISPLAY_BANNER_HEIGHT) + DISPLAY_TEXT_BORDER + + (g_ui32Line * GrFontHeightGet(g_psFontFixed6x8)), 0); + } + else + { + // + // We got a backspace. If we are at the top left of the screen, + // return since we don't need to do anything. + // + if(g_ui32Column || g_ui32Line) + { + // + // Adjust the cursor position to erase the last character. + // + if(g_ui32Column) + { + g_ui32Column--; + } + else + { + g_ui32Column = g_ui32CharsPerLine; + g_ui32Line--; + } + + // + // Print a space at this position then return without fixing up + // the cursor again. + // + GrStringDraw(&g_sContext, " ", 1, + GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column, + (2 * DISPLAY_BANNER_HEIGHT) + DISPLAY_TEXT_BORDER + + (g_ui32Line * GrFontHeightGet(g_psFontFixed6x8)), + true); + } + return; + } + } + else + { + // + // This will allow the code below to properly handle the new line. + // + g_ui32Column = g_ui32CharsPerLine; + } + + // + // Update the text row and column that the next character will use. + // + if(g_ui32Column < g_ui32CharsPerLine) + { + // + // No line wrap yet so move one column over. + // + g_ui32Column++; + } + else + { + // + // Line wrapped so go back to the first column and update the line. + // + g_ui32Column = 0; + g_ui32Line++; + + // + // The line has gone past the end so go back to the first line. + // + if(g_ui32Line >= g_ui32LinesPerScreen) + { + g_ui32Line = 0; + } + } +} + +//***************************************************************************** +// +// This function updates the status area of the screen. It uses the current +// state of the application to print the status bar. +// +//***************************************************************************** +void +UpdateStatus(void) +{ + tRectangle sRect; + + // + // Fill the bottom rows of the screen with blue to create the status area. + // + sRect.i16XMin = 0; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT - 1; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = sRect.i16YMin + DISPLAY_BANNER_HEIGHT; + + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Update the status on the screen. + // + if(g_eUSBState == STATE_NO_DEVICE) + { + // + // Keyboard is currently disconnected. + // + GrStringDrawCentered(&g_sContext, "no device", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + } + else if(g_eUSBState == STATE_UNKNOWN_DEVICE) + { + // + // Unknown device is currently connected. + // + GrStringDrawCentered(&g_sContext, "unknown device", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + } + else if(g_eUSBState == STATE_POWER_FAULT) + { + // + // Something caused a power fault. + // + GrStringDrawCentered(&g_sContext, "power fault", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + } + else if((g_eUSBState == STATE_KEYBOARD_CONNECTED) || + (g_eUSBState == STATE_KEYBOARD_UPDATE)) + { + // + // Keyboard is connected. + // + GrStringDrawCentered(&g_sContext, "connected", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + + // + // Update the CAPS Lock status. + // + if(g_ui32Modifiers & HID_KEYB_CAPS_LOCK) + { + GrStringDrawCentered(&g_sContext, "C", + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16XMax - 10, + sRect.i16YMin + 5, 0); + } + } +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the keyboard device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *pEventInfo; + + // + // Cast this pointer to its actual type. + // + pEventInfo = (tEventInfo *)pvData; + + switch(pEventInfo->ui32Event) + { + // + // New keyboard detected. + // + case USB_EVENT_CONNECTED: + { + // + // See if this is a HID Keyboard. + // + if((USBHCDDevClass(pEventInfo->ui32Instance, 0) == USB_CLASS_HID) && + (USBHCDDevProtocol(pEventInfo->ui32Instance, 0) == + USB_HID_PROTOCOL_KEYB)) + { + // + // Indicate that the keyboard has been detected. + // + UARTprintf("Keyboard Connected\n"); + + // + // Proceed to the STATE_KEYBOARD_INIT state so that the main + // loop can finish initialized the mouse since + // USBHKeyboardInit() cannot be called from within a callback. + // + g_eUSBState = STATE_KEYBOARD_INIT; + } + + break; + } + // + // Unsupported device detected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + UARTprintf("Unsupported Device Class (0x%02x) Connected.\n", + pEventInfo->ui32Instance); + + // + // An unknown device was detected. + // + g_eUSBState = STATE_UNKNOWN_DEVICE; + + UpdateStatus(); + + break; + } + // + // Device has been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Indicate that the device has been disconnected. + // + UARTprintf("Device Disconnected\n"); + + // + // Change the state so that the main loop knows that the device + // is no longer present. + // + g_eUSBState = STATE_NO_DEVICE; + + // + // Update the screen. + // + UpdateStatus(); + + break; + } + // + // Power Fault occurred. + // + case USB_EVENT_POWER_FAULT: + { + UARTprintf("Power Fault\n"); + + // + // No power means no device is present. + // + g_eUSBState = STATE_POWER_FAULT; + + UpdateStatus(); + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// USB Mode callback +// +// \param ui32Index is the zero-based index of the USB controller making the +// callback. +// \param eMode indicates the new operating mode. +// +// This function is called by the USB library whenever an OTG mode change +// occurs and, if a connection has been made, informs us of whether we are to +// operate as a host or device. +// +// \return None. +// +//***************************************************************************** +void +ModeCallback(uint32_t ui32Index, tUSBMode eMode) +{ + // + // Save the new mode. + // + g_eCurrentUSBMode = eMode; + + switch(eMode) + { + case eUSBModeHost: + { + UARTprintf("\nHost Mode.\n"); + break; + } + case eUSBModeDevice: + { + UARTprintf("\nDevice Mode.\n"); + break; + } + case eUSBModeNone: + { + UARTprintf("\nIdle Mode.\n"); + break; + } + default: + { + UARTprintf("ERROR: Bad Mode!\n"); + break; + } + } +} + +//***************************************************************************** +// +// This is the callback from the USB HID keyboard handler. +// +// \param psKbInstance is ignored by this function. +// \param ui32Event is one of the valid events for a keyboard device. +// \param ui32MsgParam is defined by the event that occurs. +// \param pvMsgData is a pointer to data that is defined by the event that +// occurs. +// +// This function will be called to inform the application when a keyboard has +// been plugged in or removed and any time a key is pressed or released. +// +// \return None. +// +//***************************************************************************** +void +KeyboardCallback(tUSBHKeyboard *psKbInstance, uint32_t ui32Event, + uint32_t ui32MsgParam, void *pvMsgData) +{ + char cChar; + + switch(ui32Event) + { + // + // New Key press detected. + // + case USBH_EVENT_HID_KB_PRESS: + { + // + // If this was a Caps Lock key then update the Caps Lock state. + // + if(ui32MsgParam == HID_KEYB_USAGE_CAPSLOCK) + { + // + // The main loop needs to update the keyboard's Caps Lock + // state. + // + g_eUSBState = STATE_KEYBOARD_UPDATE; + + // + // Toggle the current Caps Lock state. + // + g_ui32Modifiers ^= HID_KEYB_CAPS_LOCK; + + // + // Update the screen based on the Caps Lock status. + // + UpdateStatus(); + } + else if(ui32MsgParam == HID_KEYB_USAGE_SCROLLOCK) + { + // + // The main loop needs to update the keyboard's Scroll Lock + // state. + // + g_eUSBState = STATE_KEYBOARD_UPDATE; + + // + // Toggle the current Scroll Lock state. + // + g_ui32Modifiers ^= HID_KEYB_SCROLL_LOCK; + } + else if(ui32MsgParam == HID_KEYB_USAGE_NUMLOCK) + { + // + // The main loop needs to update the keyboard's Scroll Lock + // state. + // + g_eUSBState = STATE_KEYBOARD_UPDATE; + + // + // Toggle the current Num Lock state. + // + g_ui32Modifiers ^= HID_KEYB_NUM_LOCK; + } + else + { + // + // Was this the backspace key? + // + if((uint8_t)ui32MsgParam == HID_KEYB_USAGE_BACKSPACE) + { + // + // Yes - set the ASCII code for a backspace key. This is + // not returned by USBHKeyboardUsageToChar since this only + // returns printable characters. + // + cChar = ASCII_BACKSPACE; + } + else + { + // + // This is not backspace so try to map the usage code to a + // printable ASCII character. + // + cChar = (char) + USBHKeyboardUsageToChar(g_psKeyboardInstance, + &g_sUSKeyboardMap, + (uint8_t)ui32MsgParam); + } + + // + // A zero value indicates there was no textual mapping of this + // usage code. + // + if(cChar != 0) + { + PrintChar(cChar); + } + } + break; + } + case USBH_EVENT_HID_KB_MOD: + { + // + // This application ignores the state of the shift or control + // and other special keys. + // + break; + } + case USBH_EVENT_HID_KB_REL: + { + // + // This applications ignores the release of keys as well. + // + break; + } + } +} + +//***************************************************************************** +// +// This function returns the number of ticks since the last time this function +// was called. +// +//***************************************************************************** +uint32_t +GetTickms(void) +{ + uint32_t ui32RetVal; + uint32_t ui32Saved; + + ui32RetVal = g_ui32SysTickCount; + ui32Saved = ui32RetVal; + + if(ui32Saved > g_ui32LastTick) + { + ui32RetVal = ui32Saved - g_ui32LastTick; + } + else + { + ui32RetVal = g_ui32LastTick - ui32Saved; + } + + // + // This could miss a few milliseconds but the timings here are on a + // much larger scale. + // + g_ui32LastTick = ui32Saved; + + // + // Return the number of milliseconds since the last time this was called. + // + return(ui32RetVal * MS_PER_SYSTICK); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + tUSBMode eLastMode; + char *pcString; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initially wait for device connection. + // + g_eUSBState = STATE_NO_DEVICE; + eLastMode = eUSBModeOTG; + g_eCurrentUSBMode = eUSBModeOTG; + + // + // Enable Clocking to the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Configure UART0 for debug output. + // + ConfigureUART(); + + // + // Initialize the USB stack mode and pass in a mode callback. + // + USBStackModeSet(0, eUSBModeOTG, ModeCallback); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the keyboard driver. The keyboard does not need + // to be present at this time, this just save a place for it and allows + // the applications to be notified when a keyboard is present. + // + g_psKeyboardInstance = USBHKeyboardOpen(KeyboardCallback, g_pui8Buffer, + KEYBOARD_MEMORY_SIZE); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Initialize the USB controller for OTG operation with a 2ms polling + // rate. + // + USBOTGModeInit(0, 2000, g_pui8HCDPool, HCD_MEMORY_SIZE); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = (2 * DISPLAY_BANNER_HEIGHT) - 1; + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, DISPLAY_TEXT_FG); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "usb-host-", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + GrStringDrawCentered(&g_sContext, "keyboard", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 14, 0); + + + // + // Calculate the number of characters that will fit on a line. + // Make sure to leave a small border for the text box. + // + g_ui32CharsPerLine = (GrContextDpyWidthGet(&g_sContext) - 4) / + GrFontMaxWidthGet(g_psFontFixed6x8); + + // + // Calculate the number of lines per usable text screen. This requires + // taking off space for the top and bottom banners and adding a small bit + // for a border. + // + g_ui32LinesPerScreen = (GrContextDpyHeightGet(&g_sContext) - + (3*(DISPLAY_BANNER_HEIGHT + 1)))/ + GrFontHeightGet(g_psFontFixed6x8); + + // + // Open and instance of the keyboard class driver. + // + UARTprintf("Host Keyboard Application\n"); + + // + // Initial update of the screen. + // + UpdateStatus(); + + // + // The main loop for the application. + // + while(1) + { + // + // Tell the OTG library code how much time has passed in + // milliseconds since the last call. + // + USBOTGMain(GetTickms()); + + // + // Has the USB mode changed since last time we checked? + // + if(g_eCurrentUSBMode != eLastMode) + { + // + // Remember the new mode. + // + eLastMode = g_eCurrentUSBMode; + + switch(eLastMode) + { + case eUSBModeHost: + pcString = "HOST"; + break; + + case eUSBModeDevice: + pcString = "DEVICE"; + break; + + case eUSBModeNone: + pcString = "NONE"; + break; + + default: + pcString = "UNKNOWN"; + break; + } + + UARTprintf("USB mode changed to %s\n", pcString); + } + + switch(g_eUSBState) + { + // + // This state is entered when they keyboard is first detected. + // + case STATE_KEYBOARD_INIT: + { + // + // Initialized the newly connected keyboard. + // + USBHKeyboardInit(g_psKeyboardInstance); + + // + // Proceed to the keyboard connected state. + // + g_eUSBState = STATE_KEYBOARD_CONNECTED; + + // + // Update the screen now that the keyboard has been + // initialized. + // + UpdateStatus(); + + USBHKeyboardModifierSet(g_psKeyboardInstance, g_ui32Modifiers); + + break; + } + case STATE_KEYBOARD_UPDATE: + { + // + // If the application detected a change that required an + // update to be sent to the keyboard to change the modifier + // state then call it and return to the connected state. + // + g_eUSBState = STATE_KEYBOARD_CONNECTED; + + USBHKeyboardModifierSet(g_psKeyboardInstance, g_ui32Modifiers); + + break; + } + case STATE_KEYBOARD_CONNECTED: + { + // + // Nothing is currently done in the main loop when the keyboard + // is connected. + // + break; + } + + case STATE_UNKNOWN_DEVICE: + { + // + // Nothing to do as the device is unknown. + // + break; + } + + case STATE_NO_DEVICE: + { + // + // Nothing is currently done in the main loop when the keyboard + // is not connected. + // + break; + } + default: + { + break; + } + } + } +} diff --git a/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ewd b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ewp b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ewp new file mode 100644 index 0000000..9e694ec --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ewp @@ -0,0 +1,798 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_host_keyboard.c + + + diff --git a/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.icf b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.icf new file mode 100644 index 0000000..a53604c --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_keyboard.icf - Linker configuration file for usb_host_keyboard. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ld b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ld new file mode 100644 index 0000000..823a32c --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_keyboard.ld - Linker configuration file for usb_host_keyboard. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.sct b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.sct new file mode 100644 index 0000000..03d2bf6 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_keyboard.sct - Linker configuration file for usb_host_keyboard. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.uvopt b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.uvopt new file mode 100644 index 0000000..9487f5d --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_keyboard + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_keyboard.c + usb_host_keyboard.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.uvproj b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.uvproj new file mode 100644 index 0000000..f9ed354 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + usb_host_keyboard + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_keyboard + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_keyboard.bin .\rvmdk\usb_host_keyboard.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_keyboard.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_host_keyboard.c + 1 + .\usb_host_keyboard.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard_ccs.cmd b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard_ccs.cmd new file mode 100644 index 0000000..55c0c4f --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_keyboard/usb_host_keyboard_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_keyboard_ccs.cmd - CCS linker configuration file for usb_host_keyboard. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/usb_host_mouse/Makefile b/boards/dk-tm4c123g/usb_host_mouse/Makefile new file mode 100644 index 0000000..83d9641 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host mouse example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../ +IPATH+=../../../.. + +# +# The default rule, which causes the USB host mouse example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_mouse.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host mouse example. +# +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/usb_host_mouse.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_host_mouse.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_mouse.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_mouse.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_mouse.axf: usb_host_mouse.ld +SCATTERgcc_usb_host_mouse=usb_host_mouse.ld +ENTRY_usb_host_mouse=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/usb_host_mouse/ccs/.ccsimportspec b/boards/dk-tm4c123g/usb_host_mouse/ccs/.ccsimportspec new file mode 100644 index 0000000..fab5ea4 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_mouse/ccs/.ccsproject b/boards/dk-tm4c123g/usb_host_mouse/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_mouse/ccs/.cproject b/boards/dk-tm4c123g/usb_host_mouse/ccs/.cproject new file mode 100644 index 0000000..3a73755 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/ccs/.cproject @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_mouse/ccs/.project b/boards/dk-tm4c123g/usb_host_mouse/ccs/.project new file mode 100644 index 0000000..8f293c4 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/ccs/.project @@ -0,0 +1,65 @@ + + + usb_host_mouse + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_mouse/startup_ccs.c + + + usb_host_mouse.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.c + + + usb_host_mouse_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/usb_host_mouse/ccs/Debug/usb_host_mouse.bin b/boards/dk-tm4c123g/usb_host_mouse/ccs/Debug/usb_host_mouse.bin new file mode 100644 index 0000000..76dfa0b Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_mouse/ccs/Debug/usb_host_mouse.bin differ diff --git a/boards/dk-tm4c123g/usb_host_mouse/ccs/Debug/usb_host_mouse.out b/boards/dk-tm4c123g/usb_host_mouse/ccs/Debug/usb_host_mouse.out new file mode 100644 index 0000000..55e9ba3 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_mouse/ccs/Debug/usb_host_mouse.out differ diff --git a/boards/dk-tm4c123g/usb_host_mouse/ccs/macros.ini_initial b/boards/dk-tm4c123g/usb_host_mouse/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/usb_host_mouse/ccs/target_config.ccxml b/boards/dk-tm4c123g/usb_host_mouse/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin b/boards/dk-tm4c123g/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin new file mode 100644 index 0000000..268c5d3 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin differ diff --git a/boards/dk-tm4c123g/usb_host_mouse/ewarm/Exe/usb_host_mouse.out b/boards/dk-tm4c123g/usb_host_mouse/ewarm/Exe/usb_host_mouse.out new file mode 100644 index 0000000..b88883b Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_mouse/ewarm/Exe/usb_host_mouse.out differ diff --git a/boards/dk-tm4c123g/usb_host_mouse/gcc/usb_host_mouse.axf b/boards/dk-tm4c123g/usb_host_mouse/gcc/usb_host_mouse.axf new file mode 100644 index 0000000..beae157 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_mouse/gcc/usb_host_mouse.axf differ diff --git a/boards/dk-tm4c123g/usb_host_mouse/gcc/usb_host_mouse.bin b/boards/dk-tm4c123g/usb_host_mouse/gcc/usb_host_mouse.bin new file mode 100644 index 0000000..75ead31 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_mouse/gcc/usb_host_mouse.bin differ diff --git a/boards/dk-tm4c123g/usb_host_mouse/readme.txt b/boards/dk-tm4c123g/usb_host_mouse/readme.txt new file mode 100644 index 0000000..e9e4649 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/readme.txt @@ -0,0 +1,25 @@ +USB HID Mouse Host + +This application demonstrates the handling of a USB mouse attached to the +evaluation kit. Once attached, the position of the mouse pointer and the +state of the mouse buttons are output to the display. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/usb_host_mouse/rvmdk/usb_host_mouse.axf b/boards/dk-tm4c123g/usb_host_mouse/rvmdk/usb_host_mouse.axf new file mode 100644 index 0000000..2891abd Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_mouse/rvmdk/usb_host_mouse.axf differ diff --git a/boards/dk-tm4c123g/usb_host_mouse/rvmdk/usb_host_mouse.bin b/boards/dk-tm4c123g/usb_host_mouse/rvmdk/usb_host_mouse.bin new file mode 100644 index 0000000..194c1be Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_mouse/rvmdk/usb_host_mouse.bin differ diff --git a/boards/dk-tm4c123g/usb_host_mouse/startup_ccs.c b/boards/dk-tm4c123g/usb_host_mouse/startup_ccs.c new file mode 100644 index 0000000..74b4867 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_mouse/startup_ewarm.c b/boards/dk-tm4c123g/usb_host_mouse/startup_ewarm.c new file mode 100644 index 0000000..70867ff --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_mouse/startup_gcc.c b/boards/dk-tm4c123g/usb_host_mouse/startup_gcc.c new file mode 100644 index 0000000..7b0e2b4 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_mouse/startup_rvmdk.S b/boards/dk-tm4c123g/usb_host_mouse/startup_rvmdk.S new file mode 100644 index 0000000..901dc1d --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.c b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.c new file mode 100644 index 0000000..086519f --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.c @@ -0,0 +1,803 @@ +//***************************************************************************** +// +// usb_host_mouse.c - main application code for the host mouse example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "grlib/grlib.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhhid.h" +#include "usblib/host/usbhhidmouse.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

USB HID Mouse Host (usb_host_mouse)

+//! +//! This application demonstrates the handling of a USB mouse attached to the +//! evaluation kit. Once attached, the position of the mouse pointer and the +//! state of the mouse buttons are output to the display. +// +//***************************************************************************** + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / TICKS_PER_SECOND) + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Our running system tick counter and a global used to determine the time +// elapsed since last call to GetTickms(). +// +//***************************************************************************** +uint32_t g_ui32SysTickCount; +uint32_t g_ui32LastTick; + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// The size of the mouse device interface's memory pool in bytes. +// +//***************************************************************************** +#define MOUSE_MEMORY_SIZE 128 + +//***************************************************************************** +// +// These defines are used to define the screen constraints to the application. +// +//***************************************************************************** +#define DISPLAY_BANNER_HEIGHT 10 +#define DISPLAY_BANNER_BG ClrDarkBlue +#define DISPLAY_TEXT_BORDER 2 +#define DISPLAY_TEXT_FG ClrWhite +#define DISPLAY_TEXT_BG ClrBlack + +//***************************************************************************** +// +// The memory pool to provide to the mouse device. +// +//***************************************************************************** +uint8_t g_pui8Buffer[MOUSE_MEMORY_SIZE]; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the Mouse class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHIDClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The global value used to store the mouse instance value. +// +//***************************************************************************** +static tUSBHMouse *g_psMouseInstance; + +//***************************************************************************** +// +// The global values used to store the mouse state. +// +//***************************************************************************** +static uint32_t g_ui32Buttons; +static int32_t g_i32CursorX; +static int32_t g_i32CursorY; + +//***************************************************************************** +// +// The current USB operating mode - Host, Device or unknown. +// +//***************************************************************************** +tUSBMode g_eCurrentUSBMode; + +//***************************************************************************** +// +// This enumerated type is used to hold the states of the mouse. +// +//***************************************************************************** +enum +{ + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Mouse has been detected and needs to be initialized in the main + // loop. + // + STATE_MOUSE_INIT, + + // + // Mouse is connected and waiting for events. + // + STATE_MOUSE_CONNECTED, + + // + // An unsupported device has been attached. + // + STATE_UNKNOWN_DEVICE, + + // + // A power fault has occured. + // + STATE_POWER_FAULT +} +g_eUSBState; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the mouse device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *pEventInfo; + tRectangle sRect; + + // + // Fill the bottom rows of the screen with blue to create the status area. + // + sRect.i16XMin = 0; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT - 1; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = sRect.i16YMin + DISPLAY_BANNER_HEIGHT; + + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Set the font for the status message + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Cast this pointer to its actual type. + // + pEventInfo = (tEventInfo *)pvData; + + switch(pEventInfo->ui32Event) + { + // + // New mouse detected. + // + case USB_EVENT_CONNECTED: + { + // + // See if this is a HID Mouse. + // + if((USBHCDDevClass(pEventInfo->ui32Instance, 0) == USB_CLASS_HID) && + (USBHCDDevProtocol(pEventInfo->ui32Instance, 0) == + USB_HID_PROTOCOL_MOUSE)) + { + // + // Indicate that the mouse has been detected. + // + GrStringDrawCentered(&g_sContext, "Mouse Connected", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + + // + // Set initial mouse information. + // + GrStringDrawCentered(&g_sContext, "0,0", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 26, 1); + GrStringDrawCentered(&g_sContext, "000", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 46, 1); + + // + // Proceed to the STATE_MOUSE_INIT state so that the main loop + // can finish initialized the mouse since USBHMouseInit() + // cannot be called from within a callback. + // + g_eUSBState = STATE_MOUSE_INIT; + } + + break; + } + // + // Unsupported device detected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + GrStringDrawCentered(&g_sContext, "Unknown Device", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + // + // An unknown device was detected. + // + g_eUSBState = STATE_UNKNOWN_DEVICE; + + break; + } + // + // Device has been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Indicate that the device has been disconnected. + // + GrStringDrawCentered(&g_sContext, "No Device", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + + // + // Reset the mouse information. + // + GrStringDrawCentered(&g_sContext, " -,- ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 26, 1); + GrStringDrawCentered(&g_sContext, "---", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 46, 1); + + // + // Change the state so that the main loop knows that the device is + // no longer present. + // + g_eUSBState = STATE_NO_DEVICE; + + // + // Reset the button state. + // + g_ui32Buttons = 0; + + break; + } + // + // Power Fault has occurred. + // + case USB_EVENT_POWER_FAULT: + { + // + // Indicate that there has been a power fault. + // + GrStringDrawCentered(&g_sContext, "Power Fault", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + + // + // Reset the mouse information. + // + GrStringDrawCentered(&g_sContext, " -,- ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 26, 1); + GrStringDrawCentered(&g_sContext, "---", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 46, 1); + + // + // No power means no device is present. + // + g_eUSBState = STATE_POWER_FAULT; + + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Update our tick counter. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// This function returns the number of ticks since the last time this function +// was called. +// +//***************************************************************************** +uint32_t +GetTickms(void) +{ + uint32_t ui32RetVal; + uint32_t ui32Saved; + + ui32RetVal = g_ui32SysTickCount; + ui32Saved = ui32RetVal; + + if(ui32Saved > g_ui32LastTick) + { + ui32RetVal = ui32Saved - g_ui32LastTick; + } + else + { + ui32RetVal = g_ui32LastTick - ui32Saved; + } + + // + // This could miss a few milliseconds but the timings here are on a + // much larger scale. + // + g_ui32LastTick = ui32Saved; + + // + // Return the number of milliseconds since the last time this was called. + // + return(ui32RetVal * MS_PER_SYSTICK); +} + +//***************************************************************************** +// +// USB Mode callback +// +// \param ui32Index is the zero-based index of the USB controller making the +// callback. +// \param eMode indicates the new operating mode. +// +// This function is called by the USB library whenever an OTG mode change +// occurs and, if a connection has been made, informs us of whether we are to +// operate as a host or device. +// +// \return None. +// +//***************************************************************************** +void +ModeCallback(uint32_t ui32Index, tUSBMode eMode) +{ + // + // Save the new mode. + // + g_eCurrentUSBMode = eMode; +} + +//***************************************************************************** +// +// This is the callback from the USB HID mouse handler. +// +// \param psMsInstance is ignored by this function. +// \param ui32Event is one of the valid events for a mouse device. +// \param ui32MsgParam is defined by the event that occurs. +// \param pvMsgData is a pointer to data that is defined by the event that +// occurs. +// +// This function will be called to inform the application when a mouse has +// been plugged in or removed and any time mouse movement or button pressed +// is detected. +// +// \return None. +// +//***************************************************************************** +void +MouseCallback(tUSBHMouse *psMsInstance, uint32_t ui32Event, + uint32_t ui32MsgParam, void *pvMsgData) +{ + int32_t i32DoUpdate; + char pcBuffer[20]; + + // + // Do an update unless there is no reason to. + // + i32DoUpdate = 1; + + switch(ui32Event) + { + // + // Mouse button press detected. + // + case USBH_EVENT_HID_MS_PRESS: + { + // + // Save the new button that was pressed. + // + g_ui32Buttons |= ui32MsgParam; + + break; + } + + // + // Mouse button release detected. + // + case USBH_EVENT_HID_MS_REL: + { + // + // Remove the button from the pressed state. + // + g_ui32Buttons &= ~ui32MsgParam; + + break; + } + + // + // Mouse X movement detected. + // + case USBH_EVENT_HID_MS_X: + { + // + // Update the cursor X position. + // + g_i32CursorX += (int8_t)ui32MsgParam; + + // + // Cap the value to not cause an overflow. + // + if(g_i32CursorX > 9999) + { + g_i32CursorX = 9999; + } + + if(g_i32CursorX < -9999) + { + g_i32CursorX = -9999; + } + + break; + } + + // + // Mouse Y movement detected. + // + case USBH_EVENT_HID_MS_Y: + { + // + // Update the cursor Y position. + // + g_i32CursorY += (int8_t)ui32MsgParam; + + // + // Cap the value to not cause an overflow. + // + if(g_i32CursorY > 9999) + { + g_i32CursorY = 9999; + } + + if(g_i32CursorY < -9999) + { + g_i32CursorY = -9999; + } + + break; + } + default: + { + // + // No reason to update. + // + i32DoUpdate = 0; + + break; + } + } + + // + // Display the current mouse position and button state if there was an + // update. + // + if(i32DoUpdate) + { + GrStringDrawCentered(&g_sContext, "Position:", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 16, 0); + usprintf(pcBuffer, " %d,%d ", g_i32CursorX, g_i32CursorY); + GrStringDrawCentered(&g_sContext, pcBuffer, -1, + GrContextDpyWidthGet(&g_sContext) / 2, 26, 1); + GrStringDrawCentered(&g_sContext, "Buttons:", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 36, 0); + usprintf(pcBuffer, "%d%d%d", g_ui32Buttons & 1, (g_ui32Buttons & 2) >> 1, + (g_ui32Buttons & 4) >> 2); + GrStringDrawCentered(&g_sContext, pcBuffer, -1, + GrContextDpyWidthGet(&g_sContext) / 2, 46, 1); + } +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + + // + // Set the clocking to run from the PLL at 50MHz. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = (DISPLAY_BANNER_HEIGHT) - 1; + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, DISPLAY_TEXT_FG); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "usb-host-mouse", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + + // + // Display default information about the mouse + // + GrStringDrawCentered(&g_sContext, "Position:", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 16, 0); + GrStringDrawCentered(&g_sContext, "-,-", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 26, 1); + GrStringDrawCentered(&g_sContext, "Buttons:", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 36, 0); + GrStringDrawCentered(&g_sContext, "---", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 46, 1); + + // + // Fill the bottom rows of the screen with blue to create the status area. + // + sRect.i16XMin = 0; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT - 1; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = sRect.i16YMin + DISPLAY_BANNER_HEIGHT; + + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Print a no device message a placeholder for the message printed + // during an event. + // + GrStringDrawCentered(&g_sContext, "No Device", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable Clocking to the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Initially wait for device connection. + // + g_eUSBState = STATE_NO_DEVICE; + + // + // Initialize the USB stack mode and pass in a mode callback. + // + USBStackModeSet(0, eUSBModeOTG, ModeCallback); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Initialized the cursor. + // + g_ui32Buttons = 0; + g_i32CursorX = 0; + g_i32CursorY = 0; + + // + // Open an instance of the mouse driver. The mouse does not need + // to be present at this time, this just saves a place for it and allows + // the applications to be notified when a mouse is present. + // + g_psMouseInstance = + USBHMouseOpen(MouseCallback, g_pui8Buffer, MOUSE_MEMORY_SIZE); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Initialize the USB controller for OTG operation with a 2ms polling + // rate. + // + USBOTGModeInit(0, 2000, g_pui8HCDPool, HCD_MEMORY_SIZE); + + // + // The main loop for the application. + // + while(1) + { + // + // Tell the OTG state machine how much time has passed in + // milliseconds since the last call. + // + USBOTGMain(GetTickms()); + + switch(g_eUSBState) + { + // + // This state is entered when the mouse is first detected. + // + case STATE_MOUSE_INIT: + { + // + // Initialize the newly connected mouse. + // + USBHMouseInit(g_psMouseInstance); + + // + // Proceed to the mouse connected state. + // + g_eUSBState = STATE_MOUSE_CONNECTED; + + break; + } + + case STATE_MOUSE_CONNECTED: + { + // + // Nothing is currently done in the main loop when the mouse + // is connected. + // + break; + } + + case STATE_NO_DEVICE: + { + // + // The mouse is not connected so nothing needs to be done here. + // + break; + } + + default: + { + break; + } + } + } +} diff --git a/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ewd b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ewp b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ewp new file mode 100644 index 0000000..d9e3423 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_host_mouse.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.icf b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.icf new file mode 100644 index 0000000..bf86ec7 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_mouse.icf - Linker configuration file for usb_host_mouse. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ld b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ld new file mode 100644 index 0000000..d8d2aa2 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_mouse.ld - Linker configuration file for usb_host_mouse. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.sct b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.sct new file mode 100644 index 0000000..f59a248 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_mouse.sct - Linker configuration file for usb_host_mouse. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.uvopt b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.uvopt new file mode 100644 index 0000000..0f0fa7b --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_mouse + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_mouse.c + usb_host_mouse.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.uvproj b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.uvproj new file mode 100644 index 0000000..1c1d062 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + usb_host_mouse + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_mouse + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_mouse.bin .\rvmdk\usb_host_mouse.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..\;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_mouse.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_host_mouse.c + 1 + .\usb_host_mouse.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse_ccs.cmd b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse_ccs.cmd new file mode 100644 index 0000000..9741ddc --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_mouse/usb_host_mouse_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_mouse_ccs.cmd - CCS linker configuration file for usb_host_mouse. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/usb_host_msc/Makefile b/boards/dk-tm4c123g/usb_host_msc/Makefile new file mode 100644 index 0000000..3c4ea43 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/Makefile @@ -0,0 +1,98 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host mass storage example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the USB host mass storage example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_msc.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host mass storage example. +# +${COMPILER}/usb_host_msc.axf: ${COMPILER}/buttons.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/fat_usbmsc.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/ff.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/slidemenuwidget.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/usb_host_msc.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_host_msc.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_msc.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_msc.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_msc.axf: usb_host_msc.ld +SCATTERgcc_usb_host_msc=usb_host_msc.ld +ENTRY_usb_host_msc=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/usb_host_msc/ccs/.ccsimportspec b/boards/dk-tm4c123g/usb_host_msc/ccs/.ccsimportspec new file mode 100644 index 0000000..252e9bb --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_msc/ccs/.ccsproject b/boards/dk-tm4c123g/usb_host_msc/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_msc/ccs/.cproject b/boards/dk-tm4c123g/usb_host_msc/ccs/.cproject new file mode 100644 index 0000000..d7cc593 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/ccs/.cproject @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_msc/ccs/.project b/boards/dk-tm4c123g/usb_host_msc/ccs/.project new file mode 100644 index 0000000..958e87a --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/ccs/.project @@ -0,0 +1,85 @@ + + + usb_host_msc + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_msc/startup_ccs.c + + + usb_host_msc.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.c + + + usb_host_msc_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_host_msc/usb_host_msc_ccs.cmd + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + drivers/slidemenuwidget.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/slidemenuwidget.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/fatfs/port/fat_usbmsc.c + 1 + SW_ROOT/third_party/fatfs/port/fat_usbmsc.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/usb_host_msc/ccs/Debug/usb_host_msc.bin b/boards/dk-tm4c123g/usb_host_msc/ccs/Debug/usb_host_msc.bin new file mode 100644 index 0000000..21027db Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_msc/ccs/Debug/usb_host_msc.bin differ diff --git a/boards/dk-tm4c123g/usb_host_msc/ccs/Debug/usb_host_msc.out b/boards/dk-tm4c123g/usb_host_msc/ccs/Debug/usb_host_msc.out new file mode 100644 index 0000000..1477c39 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_msc/ccs/Debug/usb_host_msc.out differ diff --git a/boards/dk-tm4c123g/usb_host_msc/ccs/macros.ini_initial b/boards/dk-tm4c123g/usb_host_msc/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/usb_host_msc/ccs/target_config.ccxml b/boards/dk-tm4c123g/usb_host_msc/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_host_msc/ewarm/Exe/usb_host_msc.bin b/boards/dk-tm4c123g/usb_host_msc/ewarm/Exe/usb_host_msc.bin new file mode 100644 index 0000000..55e182d Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_msc/ewarm/Exe/usb_host_msc.bin differ diff --git a/boards/dk-tm4c123g/usb_host_msc/ewarm/Exe/usb_host_msc.out b/boards/dk-tm4c123g/usb_host_msc/ewarm/Exe/usb_host_msc.out new file mode 100644 index 0000000..e12e459 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_msc/ewarm/Exe/usb_host_msc.out differ diff --git a/boards/dk-tm4c123g/usb_host_msc/gcc/usb_host_msc.axf b/boards/dk-tm4c123g/usb_host_msc/gcc/usb_host_msc.axf new file mode 100644 index 0000000..55bb898 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_msc/gcc/usb_host_msc.axf differ diff --git a/boards/dk-tm4c123g/usb_host_msc/gcc/usb_host_msc.bin b/boards/dk-tm4c123g/usb_host_msc/gcc/usb_host_msc.bin new file mode 100644 index 0000000..132a5c9 Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_msc/gcc/usb_host_msc.bin differ diff --git a/boards/dk-tm4c123g/usb_host_msc/readme.txt b/boards/dk-tm4c123g/usb_host_msc/readme.txt new file mode 100644 index 0000000..ce9fb16 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/readme.txt @@ -0,0 +1,29 @@ +USB Mass Storage Class Host Example + +This example application demonstrates reading a file system from +a USB flash disk. It makes use of FatFs, a FAT file system driver. It +provides a simple widget-based display for showing and navigating the file +system on a USB stick. + +For additional details about FatFs, see the following site: +http://elm-chan.org/fsw/ff/00index_e.html + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/usb_host_msc/rvmdk/usb_host_msc.axf b/boards/dk-tm4c123g/usb_host_msc/rvmdk/usb_host_msc.axf new file mode 100644 index 0000000..2225bde Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_msc/rvmdk/usb_host_msc.axf differ diff --git a/boards/dk-tm4c123g/usb_host_msc/rvmdk/usb_host_msc.bin b/boards/dk-tm4c123g/usb_host_msc/rvmdk/usb_host_msc.bin new file mode 100644 index 0000000..b3ebbca Binary files /dev/null and b/boards/dk-tm4c123g/usb_host_msc/rvmdk/usb_host_msc.bin differ diff --git a/boards/dk-tm4c123g/usb_host_msc/startup_ccs.c b/boards/dk-tm4c123g/usb_host_msc/startup_ccs.c new file mode 100644 index 0000000..dcc7753 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_msc/startup_ewarm.c b/boards/dk-tm4c123g/usb_host_msc/startup_ewarm.c new file mode 100644 index 0000000..a530fb4 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_msc/startup_gcc.c b/boards/dk-tm4c123g/usb_host_msc/startup_gcc.c new file mode 100644 index 0000000..9f16de8 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_host_msc/startup_rvmdk.S b/boards/dk-tm4c123g/usb_host_msc/startup_rvmdk.S new file mode 100644 index 0000000..65bb196 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.c b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.c new file mode 100644 index 0000000..9371614 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.c @@ -0,0 +1,1549 @@ +//***************************************************************************** +// +// usb_host_msc.c - Example program for reading files from a USB flash drive. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/udma.h" +#include "driverlib/rom.h" +#include "driverlib/pin_map.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "utils/ustdlib.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhmsc.h" +#include "third_party/fatfs/src/ff.h" +#include "third_party/fatfs/src/diskio.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" +#include "drivers/slidemenuwidget.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

USB Mass Storage Class Host Example (usb_host_msc)

+//! +//! This example application demonstrates reading a file system from +//! a USB flash disk. It makes use of FatFs, a FAT file system driver. It +//! provides a simple widget-based display for showing and navigating the file +//! system on a USB stick. +//! +//! For additional details about FatFs, see the following site: +//! http://elm-chan.org/fsw/ff/00index_e.html +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines the number of times to call to check if the attached device is +// ready. +// +//***************************************************************************** +#define USBMSC_DRIVE_RETRY 4 + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static DIR g_sDirObject; +static FILINFO g_sFileInfo; + +//***************************************************************************** +// +// A structure that holds a mapping between an FRESULT numerical code, +// and a string representation. FRESULT codes are returned from the FatFs +// FAT file system driver. +// +//***************************************************************************** +typedef struct +{ + FRESULT fresult; + char *pcResultStr; +} +tFresultString; + +//***************************************************************************** +// +// A macro to make it easy to add result codes to the table. +// +//***************************************************************************** +#define FRESULT_ENTRY(f) { (f), (#f) } + +//***************************************************************************** +// +// A table that holds a mapping between the numerical FRESULT code and +// it's name as a string. This is used for looking up error codes and +// providing a human-readable string. +// +//***************************************************************************** +tFresultString g_sFresultStrings[] = +{ + FRESULT_ENTRY(FR_OK), + FRESULT_ENTRY(FR_DISK_ERR), + FRESULT_ENTRY(FR_INT_ERR), + FRESULT_ENTRY(FR_NOT_READY), + FRESULT_ENTRY(FR_NO_FILE), + FRESULT_ENTRY(FR_NO_PATH), + FRESULT_ENTRY(FR_INVALID_NAME), + FRESULT_ENTRY(FR_DENIED), + FRESULT_ENTRY(FR_EXIST), + FRESULT_ENTRY(FR_INVALID_OBJECT), + FRESULT_ENTRY(FR_WRITE_PROTECTED), + FRESULT_ENTRY(FR_INVALID_DRIVE), + FRESULT_ENTRY(FR_NOT_ENABLED), + FRESULT_ENTRY(FR_NO_FILESYSTEM), + FRESULT_ENTRY(FR_MKFS_ABORTED), + FRESULT_ENTRY(FR_TIMEOUT), + FRESULT_ENTRY(FR_LOCKED), + FRESULT_ENTRY(FR_NOT_ENOUGH_CORE), + FRESULT_ENTRY(FR_TOO_MANY_OPEN_FILES), + FRESULT_ENTRY(FR_INVALID_PARAMETER), +}; + +//***************************************************************************** +// +// A macro that holds the number of result codes. +// +//***************************************************************************** +#define NUM_FRESULT_CODES (sizeof(g_sFresultStrings) / sizeof(tFresultString)) + +//***************************************************************************** +// +// Error reasons returned by ChangeToDirectory(). +// +//***************************************************************************** +#define NAME_TOO_LONG_ERROR 1 +#define OPENDIR_ERROR 2 + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / TICKS_PER_SECOND) + +//***************************************************************************** +// +// A counter for system clock ticks, used for simple timing. +// +//***************************************************************************** +static uint32_t g_ui32SysTickCount; + +//***************************************************************************** +// +// Holds global flags for the system. +// +//***************************************************************************** +static uint32_t g_ui32Flags = 0; + +//***************************************************************************** +// +// Flag indicating that some USB device is connected. +// +//***************************************************************************** +#define FLAGS_DEVICE_PRESENT 0x00000001 + +//***************************************************************************** +// +// Hold the current state for the application. +// +//***************************************************************************** +volatile enum +{ + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Mass storage device is being enumerated. + // + STATE_DEVICE_ENUM, + + // + // Mass storage device is ready. + // + STATE_DEVICE_READY, + + // + // An unsupported device has been attached. + // + STATE_UNKNOWN_DEVICE, + + // + // A mass storage device was connected but failed to ever report ready. + // + STATE_TIMEOUT_DEVICE, + + // + // A power fault has occurred. + // + STATE_POWER_FAULT +} +g_eState; + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// The instance data for the MSC driver. +// +//***************************************************************************** +tUSBHMSCInstance *g_psMSCInstance = 0; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the MSC class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostMSCClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. In this application uDMA is only used for USB, +// so only the first 6 channels are needed. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[6]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[6]; +#else +tDMAControlTable g_psDMAControlTable[6] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// Define a pair of buffers that are used for holding path information. +// The buffer size must be large enough to hold the longest expected +// full path name, including the file name, and a trailing null character. +// The initial path is set to root "/". +// +//***************************************************************************** +#define PATH_BUF_SIZE 80 +static char g_pcCwdBuf[PATH_BUF_SIZE] = "/"; +static char g_pcTmpBuf[PATH_BUF_SIZE]; + +//***************************************************************************** +// +// A set of string pointers that are used for showing status on the display. +// Five lines of text are accommodated, which is the reasonable limit for +// this display. +// +//***************************************************************************** +static char *g_pcStatusLines[5]; + +//***************************************************************************** +// +// A variable to track the current level in the directory tree. The root +// level is level 0. +// +//***************************************************************************** +static uint32_t g_ui32Level; + +//***************************************************************************** +// +// Declare a pair of off-screen buffers and associated display structures. +// These are used by the slide menu widget for animated menu effects. +// +//***************************************************************************** +#define OFFSCREEN_BUF_SIZE GrOffScreen4BPPSize(96, 64) +static uint8_t g_pui8OffscreenBufA[OFFSCREEN_BUF_SIZE]; +static uint8_t g_pui8OffscreenBufB[OFFSCREEN_BUF_SIZE]; +static tDisplay g_sOffscreenDisplayA; +static tDisplay g_sOffscreenDisplayB; + +//***************************************************************************** +// +// Create a palette that is used by the on-screen menus and anything else that +// uses the (above) off-screen buffers. This palette should contain any +// colors that are used by any widget using the offscreen buffers. There can +// be up to 16 colors in this palette. +// +//***************************************************************************** +static uint32_t g_pui32Palette[] = +{ + ClrBlack, + ClrWhite, + ClrDarkBlue, + ClrLightBlue, + ClrRed, + ClrDarkGreen, + ClrYellow, + ClrBlue +}; +#define NUM_PALETTE_ENTRIES (sizeof(g_pui32Palette) / sizeof(uint32_t)) + +//***************************************************************************** +// +// Define the maximum number of files that can appear at any directory level. +// This is used for allocating space for holding the file information. +// Define the maximum depth of subdirectories, also used to allocating space +// for directory structures. +// Define the maximum number of characters allowed to be stored for a file +// name. +// +//***************************************************************************** +#define MAX_FILES_PER_MENU 64 +#define MAX_SUBDIR_DEPTH 32 +#define MAX_FILENAME_STRING_LEN 16 + +//***************************************************************************** +// +// Declare a set of menu items and matching strings that are used to hold +// file information. There are two alternating sets. Two are needed because +// the file information must be retained for the current directory, and the +// new directory (up or down the tree). +// +//***************************************************************************** +static char g_pcFileNames[2][MAX_FILES_PER_MENU][MAX_FILENAME_STRING_LEN]; +static tSlideMenuItem g_psFileMenuItems[2][MAX_FILES_PER_MENU]; + +//***************************************************************************** +// +// Declare a set of menus, one for each level of directory. +// +//***************************************************************************** +static tSlideMenu g_psFileMenus[MAX_SUBDIR_DEPTH]; + +//***************************************************************************** +// +// Define the slide menu widget. This is the wigdet that is used for +// displaying the file information. +// +//***************************************************************************** +SlideMenu(g_sFileMenuWidget, WIDGET_ROOT, 0, 0, &g_sCFAL96x64x16, 0, 0, 96, 64, + &g_sOffscreenDisplayA, &g_sOffscreenDisplayB, 16, + ClrWhite, ClrDarkGreen, ClrBlack, &g_sFontFixed6x8, &g_psFileMenus[0], + 0); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. It simply increments a +// counter that is used for timing. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Update our tick counter. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// This function returns a string representation of an error code +// that was returned from a function call to FatFs. It can be used +// for printing human readable error messages. +// +//***************************************************************************** +static const char * +StringFromFresult(FRESULT fresult) +{ + uint32_t ui32Idx; + + // + // Enter a loop to search the error code table for a matching + // error code. + // + for(ui32Idx = 0; ui32Idx < NUM_FRESULT_CODES; ui32Idx++) + { + // + // If a match is found, then return the string name of the + // error code. + // + if(g_sFresultStrings[ui32Idx].fresult == fresult) + { + return(g_sFresultStrings[ui32Idx].pcResultStr); + } + } + + // + // At this point no matching code was found, so return a + // string indicating unknown error. + // + return("UNKNOWN ERR"); +} + +//***************************************************************************** +// +// Initializes the file system module. +// +// \param None. +// +// This function initializes the third party FAT implementation. +// +// \return Returns \e true on success or \e false on failure. +// +//***************************************************************************** +static bool +FileInit(void) +{ + // + // Mount the file system, using logical disk 0. + // + if(f_mount(0, &g_sFatFs) != FR_OK) + { + return(false); + } + return(true); +} + +//***************************************************************************** +// +// This is the callback from the MSC driver. +// +// \param ui32Instance is the driver instance which is needed when communicating +// with the driver. +// \param ui32Event is one of the events defined by the driver. +// \param pvData is a pointer to data passed into the initial call to register +// the callback. +// +// This function handles callback events from the MSC driver. The only events +// currently handled are the MSC_EVENT_OPEN and MSC_EVENT_CLOSE. This allows +// the main routine to know when an MSC device has been detected and +// enumerated and when an MSC device has been removed from the system. +// +// \return None +// +//***************************************************************************** +static void +MSCCallback(tUSBHMSCInstance *ps32Instance, uint32_t ui32Event, void *pvData) +{ + // + // Determine the event. + // + switch(ui32Event) + { + // + // Called when the device driver has successfully enumerated an MSC + // device. + // + case MSC_EVENT_OPEN: + { + // + // Proceed to the enumeration state. + // + g_eState = STATE_DEVICE_ENUM; + + break; + } + + // + // Called when the device driver has been unloaded due to error or + // the device is no longer present. + // + case MSC_EVENT_CLOSE: + { + // + // Go back to the "no device" state and wait for a new connection. + // + g_eState = STATE_NO_DEVICE; + + // + // Re-initialize the file system. + // + FileInit(); + + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the mass storage device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *pEventInfo; + + // + // Cast this pointer to its actual type. + // + pEventInfo = (tEventInfo *)pvData; + + // + // Process each kind of event + // + switch(pEventInfo->ui32Event) + { + // + // An unknown device has been connected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + // + // An unknown device was detected. + // + g_eState = STATE_UNKNOWN_DEVICE; + break; + } + + // + // The unknown device has been been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Unknown device has been removed. + // + g_eState = STATE_NO_DEVICE; + break; + } + + // + // A bus power fault was detected. + // + case USB_EVENT_POWER_FAULT: + { + // + // No power means no device is present. + // + g_eState = STATE_POWER_FAULT; + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This function shows a status screen. It draws a banner at the top of the +// screen with the name of the application, and then up to 5 lines of text +// in the remaining screen area. The caller specifies a pointer to a set of +// strings, and the count of number of lines of text (up to 5). This +// function attempts to vertically center the strings on the display. +// +//***************************************************************************** +static void +ShowStatusScreen(char *pcStatus[], uint32_t ui32Count) +{ + tContext sContext; + tRectangle sRect; + uint32_t ui32Idx; + int32_t i32Y; + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Fill the rest of the display with black, to clear whatever was there + // before. + // + sRect.i16YMin = 10; + sRect.i16YMax = 63; + GrContextForegroundSet(&sContext, ClrBlack); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "usb-host-msc", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Cap the max number of status lines to 5 + // + ui32Count = (ui32Count > 5) ? 5 : ui32Count; + + // + // Compute the starting Y coordinate based on the number of lines. + // + i32Y = 40 - (ui32Count * 5); + + // + // Display the status lines + // + for(ui32Idx = 0; ui32Idx < ui32Count; ui32Idx++) + { + GrStringDrawCentered(&sContext, pcStatus[ui32Idx], -1, + GrContextDpyWidthGet(&sContext) / 2, i32Y, 0); + i32Y += 10; + } +} + +//***************************************************************************** +// +// This function is called to read the contents of the current directory from +// the USB stick and populate a set of menu items, one for each file in the +// directory. A subdirectory within the directory counts as a file item. +// +// This function returns the number of file items that were found, or 0 if +// there is any error detected. +// +//***************************************************************************** +static uint32_t +PopulateFileList(uint32_t ui32Level) +{ + uint32_t ui32ItemCount; + FRESULT fresult; + + // + // Open the current directory for access. + // + fresult = f_opendir(&g_sDirObject, g_pcCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(fresult != FR_OK) + { + // + // Ensure that the error is reported. + // + g_pcStatusLines[0] = "Error from"; + g_pcStatusLines[1] = "USB disk"; + g_pcStatusLines[2] = (char *)StringFromFresult(fresult); + ShowStatusScreen(g_pcStatusLines, 3); + return(0); + } + + // + // Initialize the count of files in this directory + // + ui32ItemCount = 0; + + // + // Enter loop to enumerate through all directory entries. + // + for(;;) + { + // + // Read an entry from the directory. + // + fresult = f_readdir(&g_sDirObject, &g_sFileInfo); + + // + // Check for error and return if there is a problem. + // + if(fresult != FR_OK) + { + g_pcStatusLines[0] = "Error from"; + g_pcStatusLines[1] = "USB disk"; + g_pcStatusLines[2] = (char *)StringFromFresult(fresult); + ShowStatusScreen(g_pcStatusLines, 3); + return(0); + } + + // + // If the file name is blank, then this is the end of the + // listing. + // + if(!g_sFileInfo.fname[0]) + { + break; + } + + // + // Add the information to a menu item + // + if(ui32ItemCount < MAX_FILES_PER_MENU) + { + tSlideMenuItem *pMenuItem; + + // + // Get a pointer to the current menu item. Use the directory + // level to determine which of the two sets of menu items to use. + // (ui32Level & 1]. This lets us alternate between the current + // set of menu items and the new set (up or down the tree). + // + pMenuItem = &g_psFileMenuItems[ui32Level & 1][ui32ItemCount]; + + // + // Add the file name to the menu item + // + usnprintf(g_pcFileNames[ui32Level & 1][ui32ItemCount], + MAX_FILENAME_STRING_LEN, "%s", g_sFileInfo.fname); + pMenuItem->pcText = g_pcFileNames[ui32Level & 1][ui32ItemCount]; + + // + // If this is a directory, then add the next level menu so that + // when displayed it will be showed with a submenu option + // (next level down in directory tree). Otherwise it is a file + // so clear the child menu so that there is no submenu option + // shown. + // + pMenuItem->psChildMenu = (g_sFileInfo.fattrib & AM_DIR) ? + &g_psFileMenus[ui32Level + 1] : 0; + + // + // Move to the next entry in the item array we use to populate the + // list box. + // + ui32ItemCount++; + } + } + + // + // Made it to here, return the count of files that were populated. + // + return(ui32ItemCount); +} + +//***************************************************************************** +// +// This function is used to change to a new directory in the file system. +// It takes a parameter that specifies the directory to make the current +// working directory. +// Path separators must use a forward slash "/". The directory parameter +// can be one of the following: +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so dont try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory +// to make sure it exists. If the new path is opened successfully, then +// the current working directory (cwd) is changed to the new path. +// +// In cases of error, the pui32Reason parameter will be written with one of +// the following values: +// +// NAME_TOO_LONG_ERROR - combination of paths are too long for the buffer +// OPENDIR_ERROR - there is some problem opening the new directory +// +//***************************************************************************** +static FRESULT +ChangeToDirectory(char *pcDirectory, uint32_t *pui32Reason) +{ + uint32_t ui32Idx; + FRESULT fresult; + + // + // Copy the current working path into a temporary buffer so + // it can be manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If the first character is /, then this is a fully specified + // path, and it should just be used as-is. + // + if(pcDirectory[0] == '/') + { + // + // Make sure the new path is not bigger than the cwd buffer. + // + if(strlen(pcDirectory) + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_OK); + } + + // + // If the new path name (in argv[1]) is not too long, then + // copy it into the temporary buffer so it can be checked. + // + else + { + strncpy(g_pcTmpBuf, pcDirectory, sizeof(g_pcTmpBuf)); + } + } + + // + // If the argument is .. then attempt to remove the lowest level + // on the CWD. + // + else if(!strcmp(pcDirectory, "..")) + { + // + // Get the index to the last character in the current path. + // + ui32Idx = strlen(g_pcTmpBuf) - 1; + + // + // Back up from the end of the path name until a separator (/) + // is found, or until we bump up to the start of the path. + // + while((g_pcTmpBuf[ui32Idx] != '/') && (ui32Idx > 1)) + { + // + // Back up one character. + // + ui32Idx--; + } + + // + // Now we are either at the lowest level separator in the + // current path, or at the beginning of the string (root). + // So set the new end of string here, effectively removing + // that last part of the path. + // + g_pcTmpBuf[ui32Idx] = 0; + } + + // + // Otherwise this is just a normal path name from the current + // directory, and it needs to be appended to the current path. + // + else + { + // + // Test to make sure that when the new additional path is + // added on to the current path, there is room in the buffer + // for the full new path. It needs to include a new separator, + // and a trailing null character. + // + if(strlen(g_pcTmpBuf) + strlen(pcDirectory) + 1 + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_INVALID_OBJECT); + } + + // + // The new path is okay, so add the separator and then append + // the new directory to the path. + // + else + { + // + // If not already at the root level, then append a / + // + if(strcmp(g_pcTmpBuf, "/")) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Append the new directory to the path. + // + strcat(g_pcTmpBuf, pcDirectory); + } + } + + // + // At this point, a candidate new directory path is in g_pcTmpBuf. + // Try to open it to make sure it is valid. + // + fresult = f_opendir(&g_sDirObject, g_pcTmpBuf); + + // + // If it can't be opened, then it is a bad path. Return an error. + // + if(fresult != FR_OK) + { + *pui32Reason = OPENDIR_ERROR; + return(fresult); + } + + // + // Otherwise, it is a valid new path, so copy it into the CWD. + // + else + { + strncpy(g_pcCwdBuf, g_pcTmpBuf, sizeof(g_pcCwdBuf)); + } + + // + // Return success. + // + return(FR_OK); +} + +//***************************************************************************** +// +// Sends a button/key press message to the slide menu widget that is showing +// files. +// +//***************************************************************************** +static void +SendWidgetKeyMessage(uint32_t ui32Msg) +{ + WidgetMessageQueueAdd(WIDGET_ROOT, + ui32Msg, (uint32_t)&g_sFileMenuWidget, 0, 1, 1); +} + +//***************************************************************************** +// +// This function performs actions that are common whenever the directory +// level is changed up or down. It populates the correct menu structure with +// the list of files in the directory. +// +//***************************************************************************** +static bool +ProcessDirChange(char *pcDir, uint32_t ui32Level) +{ + FRESULT fresult; + uint32_t ui32Reason; + uint32_t ui32FileCount; + + // + // Attempt to change to the new directory. + // + fresult = ChangeToDirectory(pcDir, &ui32Reason); + + // + // If the directory change was successful, populate the + // list of files for the new subdirectory. + // + if((fresult == FR_OK) && (ui32Level < MAX_SUBDIR_DEPTH)) + { + // + // Get a pointer to the current menu for this CWD. + // + tSlideMenu *psMenu = &g_psFileMenus[ui32Level]; + + // + // Populate the menu items with the file list for the new CWD. + // + ui32FileCount = PopulateFileList(ui32Level); + + // + // Initialize the file menu with the list of menu items, + // which are just files and dirs in the root directory + // + psMenu->psSlideMenuItems = g_psFileMenuItems[ui32Level & 1]; + psMenu->ui32Items = ui32FileCount; + + // + // Set the parent directory, if there is one. If at level 0 + // (CWD is root), then there is no parent directory. + // + if(ui32Level) + { + psMenu->psParent = &g_psFileMenus[ui32Level - 1]; + } + else + { + psMenu->psParent = 0; + } + + // + // If we are descending into a new subdir, then initialize the other + // menu item fields to default values. + // + if(ui32Level > g_ui32Level) + { + psMenu->ui32CenterIndex = 0; + psMenu->ui32FocusIndex = 0; + psMenu->bMultiSelectable = 0; + } + + // + // Return a success indication + // + return(true); + } + + // + // Directory change was not successful + // + else + { + // + // Return failure indication + // + return(false); + } +} + +//***************************************************************************** +// +// The program main function. It performs initialization, then runs a loop to +// process USB activities and operate the user interface. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32DriveTimeout; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable the uDMA controller and set up the control table base. + // The uDMA controller is used by the USB library. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the buttons driver. + // + ButtonsInit(); + + // + // Initialize two offscreen displays and assign the palette. These + // buffers are used by the slide menu widget to allow animation effects. + // + GrOffScreen4BPPInit(&g_sOffscreenDisplayA, g_pui8OffscreenBufA, 96, 64); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayA, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + GrOffScreen4BPPInit(&g_sOffscreenDisplayB, g_pui8OffscreenBufB, 96, 64); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayB, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + + // + // Show an initial status screen + // + g_pcStatusLines[0] = "Waiting"; + g_pcStatusLines[1] = "for device"; + ShowStatusScreen(g_pcStatusLines, 2); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sFileMenuWidget); + + // + // Initially wait for device connection. + // + g_eState = STATE_NO_DEVICE; + + // + // Initialize the USB stack for host mode. + // + USBStackModeSet(0, eUSBModeHost, 0); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the mass storage class driver. + // + g_psMSCInstance = USBHMSCDriveOpen(0, MSCCallback); + + // + // Initialize the drive timeout. + // + ui32DriveTimeout = USBMSC_DRIVE_RETRY; + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Initialize the USB controller for host operation. + // + USBHCDInit(0, g_pui8HCDPool, HCD_MEMORY_SIZE); + + // + // Initialize the file system. + // + FileInit(); + + // + // Enter an infinite loop to run the user interface and process USB + // events. + // + while(1) + { + uint32_t ui32LastTickCount = 0; + + // + // Call the USB stack to keep it running. + // + USBHCDMain(); + + // + // Process any messages in the widget message queue. This keeps the + // display UI running. + // + WidgetMessageQueueProcess(); + + // + // Take action based on the application state. + // + switch(g_eState) + { + // + // A device has enumerated. + // + case STATE_DEVICE_ENUM: + { + // + // Check to see if the device is ready. If not then stay + // in this state and we will check it again on the next pass. + // + if(USBHMSCDriveReady(g_psMSCInstance) != 0) + { + // + // Wait about 500ms before attempting to check if the + // device is ready again. + // + ROM_SysCtlDelay(ROM_SysCtlClockGet()/(3)); + + // + // Decrement the retry count. + // + ui32DriveTimeout--; + + // + // If the timeout is hit then go to the + // STATE_TIMEOUT_DEVICE state. + // + if(ui32DriveTimeout == 0) + { + g_eState = STATE_TIMEOUT_DEVICE; + } + + break; + } + + // + // Getting here means the device is ready. + // Reset the CWD to the root directory. + // + g_pcCwdBuf[0] = '/'; + g_pcCwdBuf[1] = 0; + + // + // Set the initial directory level to the root + // + g_ui32Level = 0; + + // + // We need to reset the indexes of the root menu to 0, so that + // it will start at the top of the file list, and reset the + // slide menu widget to start with the root menu. + // + g_psFileMenus[g_ui32Level].ui32CenterIndex = 0; + g_psFileMenus[g_ui32Level].ui32FocusIndex = 0; + SlideMenuMenuSet(&g_sFileMenuWidget, &g_psFileMenus[g_ui32Level]); + + // + // Initiate a directory change to the root. This will + // populate a menu structure representing the root directory. + // + if(ProcessDirChange("/", g_ui32Level)) + { + // + // If there were no errors reported, we are ready for + // MSC operation. + // + g_eState = STATE_DEVICE_READY; + + // + // Set the Device Present flag. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + + // + // Request a repaint so the file menu will be shown + // + WidgetPaint(WIDGET_ROOT); + } + + break; + } + + // + // If there is no device then just wait for one. + // + case STATE_NO_DEVICE: + { + if(g_ui32Flags == FLAGS_DEVICE_PRESENT) + { + // + // Show waiting message on screen + // + g_pcStatusLines[0] = "Waiting"; + g_pcStatusLines[1] = "for device"; + ShowStatusScreen(g_pcStatusLines, 2); + + // + // Clear the Device Present flag. + // + g_ui32Flags &= ~FLAGS_DEVICE_PRESENT; + } + break; + } + + // + // An unknown device was connected. + // + case STATE_UNKNOWN_DEVICE: + { + // + // If this is a new device then change the status. + // + if((g_ui32Flags & FLAGS_DEVICE_PRESENT) == 0) + { + // + // Clear the screen and indicate that an unknown device + // is present. + // + g_pcStatusLines[0] = "Unknown"; + g_pcStatusLines[1] = "device"; + ShowStatusScreen(g_pcStatusLines, 2); + } + + // + // Set the Device Present flag. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + + break; + } + + // + // The connected mass storage device is not reporting ready. + // + case STATE_TIMEOUT_DEVICE: + { + // + // If this is the first time in this state then print a + // message. + // + if((g_ui32Flags & FLAGS_DEVICE_PRESENT) == 0) + { + // + // + // Clear the screen and indicate that an unknown device + // is present. + // + g_pcStatusLines[0] = "Device"; + g_pcStatusLines[1] = "Timeout"; + ShowStatusScreen(g_pcStatusLines, 2); + } + + // + // Set the Device Present flag. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + + break; + } + + // + // The device is ready and in use. + // + case STATE_DEVICE_READY: + { + // + // Process occurrence of timer tick. Check for user input + // once each tick. + // + if(g_ui32SysTickCount != ui32LastTickCount) + { + uint8_t ui8ButtonState; + uint8_t ui8ButtonChanged; + + ui32LastTickCount = g_ui32SysTickCount; + + // + // Get the current debounced state of the buttons. + // + ui8ButtonState = ButtonsPoll(&ui8ButtonChanged, 0); + + // + // If select button or right button is pressed, then we + // are trying to descend into another directory + // + if(BUTTON_PRESSED(SELECT_BUTTON, + ui8ButtonState, ui8ButtonChanged) || + BUTTON_PRESSED(RIGHT_BUTTON, + ui8ButtonState, ui8ButtonChanged)) + { + uint32_t ui32NewLevel; + uint32_t ui32ItemIdx; + char *pcItemName; + + // + // Get a pointer to the current menu for this CWD. + // + tSlideMenu *psMenu = &g_psFileMenus[g_ui32Level]; + + // + // Get the highlighted index in the current file list. + // This is the currently highlighted file or dir + // on the display. Then get the name of the file at + // this index. + // + ui32ItemIdx = SlideMenuFocusItemGet(psMenu); + pcItemName = psMenu->psSlideMenuItems[ui32ItemIdx].pcText; + + // + // Make sure we are not yet past the maximum tree + // depth. + // + if(g_ui32Level < MAX_SUBDIR_DEPTH) + { + // + // Potential new level is one greater than the + // current level. + // + ui32NewLevel = g_ui32Level + 1; + + // + // Process the directory change to the new + // directory. This function will populate a menu + // structure with the files and subdirs in the new + // directory. + // + if(ProcessDirChange(pcItemName, ui32NewLevel)) + { + // + // If the change was successful, then update + // the level. + // + g_ui32Level = ui32NewLevel; + + // + // Now that all the prep is done, send the + // KEY_RIGHT message to the widget and it will + // "slide" from the previous file list to the + // new file list of the CWD. + // + SendWidgetKeyMessage(WIDGET_MSG_KEY_RIGHT); + + } + } + } + + // + // If the UP button is pressed, just pass it to the widget + // which will handle scrolling the list of files. + // + if(BUTTON_PRESSED(UP_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_UP); + } + + // + // If the DOWN button is pressed, just pass it to the widget + // which will handle scrolling the list of files. + // + if(BUTTON_PRESSED(DOWN_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_DOWN); + } + + // + // If the LEFT button is pressed, then we are attempting + // to go up a level in the file system. + // + if(BUTTON_PRESSED(LEFT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + uint32_t ui32NewLevel; + + // + // Make sure we are not already at the top of the + // directory tree (at root). + // + if(g_ui32Level) + { + // + // Potential new level is one less than the + // current level. + // + ui32NewLevel = g_ui32Level - 1; + + // + // Process the directory change to the new + // directory. This function will populate a menu + // structure with the files and subdirs in the new + // directory. + // + if(ProcessDirChange("..", ui32NewLevel)) + { + // + // If the change was successful, then update + // the level. + // + g_ui32Level = ui32NewLevel; + + // + // Now that all the prep is done, send the + // KEY_LEFT message to the widget and it will + // "slide" from the previous file list to the + // new file list of the CWD. + // + SendWidgetKeyMessage(WIDGET_MSG_KEY_LEFT); + } + } + } + } + break; + } + // + // Something has caused a power fault. + // + case STATE_POWER_FAULT: + { + // + // Clear the screen and show a power fault indication. + // + g_pcStatusLines[0] = "Power"; + g_pcStatusLines[1] = "fault"; + ShowStatusScreen(g_pcStatusLines, 2); + break; + } + + default: + { + break; + } + } + } +} diff --git a/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ewd b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ewp b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ewp new file mode 100644 index 0000000..742b4d5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ewp @@ -0,0 +1,815 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\drivers\slidemenuwidget.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_host_msc.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.icf b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.icf new file mode 100644 index 0000000..042b365 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_msc.icf - Linker configuration file for usb_host_msc. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ld b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ld new file mode 100644 index 0000000..e02e525 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_msc.ld - Linker configuration file for usb_host_msc. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.sct b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.sct new file mode 100644 index 0000000..c1f2b25 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_msc.sct - Linker configuration file for usb_host_msc. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.uvopt b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.uvopt new file mode 100644 index 0000000..6fd19dc --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.uvopt @@ -0,0 +1,415 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_msc + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + fat_usbmsc.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\slidemenuwidget.c + slidemenuwidget.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_msc.c + usb_host_msc.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 12 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 13 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.uvproj b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.uvproj new file mode 100644 index 0000000..646a84d --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc.uvproj @@ -0,0 +1,469 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + usb_host_msc + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_msc + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_msc.bin .\rvmdk\usb_host_msc.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_msc.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + fat_usbmsc.c + 1 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + slidemenuwidget.c + 1 + ..\drivers\slidemenuwidget.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_host_msc.c + 1 + .\usb_host_msc.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/usb_host_msc/usb_host_msc_ccs.cmd b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc_ccs.cmd new file mode 100644 index 0000000..7887a91 --- /dev/null +++ b/boards/dk-tm4c123g/usb_host_msc/usb_host_msc_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_msc_ccs.cmd - CCS linker configuration file for usb_host_msc. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/dk-tm4c123g/usb_stick_demo/Makefile b/boards/dk-tm4c123g/usb_stick_demo/Makefile new file mode 100644 index 0000000..d63e6f0 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the usb_stick_demo example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the usb_stick_demo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_stick_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the usb_stick_demo example. +# +${COMPILER}/usb_stick_demo.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_stick_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_stick_demo.axf: ${COMPILER}/usb_stick_demo.o +${COMPILER}/usb_stick_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_stick_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_stick_demo.axf: usb_stick_demo.ld +SCATTERgcc_usb_stick_demo=usb_stick_demo.ld +ENTRY_usb_stick_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/usb_stick_demo/ccs/.ccsimportspec b/boards/dk-tm4c123g/usb_stick_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..64f9068 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_stick_demo/ccs/.ccsproject b/boards/dk-tm4c123g/usb_stick_demo/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_stick_demo/ccs/.cproject b/boards/dk-tm4c123g/usb_stick_demo/ccs/.cproject new file mode 100644 index 0000000..4eed931 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/ccs/.cproject @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_stick_demo/ccs/.project b/boards/dk-tm4c123g/usb_stick_demo/ccs/.project new file mode 100644 index 0000000..ae4c93a --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/ccs/.project @@ -0,0 +1,55 @@ + + + usb_stick_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_stick_demo/startup_ccs.c + + + usb_stick_demo.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.c + + + usb_stick_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/usb_stick_demo/ccs/Debug/usb_stick_demo.bin b/boards/dk-tm4c123g/usb_stick_demo/ccs/Debug/usb_stick_demo.bin new file mode 100644 index 0000000..afa3138 Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_demo/ccs/Debug/usb_stick_demo.bin differ diff --git a/boards/dk-tm4c123g/usb_stick_demo/ccs/Debug/usb_stick_demo.out b/boards/dk-tm4c123g/usb_stick_demo/ccs/Debug/usb_stick_demo.out new file mode 100644 index 0000000..a426318 Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_demo/ccs/Debug/usb_stick_demo.out differ diff --git a/boards/dk-tm4c123g/usb_stick_demo/ccs/macros.ini_initial b/boards/dk-tm4c123g/usb_stick_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/usb_stick_demo/ccs/target_config.ccxml b/boards/dk-tm4c123g/usb_stick_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin b/boards/dk-tm4c123g/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin new file mode 100644 index 0000000..f07fa85 Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin differ diff --git a/boards/dk-tm4c123g/usb_stick_demo/ewarm/Exe/usb_stick_demo.out b/boards/dk-tm4c123g/usb_stick_demo/ewarm/Exe/usb_stick_demo.out new file mode 100644 index 0000000..4ace1df Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_demo/ewarm/Exe/usb_stick_demo.out differ diff --git a/boards/dk-tm4c123g/usb_stick_demo/gcc/usb_stick_demo.axf b/boards/dk-tm4c123g/usb_stick_demo/gcc/usb_stick_demo.axf new file mode 100644 index 0000000..5374b25 Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_demo/gcc/usb_stick_demo.axf differ diff --git a/boards/dk-tm4c123g/usb_stick_demo/gcc/usb_stick_demo.bin b/boards/dk-tm4c123g/usb_stick_demo/gcc/usb_stick_demo.bin new file mode 100644 index 0000000..aa9065e Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_demo/gcc/usb_stick_demo.bin differ diff --git a/boards/dk-tm4c123g/usb_stick_demo/readme.txt b/boards/dk-tm4c123g/usb_stick_demo/readme.txt new file mode 100644 index 0000000..5a58d95 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/readme.txt @@ -0,0 +1,39 @@ +USB Stick Update Demo + +An example to demonstrate the use of the flash-based USB stick update +program. This example is meant to be loaded into flash memory from a USB +memory stick, using the USB stick update program (usb_stick_update), +running on the microcontroller. + +After this program is built, the binary file (usb_stick_demo.bin), should +be renamed to the filename expected by usb_stick_update ("FIRMWARE.BIN" by +default) and copied to the root directory of a USB memory stick. Then, +when the memory stick is plugged into the eval board that is running the +usb_stick_update program, this example program will be loaded into flash +and then run on the microcontroller. + +This program simply displays a message on the screen and prompts the user +to press the select button. Once the button is pressed, control is passed +back to the usb_stick_update program which is still is flash, and it will +attempt to load another program from the memory stick. This shows how +a user application can force a new firmware update from the memory stick. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/usb_stick_demo/rvmdk/usb_stick_demo.axf b/boards/dk-tm4c123g/usb_stick_demo/rvmdk/usb_stick_demo.axf new file mode 100644 index 0000000..ce7fb34 Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_demo/rvmdk/usb_stick_demo.axf differ diff --git a/boards/dk-tm4c123g/usb_stick_demo/rvmdk/usb_stick_demo.bin b/boards/dk-tm4c123g/usb_stick_demo/rvmdk/usb_stick_demo.bin new file mode 100644 index 0000000..9dcb832 Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_demo/rvmdk/usb_stick_demo.bin differ diff --git a/boards/dk-tm4c123g/usb_stick_demo/startup_ccs.c b/boards/dk-tm4c123g/usb_stick_demo/startup_ccs.c new file mode 100644 index 0000000..90e87d8 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_stick_demo/startup_ewarm.c b/boards/dk-tm4c123g/usb_stick_demo/startup_ewarm.c new file mode 100644 index 0000000..84b5ed2 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_stick_demo/startup_gcc.c b/boards/dk-tm4c123g/usb_stick_demo/startup_gcc.c new file mode 100644 index 0000000..a98c943 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_stick_demo/startup_rvmdk.S b/boards/dk-tm4c123g/usb_stick_demo/startup_rvmdk.S new file mode 100644 index 0000000..0d1ae3c --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.c b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.c new file mode 100644 index 0000000..707f074 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.c @@ -0,0 +1,274 @@ +//***************************************************************************** +// +// usb_stick_demo.c - USB stick update demo. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/gpio.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

USB Stick Update Demo (usb_stick_demo)

+//! +//! An example to demonstrate the use of the flash-based USB stick update +//! program. This example is meant to be loaded into flash memory from a USB +//! memory stick, using the USB stick update program (usb_stick_update), +//! running on the microcontroller. +//! +//! After this program is built, the binary file (usb_stick_demo.bin), should +//! be renamed to the filename expected by usb_stick_update ("FIRMWARE.BIN" by +//! default) and copied to the root directory of a USB memory stick. Then, +//! when the memory stick is plugged into the eval board that is running the +//! usb_stick_update program, this example program will be loaded into flash +//! and then run on the microcontroller. +//! +//! This program simply displays a message on the screen and prompts the user +//! to press the select button. Once the button is pressed, control is passed +//! back to the usb_stick_update program which is still is flash, and it will +//! attempt to load another program from the memory stick. This shows how +//! a user application can force a new firmware update from the memory stick. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Demonstrate the use of the USB stick update example. +// +//***************************************************************************** +int +main(void) +{ + uint_fast32_t ui32Count; + tContext sContext; + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top 24 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&sContext, ClrWhite); + GrRectDraw(&sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "usb-stick-demo", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Indicate what is happening. + // + GrStringDrawCentered(&sContext, "Press the", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, 0); + GrStringDrawCentered(&sContext, "select button to", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, 0); + GrStringDrawCentered(&sContext, "start the USB", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, 0); + GrStringDrawCentered(&sContext, "stick updater.", -1, + GrContextDpyWidthGet(&sContext) / 2, 50, 0); + + // + // Flush any cached drawing operations. + // + GrFlush(&sContext); + + // + // Enable the GPIO module which the select button is attached to. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM); + + // + // Enable the GPIO pin to read the user button. + // + ROM_GPIODirModeSet(GPIO_PORTM_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(GPIO_PORTM_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Wait for the pullup to take effect or the next loop will exist too soon. + // + SysCtlDelay(1000); + + // + // Wait until the select button has been pressed for ~40ms (in order to + // debounce the press). + // + ui32Count = 0; + while(1) + { + // + // See if the button is pressed. + // + if(ROM_GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_4) == 0) + { + // + // Increment the count since the button is pressed. + // + ui32Count++; + + // + // If the count has reached 4, then the button has been debounced + // as being pressed. + // + if(ui32Count == 4) + { + break; + } + } + else + { + // + // Reset the count since the button is not pressed. + // + ui32Count = 0; + } + + // + // Delay for approximately 10ms. + // + SysCtlDelay(16000000 / (3 * 100)); + } + + // + // Wait until the select button has been released for ~40ms (in order to + // debounce the release). + // + ui32Count = 0; + while(1) + { + // + // See if the button is pressed. + // + if(ROM_GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_4) != 0) + { + // + // Increment the count since the button is released. + // + ui32Count++; + + // + // If the count has reached 4, then the button has been debounced + // as being released. + // + if(ui32Count == 4) + { + break; + } + } + else + { + // + // Reset the count since the button is pressed. + // + ui32Count = 0; + } + + // + // Delay for approximately 10ms. + // + SysCtlDelay(16000000 / (3 * 100)); + } + + // + // Indicate that the updater is being called. + // + GrStringDrawCentered(&sContext, "The USB stick", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, true); + GrStringDrawCentered(&sContext, "updater is now", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, true); + GrStringDrawCentered(&sContext, "waiting for a", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, true); + GrStringDrawCentered(&sContext, "USB stick.", -1, + GrContextDpyWidthGet(&sContext) / 2, 50, true); + + // + // Flush any cached drawing operations. + // + GrFlush(&sContext); + + // + // Call the updater so that it will search for an update on a memory stick. + // + (*((void (*)(void))(*(uint32_t *)0x2c)))(); + + // + // The updater should take control, so this should never be reached. + // Just in case, loop forever. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ewd b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ewp b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ewp new file mode 100644 index 0000000..f3b42ba --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_stick_demo.c + + + diff --git a/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.icf b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.icf new file mode 100644 index 0000000..bf72519 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_stick_demo.icf - Linker configuration file for usb_stick_demo. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00004800 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ld b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ld new file mode 100644 index 0000000..c2faf9d --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_stick_demo.ld - Linker configuration file for usb_stick_demo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00004800, LENGTH = 0x0003b800 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.sct b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.sct new file mode 100644 index 0000000..1ac1e57 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_stick_demo.sct - Linker configuration file for usb_stick_demo. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00004800 0x0003b800 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00004800 0x0003b800 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.uvopt b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.uvopt new file mode 100644 index 0000000..816c607 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_stick_demo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_stick_demo.c + usb_stick_demo.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.uvproj b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.uvproj new file mode 100644 index 0000000..321e81e --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + usb_stick_demo + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_stick_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_stick_demo.bin .\rvmdk\usb_stick_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_stick_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_stick_demo.c + 1 + .\usb_stick_demo.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo_ccs.cmd b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo_ccs.cmd new file mode 100644 index 0000000..7ecc4b4 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_demo/usb_stick_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_stick_demo_ccs.cmd - CCS linker configuration file for usb_stick_demo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00004800 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x0003b800 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c123g/usb_stick_update/Makefile b/boards/dk-tm4c123g/usb_stick_update/Makefile new file mode 100644 index 0000000..08908cc --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/Makefile @@ -0,0 +1,86 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB memory stick updater example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the USB memory stick updater example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_stick_update.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB memory stick updater example. +# +${COMPILER}/usb_stick_update.axf: ${COMPILER}/simple_fs.o +${COMPILER}/usb_stick_update.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_stick_update.axf: ${COMPILER}/usb_stick_update.o +${COMPILER}/usb_stick_update.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_stick_update.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_stick_update.axf: usb_stick_update.ld +SCATTERgcc_usb_stick_update=usb_stick_update.ld +ENTRY_usb_stick_update=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/usb_stick_update/ccs/.ccsimportspec b/boards/dk-tm4c123g/usb_stick_update/ccs/.ccsimportspec new file mode 100644 index 0000000..d225a1d --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_stick_update/ccs/.ccsproject b/boards/dk-tm4c123g/usb_stick_update/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_stick_update/ccs/.cproject b/boards/dk-tm4c123g/usb_stick_update/ccs/.cproject new file mode 100644 index 0000000..f64ccc8 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/ccs/.cproject @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_stick_update/ccs/.project b/boards/dk-tm4c123g/usb_stick_update/ccs/.project new file mode 100644 index 0000000..7386347 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/ccs/.project @@ -0,0 +1,55 @@ + + + usb_stick_update + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + simple_fs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_stick_update/simple_fs.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_stick_update/startup_ccs.c + + + usb_stick_update.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.c + + + usb_stick_update_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/usb_stick_update/usb_stick_update_ccs.cmd + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/usb_stick_update/ccs/Debug/usb_stick_update.bin b/boards/dk-tm4c123g/usb_stick_update/ccs/Debug/usb_stick_update.bin new file mode 100644 index 0000000..1207e5a Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_update/ccs/Debug/usb_stick_update.bin differ diff --git a/boards/dk-tm4c123g/usb_stick_update/ccs/Debug/usb_stick_update.out b/boards/dk-tm4c123g/usb_stick_update/ccs/Debug/usb_stick_update.out new file mode 100644 index 0000000..5ddcc9b Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_update/ccs/Debug/usb_stick_update.out differ diff --git a/boards/dk-tm4c123g/usb_stick_update/ccs/macros.ini_initial b/boards/dk-tm4c123g/usb_stick_update/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/usb_stick_update/ccs/target_config.ccxml b/boards/dk-tm4c123g/usb_stick_update/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/usb_stick_update/ewarm/Exe/usb_stick_update.bin b/boards/dk-tm4c123g/usb_stick_update/ewarm/Exe/usb_stick_update.bin new file mode 100644 index 0000000..b60df80 Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_update/ewarm/Exe/usb_stick_update.bin differ diff --git a/boards/dk-tm4c123g/usb_stick_update/ewarm/Exe/usb_stick_update.out b/boards/dk-tm4c123g/usb_stick_update/ewarm/Exe/usb_stick_update.out new file mode 100644 index 0000000..1baa183 Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_update/ewarm/Exe/usb_stick_update.out differ diff --git a/boards/dk-tm4c123g/usb_stick_update/gcc/usb_stick_update.axf b/boards/dk-tm4c123g/usb_stick_update/gcc/usb_stick_update.axf new file mode 100644 index 0000000..67e17c8 Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_update/gcc/usb_stick_update.axf differ diff --git a/boards/dk-tm4c123g/usb_stick_update/gcc/usb_stick_update.bin b/boards/dk-tm4c123g/usb_stick_update/gcc/usb_stick_update.bin new file mode 100644 index 0000000..bd8ee8f Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_update/gcc/usb_stick_update.bin differ diff --git a/boards/dk-tm4c123g/usb_stick_update/readme.txt b/boards/dk-tm4c123g/usb_stick_update/readme.txt new file mode 100644 index 0000000..1e9954a --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/readme.txt @@ -0,0 +1,49 @@ +USB Memory Stick Updater + +This example application behaves the same way as a boot loader. It resides +at the beginning of flash, and will read a binary file from a USB memory +stick and program it into another location in flash. Once the user +application has been programmed into flash, this program will always start +the user application until requested to load a new application. + +When this application starts, if there is a user application already in +flash (at \b APP_START_ADDRESS), then it will just run the user application. +It will attempt to load a new application from a USB memory stick under +the following conditions: + +- no user application is present at \b APP_START_ADDRESS +- the user application has requested an update by transferring control +to the updater +- the user holds down the eval board push button when the board is reset + +When this application is attempting to perform an update, it will wait +forever for a USB memory stick to be plugged in. Once a USB memory stick +is found, it will search the root directory for a specific file name, which +is \e FIRMWARE.BIN by default. This file must be a binary image of the +program you want to load (the .bin file), linked to run from the correct +address, at \b APP_START_ADDRESS. + +The USB memory stick must be formatted as a FAT16 or FAT32 file system +(the normal case), and the binary file must be located in the root +directory. Other files can exist on the memory stick but they will be +ignored. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/usb_stick_update/rvmdk/usb_stick_update.axf b/boards/dk-tm4c123g/usb_stick_update/rvmdk/usb_stick_update.axf new file mode 100644 index 0000000..6a01ba7 Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_update/rvmdk/usb_stick_update.axf differ diff --git a/boards/dk-tm4c123g/usb_stick_update/rvmdk/usb_stick_update.bin b/boards/dk-tm4c123g/usb_stick_update/rvmdk/usb_stick_update.bin new file mode 100644 index 0000000..5b9101b Binary files /dev/null and b/boards/dk-tm4c123g/usb_stick_update/rvmdk/usb_stick_update.bin differ diff --git a/boards/dk-tm4c123g/usb_stick_update/simple_fs.c b/boards/dk-tm4c123g/usb_stick_update/simple_fs.c new file mode 100644 index 0000000..b8ebc41 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/simple_fs.c @@ -0,0 +1,865 @@ +//***************************************************************************** +// +// simple_fs.c - Functions for simple FAT file system support +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "simple_fs.h" + +//***************************************************************************** +// +// \addtogroup simple_fs_api +// @{ +// +// This file system API should be used as follows: +// - Initialize it by calling SimpleFsInit(). You must supply a pointer to a +// 512 byte buffer that will be used for storing device sector data. +// - "Open" a file by calling SimpleFsOpen() and passing the 8.3-style filename +// as an 11-character string. +// - Read successive sectors from the file by using the convenience macro +// SimpleFsReadFileSector(). +// +// This API does not use any file handles so there is no way to open more than +// one file at a time. There is also no random access into the file, each +// sector must be read in sequence. +// +// The client of this API supplies a 512-byte buffer for storage of data read +// from the device. But this file also maintains an additional, internal +// 512-byte buffer used for caching FAT sectors. This minimizes the amount +// of device reads required to fetch cluster chain entries from the FAT. +// +// The application code (the client) must also provide a function used for +// reading sectors from the storage device, whatever it may be. This allows +// the code in this file to be independent of the type of device used for +// storing the file system. The name of the function is +// SimpleFsReadMediaSector(). +// +//***************************************************************************** + +//***************************************************************************** +// +// Setup a macro for handling packed data structures. +// +//***************************************************************************** +#if defined(ccs) || \ + defined(codered) || \ + defined(gcc) || \ + defined(rvmdk) || \ + defined(__ARMCC_VERSION) || \ + defined(sourcerygxx) +#define PACKED __attribute__((packed)) +#elif defined(ewarm) +#define PACKED +#else +#error "Unrecognized COMPILER!" +#endif + +//***************************************************************************** +// +// Instruct the IAR compiler to pack the following structures. +// +//***************************************************************************** +#ifdef ewarm +#pragma pack(1) +#endif + +//***************************************************************************** +// +// Structures for mapping FAT file system +// +//***************************************************************************** + +//***************************************************************************** +// +// The FAT16 boot sector extension +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8DriveNumber; + uint8_t ui8Reserved; + uint8_t ui8ExtSig; + uint32_t ui32Serial; + char pcVolumeLabel[11]; + char pcFsType[8]; + uint8_t ui8BootCode[448]; + uint16_t ui16Sig; +} +PACKED tBootExt16; + +//***************************************************************************** +// +// The FAT32 boot sector extension +// +//***************************************************************************** +typedef struct +{ + uint32_t ui32SectorsPerFAT; + uint16_t ui16Flags; + uint16_t ui16Version; + uint32_t ui32RootCluster; + uint16_t ui16InfoSector; + uint16_t ui16BootCopy; + uint8_t ui8Reserved[12]; + uint8_t ui8DriveNumber; + uint8_t ui8Reserved1; + uint8_t ui8ExtSig; + uint32_t ui32Serial; + char pcVolumeLabel[11]; + char pcFsType[8]; + uint8_t ui8BootCode[420]; + uint16_t ui16Sig; +} +PACKED tBootExt32; + +//***************************************************************************** +// +// The FAT16/32 boot sector main section +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8Jump[3]; + uint8_t i8OEMName[8]; + uint16_t ui16BytesPerSector; + uint8_t ui8SectorsPerCluster; + uint16_t ui16ReservedSectors; + uint8_t ui8NumFATs; + uint16_t ui16NumRootEntries; + uint16_t ui16TotalSectorsSmall; + uint8_t ui8MediaDescriptor; + uint16_t ui16SectorsPerFAT; + uint16_t ui16SectorsPerTrack; + uint16_t ui16NumberHeads; + uint32_t ui32HiddenSectors; + uint32_t ui32TotalSectorsBig; + union + { + tBootExt16 sExt16; + tBootExt32 sExt32; + } + PACKED ext; +} +PACKED tBootSector; + +//***************************************************************************** +// +// The partition table +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8Status; + uint8_t ui8CHSFirst[3]; + uint8_t ui8Type; + uint8_t ui8CHSLast[3]; + uint32_t ui32FirstSector; + uint32_t ui32NumBlocks; +} +PACKED tPartitionTable; + +//***************************************************************************** +// +// The master boot record (MBR) +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8CodeArea[440]; + uint8_t ui8DiskSignature[4]; + uint8_t ui8Nulls[2]; + tPartitionTable sPartTable[4]; + uint16_t ui16Sig; +} +PACKED tMasterBootRecord; + +//***************************************************************************** +// +// The structure for a single directory entry +// +//***************************************************************************** +typedef struct +{ + char pcFileName[11]; + uint8_t ui8Attr; + uint8_t ui8Reserved; + uint8_t ui8CreateTime[5]; + uint8_t ui8LastDate[2]; + uint16_t ui16ClusterHi; + uint8_t ui8LastModified[4]; + uint16_t ui16Cluster; + uint32_t ui32FileSize; +} +PACKED tDirEntry; + +//***************************************************************************** +// +// Tell the IAR compiler that the remaining structures do not need to be +// packed. +// +//***************************************************************************** +#ifdef ewarm +#pragma pack() +#endif + +//***************************************************************************** +// +// This structure holds information about the layout of the file system +// +//***************************************************************************** +typedef struct +{ + uint32_t ui32FirstSector; + uint32_t ui32NumBlocks; + uint16_t ui16SectorsPerCluster; + uint16_t ui16MaxRootEntries; + uint32_t ui32SectorsPerFAT; + uint32_t ui32FirstFATSector; + uint32_t ui32LastFATSector; + uint32_t ui32FirstDataSector; + uint32_t ui32Type; + uint32_t ui32StartRootDir; +} +tPartitionInfo; + +static tPartitionInfo sPartInfo; + +//***************************************************************************** +// +// A pointer to the client provided sector buffer. +// +//***************************************************************************** +static uint8_t *g_pui8SectorBuf; + +//***************************************************************************** +// +// Initializes the simple file system +// +// \param pui8SectorBuf is a pointer to a caller supplied 512-byte buffer +// that will be used for holding sectors that are loaded from the media +// storage device. +// +// Reads the MBR, partition table, and boot record to find the logical +// structure of the file system. This function stores the file system +// structural data internally so that the remaining functions of the API +// can read the file system. +// +// To read data from the storage device, the function SimpleFsReadMediaSector() +// will be called. This function is not implemented here but must be +// implemented by the user of this simple file system. +// +// This file system support is extremely simple-minded. It will only +// find the first partition of a FAT16 or FAT32 formatted mass storage +// device. Only very minimal error checking is performed in order to save +// code space. +// +// \return Zero if successful, non-zero if there was an error. +// +//***************************************************************************** +uint32_t +SimpleFsInit(uint8_t *pui8SectorBuf) +{ + tMasterBootRecord *pMBR; + tPartitionTable *pPart; + tBootSector *pBoot; + + // + // Save the sector buffer pointer. The input parameter is assumed + // to be good. + // + g_pui8SectorBuf = pui8SectorBuf; + + // + // Get the MBR + // + if(SimpleFsReadMediaSector(0, pui8SectorBuf)) + { + return(1); + } + + // + // Verify MBR signature - bare minimum validation of MBR. + // + pMBR = (tMasterBootRecord *)pui8SectorBuf; + if(pMBR->ui16Sig != 0xAA55) + { + return(1); + } + + // + // See if this is a MBR or a boot sector. + // + pBoot = (tBootSector *)pui8SectorBuf; + if((strncmp(pBoot->ext.sExt16.pcFsType, "FAT", 3) != 0) && + (strncmp(pBoot->ext.sExt32.pcFsType, "FAT32", 5) != 0)) + { + // + // Get the first partition table + // + pPart = &(pMBR->sPartTable[0]); + + // + // Could optionally check partition type here ... + // + + // + // Get the partition location and size + // + sPartInfo.ui32FirstSector = pPart->ui32FirstSector; + sPartInfo.ui32NumBlocks = pPart->ui32NumBlocks; + + // + // Read the boot sector from the partition + // + if(SimpleFsReadMediaSector(sPartInfo.ui32FirstSector, pui8SectorBuf)) + { + return(1); + } + } + else + { + // + // Extract the number of sectors from the boot sector. + // + sPartInfo.ui32FirstSector = 0; + if(pBoot->ui16TotalSectorsSmall == 0) + { + sPartInfo.ui32NumBlocks = pBoot->ui32TotalSectorsBig; + } + else + { + sPartInfo.ui32NumBlocks = pBoot->ui16TotalSectorsSmall; + } + } + + // + // Get pointer to the boot sector + // + if(pBoot->ext.sExt16.ui16Sig != 0xAA55) + { + return(1); + } + + // + // Verify the sector size is 512. We can't deal with anything else + // + if(pBoot->ui16BytesPerSector != 512) + { + return(1); + } + + // + // Extract some info from the boot record + // + sPartInfo.ui16SectorsPerCluster = pBoot->ui8SectorsPerCluster; + sPartInfo.ui16MaxRootEntries = pBoot->ui16NumRootEntries; + + // + // Decide if we are dealing with FAT16 or FAT32. + // If number of root entries is 0, that suggests FAT32 + // + if(sPartInfo.ui16MaxRootEntries == 0) + { + // + // Confirm FAT 32 signature in the expected place + // + if(!strncmp(pBoot->ext.sExt32.pcFsType, "FAT32 ", 8)) + { + sPartInfo.ui32Type = 32; + } + else + { + return(1); + } + } + // + // Root entries is non-zero, suggests FAT16 + // + else + { + // + // Confirm FAT16 signature + // + if(!strncmp(pBoot->ext.sExt16.pcFsType, "FAT16 ", 8)) + { + sPartInfo.ui32Type = 16; + } + else + { + return(1); + } + } + + // + // Find the beginning of the FAT, in absolute sectors + // + sPartInfo.ui32FirstFATSector = sPartInfo.ui32FirstSector + + pBoot->ui16ReservedSectors; + + // + // Find the end of the FAT in absolute sectors. FAT16 and 32 + // are handled differently. + // + sPartInfo.ui32SectorsPerFAT = (sPartInfo.ui32Type == 16) ? + pBoot->ui16SectorsPerFAT : + pBoot->ext.sExt32.ui32SectorsPerFAT; + sPartInfo.ui32LastFATSector = sPartInfo.ui32FirstFATSector + + sPartInfo.ui32SectorsPerFAT - 1; + + // + // Find the start of the root directory and the data area. + // For FAT16, the root will be stored as an absolute sector number + // For FAT32, the root will be stored as the starting cluster of the root + // The data area start is the absolute first sector of the data area. + // + if(sPartInfo.ui32Type == 16) + { + sPartInfo.ui32StartRootDir = sPartInfo.ui32FirstFATSector + + (sPartInfo.ui32SectorsPerFAT * + pBoot->ui8NumFATs); + sPartInfo.ui32FirstDataSector = sPartInfo.ui32StartRootDir + + (sPartInfo.ui16MaxRootEntries / 16); + } + else + { + sPartInfo.ui32StartRootDir = pBoot->ext.sExt32.ui32RootCluster; + sPartInfo.ui32FirstDataSector = sPartInfo.ui32FirstFATSector + + (sPartInfo.ui32SectorsPerFAT * pBoot->ui8NumFATs); + } + + // + // At this point the file system has been initialized, so return + // success to the caller. + // + return(0); +} + +//***************************************************************************** +// +// Find the next cluster in a FAT chain +// +// \param ui32ThisCluster is the current cluster in the chain +// +// Reads the File Allocation Table (FAT) of the file system to find the +// next cluster in a chain of clusters. The current cluster is passed in +// and the next cluster in the chain will be returned. +// +// This function reads sectors from the storage device as needed in order +// to parse the FAT tables. Error handling is minimal since there is not +// much that can be done if an error is encountered. If any error is +// encountered, or if this is the last cluster in the chain, then 0 is +// returned. This signals the caller to stop traversing the chain (either +// due to error or end of chain). +// +// The function maintains a cache of a single sector from the FAT. It only +// reads in a new FAT sector if the requested cluster is not in the +// currently cached sector. +// +// \return Next cluster number if successful, 0 if this is the last cluster +// or any error is found. +// +//***************************************************************************** +static uint32_t +SimpleFsGetNextCluster(uint_fast32_t ui32ThisCluster) +{ + static uint8_t ui8FATCache[512]; + static uint_fast32_t ui32CachedFATSector = (uint32_t)-1; + uint_fast32_t ui32ClustersPerFATSector; + uint_fast32_t ui32ClusterIdx; + uint_fast32_t ui32FATSector; + uint_fast32_t ui32NextCluster; + uint_fast32_t ui32MaxCluster; + + // + // Compute the maximum possible reasonable cluster number + // + ui32MaxCluster = sPartInfo.ui32NumBlocks / sPartInfo.ui16SectorsPerCluster; + + // + // Make sure cluster input number is reasonable. If not then return + // 0 indicating error. + // + if((ui32ThisCluster < 2) || (ui32ThisCluster > ui32MaxCluster)) + { + return(0); + } + + // + // Compute the index of the requested cluster within the sector. + // Also compute the sector number within the FAT that contains the + // entry for the requested cluster. + // + ui32ClustersPerFATSector = (sPartInfo.ui32Type == 16) ? 256 : 128; + ui32ClusterIdx = ui32ThisCluster % ui32ClustersPerFATSector; + ui32FATSector = ui32ThisCluster / ui32ClustersPerFATSector; + + // + // Check to see if the FAT sector we need is already cached + // + if(ui32FATSector != ui32CachedFATSector) + { + // + // FAT sector we need is not cached, so read it in + // + if(SimpleFsReadMediaSector(sPartInfo.ui32FirstFATSector + ui32FATSector, + ui8FATCache) != 0) + { + // + // There was an error so mark cache as unavailable and return + // an error. + // + ui32CachedFATSector = (uint32_t)-1; + return(0); + } + + // + // Remember which FAT sector was just loaded into the cache. + // + ui32CachedFATSector = ui32FATSector; + } + + // + // Now look up the next cluster value from the cached sector, using this + // requested cluster as an index. It needs to be indexed as 16 or 32 + // bit values depending on whether it is FAT16 or 32 + // If the cluster value means last cluster, then return 0 + // + if(sPartInfo.ui32Type == 16) + { + ui32NextCluster = ((uint16_t *)ui8FATCache)[ui32ClusterIdx]; + if(ui32NextCluster >= 0xFFF8) + { + return(0); + } + } + else + { + ui32NextCluster = ((uint32_t *)ui8FATCache)[ui32ClusterIdx]; + if(ui32NextCluster >= 0x0FFFFFF8) + { + return(0); + } + } + + // + // Check new cluster value to make sure it is reasonable. If not then + // return 0 to indicate an error. + // + if((ui32NextCluster >= 2) && (ui32NextCluster <= ui32MaxCluster)) + { + return(ui32NextCluster); + } + else + { + return(0); + } +} + +//***************************************************************************** +// +// Read a single sector from a file into the sector buffer +// +// \param ui32StartCluster is the first cluster of the file, used to +// initialize the file read. Use 0 for successive sectors. +// +// Reads sectors in sequence from a file and stores the data in the sector +// buffer that was passed in the initial call to SimpleFsInit(). The function +// is initialized with the file to read by passing the starting cluster of +// the file. The function will initialize some static data and return. It +// does not read any file data when passed a starting cluster (and +// returns 0 - this is normal). +// +// Once the function has been initialized with the file's starting cluster, +// then successive calls should be made, passing a value of 0 for the +// cluster number. This tells the function to read the next sector from the +// file and store it in the sector buffer. The function remembers the last +// sector that was read, and each time it is called with a cluster value of +// 0, it will read the next sector. The function will traverse the FAT +// chain as needed to read all the sectors. When a sector has been +// successfully read from a file, the function will return non-zero. When +// there are no more sectors to read, or any error is encountered, the +// function will return 0. +// +// Note that the function always reads a whole sector, even if the end of +// a file does not fill the last sector. It is the responsibility of the +// caller to track the file size and to deal with a partially full last +// sector. +// +// \return Non-zero if a sector was read into the sector buffer, or +// 0 if there are no more sectors or if any error occurred. +// +//***************************************************************************** +uint32_t +SimpleFsGetNextFileSector(uint_fast32_t ui32StartCluster) +{ + static uint_fast32_t ui32WorkingCluster = 0; + static uint_fast32_t ui32WorkingSector; + uint_fast32_t ui32ReadSector; + + // + // If user specified starting cluster, then init the working cluster + // and sector values + // + if(ui32StartCluster) + { + ui32WorkingCluster = ui32StartCluster; + ui32WorkingSector = 0; + return(0); + } + + // + // Otherwise, make sure there is a valid working cluster already + // + else if(ui32WorkingCluster == 0) + { + return(0); + } + + // + // If the current working sector is the same as sectors per cluster, + // then that means that the next cluster needs to be loaded. + // + if(ui32WorkingSector == sPartInfo.ui16SectorsPerCluster) + { + // + // Get the next cluster in the chain for this file. + // + ui32WorkingCluster = SimpleFsGetNextCluster(ui32WorkingCluster); + + // + // If the next cluster is valid, then reset the working sector + // + if(ui32WorkingCluster) + { + ui32WorkingSector = 0; + } + + // + // Next cluster is not valid, or this was the end of the chain. + // Clear the working cluster and return an indication that no new + // sector data was loaded. + // + else + { + ui32WorkingCluster = 0; + return(0); + } + } + + // + // Calculate the sector to read from. It is the sector of the start + // of the working cluster, plus the working sector (the sector within + // the cluster), plus the offset to the start of the data area. + // Note that the cluster needs to be reduced by 2 in order to index + // properly into the data area. That is a feature of FAT file system. + // + ui32ReadSector = (ui32WorkingCluster - 2) * sPartInfo.ui16SectorsPerCluster; + ui32ReadSector += ui32WorkingSector; + ui32ReadSector += sPartInfo.ui32FirstDataSector; + + // + // Attempt to read the next sector from the cluster. If not successful, + // then clear the working cluster and return a non-success indication. + // + if(SimpleFsReadMediaSector(ui32ReadSector, g_pui8SectorBuf) != 0) + { + ui32WorkingCluster = 0; + return(0); + } + else + { + // + // Read was successful. Increment to the next sector of the cluster + // and return a success indication. + // + ui32WorkingSector++; + return(1); + } +} + +//***************************************************************************** +// +// Find a file in the root directory of the file system and open it for +// reading. +// +// \param pcName83 is an 11-character string that represents the 8.3 file +// name of the file to open. +// +// This function traverses the root directory of the file system to find +// the file name specified by the caller. Note that the file name must be +// an 8.3 file name that is 11 characters int32_t. The first 8 characters are +// the base name and the last 3 characters are the extension. If there are +// fewer characters in the base name or extension, the name should be padded +// with spaces. For example "myfile.bn" has fewer than 11 characters, and +// should be passed with padding like this: "myfile bn ". Note the extra +// spaces, and that the dot ('.') is not part of the string that is passed +// to this function. +// +// If the file is found, then it initializes the file for reading, and returns +// the file length. The file can be read by making successive calls to +// SimpleFsReadFileSector(). +// +// The function only searches the root directory and ignores any +// subdirectories. It also ignores any int32_t file name entries, looking only +// at the 8.3 file name for a match. +// +// \return The size of the file if it is found, or 0 if the file could not +// be found. +// +//***************************************************************************** +uint32_t +SimpleFsOpen(char *pcName83) +{ + tDirEntry *pDirEntry; + uint_fast32_t ui32DirSector; + uint_fast32_t ui32FirstCluster; + + // + // Find starting root dir sector, only used for FAT16 + // If FAT32 then this is the first cluster of root dir + // + ui32DirSector = sPartInfo.ui32StartRootDir; + + // + // For FAT32, root dir is like a file, so init a file read of the root dir + // + if(sPartInfo.ui32Type == 32) + { + SimpleFsGetNextFileSector(ui32DirSector); + } + + // + // Search the root directory entry for the firmware file + // + while(1) + { + // + // Read in a directory block. + // + if(sPartInfo.ui32Type == 16) + { + // + // For FAT16, read in a sector of the root directory + // + if(SimpleFsReadMediaSector(ui32DirSector, g_pui8SectorBuf)) + { + return(0); + } + } + else + { + // + // For FAT32, the root directory is treated like a file. + // The root directory sector will be loaded into the sector buf + // + if(SimpleFsGetNextFileSector(0) == 0) + { + return(0); + } + } + + // + // Initialize the directory entry pointer to the first entry of + // this sector. + // + pDirEntry = (tDirEntry *)g_pui8SectorBuf; + + // + // Iterate through all the directory entries in this sector + // + while((uint8_t *)pDirEntry < &g_pui8SectorBuf[512]) + { + // + // If the 8.3 filename of this entry matches the firmware + // file name, then we have a match, so return a pointer to + // this entry. + // + if(!strncmp(pDirEntry->pcFileName, pcName83, 11)) + { + // + // Compute the starting cluster of the file + // + ui32FirstCluster = pDirEntry->ui16Cluster; + if(sPartInfo.ui32Type == 32) + { + // + // For FAT32, add in the upper word of the + // starting cluster number + // + ui32FirstCluster += pDirEntry->ui16ClusterHi << 16; + } + + // + // Initialize the start of the file + // + SimpleFsGetNextFileSector(ui32FirstCluster); + return(pDirEntry->ui32FileSize); + } + + // + // Advance to the next entry in this sector. + // + pDirEntry++; + } + + // + // Need to get the next sector in the directory. Handled + // differently depending on if this is FAT16 or 32 + // + if(sPartInfo.ui32Type == 16) + { + // + // FAT16: advance sectors as int32_t as there are more possible + // entries. + // + sPartInfo.ui16MaxRootEntries -= 512 / 32; + if(sPartInfo.ui16MaxRootEntries) + { + ui32DirSector++; + } + else + { + // + // Ran out of directory entries and didn't find the file, + // so return a null. + // + return(0); + } + } + else + { + // + // FAT32: there is nothing to compute here. The next root + // dir sector will be fetched at the top of the loop + // + } + } +} + +//***************************************************************************** +// +// Close the Doxygen group. +// @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c123g/usb_stick_update/simple_fs.h b/boards/dk-tm4c123g/usb_stick_update/simple_fs.h new file mode 100644 index 0000000..83dfad5 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/simple_fs.h @@ -0,0 +1,105 @@ +//***************************************************************************** +// +// simple_fs.h - Header for simple FAT file system support +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#ifndef __SIMPLE_FS_H__ +#define __SIMPLE_FS_H__ + +//***************************************************************************** +// +// \addtogroup simple_fs_api +// @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Macro to read a single sector from a file that was opened with +// SimpleFsOpen() +// +// This convenience macro maps to the function SimpleFsGetNextFileSector() +// called with a parameter of 0. It should be used to read successive +// sectors from a file after the file has been opened with SimpleFsOpen(). +// +// When a sector is read, it is loaded into the sector buffer that was passed +// when SimpleFsInit() was called. +// +// A non-zero value will be returned to the caller as int32_t as successive +// sectors are successfully read into the sector buffer. At the end of the +// file, or if there is any error, then a value of 0 is returned. +// +// Note that the a whole sector is always loaded, even if the end of +// a file does not fill the last sector. It is the responsibility of the +// caller to track the file size and to deal with a partially full last +// sector. +// +// \return Non-zero if a sector was read into the sector buffer, or +// 0 if there are no more sectors or if any error occurred. +// +//***************************************************************************** +#define SimpleFsReadFileSector() SimpleFsGetNextFileSector(0) + +//***************************************************************************** +// +// Read a single sector from the application-specific storage device into +// the sector buffer. +// +// \param ui32Sector is the absolute sector number to read from the storage +// device +// \param pui8SectorBuf is a pointer to a 512 byte buffer where the sector +// data should be written +// +// This function is used by the simple file system functions to read a sector +// of data from a storage device. It must be implemented as part of the +// application specific code. For example, it could be used to read sectors +// from a USB mass storage device, or from an SD card, or any device that can +// be used to store a FAT file system. Note that the sector size is always +// assumed to be 512 bytes. +// +// \return Zero value if a sector of data was successfully read from the +// device and stored in the sector buffer, non-zero if not successful. +// +//***************************************************************************** +// +// This function to be supplied by the client +// +extern uint32_t SimpleFsReadMediaSector(uint_fast32_t ui32Sector, + uint8_t *pui8SectorBuf); + +//***************************************************************************** +// +// Close the Doxygen group. +// @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Functions to help with accessing the FAT file system on a storage device +// +//**************************************************************************** +extern uint32_t SimpleFsInit(uint8_t *pui8SectorBuf); +extern uint32_t SimpleFsOpen(char *pcName83); +extern uint32_t SimpleFsGetNextFileSector(uint_fast32_t ui32StartCluster); + +#endif // __SIMPLE_FS_H__ diff --git a/boards/dk-tm4c123g/usb_stick_update/startup_ccs.c b/boards/dk-tm4c123g/usb_stick_update/startup_ccs.c new file mode 100644 index 0000000..38e68e7 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void AppForceUpdate(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + AppForceUpdate, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_stick_update/startup_ewarm.c b/boards/dk-tm4c123g/usb_stick_update/startup_ewarm.c new file mode 100644 index 0000000..0fe4fa7 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void AppForceUpdate(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + AppForceUpdate, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_stick_update/startup_gcc.c b/boards/dk-tm4c123g/usb_stick_update/startup_gcc.c new file mode 100644 index 0000000..c6c28b0 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void AppForceUpdate(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + AppForceUpdate, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/usb_stick_update/startup_rvmdk.S b/boards/dk-tm4c123g/usb_stick_update/startup_rvmdk.S new file mode 100644 index 0000000..3f2ca04 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN AppForceUpdate + EXTERN USB0HostIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD AppForceUpdate ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0HostIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.c b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.c new file mode 100644 index 0000000..0821d9e --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.c @@ -0,0 +1,929 @@ +//***************************************************************************** +// +// usb_stick_update.c - Example to update flash from a USB memory stick. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_flash.h" +#include "inc/hw_gpio.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhmsc.h" +#include "simple_fs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

USB Memory Stick Updater (usb_stick_update)

+//! +//! This example application behaves the same way as a boot loader. It resides +//! at the beginning of flash, and will read a binary file from a USB memory +//! stick and program it into another location in flash. Once the user +//! application has been programmed into flash, this program will always start +//! the user application until requested to load a new application. +//! +//! When this application starts, if there is a user application already in +//! flash (at \b APP_START_ADDRESS), then it will just run the user application. +//! It will attempt to load a new application from a USB memory stick under +//! the following conditions: +//! +//! - no user application is present at \b APP_START_ADDRESS +//! - the user application has requested an update by transferring control +//! to the updater +//! - the user holds down the eval board push button when the board is reset +//! +//! When this application is attempting to perform an update, it will wait +//! forever for a USB memory stick to be plugged in. Once a USB memory stick +//! is found, it will search the root directory for a specific file name, which +//! is \e FIRMWARE.BIN by default. This file must be a binary image of the +//! program you want to load (the .bin file), linked to run from the correct +//! address, at \b APP_START_ADDRESS. +//! +//! The USB memory stick must be formatted as a FAT16 or FAT32 file system +//! (the normal case), and the binary file must be located in the root +//! directory. Other files can exist on the memory stick but they will be +//! ignored. +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines the number of times to call to check if the attached device is +// ready. +// +//***************************************************************************** +#define USBMSC_DRIVE_RETRY 4 + +//***************************************************************************** +// +// The name of the binary firmware file on the USB stick. This is the user +// application that will be searched for and loaded into flash if it is found. +// Note that the name of the file must be 11 characters total, 8 for the base +// name and 3 for the extension. If the actual file name has fewer characters +// then it must be padded with spaces. This macro should not contain the dot +// "." for the extension. +// +// Examples: firmware.bin --> "FIRMWAREBIN" +// myfile.bn --> "MYFILE BN " +// +//***************************************************************************** +#define USB_UPDATE_FILENAME "FIRMWAREBIN" + +//***************************************************************************** +// +// The size of the flash for this microcontroller. +// +//***************************************************************************** +#define FLASH_SIZE (256 * 1024) + +//***************************************************************************** +// +// The starting address for the application that will be loaded into flash +// memory from the USB stick. This address must be high enough to be above +// the USB stick updater, and must be on a 1K boundary. +// Note that the application that will be loaded must also be linked to run +// from this address. +// +//***************************************************************************** +#define APP_START_ADDRESS 0x4800 + +//***************************************************************************** +// +// A memory location and value that is used to indicate that the application +// wants to force an update. +// +//***************************************************************************** +#define FORCE_UPDATE_ADDR 0x20004000 +#define FORCE_UPDATE_VALUE 0x1234cdef + +//***************************************************************************** +// +// The prototype for the function that is used to call the user application. +// +//***************************************************************************** +void CallApplication(uint_fast32_t ui32StartAddr); + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. In this application uDMA is only used for USB, +// so only the first 6 channels are needed. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_sDMAControlTable[6]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_sDMAControlTable, 1024) +tDMAControlTable g_sDMAControlTable[6]; +#else +tDMAControlTable g_sDMAControlTable[6] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the MSC class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostMSCClassDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +#define NUM_CLASS_DRIVERS (sizeof(g_ppHostClassDrivers) / \ + sizeof(g_ppHostClassDrivers[0])) + +//***************************************************************************** +// +// Hold the current state for the application. +// +//***************************************************************************** +volatile enum +{ + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Mass storage device is being enumerated. + // + STATE_DEVICE_ENUM, +} +g_eState; + +//***************************************************************************** +// +// The instance data for the MSC driver. +// +//***************************************************************************** +tUSBHMSCInstance *g_psMSCInstance = 0; + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pHCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// A buffer for holding sectors read from the storage device +// +//***************************************************************************** +static uint8_t g_ui8SectorBuf[512]; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + for(;;) + { + } +} +#endif + +//***************************************************************************** +// +// Read a sector from the USB mass storage device. +// +// \param ui32Sector is the sector to read from the connected USB mass storage +// device (memory stick) +// \param pui8Buf is a pointer to the buffer where the sector data should be +// stored +// +// This is the application-specific implementation of a function to read +// sectors from a storage device, in this case a USB mass storage device. +// This function is called from the \e simple_fs.c file when it needs to read +// data from the storage device. +// +// \return Non-zero if data was read from the device, 0 if no data was read. +// +//***************************************************************************** +uint32_t +SimpleFsReadMediaSector(uint_fast32_t ui32Sector, uint8_t *pui8Buf) +{ + // + // Return the requested sector from the connected USB mass storage + // device. + // + return(USBHMSCBlockRead(g_psMSCInstance, ui32Sector, pui8Buf, 1)); +} + +//***************************************************************************** +// +// This is the callback from the MSC driver. +// +// \param ui32Instance is the driver instance which is needed when communicating +// with the driver. +// \param ui32Event is one of the events defined by the driver. +// \param pvData is a pointer to data passed into the initial call to register +// the callback. +// +// This function handles callback events from the MSC driver. The only events +// currently handled are the \b MSC_EVENT_OPEN and \b MSC_EVENT_CLOSE. This +// allows the main routine to know when an MSC device has been detected and +// enumerated and when an MSC device has been removed from the system. +// +// \return Returns \e true on success or \e false on failure. +// +//***************************************************************************** +static void +MSCCallback(tUSBHMSCInstance *psMSCInstance, uint32_t ui32Event, void *pvData) +{ + // + // Determine the event. + // + switch(ui32Event) + { + // + // Called when the device driver has successfully enumerated an MSC + // device. + // + case MSC_EVENT_OPEN: + { + // + // Proceed to the enumeration state. + // + g_eState = STATE_DEVICE_ENUM; + break; + } + + // + // Called when the device driver has been unloaded due to error or + // the device is no longer present. + // + case MSC_EVENT_CLOSE: + { + // + // Go back to the "no device" state and wait for a new connection. + // + g_eState = STATE_NO_DEVICE; + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// Read the application image from the file system and program it into flash. +// +// This function will attempt to open and read the firmware image file from +// the mass storage device. If the file is found it will be programmed into +// flash. The name of the file to be read is configured by the macro +// \b USB_UPDATE_FILENAME. It will be programmed into flash starting at the +// address specified by APP_START_ADDRESS. +// +// \return Zero if successful or non-zero if the file cannot be read or +// programmed. +// +//***************************************************************************** +uint32_t +ReadAppAndProgram(void) +{ + uint_fast32_t ui32FlashEnd; + uint_fast32_t ui32FileSize; + uint_fast32_t ui32DataSize; + uint_fast32_t ui32Remaining; + uint_fast32_t ui32ProgAddr; + uint_fast32_t ui32SavedRegs[2]; + volatile uint_fast32_t ui32Idx; + uint_fast32_t ui32DriveTimeout; + + // + // Initialize the drive timeout. + // + ui32DriveTimeout = USBMSC_DRIVE_RETRY; + + // + // Check to see if the mass storage device is ready. Some large drives + // take a while to be ready, so retry until they are ready. + // + while(USBHMSCDriveReady(g_psMSCInstance)) + { + // + // Wait about 500ms before attempting to check if the + // device is ready again. + // + SysCtlDelay(SysCtlClockGet()/(3*2)); + + // + // Decrement the retry count. + // + ui32DriveTimeout--; + + // + // If the timeout is hit then return with a failure. + // + if(ui32DriveTimeout == 0) + { + return(1); + } + } + + // + // Initialize the file system and return if error. + // + if(SimpleFsInit(g_ui8SectorBuf)) + { + return(1); + } + + // + // Attempt to open the firmware file, retrieving the file/image size. + // A file size of error means the file was not there, or there was an + // error. + // + ui32FileSize = SimpleFsOpen(USB_UPDATE_FILENAME); + if(ui32FileSize == 0) + { + return(1); + } + + // + // Get the size of flash. This is the ending address of the flash. + // If reserved space is configured, then the ending address is reduced + // by the amount of the reserved block. + // + ui32FlashEnd = FLASH_SIZE; +#ifdef FLASH_RSVD_SPACE + ui32FlashEnd -= FLASH_RSVD_SPACE; +#endif + + // + // If flash code protection is not used, then change the ending address + // to be the ending of the application image. This will be the highest + // flash page that will be erased and so only the necessary pages will + // be erased. If flash code protection is enabled, then all of the + // application area pages will be erased. + // +#ifndef FLASH_CODE_PROTECTION + ui32FlashEnd = ui32FileSize + APP_START_ADDRESS; +#endif + + // + // Check to make sure the file size is not too large to fit in the flash. + // If it is too large, then return an error. + // + if((ui32FileSize + APP_START_ADDRESS) > ui32FlashEnd) + { + return(1); + } + + // + // Enter a loop to erase all the requested flash pages beginning at the + // application start address (above the USB stick updater). + // + for(ui32Idx = APP_START_ADDRESS; ui32Idx < ui32FlashEnd; ui32Idx += 1024) + { + ROM_FlashErase(ui32Idx); + } + + // + // Enter a loop to read sectors from the application image file and + // program into flash. Start at the user app start address (above the USB + // stick updater). + // + ui32ProgAddr = APP_START_ADDRESS; + ui32Remaining = ui32FileSize; + while(SimpleFsReadFileSector()) + { + // + // Compute how much data was read from this sector and adjust the + // remaining amount. + // + ui32DataSize = ui32Remaining >= 512 ? 512 : ui32Remaining; + ui32Remaining -= ui32DataSize; + + // + // Special handling for the first block of the application. + // This block contains as the first two location the application's + // initial stack pointer and instruction pointer. The USB updater + // relied on the values in these locations to determine if a valid + // application is present. When there is a valid application the + // updater runs the user application. Otherwise the updater attempts + // to load a new application. + // In order to prevent a partially programmed imaged (due to some + // error occurring while programming), the first two locations are + // not programmed until all of the rest of the image has been + // successfully loaded into the flash. This way if there is some error, + // the updater will detect that a user application is not present and + // will not attempt to run it. + // + // For the first block, do not program the first two word locations + // (8 bytes). These two words will be programmed later, after + // everything else. + // + if(ui32ProgAddr == APP_START_ADDRESS) + { + uint32_t *pui32Temp; + + pui32Temp = (uint32_t *)g_ui8SectorBuf; + ui32SavedRegs[0] = pui32Temp[0]; + ui32SavedRegs[1] = pui32Temp[1]; + + // + // Call the function to program a block of flash. Skip the first + // two words (8 bytes) since these contain the initial SP and PC. + // + ROM_FlashProgram((uint32_t *)&g_ui8SectorBuf[8], + ui32ProgAddr + 8, + ((ui32DataSize - 8) + 3) & ~3); + } + + // + // All other blocks except the first block + // + else + { + // + // Call the function to program a block of flash. The length of the + // block passed to the flash function must be divisible by 4. + // + ROM_FlashProgram((uint32_t *)g_ui8SectorBuf, ui32ProgAddr, + (ui32DataSize + 3) & ~3); + } + + // + // If there is more image to program, then update the programming + // address. Progress will continue to the next iteration of + // the while loop. + // + if(ui32Remaining) + { + ui32ProgAddr += ui32DataSize; + } + + // + // Otherwise we are done programming so perform final steps. + // Program the first two words of the image that were saved earlier, + // and return a success indication. + // + else + { + ROM_FlashProgram((uint32_t *)ui32SavedRegs, APP_START_ADDRESS, + 8); + + return(0); + } + } + + // + // If we make it here, that means that an attempt to read a sector of + // data from the device was not successful. That means that the complete + // user app has not been programmed into flash, so just return an error + // indication. + // + return(1); +} + +//***************************************************************************** +// +// This is the main routine for performing an update from a mass storage +// device. +// +// This function forms the main loop of the USB stick updater. It polls for +// a USB mass storage device to be connected, Once a device is connected +// it will attempt to read a firmware image from the device and load it into +// flash. +// +// \return None. +// +//***************************************************************************** +void +UpdaterUSB(void) +{ + // + // Loop forever, running the USB host driver. + // + while(1) + { + USBHCDMain(); + + // + // Check for a state change from the USB driver. + // + switch(g_eState) + { + // + // This state means that a mass storage device has been + // plugged in and enumerated. + // + case STATE_DEVICE_ENUM: + { + // + // Attempt to read the application image from the storage + // device and load it into flash memory. + // + if(ReadAppAndProgram()) + { + // + // There was some error reading or programming the app, + // so reset the state to no device which will cause a + // wait for a new device to be plugged in. + // + g_eState = STATE_NO_DEVICE; + } + else + { + // + // User app load and programming was successful, so reboot + // the micro. Perform a software reset request. This + // will cause the microcontroller to reset; no further + // code will be executed. + // + HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | + NVIC_APINT_SYSRESETREQ; + + // + // The microcontroller should have reset, so this should + // never be reached. Just in case, loop forever. + // + while(1) + { + } + } + break; + } + + // + // This state means that there is no device present, so just + // do nothing until something is plugged in. + // + case STATE_NO_DEVICE: + { + break; + } + } + } +} + +//***************************************************************************** +// +// Configure the USB controller and power the bus. +// +// This function configures the USB controller for host operation. +// It is assumed that the main system clock has been configured at this point. +// +// \return None. +// +//***************************************************************************** +void +ConfigureUSBInterface(void) +{ + // + // Enable the uDMA controller and set up the control table base. + // This is required by usblib. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + uDMAEnable(); + uDMAControlBaseSet(g_sDMAControlTable); + + // + // Enable the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Set the USB pins to be controlled by the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Register the host class driver + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, NUM_CLASS_DRIVERS); + + // + // Open an instance of the mass storage class driver. + // + g_psMSCInstance = USBHMSCDriveOpen(0, MSCCallback); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Force the USB mode to host with no callback on mode changes since + // there should not be any. + // + USBStackModeSet(0, eUSBModeForceHost, 0); + + // + // Wait 10ms for the pin to go low. + // + SysCtlDelay(SysCtlClockGet()/100); + + // + // Initialize the host controller. + // + USBHCDInit(0, g_pHCDPool, HCD_MEMORY_SIZE); +} + +//***************************************************************************** +// +// Generic configuration is handled in this function. +// +// This function is called by the start up code to perform any configuration +// necessary before calling the update routine. It is responsible for setting +// the system clock to the expected rate and setting flash programming +// parameters prior to calling ConfigureUSBInterface() to set up the USB +// hardware. +// +// \return None. +// +//***************************************************************************** +void +UpdaterMain(void) +{ + // + // Make sure NVIC points at the correct vector table. + // + HWREG(NVIC_VTABLE) = 0; + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure the USB interface and power the bus. + // + ConfigureUSBInterface(); + + // + // Call the updater function. This will attempt to load a new image + // into flash from a USB memory stick. + // + UpdaterUSB(); +} + +//***************************************************************************** +// +// Main entry point for the USB stick update example. +// +// This function will check to see if a flash update should be performed from +// the USB memory stick, or if the user application should just be run without +// any update. +// +// The following checks are made, any of which mean that an update should be +// performed: +// - the PC and SP for the user app do not appear to be valid +// - a memory location contains a certain value, meaning the user app wants +// to force an update +// - the user button on the eval board is being pressed, meaning the user wants +// to force an update even if there is a valid user app in memory +// +// If any of the above checks are true, then that means that an update should +// be attempted. The USB stick updater will then wait for a USB stick to be +// plugged in, and once it is look for a firmware update file. +// +// If none of the above checks are true, then the user application that is +// already in flash is run and no update is performed. +// +// \return None. +// +//***************************************************************************** +int +main(void) +{ + uint32_t *pui32App; + + // + // See if the first location is 0xfffffffff or something that does not + // look like a stack pointer, or if the second location is 0xffffffff or + // something that does not look like a reset vector. + // + pui32App = (uint32_t *)APP_START_ADDRESS; + if((pui32App[0] == 0xffffffff) || + ((pui32App[0] & 0xfff00000) != 0x20000000) || + (pui32App[1] == 0xffffffff) || + ((pui32App[1] & 0xfff00001) != 0x00000001)) + { + // + // App starting stack pointer or PC is not valid, so force an update. + // + UpdaterMain(); + } + + // + // Check to see if the application has requested an update + // + if(HWREG(FORCE_UPDATE_ADDR) == FORCE_UPDATE_VALUE) + { + HWREG(FORCE_UPDATE_ADDR) = 0; + UpdaterMain(); + } + + // + // Enable the GPIO input for the user button. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM); + ROM_GPIODirModeSet(GPIO_PORTM_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(GPIO_PORTM_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Check if the button is pressed, if so then force an update. + // + if(ROM_GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_4) == 0) + { + UpdaterMain(); + } + + // + // If we get to here that means that none of the conditions that should + // cause an update are true. Therefore, call the application. + // + CallApplication(APP_START_ADDRESS); +} + +//***************************************************************************** +// +// This function is called from the application to request an update. The +// address of this function is stored in the SVC vector at offset 0x2C, so +// the user application can call it by using a statement like this: +// +// (*((void (*)(void))(*(uint32_t *)0x2c)))(); +// +//***************************************************************************** +void +AppForceUpdate(void) +{ + // + // Set a value in a memory location to indicate that the app requests + // an update. Then cause the processor to reset. + // + HWREG(FORCE_UPDATE_ADDR) = FORCE_UPDATE_VALUE; + HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ; +} + +//***************************************************************************** +// +// This function is used to call the user application. It will set the NVIC +// to point at the user app's vector table, load up the user app's stack +// pointer, and then jump to the application. +// +// This function must be programmed in assembly since it needs to directly +// manipulate the value in the stack pointer, and because it needs to perform +// a direct branch to the user app and not a function call (bl). +// +//***************************************************************************** +#if defined(codered) || defined(gcc) || defined(sourcerygxx) +void __attribute__((naked)) +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table to the beginning of the app in flash. + // + HWREG(NVIC_VTABLE) = ui32StartAddr; + + // + // Load the stack pointer from the application's vector table. + // + __asm(" ldr r1, [r0]\n" + " mov sp, r1"); + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + __asm(" ldr r0, [r0, #4]\n" + " bx r0\n"); +} +#elif defined(ewarm) +void +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table to the beginning of the app in flash. + // + HWREG(NVIC_VTABLE) = ui32StartAddr; + + // + // Load the stack pointer from the application's vector table. + // + __asm(" ldr r1, [r0]\n" + " mov sp, r1"); + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + __asm(" ldr r0, [r0, #4]\n" + " bx r0\n"); +} +#elif defined(rvmdk) || defined(__ARMCC_VERSION) +__asm void +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table address to the beginning of the application. + // + ldr r1, =0xe000ed08 + str r0, [r1] + + // + // Load the stack pointer from the application's vector table. + // + ldr r1, [r0] + mov sp, r1 + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + ldr r0, [r0, #4] + bx r0 +} +#elif defined(ccs) +void +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table to the beginning of the app in flash. + // + HWREG(NVIC_VTABLE) = ui32StartAddr; + + // + // Load the stack pointer from the application's vector table. + // + __asm(" ldr r1, [r0]\n" + " mov sp, r1\n"); + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + __asm(" ldr r0, [r0, #4]\n" + " bx r0\n"); +} +#else +#error Undefined compiler! +#endif + diff --git a/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ewd b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ewp b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ewp new file mode 100644 index 0000000..584a878 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ewp @@ -0,0 +1,790 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\simple_fs.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_stick_update.c + + + diff --git a/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.icf b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.icf new file mode 100644 index 0000000..572efe0 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_stick_update.icf - Linker configuration file for usb_stick_update. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ld b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ld new file mode 100644 index 0000000..2c91e00 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_stick_update.ld - Linker configuration file for usb_stick_update. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.sct b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.sct new file mode 100644 index 0000000..458c848 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_stick_update.sct - Linker configuration file for usb_stick_update. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.uvopt b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.uvopt new file mode 100644 index 0000000..493928a --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_stick_update + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + simple_fs.c + simple_fs.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_stick_update.c + usb_stick_update.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.uvproj b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.uvproj new file mode 100644 index 0000000..a2321e7 --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + usb_stick_update + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_stick_update + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_stick_update.bin .\rvmdk\usb_stick_update.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_stick_update.sct + + + --entry Reset_Handler + + + + + + + + Source + + + simple_fs.c + 1 + simple_fs.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_stick_update.c + 1 + .\usb_stick_update.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/usb_stick_update/usb_stick_update_ccs.cmd b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update_ccs.cmd new file mode 100644 index 0000000..494d30c --- /dev/null +++ b/boards/dk-tm4c123g/usb_stick_update/usb_stick_update_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_stick_update_ccs.cmd - CCS linker configuration file for usb_stick_update. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c123g/watchdog/Makefile b/boards/dk-tm4c123g/watchdog/Makefile new file mode 100644 index 0000000..81e6c0f --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/Makefile @@ -0,0 +1,88 @@ +#****************************************************************************** +# +# Makefile - Rules for building the watchdog example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the watchdog example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/watchdog.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the watchdog example. +# +${COMPILER}/watchdog.axf: ${COMPILER}/buttons.o +${COMPILER}/watchdog.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/watchdog.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/watchdog.axf: ${COMPILER}/watchdog.o +${COMPILER}/watchdog.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/watchdog.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/watchdog.axf: watchdog.ld +SCATTERgcc_watchdog=watchdog.ld +ENTRY_watchdog=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c123g/watchdog/ccs/.ccsimportspec b/boards/dk-tm4c123g/watchdog/ccs/.ccsimportspec new file mode 100644 index 0000000..6379126 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c123g/watchdog/ccs/.ccsproject b/boards/dk-tm4c123g/watchdog/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c123g/watchdog/ccs/.cproject b/boards/dk-tm4c123g/watchdog/ccs/.cproject new file mode 100644 index 0000000..6becf87 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/ccs/.cproject @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/watchdog/ccs/.project b/boards/dk-tm4c123g/watchdog/ccs/.project new file mode 100644 index 0000000..e9c65b3 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/ccs/.project @@ -0,0 +1,60 @@ + + + watchdog + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/watchdog/startup_ccs.c + + + watchdog.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/watchdog/watchdog.c + + + watchdog_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c123g/watchdog/watchdog_ccs.cmd + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/dk-tm4c123g/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c123g/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c123g/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c123g/watchdog/ccs/Debug/watchdog.bin b/boards/dk-tm4c123g/watchdog/ccs/Debug/watchdog.bin new file mode 100644 index 0000000..7b6da9b Binary files /dev/null and b/boards/dk-tm4c123g/watchdog/ccs/Debug/watchdog.bin differ diff --git a/boards/dk-tm4c123g/watchdog/ccs/Debug/watchdog.out b/boards/dk-tm4c123g/watchdog/ccs/Debug/watchdog.out new file mode 100644 index 0000000..1279f7e Binary files /dev/null and b/boards/dk-tm4c123g/watchdog/ccs/Debug/watchdog.out differ diff --git a/boards/dk-tm4c123g/watchdog/ccs/macros.ini_initial b/boards/dk-tm4c123g/watchdog/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c123g/watchdog/ccs/target_config.ccxml b/boards/dk-tm4c123g/watchdog/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c123g/watchdog/ewarm/Exe/watchdog.bin b/boards/dk-tm4c123g/watchdog/ewarm/Exe/watchdog.bin new file mode 100644 index 0000000..13d896c Binary files /dev/null and b/boards/dk-tm4c123g/watchdog/ewarm/Exe/watchdog.bin differ diff --git a/boards/dk-tm4c123g/watchdog/ewarm/Exe/watchdog.out b/boards/dk-tm4c123g/watchdog/ewarm/Exe/watchdog.out new file mode 100644 index 0000000..ec2fd86 Binary files /dev/null and b/boards/dk-tm4c123g/watchdog/ewarm/Exe/watchdog.out differ diff --git a/boards/dk-tm4c123g/watchdog/gcc/watchdog.axf b/boards/dk-tm4c123g/watchdog/gcc/watchdog.axf new file mode 100644 index 0000000..2f759ac Binary files /dev/null and b/boards/dk-tm4c123g/watchdog/gcc/watchdog.axf differ diff --git a/boards/dk-tm4c123g/watchdog/gcc/watchdog.bin b/boards/dk-tm4c123g/watchdog/gcc/watchdog.bin new file mode 100644 index 0000000..a30fc8e Binary files /dev/null and b/boards/dk-tm4c123g/watchdog/gcc/watchdog.bin differ diff --git a/boards/dk-tm4c123g/watchdog/readme.txt b/boards/dk-tm4c123g/watchdog/readme.txt new file mode 100644 index 0000000..3b6dda1 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/readme.txt @@ -0,0 +1,28 @@ +Watchdog + +This example application demonstrates the use of the watchdog as a simple +heartbeat for the system. If the watchdog is not periodically fed, it will +reset the system. Each time the watchdog is fed, the LED is inverted so +that it is easy to see that it is being fed, which occurs once every +second. To stop the watchdog being fed and, hence, cause a system reset, +press the select button. + +------------------------------------------------------------------------------- + +Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. diff --git a/boards/dk-tm4c123g/watchdog/rvmdk/watchdog.axf b/boards/dk-tm4c123g/watchdog/rvmdk/watchdog.axf new file mode 100644 index 0000000..53d506a Binary files /dev/null and b/boards/dk-tm4c123g/watchdog/rvmdk/watchdog.axf differ diff --git a/boards/dk-tm4c123g/watchdog/rvmdk/watchdog.bin b/boards/dk-tm4c123g/watchdog/rvmdk/watchdog.bin new file mode 100644 index 0000000..e51e150 Binary files /dev/null and b/boards/dk-tm4c123g/watchdog/rvmdk/watchdog.bin differ diff --git a/boards/dk-tm4c123g/watchdog/startup_ccs.c b/boards/dk-tm4c123g/watchdog/startup_ccs.c new file mode 100644 index 0000000..be5082e --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void WatchdogIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + WatchdogIntHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/watchdog/startup_ewarm.c b/boards/dk-tm4c123g/watchdog/startup_ewarm.c new file mode 100644 index 0000000..e72b2a7 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void WatchdogIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + WatchdogIntHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/watchdog/startup_gcc.c b/boards/dk-tm4c123g/watchdog/startup_gcc.c new file mode 100644 index 0000000..763ea43 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void WatchdogIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + WatchdogIntHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c123g/watchdog/startup_rvmdk.S b/boards/dk-tm4c123g/watchdog/startup_rvmdk.S new file mode 100644 index 0000000..68ab6f4 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN WatchdogIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD WatchdogIntHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c123g/watchdog/watchdog.c b/boards/dk-tm4c123g/watchdog/watchdog.c new file mode 100644 index 0000000..50a31e2 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/watchdog.c @@ -0,0 +1,268 @@ +//***************************************************************************** +// +// watchdog.c - Watchdog timer example. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/watchdog.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Watchdog (watchdog)

+//! +//! This example application demonstrates the use of the watchdog as a simple +//! heartbeat for the system. If the watchdog is not periodically fed, it will +//! reset the system. Each time the watchdog is fed, the LED is inverted so +//! that it is easy to see that it is being fed, which occurs once every +//! second. To stop the watchdog being fed and, hence, cause a system reset, +//! press the select button. +// +//***************************************************************************** + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Flag to tell the watchdog interrupt handler whether or not to clear the +// interrupt (feed the watchdog). +// +//***************************************************************************** +volatile bool g_bFeedWatchdog = true; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the watchdog. This feeds the dog (so that the +// processor does not get reset) and winks the LED connected to GPIO B3. +// +//***************************************************************************** +void +WatchdogIntHandler(void) +{ + // + // If we have been told to stop feeding the watchdog, return immediately + // without clearing the interrupt. This will cause the system to reset + // next time the watchdog interrupt fires. + // + if(!g_bFeedWatchdog) + { + return; + } + + // + // Clear the watchdog interrupt. + // + ROM_WatchdogIntClear(WATCHDOG0_BASE); + + // + // Invert the GPIO PF3 value. + // + ROM_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, + (ROM_GPIOPinRead(GPIO_PORTG_BASE, GPIO_PIN_2) ^ + GPIO_PIN_2)); +} + +//***************************************************************************** +// +// This function is called when the select button is pressed. +// +//***************************************************************************** +static int32_t +SelectButtonPressed(void) +{ + // + // Find the X center of the display + // + int32_t i32CenterX = GrContextDpyWidthGet(&g_sContext) / 2; + + // + // Let the user know that the button has been pressed and that the + // watchdog is being starved. + // + GrStringDrawCentered(&g_sContext, "Starving", -1, i32CenterX, 14, 1); + GrStringDrawCentered(&g_sContext, "Watchdog", -1, i32CenterX, 24, 1); + GrStringDrawCentered(&g_sContext, "System", -1, i32CenterX, 36, 1); + GrStringDrawCentered(&g_sContext, " will ", -1, i32CenterX, 46, 1); + GrStringDrawCentered(&g_sContext, "reset ...", -1, i32CenterX, 56, 1); + + // + // Set the flag that tells the interrupt handler not to clear the + // watchdog interrupt. + // + g_bFeedWatchdog = false; + + return(0); +} + +//***************************************************************************** +// +// This example demonstrates the use of the watchdog timer. +// +//***************************************************************************** +int +main(void) +{ + int_fast32_t i32CenterX; + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display and buttons drivers. + // + CFAL96x64x16Init(); + ButtonsInit(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + i32CenterX = GrContextDpyWidthGet(&g_sContext) / 2; + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "watchdog", -1, i32CenterX, 4, 0); + + // + // Show the state and offer some instructions to the user. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "Feeding", -1, i32CenterX, 14, 1); + GrStringDrawCentered(&g_sContext, "Watchdog", -1, i32CenterX, 24, 1); + GrStringDrawCentered(&g_sContext, "Press", -1, i32CenterX, 36, 1); + GrStringDrawCentered(&g_sContext, "Select", -1, i32CenterX, 46, 1); + GrStringDrawCentered(&g_sContext, "to stop", -1, i32CenterX, 56, 1); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_WDOG0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + + // + // Enable processor interrupts. + // + ROM_IntMasterEnable(); + + // + // Set GPIO PG2 as an output. This drives an LED on the board that will + // toggle when a watchdog interrupt is processed. + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE, GPIO_PIN_2); + ROM_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, 0); + + // + // Enable the watchdog interrupt. + // + ROM_IntEnable(INT_WATCHDOG); + + // + // Set the period of the watchdog timer. + // + ROM_WatchdogReloadSet(WATCHDOG0_BASE, ROM_SysCtlClockGet()); + + // + // Enable reset generation from the watchdog timer. + // + ROM_WatchdogResetEnable(WATCHDOG0_BASE); + + // + // Enable the watchdog timer. + // + ROM_WatchdogEnable(WATCHDOG0_BASE); + + // + // Loop forever while the LED winks as watchdog interrupts are handled. + // + while(1) + { + // + // Poll for the select button pressed + // + uint8_t ui8Buttons = ButtonsPoll(0, 0); + if(ui8Buttons & SELECT_BUTTON) + { + SelectButtonPressed(); + while(1) + { + } + } + } +} diff --git a/boards/dk-tm4c123g/watchdog/watchdog.ewd b/boards/dk-tm4c123g/watchdog/watchdog.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/watchdog.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c123g/watchdog/watchdog.ewp b/boards/dk-tm4c123g/watchdog/watchdog.ewp new file mode 100644 index 0000000..a5e8172 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/watchdog.ewp @@ -0,0 +1,795 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\watchdog.c + + + diff --git a/boards/dk-tm4c123g/watchdog/watchdog.icf b/boards/dk-tm4c123g/watchdog/watchdog.icf new file mode 100644 index 0000000..965dd4e --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/watchdog.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// watchdog.icf - Linker configuration file for watchdog. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c123g/watchdog/watchdog.ld b/boards/dk-tm4c123g/watchdog/watchdog.ld new file mode 100644 index 0000000..4a131ba --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/watchdog.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * watchdog.ld - Linker configuration file for watchdog. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c123g/watchdog/watchdog.sct b/boards/dk-tm4c123g/watchdog/watchdog.sct new file mode 100644 index 0000000..c24614f --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/watchdog.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; watchdog.sct - Linker configuration file for watchdog. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c123g/watchdog/watchdog.uvopt b/boards/dk-tm4c123g/watchdog/watchdog.uvopt new file mode 100644 index 0000000..ec58b6b --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/watchdog.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + watchdog + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\watchdog.c + watchdog.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c123g/watchdog/watchdog.uvproj b/boards/dk-tm4c123g/watchdog/watchdog.uvproj new file mode 100644 index 0000000..1426f74 --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/watchdog.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + watchdog + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + watchdog + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\watchdog.bin .\rvmdk\watchdog.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + watchdog.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + watchdog.c + 1 + .\watchdog.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c123g/watchdog/watchdog_ccs.cmd b/boards/dk-tm4c123g/watchdog/watchdog_ccs.cmd new file mode 100644 index 0000000..335643e --- /dev/null +++ b/boards/dk-tm4c123g/watchdog/watchdog_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * watchdog_ccs.cmd - CCS linker configuration file for watchdog. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C123G Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c129x/Makefile b/boards/dk-tm4c129x/Makefile new file mode 100644 index 0000000..f95743a --- /dev/null +++ b/boards/dk-tm4c129x/Makefile @@ -0,0 +1,108 @@ +#****************************************************************************** +# +# Makefile - Rules for building the dk-tm4c129x examples. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# A list of the directories containing the examples. +# +DIRS=aes_cbc_decrypt \ + aes_cbc_encrypt \ + aes_ccm_decrypt \ + aes_ccm_encrypt \ + aes_cmac \ + aes_ecb_decrypt \ + aes_ecb_encrypt \ + aes_gcm_decrypt \ + aes_gcm_encrypt \ + bitband \ + ble_btool \ + ble_central \ + blinky \ + boot_demo_uart \ + boot_demo_usb \ + boot_demo_emac_flash \ + boot_demo_flash \ + boot_emac_flash \ + calibrate \ + crc32 \ + enet_io \ + enet_lwip \ + enet_uip \ + fontview \ + freertos_demo \ + gpio_jtag \ + grlib_demo \ + grlib_driver_test \ + hello \ + hello_widget \ + hibernate \ + interrupts \ + lang_demo \ + mpu_fault \ + qs_weather \ + scribble \ + sd_card \ + sha1_hash \ + sha1_hmac \ + synth \ + tamper \ + tdes_cbc_decrypt \ + tdes_cbc_encrypt \ + timers \ + uart_echo \ + udma_demo \ + usb_dev_bulk \ + usb_dev_chid \ + usb_dev_gamepad \ + usb_dev_keyboard \ + usb_dev_msc \ + usb_dev_serial \ + usb_host_audio \ + usb_host_audio_in \ + usb_host_hub \ + usb_host_keyboard \ + usb_host_mouse \ + usb_host_msc \ + usb_otg_mouse \ + usb_stick_demo \ + usb_stick_update \ + watchdog + +# +# The default rule, which causes the examples to be built. +# +all: + @for i in ${DIRS}; \ + do \ + make -C $${i} || exit $$?; \ + done + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${wildcard *~} __dummy__ + @-for i in ${DIRS}; \ + do \ + make -C $${i} clean; \ + done diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/Makefile b/boards/dk-tm4c129x/aes_cbc_decrypt/Makefile new file mode 100644 index 0000000..13557e9 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the AES128 and AES256 CBC Decryption Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the AES128 and AES256 CBC Decryption Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/aes_cbc_decrypt.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the AES128 and AES256 CBC Decryption Demo. +# +${COMPILER}/aes_cbc_decrypt.axf: ${COMPILER}/aes_cbc_decrypt.o +${COMPILER}/aes_cbc_decrypt.axf: ${COMPILER}/frame.o +${COMPILER}/aes_cbc_decrypt.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/aes_cbc_decrypt.axf: ${COMPILER}/pinout.o +${COMPILER}/aes_cbc_decrypt.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/aes_cbc_decrypt.axf: ${COMPILER}/uartstdio.o +${COMPILER}/aes_cbc_decrypt.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/aes_cbc_decrypt.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/aes_cbc_decrypt.axf: aes_cbc_decrypt.ld +SCATTERgcc_aes_cbc_decrypt=aes_cbc_decrypt.ld +ENTRY_aes_cbc_decrypt=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.c b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.c new file mode 100644 index 0000000..abdbbb5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.c @@ -0,0 +1,691 @@ +//***************************************************************************** +// +// aes_cbc_decrypt.c - Simple AES128 and AES256 CBC decryption demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_aes.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/aes.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

AES CBC Decryption Demo (aes_cbc_decrypt)

+//! +//! Simple demo showing an decryption operation using the AES128 and AES256 +//! modules in CBC mode. A number of blocks of data are decrypted. +//! +//! Please note that the use of interrupts and uDMA is not required for the +//! operation of the module. It is only done for demonstration purposes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Sample plaintext, ciphertext, and key from the NIST SP 800-38A document. +// +//***************************************************************************** +uint32_t g_pui32AESPlainText[16] = +{ + 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373, + 0x578a2dae, 0x9cac031e, 0xac6fb79e, 0x518eaf45, + 0x461cc830, 0x11e45ca3, 0x19c1fbe5, 0xef520a1a, + 0x45249ff6, 0x179b4fdf, 0x7b412bad, 0x10376ce6 +}; + +uint32_t g_pui32AES128Key[4] = +{ + 0x16157e2b, 0xa6d2ae28, 0x8815f7ab, 0x3c4fcf09 +}; + +uint32_t g_pui32AES256Key[8] = +{ + 0x10eb3d60, 0xbe71ca15, 0xf0ae732b, 0x81777d85, + 0x072c351f, 0xd708613b, 0xa310982d, 0xf4df1409 +}; + +uint32_t g_pui32AESIV[4] = +{ + 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c +}; + +uint32_t g_pui32AES128CipherText[16] = +{ + 0xacab4976, 0x46b21981, 0x9b8ee9ce, 0x7d19e912, + 0x9bcb8650, 0xee197250, 0x3a11db95, 0xb2787691, + 0xb8d6be73, 0x3b74c1e3, 0x9ee61671, 0x16952222, + 0xa1caf13f, 0x09ac1f68, 0x30ca0e12, 0xa7e18675 +}; + +uint32_t g_pui32AES256CipherText[16] = +{ + 0x044c8cf5, 0xbaf1e5d6, 0xfbab9e77, 0xd6fb7b5f, + 0x964efc9c, 0x8d80db7e, 0x7b779f67, 0x7d2c70c6, + 0x6933f239, 0xcfbad9a9, 0x63e230a5, 0x61142304, + 0xe205ebb2, 0xfce99bc3, 0x07196cda, 0x1b9d6a8c +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Round up length to nearest 16 byte boundary. This is needed because all +// four data registers must be written at once. This is handled in the AES +// driver, but if using uDMA, the length must rounded up. +// +//***************************************************************************** +uint32_t +LengthRoundUp(uint32_t ui32Length) +{ + uint32_t ui32Remainder; + + ui32Remainder = ui32Length % 16; + if(ui32Remainder == 0) + { + return(ui32Length); + } + else + { + return(ui32Length + (16 - ui32Remainder)); + } +} + +//***************************************************************************** +// +// The AES interrupt handler and interrupt flags. +// +//***************************************************************************** +static volatile bool g_bContextInIntFlag; +static volatile bool g_bDataInIntFlag; +static volatile bool g_bContextOutIntFlag; +static volatile bool g_bDataOutIntFlag; +static volatile bool g_bContextInDMADoneIntFlag; +static volatile bool g_bDataInDMADoneIntFlag; +static volatile bool g_bContextOutDMADoneIntFlag; +static volatile bool g_bDataOutDMADoneIntFlag; + +void +AESIntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the AES masked interrupt status. + // + ui32IntStatus = ROM_AESIntStatus(AES_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & AES_INT_CONTEXT_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_IN); + g_bContextInIntFlag = true; + UARTprintf(" Context input registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_IN); + g_bDataInIntFlag = true; + UARTprintf(" Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & AES_INT_CONTEXT_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_OUT); + g_bContextOutIntFlag = true; + UARTprintf(" Context output registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_OUT); + g_bDataOutIntFlag = true; + UARTprintf(" Data FIFO is ready to provide data.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneIntFlag = true; + UARTprintf(" DMA completed a context write to the internal\n"); + UARTprintf(" registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_IN); + g_bDataInDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of input data to\n"); + UARTprintf(" the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_OUT); + g_bContextOutDMADoneIntFlag = true; + UARTprintf(" DMA completed the output context movement from\n"); + UARTprintf(" the internal registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_OUT); + g_bDataOutDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of process result.\n"); + } +} + +//***************************************************************************** +// +// Perform an decryption operation. +// +//***************************************************************************** +bool +AESCBCDecrypt(uint32_t ui32Keysize, uint32_t *pui32Src, uint32_t *pui32Dst, + uint32_t *pui32Key, uint32_t *pui32IV, uint32_t ui32Length, + bool bUseDMA) +{ + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Clear the interrupt flags. + // + g_bContextInIntFlag = false; + g_bDataInIntFlag = false; + g_bContextOutIntFlag = false; + g_bDataOutIntFlag = false; + g_bContextInDMADoneIntFlag = false; + g_bDataInDMADoneIntFlag = false; + g_bContextOutDMADoneIntFlag = false; + g_bDataOutDMADoneIntFlag = false; + + // + // Enable all interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | + AES_INT_DATA_IN | AES_INT_DATA_OUT)); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_DECRYPT | + AES_CFG_MODE_CBC)); + + // + // Write the initial value. + // + AESIVSet(AES_BASE, pui32IV); + + // + // Write the key. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Depending on the argument, perform the decryption + // with or without uDMA. + // + if(bUseDMA) + { + // + // Enable DMA interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_DMA_CONTEXT_IN | + AES_INT_DMA_DATA_IN | + AES_INT_DMA_CONTEXT_OUT | + AES_INT_DMA_DATA_OUT)); + + // + // Setup the DMA module to copy data in. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Src, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data in DMA request enabled.\n"); + + // + // Setup the DMA module to copy the data out. + // + ROM_uDMAChannelAssign(UDMA_CH15_AES0DOUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH15_AES0DOUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_NONE | + UDMA_DST_INC_32 | UDMA_ARB_4 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(AES_BASE + AES_O_DATA_IN_0), + (void *)pui32Dst, + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data out DMA request enabled.\n"); + + // + // Write the length registers to start the process. + // + ROM_AESLengthSet(AES_BASE, (uint64_t)ui32Length); + + // + // Enable the DMA channels to start the transfers. This must be done after + // writing the length to prevent data from copying before the context is + // truly ready. + // + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + ROM_uDMAChannelEnable(UDMA_CH15_AES0DOUT); + + // + // Enable DMA requests + // + ROM_AESDMAEnable(AES_BASE, AES_DMA_DATA_IN | AES_DMA_DATA_OUT); + + // + // Wait for the data in DMA done interrupt. + // + while(!g_bDataInDMADoneIntFlag) + { + } + + // + // Wait for the data out DMA done interrupt. + // + while(!g_bDataOutDMADoneIntFlag) + { + } + } + else + { + // + // Perform the decryption. + // + ROM_AESDataProcess(AES_BASE, pui32Src, pui32Dst, ui32Length); + } + + return(true); +} + +//***************************************************************************** +// +// Initialize the AES and CCM modules. +// +//***************************************************************************** +bool +AESInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example decrypts blocks of plaintext using AES128 and AES256 in CBC +// mode. It does the decryption first without uDMA and then with uDMA. +// The results are checked after each operation. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32PlainText[16], ui32Errors, ui32Idx, ui32SysClock; + uint32_t ui32Keysize; + tContext sContext; + uint8_t ui8Loop; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "aes-cbc-decrypt"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUStackingEnable(); + + // + // Enable AES interrupts. + // + ROM_IntEnable(INT_AES0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting AES CBC decryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and AES modules. + // + if(!AESInit()) + { + UARTprintf("Initialization of the AES module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Perform the same operation with 128bit key first, then 256bit key. + // + for(ui8Loop = 0; ui8Loop < 2; ui8Loop++) + { + + ui32Keysize = (ui8Loop == 0)?AES_CFG_KEY_SIZE_128BIT:AES_CFG_KEY_SIZE_256BIT; + UARTprintf("\nKey Size: %sbit\n", ((ui8Loop == 0)?"128":"256")); + + // + // Clear the array containing the plaintext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32PlainText[ui32Idx] = 0; + } + + // + // Perform the decryption without uDMA. + // + UARTprintf("Performing decryption without uDMA.\n"); + AESCBCDecrypt(ui32Keysize, + (ui8Loop == 0)?g_pui32AES128CipherText:g_pui32AES256CipherText, + pui32PlainText, + (ui8Loop == 0)?g_pui32AES128Key:g_pui32AES256Key, + g_pui32AESIV, 64, false); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32PlainText[ui32Idx] != g_pui32AESPlainText[ui32Idx]) + { + UARTprintf("Plaintext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, g_pui32AESPlainText[ui32Idx], + pui32PlainText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + + // + // Clear the array containing the plaintext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32PlainText[ui32Idx] = 0; + } + + // + // Perform the decryption with uDMA. + // + UARTprintf("Performing decryption with uDMA.\n"); + AESCBCDecrypt(ui32Keysize, + (ui8Loop == 0)?g_pui32AES128CipherText:g_pui32AES256CipherText, + pui32PlainText, + (ui8Loop == 0)?g_pui32AES128Key:g_pui32AES256Key, + g_pui32AESIV, 64, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32PlainText[ui32Idx] != g_pui32AESPlainText[ui32Idx]) + { + UARTprintf("Plaintext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, g_pui32AESPlainText[ui32Idx], + pui32PlainText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000004; + } + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ewd b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ewp b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ewp new file mode 100644 index 0000000..fda02f2 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\aes_cbc_decrypt.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.icf b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.icf new file mode 100644 index 0000000..6d46828 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// aes_cbc_decrypt.icf - Linker configuration file for aes_cbc_decrypt. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ld b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ld new file mode 100644 index 0000000..a02ae24 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * aes_cbc_decrypt.ld - Linker configuration file for aes_cbc_decrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.sct b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.sct new file mode 100644 index 0000000..b751064 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; aes_cbc_decrypt.sct - Linker configuration file for aes_cbc_decrypt. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.uvopt b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.uvopt new file mode 100644 index 0000000..697a01f --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + aes_cbc_decrypt + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\aes_cbc_decrypt.c + aes_cbc_decrypt.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.uvproj b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.uvproj new file mode 100644 index 0000000..63b30c8 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + aes_cbc_decrypt + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + aes_cbc_decrypt + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\aes_cbc_decrypt.bin .\rvmdk\aes_cbc_decrypt.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + aes_cbc_decrypt.sct + + + --entry Reset_Handler + + + + + + + + Source + + + aes_cbc_decrypt.c + 1 + .\aes_cbc_decrypt.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt_ccs.cmd b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt_ccs.cmd new file mode 100644 index 0000000..246a5b1 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * aes_cbc_decrypt_ccs.cmd - CCS linker configuration file for aes_cbc_decrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.ccsimportspec b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.ccsimportspec new file mode 100644 index 0000000..3d917fc --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.ccsproject b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.cproject b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.cproject new file mode 100644 index 0000000..84d4c02 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.project b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.project new file mode 100644 index 0000000..766fee7 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.project @@ -0,0 +1,70 @@ + + + aes_cbc_decrypt + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + aes_cbc_decrypt.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt.c + + + aes_cbc_decrypt_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_cbc_decrypt/aes_cbc_decrypt_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_cbc_decrypt/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/Debug/aes_cbc_decrypt.bin b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/Debug/aes_cbc_decrypt.bin new file mode 100644 index 0000000..5441f2e Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/Debug/aes_cbc_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/Debug/aes_cbc_decrypt.out b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/Debug/aes_cbc_decrypt.out new file mode 100644 index 0000000..2ef4b5c Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/Debug/aes_cbc_decrypt.out differ diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/macros.ini_initial b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/target_config.ccxml b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/ewarm/Exe/aes_cbc_decrypt.bin b/boards/dk-tm4c129x/aes_cbc_decrypt/ewarm/Exe/aes_cbc_decrypt.bin new file mode 100644 index 0000000..0e54af9 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_decrypt/ewarm/Exe/aes_cbc_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/ewarm/Exe/aes_cbc_decrypt.out b/boards/dk-tm4c129x/aes_cbc_decrypt/ewarm/Exe/aes_cbc_decrypt.out new file mode 100644 index 0000000..3518b29 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_decrypt/ewarm/Exe/aes_cbc_decrypt.out differ diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/gcc/aes_cbc_decrypt.axf b/boards/dk-tm4c129x/aes_cbc_decrypt/gcc/aes_cbc_decrypt.axf new file mode 100644 index 0000000..301aa2b Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_decrypt/gcc/aes_cbc_decrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/gcc/aes_cbc_decrypt.bin b/boards/dk-tm4c129x/aes_cbc_decrypt/gcc/aes_cbc_decrypt.bin new file mode 100644 index 0000000..54fb1d6 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_decrypt/gcc/aes_cbc_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/readme.txt b/boards/dk-tm4c129x/aes_cbc_decrypt/readme.txt new file mode 100644 index 0000000..00e77da --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/readme.txt @@ -0,0 +1,27 @@ +AES CBC Decryption Demo + +Simple demo showing an decryption operation using the AES128 and AES256 +modules in CBC mode. A number of blocks of data are decrypted. + +Please note that the use of interrupts and uDMA is not required for the +operation of the module. It is only done for demonstration purposes. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/rvmdk/aes_cbc_decrypt.axf b/boards/dk-tm4c129x/aes_cbc_decrypt/rvmdk/aes_cbc_decrypt.axf new file mode 100644 index 0000000..5b7a2ad Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_decrypt/rvmdk/aes_cbc_decrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/rvmdk/aes_cbc_decrypt.bin b/boards/dk-tm4c129x/aes_cbc_decrypt/rvmdk/aes_cbc_decrypt.bin new file mode 100644 index 0000000..90b646f Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_decrypt/rvmdk/aes_cbc_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/startup_ccs.c b/boards/dk-tm4c129x/aes_cbc_decrypt/startup_ccs.c new file mode 100644 index 0000000..882868b --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/startup_ewarm.c b/boards/dk-tm4c129x/aes_cbc_decrypt/startup_ewarm.c new file mode 100644 index 0000000..b08ccba --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/startup_gcc.c b/boards/dk-tm4c129x/aes_cbc_decrypt/startup_gcc.c new file mode 100644 index 0000000..f1c5730 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cbc_decrypt/startup_rvmdk.S b/boards/dk-tm4c129x/aes_cbc_decrypt/startup_rvmdk.S new file mode 100644 index 0000000..558dc08 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_decrypt/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN AESIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD AESIntHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/Makefile b/boards/dk-tm4c129x/aes_cbc_encrypt/Makefile new file mode 100644 index 0000000..ced6ac1 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the AES128 and AES256 CBC Encryption Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the AES128 and AES256 CBC Encryption Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/aes_cbc_encrypt.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the AES128 and AES256 CBC Encryption Demo. +# +${COMPILER}/aes_cbc_encrypt.axf: ${COMPILER}/aes_cbc_encrypt.o +${COMPILER}/aes_cbc_encrypt.axf: ${COMPILER}/frame.o +${COMPILER}/aes_cbc_encrypt.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/aes_cbc_encrypt.axf: ${COMPILER}/pinout.o +${COMPILER}/aes_cbc_encrypt.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/aes_cbc_encrypt.axf: ${COMPILER}/uartstdio.o +${COMPILER}/aes_cbc_encrypt.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/aes_cbc_encrypt.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/aes_cbc_encrypt.axf: aes_cbc_encrypt.ld +SCATTERgcc_aes_cbc_encrypt=aes_cbc_encrypt.ld +ENTRY_aes_cbc_encrypt=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.c b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.c new file mode 100644 index 0000000..9639e8d --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.c @@ -0,0 +1,689 @@ +//***************************************************************************** +// +// aes_cbc_encrypt.c - Simple AES128 and AES256 CBC encryption demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_aes.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/aes.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

AES CBC Encryption Demo (ae_cbc_encrypt)

+//! +//! Simple demo showing an encryption operation using the AES128 and AES256 +//! modules in CBC mode. A number of blocks of data are encrypted. +//! +//! Please note that the use of interrupts and uDMA is not required for the +//! operation of the module. It is only done for demonstration purposes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Sample plaintext, ciphertext, and key from the NIST SP 800-38A document. +// +//***************************************************************************** +uint32_t g_pui32AESPlainText[16] = +{ + 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373, + 0x578a2dae, 0x9cac031e, 0xac6fb79e, 0x518eaf45, + 0x461cc830, 0x11e45ca3, 0x19c1fbe5, 0xef520a1a, + 0x45249ff6, 0x179b4fdf, 0x7b412bad, 0x10376ce6 +}; + +uint32_t g_pui32AES128Key[4] = +{ + 0x16157e2b, 0xa6d2ae28, 0x8815f7ab, 0x3c4fcf09 +}; + +uint32_t g_pui32AES256Key[8] = +{ + 0x10eb3d60, 0xbe71ca15, 0xf0ae732b, 0x81777d85, + 0x072c351f, 0xd708613b, 0xa310982d, 0xf4df1409 +}; + +uint32_t g_pui32AESIV[4] = +{ + 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c +}; + +uint32_t g_pui32AES128CipherText[16] = +{ + 0xacab4976, 0x46b21981, 0x9b8ee9ce, 0x7d19e912, + 0x9bcb8650, 0xee197250, 0x3a11db95, 0xb2787691, + 0xb8d6be73, 0x3b74c1e3, 0x9ee61671, 0x16952222, + 0xa1caf13f, 0x09ac1f68, 0x30ca0e12, 0xa7e18675 +}; + +uint32_t g_pui32AES256CipherText[16] = +{ + 0x044c8cf5, 0xbaf1e5d6, 0xfbab9e77, 0xd6fb7b5f, + 0x964efc9c, 0x8d80db7e, 0x7b779f67, 0x7d2c70c6, + 0x6933f239, 0xcfbad9a9, 0x63e230a5, 0x61142304, + 0xe205ebb2, 0xfce99bc3, 0x07196cda, 0x1b9d6a8c +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Round up length to nearest 16 byte boundary. This is needed because all +// four data registers must be written at once. This is handled in the AES +// driver, but if using uDMA, the length must rounded up. +// +//***************************************************************************** +uint32_t +LengthRoundUp(uint32_t ui32Length) +{ + uint32_t ui32Remainder; + + ui32Remainder = ui32Length % 16; + if(ui32Remainder == 0) + { + return(ui32Length); + } + else + { + return(ui32Length + (16 - ui32Remainder)); + } +} + +//***************************************************************************** +// +// The AES interrupt handler and interrupt flags. +// +//***************************************************************************** +static volatile bool g_bContextInIntFlag; +static volatile bool g_bDataInIntFlag; +static volatile bool g_bContextOutIntFlag; +static volatile bool g_bDataOutIntFlag; +static volatile bool g_bContextInDMADoneIntFlag; +static volatile bool g_bDataInDMADoneIntFlag; +static volatile bool g_bContextOutDMADoneIntFlag; +static volatile bool g_bDataOutDMADoneIntFlag; + +void +AESIntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the AES masked interrupt status. + // + ui32IntStatus = ROM_AESIntStatus(AES_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & AES_INT_CONTEXT_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_IN); + g_bContextInIntFlag = true; + UARTprintf(" Context input registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_IN); + g_bDataInIntFlag = true; + UARTprintf(" Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & AES_INT_CONTEXT_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_OUT); + g_bContextOutIntFlag = true; + UARTprintf(" Context output registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_OUT); + g_bDataOutIntFlag = true; + UARTprintf(" Data FIFO is ready to provide data.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneIntFlag = true; + UARTprintf(" DMA completed a context write to the internal\n"); + UARTprintf(" registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_IN); + g_bDataInDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of input data to\n"); + UARTprintf(" the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_OUT); + g_bContextOutDMADoneIntFlag = true; + UARTprintf(" DMA completed the output context movement from\n"); + UARTprintf(" the internal registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_OUT); + g_bDataOutDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of process result.\n"); + } +} + +//***************************************************************************** +// +// Perform an encryption operation. +// +//***************************************************************************** +bool +AESCBCEncrypt(uint32_t ui32Keysize, uint32_t *pui32Src, uint32_t *pui32Dst, + uint32_t *pui32Key, uint32_t *pui32IV, uint32_t ui32Length, + bool bUseDMA) +{ + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Clear the interrupt flags. + // + g_bContextInIntFlag = false; + g_bDataInIntFlag = false; + g_bContextOutIntFlag = false; + g_bDataOutIntFlag = false; + g_bContextInDMADoneIntFlag = false; + g_bDataInDMADoneIntFlag = false; + g_bContextOutDMADoneIntFlag = false; + g_bDataOutDMADoneIntFlag = false; + + // + // Enable all interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | + AES_INT_DATA_IN | AES_INT_DATA_OUT)); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_ENCRYPT | + AES_CFG_MODE_CBC)); + + // + // Write the initial value. + // + AESIVSet(AES_BASE, pui32IV); + + // + // Write the key. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Depending on the argument, perform the encryption + // with or without uDMA. + // + if(bUseDMA) + { + // + // Enable DMA interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_DMA_CONTEXT_IN | + AES_INT_DMA_DATA_IN | + AES_INT_DMA_CONTEXT_OUT | + AES_INT_DMA_DATA_OUT)); + + // + // Setup the DMA module to copy data in. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Src, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data in DMA request enabled.\n"); + + // + // Setup the DMA module to copy the data out. + // + ROM_uDMAChannelAssign(UDMA_CH15_AES0DOUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH15_AES0DOUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_NONE | + UDMA_DST_INC_32 | UDMA_ARB_4 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(AES_BASE + AES_O_DATA_IN_0), + (void *)pui32Dst, + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data out DMA request enabled.\n"); + + // + // Write the length registers to start the process. + // + ROM_AESLengthSet(AES_BASE, (uint64_t)ui32Length); + + // + // Enable the DMA channels to start the transfers. This must be done after + // writing the length to prevent data from copying before the context is + // truly ready. + // + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + ROM_uDMAChannelEnable(UDMA_CH15_AES0DOUT); + + // + // Enable DMA requests + // + ROM_AESDMAEnable(AES_BASE, AES_DMA_DATA_IN | AES_DMA_DATA_OUT); + + // + // Wait for the data in DMA done interrupt. + // + while(!g_bDataInDMADoneIntFlag) + { + } + + // + // Wait for the data out DMA done interrupt. + // + while(!g_bDataOutDMADoneIntFlag) + { + } + } + else + { + // + // Perform the encryption. + // + ROM_AESDataProcess(AES_BASE, pui32Src, pui32Dst, ui32Length); + } + + return(true); +} + +//***************************************************************************** +// +// Initialize the AES and CCM modules. +// +//***************************************************************************** +bool +AESInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example encrypts blocks of plaintext using AES128 and AES256 in CBC +// mode. It does the encryption first without uDMA and then with uDMA. +// The results are checked after each operation. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32CipherText[16], ui32Errors, ui32Idx, ui32SysClock; + uint32_t ui32Keysize; + uint32_t *pui32CipherTextExp; + tContext sContext; + uint8_t ui8Loop; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "aes-cbc-encrypt"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUStackingEnable(); + + // + // Enable AES interrupts. + // + ROM_IntEnable(INT_AES0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting AES CBC encryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and AES modules. + // + if(!AESInit()) + { + UARTprintf("Initialization of the AES module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Perform the same operation with 128bit key first, then 256bit key. + // + for(ui8Loop = 0; ui8Loop < 2; ui8Loop++) + { + + ui32Keysize = (ui8Loop == 0)?AES_CFG_KEY_SIZE_128BIT:AES_CFG_KEY_SIZE_256BIT; + UARTprintf("\nKey Size: %sbit\n", ((ui8Loop == 0)?"128":"256")); + + // + // Clear the array containing the cipher text. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + + // + // Perform the encryption without uDMA. + // + UARTprintf("Performing encryption without uDMA.\n"); + AESCBCEncrypt(ui32Keysize, g_pui32AESPlainText, pui32CipherText, + (ui8Loop == 0)?g_pui32AES128Key:g_pui32AES256Key, + g_pui32AESIV, 64, false); + + // + // Check the result. + // + pui32CipherTextExp = (ui8Loop == 0)?g_pui32AES128CipherText: + g_pui32AES256CipherText; + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32CipherText[ui32Idx] != pui32CipherTextExp[ui32Idx]) + { + UARTprintf("Ciphertext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32CipherTextExp[ui32Idx], + pui32CipherText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + + // + // Clear the array containing the ciphertext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + + // + // Perform the encryption with uDMA. + // + UARTprintf("Performing encryption with uDMA.\n"); + AESCBCEncrypt(ui32Keysize, g_pui32AESPlainText, pui32CipherText, + (ui8Loop == 0)?g_pui32AES128Key:g_pui32AES256Key, + g_pui32AESIV, 64, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32CipherText[ui32Idx] != pui32CipherTextExp[ui32Idx]) + { + UARTprintf("Ciphertext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32CipherTextExp[ui32Idx], + pui32CipherText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000004; + } + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ewd b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ewp b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ewp new file mode 100644 index 0000000..475a7a9 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\aes_cbc_encrypt.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.icf b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.icf new file mode 100644 index 0000000..0eda0a7 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// aes_cbc_encrypt.icf - Linker configuration file for aes_cbc_encrypt. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ld b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ld new file mode 100644 index 0000000..0181206 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * aes_cbc_encrypt.ld - Linker configuration file for aes_cbc_encrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.sct b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.sct new file mode 100644 index 0000000..7deb5d0 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; aes_cbc_encrypt.sct - Linker configuration file for aes_cbc_encrypt. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.uvopt b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.uvopt new file mode 100644 index 0000000..0a6fc81 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + aes_cbc_encrypt + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\aes_cbc_encrypt.c + aes_cbc_encrypt.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.uvproj b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.uvproj new file mode 100644 index 0000000..bc27a06 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + aes_cbc_encrypt + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + aes_cbc_encrypt + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\aes_cbc_encrypt.bin .\rvmdk\aes_cbc_encrypt.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + aes_cbc_encrypt.sct + + + --entry Reset_Handler + + + + + + + + Source + + + aes_cbc_encrypt.c + 1 + .\aes_cbc_encrypt.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt_ccs.cmd b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt_ccs.cmd new file mode 100644 index 0000000..1b9d5ff --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * aes_cbc_encrypt_ccs.cmd - CCS linker configuration file for aes_cbc_encrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.ccsimportspec b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.ccsimportspec new file mode 100644 index 0000000..00f8092 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.ccsproject b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.cproject b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.cproject new file mode 100644 index 0000000..e732f64 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.project b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.project new file mode 100644 index 0000000..245d996 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.project @@ -0,0 +1,70 @@ + + + aes_cbc_encrypt + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + aes_cbc_encrypt.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt.c + + + aes_cbc_encrypt_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_cbc_encrypt/aes_cbc_encrypt_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_cbc_encrypt/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/Debug/aes_cbc_encrypt.bin b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/Debug/aes_cbc_encrypt.bin new file mode 100644 index 0000000..cf4b672 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/Debug/aes_cbc_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/Debug/aes_cbc_encrypt.out b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/Debug/aes_cbc_encrypt.out new file mode 100644 index 0000000..5243f8c Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/Debug/aes_cbc_encrypt.out differ diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/macros.ini_initial b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/target_config.ccxml b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/ewarm/Exe/aes_cbc_encrypt.bin b/boards/dk-tm4c129x/aes_cbc_encrypt/ewarm/Exe/aes_cbc_encrypt.bin new file mode 100644 index 0000000..a132fd6 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_encrypt/ewarm/Exe/aes_cbc_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/ewarm/Exe/aes_cbc_encrypt.out b/boards/dk-tm4c129x/aes_cbc_encrypt/ewarm/Exe/aes_cbc_encrypt.out new file mode 100644 index 0000000..4c41a75 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_encrypt/ewarm/Exe/aes_cbc_encrypt.out differ diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/gcc/aes_cbc_encrypt.axf b/boards/dk-tm4c129x/aes_cbc_encrypt/gcc/aes_cbc_encrypt.axf new file mode 100644 index 0000000..18f8202 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_encrypt/gcc/aes_cbc_encrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/gcc/aes_cbc_encrypt.bin b/boards/dk-tm4c129x/aes_cbc_encrypt/gcc/aes_cbc_encrypt.bin new file mode 100644 index 0000000..a4da3c3 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_encrypt/gcc/aes_cbc_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/readme.txt b/boards/dk-tm4c129x/aes_cbc_encrypt/readme.txt new file mode 100644 index 0000000..be052e5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/readme.txt @@ -0,0 +1,27 @@ +AES CBC Encryption Demo + +Simple demo showing an encryption operation using the AES128 and AES256 +modules in CBC mode. A number of blocks of data are encrypted. + +Please note that the use of interrupts and uDMA is not required for the +operation of the module. It is only done for demonstration purposes. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/rvmdk/aes_cbc_encrypt.axf b/boards/dk-tm4c129x/aes_cbc_encrypt/rvmdk/aes_cbc_encrypt.axf new file mode 100644 index 0000000..191b9c5 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_encrypt/rvmdk/aes_cbc_encrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/rvmdk/aes_cbc_encrypt.bin b/boards/dk-tm4c129x/aes_cbc_encrypt/rvmdk/aes_cbc_encrypt.bin new file mode 100644 index 0000000..f680ff5 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cbc_encrypt/rvmdk/aes_cbc_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/startup_ccs.c b/boards/dk-tm4c129x/aes_cbc_encrypt/startup_ccs.c new file mode 100644 index 0000000..882868b --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/startup_ewarm.c b/boards/dk-tm4c129x/aes_cbc_encrypt/startup_ewarm.c new file mode 100644 index 0000000..b08ccba --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/startup_gcc.c b/boards/dk-tm4c129x/aes_cbc_encrypt/startup_gcc.c new file mode 100644 index 0000000..f1c5730 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cbc_encrypt/startup_rvmdk.S b/boards/dk-tm4c129x/aes_cbc_encrypt/startup_rvmdk.S new file mode 100644 index 0000000..558dc08 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cbc_encrypt/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN AESIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD AESIntHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/Makefile b/boards/dk-tm4c129x/aes_ccm_decrypt/Makefile new file mode 100644 index 0000000..2658b4e --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the AES128 and AES256 CCM Decryption Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the AES128 and AES256 CCM Decryption Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/aes_ccm_decrypt.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the AES128 and AES256 CCM Decryption Demo. +# +${COMPILER}/aes_ccm_decrypt.axf: ${COMPILER}/aes_ccm_decrypt.o +${COMPILER}/aes_ccm_decrypt.axf: ${COMPILER}/frame.o +${COMPILER}/aes_ccm_decrypt.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/aes_ccm_decrypt.axf: ${COMPILER}/pinout.o +${COMPILER}/aes_ccm_decrypt.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/aes_ccm_decrypt.axf: ${COMPILER}/uartstdio.o +${COMPILER}/aes_ccm_decrypt.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/aes_ccm_decrypt.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/aes_ccm_decrypt.axf: aes_ccm_decrypt.ld +SCATTERgcc_aes_ccm_decrypt=aes_ccm_decrypt.ld +ENTRY_aes_ccm_decrypt=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.c b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.c new file mode 100644 index 0000000..4892556 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.c @@ -0,0 +1,1036 @@ +//***************************************************************************** +// +// aes_ccm_decrypt.c - Simple AES128 and AES256 CCM decryption demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_aes.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/aes.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

AES128 and AES256 CCM Decryption Demo (aes_ccm_decrypt)

+//! +//! Simple demo showing an decryption operation using the AES128 and AES256 +//! modules in CCM mode. A set of test cases are decrypted. +//! +//! Please note that the use of interrupts and uDMA is not required for the +//! operation of the module. It is only done for demonstration purposes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Test cases from the NIST SP 800-38C document and proposals for IEEE P1619.1 +// Test Vectors +// +//***************************************************************************** +typedef struct AESTestVectorStruct +{ + uint32_t ui32KeySize; + uint32_t pui32Key[8]; + uint32_t ui32NonceLength; + uint32_t pui32Nonce[4]; + uint32_t ui32PayloadLength; + uint32_t pui32Payload[16]; + uint32_t ui32AuthDataLength; + uint32_t pui32AuthData[16]; + uint32_t pui32CipherText[16]; + uint32_t ui32TagLength; + uint32_t pui32Tag[4]; +} + +tAESCCMTestVector; + +tAESCCMTestVector g_psAESCCMTestVectors[] = +{ + // + // Test Case #1 + // The data in these test cases have been modified to be in big endian + // format as required by the AES module. This was done to simplify writes + // and comparisons. + // Also, The test vector is formatted in the document in a way that the + // ciphertext is the concatenation of the ciphertext and the MAC. they + // have been separated to match the operation of the AES module. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x43424140, 0x47464544, 0x4b4a4948, 0x4f4e4d4c }, // Key + 7, // Nonce Length + { 0x13121110, 0x00161514, 0x00000000, 0x00000000 }, // Nonce + 4, // Payload Length + { 0x23222120, 0x00000000, 0x00000000, 0x00000000 }, // Payload + 8, // Auth Data Length + { 0x03020100, 0x07060504, 0x00000000, 0x00000000 }, // Auth Data + { 0x5b016271, 0x00000000, 0x00000000, 0x00000000 }, // CipherText + 4, // Tag Length + { 0x5d25ac4d, 0x00000000, 0x00000000, 0x00000000 } // Tag + }, + + // + // Test Case #2 + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x43424140, 0x47464544, 0x4b4a4948, 0x4f4e4d4c }, // Key + 8, // Nonce Length + { 0x13121110, 0x17161514, 0x00000000, 0x00000000 }, // Nonce + 16, // Payload Length + { 0x23222120, 0x27262524, 0x2b2a2928, 0x2f2e2d2c }, // Payload + 16, // Auth Data Length + { 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c }, // Auth Data + { 0xe0f0a1d2, 0x625fea51, 0x92771a08, 0x3d593d07 }, // CipherText + 6, // Tag Length + { 0xbf4fc61f, 0x0000cdac, 0x00000000, 0x00000000 } // Tag + }, + + // + // Test Case #3 + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x43424140, 0x47464544, 0x4b4a4948, 0x4f4e4d4c }, // Key + 12, // Nonce Length + { 0x13121110, 0x17161514, 0x1b1a1918, 0x00000000 }, // Nonce + 24, // Payload Length + { 0x23222120, 0x27262524, 0x2b2a2928, 0x2f2e2d2c, // Payload + 0x33323130, 0x37363534, 0x00000000, 0x00000000 }, + 20, // Auth Data Length + { 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c, // Auth Data + 0x13121110, 0x00000000, 0x00000000, 0x00000000 }, + { 0xa901b2e3, 0x7a1ab7f5, 0xecea1c9b, 0x0be797cd, // CipherText + 0xd9aa7661, 0xa58a42a4, 0x00000000, 0x00000000 }, + 8, // Tag Length + { 0xfb924348, 0x5199b0c1, 0x00000000, 0x00000000 } // Tag + }, + + // + // The following test cases use 256bit key, and they are taken from + // proposals for IEEE P1619.1 Test Vectors. + // + // Test Case #4 + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0xb21576fb, 0x1d89803d, 0x0b9870d4, 0xc88495c7, // Key + 0xce64fbb2, 0x4d8f9760, 0x5ae4fc17, 0xb730e849 }, + 12, // Nonce Length + { 0x63a3d1db, 0xb4b72460, 0x6f7dda02, 0x00000000 }, // Nonce + 16, // Payload Length + { 0x8e3445a8, 0xf1b5c5c8, 0x760ef526, 0x1e1bfdfe, // Payload + 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 0, // Auth Data Length + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, // Auth Data + 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x611288cc, 0x72faa7c6, 0x39176ab9, 0x7f276b17, // CipherText + 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 16, // Tag Length + { 0x14e17234, 0xbe0c2c5f, 0x06496314, 0x23e4f02c } // Tag + }, + + // + // Test Case #5 + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0x43424140, 0x47464544, 0x4b4a4948, 0x4f4e4d4c, // Key + 0x53525150, 0x57565554, 0x5b5a5958, 0x5f5e5d5c }, + 12, // Nonce Length + { 0x13121110, 0x17161514, 0x1b1a1918, 0x00000000 }, // Nonce + 24, // Payload Length + { 0x23222120, 0x27262524, 0x2b2a2928, 0x2f2e2d2c, // Payload + 0x33323130, 0x37363534, 0x00000000, 0x00000000 }, + 20, // Auth Data Length + { 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c, // Auth Data + 0x13121110, 0x00000000, 0x00000000, 0x00000000 }, + { 0xae83f804, 0x3007bdb3, 0xb60bf5ea, 0x21a24fde, // CipherText + 0xe4e43420, 0xe5750e1b, 0x00000000, 0x00000000 }, + 16, // Tag Length + { 0x3a3fba9b, 0x39327f10, 0x299063bd, 0x7103f823 } // Tag + } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Round up length to nearest 16 byte boundary. This is needed because all +// four data registers must be written at once. This is handled in the AES +// driver, but if using uDMA, the length must rounded up. +// +//***************************************************************************** +uint32_t +LengthRoundUp(uint32_t ui32Length) +{ + uint32_t ui32Remainder; + + ui32Remainder = ui32Length % 16; + if(ui32Remainder == 0) + { + return(ui32Length); + } + else + { + return(ui32Length + (16 - ui32Remainder)); + } +} + +//***************************************************************************** +// +// The AES interrupt handler and interrupt flags. +// +//***************************************************************************** +static volatile bool g_bContextInIntFlag; +static volatile bool g_bDataInIntFlag; +static volatile bool g_bContextOutIntFlag; +static volatile bool g_bDataOutIntFlag; +static volatile bool g_bContextInDMADoneIntFlag; +static volatile bool g_bDataInDMADoneIntFlag; +static volatile bool g_bContextOutDMADoneIntFlag; +static volatile bool g_bDataOutDMADoneIntFlag; + +void +AESIntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the AES masked interrupt status. + // + ui32IntStatus = ROM_AESIntStatus(AES_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & AES_INT_CONTEXT_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_IN); + g_bContextInIntFlag = true; + UARTprintf(" Context input registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_IN); + g_bDataInIntFlag = true; + UARTprintf(" Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & AES_INT_CONTEXT_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_OUT); + g_bContextOutIntFlag = true; + UARTprintf(" Context output registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_OUT); + g_bDataOutIntFlag = true; + UARTprintf(" Data FIFO is ready to provide data.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneIntFlag = true; + UARTprintf(" DMA completed a context write to the internal\n"); + UARTprintf(" registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_IN); + g_bDataInDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of input data to\n"); + UARTprintf(" the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_OUT); + g_bContextOutDMADoneIntFlag = true; + UARTprintf(" DMA completed the output context movement from\n"); + UARTprintf(" the internal registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_OUT); + g_bDataOutDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of process result.\n"); + } +} + +//***************************************************************************** +// +// Perform an CCM decryption operation. +// +//***************************************************************************** +bool +AESCCMDecrypt(uint32_t ui32Keysize, uint32_t *pui32Key, + uint32_t *pui32Src, uint32_t *pui32Dst, + uint32_t ui32DataLength, uint32_t *pui32Nonce, + uint32_t ui32NonceLength, uint32_t *pui32AuthData, + uint32_t ui32AuthDataLength, uint32_t *pui32Tag, + uint32_t ui32TagLength, bool bUseDMA) +{ + uint32_t pui32IV[4], ui32Idx; + uint32_t ui32M, ui32L; + uint8_t *pui8Nonce, *pui8IV; + + // + // Determine the value of M. It is determined using + // the tag length. + // + if(ui32TagLength == 4) + { + ui32M = AES_CFG_CCM_M_4; + } + else if(ui32TagLength == 6) + { + ui32M = AES_CFG_CCM_M_6; + } + else if(ui32TagLength == 8) + { + ui32M = AES_CFG_CCM_M_8; + } + else if(ui32TagLength == 10) + { + ui32M = AES_CFG_CCM_M_10; + } + else if(ui32TagLength == 12) + { + ui32M = AES_CFG_CCM_M_12; + } + else if(ui32TagLength == 14) + { + ui32M = AES_CFG_CCM_M_14; + } + else if(ui32TagLength == 16) + { + ui32M = AES_CFG_CCM_M_16; + } + else + { + UARTprintf("Unexpected tag length.\n"); + return(false); + } + + // + // Determine the value of L. This is determined by using + // the value of q from the NIST document: n + q = 15 + // + if(ui32NonceLength == 7) + { + ui32L = AES_CFG_CCM_L_8; + } + else if(ui32NonceLength == 8) + { + ui32L = AES_CFG_CCM_L_7; + } + else if(ui32NonceLength == 9) + { + ui32L = AES_CFG_CCM_L_6; + } + else if(ui32NonceLength == 10) + { + ui32L = AES_CFG_CCM_L_5; + } + else if(ui32NonceLength == 11) + { + ui32L = AES_CFG_CCM_L_4; + } + else if(ui32NonceLength == 12) + { + ui32L = AES_CFG_CCM_L_3; + } + else if(ui32NonceLength == 13) + { + ui32L = AES_CFG_CCM_L_2; + } + else if(ui32NonceLength == 14) + { + ui32L = AES_CFG_CCM_L_1; + } + else + { + UARTprintf("Unexpected nonce length.\n"); + return(false); + } + + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Clear the interrupt flags. + // + g_bContextInIntFlag = false; + g_bDataInIntFlag = false; + g_bContextOutIntFlag = false; + g_bDataOutIntFlag = false; + g_bContextInDMADoneIntFlag = false; + g_bDataInDMADoneIntFlag = false; + g_bContextOutDMADoneIntFlag = false; + g_bDataOutDMADoneIntFlag = false; + + // + // Enable all interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | + AES_INT_DATA_IN | AES_INT_DATA_OUT)); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_DECRYPT | + AES_CFG_CTR_WIDTH_128 | + AES_CFG_MODE_CCM | ui32L | ui32M)); + + // + // Determine the value to be written in the initial value registers. It is + // the concatenation of 5 bits of zero, 3 bits of L, nonce, and the counter + // value. First, clear the contents of the IV. + // + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32IV[ui32Idx] = 0; + } + + // + // Now find the binary value of L. + // + if(ui32L == AES_CFG_CCM_L_8) + { + pui32IV[0] = 0x7; + } + else if(ui32L == AES_CFG_CCM_L_7) + { + pui32IV[0] = 0x6; + } + else if(ui32L == AES_CFG_CCM_L_6) + { + pui32IV[0] = 0x5; + } + else if(ui32L == AES_CFG_CCM_L_5) + { + pui32IV[0] = 0x4; + } + else if(ui32L == AES_CFG_CCM_L_4) + { + pui32IV[0] = 0x3; + } + else if(ui32L == AES_CFG_CCM_L_3) + { + pui32IV[0] = 0x2; + } + else if(ui32L == AES_CFG_CCM_L_2) + { + pui32IV[0] = 0x1; + } + + // + // Finally copy the contents of the nonce into the IV. Convert + // the pointers to simplify the copying. + // + pui8Nonce = (uint8_t *)pui32Nonce; + pui8IV = (uint8_t *)pui32IV; + for(ui32Idx = 0; ui32Idx < ui32NonceLength; ui32Idx++) + { + pui8IV[ui32Idx + 1] = pui8Nonce[ui32Idx]; + } + + // + // Write the initial value. + // + ROM_AESIVSet(AES_BASE, pui32IV); + + // + // Write the key. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Depending on the argument, perform the decryption + // with or without uDMA. + // + if(bUseDMA) + { + // + // Enable DMA interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_DMA_CONTEXT_IN | + AES_INT_DMA_DATA_IN | + AES_INT_DMA_CONTEXT_OUT | + AES_INT_DMA_DATA_OUT)); + + // + // Setup the DMA module to copy auth data in. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + if(ui32AuthDataLength) + { + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32AuthData, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32AuthDataLength) / 4); + } + UARTprintf("Data in DMA request enabled.\n"); + + // + // Setup the DMA module to copy the data out. + // + ROM_uDMAChannelAssign(UDMA_CH15_AES0DOUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH15_AES0DOUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_NONE | + UDMA_DST_INC_32 | UDMA_ARB_4 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(AES_BASE + AES_O_DATA_IN_0), + (void *)pui32Dst, + LengthRoundUp(ui32DataLength) / 4); + UARTprintf("Data out DMA request enabled.\n"); + + // + // Write the length registers. + // + ROM_AESLengthSet(AES_BASE, (uint64_t)ui32DataLength); + + // + // Write the auth length registers to start the process. + // + ROM_AESAuthLengthSet(AES_BASE, ui32AuthDataLength); + + // + // Enable the DMA channels to start the transfers. This must be done after + // writing the length to prevent data from copying before the context is + // truly ready. + // + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + ROM_uDMAChannelEnable(UDMA_CH15_AES0DOUT); + + // + // Enable DMA requests. + // + ROM_AESDMAEnable(AES_BASE, AES_DMA_DATA_IN | AES_DMA_DATA_OUT); + + // + // Wait for the data in DMA done interrupt. + // + while(!g_bDataInDMADoneIntFlag) + { + } + + // + // Setup the uDMA to copy the plaintext data. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Src, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32DataLength) / 4); + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + UARTprintf("Data in DMA request enabled.\n"); + + // + // Wait for the data out DMA done interrupt. + // + while(!g_bDataOutDMADoneIntFlag) + { + } + + // + // Read the tag out. + // + ROM_AESTagRead(AES_BASE, pui32Tag); + } + else + { + // + // Perform the decryption. + // + ROM_AESDataProcessAuth(AES_BASE, pui32Src, pui32Dst, ui32DataLength, + pui32AuthData, ui32AuthDataLength, pui32Tag); + } + return(true); +} + +//***************************************************************************** +// +// Initialize the AES and CCM modules. +// +//***************************************************************************** +bool +AESInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example decrypts a block of payload using AES128 in CCM mode. It +// does the decryption first without uDMA and then with uDMA. The results +// are checked after each operation. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32Payload[16], pui32Tag[4], ui32Errors, ui32Idx; + uint32_t ui32PayloadLength, ui32TagLength; + uint32_t ui32NonceLength, ui32AuthDataLength; + uint32_t *pui32Nonce, *pui32AuthData, ui32SysClock; + uint32_t *pui32Key, *pui32ExpPayload, *pui32CipherText; + uint32_t ui32Keysize; + uint8_t ui8Vector; + uint8_t *pui8ExpTag, *pui8Tag; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | + SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "aes-ccm-decrypt"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + pui8Tag = (uint8_t *)pui32Tag; + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUStackingEnable(); + + // + // Configure the system clock to run off the internal 16MHz oscillator. + // + MAP_SysCtlClockFreqSet(SYSCTL_OSC_INT | SYSCTL_USE_OSC, 16000000); + + // + // Enable AES interrupts. + // + ROM_IntEnable(INT_AES0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting AES CCM decryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and AES modules. + // + if(!AESInit()) + { + UARTprintf("Initialization of the AES module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Clear the array containing the ciphertext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32Payload[ui32Idx] = 0; + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + + // + // Loop through all the given vectors. + // + for(ui8Vector = 0; + (ui8Vector < + (sizeof(g_psAESCCMTestVectors) / sizeof(g_psAESCCMTestVectors[0]))) && + (ui32Errors == 0); + ui8Vector++) + { + UARTprintf("Starting vector #%d\n", ui8Vector); + + // + // Get the current vector's data members. + // + ui32Keysize = g_psAESCCMTestVectors[ui8Vector].ui32KeySize; + pui32Key = g_psAESCCMTestVectors[ui8Vector].pui32Key; + pui32ExpPayload = g_psAESCCMTestVectors[ui8Vector].pui32Payload; + ui32PayloadLength = + g_psAESCCMTestVectors[ui8Vector].ui32PayloadLength; + pui32AuthData = g_psAESCCMTestVectors[ui8Vector].pui32AuthData; + ui32AuthDataLength = + g_psAESCCMTestVectors[ui8Vector].ui32AuthDataLength; + pui32CipherText = + g_psAESCCMTestVectors[ui8Vector].pui32CipherText; + pui8ExpTag = (uint8_t *)g_psAESCCMTestVectors[ui8Vector].pui32Tag; + ui32TagLength = g_psAESCCMTestVectors[ui8Vector].ui32TagLength; + pui32Nonce = g_psAESCCMTestVectors[ui8Vector].pui32Nonce; + ui32NonceLength = + g_psAESCCMTestVectors[ui8Vector].ui32NonceLength; + + // + // Perform the decryption without uDMA. + // + UARTprintf("Performing decryption without uDMA.\n"); + AESCCMDecrypt(ui32Keysize, pui32Key, pui32CipherText, + pui32Payload, ui32PayloadLength, pui32Nonce, + ui32NonceLength, pui32AuthData, ui32AuthDataLength, + pui32Tag, ui32TagLength, false); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < (ui32PayloadLength / 4); ui32Idx++) + { + if(pui32Payload[ui32Idx] != pui32ExpPayload[ui32Idx]) + { + UARTprintf("Payload mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32ExpPayload[ui32Idx], + pui32Payload[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + for(ui32Idx = 0; ui32Idx < ui32TagLength; ui32Idx++) + { + if(pui8Tag[ui32Idx] != pui8ExpTag[ui32Idx]) + { + UARTprintf("Tag mismatch on byte %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui8ExpTag[ui32Idx], + pui8Tag[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000004; + } + } + + // + // Clear the array containing the ciphertext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32Payload[ui32Idx] = 0; + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + + // + // Perform the decryption with uDMA. + // + UARTprintf("Performing decryption with uDMA.\n"); + AESCCMDecrypt(ui32Keysize, pui32Key, pui32CipherText, + pui32Payload, ui32PayloadLength, pui32Nonce, + ui32NonceLength, pui32AuthData, ui32AuthDataLength, + pui32Tag, ui32TagLength, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < (ui32PayloadLength / 4); ui32Idx++) + { + if(pui32Payload[ui32Idx] != pui32ExpPayload[ui32Idx]) + { + UARTprintf("Payload mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32ExpPayload[ui32Idx], + pui32Payload[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + for(ui32Idx = 0; ui32Idx < ui32TagLength; ui32Idx++) + { + if(pui8Tag[ui32Idx] != pui8ExpTag[ui32Idx]) + { + UARTprintf("Tag mismatch on byte %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui8ExpTag[ui32Idx], + pui8Tag[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000004; + } + } + + // + // Clear the array containing the ciphertext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32Payload[ui32Idx] = 0; + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + } + + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ewd b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ewp b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ewp new file mode 100644 index 0000000..462ec0a --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\aes_ccm_decrypt.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.icf b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.icf new file mode 100644 index 0000000..5210cbd --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// aes_ccm_decrypt.icf - Linker configuration file for aes_ccm_decrypt. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ld b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ld new file mode 100644 index 0000000..2685efe --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * aes_ccm_decrypt.ld - Linker configuration file for aes_ccm_decrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.sct b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.sct new file mode 100644 index 0000000..b88ca10 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; aes_ccm_decrypt.sct - Linker configuration file for aes_ccm_decrypt. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.uvopt b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.uvopt new file mode 100644 index 0000000..e9d0319 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + aes_ccm_decrypt + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\aes_ccm_decrypt.c + aes_ccm_decrypt.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.uvproj b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.uvproj new file mode 100644 index 0000000..fe7fcb9 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + aes_ccm_decrypt + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + aes_ccm_decrypt + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\aes_ccm_decrypt.bin .\rvmdk\aes_ccm_decrypt.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + aes_ccm_decrypt.sct + + + --entry Reset_Handler + + + + + + + + Source + + + aes_ccm_decrypt.c + 1 + .\aes_ccm_decrypt.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt_ccs.cmd b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt_ccs.cmd new file mode 100644 index 0000000..af95ed4 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * aes_ccm_decrypt_ccs.cmd - CCS linker configuration file for aes_ccm_decrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.ccsimportspec b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.ccsimportspec new file mode 100644 index 0000000..a198e66 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.ccsproject b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.cproject b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.cproject new file mode 100644 index 0000000..95e1d41 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.project b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.project new file mode 100644 index 0000000..645e5f9 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.project @@ -0,0 +1,70 @@ + + + aes_ccm_decrypt + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + aes_ccm_decrypt.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt.c + + + aes_ccm_decrypt_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ccm_decrypt/aes_ccm_decrypt_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ccm_decrypt/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/Debug/aes_ccm_decrypt.bin b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/Debug/aes_ccm_decrypt.bin new file mode 100644 index 0000000..dcb8dc9 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/Debug/aes_ccm_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/Debug/aes_ccm_decrypt.out b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/Debug/aes_ccm_decrypt.out new file mode 100644 index 0000000..5118c2a Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/Debug/aes_ccm_decrypt.out differ diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/macros.ini_initial b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/target_config.ccxml b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/ewarm/Exe/aes_ccm_decrypt.bin b/boards/dk-tm4c129x/aes_ccm_decrypt/ewarm/Exe/aes_ccm_decrypt.bin new file mode 100644 index 0000000..86f3a90 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_decrypt/ewarm/Exe/aes_ccm_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/ewarm/Exe/aes_ccm_decrypt.out b/boards/dk-tm4c129x/aes_ccm_decrypt/ewarm/Exe/aes_ccm_decrypt.out new file mode 100644 index 0000000..8f1d11f Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_decrypt/ewarm/Exe/aes_ccm_decrypt.out differ diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/gcc/aes_ccm_decrypt.axf b/boards/dk-tm4c129x/aes_ccm_decrypt/gcc/aes_ccm_decrypt.axf new file mode 100644 index 0000000..7f2e538 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_decrypt/gcc/aes_ccm_decrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/gcc/aes_ccm_decrypt.bin b/boards/dk-tm4c129x/aes_ccm_decrypt/gcc/aes_ccm_decrypt.bin new file mode 100644 index 0000000..5ffd15e Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_decrypt/gcc/aes_ccm_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/readme.txt b/boards/dk-tm4c129x/aes_ccm_decrypt/readme.txt new file mode 100644 index 0000000..5ff40e6 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/readme.txt @@ -0,0 +1,27 @@ +AES128 and AES256 CCM Decryption Demo + +Simple demo showing an decryption operation using the AES128 and AES256 +modules in CCM mode. A set of test cases are decrypted. + +Please note that the use of interrupts and uDMA is not required for the +operation of the module. It is only done for demonstration purposes. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/rvmdk/aes_ccm_decrypt.axf b/boards/dk-tm4c129x/aes_ccm_decrypt/rvmdk/aes_ccm_decrypt.axf new file mode 100644 index 0000000..2d30b31 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_decrypt/rvmdk/aes_ccm_decrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/rvmdk/aes_ccm_decrypt.bin b/boards/dk-tm4c129x/aes_ccm_decrypt/rvmdk/aes_ccm_decrypt.bin new file mode 100644 index 0000000..1435946 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_decrypt/rvmdk/aes_ccm_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/startup_ccs.c b/boards/dk-tm4c129x/aes_ccm_decrypt/startup_ccs.c new file mode 100644 index 0000000..882868b --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/startup_ewarm.c b/boards/dk-tm4c129x/aes_ccm_decrypt/startup_ewarm.c new file mode 100644 index 0000000..b08ccba --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/startup_gcc.c b/boards/dk-tm4c129x/aes_ccm_decrypt/startup_gcc.c new file mode 100644 index 0000000..f1c5730 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ccm_decrypt/startup_rvmdk.S b/boards/dk-tm4c129x/aes_ccm_decrypt/startup_rvmdk.S new file mode 100644 index 0000000..558dc08 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_decrypt/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN AESIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD AESIntHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/Makefile b/boards/dk-tm4c129x/aes_ccm_encrypt/Makefile new file mode 100644 index 0000000..ce98f78 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the AES128 and AES256 CCM Encryption Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the AES128 and AES256 CCM Encryption Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/aes_ccm_encrypt.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the AES128 and AES256 CCM Encryption Demo. +# +${COMPILER}/aes_ccm_encrypt.axf: ${COMPILER}/aes_ccm_encrypt.o +${COMPILER}/aes_ccm_encrypt.axf: ${COMPILER}/frame.o +${COMPILER}/aes_ccm_encrypt.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/aes_ccm_encrypt.axf: ${COMPILER}/pinout.o +${COMPILER}/aes_ccm_encrypt.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/aes_ccm_encrypt.axf: ${COMPILER}/uartstdio.o +${COMPILER}/aes_ccm_encrypt.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/aes_ccm_encrypt.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/aes_ccm_encrypt.axf: aes_ccm_encrypt.ld +SCATTERgcc_aes_ccm_encrypt=aes_ccm_encrypt.ld +ENTRY_aes_ccm_encrypt=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.c b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.c new file mode 100644 index 0000000..e2e32ce --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.c @@ -0,0 +1,1031 @@ +//***************************************************************************** +// +// aes_ccm_encrypt.c - Simple AES128 CCM encryption demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_aes.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/aes.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

AES128 and AES256 CCM Encryption Demo (aes_ccm_encrypt)

+//! +//! Simple demo showing an encryption operation using the AES128 and AES256 +//! modules in CCM mode. A set of test cases are encrypted. +//! +//! Please note that the use of interrupts and uDMA is not required for the +//! operation of the module. It is only done for demonstration purposes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Test cases from the NIST SP 800-38C document and proposals for IEEE P1619.1 +// Test Vectors +// +//***************************************************************************** +typedef struct AESTestVectorStruct +{ + uint32_t ui32KeySize; + uint32_t pui32Key[8]; + uint32_t ui32NonceLength; + uint32_t pui32Nonce[4]; + uint32_t ui32PayloadLength; + uint32_t pui32Payload[16]; + uint32_t ui32AuthDataLength; + uint32_t pui32AuthData[16]; + uint32_t pui32CipherText[16]; + uint32_t ui32TagLength; + uint32_t pui32Tag[4]; +} + +tAESCCMTestVector; + +tAESCCMTestVector g_psAESCCMTestVectors[] = +{ + // + // Test Case #1 + // The data in these test cases have been modified to be in big endian + // format as required by the AES module. This was done to simplify writes + // and comparisons. + // Also, The test vector is formatted in the document in a way that the + // ciphertext is the concatenation of the ciphertext and the MAC. they + // have been separated to match the operation of the AES module. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x43424140, 0x47464544, 0x4b4a4948, 0x4f4e4d4c }, // Key + 7, // Nonce Length + { 0x13121110, 0x00161514, 0x00000000, 0x00000000 }, // Nonce + 4, // Payload Length + { 0x23222120, 0x00000000, 0x00000000, 0x00000000 }, // Payload + 8, // Auth Data Length + { 0x03020100, 0x07060504, 0x00000000, 0x00000000 }, // Auth Data + { 0x5b016271, 0x00000000, 0x00000000, 0x00000000 }, // CipherText + 4, // Tag Length + { 0x5d25ac4d, 0x00000000, 0x00000000, 0x00000000 } // Tag + }, + + // + // Test Case #2 + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x43424140, 0x47464544, 0x4b4a4948, 0x4f4e4d4c }, // Key + 8, // Nonce Length + { 0x13121110, 0x17161514, 0x00000000, 0x00000000 }, // Nonce + 16, // Payload Length + { 0x23222120, 0x27262524, 0x2b2a2928, 0x2f2e2d2c }, // Payload + 16, // Auth Data Length + { 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c }, // Auth Data + { 0xe0f0a1d2, 0x625fea51, 0x92771a08, 0x3d593d07 }, // CipherText + 6, // Tag Length + { 0xbf4fc61f, 0x0000cdac, 0x00000000, 0x00000000 } // Tag + }, + + // + // Test Case #3 + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x43424140, 0x47464544, 0x4b4a4948, 0x4f4e4d4c }, // Key + 12, // Nonce Length + { 0x13121110, 0x17161514, 0x1b1a1918, 0x00000000 }, // Nonce + 24, // Payload Length + { 0x23222120, 0x27262524, 0x2b2a2928, 0x2f2e2d2c, // Payload + 0x33323130, 0x37363534, 0x00000000, 0x00000000 }, + 20, // Auth Data Length + { 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c, // Auth Data + 0x13121110, 0x00000000, 0x00000000, 0x00000000 }, + { 0xa901b2e3, 0x7a1ab7f5, 0xecea1c9b, 0x0be797cd, // CipherText + 0xd9aa7661, 0xa58a42a4, 0x00000000, 0x00000000 }, + 8, // Tag Length + { 0xfb924348, 0x5199b0c1, 0x00000000, 0x00000000 } // Tag + }, + + // + // The following test cases use 256bit key, and they are taken from + // proposals for IEEE P1619.1 Test Vectors. + // + // Test Case #4 + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0xb21576fb, 0x1d89803d, 0x0b9870d4, 0xc88495c7, // Key + 0xce64fbb2, 0x4d8f9760, 0x5ae4fc17, 0xb730e849 }, + 12, // Nonce Length + { 0x63a3d1db, 0xb4b72460, 0x6f7dda02, 0x00000000 }, // Nonce + 16, // Payload Length + { 0x8e3445a8, 0xf1b5c5c8, 0x760ef526, 0x1e1bfdfe, // Payload + 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 0, // Auth Data Length + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, // Auth Data + 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x611288cc, 0x72faa7c6, 0x39176ab9, 0x7f276b17, // CipherText + 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 16, // Tag Length + { 0x14e17234, 0xbe0c2c5f, 0x06496314, 0x23e4f02c } // Tag + }, + + // + // Test Case #5 + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0x43424140, 0x47464544, 0x4b4a4948, 0x4f4e4d4c, // Key + 0x53525150, 0x57565554, 0x5b5a5958, 0x5f5e5d5c }, + 12, // Nonce Length + { 0x13121110, 0x17161514, 0x1b1a1918, 0x00000000 }, // Nonce + 24, // Payload Length + { 0x23222120, 0x27262524, 0x2b2a2928, 0x2f2e2d2c, // Payload + 0x33323130, 0x37363534, 0x00000000, 0x00000000 }, + 20, // Auth Data Length + { 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c, // Auth Data + 0x13121110, 0x00000000, 0x00000000, 0x00000000 }, + { 0xae83f804, 0x3007bdb3, 0xb60bf5ea, 0x21a24fde, // CipherText + 0xe4e43420, 0xe5750e1b, 0x00000000, 0x00000000 }, + 16, // Tag Length + { 0x3a3fba9b, 0x39327f10, 0x299063bd, 0x7103f823 } // Tag + } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Round up length to nearest 16 byte boundary. This is needed because all +// four data registers must be written at once. This is handled in the AES +// driver, but if using uDMA, the length must rounded up. +// +//***************************************************************************** +uint32_t +LengthRoundUp(uint32_t ui32Length) +{ + uint32_t ui32Remainder; + + ui32Remainder = ui32Length % 16; + if(ui32Remainder == 0) + { + return(ui32Length); + } + else + { + return(ui32Length + (16 - ui32Remainder)); + } +} + +//***************************************************************************** +// +// The AES interrupt handler and interrupt flags. +// +//***************************************************************************** +static volatile bool g_bContextInIntFlag; +static volatile bool g_bDataInIntFlag; +static volatile bool g_bContextOutIntFlag; +static volatile bool g_bDataOutIntFlag; +static volatile bool g_bContextInDMADoneIntFlag; +static volatile bool g_bDataInDMADoneIntFlag; +static volatile bool g_bContextOutDMADoneIntFlag; +static volatile bool g_bDataOutDMADoneIntFlag; + +void +AESIntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the AES masked interrupt status. + // + ui32IntStatus = ROM_AESIntStatus(AES_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & AES_INT_CONTEXT_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_IN); + g_bContextInIntFlag = true; + UARTprintf(" Context input registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_IN); + g_bDataInIntFlag = true; + UARTprintf(" Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & AES_INT_CONTEXT_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_OUT); + g_bContextOutIntFlag = true; + UARTprintf(" Context output registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_OUT); + g_bDataOutIntFlag = true; + UARTprintf(" Data FIFO is ready to provide data.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneIntFlag = true; + UARTprintf(" DMA completed a context write to the internal\n"); + UARTprintf(" registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_IN); + g_bDataInDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of input data to\n"); + UARTprintf(" the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_OUT); + g_bContextOutDMADoneIntFlag = true; + UARTprintf(" DMA completed the output context movement from\n"); + UARTprintf(" the internal registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_OUT); + g_bDataOutDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of process result.\n"); + } +} + +//***************************************************************************** +// +// Perform an CCM encryption operation. +// +//***************************************************************************** +bool +AESCCMEncrypt(uint32_t ui32Keysize, uint32_t *pui32Key, + uint32_t *pui32Src, uint32_t *pui32Dst, + uint32_t ui32DataLength, uint32_t *pui32Nonce, + uint32_t ui32NonceLength, uint32_t *pui32AuthData, + uint32_t ui32AuthDataLength, uint32_t *pui32Tag, + uint32_t ui32TagLength, bool bUseDMA) +{ + uint32_t pui32IV[4], ui32Idx; + uint32_t ui32M, ui32L; + uint8_t *pui8Nonce, *pui8IV; + + // + // Determine the value of M. It is determined using + // the tag length. + // + if(ui32TagLength == 4) + { + ui32M = AES_CFG_CCM_M_4; + } + else if(ui32TagLength == 6) + { + ui32M = AES_CFG_CCM_M_6; + } + else if(ui32TagLength == 8) + { + ui32M = AES_CFG_CCM_M_8; + } + else if(ui32TagLength == 10) + { + ui32M = AES_CFG_CCM_M_10; + } + else if(ui32TagLength == 12) + { + ui32M = AES_CFG_CCM_M_12; + } + else if(ui32TagLength == 14) + { + ui32M = AES_CFG_CCM_M_14; + } + else if(ui32TagLength == 16) + { + ui32M = AES_CFG_CCM_M_16; + } + else + { + UARTprintf("Unexpected tag length.\n"); + return(false); + } + + // + // Determine the value of L. This is determined by using + // the value of q from the NIST document: n + q = 15 + // + if(ui32NonceLength == 7) + { + ui32L = AES_CFG_CCM_L_8; + } + else if(ui32NonceLength == 8) + { + ui32L = AES_CFG_CCM_L_7; + } + else if(ui32NonceLength == 9) + { + ui32L = AES_CFG_CCM_L_6; + } + else if(ui32NonceLength == 10) + { + ui32L = AES_CFG_CCM_L_5; + } + else if(ui32NonceLength == 11) + { + ui32L = AES_CFG_CCM_L_4; + } + else if(ui32NonceLength == 12) + { + ui32L = AES_CFG_CCM_L_3; + } + else if(ui32NonceLength == 13) + { + ui32L = AES_CFG_CCM_L_2; + } + else if(ui32NonceLength == 14) + { + ui32L = AES_CFG_CCM_L_1; + } + else + { + UARTprintf("Unexpected nonce length.\n"); + return(false); + } + + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Clear the interrupt flags. + // + g_bContextInIntFlag = false; + g_bDataInIntFlag = false; + g_bContextOutIntFlag = false; + g_bDataOutIntFlag = false; + g_bContextInDMADoneIntFlag = false; + g_bDataInDMADoneIntFlag = false; + g_bContextOutDMADoneIntFlag = false; + g_bDataOutDMADoneIntFlag = false; + + // + // Enable all interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | + AES_INT_DATA_IN | AES_INT_DATA_OUT)); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_ENCRYPT | + AES_CFG_CTR_WIDTH_128 | + AES_CFG_MODE_CCM | ui32L | ui32M)); + + // + // Determine the value to be written in the initial value registers. It is + // the concatenation of 5 bits of zero, 3 bits of L, nonce, and the counter + // value. First, clear the contents of the IV. + // + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32IV[ui32Idx] = 0; + } + + // + // Now find the binary value of L. + // + if(ui32L == AES_CFG_CCM_L_8) + { + pui32IV[0] = 0x7; + } + else if(ui32L == AES_CFG_CCM_L_7) + { + pui32IV[0] = 0x6; + } + else if(ui32L == AES_CFG_CCM_L_6) + { + pui32IV[0] = 0x5; + } + else if(ui32L == AES_CFG_CCM_L_5) + { + pui32IV[0] = 0x4; + } + else if(ui32L == AES_CFG_CCM_L_4) + { + pui32IV[0] = 0x3; + } + else if(ui32L == AES_CFG_CCM_L_3) + { + pui32IV[0] = 0x2; + } + else if(ui32L == AES_CFG_CCM_L_2) + { + pui32IV[0] = 0x1; + } + + // + // Finally copy the contents of the nonce into the IV. Convert + // the pointers to simplify the copying. + // + pui8Nonce = (uint8_t *)pui32Nonce; + pui8IV = (uint8_t *)pui32IV; + for(ui32Idx = 0; ui32Idx < ui32NonceLength; ui32Idx++) + { + pui8IV[ui32Idx + 1] = pui8Nonce[ui32Idx]; + } + + // + // Write the initial value. + // + ROM_AESIVSet(AES_BASE, pui32IV); + + // + // Write the key. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Depending on the argument, perform the encryption + // with or without uDMA. + // + if(bUseDMA) + { + // + // Enable DMA interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_DMA_CONTEXT_IN | + AES_INT_DMA_DATA_IN | + AES_INT_DMA_CONTEXT_OUT | + AES_INT_DMA_DATA_OUT)); + + // + // Setup the DMA module to copy auth data in. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + + if(ui32AuthDataLength) + { + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32AuthData, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32AuthDataLength) / 4); + } + UARTprintf("Data in DMA request enabled.\n"); + + // + // Setup the DMA module to copy the data out. + // + ROM_uDMAChannelAssign(UDMA_CH15_AES0DOUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH15_AES0DOUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_NONE | + UDMA_DST_INC_32 | UDMA_ARB_4 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(AES_BASE + AES_O_DATA_IN_0), + (void *)pui32Dst, + LengthRoundUp(ui32DataLength) / 4); + UARTprintf("Data out DMA request enabled.\n"); + + // + // Write the length registers. + // + ROM_AESLengthSet(AES_BASE, (uint64_t)ui32DataLength); + + // + // Write the auth length registers to start the process. + // + ROM_AESAuthLengthSet(AES_BASE, ui32AuthDataLength); + + // + // Enable the DMA channels to start the transfers. This must be done after + // writing the length to prevent data from copying before the context is + // truly ready. + // + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + ROM_uDMAChannelEnable(UDMA_CH15_AES0DOUT); + + // + // Enable DMA requests. + // + ROM_AESDMAEnable(AES_BASE, AES_DMA_DATA_IN | AES_DMA_DATA_OUT); + + // + // Wait for the data in DMA done interrupt. + // + while(!g_bDataInDMADoneIntFlag) + { + } + + // + // Setup the uDMA to copy the plaintext data. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Src, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32DataLength) / 4); + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + UARTprintf("Data in DMA request enabled.\n"); + + // + // Wait for the data out DMA done interrupt. + // + while(!g_bDataOutDMADoneIntFlag) + { + } + + // + // Read the tag out. + // + ROM_AESTagRead(AES_BASE, pui32Tag); + } + else + { + // + // Perform the encryption. + // + ROM_AESDataProcessAuth(AES_BASE, pui32Src, pui32Dst, ui32DataLength, + pui32AuthData, ui32AuthDataLength, pui32Tag); + } + return(true); +} + +//***************************************************************************** +// +// Initialize the AES and CCM modules. +// +//***************************************************************************** +bool +AESInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example encrypts a block of payload using AES128 in CCM mode. It +// does the encryption first without uDMA and then with uDMA. The results +// are checked after each operation. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32CipherText[16], pui32Tag[4], ui32Errors, ui32Idx; + uint32_t ui32PayloadLength, ui32TagLength; + uint32_t ui32NonceLength, ui32AuthDataLength; + uint32_t *pui32Nonce, *pui32AuthData, ui32SysClock; + uint32_t *pui32Key, *pui32Payload, *pui32ExpCipherText; + uint32_t ui32Keysize; + uint8_t ui8Vector; + uint8_t *pui8ExpTag, *pui8Tag; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | + SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "aes-ccm-encrypt"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + pui8Tag = (uint8_t *)pui32Tag; + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUStackingEnable(); + + // + // Configure the system clock to run off the internal 16MHz oscillator. + // + MAP_SysCtlClockFreqSet(SYSCTL_OSC_INT | SYSCTL_USE_OSC, 16000000); + + // + // Enable AES interrupts. + // + ROM_IntEnable(INT_AES0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting AES CCM encryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and AES modules. + // + if(!AESInit()) + { + UARTprintf("Initialization of the AES module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Loop through all the given vectors. + // + for(ui8Vector = 0; + (ui8Vector < + (sizeof(g_psAESCCMTestVectors) / sizeof(g_psAESCCMTestVectors[0]))) && + (ui32Errors == 0); + ui8Vector++) + { + UARTprintf("Starting vector #%d\n", ui8Vector); + + // + // Get the current vector's data members. + // + ui32Keysize = g_psAESCCMTestVectors[ui8Vector].ui32KeySize; + pui32Key = g_psAESCCMTestVectors[ui8Vector].pui32Key; + pui32Payload = g_psAESCCMTestVectors[ui8Vector].pui32Payload; + ui32PayloadLength = + g_psAESCCMTestVectors[ui8Vector].ui32PayloadLength; + pui32AuthData = g_psAESCCMTestVectors[ui8Vector].pui32AuthData; + ui32AuthDataLength = + g_psAESCCMTestVectors[ui8Vector].ui32AuthDataLength; + pui32ExpCipherText = + g_psAESCCMTestVectors[ui8Vector].pui32CipherText; + pui8ExpTag = (uint8_t *)g_psAESCCMTestVectors[ui8Vector].pui32Tag; + ui32TagLength = g_psAESCCMTestVectors[ui8Vector].ui32TagLength; + pui32Nonce = g_psAESCCMTestVectors[ui8Vector].pui32Nonce; + ui32NonceLength = + g_psAESCCMTestVectors[ui8Vector].ui32NonceLength; + + // + // Perform the encryption without uDMA. + // + UARTprintf("Performing encryption without uDMA.\n"); + AESCCMEncrypt(ui32Keysize, pui32Key, pui32Payload, pui32CipherText, + ui32PayloadLength, pui32Nonce, ui32NonceLength, + pui32AuthData, ui32AuthDataLength, pui32Tag, + ui32TagLength, false); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < (ui32PayloadLength / 4); ui32Idx++) + { + if(pui32CipherText[ui32Idx] != pui32ExpCipherText[ui32Idx]) + { + UARTprintf("Ciphertext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32ExpCipherText[ui32Idx], + pui32CipherText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + for(ui32Idx = 0; ui32Idx < ui32TagLength; ui32Idx++) + { + if(pui8Tag[ui32Idx] != pui8ExpTag[ui32Idx]) + { + UARTprintf("Tag mismatch on byte %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui8ExpTag[ui32Idx], + pui8Tag[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000004; + } + } + + // + // Clear the array containing the ciphertext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + + // + // Perform the encryption with uDMA. + // + UARTprintf("Performing encryption with uDMA.\n"); + AESCCMEncrypt(ui32Keysize, pui32Key, pui32Payload, pui32CipherText, + ui32PayloadLength, pui32Nonce, ui32NonceLength, + pui32AuthData, ui32AuthDataLength, pui32Tag, + ui32TagLength, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < (ui32PayloadLength / 4); ui32Idx++) + { + if(pui32CipherText[ui32Idx] != pui32ExpCipherText[ui32Idx]) + { + UARTprintf("Ciphertext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32ExpCipherText[ui32Idx], + pui32CipherText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + for(ui32Idx = 0; ui32Idx < ui32TagLength; ui32Idx++) + { + if(pui8Tag[ui32Idx] != pui8ExpTag[ui32Idx]) + { + UARTprintf("Tag mismatch on byte %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui8ExpTag[ui32Idx], + pui8Tag[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000004; + } + } + + // + // Clear the array containing the ciphertext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ewd b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ewp b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ewp new file mode 100644 index 0000000..ef1f46d --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\aes_ccm_encrypt.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.icf b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.icf new file mode 100644 index 0000000..c963437 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// aes_ccm_encrypt.icf - Linker configuration file for aes_ccm_encrypt. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ld b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ld new file mode 100644 index 0000000..aacb216 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * aes_ccm_encrypt.ld - Linker configuration file for aes_ccm_encrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.sct b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.sct new file mode 100644 index 0000000..147f91b --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; aes_ccm_encrypt.sct - Linker configuration file for aes_ccm_encrypt. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.uvopt b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.uvopt new file mode 100644 index 0000000..5e124fe --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + aes_ccm_encrypt + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\aes_ccm_encrypt.c + aes_ccm_encrypt.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.uvproj b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.uvproj new file mode 100644 index 0000000..ff248ea --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + aes_ccm_encrypt + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + aes_ccm_encrypt + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\aes_ccm_encrypt.bin .\rvmdk\aes_ccm_encrypt.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + aes_ccm_encrypt.sct + + + --entry Reset_Handler + + + + + + + + Source + + + aes_ccm_encrypt.c + 1 + .\aes_ccm_encrypt.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt_ccs.cmd b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt_ccs.cmd new file mode 100644 index 0000000..fbeb0a3 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * aes_ccm_encrypt_ccs.cmd - CCS linker configuration file for aes_ccm_encrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.ccsimportspec b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.ccsimportspec new file mode 100644 index 0000000..52e0e00 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.ccsproject b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.cproject b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.cproject new file mode 100644 index 0000000..909c7df --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.project b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.project new file mode 100644 index 0000000..b455fdf --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.project @@ -0,0 +1,70 @@ + + + aes_ccm_encrypt + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + aes_ccm_encrypt.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt.c + + + aes_ccm_encrypt_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ccm_encrypt/aes_ccm_encrypt_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ccm_encrypt/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/Debug/aes_ccm_encrypt.bin b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/Debug/aes_ccm_encrypt.bin new file mode 100644 index 0000000..f8e4912 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/Debug/aes_ccm_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/Debug/aes_ccm_encrypt.out b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/Debug/aes_ccm_encrypt.out new file mode 100644 index 0000000..ab123ba Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/Debug/aes_ccm_encrypt.out differ diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/macros.ini_initial b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/target_config.ccxml b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/ewarm/Exe/aes_ccm_encrypt.bin b/boards/dk-tm4c129x/aes_ccm_encrypt/ewarm/Exe/aes_ccm_encrypt.bin new file mode 100644 index 0000000..1ac6ae9 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_encrypt/ewarm/Exe/aes_ccm_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/ewarm/Exe/aes_ccm_encrypt.out b/boards/dk-tm4c129x/aes_ccm_encrypt/ewarm/Exe/aes_ccm_encrypt.out new file mode 100644 index 0000000..6cf610b Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_encrypt/ewarm/Exe/aes_ccm_encrypt.out differ diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/gcc/aes_ccm_encrypt.axf b/boards/dk-tm4c129x/aes_ccm_encrypt/gcc/aes_ccm_encrypt.axf new file mode 100644 index 0000000..ff27801 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_encrypt/gcc/aes_ccm_encrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/gcc/aes_ccm_encrypt.bin b/boards/dk-tm4c129x/aes_ccm_encrypt/gcc/aes_ccm_encrypt.bin new file mode 100644 index 0000000..5d150f1 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_encrypt/gcc/aes_ccm_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/readme.txt b/boards/dk-tm4c129x/aes_ccm_encrypt/readme.txt new file mode 100644 index 0000000..e1d0e51 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/readme.txt @@ -0,0 +1,27 @@ +AES128 and AES256 CCM Encryption Demo + +Simple demo showing an encryption operation using the AES128 and AES256 +modules in CCM mode. A set of test cases are encrypted. + +Please note that the use of interrupts and uDMA is not required for the +operation of the module. It is only done for demonstration purposes. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/rvmdk/aes_ccm_encrypt.axf b/boards/dk-tm4c129x/aes_ccm_encrypt/rvmdk/aes_ccm_encrypt.axf new file mode 100644 index 0000000..b27c1ed Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_encrypt/rvmdk/aes_ccm_encrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/rvmdk/aes_ccm_encrypt.bin b/boards/dk-tm4c129x/aes_ccm_encrypt/rvmdk/aes_ccm_encrypt.bin new file mode 100644 index 0000000..b0eb16a Binary files /dev/null and b/boards/dk-tm4c129x/aes_ccm_encrypt/rvmdk/aes_ccm_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/startup_ccs.c b/boards/dk-tm4c129x/aes_ccm_encrypt/startup_ccs.c new file mode 100644 index 0000000..882868b --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/startup_ewarm.c b/boards/dk-tm4c129x/aes_ccm_encrypt/startup_ewarm.c new file mode 100644 index 0000000..b08ccba --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/startup_gcc.c b/boards/dk-tm4c129x/aes_ccm_encrypt/startup_gcc.c new file mode 100644 index 0000000..f1c5730 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ccm_encrypt/startup_rvmdk.S b/boards/dk-tm4c129x/aes_ccm_encrypt/startup_rvmdk.S new file mode 100644 index 0000000..558dc08 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ccm_encrypt/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN AESIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD AESIntHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/aes_cmac/Makefile b/boards/dk-tm4c129x/aes_cmac/Makefile new file mode 100644 index 0000000..0590501 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the AES128 and AES256 CMAC Encryption Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the AES128 and AES256 CMAC Encryption Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/aes_cmac.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the AES128 and AES256 CMAC Encryption Demo. +# +${COMPILER}/aes_cmac.axf: ${COMPILER}/aes_cmac.o +${COMPILER}/aes_cmac.axf: ${COMPILER}/frame.o +${COMPILER}/aes_cmac.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/aes_cmac.axf: ${COMPILER}/pinout.o +${COMPILER}/aes_cmac.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/aes_cmac.axf: ${COMPILER}/uartstdio.o +${COMPILER}/aes_cmac.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/aes_cmac.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/aes_cmac.axf: aes_cmac.ld +SCATTERgcc_aes_cmac=aes_cmac.ld +ENTRY_aes_cmac=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/aes_cmac/aes_cmac.c b/boards/dk-tm4c129x/aes_cmac/aes_cmac.c new file mode 100644 index 0000000..a31f903 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/aes_cmac.c @@ -0,0 +1,957 @@ +//***************************************************************************** +// +// aes_cmac.c - Simple AES CMAC demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_aes.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/aes.h" +#include "driverlib/debug.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

AES128 and AES256 CMAC Demo (aes128_cmac)

+//! +//! Simple demo showing an authentication operation using the AES128 and +//! AES256 modules in CMAC mode. A series of test vectors are authenticated. +//! +//! This module is also capable of CBC-MAC mode, but this has been determined +//! to be insecure when using variable message lengths. CMAC is now +//! recommended instead by NIST. +//! +//! Please note that the use of interrupts and uDMA is not required for the +//! operation of the module. It is only done for demonstration purposes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Test cases from the NIST SP 800-38B document. +// The data in these test cases have been modified to be in big endian +// format as required by the AES module. This was done to simplify writes +// and comparisons. When operations need to be performed on the data, the +// endianness is swapped. +// +//***************************************************************************** +typedef struct AESTestVectorStruct +{ + uint32_t ui32KeySize; + uint32_t *pui32Key; + uint32_t ui32Length; + uint32_t pui32Message[16]; + uint32_t pui32Tag[4]; +} +tAESCMACTestVector; + +// +// The following keys are used in the following test cases. +// +uint32_t g_pui32AES128Key[4] = +{ + 0x16157e2b, 0xa6d2ae28, 0x8815f7ab, 0x3c4fcf09 +}; + +uint32_t g_pui32AES256Key[8] = +{ + 0x10eb3d60, 0xbe71ca15, 0xf0ae732b, 0x81777d85, + 0x072c351f, 0xd708613b, 0xa310982d, 0xf4df1409 +}; + +tAESCMACTestVector g_psAESCMACTestVectors[] = +{ + // + // Test Case #1 ~ #4 are AES128 cases + // Test Case #1 + // Empty message check. Since there is no message, it must be + // padded with a one and 127 zeros. Also, a zero cannot be + // written into the length register in this mode, so we just + // write a 1 as the length to signify an incomplete block. + // Any value from 1 to 15 would have worked in this case. + // Incomplete blocks are XOR'd with subkey2 rather than subkey1. + // + { + AES_CFG_KEY_SIZE_128BIT, + g_pui32AES128Key, + 1, + { 0x00000080, 0x00000000, 0x00000000, 0x00000000 }, + { 0x29691dbb, 0x283759e9, 0x127da37f, 0x4667759b } + }, + + // + // Test Case #2 + // This is the first complete block. It is XOR'd with subkey1. + // + { + AES_CFG_KEY_SIZE_128BIT, + g_pui32AES128Key, + 16, + { 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373 }, + { 0xb4160a07, 0x44414d6b, 0x9ddd9bf7, 0x7c284ad0 } + }, + + // + // Test Case #3 + // Since the message is not a multiple of 128 bits, there must + // be padding appended to the end of the message. This padding + // is a one followed by 63 zeros. + // + { + AES_CFG_KEY_SIZE_128BIT, + g_pui32AES128Key, + 40, + { 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373, + 0x578a2dae, 0x9cac031e, 0xac6fb79e, 0x518eaf45, + 0x461cc830, 0x11e45ca3, 0x00000080, 0x00000000 }, + { 0x4767a6df, 0x30e69ade, 0x6132ca30, 0x27c89714 } + }, + + // + // Test Case #4 + // + { + AES_CFG_KEY_SIZE_128BIT, + g_pui32AES128Key, + 64, + { 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373, + 0x578a2dae, 0x9cac031e, 0xac6fb79e, 0x518eaf45, + 0x461cc830, 0x11e45ca3, 0x19c1fbe5, 0xef520a1a, + 0x45249ff6, 0x179b4fdf, 0x7b412bad, 0x10376ce6 }, + { 0xbfbef051, 0x929d3b7e, 0x177449fc, 0xfe3c3679 } + }, + + // + // Test Case #5 ~ #8 are AES256 cases + // + // Test Case #5 + // Empty message check. + // + { + AES_CFG_KEY_SIZE_256BIT, + g_pui32AES256Key, + 1, + { 0x00000080, 0x00000000, 0x00000000, 0x00000000 }, + { 0xf6628902, 0x9ef87b1b, 0x1f556bfc, 0x83d96746 } + }, + + // + // Test Case #6 + // This is the first complete block. It is XOR'd with subkey1. + // + { + AES_CFG_KEY_SIZE_256BIT, + g_pui32AES256Key, + 16, + { 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373 }, + { 0x3f02a728, 0x828f2e45, 0x8df24bbd, 0x5cc3378c } + }, + + // + // Test Case #7 + // Since the message is not a multiple of 128 bits, there must + // be padding appended to the end of the message. This padding + // is a one followed by 63 zeros. + // + { + AES_CFG_KEY_SIZE_256BIT, + g_pui32AES256Key, + 40, + { 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373, + 0x578a2dae, 0x9cac031e, 0xac6fb79e, 0x518eaf45, + 0x461cc830, 0x11e45ca3, 0x00000080, 0x00000000 }, + { 0xf1d8f3aa, 0xc24056de, 0x69b1f532, 0xe611c9b9 } + }, + + // + // Test Case #8 + // + { + AES_CFG_KEY_SIZE_256BIT, + g_pui32AES256Key, + 64, + { 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373, + 0x578a2dae, 0x9cac031e, 0xac6fb79e, 0x518eaf45, + 0x461cc830, 0x11e45ca3, 0x19c1fbe5, 0xef520a1a, + 0x45249ff6, 0x179b4fdf, 0x7b412bad, 0x10376ce6 }, + { 0x902199e1, 0xd56e9f54, 0x052c6a69, 0x1054316c } + } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Round up length to nearest 16 byte boundary. This is needed because all +// four data registers must be written at once. This is handled in the AES +// driver, but if using uDMA, the length must rounded up. +// +//***************************************************************************** +uint32_t +LengthRoundUp(uint32_t ui32Length) +{ + uint32_t ui32Remainder; + + ui32Remainder = ui32Length % 16; + if(ui32Remainder == 0) + { + return(ui32Length); + } + else + { + return(ui32Length + (16 - ui32Remainder)); + } +} + +//***************************************************************************** +// +// Switch the endianness of the data array. +// +//***************************************************************************** +void +EndiannessSwap(uint32_t *pui32Input, uint32_t *pui32Output, + uint32_t ui32Length) +{ + uint32_t ui32Count; + + // + // For each word, swap the endianness. + // + for(ui32Count = 0; ui32Count < ui32Length; ui32Count++) + { + pui32Output[ui32Count] = ((pui32Input[ui32Count] & 0x000000ff) << 24) | + ((pui32Input[ui32Count] & 0x0000ff00) << 8) | + ((pui32Input[ui32Count] & 0x00ff0000) >> 8) | + ((pui32Input[ui32Count] & 0xff000000) >> 24); + + } +} + +//***************************************************************************** +// +// The AES interrupt handler and interrupt flags. +// +//***************************************************************************** +static volatile bool g_bContextInIntFlag; +static volatile bool g_bDataInIntFlag; +static volatile bool g_bContextOutIntFlag; +static volatile bool g_bDataOutIntFlag; +static volatile bool g_bContextInDMADoneIntFlag; +static volatile bool g_bDataInDMADoneIntFlag; +static volatile bool g_bContextOutDMADoneIntFlag; +static volatile bool g_bDataOutDMADoneIntFlag; + +void +AESIntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the AES masked interrupt status. + // + ui32IntStatus = ROM_AESIntStatus(AES_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & AES_INT_CONTEXT_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_IN); + g_bContextInIntFlag = true; + UARTprintf(" Context input registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_IN); + g_bDataInIntFlag = true; + UARTprintf(" Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & AES_INT_CONTEXT_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_OUT); + g_bContextOutIntFlag = true; + UARTprintf(" Context output registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_OUT); + g_bDataOutIntFlag = true; + UARTprintf(" Data FIFO is ready to provide data.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneIntFlag = true; + UARTprintf(" DMA completed a context write to the internal\n"); + UARTprintf(" registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_IN); + g_bDataInDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of input data to\n"); + UARTprintf(" the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_OUT); + g_bContextOutDMADoneIntFlag = true; + UARTprintf(" DMA completed the output context movement from\n"); + UARTprintf(" the internal registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_OUT); + g_bDataOutDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of process result.\n"); + } +} + +//***************************************************************************** +// +// Perform an ECB encryption operation. +// +//***************************************************************************** +bool +AESECBEncrypt(uint32_t ui32Keysize, uint32_t *pui32Src, uint32_t *pui32Dst, + uint32_t *pui32Key, uint32_t ui32Length) +{ + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_ENCRYPT | + AES_CFG_MODE_ECB)); + + // + // Write the key. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Perform the encryption. + // + ROM_AESDataProcess(AES_BASE, pui32Src, pui32Dst, ui32Length); + + return(true); +} + +//***************************************************************************** +// +// Generate a CMAC subkey. +// +//***************************************************************************** +bool +AESCMACSubkeyGet(uint32_t *pui32Key, uint32_t *pui32Input, + uint32_t *pui32Subkey) +{ + uint32_t pui32Output[4]; + uint32_t pui32SwappedInput[4]; + int32_t i32Idx; + bool bCarry; + + // + // If the MSB of the input is 0, then the subkey is just left shifted. + // If the MSB of the input is 1, then the subkey is left shifted and + // XOR'd with a constant. First swap the endianness to big endian + // to make the math easier. + // + EndiannessSwap(pui32Input, pui32SwappedInput, 4); + + // + // Shift each word in the 128 bits. Make sure to carry the left + // shifted bits. + // + bCarry = false; + for(i32Idx = 3; i32Idx >= 0; i32Idx--) + { + // + // Shift the word. + // + pui32Output[i32Idx] = pui32SwappedInput[i32Idx] << 1; + + // + // If there was a carry from the previous word. + // + if(bCarry) + { + pui32Output[i32Idx] |= 0x1; + bCarry = false; + } + + // + // Check to see if we need to carry to the next word. + // + if(pui32SwappedInput[i32Idx] & 0x80000000) + { + bCarry = true; + } + } + + // + // Swap the endianness back to little endian. + // + EndiannessSwap(pui32Output, pui32Subkey, 4); + + // + // XOR in the Rb constant if the MSB is 1. + // + if(pui32SwappedInput[0] & 0x80000000) + { + pui32Subkey[3] ^= 0x87000000; + } + + return true; +} + +//***************************************************************************** +// +// Perform an encryption operation. +// +//***************************************************************************** +bool +AESCMACAuth(uint32_t ui32Keysize, uint32_t *pui32Src, uint32_t *pui32Key, + uint32_t *pui32Tag, uint32_t ui32Length, bool bUseDMA) +{ + uint32_t pui32Subkey1[4]; + uint32_t pui32Subkey2[4]; + uint32_t pui32Zero[4]; + uint32_t pui32EncZero[4]; + + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Clear the interrupt flags. + // + g_bContextInIntFlag = false; + g_bDataInIntFlag = false; + g_bContextOutIntFlag = false; + g_bDataOutIntFlag = false; + g_bContextInDMADoneIntFlag = false; + g_bDataInDMADoneIntFlag = false; + g_bContextOutDMADoneIntFlag = false; + g_bDataOutDMADoneIntFlag = false; + + // + // Calculate the first subkey. First, encrypt a zero string. + // + pui32Zero[0] = 0x00000000; + pui32Zero[1] = 0x00000000; + pui32Zero[2] = 0x00000000; + pui32Zero[3] = 0x00000000; + + // + // Encrypt the zero string. + // + AESECBEncrypt(ui32Keysize, pui32Zero, pui32EncZero, pui32Key, 16); + + // + // Get the first subkey. + // + AESCMACSubkeyGet(pui32Key, pui32EncZero, pui32Subkey1); + + // + // Get the second subkey. + // + AESCMACSubkeyGet(pui32Key, pui32Subkey1, pui32Subkey2); + + // + // Enable all interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | + AES_INT_DATA_IN | AES_INT_DATA_OUT)); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_ENCRYPT | + AES_CFG_MODE_CBCMAC)); + + // + // Write the key. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Write the first subkey. + // + ROM_AESKey2Set(AES_BASE, pui32Subkey1, ui32Keysize); + + // + // Write the second subkey. + // + ROM_AESKey3Set(AES_BASE, pui32Subkey2); + + // + // Write the IV with zeroes. + // + ROM_AESIVSet(AES_BASE, pui32Zero); + + // + // Depending on the argument, perform the encryption + // with or without uDMA. + // + if(bUseDMA) + { + // + // Enable DMA interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_DMA_CONTEXT_IN | + AES_INT_DMA_DATA_IN | + AES_INT_DMA_CONTEXT_OUT | + AES_INT_DMA_DATA_OUT)); + + // + // Setup the DMA module to copy data in. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Src, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data in DMA request enabled.\n"); + + // + // Write the length registers to start the process. + // + ROM_AESLengthSet(AES_BASE, (uint64_t)ui32Length); + + // + // Enable the DMA channel to start the transfer. This must be done after + // writing the length to prevent data from copying before the context is + // truly ready. + // + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + + // + // Enable DMA requests + // + ROM_AESDMAEnable(AES_BASE, AES_DMA_DATA_IN); + + // + // Wait for the data in DMA done interrupt. + // + while(!g_bDataInDMADoneIntFlag) + { + } + + // + // Read out the tag. + // + ROM_AESTagRead(AES_BASE, pui32Tag); + } + else + { + // + // Perform the authentication. + // + ROM_AESDataAuth(AES_BASE, pui32Src, ui32Length, pui32Tag); + } + + return(true); +} + +//***************************************************************************** +// +// Initialize the AES and CCM modules. +// +//***************************************************************************** +bool +AESInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example authenticates blocks of plaintext using AES128 and AES256 in +// CMAC mode. +// It does the encryption first without uDMA and then with uDMA. The results +// are checked after each operation. +// +//***************************************************************************** +int +main(void) +{ + uint32_t *pui32ExpTag, *pui32Message; + uint32_t ui32Errors, ui32Idx, ui32Length, pui32Tag[4], ui32SysClock; + uint32_t ui32KeySize, *pui32Key; + uint8_t ui8Vector; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | + SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "aes-cmac"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUStackingEnable(); + + // + // Enable AES interrupts. + // + ROM_IntEnable(INT_AES0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting AES CMAC encryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and AES modules. + // + if(!AESInit()) + { + UARTprintf("Initialization of the AES module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Loop through all the given vectors. + // + for(ui8Vector = 0; + (ui8Vector < + (sizeof(g_psAESCMACTestVectors) / sizeof(g_psAESCMACTestVectors[0]))) && + (ui32Errors == 0); + ui8Vector++) + { + UARTprintf("Starting vector #%d\n", ui8Vector); + + // + // Get the current vector's data members. + // + ui32KeySize = g_psAESCMACTestVectors[ui8Vector].ui32KeySize; + pui32Key = g_psAESCMACTestVectors[ui8Vector].pui32Key; + ui32Length = g_psAESCMACTestVectors[ui8Vector].ui32Length; + pui32Message = g_psAESCMACTestVectors[ui8Vector].pui32Message; + pui32ExpTag = g_psAESCMACTestVectors[ui8Vector].pui32Tag; + + // + // Perform the encryption without uDMA. + // + UARTprintf("Performing encryption without uDMA.\n"); + AESCMACAuth(ui32KeySize, pui32Message, pui32Key, + pui32Tag, ui32Length, false); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + if(pui32Tag[ui32Idx] != pui32ExpTag[ui32Idx]) + { + UARTprintf("Tag mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32ExpTag[ui32Idx], + pui32Tag[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + + // + // Clear the array containing the tag. + // + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + + // + // Only use DMA with the vectors that have data. + // + if(ui32Length != 0) + { + // + // Perform the encryption with uDMA. + // + UARTprintf("Performing encryption with uDMA.\n"); + AESCMACAuth(ui32KeySize, pui32Message, pui32Key, + pui32Tag, ui32Length, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + if(pui32Tag[ui32Idx] != pui32ExpTag[ui32Idx]) + { + UARTprintf("Tag mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32ExpTag[ui32Idx], + pui32Tag[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000004; + } + } + + // + // Clear the array containing the tag. + // + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cmac/aes_cmac.ewd b/boards/dk-tm4c129x/aes_cmac/aes_cmac.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/aes_cmac.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/aes_cmac/aes_cmac.ewp b/boards/dk-tm4c129x/aes_cmac/aes_cmac.ewp new file mode 100644 index 0000000..876d072 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/aes_cmac.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\aes_cmac.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/aes_cmac/aes_cmac.icf b/boards/dk-tm4c129x/aes_cmac/aes_cmac.icf new file mode 100644 index 0000000..2f11c0b --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/aes_cmac.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// aes_cmac.icf - Linker configuration file for aes_cmac. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/aes_cmac/aes_cmac.ld b/boards/dk-tm4c129x/aes_cmac/aes_cmac.ld new file mode 100644 index 0000000..846d354 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/aes_cmac.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * aes_cmac.ld - Linker configuration file for aes_cmac. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/aes_cmac/aes_cmac.sct b/boards/dk-tm4c129x/aes_cmac/aes_cmac.sct new file mode 100644 index 0000000..eae6858 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/aes_cmac.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; aes_cmac.sct - Linker configuration file for aes_cmac. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/aes_cmac/aes_cmac.uvopt b/boards/dk-tm4c129x/aes_cmac/aes_cmac.uvopt new file mode 100644 index 0000000..de54d00 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/aes_cmac.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + aes_cmac + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\aes_cmac.c + aes_cmac.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/aes_cmac/aes_cmac.uvproj b/boards/dk-tm4c129x/aes_cmac/aes_cmac.uvproj new file mode 100644 index 0000000..eb5225a --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/aes_cmac.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + aes_cmac + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + aes_cmac + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\aes_cmac.bin .\rvmdk\aes_cmac.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + aes_cmac.sct + + + --entry Reset_Handler + + + + + + + + Source + + + aes_cmac.c + 1 + .\aes_cmac.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/aes_cmac/aes_cmac_ccs.cmd b/boards/dk-tm4c129x/aes_cmac/aes_cmac_ccs.cmd new file mode 100644 index 0000000..0db629d --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/aes_cmac_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * aes_cmac_ccs.cmd - CCS linker configuration file for aes_cmac. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/aes_cmac/ccs/.ccsimportspec b/boards/dk-tm4c129x/aes_cmac/ccs/.ccsimportspec new file mode 100644 index 0000000..cc242f8 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cmac/ccs/.ccsproject b/boards/dk-tm4c129x/aes_cmac/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cmac/ccs/.cproject b/boards/dk-tm4c129x/aes_cmac/ccs/.cproject new file mode 100644 index 0000000..532e4b0 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cmac/ccs/.project b/boards/dk-tm4c129x/aes_cmac/ccs/.project new file mode 100644 index 0000000..7e97e3a --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/ccs/.project @@ -0,0 +1,70 @@ + + + aes_cmac + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + aes_cmac.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_cmac/aes_cmac.c + + + aes_cmac_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_cmac/aes_cmac_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_cmac/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/aes_cmac/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/aes_cmac/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/aes_cmac/ccs/Debug/aes_cmac.bin b/boards/dk-tm4c129x/aes_cmac/ccs/Debug/aes_cmac.bin new file mode 100644 index 0000000..cc9b4b4 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cmac/ccs/Debug/aes_cmac.bin differ diff --git a/boards/dk-tm4c129x/aes_cmac/ccs/Debug/aes_cmac.out b/boards/dk-tm4c129x/aes_cmac/ccs/Debug/aes_cmac.out new file mode 100644 index 0000000..fdc4a60 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cmac/ccs/Debug/aes_cmac.out differ diff --git a/boards/dk-tm4c129x/aes_cmac/ccs/macros.ini_initial b/boards/dk-tm4c129x/aes_cmac/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/aes_cmac/ccs/target_config.ccxml b/boards/dk-tm4c129x/aes_cmac/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_cmac/ewarm/Exe/aes_cmac.bin b/boards/dk-tm4c129x/aes_cmac/ewarm/Exe/aes_cmac.bin new file mode 100644 index 0000000..b8b30cc Binary files /dev/null and b/boards/dk-tm4c129x/aes_cmac/ewarm/Exe/aes_cmac.bin differ diff --git a/boards/dk-tm4c129x/aes_cmac/ewarm/Exe/aes_cmac.out b/boards/dk-tm4c129x/aes_cmac/ewarm/Exe/aes_cmac.out new file mode 100644 index 0000000..acad7c7 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cmac/ewarm/Exe/aes_cmac.out differ diff --git a/boards/dk-tm4c129x/aes_cmac/gcc/aes_cmac.axf b/boards/dk-tm4c129x/aes_cmac/gcc/aes_cmac.axf new file mode 100644 index 0000000..d75afb4 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cmac/gcc/aes_cmac.axf differ diff --git a/boards/dk-tm4c129x/aes_cmac/gcc/aes_cmac.bin b/boards/dk-tm4c129x/aes_cmac/gcc/aes_cmac.bin new file mode 100644 index 0000000..d108dd9 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cmac/gcc/aes_cmac.bin differ diff --git a/boards/dk-tm4c129x/aes_cmac/readme.txt b/boards/dk-tm4c129x/aes_cmac/readme.txt new file mode 100644 index 0000000..e31ac50 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/readme.txt @@ -0,0 +1,31 @@ +AES128 and AES256 CMAC Demo + +Simple demo showing an authentication operation using the AES128 and +AES256 modules in CMAC mode. A series of test vectors are authenticated. + +This module is also capable of CBC-MAC mode, but this has been determined +to be insecure when using variable message lengths. CMAC is now +recommended instead by NIST. + +Please note that the use of interrupts and uDMA is not required for the +operation of the module. It is only done for demonstration purposes. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/aes_cmac/rvmdk/aes_cmac.axf b/boards/dk-tm4c129x/aes_cmac/rvmdk/aes_cmac.axf new file mode 100644 index 0000000..fde8df0 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cmac/rvmdk/aes_cmac.axf differ diff --git a/boards/dk-tm4c129x/aes_cmac/rvmdk/aes_cmac.bin b/boards/dk-tm4c129x/aes_cmac/rvmdk/aes_cmac.bin new file mode 100644 index 0000000..4df0ae9 Binary files /dev/null and b/boards/dk-tm4c129x/aes_cmac/rvmdk/aes_cmac.bin differ diff --git a/boards/dk-tm4c129x/aes_cmac/startup_ccs.c b/boards/dk-tm4c129x/aes_cmac/startup_ccs.c new file mode 100644 index 0000000..882868b --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cmac/startup_ewarm.c b/boards/dk-tm4c129x/aes_cmac/startup_ewarm.c new file mode 100644 index 0000000..b08ccba --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cmac/startup_gcc.c b/boards/dk-tm4c129x/aes_cmac/startup_gcc.c new file mode 100644 index 0000000..f1c5730 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_cmac/startup_rvmdk.S b/boards/dk-tm4c129x/aes_cmac/startup_rvmdk.S new file mode 100644 index 0000000..558dc08 --- /dev/null +++ b/boards/dk-tm4c129x/aes_cmac/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN AESIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD AESIntHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/Makefile b/boards/dk-tm4c129x/aes_ecb_decrypt/Makefile new file mode 100644 index 0000000..a9794bb --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the AES128 and AES256 ECB Decryption Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the AES128 and AES256 ECB Decryption Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/aes_ecb_decrypt.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the AES128 and AES256 ECB Decryption Demo. +# +${COMPILER}/aes_ecb_decrypt.axf: ${COMPILER}/aes_ecb_decrypt.o +${COMPILER}/aes_ecb_decrypt.axf: ${COMPILER}/frame.o +${COMPILER}/aes_ecb_decrypt.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/aes_ecb_decrypt.axf: ${COMPILER}/pinout.o +${COMPILER}/aes_ecb_decrypt.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/aes_ecb_decrypt.axf: ${COMPILER}/uartstdio.o +${COMPILER}/aes_ecb_decrypt.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/aes_ecb_decrypt.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/aes_ecb_decrypt.axf: aes_ecb_decrypt.ld +SCATTERgcc_aes_ecb_decrypt=aes_ecb_decrypt.ld +ENTRY_aes_ecb_decrypt=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.c b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.c new file mode 100644 index 0000000..af003f1 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.c @@ -0,0 +1,698 @@ +//***************************************************************************** +// +// aes_ecb_decrypt.c - Simple AES128 and AES256 ECB decryption demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_aes.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/aes.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

AES128 and AES256 ECB Decryption Demo (aes_ecb_decrypt)

+//! +//! Simple demo showing an decryption operation using the AES128 and AES256 +//! modules in ECB mode. A single block of data is decrypted. +//! +//! Please note that the use of interrupts and uDMA is not required for the +//! operation of the module. It is only done for demonstration purposes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Sample plaintext, ciphertext, and key from the NIST SP 800-38A document. +// +//***************************************************************************** +uint32_t g_pui32AESPlainText[16] = +{ + 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373, + 0x578a2dae, 0x9cac031e, 0xac6fb79e, 0x518eaf45, + 0x461cc830, 0x11e45ca3, 0x19c1fbe5, 0xef520a1a, + 0x45249ff6, 0x179b4fdf, 0x7b412bad, 0x10376ce6 +}; + +uint32_t g_pui32AES128Key[4] = +{ + 0x16157e2b, 0xa6d2ae28, 0x8815f7ab, 0x3c4fcf09 +}; + +uint32_t g_pui32AES256Key[8] = +{ + 0x10eb3d60, 0xbe71ca15, 0xf0ae732b, 0x81777d85, + 0x072c351f, 0xd708613b, 0xa310982d, 0xf4df1409 +}; + +uint32_t g_pui32AES128CipherText[16] = +{ + 0xb47bd73a, 0x60367a0d, 0xf3ca9ea8, 0x97ef6624, + 0x85d5d3f5, 0x9d69b903, 0x5a8985e7, 0xafbafd96, + 0x7fcdb143, 0x23ce8e59, 0xe3001b88, 0x880603ed, + 0x5e780c7b, 0x3fade827, 0x71202382, 0xd45d7204 +}; + +uint32_t g_pui32AES256CipherText[16] = +{ + 0xbdd1eef3, 0x3ca0d2b5, 0x7e5a4b06, 0xf881b13d, + 0x10cb1c59, 0x26ed10d4, 0x4aa75bdc, 0x70283631, + 0xb921edb6, 0xf9f4a69c, 0xb1e753f1, 0x1dedafbe, + 0x7a4b3023, 0xfff3f939, 0x8f8d7d06, 0xc7ec249e +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Round up length to nearest 16 byte boundary. This is needed because all +// four data registers must be written at once. This is handled in the AES +// driver, but if using uDMA, the length must rounded up. +// +//***************************************************************************** +uint32_t +LengthRoundUp(uint32_t ui32Length) +{ + uint32_t ui32Remainder; + + ui32Remainder = ui32Length % 16; + if(ui32Remainder == 0) + { + return(ui32Length); + } + else + { + return(ui32Length + (16 - ui32Remainder)); + } +} + +//***************************************************************************** +// +// The AES interrupt handler and interrupt flags. +// +//***************************************************************************** +static volatile bool g_bContextInIntFlag; +static volatile bool g_bDataInIntFlag; +static volatile bool g_bContextOutIntFlag; +static volatile bool g_bDataOutIntFlag; +static volatile bool g_bContextInDMADoneIntFlag; +static volatile bool g_bDataInDMADoneIntFlag; +static volatile bool g_bContextOutDMADoneIntFlag; +static volatile bool g_bDataOutDMADoneIntFlag; + +void +AESIntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the AES masked interrupt status. + // + ui32IntStatus = ROM_AESIntStatus(AES_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & AES_INT_CONTEXT_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_IN); + g_bContextInIntFlag = true; + UARTprintf(" Context input registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_IN); + g_bDataInIntFlag = true; + UARTprintf(" Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & AES_INT_CONTEXT_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_OUT); + g_bContextOutIntFlag = true; + UARTprintf(" Context output registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_OUT); + g_bDataOutIntFlag = true; + UARTprintf(" Data FIFO is ready to provide data.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneIntFlag = true; + UARTprintf(" DMA completed a context write to the internal\n"); + UARTprintf(" registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_IN); + g_bDataInDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of input data to\n"); + UARTprintf(" the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_OUT); + g_bContextOutDMADoneIntFlag = true; + UARTprintf(" DMA completed the output context movement from\n"); + UARTprintf(" the internal registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_OUT); + g_bDataOutDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of process result.\n"); + } +} + +//***************************************************************************** +// +// Perform an decryption operation. +// +//***************************************************************************** +bool +AESECBDecrypt(uint32_t ui32Keysize, uint32_t *pui32Src, uint32_t *pui32Dst, + uint32_t *pui32Key, uint32_t ui32Length, bool bUseDMA) +{ + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Clear the interrupt flags. + // + g_bContextInIntFlag = false; + g_bDataInIntFlag = false; + g_bContextOutIntFlag = false; + g_bDataOutIntFlag = false; + g_bContextInDMADoneIntFlag = false; + g_bDataInDMADoneIntFlag = false; + g_bContextOutDMADoneIntFlag = false; + g_bDataOutDMADoneIntFlag = false; + + // + // Enable all interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | + AES_INT_DATA_IN | AES_INT_DATA_OUT)); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_DECRYPT | + AES_CFG_MODE_ECB)); + + // + // Write the key. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Depending on the argument, perform the decryption + // with or without uDMA. + // + if(bUseDMA) + { + // + // Enable DMA interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_DMA_CONTEXT_IN | + AES_INT_DMA_DATA_IN | + AES_INT_DMA_CONTEXT_OUT | + AES_INT_DMA_DATA_OUT)); + + // + // Setup the DMA module to copy data in. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Dst, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data in DMA request enabled.\n"); + + // + // Setup the DMA module to copy the data out. + // + ROM_uDMAChannelAssign(UDMA_CH15_AES0DOUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH15_AES0DOUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_NONE | + UDMA_DST_INC_32 | UDMA_ARB_4 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(AES_BASE + AES_O_DATA_IN_0), + (void *)pui32Src, + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data out DMA request enabled.\n"); + + // + // Write the length registers to start the process. + // + ROM_AESLengthSet(AES_BASE, (uint64_t)ui32Length); + + // + // Enable the DMA channels to start the transfers. This must be done after + // writing the length to prevent data from copying before the context is + // truly ready. + // + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + ROM_uDMAChannelEnable(UDMA_CH15_AES0DOUT); + + // + // Enable DMA requests + // + ROM_AESDMAEnable(AES_BASE, AES_DMA_DATA_IN | AES_DMA_DATA_OUT); + + // + // Wait for the data in DMA done interrupt. + // + while(!g_bDataInDMADoneIntFlag) + { + } + + // + // Wait for the data out DMA done interrupt. + // + while(!g_bDataOutDMADoneIntFlag) + { + } + } + else + { + // + // Perform the decryption. + // + ROM_AESDataProcess(AES_BASE, pui32Src, pui32Dst, ui32Length); + } + + return(true); +} + +//***************************************************************************** +// +// Initialize the AES and CCM modules. +// +//***************************************************************************** +bool +AESInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example decrypts blocks of plaintext using AES128 in ECB mode. It +// does the decryption first without uDMA and then with uDMA. The results +// are checked after each operation. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32PlainText[16], ui32Errors, ui32Idx, ui32SysClock; + uint32_t ui32Keysize; + tContext sContext; + uint8_t ui8Loop; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "aes-ecb-decrypt"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUStackingEnable(); + + // + // Configure the system clock to run off the internal 16MHz oscillator. + // + MAP_SysCtlClockFreqSet(SYSCTL_OSC_INT | SYSCTL_USE_OSC, 16000000); + + // + // Enable AES interrupts. + // + ROM_IntEnable(INT_AES0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting AES ECB decryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and AES modules. + // + if(!AESInit()) + { + UARTprintf("Initialization of the AES module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Perform the same operation with 128bit key first, then 256bit key. + // + for(ui8Loop = 0; ui8Loop < 2; ui8Loop++) + { + + ui32Keysize = (ui8Loop == 0)?AES_CFG_KEY_SIZE_128BIT: + AES_CFG_KEY_SIZE_256BIT; + UARTprintf("\nKey Size: %sbit\n", ((ui8Loop == 0)?"128":"256")); + + // + // Clear the array containing the plaintext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32PlainText[ui32Idx] = 0; + } + + // + // Perform the decryption without uDMA. + // + UARTprintf("Performing decryption without uDMA.\n"); + AESECBDecrypt(ui32Keysize, + (ui8Loop == 0)?g_pui32AES128CipherText:g_pui32AES256CipherText, + pui32PlainText, + (ui8Loop == 0)?g_pui32AES128Key:g_pui32AES256Key, + 64, false); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32PlainText[ui32Idx] != g_pui32AESPlainText[ui32Idx]) + { + UARTprintf("Plaintext mismatch on word %d. Exp: 0x%x, Act: 0x%x\n", + ui32Idx, g_pui32AESPlainText[ui32Idx], + pui32PlainText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + + // + // Clear the array containing the plaintext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32PlainText[ui32Idx] = 0; + } + + // + // Perform the decryption with uDMA. + // + UARTprintf("Performing decryption with uDMA.\n"); + AESECBDecrypt(ui32Keysize, pui32PlainText, + (ui8Loop == 0)?g_pui32AES128CipherText:g_pui32AES256CipherText, + (ui8Loop == 0)?g_pui32AES128Key:g_pui32AES256Key, + 64, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32PlainText[ui32Idx] != g_pui32AESPlainText[ui32Idx]) + { + UARTprintf("Plaintext mismatch on word %d. Exp: 0x%x, Act: 0x%x\n", + ui32Idx, g_pui32AESPlainText[ui32Idx], + pui32PlainText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000004; + } + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ewd b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ewp b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ewp new file mode 100644 index 0000000..ea16ac7 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\aes_ecb_decrypt.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.icf b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.icf new file mode 100644 index 0000000..7ab13c3 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// aes_ecb_decrypt.icf - Linker configuration file for aes_ecb_decrypt. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ld b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ld new file mode 100644 index 0000000..39a9d80 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * aes_ecb_decrypt.ld - Linker configuration file for aes_ecb_decrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.sct b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.sct new file mode 100644 index 0000000..8cc5982 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; aes_ecb_decrypt.sct - Linker configuration file for aes_ecb_decrypt. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.uvopt b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.uvopt new file mode 100644 index 0000000..3091c4e --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + aes_ecb_decrypt + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\aes_ecb_decrypt.c + aes_ecb_decrypt.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.uvproj b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.uvproj new file mode 100644 index 0000000..6675e94 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + aes_ecb_decrypt + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + aes_ecb_decrypt + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\aes_ecb_decrypt.bin .\rvmdk\aes_ecb_decrypt.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + aes_ecb_decrypt.sct + + + --entry Reset_Handler + + + + + + + + Source + + + aes_ecb_decrypt.c + 1 + .\aes_ecb_decrypt.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt_ccs.cmd b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt_ccs.cmd new file mode 100644 index 0000000..9db0e9f --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * aes_ecb_decrypt_ccs.cmd - CCS linker configuration file for aes_ecb_decrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.ccsimportspec b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.ccsimportspec new file mode 100644 index 0000000..3fea0dc --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.ccsproject b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.cproject b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.cproject new file mode 100644 index 0000000..83995fb --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.project b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.project new file mode 100644 index 0000000..6d2363d --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.project @@ -0,0 +1,70 @@ + + + aes_ecb_decrypt + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + aes_ecb_decrypt.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt.c + + + aes_ecb_decrypt_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ecb_decrypt/aes_ecb_decrypt_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ecb_decrypt/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/Debug/aes_ecb_decrypt.bin b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/Debug/aes_ecb_decrypt.bin new file mode 100644 index 0000000..ccd3908 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/Debug/aes_ecb_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/Debug/aes_ecb_decrypt.out b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/Debug/aes_ecb_decrypt.out new file mode 100644 index 0000000..20ec2f7 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/Debug/aes_ecb_decrypt.out differ diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/macros.ini_initial b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/target_config.ccxml b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/ewarm/Exe/aes_ecb_decrypt.bin b/boards/dk-tm4c129x/aes_ecb_decrypt/ewarm/Exe/aes_ecb_decrypt.bin new file mode 100644 index 0000000..42d71f2 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_decrypt/ewarm/Exe/aes_ecb_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/ewarm/Exe/aes_ecb_decrypt.out b/boards/dk-tm4c129x/aes_ecb_decrypt/ewarm/Exe/aes_ecb_decrypt.out new file mode 100644 index 0000000..bd03111 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_decrypt/ewarm/Exe/aes_ecb_decrypt.out differ diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/gcc/aes_ecb_decrypt.axf b/boards/dk-tm4c129x/aes_ecb_decrypt/gcc/aes_ecb_decrypt.axf new file mode 100644 index 0000000..eb30724 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_decrypt/gcc/aes_ecb_decrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/gcc/aes_ecb_decrypt.bin b/boards/dk-tm4c129x/aes_ecb_decrypt/gcc/aes_ecb_decrypt.bin new file mode 100644 index 0000000..cbf8323 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_decrypt/gcc/aes_ecb_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/readme.txt b/boards/dk-tm4c129x/aes_ecb_decrypt/readme.txt new file mode 100644 index 0000000..d9c9da1 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/readme.txt @@ -0,0 +1,27 @@ +AES128 and AES256 ECB Decryption Demo + +Simple demo showing an decryption operation using the AES128 and AES256 +modules in ECB mode. A single block of data is decrypted. + +Please note that the use of interrupts and uDMA is not required for the +operation of the module. It is only done for demonstration purposes. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/rvmdk/aes_ecb_decrypt.axf b/boards/dk-tm4c129x/aes_ecb_decrypt/rvmdk/aes_ecb_decrypt.axf new file mode 100644 index 0000000..1798a30 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_decrypt/rvmdk/aes_ecb_decrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/rvmdk/aes_ecb_decrypt.bin b/boards/dk-tm4c129x/aes_ecb_decrypt/rvmdk/aes_ecb_decrypt.bin new file mode 100644 index 0000000..3885912 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_decrypt/rvmdk/aes_ecb_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/startup_ccs.c b/boards/dk-tm4c129x/aes_ecb_decrypt/startup_ccs.c new file mode 100644 index 0000000..882868b --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/startup_ewarm.c b/boards/dk-tm4c129x/aes_ecb_decrypt/startup_ewarm.c new file mode 100644 index 0000000..b08ccba --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/startup_gcc.c b/boards/dk-tm4c129x/aes_ecb_decrypt/startup_gcc.c new file mode 100644 index 0000000..f1c5730 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ecb_decrypt/startup_rvmdk.S b/boards/dk-tm4c129x/aes_ecb_decrypt/startup_rvmdk.S new file mode 100644 index 0000000..558dc08 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_decrypt/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN AESIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD AESIntHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/Makefile b/boards/dk-tm4c129x/aes_ecb_encrypt/Makefile new file mode 100644 index 0000000..61498ad --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the AES128 and AES256 ECB Encryption Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the AES128 and AES256 ECB Encryption Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/aes_ecb_encrypt.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the AES128 and AES256 ECB Encryption Demo. +# +${COMPILER}/aes_ecb_encrypt.axf: ${COMPILER}/aes_ecb_encrypt.o +${COMPILER}/aes_ecb_encrypt.axf: ${COMPILER}/frame.o +${COMPILER}/aes_ecb_encrypt.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/aes_ecb_encrypt.axf: ${COMPILER}/pinout.o +${COMPILER}/aes_ecb_encrypt.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/aes_ecb_encrypt.axf: ${COMPILER}/uartstdio.o +${COMPILER}/aes_ecb_encrypt.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/aes_ecb_encrypt.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/aes_ecb_encrypt.axf: aes_ecb_encrypt.ld +SCATTERgcc_aes_ecb_encrypt=aes_ecb_encrypt.ld +ENTRY_aes_ecb_encrypt=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.c b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.c new file mode 100644 index 0000000..079a0a5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.c @@ -0,0 +1,701 @@ +//***************************************************************************** +// +// aes_ecb_encrypt.c - Simple AES128 ECB encryption demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_aes.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/aes.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

AES128 and AES256 ECB Encryption Demo (aes_ecb_encrypt)

+//! +//! Simple demo showing an encryption operation using the AES128 and AES256 +//! modules in ECB mode. A single block of data is encrypted. +//! +//! Please note that the use of interrupts and uDMA is not required for the +//! operation of the module. It is only done for demonstration purposes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Sample plaintext, ciphertext, and key from the NIST SP 800-38A document. +// +//***************************************************************************** +uint32_t g_pui32AESPlainText[16] = +{ + 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373, + 0x578a2dae, 0x9cac031e, 0xac6fb79e, 0x518eaf45, + 0x461cc830, 0x11e45ca3, 0x19c1fbe5, 0xef520a1a, + 0x45249ff6, 0x179b4fdf, 0x7b412bad, 0x10376ce6 +}; + +uint32_t g_pui32AES128Key[4] = +{ + 0x16157e2b, 0xa6d2ae28, 0x8815f7ab, 0x3c4fcf09 +}; + +uint32_t g_pui32AES256Key[8] = +{ + 0x10eb3d60, 0xbe71ca15, 0xf0ae732b, 0x81777d85, + 0x072c351f, 0xd708613b, 0xa310982d, 0xf4df1409 +}; + +uint32_t g_pui32AES128CipherText[16] = +{ + 0xb47bd73a, 0x60367a0d, 0xf3ca9ea8, 0x97ef6624, + 0x85d5d3f5, 0x9d69b903, 0x5a8985e7, 0xafbafd96, + 0x7fcdb143, 0x23ce8e59, 0xe3001b88, 0x880603ed, + 0x5e780c7b, 0x3fade827, 0x71202382, 0xd45d7204 +}; + +uint32_t g_pui32AES256CipherText[16] = +{ + 0xbdd1eef3, 0x3ca0d2b5, 0x7e5a4b06, 0xf881b13d, + 0x10cb1c59, 0x26ed10d4, 0x4aa75bdc, 0x70283631, + 0xb921edb6, 0xf9f4a69c, 0xb1e753f1, 0x1dedafbe, + 0x7a4b3023, 0xfff3f939, 0x8f8d7d06, 0xc7ec249e +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Round up length to nearest 16 byte boundary. This is needed because all +// four data registers must be written at once. This is handled in the AES +// driver, but if using uDMA, the length must rounded up. +// +//***************************************************************************** +uint32_t +LengthRoundUp(uint32_t ui32Length) +{ + uint32_t ui32Remainder; + + ui32Remainder = ui32Length % 16; + if(ui32Remainder == 0) + { + return(ui32Length); + } + else + { + return(ui32Length + (16 - ui32Remainder)); + } +} + +//***************************************************************************** +// +// The AES interrupt handler and interrupt flags. +// +//***************************************************************************** +static volatile bool g_bContextInIntFlag; +static volatile bool g_bDataInIntFlag; +static volatile bool g_bContextOutIntFlag; +static volatile bool g_bDataOutIntFlag; +static volatile bool g_bContextInDMADoneIntFlag; +static volatile bool g_bDataInDMADoneIntFlag; +static volatile bool g_bContextOutDMADoneIntFlag; +static volatile bool g_bDataOutDMADoneIntFlag; + +void +AESIntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the AES masked interrupt status. + // + ui32IntStatus = ROM_AESIntStatus(AES_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & AES_INT_CONTEXT_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_IN); + g_bContextInIntFlag = true; + UARTprintf(" Context input registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_IN); + g_bDataInIntFlag = true; + UARTprintf(" Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & AES_INT_CONTEXT_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_OUT); + g_bContextOutIntFlag = true; + UARTprintf(" Context output registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_OUT); + g_bDataOutIntFlag = true; + UARTprintf(" Data FIFO is ready to provide data.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneIntFlag = true; + UARTprintf(" DMA completed a context write to the internal\n"); + UARTprintf(" registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_IN); + g_bDataInDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of input data to\n"); + UARTprintf(" the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_OUT); + g_bContextOutDMADoneIntFlag = true; + UARTprintf(" DMA completed the output context movement from\n"); + UARTprintf(" the internal registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_OUT); + g_bDataOutDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of process result.\n"); + } +} + +//***************************************************************************** +// +// Perform an encryption operation. +// +//***************************************************************************** +bool +AESECBEncrypt(uint32_t ui32Keysize, uint32_t *pui32Src, uint32_t *pui32Dst, + uint32_t *pui32Key, uint32_t ui32Length, bool bUseDMA) +{ + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Clear the interrupt flags. + // + g_bContextInIntFlag = false; + g_bDataInIntFlag = false; + g_bContextOutIntFlag = false; + g_bDataOutIntFlag = false; + g_bContextInDMADoneIntFlag = false; + g_bDataInDMADoneIntFlag = false; + g_bContextOutDMADoneIntFlag = false; + g_bDataOutDMADoneIntFlag = false; + + // + // Enable all interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | + AES_INT_DATA_IN | AES_INT_DATA_OUT)); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_ENCRYPT | + AES_CFG_MODE_ECB)); + + // + // Write the key. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Depending on the argument, perform the encryption + // with or without uDMA. + // + if(bUseDMA) + { + // + // Enable DMA interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_DMA_CONTEXT_IN | + AES_INT_DMA_DATA_IN | + AES_INT_DMA_CONTEXT_OUT | + AES_INT_DMA_DATA_OUT)); + + // + // Setup the DMA module to copy data in. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Src, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data in DMA request enabled.\n"); + + // + // Setup the DMA module to copy the data out. + // + ROM_uDMAChannelAssign(UDMA_CH15_AES0DOUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH15_AES0DOUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_NONE | + UDMA_DST_INC_32 | UDMA_ARB_4 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(AES_BASE + AES_O_DATA_IN_0), + (void *)pui32Dst, + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data out DMA request enabled.\n"); + + // + // Write the length registers to start the process. + // + ROM_AESLengthSet(AES_BASE, (uint64_t)ui32Length); + + // + // Enable the DMA channels to start the transfers. This must be done after + // writing the length to prevent data from copying before the context is + // truly ready. + // + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + ROM_uDMAChannelEnable(UDMA_CH15_AES0DOUT); + + // + // Enable DMA requests + // + ROM_AESDMAEnable(AES_BASE, AES_DMA_DATA_IN | AES_DMA_DATA_OUT); + + // + // Wait for the data in DMA done interrupt. + // + while(!g_bDataInDMADoneIntFlag) + { + } + + // + // Wait for the data out DMA done interrupt. + // + while(!g_bDataOutDMADoneIntFlag) + { + } + } + else + { + // + // Perform the encryption. + // + ROM_AESDataProcess(AES_BASE, pui32Src, pui32Dst, ui32Length); + } + + return(true); +} + +//***************************************************************************** +// +// Initialize the AES and CCM modules. +// +//***************************************************************************** +bool +AESInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example encrypts blocks of plaintext using AES128 in ECB mode. It +// does the encryption first without uDMA and then with uDMA. The results +// are checked after each operation. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32CipherText[16], ui32Errors, ui32Idx, ui32SysClock; + uint32_t ui32Keysize; + uint32_t *pui32CipherTextExp; + tContext sContext; + uint8_t ui8Loop; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | + SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "aes-ecb-encrypt"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUStackingEnable(); + + // + // Configure the system clock to run off the internal 16MHz oscillator. + // + MAP_SysCtlClockFreqSet(SYSCTL_OSC_INT | SYSCTL_USE_OSC, 16000000); + + // + // Enable AES interrupts. + // + ROM_IntEnable(INT_AES0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting AES ECB encryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and AES modules. + // + if(!AESInit()) + { + UARTprintf("Initialization of the AES module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Perform the same operation with 128bit key first, then 256bit key. + // + for(ui8Loop = 0; ui8Loop < 2; ui8Loop++) + { + + ui32Keysize = (ui8Loop == 0)?AES_CFG_KEY_SIZE_128BIT:AES_CFG_KEY_SIZE_256BIT; + UARTprintf("\nKey Size: %sbit\n", ((ui8Loop == 0)?"128":"256")); + + // + // Clear the array containing the cipher text. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + + // + // Perform the encryption without uDMA. + // + UARTprintf("Performing encryption without uDMA.\n"); + AESECBEncrypt(ui32Keysize, g_pui32AESPlainText, pui32CipherText, + (ui8Loop == 0)?g_pui32AES128Key:g_pui32AES256Key, + 64, false); + + // + // Check the result. + // + pui32CipherTextExp = (ui8Loop == 0)?g_pui32AES128CipherText: + g_pui32AES256CipherText; + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32CipherText[ui32Idx] != pui32CipherTextExp[ui32Idx]) + { + UARTprintf("Ciphertext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32CipherTextExp[ui32Idx], + pui32CipherText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + + // + // Clear the array containing the ciphertext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + + // + // Perform the encryption with uDMA. + // + UARTprintf("Performing encryption with uDMA.\n"); + AESECBEncrypt(ui32Keysize, g_pui32AESPlainText, pui32CipherText, + (ui8Loop == 0)?g_pui32AES128Key:g_pui32AES256Key, + 64, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32CipherText[ui32Idx] != pui32CipherTextExp[ui32Idx]) + { + UARTprintf("Ciphertext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32CipherTextExp[ui32Idx], + pui32CipherText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000004; + } + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ewd b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ewp b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ewp new file mode 100644 index 0000000..ef76eab --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\aes_ecb_encrypt.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.icf b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.icf new file mode 100644 index 0000000..ca4c88f --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// aes_ecb_encrypt.icf - Linker configuration file for aes_ecb_encrypt. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ld b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ld new file mode 100644 index 0000000..125f2a9 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * aes_ecb_encrypt.ld - Linker configuration file for aes_ecb_encrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.sct b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.sct new file mode 100644 index 0000000..a56e0b6 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; aes_ecb_encrypt.sct - Linker configuration file for aes_ecb_encrypt. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.uvopt b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.uvopt new file mode 100644 index 0000000..bc3f606 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + aes_ecb_encrypt + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\aes_ecb_encrypt.c + aes_ecb_encrypt.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.uvproj b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.uvproj new file mode 100644 index 0000000..28cacf3 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + aes_ecb_encrypt + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + aes_ecb_encrypt + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\aes_ecb_encrypt.bin .\rvmdk\aes_ecb_encrypt.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + aes_ecb_encrypt.sct + + + --entry Reset_Handler + + + + + + + + Source + + + aes_ecb_encrypt.c + 1 + .\aes_ecb_encrypt.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt_ccs.cmd b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt_ccs.cmd new file mode 100644 index 0000000..3de14ca --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * aes_ecb_encrypt_ccs.cmd - CCS linker configuration file for aes_ecb_encrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.ccsimportspec b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.ccsimportspec new file mode 100644 index 0000000..27e0888 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.ccsproject b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.cproject b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.cproject new file mode 100644 index 0000000..b640bf8 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.project b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.project new file mode 100644 index 0000000..6f1402d --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.project @@ -0,0 +1,70 @@ + + + aes_ecb_encrypt + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + aes_ecb_encrypt.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt.c + + + aes_ecb_encrypt_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ecb_encrypt/aes_ecb_encrypt_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_ecb_encrypt/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/Debug/aes_ecb_encrypt.bin b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/Debug/aes_ecb_encrypt.bin new file mode 100644 index 0000000..5bede9f Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/Debug/aes_ecb_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/Debug/aes_ecb_encrypt.out b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/Debug/aes_ecb_encrypt.out new file mode 100644 index 0000000..1ad3e3e Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/Debug/aes_ecb_encrypt.out differ diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/macros.ini_initial b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/target_config.ccxml b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/ewarm/Exe/aes_ecb_encrypt.bin b/boards/dk-tm4c129x/aes_ecb_encrypt/ewarm/Exe/aes_ecb_encrypt.bin new file mode 100644 index 0000000..b7fabe7 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_encrypt/ewarm/Exe/aes_ecb_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/ewarm/Exe/aes_ecb_encrypt.out b/boards/dk-tm4c129x/aes_ecb_encrypt/ewarm/Exe/aes_ecb_encrypt.out new file mode 100644 index 0000000..ad731dd Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_encrypt/ewarm/Exe/aes_ecb_encrypt.out differ diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/gcc/aes_ecb_encrypt.axf b/boards/dk-tm4c129x/aes_ecb_encrypt/gcc/aes_ecb_encrypt.axf new file mode 100644 index 0000000..fffa08d Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_encrypt/gcc/aes_ecb_encrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/gcc/aes_ecb_encrypt.bin b/boards/dk-tm4c129x/aes_ecb_encrypt/gcc/aes_ecb_encrypt.bin new file mode 100644 index 0000000..15528e2 Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_encrypt/gcc/aes_ecb_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/readme.txt b/boards/dk-tm4c129x/aes_ecb_encrypt/readme.txt new file mode 100644 index 0000000..8311ba2 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/readme.txt @@ -0,0 +1,27 @@ +AES128 and AES256 ECB Encryption Demo + +Simple demo showing an encryption operation using the AES128 and AES256 +modules in ECB mode. A single block of data is encrypted. + +Please note that the use of interrupts and uDMA is not required for the +operation of the module. It is only done for demonstration purposes. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/rvmdk/aes_ecb_encrypt.axf b/boards/dk-tm4c129x/aes_ecb_encrypt/rvmdk/aes_ecb_encrypt.axf new file mode 100644 index 0000000..2da3d7b Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_encrypt/rvmdk/aes_ecb_encrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/rvmdk/aes_ecb_encrypt.bin b/boards/dk-tm4c129x/aes_ecb_encrypt/rvmdk/aes_ecb_encrypt.bin new file mode 100644 index 0000000..db468de Binary files /dev/null and b/boards/dk-tm4c129x/aes_ecb_encrypt/rvmdk/aes_ecb_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/startup_ccs.c b/boards/dk-tm4c129x/aes_ecb_encrypt/startup_ccs.c new file mode 100644 index 0000000..882868b --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/startup_ewarm.c b/boards/dk-tm4c129x/aes_ecb_encrypt/startup_ewarm.c new file mode 100644 index 0000000..b08ccba --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/startup_gcc.c b/boards/dk-tm4c129x/aes_ecb_encrypt/startup_gcc.c new file mode 100644 index 0000000..f1c5730 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_ecb_encrypt/startup_rvmdk.S b/boards/dk-tm4c129x/aes_ecb_encrypt/startup_rvmdk.S new file mode 100644 index 0000000..558dc08 --- /dev/null +++ b/boards/dk-tm4c129x/aes_ecb_encrypt/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN AESIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD AESIntHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/Makefile b/boards/dk-tm4c129x/aes_gcm_decrypt/Makefile new file mode 100644 index 0000000..a41ddc1 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the AES128 and AES256 GCM Decryption Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the AES128 and AES256 GCM Decryption Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/aes_gcm_decrypt.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the AES128 and AES256 GCM Decryption Demo. +# +${COMPILER}/aes_gcm_decrypt.axf: ${COMPILER}/aes_gcm_decrypt.o +${COMPILER}/aes_gcm_decrypt.axf: ${COMPILER}/frame.o +${COMPILER}/aes_gcm_decrypt.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/aes_gcm_decrypt.axf: ${COMPILER}/pinout.o +${COMPILER}/aes_gcm_decrypt.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/aes_gcm_decrypt.axf: ${COMPILER}/uartstdio.o +${COMPILER}/aes_gcm_decrypt.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/aes_gcm_decrypt.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/aes_gcm_decrypt.axf: aes_gcm_decrypt.ld +SCATTERgcc_aes_gcm_decrypt=aes_gcm_decrypt.ld +ENTRY_aes_gcm_decrypt=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.c b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.c new file mode 100644 index 0000000..0cb11b7 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.c @@ -0,0 +1,1190 @@ +//***************************************************************************** +// +// aes_gcm_decrypt.c - Simple AES GCM decryption demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_aes.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/aes.h" +#include "driverlib/debug.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

AES128 and AES256 GCM Decryption Demo (aes_gcm_decrypt)

+//! +//! Simple demo showing authenticated decryption operations using the AES +//! module in GCM mode. The test vectors are from the gcm_revised_spec.pdf +//! document. +//! +//! Please note that the use of interrupts and uDMA is not required for the +//! operation of the module. It is only done for demonstration purposes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Structure for NIST AES GCM tests +// +//***************************************************************************** +typedef struct AESTestVectorStruct +{ + uint32_t ui32KeySize; + uint32_t pui32Key[8]; + uint32_t ui32IVLength; + uint32_t pui32IV[64]; + uint32_t ui32DataLength; + uint32_t pui32PlainText[64]; + uint32_t ui32AuthDataLength; + uint32_t pui32AuthData[64]; + uint32_t pui32CipherText[64]; + uint32_t pui32Tag[4]; +} +tAESGCMTestVector; + +//***************************************************************************** +// +// Test Cases from NIST GCM Revised Spec. +// +//***************************************************************************** +tAESGCMTestVector g_psAESGCMTestVectors[] = +{ + // + // Test Case #1 + // This is a special case that cannot use the GCM mode because the + // data and AAD lengths are both zero. The work around is to perform + // an ECB encryption on Y0. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 12, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 0, + { 0 }, + 0, + { 0 }, + { 0 }, + { 0xcefce258, 0x61307efa, 0x571d7f36, 0x5a45e7a4 } + }, + + // + // Test Case #2 + // This is the first test in which the AAD length is zero. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 12, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 16, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 0, + { 0 }, + { 0xceda8803, 0x92a3b660, 0xb9c228f3, 0x78feb271 }, + { 0xd4476eab, 0xbd13ec2c, 0xb2673af5, 0xdfbd5712 } + }, + + // + // Test Case #3 + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 12, + { 0xbebafeca, 0xaddbcefa, 0x88f8cade, 0x00000000 }, + 64, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x55d2af1a }, + 0, + { 0 }, + { 0xc21e8342, 0x24747721, 0xb721724b, 0x9cd4d084, + 0x2f21aae3, 0xe0a4022c, 0x237ec135, 0x2ea1ac29, + 0xb214d521, 0x1c936654, 0x5a6a8f7d, 0x05aa84ac, + 0x390ba31b, 0x97ac0a6a, 0x91e0583d, 0x85593f47 }, + { 0xf32a5c4d, 0xa664cd27, 0xbd5af32c, 0xb4faa62b } + }, + + // + // Test Case #4 + // When the data lengths do not align with the block + // boundary, we need to pad with zeros to ensure unknown + // data is not copied with uDMA. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 12, + { 0xbebafeca, 0xaddbcefa, 0x88f8cade, 0x00000000 }, + 60, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x00000000 }, + 20, + { 0xcefaedfe, 0xefbeadde, 0xcefaedfe, 0xefbeadde, + 0xd2daadab, 0x00000000, 0x00000000, 0x00000000 }, + { 0xc21e8342, 0x24747721, 0xb721724b, 0x9cd4d084, + 0x2f21aae3, 0xe0a4022c, 0x237ec135, 0x2ea1ac29, + 0xb214d521, 0x1c936654, 0x5a6a8f7d, 0x05aa84ac, + 0x390ba31b, 0x97ac0a6a, 0x91e0583d, 0x00000000 }, + { 0xbc4fc95b, 0xdba52132, 0x5ae9fa94, 0x471a12e7 } + }, + + // + // Test Case #5 + // This is the first case in which IV is less than + // 96 bits. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 8, + { 0xbebafeca, 0xaddbcefa, 0x00000000, 0x00000000 }, + 60, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x00000000 }, + 20, + { 0xcefaedfe, 0xefbeadde, 0xcefaedfe, 0xefbeadde, + 0xd2daadab, 0x00000000, 0x00000000, 0x00000000 }, + { 0x4c3b3561, 0x4a930628, 0x1ff57f77, 0x55472aa2, + 0x712a9b69, 0xf8c6cd4f, 0xf9e56637, 0x23746c7b, + 0x00698073, 0xb2249fe4, 0x4475092b, 0x426b89d4, + 0xe1b58949, 0x070faceb, 0x98453fc2, 0x00000000 }, + { 0xe7d21236, 0x85073b9e, 0x4ae11b56, 0xcbfca2ac } + }, + + // + // Test Case #6 + // This is the first case in which IV is more than + // 96 bits. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 60, + { 0x5d221393, 0xe50684f8, 0x5a9c9055, 0xaa6952ff, + 0x38957a6a, 0xa17d4f53, 0xd203c3e4, 0x28a718a3, + 0x51c9c0c3, 0x39958056, 0x42e2f0fc, 0x54526b9a, + 0xf5dbae16, 0x576adea0, 0x9bb337a6, 0x00000000 }, + 60, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x00000000 }, + 20, + { 0xcefaedfe, 0xefbeadde, 0xcefaedfe, 0xefbeadde, + 0xd2daadab }, + { 0x9849e28c, 0xb6155662, 0xac33a003, 0x94b83fa1, + 0xa51291be, 0xa811a2c3, 0x3c2a26ba, 0xa72c7eca, + 0xa4a9e401, 0x903ca4fb, 0x81b2dccc, 0x6f7c8cd4, + 0xd27528d6, 0x0317a4ac, 0xe5ae344c, 0x00000000 }, + { 0xaec59c61, 0xfa0bfeff, 0x3cf42a46, 0x50d09916 } + }, + + // + // The following test cases use 256bit Keys. + // + // Test Case #7 - Test Case 13 from the doc + // This is a special case that cannot use the GCM mode because the + // data and AAD lengths are both zero. The work around is to perform + // an ECB encryption on Y0. + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 12, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 0, + { 0 }, + 0, + { 0 }, + { 0 }, + { 0xfb8a0f53, 0xb93645c7, 0xf1b463a9, 0x8b73cbc4 } + }, + + // + // Test Case #8, - Test Case 14 from the doc + // This is the first test in which the AAD length is zero. + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 12, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 16, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 0, + { 0 }, + { 0x3d40a7ce, 0x6e6b604d, 0xd3c54e07, 0x189df3ba }, + { 0xa7c8d1d0, 0xf06b9999, 0xb5985b26, 0x19b98ad4 } + }, + + // + // Test Case #9, - Test Case 15 from the doc + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067, + 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 12, + { 0xbebafeca, 0xaddbcefa, 0x88f8cade, 0x00000000 }, + 64, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x55d2af1a }, + 0, + { 0 }, + { 0xf0c12d52, 0x077d5699, 0xa3377ff4, 0x7d42842a, + 0xdc8c3a64, 0xc9c0e5bf, 0xbda29875, 0xaad15525, + 0x488eb08c, 0x3dbb0d59, 0x108bb0a7, 0x38888256, + 0x631ef6c5, 0x0a7aba93, 0x62f6c9bc, 0xad158089 }, + { 0xc5da94b0, 0xbd7134d9, 0x22501aec, 0x6ccce370 } + }, + + // + // Test Case #10 - Test Case 16 from the doc + // When the data lengths do not align with the block + // boundary, we need to pad with zeros to ensure unknown + // data is not copied with uDMA. + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067, + 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 12, + { 0xbebafeca, 0xaddbcefa, 0x88f8cade, 0x00000000 }, + 60, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x00000000 }, + 20, + { 0xcefaedfe, 0xefbeadde, 0xcefaedfe, 0xefbeadde, + 0xd2daadab, 0x00000000, 0x00000000, 0x00000000 }, + { 0xf0c12d52, 0x077d5699, 0xa3377ff4, 0x7d42842a, + 0xdc8c3a64, 0xc9c0e5bf, 0xbda29875, 0xaad15525, + 0x488eb08c, 0x3dbb0d59, 0x108bb0a7, 0x38888256, + 0x631ef6c5, 0x0a7aba93, 0x62f6c9bc, 0x00000000 }, + { 0xce6efc76, 0x68174e0f, 0x5388dfcd, 0x1b552dbb } + } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Round up length to nearest 16 byte boundary. This is needed because all +// four data registers must be written at once. This is handled in the AES +// driver, but if using uDMA, the length must rounded up. +// +//***************************************************************************** +uint32_t +LengthRoundUp(uint32_t ui32Length) +{ + uint32_t ui32Remainder; + + ui32Remainder = ui32Length % 16; + if(ui32Remainder == 0) + { + return(ui32Length); + } + else + { + return(ui32Length + (16 - ui32Remainder)); + } +} + +//***************************************************************************** +// +// The AES interrupt handler and interrupt flags. +// +//***************************************************************************** +static volatile bool g_bContextInIntFlag; +static volatile bool g_bDataInIntFlag; +static volatile bool g_bContextOutIntFlag; +static volatile bool g_bDataOutIntFlag; +static volatile bool g_bContextInDMADoneIntFlag; +static volatile bool g_bDataInDMADoneIntFlag; +static volatile bool g_bContextOutDMADoneIntFlag; +static volatile bool g_bDataOutDMADoneIntFlag; + +void +AESIntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the AES masked interrupt status. + // + ui32IntStatus = ROM_AESIntStatus(AES_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & AES_INT_CONTEXT_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_IN); + g_bContextInIntFlag = true; + UARTprintf("Context input registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_IN); + g_bDataInIntFlag = true; + UARTprintf("Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & AES_INT_CONTEXT_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_OUT); + g_bContextOutIntFlag = true; + UARTprintf("Context output registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_OUT); + g_bDataOutIntFlag = true; + UARTprintf("Data FIFO is ready to provide data.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneIntFlag = true; + UARTprintf("DMA completed a context write to the internal\n"); + UARTprintf("registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_IN); + g_bDataInDMADoneIntFlag = true; + UARTprintf("DMA has written the last word of input data to\n"); + UARTprintf("the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_OUT); + g_bContextOutDMADoneIntFlag = true; + UARTprintf("DMA completed the output context movement from\n"); + UARTprintf("the internal registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_OUT); + g_bDataOutDMADoneIntFlag = true; + UARTprintf("DMA has written the last word of process result.\n"); + } +} + +//***************************************************************************** +// +// Perform an ECB encryption operation. +// +//***************************************************************************** +bool +AESECBEncrypt(uint32_t ui32Keysize, uint32_t *pui32Src, uint32_t *pui32Dst, + uint32_t *pui32Key, uint32_t ui32Length) +{ + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_ENCRYPT | + AES_CFG_MODE_ECB)); + + // + // Write the key. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Perform the encryption. + // + ROM_AESDataProcess(AES_BASE, pui32Src, pui32Dst, ui32Length); + + return(true); +} + +//***************************************************************************** +// +// Calculate hash subkey with the given key. +// This is performed by encrypting 128 zeroes with the key. +// +//***************************************************************************** +void +AESHashSubkeyGet(uint32_t ui32Keysize, uint32_t *pui32Key, + uint32_t *pui32HashSubkey) +{ + uint32_t pui32ZeroArray[8]; + + // + // Put zeroes into the first 4 words of the array. + // + pui32ZeroArray[0] = 0x0; + pui32ZeroArray[1] = 0x0; + pui32ZeroArray[2] = 0x0; + pui32ZeroArray[3] = 0x0; + + // + // Put zeroes into the next 4 words if the key size is 256bit + // + if(ui32Keysize == AES_CFG_KEY_SIZE_256BIT) + { + pui32ZeroArray[4] = 0x0; + pui32ZeroArray[5] = 0x0; + pui32ZeroArray[6] = 0x0; + pui32ZeroArray[7] = 0x0; + } + + // + // Perform the encryption. + // + AESECBEncrypt(ui32Keysize, pui32ZeroArray, pui32HashSubkey, pui32Key, + (ui32Keysize == AES_CFG_KEY_SIZE_128BIT?16:32)); +} + +//***************************************************************************** +// +// Perform a basic GHASH operation with the hashsubkey and IV. This is +// used to get Y0 when the IV is not 96 bits. To use this GCM mode, the +// operation direction must not be set and the counter should be disabled. +// +//***************************************************************************** +void +AESGHASH(uint32_t ui32Keysize, uint32_t *pui32HashSubkey, uint32_t *pui32IV, + uint32_t ui32IVLength, uint32_t *pui32Result) +{ + uint32_t ui32Count; + + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_MODE_GCM_HLY0ZERO)); + + // + // Set the hash subkey. + // + ROM_AESKey2Set(AES_BASE, pui32HashSubkey, ui32Keysize); + + // + // Write the lengths + // + ROM_AESLengthSet(AES_BASE, (uint64_t)ui32IVLength); + ROM_AESAuthLengthSet(AES_BASE, 0); + + // + // Write the data. + // + for(ui32Count = 0; ui32Count < ui32IVLength; ui32Count += 16) + { + // + // Write the data registers. + // + ROM_AESDataWrite(AES_BASE, pui32IV + (ui32Count / 4)); + } + + // + // Read the hash tag value. + // + AESTagRead(AES_BASE, pui32Result); +} + +//***************************************************************************** +// +// Calculate the Y0 value that needs to be written into the IV registers. +// Note: Y0 will always be 128 bits. +// +//***************************************************************************** +void +AESGCMY0Get(uint32_t ui32Keysize, uint32_t *pui32IV, uint32_t ui32IVLength, + uint32_t *pui32Key, uint32_t *pui32Y0) +{ + uint32_t pui32HashSubkey[8]; + + // + // If the length is 96 bits, then just set the last bit of the IV to 1. + // + if(ui32IVLength == 12) + { + pui32Y0[0] = pui32IV[0]; + pui32Y0[1] = pui32IV[1]; + pui32Y0[2] = pui32IV[2]; + pui32Y0[3] = 0x01000000; + } + + // + // If the length is not 96 bits, then peform a basic GHASH on the IV. + // + else + { + // + // First, get the hash subkey or H. + // + AESHashSubkeyGet(ui32Keysize, pui32Key, pui32HashSubkey); + + // + // Next, perform the GHASH operation. + // + AESGHASH(ui32Keysize, pui32HashSubkey, pui32IV, ui32IVLength, pui32Y0); + } +} + +//***************************************************************************** +// +// Perform an GCM decryption operation. +// +//***************************************************************************** +bool +AESGCMDecrypt(uint32_t ui32Keysize, uint32_t *pui32Src, uint32_t *pui32Dst, + uint32_t ui32Length, uint32_t *pui32Key, uint32_t *pui32IV, + uint32_t *pui32AAD, uint32_t ui32AADLength, uint32_t *pui32Tag, + bool bUseDMA) +{ + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Clear the interrupt flags. + // + g_bContextInIntFlag = false; + g_bDataInIntFlag = false; + g_bContextOutIntFlag = false; + g_bDataOutIntFlag = false; + g_bContextInDMADoneIntFlag = false; + g_bDataInDMADoneIntFlag = false; + g_bContextOutDMADoneIntFlag = false; + g_bDataOutDMADoneIntFlag = false; + + // + // Enable all interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | + AES_INT_DATA_IN | AES_INT_DATA_OUT)); + + // + // Wait for the context in flag. + // + while(!g_bContextInIntFlag) + { + } + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_DECRYPT | + AES_CFG_MODE_GCM_HY0CALC)); + + // + // Write the initialization value + // + ROM_AESIVSet(AES_BASE, pui32IV); + + // + // Write the keys. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Depending on the argument, perform the decryption + // with or without uDMA. + // + if(bUseDMA) + { + // + // Enable DMA interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_DMA_CONTEXT_IN | + AES_INT_DMA_DATA_IN | + AES_INT_DMA_CONTEXT_OUT | + AES_INT_DMA_DATA_OUT)); + + if(ui32AADLength != 0) + { + // + // Setup the DMA module to copy auth data in. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32AAD, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32AADLength) / 4); + UARTprintf("Data in DMA request enabled.\n"); + } + + // + // Setup the DMA module to copy the data out. + // + ROM_uDMAChannelAssign(UDMA_CH15_AES0DOUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH15_AES0DOUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_NONE | + UDMA_DST_INC_32 | UDMA_ARB_4 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(AES_BASE + AES_O_DATA_IN_0), + (void *)pui32Dst, + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data out DMA request enabled.\n"); + + // + // Write the plaintext length + // + ROM_AESLengthSet(AES_BASE, (uint64_t)ui32Length); + + // + // Write the auth length registers to start the process. + // + ROM_AESAuthLengthSet(AES_BASE, ui32AADLength); + + // + // Enable the DMA channels to start the transfers. This must be done after + // writing the length to prevent data from copying before the context is + // truly ready. + // + if(ui32AADLength != 0) + { + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + } + ROM_uDMAChannelEnable(UDMA_CH15_AES0DOUT); + + // + // Enable DMA requests + // + ROM_AESDMAEnable(AES_BASE, AES_DMA_DATA_IN | AES_DMA_DATA_OUT); + + if(ui32AADLength != 0) + { + // + // Wait for the data in DMA done interrupt. + // + while(!g_bDataInDMADoneIntFlag) + { + } + } + + if(ui32Length != 0) + { + // + // Setup the uDMA to copy the plaintext data. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Src, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32Length) / 4); + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + UARTprintf("Data in DMA request enabled.\n"); + + // + // Wait for the data out DMA done interrupt. + // + while(!g_bDataOutDMADoneIntFlag) + { + } + } + + // + // Read out the tag. + // + AESTagRead(AES_BASE, pui32Tag); + } + else + { + // + // Perform the decryption. + // + ROM_AESDataProcessAuth(AES_BASE, pui32Src, pui32Dst, ui32Length, + pui32AAD, ui32AADLength, pui32Tag); + } + + return(true); +} + +//***************************************************************************** +// +// Initialize the AES and CCM modules. +// +//***************************************************************************** +bool +AESInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example decrypts blocks ciphertext using AES128 and AES256 in GCM +// mode. It does the decryption first without uDMA and then with uDMA. +// The results are checked after each operation. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32PlainText[64], pui32Tag[4], pui32Y0[4], ui32Errors, ui32Idx; + uint32_t *pui32Key, ui32IVLength, *pui32IV, ui32DataLength; + uint32_t *pui32ExpPlainText, ui32AuthDataLength, *pui32AuthData; + uint32_t *pui32CipherText, *pui32ExpTag; + uint32_t ui32KeySize; + uint32_t ui32SysClock; + uint8_t ui8Vector; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | + SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "aes-gcm-decrypt"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32PlainText[ui32Idx] = 0; + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUStackingEnable(); + + // + // Enable AES interrupts. + // + ROM_IntEnable(INT_AES0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting AES GCM decryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and AES modules. + // + if(!AESInit()) + { + UARTprintf("Initialization of the AES module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Loop through all the given vectors. + // + for(ui8Vector = 0; + (ui8Vector < + (sizeof(g_psAESGCMTestVectors) / sizeof(g_psAESGCMTestVectors[0]))) && + (ui32Errors == 0); + ui8Vector++) + { + UARTprintf("Starting vector #%d\n", ui8Vector); + + // + // Get the current vector's data members. + // + ui32KeySize = g_psAESGCMTestVectors[ui8Vector].ui32KeySize; + pui32Key = g_psAESGCMTestVectors[ui8Vector].pui32Key; + ui32IVLength = g_psAESGCMTestVectors[ui8Vector].ui32IVLength; + pui32IV = g_psAESGCMTestVectors[ui8Vector].pui32IV; + ui32DataLength = g_psAESGCMTestVectors[ui8Vector].ui32DataLength; + pui32ExpPlainText = g_psAESGCMTestVectors[ui8Vector].pui32PlainText; + ui32AuthDataLength = + g_psAESGCMTestVectors[ui8Vector].ui32AuthDataLength; + pui32AuthData = g_psAESGCMTestVectors[ui8Vector].pui32AuthData; + pui32CipherText = g_psAESGCMTestVectors[ui8Vector].pui32CipherText; + pui32ExpTag = g_psAESGCMTestVectors[ui8Vector].pui32Tag; + + // + // If both the data lengths are zero, then it's a special case. + // + if((ui32DataLength == 0) && (ui32AuthDataLength == 0)) + { + UARTprintf("Performing decryption without uDMA.\n"); + + // + // Figure out the value of Y0 depending on the IV length. + // + AESGCMY0Get(ui32KeySize, pui32IV, ui32IVLength, pui32Key, pui32Y0); + + // + // Perform the basic encryption. + // + AESECBEncrypt(ui32KeySize, pui32Y0, pui32Tag, pui32Key, 16); + } + else + { + // + // Figure out the value of Y0 depending on the IV length. + // + AESGCMY0Get(ui32KeySize, pui32IV, ui32IVLength, pui32Key, pui32Y0); + + // + // Perform the decryption without uDMA. + // + UARTprintf("Performing decryption without uDMA.\n"); + AESGCMDecrypt(ui32KeySize, pui32CipherText, pui32PlainText, + ui32DataLength, pui32Key, pui32Y0, pui32AuthData, + ui32AuthDataLength, pui32Tag, false); + } + + // + // Check the results. + // + for(ui32Idx = 0; ui32Idx < (ui32DataLength / 4); ui32Idx++) + { + if(pui32ExpPlainText[ui32Idx] != pui32PlainText[ui32Idx]) + { + UARTprintf("Plaintext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32ExpPlainText[ui32Idx], + pui32PlainText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + if(pui32ExpTag[ui32Idx] != pui32Tag[ui32Idx]) + { + UARTprintf("Tag mismatch on word %d. Exp: 0x%x, Act: 0x%x\n", + ui32Idx, pui32ExpTag[ui32Idx], pui32Tag[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000003; + } + } + + // + // Clear the arrays containing the ciphertext and tag to ensure things + // are working correctly. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32PlainText[ui32Idx] = 0; + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + + // + // Only use DMA with the vectors that have data. + // + if((ui32DataLength != 0) || (ui32AuthDataLength != 0)) + { + // + // Perform the decryption with uDMA. + // + UARTprintf("Performing decryption with uDMA.\n"); + AESGCMDecrypt(ui32KeySize, pui32CipherText, pui32PlainText, + ui32DataLength, pui32Key, pui32Y0, pui32AuthData, + ui32AuthDataLength, pui32Tag, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < (ui32DataLength / 4); ui32Idx++) + { + if(pui32ExpPlainText[ui32Idx] != pui32PlainText[ui32Idx]) + { + UARTprintf("Plaintext mismatch on word %d. Exp: 0x%x, " + "Act: 0x%x\n", ui32Idx, + pui32ExpPlainText[ui32Idx], + pui32PlainText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + if(pui32ExpTag[ui32Idx] != pui32Tag[ui32Idx]) + { + UARTprintf("Tag mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32ExpTag[ui32Idx], + pui32Tag[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000003; + } + } + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + // + // Wait forever. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ewd b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ewp b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ewp new file mode 100644 index 0000000..f38cf74 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\aes_gcm_decrypt.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.icf b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.icf new file mode 100644 index 0000000..0019c3f --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// aes_gcm_decrypt.icf - Linker configuration file for aes_gcm_decrypt. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ld b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ld new file mode 100644 index 0000000..0bc9a25 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * aes_gcm_decrypt.ld - Linker configuration file for aes_gcm_decrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.sct b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.sct new file mode 100644 index 0000000..2bf4320 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; aes_gcm_decrypt.sct - Linker configuration file for aes_gcm_decrypt. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.uvopt b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.uvopt new file mode 100644 index 0000000..c47e7a9 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + aes_gcm_decrypt + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\aes_gcm_decrypt.c + aes_gcm_decrypt.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.uvproj b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.uvproj new file mode 100644 index 0000000..6856f2f --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + aes_gcm_decrypt + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + aes_gcm_decrypt + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\aes_gcm_decrypt.bin .\rvmdk\aes_gcm_decrypt.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + aes_gcm_decrypt.sct + + + --entry Reset_Handler + + + + + + + + Source + + + aes_gcm_decrypt.c + 1 + .\aes_gcm_decrypt.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt_ccs.cmd b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt_ccs.cmd new file mode 100644 index 0000000..790c3a8 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * aes_gcm_decrypt_ccs.cmd - CCS linker configuration file for aes_gcm_decrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.ccsimportspec b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.ccsimportspec new file mode 100644 index 0000000..c0a5a25 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.ccsproject b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.cproject b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.cproject new file mode 100644 index 0000000..7c834ab --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.project b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.project new file mode 100644 index 0000000..66b532f --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.project @@ -0,0 +1,70 @@ + + + aes_gcm_decrypt + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + aes_gcm_decrypt.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt.c + + + aes_gcm_decrypt_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_gcm_decrypt/aes_gcm_decrypt_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_gcm_decrypt/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/Debug/aes_gcm_decrypt.bin b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/Debug/aes_gcm_decrypt.bin new file mode 100644 index 0000000..dc8f56d Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/Debug/aes_gcm_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/Debug/aes_gcm_decrypt.out b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/Debug/aes_gcm_decrypt.out new file mode 100644 index 0000000..8a9809d Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/Debug/aes_gcm_decrypt.out differ diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/macros.ini_initial b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/target_config.ccxml b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/ewarm/Exe/aes_gcm_decrypt.bin b/boards/dk-tm4c129x/aes_gcm_decrypt/ewarm/Exe/aes_gcm_decrypt.bin new file mode 100644 index 0000000..f854d57 Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_decrypt/ewarm/Exe/aes_gcm_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/ewarm/Exe/aes_gcm_decrypt.out b/boards/dk-tm4c129x/aes_gcm_decrypt/ewarm/Exe/aes_gcm_decrypt.out new file mode 100644 index 0000000..bf5f245 Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_decrypt/ewarm/Exe/aes_gcm_decrypt.out differ diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/gcc/aes_gcm_decrypt.axf b/boards/dk-tm4c129x/aes_gcm_decrypt/gcc/aes_gcm_decrypt.axf new file mode 100644 index 0000000..761a928 Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_decrypt/gcc/aes_gcm_decrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/gcc/aes_gcm_decrypt.bin b/boards/dk-tm4c129x/aes_gcm_decrypt/gcc/aes_gcm_decrypt.bin new file mode 100644 index 0000000..b1e0be5 Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_decrypt/gcc/aes_gcm_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/readme.txt b/boards/dk-tm4c129x/aes_gcm_decrypt/readme.txt new file mode 100644 index 0000000..314d5b2 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/readme.txt @@ -0,0 +1,28 @@ +AES128 and AES256 GCM Decryption Demo + +Simple demo showing authenticated decryption operations using the AES +module in GCM mode. The test vectors are from the gcm_revised_spec.pdf +document. + +Please note that the use of interrupts and uDMA is not required for the +operation of the module. It is only done for demonstration purposes. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/rvmdk/aes_gcm_decrypt.axf b/boards/dk-tm4c129x/aes_gcm_decrypt/rvmdk/aes_gcm_decrypt.axf new file mode 100644 index 0000000..02697ff Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_decrypt/rvmdk/aes_gcm_decrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/rvmdk/aes_gcm_decrypt.bin b/boards/dk-tm4c129x/aes_gcm_decrypt/rvmdk/aes_gcm_decrypt.bin new file mode 100644 index 0000000..a466050 Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_decrypt/rvmdk/aes_gcm_decrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/startup_ccs.c b/boards/dk-tm4c129x/aes_gcm_decrypt/startup_ccs.c new file mode 100644 index 0000000..882868b --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/startup_ewarm.c b/boards/dk-tm4c129x/aes_gcm_decrypt/startup_ewarm.c new file mode 100644 index 0000000..b08ccba --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/startup_gcc.c b/boards/dk-tm4c129x/aes_gcm_decrypt/startup_gcc.c new file mode 100644 index 0000000..f1c5730 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_gcm_decrypt/startup_rvmdk.S b/boards/dk-tm4c129x/aes_gcm_decrypt/startup_rvmdk.S new file mode 100644 index 0000000..558dc08 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_decrypt/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN AESIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD AESIntHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/Makefile b/boards/dk-tm4c129x/aes_gcm_encrypt/Makefile new file mode 100644 index 0000000..9b0c1b1 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the AES128 and AES256 GCM Encryption Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the AES128 and AES256 GCM Encryption Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/aes_gcm_encrypt.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the AES128 and AES256 GCM Encryption Demo. +# +${COMPILER}/aes_gcm_encrypt.axf: ${COMPILER}/aes_gcm_encrypt.o +${COMPILER}/aes_gcm_encrypt.axf: ${COMPILER}/frame.o +${COMPILER}/aes_gcm_encrypt.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/aes_gcm_encrypt.axf: ${COMPILER}/pinout.o +${COMPILER}/aes_gcm_encrypt.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/aes_gcm_encrypt.axf: ${COMPILER}/uartstdio.o +${COMPILER}/aes_gcm_encrypt.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/aes_gcm_encrypt.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/aes_gcm_encrypt.axf: aes_gcm_encrypt.ld +SCATTERgcc_aes_gcm_encrypt=aes_gcm_encrypt.ld +ENTRY_aes_gcm_encrypt=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.c b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.c new file mode 100644 index 0000000..09dd106 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.c @@ -0,0 +1,1190 @@ +//***************************************************************************** +// +// aes_gcm_encrypt.c - Simple AES128 and AES256 GCM encryption demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_aes.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/aes.h" +#include "driverlib/debug.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

AES128 and AES256 GCM Encryption Demo (aes_gcm_encrypt)

+//! +//! Simple demo showing authenticated encryption operations using the AES +//! module in GCM mode. The test vectors are from the gcm_revised_spec.pdf +//! document. +//! +//! Please note that the use of interrupts and uDMA is not required for the +//! operation of the module. It is only done for demonstration purposes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Structure for NIST AES GCM tests +// +//***************************************************************************** +typedef struct AESTestVectorStruct +{ + uint32_t ui32KeySize; + uint32_t pui32Key[8]; + uint32_t ui32IVLength; + uint32_t pui32IV[64]; + uint32_t ui32DataLength; + uint32_t pui32PlainText[64]; + uint32_t ui32AuthDataLength; + uint32_t pui32AuthData[64]; + uint32_t pui32CipherText[64]; + uint32_t pui32Tag[4]; +} +tAESGCMTestVector; + +//***************************************************************************** +// +// Test Cases from NIST GCM Revised Spec. +// +//***************************************************************************** +tAESGCMTestVector g_psAESGCMTestVectors[] = +{ + // + // Test Case #1 + // This is a special case that cannot use the GCM mode because the + // data and AAD lengths are both zero. The work around is to perform + // an ECB encryption on Y0. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 12, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 0, + { 0 }, + 0, + { 0 }, + { 0 }, + { 0xcefce258, 0x61307efa, 0x571d7f36, 0x5a45e7a4 } + }, + + // + // Test Case #2 + // This is the first test in which the AAD length is zero. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 12, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 16, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 0, + { 0 }, + { 0xceda8803, 0x92a3b660, 0xb9c228f3, 0x78feb271 }, + { 0xd4476eab, 0xbd13ec2c, 0xb2673af5, 0xdfbd5712 } + }, + + // + // Test Case #3 + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 12, + { 0xbebafeca, 0xaddbcefa, 0x88f8cade, 0x00000000 }, + 64, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x55d2af1a }, + 0, + { 0 }, + { 0xc21e8342, 0x24747721, 0xb721724b, 0x9cd4d084, + 0x2f21aae3, 0xe0a4022c, 0x237ec135, 0x2ea1ac29, + 0xb214d521, 0x1c936654, 0x5a6a8f7d, 0x05aa84ac, + 0x390ba31b, 0x97ac0a6a, 0x91e0583d, 0x85593f47 }, + { 0xf32a5c4d, 0xa664cd27, 0xbd5af32c, 0xb4faa62b } + }, + + // + // Test Case #4 + // When the data lengths do not align with the block + // boundary, we need to pad with zeros to ensure unknown + // data is not copied with uDMA. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 12, + { 0xbebafeca, 0xaddbcefa, 0x88f8cade, 0x00000000 }, + 60, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x00000000 }, + 20, + { 0xcefaedfe, 0xefbeadde, 0xcefaedfe, 0xefbeadde, + 0xd2daadab, 0x00000000, 0x00000000, 0x00000000 }, + { 0xc21e8342, 0x24747721, 0xb721724b, 0x9cd4d084, + 0x2f21aae3, 0xe0a4022c, 0x237ec135, 0x2ea1ac29, + 0xb214d521, 0x1c936654, 0x5a6a8f7d, 0x05aa84ac, + 0x390ba31b, 0x97ac0a6a, 0x91e0583d, 0x00000000 }, + { 0xbc4fc95b, 0xdba52132, 0x5ae9fa94, 0x471a12e7 } + }, + + // + // Test Case #5 + // This is the first case in which IV is less than + // 96 bits. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 8, + { 0xbebafeca, 0xaddbcefa, 0x00000000, 0x00000000 }, + 60, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x00000000 }, + 20, + { 0xcefaedfe, 0xefbeadde, 0xcefaedfe, 0xefbeadde, + 0xd2daadab, 0x00000000, 0x00000000, 0x00000000 }, + { 0x4c3b3561, 0x4a930628, 0x1ff57f77, 0x55472aa2, + 0x712a9b69, 0xf8c6cd4f, 0xf9e56637, 0x23746c7b, + 0x00698073, 0xb2249fe4, 0x4475092b, 0x426b89d4, + 0xe1b58949, 0x070faceb, 0x98453fc2, 0x00000000 }, + { 0xe7d21236, 0x85073b9e, 0x4ae11b56, 0xcbfca2ac } + }, + + // + // Test Case #6 + // This is the first case in which IV is more than + // 96 bits. + // + { + AES_CFG_KEY_SIZE_128BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 60, + { 0x5d221393, 0xe50684f8, 0x5a9c9055, 0xaa6952ff, + 0x38957a6a, 0xa17d4f53, 0xd203c3e4, 0x28a718a3, + 0x51c9c0c3, 0x39958056, 0x42e2f0fc, 0x54526b9a, + 0xf5dbae16, 0x576adea0, 0x9bb337a6, 0x00000000 }, + 60, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x00000000 }, + 20, + { 0xcefaedfe, 0xefbeadde, 0xcefaedfe, 0xefbeadde, + 0xd2daadab }, + { 0x9849e28c, 0xb6155662, 0xac33a003, 0x94b83fa1, + 0xa51291be, 0xa811a2c3, 0x3c2a26ba, 0xa72c7eca, + 0xa4a9e401, 0x903ca4fb, 0x81b2dccc, 0x6f7c8cd4, + 0xd27528d6, 0x0317a4ac, 0xe5ae344c, 0x00000000 }, + { 0xaec59c61, 0xfa0bfeff, 0x3cf42a46, 0x50d09916 } + }, + + // + // The following test cases use 256bit Keys. + // + // Test Case #7 - Test Case 13 from the doc + // This is a special case that cannot use the GCM mode because the + // data and AAD lengths are both zero. The work around is to perform + // an ECB encryption on Y0. + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 12, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 0, + { 0 }, + 0, + { 0 }, + { 0 }, + { 0xfb8a0f53, 0xb93645c7, 0xf1b463a9, 0x8b73cbc4 } + }, + + // + // Test Case #8, - Test Case 14 from the doc + // This is the first test in which the AAD length is zero. + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 12, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 16, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + 0, + { 0 }, + { 0x3d40a7ce, 0x6e6b604d, 0xd3c54e07, 0x189df3ba }, + { 0xa7c8d1d0, 0xf06b9999, 0xb5985b26, 0x19b98ad4 } + }, + + // + // Test Case #9, - Test Case 15 from the doc + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067, + 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 12, + { 0xbebafeca, 0xaddbcefa, 0x88f8cade, 0x00000000 }, + 64, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x55d2af1a }, + 0, + { 0 }, + { 0xf0c12d52, 0x077d5699, 0xa3377ff4, 0x7d42842a, + 0xdc8c3a64, 0xc9c0e5bf, 0xbda29875, 0xaad15525, + 0x488eb08c, 0x3dbb0d59, 0x108bb0a7, 0x38888256, + 0x631ef6c5, 0x0a7aba93, 0x62f6c9bc, 0xad158089 }, + { 0xc5da94b0, 0xbd7134d9, 0x22501aec, 0x6ccce370 } + }, + + // + // Test Case #10 - Test Case 16 from the doc + // When the data lengths do not align with the block + // boundary, we need to pad with zeros to ensure unknown + // data is not copied with uDMA. + // + { + AES_CFG_KEY_SIZE_256BIT, + { 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067, + 0x92e9fffe, 0x1c736586, 0x948f6a6d, 0x08833067 }, + 12, + { 0xbebafeca, 0xaddbcefa, 0x88f8cade, 0x00000000 }, + 60, + { 0x253231d9, 0xe50684f8, 0xc50959a5, 0x9a26f5af, + 0x53a9a786, 0xdaf73415, 0x3d304c2e, 0x728a318a, + 0x950c3c1c, 0x53096895, 0x240ecf2f, 0x25b5a649, + 0xf5ed6ab1, 0x57e60daa, 0x397b63ba, 0x00000000 }, + 20, + { 0xcefaedfe, 0xefbeadde, 0xcefaedfe, 0xefbeadde, + 0xd2daadab, 0x00000000, 0x00000000, 0x00000000 }, + { 0xf0c12d52, 0x077d5699, 0xa3377ff4, 0x7d42842a, + 0xdc8c3a64, 0xc9c0e5bf, 0xbda29875, 0xaad15525, + 0x488eb08c, 0x3dbb0d59, 0x108bb0a7, 0x38888256, + 0x631ef6c5, 0x0a7aba93, 0x62f6c9bc, 0x00000000 }, + { 0xce6efc76, 0x68174e0f, 0x5388dfcd, 0x1b552dbb } + } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Round up length to nearest 16 byte boundary. This is needed because all +// four data registers must be written at once. This is handled in the AES +// driver, but if using uDMA, the length must rounded up. +// +//***************************************************************************** +uint32_t +LengthRoundUp(uint32_t ui32Length) +{ + uint32_t ui32Remainder; + + ui32Remainder = ui32Length % 16; + if(ui32Remainder == 0) + { + return(ui32Length); + } + else + { + return(ui32Length + (16 - ui32Remainder)); + } +} + +//***************************************************************************** +// +// The AES interrupt handler and interrupt flags. +// +//***************************************************************************** +static volatile bool g_bContextInIntFlag; +static volatile bool g_bDataInIntFlag; +static volatile bool g_bContextOutIntFlag; +static volatile bool g_bDataOutIntFlag; +static volatile bool g_bContextInDMADoneIntFlag; +static volatile bool g_bDataInDMADoneIntFlag; +static volatile bool g_bContextOutDMADoneIntFlag; +static volatile bool g_bDataOutDMADoneIntFlag; + +void +AESIntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the AES masked interrupt status. + // + ui32IntStatus = ROM_AESIntStatus(AES_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & AES_INT_CONTEXT_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_IN); + g_bContextInIntFlag = true; + UARTprintf("Context input registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_IN) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_IN); + g_bDataInIntFlag = true; + UARTprintf("Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & AES_INT_CONTEXT_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_CONTEXT_OUT); + g_bContextOutIntFlag = true; + UARTprintf("Context output registers are ready.\n"); + } + if(ui32IntStatus & AES_INT_DATA_OUT) + { + ROM_AESIntDisable(AES_BASE, AES_INT_DATA_OUT); + g_bDataOutIntFlag = true; + UARTprintf("Data FIFO is ready to provide data.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneIntFlag = true; + UARTprintf("DMA completed a context write to the internal\n"); + UARTprintf("registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_IN) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_IN); + g_bDataInDMADoneIntFlag = true; + UARTprintf("DMA has written the last word of input data to\n"); + UARTprintf("the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & AES_INT_DMA_CONTEXT_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_CONTEXT_OUT); + g_bContextOutDMADoneIntFlag = true; + UARTprintf("DMA completed the output context movement from\n"); + UARTprintf("the internal registers.\n"); + } + if(ui32IntStatus & AES_INT_DMA_DATA_OUT) + { + ROM_AESIntClear(AES_BASE, AES_INT_DMA_DATA_OUT); + g_bDataOutDMADoneIntFlag = true; + UARTprintf("DMA has written the last word of process result.\n"); + } +} + +//***************************************************************************** +// +// Perform an ECB encryption operation. +// +//***************************************************************************** +bool +AESECBEncrypt(uint32_t ui32Keysize, uint32_t *pui32Src, uint32_t *pui32Dst, + uint32_t *pui32Key, uint32_t ui32Length) +{ + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_ENCRYPT | + AES_CFG_MODE_ECB)); + + // + // Write the key. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Perform the encryption. + // + ROM_AESDataProcess(AES_BASE, pui32Src, pui32Dst, ui32Length); + + return(true); +} + +//***************************************************************************** +// +// Calculate hash subkey with the given key. +// This is performed by encrypting 128 zeroes with the key. +// +//***************************************************************************** +void +AESHashSubkeyGet(uint32_t ui32Keysize, uint32_t *pui32Key, + uint32_t *pui32HashSubkey) +{ + uint32_t pui32ZeroArray[8]; + + // + // Put zeroes into the first 4 words of the array. + // + pui32ZeroArray[0] = 0x0; + pui32ZeroArray[1] = 0x0; + pui32ZeroArray[2] = 0x0; + pui32ZeroArray[3] = 0x0; + + // + // Put zeroes into the next 4 words if the key size is 256bit + // + if(ui32Keysize == AES_CFG_KEY_SIZE_256BIT) + { + pui32ZeroArray[4] = 0x0; + pui32ZeroArray[5] = 0x0; + pui32ZeroArray[6] = 0x0; + pui32ZeroArray[7] = 0x0; + } + + // + // Perform the encryption. + // + AESECBEncrypt(ui32Keysize, pui32ZeroArray, pui32HashSubkey, pui32Key, + (ui32Keysize == AES_CFG_KEY_SIZE_128BIT?16:32)); +} + +//***************************************************************************** +// +// Perform a basic GHASH operation with the hashsubkey and IV. This is +// used to get Y0 when the IV is not 96 bits. To use this GCM mode, the +// operation direction must not be set and the counter should be disabled. +// +//***************************************************************************** +void +AESGHASH(uint32_t ui32Keysize, uint32_t *pui32HashSubkey, uint32_t *pui32IV, + uint32_t ui32IVLength, uint32_t *pui32Result) +{ + uint32_t ui32Count; + + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_MODE_GCM_HLY0ZERO)); + + // + // Set the hash subkey. + // + ROM_AESKey2Set(AES_BASE, pui32HashSubkey, ui32Keysize); + + // + // Write the lengths + // + ROM_AESLengthSet(AES_BASE, (uint64_t)ui32IVLength); + ROM_AESAuthLengthSet(AES_BASE, 0); + + // + // Write the data. + // + for(ui32Count = 0; ui32Count < ui32IVLength; ui32Count += 16) + { + // + // Write the data registers. + // + ROM_AESDataWrite(AES_BASE, pui32IV + (ui32Count / 4)); + } + + // + // Read the hash tag value. + // + AESTagRead(AES_BASE, pui32Result); +} + +//***************************************************************************** +// +// Calculate the Y0 value that needs to be written into the IV registers. +// Note: Y0 will always be 128 bits. +// +//***************************************************************************** +void +AESGCMY0Get(uint32_t ui32Keysize, uint32_t *pui32IV, uint32_t ui32IVLength, + uint32_t *pui32Key, uint32_t *pui32Y0) +{ + uint32_t pui32HashSubkey[8]; + + // + // If the length is 96 bits, then just set the last bit of the IV to 1. + // + if(ui32IVLength == 12) + { + pui32Y0[0] = pui32IV[0]; + pui32Y0[1] = pui32IV[1]; + pui32Y0[2] = pui32IV[2]; + pui32Y0[3] = 0x01000000; + } + + // + // If the length is not 96 bits, then peform a basic GHASH on the IV. + // + else + { + // + // First, get the hash subkey or H. + // + AESHashSubkeyGet(ui32Keysize, pui32Key, pui32HashSubkey); + + // + // Next, perform the GHASH operation. + // + AESGHASH(ui32Keysize, pui32HashSubkey, pui32IV, ui32IVLength, pui32Y0); + } +} + +//***************************************************************************** +// +// Perform an GCM encryption operation. +// +//***************************************************************************** +bool +AESGCMEncrypt(uint32_t ui32Keysize, uint32_t *pui32Src, uint32_t *pui32Dst, + uint32_t ui32Length, uint32_t *pui32Key, uint32_t *pui32IV, + uint32_t *pui32AAD, uint32_t ui32AADLength, uint32_t *pui32Tag, + bool bUseDMA) +{ + // + // Perform a soft reset. + // + ROM_AESReset(AES_BASE); + + // + // Clear the interrupt flags. + // + g_bContextInIntFlag = false; + g_bDataInIntFlag = false; + g_bContextOutIntFlag = false; + g_bDataOutIntFlag = false; + g_bContextInDMADoneIntFlag = false; + g_bDataInDMADoneIntFlag = false; + g_bContextOutDMADoneIntFlag = false; + g_bDataOutDMADoneIntFlag = false; + + // + // Enable all interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | + AES_INT_DATA_IN | AES_INT_DATA_OUT)); + + // + // Wait for the context in flag. + // + while(!g_bContextInIntFlag) + { + } + + // + // Configure the AES module. + // + ROM_AESConfigSet(AES_BASE, (ui32Keysize | AES_CFG_DIR_ENCRYPT | + AES_CFG_MODE_GCM_HY0CALC)); + + // + // Write the initialization value + // + ROM_AESIVSet(AES_BASE, pui32IV); + + // + // Write the keys. + // + ROM_AESKey1Set(AES_BASE, pui32Key, ui32Keysize); + + // + // Depending on the argument, perform the encryption + // with or without uDMA. + // + if(bUseDMA) + { + // + // Enable DMA interrupts. + // + ROM_AESIntEnable(AES_BASE, (AES_INT_DMA_CONTEXT_IN | + AES_INT_DMA_DATA_IN | + AES_INT_DMA_CONTEXT_OUT | + AES_INT_DMA_DATA_OUT)); + + if(ui32AADLength != 0) + { + // + // Setup the DMA module to copy auth data in. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32AAD, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32AADLength) / 4); + UARTprintf("Data in DMA request enabled.\n"); + } + + // + // Setup the DMA module to copy the data out. + // + ROM_uDMAChannelAssign(UDMA_CH15_AES0DOUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH15_AES0DOUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_NONE | + UDMA_DST_INC_32 | UDMA_ARB_4 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH15_AES0DOUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(AES_BASE + AES_O_DATA_IN_0), + (void *)pui32Dst, + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data out DMA request enabled.\n"); + + // + // Write the plaintext length + // + ROM_AESLengthSet(AES_BASE, (uint64_t)ui32Length); + + // + // Write the auth length registers to start the process. + // + ROM_AESAuthLengthSet(AES_BASE, ui32AADLength); + + // + // Enable the DMA channels to start the transfers. This must be done after + // writing the length to prevent data from copying before the context is + // truly ready. + // + if(ui32AADLength != 0) + { + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + } + ROM_uDMAChannelEnable(UDMA_CH15_AES0DOUT); + + // + // Enable DMA requests + // + ROM_AESDMAEnable(AES_BASE, AES_DMA_DATA_IN | AES_DMA_DATA_OUT); + + if(ui32AADLength != 0) + { + // + // Wait for the data in DMA done interrupt. + // + while(!g_bDataInDMADoneIntFlag) + { + } + } + + if(ui32Length != 0) + { + // + // Setup the uDMA to copy the plaintext data. + // + ROM_uDMAChannelAssign(UDMA_CH14_AES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH14_AES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_4 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH14_AES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Src, + (void *)(AES_BASE + AES_O_DATA_IN_0), + LengthRoundUp(ui32Length) / 4); + ROM_uDMAChannelEnable(UDMA_CH14_AES0DIN); + UARTprintf("Data in DMA request enabled.\n"); + + // + // Wait for the data out DMA done interrupt. + // + while(!g_bDataOutDMADoneIntFlag) + { + } + } + + // + // Read out the tag. + // + AESTagRead(AES_BASE, pui32Tag); + } + else + { + // + // Perform the encryption. + // + ROM_AESDataProcessAuth(AES_BASE, pui32Src, pui32Dst, ui32Length, + pui32AAD, ui32AADLength, pui32Tag); + } + + return(true); +} + +//***************************************************************************** +// +// Initialize the AES and CCM modules. +// +//***************************************************************************** +bool +AESInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example encrypts blocks ciphertext using AES128 in GCM mode. It +// does the encryption first without uDMA and then with uDMA. The results +// are checked after each operation. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32CipherText[64], pui32Tag[4], pui32Y0[4], ui32Errors, ui32Idx; + uint32_t *pui32Key, ui32IVLength, *pui32IV, ui32DataLength; + uint32_t *pui32ExpCipherText, ui32AuthDataLength, *pui32AuthData; + uint32_t *pui32PlainText, *pui32ExpTag; + uint8_t ui8Vector; + uint32_t ui32KeySize; + uint32_t ui32SysClock; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | + SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "aes-gcm-encrypt"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUStackingEnable(); + + // + // Enable AES interrupts. + // + ROM_IntEnable(INT_AES0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting AES GCM encryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and AES modules. + // + if(!AESInit()) + { + UARTprintf("Initialization of the AES module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Loop through all the given vectors. + // + for(ui8Vector = 0; + (ui8Vector < + (sizeof(g_psAESGCMTestVectors) / sizeof(g_psAESGCMTestVectors[0]))) && + (ui32Errors == 0); + ui8Vector++) + { + UARTprintf("Starting vector #%d\n", ui8Vector); + + // + // Get the current vector's data members. + // + ui32KeySize = g_psAESGCMTestVectors[ui8Vector].ui32KeySize; + pui32Key = g_psAESGCMTestVectors[ui8Vector].pui32Key; + ui32IVLength = g_psAESGCMTestVectors[ui8Vector].ui32IVLength; + pui32IV = g_psAESGCMTestVectors[ui8Vector].pui32IV; + ui32DataLength = g_psAESGCMTestVectors[ui8Vector].ui32DataLength; + pui32PlainText = g_psAESGCMTestVectors[ui8Vector].pui32PlainText; + ui32AuthDataLength = + g_psAESGCMTestVectors[ui8Vector].ui32AuthDataLength; + pui32AuthData = g_psAESGCMTestVectors[ui8Vector].pui32AuthData; + pui32ExpCipherText = g_psAESGCMTestVectors[ui8Vector].pui32CipherText; + pui32ExpTag = g_psAESGCMTestVectors[ui8Vector].pui32Tag; + + // + // If both the data lengths are zero, then it's a special case. + // + if((ui32DataLength == 0) && (ui32AuthDataLength == 0)) + { + UARTprintf("Performing encryption without uDMA.\n"); + + // + // Figure out the value of Y0 depending on the IV length. + // + AESGCMY0Get(ui32KeySize, pui32IV, ui32IVLength, pui32Key, pui32Y0); + + // + // Perform the basic encryption. + // + AESECBEncrypt(ui32KeySize, pui32Y0, pui32Tag, pui32Key, 16); + } + else + { + // + // Figure out the value of Y0 depending on the IV length. + // + AESGCMY0Get(ui32KeySize, pui32IV, ui32IVLength, pui32Key, pui32Y0); + + // + // Perform the encryption without uDMA. + // + UARTprintf("Performing encryption without uDMA.\n"); + AESGCMEncrypt(ui32KeySize, pui32PlainText, pui32CipherText, + ui32DataLength, pui32Key, pui32Y0, pui32AuthData, + ui32AuthDataLength, pui32Tag, false); + } + + // + // Check the results. + // + for(ui32Idx = 0; ui32Idx < (ui32DataLength / 4); ui32Idx++) + { + if(pui32ExpCipherText[ui32Idx] != pui32CipherText[ui32Idx]) + { + UARTprintf("Ciphertext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32ExpCipherText[ui32Idx], + pui32CipherText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + if(pui32ExpTag[ui32Idx] != pui32Tag[ui32Idx]) + { + UARTprintf("Tag mismatch on word %d. Exp: 0x%x, Act: 0x%x\n", + ui32Idx, pui32ExpTag[ui32Idx], pui32Tag[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000003; + } + } + + // + // Clear the arrays containing the ciphertext and tag to ensure things + // are working correctly. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + pui32Tag[ui32Idx] = 0; + } + + // + // Only use DMA with the vectors that have data. + // + if((ui32DataLength != 0) || (ui32AuthDataLength != 0)) + { + // + // Perform the encryption with uDMA. + // + UARTprintf("Performing encryption with uDMA.\n"); + AESGCMEncrypt(ui32KeySize, pui32PlainText, pui32CipherText, + ui32DataLength, pui32Key, pui32Y0, pui32AuthData, + ui32AuthDataLength, pui32Tag, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < (ui32DataLength / 4); ui32Idx++) + { + if(pui32ExpCipherText[ui32Idx] != pui32CipherText[ui32Idx]) + { + UARTprintf("Ciphertext mismatch on word %d. Exp: 0x%x, " + "Act: 0x%x\n", ui32Idx, + pui32ExpCipherText[ui32Idx], + pui32CipherText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + if(pui32ExpTag[ui32Idx] != pui32Tag[ui32Idx]) + { + UARTprintf("Tag mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, pui32ExpTag[ui32Idx], + pui32Tag[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000003; + } + } + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + // + // Wait forever. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ewd b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ewp b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ewp new file mode 100644 index 0000000..a4252b4 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\aes_gcm_encrypt.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.icf b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.icf new file mode 100644 index 0000000..21e2c08 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// aes_gcm_encrypt.icf - Linker configuration file for aes_gcm_encrypt. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ld b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ld new file mode 100644 index 0000000..47c331b --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * aes_gcm_encrypt.ld - Linker configuration file for aes_gcm_encrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.sct b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.sct new file mode 100644 index 0000000..d44f696 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; aes_gcm_encrypt.sct - Linker configuration file for aes_gcm_encrypt. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.uvopt b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.uvopt new file mode 100644 index 0000000..2bf29e1 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + aes_gcm_encrypt + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\aes_gcm_encrypt.c + aes_gcm_encrypt.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.uvproj b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.uvproj new file mode 100644 index 0000000..c64ab07 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + aes_gcm_encrypt + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + aes_gcm_encrypt + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\aes_gcm_encrypt.bin .\rvmdk\aes_gcm_encrypt.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + aes_gcm_encrypt.sct + + + --entry Reset_Handler + + + + + + + + Source + + + aes_gcm_encrypt.c + 1 + .\aes_gcm_encrypt.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt_ccs.cmd b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt_ccs.cmd new file mode 100644 index 0000000..9a2054c --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * aes_gcm_encrypt_ccs.cmd - CCS linker configuration file for aes_gcm_encrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.ccsimportspec b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.ccsimportspec new file mode 100644 index 0000000..8409600 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.ccsproject b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.cproject b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.cproject new file mode 100644 index 0000000..a1e290e --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.project b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.project new file mode 100644 index 0000000..c859a3d --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.project @@ -0,0 +1,70 @@ + + + aes_gcm_encrypt + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + aes_gcm_encrypt.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt.c + + + aes_gcm_encrypt_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_gcm_encrypt/aes_gcm_encrypt_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/aes_gcm_encrypt/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/Debug/aes_gcm_encrypt.bin b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/Debug/aes_gcm_encrypt.bin new file mode 100644 index 0000000..a3d6c5e Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/Debug/aes_gcm_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/Debug/aes_gcm_encrypt.out b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/Debug/aes_gcm_encrypt.out new file mode 100644 index 0000000..71a0552 Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/Debug/aes_gcm_encrypt.out differ diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/macros.ini_initial b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/target_config.ccxml b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/ewarm/Exe/aes_gcm_encrypt.bin b/boards/dk-tm4c129x/aes_gcm_encrypt/ewarm/Exe/aes_gcm_encrypt.bin new file mode 100644 index 0000000..95c93bb Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_encrypt/ewarm/Exe/aes_gcm_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/ewarm/Exe/aes_gcm_encrypt.out b/boards/dk-tm4c129x/aes_gcm_encrypt/ewarm/Exe/aes_gcm_encrypt.out new file mode 100644 index 0000000..b341535 Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_encrypt/ewarm/Exe/aes_gcm_encrypt.out differ diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/gcc/aes_gcm_encrypt.axf b/boards/dk-tm4c129x/aes_gcm_encrypt/gcc/aes_gcm_encrypt.axf new file mode 100644 index 0000000..3cc174d Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_encrypt/gcc/aes_gcm_encrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/gcc/aes_gcm_encrypt.bin b/boards/dk-tm4c129x/aes_gcm_encrypt/gcc/aes_gcm_encrypt.bin new file mode 100644 index 0000000..e73cdb5 Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_encrypt/gcc/aes_gcm_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/readme.txt b/boards/dk-tm4c129x/aes_gcm_encrypt/readme.txt new file mode 100644 index 0000000..1e86e33 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/readme.txt @@ -0,0 +1,28 @@ +AES128 and AES256 GCM Encryption Demo + +Simple demo showing authenticated encryption operations using the AES +module in GCM mode. The test vectors are from the gcm_revised_spec.pdf +document. + +Please note that the use of interrupts and uDMA is not required for the +operation of the module. It is only done for demonstration purposes. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/rvmdk/aes_gcm_encrypt.axf b/boards/dk-tm4c129x/aes_gcm_encrypt/rvmdk/aes_gcm_encrypt.axf new file mode 100644 index 0000000..8285118 Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_encrypt/rvmdk/aes_gcm_encrypt.axf differ diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/rvmdk/aes_gcm_encrypt.bin b/boards/dk-tm4c129x/aes_gcm_encrypt/rvmdk/aes_gcm_encrypt.bin new file mode 100644 index 0000000..5e38683 Binary files /dev/null and b/boards/dk-tm4c129x/aes_gcm_encrypt/rvmdk/aes_gcm_encrypt.bin differ diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/startup_ccs.c b/boards/dk-tm4c129x/aes_gcm_encrypt/startup_ccs.c new file mode 100644 index 0000000..882868b --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/startup_ewarm.c b/boards/dk-tm4c129x/aes_gcm_encrypt/startup_ewarm.c new file mode 100644 index 0000000..b08ccba --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/startup_gcc.c b/boards/dk-tm4c129x/aes_gcm_encrypt/startup_gcc.c new file mode 100644 index 0000000..f1c5730 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void AESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + AESIntHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/aes_gcm_encrypt/startup_rvmdk.S b/boards/dk-tm4c129x/aes_gcm_encrypt/startup_rvmdk.S new file mode 100644 index 0000000..558dc08 --- /dev/null +++ b/boards/dk-tm4c129x/aes_gcm_encrypt/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN AESIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD AESIntHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/bitband/Makefile b/boards/dk-tm4c129x/bitband/Makefile new file mode 100644 index 0000000..64a06f7 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the bitband example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the bitband example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/bitband.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the bitband example. +# +${COMPILER}/bitband.axf: ${COMPILER}/bitband.o +${COMPILER}/bitband.axf: ${COMPILER}/frame.o +${COMPILER}/bitband.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/bitband.axf: ${COMPILER}/pinout.o +${COMPILER}/bitband.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/bitband.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/bitband.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/bitband.axf: bitband.ld +SCATTERgcc_bitband=bitband.ld +ENTRY_bitband=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/bitband/bitband.c b/boards/dk-tm4c129x/bitband/bitband.c new file mode 100644 index 0000000..d8bb836 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/bitband.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// bitband.c - Bit-band manipulation example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Bit-Banding (bitband)

+//! +//! This example application demonstrates the use of the bit-banding +//! capabilities of the Cortex-M4 microprocessor. All of SRAM and all of the +//! peripherals reside within bit-band regions, meaning that bit-banding +//! operations can be applied to any of them. In this example, a variable in +//! SRAM is set to a particular value one bit at a time using bit-banding +//! operations (it would be more efficient to do a single non-bit-banded write; +//! this simply demonstrates the operation of bit-banding). +// +//***************************************************************************** + +//***************************************************************************** +// +// A map of hex nibbles to ASCII characters. +// +//***************************************************************************** +static const char * const pcHex = "0123456789ABCDEF"; + +//***************************************************************************** +// +// The value that is to be modified via bit-banding. +// +//***************************************************************************** +static volatile uint32_t g_ui32Value; + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Delay for the specified number of seconds. Depending upon the current +// SysTick value, the delay will be between N-1 and N seconds (i.e. N-1 full +// seconds are guaranteed, along with the remainder of the current second). +// +//***************************************************************************** +void +Delay(uint32_t ui32Seconds) +{ + // + // Loop while there are more seconds to wait. + // + while(ui32Seconds--) + { + // + // Wait until the SysTick value is less than 1000. + // + while(ROM_SysTickValueGet() > 1000) + { + } + + // + // Wait until the SysTick value is greater than 1000. + // + while(ROM_SysTickValueGet() < 1000) + { + } + } +} + +//***************************************************************************** +// +// Print the given value as a hexadecimal string on the display. +// +//***************************************************************************** +void +PrintValue(uint32_t ui32Value) +{ + char pcBuffer[9]; + + pcBuffer[0] = pcHex[(ui32Value >> 28) & 15]; + pcBuffer[1] = pcHex[(ui32Value >> 24) & 15]; + pcBuffer[2] = pcHex[(ui32Value >> 20) & 15]; + pcBuffer[3] = pcHex[(ui32Value >> 16) & 15]; + pcBuffer[4] = pcHex[(ui32Value >> 12) & 15]; + pcBuffer[5] = pcHex[(ui32Value >> 8) & 15]; + pcBuffer[6] = pcHex[(ui32Value >> 4) & 15]; + pcBuffer[7] = pcHex[(ui32Value >> 0) & 15]; + pcBuffer[8] = '\0'; + + GrStringDrawCentered(&g_sContext, pcBuffer, -1, + GrContextDpyWidthGet(&g_sContext) / 2, 120, 1); +} + +//***************************************************************************** +// +// This example demonstrates the use of bit-banding to set individual bits +// within a word of SRAM. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock; + uint32_t ui32Errors, ui32Idx; + + // + // Set the system clock to run at 16MHz from the PLL. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 16000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "bitband"); + + // + // Set up and enable the SysTick timer. It will be used as a reference + // for delay loops. The SysTick timer period will be set up for one + // second. + // + ROM_SysTickPeriodSet(ui32SysClock); + ROM_SysTickEnable(); + + // + // Set the value and error count to zero. + // + g_ui32Value = 0; + ui32Errors = 0; + + // + // Print the initial value to the display. + // + PrintValue(g_ui32Value); + + // + // Delay for 1 second. + // + Delay(1); + + // + // Set the value to 0xdecafbad using bit band accesses to each individual + // bit. + // + for(ui32Idx = 0; ui32Idx < 32; ui32Idx++) + { + // + // Set this bit. + // + HWREGBITW(&g_ui32Value, 31 - ui32Idx) = + (0xdecafbad >> (31 - ui32Idx)) & 1; + + // + // Print the current value to the display. + // + PrintValue(g_ui32Value); + + // + // Delay for 1 second. + // + Delay(1); + } + + // + // Make sure that the value is 0xdecafbad. + // + if(g_ui32Value != 0xdecafbad) + { + ui32Errors++; + } + + // + // Make sure that the individual bits read back correctly. + // + for(ui32Idx = 0; ui32Idx < 32; ui32Idx++) + { + if(HWREGBITW(&g_ui32Value, ui32Idx) != ((0xdecafbad >> ui32Idx) & 1)) + { + ui32Errors++; + } + } + + // + // Delay for 2 seconds. + // + Delay(2); + + // + // Print out the result. + // + if(ui32Errors) + { + GrStringDrawCentered(&g_sContext, "Errors!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 180, 0); + } + else + { + GrStringDrawCentered(&g_sContext, "Success!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 180, 0); + } + + // + // Flush any cached drawing operations. + // + GrFlush(&g_sContext); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/bitband/bitband.ewd b/boards/dk-tm4c129x/bitband/bitband.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/bitband/bitband.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/bitband/bitband.ewp b/boards/dk-tm4c129x/bitband/bitband.ewp new file mode 100644 index 0000000..0ff6e90 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/bitband.ewp @@ -0,0 +1,798 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\bitband.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/dk-tm4c129x/bitband/bitband.icf b/boards/dk-tm4c129x/bitband/bitband.icf new file mode 100644 index 0000000..f3a3677 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/bitband.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// bitband.icf - Linker configuration file for bitband. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/bitband/bitband.ld b/boards/dk-tm4c129x/bitband/bitband.ld new file mode 100644 index 0000000..b03aca6 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/bitband.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * bitband.ld - Linker configuration file for bitband. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/bitband/bitband.sct b/boards/dk-tm4c129x/bitband/bitband.sct new file mode 100644 index 0000000..5226c5d --- /dev/null +++ b/boards/dk-tm4c129x/bitband/bitband.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; bitband.sct - Linker configuration file for bitband. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/bitband/bitband.uvopt b/boards/dk-tm4c129x/bitband/bitband.uvopt new file mode 100644 index 0000000..3081f43 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/bitband.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + bitband + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\bitband.c + bitband.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/bitband/bitband.uvproj b/boards/dk-tm4c129x/bitband/bitband.uvproj new file mode 100644 index 0000000..b584201 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/bitband.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + bitband + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + bitband + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\bitband.bin .\rvmdk\bitband.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + bitband.sct + + + --entry Reset_Handler + + + + + + + + Source + + + bitband.c + 1 + .\bitband.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/bitband/bitband_ccs.cmd b/boards/dk-tm4c129x/bitband/bitband_ccs.cmd new file mode 100644 index 0000000..38228cd --- /dev/null +++ b/boards/dk-tm4c129x/bitband/bitband_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * bitband_ccs.cmd - CCS linker configuration file for bitband. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c129x/bitband/ccs/.ccsimportspec b/boards/dk-tm4c129x/bitband/ccs/.ccsimportspec new file mode 100644 index 0000000..9748e3c --- /dev/null +++ b/boards/dk-tm4c129x/bitband/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/bitband/ccs/.ccsproject b/boards/dk-tm4c129x/bitband/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/bitband/ccs/.cproject b/boards/dk-tm4c129x/bitband/ccs/.cproject new file mode 100644 index 0000000..85bdb34 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/bitband/ccs/.project b/boards/dk-tm4c129x/bitband/ccs/.project new file mode 100644 index 0000000..329881f --- /dev/null +++ b/boards/dk-tm4c129x/bitband/ccs/.project @@ -0,0 +1,65 @@ + + + bitband + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + bitband.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/bitband/bitband.c + + + bitband_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/bitband/bitband_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/bitband/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/bitband/ccs/Debug/bitband.bin b/boards/dk-tm4c129x/bitband/ccs/Debug/bitband.bin new file mode 100644 index 0000000..086c6f6 Binary files /dev/null and b/boards/dk-tm4c129x/bitband/ccs/Debug/bitband.bin differ diff --git a/boards/dk-tm4c129x/bitband/ccs/Debug/bitband.out b/boards/dk-tm4c129x/bitband/ccs/Debug/bitband.out new file mode 100644 index 0000000..48f8cbf Binary files /dev/null and b/boards/dk-tm4c129x/bitband/ccs/Debug/bitband.out differ diff --git a/boards/dk-tm4c129x/bitband/ccs/macros.ini_initial b/boards/dk-tm4c129x/bitband/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/bitband/ccs/target_config.ccxml b/boards/dk-tm4c129x/bitband/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/bitband/ewarm/Exe/bitband.bin b/boards/dk-tm4c129x/bitband/ewarm/Exe/bitband.bin new file mode 100644 index 0000000..d31405a Binary files /dev/null and b/boards/dk-tm4c129x/bitband/ewarm/Exe/bitband.bin differ diff --git a/boards/dk-tm4c129x/bitband/ewarm/Exe/bitband.out b/boards/dk-tm4c129x/bitband/ewarm/Exe/bitband.out new file mode 100644 index 0000000..1972fc0 Binary files /dev/null and b/boards/dk-tm4c129x/bitband/ewarm/Exe/bitband.out differ diff --git a/boards/dk-tm4c129x/bitband/gcc/bitband.axf b/boards/dk-tm4c129x/bitband/gcc/bitband.axf new file mode 100644 index 0000000..e3528df Binary files /dev/null and b/boards/dk-tm4c129x/bitband/gcc/bitband.axf differ diff --git a/boards/dk-tm4c129x/bitband/gcc/bitband.bin b/boards/dk-tm4c129x/bitband/gcc/bitband.bin new file mode 100644 index 0000000..1eed900 Binary files /dev/null and b/boards/dk-tm4c129x/bitband/gcc/bitband.bin differ diff --git a/boards/dk-tm4c129x/bitband/readme.txt b/boards/dk-tm4c129x/bitband/readme.txt new file mode 100644 index 0000000..4c01f2c --- /dev/null +++ b/boards/dk-tm4c129x/bitband/readme.txt @@ -0,0 +1,29 @@ +Bit-Banding + +This example application demonstrates the use of the bit-banding +capabilities of the Cortex-M4 microprocessor. All of SRAM and all of the +peripherals reside within bit-band regions, meaning that bit-banding +operations can be applied to any of them. In this example, a variable in +SRAM is set to a particular value one bit at a time using bit-banding +operations (it would be more efficient to do a single non-bit-banded write; +this simply demonstrates the operation of bit-banding). + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/bitband/rvmdk/bitband.axf b/boards/dk-tm4c129x/bitband/rvmdk/bitband.axf new file mode 100644 index 0000000..59cfe1a Binary files /dev/null and b/boards/dk-tm4c129x/bitband/rvmdk/bitband.axf differ diff --git a/boards/dk-tm4c129x/bitband/rvmdk/bitband.bin b/boards/dk-tm4c129x/bitband/rvmdk/bitband.bin new file mode 100644 index 0000000..0da3d71 Binary files /dev/null and b/boards/dk-tm4c129x/bitband/rvmdk/bitband.bin differ diff --git a/boards/dk-tm4c129x/bitband/startup_ccs.c b/boards/dk-tm4c129x/bitband/startup_ccs.c new file mode 100644 index 0000000..a769216 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/startup_ccs.c @@ -0,0 +1,268 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/bitband/startup_ewarm.c b/boards/dk-tm4c129x/bitband/startup_ewarm.c new file mode 100644 index 0000000..cf3864b --- /dev/null +++ b/boards/dk-tm4c129x/bitband/startup_ewarm.c @@ -0,0 +1,299 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/bitband/startup_gcc.c b/boards/dk-tm4c129x/bitband/startup_gcc.c new file mode 100644 index 0000000..00771a6 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/startup_gcc.c @@ -0,0 +1,315 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/bitband/startup_rvmdk.S b/boards/dk-tm4c129x/bitband/startup_rvmdk.S new file mode 100644 index 0000000..f07ac83 --- /dev/null +++ b/boards/dk-tm4c129x/bitband/startup_rvmdk.S @@ -0,0 +1,324 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/ble_btool/Makefile b/boards/dk-tm4c129x/ble_btool/Makefile new file mode 100644 index 0000000..ac43935 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the ble btool example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the ble btool example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/ble_btool.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the ble btool example. +# +${COMPILER}/ble_btool.axf: ${COMPILER}/ble_btool.o +${COMPILER}/ble_btool.axf: ${COMPILER}/frame.o +${COMPILER}/ble_btool.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/ble_btool.axf: ${COMPILER}/pinout.o +${COMPILER}/ble_btool.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/ble_btool.axf: ${COMPILER}/uartstdio.o +${COMPILER}/ble_btool.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/ble_btool.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/ble_btool.axf: ble_btool.ld +SCATTERgcc_ble_btool=ble_btool.ld +ENTRY_ble_btool=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/ble_btool/ble_btool.c b/boards/dk-tm4c129x/ble_btool/ble_btool.c new file mode 100644 index 0000000..88eb86b --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ble_btool.c @@ -0,0 +1,283 @@ +//***************************************************************************** +// +// ble_btool.c - This simple program makes it possible to use BTool +// to control a BLE device with TM4c129X + CC2540/CC2541EM +// as host board. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/pin_map.h" +#include "grlib/grlib.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/frame.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Bluetooth Low Energy ``BTool'' (ble_btool)

+//! +//! This application connects the ICDI virtual UART0 with UART3, so that +//! the BTool application running on PC can control the CC2540/CC2541 through +//! the TM4C129X. +//! +//! The CC254X device should be programmed with HostTestRelease(Network +//! Processor) application. A hex file containing this application can be +//! found in the BLE stack 1.4.0 release under +//! C:\\...\\BLE-CC254x-1.4.0\\Accessories\\HexFiles\\ +//! CC254X_SmartRF_HostTestRelease_All.hex. Please refer to the Bluetooth Low +//! Energy CC254X Development Kit User's Guide for information on how to load +//! the hex file to the CC254X. This User's Guide can be found in +//! http://www.ti.com/lit/ug/swru301a/swru301a.pdf +//! +//! On the TM4C129X development board, make sure that jumpers PJ0 and PJ1 +//! are connected to the "EM_UART" side to ensure that the UART3 TX and RX +//! signals are routed to the EM header. UART3 is used to communicate between +//! the TM4C129X and the CC2540 device. +//! +//! BTool is a PC application that allows a user to form a connection between +//! two BLE devices. For more details on BTool, please refer to the above +//! User's Guide. The installer for BTool is included in the BLE stack 1.4.0 +//! release under C:\\...\\BLE-CC254x-1.4.0\\Accessories\\BTool\\ +//! +// +//***************************************************************************** + +// +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The UART0 interrupt handler. +// +//***************************************************************************** +void +UART0IntHandler(void) +{ + uint32_t ui32Status; + + // + // Get the interrrupt status. + // + ui32Status = ROM_UARTIntStatus(UART0_BASE, true); + + // + // Clear the asserted interrupts. + // + ROM_UARTIntClear(UART0_BASE, ui32Status); + + // + // Loop while there are characters in the receive FIFO. + // + while(ROM_UARTCharsAvail(UART0_BASE)) + { + // + // Read the next character from UART0 and sent it to UART3. + // + UARTCharPut(UART3_BASE, UARTCharGetNonBlocking(UART0_BASE)); + } +} + +//***************************************************************************** +// +// The UART3 interrupt handler. +// +//***************************************************************************** +void +UART3IntHandler(void) +{ + uint32_t ui32Status; + + // + // Get the interrrupt status. + // + ui32Status = ROM_UARTIntStatus(UART3_BASE, true); + + // + // Clear the asserted interrupts. + // + ROM_UARTIntClear(UART3_BASE, ui32Status); + + // + // Loop while there are characters in the receive FIFO. + // + while(ROM_UARTCharsAvail(UART3_BASE)) + { + // + // Read the next character from UART3 and send it to UART0. + // + ROM_UARTCharPutNonBlocking(UART0_BASE, UARTCharGetNonBlocking(UART3_BASE)); + } +} + +//***************************************************************************** +// +// Send a string(HCI command) to the UART3. +// +//***************************************************************************** +void +UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count) +{ + // + // Loop while there are more characters to send. + // + while(ui32Count--) + { + // + // Write the next character to the UART. + // + ROM_UARTCharPutNonBlocking(UART3_BASE, *pui8Buffer++); + } +} + +//***************************************************************************** +// +// This example demonstrates how to send a string of data to the UART. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | + SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "ble-btool"); + + // + // PJ0, 1, 4, 5 are used for UART3. + // + ROM_GPIOPinConfigure(GPIO_PJ0_U3RX); + ROM_GPIOPinConfigure(GPIO_PJ1_U3TX); + ROM_GPIOPinConfigure(GPIO_PJ4_U3RTS); + ROM_GPIOPinConfigure(GPIO_PJ5_U3CTS); + ROM_GPIOPinTypeUART(GPIO_PORTJ_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5); + + // + // Display UART configuration on the display. + // + GrStringDraw(&sContext, "Use BTool on PC", -1, 70, 40, 0); + GrStringDraw(&sContext, "Port:", -1, 70, 70, 0); + GrStringDraw(&sContext, "Baud:", -1, 70, 95, 0); + GrStringDraw(&sContext, "Data:", -1, 70, 120, 0); + GrStringDraw(&sContext, "Parity:", -1, 70, 145, 0); + GrStringDraw(&sContext, "Stop:", -1, 70, 170, 0); + GrStringDraw(&sContext, "Flow:", -1, 70, 195, 0); + GrStringDraw(&sContext, "Uart 0", -1, 150, 70, 0); + GrStringDraw(&sContext, "115,200 bps", -1, 150, 95, 0); + GrStringDraw(&sContext, "8 Bit", -1, 150, 120, 0); + GrStringDraw(&sContext, "None", -1, 150, 145, 0); + GrStringDraw(&sContext, "1 Bit", -1, 150, 170, 0); + GrStringDraw(&sContext, "CTS/RTS", -1, 150, 195, 0); + + // + // Enable the (non-GPIO) peripherals used by this example. PinoutSet() + // already enabled GPIO Port A. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART3); + + // + // Enable processor interrupts. + // + IntMasterEnable(); + + // + // Configure the UART0 for 115,200, 8-N-1 operation. + // + ROM_UARTConfigSetExpClk(UART0_BASE, ui32SysClock, 115200, + (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | + UART_CONFIG_PAR_NONE)); + + // + // Configure the UART3 for 115,200, 8-N-1 operation. + // + ROM_UARTConfigSetExpClk(UART3_BASE, ui32SysClock, 115200, + (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | + UART_CONFIG_PAR_NONE)); + + // + // Configure the UART3 with flow control. + // + UARTFlowControlSet(UART3_BASE, UART_FLOWCONTROL_TX | UART_FLOWCONTROL_RX); + + // + // Enable the UART interrupt. + // + ROM_IntEnable(INT_UART0); + ROM_IntEnable(INT_UART3); + ROM_UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT); + ROM_UARTIntEnable(UART3_BASE, UART_INT_RX | UART_INT_RT); + + // + // Loop forever passing data between UART0 and UART3. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/ble_btool/ble_btool.ewd b/boards/dk-tm4c129x/ble_btool/ble_btool.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ble_btool.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/ble_btool/ble_btool.ewp b/boards/dk-tm4c129x/ble_btool/ble_btool.ewp new file mode 100644 index 0000000..4fc7748 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ble_btool.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\ble_btool.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/ble_btool/ble_btool.icf b/boards/dk-tm4c129x/ble_btool/ble_btool.icf new file mode 100644 index 0000000..076e971 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ble_btool.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// ble_btool.icf - Linker configuration file for ble_btool. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/ble_btool/ble_btool.ld b/boards/dk-tm4c129x/ble_btool/ble_btool.ld new file mode 100644 index 0000000..ed5ceed --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ble_btool.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * ble_btool.ld - Linker configuration file for ble_btool. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/ble_btool/ble_btool.sct b/boards/dk-tm4c129x/ble_btool/ble_btool.sct new file mode 100644 index 0000000..18fbac9 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ble_btool.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; ble_btool.sct - Linker configuration file for ble_btool. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/ble_btool/ble_btool.uvopt b/boards/dk-tm4c129x/ble_btool/ble_btool.uvopt new file mode 100644 index 0000000..7ac466a --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ble_btool.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ble_btool + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\ble_btool.c + ble_btool.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/ble_btool/ble_btool.uvproj b/boards/dk-tm4c129x/ble_btool/ble_btool.uvproj new file mode 100644 index 0000000..b2cb8c7 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ble_btool.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ble_btool + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + ble_btool + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\ble_btool.bin .\rvmdk\ble_btool.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + ble_btool.sct + + + --entry Reset_Handler + + + + + + + + Source + + + ble_btool.c + 1 + .\ble_btool.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/ble_btool/ble_btool_ccs.cmd b/boards/dk-tm4c129x/ble_btool/ble_btool_ccs.cmd new file mode 100644 index 0000000..5087ad0 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ble_btool_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * ble_btool_ccs.cmd - CCS linker configuration file for ble_btool. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/ble_btool/ccs/.ccsimportspec b/boards/dk-tm4c129x/ble_btool/ccs/.ccsimportspec new file mode 100644 index 0000000..5de4d9a --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/ble_btool/ccs/.ccsproject b/boards/dk-tm4c129x/ble_btool/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/ble_btool/ccs/.cproject b/boards/dk-tm4c129x/ble_btool/ccs/.cproject new file mode 100644 index 0000000..43f3443 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/ble_btool/ccs/.project b/boards/dk-tm4c129x/ble_btool/ccs/.project new file mode 100644 index 0000000..a6d1afa --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ccs/.project @@ -0,0 +1,70 @@ + + + ble_btool + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + ble_btool.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/ble_btool/ble_btool.c + + + ble_btool_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/ble_btool/ble_btool_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/ble_btool/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/ble_btool/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/ble_btool/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/ble_btool/ccs/Debug/ble_btool.bin b/boards/dk-tm4c129x/ble_btool/ccs/Debug/ble_btool.bin new file mode 100644 index 0000000..7447c97 Binary files /dev/null and b/boards/dk-tm4c129x/ble_btool/ccs/Debug/ble_btool.bin differ diff --git a/boards/dk-tm4c129x/ble_btool/ccs/Debug/ble_btool.out b/boards/dk-tm4c129x/ble_btool/ccs/Debug/ble_btool.out new file mode 100644 index 0000000..d112f77 Binary files /dev/null and b/boards/dk-tm4c129x/ble_btool/ccs/Debug/ble_btool.out differ diff --git a/boards/dk-tm4c129x/ble_btool/ccs/macros.ini_initial b/boards/dk-tm4c129x/ble_btool/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/ble_btool/ccs/target_config.ccxml b/boards/dk-tm4c129x/ble_btool/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/ble_btool/ewarm/Exe/ble_btool.bin b/boards/dk-tm4c129x/ble_btool/ewarm/Exe/ble_btool.bin new file mode 100644 index 0000000..46ce5a6 Binary files /dev/null and b/boards/dk-tm4c129x/ble_btool/ewarm/Exe/ble_btool.bin differ diff --git a/boards/dk-tm4c129x/ble_btool/ewarm/Exe/ble_btool.out b/boards/dk-tm4c129x/ble_btool/ewarm/Exe/ble_btool.out new file mode 100644 index 0000000..9246d82 Binary files /dev/null and b/boards/dk-tm4c129x/ble_btool/ewarm/Exe/ble_btool.out differ diff --git a/boards/dk-tm4c129x/ble_btool/gcc/ble_btool.axf b/boards/dk-tm4c129x/ble_btool/gcc/ble_btool.axf new file mode 100644 index 0000000..e3b0f00 Binary files /dev/null and b/boards/dk-tm4c129x/ble_btool/gcc/ble_btool.axf differ diff --git a/boards/dk-tm4c129x/ble_btool/gcc/ble_btool.bin b/boards/dk-tm4c129x/ble_btool/gcc/ble_btool.bin new file mode 100644 index 0000000..d7460bf Binary files /dev/null and b/boards/dk-tm4c129x/ble_btool/gcc/ble_btool.bin differ diff --git a/boards/dk-tm4c129x/ble_btool/readme.txt b/boards/dk-tm4c129x/ble_btool/readme.txt new file mode 100644 index 0000000..c19917d --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/readme.txt @@ -0,0 +1,45 @@ +Bluetooth Low Energy ``BTool'' + +This application connects the ICDI virtual UART0 with UART3, so that +the BTool application running on PC can control the CC2540/CC2541 through +the TM4C129X. + +The CC254X device should be programmed with HostTestRelease(Network +Processor) application. A hex file containing this application can be +found in the BLE stack 1.4.0 release under +C:\\...\\BLE-CC254x-1.4.0\\Accessories\\HexFiles\\ +CC254X_SmartRF_HostTestRelease_All.hex. Please refer to the Bluetooth Low +Energy CC254X Development Kit User's Guide for information on how to load +the hex file to the CC254X. This User's Guide can be found in +http://www.ti.com/lit/ug/swru301a/swru301a.pdf + +On the TM4C129X development board, make sure that jumpers PJ0 and PJ1 +are connected to the "EM_UART" side to ensure that the UART3 TX and RX +signals are routed to the EM header. UART3 is used to communicate between +the TM4C129X and the CC2540 device. + +BTool is a PC application that allows a user to form a connection between +two BLE devices. For more details on BTool, please refer to the above +User's Guide. The installer for BTool is included in the BLE stack 1.4.0 +release under C:\\...\\BLE-CC254x-1.4.0\\Accessories\\BTool\\ + + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/ble_btool/rvmdk/ble_btool.axf b/boards/dk-tm4c129x/ble_btool/rvmdk/ble_btool.axf new file mode 100644 index 0000000..9fa577f Binary files /dev/null and b/boards/dk-tm4c129x/ble_btool/rvmdk/ble_btool.axf differ diff --git a/boards/dk-tm4c129x/ble_btool/rvmdk/ble_btool.bin b/boards/dk-tm4c129x/ble_btool/rvmdk/ble_btool.bin new file mode 100644 index 0000000..2699b94 Binary files /dev/null and b/boards/dk-tm4c129x/ble_btool/rvmdk/ble_btool.bin differ diff --git a/boards/dk-tm4c129x/ble_btool/startup_ccs.c b/boards/dk-tm4c129x/ble_btool/startup_ccs.c new file mode 100644 index 0000000..2450e1b --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void UART0IntHandler(void); +extern void UART3IntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + UART3IntHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/ble_btool/startup_ewarm.c b/boards/dk-tm4c129x/ble_btool/startup_ewarm.c new file mode 100644 index 0000000..a83b907 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void UART0IntHandler(void); +extern void UART3IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + UART3IntHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/ble_btool/startup_gcc.c b/boards/dk-tm4c129x/ble_btool/startup_gcc.c new file mode 100644 index 0000000..1e703e8 --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void UART0IntHandler(void); +extern void UART3IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + UART3IntHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/ble_btool/startup_rvmdk.S b/boards/dk-tm4c129x/ble_btool/startup_rvmdk.S new file mode 100644 index 0000000..6b4ee6b --- /dev/null +++ b/boards/dk-tm4c129x/ble_btool/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN UART0IntHandler + EXTERN UART3IntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UART0IntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD UART3IntHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/ble_central/Makefile b/boards/dk-tm4c129x/ble_central/Makefile new file mode 100644 index 0000000..600c267 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/Makefile @@ -0,0 +1,94 @@ +#****************************************************************************** +# +# Makefile - Rules for building the ble central example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the ble central example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/ble_central.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the ble central example. +# +${COMPILER}/ble_central.axf: ${COMPILER}/ble_central.o +${COMPILER}/ble_central.axf: ${COMPILER}/frame.o +${COMPILER}/ble_central.axf: ${COMPILER}/gap.o +${COMPILER}/ble_central.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/ble_central.axf: ${COMPILER}/pinout.o +${COMPILER}/ble_central.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/ble_central.axf: ${COMPILER}/touch.o +${COMPILER}/ble_central.axf: ${COMPILER}/uartstdio.o +${COMPILER}/ble_central.axf: ${COMPILER}/ustdlib.o +${COMPILER}/ble_central.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/ble_central.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/ble_central.axf: ble_central.ld +SCATTERgcc_ble_central=ble_central.ld +ENTRY_ble_central=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/ble_central/ble_central.c b/boards/dk-tm4c129x/ble_central/ble_central.c new file mode 100644 index 0000000..3d8b695 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ble_central.c @@ -0,0 +1,2551 @@ +//***************************************************************************** +// +// ble_central.c - Demonstration of BLE central device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/pin_map.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/frame.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "hci.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

BLE Central Device Demonstration (ble_central)

+//! +//! This application provides a demonstration use of Bluetooth Low Energy +//! central device by utilizing TI’s BLE CC2540 Evaluation Module and +//! SesorTags. +//! +//! By connecting a CC2540 EM board to the EM header on the TM4C129X development +//! board, the TM4C129X can communicate with the CC2540 by means of +//! vendor-specific HCI commands using the UART interface. This application can +//! discover up to three SensorTag devices, it can connect to any one of them, +//! perform pairing and bonding, read some sensor data and RSSI data from the +//! slave, and display the information on the LCD display. +//! +//! This application can discover any BLE device although it may not be +//! able to make a connection to a device other than a SensorTag/CC2540 as the +//! bonding process will likely fail due to the use of a default passcode. +//! We have tested this application with SensorTag and CC2540 Development +//! boards (SmartRF05EB + CC2540 EM) with the SimpleBLEPeripheral +//! sample application programmed. It can successfully bond with both boards +//! since the same default passcode is expected. Both SensorTag and CC2540 +//! devices have BLE Stack 1.4.0 release code programmed. +//! +//! CC2540 device should be programmed with the HostTestRelease +//! (Network Processor) application. A hex file containing the this application +//! can be found in the BLE stack 1.4.0 release under +//! C:\\...\\BLE-CC254x-1.4.0\\Accessories\\HexFiles\\ +//! CC2540_SmartRF_HostTestRelease_All.hex. Please refer to the Bluetooth Low +//! Energy CC2540 Development Kit User's Guide for information on how to load +//! the hex file to the CC2540. This User's Guide can be found in +//! http://www.ti.com/lit/ug/swru301a/swru301a.pdf +//! +//! On the TM4C129X development board, make sure that jumpers PJ0 and PJ1 +//! are connected to the "EM_UART" side which allows UART3 TX and RX signals to +//! be routed to the EM header. UART3 is used as the communication channel +//! between the CC2540 device and the TM4C129X device. +//! +//! Once the application starts, it will verify the serial connection by +//! sending the CC2540 device a vendor-specific HCI command, and waiting for the +//! expected responses within a short time period. Once the physical connection +//! between TM4C129X and CC2540 is verified, the device will automatically +//! start to discover BLE peripheral device. If no devices are found within 20 +//! seconds, the application will timeout and display "No Device Found", +//! otherwise the discovered device names will be shown on the display. +//! Touching any of the device names will start the process of establishing a +//! connection with that device. This sample application always tries to make +//! a secure connection by pairing the device with default passcode "00000". +//! Upon successfully linking and pairing, application will start querying +//! sensor data, including IR temperature, ambient temperature, humidity and +//! RSSI. +//! +//! Whe run inside, IR and ambient temperature should typically be in the low +//! 20s (Celsius). You can place the SensorTag near a hot object (such as a +//! cup of coffee) to verify that the IR temperature increases. You can move +//! the SensorTag further from the TM4C129X development board to verify that +//! its RSSI reading will decrease. +//! +//! At any time after the connection is established, you can touch the +//! "disconnect" button on the bottom of the screen to terminate the +//! connection with the peripheral device. +//! +//! In order to make the SensorTag discoverable by a central device, the +//! SensorTag needs to be in the discovery mode. The LED in the middle of the +//! board will blink periodically if the SensorTag is in discovery mode. If the +//! LED is not blinking, pressing the side button on the SensorTag should +//! place it in discovery mode. Once it is connected to a central device, +//! the LED should be off, pressing the side button while it is connected will +//! terminate the connection and put the SensorTag in discovery mode again. +//! For more information on SensorTag, please visit +//! http://processors.wiki.ti.com/index.php/Bluetooth_SensorTag +//! +//! Every HCI command and event are output to the UART console for +//! debugging purpose. The UART terminal should be configured in 115,200 baud, +//! 8-n-1 mode. +//! +// +//***************************************************************************** + + +//***************************************************************************** +// +// A set of flags. The flag bits are defined as follows: +// +// 0 -> An indicator that a second has occurred. +// 1 -> A complete RX Packet has been received. +// 2 -> Whether to draw a circle or not on the display. +// 3 -> Sensors on the SensorTag are configured or not. +// +//***************************************************************************** +#define FLAG_EVERY_SECOND 0 +#define FLAG_HCI_MSG_COMPLETE 1 +#define FLAG_DRAW_CIRCLE 2 +#define FLAG_SENSOR_CFGD 3 +static volatile uint32_t g_ui32Flags; + +//***************************************************************************** +// +// A system tick counter, incremented every SYSTICKMS. +// +//***************************************************************************** +volatile uint32_t g_ui32TickCounter = 0; + +//***************************************************************************** +// +// The delay count for timeout. It decrements to 1 to indicate timeout. Setting +// it to 0 means no timeout has been set. +// +//***************************************************************************** +volatile uint32_t g_ui32Delay; + +//***************************************************************************** +// +// The application's graphics context. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Flag that informs that the user has requested an action via GUI. +// +//***************************************************************************** +static volatile bool g_bDiscoveryReq = false; +static volatile bool g_bEstLinkReq = false; +static volatile bool g_bTermLinkReq = false; + +//***************************************************************************** +// +// Flag to enable pairing, change to false to diable the pairing. +// +//***************************************************************************** +static bool g_bInitPairReq = true; + +//***************************************************************************** +// +// The width and height of the LCD display +// +//***************************************************************************** +uint32_t g_ui32Width, g_ui32Height; + +//***************************************************************************** +// +// The screen offset of the upper left hand corner where we start to draw. +// +//***************************************************************************** +#define X_OFFSET 8 +#define Y_OFFSET 24 + + +//***************************************************************************** +// +// The maximum number of slaves that we can discover. +// +//***************************************************************************** +#define MAX_SLAVE_NUM 3 + +//***************************************************************************** +// +// The RX receive circular buffer size. +// +//***************************************************************************** +#define BUF_SIZE 128 + + +//***************************************************************************** +// +// The circular buffer used to store the received HCI message from the CC2540. +// +//***************************************************************************** +typedef struct +{ + volatile uint8_t pui8RXBuf[BUF_SIZE]; + volatile uint8_t ui8Rd; + volatile uint8_t ui8Wr; + volatile uint8_t ui8Count; +} tCirBuf; + +tCirBuf g_sRxBuf; + +//***************************************************************************** +// +// The state defination of BLE statemachine. +// +//***************************************************************************** +volatile enum +{ + STATE_DEV_INIT, + STATE_GET_PARAM, + STATE_START_DISCOVERY, + STATE_SET_PARAM, + STATE_READY_FOR_LINK_REQ, + STATE_LINK, + STATE_LINKED, + STATE_SEND_PASSKEY, + STATE_IDLE, + STATE_TERM, + STATE_TERMED, + STATE_ERROR, +}g_iState = STATE_IDLE; + +//***************************************************************************** +// +// The paramers of the central device. +// +//***************************************************************************** +uint16_t g_ui16Param[4]; +uint8_t g_ui8ParamWrIdx = 0; + +//***************************************************************************** +// +// The complete HCI message and its length that we have received from BLE +// stack. +// +//***************************************************************************** +uint8_t g_pui8Msg[200]; +uint8_t g_ui8MsgLen; + +//***************************************************************************** +// +// Received Signal Strength Indication(RSSI). +// +//***************************************************************************** +int8_t g_i8RSSI = 0; + +//***************************************************************************** +// +// Sensor data, IR temperature, humidity etc. Only available on SensorTag +// +//***************************************************************************** +uint8_t g_pui8IRTemp[4]; // RAW data +uint8_t g_pui8Humidity[4]; // RAW data +double g_dIRTemp = 0; +double g_dAmbTemp = 0; +double g_dHumidity = 0; + +//***************************************************************************** +// +// The HCI message information, used for verifying expected response from +// stack. +// +//***************************************************************************** +uint16_t g_ui16CmdStatusOpcode; +uint16_t g_ui16Event; +uint16_t g_ui16Handle; + +//***************************************************************************** +// +// The structure of BLE slave information. +// +//***************************************************************************** +typedef struct +{ + // + // Device Address + // + uint8_t pui8Addr[HCI_BDADDR_LEN]; + // + // Address Type + // + uint8_t ui8AddrType; + // + // Device Name + // + char pcName[32]; + // + // Long Term Key Data, used for bonding. + // + tLTKData sSaveKey; +} tBLEDeviceInfo; + +tBLEDeviceInfo g_psDev[MAX_SLAVE_NUM]; + +//***************************************************************************** +// +// The number of devices discovered. +// +//***************************************************************************** +uint8_t g_ui8DevFound; + +//***************************************************************************** +// +// The index of device to be connected. +// +//***************************************************************************** +uint8_t g_ui8DevConnect; + +//***************************************************************************** +// +// The positions of the circles in the animation used while discovering devices +// +//***************************************************************************** +const int32_t g_ppi32CirclePos[][2] = +{ + { + 12, 0 + }, + { + 8, -9 + }, + { + 0, -12 + }, + { + -8, -9 + }, + { + -12, 0 + }, + { + -8, 9 + }, + { + 0, 12 + }, + { + 8, 9 + } +}; + +//***************************************************************************** +// +// The colors of the circles in the animation used while discovering devices +// +//***************************************************************************** +const uint32_t g_pui32CircleColor[] = +{ + 0x111111, + 0x333333, + 0x555555, + 0x777777, + 0x999999, + 0xbbbbbb, + 0xdddddd, + 0xffffff, +}; + +//***************************************************************************** +// +// The current color index for the animation used while discovering devices +// +//***************************************************************************** +uint32_t g_ui32ColorIdx; + +//***************************************************************************** +// +// The strings that are displayed in the center and bottom of the display +// +//***************************************************************************** +typedef enum +{ + iInitializing = 0, + iScanning, + iScan, + iNoBLE, + iConnect, + iConnecting, + iDisconnect, + iDisconnecting +} eDisplayUpdateIdx; + +// +// eDisplayUpdateIdx is used as index to the following table +// +static char *ppcString[][2] = +{ // Middle of screen, Bottom of screen + {"Initializing", 0}, + {"Discovering", "timeout in 20s"}, + {"No Device Found", "scan"}, + {"CC2540 EM not present", 0}, + {0, "scan again"}, + {0, "connecting" }, + {0, "disconnect" }, + {0, "disconnecting"}, +}; + +//***************************************************************************** +// +// Forward reference to local functions. +// +//***************************************************************************** +void DrawCircle(void); +bool MessageComplete(uint8_t *pui8Buf, uint8_t *pui8Len); +void HandleTemp(void); +void HandleHumidity(void); +void DisplayTemp(uint32_t ui32X, uint32_t ui32Y); +void DisplayHumidity(uint32_t ui32X, uint32_t ui32Y); +void DisplayRSSI(uint32_t ui32X, uint32_t ui32Y); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Increment the system tick count. + // + g_ui32TickCounter++; + + // + // After the current message has been processed, + // check the message buffer to see if we have received another complete + // message. + // + if(HWREGBITW(&g_ui32Flags, FLAG_HCI_MSG_COMPLETE) == 0) + { + if(MessageComplete(g_pui8Msg, &g_ui8MsgLen) == true) + { + HWREGBITW(&g_ui32Flags, FLAG_HCI_MSG_COMPLETE) = 1; + } + } + + // + // Decrement g_ui32Delay to 1, if it is 1 already, + // meaning it has timed out. + // + if(g_ui32Delay > 1) + { + g_ui32Delay--; + } + + // + // Draw a circle every 100ms + // + if(HWREGBITW(&g_ui32Flags, FLAG_DRAW_CIRCLE) == 1) + { + if(g_ui32TickCounter % 10 == 0) + { + DrawCircle(); + } + } + + // + // set FLAG_EVERY_SECOND every second. + // Systick interrupt is every 10ms, so a second is every 100 interrupts. + // + if(g_ui32TickCounter % 100 == 0) + { + HWREGBITW(&g_ui32Flags, FLAG_EVERY_SECOND) = 1; + } +} + +//***************************************************************************** +// +// The UART interrupt handler. +// +//***************************************************************************** +void +UART3IntHandler(void) +{ + uint32_t ui32Status; + + // + // Get the interrrupt status. + // + ui32Status = ROM_UARTIntStatus(UART3_BASE, true); + + // + // Clear the asserted interrupts. + // + ROM_UARTIntClear(UART3_BASE, ui32Status); + + // + // Loop while there are characters in the receive FIFO. + // + while(ROM_UARTCharsAvail(UART3_BASE)) + { + // + // Check for buffer overflow case, this shouldn't happen + // + if((g_sRxBuf.ui8Wr == g_sRxBuf.ui8Rd) && g_sRxBuf.ui8Count) + { + UARTprintf("\nOF!!! Wr %d, Rd %d, Count %d\n", g_sRxBuf.ui8Wr, g_sRxBuf.ui8Rd, g_sRxBuf.ui8Count); + } + + // + // Read the next character from the UART and place it in the RX buffer. + // + g_sRxBuf.pui8RXBuf[g_sRxBuf.ui8Wr++] = UARTCharGetNonBlocking(UART3_BASE); + + // + // Check for the RX buffer wrap. + // + if(g_sRxBuf.ui8Wr >= BUF_SIZE) + { + g_sRxBuf.ui8Wr = 0; + } + + // + // Increment the total count. + // + g_sRxBuf.ui8Count++; + + } +} + +//***************************************************************************** +// +// The touch screen driver calls this function to report all state changes. +// +//***************************************************************************** +static int32_t +TouchCallback(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + uint8_t ui8Loop; + + if(ui32Message == WIDGET_MSG_PTR_UP) + { + // + // Check if the bottom of the screen is touched. + // + if(i32Y >= (200 - 8) && i32Y < (200 + 8)) + { + if( (g_iState == STATE_READY_FOR_LINK_REQ) || + (g_iState == STATE_START_DISCOVERY)) + { + g_bDiscoveryReq = true; + } + else if(g_iState == STATE_LINKED) + { + g_bTermLinkReq = true; + } + } + + + // + // Check if any of three device names is touched when it is ready + // to connect + // + if(g_iState == STATE_READY_FOR_LINK_REQ) + { + for(ui8Loop = 0; ui8Loop < g_ui8DevFound; ui8Loop++) + { + if((g_ui8DevFound >= ui8Loop + 1) && + (i32Y >= (60 + 40*ui8Loop - 20)) && + (i32Y < (60 + 40*ui8Loop + 20))) + { + // + // save the device index and + // set flag to connect the device. + // + g_ui8DevConnect = ui8Loop; + g_bEstLinkReq = true; + break; + } + } + } + } + + return(0); +} + +//***************************************************************************** +// +// Send a command to the UART. +// +//***************************************************************************** +void +UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count) +{ + // + // Loop while there are more characters to send. + // + while(ui32Count--) + { + // + // Write the next character to the UART. + // + ROM_UARTCharPut(UART3_BASE, *pui8Buffer++); + } +} + +//***************************************************************************** +// +// Simple function to dump the buffer contents to the UART debug port. +// +//***************************************************************************** +void +DumpBuffer(uint8_t *pui8Buf, uint32_t ui32Len, bool bTX) +{ + uint32_t ui32Idx = 0; + + UARTprintf("\n%s: %d\n", (bTX?"TX":"RX"), ui32Len); + for(ui32Idx = 0; ui32Idx < ui32Len; ui32Idx++) + { + if(ui32Idx && (ui32Idx % 16 == 0)) + { + UARTprintf("\n"); + } + UARTprintf("%02x ", pui8Buf[ui32Idx]); + } + UARTprintf("\n\n"); +} + +//***************************************************************************** +// +// This function looks in the RX buffer and returns true if there is a complete +// message, otherwise it returns false. The complete message will be taken out +// from the RX buffer, and message itself and its length will be returned to +// to the caller. +// This function doesn't block, can be called from interrupt context. +// +//***************************************************************************** +bool +MessageComplete(uint8_t *pui8Buf, uint8_t *pui8Len) +{ + uint8_t ui8Idx; + + if(g_sRxBuf.ui8Count < 7 ) + { + // + // Minimum size of a message is 7+ bytes + // + return false; + } + + // + // Byte 0: Type + // 1: EventCode + // 2: Data Length + // 3: Event LSB + // 4: Event MSB + // 5: Status + // ... + // + + // + // Get the index of the Data Length, it is the byte[2] + // + ui8Idx = g_sRxBuf.ui8Rd+2; + + // + // Check for buffer wrap + // + if(ui8Idx > BUF_SIZE -1) + { + ui8Idx -= BUF_SIZE; + } + + // + // The whole message length should 3+Datalength + // + if(g_sRxBuf.ui8Count < (g_sRxBuf.pui8RXBuf[ui8Idx] + 3)) + { + return false; + } + + // + // Got a complete message. + // Return the length of the message + // + *pui8Len = g_sRxBuf.pui8RXBuf[ui8Idx] + 3; + + // + // Take the rx data out of the buffer and return to caller. + // + for(ui8Idx = 0; ui8Idx < *pui8Len; ui8Idx++) + { + pui8Buf[ui8Idx] = g_sRxBuf.pui8RXBuf[g_sRxBuf.ui8Rd++]; + // + // Check for buffer wrap + // + if(g_sRxBuf.ui8Rd >= BUF_SIZE) + { + g_sRxBuf.ui8Rd = 0; + } + } + g_sRxBuf.ui8Count -= *pui8Len; + + return true; +} + +//***************************************************************************** +// +// This function validates and parses the received message and return true +// if it is valid message, it also return the command status of the message. +// If the message is not valid, the function returns false. +// +//***************************************************************************** +bool +ProcessRxData( uint8_t *pui8CmdStatus) +{ + uint8_t ui8Idx; + uint16_t ui16Val; + + // + // Printout the complete message + // + DumpBuffer(g_pui8Msg, g_ui8MsgLen, false); + + // + // Quick check on the first and third bytes. + // The first byte should be 0x4(EVENT) + // The third byte should be the data length. + // + if((g_pui8Msg[0] != HCI_EVENT_PACKET) || + ((g_pui8Msg[2] + 3) != g_ui8MsgLen)) + { + // + // Invalid message, toss it + // + return false; + } + + // + // Parse the message: + // The second byte is event code, it is either vendor specific event code + // 0xFF(HCI_VE_EVENT_CODE) or any BLE event code. + // 3rd and 4th byte are the event + // + if(g_pui8Msg[1] == HCI_VE_EVENT_CODE) + { + //BLE Ext Event + g_ui16Event = (g_pui8Msg[3] | (g_pui8Msg[4]<<8)); + } + else + { + //BLE Event + g_ui16Event = g_pui8Msg[1]; + } + + // + // Get the status in the response(5th byte) + // + if(g_pui8Msg[1] == HCI_VE_EVENT_CODE) + { + //BLE Ext Event + *pui8CmdStatus = g_pui8Msg[5]; + } + else + { + //BLE Event + *pui8CmdStatus = g_pui8Msg[6]; + } + + switch(g_ui16Event) + { + case GAP_HCI_EVENT_EXT_CMD_STATUS: + // + // CommandStatus Event + // Get the command opcode + // + g_ui16CmdStatusOpcode = (g_pui8Msg[6] | (g_pui8Msg[7]<<8)); + if(g_ui16CmdStatusOpcode == HCI_VE_GAP_GET_PARAM_OPCODE) + { + // + // Save the parameters. + // + g_ui16Param[g_ui8ParamWrIdx++] = (g_pui8Msg[9] | (g_pui8Msg[10]<<8)); + } + break; + + case GAP_HCI_EVENT_EXT_DEVICE_INIT_DONE: + // + // DeviceInitDone Event + // + break; + + case GAP_HCI_EVENT_EXT_DEVICE_INFO: + // + // Device Information Event + // parse the scan response + // + if(g_pui8Msg[6] == GAP_ADTYPE_SCAN_RSP_IND) + { + if(g_ui8DevFound < MAX_SLAVE_NUM) + { + // + // Save the device address + // + g_psDev[g_ui8DevFound].ui8AddrType = g_pui8Msg[7]; + memcpy(g_psDev[g_ui8DevFound].pui8Addr, g_pui8Msg + 8, HCI_BDADDR_LEN); + + // + // Get the device name + // Skip the first ht(0x9) char. + // + memcpy(g_psDev[g_ui8DevFound].pcName, &g_pui8Msg[18], (g_pui8Msg[16]-1)); + + // + // Null terminate the name string + // + g_psDev[g_ui8DevFound].pcName[g_pui8Msg[16] -1] = 0; + + // + // Increment the number of devices found. + // + g_ui8DevFound++; + } + else + { + UARTprintf("More than %d device found, ignor this device\n", MAX_SLAVE_NUM); + } + + } + break; + + case GAP_HCI_EVENT_EXT_DEVICE_DISC_DONE: + // + // Device Discover Done Event + // print out devices' info + // + UARTprintf("%d Devices found\n", g_pui8Msg[6]); + for(ui8Idx = 0; ui8Idx < g_ui8DevFound; ui8Idx++) + { + UARTprintf("Device Name: %s\n", g_psDev[ui8Idx].pcName); + UARTprintf(" -Addr Type: %02x\n", g_psDev[ui8Idx].ui8AddrType); + UARTprintf(" -Addr: %02x:%02x:%02x:%02x:%02x:%02x\n", + g_psDev[ui8Idx].pui8Addr[5], + g_psDev[ui8Idx].pui8Addr[4], + g_psDev[ui8Idx].pui8Addr[3], + g_psDev[ui8Idx].pui8Addr[2], + g_psDev[ui8Idx].pui8Addr[1], + g_psDev[ui8Idx].pui8Addr[0]); + } + break; + + case GAP_HCI_EVENT_EXT_DEVICE_LINK_DONE: + // + // Device EstablishLink Event + // + g_ui16Handle = (g_pui8Msg[13] | (g_pui8Msg[14] << 8)); + UARTprintf("Device connected: %s\n", g_psDev[g_ui8DevConnect].pcName); + UARTprintf(" -Handle: %04x\n", g_ui16Handle); + UARTprintf(" -Addr Type: %04x\n", g_psDev[g_ui8DevConnect].ui8AddrType); + UARTprintf(" -Addr: %02x:%02x:%02x:%02x:%02x:%02x\n", + g_psDev[g_ui8DevConnect].pui8Addr[5], + g_psDev[g_ui8DevConnect].pui8Addr[4], + g_psDev[g_ui8DevConnect].pui8Addr[3], + g_psDev[g_ui8DevConnect].pui8Addr[2], + g_psDev[g_ui8DevConnect].pui8Addr[1], + g_psDev[g_ui8DevConnect].pui8Addr[0]); + + break; + + case GAP_HCI_EVENT_EXT_DEVICE_TERM_LINK_DONE: + // + // Device TerminateLink Event + // + UARTprintf("Device Disconnected, reason: %02x\n", g_pui8Msg[8]); + break; + case GAP_HCI_EVENT_EXT_DEVICE_PASSKEY_NEEDED: + break; + + case GAP_HCI_EVENT_EXT_DEVICE_AUTHENTICATE_DONE: + // + // Save the LongTermKey for bond request + // + g_psDev[g_ui8DevConnect].sSaveKey.bValid = true; + ui8Idx = 37; // The DSInf.Enable field is at index 37 in the byte string. + g_psDev[g_ui8DevConnect].sSaveKey.bAuth = g_pui8Msg[ui8Idx++]; + + // + // Next byte is LTK size, followed by the LTK + // + g_psDev[g_ui8DevConnect].sSaveKey.ui8LTKSize = g_pui8Msg[ui8Idx++]; + memcpy(g_psDev[g_ui8DevConnect].sSaveKey.pui8LTK, + g_pui8Msg + ui8Idx, + g_psDev[g_ui8DevConnect].sSaveKey.ui8LTKSize); + ui8Idx += g_psDev[g_ui8DevConnect].sSaveKey.ui8LTKSize; + + // + // 2 bytes of DIV, followed by 8 bytes of Random number + // + g_psDev[g_ui8DevConnect].sSaveKey.pui8DIV[0] = g_pui8Msg[ui8Idx++]; + g_psDev[g_ui8DevConnect].sSaveKey.pui8DIV[1] = g_pui8Msg[ui8Idx++]; + memcpy(g_psDev[g_ui8DevConnect].sSaveKey.pui8Rand, g_pui8Msg + ui8Idx, 8); + + break; + case GAP_HCI_EVENT_EXT_DEVICE_BOND_DONE: + UARTprintf("Bonded\n"); + break; + + case GAP_HCI_EVENT_EXT_ATT_WRITE_RSP: + break; + + case GAP_HCI_EVENT_EXT_ATT_READ_RSP: + // + // this is the IR temperature response + // + memcpy(g_pui8IRTemp, g_pui8Msg + 9, 4); + HandleTemp(); + break; + + case HCI_ATT_ERROR_RSP_EVENT: + UARTprintf("Error Response event: \n"); + break; + + case GAP_HCI_EVENT_CMD_COMPLETE: + // + // Get the command opcode + // + g_ui16CmdStatusOpcode = (g_pui8Msg[4] | (g_pui8Msg[5]<<8)); + if(g_ui16CmdStatusOpcode == HCI_READ_RSSI_OPCODE) + { + // + // RSSI reading response + // + g_i8RSSI = (int8_t)g_pui8Msg[9]; + UARTprintf("RSSI = %d 0x%x\n", g_i8RSSI, g_pui8Msg[9]); + + // + // Display the data when it is only in LINKED state + // + if(g_iState == STATE_LINKED) + { + DisplayRSSI(g_ui32Width / 2 + 80, 80 + 40); + } + } + break; + + case GAP_HCI_EVENT_HANDLE_VALUE_NOTIFY: + if(g_pui8Msg[8] > 2) //PduLen + { + ui16Val = g_pui8Msg[9] | (g_pui8Msg[10] <<8); + switch(ui16Val) + { + case GATT_IRTEMP_DATA_UUID_HANDLE: + // + // Temperatur Sensor data + // + memcpy(g_pui8IRTemp, g_pui8Msg + 11, 4); + + // + // Display the data when it is LINKED state + // + if(g_iState == STATE_LINKED) + { + HandleTemp(); + } + break; + + case GATT_HUMIDITY_DATA_UUID_HANDLE: + // + // Humidity Sensor data + // + memcpy(g_pui8Humidity, g_pui8Msg + 11, 4); + + // + // Display the data when it is LINKED state + // + if(g_iState == STATE_LINKED) + { + HandleHumidity(); + } + break; + + default: + UARTprintf("unexpected handle: %04x, fix me\n", ui16Val); + break; + + } + } + break; + + default: + UARTprintf("unexpected event: %04x, fix me\n", g_ui16Event); + break; + + } + + return true; +} + +//***************************************************************************** +// +// This function verifies if the received response is expected, and return +// true if it is, false otherwise. +// +//***************************************************************************** +bool +VerifyMsg(uint16_t ui16ExpectedEvent, uint16_t ui16ExpectedEventParam, + uint8_t *pui8Status) +{ + uint8_t ui8CmdStatus; + + if(ProcessRxData(&ui8CmdStatus) == 0) + { + // + // Message is not valid + // + return false; + } + + if(ui8CmdStatus != SUCCESS) + { + // + // Message return non-success status code + // + UARTprintf("Command Status return failure: %02x\n", ui8CmdStatus); + } + + // + // Pass the status code to the caller if a location is provided. + if(pui8Status) + { + *pui8Status = ui8CmdStatus; + } + + // + // check the received event + // + UARTprintf("RX: event 0x%04x\n", g_ui16Event); + if(ui16ExpectedEvent) + { + // + // We are expecting a specific event, check it. + // + if(g_ui16Event == ui16ExpectedEvent) + { + // + // Validate Event param if supplied. + // + if(ui16ExpectedEventParam) + { + if(ui16ExpectedEventParam == g_ui16CmdStatusOpcode) + { + return true; + } + } + else + { + // + // No need to verify EventParam + // + return true; + } + } + } + else + { + // + // We are NOT expecting any specific event, just return true. + // + return true; + } + + return false; +} + +//***************************************************************************** +// +// This function sets the timeout and waits for the given event, the function +// will return true when the expected event has been received before the +// timeout; or return false when the expected event has not been received +// before the timeout. +// +//***************************************************************************** +bool +WaitForRsp(uint16_t ui16ExpectedEvent, uint16_t ui16ExpectedParam, + uint32_t ui32TimeoutMs, uint8_t *pui8Status) +{ + bool bRet = false; + + // + // Set the timeout if non zero + // i32Timeout is in ms, convert it to number of systicks. + // Systick timer is every 10ms, so ui32TimeoutMs/10 + 1 + // + g_ui32Delay = ui32TimeoutMs?(ui32TimeoutMs/10 + 1):0; + + // + // Block until there is a response or timeout + // + while(g_ui32Delay > 1) + { + if(HWREGBITW(&g_ui32Flags, FLAG_HCI_MSG_COMPLETE) == 1) + { + // + // Got a response + // + bRet = VerifyMsg(ui16ExpectedEvent, ui16ExpectedParam, pui8Status); + if(bRet) + { + // + // Got what we expected, disable timeout, and exit the loop + // + g_ui32Delay = 0; + } + + // + // Clear the flag to indicate we are ready to receive the next + // complete message + // + HWREGBITW(&g_ui32Flags, FLAG_HCI_MSG_COMPLETE) = 0; + } + } + + // + // Check for timeout + // + if(g_ui32Delay == 1) + { + UARTprintf("\nTimeout waiting for response..%04x.\n", + ui16ExpectedEvent); + } + + return bRet; +} + +//***************************************************************************** +// +// This function checks if there are any events in the queue to be processed. +// Such as notify event, it will be sent from slave periodically. +// +//***************************************************************************** +bool +CheckForMsg() +{ + bool bSuccess = false; + + if(HWREGBITW(&g_ui32Flags, FLAG_HCI_MSG_COMPLETE) == 1) + { + // + // Got a response + // + bSuccess = VerifyMsg(0, 0, 0); + if(g_ui16Event == GAP_HCI_EVENT_EXT_DEVICE_TERM_LINK_DONE) + { + UARTprintf("Slave terminated the link\n"); + + // + // Sensor will be turned off by the slave + // + HWREGBITW(&g_ui32Flags, FLAG_SENSOR_CFGD) = 0; + + // + // Go back to TERMED state + // + g_iState = STATE_TERMED; + } + + // + // Clear the flag to indicate we are ready to receive the next + // complete message + // + HWREGBITW(&g_ui32Flags, FLAG_HCI_MSG_COMPLETE) = 0; + } + + return bSuccess; + +} + +//***************************************************************************** +// +// This function configures the sensor profiles. +// +//***************************************************************************** +void +ConfigureSensors(void) +{ + uint8_t pui8Byte[2]; + uint8_t ui8Status; + bool bSuccess; + + // + // Enable IR Sensor and Measurements if it is not yet configured. + // + if(HWREGBITW(&g_ui32Flags, FLAG_SENSOR_CFGD) == 1) + { + return; + } + + UARTprintf("Send Temp sensor wake cmd...\n"); + pui8Byte[0] = 0x01; + GAPWriteCharValue(g_ui16Handle, GATT_IRTEMP_CFG_UUID_HANDLE, pui8Byte, 1); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("ConfigureSensors: Wait for CommandStatus error\n"); + } + + // + // Wait for ATT_WriteRsp event, timeout after 500ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_ATT_WRITE_RSP, 0, 500, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("ConfigureSensors: Wait for ATT_WriteRsp error\n"); + } + + // + // Humidity Sensor + // + UARTprintf("Send humidity sensor wake cmd...\n"); + GAPWriteCharValue(g_ui16Handle, GATT_HUMIDITY_CFG_UUID_HANDLE, pui8Byte, 1); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("ConfigureSensors: Wait for CommandStatus error\n"); + } + + // + // Wait for ATT_WriteRsp event, timeout after 500ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_ATT_WRITE_RSP, 0, 500, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("ConfigureSensors: Wait for ATT_WriteRsp error\n"); + } + + UARTprintf("Send Temp sensor notify cmd...\n"); + pui8Byte[0] = 0x01; + pui8Byte[1] = 0x00; + GAPWriteCharValue(g_ui16Handle, GATT_IRTEMP_NOTIFY_UUID_HANDLE, pui8Byte, 2); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("ConfigureSensors: Wait for CommandStatus error\n"); + } + + // + // Wait for ATT_WriteRsp event, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_ATT_WRITE_RSP, 0, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("ConfigureSensors: Wait for ATT_WriteRsp error\n"); + } + + // + // Humidity Sensor + // + UARTprintf("Send Humidity sensor notify cmd...\n"); + GAPWriteCharValue(g_ui16Handle, GATT_HUMIDITY_NOTIDY_UUID_HANDLE, pui8Byte, 2); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("ConfigureSensors: Wait for CommandStatus error\n"); + } + + // + // Wait for ATT_WriteRsp event, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_ATT_WRITE_RSP, 0, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("ConfigureSensors: Wait for ATT_WriteRsp error\n"); + } + + // + // Set the flag that sensors are configured. + // + HWREGBITW(&g_ui32Flags, FLAG_SENSOR_CFGD) = 1; +} + +//***************************************************************************** +// +// This function deconfigures the sensor profiles. +// +//***************************************************************************** +void +DeConfigureSensors(void) +{ + uint8_t pui8Byte[2]; + uint8_t ui8Status; + bool bSuccess; + + if(HWREGBITW(&g_ui32Flags, FLAG_SENSOR_CFGD) == 0) + { + // Do nothing if the sensors have not been configured. + return; + } + + // + // TM006 IR and Ambient temperature sensor + // + UARTprintf("Send Temp sensor stop notify cmd...\n"); + pui8Byte[0] = 0x00; + pui8Byte[1] = 0x00; + GAPWriteCharValue(g_ui16Handle, GATT_IRTEMP_NOTIFY_UUID_HANDLE, pui8Byte, 2); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("DeConfigureSensors: Wait for CommandStatus error\n"); + } + + // + // Humidity Sensor + // + UARTprintf("Send Humidity sensor stop notify cmd...\n"); + GAPWriteCharValue(g_ui16Handle, GATT_HUMIDITY_NOTIDY_UUID_HANDLE, pui8Byte, 2); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("DeConfigureSensors: Wait for CommandStatus error\n"); + } + + // + // Wait for ATT_WriteRsp event, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_ATT_WRITE_RSP, 0, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("DeConfigureSensors: Wait for ATT_WriteRsp error\n"); + } + + // + // Put IR Sensor and Measurements to sleep + // + UARTprintf("Send IR Temp sensor sleep cmd...\n"); + pui8Byte[0] = 0x00; + GAPWriteCharValue(g_ui16Handle, GATT_IRTEMP_CFG_UUID_HANDLE, pui8Byte, 1); + + // + // Wait for CommandStatus response, timeout after 500ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE, 500, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("DeConfigureSensors: Wait for CommandStatus error\n"); + } + + // + // Wait for ATT_WriteRsp event, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_ATT_WRITE_RSP, 0, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("DeConfigureSensors: Wait for ATT_WriteRsp error\n"); + } + + UARTprintf("Send Humidity sensor sleep cmd...\n"); + GAPWriteCharValue(g_ui16Handle, GATT_HUMIDITY_CFG_UUID_HANDLE, pui8Byte, 1); + + // + // Wait for CommandStatus response, timeout after 500ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE, 500, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("DeConfigureSensors: Wait for CommandStatus error\n"); + } + + // + // Wait for ATT_WriteRsp event, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_ATT_WRITE_RSP, 0, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("DeConfigureSensors: Wait for ATT_WriteRsp error\n"); + } + HWREGBITW(&g_ui32Flags, FLAG_SENSOR_CFGD) = 0; + +} + +//***************************************************************************** +// +// This function queries the parameters of the central device. +// +//***************************************************************************** +bool +GetParam(void) +{ + uint8_t ui8Status; + bool bSuccess; + + UARTprintf("Get Param...\n"); + + // + // Start Parameter write index with 0 + // + g_ui8ParamWrIdx = 0; + + // + // Get the Minimum Link Layer connection interval + // + GAPGetParam(TGAP_CONN_EST_INT_MIN); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_GET_PARAM_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("Get Param %x failed\n", TGAP_CONN_EST_INT_MIN); + } + + // + // Get the Maximum Link Layer connection interval + // + GAPGetParam(TGAP_CONN_EST_INT_MAX); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_GET_PARAM_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("Get Param %x failed\n", TGAP_CONN_EST_INT_MAX); + } + + // + // Get the Link Layer connection slave latency + // + GAPGetParam(TGAP_CONN_EST_LATENCY); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_GET_PARAM_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("Get Param %x failed\n", TGAP_CONN_EST_LATENCY); + } + + // + // Get the Link Layer connection supervision timeout + // + GAPGetParam(TGAP_CONN_EST_SUPERV_TIMEOUT); + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_GET_PARAM_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + UARTprintf("Get Param %x failed\n", TGAP_CONN_EST_SUPERV_TIMEOUT); + } + + if(g_ui16Param[0] != 0 && g_ui16Param[1] != 0 && g_ui16Param[3] != 0) + { + return true; + } + else + { + return false; + } +} + +//***************************************************************************** +// +// This function set the parameters of the central device. +// +//***************************************************************************** +bool +SetParam(void) +{ + uint8_t ui8Status; + bool bSuccess; + + UARTprintf("Set Param...\n"); + + // + // Set the Minimum Link Layer connection interval + // + GAPSetParam(TGAP_CONN_EST_INT_MIN, g_ui16Param[0]); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_SET_PARAM_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + + UARTprintf("Set Param %x failed\n", TGAP_CONN_EST_INT_MIN); + } + + // + // Set the Maximum Link Layer connection interval + // + GAPSetParam(TGAP_CONN_EST_INT_MAX, g_ui16Param[1]); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_SET_PARAM_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + + UARTprintf("Set Param %x failed\n", TGAP_CONN_EST_INT_MAX); + } + + // + // Set the Link Layer connection slave latency + // + GAPSetParam(TGAP_CONN_EST_LATENCY, g_ui16Param[2]); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_SET_PARAM_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + + UARTprintf("Set Param %x failed\n", TGAP_CONN_EST_LATENCY); + } + + // + // Set the Link Layer connection supervision timeout + // + GAPSetParam(TGAP_CONN_EST_SUPERV_TIMEOUT, g_ui16Param[3]); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_SET_PARAM_OPCODE, 200, &ui8Status); + if(!bSuccess || ui8Status) + { + + UARTprintf("Set Param %x failed\n", TGAP_CONN_EST_SUPERV_TIMEOUT); + } + + return bSuccess; +} + +//***************************************************************************** +// +// This function authenticates with the slave device. +// +//***************************************************************************** +bool +Authenticate(void) +{ + bool bSuccess = false; + uint8_t ui8Status; + + if(g_psDev[g_ui8DevConnect].sSaveKey.bValid == false) + { + UARTprintf("Initiate Pairing Request...\n"); + GAPAuthenticate(g_ui16Handle); + + // + // Wait for CommandStatus response, timeout after 100ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_AUTHENTICATE_OPCODE, 100, &ui8Status); + if(bSuccess && ui8Status == SUCCESS) + { + // + // Wait for PasskeyNeeded event, timeout after 1s + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_DEVICE_PASSKEY_NEEDED, 0, 1000, &ui8Status); + if(bSuccess && ui8Status == SUCCESS) + { + // + // Got PasskeyNeeded event, send the key + // + GAPPassKeyUpdate(g_ui16Handle, "000000"); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_PASSKEY_UPDATE_OPCODE, 200, &ui8Status); + if(bSuccess && ui8Status == SUCCESS) + { + // + // Wait for AuthenticationComplete event, timeout after 5s + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_DEVICE_AUTHENTICATE_DONE, 0, 5000, &ui8Status); + } + } + } + } + else + { + UARTprintf("Bond Request...\n"); + GAPBond(g_ui16Handle, &g_psDev[g_ui8DevConnect].sSaveKey); + + // + // Wait for CommandStatus response, timeout after 100ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_BOND_OPCODE, 100, &ui8Status); + if(bSuccess && ui8Status == SUCCESS) + { + // + // Wait for BondComplete event, timeout after 1s + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_DEVICE_BOND_DONE, 0, 1000, &ui8Status); + } + } + + if(ui8Status != SUCCESS) + { + UARTprintf("Authenticate failure 0x%x\n", ui8Status); + return false; + } + return bSuccess; +} + +//***************************************************************************** +// +// This function establishes link to the slave. +// +//***************************************************************************** +bool +EstablishLink(uint8_t ui8DevIdx) +{ + bool bSuccess = false; + uint8_t ui8Status; + + UARTprintf("Link Request on device %d...\n", ui8DevIdx); + + GAPEstLinkReq(false, false, g_psDev[ui8DevIdx].ui8AddrType, g_psDev[ui8DevIdx].pui8Addr); + + // + // Wait for CommandStatus response, timeout after 100ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_EST_LINK_REQ_OPCODE, 100, &ui8Status); + if(bSuccess && (ui8Status == SUCCESS || ui8Status == bleAlreadyInRequestedMode)) + { + // + // Wait for EstablishLink response, timeout after 15s + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_DEVICE_LINK_DONE, 0, 15000, &ui8Status); + if(bSuccess && ui8Status == SUCCESS) + { + // + // Got DeviceInitDone response, go to the next state + // + if(g_bInitPairReq == true) + { + bSuccess = Authenticate(); + } + } + } + + if(ui8Status != SUCCESS) + { + return false; + } + return bSuccess; +} + +//***************************************************************************** +// +// This function terminates the link. +// +//***************************************************************************** +bool +TerminateLink(void) +{ + bool bSuccess = false; + uint8_t ui8Status; + + UARTprintf("Terminate Link Request...\n"); + + DeConfigureSensors(); + + // + // Send TeminateLink request + // + GAPTerLinkReq(g_ui16Handle, HCI_DISCONNECT_REMOTE_USER_TERM); + + // + // Wait for CommandStatus response, timeout after 200ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_TER_LINK_REQ_OPCODE, 200, &ui8Status); + if(bSuccess && ui8Status == SUCCESS) + { + // + // Wait for TerminateLink event, timeout after 1s + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_DEVICE_TERM_LINK_DONE, 0, 1000, &ui8Status); + } + + if(ui8Status != SUCCESS) + { + return false; + } + return bSuccess; +} + +//***************************************************************************** +// +// This function draws the animated circle during discovery state +// +//***************************************************************************** +void +DrawCircle(void) +{ + uint32_t ui32Idx; + + // + // Loop through the circles in the animation. + // + for(ui32Idx = 0; ui32Idx < 8; ui32Idx++) + { + // + // Draw this circle. + // + GrContextForegroundSet(&g_sContext, + g_pui32CircleColor[(g_ui32ColorIdx + + ui32Idx) & 7]); + GrCircleFill(&g_sContext, + (g_ui32Width / 2) + g_ppi32CirclePos[ui32Idx][0], + (g_ui32Height / 2) + g_ppi32CirclePos[ui32Idx][1] + 24, + 2); + } + + // + // Increment the color index. + // + g_ui32ColorIdx++; +} + +//***************************************************************************** +// +// Clear the screen +// +//***************************************************************************** +void ClearScreen(void) +{ + tRectangle sRect; + + // + // Clear the display. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = g_ui32Width - 1; + sRect.i16YMax = g_ui32Height - 1; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + GrContextForegroundSet(&g_sContext, ClrWhite); +} + +//***************************************************************************** +// +// Update the display. +// +//***************************************************************************** +void +UpdateDisplay(eDisplayUpdateIdx eUpdate) +{ + uint8_t ui8Loop; + char pcBuf[20]; + + // + // Clear the middle section of the display + // + ClearScreen(); + + // + // Update the middle of screen + // + if(eUpdate == iConnecting) + { + // + // show the to be connected device only + // + GrStringDrawCentered(&g_sContext, g_psDev[g_ui8DevConnect].pcName, -1, + g_ui32Width / 2, 60 + (40*g_ui8DevConnect), false); + + // + // Convert the device address into a string. + // + usprintf(pcBuf, "(%02x:%02x:%02x:%02x:%02x:%02x)", + g_psDev[g_ui8DevConnect].pui8Addr[5], + g_psDev[g_ui8DevConnect].pui8Addr[4], + g_psDev[g_ui8DevConnect].pui8Addr[3], + g_psDev[g_ui8DevConnect].pui8Addr[2], + g_psDev[g_ui8DevConnect].pui8Addr[1], + g_psDev[g_ui8DevConnect].pui8Addr[0]); + GrContextFontSet(&g_sContext, g_psFontCm14); + GrStringDrawCentered(&g_sContext, pcBuf, -1, + g_ui32Width / 2, 60 + (40*g_ui8DevConnect + 16), false); + GrContextFontSet(&g_sContext, g_psFontCmss16b); + + } + else if(eUpdate == iDisconnect) + { + GrStringDraw(&g_sContext, "IR Temperature:", -1, + (g_ui32Width / 2) - 110, 80, false); + GrStringDraw(&g_sContext, "Ambient Temperature:", -1, + (g_ui32Width / 2) - 110, 80 + 20, false); + GrStringDraw(&g_sContext, "RSSI:", -1, + (g_ui32Width / 2) - 110, 80 + 40, false); + GrStringDraw(&g_sContext, "Humidity:", -1, + (g_ui32Width / 2) - 110, 80 + 60, false); + + // + // clear the sensor date + // + g_dIRTemp = 0; + g_dAmbTemp = 0; + g_dHumidity = 0; + g_i8RSSI = 0; + + DisplayTemp(g_ui32Width / 2 + 80, 80); + DisplayRSSI(g_ui32Width / 2 + 80, 80 + 40); + DisplayHumidity(g_ui32Width / 2 + 80, 80 + 60); + } + else + { + if(ppcString[eUpdate][0]) + { + GrStringDrawCentered(&g_sContext, ppcString[eUpdate][0], -1, + g_ui32Width / 2, (g_ui32Height / 2) - 18, false); + } + else + { + + for(ui8Loop = 0; ui8Loop < g_ui8DevFound; ui8Loop++) + { + GrStringDrawCentered(&g_sContext, g_psDev[ui8Loop].pcName, -1, + g_ui32Width / 2, 60 + (40*ui8Loop), false); + + // + // Convert the device address into a string. + // + usprintf(pcBuf, "(%02x:%02x:%02x:%02x:%02x:%02x)", + g_psDev[ui8Loop].pui8Addr[5], + g_psDev[ui8Loop].pui8Addr[4], + g_psDev[ui8Loop].pui8Addr[3], + g_psDev[ui8Loop].pui8Addr[2], + g_psDev[ui8Loop].pui8Addr[1], + g_psDev[ui8Loop].pui8Addr[0]); + GrContextFontSet(&g_sContext, g_psFontCm14); + GrStringDrawCentered(&g_sContext, pcBuf, -1, + g_ui32Width / 2, 60 + (40*ui8Loop + 16), false); + GrContextFontSet(&g_sContext, g_psFontCmss16b); + } + } + } + + // + // Update the bottom text. + // + if(ppcString[eUpdate][1]) + { + GrStringDrawCentered(&g_sContext, ppcString[eUpdate][1], -1, + g_ui32Width / 2, 200, false); + } +} + +//***************************************************************************** +// +// Calculate the object temperature from TMP006 reading. +// Refer to TMP006 data sheet. +// +//***************************************************************************** +double +calculateTemp(int16_t i16Tdie, int16_t i16Vobj) +{ + double Vobj2 = (double)i16Vobj*.00000015625; + double i16Tdie2 = (double)i16Tdie*.03125 + 273.15; + double S0 = 6.40*pow(10,-14); + double a1 = 1.75*pow(10,-3); + double a2 = -1.678*pow(10,-5); + double b0 = -2.94*pow(10,-5); + double b1 = -5.70*pow(10,-8); + double b2 = 4.63*pow(10,-10); + double c2 = 13.4; + double Tref = 298.15; + double S = S0*(1+a1*(i16Tdie2 - Tref)+a2*pow((i16Tdie2 - Tref),2)); + double Vos = b0 + b1*(i16Tdie2 - Tref) + b2*pow((i16Tdie2 - Tref),2); + double fObj = (Vobj2 - Vos) + c2*pow((Vobj2 - Vos),2); + double Tobj = pow(pow(i16Tdie2,4) + (fObj/S),.25); + return (Tobj - 273.15); +} + +//***************************************************************************** +// +// This function converts the raw temperature reading to actual temperature in +// C and displays the temperatures on the display. +// +//***************************************************************************** +void +HandleTemp(void) +{ + int16_t i16VObj, i16TDie; + + UARTprintf("IR %02x %02x %02x %02x\n", g_pui8IRTemp[0], g_pui8IRTemp[1], + g_pui8IRTemp[2], g_pui8IRTemp[3]); + // + // The first two bytes are Object Voltage, + // the last two bytes are Die temperature + // + i16VObj = (int16_t)(g_pui8IRTemp[0] | (g_pui8IRTemp[1]<<8)); + i16TDie = (int16_t)(g_pui8IRTemp[2] | (g_pui8IRTemp[3]<<8)); + if(i16VObj && i16TDie) + { + g_dIRTemp = calculateTemp(i16TDie>>2, i16VObj); + g_dAmbTemp = (double)i16TDie /128.0; + DisplayTemp(g_ui32Width / 2 + 80, 80); + } +} + +//***************************************************************************** +// +// This function converts the raw humidity to humidity in rH and displays it +// on the display. +// +//***************************************************************************** +void +HandleHumidity(void) +{ + uint16_t ui16RawH; + + // + // The first two bytes are temperature(ignored) + // the last two bytes are humitity + // + ui16RawH = (g_pui8Humidity[2] | (g_pui8Humidity[3]<<8)); + UARTprintf("Humidity %04x\n", ui16RawH); + + // + // Conversion algorithm for Humidity + // + ui16RawH &= ~0x0003; // clear bits [1..0] (status bits) + g_dHumidity = -6.0 + (125.0 *(double)ui16RawH)/65536; // RH= -6 + 125 * SRH/2^16 + DisplayHumidity(g_ui32Width / 2 + 80, 80 + 60); +} + +//***************************************************************************** +// +// Display IR and Ambient temperatures on the display. +// +//***************************************************************************** +void +DisplayTemp(uint32_t ui32X, uint32_t ui32Y) +{ + char pcBuf[16]; + int16_t i16IRInt, i16IRFrac; + tRectangle sRect; + + i16IRInt = ((int16_t)(g_dIRTemp*100))/100; + i16IRFrac = (int16_t)(g_dIRTemp*100) - i16IRInt*100; + UARTprintf("IR temp = %d.%d\n", i16IRInt, i16IRFrac); + + // + // Convert the temperature into a string. + // + usprintf(pcBuf, "%d.%dC", i16IRInt, i16IRFrac); + + // + // Clear the previous reading. + // + sRect.i16XMin = ui32X; + sRect.i16YMin = ui32Y; + sRect.i16XMax = ui32X + 60; + sRect.i16YMax = ui32Y + 20; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Display the IR temperature. + // + GrStringDraw(&g_sContext, pcBuf, -1, ui32X, ui32Y, false); + + i16IRInt = ((int16_t)(g_dAmbTemp*100))/100; + i16IRFrac = (int16_t)(g_dAmbTemp*100) - i16IRInt*100; + UARTprintf("Ambient temp = %d.%d\n", i16IRInt, i16IRFrac); + + // + // Convert the temperature into a string. + // + usprintf(pcBuf, "%d.%dC", i16IRInt, i16IRFrac); + + // + // Clear the previous temperature. + // + sRect.i16XMin = ui32X; + sRect.i16YMin = ui32Y + 20; + sRect.i16XMax = ui32X + 60; + sRect.i16YMax = ui32Y + 40; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Display the Ambient temperatur. + // + GrStringDraw(&g_sContext, pcBuf, -1, ui32X, ui32Y + 20, false); +} + +//***************************************************************************** +// +// Display RSSI on the display. +// +//***************************************************************************** +void +DisplayRSSI(uint32_t ui32X, uint32_t ui32Y) +{ + char pcBuf[16]; + tRectangle sRect; + + // + // Convert the RSSI data into a string. + // + if(g_i8RSSI >= 0) + { + // + // RSSI has to be negative value, discard the nonvalid data. + // + return; + } + usprintf(pcBuf, "%ddBm", g_i8RSSI); + + // + // Clear the previous reading. + // + sRect.i16XMin = ui32X; + sRect.i16YMin = ui32Y; + sRect.i16XMax = ui32X + 60; + sRect.i16YMax = ui32Y + 20; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Display on the screen. + // + GrStringDraw(&g_sContext, pcBuf, -1, ui32X, ui32Y, false); +} + +//***************************************************************************** +// +// Display Humidity on the display. +// +//***************************************************************************** +void +DisplayHumidity(uint32_t ui32X, uint32_t ui32Y) +{ + char pcBuf[16]; + tRectangle sRect; + uint16_t ui8Int, ui8Frac; + + ui8Int = (uint16_t)(g_dHumidity); + ui8Frac = (uint16_t)(g_dHumidity*10) - ui8Int*10; + UARTprintf("Humidity = %02d.%01d\n", ui8Int, ui8Frac); + + // + // Convert the humidity into a string. + // + usprintf(pcBuf, "%d.%01d%%rH", ui8Int, ui8Frac); + + // + // Clear the previous reading. + // + sRect.i16XMin = ui32X; + sRect.i16YMin = ui32Y; + sRect.i16XMax = ui32X + 70; + sRect.i16YMax = ui32Y + 20; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Display on the screen. + // + GrStringDraw(&g_sContext, pcBuf, -1, ui32X, ui32Y, false); +} + +//***************************************************************************** +// +// This example demonstrates how to communicate a BLE slave using TI's CC2540 +// EM on TM4C129X Development board. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock; + bool bSuccess; + uint8_t ui8Status; + uint8_t pui8IRKOrCSRK[16]; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "ble-central"); + GrContextFontSet(&g_sContext, g_psFontCmss16b); + + // + // Initialize the touch screen driver + // + TouchScreenInit(ui32SysClock); + TouchScreenCallbackSet(TouchCallback); + + // + // UART 0 is used for debugging message console. + // + UARTStdioConfig(0, 115200, ui32SysClock); + + UARTprintf("\nBLE Central demo running...\n"); + + // + // Get the width and height of the display. + // + g_ui32Width = GrContextDpyWidthGet(&g_sContext); + g_ui32Height = GrContextDpyHeightGet(&g_sContext); + + // + // UART3 is used to communicate with CC2540, configure the pins. + // PJ0, 1, 4, 5 are used for UART3. + // + ROM_GPIOPinConfigure(GPIO_PJ0_U3RX); + ROM_GPIOPinConfigure(GPIO_PJ1_U3TX); + ROM_GPIOPinConfigure(GPIO_PJ4_U3RTS); + ROM_GPIOPinConfigure(GPIO_PJ5_U3CTS); + ROM_GPIOPinTypeUART(GPIO_PORTJ_BASE, GPIO_PIN_0 | GPIO_PIN_1 | + GPIO_PIN_4 | GPIO_PIN_5); + + // + // EnableUART3 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART3); + + // + // Configure the UART3 for 115,200, 8-N-1 operation. + // + ROM_UARTConfigSetExpClk(UART3_BASE, ui32SysClock, 115200, + (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | + UART_CONFIG_PAR_NONE)); + + // + // Configure UART3 to use hardware flow control. + // + UARTFlowControlSet(UART3_BASE, UART_FLOWCONTROL_TX | UART_FLOWCONTROL_RX); + + // + // Enable processor interrupts. + // + IntMasterEnable(); + + // + // Enable the UART interrupt. + // + ROM_IntEnable(INT_UART3); + ROM_UARTIntEnable(UART3_BASE, UART_INT_RX | UART_INT_RT); + + + // + // Clear timeout value + // + g_ui32Delay = 0; + + // + // Configure SysTick for a periodic interrupt at 10ms. + // + ROM_SysTickPeriodSet(ui32SysClock / 100); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // clear the device info and RX buffer + // + memset(g_psDev, 0, sizeof(g_psDev)); + memset(&g_sRxBuf, 0, sizeof(tCirBuf)); + + // + // Start the state machine with initial state + // + g_iState = STATE_DEV_INIT; + + // + // Display "Initializing" on the bottom of screen + // + UpdateDisplay(iInitializing); + + while(1) + { + switch(g_iState) + { + case STATE_DEV_INIT: + + UARTprintf("Device Init...\n"); + + // + // Send GAP_DeviceInit command + // + memset(pui8IRKOrCSRK, 0, 16); + GAPDeviceInit(GAP_PROFILE_CENTRAL, 5, pui8IRKOrCSRK, pui8IRKOrCSRK, 1); + + // + // Wait for CommandStatus response, timeout after 500ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_INIT_OPCODE, 500, &ui8Status); + if(bSuccess && ui8Status == SUCCESS) + { + // + // Wait for DeviceInitDone response, timeout after 500ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_DEVICE_INIT_DONE, 0, 500, &ui8Status); + if(bSuccess && ui8Status == SUCCESS) + { + // + // Got DeviceInitDone response, go to the next state + // + g_iState = STATE_GET_PARAM; + } + } + else + { + UARTprintf("CC2540 EM board is not connected to the DK\n"); + UpdateDisplay(iNoBLE); + + // + // Hang forever + // + while(1); + } + break; + + case STATE_GET_PARAM: + if(GetParam()) + { + // + // Query parameter successful, go to the discovery state + // + g_bDiscoveryReq = true; + g_iState = STATE_START_DISCOVERY; + UARTprintf("Ready to scan devices\n"); + + // + // Update display + // + UpdateDisplay(iScanning); + } + else + { + // + // cannot query parameters on CC2540, something wrong, + // go to the error state + // + g_iState = STATE_ERROR; + } + break; + + case STATE_START_DISCOVERY: + if(g_bDiscoveryReq) + { + UARTprintf("Start Discovery...\n"); + + // + // Clear the number of devices discovered + // + g_ui8DevFound = 0; + + // + // Start to draw circle periodically + // + HWREGBITW(&g_ui32Flags, FLAG_DRAW_CIRCLE) = 1; + + // + // Send Discovery command + // + GAPDiscoveryReq(DEVDISC_MODE_ALL, true, false); + + // + // Wait for CommandStatus response, timeout after 100ms + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_CMD_STATUS, HCI_VE_GAP_DEVICE_DISC_REQ_OPCODE, 100, &ui8Status); + if(bSuccess && ui8Status == SUCCESS) + { + // + // Wait for DiscoveryDone response, timeout after 20s + // + bSuccess = WaitForRsp(GAP_HCI_EVENT_EXT_DEVICE_DISC_DONE, 0, 20000, &ui8Status); + if(bSuccess && ui8Status == SUCCESS) + { + // + // Have we discovered any device? + // + if(g_ui8DevFound) + { + // + // Got DiscoveryDone response, go to the next state + // + g_iState = STATE_SET_PARAM; + } + else + { + // + // No device found: + // Stop drawing the circles. + // + HWREGBITW(&g_ui32Flags, FLAG_DRAW_CIRCLE) = 0; + + // + // show the scan button on the bottom of the + // screen in order to repeat the scanning. + // + UpdateDisplay(iScan); + } + g_bDiscoveryReq = false; + } + } + } + break; + + case STATE_SET_PARAM: + if(SetParam()) + { + // + // Configure parameters are successful, + // go to the next state + // + g_iState = STATE_READY_FOR_LINK_REQ; + UARTprintf("Discovery done\n"); + + HWREGBITW(&g_ui32Flags, FLAG_DRAW_CIRCLE) = 0; + UpdateDisplay(iConnect); + } + else + { + // + // Failed to configure the parameters, + // go to the error state + // + g_iState = STATE_ERROR; + } + break; + + case STATE_READY_FOR_LINK_REQ: + // + // Wait for user to connect any device + // + if(g_bEstLinkReq == true) + { + // + // Received connect command from user, + // go to the next state to connect the device + // + UpdateDisplay(iConnecting); + g_iState = STATE_LINK; + g_bEstLinkReq = false; + } + + // + // Wait for user to do discovery/scan again + // + if(g_bDiscoveryReq == true) + { + // + // Discovery/scan is requested by user + // + g_iState = STATE_START_DISCOVERY; + + // + // Update display + // + UpdateDisplay(iScanning); + } + break; + + case STATE_LINK: + // + // Connect to the device + // + if( EstablishLink(g_ui8DevConnect)) + { + // + // Connected the device without errors. + // go to the next state. + // + g_iState = STATE_LINKED; + + // + // Display the sensor information. + // + UpdateDisplay(iDisconnect); + } + else + { + // + // Link failed, go back to STATE_READY_FOR_LINK_REQ. + // + UARTprintf("Link failed, go back to ready for link state\n"); + g_iState = STATE_READY_FOR_LINK_REQ; + UpdateDisplay(iConnect); + } + break; + + case STATE_LINKED: + // + // Handle Terminate request if any + // + if(g_bTermLinkReq == true) + { + g_iState = STATE_TERM; + UpdateDisplay(iDisconnecting); + break; + } + + // + // Configure the sensor profiles. + // + ConfigureSensors(); + + // + // Check for any sensor notify event + // + CheckForMsg(); + + // + // We will read the device's RSSI every second. + // + if(HWREGBITW(&g_ui32Flags, FLAG_EVERY_SECOND) == 1) + { + HWREGBITW(&g_ui32Flags, FLAG_EVERY_SECOND) = 0; + + // + // Read RSSI + // + HCIReadRSSI(g_ui16Handle); + } + break; + + case STATE_TERM: + // + // We are told to termniate the link. + // + if(TerminateLink()) + { + // + // Terminate success, go to the next state + // + g_iState = STATE_TERMED; + g_bTermLinkReq = false; + } + else + { + //TODO + g_iState = STATE_TERMED; + g_bTermLinkReq = false; + + } + break; + + case STATE_TERMED: + // + // Terminated, go to the next state + // + g_iState = STATE_READY_FOR_LINK_REQ; + UpdateDisplay(iConnect); + break; + + case STATE_IDLE: + default: + // + // Check any messages. + // + CheckForMsg(); + break; + } + } +} diff --git a/boards/dk-tm4c129x/ble_central/ble_central.ewd b/boards/dk-tm4c129x/ble_central/ble_central.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ble_central.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/ble_central/ble_central.ewp b/boards/dk-tm4c129x/ble_central/ble_central.ewp new file mode 100644 index 0000000..5388441 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ble_central.ewp @@ -0,0 +1,810 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\ble_central.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\gap.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/ble_central/ble_central.icf b/boards/dk-tm4c129x/ble_central/ble_central.icf new file mode 100644 index 0000000..681cc5a --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ble_central.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// ble_central.icf - Linker configuration file for ble_central. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/ble_central/ble_central.ld b/boards/dk-tm4c129x/ble_central/ble_central.ld new file mode 100644 index 0000000..c528e4b --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ble_central.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * ble_central.ld - Linker configuration file for ble_central. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/ble_central/ble_central.sct b/boards/dk-tm4c129x/ble_central/ble_central.sct new file mode 100644 index 0000000..b1e6c8a --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ble_central.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; ble_central.sct - Linker configuration file for ble_central. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/ble_central/ble_central.uvopt b/boards/dk-tm4c129x/ble_central/ble_central.uvopt new file mode 100644 index 0000000..90855bc --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ble_central.uvopt @@ -0,0 +1,401 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + ble_central + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\ble_central.c + ble_central.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\gap.c + gap.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 12 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/ble_central/ble_central.uvproj b/boards/dk-tm4c129x/ble_central/ble_central.uvproj new file mode 100644 index 0000000..11a43fa --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ble_central.uvproj @@ -0,0 +1,464 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ble_central + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + ble_central + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\ble_central.bin .\rvmdk\ble_central.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + ble_central.sct + + + --entry Reset_Handler + + + + + + + + Source + + + ble_central.c + 1 + .\ble_central.c + + + frame.c + 1 + ..\drivers\frame.c + + + gap.c + 1 + .\gap.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/ble_central/ble_central_ccs.cmd b/boards/dk-tm4c129x/ble_central/ble_central_ccs.cmd new file mode 100644 index 0000000..96f68e9 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ble_central_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * ble_central_ccs.cmd - CCS linker configuration file for ble_central. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/ble_central/ccs/.ccsimportspec b/boards/dk-tm4c129x/ble_central/ccs/.ccsimportspec new file mode 100644 index 0000000..45bc2ed --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/ble_central/ccs/.ccsproject b/boards/dk-tm4c129x/ble_central/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/ble_central/ccs/.cproject b/boards/dk-tm4c129x/ble_central/ccs/.cproject new file mode 100644 index 0000000..4e1735b --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/ble_central/ccs/.project b/boards/dk-tm4c129x/ble_central/ccs/.project new file mode 100644 index 0000000..0c9843d --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ccs/.project @@ -0,0 +1,85 @@ + + + ble_central + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + ble_central.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/ble_central/ble_central.c + + + ble_central_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/ble_central/ble_central_ccs.cmd + + + gap.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/ble_central/gap.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/ble_central/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/ble_central/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/ble_central/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/ble_central/ccs/Debug/ble_central.bin b/boards/dk-tm4c129x/ble_central/ccs/Debug/ble_central.bin new file mode 100644 index 0000000..e0dd72c Binary files /dev/null and b/boards/dk-tm4c129x/ble_central/ccs/Debug/ble_central.bin differ diff --git a/boards/dk-tm4c129x/ble_central/ccs/Debug/ble_central.out b/boards/dk-tm4c129x/ble_central/ccs/Debug/ble_central.out new file mode 100644 index 0000000..77f2e2e Binary files /dev/null and b/boards/dk-tm4c129x/ble_central/ccs/Debug/ble_central.out differ diff --git a/boards/dk-tm4c129x/ble_central/ccs/macros.ini_initial b/boards/dk-tm4c129x/ble_central/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/ble_central/ccs/target_config.ccxml b/boards/dk-tm4c129x/ble_central/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/ble_central/ewarm/Exe/ble_central.bin b/boards/dk-tm4c129x/ble_central/ewarm/Exe/ble_central.bin new file mode 100644 index 0000000..4759a71 Binary files /dev/null and b/boards/dk-tm4c129x/ble_central/ewarm/Exe/ble_central.bin differ diff --git a/boards/dk-tm4c129x/ble_central/ewarm/Exe/ble_central.out b/boards/dk-tm4c129x/ble_central/ewarm/Exe/ble_central.out new file mode 100644 index 0000000..6c8f670 Binary files /dev/null and b/boards/dk-tm4c129x/ble_central/ewarm/Exe/ble_central.out differ diff --git a/boards/dk-tm4c129x/ble_central/gap.c b/boards/dk-tm4c129x/ble_central/gap.c new file mode 100644 index 0000000..086b21c --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/gap.c @@ -0,0 +1,371 @@ +//***************************************************************************** +// +// gap.c - GAP configuration and control APIs +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "hci.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +// TX buffer used by all APIs. +// +//***************************************************************************** +uint8_t g_pui8TXBuf[64]; +uint8_t g_ui8TXLen; + +//***************************************************************************** +// +// Forward reference of functions used in this file. +// +//***************************************************************************** +extern void UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count); +extern void DumpBuffer(uint8_t *pui8Buf, uint32_t ui32Len, bool bTX); + +//***************************************************************************** +// +// GAP Device Initialization Request +// +//***************************************************************************** +void +GAPDeviceInit(uint8_t ui8ProfileRole, + uint8_t ui8MaxScanRsps, + uint8_t *pui8IRK, + uint8_t *pui8SRK, + uint32_t ui32SignCounter) +{ + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_VE_GAP_DEVICE_INIT_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (HCI_VE_GAP_DEVICE_INIT_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 38; + g_pui8TXBuf[g_ui8TXLen++] = ui8ProfileRole; + g_pui8TXBuf[g_ui8TXLen++] = ui8MaxScanRsps; + memcpy(g_pui8TXBuf + g_ui8TXLen, pui8IRK, 16); + g_ui8TXLen +=16; + memcpy(g_pui8TXBuf + g_ui8TXLen, pui8SRK, 16); + g_ui8TXLen +=16; + g_pui8TXBuf[g_ui8TXLen++] = ui32SignCounter & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (ui32SignCounter >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (ui32SignCounter >> 16) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (ui32SignCounter >> 24) & 0xFF; + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; +} + +//***************************************************************************** +// +// GAP Get Parameter Request. +// +//***************************************************************************** +void +GAPGetParam(uint8_t ui8ParamID) +{ + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_VE_GAP_GET_PARAM_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (HCI_VE_GAP_GET_PARAM_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 1; + g_pui8TXBuf[g_ui8TXLen++] = ui8ParamID; + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; +} + +//***************************************************************************** +// +// GAP Set Parameter request. +// +//***************************************************************************** +void +GAPSetParam(uint8_t ui8ParamID, uint16_t ui16Value) +{ + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_VE_GAP_SET_PARAM_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (HCI_VE_GAP_SET_PARAM_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 3; + g_pui8TXBuf[g_ui8TXLen++] = ui8ParamID; + g_pui8TXBuf[g_ui8TXLen++] = ui16Value & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (ui16Value >> 8) & 0xFF; + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; +} + +//***************************************************************************** +// +// Start Discovery Request. +// +//***************************************************************************** +void +GAPDiscoveryReq(uint8_t ui8Mode, bool bActiveScan, bool bWhiteList) +{ + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_VE_GAP_DEVICE_DISC_REQ_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (HCI_VE_GAP_DEVICE_DISC_REQ_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 3; + g_pui8TXBuf[g_ui8TXLen++] = ui8Mode; + g_pui8TXBuf[g_ui8TXLen++] = bActiveScan; + g_pui8TXBuf[g_ui8TXLen++] = bWhiteList; + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; +} + +//***************************************************************************** +// +// Establish Link Request. +// +//***************************************************************************** +void +GAPEstLinkReq(bool bHighDutyCycle, bool bWhiteList, + uint8_t ui8AddrType, uint8_t *pui8DevAddr) +{ + uint8_t ui8Idx; + + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_VE_GAP_DEVICE_EST_LINK_REQ_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = + (HCI_VE_GAP_DEVICE_EST_LINK_REQ_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 9; + g_pui8TXBuf[g_ui8TXLen++] = bHighDutyCycle; + g_pui8TXBuf[g_ui8TXLen++] = bWhiteList; + g_pui8TXBuf[g_ui8TXLen++] = ui8AddrType; + for(ui8Idx = 0; ui8Idx < HCI_BDADDR_LEN; ui8Idx++) + { + g_pui8TXBuf[g_ui8TXLen++] = pui8DevAddr[ui8Idx]; + } + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; +} + +//***************************************************************************** +// +// Terminate Link Request. +// +//***************************************************************************** +void +GAPTerLinkReq(uint16_t ui16ConnHandle, uint8_t ui8Reason) +{ + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_VE_GAP_DEVICE_TER_LINK_REQ_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = + (HCI_VE_GAP_DEVICE_TER_LINK_REQ_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 3; + g_pui8TXBuf[g_ui8TXLen++] = ui16ConnHandle & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (ui16ConnHandle >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = ui8Reason; + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; +} + +//***************************************************************************** +// +// Start Pairing Request. +// +//***************************************************************************** +void +GAPAuthenticate(uint16_t ui16ConnHandle) +{ + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_VE_GAP_DEVICE_AUTHENTICATE_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = + (HCI_VE_GAP_DEVICE_AUTHENTICATE_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 29; + g_pui8TXBuf[g_ui8TXLen++] = ui16ConnHandle & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (ui16ConnHandle >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 0x04; //KeyboardDisplay + g_pui8TXBuf[g_ui8TXLen++] = 0x00; //oob false + memset(&g_pui8TXBuf[g_ui8TXLen], 0, 16); + g_ui8TXLen +=16; + g_pui8TXBuf[g_ui8TXLen++] = 0x05; //AuthReq + g_pui8TXBuf[g_ui8TXLen++] = 0x10; // MaxEKeySize + g_pui8TXBuf[g_ui8TXLen++] = 0x3F; // KeyDist + g_pui8TXBuf[g_ui8TXLen++] = 0x00; // Pair.enable + g_pui8TXBuf[g_ui8TXLen++] = 0x03; // Pair.ioCaps + g_pui8TXBuf[g_ui8TXLen++] = 0x00; // Pair.oobDFlag + + g_pui8TXBuf[g_ui8TXLen++] = 0x01; // Pair.authReq + g_pui8TXBuf[g_ui8TXLen++] = 0x10; // MaxEKeySize + g_pui8TXBuf[g_ui8TXLen++] = 0x3F; // KeyDist + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; +} + +//***************************************************************************** +// +// PASS key during Authentication. +// +//***************************************************************************** +void +GAPPassKeyUpdate(uint16_t ui16ConnHandle, char *pcPassCode) +{ + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_VE_GAP_DEVICE_PASSKEY_UPDATE_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = + (HCI_VE_GAP_DEVICE_PASSKEY_UPDATE_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 8; + g_pui8TXBuf[g_ui8TXLen++] = ui16ConnHandle & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (ui16ConnHandle >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = pcPassCode[0]; + g_pui8TXBuf[g_ui8TXLen++] = pcPassCode[1]; + g_pui8TXBuf[g_ui8TXLen++] = pcPassCode[2]; + g_pui8TXBuf[g_ui8TXLen++] = pcPassCode[3]; + g_pui8TXBuf[g_ui8TXLen++] = pcPassCode[4]; + g_pui8TXBuf[g_ui8TXLen++] = pcPassCode[5]; + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; +} + +//***************************************************************************** +// +// GAP Bonding Request. +// +//***************************************************************************** +void +GAPBond(uint16_t ui16ConnHandle, tLTKData *psSavedKey) +{ + uint8_t ui8Loop; + + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_VE_GAP_DEVICE_BOND_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (HCI_VE_GAP_DEVICE_BOND_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 30; + g_pui8TXBuf[g_ui8TXLen++] = ui16ConnHandle & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (ui16ConnHandle >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = psSavedKey->bAuth; + for(ui8Loop = 0; ui8Loop < psSavedKey->ui8LTKSize; ui8Loop++) + { + g_pui8TXBuf[g_ui8TXLen++] = psSavedKey->pui8LTK[ui8Loop]; + } + g_pui8TXBuf[g_ui8TXLen++] = psSavedKey->pui8DIV[0]; + g_pui8TXBuf[g_ui8TXLen++] = psSavedKey->pui8DIV[1]; + for(ui8Loop = 0; ui8Loop < 8; ui8Loop++) + { + g_pui8TXBuf[g_ui8TXLen++] = psSavedKey->pui8Rand[ui8Loop]; + } + g_pui8TXBuf[g_ui8TXLen++] = psSavedKey->ui8LTKSize; + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; +} + +//***************************************************************************** +// +// Read Characteristic Value. +// +//***************************************************************************** +void +GAPReadCharValue(uint16_t ui16ConnHandle, uint16_t ui16Handle) +{ + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_VE_GAP_DEVICE_READ_CHAR_VAL_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = + (HCI_VE_GAP_DEVICE_READ_CHAR_VAL_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 4; + g_pui8TXBuf[g_ui8TXLen++] = ui16ConnHandle & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = ui16ConnHandle & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = ui16Handle & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (ui16Handle >> 8) & 0xFF; + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; + +} + +//***************************************************************************** +// +// Write Characteristic Value request. +// +//***************************************************************************** +void +GAPWriteCharValue(uint16_t ui16ConnHandle, uint16_t ui16Handle, + uint8_t *pui8Buf, uint8_t ui8Len) +{ + uint8_t ui8Loop; + + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = + (HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 4 + ui8Len; + g_pui8TXBuf[g_ui8TXLen++] = ui16ConnHandle & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = ui16ConnHandle & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = ui16Handle & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (ui16Handle >> 8) & 0xFF; + for(ui8Loop = 0; ui8Loop < ui8Len; ui8Loop++) + { + g_pui8TXBuf[g_ui8TXLen++] = pui8Buf[ui8Loop]; + } + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; +} + +//***************************************************************************** +// +// Read RSSI Value Request. +// +//***************************************************************************** +void +HCIReadRSSI(uint16_t ui16ConnHandle) +{ + g_ui8TXLen = 0; + g_pui8TXBuf[g_ui8TXLen++] = HCI_CMD_PACKET; + g_pui8TXBuf[g_ui8TXLen++] = HCI_READ_RSSI_OPCODE & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (HCI_READ_RSSI_OPCODE >> 8) & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = 2; + g_pui8TXBuf[g_ui8TXLen++] = ui16ConnHandle & 0xFF; + g_pui8TXBuf[g_ui8TXLen++] = (ui16ConnHandle >>8) & 0xFF; + + DumpBuffer((uint8_t*)g_pui8TXBuf, g_ui8TXLen, true); + UARTSend((const uint8_t*)g_pui8TXBuf, g_ui8TXLen); + return; +} diff --git a/boards/dk-tm4c129x/ble_central/gcc/ble_central.axf b/boards/dk-tm4c129x/ble_central/gcc/ble_central.axf new file mode 100644 index 0000000..ea891ff Binary files /dev/null and b/boards/dk-tm4c129x/ble_central/gcc/ble_central.axf differ diff --git a/boards/dk-tm4c129x/ble_central/gcc/ble_central.bin b/boards/dk-tm4c129x/ble_central/gcc/ble_central.bin new file mode 100644 index 0000000..a1b24e6 Binary files /dev/null and b/boards/dk-tm4c129x/ble_central/gcc/ble_central.bin differ diff --git a/boards/dk-tm4c129x/ble_central/hci.h b/boards/dk-tm4c129x/ble_central/hci.h new file mode 100644 index 0000000..c5680cf --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/hci.h @@ -0,0 +1,329 @@ +//***************************************************************************** +// +// hci.h - This file contains the types, contants, external functions +// etc. for the BLE HCI Transport Layer. +// This file copied most of #defines from BLE-Stack 1.3.2 release +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef HCI_H +#define HCI_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +// +// Long Term Key info +// +typedef struct +{ + bool bValid; + bool bAuth; + uint8_t ui8LTKSize; + uint8_t pui8LTK[16]; + uint8_t pui8DIV[2]; + uint8_t pui8Rand[8]; +} tLTKData; + +#define HCI_BDADDR_LEN 6 + +// +// HCI Packet Types +// +#define HCI_CMD_PACKET 0x01 +#define HCI_ACL_DATA_PACKET 0x02 +#define HCI_SCO_DATA_PACKET 0x03 +#define HCI_EVENT_PACKET 0x04 + +// +// Vendor Specific Command Opcode +// +#define HCI_VE_GAP_DEVICE_INIT_OPCODE 0xFE00 +#define HCI_VE_GAP_DEVICE_DISC_REQ_OPCODE 0xFE04 +#define HCI_VE_GAP_DEVICE_EST_LINK_REQ_OPCODE 0xFE09 +#define HCI_VE_GAP_DEVICE_TER_LINK_REQ_OPCODE 0xFE0A +#define HCI_VE_GAP_DEVICE_AUTHENTICATE_OPCODE 0xFE0B +#define HCI_VE_GAP_DEVICE_PASSKEY_UPDATE_OPCODE 0xFE0C +#define HCI_VE_GAP_DEVICE_BOND_OPCODE 0xFE0F +#define HCI_VE_GAP_SET_PARAM_OPCODE 0xFE30 +#define HCI_VE_GAP_GET_PARAM_OPCODE 0xFE31 +#define HCI_VE_GAP_DEVICE_READ_CHAR_VAL_OPCODE 0xFD8A +#define HCI_VE_GAP_DEVICE_WRITE_CHAR_VAL_OPCODE 0xFD92 + +// +// BLE Command Opcode +// +#define HCI_READ_RSSI_OPCODE 0x1405 + +// +// Characteristic Value Handle +// +#define GATT_IRTEMP_DATA_UUID_HANDLE 0x25 +#define GATT_IRTEMP_NOTIFY_UUID_HANDLE 0x26 +#define GATT_IRTEMP_CFG_UUID_HANDLE 0x29 +#define GATT_HUMIDITY_DATA_UUID_HANDLE 0x38 +#define GATT_HUMIDITY_NOTIDY_UUID_HANDLE 0x39 +#define GATT_HUMIDITY_CFG_UUID_HANDLE 0x3C + +// +// GAP Profile Roles Bit mask values +// +#define GAP_PROFILE_BROADCASTER 0x01 //A device that sends advertising events only. +#define GAP_PROFILE_OBSERVER 0x02 //A device that receives advertising events only. +#define GAP_PROFILE_PERIPHERAL 0x04 //A device that accepts the establishment of an LE physical link using the connection establishment procedure +#define GAP_PROFILE_CENTRAL 0x08 //A device that supports the Central role initiates the establishment of a physical connection + + +// +// GAP_PARAMETER_ID_DEFINES GAP Parameter IDs +// +#define TGAP_GEN_DISC_ADV_MIN 0 //!< Minimum time to remain advertising, when in Discoverable mode (mSec). Setting this parameter to 0 turns off the timeout (default). +#define TGAP_LIM_ADV_TIMEOUT 1 //!< Maximum time to remain advertising, when in Limited Discoverable mode. In seconds (default 180 seconds) +#define TGAP_GEN_DISC_SCAN 2 //!< Minimum time to perform scanning, when performing General Discovery proc (mSec) +#define TGAP_LIM_DISC_SCAN 3 //!< Minimum time to perform scanning, when performing Limited Discovery proc (mSec) +#define TGAP_CONN_EST_ADV_TIMEOUT 4 //!< Advertising timeout, when performing Connection Establishment proc (mSec) +#define TGAP_CONN_PARAM_TIMEOUT 5 //!< Link Layer connection parameter update notification timer, connection parameter update proc (mSec) + +// Constants +#define TGAP_LIM_DISC_ADV_INT_MIN 6 //!< Minimum advertising interval, when in limited discoverable mode (n * 0.625 mSec) +#define TGAP_LIM_DISC_ADV_INT_MAX 7 //!< Maximum advertising interval, when in limited discoverable mode (n * 0.625 mSec) +#define TGAP_GEN_DISC_ADV_INT_MIN 8 //!< Minimum advertising interval, when in General discoverable mode (n * 0.625 mSec) +#define TGAP_GEN_DISC_ADV_INT_MAX 9 //!< Maximum advertising interval, when in General discoverable mode (n * 0.625 mSec) +#define TGAP_CONN_ADV_INT_MIN 10 //!< Minimum advertising interval, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_ADV_INT_MAX 11 //!< Maximum advertising interval, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_SCAN_INT 12 //!< Scan interval used during Link Layer Initiating state, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_SCAN_WIND 13 //!< Scan window used during Link Layer Initiating state, when in Connectable mode (n * 0.625 mSec) +#define TGAP_CONN_HIGH_SCAN_INT 14 //!< Scan interval used during Link Layer Initiating state, when in Connectable mode, high duty scan cycle scan paramaters (n * 0.625 mSec) +#define TGAP_CONN_HIGH_SCAN_WIND 15 //!< Scan window used during Link Layer Initiating state, when in Connectable mode, high duty scan cycle scan paramaters (n * 0.625 mSec) +#define TGAP_GEN_DISC_SCAN_INT 16 //!< Scan interval used during Link Layer Scanning state, when in General Discovery proc (n * 0.625 mSec) +#define TGAP_GEN_DISC_SCAN_WIND 17 //!< Scan window used during Link Layer Scanning state, when in General Discovery proc (n * 0.625 mSec) +#define TGAP_LIM_DISC_SCAN_INT 18 //!< Scan interval used during Link Layer Scanning state, when in Limited Discovery proc (n * 0.625 mSec) +#define TGAP_LIM_DISC_SCAN_WIND 19 //!< Scan window used during Link Layer Scanning state, when in Limited Discovery proc (n * 0.625 mSec) +#define TGAP_CONN_EST_ADV 20 //!< Advertising interval, when using Connection Establishment proc (n * 0.625 mSec). Obsolete - Do not use. +#define TGAP_CONN_EST_INT_MIN 21 //!< Minimum Link Layer connection interval, when using Connection Establishment proc (n * 1.25 mSec) +#define TGAP_CONN_EST_INT_MAX 22 //!< Maximum Link Layer connection interval, when using Connection Establishment proc (n * 1.25 mSec) +#define TGAP_CONN_EST_SCAN_INT 23 //!< Scan interval used during Link Layer Initiating state, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_CONN_EST_SCAN_WIND 24 //!< Scan window used during Link Layer Initiating state, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_CONN_EST_SUPERV_TIMEOUT 25 //!< Link Layer connection supervision timeout, when using Connection Establishment proc (n * 10 mSec) +#define TGAP_CONN_EST_LATENCY 26 //!< Link Layer connection slave latency, when using Connection Establishment proc (in number of connection events) +#define TGAP_CONN_EST_MIN_CE_LEN 27 //!< Local informational parameter about min len of connection needed, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_CONN_EST_MAX_CE_LEN 28 //!< Local informational parameter about max len of connection needed, when using Connection Establishment proc (n * 0.625 mSec) +#define TGAP_PRIVATE_ADDR_INT 29 //!< Minimum Time Interval between private (resolvable) address changes. In minutes (default 15 minutes) +#define TGAP_CONN_PAUSE_CENTRAL 30 //!< Central idle timer. In seconds (default 1 second) +#define TGAP_CONN_PAUSE_PERIPHERAL 31 //!< Minimum time upon connection establishment before the peripheral starts a connection update procedure. In seconds (default 5 seconds) + +// Proprietary +#define TGAP_SM_TIMEOUT 32 //!< SM Message Timeout (milliseconds). Default 30 seconds. +#define TGAP_SM_MIN_KEY_LEN 33 //!< SM Minimum Key Length supported. Default 7. +#define TGAP_SM_MAX_KEY_LEN 34 //!< SM Maximum Key Length supported. Default 16. +#define TGAP_FILTER_ADV_REPORTS 35 //!< Filter duplicate advertising reports. Default TRUE. +#define TGAP_SCAN_RSP_RSSI_MIN 36 //!< Minimum RSSI required for scan responses to be reported to the app. Default -127. + +// +// GAP Device Discovery Modes +// +#define DEVDISC_MODE_NONDISCOVERABLE 0x00 //!< No discoverable setting +#define DEVDISC_MODE_GENERAL 0x01 //!< General Discoverable devices +#define DEVDISC_MODE_LIMITED 0x02 //!< Limited Discoverable devices +#define DEVDISC_MODE_ALL 0x03 //!< Not filtered + +// +// GAP Address Types +// +#define ADDRTYPE_PUBLIC 0x00 //!< Use the BD_ADDR +#define ADDRTYPE_STATIC 0x01 //!< Static address +#define ADDRTYPE_PRIVATE_NONRESOLVE 0x02 //!< Generate Non-Resolvable Private Address +#define ADDRTYPE_PRIVATE_RESOLVE 0x03 //!< Generate Resolvable Private Address + +// +// GAP Advertiser Event Types +// +#define GAP_ADTYPE_ADV_IND 0x00 //!< Connectable undirected advertisement +#define GAP_ADTYPE_ADV_DIRECT_IND 0x01 //!< Connectable directed advertisement +#define GAP_ADTYPE_ADV_DISCOVER_IND 0x02 //!< Discoverable undirected advertisement +#define GAP_ADTYPE_ADV_NONCONN_IND 0x03 //!< Non-Connectable undirected advertisement +#define GAP_ADTYPE_SCAN_RSP_IND 0x04 //!< Only used in gapDeviceInfoEvent_t + +// +// Vendor Specific Event Code +// +#define HCI_VE_EVENT_CODE 0xFF + +// Vendor Specific Event +#define GAP_HCI_EVENT_EXT_CMD_STATUS 0x067F +#define GAP_HCI_EVENT_EXT_DEVICE_INIT_DONE 0x0600 +#define GAP_HCI_EVENT_EXT_DEVICE_INFO 0x060D +#define GAP_HCI_EVENT_EXT_DEVICE_DISC_DONE 0x0601 +#define GAP_HCI_EVENT_EXT_DEVICE_LINK_DONE 0x0605 +#define GAP_HCI_EVENT_EXT_DEVICE_TERM_LINK_DONE 0x0606 +#define GAP_HCI_EVENT_EXT_DEVICE_PASSKEY_NEEDED 0x060B +#define GAP_HCI_EVENT_EXT_DEVICE_AUTHENTICATE_DONE 0x060A +#define GAP_HCI_EVENT_EXT_DEVICE_BOND_DONE 0x060E +#define GAP_HCI_EVENT_EXT_ATT_READ_RSP 0x050B +#define GAP_HCI_EVENT_EXT_ATT_WRITE_RSP 0x0513 +#define GAP_HCI_EVENT_CMD_COMPLETE 0x0E +#define HCI_ATT_ERROR_RSP_EVENT 0x0501 +#define GAP_HCI_EVENT_HANDLE_VALUE_NOTIFY 0x051B + +/* +** HCI Status +** +** Per the Bluetooth Core Specification, V4.0.0, Vol. 2, Part D. +*/ +#define HCI_SUCCESS 0x00 +#define HCI_ERROR_CODE_UNKNOWN_HCI_CMD 0x01 +#define HCI_ERROR_CODE_UNKNOWN_CONN_ID 0x02 +#define HCI_ERROR_CODE_HW_FAILURE 0x03 +#define HCI_ERROR_CODE_PAGE_TIMEOUT 0x04 +#define HCI_ERROR_CODE_AUTH_FAILURE 0x05 +#define HCI_ERROR_CODE_PIN_KEY_MISSING 0x06 +#define HCI_ERROR_CODE_MEM_CAP_EXCEEDED 0x07 +#define HCI_ERROR_CODE_CONN_TIMEOUT 0x08 +#define HCI_ERROR_CODE_CONN_LIMIT_EXCEEDED 0x09 +#define HCI_ERROR_CODE_SYNCH_CONN_LIMIT_EXCEEDED 0x0A +#define HCI_ERROR_CODE_ACL_CONN_ALREADY_EXISTS 0x0B +#define HCI_ERROR_CODE_CMD_DISALLOWED 0x0C +#define HCI_ERROR_CODE_CONN_REJ_LIMITED_RESOURCES 0x0D +#define HCI_ERROR_CODE_CONN_REJECTED_SECURITY_REASONS 0x0E +#define HCI_ERROR_CODE_CONN_REJECTED_UNACCEPTABLE_BDADDR 0x0F +#define HCI_ERROR_CODE_CONN_ACCEPT_TIMEOUT_EXCEEDED 0x10 +#define HCI_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE 0x11 +#define HCI_ERROR_CODE_INVALID_HCI_CMD_PARAMS 0x12 +#define HCI_ERROR_CODE_REMOTE_USER_TERM_CONN 0x13 +#define HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_LOW_RESOURCES 0x14 +#define HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_POWER_OFF 0x15 +#define HCI_ERROR_CODE_CONN_TERM_BY_LOCAL_HOST 0x16 +#define HCI_ERROR_CODE_REPEATED_ATTEMPTS 0x17 +#define HCI_ERROR_CODE_PAIRING_NOT_ALLOWED 0x18 +#define HCI_ERROR_CODE_UNKNOWN_LMP_PDU 0x19 +#define HCI_ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE 0x1A +#define HCI_ERROR_CODE_SCO_OFFSET_REJ 0x1B +#define HCI_ERROR_CODE_SCO_INTERVAL_REJ 0x1C +#define HCI_ERROR_CODE_SCO_AIR_MODE_REJ 0x1D +#define HCI_ERROR_CODE_INVALID_LMP_PARAMS 0x1E +#define HCI_ERROR_CODE_UNSPECIFIED_ERROR 0x1F +#define HCI_ERROR_CODE_UNSUPPORTED_LMP_PARAM_VAL 0x20 +#define HCI_ERROR_CODE_ROLE_CHANGE_NOT_ALLOWED 0x21 +#define HCI_ERROR_CODE_LMP_LL_RESP_TIMEOUT 0x22 +#define HCI_ERROR_CODE_LMP_ERR_TRANSACTION_COLLISION 0x23 +#define HCI_ERROR_CODE_LMP_PDU_NOT_ALLOWED 0x24 +#define HCI_ERROR_CODE_ENCRYPT_MODE_NOT_ACCEPTABLE 0x25 +#define HCI_ERROR_CODE_LINK_KEY_CAN_NOT_BE_CHANGED 0x26 +#define HCI_ERROR_CODE_REQ_QOS_NOT_SUPPORTED 0x27 +#define HCI_ERROR_CODE_INSTANT_PASSED 0x28 +#define HCI_ERROR_CODE_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED 0x29 +#define HCI_ERROR_CODE_DIFFERENT_TRANSACTION_COLLISION 0x2A +#define HCI_ERROR_CODE_RESERVED1 0x2B +#define HCI_ERROR_CODE_QOS_UNACCEPTABLE_PARAM 0x2C +#define HCI_ERROR_CODE_QOS_REJ 0x2D +#define HCI_ERROR_CODE_CHAN_ASSESSMENT_NOT_SUPPORTED 0x2E +#define HCI_ERROR_CODE_INSUFFICIENT_SECURITY 0x2F +#define HCI_ERROR_CODE_PARAM_OUT_OF_MANDATORY_RANGE 0x30 +#define HCI_ERROR_CODE_RESERVED2 0x31 +#define HCI_ERROR_CODE_ROLE_SWITCH_PENDING 0x32 +#define HCI_ERROR_CODE_RESERVED3 0x33 +#define HCI_ERROR_CODE_RESERVED_SLOT_VIOLATION 0x34 +#define HCI_ERROR_CODE_ROLE_SWITCH_FAILED 0x35 +#define HCI_ERROR_CODE_EXTENDED_INQUIRY_RESP_TOO_LARGE 0x36 +#define HCI_ERROR_CODE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST 0x37 +#define HCI_ERROR_CODE_HOST_BUSY_PAIRING 0x38 +#define HCI_ERROR_CODE_CONN_REJ_NO_SUITABLE_CHAN_FOUND 0x39 +#define HCI_ERROR_CODE_CONTROLLER_BUSY 0x3A +#define HCI_ERROR_CODE_UNACCEPTABLE_CONN_INTERVAL 0x3B +#define HCI_ERROR_CODE_DIRECTED_ADV_TIMEOUT 0x3C +#define HCI_ERROR_CODE_CONN_TERM_MIC_FAILURE 0x3D +#define HCI_ERROR_CODE_CONN_FAILED_TO_ESTABLISH 0x3E +#define HCI_ERROR_CODE_MAC_CONN_FAILED 0x3F + +// +// Generic Status Return Values +// +#define SUCCESS 0x00 +#define FAILURE 0x01 +#define INVALIDPARAMETER 0x02 +#define INVALID_TASK 0x03 +#define MSG_BUFFER_NOT_AVAIL 0x04 +#define INVALID_MSG_POINTER 0x05 +#define INVALID_EVENT_ID 0x06 +#define INVALID_INTERRUPT_ID 0x07 +#define NO_TIMER_AVAIL 0x08 +#define NV_ITEM_UNINIT 0x09 +#define NV_OPER_FAILED 0x0A +#define INVALID_MEM_SIZE 0x0B +#define NV_BAD_ITEM_LEN 0x0C + +#define bleNotReady 0x10 //!< Not ready to perform task +#define bleAlreadyInRequestedMode 0x11 //!< Already performing that task +#define bleIncorrectMode 0x12 //!< Not setup properly to perform that task +#define bleMemAllocError 0x13 //!< Memory allocation error occurred +#define bleNotConnected 0x14 //!< Can't perform function when not in a connection +#define bleNoResources 0x15 //!< There are no resource available +#define blePending 0x16 //!< Waiting +#define bleTimeout 0x17 //!< Timed out performing function +#define bleInvalidRange 0x18 //!< A parameter is out of range +#define bleLinkEncrypted 0x19 //!< The link is already encrypted +#define bleProcedureComplete 0x1A //!< The Procedure is completed + +// GAP Status Return Values - returned as bStatus_t +#define bleGAPUserCanceled 0x30 //!< The user canceled the task +#define bleGAPConnNotAcceptable 0x31 //!< The connection was not accepted +#define bleGAPBondRejected 0x32 //!< The bound information was rejected. + +// ATT Status Return Values - returned as bStatus_t +#define bleInvalidPDU 0x40 //!< The attribute PDU is invalid +#define bleInsufficientAuthen 0x41 //!< The attribute has insufficient authentication +#define bleInsufficientEncrypt 0x42 //!< The attribute has insufficient encryption +#define bleInsufficientKeySize 0x43 //!< The attribute has insufficient encryption key size + +// Disconnect Reasons +#define HCI_DISCONNECT_AUTH_FAILURE HCI_ERROR_CODE_AUTH_FAILURE +#define HCI_DISCONNECT_REMOTE_USER_TERM HCI_ERROR_CODE_REMOTE_USER_TERM_CONN +#define HCI_DISCONNECT_REMOTE_DEV_LOW_RESOURCES HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_LOW_RESOURCES +#define HCI_DISCONNECT_REMOTE_DEV_POWER_OFF HCI_ERROR_CODE_REMOTE_DEVICE_TERM_CONN_POWER_OFF +#define HCI_DISCONNECT_UNSUPPORTED_REMOTE_FEATURE HCI_ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE +#define HCI_DISCONNECT_KEY_PAIRING_NOT_SUPPORTED HCI_ERROR_CODE_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED +#define HCI_DISCONNECT_UNACCEPTABLE_CONN_INTERVAL HCI_ERROR_CODE_UNACCEPTABLE_CONN_INTERVAL + +extern void GAPDeviceInit(uint8_t ui8ProfileRole, + uint8_t ui8MaxScanRsps, + uint8_t *pui8IRK, + uint8_t *pui8SRK, + uint32_t ui32SignCounter); +extern void GAPGetParam(uint8_t ui8ParamID); +extern void GAPSetParam(uint8_t ui8ParamID, uint16_t ui16Value); +extern void GAPDiscoveryReq(uint8_t ui8Mode, bool bActiveScan, bool bWhiteList); +extern void GAPEstLinkReq(bool bHighDutyCycle, bool bWhiteList, + uint8_t ui8AddrType, uint8_t *pui8DevAddr); +extern void GAPTerLinkReq(uint16_t ui16ConnHandle, uint8_t ui8Reason); +extern void GAPAuthenticate(uint16_t ui16ConnHandle); +extern void GAPPassKeyUpdate(uint16_t ui16ConnHandle, char *pcPassCode); +extern void GAPBond(uint16_t ui16ConnHandle, tLTKData *psSavedKey); +extern void GAPReadCharValue(uint16_t ui16ConnHandle, uint16_t ui16Handle); +extern void GAPWriteCharValue(uint16_t ui16ConnHandle, uint16_t ui16Handle, + uint8_t *pui8Buf, uint8_t ui8Len); +extern void HCIReadRSSI(uint16_t ui16ConnHandle); +#ifdef __cplusplus +} +#endif + +#endif /* HCI_H */ diff --git a/boards/dk-tm4c129x/ble_central/readme.txt b/boards/dk-tm4c129x/ble_central/readme.txt new file mode 100644 index 0000000..b703699 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/readme.txt @@ -0,0 +1,94 @@ +BLE Central Device Demonstration + +This application provides a demonstration use of Bluetooth Low Energy +central device by utilizing TI’s BLE CC2540 Evaluation Module and +SesorTags. + +By connecting a CC2540 EM board to the EM header on the TM4C129X development +board, the TM4C129X can communicate with the CC2540 by means of +vendor-specific HCI commands using the UART interface. This application can +discover up to three SensorTag devices, it can connect to any one of them, +perform pairing and bonding, read some sensor data and RSSI data from the +slave, and display the information on the LCD display. + +This application can discover any BLE device although it may not be +able to make a connection to a device other than a SensorTag/CC2540 as the +bonding process will likely fail due to the use of a default passcode. +We have tested this application with SensorTag and CC2540 Development +boards (SmartRF05EB + CC2540 EM) with the SimpleBLEPeripheral +sample application programmed. It can successfully bond with both boards +since the same default passcode is expected. Both SensorTag and CC2540 +devices have BLE Stack 1.4.0 release code programmed. + +CC2540 device should be programmed with the HostTestRelease +(Network Processor) application. A hex file containing the this application +can be found in the BLE stack 1.4.0 release under +C:\\...\\BLE-CC254x-1.4.0\\Accessories\\HexFiles\\ +CC2540_SmartRF_HostTestRelease_All.hex. Please refer to the Bluetooth Low +Energy CC2540 Development Kit User's Guide for information on how to load +the hex file to the CC2540. This User's Guide can be found in +http://www.ti.com/lit/ug/swru301a/swru301a.pdf + +On the TM4C129X development board, make sure that jumpers PJ0 and PJ1 +are connected to the "EM_UART" side which allows UART3 TX and RX signals to +be routed to the EM header. UART3 is used as the communication channel +between the CC2540 device and the TM4C129X device. + +Once the application starts, it will verify the serial connection by +sending the CC2540 device a vendor-specific HCI command, and waiting for the +expected responses within a short time period. Once the physical connection +between TM4C129X and CC2540 is verified, the device will automatically +start to discover BLE peripheral device. If no devices are found within 20 +seconds, the application will timeout and display "No Device Found", +otherwise the discovered device names will be shown on the display. +Touching any of the device names will start the process of establishing a +connection with that device. This sample application always tries to make +a secure connection by pairing the device with default passcode "00000". +Upon successfully linking and pairing, application will start querying +sensor data, including IR temperature, ambient temperature, humidity and +RSSI. + +Whe run inside, IR and ambient temperature should typically be in the low +20s (Celsius). You can place the SensorTag near a hot object (such as a +cup of coffee) to verify that the IR temperature increases. You can move +the SensorTag further from the TM4C129X development board to verify that +its RSSI reading will decrease. + +At any time after the connection is established, you can touch the +"disconnect" button on the bottom of the screen to terminate the +connection with the peripheral device. + +In order to make the SensorTag discoverable by a central device, the +SensorTag needs to be in the discovery mode. The LED in the middle of the +board will blink periodically if the SensorTag is in discovery mode. If the +LED is not blinking, pressing the side button on the SensorTag should +place it in discovery mode. Once it is connected to a central device, +the LED should be off, pressing the side button while it is connected will +terminate the connection and put the SensorTag in discovery mode again. +For more information on SensorTag, please visit +http://processors.wiki.ti.com/index.php/Bluetooth_SensorTag + +Every HCI command and event are output to the UART console for +debugging purpose. The UART terminal should be configured in 115,200 baud, +8-n-1 mode. + + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/ble_central/rvmdk/ble_central.axf b/boards/dk-tm4c129x/ble_central/rvmdk/ble_central.axf new file mode 100644 index 0000000..03e170b Binary files /dev/null and b/boards/dk-tm4c129x/ble_central/rvmdk/ble_central.axf differ diff --git a/boards/dk-tm4c129x/ble_central/rvmdk/ble_central.bin b/boards/dk-tm4c129x/ble_central/rvmdk/ble_central.bin new file mode 100644 index 0000000..2a4a4ba Binary files /dev/null and b/boards/dk-tm4c129x/ble_central/rvmdk/ble_central.bin differ diff --git a/boards/dk-tm4c129x/ble_central/startup_ccs.c b/boards/dk-tm4c129x/ble_central/startup_ccs.c new file mode 100644 index 0000000..156d185 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickIntHandler(void); +extern void UART3IntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + UART3IntHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/ble_central/startup_ewarm.c b/boards/dk-tm4c129x/ble_central/startup_ewarm.c new file mode 100644 index 0000000..9852a56 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickIntHandler(void); +extern void UART3IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + UART3IntHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/ble_central/startup_gcc.c b/boards/dk-tm4c129x/ble_central/startup_gcc.c new file mode 100644 index 0000000..851b511 --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickIntHandler(void); +extern void UART3IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + UART3IntHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/ble_central/startup_rvmdk.S b/boards/dk-tm4c129x/ble_central/startup_rvmdk.S new file mode 100644 index 0000000..af8433a --- /dev/null +++ b/boards/dk-tm4c129x/ble_central/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SysTickIntHandler + EXTERN UART3IntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD UART3IntHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/blinky/Makefile b/boards/dk-tm4c129x/blinky/Makefile new file mode 100644 index 0000000..e672a7f --- /dev/null +++ b/boards/dk-tm4c129x/blinky/Makefile @@ -0,0 +1,77 @@ +#****************************************************************************** +# +# Makefile - Rules for building the blinky example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the blinky example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/blinky.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the blinky example. +# +${COMPILER}/blinky.axf: ${COMPILER}/blinky.o +${COMPILER}/blinky.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/blinky.axf: blinky.ld +SCATTERgcc_blinky=blinky.ld +ENTRY_blinky=ResetISR + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/blinky/blinky.c b/boards/dk-tm4c129x/blinky/blinky.c new file mode 100644 index 0000000..d9c0873 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/blinky.c @@ -0,0 +1,93 @@ +//***************************************************************************** +// +// blinky.c - Simple example to blink the on-board LED. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/tm4c129xnczad.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Blinky (blinky)

+//! +//! A very simple example that blinks the on-board LED. +// +//***************************************************************************** + +//***************************************************************************** +// +// Blink the on-board LED. +// +//***************************************************************************** +int +main(void) +{ + volatile uint32_t ui32Loop; + + // + // Enable the GPIO port that is used for the on-board LED. + // + SYSCTL_RCGCGPIO_R = SYSCTL_RCGCGPIO_R14; + + // + // Do a dummy read to insert a few cycles after enabling the peripheral. + // + ui32Loop = SYSCTL_RCGCGPIO_R; + + // + // Enable the GPIO pin for the LED (PQ7). Set the direction as output, and + // enable the GPIO pin for digital function. + // + GPIO_PORTQ_DIR_R = 0x80; + GPIO_PORTQ_DEN_R = 0x80; + + // + // Loop forever. + // + while(1) + { + // + // Turn on the LED. + // + GPIO_PORTQ_DATA_R |= 0x80; + + // + // Delay for a bit. + // + for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++) + { + } + + // + // Turn off the LED. + // + GPIO_PORTQ_DATA_R &= ~(0x80); + + // + // Delay for a bit. + // + for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++) + { + } + } +} diff --git a/boards/dk-tm4c129x/blinky/blinky.ewd b/boards/dk-tm4c129x/blinky/blinky.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/blinky/blinky.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/blinky/blinky.ewp b/boards/dk-tm4c129x/blinky/blinky.ewp new file mode 100644 index 0000000..39edba1 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/blinky.ewp @@ -0,0 +1,777 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Source + + $PROJ_DIR$\blinky.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/dk-tm4c129x/blinky/blinky.icf b/boards/dk-tm4c129x/blinky/blinky.icf new file mode 100644 index 0000000..38c73c9 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/blinky.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// blinky.icf - Linker configuration file for blinky. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/blinky/blinky.ld b/boards/dk-tm4c129x/blinky/blinky.ld new file mode 100644 index 0000000..141a76a --- /dev/null +++ b/boards/dk-tm4c129x/blinky/blinky.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * blinky.ld - Linker configuration file for blinky. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/blinky/blinky.sct b/boards/dk-tm4c129x/blinky/blinky.sct new file mode 100644 index 0000000..ba355e7 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/blinky.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; blinky.sct - Linker configuration file for blinky. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/blinky/blinky.uvopt b/boards/dk-tm4c129x/blinky/blinky.uvopt new file mode 100644 index 0000000..07513f7 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/blinky.uvopt @@ -0,0 +1,268 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + blinky + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\blinky.c + blinky.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Documentation + 1 + 0 + 0 + + 2 + 3 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/blinky/blinky.uvproj b/boards/dk-tm4c129x/blinky/blinky.uvproj new file mode 100644 index 0000000..21a46df --- /dev/null +++ b/boards/dk-tm4c129x/blinky/blinky.uvproj @@ -0,0 +1,414 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + blinky + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + blinky + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\blinky.bin .\rvmdk\blinky.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + blinky.sct + + + --entry Reset_Handler + + + + + + + + Source + + + blinky.c + 1 + .\blinky.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/blinky/blinky_ccs.cmd b/boards/dk-tm4c129x/blinky/blinky_ccs.cmd new file mode 100644 index 0000000..fdc9dcc --- /dev/null +++ b/boards/dk-tm4c129x/blinky/blinky_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * blinky_ccs.cmd - CCS linker configuration file for blinky. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 256; diff --git a/boards/dk-tm4c129x/blinky/ccs/.ccsimportspec b/boards/dk-tm4c129x/blinky/ccs/.ccsimportspec new file mode 100644 index 0000000..60cba3f --- /dev/null +++ b/boards/dk-tm4c129x/blinky/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/blinky/ccs/.ccsproject b/boards/dk-tm4c129x/blinky/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/blinky/ccs/.cproject b/boards/dk-tm4c129x/blinky/ccs/.cproject new file mode 100644 index 0000000..69963b4 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/ccs/.cproject @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/blinky/ccs/.project b/boards/dk-tm4c129x/blinky/ccs/.project new file mode 100644 index 0000000..5f9b42c --- /dev/null +++ b/boards/dk-tm4c129x/blinky/ccs/.project @@ -0,0 +1,50 @@ + + + blinky + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + blinky.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/blinky/blinky.c + + + blinky_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/blinky/blinky_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/blinky/startup_ccs.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/blinky/ccs/Debug/blinky.bin b/boards/dk-tm4c129x/blinky/ccs/Debug/blinky.bin new file mode 100644 index 0000000..8903199 Binary files /dev/null and b/boards/dk-tm4c129x/blinky/ccs/Debug/blinky.bin differ diff --git a/boards/dk-tm4c129x/blinky/ccs/Debug/blinky.out b/boards/dk-tm4c129x/blinky/ccs/Debug/blinky.out new file mode 100644 index 0000000..9d7e81a Binary files /dev/null and b/boards/dk-tm4c129x/blinky/ccs/Debug/blinky.out differ diff --git a/boards/dk-tm4c129x/blinky/ccs/macros.ini_initial b/boards/dk-tm4c129x/blinky/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/blinky/ccs/target_config.ccxml b/boards/dk-tm4c129x/blinky/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/blinky/ewarm/Exe/blinky.bin b/boards/dk-tm4c129x/blinky/ewarm/Exe/blinky.bin new file mode 100644 index 0000000..0b986aa Binary files /dev/null and b/boards/dk-tm4c129x/blinky/ewarm/Exe/blinky.bin differ diff --git a/boards/dk-tm4c129x/blinky/ewarm/Exe/blinky.out b/boards/dk-tm4c129x/blinky/ewarm/Exe/blinky.out new file mode 100644 index 0000000..f0a1354 Binary files /dev/null and b/boards/dk-tm4c129x/blinky/ewarm/Exe/blinky.out differ diff --git a/boards/dk-tm4c129x/blinky/gcc/blinky.axf b/boards/dk-tm4c129x/blinky/gcc/blinky.axf new file mode 100644 index 0000000..52ee3da Binary files /dev/null and b/boards/dk-tm4c129x/blinky/gcc/blinky.axf differ diff --git a/boards/dk-tm4c129x/blinky/gcc/blinky.bin b/boards/dk-tm4c129x/blinky/gcc/blinky.bin new file mode 100644 index 0000000..20b338a Binary files /dev/null and b/boards/dk-tm4c129x/blinky/gcc/blinky.bin differ diff --git a/boards/dk-tm4c129x/blinky/readme.txt b/boards/dk-tm4c129x/blinky/readme.txt new file mode 100644 index 0000000..75f7d9a --- /dev/null +++ b/boards/dk-tm4c129x/blinky/readme.txt @@ -0,0 +1,23 @@ +Blinky + +A very simple example that blinks the on-board LED. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/blinky/rvmdk/blinky.axf b/boards/dk-tm4c129x/blinky/rvmdk/blinky.axf new file mode 100644 index 0000000..5cf0f1d Binary files /dev/null and b/boards/dk-tm4c129x/blinky/rvmdk/blinky.axf differ diff --git a/boards/dk-tm4c129x/blinky/rvmdk/blinky.bin b/boards/dk-tm4c129x/blinky/rvmdk/blinky.bin new file mode 100644 index 0000000..e2f2a76 Binary files /dev/null and b/boards/dk-tm4c129x/blinky/rvmdk/blinky.bin differ diff --git a/boards/dk-tm4c129x/blinky/startup_ccs.c b/boards/dk-tm4c129x/blinky/startup_ccs.c new file mode 100644 index 0000000..a769216 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/startup_ccs.c @@ -0,0 +1,268 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/blinky/startup_ewarm.c b/boards/dk-tm4c129x/blinky/startup_ewarm.c new file mode 100644 index 0000000..bd8d9d1 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/startup_ewarm.c @@ -0,0 +1,299 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/blinky/startup_gcc.c b/boards/dk-tm4c129x/blinky/startup_gcc.c new file mode 100644 index 0000000..ed4261f --- /dev/null +++ b/boards/dk-tm4c129x/blinky/startup_gcc.c @@ -0,0 +1,315 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/blinky/startup_rvmdk.S b/boards/dk-tm4c129x/blinky/startup_rvmdk.S new file mode 100644 index 0000000..625bd43 --- /dev/null +++ b/boards/dk-tm4c129x/blinky/startup_rvmdk.S @@ -0,0 +1,324 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000100 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/Makefile b/boards/dk-tm4c129x/boot_demo_emac_flash/Makefile new file mode 100644 index 0000000..80412c9 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/Makefile @@ -0,0 +1,100 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Ethernet flashed-based boot_demo example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/lwip-1.4.1/apps +IPATH+=../../../../third_party/bget +IPATH+=../../../../third_party/lwip-1.4.1/ports/tiva-tm4c129/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include/ipv4 +IPATH+=../../../../third_party + +# +# The default rule, which causes the Ethernet flashed-based boot_demo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_demo_emac_flash.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Ethernet flashed-based boot_demo example. +# +${COMPILER}/boot_demo_emac_flash.axf: ${COMPILER}/boot_demo_emac_flash.o +${COMPILER}/boot_demo_emac_flash.axf: ${COMPILER}/frame.o +${COMPILER}/boot_demo_emac_flash.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/boot_demo_emac_flash.axf: ${COMPILER}/lwiplib.o +${COMPILER}/boot_demo_emac_flash.axf: ${COMPILER}/pinout.o +${COMPILER}/boot_demo_emac_flash.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/boot_demo_emac_flash.axf: ${COMPILER}/swupdate.o +${COMPILER}/boot_demo_emac_flash.axf: ${COMPILER}/ustdlib.o +${COMPILER}/boot_demo_emac_flash.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/boot_demo_emac_flash.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/boot_demo_emac_flash.axf: boot_demo_emac_flash.ld +SCATTERgcc_boot_demo_emac_flash=boot_demo_emac_flash.ld +ENTRY_boot_demo_emac_flash=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.c b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.c new file mode 100644 index 0000000..cd5c687 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.c @@ -0,0 +1,426 @@ +//***************************************************************************** +// +// boot_demo_emac_flash.c - Ethernet boot loader example application. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_flash.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/flash.h" +#include "driverlib/uart.h" +#include "driverlib/usb.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "utils/ustdlib.h" +#include "utils/lwiplib.h" +#include "utils/swupdate.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/pushbutton.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Ethernet Boot Loader Demo (boot_demo_emac_flash)

+//! +//! An example to demonstrate the use of remote update signaling with the +//! flash-based Ethernet boot loader. This application configures the Ethernet +//! controller and acquires an IP address which is displayed on the screen +//! along with the board's MAC address. It then listens for a ``magic packet'' +//! telling it that a firmware upgrade request is being made and, when this +//! packet is received, transfers control into the boot loader to perform the +//! upgrade. +//! +//! This application is intended for use with flash-based ethernet boot +//! loader (boot_emac_flash). +//! +//! The link address for this application is set to 0x4000, the link address +//! has to be multiple of the flash erase block size(16KB=0x4000). +//! You may change this address to a 16KB boundary higher than the last +//! address occupied by the boot loader binary as long as you also rebuild the +//! boot loader itself after modifying its bl_config.h file to set +//! APP_START_ADDRESS to the same value. +//! +//! The boot_demo_flash application can be used along with this application to +//! easily demonstrate that the boot loader is actually updating the on-chip +//! flash. +//! +//***************************************************************************** + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 + +//***************************************************************************** +// +// A global flag used to indicate if a remote firmware update request has been +// received. +// +//***************************************************************************** +static volatile bool g_bFirmwareUpdate = false; + +//***************************************************************************** +// +// Buffers used to hold the Ethernet MAC and IP addresses for the board. +// +//***************************************************************************** +#define SIZE_MAC_ADDR_BUFFER 32 +#define SIZE_IP_ADDR_BUFFER 32 +char g_pcMACAddr[SIZE_MAC_ADDR_BUFFER]; +char g_pcIPAddr[SIZE_IP_ADDR_BUFFER]; + +//***************************************************************************** +// +// Forward reference to various widget structures. +// +//***************************************************************************** +extern tCanvasWidget g_sBackground; + +//***************************************************************************** +// +// The canvas widget used to display the board's Ethernet IP address. +// +//***************************************************************************** +Canvas(g_sIPAddr, &g_sBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, 10, 180, 300, 20, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), + ClrBlack, 0, ClrWhite, g_psFontCmss18b, g_pcIPAddr, 0, 0); + +//***************************************************************************** +// +// The canvas widget used to display the board's Ethernet MAC address. This +// is required if using the Ethernet boot loader. +// +//***************************************************************************** +Canvas(g_sMACAddr, &g_sBackground, &g_sIPAddr, 0, + &g_sKentec320x240x16_SSD2119, 10, 200, 300, 20, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), + ClrBlack, 0, ClrWhite, g_psFontCmss18b, g_pcMACAddr, 0, 0); + +//***************************************************************************** +// +// The canvas widget used to display the current status. +// +//***************************************************************************** +Canvas(g_sStatus, &g_sBackground, &g_sMACAddr, 0, + &g_sKentec320x240x16_SSD2119, 60, 110, 200, 40, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), + ClrBlack, 0, ClrWhite, g_psFontCmss22b, "Waiting for signal.", 0, 0); + +//***************************************************************************** +// +// The canvas widget acting as the background to the display. +// +//***************************************************************************** +Canvas(g_sBackground, WIDGET_ROOT, 0, &g_sStatus, + &g_sKentec320x240x16_SSD2119, 10, 23, 300, (240 - 33), + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The system clock frequency. +// +//***************************************************************************** +uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. We use this to provide the +// required timer call to the lwIP stack. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Call the lwIP timer. + // + lwIPTimer(1000 / TICKS_PER_SECOND); +} + +//***************************************************************************** +// +// This function is called by the software update module whenever a remote +// host requests to update the firmware on this board. We set a flag that +// will cause the main loop to exit and transfer control to the bootloader. +// +// IMPORTANT: +// Note that this callback is made in interrupt context and, since it is not +// permitted to transfer control to the boot loader from within an interrupt, +// we can't just call SoftwareUpdateBegin() here. +// +//***************************************************************************** +void SoftwareUpdateRequestCallback(void) +{ + g_bFirmwareUpdate = true; +} + +//***************************************************************************** +// +// Perform the initialization steps required to start up the Ethernet controller +// and lwIP stack. +// +//***************************************************************************** +void +SetupForEthernet(void) +{ + uint32_t ui32User0, ui32User1; + uint8_t pui8MACAddr[6]; + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(g_ui32SysClock / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Get the MAC address from the UART0 and UART1 registers in NV ram. + // + ROM_FlashUserGet(&ui32User0, &ui32User1); + + // + // Convert the 24/24 split MAC address from NV ram into a MAC address + // array. + // + pui8MACAddr[0] = ui32User0 & 0xff; + pui8MACAddr[1] = (ui32User0 >> 8) & 0xff; + pui8MACAddr[2] = (ui32User0 >> 16) & 0xff; + pui8MACAddr[3] = ui32User1 & 0xff; + pui8MACAddr[4] = (ui32User1 >> 8) & 0xff; + pui8MACAddr[5] = (ui32User1 >> 16) & 0xff; + + // + // Format this address into the string used by the relevant widget. + // + usnprintf(g_pcMACAddr, SIZE_MAC_ADDR_BUFFER, + "MAC: %02X-%02X-%02X-%02X-%02X-%02X", + pui8MACAddr[0], pui8MACAddr[1], pui8MACAddr[2], pui8MACAddr[3], + pui8MACAddr[4], pui8MACAddr[5]); + + // + // Remember that we don't have an IP address yet. + // + usnprintf(g_pcIPAddr, SIZE_IP_ADDR_BUFFER, "IP: Not assigned"); + + // + // Initialize the lwIP TCP/IP stack. + // + lwIPInit(g_ui32SysClock, pui8MACAddr, 0, 0, 0, IPADDR_USE_DHCP); + + // + // Start the remote software update module. + // + SoftwareUpdateInit(SoftwareUpdateRequestCallback); +} + +//***************************************************************************** +// +// Initialize UART0 and set the appropriate communication parameters. +// +//***************************************************************************** +void +SetupForUART(void) +{ + // + // Enable UART0 peripheral. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure the UART for 115200, n, 8, 1 + // + ROM_UARTConfigSetExpClk(UART0_BASE, g_ui32SysClock, 115200, + (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | + UART_CONFIG_WLEN_8)); + + // + // Enable the UART operation. + // + ROM_UARTEnable(UART0_BASE); +} + +//***************************************************************************** +// +// Enable the USB controller +// +//***************************************************************************** +void +SetupForUSB(void) +{ + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + ROM_USBClockEnable(USB0_BASE, 8, USB_CLOCK_INTERNAL); +} + +//***************************************************************************** +// +// Demonstrate the use of the boot loader. +// +//***************************************************************************** +int +main(void) +{ + tContext sContext; + uint32_t ui32IPAddr; + + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "boot-demo-emac-flash"); + + // + // Initialize the peripherals that each of the boot loader flavors + // supports. Although this example is only intended for use with the + // Ethernet boot loader, we initialize the other two peripherals too just + // in case it is used with the USB or serial boot loaders. + // + SetupForUART(); + SetupForEthernet(); + SetupForUSB(); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sBackground); + + // + // Paint the widget tree to make sure they all appear on the display. + // + WidgetPaint(WIDGET_ROOT); + + // + // We don't have an IP address yet so clear the variable to tell us to + // check until we are assigned one. + // + ui32IPAddr = 0; + + // + // Loop forever, processing widget messages. + // + while(!g_bFirmwareUpdate) + { + // + // Do we have an IP address yet? If not, check to see if we've been + // assigned one since the last time we checked. + // + if(ui32IPAddr == 0 || ui32IPAddr == 0xFFFFFFFF) + { + // + // What is our current IP address? + // + ui32IPAddr = lwIPLocalIPAddrGet(); + + // + // If it's non zero, update the display. + // + if(ui32IPAddr!= 0 && ui32IPAddr != 0xFFFFFFFF) + { + usprintf(g_pcIPAddr, "IP: %d.%d.%d.%d", + ui32IPAddr & 0xff, (ui32IPAddr >> 8) & 0xff, + (ui32IPAddr >> 16) & 0xff, ui32IPAddr >> 24); + WidgetPaint((tWidget *)&g_sIPAddr); + } + } + + // + // Process any messages from or for the widgets. + // + WidgetMessageQueueProcess(); + } + + // + // If we drop out, the user has sent "Magic Package" via LMFlash + // so we tidy up and transfer control to the boot loader. + // + + // + // Tell the user that we got their instruction. + // + CanvasTextSet(&g_sStatus, "Updating..."); + WidgetPaint((tWidget *)&g_sStatus); + + // + // Process all remaining messages on the queue (including the paint message + // we just posted). + // + WidgetMessageQueueProcess(); + + // + // Transfer control to the bootloader. + // + SoftwareUpdateBegin(g_ui32SysClock); + + // + // The previous function never returns but we need to stick in a return + // code here to keep the compiler from generating a warning. + // + return(0); +} diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ewd b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ewp b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ewp new file mode 100644 index 0000000..be1eca8 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ewp @@ -0,0 +1,821 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\boot_demo_emac_flash.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\..\..\..\utils\lwiplib.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\swupdate.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.icf b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.icf new file mode 100644 index 0000000..bf8283d --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// boot_demo_emac_flash.icf - Linker configuration file for boot_demo_emac_flash. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00004000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ld b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ld new file mode 100644 index 0000000..bd289db --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * boot_demo_emac_flash.ld - Linker configuration file for boot_demo_emac_flash. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00004000, LENGTH = 0x000fc000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.sct b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.sct new file mode 100644 index 0000000..a456015 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; boot_demo_emac_flash.sct - Linker configuration file for boot_demo_emac_flash. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00004000 0x000fc000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00004000 0x000fc000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.uvopt b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.uvopt new file mode 100644 index 0000000..3696669 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_demo_emac_flash + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\boot_demo_emac_flash.c + boot_demo_emac_flash.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\lwiplib.c + lwiplib.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\swupdate.c + swupdate.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.uvproj b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.uvproj new file mode 100644 index 0000000..43ad288 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + boot_demo_emac_flash + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_demo_emac_flash + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_demo_emac_flash.bin .\rvmdk\boot_demo_emac_flash.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + .;..;..\..\..\..;..\..\..\..\third_party\lwip-1.4.1\apps;..\..\..\..\third_party\bget;..\..\..\..\third_party\lwip-1.4.1\ports\tiva-tm4c129\include;..\..\..\..\third_party\lwip-1.4.1\src\include;..\..\..\..\third_party\lwip-1.4.1\src\include\ipv4;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + boot_demo_emac_flash.sct + + + --entry Reset_Handler + + + + + + + + Source + + + boot_demo_emac_flash.c + 1 + .\boot_demo_emac_flash.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + lwiplib.c + 1 + ..\..\..\..\utils\lwiplib.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + swupdate.c + 1 + ..\..\..\..\utils\swupdate.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash_ccs.cmd b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash_ccs.cmd new file mode 100644 index 0000000..968d6ab --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * boot_demo_emac_flash_ccs.cmd - CCS linker configuration file for boot_demo_emac_flash. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00004000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x000fc000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.ccsimportspec b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.ccsimportspec new file mode 100644 index 0000000..7661f00 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.ccsimportspec @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.ccsproject b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.cproject b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.cproject new file mode 100644 index 0000000..555c5e5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.cproject @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.project b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.project new file mode 100644 index 0000000..ae010b5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.project @@ -0,0 +1,80 @@ + + + boot_demo_emac_flash + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_demo_emac_flash.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash.c + + + boot_demo_emac_flash_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_emac_flash/boot_demo_emac_flash_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_emac_flash/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/lwiplib.c + 1 + SW_ROOT/utils/lwiplib.c + + + utils/swupdate.c + 1 + SW_ROOT/utils/swupdate.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/Debug/boot_demo_emac_flash.bin b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/Debug/boot_demo_emac_flash.bin new file mode 100644 index 0000000..4b1f732 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/Debug/boot_demo_emac_flash.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/Debug/boot_demo_emac_flash.out b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/Debug/boot_demo_emac_flash.out new file mode 100644 index 0000000..53b3451 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/Debug/boot_demo_emac_flash.out differ diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/macros.ini_initial b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/target_config.ccxml b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/ewarm/Exe/boot_demo_emac_flash.bin b/boards/dk-tm4c129x/boot_demo_emac_flash/ewarm/Exe/boot_demo_emac_flash.bin new file mode 100644 index 0000000..8d7d2a9 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_emac_flash/ewarm/Exe/boot_demo_emac_flash.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/ewarm/Exe/boot_demo_emac_flash.out b/boards/dk-tm4c129x/boot_demo_emac_flash/ewarm/Exe/boot_demo_emac_flash.out new file mode 100644 index 0000000..8b675b8 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_emac_flash/ewarm/Exe/boot_demo_emac_flash.out differ diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/gcc/boot_demo_emac_flash.axf b/boards/dk-tm4c129x/boot_demo_emac_flash/gcc/boot_demo_emac_flash.axf new file mode 100644 index 0000000..098e92c Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_emac_flash/gcc/boot_demo_emac_flash.axf differ diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/gcc/boot_demo_emac_flash.bin b/boards/dk-tm4c129x/boot_demo_emac_flash/gcc/boot_demo_emac_flash.bin new file mode 100644 index 0000000..f799b7f Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_emac_flash/gcc/boot_demo_emac_flash.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/lwipopts.h b/boards/dk-tm4c129x/boot_demo_emac_flash/lwipopts.h new file mode 100644 index 0000000..932dfb5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/lwipopts.h @@ -0,0 +1,433 @@ +//***************************************************************************** +// +// lwipopts.h - Configuration file for lwIP +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +// +// NOTE: This file has been derived from the lwIP/src/include/lwip/opt.h +// header file. +// +// For additional details, refer to the original "opt.h" file, and lwIP +// documentation. +// +//***************************************************************************** + +#ifndef __LWIPOPTS_H__ +#define __LWIPOPTS_H__ + +//***************************************************************************** +// +// ---------- Stellaris / lwIP Port Options ---------- +// +//***************************************************************************** +//#define HOST_TMR_INTERVAL 0 +//#define DHCP_EXPIRE_TIMER_MSECS (60 * 1000) +//#define INCLUDE_HTTPD_SSI +//#define INCLUDE_HTTPD_CGI +//#define DYNAMIC_HTTP_HEADERS +//#define INCLUDE_HTTPD_DEBUG + +//***************************************************************************** +// +// ---------- Platform specific locking ---------- +// +//***************************************************************************** +#define SYS_LIGHTWEIGHT_PROT 1 // default is 0 +#define NO_SYS 1 // default is 0 +//#define MEMCPY(dst,src,len) memcpy(dst,src,len) +//#define SMEMCPY(dst,src,len) memcpy(dst,src,len) + +//***************************************************************************** +// +// ---------- Memory options ---------- +// +//***************************************************************************** +//#define MEM_LIBC_MALLOC 0 +#define MEM_ALIGNMENT 4 // default is 1 +#define MEM_SIZE (24 * 1024) // default is 1600 +//#define MEMP_OVERFLOW_CHECK 0 +//#define MEMP_SANITY_CHECK 0 +//#define MEM_USE_POOLS 0 +//#define MEMP_USE_CUSTOM_POOLS 0 + +//***************************************************************************** +// +// ---------- Internal Memory Pool Sizes ---------- +// +//***************************************************************************** +#define MEMP_NUM_PBUF 20 // Was 16 +//#define MEMP_NUM_RAW_PCB 4 +//#define MEMP_NUM_UDP_PCB 4 +#define MEMP_NUM_TCP_PCB 8 // Was 5 +//#define MEMP_NUM_TCP_PCB_LISTEN 8 +#define MEMP_NUM_TCP_SEG 16 +//#define MEMP_NUM_REASSDATA 5 +//#define MEMP_NUM_ARP_QUEUE 30 +//#define MEMP_NUM_IGMP_GROUP 8 +//#define MEMP_NUM_SYS_TIMEOUT 3 +//#define MEMP_NUM_NETBUF 2 +//#define MEMP_NUM_NETCONN 4 +//#define MEMP_NUM_TCPIP_MSG_API 8 +//#define MEMP_NUM_TCPIP_MSG_INPKT 8 +#define PBUF_POOL_SIZE 20 // Was 16 + +//***************************************************************************** +// +// ---------- ARP options ---------- +// +//***************************************************************************** +//#define LWIP_ARP 1 +//#define ARP_TABLE_SIZE 10 +//#define ARP_QUEUEING 1 +//#define ETHARP_TRUST_IP_MAC 1 + +//***************************************************************************** +// +// ---------- IP options ---------- +// +//***************************************************************************** +//#define IP_FORWARD 0 +//#define IP_OPTIONS_ALLOWED 1 +#define IP_REASSEMBLY 0 // default is 1 +#define IP_FRAG 0 // default is 1 +//#define IP_REASS_MAXAGE 3 +//#define IP_REASS_MAX_PBUFS 10 +//#define IP_FRAG_USES_STATIC_BUF 1 +//#define IP_FRAG_MAX_MTU 1500 +//#define IP_DEFAULT_TTL 255 + +//***************************************************************************** +// +// ---------- ICMP options ---------- +// +//***************************************************************************** +//#define LWIP_ICMP 1 +//#define ICMP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- RAW options ---------- +// +//***************************************************************************** +//#define LWIP_RAW 1 +//#define RAW_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- DHCP options ---------- +// +//***************************************************************************** +#define LWIP_DHCP 1 // default is 0 +//#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) + +//***************************************************************************** +// +// ---------- UPNP options ---------- +// +//***************************************************************************** +//#define LWIP_UPNP 0 + +//***************************************************************************** +// +// ---------- PTPD options ---------- +// +//***************************************************************************** +//#define LWIP_PTPD 0 + +//***************************************************************************** +// +// ---------- AUTOIP options ---------- +// +//***************************************************************************** +#define LWIP_AUTOIP 1 // default is 0 +#define LWIP_DHCP_AUTOIP_COOP ((LWIP_DHCP) && (LWIP_AUTOIP)) + // default is 0 +#define LWIP_DHCP_AUTOIP_COOP_TRIES 5 // default is 9 + +//***************************************************************************** +// +// ---------- SNMP options ---------- +// +//***************************************************************************** +//#define LWIP_SNMP 0 +//#define SNMP_CONCURRENT_REQUESTS 1 +//#define SNMP_TRAP_DESTINATIONS 1 +//#define SNMP_PRIVATE_MIB 0 +//#define SNMP_SAFE_REQUESTS 1 + +//***************************************************************************** +// +// ---------- IGMP options ---------- +// +//***************************************************************************** +//#define LWIP_IGMP 0 + +//***************************************************************************** +// +// ---------- DNS options ----------- +// +//***************************************************************************** +//#define LWIP_DNS 0 +//#define DNS_TABLE_SIZE 4 +//#define DNS_MAX_NAME_LENGTH 256 +//#define DNS_MAX_SERVERS 2 +//#define DNS_DOES_NAME_CHECK 1 +//#define DNS_USES_STATIC_BUF 1 +//#define DNS_MSG_SIZE 512 + +//***************************************************************************** +// +// ---------- UDP options ---------- +// +//***************************************************************************** +//#define LWIP_UDP 1 +//#define LWIP_UDPLITE 0 +//#define UDP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- TCP options ---------- +// +//***************************************************************************** +//#define LWIP_TCP 1 +//#define TCP_TTL (IP_DEFAULT_TTL) +#define TCP_WND 1024 // default is 2048, was 4096 +//#define TCP_MAXRTX 12 +//#define TCP_SYNMAXRTX 6 +//#define TCP_QUEUE_OOSEQ 1 +#define TCP_MSS 512 // default is 128, was 1500 +//#define TCP_CALCULATE_EFF_SEND_MSS 1 +#define TCP_SND_BUF (4 * TCP_MSS) + // default is 256 +//#define TCP_SND_QUEUELEN (4 * (TCP_SND_BUF/TCP_MSS)) +//#define TCP_SNDLOWAT (TCP_SND_BUF/2) +//#define TCP_LISTEN_BACKLOG 0 +//#define TCP_DEFAULT_LISTEN_BACKLOG 0xff + +//***************************************************************************** +// +// ---------- API options ---------- +// +//***************************************************************************** +//#define LWIP_EVENT_API 0 +//#define LWIP_CALLBACK_API 1 + +//***************************************************************************** +// +// ---------- Pbuf options ---------- +// +//***************************************************************************** +#define PBUF_LINK_HLEN 16 // default is 14 +#define PBUF_POOL_BUFSIZE 256 + // default is LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) +#define ETH_PAD_SIZE 0 // default is 0 + +//***************************************************************************** +// +// ---------- Network Interfaces options ---------- +// +//***************************************************************************** +//#define LWIP_NETIF_HOSTNAME 0 +//#define LWIP_NETIF_API 0 +//#define LWIP_NETIF_STATUS_CALLBACK 0 +//#define LWIP_NETIF_LINK_CALLBACK 0 +//#define LWIP_NETIF_HWADDRHINT 0 + +//***************************************************************************** +// +// ---------- LOOPIF options ---------- +// +//***************************************************************************** +//#define LWIP_HAVE_LOOPIF 0 +//#define LWIP_LOOPIF_MULTITHREADING 1 + +//***************************************************************************** +// +// ---------- Thread options ---------- +// +//***************************************************************************** +//#define TCPIP_THREAD_NAME "tcpip_thread" +//#define TCPIP_THREAD_STACKSIZE 0 +//#define TCPIP_THREAD_PRIO 1 +//#define TCPIP_MBOX_SIZE 0 +//#define SLIPIF_THREAD_NAME "slipif_loop" +//#define SLIPIF_THREAD_STACKSIZE 0 +//#define SLIPIF_THREAD_PRIO 1 +//#define PPP_THREAD_NAME "pppMain" +//#define PPP_THREAD_STACKSIZE 0 +//#define PPP_THREAD_PRIO 1 +//#define DEFAULT_THREAD_NAME "lwIP" +//#define DEFAULT_THREAD_STACKSIZE 0 +//#define DEFAULT_THREAD_PRIO 1 +//#define DEFAULT_RAW_RECVMBOX_SIZE 0 +//#define DEFAULT_UDP_RECVMBOX_SIZE 0 +//#define DEFAULT_TCP_RECVMBOX_SIZE 0 +//#define DEFAULT_ACCEPTMBOX_SIZE 0 + +//***************************************************************************** +// +// ---------- Sequential layer options ---------- +// +//***************************************************************************** +//#define LWIP_TCPIP_CORE_LOCKING 0 +#define LWIP_NETCONN 0 // default is 1 + +//***************************************************************************** +// +// ---------- Socket Options ---------- +// +//***************************************************************************** +#define LWIP_SOCKET 0 // default is 1 +//#define LWIP_COMPAT_SOCKETS 1 +//#define LWIP_POSIX_SOCKETS_IO_NAMES 1 +//#define LWIP_TCP_KEEPALIVE 0 +//#define LWIP_SO_RCVTIMEO 0 +//#define LWIP_SO_RCVBUF 0 +//#define SO_REUSE 0 + +//***************************************************************************** +// +// ---------- Statistics options ---------- +// +//***************************************************************************** +//#define LWIP_STATS 1 +//#define LWIP_STATS_DISPLAY 0 +//#define LINK_STATS 1 +//#define ETHARP_STATS (LWIP_ARP) +//#define IP_STATS 1 +//#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) +//#define ICMP_STATS 1 +//#define IGMP_STATS (LWIP_IGMP) +//#define UDP_STATS (LWIP_UDP) +//#define TCP_STATS (LWIP_TCP) +//#define MEM_STATS 1 +//#define MEMP_STATS 1 +//#define SYS_STATS 1 + +//***************************************************************************** +// +// ---------- PPP options ---------- +// +//***************************************************************************** +//#define PPP_SUPPORT 0 +//#define PPPOE_SUPPORT 0 +//#define PPPOS_SUPPORT PPP_SUPPORT + +#if PPP_SUPPORT +//#define NUM_PPP 1 +//#define PAP_SUPPORT 0 +//#define CHAP_SUPPORT 0 +//#define MSCHAP_SUPPORT 0 +//#define CBCP_SUPPORT 0 +//#define CCP_SUPPORT 0 +//#define VJ_SUPPORT 0 +//#define MD5_SUPPORT 0 +//#define FSM_DEFTIMEOUT 6 +//#define FSM_DEFMAXTERMREQS 2 +//#define FSM_DEFMAXCONFREQS 10 +//#define FSM_DEFMAXNAKLOOPS 5 +//#define UPAP_DEFTIMEOUT 6 +//#define UPAP_DEFREQTIME 30 +//#define CHAP_DEFTIMEOUT 6 +//#define CHAP_DEFTRANSMITS 10 +//#define LCP_ECHOINTERVAL 0 +//#define LCP_MAXECHOFAILS 3 +//#define PPP_MAXIDLEFLAG 100 + +//#define PPP_MAXMTU 1500 +//#define PPP_DEFMRU 296 +#endif + +//***************************************************************************** +// +// ---------- checksum options ---------- +// +//***************************************************************************** +//#define CHECKSUM_GEN_IP 1 +//#define CHECKSUM_GEN_UDP 1 +//#define CHECKSUM_GEN_TCP 1 +//#define CHECKSUM_CHECK_IP 1 +//#define CHECKSUM_CHECK_UDP 1 +//#define CHECKSUM_CHECK_TCP 1 + +//***************************************************************************** +// +// ---------- Debugging options ---------- +// +//***************************************************************************** +#if 0 +#define U8_F "c" +#define S8_F "c" +#define X8_F "x" +#define U16_F "u" +#define S16_F "d" +#define X16_F "x" +#define U32_F "u" +#define S32_F "d" +#define X32_F "x" +extern void UARTprintf(const char *pcString, ...); +#define LWIP_DEBUG +#endif + +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SERIOUS +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE + +//#define LWIP_DBG_TYPES_ON LWIP_DBG_ON +#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH) + +//#define ETHARP_DEBUG LWIP_DBG_ON // default is OFF +//#define NETIF_DEBUG LWIP_DBG_ON // default is OFF +//#define PBUF_DEBUG LWIP_DBG_OFF +//#define API_LIB_DEBUG LWIP_DBG_OFF +//#define API_MSG_DEBUG LWIP_DBG_OFF +//#define SOCKETS_DEBUG LWIP_DBG_OFF +//#define ICMP_DEBUG LWIP_DBG_OFF +//#define IGMP_DEBUG LWIP_DBG_OFF +//#define INET_DEBUG LWIP_DBG_OFF +//#define IP_DEBUG LWIP_DBG_ON // default is OFF +//#define IP_REASS_DEBUG LWIP_DBG_OFF +//#define RAW_DEBUG LWIP_DBG_OFF +//#define MEM_DEBUG LWIP_DBG_OFF +//#define MEMP_DEBUG LWIP_DBG_OFF +//#define SYS_DEBUG LWIP_DBG_OFF +//#define TCP_DEBUG LWIP_DBG_OFF +#define TCP_INPUT_DEBUG LWIP_DBG_ON +//#define TCP_FR_DEBUG LWIP_DBG_OFF +//#define TCP_RTO_DEBUG LWIP_DBG_OFF +//#define TCP_CWND_DEBUG LWIP_DBG_OFF +//#define TCP_WND_DEBUG LWIP_DBG_OFF +//#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +//#define TCP_RST_DEBUG LWIP_DBG_OFF +//#define TCP_QLEN_DEBUG LWIP_DBG_OFF +//#define UDP_DEBUG LWIP_DBG_ON // default is OFF +//#define TCPIP_DEBUG LWIP_DBG_OFF +//#define PPP_DEBUG LWIP_DBG_OFF +//#define SLIP_DEBUG LWIP_DBG_OFF +//#define DHCP_DEBUG LWIP_DBG_ON // default is OFF +//#define AUTOIP_DEBUG LWIP_DBG_OFF +//#define SNMP_MSG_DEBUG LWIP_DBG_OFF +//#define SNMP_MIB_DEBUG LWIP_DBG_OFF +//#define DNS_DEBUG LWIP_DBG_OFF + +#endif /* __LWIPOPTS_H__ */ diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/readme.txt b/boards/dk-tm4c129x/boot_demo_emac_flash/readme.txt new file mode 100644 index 0000000..395d2ce --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/readme.txt @@ -0,0 +1,44 @@ +Ethernet Boot Loader Demo + +An example to demonstrate the use of remote update signaling with the +flash-based Ethernet boot loader. This application configures the Ethernet +controller and acquires an IP address which is displayed on the screen +along with the board's MAC address. It then listens for a ``magic packet'' +telling it that a firmware upgrade request is being made and, when this +packet is received, transfers control into the boot loader to perform the +upgrade. + +This application is intended for use with flash-based ethernet boot +loader (boot_emac_flash). + +The link address for this application is set to 0x4000, the link address +has to be multiple of the flash erase block size(16KB=0x4000). +You may change this address to a 16KB boundary higher than the last +address occupied by the boot loader binary as long as you also rebuild the +boot loader itself after modifying its bl_config.h file to set +APP_START_ADDRESS to the same value. + +The boot_demo_flash application can be used along with this application to +easily demonstrate that the boot loader is actually updating the on-chip +flash. + + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/rvmdk/boot_demo_emac_flash.axf b/boards/dk-tm4c129x/boot_demo_emac_flash/rvmdk/boot_demo_emac_flash.axf new file mode 100644 index 0000000..c385c02 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_emac_flash/rvmdk/boot_demo_emac_flash.axf differ diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/rvmdk/boot_demo_emac_flash.bin b/boards/dk-tm4c129x/boot_demo_emac_flash/rvmdk/boot_demo_emac_flash.bin new file mode 100644 index 0000000..add32c8 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_emac_flash/rvmdk/boot_demo_emac_flash.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/startup_ccs.c b/boards/dk-tm4c129x/boot_demo_emac_flash/startup_ccs.c new file mode 100644 index 0000000..d369798 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void lwIPEthernetIntHandler(void); +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/startup_ewarm.c b/boards/dk-tm4c129x/boot_demo_emac_flash/startup_ewarm.c new file mode 100644 index 0000000..8f63895 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void lwIPEthernetIntHandler(void); +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/startup_gcc.c b/boards/dk-tm4c129x/boot_demo_emac_flash/startup_gcc.c new file mode 100644 index 0000000..74e18ae --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void lwIPEthernetIntHandler(void); +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_emac_flash/startup_rvmdk.S b/boards/dk-tm4c129x/boot_demo_emac_flash/startup_rvmdk.S new file mode 100644 index 0000000..198eaad --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_emac_flash/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN lwIPEthernetIntHandler + EXTERN SysTickHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD lwIPEthernetIntHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/boot_demo_flash/Makefile b/boards/dk-tm4c129x/boot_demo_flash/Makefile new file mode 100644 index 0000000..44bd941 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/Makefile @@ -0,0 +1,100 @@ +#****************************************************************************** +# +# Makefile - Rules for building the boot_demo_flash example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/lwip-1.4.1/apps +IPATH+=../../../../third_party/bget +IPATH+=../../../../third_party/lwip-1.4.1/ports/tiva-tm4c129/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include/ipv4 +IPATH+=../../../../third_party + +# +# The default rule, which causes the boot_demo_flash example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_demo_flash.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the boot_demo_flash example. +# +${COMPILER}/boot_demo_flash.axf: ${COMPILER}/boot_demo_flash.o +${COMPILER}/boot_demo_flash.axf: ${COMPILER}/frame.o +${COMPILER}/boot_demo_flash.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/boot_demo_flash.axf: ${COMPILER}/lwiplib.o +${COMPILER}/boot_demo_flash.axf: ${COMPILER}/pinout.o +${COMPILER}/boot_demo_flash.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/boot_demo_flash.axf: ${COMPILER}/touch.o +${COMPILER}/boot_demo_flash.axf: ${COMPILER}/ustdlib.o +${COMPILER}/boot_demo_flash.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/boot_demo_flash.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/boot_demo_flash.axf: boot_demo_flash.ld +SCATTERgcc_boot_demo_flash=boot_demo_flash.ld +ENTRY_boot_demo_flash=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.c b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.c new file mode 100644 index 0000000..071bd92 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.c @@ -0,0 +1,512 @@ +//***************************************************************************** +// +// boot_demo_flash.c - Flash-base boot loader application example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_flash.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/flash.h" +#include "driverlib/uart.h" +#include "driverlib/uart.h" +#include "driverlib/gpio.h" +#include "driverlib/usb.h" +#include "driverlib/emac.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "utils/ustdlib.h" +#include "utils/lwiplib.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/pushbutton.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/touch.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Flash-based Boot Loader Demo (boot_demo_flash)

+//! +//! An example to demonstrate the use of a flash-based boot loader. At +//! startup, the application will configure the UART, USB and Ethernet +//! peripherals, and then branch to the boot loader to await the start of an +//! update. +//! +//! This application is intended for use with flash-based ethernet boot +//! loader (boot_emac_flash). Although it isn't neccessary to configure USB +//! and UART interface in this example since only ethernet flash-based boot +//! loader is provided, the code is there for completeness so that USB or +//! UART flash-based boot loader can be implemented if needed. +//! The link address for this application is set to 0x4000, the link address +//! has to be multiple of the flash erase block size(16KB=0x4000). +//! You may change this address to a 16KB boundary higher than the last +//! address occupied by the boot loader binary as long as you also rebuild the +//! boot loader itself after modifying its bl_config.h file to set +//! APP_START_ADDRESS to the same value. +//! +//! The boot_demo_emac_flash application can be used along with this +//! application to easily demonstrate that the boot loader is actually updating +//! the on-chip flash. +//! +// +//***************************************************************************** + + +//***************************************************************************** +// +// The system clock frequency. +// +//***************************************************************************** +uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// The current IP address. +// +//***************************************************************************** +uint32_t g_ui32IPAddress; + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 + +//***************************************************************************** +// +// A global we use to keep track of when the user presses the "Update now" +// button. +// +//***************************************************************************** +volatile bool g_bFirmwareUpdate = false; + +//***************************************************************************** +// +// Buffers used to hold the Ethernet MAC and IP addresses for the board. +// +//***************************************************************************** +#define SIZE_MAC_ADDR_BUFFER 32 +#define SIZE_IP_ADDR_BUFFER 32 +char g_pcMACAddr[SIZE_MAC_ADDR_BUFFER]; +char g_pcIPAddr[SIZE_IP_ADDR_BUFFER]; + +//***************************************************************************** +// +// Forward reference to various widget structures. +// +//***************************************************************************** +extern tCanvasWidget g_sBackground; + +//***************************************************************************** +// +// Forward reference to the button press handler. +// +//***************************************************************************** +void OnButtonPress(tWidget *psWidget); + +//***************************************************************************** +// +// The canvas widget used to display the board's Ethernet IP address. +// +//***************************************************************************** +Canvas(g_sIPAddr, &g_sBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, 10, 180, 300, 20, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), + ClrBlack, 0, ClrWhite, g_psFontCmss18b, g_pcIPAddr, 0, 0); + +//***************************************************************************** +// +// The canvas widget used to display the board's Ethernet MAC address. This +// is required if using the Ethernet boot loader. +// +//***************************************************************************** +Canvas(g_sMACAddr, &g_sBackground, &g_sIPAddr, 0, + &g_sKentec320x240x16_SSD2119, 10, 200, 300, 20, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), + ClrBlack, 0, ClrWhite, g_psFontCmss18b, g_pcMACAddr, 0, 0); + +//***************************************************************************** +// +// The button used to initiate a boot loader software update. +// +//***************************************************************************** +RectangularButton(g_sPushBtn, &g_sBackground, &g_sMACAddr, 0, + &g_sKentec320x240x16_SSD2119, 60, 110, 200, 40, + (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_RELEASE_NOTIFY), + ClrDarkBlue, ClrBlue, ClrWhite, ClrWhite, + g_psFontCmss22b, "Update Now", 0, 0, 0, 0, OnButtonPress); + +//***************************************************************************** +// +// The canvas widget acting as the background to the display. +// +//***************************************************************************** +Canvas(g_sBackground, WIDGET_ROOT, 0, &g_sPushBtn, + &g_sKentec320x240x16_SSD2119, 10, 25, 300, (240 - 35), + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. We use this to provide the +// required timer call to the lwIP stack. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Call the lwIP timer. + // + lwIPTimer(1000 / TICKS_PER_SECOND); +} + +//***************************************************************************** +// +// Passes control to the bootloader and initiates a remote software update. +// +// This function passes control to the bootloader and initiates an update of +// the main application firmware image via UART0, Ethernet or USB depending +// upon the specific boot loader binary in use. +// +// \return Never returns. +// +//***************************************************************************** +void +JumpToBootLoader(void) +{ + // + // We must make sure we turn off SysTick and its interrupt before entering + // the boot loader! + // + ROM_SysTickIntDisable(); + ROM_SysTickDisable(); + + // + // Disable all processor interrupts. Instead of disabling them + // one at a time, a direct write to NVIC is done to disable all + // peripheral interrupts. + // + HWREG(NVIC_DIS0) = 0xffffffff; + HWREG(NVIC_DIS1) = 0xffffffff; + HWREG(NVIC_DIS2) = 0xffffffff; + HWREG(NVIC_DIS3) = 0xffffffff; + HWREG(NVIC_DIS4) = 0xffffffff; + + // + // Return control to the boot loader. This is a call to the SVC + // handler in the flash based boot loader. + // + (*((void (*)(void))(*(unsigned long *)0x2c)))(); +} + +//***************************************************************************** +// +// Perform the initialization steps required to start up the Ethernet controller +// and lwIP stack. +// +//***************************************************************************** +void +SetupForEthernet(void) +{ + uint32_t ui32User0, ui32User1; + uint8_t pui8MACAddr[6]; + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(g_ui32SysClock / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Get the MAC address from the UART0 and UART1 registers in NV ram. + // + ROM_FlashUserGet(&ui32User0, &ui32User1); + + // + // Convert the 24/24 split MAC address from NV ram into a MAC address + // array. + // + pui8MACAddr[0] = ui32User0 & 0xff; + pui8MACAddr[1] = (ui32User0 >> 8) & 0xff; + pui8MACAddr[2] = (ui32User0 >> 16) & 0xff; + pui8MACAddr[3] = ui32User1 & 0xff; + pui8MACAddr[4] = (ui32User1 >> 8) & 0xff; + pui8MACAddr[5] = (ui32User1 >> 16) & 0xff; + + // + // Format this address into the string used by the relevant widget. + // + usnprintf(g_pcMACAddr, SIZE_MAC_ADDR_BUFFER, + "MAC: %02X-%02X-%02X-%02X-%02X-%02X", + pui8MACAddr[0], pui8MACAddr[1], pui8MACAddr[2], pui8MACAddr[3], + pui8MACAddr[4], pui8MACAddr[5]); + + // + // Remember that we don't have an IP address yet. + // + usnprintf(g_pcIPAddr, SIZE_IP_ADDR_BUFFER, "IP: Not assigned"); + + // + // Initialize the lwIP TCP/IP stack. + // + lwIPInit(g_ui32SysClock, pui8MACAddr, 0, 0, 0, IPADDR_USE_DHCP); +} + +//***************************************************************************** +// +// Initialize UART0 and set the appropriate communication parameters. +// +//***************************************************************************** +void +SetupForUART(void) +{ + // + // Enable UART0 peripheral. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure the UART for 115200, n, 8, 1 + // + ROM_UARTConfigSetExpClk(UART0_BASE, g_ui32SysClock, 115200, + (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | + UART_CONFIG_WLEN_8)); + + // + // Enable the UART operation. + // + ROM_UARTEnable(UART0_BASE); +} + +//***************************************************************************** +// +// Enable the USB controller +// +//***************************************************************************** +void +SetupForUSB(void) +{ + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + ROM_USBClockEnable(USB0_BASE, 8, USB_CLOCK_INTERNAL); +} + +//***************************************************************************** +// +// This function is called by the graphics library widget manager whenever the +// "Update Now" button is pressed. It sets a flag that the main loop checks +// and, when set, causes control to transfer to the boot loader. +// +//***************************************************************************** +void +OnButtonPress(tWidget *psWidget) +{ + g_bFirmwareUpdate = true; +} + +//***************************************************************************** +// +// A simple application demonstrating use of the boot loader, +// +//***************************************************************************** +int +main(void) +{ + unsigned long ui32NewIPAddr; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "boot-demo-flash"); + + // + // Initialize the peripherals that each of the boot loader flavors + // supports. Since this example is intended for use with any of the + // boot loaders and we don't know which is actually in use, we cover all + // bases and initialize for serial, Ethernet and USB use here. + // + SetupForUART(); + SetupForEthernet(); + SetupForUSB(); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(g_ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(WidgetPointerMessage); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sBackground); + + // + // Paint the widget tree to make sure they all appear on the display. + // + WidgetPaint(WIDGET_ROOT); + + // + // We don't have an IP address yet so clear the variable to tell us to + // check until we are assigned one. + // + g_ui32IPAddress = 0; + + // + // Loop forever, processing widget messages. + // + while(!g_bFirmwareUpdate) + { + // + // Do we have an IP address yet? If not, check to see if we've been + // assigned one since the last time we checked. + // + if(g_ui32IPAddress == 0 || g_ui32IPAddress == 0xffffffff) + { + // + // What is our current IP address? + // + ui32NewIPAddr = lwIPLocalIPAddrGet(); + + // + // See if the IP address has changed. + // + if(ui32NewIPAddr != g_ui32IPAddress) + { + // + // If it's non zero, update the display. + // + if(ui32NewIPAddr == 0xffffffff) + { + usnprintf(g_pcIPAddr, SIZE_IP_ADDR_BUFFER, + "IP: waiting for link"); + } + else if(ui32NewIPAddr == 0) + { + usnprintf(g_pcIPAddr, SIZE_IP_ADDR_BUFFER, + "IP: waiting for IP address"); + } + else + { + usprintf(g_pcIPAddr, "IP: %d.%d.%d.%d", + ui32NewIPAddr & 0xff, + (ui32NewIPAddr >> 8) & 0xff, + (ui32NewIPAddr >> 16) & 0xff, + ui32NewIPAddr >> 24); + } + WidgetPaint((tWidget *)&g_sIPAddr); + + // + // Save the new IP address. + // + g_ui32IPAddress = ui32NewIPAddr; + } + } + + // + // Process any messages from or for the widgets. + // + WidgetMessageQueueProcess(); + } + + // + // If we drop out, the user has pressed the "Update Now" button so we + // tidy up and transfer control to the boot loader. + // + + // + // Tell the user that we got their instruction. + // + PushButtonTextSet(&g_sPushBtn, "Wait for Update..."); + WidgetPaint((tWidget *)&g_sPushBtn); + + // + // Process all remaining messages on the queue (including the paint message + // we just posted). + // + WidgetMessageQueueProcess(); + + // + // Transfer control to the boot loader. + // + JumpToBootLoader(); + + // + // The previous function never returns but we need to stick in a return + // code here to keep the compiler from generating a warning. + // + return(0); +} diff --git a/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ewd b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ewp b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ewp new file mode 100644 index 0000000..ff10bdb --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ewp @@ -0,0 +1,821 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\boot_demo_flash.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\..\..\..\utils\lwiplib.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.icf b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.icf new file mode 100644 index 0000000..fa872e2 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// boot_demo_flash.icf - Linker configuration file for boot_demo_flash. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00004000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ld b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ld new file mode 100644 index 0000000..7c06009 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * boot_demo_flash.ld - Linker configuration file for boot_demo_flash. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00004000, LENGTH = 0x000fc000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.sct b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.sct new file mode 100644 index 0000000..70a3d1a --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; boot_demo_flash.sct - Linker configuration file for boot_demo_flash. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00004000 0x000fc000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00004000 0x000fc000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.uvopt b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.uvopt new file mode 100644 index 0000000..3c080f8 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_demo_flash + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\boot_demo_flash.c + boot_demo_flash.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\lwiplib.c + lwiplib.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.uvproj b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.uvproj new file mode 100644 index 0000000..9da41c2 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + boot_demo_flash + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_demo_flash + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_demo_flash.bin .\rvmdk\boot_demo_flash.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + .;..;..\..\..\..;..\..\..\..\third_party\lwip-1.4.1\apps;..\..\..\..\third_party\bget;..\..\..\..\third_party\lwip-1.4.1\ports\tiva-tm4c129\include;..\..\..\..\third_party\lwip-1.4.1\src\include;..\..\..\..\third_party\lwip-1.4.1\src\include\ipv4;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + boot_demo_flash.sct + + + --entry Reset_Handler + + + + + + + + Source + + + boot_demo_flash.c + 1 + .\boot_demo_flash.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + lwiplib.c + 1 + ..\..\..\..\utils\lwiplib.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash_ccs.cmd b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash_ccs.cmd new file mode 100644 index 0000000..f7126a2 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * boot_demo_flash_ccs.cmd - CCS linker configuration file for boot_demo_flash. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00004000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x000fc000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/boot_demo_flash/ccs/.ccsimportspec b/boards/dk-tm4c129x/boot_demo_flash/ccs/.ccsimportspec new file mode 100644 index 0000000..a735210 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/ccs/.ccsimportspec @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_flash/ccs/.ccsproject b/boards/dk-tm4c129x/boot_demo_flash/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_flash/ccs/.cproject b/boards/dk-tm4c129x/boot_demo_flash/ccs/.cproject new file mode 100644 index 0000000..8994b43 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/ccs/.cproject @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_flash/ccs/.project b/boards/dk-tm4c129x/boot_demo_flash/ccs/.project new file mode 100644 index 0000000..ed043d5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/ccs/.project @@ -0,0 +1,80 @@ + + + boot_demo_flash + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_demo_flash.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash.c + + + boot_demo_flash_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_flash/boot_demo_flash_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_flash/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/lwiplib.c + 1 + SW_ROOT/utils/lwiplib.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/boot_demo_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/boot_demo_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/boot_demo_flash/ccs/Debug/boot_demo_flash.bin b/boards/dk-tm4c129x/boot_demo_flash/ccs/Debug/boot_demo_flash.bin new file mode 100644 index 0000000..1676872 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_flash/ccs/Debug/boot_demo_flash.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_flash/ccs/Debug/boot_demo_flash.out b/boards/dk-tm4c129x/boot_demo_flash/ccs/Debug/boot_demo_flash.out new file mode 100644 index 0000000..1e52aeb Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_flash/ccs/Debug/boot_demo_flash.out differ diff --git a/boards/dk-tm4c129x/boot_demo_flash/ccs/macros.ini_initial b/boards/dk-tm4c129x/boot_demo_flash/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/boot_demo_flash/ccs/target_config.ccxml b/boards/dk-tm4c129x/boot_demo_flash/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_flash/ewarm/Exe/boot_demo_flash.bin b/boards/dk-tm4c129x/boot_demo_flash/ewarm/Exe/boot_demo_flash.bin new file mode 100644 index 0000000..60103be Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_flash/ewarm/Exe/boot_demo_flash.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_flash/ewarm/Exe/boot_demo_flash.out b/boards/dk-tm4c129x/boot_demo_flash/ewarm/Exe/boot_demo_flash.out new file mode 100644 index 0000000..ec7dc38 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_flash/ewarm/Exe/boot_demo_flash.out differ diff --git a/boards/dk-tm4c129x/boot_demo_flash/gcc/boot_demo_flash.axf b/boards/dk-tm4c129x/boot_demo_flash/gcc/boot_demo_flash.axf new file mode 100644 index 0000000..717bbab Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_flash/gcc/boot_demo_flash.axf differ diff --git a/boards/dk-tm4c129x/boot_demo_flash/gcc/boot_demo_flash.bin b/boards/dk-tm4c129x/boot_demo_flash/gcc/boot_demo_flash.bin new file mode 100644 index 0000000..611ca4f Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_flash/gcc/boot_demo_flash.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_flash/lwipopts.h b/boards/dk-tm4c129x/boot_demo_flash/lwipopts.h new file mode 100644 index 0000000..932dfb5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/lwipopts.h @@ -0,0 +1,433 @@ +//***************************************************************************** +// +// lwipopts.h - Configuration file for lwIP +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +// +// NOTE: This file has been derived from the lwIP/src/include/lwip/opt.h +// header file. +// +// For additional details, refer to the original "opt.h" file, and lwIP +// documentation. +// +//***************************************************************************** + +#ifndef __LWIPOPTS_H__ +#define __LWIPOPTS_H__ + +//***************************************************************************** +// +// ---------- Stellaris / lwIP Port Options ---------- +// +//***************************************************************************** +//#define HOST_TMR_INTERVAL 0 +//#define DHCP_EXPIRE_TIMER_MSECS (60 * 1000) +//#define INCLUDE_HTTPD_SSI +//#define INCLUDE_HTTPD_CGI +//#define DYNAMIC_HTTP_HEADERS +//#define INCLUDE_HTTPD_DEBUG + +//***************************************************************************** +// +// ---------- Platform specific locking ---------- +// +//***************************************************************************** +#define SYS_LIGHTWEIGHT_PROT 1 // default is 0 +#define NO_SYS 1 // default is 0 +//#define MEMCPY(dst,src,len) memcpy(dst,src,len) +//#define SMEMCPY(dst,src,len) memcpy(dst,src,len) + +//***************************************************************************** +// +// ---------- Memory options ---------- +// +//***************************************************************************** +//#define MEM_LIBC_MALLOC 0 +#define MEM_ALIGNMENT 4 // default is 1 +#define MEM_SIZE (24 * 1024) // default is 1600 +//#define MEMP_OVERFLOW_CHECK 0 +//#define MEMP_SANITY_CHECK 0 +//#define MEM_USE_POOLS 0 +//#define MEMP_USE_CUSTOM_POOLS 0 + +//***************************************************************************** +// +// ---------- Internal Memory Pool Sizes ---------- +// +//***************************************************************************** +#define MEMP_NUM_PBUF 20 // Was 16 +//#define MEMP_NUM_RAW_PCB 4 +//#define MEMP_NUM_UDP_PCB 4 +#define MEMP_NUM_TCP_PCB 8 // Was 5 +//#define MEMP_NUM_TCP_PCB_LISTEN 8 +#define MEMP_NUM_TCP_SEG 16 +//#define MEMP_NUM_REASSDATA 5 +//#define MEMP_NUM_ARP_QUEUE 30 +//#define MEMP_NUM_IGMP_GROUP 8 +//#define MEMP_NUM_SYS_TIMEOUT 3 +//#define MEMP_NUM_NETBUF 2 +//#define MEMP_NUM_NETCONN 4 +//#define MEMP_NUM_TCPIP_MSG_API 8 +//#define MEMP_NUM_TCPIP_MSG_INPKT 8 +#define PBUF_POOL_SIZE 20 // Was 16 + +//***************************************************************************** +// +// ---------- ARP options ---------- +// +//***************************************************************************** +//#define LWIP_ARP 1 +//#define ARP_TABLE_SIZE 10 +//#define ARP_QUEUEING 1 +//#define ETHARP_TRUST_IP_MAC 1 + +//***************************************************************************** +// +// ---------- IP options ---------- +// +//***************************************************************************** +//#define IP_FORWARD 0 +//#define IP_OPTIONS_ALLOWED 1 +#define IP_REASSEMBLY 0 // default is 1 +#define IP_FRAG 0 // default is 1 +//#define IP_REASS_MAXAGE 3 +//#define IP_REASS_MAX_PBUFS 10 +//#define IP_FRAG_USES_STATIC_BUF 1 +//#define IP_FRAG_MAX_MTU 1500 +//#define IP_DEFAULT_TTL 255 + +//***************************************************************************** +// +// ---------- ICMP options ---------- +// +//***************************************************************************** +//#define LWIP_ICMP 1 +//#define ICMP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- RAW options ---------- +// +//***************************************************************************** +//#define LWIP_RAW 1 +//#define RAW_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- DHCP options ---------- +// +//***************************************************************************** +#define LWIP_DHCP 1 // default is 0 +//#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) + +//***************************************************************************** +// +// ---------- UPNP options ---------- +// +//***************************************************************************** +//#define LWIP_UPNP 0 + +//***************************************************************************** +// +// ---------- PTPD options ---------- +// +//***************************************************************************** +//#define LWIP_PTPD 0 + +//***************************************************************************** +// +// ---------- AUTOIP options ---------- +// +//***************************************************************************** +#define LWIP_AUTOIP 1 // default is 0 +#define LWIP_DHCP_AUTOIP_COOP ((LWIP_DHCP) && (LWIP_AUTOIP)) + // default is 0 +#define LWIP_DHCP_AUTOIP_COOP_TRIES 5 // default is 9 + +//***************************************************************************** +// +// ---------- SNMP options ---------- +// +//***************************************************************************** +//#define LWIP_SNMP 0 +//#define SNMP_CONCURRENT_REQUESTS 1 +//#define SNMP_TRAP_DESTINATIONS 1 +//#define SNMP_PRIVATE_MIB 0 +//#define SNMP_SAFE_REQUESTS 1 + +//***************************************************************************** +// +// ---------- IGMP options ---------- +// +//***************************************************************************** +//#define LWIP_IGMP 0 + +//***************************************************************************** +// +// ---------- DNS options ----------- +// +//***************************************************************************** +//#define LWIP_DNS 0 +//#define DNS_TABLE_SIZE 4 +//#define DNS_MAX_NAME_LENGTH 256 +//#define DNS_MAX_SERVERS 2 +//#define DNS_DOES_NAME_CHECK 1 +//#define DNS_USES_STATIC_BUF 1 +//#define DNS_MSG_SIZE 512 + +//***************************************************************************** +// +// ---------- UDP options ---------- +// +//***************************************************************************** +//#define LWIP_UDP 1 +//#define LWIP_UDPLITE 0 +//#define UDP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- TCP options ---------- +// +//***************************************************************************** +//#define LWIP_TCP 1 +//#define TCP_TTL (IP_DEFAULT_TTL) +#define TCP_WND 1024 // default is 2048, was 4096 +//#define TCP_MAXRTX 12 +//#define TCP_SYNMAXRTX 6 +//#define TCP_QUEUE_OOSEQ 1 +#define TCP_MSS 512 // default is 128, was 1500 +//#define TCP_CALCULATE_EFF_SEND_MSS 1 +#define TCP_SND_BUF (4 * TCP_MSS) + // default is 256 +//#define TCP_SND_QUEUELEN (4 * (TCP_SND_BUF/TCP_MSS)) +//#define TCP_SNDLOWAT (TCP_SND_BUF/2) +//#define TCP_LISTEN_BACKLOG 0 +//#define TCP_DEFAULT_LISTEN_BACKLOG 0xff + +//***************************************************************************** +// +// ---------- API options ---------- +// +//***************************************************************************** +//#define LWIP_EVENT_API 0 +//#define LWIP_CALLBACK_API 1 + +//***************************************************************************** +// +// ---------- Pbuf options ---------- +// +//***************************************************************************** +#define PBUF_LINK_HLEN 16 // default is 14 +#define PBUF_POOL_BUFSIZE 256 + // default is LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) +#define ETH_PAD_SIZE 0 // default is 0 + +//***************************************************************************** +// +// ---------- Network Interfaces options ---------- +// +//***************************************************************************** +//#define LWIP_NETIF_HOSTNAME 0 +//#define LWIP_NETIF_API 0 +//#define LWIP_NETIF_STATUS_CALLBACK 0 +//#define LWIP_NETIF_LINK_CALLBACK 0 +//#define LWIP_NETIF_HWADDRHINT 0 + +//***************************************************************************** +// +// ---------- LOOPIF options ---------- +// +//***************************************************************************** +//#define LWIP_HAVE_LOOPIF 0 +//#define LWIP_LOOPIF_MULTITHREADING 1 + +//***************************************************************************** +// +// ---------- Thread options ---------- +// +//***************************************************************************** +//#define TCPIP_THREAD_NAME "tcpip_thread" +//#define TCPIP_THREAD_STACKSIZE 0 +//#define TCPIP_THREAD_PRIO 1 +//#define TCPIP_MBOX_SIZE 0 +//#define SLIPIF_THREAD_NAME "slipif_loop" +//#define SLIPIF_THREAD_STACKSIZE 0 +//#define SLIPIF_THREAD_PRIO 1 +//#define PPP_THREAD_NAME "pppMain" +//#define PPP_THREAD_STACKSIZE 0 +//#define PPP_THREAD_PRIO 1 +//#define DEFAULT_THREAD_NAME "lwIP" +//#define DEFAULT_THREAD_STACKSIZE 0 +//#define DEFAULT_THREAD_PRIO 1 +//#define DEFAULT_RAW_RECVMBOX_SIZE 0 +//#define DEFAULT_UDP_RECVMBOX_SIZE 0 +//#define DEFAULT_TCP_RECVMBOX_SIZE 0 +//#define DEFAULT_ACCEPTMBOX_SIZE 0 + +//***************************************************************************** +// +// ---------- Sequential layer options ---------- +// +//***************************************************************************** +//#define LWIP_TCPIP_CORE_LOCKING 0 +#define LWIP_NETCONN 0 // default is 1 + +//***************************************************************************** +// +// ---------- Socket Options ---------- +// +//***************************************************************************** +#define LWIP_SOCKET 0 // default is 1 +//#define LWIP_COMPAT_SOCKETS 1 +//#define LWIP_POSIX_SOCKETS_IO_NAMES 1 +//#define LWIP_TCP_KEEPALIVE 0 +//#define LWIP_SO_RCVTIMEO 0 +//#define LWIP_SO_RCVBUF 0 +//#define SO_REUSE 0 + +//***************************************************************************** +// +// ---------- Statistics options ---------- +// +//***************************************************************************** +//#define LWIP_STATS 1 +//#define LWIP_STATS_DISPLAY 0 +//#define LINK_STATS 1 +//#define ETHARP_STATS (LWIP_ARP) +//#define IP_STATS 1 +//#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) +//#define ICMP_STATS 1 +//#define IGMP_STATS (LWIP_IGMP) +//#define UDP_STATS (LWIP_UDP) +//#define TCP_STATS (LWIP_TCP) +//#define MEM_STATS 1 +//#define MEMP_STATS 1 +//#define SYS_STATS 1 + +//***************************************************************************** +// +// ---------- PPP options ---------- +// +//***************************************************************************** +//#define PPP_SUPPORT 0 +//#define PPPOE_SUPPORT 0 +//#define PPPOS_SUPPORT PPP_SUPPORT + +#if PPP_SUPPORT +//#define NUM_PPP 1 +//#define PAP_SUPPORT 0 +//#define CHAP_SUPPORT 0 +//#define MSCHAP_SUPPORT 0 +//#define CBCP_SUPPORT 0 +//#define CCP_SUPPORT 0 +//#define VJ_SUPPORT 0 +//#define MD5_SUPPORT 0 +//#define FSM_DEFTIMEOUT 6 +//#define FSM_DEFMAXTERMREQS 2 +//#define FSM_DEFMAXCONFREQS 10 +//#define FSM_DEFMAXNAKLOOPS 5 +//#define UPAP_DEFTIMEOUT 6 +//#define UPAP_DEFREQTIME 30 +//#define CHAP_DEFTIMEOUT 6 +//#define CHAP_DEFTRANSMITS 10 +//#define LCP_ECHOINTERVAL 0 +//#define LCP_MAXECHOFAILS 3 +//#define PPP_MAXIDLEFLAG 100 + +//#define PPP_MAXMTU 1500 +//#define PPP_DEFMRU 296 +#endif + +//***************************************************************************** +// +// ---------- checksum options ---------- +// +//***************************************************************************** +//#define CHECKSUM_GEN_IP 1 +//#define CHECKSUM_GEN_UDP 1 +//#define CHECKSUM_GEN_TCP 1 +//#define CHECKSUM_CHECK_IP 1 +//#define CHECKSUM_CHECK_UDP 1 +//#define CHECKSUM_CHECK_TCP 1 + +//***************************************************************************** +// +// ---------- Debugging options ---------- +// +//***************************************************************************** +#if 0 +#define U8_F "c" +#define S8_F "c" +#define X8_F "x" +#define U16_F "u" +#define S16_F "d" +#define X16_F "x" +#define U32_F "u" +#define S32_F "d" +#define X32_F "x" +extern void UARTprintf(const char *pcString, ...); +#define LWIP_DEBUG +#endif + +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SERIOUS +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE + +//#define LWIP_DBG_TYPES_ON LWIP_DBG_ON +#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH) + +//#define ETHARP_DEBUG LWIP_DBG_ON // default is OFF +//#define NETIF_DEBUG LWIP_DBG_ON // default is OFF +//#define PBUF_DEBUG LWIP_DBG_OFF +//#define API_LIB_DEBUG LWIP_DBG_OFF +//#define API_MSG_DEBUG LWIP_DBG_OFF +//#define SOCKETS_DEBUG LWIP_DBG_OFF +//#define ICMP_DEBUG LWIP_DBG_OFF +//#define IGMP_DEBUG LWIP_DBG_OFF +//#define INET_DEBUG LWIP_DBG_OFF +//#define IP_DEBUG LWIP_DBG_ON // default is OFF +//#define IP_REASS_DEBUG LWIP_DBG_OFF +//#define RAW_DEBUG LWIP_DBG_OFF +//#define MEM_DEBUG LWIP_DBG_OFF +//#define MEMP_DEBUG LWIP_DBG_OFF +//#define SYS_DEBUG LWIP_DBG_OFF +//#define TCP_DEBUG LWIP_DBG_OFF +#define TCP_INPUT_DEBUG LWIP_DBG_ON +//#define TCP_FR_DEBUG LWIP_DBG_OFF +//#define TCP_RTO_DEBUG LWIP_DBG_OFF +//#define TCP_CWND_DEBUG LWIP_DBG_OFF +//#define TCP_WND_DEBUG LWIP_DBG_OFF +//#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +//#define TCP_RST_DEBUG LWIP_DBG_OFF +//#define TCP_QLEN_DEBUG LWIP_DBG_OFF +//#define UDP_DEBUG LWIP_DBG_ON // default is OFF +//#define TCPIP_DEBUG LWIP_DBG_OFF +//#define PPP_DEBUG LWIP_DBG_OFF +//#define SLIP_DEBUG LWIP_DBG_OFF +//#define DHCP_DEBUG LWIP_DBG_ON // default is OFF +//#define AUTOIP_DEBUG LWIP_DBG_OFF +//#define SNMP_MSG_DEBUG LWIP_DBG_OFF +//#define SNMP_MIB_DEBUG LWIP_DBG_OFF +//#define DNS_DEBUG LWIP_DBG_OFF + +#endif /* __LWIPOPTS_H__ */ diff --git a/boards/dk-tm4c129x/boot_demo_flash/readme.txt b/boards/dk-tm4c129x/boot_demo_flash/readme.txt new file mode 100644 index 0000000..c5a2ec6 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/readme.txt @@ -0,0 +1,43 @@ +Flash-based Boot Loader Demo + +An example to demonstrate the use of a flash-based boot loader. At +startup, the application will configure the UART, USB and Ethernet +peripherals, and then branch to the boot loader to await the start of an +update. + +This application is intended for use with flash-based ethernet boot +loader (boot_emac_flash). Although it isn't neccessary to configure USB +and UART interface in this example since only ethernet flash-based boot +loader is provided, the code is there for completeness so that USB or +UART flash-based boot loader can be implemented if needed. +The link address for this application is set to 0x4000, the link address +has to be multiple of the flash erase block size(16KB=0x4000). +You may change this address to a 16KB boundary higher than the last +address occupied by the boot loader binary as long as you also rebuild the +boot loader itself after modifying its bl_config.h file to set +APP_START_ADDRESS to the same value. + +The boot_demo_emac_flash application can be used along with this +application to easily demonstrate that the boot loader is actually updating +the on-chip flash. + + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/boot_demo_flash/rvmdk/boot_demo_flash.axf b/boards/dk-tm4c129x/boot_demo_flash/rvmdk/boot_demo_flash.axf new file mode 100644 index 0000000..87cb9b9 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_flash/rvmdk/boot_demo_flash.axf differ diff --git a/boards/dk-tm4c129x/boot_demo_flash/rvmdk/boot_demo_flash.bin b/boards/dk-tm4c129x/boot_demo_flash/rvmdk/boot_demo_flash.bin new file mode 100644 index 0000000..9045263 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_flash/rvmdk/boot_demo_flash.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_flash/startup_ccs.c b/boards/dk-tm4c129x/boot_demo_flash/startup_ccs.c new file mode 100644 index 0000000..b63c29e --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void lwIPEthernetIntHandler(void); +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_flash/startup_ewarm.c b/boards/dk-tm4c129x/boot_demo_flash/startup_ewarm.c new file mode 100644 index 0000000..d10fcec --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void lwIPEthernetIntHandler(void); +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_flash/startup_gcc.c b/boards/dk-tm4c129x/boot_demo_flash/startup_gcc.c new file mode 100644 index 0000000..c590e71 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void lwIPEthernetIntHandler(void); +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_flash/startup_rvmdk.S b/boards/dk-tm4c129x/boot_demo_flash/startup_rvmdk.S new file mode 100644 index 0000000..bf79349 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_flash/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN lwIPEthernetIntHandler + EXTERN SysTickHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD lwIPEthernetIntHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/boot_demo_uart/Makefile b/boards/dk-tm4c129x/boot_demo_uart/Makefile new file mode 100644 index 0000000..b124dd5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/Makefile @@ -0,0 +1,90 @@ +#****************************************************************************** +# +# Makefile - Rules for building the boot_demo_uart example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the boot_demo_uart example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_demo_uart.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the boot_demo_uart example. +# +${COMPILER}/boot_demo_uart.axf: ${COMPILER}/boot_demo_uart.o +${COMPILER}/boot_demo_uart.axf: ${COMPILER}/frame.o +${COMPILER}/boot_demo_uart.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/boot_demo_uart.axf: ${COMPILER}/pinout.o +${COMPILER}/boot_demo_uart.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/boot_demo_uart.axf: ${COMPILER}/touch.o +${COMPILER}/boot_demo_uart.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/boot_demo_uart.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/boot_demo_uart.axf: boot_demo_uart.ld +SCATTERgcc_boot_demo_uart=boot_demo_uart.ld +ENTRY_boot_demo_uart=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.c b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.c new file mode 100644 index 0000000..807c669 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.c @@ -0,0 +1,224 @@ +//***************************************************************************** +// +// boot_demo_uart.c - UART boot loader example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Boot Loader UART Demo (boot_demo_uart)

+//! +//! This example demonstrates the use of the ROM-based UART boot loader. When +//! the application runs, it will wait for the screen to be pressed (to +//! simulate an application waiting for a trigger to begin a firmware update) +//! and then branch to the UART boot loader in the ROM. The UART is configured +//! for a baud rate of 115,200 and does not require the use of auto-bauding. +// +//***************************************************************************** + +//***************************************************************************** +// +// A global we use to keep track of when the user presses the screen. +// +//***************************************************************************** +volatile bool g_bFirmwareUpdate = false; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, unsigned long ulLine) +{ +} +#endif + +//***************************************************************************** +// +// This function is called in interrupt context by the touch screen driver when +// there is a pointer event. +// +//***************************************************************************** +int32_t +TSHandler(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + // + // See if this is a pointer up message. + // + if(ui32Message == WIDGET_MSG_PTR_UP) + { + // + // The screen has been pressed and released, so begin the firmware + // update. + // + g_bFirmwareUpdate = true; + } + + // + // Success. + // + return(0); +} + +//***************************************************************************** +// +// A simple application demonstrating use of the boot loader, +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock; + tContext sContext; + tRectangle sRect; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "boot-demo-uart"); + + // + // Print instructions on the screen. + // + GrStringDrawCentered(&sContext, "Press the screen to start", -1, 160, 108, + false); + GrStringDrawCentered(&sContext, "the update process", -1, 160, 128, false); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(TSHandler); + + // + // Enable the UART that will be used for the firmware update. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure the UART for 115200, 8-N-1. + // + ROM_UARTConfigSetExpClk(UART0_BASE, ui32SysClock, 115200, + (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | + UART_CONFIG_WLEN_8)); + + // + // Enable the UART operation. + // + ROM_UARTEnable(UART0_BASE); + + // + // Wait until the screen has been pressed, indicating that the firwmare + // update should begin. + // + while(!g_bFirmwareUpdate) + { + } + + // + // Clear the screen. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = 319; + sRect.i16YMax = 239; + GrContextForegroundSet(&sContext, ClrBlack); + GrRectFill(&sContext, &sRect); + + // + // Indicate that the firmware update is about to start. + // + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Update process started...", -1, 160, 98, + false); + GrStringDrawCentered(&sContext, "Using UART0 with", -1, 160, 138, false); + GrStringDrawCentered(&sContext, "115,200 baud, 8-N-1.", -1, 160, 158, + false); + + // + // Disable all processor interrupts. Instead of disabling them one at a + // time, a direct write to NVIC is done to disable all peripheral + // interrupts. + // + HWREG(NVIC_DIS0) = 0xffffffff; + HWREG(NVIC_DIS1) = 0xffffffff; + HWREG(NVIC_DIS2) = 0xffffffff; + HWREG(NVIC_DIS3) = 0xffffffff; + HWREG(NVIC_DIS4) = 0xffffffff; + + // + // Call the ROM UART boot loader. + // + ROM_UpdateUART(); + + // + // The boot loader should not return. In the off chance that it does, + // enter a dead loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ewd b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ewp b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ewp new file mode 100644 index 0000000..4a7b9db --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\boot_demo_uart.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + diff --git a/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.icf b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.icf new file mode 100644 index 0000000..3cb26c9 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// boot_demo_uart.icf - Linker configuration file for boot_demo_uart. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ld b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ld new file mode 100644 index 0000000..61544e3 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * boot_demo_uart.ld - Linker configuration file for boot_demo_uart. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.sct b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.sct new file mode 100644 index 0000000..37bfda9 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; boot_demo_uart.sct - Linker configuration file for boot_demo_uart. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.uvopt b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.uvopt new file mode 100644 index 0000000..e317d87 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_demo_uart + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\boot_demo_uart.c + boot_demo_uart.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.uvproj b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.uvproj new file mode 100644 index 0000000..e3426a2 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + boot_demo_uart + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_demo_uart + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_demo_uart.bin .\rvmdk\boot_demo_uart.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + boot_demo_uart.sct + + + --entry Reset_Handler + + + + + + + + Source + + + boot_demo_uart.c + 1 + .\boot_demo_uart.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart_ccs.cmd b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart_ccs.cmd new file mode 100644 index 0000000..194a9c6 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * boot_demo_uart_ccs.cmd - CCS linker configuration file for boot_demo_uart. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/boot_demo_uart/ccs/.ccsimportspec b/boards/dk-tm4c129x/boot_demo_uart/ccs/.ccsimportspec new file mode 100644 index 0000000..40596ec --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_uart/ccs/.ccsproject b/boards/dk-tm4c129x/boot_demo_uart/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_uart/ccs/.cproject b/boards/dk-tm4c129x/boot_demo_uart/ccs/.cproject new file mode 100644 index 0000000..ad381de --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_uart/ccs/.project b/boards/dk-tm4c129x/boot_demo_uart/ccs/.project new file mode 100644 index 0000000..fe9cb7c --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/ccs/.project @@ -0,0 +1,70 @@ + + + boot_demo_uart + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_demo_uart.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart.c + + + boot_demo_uart_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_uart/boot_demo_uart_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_uart/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/boot_demo_uart/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/boot_demo_uart/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/boot_demo_uart/ccs/Debug/boot_demo_uart.bin b/boards/dk-tm4c129x/boot_demo_uart/ccs/Debug/boot_demo_uart.bin new file mode 100644 index 0000000..f188caf Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_uart/ccs/Debug/boot_demo_uart.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_uart/ccs/Debug/boot_demo_uart.out b/boards/dk-tm4c129x/boot_demo_uart/ccs/Debug/boot_demo_uart.out new file mode 100644 index 0000000..917a9c8 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_uart/ccs/Debug/boot_demo_uart.out differ diff --git a/boards/dk-tm4c129x/boot_demo_uart/ccs/macros.ini_initial b/boards/dk-tm4c129x/boot_demo_uart/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/boot_demo_uart/ccs/target_config.ccxml b/boards/dk-tm4c129x/boot_demo_uart/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_uart/ewarm/Exe/boot_demo_uart.bin b/boards/dk-tm4c129x/boot_demo_uart/ewarm/Exe/boot_demo_uart.bin new file mode 100644 index 0000000..c974b03 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_uart/ewarm/Exe/boot_demo_uart.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_uart/ewarm/Exe/boot_demo_uart.out b/boards/dk-tm4c129x/boot_demo_uart/ewarm/Exe/boot_demo_uart.out new file mode 100644 index 0000000..93dc955 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_uart/ewarm/Exe/boot_demo_uart.out differ diff --git a/boards/dk-tm4c129x/boot_demo_uart/gcc/boot_demo_uart.axf b/boards/dk-tm4c129x/boot_demo_uart/gcc/boot_demo_uart.axf new file mode 100644 index 0000000..cb3c7b5 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_uart/gcc/boot_demo_uart.axf differ diff --git a/boards/dk-tm4c129x/boot_demo_uart/gcc/boot_demo_uart.bin b/boards/dk-tm4c129x/boot_demo_uart/gcc/boot_demo_uart.bin new file mode 100644 index 0000000..a439be9 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_uart/gcc/boot_demo_uart.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_uart/readme.txt b/boards/dk-tm4c129x/boot_demo_uart/readme.txt new file mode 100644 index 0000000..1acf19d --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/readme.txt @@ -0,0 +1,27 @@ +Boot Loader UART Demo + +This example demonstrates the use of the ROM-based UART boot loader. When +the application runs, it will wait for the screen to be pressed (to +simulate an application waiting for a trigger to begin a firmware update) +and then branch to the UART boot loader in the ROM. The UART is configured +for a baud rate of 115,200 and does not require the use of auto-bauding. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/boot_demo_uart/rvmdk/boot_demo_uart.axf b/boards/dk-tm4c129x/boot_demo_uart/rvmdk/boot_demo_uart.axf new file mode 100644 index 0000000..45b1626 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_uart/rvmdk/boot_demo_uart.axf differ diff --git a/boards/dk-tm4c129x/boot_demo_uart/rvmdk/boot_demo_uart.bin b/boards/dk-tm4c129x/boot_demo_uart/rvmdk/boot_demo_uart.bin new file mode 100644 index 0000000..ab98922 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_uart/rvmdk/boot_demo_uart.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_uart/startup_ccs.c b/boards/dk-tm4c129x/boot_demo_uart/startup_ccs.c new file mode 100644 index 0000000..5d2884c --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_uart/startup_ewarm.c b/boards/dk-tm4c129x/boot_demo_uart/startup_ewarm.c new file mode 100644 index 0000000..860b8a6 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_uart/startup_gcc.c b/boards/dk-tm4c129x/boot_demo_uart/startup_gcc.c new file mode 100644 index 0000000..fad3049 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_uart/startup_rvmdk.S b/boards/dk-tm4c129x/boot_demo_uart/startup_rvmdk.S new file mode 100644 index 0000000..07659c1 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_uart/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/boot_demo_usb/Makefile b/boards/dk-tm4c129x/boot_demo_usb/Makefile new file mode 100644 index 0000000..4d18334 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/Makefile @@ -0,0 +1,93 @@ +#****************************************************************************** +# +# Makefile - Rules for building the boot_demo_usb example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the boot_demo_usb example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_demo_usb.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the boot_demo_usb example. +# +${COMPILER}/boot_demo_usb.axf: ${COMPILER}/boot_demo_usb.o +${COMPILER}/boot_demo_usb.axf: ${COMPILER}/frame.o +${COMPILER}/boot_demo_usb.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/boot_demo_usb.axf: ${COMPILER}/pinout.o +${COMPILER}/boot_demo_usb.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/boot_demo_usb.axf: ${COMPILER}/touch.o +${COMPILER}/boot_demo_usb.axf: ${COMPILER}/usb_hiddfu_structs.o +${COMPILER}/boot_demo_usb.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/boot_demo_usb.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/boot_demo_usb.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/boot_demo_usb.axf: boot_demo_usb.ld +SCATTERgcc_boot_demo_usb=boot_demo_usb.ld +ENTRY_boot_demo_usb=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.c b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.c new file mode 100644 index 0000000..bef2012 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.c @@ -0,0 +1,821 @@ +//***************************************************************************** +// +// boot_demo_usb.c - Main routines for the USB HID/DFU composite device +// example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/usb.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidmouse.h" +#include "usblib/device/usbddfu-rt.h" +#include "usblib/device/usbdcomp.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" +#include "usb_hiddfu_structs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Boot Loader USB Demo (boot_demo_usb)

+//! +//! This example application is used in conjunction with the USB boot loader in +//! ROM and turns the development board into a composite device supporting a +//! mouse via the Human Interface Device class and also publishing runtime +//! Device Firmware Upgrade (DFU) capability. Dragging a finger or stylus over +//! the touchscreen translates into mouse movement and presses on marked areas +//! at the bottom of the screen indicate mouse button press. This input is +//! used to generate messages in HID reports sent to the USB host allowing the +//! development board to control the mouse pointer on the host system. +//! +//! Since the device also publishes a DFU interface, host software such as the +//! dfuprog tool can determine that the device is capable of receiving software +//! updates over USB. The runtime DFU protocol allows such tools to signal the +//! device to switch into DFU mode and prepare to receive a new software image. +//! +//! Runtime DFU functionality requires only that the device listen for a +//! particular request (DETACH) from the host and, when this is received, +//! transfer control to the USB boot loader via the normal means to reenumerate +//! as a pure DFU device capable of uploading and downloading firmware images. +//! +//! Windows device drivers for both the runtime and DFU mode of operation can +//! be found in C:/TI/TivaWare_C_Series-x.x/windows_drivers assuming +//! you installed TivaWare in the default directory. +//! +//! To illustrate runtime DFU capability, use the dfuprog tool which +//! is part of the Tiva Windows USB Examples package (SW-USB-win-xxxx.msi) +//! Assuming this package is installed in the default location, the +//! dfuprog executable can be found in the +//! C:/Program Files/Texas Instruments/Tiva/usb_examples or +//! C:/Program Files (x86)/Texas Instruments/Tiva/usb_examples +//! directory. +//! +//! With the device connected to your PC and the device driver installed, enter +//! the following command to enumerate DFU devices: +//! +//! dfuprog -e +//! +//! This will list all DFU-capable devices found and you should see that you +//! have one or two devices available which are in ``Runtime'' mode. +//! +//! If you see two devices, it is strongly recommended that you disconnect +//! ICDI debug port from the PC, and power the board either with a 5V external +//! power brick or any usb wall charger which is not plugged in your pc. +//! This way, your PC is connected to the board only through USB OTG port. +//! The reason for this is that the ICDI chip on the board is DFU-capable +//! device as well as TM4C129X, if not careful, the firmware on the ICDI +//! chip could be accidently erased which can not restored easily. As a +//! result, debug capabilities would be lost! +//! +//! If IDCI debug port is disconnected from your PC, you should see only one +//! device from above command, and its index should be 0, and should be named +//! as ``Mouse with Device Firmware Upgrade''. +//! If for any reason that you cannot provide the power to the board without +//! connecting ICDI debug port to your PC, the above command should show two +//! devices, the second device is probably named as +//! ``In-Circuit Debug interface'', and we need to be careful not to update +//! the firmware on that device. So please take careful note of the index for +//! the device ``Mouse with Device Firmware Upgrade'', it could be 0 or 1, we +//! will need this index number for the following command. +//! Entering the following command will switch this device into DFU mode and +//! leave it ready to receive a new firmware image: +//! +//! dfuprog -i index -m +//! +//! After entering this command, you should notice that the device disconnects +//! from the USB bus and reconnects again. Running ``dfuprog -e'' a +//! second time will show that the device is now in DFU mode and ready to +//! receive downloads. At this point, either LM Flash Programmer or dfuprog +//! may be used to send a new application binary to the device. +// +//***************************************************************************** + +//***************************************************************************** +// +// The defines used with the g_ui32Commands variable. +// +//***************************************************************************** +#define TOUCH_TICK_EVENT 0x80000000 + +//***************************************************************************** +// +// The system tick timer rate. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 50 + +//***************************************************************************** +// +// This structure defines the area of the display that is devoted to a +// mouse button. Touchscreen input in this area is translated into press and +// release messages for the given button. +// +//***************************************************************************** +typedef struct +{ + const char *pcLabel; + uint16_t ui16X; + uint16_t ui16Width; + uint8_t ui8ReportFlag; +} +tMouseButtonArea; + +//***************************************************************************** +// +// The height of the mouse button bar at the bottom of the display and the +// number of buttons it contains. +// +//***************************************************************************** +#define BUTTON_HEIGHT 30 +#define NUM_MOUSE_BUTTONS 3 + +//***************************************************************************** +// +// Definitions of the positions and labels for each of the three mouse buttons. +// +//***************************************************************************** +static tMouseButtonArea g_sMouseButtons[NUM_MOUSE_BUTTONS] = +{ + { "Button 1", 8, 101, MOUSE_REPORT_BUTTON_1 }, + { "Button 2", 109, 102, MOUSE_REPORT_BUTTON_2 }, + { "Button 3", 211, 101, MOUSE_REPORT_BUTTON_3 } +}; + +//***************************************************************************** +// +// Holds command bits used to signal the main loop to perform various tasks. +// +//***************************************************************************** +volatile uint32_t g_ui32Commands; + +//***************************************************************************** +// +// A flag used to indicate whether or not we are currently connected to the USB +// host. +// +//***************************************************************************** +volatile bool g_bConnected; + +//***************************************************************************** +// +// Global system tick counter holds elapsed time since the application started +// expressed in 100ths of a second. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount; + +//***************************************************************************** +// +// Holds the previous press position for the touchscreen. +// +//***************************************************************************** +static volatile int32_t g_i32ScreenStartX; +static volatile int32_t g_i32ScreenStartY; + +//***************************************************************************** +// +// Holds the current press position for the touchscreen. +// +//***************************************************************************** +static volatile int32_t g_i32ScreenX; +static volatile int32_t g_i32ScreenY; + +//***************************************************************************** +// +// Holds the current state of the touchscreen - pressed or not. +// +//***************************************************************************** +static volatile bool g_bScreenPressed; + +//***************************************************************************** +// +// Holds the current state of the push button - pressed or not. +// +//***************************************************************************** +static volatile uint8_t g_ui8Buttons; + +//***************************************************************************** +// +// This enumeration holds the various states that the mouse can be in during +// normal operation. +// +//***************************************************************************** +volatile enum +{ + // + // Unconfigured. + // + MOUSE_STATE_UNCONFIGURED, + + // + // No keys to send and not waiting on data. + // + MOUSE_STATE_IDLE, + + // + // Waiting on data to be sent out. + // + MOUSE_STATE_SENDING +} +g_eMouseState = MOUSE_STATE_UNCONFIGURED; + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Flag used to tell the main loop that it's time to pass control back to the +// boot loader for an update. +// +//***************************************************************************** +volatile bool g_bUpdateSignalled; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This function is called by the touchscreen driver whenever there is a +// change in press state or position. +// +//***************************************************************************** +static int32_t +MouseTouchHandler(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + uint32_t ui32Loop; + + switch(ui32Message) + { + // + // The touchscreen has been pressed. Remember where we are so that + // we can determine how far the pointer moves later. + // + case WIDGET_MSG_PTR_DOWN: + { + // + // Save the location of the pointer down event. + // + g_i32ScreenStartX = i32X; + g_i32ScreenStartY = i32Y; + g_i32ScreenX = i32X; + g_i32ScreenY = i32Y; + g_bScreenPressed = true; + + // + // Is the press within the button area? If so, determine which + // button has been pressed. + // + if(i32Y >= + (GrContextDpyHeightGet(&g_sContext) - BUTTON_HEIGHT - 8)) + { + // + // Run through the list of buttons to determine which one was + // pressed. + // + for(ui32Loop = 0; ui32Loop < NUM_MOUSE_BUTTONS; ui32Loop++) + { + if((i32X >= g_sMouseButtons[ui32Loop].ui16X) && + (i32X < (g_sMouseButtons[ui32Loop].ui16X + + g_sMouseButtons[ui32Loop].ui16Width))) + { + g_ui8Buttons |= + g_sMouseButtons[ui32Loop].ui8ReportFlag; + break; + } + } + } + break; + } + + // + // The touchscreen is no longer being pressed. + // + case WIDGET_MSG_PTR_UP: + { + g_bScreenPressed = false; + + // + // Ensure that all buttons are unpressed. + // + g_ui8Buttons = 0; + break; + } + + // + // The user is dragging his/her finger/stylus over the touchscreen. + // + case WIDGET_MSG_PTR_MOVE: + { + g_i32ScreenX = i32X; + g_i32ScreenY = i32Y; + break; + } + } + + return(0); +} + +//***************************************************************************** +// +// This is the callback from the USB DFU runtime interface driver. +// +// \param pvCBData is ignored by this function. +// \param ui32Event is one of the valid events for a DFU device. +// \param ui32MsgParam is defined by the event that occurs. +// \param pvMsgData is a pointer to data that is defined by the event that +// occurs. +// +// This function will be called to inform the application when a change occurs +// during operation as a DFU device. Currently, the only event passed to this +// callback is USBD_DFU_EVENT_DETACH which tells the recipient that they should +// pass control to the boot loader at the earliest, non-interrupt context +// point. +// +// \return This function will return 0. +// +//***************************************************************************** +uint32_t +DFUDetachCallback(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgData, + void *pvMsgData) +{ + if(ui32Event == USBD_DFU_EVENT_DETACH) + { + // + // Set the flag that the main loop uses to determine when it is time + // to transfer control back to the boot loader. Note that we + // absolutely DO NOT call USBDDFUUpdateBegin() here since we are + // currently in interrupt context and this would cause bad things to + // happen (and the boot loader to not work). + // + g_bUpdateSignalled = true; + } + + return(0); +} + +//***************************************************************************** +// +// This is the callback from the USB composite device class driver. +// +// \param pvCBData is ignored by this function. +// \param ui32Event is one of the valid events for a mouse device. +// \param ui32MsgParam is defined by the event that occurs. +// \param pvMsgData is a pointer to data that is defined by the event that +// occurs. +// +// This function will be called to inform the application when a change occurs +// during operation as a HID class USB mouse device. +// +// \return This function will return 0. +// +//***************************************************************************** +uint32_t +MouseHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgData, + void *pvMsgData) +{ + switch(ui32Event) + { + // + // The USB host has connected to and configured the device. + // + case USB_EVENT_CONNECTED: + { + g_eMouseState = MOUSE_STATE_IDLE; + g_bConnected = true; + break; + } + + // + // The USB host has disconnected from the device. + // + case USB_EVENT_DISCONNECTED: + { + g_bConnected = false; + g_eMouseState = MOUSE_STATE_UNCONFIGURED; + break; + } + + // + // A report was sent to the host. We are not free to send another. + // + case USB_EVENT_TX_COMPLETE: + { + g_eMouseState = MOUSE_STATE_IDLE; + break; + } + + } + return(0); +} + +//***************************************************************************** +// +// This function updates the display to show button state. +// +// This function is called from ButtonHandler to update the display showing +// the state of each of the buttons. +// +// Returns None. +// +//***************************************************************************** +void +UpdateDisplay(uint8_t ui8Buttons, bool bRedraw) +{ + static uint8_t ui8LastButtons; + tRectangle sRect, sRectOutline; + uint32_t ui32Loop; + + // + // Initialize the Y coordinates of the button rectangle. + // + sRectOutline.i16YMin = + GrContextDpyHeightGet(&g_sContext) - BUTTON_HEIGHT - 8; + sRectOutline.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1 - 8; + sRect.i16YMin = sRectOutline.i16YMin + 1; + sRect.i16YMax = sRectOutline.i16YMax - 1; + + // + // Loop through each of the mouse buttons, drawing each in turn. + // + for(ui32Loop = 0; ui32Loop < NUM_MOUSE_BUTTONS; ui32Loop++) + { + // + // Draw the outline if we are redrawing the whole button area. + // + if(bRedraw) + { + GrContextForegroundSet(&g_sContext, ClrWhite); + + sRectOutline.i16XMin = g_sMouseButtons[ui32Loop].ui16X; + sRectOutline.i16XMax = (sRectOutline.i16XMin + + g_sMouseButtons[ui32Loop].ui16Width) - 1; + + GrRectDraw(&g_sContext, &sRectOutline); + } + + // + // Has the button state changed since we last drew it or are we + // drawing the buttons unconditionally? + // + if(((g_ui8Buttons & g_sMouseButtons[ui32Loop].ui8ReportFlag) != + (ui8LastButtons & g_sMouseButtons[ui32Loop].ui8ReportFlag)) || + bRedraw) + { + // + // Set the appropriate button color depending upon whether the + // button is pressed or not. + // + GrContextForegroundSet(&g_sContext, + ((g_ui8Buttons & + g_sMouseButtons[ui32Loop].ui8ReportFlag) ? + ClrRed : ClrGreen)); + + sRect.i16XMin = g_sMouseButtons[ui32Loop].ui16X + 1; + sRect.i16XMax = (sRect.i16XMin + + g_sMouseButtons[ui32Loop].ui16Width) - 3; + GrRectFill(&g_sContext, &sRect); + + // + // Draw the button text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(&g_sContext, + g_sMouseButtons[ui32Loop].pcLabel, + -1, (sRect.i16XMin + sRect.i16XMax) / 2, + (sRect.i16YMin + sRect.i16YMax) / 2, 0); + } + } + + // + // Remember the button state we just drew. + // + ui8LastButtons = ui8Buttons; +} + +//***************************************************************************** +// +// This function handles updates due to touchscreen input. +// +// This function is called periodically from the main loop to check the +// touchscreen state and, if necessary, send a HID report back to the host +// system. +// +// Returns Returns \b true on success or \b false if an error is detected. +// +//***************************************************************************** +static void +TouchHandler(void) +{ + int32_t i32DeltaX, i32DeltaY; + static uint8_t ui8Buttons = 0; + + // + // Is someone pressing the screen or has the button changed state? If so, + // we determine how far they have dragged their finger/stylus and use this + // to calculate mouse position changes to send to the host. + // + if(g_bScreenPressed || (ui8Buttons != g_ui8Buttons)) + { + // + // Calculate how far we moved since the last time we checked. This + // rather odd layout prevents a compiler warning about undefined order + // of volatile accesses. + // + i32DeltaX = g_i32ScreenX; + i32DeltaX -= g_i32ScreenStartX; + i32DeltaY = g_i32ScreenY; + i32DeltaY -= g_i32ScreenStartY; + + // + // Reset our start position. + // + g_i32ScreenStartX = g_i32ScreenX; + g_i32ScreenStartY = g_i32ScreenY; + + // + // Was there any movement or change in button state? + // + if(i32DeltaX || i32DeltaY || (ui8Buttons != g_ui8Buttons)) + { + // + // Yes - send a report back to the host after clipping the deltas + // to the maximum we can support. + // + i32DeltaX = (i32DeltaX > 127) ? 127 : i32DeltaX; + i32DeltaX = (i32DeltaX < -128) ? -128 : i32DeltaX; + i32DeltaY = (i32DeltaY > 127) ? 127 : i32DeltaY; + i32DeltaY = (i32DeltaY < -128) ? -128 : i32DeltaY; + + // + // Remember the current button state. + // + ui8Buttons = g_ui8Buttons; + + // + // Send the report back to the host. + // + USBDHIDMouseStateChange((void *)&g_sMouseDevice, + (char)i32DeltaX, (char)i32DeltaY, + ui8Buttons); + } + + // + // Update the button portion of the display. + // + UpdateDisplay(ui8Buttons, false); + } +} + +//***************************************************************************** +// +// This is the interrupt handler for the SysTick interrupt. It is called +// periodically and updates a global tick counter then sets a flag to tell the +// main loop to check the button state. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + g_ui32SysTickCount++; + g_ui32Commands |= TOUCH_TICK_EVENT; +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock; + tRectangle sRect; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "boot-demo-usb"); + + // + // Set the system tick to fire 100 times per second. + // + ROM_SysTickPeriodSet(ui32SysClock / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Draw the buttons in their initial (unpressed)state. + // + UpdateDisplay(g_ui8Buttons, true); + + // + // Initialize each of the device instances that will form our composite + // USB device. + // + USBDHIDMouseCompositeInit(0, &g_sMouseDevice, + &(g_sCompDevice.psDevices[0])); + USBDDFUCompositeInit(0, &g_sDFUDevice, &(g_sCompDevice.psDevices[1])); + + // + // Pass the USB library our device information, initialize the USB + // controller and connect the device to the bus. + // + USBDCompositeInit(0, &g_sCompDevice, DESCRIPTOR_BUFFER_SIZE, + g_pui8DescriptorBuffer); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(MouseTouchHandler); + + // + // Drop into the main loop. + // + while(!g_bUpdateSignalled) + { + // + // Tell the user what we are doing. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(&g_sContext, " Waiting for host... ", -1, 160, + 110, true); + + // + // Wait for USB configuration to complete. + // + while(!g_bConnected) + { + } + + // + // Update the status. + // + GrStringDrawCentered(&g_sContext, " Host connected... ", -1, 160, + 110, true); + + // + // Now keep processing the mouse as long as the host is connected and + // we've not been told to prepare for a firmware upgrade. + // + while(g_bConnected && !g_bUpdateSignalled) + { + // + // If it is time to check the touchscreen state then do so. + // + if(g_ui32Commands & TOUCH_TICK_EVENT) + { + g_ui32Commands &= ~TOUCH_TICK_EVENT; + TouchHandler(); + } + } + + // + // If we drop out of the previous loop, either the host has + // disconnected or a firmware upgrade has been signalled. + // + } + + // + // Tell the user what's going on. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext); + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext); + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(&g_sContext, " Switching to DFU mode ", -1, 160, 118, + true); + + // + // Terminate the USB device and detach from the bus. + // + USBDCDTerm(0); + + // + // Disable all interrupts. + // + ROM_IntMasterDisable(); + + // + // Disable SysTick and its interrupt. + // + ROM_SysTickIntDisable(); + ROM_SysTickDisable(); + + // + // Disable all processor interrupts. Instead of disabling them one at a + // time, a direct write to NVIC is done to disable all peripheral + // interrupts. + // + HWREG(NVIC_DIS0) = 0xffffffff; + HWREG(NVIC_DIS1) = 0xffffffff; + HWREG(NVIC_DIS2) = 0xffffffff; + HWREG(NVIC_DIS3) = 0xffffffff; + HWREG(NVIC_DIS4) = 0xffffffff; + + // + // Enable and reset the USB peripheral. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_USB0); + ROM_USBClockEnable(USB0_BASE, 8, USB_CLOCK_INTERNAL); + + // + // Wait for about a second. + // + ROM_SysCtlDelay(ui32SysClock / 3); + + // + // Re-enable interrupts at the NVIC level. + // + ROM_IntMasterEnable(); + + // + // Call the USB boot loader. + // + ROM_UpdateUSB(0); + + // + // Should never get here, but just in case. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ewd b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ewp b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ewp new file mode 100644 index 0000000..582d300 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ewp @@ -0,0 +1,807 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\boot_demo_usb.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\usb_hiddfu_structs.c + + + diff --git a/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.icf b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.icf new file mode 100644 index 0000000..bdf8c7a --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// boot_demo_usb.icf - Linker configuration file for boot_demo_usb. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ld b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ld new file mode 100644 index 0000000..10364d4 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * boot_demo_usb.ld - Linker configuration file for boot_demo_usb. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.sct b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.sct new file mode 100644 index 0000000..0d63608 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; boot_demo_usb.sct - Linker configuration file for boot_demo_usb. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.uvopt b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.uvopt new file mode 100644 index 0000000..17d359a --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_demo_usb + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\boot_demo_usb.c + boot_demo_usb.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_hiddfu_structs.c + usb_hiddfu_structs.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.uvproj b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.uvproj new file mode 100644 index 0000000..429e054 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + boot_demo_usb + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_demo_usb + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_demo_usb.bin .\rvmdk\boot_demo_usb.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + boot_demo_usb.sct + + + --entry Reset_Handler + + + + + + + + Source + + + boot_demo_usb.c + 1 + .\boot_demo_usb.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + usb_hiddfu_structs.c + 1 + .\usb_hiddfu_structs.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb_ccs.cmd b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb_ccs.cmd new file mode 100644 index 0000000..c586087 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * boot_demo_usb_ccs.cmd - CCS linker configuration file for boot_demo_usb. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/boot_demo_usb/ccs/.ccsimportspec b/boards/dk-tm4c129x/boot_demo_usb/ccs/.ccsimportspec new file mode 100644 index 0000000..987f4c8 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_usb/ccs/.ccsproject b/boards/dk-tm4c129x/boot_demo_usb/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_usb/ccs/.cproject b/boards/dk-tm4c129x/boot_demo_usb/ccs/.cproject new file mode 100644 index 0000000..4572a0f --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/ccs/.cproject @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_usb/ccs/.project b/boards/dk-tm4c129x/boot_demo_usb/ccs/.project new file mode 100644 index 0000000..84c86fe --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/ccs/.project @@ -0,0 +1,75 @@ + + + boot_demo_usb + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_demo_usb.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb.c + + + boot_demo_usb_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_usb/boot_demo_usb_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_usb/startup_ccs.c + + + usb_hiddfu_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/boot_demo_usb/usb_hiddfu_structs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/boot_demo_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/boot_demo_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/boot_demo_usb/ccs/Debug/boot_demo_usb.bin b/boards/dk-tm4c129x/boot_demo_usb/ccs/Debug/boot_demo_usb.bin new file mode 100644 index 0000000..0c33d91 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_usb/ccs/Debug/boot_demo_usb.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_usb/ccs/Debug/boot_demo_usb.out b/boards/dk-tm4c129x/boot_demo_usb/ccs/Debug/boot_demo_usb.out new file mode 100644 index 0000000..0de67ad Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_usb/ccs/Debug/boot_demo_usb.out differ diff --git a/boards/dk-tm4c129x/boot_demo_usb/ccs/macros.ini_initial b/boards/dk-tm4c129x/boot_demo_usb/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/boot_demo_usb/ccs/target_config.ccxml b/boards/dk-tm4c129x/boot_demo_usb/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_demo_usb/ewarm/Exe/boot_demo_usb.bin b/boards/dk-tm4c129x/boot_demo_usb/ewarm/Exe/boot_demo_usb.bin new file mode 100644 index 0000000..718a52d Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_usb/ewarm/Exe/boot_demo_usb.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_usb/ewarm/Exe/boot_demo_usb.out b/boards/dk-tm4c129x/boot_demo_usb/ewarm/Exe/boot_demo_usb.out new file mode 100644 index 0000000..44be3d6 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_usb/ewarm/Exe/boot_demo_usb.out differ diff --git a/boards/dk-tm4c129x/boot_demo_usb/gcc/boot_demo_usb.axf b/boards/dk-tm4c129x/boot_demo_usb/gcc/boot_demo_usb.axf new file mode 100644 index 0000000..09be85f Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_usb/gcc/boot_demo_usb.axf differ diff --git a/boards/dk-tm4c129x/boot_demo_usb/gcc/boot_demo_usb.bin b/boards/dk-tm4c129x/boot_demo_usb/gcc/boot_demo_usb.bin new file mode 100644 index 0000000..b439f04 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_usb/gcc/boot_demo_usb.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_usb/readme.txt b/boards/dk-tm4c129x/boot_demo_usb/readme.txt new file mode 100644 index 0000000..8e9ddeb --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/readme.txt @@ -0,0 +1,90 @@ +Boot Loader USB Demo + +This example application is used in conjunction with the USB boot loader in +ROM and turns the development board into a composite device supporting a +mouse via the Human Interface Device class and also publishing runtime +Device Firmware Upgrade (DFU) capability. Dragging a finger or stylus over +the touchscreen translates into mouse movement and presses on marked areas +at the bottom of the screen indicate mouse button press. This input is +used to generate messages in HID reports sent to the USB host allowing the +development board to control the mouse pointer on the host system. + +Since the device also publishes a DFU interface, host software such as the +dfuprog tool can determine that the device is capable of receiving software +updates over USB. The runtime DFU protocol allows such tools to signal the +device to switch into DFU mode and prepare to receive a new software image. + +Runtime DFU functionality requires only that the device listen for a +particular request (DETACH) from the host and, when this is received, +transfer control to the USB boot loader via the normal means to reenumerate +as a pure DFU device capable of uploading and downloading firmware images. + +Windows device drivers for both the runtime and DFU mode of operation can +be found in C:/TI/TivaWare_C_Series-x.x/windows_drivers assuming +you installed TivaWare in the default directory. + +To illustrate runtime DFU capability, use the dfuprog tool which +is part of the Tiva Windows USB Examples package (SW-USB-win-xxxx.msi) +Assuming this package is installed in the default location, the +dfuprog executable can be found in the +C:/Program Files/Texas Instruments/Tiva/usb_examples or +C:/Program Files (x86)/Texas Instruments/Tiva/usb_examples +directory. + +With the device connected to your PC and the device driver installed, enter +the following command to enumerate DFU devices: + +dfuprog -e + +This will list all DFU-capable devices found and you should see that you +have one or two devices available which are in ``Runtime'' mode. + +If you see two devices, it is strongly recommended that you disconnect +ICDI debug port from the PC, and power the board either with a 5V external +power brick or any usb wall charger which is not plugged in your pc. +This way, your PC is connected to the board only through USB OTG port. +The reason for this is that the ICDI chip on the board is DFU-capable +device as well as TM4C129X, if not careful, the firmware on the ICDI +chip could be accidently erased which can not restored easily. As a +result, debug capabilities would be lost! + +If IDCI debug port is disconnected from your PC, you should see only one +device from above command, and its index should be 0, and should be named +as ``Mouse with Device Firmware Upgrade''. +If for any reason that you cannot provide the power to the board without +connecting ICDI debug port to your PC, the above command should show two +devices, the second device is probably named as +``In-Circuit Debug interface'', and we need to be careful not to update +the firmware on that device. So please take careful note of the index for +the device ``Mouse with Device Firmware Upgrade'', it could be 0 or 1, we +will need this index number for the following command. +Entering the following command will switch this device into DFU mode and +leave it ready to receive a new firmware image: + +dfuprog -i index -m + +After entering this command, you should notice that the device disconnects +from the USB bus and reconnects again. Running ``dfuprog -e'' a +second time will show that the device is now in DFU mode and ready to +receive downloads. At this point, either LM Flash Programmer or dfuprog +may be used to send a new application binary to the device. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/boot_demo_usb/rvmdk/boot_demo_usb.axf b/boards/dk-tm4c129x/boot_demo_usb/rvmdk/boot_demo_usb.axf new file mode 100644 index 0000000..83062b4 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_usb/rvmdk/boot_demo_usb.axf differ diff --git a/boards/dk-tm4c129x/boot_demo_usb/rvmdk/boot_demo_usb.bin b/boards/dk-tm4c129x/boot_demo_usb/rvmdk/boot_demo_usb.bin new file mode 100644 index 0000000..8886085 Binary files /dev/null and b/boards/dk-tm4c129x/boot_demo_usb/rvmdk/boot_demo_usb.bin differ diff --git a/boards/dk-tm4c129x/boot_demo_usb/startup_ccs.c b/boards/dk-tm4c129x/boot_demo_usb/startup_ccs.c new file mode 100644 index 0000000..a178f48 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_usb/startup_ewarm.c b/boards/dk-tm4c129x/boot_demo_usb/startup_ewarm.c new file mode 100644 index 0000000..dbd8966 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_usb/startup_gcc.c b/boards/dk-tm4c129x/boot_demo_usb/startup_gcc.c new file mode 100644 index 0000000..ca2e5e0 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/boot_demo_usb/startup_rvmdk.S b/boards/dk-tm4c129x/boot_demo_usb/startup_rvmdk.S new file mode 100644 index 0000000..93daff4 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SysTickHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/boot_demo_usb/usb_hiddfu_structs.c b/boards/dk-tm4c129x/boot_demo_usb/usb_hiddfu_structs.c new file mode 100644 index 0000000..2ecc56e --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/usb_hiddfu_structs.c @@ -0,0 +1,246 @@ +//***************************************************************************** +// +// usb_hiddfu_structs.c - Data structures defining the USB mouse device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidmouse.h" +#include "usblib/device/usbddfu-rt.h" +#include "usblib/device/usbdcomp.h" +#include "usb_hiddfu_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (34 + 1) * 2, + USB_DTYPE_STRING, + 'M', 0, 'o', 0, 'u', 0, 's', 0, 'e', 0, ' ', 0, 'w', 0, 'i', 0, 't', 0, + 'h', 0, ' ', 0, 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, ' ', 0, + 'F', 0, 'i', 0, 'r', 0, 'm', 0, 'w', 0, 'a', 0, 'r', 0, 'e', 0, ' ', 0, + 'U', 0, 'p', 0, 'g', 0, 'r', 0, 'a', 0, 'd', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The interface description string. +// +//***************************************************************************** +const uint8_t g_pui8HIDInterfaceString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'M', 0, 'o', 0, 'u', 0, 's', 0, + 'e', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, + 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (23 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'M', 0, 'o', 0, 'u', 0, 's', 0, + 'e', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, 'i', 0, 'g', 0, + 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8HIDInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(g_ppui8StringDescriptors[0])) + +//***************************************************************************** +// +// The HID mouse device initialization and customization structures. +// +//***************************************************************************** +tUSBDHIDMouseDevice g_sMouseDevice = +{ + USB_VID_TI_1CBE, + USB_PID_COMP_HID_DFU, + 500, + USB_CONF_ATTR_SELF_PWR, + MouseHandler, + (void *)&g_sMouseDevice, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; + +//***************************************************************************** +// +// The DFU runtime interface initialization and customization structures +// +//***************************************************************************** +tUSBDDFUDevice g_sDFUDevice = +{ + DFUDetachCallback, + (void *)&g_sDFUDevice +}; + +//**************************************************************************** +// +// The number of device class instances that this composite device will +// use. +// +//**************************************************************************** +#define NUM_DEVICES 2 + +//**************************************************************************** +// +// The array of devices supported by this composite device. +// +//**************************************************************************** +tCompositeEntry g_psCompDevices[NUM_DEVICES]; + +//**************************************************************************** +// +// Additional workspace required by the composite driver to hold a lookup +// table allowing mapping of composite interface and endpoint numbers to +// individual device class instances. +// +//**************************************************************************** +uint32_t g_pui32CompWorkspace[NUM_DEVICES]; + +//**************************************************************************** +// +// The instance data for this composite device. +// +//**************************************************************************** +tCompositeInstance g_sCompInstance; + +//**************************************************************************** +// +// Allocate the Device Data for the top level composite device class. +// +//**************************************************************************** +tUSBDCompositeDevice g_sCompDevice = +{ + // + // Stellaris VID. + // + USB_VID_TI_1CBE, + + // + // Stellaris PID for composite HID/DFU device. + // + USB_PID_COMP_HID_DFU, + + // + // This is in milliamps. + // + 500, + + // + // Bus powered device. + // + USB_CONF_ATTR_BUS_PWR, + + // + // Device event handler function pointer (receives connect, disconnect + // and other device-level notifications). + // + MouseHandler, + + // + // The string table. + // + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS, + + // + // The Composite device array. + // + NUM_DEVICES, + g_psCompDevices, +}; + +//**************************************************************************** +// +// A buffer into which the composite device can write the combined config +// descriptor. +// +//**************************************************************************** +uint8_t g_pui8DescriptorBuffer[DESCRIPTOR_BUFFER_SIZE]; diff --git a/boards/dk-tm4c129x/boot_demo_usb/usb_hiddfu_structs.h b/boards/dk-tm4c129x/boot_demo_usb/usb_hiddfu_structs.h new file mode 100644 index 0000000..ac33ed8 --- /dev/null +++ b/boards/dk-tm4c129x/boot_demo_usb/usb_hiddfu_structs.h @@ -0,0 +1,40 @@ +//***************************************************************************** +// +// usb_mouse_structs.h - Data structures defining the mouse USB device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __USB_HIDDFU_STRUCTS_H__ +#define __USB_HIDDFU_STRUCTS_H__ + +extern uint32_t MouseHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgData, void *pvMsgData); +extern uint32_t DFUDetachCallback(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgData, void *pvMsgData); + +extern tUSBDHIDMouseDevice g_sMouseDevice; +extern tUSBDDFUDevice g_sDFUDevice; +extern tUSBDCompositeDevice g_sCompDevice; + +#define DESCRIPTOR_BUFFER_SIZE (COMPOSITE_DDFU_SIZE + COMPOSITE_DHID_SIZE) +extern uint8_t g_pui8DescriptorBuffer[]; + +#endif // __USB_HIDDFU_STRUCTS_H__ diff --git a/boards/dk-tm4c129x/boot_emac_flash/Makefile b/boards/dk-tm4c129x/boot_emac_flash/Makefile new file mode 100644 index 0000000..74ee14f --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/Makefile @@ -0,0 +1,98 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Ethernet flash-based Boot Loader. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../boot_loader + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=../../../.. +IPATH+=../../../../boot_loader + +# +# The default rule, which causes the Ethernet flash-based Boot Loader to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_emac_flash.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Ethernet flash-based Boot Loader. +# +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_autobaud.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_can.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_check.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_crc32.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_decrypt.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_emac.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_flash.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_i2c.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_main.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_packet.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_ssi.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_startup_${COMPILER}.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_uart.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_usb.o +${COMPILER}/boot_emac_flash.axf: ${COMPILER}/bl_usbfuncs.o +${COMPILER}/boot_emac_flash.axf: ../../../../boot_loader/bl_link.ld +SCATTERgcc_boot_emac_flash=../../../../boot_loader/bl_link.ld +ENTRY_boot_emac_flash=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/boot_emac_flash/bl_config.h b/boards/dk-tm4c129x/boot_emac_flash/bl_config.h new file mode 100644 index 0000000..56b476f --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/bl_config.h @@ -0,0 +1,1137 @@ +//***************************************************************************** +// +// bl_config.h - The configurable parameters of the boot loader. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __BL_CONFIG_H__ +#define __BL_CONFIG_H__ + +//***************************************************************************** +// +// The following defines are used to configure the operation of the boot +// loader. For each define, its interactions with other defines are described. +// First is the dependencies (in other words, the defines that must also be +// defined if it is defined), next are the exclusives (in other words, the +// defines that can not be defined if it is defined), and finally are the +// requirements (in other words, the defines that must be defined if it is +// defined). +// +// The following defines must be defined in order for the boot loader to +// operate: +// +// One of CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, UART_ENABLE_UPDATE, or USB_ENABLE_UPDATE +// APP_START_ADDRESS +// VTABLE_START_ADDRESS +// FLASH_PAGE_SIZE +// STACK_SIZE +// +//***************************************************************************** + +//***************************************************************************** +// +// The frequency of the crystal used to clock the microcontroller. +// +// This defines the crystal frequency used by the microcontroller running the +// boot loader. If this is unknown at the time of production, then use the +// UART_AUTOBAUD feature to properly configure the UART. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define CRYSTAL_FREQ 25000000 + +//***************************************************************************** +// +// The starting address of the application. This must be a multiple of 1024 +// bytes (making it aligned to a page boundary). A vector table is expected at +// this location, and the perceived validity of the vector table (stack located +// in SRAM, reset vector located in flash) is used as an indication of the +// validity of the application image. +// +// The flash image of the boot loader must not be larger than this value. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define APP_START_ADDRESS 0x00004000 + +//***************************************************************************** +// +// The address at which the application locates its exception vector table. +// This must be a multiple of 1024 bytes (making it aligned to a page +// boundary). Typically, an application will start with its vector table and +// this value should be set to APP_START_ADDRESS. This option is provided to +// cater for applications which run from external memory which may not be +// accessible by the NVIC (the vector table offset register is only 30 bits +// long). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define VTABLE_START_ADDRESS 0x00004000 + +//***************************************************************************** +// +// The size of a single, erasable page in the flash. This must be a power +// of 2. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define FLASH_PAGE_SIZE 0x4000 + +//***************************************************************************** +// +// The amount of space at the end of flash to reserved. This must be a +// multiple of 1024 bytes (making it aligned to a page boundary). This +// reserved space is not erased when the application is updated, providing +// non-volatile storage that can be used for parameters. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define FLASH_RSVD_SPACE 0x00000800 + +//***************************************************************************** +// +// The number of words of stack space to reserve for the boot loader. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define STACK_SIZE 256 + +//***************************************************************************** +// +// The number of words in the data buffer used for receiving packets. This +// value must be at least 3. If using auto-baud on the UART, this must be at +// least 20. The maximum usable value is 65 (larger values will result in +// unused space in the buffer). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define BUFFER_SIZE 20 + +//***************************************************************************** +// +// Enables updates to the boot loader. Updating the boot loader is an unsafe +// operation since it is not fully fault tolerant (losing power to the device +// part way though could result in the boot loader no longer being present in +// flash). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_BL_UPDATE + +//***************************************************************************** +// +// Enables runtime and download CRC32 checking of the main firmware image. +// If this is defined, the boot loader will scan the main firmware image for +// an image information header (stored immediately above the vector table and +// marked by the words 0xFF01FF02 and 0xFF03FF04). If the header is found and +// the CRC32 value it contains matches that calculated for the image, the +// firmware is run. If the CRC32 does not match or the image information +// is not found, the boot loader retains control and waits for a new download. +// To aid debugging, if this option is used without ENFORCE_CRC being set, the +// image will also be booted if the header is present but the length field is +// set to 0xFFFFFFFF, typically indicating that the firmware file has not been +// run through the post-processing tool which inserts the length and CRC values. +// +// Note that firmware images intended for use with CRC checking must have been +// built with an 8 word image header appended to the top of the vector table +// and the binary must have been processed by a tool such as tools/binpack.exe +// to ensure that the required length (3rd word) and CRC32 (4th word) fields +// are populated in the header. +// +// Depends on: ENFORCE_CRC +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CHECK_CRC + +//***************************************************************************** +// +// This definition may be used alongside CHECK_CRC to remove the debug behavior +// which will allow an image with an uninitialized header to be run. With +// ENFORCE_CRC defined firmware images will only be booted if they contain a +// valid image information header and if the embedded CRC32 in that header +// matches the calculated value. +// +// Depends on: None +// Exclusive of: None +// Requires: CHECK_CRC +// +//***************************************************************************** +//#define ENFORCE_CRC + +//***************************************************************************** +// +// This definition will cause the the boot loader to erase the entire flash on +// updates to the boot loader or to erase the entire application area when the +// application is updated. This erases any unused sections in the flash before +// the firmware is updated. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define FLASH_CODE_PROTECTION + +//***************************************************************************** +// +// Enables the call to decrypt the downloaded data before writing it into +// flash. The decryption routine is empty in the reference boot loader source, +// which simply provides a placeholder for adding an actual decryption +// algorithm. Although this option is retained for backwards compatibility, it +// is recommended that a decryption function be specified using the newer hook +// function mechanism and BL_DECRYPT_FN_HOOK instead. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_DECRYPTION + +//***************************************************************************** +// +// Enables support for the MOSCFAIL handler in the NMI interrupt. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_MOSCFAIL_HANDLER + +//***************************************************************************** +// +// Enables the pin-based forced update check. When enabled, the boot loader +// will go into update mode instead of calling the application if a pin is read +// at a particular polarity, forcing an update operation. In either case, the +// application is still able to return control to the boot loader in order to +// start an update. For applications which need to perform more complex +// checking than is possible using a single GPIO, a hook function may be +// provided using BL_CHECK_UPDATE_FN_HOOK instead. +// +// Depends on: None +// Exclusive of: None +// Requires: FORCED_UPDATE_PERIPH, FORCED_UPDATE_PORT, FORCED_UPDATE_PIN, +// FORCED_UPDATE_POLARITY +// +//***************************************************************************** +//#define ENABLE_UPDATE_CHECK + +//***************************************************************************** +// +// The GPIO module to enable in order to check for a forced update. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// FORCED_UPDATE_PORT. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PERIPH SYSCTL_RCGC2_GPIOB + +//***************************************************************************** +// +// The GPIO port to check for a forced update. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for +// FORCED_UPDATE_PERIPH. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// The pin to check for a forced update. This is a value between 0 and 7. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PIN 4 + +//***************************************************************************** +// +// The polarity of the GPIO pin that results in a forced update. This value +// should be 0 if the pin should be low and 1 if the pin should be high. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_POLARITY 0 + +//***************************************************************************** +// +// This enables a weak pull-up or pull-down for the GPIO pin used in a forced +// update. Only one of FORCED_UPDATE_WPU or FORCED_UPDATE_WPD should be +// defined, or neither if a weak pull-up or pull-down is not required. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_WPU +//#define FORCED_UPDATE_WPD + +//***************************************************************************** +// +// This enables the use of the GPIO_LOCK mechanism for configuration of +// protected GPIO pins (for example JTAG pins). If this value is not defined, +// the locking mechanism will not be used. The only legal values for this +// feature are GPIO_LOCK_KEY for Fury devices and GPIO_LOCK_KEY_DD for all +// other devices except Sandstorm devices, which do not support this feature. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_KEY GPIO_LOCK_KEY +//#define FORCED_UPDATE_KEY GPIO_LOCK_KEY_DD + +//***************************************************************************** +// +// Selects the UART as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: UART_AUTOBAUD or UART_FIXED_BAUDRATE, BUFFER_SIZE +// +//***************************************************************************** +//#define UART_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables automatic baud rate detection. This can be used if the crystal +// frequency is unknown, or if operation at different baud rates is desired. +// +// Depends on: UART_ENABLE_UPDATE +// Exclusive of: UART_FIXED_BAUDRATE +// Requires: None +// +//***************************************************************************** +//#define UART_AUTOBAUD + +//***************************************************************************** +// +// Selects the baud rate to be used for the UART. +// +// Depends on: UART_ENABLE_UPDATE, CRYSTAL_FREQ +// Exclusive of: UART_AUTOBAUD +// Requires: None +// +//***************************************************************************** +//#define UART_FIXED_BAUDRATE 115200 + +//***************************************************************************** +// +// Selects the SSI port as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: BUFFER_SIZE +// +//***************************************************************************** +//#define SSI_ENABLE_UPDATE + +//***************************************************************************** +// +// Selects the I2C port as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: I2C_SLAVE_ADDR, BUFFER_SIZE +// +//***************************************************************************** +//#define I2C_ENABLE_UPDATE + +//***************************************************************************** +// +// Specifies the I2C address of the boot loader. +// +// Depends on: I2C_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define I2C_SLAVE_ADDR 0x42 + +//***************************************************************************** +// +// Selects Ethernet update via the BOOTP/TFTP protocol. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, I2C_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: CRYSTAL_FREQ +// +//***************************************************************************** +#define ENET_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables the use of the Ethernet status LED outputs to indicate traffic and +// connection status. +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define ENET_ENABLE_LEDS + +//***************************************************************************** +// +// Specifies the hard coded MAC address for the Ethernet interface. There are +// six individual values (ENET_MAC_ADDR0 through ENET_MAC_ADDR5) that provide +// the six bytes of the MAC address, where ENET_MAC_ADDR0 though ENET_MAC_ADDR2 +// provide the organizationally unique identifier (OUI) and ENET_MAC_ADDR3 +// through ENET_MAC_ADDR5 provide the extension identifier. If these values +// are not provided, the MAC address will be extracted from the user registers. +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_MAC_ADDR0 0x00 +//#define ENET_MAC_ADDR1 0x00 +//#define ENET_MAC_ADDR2 0x00 +//#define ENET_MAC_ADDR3 0x00 +//#define ENET_MAC_ADDR4 0x00 +//#define ENET_MAC_ADDR5 0x00 + +//***************************************************************************** +// +// Specifies the name of the BOOTP server from which to request information. +// The use of this specifier allows a board-specific BOOTP server to co-exist +// on a network with the DHCP server that may be part of the network +// infrastructure. The BOOTP server provided by Texas Instruments requires +// that this be set to "stellaris". +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define ENET_BOOTP_SERVER "tiva" + +//***************************************************************************** +// +// Selects USB update via Device Firmware Update class. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, UART_ENABLE_UPDATE, +// Requires: CRYSTAL_FREQ, USB_VENDOR_ID, USB_PRODUCT_ID, USB_DEVICE_ID, +// USB_MAX_POWER +// +//***************************************************************************** +//#define USB_ENABLE_UPDATE + +//***************************************************************************** +// +// The USB vendor ID published by the DFU device. This value is the TI +// Tiva vendor ID. Change this to the vendor ID you have been assigned by the +// USB-IF. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VENDOR_ID 0x1cbe + +//***************************************************************************** +// +// The USB device ID published by the DFU device. If you are using your own +// vendor ID, chose a device ID that is different from the ID you use in +// non-update operation. If you have sublicensed TI's vendor ID, you must +// use an assigned product ID here. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_PRODUCT_ID 0x00ff + +//***************************************************************************** +// +// Selects the BCD USB device release number published in the device +// descriptor. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DEVICE_ID 0x0001 + +//***************************************************************************** +// +// Sets the maximum power consumption that the DFU device will report to the +// USB host in the configuration descriptor. Units are milliamps. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MAX_POWER 150 + +//***************************************************************************** +// +// Specifies whether the DFU device reports to the host that it is self-powered +// (defined as 0) or bus-powered (defined as 1). +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_BUS_POWERED 1 + +//***************************************************************************** +// +// Specifies whether the target board uses a multiplexer to select between USB +// host and device modes. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_MUX_PERIPH, USB_MUX_PORT, USB_MUX_PIN, USB_MUX_DEVICE +// +//***************************************************************************** +//#define USB_HAS_MUX + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used to select +// between USB host and device modes. The value is of the form +// SYSCTL_RCGC2_GPIOx, where GPIOx represents the required GPIO port. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PERIPH SYSCTL_RCGC2_GPIOH + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used to select between +// USB host and device modes. The value is of the form GPIO_PORTx_BASE, where +// PORTx represents the required GPIO port. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PORT GPIO_PORTH_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used to select between USB host and device +// modes. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PIN 2 + +//***************************************************************************** +// +// Specifies the state of the GPIO pin required to select USB device-mode +// operation. Valid values are 0 (low) or 1 (high). +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_DEVICE 1 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for VBUS. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_VBUS_PERIPH, USB_VBUS_PORT, USB_VBUS_PIN +// +//***************************************************************************** +//#define USB_VBUS_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for VBUS. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VBUS_PERIPH SYSCTL_RCGCGPIO_R1 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for VBUS. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VBUS_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for VBUS. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VBUS_PIN 1 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for ID. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_ID_PERIPH, USB_ID_PORT, USB_ID_PIN +// +//***************************************************************************** +//#define USB_ID_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for ID. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_ID_PERIPH SYSCTL_RCGCGPIO_R1 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for ID. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_ID_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for ID. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_ID_PIN 0 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for DP. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_DP_PERIPH, USB_DP_PORT, USB_DP_PIN +// +//***************************************************************************** +//#define USB_DP_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for DP. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DP_PERIPH SYSCTL_RCGCGPIO_R10 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for DP. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DP_PORT GPIO_PORTL_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for DP. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DP_PIN 6 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for DM. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_DM_PERIPH, USB_DM_PORT, USB_DM_PIN +// +//***************************************************************************** +//#define USB_DM_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for DM. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DM_PERIPH SYSCTL_RCGCGPIO_R10 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for DM. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DM_PORT GPIO_PORTL_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for DM. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DM_PIN 7 + +//***************************************************************************** +// +// Selects an update via the CAN port. +// +// Depends on: None +// Exclusive of: ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: CAN_RX_PERIPH, CAN_RX_PORT, CAN_RX_PIN, CAN_TX_PERIPH, +// CAN_TX_PORT, CAN_TX_PIN, CAN_BIT_RATE, CRYSTAL_FREQ. +// +//***************************************************************************** +//#define CAN_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables the UART to CAN bridging for use when the CAN port is selected for +// communicating with the boot loader. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_UART_BRIDGE + +//***************************************************************************** +// +// The GPIO module to enable in order to configure the CAN0 Rx pin. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// CAN_RX_PORT. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PERIPH SYSCTL_RCGC2_GPIOA + +//***************************************************************************** +// +// The GPIO port used to configure the CAN0 Rx pin. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for CAN_RX_PERIPH. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PORT GPIO_PORTA_BASE + +//***************************************************************************** +// +// The GPIO pin that is shared with the CAN0 Rx pin. This is a value between 0 +// and 7. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PIN 4 + +//***************************************************************************** +// +// The GPIO module to enable in order to configure the CAN0 Tx pin. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// CAN_TX_PORT. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PERIPH SYSCTL_RCGC2_GPIOA + +//***************************************************************************** +// +// The GPIO port used to configure the CAN0 Tx pin. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for CAN_TX_PERIPH. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PORT GPIO_PORTA_BASE + +//***************************************************************************** +// +// The GPIO pin that is shared with the CAN0 Tx pin. This is a value between 0 +// and 7. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PIN 5 + +//***************************************************************************** +// +// The bit rate used on the CAN bus. This must be one of 20000, 50000, 125000, +// 250000, 500000, or 1000000. The CAN bit rate must be less than or equal to +// the crystal frequency divided by 8 (CRYSTAL_FREQ / 8). +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_BIT_RATE 1000000 + +//***************************************************************************** +// +// Performs application-specific low level hardware initialization on system +// reset. If hooked, this function will be called immediately after the boot +// loader code relocation completes. An application may perform any required +// low-level hardware initialization during this function. Note that the +// system clock has not been set when this function is called. Initialization +// that assumes the system clock is set may be performed in the BL_INIT_FN_HOOK +// function instead. +// +// void MyHwInitFunc(void); +// +//***************************************************************************** +//#define BL_HW_INIT_FN_HOOK MyHwInitFunc + +//***************************************************************************** +// +// Performs application-specific initialization on system reset. If hooked, +// this function will be called during boot loader initialization to perform +// any board- or application-specific initialization which is required. The +// function is called following a reset immediately after the selected boot +// loader peripheral has been configured and the system clock has been set. +// +// void MyInitFunc(void); +// +//***************************************************************************** +//#define BL_INIT_FN_HOOK MyInitFunc + +//***************************************************************************** +// +// Performs application-specific reinitialization on boot loader entry via SVC. +// If hooked, this function will be called during boot loader reinitialization +// to perform any board- or application-specific initialization which is +// required. The function is called following boot loader entry from an +// application, after any system clock rate adjustments have been made. +// +// void MyReinitFunc(void); +// +//***************************************************************************** +//#define BL_REINIT_FN_HOOK MyReinitFunc + +//***************************************************************************** +// +// Informs an application that a download is starting. If hooked, this +// function will be called when a firmware download is about to begin. The +// function is called after the first data packet of the download is received +// but before it has been written to flash. +// +// void MyStartFunc(void); +// +//***************************************************************************** +//#define BL_START_FN_HOOK MyStartFunc + +//***************************************************************************** +// +// Informs an application of download progress. If hooked, this function will +// be called periodically during a firmware download to provide progress +// information. The function is called after each data packet is received from +// the host. Parameters provide the number of bytes of data received and, in +// cases other than Ethernet update, the expected total number of bytes in the +// download (the TFTP protocol used by the Ethernet boot loader does not send +// the final image size before the download starts so in this case the ulTotal +// parameter is set to 0 to indicate that the size is unknown). +// +// void MyProgressFunc(unsigned long ulCompleted, unsigned long ulTotal); +// +//***************************************************************************** +//#define BL_PROGRESS_FN_HOOK MyProgressFunc + +//***************************************************************************** +// +// Informs an application that a download has completed. If hooked, this +// function will be called when a firmware download has just completed. The +// function is called after the final data packet of the download has been +// written to flash. +// +// void MyEndFunc(void); +// +//***************************************************************************** +//#define BL_END_FN_HOOK MyEndFunc + +//***************************************************************************** +// +// Allows an application to perform in-place data decryption during download. +// If hooked, this function will be called to perform in-place decryption of +// each data packet received during a firmware download. +// +// void MyDecryptionFunc(unsigned char *pucBuffer, unsigned long ulSize); +// +// This value takes precedence over ENABLE_DECRYPTION. If both are defined, +// the hook function defined using BL_DECRYPT_FN_HOOK is called rather than the +// previously-defined DecryptData() stub function. +// +//***************************************************************************** +//#define BL_DECRYPT_FN_HOOK MyDecryptionFunc + +//***************************************************************************** +// +// Allows an application to force a new firmware download. If hooked, this +// function will be called during boot loader initialization to determine +// whether a firmware update should be performed regardless of whether a valid +// main code image is already present. If the function returns 0, the existing +// main code image is booted (if present), otherwise the boot loader will wait +// for a new firmware image to be downloaded. +// +// unsigned long MyCheckUpdateFunc(void); +// +// This value takes precedence over ENABLE_UPDATE_CHECK} if both are defined. +// If you wish to perform a GPIO check in addition to any other update check +// processing required, the GPIO code must be included within the hook function +// itself. +// +//***************************************************************************** +//#define BL_CHECK_UPDATE_FN_HOOK MyCheckUpdateFunc + +//***************************************************************************** +// +// Allows an application to replace the flash block erase function. If hooked, +// this function will be called whenever a block of flash is to be erased. The +// function must erase the block and wait until the operation has completed. +// The size of the block which will be erased is defined by FLASH_BLOCK_SIZE. +// +// void MyFlashEraseFunc(unsigned long ulBlockAddr); +// +//***************************************************************************** +//#define BL_FLASH_ERASE_FN_HOOK MyFlashEraseFunc + +//***************************************************************************** +// +// Allows an application to replace the flash programming function. If hooked, +// this function will be called to program the flash with firmware image data +// received during download operations. The function must program the supplied +// data and wait until the operation has completed. +// +// void MyFlashProgramFunc(unsigned long ulDstAddr, +// unsigned char *pucSrcData, +// unsigned long ulLength); +// +//***************************************************************************** +//#define BL_FLASH_PROGRAM_FN_HOOK MyFlashProgramFunc + +//***************************************************************************** +// +// Allows an application to replace the flash error clear function. If hooked, +// this function must clear any flash error indicators and prepare to detect +// access violations that may occur in a future erase or program operations. +// +// void MyFlashClearErrorFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_CL_ERR_FN_HOOK MyFlashClearErrorFunc + +//***************************************************************************** +// +// Reports whether or not a flash access violation error has occurred. If +// hooked, this function will be called after flash erase or program +// operations. The return code indicates whether or not an access violation +// error occurred since the last call to the function defined by +// BL_FLASH_CL_ERR_FN_HOOK, with 0 indicating no errors and non-zero indicating +// an error. +// +// unsigned long MyFlashErrorFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_ERROR_FN_HOOK MyFlashErrorFunc + +//***************************************************************************** +// +// Reports the total size of the device flash. If hooked, this function will +// be called to determine the size of the supported flash device. The return +// code is the number of bytes of flash in the device. Note that this does not +// take into account any reserved space defined via the FLASH_RSVD_SPACE value. +// +// unsigned long MyFlashSizeFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_SIZE_FN_HOOK MyFlashSizeFunc + +//***************************************************************************** +// +// Reports the address of the first byte after the end of the device flash. If +// hooked, this function will be called to determine the address of the end of +// valid flash. Note that this does not take into account any reserved space +// defined via the FLASH_RSVD_SPACE value. +// +// unsigned long MyFlashEndFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_END_FN_HOOK MyFlashEndFunc + +//***************************************************************************** +// +// Checks whether the start address and size of an image are valid. If hooked, +// this function will be called when a new firmware download is about to start. +// Parameters provided are the requested start address for the new download +// and, when using protocols which transmit the image length in advance, the +// size of the image that is to be downloaded. The return code will be +// non-zero to indicate that the start address is valid and the image will fit +// in the available space, or 0 if either the address is invalid or the image +// is too large for the device. +// +// unsigned long MyFlashAddrCheckFunc(unsigned long ulAddr, +// unsigned long ulSize); +// +//***************************************************************************** +//#define BL_FLASH_AD_CHECK_FN_HOOK MyFlashAddrCheckFunc + +#endif // __BL_CONFIG_H__ diff --git a/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.c b/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.c new file mode 100644 index 0000000..90c424d --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.c @@ -0,0 +1,52 @@ +//***************************************************************************** +// +// boot_emac_flash.c - Ethernet flash-based boot loader description. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// This file is just a stub to hold the following doc comments +// + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Ethernet flash-based Boot Loader (boot_emac_flash)

+//! +//! The boot loader is a small piece of code that can be programmed at the +//! beginning of flash to act as an application loader as well as an update +//! mechanism for an application running on a Tiva microcontroller, +//! utilizing either UART0, USB, or Ethernet. The capabilities of the +//! boot loader are configured via the bl_config.h include file. For this +//! example, the boot loader uses Ethernet to load an application. +//! +//! The configuration is set to boot applications which are linked to run from +//! address 0x4000 in flash. This is minimal address since the flash erase +//! size is 16K bytes. +//! +//! Please note that LMFlash programmer version number needs to be at +//! least 1588 or later. Older LMFlash programmer doesn't work with this +//! Ethernet boot loader. +//! +// +//***************************************************************************** + + diff --git a/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.ewd b/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.ewp b/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.ewp new file mode 100644 index 0000000..c2f018f --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.ewp @@ -0,0 +1,821 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Source + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_autobaud.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_can.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_check.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_crc32.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_decrypt.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_emac.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_flash.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_i2c.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_main.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_packet.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_ssi.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_startup_ewarm.S + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_uart.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_usb.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_usbfuncs.c + + + diff --git a/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.uvopt b/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.uvopt new file mode 100644 index 0000000..95b3fe5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.uvopt @@ -0,0 +1,450 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_emac_flash + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_autobaud.c + bl_autobaud.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_can.c + bl_can.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_check.c + bl_check.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_crc32.c + bl_crc32.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_decrypt.c + bl_decrypt.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_emac.c + bl_emac.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_flash.c + bl_flash.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_i2c.c + bl_i2c.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_main.c + bl_main.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_packet.c + bl_packet.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_ssi.c + bl_ssi.c + + + 1 + 12 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_startup_rvmdk.S + bl_startup_rvmdk.S + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_uart.c + bl_uart.c + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_usb.c + bl_usb.c + + + 1 + 15 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_usbfuncs.c + bl_usbfuncs.c + + + + + Documentation + 1 + 0 + 0 + + 2 + 16 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + ..\..\..\..\boot_loader\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + ..\..\..\..\boot_loader\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.uvproj b/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.uvproj new file mode 100644 index 0000000..19b83e9 --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/boot_emac_flash.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + boot_emac_flash + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_emac_flash + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + armcc --device DLM -I . -E -o bl_config.inc ..\..\..\..\boot_loader\bl_config.c + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_emac_flash.bin .\rvmdk\boot_emac_flash.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + .;..\..\..\..;..\..\..\..\boot_loader; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + ..\..\..\..\boot_loader\bl_link.sct + + + --entry Reset_Handler + + + + + + + + Source + + + bl_autobaud.c + 1 + ..\..\..\..\boot_loader\bl_autobaud.c + + + bl_can.c + 1 + ..\..\..\..\boot_loader\bl_can.c + + + bl_check.c + 1 + ..\..\..\..\boot_loader\bl_check.c + + + bl_crc32.c + 1 + ..\..\..\..\boot_loader\bl_crc32.c + + + bl_decrypt.c + 1 + ..\..\..\..\boot_loader\bl_decrypt.c + + + bl_emac.c + 1 + ..\..\..\..\boot_loader\bl_emac.c + + + bl_flash.c + 1 + ..\..\..\..\boot_loader\bl_flash.c + + + bl_i2c.c + 1 + ..\..\..\..\boot_loader\bl_i2c.c + + + bl_main.c + 1 + ..\..\..\..\boot_loader\bl_main.c + + + bl_packet.c + 1 + ..\..\..\..\boot_loader\bl_packet.c + + + bl_ssi.c + 1 + ..\..\..\..\boot_loader\bl_ssi.c + + + bl_startup_rvmdk.S + 2 + ..\..\..\..\boot_loader\bl_startup_rvmdk.S + + + bl_uart.c + 1 + ..\..\..\..\boot_loader\bl_uart.c + + + bl_usb.c + 1 + ..\..\..\..\boot_loader\bl_usb.c + + + bl_usbfuncs.c + 1 + ..\..\..\..\boot_loader\bl_usbfuncs.c + + + + + Documentation + + + readme.txt + 5 + ..\..\..\..\boot_loader\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/boot_emac_flash/ccs/.ccsimportspec b/boards/dk-tm4c129x/boot_emac_flash/ccs/.ccsimportspec new file mode 100644 index 0000000..34afca1 --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/ccs/.ccsimportspec @@ -0,0 +1,6 @@ + + + + + + diff --git a/boards/dk-tm4c129x/boot_emac_flash/ccs/.ccsproject b/boards/dk-tm4c129x/boot_emac_flash/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_emac_flash/ccs/.cproject b/boards/dk-tm4c129x/boot_emac_flash/ccs/.cproject new file mode 100644 index 0000000..deac956 --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_emac_flash/ccs/.project b/boards/dk-tm4c129x/boot_emac_flash/ccs/.project new file mode 100644 index 0000000..28cdc3f --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/ccs/.project @@ -0,0 +1,115 @@ + + + boot_emac_flash + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_loader/bl_autobaud.c + 1 + SW_ROOT/boot_loader/bl_autobaud.c + + + boot_loader/bl_can.c + 1 + SW_ROOT/boot_loader/bl_can.c + + + boot_loader/bl_check.c + 1 + SW_ROOT/boot_loader/bl_check.c + + + boot_loader/bl_crc32.c + 1 + SW_ROOT/boot_loader/bl_crc32.c + + + boot_loader/bl_decrypt.c + 1 + SW_ROOT/boot_loader/bl_decrypt.c + + + boot_loader/bl_emac.c + 1 + SW_ROOT/boot_loader/bl_emac.c + + + boot_loader/bl_flash.c + 1 + SW_ROOT/boot_loader/bl_flash.c + + + boot_loader/bl_i2c.c + 1 + SW_ROOT/boot_loader/bl_i2c.c + + + boot_loader/bl_link_ccs.cmd + 1 + SW_ROOT/boot_loader/bl_link_ccs.cmd + + + boot_loader/bl_main.c + 1 + SW_ROOT/boot_loader/bl_main.c + + + boot_loader/bl_packet.c + 1 + SW_ROOT/boot_loader/bl_packet.c + + + boot_loader/bl_ssi.c + 1 + SW_ROOT/boot_loader/bl_ssi.c + + + boot_loader/bl_startup_ccs.s + 1 + SW_ROOT/boot_loader/bl_startup_ccs.s + + + boot_loader/bl_uart.c + 1 + SW_ROOT/boot_loader/bl_uart.c + + + boot_loader/bl_usb.c + 1 + SW_ROOT/boot_loader/bl_usb.c + + + boot_loader/bl_usbfuncs.c + 1 + SW_ROOT/boot_loader/bl_usbfuncs.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/boot_emac_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/boot_emac_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/boot_emac_flash/ccs/Debug/boot_emac_flash.bin b/boards/dk-tm4c129x/boot_emac_flash/ccs/Debug/boot_emac_flash.bin new file mode 100644 index 0000000..dfb0e29 Binary files /dev/null and b/boards/dk-tm4c129x/boot_emac_flash/ccs/Debug/boot_emac_flash.bin differ diff --git a/boards/dk-tm4c129x/boot_emac_flash/ccs/Debug/boot_emac_flash.out b/boards/dk-tm4c129x/boot_emac_flash/ccs/Debug/boot_emac_flash.out new file mode 100644 index 0000000..4ec8675 Binary files /dev/null and b/boards/dk-tm4c129x/boot_emac_flash/ccs/Debug/boot_emac_flash.out differ diff --git a/boards/dk-tm4c129x/boot_emac_flash/ccs/macros.ini_initial b/boards/dk-tm4c129x/boot_emac_flash/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/boot_emac_flash/ccs/target_config.ccxml b/boards/dk-tm4c129x/boot_emac_flash/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/boot_emac_flash/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/boot_emac_flash/ewarm/Exe/boot_emac_flash.bin b/boards/dk-tm4c129x/boot_emac_flash/ewarm/Exe/boot_emac_flash.bin new file mode 100644 index 0000000..dafe35a Binary files /dev/null and b/boards/dk-tm4c129x/boot_emac_flash/ewarm/Exe/boot_emac_flash.bin differ diff --git a/boards/dk-tm4c129x/boot_emac_flash/ewarm/Exe/boot_emac_flash.out b/boards/dk-tm4c129x/boot_emac_flash/ewarm/Exe/boot_emac_flash.out new file mode 100644 index 0000000..dea28f2 Binary files /dev/null and b/boards/dk-tm4c129x/boot_emac_flash/ewarm/Exe/boot_emac_flash.out differ diff --git a/boards/dk-tm4c129x/boot_emac_flash/gcc/boot_emac_flash.axf b/boards/dk-tm4c129x/boot_emac_flash/gcc/boot_emac_flash.axf new file mode 100644 index 0000000..4c137d9 Binary files /dev/null and b/boards/dk-tm4c129x/boot_emac_flash/gcc/boot_emac_flash.axf differ diff --git a/boards/dk-tm4c129x/boot_emac_flash/gcc/boot_emac_flash.bin b/boards/dk-tm4c129x/boot_emac_flash/gcc/boot_emac_flash.bin new file mode 100644 index 0000000..143cbbb Binary files /dev/null and b/boards/dk-tm4c129x/boot_emac_flash/gcc/boot_emac_flash.bin differ diff --git a/boards/dk-tm4c129x/boot_emac_flash/rvmdk/boot_emac_flash.axf b/boards/dk-tm4c129x/boot_emac_flash/rvmdk/boot_emac_flash.axf new file mode 100644 index 0000000..92e1988 Binary files /dev/null and b/boards/dk-tm4c129x/boot_emac_flash/rvmdk/boot_emac_flash.axf differ diff --git a/boards/dk-tm4c129x/boot_emac_flash/rvmdk/boot_emac_flash.bin b/boards/dk-tm4c129x/boot_emac_flash/rvmdk/boot_emac_flash.bin new file mode 100644 index 0000000..d4cc0ed Binary files /dev/null and b/boards/dk-tm4c129x/boot_emac_flash/rvmdk/boot_emac_flash.bin differ diff --git a/boards/dk-tm4c129x/calibrate/Makefile b/boards/dk-tm4c129x/calibrate/Makefile new file mode 100644 index 0000000..28d25a1 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the calibrate example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the calibrate example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/calibrate.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the calibrate example. +# +${COMPILER}/calibrate.axf: ${COMPILER}/calibrate.o +${COMPILER}/calibrate.axf: ${COMPILER}/frame.o +${COMPILER}/calibrate.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/calibrate.axf: ${COMPILER}/pinout.o +${COMPILER}/calibrate.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/calibrate.axf: ${COMPILER}/touch.o +${COMPILER}/calibrate.axf: ${COMPILER}/ustdlib.o +${COMPILER}/calibrate.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/calibrate.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/calibrate.axf: calibrate.ld +SCATTERgcc_calibrate=calibrate.ld +ENTRY_calibrate=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/calibrate/calibrate.c b/boards/dk-tm4c129x/calibrate/calibrate.c new file mode 100644 index 0000000..ee16938 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/calibrate.c @@ -0,0 +1,331 @@ +//***************************************************************************** +// +// calibrate.c - Calibration routine for the touch screen driver. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "utils/ustdlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Calibration for the Touch Screen (calibrate)

+//! +//! The raw sample interface of the touch screen driver is used to compute the +//! calibration matrix required to convert raw samples into screen X/Y +//! positions. The produced calibration matrix can be inserted into the touch +//! screen driver to map the raw samples into screen coordinates. +//! +//! The touch screen calibration is performed according to the algorithm +//! described by Carlos E. Videles in the June 2002 issue of Embedded Systems +//! Design. It can be found online at +//! +//! http://www.embedded.com/story/OEG20020529S0046. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Performs calibration of the touch screen. +// +//***************************************************************************** +int +main(void) +{ + int32_t i32Idx, i32X1, i32Y1, i32X2, i32Y2, i32Count, ppi32Points[3][4]; + uint32_t ui32SysClock; + char pcBuffer[32]; + tContext sContext; + tRectangle sRect; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "calibrate"); + + // + // Print the instructions across the middle of the screen in white with a + // 20 point small-caps font. + // + GrContextForegroundSet(&sContext, ClrWhite); + GrContextFontSet(&sContext, g_psFontCmsc20); + GrStringDrawCentered(&sContext, "Touch the box", -1, + GrContextDpyWidthGet(&sContext) / 2, + (GrContextDpyHeightGet(&sContext) / 2) - 10, 0); + + // + // Set the points used for calibration based on the size of the screen. + // + ppi32Points[0][0] = GrContextDpyWidthGet(&sContext) / 10; + ppi32Points[0][1] = (GrContextDpyHeightGet(&sContext) * 2) / 10; + ppi32Points[1][0] = GrContextDpyWidthGet(&sContext) / 2; + ppi32Points[1][1] = (GrContextDpyHeightGet(&sContext) * 9) / 10; + ppi32Points[2][0] = (GrContextDpyWidthGet(&sContext) * 9) / 10; + ppi32Points[2][1] = GrContextDpyHeightGet(&sContext) / 2; + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + + // + // Loop through the calibration points. + // + for(i32Idx = 0; i32Idx < 3; i32Idx++) + { + // + // Fill a white box around the calibration point. + // + GrContextForegroundSet(&sContext, ClrWhite); + sRect.i16XMin = ppi32Points[i32Idx][0] - 5; + sRect.i16YMin = ppi32Points[i32Idx][1] - 5; + sRect.i16XMax = ppi32Points[i32Idx][0] + 5; + sRect.i16YMax = ppi32Points[i32Idx][1] + 5; + GrRectFill(&sContext, &sRect); + + // + // Flush any cached drawing operations. + // + GrFlush(&sContext); + + // + // Initialize the raw sample accumulators and the sample count. + // + i32X1 = 0; + i32Y1 = 0; + i32Count = -5; + + // + // Loop forever. This loop is explicitly broken out of when the pen is + // lifted. + // + while(1) + { + // + // Grab the current raw touch screen position. + // + i32X2 = g_i16TouchX; + i32Y2 = g_i16TouchY; + + // + // See if the pen is up or down. + // + if((i32X2 < g_i16TouchMin) || (i32Y2 < g_i16TouchMin)) + { + // + // The pen is up, so see if any samples have been accumulated. + // + if(i32Count > 0) + { + // + // The pen has just been lifted from the screen, so break + // out of the controlling while loop. + // + break; + } + + // + // Reset the accumulators and sample count. + // + i32X1 = 0; + i32Y1 = 0; + i32Count = -5; + + // + // Grab the next sample. + // + continue; + } + + // + // Increment the count of samples. + // + i32Count++; + + // + // If the sample count is greater than zero, add this sample to the + // accumulators. + // + if(i32Count > 0) + { + i32X1 += i32X2; + i32Y1 += i32Y2; + } + } + + // + // Save the averaged raw ADC reading for this calibration point. + // + ppi32Points[i32Idx][2] = i32X1 / i32Count; + ppi32Points[i32Idx][3] = i32Y1 / i32Count; + + // + // Erase the box around this calibration point. + // + GrContextForegroundSet(&sContext, ClrBlack); + GrRectFill(&sContext, &sRect); + } + + // + // Clear the screen. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = GrContextDpyHeightGet(&sContext) - 1; + GrRectFill(&sContext, &sRect); + + // + // Indicate that the calibration data is being displayed. + // + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDraw(&sContext, "Calibration data:", -1, 16, 32, 0); + + // + // Compute and display the M0 calibration value. + // + usprintf(pcBuffer, "M0 = %d", + (((ppi32Points[0][0] - ppi32Points[2][0]) * + (ppi32Points[1][3] - ppi32Points[2][3])) - + ((ppi32Points[1][0] - ppi32Points[2][0]) * + (ppi32Points[0][3] - ppi32Points[2][3])))); + GrStringDraw(&sContext, pcBuffer, -1, 16, 72, 0); + + // + // Compute and display the M1 calibration value. + // + usprintf(pcBuffer, "M1 = %d", + (((ppi32Points[0][2] - ppi32Points[2][2]) * + (ppi32Points[1][0] - ppi32Points[2][0])) - + ((ppi32Points[0][0] - ppi32Points[2][0]) * + (ppi32Points[1][2] - ppi32Points[2][2])))); + GrStringDraw(&sContext, pcBuffer, -1, 16, 92, 0); + + // + // Compute and display the M2 calibration value. + // + usprintf(pcBuffer, "M2 = %d", + ((((ppi32Points[2][2] * ppi32Points[1][0]) - + (ppi32Points[1][2] * ppi32Points[2][0])) * ppi32Points[0][3]) + + (((ppi32Points[0][2] * ppi32Points[2][0]) - + (ppi32Points[2][2] * ppi32Points[0][0])) * ppi32Points[1][3]) + + (((ppi32Points[1][2] * ppi32Points[0][0]) - + (ppi32Points[0][2] * ppi32Points[1][0])) * ppi32Points[2][3]))); + GrStringDraw(&sContext, pcBuffer, -1, 16, 112, 0); + + // + // Compute and display the M3 calibration value. + // + usprintf(pcBuffer, "M3 = %d", + (((ppi32Points[0][1] - ppi32Points[2][1]) * + (ppi32Points[1][3] - ppi32Points[2][3])) - + ((ppi32Points[1][1] - ppi32Points[2][1]) * + (ppi32Points[0][3] - ppi32Points[2][3])))); + GrStringDraw(&sContext, pcBuffer, -1, 16, 132, 0); + + // + // Compute and display the M4 calibration value. + // + usprintf(pcBuffer, "M4 = %d", + (((ppi32Points[0][2] - ppi32Points[2][2]) * + (ppi32Points[1][1] - ppi32Points[2][1])) - + ((ppi32Points[0][1] - ppi32Points[2][1]) * + (ppi32Points[1][2] - ppi32Points[2][2])))); + GrStringDraw(&sContext, pcBuffer, -1, 16, 152, 0); + + // + // Compute and display the M5 calibration value. + // + usprintf(pcBuffer, "M5 = %d", + ((((ppi32Points[2][2] * ppi32Points[1][1]) - + (ppi32Points[1][2] * ppi32Points[2][1])) * ppi32Points[0][3]) + + (((ppi32Points[0][2] * ppi32Points[2][1]) - + (ppi32Points[2][2] * ppi32Points[0][1])) * ppi32Points[1][3]) + + (((ppi32Points[1][2] * ppi32Points[0][1]) - + (ppi32Points[0][2] * ppi32Points[1][1])) * ppi32Points[2][3]))); + GrStringDraw(&sContext, pcBuffer, -1, 16, 172, 0); + + // + // Compute and display the M6 calibration value. + // + usprintf(pcBuffer, "M6 = %d", + (((ppi32Points[0][2] - ppi32Points[2][2]) * + (ppi32Points[1][3] - ppi32Points[2][3])) - + ((ppi32Points[1][2] - ppi32Points[2][2]) * + (ppi32Points[0][3] - ppi32Points[2][3])))); + GrStringDraw(&sContext, pcBuffer, -1, 16, 192, 0); + + // + // Flush any cached drawing operations. + // + GrFlush(&sContext); + + // + // The calibration is complete. Sit around and wait for a reset. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/calibrate/calibrate.ewd b/boards/dk-tm4c129x/calibrate/calibrate.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/calibrate.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/calibrate/calibrate.ewp b/boards/dk-tm4c129x/calibrate/calibrate.ewp new file mode 100644 index 0000000..c5233ec --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/calibrate.ewp @@ -0,0 +1,804 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\calibrate.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/calibrate/calibrate.icf b/boards/dk-tm4c129x/calibrate/calibrate.icf new file mode 100644 index 0000000..e5bcbc9 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/calibrate.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// calibrate.icf - Linker configuration file for calibrate. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/calibrate/calibrate.ld b/boards/dk-tm4c129x/calibrate/calibrate.ld new file mode 100644 index 0000000..f01d3ca --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/calibrate.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * calibrate.ld - Linker configuration file for calibrate. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/calibrate/calibrate.sct b/boards/dk-tm4c129x/calibrate/calibrate.sct new file mode 100644 index 0000000..f0e0d31 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/calibrate.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; calibrate.sct - Linker configuration file for calibrate. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/calibrate/calibrate.uvopt b/boards/dk-tm4c129x/calibrate/calibrate.uvopt new file mode 100644 index 0000000..0887712 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/calibrate.uvopt @@ -0,0 +1,373 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + calibrate + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\calibrate.c + calibrate.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 10 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/calibrate/calibrate.uvproj b/boards/dk-tm4c129x/calibrate/calibrate.uvproj new file mode 100644 index 0000000..cde2008 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/calibrate.uvproj @@ -0,0 +1,454 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + calibrate + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + calibrate + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\calibrate.bin .\rvmdk\calibrate.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + calibrate.sct + + + --entry Reset_Handler + + + + + + + + Source + + + calibrate.c + 1 + .\calibrate.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/calibrate/calibrate_ccs.cmd b/boards/dk-tm4c129x/calibrate/calibrate_ccs.cmd new file mode 100644 index 0000000..155d9ce --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/calibrate_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * calibrate_ccs.cmd - CCS linker configuration file for calibrate. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/calibrate/ccs/.ccsimportspec b/boards/dk-tm4c129x/calibrate/ccs/.ccsimportspec new file mode 100644 index 0000000..6e08123 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/calibrate/ccs/.ccsproject b/boards/dk-tm4c129x/calibrate/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/calibrate/ccs/.cproject b/boards/dk-tm4c129x/calibrate/ccs/.cproject new file mode 100644 index 0000000..a64e368 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/calibrate/ccs/.project b/boards/dk-tm4c129x/calibrate/ccs/.project new file mode 100644 index 0000000..2e27478 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/ccs/.project @@ -0,0 +1,75 @@ + + + calibrate + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + calibrate.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/calibrate/calibrate.c + + + calibrate_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/calibrate/calibrate_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/calibrate/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/calibrate/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/calibrate/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/calibrate/ccs/Debug/calibrate.bin b/boards/dk-tm4c129x/calibrate/ccs/Debug/calibrate.bin new file mode 100644 index 0000000..335f594 Binary files /dev/null and b/boards/dk-tm4c129x/calibrate/ccs/Debug/calibrate.bin differ diff --git a/boards/dk-tm4c129x/calibrate/ccs/Debug/calibrate.out b/boards/dk-tm4c129x/calibrate/ccs/Debug/calibrate.out new file mode 100644 index 0000000..2a25072 Binary files /dev/null and b/boards/dk-tm4c129x/calibrate/ccs/Debug/calibrate.out differ diff --git a/boards/dk-tm4c129x/calibrate/ccs/macros.ini_initial b/boards/dk-tm4c129x/calibrate/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/calibrate/ccs/target_config.ccxml b/boards/dk-tm4c129x/calibrate/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/calibrate/ewarm/Exe/calibrate.bin b/boards/dk-tm4c129x/calibrate/ewarm/Exe/calibrate.bin new file mode 100644 index 0000000..1d8f585 Binary files /dev/null and b/boards/dk-tm4c129x/calibrate/ewarm/Exe/calibrate.bin differ diff --git a/boards/dk-tm4c129x/calibrate/ewarm/Exe/calibrate.out b/boards/dk-tm4c129x/calibrate/ewarm/Exe/calibrate.out new file mode 100644 index 0000000..ed88518 Binary files /dev/null and b/boards/dk-tm4c129x/calibrate/ewarm/Exe/calibrate.out differ diff --git a/boards/dk-tm4c129x/calibrate/gcc/calibrate.axf b/boards/dk-tm4c129x/calibrate/gcc/calibrate.axf new file mode 100644 index 0000000..fae7625 Binary files /dev/null and b/boards/dk-tm4c129x/calibrate/gcc/calibrate.axf differ diff --git a/boards/dk-tm4c129x/calibrate/gcc/calibrate.bin b/boards/dk-tm4c129x/calibrate/gcc/calibrate.bin new file mode 100644 index 0000000..938bcc4 Binary files /dev/null and b/boards/dk-tm4c129x/calibrate/gcc/calibrate.bin differ diff --git a/boards/dk-tm4c129x/calibrate/readme.txt b/boards/dk-tm4c129x/calibrate/readme.txt new file mode 100644 index 0000000..47cf4f1 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/readme.txt @@ -0,0 +1,32 @@ +Calibration for the Touch Screen + +The raw sample interface of the touch screen driver is used to compute the +calibration matrix required to convert raw samples into screen X/Y +positions. The produced calibration matrix can be inserted into the touch +screen driver to map the raw samples into screen coordinates. + +The touch screen calibration is performed according to the algorithm +described by Carlos E. Videles in the June 2002 issue of Embedded Systems +Design. It can be found online at + +http://www.embedded.com/story/OEG20020529S0046. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/calibrate/rvmdk/calibrate.axf b/boards/dk-tm4c129x/calibrate/rvmdk/calibrate.axf new file mode 100644 index 0000000..f991ec4 Binary files /dev/null and b/boards/dk-tm4c129x/calibrate/rvmdk/calibrate.axf differ diff --git a/boards/dk-tm4c129x/calibrate/rvmdk/calibrate.bin b/boards/dk-tm4c129x/calibrate/rvmdk/calibrate.bin new file mode 100644 index 0000000..a1b0516 Binary files /dev/null and b/boards/dk-tm4c129x/calibrate/rvmdk/calibrate.bin differ diff --git a/boards/dk-tm4c129x/calibrate/startup_ccs.c b/boards/dk-tm4c129x/calibrate/startup_ccs.c new file mode 100644 index 0000000..5d2884c --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/calibrate/startup_ewarm.c b/boards/dk-tm4c129x/calibrate/startup_ewarm.c new file mode 100644 index 0000000..860b8a6 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/calibrate/startup_gcc.c b/boards/dk-tm4c129x/calibrate/startup_gcc.c new file mode 100644 index 0000000..fad3049 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/calibrate/startup_rvmdk.S b/boards/dk-tm4c129x/calibrate/startup_rvmdk.S new file mode 100644 index 0000000..07659c1 --- /dev/null +++ b/boards/dk-tm4c129x/calibrate/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/crc32/Makefile b/boards/dk-tm4c129x/crc32/Makefile new file mode 100644 index 0000000..37e6da9 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the CRC32 Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the CRC32 Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/crc32.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the CRC32 Demo. +# +${COMPILER}/crc32.axf: ${COMPILER}/crc32.o +${COMPILER}/crc32.axf: ${COMPILER}/frame.o +${COMPILER}/crc32.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/crc32.axf: ${COMPILER}/pinout.o +${COMPILER}/crc32.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/crc32.axf: ${COMPILER}/uartstdio.o +${COMPILER}/crc32.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/crc32.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/crc32.axf: crc32.ld +SCATTERgcc_crc32=crc32.ld +ENTRY_crc32=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/crc32/ccs/.ccsimportspec b/boards/dk-tm4c129x/crc32/ccs/.ccsimportspec new file mode 100644 index 0000000..28f3e67 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/crc32/ccs/.ccsproject b/boards/dk-tm4c129x/crc32/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/crc32/ccs/.cproject b/boards/dk-tm4c129x/crc32/ccs/.cproject new file mode 100644 index 0000000..cd9f8e6 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/crc32/ccs/.project b/boards/dk-tm4c129x/crc32/ccs/.project new file mode 100644 index 0000000..b8532d1 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/ccs/.project @@ -0,0 +1,70 @@ + + + crc32 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + crc32.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/crc32/crc32.c + + + crc32_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/crc32/crc32_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/crc32/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/crc32/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/crc32/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/crc32/ccs/Debug/crc32.bin b/boards/dk-tm4c129x/crc32/ccs/Debug/crc32.bin new file mode 100644 index 0000000..3eaa73f Binary files /dev/null and b/boards/dk-tm4c129x/crc32/ccs/Debug/crc32.bin differ diff --git a/boards/dk-tm4c129x/crc32/ccs/Debug/crc32.out b/boards/dk-tm4c129x/crc32/ccs/Debug/crc32.out new file mode 100644 index 0000000..1b04299 Binary files /dev/null and b/boards/dk-tm4c129x/crc32/ccs/Debug/crc32.out differ diff --git a/boards/dk-tm4c129x/crc32/ccs/macros.ini_initial b/boards/dk-tm4c129x/crc32/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/crc32/ccs/target_config.ccxml b/boards/dk-tm4c129x/crc32/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/crc32/crc32.c b/boards/dk-tm4c129x/crc32/crc32.c new file mode 100644 index 0000000..72e4b9b --- /dev/null +++ b/boards/dk-tm4c129x/crc32/crc32.c @@ -0,0 +1,482 @@ +//***************************************************************************** +// +// crc32.c - Simple CRC-32 demo +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ccm.h" +#include "inc/hw_memmap.h" +#include "driverlib/crc.h" +#include "driverlib/debug.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

CRC-32 Demo (crc32)

+//! +//! Simple demo showing an CRC-32 operation using the CCM module. +//! +//! Please note that the use of uDMA is not required for the operation of the +//! CRC module. It is for demostration purposes only. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Random data for use with the test vectors. +// +//***************************************************************************** +uint32_t g_pui32RandomData[] = +{ + 0x8a5f1b22, 0xcb935d29, 0xcc1ac092, 0x5dad8c9e, 0x6a83b39f, 0x8607dc60, + 0xda0ba4d2, 0xf49b0fa2, 0xaf35d524, 0xffa8001d, 0xbcc931e8, 0x4a2c99ef, + 0x7fa297ab, 0xab943bae, 0x07c61cc4, 0x47c8627d +}; + +//***************************************************************************** +// +// Test Vector Structure +// +//***************************************************************************** +typedef struct CRCTestVectorStruct +{ + uint32_t ui32TestNumber; + uint32_t ui32Seed; + uint32_t ui32Result; +} +tCRCTestVector; + +//***************************************************************************** +// +// CRC-32 Test Vectors +// +//***************************************************************************** +tCRCTestVector g_psCRC4C11DB7TestVectors[3] = +{ + { + 0, + 0x00000000, + 0xbcc90d0d + }, + { + 1, + 0xffffffff, + 0x2ff0435c + }, + { + 2, + 0xa5a5a5a5, + 0x75fd6f5c + } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Process data to produce a CRC-32 checksum. +// +//***************************************************************************** +uint32_t +CRC32DataProcess(uint32_t *pui32Data, uint32_t ui32Length, uint32_t ui32Seed, + bool bUseDMA) +{ + uint32_t ui32Result; + + // + // Perform a soft reset. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + } + + // + // Configure the CRC engine. + // + ROM_CRCConfigSet(CCM0_BASE, (CRC_CFG_INIT_SEED | CRC_CFG_TYPE_P4C11DB7 | + CRC_CFG_SIZE_32BIT)); + + // + // Write the seed. + // + ROM_CRCSeedSet(CCM0_BASE, ui32Seed); + + // + // Generate CRC using uDMA to copy data. + // + if(bUseDMA) + { + // + // Setup the DMA module to copy data in. + // + ROM_uDMAChannelAssign(UDMA_CH30_SW); + ROM_uDMAChannelAttributeDisable(UDMA_CH30_SW, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH30_SW | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_1 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH30_SW | UDMA_PRI_SELECT, + UDMA_MODE_AUTO, (void *)g_pui32RandomData, + (void *)(CCM0_BASE + CCM_O_CRCDIN), + ui32Length); + ROM_uDMAChannelEnable(UDMA_CH30_SW); + UARTprintf(" Data in DMA request enabled.\n"); + + // + // Start the uDMA. + // + ROM_uDMAChannelRequest(UDMA_CH30_SW | UDMA_PRI_SELECT); + + // + // Wait for the transfer to finish. + // + while(ROM_uDMAChannelIsEnabled(UDMA_CH30_SW)) + { + } + + // + // Read the result. + // + ui32Result = ROM_CRCResultRead(CCM0_BASE, false); + } + + // + // Generate CRC using CPU to copy data. + // + else + { + ui32Result = ROM_CRCDataProcess(CCM0_BASE, g_pui32RandomData, + ui32Length, false); + } + + return(ui32Result); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// Initialize the CRC and CCM modules. +// +//***************************************************************************** +bool +CRCInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// This example performs a CRC-32 operation on an array of data using a +// number of starting seeds. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Result, ui32Errors, ui32Idx, ui32SysClock; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "crc32-demo"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting CRC-32 demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CRC and CCM modules. + // + if(!CRCInit()) + { + UARTprintf("Initialization of the CRC module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Run through the test vectors. + // + for(ui32Idx = 0; + ui32Idx < (sizeof(g_psCRC4C11DB7TestVectors) / sizeof(tCRCTestVector)); + ui32Idx++) + { + UARTprintf("Starting vector #%d\n", ui32Idx); + + // + // Generate the checksum without uDMA. + // + UARTprintf("Generating CRC-32 checksum without uDMA.\n"); + ui32Result = + CRC32DataProcess(g_pui32RandomData, + (sizeof(g_pui32RandomData) / 4), + g_psCRC4C11DB7TestVectors[ui32Idx].ui32Seed, + false); + + if(ui32Result != g_psCRC4C11DB7TestVectors[ui32Idx].ui32Result) + { + UARTprintf("CRC result mismatch - Exp: 0x%08x, Act: 0x%08x\n", + g_psCRC4C11DB7TestVectors[ui32Idx].ui32Result, + ui32Result); + } + + // + // Generate the checksum with uDMA. + // + UARTprintf("Generating CRC-32 checksum with uDMA.\n"); + ui32Result = + CRC32DataProcess(g_pui32RandomData, + (sizeof(g_pui32RandomData) / 4), + g_psCRC4C11DB7TestVectors[ui32Idx].ui32Seed, + true); + + if(ui32Result != g_psCRC4C11DB7TestVectors[ui32Idx].ui32Result) + { + UARTprintf("CRC result mismatch - Exp: 0x%08x, Act: 0x%08x\n", + g_psCRC4C11DB7TestVectors[ui32Idx].ui32Result, + ui32Result); + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/crc32/crc32.ewd b/boards/dk-tm4c129x/crc32/crc32.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/crc32/crc32.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/crc32/crc32.ewp b/boards/dk-tm4c129x/crc32/crc32.ewp new file mode 100644 index 0000000..5e9f117 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/crc32.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\crc32.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/crc32/crc32.icf b/boards/dk-tm4c129x/crc32/crc32.icf new file mode 100644 index 0000000..24b3339 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/crc32.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// crc32.icf - Linker configuration file for crc32. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/crc32/crc32.ld b/boards/dk-tm4c129x/crc32/crc32.ld new file mode 100644 index 0000000..ab51ed6 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/crc32.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * crc32.ld - Linker configuration file for crc32. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/crc32/crc32.sct b/boards/dk-tm4c129x/crc32/crc32.sct new file mode 100644 index 0000000..409bac3 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/crc32.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; crc32.sct - Linker configuration file for crc32. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/crc32/crc32.uvopt b/boards/dk-tm4c129x/crc32/crc32.uvopt new file mode 100644 index 0000000..d56f2d6 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/crc32.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + crc32 + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\crc32.c + crc32.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/crc32/crc32.uvproj b/boards/dk-tm4c129x/crc32/crc32.uvproj new file mode 100644 index 0000000..c38009d --- /dev/null +++ b/boards/dk-tm4c129x/crc32/crc32.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + crc32 + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + crc32 + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\crc32.bin .\rvmdk\crc32.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + crc32.sct + + + --entry Reset_Handler + + + + + + + + Source + + + crc32.c + 1 + .\crc32.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/crc32/crc32_ccs.cmd b/boards/dk-tm4c129x/crc32/crc32_ccs.cmd new file mode 100644 index 0000000..2177b9b --- /dev/null +++ b/boards/dk-tm4c129x/crc32/crc32_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * crc32_ccs.cmd - CCS linker configuration file for crc32. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/crc32/ewarm/Exe/crc32.bin b/boards/dk-tm4c129x/crc32/ewarm/Exe/crc32.bin new file mode 100644 index 0000000..2d5a6bc Binary files /dev/null and b/boards/dk-tm4c129x/crc32/ewarm/Exe/crc32.bin differ diff --git a/boards/dk-tm4c129x/crc32/ewarm/Exe/crc32.out b/boards/dk-tm4c129x/crc32/ewarm/Exe/crc32.out new file mode 100644 index 0000000..202700b Binary files /dev/null and b/boards/dk-tm4c129x/crc32/ewarm/Exe/crc32.out differ diff --git a/boards/dk-tm4c129x/crc32/gcc/crc32.axf b/boards/dk-tm4c129x/crc32/gcc/crc32.axf new file mode 100644 index 0000000..b2f0933 Binary files /dev/null and b/boards/dk-tm4c129x/crc32/gcc/crc32.axf differ diff --git a/boards/dk-tm4c129x/crc32/gcc/crc32.bin b/boards/dk-tm4c129x/crc32/gcc/crc32.bin new file mode 100644 index 0000000..871e08b Binary files /dev/null and b/boards/dk-tm4c129x/crc32/gcc/crc32.bin differ diff --git a/boards/dk-tm4c129x/crc32/readme.txt b/boards/dk-tm4c129x/crc32/readme.txt new file mode 100644 index 0000000..6014a90 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/readme.txt @@ -0,0 +1,26 @@ +CRC-32 Demo + +Simple demo showing an CRC-32 operation using the CCM module. + +Please note that the use of uDMA is not required for the operation of the +CRC module. It is for demostration purposes only. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/crc32/rvmdk/crc32.axf b/boards/dk-tm4c129x/crc32/rvmdk/crc32.axf new file mode 100644 index 0000000..9c8f521 Binary files /dev/null and b/boards/dk-tm4c129x/crc32/rvmdk/crc32.axf differ diff --git a/boards/dk-tm4c129x/crc32/rvmdk/crc32.bin b/boards/dk-tm4c129x/crc32/rvmdk/crc32.bin new file mode 100644 index 0000000..bff5ff5 Binary files /dev/null and b/boards/dk-tm4c129x/crc32/rvmdk/crc32.bin differ diff --git a/boards/dk-tm4c129x/crc32/startup_ccs.c b/boards/dk-tm4c129x/crc32/startup_ccs.c new file mode 100644 index 0000000..a769216 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/startup_ccs.c @@ -0,0 +1,268 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/crc32/startup_ewarm.c b/boards/dk-tm4c129x/crc32/startup_ewarm.c new file mode 100644 index 0000000..d029bd0 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/startup_ewarm.c @@ -0,0 +1,299 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/crc32/startup_gcc.c b/boards/dk-tm4c129x/crc32/startup_gcc.c new file mode 100644 index 0000000..ae455f8 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/startup_gcc.c @@ -0,0 +1,315 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/crc32/startup_rvmdk.S b/boards/dk-tm4c129x/crc32/startup_rvmdk.S new file mode 100644 index 0000000..6ee1b83 --- /dev/null +++ b/boards/dk-tm4c129x/crc32/startup_rvmdk.S @@ -0,0 +1,324 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/dk-tm4c129x.eww b/boards/dk-tm4c129x/dk-tm4c129x.eww new file mode 100644 index 0000000..d5ba7a9 --- /dev/null +++ b/boards/dk-tm4c129x/dk-tm4c129x.eww @@ -0,0 +1,464 @@ + + + + + $WS_DIR$\..\..\..\driverlib\driverlib.ewp + + + $WS_DIR$\..\..\..\grlib\grlib.ewp + + + $WS_DIR$\..\..\..\usblib\usblib.ewp + + + $WS_DIR$\aes_cbc_decrypt\aes_cbc_decrypt.ewp + + + $WS_DIR$\aes_cbc_encrypt\aes_cbc_encrypt.ewp + + + $WS_DIR$\aes_ccm_decrypt\aes_ccm_decrypt.ewp + + + $WS_DIR$\aes_ccm_encrypt\aes_ccm_encrypt.ewp + + + $WS_DIR$\aes_cmac\aes_cmac.ewp + + + $WS_DIR$\aes_ecb_decrypt\aes_ecb_decrypt.ewp + + + $WS_DIR$\aes_ecb_encrypt\aes_ecb_encrypt.ewp + + + $WS_DIR$\aes_gcm_decrypt\aes_gcm_decrypt.ewp + + + $WS_DIR$\aes_gcm_encrypt\aes_gcm_encrypt.ewp + + + $WS_DIR$\bitband\bitband.ewp + + + $WS_DIR$\ble_btool\ble_btool.ewp + + + $WS_DIR$\ble_central\ble_central.ewp + + + $WS_DIR$\blinky\blinky.ewp + + + $WS_DIR$\boot_demo_uart\boot_demo_uart.ewp + + + $WS_DIR$\boot_demo_usb\boot_demo_usb.ewp + + + $WS_DIR$\boot_demo_emac_flash\boot_demo_emac_flash.ewp + + + $WS_DIR$\boot_demo_flash\boot_demo_flash.ewp + + + $WS_DIR$\boot_emac_flash\boot_emac_flash.ewp + + + $WS_DIR$\calibrate\calibrate.ewp + + + $WS_DIR$\crc32\crc32.ewp + + + $WS_DIR$\enet_io\enet_io.ewp + + + $WS_DIR$\enet_lwip\enet_lwip.ewp + + + $WS_DIR$\enet_uip\enet_uip.ewp + + + $WS_DIR$\fontview\fontview.ewp + + + $WS_DIR$\freertos_demo\freertos_demo.ewp + + + $WS_DIR$\gpio_jtag\gpio_jtag.ewp + + + $WS_DIR$\grlib_demo\grlib_demo.ewp + + + $WS_DIR$\grlib_driver_test\grlib_driver_test.ewp + + + $WS_DIR$\hello\hello.ewp + + + $WS_DIR$\hello_widget\hello_widget.ewp + + + $WS_DIR$\hibernate\hibernate.ewp + + + $WS_DIR$\interrupts\interrupts.ewp + + + $WS_DIR$\lang_demo\lang_demo.ewp + + + $WS_DIR$\mpu_fault\mpu_fault.ewp + + + $WS_DIR$\qs_weather\qs_weather.ewp + + + $WS_DIR$\scribble\scribble.ewp + + + $WS_DIR$\sd_card\sd_card.ewp + + + $WS_DIR$\sha1_hash\sha1_hash.ewp + + + $WS_DIR$\sha1_hmac\sha1_hmac.ewp + + + $WS_DIR$\synth\synth.ewp + + + $WS_DIR$\tamper\tamper.ewp + + + $WS_DIR$\tdes_cbc_decrypt\tdes_cbc_decrypt.ewp + + + $WS_DIR$\tdes_cbc_encrypt\tdes_cbc_encrypt.ewp + + + $WS_DIR$\timers\timers.ewp + + + $WS_DIR$\uart_echo\uart_echo.ewp + + + $WS_DIR$\udma_demo\udma_demo.ewp + + + $WS_DIR$\usb_dev_bulk\usb_dev_bulk.ewp + + + $WS_DIR$\usb_dev_chid\usb_dev_chid.ewp + + + $WS_DIR$\usb_dev_gamepad\usb_dev_gamepad.ewp + + + $WS_DIR$\usb_dev_keyboard\usb_dev_keyboard.ewp + + + $WS_DIR$\usb_dev_msc\usb_dev_msc.ewp + + + $WS_DIR$\usb_dev_serial\usb_dev_serial.ewp + + + $WS_DIR$\usb_host_audio\usb_host_audio.ewp + + + $WS_DIR$\usb_host_audio_in\usb_host_audio_in.ewp + + + $WS_DIR$\usb_host_hub\usb_host_hub.ewp + + + $WS_DIR$\usb_host_keyboard\usb_host_keyboard.ewp + + + $WS_DIR$\usb_host_mouse\usb_host_mouse.ewp + + + $WS_DIR$\usb_host_msc\usb_host_msc.ewp + + + $WS_DIR$\usb_otg_mouse\usb_otg_mouse.ewp + + + $WS_DIR$\usb_stick_demo\usb_stick_demo.ewp + + + $WS_DIR$\usb_stick_update\usb_stick_update.ewp + + + $WS_DIR$\watchdog\watchdog.ewp + + + + All Examples + + driverlib + Debug + + + grlib + Debug + + + usblib + Debug + + + aes_cbc_decrypt + Debug + + + aes_cbc_encrypt + Debug + + + aes_ccm_decrypt + Debug + + + aes_ccm_encrypt + Debug + + + aes_cmac + Debug + + + aes_ecb_decrypt + Debug + + + aes_ecb_encrypt + Debug + + + aes_gcm_decrypt + Debug + + + aes_gcm_encrypt + Debug + + + bitband + Debug + + + ble_btool + Debug + + + ble_central + Debug + + + blinky + Debug + + + boot_demo_uart + Debug + + + boot_demo_usb + Debug + + + boot_demo_emac_flash + Debug + + + boot_demo_flash + Debug + + + boot_emac_flash + Debug + + + calibrate + Debug + + + crc32 + Debug + + + enet_io + Debug + + + enet_lwip + Debug + + + enet_uip + Debug + + + fontview + Debug + + + freertos_demo + Debug + + + gpio_jtag + Debug + + + grlib_demo + Debug + + + grlib_driver_test + Debug + + + hello + Debug + + + hello_widget + Debug + + + hibernate + Debug + + + interrupts + Debug + + + lang_demo + Debug + + + mpu_fault + Debug + + + qs_weather + Debug + + + scribble + Debug + + + sd_card + Debug + + + sha1_hash + Debug + + + sha1_hmac + Debug + + + synth + Debug + + + tamper + Debug + + + tdes_cbc_decrypt + Debug + + + tdes_cbc_encrypt + Debug + + + timers + Debug + + + uart_echo + Debug + + + udma_demo + Debug + + + usb_dev_bulk + Debug + + + usb_dev_chid + Debug + + + usb_dev_gamepad + Debug + + + usb_dev_keyboard + Debug + + + usb_dev_msc + Debug + + + usb_dev_serial + Debug + + + usb_host_audio + Debug + + + usb_host_audio_in + Debug + + + usb_host_hub + Debug + + + usb_host_keyboard + Debug + + + usb_host_mouse + Debug + + + usb_host_msc + Debug + + + usb_otg_mouse + Debug + + + usb_stick_demo + Debug + + + usb_stick_update + Debug + + + watchdog + Debug + + + + diff --git a/boards/dk-tm4c129x/dk-tm4c129x.uvmpw b/boards/dk-tm4c129x/dk-tm4c129x.uvmpw new file mode 100644 index 0000000..e00306c --- /dev/null +++ b/boards/dk-tm4c129x/dk-tm4c129x.uvmpw @@ -0,0 +1,335 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + dk-tm4c129x + + + ..\..\..\driverlib\driverlib.uvproj + 1 + + + + ..\..\..\grlib\grlib.uvproj + 1 + + + + ..\..\..\usblib\usblib.uvproj + 1 + + + + .\aes_cbc_decrypt\aes_cbc_decrypt.uvproj + 1 + + + + .\aes_cbc_encrypt\aes_cbc_encrypt.uvproj + 1 + + + + .\aes_ccm_decrypt\aes_ccm_decrypt.uvproj + 1 + + + + .\aes_ccm_encrypt\aes_ccm_encrypt.uvproj + 1 + + + + .\aes_cmac\aes_cmac.uvproj + 1 + + + + .\aes_ecb_decrypt\aes_ecb_decrypt.uvproj + 1 + + + + .\aes_ecb_encrypt\aes_ecb_encrypt.uvproj + 1 + + + + .\aes_gcm_decrypt\aes_gcm_decrypt.uvproj + 1 + + + + .\aes_gcm_encrypt\aes_gcm_encrypt.uvproj + 1 + + + + .\bitband\bitband.uvproj + 1 + + + + .\ble_btool\ble_btool.uvproj + 1 + + + + .\ble_central\ble_central.uvproj + 1 + + + + .\blinky\blinky.uvproj + 1 + + + + .\boot_demo_uart\boot_demo_uart.uvproj + 1 + + + + .\boot_demo_usb\boot_demo_usb.uvproj + 1 + + + + .\boot_demo_emac_flash\boot_demo_emac_flash.uvproj + 1 + + + + .\boot_demo_flash\boot_demo_flash.uvproj + 1 + + + + .\boot_emac_flash\boot_emac_flash.uvproj + 1 + + + + .\calibrate\calibrate.uvproj + 1 + + + + .\crc32\crc32.uvproj + 1 + + + + .\enet_io\enet_io.uvproj + 1 + + + + .\enet_lwip\enet_lwip.uvproj + 1 + + + + .\enet_uip\enet_uip.uvproj + 1 + + + + .\fontview\fontview.uvproj + 1 + + + + .\freertos_demo\freertos_demo.uvproj + 1 + + + + .\gpio_jtag\gpio_jtag.uvproj + 1 + + + + .\grlib_demo\grlib_demo.uvproj + 1 + + + + .\grlib_driver_test\grlib_driver_test.uvproj + 1 + + + + .\hello\hello.uvproj + 1 + + + + .\hello_widget\hello_widget.uvproj + 1 + + + + .\hibernate\hibernate.uvproj + 1 + + + + .\interrupts\interrupts.uvproj + 1 + + + + .\lang_demo\lang_demo.uvproj + 1 + + + + .\mpu_fault\mpu_fault.uvproj + 1 + + + + .\qs_weather\qs_weather.uvproj + 1 + + + + .\scribble\scribble.uvproj + 1 + + + + .\sd_card\sd_card.uvproj + 1 + + + + .\sha1_hash\sha1_hash.uvproj + 1 + + + + .\sha1_hmac\sha1_hmac.uvproj + 1 + + + + .\synth\synth.uvproj + 1 + + + + .\tamper\tamper.uvproj + 1 + + + + .\tdes_cbc_decrypt\tdes_cbc_decrypt.uvproj + 1 + + + + .\tdes_cbc_encrypt\tdes_cbc_encrypt.uvproj + 1 + + + + .\timers\timers.uvproj + 1 + + + + .\uart_echo\uart_echo.uvproj + 1 + + + + .\udma_demo\udma_demo.uvproj + 1 + + + + .\usb_dev_bulk\usb_dev_bulk.uvproj + 1 + + + + .\usb_dev_chid\usb_dev_chid.uvproj + 1 + + + + .\usb_dev_gamepad\usb_dev_gamepad.uvproj + 1 + + + + .\usb_dev_keyboard\usb_dev_keyboard.uvproj + 1 + + + + .\usb_dev_msc\usb_dev_msc.uvproj + 1 + + + + .\usb_dev_serial\usb_dev_serial.uvproj + 1 + + + + .\usb_host_audio\usb_host_audio.uvproj + 1 + + + + .\usb_host_audio_in\usb_host_audio_in.uvproj + 1 + + + + .\usb_host_hub\usb_host_hub.uvproj + 1 + + + + .\usb_host_keyboard\usb_host_keyboard.uvproj + 1 + + + + .\usb_host_mouse\usb_host_mouse.uvproj + 1 + + + + .\usb_host_msc\usb_host_msc.uvproj + 1 + + + + .\usb_otg_mouse\usb_otg_mouse.uvproj + 1 + + + + .\usb_stick_demo\usb_stick_demo.uvproj + 1 + + + + .\usb_stick_update\usb_stick_update.uvproj + 1 + + + + .\watchdog\watchdog.uvproj + 1 + + +
diff --git a/boards/dk-tm4c129x/drivers/buttons.c b/boards/dk-tm4c129x/drivers/buttons.c new file mode 100644 index 0000000..d752c24 --- /dev/null +++ b/boards/dk-tm4c129x/drivers/buttons.c @@ -0,0 +1,261 @@ +//***************************************************************************** +// +// buttons.c - DK-TM4C129X development board buttons driver. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/pin_map.h" +#include "driverlib/gpio.h" +#include "drivers/buttons.h" + +//***************************************************************************** +// +//! \addtogroup buttons_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Holds the current, debounced state of each button. A 0 in a bit indicates +// that that button is currently pressed, otherwise it is released. +// We assume that we start with all the buttons released (though if one is +// pressed when the application starts, this will be detected). +// +//***************************************************************************** +static uint8_t g_ui8ButtonStates; + +static uint8_t g_uiButtonsEnabled; + +//***************************************************************************** +// +//! Polls the current state of the buttons and determines which have changed. +//! +//! \param pui8Delta points to a character that will be written to indicate +//! which button states changed since the last time this function was called. +//! This value is derived from the debounced state of the buttons. +//! \param pui8RawState points to a location where the raw button state will +//! be stored. +//! +//! This function should be called periodically by the application to poll the +//! pushbuttons. It determines both the current debounced state of the buttons +//! and also which buttons have changed state since the last time the function +//! was called. +//! +//! In order for button debouncing to work properly, this function should be +//! caled at a regular interval, even if the state of the buttons is not needed +//! that often. +//! +//! If button debouncing is not required, the the caller can pass a pointer +//! for the \e pui8RawState parameter in order to get the raw state of the +//! buttons. The value returned in \e pui8RawState will be a bit mask where +//! a 1 indicates the buttons is pressed. +//! +//! \return Returns the current debounced state of the buttons where a 1 in the +//! button ID's position indicates that the button is pressed and a 0 +//! indicates that it is released. +// +//***************************************************************************** +uint8_t +ButtonsPoll(uint8_t *pui8Delta, uint8_t *pui8RawState) +{ + uint32_t ui32Delta; + uint32_t ui32Data; + static uint8_t ui8SwitchClockA = 0; + static uint8_t ui8SwitchClockB = 0; + + // + // Read the raw state of the push buttons. Save the raw state + // (inverting the bit sense) if the caller supplied storage for the + // raw value. + // + ui32Data = 0; + if(g_uiButtonsEnabled & UP_BUTTON) + { + ui32Data = ROM_GPIOPinRead(GPIO_PORTN_BASE, UP_BUTTON); + } + if(g_uiButtonsEnabled & DOWN_BUTTON) + { + ui32Data |= ROM_GPIOPinRead(GPIO_PORTE_BASE, DOWN_BUTTON); + } + if(g_uiButtonsEnabled & SELECT_BUTTON) + { + ui32Data |= ROM_GPIOPinRead(GPIO_PORTP_BASE, SELECT_BUTTON); + } + + if(pui8RawState) + { + *pui8RawState = (uint8_t)~ui32Data; + } + + // + // Determine the switches that are at a different state than the debounced + // state. + // + ui32Delta = ui32Data ^ g_ui8ButtonStates; + + // + // Increment the clocks by one. + // + ui8SwitchClockA ^= ui8SwitchClockB; + ui8SwitchClockB = ~ui8SwitchClockB; + + // + // Reset the clocks corresponding to switches that have not changed state. + // + ui8SwitchClockA &= ui32Delta; + ui8SwitchClockB &= ui32Delta; + + // + // Get the new debounced switch state. + // + g_ui8ButtonStates &= ui8SwitchClockA | ui8SwitchClockB; + g_ui8ButtonStates |= (~(ui8SwitchClockA | ui8SwitchClockB)) & ui32Data; + + // + // Determine the switches that just changed debounced state. + // + ui32Delta ^= (ui8SwitchClockA | ui8SwitchClockB); + + // + // Store the bit mask for the buttons that have changed for return to + // caller. + // + if(pui8Delta) + { + *pui8Delta = (uint8_t)ui32Delta; + } + + // + // Return the debounced buttons states to the caller. Invert the bit + // sense so that a '1' indicates the button is pressed, which is a + // sensible way to interpret the return value. + // + return(~g_ui8ButtonStates); +} + +//***************************************************************************** +// +//! Initializes the GPIO pins used by the board pushbuttons. +//! +//! \param ui8Buttons is the logical OR of the buttons to initialize. +//! +//! This function must be called during application initialization to +//! configure the GPIO pins to which the pushbuttons are attached. It enables +//! the port used by the buttons and configures each button GPIO as an input +//! with a weak pull-up. The \e ui8Buttons value must be a logical OR +//! combination of the following three buttons on the board: \b UP_BUTTON, +//! \b DOWN_BUTTON, or \b SELECT_BUTTON. +//! +//! \return None. +// +//***************************************************************************** +void +ButtonsInit(uint8_t ui8Buttons) +{ + // + // Initialize the button state. + // + g_ui8ButtonStates = 0; + + // + // Save the buttons in use. + // + g_uiButtonsEnabled = ui8Buttons; + + if(ui8Buttons & UP_BUTTON) + { + // + // Enable the GPIO port to which the up button is connected. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION); + + // + // Set the up button's GPIO pins as an input with a pull-up. + // + ROM_GPIODirModeSet(GPIO_PORTN_BASE, UP_BUTTON, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(GPIO_PORTN_BASE, UP_BUTTON, + GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + + // + // Initialize the debounced button state with the current state read + // from the GPIO bank. + // + g_ui8ButtonStates = ROM_GPIOPinRead(GPIO_PORTN_BASE, UP_BUTTON); + } + + if(ui8Buttons & DOWN_BUTTON) + { + // + // Enable the GPIO port to which the down button is connected. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); + + // + // Set the down button's GPIO pins as an input with a pull-up. + // + ROM_GPIODirModeSet(GPIO_PORTE_BASE, DOWN_BUTTON, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(GPIO_PORTE_BASE, DOWN_BUTTON, + GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + + // + // Initialize the debounced button state with the current state read + // from the GPIO bank. + // + g_ui8ButtonStates |= ROM_GPIOPinRead(GPIO_PORTE_BASE, DOWN_BUTTON); + } + + if(ui8Buttons & SELECT_BUTTON) + { + // + // Enable the GPIO port to which the select button is connected. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP); + + // + // Set the select button's GPIO pins as an input with a pull-up. + // + ROM_GPIODirModeSet(GPIO_PORTP_BASE, SELECT_BUTTON, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(GPIO_PORTP_BASE, SELECT_BUTTON, + GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + + // + // Initialize the debounced button state with the current state read + // from the GPIO bank. + // + g_ui8ButtonStates |= ROM_GPIOPinRead(GPIO_PORTP_BASE, SELECT_BUTTON); + } +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c129x/drivers/buttons.h b/boards/dk-tm4c129x/drivers/buttons.h new file mode 100644 index 0000000..23ccd8a --- /dev/null +++ b/boards/dk-tm4c129x/drivers/buttons.h @@ -0,0 +1,105 @@ +//***************************************************************************** +// +// buttons.h - Prototypes for the DK-TM4C129X development board buttons driver. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __BUTTONS_H__ +#define __BUTTONS_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the hardware resources used by the pushbuttons. +// +// The switches are on the following ports/pins: +// +// PN3 - Up Button (UP_BUTTON) +// PE5 - Down Button (DOWN_BUTTON) +// PP1 - Select Button (SELECT_BUTTON) +// +// The switches tie the GPIO to ground, so the GPIOs need to be configured +// with pull-ups, and a value of 0 means the switch is pressed. +// +//***************************************************************************** +#define NUM_BUTTONS 3 +#define UP_BUTTON GPIO_PIN_3 +#define DOWN_BUTTON GPIO_PIN_5 +#define SELECT_BUTTON GPIO_PIN_1 + +#define ALL_BUTTONS (UP_BUTTON | DOWN_BUTTON | SELECT_BUTTON) + +//***************************************************************************** +// +// Useful macros for detecting button events. +// +//***************************************************************************** +#define BUTTON_PRESSED(button, buttons, changed) \ + (((button) & (changed)) && ((button) & (buttons))) + +#define BUTTON_RELEASED(button, buttons, changed) \ + (((button) & (changed)) && !((button) & (buttons))) + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Functions exported from buttons.c +// +//***************************************************************************** +extern void ButtonsInit(uint8_t ui8Buttons); +extern uint8_t ButtonsPoll(uint8_t *pui8Delta, uint8_t *pui8Raw); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** + +#endif // __BUTTONS_H__ diff --git a/boards/dk-tm4c129x/drivers/frame.c b/boards/dk-tm4c129x/drivers/frame.c new file mode 100644 index 0000000..625d10d --- /dev/null +++ b/boards/dk-tm4c129x/drivers/frame.c @@ -0,0 +1,1539 @@ +//***************************************************************************** +// +// frame.c - Draws a standard application frame on the LCD. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" +#include "drivers/frame.h" + +//***************************************************************************** +// +//! \addtogroup frame_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// The top left corner of the border. +// +//***************************************************************************** +static const uint8_t g_pui8TopLeft[] = +{ + IMAGE_FMT_8BPP_UNCOMP, + 10, 0, + 26, 0, + + 37, + 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, + 0x0a, 0x00, 0x00, + 0x0b, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x11, 0x00, 0x00, + 0x13, 0x00, 0x00, + 0x14, 0x00, 0x00, + 0x16, 0x00, 0x00, + 0x20, 0x00, 0x00, + 0x21, 0x00, 0x00, + 0x22, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x24, 0x00, 0x00, + 0x25, 0x00, 0x00, + 0x26, 0x00, 0x00, + 0x27, 0x00, 0x00, + 0x28, 0x00, 0x00, + 0x29, 0x00, 0x00, + 0x2a, 0x00, 0x00, + 0x2b, 0x00, 0x00, + 0x2c, 0x00, 0x00, + 0x2d, 0x00, 0x00, + 0x2e, 0x00, 0x00, + 0x2f, 0x00, 0x00, + 0x40, 0x00, 0x00, + 0x44, 0x00, 0x00, + 0x46, 0x00, 0x00, + 0x48, 0x00, 0x00, + 0x4a, 0x00, 0x00, + 0x4c, 0x00, 0x00, + 0x50, 0x00, 0x00, + 0x52, 0x00, 0x00, + 0x54, 0x00, 0x00, + 0x56, 0x00, 0x00, + 0x58, 0x00, 0x00, + 0x5c, 0x00, 0x00, + 0x5e, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x15, 0x24, 0x1b, 0x1d, 0x23, 0x1c, 0x1f, 0x00, 0x13, + 0x1a, 0x1b, 0x10, 0x0a, 0x0b, 0x0e, 0x0e, 0x17, 0x00, 0x1c, 0x17, 0x0e, + 0x17, 0x14, 0x10, 0x0d, 0x18, 0x0a, 0x0b, 0x20, 0x0d, 0x0b, 0x14, 0x10, + 0x10, 0x0c, 0x16, 0x0b, 0x1c, 0x0f, 0x0e, 0x12, 0x0a, 0x10, 0x13, 0x16, + 0x0e, 0x18, 0x1e, 0x18, 0x12, 0x0a, 0x0f, 0x13, 0x17, 0x16, 0x12, 0x0f, + 0x24, 0x14, 0x16, 0x12, 0x12, 0x12, 0x18, 0x10, 0x0e, 0x0f, 0x25, 0x14, + 0x18, 0x10, 0x0d, 0x0e, 0x0a, 0x16, 0x0c, 0x11, 0x1c, 0x0d, 0x0d, 0x0c, + 0x0a, 0x16, 0x11, 0x0f, 0x17, 0x0c, 0x24, 0x0b, 0x0e, 0x0c, 0x0b, 0x17, + 0x17, 0x15, 0x10, 0x0b, 0x21, 0x15, 0x0f, 0x10, 0x10, 0x13, 0x09, 0x11, + 0x0f, 0x16, 0x1e, 0x09, 0x0a, 0x0c, 0x16, 0x16, 0x17, 0x14, 0x18, 0x16, + 0x1d, 0x13, 0x11, 0x0e, 0x11, 0x15, 0x10, 0x13, 0x12, 0x10, 0x20, 0x15, + 0x11, 0x10, 0x16, 0x18, 0x10, 0x15, 0x12, 0x10, 0x24, 0x0e, 0x0e, 0x16, + 0x10, 0x0f, 0x0a, 0x15, 0x18, 0x0c, 0x22, 0x0d, 0x0a, 0x0c, 0x0d, 0x0c, + 0x0d, 0x0d, 0x11, 0x11, 0x24, 0x11, 0x16, 0x0c, 0x0b, 0x0f, 0x0d, 0x18, + 0x0e, 0x14, 0x1a, 0x18, 0x17, 0x18, 0x0a, 0x0b, 0x15, 0x0a, 0x09, 0x15, + 0x19, 0x18, 0x14, 0x0d, 0x0c, 0x0e, 0x10, 0x0b, 0x18, 0x0d, 0x22, 0x10, + 0x0c, 0x0b, 0x14, 0x0c, 0x17, 0x14, 0x0e, 0x0d, 0x23, 0x0b, 0x0d, 0x0d, + 0x16, 0x0c, 0x17, 0x0a, 0x0c, 0x11, 0x1b, 0x14, 0x17, 0x0b, 0x0d, 0x10, + 0x0a, 0x0c, 0x13, 0x07, 0x1a, 0x16, 0x17, 0x0c, 0x09, 0x13, 0x16, 0x06, + 0x08, 0x03, 0x1f, 0x18, 0x15, 0x0b, 0x12, 0x11, 0x08, 0x02, 0x00, 0x00, + 0x1c, 0x10, 0x11, 0x0a, 0x0d, 0x15, 0x05, 0x00, 0x00, 0x00, 0x1e, 0x0d, + 0x10, 0x0e, 0x0e, 0x04, 0x01, 0x00, 0x00, 0x00, +}; + +//***************************************************************************** +// +// The top side of the border. +// +//***************************************************************************** +static const uint8_t g_pui8Top[] = +{ + IMAGE_FMT_8BPP_UNCOMP, + 44, 1, + 22, 0, + + 39, + 0x10, 0x00, 0x00, + 0x11, 0x00, 0x00, + 0x12, 0x00, 0x00, + 0x13, 0x00, 0x00, + 0x14, 0x00, 0x00, + 0x15, 0x00, 0x00, + 0x16, 0x00, 0x00, + 0x17, 0x00, 0x00, + 0x20, 0x00, 0x00, + 0x21, 0x00, 0x00, + 0x22, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x24, 0x00, 0x00, + 0x25, 0x00, 0x00, + 0x26, 0x00, 0x00, + 0x27, 0x00, 0x00, + 0x28, 0x00, 0x00, + 0x29, 0x00, 0x00, + 0x2a, 0x00, 0x00, + 0x2b, 0x00, 0x00, + 0x2c, 0x00, 0x00, + 0x2d, 0x00, 0x00, + 0x2e, 0x00, 0x00, + 0x2f, 0x00, 0x00, + 0x40, 0x00, 0x00, + 0x42, 0x00, 0x00, + 0x44, 0x00, 0x00, + 0x46, 0x00, 0x00, + 0x48, 0x00, 0x00, + 0x4a, 0x00, 0x00, + 0x4c, 0x00, 0x00, + 0x4e, 0x00, 0x00, + 0x50, 0x00, 0x00, + 0x52, 0x00, 0x00, + 0x54, 0x00, 0x00, + 0x56, 0x00, 0x00, + 0x58, 0x00, 0x00, + 0x5a, 0x00, 0x00, + 0x5c, 0x00, 0x00, + 0x5e, 0x00, 0x00, + + 0x1f, 0x22, 0x1d, 0x20, 0x27, 0x26, 0x22, 0x23, 0x1a, 0x21, 0x18, 0x1b, + 0x1a, 0x24, 0x1a, 0x1e, 0x1a, 0x19, 0x27, 0x1b, 0x20, 0x25, 0x21, 0x1c, + 0x22, 0x20, 0x1f, 0x27, 0x1c, 0x24, 0x20, 0x24, 0x1e, 0x26, 0x1c, 0x1d, + 0x24, 0x26, 0x19, 0x27, 0x20, 0x19, 0x1b, 0x22, 0x26, 0x1d, 0x19, 0x18, + 0x1f, 0x19, 0x1b, 0x27, 0x26, 0x25, 0x1c, 0x20, 0x1e, 0x24, 0x20, 0x22, + 0x20, 0x18, 0x1f, 0x26, 0x26, 0x23, 0x1c, 0x23, 0x22, 0x1d, 0x23, 0x1a, + 0x1f, 0x26, 0x25, 0x1d, 0x1b, 0x26, 0x1d, 0x22, 0x27, 0x21, 0x22, 0x25, + 0x1f, 0x26, 0x1e, 0x25, 0x22, 0x26, 0x1f, 0x1b, 0x27, 0x26, 0x1a, 0x26, + 0x22, 0x1e, 0x21, 0x1c, 0x24, 0x1c, 0x1f, 0x1b, 0x1b, 0x1c, 0x20, 0x1e, + 0x1a, 0x26, 0x19, 0x1a, 0x1f, 0x24, 0x27, 0x26, 0x22, 0x1e, 0x23, 0x1d, + 0x1c, 0x1b, 0x21, 0x1b, 0x1a, 0x23, 0x1a, 0x24, 0x1a, 0x23, 0x19, 0x27, + 0x18, 0x20, 0x1a, 0x1b, 0x24, 0x23, 0x22, 0x27, 0x22, 0x24, 0x19, 0x1a, + 0x20, 0x19, 0x19, 0x1b, 0x1f, 0x25, 0x21, 0x24, 0x18, 0x1a, 0x27, 0x1b, + 0x26, 0x1a, 0x27, 0x18, 0x25, 0x19, 0x18, 0x26, 0x21, 0x1a, 0x1a, 0x1e, + 0x26, 0x25, 0x1d, 0x20, 0x21, 0x1f, 0x22, 0x19, 0x20, 0x24, 0x1c, 0x27, + 0x21, 0x26, 0x23, 0x22, 0x18, 0x23, 0x25, 0x26, 0x25, 0x25, 0x27, 0x23, + 0x26, 0x27, 0x22, 0x1f, 0x1a, 0x25, 0x26, 0x19, 0x22, 0x1b, 0x22, 0x1b, + 0x23, 0x1d, 0x1d, 0x1b, 0x19, 0x22, 0x1b, 0x22, 0x20, 0x27, 0x1c, 0x20, + 0x23, 0x19, 0x1f, 0x21, 0x27, 0x1f, 0x1d, 0x25, 0x1e, 0x18, 0x1d, 0x21, + 0x25, 0x1b, 0x22, 0x1f, 0x1f, 0x1c, 0x23, 0x1a, 0x21, 0x18, 0x1e, 0x23, + 0x22, 0x22, 0x1d, 0x1a, 0x21, 0x22, 0x23, 0x1d, 0x23, 0x1b, 0x26, 0x22, + 0x22, 0x1c, 0x20, 0x19, 0x1c, 0x26, 0x22, 0x19, 0x19, 0x1d, 0x21, 0x21, + 0x22, 0x1c, 0x24, 0x1c, 0x1d, 0x1b, 0x27, 0x18, 0x25, 0x1d, 0x1b, 0x1e, + 0x27, 0x26, 0x24, 0x23, 0x19, 0x22, 0x1e, 0x24, 0x27, 0x26, 0x25, 0x1b, + 0x24, 0x20, 0x1c, 0x26, 0x26, 0x25, 0x1f, 0x21, 0x1a, 0x1c, 0x25, 0x1f, + 0x16, 0x11, 0x15, 0x15, 0x0f, 0x0d, 0x0e, 0x12, 0x11, 0x0c, 0x0a, 0x09, + 0x09, 0x12, 0x0d, 0x0c, 0x0d, 0x09, 0x0e, 0x16, 0x11, 0x0c, 0x12, 0x14, + 0x0f, 0x0a, 0x16, 0x12, 0x10, 0x0b, 0x10, 0x0e, 0x15, 0x0e, 0x0b, 0x0d, + 0x13, 0x12, 0x17, 0x0d, 0x16, 0x0a, 0x0e, 0x08, 0x14, 0x14, 0x0c, 0x09, + 0x15, 0x13, 0x08, 0x0f, 0x17, 0x13, 0x0b, 0x0f, 0x15, 0x09, 0x09, 0x0e, + 0x0c, 0x12, 0x14, 0x0a, 0x08, 0x08, 0x0f, 0x14, 0x13, 0x0f, 0x09, 0x11, + 0x11, 0x10, 0x11, 0x0d, 0x0c, 0x16, 0x0f, 0x0a, 0x11, 0x10, 0x11, 0x11, + 0x0b, 0x15, 0x09, 0x09, 0x16, 0x0a, 0x0f, 0x0b, 0x15, 0x0c, 0x0d, 0x16, + 0x0d, 0x15, 0x12, 0x08, 0x0c, 0x14, 0x12, 0x15, 0x0c, 0x0b, 0x0b, 0x11, + 0x09, 0x12, 0x14, 0x13, 0x0b, 0x0e, 0x0d, 0x0e, 0x0b, 0x0e, 0x10, 0x0a, + 0x10, 0x08, 0x0e, 0x0e, 0x0c, 0x13, 0x0c, 0x12, 0x10, 0x16, 0x12, 0x14, + 0x13, 0x0c, 0x12, 0x08, 0x10, 0x15, 0x11, 0x12, 0x10, 0x0e, 0x0d, 0x13, + 0x14, 0x12, 0x0a, 0x08, 0x09, 0x12, 0x0b, 0x11, 0x13, 0x11, 0x08, 0x08, + 0x0c, 0x0c, 0x12, 0x15, 0x0a, 0x0d, 0x12, 0x16, 0x12, 0x0d, 0x16, 0x0a, + 0x0a, 0x10, 0x15, 0x12, 0x16, 0x0b, 0x0e, 0x13, 0x15, 0x10, 0x13, 0x16, + 0x0b, 0x16, 0x10, 0x16, 0x0f, 0x10, 0x17, 0x14, 0x15, 0x11, 0x12, 0x17, + 0x16, 0x0d, 0x15, 0x11, 0x12, 0x14, 0x14, 0x14, 0x0c, 0x11, 0x0f, 0x0a, + 0x14, 0x15, 0x15, 0x12, 0x0e, 0x11, 0x11, 0x12, 0x10, 0x0a, 0x11, 0x08, + 0x13, 0x10, 0x15, 0x10, 0x09, 0x0f, 0x10, 0x08, 0x15, 0x0e, 0x12, 0x0f, + 0x0a, 0x0e, 0x0b, 0x0e, 0x08, 0x13, 0x11, 0x15, 0x11, 0x0f, 0x0f, 0x17, + 0x08, 0x09, 0x12, 0x11, 0x0b, 0x0b, 0x12, 0x16, 0x13, 0x0f, 0x0f, 0x15, + 0x17, 0x17, 0x16, 0x14, 0x0d, 0x10, 0x0b, 0x0f, 0x17, 0x0f, 0x16, 0x17, + 0x0a, 0x0f, 0x14, 0x14, 0x16, 0x0c, 0x14, 0x17, 0x0d, 0x0e, 0x10, 0x10, + 0x11, 0x0b, 0x0f, 0x0d, 0x12, 0x16, 0x0b, 0x11, 0x15, 0x09, 0x0d, 0x0b, + 0x12, 0x11, 0x12, 0x11, 0x08, 0x10, 0x11, 0x0b, 0x08, 0x0d, 0x08, 0x16, + 0x15, 0x11, 0x13, 0x16, 0x0a, 0x0c, 0x0a, 0x0b, 0x12, 0x0a, 0x0a, 0x0b, + 0x17, 0x08, 0x0a, 0x09, 0x0f, 0x12, 0x16, 0x09, 0x11, 0x09, 0x0e, 0x0f, + 0x0e, 0x0c, 0x0b, 0x16, 0x11, 0x0b, 0x08, 0x0e, 0x15, 0x14, 0x0d, 0x17, + 0x08, 0x10, 0x0b, 0x12, 0x13, 0x0d, 0x16, 0x12, 0x0d, 0x08, 0x14, 0x14, + 0x13, 0x12, 0x16, 0x0d, 0x14, 0x0c, 0x14, 0x0b, 0x11, 0x08, 0x09, 0x0a, + 0x0b, 0x0a, 0x11, 0x08, 0x16, 0x17, 0x08, 0x16, 0x0f, 0x0c, 0x11, 0x0a, + 0x11, 0x0f, 0x15, 0x16, 0x10, 0x11, 0x13, 0x0b, 0x0c, 0x12, 0x10, 0x08, + 0x16, 0x0d, 0x0b, 0x10, 0x0e, 0x0c, 0x12, 0x12, 0x0f, 0x0c, 0x13, 0x0d, + 0x0b, 0x14, 0x0c, 0x12, 0x08, 0x15, 0x15, 0x11, 0x0d, 0x12, 0x10, 0x15, + 0x0c, 0x0c, 0x09, 0x10, 0x16, 0x11, 0x10, 0x15, 0x17, 0x13, 0x0d, 0x0d, + 0x08, 0x08, 0x08, 0x0f, 0x0c, 0x13, 0x15, 0x10, 0x0f, 0x09, 0x0b, 0x0f, + 0x16, 0x08, 0x09, 0x0b, 0x13, 0x11, 0x09, 0x17, 0x15, 0x0a, 0x0f, 0x14, + 0x14, 0x08, 0x11, 0x13, 0x13, 0x16, 0x09, 0x14, 0x17, 0x09, 0x0c, 0x0b, + 0x14, 0x09, 0x13, 0x0c, 0x0a, 0x17, 0x14, 0x09, 0x17, 0x15, 0x0d, 0x13, + 0x0f, 0x0e, 0x12, 0x0d, 0x11, 0x0a, 0x09, 0x0e, 0x0a, 0x12, 0x09, 0x16, + 0x11, 0x0b, 0x12, 0x10, 0x0c, 0x17, 0x14, 0x09, 0x08, 0x10, 0x0e, 0x0b, + 0x0f, 0x0a, 0x0c, 0x0e, 0x08, 0x12, 0x0a, 0x0f, 0x09, 0x14, 0x14, 0x12, + 0x16, 0x15, 0x09, 0x08, 0x10, 0x0a, 0x16, 0x09, 0x0e, 0x11, 0x12, 0x13, + 0x10, 0x0e, 0x15, 0x11, 0x16, 0x0b, 0x14, 0x0d, 0x0e, 0x09, 0x14, 0x0e, + 0x13, 0x16, 0x15, 0x15, 0x13, 0x12, 0x10, 0x11, 0x10, 0x11, 0x12, 0x08, + 0x14, 0x11, 0x0a, 0x0a, 0x0b, 0x14, 0x15, 0x13, 0x0a, 0x12, 0x0d, 0x09, + 0x16, 0x09, 0x0f, 0x0c, 0x0b, 0x0c, 0x12, 0x17, 0x0b, 0x10, 0x14, 0x16, + 0x0a, 0x0c, 0x10, 0x12, 0x15, 0x0b, 0x12, 0x12, 0x15, 0x15, 0x14, 0x08, + 0x11, 0x11, 0x14, 0x14, 0x0c, 0x09, 0x16, 0x0a, 0x0a, 0x0d, 0x0f, 0x0e, + 0x12, 0x09, 0x0d, 0x15, 0x11, 0x09, 0x14, 0x13, 0x0e, 0x0d, 0x0e, 0x0c, + 0x0c, 0x0a, 0x08, 0x16, 0x0c, 0x14, 0x12, 0x13, 0x0a, 0x08, 0x17, 0x14, + 0x09, 0x15, 0x0b, 0x17, 0x10, 0x12, 0x0f, 0x15, 0x16, 0x13, 0x0e, 0x0b, + 0x15, 0x0a, 0x12, 0x0d, 0x0d, 0x10, 0x0f, 0x12, 0x13, 0x0f, 0x10, 0x08, + 0x0c, 0x0b, 0x13, 0x0f, 0x0b, 0x12, 0x0b, 0x0d, 0x10, 0x0e, 0x0d, 0x08, + 0x09, 0x14, 0x16, 0x17, 0x10, 0x0c, 0x0a, 0x0d, 0x0f, 0x15, 0x12, 0x14, + 0x0e, 0x0a, 0x0e, 0x09, 0x11, 0x17, 0x09, 0x15, 0x0a, 0x14, 0x0d, 0x0e, + 0x0f, 0x10, 0x13, 0x17, 0x17, 0x09, 0x08, 0x08, 0x16, 0x16, 0x08, 0x0e, + 0x0a, 0x0b, 0x14, 0x11, 0x09, 0x0f, 0x0e, 0x0f, 0x11, 0x15, 0x11, 0x0b, + 0x14, 0x12, 0x09, 0x17, 0x0f, 0x0e, 0x0d, 0x16, 0x16, 0x09, 0x16, 0x16, + 0x0b, 0x16, 0x16, 0x09, 0x15, 0x17, 0x10, 0x08, 0x0b, 0x0c, 0x12, 0x0c, + 0x13, 0x08, 0x13, 0x0d, 0x15, 0x0c, 0x10, 0x12, 0x17, 0x11, 0x12, 0x0e, + 0x08, 0x17, 0x0d, 0x16, 0x09, 0x0c, 0x14, 0x0c, 0x0a, 0x13, 0x0e, 0x08, + 0x13, 0x16, 0x08, 0x16, 0x0a, 0x12, 0x0a, 0x16, 0x12, 0x15, 0x0c, 0x10, + 0x0a, 0x15, 0x0b, 0x09, 0x0f, 0x15, 0x10, 0x0f, 0x15, 0x16, 0x0e, 0x17, + 0x0a, 0x0b, 0x0b, 0x0d, 0x16, 0x12, 0x0d, 0x11, 0x10, 0x0e, 0x10, 0x13, + 0x08, 0x12, 0x11, 0x13, 0x10, 0x16, 0x0b, 0x12, 0x13, 0x0f, 0x14, 0x0a, + 0x0d, 0x0d, 0x12, 0x0a, 0x0b, 0x08, 0x0a, 0x0e, 0x0b, 0x0e, 0x14, 0x0a, + 0x08, 0x0a, 0x13, 0x10, 0x10, 0x0b, 0x0b, 0x10, 0x16, 0x15, 0x0b, 0x0e, + 0x13, 0x0f, 0x09, 0x0f, 0x17, 0x16, 0x12, 0x0c, 0x0b, 0x0c, 0x0f, 0x0f, + 0x0c, 0x11, 0x16, 0x10, 0x17, 0x12, 0x12, 0x17, 0x14, 0x0e, 0x10, 0x0d, + 0x12, 0x13, 0x15, 0x10, 0x11, 0x09, 0x17, 0x0d, 0x11, 0x08, 0x14, 0x10, + 0x16, 0x0e, 0x14, 0x0a, 0x13, 0x0b, 0x11, 0x08, 0x15, 0x0f, 0x10, 0x14, + 0x0a, 0x0a, 0x14, 0x16, 0x10, 0x0c, 0x0b, 0x0b, 0x08, 0x09, 0x13, 0x11, + 0x0b, 0x12, 0x17, 0x14, 0x13, 0x13, 0x0c, 0x12, 0x0a, 0x09, 0x14, 0x15, + 0x0d, 0x0e, 0x15, 0x0a, 0x15, 0x0e, 0x16, 0x17, 0x10, 0x13, 0x16, 0x09, + 0x0b, 0x0b, 0x0a, 0x09, 0x11, 0x08, 0x09, 0x0a, 0x14, 0x17, 0x0c, 0x14, + 0x0a, 0x11, 0x14, 0x0e, 0x11, 0x0f, 0x16, 0x0c, 0x08, 0x0a, 0x13, 0x0d, + 0x13, 0x15, 0x15, 0x0e, 0x13, 0x0a, 0x0e, 0x17, 0x0d, 0x10, 0x08, 0x16, + 0x11, 0x09, 0x09, 0x0d, 0x09, 0x0d, 0x09, 0x0c, 0x16, 0x16, 0x12, 0x0f, + 0x0d, 0x10, 0x14, 0x0e, 0x13, 0x10, 0x13, 0x0f, 0x0d, 0x10, 0x15, 0x09, + 0x13, 0x0b, 0x08, 0x08, 0x13, 0x08, 0x17, 0x0c, 0x0a, 0x08, 0x12, 0x0c, + 0x0d, 0x13, 0x10, 0x0b, 0x12, 0x0b, 0x13, 0x08, 0x14, 0x10, 0x0e, 0x0f, + 0x09, 0x0a, 0x16, 0x0f, 0x13, 0x14, 0x10, 0x0e, 0x17, 0x10, 0x0f, 0x13, + 0x11, 0x0e, 0x08, 0x13, 0x0f, 0x12, 0x08, 0x14, 0x0e, 0x11, 0x08, 0x08, + 0x14, 0x14, 0x08, 0x10, 0x0d, 0x0e, 0x08, 0x0e, 0x11, 0x17, 0x15, 0x0c, + 0x13, 0x0e, 0x12, 0x13, 0x16, 0x09, 0x0e, 0x10, 0x0f, 0x0f, 0x0c, 0x17, + 0x09, 0x0c, 0x13, 0x0f, 0x15, 0x14, 0x10, 0x12, 0x11, 0x10, 0x0a, 0x16, + 0x17, 0x0b, 0x0d, 0x10, 0x0a, 0x0b, 0x14, 0x15, 0x11, 0x0f, 0x11, 0x10, + 0x10, 0x17, 0x08, 0x08, 0x0e, 0x0d, 0x17, 0x10, 0x11, 0x13, 0x17, 0x0f, + 0x10, 0x10, 0x09, 0x09, 0x08, 0x0c, 0x08, 0x08, 0x0f, 0x0e, 0x10, 0x11, + 0x11, 0x0d, 0x0f, 0x0b, 0x14, 0x08, 0x14, 0x0d, 0x08, 0x15, 0x0d, 0x0f, + 0x0a, 0x0d, 0x17, 0x14, 0x08, 0x17, 0x0b, 0x11, 0x0f, 0x0d, 0x13, 0x10, + 0x11, 0x14, 0x10, 0x09, 0x0a, 0x09, 0x13, 0x13, 0x0f, 0x0b, 0x17, 0x0c, + 0x0c, 0x13, 0x11, 0x0d, 0x10, 0x17, 0x14, 0x13, 0x0c, 0x14, 0x0f, 0x0d, + 0x14, 0x12, 0x16, 0x0c, 0x08, 0x11, 0x15, 0x12, 0x0d, 0x0e, 0x13, 0x10, + 0x10, 0x0f, 0x0c, 0x17, 0x12, 0x0b, 0x0b, 0x17, 0x17, 0x15, 0x0c, 0x0f, + 0x14, 0x08, 0x0a, 0x08, 0x15, 0x12, 0x0e, 0x12, 0x0c, 0x0c, 0x16, 0x0d, + 0x16, 0x13, 0x17, 0x0c, 0x09, 0x13, 0x14, 0x11, 0x0a, 0x08, 0x11, 0x15, + 0x0b, 0x15, 0x14, 0x0a, 0x12, 0x08, 0x12, 0x0e, 0x09, 0x15, 0x0f, 0x17, + 0x0f, 0x15, 0x11, 0x14, 0x09, 0x0f, 0x09, 0x08, 0x0b, 0x08, 0x0c, 0x0d, + 0x12, 0x0b, 0x0a, 0x14, 0x12, 0x0b, 0x15, 0x16, 0x0c, 0x09, 0x0b, 0x08, + 0x09, 0x0a, 0x16, 0x0a, 0x12, 0x12, 0x0e, 0x17, 0x0a, 0x15, 0x17, 0x14, + 0x17, 0x0d, 0x0f, 0x16, 0x0a, 0x08, 0x0c, 0x15, 0x0c, 0x0e, 0x12, 0x16, + 0x12, 0x0f, 0x15, 0x16, 0x11, 0x08, 0x16, 0x13, 0x0b, 0x15, 0x15, 0x15, + 0x0f, 0x0c, 0x15, 0x12, 0x0a, 0x14, 0x0e, 0x09, 0x09, 0x15, 0x17, 0x0c, + 0x16, 0x0c, 0x0a, 0x0a, 0x12, 0x15, 0x09, 0x0d, 0x0d, 0x16, 0x0b, 0x16, + 0x17, 0x0a, 0x11, 0x0a, 0x17, 0x0f, 0x08, 0x0f, 0x13, 0x15, 0x09, 0x16, + 0x12, 0x10, 0x17, 0x13, 0x0d, 0x17, 0x08, 0x0c, 0x0b, 0x0b, 0x0e, 0x16, + 0x08, 0x10, 0x0b, 0x0d, 0x0f, 0x0f, 0x0b, 0x0e, 0x11, 0x15, 0x11, 0x11, + 0x0c, 0x11, 0x08, 0x08, 0x0f, 0x0a, 0x16, 0x09, 0x12, 0x16, 0x15, 0x17, + 0x16, 0x16, 0x0c, 0x0a, 0x09, 0x13, 0x08, 0x09, 0x0b, 0x0c, 0x0f, 0x12, + 0x13, 0x13, 0x09, 0x0d, 0x10, 0x13, 0x16, 0x15, 0x0d, 0x17, 0x16, 0x14, + 0x09, 0x15, 0x16, 0x13, 0x13, 0x13, 0x13, 0x12, 0x11, 0x17, 0x14, 0x13, + 0x12, 0x15, 0x15, 0x16, 0x09, 0x0c, 0x11, 0x15, 0x08, 0x12, 0x0a, 0x10, + 0x0e, 0x09, 0x0e, 0x13, 0x09, 0x0c, 0x10, 0x0a, 0x09, 0x0e, 0x16, 0x15, + 0x0a, 0x12, 0x0f, 0x14, 0x12, 0x0c, 0x0f, 0x0c, 0x0a, 0x0c, 0x0b, 0x0c, + 0x11, 0x14, 0x09, 0x11, 0x0f, 0x0c, 0x0a, 0x15, 0x0e, 0x10, 0x11, 0x0f, + 0x15, 0x0a, 0x12, 0x16, 0x10, 0x10, 0x14, 0x13, 0x0b, 0x0c, 0x0f, 0x15, + 0x10, 0x16, 0x09, 0x13, 0x0b, 0x0d, 0x17, 0x14, 0x09, 0x08, 0x0d, 0x10, + 0x0d, 0x0f, 0x0e, 0x13, 0x08, 0x08, 0x0b, 0x15, 0x0a, 0x15, 0x14, 0x13, + 0x0e, 0x10, 0x0e, 0x11, 0x14, 0x15, 0x0e, 0x0d, 0x13, 0x10, 0x08, 0x17, + 0x15, 0x17, 0x13, 0x17, 0x08, 0x09, 0x0f, 0x0d, 0x10, 0x16, 0x09, 0x11, + 0x16, 0x0c, 0x0e, 0x09, 0x09, 0x0a, 0x14, 0x10, 0x12, 0x0a, 0x09, 0x0f, + 0x17, 0x10, 0x14, 0x13, 0x08, 0x14, 0x12, 0x16, 0x14, 0x0e, 0x15, 0x14, + 0x0f, 0x0d, 0x09, 0x17, 0x0b, 0x0a, 0x11, 0x0a, 0x0e, 0x17, 0x0b, 0x10, + 0x14, 0x0f, 0x0e, 0x08, 0x11, 0x17, 0x0a, 0x08, 0x16, 0x0e, 0x11, 0x09, + 0x0f, 0x12, 0x16, 0x11, 0x15, 0x0a, 0x14, 0x10, 0x0b, 0x12, 0x0b, 0x08, + 0x0b, 0x15, 0x12, 0x0b, 0x0c, 0x08, 0x11, 0x09, 0x0f, 0x17, 0x09, 0x09, + 0x17, 0x0c, 0x0a, 0x16, 0x12, 0x13, 0x17, 0x0a, 0x0e, 0x15, 0x13, 0x0b, + 0x17, 0x10, 0x13, 0x0b, 0x0b, 0x17, 0x0b, 0x0f, 0x15, 0x16, 0x12, 0x09, + 0x16, 0x0b, 0x0a, 0x0e, 0x0b, 0x0b, 0x10, 0x0b, 0x10, 0x12, 0x09, 0x0a, + 0x0e, 0x08, 0x0c, 0x15, 0x16, 0x08, 0x08, 0x16, 0x11, 0x14, 0x09, 0x14, + 0x13, 0x0c, 0x0b, 0x11, 0x0b, 0x16, 0x12, 0x09, 0x09, 0x15, 0x10, 0x0d, + 0x09, 0x08, 0x10, 0x11, 0x13, 0x12, 0x14, 0x0a, 0x12, 0x09, 0x17, 0x11, + 0x0a, 0x08, 0x0f, 0x13, 0x15, 0x10, 0x10, 0x11, 0x15, 0x13, 0x0a, 0x08, + 0x12, 0x14, 0x0a, 0x14, 0x12, 0x12, 0x09, 0x13, 0x13, 0x12, 0x0d, 0x0f, + 0x0c, 0x09, 0x11, 0x17, 0x0b, 0x11, 0x10, 0x0d, 0x11, 0x08, 0x08, 0x0e, + 0x10, 0x10, 0x17, 0x0d, 0x0c, 0x09, 0x0d, 0x16, 0x16, 0x0f, 0x12, 0x11, + 0x0a, 0x14, 0x0d, 0x16, 0x0f, 0x12, 0x0d, 0x13, 0x14, 0x16, 0x13, 0x17, + 0x0f, 0x0c, 0x0c, 0x09, 0x0c, 0x0d, 0x10, 0x14, 0x16, 0x10, 0x0a, 0x0b, + 0x12, 0x10, 0x0a, 0x10, 0x08, 0x14, 0x0a, 0x0a, 0x11, 0x0f, 0x08, 0x08, + 0x09, 0x0e, 0x14, 0x15, 0x0c, 0x0f, 0x15, 0x14, 0x14, 0x0a, 0x16, 0x09, + 0x0f, 0x0e, 0x16, 0x0e, 0x17, 0x08, 0x11, 0x11, 0x10, 0x13, 0x0a, 0x10, + 0x10, 0x0c, 0x13, 0x09, 0x13, 0x14, 0x0a, 0x15, 0x0a, 0x16, 0x13, 0x0f, + 0x0e, 0x10, 0x0c, 0x0b, 0x12, 0x0b, 0x0c, 0x0a, 0x12, 0x0a, 0x10, 0x11, + 0x0a, 0x0a, 0x0a, 0x13, 0x16, 0x0c, 0x0c, 0x0e, 0x11, 0x08, 0x10, 0x0c, + 0x15, 0x12, 0x09, 0x08, 0x11, 0x14, 0x0f, 0x17, 0x0d, 0x14, 0x0a, 0x17, + 0x17, 0x0e, 0x0a, 0x12, 0x11, 0x13, 0x0b, 0x13, 0x15, 0x0d, 0x0f, 0x13, + 0x12, 0x13, 0x0a, 0x0b, 0x14, 0x12, 0x10, 0x11, 0x0d, 0x11, 0x11, 0x16, + 0x0e, 0x09, 0x15, 0x13, 0x15, 0x08, 0x13, 0x15, 0x0f, 0x15, 0x0f, 0x08, + 0x16, 0x09, 0x0b, 0x14, 0x09, 0x16, 0x11, 0x11, 0x14, 0x09, 0x11, 0x0d, + 0x14, 0x0d, 0x14, 0x15, 0x11, 0x17, 0x11, 0x10, 0x0c, 0x10, 0x0b, 0x0c, + 0x08, 0x0f, 0x11, 0x0a, 0x0c, 0x14, 0x12, 0x0b, 0x15, 0x15, 0x17, 0x17, + 0x14, 0x11, 0x10, 0x11, 0x12, 0x0a, 0x16, 0x0e, 0x0f, 0x13, 0x0c, 0x08, + 0x12, 0x15, 0x10, 0x16, 0x0e, 0x14, 0x0a, 0x0e, 0x0b, 0x13, 0x11, 0x10, + 0x0f, 0x0b, 0x14, 0x0d, 0x08, 0x13, 0x0d, 0x15, 0x0c, 0x15, 0x0e, 0x17, + 0x17, 0x0d, 0x0d, 0x0f, 0x08, 0x12, 0x10, 0x12, 0x10, 0x09, 0x10, 0x16, + 0x15, 0x12, 0x0d, 0x09, 0x0e, 0x16, 0x12, 0x16, 0x09, 0x0e, 0x0b, 0x0a, + 0x0a, 0x10, 0x08, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x14, 0x14, 0x16, 0x14, + 0x0e, 0x0e, 0x0e, 0x16, 0x10, 0x17, 0x14, 0x0d, 0x12, 0x0a, 0x0f, 0x08, + 0x08, 0x09, 0x17, 0x0a, 0x10, 0x0a, 0x0c, 0x13, 0x13, 0x0c, 0x0a, 0x0a, + 0x13, 0x10, 0x11, 0x0f, 0x0c, 0x0f, 0x0b, 0x12, 0x16, 0x12, 0x11, 0x0e, + 0x12, 0x0e, 0x13, 0x0c, 0x10, 0x0b, 0x0d, 0x10, 0x0d, 0x0c, 0x12, 0x15, + 0x0f, 0x17, 0x10, 0x0b, 0x0b, 0x12, 0x0d, 0x16, 0x0a, 0x17, 0x0e, 0x0e, + 0x0e, 0x12, 0x09, 0x0d, 0x0c, 0x12, 0x13, 0x17, 0x08, 0x0f, 0x0b, 0x10, + 0x12, 0x11, 0x09, 0x17, 0x16, 0x14, 0x15, 0x0e, 0x13, 0x0d, 0x11, 0x17, + 0x08, 0x17, 0x16, 0x0b, 0x16, 0x0c, 0x12, 0x0d, 0x16, 0x13, 0x12, 0x0b, + 0x0e, 0x0d, 0x0a, 0x0e, 0x15, 0x0e, 0x17, 0x0f, 0x08, 0x09, 0x0f, 0x16, + 0x15, 0x0c, 0x0c, 0x11, 0x12, 0x16, 0x10, 0x13, 0x15, 0x0f, 0x16, 0x13, + 0x14, 0x10, 0x09, 0x12, 0x0c, 0x13, 0x16, 0x12, 0x08, 0x09, 0x08, 0x15, + 0x0f, 0x08, 0x0d, 0x10, 0x09, 0x14, 0x0f, 0x17, 0x09, 0x13, 0x10, 0x13, + 0x12, 0x09, 0x0e, 0x0f, 0x10, 0x0d, 0x0b, 0x0c, 0x15, 0x0c, 0x17, 0x09, + 0x17, 0x16, 0x14, 0x08, 0x17, 0x14, 0x16, 0x0f, 0x15, 0x0c, 0x17, 0x17, + 0x09, 0x0e, 0x16, 0x0a, 0x0a, 0x0e, 0x16, 0x14, 0x10, 0x0d, 0x0c, 0x09, + 0x12, 0x10, 0x0e, 0x10, 0x14, 0x0e, 0x12, 0x14, 0x0c, 0x0e, 0x15, 0x0c, + 0x16, 0x0c, 0x13, 0x12, 0x12, 0x0e, 0x0f, 0x17, 0x14, 0x0d, 0x0b, 0x17, + 0x09, 0x17, 0x08, 0x0a, 0x12, 0x08, 0x0c, 0x14, 0x15, 0x10, 0x09, 0x0a, + 0x14, 0x0a, 0x17, 0x0c, 0x10, 0x16, 0x10, 0x0f, 0x0a, 0x0c, 0x0a, 0x15, + 0x12, 0x11, 0x14, 0x0f, 0x17, 0x17, 0x0f, 0x08, 0x17, 0x0f, 0x0b, 0x11, + 0x0f, 0x0f, 0x0e, 0x0d, 0x08, 0x0f, 0x10, 0x14, 0x12, 0x10, 0x09, 0x0b, + 0x0e, 0x11, 0x12, 0x11, 0x16, 0x14, 0x0e, 0x11, 0x0e, 0x0a, 0x08, 0x0d, + 0x0a, 0x0f, 0x0e, 0x09, 0x17, 0x11, 0x13, 0x0f, 0x09, 0x09, 0x15, 0x09, + 0x11, 0x0d, 0x16, 0x0c, 0x15, 0x17, 0x0f, 0x0c, 0x11, 0x0a, 0x15, 0x10, + 0x17, 0x0b, 0x09, 0x0e, 0x0e, 0x09, 0x13, 0x11, 0x11, 0x0a, 0x13, 0x10, + 0x14, 0x0e, 0x08, 0x15, 0x10, 0x15, 0x17, 0x09, 0x0a, 0x15, 0x0e, 0x08, + 0x15, 0x15, 0x0c, 0x0f, 0x08, 0x0a, 0x17, 0x17, 0x0d, 0x09, 0x0d, 0x14, + 0x0b, 0x09, 0x0d, 0x14, 0x0c, 0x08, 0x0d, 0x08, 0x0f, 0x0d, 0x16, 0x17, + 0x0a, 0x15, 0x09, 0x0d, 0x13, 0x0f, 0x0e, 0x11, 0x0d, 0x12, 0x09, 0x0d, + 0x14, 0x09, 0x0d, 0x0a, 0x0a, 0x13, 0x17, 0x0d, 0x15, 0x0c, 0x0a, 0x09, + 0x0d, 0x10, 0x0a, 0x14, 0x15, 0x08, 0x13, 0x08, 0x16, 0x15, 0x0e, 0x12, + 0x0c, 0x14, 0x0b, 0x11, 0x0f, 0x0c, 0x17, 0x0c, 0x0d, 0x0c, 0x0f, 0x10, + 0x08, 0x0e, 0x15, 0x15, 0x12, 0x08, 0x16, 0x17, 0x10, 0x09, 0x14, 0x0e, + 0x0a, 0x0f, 0x0f, 0x08, 0x0c, 0x15, 0x13, 0x11, 0x12, 0x16, 0x0a, 0x0a, + 0x0b, 0x0a, 0x0e, 0x11, 0x0f, 0x16, 0x09, 0x0f, 0x0c, 0x17, 0x0c, 0x17, + 0x17, 0x0b, 0x17, 0x10, 0x0c, 0x13, 0x16, 0x0e, 0x0a, 0x0e, 0x0f, 0x0f, + 0x0c, 0x0a, 0x08, 0x16, 0x09, 0x0b, 0x09, 0x0d, 0x0e, 0x0f, 0x16, 0x15, + 0x0e, 0x08, 0x0c, 0x12, 0x08, 0x11, 0x11, 0x08, 0x15, 0x10, 0x10, 0x09, + 0x0b, 0x0f, 0x10, 0x0e, 0x15, 0x08, 0x16, 0x09, 0x0a, 0x16, 0x08, 0x0c, + 0x0a, 0x09, 0x11, 0x10, 0x11, 0x10, 0x0d, 0x17, 0x10, 0x12, 0x11, 0x11, + 0x0c, 0x0b, 0x11, 0x09, 0x14, 0x09, 0x0b, 0x08, 0x10, 0x14, 0x0e, 0x0e, + 0x17, 0x08, 0x0c, 0x13, 0x0a, 0x0f, 0x14, 0x13, 0x0c, 0x0b, 0x09, 0x08, + 0x10, 0x11, 0x17, 0x13, 0x09, 0x0a, 0x09, 0x12, 0x17, 0x17, 0x15, 0x0d, + 0x0b, 0x17, 0x0b, 0x09, 0x13, 0x13, 0x0c, 0x13, 0x13, 0x11, 0x0f, 0x16, + 0x08, 0x0b, 0x11, 0x0d, 0x0e, 0x12, 0x0d, 0x16, 0x0b, 0x0d, 0x12, 0x0c, + 0x0f, 0x13, 0x17, 0x0f, 0x13, 0x14, 0x14, 0x17, 0x13, 0x08, 0x09, 0x0f, + 0x13, 0x0e, 0x0a, 0x0f, 0x17, 0x11, 0x0d, 0x08, 0x14, 0x16, 0x0d, 0x0b, + 0x10, 0x12, 0x09, 0x14, 0x17, 0x13, 0x09, 0x0f, 0x0f, 0x08, 0x17, 0x0b, + 0x14, 0x14, 0x0a, 0x10, 0x15, 0x0c, 0x17, 0x10, 0x12, 0x0a, 0x17, 0x11, + 0x13, 0x0d, 0x11, 0x10, 0x0b, 0x16, 0x13, 0x14, 0x11, 0x15, 0x10, 0x11, + 0x10, 0x11, 0x08, 0x08, 0x11, 0x08, 0x0b, 0x0e, 0x15, 0x0e, 0x16, 0x12, + 0x12, 0x16, 0x0a, 0x0c, 0x08, 0x0a, 0x15, 0x14, 0x0f, 0x0f, 0x0d, 0x13, + 0x0d, 0x08, 0x0f, 0x16, 0x15, 0x08, 0x0f, 0x0e, 0x12, 0x10, 0x0e, 0x0c, + 0x11, 0x12, 0x12, 0x0e, 0x08, 0x11, 0x08, 0x12, 0x0f, 0x0b, 0x17, 0x10, + 0x0e, 0x15, 0x0d, 0x16, 0x0c, 0x12, 0x11, 0x11, 0x13, 0x09, 0x10, 0x11, + 0x09, 0x08, 0x17, 0x13, 0x10, 0x0e, 0x17, 0x0a, 0x08, 0x12, 0x10, 0x09, + 0x0c, 0x11, 0x14, 0x14, 0x15, 0x13, 0x0c, 0x0b, 0x11, 0x12, 0x0a, 0x15, + 0x0c, 0x14, 0x0f, 0x08, 0x15, 0x08, 0x11, 0x16, 0x08, 0x11, 0x12, 0x11, + 0x08, 0x12, 0x13, 0x08, 0x0d, 0x0b, 0x0a, 0x11, 0x15, 0x16, 0x0d, 0x12, + 0x12, 0x12, 0x16, 0x0b, 0x0c, 0x08, 0x09, 0x11, 0x14, 0x11, 0x11, 0x12, + 0x11, 0x0b, 0x11, 0x11, 0x14, 0x0b, 0x0b, 0x14, 0x16, 0x16, 0x15, 0x0b, + 0x0a, 0x08, 0x15, 0x17, 0x16, 0x0a, 0x12, 0x11, 0x14, 0x10, 0x15, 0x09, + 0x11, 0x16, 0x12, 0x0e, 0x10, 0x0c, 0x08, 0x09, 0x10, 0x11, 0x13, 0x0c, + 0x15, 0x16, 0x09, 0x13, 0x14, 0x17, 0x17, 0x17, 0x17, 0x14, 0x16, 0x16, + 0x17, 0x10, 0x0f, 0x14, 0x09, 0x0d, 0x15, 0x12, 0x0b, 0x10, 0x08, 0x14, + 0x14, 0x09, 0x15, 0x0d, 0x12, 0x11, 0x12, 0x0f, 0x0f, 0x13, 0x0b, 0x0c, + 0x11, 0x0c, 0x0a, 0x0b, 0x15, 0x14, 0x13, 0x0d, 0x10, 0x16, 0x12, 0x0b, + 0x08, 0x16, 0x16, 0x17, 0x08, 0x10, 0x16, 0x14, 0x11, 0x10, 0x11, 0x08, + 0x08, 0x08, 0x12, 0x08, 0x11, 0x09, 0x15, 0x0a, 0x0d, 0x17, 0x0e, 0x0a, + 0x14, 0x0a, 0x10, 0x0c, 0x08, 0x0a, 0x10, 0x09, 0x08, 0x0e, 0x09, 0x09, + 0x17, 0x17, 0x15, 0x10, 0x10, 0x0f, 0x11, 0x10, 0x10, 0x0b, 0x11, 0x09, + 0x0c, 0x0f, 0x0c, 0x11, 0x0f, 0x12, 0x14, 0x0b, 0x14, 0x0c, 0x0f, 0x15, + 0x0e, 0x17, 0x17, 0x0f, 0x0e, 0x08, 0x10, 0x0d, 0x08, 0x0e, 0x16, 0x10, + 0x15, 0x0f, 0x09, 0x0d, 0x13, 0x12, 0x0f, 0x08, 0x0a, 0x13, 0x11, 0x11, + 0x0e, 0x0e, 0x14, 0x0a, 0x13, 0x0c, 0x08, 0x09, 0x0c, 0x17, 0x10, 0x12, + 0x08, 0x09, 0x08, 0x08, 0x0f, 0x17, 0x11, 0x0d, 0x0e, 0x13, 0x13, 0x0a, + 0x0e, 0x0a, 0x0a, 0x10, 0x15, 0x14, 0x09, 0x0b, 0x0a, 0x15, 0x0e, 0x15, + 0x0a, 0x0f, 0x17, 0x0e, 0x0e, 0x10, 0x09, 0x0f, 0x12, 0x09, 0x0f, 0x09, + 0x08, 0x09, 0x0f, 0x0f, 0x14, 0x0a, 0x11, 0x0a, 0x0d, 0x14, 0x12, 0x0a, + 0x10, 0x13, 0x0e, 0x12, 0x11, 0x15, 0x10, 0x13, 0x0c, 0x10, 0x0a, 0x13, + 0x08, 0x0b, 0x0a, 0x13, 0x0c, 0x12, 0x14, 0x0d, 0x13, 0x0c, 0x15, 0x0f, + 0x0f, 0x0f, 0x11, 0x14, 0x0b, 0x0c, 0x16, 0x13, 0x17, 0x0d, 0x0e, 0x11, + 0x0a, 0x17, 0x0d, 0x0f, 0x0f, 0x0f, 0x0a, 0x10, 0x12, 0x0d, 0x0b, 0x17, + 0x17, 0x08, 0x0d, 0x13, 0x0c, 0x0a, 0x0a, 0x14, 0x11, 0x14, 0x10, 0x14, + 0x09, 0x0f, 0x0f, 0x08, 0x14, 0x16, 0x12, 0x17, 0x15, 0x17, 0x0e, 0x0d, + 0x0f, 0x11, 0x15, 0x09, 0x17, 0x09, 0x09, 0x17, 0x09, 0x0e, 0x12, 0x0e, + 0x10, 0x15, 0x0a, 0x0a, 0x12, 0x12, 0x16, 0x13, 0x09, 0x0e, 0x14, 0x16, + 0x0c, 0x0e, 0x15, 0x0a, 0x0e, 0x0c, 0x0f, 0x15, 0x16, 0x0d, 0x17, 0x15, + 0x0e, 0x08, 0x14, 0x10, 0x0f, 0x0f, 0x16, 0x17, 0x0c, 0x09, 0x0a, 0x16, + 0x14, 0x08, 0x11, 0x16, 0x0f, 0x0d, 0x14, 0x14, 0x14, 0x12, 0x16, 0x0a, + 0x17, 0x0e, 0x17, 0x16, 0x14, 0x16, 0x13, 0x0a, 0x17, 0x10, 0x13, 0x0e, + 0x0a, 0x17, 0x13, 0x16, 0x16, 0x0f, 0x09, 0x15, 0x08, 0x14, 0x0c, 0x08, + 0x0e, 0x12, 0x0c, 0x09, 0x0b, 0x0e, 0x11, 0x14, 0x0a, 0x08, 0x15, 0x0b, + 0x0b, 0x12, 0x09, 0x09, 0x0e, 0x09, 0x17, 0x10, 0x08, 0x13, 0x0f, 0x17, + 0x0a, 0x10, 0x14, 0x0b, 0x0d, 0x09, 0x0b, 0x13, 0x13, 0x10, 0x15, 0x17, + 0x17, 0x0f, 0x13, 0x09, 0x0f, 0x11, 0x0d, 0x13, 0x0b, 0x0e, 0x14, 0x11, + 0x0f, 0x14, 0x0a, 0x10, 0x0f, 0x12, 0x0f, 0x12, 0x0a, 0x0c, 0x15, 0x10, + 0x0d, 0x09, 0x0b, 0x09, 0x12, 0x09, 0x08, 0x11, 0x11, 0x14, 0x13, 0x08, + 0x0d, 0x08, 0x14, 0x10, 0x0f, 0x11, 0x0a, 0x17, 0x0d, 0x0c, 0x10, 0x14, + 0x16, 0x17, 0x0f, 0x09, 0x0c, 0x0d, 0x11, 0x11, 0x0f, 0x15, 0x12, 0x09, + 0x17, 0x13, 0x12, 0x10, 0x0f, 0x0e, 0x11, 0x14, 0x0e, 0x0d, 0x0c, 0x16, + 0x16, 0x0f, 0x16, 0x0c, 0x13, 0x0e, 0x09, 0x12, 0x0e, 0x10, 0x14, 0x12, + 0x15, 0x0e, 0x0c, 0x0c, 0x0c, 0x17, 0x0d, 0x0b, 0x12, 0x08, 0x13, 0x09, + 0x0e, 0x0c, 0x16, 0x15, 0x12, 0x0b, 0x14, 0x10, 0x12, 0x12, 0x15, 0x0e, + 0x08, 0x16, 0x09, 0x0f, 0x0e, 0x15, 0x09, 0x0c, 0x0c, 0x0e, 0x10, 0x10, + 0x0d, 0x16, 0x13, 0x08, 0x17, 0x0f, 0x0a, 0x0e, 0x14, 0x08, 0x0b, 0x0e, + 0x0b, 0x17, 0x17, 0x16, 0x12, 0x14, 0x0c, 0x13, 0x13, 0x0e, 0x0a, 0x09, + 0x0c, 0x0c, 0x0e, 0x10, 0x12, 0x17, 0x08, 0x08, 0x15, 0x14, 0x08, 0x15, + 0x0c, 0x0a, 0x0b, 0x08, 0x0b, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0d, 0x09, + 0x0b, 0x12, 0x14, 0x17, 0x08, 0x17, 0x09, 0x0c, 0x0b, 0x0f, 0x15, 0x16, + 0x0e, 0x15, 0x17, 0x0c, 0x12, 0x17, 0x09, 0x17, 0x0a, 0x0c, 0x17, 0x0d, + 0x13, 0x0f, 0x14, 0x0a, 0x16, 0x09, 0x0c, 0x0a, 0x14, 0x08, 0x09, 0x14, + 0x08, 0x0a, 0x09, 0x0c, 0x12, 0x16, 0x0a, 0x08, 0x14, 0x09, 0x0c, 0x0f, + 0x09, 0x0d, 0x0e, 0x0b, 0x12, 0x0e, 0x11, 0x0d, 0x15, 0x0d, 0x10, 0x14, + 0x0f, 0x14, 0x16, 0x0b, 0x15, 0x08, 0x08, 0x15, 0x0b, 0x09, 0x09, 0x15, + 0x17, 0x0c, 0x15, 0x14, 0x0e, 0x0a, 0x0b, 0x0f, 0x10, 0x11, 0x13, 0x0a, + 0x16, 0x0f, 0x0b, 0x0d, 0x12, 0x0e, 0x14, 0x0a, 0x17, 0x10, 0x0d, 0x17, + 0x14, 0x15, 0x14, 0x0f, 0x16, 0x0d, 0x11, 0x14, 0x16, 0x16, 0x0e, 0x0f, + 0x0c, 0x17, 0x0b, 0x13, 0x11, 0x15, 0x0a, 0x10, 0x0d, 0x0e, 0x15, 0x17, + 0x14, 0x12, 0x0a, 0x14, 0x0a, 0x0f, 0x13, 0x17, 0x0d, 0x0f, 0x0e, 0x0b, + 0x15, 0x17, 0x17, 0x13, 0x16, 0x0e, 0x0a, 0x0a, 0x0e, 0x0e, 0x16, 0x17, + 0x0b, 0x09, 0x10, 0x11, 0x0f, 0x0d, 0x10, 0x0b, 0x08, 0x13, 0x08, 0x0a, + 0x0b, 0x13, 0x0a, 0x10, 0x0b, 0x10, 0x14, 0x09, 0x10, 0x14, 0x15, 0x0f, + 0x0b, 0x08, 0x11, 0x11, 0x0e, 0x10, 0x11, 0x12, 0x11, 0x09, 0x0b, 0x08, + 0x0f, 0x14, 0x0c, 0x0f, 0x0f, 0x0c, 0x11, 0x12, 0x08, 0x14, 0x0b, 0x0c, + 0x0c, 0x17, 0x0e, 0x15, 0x14, 0x0b, 0x0c, 0x17, 0x0b, 0x16, 0x10, 0x12, + 0x0e, 0x0a, 0x0c, 0x17, 0x0b, 0x0f, 0x08, 0x12, 0x0c, 0x0c, 0x0a, 0x14, + 0x11, 0x14, 0x0e, 0x12, 0x10, 0x12, 0x17, 0x15, 0x12, 0x0d, 0x12, 0x0e, + 0x11, 0x17, 0x0e, 0x14, 0x15, 0x16, 0x0f, 0x0b, 0x09, 0x13, 0x0b, 0x0c, + 0x0b, 0x0b, 0x17, 0x10, 0x10, 0x09, 0x0c, 0x09, 0x16, 0x12, 0x13, 0x0e, + 0x0d, 0x12, 0x0b, 0x17, 0x08, 0x16, 0x0e, 0x11, 0x15, 0x14, 0x0e, 0x13, + 0x13, 0x15, 0x17, 0x14, 0x11, 0x0a, 0x09, 0x15, 0x0e, 0x09, 0x0d, 0x16, + 0x0b, 0x11, 0x17, 0x09, 0x0c, 0x13, 0x0f, 0x11, 0x0e, 0x12, 0x11, 0x0e, + 0x11, 0x08, 0x08, 0x0e, 0x14, 0x0e, 0x0a, 0x10, 0x0c, 0x09, 0x0c, 0x15, + 0x0c, 0x0e, 0x12, 0x12, 0x0f, 0x17, 0x10, 0x12, 0x11, 0x10, 0x13, 0x15, + 0x0c, 0x0b, 0x0f, 0x13, 0x16, 0x08, 0x0a, 0x0f, 0x08, 0x0a, 0x16, 0x15, + 0x10, 0x08, 0x0d, 0x14, 0x09, 0x12, 0x12, 0x0d, 0x09, 0x0d, 0x08, 0x10, + 0x0d, 0x11, 0x0b, 0x16, 0x0a, 0x17, 0x13, 0x0e, 0x0a, 0x0b, 0x0a, 0x08, + 0x0c, 0x0c, 0x0f, 0x0c, 0x0e, 0x0d, 0x0a, 0x17, 0x0d, 0x10, 0x14, 0x0f, + 0x0b, 0x0e, 0x15, 0x0c, 0x14, 0x15, 0x15, 0x09, 0x0f, 0x08, 0x17, 0x11, + 0x08, 0x13, 0x08, 0x0a, 0x16, 0x0a, 0x0a, 0x0a, 0x0e, 0x12, 0x0f, 0x15, + 0x0f, 0x11, 0x12, 0x0e, 0x13, 0x15, 0x10, 0x0a, 0x0f, 0x08, 0x17, 0x10, + 0x12, 0x14, 0x16, 0x14, 0x0d, 0x13, 0x0a, 0x0d, 0x0e, 0x13, 0x0a, 0x17, + 0x0a, 0x17, 0x17, 0x12, 0x14, 0x10, 0x0a, 0x0c, 0x0a, 0x14, 0x12, 0x16, + 0x12, 0x0b, 0x08, 0x0a, 0x0b, 0x08, 0x12, 0x16, 0x14, 0x10, 0x12, 0x0a, + 0x0c, 0x14, 0x10, 0x13, 0x10, 0x12, 0x12, 0x13, 0x11, 0x12, 0x0e, 0x0d, + 0x0b, 0x10, 0x11, 0x0d, 0x0d, 0x0c, 0x0b, 0x08, 0x0f, 0x0b, 0x0a, 0x13, + 0x0b, 0x14, 0x11, 0x08, 0x0d, 0x0c, 0x0a, 0x11, 0x09, 0x13, 0x0d, 0x12, + 0x0d, 0x08, 0x0d, 0x16, 0x12, 0x14, 0x0c, 0x15, 0x0d, 0x16, 0x0a, 0x13, + 0x0a, 0x0e, 0x13, 0x12, 0x11, 0x15, 0x0d, 0x15, 0x12, 0x17, 0x16, 0x17, + 0x0c, 0x09, 0x11, 0x0d, 0x14, 0x16, 0x08, 0x09, 0x17, 0x0e, 0x08, 0x11, + 0x0a, 0x0d, 0x0f, 0x0f, 0x0b, 0x11, 0x0a, 0x0d, 0x08, 0x16, 0x17, 0x11, + 0x13, 0x0d, 0x0f, 0x0e, 0x0d, 0x0e, 0x0d, 0x11, 0x0f, 0x17, 0x16, 0x0b, + 0x16, 0x16, 0x0d, 0x15, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, 0x15, 0x16, 0x15, + 0x0f, 0x09, 0x0b, 0x0f, 0x17, 0x0b, 0x09, 0x13, 0x11, 0x11, 0x09, 0x16, + 0x17, 0x0f, 0x0f, 0x0e, 0x0f, 0x0e, 0x12, 0x0d, 0x0d, 0x17, 0x0a, 0x11, + 0x0d, 0x11, 0x09, 0x17, 0x0e, 0x08, 0x15, 0x16, 0x09, 0x09, 0x0e, 0x09, + 0x0d, 0x0f, 0x15, 0x16, 0x09, 0x17, 0x14, 0x08, 0x0f, 0x0b, 0x0f, 0x16, + 0x12, 0x0a, 0x0b, 0x17, 0x09, 0x0d, 0x11, 0x0f, 0x17, 0x12, 0x0e, 0x0e, + 0x12, 0x0c, 0x0c, 0x14, 0x0e, 0x13, 0x16, 0x13, 0x0b, 0x13, 0x11, 0x0c, + 0x13, 0x0e, 0x0d, 0x0a, 0x11, 0x15, 0x08, 0x0b, 0x17, 0x0c, 0x0b, 0x09, + 0x12, 0x14, 0x10, 0x11, 0x0e, 0x17, 0x17, 0x08, 0x0b, 0x0c, 0x15, 0x11, + 0x17, 0x13, 0x0c, 0x0a, 0x0f, 0x16, 0x0e, 0x0a, 0x0c, 0x14, 0x0d, 0x16, + 0x11, 0x0d, 0x0a, 0x10, 0x12, 0x0d, 0x12, 0x0c, 0x09, 0x0a, 0x16, 0x0f, + 0x09, 0x16, 0x10, 0x0d, 0x0a, 0x0e, 0x17, 0x0a, 0x09, 0x0c, 0x0c, 0x10, + 0x0a, 0x13, 0x13, 0x0e, 0x0f, 0x08, 0x0d, 0x09, 0x0e, 0x0f, 0x12, 0x08, + 0x0f, 0x12, 0x12, 0x17, 0x12, 0x17, 0x08, 0x09, 0x0f, 0x12, 0x0a, 0x0b, + 0x17, 0x0f, 0x09, 0x0e, 0x14, 0x0f, 0x17, 0x16, 0x0e, 0x15, 0x0b, 0x13, + 0x13, 0x13, 0x0a, 0x14, 0x0f, 0x09, 0x08, 0x16, 0x14, 0x13, 0x16, 0x0f, + 0x12, 0x16, 0x10, 0x09, 0x11, 0x12, 0x0d, 0x11, 0x0a, 0x0f, 0x08, 0x16, + 0x17, 0x17, 0x15, 0x0d, 0x15, 0x08, 0x09, 0x10, 0x13, 0x0b, 0x0d, 0x0b, + 0x0d, 0x0d, 0x09, 0x0a, 0x08, 0x17, 0x11, 0x13, 0x16, 0x0a, 0x15, 0x10, + 0x14, 0x0b, 0x09, 0x17, 0x12, 0x09, 0x16, 0x12, 0x09, 0x13, 0x17, 0x16, + 0x13, 0x09, 0x0f, 0x0f, 0x0d, 0x14, 0x12, 0x13, 0x0a, 0x14, 0x15, 0x0a, + 0x14, 0x0e, 0x16, 0x13, 0x11, 0x14, 0x0b, 0x0e, 0x17, 0x0d, 0x0d, 0x12, + 0x0f, 0x0b, 0x0c, 0x10, 0x16, 0x0c, 0x0f, 0x12, 0x0e, 0x17, 0x0a, 0x13, + 0x13, 0x15, 0x0e, 0x15, 0x11, 0x0c, 0x08, 0x0e, 0x13, 0x17, 0x09, 0x0c, + 0x13, 0x0d, 0x12, 0x13, 0x12, 0x17, 0x0d, 0x0a, 0x0b, 0x12, 0x13, 0x0a, + 0x16, 0x0a, 0x14, 0x0c, 0x09, 0x17, 0x08, 0x15, 0x14, 0x0f, 0x12, 0x0e, + 0x13, 0x13, 0x14, 0x0f, 0x12, 0x15, 0x13, 0x0e, 0x0a, 0x0d, 0x09, 0x15, + 0x0d, 0x0f, 0x17, 0x11, 0x09, 0x13, 0x13, 0x08, 0x15, 0x10, 0x0d, 0x17, + 0x0f, 0x0e, 0x15, 0x0b, 0x15, 0x10, 0x11, 0x11, 0x0b, 0x0e, 0x08, 0x16, + 0x0c, 0x14, 0x0c, 0x0e, 0x0a, 0x0d, 0x0c, 0x0f, 0x14, 0x0c, 0x09, 0x16, + 0x17, 0x15, 0x16, 0x15, 0x0d, 0x0c, 0x15, 0x14, 0x12, 0x12, 0x08, 0x0f, + 0x0a, 0x12, 0x09, 0x0e, 0x08, 0x09, 0x0c, 0x0c, 0x15, 0x11, 0x13, 0x17, + 0x16, 0x08, 0x0f, 0x13, 0x0c, 0x11, 0x11, 0x0c, 0x0e, 0x10, 0x0a, 0x13, + 0x14, 0x17, 0x10, 0x0e, 0x12, 0x10, 0x16, 0x15, 0x0b, 0x17, 0x0b, 0x0b, + 0x08, 0x10, 0x0f, 0x16, 0x09, 0x0b, 0x16, 0x08, 0x0b, 0x0e, 0x14, 0x10, + 0x17, 0x0e, 0x14, 0x0d, 0x16, 0x16, 0x09, 0x13, 0x16, 0x11, 0x0a, 0x10, + 0x0a, 0x08, 0x0d, 0x0d, 0x17, 0x11, 0x10, 0x08, 0x0a, 0x08, 0x17, 0x0c, + 0x0c, 0x15, 0x0d, 0x0f, 0x0b, 0x09, 0x17, 0x0a, 0x0f, 0x14, 0x10, 0x0e, + 0x09, 0x15, 0x08, 0x0d, 0x17, 0x08, 0x0f, 0x0f, 0x14, 0x08, 0x15, 0x0f, + 0x11, 0x08, 0x08, 0x14, 0x0c, 0x0a, 0x0a, 0x11, 0x11, 0x15, 0x15, 0x12, + 0x09, 0x0a, 0x16, 0x0e, 0x0e, 0x0e, 0x17, 0x0f, 0x0b, 0x17, 0x14, 0x0a, + 0x08, 0x0c, 0x11, 0x14, 0x0c, 0x0f, 0x0c, 0x16, 0x0f, 0x0d, 0x13, 0x14, + 0x0f, 0x15, 0x0d, 0x09, 0x13, 0x0a, 0x14, 0x14, 0x0d, 0x12, 0x0a, 0x13, + 0x08, 0x09, 0x0b, 0x0c, 0x09, 0x08, 0x0f, 0x09, 0x0c, 0x09, 0x16, 0x11, + 0x10, 0x0a, 0x10, 0x08, 0x10, 0x0b, 0x15, 0x17, 0x09, 0x0a, 0x09, 0x15, + 0x0d, 0x15, 0x11, 0x12, 0x0f, 0x14, 0x0d, 0x10, 0x16, 0x11, 0x14, 0x08, + 0x11, 0x0b, 0x09, 0x16, 0x0c, 0x08, 0x10, 0x15, 0x0b, 0x08, 0x16, 0x13, + 0x0c, 0x13, 0x13, 0x0e, 0x15, 0x14, 0x0b, 0x0b, 0x11, 0x15, 0x15, 0x08, + 0x11, 0x0b, 0x11, 0x10, 0x14, 0x0d, 0x10, 0x0e, 0x11, 0x12, 0x0c, 0x16, + 0x12, 0x14, 0x13, 0x15, 0x15, 0x12, 0x10, 0x0a, 0x0d, 0x0b, 0x11, 0x0b, + 0x08, 0x14, 0x0e, 0x11, 0x12, 0x0c, 0x12, 0x0c, 0x10, 0x0b, 0x14, 0x0d, + 0x10, 0x0c, 0x13, 0x0a, 0x16, 0x17, 0x08, 0x11, 0x14, 0x14, 0x0e, 0x11, + 0x0e, 0x16, 0x14, 0x14, 0x0a, 0x0d, 0x08, 0x0a, 0x0a, 0x0e, 0x14, 0x14, + 0x13, 0x0e, 0x08, 0x0b, 0x11, 0x14, 0x10, 0x0a, 0x09, 0x0c, 0x0d, 0x08, + 0x0b, 0x0d, 0x11, 0x08, 0x0a, 0x17, 0x12, 0x10, 0x16, 0x0e, 0x0d, 0x08, + 0x13, 0x0d, 0x0b, 0x15, 0x14, 0x17, 0x12, 0x0f, 0x0e, 0x12, 0x13, 0x17, + 0x0f, 0x0c, 0x0a, 0x10, 0x10, 0x0f, 0x10, 0x14, 0x15, 0x0a, 0x14, 0x17, + 0x09, 0x0e, 0x10, 0x08, 0x15, 0x15, 0x09, 0x10, 0x0a, 0x0c, 0x0e, 0x16, + 0x0c, 0x09, 0x0e, 0x12, 0x13, 0x09, 0x12, 0x0a, 0x0e, 0x15, 0x13, 0x16, + 0x0d, 0x0c, 0x12, 0x0a, 0x0e, 0x0f, 0x0a, 0x10, 0x15, 0x12, 0x10, 0x12, + 0x10, 0x12, 0x0b, 0x12, 0x16, 0x12, 0x11, 0x0b, 0x13, 0x17, 0x15, 0x0e, + 0x09, 0x10, 0x11, 0x0f, 0x0d, 0x0c, 0x0d, 0x12, 0x10, 0x08, 0x15, 0x17, + 0x0f, 0x17, 0x0f, 0x0c, 0x12, 0x08, 0x17, 0x0a, 0x12, 0x0a, 0x14, 0x11, + 0x17, 0x15, 0x08, 0x11, 0x15, 0x17, 0x13, 0x0f, 0x0a, 0x10, 0x08, 0x17, + 0x17, 0x14, 0x10, 0x0c, 0x0f, 0x10, 0x13, 0x11, 0x09, 0x11, 0x0a, 0x16, + 0x15, 0x0c, 0x0d, 0x09, 0x0c, 0x12, 0x14, 0x0c, 0x0f, 0x15, 0x15, 0x0d, + 0x14, 0x11, 0x14, 0x17, 0x0a, 0x15, 0x16, 0x09, 0x12, 0x0f, 0x0e, 0x09, + 0x17, 0x0a, 0x13, 0x08, 0x14, 0x15, 0x17, 0x12, 0x0a, 0x0c, 0x14, 0x0f, + 0x17, 0x11, 0x13, 0x0f, 0x0e, 0x11, 0x14, 0x0a, 0x0a, 0x10, 0x09, 0x0d, + 0x0d, 0x08, 0x0f, 0x17, 0x0f, 0x16, 0x09, 0x0e, 0x08, 0x14, 0x0e, 0x15, + 0x12, 0x0d, 0x10, 0x14, 0x12, 0x0c, 0x0b, 0x11, 0x15, 0x16, 0x08, 0x0b, + 0x0f, 0x15, 0x0e, 0x12, 0x0d, 0x0f, 0x17, 0x13, 0x10, 0x0f, 0x13, 0x17, + 0x0d, 0x14, 0x0e, 0x0e, 0x11, 0x15, 0x0b, 0x0b, 0x0b, 0x13, 0x17, 0x15, + 0x08, 0x0b, 0x0e, 0x15, 0x09, 0x0f, 0x08, 0x11, 0x0c, 0x0e, 0x0b, 0x12, + 0x16, 0x0b, 0x0e, 0x0f, 0x12, 0x09, 0x0e, 0x08, 0x16, 0x15, 0x0e, 0x10, + 0x12, 0x12, 0x13, 0x15, 0x0e, 0x13, 0x13, 0x0e, 0x17, 0x0a, 0x0b, 0x09, + 0x12, 0x0c, 0x12, 0x16, 0x13, 0x16, 0x11, 0x11, 0x0a, 0x17, 0x08, 0x15, + 0x09, 0x0f, 0x15, 0x08, 0x0d, 0x0c, 0x10, 0x17, 0x16, 0x0c, 0x15, 0x0d, + 0x08, 0x11, 0x13, 0x08, 0x13, 0x17, 0x09, 0x0d, 0x0c, 0x13, 0x0c, 0x17, + 0x12, 0x15, 0x10, 0x14, 0x15, 0x11, 0x12, 0x17, 0x09, 0x0f, 0x17, 0x0e, + 0x13, 0x10, 0x0e, 0x12, 0x15, 0x0c, 0x08, 0x16, 0x15, 0x14, 0x16, 0x11, + 0x13, 0x17, 0x16, 0x17, 0x13, 0x0b, 0x16, 0x0d, 0x09, 0x0f, 0x0a, 0x16, + 0x09, 0x14, 0x16, 0x0a, 0x0b, 0x15, 0x10, 0x17, 0x0e, 0x16, 0x12, 0x0b, + 0x0a, 0x12, 0x09, 0x08, 0x0e, 0x08, 0x11, 0x0a, 0x17, 0x0f, 0x0a, 0x12, + 0x13, 0x09, 0x08, 0x14, 0x10, 0x0a, 0x13, 0x11, 0x16, 0x11, 0x14, 0x0a, + 0x0f, 0x0c, 0x0a, 0x15, 0x0b, 0x15, 0x09, 0x0e, 0x10, 0x0a, 0x0e, 0x16, + 0x0a, 0x17, 0x09, 0x0a, 0x0f, 0x0b, 0x14, 0x0a, 0x0c, 0x15, 0x17, 0x15, + 0x17, 0x13, 0x0f, 0x16, 0x0d, 0x0b, 0x09, 0x14, 0x10, 0x0c, 0x11, 0x14, + 0x14, 0x10, 0x13, 0x09, 0x14, 0x14, 0x16, 0x0c, 0x09, 0x10, 0x09, 0x0b, + 0x0b, 0x0b, 0x15, 0x09, 0x14, 0x0e, 0x09, 0x0b, 0x08, 0x0c, 0x0b, 0x16, + 0x0c, 0x0d, 0x09, 0x09, 0x0e, 0x0a, 0x16, 0x0b, 0x12, 0x11, 0x0d, 0x0e, + 0x0e, 0x0b, 0x13, 0x0f, 0x14, 0x14, 0x12, 0x17, 0x17, 0x10, 0x09, 0x13, + 0x16, 0x0a, 0x17, 0x16, 0x0f, 0x0a, 0x15, 0x14, 0x0f, 0x16, 0x15, 0x16, + 0x08, 0x14, 0x09, 0x12, 0x0d, 0x0f, 0x09, 0x14, 0x12, 0x14, 0x0b, 0x0f, + 0x10, 0x16, 0x0e, 0x10, 0x0e, 0x10, 0x0c, 0x0d, 0x12, 0x0c, 0x0b, 0x0a, + 0x0e, 0x08, 0x17, 0x16, 0x16, 0x15, 0x15, 0x17, 0x11, 0x16, 0x12, 0x16, + 0x0e, 0x13, 0x12, 0x09, 0x10, 0x16, 0x10, 0x09, 0x15, 0x17, 0x12, 0x0c, + 0x0f, 0x16, 0x11, 0x0a, 0x0a, 0x15, 0x0c, 0x11, 0x15, 0x0c, 0x10, 0x14, + 0x09, 0x0d, 0x14, 0x12, 0x0c, 0x0e, 0x10, 0x12, 0x0a, 0x0b, 0x13, 0x13, + 0x0a, 0x0c, 0x14, 0x08, 0x0b, 0x0e, 0x0d, 0x12, 0x0d, 0x16, 0x14, 0x0f, + 0x14, 0x09, 0x09, 0x11, 0x0d, 0x12, 0x0e, 0x0f, 0x17, 0x0a, 0x09, 0x0c, + 0x11, 0x12, 0x17, 0x14, 0x15, 0x13, 0x0f, 0x08, 0x17, 0x0c, 0x08, 0x0a, + 0x12, 0x0e, 0x15, 0x17, 0x0c, 0x11, 0x0f, 0x09, 0x13, 0x11, 0x13, 0x09, + 0x0b, 0x09, 0x10, 0x0b, 0x0c, 0x11, 0x0f, 0x16, 0x0b, 0x0f, 0x13, 0x09, + 0x0a, 0x0a, 0x0a, 0x09, 0x0e, 0x0b, 0x0c, 0x09, 0x11, 0x09, 0x09, 0x16, + 0x12, 0x10, 0x17, 0x0e, 0x09, 0x12, 0x0f, 0x0d, 0x14, 0x17, 0x10, 0x09, + 0x11, 0x08, 0x17, 0x15, 0x0f, 0x12, 0x16, 0x11, 0x15, 0x09, 0x13, 0x0c, + 0x0c, 0x17, 0x0d, 0x15, 0x08, 0x0e, 0x13, 0x13, 0x17, 0x13, 0x09, 0x08, + 0x0d, 0x11, 0x0e, 0x0a, 0x11, 0x16, 0x0b, 0x0a, 0x16, 0x0a, 0x17, 0x0d, + 0x15, 0x16, 0x17, 0x12, 0x17, 0x12, 0x17, 0x0c, 0x11, 0x0c, 0x09, 0x11, + 0x12, 0x15, 0x0d, 0x12, 0x10, 0x0e, 0x12, 0x16, 0x17, 0x08, 0x08, 0x10, + 0x17, 0x0b, 0x13, 0x15, 0x0e, 0x13, 0x0b, 0x0c, 0x11, 0x0a, 0x16, 0x11, + 0x15, 0x16, 0x16, 0x0f, 0x0a, 0x08, 0x09, 0x15, 0x15, 0x0e, 0x0f, 0x0e, + 0x08, 0x16, 0x13, 0x0b, 0x16, 0x14, 0x08, 0x13, 0x0a, 0x10, 0x0a, 0x17, + 0x12, 0x0f, 0x14, 0x15, 0x14, 0x09, 0x08, 0x0d, 0x0a, 0x09, 0x0d, 0x16, + 0x0d, 0x11, 0x0c, 0x14, 0x13, 0x0b, 0x09, 0x14, 0x09, 0x14, 0x17, 0x08, + 0x11, 0x17, 0x13, 0x14, 0x0f, 0x15, 0x14, 0x0a, 0x0d, 0x10, 0x08, 0x09, + 0x12, 0x09, 0x0f, 0x14, 0x0a, 0x14, 0x12, 0x0f, 0x0d, 0x16, 0x0c, 0x09, + 0x0a, 0x0d, 0x15, 0x0c, 0x0a, 0x15, 0x0c, 0x13, 0x14, 0x08, 0x0f, 0x0c, + 0x16, 0x0b, 0x0f, 0x0b, 0x14, 0x0f, 0x0d, 0x0e, 0x11, 0x14, 0x0a, 0x13, + 0x11, 0x15, 0x0b, 0x17, 0x14, 0x0f, 0x09, 0x16, 0x15, 0x16, 0x0b, 0x17, + 0x14, 0x10, 0x13, 0x11, 0x11, 0x0b, 0x15, 0x0f, 0x0f, 0x0d, 0x13, 0x0b, + 0x15, 0x08, 0x11, 0x0e, 0x15, 0x14, 0x09, 0x0f, 0x11, 0x0d, 0x0f, 0x0d, + 0x15, 0x10, 0x0c, 0x12, 0x0f, 0x10, 0x12, 0x0b, 0x09, 0x0e, 0x14, 0x12, + 0x11, 0x12, 0x09, 0x08, 0x17, 0x15, 0x0c, 0x14, 0x15, 0x16, 0x0b, 0x13, + 0x12, 0x0d, 0x0a, 0x0c, 0x12, 0x11, 0x12, 0x0f, 0x0a, 0x17, 0x0a, 0x11, + 0x10, 0x14, 0x15, 0x11, 0x0a, 0x11, 0x0b, 0x14, 0x0b, 0x0d, 0x15, 0x0b, + 0x0a, 0x09, 0x08, 0x08, 0x17, 0x0b, 0x13, 0x12, 0x10, 0x16, 0x17, 0x0b, + 0x10, 0x12, 0x12, 0x12, 0x11, 0x14, 0x0c, 0x09, 0x11, 0x09, 0x12, 0x14, + 0x13, 0x16, 0x10, 0x17, 0x0b, 0x0d, 0x0b, 0x0d, 0x0f, 0x0b, 0x0d, 0x0f, + 0x0f, 0x09, 0x0a, 0x08, 0x08, 0x09, 0x0b, 0x10, 0x13, 0x16, 0x0b, 0x0d, + 0x13, 0x10, 0x0f, 0x0c, 0x12, 0x09, 0x09, 0x0d, 0x17, 0x12, 0x0c, 0x0b, + 0x17, 0x0f, 0x10, 0x0f, 0x13, 0x16, 0x16, 0x0b, 0x08, 0x08, 0x0b, 0x08, + 0x0a, 0x0f, 0x11, 0x16, 0x0d, 0x15, 0x0b, 0x09, 0x0d, 0x12, 0x0e, 0x17, + 0x14, 0x0f, 0x0d, 0x14, 0x09, 0x12, 0x17, 0x09, 0x09, 0x10, 0x10, 0x15, + 0x0f, 0x0f, 0x08, 0x10, 0x10, 0x0c, 0x11, 0x13, 0x13, 0x0b, 0x11, 0x09, + 0x08, 0x15, 0x0a, 0x0e, 0x0f, 0x11, 0x0e, 0x0c, 0x08, 0x13, 0x08, 0x0a, + 0x0e, 0x08, 0x0b, 0x0f, 0x10, 0x14, 0x0d, 0x08, 0x0c, 0x0d, 0x10, 0x15, + 0x14, 0x11, 0x14, 0x0d, 0x0d, 0x09, 0x0d, 0x12, 0x0f, 0x15, 0x0f, 0x09, + 0x17, 0x17, 0x0e, 0x0c, 0x09, 0x16, 0x11, 0x08, 0x10, 0x0d, 0x0f, 0x13, + 0x0f, 0x0b, 0x17, 0x0d, 0x17, 0x0c, 0x11, 0x13, 0x16, 0x0d, 0x08, 0x0b, + 0x0f, 0x0d, 0x16, 0x16, 0x0b, 0x0d, 0x17, 0x0b, 0x0d, 0x0e, 0x0f, 0x0e, + 0x0c, 0x08, 0x0f, 0x15, 0x0e, 0x17, 0x10, 0x15, 0x0a, 0x0f, 0x0b, 0x09, + 0x14, 0x14, 0x14, 0x12, 0x0a, 0x15, 0x16, 0x11, 0x0a, 0x14, 0x0f, 0x0e, + 0x0a, 0x0f, 0x11, 0x0f, 0x15, 0x08, 0x15, 0x0a, 0x09, 0x0d, 0x17, 0x0f, + 0x0c, 0x10, 0x0d, 0x0e, 0x08, 0x10, 0x10, 0x14, 0x0d, 0x0d, 0x0f, 0x0f, + 0x0a, 0x0d, 0x09, 0x0d, 0x0a, 0x10, 0x13, 0x0c, 0x17, 0x0c, 0x13, 0x15, + 0x0d, 0x11, 0x08, 0x0f, 0x16, 0x08, 0x17, 0x0a, 0x10, 0x0c, 0x11, 0x10, + 0x15, 0x09, 0x0d, 0x0b, 0x0f, 0x14, 0x12, 0x11, 0x0a, 0x14, 0x16, 0x0c, + 0x0c, 0x11, 0x11, 0x0c, 0x16, 0x0c, 0x0a, 0x0c, 0x15, 0x0a, 0x13, 0x13, + 0x0b, 0x12, 0x16, 0x13, 0x17, 0x10, 0x0c, 0x15, 0x11, 0x11, 0x08, 0x08, + 0x0e, 0x13, 0x12, 0x10, 0x0f, 0x10, 0x15, 0x14, 0x0a, 0x0e, 0x08, 0x09, + 0x12, 0x0b, 0x0d, 0x10, 0x0e, 0x09, 0x0c, 0x11, 0x14, 0x0b, 0x0d, 0x14, + 0x13, 0x11, 0x11, 0x0d, 0x0b, 0x11, 0x0e, 0x12, 0x0d, 0x08, 0x0a, 0x14, + 0x11, 0x08, 0x10, 0x13, 0x0e, 0x11, 0x14, 0x09, 0x15, 0x0a, 0x12, 0x0b, + 0x0b, 0x16, 0x15, 0x17, 0x09, 0x0a, 0x14, 0x15, 0x14, 0x0d, 0x0a, 0x08, + 0x17, 0x10, 0x12, 0x0c, 0x10, 0x15, 0x09, 0x09, 0x15, 0x11, 0x15, 0x0c, + 0x0b, 0x11, 0x0d, 0x08, 0x14, 0x17, 0x0c, 0x17, 0x16, 0x09, 0x17, 0x08, + 0x0c, 0x13, 0x15, 0x09, 0x09, 0x17, 0x0a, 0x08, 0x10, 0x15, 0x0d, 0x08, + 0x12, 0x0e, 0x0a, 0x10, 0x08, 0x17, 0x14, 0x0b, 0x11, 0x0a, 0x0c, 0x0d, + 0x0a, 0x11, 0x0d, 0x08, 0x13, 0x0d, 0x09, 0x17, 0x09, 0x17, 0x09, 0x0a, + 0x17, 0x0b, 0x0b, 0x0f, 0x08, 0x10, 0x0f, 0x13, 0x17, 0x12, 0x0b, 0x17, + 0x11, 0x08, 0x0b, 0x0b, 0x0a, 0x10, 0x10, 0x0c, 0x09, 0x16, 0x0d, 0x14, + 0x09, 0x0e, 0x13, 0x0c, 0x17, 0x0c, 0x10, 0x08, 0x0b, 0x16, 0x15, 0x0f, + 0x0d, 0x11, 0x15, 0x13, 0x0f, 0x0d, 0x08, 0x10, 0x09, 0x14, 0x12, 0x0e, + 0x08, 0x10, 0x12, 0x16, 0x11, 0x15, 0x0f, 0x13, 0x0c, 0x0a, 0x17, 0x0b, + 0x0f, 0x10, 0x0b, 0x12, 0x0f, 0x08, 0x0a, 0x14, 0x12, 0x17, 0x0f, 0x09, + 0x0c, 0x0f, 0x11, 0x0e, 0x0c, 0x0c, 0x14, 0x0c, 0x15, 0x0e, 0x0b, 0x0e, + 0x0b, 0x12, 0x0a, 0x0f, 0x14, 0x0a, 0x13, 0x0c, 0x13, 0x16, 0x16, 0x0a, + 0x17, 0x09, 0x17, 0x11, 0x08, 0x0f, 0x12, 0x0c, 0x16, 0x0c, 0x12, 0x0b, + 0x11, 0x0f, 0x0f, 0x0e, 0x15, 0x12, 0x15, 0x09, 0x0c, 0x17, 0x11, 0x09, + 0x0a, 0x0c, 0x0d, 0x15, 0x0a, 0x0c, 0x08, 0x0a, 0x0d, 0x17, 0x13, 0x0d, + 0x0e, 0x0e, 0x12, 0x0d, 0x13, 0x0d, 0x10, 0x0c, 0x14, 0x17, 0x12, 0x12, + 0x12, 0x0f, 0x13, 0x16, 0x0f, 0x0c, 0x08, 0x11, 0x10, 0x0d, 0x0f, 0x13, + 0x12, 0x0f, 0x15, 0x08, 0x0e, 0x11, 0x0d, 0x15, 0x17, 0x08, 0x0a, 0x12, + 0x0d, 0x13, 0x17, 0x0a, 0x12, 0x11, 0x15, 0x0d, 0x09, 0x10, 0x0b, 0x11, + 0x15, 0x0b, 0x0a, 0x0e, 0x11, 0x11, 0x09, 0x0c, 0x09, 0x17, 0x0c, 0x0f, + 0x10, 0x11, 0x0d, 0x10, 0x12, 0x0f, 0x0b, 0x08, 0x0a, 0x0a, 0x0b, 0x15, + 0x14, 0x08, 0x0b, 0x15, 0x11, 0x0e, 0x0e, 0x0e, 0x12, 0x11, 0x14, 0x0c, + 0x0b, 0x16, 0x10, 0x0c, 0x15, 0x15, 0x14, 0x0e, 0x0f, 0x09, 0x16, 0x09, + 0x11, 0x0a, 0x09, 0x14, 0x0c, 0x0d, 0x12, 0x08, 0x0d, 0x15, 0x16, 0x16, + 0x0c, 0x0d, 0x0d, 0x17, 0x17, 0x0a, 0x0c, 0x0a, 0x08, 0x15, 0x0f, 0x16, + 0x12, 0x0c, 0x0c, 0x09, 0x0e, 0x0b, 0x0a, 0x08, 0x0d, 0x0c, 0x14, 0x12, + 0x11, 0x0e, 0x13, 0x16, 0x0c, 0x11, 0x15, 0x11, 0x16, 0x0a, 0x10, 0x15, + 0x0d, 0x14, 0x08, 0x0d, 0x11, 0x10, 0x0c, 0x0b, 0x14, 0x11, 0x0c, 0x0b, + 0x14, 0x0f, 0x0b, 0x0a, 0x13, 0x17, 0x15, 0x0c, 0x0e, 0x10, 0x0b, 0x13, + 0x09, 0x08, 0x0c, 0x08, 0x0b, 0x14, 0x16, 0x11, 0x11, 0x17, 0x17, 0x0b, + 0x0f, 0x0b, 0x0e, 0x0c, 0x14, 0x13, 0x0f, 0x11, 0x0a, 0x13, 0x14, 0x16, + 0x03, 0x00, 0x06, 0x02, 0x06, 0x02, 0x06, 0x00, 0x00, 0x05, 0x07, 0x05, + 0x01, 0x01, 0x06, 0x02, 0x04, 0x04, 0x03, 0x00, 0x05, 0x05, 0x06, 0x04, + 0x06, 0x00, 0x00, 0x07, 0x02, 0x05, 0x04, 0x06, 0x06, 0x02, 0x00, 0x05, + 0x05, 0x07, 0x05, 0x05, 0x04, 0x05, 0x03, 0x06, 0x06, 0x01, 0x00, 0x02, + 0x06, 0x04, 0x03, 0x04, 0x02, 0x01, 0x00, 0x01, 0x02, 0x01, 0x00, 0x04, + 0x07, 0x04, 0x03, 0x05, 0x07, 0x03, 0x03, 0x05, 0x03, 0x00, 0x02, 0x07, + 0x05, 0x06, 0x05, 0x04, 0x07, 0x06, 0x06, 0x06, 0x03, 0x01, 0x02, 0x05, + 0x03, 0x02, 0x06, 0x05, 0x04, 0x07, 0x01, 0x03, 0x04, 0x04, 0x00, 0x04, + 0x00, 0x04, 0x01, 0x03, 0x04, 0x04, 0x03, 0x02, 0x02, 0x01, 0x07, 0x02, + 0x07, 0x05, 0x00, 0x02, 0x07, 0x02, 0x00, 0x03, 0x05, 0x07, 0x00, 0x01, + 0x07, 0x02, 0x04, 0x04, 0x07, 0x05, 0x00, 0x07, 0x01, 0x02, 0x03, 0x06, + 0x06, 0x06, 0x01, 0x00, 0x07, 0x00, 0x03, 0x07, 0x06, 0x03, 0x02, 0x06, + 0x06, 0x03, 0x01, 0x04, 0x02, 0x02, 0x05, 0x02, 0x04, 0x02, 0x06, 0x03, + 0x00, 0x07, 0x03, 0x02, 0x01, 0x06, 0x01, 0x07, 0x05, 0x03, 0x00, 0x05, + 0x04, 0x03, 0x04, 0x03, 0x07, 0x07, 0x01, 0x05, 0x02, 0x03, 0x01, 0x05, + 0x05, 0x07, 0x00, 0x01, 0x02, 0x06, 0x05, 0x03, 0x05, 0x00, 0x05, 0x07, + 0x07, 0x06, 0x06, 0x04, 0x02, 0x07, 0x02, 0x06, 0x03, 0x06, 0x01, 0x03, + 0x06, 0x02, 0x01, 0x01, 0x06, 0x02, 0x06, 0x03, 0x02, 0x06, 0x05, 0x05, + 0x05, 0x02, 0x00, 0x03, 0x03, 0x05, 0x02, 0x02, 0x04, 0x01, 0x07, 0x06, + 0x01, 0x01, 0x04, 0x05, 0x00, 0x06, 0x00, 0x07, 0x01, 0x01, 0x00, 0x07, + 0x04, 0x07, 0x03, 0x07, 0x05, 0x00, 0x04, 0x03, 0x03, 0x04, 0x06, 0x07, + 0x01, 0x01, 0x02, 0x06, 0x03, 0x02, 0x05, 0x04, 0x04, 0x01, 0x01, 0x05, + 0x00, 0x02, 0x04, 0x01, 0x03, 0x04, 0x00, 0x07, 0x03, 0x03, 0x06, 0x01, + 0x04, 0x03, 0x05, 0x00, 0x07, 0x04, 0x00, 0x01, 0x05, 0x02, 0x07, 0x01, + 0x04, 0x04, 0x05, 0x01, 0x06, 0x07, 0x06, 0x06, 0x01, 0x02, 0x07, 0x05, +}; + +//*******************************************************************v********** +// +// The top right corner of the border. +// +//***************************************************************************** +static const uint8_t g_pui8TopRight[] = +{ + IMAGE_FMT_8BPP_UNCOMP, + 10, 0, + 26, 0, + + 34, + 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x11, 0x00, 0x00, + 0x12, 0x00, 0x00, + 0x13, 0x00, 0x00, + 0x14, 0x00, 0x00, + 0x15, 0x00, 0x00, + 0x16, 0x00, 0x00, + 0x17, 0x00, 0x00, + 0x20, 0x00, 0x00, + 0x21, 0x00, 0x00, + 0x22, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x24, 0x00, 0x00, + 0x25, 0x00, 0x00, + 0x26, 0x00, 0x00, + 0x27, 0x00, 0x00, + 0x28, 0x00, 0x00, + 0x29, 0x00, 0x00, + 0x2a, 0x00, 0x00, + 0x2b, 0x00, 0x00, + 0x2c, 0x00, 0x00, + 0x2d, 0x00, 0x00, + 0x2e, 0x00, 0x00, + 0x2f, 0x00, 0x00, + 0x44, 0x00, 0x00, + 0x46, 0x00, 0x00, + 0x48, 0x00, 0x00, + 0x4e, 0x00, 0x00, + 0x54, 0x00, 0x00, + 0x56, 0x00, 0x00, + 0x58, 0x00, 0x00, + 0x5a, 0x00, 0x00, + 0x5e, 0x00, 0x00, + + 0x1d, 0x21, 0x1d, 0x1c, 0x1a, 0x1e, 0x14, 0x00, 0x00, 0x00, 0x13, 0x16, + 0x18, 0x18, 0x0c, 0x11, 0x1d, 0x20, 0x14, 0x00, 0x13, 0x0b, 0x18, 0x10, + 0x18, 0x14, 0x11, 0x11, 0x04, 0x00, 0x0a, 0x0c, 0x0e, 0x0a, 0x0e, 0x0a, + 0x14, 0x11, 0x07, 0x01, 0x15, 0x0a, 0x18, 0x18, 0x0a, 0x12, 0x15, 0x0e, + 0x0f, 0x06, 0x0c, 0x0a, 0x0a, 0x16, 0x0c, 0x0c, 0x0e, 0x0c, 0x14, 0x02, + 0x12, 0x15, 0x16, 0x10, 0x0b, 0x0d, 0x0c, 0x15, 0x19, 0x04, 0x0d, 0x16, + 0x15, 0x0a, 0x0a, 0x15, 0x19, 0x0b, 0x0c, 0x08, 0x16, 0x0f, 0x11, 0x19, + 0x0d, 0x12, 0x0d, 0x0f, 0x13, 0x08, 0x15, 0x0c, 0x0e, 0x15, 0x19, 0x0c, + 0x13, 0x18, 0x15, 0x02, 0x19, 0x13, 0x10, 0x0e, 0x15, 0x12, 0x0c, 0x11, + 0x13, 0x07, 0x19, 0x0e, 0x12, 0x17, 0x14, 0x0a, 0x13, 0x0b, 0x17, 0x06, + 0x0a, 0x13, 0x16, 0x10, 0x0c, 0x13, 0x17, 0x0f, 0x0a, 0x07, 0x16, 0x0e, + 0x0f, 0x18, 0x11, 0x0e, 0x10, 0x12, 0x0c, 0x09, 0x14, 0x13, 0x0c, 0x13, + 0x0d, 0x0e, 0x0b, 0x0f, 0x0e, 0x05, 0x17, 0x10, 0x16, 0x12, 0x0f, 0x14, + 0x19, 0x10, 0x0c, 0x06, 0x0b, 0x15, 0x0c, 0x13, 0x17, 0x12, 0x12, 0x0a, + 0x11, 0x07, 0x16, 0x0c, 0x0e, 0x16, 0x0d, 0x0f, 0x0f, 0x0c, 0x13, 0x02, + 0x14, 0x0b, 0x12, 0x0f, 0x0e, 0x0b, 0x11, 0x0f, 0x19, 0x07, 0x0e, 0x10, + 0x16, 0x0f, 0x0f, 0x17, 0x12, 0x0e, 0x0b, 0x07, 0x14, 0x13, 0x0d, 0x0b, + 0x0b, 0x10, 0x16, 0x0d, 0x11, 0x02, 0x09, 0x0a, 0x14, 0x11, 0x12, 0x12, + 0x14, 0x0b, 0x18, 0x04, 0x01, 0x03, 0x06, 0x11, 0x19, 0x18, 0x10, 0x14, + 0x17, 0x08, 0x00, 0x00, 0x14, 0x22, 0x0c, 0x15, 0x15, 0x17, 0x0e, 0x02, + 0x00, 0x00, 0x00, 0x1b, 0x13, 0x14, 0x11, 0x0a, 0x15, 0x04, 0x00, 0x00, + 0x00, 0x12, 0x1f, 0x11, 0x0c, 0x0a, 0x13, 0x04, +}; + +//***************************************************************************** +// +// The left side of the border. +// +//***************************************************************************** +static const uint8_t g_pui8Left[] = +{ + IMAGE_FMT_8BPP_UNCOMP, + 6, 0, + 204, 0, + + 39, + 0x10, 0x00, 0x00, + 0x11, 0x00, 0x00, + 0x12, 0x00, 0x00, + 0x13, 0x00, 0x00, + 0x14, 0x00, 0x00, + 0x15, 0x00, 0x00, + 0x16, 0x00, 0x00, + 0x17, 0x00, 0x00, + 0x20, 0x00, 0x00, + 0x21, 0x00, 0x00, + 0x22, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x24, 0x00, 0x00, + 0x25, 0x00, 0x00, + 0x26, 0x00, 0x00, + 0x27, 0x00, 0x00, + 0x28, 0x00, 0x00, + 0x29, 0x00, 0x00, + 0x2a, 0x00, 0x00, + 0x2b, 0x00, 0x00, + 0x2c, 0x00, 0x00, + 0x2d, 0x00, 0x00, + 0x2e, 0x00, 0x00, + 0x2f, 0x00, 0x00, + 0x40, 0x00, 0x00, + 0x42, 0x00, 0x00, + 0x44, 0x00, 0x00, + 0x46, 0x00, 0x00, + 0x48, 0x00, 0x00, + 0x4a, 0x00, 0x00, + 0x4c, 0x00, 0x00, + 0x4e, 0x00, 0x00, + 0x50, 0x00, 0x00, + 0x52, 0x00, 0x00, + 0x54, 0x00, 0x00, + 0x56, 0x00, 0x00, + 0x58, 0x00, 0x00, + 0x5a, 0x00, 0x00, + 0x5c, 0x00, 0x00, + 0x5e, 0x00, 0x00, + + 0x24, 0x15, 0x12, 0x0f, 0x16, 0x04, 0x25, 0x09, 0x0e, 0x13, 0x0c, 0x03, + 0x1d, 0x15, 0x0e, 0x0a, 0x17, 0x00, 0x22, 0x0c, 0x0f, 0x0a, 0x0d, 0x06, + 0x27, 0x14, 0x09, 0x0e, 0x09, 0x03, 0x20, 0x16, 0x0b, 0x0a, 0x0e, 0x01, + 0x23, 0x0c, 0x0c, 0x0a, 0x17, 0x04, 0x21, 0x0d, 0x0e, 0x08, 0x0f, 0x03, + 0x19, 0x0a, 0x13, 0x11, 0x0d, 0x00, 0x1d, 0x0c, 0x15, 0x0e, 0x12, 0x07, + 0x25, 0x0a, 0x15, 0x09, 0x0c, 0x02, 0x1c, 0x08, 0x10, 0x10, 0x0b, 0x04, + 0x19, 0x15, 0x15, 0x10, 0x16, 0x02, 0x27, 0x17, 0x0e, 0x12, 0x10, 0x05, + 0x23, 0x16, 0x17, 0x10, 0x0c, 0x05, 0x1f, 0x0a, 0x14, 0x0d, 0x0b, 0x00, + 0x21, 0x0f, 0x09, 0x0a, 0x08, 0x02, 0x22, 0x09, 0x0a, 0x0f, 0x12, 0x00, + 0x24, 0x11, 0x08, 0x0a, 0x0b, 0x04, 0x26, 0x16, 0x0e, 0x16, 0x0f, 0x05, + 0x20, 0x16, 0x15, 0x0c, 0x0b, 0x00, 0x1d, 0x14, 0x11, 0x0f, 0x16, 0x04, + 0x25, 0x10, 0x13, 0x17, 0x08, 0x03, 0x18, 0x14, 0x17, 0x08, 0x17, 0x01, + 0x21, 0x16, 0x0a, 0x17, 0x14, 0x04, 0x22, 0x0d, 0x0f, 0x10, 0x12, 0x05, + 0x22, 0x08, 0x0f, 0x0c, 0x10, 0x03, 0x26, 0x0d, 0x17, 0x11, 0x0d, 0x07, + 0x27, 0x0d, 0x14, 0x17, 0x0e, 0x05, 0x1a, 0x17, 0x11, 0x0c, 0x16, 0x03, + 0x26, 0x11, 0x14, 0x0d, 0x0a, 0x03, 0x18, 0x14, 0x0e, 0x0f, 0x08, 0x07, + 0x26, 0x16, 0x0b, 0x16, 0x10, 0x04, 0x26, 0x10, 0x16, 0x12, 0x10, 0x02, + 0x1e, 0x13, 0x0c, 0x17, 0x17, 0x01, 0x1e, 0x16, 0x14, 0x0a, 0x0b, 0x07, + 0x21, 0x0b, 0x13, 0x17, 0x13, 0x06, 0x26, 0x12, 0x13, 0x0a, 0x10, 0x02, + 0x22, 0x0e, 0x15, 0x11, 0x08, 0x02, 0x26, 0x0e, 0x08, 0x0a, 0x0e, 0x00, + 0x1c, 0x15, 0x16, 0x09, 0x08, 0x01, 0x18, 0x11, 0x0d, 0x13, 0x10, 0x00, + 0x20, 0x0f, 0x13, 0x0b, 0x11, 0x02, 0x1f, 0x0c, 0x12, 0x0c, 0x15, 0x05, + 0x22, 0x13, 0x0a, 0x12, 0x16, 0x04, 0x23, 0x0a, 0x0e, 0x11, 0x0c, 0x03, + 0x24, 0x0c, 0x08, 0x09, 0x17, 0x04, 0x1b, 0x0f, 0x08, 0x17, 0x13, 0x05, + 0x1b, 0x0b, 0x16, 0x16, 0x10, 0x06, 0x22, 0x0a, 0x10, 0x14, 0x15, 0x03, + 0x1d, 0x10, 0x11, 0x14, 0x0a, 0x06, 0x1b, 0x16, 0x09, 0x0b, 0x08, 0x00, + 0x25, 0x0c, 0x11, 0x15, 0x0b, 0x02, 0x20, 0x0f, 0x10, 0x0e, 0x0d, 0x00, + 0x1a, 0x17, 0x0a, 0x13, 0x14, 0x00, 0x19, 0x0a, 0x11, 0x12, 0x16, 0x05, + 0x20, 0x0a, 0x12, 0x11, 0x0e, 0x05, 0x23, 0x0b, 0x17, 0x0c, 0x09, 0x01, + 0x21, 0x11, 0x12, 0x09, 0x08, 0x00, 0x1a, 0x0b, 0x08, 0x0c, 0x16, 0x06, + 0x1d, 0x17, 0x16, 0x16, 0x12, 0x06, 0x22, 0x0a, 0x17, 0x0c, 0x14, 0x02, + 0x18, 0x0f, 0x11, 0x08, 0x14, 0x05, 0x1b, 0x0e, 0x0c, 0x15, 0x10, 0x02, + 0x25, 0x12, 0x0f, 0x15, 0x17, 0x03, 0x22, 0x0c, 0x0d, 0x10, 0x0a, 0x00, + 0x1d, 0x14, 0x0a, 0x0c, 0x09, 0x07, 0x22, 0x0a, 0x0e, 0x0c, 0x0a, 0x01, + 0x26, 0x0d, 0x11, 0x0b, 0x0a, 0x00, 0x20, 0x08, 0x13, 0x17, 0x16, 0x05, + 0x1e, 0x10, 0x17, 0x13, 0x08, 0x00, 0x23, 0x0e, 0x16, 0x16, 0x13, 0x00, + 0x25, 0x0d, 0x0a, 0x0b, 0x11, 0x02, 0x1e, 0x10, 0x12, 0x08, 0x14, 0x06, + 0x19, 0x0c, 0x16, 0x15, 0x0c, 0x06, 0x20, 0x12, 0x0c, 0x0f, 0x0e, 0x02, + 0x21, 0x0a, 0x14, 0x10, 0x08, 0x03, 0x21, 0x15, 0x15, 0x14, 0x09, 0x03, + 0x19, 0x10, 0x17, 0x14, 0x10, 0x06, 0x21, 0x12, 0x08, 0x10, 0x0f, 0x02, + 0x1c, 0x08, 0x17, 0x11, 0x10, 0x02, 0x27, 0x0a, 0x0f, 0x13, 0x12, 0x04, + 0x1a, 0x0c, 0x0d, 0x17, 0x08, 0x03, 0x1e, 0x09, 0x17, 0x0e, 0x16, 0x03, + 0x1b, 0x0f, 0x09, 0x0b, 0x17, 0x04, 0x20, 0x0c, 0x11, 0x10, 0x15, 0x01, + 0x25, 0x15, 0x0c, 0x0d, 0x10, 0x07, 0x25, 0x12, 0x0a, 0x0b, 0x12, 0x01, + 0x21, 0x09, 0x0d, 0x11, 0x10, 0x01, 0x18, 0x13, 0x12, 0x09, 0x17, 0x05, + 0x23, 0x10, 0x17, 0x0d, 0x08, 0x06, 0x1f, 0x16, 0x12, 0x13, 0x0b, 0x01, + 0x22, 0x08, 0x15, 0x15, 0x0b, 0x04, 0x18, 0x15, 0x11, 0x0d, 0x0e, 0x01, + 0x20, 0x0f, 0x15, 0x0b, 0x11, 0x06, 0x26, 0x0c, 0x0d, 0x15, 0x11, 0x03, + 0x22, 0x08, 0x0c, 0x0c, 0x13, 0x03, 0x1f, 0x0e, 0x10, 0x0c, 0x0b, 0x06, + 0x24, 0x0b, 0x12, 0x0e, 0x10, 0x00, 0x20, 0x09, 0x10, 0x0e, 0x0d, 0x01, + 0x1c, 0x0b, 0x0e, 0x11, 0x09, 0x00, 0x27, 0x13, 0x09, 0x0c, 0x08, 0x06, + 0x23, 0x0f, 0x0b, 0x0c, 0x14, 0x03, 0x19, 0x11, 0x11, 0x13, 0x17, 0x01, + 0x24, 0x10, 0x0c, 0x0d, 0x17, 0x04, 0x20, 0x0b, 0x15, 0x17, 0x15, 0x07, + 0x27, 0x15, 0x12, 0x09, 0x09, 0x05, 0x26, 0x15, 0x0a, 0x0a, 0x09, 0x07, + 0x20, 0x0a, 0x10, 0x0a, 0x16, 0x04, 0x1d, 0x13, 0x09, 0x11, 0x08, 0x00, + 0x1b, 0x10, 0x0c, 0x08, 0x10, 0x00, 0x27, 0x0f, 0x17, 0x12, 0x11, 0x00, + 0x1c, 0x0f, 0x15, 0x0f, 0x11, 0x07, 0x1e, 0x0a, 0x09, 0x17, 0x0c, 0x07, + 0x1f, 0x12, 0x12, 0x10, 0x0c, 0x05, 0x21, 0x0f, 0x0c, 0x15, 0x10, 0x06, + 0x27, 0x10, 0x0c, 0x16, 0x0a, 0x06, 0x26, 0x0f, 0x0d, 0x14, 0x16, 0x07, + 0x23, 0x0d, 0x09, 0x15, 0x0c, 0x03, 0x25, 0x13, 0x09, 0x0f, 0x0c, 0x02, + 0x1b, 0x15, 0x14, 0x10, 0x12, 0x02, 0x1c, 0x12, 0x15, 0x11, 0x10, 0x07, + 0x1e, 0x0f, 0x0f, 0x14, 0x0b, 0x02, 0x23, 0x17, 0x13, 0x15, 0x14, 0x07, + 0x1c, 0x11, 0x13, 0x0d, 0x09, 0x00, 0x22, 0x0c, 0x15, 0x0e, 0x14, 0x04, + 0x24, 0x09, 0x0a, 0x11, 0x12, 0x05, 0x21, 0x09, 0x0a, 0x08, 0x15, 0x02, + 0x1e, 0x11, 0x0d, 0x09, 0x0e, 0x00, 0x19, 0x12, 0x13, 0x15, 0x17, 0x06, + 0x25, 0x12, 0x09, 0x13, 0x09, 0x07, 0x1b, 0x15, 0x17, 0x0d, 0x0f, 0x05, + 0x18, 0x08, 0x14, 0x0a, 0x09, 0x04, 0x20, 0x10, 0x0b, 0x15, 0x12, 0x05, + 0x27, 0x13, 0x0c, 0x12, 0x11, 0x02, 0x1f, 0x0f, 0x17, 0x10, 0x0a, 0x00, + 0x1f, 0x0d, 0x15, 0x0f, 0x13, 0x02, 0x19, 0x14, 0x0d, 0x15, 0x17, 0x03, + 0x1f, 0x0f, 0x16, 0x12, 0x0d, 0x04, 0x1c, 0x0c, 0x0c, 0x11, 0x17, 0x07, + 0x26, 0x0e, 0x0d, 0x15, 0x17, 0x03, 0x25, 0x0f, 0x15, 0x13, 0x16, 0x04, + 0x27, 0x08, 0x0d, 0x0c, 0x15, 0x02, 0x23, 0x0d, 0x14, 0x12, 0x08, 0x01, + 0x1b, 0x0d, 0x0e, 0x10, 0x17, 0x03, 0x1e, 0x15, 0x15, 0x13, 0x13, 0x06, + 0x1b, 0x11, 0x0c, 0x08, 0x0c, 0x01, 0x21, 0x0c, 0x0a, 0x17, 0x10, 0x00, + 0x1b, 0x0c, 0x0e, 0x08, 0x17, 0x03, 0x1a, 0x0a, 0x13, 0x11, 0x12, 0x05, + 0x27, 0x08, 0x10, 0x15, 0x14, 0x02, 0x22, 0x17, 0x15, 0x17, 0x17, 0x01, + 0x19, 0x11, 0x0e, 0x0c, 0x10, 0x07, 0x1d, 0x14, 0x0b, 0x13, 0x15, 0x01, + 0x1a, 0x17, 0x0d, 0x16, 0x11, 0x07, 0x21, 0x11, 0x08, 0x0a, 0x0e, 0x06, + 0x1e, 0x09, 0x14, 0x0c, 0x08, 0x06, 0x1e, 0x09, 0x0e, 0x15, 0x0e, 0x07, + 0x24, 0x14, 0x13, 0x08, 0x0f, 0x04, 0x1a, 0x12, 0x0f, 0x10, 0x10, 0x00, + 0x20, 0x09, 0x12, 0x11, 0x0b, 0x00, 0x1e, 0x12, 0x09, 0x0b, 0x17, 0x00, + 0x27, 0x0d, 0x0b, 0x0d, 0x0b, 0x05, 0x1c, 0x17, 0x0e, 0x17, 0x17, 0x07, + 0x1f, 0x0a, 0x10, 0x17, 0x12, 0x00, 0x18, 0x0b, 0x09, 0x12, 0x14, 0x02, + 0x23, 0x0a, 0x17, 0x14, 0x0d, 0x07, 0x26, 0x0d, 0x0d, 0x09, 0x13, 0x04, + 0x23, 0x17, 0x0f, 0x0a, 0x16, 0x03, 0x18, 0x0e, 0x11, 0x10, 0x0d, 0x02, + 0x20, 0x0e, 0x10, 0x12, 0x08, 0x02, 0x18, 0x13, 0x0f, 0x08, 0x10, 0x06, + 0x27, 0x0e, 0x0a, 0x0c, 0x0f, 0x06, 0x24, 0x0b, 0x14, 0x0c, 0x0d, 0x05, + 0x23, 0x0e, 0x09, 0x0d, 0x16, 0x03, 0x22, 0x0f, 0x15, 0x0a, 0x0a, 0x06, + 0x1e, 0x0a, 0x11, 0x15, 0x0b, 0x00, 0x23, 0x0a, 0x0f, 0x15, 0x0e, 0x07, + 0x23, 0x0b, 0x0b, 0x10, 0x0f, 0x04, 0x1b, 0x0a, 0x17, 0x0d, 0x0f, 0x07, + 0x24, 0x09, 0x0e, 0x12, 0x0b, 0x04, 0x20, 0x12, 0x14, 0x09, 0x10, 0x07, + 0x1a, 0x0b, 0x09, 0x12, 0x09, 0x04, 0x22, 0x14, 0x13, 0x15, 0x0d, 0x01, + 0x1e, 0x11, 0x0d, 0x0e, 0x17, 0x06, 0x1c, 0x13, 0x16, 0x13, 0x0e, 0x01, + 0x1c, 0x16, 0x15, 0x08, 0x17, 0x02, 0x27, 0x0a, 0x11, 0x09, 0x15, 0x05, + 0x21, 0x0f, 0x0f, 0x0d, 0x0d, 0x06, 0x1f, 0x14, 0x0e, 0x14, 0x0a, 0x02, + 0x21, 0x0f, 0x09, 0x10, 0x0a, 0x03, 0x22, 0x0f, 0x0d, 0x10, 0x0f, 0x02, + 0x25, 0x0f, 0x10, 0x0f, 0x11, 0x02, 0x1a, 0x0b, 0x15, 0x12, 0x10, 0x01, + 0x1f, 0x08, 0x16, 0x15, 0x15, 0x00, 0x1b, 0x0e, 0x10, 0x0d, 0x17, 0x05, + 0x24, 0x11, 0x0a, 0x0a, 0x0a, 0x05, 0x20, 0x17, 0x0a, 0x08, 0x0f, 0x05, + 0x1e, 0x11, 0x17, 0x0b, 0x0b, 0x04, 0x1d, 0x12, 0x10, 0x0c, 0x10, 0x02, + 0x1d, 0x14, 0x14, 0x15, 0x09, 0x05, 0x20, 0x16, 0x0d, 0x13, 0x08, 0x03, + 0x1d, 0x11, 0x0f, 0x0f, 0x11, 0x07, 0x1b, 0x17, 0x10, 0x0a, 0x0b, 0x05, +}; + +//***************************************************************************** +// +// The right side of the border. +// +//***************************************************************************** +static const uint8_t g_pui8Right[] = +{ + IMAGE_FMT_8BPP_UNCOMP, + 6, 0, + 204, 0, + + 39, + 0x10, 0x00, 0x00, + 0x11, 0x00, 0x00, + 0x12, 0x00, 0x00, + 0x13, 0x00, 0x00, + 0x14, 0x00, 0x00, + 0x15, 0x00, 0x00, + 0x16, 0x00, 0x00, + 0x17, 0x00, 0x00, + 0x20, 0x00, 0x00, + 0x21, 0x00, 0x00, + 0x22, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x24, 0x00, 0x00, + 0x25, 0x00, 0x00, + 0x26, 0x00, 0x00, + 0x27, 0x00, 0x00, + 0x28, 0x00, 0x00, + 0x29, 0x00, 0x00, + 0x2a, 0x00, 0x00, + 0x2b, 0x00, 0x00, + 0x2c, 0x00, 0x00, + 0x2d, 0x00, 0x00, + 0x2e, 0x00, 0x00, + 0x2f, 0x00, 0x00, + 0x40, 0x00, 0x00, + 0x42, 0x00, 0x00, + 0x44, 0x00, 0x00, + 0x46, 0x00, 0x00, + 0x48, 0x00, 0x00, + 0x4a, 0x00, 0x00, + 0x4c, 0x00, 0x00, + 0x4e, 0x00, 0x00, + 0x50, 0x00, 0x00, + 0x52, 0x00, 0x00, + 0x54, 0x00, 0x00, + 0x56, 0x00, 0x00, + 0x58, 0x00, 0x00, + 0x5a, 0x00, 0x00, + 0x5c, 0x00, 0x00, + 0x5e, 0x00, 0x00, + + 0x1f, 0x10, 0x15, 0x0b, 0x0f, 0x01, 0x20, 0x0e, 0x09, 0x16, 0x08, 0x07, + 0x23, 0x0a, 0x12, 0x0f, 0x08, 0x07, 0x20, 0x12, 0x11, 0x17, 0x12, 0x02, + 0x1d, 0x0d, 0x14, 0x0f, 0x0e, 0x02, 0x25, 0x16, 0x16, 0x12, 0x0a, 0x02, + 0x26, 0x12, 0x13, 0x08, 0x10, 0x06, 0x27, 0x0c, 0x17, 0x11, 0x13, 0x00, + 0x20, 0x0b, 0x12, 0x09, 0x0b, 0x02, 0x1d, 0x10, 0x13, 0x0a, 0x08, 0x00, + 0x1f, 0x15, 0x08, 0x0d, 0x10, 0x01, 0x22, 0x0f, 0x14, 0x0e, 0x0f, 0x02, + 0x1b, 0x0e, 0x11, 0x0b, 0x08, 0x02, 0x1b, 0x10, 0x11, 0x16, 0x11, 0x06, + 0x1b, 0x17, 0x0e, 0x17, 0x09, 0x03, 0x19, 0x11, 0x0c, 0x09, 0x16, 0x06, + 0x1b, 0x11, 0x0b, 0x08, 0x08, 0x05, 0x1e, 0x0c, 0x09, 0x08, 0x0f, 0x00, + 0x1d, 0x13, 0x12, 0x17, 0x11, 0x02, 0x24, 0x15, 0x0b, 0x0a, 0x14, 0x02, + 0x20, 0x15, 0x17, 0x14, 0x16, 0x07, 0x21, 0x0a, 0x10, 0x14, 0x0a, 0x04, + 0x1f, 0x10, 0x15, 0x11, 0x10, 0x02, 0x23, 0x16, 0x08, 0x0d, 0x15, 0x05, + 0x21, 0x11, 0x0f, 0x15, 0x13, 0x01, 0x1b, 0x0c, 0x08, 0x0a, 0x09, 0x07, + 0x18, 0x12, 0x08, 0x10, 0x0f, 0x01, 0x19, 0x17, 0x14, 0x17, 0x10, 0x02, + 0x1c, 0x0c, 0x0b, 0x0d, 0x11, 0x00, 0x27, 0x0b, 0x11, 0x0e, 0x08, 0x02, + 0x21, 0x0c, 0x11, 0x11, 0x0e, 0x05, 0x20, 0x0f, 0x0d, 0x11, 0x17, 0x06, + 0x24, 0x09, 0x14, 0x10, 0x08, 0x02, 0x25, 0x0d, 0x11, 0x08, 0x12, 0x01, + 0x19, 0x11, 0x0d, 0x12, 0x08, 0x03, 0x18, 0x11, 0x12, 0x12, 0x0b, 0x00, + 0x1d, 0x14, 0x10, 0x12, 0x0d, 0x04, 0x1f, 0x0a, 0x12, 0x0b, 0x13, 0x05, + 0x20, 0x11, 0x08, 0x0a, 0x11, 0x05, 0x1c, 0x12, 0x0d, 0x12, 0x0d, 0x02, + 0x19, 0x0d, 0x16, 0x14, 0x17, 0x01, 0x25, 0x0d, 0x16, 0x0e, 0x17, 0x01, + 0x27, 0x0f, 0x0e, 0x11, 0x12, 0x00, 0x1c, 0x0b, 0x12, 0x0d, 0x0d, 0x02, + 0x18, 0x12, 0x17, 0x0d, 0x0d, 0x02, 0x23, 0x0e, 0x12, 0x11, 0x0a, 0x05, + 0x24, 0x08, 0x17, 0x12, 0x0f, 0x07, 0x25, 0x0e, 0x0e, 0x0c, 0x08, 0x00, + 0x1d, 0x0c, 0x0c, 0x08, 0x12, 0x05, 0x1c, 0x13, 0x0c, 0x0b, 0x09, 0x04, + 0x20, 0x14, 0x08, 0x0b, 0x0e, 0x01, 0x25, 0x0a, 0x0c, 0x15, 0x14, 0x05, + 0x25, 0x12, 0x09, 0x0b, 0x16, 0x00, 0x1c, 0x0c, 0x0e, 0x11, 0x0c, 0x00, + 0x1b, 0x10, 0x14, 0x10, 0x13, 0x06, 0x1a, 0x0c, 0x11, 0x0a, 0x0f, 0x07, + 0x1e, 0x0d, 0x09, 0x12, 0x0b, 0x07, 0x1d, 0x08, 0x10, 0x0f, 0x0b, 0x03, + 0x20, 0x10, 0x13, 0x17, 0x09, 0x07, 0x18, 0x0d, 0x0f, 0x14, 0x15, 0x01, + 0x21, 0x17, 0x0f, 0x0b, 0x0a, 0x07, 0x1a, 0x10, 0x0c, 0x0c, 0x0a, 0x03, + 0x1a, 0x10, 0x10, 0x13, 0x17, 0x05, 0x1a, 0x10, 0x0c, 0x15, 0x0f, 0x02, + 0x24, 0x10, 0x13, 0x0b, 0x0c, 0x04, 0x1f, 0x16, 0x10, 0x16, 0x09, 0x05, + 0x25, 0x0c, 0x0c, 0x0a, 0x11, 0x03, 0x21, 0x13, 0x17, 0x0a, 0x0f, 0x07, + 0x25, 0x11, 0x0e, 0x0a, 0x0e, 0x07, 0x1f, 0x0b, 0x0e, 0x0b, 0x0f, 0x05, + 0x23, 0x16, 0x11, 0x0c, 0x15, 0x05, 0x18, 0x13, 0x08, 0x0c, 0x15, 0x04, + 0x23, 0x0f, 0x0d, 0x12, 0x11, 0x06, 0x21, 0x0f, 0x0e, 0x17, 0x11, 0x06, + 0x26, 0x09, 0x08, 0x0d, 0x0c, 0x04, 0x18, 0x08, 0x0e, 0x12, 0x0d, 0x02, + 0x1d, 0x0d, 0x17, 0x0e, 0x11, 0x06, 0x27, 0x0c, 0x0d, 0x0d, 0x17, 0x07, + 0x19, 0x10, 0x0e, 0x0f, 0x0f, 0x00, 0x1d, 0x0e, 0x09, 0x0d, 0x13, 0x03, + 0x26, 0x13, 0x0f, 0x0d, 0x0d, 0x06, 0x21, 0x13, 0x09, 0x11, 0x09, 0x05, + 0x1e, 0x09, 0x08, 0x14, 0x0e, 0x07, 0x23, 0x0f, 0x0f, 0x09, 0x17, 0x07, + 0x1a, 0x0c, 0x0d, 0x0b, 0x12, 0x00, 0x22, 0x10, 0x14, 0x09, 0x15, 0x01, + 0x26, 0x0f, 0x15, 0x08, 0x08, 0x07, 0x23, 0x0f, 0x08, 0x13, 0x0c, 0x03, + 0x22, 0x17, 0x16, 0x09, 0x09, 0x07, 0x19, 0x0b, 0x0b, 0x0e, 0x0f, 0x07, + 0x1f, 0x09, 0x0f, 0x0b, 0x0b, 0x02, 0x1e, 0x09, 0x14, 0x0c, 0x09, 0x06, + 0x1b, 0x14, 0x0d, 0x0c, 0x10, 0x04, 0x22, 0x0b, 0x10, 0x11, 0x0d, 0x05, + 0x1f, 0x0e, 0x15, 0x13, 0x14, 0x02, 0x21, 0x0b, 0x0d, 0x08, 0x0f, 0x04, + 0x1e, 0x15, 0x12, 0x0a, 0x09, 0x05, 0x18, 0x0d, 0x10, 0x0d, 0x11, 0x00, + 0x26, 0x0c, 0x0c, 0x0f, 0x15, 0x04, 0x19, 0x0d, 0x17, 0x17, 0x09, 0x05, + 0x1b, 0x12, 0x17, 0x11, 0x13, 0x03, 0x1a, 0x09, 0x0d, 0x14, 0x0c, 0x03, + 0x1f, 0x0c, 0x14, 0x17, 0x11, 0x03, 0x18, 0x10, 0x12, 0x0c, 0x08, 0x04, + 0x25, 0x0a, 0x15, 0x15, 0x09, 0x07, 0x20, 0x0d, 0x11, 0x10, 0x16, 0x02, + 0x18, 0x08, 0x0e, 0x0d, 0x14, 0x05, 0x24, 0x0c, 0x17, 0x11, 0x0c, 0x04, + 0x27, 0x0d, 0x09, 0x11, 0x11, 0x01, 0x19, 0x0f, 0x0c, 0x17, 0x0c, 0x03, + 0x26, 0x15, 0x13, 0x10, 0x0e, 0x05, 0x25, 0x0e, 0x12, 0x0c, 0x13, 0x03, + 0x27, 0x10, 0x14, 0x16, 0x09, 0x00, 0x1f, 0x08, 0x0d, 0x11, 0x12, 0x07, + 0x23, 0x14, 0x0f, 0x17, 0x14, 0x05, 0x1e, 0x13, 0x11, 0x09, 0x0c, 0x07, + 0x23, 0x09, 0x0d, 0x0e, 0x0e, 0x00, 0x26, 0x0d, 0x11, 0x12, 0x0c, 0x05, + 0x23, 0x13, 0x14, 0x08, 0x0c, 0x03, 0x18, 0x08, 0x0b, 0x0f, 0x08, 0x00, + 0x1b, 0x0e, 0x13, 0x14, 0x10, 0x07, 0x23, 0x0c, 0x09, 0x09, 0x13, 0x04, + 0x1b, 0x11, 0x15, 0x15, 0x0c, 0x01, 0x20, 0x17, 0x15, 0x0c, 0x08, 0x01, + 0x23, 0x08, 0x0a, 0x17, 0x10, 0x01, 0x27, 0x13, 0x11, 0x13, 0x0f, 0x00, + 0x22, 0x0b, 0x0d, 0x14, 0x0d, 0x00, 0x1c, 0x10, 0x12, 0x0a, 0x0d, 0x07, + 0x1c, 0x16, 0x16, 0x0a, 0x0a, 0x07, 0x1d, 0x16, 0x08, 0x10, 0x16, 0x04, + 0x23, 0x15, 0x0b, 0x0c, 0x10, 0x05, 0x1e, 0x0b, 0x16, 0x14, 0x08, 0x01, + 0x25, 0x0d, 0x14, 0x0f, 0x0f, 0x01, 0x1e, 0x14, 0x08, 0x0d, 0x17, 0x01, + 0x1c, 0x0c, 0x09, 0x0c, 0x15, 0x07, 0x25, 0x10, 0x15, 0x08, 0x15, 0x03, + 0x23, 0x0c, 0x12, 0x12, 0x08, 0x05, 0x26, 0x16, 0x08, 0x12, 0x0d, 0x03, + 0x25, 0x14, 0x0c, 0x15, 0x0a, 0x01, 0x18, 0x0f, 0x0f, 0x0a, 0x14, 0x02, + 0x1a, 0x11, 0x15, 0x17, 0x12, 0x05, 0x1e, 0x0d, 0x17, 0x08, 0x08, 0x00, + 0x23, 0x16, 0x16, 0x14, 0x11, 0x02, 0x1b, 0x0e, 0x08, 0x0f, 0x0b, 0x01, + 0x22, 0x0c, 0x12, 0x0a, 0x0e, 0x03, 0x1f, 0x11, 0x17, 0x0d, 0x10, 0x04, + 0x18, 0x17, 0x17, 0x17, 0x08, 0x07, 0x18, 0x14, 0x16, 0x16, 0x10, 0x03, + 0x1a, 0x13, 0x16, 0x0b, 0x0b, 0x01, 0x1e, 0x16, 0x0e, 0x08, 0x08, 0x06, + 0x1f, 0x10, 0x0e, 0x0e, 0x15, 0x07, 0x18, 0x15, 0x16, 0x08, 0x15, 0x07, + 0x27, 0x15, 0x13, 0x16, 0x13, 0x01, 0x1d, 0x16, 0x17, 0x0b, 0x09, 0x01, + 0x1e, 0x0f, 0x09, 0x14, 0x10, 0x01, 0x22, 0x17, 0x12, 0x09, 0x0e, 0x04, + 0x18, 0x0f, 0x0e, 0x17, 0x0f, 0x01, 0x26, 0x0f, 0x09, 0x12, 0x0e, 0x06, + 0x25, 0x13, 0x13, 0x15, 0x17, 0x06, 0x18, 0x0d, 0x0d, 0x0a, 0x0a, 0x06, + 0x1c, 0x15, 0x15, 0x17, 0x16, 0x02, 0x20, 0x17, 0x14, 0x16, 0x16, 0x01, + 0x1a, 0x15, 0x13, 0x0c, 0x0f, 0x00, 0x19, 0x0d, 0x15, 0x15, 0x0a, 0x06, + 0x22, 0x0b, 0x0b, 0x08, 0x0d, 0x03, 0x25, 0x12, 0x0b, 0x13, 0x12, 0x00, + 0x18, 0x0b, 0x08, 0x14, 0x09, 0x07, 0x18, 0x0c, 0x14, 0x13, 0x10, 0x02, + 0x25, 0x12, 0x11, 0x13, 0x10, 0x06, 0x20, 0x0b, 0x08, 0x14, 0x0b, 0x02, + 0x1a, 0x09, 0x08, 0x0d, 0x14, 0x05, 0x1f, 0x14, 0x16, 0x10, 0x11, 0x00, + 0x1f, 0x11, 0x0d, 0x0c, 0x0d, 0x06, 0x21, 0x0a, 0x10, 0x0a, 0x16, 0x00, + 0x27, 0x0e, 0x0b, 0x17, 0x0a, 0x03, 0x1d, 0x0c, 0x10, 0x0e, 0x12, 0x02, + 0x19, 0x09, 0x0a, 0x08, 0x12, 0x05, 0x19, 0x09, 0x0c, 0x0e, 0x0e, 0x04, + 0x1b, 0x17, 0x14, 0x14, 0x0a, 0x05, 0x24, 0x09, 0x08, 0x08, 0x09, 0x01, + 0x20, 0x0e, 0x10, 0x08, 0x14, 0x01, 0x1d, 0x16, 0x0c, 0x10, 0x17, 0x07, + 0x1b, 0x08, 0x09, 0x0f, 0x0e, 0x03, 0x18, 0x12, 0x0f, 0x14, 0x0e, 0x04, + 0x1f, 0x0b, 0x13, 0x0f, 0x0c, 0x06, 0x23, 0x14, 0x0b, 0x0c, 0x15, 0x00, + 0x1f, 0x0b, 0x16, 0x14, 0x13, 0x07, 0x23, 0x16, 0x16, 0x14, 0x0e, 0x02, + 0x1c, 0x0f, 0x17, 0x13, 0x0b, 0x03, 0x1d, 0x12, 0x12, 0x09, 0x0a, 0x07, + 0x26, 0x16, 0x14, 0x09, 0x0a, 0x05, 0x19, 0x11, 0x15, 0x08, 0x0d, 0x04, + 0x26, 0x08, 0x0f, 0x15, 0x15, 0x07, 0x1a, 0x09, 0x0d, 0x0a, 0x14, 0x04, + 0x21, 0x0a, 0x0c, 0x0b, 0x0b, 0x03, 0x1b, 0x09, 0x0d, 0x17, 0x0a, 0x03, + 0x22, 0x0c, 0x09, 0x0f, 0x0c, 0x03, 0x18, 0x0b, 0x0f, 0x10, 0x08, 0x02, + 0x1e, 0x0b, 0x0d, 0x14, 0x0d, 0x01, 0x1d, 0x16, 0x0c, 0x11, 0x0a, 0x03, + 0x18, 0x0e, 0x10, 0x0d, 0x0e, 0x05, 0x25, 0x08, 0x17, 0x16, 0x10, 0x02, + 0x1d, 0x10, 0x10, 0x14, 0x09, 0x04, 0x19, 0x10, 0x14, 0x0e, 0x0c, 0x00, +}; + +//***************************************************************************** +// +// The bottom left corner of the border. +// +//***************************************************************************** +static const uint8_t g_pui8BottomLeft[] = +{ + IMAGE_FMT_8BPP_UNCOMP, + 10, 0, + 10, 0, + + 33, + 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x12, 0x00, 0x00, + 0x13, 0x00, 0x00, + 0x14, 0x00, 0x00, + 0x16, 0x00, 0x00, + 0x17, 0x00, 0x00, + 0x20, 0x00, 0x00, + 0x21, 0x00, 0x00, + 0x22, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x24, 0x00, 0x00, + 0x25, 0x00, 0x00, + 0x26, 0x00, 0x00, + 0x27, 0x00, 0x00, + 0x28, 0x00, 0x00, + 0x29, 0x00, 0x00, + 0x2a, 0x00, 0x00, + 0x2b, 0x00, 0x00, + 0x2c, 0x00, 0x00, + 0x2d, 0x00, 0x00, + 0x2e, 0x00, 0x00, + 0x2f, 0x00, 0x00, + 0x42, 0x00, 0x00, + 0x4a, 0x00, 0x00, + 0x4c, 0x00, 0x00, + 0x50, 0x00, 0x00, + 0x52, 0x00, 0x00, + 0x54, 0x00, 0x00, + 0x56, 0x00, 0x00, + 0x58, 0x00, 0x00, + 0x5c, 0x00, 0x00, + 0x5e, 0x00, 0x00, + + 0x1d, 0x11, 0x0e, 0x0b, 0x15, 0x07, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x0b, + 0x13, 0x0d, 0x09, 0x14, 0x03, 0x00, 0x00, 0x00, 0x18, 0x11, 0x12, 0x0f, + 0x0c, 0x13, 0x06, 0x01, 0x00, 0x00, 0x20, 0x12, 0x0c, 0x0e, 0x09, 0x16, + 0x17, 0x1b, 0x1f, 0x16, 0x19, 0x0d, 0x16, 0x15, 0x0f, 0x09, 0x09, 0x0d, + 0x09, 0x1e, 0x1b, 0x0a, 0x12, 0x16, 0x0e, 0x10, 0x0b, 0x0e, 0x11, 0x10, + 0x14, 0x21, 0x13, 0x11, 0x0d, 0x14, 0x0f, 0x0a, 0x09, 0x0f, 0x00, 0x1a, + 0x0e, 0x08, 0x15, 0x13, 0x0f, 0x11, 0x08, 0x16, 0x00, 0x14, 0x03, 0x02, + 0x0b, 0x0f, 0x09, 0x11, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, + 0x05, 0x06, 0x07, 0x04, +}; + +//***************************************************************************** +// +// The bottom side of the border. +// +//***************************************************************************** +static const uint8_t g_pui8Bottom[] = +{ + IMAGE_FMT_8BPP_UNCOMP, + 44, 1, + 6, 0, + + 39, + 0x10, 0x00, 0x00, + 0x11, 0x00, 0x00, + 0x12, 0x00, 0x00, + 0x13, 0x00, 0x00, + 0x14, 0x00, 0x00, + 0x15, 0x00, 0x00, + 0x16, 0x00, 0x00, + 0x17, 0x00, 0x00, + 0x20, 0x00, 0x00, + 0x21, 0x00, 0x00, + 0x22, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x24, 0x00, 0x00, + 0x25, 0x00, 0x00, + 0x26, 0x00, 0x00, + 0x27, 0x00, 0x00, + 0x28, 0x00, 0x00, + 0x29, 0x00, 0x00, + 0x2a, 0x00, 0x00, + 0x2b, 0x00, 0x00, + 0x2c, 0x00, 0x00, + 0x2d, 0x00, 0x00, + 0x2e, 0x00, 0x00, + 0x2f, 0x00, 0x00, + 0x40, 0x00, 0x00, + 0x42, 0x00, 0x00, + 0x44, 0x00, 0x00, + 0x46, 0x00, 0x00, + 0x48, 0x00, 0x00, + 0x4a, 0x00, 0x00, + 0x4c, 0x00, 0x00, + 0x4e, 0x00, 0x00, + 0x50, 0x00, 0x00, + 0x52, 0x00, 0x00, + 0x54, 0x00, 0x00, + 0x56, 0x00, 0x00, + 0x58, 0x00, 0x00, + 0x5a, 0x00, 0x00, + 0x5c, 0x00, 0x00, + 0x5e, 0x00, 0x00, + + 0x1a, 0x1d, 0x21, 0x1b, 0x26, 0x22, 0x25, 0x1d, 0x1c, 0x1f, 0x1e, 0x1c, + 0x19, 0x27, 0x21, 0x1a, 0x1f, 0x1f, 0x1d, 0x1c, 0x24, 0x23, 0x19, 0x20, + 0x24, 0x22, 0x1a, 0x25, 0x27, 0x1c, 0x20, 0x1a, 0x22, 0x1a, 0x1e, 0x21, + 0x24, 0x1b, 0x26, 0x18, 0x22, 0x1d, 0x1d, 0x24, 0x1c, 0x26, 0x26, 0x23, + 0x1e, 0x1c, 0x18, 0x1a, 0x27, 0x1a, 0x22, 0x23, 0x24, 0x25, 0x20, 0x24, + 0x1a, 0x19, 0x27, 0x24, 0x1b, 0x1d, 0x1d, 0x18, 0x20, 0x1c, 0x19, 0x1b, + 0x21, 0x1e, 0x27, 0x25, 0x1c, 0x26, 0x21, 0x22, 0x1a, 0x21, 0x25, 0x1a, + 0x24, 0x20, 0x25, 0x21, 0x1d, 0x1e, 0x1d, 0x1f, 0x20, 0x1c, 0x1c, 0x24, + 0x22, 0x21, 0x24, 0x1a, 0x26, 0x25, 0x1e, 0x1f, 0x1b, 0x1e, 0x1d, 0x20, + 0x1c, 0x26, 0x1b, 0x1f, 0x20, 0x18, 0x21, 0x1c, 0x20, 0x1f, 0x26, 0x26, + 0x26, 0x1b, 0x1e, 0x1e, 0x20, 0x22, 0x1a, 0x1a, 0x1c, 0x27, 0x1d, 0x1a, + 0x24, 0x23, 0x21, 0x18, 0x1a, 0x27, 0x20, 0x1e, 0x25, 0x24, 0x26, 0x1e, + 0x24, 0x20, 0x23, 0x1d, 0x18, 0x21, 0x1c, 0x26, 0x25, 0x22, 0x1d, 0x1e, + 0x1d, 0x20, 0x20, 0x21, 0x1f, 0x26, 0x23, 0x1c, 0x22, 0x1d, 0x1c, 0x24, + 0x1c, 0x25, 0x1b, 0x1a, 0x21, 0x19, 0x20, 0x1e, 0x21, 0x1c, 0x24, 0x21, + 0x26, 0x18, 0x20, 0x23, 0x22, 0x25, 0x19, 0x27, 0x1e, 0x22, 0x21, 0x25, + 0x21, 0x1c, 0x19, 0x1b, 0x22, 0x1e, 0x18, 0x26, 0x1b, 0x1b, 0x19, 0x25, + 0x1c, 0x21, 0x1c, 0x26, 0x26, 0x18, 0x20, 0x24, 0x18, 0x19, 0x20, 0x23, + 0x27, 0x22, 0x23, 0x1d, 0x1d, 0x1c, 0x1a, 0x26, 0x21, 0x1c, 0x1a, 0x1b, + 0x23, 0x1a, 0x1a, 0x27, 0x1d, 0x1b, 0x24, 0x22, 0x25, 0x19, 0x20, 0x23, + 0x19, 0x19, 0x20, 0x1a, 0x1a, 0x18, 0x26, 0x19, 0x23, 0x21, 0x1f, 0x18, + 0x26, 0x22, 0x26, 0x20, 0x26, 0x19, 0x23, 0x22, 0x1b, 0x26, 0x21, 0x20, + 0x19, 0x1d, 0x1b, 0x27, 0x1f, 0x24, 0x22, 0x20, 0x25, 0x1b, 0x23, 0x18, + 0x1c, 0x22, 0x1a, 0x27, 0x1b, 0x21, 0x18, 0x1a, 0x1b, 0x27, 0x22, 0x1a, + 0x18, 0x1e, 0x24, 0x1b, 0x1c, 0x1d, 0x24, 0x1e, 0x23, 0x27, 0x1d, 0x1a, + 0x08, 0x13, 0x0f, 0x0c, 0x0d, 0x0f, 0x0f, 0x10, 0x0e, 0x0a, 0x12, 0x0f, + 0x10, 0x0f, 0x12, 0x15, 0x15, 0x0e, 0x0c, 0x10, 0x0e, 0x11, 0x13, 0x0a, + 0x12, 0x0e, 0x13, 0x15, 0x15, 0x0c, 0x0d, 0x16, 0x08, 0x15, 0x0b, 0x0d, + 0x0d, 0x12, 0x16, 0x14, 0x15, 0x11, 0x0b, 0x0e, 0x08, 0x16, 0x0b, 0x15, + 0x0d, 0x10, 0x0e, 0x13, 0x09, 0x09, 0x15, 0x13, 0x0f, 0x11, 0x11, 0x0c, + 0x16, 0x17, 0x0a, 0x16, 0x15, 0x0e, 0x0c, 0x0a, 0x08, 0x0a, 0x17, 0x16, + 0x13, 0x0a, 0x0c, 0x14, 0x08, 0x0f, 0x12, 0x0d, 0x08, 0x08, 0x09, 0x09, + 0x09, 0x17, 0x15, 0x10, 0x10, 0x0f, 0x15, 0x0e, 0x0f, 0x08, 0x0d, 0x0c, + 0x0e, 0x12, 0x0f, 0x0f, 0x15, 0x0e, 0x0d, 0x11, 0x11, 0x11, 0x0d, 0x12, + 0x09, 0x17, 0x08, 0x09, 0x17, 0x09, 0x0b, 0x08, 0x09, 0x08, 0x11, 0x11, + 0x10, 0x0e, 0x08, 0x17, 0x0f, 0x0e, 0x0b, 0x15, 0x09, 0x13, 0x0c, 0x16, + 0x09, 0x11, 0x0f, 0x13, 0x0b, 0x15, 0x0d, 0x0c, 0x14, 0x0d, 0x0d, 0x14, + 0x0f, 0x10, 0x15, 0x10, 0x11, 0x0e, 0x0a, 0x09, 0x15, 0x0b, 0x08, 0x0c, + 0x12, 0x0c, 0x0a, 0x13, 0x17, 0x0e, 0x12, 0x09, 0x08, 0x09, 0x14, 0x0b, + 0x16, 0x0a, 0x10, 0x13, 0x10, 0x15, 0x10, 0x08, 0x0e, 0x0d, 0x11, 0x17, + 0x14, 0x13, 0x09, 0x12, 0x17, 0x0a, 0x17, 0x12, 0x0e, 0x09, 0x0d, 0x0e, + 0x10, 0x17, 0x10, 0x11, 0x09, 0x0d, 0x14, 0x08, 0x0f, 0x0c, 0x13, 0x17, + 0x0a, 0x0b, 0x17, 0x10, 0x11, 0x11, 0x10, 0x0d, 0x0c, 0x11, 0x17, 0x0c, + 0x14, 0x16, 0x16, 0x0b, 0x08, 0x0c, 0x11, 0x10, 0x0c, 0x0a, 0x09, 0x0d, + 0x0f, 0x16, 0x0d, 0x16, 0x0b, 0x09, 0x16, 0x0d, 0x0d, 0x16, 0x16, 0x16, + 0x0f, 0x0f, 0x0b, 0x14, 0x09, 0x0b, 0x09, 0x15, 0x0a, 0x17, 0x08, 0x0b, + 0x0c, 0x12, 0x14, 0x10, 0x14, 0x15, 0x16, 0x0b, 0x14, 0x0b, 0x0a, 0x08, + 0x0d, 0x08, 0x0e, 0x12, 0x17, 0x0c, 0x10, 0x0e, 0x14, 0x14, 0x0b, 0x15, + 0x08, 0x0c, 0x12, 0x0b, 0x0b, 0x12, 0x0e, 0x10, 0x0d, 0x0a, 0x08, 0x09, + 0x08, 0x16, 0x0d, 0x14, 0x0a, 0x10, 0x14, 0x0f, 0x11, 0x0b, 0x0a, 0x10, + 0x0e, 0x13, 0x12, 0x11, 0x0e, 0x08, 0x0a, 0x13, 0x0a, 0x0a, 0x15, 0x0b, + 0x09, 0x0b, 0x17, 0x0c, 0x13, 0x14, 0x14, 0x0c, 0x17, 0x16, 0x14, 0x0f, + 0x10, 0x13, 0x13, 0x08, 0x15, 0x15, 0x0f, 0x0b, 0x10, 0x0a, 0x15, 0x17, + 0x0b, 0x17, 0x12, 0x0d, 0x0a, 0x10, 0x11, 0x0c, 0x13, 0x10, 0x10, 0x0f, + 0x0d, 0x0c, 0x13, 0x0d, 0x0a, 0x10, 0x15, 0x13, 0x0c, 0x11, 0x13, 0x09, + 0x0e, 0x0b, 0x0d, 0x16, 0x0d, 0x0b, 0x16, 0x11, 0x0b, 0x10, 0x17, 0x0e, + 0x09, 0x10, 0x12, 0x14, 0x08, 0x0b, 0x0c, 0x0e, 0x10, 0x17, 0x13, 0x12, + 0x0f, 0x11, 0x0e, 0x13, 0x0a, 0x0a, 0x15, 0x10, 0x0e, 0x0b, 0x0f, 0x14, + 0x0f, 0x0d, 0x0d, 0x12, 0x16, 0x0c, 0x09, 0x17, 0x14, 0x13, 0x14, 0x15, + 0x17, 0x08, 0x0b, 0x0f, 0x08, 0x17, 0x0a, 0x10, 0x10, 0x10, 0x0c, 0x12, + 0x13, 0x09, 0x0b, 0x09, 0x0d, 0x12, 0x16, 0x14, 0x08, 0x0b, 0x0f, 0x16, + 0x0f, 0x10, 0x16, 0x0c, 0x0c, 0x12, 0x09, 0x0b, 0x13, 0x0d, 0x12, 0x14, + 0x0c, 0x15, 0x0c, 0x15, 0x0e, 0x10, 0x0f, 0x09, 0x12, 0x13, 0x0b, 0x17, + 0x0d, 0x09, 0x13, 0x0e, 0x0d, 0x0b, 0x0c, 0x15, 0x13, 0x0b, 0x09, 0x17, + 0x16, 0x0b, 0x0b, 0x11, 0x10, 0x16, 0x0d, 0x15, 0x13, 0x11, 0x12, 0x09, + 0x0a, 0x0a, 0x0b, 0x14, 0x15, 0x0f, 0x13, 0x0b, 0x11, 0x0f, 0x11, 0x16, + 0x12, 0x16, 0x14, 0x0e, 0x09, 0x16, 0x0e, 0x17, 0x09, 0x11, 0x10, 0x12, + 0x10, 0x16, 0x0f, 0x0b, 0x10, 0x0a, 0x0d, 0x12, 0x0d, 0x10, 0x0f, 0x0a, + 0x17, 0x0a, 0x0e, 0x10, 0x12, 0x17, 0x0f, 0x0d, 0x15, 0x0b, 0x13, 0x16, + 0x0a, 0x0a, 0x16, 0x0b, 0x14, 0x0f, 0x16, 0x0c, 0x0d, 0x0e, 0x10, 0x16, + 0x10, 0x15, 0x11, 0x15, 0x0d, 0x08, 0x08, 0x0d, 0x0b, 0x0e, 0x16, 0x16, + 0x0e, 0x0e, 0x0b, 0x0b, 0x12, 0x17, 0x0a, 0x14, 0x0a, 0x09, 0x17, 0x16, + 0x10, 0x16, 0x0a, 0x15, 0x0c, 0x12, 0x14, 0x15, 0x0f, 0x0d, 0x12, 0x15, + 0x0e, 0x13, 0x0b, 0x12, 0x09, 0x0a, 0x10, 0x0f, 0x10, 0x14, 0x13, 0x0a, + 0x14, 0x16, 0x16, 0x16, 0x17, 0x16, 0x14, 0x0f, 0x15, 0x17, 0x0d, 0x09, + 0x0c, 0x0b, 0x10, 0x0d, 0x0e, 0x09, 0x15, 0x17, 0x16, 0x10, 0x09, 0x12, + 0x0e, 0x08, 0x10, 0x0e, 0x17, 0x0d, 0x15, 0x14, 0x0c, 0x0b, 0x16, 0x17, + 0x0c, 0x14, 0x09, 0x14, 0x0d, 0x09, 0x13, 0x12, 0x0d, 0x0c, 0x17, 0x13, + 0x0e, 0x15, 0x12, 0x0c, 0x0d, 0x14, 0x16, 0x14, 0x15, 0x0f, 0x0a, 0x14, + 0x14, 0x08, 0x11, 0x09, 0x0b, 0x10, 0x08, 0x10, 0x0c, 0x0a, 0x0d, 0x12, + 0x0b, 0x08, 0x0d, 0x10, 0x0d, 0x0c, 0x0b, 0x13, 0x0a, 0x16, 0x17, 0x0f, + 0x12, 0x16, 0x0c, 0x0f, 0x0d, 0x0f, 0x0c, 0x0a, 0x10, 0x15, 0x0c, 0x13, + 0x0d, 0x0d, 0x0c, 0x12, 0x0f, 0x12, 0x0d, 0x12, 0x13, 0x12, 0x0a, 0x08, + 0x17, 0x0e, 0x13, 0x09, 0x0c, 0x13, 0x11, 0x16, 0x11, 0x15, 0x0e, 0x16, + 0x0d, 0x12, 0x09, 0x15, 0x10, 0x0d, 0x11, 0x15, 0x12, 0x16, 0x10, 0x0a, + 0x10, 0x15, 0x14, 0x0b, 0x10, 0x17, 0x0c, 0x0f, 0x0e, 0x08, 0x11, 0x12, + 0x13, 0x0a, 0x11, 0x0d, 0x08, 0x17, 0x0c, 0x0d, 0x12, 0x0d, 0x0b, 0x0a, + 0x12, 0x15, 0x17, 0x0d, 0x13, 0x10, 0x0f, 0x0c, 0x0e, 0x0c, 0x0f, 0x16, + 0x0b, 0x14, 0x0e, 0x11, 0x14, 0x17, 0x0c, 0x0f, 0x0a, 0x16, 0x14, 0x0a, + 0x16, 0x09, 0x10, 0x10, 0x0e, 0x14, 0x12, 0x09, 0x11, 0x12, 0x0f, 0x0d, + 0x0a, 0x16, 0x11, 0x10, 0x0b, 0x09, 0x0f, 0x0e, 0x15, 0x15, 0x08, 0x11, + 0x15, 0x0d, 0x09, 0x17, 0x0b, 0x16, 0x09, 0x09, 0x17, 0x12, 0x11, 0x0e, + 0x0e, 0x0b, 0x0f, 0x17, 0x16, 0x16, 0x0d, 0x08, 0x15, 0x16, 0x11, 0x08, + 0x17, 0x08, 0x0f, 0x15, 0x16, 0x10, 0x0f, 0x13, 0x15, 0x10, 0x12, 0x08, + 0x0f, 0x14, 0x0a, 0x0f, 0x0e, 0x13, 0x15, 0x15, 0x17, 0x0d, 0x15, 0x15, + 0x0b, 0x0a, 0x16, 0x09, 0x09, 0x0f, 0x0a, 0x08, 0x10, 0x12, 0x16, 0x0e, + 0x0a, 0x0d, 0x0a, 0x08, 0x16, 0x15, 0x09, 0x0d, 0x11, 0x0b, 0x15, 0x08, + 0x17, 0x12, 0x16, 0x17, 0x17, 0x13, 0x15, 0x0b, 0x16, 0x13, 0x0d, 0x17, + 0x0b, 0x0f, 0x08, 0x13, 0x0a, 0x16, 0x0a, 0x0c, 0x0b, 0x0d, 0x0d, 0x0a, + 0x0a, 0x0e, 0x10, 0x14, 0x12, 0x0d, 0x15, 0x11, 0x08, 0x13, 0x11, 0x08, + 0x09, 0x0c, 0x08, 0x0b, 0x0a, 0x0b, 0x10, 0x0e, 0x10, 0x15, 0x10, 0x13, + 0x0c, 0x08, 0x10, 0x16, 0x0e, 0x0d, 0x10, 0x0e, 0x09, 0x09, 0x0e, 0x10, + 0x0f, 0x12, 0x15, 0x10, 0x0b, 0x0a, 0x15, 0x0c, 0x0e, 0x16, 0x10, 0x11, + 0x0a, 0x08, 0x17, 0x13, 0x16, 0x10, 0x0f, 0x0a, 0x11, 0x17, 0x08, 0x17, + 0x0c, 0x10, 0x0d, 0x0e, 0x11, 0x13, 0x16, 0x09, 0x0e, 0x14, 0x12, 0x11, + 0x17, 0x0f, 0x16, 0x0d, 0x0e, 0x0f, 0x16, 0x11, 0x10, 0x16, 0x0c, 0x0e, + 0x0f, 0x13, 0x11, 0x08, 0x12, 0x11, 0x17, 0x17, 0x0a, 0x0d, 0x0e, 0x14, + 0x09, 0x0d, 0x15, 0x0f, 0x0a, 0x0f, 0x09, 0x09, 0x17, 0x17, 0x0e, 0x0e, + 0x0f, 0x0d, 0x17, 0x17, 0x0c, 0x0b, 0x0d, 0x13, 0x17, 0x16, 0x13, 0x12, + 0x10, 0x13, 0x12, 0x13, 0x09, 0x08, 0x0f, 0x0a, 0x0d, 0x0d, 0x11, 0x0f, + 0x14, 0x12, 0x10, 0x13, 0x12, 0x17, 0x09, 0x0a, 0x0d, 0x09, 0x09, 0x11, + 0x0c, 0x0f, 0x0d, 0x0c, 0x0e, 0x08, 0x16, 0x16, 0x14, 0x11, 0x12, 0x15, + 0x11, 0x09, 0x08, 0x17, 0x0e, 0x11, 0x0f, 0x0b, 0x0c, 0x08, 0x17, 0x17, + 0x08, 0x08, 0x09, 0x0d, 0x0a, 0x0b, 0x16, 0x0f, 0x12, 0x0b, 0x13, 0x08, + 0x0c, 0x12, 0x17, 0x09, 0x0b, 0x12, 0x17, 0x15, 0x13, 0x17, 0x14, 0x0a, + 0x11, 0x0c, 0x0d, 0x16, 0x0c, 0x0c, 0x15, 0x0c, 0x0d, 0x17, 0x12, 0x0f, + 0x0b, 0x10, 0x16, 0x16, 0x14, 0x12, 0x17, 0x09, 0x0c, 0x16, 0x0b, 0x10, + 0x10, 0x0a, 0x0d, 0x0c, 0x09, 0x0a, 0x0f, 0x12, 0x0e, 0x15, 0x11, 0x13, + 0x09, 0x0f, 0x17, 0x0f, 0x0f, 0x11, 0x17, 0x12, 0x0a, 0x16, 0x10, 0x17, + 0x10, 0x0f, 0x09, 0x15, 0x0e, 0x0c, 0x0d, 0x17, 0x0e, 0x13, 0x0b, 0x10, + 0x15, 0x13, 0x0b, 0x0b, 0x10, 0x14, 0x16, 0x12, 0x0b, 0x16, 0x09, 0x12, + 0x10, 0x09, 0x0c, 0x13, 0x17, 0x14, 0x13, 0x10, 0x0c, 0x14, 0x0e, 0x12, + 0x08, 0x14, 0x11, 0x0e, 0x0f, 0x15, 0x16, 0x0c, 0x11, 0x09, 0x0f, 0x09, + 0x16, 0x0e, 0x13, 0x09, 0x0d, 0x15, 0x13, 0x16, 0x16, 0x08, 0x11, 0x16, + 0x15, 0x0c, 0x0f, 0x09, 0x08, 0x15, 0x14, 0x09, 0x12, 0x0e, 0x0f, 0x09, + 0x01, 0x05, 0x04, 0x04, 0x03, 0x02, 0x03, 0x03, 0x02, 0x00, 0x02, 0x01, + 0x03, 0x06, 0x01, 0x03, 0x05, 0x00, 0x04, 0x02, 0x03, 0x00, 0x03, 0x05, + 0x03, 0x05, 0x03, 0x07, 0x04, 0x03, 0x03, 0x06, 0x00, 0x07, 0x03, 0x03, + 0x01, 0x06, 0x07, 0x04, 0x07, 0x01, 0x05, 0x02, 0x00, 0x07, 0x06, 0x05, + 0x07, 0x02, 0x00, 0x02, 0x02, 0x03, 0x00, 0x06, 0x00, 0x03, 0x06, 0x05, + 0x06, 0x01, 0x03, 0x07, 0x01, 0x06, 0x03, 0x03, 0x05, 0x02, 0x07, 0x05, + 0x04, 0x05, 0x07, 0x04, 0x04, 0x06, 0x02, 0x03, 0x00, 0x02, 0x06, 0x03, + 0x05, 0x06, 0x02, 0x06, 0x02, 0x00, 0x03, 0x01, 0x02, 0x07, 0x00, 0x03, + 0x06, 0x03, 0x07, 0x03, 0x05, 0x07, 0x00, 0x01, 0x04, 0x00, 0x06, 0x00, + 0x07, 0x00, 0x04, 0x00, 0x02, 0x02, 0x04, 0x00, 0x01, 0x06, 0x07, 0x03, + 0x06, 0x03, 0x05, 0x01, 0x02, 0x05, 0x05, 0x00, 0x01, 0x04, 0x04, 0x06, + 0x03, 0x05, 0x00, 0x07, 0x06, 0x06, 0x00, 0x05, 0x07, 0x04, 0x05, 0x02, + 0x07, 0x02, 0x02, 0x00, 0x00, 0x02, 0x04, 0x07, 0x05, 0x01, 0x00, 0x07, + 0x07, 0x05, 0x00, 0x00, 0x01, 0x05, 0x07, 0x05, 0x02, 0x00, 0x05, 0x01, + 0x07, 0x05, 0x06, 0x06, 0x01, 0x04, 0x01, 0x00, 0x06, 0x03, 0x01, 0x07, + 0x06, 0x05, 0x06, 0x03, 0x07, 0x06, 0x03, 0x07, 0x03, 0x04, 0x07, 0x05, + 0x01, 0x07, 0x03, 0x04, 0x00, 0x00, 0x05, 0x07, 0x05, 0x04, 0x06, 0x06, + 0x01, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x01, 0x05, 0x05, 0x04, 0x05, + 0x04, 0x00, 0x04, 0x00, 0x04, 0x03, 0x05, 0x05, 0x03, 0x01, 0x01, 0x03, + 0x01, 0x07, 0x03, 0x06, 0x03, 0x01, 0x04, 0x04, 0x01, 0x03, 0x04, 0x04, + 0x03, 0x04, 0x06, 0x01, 0x01, 0x02, 0x06, 0x06, 0x03, 0x02, 0x06, 0x07, + 0x06, 0x04, 0x04, 0x02, 0x05, 0x06, 0x05, 0x06, 0x05, 0x00, 0x04, 0x00, + 0x02, 0x01, 0x05, 0x03, 0x05, 0x02, 0x07, 0x01, 0x06, 0x05, 0x03, 0x00, + 0x00, 0x01, 0x06, 0x03, 0x04, 0x04, 0x03, 0x02, 0x01, 0x07, 0x05, 0x06, + 0x06, 0x02, 0x04, 0x03, 0x03, 0x01, 0x04, 0x05, 0x03, 0x02, 0x01, 0x01, +}; + +//***************************************************************************** +// +// The bottom right corner of the border. +// +//***************************************************************************** +static const uint8_t g_pui8BottomRight[] = +{ + IMAGE_FMT_8BPP_UNCOMP, + 10, 0, + 10, 0, + + 29, + 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, + 0x0b, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x11, 0x00, 0x00, + 0x12, 0x00, 0x00, + 0x13, 0x00, 0x00, + 0x14, 0x00, 0x00, + 0x16, 0x00, 0x00, + 0x17, 0x00, 0x00, + 0x20, 0x00, 0x00, + 0x21, 0x00, 0x00, + 0x22, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x24, 0x00, 0x00, + 0x25, 0x00, 0x00, + 0x26, 0x00, 0x00, + 0x27, 0x00, 0x00, + 0x28, 0x00, 0x00, + 0x29, 0x00, 0x00, + 0x2a, 0x00, 0x00, + 0x2b, 0x00, 0x00, + 0x2c, 0x00, 0x00, + 0x2d, 0x00, 0x00, + 0x2e, 0x00, 0x00, + 0x2f, 0x00, 0x00, + 0x40, 0x00, 0x00, + 0x48, 0x00, 0x00, + 0x50, 0x00, 0x00, + 0x56, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x14, 0x1c, 0x14, 0x0a, 0x17, 0x0d, 0x04, 0x00, 0x00, + 0x00, 0x1b, 0x0e, 0x0d, 0x13, 0x17, 0x12, 0x09, 0x00, 0x00, 0x16, 0x1b, + 0x13, 0x10, 0x19, 0x13, 0x0e, 0x07, 0x16, 0x1a, 0x1c, 0x14, 0x18, 0x13, + 0x0a, 0x10, 0x10, 0x04, 0x1d, 0x0a, 0x15, 0x13, 0x19, 0x11, 0x15, 0x15, + 0x18, 0x03, 0x12, 0x14, 0x19, 0x0e, 0x16, 0x11, 0x14, 0x17, 0x0e, 0x08, + 0x14, 0x0b, 0x18, 0x0c, 0x0a, 0x13, 0x0b, 0x14, 0x06, 0x01, 0x11, 0x10, + 0x0d, 0x0f, 0x13, 0x0a, 0x0a, 0x13, 0x07, 0x00, 0x0e, 0x10, 0x0f, 0x17, + 0x0b, 0x11, 0x09, 0x04, 0x02, 0x00, 0x07, 0x03, 0x05, 0x05, 0x05, 0x08, + 0x02, 0x00, 0x00, 0x00, +}; + +//***************************************************************************** +// +//! Draws a frame on the LCD with the application name in the title bar. +//! +//! \param psContext is a pointer to the graphics library context used to draw +//! the application frame. +//! \param pcAppName is a pointer to a string that contains the name of the +//! application. +//! +//! This function draws an application frame onto the LCD, using the supplied +//! graphics library context to access the LCD and the given name in the title +//! bar of the application frame. +//! +//! \return None. +// +//***************************************************************************** +void +FrameDraw(tContext *psContext, const char *pcAppName) +{ + tRectangle sRect; + + // + // See if the display is in a landscape or portrait configuration. + // + if(GrContextDpyWidthGet(psContext) == 320) + { + // + // Reset the clipping region to the entire LCD surface. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = 319; + sRect.i16YMax = 239; + GrContextClipRegionSet(psContext, &sRect); + + // + // Draw the images of the border. + // + GrImageDraw(psContext, g_pui8TopLeft, 0, 0); + GrImageDraw(psContext, g_pui8Top, 10, 0); + GrImageDraw(psContext, g_pui8TopRight, 310, 0); + GrImageDraw(psContext, g_pui8Left, 0, 26); + GrImageDraw(psContext, g_pui8Right, 314, 26); + GrImageDraw(psContext, g_pui8BottomLeft, 0, 230); + GrImageDraw(psContext, g_pui8Bottom, 10, 234); + GrImageDraw(psContext, g_pui8BottomRight, 310, 230); + + // + // Select red test in the Computer Modern sans-serif 18pt bold font. + // + GrContextForegroundSet(psContext, ClrWhite); + GrContextFontSet(psContext, g_psFontCmss18b); + + // + // Draw the application name centered in the title bar. + // + GrStringDrawCentered(psContext, pcAppName, -1, 160, 8, false); + + // + // Set the clip region to the interior region of the border. + // + sRect.i16XMin = 8; + sRect.i16YMin = 24; + sRect.i16XMax = 311; + sRect.i16YMax = 231; + GrContextClipRegionSet(psContext, &sRect); + } + else + { + // + // Reset the clipping region to the entire LCD surface. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = 239; + sRect.i16YMax = 319; + GrContextClipRegionSet(psContext, &sRect); + + // + // Draw the images of the border. + // + GrImageDraw(psContext, g_pui8TopLeft, 0, 0); + GrImageDraw(psContext, g_pui8Top, 10, 0); + GrImageDraw(psContext, g_pui8TopRight, 230, 0); + GrImageDraw(psContext, g_pui8Left, 0, 26); + GrImageDraw(psContext, g_pui8Left, 0, 106); + GrImageDraw(psContext, g_pui8Right, 234, 26); + GrImageDraw(psContext, g_pui8Right, 234, 106); + GrImageDraw(psContext, g_pui8BottomLeft, 0, 310); + GrImageDraw(psContext, g_pui8Bottom, 10, 314); + GrImageDraw(psContext, g_pui8BottomRight, 230, 310); + + // + // Select red test in the Computer Modern sans-serif 18pt bold font. + // + GrContextForegroundSet(psContext, ClrWhite); + GrContextFontSet(psContext, g_psFontCmss18b); + + // + // Draw the application name centered in the title bar. + // + GrStringDrawCentered(psContext, pcAppName, -1, 120, 8, false); + + // + // Set the clip region to the interior region of the border. + // + sRect.i16XMin = 8; + sRect.i16YMin = 24; + sRect.i16XMax = 231; + sRect.i16YMax = 311; + GrContextClipRegionSet(psContext, &sRect); + } +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c129x/drivers/frame.h b/boards/dk-tm4c129x/drivers/frame.h new file mode 100644 index 0000000..09461db --- /dev/null +++ b/boards/dk-tm4c129x/drivers/frame.h @@ -0,0 +1,55 @@ +//***************************************************************************** +// +// frame.h - Prototypes for the application frame function. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __DRIVERS_FRAME_H__ +#define __DRIVERS_FRAME_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void FrameDraw(tContext *psContext, const char *pcAppName); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __DRIVERS_FRAME_H__ diff --git a/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c b/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c new file mode 100644 index 0000000..7fac8df --- /dev/null +++ b/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c @@ -0,0 +1,1056 @@ +//***************************************************************************** +// +// kentec320x240x16_ssd2119.c - Display driver for the Kentec K350QVG-V2-F +// TFT display attached to the LCD controller via +// an 8-bit LIDD interface. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_gpio.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_sysctl.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" +#include "driverlib/rom.h" +#include "driverlib/lcd.h" +#include "grlib/grlib.h" +#include "drivers/kentec320x240x16_ssd2119.h" + +//***************************************************************************** +// +//! \addtogroup kentec320x240x16_ssd2119_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// This driver operates in four different screen orientations. They are: +// +// * Portrait - The screen is taller than it is wide, and the flex connector is +// on the left of the display. This is selected by defining +// PORTRAIT. +// +// * Landscape - The screen is wider than it is tall, and the flex connector is +// on the bottom of the display. This is selected by defining +// LANDSCAPE. +// +// * Portrait flip - The screen is taller than it is wide, and the flex +// connector is on the right of the display. This is +// selected by defining PORTRAIT_FLIP. +// +// * Landscape flip - The screen is wider than it is tall, and the flex +// connector is on the top of the display. This is +// selected by defining LANDSCAPE_FLIP. +// +// These can also be imagined in terms of screen rotation; if portrait mode is +// 0 degrees of screen rotation, landscape is 90 degrees of counter-clockwise +// rotation, portrait flip is 180 degrees of rotation, and landscape flip is +// 270 degress of counter-clockwise rotation. +// +// If no screen orientation is selected, landscape mode will be used. +// +//***************************************************************************** +#if ! defined(PORTRAIT) && ! defined(PORTRAIT_FLIP) && \ + ! defined(LANDSCAPE) && ! defined(LANDSCAPE_FLIP) +#define LANDSCAPE_FLIP +#endif + +//***************************************************************************** +// +// Various definitions controlling coordinate space mapping and drawing +// direction in the four supported orientations. +// +//***************************************************************************** +#ifdef PORTRAIT +#define HORIZ_DIRECTION 0x28 +#define VERT_DIRECTION 0x20 +#define MAPPED_X(x, y) (319 - (y)) +#define MAPPED_Y(x, y) (x) +#endif +#ifdef LANDSCAPE +#define HORIZ_DIRECTION 0x00 +#define VERT_DIRECTION 0x08 +#define MAPPED_X(x, y) (319 - (x)) +#define MAPPED_Y(x, y) (239 - (y)) +#endif +#ifdef PORTRAIT_FLIP +#define HORIZ_DIRECTION 0x18 +#define VERT_DIRECTION 0x10 +#define MAPPED_X(x, y) (y) +#define MAPPED_Y(x, y) (239 - (x)) +#endif +#ifdef LANDSCAPE_FLIP +#define HORIZ_DIRECTION 0x30 +#define VERT_DIRECTION 0x38 +#define MAPPED_X(x, y) (x) +#define MAPPED_Y(x, y) (y) +#endif + +//***************************************************************************** +// +// Various internal SD2119 registers name labels +// +//***************************************************************************** +#define SSD2119_DEVICE_CODE_READ_REG \ + 0x00 +#define SSD2119_OSC_START_REG 0x00 +#define SSD2119_OUTPUT_CTRL_REG 0x01 +#define SSD2119_LCD_DRIVE_AC_CTRL_REG \ + 0x02 +#define SSD2119_PWR_CTRL_1_REG 0x03 +#define SSD2119_DISPLAY_CTRL_REG \ + 0x07 +#define SSD2119_FRAME_CYCLE_CTRL_REG \ + 0x0b +#define SSD2119_PWR_CTRL_2_REG 0x0c +#define SSD2119_PWR_CTRL_3_REG 0x0d +#define SSD2119_PWR_CTRL_4_REG 0x0e +#define SSD2119_GATE_SCAN_START_REG \ + 0x0f +#define SSD2119_SLEEP_MODE_1_REG \ + 0x10 +#define SSD2119_ENTRY_MODE_REG 0x11 +#define SSD2119_SLEEP_MODE_2_REG \ + 0x12 +#define SSD2119_GEN_IF_CTRL_REG 0x15 +#define SSD2119_PWR_CTRL_5_REG 0x1e +#define SSD2119_RAM_DATA_REG 0x22 +#define SSD2119_FRAME_FREQ_REG 0x25 +#define SSD2119_ANALOG_SET_REG 0x26 +#define SSD2119_VCOM_OTP_1_REG 0x28 +#define SSD2119_VCOM_OTP_2_REG 0x29 +#define SSD2119_GAMMA_CTRL_1_REG \ + 0x30 +#define SSD2119_GAMMA_CTRL_2_REG \ + 0x31 +#define SSD2119_GAMMA_CTRL_3_REG \ + 0x32 +#define SSD2119_GAMMA_CTRL_4_REG \ + 0x33 +#define SSD2119_GAMMA_CTRL_5_REG \ + 0x34 +#define SSD2119_GAMMA_CTRL_6_REG \ + 0x35 +#define SSD2119_GAMMA_CTRL_7_REG \ + 0x36 +#define SSD2119_GAMMA_CTRL_8_REG \ + 0x37 +#define SSD2119_GAMMA_CTRL_9_REG \ + 0x3a +#define SSD2119_GAMMA_CTRL_10_REG \ + 0x3b +#define SSD2119_V_RAM_POS_REG 0x44 +#define SSD2119_H_RAM_START_REG 0x45 +#define SSD2119_H_RAM_END_REG 0x46 +#define SSD2119_X_RAM_ADDR_REG 0x4e +#define SSD2119_Y_RAM_ADDR_REG 0x4f + +#define ENTRY_MODE_DEFAULT 0x6830 +#define MAKE_ENTRY_MODE(x) ((ENTRY_MODE_DEFAULT & 0xff00) | (x)) + +//***************************************************************************** +// +// Read Access Timing +// ------------------ +// +// Direction OOOIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOOOOOOOOOOOOO +// +// ~RD ----- -------------------------- +// \ / | +// ------------------ +// < Trdl >< Trdh > +// < Tcycle > +// < Tacc > +// /------------------| +// DATA ------------- ------------------ +// \------------------/ +// < Tdh > +// +// Delays < Trad >< Tdhd >< Trhd >< Trcd > +// +// This design keeps CS tied low so pulse width constraints relating to CS +// have been transfered to ~RD here. +// +// Tcycle Read Cycle Time 1000nS +// Tacc Data Access Time 100nS +// Trdl Read Data Low 500nS +// Trdh Read Data High 500nS +// Tdh Data Hold Time 100nS +// +// Trad (READ_DATA_ACCESS_DELAY) controls the delay between asserting ~RD and +// reading the data from the bus. +// Tdhd (READ_DATA_HOLD_DELAY) controls the delay after reading the data and +// before deasserting ~RD. +// Trhd (READ_HOLD_DELAY) controls the delay between deasserting ~RD and +// switching the data bus direction back to output. +// Trcd (READ_DATA_CYCLE_DELAY) controls the delay after switching the +// direction of the data bus. +// +//***************************************************************************** + +//***************************************************************************** +// +// The delay to impose after setting the state of the read/write line and +// before reading the data bus. This is expressed in terms of cycles of a +// tight loop whose body performs a single GPIO register access and needs to +// comply with the 500nS read cycle pulse width constraint. +// +//***************************************************************************** +#define READ_DATA_ACCESS_DELAY 5 + +//***************************************************************************** +// +// The delay to impose after reading the data and before resetting the state of +// the read/write line during a read operation. This is expressed in terms of +// cycles of a tight loop whose body performs a single GPIO register access and +// needs to comply with the 500nS read cycle pulse width constraint. +// +//***************************************************************************** +#define READ_DATA_HOLD_DELAY 5 + +//***************************************************************************** +// +// The delay to impose after deasserting ~RD and before setting the bus back to +// an output. This is expressed in terms of cycles of a tight loop whose body +// performs a single GPIO register access. +// +//***************************************************************************** +#define READ_HOLD_DELAY 5 + +//***************************************************************************** +// +// The delay to impose after completing a read cycle and before returning to +// the caller. This is expressed in terms of cycles of a tight loop whose body +// performs a single GPIO register access and needs to comply with the 1000nS +// read cycle pulse width constraint. +// +//***************************************************************************** +#define READ_DATA_CYCLE_DELAY 5 + +//***************************************************************************** +// +// The dimensions of the LCD panel. +// +//***************************************************************************** +#define LCD_HORIZONTAL_MAX 320 +#define LCD_VERTICAL_MAX 240 + +//***************************************************************************** +// +// Translates a 24-bit RGB color to a display driver-specific color. +// +// \param c is the 24-bit RGB color. The least-significant byte is the blue +// channel, the next byte is the green channel, and the third byte is the red +// channel. +// +// This macro translates a 24-bit RGB color into a value that can be written +// into the display's frame buffer in order to reproduce that color, or the +// closest possible approximation of that color. +// +// \return Returns the display-driver specific color. +// +//***************************************************************************** +#define DPYCOLORTRANSLATE(c) ((((c) & 0x00f80000) >> 8) | \ + (((c) & 0x0000fc00) >> 5) | \ + (((c) & 0x000000f8) >> 3)) + +//***************************************************************************** +// +// Writes a data word to the SSD2119. +// +//***************************************************************************** +static inline void +WriteData(uint16_t ui16Data) +{ + // + // Split the write into two bytes and pass them to the LCD controller. + // + LCDIDDDataWrite(LCD0_BASE, 0, ui16Data >> 8); + LCDIDDDataWrite(LCD0_BASE, 0, ui16Data & 0xff); +} + +//***************************************************************************** +// +// Writes a command to the SSD2119. +// +//***************************************************************************** +static inline void +WriteCommand(uint8_t ui8Data) +{ + // + // Pass the write on to the controller. + // + LCDIDDCommandWrite(LCD0_BASE, 0, (uint16_t)ui8Data); +} + +//***************************************************************************** +// +//! Draws a pixel on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X is the X coordinate of the pixel. +//! \param i32Y is the Y coordinate of the pixel. +//! \param ui32Value is the color of the pixel. +//! +//! This function sets the given pixel to a particular color. The coordinates +//! of the pixel are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Kentec320x240x16_SSD2119PixelDraw(void *pvDisplayData, int32_t i32X, + int32_t i32Y, uint32_t ui32Value) +{ + // + // Set the X address of the display cursor. + // + WriteCommand(SSD2119_X_RAM_ADDR_REG); + WriteData(MAPPED_X(i32X, i32Y)); + + // + // Set the Y address of the display cursor. + // + WriteCommand(SSD2119_Y_RAM_ADDR_REG); + WriteData(MAPPED_Y(i32X, i32Y)); + + // + // Write the pixel value. + // + WriteCommand(SSD2119_RAM_DATA_REG); + WriteData(ui32Value); +} + +//***************************************************************************** +// +//! Draws a horizontal sequence of pixels on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X is the X coordinate of the first pixel. +//! \param i32Y is the Y coordinate of the first pixel. +//! \param i32X0 is sub-pixel offset within the pixel data, which is valid for +//! 1 or 4 bit per pixel formats. +//! \param i32Count is the number of pixels to draw. +//! \param i32BPP is the number of bits per pixel; must be 1, 4, or 8. +//! \param pui8Data is a pointer to the pixel data. For 1 and 4 bit per pixel +//! formats, the most significant bit(s) represent the left-most pixel. +//! \param pui8Palette is a pointer to the palette used to draw the pixels. +//! +//! This function draws a horizontal sequence of pixels on the screen, using +//! the supplied palette. For 1 bit per pixel format, the palette contains +//! pre-translated colors; for 4 and 8 bit per pixel formats, the palette +//! contains 24-bit RGB values that must be translated before being written to +//! the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Kentec320x240x16_SSD2119PixelDrawMultiple(void *pvDisplayData, int32_t i32X, + int32_t i32Y, int32_t i32X0, + int32_t i32Count, int32_t i32BPP, + const uint8_t *pui8Data, + const uint8_t *pui8Palette) +{ + uint32_t ui32Byte; + + // + // Set the cursor increment to left to right, followed by top to bottom. + // + WriteCommand(SSD2119_ENTRY_MODE_REG); + WriteData(MAKE_ENTRY_MODE(HORIZ_DIRECTION)); + + // + // Set the starting X address of the display cursor. + // + WriteCommand(SSD2119_X_RAM_ADDR_REG); + WriteData(MAPPED_X(i32X, i32Y)); + + // + // Set the Y address of the display cursor. + // + WriteCommand(SSD2119_Y_RAM_ADDR_REG); + WriteData(MAPPED_Y(i32X, i32Y)); + + // + // Write the data RAM write command. + // + WriteCommand(SSD2119_RAM_DATA_REG); + + // + // Determine how to interpret the pixel data based on the number of bits + // per pixel. + // + switch(i32BPP & ~GRLIB_DRIVER_FLAG_NEW_IMAGE) + { + // + // The pixel data is in 1 bit per pixel format. + // + case 1: + { + // + // Loop while there are more pixels to draw. + // + while(i32Count) + { + // + // Get the next byte of image data. + // + ui32Byte = *pui8Data++; + + // + // Loop through the pixels in this byte of image data. + // + for(; (i32X0 < 8) && i32Count; i32X0++, i32Count--) + { + // + // Draw this pixel in the appropriate color. + // + WriteData(((uint32_t *)pui8Palette)[(ui32Byte >> + (7 - i32X0)) & 1]); + } + + // + // Start at the beginning of the next byte of image data. + // + i32X0 = 0; + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 4 bit per pixel format. + // + case 4: + { + // + // Loop while there are more pixels to draw. "Duff's device" is + // used to jump into the middle of the loop if the first nibble of + // the pixel data should not be used. Duff's device makes use of + // the fact that a case statement is legal anywhere within a + // sub-block of a switch statement. See + // http://en.wikipedia.org/wiki/Duff's_device for detailed + // information about Duff's device. + // + switch(i32X0 & 1) + { + case 0: + while(i32Count) + { + // + // Get the upper nibble of the next byte of pixel data + // and extract the corresponding entry from the + // palette. + // + ui32Byte = (*pui8Data >> 4) * 3; + ui32Byte = (*(uint32_t *)(pui8Palette + ui32Byte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + WriteData(DPYCOLORTRANSLATE(ui32Byte)); + + // + // Decrement the count of pixels to draw. + // + i32Count--; + + // + // See if there is another pixel to draw. + // + if(i32Count) + { + case 1: + // + // Get the lower nibble of the next byte of pixel + // data and extract the corresponding entry from + // the palette. + // + ui32Byte = (*pui8Data++ & 15) * 3; + ui32Byte = (*(uint32_t *)(pui8Palette + ui32Byte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + WriteData(DPYCOLORTRANSLATE(ui32Byte)); + + // + // Decrement the count of pixels to draw. + // + i32Count--; + } + } + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 8 bit per pixel format. + // + case 8: + { + // + // Loop while there are more pixels to draw. + // + while(i32Count--) + { + // + // Get the next byte of pixel data and extract the + // corresponding entry from the palette. + // + ui32Byte = *pui8Data++ * 3; + ui32Byte = *(uint32_t *)(pui8Palette + ui32Byte) & 0x00ffffff; + + // + // Translate this palette entry and write it to the screen. + // + WriteData(DPYCOLORTRANSLATE(ui32Byte)); + } + + // + // The image data has been drawn. + // + break; + } + } +} + +//***************************************************************************** +// +//! Draws a horizontal line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X1 is the X coordinate of the start of the line. +//! \param i32X2 is the X coordinate of the end of the line. +//! \param i32Y is the Y coordinate of the line. +//! \param ui32Value is the color of the line. +//! +//! This function draws a horizontal line on the display. The coordinates of +//! the line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Kentec320x240x16_SSD2119LineDrawH(void *pvDisplayData, int32_t i32X1, + int32_t i32X2, int32_t i32Y, + uint32_t ui32Value) +{ + // + // Set the cursor increment to left to right, followed by top to bottom. + // + WriteCommand(SSD2119_ENTRY_MODE_REG); + WriteData(MAKE_ENTRY_MODE(HORIZ_DIRECTION)); + + // + // Set the starting X address of the display cursor. + // + WriteCommand(SSD2119_X_RAM_ADDR_REG); + WriteData(MAPPED_X(i32X1, i32Y)); + + // + // Set the Y address of the display cursor. + // + WriteCommand(SSD2119_Y_RAM_ADDR_REG); + WriteData(MAPPED_Y(i32X1, i32Y)); + + // + // Write the data RAM write command. + // + WriteCommand(SSD2119_RAM_DATA_REG); + + // + // Loop through the pixels of this horizontal line. + // + while(i32X1++ <= i32X2) + { + // + // Write the pixel value. + // + WriteData(ui32Value); + } +} + +//***************************************************************************** +// +//! Draws a vertical line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X is the X coordinate of the line. +//! \param i32Y1 is the Y coordinate of the start of the line. +//! \param i32Y2 is the Y coordinate of the end of the line. +//! \param ui32Value is the color of the line. +//! +//! This function draws a vertical line on the display. The coordinates of the +//! line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Kentec320x240x16_SSD2119LineDrawV(void *pvDisplayData, int32_t i32X, + int32_t i32Y1, int32_t i32Y2, + uint32_t ui32Value) +{ + // + // Set the cursor increment to top to bottom, followed by left to right. + // + WriteCommand(SSD2119_ENTRY_MODE_REG); + WriteData(MAKE_ENTRY_MODE(VERT_DIRECTION)); + + // + // Set the X address of the display cursor. + // + WriteCommand(SSD2119_X_RAM_ADDR_REG); + WriteData(MAPPED_X(i32X, i32Y1)); + + // + // Set the starting Y address of the display cursor. + // + WriteCommand(SSD2119_Y_RAM_ADDR_REG); + WriteData(MAPPED_Y(i32X, i32Y1)); + + // + // Write the data RAM write command. + // + WriteCommand(SSD2119_RAM_DATA_REG); + + // + // Loop through the pixels of this vertical line. + // + while(i32Y1++ <= i32Y2) + { + // + // Write the pixel value. + // + WriteData(ui32Value); + } +} + +//***************************************************************************** +// +//! Fills a rectangle. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param psRect is a pointer to the structure describing the rectangle. +//! \param ui32Value is the color of the rectangle. +//! +//! This function fills a rectangle on the display. The coordinates of the +//! rectangle are assumed to be within the extents of the display, and the +//! rectangle specification is fully inclusive (in other words, both i16XMin +//! and i16XMax are drawn, along with i16YMin and i16YMax). +//! +//! \return None. +// +//***************************************************************************** +static void +Kentec320x240x16_SSD2119RectFill(void *pvDisplayData, const tRectangle *psRect, + uint32_t ui32Value) +{ + int32_t i32Count; + + // + // Write the Y extents of the rectangle. + // + WriteCommand(SSD2119_ENTRY_MODE_REG); + WriteData(MAKE_ENTRY_MODE(HORIZ_DIRECTION)); + + // + // Write the X extents of the rectangle. + // + WriteCommand(SSD2119_H_RAM_START_REG); +#if (defined PORTRAIT) || (defined LANDSCAPE) + WriteData(MAPPED_X(psRect->i16XMax, psRect->i16YMax)); +#else + WriteData(MAPPED_X(psRect->i16XMin, psRect->i16YMin)); +#endif + + WriteCommand(SSD2119_H_RAM_END_REG); +#if (defined PORTRAIT) || (defined LANDSCAPE) + WriteData(MAPPED_X(psRect->i16XMin, psRect->i16YMin)); +#else + WriteData(MAPPED_X(psRect->i16XMax, psRect->i16YMax)); +#endif + + // + // Write the Y extents of the rectangle + // + WriteCommand(SSD2119_V_RAM_POS_REG); +#if (defined LANDSCAPE_FLIP) || (defined PORTRAIT) + WriteData(MAPPED_Y(psRect->i16XMin, psRect->i16YMin) | + (MAPPED_Y(psRect->i16XMax, psRect->i16YMax) << 8)); +#else + WriteData(MAPPED_Y(psRect->i16XMax, psRect->i16YMax) | + (MAPPED_Y(psRect->i16XMin, psRect->i16YMin) << 8)); +#endif + + // + // Set the display cursor to the upper left of the rectangle (in + // application coordinate space). + // + WriteCommand(SSD2119_X_RAM_ADDR_REG); + WriteData(MAPPED_X(psRect->i16XMin, psRect->i16YMin)); + WriteCommand(SSD2119_Y_RAM_ADDR_REG); + WriteData(MAPPED_Y(psRect->i16XMin, psRect->i16YMin)); + + // + // Tell the controller to write data into its RAM. + // + WriteCommand(SSD2119_RAM_DATA_REG); + + // + // Loop through the pixels of this filled rectangle. + // + for(i32Count = ((psRect->i16XMax - psRect->i16XMin + 1) * + (psRect->i16YMax - psRect->i16YMin + 1)); i32Count >= 0; + i32Count--) + { + // + // Write the pixel value. + // + WriteData(ui32Value); + } + + // + // Reset the X extents to the entire screen. + // + WriteCommand(SSD2119_H_RAM_START_REG); + WriteData(0x0000); + WriteCommand(SSD2119_H_RAM_END_REG); + WriteData(0x013f); + + // + // Reset the Y extent to the full screen + // + WriteCommand(SSD2119_V_RAM_POS_REG); + WriteData(0xef00); +} + +//***************************************************************************** +// +//! Translates a 24-bit RGB color to a display driver-specific color. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param ui32Value is the 24-bit RGB color. The least-significant byte is +//! the blue channel, the next byte is the green channel, and the third byte is +//! the red channel. +//! +//! This function translates a 24-bit RGB color into a value that can be +//! written into the display's frame buffer in order to reproduce that color, +//! or the closest possible approximation of that color. +//! +//! \return Returns the display-driver specific color. +// +//***************************************************************************** +static uint32_t +Kentec320x240x16_SSD2119ColorTranslate(void *pvDisplayData, uint32_t ui32Value) +{ + // + // Translate from a 24-bit RGB color to a 5-6-5 RGB color. + // + return(DPYCOLORTRANSLATE(ui32Value)); +} + +//***************************************************************************** +// +//! Flushes any cached drawing operations. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! +//! This functions flushes any cached drawing operations to the display. This +//! is useful when a local frame buffer is used for drawing operations, and the +//! flush would copy the local frame buffer to the display. For the SSD2119 +//! driver, the flush is a no operation. +//! +//! \return None. +// +//***************************************************************************** +static void +Kentec320x240x16_SSD2119Flush(void *pvDisplayData) +{ + // + // There is nothing to be done. + // +} + +//***************************************************************************** +// +//! The display structure that describes the driver for the Kentec K350QVG-V2-F +//! TFT panel with an SSD2119 controller. +// +//***************************************************************************** +const tDisplay g_sKentec320x240x16_SSD2119 = +{ + sizeof(tDisplay), + 0, +#if defined(PORTRAIT) || defined(PORTRAIT_FLIP) + 240, + 320, +#else + 320, + 240, +#endif + Kentec320x240x16_SSD2119PixelDraw, + Kentec320x240x16_SSD2119PixelDrawMultiple, + Kentec320x240x16_SSD2119LineDrawH, + Kentec320x240x16_SSD2119LineDrawV, + Kentec320x240x16_SSD2119RectFill, + Kentec320x240x16_SSD2119ColorTranslate, + Kentec320x240x16_SSD2119Flush +}; + +//***************************************************************************** +// +//! Initializes the display driver. +//! +//! \param ui32SysClock is the frequency of the system clock. +//! +//! This function initializes the LCD controller and the SSD2119 display +//! controller on the panel, preparing it to display data. +//! +//! \return None. +// +//***************************************************************************** +void +Kentec320x240x16_SSD2119Init(uint32_t ui32SysClock) +{ + uint32_t ui32ClockMS, ui32Count; + tLCDIDDTiming sTimings; + + // + // Determine the number of system clock cycles in 1mS + // + ui32ClockMS = CYCLES_FROM_TIME_US(ui32SysClock, 1000); + + // + // Divide by 3 to get the number of SysCtlDelay loops in 1mS. + // + ui32ClockMS /= 3; + + // + // Enable the LCD controller. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_LCD0); + + // + // Assert the LCD reset signal. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_6, 0); + + // + // Delay for 50ms. + // + SysCtlDelay(50 * ui32ClockMS); + + // + // Deassert the LCD reset signal. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_6, GPIO_PIN_6); + + // + // Delay for 50ms while the LCD comes out of reset. + // + SysCtlDelay(50 * ui32ClockMS); + + // + // Configure the LCD controller for LIDD-mode operation. + // + LCDModeSet(LCD0_BASE, LCD_MODE_LIDD, ui32SysClock, ui32SysClock); + + // + // Configure DMA-related parameters. + // + LCDDMAConfigSet(LCD0_BASE, LCD_DMA_BURST_4); + + // + // Set control signal parameters and polarities. + // + LCDIDDConfigSet(LCD0_BASE, LIDD_CONFIG_ASYNC_MPU80); + + // + // Set the LIDD interface timings for the Kentec display. Note that the + // inter-transaction delay is set at at 50nS to match the write case. + // Software needs to ensure that it delays at least 450nS more between each + // read or the read timings will be violated. + // + sTimings.ui8WSSetup = CYCLES_FROM_TIME_NS(ui32SysClock, 5); + sTimings.ui8WSDuration = CYCLES_FROM_TIME_NS(ui32SysClock, 40); + sTimings.ui8WSHold = CYCLES_FROM_TIME_NS(ui32SysClock, 5); + sTimings.ui8RSSetup = CYCLES_FROM_TIME_NS(ui32SysClock, 0); + sTimings.ui8RSDuration = CYCLES_FROM_TIME_NS(ui32SysClock, 500); + sTimings.ui8RSHold = CYCLES_FROM_TIME_NS(ui32SysClock, 100); + sTimings.ui8DelayCycles = CYCLES_FROM_TIME_NS(ui32SysClock, 50); + LCDIDDTimingSet(LCD0_BASE, 0, &sTimings); + + // + // Enter sleep mode (if not already there). + // + WriteCommand(SSD2119_SLEEP_MODE_1_REG); + WriteData(0x0001); + + // + // Set initial power parameters. + // + WriteCommand(SSD2119_PWR_CTRL_5_REG); + WriteData(0x00b2); + WriteCommand(SSD2119_VCOM_OTP_1_REG); + WriteData(0x0006); + + // + // Start the oscillator. + // + WriteCommand(SSD2119_OSC_START_REG); + WriteData(0x0001); + + // + // Set pixel format and basic display orientation (scanning direction). + // + WriteCommand(SSD2119_OUTPUT_CTRL_REG); + WriteData(0x30ef); + WriteCommand(SSD2119_LCD_DRIVE_AC_CTRL_REG); + WriteData(0x0600); + + // + // Exit sleep mode. + // + WriteCommand(SSD2119_SLEEP_MODE_1_REG); + WriteData(0x0000); + + // + // Delay 30mS + // + SysCtlDelay(30 * ui32ClockMS); + + // + // Configure pixel color format and MCU interface parameters. + // + WriteCommand(SSD2119_ENTRY_MODE_REG); + WriteData(ENTRY_MODE_DEFAULT); + + // + // Set analog parameters. + // + WriteCommand(SSD2119_SLEEP_MODE_2_REG); + WriteData(0x0999); + WriteCommand(SSD2119_ANALOG_SET_REG); + WriteData(0x3800); + + // + // Enable the display. + // + WriteCommand(SSD2119_DISPLAY_CTRL_REG); + WriteData(0x0033); + + // + // Set VCIX2 voltage to 6.1V. + // + WriteCommand(SSD2119_PWR_CTRL_2_REG); + WriteData(0x0005); + + // + // Configure gamma correction. + // + WriteCommand(SSD2119_GAMMA_CTRL_1_REG); + WriteData(0x0000); + WriteCommand(SSD2119_GAMMA_CTRL_2_REG); + WriteData(0x0303); + WriteCommand(SSD2119_GAMMA_CTRL_3_REG); + WriteData(0x0407); + WriteCommand(SSD2119_GAMMA_CTRL_4_REG); + WriteData(0x0301); + WriteCommand(SSD2119_GAMMA_CTRL_5_REG); + WriteData(0x0301); + WriteCommand(SSD2119_GAMMA_CTRL_6_REG); + WriteData(0x0403); + WriteCommand(SSD2119_GAMMA_CTRL_7_REG); + WriteData(0x0707); + WriteCommand(SSD2119_GAMMA_CTRL_8_REG); + WriteData(0x0400); + WriteCommand(SSD2119_GAMMA_CTRL_9_REG); + WriteData(0x0a00); + WriteCommand(SSD2119_GAMMA_CTRL_10_REG); + WriteData(0x1000); + + // + // Configure Vlcd63 and VCOMl. + // + WriteCommand(SSD2119_PWR_CTRL_3_REG); + WriteData(0x000a); + WriteCommand(SSD2119_PWR_CTRL_4_REG); + WriteData(0x2e00); + + // + // Set the display size and ensure that the GRAM window is set to allow + // access to the full display buffer. + // + WriteCommand(SSD2119_V_RAM_POS_REG); + WriteData((LCD_VERTICAL_MAX-1) << 8); + WriteCommand(SSD2119_H_RAM_START_REG); + WriteData(0x0000); + WriteCommand(SSD2119_H_RAM_END_REG); + WriteData(LCD_HORIZONTAL_MAX-1); + WriteCommand(SSD2119_X_RAM_ADDR_REG); + WriteData(0x0000); + WriteCommand(SSD2119_Y_RAM_ADDR_REG); + WriteData(0x0000); + + // + // Clear the contents of the display buffer. + // + WriteCommand(SSD2119_RAM_DATA_REG); + for(ui32Count = 0; ui32Count < (320 * 240); ui32Count++) + { + WriteData(0x0000); + } +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.h b/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.h new file mode 100644 index 0000000..fa3fd02 --- /dev/null +++ b/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.h @@ -0,0 +1,58 @@ +//***************************************************************************** +// +// kentec320x240x16_ssd2119.h - Prototypes for the display driver for the +// Kentec K350QVG-V2-F TFT display attached to the +// LCD controller via an 8-bit LIDD interface. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __DRIVERS_KENTEC320X240X16_SSD2119_H__ +#define __DRIVERS_KENTEC320X240X16_SSD2119_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern const tDisplay g_sKentec320x240x16_SSD2119; +extern void Kentec320x240x16_SSD2119Init(uint32_t ui32SysClock); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __DRIVERS_KENTEC320X240X16_SSD2119_H__ diff --git a/boards/dk-tm4c129x/drivers/mx66l51235f.c b/boards/dk-tm4c129x/drivers/mx66l51235f.c new file mode 100644 index 0000000..084ee1d --- /dev/null +++ b/boards/dk-tm4c129x/drivers/mx66l51235f.c @@ -0,0 +1,534 @@ +//***************************************************************************** +// +// mx66l51235f.c - Driver for the on-board SPI flash. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/ssi.h" +#include "utils/spi_flash.h" + +//***************************************************************************** +// +//! \addtogroup mx66l51235f_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// The current value of the extended address register. This is tracked so that +// it is only updated via SPI when it needs to be changed. +// +//***************************************************************************** +static uint32_t g_ui32MX66L51235FAddr; + +//***************************************************************************** +// +//! Initializes the MX66L51235F driver. +//! +//! \param ui32SysClock is the frequency of the system clock. +//! +//! This function initializes the MX66L51235F driver and SSI interface, +//! preparing for accesses to the SPI flash device. Since the SSI interface +//! on the DK-TM4C129X board is shared with the SD card, this must be called +//! prior to any SPI flash access the immediately follows an SD card access. +//! +//! \return None. +// +//***************************************************************************** +void +MX66L51235FInit(uint32_t ui32SysClock) +{ + uint32_t ui32SPIClock; + + // + // Set the SPI clock to the minimum of one quarter of system clock and + // 12.5 MHz. The SPI module can run at up to one quarter of system clock + // and the SD card, if inserted, might cause interference on the SPI bus + // (even though it is not selected) if the SPI clock exceeds 12.5 MHz. + // + ui32SPIClock = ui32SysClock / 4; + if(ui32SPIClock > 12500000) + { + ui32SPIClock = 12500000; + } + + // + // Configure the SPI flash driver on SSI3. + // + ROM_SPIFlashInit(SSI3_BASE, ui32SysClock, ui32SPIClock); + + // + // Set the current value of the extended address register to -1, causing it + // to be written on the first access. + // + g_ui32MX66L51235FAddr = 0xffffffff; +} + +//***************************************************************************** +// +// Enable program/erase of the MX66L51235F. +// +//***************************************************************************** +static void +MX66L51235FWriteEnable(void) +{ + // + // Assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, 0); + + // + // Enable programming/erasing of the MX66L51235F. + // + ROM_SPIFlashWriteEnable(SSI3_BASE); + + // + // Wait until the command has been completely transmitted. + // + while(ROM_SSIBusy(SSI3_BASE)) + { + } + + // + // De-assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, GPIO_PIN_1); +} + +//***************************************************************************** +// +// Waits until a program/erase operation has completed. +// +//***************************************************************************** +static void +MX66L51235FWait(void) +{ + uint8_t ui8Status; + + // + // Loop until the requested operation has completed. + // + do + { + // + // Assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, 0); + + // + // Read the status register. + // + ui8Status = ROM_SPIFlashReadStatus(SSI3_BASE); + + // + // De-assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, GPIO_PIN_1); + } + while(ui8Status & 1); +} + +//***************************************************************************** +// +// Writes the extended address register, allowing the full contents of the +// MX66L51235F to be accessed. +// +//***************************************************************************** +static void +MX66L51235FWriteEAR(uint32_t ui32Addr) +{ + // + // See if the extended address register needs to be written. + // + if((ui32Addr & 0xff000000) == (g_ui32MX66L51235FAddr & 0xff000000)) + { + // + // The extended address register does not need to be changed, so return + // without doing anything. + // + return; + } + + // + // Save the new value of the extended address register. + // + g_ui32MX66L51235FAddr = ui32Addr; + + // + // Enable program/erase of the SPI flash. + // + MX66L51235FWriteEnable(); + + // + // Assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, 0); + + // + // Set the SSI module into write-only mode. + // + ROM_SSIAdvModeSet(SSI3_BASE, SSI_ADV_MODE_WRITE); + + // + // Send the sector erase command. + // + ROM_SSIDataPut(SSI3_BASE, 0xc5); + + // + // Send the address of the sector to be erased, marking the last byte of + // the address as the end of the frame. + // + ROM_SSIAdvDataPutFrameEnd(SSI3_BASE, (ui32Addr >> 24) & 0xff); + + // + // Wait until the command has been completely transmitted. + // + while(ROM_SSIBusy(SSI3_BASE)) + { + } + + // + // De-assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, GPIO_PIN_1); +} + +//***************************************************************************** +// +//! Erases a 4 KB sector of the MX66L51235F. +//! +//! \param ui32Addr is the address of the sector to erase. +//! +//! This function erases a sector of the MX66L51235F. Each sector is 4 KB with +//! a 4 KB alignment; the MX66L51235F will ignore the lower ten bits of the +//! address provided. This function will not return until the data has be +//! erased. +//! +//! \return None. +// +//***************************************************************************** +void +MX66L51235FSectorErase(uint32_t ui32Addr) +{ + // + // Write the extended address register. + // + MX66L51235FWriteEAR(ui32Addr); + + // + // Enable program/erase of the SPI flash. + // + MX66L51235FWriteEnable(); + + // + // Assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, 0); + + // + // Erase the requested sector. + // + ROM_SPIFlashSectorErase(SSI3_BASE, ui32Addr); + + // + // Wait until the command has been completely transmitted. + // + while(ROM_SSIBusy(SSI3_BASE)) + { + } + + // + // De-assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, GPIO_PIN_1); + + // + // Wait for the erase operation to complete. + // + MX66L51235FWait(); +} + +//***************************************************************************** +// +//! Erases a 32 KB block of the MX66L51235F. +//! +//! \param ui32Addr is the address of the block to erase. +//! +//! This function erases a 32 KB block of the MX66L51235F. Each 32 KB block +//! has a 32 KB alignment; the MX66L51235F will ignore the lower 15 bits of the +//! address provided. This function will not return until the data has be +//! erased. +//! +//! \return None. +// +//***************************************************************************** +void +MX66L51235FBlockErase32(uint32_t ui32Addr) +{ + // + // Write the extended address register. + // + MX66L51235FWriteEAR(ui32Addr); + + // + // Enable program/erase of the SPI flash. + // + MX66L51235FWriteEnable(); + + // + // Assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, 0); + + // + // Erase the requested block. + // + ROM_SPIFlashBlockErase32(SSI3_BASE, ui32Addr); + + // + // Wait until the command has been completely transmitted. + // + while(ROM_SSIBusy(SSI3_BASE)) + { + } + + // + // De-assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, GPIO_PIN_1); + + // + // Wait for the erase operation to complete. + // + MX66L51235FWait(); +} + +//***************************************************************************** +// +//! Erases a 64 KB block of the MX66L51235F. +//! +//! \param ui32Addr is the address of the block to erase. +//! +//! This function erases a 64 KB block of the MX66L51235F. Each 64 KB block +//! has a 64 KB alignment; the MX66L51235F will ignore the lower 16 bits of the +//! address provided. This function will not return until the data has be +//! erased. +//! +//! \return None. +// +//***************************************************************************** +void +MX66L51235FBlockErase64(uint32_t ui32Addr) +{ + // + // Write the extended address register. + // + MX66L51235FWriteEAR(ui32Addr); + + // + // Enable program/erase of the SPI flash. + // + MX66L51235FWriteEnable(); + + // + // Assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, 0); + + // + // Erase the requested block. + // + ROM_SPIFlashBlockErase64(SSI3_BASE, ui32Addr); + + // + // Wait until the command has been completely transmitted. + // + while(ROM_SSIBusy(SSI3_BASE)) + { + } + + // + // De-assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, GPIO_PIN_1); + + // + // Wait for the erase operation to complete. + // + MX66L51235FWait(); +} + +//***************************************************************************** +// +//! Erases the entire MX66L51235F. +//! +//! This command erase the entire contents of the MX66L51235F. This takes two +//! minutes, nominally, to complete. This function will not return until the +//! data has be erased. +//! +//! \return None. +// +//***************************************************************************** +void +MX66L51235FChipErase(void) +{ + // + // Enable program/erase of the SPI flash. + // + MX66L51235FWriteEnable(); + + // + // Assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, 0); + + // + // Erase the entire device. + // + ROM_SPIFlashChipErase(SSI3_BASE); + + // + // Wait until the command has been completely transmitted. + // + while(ROM_SSIBusy(SSI3_BASE)) + { + } + + // + // De-assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, GPIO_PIN_1); + + // + // Wait for the erase operation to complete. + // + MX66L51235FWait(); +} + +//***************************************************************************** +// +//! Programs the MX66L51235F. +//! +//! \param ui32Addr is the address to be programmed. +//! \param pui8Data is a pointer to the data to be programmed. +//! \param ui32Count is the number of bytes to be programmed. +//! +//! This function programs data into the MX66L51235F. This function will not +//! return until the data has be programmed. The addresses to be programmed +//! must not span a 256-byte boundary (in other words, ``\e ui32Addr & ~255'' +//! must be the same as ``(\e ui32Addr + \e ui32Count) & ~255''). +//! +//! \return None. +// +//***************************************************************************** +void +MX66L51235FPageProgram(uint32_t ui32Addr, const uint8_t *pui8Data, + uint32_t ui32Count) +{ + // + // Write the extended address register. + // + MX66L51235FWriteEAR(ui32Addr); + + // + // Enable program/erase of the SPI flash. + // + MX66L51235FWriteEnable(); + + // + // Assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, 0); + + // + // Program the requested data. + // + ROM_SPIFlashPageProgram(SSI3_BASE, ui32Addr, pui8Data, ui32Count); + + // + // Wait until the command has been completely transmitted. + // + while(ROM_SSIBusy(SSI3_BASE)) + { + } + + // + // De-assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, GPIO_PIN_1); + + // + // Wait for the page program operation to complete. + // + MX66L51235FWait(); +} + +//***************************************************************************** +// +//! Reads data from the MX66L51235F. +//! +//! \param ui32Addr is the address to read. +//! \param pui8Data is a pointer to the data buffer to into which to read the +//! data. +//! \param ui32Count is the number of bytes to read. +//! +//! This function reads data from the MX66L51235F. +//! +//! \return None. +// +//***************************************************************************** +void +MX66L51235FRead(uint32_t ui32Addr, uint8_t *pui8Data, uint32_t ui32Count) +{ + // + // Write the extended address register. + // + MX66L51235FWriteEAR(ui32Addr); + + // + // Assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, 0); + + // + // Read the requested data. + // + ROM_SPIFlashRead(SSI3_BASE, ui32Addr, pui8Data, ui32Count); + + // + // De-assert the chip select to the MX66L51235F. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, GPIO_PIN_1); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c129x/drivers/mx66l51235f.h b/boards/dk-tm4c129x/drivers/mx66l51235f.h new file mode 100644 index 0000000..fe18d3d --- /dev/null +++ b/boards/dk-tm4c129x/drivers/mx66l51235f.h @@ -0,0 +1,71 @@ +//***************************************************************************** +// +// mx66l51235f.h - Prototypes for the MX66L51235F driver. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __DRIVERS_MX66L51235F_H__ +#define __DRIVERS_MX66L51235F_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The memory size and block size in bytes. +// +//***************************************************************************** +#define MX66L51235F_MEMORY_SIZE 0x04000000 +#define MX66L51235F_BLOCK_SIZE 0x1000 + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void MX66L51235FInit(uint32_t ui32SysClock); +extern void MX66L51235FSectorErase(uint32_t ui32Addr); +extern void MX66L51235FBlockErase32(uint32_t ui32Addr); +extern void MX66L51235FBlockErase64(uint32_t ui32Addr); +extern void MX66L51235FChipErase(void); +extern void MX66L51235FPageProgram(uint32_t ui32Addr, const uint8_t *pui8Data, + uint32_t ui32Count); +extern void MX66L51235FRead(uint32_t ui32Addr, uint8_t *pui8Data, + uint32_t ui32Count); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __DRIVERS_MX66L51235F_H__ diff --git a/boards/dk-tm4c129x/drivers/pinout.c b/boards/dk-tm4c129x/drivers/pinout.c new file mode 100644 index 0000000..12a4ddc --- /dev/null +++ b/boards/dk-tm4c129x/drivers/pinout.c @@ -0,0 +1,282 @@ +//***************************************************************************** +// +// pinout.c - Function to configure the device pins on the DK-TM4C129X. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_gpio.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup pinout_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +//! Configures the device pins for the standard usages on the DK-TM4C129X. +//! +//! This function enables the GPIO modules and configures the device pins for +//! the default, standard usages on the DK-TM4C129X. Applications that require +//! alternate configurations of the device pins can either not call this +//! function and take full responsibility for configuring all the device pins, +//! or can reconfigure the required device pins after calling this function. +//! +//! \return None. +// +//***************************************************************************** +void +PinoutSet(void) +{ + // + // Enable all the GPIO peripherals. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOR); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOS); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOT); + + // + // PA0-1 are used for UART0. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // PA2-5 are used for SSI0 to the second booster pack. + // + ROM_GPIOPinConfigure(GPIO_PA2_SSI0CLK); + ROM_GPIOPinConfigure(GPIO_PA3_SSI0FSS); + ROM_GPIOPinConfigure(GPIO_PA4_SSI0XDAT0); + ROM_GPIOPinConfigure(GPIO_PA5_SSI0XDAT1); + + // + // PB0-1/PD6-7/PL6-7 are used for USB. + // + HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTD_BASE + GPIO_O_CR) = 0xff; + ROM_GPIOPinConfigure(GPIO_PD6_USB0EPEN); + ROM_GPIOPinConfigure(GPIO_PD7_USB0PFLT); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + + // + // PB2/PD4 are used for the speaker output. + // + ROM_GPIOPinConfigure(GPIO_PB2_T5CCP0); + ROM_GPIOPinTypeTimer(GPIO_PORTB_BASE, GPIO_PIN_2); + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_4); + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_4, 0); + + // + // PB6-7 are used for I2C to the TMP100 and the EM connector. + // + ROM_GPIOPinConfigure(GPIO_PB6_I2C6SCL); + ROM_GPIOPinConfigure(GPIO_PB7_I2C6SDA); + ROM_GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_6); + ROM_GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_7); + + // + // PE5/PN3/PP1 are used for the push buttons. + // + ROM_GPIOPinTypeGPIOInput(GPIO_PORTE_BASE, GPIO_PIN_5); + ROM_GPIOPinTypeGPIOInput(GPIO_PORTN_BASE, GPIO_PIN_3); + ROM_GPIOPinTypeGPIOInput(GPIO_PORTP_BASE, GPIO_PIN_1); + + // + // PE7/PP7/PT2-3 are used for the touch screen. + // + HWREG(GPIO_PORTE_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTE_BASE + GPIO_O_CR) = 0xff; + ROM_GPIOPinTypeGPIOInput(GPIO_PORTE_BASE, GPIO_PIN_7); + ROM_GPIOPinTypeGPIOInput(GPIO_PORTP_BASE, GPIO_PIN_7); + ROM_GPIOPinTypeGPIOInput(GPIO_PORTT_BASE, GPIO_PIN_2 | GPIO_PIN_3); + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_7); + ROM_GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_7, 0); + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTP_BASE, GPIO_PIN_7); + ROM_GPIOPinWrite(GPIO_PORTP_BASE, GPIO_PIN_7, 0); + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTT_BASE, GPIO_PIN_2 | GPIO_PIN_3); + ROM_GPIOPinWrite(GPIO_PORTT_BASE, GPIO_PIN_2 | GPIO_PIN_3, 0); + + // + // PF0/PF4-5/PH4/PQ0-2 are used for the SPI flash (on-board and SD card). + // PH4 selects the SD card and PQ1 selects the on-board SPI flash. + // + ROM_GPIOPinConfigure(GPIO_PF0_SSI3XDAT1); + ROM_GPIOPinConfigure(GPIO_PF4_SSI3XDAT2); + ROM_GPIOPinConfigure(GPIO_PF5_SSI3XDAT3); + ROM_GPIOPinConfigure(GPIO_PQ0_SSI3CLK); + ROM_GPIOPinConfigure(GPIO_PQ2_SSI3XDAT0); + ROM_GPIOPinTypeSSI(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4 | GPIO_PIN_5); + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTH_BASE, GPIO_PIN_4); + ROM_GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_4, GPIO_PIN_4); + ROM_GPIOPinTypeSSI(GPIO_PORTQ_BASE, GPIO_PIN_0 | GPIO_PIN_2); + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTQ_BASE, GPIO_PIN_1); + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_1, GPIO_PIN_1); + + // + // PF1/PK4/PK6 are used for Ethernet LEDs. + // + ROM_GPIOPinConfigure(GPIO_PF1_EN0LED2); + ROM_GPIOPinConfigure(GPIO_PK4_EN0LED0); + ROM_GPIOPinConfigure(GPIO_PK6_EN0LED1); + GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_1); + GPIOPinTypeEthernetLED(GPIO_PORTK_BASE, GPIO_PIN_4); + GPIOPinTypeEthernetLED(GPIO_PORTK_BASE, GPIO_PIN_6); + + // + // PF6-7/PJ6/PS4-5/PR0-7 are used for the LCD. + // + ROM_GPIOPinConfigure(GPIO_PF7_LCDDATA02); + ROM_GPIOPinConfigure(GPIO_PJ6_LCDAC); + ROM_GPIOPinConfigure(GPIO_PR0_LCDCP); + ROM_GPIOPinConfigure(GPIO_PR1_LCDFP); + ROM_GPIOPinConfigure(GPIO_PR2_LCDLP); + ROM_GPIOPinConfigure(GPIO_PR3_LCDDATA03); + ROM_GPIOPinConfigure(GPIO_PR4_LCDDATA00); + ROM_GPIOPinConfigure(GPIO_PR5_LCDDATA01); + ROM_GPIOPinConfigure(GPIO_PR6_LCDDATA04); + ROM_GPIOPinConfigure(GPIO_PR7_LCDDATA05); + ROM_GPIOPinConfigure(GPIO_PS4_LCDDATA06); + ROM_GPIOPinConfigure(GPIO_PS5_LCDDATA07); + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_6); + ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_6, GPIO_PIN_6); + GPIOPinTypeLCD(GPIO_PORTF_BASE, GPIO_PIN_7); + GPIOPinTypeLCD(GPIO_PORTJ_BASE, GPIO_PIN_6); + GPIOPinTypeLCD(GPIO_PORTR_BASE, + (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | + GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7)); + GPIOPinTypeLCD(GPIO_PORTS_BASE, GPIO_PIN_4 | GPIO_PIN_5); + + // + // PQ7 is used for the user LED. + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTQ_BASE, GPIO_PIN_7); + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_7, 0); +} + +//***************************************************************************** +// +//! Configures the USB pins for ULPI connection to an external USB PHY. +//! +//! This function configures the USB ULPI pins to connect the DK-TM4C129X board +//! to an external USB PHY in ULPI mode. This allows the external PHY to act +//! as an external high-speed phy for the DK-TM4C129X. This function must be +//! called after the call to PinoutSet() to properly configure the pins. +//! +//! \return None. +// +//***************************************************************************** +#ifdef USE_ULPI +void +USBULPIPinoutSet(void) +{ + // + // Enable all the peripherals that are used by the ULPI interface. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP); + + // + // ULPI Port B pins. + // + ROM_GPIOPinConfigure(GPIO_PB2_USB0STP); + ROM_GPIOPinConfigure(GPIO_PB3_USB0CLK); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3, + GPIO_STRENGTH_12MA, GPIO_PIN_TYPE_STD); + + // + // ULPI Port P pins. + // + ROM_GPIOPinConfigure(GPIO_PP2_USB0NXT); + ROM_GPIOPinConfigure(GPIO_PP3_USB0DIR); + ROM_GPIOPinConfigure(GPIO_PP4_USB0D7); + ROM_GPIOPinConfigure(GPIO_PP5_USB0D6); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTP_BASE, GPIO_PIN_2 | GPIO_PIN_3 | + GPIO_PIN_4 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTP_BASE, + GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5, + GPIO_STRENGTH_12MA, GPIO_PIN_TYPE_STD); + + // + // ULPI Port L pins. + // + ROM_GPIOPinConfigure(GPIO_PL5_USB0D5); + ROM_GPIOPinConfigure(GPIO_PL4_USB0D4); + ROM_GPIOPinConfigure(GPIO_PL3_USB0D3); + ROM_GPIOPinConfigure(GPIO_PL2_USB0D2); + ROM_GPIOPinConfigure(GPIO_PL1_USB0D1); + ROM_GPIOPinConfigure(GPIO_PL0_USB0D0); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTL_BASE, GPIO_PIN_0 | GPIO_PIN_1 | + GPIO_PIN_2 | GPIO_PIN_3 | + GPIO_PIN_4 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTL_BASE, + GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | + GPIO_PIN_4 | GPIO_PIN_5, + GPIO_STRENGTH_12MA, GPIO_PIN_TYPE_STD); + // + // ULPI Port M pins used to control the external USB oscillator and the + // external USB phy on the DK-TM4C129X-DPHY board. + // + // PM1 - Enables the USB oscillator on the DK-TM4C129X-DPHY board. + // PM3 - Enables the USB phy on the DK-TM4C129X-DPHY board. + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTM_BASE, GPIO_PIN_1 | GPIO_PIN_3); + ROM_GPIOPinWrite(GPIO_PORTM_BASE, GPIO_PIN_1 | GPIO_PIN_3, GPIO_PIN_1 | + GPIO_PIN_3); +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c129x/drivers/pinout.h b/boards/dk-tm4c129x/drivers/pinout.h new file mode 100644 index 0000000..802d9fe --- /dev/null +++ b/boards/dk-tm4c129x/drivers/pinout.h @@ -0,0 +1,59 @@ +//***************************************************************************** +// +// pinout.h - Prototype for the function to configure the device pins on the +// DK-TM4C129X. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __DRIVERS_PINOUT_H__ +#define __DRIVERS_PINOUT_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void PinoutSet(void); +#ifdef USE_ULPI +extern void USBULPIPinoutSet(void); +#endif + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __DRIVERS_PINOUT_H__ diff --git a/boards/dk-tm4c129x/drivers/sound.c b/boards/dk-tm4c129x/drivers/sound.c new file mode 100644 index 0000000..56f84e0 --- /dev/null +++ b/boards/dk-tm4c129x/drivers/sound.c @@ -0,0 +1,688 @@ +//***************************************************************************** +// +// sound.c - Sound driver for the speaker on the DK-TM4C129X. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_timer.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" +#include "drivers/sound.h" + +//***************************************************************************** +// +//! \addtogroup sound_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// This structure defines the internal state of the sound driver. +// +//***************************************************************************** +typedef struct +{ + // + // The number of clocks per PWM period. + // + uint32_t ui32Period; + + // + // A set of flags indicating the mode of the sound driver. + // + volatile uint32_t ui32Flags; + + // + // A pointer to the sound buffer being played. + // + const int16_t *pi16Buffer; + + // + // The length of the sound buffer, in bytes. + // + uint32_t ui32Length; + + // + // The current playback offset into the sound buffer. + // + uint32_t ui32Offset; + + // + // The volume to playback the sound stream. This is a value between 0 + // (for silence) and 256 (for full volume). + // + int32_t i32Volume; + + // + // The previous and current sound samples, used for interpolating from + // 8 kHz to 64 kHz sound. + // + int16_t pi16Samples[2]; + + // + // The sound step, which corresponds to the current interpolation point + // between the previous and current sound samples. + // + int32_t i32Step; + + // + // The current requested rate adjustment. This is cleared when the + // the adjustment is made. + // + int32_t i32RateAdjust; + + // + // The callback function that indicates when half of the sound buffer has + // bene played and is therefore ready to be refilled. + // + void (*pfnCallback)(uint32_t ui32Half); +} +tSoundState; + +//***************************************************************************** +// +// The flags that are in tSoundState.ui32Flags. +// +//***************************************************************************** +#define SOUND_FLAG_STARTUP 0 +#define SOUND_FLAG_SHUTDOWN 1 +#define SOUND_FLAG_PLAY 2 +#define SOUND_FLAG_8KHZ 3 +#define SOUND_FLAG_16KHZ 4 +#define SOUND_FLAG_32KHZ 5 +#define SOUND_FLAG_64KHZ 6 + +//***************************************************************************** +// +// The current state of the sound driver. +// +//***************************************************************************** +static tSoundState g_sSoundState; + +//***************************************************************************** +// +//! Handles the TIMER5A interrupt. +//! +//! This function responds to the TIMER5A interrupt, updating the duty cycle of +//! the output waveform in order to produce sound. It is the application's +//! responsibility to ensure that this function is called in response to the +//! TIMER5A interrupt, typically by installing it in the vector table as the +//! handler for the TIMER5A interrupt. +//! +//! \return None. +// +//***************************************************************************** +void +SoundIntHandler(void) +{ + int32_t i32DutyCycle; + + // + // If there is an adjustment to be made, the apply it and set allow the + // update to be done on the next load. + // + if(g_sSoundState.i32RateAdjust) + { + g_sSoundState.ui32Period += g_sSoundState.i32RateAdjust; + g_sSoundState.i32RateAdjust = 0; + TimerLoadSet(TIMER5_BASE, TIMER_A, g_sSoundState.ui32Period); + } + + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER5_BASE, TIMER_CAPA_EVENT); + + // + // See if the startup ramp is in progress. + // + if(HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_STARTUP)) + { + // + // Increment the ramp count. + // + g_sSoundState.i32Step++; + + // + // Increase the pulse width of the output by one clock. + // + ROM_TimerMatchSet(TIMER5_BASE, TIMER_A, g_sSoundState.i32Step); + + // + // See if this was the last step of the ramp. + // + if(g_sSoundState.i32Step >= (g_sSoundState.ui32Period / 2)) + { + // + // Indicate that the startup ramp has completed. + // + HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_STARTUP) = 0; + + // + // Set the step back to zero for the start of audio playback. + // + g_sSoundState.i32Step = 0; + } + + // + // There is nothing further to be done. + // + return; + } + + // + // See if the shutdown ramp is in progress. + // + if(HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_SHUTDOWN)) + { + // + // See if this was the last step of the ramp. + // + if(g_sSoundState.i32Step == 1) + { + // + // Disable the output signals. + // + ROM_TimerMatchSet(TIMER5_BASE, TIMER_A, g_sSoundState.ui32Period); + + // + // Clear the sound flags. + // + g_sSoundState.ui32Flags = 0; + + // + // Disable the speaker amp. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_4, 0); + } + else + { + // + // Decrement the ramp count. + // + g_sSoundState.i32Step--; + + // + // Decrease the pulse width of the output by one clock. + // + ROM_TimerMatchSet(TIMER5_BASE, TIMER_A, g_sSoundState.i32Step); + } + + // + // There is nothing further to be done. + // + return; + } + + // + // Compute the value of the PCM sample based on the blended average of the + // previous and current samples. It should be noted that linear + // interpolation does not produce the best results with sound (it produces + // a significant amount of harmonic aliasing) but it is fast. + // + i32DutyCycle = + (((g_sSoundState.pi16Samples[0] * (8 - g_sSoundState.i32Step)) + + (g_sSoundState.pi16Samples[1] * g_sSoundState.i32Step)) / 8); + + // + // Adjust the magnitude of the sample based on the current volume. Since a + // multiplicative volume control is implemented, the volume value + // results in nearly linear volume adjustment if it is squared. + // + i32DutyCycle = (((i32DutyCycle * g_sSoundState.i32Volume * + g_sSoundState.i32Volume) / 65536) + 32768); + + // + // Set the PWM duty cycle based on this PCM sample. + // + i32DutyCycle = (g_sSoundState.ui32Period * i32DutyCycle) / 65536; + ROM_TimerMatchSet(TIMER5_BASE, TIMER_A, i32DutyCycle); + + // + // Increment the sound step based on the sample rate. + // + if(HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_8KHZ)) + { + g_sSoundState.i32Step = (g_sSoundState.i32Step + 1) & 7; + } + else if(HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_16KHZ)) + { + g_sSoundState.i32Step = (g_sSoundState.i32Step + 2) & 7; + } + else if(HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_32KHZ)) + { + g_sSoundState.i32Step = (g_sSoundState.i32Step + 4) & 7; + } + + // + // See if the next sample has been reached. + // + if(g_sSoundState.i32Step == 0) + { + // + // Copy the current sample to the previous sample. + // + g_sSoundState.pi16Samples[0] = g_sSoundState.pi16Samples[1]; + + // + // Get the next sample from the buffer. + // + g_sSoundState.pi16Samples[1] = + g_sSoundState.pi16Buffer[g_sSoundState.ui32Offset]; + + // + // Increment the buffer pointer. + // + g_sSoundState.ui32Offset++; + if(g_sSoundState.ui32Offset == g_sSoundState.ui32Length) + { + g_sSoundState.ui32Offset = 0; + } + + // + // Call the callback function if one of the half-buffers has been + // consumed. + // + if(g_sSoundState.pfnCallback) + { + if(g_sSoundState.ui32Offset == 0) + { + g_sSoundState.pfnCallback(1); + } + else if(g_sSoundState.ui32Offset == (g_sSoundState.ui32Length / 2)) + { + g_sSoundState.pfnCallback(0); + } + } + } +} + +//***************************************************************************** +// +//! Initializes the sound driver. +//! +//! \param ui32SysClock is the frequency of the system clock. +//! +//! This function initializes the sound driver, preparing it to output sound +//! data to the speaker. +//! +//! The system clock should be as high as possible; lower clock rates reduces +//! the quality of the produced sound. For the best quality sound, the system +//! should be clocked at 120 MHz. +//! +//! \note In order for the sound driver to function properly, the sound driver +//! interrupt handler (SoundIntHandler()) must be installed into the vector +//! table for the timer 5 subtimer A interrupt. +//! +//! \return None. +// +//***************************************************************************** +void +SoundInit(uint32_t ui32SysClock) +{ + // + // Enable the peripherals used by the sound driver. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER5); + + // + // Compute the PWM period based on the system clock. + // + g_sSoundState.ui32Period = ui32SysClock / 64000; + + // + // Set the default volume. + // + g_sSoundState.i32Volume = 255; + + // + // Configure the timer to run in PWM mode. + // + if((HWREG(TIMER5_BASE + TIMER_O_CTL) & TIMER_CTL_TBEN) == 0) + { + ROM_TimerConfigure(TIMER5_BASE, (TIMER_CFG_SPLIT_PAIR | + TIMER_CFG_A_PWM | + TIMER_CFG_B_PERIODIC)); + } + ROM_TimerLoadSet(TIMER5_BASE, TIMER_A, g_sSoundState.ui32Period - 1); + ROM_TimerMatchSet(TIMER5_BASE, TIMER_A, g_sSoundState.ui32Period); + ROM_TimerControlLevel(TIMER5_BASE, TIMER_A, true); + + // + // Update the timer values on timeouts and not immediately. + // + TimerUpdateMode(TIMER5_BASE, TIMER_A, TIMER_UP_LOAD_TIMEOUT | + TIMER_UP_MATCH_TIMEOUT); + + // + // Configure the timer to generate an interrupt at every time-out event. + // + ROM_TimerIntEnable(TIMER5_BASE, TIMER_CAPA_EVENT); + + // + // Enable the timer. At this point, the timer generates an interrupt + // every 15.625 us. + // + ROM_TimerEnable(TIMER5_BASE, TIMER_A); + ROM_IntEnable(INT_TIMER5A); + + // + // Clear the sound flags. + // + g_sSoundState.ui32Flags = 0; +} + +//***************************************************************************** +// +//! Make adjustments to the sample period of the PWM audio. +//! +//! \param i32RateAdjust is a signed value of the adjustment to make to the +//! current sample period. +//! +//! This function allows the sample period to be adjusted if the application +//! needs to make small adjustments to the playback rate of the audio. This +//! should only be used to makke smaller adjustments to the sample rate since +//! large changes cause distortion in the output. +//! +//! \return None. +// +//***************************************************************************** +void +SoundPeriodAdjust(int32_t i32RateAdjust) +{ + g_sSoundState.i32RateAdjust += i32RateAdjust; +} + +//***************************************************************************** +// +//! Starts playback of a sound stream. +//! +//! \param pi16Buffer is a pointer to the buffer that contains the sound to +//! play. +//! \param ui32Length is the length of the buffer in samples. This should be +//! a multiple of two. +//! \param ui32Rate is the sound playback rate; valid values are 8000, 16000, +//! 32000, and 64000. +//! \param pfnCallback is the callback function that is called when either half +//! of the sound buffer has been played. +//! +//! This function starts the playback of a sound stream contained in an +//! audio ping-pong buffer. The buffer is played repeatedly until +//! SoundStop() is called. Playback of the sound stream begins +//! immediately, so the buffer should be pre-filled with the initial sound +//! data prior to calling this function. +//! +//! \return Returns \b true if playback was started and \b false if it could +//! not be started (because something is already playing). +// +//***************************************************************************** +bool +SoundStart(int16_t *pi16Buffer, uint32_t ui32Length, uint32_t ui32Rate, + void (*pfnCallback)(uint32_t ui32Half)) +{ + // + // Return without playing the buffer if something is already playing. + // + if(g_sSoundState.ui32Flags) + { + return(false); + } + + // + // Set the sample rate flag. + // + if(ui32Rate == 8000) + { + HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_8KHZ) = 1; + } + else if(ui32Rate == 16000) + { + HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_16KHZ) = 1; + } + else if(ui32Rate == 32000) + { + HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_32KHZ) = 1; + } + else if(ui32Rate == 64000) + { + HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_64KHZ) = 1; + } + else + { + return(false); + } + + // + // Enable the speaker amp. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_4, GPIO_PIN_4); + + // + // Save the pointer to the buffer. + // + g_sSoundState.pi16Buffer = pi16Buffer; + g_sSoundState.ui32Length = ui32Length; + + // + // Save the pointer to the callback function. + // + g_sSoundState.pfnCallback = pfnCallback; + + // + // Start playback from the beginning of the buffer. + // + g_sSoundState.ui32Offset = 0; + + // + // Initialize the sample buffer with silence. + // + g_sSoundState.pi16Samples[0] = 0; + g_sSoundState.pi16Samples[1] = 0; + + // + // Start playback of the stream. + // + HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_STARTUP) = 1; + HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_PLAY) = 1; + + // + // Set the step for the startup ramp. + // + g_sSoundState.i32Step = 1; + + // + // Enable the timer interrupt. + // + ROM_TimerMatchSet(TIMER5_BASE, TIMER_A, 1); + + // + // Success. + // + return(true); +} + +//***************************************************************************** +// +//! Stops playback of the current sound stream. +//! +//! This function immediately stops playback of the current sound stream. As +//! a result, the output is changed directly to the mid-point, possibly +//! resulting in a pop or click. It is then ramped down to no output, +//! eliminating the current draw through the amplifier and speaker. +//! +//! \return None. +// +//***************************************************************************** +void +SoundStop(void) +{ + // + // See if playback is in progress. + // + if((g_sSoundState.ui32Flags != 0) && + (HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_SHUTDOWN) == 0)) + { + // + // Temporarily disable the timer interrupt. + // + ROM_IntDisable(INT_TIMER5A); + + // + // Clear the sound flags and set the shutdown flag (to try to avoid a + // pop, though one may still occur based on the current position of the + // output waveform). + // + g_sSoundState.ui32Flags = 0; + HWREGBITW(&g_sSoundState.ui32Flags, SOUND_FLAG_SHUTDOWN) = 1; + + // + // Set the shutdown step to the first. + // + g_sSoundState.i32Step = g_sSoundState.ui32Period / 2; + + // + // Reenable the timer interrupt. + // + ROM_IntEnable(INT_TIMER5A); + } +} + +//***************************************************************************** +// +//! Determines if the sound driver is busy. +//! +//! This function determines if the sound driver is busy, either performing the +//! startup or shutdown ramp for the speaker or playing a sound stream. +//! +//! \return Returns \b true if the sound driver is busy and \b false otherwise. +// +//***************************************************************************** +bool +SoundBusy(void) +{ + // + // The sound driver is busy if the sound flags are not zero. + // + return(g_sSoundState.ui32Flags != 0); +} + +//***************************************************************************** +// +//! Sets the volume of the sound playback. +//! +//! \param i32Volume is the volume of the sound playback, specified as a value +//! between 0 (for silence) and 255 (for full volume). +//! +//! This function sets the volume of the sound playback. Setting the volume to +//! 0 mutes the output, while setting the volume to 256 plays the sound +//! stream without any volume adjustment (that is, full volume). +//! +//! \return None. +// +//***************************************************************************** +void +SoundVolumeSet(int32_t i32Volume) +{ + // + // Set the volume mulitplier to be used. + // + g_sSoundState.i32Volume = i32Volume; +} + +//***************************************************************************** +// +//! Increases the volume of the sound playback. +//! +//! \param i32Volume is the amount by which to increase the volume of the +//! sound playback, specified as a value between 0 (for no adjustment) and 255 +//! maximum adjustment). +//! +//! This function increases the volume of the sound playback relative to the +//! current volume. +//! +//! \return None. +// +//***************************************************************************** +void +SoundVolumeUp(int32_t i32Volume) +{ + // + // Compute the new volume, limiting to the maximum if required. + // + i32Volume = g_sSoundState.i32Volume + i32Volume; + if(i32Volume > 255) + { + i32Volume = 255; + } + + // + // Set the new volume. + // + g_sSoundState.i32Volume = i32Volume; +} + +//***************************************************************************** +// +//! Decreases the volume of the sound playback. +//! +//! \param i32Volume is the amount by which to decrease the volume of the +//! sound playback, specified as a value between 0 (for no adjustment) and 255 +//! maximum adjustment). +//! +//! This function decreases the volume of the sound playback relative to the +//! current volume. +//! +//! \return None. +// +//***************************************************************************** +void +SoundVolumeDown(int32_t i32Volume) +{ + // + // Compute the new volume, limiting to the minimum if required. + // + i32Volume = g_sSoundState.i32Volume - i32Volume; + if(i32Volume < 0) + { + i32Volume = 0; + } + + // + // Set the new volume. + // + g_sSoundState.i32Volume = i32Volume; +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c129x/drivers/sound.h b/boards/dk-tm4c129x/drivers/sound.h new file mode 100644 index 0000000..9892b67 --- /dev/null +++ b/boards/dk-tm4c129x/drivers/sound.h @@ -0,0 +1,65 @@ +//***************************************************************************** +// +// sound.h - Prototypes for the sound driver. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __DRIVERS_SOUND_H__ +#define __DRIVERS_SOUND_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SoundIntHandler(void); +extern void SoundInit(uint32_t ui32SysClock); +extern bool SoundStart(int16_t *pi16Buffer, uint32_t ui32Length, + uint32_t ui32Rate, + void (*pfnCallback)(uint32_t ui32Half)); +extern void SoundPeriodAdjust(int32_t i32RateAdjust); +extern void SoundStop(void); +extern bool SoundBusy(void); +extern void SoundVolumeSet(int32_t i32Volume); +extern void SoundVolumeUp(int32_t i32Volume); +extern void SoundVolumeDown(int32_t i32Volume); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __DRIVERS_SOUND_H__ diff --git a/boards/dk-tm4c129x/drivers/touch.c b/boards/dk-tm4c129x/drivers/touch.c new file mode 100644 index 0000000..7129f52 --- /dev/null +++ b/boards/dk-tm4c129x/drivers/touch.c @@ -0,0 +1,762 @@ +//***************************************************************************** +// +// touch.c - Touch screen driver for the DK-TM4C129X. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_adc.h" +#include "inc/hw_gpio.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_timer.h" +#include "inc/hw_types.h" +#include "driverlib/adc.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "drivers/touch.h" + +//***************************************************************************** +// +//! \addtogroup touch_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// This driver operates in four different screen orientations. They are: +// +// * Portrait - The screen is taller than it is wide, and the flex connector is +// on the left of the display. This is selected by defining +// PORTRAIT. +// +// * Landscape - The screen is wider than it is tall, and the flex connector is +// on the bottom of the display. This is selected by defining +// LANDSCAPE. +// +// * Portrait flip - The screen is taller than it is wide, and the flex +// connector is on the right of the display. This is +// selected by defining PORTRAIT_FLIP. +// +// * Landscape flip - The screen is wider than it is tall, and the flex +// connector is on the top of the display. This is +// selected by defining LANDSCAPE_FLIP. +// +// These can also be imagined in terms of screen rotation; if portrait mode is +// 0 degrees of screen rotation, landscape is 90 degrees of counter-clockwise +// rotation, portrait flip is 180 degrees of rotation, and landscape flip is +// 270 degress of counter-clockwise rotation. +// +// If no screen orientation is selected, landscape mode will be used. +// +//***************************************************************************** +#if ! defined(PORTRAIT) && ! defined(PORTRAIT_FLIP) && \ + ! defined(LANDSCAPE) && ! defined(LANDSCAPE_FLIP) +#define LANDSCAPE_FLIP +#endif + +//***************************************************************************** +// +// The GPIO pins/ADC channels to which the touch screen is connected. +// +//***************************************************************************** +#define TS_XP_BASE GPIO_PORTE_BASE +#define TS_XP_PIN GPIO_PIN_7 +#define TS_XP_ADC ADC_CTL_CH21 +#define TS_XN_BASE GPIO_PORTT_BASE +#define TS_XN_PIN GPIO_PIN_2 +#define TS_YP_BASE GPIO_PORTP_BASE +#define TS_YP_PIN GPIO_PIN_7 +#define TS_YP_ADC ADC_CTL_CH22 +#define TS_YN_BASE GPIO_PORTT_BASE +#define TS_YN_PIN GPIO_PIN_3 + +//***************************************************************************** +// +// Touchscreen calibration parameters. Screen orientation is a build time +// selection. +// +//***************************************************************************** +const int32_t g_pi32TouchParameters[7] = +{ +#ifdef PORTRAIT + 3840, // M0 + 318720, // M1 + -297763200, // M2 + 328576, // M3 + -8896, // M4 + -164591232, // M5 + 3100080, // M6 +#endif +#ifdef LANDSCAPE + 328192, // M0 + -4352, // M1 + -178717056, // M2 + 1488, // M3 + -314592, // M4 + 1012670064, // M5 + 3055164, // M6 +#endif +#ifdef PORTRAIT_FLIP + 1728, // M0 + -321696, // M1 + 1034304336, // M2 + -325440, // M3 + 1600, // M4 + 1161009600, // M5 + 3098070, // M6 +#endif +#ifdef LANDSCAPE_FLIP + -326400, // M0 + -1024, // M1 + 1155718720, // M2 + 3768, // M3 + 312024, // M4 + -299081088, // M5 + 3013754, // M6 +#endif +}; + +//***************************************************************************** +// +// The lowest ADC reading assumed to represent a press on the screen. Readings +// below this indicate no press is taking place. +// +//***************************************************************************** +#define TOUCH_MIN 150 + +//***************************************************************************** +// +// The current state of the touch screen driver's state machine. This is used +// to cycle the touch screen interface through the powering sequence required +// to read the two axes of the surface. +// +//***************************************************************************** +static uint32_t g_ui32TSState; +#define TS_STATE_INIT 0 +#define TS_STATE_SKIP_X 1 +#define TS_STATE_READ_X 2 +#define TS_STATE_SKIP_Y 3 +#define TS_STATE_READ_Y 4 + +//***************************************************************************** +// +// The most recent raw ADC reading for the X position on the screen. This +// value is not affected by the selected screen orientation. +// +//***************************************************************************** +volatile int16_t g_i16TouchX; + +//***************************************************************************** +// +// The most recent raw ADC reading for the Y position on the screen. This +// value is not affected by the selected screen orientation. +// +//***************************************************************************** +volatile int16_t g_i16TouchY; + +//***************************************************************************** +// +// The minimum raw reading that should be considered valid press. +// +//***************************************************************************** +int16_t g_i16TouchMin = TOUCH_MIN; + +//***************************************************************************** +// +// A pointer to the function to receive messages from the touch screen driver +// when events occur on the touch screen (debounced presses, movement while +// pressed, and debounced releases). +// +//***************************************************************************** +static int32_t (*g_pfnTSHandler)(uint32_t ui32Message, int32_t i32X, + int32_t i32Y); + +//***************************************************************************** +// +// The current state of the touch screen debouncer. When zero, the pen is up. +// When three, the pen is down. When one or two, the pen is transitioning from +// one state to the other. +// +//***************************************************************************** +static uint8_t g_ui8State = 0; + +//***************************************************************************** +// +// The queue of debounced pen positions. This is used to slightly delay the +// returned pen positions, so that the pen positions that occur while the pen +// is being raised are not send to the application. +// +//***************************************************************************** +static int16_t g_pi16Samples[8]; + +//***************************************************************************** +// +// The count of pen positions in g_pi16Samples. When negative, the buffer is +// being pre-filled as a result of a detected pen down event. +// +//***************************************************************************** +static int8_t g_i8Index = 0; + +//***************************************************************************** +// +//! Debounces presses of the touch screen. +//! +//! This function is called when a new X/Y sample pair has been captured in +//! order to perform debouncing of the touch screen. +//! +//! \return None. +// +//***************************************************************************** +static void +TouchScreenDebouncer(void) +{ + int32_t i32X, i32Y, i32Temp; + + // + // Convert the ADC readings into pixel values on the screen. + // + i32X = g_i16TouchX; + i32Y = g_i16TouchY; + i32Temp = (((i32X * g_pi32TouchParameters[0]) + + (i32Y * g_pi32TouchParameters[1]) + g_pi32TouchParameters[2]) / + g_pi32TouchParameters[6]); + i32Y = (((i32X * g_pi32TouchParameters[3]) + + (i32Y * g_pi32TouchParameters[4]) + g_pi32TouchParameters[5]) / + g_pi32TouchParameters[6]); + i32X = i32Temp; + + // + // See if the touch screen is being touched. + // + if((g_i16TouchX < g_i16TouchMin) || (g_i16TouchY < g_i16TouchMin)) + { + // + // If there are no valid values yet then ignore this state. + // + if((g_ui8State & 0x80) == 0) + { + g_ui8State = 0; + } + + // + // See if the pen is not up right now. + // + if(g_ui8State != 0x00) + { + // + // Decrement the state count. + // + g_ui8State--; + + // + // See if the pen has been detected as up three times in a row. + // + if(g_ui8State == 0x80) + { + // + // Indicate that the pen is up. + // + g_ui8State = 0x00; + + // + // See if there is a touch screen event handler. + // + if(g_pfnTSHandler) + { + // + // If we got caught pre-filling the values, just return the + // first valid value as a press and release. If this is + // not done there is a perceived miss of a press event. + // + if(g_i8Index < 0) + { + g_pfnTSHandler(WIDGET_MSG_PTR_DOWN, g_pi16Samples[0], + g_pi16Samples[1]); + g_i8Index = 0; + } + + // + // Send the pen up message to the touch screen event + // handler. + // + g_pfnTSHandler(WIDGET_MSG_PTR_UP, g_pi16Samples[g_i8Index], + g_pi16Samples[g_i8Index + 1]); + } + } + } + } + else + { + // + // If the state was counting down above then fall back to the idle + // state and start waiting for new values. + // + if((g_ui8State & 0x80) && (g_ui8State != 0x83)) + { + // + // Restart the release count down. + // + g_ui8State = 0x83; + } + + // + // See if the pen is not down right now. + // + if(g_ui8State != 0x83) + { + // + // Increment the state count. + // + g_ui8State++; + + // + // See if the pen has been detected as down three times in a row. + // + if(g_ui8State == 0x03) + { + // + // Indicate that the pen is down. + // + g_ui8State = 0x83; + + // + // Set the index to -8, so that the next 3 samples are stored + // into the sample buffer before sending anything back to the + // touch screen event handler. + // + g_i8Index = -8; + + // + // Store this sample into the sample buffer. + // + g_pi16Samples[0] = i32X; + g_pi16Samples[1] = i32Y; + } + } + else + { + // + // See if the sample buffer pre-fill has completed. + // + if(g_i8Index == -2) + { + // + // See if there is a touch screen event handler. + // + if(g_pfnTSHandler) + { + // + // Send the pen down message to the touch screen event + // handler. + // + g_pfnTSHandler(WIDGET_MSG_PTR_DOWN, g_pi16Samples[0], + g_pi16Samples[1]); + } + + // + // Store this sample into the sample buffer. + // + g_pi16Samples[0] = i32X; + g_pi16Samples[1] = i32Y; + + // + // Set the index to the next sample to send. + // + g_i8Index = 2; + } + + // + // Otherwise, see if the sample buffer pre-fill is in progress. + // + else if(g_i8Index < 0) + { + // + // Store this sample into the sample buffer. + // + g_pi16Samples[g_i8Index + 10] = i32X; + g_pi16Samples[g_i8Index + 11] = i32Y; + + // + // Increment the index. + // + g_i8Index += 2; + } + + // + // Otherwise, the sample buffer is full. + // + else + { + // + // See if there is a touch screen event handler. + // + if(g_pfnTSHandler) + { + // + // Send the pen move message to the touch screen event + // handler. + // + g_pfnTSHandler(WIDGET_MSG_PTR_MOVE, + g_pi16Samples[g_i8Index], + g_pi16Samples[g_i8Index + 1]); + } + + // + // Store this sample into the sample buffer. + // + g_pi16Samples[g_i8Index] = i32X; + g_pi16Samples[g_i8Index + 1] = i32Y; + + // + // Increment the index. + // + g_i8Index = (g_i8Index + 2) & 7; + } + } + } +} + +//***************************************************************************** +// +//! Handles the ADC interrupt for the touch screen. +//! +//! This function is called when the ADC sequence that samples the touch screen +//! has completed its acquisition. The touch screen state machine is advanced +//! and the acquired ADC sample is processed appropriately. +//! +//! It is the responsibility of the application using the touch screen driver +//! to ensure that this function is installed in the interrupt vector table for +//! the ADC0 samples sequencer 3 interrupt. +//! +//! \return None. +// +//***************************************************************************** +void +TouchScreenIntHandler(void) +{ + // + // Clear the ADC sample sequence interrupt. + // + HWREG(ADC0_BASE + ADC_O_ISC) = ADC_ISC_IN3; + + // + // Determine what to do based on the current state of the state machine. + // + switch(g_ui32TSState) + { + // + // The new sample is an X axis sample that should be discarded. + // + case TS_STATE_SKIP_X: + { + // + // Read and throw away the ADC sample. + // + HWREG(ADC0_BASE + ADC_O_SSFIFO3); + + // + // Set the analog mode select for the YP pin. + // + HWREG(TS_YP_BASE + GPIO_O_AMSEL) |= TS_YP_PIN; + + // + // Configure the Y axis touch layer pins as inputs. + // + HWREG(TS_YP_BASE + GPIO_O_DIR) &= ~TS_YP_PIN; + HWREG(TS_YN_BASE + GPIO_O_DIR) &= ~TS_YN_PIN; + + // + // The next sample will be a valid X axis sample. + // + g_ui32TSState = TS_STATE_READ_X; + + // + // This state has been handled. + // + break; + } + + // + // The new sample is an X axis sample that should be processed. + // + case TS_STATE_READ_X: + { + // + // Read the raw ADC sample. + // + g_i16TouchX = HWREG(ADC0_BASE + ADC_O_SSFIFO3); + + // + // Clear the analog mode select for the YP pin. + // + HWREG(TS_YP_BASE + GPIO_O_AMSEL) &= ~TS_YP_PIN; + + // + // Configure the X and Y axis touch layers as outputs. + // + HWREG(TS_XP_BASE + GPIO_O_DIR) |= TS_XP_PIN; + HWREG(TS_XN_BASE + GPIO_O_DIR) |= TS_XN_PIN; + HWREG(TS_YP_BASE + GPIO_O_DIR) |= TS_YP_PIN; + HWREG(TS_YN_BASE + GPIO_O_DIR) |= TS_YN_PIN; + + // + // Drive the positive side of the Y axis touch layer with VDD and + // the negative side with GND. Also, drive both sides of the X + // axis layer with GND to discharge any residual voltage (so that + // a no-touch condition can be properly detected). + // + HWREG(TS_XP_BASE + GPIO_O_DATA + (TS_XP_PIN << 2)) = 0; + HWREG(TS_XN_BASE + GPIO_O_DATA + (TS_XN_PIN << 2)) = 0; + HWREG(TS_YP_BASE + GPIO_O_DATA + (TS_YP_PIN << 2)) = TS_YP_PIN; + HWREG(TS_YN_BASE + GPIO_O_DATA + (TS_YN_PIN << 2)) = 0; + + // + // Configure the sample sequence to capture the X axis value. + // + HWREG(ADC0_BASE + ADC_O_SSMUX3) = TS_XP_ADC; + + // + // The next sample will be an invalid Y axis sample. + // + g_ui32TSState = TS_STATE_SKIP_Y; + + // + // This state has been handled. + // + break; + } + + // + // The new sample is a Y axis sample that should be discarded. + // + case TS_STATE_SKIP_Y: + { + // + // Read and throw away the ADC sample. + // + HWREG(ADC0_BASE + ADC_O_SSFIFO3); + + // + // Set the analog mode select for the XP pin. + // + HWREG(TS_XP_BASE + GPIO_O_AMSEL) |= TS_XP_PIN; + + // + // Configure the X axis touch layer pins as inputs. + // + HWREG(TS_XP_BASE + GPIO_O_DIR) &= ~TS_XP_PIN; + HWREG(TS_XN_BASE + GPIO_O_DIR) &= ~TS_XN_PIN; + + // + // The next sample will be a valid Y axis sample. + // + g_ui32TSState = TS_STATE_READ_Y; + + // + // This state has been handled. + // + break; + } + + // + // The new sample is a Y axis sample that should be processed. + // + case TS_STATE_READ_Y: + { + // + // Read the raw ADC sample. + // + g_i16TouchY = HWREG(ADC0_BASE + ADC_O_SSFIFO3); + + // + // The next configuration is the same as the initial configuration. + // Therefore, fall through into the initialization state to avoid + // duplicating the code. + // + } + + // + // The state machine is in its initial state + // + case TS_STATE_INIT: + { + // + // Clear the analog mode select for the XP pin. + // + HWREG(TS_XP_BASE + GPIO_O_AMSEL) &= ~TS_XP_PIN; + + // + // Configure the X and Y axis touch layers as outputs. + // + HWREG(TS_XP_BASE + GPIO_O_DIR) |= TS_XP_PIN; + HWREG(TS_XN_BASE + GPIO_O_DIR) |= TS_XN_PIN; + HWREG(TS_YP_BASE + GPIO_O_DIR) |= TS_YP_PIN; + HWREG(TS_YN_BASE + GPIO_O_DIR) |= TS_YN_PIN; + + // + // Drive one side of the X axis touch layer with VDD and the other + // with GND. Also, drive both sides of the Y axis layer with GND + // to discharge any residual voltage (so that a no-touch condition + // can be properly detected). + // + HWREG(TS_XP_BASE + GPIO_O_DATA + (TS_XP_PIN << 2)) = TS_XP_PIN; + HWREG(TS_XN_BASE + GPIO_O_DATA + (TS_XN_PIN << 2)) = 0; + HWREG(TS_YP_BASE + GPIO_O_DATA + (TS_YP_PIN << 2)) = 0; + HWREG(TS_YN_BASE + GPIO_O_DATA + (TS_YN_PIN << 2)) = 0; + + // + // Configure the sample sequence to capture the Y axis value. + // + HWREG(ADC0_BASE + ADC_O_SSMUX3) = TS_YP_ADC; + + // + // If this is the valid Y sample state, then there is a new X/Y + // sample pair. In that case, run the touch screen debouncer. + // + if(g_ui32TSState == TS_STATE_READ_Y) + { + TouchScreenDebouncer(); + } + + // + // The next sample will be an invalid X axis sample. + // + g_ui32TSState = TS_STATE_SKIP_X; + + // + // This state has been handled. + // + break; + } + } +} + +//***************************************************************************** +// +//! Initializes the touch screen driver. +//! +//! \param ui32SysClock is the frequency of the system clock. +//! +//! This function initializes the touch screen driver, beginning the process of +//! reading from the touch screen. This driver uses the following hardware +//! resources: +//! +//! - ADC 0 sample sequence 3 +//! - Timer 5 subtimer B +//! +//! \return None. +// +//***************************************************************************** +void +TouchScreenInit(uint32_t ui32SysClock) +{ + // + // Set the initial state of the touch screen driver's state machine. + // + g_ui32TSState = TS_STATE_INIT; + + // + // There is no touch screen handler initially. + // + g_pfnTSHandler = 0; + + // + // Enable the peripherals used by the touch screen interface. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER5); + + // + // Configure the ADC sample sequence used to read the touch screen reading. + // + ROM_ADCHardwareOversampleConfigure(ADC0_BASE, 4); + ROM_ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_TIMER, 0); + ROM_ADCSequenceStepConfigure(ADC0_BASE, 3, 0, + TS_YP_ADC | ADC_CTL_END | ADC_CTL_IE); + ROM_ADCSequenceEnable(ADC0_BASE, 3); + + // + // Enable the ADC sample sequence interrupt. + // + ROM_ADCIntEnable(ADC0_BASE, 3); + ROM_IntEnable(INT_ADC0SS3); + + // + // Configure the timer to trigger the sampling of the touch screen + // every 2.5 milliseconds. + // + if((HWREG(TIMER5_BASE + TIMER_O_CTL) & TIMER_CTL_TAEN) == 0) + { + ROM_TimerConfigure(TIMER5_BASE, (TIMER_CFG_SPLIT_PAIR | + TIMER_CFG_A_PWM | + TIMER_CFG_B_PERIODIC)); + } + ROM_TimerPrescaleSet(TIMER5_BASE, TIMER_B, 255); + ROM_TimerLoadSet(TIMER5_BASE, TIMER_B, ((ui32SysClock / 256) / 400) - 1); + TimerControlTrigger(TIMER5_BASE, TIMER_B, true); + + // + // Enable the timer. At this point, the touch screen state machine will + // sample and run every 2.5 ms. + // + ROM_TimerEnable(TIMER5_BASE, TIMER_B); +} + +//***************************************************************************** +// +//! Sets the callback function for touch screen events. +//! +//! \param pfnCallback is a pointer to the function to be called when touch +//! screen events occur. +//! +//! This function sets the address of the function to be called when touch +//! screen events occur. The events that are recognized are the screen being +//! touched (``pen down''), the touch position moving while the screen is +//! touched (``pen move''), and the screen no longer being touched (``pen +//! up''). +//! +//! \return None. +// +//***************************************************************************** +void +TouchScreenCallbackSet(int32_t (*pfnCallback)(uint32_t ui32Message, + int32_t i32X, int32_t i32Y)) +{ + // + // Save the pointer to the callback function. + // + g_pfnTSHandler = pfnCallback; +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c129x/drivers/touch.h b/boards/dk-tm4c129x/drivers/touch.h new file mode 100644 index 0000000..5459bdc --- /dev/null +++ b/boards/dk-tm4c129x/drivers/touch.h @@ -0,0 +1,61 @@ +//***************************************************************************** +// +// touch.h - Prototypes for the touch screen driver. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __DRIVERS_TOUCH_H__ +#define __DRIVERS_TOUCH_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern volatile int16_t g_i16TouchX; +extern volatile int16_t g_i16TouchY; +extern int16_t g_i16TouchMin; +extern void TouchScreenIntHandler(void); +extern void TouchScreenInit(uint32_t ui32SysClock); +extern void TouchScreenCallbackSet(int32_t (*pfnCallback)(uint32_t ui32Message, + int32_t i32X, + int32_t i32Y)); +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __DRIVERS_TOUCH_H__ diff --git a/boards/dk-tm4c129x/drivers/usb_sound.c b/boards/dk-tm4c129x/drivers/usb_sound.c new file mode 100644 index 0000000..3a858bf --- /dev/null +++ b/boards/dk-tm4c129x/drivers/usb_sound.c @@ -0,0 +1,769 @@ +//***************************************************************************** +// +// usb_sound.c - USB host audio handling functions. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "drivers/usb_sound.h" +#include "driverlib/gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhaudio.h" + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 768 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pHCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// The instance data for the USB host audio driver. +// +//***************************************************************************** +tUSBHostAudioInstance *g_psAudioInstance; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// This structure holds the state information for the USB audio device. +// +//***************************************************************************** +static struct +{ + // + // Save the application provided callback function. + // + tUSBBufferCallback pfnCallbackOut; + + // + // Save the application provided callback function. + // + tUSBBufferCallback pfnCallbackIn; + + // + // The event callback for the application. + // + tEventCallback pfnCallbackEvent; + + // + // Volume control multipliers calculated from the information received + // from the audio device. + // + uint32_t pui32Steps[3]; + + // + // The currently pending audio device events. + // + uint32_t ui32EventFlags; + + // + // The current state for the audio device. + // + volatile enum + { + // + // No device is present. + // + eStateNoDevice, + + // + // Audio device is ready. + // + eStateDeviceReady, + + // + // An unsupported device has been attached. + // + eStateUnknownDevice, + + // + // A power fault has occurred. + // + eStatePowerFault + } + iState; + +} g_sAudioState; + +//***************************************************************************** +// +// These defines are used with the ui32EventFlags in the g_sAudioState +// structure. +// +//***************************************************************************** +#define EVENT_OPEN 0x00000001 +#define EVENT_CLOSE 0x00000002 + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the host audio class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostAudioClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// This function was the callback function registered with the USB host audio +// class driver. The only two events that are handled at this point are the +// USBH_AUDIO_EVENT_OPEN and USBH_AUDIO_EVENT_CLOSE which indicate that a new +// audio device has been found or that an existing audio device has been +// disconnected. +// +//***************************************************************************** +static void +AudioCallback(tUSBHostAudioInstance *psAudioInstance, uint32_t ui32Event, + uint32_t ui32MsgParam, void *pvBuffer) +{ + switch(ui32Event) + { + // + // New USB audio device has been enabled. + // + case USBH_AUDIO_EVENT_OPEN: + { + // + // Set the EVENT_OPEN flag and let the main routine handle it. + // + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_OPEN) = 1; + + break; + } + + // + // USB audio device has been removed. + // + case USBH_AUDIO_EVENT_CLOSE: + { + // + // Set the EVENT_CLOSE flag and let the main routine handle it. + // + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_CLOSE) = 1; + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// Initializes the sound output. +// +// \param ui32Flags is unused as this point but is included for future +// functionality. +// \param pfnCallback is the event callback function for audio devices. +// +// This function prepares the sound driver to enumerate an audio device and +// prepares to play audio once a valid audio device is detected. The +// \e pfnCallback function can be used to receive callbacks when there are +// changes related to the audio device. The ui32Event parameter to the +// callback is one of the SOUND_EVENT_* values. +// +// \return None +// +//***************************************************************************** +void +USBSoundInit(uint32_t ui32Flags, tEventCallback pfnCallback) +{ + // + // Initialize the USB stack mode to force host mode. + // + USBStackModeSet(0, eUSBModeForceHost, 0); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the audio class driver. + // + g_psAudioInstance = USBHostAudioOpen(0, AudioCallback); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Initialize the USB controller for host mode operation. + // + USBHCDInit(0, g_pHCDPool, HCD_MEMORY_SIZE); + + // + // Save the event callback function. + // + g_sAudioState.pfnCallbackEvent = pfnCallback; +} + +//***************************************************************************** +// +// Sets the volume of the audio device. +// +// \param ui32Percent is the volume percentage, which must be between 0% +// (silence) and 100% (full volume), inclusive. +// +// This function sets the volume of the sound output to a value between +// silence (0%) and full volume (100%). +// +// \return None. +// +//***************************************************************************** +void +USBSoundVolumeSet(uint32_t ui32Percent) +{ + uint32_t ui32Value; + + // + // Ignore volume changes if there is no device present. + // + if(g_sAudioState.iState == eStateDeviceReady) + { + // + // Scale the voltage percentage to the decibel range provided by the + // USB audio device. + // + ui32Value = (g_sAudioState.pui32Steps[1] * ui32Percent) / 100; + USBHostAudioVolumeSet(g_psAudioInstance, 0, 1, ui32Value); + + ui32Value = (g_sAudioState.pui32Steps[2] * ui32Percent) / 100; + USBHostAudioVolumeSet(g_psAudioInstance, 0, 2, ui32Value); + } +} + +//***************************************************************************** +// +// Returns the current volume level. +// +// \param ui32Channel is the 0 based channel number to query. +// +// This function returns the current volume, specified as a percentage between +// 0% (silence) and 100% (full volume), inclusive. The \e ui32Channel value +// starts with 0 which is the master audio volume control interface. The +// remaining \e ui32Channel values provide access to various other audio +// channels, with 1 and 2 being left and right audio channels. +// +// \return Returns the current volume. +// +//***************************************************************************** +uint32_t +USBSoundVolumeGet(uint32_t ui32Channel) +{ + uint32_t ui32Volume; + + // + // Initialize the return value in case there is no USB device present. + // + ui32Volume = 0xffffffff; + + // + // Ignore volume request if there is no device present. + // + if(g_sAudioState.iState == eStateDeviceReady) + { + ui32Volume = USBHostAudioVolumeGet(g_psAudioInstance, 0, ui32Channel); + } + + return(ui32Volume); +} + +//***************************************************************************** +// +// This sets the current output audio format of the USB audio device. +// +// \param ui32SampleRate is the sample rate. +// \param ui32BitsPerSample is the number of bits per sample. +// \param ui32Channels is the number of channels. +// +// This sets the current audio format for the USB device that is currently +// connected. If there is no USB device connected or the format is not +// supported then the function returns a non-zero value. The function +// returns zero if the USB audio device was successfully configured to the +// requested audio format. +// +// \return Returns zero if the format was successfully set or returns an +// non-zero value if the format was not able to be set. +// +//***************************************************************************** +uint32_t +USBSoundOutputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32BitsPerSample, uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.iState != eStateDeviceReady) + { + return(1); + } + + // + // Call the USB Host Audio function to set the format. + // + return(USBHostAudioFormatSet(g_psAudioInstance, ui32SampleRate, + ui32BitsPerSample, ui32Channels, + USBH_AUDIO_FORMAT_OUT)); +} + +//***************************************************************************** +// +// This sets the current input audio format of the USB audio device +// +// \param ui32SampleRate is the sample rate. +// \param ui32BitsPerSample is the number of bits per sample. +// \param ui32Channels is the number of channels. +// +// This sets the current format for the USB device that is currently connect. +// If there is no USB device connected or the format is not supported then the +// function returns 0. The function returns 1 if the USB audio device +// was successfully configured to the requested format. +// +// \return Returns 1 if the format was successfully set or returns 0 if the +// format was not changed. +// +//***************************************************************************** +uint32_t +USBSoundInputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32BitsPerSample, uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.iState != eStateDeviceReady) + { + return(0); + } + + return(USBHostAudioFormatSet(g_psAudioInstance, ui32SampleRate, + ui32BitsPerSample, ui32Channels, + USBH_AUDIO_FORMAT_IN)); +} + +//***************************************************************************** +// +// Returns the current sample rate. +// +// This function returns the sample rate that was set by a call to +// USBSoundSetFormat(). This is needed to retrieve the exact sample rate that is +// in use in case the requested rate could not be matched exactly. +// +// \return The current sample rate in samples/second. +// +//***************************************************************************** +uint32_t +USBSoundOutputFormatGet(uint32_t ui32SampleRate, uint32_t ui32Bits, + uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.iState != eStateDeviceReady) + { + return(0); + } + + return(USBHostAudioFormatGet(g_psAudioInstance, ui32SampleRate, ui32Bits, + ui32Channels, USBH_AUDIO_FORMAT_OUT)); +} + +//***************************************************************************** +// +// Returns the current sample rate. +// +// This function returns the sample rate that was set by a call to +// USBSoundSetFormat(). This is needed to retrieve the exact sample rate that is +// in use in case the requested rate could not be matched exactly. +// +// \return The current sample rate in samples/second. +// +//***************************************************************************** +uint32_t +USBSoundInputFormatGet(uint32_t ui32SampleRate, uint32_t ui32Bits, + uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.iState != eStateDeviceReady) + { + return(0); + } + + return(USBHostAudioFormatGet(g_psAudioInstance, ui32SampleRate, ui32Bits, + ui32Channels, USBH_AUDIO_FORMAT_IN)); +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// \param pvData is actually a pointer to a tEventInfo structure. +// +// This function is called to inform the application when a USB event has +// occurred that is outside those related to the audio device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenerii8EventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +// \return None. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *psEventInfo; + + // + // Cast this pointer to its actual type. + // + psEventInfo = (tEventInfo *)pvData; + + switch(psEventInfo->ui32Event) + { + // + // Unknown device detected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + // + // An unknown device was detected. + // + g_sAudioState.iState = eStateUnknownDevice; + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_UNKNOWN_DEV, 1); + } + + break; + } + + // + // Device unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Handle the case where an unknown device is disconnected. + // + if(g_sAudioState.iState == eStateUnknownDevice) + { + g_sAudioState.iState = eStateNoDevice; + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_UNKNOWN_DEV, 0); + } + } + else + { + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_DISCONNECT, 0); + } + } + + break; + } + + // + // A power fault has occurred. + // + case USB_EVENT_POWER_FAULT: + { + // + // No power means no device is present. + // + g_sAudioState.iState = eStatePowerFault; + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This function passes along a buffer callback from the USB host audio driver +// so that the application can process or release the buffers. +// +//***************************************************************************** +void +USBHostAudioCallback(tUSBHostAudioInstance *psAudioInstance, + uint32_t ui32Event, uint32_t ui32Param, void *pvBuffer) +{ + // + // Only call the callback if it is actually present. + // + if(g_sAudioState.pfnCallbackOut) + { + g_sAudioState.pfnCallbackOut(pvBuffer, ui32Event, ui32Param); + } + + // + // Only call the callback if it is actually present. + // + if(g_sAudioState.pfnCallbackIn) + { + g_sAudioState.pfnCallbackIn(pvBuffer, ui32Event, ui32Param); + } +} + +//***************************************************************************** +// +// Starts output of a block of PCM audio samples. +// +// \param pvBuffer is a pointer to the audio data to play. +// \param ui32Size is the length of the data in bytes. +// \param pfnCallback is a function to call when this buffer has be played. +// +// This function starts the output of a block of PCM audio samples. +// +// \return This function returns a non-zero value if the buffer was accepted, +// and returns zero if the buffer was not accepted. +// +//***************************************************************************** +uint32_t +USBSoundBufferOut(const void *pvBuffer, uint32_t ui32Size, + tUSBBufferCallback pfnCallback) +{ + // + // If there is no device present or there is a pending buffer then just + // return with a failure. + // + if(g_sAudioState.iState != eStateDeviceReady) + { + return(0); + } + + // + // Save this buffer callback. + // + g_sAudioState.pfnCallbackOut = pfnCallback; + + // + // Pass the buffer aint32_t to the USB host audio driver for playback. + // + return(USBHostAudioPlay(g_psAudioInstance, (void *)pvBuffer, ui32Size, + USBHostAudioCallback)); +} + +//***************************************************************************** +// +// Requests a new block of PCM audio samples from a USB audio device. +// +// \param pvBuffer is a pointer to a location to store the audio data. +// \param ui32Size is the size of the pvData buffer in bytes. +// \param pfnCallback is a function to call when this buffer has new data. +// +// This function request a new block of PCM audio samples from a USB audio +// device. +// +// \return This function returns a non-zero value if the buffer was accepted, +// and returns zero if the buffer was not accepted. +// +//***************************************************************************** +uint32_t +USBSoundBufferIn(const void *pvBuffer, uint32_t ui32Size, + tUSBBufferCallback pfnCallback) +{ + // + // If there is no device present or there is a pending buffer then just + // return with a failure. + // + if(g_sAudioState.iState != eStateDeviceReady) + { + return(0); + } + + // + // Save this buffer callback. + // + g_sAudioState.pfnCallbackIn = pfnCallback; + + // + // Pass the buffer aint32_t to the USB host audio driver for input. + // + return(USBHostAudioRecord(g_psAudioInstance, (void *)pvBuffer, ui32Size, + USBHostAudioCallback)); +} + +//***************************************************************************** +// +// This function reads the audio volume settings for the USB audio device and +// saves them so that the volume can be scaled correctly. +// +//***************************************************************************** +static void +GetVolumeParameters(void) +{ + uint32_t ui32Max, ui32Min, ui32Res, ui32Channel; + + for(ui32Channel = 0; ui32Channel < 3; ui32Channel++) + { + ui32Max = USBHostAudioVolumeMaxGet(g_psAudioInstance, 0, ui32Channel); + ui32Min = USBHostAudioVolumeMinGet(g_psAudioInstance, 0, ui32Channel); + ui32Res = USBHostAudioVolumeResGet(g_psAudioInstance, 0, ui32Channel); + + g_sAudioState.pui32Steps[ui32Channel] = (ui32Max - ui32Min) / ui32Res; + } +} + +//***************************************************************************** +// +// The main routine for handling USB audio, this should be called periodically +// by the main program and pass in the amount of time in milliseconds that has +// elapsed since the last call. +// +//***************************************************************************** +void +USBSoundMain(void) +{ + // + // Tell the OTG library code how much time has passed in + // milliseconds since the last call. + // + USBHCDMain(); + + switch(g_sAudioState.iState) + { + // + // This is the running state where buttons are checked and the + // screen is updated. + // + case eStateDeviceReady: + { if(HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_CLOSE)) + { + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_CLOSE) = 0; + g_sAudioState.iState = eStateNoDevice; + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_DISCONNECT, 0); + } + } + break; + } + + // + // If there is no device then just wait for one. + // + case eStateNoDevice: + { + if(HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_OPEN)) + { + g_sAudioState.iState = eStateDeviceReady; + + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_OPEN) = 0; + + GetVolumeParameters(); + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_READY, 0); + } + } + break; + } + + // + // An unknown device was connected. + // + case eStateUnknownDevice: + { + break; + } + + // + // Something has caused a power fault. + // + case eStatePowerFault: + { + break; + } + + default: + { + break; + } + } +} diff --git a/boards/dk-tm4c129x/drivers/usb_sound.h b/boards/dk-tm4c129x/drivers/usb_sound.h new file mode 100644 index 0000000..0105f91 --- /dev/null +++ b/boards/dk-tm4c129x/drivers/usb_sound.h @@ -0,0 +1,81 @@ +//***************************************************************************** +// +// usb_sound.h - USB host audio handling header definitions. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __USB_SOUND_H__ +#define __USB_SOUND_H__ + +//***************************************************************************** +// +// The following are defines for the ui32Event value that is returned with the +// tEventCallback function provided to the USBSoundInit() function. +// +//***************************************************************************** + +// +// A USB audio device has been connected. +// +#define SOUND_EVENT_READY 0x00000001 + +// +// A USB device has been disconnected. +// +#define SOUND_EVENT_DISCONNECT 0x00000002 + +// +// An unknown device has been connected. +// +#define SOUND_EVENT_UNKNOWN_DEV 0x00000003 + +//***************************************************************************** +// +// Function prototypes. +// +//***************************************************************************** +typedef void (* tUSBBufferCallback)(void *pvBuffer, uint32_t ui32Event, + uint32_t ui32Value); +typedef void (* tEventCallback)(uint32_t ui32Event, uint32_t ui32Param); +extern void USBSoundMain(void); +extern void USBSoundInit(uint32_t ui32EnableReceive, + tEventCallback pfnCallback); +extern void USBSoundVolumeSet(uint32_t ui32Percent); +extern uint32_t USBSoundVolumeGet(uint32_t ui32Channel); +extern uint32_t USBSoundOutputFormatGet(uint32_t ui32SampleRate, + uint32_t ui32Bits, + uint32_t ui32Channels); +extern uint32_t USBSoundOutputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32Bits, + uint32_t ui32Channels); +extern uint32_t USBSoundInputFormatGet(uint32_t ui32SampleRate, + uint32_t ui32BitsPerSample, + uint32_t ui32Channels); +extern uint32_t USBSoundInputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32Bits, + uint32_t ui32Channels); +extern uint32_t USBSoundBufferOut(const void *pvData, uint32_t ui32Length, + tUSBBufferCallback pfnCallback); + +extern uint32_t USBSoundBufferIn(const void *pvData, uint32_t ui32Length, + tUSBBufferCallback pfnCallback); + +#endif diff --git a/boards/dk-tm4c129x/enet_io/Makefile b/boards/dk-tm4c129x/enet_io/Makefile new file mode 100644 index 0000000..f62a86b --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/Makefile @@ -0,0 +1,105 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Sample Ethernet I/O Control Application using lwIP 1.4.1. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../third_party/lwip-1.4.1/apps +VPATH+=../drivers +VPATH+=../../../../third_party/lwip-1.4.1/apps/httpserver_raw +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/lwip-1.4.1/apps +IPATH+=../../../../third_party/lwip-1.4.1/ports/tiva-tm4c129/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include/ipv4 +IPATH+=../../../../third_party + +# +# The default rule, which causes the Sample Ethernet I/O Control Application using lwIP 1.4.1 to be built. +# +all: ${COMPILER} +all: ${COMPILER}/enet_io.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Sample Ethernet I/O Control Application using lwIP 1.4.1. +# +${COMPILER}/enet_io.axf: ${COMPILER}/cgifuncs.o +${COMPILER}/enet_io.axf: ${COMPILER}/enet_io.o +${COMPILER}/enet_io.axf: ${COMPILER}/frame.o +${COMPILER}/enet_io.axf: ${COMPILER}/httpd.o +${COMPILER}/enet_io.axf: ${COMPILER}/io.o +${COMPILER}/enet_io.axf: ${COMPILER}/io_fs.o +${COMPILER}/enet_io.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/enet_io.axf: ${COMPILER}/locator.o +${COMPILER}/enet_io.axf: ${COMPILER}/lwiplib.o +${COMPILER}/enet_io.axf: ${COMPILER}/pinout.o +${COMPILER}/enet_io.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/enet_io.axf: ${COMPILER}/ustdlib.o +${COMPILER}/enet_io.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/enet_io.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/enet_io.axf: enet_io.ld +SCATTERgcc_enet_io=enet_io.ld +ENTRY_enet_io=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/enet_io/ccs/.ccsimportspec b/boards/dk-tm4c129x/enet_io/ccs/.ccsimportspec new file mode 100644 index 0000000..174931f --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/ccs/.ccsimportspec @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_io/ccs/.ccsproject b/boards/dk-tm4c129x/enet_io/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_io/ccs/.cproject b/boards/dk-tm4c129x/enet_io/ccs/.cproject new file mode 100644 index 0000000..7ba7c4f --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/ccs/.cproject @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_io/ccs/.project b/boards/dk-tm4c129x/enet_io/ccs/.project new file mode 100644 index 0000000..d8cbb29 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/ccs/.project @@ -0,0 +1,100 @@ + + + enet_io + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + cgifuncs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_io/cgifuncs.c + + + enet_io.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_io/enet_io.c + + + enet_io_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_io/enet_io_ccs.cmd + + + io.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_io/io.c + + + io_fs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_io/io_fs.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_io/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/locator.c + 1 + SW_ROOT/utils/locator.c + + + utils/lwiplib.c + 1 + SW_ROOT/utils/lwiplib.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/lwip-1.4.1/apps/httpserver_raw/httpd.c + 1 + SW_ROOT/third_party/lwip-1.4.1/apps/httpserver_raw/httpd.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/enet_io/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/enet_io/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/enet_io/ccs/Debug/enet_io.bin b/boards/dk-tm4c129x/enet_io/ccs/Debug/enet_io.bin new file mode 100644 index 0000000..0f8db9c Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/ccs/Debug/enet_io.bin differ diff --git a/boards/dk-tm4c129x/enet_io/ccs/Debug/enet_io.out b/boards/dk-tm4c129x/enet_io/ccs/Debug/enet_io.out new file mode 100644 index 0000000..b3d7b2b Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/ccs/Debug/enet_io.out differ diff --git a/boards/dk-tm4c129x/enet_io/ccs/macros.ini_initial b/boards/dk-tm4c129x/enet_io/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/enet_io/ccs/target_config.ccxml b/boards/dk-tm4c129x/enet_io/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_io/cgifuncs.c b/boards/dk-tm4c129x/enet_io/cgifuncs.c new file mode 100644 index 0000000..db6a699 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/cgifuncs.c @@ -0,0 +1,551 @@ +//***************************************************************************** +// +// cgifuncs.c - Helper functions related to CGI script parameter parsing. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +#include +#include +#include +#include "inc/hw_types.h" +#include "utils/ustdlib.h" +#include "cgifuncs.h" + +//***************************************************************************** +// +// Searches the list of parameters passed to a CGI handler and returns the +// index of a given parameter within that list. +// +// \param pcToFind is a pointer to a string containing the name of the +// parameter that is to be found. +// \param pcParam is an array of character pointers, each containing the name +// of a single parameter as encoded in the URI requesting the CGI. +// \param iNumParams is the number of elements in the pcParam array. +// +// This function searches an array of parameters to find the string passed in +// \e pcToFind. If the string is found, the index of that string within the +// \e pcParam array is returned, otherwise -1 is returned. +// +// \return Returns the index of string \e pcToFind within array \e pcParam +// or -1 if the string does not exist in the array. +// +//***************************************************************************** +int32_t +FindCGIParameter(const char *pcToFind, char *pcParam[], int32_t iNumParams) +{ + int32_t iLoop; + + // + // Scan through all the parameters in the array. + // + for(iLoop = 0; iLoop < iNumParams; iLoop++) + { + // + // Does the parameter name match the provided string? + // + if(strcmp(pcToFind, pcParam[iLoop]) == 0) + { + // + // We found a match - return the index. + // + return(iLoop); + } + } + + // + // If we drop out, the parameter was not found. + // + return(-1); +} + +//***************************************************************************** +// +// Determines whether a given character is a valid hexadecimal digit. +// +// \param cDigit is the ASCII character code to be checked for validity. +// +// This function checks the passed character to determime whether or not it is +// a valid hexadecimal digit. +// +// \return Returns \e true if the passed character is a valid hex digit or \e +// false otherwise +// +//***************************************************************************** +bool +IsValidHexDigit(const char cDigit) +{ + if(((cDigit >= '0') && (cDigit <= '9')) || + ((cDigit >= 'a') && (cDigit <= 'f')) || + ((cDigit >= 'A') && (cDigit <= 'F'))) + { + return(true); + } + else + { + return(false); + } +} + +//***************************************************************************** +// +// Converts an ASCII character to a hex digit value. +// +// \param cDigit is the ASCII character code to convert to a number. +// +// This function converts a passed ASCII character to a number assuming that +// the character is a valid hexadecimal digit. If the character is not a valid +// hex digit, the value 0xFF is returned. +// +// \return Returns the number represented by hex digit \e cDigit or 0xFF if +// the character passed is not valid hex. +// +//***************************************************************************** +unsigned char +HexDigit(const char cDigit) +{ + if((cDigit >= '0') && (cDigit <= '9')) + { + return(cDigit - '0'); + } + else + { + if((cDigit >= 'a') && (cDigit <= 'f')) + { + return((cDigit - 'a') + 10); + } + else + { + if((cDigit >= 'A') && (cDigit <= 'F')) + { + return((cDigit - 'A') + 10); + } + } + } + + // + // If we get here, we were passed an invalid hex digit so return 0xFF. + // + return(0xFF); +} + +//***************************************************************************** +// +// Decodes a single %xx escape sequence as an ASCII character. +// +// \param pcEncoded points to the ``%'' character at the start of a three +// character escape sequence which represents a single ASCII character. +// \param pcDecoded points to a byte which will be written with the decoded +// character assuming the escape sequence is valid. +// +// This function decodes a single escape sequence of the form ``%xy'' where +// x and y represent hexadecimal digits. If each digit is a valid hex digit, +// the function writes the decoded character to the pcDecoded buffer and +// returns true, else it returns false. +// +// \return Returns \b true on success or \b false if pcEncoded does not point +// to a valid escape sequence. +// +//***************************************************************************** +bool +DecodeHexEscape(const char *pcEncoded, char *pcDecoded) +{ + if((pcEncoded[0] != '%') || !IsValidHexDigit(pcEncoded[1]) || + !IsValidHexDigit(pcEncoded[2])) + { + return(false); + } + else + { + *pcDecoded = ((HexDigit(pcEncoded[1]) * 16) + + HexDigit(pcEncoded[2])); + return(true); + } +} + +//***************************************************************************** +// +// Encodes a string for use within an HTML tag, escaping non alphanumeric +// characters. +// +// \param pcDecoded is a pointer to a null terminated ASCII string. +// \param pcEncoded is a pointer to a storage for the encoded string. +// \param ui32Len is the number of bytes of storage pointed to by pcEncoded. +// +// This function encodes a string, adding escapes in place of any special, +// non-alphanumeric characters. If the encoded string is too long for the +// provided output buffer, the output will be truncated. +// +// \return Returns the number of characters written to the output buffer +// not including the terminating NULL. +// +//***************************************************************************** +uint32_t +EncodeFormString(const char *pcDecoded, char *pcEncoded, + uint32_t ui32Len) +{ + uint32_t ui32Loop; + uint32_t ui32Count; + + // + // Make sure we were not passed a tiny buffer. + // + if(ui32Len <= 1) + { + return(0); + } + + // + // Initialize our output character counter. + // + ui32Count = 0; + + // + // Step through each character of the input until we run out of data or + // space to put our output in. + // + for(ui32Loop = 0; pcDecoded[ui32Loop] && (ui32Count < (ui32Len - 1)); ui32Loop++) + { + switch(pcDecoded[ui32Loop]) + { + // + // Pass most characters without modification. + // + default: + { + pcEncoded[ui32Count++] = pcDecoded[ui32Loop]; + break; + } + + case '\'': + { + ui32Count += usnprintf(&pcEncoded[ui32Count], (ui32Len - ui32Count), + "'"); + break; + } + } + } + + return(ui32Count); +} + +//***************************************************************************** +// +// Decodes a string encoded as part of an HTTP URI. +// +// \param pcEncoded is a pointer to a null terminated string encoded as per +// RFC1738, section 2.2. +// \param pcDecoded is a pointer to storage for the decoded, null terminated +// string. +// \param ui32Len is the number of bytes of storage pointed to by pcDecoded. +// +// This function decodes a string which has been encoded using the method +// described in RFC1738, section 2.2 for URLs. If the decoded string is too +// long for the provided output buffer, the output will be truncated. +// +// \return Returns the number of character written to the output buffer, not +// including the terminating NULL. +// +//***************************************************************************** +uint32_t +DecodeFormString(const char *pcEncoded, char *pcDecoded, + uint32_t ui32Len) +{ + uint32_t ui32Loop; + uint32_t ui32Count; + bool bValid; + + ui32Count = 0; + ui32Loop = 0; + + // + // Keep going until we run out of input or fill the output buffer. + // + while(pcEncoded[ui32Loop] && (ui32Count < (ui32Len - 1))) + { + switch(pcEncoded[ui32Loop]) + { + // + // '+' in the encoded data is decoded as a space. + // + case '+': + { + pcDecoded[ui32Count++] = ' '; + ui32Loop++; + break; + } + + // + // '%' in the encoded data indicates that the following 2 + // characters indicate the hex ASCII code of the decoded character. + // + case '%': + { + if(pcEncoded[ui32Loop + 1] && pcEncoded[ui32Loop + 2]) + { + // + // Decode the escape sequence. + // + bValid = DecodeHexEscape(&pcEncoded[ui32Loop], + &pcDecoded[ui32Count]); + + // + // If the escape sequence was valid, move to the next + // output character. + // + if(bValid) + { + ui32Count++; + } + + // + // Skip past the escape sequence in the encoded string. + // + ui32Loop += 3; + } + else + { + // + // We reached the end of the string partway through an + // escape sequence so just ignore it and return the number + // of decoded characters found so far. + // + pcDecoded[ui32Count] = '\0'; + return(ui32Count); + } + break; + } + + // + // For all other characters, just copy the input to the output. + // + default: + { + pcDecoded[ui32Count++] = pcEncoded[ui32Loop++]; + break; + } + } + } + + // + // Terminate the string and return the number of characters we decoded. + // + pcDecoded[ui32Count] = '\0'; + return(ui32Count); +} + +//***************************************************************************** +// +// Ensures that a string passed represents a valid decimal number and, +// if so, converts that number to a int32_t. +// +// \param pcValue points to a null terminated string which should contain an +// ASCII representation of a decimal number. +// \param pi32Value points to storage which will receive the number represented +// by pcValue assuming the string is a valid decimal number. +// +// This function determines whether or not a given string represents a valid +// decimal number and, if it does, converts the string into a decimal number +// which is returned to the caller. +// +// \return Returns \b true if the string is a valid representation of a +// decimal number or \b false if not. + +//***************************************************************************** +bool +CheckDecimalParam(const char *pcValue, int32_t *pi32Value) +{ + uint32_t ui32Loop; + bool bStarted; + bool bFinished; + bool bNeg; + int32_t i32Accum; + + // + // Check that the string is a valid decimal number. + // + bStarted = false; + bFinished = false; + bNeg = false; + ui32Loop = 0; + i32Accum = 0; + + while(pcValue[ui32Loop]) + { + // + // Ignore whitespace before the string. + // + if(!bStarted) + { + if((pcValue[ui32Loop] == ' ') || (pcValue[ui32Loop] == '\t')) + { + ui32Loop++; + continue; + } + + // + // Ignore a + or - character as long as we have not started. + // + if((pcValue[ui32Loop] == '+') || (pcValue[ui32Loop] == '-')) + { + // + // If the string starts with a '-', remember to negate the + // result. + // + bNeg = (pcValue[ui32Loop] == '-') ? true : false; + bStarted = true; + ui32Loop++; + } + else + { + // + // We found something other than whitespace or a sign character + // so we start looking for numerals now. + // + bStarted = true; + } + } + + if(bStarted) + { + if(!bFinished) + { + // + // We expect to see nothing other than valid digit characters + // here. + // + if((pcValue[ui32Loop] >= '0') && (pcValue[ui32Loop] <= '9')) + { + i32Accum = (i32Accum * 10) + (pcValue[ui32Loop] - '0'); + } + else + { + // + // Have we hit whitespace? If so, check for no more + // characters until the end of the string. + // + if((pcValue[ui32Loop] == ' ') || (pcValue[ui32Loop] == '\t')) + { + bFinished = true; + } + else + { + // + // We got something other than a digit or whitespace so + // this makes the string invalid as a decimal number. + // + return(false); + } + } + } + else + { + // + // We are scanning for whitespace until the end of the string. + // + if((pcValue[ui32Loop] != ' ') && (pcValue[ui32Loop] != '\t')) + { + // + // We found something other than whitespace so the string + // is not valid. + // + return(false); + } + } + + // + // Move on to the next character in the string. + // + ui32Loop++; + } + } + + // + // If we drop out of the loop, the string must be valid. All we need to do + // now is negate the accumulated value if the string started with a '-'. + // + *pi32Value = bNeg ? -i32Accum : i32Accum; + return(true); +} + +//***************************************************************************** +// +// Searches the list of parameters passed to a CGI handler for a parameter +// with the given name and, if found, reads the parameter value as a decimal +// number. +// +// \param pcName is a pointer to a string containing the name of the +// parameter that is to be found. +// \param pcParam is an array of character pointers, each containing the name +// of a single parameter as encoded in the URI requesting the CGI. +// \param iNumParams is the number of elements in the pcParam array. +// \param pcValues is an array of values associated with each parameter from +// the pcParam array. +// \param pbError is a pointer that will be written to \b true if there is any +// error during the parameter parsing process (parameter not found, value is +// not a valid decimal number). +// +// This function searches an array of parameters to find the string passed in +// \e pcName. If the string is found, the corresponding parameter value is +// read from array pcValues and checked to make sure that it is a valid +// decimal number. If so, the number is returned. If any error is detected, +// parameter \e pbError is written to \b true. Note that \e pbError is NOT +// written if the parameter is successfully found and validated. This is to +// allow multiple parameters to be parsed without the caller needing to check +// return codes after each individual call. +// +// \return Returns the value of the parameter or 0 if an error is detected (in +// which case \e *pbError will be \b true). +// +//***************************************************************************** +int32_t +GetCGIParam(const char *pcName, char *pcParams[], char *pcValue[], + int32_t iNumParams, bool *pbError) +{ + int32_t i32Param; + int32_t i32Value; + bool bRetcode; + + // + // Is the parameter we are looking for in the list? + // + i32Param = FindCGIParameter(pcName, pcParams, iNumParams); + if(i32Param != -1) + { + // + // We found the parameter so now get its value. + // + bRetcode = CheckDecimalParam(pcValue[i32Param], &i32Value); + if(bRetcode) + { + // + // All is well - return the parameter value. + // + return(i32Value); + } + } + + // + // If we reach here, there was a problem so return 0 and set the error + // flag. + // + *pbError = true; + return(0); +} + diff --git a/boards/dk-tm4c129x/enet_io/cgifuncs.h b/boards/dk-tm4c129x/enet_io/cgifuncs.h new file mode 100644 index 0000000..6119ab4 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/cgifuncs.h @@ -0,0 +1,45 @@ +//***************************************************************************** +// +// cgifuncs.c - Helper functions related to CGI script parameter parsing. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __CGIFUNCS_H__ +#define __CGIFUNCS_H__ + +//***************************************************************************** +// +// Prototypes of functions exported by this module. +// +//***************************************************************************** +int32_t FindCGIParameter(const char *pcToFind, char *pcParam[], int32_t i32NumParams); +bool IsValidHexDigit(const char cDigit); +unsigned char HexDigit(const char cDigit); +bool DecodeHexEscape(const char *pcEncoded, char *pcDecoded); +uint32_t EncodeFormString(const char *pcDecoded, char *pcEncoded, + uint32_t ui32Len); +uint32_t DecodeFormString(const char *pcEncoded, char *pcDecoded, + uint32_t ui32Len); +bool CheckDecimalParam(const char *pcValue, int32_t *pi32Value); +int32_t GetCGIParam(const char *pcName, char *pcParams[], char *pcValue[], + int32_t i32NumParams, bool *pbError); + +#endif // __CGIFUNCS_H__ diff --git a/boards/dk-tm4c129x/enet_io/enet_io.c b/boards/dk-tm4c129x/enet_io/enet_io.c new file mode 100644 index 0000000..942835c --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/enet_io.c @@ -0,0 +1,927 @@ +//***************************************************************************** +// +// enet_io.c - I/O control via a web server. +// +// Copyright (c) 2007-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +#include +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/flash.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/timer.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "utils/locator.h" +#include "utils/lwiplib.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "httpserver_raw/httpd.h" +#include "grlib/grlib.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "io.h" +#include "cgifuncs.h" +#include "drivers/frame.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Ethernet-based I/O Control (enet_io)

+//! +//! This example application demonstrates web-based I/O control using the +//! Tiva Ethernet controller and the lwIP TCP/IP Stack. DHCP is used to +//! obtain an Ethernet address. If DHCP times out without obtaining an +//! address, a static IP address will be chosen using AutoIP. The address that +//! is selected will be shown on the QVGA display allowing you to access the +//! internal web pages served by the application via your normal web browser. +//! +//! Two different methods of controlling board peripherals via web pages are +//! illustrated via pages labeled ``IO Control Demo 1'' and ``IO Control +//! Demo 2'' in the navigation menu on the left of the application's home page. +//! In both cases, the example allows you to toggle the state of the user LED +//! on the board and set the speed of a graphical animation on the display. +//! +//! ``IO Control Demo 1'' uses JavaScript running in the web browser to send +//! HTTP requests for particular special URLs. These special URLs are +//! intercepted in the file system support layer (io_fs.c) and used to +//! control the LED and animation. Responses generated by the board are +//! returned to the browser and inserted into the page HTML dynamically by +//! more JavaScript code. +//! +//! ``IO Control Demo 2'' uses standard HTML forms to pass parameters to CGI +//! (Common Gateway Interface) handlers running on the board. These handlers +//! process the form data and control the animation and LED as requested before +//! sending a response page (in this case, the original form) back to the +//! browser. The application registers the names and handlers for each of its +//! CGIs with the HTTPD server during initialization and the server calls +//! these handlers after parsing URL parameters each time one of the CGI URLs +//! is requested. +//! +//! Information on the state of the various controls in the second demo is +//! inserted into the served HTML using SSI (Server Side Include) tags which +//! are parsed by the HTTPD server in the application. As with the CGI +//! handlers, the application registers its list of SSI tags and a handler +//! function with the web server during initialization and this handler is +//! called whenever any registered tag is found in a .shtml, .ssi, .shtm or +//! .xml file being served to the browser. +//! +//! In addition to LED and animation speed control, the second example also +//! allows a line of text to be sent to the board for display on the LCD +//! panel. This is included to illustrate the decoding of HTTP text strings. +//! +//! Note that the web server used by this example has been modified from the +//! example shipped with the basic lwIP package. Additions include SSI and +//! CGI support along with the ability to have the server automatically insert +//! the HTTP headers rather than having these built in to the files in the +//! file system image. +//! +//! Source files for the internal file system image can be found in the ``fs'' +//! directory. If any of these files are changed, the file system image +//! (io_fsdata.h) should be rebuilt by running the following command from the +//! enet_io directory: +//! +//! ../../../../tools/bin/makefsfile -i fs -o io_fsdata.h -r -h -q +//! +//! For additional details on lwIP, refer to the lwIP web page at: +//! http://savannah.nongnu.org/projects/lwip/ +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines for setting up the system clock. +// +//***************************************************************************** +#define SYSTICKHZ 100 +#define SYSTICKMS (1000 / SYSTICKHZ) + +//***************************************************************************** +// +// Interrupt priority definitions. The top 3 bits of these values are +// significant with lower values indicating higher priority interrupts. +// +//***************************************************************************** +#define SYSTICK_INT_PRIORITY 0x80 +#define ETHERNET_INT_PRIORITY 0xC0 + +//***************************************************************************** +// +// A set of flags. The flag bits are defined as follows: +// +// 0 -> An indicator that the animation timer interrupt has occurred. +// +//***************************************************************************** +#define FLAG_TICK 0 +static volatile unsigned long g_ulFlags; + +//***************************************************************************** +// +// The graphics context used by the application. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The Y extent of the box used to display the text string sent from the +// remote web browser. +// +//***************************************************************************** +#define TEXT_BOX_TOP 140 +#define TEXT_BOX_BOTTOM 184 + +//***************************************************************************** +// +// The position and size of the box used to display the simple animation. +// +//***************************************************************************** +#define ANIM_TOP 210 +#define ANIM_HEIGHT 20 +#define ANIM_LEFT 40 +#define ANIM_WIDTH (320 - (2 * ANIM_LEFT)) + +//***************************************************************************** +// +// The RGB value we use to change the color each time the animated bar cycles +// back to the start. +// +//***************************************************************************** +#define COLOR_INCREMENT 0x00306040 + +//***************************************************************************** +// +// Position and movement granularity for the status indicator shown while +// the IP address is being determined. +// +//***************************************************************************** +#define STATUS_X 40 +#define STATUS_Y 50 +#define MAX_STATUS_X (320 - (2 * STATUS_X)) +#define ANIM_STEP_SIZE 8 + +//***************************************************************************** +// +// External Application references. +// +//***************************************************************************** +extern void httpd_init(void); + +//***************************************************************************** +// +// SSI tag indices for each entry in the g_pcSSITags array. +// +//***************************************************************************** +#define SSI_INDEX_LEDSTATE 0 +#define SSI_INDEX_FORMVARS 1 +#define SSI_INDEX_SPEED 2 + +//***************************************************************************** +// +// This array holds all the strings that are to be recognized as SSI tag +// names by the HTTPD server. The server will call SSIHandler to request a +// replacement string whenever the pattern (where tagname +// appears in the following array) is found in ".ssi", ".shtml" or ".shtm" +// files that it serves. +// +//***************************************************************************** +static const char *g_pcConfigSSITags[] = +{ + "LEDtxt", // SSI_INDEX_LEDSTATE + "FormVars", // SSI_INDEX_FORMVARS + "speed" // SSI_INDEX_SPEED +}; + +//***************************************************************************** +// +// The number of individual SSI tags that the HTTPD server can expect to +// find in our configuration pages. +// +//***************************************************************************** +#define NUM_CONFIG_SSI_TAGS (sizeof(g_pcConfigSSITags) / sizeof (char *)) + +//***************************************************************************** +// +// Prototypes for the various CGI handler functions. +// +//***************************************************************************** +static char *ControlCGIHandler(int32_t iIndex, int32_t i32NumParams, char *pcParam[], + char *pcValue[]); +static char *SetTextCGIHandler(int32_t iIndex, int32_t i32NumParams, char *pcParam[], + char *pcValue[]); + +//***************************************************************************** +// +// Prototype for the main handler used to process server-side-includes for the +// application's web-based configuration screens. +// +//***************************************************************************** +static int32_t SSIHandler(int32_t iIndex, char *pcInsert, int32_t iInsertLen); + +//***************************************************************************** +// +// CGI URI indices for each entry in the g_psConfigCGIURIs array. +// +//***************************************************************************** +#define CGI_INDEX_CONTROL 0 +#define CGI_INDEX_TEXT 1 + +//***************************************************************************** +// +// This array is passed to the HTTPD server to inform it of special URIs +// that are treated as common gateway interface (CGI) scripts. Each URI name +// is defined along with a pointer to the function which is to be called to +// process it. +// +//***************************************************************************** +static const tCGI g_psConfigCGIURIs[] = +{ + { "/iocontrol.cgi", (tCGIHandler)ControlCGIHandler }, // CGI_INDEX_CONTROL + { "/settxt.cgi", (tCGIHandler)SetTextCGIHandler } // CGI_INDEX_TEXT +}; + +//***************************************************************************** +// +// The number of individual CGI URIs that are configured for this system. +// +//***************************************************************************** +#define NUM_CONFIG_CGI_URIS (sizeof(g_psConfigCGIURIs) / sizeof(tCGI)) + +//***************************************************************************** +// +// The file sent back to the browser by default following completion of any +// of our CGI handlers. Each individual handler returns the URI of the page +// to load in response to it being called. +// +//***************************************************************************** +#define DEFAULT_CGI_RESPONSE "/io_cgi.ssi" + +//***************************************************************************** +// +// The file sent back to the browser in cases where a parameter error is +// detected by one of the CGI handlers. This should only happen if someone +// tries to access the CGI directly via the broswer command line and doesn't +// enter all the required parameters alongside the URI. +// +//***************************************************************************** +#define PARAM_ERROR_RESPONSE "/perror.htm" + +#define JAVASCRIPT_HEADER \ + "\n" + +//***************************************************************************** +// +// Timeout for DHCP address request (in seconds). +// +//***************************************************************************** +#ifndef DHCP_EXPIRE_TIMER_SECS +#define DHCP_EXPIRE_TIMER_SECS 45 +#endif + +//***************************************************************************** +// +// The positions of the circles in the animation used while waiting for an IP +// address. +// +//***************************************************************************** +const int32_t g_ppi32CirclePos[][2] = +{ + { + 12, 0 + }, + { + 8, -9 + }, + { + 0, -12 + }, + { + -8, -9 + }, + { + -12, 0 + }, + { + -8, 9 + }, + { + 0, 12 + }, + { + 8, 9 + } +}; + +//***************************************************************************** +// +// The colors of the circles in the animation used while waiting for an IP +// address. +// +//***************************************************************************** +const uint32_t g_pui32CircleColor[] = +{ + 0x111111, + 0x333333, + 0x555555, + 0x777777, + 0x999999, + 0xbbbbbb, + 0xdddddd, + 0xffffff, +}; + +//***************************************************************************** +// +// The current color index for the animation used while waiting for an IP +// address. +// +//***************************************************************************** +uint32_t g_ui32ColorIdx; + +//***************************************************************************** +// +// The current IP address. +// +//***************************************************************************** +uint32_t g_ui32IPAddress; + +//***************************************************************************** +// +// The application's graphics context. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The system clock frequency. Used by the SD card driver. +// +//***************************************************************************** +uint32_t g_ui32SysClock; + + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This CGI handler is called whenever the web browser requests iocontrol.cgi. +// +//***************************************************************************** +static char * +ControlCGIHandler(int32_t iIndex, int32_t i32NumParams, char *pcParam[], char *pcValue[]) +{ + int32_t i32LEDState, i32Speed; + bool bParamError; + + // + // We have not encountered any parameter errors yet. + // + bParamError = false; + + // + // Get each of the expected parameters. + // + i32LEDState = FindCGIParameter("LEDOn", pcParam, i32NumParams); + i32Speed = GetCGIParam("speed_percent", pcParam, pcValue, i32NumParams, + &bParamError); + + // + // Was there any error reported by the parameter parser? + // + if(bParamError || (i32Speed < 0) || (i32Speed > 100)) + { + return(PARAM_ERROR_RESPONSE); + } + + // + // We got all the parameters and the values were within the expected ranges + // so go ahead and make the changes. + // + io_set_led((i32LEDState == -1) ? false : true); + io_set_animation_speed(i32Speed); + + // + // Send back the default response page. + // + return(DEFAULT_CGI_RESPONSE); +} + +//***************************************************************************** +// +// This CGI handler is called whenever the web browser requests settxt.cgi. +// +//***************************************************************************** +static char * +SetTextCGIHandler(int32_t i32Index, int32_t i32NumParams, char *pcParam[], char *pcValue[]) +{ + long lStringParam; + char pcDecodedString[48]; + tRectangle sRect; + + // + // Find the parameter that has the string we need to display. + // + lStringParam = FindCGIParameter("DispText", pcParam, i32NumParams); + + // + // If the parameter was not found, show the error page. + // + if(lStringParam == -1) + { + return(PARAM_ERROR_RESPONSE); + } + + // + // The parameter is present. We need to decode the text for display. + // + DecodeFormString(pcValue[lStringParam], pcDecodedString, 48); + + // + // Erase the previous string and overwrite it with the new one. + // + sRect.i16XMin = 15; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 15 -1 ; + sRect.i16YMin = TEXT_BOX_TOP + 6; + sRect.i16YMax = TEXT_BOX_BOTTOM - 2; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + + // + // Now draw the new string after setting the clipping rectangle. + // + GrContextClipRegionSet(&g_sContext, &sRect); + GrContextForegroundSet(&g_sContext, ClrYellow); + GrStringDrawCentered(&g_sContext, pcDecodedString, -1, + (sRect.i16XMin + sRect.i16XMax) / 2, + (sRect.i16YMin + sRect.i16YMax) / 2, 0); + + // + // Reset the clipping rectangle to the full screen. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMin = 0; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + GrContextClipRegionSet(&g_sContext, &sRect); + + // + // Tell the HTTPD server which file to send back to the client. + // + return(DEFAULT_CGI_RESPONSE); +} + +//***************************************************************************** +// +// This function is called by the HTTP server whenever it encounters an SSI +// tag in a web page. The iIndex parameter provides the index of the tag in +// the g_pcConfigSSITags array. This function writes the substitution text +// into the pcInsert array, writing no more than iInsertLen characters. +// +//***************************************************************************** +static int32_t +SSIHandler(int32_t iIndex, char *pcInsert, int32_t iInsertLen) +{ + // + // Which SSI tag have we been passed? + // + switch(iIndex) + { + case SSI_INDEX_LEDSTATE: + io_get_ledstate(pcInsert, iInsertLen); + break; + + case SSI_INDEX_FORMVARS: + usnprintf(pcInsert, iInsertLen, + "%sls=%d;\nsp=%d;\n%s", + JAVASCRIPT_HEADER, + io_is_led_on(), + io_get_animation_speed(), + JAVASCRIPT_FOOTER); + break; + + case SSI_INDEX_SPEED: + io_get_animation_speed_string(pcInsert, iInsertLen); + break; + + default: + usnprintf(pcInsert, iInsertLen, "??"); + break; + } + + // + // Tell the server how many characters our insert string contains. + // + return(strlen(pcInsert)); +} + +//***************************************************************************** +// +// The interrupt handler for the SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Call the lwIP timer handler. + // + lwIPTimer(SYSTICKMS); +} + +//***************************************************************************** +// +// The interrupt handler for the timer used to pace the animation. +// +//***************************************************************************** +void +AnimTimerIntHandler(void) +{ + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER2_BASE, TIMER_TIMA_TIMEOUT); + + // + // Indicate that a timer interrupt has occurred. + // + HWREGBITW(&g_ulFlags, FLAG_TICK) = 1; +} + +//***************************************************************************** +// +// Display an lwIP type IP Address. +// +//***************************************************************************** +void +DisplayIPAddress(uint32_t ui32Addr, uint32_t ui32Col, uint32_t ui32Row) +{ + char pcBuf[16]; + + // + // Convert the IP Address into a string. + // + usprintf(pcBuf, "%d.%d.%d.%d", ui32Addr & 0xff, (ui32Addr >> 8) & 0xff, + (ui32Addr >> 16) & 0xff, (ui32Addr >> 24) & 0xff); + + // + // Display the string. + // + GrStringDraw(&g_sContext, pcBuf, -1, ui32Col, ui32Row, false); +} + +//***************************************************************************** +// +// Required by lwIP library to support any host-related timer functions. +// +//***************************************************************************** +void +lwIPHostTimerHandler(void) +{ + uint32_t ui32Idx, ui32NewIPAddress, ui32Width; + tRectangle sRect; + + // + // Get the width and height of the display. + // + ui32Width = GrContextDpyWidthGet(&g_sContext); + + // + // Get the current IP address. + // + ui32NewIPAddress = lwIPLocalIPAddrGet(); + + // + // See if the IP address has changed. + // + if(ui32NewIPAddress != g_ui32IPAddress) + { + // + // Clear the display. + // + sRect.i16XMin = STATUS_X; + sRect.i16YMin = STATUS_Y - 22; + sRect.i16XMax = MAX_STATUS_X; + sRect.i16YMax = TEXT_BOX_TOP - 10; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // See if there is an IP address assigned. + // + if(ui32NewIPAddress == 0xffffffff) + { + // + // Indicate that there is no link. + // + GrStringDrawCentered(&g_sContext, "Waiting for link", -1, + ui32Width / 2, STATUS_Y, false); + } + else if(ui32NewIPAddress == 0) + { + // + // There is no IP address, so indicate that the DHCP process is + // running. + // + GrStringDrawCentered(&g_sContext, "Waiting for IP address", -1, + ui32Width / 2, STATUS_Y, false); + } + else + { + // + // Display the new IP address information. + // + GrStringDraw(&g_sContext, "IP Address:", -1, 60, STATUS_Y, + false); + GrStringDraw(&g_sContext, "Subnet Mask:", -1, 60, STATUS_Y + 20, false); + GrStringDraw(&g_sContext, "Gateway:", -1, 60, STATUS_Y + 40, false); + DisplayIPAddress(ui32NewIPAddress, ui32Width / 2, STATUS_Y); + DisplayIPAddress(lwIPLocalNetMaskGet(), ui32Width / 2, STATUS_Y + 20); + DisplayIPAddress(lwIPLocalGWAddrGet(), ui32Width / 2, + STATUS_Y + 40); + } + + // + // Save the new IP address. + // + g_ui32IPAddress = ui32NewIPAddress; + } + + // + // If there is not an IP address, draw the animated circle. + // + if((ui32NewIPAddress == 0) || (ui32NewIPAddress == 0xffffffff)) + { + // + // Loop through the circles in the animation. + // + for(ui32Idx = 0; ui32Idx < 8; ui32Idx++) + { + // + // Draw this circle. + // + GrContextForegroundSet(&g_sContext, + g_pui32CircleColor[(g_ui32ColorIdx + + ui32Idx) & 7]); + GrCircleFill(&g_sContext, + (ui32Width / 2) + g_ppi32CirclePos[ui32Idx][0], + STATUS_Y + g_ppi32CirclePos[ui32Idx][1] + 44, + 2); + } + + // + // Increment the color index. + // + g_ui32ColorIdx++; + } +} + +//***************************************************************************** +// +// This example demonstrates the use of the Ethernet Controller and lwIP +// TCP/IP stack to control various peripherals on the board via a web +// browser. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32User0, ui32User1, ui32AnimPos, ui32Color; + uint8_t pui8MACArray[8]; + tRectangle sRect; + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "enet-io"); + + // + // Configure SysTick for a periodic interrupt. + // + ROM_SysTickPeriodSet(g_ui32SysClock / SYSTICKHZ); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Configure the hardware MAC address for Ethernet Controller filtering of + // incoming packets. The MAC address will be stored in the non-volatile + // USER0 and USER1 registers. + // + ROM_FlashUserGet(&ui32User0, &ui32User1); + if((ui32User0 == 0xffffffff) || (ui32User1 == 0xffffffff)) + { + // + // We should never get here. This is an error if the MAC address has + // not been programmed into the device. Exit the program. + // + GrContextForegroundSet(&g_sContext, ClrRed); + GrStringDrawCentered(&g_sContext, "MAC Address", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + (GrContextDpyHeightGet(&g_sContext) / 2) - 4, + false); + GrStringDrawCentered(&g_sContext, "Not Programmed!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + (GrContextDpyHeightGet(&g_sContext) / 2) + 16, + false); + while(1) + { + } + } + + // + // Tell the user what we are doing just now. + // + GrStringDrawCentered(&g_sContext, "Waiting for IP", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + STATUS_Y, false); + + // + // Draw the box inside which a text string sent from browser will be + // displayed. + // + sRect.i16XMin = 10; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - sRect.i16XMin - 1; + sRect.i16YMin = TEXT_BOX_TOP; + sRect.i16YMax = TEXT_BOX_BOTTOM - 1; + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + GrContextFontSet(&g_sContext, g_psFontCmss18); + GrStringDraw(&g_sContext, " Browser Text: ", -1, sRect.i16XMin + 6, + TEXT_BOX_TOP - 10, true); + + // + // Draw the box inside which we will draw the animation. + // + sRect.i16XMin = ANIM_LEFT; + sRect.i16XMax = (ANIM_LEFT + ANIM_WIDTH) - 1; + sRect.i16YMin = ANIM_TOP; + sRect.i16YMax = (ANIM_TOP + ANIM_HEIGHT) - 1; + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Initialize the animation variables. + // + ui32AnimPos = ANIM_LEFT + 1; + ui32Color = ClrRed; + + // + // Convert the 24/24 split MAC address from NV ram into a 32/16 split + // MAC address needed to program the hardware registers, then program + // the MAC address into the Ethernet Controller registers. + // + pui8MACArray[0] = ((ui32User0 >> 0) & 0xff); + pui8MACArray[1] = ((ui32User0 >> 8) & 0xff); + pui8MACArray[2] = ((ui32User0 >> 16) & 0xff); + pui8MACArray[3] = ((ui32User1 >> 0) & 0xff); + pui8MACArray[4] = ((ui32User1 >> 8) & 0xff); + pui8MACArray[5] = ((ui32User1 >> 16) & 0xff); + + // + // Initialze the lwIP library, using DHCP. + // + lwIPInit(g_ui32SysClock, pui8MACArray, 0, 0, 0, IPADDR_USE_DHCP); + + // + // Setup the device locator service. + // + LocatorInit(); + LocatorMACAddrSet(pui8MACArray); + LocatorAppTitleSet("DK-TM4C129X enet_io"); + + // + // Initialize a sample httpd server. + // + httpd_init(); + + // + // Set the interrupt priorities. We set the SysTick interrupt to a higher + // priority than the Ethernet interrupt to ensure that the file system + // tick is processed if SysTick occurs while the Ethernet handler is being + // processed. This is very likely since all the TCP/IP and HTTP work is + // done in the context of the Ethernet interrupt. + // + ROM_IntPrioritySet(INT_EMAC0, ETHERNET_INT_PRIORITY); + ROM_IntPrioritySet(FAULT_SYSTICK, SYSTICK_INT_PRIORITY); + + // + // Pass our tag information to the HTTP server. + // + http_set_ssi_handler((tSSIHandler)SSIHandler, g_pcConfigSSITags, + NUM_CONFIG_SSI_TAGS); + + // + // Pass our CGI handlers to the HTTP server. + // + http_set_cgi_handlers(g_psConfigCGIURIs, NUM_CONFIG_CGI_URIS); + + // + // Initialize IO controls + // + io_init(); + + // + // Loop forever, processing the on-screen animation. All other work is + // done in the interrupt handlers. + // + while(1) + { + // + // Wait for a new tick to occur. + // + while(!g_ulFlags) + { + // + // Do nothing. + // + } + + // + // Clear the flag now that we have seen it. + // + HWREGBITW(&g_ulFlags, FLAG_TICK) = 0; + + // + // Update the bar position and check for wrap. + // + ui32AnimPos ++; + if(ui32AnimPos == ((ANIM_LEFT + ANIM_WIDTH) - 1)) + { + // + // We've reached the right edge so change color and move back + // to the left. + // + ui32AnimPos = ANIM_LEFT + 1; + ui32Color += COLOR_INCREMENT; + } + + // + // Now we draw the new bar. Note that we need to temporarily + // disable the ethernet interrupt while doing this since we have + // been naughty and set this app up so that it accesses the graphics + // library from two different contexts. + // + ROM_IntDisable(INT_EMAC0); + GrContextForegroundSet(&g_sContext, ui32Color); + GrLineDrawV(&g_sContext, ui32AnimPos, (ANIM_TOP + 1), + (ANIM_TOP + ANIM_HEIGHT) - 2); + ROM_IntEnable(INT_EMAC0); + } +} diff --git a/boards/dk-tm4c129x/enet_io/enet_io.ewd b/boards/dk-tm4c129x/enet_io/enet_io.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/enet_io.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/enet_io/enet_io.ewp b/boards/dk-tm4c129x/enet_io/enet_io.ewp new file mode 100644 index 0000000..33e2468 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/enet_io.ewp @@ -0,0 +1,831 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\cgifuncs.c + + + $PROJ_DIR$\enet_io.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\..\..\..\third_party\lwip-1.4.1\apps\httpserver_raw\httpd.c + + + $PROJ_DIR$\io.c + + + $PROJ_DIR$\io_fs.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\..\..\..\utils\locator.c + + + $PROJ_DIR$\..\..\..\..\utils\lwiplib.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/enet_io/enet_io.icf b/boards/dk-tm4c129x/enet_io/enet_io.icf new file mode 100644 index 0000000..4ecb234 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/enet_io.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// enet_io.icf - Linker configuration file for enet_io. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/enet_io/enet_io.ld b/boards/dk-tm4c129x/enet_io/enet_io.ld new file mode 100644 index 0000000..047b06c --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/enet_io.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * enet_io.ld - Linker configuration file for enet_io. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/enet_io/enet_io.sct b/boards/dk-tm4c129x/enet_io/enet_io.sct new file mode 100644 index 0000000..d23f897 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/enet_io.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; enet_io.sct - Linker configuration file for enet_io. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/enet_io/enet_io.uvopt b/boards/dk-tm4c129x/enet_io/enet_io.uvopt new file mode 100644 index 0000000..c0a3546 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/enet_io.uvopt @@ -0,0 +1,443 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + enet_io + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\cgifuncs.c + cgifuncs.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\enet_io.c + enet_io.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\lwip-1.4.1\apps\httpserver_raw\httpd.c + httpd.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\io.c + io.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\io_fs.c + io_fs.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\locator.c + locator.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\lwiplib.c + lwiplib.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 11 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 14 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 15 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
diff --git a/boards/dk-tm4c129x/enet_io/enet_io.uvproj b/boards/dk-tm4c129x/enet_io/enet_io.uvproj new file mode 100644 index 0000000..1aef381 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/enet_io.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + enet_io + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + enet_io + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\enet_io.bin .\rvmdk\enet_io.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + .;..;..\..\..\..;..\..\..\..\third_party\lwip-1.4.1\apps;..\..\..\..\third_party\lwip-1.4.1\ports\tiva-tm4c129\include;..\..\..\..\third_party\lwip-1.4.1\src\include;..\..\..\..\third_party\lwip-1.4.1\src\include\ipv4;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + enet_io.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cgifuncs.c + 1 + .\cgifuncs.c + + + enet_io.c + 1 + .\enet_io.c + + + frame.c + 1 + ..\drivers\frame.c + + + httpd.c + 1 + ..\..\..\..\third_party\lwip-1.4.1\apps\httpserver_raw\httpd.c + + + io.c + 1 + .\io.c + + + io_fs.c + 1 + .\io_fs.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + locator.c + 1 + ..\..\..\..\utils\locator.c + + + lwiplib.c + 1 + ..\..\..\..\utils\lwiplib.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
diff --git a/boards/dk-tm4c129x/enet_io/enet_io_ccs.cmd b/boards/dk-tm4c129x/enet_io/enet_io_ccs.cmd new file mode 100644 index 0000000..e688818 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/enet_io_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * enet_io_ccs.cmd - CCS linker configuration file for enet_io. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/enet_io/ewarm/Exe/enet_io.bin b/boards/dk-tm4c129x/enet_io/ewarm/Exe/enet_io.bin new file mode 100644 index 0000000..9afec66 Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/ewarm/Exe/enet_io.bin differ diff --git a/boards/dk-tm4c129x/enet_io/ewarm/Exe/enet_io.out b/boards/dk-tm4c129x/enet_io/ewarm/Exe/enet_io.out new file mode 100644 index 0000000..8a7e136 Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/ewarm/Exe/enet_io.out differ diff --git a/boards/dk-tm4c129x/enet_io/fs/404.htm b/boards/dk-tm4c129x/enet_io/fs/404.htm new file mode 100644 index 0000000..d8b3630 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/fs/404.htm @@ -0,0 +1,12 @@ + + + + + + +
+

404 - file not found

+

Try here instead.

+
+ + diff --git a/boards/dk-tm4c129x/enet_io/fs/about.htm b/boards/dk-tm4c129x/enet_io/fs/about.htm new file mode 100644 index 0000000..25e5cd2 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/fs/about.htm @@ -0,0 +1,33 @@ + + + + +DK-TM4C129X Development Kit + + + + + +

About Texas Instruments

+
+
+Texas Instruments (TI) is a global +analog +and digital +semiconductor IC design +and manufacturing company. In addition to analog technologies, +digital signal processing (DSP) +and +microcontroller (MCU) +semiconductors, TI designs and manufactures semiconductor solutions for analog +and digital embedded and application processing. In the microcontroller space, +TI offers the broadest range of embedded control products, from ultra-low-power +MSP430™ +MCUs and high-performance +TMS320C2000™ +real-time controllers, to the 32 bit general-purpose ARM®-based MCUs of the +Tiva™ C Series +product line. Read more about us on the web at +www.ti.com. + + \ No newline at end of file diff --git a/boards/dk-tm4c129x/enet_io/fs/block.htm b/boards/dk-tm4c129x/enet_io/fs/block.htm new file mode 100644 index 0000000..e46fb3e --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/fs/block.htm @@ -0,0 +1,18 @@ + + + + + +DK-TM4C129X Development Kit + + + + +

TM4C129XNCZAD Block Diagram

+
+
+
+ +
+ + diff --git a/boards/dk-tm4c129x/enet_io/fs/block.jpg b/boards/dk-tm4c129x/enet_io/fs/block.jpg new file mode 100644 index 0000000..3056bb0 Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/fs/block.jpg differ diff --git a/boards/dk-tm4c129x/enet_io/fs/dk-tm4c129x.jpg b/boards/dk-tm4c129x/enet_io/fs/dk-tm4c129x.jpg new file mode 100644 index 0000000..2affcf0 Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/fs/dk-tm4c129x.jpg differ diff --git a/boards/dk-tm4c129x/enet_io/fs/favicon.ico b/boards/dk-tm4c129x/enet_io/fs/favicon.ico new file mode 100644 index 0000000..d14b5d9 Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/fs/favicon.ico differ diff --git a/boards/dk-tm4c129x/enet_io/fs/index.htm b/boards/dk-tm4c129x/enet_io/fs/index.htm new file mode 100644 index 0000000..e911367 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/fs/index.htm @@ -0,0 +1,57 @@ + + + + + + DK-TM4C129X Development Kit + + + + + + +
+ + + + + + +
+ + Texas Instruments + + +
+ Tiva™ C Series TM4C129X Development Kit +
+
+ DK-TM4C129X +
+
+ + TM4C + +
+

+
+ +
+
+
+

+ Copyright © 2013-2014 Texas Instruments Incorporated. All rights reserved. +
+ + diff --git a/boards/dk-tm4c129x/enet_io/fs/io_cgi.ssi b/boards/dk-tm4c129x/enet_io/fs/io_cgi.ssi new file mode 100644 index 0000000..47d015f --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/fs/io_cgi.ssi @@ -0,0 +1,146 @@ + + + + + + I/O Control Demo 2 + + + + + + + +
+ + + + + + +
+ + Texas Instruments + + +
+ Tiva™ C Series TM4C129X Development Kit +
+
+ DK-TM4C129X +
+
+ + TM4C + +
+

+
+ +
+ + + + + + +
+
+

I/O Control Demo 2

+
+
+
    This demonstration shows another method of performing control and status reporting. This time, we use Server Side Include tags to replace text in the page as it is being server from the Tiva C Series DK board and standard HTML forms to send data to a CGI handler + running on the board.  This example does cause the page to be reloaded whenever form data is submitted but it  involves less complex HTML to perform the task. +
    +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + Control + + Current + + New +
    LED State + + + +
    Animation Speed + + + +
    + +
    +
    +
    +
      +
      + + + + + + +
      +
      + + + + + + +
      + Display this text on the screen:
      + + +
      +
      +
      +
      +
      +
      +
      +

      + Copyright © 2013-2014 Texas Instruments Incorporated. All rights reserved. +
      + + diff --git a/boards/dk-tm4c129x/enet_io/fs/io_http.htm b/boards/dk-tm4c129x/enet_io/fs/io_http.htm new file mode 100644 index 0000000..62c7c57 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/fs/io_http.htm @@ -0,0 +1,63 @@ + + + + + + + I/O Control Demo 1 + + + + + + + + + + + +
      +
      +

      I/O Control Demo 1

      +
      +
      +

      This demonstration shows how to perform control and status reporting using HTTP requests embedded within Javascript code on the web page itself. Using this method, it is possible to update sections of text on the current page without the need to refresh the + entire page.

      +

      Toggle USER LED and report the state of the LED

      + + + + + + + + +
      + + USER LED: +
      -
      +
      +

      +

      Set the speed of the animation on the display. Speed is expressed as a percentage.

      + + + + + + + + + + + +
      Current Speed: +
      -
      +
      + + + %
      +

      +
      + + + \ No newline at end of file diff --git a/boards/dk-tm4c129x/enet_io/fs/javascript.js b/boards/dk-tm4c129x/enet_io/fs/javascript.js new file mode 100644 index 0000000..74d90e0 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/fs/javascript.js @@ -0,0 +1,191 @@ + + +window.onload = function() +{ + document.getElementById('about').onclick = loadAbout; + document.getElementById('overview').onclick = loadOverview; + document.getElementById('block').onclick = loadBlock; + document.getElementById('io_http').onclick = loadIOHttp; +} + +function loadAbout() +{ + loadPage("about.htm"); + return false; +} + +function loadOverview() +{ + loadPage("overview.htm"); + return false; +} + +function loadBlock() +{ + loadPage("block.htm"); + return false; +} + +function loadIOHttp() +{ + loadPage("io_http.htm"); + ledstateGet(); + speedGet(); + return false; +} + +function SetFormDefaults() +{ + document.iocontrol.LEDOn.checked = ls; + document.iocontrol.speed_percent.value = sp; +} + +function toggle_led() +{ + var req = false; + + function ToggleComplete() + { + if(req.readyState == 4) + { + if(req.status == 200) + { + document.getElementById("ledstate").innerHTML = "
      " + + req.responseText + "
      "; + } + } + } + + if(window.XMLHttpRequest) + { + req = new XMLHttpRequest(); + } + else if(window.ActiveXObject) + { + req = new ActiveXObject("Microsoft.XMLHTTP"); + } + if(req) + { + req.open("GET", "/cgi-bin/toggle_led?id" + Math.random(), true); + req.onreadystatechange = ToggleComplete; + req.send(null); + } +} + +function speedSet() +{ + var req = false; + var speed_txt = document.getElementById("speed_percent"); + function speedComplete() + { + if(req.readyState == 4) + { + if(req.status == 200) + { + document.getElementById("current_speed").innerHTML = + "
      " + req.responseText + "
      "; + } + } + } + if(window.XMLHttpRequest) + { + req = new XMLHttpRequest(); + } + else if(window.ActiveXObject) + { + req = new ActiveXObject("Microsoft.XMLHTTP"); + } + if(req) + { + req.open("GET", "/cgi-bin/set_speed?percent=" + speed_txt.value + + "&id" + Math.random(), true); + req.onreadystatechange = speedComplete; + req.send(null); + } +} + +function ledstateGet() +{ + var led = false; + function ledComplete() + { + if(led.readyState == 4) + { + if(led.status == 200) + { + document.getElementById("ledstate").innerHTML = "
      " + + led.responseText + "
      "; + } + } + } + + if(window.XMLHttpRequest) + { + led = new XMLHttpRequest(); + } + else if(window.ActiveXObject) + { + led = new ActiveXObject("Microsoft.XMLHTTP"); + } + if(led) + { + led.open("GET", "/ledstate?id=" + Math.random(), true); + led.onreadystatechange = ledComplete; + led.send(null); + } +} + +function speedGet() +{ + var req = false; + function speedReturned() + { + if(req.readyState == 4) + { + if(req.status == 200) + { + document.getElementById("current_speed").innerHTML = "
      " + req.responseText + "
      "; + } + } + } + + if(window.XMLHttpRequest) + { + req = new XMLHttpRequest(); + } + else if(window.ActiveXObject) + { + req = new ActiveXObject("Microsoft.XMLHTTP"); + } + if(req) + { + req.open("GET", "/get_speed?id=" + Math.random(), true); + req.onreadystatechange = speedReturned; + req.send(null); + } +} + +function loadPage(page) +{ + if(window.XMLHttpRequest) + { + xmlhttp = new XMLHttpRequest(); + } + else + { + xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + + xmlhttp.open("GET", page, true); + xmlhttp.setRequestHeader("Content-type", + "application/x-www-form-urlencoded"); + xmlhttp.send(); + + xmlhttp.onreadystatechange = function () + { + if((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) + { + document.getElementById("content").innerHTML = xmlhttp.responseText; + } + } +} diff --git a/boards/dk-tm4c129x/enet_io/fs/javascript_load.js b/boards/dk-tm4c129x/enet_io/fs/javascript_load.js new file mode 100644 index 0000000..cb52985 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/fs/javascript_load.js @@ -0,0 +1,11 @@ + + +window.onload = function() +{ + document.getElementById('about').onclick = loadAbout; + document.getElementById('overview').onclick = loadOverview; + document.getElementById('block').onclick = loadBlock; + document.getElementById('io_http').onclick = loadIOHttp; + + loadPage("about.htm"); +} diff --git a/boards/dk-tm4c129x/enet_io/fs/overview.htm b/boards/dk-tm4c129x/enet_io/fs/overview.htm new file mode 100644 index 0000000..66fddbe --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/fs/overview.htm @@ -0,0 +1,30 @@ + + + + + +DK-TM4C129X Development Kit + + + + +

      Tiva™ C Series Product Line

      +
      +
      +As the first ARM® Cortex™-M4 microcontrollers (MCUs) to be +implemented on TI's proprietary 65-nm process technology, the Tiva C Series +provides customers an opportunity to increase their connectivity integration +without sacrificing price, performance, or power consumption. Every C Series +MCU integrates a floating-point core and high-performance analog while still +providing low-power modes to offer a great set of functional options. Today's +engineers understand that designs require more than hardware alone. Often, the +greatest challenge is software and +TivaWare for C Series is a +free library of C files that include both peripheral-level and +application-level code in source and in ROM for every Tiva C Series MCU. This +offering delivers USB, CAN, graphics, and sensor application libraries so +customers can focus their efforts on building applications instead of +programming their connectivity peripherals. The Tiva C Series provides an +excellent baseline for home, building, and industrial applications. + + diff --git a/boards/dk-tm4c129x/enet_io/fs/perror.htm b/boards/dk-tm4c129x/enet_io/fs/perror.htm new file mode 100644 index 0000000..b6a77ff --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/fs/perror.htm @@ -0,0 +1,74 @@ + + + + + + Form Parameter Error + + + + + +
      + + + + + + +
      + + Texas Instruments + + +
      + Tiva™ C Series TM4C129X Development Kit +
      +
      + DK-TM4C129X +
      +
      + + TM4C + +
      +

      +
      + +
      + + + + + + +
      +
      +

      Parameter Error

      +
      +
      +

      +

      Oops - one of the parameters sent to the board +
      was either missing, invalid or out of range. 

      +

      Please try again! +
      +

      +
      +
      +
      +

      + Copyright © 2013-2014 Texas Instruments Incorporated. All rights reserved. +
      + + diff --git a/boards/dk-tm4c129x/enet_io/fs/styles.css b/boards/dk-tm4c129x/enet_io/fs/styles.css new file mode 100644 index 0000000..3403359 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/fs/styles.css @@ -0,0 +1,104 @@ +/* Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. */ + +/* Styling for the entire document. */ +body +{ + background-color: white; + color: black; + font-family: Ariel,Helvetica,sans-serif; +} + +/* Styling for the heading div. */ +#heading +{ + clear: both; + margin-bottom: 10px; +} + +#heading_h1 +{ + font-size: 2em; + font-weight: bold; + text-align: center; +} + +#heading_h2 +{ + font-size: 1.25em; + font-weight: bold; + text-align: center; +} + +#heading hr +{ + border-bottom: 1px solid #ff0000; + border-top: 1px solid #ff0000; +} + +#heading a img +{ + border: 0; +} + +/* Styling for the menu div. */ +#menu +{ + float: left; + margin-bottom: 10px; + width: 225px; +} + +#menu ul +{ + list-style-type: none; + margin: 0; + padding: 0; +} + +#menu a:link, #menu a:visited +{ + background-color: #ff0000; + color: #ffffff; + display: block; + font-weight: bold; + margin-bottom: 2px; + margin-top: 2px; + padding: 4px; + text-align: center; + text-decoration: none; + width: 200px; +} + +#menu a:hover, #menu a:active +{ + background-color: #bf0000; +} + +/* Styling for the content div. */ +#content +{ + margin-bottom: 10px; + margin-left: 225px; +} + +#content_heading +{ + font-size: 1.5em; + font-weight: bold; + text-align: center; +} + +/* Styling for the footing div. */ +#footing +{ + clear: both; + font-size: .75em; + font-style: italic; + text-align: right; +} + +#footing hr +{ + border-bottom: 1px solid #ff0000; + border-top: 1px solid #ff0000; +} diff --git a/boards/dk-tm4c129x/enet_io/fs/ti.jpg b/boards/dk-tm4c129x/enet_io/fs/ti.jpg new file mode 100644 index 0000000..5d1669c Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/fs/ti.jpg differ diff --git a/boards/dk-tm4c129x/enet_io/fs/tm4c.jpg b/boards/dk-tm4c129x/enet_io/fs/tm4c.jpg new file mode 100644 index 0000000..1672a1d Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/fs/tm4c.jpg differ diff --git a/boards/dk-tm4c129x/enet_io/gcc/enet_io.axf b/boards/dk-tm4c129x/enet_io/gcc/enet_io.axf new file mode 100644 index 0000000..51963fa Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/gcc/enet_io.axf differ diff --git a/boards/dk-tm4c129x/enet_io/gcc/enet_io.bin b/boards/dk-tm4c129x/enet_io/gcc/enet_io.bin new file mode 100644 index 0000000..e42f844 Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/gcc/enet_io.bin differ diff --git a/boards/dk-tm4c129x/enet_io/io.c b/boards/dk-tm4c129x/enet_io/io.c new file mode 100644 index 0000000..e8d90bd --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/io.c @@ -0,0 +1,259 @@ +//***************************************************************************** +// +// io.c - I/O routines for the enet_io example application. +// +// Copyright (c) 2007-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_pwm.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/pwm.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "utils/ustdlib.h" +#include "io.h" + +//***************************************************************************** +// +// Hardware connection for the user LED. +// +//***************************************************************************** +#define LED_PORT_BASE GPIO_PORTQ_BASE +#define LED_PIN GPIO_PIN_7 + +//***************************************************************************** +// +// The system clock speed. +// +//***************************************************************************** +extern uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// The current speed of the on-screen animation expressed as a percentage. +// +//***************************************************************************** +volatile unsigned long g_ulAnimSpeed = 10; + +//***************************************************************************** +// +// Set the timer used to pace the animation. We scale the timer timeout such +// that a speed of 100% causes the timer to tick once every 4 mS (250Hz). +// +//***************************************************************************** +static void +io_set_timer(unsigned long ulSpeedPercent) +{ + unsigned long ulTimeout; + + // + // Turn the timer off while we are mucking with it. + // + ROM_TimerDisable(TIMER2_BASE, TIMER_A); + + // + // If the speed is non-zero, we reset the timeout. If it is zero, we + // just leave the timer disabled. + // + if(ulSpeedPercent) + { + ulTimeout = g_ui32SysClock / 250; + ulTimeout = (ulTimeout * 100 ) / ulSpeedPercent; + + ROM_TimerLoadSet(TIMER2_BASE, TIMER_A, ulTimeout); + ROM_TimerEnable(TIMER2_BASE, TIMER_A); + } +} + +//***************************************************************************** +// +// Initialize the IO used in this demo +// +//***************************************************************************** +void +io_init(void) +{ + // + // Configure Port F0 for as an output for the status LED. + // + ROM_GPIOPinTypeGPIOOutput(LED_PORT_BASE, LED_PIN); + + // + // Initialize LED to OFF (0) + // + ROM_GPIOPinWrite(LED_PORT_BASE, LED_PIN, 0); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2); + + // + // Configure the timer used to pace the animation. + // + ROM_TimerConfigure(TIMER2_BASE, TIMER_CFG_PERIODIC); + + // + // Setup the interrupts for the timer timeouts. + // + ROM_IntEnable(INT_TIMER2A); + ROM_TimerIntEnable(TIMER2_BASE, TIMER_TIMA_TIMEOUT); + + // + // Set the timer for the current animation speed. This enables the + // timer as a side effect. + // + io_set_timer(g_ulAnimSpeed); +} + +//***************************************************************************** +// +// Set the status LED on or off. +// +//***************************************************************************** +void +io_set_led(bool bOn) +{ + // + // Turn the LED on or off as requested. + // + ROM_GPIOPinWrite(LED_PORT_BASE, LED_PIN, bOn ? LED_PIN : 0); +} + +//***************************************************************************** +// +// Return LED state +// +//***************************************************************************** +void +io_get_ledstate(char * pcBuf, int iBufLen) +{ + // + // Get the state of the LED + // + if(ROM_GPIOPinRead(LED_PORT_BASE, LED_PIN)) + { + usnprintf(pcBuf, iBufLen, "ON"); + } + else + { + usnprintf(pcBuf, iBufLen, "OFF"); + } + +} + +//***************************************************************************** +// +// Return LED state as an integer, 1 on, 0 off. +// +//***************************************************************************** +int +io_is_led_on(void) +{ + // + // Get the state of the LED + // + if(ROM_GPIOPinRead(LED_PORT_BASE, LED_PIN)) + { + return(true); + } + else + { + return(0); + } +} + +//***************************************************************************** +// +// Set the speed of the animation shown on the display. In this version, the +// speed is described as a decimal number encoded as an ASCII string. +// +//***************************************************************************** +void +io_set_animation_speed_string(char *pcBuf) +{ + unsigned long ulSpeed; + + // + // Parse the passed parameter as a decimal number. + // + ulSpeed = 0; + while((*pcBuf >= '0') && (*pcBuf <= '9')) + { + ulSpeed *= 10; + ulSpeed += (*pcBuf - '0'); + pcBuf++; + } + + // + // If the number is valid, set the new speed. + // + if(ulSpeed <= 100) + { + g_ulAnimSpeed = ulSpeed; + io_set_timer(g_ulAnimSpeed); + } +} + +//***************************************************************************** +// +// Set the speed of the animation shown on the display. +// +//***************************************************************************** +void +io_set_animation_speed(unsigned long ulSpeed) +{ + // + // If the number is valid, set the new speed. + // + if(ulSpeed <= 100) + { + g_ulAnimSpeed = ulSpeed; + io_set_timer(g_ulAnimSpeed); + } +} + +//***************************************************************************** +// +// Get the current animation speed as an ASCII string. +// +//***************************************************************************** +void +io_get_animation_speed_string(char *pcBuf, int iBufLen) +{ + usnprintf(pcBuf, iBufLen, "%d%%", g_ulAnimSpeed); +} + +//***************************************************************************** +// +// Get the current animation speed as a number. +// +//***************************************************************************** +unsigned long +io_get_animation_speed(void) +{ + return(g_ulAnimSpeed); +} diff --git a/boards/dk-tm4c129x/enet_io/io.h b/boards/dk-tm4c129x/enet_io/io.h new file mode 100644 index 0000000..35ba0f7 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/io.h @@ -0,0 +1,58 @@ +//***************************************************************************** +// +// io.h - Prototypes for I/O routines for the enet_io example. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __IO_H__ +#define __IO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Exported global variables. +// +//***************************************************************************** +extern volatile unsigned long g_ulAnimSpeed; + +//***************************************************************************** +// +// Exported function prototypes. +// +//***************************************************************************** +void io_init(void); +void io_set_led(bool bOn); +void io_get_ledstate(char *pcBuf, int iBufLen); +void io_set_animation_speed_string(char *pcBuf); +void io_get_animation_speed_string(char *pcBuf, int iBufLen); +void io_set_animation_speed(unsigned long ulSpeedPercent); +unsigned long io_get_animation_speed(void); +int io_is_led_on(void); + +#ifdef __cplusplus +} +#endif + +#endif // __IO_H__ diff --git a/boards/dk-tm4c129x/enet_io/io_fs.c b/boards/dk-tm4c129x/enet_io/io_fs.c new file mode 100644 index 0000000..7472793 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/io_fs.c @@ -0,0 +1,316 @@ +//***************************************************************************** +// +// io_fs.c - File System Processing for enet_io application. +// +// Copyright (c) 2007-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +#include +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "driverlib/rom.h" +#include "driverlib/ssi.h" +#include "utils/lwiplib.h" +#include "utils/ustdlib.h" +#include "httpserver_raw/httpd.h" +#include "httpserver_raw/fs.h" +#include "httpserver_raw/fsdata.h" +#include "io.h" + +//***************************************************************************** +// +// Include the web file system data for this application. This file is +// generated by the makefsfile utility, using the following command: +// +// ../../../../tools/bin/makefsfile -i fs -o io_fsdata.h -r -h -q +// +// If any changes are made to the static content of the web pages served by the +// application, this script must be used to regenerate io_fsdata.h in order +// for those changes to be picked up by the web server. +// +//***************************************************************************** +#include "io_fsdata.h" + +//***************************************************************************** +// +// Open a file and return a handle to the file, if found. Otherwise, +// return NULL. This function also looks for special file names used to +// provide specific status information or to control various subsystems. +// These file names are used by the JavaScript on the "IO Control Demo 1" +// example web page. +// +//***************************************************************************** +struct fs_file * +fs_open(const char *pcName) +{ + const struct fsdata_file *psTree; + struct fs_file *psFile = NULL; + + // + // Allocate memory for the file system structure. + // + psFile = mem_malloc(sizeof(struct fs_file)); + if(psFile == NULL) + { + return(NULL); + } + + // + // Process request to toggle STATUS LED + // + if(ustrncmp(pcName, "/cgi-bin/toggle_led", 19) == 0) + { + static char pcBuf[4]; + + // + // Toggle the STATUS LED + // + io_set_led(!io_is_led_on()); + + // + // Get the new state of the LED + // + io_get_ledstate(pcBuf, 4); + + psFile->data = pcBuf; + psFile->len = strlen(pcBuf); + psFile->index = psFile->len; + psFile->pextension = NULL; + + // + // Return the psFile system pointer. + // + return(psFile); + } + + // + // Request for LED State? + // + else if(ustrncmp(pcName, "/ledstate", 9) == 0) + { + static char pcBuf[4]; + + // + // Get the state of the LED + // + io_get_ledstate(pcBuf, 4); + + psFile->data = pcBuf; + psFile->len = strlen(pcBuf); + psFile->index = psFile->len; + psFile->pextension = NULL; + return(psFile); + } + // + // Request for the animation speed? + // + else if(ustrncmp(pcName, "/get_speed", 10) == 0) + { + static char pcBuf[6]; + + // + // Get the current animation speed as a string. + // + io_get_animation_speed_string(pcBuf, 6); + + psFile->data = pcBuf; + psFile->len = strlen(pcBuf); + psFile->index = psFile->len; + psFile->pextension = NULL; + return(psFile); + } + // + // Set the animation speed? + // + else if(ustrncmp(pcName, "/cgi-bin/set_speed?percent=", 12) == 0) + { + static char pcBuf[6]; + + // + // Extract the parameter and set the actual speed requested. + // + io_set_animation_speed_string((char*)pcName + 27); + + // + // Get the current speed setting as a string to send back. + // + io_get_animation_speed_string(pcBuf, 6); + + psFile->data = pcBuf; + psFile->len = strlen(pcBuf); + psFile->index = psFile->len; + psFile->pextension = NULL; + return(psFile); + } + // + // If I can't find it there, look in the rest of the main psFile system + // + else + { + // + // Initialize the psFile system tree pointer to the root of the linked list. + // + psTree = FS_ROOT; + + // + // Begin processing the linked list, looking for the requested file name. + // + while(NULL != psTree) + { + // + // Compare the requested file "pcName" to the file name in the + // current node. + // + if(ustrncmp(pcName, (char *)psTree->name, psTree->len) == 0) + { + // + // Fill in the data pointer and length values from the + // linked list node. + // + psFile->data = (char *)psTree->data; + psFile->len = psTree->len; + + // + // For now, we setup the read index to the end of the file, + // indicating that all data has been read. + // + psFile->index = psTree->len; + + // + // We are not using any file system extensions in this + // application, so set the pointer to NULL. + // + psFile->pextension = NULL; + + // + // Exit the loop and return the file system pointer. + // + break; + } + + // + // If we get here, we did not find the file at this node of the linked + // list. Get the next element in the list. + // + psTree = psTree->next; + } + } + + // + // If we didn't find the file, ptTee will be NULL. Make sure we + // return a NULL pointer if this happens. + // + if(NULL == psTree) + { + mem_free(psFile); + psFile = NULL; + } + + // + // Return the file system pointer. + // + return(psFile); +} + +//***************************************************************************** +// +// Close an opened file designated by the handle. +// +//***************************************************************************** +void +fs_close(struct fs_file *psFile) +{ + // + // Free the main psFile system object. + // + mem_free(psFile); +} + +//***************************************************************************** +// +// Read the next chunk of data from the file. Return the iCount of data +// that was read. Return 0 if no data is currently available. Return +// a -1 if at the end of file. +// +//***************************************************************************** +int +fs_read(struct fs_file *psFile, char *pcBuffer, int iCount) +{ + int iAvailable; + + // + // Check to see if a command (pextension = 1). + // + if(psFile->pextension == (void *)1) + { + // + // Nothing to do for this file type. + // + psFile->pextension = NULL; + return(-1); + } + + // + // Check to see if more data is available. + // + if(psFile->len == psFile->index) + { + // + // There is no remaining data. Return a -1 for EOF indication. + // + return(-1); + } + + // + // Determine how much data we can copy. The minimum of the 'iCount' + // parameter or the available data in the file system buffer. + // + iAvailable = psFile->len - psFile->index; + if(iAvailable > iCount) + { + iAvailable = iCount; + } + + // + // Copy the data. + // + memcpy(pcBuffer, psFile->data + iAvailable, iAvailable); + psFile->index += iAvailable; + + // + // Return the count of data that we copied. + // + return(iAvailable); +} + +//***************************************************************************** +// +// Determine the number of bytes left to read from the file. +// +//***************************************************************************** +int +fs_bytes_left(struct fs_file *psFile) +{ + // + // Return the number of bytes left to be read from this file. + // + return(psFile->len - psFile->index); +} diff --git a/boards/dk-tm4c129x/enet_io/io_fsdata.h b/boards/dk-tm4c129x/enet_io/io_fsdata.h new file mode 100644 index 0000000..db05c9b --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/io_fsdata.h @@ -0,0 +1,12700 @@ +//*************************************************************************** +// +// File System Image. +// +// This file was automatically generated using the makefsfile utility. +// +//*************************************************************************** + +static const uint8_t data_404_htm[] = +{ + /* /404.htm */ + 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, + 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, + 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x3e, 0x0a, + 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, + 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x0a, + 0x3c, 0x68, 0x31, 0x3e, 0x34, 0x30, 0x34, 0x20, + 0x2d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x0a, 0x3c, 0x68, + 0x33, 0x3e, 0x54, 0x72, 0x79, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, + 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, 0x3c, 0x2f, + 0x61, 0x3e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, + 0x61, 0x64, 0x2e, 0x3c, 0x2f, 0x68, 0x33, 0x3e, + 0x0a, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x3e, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, + 0x6c, 0x3e, 0x0a, +}; + +static const uint8_t data_about_htm[] = +{ + /* /about.htm */ + 0x2f, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x2e, 0x68, + 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x0a, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3e, 0x44, 0x4b, 0x2d, 0x54, + 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, + 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x4b, 0x69, 0x74, 0x3c, + 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, + 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x68, 0x74, + 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, + 0x3d, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x73, + 0x65, 0x74, 0x3d, 0x55, 0x54, 0x46, 0x2d, 0x38, + 0x22, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, + 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, + 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x2e, 0x63, + 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, + 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, + 0x22, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, + 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, + 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, + 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x2f, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, + 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, + 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x3e, + 0x41, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x54, 0x65, + 0x78, 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3c, + 0x2f, 0x70, 0x3e, 0x0a, 0x3c, 0x68, 0x72, 0x3e, + 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x54, 0x65, + 0x78, 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, + 0x28, 0x54, 0x49, 0x29, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x0a, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, + 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x2f, 0x67, 0x65, + 0x6e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2e, 0x74, 0x73, 0x70, 0x3f, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x3d, 0x32, + 0x39, 0x35, 0x36, 0x36, 0x22, 0x3e, 0x61, 0x6e, + 0x61, 0x6c, 0x6f, 0x67, 0x3c, 0x2f, 0x61, 0x3e, + 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x0a, 0x3c, 0x61, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, + 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x2f, 0x64, 0x6f, 0x63, 0x73, + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x73, 0x65, + 0x6d, 0x69, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x63, + 0x74, 0x6f, 0x72, 0x20, 0x49, 0x43, 0x20, 0x64, + 0x65, 0x73, 0x69, 0x67, 0x6e, 0x3c, 0x2f, 0x61, + 0x3e, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, + 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x6e, 0x79, 0x2e, 0x20, 0x49, 0x6e, 0x20, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x61, 0x6c, + 0x6f, 0x67, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, + 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, + 0x0a, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x64, 0x73, 0x70, 0x2f, 0x64, 0x6f, 0x63, + 0x73, 0x2f, 0x64, 0x73, 0x70, 0x68, 0x6f, 0x6d, + 0x65, 0x2e, 0x74, 0x73, 0x70, 0x3f, 0x73, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x3d, + 0x34, 0x36, 0x22, 0x3e, 0x64, 0x69, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x20, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x44, + 0x53, 0x50, 0x29, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, + 0x61, 0x6e, 0x64, 0x0a, 0x3c, 0x61, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x66, + 0x6f, 0x63, 0x75, 0x73, 0x2e, 0x74, 0x69, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x63, 0x75, 0x2f, + 0x64, 0x6f, 0x63, 0x73, 0x2f, 0x6d, 0x63, 0x75, + 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x74, 0x73, 0x70, + 0x3f, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x3d, 0x31, 0x30, 0x31, 0x22, 0x3e, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x20, + 0x28, 0x4d, 0x43, 0x55, 0x29, 0x3c, 0x2f, 0x61, + 0x3e, 0x0a, 0x73, 0x65, 0x6d, 0x69, 0x63, 0x6f, + 0x6e, 0x64, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x2c, 0x20, 0x54, 0x49, 0x20, 0x64, 0x65, 0x73, + 0x69, 0x67, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x73, 0x65, + 0x6d, 0x69, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x63, + 0x74, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x6f, 0x67, + 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x6d, 0x62, + 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x2e, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, + 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x0a, + 0x54, 0x49, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x72, + 0x6f, 0x61, 0x64, 0x65, 0x73, 0x74, 0x20, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x73, 0x2c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x75, 0x6c, 0x74, 0x72, 0x61, 0x2d, 0x6c, 0x6f, + 0x77, 0x2d, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x0a, + 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6d, 0x63, 0x75, 0x2f, 0x64, 0x6f, 0x63, 0x73, + 0x2f, 0x6d, 0x63, 0x75, 0x70, 0x72, 0x6f, 0x64, + 0x6f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x74, 0x73, 0x70, 0x3f, 0x73, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x3d, 0x39, + 0x35, 0x26, 0x74, 0x61, 0x62, 0x49, 0x64, 0x3d, + 0x31, 0x34, 0x30, 0x26, 0x66, 0x61, 0x6d, 0x69, + 0x6c, 0x79, 0x49, 0x64, 0x3d, 0x33, 0x34, 0x32, + 0x22, 0x3e, 0x4d, 0x53, 0x50, 0x34, 0x33, 0x30, + 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, 0x3c, + 0x2f, 0x61, 0x3e, 0x0a, 0x4d, 0x43, 0x55, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68, 0x69, 0x67, + 0x68, 0x2d, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x0a, 0x3c, 0x61, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, + 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2e, 0x74, + 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x63, + 0x75, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x2f, 0x6d, + 0x63, 0x75, 0x70, 0x72, 0x6f, 0x64, 0x6f, 0x76, + 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x74, + 0x73, 0x70, 0x3f, 0x73, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x3d, 0x39, 0x35, 0x26, + 0x74, 0x61, 0x62, 0x49, 0x64, 0x3d, 0x31, 0x35, + 0x33, 0x31, 0x26, 0x66, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x49, 0x64, 0x3d, 0x39, 0x31, 0x36, 0x22, + 0x3e, 0x54, 0x4d, 0x53, 0x33, 0x32, 0x30, 0x43, + 0x32, 0x30, 0x30, 0x30, 0x26, 0x74, 0x72, 0x61, + 0x64, 0x65, 0x3b, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, + 0x72, 0x65, 0x61, 0x6c, 0x2d, 0x74, 0x69, 0x6d, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x33, 0x32, + 0x20, 0x62, 0x69, 0x74, 0x20, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x2d, 0x70, 0x75, 0x72, + 0x70, 0x6f, 0x73, 0x65, 0x20, 0x41, 0x52, 0x4d, + 0x26, 0x72, 0x65, 0x67, 0x3b, 0x2d, 0x62, 0x61, + 0x73, 0x65, 0x64, 0x20, 0x4d, 0x43, 0x55, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0a, + 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, + 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x73, + 0x64, 0x73, 0x2f, 0x74, 0x69, 0x2f, 0x6d, 0x69, + 0x63, 0x72, 0x6f, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x74, 0x69, + 0x76, 0x61, 0x5f, 0x61, 0x72, 0x6d, 0x5f, 0x63, + 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x63, 0x5f, + 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x74, + 0x6d, 0x34, 0x63, 0x5f, 0x61, 0x72, 0x6d, 0x5f, + 0x63, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x6d, + 0x34, 0x2f, 0x6f, 0x76, 0x65, 0x72, 0x76, 0x69, + 0x65, 0x77, 0x2e, 0x70, 0x61, 0x67, 0x65, 0x22, + 0x3e, 0x54, 0x69, 0x76, 0x61, 0x26, 0x74, 0x72, + 0x61, 0x64, 0x65, 0x3b, 0x20, 0x43, 0x20, 0x53, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x20, + 0x52, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x6f, 0x72, + 0x65, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, + 0x75, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x77, 0x65, 0x62, 0x20, 0x61, 0x74, + 0x0a, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, + 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x22, + 0x3e, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, + 0x63, 0x6f, 0x6d, 0x3c, 0x2f, 0x61, 0x3e, 0x2e, + 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + +}; + +static const uint8_t data_block_htm[] = +{ + /* /block.htm */ + 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x68, + 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x0a, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, + 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x3e, 0x0a, + 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x44, + 0x4b, 0x2d, 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, + 0x39, 0x58, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x4b, + 0x69, 0x74, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, + 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, + 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x2e, 0x63, + 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, + 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, + 0x22, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, + 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, + 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, + 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x2f, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, + 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, + 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x3e, + 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, + 0x4e, 0x43, 0x5a, 0x41, 0x44, 0x20, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x44, 0x69, 0x61, 0x67, + 0x72, 0x61, 0x6d, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, + 0x3c, 0x68, 0x72, 0x3e, 0x0a, 0x3c, 0x62, 0x72, + 0x3e, 0x0a, 0x3c, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x3e, 0x0a, 0x3c, 0x69, 0x6d, 0x67, 0x20, + 0x73, 0x72, 0x63, 0x3d, 0x22, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x2f, + 0x3e, 0x0a, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x3e, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0x0a, +}; + +static const uint8_t data_block_jpg[] = +{ + /* /block.jpg */ + 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, + 0x70, 0x67, 0x00, + 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, + 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, + 0x00, 0x48, 0x00, 0x00, 0xff, 0xe1, 0x00, 0x40, + 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x4d, 0x4d, + 0x00, 0x2a, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, + 0x87, 0x69, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0xa0, 0x02, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x02, 0x68, 0xa0, 0x03, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x02, 0x35, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdb, + 0x00, 0x43, 0x00, 0x0e, 0x0a, 0x0b, 0x0c, 0x0b, + 0x09, 0x0e, 0x0c, 0x0c, 0x0c, 0x10, 0x0f, 0x0e, + 0x11, 0x15, 0x23, 0x17, 0x15, 0x13, 0x13, 0x15, + 0x2b, 0x1f, 0x21, 0x1a, 0x23, 0x33, 0x2d, 0x36, + 0x35, 0x32, 0x2d, 0x32, 0x31, 0x39, 0x40, 0x51, + 0x45, 0x39, 0x3c, 0x4d, 0x3d, 0x31, 0x32, 0x47, + 0x61, 0x48, 0x4d, 0x54, 0x57, 0x5b, 0x5c, 0x5b, + 0x37, 0x44, 0x64, 0x6b, 0x63, 0x59, 0x6a, 0x51, + 0x59, 0x5b, 0x58, 0xff, 0xdb, 0x00, 0x43, 0x01, + 0x0f, 0x10, 0x10, 0x15, 0x13, 0x15, 0x2a, 0x17, + 0x17, 0x2a, 0x58, 0x3a, 0x32, 0x3a, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0xff, 0xc0, 0x00, 0x11, 0x08, 0x02, 0x35, 0x02, + 0x68, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, + 0x03, 0x11, 0x01, 0xff, 0xc4, 0x00, 0x1f, 0x00, + 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xc4, 0x00, 0xb5, + 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, + 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, + 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, + 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, + 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, + 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, + 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, + 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, + 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, + 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xff, 0xc4, 0x00, 0x1f, 0x01, + 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xc4, 0x00, 0xb5, + 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, + 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, + 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, + 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, + 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, + 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, + 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, + 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, + 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, + 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, + 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, + 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, + 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, + 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xff, 0xda, 0x00, 0x0c, 0x03, + 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, + 0x00, 0xed, 0xa0, 0x85, 0x66, 0x57, 0x77, 0x79, + 0x73, 0xe6, 0x30, 0xe2, 0x42, 0x3b, 0xd4, 0xbf, + 0x64, 0x8f, 0xfb, 0xf3, 0x7f, 0xdf, 0xd6, 0xff, + 0x00, 0x1a, 0x4b, 0x3f, 0xf5, 0x4f, 0xff, 0x00, + 0x5d, 0x1f, 0xff, 0x00, 0x42, 0x35, 0x62, 0x80, + 0x20, 0xfb, 0x24, 0x7f, 0xdf, 0x9b, 0xfe, 0xfe, + 0xb7, 0xf8, 0xd1, 0xf6, 0x48, 0xff, 0x00, 0xbf, + 0x37, 0xfd, 0xfd, 0x6f, 0xf1, 0xa9, 0xe8, 0xa0, + 0x08, 0x3e, 0xc9, 0x1f, 0xf7, 0xe6, 0xff, 0x00, + 0xbf, 0xad, 0xfe, 0x34, 0x7d, 0x92, 0x3f, 0xef, + 0xcd, 0xff, 0x00, 0x7f, 0x5b, 0xfc, 0x6a, 0x7a, + 0x28, 0x02, 0x0f, 0xb2, 0x47, 0xfd, 0xf9, 0xbf, + 0xef, 0xeb, 0x7f, 0x8d, 0x1f, 0x64, 0x8f, 0xfb, + 0xf3, 0x7f, 0xdf, 0xd6, 0xff, 0x00, 0x1a, 0x9e, + 0x8a, 0x00, 0x83, 0xec, 0x91, 0xff, 0x00, 0x7e, + 0x6f, 0xfb, 0xfa, 0xdf, 0xe3, 0x47, 0xd9, 0x23, + 0xfe, 0xfc, 0xdf, 0xf7, 0xf5, 0xbf, 0xc6, 0xa7, + 0xa2, 0x80, 0x20, 0xfb, 0x24, 0x7f, 0xdf, 0x9b, + 0xfe, 0xfe, 0xb7, 0xf8, 0xd1, 0xf6, 0x48, 0xff, + 0x00, 0xbf, 0x37, 0xfd, 0xfd, 0x6f, 0xf1, 0xa9, + 0xe8, 0xa0, 0x08, 0x3e, 0xc9, 0x1f, 0xf7, 0xe6, + 0xff, 0x00, 0xbf, 0xad, 0xfe, 0x34, 0x7d, 0x92, + 0x3f, 0xef, 0xcd, 0xff, 0x00, 0x7f, 0x5b, 0xfc, + 0x6a, 0x7a, 0x28, 0x02, 0x0f, 0xb2, 0x47, 0xfd, + 0xf9, 0xbf, 0xef, 0xeb, 0x7f, 0x8d, 0x1f, 0x64, + 0x8f, 0xfb, 0xf3, 0x7f, 0xdf, 0xd6, 0xff, 0x00, + 0x1a, 0x9e, 0x8a, 0x00, 0x83, 0xec, 0x91, 0xff, + 0x00, 0x7e, 0x6f, 0xfb, 0xfa, 0xdf, 0xe3, 0x47, + 0xd9, 0x23, 0xfe, 0xfc, 0xdf, 0xf7, 0xf5, 0xbf, + 0xc6, 0xa7, 0xa2, 0x80, 0x20, 0xfb, 0x24, 0x7f, + 0xdf, 0x9b, 0xfe, 0xfe, 0xb7, 0xf8, 0xd1, 0xf6, + 0x48, 0xff, 0x00, 0xbf, 0x37, 0xfd, 0xfd, 0x6f, + 0xf1, 0xa9, 0xe8, 0xa0, 0x08, 0x3e, 0xc9, 0x1f, + 0xf7, 0xe6, 0xff, 0x00, 0xbf, 0xad, 0xfe, 0x34, + 0x7d, 0x92, 0x3f, 0xef, 0xcd, 0xff, 0x00, 0x7f, + 0x5b, 0xfc, 0x6a, 0x7a, 0x28, 0x02, 0x0f, 0xb2, + 0x47, 0xfd, 0xf9, 0xbf, 0xef, 0xeb, 0x7f, 0x8d, + 0x1f, 0x64, 0x8f, 0xfb, 0xf3, 0x7f, 0xdf, 0xd6, + 0xff, 0x00, 0x1a, 0x9e, 0x8a, 0x00, 0x83, 0xec, + 0x91, 0xff, 0x00, 0x7e, 0x6f, 0xfb, 0xfa, 0xdf, + 0xe3, 0x47, 0xd9, 0x23, 0xfe, 0xfc, 0xdf, 0xf7, + 0xf5, 0xbf, 0xc6, 0xa7, 0xa2, 0x80, 0x20, 0xfb, + 0x24, 0x7f, 0xdf, 0x9b, 0xfe, 0xfe, 0xb7, 0xf8, + 0xd1, 0xf6, 0x48, 0xff, 0x00, 0xbf, 0x37, 0xfd, + 0xfd, 0x6f, 0xf1, 0xa9, 0xe8, 0xa0, 0x08, 0x3e, + 0xc9, 0x1f, 0xf7, 0xe6, 0xff, 0x00, 0xbf, 0xad, + 0xfe, 0x34, 0x7d, 0x92, 0x3f, 0xef, 0xcd, 0xff, + 0x00, 0x7f, 0x5b, 0xfc, 0x6a, 0x7a, 0x28, 0x02, + 0x0f, 0xb2, 0x47, 0xfd, 0xf9, 0xbf, 0xef, 0xeb, + 0x7f, 0x8d, 0x1f, 0x64, 0x8f, 0xfb, 0xf3, 0x7f, + 0xdf, 0xd6, 0xff, 0x00, 0x1a, 0x9e, 0x8a, 0x00, + 0x83, 0xec, 0x91, 0xff, 0x00, 0x7e, 0x6f, 0xfb, + 0xfa, 0xdf, 0xe3, 0x47, 0xd9, 0x23, 0xfe, 0xfc, + 0xdf, 0xf7, 0xf5, 0xbf, 0xc6, 0xa7, 0xa2, 0x80, + 0x20, 0xfb, 0x24, 0x7f, 0xdf, 0x9b, 0xfe, 0xfe, + 0xb7, 0xf8, 0xd1, 0xf6, 0x48, 0xff, 0x00, 0xbf, + 0x37, 0xfd, 0xfd, 0x6f, 0xf1, 0xa9, 0xe8, 0xa0, + 0x08, 0x3e, 0xc9, 0x1f, 0xf7, 0xe6, 0xff, 0x00, + 0xbf, 0xad, 0xfe, 0x34, 0x7d, 0x92, 0x3f, 0xef, + 0xcd, 0xff, 0x00, 0x7f, 0x5b, 0xfc, 0x6a, 0x7a, + 0x28, 0x02, 0x0f, 0xb2, 0x47, 0xfd, 0xf9, 0xbf, + 0xef, 0xeb, 0x7f, 0x8d, 0x1f, 0x64, 0x8f, 0xfb, + 0xf3, 0x7f, 0xdf, 0xd6, 0xff, 0x00, 0x1a, 0x9e, + 0x8a, 0x00, 0x83, 0xec, 0x91, 0xff, 0x00, 0x7e, + 0x6f, 0xfb, 0xfa, 0xdf, 0xe3, 0x47, 0xd9, 0x23, + 0xfe, 0xfc, 0xdf, 0xf7, 0xf5, 0xbf, 0xc6, 0xa7, + 0xa2, 0x80, 0x20, 0xfb, 0x24, 0x7f, 0xdf, 0x9b, + 0xfe, 0xfe, 0xb7, 0xf8, 0xd1, 0xf6, 0x48, 0xff, + 0x00, 0xbf, 0x37, 0xfd, 0xfd, 0x6f, 0xf1, 0xa9, + 0xe8, 0xa0, 0x08, 0x3e, 0xc9, 0x1f, 0xf7, 0xe6, + 0xff, 0x00, 0xbf, 0xad, 0xfe, 0x34, 0x7d, 0x92, + 0x3f, 0xef, 0xcd, 0xff, 0x00, 0x7f, 0x5b, 0xfc, + 0x6a, 0x7a, 0x42, 0x70, 0x09, 0xf4, 0xa0, 0x08, + 0x7e, 0xc9, 0x1f, 0xf7, 0xe6, 0xff, 0x00, 0xbf, + 0xad, 0xfe, 0x34, 0x7d, 0x92, 0x3f, 0xef, 0xcd, + 0xff, 0x00, 0x7f, 0x5b, 0xfc, 0x69, 0x45, 0xc0, + 0x23, 0x22, 0x39, 0x48, 0xf5, 0x08, 0x69, 0x7c, + 0xff, 0x00, 0xfa, 0x65, 0x2f, 0xfd, 0xf0, 0x68, + 0x01, 0xbf, 0x64, 0x8f, 0xfb, 0xf3, 0x7f, 0xdf, + 0xd6, 0xff, 0x00, 0x1a, 0x3e, 0xc9, 0x1f, 0xf7, + 0xe6, 0xff, 0x00, 0xbf, 0xad, 0xfe, 0x34, 0xef, + 0x3f, 0xfe, 0x99, 0x4b, 0xff, 0x00, 0x7c, 0x1a, + 0x3c, 0xff, 0x00, 0xfa, 0x65, 0x2f, 0xfd, 0xf0, + 0x68, 0x01, 0xbf, 0x64, 0x8f, 0xfb, 0xf3, 0x7f, + 0xdf, 0xd6, 0xff, 0x00, 0x1a, 0x3e, 0xc9, 0x1f, + 0xf7, 0xe6, 0xff, 0x00, 0xbf, 0xad, 0xfe, 0x34, + 0xef, 0x3f, 0xfe, 0x99, 0x4b, 0xff, 0x00, 0x7c, + 0x1a, 0x3c, 0xff, 0x00, 0xfa, 0x65, 0x2f, 0xfd, + 0xf0, 0x68, 0x01, 0xbf, 0x64, 0x8f, 0xfb, 0xf3, + 0x7f, 0xdf, 0xd6, 0xff, 0x00, 0x1a, 0x3e, 0xc9, + 0x1f, 0xf7, 0xe6, 0xff, 0x00, 0xbf, 0xad, 0xfe, + 0x34, 0xef, 0x3f, 0xfe, 0x99, 0x4b, 0xff, 0x00, + 0x7c, 0x1a, 0x3c, 0xff, 0x00, 0xfa, 0x65, 0x2f, + 0xfd, 0xf0, 0x68, 0x01, 0xbf, 0x64, 0x8f, 0xfb, + 0xf3, 0x7f, 0xdf, 0xd6, 0xff, 0x00, 0x1a, 0x3e, + 0xc9, 0x1f, 0xf7, 0xe6, 0xff, 0x00, 0xbf, 0xad, + 0xfe, 0x34, 0xef, 0x3f, 0xfe, 0x99, 0x4b, 0xff, + 0x00, 0x7c, 0x1a, 0x3c, 0xff, 0x00, 0xfa, 0x65, + 0x2f, 0xfd, 0xf0, 0x68, 0x01, 0xbf, 0x64, 0x8f, + 0xfb, 0xf3, 0x7f, 0xdf, 0xd6, 0xff, 0x00, 0x1a, + 0x3e, 0xc9, 0x1f, 0xf7, 0xe6, 0xff, 0x00, 0xbf, + 0xad, 0xfe, 0x34, 0xef, 0x3f, 0xfe, 0x99, 0x4b, + 0xff, 0x00, 0x7c, 0x1a, 0x3c, 0xff, 0x00, 0xfa, + 0x65, 0x2f, 0xfd, 0xf0, 0x68, 0x01, 0xbf, 0x64, + 0x8f, 0xfb, 0xf3, 0x7f, 0xdf, 0xd6, 0xff, 0x00, + 0x1a, 0x3e, 0xc9, 0x1f, 0xf7, 0xe6, 0xff, 0x00, + 0xbf, 0xad, 0xfe, 0x34, 0xef, 0x3f, 0xfe, 0x99, + 0x4b, 0xff, 0x00, 0x7c, 0x1a, 0x3c, 0xff, 0x00, + 0xfa, 0x65, 0x2f, 0xfd, 0xf0, 0x68, 0x01, 0xbf, + 0x64, 0x8f, 0xfb, 0xf3, 0x7f, 0xdf, 0xd6, 0xff, + 0x00, 0x1a, 0x3e, 0xc9, 0x1f, 0xf7, 0xe6, 0xff, + 0x00, 0xbf, 0xad, 0xfe, 0x34, 0xef, 0x3f, 0xfe, + 0x99, 0x4b, 0xff, 0x00, 0x7c, 0x1a, 0x3c, 0xff, + 0x00, 0xfa, 0x65, 0x2f, 0xfd, 0xf0, 0x68, 0x01, + 0xbf, 0x64, 0x8f, 0xfb, 0xf3, 0x7f, 0xdf, 0xd6, + 0xff, 0x00, 0x1a, 0x3e, 0xc9, 0x1f, 0xf7, 0xe6, + 0xff, 0x00, 0xbf, 0xad, 0xfe, 0x34, 0xbf, 0x69, + 0x50, 0xdb, 0x4c, 0x72, 0x67, 0xae, 0x36, 0x1a, + 0x3e, 0xd0, 0x3f, 0xe7, 0x9c, 0xbf, 0xf7, 0xc1, + 0xa0, 0x04, 0xfb, 0x24, 0x7f, 0xdf, 0x9b, 0xfe, + 0xfe, 0xb7, 0xf8, 0xd1, 0xf6, 0x48, 0xff, 0x00, + 0xbf, 0x37, 0xfd, 0xfd, 0x6f, 0xf1, 0xa5, 0xfb, + 0x40, 0xff, 0x00, 0x9e, 0x72, 0xff, 0x00, 0xdf, + 0x06, 0x8f, 0xb4, 0x0f, 0xf9, 0xe7, 0x2f, 0xfd, + 0xf0, 0x68, 0x01, 0x3e, 0xc9, 0x1f, 0xf7, 0xe6, + 0xff, 0x00, 0xbf, 0xad, 0xfe, 0x34, 0x7d, 0x92, + 0x3f, 0xef, 0xcd, 0xff, 0x00, 0x7f, 0x5b, 0xfc, + 0x69, 0x7e, 0xd0, 0x3f, 0xe7, 0x9c, 0xbf, 0xf7, + 0xc1, 0xa3, 0xed, 0x03, 0xfe, 0x79, 0xcb, 0xff, + 0x00, 0x7c, 0x1a, 0x00, 0x4f, 0xb2, 0x47, 0xfd, + 0xf9, 0xbf, 0xef, 0xeb, 0x7f, 0x8d, 0x1f, 0x64, + 0x8f, 0xfb, 0xf3, 0x7f, 0xdf, 0xd6, 0xff, 0x00, + 0x1a, 0x5f, 0xb4, 0x0f, 0xf9, 0xe7, 0x2f, 0xfd, + 0xf0, 0x68, 0xfb, 0x4a, 0xe7, 0x1e, 0x5c, 0x99, + 0xf4, 0xd9, 0x40, 0x09, 0xf6, 0x48, 0xff, 0x00, + 0xbf, 0x37, 0xfd, 0xfd, 0x6f, 0xf1, 0xa3, 0xec, + 0x91, 0xff, 0x00, 0x7e, 0x6f, 0xfb, 0xfa, 0xdf, + 0xe3, 0x4b, 0xf6, 0x81, 0xff, 0x00, 0x3c, 0xe5, + 0xff, 0x00, 0xbe, 0x0d, 0x1f, 0x68, 0x1f, 0xf3, + 0xce, 0x5f, 0xfb, 0xe0, 0xd0, 0x02, 0x7d, 0x92, + 0x3f, 0xef, 0xcd, 0xff, 0x00, 0x7f, 0x5b, 0xfc, + 0x68, 0xfb, 0x24, 0x7f, 0xdf, 0x9b, 0xfe, 0xfe, + 0xb7, 0xf8, 0xd2, 0xfd, 0xa0, 0x7f, 0xcf, 0x39, + 0x7f, 0xef, 0x83, 0x47, 0xda, 0x07, 0xfc, 0xf3, + 0x97, 0xfe, 0xf8, 0x34, 0x00, 0x9f, 0x64, 0x8f, + 0xfb, 0xf3, 0x7f, 0xdf, 0xd6, 0xff, 0x00, 0x1a, + 0x3e, 0xc9, 0x1f, 0xf7, 0xe6, 0xff, 0x00, 0xbf, + 0xad, 0xfe, 0x34, 0xbf, 0x68, 0x1f, 0xf3, 0xce, + 0x5f, 0xfb, 0xe0, 0xd1, 0xf6, 0x81, 0xff, 0x00, + 0x3c, 0xe5, 0xff, 0x00, 0xbe, 0x0d, 0x00, 0x43, + 0x3c, 0x22, 0x15, 0x47, 0x47, 0x97, 0x3e, 0x62, + 0x8e, 0x64, 0x27, 0xbd, 0x14, 0xb7, 0x12, 0x2c, + 0x90, 0xae, 0x01, 0x18, 0x95, 0x01, 0x04, 0x63, + 0xb8, 0xa2, 0x80, 0x1f, 0x67, 0xfe, 0xa9, 0xff, + 0x00, 0xeb, 0xa3, 0xff, 0x00, 0xe8, 0x46, 0xac, + 0x55, 0x7b, 0x3f, 0xf5, 0x4f, 0xff, 0x00, 0x5d, + 0x1f, 0xff, 0x00, 0x42, 0x35, 0x3d, 0x00, 0x2d, + 0x14, 0x94, 0x50, 0x02, 0xd1, 0x49, 0x45, 0x00, + 0x2d, 0x14, 0x94, 0x50, 0x02, 0xd1, 0x49, 0x45, + 0x00, 0x2d, 0x14, 0x94, 0x50, 0x02, 0xd1, 0x49, + 0x45, 0x00, 0x2d, 0x14, 0x94, 0x50, 0x02, 0xd1, + 0x49, 0x45, 0x00, 0x2d, 0x14, 0x94, 0x50, 0x02, + 0xd1, 0x49, 0x45, 0x00, 0x2d, 0x14, 0x94, 0x50, + 0x02, 0xd1, 0x49, 0x45, 0x00, 0x2d, 0x14, 0x94, + 0x50, 0x02, 0xd1, 0x49, 0x45, 0x00, 0x2d, 0x14, + 0x94, 0x50, 0x02, 0xd1, 0x49, 0x45, 0x00, 0x2d, + 0x14, 0x94, 0x50, 0x02, 0xd1, 0x49, 0x45, 0x00, + 0x2d, 0x14, 0x94, 0x50, 0x02, 0xd1, 0x49, 0x45, + 0x00, 0x2d, 0x14, 0x94, 0x50, 0x02, 0xd3, 0x64, + 0xff, 0x00, 0x56, 0xdf, 0x43, 0x4b, 0x4d, 0x93, + 0xfd, 0x5b, 0x7d, 0x0d, 0x00, 0x20, 0x9a, 0x3b, + 0x7d, 0x3c, 0x4f, 0x29, 0xdb, 0x1c, 0x71, 0x6f, + 0x63, 0x8c, 0xe0, 0x01, 0x93, 0x59, 0x56, 0xde, + 0x2f, 0xd0, 0x2e, 0xee, 0xa3, 0xb5, 0x82, 0xf8, + 0xbc, 0xd2, 0x30, 0x45, 0x5f, 0x22, 0x41, 0x92, + 0x7a, 0x75, 0x5a, 0xd9, 0xb6, 0xff, 0x00, 0x8f, + 0x68, 0xbf, 0xdc, 0x1f, 0xca, 0xb9, 0x09, 0xee, + 0xe6, 0xb1, 0xd4, 0xfc, 0x67, 0x75, 0x6f, 0xc4, + 0xb1, 0x43, 0x6e, 0xc8, 0x71, 0x9c, 0x1f, 0x28, + 0xf3, 0xf8, 0x50, 0x07, 0x67, 0x45, 0x79, 0xc4, + 0xf7, 0x7a, 0xc5, 0xb6, 0x8d, 0x76, 0xcb, 0x36, + 0xa3, 0x1c, 0x4f, 0x0d, 0xbc, 0x89, 0x35, 0xcc, + 0xc0, 0xb8, 0x90, 0xc8, 0xa1, 0xb6, 0xed, 0x39, + 0xda, 0xc0, 0xf4, 0xfa, 0xd4, 0xba, 0x8c, 0x9a, + 0x8d, 0x81, 0xd7, 0x1a, 0x3d, 0x5e, 0xf5, 0xc6, + 0x99, 0x3d, 0xbb, 0xc2, 0x1e, 0x4c, 0xee, 0xf3, + 0x36, 0xee, 0x0d, 0xea, 0x39, 0xe0, 0x74, 0xa0, + 0x0f, 0x42, 0xa2, 0xb8, 0x3d, 0x62, 0x7b, 0xb1, + 0x75, 0xe2, 0x6b, 0x88, 0xf5, 0x5b, 0xa8, 0x0e, + 0x9e, 0x60, 0x78, 0x23, 0x49, 0x48, 0x50, 0x4a, + 0x0e, 0xa3, 0xb8, 0x3e, 0x9d, 0x39, 0xa6, 0x4f, + 0xa9, 0xeb, 0x17, 0x5a, 0xad, 0xe4, 0xd6, 0xeb, + 0x7b, 0xe6, 0x5a, 0xcb, 0x0a, 0xc7, 0x1c, 0x72, + 0x2a, 0xc0, 0xaa, 0x40, 0x2c, 0x1c, 0x13, 0xce, + 0xec, 0x9f, 0xd2, 0x90, 0x1d, 0xfd, 0x32, 0x59, + 0x63, 0x82, 0x26, 0x96, 0x69, 0x16, 0x38, 0xd7, + 0x96, 0x77, 0x38, 0x03, 0xf1, 0xae, 0x22, 0x39, + 0xee, 0x13, 0x4f, 0xd6, 0x2f, 0x67, 0xd5, 0xef, + 0xd1, 0x8d, 0xfc, 0xb6, 0x70, 0x24, 0x67, 0x7e, + 0xd1, 0xe6, 0x0c, 0x05, 0x52, 0x7e, 0xf7, 0x60, + 0x73, 0xc0, 0xaa, 0x57, 0xd3, 0xdc, 0x5c, 0xf8, + 0x53, 0x5c, 0x82, 0x69, 0xef, 0x02, 0xd9, 0xde, + 0x46, 0x23, 0x13, 0xcb, 0x99, 0x02, 0x92, 0xa3, + 0x6b, 0x90, 0x4e, 0x7a, 0x9e, 0xfe, 0x9e, 0x94, + 0x01, 0xe8, 0xf4, 0x57, 0x07, 0xa8, 0xdd, 0xdd, + 0x59, 0x69, 0xde, 0x29, 0x89, 0x2f, 0xee, 0x73, + 0x68, 0x6d, 0xd2, 0x17, 0x79, 0x98, 0xba, 0x65, + 0x57, 0xa1, 0xcf, 0x53, 0xfa, 0xd4, 0xb7, 0x77, + 0x37, 0xf1, 0x5f, 0x78, 0x92, 0xf5, 0x2f, 0xae, + 0x71, 0xa7, 0xc6, 0x8d, 0x04, 0x01, 0xf2, 0x9b, + 0x9a, 0x2e, 0x49, 0x1d, 0xf1, 0xd7, 0x1e, 0xbc, + 0xd0, 0x07, 0x6f, 0x45, 0x70, 0x36, 0xf2, 0x6b, + 0xcd, 0x63, 0x73, 0x15, 0xb4, 0x97, 0xaa, 0x25, + 0xb6, 0x89, 0xd1, 0xef, 0x2e, 0x13, 0x7b, 0x49, + 0xb8, 0x6e, 0x08, 0xd9, 0x3b, 0x43, 0x2f, 0x4f, + 0x7a, 0xdf, 0xf0, 0xad, 0xc9, 0x92, 0x3b, 0xcb, + 0x69, 0x1e, 0xfb, 0xce, 0x82, 0x40, 0x1e, 0x1b, + 0xd2, 0x1d, 0xe2, 0xca, 0xe4, 0x0d, 0xdf, 0xc4, + 0x0f, 0x5a, 0x00, 0xdf, 0xa2, 0x8a, 0x28, 0x18, + 0x51, 0x45, 0x14, 0x01, 0x5e, 0x4f, 0xf8, 0xfc, + 0x5f, 0xfa, 0xe6, 0x7f, 0x98, 0xa7, 0xd3, 0x24, + 0xff, 0x00, 0x8f, 0xc5, 0xff, 0x00, 0xae, 0x67, + 0xf9, 0x8a, 0x7d, 0x31, 0x14, 0xa6, 0xd5, 0xac, + 0x60, 0xbc, 0x16, 0x92, 0x4f, 0x89, 0x72, 0xaa, + 0x7e, 0x46, 0x21, 0x4b, 0x7d, 0xd0, 0x5b, 0x18, + 0x04, 0xf6, 0x04, 0xd3, 0x61, 0xd6, 0x6c, 0x67, + 0xbc, 0x36, 0xb1, 0x3c, 0xcd, 0x28, 0x76, 0x8c, + 0x9f, 0xb3, 0xc9, 0xb7, 0x72, 0xe4, 0x11, 0xbb, + 0x6e, 0xde, 0xc7, 0xbd, 0x60, 0xea, 0x1e, 0x71, + 0x7d, 0x56, 0x74, 0x64, 0x1a, 0x7a, 0x5e, 0x44, + 0x6e, 0x22, 0x23, 0xf7, 0x8e, 0xca, 0x23, 0xc9, + 0x53, 0xd8, 0x7d, 0xde, 0x30, 0x73, 0x83, 0xc8, + 0xcd, 0x5c, 0xb5, 0x92, 0xff, 0x00, 0x4b, 0x68, + 0x44, 0x8f, 0x69, 0x3d, 0x9d, 0xcd, 0xec, 0x8b, + 0xfb, 0xad, 0xdb, 0xc1, 0x92, 0x46, 0x60, 0x73, + 0xd0, 0xe0, 0x9c, 0x11, 0x8f, 0xc6, 0x80, 0x36, + 0x22, 0xbf, 0xb5, 0x96, 0xe5, 0xed, 0xd2, 0x5c, + 0xc8, 0x99, 0xce, 0x54, 0x80, 0x71, 0xc3, 0x61, + 0xb1, 0x83, 0x8e, 0xf8, 0xe9, 0x55, 0xed, 0xb5, + 0xcd, 0x32, 0xee, 0xe5, 0x6d, 0xe0, 0xba, 0x0d, + 0x23, 0xe4, 0x27, 0xc8, 0xc1, 0x5f, 0x1d, 0x76, + 0xb1, 0x18, 0x6f, 0xc0, 0xd5, 0x2d, 0x6f, 0x4d, + 0x10, 0xe9, 0x1a, 0x9d, 0xc4, 0x12, 0x4c, 0xcf, + 0xf6, 0x79, 0x9a, 0x38, 0xf2, 0x36, 0xa1, 0x7e, + 0x5c, 0xaf, 0x19, 0xc9, 0xe7, 0xa9, 0x3e, 0xd5, + 0xa3, 0xbb, 0x4f, 0xfb, 0x25, 0x99, 0x3e, 0x4f, + 0x90, 0x59, 0x3e, 0xcd, 0x90, 0x31, 0xbb, 0x1f, + 0x2e, 0xdf, 0x7a, 0x00, 0xbb, 0x51, 0x2f, 0xfc, + 0x7d, 0x3f, 0xfb, 0xa3, 0xfa, 0xd4, 0xb5, 0x12, + 0xff, 0x00, 0xc7, 0xd3, 0xff, 0x00, 0xba, 0x3f, + 0xad, 0x00, 0x36, 0xf2, 0xf2, 0xda, 0xc2, 0xd5, + 0xee, 0x6e, 0xa6, 0x58, 0xa1, 0x4f, 0xbc, 0xcd, + 0xfe, 0x79, 0xa8, 0xae, 0xb5, 0x4b, 0x2b, 0x38, + 0x62, 0x9a, 0x79, 0x88, 0x59, 0xb9, 0x8f, 0x6a, + 0x33, 0x16, 0x18, 0xce, 0x70, 0x06, 0x7a, 0x53, + 0x75, 0xb8, 0xd1, 0xf4, 0x7b, 0xc2, 0xe8, 0xac, + 0x52, 0x09, 0x19, 0x72, 0x3a, 0x1d, 0xa7, 0x91, + 0xf9, 0xd5, 0x1b, 0x3f, 0xf9, 0x0c, 0x69, 0xdb, + 0xbf, 0xe8, 0x1a, 0xdb, 0x3f, 0xef, 0xa8, 0xf7, + 0x7f, 0xec, 0xb4, 0x01, 0x76, 0xe7, 0x58, 0xb0, + 0xb5, 0x5b, 0x76, 0x92, 0x56, 0x61, 0x70, 0xa5, + 0xe2, 0xf2, 0xa2, 0x79, 0x37, 0x28, 0xc7, 0x3f, + 0x28, 0x3c, 0x7c, 0xc3, 0xf3, 0xa7, 0x9d, 0x52, + 0xcc, 0x18, 0x43, 0x48, 0xca, 0x65, 0x55, 0x65, + 0xcc, 0x4c, 0x30, 0x18, 0xe0, 0x6e, 0xe3, 0xe5, + 0xc9, 0xe3, 0xe6, 0xc5, 0x60, 0xe9, 0x96, 0xf7, + 0xb2, 0x41, 0xa6, 0xdc, 0x58, 0xcd, 0x68, 0x8d, + 0x1c, 0x17, 0x08, 0xab, 0x38, 0x2d, 0xf2, 0xb4, + 0x8a, 0x54, 0x80, 0x08, 0xe3, 0x0a, 0x06, 0x73, + 0xde, 0xb4, 0xac, 0xe2, 0x8f, 0x59, 0xb5, 0x83, + 0x50, 0x93, 0xcc, 0x85, 0xa4, 0x45, 0x59, 0x62, + 0x8d, 0x86, 0xc7, 0xd8, 0xc4, 0x80, 0x78, 0xe9, + 0xbb, 0x3d, 0x31, 0x9c, 0xf3, 0x40, 0x13, 0xdd, + 0x6b, 0x9a, 0x65, 0xa5, 0xc3, 0x5b, 0xcf, 0x74, + 0x16, 0x44, 0xc6, 0xfc, 0x23, 0x10, 0x99, 0xe9, + 0xb9, 0x80, 0xc2, 0xfe, 0x35, 0xa2, 0x08, 0x23, + 0x20, 0xe4, 0x56, 0x26, 0x84, 0x60, 0xfe, 0xca, + 0xbd, 0xfb, 0x46, 0xcc, 0xfd, 0xaa, 0xe3, 0xed, + 0x5b, 0xba, 0x7d, 0xf6, 0xeb, 0xff, 0x00, 0x01, + 0xdb, 0xf8, 0x56, 0xbd, 0xb9, 0x88, 0xdb, 0xc4, + 0x60, 0xdb, 0xe4, 0x94, 0x1e, 0x5e, 0xde, 0x9b, + 0x71, 0xc6, 0x28, 0x02, 0xb4, 0xdd, 0x1f, 0xfe, + 0xbb, 0xa7, 0xf3, 0x14, 0x51, 0x37, 0x47, 0xff, + 0x00, 0xae, 0xc9, 0xfc, 0xc5, 0x14, 0x01, 0x2d, + 0xa7, 0xfa, 0xb7, 0xff, 0x00, 0xae, 0x8f, 0xff, + 0x00, 0xa1, 0x1a, 0xb1, 0x55, 0xed, 0x3f, 0xd5, + 0xbf, 0xfd, 0x74, 0x7f, 0xfd, 0x08, 0xd4, 0xf4, + 0x00, 0xb4, 0x52, 0x51, 0x40, 0x0b, 0x45, 0x53, + 0xb8, 0xd4, 0xec, 0x6d, 0x9f, 0x64, 0xb7, 0x28, + 0x1c, 0x75, 0x50, 0x0b, 0x11, 0xf9, 0x54, 0x3f, + 0xdb, 0xba, 0x67, 0xfc, 0xfc, 0x37, 0xfd, 0xfb, + 0x35, 0x4a, 0x12, 0x7d, 0x09, 0xe6, 0x8f, 0x73, + 0x4a, 0x8a, 0xcd, 0xfe, 0xdd, 0xd3, 0x3f, 0xe7, + 0xe1, 0xbf, 0xef, 0xd9, 0xa3, 0xfb, 0x77, 0x4c, + 0xff, 0x00, 0x9f, 0x86, 0xff, 0x00, 0xbf, 0x66, + 0x9f, 0xb3, 0x97, 0x60, 0xe7, 0x8f, 0x73, 0x4a, + 0x8a, 0xcd, 0xfe, 0xdd, 0xd3, 0x3f, 0xe7, 0xe1, + 0xbf, 0xef, 0xd9, 0xa3, 0xfb, 0x77, 0x4c, 0xff, + 0x00, 0x9f, 0x86, 0xff, 0x00, 0xbf, 0x66, 0x8f, + 0x67, 0x2e, 0xc1, 0xcf, 0x1e, 0xe6, 0x95, 0x15, + 0x9b, 0xfd, 0xbb, 0xa6, 0x7f, 0xcf, 0xc3, 0x7f, + 0xdf, 0xb3, 0x47, 0xf6, 0xee, 0x99, 0xff, 0x00, + 0x3f, 0x0d, 0xff, 0x00, 0x7e, 0xcd, 0x1e, 0xce, + 0x5d, 0x83, 0x9e, 0x3d, 0xcd, 0x2a, 0x2b, 0x37, + 0xfb, 0x77, 0x4c, 0xff, 0x00, 0x9f, 0x86, 0xff, + 0x00, 0xbf, 0x66, 0x8f, 0xed, 0xdd, 0x33, 0xfe, + 0x7e, 0x1b, 0xfe, 0xfd, 0x9a, 0x3d, 0x9c, 0xbb, + 0x07, 0x3c, 0x7b, 0x9a, 0x54, 0x56, 0x6f, 0xf6, + 0xee, 0x99, 0xff, 0x00, 0x3f, 0x0d, 0xff, 0x00, + 0x7e, 0xcd, 0x1f, 0xdb, 0xba, 0x67, 0xfc, 0xfc, + 0x37, 0xfd, 0xfb, 0x34, 0x7b, 0x39, 0x76, 0x0e, + 0x78, 0xf7, 0x34, 0xa8, 0xac, 0xdf, 0xed, 0xdd, + 0x33, 0xfe, 0x7e, 0x1b, 0xfe, 0xfd, 0x9a, 0x3f, + 0xb7, 0x74, 0xcf, 0xf9, 0xf8, 0x6f, 0xfb, 0xf6, + 0x68, 0xf6, 0x72, 0xec, 0x1c, 0xf1, 0xee, 0x69, + 0x51, 0x59, 0xbf, 0xdb, 0xba, 0x67, 0xfc, 0xfc, + 0x37, 0xfd, 0xfb, 0x34, 0x7f, 0x6e, 0xe9, 0x9f, + 0xf3, 0xf0, 0xdf, 0xf7, 0xec, 0xd1, 0xec, 0xe5, + 0xd8, 0x39, 0xe3, 0xdc, 0xd2, 0xa2, 0xb3, 0x7f, + 0xb7, 0x74, 0xcf, 0xf9, 0xf8, 0x6f, 0xfb, 0xf6, + 0x68, 0xfe, 0xdd, 0xd3, 0x3f, 0xe7, 0xe1, 0xbf, + 0xef, 0xd9, 0xa3, 0xd9, 0xcb, 0xb0, 0x73, 0xc7, + 0xb9, 0xa5, 0x45, 0x66, 0xff, 0x00, 0x6e, 0xe9, + 0x9f, 0xf3, 0xf0, 0xdf, 0xf7, 0xec, 0xd1, 0xfd, + 0xbb, 0xa6, 0x7f, 0xcf, 0xc3, 0x7f, 0xdf, 0xb3, + 0x47, 0xb3, 0x97, 0x60, 0xe7, 0x8f, 0x73, 0x4a, + 0x8a, 0xcd, 0x1a, 0xee, 0x98, 0x4f, 0xfc, 0x7c, + 0x30, 0xff, 0x00, 0xb6, 0x6d, 0x56, 0xed, 0xae, + 0xed, 0xae, 0xc1, 0xfb, 0x34, 0xeb, 0x21, 0x1d, + 0x40, 0xe0, 0xfe, 0x46, 0x93, 0x8c, 0x96, 0xe8, + 0x14, 0x93, 0xd9, 0x93, 0xd1, 0x49, 0x41, 0x20, + 0x0c, 0x92, 0x00, 0xa9, 0x28, 0x5a, 0x2a, 0x9c, + 0x97, 0xca, 0x0e, 0x23, 0x5d, 0xde, 0xe6, 0xa2, + 0xfb, 0x7c, 0x9f, 0xdc, 0x5a, 0x00, 0xd1, 0xa2, + 0xb3, 0xbe, 0xdf, 0x27, 0xf7, 0x16, 0x8f, 0xb7, + 0xc9, 0xfd, 0xc5, 0xa0, 0x0d, 0x1a, 0x2b, 0x3b, + 0xed, 0xf2, 0x7f, 0x71, 0x68, 0xfb, 0x7c, 0x9f, + 0xdc, 0x5a, 0x00, 0xd1, 0xa2, 0xb3, 0xbe, 0xdf, + 0x27, 0xf7, 0x16, 0x8f, 0xb7, 0xc9, 0xfd, 0xc5, + 0xa0, 0x0d, 0x1a, 0x2b, 0x3b, 0xed, 0xf2, 0x7f, + 0x71, 0x68, 0xfb, 0x7c, 0x9f, 0xdc, 0x5a, 0x00, + 0xd1, 0xa2, 0xb3, 0xbe, 0xdf, 0x27, 0xf7, 0x16, + 0x8f, 0xb7, 0xc9, 0xfd, 0xc5, 0xa0, 0x0d, 0x1a, + 0x2b, 0x3b, 0xed, 0xf2, 0x7f, 0x71, 0x68, 0xfb, + 0x7c, 0x9f, 0xdc, 0x5a, 0x00, 0xd1, 0xa2, 0xb3, + 0xbe, 0xdf, 0x27, 0xf7, 0x16, 0x8f, 0xb7, 0xc9, + 0xfd, 0xc5, 0xa0, 0x0d, 0x1a, 0x6b, 0xff, 0x00, + 0xab, 0x6f, 0xa5, 0x50, 0xfb, 0x7c, 0x9f, 0xdc, + 0x5a, 0x43, 0x7d, 0x21, 0x04, 0x14, 0x5e, 0x68, + 0x03, 0x4e, 0xdb, 0xfe, 0x3d, 0xa2, 0xff, 0x00, + 0x70, 0x7f, 0x2a, 0x81, 0x74, 0xdb, 0x35, 0xb8, + 0xbc, 0x9c, 0x40, 0x0c, 0x97, 0x8a, 0xab, 0x70, + 0x58, 0x92, 0x1c, 0x28, 0xda, 0x06, 0x0f, 0x1d, + 0x0d, 0x67, 0x8b, 0x87, 0x03, 0x00, 0xb0, 0x1e, + 0x81, 0xcd, 0x1f, 0x69, 0x93, 0xfb, 0xcf, 0xff, + 0x00, 0x7d, 0x9a, 0x00, 0x92, 0x3f, 0x0c, 0xe8, + 0xb1, 0x5b, 0x4d, 0x6c, 0x96, 0x20, 0x45, 0x31, + 0x5d, 0xe3, 0xcc, 0x6c, 0x9d, 0xa7, 0x2a, 0x33, + 0x9c, 0x80, 0x0f, 0x61, 0x53, 0xdc, 0x68, 0xba, + 0x75, 0xd7, 0xdb, 0x3c, 0xeb, 0x6d, 0xdf, 0x6d, + 0x28, 0x6e, 0x3e, 0x76, 0x1b, 0xf6, 0x63, 0x6f, + 0x7e, 0x31, 0x81, 0xd2, 0xaa, 0x7d, 0xa6, 0x4f, + 0xef, 0x3f, 0xfd, 0xf6, 0x68, 0xfb, 0x4c, 0x9f, + 0xde, 0x7f, 0xfb, 0xec, 0xd0, 0x04, 0x1f, 0xf0, + 0x8b, 0xda, 0xdd, 0x6b, 0x5a, 0x8d, 0xf6, 0xa3, + 0x04, 0x57, 0x11, 0xcf, 0x24, 0x6f, 0x00, 0xdc, + 0xd9, 0x5d, 0xaa, 0x01, 0xdc, 0x38, 0xcf, 0x23, + 0xa7, 0x22, 0xb4, 0x2e, 0x74, 0x2d, 0x2e, 0xeb, + 0x50, 0x5b, 0xf9, 0xec, 0xd1, 0xee, 0x54, 0xa9, + 0xde, 0x49, 0xc1, 0x23, 0xa6, 0x46, 0x70, 0x71, + 0xef, 0x55, 0xbe, 0xd3, 0x27, 0xf7, 0x9f, 0xfe, + 0xfb, 0x34, 0x7d, 0xa6, 0x4f, 0xef, 0x3f, 0xfd, + 0xf6, 0x68, 0x02, 0xd3, 0xe8, 0x7a, 0x64, 0x96, + 0x73, 0xd9, 0xbd, 0xa8, 0x68, 0x27, 0x98, 0xcf, + 0x22, 0x97, 0x6e, 0x5c, 0x9c, 0x96, 0xce, 0x72, + 0x39, 0xf4, 0xa8, 0xc7, 0x87, 0x34, 0x75, 0x8a, + 0xe6, 0x11, 0x64, 0xa2, 0x3b, 0x94, 0x54, 0x99, + 0x77, 0xb6, 0x1c, 0x2f, 0x4e, 0xfd, 0x7d, 0xfa, + 0xd4, 0x3f, 0x69, 0x93, 0xfb, 0xcf, 0xff, 0x00, + 0x7d, 0x9a, 0x3e, 0xd3, 0x27, 0xf7, 0x9f, 0xfe, + 0xfb, 0x34, 0x00, 0xe9, 0xbc, 0x2d, 0xa1, 0xce, + 0x73, 0x2d, 0x82, 0xb1, 0x31, 0x88, 0x89, 0x32, + 0x3e, 0x4a, 0x81, 0x81, 0xdf, 0xae, 0x3b, 0xf5, + 0xab, 0xc9, 0xa6, 0xd9, 0xc7, 0x2d, 0xdc, 0x8b, + 0x00, 0xdd, 0x76, 0x00, 0x9f, 0x71, 0x24, 0x38, + 0x0b, 0xb4, 0x70, 0x78, 0xe9, 0xc5, 0x67, 0xfd, + 0xa6, 0x4f, 0xef, 0x3f, 0xfd, 0xf6, 0x68, 0xfb, + 0x4c, 0x9f, 0xde, 0x7f, 0xfb, 0xec, 0xd0, 0x04, + 0x91, 0x78, 0x6b, 0x45, 0x86, 0xda, 0x6b, 0x74, + 0xb0, 0x4f, 0x2a, 0x60, 0x03, 0x82, 0xcc, 0xc4, + 0x81, 0xd3, 0x04, 0x9c, 0x8c, 0x7b, 0x55, 0xcd, + 0x3b, 0x4c, 0xb3, 0xd3, 0x22, 0x78, 0xec, 0xe1, + 0xf2, 0xd5, 0xdb, 0x73, 0x12, 0xc5, 0x8b, 0x1f, + 0x72, 0x49, 0x26, 0xb3, 0xfe, 0xd3, 0x27, 0xf7, + 0x9f, 0xfe, 0xfb, 0x34, 0x7d, 0xa6, 0x4f, 0xef, + 0x3f, 0xfd, 0xf6, 0x68, 0x03, 0x6e, 0x8a, 0xc4, + 0xfb, 0x4c, 0x9f, 0xde, 0x7f, 0xfb, 0xec, 0xd1, + 0xf6, 0x99, 0x3f, 0xbc, 0xff, 0x00, 0xf7, 0xd9, + 0xa0, 0x0d, 0xba, 0x2b, 0x13, 0xed, 0x32, 0x7f, + 0x79, 0xff, 0x00, 0xef, 0xb3, 0x47, 0xda, 0x64, + 0xfe, 0xf3, 0xff, 0x00, 0xdf, 0x66, 0x80, 0x34, + 0xe4, 0xff, 0x00, 0x8f, 0xc5, 0xff, 0x00, 0xae, + 0x67, 0xf9, 0x8a, 0x7d, 0x64, 0x7d, 0xa1, 0xf3, + 0x9c, 0xb6, 0x7d, 0x77, 0x9a, 0x5f, 0xb4, 0x3f, + 0xab, 0xff, 0x00, 0xdf, 0x66, 0x80, 0x2c, 0x4d, + 0xa4, 0x58, 0x4f, 0x77, 0xf6, 0xa9, 0x20, 0xcc, + 0xb9, 0x56, 0x3f, 0x3b, 0x05, 0x62, 0x3a, 0x16, + 0x5c, 0xe0, 0x91, 0xea, 0x47, 0x6a, 0x23, 0xd1, + 0xf4, 0xf8, 0xaf, 0x7e, 0xd8, 0x96, 0xe0, 0x4d, + 0xb8, 0xb8, 0x3b, 0xdb, 0x68, 0x63, 0xd5, 0x82, + 0xe7, 0x00, 0x9f, 0x50, 0x2a, 0xbf, 0xda, 0x1f, + 0xd5, 0xff, 0x00, 0xef, 0xb3, 0x47, 0xda, 0x1f, + 0xd5, 0xff, 0x00, 0xef, 0xb3, 0x40, 0x1a, 0xc4, + 0x64, 0x62, 0xb3, 0xad, 0x74, 0x3d, 0x32, 0xd2, + 0xe5, 0x6e, 0x20, 0xb5, 0x09, 0x22, 0xe7, 0x67, + 0xcc, 0xc5, 0x53, 0x3d, 0x76, 0xa9, 0x38, 0x5f, + 0xc0, 0x54, 0x5f, 0x68, 0x7f, 0x57, 0xff, 0x00, + 0xbe, 0xcd, 0x1f, 0x68, 0x7f, 0x57, 0xff, 0x00, + 0xbe, 0xcd, 0x00, 0x6b, 0x54, 0x4b, 0xff, 0x00, + 0x1f, 0x4f, 0xfe, 0xe8, 0xfe, 0xb5, 0x9d, 0xf6, + 0x87, 0xf5, 0x7f, 0xfb, 0xec, 0xd2, 0x79, 0xed, + 0x9c, 0xe5, 0xb3, 0xeb, 0xb8, 0xd0, 0x05, 0xeb, + 0xfb, 0x0b, 0x7d, 0x46, 0xdf, 0xc8, 0xba, 0x57, + 0x68, 0xb3, 0x9c, 0x24, 0xac, 0x99, 0xe3, 0x1c, + 0x95, 0x23, 0x8e, 0x7a, 0x55, 0x63, 0xa1, 0x69, + 0xa6, 0xd6, 0x3b, 0x66, 0x86, 0x43, 0x1c, 0x64, + 0xb2, 0x66, 0x77, 0x2c, 0xb9, 0x18, 0x20, 0x36, + 0xec, 0xe3, 0xdb, 0x38, 0xa8, 0xfe, 0xd0, 0xfe, + 0xaf, 0xff, 0x00, 0x7d, 0x9a, 0x3e, 0xd0, 0xfe, + 0xaf, 0xff, 0x00, 0x7d, 0x9a, 0x00, 0xb1, 0x73, + 0xa4, 0x58, 0x5d, 0x45, 0x0c, 0x72, 0xdb, 0xe1, + 0x60, 0x5d, 0xb1, 0xf9, 0x6e, 0xd1, 0x95, 0x5f, + 0x40, 0x54, 0x8e, 0x38, 0x1c, 0x55, 0xb8, 0x62, + 0x8e, 0x08, 0x52, 0x18, 0x51, 0x63, 0x8a, 0x35, + 0x0a, 0xa8, 0xa3, 0x00, 0x0f, 0x4a, 0xcc, 0xfb, + 0x43, 0xfa, 0xbf, 0xfd, 0xf6, 0x68, 0xfb, 0x43, + 0xfa, 0xbf, 0xfd, 0xf6, 0x68, 0x02, 0x5b, 0xad, + 0x0f, 0x4c, 0xbb, 0xb9, 0x37, 0x13, 0xda, 0x86, + 0x91, 0xb1, 0xbf, 0xe6, 0x60, 0x1f, 0x1d, 0x37, + 0x28, 0x38, 0x6f, 0xc6, 0xb4, 0x40, 0xc0, 0xc0, + 0x15, 0x94, 0xb7, 0x1c, 0xfc, 0xe6, 0x4c, 0x7b, + 0x48, 0x6a, 0xe4, 0x4b, 0x1c, 0xab, 0xb9, 0x25, + 0x90, 0xff, 0x00, 0xc0, 0xcd, 0x00, 0x47, 0x37, + 0xf1, 0xff, 0x00, 0xd7, 0x64, 0xfe, 0x62, 0x8a, + 0x74, 0xf1, 0x88, 0xe2, 0x5c, 0x12, 0x73, 0x2a, + 0x12, 0x49, 0xcf, 0x71, 0x45, 0x00, 0x3e, 0xd3, + 0xfd, 0x5b, 0xff, 0x00, 0xd7, 0x47, 0xff, 0x00, + 0xd0, 0x8d, 0x4f, 0x55, 0xed, 0x3f, 0xd5, 0xbf, + 0xfd, 0x74, 0x7f, 0xfd, 0x08, 0xd4, 0xf4, 0x00, + 0xb5, 0x8b, 0xe2, 0x1d, 0x41, 0xed, 0xa2, 0x5b, + 0x78, 0x58, 0xac, 0xb2, 0x8c, 0xb3, 0x0e, 0xa1, + 0x7f, 0xfa, 0xf5, 0xb3, 0x5c, 0xaf, 0x8a, 0x3f, + 0xe4, 0x26, 0xbf, 0xf5, 0xc9, 0x7f, 0xad, 0x6b, + 0x45, 0x27, 0x3d, 0x4c, 0xea, 0xb6, 0xa3, 0xa1, + 0x8d, 0x45, 0x14, 0x57, 0x79, 0xc6, 0x14, 0x51, + 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, + 0x4e, 0x8a, 0x36, 0x96, 0x54, 0x8d, 0x06, 0x59, + 0xc8, 0x51, 0xf5, 0x34, 0x00, 0xda, 0x2b, 0x6f, + 0x5a, 0xb0, 0xb4, 0x82, 0xdc, 0x49, 0x66, 0xb8, + 0xf2, 0xa5, 0xf2, 0x65, 0x39, 0x27, 0x2d, 0x80, + 0x73, 0x44, 0x51, 0x69, 0xd6, 0xfa, 0x35, 0xbd, + 0xd5, 0xcd, 0x99, 0x9e, 0x49, 0x1d, 0x94, 0x91, + 0x23, 0x2f, 0x42, 0x6a, 0x3d, 0xa2, 0xb5, 0xd1, + 0x7c, 0x8e, 0xf6, 0x31, 0x28, 0xae, 0x85, 0x34, + 0xeb, 0x09, 0xee, 0x74, 0xf9, 0xa2, 0x89, 0x96, + 0x0b, 0x9d, 0xc1, 0xa2, 0x66, 0x3c, 0x10, 0x0f, + 0x7e, 0xb5, 0x0b, 0xe9, 0xb0, 0x0d, 0x79, 0x21, + 0x0a, 0x45, 0xa3, 0x27, 0x9b, 0x8c, 0x9f, 0xb9, + 0x8c, 0xf5, 0xfa, 0x8a, 0x5e, 0xd1, 0x07, 0x23, + 0x31, 0x28, 0xad, 0x7d, 0x42, 0xc2, 0xde, 0x1d, + 0x56, 0x74, 0x55, 0x31, 0xdb, 0xc4, 0xaa, 0x4a, + 0x83, 0x92, 0x49, 0xc7, 0x00, 0x9f, 0x53, 0x4f, + 0xb8, 0xd3, 0xe1, 0x19, 0x8f, 0xcb, 0x85, 0x1b, + 0xcc, 0xf2, 0x83, 0xc5, 0x23, 0x36, 0xd7, 0xec, + 0x18, 0x37, 0xaf, 0xa8, 0xa7, 0xed, 0x16, 0x81, + 0xc8, 0xcc, 0x5a, 0x28, 0x20, 0x83, 0x82, 0x39, + 0xa2, 0xac, 0x80, 0xa2, 0x8a, 0x28, 0x00, 0xa2, + 0x8a, 0x28, 0x00, 0xa7, 0x47, 0x23, 0xc5, 0x22, + 0xc9, 0x1b, 0x15, 0x75, 0x39, 0x04, 0x76, 0xa6, + 0xd1, 0x40, 0x1d, 0xce, 0x97, 0x79, 0xf6, 0xeb, + 0x04, 0x9d, 0xb1, 0xe6, 0x03, 0xb5, 0xf1, 0xfd, + 0xe1, 0x49, 0x74, 0xcd, 0x2c, 0xcb, 0x6e, 0x87, + 0x19, 0xeb, 0x54, 0x3c, 0x2c, 0x7f, 0xd0, 0x27, + 0x1f, 0xf4, 0xd7, 0xfa, 0x55, 0xb9, 0x0e, 0x2e, + 0x6e, 0x0f, 0xa4, 0x6d, 0xff, 0x00, 0xa0, 0xd7, + 0x9d, 0x51, 0x72, 0xc9, 0xa4, 0x77, 0x41, 0xde, + 0x29, 0x90, 0xb5, 0xd4, 0x10, 0x92, 0xb1, 0x44, + 0x92, 0x63, 0xab, 0xb8, 0xce, 0x7f, 0x0a, 0x4f, + 0xb7, 0x8f, 0xf9, 0xe1, 0x07, 0xfd, 0xf1, 0x58, + 0x5f, 0x69, 0xf7, 0xa3, 0xed, 0x3e, 0xf5, 0xc4, + 0xe5, 0x27, 0xd4, 0x0d, 0xdf, 0xb7, 0x8f, 0xf9, + 0xe1, 0x07, 0xfd, 0xf1, 0x47, 0xdb, 0xc7, 0xfc, + 0xf0, 0x83, 0xfe, 0xf8, 0xac, 0x2f, 0xb4, 0xfb, + 0xd1, 0xf6, 0x9f, 0x7a, 0x5c, 0xd2, 0xee, 0x06, + 0xef, 0xdb, 0xc7, 0xfc, 0xf0, 0x83, 0xfe, 0xf8, + 0xa3, 0xed, 0xe3, 0xfe, 0x78, 0x41, 0xff, 0x00, + 0x7c, 0x56, 0x17, 0xda, 0x7d, 0xe8, 0xfb, 0x4f, + 0xbd, 0x1c, 0xd2, 0xee, 0x06, 0xef, 0xdb, 0xc7, + 0xfc, 0xf0, 0x83, 0xfe, 0xf8, 0xa3, 0xed, 0xe3, + 0xfe, 0x78, 0x41, 0xff, 0x00, 0x7c, 0x56, 0x17, + 0xda, 0x7d, 0xea, 0xfe, 0x9b, 0x6a, 0xda, 0x82, + 0xcc, 0x56, 0x5d, 0x86, 0x30, 0x30, 0x36, 0xe7, + 0x39, 0xcf, 0xf8, 0x53, 0x4e, 0x6f, 0xa8, 0x17, + 0xbe, 0xde, 0x3f, 0xe7, 0x84, 0x1f, 0xf7, 0xc5, + 0x1f, 0x6f, 0x1f, 0xf3, 0xc2, 0x0f, 0xfb, 0xe2, + 0xa8, 0xe9, 0xf6, 0xad, 0x7b, 0x1c, 0xcf, 0xe6, + 0xf9, 0x62, 0x21, 0xfd, 0xdc, 0xe4, 0xf3, 0xfe, + 0x15, 0x51, 0x5a, 0x66, 0x88, 0xca, 0xb1, 0x39, + 0x8c, 0x75, 0x70, 0xa7, 0x03, 0xf1, 0xa2, 0xf3, + 0xee, 0x06, 0xcf, 0xdb, 0xc7, 0xfc, 0xf0, 0x83, + 0xfe, 0xf8, 0xa3, 0xed, 0xe3, 0xfe, 0x78, 0x41, + 0xff, 0x00, 0x7c, 0x56, 0x3a, 0x79, 0xee, 0x14, + 0xa4, 0x32, 0x30, 0x6c, 0xed, 0x21, 0x09, 0xce, + 0x3a, 0xe2, 0x90, 0xb4, 0xa2, 0x3f, 0x30, 0xc6, + 0xe1, 0x33, 0x8d, 0xdb, 0x4e, 0x33, 0xf5, 0xa2, + 0xf2, 0xee, 0x06, 0xcf, 0xdb, 0xc7, 0xfc, 0xf0, + 0x83, 0xfe, 0xf8, 0xa3, 0xed, 0xe3, 0xfe, 0x78, + 0x41, 0xff, 0x00, 0x7c, 0x56, 0x32, 0x19, 0xa4, + 0x8c, 0xc8, 0x91, 0x48, 0xc8, 0x3a, 0xb0, 0x52, + 0x40, 0xa0, 0x19, 0xd9, 0x03, 0xac, 0x52, 0x14, + 0x20, 0x90, 0xc1, 0x4e, 0x30, 0x3a, 0xd1, 0x79, + 0x77, 0x03, 0x67, 0xed, 0xe3, 0xfe, 0x78, 0x41, + 0xff, 0x00, 0x7c, 0x51, 0xf6, 0xf1, 0xff, 0x00, + 0x3c, 0x20, 0xff, 0x00, 0xbe, 0x2b, 0x18, 0x99, + 0x84, 0xa2, 0x23, 0x14, 0x82, 0x46, 0xe8, 0xa5, + 0x4e, 0x4f, 0xe1, 0x4c, 0x69, 0xd9, 0x58, 0xab, + 0x02, 0x18, 0x1c, 0x10, 0x7a, 0x8a, 0x57, 0x97, + 0x70, 0x37, 0x3e, 0xde, 0x3f, 0xe7, 0x84, 0x1f, + 0xf7, 0xc5, 0x1f, 0x6f, 0x1f, 0xf3, 0xc2, 0x0f, + 0xfb, 0xe2, 0xb0, 0xbe, 0xd3, 0xef, 0x47, 0xda, + 0x7d, 0xe8, 0xe6, 0x97, 0x70, 0x37, 0x7e, 0xde, + 0x3f, 0xe7, 0x84, 0x1f, 0xf7, 0xc5, 0x1f, 0x6f, + 0x1f, 0xf3, 0xc2, 0x0f, 0xfb, 0xe2, 0xb0, 0xbe, + 0xd3, 0xef, 0x47, 0xda, 0x7d, 0xe8, 0xe6, 0x97, + 0x70, 0x37, 0x7e, 0xde, 0x3f, 0xe7, 0x84, 0x1f, + 0xf7, 0xc5, 0x1f, 0x6f, 0x43, 0xc3, 0x5b, 0xc2, + 0x47, 0xb2, 0xe2, 0xb0, 0xbe, 0xd3, 0xef, 0x47, + 0xda, 0x7d, 0xe8, 0xe6, 0x97, 0x70, 0x37, 0xa4, + 0x48, 0xda, 0x35, 0x9a, 0x1c, 0xf9, 0x6c, 0x70, + 0x41, 0xfe, 0x13, 0xe9, 0x51, 0x54, 0x7a, 0x64, + 0x9e, 0x65, 0x85, 0xc7, 0x7c, 0x3a, 0xff, 0x00, + 0x5a, 0x9a, 0x21, 0x99, 0x50, 0x1f, 0xef, 0x0a, + 0xe9, 0x8b, 0xba, 0xb9, 0x44, 0xa5, 0x61, 0xb7, + 0x00, 0xcf, 0x96, 0x90, 0x8c, 0xf9, 0x60, 0xe3, + 0x1f, 0x53, 0x49, 0xf6, 0x8b, 0x4f, 0xf9, 0xf6, + 0x3f, 0xf7, 0xf0, 0xd6, 0x5d, 0xfd, 0xc1, 0xfb, + 0x7d, 0xc0, 0x27, 0xa4, 0x8c, 0x3f, 0x5a, 0xaf, + 0xf6, 0x8f, 0x7a, 0xc2, 0x53, 0x95, 0xf4, 0x15, + 0xcd, 0xcf, 0xb4, 0x5a, 0x7f, 0xcf, 0xb1, 0xff, + 0x00, 0xbf, 0x86, 0x8f, 0xb4, 0x5a, 0x7f, 0xcf, + 0xb1, 0xff, 0x00, 0xbf, 0x86, 0xb0, 0xfe, 0xd1, + 0xef, 0x5a, 0x51, 0xe9, 0xf3, 0xbc, 0x71, 0x3f, + 0x9f, 0x6e, 0xbe, 0x6a, 0x86, 0x55, 0x67, 0x20, + 0x9c, 0xfe, 0x14, 0x29, 0x4d, 0x8b, 0x52, 0xd7, + 0xda, 0x2d, 0x3f, 0xe7, 0xd8, 0xff, 0x00, 0xdf, + 0xc3, 0x47, 0xda, 0x2d, 0x3f, 0xe7, 0xd8, 0xff, + 0x00, 0xdf, 0xc3, 0x58, 0xf3, 0xb4, 0x96, 0xf3, + 0x34, 0x32, 0x8d, 0xae, 0xbd, 0x46, 0x6a, 0x3f, + 0xb4, 0x7b, 0xd2, 0xe7, 0x9f, 0x70, 0xb9, 0xb9, + 0xf6, 0x8b, 0x4f, 0xf9, 0xf6, 0x3f, 0xf7, 0xf0, + 0xd1, 0xf6, 0x8b, 0x4f, 0xf9, 0xf6, 0x3f, 0xf7, + 0xf0, 0xd6, 0x1f, 0xda, 0x3d, 0xe8, 0xfb, 0x47, + 0xbd, 0x1c, 0xf3, 0xee, 0x17, 0x37, 0x3e, 0xd1, + 0x69, 0xff, 0x00, 0x3e, 0xc7, 0xfe, 0xfe, 0x1a, + 0x3e, 0xd1, 0x69, 0xff, 0x00, 0x3e, 0xc7, 0xfe, + 0xfe, 0x1a, 0xc3, 0xfb, 0x47, 0xbd, 0x1f, 0x68, + 0xf7, 0xa3, 0x9e, 0x7d, 0xc2, 0xe6, 0xe7, 0xda, + 0x2d, 0x3f, 0xe7, 0xd8, 0xff, 0x00, 0xdf, 0xc3, + 0x47, 0xda, 0x2d, 0x3f, 0xe7, 0xd8, 0xff, 0x00, + 0xdf, 0xc3, 0x59, 0xf7, 0x16, 0xf3, 0xdb, 0xc4, + 0x64, 0x76, 0x8c, 0xed, 0x20, 0x3a, 0xab, 0x64, + 0xa6, 0x7a, 0x66, 0xa0, 0xb7, 0x32, 0x5c, 0xcc, + 0xb1, 0x44, 0x37, 0x3b, 0x74, 0x14, 0xf9, 0xa6, + 0x1a, 0x9a, 0xff, 0x00, 0x68, 0xb4, 0xff, 0x00, + 0x9f, 0x63, 0xff, 0x00, 0x7f, 0x0d, 0x1f, 0x68, + 0xb4, 0xff, 0x00, 0x9f, 0x63, 0xff, 0x00, 0x7f, + 0x0d, 0x52, 0xb8, 0xb1, 0xb9, 0x82, 0x16, 0x97, + 0x74, 0x72, 0x2a, 0x7d, 0xff, 0x00, 0x2d, 0xb2, + 0x57, 0xeb, 0x50, 0xdd, 0x29, 0xb6, 0x8e, 0xdd, + 0x8c, 0x9b, 0xbc, 0xe8, 0xc3, 0xf4, 0xc6, 0x28, + 0xe6, 0x9a, 0x1e, 0xa6, 0x9f, 0xda, 0x2d, 0x3f, + 0xe7, 0xd8, 0xff, 0x00, 0xdf, 0xc3, 0x47, 0xda, + 0x2d, 0x3f, 0xe7, 0xd8, 0xff, 0x00, 0xdf, 0xc3, + 0x58, 0x7f, 0x68, 0xf7, 0xa3, 0xed, 0x1e, 0xf4, + 0xb9, 0xe7, 0xdc, 0x57, 0x37, 0x3e, 0xd1, 0x69, + 0xff, 0x00, 0x3e, 0xc7, 0xfe, 0xfe, 0x1a, 0x3e, + 0xd1, 0x69, 0xff, 0x00, 0x3e, 0xc7, 0xfe, 0xfe, + 0x1a, 0xcc, 0xbf, 0x53, 0x67, 0x72, 0x61, 0x32, + 0x6f, 0xe0, 0x1c, 0xe3, 0x1d, 0x6a, 0x39, 0x65, + 0x8d, 0x16, 0x33, 0x1c, 0xde, 0x61, 0x65, 0xcb, + 0x0d, 0xb8, 0xda, 0x7d, 0x3d, 0xe9, 0xf3, 0x4f, + 0xb8, 0x1a, 0xff, 0x00, 0x68, 0xb4, 0xff, 0x00, + 0x9f, 0x63, 0xff, 0x00, 0x7f, 0x0d, 0x1f, 0x68, + 0xb4, 0xff, 0x00, 0x9f, 0x63, 0xff, 0x00, 0x7f, + 0x0d, 0x61, 0xfd, 0xa3, 0xde, 0x8f, 0xb4, 0x7b, + 0xd2, 0xe7, 0x9f, 0x70, 0xb9, 0xb9, 0xf6, 0x8b, + 0x4f, 0xf9, 0xf6, 0x3f, 0xf7, 0xf0, 0xd1, 0xf6, + 0x8b, 0x4f, 0xf9, 0xf6, 0x3f, 0xf7, 0xf0, 0xd6, + 0x1f, 0xda, 0x3d, 0xe8, 0xfb, 0x47, 0xbd, 0x1c, + 0xf3, 0xee, 0x17, 0x37, 0x54, 0x5b, 0xdc, 0x1d, + 0xb1, 0x66, 0x39, 0x3b, 0x2b, 0x1c, 0x83, 0xf8, + 0xd3, 0x60, 0x91, 0xa0, 0x9b, 0x27, 0x23, 0x9c, + 0x30, 0xac, 0x65, 0xba, 0x2a, 0xc1, 0x94, 0xe0, + 0x83, 0x91, 0x5b, 0x77, 0xa0, 0x0b, 0xb9, 0x31, + 0xeb, 0x5b, 0x53, 0x93, 0x6b, 0x51, 0xa2, 0xed, + 0xdf, 0xfa, 0xb4, 0xff, 0x00, 0xae, 0x89, 0xff, + 0x00, 0xa1, 0x0a, 0x29, 0x92, 0x9c, 0xda, 0xc2, + 0x4f, 0xf7, 0xa3, 0xfe, 0x62, 0x8a, 0xd0, 0x63, + 0xad, 0x7f, 0xd5, 0xbf, 0xfd, 0x74, 0x7f, 0xfd, + 0x08, 0xd4, 0xf5, 0x05, 0xaf, 0xfa, 0xb7, 0xff, + 0x00, 0xae, 0x8f, 0xff, 0x00, 0xa1, 0x1a, 0x9a, + 0x80, 0x16, 0xb9, 0x5f, 0x14, 0x7f, 0xc8, 0x4d, + 0x3f, 0xeb, 0x92, 0xff, 0x00, 0x5a, 0xea, 0x6b, + 0x96, 0xf1, 0x47, 0xfc, 0x84, 0xd3, 0xfe, 0xb8, + 0xaf, 0xf5, 0xad, 0xe8, 0x7c, 0x66, 0x55, 0xbe, + 0x13, 0x1a, 0x8a, 0x28, 0xae, 0xd3, 0x90, 0x28, + 0xa2, 0x8a, 0x00, 0x28, 0xa2, 0x8a, 0x00, 0x2b, + 0x53, 0x40, 0x89, 0x5b, 0x50, 0xf3, 0xe4, 0xff, + 0x00, 0x57, 0x6e, 0x86, 0x56, 0xfc, 0x2b, 0x2e, + 0x8a, 0x52, 0x57, 0x56, 0x1a, 0x76, 0x77, 0x3a, + 0x38, 0x2e, 0x2d, 0x75, 0x2b, 0x7b, 0xeb, 0x58, + 0x2d, 0x5a, 0x19, 0x24, 0x43, 0x2e, 0x4c, 0x85, + 0xb7, 0x30, 0x39, 0xa6, 0xa5, 0xe3, 0x59, 0xf8, + 0x76, 0xcd, 0xc4, 0x30, 0xcb, 0xba, 0x46, 0x18, + 0x95, 0x77, 0x0e, 0xa6, 0xb9, 0xea, 0x2a, 0x3d, + 0x9a, 0x2f, 0x9d, 0x9d, 0x66, 0x5e, 0x7d, 0x5f, + 0x4d, 0xbb, 0x8d, 0xb3, 0x6b, 0x22, 0x90, 0x8a, + 0x07, 0x08, 0x76, 0x9c, 0x8f, 0xd2, 0xab, 0x3c, + 0xe9, 0xfd, 0x89, 0x2d, 0xce, 0x7f, 0x7c, 0x81, + 0xad, 0x7e, 0xa0, 0xb6, 0x7f, 0x95, 0x73, 0x94, + 0x52, 0xf6, 0x41, 0xed, 0x0d, 0xfd, 0x59, 0x91, + 0xb5, 0x9b, 0xa8, 0x19, 0x82, 0xef, 0x11, 0x95, + 0x24, 0xe0, 0x6e, 0x00, 0x70, 0x7f, 0x5a, 0x7d, + 0xe4, 0xa6, 0x53, 0xe6, 0xcf, 0x0b, 0x5b, 0xc5, + 0x1c, 0xe6, 0x51, 0x95, 0x0b, 0xe6, 0x8e, 0xdf, + 0x56, 0xf7, 0xf7, 0xae, 0x76, 0x8a, 0x6a, 0x9e, + 0xc2, 0xe7, 0x15, 0x98, 0xb3, 0x33, 0x1e, 0xa4, + 0xe6, 0x92, 0x8a, 0x2b, 0x42, 0x02, 0x8a, 0x28, + 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, + 0xa0, 0x0e, 0xa7, 0xc2, 0xdf, 0xf1, 0xe1, 0x3f, + 0xfd, 0x75, 0x1f, 0xca, 0xac, 0xca, 0x33, 0x3d, + 0xc8, 0xff, 0x00, 0xa6, 0x4d, 0xff, 0x00, 0xa0, + 0xd5, 0x6f, 0x0b, 0x7f, 0xc7, 0x85, 0xc7, 0xfd, + 0x74, 0x1f, 0xca, 0xad, 0x9f, 0x9a, 0xf6, 0x44, + 0xce, 0x37, 0xa9, 0x50, 0x7e, 0xa2, 0xbc, 0xfa, + 0xdf, 0x1b, 0x3b, 0x69, 0xfc, 0x28, 0xe4, 0xbc, + 0x86, 0xf7, 0xa3, 0xc8, 0x6f, 0x7a, 0xd7, 0x6b, + 0x52, 0xac, 0x55, 0x97, 0x04, 0x70, 0x45, 0x27, + 0xd9, 0xbd, 0xab, 0xcf, 0xb8, 0xcc, 0x9f, 0x21, + 0xbd, 0xe8, 0xf2, 0x1b, 0xde, 0xb5, 0xbe, 0xcd, + 0xed, 0x47, 0xd9, 0xbd, 0xa8, 0xb8, 0x19, 0x3e, + 0x43, 0x7b, 0xd1, 0xe4, 0x37, 0xbd, 0x6b, 0x7d, + 0x9b, 0xda, 0x8f, 0xb3, 0x7b, 0x51, 0x70, 0x32, + 0x7c, 0x86, 0xf7, 0xad, 0x8d, 0x14, 0xb5, 0xb5, + 0xa5, 0xec, 0xbc, 0xfc, 0xa6, 0x23, 0xf9, 0x35, + 0x37, 0xec, 0xde, 0xd4, 0xf4, 0x59, 0x23, 0x8e, + 0x48, 0xd4, 0xe1, 0x24, 0xc6, 0xe1, 0x8e, 0xb8, + 0xa6, 0xa5, 0x66, 0x06, 0x94, 0x70, 0xad, 0xa4, + 0xad, 0x02, 0x1e, 0x26, 0x32, 0xcc, 0x71, 0xd8, + 0x63, 0x03, 0xfa, 0xd3, 0x3c, 0xc8, 0xad, 0x8d, + 0x82, 0xa8, 0xba, 0x71, 0xe4, 0x0c, 0x45, 0x08, + 0x05, 0x1f, 0x8e, 0x72, 0x3b, 0x9a, 0xa9, 0xe6, + 0x5c, 0x79, 0x8b, 0x27, 0x99, 0xf3, 0x2a, 0x6c, + 0x07, 0x03, 0xee, 0xfa, 0x52, 0xc7, 0x35, 0xd4, + 0x70, 0xf9, 0x29, 0x2b, 0x08, 0xf1, 0xd2, 0xaf, + 0xda, 0x21, 0xdc, 0x74, 0x4f, 0x24, 0x36, 0x1a, + 0x6a, 0xc2, 0xcc, 0x8a, 0x6e, 0x1b, 0x3e, 0xa5, + 0x77, 0x74, 0x35, 0x25, 0xc3, 0x49, 0x2f, 0xf6, + 0xc4, 0x4e, 0xc4, 0xc6, 0x00, 0x28, 0xbd, 0x97, + 0xe9, 0x55, 0x87, 0x9c, 0x12, 0x34, 0xdd, 0xf2, + 0xc4, 0x77, 0x20, 0xc0, 0xe0, 0xd2, 0x96, 0x9c, + 0x99, 0x49, 0x7e, 0x66, 0xfb, 0xfc, 0x0e, 0x69, + 0x7b, 0x44, 0x17, 0x27, 0x2d, 0x71, 0x0d, 0xde, + 0x93, 0x15, 0xb3, 0x3a, 0xc0, 0x63, 0x4c, 0xaa, + 0xf4, 0x6e, 0x7e, 0x6c, 0xfe, 0x14, 0xdd, 0x59, + 0x9a, 0x1d, 0x39, 0x23, 0xb6, 0x62, 0x8a, 0xd3, + 0x4a, 0x0e, 0xde, 0x38, 0xdc, 0x78, 0xfa, 0x53, + 0x22, 0x9a, 0xea, 0x18, 0xbc, 0xa8, 0xe6, 0x65, + 0x4f, 0x4f, 0x4a, 0x8d, 0xd6, 0x47, 0x85, 0x22, + 0x63, 0x94, 0x42, 0x4a, 0x8c, 0x74, 0xcd, 0x1e, + 0xd1, 0x58, 0x2e, 0x59, 0xb5, 0x51, 0x24, 0x56, + 0xba, 0x93, 0xf2, 0xd6, 0xb0, 0x3a, 0x36, 0x7b, + 0x91, 0xf7, 0x7f, 0x9d, 0x73, 0xad, 0x13, 0xb3, + 0x16, 0x62, 0x49, 0x27, 0x24, 0xd7, 0x44, 0xc2, + 0x38, 0xb4, 0xe3, 0x6d, 0x13, 0x97, 0x32, 0x30, + 0x67, 0xe3, 0x00, 0x7b, 0x55, 0x2f, 0xb3, 0x7b, + 0x52, 0x94, 0x84, 0x64, 0xf9, 0x0d, 0xef, 0x47, + 0x90, 0xde, 0xf5, 0xad, 0xf6, 0x6f, 0x6a, 0x3e, + 0xcd, 0xed, 0x53, 0x70, 0x32, 0x7c, 0x86, 0xf7, + 0xa3, 0xc8, 0x6f, 0x7a, 0xd6, 0xfb, 0x37, 0xb5, + 0x1f, 0x66, 0xf6, 0xa2, 0xe0, 0x64, 0xf9, 0x0d, + 0xef, 0x47, 0x90, 0xde, 0xf5, 0xad, 0xf6, 0x6f, + 0x6a, 0x3e, 0xcd, 0xed, 0x45, 0xc0, 0x93, 0x46, + 0x42, 0x96, 0x17, 0x59, 0xee, 0xe9, 0xfd, 0x6a, + 0xd4, 0x3f, 0xeb, 0x93, 0xfd, 0xe1, 0x4b, 0x6f, + 0x11, 0x82, 0xc1, 0xf7, 0x70, 0x65, 0x71, 0xb4, + 0x7b, 0x0e, 0xf4, 0x91, 0x10, 0x25, 0x42, 0x78, + 0x01, 0x85, 0x74, 0xc3, 0xe1, 0x29, 0x18, 0x5a, + 0x8a, 0x39, 0xd4, 0xae, 0x8e, 0x7f, 0xe5, 0xb3, + 0xff, 0x00, 0xe8, 0x46, 0xab, 0xec, 0x7f, 0x5a, + 0xdb, 0xbe, 0xb6, 0x3f, 0x6d, 0x9c, 0x91, 0xd5, + 0xcb, 0x7e, 0x67, 0x35, 0x5f, 0xec, 0xfe, 0xd5, + 0xce, 0xde, 0xa4, 0x99, 0x9b, 0x1f, 0xd6, 0xba, + 0x1b, 0xa8, 0x2c, 0xe4, 0xb6, 0xd3, 0x9a, 0xea, + 0xe9, 0xe1, 0x2b, 0x02, 0xfc, 0xaa, 0x84, 0xee, + 0xe3, 0xd7, 0xb5, 0x51, 0xfb, 0x3f, 0xb5, 0x4f, + 0x70, 0x64, 0xb8, 0x48, 0x95, 0xd5, 0x40, 0x89, + 0x36, 0x2e, 0x3d, 0x29, 0xa9, 0x24, 0x04, 0xff, + 0x00, 0x69, 0x13, 0x1d, 0x4b, 0x53, 0x85, 0x07, + 0x98, 0x81, 0x16, 0x2d, 0xc3, 0x3b, 0x47, 0x4c, + 0xd4, 0xc3, 0x75, 0xde, 0x95, 0xb9, 0xc0, 0x17, + 0x17, 0x10, 0x3e, 0xec, 0x0c, 0x6f, 0x28, 0x78, + 0xaa, 0x56, 0xad, 0x25, 0xab, 0x31, 0x40, 0xa5, + 0x5c, 0x61, 0x95, 0x86, 0x43, 0x0f, 0x7a, 0x9b, + 0xed, 0x57, 0x1f, 0x69, 0x8e, 0x70, 0x10, 0x79, + 0x63, 0x08, 0x80, 0x61, 0x40, 0xfa, 0x55, 0x29, + 0xae, 0xa3, 0x2d, 0x98, 0xd5, 0xee, 0x6d, 0x98, + 0x7f, 0xab, 0xb1, 0x66, 0x46, 0xfa, 0x08, 0xc1, + 0xfe, 0x60, 0xd4, 0x16, 0xee, 0x96, 0xd6, 0x16, + 0xb2, 0xb5, 0xca, 0xc2, 0x66, 0x76, 0x79, 0x73, + 0x11, 0x7f, 0x37, 0x9e, 0x9e, 0xd5, 0x0a, 0x4f, + 0x3a, 0x2d, 0xc8, 0x01, 0x7f, 0xd2, 0x33, 0xbf, + 0x23, 0xa7, 0x5e, 0x9f, 0x9d, 0x2d, 0xbd, 0xc4, + 0xd0, 0x44, 0x23, 0x09, 0x1b, 0xaa, 0x9d, 0xc9, + 0xbd, 0x73, 0xb4, 0xfa, 0x8a, 0x3d, 0xa2, 0x0b, + 0x8a, 0xb3, 0x0b, 0x5d, 0x32, 0xee, 0x6b, 0x3d, + 0xa4, 0x7d, 0xab, 0x31, 0x12, 0xbf, 0x77, 0x20, + 0x76, 0x35, 0x8f, 0x63, 0x66, 0xf7, 0x97, 0x89, + 0x09, 0x7d, 0xa1, 0x89, 0x25, 0xb1, 0xd0, 0x75, + 0xad, 0x36, 0x92, 0x57, 0xb7, 0x92, 0x16, 0xc3, + 0x07, 0x93, 0xcc, 0x66, 0x3d, 0x73, 0x51, 0xc0, + 0xaf, 0x6f, 0x32, 0xcb, 0x19, 0xc3, 0xaf, 0x43, + 0x52, 0xe4, 0x9d, 0x84, 0x5c, 0xbf, 0x41, 0x7b, + 0x6e, 0xf3, 0x40, 0xc2, 0x3b, 0x57, 0x43, 0x24, + 0xaf, 0x8f, 0x99, 0x9d, 0x78, 0x00, 0xfe, 0x95, + 0x47, 0x40, 0x57, 0x12, 0xdd, 0xed, 0x27, 0xcd, + 0x36, 0xed, 0xb3, 0xeb, 0x57, 0x85, 0xec, 0xe0, + 0x15, 0x58, 0x60, 0x58, 0xcf, 0xde, 0x8c, 0x47, + 0xf2, 0xb7, 0xb9, 0xaa, 0x91, 0x2c, 0x90, 0xcc, + 0x26, 0x88, 0xed, 0x70, 0x72, 0x30, 0x29, 0xb9, + 0xab, 0xdc, 0x66, 0x6d, 0xbc, 0x77, 0x84, 0x4d, + 0xf6, 0x73, 0x26, 0x36, 0x1f, 0x33, 0x6f, 0xf7, + 0x7d, 0xeb, 0xa1, 0x8e, 0x31, 0xb6, 0xda, 0x66, + 0x50, 0xef, 0x05, 0x86, 0xf4, 0x52, 0x32, 0x37, + 0x54, 0x33, 0xdd, 0xdc, 0x4d, 0x13, 0x47, 0xb6, + 0x38, 0xd5, 0xfe, 0xf6, 0xc5, 0xc1, 0x6f, 0xad, + 0x34, 0x5c, 0x5c, 0x2b, 0xc2, 0xeb, 0xb5, 0x4c, + 0x49, 0xb0, 0x60, 0x75, 0x1e, 0xf4, 0x29, 0x24, + 0x21, 0x63, 0x53, 0xa9, 0xd9, 0x5b, 0x4b, 0x79, + 0xb4, 0xca, 0x2e, 0x84, 0x65, 0xc2, 0xe3, 0x72, + 0xfa, 0x55, 0x7d, 0x46, 0xea, 0xe2, 0x56, 0xbc, + 0xb5, 0x6b, 0x75, 0x78, 0x63, 0x7c, 0x46, 0x55, + 0x71, 0xe5, 0x00, 0x7d, 0xbd, 0x6a, 0x59, 0xe6, + 0x9a, 0x61, 0x18, 0x0a, 0x91, 0x2c, 0x67, 0x72, + 0xac, 0x6b, 0xb4, 0x03, 0xeb, 0x4f, 0x9e, 0xe6, + 0x79, 0xe2, 0x68, 0xd9, 0x63, 0x5d, 0xf8, 0xde, + 0x51, 0x70, 0x5f, 0xeb, 0x47, 0x3a, 0x19, 0x6b, + 0x55, 0x43, 0x14, 0x37, 0x57, 0x16, 0xcc, 0x0d, + 0xc3, 0x2a, 0x2b, 0x9e, 0xe8, 0x9e, 0xdf, 0x5a, + 0x4b, 0x71, 0x86, 0xb5, 0x24, 0x6e, 0x03, 0x4e, + 0x39, 0x07, 0xbf, 0x4a, 0xac, 0x6e, 0xa7, 0x37, + 0x0f, 0x31, 0x44, 0x26, 0x44, 0xd8, 0xcb, 0x83, + 0x82, 0x3f, 0x3a, 0x16, 0xe6, 0x75, 0xd9, 0x84, + 0x4f, 0x96, 0x2f, 0x28, 0x70, 0x7a, 0x7e, 0x74, + 0xf9, 0xd5, 0xc2, 0xe2, 0x26, 0xed, 0x42, 0xc6, + 0xc5, 0xee, 0x42, 0xb3, 0x0b, 0xb1, 0x19, 0x21, + 0x40, 0xca, 0xe3, 0x38, 0xa9, 0x8d, 0xc4, 0xd3, + 0x49, 0xab, 0x44, 0xea, 0xbb, 0x22, 0x89, 0xd6, + 0x3c, 0x2e, 0x36, 0x8f, 0x4a, 0xad, 0x1b, 0x48, + 0xb0, 0x25, 0xbf, 0x0a, 0x8b, 0x28, 0x90, 0x30, + 0x1c, 0x83, 0x5a, 0x53, 0x48, 0x04, 0x37, 0x05, + 0xe5, 0x81, 0xcc, 0xa9, 0xb4, 0x79, 0x4b, 0x86, + 0x62, 0x7b, 0xb5, 0x35, 0x2b, 0x81, 0xc8, 0xec, + 0x7f, 0x5a, 0x36, 0x3f, 0xad, 0x69, 0xfd, 0x9f, + 0xda, 0x8f, 0xb3, 0xfb, 0x56, 0x57, 0x11, 0x99, + 0xb1, 0xfd, 0x6b, 0xaa, 0xbe, 0xff, 0x00, 0x8f, + 0xc9, 0x3e, 0xbf, 0xd2, 0xb2, 0x92, 0xd0, 0xbb, + 0x85, 0x55, 0xc9, 0x27, 0x02, 0xb5, 0x2f, 0x08, + 0x6b, 0xb9, 0x08, 0xe9, 0x9a, 0xda, 0x97, 0x51, + 0xa2, 0xd4, 0x9f, 0xf1, 0xeb, 0x07, 0xfb, 0xd1, + 0xff, 0x00, 0x31, 0x45, 0x12, 0x7f, 0xc7, 0xac, + 0x1f, 0xef, 0x47, 0xfc, 0xc5, 0x15, 0xb0, 0xc7, + 0xda, 0xff, 0x00, 0xab, 0x7f, 0xfa, 0xe8, 0xff, + 0x00, 0xfa, 0x11, 0xa9, 0xaa, 0x0b, 0x5f, 0xf5, + 0x6f, 0xff, 0x00, 0x5d, 0x1f, 0xff, 0x00, 0x42, + 0x35, 0x3d, 0x00, 0x15, 0xcb, 0x78, 0x9f, 0xfe, + 0x42, 0x69, 0xff, 0x00, 0x5c, 0x57, 0xfa, 0xd7, + 0x53, 0x5c, 0xb7, 0x8a, 0x3f, 0xe4, 0x26, 0x9f, + 0xf5, 0xc5, 0x7f, 0xad, 0x6f, 0x43, 0xe3, 0x32, + 0xad, 0xf0, 0x98, 0xd4, 0x51, 0x45, 0x76, 0x9c, + 0x81, 0x45, 0x14, 0x50, 0x05, 0xed, 0x32, 0xc1, + 0x6f, 0x1a, 0x57, 0x96, 0x5f, 0x2a, 0x08, 0x57, + 0x74, 0x8f, 0x8c, 0xd4, 0xd7, 0x16, 0x9a, 0x73, + 0xda, 0x49, 0x35, 0x95, 0xd3, 0xef, 0x8f, 0xef, + 0x47, 0x36, 0x01, 0x61, 0xed, 0x52, 0xe8, 0xa3, + 0xed, 0x16, 0x57, 0xf6, 0x2a, 0x40, 0x9a, 0x54, + 0x0c, 0x80, 0x9f, 0xbd, 0x8e, 0xd5, 0x58, 0xe9, + 0x17, 0x31, 0x5a, 0x4d, 0x71, 0x70, 0x04, 0x0b, + 0x1f, 0x40, 0xfd, 0x5c, 0xfa, 0x0a, 0xca, 0xfe, + 0xf6, 0xac, 0xd2, 0xda, 0x6c, 0x47, 0x6f, 0xa5, + 0xdf, 0x5c, 0xc3, 0xe7, 0x43, 0x6e, 0xcd, 0x1f, + 0xae, 0x40, 0xcf, 0xd3, 0xd6, 0x9b, 0x06, 0x9d, + 0x79, 0x70, 0xa5, 0xa1, 0x80, 0xb0, 0x0f, 0xb0, + 0xf2, 0x01, 0x0d, 0xe9, 0x5b, 0x73, 0x43, 0x71, + 0x3c, 0xba, 0x3c, 0x96, 0x8a, 0xcd, 0x0a, 0xa2, + 0x0c, 0xaf, 0x44, 0x20, 0xf3, 0x9a, 0x5d, 0x46, + 0x51, 0xfd, 0x9f, 0xaa, 0x34, 0x2d, 0x85, 0x6b, + 0xa0, 0xa4, 0xa9, 0xf6, 0x5c, 0xfe, 0xb4, 0xbd, + 0xa3, 0x1f, 0x22, 0x33, 0x24, 0xd1, 0xee, 0x22, + 0xd2, 0xfe, 0xd8, 0xc3, 0x9d, 0xdc, 0xae, 0x47, + 0x0b, 0xeb, 0xf9, 0xd5, 0x73, 0xa6, 0x5e, 0x8b, + 0x5f, 0xb4, 0x9b, 0x76, 0xf2, 0xb1, 0xbb, 0x3c, + 0x67, 0x1e, 0xb8, 0xeb, 0x57, 0xd9, 0x19, 0xfc, + 0x37, 0x6c, 0xc1, 0x19, 0xd5, 0x27, 0x62, 0xf8, + 0x19, 0xc0, 0xe7, 0xad, 0x6a, 0xdd, 0xc8, 0xd1, + 0xea, 0x0f, 0x3c, 0x3a, 0x73, 0x4e, 0x0c, 0x39, + 0xf3, 0xbc, 0xed, 0xa8, 0x53, 0x1e, 0xe3, 0x14, + 0xb9, 0xe4, 0x83, 0x91, 0x33, 0x98, 0xfb, 0x15, + 0xcf, 0x97, 0x0c, 0x82, 0x22, 0x52, 0x73, 0xb6, + 0x32, 0x08, 0x39, 0x3e, 0x9e, 0xd5, 0x72, 0xd2, + 0xd6, 0x18, 0xcd, 0xd4, 0x37, 0x96, 0xcc, 0xd3, + 0x40, 0x86, 0x43, 0xb6, 0x5f, 0xa7, 0xcb, 0xc6, + 0x7d, 0x6b, 0x43, 0x40, 0x26, 0x0b, 0x2c, 0xce, + 0xea, 0x8b, 0x34, 0xbb, 0x6d, 0xb7, 0x0c, 0xe1, + 0xf0, 0x46, 0x7f, 0xa5, 0x61, 0x4d, 0xf6, 0x8b, + 0x7b, 0x89, 0xa3, 0x91, 0x99, 0x64, 0xc9, 0x59, + 0x39, 0xfb, 0xde, 0xbf, 0x5a, 0xbb, 0xb9, 0x36, + 0x85, 0x64, 0x92, 0x66, 0xaa, 0x69, 0xb6, 0xb2, + 0xc5, 0x6d, 0x32, 0x86, 0x54, 0xdb, 0xe6, 0x4e, + 0xbb, 0xb3, 0x85, 0x39, 0xc6, 0x3f, 0xef, 0x9c, + 0x7e, 0x35, 0x95, 0x7d, 0x12, 0xc1, 0x7d, 0x71, + 0x12, 0x7d, 0xd4, 0x91, 0x94, 0x67, 0xd0, 0x1a, + 0x67, 0x9f, 0x36, 0xdd, 0xbe, 0x6b, 0xe3, 0x01, + 0x71, 0xb8, 0xf4, 0x07, 0x20, 0x7e, 0x75, 0x3d, + 0xa4, 0x96, 0x86, 0x79, 0x1f, 0x50, 0x13, 0x48, + 0x1b, 0x9c, 0xa1, 0xe7, 0x77, 0xbe, 0x69, 0xa4, + 0xd6, 0xac, 0x4d, 0xa7, 0xa1, 0x73, 0x4d, 0xd2, + 0xa2, 0xbd, 0xd3, 0x27, 0xb8, 0x2e, 0xe2, 0x64, + 0x2c, 0x11, 0x41, 0x18, 0x38, 0x5c, 0xfa, 0x51, + 0xa6, 0xe9, 0x51, 0x5d, 0x69, 0xd7, 0x37, 0x52, + 0xbb, 0xab, 0x46, 0x1b, 0x60, 0x52, 0x39, 0xc0, + 0xcf, 0x3c, 0x7b, 0x8a, 0xb7, 0xa7, 0x5c, 0x47, + 0x6f, 0xa7, 0x99, 0xa2, 0xdc, 0xb0, 0x8b, 0xe1, + 0x8d, 0xdd, 0x42, 0x91, 0x8e, 0x7f, 0x0a, 0xb6, + 0x51, 0x6d, 0x64, 0x9a, 0xc2, 0x3c, 0x6d, 0x8a, + 0xce, 0x67, 0x3f, 0x56, 0x61, 0xfd, 0x31, 0x59, + 0x4a, 0x72, 0xbb, 0x46, 0x8a, 0x2b, 0x43, 0x23, + 0x46, 0xd2, 0xa3, 0xbe, 0x0c, 0xf7, 0x0e, 0xe9, + 0x1e, 0x76, 0xa6, 0xd3, 0x82, 0xcd, 0x8c, 0xff, + 0x00, 0x2a, 0xc9, 0xae, 0xb3, 0x4e, 0x36, 0x2f, + 0x79, 0x6a, 0xb6, 0xd7, 0xbb, 0x84, 0x31, 0x15, + 0x58, 0x7c, 0xb2, 0x32, 0x48, 0xf9, 0x9b, 0x35, + 0xcb, 0xce, 0x91, 0xa4, 0xcc, 0xb1, 0x49, 0xe6, + 0xa0, 0x3c, 0x3e, 0xdc, 0x67, 0xf0, 0xab, 0x84, + 0x9b, 0x93, 0xb9, 0x12, 0x8a, 0x49, 0x11, 0xd1, + 0x45, 0x15, 0xa9, 0x98, 0x51, 0x45, 0x14, 0x01, + 0xd4, 0x78, 0x5f, 0xfe, 0x3c, 0x2e, 0x3f, 0xeb, + 0xa8, 0xfe, 0x55, 0x35, 0xd7, 0xfc, 0x7c, 0xb9, + 0xf7, 0xa8, 0x7c, 0x2f, 0xff, 0x00, 0x1e, 0x13, + 0xff, 0x00, 0xd7, 0x41, 0xfc, 0xaa, 0x6b, 0xaf, + 0xf8, 0xf8, 0x7f, 0xad, 0x79, 0xf5, 0x7e, 0x36, + 0x76, 0xd3, 0xf8, 0x51, 0x16, 0xa9, 0xa9, 0xfd, + 0x96, 0xf3, 0xca, 0x7b, 0x68, 0xe5, 0x5d, 0x8a, + 0x72, 0x49, 0x07, 0xa7, 0xad, 0x54, 0xfe, 0xdb, + 0x87, 0xfe, 0x81, 0xeb, 0xff, 0x00, 0x7f, 0x4d, + 0x43, 0xe2, 0x1f, 0xf9, 0x09, 0x0f, 0xfa, 0xe4, + 0xbf, 0xca, 0xb2, 0xeb, 0x1e, 0x54, 0xfa, 0x16, + 0x6d, 0x7f, 0x6d, 0xc3, 0xff, 0x00, 0x40, 0xf5, + 0xff, 0x00, 0xbf, 0xa6, 0x8f, 0xed, 0xb8, 0x7f, + 0xe8, 0x1e, 0xbf, 0xf7, 0xf4, 0xd6, 0x2d, 0x14, + 0x72, 0x47, 0xb0, 0x1b, 0x5f, 0xdb, 0x70, 0xff, + 0x00, 0xd0, 0x3d, 0x7f, 0xef, 0xe9, 0xa3, 0xfb, + 0x6e, 0x1f, 0xfa, 0x07, 0xaf, 0xfd, 0xfd, 0x35, + 0x8b, 0x45, 0x1c, 0x91, 0xec, 0x06, 0xd7, 0xf6, + 0xdc, 0x3f, 0xf4, 0x0f, 0x5f, 0xfb, 0xfa, 0x68, + 0xfe, 0xdb, 0x87, 0xfe, 0x81, 0xeb, 0xff, 0x00, + 0x7f, 0x4d, 0x62, 0xd5, 0xd9, 0x7c, 0xa6, 0xd2, + 0xe3, 0x64, 0x85, 0x51, 0x84, 0xa5, 0x4b, 0x77, + 0x6f, 0x94, 0x77, 0xa3, 0x92, 0x3d, 0x80, 0xbb, + 0xfd, 0xb7, 0x0f, 0xfd, 0x03, 0xd7, 0xfe, 0xfe, + 0x9a, 0x3f, 0xb6, 0xe1, 0xff, 0x00, 0xa0, 0x7a, + 0xff, 0x00, 0xdf, 0xd3, 0x55, 0xb4, 0xf8, 0xa3, + 0x9a, 0xca, 0xf1, 0x59, 0x14, 0xc8, 0x76, 0x84, + 0x62, 0x39, 0x07, 0x0c, 0x78, 0xfa, 0xed, 0xc5, + 0x4f, 0x6d, 0x04, 0x42, 0xd2, 0xc8, 0x34, 0x6a, + 0xce, 0xf7, 0x28, 0x58, 0x91, 0xce, 0xd3, 0x91, + 0xb7, 0xe9, 0xc6, 0x7f, 0x1a, 0x39, 0x23, 0xd8, + 0x07, 0x7f, 0x6d, 0xc3, 0xff, 0x00, 0x40, 0xf5, + 0xff, 0x00, 0xbf, 0xa6, 0x8f, 0xed, 0xb8, 0x7f, + 0xe8, 0x1e, 0xbf, 0xf7, 0xf4, 0xd4, 0x57, 0xb1, + 0xb7, 0xd8, 0xe5, 0x79, 0xa1, 0x81, 0x58, 0x48, + 0x04, 0x66, 0x10, 0xbc, 0x0e, 0x73, 0x9d, 0xbf, + 0x87, 0x5a, 0x6d, 0xa2, 0x4d, 0xfd, 0x9a, 0x1e, + 0xda, 0xd1, 0x67, 0x7f, 0x39, 0x83, 0x13, 0x08, + 0x90, 0x81, 0xb5, 0x71, 0xda, 0x8e, 0x48, 0xf6, + 0x02, 0x7f, 0xed, 0xb8, 0x7f, 0xe8, 0x1e, 0xbf, + 0xf7, 0xf4, 0xd1, 0xfd, 0xb7, 0x0f, 0xfd, 0x03, + 0xd7, 0xfe, 0xfe, 0x9a, 0xac, 0xf0, 0x79, 0xb1, + 0x40, 0x25, 0x41, 0x0c, 0x8f, 0x34, 0x81, 0xf1, + 0x1e, 0x08, 0xc0, 0x5e, 0x30, 0x3f, 0x97, 0xbd, + 0x0d, 0xa6, 0x6c, 0x72, 0x59, 0xe4, 0x58, 0xc4, + 0x7e, 0x67, 0x31, 0x7c, 0xf8, 0xdd, 0x8f, 0xbb, + 0x9f, 0xeb, 0x47, 0x24, 0x7b, 0x01, 0x67, 0xfb, + 0x6e, 0x1f, 0xfa, 0x07, 0xaf, 0xfd, 0xfd, 0x34, + 0x7f, 0x6d, 0xc3, 0xff, 0x00, 0x40, 0xf5, 0xff, + 0x00, 0xbf, 0xa6, 0xaa, 0xc7, 0x05, 0xb7, 0xd9, + 0x2e, 0x37, 0x4c, 0x36, 0x2c, 0xb1, 0xe2, 0x50, + 0x99, 0x38, 0x21, 0xb8, 0x03, 0xfc, 0xf4, 0xaa, + 0x97, 0x30, 0x9b, 0x7b, 0x89, 0x21, 0x24, 0x36, + 0xc3, 0x8c, 0x8e, 0xf4, 0x72, 0x47, 0xb0, 0x1a, + 0xbf, 0xdb, 0x70, 0xff, 0x00, 0xd0, 0x3d, 0x7f, + 0xef, 0xe9, 0xa3, 0xfb, 0x6e, 0x1f, 0xfa, 0x07, + 0xaf, 0xfd, 0xfd, 0x35, 0x8b, 0x45, 0x1c, 0x91, + 0xec, 0x06, 0xd7, 0xf6, 0xdc, 0x3f, 0xf4, 0x0f, + 0x5f, 0xfb, 0xfa, 0x68, 0xfe, 0xdb, 0x87, 0xfe, + 0x81, 0xeb, 0xff, 0x00, 0x7f, 0x4d, 0x62, 0xd1, + 0x47, 0x24, 0x7b, 0x01, 0xb5, 0xfd, 0xb7, 0x0f, + 0xfd, 0x03, 0xd7, 0xfe, 0xfe, 0x9a, 0x6b, 0x6b, + 0x8b, 0x8f, 0xdd, 0xd8, 0xc6, 0xad, 0xea, 0xcc, + 0x5a, 0xb1, 0xe8, 0xa3, 0x96, 0x3d, 0x80, 0xeb, + 0x6f, 0x1c, 0xbc, 0x91, 0xb1, 0xef, 0x1a, 0x9f, + 0xd2, 0xab, 0xd4, 0xd7, 0x5f, 0x7a, 0x3f, 0xfa, + 0xe4, 0xbf, 0xca, 0xa1, 0xaa, 0x02, 0x4b, 0xfb, + 0xe8, 0x2d, 0x96, 0xd9, 0x6e, 0x21, 0x67, 0xdf, + 0x1e, 0x77, 0xa9, 0xc1, 0x15, 0x53, 0xfb, 0x53, + 0x4d, 0xff, 0x00, 0x9e, 0x37, 0x3f, 0x9a, 0xd4, + 0x5e, 0x20, 0xfb, 0xb6, 0x5f, 0xf5, 0xcc, 0xff, + 0x00, 0x3a, 0xc6, 0xa9, 0x70, 0x8b, 0xd5, 0xa0, + 0x37, 0xbf, 0xb5, 0x34, 0xdf, 0xf9, 0xe3, 0x73, + 0xf9, 0xad, 0x1f, 0xda, 0x9a, 0x6f, 0xfc, 0xf1, + 0xb9, 0xfc, 0xd6, 0xb0, 0x68, 0xa5, 0xec, 0xe3, + 0xd8, 0x56, 0x37, 0xbf, 0xb5, 0x34, 0xdf, 0xf9, + 0xe3, 0x73, 0xf9, 0xad, 0x1f, 0xda, 0x9a, 0x6f, + 0xfc, 0xf1, 0xb9, 0xfc, 0xd6, 0xb3, 0x6d, 0x04, + 0x2b, 0x69, 0x71, 0x34, 0xb0, 0x2c, 0xc5, 0x19, + 0x15, 0x43, 0x33, 0x0c, 0x67, 0x76, 0x7a, 0x1f, + 0x6a, 0x92, 0x5b, 0x15, 0x95, 0xc3, 0x43, 0xb6, + 0x05, 0x30, 0x89, 0x5d, 0x5d, 0x8e, 0x13, 0xe6, + 0xc7, 0xff, 0x00, 0x5e, 0x8f, 0x67, 0x1e, 0xc1, + 0x62, 0xf7, 0xf6, 0xa6, 0x9b, 0xff, 0x00, 0x3c, + 0x6e, 0x7f, 0x35, 0xa3, 0xfb, 0x53, 0x4d, 0xff, + 0x00, 0x9e, 0x37, 0x3f, 0x9a, 0xd6, 0x5b, 0x58, + 0xc8, 0xb1, 0x17, 0xdf, 0x19, 0x60, 0xa1, 0xcc, + 0x60, 0xfc, 0xc1, 0x4f, 0x43, 0xfa, 0x8a, 0x91, + 0x74, 0xf9, 0x12, 0xe2, 0x24, 0x66, 0x86, 0x42, + 0x65, 0x11, 0xba, 0x6e, 0x3f, 0x2b, 0x1e, 0xcd, + 0xff, 0x00, 0xd6, 0xa3, 0xd9, 0xc7, 0xb0, 0x58, + 0xd0, 0xfe, 0xd4, 0xd3, 0x7f, 0xe7, 0x8d, 0xcf, + 0xe6, 0xb4, 0x7f, 0x6a, 0x69, 0xbf, 0xf3, 0xc6, + 0xe7, 0xf3, 0x5a, 0xca, 0x16, 0x6d, 0xe5, 0x2c, + 0x86, 0x48, 0x94, 0xb2, 0xee, 0x58, 0xcb, 0x61, + 0x88, 0xcf, 0x5f, 0x4e, 0xd5, 0x2b, 0x69, 0xee, + 0xd3, 0xc8, 0xbb, 0xa1, 0x8b, 0xf7, 0xad, 0x1a, + 0x29, 0x63, 0x86, 0x60, 0x7a, 0x0f, 0xd3, 0x93, + 0x47, 0xb3, 0x8f, 0x60, 0xb1, 0xa1, 0xfd, 0xa9, + 0xa6, 0xff, 0x00, 0xcf, 0x1b, 0x9f, 0xcd, 0x68, + 0xfe, 0xd4, 0xd3, 0x7f, 0xe7, 0x8d, 0xcf, 0xe6, + 0xb5, 0x99, 0x0d, 0x84, 0x92, 0xa2, 0xb1, 0x92, + 0x38, 0xf7, 0xc8, 0x63, 0x01, 0xc9, 0xce, 0xe1, + 0x8e, 0x3a, 0x7b, 0xd2, 0x5a, 0x42, 0x85, 0xa6, + 0x92, 0x70, 0x4a, 0x40, 0xbb, 0x99, 0x41, 0xc1, + 0x63, 0x90, 0x00, 0xfc, 0xcd, 0x1e, 0xce, 0x3d, + 0x82, 0xc6, 0xa7, 0xf6, 0xa6, 0x9b, 0xff, 0x00, + 0x3c, 0x6e, 0x7f, 0x35, 0xa3, 0xfb, 0x53, 0x4d, + 0xff, 0x00, 0x9e, 0x37, 0x3f, 0x9a, 0xd6, 0x73, + 0xa4, 0x37, 0x16, 0xad, 0x34, 0x10, 0xf9, 0x2f, + 0x1b, 0xaa, 0xb2, 0x06, 0x24, 0x10, 0x7a, 0x1e, + 0x7e, 0x94, 0x8d, 0xa7, 0xc8, 0x24, 0xf2, 0xc4, + 0xb0, 0xb3, 0x02, 0x43, 0x80, 0xdf, 0x73, 0x03, + 0x27, 0x3c, 0x7b, 0x1e, 0x94, 0x7b, 0x38, 0xf6, + 0x0b, 0x1a, 0x5f, 0xda, 0x9a, 0x6f, 0xfc, 0xf1, + 0xb9, 0xfc, 0xd6, 0x8f, 0xed, 0x4d, 0x37, 0xfe, + 0x78, 0xdc, 0xfe, 0x6b, 0x59, 0x9f, 0x64, 0x28, + 0x25, 0xc9, 0x8e, 0x45, 0x11, 0x87, 0x0e, 0xac, + 0x7a, 0x6e, 0x03, 0x8f, 0xe5, 0xcd, 0x4f, 0x77, + 0x67, 0x10, 0x7d, 0x91, 0x05, 0x8f, 0xfd, 0x22, + 0x54, 0xdc, 0xcd, 0xc0, 0x55, 0xdb, 0x8f, 0xeb, + 0x47, 0xb3, 0x8f, 0x60, 0xb1, 0x73, 0xfb, 0x53, + 0x4d, 0xff, 0x00, 0x9e, 0x37, 0x3f, 0x9a, 0xd1, + 0xfd, 0xa9, 0xa6, 0xff, 0x00, 0xcf, 0x1b, 0x9f, + 0xcd, 0x6b, 0x3d, 0x34, 0xf1, 0xb2, 0x56, 0x79, + 0xe3, 0xda, 0xb1, 0x79, 0x88, 0xcb, 0x9c, 0x37, + 0xcd, 0x8f, 0x4a, 0x8c, 0xd8, 0xc8, 0x22, 0x2f, + 0xbe, 0x3d, 0xc1, 0x43, 0x98, 0xf3, 0xf3, 0x05, + 0x3d, 0xff, 0x00, 0x51, 0x47, 0xb3, 0x8f, 0x60, + 0xb1, 0xa9, 0xfd, 0xa9, 0xa6, 0xff, 0x00, 0xcf, + 0x1b, 0x9f, 0xcd, 0x68, 0xfe, 0xd4, 0xd3, 0x7f, + 0xe7, 0x8d, 0xcf, 0xe6, 0xb5, 0x8f, 0x75, 0x6c, + 0xd6, 0xb3, 0x18, 0x5d, 0xd1, 0x9d, 0x78, 0x3b, + 0x0e, 0x71, 0x50, 0xd1, 0xec, 0xe3, 0xd8, 0x2c, + 0x6f, 0x7f, 0x6a, 0x69, 0xbf, 0xf3, 0xc6, 0xe7, + 0xf3, 0x5a, 0x3f, 0xb5, 0x34, 0xdf, 0xf9, 0xe3, + 0x73, 0xf9, 0xad, 0x60, 0xd1, 0x47, 0xb3, 0x8f, + 0x60, 0xb1, 0xd5, 0xd9, 0xdd, 0x41, 0x2d, 0xac, + 0xb3, 0xdb, 0x44, 0xc8, 0xc8, 0xc1, 0x43, 0x39, + 0x04, 0xf3, 0x50, 0xd4, 0x1a, 0x2f, 0xfc, 0x82, + 0xee, 0x7f, 0xeb, 0xa2, 0xff, 0x00, 0x2a, 0x9e, + 0xa9, 0x24, 0xb6, 0x19, 0x7e, 0x4f, 0xf8, 0xf5, + 0x83, 0xfd, 0xe8, 0xff, 0x00, 0x98, 0xa2, 0x89, + 0x3f, 0xe3, 0xd6, 0x1f, 0xf7, 0xa3, 0xfe, 0x62, + 0x8a, 0x60, 0x3e, 0xd7, 0xee, 0x3f, 0xfd, 0x74, + 0x7f, 0xfd, 0x08, 0xd4, 0xd5, 0x05, 0xb7, 0xdc, + 0x7f, 0xfa, 0xe8, 0xdf, 0xfa, 0x11, 0xa9, 0xe8, + 0x00, 0xae, 0x5f, 0xc4, 0xff, 0x00, 0xf2, 0x13, + 0x4f, 0xfa, 0xe2, 0xbf, 0xd6, 0xba, 0x8a, 0xe5, + 0xfc, 0x4f, 0xff, 0x00, 0x21, 0x24, 0xff, 0x00, + 0xae, 0x2b, 0xfc, 0xcd, 0x6f, 0x43, 0xe3, 0x32, + 0xad, 0xf0, 0x98, 0xd4, 0x51, 0x45, 0x76, 0x9c, + 0x81, 0x45, 0x14, 0x50, 0x02, 0xab, 0x15, 0x60, + 0xca, 0x48, 0x23, 0xa1, 0x15, 0x24, 0xb7, 0x13, + 0xcf, 0x8f, 0x3a, 0x69, 0x24, 0xc7, 0x4d, 0xec, + 0x4e, 0x2a, 0x49, 0xed, 0xd2, 0x3b, 0x2b, 0x59, + 0xd4, 0x9d, 0xd2, 0xef, 0xdc, 0x0f, 0x4e, 0x0f, + 0x6a, 0x90, 0xd8, 0x97, 0x82, 0xcc, 0xc0, 0x19, + 0xe5, 0x9d, 0x5c, 0x95, 0xc8, 0xfe, 0x12, 0x7a, + 0x7e, 0x02, 0xa6, 0xeb, 0x71, 0xd9, 0x95, 0xe3, + 0xb8, 0x9e, 0x24, 0x29, 0x1c, 0xd2, 0x22, 0x1e, + 0xaa, 0xac, 0x40, 0x34, 0xd1, 0x2c, 0x82, 0x23, + 0x10, 0x91, 0x84, 0x64, 0xe4, 0xa6, 0x78, 0x27, + 0xe9, 0x52, 0x4f, 0x67, 0x71, 0x6e, 0x8a, 0xf2, + 0xc7, 0x85, 0x63, 0x8c, 0x86, 0x07, 0x9f, 0x4e, + 0x3a, 0x1a, 0x91, 0x6c, 0x24, 0x7d, 0x38, 0xdd, + 0x82, 0x08, 0xdf, 0xb4, 0x0d, 0xc3, 0x3f, 0x95, + 0x3b, 0xad, 0xc2, 0xcc, 0x81, 0x66, 0x99, 0x22, + 0x68, 0x96, 0x57, 0x58, 0xdb, 0xef, 0x20, 0x63, + 0x83, 0xf8, 0x52, 0xfd, 0xa2, 0x7f, 0x27, 0xc9, + 0xf3, 0xa4, 0xf2, 0xbf, 0xb9, 0xb8, 0xed, 0xfc, + 0xaa, 0x49, 0xec, 0x2e, 0xad, 0xe3, 0xf3, 0x25, + 0x88, 0xaa, 0x83, 0x82, 0x72, 0x0e, 0x0f, 0xbe, + 0x3a, 0x7e, 0x35, 0x1d, 0xba, 0x47, 0x24, 0xa0, + 0x4b, 0x27, 0x97, 0x18, 0x19, 0x27, 0x19, 0x3f, + 0x41, 0xef, 0x45, 0xd6, 0xe1, 0xae, 0xc3, 0x5a, + 0x69, 0x5d, 0x51, 0x5a, 0x57, 0x61, 0x1f, 0xdc, + 0x05, 0x8f, 0xcb, 0xf4, 0xf4, 0xa4, 0x92, 0x49, + 0x25, 0x72, 0xf2, 0xbb, 0x3b, 0x9e, 0xac, 0xc7, + 0x26, 0xae, 0x4f, 0x67, 0x0c, 0x7a, 0xb3, 0xda, + 0x99, 0xbc, 0xb8, 0x55, 0xbe, 0xfb, 0xf5, 0x03, + 0x19, 0xa7, 0x9b, 0x2b, 0x7b, 0x88, 0xa3, 0x92, + 0xc9, 0xa5, 0x1b, 0xa6, 0x10, 0x95, 0x97, 0x1d, + 0x4f, 0x43, 0xc5, 0x2e, 0x64, 0x3b, 0x33, 0x3a, + 0x8a, 0xd0, 0x9a, 0xd6, 0xd1, 0xa1, 0x9c, 0xda, + 0xbc, 0xac, 0xf6, 0xfc, 0xb6, 0xfc, 0x61, 0xc6, + 0x71, 0x91, 0x8e, 0x9c, 0xd2, 0x69, 0xb6, 0x29, + 0x79, 0x15, 0xc9, 0x66, 0x61, 0x24, 0x69, 0x98, + 0xc0, 0xe8, 0x4f, 0x3c, 0x1f, 0xca, 0x8e, 0x65, + 0x6b, 0x87, 0x2b, 0xbd, 0x8a, 0x62, 0x59, 0x04, + 0x46, 0x2f, 0x31, 0xbc, 0xb2, 0x72, 0x53, 0x3c, + 0x67, 0xd7, 0x14, 0xef, 0xb4, 0xdc, 0x17, 0x67, + 0x33, 0xc9, 0xbd, 0x97, 0x6b, 0x36, 0xf3, 0x92, + 0x3d, 0x0f, 0xb5, 0x5a, 0xd3, 0x2c, 0x52, 0xef, + 0xcf, 0x69, 0x19, 0x95, 0x63, 0x8c, 0x91, 0xb4, + 0xe3, 0x2d, 0x82, 0x40, 0xfc, 0x81, 0xa8, 0x6f, + 0x2d, 0xd2, 0x01, 0x6f, 0xb0, 0x93, 0xe6, 0xc2, + 0xb2, 0x1c, 0xfa, 0x9c, 0xff, 0x00, 0x85, 0x17, + 0x57, 0xb0, 0x59, 0xda, 0xe4, 0x31, 0x4b, 0x24, + 0x2f, 0xbe, 0x29, 0x1a, 0x36, 0xfe, 0xf2, 0x9c, + 0x1a, 0x65, 0x5e, 0x97, 0x4f, 0x63, 0x2c, 0x71, + 0xdb, 0xfc, 0xc5, 0xa0, 0x49, 0x1b, 0x7b, 0xaa, + 0xf5, 0x1e, 0xf8, 0xa8, 0x2e, 0x6d, 0x67, 0xb4, + 0x65, 0x59, 0x94, 0x29, 0x61, 0xb9, 0x70, 0xc1, + 0xb2, 0x3f, 0x0a, 0x69, 0xa6, 0x26, 0x99, 0x05, + 0x14, 0x51, 0x4c, 0x41, 0x45, 0x14, 0x50, 0x07, + 0x51, 0xe1, 0x7f, 0xf8, 0xf0, 0x9f, 0xfe, 0xba, + 0x8f, 0xe5, 0x53, 0x5d, 0x7f, 0xc7, 0xc3, 0xd4, + 0x3e, 0x17, 0xff, 0x00, 0x8f, 0x0b, 0x8f, 0xfa, + 0xea, 0x3f, 0x95, 0x4d, 0x73, 0xff, 0x00, 0x1f, + 0x0f, 0x5e, 0x7d, 0x5f, 0x8d, 0x9d, 0xb4, 0xfe, + 0x14, 0x64, 0xf8, 0x87, 0xfe, 0x42, 0x43, 0xfe, + 0xb9, 0x2f, 0xf2, 0xac, 0xba, 0xeb, 0x2f, 0xb5, + 0x5b, 0x6b, 0x39, 0x96, 0x19, 0x6d, 0x8c, 0xae, + 0x11, 0x4e, 0xec, 0x2d, 0x56, 0xfe, 0xdf, 0xb2, + 0xff, 0x00, 0x9f, 0x13, 0xf9, 0x2f, 0xf8, 0x56, + 0x65, 0x9c, 0xe5, 0x15, 0xd1, 0xff, 0x00, 0x6f, + 0xd9, 0x7f, 0xcf, 0x89, 0xfc, 0x97, 0xfc, 0x28, + 0xfe, 0xdf, 0xb2, 0xff, 0x00, 0x9f, 0x13, 0xf9, + 0x2f, 0xf8, 0x50, 0x07, 0x39, 0x45, 0x74, 0x7f, + 0xdb, 0xf6, 0x5f, 0xf3, 0xe2, 0x7f, 0x25, 0xff, + 0x00, 0x0a, 0x3f, 0xb7, 0xec, 0xbf, 0xe7, 0xc4, + 0xfe, 0x4b, 0xfe, 0x14, 0x01, 0xce, 0x55, 0xd3, + 0x25, 0x9f, 0xf6, 0x78, 0x80, 0x3c, 0xfe, 0x68, + 0x6d, 0xff, 0x00, 0x70, 0x63, 0x38, 0xc6, 0x3a, + 0xf4, 0xad, 0x6f, 0xed, 0xfb, 0x2f, 0xf9, 0xf1, + 0x3f, 0x92, 0xff, 0x00, 0x85, 0x1f, 0xdb, 0xf6, + 0x5f, 0xf3, 0xe2, 0x7f, 0x25, 0xff, 0x00, 0x0a, + 0x00, 0xc6, 0xb5, 0xba, 0x16, 0xf1, 0x30, 0x00, + 0xef, 0xf3, 0x51, 0xc7, 0xa7, 0xcb, 0x9f, 0xf1, + 0xab, 0x1f, 0xda, 0x10, 0xf9, 0xe1, 0x82, 0x38, + 0x8d, 0x6e, 0x23, 0x75, 0x18, 0x1c, 0x22, 0x0c, + 0x63, 0xeb, 0xd2, 0xb4, 0x7f, 0xb7, 0xec, 0xbf, + 0xe7, 0xc4, 0xfe, 0x4b, 0xfe, 0x14, 0x7f, 0x6f, + 0xd9, 0x7f, 0xcf, 0x89, 0xfc, 0x97, 0xfc, 0x28, + 0x03, 0x26, 0x49, 0xed, 0x52, 0x19, 0xd6, 0x03, + 0x33, 0xb4, 0xf8, 0x04, 0xc8, 0xa1, 0x42, 0x8c, + 0xe7, 0xb1, 0x3e, 0x95, 0x17, 0xda, 0x31, 0x62, + 0x90, 0x2e, 0xe0, 0xe2, 0x56, 0x72, 0x47, 0x4c, + 0x10, 0x07, 0xf4, 0xad, 0xbf, 0xed, 0xfb, 0x2f, + 0xf9, 0xf1, 0x3f, 0x92, 0xff, 0x00, 0x85, 0x1f, + 0xdb, 0xf6, 0x5f, 0xf3, 0xe2, 0x7f, 0x25, 0xff, + 0x00, 0x0a, 0x00, 0xcb, 0xb6, 0xbd, 0x8e, 0x28, + 0xa3, 0x47, 0xf3, 0x32, 0x0c, 0xbb, 0x99, 0x7a, + 0x8d, 0xca, 0x06, 0x47, 0xbf, 0x14, 0xff, 0x00, + 0xb5, 0xda, 0xed, 0x84, 0x2b, 0x5c, 0xc4, 0xd1, + 0x29, 0x55, 0x91, 0x31, 0x9e, 0xb9, 0xcf, 0x5f, + 0x73, 0xc5, 0x68, 0xff, 0x00, 0x6f, 0xd9, 0x7f, + 0xcf, 0x89, 0xfc, 0x97, 0xfc, 0x28, 0xfe, 0xdf, + 0xb2, 0xff, 0x00, 0x9f, 0x13, 0xf9, 0x2f, 0xf8, + 0x50, 0x06, 0x4d, 0xd5, 0xe4, 0x73, 0xa4, 0xe1, + 0x55, 0x81, 0x92, 0x44, 0x60, 0x48, 0x1c, 0xed, + 0x52, 0x09, 0x3e, 0xe7, 0x39, 0xa8, 0x6f, 0x26, + 0x59, 0xee, 0xa4, 0x95, 0x01, 0x0a, 0xc7, 0x23, + 0x3d, 0x6b, 0x73, 0xfb, 0x7e, 0xcb, 0xfe, 0x7c, + 0x4f, 0xe4, 0xbf, 0xe1, 0x47, 0xf6, 0xfd, 0x97, + 0xfc, 0xf8, 0x9f, 0xc9, 0x7f, 0xc2, 0x80, 0x39, + 0xca, 0x2b, 0xa3, 0xfe, 0xdf, 0xb2, 0xff, 0x00, + 0x9f, 0x13, 0xf9, 0x2f, 0xf8, 0x51, 0xfd, 0xbf, + 0x65, 0xff, 0x00, 0x3e, 0x27, 0xf2, 0x5f, 0xf0, + 0xa0, 0x0e, 0x72, 0x8a, 0xe8, 0xff, 0x00, 0xb7, + 0xec, 0xbf, 0xe7, 0xc4, 0xfe, 0x4b, 0xfe, 0x14, + 0x7f, 0x6f, 0xd9, 0x7f, 0xcf, 0x89, 0xfc, 0x97, + 0xfc, 0x28, 0x03, 0x9c, 0xa2, 0xba, 0x3f, 0xed, + 0xfb, 0x2f, 0xf9, 0xf1, 0x3f, 0x92, 0xff, 0x00, + 0x85, 0x1f, 0xdb, 0xf6, 0x5f, 0xf3, 0xe2, 0x7f, + 0x25, 0xff, 0x00, 0x0a, 0x00, 0xb1, 0x75, 0xf7, + 0xa3, 0xff, 0x00, 0xae, 0x4b, 0xfc, 0xaa, 0x1a, + 0xb1, 0x7a, 0x77, 0x4c, 0x18, 0x67, 0x0c, 0x8a, + 0x40, 0xf4, 0xe2, 0xab, 0xd0, 0x05, 0x3f, 0x10, + 0x7d, 0xdb, 0x2f, 0xfa, 0xe6, 0x7f, 0x9d, 0x63, + 0x57, 0x43, 0xaa, 0xde, 0xc3, 0x6e, 0xb6, 0xcb, + 0x35, 0xa4, 0x53, 0x66, 0x3c, 0x86, 0x73, 0x8c, + 0x72, 0x7f, 0xc2, 0xb3, 0xbf, 0xb5, 0x6c, 0xbf, + 0xe8, 0x1d, 0x6b, 0xff, 0x00, 0x7d, 0x1a, 0x00, + 0xcf, 0xa2, 0xb4, 0x3f, 0xb5, 0x6c, 0xbf, 0xe8, + 0x1d, 0x6b, 0xff, 0x00, 0x7d, 0x1a, 0x51, 0xa9, + 0x5a, 0x91, 0x91, 0xa6, 0x5b, 0x91, 0xec, 0x4d, + 0x16, 0x02, 0x2b, 0x4b, 0xb6, 0xb6, 0xb3, 0xb8, + 0x58, 0xa5, 0x68, 0xe5, 0x76, 0x4c, 0x6d, 0xc8, + 0x24, 0x0d, 0xd9, 0xfe, 0x62, 0x9b, 0x1d, 0xc1, + 0x64, 0xbb, 0x33, 0x48, 0xcd, 0x24, 0xb1, 0x85, + 0x05, 0x89, 0x24, 0x9d, 0xca, 0x7f, 0x90, 0xab, + 0x1f, 0xda, 0x36, 0xbf, 0xf4, 0x0b, 0xb7, 0xfc, + 0xcd, 0x1f, 0xda, 0x36, 0xbf, 0xf4, 0x0b, 0xb7, + 0xfc, 0xcd, 0x00, 0x49, 0x2d, 0xfa, 0x18, 0xfc, + 0xd4, 0x96, 0x25, 0x63, 0x1a, 0xa9, 0x8f, 0xc8, + 0x1b, 0xf3, 0x80, 0x0f, 0xcd, 0x8e, 0x9c, 0x7a, + 0xd3, 0x04, 0x96, 0x69, 0xa8, 0xc7, 0x76, 0x27, + 0x2d, 0xba, 0xe0, 0x48, 0x46, 0xd2, 0x36, 0x2e, + 0x72, 0x73, 0xea, 0x7e, 0x94, 0x9f, 0xda, 0x36, + 0xbf, 0xf4, 0x0b, 0xb7, 0xfc, 0xcd, 0x1f, 0xda, + 0x36, 0xbf, 0xf4, 0x0b, 0xb7, 0xfc, 0xcd, 0x00, + 0x24, 0x33, 0xc2, 0xb6, 0x9b, 0x25, 0x9d, 0x64, + 0x40, 0x87, 0x11, 0x34, 0x7f, 0x32, 0xb7, 0x62, + 0xad, 0xd8, 0x67, 0x9e, 0xbf, 0x85, 0x4b, 0x2d, + 0xc5, 0xad, 0xc4, 0xfb, 0xda, 0x7d, 0x8b, 0x1d, + 0xcb, 0xc8, 0x3e, 0x52, 0x77, 0xa9, 0x20, 0xf1, + 0xef, 0xc7, 0x7a, 0x8f, 0xfb, 0x46, 0xd7, 0xfe, + 0x81, 0x76, 0xff, 0x00, 0x99, 0xa3, 0xfb, 0x46, + 0xd7, 0xfe, 0x81, 0x76, 0xff, 0x00, 0x99, 0xa0, + 0x06, 0xfd, 0xaa, 0x36, 0x36, 0xee, 0xcd, 0xb4, + 0x8b, 0xa6, 0x95, 0x86, 0x3a, 0x03, 0xb7, 0xfc, + 0x0d, 0x47, 0x0c, 0xf1, 0x09, 0xee, 0x52, 0x42, + 0x44, 0x33, 0x82, 0xbb, 0x80, 0xce, 0xde, 0x72, + 0x0e, 0x3f, 0x0a, 0x9b, 0xfb, 0x46, 0xd7, 0xfe, + 0x81, 0x76, 0xff, 0x00, 0x99, 0xa3, 0xfb, 0x46, + 0xd7, 0xfe, 0x81, 0x76, 0xff, 0x00, 0x99, 0xa0, + 0x08, 0x9d, 0xed, 0xe0, 0xb5, 0x68, 0x22, 0x9b, + 0xcd, 0x69, 0x1d, 0x4b, 0xba, 0xa9, 0x00, 0x01, + 0xd8, 0x67, 0xbf, 0x35, 0x6c, 0xdd, 0xdb, 0xe0, + 0xac, 0xb7, 0x0b, 0x33, 0xbe, 0xe4, 0xf3, 0x56, + 0x32, 0x19, 0x54, 0xa9, 0x1f, 0x37, 0x1c, 0xf3, + 0x8f, 0x5e, 0xf5, 0x0f, 0xf6, 0x8d, 0xaf, 0xfd, + 0x02, 0xed, 0xff, 0x00, 0x33, 0x47, 0xf6, 0x8d, + 0xaf, 0xfd, 0x02, 0xed, 0xff, 0x00, 0x33, 0x40, + 0x11, 0xab, 0x5b, 0x41, 0x1d, 0xc4, 0x69, 0x31, + 0x72, 0xf1, 0x01, 0xbb, 0x69, 0x00, 0xb6, 0xf0, + 0x78, 0xfc, 0x07, 0x7a, 0xb4, 0xd7, 0x96, 0xcd, + 0x70, 0xcc, 0x24, 0x03, 0x33, 0x4e, 0xca, 0xe5, + 0x49, 0xdb, 0xb8, 0x0d, 0xad, 0xd3, 0xda, 0xa1, + 0xfe, 0xd1, 0xb5, 0xff, 0x00, 0xa0, 0x5d, 0xbf, + 0xe6, 0x68, 0xfe, 0xd1, 0xb5, 0xff, 0x00, 0xa0, + 0x5d, 0xbf, 0xe6, 0x68, 0x02, 0x59, 0x2e, 0xa0, + 0x96, 0x1d, 0x8f, 0x76, 0x5d, 0xcc, 0x0d, 0x19, + 0x77, 0x56, 0x39, 0x3b, 0xc3, 0x7e, 0x5d, 0xaa, + 0x36, 0xb8, 0xb7, 0xcc, 0x97, 0x22, 0x5c, 0xc9, + 0x24, 0x22, 0x3f, 0x2b, 0x69, 0xc8, 0x38, 0x00, + 0x9c, 0xf4, 0xc7, 0x14, 0x9f, 0xda, 0x36, 0xbf, + 0xf4, 0x0b, 0xb7, 0xfc, 0xcd, 0x1f, 0xda, 0x36, + 0xbf, 0xf4, 0x0b, 0xb7, 0xfc, 0xcd, 0x00, 0x54, + 0xbe, 0x91, 0x65, 0xbe, 0xb8, 0x91, 0x0e, 0x51, + 0xe4, 0x66, 0x53, 0xea, 0x33, 0x50, 0x56, 0x97, + 0xf6, 0x8d, 0xaf, 0xfd, 0x02, 0xed, 0xff, 0x00, + 0x33, 0x47, 0xf6, 0x8d, 0xaf, 0xfd, 0x02, 0xed, + 0xff, 0x00, 0x33, 0x40, 0x19, 0xb4, 0x56, 0x97, + 0xf6, 0x8d, 0xaf, 0xfd, 0x02, 0xed, 0xff, 0x00, + 0x33, 0x47, 0xf6, 0x8d, 0xaf, 0xfd, 0x02, 0xed, + 0xff, 0x00, 0x33, 0x40, 0x17, 0x34, 0x5f, 0xf9, + 0x05, 0xdc, 0xff, 0x00, 0xd7, 0x45, 0xfe, 0x55, + 0x3d, 0x1a, 0x7d, 0xcc, 0x73, 0xe9, 0xf7, 0x02, + 0x3b, 0x68, 0xe0, 0x01, 0xd7, 0x21, 0x3b, 0xd1, + 0x40, 0x17, 0xe4, 0xff, 0x00, 0x8f, 0x58, 0x7f, + 0xde, 0x4f, 0xe6, 0x28, 0xa4, 0x93, 0xfe, 0x3d, + 0xa1, 0xff, 0x00, 0x79, 0x3f, 0x98, 0xa2, 0x80, + 0x1f, 0x6d, 0xf7, 0x1f, 0xfe, 0xba, 0x3f, 0xfe, + 0x84, 0x6a, 0x6a, 0x86, 0xdb, 0xee, 0x3f, 0xfd, + 0x74, 0x7f, 0xfd, 0x08, 0xd4, 0xd4, 0x00, 0x57, + 0x31, 0xe2, 0x7f, 0xf9, 0x09, 0x27, 0xfd, 0x71, + 0x5f, 0xe6, 0x6b, 0xa7, 0xae, 0x63, 0xc4, 0xff, + 0x00, 0xf2, 0x12, 0x4f, 0xfa, 0xe2, 0xbf, 0xd6, + 0xb7, 0xa1, 0xf1, 0x99, 0x56, 0xf8, 0x4c, 0x6a, + 0x28, 0xa2, 0xbb, 0x4e, 0x40, 0xa2, 0x8a, 0x28, + 0x03, 0x4a, 0x48, 0xa4, 0xb8, 0xd2, 0x2d, 0x0c, + 0x28, 0xd2, 0x79, 0x4e, 0xea, 0xe1, 0x46, 0x4a, + 0x92, 0x41, 0x15, 0x7a, 0xd5, 0x5e, 0x2b, 0xbd, + 0x2e, 0xdd, 0xbe, 0x59, 0x92, 0x29, 0x09, 0x07, + 0xaa, 0xee, 0xdc, 0x46, 0x6b, 0x0e, 0x29, 0xa6, + 0x81, 0x89, 0x86, 0x57, 0x8c, 0x9e, 0xa5, 0x18, + 0x8a, 0x9a, 0xca, 0xe4, 0x41, 0x7a, 0xb7, 0x13, + 0x17, 0x7e, 0x1b, 0x27, 0xa9, 0x39, 0x52, 0x3f, + 0xad, 0x67, 0x28, 0xbb, 0x16, 0xa4, 0xae, 0x4e, + 0x23, 0x92, 0x2d, 0x1a, 0xe0, 0x4c, 0x8c, 0x9b, + 0xa7, 0x40, 0xa1, 0x86, 0x39, 0x00, 0xe6, 0xac, + 0x69, 0x98, 0x16, 0x96, 0xcc, 0xc3, 0xe4, 0x5b, + 0xe5, 0x2c, 0x7b, 0x0e, 0x3a, 0x9a, 0xca, 0x92, + 0x69, 0x65, 0x0a, 0x25, 0x95, 0xdc, 0x2f, 0x0b, + 0xb9, 0x89, 0xc5, 0x22, 0xcb, 0x22, 0x23, 0x22, + 0x48, 0xca, 0x8f, 0xf7, 0x94, 0x1c, 0x03, 0xf5, + 0xa6, 0xe2, 0xda, 0x05, 0x2b, 0x33, 0x49, 0x22, + 0x9a, 0x18, 0xb5, 0x43, 0x70, 0xac, 0xa0, 0xae, + 0xd3, 0xb8, 0x75, 0x6d, 0xe3, 0x1f, 0xd6, 0xb3, + 0x11, 0x1d, 0xce, 0xd4, 0x42, 0xc7, 0xd0, 0x0c, + 0xd3, 0xa4, 0x9e, 0x69, 0x55, 0x52, 0x59, 0xa4, + 0x75, 0x5e, 0x81, 0x98, 0x90, 0x29, 0x22, 0x9a, + 0x58, 0x1f, 0x7c, 0x32, 0x3c, 0x6d, 0x8c, 0x65, + 0x18, 0x83, 0x4d, 0x26, 0x84, 0xda, 0x66, 0x96, + 0xa3, 0x69, 0x35, 0xc6, 0xb9, 0x24, 0x48, 0x84, + 0x79, 0x8f, 0xc3, 0x11, 0xc7, 0x4e, 0x4d, 0x3e, + 0x39, 0x84, 0x17, 0xd6, 0x91, 0xa4, 0x6f, 0x1d, + 0xa4, 0x53, 0x03, 0xbd, 0xd4, 0x8d, 0xe7, 0xbb, + 0x1a, 0xcf, 0x37, 0xd7, 0x8c, 0xca, 0xe6, 0xee, + 0x72, 0xcb, 0xf7, 0x49, 0x90, 0xe4, 0x7d, 0x29, + 0xb2, 0xdd, 0xdd, 0x4c, 0x9b, 0x26, 0xb9, 0x96, + 0x45, 0xeb, 0x87, 0x72, 0x45, 0x4f, 0x2b, 0xb5, + 0x98, 0xf9, 0x96, 0xe8, 0xbd, 0x15, 0xbc, 0xb6, + 0x91, 0x6a, 0x2d, 0x32, 0x32, 0x0f, 0x2f, 0xca, + 0x19, 0x18, 0xcb, 0x16, 0x1d, 0x3f, 0x23, 0x4c, + 0xd3, 0x66, 0x68, 0x2d, 0x2e, 0xa6, 0x5e, 0xb1, + 0xb4, 0x4c, 0x3f, 0xef, 0xaa, 0xa5, 0x24, 0xf3, + 0x4a, 0xaa, 0xb2, 0x4a, 0xee, 0xab, 0xf7, 0x43, + 0x31, 0x20, 0x53, 0x43, 0xb2, 0xab, 0x20, 0x66, + 0x0a, 0xdf, 0x78, 0x03, 0xc1, 0xa7, 0xcb, 0x75, + 0xa8, 0xb9, 0xb5, 0xd0, 0xdf, 0x11, 0xa5, 0xad, + 0xc2, 0xc1, 0x11, 0x1b, 0x65, 0x13, 0x4e, 0x3f, + 0xdd, 0xd8, 0xc1, 0x3f, 0xaf, 0xe7, 0x55, 0xae, + 0xef, 0x0d, 0xbc, 0x36, 0x48, 0x2d, 0xed, 0xe4, + 0xff, 0x00, 0x46, 0x53, 0x99, 0x62, 0x0c, 0x7a, + 0x9e, 0xf5, 0x95, 0xe7, 0x4b, 0xb8, 0x37, 0x98, + 0xfb, 0x82, 0xed, 0x07, 0x71, 0xc8, 0x1d, 0x31, + 0xf4, 0xa4, 0x67, 0x77, 0xdb, 0xbd, 0x8b, 0x6d, + 0x18, 0x19, 0x39, 0xc0, 0xf4, 0xa4, 0xa1, 0xae, + 0xa3, 0x73, 0xec, 0x6c, 0x5c, 0xc1, 0xf6, 0xcb, + 0xf8, 0x5d, 0xd7, 0x6c, 0x2b, 0x6d, 0x1c, 0x92, + 0xec, 0x1d, 0x06, 0x3a, 0x01, 0xfa, 0x0a, 0xcd, + 0xbd, 0x96, 0x59, 0xee, 0x0c, 0x92, 0x21, 0x8c, + 0x1e, 0x11, 0x31, 0x80, 0xaa, 0x3a, 0x01, 0x4d, + 0x4b, 0xbb, 0x98, 0xce, 0x63, 0xb8, 0x95, 0x0e, + 0x02, 0xe5, 0x5c, 0x8e, 0x07, 0x41, 0x4d, 0x9a, + 0x79, 0xa7, 0x20, 0xcd, 0x34, 0x92, 0x91, 0xd0, + 0xbb, 0x16, 0xc5, 0x38, 0xc5, 0xa1, 0x36, 0x99, + 0x1d, 0x14, 0x51, 0x56, 0x48, 0x51, 0x45, 0x14, + 0x01, 0xd4, 0x78, 0x5f, 0xfe, 0x3c, 0x2e, 0x3f, + 0xeb, 0xa8, 0xfe, 0x55, 0x35, 0xcf, 0xfc, 0x7c, + 0x3f, 0xd6, 0xa1, 0xf0, 0xc7, 0xfc, 0x78, 0x5c, + 0x7f, 0xd7, 0x51, 0xfc, 0xaa, 0x6b, 0x9f, 0xf8, + 0xf8, 0x7a, 0xf3, 0xea, 0xfc, 0x6c, 0xed, 0xa7, + 0xf0, 0xa3, 0x27, 0xc4, 0x3f, 0xf2, 0x12, 0x1f, + 0xf5, 0xc9, 0x7f, 0x95, 0x65, 0xd6, 0xa7, 0x88, + 0x7f, 0xe4, 0x24, 0x3f, 0xeb, 0x92, 0xff, 0x00, + 0x2a, 0xcb, 0xac, 0xcb, 0x0a, 0x28, 0xa2, 0x80, + 0x0a, 0x28, 0xa5, 0x18, 0xc8, 0x24, 0x64, 0x7a, + 0x50, 0x06, 0xcc, 0x17, 0x2c, 0xe6, 0x09, 0x2e, + 0xd9, 0x11, 0x1a, 0xe1, 0x1a, 0x15, 0xe8, 0x11, + 0x41, 0xe7, 0x1e, 0x83, 0xa0, 0xa4, 0x89, 0x6e, + 0x26, 0x9d, 0x25, 0xb8, 0xbb, 0x49, 0xe2, 0x45, + 0x76, 0x56, 0xdc, 0x59, 0x51, 0x82, 0xe7, 0x90, + 0x7f, 0x03, 0xf8, 0x55, 0x5b, 0x8b, 0xcb, 0x69, + 0x66, 0x13, 0x0b, 0x46, 0x0e, 0x08, 0xc0, 0x69, + 0x37, 0x2e, 0x07, 0xf0, 0xe3, 0x03, 0x8a, 0x41, + 0x7e, 0x91, 0x6c, 0x58, 0x2d, 0xf6, 0x44, 0x09, + 0x2e, 0xac, 0xfb, 0xb7, 0xe4, 0x60, 0x8c, 0xfd, + 0x33, 0x40, 0x0d, 0xd4, 0x0b, 0xbf, 0x93, 0x2b, + 0x4d, 0xe7, 0x2b, 0xa9, 0x02, 0x42, 0xbb, 0x58, + 0xe0, 0xf4, 0x35, 0x76, 0xe5, 0x4c, 0x16, 0xcb, + 0x76, 0x84, 0x34, 0xa6, 0x18, 0x90, 0x60, 0xf3, + 0x18, 0x2b, 0xf7, 0xbf, 0x1e, 0x9f, 0xe4, 0x56, + 0x6d, 0xcc, 0xeb, 0x28, 0x8d, 0x23, 0x8f, 0xcb, + 0x8a, 0x30, 0x42, 0xa9, 0x6d, 0xc7, 0x9e, 0xa4, + 0x9a, 0x95, 0x6f, 0x88, 0x9d, 0x5c, 0xc7, 0x94, + 0xf2, 0x96, 0x27, 0x4c, 0xfd, 0xf0, 0x06, 0x3f, + 0xa6, 0x68, 0x03, 0x42, 0xd2, 0x47, 0x5b, 0x6d, + 0x3c, 0x7d, 0xb1, 0x62, 0x8c, 0x83, 0xba, 0x26, + 0x27, 0xe7, 0xf9, 0xcf, 0xb6, 0x3d, 0xb9, 0x35, + 0x9d, 0x6c, 0xd1, 0xc1, 0xa9, 0x6e, 0x99, 0x36, + 0x2a, 0xb3, 0x02, 0x08, 0xce, 0xc3, 0xce, 0x38, + 0xf6, 0x3f, 0xca, 0x9c, 0x97, 0x76, 0xfe, 0x4c, + 0x29, 0x2d, 0xab, 0x3b, 0x42, 0x08, 0x53, 0xe6, + 0xe0, 0x1f, 0x98, 0x9e, 0x46, 0x3d, 0xea, 0x15, + 0xb9, 0x26, 0xed, 0xae, 0x25, 0x8d, 0x24, 0xde, + 0x58, 0xba, 0x91, 0xc1, 0xcf, 0x5f, 0xa5, 0x00, + 0x69, 0x2f, 0xda, 0x5a, 0xe6, 0xcd, 0xa4, 0x9a, + 0x3b, 0x98, 0xbe, 0xd0, 0x9b, 0x66, 0x53, 0x92, + 0x0e, 0x7e, 0xe9, 0xee, 0x3e, 0x94, 0x5c, 0x1b, + 0xa1, 0x6d, 0x72, 0x6f, 0x66, 0x12, 0x44, 0x7e, + 0x58, 0x81, 0x90, 0x39, 0xdf, 0x91, 0xd3, 0x1d, + 0x38, 0xcd, 0x54, 0x5b, 0xe8, 0xa2, 0x31, 0x08, + 0x2d, 0xca, 0x22, 0xca, 0xb2, 0xb0, 0x69, 0x37, + 0x16, 0x23, 0xa0, 0xce, 0x38, 0xef, 0x51, 0x43, + 0x74, 0xa8, 0x25, 0x59, 0x22, 0xf3, 0x22, 0x90, + 0x86, 0xdb, 0xbb, 0x18, 0x20, 0xf5, 0xfe, 0x63, + 0xf1, 0xa0, 0x0b, 0xf7, 0x36, 0xd2, 0xae, 0x97, + 0xe5, 0x18, 0x5d, 0x56, 0x04, 0x59, 0x03, 0x95, + 0x38, 0x25, 0xbe, 0xf7, 0x3f, 0xf0, 0x25, 0xff, + 0x00, 0xbe, 0x69, 0x6e, 0x21, 0x5b, 0x93, 0x60, + 0x4f, 0x44, 0x44, 0x49, 0x3f, 0xdd, 0xd8, 0x1b, + 0x3f, 0xfa, 0x17, 0xe5, 0x54, 0x05, 0xeb, 0xfd, + 0xaa, 0x59, 0xdc, 0x16, 0x12, 0x6f, 0xdc, 0x99, + 0xec, 0xc0, 0xff, 0x00, 0x8d, 0x3f, 0xfb, 0x41, + 0x82, 0x4a, 0xa2, 0x30, 0x3c, 0xc8, 0x96, 0x3e, + 0xbd, 0x30, 0x36, 0xe7, 0xf2, 0xcf, 0xe7, 0x40, + 0x06, 0xac, 0xfe, 0x66, 0xa1, 0x24, 0x84, 0x60, + 0xb2, 0xa3, 0x7f, 0xe3, 0xa2, 0xa9, 0x54, 0xb7, + 0x33, 0x79, 0xf3, 0x79, 0x9b, 0x76, 0xfc, 0xaa, + 0xb8, 0xce, 0x7a, 0x00, 0x3f, 0xa5, 0x45, 0x40, + 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, + 0x1d, 0x5d, 0xd7, 0xde, 0x8f, 0xfe, 0xb9, 0x2f, + 0xf2, 0xa8, 0x6a, 0x6b, 0xaf, 0xbd, 0x1f, 0xfd, + 0x72, 0x5f, 0xe5, 0x50, 0xd0, 0x07, 0x3f, 0xe3, + 0x4f, 0xbd, 0xa7, 0x8f, 0xfa, 0x64, 0x7f, 0xf4, + 0x2a, 0xa0, 0xda, 0x7d, 0x82, 0x4b, 0x02, 0x66, + 0x57, 0xf3, 0x25, 0x11, 0x9d, 0x92, 0x72, 0x0e, + 0x06, 0x73, 0x94, 0xe3, 0xaf, 0xbe, 0x7d, 0x78, + 0xad, 0x7f, 0x15, 0xd9, 0x49, 0x75, 0x15, 0x94, + 0xd1, 0x91, 0xb5, 0x55, 0x93, 0x9f, 0x5c, 0xd6, + 0x00, 0xb3, 0xbc, 0x07, 0x3f, 0x68, 0x19, 0xdc, + 0x1b, 0x3b, 0xcf, 0x51, 0xd0, 0xd7, 0x4c, 0x25, + 0x15, 0x14, 0xae, 0x61, 0x38, 0xbe, 0x66, 0xec, + 0x44, 0xd0, 0xdb, 0x8b, 0x75, 0x71, 0x1c, 0xe5, + 0xa5, 0x0e, 0xc9, 0x86, 0x04, 0x20, 0x1e, 0xbc, + 0x73, 0xef, 0xd3, 0x8a, 0xd7, 0xf0, 0xaa, 0x97, + 0x8e, 0xef, 0x09, 0x1b, 0xba, 0xc6, 0x4a, 0x89, + 0x42, 0x95, 0x07, 0x2b, 0xfd, 0xee, 0x2b, 0x35, + 0x6c, 0xef, 0x52, 0x26, 0x89, 0x2e, 0x36, 0xc6, + 0xdf, 0x79, 0x03, 0x90, 0x0f, 0xd4, 0x56, 0x9e, + 0x8a, 0x91, 0xd9, 0x47, 0x71, 0x1d, 0xcb, 0x36, + 0x26, 0x4d, 0xb9, 0x8c, 0x67, 0x1c, 0x83, 0xdc, + 0x8f, 0x4a, 0x2a, 0x4e, 0x2e, 0x36, 0x4c, 0x21, + 0x16, 0xa5, 0x73, 0x46, 0xee, 0xdc, 0x3c, 0xd6, + 0xc8, 0xea, 0x91, 0x48, 0xe8, 0x4b, 0x98, 0x97, + 0x2a, 0x79, 0x38, 0xc0, 0x1c, 0x13, 0xf4, 0xa5, + 0x3a, 0x7c, 0x50, 0xac, 0xc6, 0x67, 0x90, 0x0f, + 0x23, 0xcc, 0x4c, 0xc7, 0xb4, 0x8f, 0x98, 0x2f, + 0x23, 0x3f, 0xe7, 0x34, 0xd4, 0xbd, 0xb7, 0x88, + 0xc5, 0x14, 0x62, 0x5f, 0x29, 0x16, 0x40, 0x64, + 0x20, 0x6f, 0xcb, 0x0c, 0x64, 0x0c, 0xf6, 0xc7, + 0xad, 0x29, 0xbc, 0xb5, 0x30, 0x79, 0x20, 0x4c, + 0x07, 0x92, 0xd1, 0x67, 0x00, 0x9f, 0xbc, 0x18, + 0x1e, 0xb5, 0xcc, 0x6e, 0x13, 0xd9, 0x5b, 0x20, + 0x12, 0x79, 0xee, 0x91, 0x04, 0x8f, 0x24, 0xc7, + 0x92, 0x59, 0x97, 0x3d, 0x33, 0xf8, 0xd4, 0x72, + 0x58, 0xa4, 0x31, 0xee, 0x9a, 0xe3, 0x6f, 0xef, + 0x4c, 0x60, 0x04, 0xce, 0x71, 0xb7, 0x9e, 0xbe, + 0x86, 0xa7, 0x4d, 0x4a, 0x31, 0x10, 0x45, 0x96, + 0xe2, 0x12, 0x51, 0x01, 0x68, 0xf1, 0x90, 0x55, + 0x76, 0xfa, 0xf2, 0x0d, 0x56, 0xb9, 0xb8, 0x17, + 0x31, 0xa4, 0x6b, 0xe6, 0x33, 0xf9, 0xac, 0xd9, + 0x73, 0x92, 0x41, 0x0a, 0x07, 0x3e, 0xbc, 0x50, + 0x03, 0x26, 0xb4, 0x68, 0x52, 0x62, 0xed, 0xcc, + 0x72, 0xf9, 0x60, 0x63, 0xef, 0x75, 0xc9, 0xfd, + 0x3f, 0x5a, 0xb9, 0x65, 0x1b, 0x9d, 0x3d, 0x5a, + 0x18, 0xad, 0x99, 0xcc, 0xec, 0xac, 0x66, 0x09, + 0xd3, 0x0b, 0xfd, 0xef, 0xe9, 0x4d, 0xbe, 0xba, + 0x9a, 0x19, 0x20, 0x58, 0xd8, 0xc5, 0x34, 0x71, + 0x8f, 0x30, 0xa9, 0xe7, 0x79, 0x00, 0x1f, 0xd0, + 0x0a, 0x86, 0x39, 0xed, 0xa4, 0xb4, 0xf2, 0xae, + 0x5e, 0x60, 0xfe, 0x6b, 0x49, 0xb9, 0x14, 0x36, + 0x72, 0x07, 0xa9, 0x1e, 0x94, 0x01, 0x39, 0xd3, + 0x92, 0xe2, 0xf2, 0x64, 0x88, 0xc8, 0x9f, 0xbd, + 0xda, 0xa8, 0x22, 0x2c, 0x17, 0xdc, 0x9e, 0xc2, + 0xab, 0x1b, 0x44, 0x48, 0x43, 0x49, 0x38, 0x49, + 0x59, 0x4b, 0xaa, 0x15, 0xe0, 0x81, 0x9e, 0xfe, + 0xbc, 0x1a, 0xb6, 0x75, 0x38, 0x1e, 0x48, 0x9d, + 0x92, 0x51, 0xe4, 0xc8, 0x19, 0x50, 0x11, 0x86, + 0x00, 0x28, 0x19, 0x3e, 0xbf, 0x2d, 0x41, 0x3d, + 0xc5, 0x9c, 0xa8, 0x0b, 0x2c, 0xac, 0xe8, 0xac, + 0x88, 0x0e, 0x00, 0x23, 0x24, 0x82, 0x79, 0xed, + 0x9e, 0x9e, 0xd4, 0x00, 0xb7, 0x96, 0xa0, 0x62, + 0x41, 0x84, 0x05, 0x22, 0x11, 0xa8, 0x5f, 0xbe, + 0xdb, 0x17, 0x3f, 0xcf, 0xaf, 0xbd, 0x27, 0xf6, + 0x68, 0x69, 0x7c, 0xa8, 0x67, 0x0f, 0x22, 0x48, + 0x23, 0x90, 0x15, 0xc0, 0x52, 0x78, 0xc8, 0x3d, + 0xc5, 0x2c, 0xf7, 0xeb, 0x34, 0x61, 0x18, 0x3f, + 0xee, 0xd5, 0x3c, 0x92, 0x47, 0xdd, 0x60, 0x00, + 0x61, 0xf4, 0x38, 0xfe, 0x55, 0x34, 0x9a, 0xa8, + 0x33, 0x2c, 0xa2, 0x5b, 0x97, 0xfd, 0xe0, 0x73, + 0x13, 0xb7, 0xc8, 0xa3, 0xb8, 0x1e, 0xbf, 0xa5, + 0x00, 0x57, 0xb8, 0x8a, 0x04, 0xd3, 0xd1, 0xe1, + 0x7f, 0x33, 0x33, 0x11, 0xbc, 0xa6, 0xd3, 0xd0, + 0x71, 0x4f, 0x6b, 0x27, 0x9a, 0xca, 0xd1, 0xe2, + 0x58, 0x86, 0x51, 0xb7, 0x16, 0x75, 0x52, 0x4e, + 0xe3, 0xea, 0x6a, 0x1b, 0x89, 0xad, 0xbe, 0xc8, + 0xb6, 0xf6, 0xe2, 0x53, 0x89, 0x0b, 0xee, 0x90, + 0x01, 0xdb, 0x1d, 0xaa, 0x39, 0xa6, 0x59, 0x2d, + 0xed, 0xa3, 0x50, 0x73, 0x12, 0x95, 0x39, 0xf7, + 0x62, 0x7f, 0xad, 0x00, 0x6a, 0x49, 0x6b, 0x1f, + 0xdb, 0x5d, 0x4a, 0xc4, 0xb1, 0x93, 0x38, 0x03, + 0x60, 0xf9, 0x71, 0x18, 0xe7, 0xf5, 0xaa, 0x5f, + 0x60, 0x8c, 0xa8, 0x98, 0x5c, 0x7f, 0xa3, 0x6c, + 0x2c, 0x5f, 0x67, 0x23, 0x9c, 0x63, 0x19, 0xeb, + 0xc8, 0xef, 0x53, 0xbe, 0xa5, 0x6e, 0xf3, 0x6f, + 0x29, 0x21, 0x52, 0xd2, 0x92, 0x38, 0xce, 0x1d, + 0x02, 0x8f, 0xe5, 0x49, 0x16, 0xa1, 0x14, 0x08, + 0xb0, 0x42, 0xf3, 0xa4, 0x5b, 0x08, 0xf3, 0x06, + 0x03, 0x86, 0x27, 0x39, 0xc6, 0x7d, 0xb1, 0xd6, + 0x80, 0x20, 0x7b, 0x14, 0x48, 0x65, 0x99, 0xa7, + 0xf9, 0x17, 0x6e, 0xc2, 0x13, 0xef, 0xee, 0x04, + 0x8e, 0xfc, 0x74, 0xa2, 0x4b, 0x14, 0x44, 0x7d, + 0xb3, 0xee, 0x91, 0x62, 0x59, 0x76, 0xec, 0xe3, + 0x04, 0x0e, 0xf9, 0xeb, 0xcd, 0x17, 0x37, 0x8b, + 0x34, 0x32, 0xc7, 0xbe, 0x69, 0x0b, 0x3a, 0x10, + 0xd2, 0x9c, 0x9c, 0x00, 0xd9, 0xfe, 0x74, 0xbf, + 0x6d, 0x8c, 0x4e, 0xf2, 0x6d, 0x62, 0x1a, 0x05, + 0x8c, 0x02, 0x3b, 0x80, 0xa3, 0xf2, 0xe2, 0x80, + 0x26, 0x8b, 0x4c, 0x4f, 0x36, 0x06, 0x67, 0x91, + 0xa2, 0x69, 0x51, 0x18, 0x98, 0x8a, 0x83, 0x9f, + 0xee, 0x92, 0x79, 0x15, 0x02, 0x59, 0xc2, 0xf8, + 0x63, 0x70, 0x51, 0x64, 0x90, 0xa4, 0x59, 0x4e, + 0xbe, 0xe7, 0x9e, 0x07, 0x23, 0xd6, 0xac, 0x8d, + 0x46, 0xd9, 0x66, 0x79, 0x00, 0x99, 0x8b, 0xce, + 0x93, 0x7c, 0xc0, 0x76, 0x39, 0xdb, 0xd7, 0xdc, + 0xf3, 0xfa, 0x53, 0x21, 0xbf, 0x8e, 0x28, 0xfc, + 0x95, 0x9a, 0xea, 0x34, 0x57, 0x2c, 0xa6, 0x3c, + 0x02, 0xe0, 0xe3, 0x83, 0xcf, 0x1d, 0x3a, 0xf3, + 0x40, 0x16, 0xb4, 0x75, 0x29, 0x65, 0x78, 0xad, + 0xc1, 0x59, 0x14, 0x1f, 0xd6, 0xac, 0x54, 0x3a, + 0x52, 0xb0, 0xd3, 0xa7, 0x95, 0xf3, 0xfb, 0xe9, + 0x46, 0xdc, 0xf5, 0x38, 0xce, 0x4d, 0x4d, 0x40, + 0x17, 0xa4, 0xff, 0x00, 0x8f, 0x68, 0x7f, 0xde, + 0x4f, 0xe6, 0x28, 0xa1, 0xff, 0x00, 0xe3, 0xda, + 0x1f, 0xf7, 0x93, 0xf9, 0x8a, 0x28, 0x01, 0xf6, + 0xdf, 0x71, 0xff, 0x00, 0xeb, 0xa3, 0xff, 0x00, + 0xe8, 0x46, 0xa5, 0xa8, 0x6d, 0xbe, 0xe3, 0xff, + 0x00, 0xd7, 0x47, 0xff, 0x00, 0xd0, 0x8d, 0x4d, + 0x40, 0x05, 0x73, 0x1e, 0x27, 0xff, 0x00, 0x90, + 0x92, 0x7f, 0xd7, 0x15, 0xfe, 0xb5, 0xd3, 0xd7, + 0x31, 0xe2, 0x7f, 0xf9, 0x09, 0x27, 0xfd, 0x71, + 0x5f, 0xeb, 0x5b, 0xd0, 0xf8, 0xcc, 0xab, 0x7c, + 0x26, 0x3d, 0x14, 0x51, 0x5d, 0xa7, 0x20, 0x51, + 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, + 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, + 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, + 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, + 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x01, 0xd4, + 0x78, 0x63, 0xfe, 0x3c, 0x27, 0xff, 0x00, 0xae, + 0xa3, 0xf9, 0x54, 0xd7, 0x3f, 0xf1, 0xf0, 0xf5, + 0x07, 0x86, 0x3f, 0xe3, 0xc2, 0xe3, 0xfe, 0xba, + 0x8f, 0xe5, 0x53, 0x5c, 0xff, 0x00, 0xaf, 0x7a, + 0xf3, 0xea, 0xfc, 0x6c, 0xed, 0xa7, 0xf0, 0xa2, + 0x0d, 0x5e, 0xfa, 0x18, 0x2f, 0x04, 0x6f, 0x61, + 0x04, 0xc7, 0xcb, 0x53, 0xbd, 0xc7, 0x3d, 0x2a, + 0x8f, 0xf6, 0xad, 0xbf, 0xfd, 0x02, 0xad, 0x7f, + 0x2a, 0x3c, 0x43, 0xff, 0x00, 0x21, 0x21, 0xff, + 0x00, 0x5c, 0x97, 0xf9, 0x56, 0x5d, 0x66, 0x59, + 0xa9, 0xfd, 0xab, 0x6f, 0xff, 0x00, 0x40, 0xab, + 0x5f, 0xca, 0x8f, 0xed, 0x5b, 0x7f, 0xfa, 0x05, + 0x5a, 0xfe, 0x55, 0x97, 0x45, 0x00, 0x6a, 0x7f, + 0x6a, 0xdb, 0xff, 0x00, 0xd0, 0x2a, 0xd7, 0xf2, + 0xa3, 0xfb, 0x56, 0xdf, 0xfe, 0x81, 0x56, 0xbf, + 0x95, 0x65, 0xd5, 0xcd, 0x31, 0x15, 0xae, 0xf2, + 0xc4, 0x00, 0x88, 0xef, 0x96, 0x19, 0x00, 0x85, + 0x24, 0x1a, 0x00, 0xb1, 0xfd, 0xab, 0x6f, 0xff, + 0x00, 0x40, 0xab, 0x5f, 0xca, 0x8f, 0xed, 0x5b, + 0x7f, 0xfa, 0x05, 0x5a, 0xfe, 0x55, 0x5f, 0x50, + 0x2e, 0xfe, 0x4c, 0xad, 0x37, 0x9c, 0xae, 0xa4, + 0x09, 0x0a, 0xed, 0x63, 0x83, 0xd0, 0xd5, 0xdb, + 0x95, 0x30, 0x5b, 0x2d, 0xda, 0x10, 0xd2, 0x98, + 0x62, 0x41, 0x83, 0xcc, 0x60, 0xaf, 0xde, 0xfc, + 0x7a, 0x7f, 0x91, 0x40, 0x11, 0x7f, 0x6a, 0xdb, + 0xff, 0x00, 0xd0, 0x2a, 0xd7, 0xf2, 0xa3, 0xfb, + 0x56, 0xdf, 0xfe, 0x81, 0x56, 0xbf, 0x95, 0x58, + 0xb4, 0x91, 0xd6, 0xdb, 0x4f, 0x1f, 0x6c, 0x58, + 0xa3, 0x20, 0xee, 0x89, 0x89, 0xf9, 0xfe, 0x73, + 0xed, 0x8f, 0x6e, 0x4d, 0x53, 0xd3, 0x83, 0x26, + 0xad, 0x8f, 0xf5, 0x4c, 0xbe, 0x67, 0x5f, 0xe0, + 0xf9, 0x5b, 0xf9, 0x50, 0x04, 0x9f, 0xda, 0xb6, + 0xff, 0x00, 0xf4, 0x0a, 0xb5, 0xfc, 0xa8, 0xfe, + 0xd5, 0xb7, 0xff, 0x00, 0xa0, 0x55, 0xaf, 0xe5, + 0x4e, 0x49, 0x67, 0x7b, 0xdb, 0x35, 0x93, 0x50, + 0x5b, 0x95, 0xf3, 0xd0, 0xed, 0x05, 0x8e, 0x39, + 0xeb, 0xc8, 0x15, 0x22, 0xcd, 0x3b, 0x5e, 0xc2, + 0xaf, 0xa9, 0x2c, 0xc8, 0x67, 0x4f, 0xdd, 0x86, + 0x6f, 0xef, 0x0f, 0x51, 0x40, 0x10, 0xff, 0x00, + 0x6a, 0xdb, 0xff, 0x00, 0xd0, 0x2a, 0xd7, 0xf2, + 0xa3, 0xfb, 0x56, 0xdf, 0xfe, 0x81, 0x56, 0xbf, + 0x95, 0x3a, 0xee, 0x49, 0xfe, 0xcb, 0x70, 0xb7, + 0x93, 0xac, 0x84, 0x91, 0xe5, 0x2f, 0x98, 0xae, + 0xc0, 0xe7, 0xaf, 0x1d, 0x38, 0xcd, 0x5b, 0xba, + 0x37, 0x42, 0xee, 0xed, 0xae, 0x26, 0x0d, 0x64, + 0x03, 0x02, 0x86, 0x40, 0xdd, 0x41, 0xda, 0x31, + 0xd4, 0x1c, 0xe2, 0x80, 0x29, 0x7f, 0x6a, 0xdb, + 0xff, 0x00, 0xd0, 0x2a, 0xd7, 0xf2, 0xa3, 0xfb, + 0x56, 0xdf, 0xfe, 0x81, 0x56, 0xbf, 0x95, 0x25, + 0xc5, 0xdc, 0xd6, 0x52, 0x47, 0x6f, 0x01, 0x0b, + 0x1a, 0x46, 0x85, 0x97, 0x1c, 0x39, 0x2a, 0x09, + 0xcf, 0xaf, 0x5a, 0xb2, 0x90, 0xc6, 0xa7, 0x52, + 0xb5, 0x45, 0xc2, 0xc8, 0xea, 0xa8, 0x3d, 0x0e, + 0x19, 0x94, 0x7e, 0x60, 0x0a, 0x00, 0xaf, 0xfd, + 0xab, 0x6f, 0xff, 0x00, 0x40, 0xab, 0x5f, 0xca, + 0x8f, 0xed, 0x5b, 0x7f, 0xfa, 0x05, 0x5a, 0xfe, + 0x54, 0x93, 0x81, 0x1e, 0x87, 0x1c, 0x58, 0xf9, + 0xbc, 0xd5, 0x91, 0xbe, 0xac, 0x1b, 0x1f, 0xa0, + 0x15, 0x99, 0x40, 0x1a, 0x9f, 0xda, 0xb6, 0xff, + 0x00, 0xf4, 0x0a, 0xb5, 0xfc, 0xa8, 0xfe, 0xd5, + 0xb7, 0xff, 0x00, 0xa0, 0x55, 0xaf, 0xe5, 0x59, + 0x74, 0x50, 0x06, 0xa7, 0xf6, 0xad, 0xbf, 0xfd, + 0x02, 0xad, 0x7f, 0x2a, 0x3f, 0xb5, 0x6d, 0xff, + 0x00, 0xe8, 0x15, 0x6b, 0xf9, 0x56, 0x5d, 0x14, + 0x01, 0xd6, 0x5e, 0x1d, 0xd2, 0x23, 0x05, 0x0a, + 0x0c, 0x6a, 0x70, 0x3b, 0x71, 0x50, 0x54, 0xd7, + 0x5f, 0x7a, 0x3f, 0xfa, 0xe4, 0xbf, 0xca, 0xa1, + 0xa0, 0x07, 0x2b, 0x8d, 0x8d, 0x14, 0x88, 0xb2, + 0x44, 0xdf, 0x79, 0x1a, 0xa0, 0x3a, 0x7e, 0x9a, + 0x49, 0x3e, 0x5c, 0xeb, 0x9e, 0xc1, 0xc7, 0xf8, + 0x54, 0xb4, 0x50, 0x04, 0x5f, 0xd9, 0xfa, 0x67, + 0xf7, 0x2e, 0x3f, 0xef, 0xb1, 0xfe, 0x14, 0x7f, + 0x67, 0xe9, 0x9f, 0xdc, 0xb8, 0xff, 0x00, 0xbe, + 0xc7, 0xf8, 0x54, 0xb4, 0x50, 0x04, 0x5f, 0xd9, + 0xfa, 0x67, 0xf7, 0x2e, 0x3f, 0xef, 0xb1, 0xfe, + 0x14, 0x7f, 0x67, 0xe9, 0x9f, 0xdc, 0xb8, 0xff, + 0x00, 0xbe, 0xc7, 0xf8, 0x54, 0xb4, 0x50, 0x04, + 0x5f, 0xd9, 0xfa, 0x67, 0xf7, 0x2e, 0x3f, 0xef, + 0xb1, 0xfe, 0x14, 0x7f, 0x67, 0xe9, 0x9f, 0xdc, + 0xb8, 0xff, 0x00, 0xbe, 0xc7, 0xf8, 0x54, 0xb4, + 0x50, 0x04, 0x5f, 0xd9, 0xfa, 0x67, 0xf7, 0x2e, + 0x3f, 0xef, 0xb1, 0xfe, 0x14, 0x7f, 0x67, 0xe9, + 0x9f, 0xdc, 0xb8, 0xff, 0x00, 0xbe, 0xc7, 0xf8, + 0x54, 0xb4, 0x50, 0x04, 0x5f, 0xd9, 0xfa, 0x67, + 0xf7, 0x2e, 0x3f, 0xef, 0xb1, 0xfe, 0x14, 0x7f, + 0x67, 0xe9, 0x9f, 0xdc, 0xb8, 0xff, 0x00, 0xbe, + 0xc7, 0xf8, 0x54, 0xb4, 0x50, 0x04, 0x5f, 0xd9, + 0xfa, 0x67, 0xf7, 0x2e, 0x3f, 0xef, 0xb1, 0xfe, + 0x14, 0x7f, 0x67, 0xe9, 0x9f, 0xdc, 0xb8, 0xff, + 0x00, 0xbe, 0xc7, 0xf8, 0x54, 0xb4, 0x50, 0x04, + 0x5f, 0xd9, 0xfa, 0x67, 0xf7, 0x2e, 0x3f, 0xef, + 0xb1, 0xfe, 0x14, 0x7f, 0x67, 0xe9, 0x9f, 0xdc, + 0xb8, 0xff, 0x00, 0xbe, 0xc7, 0xf8, 0x54, 0xb4, + 0x50, 0x04, 0x5f, 0xd9, 0xfa, 0x67, 0xf7, 0x2e, + 0x3f, 0xef, 0xb1, 0xfe, 0x14, 0x7f, 0x67, 0xe9, + 0x9f, 0xdc, 0xb8, 0xff, 0x00, 0xbe, 0xc7, 0xf8, + 0x54, 0xb4, 0x50, 0x04, 0x5f, 0xd9, 0xfa, 0x67, + 0xf7, 0x2e, 0x3f, 0xef, 0xb1, 0xfe, 0x14, 0x7f, + 0x67, 0xe9, 0x9f, 0xdc, 0xb8, 0xff, 0x00, 0xbe, + 0xc7, 0xf8, 0x54, 0xb4, 0x50, 0x04, 0x5f, 0xd9, + 0xfa, 0x67, 0xf7, 0x2e, 0x3f, 0xef, 0xb1, 0xfe, + 0x14, 0xab, 0x63, 0xa6, 0xa1, 0xdc, 0x20, 0x95, + 0xf1, 0xd9, 0xe4, 0xe3, 0xf4, 0xa9, 0x28, 0xa0, + 0x07, 0xc9, 0x21, 0x90, 0x8e, 0x15, 0x55, 0x46, + 0x15, 0x54, 0x60, 0x01, 0x4c, 0xa2, 0x8a, 0x00, + 0xbc, 0xff, 0x00, 0xf1, 0xed, 0x0f, 0xfb, 0xc9, + 0xfc, 0xc5, 0x14, 0x8f, 0xff, 0x00, 0x1e, 0xf0, + 0xff, 0x00, 0xbc, 0x9f, 0xcc, 0x51, 0x40, 0x0f, + 0xb7, 0xfb, 0xaf, 0xff, 0x00, 0x5d, 0x1f, 0xf9, + 0x9a, 0x9a, 0xa1, 0xb7, 0xfb, 0xaf, 0xff, 0x00, + 0x5d, 0x1f, 0xf9, 0x9a, 0x96, 0x80, 0x16, 0xb9, + 0x8f, 0x13, 0xff, 0x00, 0xc8, 0x49, 0x3f, 0xeb, + 0x8a, 0xff, 0x00, 0x5a, 0xe9, 0xab, 0x0f, 0x5f, + 0xd3, 0xef, 0x2e, 0x6f, 0x92, 0x48, 0x2d, 0xde, + 0x45, 0x11, 0x28, 0xc8, 0xf5, 0xe6, 0xb6, 0xa0, + 0xd2, 0x96, 0xa6, 0x55, 0x55, 0xe3, 0xa1, 0xce, + 0xd1, 0x57, 0xbf, 0xb1, 0xf5, 0x2f, 0xf9, 0xf3, + 0x92, 0x8f, 0xec, 0x7d, 0x4b, 0xfe, 0x7c, 0xe4, + 0xae, 0xce, 0x78, 0xf7, 0x39, 0x79, 0x5f, 0x62, + 0x8d, 0x15, 0x7b, 0xfb, 0x1f, 0x52, 0xff, 0x00, + 0x9f, 0x39, 0x28, 0xfe, 0xc7, 0xd4, 0xbf, 0xe7, + 0xce, 0x4a, 0x39, 0xe3, 0xdc, 0x39, 0x5f, 0x62, + 0x8d, 0x15, 0x7b, 0xfb, 0x1f, 0x52, 0xff, 0x00, + 0x9f, 0x39, 0x28, 0xfe, 0xc7, 0xd4, 0xbf, 0xe7, + 0xce, 0x4a, 0x39, 0xe3, 0xdc, 0x39, 0x5f, 0x62, + 0x8d, 0x15, 0x7b, 0xfb, 0x1f, 0x52, 0xff, 0x00, + 0x9f, 0x39, 0x28, 0xfe, 0xc7, 0xd4, 0xbf, 0xe7, + 0xce, 0x4a, 0x39, 0xe3, 0xdc, 0x39, 0x5f, 0x62, + 0x8d, 0x15, 0x7b, 0xfb, 0x1f, 0x52, 0xff, 0x00, + 0x9f, 0x39, 0x28, 0xfe, 0xc7, 0xd4, 0xbf, 0xe7, + 0xce, 0x4a, 0x39, 0xe3, 0xdc, 0x39, 0x5f, 0x62, + 0x8d, 0x15, 0x7b, 0xfb, 0x1f, 0x52, 0xff, 0x00, + 0x9f, 0x39, 0x28, 0xfe, 0xc7, 0xd4, 0xbf, 0xe7, + 0xce, 0x4a, 0x39, 0xe3, 0xdc, 0x39, 0x5f, 0x62, + 0x8d, 0x15, 0x7b, 0xfb, 0x1f, 0x52, 0xff, 0x00, + 0x9f, 0x49, 0x28, 0xfe, 0xc7, 0xd4, 0xbf, 0xe7, + 0xce, 0x4a, 0x39, 0xe3, 0xdc, 0x39, 0x5f, 0x62, + 0x8d, 0x15, 0x7b, 0xfb, 0x1f, 0x52, 0xff, 0x00, + 0x9f, 0x39, 0x28, 0xfe, 0xc7, 0xd4, 0xbf, 0xe7, + 0xce, 0x4a, 0x39, 0xe3, 0xdc, 0x39, 0x5f, 0x62, + 0x8d, 0x15, 0x7b, 0xfb, 0x1f, 0x52, 0xff, 0x00, + 0x9f, 0x39, 0x28, 0xfe, 0xc7, 0xd4, 0xbf, 0xe7, + 0xce, 0x4a, 0x39, 0xe3, 0xdc, 0x39, 0x5f, 0x62, + 0x8d, 0x15, 0x7b, 0xfb, 0x1f, 0x52, 0xff, 0x00, + 0x9f, 0x39, 0x28, 0xfe, 0xc7, 0xd4, 0xbf, 0xe7, + 0xce, 0x4a, 0x39, 0xe3, 0xdc, 0x39, 0x5f, 0x62, + 0x8d, 0x15, 0x7b, 0xfb, 0x1f, 0x52, 0xff, 0x00, + 0x9f, 0x39, 0x28, 0xfe, 0xc7, 0xd4, 0xbf, 0xe7, + 0xce, 0x4a, 0x39, 0xe3, 0xdc, 0x39, 0x5f, 0x63, + 0x67, 0xc3, 0x1f, 0xf1, 0xe1, 0x3f, 0xfd, 0x75, + 0x1f, 0xca, 0xa6, 0xb9, 0xff, 0x00, 0x5e, 0xd4, + 0x68, 0x36, 0xb3, 0xda, 0xd9, 0x4c, 0xb3, 0xc4, + 0xd1, 0xb1, 0x90, 0x10, 0x0f, 0xd2, 0x8b, 0x9f, + 0xf5, 0xef, 0x5c, 0x35, 0x5d, 0xe6, 0xce, 0xca, + 0x7f, 0x0a, 0x32, 0xbc, 0x43, 0xff, 0x00, 0x21, + 0x21, 0xff, 0x00, 0x5c, 0x97, 0xf9, 0x56, 0x5d, + 0x74, 0x5a, 0xbe, 0xab, 0x73, 0x69, 0x78, 0x22, + 0x88, 0x47, 0xb7, 0x62, 0x9f, 0x99, 0x33, 0xda, + 0xa8, 0xff, 0x00, 0x6f, 0x5e, 0xfa, 0x43, 0xff, + 0x00, 0x7e, 0xc5, 0x66, 0x59, 0x97, 0x45, 0x6a, + 0x7f, 0x6f, 0x5e, 0xfa, 0x43, 0xff, 0x00, 0x7e, + 0xc5, 0x1f, 0xdb, 0xd7, 0xbe, 0x90, 0xff, 0x00, + 0xdf, 0xb1, 0x40, 0x19, 0x75, 0x2d, 0xb4, 0xc6, + 0xde, 0x61, 0x20, 0x50, 0xc3, 0x04, 0x15, 0x3d, + 0xc1, 0x18, 0x23, 0xf2, 0xab, 0xff, 0x00, 0xdb, + 0xd7, 0xbe, 0x90, 0xff, 0x00, 0xdf, 0xb1, 0x47, + 0xf6, 0xf5, 0xef, 0xa4, 0x3f, 0xf7, 0xec, 0x50, + 0x05, 0x2b, 0x99, 0xd6, 0x51, 0x1a, 0x47, 0x1f, + 0x97, 0x14, 0x60, 0x85, 0x52, 0xdb, 0x8f, 0x3d, + 0x49, 0x35, 0x2a, 0xdf, 0x11, 0x3a, 0xb9, 0x8f, + 0x29, 0xe5, 0x2c, 0x4e, 0x99, 0xfb, 0xe0, 0x0c, + 0x7f, 0x4c, 0xd5, 0x8f, 0xed, 0xeb, 0xdf, 0x48, + 0x7f, 0xef, 0xd8, 0xa3, 0xfb, 0x7a, 0xf7, 0xd2, + 0x1f, 0xfb, 0xf6, 0x28, 0x02, 0x04, 0xbb, 0xb7, + 0xf2, 0x61, 0x49, 0x6d, 0x59, 0xda, 0x10, 0x42, + 0x9f, 0x37, 0x00, 0xfc, 0xc4, 0xf2, 0x31, 0xef, + 0x51, 0xc3, 0x76, 0x52, 0xf9, 0xae, 0xa5, 0x4f, + 0x30, 0xb9, 0x72, 0xca, 0x0e, 0xdc, 0xee, 0x04, + 0x1f, 0xe7, 0x56, 0xff, 0x00, 0xb7, 0xaf, 0x7d, + 0x21, 0xff, 0x00, 0xbf, 0x62, 0xac, 0x41, 0xa8, + 0xea, 0x93, 0xc5, 0xe6, 0xc6, 0x96, 0xfb, 0x37, + 0x6d, 0xcb, 0x6c, 0x5e, 0x7f, 0x13, 0xef, 0x40, + 0x19, 0xeb, 0x73, 0x6b, 0x1c, 0xb1, 0x4b, 0x0d, + 0xac, 0x8a, 0xd1, 0xc8, 0xaf, 0xf3, 0x4b, 0xbb, + 0x38, 0x3d, 0x3e, 0xed, 0x39, 0x6e, 0xed, 0x12, + 0x64, 0x9a, 0x3b, 0x49, 0x04, 0x8a, 0xe1, 0xc6, + 0x66, 0xc8, 0xe0, 0xe7, 0xfb, 0xb5, 0x79, 0x75, + 0x1d, 0x59, 0xa7, 0x68, 0x04, 0x31, 0x79, 0x8a, + 0x32, 0xc0, 0xa0, 0x18, 0x1e, 0xb9, 0xe9, 0x8a, + 0x47, 0xd4, 0xf5, 0x54, 0x9d, 0x21, 0x68, 0xa1, + 0x0f, 0x26, 0x02, 0x7c, 0x8b, 0x86, 0xcf, 0xa1, + 0xe9, 0x40, 0x18, 0xae, 0xdb, 0x9c, 0xb6, 0x31, + 0x93, 0x9a, 0xb6, 0xd7, 0xbb, 0xae, 0xee, 0x26, + 0x68, 0xb2, 0x93, 0x82, 0x1a, 0x3d, 0xde, 0xbd, + 0x39, 0xf6, 0x38, 0x35, 0x7d, 0x35, 0x3d, 0x52, + 0x4b, 0xa3, 0x6a, 0x91, 0x44, 0x66, 0x04, 0x82, + 0xbb, 0x07, 0x6e, 0xb5, 0x07, 0xf6, 0xf5, 0xef, + 0xa4, 0x3f, 0xf7, 0xec, 0x50, 0x04, 0x0b, 0x79, + 0x0b, 0x2c, 0x66, 0x7b, 0x51, 0x2c, 0x91, 0x80, + 0xaa, 0xdb, 0xf0, 0x08, 0x1d, 0x37, 0x0e, 0xf4, + 0xc5, 0xbe, 0x90, 0x19, 0x1c, 0xf3, 0x2b, 0xca, + 0xb2, 0xef, 0xcf, 0x42, 0x33, 0xfe, 0x35, 0x6b, + 0xfb, 0x7a, 0xf7, 0xd2, 0x1f, 0xfb, 0xf6, 0x28, + 0xfe, 0xde, 0xbd, 0xf4, 0x87, 0xfe, 0xfd, 0x8a, + 0x00, 0xad, 0x73, 0x79, 0xe7, 0xac, 0xcb, 0xe5, + 0x85, 0x12, 0x48, 0xae, 0x00, 0x3f, 0x74, 0x00, + 0x40, 0x1f, 0x91, 0xfd, 0x2a, 0xa5, 0x6a, 0x7f, + 0x6f, 0x5e, 0xfa, 0x43, 0xff, 0x00, 0x7e, 0xc5, + 0x1f, 0xdb, 0xd7, 0xbe, 0x90, 0xff, 0x00, 0xdf, + 0xb1, 0x40, 0x19, 0x74, 0x56, 0xa7, 0xf6, 0xf5, + 0xef, 0xa4, 0x3f, 0xf7, 0xec, 0x51, 0xfd, 0xbd, + 0x7b, 0xe9, 0x0f, 0xfd, 0xfb, 0x14, 0x01, 0x97, + 0x45, 0x6a, 0x7f, 0x6f, 0x5e, 0xfa, 0x43, 0xff, + 0x00, 0x7e, 0xc5, 0x1f, 0xdb, 0xd7, 0xbe, 0x90, + 0xff, 0x00, 0xdf, 0xb1, 0x40, 0x1a, 0xf7, 0x5f, + 0x7a, 0x3f, 0xfa, 0xe4, 0xbf, 0xca, 0xa1, 0xab, + 0x17, 0x8c, 0x5e, 0x44, 0x63, 0xd4, 0xc6, 0xa7, + 0xf4, 0xaa, 0xf4, 0x00, 0x51, 0x45, 0x14, 0x00, + 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, + 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, + 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, + 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, + 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, + 0x51, 0x45, 0x14, 0x01, 0x75, 0xff, 0x00, 0xe3, + 0xde, 0x1f, 0xf7, 0x93, 0xf9, 0x8a, 0x28, 0x7f, + 0xf8, 0xf7, 0x87, 0xfd, 0xe4, 0xfe, 0x62, 0x8a, + 0x00, 0x75, 0xbf, 0xdd, 0x7f, 0xfa, 0xe8, 0xff, + 0x00, 0xcc, 0xd4, 0xd5, 0x0d, 0xbf, 0xdd, 0x7f, + 0xfa, 0xe8, 0xff, 0x00, 0xcc, 0xd4, 0xb4, 0x00, + 0xb5, 0xc3, 0x78, 0xce, 0xe2, 0x78, 0xf5, 0xd6, + 0x58, 0xe6, 0x91, 0x17, 0xca, 0x4e, 0x15, 0x88, + 0x1d, 0x2b, 0xb8, 0xae, 0x0f, 0xc6, 0xff, 0x00, + 0xf2, 0x1f, 0x6f, 0xfa, 0xe4, 0x9f, 0xca, 0x80, + 0x31, 0x3e, 0xd9, 0x75, 0xff, 0x00, 0x3f, 0x33, + 0x7f, 0xdf, 0xc3, 0x47, 0xdb, 0x2e, 0xbf, 0xe7, + 0xe6, 0x6f, 0xfb, 0xf8, 0x6a, 0x0a, 0x28, 0x02, + 0x7f, 0xb6, 0x5d, 0x7f, 0xcf, 0xcc, 0xdf, 0xf7, + 0xf0, 0xd1, 0xf6, 0xcb, 0xaf, 0xf9, 0xf9, 0x9b, + 0xfe, 0xfe, 0x1a, 0x82, 0x8a, 0x00, 0xda, 0x36, + 0x97, 0x49, 0x1c, 0x4d, 0x36, 0xb7, 0x0c, 0x2d, + 0x24, 0x6b, 0x20, 0x47, 0x96, 0x4c, 0x80, 0x46, + 0x46, 0x70, 0xb4, 0xd8, 0x6d, 0xae, 0xe4, 0xb5, + 0x82, 0x79, 0x35, 0x78, 0xa0, 0x13, 0xe7, 0x62, + 0xcb, 0x2b, 0x82, 0x70, 0x71, 0xd8, 0x63, 0xb7, + 0xad, 0x4d, 0xa9, 0x3e, 0x9c, 0x16, 0xcc, 0x5c, + 0x41, 0x72, 0xf2, 0xfd, 0x92, 0x2e, 0x63, 0x95, + 0x55, 0x7e, 0xef, 0xa1, 0x53, 0x4d, 0x91, 0xec, + 0x53, 0x48, 0xd2, 0xcd, 0xdd, 0xbc, 0xf3, 0x30, + 0x49, 0x36, 0x88, 0xe5, 0x08, 0x31, 0xe6, 0x1e, + 0xbf, 0x29, 0xa0, 0x0a, 0xb2, 0x47, 0xa9, 0x45, + 0x1d, 0xd3, 0x49, 0x71, 0x22, 0x1b, 0x59, 0x16, + 0x39, 0x14, 0xc8, 0x73, 0x93, 0x9e, 0x9f, 0xf7, + 0xcd, 0x47, 0x23, 0xdf, 0x47, 0x67, 0x0d, 0xd1, + 0xbb, 0x93, 0x64, 0xcc, 0xea, 0xa0, 0x48, 0xd9, + 0xca, 0xe3, 0x39, 0xff, 0x00, 0xbe, 0x85, 0x5d, + 0x59, 0xa5, 0xd4, 0xac, 0xb5, 0x79, 0x02, 0x66, + 0x69, 0x24, 0x8a, 0x52, 0x88, 0x3a, 0x28, 0x2c, + 0x0e, 0x3d, 0x86, 0x45, 0x41, 0x7e, 0x8f, 0x0e, + 0x8b, 0xa7, 0x45, 0x2a, 0x94, 0x90, 0xbc, 0xb2, + 0x6d, 0x61, 0x83, 0xb4, 0xed, 0x00, 0xff, 0x00, + 0xe3, 0xa6, 0x80, 0x29, 0x7d, 0xb2, 0xeb, 0xfe, + 0x7e, 0x66, 0xff, 0x00, 0xbf, 0x86, 0x8f, 0xb6, + 0x5d, 0x7f, 0xcf, 0xcc, 0xdf, 0xf7, 0xf0, 0xd4, + 0x14, 0x50, 0x04, 0xff, 0x00, 0x6c, 0xba, 0xff, + 0x00, 0x9f, 0x99, 0xbf, 0xef, 0xe1, 0xa3, 0xed, + 0x97, 0x5f, 0xf3, 0xf3, 0x37, 0xfd, 0xfc, 0x35, + 0x05, 0x14, 0x01, 0xd2, 0x5b, 0xdc, 0xdc, 0x1f, + 0x06, 0x5d, 0xc8, 0x67, 0x93, 0x78, 0xbb, 0x50, + 0x1b, 0x79, 0xcf, 0x41, 0x58, 0x5f, 0x6c, 0xba, + 0xff, 0x00, 0x9f, 0x99, 0xbf, 0xef, 0xe1, 0xad, + 0x8b, 0x6f, 0xf9, 0x12, 0x6f, 0x3f, 0xeb, 0xed, + 0x7f, 0x90, 0xac, 0x0a, 0x00, 0x9f, 0xed, 0x97, + 0x5f, 0xf3, 0xf3, 0x37, 0xfd, 0xfc, 0x35, 0x6e, + 0xd5, 0x35, 0x0b, 0xab, 0x3b, 0xab, 0x98, 0xee, + 0x9f, 0x65, 0xb0, 0x52, 0xe0, 0xc8, 0xd9, 0x20, + 0xfa, 0x7e, 0x55, 0x9b, 0x5b, 0x9a, 0x0c, 0xc9, + 0x05, 0xad, 0xc9, 0x97, 0xfd, 0x53, 0xcd, 0x14, + 0x72, 0x7f, 0xb8, 0xc1, 0xd5, 0xbf, 0x43, 0x40, + 0x15, 0x51, 0x35, 0x07, 0xd3, 0x65, 0xd4, 0x05, + 0xd4, 0x82, 0x18, 0xe4, 0x11, 0x90, 0x64, 0x6c, + 0x93, 0xed, 0xfa, 0x7e, 0x75, 0x6a, 0x6d, 0x3f, + 0x50, 0x8a, 0x49, 0x61, 0x5d, 0x56, 0x29, 0x67, + 0x88, 0x16, 0x68, 0x52, 0x67, 0xdf, 0xc0, 0xc9, + 0xc6, 0x40, 0x07, 0x8f, 0x7a, 0x9e, 0xf6, 0x33, + 0x69, 0xa3, 0xdc, 0xe9, 0xc7, 0xef, 0x5b, 0x88, + 0x8c, 0x98, 0xfe, 0xfb, 0x33, 0x13, 0xfa, 0x6d, + 0x1f, 0x85, 0x1a, 0xb5, 0xed, 0x9d, 0x9e, 0xb3, + 0x79, 0x2c, 0x36, 0xd3, 0x1b, 0xcc, 0xb2, 0x87, + 0x79, 0x46, 0xc5, 0x25, 0x70, 0x48, 0x5d, 0xbe, + 0x87, 0xd6, 0x80, 0x32, 0xa6, 0x7b, 0xe8, 0x6d, + 0xed, 0xe7, 0x6b, 0xb9, 0x0a, 0xdc, 0x29, 0x65, + 0x02, 0x46, 0xc8, 0xc3, 0x15, 0xe7, 0xf2, 0xa2, + 0xed, 0xef, 0xac, 0xee, 0x3c, 0x99, 0x2e, 0xe4, + 0x2d, 0xb5, 0x5b, 0x2b, 0x23, 0x63, 0x0c, 0xa1, + 0x87, 0xe8, 0x6a, 0xc5, 0xd4, 0x32, 0xdc, 0x69, + 0x1a, 0x5b, 0x43, 0x13, 0xc8, 0x14, 0x49, 0x19, + 0xd8, 0x33, 0x86, 0xde, 0x4e, 0x3f, 0x22, 0x2a, + 0x3d, 0x7f, 0x1f, 0xda, 0xd2, 0xae, 0x79, 0x44, + 0x8d, 0x1b, 0x9e, 0x8c, 0xb1, 0xa8, 0x23, 0xf3, + 0x06, 0x80, 0x2a, 0x7d, 0xb2, 0xeb, 0xfe, 0x7e, + 0x66, 0xff, 0x00, 0xbf, 0x86, 0x8f, 0xb6, 0x5d, + 0x7f, 0xcf, 0xcc, 0xdf, 0xf7, 0xf0, 0xd4, 0x14, + 0x50, 0x07, 0x79, 0xe0, 0x89, 0x64, 0x97, 0x4d, + 0xbc, 0x32, 0xc8, 0xce, 0x44, 0xab, 0x8d, 0xcd, + 0x9e, 0xd5, 0xa5, 0x71, 0xfe, 0xbd, 0xeb, 0x2b, + 0xc0, 0x9f, 0xf2, 0x0d, 0xbc, 0xff, 0x00, 0xae, + 0xab, 0xfc, 0xab, 0x56, 0xe3, 0xfd, 0x7b, 0xd0, + 0x06, 0x57, 0x88, 0x7f, 0xe4, 0x24, 0x3f, 0xeb, + 0x92, 0xff, 0x00, 0x2a, 0xcb, 0xad, 0xed, 0x6a, + 0xc2, 0xee, 0xe2, 0xf8, 0x49, 0x0c, 0x0e, 0xe9, + 0xe5, 0xa8, 0xc8, 0xfa, 0x56, 0x77, 0xf6, 0x46, + 0xa3, 0xff, 0x00, 0x3e, 0x92, 0x50, 0x05, 0x2a, + 0x2a, 0xef, 0xf6, 0x46, 0xa3, 0xff, 0x00, 0x3e, + 0x92, 0x51, 0xfd, 0x91, 0xa8, 0xff, 0x00, 0xcf, + 0xa4, 0x94, 0x01, 0x4a, 0x8a, 0xbb, 0xfd, 0x91, + 0xa8, 0xff, 0x00, 0xcf, 0xa4, 0x94, 0x7f, 0x64, + 0x6a, 0x3f, 0xf3, 0xe9, 0x25, 0x00, 0x52, 0xa2, + 0xae, 0xff, 0x00, 0x64, 0x6a, 0x3f, 0xf3, 0xe9, + 0x25, 0x1f, 0xd9, 0x1a, 0x8f, 0xfc, 0xfa, 0x49, + 0x40, 0x14, 0xab, 0x46, 0x14, 0x82, 0x4d, 0x2e, + 0x35, 0x9e, 0x66, 0x88, 0x7d, 0xa1, 0xb0, 0x42, + 0x6e, 0xfe, 0x15, 0xeb, 0xc8, 0xa8, 0xff, 0x00, + 0xb2, 0x35, 0x1f, 0xf9, 0xf4, 0x92, 0x9e, 0x74, + 0xdd, 0x50, 0xc4, 0x21, 0x36, 0xd2, 0x6c, 0x0c, + 0x58, 0x0c, 0x0e, 0xa7, 0xff, 0x00, 0xd5, 0x40, + 0x13, 0xde, 0x93, 0xf6, 0x5b, 0xa8, 0xd1, 0x59, + 0x7c, 0xa7, 0x8a, 0x36, 0xcf, 0x52, 0xa0, 0x10, + 0x09, 0xfc, 0x71, 0xfa, 0x53, 0x6c, 0xb3, 0xe4, + 0xe9, 0xfb, 0xfa, 0xfd, 0xb3, 0xe4, 0xcf, 0xa7, + 0xcb, 0x9f, 0xd6, 0x85, 0xb5, 0xd6, 0x56, 0x51, + 0x22, 0xc1, 0x26, 0xfd, 0xa1, 0x09, 0xda, 0x39, + 0x51, 0xd8, 0xfa, 0xfe, 0x34, 0x8f, 0x67, 0xac, + 0x49, 0x3a, 0x4c, 0xd0, 0x48, 0x5e, 0x32, 0x0a, + 0x7c, 0xa3, 0x0b, 0x8f, 0x41, 0xd2, 0x80, 0x2d, + 0xda, 0xe0, 0x5e, 0x47, 0x79, 0xde, 0x7d, 0x88, + 0x3f, 0xde, 0xce, 0x1b, 0xff, 0x00, 0x41, 0xff, + 0x00, 0xc7, 0xab, 0x02, 0xb5, 0x12, 0xcf, 0x57, + 0x41, 0x18, 0x58, 0x24, 0x02, 0x37, 0x2e, 0xbc, + 0x0e, 0x09, 0xef, 0xfa, 0x54, 0x1f, 0xd9, 0x1a, + 0x8f, 0xfc, 0xfa, 0x49, 0x40, 0x14, 0xa8, 0xab, + 0xbf, 0xd9, 0x1a, 0x8f, 0xfc, 0xfa, 0x49, 0x47, + 0xf6, 0x46, 0xa3, 0xff, 0x00, 0x3e, 0x92, 0x50, + 0x05, 0x2a, 0x2a, 0xef, 0xf6, 0x46, 0xa3, 0xff, + 0x00, 0x3e, 0x92, 0x51, 0xfd, 0x91, 0xa8, 0xff, + 0x00, 0xcf, 0xa4, 0x94, 0x01, 0x4a, 0x8a, 0xbb, + 0xfd, 0x91, 0xa8, 0xff, 0x00, 0xcf, 0xa4, 0x94, + 0x7f, 0x64, 0x6a, 0x3f, 0xf3, 0xe9, 0x25, 0x00, + 0x52, 0xa2, 0xae, 0xff, 0x00, 0x64, 0x6a, 0x3f, + 0xf3, 0xe9, 0x25, 0x1f, 0xd9, 0x1a, 0x8f, 0xfc, + 0xfa, 0x49, 0x40, 0x1b, 0xd7, 0x5f, 0x7a, 0x3f, + 0xfa, 0xe4, 0xbf, 0xca, 0xa1, 0xa9, 0xef, 0x14, + 0xab, 0xc6, 0xa7, 0x82, 0x23, 0x50, 0x47, 0xe1, + 0x50, 0x50, 0x01, 0x45, 0x2a, 0xa3, 0x39, 0xc2, + 0x29, 0x63, 0xe8, 0x05, 0x49, 0xf6, 0x5b, 0x8f, + 0xf9, 0xe2, 0xff, 0x00, 0x95, 0x00, 0x45, 0x45, + 0x4b, 0xf6, 0x59, 0xff, 0x00, 0xe7, 0x8b, 0xfe, + 0x54, 0x7d, 0x96, 0x7f, 0xf9, 0xe2, 0xff, 0x00, + 0x95, 0x00, 0x45, 0x45, 0x4b, 0xf6, 0x59, 0xff, + 0x00, 0xe7, 0x8b, 0xfe, 0x54, 0x7d, 0x96, 0x7f, + 0xf9, 0xe2, 0xff, 0x00, 0x95, 0x00, 0x45, 0x45, + 0x4b, 0xf6, 0x59, 0xff, 0x00, 0xe7, 0x8b, 0xfe, + 0x54, 0x7d, 0x96, 0x7f, 0xf9, 0xe2, 0xff, 0x00, + 0x95, 0x00, 0x45, 0x45, 0x4b, 0xf6, 0x59, 0xff, + 0x00, 0xe7, 0x8b, 0xfe, 0x54, 0x7d, 0x96, 0x7f, + 0xf9, 0xe2, 0xff, 0x00, 0x95, 0x00, 0x45, 0x45, + 0x4b, 0xf6, 0x59, 0xff, 0x00, 0xe7, 0x8b, 0xfe, + 0x54, 0x7d, 0x96, 0x7f, 0xf9, 0xe2, 0xff, 0x00, + 0x95, 0x00, 0x45, 0x45, 0x4b, 0xf6, 0x59, 0xff, + 0x00, 0xe7, 0x8b, 0xfe, 0x54, 0x7d, 0x96, 0x7f, + 0xf9, 0xe2, 0xff, 0x00, 0x95, 0x00, 0x45, 0x45, + 0x4b, 0xf6, 0x59, 0xff, 0x00, 0xe7, 0x8b, 0xfe, + 0x54, 0x7d, 0x96, 0x7f, 0xf9, 0xe2, 0xff, 0x00, + 0x95, 0x00, 0x45, 0x45, 0x4b, 0xf6, 0x59, 0xff, + 0x00, 0xe7, 0x8b, 0xfe, 0x54, 0x7d, 0x96, 0x7f, + 0xf9, 0xe2, 0xff, 0x00, 0x95, 0x00, 0x45, 0x45, + 0x4b, 0xf6, 0x59, 0xff, 0x00, 0xe7, 0x8b, 0xfe, + 0x54, 0x7d, 0x96, 0x7f, 0xf9, 0xe2, 0xff, 0x00, + 0x95, 0x00, 0x45, 0x45, 0x4b, 0xf6, 0x59, 0xff, + 0x00, 0xe7, 0x8b, 0xfe, 0x54, 0x7d, 0x96, 0x7f, + 0xf9, 0xe2, 0xff, 0x00, 0x95, 0x00, 0x45, 0x45, + 0x2b, 0x2b, 0x29, 0xc3, 0x29, 0x07, 0xd0, 0x8a, + 0x4a, 0x00, 0xba, 0xff, 0x00, 0xf1, 0xef, 0x0f, + 0xfb, 0xc9, 0xfc, 0xc5, 0x14, 0x3f, 0xfa, 0x88, + 0x7f, 0xde, 0x4f, 0xe6, 0x28, 0xa0, 0x07, 0x5b, + 0xfd, 0xd7, 0xff, 0x00, 0xae, 0x8f, 0xfc, 0xcd, + 0x4b, 0x50, 0xc1, 0xf7, 0x5f, 0xfe, 0xba, 0x3f, + 0xf3, 0x35, 0x2d, 0x00, 0x2d, 0x60, 0xeb, 0xde, + 0x1a, 0x93, 0x56, 0xd4, 0x4d, 0xdc, 0x77, 0x71, + 0xc6, 0xa5, 0x15, 0x76, 0xb2, 0x92, 0x78, 0xad, + 0xda, 0xe4, 0xfc, 0x59, 0xab, 0x6a, 0x16, 0x3a, + 0xac, 0x70, 0xda, 0xdd, 0x49, 0x14, 0x66, 0x05, + 0x6d, 0xab, 0xd3, 0x3c, 0xd0, 0x03, 0x3f, 0xe1, + 0x07, 0xb8, 0xff, 0x00, 0xa0, 0x84, 0x3f, 0xf7, + 0xc1, 0xa3, 0xfe, 0x10, 0x7b, 0x8f, 0xfa, 0x08, + 0x43, 0xff, 0x00, 0x7c, 0x1a, 0xc6, 0xff, 0x00, + 0x84, 0x8b, 0x59, 0xff, 0x00, 0xa0, 0x8c, 0xdf, + 0x9d, 0x5b, 0x93, 0x50, 0xf1, 0x2c, 0x57, 0xeb, + 0x63, 0x25, 0xd4, 0xeb, 0x72, 0xc4, 0x00, 0x85, + 0x97, 0x9c, 0xf4, 0xe7, 0xa5, 0x00, 0x5e, 0xff, + 0x00, 0x84, 0x1e, 0xe3, 0xfe, 0x82, 0x10, 0xff, + 0x00, 0xdf, 0x06, 0x8f, 0xf8, 0x41, 0xee, 0x3f, + 0xe8, 0x21, 0x0f, 0xfd, 0xf0, 0x6b, 0x2a, 0x6d, + 0x6f, 0x5e, 0x83, 0xcb, 0xf3, 0x6f, 0xa6, 0x5f, + 0x35, 0x04, 0x89, 0xf3, 0x03, 0x95, 0x3d, 0xea, + 0x59, 0x75, 0x3f, 0x11, 0xc2, 0x26, 0x32, 0x5e, + 0x4c, 0xbe, 0x48, 0x43, 0x27, 0xce, 0xbf, 0x2e, + 0xef, 0xbb, 0x40, 0x1a, 0x4f, 0xe0, 0xbb, 0xb9, + 0x08, 0x2f, 0xa9, 0x46, 0xfb, 0x40, 0x51, 0xb8, + 0x31, 0xc0, 0x1d, 0x05, 0x0d, 0xe0, 0xbb, 0xb6, + 0x44, 0x46, 0xd4, 0xe3, 0x65, 0x41, 0x85, 0x04, + 0x36, 0x17, 0xe9, 0x54, 0x92, 0xeb, 0xc5, 0x32, + 0x40, 0x26, 0x5b, 0x89, 0xca, 0xb2, 0xef, 0x03, + 0x7a, 0xee, 0x2b, 0xea, 0x17, 0xa9, 0x1f, 0x85, + 0x51, 0xff, 0x00, 0x84, 0x8b, 0x59, 0xff, 0x00, + 0xa0, 0x8c, 0xdf, 0x9d, 0x00, 0x6e, 0x41, 0xe0, + 0xcb, 0xd8, 0x65, 0x0f, 0x06, 0xa8, 0x91, 0xc8, + 0x3a, 0x32, 0x06, 0x04, 0x53, 0xa6, 0xf0, 0x4d, + 0xfc, 0xf2, 0x19, 0x26, 0xd4, 0x92, 0x47, 0x3d, + 0x59, 0xc3, 0x12, 0x7f, 0x1a, 0x83, 0xc3, 0x9a, + 0xde, 0xa5, 0x75, 0x77, 0x3d, 0xbd, 0xc5, 0xcb, + 0x4a, 0x86, 0xde, 0x46, 0xf9, 0x80, 0xc8, 0x20, + 0x71, 0x83, 0xd6, 0xb9, 0xaf, 0xb6, 0x5d, 0x7f, + 0xcf, 0xcc, 0xdf, 0xf7, 0xf0, 0xd0, 0x07, 0x53, + 0xff, 0x00, 0x08, 0x1d, 0xd7, 0xfc, 0xff, 0x00, + 0x43, 0xff, 0x00, 0x7c, 0x1a, 0x3f, 0xe1, 0x03, + 0xba, 0xff, 0x00, 0x9f, 0xe8, 0x7f, 0xef, 0x83, + 0x5c, 0xb7, 0xdb, 0x2e, 0xbf, 0xe7, 0xe6, 0x6f, + 0xfb, 0xf8, 0x6b, 0x56, 0x48, 0xe1, 0xb7, 0x48, + 0x7e, 0xd1, 0xad, 0x5e, 0x24, 0x92, 0x44, 0x92, + 0xed, 0x48, 0x4b, 0x01, 0xb8, 0x67, 0x19, 0xde, + 0x28, 0x03, 0x53, 0xfe, 0x10, 0x3b, 0xaf, 0xf9, + 0xfe, 0x87, 0xfe, 0xf8, 0x34, 0x7f, 0xc2, 0x07, + 0x75, 0xff, 0x00, 0x3f, 0xd0, 0xff, 0x00, 0xdf, + 0x06, 0xb2, 0x6c, 0x12, 0x3b, 0xc5, 0x93, 0x76, + 0xb1, 0x77, 0x1b, 0xc6, 0x8f, 0x21, 0x51, 0x19, + 0x61, 0xb5, 0x79, 0xeb, 0xbc, 0x76, 0xa5, 0x8a, + 0xde, 0x5b, 0x9b, 0x7b, 0xf9, 0xed, 0x75, 0x3b, + 0x87, 0x4b, 0x55, 0x56, 0x50, 0xe0, 0xa9, 0x7c, + 0xe4, 0x9f, 0xe2, 0x38, 0xc0, 0x06, 0x80, 0x3a, + 0x68, 0xbc, 0x29, 0x3a, 0x68, 0x33, 0xe9, 0xbf, + 0x6a, 0x8c, 0xbc, 0x93, 0x09, 0x43, 0xed, 0x38, + 0x18, 0x1d, 0x2b, 0x3b, 0xfe, 0x10, 0x3b, 0xaf, + 0xf9, 0xfe, 0x87, 0xfe, 0xf8, 0x35, 0x8a, 0x91, + 0x5e, 0x36, 0x8d, 0x2e, 0xa2, 0x6f, 0xa6, 0x50, + 0x92, 0x88, 0xd5, 0x37, 0x1f, 0x9b, 0xd4, 0xe7, + 0x3e, 0xe2, 0xa8, 0x7d, 0xb2, 0xeb, 0xfe, 0x7e, + 0x66, 0xff, 0x00, 0xbf, 0x86, 0x80, 0x3a, 0x9f, + 0xf8, 0x40, 0xee, 0xbf, 0xe7, 0xfa, 0x1f, 0xfb, + 0xe0, 0xd1, 0xff, 0x00, 0x08, 0x4d, 0xda, 0x2b, + 0x44, 0x35, 0x28, 0xc2, 0xb6, 0x0b, 0x2e, 0x1b, + 0x07, 0x1d, 0x3f, 0x9d, 0x72, 0xdf, 0x6c, 0xba, + 0xff, 0x00, 0x9f, 0x99, 0xbf, 0xef, 0xe1, 0xae, + 0x9f, 0x5c, 0xd5, 0x35, 0x68, 0xf5, 0x2b, 0x7b, + 0x3b, 0x1b, 0x89, 0x46, 0xe8, 0x23, 0xda, 0x88, + 0x06, 0x49, 0x22, 0x80, 0x24, 0x6f, 0x07, 0x5f, + 0x3e, 0xfd, 0xfa, 0xaa, 0x37, 0x98, 0x41, 0x7c, + 0xee, 0x3b, 0xb1, 0xd3, 0x3e, 0xb4, 0xd9, 0x3c, + 0x17, 0x77, 0x2b, 0x99, 0x25, 0xd4, 0xe3, 0x77, + 0x63, 0x92, 0xcc, 0x18, 0x93, 0x54, 0x65, 0xbd, + 0xf1, 0x34, 0x3e, 0x5e, 0xfb, 0xb9, 0x08, 0x91, + 0xc4, 0x6a, 0xcb, 0x2a, 0x30, 0xdc, 0x7b, 0x12, + 0x0e, 0x01, 0xfa, 0xd4, 0x4b, 0xaa, 0xf8, 0x89, + 0xcd, 0xc0, 0x5b, 0xb9, 0xc9, 0xb6, 0x04, 0xcb, + 0xf3, 0x0f, 0x94, 0x03, 0x8f, 0xe7, 0x40, 0x1a, + 0xf0, 0x78, 0x47, 0x51, 0xb6, 0x0c, 0x2d, 0xf5, + 0x81, 0x08, 0x6f, 0xbd, 0xe5, 0x96, 0x5c, 0xfd, + 0x71, 0x50, 0x9f, 0x03, 0xdc, 0x13, 0x93, 0xa8, + 0x43, 0xff, 0x00, 0x7c, 0x9a, 0xa5, 0x6d, 0x7d, + 0xe2, 0x5b, 0xa4, 0x59, 0x21, 0xbc, 0x90, 0xa3, + 0x2b, 0x30, 0x66, 0x95, 0x14, 0x61, 0x48, 0x04, + 0xf2, 0x7f, 0xda, 0x15, 0x1d, 0xde, 0xa9, 0xe2, + 0x2b, 0x2d, 0x9f, 0x68, 0xbc, 0x99, 0x43, 0xfd, + 0xd6, 0x0e, 0xac, 0xad, 0xf4, 0x23, 0x8a, 0x00, + 0xd1, 0xff, 0x00, 0x84, 0x1e, 0xe3, 0xfe, 0x82, + 0x10, 0xff, 0x00, 0xdf, 0x06, 0x8f, 0xf8, 0x41, + 0xee, 0x3f, 0xe8, 0x21, 0x0f, 0xfd, 0xf0, 0x6a, + 0xad, 0xbd, 0xd7, 0x8a, 0x2e, 0x42, 0x79, 0x57, + 0x8c, 0x4b, 0x80, 0x54, 0x34, 0xf1, 0xa9, 0x20, + 0xfb, 0x13, 0x9a, 0xaf, 0x75, 0xab, 0xeb, 0xf6, + 0x6e, 0x12, 0x6d, 0x41, 0xf7, 0x11, 0x91, 0xb2, + 0x54, 0x71, 0xf9, 0xae, 0x68, 0x03, 0xb0, 0xd0, + 0x74, 0x87, 0xd1, 0xac, 0xe7, 0x89, 0xe7, 0x49, + 0x4c, 0x8e, 0x18, 0x6d, 0x04, 0x63, 0x8a, 0x75, + 0xc7, 0xfa, 0xf6, 0xac, 0xdf, 0x07, 0xea, 0x37, + 0x97, 0xf1, 0x5f, 0xfd, 0xb2, 0xe1, 0xe6, 0xf2, + 0xfc, 0xbd, 0xbb, 0xbb, 0x67, 0x76, 0x7f, 0x95, + 0x69, 0x5c, 0x7f, 0xaf, 0x6a, 0x00, 0xcd, 0xd7, + 0x65, 0x95, 0x2e, 0xa1, 0x09, 0x23, 0x28, 0xf2, + 0x13, 0x80, 0xd8, 0xac, 0xdf, 0xb4, 0x4f, 0xff, + 0x00, 0x3d, 0xa4, 0xff, 0x00, 0xbe, 0x8d, 0x5f, + 0xd7, 0xff, 0x00, 0xe3, 0xee, 0x0f, 0xfa, 0xf7, + 0x4a, 0xcb, 0xa0, 0x09, 0x7e, 0xd1, 0x3f, 0xfc, + 0xf6, 0x93, 0xfe, 0xfa, 0x34, 0x7d, 0xa2, 0x7f, + 0xf9, 0xed, 0x27, 0xfd, 0xf4, 0x6a, 0x2a, 0x28, + 0x02, 0x5f, 0xb4, 0x4f, 0xff, 0x00, 0x3d, 0xa4, + 0xff, 0x00, 0xbe, 0x8d, 0x1f, 0x68, 0x9f, 0xfe, + 0x7b, 0x49, 0xff, 0x00, 0x7d, 0x1a, 0x8a, 0x8a, + 0x00, 0xb1, 0x03, 0x5d, 0xdc, 0x4a, 0x22, 0x8a, + 0x59, 0x0b, 0x9c, 0xe0, 0x19, 0x31, 0xdb, 0x3d, + 0xcd, 0x4a, 0xf0, 0xea, 0x08, 0xf1, 0xa9, 0x67, + 0x3e, 0x63, 0x6d, 0x42, 0xb2, 0x64, 0x13, 0xe9, + 0x90, 0x71, 0x4d, 0xd3, 0x3f, 0xe3, 0xf4, 0x7f, + 0xd7, 0x39, 0x3f, 0xf4, 0x06, 0xab, 0x3a, 0x3e, + 0x70, 0x77, 0x7d, 0xcf, 0x3e, 0x1c, 0x7f, 0xbd, + 0xbb, 0xfc, 0x33, 0x40, 0x15, 0x91, 0x2f, 0xa4, + 0xba, 0x36, 0xca, 0xd2, 0x99, 0x81, 0x20, 0xae, + 0xff, 0x00, 0x4e, 0xbd, 0xe9, 0xb1, 0x9b, 0xc9, + 0x63, 0x91, 0xe3, 0x79, 0x59, 0x63, 0x19, 0x73, + 0xbf, 0xa0, 0xad, 0x6b, 0x5c, 0x0b, 0xc8, 0xef, + 0x3b, 0xcf, 0xb1, 0x07, 0xfb, 0xd9, 0xc3, 0x7f, + 0xe8, 0x3f, 0xf8, 0xf5, 0x57, 0xb0, 0x58, 0xe2, + 0xb6, 0x80, 0x49, 0x3c, 0x71, 0x89, 0x9d, 0x99, + 0xd5, 0xb3, 0x96, 0x4c, 0x15, 0x1d, 0x07, 0xbb, + 0x50, 0x06, 0x72, 0xcd, 0x70, 0xec, 0x15, 0x65, + 0x94, 0xb1, 0x38, 0x00, 0x31, 0xe6, 0xa7, 0xf2, + 0x75, 0x0f, 0x2d, 0x9c, 0x34, 0x85, 0x57, 0x39, + 0xc4, 0x9d, 0x71, 0xd7, 0x1c, 0xf3, 0xf8, 0x51, + 0x65, 0x1b, 0x43, 0x7e, 0xea, 0xc3, 0x0f, 0x0a, + 0xc8, 0x7f, 0xe0, 0x4a, 0xa7, 0xfa, 0x8a, 0x92, + 0xc0, 0x11, 0x2a, 0xac, 0x82, 0x41, 0x2b, 0xc6, + 0xc2, 0x06, 0x27, 0x2a, 0x06, 0x0f, 0x6f, 0xce, + 0x80, 0x22, 0x68, 0xef, 0xd6, 0xdf, 0xcf, 0x2d, + 0x20, 0x8f, 0x19, 0xcf, 0x99, 0xce, 0x3d, 0x71, + 0x9c, 0xe2, 0xa0, 0xfb, 0x44, 0xff, 0x00, 0xf3, + 0xda, 0x4f, 0xfb, 0xe8, 0xd5, 0x9d, 0xc6, 0x0b, + 0x57, 0x92, 0x56, 0x2d, 0x35, 0xc4, 0x61, 0x11, + 0x4f, 0x64, 0xe3, 0x93, 0xf9, 0x60, 0x53, 0x6d, + 0x8a, 0xc3, 0x65, 0x25, 0xc7, 0x94, 0x92, 0x3f, + 0x98, 0xa9, 0xf3, 0xae, 0xe0, 0x06, 0x09, 0xe9, + 0xf8, 0x50, 0x04, 0x46, 0x4b, 0xa1, 0x12, 0xca, + 0x65, 0x93, 0x63, 0x12, 0xa0, 0xef, 0xee, 0x31, + 0x9f, 0xe6, 0x28, 0x79, 0x2e, 0xa3, 0x08, 0x5a, + 0x59, 0x00, 0x71, 0xb9, 0x4e, 0xfe, 0xa2, 0xb4, + 0x21, 0x75, 0x48, 0xad, 0xd0, 0xdb, 0x20, 0x0f, + 0x74, 0xea, 0x52, 0x45, 0xdd, 0xb4, 0x7c, 0x99, + 0x1c, 0xd5, 0x5b, 0x85, 0x02, 0xc0, 0x0f, 0xf9, + 0xe7, 0x70, 0xea, 0xbf, 0x4c, 0x0f, 0xf0, 0xfd, + 0x68, 0x02, 0xbf, 0xda, 0x27, 0xff, 0x00, 0x9e, + 0xd2, 0x7f, 0xdf, 0x46, 0x8f, 0xb4, 0x4f, 0xff, + 0x00, 0x3d, 0xa4, 0xff, 0x00, 0xbe, 0x8d, 0x45, + 0x45, 0x00, 0x4b, 0xf6, 0x89, 0xff, 0x00, 0xe7, + 0xb4, 0x9f, 0xf7, 0xd1, 0xa3, 0xed, 0x13, 0xff, + 0x00, 0xcf, 0x69, 0x3f, 0xef, 0xa3, 0x51, 0x51, + 0x40, 0x12, 0xfd, 0xa2, 0x7f, 0xf9, 0xed, 0x27, + 0xfd, 0xf4, 0x68, 0xfb, 0x44, 0xff, 0x00, 0xf3, + 0xda, 0x4f, 0xfb, 0xe8, 0xd4, 0x54, 0x50, 0x07, + 0x57, 0x75, 0xcc, 0x8b, 0xfe, 0xe2, 0xff, 0x00, + 0x2a, 0x89, 0x14, 0xbb, 0xaa, 0x8e, 0xac, 0x70, + 0x2a, 0x5b, 0xaf, 0xf5, 0x8b, 0xfe, 0xe2, 0xff, + 0x00, 0x2a, 0x6d, 0xb7, 0xfc, 0x7c, 0xc5, 0xfe, + 0xf8, 0xfe, 0x74, 0x00, 0xdb, 0x9b, 0xdf, 0x2a, + 0x46, 0x82, 0x06, 0x28, 0x88, 0x70, 0x48, 0xe0, + 0xb1, 0xee, 0x6a, 0xbf, 0xdb, 0x1f, 0xfe, 0x7a, + 0x37, 0xe7, 0x59, 0x97, 0x93, 0xe2, 0xf6, 0x71, + 0x9e, 0x92, 0x37, 0xf3, 0xa8, 0x7e, 0xd1, 0xef, + 0x5c, 0x92, 0xbb, 0x64, 0x9b, 0x3f, 0x6c, 0x7f, + 0xf9, 0xe8, 0xdf, 0x9d, 0x1f, 0x6c, 0x7f, 0xf9, + 0xe8, 0xdf, 0x9d, 0x63, 0x7d, 0xa3, 0xde, 0xb4, + 0x34, 0x5f, 0x2a, 0xe6, 0xf8, 0xc7, 0x20, 0x0c, + 0x42, 0x12, 0x88, 0x4e, 0x03, 0x37, 0xa5, 0x25, + 0x16, 0xd8, 0x16, 0x7e, 0xd8, 0xff, 0x00, 0xf3, + 0xd1, 0xbf, 0x3a, 0x3e, 0xd8, 0xff, 0x00, 0xf3, + 0xd1, 0xbf, 0x3a, 0x8e, 0xfa, 0x70, 0x22, 0x11, + 0xdd, 0x58, 0x7d, 0x92, 0x5d, 0xe3, 0x6c, 0x88, + 0x98, 0x5c, 0x77, 0xfa, 0xd3, 0x7e, 0xc0, 0xcb, + 0x7f, 0x3d, 0xb3, 0x4d, 0x84, 0x86, 0x3f, 0x34, + 0xc9, 0xb7, 0xaa, 0xe3, 0xd3, 0x34, 0xf9, 0x58, + 0x13, 0x7d, 0xb1, 0xff, 0x00, 0xe7, 0xa3, 0x7e, + 0x74, 0x7d, 0xb1, 0xff, 0x00, 0xe7, 0xa3, 0x7e, + 0x75, 0x00, 0xb3, 0x41, 0x14, 0x46, 0x6b, 0xd8, + 0xe1, 0x96, 0x68, 0xfc, 0xc4, 0x46, 0x07, 0x04, + 0x76, 0xcb, 0x74, 0x15, 0x2d, 0xf5, 0xbc, 0x09, + 0x05, 0x92, 0xdb, 0xcb, 0xbe, 0x69, 0x80, 0x0a, + 0x36, 0x11, 0xbf, 0x27, 0xaf, 0xb5, 0x1c, 0x8c, + 0x07, 0x7d, 0xb1, 0xff, 0x00, 0xe7, 0xa3, 0x7e, + 0x74, 0x7d, 0xb1, 0xff, 0x00, 0xe7, 0xa3, 0x7e, + 0x75, 0x5e, 0xe6, 0xcc, 0x43, 0x0c, 0xcf, 0x15, + 0xd2, 0xcc, 0xf6, 0xe4, 0x09, 0x90, 0x29, 0x1b, + 0x7f, 0xc6, 0xac, 0x36, 0x92, 0x44, 0xd2, 0x40, + 0x97, 0x68, 0x66, 0x54, 0xf3, 0x15, 0x0a, 0xe3, + 0x23, 0xfa, 0x51, 0xc8, 0xc0, 0x3e, 0xd8, 0xff, + 0x00, 0xf3, 0xd1, 0xbf, 0x3a, 0x3e, 0xd8, 0xff, + 0x00, 0xf3, 0xd1, 0xbf, 0x3a, 0xa7, 0x7b, 0x00, + 0xb6, 0xb7, 0x86, 0xe2, 0x3b, 0x85, 0x9e, 0x29, + 0x72, 0x03, 0x05, 0x23, 0x04, 0x55, 0xf4, 0x8e, + 0x29, 0x7c, 0x3a, 0xb2, 0x2c, 0x6b, 0xe7, 0x6d, + 0x69, 0x37, 0x63, 0x9c, 0x2b, 0x73, 0xcf, 0xd0, + 0xd0, 0xa0, 0xc0, 0x67, 0xdb, 0x1f, 0xfe, 0x7a, + 0x37, 0xe7, 0x47, 0xdb, 0x1f, 0xfe, 0x7a, 0x37, + 0xe7, 0x4f, 0xb8, 0x8e, 0x28, 0x74, 0x04, 0x6f, + 0x2d, 0x7c, 0xec, 0x23, 0x16, 0xc7, 0x3f, 0x31, + 0x38, 0x1f, 0x95, 0x43, 0xfd, 0x98, 0x77, 0x79, + 0x1f, 0x6b, 0x4f, 0xb6, 0x6c, 0xdf, 0xe4, 0x6d, + 0x3f, 0x96, 0x7d, 0x69, 0xf2, 0x30, 0x1f, 0xf6, + 0xc7, 0xff, 0x00, 0x9e, 0x8d, 0xf9, 0xd1, 0xf6, + 0xc7, 0xff, 0x00, 0x9e, 0x8d, 0xf9, 0xd4, 0x16, + 0xb6, 0xa0, 0xc1, 0x0d, 0xcc, 0xd7, 0x29, 0x09, + 0x95, 0xf6, 0xc4, 0x8c, 0x0f, 0xcd, 0x83, 0xfa, + 0x55, 0x8d, 0x6e, 0x12, 0x24, 0xb9, 0xbc, 0xf3, + 0x38, 0x59, 0x96, 0x2d, 0x98, 0xff, 0x00, 0x60, + 0x1c, 0xe6, 0x8e, 0x47, 0x6b, 0x80, 0x9f, 0x6c, + 0x7f, 0xf9, 0xe8, 0xdf, 0x9d, 0x1f, 0x6c, 0x7f, + 0xf9, 0xe8, 0xdf, 0x9d, 0x49, 0x65, 0x0f, 0xd9, + 0x6f, 0x24, 0x43, 0x26, 0xfd, 0xf6, 0x46, 0x4e, + 0x98, 0xc6, 0x6a, 0x9d, 0xb5, 0xa0, 0x96, 0x08, + 0xa5, 0x9a, 0xe9, 0x60, 0xf3, 0xdb, 0x6c, 0x4a, + 0x54, 0x9d, 0xc7, 0xfa, 0x51, 0xc8, 0xc0, 0xb1, + 0xf6, 0xc7, 0xff, 0x00, 0x9e, 0x8d, 0xf9, 0xd1, + 0xf6, 0xc7, 0xff, 0x00, 0x9e, 0x8d, 0xf9, 0xd5, + 0x78, 0xec, 0xf1, 0x1c, 0xd2, 0x5d, 0xdc, 0x0b, + 0x74, 0x8e, 0x5f, 0x28, 0x9d, 0xa5, 0xb2, 0xdf, + 0x85, 0x52, 0xb9, 0x71, 0x04, 0xef, 0x10, 0x95, + 0x24, 0x0b, 0xd1, 0xd0, 0xe4, 0x1a, 0x5c, 0xac, + 0x0d, 0x5f, 0xb6, 0x3f, 0xfc, 0xf4, 0x6f, 0xce, + 0x8f, 0xb6, 0x3f, 0xfc, 0xf4, 0x6f, 0xce, 0xb1, + 0xbe, 0xd1, 0xef, 0x47, 0xda, 0x3d, 0xe9, 0x58, + 0x0e, 0x8a, 0xd6, 0xe8, 0xdd, 0x38, 0xb6, 0x95, + 0xb7, 0x6e, 0xfb, 0x8c, 0x7a, 0x83, 0x4c, 0x23, + 0x07, 0x9a, 0xca, 0xd2, 0xe7, 0xdd, 0xa9, 0xdb, + 0x0c, 0xf5, 0x90, 0x56, 0xbc, 0x9f, 0xeb, 0x5f, + 0xea, 0x6b, 0xa2, 0x9b, 0x76, 0xd4, 0x68, 0xb4, + 0xff, 0x00, 0xea, 0x21, 0xff, 0x00, 0x79, 0x3f, + 0x98, 0xa2, 0x87, 0xff, 0x00, 0x51, 0x0f, 0xfb, + 0xc9, 0xfc, 0xc5, 0x15, 0xa0, 0xc7, 0x41, 0xf7, + 0x5f, 0xfe, 0xba, 0x3f, 0xf3, 0x35, 0x2d, 0x45, + 0x07, 0xdd, 0x7f, 0xfa, 0xe8, 0xff, 0x00, 0xcc, + 0xd4, 0x94, 0x00, 0xb5, 0xc3, 0x78, 0xe3, 0xfe, + 0x43, 0x51, 0xff, 0x00, 0xd7, 0xba, 0x7f, 0x5a, + 0xee, 0x2b, 0x17, 0xc4, 0x1e, 0x1f, 0xfe, 0xd8, + 0x78, 0xee, 0x21, 0x9d, 0x22, 0xb8, 0x45, 0xd8, + 0x44, 0x99, 0xda, 0xc3, 0xb7, 0x23, 0xa5, 0x00, + 0x79, 0xed, 0x76, 0x99, 0xfb, 0x7e, 0xbe, 0xbd, + 0xee, 0x2c, 0x6e, 0xc0, 0xf7, 0x68, 0x8b, 0x7f, + 0xec, 0xac, 0x7f, 0x26, 0xaa, 0x5f, 0xf0, 0x85, + 0x6a, 0x3f, 0xf3, 0xf7, 0x65, 0xff, 0x00, 0x7f, + 0x1b, 0xff, 0x00, 0x89, 0xab, 0x51, 0x78, 0x73, + 0x5e, 0x86, 0xfd, 0xaf, 0xe3, 0xd4, 0x6c, 0xd6, + 0xe5, 0x89, 0x25, 0xc3, 0x1e, 0x73, 0xd7, 0x8d, + 0xb8, 0xa0, 0x0c, 0xdd, 0x36, 0xdd, 0x35, 0x3b, + 0x2b, 0x31, 0x27, 0xdd, 0xb3, 0x9c, 0x89, 0x8f, + 0xfd, 0x31, 0x20, 0xbf, 0xfe, 0xca, 0xff, 0x00, + 0x9d, 0x45, 0x1d, 0xc1, 0xbb, 0xb3, 0xd6, 0x2e, + 0x65, 0xff, 0x00, 0x96, 0xb2, 0xc4, 0xec, 0x3d, + 0x01, 0x63, 0x5a, 0x76, 0xfe, 0x15, 0xd6, 0x6d, + 0xa3, 0x9a, 0x38, 0x6f, 0xec, 0xd1, 0x67, 0x4f, + 0x2e, 0x40, 0x1d, 0xbe, 0x65, 0xf4, 0xfb, 0xb4, + 0xd4, 0xf0, 0x8e, 0xad, 0x1c, 0x12, 0xc0, 0xb7, + 0xb6, 0x42, 0x39, 0x71, 0xbc, 0x6f, 0x6e, 0x71, + 0xd3, 0xf8, 0x68, 0x03, 0x33, 0x57, 0x17, 0x5f, + 0xf0, 0x93, 0xce, 0x20, 0xdf, 0xe7, 0x99, 0xbf, + 0x73, 0xb3, 0xae, 0x3f, 0x83, 0x1f, 0x86, 0x2b, + 0x21, 0xb3, 0xb8, 0xee, 0xeb, 0x9e, 0x73, 0x5d, + 0xa2, 0x68, 0x3e, 0x21, 0x4b, 0x71, 0x02, 0xea, + 0x76, 0x61, 0x15, 0x76, 0x03, 0xb8, 0xee, 0x0b, + 0xe8, 0x1b, 0x66, 0x40, 0xfc, 0x6a, 0x8f, 0xfc, + 0x21, 0x5a, 0x8f, 0xfc, 0xfd, 0xd9, 0x7f, 0xdf, + 0xc6, 0xff, 0x00, 0xe2, 0x68, 0x02, 0x9f, 0x85, + 0x3f, 0xe4, 0x29, 0x2f, 0xfd, 0x7b, 0x4b, 0xff, + 0x00, 0xa0, 0xd6, 0x25, 0x77, 0x1a, 0x1f, 0x86, + 0x2f, 0x34, 0xfb, 0xd7, 0x9a, 0x7b, 0x9b, 0x52, + 0x8d, 0x13, 0xc7, 0xf2, 0x3b, 0x13, 0x92, 0x31, + 0xdc, 0x0a, 0xa9, 0xff, 0x00, 0x08, 0x44, 0xff, + 0x00, 0xf4, 0x10, 0x83, 0xfe, 0xf9, 0x34, 0x01, + 0xc9, 0x57, 0x55, 0x71, 0x1e, 0xaa, 0xd0, 0xd9, + 0x1b, 0x4d, 0x36, 0x3b, 0x88, 0xbe, 0xc9, 0x16, + 0x1d, 0xad, 0x12, 0x43, 0x9d, 0xa3, 0xb9, 0x14, + 0xff, 0x00, 0xf8, 0x42, 0x26, 0xff, 0x00, 0xa0, + 0x84, 0x1f, 0xf7, 0xc9, 0xa3, 0xfe, 0x10, 0x89, + 0xbf, 0xe8, 0x21, 0x07, 0xfd, 0xf2, 0x68, 0x03, + 0x1b, 0x48, 0x46, 0x8e, 0xe6, 0xf5, 0x1d, 0x4a, + 0xb2, 0xda, 0x4e, 0x08, 0x3d, 0x8e, 0xd3, 0x53, + 0x68, 0x97, 0x0b, 0x6b, 0x67, 0x71, 0x33, 0x8c, + 0xc6, 0x27, 0x84, 0x38, 0xf5, 0x42, 0x1c, 0x30, + 0xfc, 0x89, 0xad, 0x3f, 0xf8, 0x42, 0x26, 0xff, + 0x00, 0xa0, 0x84, 0x1f, 0xf7, 0xc9, 0xa3, 0xfe, + 0x10, 0x89, 0xbf, 0xe8, 0x21, 0x07, 0xfd, 0xf2, + 0x68, 0x02, 0xae, 0xa0, 0x82, 0xdb, 0x4e, 0xbc, + 0xb0, 0x56, 0x0c, 0xb6, 0xa2, 0x15, 0x24, 0x74, + 0x2c, 0x59, 0x98, 0x9f, 0xd7, 0x1f, 0x85, 0x73, + 0x95, 0xd6, 0xff, 0x00, 0xc2, 0x11, 0x37, 0xfd, + 0x04, 0x20, 0xff, 0x00, 0xbe, 0x4d, 0x1f, 0xf0, + 0x84, 0x4d, 0xff, 0x00, 0x41, 0x08, 0x3f, 0xef, + 0x93, 0x40, 0x1c, 0x95, 0x74, 0xfa, 0xbc, 0xd2, + 0xdb, 0xf8, 0x8a, 0xda, 0x68, 0xa1, 0x33, 0x14, + 0xb5, 0x42, 0xc8, 0x01, 0xe5, 0x76, 0x7c, 0xdd, + 0x3d, 0xb3, 0xcd, 0x4d, 0xff, 0x00, 0x08, 0x44, + 0xff, 0x00, 0xf4, 0x11, 0x83, 0xfe, 0xf9, 0x35, + 0x7f, 0x55, 0xf0, 0xf6, 0xa1, 0x71, 0xa9, 0xc5, + 0x79, 0x65, 0x79, 0x6f, 0x13, 0x45, 0x12, 0x20, + 0x66, 0x76, 0x0d, 0x90, 0x31, 0xd8, 0x1a, 0x00, + 0xe6, 0x66, 0x8a, 0xd6, 0x4d, 0x3e, 0x6b, 0xad, + 0x3a, 0x5b, 0x88, 0x44, 0x4e, 0x9e, 0x6c, 0x12, + 0x90, 0x47, 0x39, 0xda, 0x41, 0x1d, 0x71, 0xcf, + 0x51, 0x5b, 0x59, 0x44, 0xb9, 0x77, 0xe0, 0x26, + 0xb1, 0x2a, 0xaf, 0xe0, 0xd1, 0xf3, 0xff, 0x00, + 0x8f, 0x48, 0x3f, 0x2a, 0x5b, 0xaf, 0x0d, 0xeb, + 0x97, 0x71, 0x08, 0xa6, 0xbf, 0xb0, 0xf2, 0xc3, + 0x6e, 0xd8, 0x9f, 0x20, 0x27, 0xd4, 0x85, 0x41, + 0x93, 0x4d, 0x7f, 0x0b, 0xeb, 0x72, 0x25, 0xb2, + 0x36, 0xa1, 0x66, 0x56, 0xdb, 0xfd, 0x4f, 0xce, + 0xdf, 0x2f, 0x39, 0xfe, 0xed, 0x00, 0x54, 0x39, + 0x8a, 0x19, 0xac, 0xf1, 0x83, 0x06, 0x97, 0xf3, + 0x0f, 0x46, 0x67, 0x57, 0x3f, 0xfa, 0x10, 0xfc, + 0xab, 0x3e, 0x05, 0x76, 0xf0, 0xed, 0xc2, 0xb0, + 0x25, 0x5a, 0xea, 0x31, 0x08, 0xff, 0x00, 0x6b, + 0x6b, 0x6e, 0xc7, 0xe1, 0xb7, 0xf4, 0xad, 0xf5, + 0xf0, 0xf6, 0xbc, 0xb7, 0x93, 0x5d, 0xfd, 0xbe, + 0xc0, 0xcf, 0x30, 0xc4, 0x8c, 0xdf, 0x30, 0x61, + 0xc7, 0x62, 0x98, 0xec, 0x29, 0x26, 0xf0, 0xe6, + 0xbb, 0x3c, 0xd0, 0xcb, 0x26, 0xa1, 0x62, 0x5a, + 0x13, 0x98, 0xc0, 0x24, 0x2a, 0x9c, 0xe7, 0x85, + 0x09, 0x8f, 0xd2, 0x80, 0x33, 0x6d, 0xd8, 0x7f, + 0xc2, 0x61, 0x04, 0x6a, 0x72, 0xb0, 0xca, 0xb0, + 0xaf, 0xd1, 0x06, 0xdf, 0xe9, 0x5c, 0xfd, 0x75, + 0x90, 0xf8, 0x4f, 0x57, 0x82, 0xe9, 0x6e, 0x63, + 0xbe, 0xb2, 0x13, 0x2b, 0x6e, 0x0d, 0xbd, 0x8f, + 0x3f, 0xf7, 0xcd, 0x45, 0xff, 0x00, 0x08, 0x56, + 0xa3, 0xff, 0x00, 0x3f, 0x76, 0x5f, 0xf7, 0xf1, + 0xbf, 0xf8, 0x9a, 0x00, 0xb7, 0xe0, 0x2f, 0xf5, + 0x3a, 0x97, 0xfd, 0xb2, 0xff, 0x00, 0xd9, 0xab, + 0x72, 0xe3, 0xfd, 0x7b, 0x52, 0x68, 0x9a, 0x54, + 0x7a, 0x3d, 0x8b, 0x42, 0x24, 0x12, 0xcd, 0x21, + 0x0d, 0x2b, 0x81, 0xc7, 0xb0, 0x1e, 0xc2, 0x96, + 0xe3, 0xfd, 0x73, 0x50, 0x05, 0x6d, 0x4a, 0xc9, + 0xef, 0xd2, 0x29, 0xad, 0xfe, 0x69, 0xa3, 0x4d, + 0x8d, 0x1e, 0x70, 0x48, 0x1d, 0x08, 0xac, 0xcf, + 0xec, 0x9d, 0x43, 0xfe, 0x7d, 0x24, 0xfc, 0xab, + 0x79, 0x2d, 0x67, 0x70, 0x19, 0x50, 0xe0, 0xf4, + 0x24, 0xe2, 0x9f, 0xf6, 0x4b, 0xaf, 0xee, 0xff, + 0x00, 0xe3, 0xe3, 0xfc, 0x68, 0x03, 0x9e, 0xfe, + 0xc8, 0xd4, 0x7f, 0xe7, 0xd2, 0x4a, 0x3f, 0xb2, + 0x35, 0x1f, 0xf9, 0xf4, 0x92, 0xba, 0x1f, 0xb2, + 0x5d, 0x7f, 0x77, 0xff, 0x00, 0x1f, 0x1f, 0xe3, + 0x47, 0xd9, 0x2e, 0xbf, 0xbb, 0xff, 0x00, 0x8f, + 0x8f, 0xf1, 0xa0, 0x0e, 0x7b, 0xfb, 0x23, 0x51, + 0xff, 0x00, 0x9f, 0x49, 0x28, 0xfe, 0xc8, 0xd4, + 0x7f, 0xe7, 0xd2, 0x4a, 0xe8, 0x7e, 0xc9, 0x75, + 0xfd, 0xdf, 0xfc, 0x7c, 0x7f, 0x8d, 0x1f, 0x64, + 0xba, 0xfe, 0xef, 0xfe, 0x3e, 0x3f, 0xc6, 0x80, + 0x30, 0xa0, 0xd3, 0xb5, 0x4b, 0x79, 0x44, 0xb1, + 0x5b, 0x38, 0x71, 0x9c, 0x12, 0xa0, 0xf6, 0xc7, + 0x7a, 0x95, 0xed, 0xb5, 0x97, 0x78, 0xd8, 0xc0, + 0xe0, 0xc4, 0xdb, 0x90, 0x2a, 0x28, 0x00, 0xfa, + 0xe0, 0x71, 0x5b, 0x1f, 0x64, 0xba, 0xfe, 0xef, + 0xfe, 0x3e, 0x3f, 0xc6, 0x8f, 0xb2, 0x5d, 0x7f, + 0x77, 0xff, 0x00, 0x1f, 0x1f, 0xe3, 0x40, 0x18, + 0xa9, 0x67, 0xab, 0xa0, 0x8c, 0x2c, 0x12, 0x01, + 0x1b, 0x97, 0x5e, 0x07, 0x04, 0xf7, 0xfd, 0x2a, + 0x39, 0x34, 0xdd, 0x52, 0x5d, 0xbb, 0xed, 0xa4, + 0x3b, 0x54, 0x28, 0xe0, 0x70, 0x05, 0x6f, 0x7d, + 0x92, 0xeb, 0xfb, 0xbf, 0xf8, 0xf8, 0xff, 0x00, + 0x1a, 0x3e, 0xc9, 0x75, 0xfd, 0xdf, 0xfc, 0x7c, + 0x7f, 0x8d, 0x00, 0x63, 0x47, 0x67, 0xaa, 0x2d, + 0xe0, 0xb9, 0x92, 0xd2, 0x47, 0x6c, 0xe5, 0xb8, + 0x03, 0x70, 0x3c, 0x1f, 0xd2, 0x9d, 0xf6, 0x5d, + 0x5e, 0x38, 0xda, 0x18, 0x61, 0x9b, 0xc9, 0xe4, + 0x2e, 0xe5, 0x19, 0x00, 0xfb, 0xf6, 0xfc, 0x2b, + 0x5f, 0xec, 0x97, 0x5f, 0xdd, 0xff, 0x00, 0xc7, + 0xc7, 0xf8, 0xd1, 0xf6, 0x4b, 0xaf, 0xee, 0xff, + 0x00, 0xe3, 0xe3, 0xfc, 0x68, 0x03, 0x21, 0xed, + 0xf5, 0x99, 0x23, 0xf2, 0xde, 0xd8, 0x95, 0xdb, + 0xb7, 0xfd, 0x52, 0x67, 0x1f, 0x5c, 0x66, 0xa3, + 0x82, 0xc7, 0x56, 0xb6, 0x2d, 0xe5, 0x5b, 0xb8, + 0xdd, 0xd4, 0x15, 0x04, 0x7e, 0xb5, 0xb7, 0xf6, + 0x4b, 0xaf, 0xee, 0xff, 0x00, 0xe3, 0xe3, 0xfc, + 0x68, 0xfb, 0x25, 0xd7, 0xf7, 0x7f, 0xf1, 0xf1, + 0xfe, 0x34, 0x01, 0x89, 0xf6, 0x1d, 0x5f, 0xe5, + 0x3e, 0x44, 0xa4, 0xa3, 0x99, 0x01, 0x20, 0x7d, + 0xe3, 0x8c, 0x9f, 0xd0, 0x53, 0xa7, 0xb0, 0xd4, + 0x24, 0x86, 0x28, 0xd6, 0xd2, 0x5f, 0x94, 0x97, + 0x72, 0x40, 0xe5, 0x8f, 0x5f, 0xe4, 0x2b, 0x67, + 0xec, 0x97, 0x5f, 0xdd, 0xff, 0x00, 0xc7, 0xc7, + 0xf8, 0xd1, 0xf6, 0x4b, 0xaf, 0xee, 0xff, 0x00, + 0xe3, 0xe3, 0xfc, 0x68, 0x03, 0x9e, 0xfe, 0xc8, + 0xd4, 0x7f, 0xe7, 0xd2, 0x4a, 0x3f, 0xb2, 0x35, + 0x1f, 0xf9, 0xf4, 0x92, 0xba, 0x1f, 0xb2, 0x5d, + 0x7f, 0x77, 0xff, 0x00, 0x1f, 0x1f, 0xe3, 0x47, + 0xd9, 0x2e, 0xbf, 0xbb, 0xff, 0x00, 0x8f, 0x8f, + 0xf1, 0xa0, 0x0e, 0x7b, 0xfb, 0x23, 0x51, 0xff, + 0x00, 0x9f, 0x49, 0x28, 0xfe, 0xc8, 0xd4, 0x7f, + 0xe7, 0xd2, 0x4a, 0xe8, 0x7e, 0xc9, 0x75, 0xfd, + 0xdf, 0xfc, 0x7c, 0x7f, 0x8d, 0x1f, 0x64, 0xba, + 0xfe, 0xef, 0xfe, 0x3e, 0x3f, 0xc6, 0x80, 0x39, + 0xef, 0xec, 0x8d, 0x47, 0xfe, 0x7d, 0x24, 0xa9, + 0xad, 0xf4, 0x5b, 0xa6, 0x90, 0x1b, 0x88, 0xcc, + 0x10, 0x83, 0xf3, 0x33, 0x1e, 0xde, 0xde, 0xf5, + 0xb7, 0xf6, 0x4b, 0xaf, 0xee, 0xff, 0x00, 0xe3, + 0xe3, 0xfc, 0x69, 0x0d, 0x9d, 0xc9, 0xea, 0x99, + 0xff, 0x00, 0x81, 0x0f, 0xf1, 0xa0, 0x08, 0xe7, + 0x90, 0x4b, 0x33, 0x38, 0x18, 0x07, 0xa0, 0xf6, + 0xa2, 0xdb, 0xfe, 0x3e, 0x62, 0xff, 0x00, 0x7c, + 0x7f, 0x3a, 0x63, 0xa3, 0x23, 0x6d, 0x75, 0x2a, + 0x7d, 0x0d, 0x08, 0xdb, 0x1d, 0x58, 0x75, 0x53, + 0x9a, 0x00, 0xc7, 0xbc, 0x83, 0x37, 0x93, 0x9c, + 0x75, 0x91, 0xbf, 0x9d, 0x43, 0xf6, 0x7f, 0x6a, + 0xe8, 0x2e, 0xac, 0x8b, 0x48, 0x66, 0x89, 0x49, + 0x8e, 0x4f, 0x98, 0x63, 0xb6, 0x6a, 0xbf, 0xd9, + 0x4f, 0xf7, 0x4f, 0xe5, 0x5c, 0x92, 0xba, 0x7a, + 0x92, 0x63, 0xfd, 0x9f, 0xda, 0xac, 0xd8, 0xda, + 0x5b, 0xc9, 0x31, 0x5b, 0x89, 0x1a, 0x2c, 0xaf, + 0xc8, 0xe3, 0xa0, 0x6e, 0xd9, 0xab, 0xff, 0x00, + 0x65, 0x3f, 0xdd, 0x3f, 0x95, 0x1f, 0x65, 0x3f, + 0xdd, 0x3f, 0x95, 0x25, 0x20, 0x1f, 0x38, 0xf2, + 0xb4, 0xa9, 0xad, 0xa7, 0xbd, 0x5b, 0xa7, 0x72, + 0xbe, 0x58, 0x07, 0x76, 0xdc, 0x1f, 0x5a, 0x59, + 0xdc, 0x1d, 0x11, 0x65, 0xe7, 0xce, 0x95, 0x16, + 0x02, 0x7d, 0x94, 0x9a, 0x8f, 0xec, 0xad, 0xfd, + 0xd3, 0xf9, 0x54, 0xf7, 0x1e, 0x6d, 0xc6, 0xc0, + 0xc8, 0x15, 0x53, 0xee, 0xaa, 0x2e, 0x00, 0xaa, + 0xe7, 0x0b, 0x85, 0x99, 0x0b, 0x6f, 0x1c, 0x73, + 0xdd, 0xdb, 0xcd, 0x68, 0x13, 0xe6, 0x8e, 0x55, + 0xf9, 0xd7, 0xd8, 0x0a, 0x8a, 0x53, 0x08, 0x1a, + 0x6d, 0xca, 0x48, 0x84, 0x5b, 0xe1, 0x5a, 0x3c, + 0xfc, 0xc3, 0x9f, 0x4a, 0x6f, 0xd9, 0x4f, 0xf7, + 0x4f, 0xe5, 0x47, 0xd9, 0x4f, 0xf7, 0x4f, 0xe5, + 0x47, 0xb4, 0x0b, 0x92, 0xea, 0x52, 0x4a, 0xd1, + 0x5c, 0x11, 0xa8, 0x44, 0xf1, 0x48, 0x7e, 0x48, + 0x91, 0x01, 0x24, 0x7a, 0x13, 0x8e, 0x29, 0xec, + 0xf1, 0x7f, 0x6c, 0xcd, 0x28, 0x95, 0x36, 0x1b, + 0x6d, 0xa1, 0xb7, 0x0c, 0x67, 0x1d, 0x2a, 0xbf, + 0xd9, 0x4f, 0xf7, 0x4f, 0xe5, 0x47, 0xd9, 0x4f, + 0xf7, 0x4f, 0xe5, 0x47, 0xb4, 0x0b, 0x95, 0xe7, + 0x44, 0x6d, 0x12, 0xda, 0x10, 0xca, 0x5d, 0x64, + 0x62, 0x57, 0x3c, 0x8a, 0xb7, 0x68, 0xf1, 0x47, + 0x6d, 0xa7, 0xc6, 0xce, 0xbb, 0x7f, 0x7a, 0x92, + 0x0c, 0xf4, 0x0d, 0xeb, 0x4c, 0xfb, 0x29, 0xfe, + 0xe9, 0xfc, 0xa8, 0xfb, 0x29, 0xfe, 0xe9, 0xfc, + 0xa9, 0x73, 0x85, 0xc7, 0xdd, 0xca, 0x92, 0x5b, + 0xde, 0x6d, 0x65, 0xff, 0x00, 0x5c, 0x9e, 0x5a, + 0xe7, 0xaa, 0xaf, 0x1c, 0x7e, 0x55, 0x37, 0xfa, + 0x37, 0xf6, 0xa7, 0xf6, 0xb7, 0xda, 0x13, 0x6e, + 0xcc, 0xf9, 0x79, 0xf9, 0xf7, 0x6d, 0xc6, 0x31, + 0x55, 0xbe, 0xca, 0x7f, 0xba, 0x7f, 0x2a, 0x3e, + 0xca, 0x7f, 0xba, 0x7f, 0x2a, 0x7e, 0xd0, 0x2e, + 0x2e, 0xc8, 0x6e, 0xec, 0xad, 0x37, 0xce, 0x91, + 0x35, 0xbb, 0xb1, 0x75, 0x6e, 0x09, 0x04, 0xe7, + 0x8a, 0xb1, 0x7c, 0x20, 0xbc, 0x8e, 0xf2, 0x01, + 0x71, 0x12, 0x13, 0x32, 0xc8, 0xac, 0xc7, 0x82, + 0x36, 0x81, 0xfd, 0x2a, 0xb7, 0xd9, 0x4f, 0xf7, + 0x4f, 0xe5, 0x47, 0xd9, 0x4f, 0xf7, 0x4f, 0xe5, + 0x47, 0xb4, 0x0b, 0x96, 0x8b, 0xc1, 0xf6, 0xf2, + 0xeb, 0x2a, 0x6c, 0xfb, 0x17, 0x96, 0x09, 0x61, + 0xd7, 0x3d, 0x3e, 0xb5, 0x1d, 0xac, 0xcc, 0xda, + 0x75, 0xb4, 0x50, 0xde, 0x45, 0x6c, 0xd1, 0x12, + 0x24, 0xde, 0xa0, 0xe4, 0x67, 0xa8, 0xc8, 0xeb, + 0x50, 0xfd, 0x94, 0xff, 0x00, 0x74, 0xfe, 0x54, + 0x7d, 0x94, 0xff, 0x00, 0x74, 0xfe, 0x54, 0x7b, + 0x46, 0x17, 0x1d, 0x68, 0xf3, 0x6f, 0x9d, 0xe3, + 0xbf, 0x8b, 0x73, 0xc9, 0x96, 0x49, 0xd7, 0x6a, + 0xb8, 0xf5, 0xff, 0x00, 0xeb, 0x55, 0x0d, 0x4e, + 0x18, 0x1e, 0xfa, 0x46, 0xb6, 0x55, 0x11, 0x9c, + 0x7d, 0xd1, 0x81, 0x9e, 0xf8, 0xab, 0xbf, 0x65, + 0x3f, 0xdd, 0x3f, 0x95, 0x1f, 0x65, 0x3f, 0xdd, + 0x3f, 0x95, 0x27, 0x3b, 0xab, 0x05, 0xcc, 0x7f, + 0xb3, 0xfb, 0x51, 0xf6, 0x7f, 0x6a, 0xd8, 0xfb, + 0x29, 0xfe, 0xe9, 0xfc, 0xa8, 0xfb, 0x2b, 0x7f, + 0x74, 0xfe, 0x55, 0x37, 0x02, 0x8e, 0x99, 0x06, + 0xdd, 0x4a, 0xd8, 0xe3, 0xa4, 0x82, 0xb5, 0x64, + 0xff, 0x00, 0x5a, 0xff, 0x00, 0x53, 0x4f, 0xb5, + 0xb4, 0xf2, 0x18, 0x5c, 0xca, 0x36, 0xa2, 0x72, + 0xa0, 0xf5, 0x63, 0xda, 0xa2, 0x24, 0x92, 0x49, + 0xea, 0x6b, 0xa6, 0x9d, 0xed, 0xa8, 0xd1, 0x71, + 0xff, 0x00, 0xd4, 0xc3, 0xfe, 0xf2, 0x7f, 0x31, + 0x45, 0x0d, 0xfe, 0xa6, 0x1f, 0xf7, 0x93, 0xf9, + 0x8a, 0x2b, 0x41, 0x8b, 0x07, 0x47, 0xff, 0x00, + 0xae, 0x8d, 0xfc, 0xcd, 0x4b, 0x51, 0x41, 0xd1, + 0xff, 0x00, 0xeb, 0xa3, 0x7f, 0x33, 0x52, 0xd0, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x55, 0x8e, 0xd4, 0x92, 0x79, 0x9c, 0x02, + 0x22, 0x5c, 0xe0, 0xf7, 0x3d, 0xaa, 0xcd, 0x51, + 0xbd, 0x6d, 0xb6, 0x97, 0xc7, 0xd1, 0x07, 0xf3, + 0x14, 0x9e, 0xc0, 0x53, 0x92, 0xf1, 0xe5, 0x72, + 0xce, 0xe5, 0x8d, 0x33, 0xed, 0x1e, 0xf5, 0x93, + 0xe7, 0x9a, 0xda, 0xd1, 0xa5, 0x67, 0xb2, 0x99, + 0x6d, 0x5e, 0x25, 0xbe, 0xde, 0x36, 0xf9, 0x9d, + 0x4a, 0xfb, 0x66, 0xb9, 0x54, 0x6e, 0xc9, 0x23, + 0xfb, 0x47, 0xbd, 0x1f, 0x68, 0xf7, 0xa9, 0x64, + 0x12, 0x5d, 0xea, 0x70, 0x5b, 0x6a, 0x10, 0x1b, + 0x79, 0x19, 0x48, 0xde, 0x84, 0x7c, 0xe7, 0xb1, + 0xf4, 0xaa, 0xd0, 0xda, 0x06, 0xb4, 0x0f, 0x2b, + 0x32, 0x4a, 0xf7, 0x02, 0x04, 0x19, 0xe0, 0x1e, + 0xe4, 0xd1, 0xc8, 0x04, 0x9f, 0x68, 0xf7, 0xa3, + 0xed, 0x1e, 0xf5, 0x24, 0x96, 0xb6, 0x30, 0x5c, + 0xac, 0x32, 0x35, 0xd2, 0xb0, 0x90, 0x2e, 0x1d, + 0x38, 0x93, 0x9c, 0x65, 0x4f, 0xf8, 0xd3, 0xae, + 0x2d, 0xa1, 0xba, 0xd6, 0xae, 0x23, 0x8f, 0xcc, + 0x44, 0x89, 0x4b, 0xcb, 0x80, 0x0f, 0x4e, 0xca, + 0x29, 0xfb, 0x36, 0x16, 0x21, 0xfb, 0x47, 0xbd, + 0x1f, 0x68, 0xf7, 0xa9, 0x17, 0x4f, 0x8d, 0xee, + 0xac, 0xc2, 0x99, 0xd2, 0x0b, 0x8d, 0xc0, 0x89, + 0x06, 0xd7, 0x52, 0x05, 0x34, 0xda, 0xd8, 0x8b, + 0x46, 0xb9, 0xfb, 0x44, 0xc5, 0x21, 0x97, 0xcb, + 0x97, 0x0a, 0x32, 0x4f, 0xfb, 0x3f, 0xfd, 0x7a, + 0x5e, 0xcd, 0x80, 0xdf, 0xb4, 0x7b, 0xd1, 0xf6, + 0x8f, 0x7a, 0xa9, 0xaa, 0x46, 0x2c, 0x6f, 0x5a, + 0x14, 0x62, 0xc9, 0x80, 0xca, 0x4f, 0x5c, 0x1a, + 0xdb, 0xd6, 0x62, 0x37, 0x33, 0xdb, 0xaa, 0x0e, + 0x44, 0xc2, 0x16, 0xfc, 0x40, 0x3f, 0xe3, 0x4f, + 0x90, 0x0c, 0xff, 0x00, 0xb4, 0x7b, 0xd1, 0xf6, + 0x8f, 0x7a, 0xb5, 0xac, 0xc9, 0x14, 0xf7, 0x56, + 0x41, 0xa4, 0xf2, 0xe2, 0x70, 0xdf, 0x3e, 0x33, + 0x80, 0x0d, 0x56, 0x96, 0xce, 0x0d, 0xb6, 0xd3, + 0x42, 0xd3, 0x88, 0xa4, 0x9c, 0x42, 0xc2, 0x51, + 0x86, 0xfa, 0x8a, 0x1c, 0x00, 0x4f, 0xb4, 0x7b, + 0xd1, 0xf6, 0x8f, 0x7a, 0x7c, 0xd6, 0x36, 0xa3, + 0xed, 0xb1, 0x45, 0x34, 0xa6, 0x7b, 0x65, 0x2e, + 0x77, 0x01, 0xb4, 0xaf, 0xa7, 0xd6, 0x9b, 0x65, + 0x67, 0x6d, 0x77, 0x1a, 0x46, 0x93, 0x4c, 0xd7, + 0x0e, 0x85, 0xb7, 0x2a, 0xfc, 0x8a, 0x7d, 0x0d, + 0x2e, 0x46, 0x02, 0x7d, 0xa3, 0xde, 0x8f, 0xb4, + 0x7b, 0xd4, 0x91, 0x58, 0xda, 0x86, 0xb3, 0x86, + 0x79, 0xe5, 0x5b, 0x8b, 0x85, 0x0e, 0x02, 0x81, + 0xb4, 0x03, 0xdb, 0xeb, 0x4c, 0x8a, 0xc6, 0x30, + 0xb7, 0x13, 0x4b, 0xf6, 0x86, 0x8a, 0x39, 0x8c, + 0x48, 0xb0, 0xae, 0x58, 0xe3, 0xb9, 0xa3, 0x91, + 0x80, 0x9f, 0x68, 0xf7, 0xa3, 0xed, 0x1e, 0xf4, + 0xff, 0x00, 0xec, 0xe8, 0xe3, 0x92, 0xf9, 0x66, + 0x95, 0xc2, 0xdb, 0xaa, 0xba, 0xb2, 0x8e, 0xaa, + 0x7d, 0xbd, 0x6a, 0x41, 0xa7, 0xd9, 0x35, 0xc5, + 0xba, 0x0b, 0x89, 0xb1, 0x75, 0x1e, 0xe8, 0xb8, + 0x19, 0x1c, 0x67, 0xe6, 0xa7, 0xec, 0xd8, 0x10, + 0x7d, 0xa3, 0xde, 0x8f, 0xb4, 0x7b, 0xd3, 0xed, + 0xf4, 0xe4, 0xf2, 0x62, 0x7b, 0x83, 0x39, 0x69, + 0x9c, 0xa2, 0xf9, 0x2b, 0x90, 0x98, 0x38, 0xcb, + 0x53, 0x05, 0x94, 0x30, 0xda, 0xdc, 0x4d, 0x75, + 0x2c, 0x83, 0xc8, 0x9f, 0xcb, 0x3e, 0x5e, 0x3e, + 0x61, 0xed, 0x4b, 0x91, 0x80, 0x7d, 0xa3, 0xde, + 0x8f, 0xb4, 0x7b, 0xd5, 0xbb, 0x5b, 0x5b, 0x68, + 0x35, 0x26, 0x42, 0x64, 0x91, 0x1a, 0xdf, 0xcd, + 0x8c, 0x9c, 0x7d, 0xd3, 0x9c, 0xe7, 0xde, 0xb0, + 0x25, 0x9d, 0x3c, 0xc6, 0xf2, 0xb7, 0x79, 0x79, + 0xf9, 0x77, 0x75, 0xc7, 0xbd, 0x0e, 0x16, 0x03, + 0xa2, 0xb5, 0xb8, 0x37, 0x51, 0x49, 0x0b, 0x9d, + 0xcd, 0x1a, 0xef, 0x46, 0x3d, 0x46, 0x3a, 0x8a, + 0x65, 0x51, 0xd0, 0x65, 0x2f, 0x75, 0x38, 0xff, + 0x00, 0xa6, 0x0f, 0xfd, 0x2a, 0xf5, 0x74, 0x53, + 0xf8, 0x46, 0x88, 0x35, 0x9b, 0x89, 0xad, 0xfe, + 0xc6, 0xd0, 0xca, 0xf1, 0x9f, 0x2c, 0xfd, 0xd3, + 0x8e, 0xf5, 0x9c, 0x35, 0x6d, 0x43, 0xa0, 0xba, + 0x92, 0xae, 0x78, 0x83, 0xee, 0xd9, 0x7f, 0xd7, + 0x33, 0xfc, 0xeb, 0x3a, 0xc3, 0x77, 0xf6, 0x85, + 0xbe, 0xc5, 0x0c, 0xc2, 0x45, 0x20, 0x13, 0x81, + 0xd6, 0xac, 0x65, 0x99, 0x75, 0x1d, 0x5a, 0x12, + 0x04, 0xb3, 0x4f, 0x19, 0x3c, 0x80, 0xe3, 0x19, + 0xa6, 0x7f, 0x6b, 0xea, 0x3f, 0xf3, 0xf7, 0x25, + 0x58, 0x65, 0x8a, 0x48, 0xa0, 0x48, 0x8c, 0x97, + 0x51, 0x19, 0xd8, 0x1d, 0xdf, 0x2b, 0x64, 0x81, + 0xd3, 0xf9, 0xe6, 0xaa, 0x6a, 0x10, 0x47, 0x6f, + 0x22, 0x47, 0x17, 0xce, 0xbb, 0x73, 0xe6, 0xf6, + 0x93, 0xdc, 0x7f, 0x2a, 0x00, 0x99, 0x75, 0x0d, + 0x59, 0xa2, 0x32, 0xac, 0xd3, 0x98, 0xc7, 0x57, + 0x03, 0x81, 0xf8, 0xd0, 0x75, 0x1d, 0x58, 0x44, + 0x25, 0x33, 0x4e, 0x23, 0x3c, 0x07, 0xc7, 0x1f, + 0x9d, 0x2e, 0x9f, 0x23, 0x31, 0x08, 0xd2, 0xb6, + 0xf5, 0x8d, 0x96, 0x28, 0xb1, 0x85, 0x6c, 0x83, + 0x9c, 0x9f, 0xc6, 0x91, 0x25, 0x97, 0xec, 0x8e, + 0xf3, 0xbf, 0xfa, 0xe8, 0xc4, 0x31, 0x27, 0x40, + 0x40, 0x23, 0x9f, 0xa0, 0xc7, 0xe7, 0xf8, 0xd0, + 0x03, 0x7f, 0xb5, 0x35, 0x3d, 0x85, 0xc5, 0xcc, + 0xbb, 0x41, 0xc1, 0x3d, 0xb3, 0x47, 0xf6, 0xa6, + 0xa6, 0x50, 0xbf, 0xda, 0x65, 0xda, 0x0e, 0x09, + 0xed, 0x9a, 0x92, 0x38, 0xc5, 0xad, 0x84, 0xe2, + 0xe2, 0x34, 0x97, 0xf7, 0xb1, 0x90, 0xa2, 0x4c, + 0x8e, 0x8f, 0xdd, 0x4d, 0x59, 0xb6, 0x82, 0x18, + 0x26, 0xba, 0xc4, 0x61, 0xc2, 0x9f, 0x94, 0x33, + 0x1e, 0x01, 0x89, 0xdb, 0x1c, 0x1f, 0x6c, 0x50, + 0x05, 0x58, 0x6f, 0xf5, 0x79, 0xc9, 0x10, 0xcb, + 0x71, 0x21, 0x1d, 0x76, 0x2e, 0x71, 0x4b, 0x25, + 0xee, 0xb3, 0x10, 0xcc, 0xaf, 0x72, 0x98, 0x19, + 0xf9, 0x94, 0x8e, 0x3f, 0x2f, 0x7a, 0xa7, 0x68, + 0xc4, 0x5e, 0x44, 0x57, 0xe5, 0x06, 0x45, 0xe0, + 0x1f, 0x7a, 0xb2, 0xca, 0x24, 0x97, 0x50, 0x2e, + 0x49, 0x29, 0xca, 0xf2, 0x78, 0xfd, 0xe2, 0x8f, + 0xeb, 0x40, 0x0d, 0xfe, 0xd7, 0xd4, 0x7f, 0xe7, + 0xee, 0x4a, 0x3f, 0xb5, 0xf5, 0x1f, 0xf9, 0xfb, + 0x92, 0xac, 0x5c, 0x47, 0x67, 0x11, 0xb9, 0x2b, + 0x6a, 0x08, 0x82, 0xe0, 0x46, 0x01, 0x76, 0xf9, + 0x81, 0xdd, 0xd7, 0x9f, 0xf6, 0x69, 0xe3, 0x4f, + 0x82, 0x27, 0x70, 0x63, 0x49, 0x14, 0xce, 0xf1, + 0xe5, 0xe6, 0x08, 0x51, 0x41, 0xc7, 0x1c, 0x8c, + 0x9a, 0x00, 0xa8, 0x35, 0x6d, 0x44, 0x90, 0x05, + 0xd4, 0x84, 0x9e, 0x80, 0x54, 0xcb, 0x77, 0xad, + 0xb2, 0x6f, 0x56, 0xba, 0x29, 0xcf, 0xcc, 0x10, + 0xe3, 0xf9, 0x53, 0x92, 0x18, 0x20, 0x96, 0xd3, + 0x6c, 0x61, 0x99, 0x55, 0xa5, 0x79, 0x32, 0x79, + 0x08, 0xcd, 0xfc, 0xf6, 0xd0, 0x00, 0xfb, 0x35, + 0x84, 0xad, 0x78, 0xb0, 0x6d, 0x0c, 0x4e, 0x77, + 0x6e, 0x3f, 0x39, 0xe4, 0x60, 0x50, 0x04, 0x3f, + 0xda, 0x7a, 0xa6, 0x14, 0xfd, 0xa2, 0x6c, 0x3f, + 0xdd, 0xf7, 0xfa, 0x52, 0xae, 0xa3, 0xab, 0x33, + 0xb2, 0x2c, 0xd3, 0x97, 0x5e, 0x0a, 0x81, 0xc8, + 0xe7, 0x1f, 0xce, 0xac, 0x42, 0xe9, 0x74, 0xcb, + 0x70, 0x17, 0x09, 0x05, 0xcb, 0xc9, 0x8f, 0x45, + 0x23, 0x70, 0x1f, 0xf8, 0xe9, 0xa9, 0x63, 0x3b, + 0x6e, 0x44, 0xff, 0x00, 0xf3, 0xf5, 0x34, 0x18, + 0xfc, 0x7e, 0x66, 0xfd, 0x71, 0x40, 0x14, 0x57, + 0x52, 0xd5, 0x5a, 0x5f, 0x29, 0x67, 0x98, 0xc9, + 0x9c, 0x6c, 0x03, 0x9f, 0xca, 0x93, 0xfb, 0x53, + 0x53, 0x2b, 0xbb, 0xed, 0x32, 0xed, 0xce, 0x33, + 0xdb, 0x35, 0x7e, 0xd4, 0x01, 0xa9, 0x0b, 0xcc, + 0x7f, 0xad, 0x08, 0x07, 0xfb, 0xcc, 0x70, 0xdf, + 0xfa, 0x0b, 0x55, 0x6b, 0x2f, 0xdd, 0xad, 0xb8, + 0x1c, 0xb8, 0x8e, 0x59, 0xd4, 0x7f, 0xb5, 0x82, + 0x17, 0xff, 0x00, 0x41, 0xcd, 0x00, 0x32, 0x5d, + 0x43, 0x57, 0x84, 0x03, 0x2c, 0xb3, 0xc7, 0x9e, + 0x9b, 0xc6, 0x33, 0x43, 0xdf, 0xea, 0xe9, 0x18, + 0x91, 0xe5, 0xb8, 0x58, 0xdb, 0xa3, 0x15, 0xc0, + 0x3f, 0x8d, 0x33, 0x4f, 0x96, 0x59, 0xae, 0xe2, + 0x82, 0x57, 0x69, 0x22, 0x92, 0x54, 0x2e, 0x1b, + 0x9e, 0xf5, 0x0b, 0x5d, 0xdd, 0x3b, 0xcd, 0xb9, + 0xd9, 0x8c, 0x80, 0x87, 0x07, 0x91, 0xf9, 0x50, + 0x05, 0xb9, 0x2f, 0x35, 0xa8, 0x53, 0x7c, 0xaf, + 0x72, 0x8b, 0xfd, 0xe6, 0x42, 0x07, 0xf2, 0xa8, + 0x0e, 0xad, 0xa8, 0x11, 0x8f, 0xb5, 0xc9, 0xf9, + 0xd5, 0xdb, 0xd6, 0x48, 0x2f, 0x6f, 0x5d, 0xee, + 0x95, 0xf7, 0x87, 0x41, 0x0a, 0xee, 0xce, 0x4f, + 0xaf, 0x18, 0xe3, 0xaf, 0xe1, 0x58, 0xb4, 0x01, + 0xd2, 0x5a, 0x49, 0x24, 0xba, 0x3c, 0x4f, 0x23, + 0xb3, 0xb7, 0x98, 0xdc, 0xb1, 0xc9, 0xa5, 0xa6, + 0x69, 0xff, 0x00, 0xf2, 0x04, 0x87, 0xfe, 0xba, + 0x35, 0x3e, 0x80, 0x2d, 0xb7, 0xfa, 0x98, 0x7f, + 0xde, 0x4f, 0xe6, 0x28, 0xa1, 0xbf, 0xd4, 0xc3, + 0xfe, 0xf2, 0x7f, 0x31, 0x45, 0x00, 0x3a, 0x1e, + 0x8f, 0xff, 0x00, 0x5d, 0x1b, 0xf9, 0x9a, 0x92, + 0xa3, 0x87, 0xa3, 0xff, 0x00, 0xd7, 0x46, 0xfe, + 0x66, 0xa4, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0xa9, 0xdd, 0x2e, 0xeb, + 0x5b, 0xd1, 0xea, 0x83, 0xf9, 0x8a, 0xb9, 0x55, + 0xf7, 0x28, 0x9e, 0x44, 0x93, 0xfd, 0x5c, 0x83, + 0x6b, 0x7b, 0x7b, 0xd2, 0x7a, 0xa0, 0x39, 0xcf, + 0xb3, 0xfb, 0x55, 0xcb, 0x5b, 0x6b, 0x09, 0x2d, + 0xda, 0x3b, 0x8d, 0xd1, 0x4b, 0xbb, 0x22, 0x50, + 0x0b, 0x71, 0xe9, 0x8a, 0xd0, 0x6d, 0x3a, 0x45, + 0x3f, 0x2a, 0xef, 0x53, 0xd1, 0x97, 0x90, 0x69, + 0x3f, 0xb3, 0xe6, 0xff, 0x00, 0x9e, 0x2d, 0xf9, + 0x57, 0x2e, 0xa9, 0xec, 0x49, 0x5e, 0xf2, 0x64, + 0x22, 0xce, 0x2b, 0x67, 0x79, 0x0d, 0xb1, 0xc8, + 0x91, 0x87, 0x24, 0xe6, 0xa5, 0xd6, 0x84, 0x4d, + 0x73, 0x04, 0x25, 0x58, 0x46, 0xa4, 0xc8, 0xe1, + 0x7a, 0xe5, 0x8e, 0x4f, 0xe3, 0x53, 0x45, 0x69, + 0x75, 0x0c, 0x82, 0x48, 0xe3, 0x65, 0x61, 0xd0, + 0xed, 0xa4, 0x7b, 0x2b, 0x89, 0x1c, 0xbb, 0xc6, + 0xe5, 0x8f, 0x52, 0x45, 0x3e, 0x67, 0x6d, 0x80, + 0x43, 0x75, 0x14, 0x70, 0x32, 0x1b, 0xa9, 0x2e, + 0xc1, 0x65, 0x64, 0x57, 0x4e, 0x53, 0x07, 0x3d, + 0x4f, 0x5a, 0x68, 0xb8, 0xb7, 0x8b, 0x53, 0x9e, + 0x64, 0x95, 0xcc, 0x77, 0x08, 0x55, 0x99, 0x54, + 0x82, 0x86, 0x97, 0xfb, 0x3e, 0x6f, 0xf9, 0xe2, + 0xdf, 0x95, 0x1f, 0xd9, 0xf3, 0x7f, 0xcf, 0x16, + 0xfc, 0xa8, 0xe6, 0x97, 0x60, 0x19, 0x14, 0xb0, + 0xc5, 0x7f, 0x6c, 0xed, 0x79, 0x3c, 0xeb, 0x1e, + 0xe2, 0xef, 0x26, 0x71, 0xd0, 0xe3, 0x03, 0xad, + 0x57, 0x2d, 0x17, 0xf6, 0x65, 0xc4, 0x1b, 0xbe, + 0x77, 0x9f, 0x78, 0x18, 0x3d, 0x2a, 0xdf, 0xf6, + 0x7c, 0xdf, 0xf3, 0xc5, 0xbf, 0x2a, 0x3f, 0xb3, + 0xe6, 0xff, 0x00, 0x9e, 0x2d, 0xf9, 0x51, 0xcd, + 0x2e, 0xc0, 0x51, 0xd5, 0xbc, 0xbb, 0xab, 0xb5, + 0x92, 0x33, 0xb9, 0x44, 0x6a, 0xb9, 0xc6, 0x2b, + 0x4b, 0xed, 0xd0, 0xad, 0xe5, 0xdc, 0x81, 0xb7, + 0x2b, 0x22, 0xb4, 0x67, 0x07, 0xef, 0x85, 0xc7, + 0xf5, 0xa8, 0xff, 0x00, 0xb3, 0xe6, 0xff, 0x00, + 0x9e, 0x2d, 0xf9, 0x51, 0xfd, 0x9f, 0x37, 0xfc, + 0xf1, 0x6f, 0xca, 0x8e, 0x69, 0x76, 0x01, 0xb6, + 0xf7, 0x16, 0xf1, 0xcd, 0x60, 0xee, 0x73, 0xe4, + 0xc6, 0x55, 0x8e, 0xdf, 0xba, 0x4d, 0x38, 0xcf, + 0x6e, 0xd6, 0xf1, 0x45, 0x25, 0xd4, 0x92, 0xbc, + 0x57, 0x0b, 0x2e, 0xf7, 0x52, 0x77, 0x7d, 0x3d, + 0x28, 0xfe, 0xcf, 0x9b, 0xfe, 0x78, 0xb7, 0xe5, + 0x47, 0xf6, 0x7c, 0xdf, 0xf3, 0xc5, 0xbf, 0x2a, + 0x39, 0xa5, 0xd8, 0x08, 0x84, 0xb0, 0x8b, 0xbd, + 0x46, 0x4d, 0xff, 0x00, 0x2c, 0xf1, 0x32, 0xa1, + 0xc1, 0xe4, 0x9a, 0xb5, 0x0d, 0xf5, 0xbc, 0x72, + 0x5b, 0x49, 0xe7, 0xc8, 0xa8, 0x91, 0x84, 0x30, + 0xa8, 0x3b, 0x41, 0xf5, 0x3e, 0xb5, 0x17, 0xf6, + 0x7c, 0xdf, 0xf3, 0xc5, 0xbf, 0x2a, 0x3f, 0xb3, + 0xe6, 0xff, 0x00, 0x9e, 0x2d, 0xf9, 0x50, 0xa5, + 0x2e, 0xc0, 0x4c, 0xb1, 0xdb, 0x4d, 0x79, 0x63, + 0x29, 0x69, 0x0c, 0x91, 0x28, 0x45, 0x06, 0x32, + 0x03, 0x81, 0xd1, 0xb3, 0xe9, 0xde, 0xa0, 0x13, + 0xa6, 0xdb, 0x9b, 0x66, 0xb9, 0x92, 0xd8, 0xfd, + 0xa1, 0xa4, 0x59, 0x23, 0x07, 0x9e, 0x7a, 0x71, + 0x56, 0x63, 0x8e, 0xfe, 0x38, 0xfc, 0xb4, 0xf3, + 0x02, 0xf6, 0x18, 0xe9, 0x55, 0xff, 0x00, 0xb3, + 0xe6, 0xff, 0x00, 0x9e, 0x4d, 0xf9, 0x53, 0x72, + 0x7d, 0x10, 0xc8, 0x3c, 0xd8, 0x7c, 0xab, 0xf4, + 0xf3, 0xa5, 0x7f, 0x35, 0x55, 0x63, 0x32, 0x92, + 0xcc, 0xd8, 0xf7, 0xa7, 0xa4, 0xd0, 0x2d, 0xc6, + 0x9a, 0xe5, 0xf8, 0x82, 0x3d, 0xae, 0x70, 0x78, + 0xa9, 0x3f, 0xb3, 0xe6, 0xff, 0x00, 0x9e, 0x2d, + 0xf9, 0x51, 0xfd, 0x9f, 0x37, 0xfc, 0xf1, 0x6f, + 0xca, 0x97, 0x34, 0xbb, 0x08, 0x05, 0xcc, 0x52, + 0xc0, 0x91, 0xb5, 0xdc, 0xd6, 0xde, 0x53, 0xb1, + 0xfd, 0xde, 0x7e, 0x75, 0x27, 0x3d, 0xbf, 0xad, + 0x55, 0x91, 0xe3, 0x7d, 0x32, 0x78, 0x77, 0xbb, + 0x3b, 0xcf, 0xbc, 0x6f, 0xe5, 0x88, 0xc7, 0x73, + 0x56, 0xbf, 0xb3, 0xe6, 0xff, 0x00, 0x9e, 0x2d, + 0xf9, 0x51, 0xfd, 0x9f, 0x37, 0xfc, 0xf1, 0x6f, + 0xca, 0x8e, 0x69, 0x76, 0x00, 0x5b, 0x9b, 0x71, + 0x7b, 0x03, 0x97, 0x3b, 0x05, 0xa8, 0x85, 0x98, + 0x29, 0xe0, 0xd6, 0x34, 0x96, 0xa8, 0xb2, 0x30, + 0x46, 0xde, 0xa0, 0xf0, 0xd8, 0xc6, 0x6b, 0x67, + 0xfb, 0x3e, 0x6f, 0xf9, 0xe2, 0xdf, 0x95, 0x1f, + 0xd9, 0xf3, 0x7f, 0xcf, 0x26, 0xfc, 0xa9, 0x36, + 0xdf, 0x40, 0x2a, 0xe8, 0xb1, 0x6c, 0xb8, 0x98, + 0xe3, 0xfe, 0x58, 0x30, 0xab, 0x35, 0x3a, 0xc2, + 0x2c, 0xe2, 0x62, 0xdf, 0xeb, 0x64, 0x5d, 0xa0, + 0x7a, 0x2f, 0x7a, 0x82, 0xba, 0x29, 0xa6, 0xa3, + 0xa9, 0x48, 0x6e, 0xab, 0x61, 0x35, 0xdc, 0x76, + 0x8d, 0x1b, 0x46, 0xa1, 0x63, 0xc7, 0xce, 0xe1, + 0x7b, 0xd5, 0x18, 0xb4, 0x9b, 0xc8, 0x65, 0x49, + 0x52, 0x5b, 0x70, 0xe8, 0x72, 0x0f, 0x9a, 0x2a, + 0x4f, 0x10, 0x7d, 0xdb, 0x2f, 0xfa, 0xe6, 0x7f, + 0x9d, 0x63, 0x55, 0x81, 0xb5, 0x2d, 0x8d, 0xec, + 0x88, 0x11, 0x0d, 0xa4, 0x2a, 0x09, 0x38, 0x8a, + 0x5c, 0x64, 0x91, 0x83, 0xdf, 0xd2, 0xa0, 0x3a, + 0x3d, 0xd9, 0x50, 0xa6, 0x58, 0x08, 0x1d, 0x07, + 0x9c, 0x38, 0xac, 0xca, 0x28, 0x03, 0x72, 0x3b, + 0x4b, 0xe8, 0xe2, 0x54, 0x06, 0xcc, 0xb2, 0x29, + 0x54, 0x90, 0xc8, 0x37, 0x28, 0x3d, 0x87, 0xe6, + 0x69, 0x65, 0xb3, 0xba, 0x9a, 0x30, 0x8f, 0x0d, + 0x86, 0xe0, 0x81, 0x03, 0x89, 0x4e, 0x40, 0x1f, + 0x8e, 0x2b, 0x0a, 0x8a, 0x00, 0xda, 0x83, 0x4f, + 0xbb, 0x86, 0x27, 0x8b, 0x16, 0x72, 0x23, 0xb0, + 0x66, 0x0f, 0x27, 0xa6, 0x71, 0xd0, 0xfb, 0xd4, + 0x89, 0x6d, 0xa8, 0x2c, 0x92, 0x39, 0x6b, 0x46, + 0x32, 0x3e, 0xe6, 0x06, 0x41, 0x8e, 0x8c, 0xb8, + 0xeb, 0xd3, 0x0c, 0x6b, 0x06, 0x8a, 0x00, 0xd5, + 0x4d, 0x26, 0xe9, 0x25, 0x59, 0x15, 0xed, 0x81, + 0x56, 0xdc, 0x07, 0x9a, 0x31, 0x4f, 0x1a, 0x75, + 0xe8, 0x33, 0x9d, 0xf6, 0xbf, 0xbf, 0xfb, 0xdf, + 0xbd, 0x1c, 0x7c, 0xc1, 0xb8, 0xfc, 0xab, 0x1e, + 0x8a, 0x00, 0xda, 0x96, 0xc2, 0xfa, 0x5f, 0x3b, + 0x73, 0xda, 0x8f, 0x3a, 0x51, 0x2b, 0x62, 0x51, + 0xd7, 0x9e, 0x9f, 0xf7, 0xd1, 0xa9, 0x0d, 0xad, + 0xeb, 0x3b, 0xb4, 0x8b, 0x63, 0x26, 0xe9, 0x0c, + 0x80, 0x33, 0xe4, 0x2b, 0x1e, 0xb8, 0xe7, 0xf9, + 0xd6, 0x7b, 0xda, 0xda, 0x44, 0xb1, 0xf9, 0xb7, + 0x72, 0x2b, 0xb4, 0x6a, 0xe4, 0x2c, 0x39, 0x03, + 0x23, 0x3d, 0x77, 0x52, 0x47, 0x69, 0x6e, 0x61, + 0x81, 0xe5, 0xba, 0x68, 0xda, 0x60, 0x48, 0x1e, + 0x56, 0x40, 0xe4, 0x8e, 0x4e, 0x7d, 0xbd, 0x28, + 0x02, 0xef, 0xd8, 0x2f, 0x8a, 0x05, 0xdd, 0x6b, + 0xc4, 0x66, 0x20, 0x7c, 0xc1, 0xd0, 0xb6, 0xef, + 0xeb, 0x51, 0xc9, 0xa5, 0xde, 0x49, 0x14, 0x51, + 0xb3, 0xdb, 0x62, 0x20, 0x54, 0x62, 0x51, 0xdc, + 0x93, 0xfd, 0x6a, 0x8d, 0xd5, 0xa3, 0x5a, 0x84, + 0xde, 0xd9, 0x66, 0x2c, 0x08, 0xf4, 0x21, 0x88, + 0xfe, 0x95, 0x5e, 0x80, 0x36, 0x60, 0xd3, 0xef, + 0xa0, 0x8a, 0x68, 0xd1, 0xed, 0xb6, 0xcc, 0xbb, + 0x5b, 0x32, 0x8e, 0x3e, 0x94, 0xf1, 0x67, 0x7e, + 0x16, 0xd5, 0x77, 0xda, 0xe2, 0xd9, 0xb7, 0x27, + 0xef, 0x07, 0x27, 0x39, 0xe6, 0xb0, 0xe8, 0xa0, + 0x0d, 0xc8, 0xec, 0xf5, 0x08, 0xd6, 0x15, 0x0f, + 0x6a, 0x44, 0x52, 0x19, 0x14, 0x19, 0x07, 0x5f, + 0xf3, 0xfc, 0xe9, 0x9f, 0xd9, 0xf7, 0xe2, 0x68, + 0xa5, 0x59, 0x6d, 0x91, 0xe2, 0x01, 0x57, 0x12, + 0x8e, 0xd5, 0x8d, 0x45, 0x00, 0x6e, 0x4b, 0x67, + 0x7a, 0xe9, 0xb2, 0x3f, 0xb1, 0x40, 0x0b, 0x06, + 0x3e, 0x53, 0x81, 0x92, 0x3a, 0x77, 0xa7, 0x4b, + 0x6b, 0x7d, 0x22, 0x38, 0x02, 0xc9, 0x1e, 0x41, + 0x89, 0x24, 0x47, 0x01, 0x9b, 0xfc, 0xfb, 0x56, + 0x0d, 0x14, 0x01, 0xad, 0x71, 0xa5, 0xde, 0x5c, + 0x4e, 0xf3, 0x3b, 0xdb, 0x06, 0x73, 0xb8, 0x81, + 0x28, 0xc5, 0x47, 0xfd, 0x8b, 0x75, 0xff, 0x00, + 0x3d, 0x2d, 0xff, 0x00, 0xef, 0xe8, 0xac, 0xda, + 0x28, 0x03, 0xa8, 0x82, 0xd9, 0xed, 0xb4, 0x98, + 0xa3, 0x72, 0x84, 0x89, 0x18, 0xe5, 0x5b, 0x22, + 0x99, 0x4c, 0xd3, 0xff, 0x00, 0xe4, 0x09, 0x0f, + 0xfd, 0x74, 0x6a, 0x7d, 0x00, 0x5b, 0x6f, 0xf5, + 0x30, 0xff, 0x00, 0xbc, 0x9f, 0xcc, 0x51, 0x48, + 0xdf, 0xea, 0xa1, 0xff, 0x00, 0x79, 0x3f, 0x98, + 0xa2, 0x80, 0x1d, 0x0f, 0x47, 0xff, 0x00, 0xae, + 0x8d, 0xfc, 0xcd, 0x49, 0x51, 0xc3, 0xd1, 0xff, + 0x00, 0xeb, 0xa3, 0x7f, 0x33, 0x52, 0x50, 0x01, + 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, + 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, + 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, + 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, + 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, + 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, + 0x54, 0xa7, 0xff, 0x00, 0x5c, 0xd5, 0x76, 0xa9, + 0x4d, 0xfe, 0xb5, 0xa8, 0x02, 0x9e, 0xb3, 0x24, + 0x91, 0xda, 0x59, 0xec, 0x76, 0x5c, 0x99, 0x33, + 0xb4, 0xe3, 0xfb, 0xb5, 0x91, 0xf6, 0x89, 0xff, + 0x00, 0xe7, 0xb4, 0x9f, 0xf7, 0xd1, 0xad, 0x4d, + 0x73, 0xfe, 0x3d, 0x2c, 0xbe, 0xb2, 0x7f, 0xec, + 0xb5, 0x8d, 0x40, 0x12, 0xfd, 0xa2, 0x7f, 0xf9, + 0xed, 0x27, 0xfd, 0xf4, 0x68, 0xfb, 0x44, 0xff, + 0x00, 0xf3, 0xda, 0x4f, 0xfb, 0xe8, 0xd4, 0x54, + 0x50, 0x04, 0xbf, 0x68, 0x9f, 0xfe, 0x7b, 0x49, + 0xff, 0x00, 0x7d, 0x1a, 0x3e, 0xd1, 0x3f, 0xfc, + 0xf6, 0x93, 0xfe, 0xfa, 0x35, 0x15, 0x14, 0x01, + 0x32, 0xcd, 0x3b, 0x32, 0xa8, 0x9d, 0xc6, 0x4e, + 0x39, 0x72, 0x05, 0x4d, 0x77, 0xe7, 0x5b, 0x4a, + 0xa8, 0xb7, 0x6f, 0x20, 0x64, 0x0d, 0xb8, 0x12, + 0x07, 0x35, 0x55, 0x15, 0x9d, 0xd5, 0x10, 0x16, + 0x66, 0x38, 0x00, 0x77, 0x35, 0xa3, 0x7d, 0x01, + 0x85, 0xed, 0xde, 0xea, 0x09, 0x44, 0x5e, 0x4a, + 0xa9, 0xda, 0x76, 0x9d, 0xd8, 0xe9, 0x92, 0x28, + 0x01, 0x21, 0xb7, 0xb8, 0x96, 0xea, 0xda, 0x11, + 0x76, 0xe1, 0x67, 0x8f, 0x7e, 0xfc, 0x9f, 0x97, + 0xae, 0x7b, 0xfb, 0x1a, 0x8e, 0x28, 0xe7, 0x74, + 0xdc, 0xf7, 0x13, 0x29, 0xf3, 0x84, 0x5b, 0x57, + 0x2c, 0x4f, 0x5c, 0xf7, 0xed, 0xfd, 0x6a, 0xc4, + 0x4e, 0xa3, 0x4b, 0x79, 0xd3, 0x2a, 0x62, 0xdd, + 0x12, 0x64, 0xf2, 0x03, 0x10, 0x47, 0xe9, 0xba, + 0xac, 0x48, 0x55, 0x75, 0x2d, 0x3d, 0x57, 0xa4, + 0xb3, 0x7d, 0xa0, 0x81, 0xfe, 0xd9, 0x18, 0xfe, + 0x54, 0x01, 0x94, 0x0d, 0xe9, 0x55, 0x60, 0x6e, + 0x0a, 0xb7, 0x00, 0xf3, 0x83, 0xfe, 0x70, 0x7f, + 0x2a, 0x6c, 0x92, 0x5d, 0xc4, 0xe5, 0x24, 0x79, + 0x91, 0x87, 0x66, 0x24, 0x1a, 0xd2, 0xb6, 0x70, + 0x1a, 0xc9, 0x18, 0xb6, 0x0d, 0xb4, 0x9b, 0x40, + 0x6d, 0xa7, 0x71, 0x67, 0xe8, 0x7d, 0x6a, 0xa6, + 0xa3, 0xf2, 0xac, 0x11, 0x18, 0x64, 0x88, 0xa2, + 0x9e, 0x25, 0x70, 0xcd, 0x8c, 0xf7, 0xe0, 0x63, + 0xbd, 0x00, 0x3a, 0x38, 0xa6, 0x65, 0x56, 0x92, + 0xee, 0x44, 0x1e, 0x59, 0x95, 0xba, 0x9d, 0xab, + 0x9c, 0x0e, 0xfd, 0x4d, 0x02, 0x36, 0x72, 0x7c, + 0x9b, 0xf7, 0x71, 0xe5, 0xb3, 0x80, 0x72, 0x0e, + 0x57, 0xa8, 0x23, 0x3c, 0x71, 0x52, 0x11, 0x70, + 0x6f, 0x55, 0xed, 0x59, 0x43, 0x8b, 0x68, 0xf6, + 0xa1, 0xc7, 0xce, 0x36, 0xa8, 0x23, 0x1d, 0xfb, + 0xf1, 0xed, 0x52, 0x1d, 0xb0, 0xdd, 0x59, 0x49, + 0x34, 0x09, 0x6f, 0x33, 0xb1, 0x59, 0x63, 0x4e, + 0x3e, 0x53, 0x81, 0x9c, 0x76, 0xea, 0x7f, 0x2a, + 0x00, 0xac, 0xd1, 0x5d, 0x0b, 0x5b, 0x69, 0x85, + 0xc4, 0x87, 0xcf, 0x62, 0xa1, 0x77, 0x1e, 0x39, + 0xc0, 0xfc, 0xf9, 0xfc, 0xa9, 0x2f, 0x16, 0x6b, + 0x66, 0x1b, 0x2e, 0xa4, 0x91, 0x0b, 0x32, 0x86, + 0xc9, 0x1c, 0x83, 0x83, 0xdf, 0xe8, 0x7f, 0x1a, + 0xd0, 0x87, 0x6a, 0xdc, 0xc9, 0x03, 0x10, 0x45, + 0x9a, 0xa4, 0xbf, 0x8a, 0x03, 0xbb, 0xf5, 0x6a, + 0xcc, 0x72, 0x4e, 0x96, 0x85, 0xba, 0xb4, 0xec, + 0x47, 0xfd, 0xf2, 0x33, 0xfd, 0x28, 0x02, 0x1f, + 0xb4, 0x4f, 0xff, 0x00, 0x3d, 0xa4, 0xff, 0x00, + 0xbe, 0x8d, 0x1f, 0x68, 0x9f, 0xfe, 0x7b, 0x49, + 0xff, 0x00, 0x7d, 0x1a, 0x8a, 0x8a, 0x00, 0x97, + 0xed, 0x13, 0xff, 0x00, 0xcf, 0x69, 0x3f, 0xef, + 0xa3, 0x47, 0xda, 0x27, 0xff, 0x00, 0x9e, 0xd2, + 0x7f, 0xdf, 0x46, 0xa2, 0xa2, 0x80, 0x25, 0xfb, + 0x44, 0xff, 0x00, 0xf3, 0xda, 0x4f, 0xfb, 0xe8, + 0xd2, 0x19, 0xe6, 0x23, 0x06, 0x69, 0x3f, 0xef, + 0xa3, 0x51, 0xd1, 0x40, 0x1d, 0x32, 0x7f, 0xc7, + 0x85, 0x9f, 0xfd, 0x72, 0xfe, 0xa6, 0x92, 0x88, + 0xff, 0x00, 0xe4, 0x1f, 0x67, 0xff, 0x00, 0x5c, + 0xbf, 0xa9, 0xa2, 0x80, 0x29, 0xf8, 0x83, 0xee, + 0xd9, 0x7f, 0xd7, 0x33, 0xfc, 0xeb, 0x1a, 0xba, + 0x8b, 0xfd, 0x37, 0xed, 0xd1, 0x5a, 0xb7, 0xda, + 0x63, 0x8b, 0x6a, 0x63, 0x0f, 0xdf, 0x9a, 0xa5, + 0xff, 0x00, 0x08, 0xff, 0x00, 0xfd, 0x3f, 0xdb, + 0xfe, 0x74, 0x01, 0x89, 0x45, 0x6d, 0xff, 0x00, + 0xc2, 0x3f, 0xff, 0x00, 0x4f, 0xf6, 0xff, 0x00, + 0x9d, 0x1f, 0xf0, 0x8f, 0xff, 0x00, 0xd3, 0xfd, + 0xbf, 0xe7, 0x40, 0x18, 0x94, 0x56, 0xdf, 0xfc, + 0x23, 0xff, 0x00, 0xf4, 0xff, 0x00, 0x6f, 0xf9, + 0xd1, 0xff, 0x00, 0x08, 0xff, 0x00, 0xfd, 0x3f, + 0xdb, 0xfe, 0x74, 0x01, 0x89, 0x45, 0x6d, 0xff, + 0x00, 0xc2, 0x3f, 0xff, 0x00, 0x4f, 0xf6, 0xff, + 0x00, 0x9d, 0x1f, 0xf0, 0x8f, 0xff, 0x00, 0xd3, + 0xfd, 0xbf, 0xe7, 0x40, 0x18, 0x94, 0x56, 0xdf, + 0xfc, 0x23, 0xff, 0x00, 0xf4, 0xff, 0x00, 0x6f, + 0xf9, 0xd1, 0xff, 0x00, 0x08, 0xff, 0x00, 0xfd, + 0x3f, 0xdb, 0xfe, 0x74, 0x00, 0x4f, 0x1d, 0xf3, + 0xc7, 0x07, 0x91, 0x66, 0xb2, 0xc6, 0x60, 0x8c, + 0x6f, 0xf2, 0x15, 0x8f, 0xdd, 0x1d, 0xf1, 0x55, + 0xde, 0x74, 0x82, 0xce, 0xc8, 0x9b, 0x68, 0xe4, + 0x70, 0x8c, 0x43, 0x39, 0x6e, 0x3e, 0x76, 0xec, + 0x0e, 0x2a, 0xc7, 0xfc, 0x23, 0xff, 0x00, 0xf4, + 0xff, 0x00, 0x6f, 0xf9, 0xd1, 0xff, 0x00, 0x08, + 0xff, 0x00, 0xfd, 0x3f, 0xdb, 0xfe, 0x74, 0x01, + 0x46, 0xf5, 0xda, 0x4b, 0x4b, 0x47, 0x73, 0x96, + 0x60, 0xec, 0x4f, 0xa9, 0xdc, 0x6a, 0x95, 0x6d, + 0xff, 0x00, 0xc2, 0x3f, 0xff, 0x00, 0x4f, 0xf6, + 0xff, 0x00, 0x9d, 0x1f, 0xf0, 0x8f, 0xff, 0x00, + 0xd3, 0xfd, 0xbf, 0xe7, 0x40, 0x18, 0x94, 0x56, + 0xdf, 0xfc, 0x23, 0xff, 0x00, 0xf4, 0xff, 0x00, + 0x6f, 0xf9, 0xd1, 0xff, 0x00, 0x08, 0xff, 0x00, + 0xfd, 0x3f, 0xdb, 0xfe, 0x74, 0x01, 0x89, 0x45, + 0x6d, 0xff, 0x00, 0xc2, 0x3f, 0xff, 0x00, 0x4f, + 0xf6, 0xff, 0x00, 0x9d, 0x1f, 0xf0, 0x8f, 0xff, + 0x00, 0xd3, 0xfd, 0xbf, 0xe7, 0x40, 0x18, 0x94, + 0x56, 0xdf, 0xfc, 0x23, 0xff, 0x00, 0xf4, 0xff, + 0x00, 0x6f, 0xf9, 0xd1, 0xff, 0x00, 0x08, 0xff, + 0x00, 0xfd, 0x3f, 0xdb, 0xfe, 0x74, 0x01, 0x89, + 0x45, 0x6d, 0xff, 0x00, 0xc2, 0x3f, 0xff, 0x00, + 0x4f, 0xf6, 0xff, 0x00, 0x9d, 0x1f, 0xf0, 0x8f, + 0xff, 0x00, 0xd3, 0xfd, 0xbf, 0xe7, 0x40, 0x13, + 0xe9, 0xff, 0x00, 0xf2, 0x04, 0x87, 0xfe, 0xba, + 0x35, 0x3e, 0xa5, 0x5b, 0x5f, 0xb1, 0xe9, 0xb1, + 0x43, 0xe6, 0xac, 0x9f, 0x3b, 0x1d, 0xcb, 0xd2, + 0xa2, 0xa0, 0x0b, 0x4d, 0xfe, 0xaa, 0x1f, 0xf7, + 0x93, 0xf9, 0x8a, 0x28, 0x6f, 0xf5, 0x50, 0xff, + 0x00, 0xbc, 0x9f, 0xcc, 0x51, 0x40, 0x0e, 0x8b, + 0xa3, 0xff, 0x00, 0xd7, 0x46, 0xfe, 0x66, 0x9f, + 0x51, 0xc5, 0xfc, 0x7f, 0xf5, 0xd1, 0xbf, 0x99, + 0xa9, 0x28, 0x00, 0xa2, 0x8a, 0x28, 0x00, 0xa2, + 0x8a, 0x28, 0x00, 0xa2, 0x8a, 0x28, 0x00, 0xa2, + 0x8a, 0x28, 0x00, 0xa2, 0x8a, 0x28, 0x00, 0xa2, + 0x8a, 0x28, 0x00, 0xa2, 0x8a, 0x28, 0x00, 0xa2, + 0x8a, 0x28, 0x00, 0xa2, 0x8a, 0x28, 0x00, 0xa2, + 0x8a, 0x28, 0x00, 0xa2, 0x8a, 0x28, 0x00, 0xa2, + 0x8a, 0x28, 0x00, 0xaa, 0x73, 0x7f, 0xad, 0x6a, + 0xb9, 0x55, 0x59, 0x1a, 0x4b, 0x9d, 0x8b, 0xd4, + 0x9a, 0x00, 0x8a, 0x58, 0xa2, 0xbb, 0xb5, 0xfb, + 0x3c, 0xcc, 0x53, 0x07, 0x72, 0x48, 0x06, 0x76, + 0x9f, 0xf0, 0xaa, 0x3f, 0xd8, 0x6d, 0xff, 0x00, + 0x3f, 0xb0, 0x7e, 0xbf, 0xe1, 0x5a, 0x8d, 0x3d, + 0xb4, 0x24, 0xa2, 0x20, 0x94, 0x8e, 0xae, 0xc7, + 0x8f, 0xc0, 0x52, 0x7d, 0xb2, 0x2f, 0xf9, 0xf6, + 0x8b, 0xf5, 0xac, 0xdd, 0x48, 0xa1, 0x5c, 0xcc, + 0xfe, 0xc3, 0x6f, 0xf9, 0xfd, 0xb7, 0xfd, 0x7f, + 0xc2, 0x8f, 0xec, 0x36, 0xff, 0x00, 0x9f, 0xdb, + 0x7f, 0xd7, 0xfc, 0x2b, 0x4f, 0xed, 0x91, 0x7f, + 0xcf, 0xb4, 0x5f, 0xad, 0x1f, 0x6c, 0x8b, 0xfe, + 0x7d, 0xa2, 0xfd, 0x68, 0xf6, 0xb1, 0x0b, 0x99, + 0x9f, 0xd8, 0x6d, 0xff, 0x00, 0x3f, 0xb6, 0xff, + 0x00, 0xaf, 0xf8, 0x51, 0xfd, 0x86, 0xdf, 0xf3, + 0xfb, 0x6f, 0xfa, 0xff, 0x00, 0x85, 0x69, 0xfd, + 0xb2, 0x2f, 0xf9, 0xf6, 0x8b, 0xf5, 0xa3, 0xed, + 0x91, 0x7f, 0xcf, 0xb4, 0x5f, 0xad, 0x1e, 0xd6, + 0x21, 0x73, 0x33, 0xfb, 0x0d, 0xbf, 0xe7, 0xf6, + 0xdf, 0xf5, 0xff, 0x00, 0x0a, 0x3f, 0xb0, 0xdb, + 0xfe, 0x7f, 0x6d, 0xff, 0x00, 0x5f, 0xf0, 0xad, + 0x3f, 0xb6, 0x45, 0xff, 0x00, 0x3e, 0xd1, 0x7e, + 0xb4, 0x7d, 0xb2, 0x2f, 0xf9, 0xf6, 0x8b, 0xf5, + 0xa3, 0xda, 0xc4, 0x2e, 0x66, 0x7f, 0x61, 0xb7, + 0xfc, 0xfe, 0xdb, 0xfe, 0xbf, 0xe1, 0x47, 0xf6, + 0x1b, 0x7f, 0xcf, 0xed, 0xbf, 0xeb, 0xfe, 0x15, + 0xa7, 0xf6, 0xc8, 0xbf, 0xe7, 0xda, 0x2f, 0xd6, + 0x8f, 0xb6, 0x45, 0xff, 0x00, 0x3e, 0xd1, 0x7e, + 0xb4, 0x7b, 0x58, 0x85, 0xcc, 0xcf, 0xec, 0x36, + 0xff, 0x00, 0x9f, 0xdb, 0x7f, 0xd7, 0xfc, 0x28, + 0xfe, 0xc3, 0x6f, 0xf9, 0xfd, 0xb7, 0xfd, 0x7f, + 0xc2, 0xb4, 0xfe, 0xd9, 0x17, 0xfc, 0xfb, 0x45, + 0xfa, 0xd1, 0xf6, 0xc8, 0xbf, 0xe7, 0xda, 0x2f, + 0xd6, 0x8f, 0x6b, 0x10, 0xb9, 0x9e, 0xfa, 0x44, + 0x92, 0x45, 0x1a, 0x35, 0xe5, 0xb7, 0xee, 0xf2, + 0x01, 0xf9, 0xb3, 0x8e, 0xb8, 0xe9, 0xf5, 0xfc, + 0xe9, 0x9f, 0xd8, 0x6d, 0xff, 0x00, 0x3f, 0xb6, + 0xff, 0x00, 0xaf, 0xf8, 0x56, 0x9f, 0xdb, 0x22, + 0xff, 0x00, 0x9f, 0x68, 0xbf, 0x5a, 0x3e, 0xd9, + 0x17, 0xfc, 0xfb, 0x45, 0xfa, 0xd1, 0xed, 0x62, + 0x17, 0x33, 0x3f, 0xb0, 0xdb, 0xfe, 0x7f, 0x6d, + 0xff, 0x00, 0x5f, 0xf0, 0xa7, 0xc9, 0xa4, 0x49, + 0x22, 0x46, 0x86, 0xf2, 0xd8, 0x2c, 0x63, 0x00, + 0x0d, 0xdf, 0x9f, 0x4a, 0xd0, 0xfb, 0x64, 0x5f, + 0xf3, 0xed, 0x17, 0xeb, 0x47, 0xdb, 0x22, 0xff, + 0x00, 0x9f, 0x68, 0xbf, 0x5a, 0x3d, 0xac, 0x42, + 0xe6, 0x67, 0xf6, 0x1b, 0x7f, 0xcf, 0xed, 0xbf, + 0xeb, 0xfe, 0x14, 0x7f, 0x61, 0xb7, 0xfc, 0xfe, + 0xdb, 0xfe, 0xbf, 0xe1, 0x5a, 0x7f, 0x6c, 0x8b, + 0xfe, 0x7d, 0xa2, 0xfd, 0x68, 0xfb, 0x64, 0x5f, + 0xf3, 0xed, 0x17, 0xeb, 0x47, 0xb5, 0x88, 0x5c, + 0xcc, 0xfe, 0xc3, 0x6f, 0xf9, 0xfd, 0xb7, 0xfd, + 0x7f, 0xc2, 0x8f, 0xec, 0x36, 0xff, 0x00, 0x9f, + 0xdb, 0x7f, 0xd7, 0xfc, 0x2b, 0x4f, 0xed, 0x91, + 0x7f, 0xcf, 0xb4, 0x5f, 0xad, 0x1f, 0x6c, 0x8b, + 0xfe, 0x7d, 0xa2, 0xfd, 0x68, 0xf6, 0xb1, 0x0b, + 0x99, 0x9f, 0xd8, 0x6d, 0xff, 0x00, 0x3f, 0xb6, + 0xff, 0x00, 0xaf, 0xf8, 0x53, 0x93, 0x44, 0x45, + 0x60, 0x66, 0xbc, 0x8c, 0xa7, 0x71, 0x18, 0x24, + 0x9a, 0xd1, 0xfb, 0x64, 0x5f, 0xf3, 0xed, 0x17, + 0xeb, 0x47, 0xdb, 0x61, 0xef, 0x6d, 0x1e, 0x3d, + 0xb3, 0x47, 0xb5, 0x88, 0x5c, 0x6c, 0xae, 0x1c, + 0xa8, 0x45, 0xdb, 0x1a, 0x00, 0xa8, 0xbe, 0x80, + 0x53, 0x2a, 0x66, 0x58, 0xa4, 0x88, 0xcd, 0x06, + 0x40, 0x1c, 0x3a, 0x1e, 0x76, 0xd4, 0x35, 0x69, + 0xdf, 0x54, 0x32, 0x9f, 0x88, 0x3e, 0xed, 0x97, + 0xfd, 0x73, 0x3f, 0xce, 0xb1, 0xab, 0x67, 0xc4, + 0x1f, 0x76, 0xcb, 0xfe, 0xb9, 0x9f, 0xe7, 0x58, + 0xd4, 0xc0, 0x28, 0xa2, 0x8a, 0x00, 0x28, 0xa2, + 0x8a, 0x00, 0x28, 0xa2, 0x8a, 0x00, 0x2a, 0x4b, + 0x78, 0xbc, 0xfb, 0x98, 0xa1, 0xdd, 0xb7, 0xcc, + 0x70, 0xb9, 0xc7, 0x4c, 0x9a, 0x8e, 0xac, 0x69, + 0xff, 0x00, 0xf2, 0x11, 0xb5, 0xff, 0x00, 0xae, + 0xc9, 0xfc, 0xc5, 0x00, 0x36, 0x2b, 0x76, 0x9a, + 0xe4, 0x40, 0x84, 0x64, 0x92, 0x32, 0x7a, 0x00, + 0x3a, 0x9a, 0x92, 0x6b, 0x78, 0x04, 0x46, 0x48, + 0x2e, 0x84, 0xbb, 0x4e, 0x19, 0x59, 0x76, 0x1f, + 0xa8, 0xf5, 0xab, 0x50, 0xdb, 0x4d, 0x6d, 0x78, + 0xc6, 0xe6, 0x36, 0x86, 0x39, 0x43, 0xc6, 0x1d, + 0xc6, 0x00, 0x2c, 0xa4, 0x0a, 0xab, 0x35, 0x8c, + 0xd6, 0xf1, 0x34, 0x93, 0x81, 0x1f, 0x38, 0x55, + 0x27, 0x97, 0xfa, 0x7b, 0x7b, 0xd0, 0x04, 0xd3, + 0x69, 0xf1, 0x2c, 0xd2, 0xc1, 0x15, 0xd1, 0x79, + 0xe3, 0xcf, 0xc8, 0xd1, 0xed, 0xdd, 0x8e, 0xb8, + 0x39, 0x35, 0x9f, 0x5b, 0x73, 0x5b, 0xcb, 0x06, + 0xb1, 0x35, 0xe4, 0xa8, 0x63, 0x81, 0x1d, 0x9f, + 0x73, 0x71, 0xbb, 0xd0, 0x0f, 0x5c, 0xd6, 0x25, + 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, + 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, + 0x00, 0x74, 0x5a, 0x7f, 0xfc, 0x81, 0x21, 0xff, + 0x00, 0xae, 0x8d, 0x4f, 0xa6, 0x69, 0xff, 0x00, + 0xf2, 0x04, 0x87, 0xfe, 0xba, 0x35, 0x3e, 0x80, + 0x2d, 0x37, 0xfa, 0xb8, 0x7f, 0xde, 0x4f, 0xe6, + 0x28, 0xa4, 0x6f, 0xf5, 0x70, 0xff, 0x00, 0xbe, + 0x9f, 0xcc, 0x51, 0x40, 0x0e, 0x8b, 0xfe, 0x5a, + 0x7f, 0xd7, 0x46, 0xfe, 0x74, 0xfa, 0x64, 0x5f, + 0xf2, 0xd3, 0xfe, 0xba, 0x37, 0xf3, 0xa7, 0xd0, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, + 0x01, 0x50, 0xa9, 0xdb, 0x34, 0xcd, 0xdc, 0x46, + 0xc4, 0x7f, 0xdf, 0x35, 0x35, 0x40, 0x79, 0x7b, + 0x8f, 0xfa, 0xe4, 0xff, 0x00, 0xfa, 0x0d, 0x27, + 0xb0, 0x18, 0x3f, 0x68, 0xf7, 0xa3, 0xed, 0x1e, + 0xf5, 0x4f, 0xca, 0x6f, 0x53, 0x47, 0x94, 0xde, + 0xa6, 0xb9, 0x6c, 0x49, 0x73, 0xed, 0x1e, 0xf4, + 0x7d, 0xa3, 0xde, 0xa9, 0xf9, 0x4d, 0xea, 0x68, + 0xf2, 0x9b, 0xd4, 0xd1, 0x60, 0x2e, 0x7d, 0xa3, + 0xde, 0x8f, 0xb4, 0x7b, 0xd5, 0x3f, 0x29, 0xbd, + 0x4d, 0x1e, 0x53, 0x7a, 0x9a, 0x2c, 0x05, 0xcf, + 0xb4, 0x7b, 0xd1, 0xf6, 0x8f, 0x7a, 0xa7, 0xe5, + 0x37, 0xa9, 0xa3, 0xca, 0x6f, 0x53, 0x45, 0x80, + 0xdd, 0x86, 0xd6, 0x16, 0xb3, 0x8a, 0xe6, 0x6b, + 0xd5, 0x84, 0x48, 0x48, 0x00, 0xa6, 0x7a, 0x1f, + 0x5c, 0xd5, 0x7b, 0xd8, 0xa4, 0xb3, 0x95, 0x51, + 0x88, 0x70, 0xe3, 0x28, 0xeb, 0xd1, 0x85, 0x2d, + 0xcc, 0x32, 0x3f, 0x87, 0xec, 0x15, 0x41, 0x24, + 0x3b, 0xf4, 0x1e, 0xe6, 0xb4, 0xad, 0xa2, 0x09, + 0x3e, 0x91, 0x04, 0xff, 0x00, 0xeb, 0x63, 0x8d, + 0xd8, 0x83, 0xdb, 0x23, 0x8f, 0xf3, 0xed, 0x57, + 0xca, 0x98, 0xcc, 0xfb, 0x38, 0x5e, 0x5b, 0xe8, + 0x6d, 0xee, 0x12, 0x48, 0x84, 0x99, 0xea, 0x30, + 0x7a, 0x7b, 0xd4, 0x13, 0x19, 0x22, 0xcb, 0x14, + 0x71, 0x19, 0x24, 0x2b, 0x11, 0xc1, 0xfc, 0x6b, + 0x62, 0xc6, 0x64, 0x92, 0x78, 0x53, 0x17, 0x92, + 0x15, 0x9d, 0x88, 0x92, 0x75, 0x18, 0x53, 0xb4, + 0xe5, 0x72, 0x3f, 0x95, 0x54, 0x66, 0xb8, 0x9b, + 0x4d, 0xd5, 0x16, 0xe5, 0x98, 0x85, 0x91, 0x76, + 0x6e, 0xfe, 0x13, 0xbb, 0xa0, 0xfd, 0x28, 0xe5, + 0x56, 0x02, 0x8f, 0xef, 0xfc, 0xdf, 0x27, 0xc9, + 0x93, 0xcc, 0xeb, 0xb3, 0x69, 0xcf, 0xe5, 0x48, + 0x8d, 0x2b, 0xa1, 0x74, 0x8d, 0xd9, 0x17, 0xab, + 0x05, 0x24, 0x0a, 0xda, 0xf2, 0x9c, 0xf8, 0xa5, + 0xe4, 0x00, 0xed, 0xf2, 0xb3, 0x9f, 0xf8, 0x0e, + 0x2a, 0xa2, 0x9b, 0x88, 0x74, 0xcd, 0x2d, 0x6d, + 0x59, 0x80, 0x69, 0x1b, 0x7e, 0xdf, 0xe2, 0x3b, + 0xba, 0x1f, 0xd6, 0x8e, 0x44, 0x06, 0x74, 0x92, + 0xbc, 0x4e, 0x52, 0x45, 0x64, 0x71, 0xd5, 0x58, + 0x60, 0x8a, 0x4f, 0xb4, 0x7b, 0xd4, 0xba, 0xf4, + 0x6c, 0xda, 0xc5, 0xc1, 0x07, 0xba, 0xff, 0x00, + 0xe8, 0x22, 0xb3, 0xbc, 0xa6, 0xf5, 0x35, 0x0d, + 0x59, 0x88, 0xb9, 0xf6, 0x8f, 0x7a, 0x3e, 0xd1, + 0xef, 0x54, 0xfc, 0xa6, 0xf5, 0x34, 0x79, 0x4d, + 0xea, 0x68, 0xb0, 0x17, 0x3e, 0xd1, 0xef, 0x47, + 0xda, 0x3d, 0xea, 0x9f, 0x94, 0xde, 0xa6, 0x8f, + 0x29, 0xbd, 0x4d, 0x16, 0x02, 0xe7, 0xda, 0x3d, + 0xe8, 0xfb, 0x47, 0xbd, 0x53, 0xf2, 0x9b, 0xd4, + 0xd1, 0xe5, 0x37, 0xa9, 0xa2, 0xc0, 0x6e, 0x68, + 0xf3, 0x79, 0x92, 0x5c, 0xa6, 0x78, 0xf2, 0x09, + 0xfd, 0x45, 0x4f, 0x54, 0x74, 0x04, 0x2b, 0x71, + 0x72, 0x49, 0xff, 0x00, 0x97, 0x76, 0xfe, 0x62, + 0xaf, 0x56, 0xf4, 0xfe, 0x11, 0xa1, 0xf7, 0xf6, + 0xb6, 0x57, 0x11, 0x5a, 0x9b, 0xab, 0xbf, 0x21, + 0x82, 0x70, 0x31, 0xd7, 0x9a, 0xa5, 0xfd, 0x9d, + 0xa4, 0x7f, 0xd0, 0x53, 0xf4, 0xa6, 0xf8, 0x83, + 0xee, 0xd9, 0x7f, 0xd7, 0x33, 0xfc, 0xeb, 0x1a, + 0xb4, 0x19, 0xb7, 0xfd, 0x9d, 0xa4, 0x7f, 0xd0, + 0x53, 0xf4, 0xa3, 0xfb, 0x3b, 0x48, 0xff, 0x00, + 0xa0, 0xa7, 0xe9, 0x58, 0x94, 0x50, 0x06, 0xdf, + 0xf6, 0x76, 0x91, 0xff, 0x00, 0x41, 0x4f, 0xd2, + 0x8f, 0xec, 0xed, 0x23, 0xfe, 0x82, 0x9f, 0xa5, + 0x62, 0x51, 0x40, 0x1b, 0x7f, 0xd9, 0xda, 0x47, + 0xfd, 0x05, 0x3f, 0x4a, 0x3f, 0xb3, 0xb4, 0x8f, + 0xfa, 0x0a, 0x7e, 0x95, 0x9b, 0x65, 0x02, 0xce, + 0xf2, 0x6f, 0xde, 0x56, 0x34, 0x2e, 0x55, 0x3a, + 0x9f, 0x61, 0xf9, 0xd1, 0x24, 0x31, 0x48, 0x37, + 0x5a, 0x6f, 0x38, 0x52, 0xce, 0x8e, 0x46, 0x57, + 0x1e, 0xfd, 0xe8, 0x03, 0x4b, 0xfb, 0x3b, 0x48, + 0xff, 0x00, 0xa0, 0xa7, 0xe9, 0x47, 0xf6, 0x76, + 0x91, 0xff, 0x00, 0x41, 0x4f, 0xd2, 0xb3, 0x63, + 0xb1, 0xb9, 0x95, 0x15, 0xd1, 0x06, 0xd6, 0x19, + 0x04, 0xb8, 0x19, 0xe4, 0x8e, 0xe7, 0xd8, 0xd4, + 0x91, 0x58, 0x48, 0xc9, 0x0b, 0xb0, 0xce, 0xf9, + 0xbc, 0xa3, 0x18, 0x65, 0x0d, 0x9e, 0x3d, 0x7e, + 0xb4, 0x01, 0x7b, 0xfb, 0x3b, 0x48, 0xff, 0x00, + 0xa0, 0xa7, 0xe9, 0x47, 0xf6, 0x76, 0x91, 0xff, + 0x00, 0x41, 0x4f, 0xd2, 0xb2, 0xd2, 0xd2, 0x77, + 0x87, 0xce, 0x58, 0xff, 0x00, 0x77, 0xd7, 0x39, + 0x19, 0xc7, 0x73, 0x8e, 0xb4, 0xeb, 0xbb, 0x56, + 0x82, 0x69, 0xf6, 0x83, 0xe5, 0x47, 0x2b, 0x46, + 0x19, 0x88, 0xc9, 0xc5, 0x00, 0x69, 0x7f, 0x67, + 0x69, 0x1f, 0xf4, 0x14, 0xfd, 0x28, 0xfe, 0xce, + 0xd2, 0x3f, 0xe8, 0x29, 0xfa, 0x55, 0x38, 0x23, + 0xb1, 0x7b, 0x49, 0x25, 0x91, 0x2e, 0x37, 0x44, + 0x17, 0x76, 0xd9, 0x14, 0x03, 0x93, 0xdb, 0x8a, + 0x88, 0xda, 0x3c, 0x9b, 0x5a, 0x08, 0xd8, 0x29, + 0x4d, 0xe4, 0xbb, 0xaf, 0x4d, 0xc4, 0x66, 0x80, + 0x34, 0x7f, 0xb3, 0xb4, 0x8f, 0xfa, 0x0a, 0x7e, + 0x94, 0x7f, 0x67, 0x69, 0x1f, 0xf4, 0x14, 0xfd, + 0x2b, 0x35, 0xec, 0x2e, 0x90, 0x1c, 0xc5, 0xd0, + 0x81, 0x80, 0xc0, 0x9e, 0x7a, 0x71, 0xe9, 0xef, + 0x48, 0xd6, 0x57, 0x29, 0x2c, 0x71, 0x98, 0xfe, + 0x69, 0x1b, 0x6a, 0xe1, 0x81, 0x04, 0xfa, 0x66, + 0x80, 0x34, 0xff, 0x00, 0xb3, 0xb4, 0x8f, 0xfa, + 0x0a, 0x7e, 0x94, 0x7f, 0x67, 0x69, 0x1f, 0xf4, + 0x14, 0xfd, 0x2b, 0x1e, 0x58, 0xde, 0x27, 0x28, + 0xe3, 0x0c, 0x3a, 0x8c, 0xe6, 0x99, 0x40, 0x1b, + 0x7f, 0xd9, 0xda, 0x47, 0xfd, 0x05, 0x3f, 0x4a, + 0x3f, 0xb3, 0xb4, 0x8f, 0xfa, 0x0a, 0x7e, 0x95, + 0x89, 0x45, 0x00, 0x6d, 0xff, 0x00, 0x67, 0x69, + 0x1f, 0xf4, 0x14, 0xfd, 0x28, 0xfe, 0xce, 0xd2, + 0x3f, 0xe8, 0x29, 0xfa, 0x56, 0x25, 0x14, 0x01, + 0xd5, 0x2c, 0x50, 0x41, 0xa6, 0xc4, 0x96, 0xd3, + 0x79, 0xd1, 0xef, 0x63, 0xba, 0xa2, 0xa6, 0x69, + 0xff, 0x00, 0xf2, 0x04, 0x87, 0xfe, 0xba, 0x35, + 0x3e, 0x80, 0x2c, 0x9f, 0xf5, 0x70, 0xff, 0x00, + 0xbe, 0x9f, 0xcc, 0x51, 0x41, 0xff, 0x00, 0x57, + 0x0f, 0xfb, 0xe9, 0xfc, 0xc5, 0x14, 0x00, 0xe8, + 0xbf, 0x8f, 0xfe, 0xba, 0x37, 0xf3, 0x35, 0x25, + 0x47, 0x17, 0xf1, 0xff, 0x00, 0xd7, 0x46, 0xfe, + 0x66, 0xa4, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0x28, 0xa0, 0x02, + 0x8a, 0x28, 0xa0, 0x02, 0xa1, 0x8c, 0x6e, 0xb9, + 0x74, 0xee, 0xea, 0xca, 0x33, 0xea, 0x45, 0x4d, + 0x54, 0xe5, 0x38, 0x99, 0x88, 0x38, 0x34, 0x01, + 0x9e, 0x6d, 0x8a, 0x92, 0x08, 0xc1, 0x1d, 0xa9, + 0x3e, 0xcf, 0xed, 0x57, 0xf5, 0x1d, 0x4a, 0x2b, + 0x79, 0xe3, 0x49, 0x6d, 0xbc, 0xc2, 0xd1, 0x2b, + 0x97, 0x56, 0xda, 0x72, 0x7f, 0x0a, 0xa9, 0xfd, + 0xb1, 0x67, 0xff, 0x00, 0x3e, 0x72, 0x7f, 0xdf, + 0xcf, 0xfe, 0xb5, 0x73, 0x3a, 0x52, 0x15, 0x88, + 0xfe, 0xcf, 0xed, 0x47, 0xd9, 0xfd, 0xaa, 0x4f, + 0xed, 0x8b, 0x3f, 0xf9, 0xf3, 0x93, 0xfe, 0xfe, + 0x7f, 0xf5, 0xa8, 0xfe, 0xd8, 0xb3, 0xff, 0x00, + 0x9f, 0x39, 0x3f, 0xef, 0xe7, 0xff, 0x00, 0x5a, + 0x8f, 0x65, 0x21, 0x58, 0x8f, 0xec, 0xfe, 0xd4, + 0x7d, 0x9f, 0xda, 0xa4, 0xfe, 0xd8, 0xb3, 0xff, + 0x00, 0x9f, 0x39, 0x3f, 0xef, 0xe7, 0xff, 0x00, + 0x5a, 0x8f, 0xed, 0x8b, 0x3f, 0xf9, 0xf3, 0x93, + 0xfe, 0xfe, 0x7f, 0xf5, 0xa8, 0xf6, 0x52, 0x0b, + 0x11, 0xfd, 0x9f, 0xda, 0x8f, 0xb3, 0xfb, 0x54, + 0x9f, 0xdb, 0x16, 0x7f, 0xf3, 0xe7, 0x27, 0xfd, + 0xfc, 0xff, 0x00, 0xeb, 0x51, 0xfd, 0xb1, 0x67, + 0xff, 0x00, 0x3e, 0x72, 0x7f, 0xdf, 0xcf, 0xfe, + 0xb5, 0x1e, 0xca, 0x41, 0x62, 0x78, 0x6e, 0x6e, + 0xed, 0xe2, 0x11, 0x45, 0x2e, 0xd4, 0x1d, 0x06, + 0xd1, 0xfe, 0x15, 0x0b, 0x09, 0x5a, 0x6f, 0x39, + 0x9d, 0x8c, 0x99, 0xce, 0xec, 0xf2, 0x29, 0x3f, + 0xb6, 0x2c, 0xff, 0x00, 0xe7, 0xce, 0x4f, 0xfb, + 0xf9, 0xff, 0x00, 0xd6, 0xa3, 0xfb, 0x62, 0xcf, + 0xfe, 0x7c, 0xe4, 0xff, 0x00, 0xbf, 0x9f, 0xfd, + 0x6a, 0x7e, 0xce, 0x63, 0xb1, 0x3b, 0x5c, 0xde, + 0x3c, 0x89, 0x23, 0x4c, 0x4b, 0x27, 0xdd, 0xe0, + 0x71, 0xf8, 0x53, 0x26, 0x92, 0xe6, 0x78, 0x84, + 0x52, 0xca, 0x59, 0x07, 0x63, 0x51, 0xff, 0x00, + 0x6c, 0x59, 0xff, 0x00, 0xcf, 0x9c, 0x9f, 0xf7, + 0xf3, 0xff, 0x00, 0xad, 0x47, 0xf6, 0xc5, 0x9f, + 0xfc, 0xf9, 0xc9, 0xff, 0x00, 0x7f, 0x3f, 0xfa, + 0xd4, 0x72, 0x4c, 0x2c, 0x4e, 0xb7, 0x57, 0x8a, + 0x10, 0x09, 0x8e, 0x13, 0x85, 0xe0, 0x54, 0xd6, + 0x4c, 0x91, 0xdb, 0x88, 0xcd, 0xd4, 0x91, 0x7c, + 0xd9, 0x65, 0x0b, 0x90, 0x47, 0xb7, 0xa5, 0x52, + 0xfe, 0xd8, 0xb3, 0xff, 0x00, 0x9f, 0x39, 0x3f, + 0xef, 0xe7, 0xff, 0x00, 0x5a, 0x8f, 0xed, 0x8b, + 0x3f, 0xf9, 0xf3, 0x93, 0xfe, 0xfe, 0x7f, 0xf5, + 0xa9, 0xa8, 0x4d, 0x06, 0xa3, 0xef, 0x47, 0xda, + 0x6e, 0xe4, 0x9b, 0x18, 0x0c, 0x78, 0xcd, 0x41, + 0xf6, 0x7f, 0x6a, 0x93, 0xfb, 0x62, 0xcf, 0xfe, + 0x7c, 0xe4, 0xff, 0x00, 0xbf, 0x9f, 0xfd, 0x6a, + 0x3f, 0xb6, 0x2c, 0xff, 0x00, 0xe7, 0xce, 0x4f, + 0xfb, 0xf9, 0xff, 0x00, 0xd6, 0xa9, 0x74, 0xe4, + 0xc2, 0xc4, 0x7f, 0x67, 0xf6, 0xa3, 0xec, 0xfe, + 0xd5, 0x27, 0xf6, 0xc5, 0x9f, 0xfc, 0xf9, 0xc9, + 0xff, 0x00, 0x7f, 0x3f, 0xfa, 0xd4, 0x7f, 0x6c, + 0x59, 0xff, 0x00, 0xcf, 0x9c, 0x9f, 0xf7, 0xf3, + 0xff, 0x00, 0xad, 0x47, 0xb2, 0x90, 0xac, 0x47, + 0xf6, 0x7f, 0x6a, 0x3e, 0xcf, 0xed, 0x52, 0x7f, + 0x6c, 0x59, 0xff, 0x00, 0xcf, 0x9c, 0x9f, 0xf7, + 0xf3, 0xff, 0x00, 0xad, 0x47, 0xf6, 0xc5, 0x9f, + 0xfc, 0xf9, 0xc9, 0xff, 0x00, 0x7f, 0x3f, 0xfa, + 0xd4, 0x7b, 0x29, 0x05, 0x88, 0xfe, 0xcf, 0xed, + 0x47, 0xd9, 0xfd, 0xaa, 0x4f, 0xed, 0x8b, 0x3f, + 0xf9, 0xf3, 0x93, 0xfe, 0xfe, 0x7f, 0xf5, 0xa8, + 0x3a, 0xcd, 0xa8, 0xe4, 0x59, 0x39, 0xf6, 0x32, + 0xff, 0x00, 0xf5, 0xa8, 0xf6, 0x52, 0x0b, 0x16, + 0xb4, 0xe8, 0x7c, 0xa5, 0xb8, 0x98, 0x8c, 0x2f, + 0x96, 0x53, 0xea, 0x4d, 0x15, 0x22, 0x5c, 0x9b, + 0xad, 0x36, 0x19, 0x0a, 0x2c, 0x60, 0xbb, 0x00, + 0xab, 0xd0, 0x54, 0x75, 0xbc, 0x63, 0xca, 0xac, + 0x51, 0x4f, 0xc4, 0x1f, 0x76, 0xcb, 0xfe, 0xb9, + 0x1f, 0xe7, 0x58, 0xd5, 0xd1, 0xea, 0xab, 0x63, + 0x22, 0xda, 0x8b, 0xa9, 0xa5, 0x8d, 0x84, 0x7c, + 0x04, 0x4c, 0xe4, 0x66, 0xb3, 0xbc, 0x9d, 0x1f, + 0xfe, 0x7f, 0x2e, 0x3f, 0xef, 0xd5, 0x50, 0x19, + 0xb4, 0x56, 0x97, 0x93, 0xa3, 0xff, 0x00, 0xcf, + 0xe5, 0xc7, 0xfd, 0xfa, 0xa3, 0xc9, 0xd1, 0xff, + 0x00, 0xe7, 0xf2, 0xe3, 0xfe, 0xfd, 0x50, 0x06, + 0x6d, 0x15, 0xa5, 0xe4, 0xe8, 0xff, 0x00, 0xf3, + 0xf9, 0x71, 0xff, 0x00, 0x7e, 0xa8, 0xf2, 0x74, + 0x7f, 0xf9, 0xfc, 0xb8, 0xff, 0x00, 0xbf, 0x54, + 0x01, 0x56, 0xcc, 0x13, 0x29, 0x2b, 0x70, 0x20, + 0x91, 0x46, 0x51, 0x89, 0xc0, 0x27, 0xd3, 0x3d, + 0xaa, 0xfb, 0xce, 0x05, 0xc5, 0xa1, 0x99, 0xe3, + 0x96, 0x72, 0xcc, 0xb2, 0xb4, 0x58, 0x39, 0x43, + 0x81, 0x82, 0x47, 0x04, 0xf5, 0xa8, 0xbc, 0x9d, + 0x1f, 0xfe, 0x7f, 0x2e, 0x3f, 0xef, 0xd5, 0x49, + 0x0f, 0xf6, 0x5c, 0x12, 0x79, 0x91, 0x5e, 0xce, + 0xaf, 0xd8, 0xf9, 0x40, 0xe2, 0x80, 0x1c, 0x5c, + 0x79, 0xd2, 0x5b, 0x86, 0xb7, 0x92, 0x18, 0x8a, + 0xc6, 0x52, 0x56, 0xdb, 0x9d, 0xa3, 0x1b, 0x81, + 0xfa, 0xe7, 0xf3, 0xa4, 0xb7, 0x68, 0x16, 0x48, + 0x36, 0x4c, 0x9e, 0x5c, 0x57, 0xa5, 0xb2, 0xec, + 0x01, 0xda, 0x76, 0xe0, 0xfe, 0x95, 0x17, 0x93, + 0xa4, 0x7f, 0xcf, 0xe5, 0xc7, 0xfd, 0xfb, 0xa3, + 0xc9, 0xd1, 0xff, 0x00, 0xe7, 0xf2, 0xe3, 0xfe, + 0xfd, 0x50, 0x02, 0x30, 0x49, 0x61, 0x82, 0x51, + 0x70, 0x91, 0x88, 0xa2, 0x28, 0xcb, 0xbb, 0xe6, + 0xce, 0x4f, 0x00, 0x7b, 0xe7, 0xf9, 0xd3, 0xf5, + 0x79, 0x62, 0xb9, 0x77, 0x92, 0x26, 0x41, 0xe5, + 0xca, 0xc9, 0xb0, 0x36, 0x43, 0x02, 0x49, 0x0c, + 0x3d, 0x73, 0xdf, 0xf0, 0xa6, 0xf9, 0x3a, 0x3f, + 0xfc, 0xfe, 0x5c, 0x7f, 0xdf, 0xaa, 0x3c, 0x9d, + 0x1f, 0xfe, 0x7f, 0x2e, 0x3f, 0xef, 0xd5, 0x00, + 0x57, 0x81, 0x94, 0x58, 0xdd, 0x29, 0x60, 0x19, + 0xb6, 0x60, 0x13, 0xc9, 0xe6, 0xac, 0x79, 0xb1, + 0xfd, 0x87, 0x6f, 0x98, 0xbb, 0xbe, 0xc9, 0xb7, + 0x19, 0xe7, 0x3e, 0x6e, 0x71, 0xf9, 0x51, 0xe4, + 0xe8, 0xff, 0x00, 0xf3, 0xf9, 0x71, 0xff, 0x00, + 0x7e, 0xa8, 0xf2, 0x74, 0x7f, 0xf9, 0xfc, 0xb8, + 0xff, 0x00, 0xbf, 0x54, 0x01, 0x62, 0xd6, 0xea, + 0x18, 0xaf, 0x9a, 0x47, 0x91, 0x76, 0x08, 0x21, + 0x19, 0xcf, 0x71, 0xb3, 0x3f, 0x96, 0x0f, 0xe5, + 0x4c, 0x49, 0x12, 0x2b, 0x9b, 0x44, 0x22, 0xd6, + 0x34, 0x17, 0x01, 0xcf, 0x95, 0x29, 0x6f, 0x4e, + 0x49, 0x24, 0xe2, 0xa2, 0xf2, 0x74, 0x7f, 0xf9, + 0xfc, 0xb8, 0xff, 0x00, 0xbf, 0x54, 0x79, 0x3a, + 0x3f, 0xfc, 0xfe, 0x5c, 0x7f, 0xdf, 0xaa, 0x00, + 0xce, 0x63, 0x96, 0x24, 0x9a, 0x4a, 0xd2, 0xf2, + 0x74, 0x7f, 0xf9, 0xfc, 0xb8, 0xff, 0x00, 0xbf, + 0x54, 0x79, 0x3a, 0x3f, 0xfc, 0xfe, 0x5c, 0x7f, + 0xdf, 0xaa, 0x00, 0xcd, 0xa2, 0xb4, 0xbc, 0x9d, + 0x1f, 0xfe, 0x7f, 0x2e, 0x3f, 0xef, 0xd5, 0x1e, + 0x4e, 0x8f, 0xff, 0x00, 0x3f, 0x97, 0x1f, 0xf7, + 0xea, 0x80, 0x33, 0x68, 0xad, 0x2f, 0x27, 0x47, + 0xff, 0x00, 0x9f, 0xcb, 0x8f, 0xfb, 0xf5, 0x47, + 0x93, 0xa3, 0xff, 0x00, 0xcf, 0xe5, 0xc7, 0xfd, + 0xfa, 0xa0, 0x0d, 0x0d, 0x3f, 0xfe, 0x40, 0x90, + 0xff, 0x00, 0xd7, 0x56, 0xa7, 0xd3, 0xed, 0xbe, + 0xcc, 0x34, 0x85, 0x5b, 0x59, 0x1e, 0x44, 0x59, + 0x88, 0xcb, 0xae, 0x0e, 0x71, 0x9f, 0xeb, 0x4c, + 0xa0, 0x0b, 0x2d, 0xfe, 0xae, 0x1f, 0xf7, 0xd3, + 0xf9, 0x8a, 0x29, 0x5b, 0xfd, 0x5c, 0x3f, 0xef, + 0xa7, 0xf3, 0x14, 0x50, 0x03, 0xa2, 0xe8, 0xff, + 0x00, 0xf5, 0xd1, 0xbf, 0x99, 0xa9, 0x2a, 0x38, + 0x7a, 0x3f, 0xfd, 0x74, 0x6f, 0xe6, 0x6a, 0x4a, + 0x00, 0x28, 0xa2, 0x8a, 0x00, 0x28, 0xa2, 0x8a, + 0x00, 0x28, 0xa2, 0x8a, 0x00, 0x28, 0xa2, 0x8a, + 0x00, 0x28, 0xa2, 0x8a, 0x00, 0x28, 0xa2, 0x8a, + 0x00, 0x28, 0xa2, 0x8a, 0x00, 0x28, 0xa2, 0x8a, + 0x00, 0x28, 0xa2, 0x8a, 0x00, 0x28, 0xa2, 0x8a, + 0x00, 0x28, 0xa2, 0x8a, 0x00, 0x28, 0xa2, 0x8a, + 0x00, 0x2a, 0x94, 0xdf, 0xeb, 0x5a, 0xae, 0xd5, + 0x29, 0xff, 0x00, 0xd7, 0x35, 0x00, 0x65, 0xeb, + 0xff, 0x00, 0xf1, 0xf7, 0x07, 0xfd, 0x7b, 0xa5, + 0x65, 0xd6, 0xb6, 0xbc, 0x8c, 0x64, 0xb7, 0x9b, + 0x92, 0x8d, 0x10, 0x50, 0x7d, 0xc7, 0x51, 0x59, + 0x34, 0x00, 0x51, 0x45, 0x14, 0x00, 0x55, 0xed, + 0x2d, 0x19, 0x9a, 0xe3, 0x64, 0x2b, 0x34, 0x8b, + 0x09, 0x28, 0xa5, 0x37, 0xf3, 0xb9, 0x7b, 0x55, + 0x1a, 0x9e, 0xda, 0x75, 0x85, 0x2e, 0x01, 0xdd, + 0x99, 0x22, 0xd8, 0xb8, 0xf5, 0xc8, 0x3f, 0xd2, + 0x80, 0x2f, 0x4d, 0x6a, 0xd3, 0x47, 0x0f, 0x9f, + 0x12, 0x5a, 0xcd, 0x97, 0x2d, 0x88, 0xf6, 0xfc, + 0x80, 0x67, 0x25, 0x7f, 0x3f, 0xad, 0x55, 0x36, + 0x88, 0x65, 0x84, 0x24, 0xc4, 0xc5, 0x28, 0x38, + 0x7d, 0x87, 0x3c, 0x76, 0xdb, 0xeb, 0xfe, 0x35, + 0x2c, 0x17, 0xeb, 0x1f, 0x92, 0xed, 0xe6, 0x79, + 0xa8, 0xad, 0x1b, 0x3a, 0xf5, 0xd8, 0x47, 0x07, + 0x3e, 0xa2, 0x97, 0xed, 0xe9, 0xf6, 0x95, 0x66, + 0x9a, 0xe6, 0x55, 0xf2, 0xd9, 0x37, 0xb9, 0xf9, + 0x86, 0x46, 0x32, 0x06, 0x7f, 0xad, 0x00, 0x2b, + 0xd9, 0x7d, 0x9e, 0x1b, 0x82, 0xc0, 0xb0, 0x30, + 0x07, 0x43, 0x24, 0x7b, 0x59, 0x7f, 0x78, 0xa3, + 0xa7, 0x6e, 0xff, 0x00, 0x9d, 0x41, 0x0c, 0x30, + 0xb5, 0x8c, 0xd2, 0xbb, 0x30, 0x95, 0x24, 0x45, + 0x5f, 0x97, 0x23, 0x9c, 0xfb, 0xfb, 0x7e, 0x95, + 0x33, 0xde, 0xc0, 0x2d, 0x4c, 0x51, 0x89, 0x43, + 0x08, 0xfc, 0xb0, 0x48, 0x1f, 0xdf, 0x0d, 0x9e, + 0xbf, 0x5a, 0x88, 0x5e, 0x99, 0x60, 0x99, 0x6e, + 0x64, 0x95, 0xe4, 0x62, 0x8c, 0xad, 0xd7, 0xee, + 0xe7, 0x83, 0xff, 0x00, 0x7d, 0x50, 0x04, 0xef, + 0xa7, 0x2b, 0xdc, 0x32, 0xbc, 0xe1, 0x59, 0xee, + 0x1e, 0x15, 0x0b, 0x1f, 0x19, 0x18, 0xf7, 0xe0, + 0x73, 0xf8, 0x54, 0x22, 0xc1, 0x5f, 0xcb, 0x64, + 0x9f, 0x31, 0xb6, 0xfd, 0xee, 0x57, 0x1b, 0x76, + 0x8c, 0x9f, 0xaf, 0x5a, 0x95, 0xb5, 0x08, 0x4d, + 0xdc, 0x53, 0x05, 0x7d, 0xab, 0x76, 0xf3, 0x1e, + 0x06, 0x76, 0x92, 0xbf, 0xaf, 0x14, 0xcb, 0x4b, + 0xe5, 0xb7, 0x48, 0x97, 0xe7, 0x05, 0x5a, 0x4d, + 0xc5, 0x78, 0x20, 0x32, 0xa8, 0xe3, 0xdc, 0x62, + 0x80, 0x2b, 0xdc, 0x40, 0xb1, 0x08, 0xde, 0x39, + 0x3c, 0xc8, 0xe4, 0x19, 0x52, 0x57, 0x69, 0xe3, + 0xa8, 0x22, 0xac, 0x2c, 0x9b, 0x74, 0xd8, 0xe5, + 0x11, 0x42, 0x5e, 0x39, 0xb6, 0x82, 0x63, 0x07, + 0x23, 0x6f, 0x7f, 0x5a, 0x8e, 0xee, 0xe4, 0x4d, + 0x2c, 0x67, 0xcc, 0x9a, 0x75, 0x4e, 0xbe, 0x71, + 0xeb, 0xcf, 0xa7, 0x6f, 0xce, 0x8b, 0xa9, 0xed, + 0xcc, 0x02, 0x1b, 0x65, 0x90, 0x21, 0x90, 0xc8, + 0x77, 0xe3, 0x8f, 0x40, 0x28, 0x02, 0xcd, 0xcb, + 0x34, 0xef, 0x6b, 0x6e, 0x91, 0x40, 0x86, 0x64, + 0x42, 0x4a, 0x44, 0xaa, 0x72, 0x4f, 0xa8, 0x14, + 0x4d, 0x04, 0x37, 0x77, 0xb6, 0xa6, 0x14, 0x11, + 0xc3, 0x33, 0xf9, 0x64, 0x28, 0xc6, 0x30, 0x7f, + 0xf8, 0x92, 0x2a, 0x15, 0xbd, 0x44, 0x96, 0x39, + 0x54, 0x38, 0x78, 0xe0, 0xd8, 0xa7, 0xd1, 0xf0, + 0x46, 0x7f, 0x5a, 0x17, 0x52, 0x98, 0xc6, 0x0c, + 0xd2, 0x3c, 0x92, 0xc7, 0x22, 0xc9, 0x13, 0x31, + 0xce, 0x31, 0xd4, 0x7f, 0x2f, 0xca, 0x80, 0x1c, + 0x64, 0x6b, 0x88, 0xa6, 0xf2, 0xf4, 0xe5, 0x30, + 0x80, 0x76, 0xb4, 0x71, 0xf2, 0x9e, 0x84, 0xb7, + 0x7f, 0xc6, 0xb3, 0xeb, 0x40, 0x5c, 0xd9, 0xc4, + 0xcf, 0x34, 0x0b, 0x38, 0x77, 0x56, 0x02, 0x33, + 0x8d, 0x8b, 0x91, 0x8e, 0xbd, 0xfa, 0xd6, 0x7d, + 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, + 0x00, 0x74, 0x56, 0x1f, 0xf2, 0x06, 0x83, 0xfd, + 0xf7, 0xa7, 0xd2, 0x5b, 0xc6, 0xd0, 0x69, 0x76, + 0xd1, 0x38, 0xc3, 0x9d, 0xce, 0x47, 0xa0, 0x3d, + 0x29, 0x68, 0x02, 0x86, 0xbd, 0xf7, 0xad, 0x3f, + 0xeb, 0x8f, 0xfe, 0xcc, 0x6b, 0x26, 0xb6, 0x35, + 0xd4, 0x25, 0x2d, 0x25, 0x03, 0x29, 0xb0, 0xa6, + 0x7d, 0xc1, 0xff, 0x00, 0xeb, 0xd6, 0x3d, 0x00, + 0x14, 0x51, 0x45, 0x00, 0x5f, 0xd3, 0x9d, 0x0c, + 0x91, 0xc3, 0xf6, 0x78, 0xdf, 0x73, 0xe6, 0x57, + 0x90, 0x67, 0x09, 0xfd, 0x31, 0xcf, 0x34, 0xc4, + 0xb3, 0x49, 0x62, 0x79, 0xd2, 0x50, 0x21, 0x4c, + 0xef, 0xc8, 0xe5, 0x7f, 0xbb, 0xf5, 0xcf, 0xf8, + 0xd2, 0xdb, 0xcd, 0x6a, 0xb6, 0x6d, 0x0c, 0x8f, + 0x32, 0x3b, 0xb7, 0xce, 0xd1, 0xa0, 0x39, 0x5e, + 0xc3, 0xa8, 0xa8, 0xd6, 0xf2, 0x48, 0x97, 0xca, + 0x8f, 0x1e, 0x50, 0xdc, 0x0a, 0x91, 0xf7, 0xf3, + 0xfd, 0xef, 0xd3, 0xf2, 0xa0, 0x05, 0xb0, 0x55, + 0x92, 0x77, 0x89, 0x94, 0x13, 0x24, 0x6c, 0xab, + 0x91, 0xd1, 0xb1, 0x91, 0xfa, 0x8a, 0xb6, 0x2c, + 0xe3, 0x96, 0xd6, 0xc5, 0x15, 0x40, 0x90, 0xc8, + 0xa2, 0x42, 0x3a, 0xe1, 0xc9, 0xc7, 0xe8, 0xb5, + 0x9f, 0x6d, 0x2f, 0x91, 0x73, 0x14, 0xc3, 0xf8, + 0x1c, 0x37, 0xeb, 0x57, 0x93, 0x51, 0x89, 0x2e, + 0x6e, 0x5c, 0x23, 0xf9, 0x6d, 0x1e, 0xd8, 0x87, + 0x19, 0x52, 0x06, 0x14, 0x9a, 0x00, 0x2e, 0x2c, + 0x92, 0x55, 0x96, 0xee, 0x36, 0x61, 0x1e, 0x77, + 0x90, 0xb0, 0xe1, 0x02, 0x93, 0xd0, 0x1e, 0xe4, + 0x67, 0xa5, 0x36, 0xe2, 0xca, 0xdd, 0x2e, 0xae, + 0x7f, 0x7c, 0xd1, 0xc1, 0x1c, 0x9e, 0x58, 0x25, + 0x32, 0x77, 0x73, 0xc7, 0x5e, 0x9c, 0x75, 0xa5, + 0x6b, 0xdb, 0x67, 0x59, 0x09, 0x13, 0x6e, 0x92, + 0x11, 0x1e, 0x30, 0x30, 0x98, 0xc7, 0x4e, 0x7d, + 0xa8, 0x9a, 0xee, 0xd2, 0x79, 0x27, 0x0e, 0x26, + 0x11, 0xcb, 0x20, 0x94, 0x10, 0x06, 0x43, 0x73, + 0x91, 0xd7, 0xa7, 0x3d, 0x68, 0x00, 0x4b, 0x48, + 0x64, 0xb6, 0x85, 0x1a, 0x65, 0x46, 0x37, 0x0f, + 0x18, 0x75, 0x5d, 0xdb, 0xbe, 0xee, 0x3f, 0x0f, + 0xf1, 0xa5, 0xb4, 0xb2, 0x8d, 0x26, 0x8c, 0x4d, + 0x20, 0x32, 0x32, 0x3b, 0x08, 0x8a, 0x64, 0x60, + 0x06, 0x1d, 0x7d, 0x78, 0xa8, 0x45, 0xd4, 0x43, + 0xc8, 0x0b, 0x1b, 0x2a, 0xc7, 0x70, 0xd2, 0x6d, + 0xeb, 0x85, 0x3b, 0x70, 0x3f, 0x4a, 0x99, 0x6f, + 0xad, 0x4c, 0xa9, 0x33, 0xac, 0xbe, 0x62, 0x2b, + 0xa0, 0x00, 0x0c, 0x10, 0x77, 0x60, 0xf5, 0xf7, + 0xa0, 0x08, 0x4d, 0x80, 0xda, 0x51, 0x66, 0xcd, + 0xc2, 0xc6, 0x24, 0x31, 0xed, 0xe3, 0x07, 0x1d, + 0xfd, 0x70, 0x68, 0xb8, 0xb1, 0x8e, 0x28, 0xa6, + 0x74, 0xb8, 0xde, 0xd0, 0xb0, 0x47, 0x5d, 0x98, + 0xe7, 0x9e, 0x9c, 0xf4, 0xe2, 0xa4, 0xfb, 0x74, + 0x20, 0xb4, 0xea, 0xb2, 0x7d, 0xa1, 0xa3, 0x08, + 0x41, 0x03, 0x68, 0xe0, 0x02, 0x73, 0xf4, 0x1d, + 0x2a, 0x7b, 0xe4, 0x48, 0xad, 0x6e, 0x9f, 0x64, + 0x88, 0xd3, 0xca, 0xac, 0x37, 0xe3, 0x07, 0xa9, + 0x3b, 0x71, 0xd4, 0x7b, 0xfd, 0x28, 0x02, 0xbe, + 0x9f, 0x36, 0x23, 0x99, 0x0c, 0x30, 0x38, 0x48, + 0x99, 0xc1, 0x78, 0x95, 0x8e, 0x7e, 0xa4, 0x52, + 0xac, 0x02, 0xea, 0xd0, 0xdc, 0xc8, 0xe9, 0x12, + 0xa9, 0x66, 0x21, 0x22, 0x03, 0xa6, 0xc1, 0xdb, + 0x1f, 0xde, 0xff, 0x00, 0x39, 0xaa, 0xb6, 0xd3, + 0x2c, 0x3e, 0x76, 0xe0, 0x4e, 0xf8, 0x99, 0x06, + 0x3d, 0x4d, 0x4d, 0x1d, 0xdc, 0x69, 0xa6, 0xbd, + 0xb1, 0x56, 0xde, 0xdb, 0xb0, 0x7b, 0x72, 0x50, + 0xff, 0x00, 0xec, 0xa6, 0x80, 0x16, 0x5b, 0x05, + 0x45, 0x93, 0xcb, 0x9f, 0xcc, 0x74, 0x55, 0x70, + 0xbb, 0x31, 0x95, 0x6c, 0x63, 0xbf, 0x5f, 0x98, + 0x71, 0x4d, 0x9e, 0xc9, 0x22, 0x59, 0x36, 0x4f, + 0xe6, 0x3c, 0x4c, 0x16, 0x41, 0xb7, 0x18, 0x3e, + 0xc7, 0xbf, 0x34, 0xe3, 0x7a, 0x9b, 0xe5, 0x65, + 0x0d, 0x96, 0x82, 0x38, 0xd7, 0x23, 0xba, 0xec, + 0xff, 0x00, 0xe2, 0x4d, 0x3e, 0xf6, 0xfc, 0x5c, + 0xab, 0x62, 0x6b, 0x96, 0xde, 0xdb, 0x8c, 0x6e, + 0xdf, 0x22, 0xfb, 0x0f, 0x5f, 0xd2, 0x80, 0x2b, + 0x5e, 0xdb, 0xa5, 0xad, 0xcb, 0xc2, 0xb2, 0xf9, + 0x85, 0x09, 0x56, 0x3b, 0x71, 0xce, 0x6a, 0xbd, + 0x4d, 0x79, 0x2a, 0xcf, 0x79, 0x3c, 0xca, 0x08, + 0x59, 0x24, 0x66, 0x00, 0xf5, 0xe4, 0xd4, 0x34, + 0x00, 0x51, 0x45, 0x14, 0x01, 0xbf, 0xa5, 0x7f, + 0xc8, 0x18, 0xff, 0x00, 0xd7, 0xc1, 0xff, 0x00, + 0xd0, 0x45, 0x4d, 0x51, 0xe9, 0xe8, 0xd0, 0xe9, + 0x11, 0x87, 0x18, 0x32, 0xc8, 0x64, 0x51, 0xed, + 0x80, 0x3f, 0xa5, 0x49, 0x40, 0x16, 0x9b, 0xfd, + 0x54, 0x3f, 0xef, 0x27, 0xf3, 0x14, 0x50, 0xdf, + 0xea, 0xa1, 0xff, 0x00, 0x79, 0x3f, 0x98, 0xa2, + 0x80, 0x1d, 0x0f, 0x47, 0xff, 0x00, 0xae, 0x8d, + 0xfc, 0xcd, 0x4b, 0x51, 0xc3, 0xd1, 0xff, 0x00, + 0xeb, 0xa3, 0x7f, 0x33, 0x52, 0x50, 0x01, 0x45, + 0x15, 0x03, 0xdc, 0x28, 0x38, 0x51, 0xba, 0x80, + 0x27, 0xa2, 0xaa, 0xfd, 0xa5, 0xbf, 0xba, 0x28, + 0xfb, 0x4b, 0xff, 0x00, 0x74, 0x50, 0x05, 0xaa, + 0x2a, 0xaf, 0xda, 0x5f, 0xfb, 0xa2, 0x8f, 0xb4, + 0xbf, 0xf7, 0x45, 0x00, 0x5a, 0xa2, 0xaa, 0xfd, + 0xa5, 0xff, 0x00, 0xba, 0x28, 0xfb, 0x4b, 0xff, + 0x00, 0x74, 0x50, 0x05, 0xaa, 0x2a, 0xaf, 0xda, + 0x5f, 0xfb, 0xa2, 0x8f, 0xb4, 0xbf, 0xf7, 0x45, + 0x00, 0x5a, 0xa2, 0xaa, 0xfd, 0xa5, 0xff, 0x00, + 0xba, 0x28, 0xfb, 0x4b, 0xff, 0x00, 0x74, 0x50, + 0x05, 0xaa, 0x2a, 0xaf, 0xda, 0x5f, 0xfb, 0xa2, + 0x8f, 0xb4, 0xbf, 0xf7, 0x45, 0x00, 0x5a, 0xa2, + 0xaa, 0xfd, 0xa5, 0xff, 0x00, 0xba, 0x28, 0xfb, + 0x4b, 0xff, 0x00, 0x74, 0x50, 0x05, 0xaa, 0x2a, + 0xaf, 0xda, 0x5f, 0xfb, 0xa2, 0x8f, 0xb4, 0xbf, + 0xf7, 0x45, 0x00, 0x5a, 0xa2, 0xaa, 0xfd, 0xa5, + 0xff, 0x00, 0xba, 0x28, 0xfb, 0x4b, 0xff, 0x00, + 0x74, 0x50, 0x05, 0xaa, 0x2a, 0xaf, 0xda, 0x5f, + 0xfb, 0xa2, 0x8f, 0xb4, 0xbf, 0xf7, 0x45, 0x00, + 0x5a, 0xa2, 0xaa, 0xfd, 0xa5, 0xff, 0x00, 0xba, + 0x28, 0xfb, 0x4b, 0xff, 0x00, 0x74, 0x50, 0x05, + 0xaa, 0xa3, 0x3f, 0xfa, 0xe6, 0xa9, 0x3e, 0xd2, + 0xff, 0x00, 0xdd, 0x15, 0x0b, 0xb6, 0xf6, 0x2c, + 0x7b, 0xd0, 0x02, 0x87, 0x53, 0x1b, 0x45, 0x2c, + 0x6b, 0x2c, 0x4d, 0xd5, 0x1b, 0xfa, 0x7a, 0x54, + 0x3f, 0x62, 0xd3, 0x49, 0xcf, 0xd9, 0xe4, 0x1e, + 0xc2, 0x5a, 0x92, 0x8a, 0x00, 0x8f, 0xec, 0x3a, + 0x6f, 0xfc, 0xfb, 0xcb, 0xff, 0x00, 0x7f, 0x68, + 0xfb, 0x0e, 0x9b, 0xff, 0x00, 0x3e, 0xf2, 0xff, + 0x00, 0xdf, 0xda, 0x92, 0x8a, 0x00, 0x8f, 0xec, + 0x3a, 0x6f, 0xfc, 0xfb, 0xcb, 0xff, 0x00, 0x7f, + 0x68, 0xfb, 0x0e, 0x9b, 0xff, 0x00, 0x3e, 0xf2, + 0xff, 0x00, 0xdf, 0xda, 0x92, 0x8a, 0x00, 0x8f, + 0xec, 0x3a, 0x6f, 0xfc, 0xfb, 0xcb, 0xff, 0x00, + 0x7f, 0x68, 0xfb, 0x0e, 0x9b, 0xff, 0x00, 0x3e, + 0xf2, 0xff, 0x00, 0xdf, 0xda, 0x92, 0x8a, 0x00, + 0x8f, 0xec, 0x3a, 0x6f, 0xfc, 0xfb, 0xcb, 0xff, + 0x00, 0x7f, 0x68, 0xfb, 0x0e, 0x9b, 0xff, 0x00, + 0x3e, 0xf2, 0xff, 0x00, 0xdf, 0xda, 0x92, 0x8a, + 0x00, 0x8f, 0xec, 0x3a, 0x6f, 0xfc, 0xfb, 0xcb, + 0xff, 0x00, 0x7f, 0x68, 0xfb, 0x0e, 0x9b, 0xff, + 0x00, 0x3e, 0xf2, 0xff, 0x00, 0xdf, 0xda, 0x92, + 0x8a, 0x00, 0x8f, 0xec, 0x3a, 0x6f, 0xfc, 0xfb, + 0xcb, 0xff, 0x00, 0x7f, 0x68, 0xfb, 0x0e, 0x9b, + 0xff, 0x00, 0x3e, 0xf2, 0xff, 0x00, 0xdf, 0xda, + 0x92, 0x8a, 0x00, 0x8f, 0xec, 0x3a, 0x6f, 0xfc, + 0xfb, 0xcb, 0xff, 0x00, 0x7f, 0x68, 0xfb, 0x0e, + 0x9b, 0xff, 0x00, 0x3e, 0xf2, 0xff, 0x00, 0xdf, + 0xda, 0x92, 0x8a, 0x00, 0x8f, 0xec, 0x3a, 0x6f, + 0xfc, 0xfb, 0xcb, 0xff, 0x00, 0x7f, 0x68, 0xfb, + 0x0e, 0x9b, 0xff, 0x00, 0x3e, 0xf2, 0xff, 0x00, + 0xdf, 0xda, 0x92, 0x8a, 0x00, 0x8f, 0xec, 0x3a, + 0x6f, 0xfc, 0xfb, 0xcb, 0xff, 0x00, 0x7f, 0x68, + 0xfb, 0x0e, 0x9b, 0xff, 0x00, 0x3e, 0xf2, 0xff, + 0x00, 0xdf, 0xda, 0x92, 0x8a, 0x00, 0x8f, 0xec, + 0x3a, 0x6f, 0xfc, 0xfb, 0xcb, 0xff, 0x00, 0x7f, + 0x69, 0xf1, 0xdb, 0xd8, 0x42, 0xc1, 0xe2, 0xb5, + 0xcb, 0x8e, 0x86, 0x47, 0x2c, 0x07, 0xe1, 0x4b, + 0x45, 0x00, 0x3a, 0x47, 0x69, 0x1c, 0xbb, 0x9c, + 0xb1, 0xef, 0x4d, 0xa2, 0x8a, 0x00, 0x7a, 0xb2, + 0x18, 0x9a, 0x19, 0xa3, 0x12, 0xc2, 0xdd, 0x54, + 0xff, 0x00, 0x31, 0xe8, 0x6a, 0xb1, 0xd3, 0x34, + 0xd2, 0x72, 0x1a, 0xe9, 0x7d, 0xb2, 0xa6, 0xa6, + 0xa2, 0x80, 0x20, 0xfe, 0xcb, 0xd3, 0x7f, 0xe7, + 0xa5, 0xd7, 0xfe, 0x3b, 0x47, 0xf6, 0x5e, 0x9b, + 0xff, 0x00, 0x3d, 0x2e, 0xbf, 0xf1, 0xda, 0x9e, + 0x8a, 0x00, 0x83, 0xfb, 0x2f, 0x4d, 0xff, 0x00, + 0x9e, 0x97, 0x5f, 0xf8, 0xed, 0x1f, 0xd9, 0x7a, + 0x6f, 0xfc, 0xf4, 0xba, 0xff, 0x00, 0xc7, 0x6a, + 0x7a, 0x28, 0x02, 0x0f, 0xec, 0xbd, 0x37, 0xfe, + 0x7a, 0x5d, 0x7f, 0xe3, 0xb4, 0x7f, 0x65, 0xe9, + 0xbf, 0xf3, 0xd2, 0xeb, 0xff, 0x00, 0x1d, 0xa9, + 0xe8, 0xa0, 0x08, 0x3f, 0xb2, 0xf4, 0xdf, 0xf9, + 0xe9, 0x75, 0xff, 0x00, 0x8e, 0xd1, 0xfd, 0x97, + 0xa6, 0xff, 0x00, 0xcf, 0x4b, 0xaf, 0xfc, 0x76, + 0xa7, 0xa2, 0x80, 0x20, 0xfe, 0xcb, 0xd3, 0x7f, + 0xe7, 0xa5, 0xd7, 0xfe, 0x3b, 0x47, 0xf6, 0x5e, + 0x9b, 0xff, 0x00, 0x3d, 0x2e, 0xbf, 0xf1, 0xda, + 0x9e, 0x8a, 0x00, 0x83, 0xfb, 0x2f, 0x4d, 0xff, + 0x00, 0x9e, 0x97, 0x5f, 0xf8, 0xed, 0x1f, 0xd9, + 0x7a, 0x6f, 0xfc, 0xf4, 0xba, 0xff, 0x00, 0xc7, + 0x6a, 0x7a, 0x28, 0x02, 0x0f, 0xec, 0xbd, 0x37, + 0xfe, 0x7a, 0x5d, 0x7f, 0xe3, 0xb4, 0x7f, 0x65, + 0xe9, 0xbf, 0xf3, 0xd2, 0xeb, 0xff, 0x00, 0x1d, + 0xa9, 0xe8, 0xa0, 0x08, 0x3f, 0xb2, 0xf4, 0xdf, + 0xf9, 0xe9, 0x75, 0xff, 0x00, 0x8e, 0xd1, 0xfd, + 0x97, 0xa6, 0xff, 0x00, 0xcf, 0x4b, 0xaf, 0xfc, + 0x76, 0xa7, 0xa2, 0x80, 0x20, 0xfe, 0xcb, 0xd3, + 0x7f, 0xe7, 0xa5, 0xd7, 0xfe, 0x3b, 0x47, 0xf6, + 0x5e, 0x9b, 0xff, 0x00, 0x3d, 0x2e, 0xbf, 0xf1, + 0xda, 0x9e, 0x8a, 0x00, 0x83, 0xfb, 0x2f, 0x4d, + 0xff, 0x00, 0x9e, 0x97, 0x5f, 0xf8, 0xed, 0x3a, + 0x3d, 0x3f, 0x4d, 0x89, 0x83, 0x04, 0x9e, 0x52, + 0x3f, 0x86, 0x46, 0x00, 0x7e, 0x95, 0x2d, 0x14, + 0x00, 0xe9, 0x64, 0x69, 0x5f, 0x73, 0x60, 0x76, + 0x00, 0x74, 0x03, 0xd2, 0x9b, 0x45, 0x14, 0x01, + 0x69, 0xbf, 0xd5, 0x43, 0xfe, 0xf2, 0x7f, 0x31, + 0x45, 0x2b, 0x7f, 0xaa, 0x87, 0xfd, 0xe4, 0xfe, + 0x62, 0x8a, 0x00, 0x74, 0x3d, 0x1f, 0xfe, 0xba, + 0x37, 0xf3, 0x35, 0x25, 0x47, 0x07, 0x47, 0xff, + 0x00, 0xae, 0x8d, 0xfc, 0xcd, 0x4b, 0x40, 0x15, + 0xae, 0x9c, 0x8c, 0x20, 0xfc, 0x69, 0x9b, 0x61, + 0x85, 0x55, 0xa7, 0xc9, 0x66, 0x19, 0x54, 0x07, + 0x1c, 0x7a, 0x9a, 0x6d, 0xc7, 0xfa, 0xe6, 0xaa, + 0x3a, 0xbc, 0xfb, 0x35, 0x29, 0x93, 0x3c, 0x2e, + 0x00, 0xfc, 0x85, 0x44, 0xe4, 0xd2, 0xd0, 0x4c, + 0xbf, 0xf6, 0x9b, 0x5f, 0xf9, 0xf5, 0x1f, 0xf7, + 0xf0, 0xd1, 0xf6, 0x9b, 0x5f, 0xf9, 0xf5, 0x1f, + 0xf7, 0xf0, 0xd6, 0x27, 0xda, 0x3d, 0xea, 0xcd, + 0x94, 0x6f, 0x78, 0xee, 0x03, 0xaa, 0x22, 0x0d, + 0xce, 0xed, 0xd1, 0x45, 0x60, 0xa5, 0x37, 0xd4, + 0x46, 0x97, 0xda, 0x6d, 0x7f, 0xe7, 0xd4, 0x7f, + 0xdf, 0xc3, 0x47, 0xda, 0x6d, 0x7f, 0xe7, 0xd4, + 0x7f, 0xdf, 0xc3, 0x54, 0xae, 0x2d, 0xc4, 0x76, + 0xc6, 0xe2, 0xde, 0xe5, 0x2e, 0x23, 0x53, 0x87, + 0x2a, 0x30, 0x56, 0xaa, 0xe6, 0x6f, 0x2b, 0xcd, + 0xf2, 0xa4, 0xf2, 0xff, 0x00, 0xbf, 0xb4, 0xe3, + 0xf3, 0xa6, 0xe5, 0x34, 0x1a, 0x9a, 0xff, 0x00, + 0x69, 0xb5, 0xff, 0x00, 0x9f, 0x51, 0xff, 0x00, + 0x7f, 0x0d, 0x1f, 0x69, 0xb5, 0xff, 0x00, 0x9f, + 0x51, 0xff, 0x00, 0x7f, 0x0d, 0x64, 0x81, 0x70, + 0xd8, 0xc4, 0x32, 0x9c, 0xae, 0xe1, 0x84, 0x3d, + 0x3d, 0x7e, 0x95, 0x24, 0x70, 0xcf, 0x25, 0x9c, + 0x97, 0x4a, 0x8c, 0x51, 0x0f, 0x65, 0x3c, 0xfa, + 0x9f, 0xc2, 0x8e, 0x69, 0x81, 0xa5, 0xf6, 0x9b, + 0x5f, 0xf9, 0xf5, 0x1f, 0xf7, 0xf0, 0xd1, 0xf6, + 0x9b, 0x5f, 0xf9, 0xf5, 0x1f, 0xf7, 0xf0, 0xd6, + 0x43, 0x99, 0xa3, 0x04, 0xc9, 0x14, 0x88, 0x01, + 0xc1, 0x2c, 0xa4, 0x60, 0xd0, 0xe6, 0x64, 0x8c, + 0x48, 0xf1, 0x48, 0xa8, 0x7a, 0x31, 0x52, 0x01, + 0xa5, 0xcd, 0x30, 0x35, 0xfe, 0xd3, 0x6b, 0xff, + 0x00, 0x3e, 0xa3, 0xfe, 0xfe, 0x1a, 0x3e, 0xd3, + 0x6b, 0xff, 0x00, 0x3e, 0xa3, 0xfe, 0xfe, 0x1a, + 0xcf, 0xd4, 0x95, 0x2c, 0xee, 0xcc, 0x28, 0xcc, + 0x46, 0xd0, 0x7e, 0x6e, 0xb5, 0x64, 0x59, 0xc0, + 0x22, 0x81, 0xa5, 0xbf, 0x58, 0xda, 0x64, 0x0c, + 0xaa, 0x53, 0xd7, 0xdf, 0x34, 0xef, 0x3e, 0xe3, + 0xd4, 0x9f, 0xed, 0x36, 0xbf, 0xf3, 0xea, 0x3f, + 0xef, 0xe1, 0xa3, 0xed, 0x36, 0xbf, 0xf3, 0xea, + 0x3f, 0xef, 0xe1, 0xac, 0xc9, 0xe2, 0x9e, 0x1b, + 0xb6, 0xb5, 0xda, 0x5e, 0x45, 0xec, 0x83, 0x39, + 0xa8, 0x83, 0x4c, 0x5d, 0x90, 0x46, 0xfb, 0xd0, + 0x65, 0x97, 0x69, 0xc8, 0x1e, 0xf4, 0xb9, 0xa6, + 0x23, 0x63, 0xed, 0x36, 0xbf, 0xf3, 0xea, 0x3f, + 0xef, 0xe1, 0xa3, 0xed, 0x36, 0xbf, 0xf3, 0xea, + 0x3f, 0xef, 0xe1, 0xac, 0xdc, 0x30, 0xb7, 0x25, + 0xa1, 0xb8, 0x13, 0x6f, 0x0a, 0x3e, 0x4f, 0x97, + 0x9e, 0xdf, 0x5a, 0x89, 0xbc, 0xf4, 0x52, 0xef, + 0x0c, 0x8a, 0xa0, 0xe0, 0x92, 0xa4, 0x00, 0x69, + 0xf3, 0x4f, 0xb8, 0x1a, 0xff, 0x00, 0x69, 0xb5, + 0xff, 0x00, 0x9f, 0x51, 0xff, 0x00, 0x7f, 0x0d, + 0x1f, 0x69, 0xb5, 0xff, 0x00, 0x9f, 0x51, 0xff, + 0x00, 0x7f, 0x0d, 0x52, 0xb9, 0x81, 0x92, 0x3b, + 0x76, 0x85, 0x64, 0x90, 0xc9, 0x10, 0x91, 0x80, + 0x19, 0xc7, 0xe5, 0x55, 0x22, 0x79, 0x66, 0x62, + 0x22, 0x47, 0x90, 0x8e, 0xca, 0x33, 0x43, 0x94, + 0xd0, 0x6a, 0x6c, 0x7d, 0xa6, 0xd7, 0xfe, 0x7d, + 0x47, 0xfd, 0xfc, 0x34, 0x7d, 0xa6, 0xd7, 0xfe, + 0x7d, 0x47, 0xfd, 0xfc, 0x35, 0x8e, 0xad, 0x2b, + 0xee, 0xdb, 0x1b, 0xb6, 0xd3, 0x86, 0xc2, 0x93, + 0x83, 0xef, 0x4e, 0x51, 0x70, 0xdb, 0xc2, 0xc3, + 0x21, 0xd9, 0xc3, 0x61, 0x0f, 0xcb, 0xf5, 0xa5, + 0xcd, 0x30, 0x35, 0xbe, 0xd3, 0x6b, 0xff, 0x00, + 0x3e, 0xa3, 0xfe, 0xfe, 0x1a, 0x3e, 0xd3, 0x6b, + 0xff, 0x00, 0x3e, 0xa3, 0xfe, 0xfe, 0x1a, 0xcf, + 0x55, 0x46, 0xd2, 0xde, 0xeb, 0x73, 0x6f, 0x59, + 0x76, 0x63, 0xb7, 0x4a, 0x82, 0x43, 0x34, 0x4a, + 0x1a, 0x48, 0x9d, 0x14, 0xf4, 0x2c, 0xa4, 0x03, + 0x4f, 0x9a, 0x7d, 0xc0, 0xd7, 0xfb, 0x4d, 0xaf, + 0xfc, 0xfa, 0x8f, 0xfb, 0xf8, 0x69, 0xc9, 0xf6, + 0x7b, 0x9c, 0xac, 0x40, 0xc5, 0x2f, 0x65, 0x27, + 0x21, 0xab, 0x0b, 0xed, 0x1e, 0xf4, 0xe8, 0x6e, + 0x8a, 0xcc, 0x8c, 0x0f, 0x21, 0x81, 0xa1, 0x4e, + 0x57, 0x0b, 0x9a, 0x84, 0x10, 0x79, 0xa7, 0x44, + 0x86, 0x59, 0x15, 0x17, 0xa9, 0xa9, 0x2e, 0xc6, + 0x2e, 0xa5, 0x03, 0xfb, 0xd4, 0x90, 0x1c, 0x79, + 0xa7, 0xd2, 0x27, 0x3f, 0xa5, 0x74, 0xb2, 0x81, + 0xae, 0xad, 0xe1, 0x25, 0x62, 0x89, 0x64, 0xc7, + 0x57, 0x7e, 0x73, 0xf8, 0x52, 0x7d, 0xbc, 0x7f, + 0xcf, 0x08, 0x3f, 0xef, 0x8a, 0xc2, 0xfb, 0x47, + 0xbd, 0x2a, 0xcc, 0xce, 0xca, 0xab, 0xcb, 0x31, + 0xc0, 0x03, 0xbd, 0x72, 0xb9, 0x49, 0xf5, 0x24, + 0xdc, 0xfb, 0x78, 0xff, 0x00, 0x9e, 0x10, 0x7f, + 0xdf, 0x14, 0x7d, 0xbc, 0x7f, 0xcf, 0x08, 0x3f, + 0xef, 0x8a, 0x83, 0xfb, 0x39, 0x43, 0x88, 0x1a, + 0xfa, 0x25, 0xb9, 0x23, 0xfd, 0x56, 0x3b, 0xfa, + 0x66, 0xb3, 0x87, 0x9e, 0xd3, 0x3c, 0x2b, 0x13, + 0xb4, 0x88, 0x48, 0x65, 0x51, 0x92, 0x28, 0x7c, + 0xe8, 0x0d, 0x8f, 0xb7, 0x8f, 0xf9, 0xe1, 0x07, + 0xfd, 0xf1, 0x47, 0xdb, 0xc7, 0xfc, 0xf0, 0x83, + 0xfe, 0xf8, 0xac, 0x60, 0x66, 0x3b, 0xf1, 0x14, + 0x87, 0x67, 0x0d, 0x85, 0x3f, 0x2f, 0xd6, 0x9d, + 0x8b, 0x8d, 0xcc, 0xbe, 0x44, 0xbb, 0x94, 0x65, + 0x86, 0xc3, 0x90, 0x3d, 0xe8, 0xbc, 0x80, 0xd7, + 0xfb, 0x78, 0xff, 0x00, 0x9e, 0x10, 0x7f, 0xdf, + 0x14, 0x7d, 0xbc, 0x7f, 0xcf, 0x08, 0x3f, 0xef, + 0x8a, 0xc6, 0x43, 0x34, 0x8a, 0x19, 0x22, 0x77, + 0x52, 0x76, 0xe5, 0x54, 0x9e, 0x7d, 0x29, 0x49, + 0x9c, 0x07, 0x63, 0x14, 0x98, 0x4e, 0x1c, 0xed, + 0x3f, 0x2f, 0xd6, 0x8b, 0xcb, 0xb8, 0x1b, 0x1f, + 0x6f, 0x1f, 0xf3, 0xc2, 0x0f, 0xfb, 0xe2, 0x8f, + 0xb7, 0x8f, 0xf9, 0xe1, 0x07, 0xfd, 0xf1, 0x58, + 0xea, 0x67, 0x68, 0x8c, 0xab, 0x14, 0x86, 0x31, + 0xd5, 0xc2, 0x9c, 0x7e, 0x74, 0xfb, 0x11, 0xf6, + 0xcb, 0xb8, 0xed, 0xf7, 0xec, 0xdf, 0x9e, 0x71, + 0x9c, 0x71, 0x9a, 0x2f, 0x2e, 0xe0, 0x6a, 0xfd, + 0xbc, 0x7f, 0xcf, 0x08, 0x3f, 0xef, 0x8a, 0x3e, + 0xde, 0x3f, 0xe7, 0x84, 0x1f, 0xf7, 0xc5, 0x56, + 0x7b, 0x38, 0xda, 0x39, 0x5a, 0xda, 0xf5, 0x26, + 0x78, 0x81, 0x66, 0x4d, 0xbb, 0x4e, 0x07, 0x5a, + 0xcf, 0x53, 0x33, 0x44, 0x65, 0x58, 0x9c, 0xc6, + 0x3a, 0xb0, 0x53, 0x81, 0xf8, 0xd0, 0xdc, 0xd7, + 0x50, 0x36, 0x7e, 0xde, 0x3f, 0xe7, 0x84, 0x1f, + 0xf7, 0xc5, 0x1f, 0x6f, 0x1f, 0xf3, 0xc2, 0x0f, + 0xfb, 0xe2, 0xb1, 0xc1, 0x9d, 0x90, 0x3a, 0xc5, + 0x21, 0x42, 0x09, 0x0c, 0x14, 0xe3, 0x03, 0xad, + 0x4b, 0x70, 0xac, 0x25, 0x61, 0x04, 0x37, 0x1b, + 0x14, 0x0c, 0xf9, 0x89, 0xc8, 0xcf, 0xad, 0x17, + 0x97, 0x70, 0x34, 0xfe, 0xde, 0x3f, 0xe7, 0x84, + 0x1f, 0xf7, 0xc5, 0x1f, 0x6f, 0x1f, 0xf3, 0xc2, + 0x0f, 0xfb, 0xe2, 0xb3, 0xac, 0xa2, 0x69, 0x75, + 0x08, 0xad, 0x67, 0x59, 0x23, 0xdf, 0x9c, 0x82, + 0x30, 0x7a, 0x1f, 0x5a, 0x82, 0x63, 0x24, 0x59, + 0x62, 0x8e, 0x23, 0xdc, 0x42, 0xb1, 0x1c, 0x1f, + 0xc6, 0x8b, 0xcb, 0xb8, 0x1b, 0x1f, 0x6f, 0x1f, + 0xf3, 0xc2, 0x0f, 0xfb, 0xe2, 0x8f, 0xb7, 0x8f, + 0xf9, 0xe1, 0x07, 0xfd, 0xf1, 0x58, 0xc5, 0xa6, + 0x11, 0x09, 0x4c, 0x6e, 0x23, 0x3f, 0xc7, 0xb4, + 0xe3, 0xf3, 0xa5, 0x26, 0x70, 0x9b, 0xcc, 0x52, + 0x04, 0xc0, 0x6d, 0xc5, 0x4e, 0x30, 0x7a, 0x1a, + 0x2f, 0x2e, 0xe0, 0x6c, 0x7d, 0xbc, 0x7f, 0xcf, + 0x08, 0x3f, 0xef, 0x8a, 0x3e, 0xde, 0x3f, 0xe7, + 0x84, 0x1f, 0xf7, 0xc5, 0x63, 0x48, 0x66, 0x89, + 0x55, 0xa4, 0x8a, 0x44, 0x56, 0xe8, 0x59, 0x48, + 0x06, 0xad, 0x5f, 0xc2, 0x60, 0xbe, 0x36, 0xf6, + 0xeb, 0x24, 0x87, 0x68, 0x38, 0xc6, 0x4f, 0xe9, + 0x45, 0xe5, 0xdc, 0x0b, 0xff, 0x00, 0x6f, 0x1f, + 0xf3, 0xc2, 0x0f, 0xfb, 0xe2, 0x8f, 0xb7, 0x46, + 0x78, 0x6b, 0x78, 0x48, 0xf6, 0x5c, 0x1a, 0xc4, + 0x79, 0x5e, 0x36, 0x28, 0xe0, 0xab, 0x0e, 0xa0, + 0x8c, 0x11, 0x4d, 0xfb, 0x47, 0xbd, 0x2e, 0x69, + 0x77, 0x03, 0x7a, 0x44, 0x43, 0x1a, 0xcd, 0x09, + 0x26, 0x36, 0x38, 0x20, 0xff, 0x00, 0x09, 0xf4, + 0xa8, 0xaa, 0x3d, 0x32, 0x4f, 0x32, 0xc2, 0xe7, + 0xbe, 0x1d, 0x71, 0xfa, 0xd4, 0xd1, 0x7f, 0xae, + 0x4c, 0xff, 0x00, 0x78, 0x57, 0x4c, 0x5d, 0xd5, + 0xca, 0x25, 0x73, 0x05, 0xae, 0x16, 0x45, 0xf3, + 0x25, 0xea, 0x41, 0x3c, 0x2d, 0x33, 0xed, 0xb1, + 0x7f, 0xcf, 0xb4, 0x5f, 0xad, 0x65, 0xdf, 0xdc, + 0x11, 0x7f, 0x72, 0x09, 0xe9, 0x2b, 0x0f, 0xd6, + 0xab, 0xfd, 0xa3, 0xde, 0xb0, 0x94, 0xe5, 0x72, + 0x4d, 0xcf, 0xb6, 0xc5, 0xff, 0x00, 0x3e, 0xd1, + 0x7e, 0xb4, 0x7d, 0xb6, 0x2f, 0xf9, 0xf6, 0x8b, + 0xf5, 0xac, 0x3f, 0xb4, 0x7b, 0xd1, 0xf6, 0x8f, + 0x7a, 0x9e, 0x69, 0x77, 0x03, 0x73, 0xed, 0xb1, + 0x7f, 0xcf, 0xb4, 0x5f, 0xad, 0x1f, 0x6d, 0x8b, + 0xfe, 0x7d, 0xa2, 0xfd, 0x6b, 0x0f, 0xed, 0x1e, + 0xf4, 0x7d, 0xa3, 0xde, 0x8e, 0x69, 0x77, 0x03, + 0x73, 0xed, 0xb1, 0x7f, 0xcf, 0xb4, 0x5f, 0xad, + 0x1f, 0x6d, 0x8b, 0xfe, 0x7d, 0xa2, 0xfd, 0x6b, + 0x0f, 0xed, 0x1e, 0xf4, 0x7d, 0xa3, 0xde, 0x8e, + 0x69, 0x77, 0x03, 0x73, 0xed, 0xb1, 0x7f, 0xcf, + 0xb4, 0x5f, 0xad, 0x1f, 0x6d, 0x8b, 0xfe, 0x7d, + 0xa2, 0xfd, 0x6b, 0x3f, 0x4e, 0x84, 0xdf, 0x4c, + 0xc9, 0xe6, 0x88, 0xd5, 0x57, 0x25, 0x88, 0xcf, + 0x7a, 0x86, 0x41, 0x2a, 0xdc, 0x4b, 0x0a, 0xab, + 0x3b, 0x44, 0x4e, 0xed, 0xa3, 0x3c, 0x0e, 0xf4, + 0xef, 0x3d, 0xc3, 0x53, 0x5b, 0xed, 0xb1, 0x7f, + 0xcf, 0xb4, 0x5f, 0xad, 0x1f, 0x6d, 0x8b, 0xfe, + 0x7d, 0xa2, 0xfd, 0x6b, 0x1e, 0x47, 0x96, 0x20, + 0xbe, 0x62, 0x3a, 0x6e, 0xe4, 0x6e, 0x5c, 0x66, + 0x89, 0x0c, 0xd1, 0x28, 0x69, 0x23, 0x74, 0x56, + 0xe8, 0x59, 0x48, 0x06, 0x8e, 0x69, 0x81, 0xb1, + 0xf6, 0xd8, 0xbf, 0xe7, 0xda, 0x2f, 0xd6, 0x8f, + 0xb6, 0xc5, 0xff, 0x00, 0x3e, 0xd1, 0x7e, 0xb5, + 0x43, 0x51, 0x8c, 0x5a, 0xde, 0xfd, 0x9e, 0x22, + 0xef, 0xc0, 0x20, 0x1e, 0x49, 0xcd, 0x56, 0x91, + 0xa6, 0x89, 0xc2, 0x49, 0x1b, 0xa3, 0x1e, 0x8a, + 0xca, 0x41, 0x34, 0x37, 0x35, 0xd4, 0x35, 0x36, + 0x3e, 0xdb, 0x17, 0xfc, 0xfb, 0x45, 0xfa, 0xd1, + 0xf6, 0xd8, 0xbf, 0xe7, 0xda, 0x2f, 0xd6, 0xb2, + 0x1f, 0xed, 0x11, 0x86, 0x2f, 0x0c, 0x8a, 0x17, + 0x1b, 0x8b, 0x21, 0x18, 0xcf, 0x4c, 0xd4, 0x5f, + 0x68, 0xf7, 0xa3, 0x9a, 0x5d, 0xc0, 0xdc, 0xfb, + 0x6c, 0x5f, 0xf3, 0xed, 0x17, 0xeb, 0x47, 0xdb, + 0x62, 0xff, 0x00, 0x9f, 0x68, 0xbf, 0x5a, 0xc3, + 0xfb, 0x47, 0xbd, 0x1f, 0x68, 0xf7, 0xa5, 0xcd, + 0x2e, 0xe0, 0x6e, 0x7d, 0xb6, 0x2f, 0xf9, 0xf6, + 0x8b, 0xf5, 0xa3, 0xed, 0xb1, 0x7f, 0xcf, 0xb4, + 0x5f, 0xad, 0x61, 0xfd, 0xa3, 0xde, 0x8f, 0xb4, + 0x7b, 0xd1, 0xcd, 0x2e, 0xe0, 0x6e, 0x7d, 0xb6, + 0x2f, 0xf9, 0xf6, 0x8b, 0xf5, 0xa3, 0xed, 0xb1, + 0x7f, 0xcf, 0xb4, 0x5f, 0xad, 0x61, 0xfd, 0xa3, + 0xde, 0x8f, 0xb4, 0x7b, 0xd1, 0xcd, 0x2e, 0xe0, + 0x6f, 0xa4, 0x96, 0xf7, 0x2d, 0xe5, 0xed, 0xf2, + 0xa4, 0x3f, 0x74, 0x83, 0xc1, 0x35, 0x03, 0x29, + 0x56, 0x2a, 0x46, 0x08, 0xe0, 0x8a, 0xc8, 0x17, + 0x25, 0x48, 0x20, 0xe0, 0x8a, 0xde, 0xbd, 0x00, + 0x5d, 0xc8, 0x07, 0xad, 0x6f, 0x4e, 0x4d, 0xad, + 0x46, 0x89, 0x1b, 0xfd, 0x4c, 0x3f, 0xef, 0x27, + 0xf3, 0x14, 0x50, 0xdf, 0xea, 0x61, 0xff, 0x00, + 0x79, 0x3f, 0x98, 0xa2, 0xb4, 0x18, 0xf8, 0x3a, + 0x3f, 0xfd, 0x74, 0x7f, 0xe6, 0x6a, 0x4a, 0x8e, + 0x0e, 0x8f, 0xff, 0x00, 0x5d, 0x1f, 0xf9, 0x9a, + 0x96, 0x80, 0x28, 0x5c, 0x7f, 0xaf, 0x6f, 0xf3, + 0xda, 0xb1, 0xf5, 0xc4, 0x63, 0xac, 0x5c, 0x90, + 0x78, 0xc8, 0xfe, 0x42, 0xb6, 0x2e, 0x7f, 0xd7, + 0xb7, 0xe1, 0xfc, 0xaa, 0x0d, 0x52, 0x0d, 0xd7, + 0xcf, 0x26, 0x3e, 0x57, 0x01, 0x81, 0xf6, 0xc5, + 0x65, 0x57, 0x61, 0x33, 0x9f, 0xf2, 0xdf, 0xd4, + 0xd6, 0xb6, 0x97, 0x1b, 0xc9, 0xa5, 0x6a, 0x30, + 0x47, 0x93, 0x33, 0x05, 0x60, 0x07, 0x52, 0x01, + 0xe7, 0xfc, 0xfb, 0xd3, 0x7e, 0xcf, 0xed, 0x4f, + 0x89, 0x24, 0x86, 0x41, 0x24, 0x4c, 0x51, 0xc7, + 0x71, 0x58, 0xa9, 0x59, 0x88, 0xa3, 0x1e, 0x9f, + 0x72, 0x60, 0x69, 0xd8, 0x32, 0x42, 0x8c, 0x03, + 0x6e, 0xe3, 0x3f, 0x4a, 0xe8, 0x37, 0xdc, 0x7f, + 0xc2, 0x45, 0xf6, 0x7c, 0xb7, 0xd8, 0xfc, 0xac, + 0x79, 0x7f, 0xc3, 0xb7, 0x6f, 0xf8, 0xd5, 0x2b, + 0x89, 0x2e, 0x6e, 0x80, 0x13, 0x4a, 0x58, 0x0e, + 0x83, 0x18, 0x14, 0xbe, 0x7d, 0xdf, 0x91, 0xe4, + 0x79, 0xcd, 0xe5, 0xe3, 0x18, 0xf6, 0xfa, 0xd5, + 0x29, 0xa4, 0x05, 0x86, 0x9a, 0x68, 0xae, 0x74, + 0x88, 0xe2, 0x91, 0x96, 0x32, 0x8a, 0x18, 0x0f, + 0xe2, 0x1d, 0x39, 0xa8, 0x2e, 0x0c, 0xa9, 0xa6, + 0x6a, 0x28, 0x8e, 0xea, 0x05, 0xd9, 0x00, 0x03, + 0xd1, 0x73, 0xd2, 0xa3, 0x2d, 0x39, 0x68, 0x98, + 0xbf, 0x30, 0x80, 0x13, 0x81, 0xc6, 0x29, 0xcb, + 0x2d, 0xca, 0x79, 0xbb, 0x64, 0x23, 0xce, 0x24, + 0xbf, 0x03, 0x9c, 0xd1, 0xce, 0x82, 0xe4, 0xba, + 0x93, 0xbc, 0xba, 0xed, 0xb5, 0xbc, 0x8e, 0x7e, + 0xce, 0x19, 0x09, 0x4e, 0xc4, 0xfb, 0xd3, 0x83, + 0xdc, 0xcb, 0x79, 0xab, 0x45, 0x72, 0xcc, 0x6d, + 0xc4, 0x6f, 0x85, 0x6e, 0x8b, 0xfd, 0xdc, 0x7e, + 0x15, 0x52, 0x71, 0x2d, 0xc4, 0xbe, 0x64, 0xad, + 0xb9, 0xfa, 0x67, 0x18, 0xa9, 0x65, 0x9e, 0xee, + 0x68, 0xbc, 0xa9, 0x26, 0x66, 0x4f, 0x4f, 0x5a, + 0x39, 0xd0, 0x5c, 0xad, 0xe2, 0x14, 0x66, 0xd5, + 0x09, 0x1f, 0xdc, 0x5f, 0xe5, 0x57, 0x6e, 0xbe, + 0xc0, 0xb6, 0xba, 0x79, 0xbc, 0x49, 0xdd, 0xc4, + 0x0b, 0x81, 0x1e, 0x30, 0x78, 0xef, 0x55, 0xa7, + 0x12, 0xdc, 0x49, 0xe6, 0x4a, 0x77, 0x3e, 0x31, + 0x9c, 0x62, 0x89, 0x44, 0xb3, 0x2c, 0x6b, 0x23, + 0x6e, 0x11, 0xae, 0xd5, 0xe3, 0xa0, 0xa5, 0xce, + 0xb5, 0x0b, 0x96, 0xed, 0xae, 0x45, 0xd2, 0x6a, + 0x77, 0x8f, 0xe6, 0xc6, 0x48, 0x40, 0x3c, 0xac, + 0x6f, 0x55, 0xf6, 0xa7, 0xdb, 0xcc, 0xb2, 0x5f, + 0x79, 0xa8, 0x93, 0x02, 0xb6, 0x6c, 0x37, 0x4e, + 0xa0, 0x17, 0xc1, 0x18, 0x3e, 0xf5, 0x4a, 0xdf, + 0xce, 0xb6, 0x7d, 0xf0, 0xb9, 0x46, 0xe9, 0xc5, + 0x3f, 0xcd, 0xb9, 0x33, 0x3c, 0xa6, 0x42, 0x5d, + 0xd7, 0x69, 0x24, 0x0e, 0x9e, 0x94, 0xd5, 0x40, + 0xb8, 0xeb, 0x17, 0x9a, 0x6d, 0x39, 0x5e, 0x67, + 0x67, 0x73, 0x7d, 0x19, 0x2c, 0x7a, 0xf6, 0xab, + 0x05, 0xae, 0x1e, 0xff, 0x00, 0x56, 0x8e, 0x66, + 0x63, 0x00, 0x85, 0xb0, 0xa7, 0xa0, 0xf4, 0xc7, + 0xeb, 0x55, 0xad, 0x8b, 0xc4, 0x63, 0x8c, 0xb6, + 0x21, 0x12, 0xab, 0xb0, 0xc7, 0x71, 0xde, 0xa5, + 0xbd, 0xb8, 0x9a, 0x57, 0x96, 0x34, 0x99, 0x8c, + 0x0c, 0xd9, 0x03, 0xfc, 0xf3, 0x4d, 0x4d, 0x58, + 0x77, 0x1e, 0x27, 0x9e, 0x29, 0xb4, 0x78, 0xa3, + 0x72, 0xa8, 0xd1, 0xa6, 0xf0, 0x3f, 0x8b, 0xb7, + 0x34, 0x98, 0x8a, 0x0b, 0x1b, 0xb6, 0xdf, 0x3c, + 0x63, 0xed, 0x8c, 0x0b, 0x5b, 0xe3, 0x70, 0x1d, + 0x87, 0xd2, 0xaa, 0x96, 0x9c, 0xb4, 0x4c, 0x5f, + 0x98, 0x40, 0x09, 0xc0, 0xe3, 0x14, 0xf8, 0xa6, + 0xba, 0x86, 0x49, 0x24, 0x8e, 0x52, 0xad, 0x21, + 0xcb, 0x70, 0x39, 0x3f, 0x4a, 0x39, 0xd0, 0xae, + 0x58, 0xf3, 0xdb, 0x3a, 0xad, 0xc4, 0x51, 0xc9, + 0x0b, 0x98, 0xe3, 0xe2, 0x45, 0xc1, 0x0d, 0xcf, + 0x38, 0xa4, 0xd3, 0xc4, 0xe8, 0x96, 0x26, 0x7b, + 0xa9, 0x89, 0x99, 0xd9, 0xd5, 0x23, 0x51, 0x83, + 0xcf, 0x3b, 0x8f, 0x7a, 0xab, 0xba, 0x7c, 0x4a, + 0x0b, 0x93, 0xe7, 0x7d, 0xfc, 0x8c, 0xee, 0xa7, + 0x24, 0xb7, 0x51, 0xc2, 0x21, 0x49, 0x99, 0x63, + 0x07, 0x20, 0x0e, 0xd4, 0xb9, 0xd0, 0x5c, 0x94, + 0xab, 0x45, 0x6b, 0x73, 0xb2, 0x3d, 0xfb, 0x75, + 0x1c, 0xac, 0x60, 0x75, 0x00, 0xf4, 0xa6, 0xdf, + 0xee, 0xbb, 0xb4, 0xbb, 0x92, 0xde, 0xea, 0x70, + 0x01, 0x0d, 0x2d, 0xbc, 0xeb, 0x9d, 0xbc, 0xf6, + 0x3d, 0xa9, 0xb2, 0x4d, 0x75, 0x28, 0x21, 0xe5, + 0x27, 0x2c, 0x1c, 0xe0, 0x01, 0xc8, 0xe8, 0x68, + 0x9e, 0x7b, 0xbb, 0x88, 0xfc, 0xb9, 0x65, 0x2c, + 0x9d, 0xc6, 0x00, 0xcd, 0x1c, 0xe8, 0x77, 0x30, + 0xbc, 0xb7, 0xf5, 0x34, 0xe8, 0xe3, 0x7f, 0x35, + 0x39, 0xee, 0x2b, 0x4b, 0xec, 0xfe, 0xd5, 0x24, + 0x16, 0x85, 0xe6, 0x45, 0x03, 0x92, 0xc2, 0xa1, + 0x31, 0x1a, 0x37, 0xbf, 0xf1, 0xf7, 0x2f, 0xd6, + 0x9b, 0x10, 0xca, 0xcd, 0xff, 0x00, 0x5c, 0x9f, + 0xff, 0x00, 0x41, 0xa5, 0xba, 0x60, 0xd7, 0x32, + 0x11, 0xd3, 0x75, 0x2d, 0xae, 0x0c, 0xa5, 0x0f, + 0x1b, 0xd4, 0xa8, 0xfc, 0x45, 0x75, 0xb2, 0x8e, + 0x5f, 0xc9, 0x6f, 0x53, 0x56, 0x74, 0xe4, 0xf2, + 0xf5, 0x1b, 0x67, 0x73, 0xf2, 0xac, 0x8a, 0x4e, + 0x7e, 0xb5, 0x75, 0xad, 0x4a, 0xb1, 0x56, 0x5c, + 0x11, 0xc1, 0x14, 0x9f, 0x67, 0xf6, 0xae, 0x4e, + 0x6b, 0x12, 0x32, 0xff, 0x00, 0x4e, 0xba, 0x97, + 0x59, 0x95, 0x51, 0x1f, 0x73, 0xc8, 0x59, 0x5b, + 0xb6, 0x0f, 0x7c, 0xd4, 0xe9, 0x1c, 0xf6, 0x7a, + 0x1c, 0xa2, 0x17, 0x29, 0x30, 0xb9, 0xdb, 0x2b, + 0x21, 0xe7, 0x00, 0x7a, 0xfd, 0x6a, 0x71, 0x73, + 0x78, 0x22, 0xf2, 0x84, 0xed, 0xb7, 0x18, 0xf7, + 0xfc, 0xea, 0x3b, 0x76, 0x9e, 0xd8, 0x93, 0x0c, + 0x85, 0x33, 0xd7, 0xde, 0xab, 0x9d, 0x5c, 0x0b, + 0xf3, 0x97, 0x4b, 0x4b, 0x89, 0xb3, 0xb6, 0xe5, + 0xad, 0x63, 0x2e, 0x47, 0x5d, 0xdc, 0xf3, 0xf5, + 0xa6, 0x47, 0x3d, 0xc1, 0xbb, 0xd2, 0x73, 0x23, + 0x7c, 0xf1, 0x7e, 0xf3, 0x9f, 0xbf, 0xc7, 0x7f, + 0x5a, 0xa6, 0x5e, 0xe1, 0xbc, 0xdc, 0xc8, 0x4f, + 0x9a, 0x00, 0x7c, 0xf7, 0xa0, 0x3c, 0xe1, 0xa2, + 0x60, 0xfc, 0xc2, 0x30, 0x87, 0x03, 0x81, 0x55, + 0xed, 0x10, 0xee, 0x22, 0x19, 0x2d, 0xb4, 0x6b, + 0xbf, 0x25, 0xcc, 0x6d, 0xf6, 0xa2, 0x01, 0x5e, + 0x08, 0x1c, 0x56, 0x84, 0x92, 0x4a, 0xfa, 0xb4, + 0xd1, 0x33, 0x1f, 0x29, 0xad, 0x4e, 0x53, 0xb1, + 0x38, 0xeb, 0xf5, 0xac, 0xe3, 0xe6, 0x98, 0x9a, + 0x22, 0xdf, 0x23, 0xb6, 0xf2, 0x30, 0x39, 0x34, + 0xff, 0x00, 0x36, 0xe7, 0xce, 0x33, 0x79, 0x9f, + 0xbc, 0x2b, 0xb3, 0x3b, 0x47, 0x4a, 0x5e, 0xd1, + 0x0a, 0xe4, 0xb6, 0xcc, 0xd3, 0x25, 0xac, 0x0b, + 0x3d, 0xc5, 0x9d, 0xca, 0xc5, 0xb5, 0x54, 0xae, + 0x63, 0x71, 0x8e, 0xb8, 0xf7, 0xac, 0xfd, 0x0e, + 0x16, 0x8f, 0x5b, 0x83, 0x71, 0xe8, 0x58, 0x7f, + 0xe3, 0xa6, 0xae, 0xa5, 0xc5, 0xdc, 0x71, 0x08, + 0x92, 0x66, 0x08, 0x06, 0x00, 0xf4, 0xfc, 0x6a, + 0x18, 0x52, 0x48, 0x25, 0x12, 0xc4, 0x76, 0xba, + 0xf4, 0x38, 0xa5, 0xce, 0xb4, 0x01, 0x5e, 0xe2, + 0xca, 0xd0, 0x5d, 0x7d, 0x8e, 0x19, 0xfc, 0xf9, + 0x43, 0x21, 0x69, 0x08, 0xc0, 0x07, 0xae, 0x2a, + 0xf7, 0x99, 0x15, 0xb1, 0xb0, 0x55, 0x17, 0x4e, + 0x3c, 0x81, 0x88, 0xa1, 0x00, 0xa3, 0xf1, 0xce, + 0x47, 0x73, 0x59, 0xad, 0x01, 0x66, 0x24, 0xf5, + 0x3c, 0xd5, 0x88, 0xe6, 0xba, 0x8e, 0x1f, 0x25, + 0x26, 0x61, 0x1e, 0x3a, 0x53, 0x55, 0x02, 0xe4, + 0x77, 0x2f, 0x2c, 0x5a, 0x0d, 0xb2, 0x40, 0xcc, + 0x8a, 0xef, 0x20, 0x3e, 0xbb, 0x72, 0x78, 0xad, + 0x0b, 0x9f, 0x31, 0x64, 0xd4, 0xda, 0x22, 0x43, + 0xf9, 0x31, 0xe0, 0x8e, 0xa3, 0xad, 0x67, 0x32, + 0xc8, 0xf0, 0xa4, 0x2c, 0x73, 0x1a, 0x12, 0x54, + 0x63, 0xa6, 0x6a, 0xec, 0x37, 0x0f, 0xe5, 0xdc, + 0xbc, 0xb2, 0x1f, 0x39, 0xd5, 0x42, 0x90, 0x3d, + 0x3e, 0x94, 0xd4, 0xd0, 0xee, 0x16, 0xa1, 0xdd, + 0xb4, 0x69, 0x26, 0x24, 0xcd, 0xfb, 0xc0, 0x4b, + 0x75, 0x23, 0x07, 0x15, 0x5b, 0xcc, 0x96, 0xeb, + 0x4c, 0xd4, 0x16, 0x77, 0x2c, 0xa9, 0x2a, 0x6d, + 0xff, 0x00, 0x64, 0x6e, 0xed, 0xf8, 0x52, 0xb4, + 0xd7, 0x4d, 0x70, 0xb3, 0xb4, 0xa4, 0xc8, 0x9c, + 0x29, 0xc0, 0xe3, 0xf0, 0xa8, 0xc0, 0x94, 0x47, + 0x24, 0x61, 0xbe, 0x49, 0x48, 0x2e, 0x31, 0xd6, + 0x97, 0xb4, 0x42, 0xb9, 0x7e, 0xfa, 0x48, 0xa3, + 0xb9, 0xb9, 0x84, 0xad, 0xdc, 0x80, 0xc3, 0xb7, + 0xca, 0x55, 0x06, 0x35, 0x5c, 0x75, 0x1f, 0xe3, + 0x55, 0x6e, 0x3e, 0xd0, 0xeb, 0xa5, 0x5a, 0xc5, + 0x26, 0xc0, 0xf1, 0x26, 0x73, 0xd0, 0xe3, 0x1d, + 0x7d, 0x69, 0x1a, 0x6b, 0xa6, 0x83, 0xc8, 0x33, + 0x31, 0x8f, 0x18, 0xc7, 0xb7, 0xd6, 0x98, 0xc6, + 0x66, 0x31, 0x12, 0xe7, 0x31, 0x00, 0x10, 0x81, + 0x8c, 0x50, 0xea, 0x20, 0xb9, 0x62, 0xf1, 0x7c, + 0xcd, 0x2f, 0x51, 0x0d, 0x34, 0xd3, 0x32, 0xc8, + 0xa0, 0xb4, 0x8a, 0x00, 0x0c, 0x18, 0x03, 0xb6, + 0xa4, 0xba, 0x90, 0x43, 0x7d, 0x76, 0x24, 0x59, + 0xd6, 0x39, 0x23, 0x8c, 0x19, 0xa1, 0xea, 0x98, + 0xf7, 0xf7, 0xaa, 0xed, 0x71, 0x76, 0xe5, 0xb7, + 0x4c, 0x4e, 0xf5, 0xda, 0x46, 0x06, 0x31, 0x40, + 0xb8, 0xbb, 0x59, 0x9a, 0x51, 0x29, 0x0e, 0xc3, + 0x04, 0xe0, 0x73, 0xf8, 0x53, 0xf6, 0x88, 0x77, + 0x28, 0x6b, 0x16, 0xf2, 0xf9, 0xd0, 0xbb, 0x5c, + 0x1b, 0x84, 0x78, 0xc1, 0x47, 0x2b, 0x83, 0xb7, + 0xde, 0xb3, 0xfc, 0x96, 0xf5, 0x35, 0xb3, 0x3a, + 0xcb, 0x71, 0x26, 0xf9, 0x58, 0xbb, 0x74, 0xc9, + 0xa8, 0xfe, 0xcf, 0xed, 0x50, 0xe5, 0x76, 0x22, + 0x4d, 0x19, 0x0a, 0x58, 0x5d, 0x67, 0xbb, 0xa7, + 0xf5, 0xab, 0x70, 0xff, 0x00, 0xae, 0x4f, 0xf7, + 0x85, 0x16, 0xf1, 0x79, 0x16, 0x0f, 0xbb, 0x83, + 0x2b, 0x8d, 0xa3, 0xd8, 0x77, 0xa2, 0x32, 0x16, + 0x54, 0x63, 0xd0, 0x10, 0x6b, 0xa2, 0x1f, 0x09, + 0x48, 0xc3, 0xd4, 0x62, 0x63, 0xa9, 0x5d, 0x10, + 0x7f, 0xe5, 0xb3, 0xff, 0x00, 0xe8, 0x46, 0xab, + 0x79, 0x2d, 0xea, 0x6b, 0x76, 0xfa, 0xd4, 0x8b, + 0xc9, 0x89, 0x1f, 0x79, 0x8b, 0x0f, 0x70, 0x79, + 0xa8, 0x3e, 0xcf, 0xed, 0x5c, 0xed, 0xea, 0x49, + 0x93, 0xe4, 0xb7, 0xa9, 0xa3, 0xc9, 0x6f, 0x53, + 0x5a, 0xdf, 0x67, 0xf6, 0xa3, 0xec, 0xfe, 0xd4, + 0xb9, 0x80, 0xc9, 0xf2, 0x5b, 0xd4, 0xd1, 0xe4, + 0xb7, 0xa9, 0xad, 0x6f, 0xb3, 0xfb, 0x51, 0xf6, + 0x7f, 0x6a, 0x39, 0x80, 0xc9, 0xf2, 0x5b, 0xd4, + 0xd1, 0xe4, 0xb7, 0xa9, 0xad, 0x6f, 0xb3, 0xfb, + 0x51, 0xf6, 0x7f, 0x6a, 0x39, 0x80, 0x97, 0x4f, + 0xb6, 0x8e, 0x3d, 0x1a, 0x53, 0x35, 0xcf, 0xd9, + 0xcd, 0xc4, 0x80, 0x07, 0xdb, 0xbb, 0x85, 0xff, + 0x00, 0xeb, 0xd5, 0xe1, 0x18, 0x5d, 0x62, 0x5b, + 0xb8, 0xc8, 0x74, 0x9a, 0xd0, 0xb0, 0x38, 0xe0, + 0x9e, 0x3b, 0x7e, 0x15, 0x41, 0xd6, 0x49, 0x22, + 0x8e, 0x26, 0x39, 0x48, 0xf3, 0xb4, 0x63, 0xa5, + 0x48, 0x92, 0xdc, 0xa2, 0x2a, 0x2c, 0x98, 0x55, + 0x52, 0xa0, 0x6d, 0x1c, 0x03, 0xd6, 0xad, 0x4d, + 0x05, 0xc2, 0x35, 0xb8, 0xbc, 0xd2, 0xed, 0x37, + 0xca, 0x5a, 0x61, 0x79, 0x85, 0x79, 0x3e, 0x6c, + 0x0c, 0x67, 0xf1, 0xa9, 0x6f, 0x14, 0xc9, 0xa5, + 0xea, 0x21, 0xa6, 0x9a, 0x66, 0x59, 0x14, 0x6e, + 0x91, 0x40, 0x01, 0x83, 0x00, 0x76, 0xd5, 0x75, + 0x33, 0x24, 0x4b, 0x12, 0xb9, 0x08, 0xaf, 0xbc, + 0x00, 0x3a, 0x37, 0xad, 0x4a, 0xd7, 0x37, 0x6e, + 0x5b, 0x74, 0xcc, 0x77, 0xae, 0xd2, 0x30, 0x31, + 0x8a, 0x39, 0xd0, 0xee, 0x59, 0x74, 0x23, 0x5a, + 0xbb, 0x91, 0x39, 0x99, 0x6d, 0x33, 0x1f, 0xfb, + 0xd8, 0xa3, 0x47, 0xdf, 0x3d, 0xad, 0xb3, 0xdd, + 0xb3, 0x49, 0x22, 0xce, 0xde, 0x5b, 0x3f, 0x27, + 0x1b, 0x4f, 0xf9, 0xfc, 0x2a, 0x93, 0x3d, 0xc3, + 0x5c, 0x0b, 0x83, 0x21, 0xf3, 0x47, 0x1b, 0x80, + 0xc5, 0x49, 0xe6, 0xcd, 0x35, 0xcc, 0x52, 0x5c, + 0x4d, 0x21, 0x08, 0x78, 0x2b, 0x80, 0x47, 0xd2, + 0x9f, 0xb4, 0x57, 0x0b, 0x91, 0x96, 0xba, 0x9b, + 0x43, 0xbf, 0xfb, 0x4b, 0x3b, 0x37, 0x9a, 0xb8, + 0x2d, 0xdb, 0xe6, 0x19, 0x15, 0x87, 0xe4, 0xb7, + 0xa9, 0xae, 0xa6, 0xee, 0x65, 0x7b, 0x59, 0x22, + 0xf3, 0xda, 0x76, 0x91, 0x87, 0x25, 0x76, 0xed, + 0x02, 0xb3, 0x3e, 0xcf, 0xed, 0x53, 0x29, 0x08, + 0xc9, 0xf2, 0x5b, 0xd4, 0xd1, 0xe4, 0xb7, 0xa9, + 0xad, 0x6f, 0xb3, 0xfb, 0x51, 0xf6, 0x7f, 0x6a, + 0x9e, 0x60, 0x32, 0x7c, 0x96, 0xf5, 0x34, 0x79, + 0x2d, 0xea, 0x6b, 0x5b, 0xec, 0xfe, 0xd4, 0x7d, + 0x9f, 0xda, 0x8e, 0x60, 0x32, 0x7c, 0x96, 0xf5, + 0x34, 0x79, 0x2d, 0xea, 0x6b, 0x5b, 0xec, 0xfe, + 0xd4, 0x7d, 0x9f, 0xda, 0x8e, 0x60, 0x32, 0x7c, + 0x96, 0xf5, 0x35, 0xd5, 0x5f, 0x7f, 0xc7, 0xe4, + 0x9f, 0x5f, 0xe9, 0x59, 0xb1, 0xd9, 0xb4, 0xb2, + 0x2a, 0x28, 0xc9, 0x63, 0x8a, 0xd1, 0xbb, 0x60, + 0xf7, 0x52, 0x30, 0xe9, 0x9a, 0xda, 0x96, 0xb7, + 0x1a, 0x25, 0x6f, 0xf5, 0x30, 0xff, 0x00, 0xbc, + 0x9f, 0xcc, 0x51, 0x4a, 0xff, 0x00, 0xea, 0x61, + 0xff, 0x00, 0x79, 0x3f, 0x98, 0xa2, 0xb6, 0x18, + 0xe8, 0x3e, 0xeb, 0xff, 0x00, 0xd7, 0x47, 0xfe, + 0x66, 0xa5, 0xa8, 0xed, 0xfe, 0xeb, 0xff, 0x00, + 0xd7, 0x47, 0xfe, 0x66, 0xa5, 0xa0, 0x0a, 0x17, + 0x3f, 0xeb, 0xdb, 0xf0, 0xfe, 0x54, 0xcd, 0x42, + 0xfc, 0x5a, 0x25, 0xaa, 0x49, 0x08, 0x96, 0x36, + 0x8f, 0x3d, 0x70, 0x41, 0xcf, 0xad, 0x3e, 0xe7, + 0xfd, 0x7b, 0x7e, 0x1f, 0xca, 0xb3, 0xbc, 0x41, + 0xf7, 0x6c, 0xbf, 0xeb, 0x99, 0xfe, 0x74, 0x35, + 0x70, 0x24, 0xfe, 0xd7, 0xb1, 0xff, 0x00, 0x9f, + 0x69, 0xbf, 0xef, 0xa1, 0x47, 0xf6, 0xbd, 0x87, + 0xfc, 0xfa, 0xcd, 0xff, 0x00, 0x7d, 0x8a, 0xc2, + 0xa2, 0xa3, 0x92, 0x3d, 0x82, 0xc6, 0xef, 0xf6, + 0xbd, 0x87, 0xfc, 0xfa, 0xcd, 0xff, 0x00, 0x7d, + 0x8a, 0x3f, 0xb5, 0xec, 0x3f, 0xe7, 0xd6, 0x6f, + 0xfb, 0xec, 0x56, 0x15, 0x14, 0x72, 0x47, 0xb0, + 0x58, 0xdd, 0xfe, 0xd7, 0xb0, 0xff, 0x00, 0x9f, + 0x59, 0xbf, 0xef, 0xb1, 0x47, 0xf6, 0xbd, 0x87, + 0xfc, 0xfa, 0xcd, 0xff, 0x00, 0x7d, 0x8a, 0xc2, + 0xa0, 0x72, 0x71, 0x47, 0x24, 0x7b, 0x05, 0x8d, + 0xdf, 0xed, 0x7b, 0x0f, 0xf9, 0xf5, 0x9b, 0xfe, + 0xfb, 0x14, 0x7f, 0x6b, 0xd8, 0x7f, 0xcf, 0xac, + 0xdf, 0xf7, 0xd8, 0xaa, 0x57, 0x16, 0x31, 0x28, + 0x95, 0x22, 0x32, 0x79, 0x91, 0x4a, 0xb1, 0x92, + 0xe4, 0x61, 0xc9, 0xcf, 0x23, 0xd3, 0xa5, 0x53, + 0x78, 0x25, 0x8d, 0x37, 0x48, 0x85, 0x46, 0xe2, + 0x9c, 0xfa, 0x8e, 0xb4, 0x72, 0x47, 0xb0, 0x58, + 0xd9, 0xfe, 0xd7, 0xb0, 0xff, 0x00, 0x9f, 0x59, + 0xbf, 0xef, 0xb1, 0x47, 0xf6, 0xbd, 0x87, 0xfc, + 0xfa, 0xcd, 0xff, 0x00, 0x7d, 0x8a, 0xce, 0x5b, + 0x44, 0x6d, 0x29, 0xae, 0x83, 0x37, 0x98, 0xb2, + 0xed, 0x23, 0xb6, 0xde, 0x39, 0xfc, 0xd8, 0x54, + 0xff, 0x00, 0xd9, 0xd1, 0x2d, 0xb4, 0x13, 0x49, + 0x23, 0xa8, 0xf2, 0xda, 0x49, 0x71, 0xd8, 0x7c, + 0xbb, 0x40, 0xf7, 0x3b, 0x85, 0x1c, 0x91, 0xec, + 0x16, 0x2d, 0x7f, 0x6b, 0xd8, 0x7f, 0xcf, 0xac, + 0xdf, 0xf7, 0xd8, 0xa3, 0xfb, 0x5e, 0xc3, 0xfe, + 0x7d, 0x66, 0xff, 0x00, 0xbe, 0xc5, 0x65, 0x5c, + 0x2d, 0xa9, 0x8d, 0x5e, 0xdd, 0xa4, 0x07, 0x38, + 0x68, 0xe4, 0xe4, 0xfd, 0x72, 0x2a, 0x74, 0x82, + 0xcd, 0x60, 0xb6, 0x69, 0x84, 0xe5, 0xe6, 0x04, + 0xe5, 0x18, 0x60, 0x7c, 0xc4, 0x74, 0xc7, 0xb7, + 0xad, 0x1c, 0x91, 0xec, 0x16, 0x2f, 0x7f, 0x6b, + 0xd8, 0x7f, 0xcf, 0xac, 0xdf, 0xf7, 0xd8, 0xa3, + 0xfb, 0x5e, 0xc3, 0xfe, 0x7d, 0x66, 0xff, 0x00, + 0xbe, 0xc5, 0x52, 0x6d, 0x3d, 0x44, 0xb0, 0x44, + 0x18, 0x92, 0xd3, 0xb4, 0x2e, 0x7b, 0x02, 0x08, + 0xe4, 0x7e, 0x06, 0x9f, 0x16, 0x9f, 0x0b, 0x5e, + 0x4d, 0x13, 0x33, 0xf9, 0x6b, 0x22, 0x22, 0x10, + 0x79, 0x3b, 0x98, 0x63, 0xff, 0x00, 0x1d, 0xcd, + 0x1c, 0x91, 0xec, 0x16, 0x2d, 0x7f, 0x6b, 0xd8, + 0x7f, 0xcf, 0xac, 0xdf, 0xf7, 0xd8, 0xa3, 0xfb, + 0x5e, 0xc3, 0xfe, 0x7d, 0x66, 0xff, 0x00, 0xbe, + 0xc5, 0x54, 0x83, 0x4e, 0x8e, 0x4d, 0x55, 0xed, + 0x99, 0xd8, 0x42, 0xbf, 0x36, 0xe1, 0xd7, 0x69, + 0xfb, 0xbf, 0xcc, 0x56, 0x6d, 0x1c, 0x91, 0xec, + 0x16, 0x37, 0x7f, 0xb5, 0xec, 0x3f, 0xe7, 0xd6, + 0x6f, 0xfb, 0xec, 0x51, 0xfd, 0xaf, 0x61, 0xff, + 0x00, 0x3e, 0xb3, 0x7f, 0xdf, 0x62, 0xb0, 0xa8, + 0xa3, 0x92, 0x3d, 0x82, 0xc6, 0xef, 0xf6, 0xbd, + 0x87, 0xfc, 0xfa, 0xcd, 0xff, 0x00, 0x7d, 0x8a, + 0x3f, 0xb5, 0xec, 0x3f, 0xe7, 0xd6, 0x6f, 0xfb, + 0xec, 0x56, 0x15, 0x14, 0x72, 0x47, 0xb0, 0x58, + 0xdd, 0xfe, 0xd7, 0xb0, 0xff, 0x00, 0x9f, 0x59, + 0xbf, 0xef, 0xb1, 0x57, 0x6c, 0xef, 0x23, 0x9e, + 0xce, 0x79, 0x60, 0x84, 0xc4, 0x55, 0x82, 0x6e, + 0x27, 0x27, 0x07, 0xf9, 0x57, 0x2b, 0x5b, 0xda, + 0x2f, 0xfc, 0x82, 0xee, 0x7f, 0xeb, 0xa2, 0xff, + 0x00, 0x2a, 0x6a, 0x31, 0x5b, 0x20, 0x27, 0xa2, + 0x8a, 0x2a, 0x80, 0x35, 0x4d, 0x4c, 0x5b, 0x5e, + 0x79, 0x4f, 0x6c, 0x93, 0x0d, 0x8a, 0x73, 0x92, + 0xa6, 0xa9, 0xff, 0x00, 0x6d, 0xc3, 0xff, 0x00, + 0x40, 0xf5, 0xff, 0x00, 0xbf, 0xa6, 0xa2, 0xf1, + 0x0f, 0xfc, 0x84, 0x87, 0xfd, 0x72, 0x5f, 0xe5, + 0x59, 0x75, 0x3c, 0xa9, 0xf4, 0x03, 0x67, 0xfb, + 0x6e, 0x1f, 0xfa, 0x07, 0xaf, 0xfd, 0xfd, 0x34, + 0x7f, 0x6d, 0xc3, 0xff, 0x00, 0x40, 0xf5, 0xff, + 0x00, 0xbf, 0xa6, 0xb1, 0xa8, 0xa3, 0x92, 0x3d, + 0x80, 0xd9, 0xfe, 0xdb, 0x87, 0xfe, 0x81, 0xeb, + 0xff, 0x00, 0x7f, 0x4d, 0x1f, 0xdb, 0x70, 0xff, + 0x00, 0xd0, 0x3d, 0x7f, 0xef, 0xe9, 0xac, 0x6a, + 0x28, 0xe4, 0x8f, 0x60, 0x36, 0x7f, 0xb6, 0xe1, + 0xff, 0x00, 0xa0, 0x7a, 0xff, 0x00, 0xdf, 0xd3, + 0x47, 0xf6, 0xdc, 0x3f, 0xf4, 0x0f, 0x5f, 0xfb, + 0xfa, 0x6b, 0x1a, 0xa6, 0xb4, 0x54, 0x6b, 0xb8, + 0x56, 0x50, 0x4c, 0x65, 0xd4, 0x30, 0x1d, 0x48, + 0xcd, 0x1c, 0x91, 0xec, 0x06, 0x9f, 0xf6, 0xdc, + 0x3f, 0xf4, 0x0f, 0x5f, 0xfb, 0xfa, 0x68, 0xfe, + 0xdb, 0x87, 0xfe, 0x81, 0xeb, 0xff, 0x00, 0x7f, + 0x4d, 0x45, 0x77, 0x00, 0x2b, 0x0a, 0xdc, 0x08, + 0x61, 0x91, 0xa4, 0x65, 0xdf, 0x12, 0x8d, 0xb8, + 0xc0, 0xc6, 0x71, 0xef, 0xf8, 0xd5, 0x2b, 0xab, + 0x63, 0x6a, 0xeb, 0x1b, 0xb7, 0xef, 0x71, 0x97, + 0x51, 0xfc, 0x3e, 0x83, 0x34, 0x72, 0x47, 0xb0, + 0x1a, 0x5f, 0xdb, 0x70, 0xff, 0x00, 0xd0, 0x3d, + 0x7f, 0xef, 0xe9, 0xa3, 0xfb, 0x6e, 0x1f, 0xfa, + 0x07, 0xaf, 0xfd, 0xfd, 0x35, 0x59, 0xe3, 0x8c, + 0x6a, 0x36, 0x69, 0xb1, 0x76, 0xb2, 0x43, 0x91, + 0x8e, 0x0e, 0x42, 0xe6, 0x9d, 0x68, 0x90, 0x25, + 0xc5, 0xc4, 0xb3, 0xa2, 0x98, 0x83, 0x88, 0x80, + 0x23, 0x81, 0xb8, 0xf5, 0xfc, 0x00, 0x34, 0x72, + 0x47, 0xb0, 0x13, 0xff, 0x00, 0x6d, 0xc3, 0xff, + 0x00, 0x40, 0xf5, 0xff, 0x00, 0xbf, 0xa6, 0x8f, + 0xed, 0xb8, 0x7f, 0xe8, 0x1e, 0xbf, 0xf7, 0xf4, + 0xd4, 0x36, 0x90, 0x4d, 0x1c, 0x37, 0x8b, 0x1d, + 0xb2, 0xcd, 0x3c, 0x72, 0x22, 0xe0, 0xc4, 0x1f, + 0x1f, 0x7b, 0x3c, 0x63, 0xda, 0xac, 0xc6, 0x42, + 0x5d, 0x5b, 0x45, 0x25, 0xad, 0xba, 0xc9, 0x22, + 0x96, 0x95, 0x0c, 0x2b, 0xc1, 0xe7, 0x1f, 0x4e, + 0x00, 0xe2, 0x8e, 0x48, 0xf6, 0x01, 0x9f, 0xdb, + 0x70, 0xff, 0x00, 0xd0, 0x3d, 0x7f, 0xef, 0xe9, + 0xa3, 0xfb, 0x6e, 0x1f, 0xfa, 0x07, 0xaf, 0xfd, + 0xfd, 0x35, 0x95, 0x34, 0xa6, 0x67, 0xde, 0xcb, + 0x1a, 0x9c, 0x63, 0x08, 0x81, 0x47, 0xe4, 0x2a, + 0x3a, 0x39, 0x23, 0xd8, 0x0d, 0x9f, 0xed, 0xb8, + 0x7f, 0xe8, 0x1e, 0xbf, 0xf7, 0xf4, 0xd1, 0xfd, + 0xb7, 0x0f, 0xfd, 0x03, 0xd7, 0xfe, 0xfe, 0x9a, + 0xc6, 0xa2, 0x8e, 0x48, 0xf6, 0x03, 0x67, 0xfb, + 0x6e, 0x1f, 0xfa, 0x07, 0xaf, 0xfd, 0xfd, 0x34, + 0x7f, 0x6d, 0xc3, 0xff, 0x00, 0x40, 0xf5, 0xff, + 0x00, 0xbf, 0xa6, 0xb1, 0xa8, 0xa3, 0x92, 0x3d, + 0x80, 0xd9, 0xfe, 0xdb, 0x87, 0xfe, 0x81, 0xeb, + 0xff, 0x00, 0x7f, 0x4d, 0x23, 0x6b, 0x69, 0x8f, + 0x92, 0xc6, 0x30, 0xde, 0xac, 0xe5, 0x87, 0xe5, + 0x58, 0xf4, 0x51, 0xcb, 0x1e, 0xc0, 0x75, 0xb7, + 0x8c, 0x5e, 0x48, 0xc9, 0xef, 0x1a, 0x9c, 0x0e, + 0x83, 0x8a, 0xaf, 0x53, 0x5d, 0x7d, 0xe8, 0xff, + 0x00, 0xeb, 0x92, 0xff, 0x00, 0x2a, 0x86, 0xa8, + 0x07, 0x6a, 0x1a, 0x80, 0xb4, 0x4b, 0x55, 0x78, + 0x16, 0x64, 0x68, 0xf3, 0xc9, 0xc1, 0x1c, 0xfa, + 0xd5, 0x2f, 0xed, 0xab, 0x6f, 0xfa, 0x07, 0x9f, + 0xfb, 0xfd, 0xff, 0x00, 0xd6, 0xa7, 0xeb, 0x56, + 0xf2, 0xce, 0x2d, 0x7c, 0xa4, 0x2d, 0xb2, 0x12, + 0xcd, 0xec, 0x2b, 0x26, 0x1b, 0x49, 0xe7, 0x42, + 0xf1, 0x47, 0xb9, 0x73, 0x8e, 0xa0, 0x64, 0xfa, + 0x0f, 0x5f, 0xc2, 0xa5, 0xc5, 0x3d, 0xd0, 0x1a, + 0x7f, 0xdb, 0x56, 0xdf, 0xf4, 0x0f, 0x3f, 0xf7, + 0xfb, 0xff, 0x00, 0xad, 0x47, 0xf6, 0xd5, 0xb7, + 0xfd, 0x03, 0xcf, 0xfd, 0xfe, 0xff, 0x00, 0xeb, + 0x56, 0x30, 0x19, 0x20, 0x0e, 0xe6, 0x9d, 0x34, + 0x4d, 0x0c, 0xd2, 0x42, 0xc4, 0x16, 0x8d, 0x8a, + 0x9c, 0x74, 0xe2, 0x8e, 0x48, 0xf6, 0x03, 0x5f, + 0xfb, 0x6a, 0xdb, 0xfe, 0x81, 0xe7, 0xfe, 0xff, + 0x00, 0x7f, 0xf5, 0xa8, 0xfe, 0xda, 0xb6, 0xff, + 0x00, 0xa0, 0x79, 0xff, 0x00, 0xbf, 0xdf, 0xfd, + 0x6a, 0xc9, 0x82, 0x09, 0x6e, 0x25, 0x11, 0x42, + 0x85, 0xdc, 0xf6, 0x15, 0x19, 0x04, 0x1c, 0x1a, + 0x39, 0x23, 0xd8, 0x0d, 0xaf, 0xed, 0xab, 0x6f, + 0xfa, 0x07, 0x9f, 0xfb, 0xfd, 0xff, 0x00, 0xd6, + 0xa3, 0xfb, 0x6a, 0xdb, 0xfe, 0x81, 0xe7, 0xfe, + 0xff, 0x00, 0x7f, 0xf5, 0xab, 0x36, 0x4b, 0x2b, + 0x88, 0xe3, 0x2e, 0xd1, 0x80, 0x17, 0x96, 0x1b, + 0x81, 0x2b, 0xf5, 0x1d, 0x45, 0x36, 0x6b, 0x69, + 0x21, 0x44, 0x76, 0x03, 0x6b, 0xf4, 0x20, 0xfb, + 0x03, 0x8f, 0xc9, 0x85, 0x1c, 0x91, 0xec, 0x06, + 0xa7, 0xf6, 0xd5, 0xb7, 0xfd, 0x03, 0xcf, 0xfd, + 0xfe, 0xff, 0x00, 0xeb, 0x51, 0xfd, 0xb5, 0x6d, + 0xff, 0x00, 0x40, 0xf3, 0xff, 0x00, 0x7f, 0xbf, + 0xfa, 0xd5, 0x91, 0x24, 0x6f, 0x13, 0xec, 0x71, + 0x86, 0xc0, 0x38, 0xfa, 0x8c, 0x8a, 0x90, 0xd9, + 0xdc, 0x89, 0x23, 0x43, 0x11, 0x0f, 0x22, 0xee, + 0x50, 0x7d, 0x3f, 0xa7, 0x4e, 0xf4, 0x72, 0x47, + 0xb0, 0x1a, 0x7f, 0xdb, 0x56, 0xdf, 0xf4, 0x0f, + 0x3f, 0xf7, 0xfb, 0xff, 0x00, 0xad, 0x47, 0xf6, + 0xd5, 0xb7, 0xfd, 0x03, 0xcf, 0xfd, 0xfe, 0xff, + 0x00, 0xeb, 0x56, 0x4c, 0xd0, 0xc9, 0x03, 0x84, + 0x91, 0x40, 0x24, 0x64, 0x60, 0x82, 0x08, 0xf6, + 0x22, 0x89, 0xa2, 0x68, 0x64, 0xd8, 0xe4, 0x67, + 0x0a, 0xd9, 0x1e, 0xe0, 0x1f, 0xeb, 0x47, 0x24, + 0x7b, 0x01, 0xad, 0xfd, 0xb5, 0x6d, 0xff, 0x00, + 0x40, 0xf3, 0xff, 0x00, 0x7f, 0xbf, 0xfa, 0xd4, + 0x7f, 0x6d, 0x5b, 0x7f, 0xd0, 0x3c, 0xff, 0x00, + 0xdf, 0xef, 0xfe, 0xb5, 0x64, 0x3c, 0x6c, 0x9c, + 0xe4, 0x32, 0x6e, 0x2a, 0x1c, 0x74, 0x38, 0xf4, + 0xfc, 0xc5, 0x48, 0xb6, 0x93, 0xb4, 0x1e, 0x70, + 0x8f, 0xe4, 0xc1, 0x3d, 0x46, 0x70, 0x3a, 0x9c, + 0x75, 0xc5, 0x1c, 0x91, 0xec, 0x06, 0x9f, 0xf6, + 0xd5, 0xb7, 0xfd, 0x03, 0xcf, 0xfd, 0xfe, 0xff, + 0x00, 0xeb, 0x51, 0xfd, 0xb5, 0x6d, 0xff, 0x00, + 0x40, 0xf3, 0xff, 0x00, 0x7f, 0xbf, 0xfa, 0xd5, + 0x92, 0x90, 0x48, 0xf0, 0xc9, 0x32, 0xae, 0x63, + 0x8f, 0x1b, 0xce, 0x7a, 0x67, 0xa5, 0x39, 0x6d, + 0x27, 0x74, 0x8d, 0xd6, 0x32, 0x44, 0xa4, 0xaa, + 0x7b, 0xe3, 0xad, 0x1c, 0x91, 0xec, 0x06, 0xa7, + 0xf6, 0xd5, 0xb7, 0xfd, 0x03, 0xcf, 0xfd, 0xfe, + 0xff, 0x00, 0xeb, 0x51, 0xfd, 0xb5, 0x6d, 0xff, + 0x00, 0x40, 0xf3, 0xff, 0x00, 0x7f, 0xbf, 0xfa, + 0xd5, 0x9d, 0xf6, 0x1b, 0x9f, 0x31, 0x10, 0x22, + 0x92, 0xf9, 0xda, 0x44, 0x8a, 0x47, 0x03, 0x27, + 0x9c, 0xe2, 0x9b, 0x2d, 0xa4, 0xf1, 0x14, 0x0c, + 0x80, 0xef, 0x38, 0x52, 0x8c, 0x18, 0x13, 0xe9, + 0x91, 0x47, 0x24, 0x7b, 0x01, 0xa7, 0xfd, 0xb5, + 0x6d, 0xff, 0x00, 0x40, 0xf3, 0xff, 0x00, 0x7f, + 0xbf, 0xfa, 0xd4, 0x7f, 0x6d, 0x5b, 0x7f, 0xd0, + 0x3c, 0xff, 0x00, 0xdf, 0xef, 0xfe, 0xb5, 0x66, + 0x4d, 0x69, 0x3c, 0x09, 0xbd, 0xd4, 0x6d, 0xce, + 0xd2, 0x55, 0x83, 0x60, 0xfa, 0x1c, 0x1e, 0x29, + 0x89, 0x04, 0xb2, 0x45, 0x24, 0xa8, 0x99, 0x48, + 0xf1, 0xbc, 0xfa, 0x66, 0x8e, 0x48, 0xf6, 0x03, + 0x5b, 0xfb, 0x6a, 0xdb, 0xfe, 0x81, 0xe7, 0xfe, + 0xff, 0x00, 0x7f, 0xf5, 0xa8, 0xfe, 0xda, 0xb6, + 0xff, 0x00, 0xa0, 0x79, 0xff, 0x00, 0xbf, 0xdf, + 0xfd, 0x6a, 0xce, 0x8e, 0xc6, 0xe6, 0x58, 0xd2, + 0x44, 0x45, 0x21, 0xc6, 0x54, 0x6f, 0x5d, 0xcd, + 0xce, 0x38, 0x19, 0xcf, 0x6a, 0x64, 0x36, 0xb3, + 0xce, 0x18, 0xa2, 0x0c, 0x29, 0xc1, 0x2c, 0xc1, + 0x40, 0x3e, 0x99, 0x34, 0x72, 0x47, 0xb0, 0x1d, + 0x1d, 0x95, 0xea, 0xdc, 0xd9, 0x4f, 0x2c, 0x50, + 0x08, 0x0a, 0xb0, 0x5e, 0x1b, 0x71, 0xfc, 0xea, + 0x3a, 0x8b, 0x4a, 0x8d, 0xe1, 0xd3, 0xee, 0xa3, + 0x91, 0x4a, 0xba, 0xca, 0xb9, 0x07, 0xe9, 0x52, + 0xd3, 0x4a, 0xdb, 0x01, 0x71, 0xff, 0x00, 0xd4, + 0x43, 0xfe, 0xf2, 0x7f, 0x31, 0x45, 0x0f, 0xfe, + 0xa2, 0x1f, 0xf7, 0x93, 0xf9, 0x8a, 0x29, 0x80, + 0xfb, 0x7f, 0xba, 0xff, 0x00, 0xf5, 0xd1, 0xff, + 0x00, 0x99, 0xa9, 0x6a, 0x2b, 0x7f, 0xba, 0xff, + 0x00, 0xf5, 0xd1, 0xff, 0x00, 0x99, 0xa9, 0x68, + 0x02, 0x85, 0xcf, 0xfa, 0xf6, 0xfc, 0x3f, 0x95, + 0x67, 0x78, 0x83, 0xee, 0xd9, 0x7f, 0xd7, 0x33, + 0xfc, 0xeb, 0x46, 0xe7, 0xfe, 0x3e, 0x1b, 0xf0, + 0xfe, 0x55, 0x06, 0xa6, 0xf6, 0x4b, 0x05, 0xa3, + 0x5d, 0x41, 0x24, 0x8c, 0x55, 0x82, 0xec, 0x7c, + 0x63, 0x06, 0x80, 0x39, 0xca, 0x2b, 0x4b, 0xce, + 0xd1, 0xff, 0x00, 0xe7, 0xd2, 0xe3, 0xfe, 0xfe, + 0x51, 0xe7, 0x68, 0xff, 0x00, 0xf3, 0xe9, 0x71, + 0xff, 0x00, 0x7f, 0x28, 0x03, 0x36, 0x8a, 0xd2, + 0xf3, 0xb4, 0x7f, 0xf9, 0xf4, 0xb8, 0xff, 0x00, + 0xbf, 0x94, 0x79, 0xda, 0x3f, 0xfc, 0xfa, 0x5c, + 0x7f, 0xdf, 0xca, 0x00, 0xcd, 0xa5, 0x5c, 0x6e, + 0x1b, 0x81, 0x2b, 0x9e, 0x6b, 0x47, 0xce, 0xd1, + 0xff, 0x00, 0xe7, 0xd2, 0xe3, 0xfe, 0xfe, 0x51, + 0xe7, 0x68, 0xff, 0x00, 0xf3, 0xe9, 0x71, 0xff, + 0x00, 0x7f, 0x28, 0x02, 0x5b, 0xc9, 0x51, 0xe3, + 0x94, 0x4d, 0x70, 0x92, 0x42, 0x64, 0x5f, 0x21, + 0x63, 0x60, 0x4a, 0x2e, 0x7b, 0x0e, 0xdc, 0x76, + 0x35, 0x52, 0xf6, 0xed, 0x6e, 0xc2, 0x12, 0x8c, + 0xaf, 0x1f, 0xca, 0x39, 0xc8, 0xdb, 0xdb, 0xf1, + 0xfe, 0x75, 0x37, 0x9d, 0xa3, 0xff, 0x00, 0xcf, + 0xa5, 0xc7, 0xfd, 0xfc, 0xa3, 0xce, 0xd1, 0xff, + 0x00, 0xe7, 0xd2, 0xe3, 0xfe, 0xfe, 0x50, 0x01, + 0x65, 0x24, 0x5f, 0x66, 0x8a, 0x09, 0x24, 0x55, + 0x59, 0x24, 0x91, 0x1f, 0x27, 0xee, 0x82, 0xab, + 0x82, 0x7f, 0x11, 0xfa, 0x54, 0xed, 0x73, 0x04, + 0xf0, 0x3c, 0x2d, 0x22, 0xa2, 0xcc, 0x64, 0x55, + 0x24, 0xfd, 0xcc, 0x14, 0x2b, 0x9f, 0x6f, 0x97, + 0x15, 0x07, 0x9d, 0xa3, 0xff, 0x00, 0xcf, 0xa5, + 0xc7, 0xfd, 0xfc, 0xa3, 0xce, 0xd1, 0xff, 0x00, + 0xe7, 0xd2, 0xe3, 0xfe, 0xfe, 0x50, 0x05, 0x59, + 0xed, 0xd2, 0x08, 0xd7, 0x33, 0xa3, 0xca, 0x4f, + 0xdd, 0x8d, 0xb7, 0x00, 0x3e, 0xb5, 0x65, 0xaf, + 0x5a, 0x0b, 0x3b, 0x35, 0x84, 0xc4, 0x5d, 0x55, + 0xb2, 0x4a, 0x2b, 0x32, 0x9d, 0xc7, 0xb9, 0xe9, + 0x4b, 0xe7, 0x68, 0xff, 0x00, 0xf3, 0xe9, 0x71, + 0xff, 0x00, 0x7f, 0x28, 0xf3, 0xb4, 0x7f, 0xf9, + 0xf4, 0xb8, 0xff, 0x00, 0xbf, 0x94, 0x00, 0x58, + 0x4e, 0x82, 0xda, 0xe4, 0xcb, 0x20, 0x12, 0x26, + 0x64, 0x4d, 0xc7, 0x96, 0x62, 0xac, 0xbf, 0xd4, + 0x1f, 0xc2, 0xa7, 0x5b, 0x88, 0x76, 0xe9, 0xed, + 0xe6, 0x26, 0xe7, 0x96, 0x33, 0x2f, 0x3f, 0x77, + 0x67, 0xca, 0x33, 0x50, 0x79, 0xda, 0x3f, 0xfc, + 0xfa, 0x5c, 0x7f, 0xdf, 0xca, 0x3c, 0xed, 0x1f, + 0xfe, 0x7d, 0x2e, 0x3f, 0xef, 0xe5, 0x00, 0x4f, + 0x6f, 0x73, 0x08, 0xfb, 0x33, 0x99, 0x14, 0x48, + 0xd2, 0x2a, 0x3e, 0x4f, 0x45, 0x52, 0x4e, 0x7f, + 0x55, 0xff, 0x00, 0xbe, 0x6b, 0x1a, 0xb4, 0xbc, + 0xed, 0x1f, 0xfe, 0x7d, 0x2e, 0x3f, 0xef, 0xe5, + 0x1e, 0x76, 0x8f, 0xff, 0x00, 0x3e, 0x97, 0x1f, + 0xf7, 0xf2, 0x80, 0x33, 0x68, 0xad, 0x2f, 0x3b, + 0x47, 0xff, 0x00, 0x9f, 0x4b, 0x8f, 0xfb, 0xf9, + 0x47, 0x9d, 0xa3, 0xff, 0x00, 0xcf, 0xa5, 0xc7, + 0xfd, 0xfc, 0xa0, 0x0c, 0xda, 0x2b, 0x4b, 0xce, + 0xd1, 0xff, 0x00, 0xe7, 0xd2, 0xe3, 0xfe, 0xfe, + 0x51, 0xe7, 0x68, 0xff, 0x00, 0xf3, 0xe9, 0x71, + 0xff, 0x00, 0x7f, 0x28, 0x03, 0x36, 0xb7, 0xb4, + 0x5f, 0xf9, 0x05, 0xdc, 0xff, 0x00, 0xd7, 0x45, + 0xaa, 0x7e, 0x76, 0x8f, 0xff, 0x00, 0x3e, 0x97, + 0x1f, 0xf7, 0xf2, 0xb4, 0xec, 0x64, 0xb5, 0x6d, + 0x36, 0x7f, 0xb2, 0xc4, 0xf1, 0xaf, 0x98, 0xa0, + 0xef, 0x6c, 0xe6, 0x80, 0x0a, 0x28, 0xa2, 0x80, + 0x33, 0xbc, 0x43, 0xff, 0x00, 0x21, 0x21, 0xff, + 0x00, 0x5c, 0x97, 0xf9, 0x56, 0x5d, 0x74, 0xfa, + 0x9e, 0xad, 0xf6, 0x3b, 0x95, 0x87, 0xec, 0x91, + 0x49, 0x84, 0x53, 0xb9, 0xba, 0xf4, 0xaa, 0x7f, + 0xf0, 0x90, 0x7f, 0xd3, 0x85, 0xbf, 0xe5, 0x40, + 0x18, 0x94, 0x56, 0xdf, 0xfc, 0x24, 0x1f, 0xf4, + 0xe1, 0x6f, 0xf9, 0x51, 0xff, 0x00, 0x09, 0x07, + 0xfd, 0x38, 0x5b, 0xfe, 0x54, 0x01, 0x89, 0x45, + 0x6d, 0xff, 0x00, 0xc2, 0x41, 0xff, 0x00, 0x4e, + 0x16, 0xff, 0x00, 0x95, 0x1f, 0xf0, 0x90, 0x7f, + 0xd3, 0x85, 0xbf, 0xe5, 0x40, 0x18, 0x95, 0x2d, + 0xac, 0xdf, 0x67, 0xb9, 0x8a, 0x6c, 0x6e, 0xd8, + 0xc0, 0xe3, 0xd6, 0xb5, 0xbf, 0xe1, 0x20, 0xff, + 0x00, 0xa7, 0x0b, 0x7f, 0xca, 0x9c, 0xfa, 0xeb, + 0xc6, 0xc5, 0x5f, 0x4d, 0x85, 0x58, 0x75, 0x0c, + 0xb8, 0x34, 0x01, 0x9e, 0x6e, 0xa1, 0x82, 0x34, + 0x4b, 0x50, 0xed, 0xb6, 0x43, 0x26, 0x65, 0x51, + 0xc1, 0xc6, 0x07, 0x00, 0xf6, 0xaa, 0xf3, 0x4f, + 0x24, 0xe1, 0x3c, 0xd3, 0xb9, 0x94, 0x63, 0x71, + 0xea, 0x47, 0xbd, 0x6b, 0x7f, 0xc2, 0x41, 0xff, + 0x00, 0x4e, 0x16, 0xff, 0x00, 0x95, 0x48, 0xfa, + 0xc4, 0xc9, 0x18, 0x91, 0xf4, 0xa8, 0xd5, 0x0f, + 0x46, 0x28, 0x40, 0x3f, 0x8e, 0x28, 0x02, 0x84, + 0x77, 0x76, 0xbb, 0xa0, 0x9e, 0x54, 0x94, 0xcf, + 0x0a, 0xa8, 0x0a, 0xb8, 0xda, 0xdb, 0x7e, 0xee, + 0x4f, 0x6e, 0xd4, 0xc1, 0x7f, 0x2c, 0x56, 0xea, + 0x96, 0xf2, 0xc9, 0x1b, 0x96, 0x67, 0x95, 0x94, + 0xe3, 0x71, 0x3d, 0x3f, 0x97, 0xeb, 0x5a, 0x51, + 0xeb, 0x13, 0x4a, 0xac, 0xd1, 0xe9, 0x51, 0xba, + 0xaf, 0x52, 0xa8, 0x48, 0x1f, 0xa5, 0x11, 0xeb, + 0x13, 0x4a, 0xac, 0xd1, 0xe9, 0x51, 0xba, 0xaf, + 0x52, 0xa8, 0x48, 0x1f, 0xa5, 0x00, 0x67, 0xcf, + 0x7a, 0x92, 0x45, 0x36, 0x03, 0x89, 0x26, 0xf2, + 0xcb, 0x1f, 0xf6, 0x94, 0x10, 0xdf, 0x9e, 0x68, + 0x5b, 0xc8, 0xbe, 0xd7, 0x05, 0xcb, 0x2b, 0x6f, + 0x55, 0xc4, 0xb8, 0x1f, 0x78, 0xe3, 0x00, 0x8f, + 0xc3, 0x15, 0x77, 0xfb, 0x75, 0xb6, 0x6f, 0xfe, + 0xce, 0x83, 0x6e, 0x71, 0x9d, 0xbc, 0x66, 0xa4, + 0x5d, 0x5a, 0xe1, 0x83, 0x6d, 0xd2, 0x11, 0xb6, + 0xfd, 0xec, 0x46, 0x78, 0xfd, 0x28, 0x03, 0x9f, + 0xa2, 0xba, 0x08, 0xb5, 0x6b, 0x89, 0xd4, 0xb4, + 0x3a, 0x42, 0x48, 0xa0, 0xe0, 0x94, 0x8c, 0x91, + 0xfc, 0xa9, 0x9f, 0xdb, 0x8e, 0x03, 0x13, 0xa6, + 0xc3, 0x85, 0x38, 0x6f, 0x97, 0xa7, 0xd6, 0x80, + 0x30, 0xa8, 0xad, 0xbf, 0xf8, 0x48, 0x3f, 0xe9, + 0xc2, 0xdf, 0xf2, 0xa3, 0xfe, 0x12, 0x0f, 0xfa, + 0x70, 0xb7, 0xfc, 0xa8, 0x03, 0x12, 0x8a, 0xdb, + 0xff, 0x00, 0x84, 0x83, 0xfe, 0x9c, 0x2d, 0xff, + 0x00, 0x2a, 0x3f, 0xe1, 0x20, 0xff, 0x00, 0xa7, + 0x0b, 0x7f, 0xca, 0x80, 0x31, 0x28, 0xad, 0xbf, + 0xf8, 0x48, 0x3f, 0xe9, 0xc2, 0xdf, 0xf2, 0xa3, + 0xfe, 0x12, 0x0f, 0xfa, 0x70, 0xb7, 0xfc, 0xa8, + 0x03, 0x42, 0xeb, 0xef, 0x47, 0xff, 0x00, 0x5c, + 0x97, 0xf9, 0x54, 0x35, 0x62, 0xf5, 0xb7, 0xca, + 0xad, 0x8c, 0x6e, 0x45, 0x38, 0x1d, 0xb8, 0xaa, + 0xf4, 0x00, 0xeb, 0xb8, 0x66, 0x96, 0x7b, 0x5f, + 0x2e, 0x37, 0x65, 0x16, 0xf2, 0x67, 0x68, 0xc8, + 0x04, 0xab, 0x01, 0x59, 0x76, 0x76, 0x97, 0x51, + 0xaf, 0xda, 0x04, 0x13, 0x3b, 0xc4, 0xe4, 0x47, + 0x18, 0x52, 0x70, 0xfe, 0xa7, 0xd3, 0x1c, 0x7d, + 0x6b, 0x43, 0x55, 0xb5, 0x86, 0x78, 0xed, 0x0c, + 0x97, 0x91, 0xc0, 0x44, 0x7d, 0x1c, 0x1e, 0x79, + 0xac, 0xef, 0xec, 0xeb, 0x5f, 0xfa, 0x0a, 0x5b, + 0xfe, 0x46, 0x80, 0x1c, 0x44, 0xff, 0x00, 0x63, + 0x8b, 0xc9, 0xc7, 0xd9, 0xbc, 0xbf, 0xde, 0x67, + 0xa6, 0xfd, 0xc7, 0x39, 0xff, 0x00, 0x6b, 0xa5, + 0x3e, 0xf9, 0xa5, 0xb9, 0xfb, 0x64, 0x67, 0x2e, + 0x56, 0xf0, 0x24, 0x63, 0xd3, 0x3b, 0xf8, 0x1f, + 0x90, 0xa8, 0xbf, 0xb3, 0xad, 0x7f, 0xe8, 0x29, + 0x6f, 0xf9, 0x1a, 0x55, 0xb0, 0xb7, 0x46, 0x56, + 0x5d, 0x56, 0xdf, 0x20, 0xe4, 0x70, 0x68, 0x02, + 0x0d, 0x32, 0x29, 0x5f, 0x52, 0x85, 0x51, 0x19, + 0xb6, 0xc8, 0xa5, 0xc2, 0x8e, 0x80, 0x30, 0xeb, + 0x50, 0x4f, 0x14, 0x91, 0x4e, 0xc9, 0x22, 0x14, + 0x6c, 0xf4, 0x61, 0x8a, 0xba, 0x74, 0xeb, 0x62, + 0x72, 0x75, 0x5b, 0x7c, 0xfd, 0x0d, 0x1f, 0xd9, + 0xd6, 0xbf, 0xf4, 0x14, 0xb7, 0xfc, 0x8d, 0x00, + 0x4d, 0x25, 0xb4, 0x97, 0x06, 0x43, 0x3c, 0x1e, + 0x54, 0xad, 0xd2, 0x74, 0x6f, 0x96, 0x56, 0x24, + 0x7e, 0x79, 0xf6, 0xa6, 0xdc, 0x5c, 0x45, 0xf6, + 0x52, 0xe6, 0x04, 0x99, 0x4d, 0xcc, 0x81, 0x37, + 0x16, 0x18, 0x01, 0x57, 0x1d, 0x08, 0xed, 0x51, + 0xff, 0x00, 0x67, 0x5a, 0xff, 0x00, 0xd0, 0x52, + 0xdf, 0xf2, 0x34, 0x7f, 0x67, 0x5a, 0xff, 0x00, + 0xd0, 0x52, 0xdf, 0xf2, 0x34, 0x01, 0x0e, 0xa8, + 0x41, 0xbe, 0x62, 0x06, 0xd0, 0x51, 0x38, 0x1d, + 0xbe, 0x41, 0x56, 0xde, 0xc2, 0xf2, 0x44, 0xb3, + 0x43, 0x14, 0xa8, 0x7c, 0xb6, 0x0e, 0xc5, 0x4f, + 0x1f, 0x33, 0x13, 0xfa, 0x76, 0xa8, 0xbf, 0xb3, + 0xad, 0x7f, 0xe8, 0x29, 0x6f, 0xf9, 0x1a, 0x3f, + 0xb3, 0xad, 0x7f, 0xe8, 0x29, 0x6f, 0xf9, 0x1a, + 0x00, 0x8e, 0xeb, 0x6a, 0x48, 0xa9, 0x71, 0x6d, + 0x3c, 0x68, 0x91, 0xed, 0x89, 0x49, 0xda, 0x71, + 0x93, 0xc9, 0xc8, 0xf5, 0x26, 0xae, 0xcf, 0xe7, + 0x79, 0x72, 0xf9, 0x99, 0xfb, 0x3f, 0x91, 0x16, + 0xcf, 0x4d, 0xf8, 0x4e, 0x9e, 0xfd, 0x7f, 0x0a, + 0xad, 0xfd, 0x9d, 0x6b, 0xff, 0x00, 0x41, 0x4b, + 0x7f, 0xc8, 0xd1, 0xfd, 0x9d, 0x6b, 0xff, 0x00, + 0x41, 0x4b, 0x7f, 0xc8, 0xd0, 0x03, 0xf5, 0x36, + 0x95, 0xa0, 0x90, 0x06, 0x73, 0x1a, 0xde, 0x4b, + 0xb8, 0x67, 0x81, 0xd3, 0x1f, 0xd7, 0xf5, 0xa8, + 0xe1, 0xb7, 0xb8, 0x8a, 0xcf, 0xed, 0x22, 0x19, + 0x64, 0x67, 0x8d, 0x95, 0x48, 0x52, 0x55, 0x10, + 0xe4, 0x13, 0xfc, 0xff, 0x00, 0x9d, 0x2f, 0xf6, + 0x75, 0xaf, 0xfd, 0x05, 0x2d, 0xff, 0x00, 0x23, + 0x47, 0xf6, 0x75, 0xaf, 0xfd, 0x05, 0x2d, 0xff, + 0x00, 0x23, 0x40, 0x06, 0x9a, 0xc3, 0xec, 0xd3, + 0x23, 0x1c, 0x24, 0xb2, 0xa4, 0x67, 0xf1, 0x57, + 0x19, 0xfc, 0x0e, 0x0f, 0xe1, 0x56, 0x18, 0xc8, + 0xab, 0x04, 0x50, 0xec, 0x2d, 0x0c, 0x8f, 0x18, + 0x0f, 0xd1, 0xbe, 0x41, 0xb8, 0x7e, 0x24, 0xb7, + 0xe7, 0x55, 0xff, 0x00, 0xb3, 0xad, 0x7f, 0xe8, + 0x29, 0x6f, 0xf9, 0x1a, 0x3f, 0xb3, 0xad, 0x7f, + 0xe8, 0x29, 0x6f, 0xf9, 0x1a, 0x00, 0x9e, 0x18, + 0x52, 0x29, 0x63, 0x77, 0x81, 0xed, 0xd8, 0xac, + 0xa1, 0xa1, 0xdd, 0xd4, 0x79, 0x67, 0x91, 0x9e, + 0x47, 0xe3, 0x54, 0xd6, 0xe1, 0x4b, 0x41, 0x15, + 0xaa, 0xf9, 0x5b, 0x65, 0xde, 0x1a, 0x57, 0x07, + 0xe6, 0xe3, 0x1c, 0xe0, 0x71, 0x52, 0xff, 0x00, + 0x67, 0x5a, 0xff, 0x00, 0xd0, 0x52, 0xdf, 0xf2, + 0x34, 0x7f, 0x67, 0x5a, 0xff, 0x00, 0xd0, 0x52, + 0xdf, 0xf2, 0x34, 0x00, 0x97, 0x70, 0x62, 0xd5, + 0xe5, 0x92, 0xd8, 0xda, 0xc9, 0xb8, 0x60, 0x02, + 0x76, 0xc9, 0xf4, 0x06, 0xa6, 0xb6, 0x36, 0xf0, + 0x43, 0x6f, 0x0c, 0xf2, 0xba, 0x19, 0x43, 0x33, + 0xa8, 0x4c, 0x82, 0x18, 0x6d, 0x19, 0x39, 0xf4, + 0xe7, 0xf1, 0xa8, 0xbf, 0xb3, 0xad, 0x7f, 0xe8, + 0x29, 0x6f, 0xf9, 0x1a, 0x3f, 0xb3, 0xad, 0x7f, + 0xe8, 0x29, 0x6f, 0xf9, 0x1a, 0x00, 0x74, 0xd6, + 0x37, 0x4d, 0x15, 0xa2, 0xa4, 0x6c, 0x3c, 0xb5, + 0x65, 0x67, 0xe8, 0xaa, 0x44, 0x8d, 0xd4, 0xf6, + 0xa7, 0x5d, 0xa9, 0xbf, 0x47, 0xfb, 0x18, 0xdf, + 0xb6, 0xe2, 0x46, 0x28, 0xbd, 0x48, 0x38, 0xc3, + 0x63, 0xf0, 0x35, 0x1f, 0xf6, 0x75, 0xaf, 0xfd, + 0x05, 0x2d, 0xff, 0x00, 0x23, 0x47, 0xf6, 0x75, + 0xaf, 0xfd, 0x05, 0x2d, 0xff, 0x00, 0x23, 0x40, + 0x1a, 0x1a, 0x6a, 0x3c, 0x76, 0x17, 0x48, 0xee, + 0x19, 0x95, 0xd0, 0x1c, 0x1c, 0xe3, 0x8e, 0x9f, + 0x85, 0x3e, 0x96, 0xc2, 0xde, 0x38, 0x34, 0xd9, + 0xc4, 0x77, 0x29, 0x38, 0x32, 0x29, 0x25, 0x3b, + 0x52, 0x50, 0x05, 0xd7, 0xff, 0x00, 0x51, 0x0f, + 0xfb, 0xc9, 0xfc, 0xc5, 0x14, 0x3f, 0xfc, 0x7b, + 0xc3, 0xfe, 0xf2, 0x7f, 0x31, 0x45, 0x00, 0x3e, + 0xdf, 0xee, 0xbf, 0xfd, 0x74, 0x6f, 0xe6, 0x6a, + 0x5a, 0x8a, 0xdf, 0xee, 0xbf, 0xfd, 0x74, 0x7f, + 0xe6, 0x6a, 0x5a, 0x00, 0xcf, 0xba, 0xff, 0x00, + 0x8f, 0x86, 0xfc, 0x3f, 0x95, 0x67, 0x6b, 0xbf, + 0xf1, 0xef, 0x63, 0xf4, 0x7f, 0xfd, 0x0a, 0xb4, + 0x6e, 0xbf, 0xe3, 0xe1, 0xbf, 0x0f, 0xe5, 0x55, + 0x35, 0x3b, 0x77, 0xba, 0xd3, 0xe3, 0x78, 0x86, + 0xe6, 0xb7, 0x2d, 0xb9, 0x47, 0x5d, 0xa7, 0xbd, + 0x00, 0x65, 0x69, 0xca, 0xad, 0x72, 0x59, 0x94, + 0x30, 0x8e, 0x37, 0x93, 0x69, 0x1c, 0x12, 0x14, + 0x91, 0x56, 0x21, 0xb8, 0x96, 0xfa, 0x2b, 0x88, + 0xae, 0x5b, 0xcc, 0xdb, 0x1e, 0xf4, 0x62, 0x39, + 0x52, 0x08, 0xe9, 0xed, 0xcd, 0x52, 0xb6, 0x99, + 0xad, 0xe7, 0x59, 0x54, 0x02, 0x57, 0xb1, 0xe8, + 0x47, 0x71, 0x57, 0x26, 0x92, 0x05, 0xb1, 0x2f, + 0x68, 0xab, 0x19, 0x97, 0x89, 0x55, 0xa4, 0xcb, + 0xaf, 0x3d, 0x00, 0xf4, 0xe8, 0x73, 0x40, 0x0d, + 0x36, 0x31, 0xf9, 0xf7, 0x51, 0x83, 0x21, 0xf2, + 0xa7, 0x11, 0xae, 0x06, 0x49, 0x05, 0x88, 0xfc, + 0x4f, 0x15, 0x24, 0x9a, 0x74, 0x66, 0x4b, 0x71, + 0x19, 0x64, 0x12, 0xc8, 0x63, 0x60, 0xce, 0xae, + 0x46, 0x31, 0xcf, 0xcb, 0xf5, 0xe9, 0x48, 0x35, + 0x45, 0x49, 0x5e, 0x58, 0xed, 0xb0, 0xf2, 0x48, + 0xb2, 0xb9, 0x2f, 0x9c, 0x91, 0x9e, 0x9c, 0x70, + 0x39, 0xa8, 0xd6, 0xfd, 0x23, 0x58, 0x96, 0x18, + 0x36, 0x08, 0xa5, 0xf3, 0x17, 0x2f, 0x9c, 0xfa, + 0x83, 0xc7, 0x3d, 0x28, 0x02, 0xcc, 0x50, 0xda, + 0xcf, 0x66, 0xaa, 0xa6, 0x54, 0x8b, 0xcc, 0x91, + 0x8e, 0x48, 0x2c, 0x30, 0x99, 0xfe, 0x95, 0x14, + 0x36, 0x30, 0xcf, 0x09, 0x75, 0x59, 0x50, 0xb2, + 0xbb, 0x21, 0x77, 0x5c, 0x71, 0x9e, 0x31, 0xd5, + 0xba, 0x75, 0x14, 0xc1, 0x7f, 0x12, 0x47, 0xe5, + 0xc3, 0x6d, 0xb1, 0x3e, 0x7e, 0xb2, 0x64, 0xfc, + 0xcb, 0xb7, 0xd2, 0x88, 0x6f, 0xd2, 0x31, 0x11, + 0x6b, 0x7d, 0xef, 0x1a, 0x18, 0xf7, 0x6f, 0xc7, + 0xca, 0x73, 0xdb, 0x1d, 0x79, 0xeb, 0x40, 0x0f, + 0xba, 0xb7, 0xb7, 0x61, 0x23, 0x44, 0x8e, 0x9e, + 0x5d, 0xb4, 0x6e, 0x06, 0xe0, 0x72, 0x4e, 0xdf, + 0x6f, 0xf6, 0xbf, 0x3a, 0x6b, 0xda, 0x5b, 0xc5, + 0x68, 0xd3, 0x39, 0x90, 0x9d, 0xb1, 0xe0, 0x02, + 0x3a, 0xb2, 0x93, 0xe9, 0xed, 0x4c, 0x37, 0xb1, + 0xb1, 0x21, 0xa0, 0x25, 0x5a, 0x15, 0x89, 0xc0, + 0x93, 0xae, 0x31, 0x82, 0x38, 0xe3, 0xee, 0x8a, + 0x4b, 0x8b, 0xd1, 0x34, 0x26, 0x25, 0x88, 0x20, + 0x3b, 0x31, 0xf3, 0x67, 0x1b, 0x41, 0x1f, 0xd6, + 0x80, 0x27, 0x97, 0x4c, 0xd9, 0x6e, 0xc7, 0xcb, + 0x9f, 0x7a, 0x44, 0x24, 0x32, 0x15, 0xfd, 0xd9, + 0xe8, 0x48, 0x1c, 0x7b, 0xf5, 0xcf, 0x6a, 0x7d, + 0x9c, 0x92, 0xa6, 0x94, 0xbe, 0x55, 0xe2, 0xda, + 0xe6, 0x76, 0xc9, 0x25, 0x86, 0xef, 0x95, 0x7d, + 0x01, 0xaa, 0x92, 0xdd, 0xc7, 0x2c, 0x5f, 0x34, + 0x07, 0xce, 0xda, 0x14, 0xbe, 0xf3, 0x8e, 0x3b, + 0xe3, 0xd7, 0x8a, 0x21, 0xb9, 0x81, 0x6d, 0x45, + 0xbc, 0xf6, 0xef, 0x20, 0x0e, 0x5c, 0x15, 0x93, + 0x6f, 0x50, 0x07, 0xa1, 0xf4, 0xa0, 0x09, 0x0a, + 0x47, 0x22, 0x5c, 0x5c, 0xdd, 0x4c, 0xf3, 0xb2, + 0x48, 0x8b, 0xb9, 0x1b, 0xef, 0xe4, 0x1e, 0xe4, + 0x7b, 0x53, 0xe6, 0xb2, 0xb5, 0xb6, 0x62, 0x27, + 0x92, 0x5c, 0x34, 0x8c, 0x88, 0xcb, 0x8f, 0x94, + 0x0c, 0x72, 0x7d, 0x7a, 0xf4, 0xaa, 0xb2, 0x5c, + 0x47, 0xe4, 0xc9, 0x0c, 0x51, 0x32, 0x23, 0xba, + 0xb8, 0xdc, 0xfb, 0x88, 0xc0, 0x23, 0xd3, 0xde, + 0xac, 0x3e, 0xa3, 0x1c, 0xac, 0x5a, 0x5b, 0x60, + 0xf8, 0x72, 0xf1, 0x82, 0xdc, 0x02, 0x40, 0xe0, + 0xf1, 0xc8, 0xe0, 0x50, 0x02, 0x45, 0x67, 0x03, + 0x08, 0x62, 0x76, 0x93, 0xcf, 0x9d, 0x0b, 0xa9, + 0x18, 0xda, 0xbd, 0x70, 0x08, 0xfc, 0x2a, 0x78, + 0xad, 0xe1, 0x88, 0x5c, 0x42, 0x85, 0xcc, 0xff, + 0x00, 0x67, 0x05, 0x89, 0xc6, 0xd3, 0x9d, 0xa7, + 0x03, 0xf3, 0xaa, 0xd1, 0xdf, 0x2a, 0x24, 0x64, + 0xc3, 0xba, 0x68, 0x94, 0xa2, 0x49, 0xbb, 0x00, + 0x03, 0x9e, 0xa3, 0xbe, 0x32, 0x69, 0xdf, 0xda, + 0x0b, 0xb5, 0xc8, 0x83, 0x13, 0x3c, 0x42, 0x36, + 0x93, 0x7f, 0xa6, 0x30, 0x71, 0x8f, 0x61, 0x40, + 0x0f, 0xbb, 0xd3, 0x84, 0x11, 0x48, 0xcb, 0x1d, + 0xc2, 0xf9, 0x4e, 0x14, 0xbc, 0x8b, 0x85, 0x7e, + 0xd9, 0x5e, 0x2a, 0xb5, 0xfc, 0x50, 0xc1, 0x77, + 0x24, 0x30, 0xef, 0x22, 0x36, 0x2a, 0x4b, 0x1e, + 0xa7, 0x34, 0xb7, 0x37, 0x51, 0xcf, 0xb9, 0xc4, + 0x05, 0x64, 0x76, 0xdc, 0xcd, 0xbc, 0x91, 0x9f, + 0x61, 0xdb, 0xf5, 0xa8, 0xae, 0x66, 0xfb, 0x45, + 0xcc, 0xb3, 0x6d, 0xdb, 0xe6, 0x39, 0x6c, 0x67, + 0x38, 0xc9, 0xa0, 0x0d, 0x4b, 0xbb, 0x6b, 0x77, + 0xbc, 0xdd, 0x29, 0x97, 0x74, 0xd7, 0x06, 0x2f, + 0x90, 0x81, 0x8e, 0x17, 0x9e, 0x9e, 0xf5, 0x02, + 0xd8, 0xdb, 0xe6, 0x08, 0x59, 0xa4, 0xf3, 0xa6, + 0x46, 0x20, 0x82, 0x36, 0x82, 0x0b, 0x01, 0xc6, + 0x3b, 0xe2, 0xa3, 0x9b, 0x50, 0xf3, 0x65, 0x8e, + 0x4f, 0x2b, 0x1b, 0x26, 0x32, 0xe3, 0x77, 0x5c, + 0xed, 0xe3, 0xa7, 0xfb, 0x3f, 0xad, 0x4d, 0x25, + 0xec, 0x48, 0x96, 0xf2, 0x08, 0x83, 0x4c, 0x23, + 0x6c, 0x10, 0xff, 0x00, 0x70, 0x96, 0x6e, 0xa3, + 0xf1, 0xcf, 0x6a, 0x00, 0x82, 0x3b, 0x48, 0xda, + 0x4b, 0x55, 0x2c, 0xd8, 0x96, 0x16, 0x76, 0xf6, + 0x20, 0xb7, 0xff, 0x00, 0x12, 0x2a, 0xc3, 0x5a, + 0xdb, 0x4d, 0x70, 0x16, 0x38, 0xa4, 0xe2, 0xdd, + 0x1c, 0x46, 0xae, 0x37, 0x39, 0x21, 0x7a, 0x71, + 0xef, 0x55, 0xe1, 0xbe, 0x48, 0xd6, 0x22, 0xd0, + 0x6f, 0x92, 0x24, 0x64, 0x56, 0xdf, 0x81, 0x83, + 0x9e, 0xd8, 0xeb, 0xf3, 0x1a, 0x46, 0xba, 0x82, + 0x42, 0x86, 0x5b, 0x62, 0xd8, 0x8d, 0x50, 0x91, + 0x26, 0x0f, 0xca, 0x00, 0x04, 0x71, 0xc7, 0x03, + 0xde, 0x80, 0x2b, 0xdc, 0x22, 0xc7, 0x33, 0xa2, + 0x07, 0x0a, 0x0f, 0x47, 0x18, 0x61, 0xec, 0x6b, + 0x63, 0x47, 0xff, 0x00, 0x90, 0x65, 0xc7, 0xfd, + 0x75, 0x5f, 0xe5, 0x59, 0x37, 0x53, 0x9b, 0x9b, + 0x83, 0x26, 0xdc, 0x64, 0x00, 0x06, 0x73, 0xd0, + 0x60, 0x7f, 0x2a, 0xdd, 0xb2, 0xb7, 0x7b, 0x3d, + 0x34, 0x47, 0x28, 0xdb, 0x2c, 0xcf, 0xbc, 0xa9, + 0xea, 0xab, 0x8e, 0x33, 0x40, 0x0e, 0xa2, 0x8a, + 0x28, 0x03, 0x3b, 0xc4, 0x3f, 0xf2, 0x12, 0x1f, + 0xf5, 0xc9, 0x7f, 0x95, 0x65, 0xd6, 0xbe, 0xbf, + 0x14, 0xaf, 0xa8, 0x06, 0x48, 0xdd, 0x87, 0x96, + 0xbc, 0x85, 0xcf, 0x6a, 0xcd, 0xfb, 0x3c, 0xff, + 0x00, 0xf3, 0xc6, 0x4f, 0xfb, 0xe4, 0xd0, 0x04, + 0x54, 0x54, 0xbf, 0x67, 0x9f, 0xfe, 0x78, 0xc9, + 0xff, 0x00, 0x7c, 0x9a, 0x3e, 0xcf, 0x3f, 0xfc, + 0xf1, 0x93, 0xfe, 0xf9, 0x34, 0x01, 0x15, 0x15, + 0x2f, 0xd9, 0xe7, 0xff, 0x00, 0x9e, 0x32, 0x7f, + 0xdf, 0x26, 0x8f, 0xb3, 0xcf, 0xff, 0x00, 0x3c, + 0x64, 0xff, 0x00, 0xbe, 0x4d, 0x00, 0x4f, 0xa7, + 0x40, 0xf2, 0xca, 0xd2, 0xac, 0x4d, 0x2f, 0x92, + 0x37, 0x6c, 0x55, 0xce, 0x4f, 0x61, 0xf9, 0xff, + 0x00, 0x2a, 0xbb, 0x35, 0xaf, 0x9f, 0xa9, 0x4c, + 0x97, 0x4a, 0xd1, 0x6e, 0x54, 0x7f, 0x39, 0xb8, + 0xdb, 0xc0, 0x1d, 0xfd, 0x7a, 0x7d, 0x7f, 0x1a, + 0xcb, 0x10, 0x5c, 0x0e, 0x91, 0x4a, 0x3f, 0xe0, + 0x26, 0xa5, 0x9f, 0xed, 0x73, 0xbb, 0x33, 0x45, + 0x20, 0xdd, 0x8c, 0x80, 0xa7, 0x1c, 0x0c, 0x0a, + 0x00, 0x92, 0xda, 0x34, 0x6d, 0x62, 0x28, 0x9a, + 0x2f, 0x2d, 0x3c, 0xe0, 0xbe, 0x5b, 0x76, 0xe7, + 0xa1, 0xa7, 0xd9, 0x4f, 0x34, 0xf7, 0xd2, 0x24, + 0xce, 0xcc, 0xb2, 0xab, 0x89, 0x01, 0x3c, 0x7d, + 0xd2, 0x7f, 0x4a, 0xab, 0xe5, 0xdd, 0x79, 0x81, + 0xfc, 0xb9, 0xb7, 0x8e, 0x43, 0x6d, 0x39, 0xab, + 0xed, 0x2b, 0xcb, 0x69, 0x2b, 0x79, 0x02, 0x1b, + 0xa6, 0xc8, 0x76, 0x58, 0x5b, 0x32, 0x29, 0xf4, + 0xf4, 0x3e, 0xbd, 0x28, 0x02, 0x2b, 0x79, 0xa2, + 0x96, 0x08, 0x22, 0x37, 0x2f, 0x6d, 0x34, 0x44, + 0xec, 0x6c, 0x65, 0x5b, 0x27, 0x39, 0x38, 0xe8, + 0x6a, 0x4d, 0xe1, 0x8a, 0x5b, 0xcb, 0x72, 0xd6, + 0xb7, 0x50, 0x48, 0xc3, 0x76, 0x32, 0x8c, 0xdb, + 0xba, 0xf1, 0xd3, 0x9a, 0x86, 0x29, 0xae, 0x52, + 0x34, 0x46, 0xb3, 0x59, 0x7c, 0xbf, 0xb8, 0x64, + 0x8c, 0x92, 0xbd, 0xff, 0x00, 0xce, 0x69, 0xc2, + 0xe6, 0xec, 0xe0, 0xcd, 0x68, 0xb3, 0x38, 0x24, + 0xab, 0xc9, 0x19, 0x24, 0x64, 0xe7, 0xf9, 0xfa, + 0xd0, 0x03, 0xcc, 0x12, 0x3c, 0x29, 0x6f, 0x2f, + 0xfa, 0xc6, 0xbd, 0x64, 0x6c, 0x7a, 0xe0, 0x66, + 0x9c, 0x6e, 0xa2, 0xbb, 0x65, 0xff, 0x00, 0x48, + 0x7b, 0x59, 0x52, 0x46, 0x64, 0x38, 0xca, 0x1c, + 0xb6, 0x47, 0x4e, 0x9e, 0x9f, 0x85, 0x57, 0x59, + 0xaf, 0x47, 0x26, 0x06, 0x66, 0xde, 0xd2, 0x6e, + 0x28, 0x73, 0xb8, 0x8c, 0x66, 0x96, 0x29, 0xae, + 0x52, 0x34, 0x46, 0xb3, 0x59, 0x7c, 0xbf, 0xb8, + 0x64, 0x8c, 0x92, 0xbd, 0xff, 0x00, 0xce, 0x68, + 0x02, 0x73, 0x0b, 0xfd, 0x89, 0x96, 0x5b, 0x94, + 0x82, 0x45, 0xba, 0x7d, 0xc5, 0xb3, 0xc9, 0xc2, + 0xe7, 0x18, 0x14, 0xdb, 0x89, 0x56, 0x78, 0x6f, + 0xa4, 0x42, 0x59, 0x4b, 0x44, 0x37, 0x1f, 0xe2, + 0xc0, 0x23, 0x3f, 0x8e, 0x33, 0x55, 0xa5, 0x37, + 0x72, 0xc5, 0xb1, 0xe1, 0x73, 0x99, 0x1a, 0x42, + 0xdb, 0x0e, 0x49, 0x38, 0xcf, 0xf2, 0xa6, 0xa2, + 0xdc, 0xa4, 0x12, 0x44, 0x20, 0x7d, 0xb2, 0x10, + 0x4f, 0xc8, 0x73, 0xc7, 0xff, 0x00, 0xae, 0x80, + 0x2b, 0x51, 0x52, 0xfd, 0x9e, 0x7f, 0xf9, 0xe3, + 0x27, 0xfd, 0xf2, 0x68, 0xfb, 0x3c, 0xff, 0x00, + 0xf3, 0xc6, 0x4f, 0xfb, 0xe4, 0xd0, 0x04, 0x54, + 0x54, 0xbf, 0x67, 0x9f, 0xfe, 0x78, 0xc9, 0xff, + 0x00, 0x7c, 0x9a, 0x3e, 0xcf, 0x3f, 0xfc, 0xf1, + 0x93, 0xfe, 0xf9, 0x34, 0x01, 0x15, 0x15, 0x2f, + 0xd9, 0xe7, 0xff, 0x00, 0x9e, 0x32, 0x7f, 0xdf, + 0x26, 0x8f, 0xb3, 0xcf, 0xff, 0x00, 0x3c, 0x64, + 0xff, 0x00, 0xbe, 0x4d, 0x00, 0x74, 0xd7, 0x5f, + 0x7a, 0x3f, 0xfa, 0xe4, 0xbf, 0xca, 0xa1, 0xa9, + 0xae, 0xb8, 0x68, 0xfd, 0xa3, 0x5f, 0xe5, 0x50, + 0xd0, 0x05, 0x3f, 0x10, 0x7d, 0xdb, 0x2f, 0xfa, + 0xe6, 0x7f, 0x9d, 0x63, 0x57, 0x49, 0x7f, 0xb0, + 0xc9, 0x6a, 0x8f, 0x12, 0xbe, 0xeb, 0x69, 0x30, + 0x5b, 0x9d, 0xb8, 0x56, 0x3c, 0x7e, 0x95, 0x93, + 0xa7, 0xb2, 0x7d, 0xd7, 0x82, 0x33, 0x0a, 0x9d, + 0xd3, 0x48, 0xe3, 0x27, 0x6f, 0xa0, 0xf4, 0x3f, + 0x4a, 0x00, 0xa3, 0x45, 0x5c, 0x30, 0xdb, 0xc5, + 0x14, 0x5b, 0xcc, 0x9e, 0x74, 0x89, 0xbc, 0x11, + 0x8d, 0xa3, 0x9e, 0x06, 0x3f, 0x0e, 0xb5, 0x2e, + 0xa5, 0x14, 0x26, 0x4b, 0xb9, 0xa3, 0xdf, 0xbd, + 0x2e, 0x0a, 0xbe, 0xe2, 0x30, 0x73, 0xb8, 0xf1, + 0xe9, 0xd2, 0x80, 0x33, 0xa8, 0xab, 0x5a, 0x69, + 0x4f, 0xb7, 0xc0, 0xaf, 0x12, 0xc8, 0x19, 0xd5, + 0x70, 0xe3, 0x23, 0x92, 0x2a, 0xbb, 0xf0, 0xec, + 0x07, 0xad, 0x00, 0x36, 0x8a, 0xd4, 0xb8, 0x0b, + 0x2c, 0x52, 0x9b, 0x54, 0xb7, 0x92, 0x10, 0x32, + 0xa1, 0x57, 0x6c, 0x91, 0x8c, 0xf7, 0xee, 0x7f, + 0x5a, 0x7d, 0xdc, 0x11, 0x49, 0x00, 0x06, 0x68, + 0x62, 0x31, 0xca, 0xd1, 0x6e, 0x70, 0x7e, 0x60, + 0xaa, 0x83, 0xb0, 0x3e, 0xff, 0x00, 0x9d, 0x00, + 0x64, 0x51, 0x56, 0xb5, 0x24, 0x48, 0xef, 0x19, + 0x10, 0x2e, 0xd0, 0x89, 0xf7, 0x46, 0x01, 0xf9, + 0x47, 0x35, 0x34, 0xaf, 0x18, 0xfb, 0x1c, 0xa9, + 0x6a, 0x84, 0xb4, 0x6d, 0x84, 0x03, 0x82, 0x77, + 0x30, 0x19, 0xf5, 0xed, 0x40, 0x19, 0xf4, 0x55, + 0xeb, 0xa8, 0x4c, 0xb2, 0x80, 0x8b, 0x12, 0xc8, + 0x91, 0xfe, 0xf8, 0x06, 0x54, 0x1b, 0xb2, 0x7a, + 0x76, 0xe9, 0x8e, 0x95, 0x35, 0xd4, 0x30, 0xcb, + 0x23, 0x90, 0x64, 0x13, 0x47, 0x0c, 0x4e, 0x4e, + 0x46, 0xd2, 0x36, 0xa8, 0xc7, 0xeb, 0x40, 0x19, + 0x74, 0x56, 0x86, 0xa1, 0x14, 0x51, 0xc4, 0xc4, + 0x07, 0x69, 0x7e, 0xd3, 0x2a, 0x99, 0x19, 0xb3, + 0x90, 0x31, 0xd7, 0x8f, 0x7f, 0xe7, 0x49, 0x6e, + 0xc8, 0x6d, 0x1f, 0x7c, 0x11, 0x88, 0x95, 0x18, + 0x17, 0x23, 0xe6, 0x67, 0x3f, 0x77, 0x07, 0xf2, + 0xe3, 0xd0, 0x50, 0x05, 0x0a, 0x2a, 0xfd, 0x8c, + 0x51, 0xcb, 0x65, 0x74, 0xac, 0x8a, 0x64, 0x62, + 0xa1, 0x18, 0x8e, 0x41, 0xc3, 0x1e, 0x3e, 0xbb, + 0x71, 0x53, 0xec, 0xb6, 0x82, 0xde, 0xcf, 0xce, + 0x45, 0xc8, 0x66, 0xf3, 0x18, 0xae, 0x79, 0x2a, + 0x0a, 0xe7, 0xd4, 0x0c, 0x8e, 0x3e, 0xb4, 0x01, + 0x93, 0x45, 0x6c, 0x43, 0x1b, 0x3d, 0xcc, 0x2c, + 0xd1, 0xda, 0xc8, 0x36, 0xc9, 0xb6, 0x48, 0xd5, + 0x76, 0x93, 0xb0, 0x90, 0x08, 0xe9, 0xc7, 0x5e, + 0x45, 0x41, 0x3f, 0x94, 0xa2, 0xdc, 0xdd, 0x2c, + 0x3b, 0xc4, 0x9f, 0x38, 0x83, 0x6f, 0x29, 0xc7, + 0x5d, 0xbc, 0x67, 0xad, 0x00, 0x67, 0x51, 0x5a, + 0x17, 0x80, 0xb5, 0xbb, 0x3a, 0x2d, 0xb4, 0x91, + 0x86, 0x18, 0x92, 0x15, 0xda, 0x57, 0xd8, 0x8e, + 0x0f, 0xe7, 0x52, 0xd8, 0xd9, 0x34, 0xb6, 0x4d, + 0xfe, 0x8e, 0xce, 0x67, 0x2c, 0x15, 0xc2, 0x67, + 0x66, 0xd1, 0xc7, 0x3d, 0xb2, 0x78, 0xfc, 0x28, + 0x03, 0x2a, 0x8a, 0xd0, 0x33, 0x2d, 0xbd, 0xad, + 0x98, 0xfb, 0x3c, 0x2e, 0xae, 0x84, 0xb8, 0x68, + 0xc6, 0x5b, 0xe7, 0x61, 0xf7, 0xba, 0xf6, 0xa7, + 0xdc, 0xa4, 0x7a, 0x7a, 0xbf, 0x97, 0x1c, 0x72, + 0x33, 0x4c, 0xe8, 0x1a, 0x45, 0x0d, 0xb5, 0x57, + 0x1c, 0x60, 0xf7, 0xe6, 0x80, 0x2d, 0xe8, 0xbf, + 0xf2, 0x0b, 0xb9, 0xff, 0x00, 0xae, 0x8b, 0xfc, + 0xaa, 0x7a, 0x8f, 0x4b, 0x75, 0x92, 0xc2, 0xe9, + 0xd6, 0x35, 0x8c, 0x19, 0x17, 0xe5, 0x53, 0xc0, + 0x38, 0xa9, 0x28, 0x02, 0xeb, 0xff, 0x00, 0xc7, + 0xbc, 0x3f, 0xef, 0x27, 0xf3, 0x14, 0x50, 0xff, + 0x00, 0xf1, 0xef, 0x0f, 0xfb, 0xc9, 0xfc, 0xc5, + 0x14, 0x00, 0xfb, 0x6f, 0xb8, 0xff, 0x00, 0xf5, + 0xd1, 0xff, 0x00, 0xf4, 0x23, 0x53, 0x54, 0x56, + 0xdf, 0x71, 0xff, 0x00, 0xeb, 0xa3, 0xff, 0x00, + 0xe8, 0x46, 0xa5, 0xa0, 0x0c, 0xeb, 0xaf, 0xf8, + 0xf8, 0x7f, 0xc3, 0xf9, 0x54, 0x68, 0xec, 0x8c, + 0x19, 0x18, 0xa9, 0x1d, 0xc5, 0x49, 0x75, 0xff, + 0x00, 0x1f, 0x0f, 0xf8, 0x7f, 0x2a, 0x56, 0x31, + 0x5a, 0xaa, 0xf9, 0x8a, 0x24, 0x95, 0x86, 0xed, + 0xa7, 0xa2, 0x8f, 0x7a, 0x4d, 0xa4, 0xae, 0xc0, + 0x6b, 0x49, 0x1b, 0x9d, 0xcf, 0x6b, 0x6c, 0xed, + 0xdd, 0x9a, 0x20, 0x49, 0xa4, 0xdd, 0x0f, 0xfc, + 0xf9, 0x5a, 0x7f, 0xdf, 0x91, 0x4b, 0xf6, 0xf1, + 0xff, 0x00, 0x3c, 0x20, 0xff, 0x00, 0xbe, 0x28, + 0xfb, 0x78, 0xff, 0x00, 0x9e, 0x10, 0x7f, 0xdf, + 0x15, 0x9f, 0xb5, 0x88, 0xae, 0x26, 0xe8, 0x7f, + 0xe7, 0xca, 0xd3, 0xfe, 0xfc, 0x8a, 0x37, 0x43, + 0xff, 0x00, 0x3e, 0x56, 0x9f, 0xf7, 0xe4, 0x52, + 0xfd, 0xbc, 0x7f, 0xcf, 0x08, 0x3f, 0xef, 0x8a, + 0x3e, 0xde, 0x3f, 0xe7, 0x84, 0x1f, 0xf7, 0xc5, + 0x1e, 0xd6, 0x21, 0x71, 0x37, 0x43, 0xff, 0x00, + 0x3e, 0x56, 0x9f, 0xf7, 0xe4, 0x51, 0xba, 0x1f, + 0xf9, 0xf2, 0xb4, 0xff, 0x00, 0xbf, 0x22, 0x97, + 0xed, 0xe3, 0xfe, 0x78, 0x41, 0xff, 0x00, 0x7c, + 0x51, 0xf6, 0xf1, 0xff, 0x00, 0x3c, 0x20, 0xff, + 0x00, 0xbe, 0x28, 0xf6, 0xb1, 0x0b, 0x89, 0xba, + 0x1f, 0xf9, 0xf2, 0xb4, 0xff, 0x00, 0xbf, 0x22, + 0x8d, 0xd0, 0xff, 0x00, 0xcf, 0x95, 0xa7, 0xfd, + 0xf9, 0x14, 0xbf, 0x6f, 0x1f, 0xf3, 0xc2, 0x0f, + 0xfb, 0xe2, 0x8f, 0xb7, 0x8f, 0xf9, 0xe1, 0x07, + 0xfd, 0xf1, 0x47, 0xb5, 0x88, 0x5c, 0x4d, 0xd0, + 0xff, 0x00, 0xcf, 0x95, 0xa7, 0xfd, 0xf9, 0x14, + 0x6e, 0x87, 0xfe, 0x7c, 0xad, 0x3f, 0xef, 0xc8, + 0xa5, 0xfb, 0x78, 0xff, 0x00, 0x9e, 0x10, 0x7f, + 0xdf, 0x14, 0x7d, 0xbc, 0x7f, 0xcf, 0x08, 0x3f, + 0xef, 0x8a, 0x3d, 0xac, 0x42, 0xe2, 0x6e, 0x87, + 0xfe, 0x7c, 0xad, 0x3f, 0xef, 0xc8, 0xa3, 0x74, + 0x3f, 0xf3, 0xe5, 0x69, 0xff, 0x00, 0x7e, 0x45, + 0x2f, 0xdb, 0xc7, 0xfc, 0xf0, 0x83, 0xfe, 0xf8, + 0xa3, 0xed, 0xe3, 0xfe, 0x78, 0x41, 0xff, 0x00, + 0x7c, 0x51, 0xed, 0x62, 0x17, 0x13, 0x74, 0x3f, + 0xf3, 0xe5, 0x69, 0xff, 0x00, 0x7e, 0x45, 0x1b, + 0xa1, 0xff, 0x00, 0x9f, 0x2b, 0x4f, 0xfb, 0xf2, + 0x29, 0x7e, 0xde, 0x3f, 0xe7, 0x84, 0x1f, 0xf7, + 0xc5, 0x1f, 0x6f, 0x1f, 0xf3, 0xc2, 0x0f, 0xfb, + 0xe2, 0x8f, 0x6b, 0x10, 0xb8, 0x9b, 0xa1, 0xff, + 0x00, 0x9f, 0x2b, 0x4f, 0xfb, 0xf2, 0x28, 0xdd, + 0x0f, 0xfc, 0xf9, 0x5a, 0x7f, 0xdf, 0x91, 0x4b, + 0xf6, 0xf1, 0xff, 0x00, 0x3c, 0x20, 0xff, 0x00, + 0xbe, 0x28, 0xfb, 0x78, 0xff, 0x00, 0x9e, 0x10, + 0x7f, 0xdf, 0x14, 0x7b, 0x58, 0x85, 0xc4, 0xdd, + 0x0f, 0xfc, 0xf9, 0x5a, 0x7f, 0xdf, 0x91, 0x46, + 0xe8, 0x7f, 0xe7, 0xca, 0xd3, 0xfe, 0xfc, 0x8a, + 0x5f, 0xb7, 0x8f, 0xf9, 0xe1, 0x07, 0xfd, 0xf1, + 0x47, 0xdb, 0xc7, 0xfc, 0xf0, 0x83, 0xfe, 0xf8, + 0xa3, 0xda, 0xc4, 0x2e, 0x26, 0xe8, 0x7f, 0xe7, + 0xca, 0xd3, 0xfe, 0xfc, 0x8a, 0x37, 0x43, 0xff, + 0x00, 0x3e, 0x56, 0x9f, 0xf7, 0xe4, 0x52, 0xfd, + 0xbc, 0x7f, 0xcf, 0x08, 0x3f, 0xef, 0x8a, 0x3e, + 0xde, 0x3f, 0xe7, 0x84, 0x1f, 0xf7, 0xc5, 0x1e, + 0xd6, 0x21, 0x70, 0x59, 0x84, 0x67, 0x31, 0x41, + 0x04, 0x47, 0xd5, 0x22, 0x00, 0xd3, 0x19, 0x8b, + 0x31, 0x66, 0x24, 0x93, 0xd4, 0x9a, 0x7f, 0xdb, + 0xc7, 0xfc, 0xf0, 0x83, 0xfe, 0xf8, 0xa7, 0x47, + 0x2c, 0x17, 0x4d, 0xe5, 0x94, 0x58, 0xa4, 0x3f, + 0x75, 0x97, 0xa1, 0x3e, 0x84, 0x53, 0x55, 0x22, + 0xdd, 0x82, 0xe4, 0x34, 0x50, 0x41, 0x56, 0x20, + 0x8c, 0x11, 0xc5, 0x15, 0xa0, 0xc4, 0xd5, 0x75, + 0x7b, 0xbb, 0x3b, 0xb1, 0x0c, 0x25, 0x02, 0x08, + 0xd4, 0xf2, 0xb9, 0xed, 0x54, 0xbf, 0xe1, 0x22, + 0xd4, 0x7f, 0xbd, 0x1f, 0xfd, 0xf1, 0x4c, 0xf1, + 0x0f, 0xfc, 0x84, 0x87, 0xfd, 0x72, 0x5f, 0xe5, + 0x59, 0x74, 0x01, 0xaf, 0xff, 0x00, 0x09, 0x16, + 0xa3, 0xfd, 0xe8, 0xff, 0x00, 0xef, 0x8a, 0x3f, + 0xe1, 0x22, 0xd4, 0x7f, 0xbd, 0x1f, 0xfd, 0xf1, + 0x59, 0x14, 0x50, 0x06, 0xbf, 0xfc, 0x24, 0x5a, + 0x8f, 0xf7, 0xa3, 0xff, 0x00, 0xbe, 0x28, 0xff, + 0x00, 0x84, 0x8b, 0x51, 0xfe, 0xf4, 0x7f, 0xf7, + 0xc5, 0x64, 0x51, 0x40, 0x1a, 0xff, 0x00, 0xf0, + 0x91, 0x6a, 0x3f, 0xde, 0x8f, 0xfe, 0xf8, 0xa3, + 0xfe, 0x12, 0x2d, 0x47, 0xfb, 0xd1, 0xff, 0x00, + 0xdf, 0x15, 0x91, 0x45, 0x00, 0x6c, 0x7f, 0x6f, + 0xea, 0x61, 0x04, 0x87, 0x6e, 0xc2, 0x70, 0x1b, + 0xcb, 0xe3, 0x34, 0xe7, 0xd7, 0x35, 0x68, 0xd1, + 0x5d, 0xd4, 0x2a, 0xbf, 0xdd, 0x2d, 0x1e, 0x01, + 0xfa, 0x55, 0x50, 0xed, 0x36, 0x9d, 0x02, 0xc8, + 0xd9, 0x55, 0x9f, 0x68, 0x1e, 0x83, 0x02, 0xa5, + 0x95, 0xda, 0x47, 0xd4, 0x04, 0x80, 0xc8, 0x16, + 0x65, 0x21, 0x0f, 0xae, 0xec, 0x63, 0xf2, 0xe2, + 0x80, 0x1d, 0xff, 0x00, 0x09, 0x16, 0xa3, 0xfd, + 0xe8, 0xff, 0x00, 0xef, 0x8a, 0x72, 0xeb, 0xda, + 0xa3, 0x00, 0x54, 0x29, 0x04, 0xed, 0x04, 0x47, + 0xd4, 0xfa, 0x55, 0x5d, 0x46, 0xda, 0x2b, 0x65, + 0x41, 0x10, 0x27, 0x71, 0x24, 0xb9, 0x39, 0xda, + 0x7f, 0xb9, 0xc7, 0x71, 0xde, 0x96, 0x07, 0x95, + 0x34, 0xf8, 0xcc, 0x19, 0xf3, 0x0c, 0xec, 0xab, + 0x81, 0xcf, 0x2a, 0x07, 0x14, 0x01, 0x66, 0x4d, + 0x77, 0x55, 0x89, 0xf6, 0x48, 0x15, 0x1f, 0xfb, + 0xad, 0x1e, 0x0d, 0x2c, 0xba, 0xde, 0xaf, 0x08, + 0x06, 0x54, 0xf2, 0xf3, 0xd3, 0x7c, 0x58, 0xcd, + 0x32, 0x26, 0x02, 0xee, 0x18, 0x83, 0x09, 0x25, + 0xb6, 0x82, 0x43, 0xbb, 0xaf, 0xce, 0x03, 0x30, + 0x03, 0xe9, 0x59, 0xc6, 0xe2, 0x76, 0x86, 0x48, + 0xd9, 0xd9, 0xd1, 0x88, 0x66, 0xdd, 0xcf, 0x3e, + 0xb4, 0x01, 0xa3, 0xff, 0x00, 0x09, 0x16, 0xa3, + 0xfd, 0xe8, 0xff, 0x00, 0xef, 0x8a, 0x3f, 0xe1, + 0x22, 0xd4, 0x7f, 0xbd, 0x1f, 0xfd, 0xf1, 0x59, + 0x14, 0x50, 0x06, 0xbf, 0xfc, 0x24, 0x5a, 0x8f, + 0xf7, 0xa3, 0xff, 0x00, 0xbe, 0x28, 0xff, 0x00, + 0x84, 0x8b, 0x51, 0xfe, 0xf4, 0x7f, 0xf7, 0xc5, + 0x64, 0x51, 0x40, 0x1a, 0xff, 0x00, 0xf0, 0x91, + 0x6a, 0x3f, 0xde, 0x8f, 0xfe, 0xf8, 0xa3, 0xfe, + 0x12, 0x2d, 0x47, 0xfb, 0xd1, 0xff, 0x00, 0xdf, + 0x15, 0x91, 0x45, 0x00, 0x6b, 0xff, 0x00, 0xc2, + 0x45, 0xa8, 0xff, 0x00, 0x7a, 0x3f, 0xfb, 0xe2, + 0x8f, 0xf8, 0x48, 0xb5, 0x1f, 0xef, 0x47, 0xff, + 0x00, 0x7c, 0x56, 0x45, 0x14, 0x01, 0xd6, 0x5e, + 0x31, 0x79, 0x51, 0xcf, 0x56, 0x8d, 0x49, 0xfc, + 0xaa, 0x0a, 0x9a, 0xeb, 0xef, 0x47, 0xff, 0x00, + 0x5c, 0x97, 0xf9, 0x54, 0x34, 0x01, 0x35, 0xdc, + 0x33, 0x11, 0x6d, 0x24, 0x51, 0xdb, 0x39, 0x11, + 0x15, 0xfd, 0xf3, 0x91, 0x8c, 0xe7, 0x38, 0xc1, + 0x1d, 0x8d, 0x51, 0x5b, 0x2b, 0x81, 0x11, 0x88, + 0xc1, 0x60, 0xc9, 0xbc, 0xbe, 0x0c, 0xa7, 0x83, + 0xff, 0x00, 0x7d, 0x54, 0x7e, 0x20, 0xfb, 0xb6, + 0x5f, 0xf5, 0xcc, 0xff, 0x00, 0x3a, 0xc6, 0xa0, + 0x0d, 0xb1, 0x63, 0x7a, 0x21, 0x11, 0xff, 0x00, + 0xa1, 0x92, 0x06, 0xd5, 0x73, 0x20, 0xdc, 0x17, + 0x39, 0xc7, 0x5a, 0x5f, 0xb0, 0xdd, 0xbc, 0xae, + 0xd2, 0x9b, 0x52, 0x92, 0xcc, 0x25, 0x71, 0xe6, + 0x0e, 0xd9, 0xe3, 0xaf, 0x4f, 0x98, 0xd6, 0x1d, + 0x4d, 0x71, 0x0f, 0x90, 0xc8, 0xbb, 0xb7, 0x6e, + 0x8d, 0x5f, 0xa6, 0x3a, 0x8c, 0xd0, 0x06, 0x9d, + 0xbe, 0x9b, 0x73, 0x6f, 0x70, 0x26, 0x51, 0x68, + 0xe4, 0x1c, 0xa8, 0x79, 0x78, 0x53, 0x9c, 0x83, + 0xc1, 0x15, 0x1c, 0xba, 0x4d, 0xcc, 0x92, 0x97, + 0x5f, 0xb2, 0xc7, 0x9f, 0xe1, 0x49, 0x78, 0xfd, + 0x49, 0xa8, 0xa6, 0xd3, 0xe2, 0x59, 0xa5, 0x82, + 0x2b, 0xa2, 0xf3, 0xc7, 0x9f, 0x91, 0xa3, 0xdb, + 0xbb, 0x1d, 0x70, 0x72, 0x6a, 0x28, 0xed, 0x62, + 0xf2, 0x12, 0x5b, 0x8b, 0x8f, 0x24, 0x49, 0x9d, + 0x80, 0x26, 0xe2, 0x47, 0xaf, 0xb0, 0xa0, 0x0d, + 0x41, 0x6d, 0x7a, 0xae, 0x5d, 0x52, 0xc5, 0x64, + 0x63, 0xf3, 0x30, 0x7e, 0x5b, 0x9c, 0xfa, 0xe3, + 0x9f, 0x6c, 0x55, 0x77, 0xd3, 0x6f, 0x64, 0x84, + 0x44, 0xd2, 0x5b, 0x10, 0x1d, 0xa4, 0xcf, 0x9a, + 0x33, 0x93, 0x8c, 0xff, 0x00, 0x2a, 0xa4, 0x2c, + 0xc8, 0xbf, 0x5b, 0x57, 0x90, 0x0d, 0xe4, 0x05, + 0x70, 0x32, 0x0e, 0x47, 0xca, 0x7f, 0x1e, 0x29, + 0x91, 0x5b, 0x97, 0x49, 0xdd, 0x8e, 0xd1, 0x12, + 0xe4, 0xf1, 0xd4, 0xe7, 0x00, 0x7f, 0x9f, 0x4a, + 0x00, 0xbf, 0x36, 0x97, 0x79, 0x3c, 0x9e, 0x63, + 0x3d, 0xb0, 0x38, 0x03, 0x89, 0x47, 0x61, 0x8f, + 0xe9, 0x56, 0x85, 0xbd, 0xd2, 0x98, 0xca, 0xc1, + 0xa7, 0x8f, 0x2c, 0x10, 0xb8, 0x95, 0xb8, 0x07, + 0x3f, 0xed, 0x7b, 0x9a, 0xc7, 0x8a, 0xce, 0x56, + 0xbb, 0x86, 0x09, 0x51, 0xe1, 0x32, 0xb0, 0x50, + 0x59, 0x0f, 0x73, 0xd6, 0x89, 0x6c, 0xae, 0x62, + 0x95, 0x22, 0x30, 0xb9, 0x77, 0x50, 0xca, 0x02, + 0x9c, 0x91, 0x8a, 0x00, 0xbd, 0x36, 0x93, 0x71, + 0x23, 0x02, 0xab, 0x69, 0x17, 0x1d, 0x12, 0x5e, + 0x0f, 0xe6, 0x4d, 0x4d, 0x25, 0xa5, 0xf3, 0xa1, + 0x1f, 0xe8, 0x6a, 0xcc, 0xaa, 0x85, 0xc4, 0x9c, + 0x95, 0x5c, 0x60, 0x75, 0xf6, 0x15, 0x8e, 0xb0, + 0x4c, 0xce, 0xc8, 0xb0, 0xc8, 0x59, 0x3e, 0xf0, + 0x0a, 0x72, 0xbf, 0x5a, 0x16, 0xde, 0x67, 0x90, + 0xc6, 0x90, 0xc8, 0xce, 0x3a, 0xa8, 0x52, 0x48, + 0xa0, 0x0d, 0x69, 0xac, 0x2f, 0x67, 0x47, 0x57, + 0x36, 0x9f, 0x34, 0xad, 0x2e, 0x44, 0xbc, 0x82, + 0x7a, 0xe3, 0x9e, 0x9c, 0x0a, 0x5f, 0xb0, 0xdc, + 0x9b, 0x74, 0x85, 0xa2, 0xb1, 0x60, 0x80, 0x85, + 0x63, 0x29, 0xc8, 0xcf, 0x7e, 0xb8, 0xcd, 0x65, + 0xda, 0x40, 0x2e, 0x2e, 0x44, 0x2c, 0xe6, 0x31, + 0x86, 0x24, 0xed, 0xce, 0x30, 0x09, 0xe9, 0xf8, + 0x53, 0xe5, 0xb6, 0x8b, 0xec, 0xed, 0x35, 0xbc, + 0xe6, 0x55, 0x46, 0x0a, 0xe1, 0x93, 0x69, 0x19, + 0xe8, 0x7a, 0x9f, 0x4a, 0x00, 0xbd, 0x0e, 0x9d, + 0x7b, 0x02, 0xe1, 0x24, 0xb6, 0xff, 0x00, 0x58, + 0xb2, 0x67, 0xcd, 0x1d, 0x57, 0x38, 0xfe, 0x75, + 0x27, 0xd9, 0x2f, 0xf7, 0x96, 0x2d, 0x68, 0x72, + 0xec, 0xe4, 0x17, 0x18, 0x3b, 0x86, 0x08, 0xfa, + 0x56, 0x3b, 0x41, 0x32, 0x2a, 0xb3, 0xc4, 0xea, + 0x1f, 0xee, 0x92, 0xa4, 0x6e, 0xfa, 0x52, 0xb5, + 0xb5, 0xc2, 0x1c, 0x3c, 0x12, 0xa9, 0xf7, 0x42, + 0x3b, 0x67, 0xf9, 0x50, 0x06, 0xc7, 0xd8, 0xef, + 0x57, 0x02, 0x31, 0x65, 0x1a, 0x00, 0xdf, 0x2a, + 0xc9, 0xc1, 0xdc, 0xbb, 0x49, 0xe4, 0xe7, 0xa1, + 0xaa, 0xd1, 0xe9, 0x37, 0x91, 0x48, 0xb2, 0x2c, + 0x96, 0xfb, 0x94, 0xe4, 0x66, 0x41, 0x54, 0xa3, + 0xb7, 0x67, 0x86, 0x59, 0x4e, 0x54, 0x22, 0x6f, + 0x19, 0x1f, 0x7b, 0xe6, 0x0b, 0xfd, 0x69, 0xad, + 0x6f, 0x3a, 0xec, 0xdd, 0x0c, 0x83, 0xcc, 0xfb, + 0x99, 0x53, 0xf3, 0x7d, 0x3d, 0x68, 0x03, 0x56, + 0x5b, 0x0b, 0xb7, 0x89, 0xa3, 0x45, 0xb2, 0x89, + 0x58, 0x82, 0xdb, 0x24, 0xfb, 0xdf, 0x99, 0x34, + 0xd3, 0xa7, 0xdf, 0x16, 0x85, 0x84, 0xb6, 0xeb, + 0xe5, 0x00, 0x17, 0x6c, 0xa3, 0xb7, 0x3f, 0xce, + 0xa8, 0x4b, 0x63, 0x75, 0x14, 0xb2, 0x46, 0x60, + 0x91, 0x8c, 0x7f, 0x78, 0xaa, 0x92, 0x3e, 0xbf, + 0x4a, 0x84, 0xc5, 0x28, 0x8c, 0x48, 0x63, 0x70, + 0x87, 0xa3, 0x11, 0xc7, 0xe7, 0xf8, 0x1f, 0xca, + 0x80, 0x37, 0x3e, 0xcd, 0x78, 0x76, 0x9f, 0x2a, + 0xc3, 0x7a, 0x64, 0xa3, 0x19, 0x3e, 0xee, 0x58, + 0xb7, 0x4c, 0xe3, 0xa9, 0xa8, 0xe3, 0xb1, 0xbd, + 0x55, 0x74, 0x90, 0xda, 0x4c, 0xae, 0xdb, 0xc8, + 0x92, 0x4c, 0xfc, 0xde, 0xbc, 0x1a, 0xc4, 0xa2, + 0x80, 0x3a, 0x9b, 0x68, 0x67, 0x8e, 0xca, 0xe1, + 0xa7, 0x68, 0x89, 0x67, 0x5c, 0x08, 0xc8, 0x20, + 0x00, 0x31, 0x8e, 0x2a, 0x3a, 0x83, 0x45, 0xff, + 0x00, 0x90, 0x5d, 0xcf, 0xfd, 0x74, 0x5f, 0xe5, + 0x53, 0xd0, 0x05, 0xd7, 0xff, 0x00, 0x8f, 0x78, + 0x7f, 0xde, 0x4f, 0xe6, 0x28, 0xa5, 0x7f, 0xf8, + 0xf6, 0x87, 0xfd, 0xe4, 0xfe, 0x62, 0x8a, 0x00, + 0x7d, 0xb7, 0xdc, 0x7f, 0xfa, 0xe8, 0xff, 0x00, + 0xfa, 0x11, 0xa9, 0xaa, 0x1b, 0x6f, 0xb8, 0xff, + 0x00, 0xf5, 0xd1, 0xff, 0x00, 0xf4, 0x23, 0x53, + 0x50, 0x06, 0x6d, 0xd7, 0xfc, 0x7c, 0x3f, 0xe1, + 0xfc, 0xab, 0x3b, 0x58, 0x9f, 0x6e, 0xa9, 0x3a, + 0xe7, 0xa1, 0x1f, 0xc8, 0x56, 0x8d, 0xdf, 0xfc, + 0x7c, 0x3f, 0xe1, 0xfc, 0xab, 0x1f, 0x5c, 0x88, + 0xb6, 0xaf, 0x70, 0x7d, 0xc7, 0xf2, 0x15, 0x9d, + 0x4d, 0x84, 0xc8, 0x7e, 0xd1, 0xef, 0x47, 0xda, + 0x3d, 0xea, 0xb7, 0x90, 0x7d, 0xe8, 0xf2, 0x0f, + 0xbd, 0x60, 0x22, 0xcf, 0xda, 0x3d, 0xea, 0xfd, + 0x9d, 0xbc, 0x73, 0xd9, 0xb5, 0xd4, 0xb7, 0x62, + 0x04, 0x57, 0xd9, 0xca, 0x67, 0xb7, 0xd6, 0xb1, + 0xfc, 0x83, 0xef, 0x5a, 0xb0, 0xc2, 0xc7, 0xc3, + 0x73, 0x20, 0x04, 0x9f, 0xb4, 0x03, 0xc7, 0xd0, + 0x53, 0x8a, 0x40, 0x25, 0xec, 0x2f, 0x68, 0xb1, + 0xc8, 0x25, 0x59, 0x61, 0x93, 0xee, 0x48, 0xbd, + 0x0d, 0x46, 0x12, 0xe4, 0xb2, 0x2f, 0x91, 0x28, + 0x32, 0x70, 0xb9, 0x43, 0xcd, 0x5d, 0x8a, 0xd6, + 0x51, 0xa5, 0x59, 0x5b, 0x31, 0xd9, 0x2b, 0xdc, + 0xef, 0x4d, 0xe3, 0xa0, 0xfa, 0x55, 0xd5, 0x2c, + 0x61, 0xb9, 0x3e, 0x7c, 0xf2, 0xba, 0x5c, 0x20, + 0xdc, 0xe3, 0x68, 0x04, 0x30, 0x07, 0x6f, 0xb6, + 0x2a, 0xb9, 0x13, 0x19, 0x8f, 0x75, 0x1c, 0xd6, + 0xd7, 0x46, 0xdc, 0xab, 0x33, 0xff, 0x00, 0x0e, + 0x14, 0xfc, 0xdf, 0x4a, 0x86, 0x49, 0x24, 0x89, + 0xf6, 0x4a, 0x8c, 0x8d, 0xe8, 0xc3, 0x06, 0xb5, + 0x1a, 0x39, 0xdb, 0x5b, 0xbd, 0x9b, 0xed, 0x0f, + 0x1a, 0xc4, 0x87, 0x9c, 0x6e, 0x21, 0x7d, 0x17, + 0x3d, 0x2a, 0xbe, 0xb5, 0x18, 0x92, 0xcb, 0x4f, + 0x70, 0xd2, 0x31, 0x2a, 0xe3, 0x7c, 0x9f, 0x78, + 0x8e, 0x31, 0x9a, 0x4e, 0x28, 0x43, 0xe1, 0xb5, + 0x85, 0xac, 0xa2, 0xb9, 0x9e, 0xf4, 0x42, 0x24, + 0x24, 0x00, 0x63, 0xcf, 0x43, 0xf5, 0xa8, 0x6e, + 0xed, 0xe6, 0xb6, 0x9f, 0xcb, 0x5c, 0xcc, 0xa5, + 0x3c, 0xc0, 0xc8, 0x33, 0x95, 0xf5, 0xab, 0x0a, + 0x96, 0x83, 0x41, 0xb3, 0x5b, 0xc5, 0x99, 0x94, + 0x33, 0xed, 0xf2, 0xb1, 0xea, 0x7a, 0xe6, 0xa5, + 0xb2, 0xba, 0x17, 0x1a, 0x8c, 0x8f, 0x14, 0x7b, + 0x22, 0x86, 0xd0, 0xa4, 0x6a, 0x79, 0xe0, 0x63, + 0xad, 0x3e, 0x58, 0x8c, 0xcb, 0x02, 0xe1, 0xa4, + 0x31, 0x2c, 0x32, 0x99, 0x00, 0xc9, 0x50, 0x87, + 0x3f, 0x95, 0x4b, 0x69, 0x0c, 0xf7, 0x53, 0xb4, + 0x48, 0xac, 0x0a, 0x02, 0x5b, 0x2a, 0x78, 0xa9, + 0xd6, 0x5b, 0x91, 0xa1, 0xc9, 0x3c, 0x73, 0x49, + 0xe7, 0xbc, 0xe0, 0x49, 0x20, 0x3f, 0x36, 0xdc, + 0x71, 0xcf, 0xe5, 0x5a, 0x0b, 0xe6, 0x0d, 0x42, + 0x37, 0x25, 0x84, 0xaf, 0x65, 0x99, 0x00, 0x38, + 0xcb, 0x7a, 0x9f, 0x7a, 0x14, 0x50, 0x18, 0x6b, + 0xf6, 0x86, 0x2e, 0x16, 0x19, 0x09, 0x4f, 0xbd, + 0x84, 0x3f, 0x2f, 0xd6, 0x9b, 0x13, 0xcb, 0x33, + 0x15, 0x8a, 0x37, 0x90, 0x8e, 0xc8, 0xb9, 0xad, + 0x88, 0x5d, 0x61, 0xd3, 0xac, 0x1d, 0xa4, 0xba, + 0xde, 0xd2, 0x33, 0x1f, 0x27, 0x07, 0x7b, 0x67, + 0xf8, 0xb3, 0xd6, 0xa2, 0x9d, 0x9e, 0x3d, 0x32, + 0xe6, 0x5b, 0x31, 0x24, 0x0e, 0xf7, 0x7f, 0x3f, + 0x1b, 0x59, 0x46, 0x3a, 0x7b, 0x73, 0x4b, 0x95, + 0x01, 0x4e, 0xda, 0x0b, 0x8b, 0x94, 0x99, 0x91, + 0x1b, 0xf7, 0x43, 0x9f, 0x94, 0xf2, 0x7d, 0x3e, + 0xb4, 0xcb, 0x87, 0x58, 0xd6, 0x1d, 0xa9, 0x32, + 0x97, 0x4c, 0x9f, 0x31, 0x71, 0x93, 0xfe, 0xcf, + 0xb5, 0x68, 0x44, 0xd7, 0xa2, 0x3d, 0x4d, 0xa7, + 0x26, 0x29, 0x8c, 0x4a, 0xd8, 0x43, 0x8c, 0x1f, + 0x5e, 0x3b, 0xe2, 0xa5, 0x86, 0x25, 0x6b, 0xfd, + 0x20, 0xc9, 0xce, 0xdb, 0x7e, 0x33, 0xeb, 0x8a, + 0x7c, 0xa8, 0x0c, 0x87, 0xfb, 0x42, 0x15, 0x0f, + 0x0c, 0x8a, 0x5f, 0x85, 0x05, 0x08, 0xdd, 0xf4, + 0xa4, 0x6f, 0x3d, 0x10, 0xbb, 0x45, 0x22, 0xaa, + 0x9d, 0xa5, 0x8a, 0x90, 0x01, 0xf4, 0xad, 0x5d, + 0x39, 0xae, 0x27, 0x82, 0xe3, 0xed, 0x8c, 0xcf, + 0xb6, 0xe2, 0x32, 0x9b, 0xbf, 0x85, 0xb7, 0x72, + 0x05, 0x39, 0xe4, 0x96, 0x5b, 0xad, 0x5e, 0x17, + 0x72, 0x62, 0x10, 0xb1, 0x54, 0xcf, 0x00, 0x8f, + 0x4a, 0x39, 0x10, 0x18, 0x9f, 0x68, 0xf7, 0xa3, + 0xed, 0x1e, 0xf5, 0x5b, 0xc8, 0x3e, 0xf4, 0x79, + 0x07, 0xde, 0xa0, 0x45, 0x9f, 0xb4, 0x7b, 0xd3, + 0xa2, 0xb9, 0x22, 0x54, 0x20, 0xf3, 0xb8, 0x55, + 0x4f, 0x20, 0xfb, 0xd3, 0xa3, 0x84, 0xf9, 0x89, + 0xd7, 0xa8, 0xa0, 0x0e, 0x9a, 0xf0, 0x01, 0x77, + 0x2f, 0xfb, 0xd5, 0x0d, 0x4d, 0x7b, 0xff, 0x00, + 0x1f, 0x72, 0xfd, 0x6a, 0x1a, 0xeb, 0x28, 0xa7, + 0xaf, 0x5b, 0xcf, 0x26, 0xa0, 0x1a, 0x38, 0x64, + 0x75, 0xf2, 0xd7, 0x95, 0x52, 0x47, 0x4a, 0xcd, + 0xfb, 0x1d, 0xd7, 0xfc, 0xfb, 0x4d, 0xff, 0x00, + 0x7e, 0xcd, 0x6b, 0xeb, 0x5a, 0x85, 0xe5, 0xbd, + 0xf0, 0x8e, 0x1b, 0x87, 0x44, 0xf2, 0xd4, 0xe0, + 0x7d, 0x2b, 0x3f, 0xfb, 0x5f, 0x51, 0xff, 0x00, + 0x9f, 0xb9, 0x28, 0x02, 0x0f, 0xb1, 0xdd, 0x7f, + 0xcf, 0xb4, 0xdf, 0xf7, 0xec, 0xd1, 0xf6, 0x3b, + 0xaf, 0xf9, 0xf6, 0x9b, 0xfe, 0xfd, 0x9a, 0x9f, + 0xfb, 0x5f, 0x51, 0xff, 0x00, 0x9f, 0xb9, 0x28, + 0xfe, 0xd7, 0xd4, 0x7f, 0xe7, 0xee, 0x4a, 0x00, + 0x83, 0xec, 0x77, 0x5f, 0xf3, 0xed, 0x37, 0xfd, + 0xfb, 0x34, 0x7d, 0x8e, 0xeb, 0xfe, 0x7d, 0xa6, + 0xff, 0x00, 0xbf, 0x66, 0xa7, 0xfe, 0xd7, 0xd4, + 0x7f, 0xe7, 0xee, 0x4a, 0x3f, 0xb5, 0xf5, 0x1f, + 0xf9, 0xfb, 0x92, 0x80, 0x20, 0xfb, 0x1d, 0xd7, + 0xfc, 0xfb, 0x4d, 0xff, 0x00, 0x7e, 0xcd, 0x1f, + 0x63, 0xba, 0xff, 0x00, 0x9f, 0x69, 0xbf, 0xef, + 0xd9, 0xa9, 0xff, 0x00, 0xb5, 0xf5, 0x1f, 0xf9, + 0xfb, 0x92, 0x8f, 0xed, 0x7d, 0x47, 0xfe, 0x7e, + 0xe4, 0xa0, 0x07, 0x93, 0x74, 0x6d, 0x05, 0xbf, + 0xf6, 0x68, 0x0a, 0x39, 0xdd, 0xe5, 0xbe, 0x73, + 0x8c, 0x67, 0xaf, 0x5a, 0x26, 0x7d, 0x42, 0x55, + 0xc7, 0xd9, 0x1d, 0x18, 0xb0, 0x76, 0x74, 0x8d, + 0x81, 0x76, 0x1d, 0x09, 0xa9, 0xad, 0xee, 0xb5, + 0x4b, 0x84, 0x0c, 0x2f, 0xb6, 0x6e, 0x6d, 0x88, + 0x1d, 0xb1, 0xbd, 0xbd, 0x07, 0x1e, 0xe2, 0xab, + 0x1d, 0x57, 0x52, 0x04, 0x83, 0x75, 0x20, 0x20, + 0xd0, 0x04, 0x3f, 0x65, 0xbc, 0xdb, 0xb7, 0xec, + 0xf3, 0xed, 0xce, 0x71, 0xb0, 0xf5, 0xab, 0x36, + 0xcd, 0x7d, 0x6c, 0xaa, 0xab, 0x64, 0xce, 0x15, + 0x99, 0xbe, 0x68, 0xdb, 0xb8, 0xc7, 0x6a, 0x5b, + 0x7d, 0x43, 0x54, 0xb8, 0x93, 0x62, 0x5d, 0xb8, + 0xe3, 0x24, 0xb1, 0xc0, 0x51, 0xea, 0x69, 0xf3, + 0xde, 0x6a, 0x70, 0xc6, 0xb2, 0x0b, 0xff, 0x00, + 0x36, 0x36, 0x3b, 0x43, 0xc6, 0xd9, 0x19, 0xf4, + 0xe9, 0x40, 0x10, 0x91, 0x78, 0x26, 0x8e, 0x58, + 0x6c, 0x1a, 0x07, 0x4e, 0x47, 0x97, 0x1b, 0x73, + 0xf9, 0xe6, 0x96, 0x6f, 0xb6, 0xcb, 0x11, 0x8d, + 0x6c, 0x0c, 0x2a, 0xc7, 0x2c, 0x23, 0x89, 0x86, + 0xef, 0xad, 0x49, 0x71, 0x7b, 0xaa, 0xdb, 0xc7, + 0x0b, 0xbd, 0xdb, 0x62, 0x55, 0xdc, 0x30, 0x7a, + 0x7d, 0x7f, 0x31, 0xf9, 0xd4, 0x92, 0xcf, 0xab, + 0xc3, 0x7a, 0x6d, 0x1e, 0xf0, 0xef, 0xc6, 0x73, + 0x9e, 0x08, 0xc6, 0x7d, 0x28, 0x03, 0x3b, 0xec, + 0x77, 0x5f, 0xf3, 0xed, 0x37, 0xfd, 0xfb, 0x34, + 0x7d, 0x8e, 0xeb, 0xfe, 0x7d, 0xa6, 0xff, 0x00, + 0xbf, 0x66, 0xa7, 0xfe, 0xd7, 0xd4, 0x7f, 0xe7, + 0xee, 0x4a, 0x3f, 0xb5, 0xf5, 0x1f, 0xf9, 0xfb, + 0x92, 0x80, 0x20, 0xfb, 0x1d, 0xd7, 0xfc, 0xfb, + 0x4d, 0xff, 0x00, 0x7e, 0xcd, 0x1f, 0x63, 0xba, + 0xff, 0x00, 0x9f, 0x69, 0xbf, 0xef, 0xd9, 0xa9, + 0xff, 0x00, 0xb5, 0xf5, 0x1f, 0xf9, 0xfb, 0x92, + 0x8f, 0xed, 0x7d, 0x47, 0xfe, 0x7e, 0xe4, 0xa0, + 0x08, 0x3e, 0xc7, 0x75, 0xff, 0x00, 0x3e, 0xd3, + 0x7f, 0xdf, 0xb3, 0x47, 0xd8, 0xee, 0xbf, 0xe7, + 0xda, 0x6f, 0xfb, 0xf6, 0x6a, 0x7f, 0xed, 0x7d, + 0x47, 0xfe, 0x7e, 0xe4, 0xa3, 0xfb, 0x5f, 0x51, + 0xff, 0x00, 0x9f, 0xb9, 0x28, 0x02, 0x0f, 0xb1, + 0xdd, 0x7f, 0xcf, 0xb4, 0xdf, 0xf7, 0xec, 0xd1, + 0xf6, 0x3b, 0xaf, 0xf9, 0xf6, 0x9b, 0xfe, 0xfd, + 0x9a, 0x9f, 0xfb, 0x5f, 0x51, 0xff, 0x00, 0x9f, + 0xb9, 0x28, 0xfe, 0xd7, 0xd4, 0x7f, 0xe7, 0xee, + 0x4a, 0x00, 0xde, 0xba, 0x04, 0x3c, 0x60, 0xf0, + 0x7c, 0xb5, 0xcf, 0xe5, 0x50, 0x54, 0xf7, 0x6c, + 0x59, 0xe3, 0x66, 0x39, 0x26, 0x35, 0x24, 0xfe, + 0x15, 0x05, 0x00, 0x53, 0xf1, 0x07, 0x4b, 0x2f, + 0xfa, 0xe4, 0x7f, 0x9d, 0x63, 0x57, 0x47, 0xaa, + 0xdb, 0x43, 0x70, 0x96, 0xa6, 0x4b, 0xc8, 0xe0, + 0x2b, 0x1f, 0x47, 0x07, 0x9e, 0x6b, 0x3b, 0xfb, + 0x3a, 0xd7, 0xfe, 0x82, 0x96, 0xff, 0x00, 0x91, + 0xa0, 0x0c, 0xda, 0xd2, 0xbe, 0xb4, 0xb9, 0x75, + 0x8a, 0x74, 0x81, 0xcc, 0x42, 0xde, 0x32, 0x5c, + 0x0e, 0x38, 0x51, 0x47, 0xf6, 0x75, 0xaf, 0xfd, + 0x05, 0x2d, 0xff, 0x00, 0x23, 0x47, 0xf6, 0x75, + 0xaf, 0xfd, 0x05, 0x2d, 0xff, 0x00, 0x23, 0x40, + 0x16, 0x66, 0xb7, 0x96, 0x0d, 0x62, 0x6b, 0xc9, + 0x50, 0xc7, 0x02, 0x3b, 0x3e, 0xe6, 0xe3, 0x77, + 0xa0, 0x1e, 0xb9, 0xaa, 0x8f, 0x6f, 0x2d, 0xed, + 0xb5, 0xb3, 0xdb, 0x2f, 0x98, 0x63, 0x4f, 0x2d, + 0xd4, 0x75, 0x5f, 0x98, 0x9c, 0xfd, 0x39, 0xa7, + 0x7f, 0x67, 0x5a, 0xff, 0x00, 0xd0, 0x52, 0xdf, + 0xf2, 0x34, 0x7f, 0x67, 0x5a, 0xff, 0x00, 0xd0, + 0x52, 0xdf, 0xf2, 0x34, 0x01, 0x0d, 0xfc, 0x80, + 0x5c, 0xc6, 0xa8, 0xe0, 0x98, 0x63, 0x44, 0xdc, + 0xa7, 0x8c, 0x81, 0xce, 0x3f, 0x1a, 0xd1, 0x77, + 0x86, 0x1b, 0x8b, 0x67, 0x05, 0x42, 0xdd, 0x4c, + 0xb3, 0xb7, 0xa2, 0x8c, 0x71, 0x9f, 0xf8, 0x11, + 0x6f, 0xca, 0xaa, 0x7f, 0x67, 0x5a, 0xff, 0x00, + 0xd0, 0x52, 0xdf, 0xf2, 0x34, 0x7f, 0x67, 0x5a, + 0xff, 0x00, 0xd0, 0x52, 0xdf, 0xf2, 0x34, 0x01, + 0x3d, 0xb2, 0x4b, 0x13, 0xd9, 0xc7, 0x72, 0x18, + 0x4a, 0x6e, 0xc3, 0x28, 0x63, 0xce, 0x38, 0xc9, + 0xfc, 0x4e, 0x29, 0x4c, 0x4e, 0xd2, 0x34, 0x82, + 0x37, 0x90, 0x9b, 0x58, 0xf6, 0x20, 0x24, 0x6f, + 0xe1, 0x41, 0xe9, 0xd7, 0x15, 0x5f, 0xfb, 0x3a, + 0xd7, 0xfe, 0x82, 0x96, 0xff, 0x00, 0x91, 0xa3, + 0xfb, 0x3a, 0xd7, 0xfe, 0x82, 0x96, 0xff, 0x00, + 0x91, 0xa0, 0x0b, 0x77, 0x71, 0xcc, 0xf0, 0xb7, + 0xd9, 0xc6, 0x24, 0x3e, 0x4b, 0x1d, 0x8d, 0xd8, + 0x29, 0x19, 0xcf, 0xa0, 0x3d, 0xe9, 0x65, 0x0b, + 0x24, 0xd7, 0xf1, 0x84, 0x96, 0x49, 0x3c, 0xe5, + 0x62, 0xb0, 0xb8, 0x52, 0x46, 0x0f, 0x3d, 0x0f, + 0x19, 0xa8, 0x60, 0xb5, 0xb5, 0x87, 0x70, 0x37, + 0xd6, 0x52, 0x86, 0xc7, 0x12, 0x23, 0x1c, 0x7e, + 0x54, 0xc9, 0x6c, 0xa0, 0x9a, 0x57, 0x96, 0x4d, + 0x56, 0xdc, 0xbb, 0x9c, 0x93, 0x83, 0x40, 0x09, + 0x0b, 0x86, 0xd7, 0x24, 0x73, 0x18, 0x1c, 0x49, + 0x95, 0x2d, 0xbb, 0x3f, 0x21, 0xcf, 0x22, 0x9a, + 0xd2, 0x47, 0x25, 0x82, 0xb4, 0x30, 0xa4, 0x51, + 0xac, 0xa3, 0xcf, 0x55, 0xc9, 0xcf, 0xf7, 0x4f, + 0x24, 0xf1, 0xd6, 0x8f, 0xec, 0xeb, 0x5f, 0xfa, + 0x0a, 0x5b, 0xfe, 0x46, 0x8f, 0xec, 0xeb, 0x5f, + 0xfa, 0x0a, 0x5b, 0xfe, 0x46, 0x80, 0x34, 0x0b, + 0x2c, 0x77, 0xa5, 0xda, 0x39, 0x04, 0x72, 0x5c, + 0x2b, 0x2c, 0xb2, 0x4a, 0x0a, 0x1e, 0x78, 0x2a, + 0x31, 0xd3, 0xf9, 0x54, 0x30, 0x47, 0x70, 0x96, + 0xab, 0x14, 0xfb, 0x84, 0xac, 0xd3, 0x2a, 0xab, + 0x1e, 0x72, 0x63, 0xe3, 0xf3, 0x35, 0x59, 0x2c, + 0x2d, 0x91, 0xd5, 0x86, 0xa7, 0x6c, 0x4a, 0x9c, + 0xe0, 0xa9, 0x22, 0xa6, 0x9e, 0xde, 0xde, 0x64, + 0x54, 0x1a, 0x85, 0x9c, 0x48, 0xa4, 0xb6, 0xd8, + 0xd5, 0xb1, 0x93, 0xdf, 0x9f, 0xa5, 0x00, 0x1e, + 0x53, 0x47, 0xa7, 0x79, 0x72, 0xe5, 0x1b, 0xc8, + 0xf9, 0x81, 0xea, 0xbf, 0xbe, 0x5a, 0x75, 0xf4, + 0x6e, 0x2d, 0x2e, 0xd4, 0xc4, 0x46, 0xd9, 0x55, + 0x83, 0x33, 0x96, 0x67, 0x5e, 0x46, 0xe3, 0xcf, + 0xb8, 0xe4, 0x7a, 0xd5, 0x6f, 0xec, 0xeb, 0x5f, + 0xfa, 0x0a, 0x5b, 0xfe, 0x46, 0x8f, 0xec, 0xeb, + 0x5f, 0xfa, 0x0a, 0x5b, 0xfe, 0x46, 0x80, 0x2f, + 0x5c, 0xc5, 0x3b, 0x5d, 0x21, 0x87, 0x70, 0x0b, + 0x74, 0xf2, 0x39, 0x07, 0x18, 0x04, 0x8c, 0x31, + 0xf6, 0xc6, 0x79, 0xac, 0xfd, 0x4d, 0xc3, 0x2d, + 0xb0, 0x43, 0xfb, 0xa2, 0x8e, 0xca, 0x07, 0x4f, + 0xf5, 0x8d, 0x4e, 0xfe, 0xce, 0xb5, 0xff, 0x00, + 0xa0, 0xa5, 0xbf, 0xe4, 0x68, 0xfe, 0xce, 0xb5, + 0xff, 0x00, 0xa0, 0xa5, 0xbf, 0xe4, 0x68, 0x03, + 0x36, 0x8a, 0xd2, 0xfe, 0xce, 0xb5, 0xff, 0x00, + 0xa0, 0xa5, 0xbf, 0xe4, 0x68, 0xfe, 0xce, 0xb5, + 0xff, 0x00, 0xa0, 0xa5, 0xbf, 0xe4, 0x68, 0x02, + 0xe6, 0x8b, 0xff, 0x00, 0x20, 0xbb, 0x9f, 0xfa, + 0xe8, 0xb5, 0x3d, 0x2e, 0x9f, 0x04, 0x56, 0xfa, + 0x6d, 0xc2, 0xc7, 0x72, 0x93, 0xe5, 0xd4, 0x92, + 0x9d, 0xa9, 0x28, 0x02, 0xf3, 0xff, 0x00, 0xc7, + 0xb4, 0x3f, 0xef, 0x27, 0xf3, 0x14, 0x51, 0x27, + 0xfc, 0x7b, 0x43, 0xfe, 0xf2, 0x7f, 0x31, 0x45, + 0x00, 0x3e, 0xdb, 0xee, 0x3f, 0xfd, 0x74, 0x6f, + 0xfd, 0x08, 0xd4, 0xf5, 0x0d, 0xaf, 0xdc, 0x7f, + 0xfa, 0xe8, 0xff, 0x00, 0xfa, 0x11, 0xa9, 0xa8, + 0x03, 0x36, 0xef, 0xfe, 0x3e, 0x5f, 0xf0, 0xfe, + 0x55, 0x06, 0xa5, 0x6e, 0x5e, 0xe8, 0xcc, 0x06, + 0x56, 0x50, 0x18, 0x1f, 0xc2, 0xa7, 0xbb, 0xff, + 0x00, 0x8f, 0x97, 0xfc, 0x3f, 0x95, 0x36, 0x5b, + 0x96, 0xb5, 0xd2, 0xe4, 0x97, 0x62, 0xc9, 0xb6, + 0x40, 0x36, 0xbf, 0x4e, 0x6a, 0x27, 0x1e, 0x65, + 0x60, 0x33, 0xfe, 0xcf, 0xed, 0x47, 0xd9, 0xfd, + 0xa9, 0x06, 0xb8, 0x31, 0xff, 0x00, 0x1e, 0x31, + 0x7f, 0xdf, 0x46, 0x8f, 0xed, 0xc5, 0xff, 0x00, + 0x9f, 0x18, 0xbf, 0xef, 0xa3, 0x58, 0xfb, 0x29, + 0x0a, 0xc2, 0xfd, 0x9f, 0xda, 0xac, 0x5b, 0xcd, + 0x73, 0x6c, 0x85, 0x21, 0x93, 0x6a, 0x93, 0x92, + 0x36, 0x83, 0xcd, 0x56, 0xfe, 0xdc, 0x5f, 0xf9, + 0xf1, 0x8b, 0xfe, 0xfa, 0x34, 0x7f, 0x6e, 0x2f, + 0xfc, 0xf8, 0xc5, 0xff, 0x00, 0x7d, 0x1a, 0x6a, + 0x94, 0x97, 0x50, 0xb1, 0x3c, 0x86, 0x79, 0x66, + 0x59, 0x9e, 0x46, 0x32, 0x2f, 0x43, 0xe9, 0x52, + 0x1b, 0x9b, 0xc2, 0xcc, 0xc6, 0x76, 0xcb, 0x0d, + 0xa7, 0x81, 0xd2, 0xab, 0x26, 0xb2, 0x64, 0x60, + 0xa9, 0xa7, 0xc6, 0xcc, 0x7b, 0x02, 0xc4, 0xd3, + 0x7f, 0xb7, 0x17, 0xfe, 0x7c, 0x62, 0xff, 0x00, + 0xbe, 0x8d, 0x1e, 0xce, 0x7d, 0xc2, 0xcc, 0xb6, + 0x6e, 0x2e, 0xcc, 0xc2, 0x5f, 0x34, 0xef, 0x0b, + 0xb7, 0x38, 0x1d, 0x2a, 0x39, 0x5e, 0xe2, 0x58, + 0xfc, 0xb9, 0x24, 0x2c, 0x9b, 0xb7, 0x60, 0xfa, + 0xd2, 0x45, 0xa9, 0xcd, 0x38, 0x2d, 0x0e, 0x93, + 0xe6, 0x00, 0x70, 0x4a, 0x06, 0x34, 0xc9, 0x75, + 0x77, 0x85, 0xb6, 0x4b, 0xa6, 0xac, 0x6d, 0x8c, + 0xe1, 0xb7, 0x03, 0x47, 0xb3, 0x9f, 0x70, 0xb0, + 0xe6, 0x59, 0x1e, 0x04, 0x85, 0x9b, 0x31, 0xa1, + 0x25, 0x46, 0x3a, 0x51, 0x0a, 0xc9, 0x03, 0x31, + 0x8c, 0xed, 0x2c, 0xa5, 0x4f, 0x1d, 0xaa, 0x2f, + 0xed, 0xc5, 0xff, 0x00, 0x9f, 0x18, 0xbf, 0xef, + 0xa3, 0x47, 0xf6, 0xe2, 0xff, 0x00, 0xcf, 0x8c, + 0x5f, 0xf7, 0xd1, 0xa3, 0xd9, 0x4b, 0xb8, 0x58, + 0x9e, 0xdd, 0xa7, 0xb6, 0x24, 0xc2, 0xe5, 0x33, + 0xd7, 0x8e, 0xb4, 0x2b, 0xdc, 0x2d, 0xc7, 0xda, + 0x04, 0x8d, 0xe6, 0xff, 0x00, 0x7a, 0xa0, 0xfe, + 0xdc, 0x5f, 0xf9, 0xf1, 0x8b, 0xfe, 0xfa, 0x34, + 0x7f, 0x6e, 0x2f, 0xfc, 0xf8, 0xc5, 0xff, 0x00, + 0x7d, 0x1a, 0x3d, 0x9c, 0xbb, 0x85, 0x8b, 0x69, + 0x71, 0x77, 0x1e, 0xfd, 0xb3, 0x30, 0xde, 0x72, + 0x78, 0x1d, 0x69, 0x90, 0x3d, 0xc5, 0xbb, 0x33, + 0x45, 0x23, 0x29, 0x6f, 0xbd, 0xdf, 0x35, 0x0f, + 0xf6, 0xc9, 0xd9, 0xbf, 0xfb, 0x3e, 0x3d, 0xb9, + 0xc6, 0xec, 0xb6, 0x33, 0x4d, 0xfe, 0xdc, 0x5f, + 0xf9, 0xf1, 0x8b, 0xfe, 0xfa, 0x34, 0x7b, 0x39, + 0xf7, 0x0b, 0x16, 0x23, 0x92, 0xe6, 0x29, 0x5e, + 0x54, 0x95, 0x83, 0xbf, 0xde, 0x27, 0x9c, 0xd3, + 0x5c, 0xcc, 0xed, 0x1b, 0x33, 0x9c, 0xc6, 0x30, + 0x84, 0x71, 0x8a, 0x87, 0xfb, 0x71, 0x7f, 0xe7, + 0xc6, 0x2f, 0xfb, 0xe8, 0xd1, 0xfd, 0xb8, 0xbf, + 0xf3, 0xe3, 0x17, 0xfd, 0xf4, 0x68, 0xf6, 0x73, + 0xee, 0x16, 0x2d, 0x4b, 0x3d, 0xdc, 0xa5, 0x0c, + 0x92, 0x96, 0xd8, 0x77, 0x2f, 0x03, 0xad, 0x33, + 0x74, 0xe1, 0xe5, 0x7d, 0xff, 0x00, 0x34, 0xa0, + 0x87, 0x38, 0x1c, 0x83, 0x50, 0x7f, 0x6e, 0x2f, + 0xfc, 0xf8, 0xc5, 0xff, 0x00, 0x7d, 0x1a, 0x3f, + 0xb7, 0x17, 0xfe, 0x7c, 0x62, 0xff, 0x00, 0xbe, + 0x8d, 0x1e, 0xce, 0x7d, 0xc2, 0xcc, 0x5f, 0xb3, + 0xfb, 0x51, 0xf6, 0x7f, 0x6a, 0x4f, 0xed, 0xc5, + 0xff, 0x00, 0x9f, 0x18, 0xbf, 0xef, 0xa3, 0x47, + 0xf6, 0xe2, 0xff, 0x00, 0xcf, 0x8c, 0x5f, 0xf7, + 0xd1, 0xa5, 0xec, 0xa4, 0x16, 0x17, 0xec, 0xfe, + 0xd5, 0x2d, 0xbd, 0x99, 0x96, 0x74, 0x50, 0x3b, + 0xf3, 0xec, 0x2a, 0x1f, 0xed, 0xc5, 0xff, 0x00, + 0x9f, 0x18, 0xbf, 0xef, 0xa3, 0x56, 0xf4, 0xbd, + 0x4e, 0x4b, 0xab, 0xc3, 0x08, 0x8a, 0x38, 0xa3, + 0xd8, 0xc4, 0x85, 0x1c, 0x9e, 0x3d, 0x69, 0xaa, + 0x4e, 0xfa, 0x85, 0x89, 0xae, 0x5c, 0x49, 0x71, + 0x23, 0x0e, 0x85, 0xaa, 0x3a, 0x28, 0xae, 0x81, + 0x99, 0xde, 0x21, 0xff, 0x00, 0x90, 0x90, 0xff, + 0x00, 0xae, 0x4b, 0xfc, 0xab, 0x2e, 0xb7, 0xf5, + 0x9d, 0x36, 0xf6, 0xe6, 0xf4, 0x4b, 0x04, 0x05, + 0xd3, 0xcb, 0x51, 0x9c, 0x8e, 0xb8, 0xaa, 0x1f, + 0xd8, 0xba, 0x97, 0xfc, 0xfa, 0xb7, 0xe6, 0x3f, + 0xc6, 0x80, 0x33, 0xe8, 0xad, 0x0f, 0xec, 0x5d, + 0x4b, 0xfe, 0x7d, 0x5b, 0xf3, 0x1f, 0xe3, 0x47, + 0xf6, 0x2e, 0xa5, 0xff, 0x00, 0x3e, 0xad, 0xf9, + 0x8f, 0xf1, 0xa0, 0x0c, 0xfa, 0x2b, 0x43, 0xfb, + 0x17, 0x52, 0xff, 0x00, 0x9f, 0x56, 0xfc, 0xc7, + 0xf8, 0xd1, 0xfd, 0x8b, 0xa9, 0x7f, 0xcf, 0xab, + 0x7e, 0x63, 0xfc, 0x68, 0x03, 0x3e, 0x8a, 0xd0, + 0xfe, 0xc5, 0xd4, 0xbf, 0xe7, 0xd5, 0xbf, 0x31, + 0xfe, 0x34, 0x7f, 0x62, 0xea, 0x5f, 0xf3, 0xea, + 0xdf, 0x98, 0xff, 0x00, 0x1a, 0x00, 0x65, 0x9a, + 0x79, 0x49, 0xf6, 0xc7, 0x52, 0xc1, 0x1b, 0x11, + 0xa0, 0xfe, 0x27, 0xff, 0x00, 0x01, 0xc5, 0x4f, + 0x6f, 0x32, 0x0b, 0x52, 0xb2, 0x4a, 0x9f, 0x69, + 0x60, 0xde, 0x53, 0x11, 0xfe, 0xaf, 0xd4, 0x13, + 0xdb, 0x3c, 0xe3, 0xd3, 0xf1, 0xa7, 0x45, 0x61, + 0xad, 0xc2, 0x9b, 0x22, 0x59, 0xe3, 0x5e, 0xb8, + 0x49, 0x70, 0x3f, 0x9d, 0x42, 0x74, 0x6d, 0x4d, + 0x98, 0x96, 0xb6, 0x72, 0x4f, 0x24, 0x96, 0x1f, + 0xe3, 0x40, 0x0c, 0xb0, 0x53, 0x24, 0x57, 0x71, + 0x20, 0xcc, 0x8f, 0x17, 0xca, 0x07, 0x53, 0x86, + 0x04, 0x8f, 0xc8, 0x53, 0x21, 0xb2, 0x9a, 0x46, + 0x84, 0x32, 0x94, 0x49, 0x24, 0xd8, 0x33, 0xc7, + 0xd4, 0xfe, 0x15, 0x3a, 0xe8, 0xfa, 0x9a, 0xb0, + 0x65, 0xb6, 0x70, 0x47, 0x42, 0x18, 0x7f, 0x8d, + 0x3d, 0xb4, 0xdd, 0x65, 0xe4, 0x12, 0x3c, 0x73, + 0x33, 0x81, 0x80, 0xc6, 0x4c, 0x9f, 0xe7, 0x40, + 0x0b, 0x76, 0xf0, 0x5d, 0x5b, 0x5c, 0x18, 0x65, + 0x77, 0x28, 0xe2, 0x50, 0xac, 0x9b, 0x76, 0xaf, + 0xdd, 0xc0, 0xe4, 0xe7, 0xf8, 0x7f, 0x2a, 0xb6, + 0x48, 0xb8, 0xbf, 0x9d, 0x4f, 0xfa, 0xcb, 0x67, + 0x90, 0x8f, 0x74, 0x39, 0xfe, 0x47, 0xf9, 0xd5, + 0x05, 0xd1, 0xf5, 0x45, 0xce, 0xdb, 0x77, 0x1b, + 0x86, 0x0e, 0x18, 0x72, 0x3f, 0x3a, 0x70, 0xd2, + 0xf5, 0x71, 0x23, 0x48, 0x21, 0x94, 0x3b, 0x67, + 0x2d, 0xbc, 0x64, 0xe7, 0xaf, 0x39, 0xa0, 0x0c, + 0xca, 0x2b, 0x43, 0xfb, 0x17, 0x52, 0xff, 0x00, + 0x9f, 0x56, 0xfc, 0xc7, 0xf8, 0xd1, 0xfd, 0x8b, + 0xa9, 0x7f, 0xcf, 0xab, 0x7e, 0x63, 0xfc, 0x68, + 0x03, 0x3e, 0x8a, 0xd0, 0xfe, 0xc5, 0xd4, 0xbf, + 0xe7, 0xd5, 0xbf, 0x31, 0xfe, 0x34, 0x7f, 0x62, + 0xea, 0x5f, 0xf3, 0xea, 0xdf, 0x98, 0xff, 0x00, + 0x1a, 0x00, 0xcf, 0xa2, 0xb4, 0x3f, 0xb1, 0x75, + 0x2f, 0xf9, 0xf5, 0x6f, 0xcc, 0x7f, 0x8d, 0x1f, + 0xd8, 0xba, 0x97, 0xfc, 0xfa, 0xb7, 0xe6, 0x3f, + 0xc6, 0x80, 0x33, 0xe8, 0xad, 0x0f, 0xec, 0x5d, + 0x4b, 0xfe, 0x7d, 0x5b, 0xf3, 0x1f, 0xe3, 0x47, + 0xf6, 0x2e, 0xa5, 0xff, 0x00, 0x3e, 0xad, 0xf9, + 0x8f, 0xf1, 0xa0, 0x0d, 0xbb, 0xaf, 0xbd, 0x1f, + 0xfd, 0x72, 0x5f, 0xe5, 0x50, 0xd4, 0xf7, 0x8a, + 0x56, 0x44, 0x56, 0x18, 0x22, 0x35, 0x07, 0xf2, + 0xa8, 0x28, 0x02, 0x86, 0xbd, 0xf7, 0xad, 0x3f, + 0xeb, 0x8f, 0xfe, 0xcc, 0x6b, 0x26, 0xb5, 0xb5, + 0xe0, 0x73, 0x68, 0xd8, 0xe0, 0xc5, 0x80, 0x7f, + 0x13, 0x59, 0x34, 0x00, 0x0e, 0x78, 0xab, 0x92, + 0xd9, 0x20, 0x8d, 0x8d, 0xbc, 0xfe, 0x7b, 0x23, + 0x84, 0x60, 0xab, 0xdc, 0xf4, 0xda, 0x7b, 0xf4, + 0xaa, 0x80, 0x02, 0x40, 0x27, 0x1e, 0xf5, 0xab, + 0x24, 0x32, 0x45, 0x64, 0xd1, 0x5c, 0x14, 0x8d, + 0x16, 0x45, 0xf2, 0xa5, 0x5f, 0xe3, 0xeb, 0x93, + 0xc7, 0xde, 0xe3, 0x9c, 0xd0, 0x06, 0x56, 0xc6, + 0x0b, 0xbb, 0x69, 0xdb, 0x9c, 0x67, 0x1d, 0xea, + 0xc5, 0xb5, 0xa1, 0xb8, 0x82, 0x69, 0x77, 0x85, + 0xf2, 0xc7, 0xca, 0x31, 0xf7, 0x8e, 0x09, 0xc7, + 0xe4, 0x0d, 0x4b, 0xa8, 0x5d, 0x47, 0x74, 0xa8, + 0xd1, 0x96, 0x52, 0x84, 0x82, 0xa4, 0x7d, 0xef, + 0xf6, 0xfe, 0xa7, 0xbd, 0x4f, 0x0c, 0xd6, 0xf6, + 0x71, 0x5a, 0x2c, 0xd1, 0xc8, 0xcf, 0xfe, 0xb8, + 0xed, 0x70, 0x07, 0x3c, 0x60, 0xf1, 0xcf, 0x03, + 0xf5, 0xa0, 0x0c, 0xe1, 0x04, 0xc6, 0x33, 0x20, + 0x86, 0x42, 0x80, 0x6e, 0x2c, 0x14, 0xe3, 0x1e, + 0xbf, 0xa5, 0x02, 0x19, 0x9a, 0x23, 0x2a, 0xc4, + 0xe6, 0x31, 0xd5, 0xc2, 0x9c, 0x0f, 0xc6, 0xb5, + 0xdd, 0x1a, 0x0b, 0xcb, 0x4b, 0x7d, 0xc4, 0xaa, + 0x45, 0x28, 0x1e, 0xe3, 0x2f, 0xfd, 0x31, 0x45, + 0x94, 0x67, 0xca, 0x80, 0x2c, 0x65, 0xd1, 0xe1, + 0x71, 0xe6, 0x33, 0x9c, 0x06, 0x3b, 0x86, 0xd5, + 0x19, 0xc7, 0xff, 0x00, 0xae, 0x80, 0x33, 0x24, + 0xb3, 0x94, 0x4d, 0xe5, 0x44, 0x8f, 0x2b, 0x6c, + 0x57, 0xf9, 0x17, 0x3c, 0x15, 0x07, 0xfa, 0xd4, + 0x69, 0x04, 0xd2, 0x06, 0x29, 0x0c, 0x8c, 0x14, + 0xe0, 0xe1, 0x49, 0xc5, 0x6a, 0xce, 0x92, 0xcb, + 0x14, 0x91, 0x5b, 0x86, 0x33, 0x62, 0x06, 0x2a, + 0xbd, 0x4a, 0xf9, 0x7f, 0xd0, 0xd5, 0x86, 0xf3, + 0x25, 0xba, 0xb7, 0x7b, 0x66, 0xca, 0xa5, 0xc9, + 0xf3, 0x59, 0x4f, 0x19, 0xf9, 0x72, 0x4f, 0xd7, + 0x9a, 0x00, 0xc3, 0x82, 0x07, 0x9e, 0xe1, 0x61, + 0x5f, 0x95, 0x8f, 0x5d, 0xdc, 0x63, 0x1d, 0x49, + 0xa9, 0x65, 0xb7, 0x80, 0x44, 0x5e, 0x0b, 0xa1, + 0x2e, 0xd2, 0x01, 0x52, 0x9b, 0x4f, 0xd4, 0x7a, + 0xd4, 0x96, 0xcc, 0xab, 0xa9, 0x4a, 0xae, 0xc1, + 0x04, 0x82, 0x48, 0xf7, 0x13, 0xc0, 0x24, 0x10, + 0x2a, 0x5b, 0x4b, 0x39, 0x2d, 0x2e, 0xa1, 0x9a, + 0xef, 0x6c, 0x2a, 0xb2, 0x28, 0x50, 0xe7, 0xef, + 0x73, 0xd7, 0xe8, 0x3d, 0x68, 0x02, 0x8b, 0x5b, + 0x4e, 0x8c, 0x15, 0xe0, 0x91, 0x58, 0x8d, 0xc1, + 0x4a, 0x1c, 0xe3, 0xd6, 0x86, 0xb6, 0xb8, 0x40, + 0xc5, 0xa0, 0x95, 0x42, 0x7d, 0xec, 0xa1, 0xf9, + 0x7e, 0xb5, 0xad, 0x6c, 0xb3, 0xc1, 0x0e, 0xdb, + 0x8d, 0xcb, 0x37, 0xef, 0x5d, 0x03, 0x1e, 0x71, + 0xe5, 0x9c, 0x9f, 0xcf, 0x15, 0x14, 0x6e, 0xc5, + 0x6d, 0x54, 0xb1, 0x23, 0xec, 0x73, 0x71, 0xff, + 0x00, 0x7d, 0xff, 0x00, 0x80, 0xa0, 0x0c, 0xd6, + 0xb7, 0x9d, 0x63, 0xf3, 0x1a, 0x19, 0x02, 0x0c, + 0x7c, 0xc5, 0x4e, 0x39, 0xe9, 0x41, 0x86, 0x61, + 0x10, 0x94, 0xc4, 0xe2, 0x33, 0xc0, 0x7d, 0xa7, + 0x07, 0xf1, 0xad, 0x69, 0x92, 0x55, 0xf3, 0x65, + 0x7c, 0xf9, 0x1f, 0x63, 0x45, 0x07, 0x3c, 0x67, + 0x6a, 0xe0, 0x7d, 0x73, 0xcd, 0x3f, 0xca, 0x61, + 0x6f, 0x32, 0x2c, 0x65, 0x94, 0xdb, 0x2e, 0xc9, + 0x19, 0x89, 0x2f, 0x8d, 0xa7, 0x81, 0x9c, 0x60, + 0x73, 0xf4, 0xc5, 0x00, 0x64, 0x0b, 0x4b, 0x92, + 0xfb, 0x05, 0xbc, 0xa5, 0xb1, 0x9d, 0xbb, 0x0e, + 0x7d, 0x28, 0x36, 0xb3, 0x0b, 0x61, 0x70, 0x63, + 0x6f, 0x2c, 0xb1, 0x5c, 0xe0, 0xf5, 0xad, 0x59, + 0x43, 0xbd, 0xcd, 0xfb, 0x85, 0x69, 0x98, 0x5c, + 0x6d, 0xd8, 0x5c, 0x85, 0x55, 0xcb, 0x7c, 0xc7, + 0x07, 0xb5, 0x4b, 0x32, 0xed, 0xbb, 0x49, 0x18, + 0x62, 0x35, 0xbd, 0x66, 0x2c, 0x7a, 0x00, 0xc1, + 0x76, 0x9f, 0xa5, 0x00, 0x62, 0x35, 0xb5, 0xc2, + 0x38, 0x46, 0x82, 0x45, 0x62, 0x32, 0x01, 0x43, + 0x92, 0x3d, 0x68, 0x6b, 0x6b, 0x85, 0x46, 0x76, + 0x82, 0x40, 0xaa, 0x70, 0xcc, 0x50, 0xe0, 0x1a, + 0xd6, 0xb6, 0x13, 0xdb, 0xc3, 0xb6, 0x7d, 0xcb, + 0x36, 0x65, 0x74, 0x0c, 0x79, 0xc7, 0x96, 0x72, + 0x7f, 0x3c, 0x54, 0x51, 0xac, 0x92, 0xd8, 0x86, + 0x91, 0x64, 0x40, 0x90, 0xb6, 0xd9, 0xd1, 0xfe, + 0x52, 0x39, 0x3b, 0x58, 0x7a, 0x93, 0xc5, 0x00, + 0x64, 0xd1, 0x45, 0x14, 0x01, 0xb7, 0xa2, 0x7f, + 0xc8, 0x3e, 0xef, 0xfd, 0xf4, 0xfe, 0xb5, 0x6a, + 0xab, 0x68, 0xa0, 0x8d, 0x3a, 0xe5, 0x88, 0xe0, + 0xc8, 0xa0, 0x1f, 0x7e, 0x6a, 0xcd, 0x00, 0x5e, + 0x93, 0xfe, 0x3d, 0xa1, 0xff, 0x00, 0x79, 0x3f, + 0x98, 0xa2, 0x96, 0x4f, 0xf8, 0xf5, 0x87, 0xfd, + 0xe4, 0xfe, 0x62, 0x8a, 0x00, 0x7d, 0xaf, 0xfa, + 0xb7, 0xff, 0x00, 0xae, 0x8d, 0xff, 0x00, 0xa1, + 0x1a, 0x9a, 0xa1, 0xb5, 0xff, 0x00, 0x56, 0xff, + 0x00, 0xf5, 0xd1, 0xff, 0x00, 0xf4, 0x23, 0x53, + 0xd0, 0x06, 0x65, 0xdf, 0xfc, 0x7c, 0xbf, 0xe1, + 0xfc, 0xaa, 0xb6, 0xa1, 0xff, 0x00, 0x20, 0x49, + 0xbf, 0xeb, 0xa2, 0xd5, 0x9b, 0xbf, 0xf8, 0xf9, + 0x7f, 0xc3, 0xf9, 0x54, 0x57, 0x30, 0x4b, 0x71, + 0xa4, 0x4b, 0x1c, 0x28, 0x5d, 0xfc, 0xc5, 0x38, + 0x14, 0x01, 0xcc, 0xd1, 0x57, 0x7f, 0xb2, 0x35, + 0x1f, 0xf9, 0xf4, 0x92, 0x8f, 0xec, 0x8d, 0x47, + 0xfe, 0x7d, 0x24, 0xa0, 0x0a, 0x54, 0x55, 0xdf, + 0xec, 0x8d, 0x47, 0xfe, 0x7d, 0x24, 0xa3, 0xfb, + 0x23, 0x51, 0xff, 0x00, 0x9f, 0x49, 0x28, 0x02, + 0xd6, 0x8f, 0x04, 0xc8, 0x12, 0x74, 0x85, 0xdc, + 0xca, 0xc5, 0x03, 0x05, 0x24, 0x2a, 0x8e, 0xbf, + 0x9f, 0x4f, 0xce, 0xa0, 0x16, 0xd1, 0x2d, 0x83, + 0x5c, 0xbc, 0x4c, 0x1e, 0x3c, 0xc4, 0xc8, 0x73, + 0xf7, 0xff, 0x00, 0xbd, 0xf9, 0x7e, 0xa0, 0x7a, + 0xd3, 0xa0, 0xd3, 0xf5, 0x48, 0x25, 0x59, 0x12, + 0xd6, 0x4c, 0xaf, 0x40, 0x7a, 0x54, 0x82, 0xd3, + 0x55, 0x08, 0x13, 0xec, 0x6d, 0xb3, 0xcb, 0x28, + 0x57, 0x1c, 0x1c, 0xf3, 0x9e, 0xbd, 0x73, 0xcf, + 0xe0, 0x28, 0x02, 0xae, 0x94, 0xc4, 0x5f, 0xc4, + 0x03, 0x10, 0x39, 0xe3, 0xf0, 0x35, 0x3e, 0x9f, + 0x6f, 0x14, 0xcb, 0x19, 0xb8, 0x54, 0x3e, 0x6c, + 0xbb, 0x03, 0xbc, 0x8d, 0x9e, 0xdf, 0x74, 0x0e, + 0xfc, 0xf7, 0xe2, 0x92, 0x0d, 0x3b, 0x53, 0x82, + 0x65, 0x95, 0x2c, 0xdc, 0xb2, 0xfa, 0x8e, 0x2a, + 0x58, 0x2d, 0xb5, 0x58, 0x11, 0x15, 0x6c, 0x72, + 0x63, 0x6d, 0xc8, 0xcc, 0xb9, 0x2a, 0x7b, 0xe3, + 0x9f, 0x6a, 0x00, 0x6c, 0x76, 0xf6, 0xa0, 0x43, + 0x1b, 0xc3, 0xb9, 0x9e, 0x09, 0x24, 0x67, 0xdc, + 0x41, 0xca, 0x96, 0xe9, 0xff, 0x00, 0x7c, 0xd3, + 0x44, 0x36, 0xde, 0x53, 0x5c, 0x1b, 0x71, 0x83, + 0x6d, 0xe6, 0x04, 0x0c, 0x70, 0x1b, 0xcc, 0xdb, + 0xeb, 0x9c, 0x54, 0x8d, 0x6d, 0xaa, 0x34, 0x8a, + 0xe2, 0xc7, 0x6e, 0xd8, 0xde, 0x30, 0x00, 0xe3, + 0x0d, 0xbb, 0x3d, 0xff, 0x00, 0xda, 0x35, 0x2d, + 0xbd, 0xae, 0xa0, 0x90, 0xc8, 0xb2, 0x59, 0x93, + 0xb6, 0x0f, 0x2d, 0x14, 0xaf, 0x0d, 0xf3, 0x86, + 0x39, 0xfd, 0x68, 0x02, 0x31, 0x65, 0x0f, 0x95, + 0xf6, 0x94, 0x81, 0x18, 0x3a, 0xa1, 0x11, 0x3c, + 0xbb, 0x55, 0x72, 0x0e, 0x79, 0x24, 0x67, 0xa7, + 0xad, 0x41, 0x79, 0x05, 0xb5, 0xbd, 0xb1, 0xf2, + 0xd0, 0x3b, 0x34, 0xac, 0xaa, 0xfb, 0xf3, 0x85, + 0x01, 0x4f, 0x6e, 0x0f, 0x5a, 0xb0, 0x60, 0xd5, + 0x19, 0x9b, 0x7e, 0x9e, 0x1e, 0x36, 0x0a, 0x04, + 0x65, 0x7e, 0x55, 0xc7, 0x4c, 0x73, 0x9a, 0x86, + 0x5b, 0x0d, 0x4e, 0x58, 0xc2, 0x1b, 0x22, 0x00, + 0x76, 0x71, 0xb5, 0x40, 0xe4, 0xe3, 0xfc, 0x28, + 0x00, 0xb2, 0x8d, 0x26, 0xb7, 0xb5, 0x8e, 0x41, + 0x94, 0x7b, 0xbd, 0xac, 0x3d, 0x46, 0x16, 0x96, + 0xde, 0x0b, 0x59, 0xd1, 0x64, 0x30, 0x6d, 0x55, + 0xf3, 0x41, 0x01, 0x8f, 0xcd, 0x84, 0xdc, 0x0f, + 0xd6, 0x96, 0x0b, 0x4d, 0x56, 0x01, 0x10, 0x4b, + 0x36, 0x3e, 0x54, 0xbe, 0x68, 0xc8, 0xef, 0xc7, + 0xbf, 0xb5, 0x4d, 0x63, 0x69, 0xa8, 0xc0, 0x4a, + 0xbd, 0xa3, 0x04, 0x02, 0x46, 0x04, 0xae, 0x7e, + 0x62, 0x84, 0x01, 0xfc, 0xa8, 0x02, 0xb3, 0x41, + 0x04, 0x96, 0x0f, 0x72, 0xb1, 0x04, 0x6f, 0x2b, + 0x3b, 0x43, 0x1c, 0x06, 0x0e, 0xa3, 0x3c, 0x9f, + 0x43, 0x4f, 0x8d, 0x21, 0x85, 0x67, 0x1e, 0x52, + 0x90, 0xd6, 0x88, 0xe7, 0x24, 0xf5, 0x25, 0x73, + 0xdf, 0xdf, 0xf4, 0xa9, 0x3e, 0xcf, 0xaa, 0x67, + 0x1f, 0xd9, 0xc3, 0xca, 0xd9, 0xb3, 0xca, 0xc1, + 0xdb, 0x8c, 0xe7, 0xd7, 0x3d, 0x7d, 0xe8, 0xf2, + 0x35, 0x5f, 0x34, 0xc8, 0x6c, 0x41, 0xdd, 0x18, + 0x88, 0xae, 0xde, 0x30, 0x31, 0x8e, 0xfe, 0xc2, + 0x80, 0x2a, 0xea, 0x10, 0xc4, 0x91, 0x87, 0x82, + 0x14, 0xf2, 0xb7, 0xe1, 0x65, 0x8e, 0x4d, 0xc0, + 0x8f, 0x46, 0x07, 0xa1, 0xfc, 0xaa, 0x85, 0x6b, + 0x4f, 0x67, 0xa9, 0x4d, 0x19, 0x8c, 0x69, 0xe2, + 0x25, 0x2d, 0xb9, 0xbc, 0xb5, 0xc6, 0xe3, 0xf9, + 0xfb, 0x9a, 0xad, 0xfd, 0x91, 0xa8, 0xff, 0x00, + 0xcf, 0xa4, 0x94, 0x01, 0x4a, 0x8a, 0xbb, 0xfd, + 0x91, 0xa8, 0xff, 0x00, 0xcf, 0xa4, 0x94, 0x7f, + 0x64, 0x6a, 0x3f, 0xf3, 0xe9, 0x25, 0x00, 0x52, + 0xad, 0x4f, 0x0f, 0x7f, 0xc8, 0x48, 0xff, 0x00, + 0xd7, 0x26, 0xfe, 0x55, 0x07, 0xf6, 0x46, 0xa3, + 0xff, 0x00, 0x3e, 0x92, 0x56, 0x8e, 0x8b, 0x61, + 0x77, 0x6d, 0x7c, 0x64, 0x9a, 0x07, 0x44, 0xf2, + 0xd8, 0x64, 0xfd, 0x28, 0x02, 0x7a, 0x28, 0xa2, + 0x80, 0x28, 0xeb, 0xf2, 0xca, 0x9a, 0x80, 0x54, + 0x91, 0xd4, 0x79, 0x6b, 0xc0, 0x6c, 0x76, 0xa8, + 0x5e, 0x0b, 0x80, 0xf6, 0xc9, 0x1d, 0xd9, 0x91, + 0xa7, 0xe3, 0x86, 0x38, 0x53, 0x9c, 0x75, 0xef, + 0x4f, 0xf1, 0x0f, 0xfc, 0x84, 0x87, 0xfd, 0x72, + 0x5f, 0xe5, 0x53, 0x24, 0x13, 0x5b, 0x0d, 0x3e, + 0x49, 0xe2, 0x78, 0xd1, 0x18, 0x87, 0x66, 0x18, + 0x0b, 0x96, 0xef, 0x40, 0x15, 0x8c, 0x52, 0x3b, + 0x43, 0xf6, 0x7b, 0xd9, 0x25, 0x49, 0x24, 0xf2, + 0xf2, 0x72, 0xb8, 0x6f, 0xa6, 0x7a, 0x73, 0x4c, + 0xd9, 0x2f, 0xd9, 0x24, 0xb8, 0x17, 0x8c, 0x76, + 0x30, 0x01, 0x01, 0x39, 0x23, 0x38, 0xc9, 0xf4, + 0xe9, 0x56, 0x60, 0x89, 0xec, 0xed, 0x58, 0x4c, + 0xbb, 0x64, 0x52, 0xd2, 0x80, 0x7d, 0x97, 0x68, + 0x3f, 0x9b, 0x0f, 0xca, 0xa1, 0xb5, 0xb4, 0xb8, + 0x93, 0x4c, 0xb9, 0x64, 0x85, 0xd9, 0x5c, 0xa1, + 0x52, 0x07, 0x5c, 0x13, 0x9a, 0x00, 0x1a, 0x29, + 0x56, 0x16, 0xc5, 0xe4, 0x86, 0x75, 0x8c, 0x48, + 0xd1, 0xf3, 0xc2, 0x9c, 0x77, 0xcf, 0x5c, 0x11, + 0x43, 0x45, 0x2a, 0xc2, 0xd8, 0xbc, 0x90, 0xce, + 0xb1, 0x89, 0x1a, 0x3e, 0x78, 0x53, 0x8e, 0xf9, + 0xeb, 0x82, 0x2a, 0x59, 0x14, 0x86, 0x9e, 0xf4, + 0x8f, 0xdc, 0xc9, 0x6e, 0x15, 0x5b, 0xd5, 0x8a, + 0x81, 0x8f, 0xa8, 0xe7, 0xf2, 0xa2, 0x45, 0x21, + 0xa7, 0xbd, 0x23, 0xf7, 0x32, 0x5b, 0x85, 0x56, + 0xf5, 0x62, 0xa0, 0x63, 0xea, 0x39, 0xfc, 0xa8, + 0x02, 0x08, 0x46, 0xeb, 0x51, 0x3c, 0xf7, 0xd3, + 0xc6, 0x0b, 0x94, 0x01, 0x57, 0x77, 0x40, 0x0f, + 0xf7, 0x87, 0xad, 0x34, 0xa5, 0xcb, 0xc7, 0x2c, + 0xd0, 0x4d, 0x3c, 0x90, 0x46, 0xc1, 0x4b, 0x9c, + 0x8e, 0xbf, 0x9f, 0xf9, 0xc5, 0x59, 0xb3, 0x5b, + 0x96, 0xd2, 0x87, 0xd9, 0xad, 0xd6, 0x63, 0xe7, + 0xb6, 0x41, 0x88, 0x3e, 0x3e, 0x55, 0xf5, 0xa8, + 0xfc, 0xb9, 0xfe, 0xcb, 0x78, 0xb2, 0x45, 0xb2, + 0x41, 0x24, 0x6e, 0xc8, 0x17, 0x6e, 0x06, 0x1b, + 0x9c, 0x7e, 0x22, 0x80, 0x21, 0xbb, 0x4b, 0xbb, + 0x69, 0x5d, 0x4c, 0x93, 0x94, 0x57, 0x28, 0xb2, + 0x1c, 0x80, 0xd8, 0x34, 0xc6, 0x17, 0xca, 0xe1, + 0x18, 0x5c, 0x06, 0x23, 0x70, 0x07, 0x76, 0x71, + 0xeb, 0x5a, 0xc9, 0x28, 0xfe, 0xd2, 0xbc, 0x69, + 0x9b, 0xe4, 0x5b, 0xa4, 0xea, 0x78, 0x1f, 0x31, + 0x02, 0x9a, 0x85, 0xe1, 0x21, 0x4c, 0x33, 0x46, + 0xc1, 0x66, 0x70, 0xd2, 0xca, 0x19, 0xb3, 0xe5, + 0x9c, 0xe3, 0x81, 0xed, 0xcd, 0x00, 0x66, 0x15, + 0xbf, 0x50, 0xc4, 0x8b, 0x90, 0x17, 0x96, 0x27, + 0x77, 0x1f, 0xe7, 0x06, 0x9a, 0xad, 0x78, 0xd1, + 0xb4, 0xaa, 0x67, 0x31, 0xaf, 0x57, 0x04, 0xe0, + 0x7e, 0x35, 0x7e, 0x17, 0x63, 0x26, 0x9e, 0xa5, + 0x8e, 0x0d, 0xbc, 0x9c, 0x7d, 0x4b, 0xe6, 0x9f, + 0x09, 0x1f, 0x65, 0xb6, 0x95, 0x21, 0x96, 0x45, + 0x8e, 0x26, 0x56, 0x2b, 0x28, 0x54, 0x1d, 0x72, + 0x18, 0x63, 0xff, 0x00, 0xd7, 0xc5, 0x00, 0x67, + 0xdc, 0x0b, 0xdb, 0x66, 0x55, 0x99, 0xe5, 0x52, + 0xca, 0x18, 0x64, 0x91, 0xd6, 0xac, 0xcd, 0x6d, + 0x73, 0x16, 0xa6, 0xb6, 0x62, 0xed, 0xd8, 0x31, + 0x1f, 0xbc, 0xc9, 0xe9, 0xdc, 0xe3, 0x3d, 0xb9, + 0xfc, 0xaa, 0x0d, 0x45, 0x58, 0x49, 0x03, 0x90, + 0x76, 0xb4, 0x11, 0xed, 0x3e, 0xb8, 0x50, 0x0d, + 0x69, 0x5c, 0xba, 0xf9, 0x97, 0x13, 0x12, 0x3c, + 0xc8, 0xa5, 0x78, 0x47, 0xfc, 0x09, 0xb8, 0xfd, + 0x37, 0xd0, 0x05, 0x38, 0x6d, 0xe7, 0x96, 0xf2, + 0x7b, 0x7f, 0xb5, 0xba, 0xf9, 0x44, 0xae, 0xe2, + 0x4f, 0xcc, 0x73, 0xb4, 0x0e, 0xbd, 0xcd, 0x43, + 0x6c, 0x26, 0x95, 0x64, 0x79, 0x6e, 0x9e, 0x28, + 0xa3, 0xc6, 0xe6, 0xc9, 0x27, 0x27, 0xa0, 0x03, + 0xd6, 0xae, 0x5c, 0x3c, 0x36, 0xcd, 0x3b, 0x4a, + 0xb2, 0x16, 0x9a, 0xe9, 0x99, 0x7c, 0xb6, 0x0a, + 0x40, 0x53, 0xc7, 0x50, 0x7b, 0x93, 0xf9, 0x52, + 0x4d, 0x17, 0x9e, 0xb7, 0x30, 0xc0, 0x3e, 0x69, + 0x5d, 0x2e, 0x22, 0x4c, 0xfd, 0xe0, 0x41, 0xc8, + 0x1f, 0x4d, 0xdf, 0xa5, 0x00, 0x53, 0xb8, 0x67, + 0x8b, 0x63, 0x45, 0x78, 0xf2, 0xa3, 0x8c, 0x83, + 0xb8, 0x82, 0x3e, 0xa3, 0xb5, 0x4f, 0x0c, 0x32, + 0x32, 0x6e, 0x9a, 0xf6, 0x58, 0xff, 0x00, 0x74, + 0x65, 0x20, 0x02, 0xc4, 0x2e, 0xe0, 0x07, 0x71, + 0xd6, 0xaa, 0x5c, 0x5b, 0x3d, 0xb6, 0xc5, 0x90, + 0x81, 0x23, 0x0c, 0x94, 0xee, 0xbf, 0x5a, 0xd1, + 0x0c, 0xab, 0x2c, 0xee, 0xc8, 0x24, 0x4f, 0xb1, + 0x47, 0x85, 0x62, 0x70, 0x7e, 0xe7, 0xa7, 0xbd, + 0x00, 0x42, 0x21, 0x79, 0x36, 0x34, 0x17, 0xd2, + 0x3a, 0xc8, 0x59, 0x57, 0x20, 0xa9, 0xde, 0x06, + 0x76, 0xe3, 0x3d, 0xea, 0x39, 0x92, 0xe2, 0x3b, + 0x1b, 0x7b, 0xa1, 0x73, 0x23, 0x09, 0x4b, 0x02, + 0xb9, 0x3f, 0x2e, 0x0e, 0x07, 0x7e, 0xf8, 0x35, + 0x60, 0x37, 0x9a, 0xfa, 0x73, 0x5b, 0x46, 0xb1, + 0xc5, 0xe6, 0x80, 0x51, 0x73, 0xc4, 0x99, 0x19, + 0xc9, 0x3e, 0xd8, 0xa9, 0x93, 0xca, 0x99, 0x62, + 0x81, 0xc8, 0x11, 0x32, 0x19, 0x47, 0xfc, 0x06, + 0x46, 0x27, 0xff, 0x00, 0x1d, 0x2d, 0x40, 0x15, + 0xa6, 0xb6, 0xb8, 0x88, 0x90, 0x6e, 0xe4, 0x24, + 0x5b, 0xf9, 0xc4, 0x73, 0xc1, 0xce, 0x36, 0xf5, + 0xaa, 0xd7, 0x06, 0x78, 0x0c, 0x63, 0xed, 0x12, + 0x36, 0xf8, 0xd5, 0xfe, 0xf1, 0xe3, 0x22, 0xaf, + 0x3c, 0x8d, 0x2a, 0xbc, 0xad, 0xf7, 0x9e, 0xcd, + 0x98, 0xfe, 0x32, 0x1a, 0xa5, 0xa8, 0x7d, 0xfb, + 0x7f, 0xfa, 0xe0, 0x9f, 0xca, 0x80, 0x3a, 0x0b, + 0xae, 0x5a, 0x3c, 0xf7, 0x8d, 0x7f, 0x95, 0x43, + 0x53, 0x5d, 0x7d, 0xe8, 0xff, 0x00, 0xeb, 0x92, + 0xff, 0x00, 0x2a, 0x86, 0x80, 0x09, 0x61, 0x8a, + 0xf2, 0xdb, 0xec, 0xf3, 0x36, 0xc2, 0xa7, 0x31, + 0xc9, 0xfd, 0xd3, 0xe8, 0x7d, 0xab, 0x31, 0xb4, + 0x3b, 0xf0, 0xd8, 0x48, 0xd2, 0x45, 0xfe, 0xf2, + 0x48, 0xb8, 0x3f, 0x99, 0xad, 0x3a, 0x28, 0x03, + 0x2f, 0xfb, 0x0f, 0x52, 0xff, 0x00, 0x9f, 0x71, + 0xff, 0x00, 0x7f, 0x13, 0xfc, 0x68, 0xfe, 0xc3, + 0xd4, 0xbf, 0xe7, 0xdc, 0x7f, 0xdf, 0xc4, 0xff, + 0x00, 0x1a, 0xd4, 0xa2, 0x80, 0x32, 0xff, 0x00, + 0xb0, 0xf5, 0x2f, 0xf9, 0xf7, 0x1f, 0xf7, 0xf1, + 0x3f, 0xc6, 0x8f, 0xec, 0x3d, 0x4b, 0xfe, 0x7d, + 0xc7, 0xfd, 0xfc, 0x4f, 0xf1, 0xad, 0x4a, 0x28, + 0x03, 0x2f, 0xfb, 0x0f, 0x52, 0xff, 0x00, 0x9f, + 0x71, 0xff, 0x00, 0x7f, 0x13, 0xfc, 0x68, 0xfe, + 0xc3, 0xd4, 0xbf, 0xe7, 0xdc, 0x7f, 0xdf, 0xc4, + 0xff, 0x00, 0x1a, 0xd4, 0xa2, 0x80, 0x32, 0xff, + 0x00, 0xb0, 0xf5, 0x2f, 0xf9, 0xf7, 0x1f, 0xf7, + 0xf1, 0x3f, 0xc6, 0xac, 0x5b, 0xe9, 0xda, 0x9d, + 0xb8, 0x1b, 0x6c, 0xa1, 0x66, 0x0d, 0xb9, 0x5d, + 0x99, 0x72, 0xa7, 0xfe, 0xfa, 0xfe, 0x75, 0x72, + 0x8a, 0x00, 0xcb, 0x3a, 0x26, 0xa4, 0x4e, 0x4d, + 0xb8, 0xcf, 0xfd, 0x74, 0x5f, 0xf1, 0xa3, 0xfb, + 0x0f, 0x52, 0xff, 0x00, 0x9f, 0x71, 0xff, 0x00, + 0x7f, 0x13, 0xfc, 0x6b, 0x52, 0x8a, 0x00, 0xcb, + 0xfe, 0xc3, 0xd4, 0xbf, 0xe7, 0xdc, 0x7f, 0xdf, + 0xc4, 0xff, 0x00, 0x1a, 0x3f, 0xb0, 0xf5, 0x2f, + 0xf9, 0xf7, 0x1f, 0xf7, 0xf1, 0x3f, 0xc6, 0xb5, + 0x28, 0xa0, 0x0c, 0xf9, 0xb4, 0x9d, 0x52, 0x77, + 0x0e, 0xd6, 0xca, 0x08, 0x55, 0x5e, 0x24, 0x5e, + 0xc0, 0x0f, 0x5f, 0x6a, 0x8f, 0xfb, 0x0f, 0x52, + 0xff, 0x00, 0x9f, 0x71, 0xff, 0x00, 0x7f, 0x13, + 0xfc, 0x6b, 0x52, 0x8a, 0x00, 0xcb, 0xfe, 0xc3, + 0xd4, 0xbf, 0xe7, 0xdc, 0x7f, 0xdf, 0xc4, 0xff, + 0x00, 0x1a, 0x3f, 0xb0, 0xf5, 0x2f, 0xf9, 0xf7, + 0x1f, 0xf7, 0xf1, 0x3f, 0xc6, 0xb5, 0x28, 0xa0, + 0x0c, 0xbf, 0xec, 0x3d, 0x4b, 0xfe, 0x7d, 0xc7, + 0xfd, 0xfc, 0x4f, 0xf1, 0xa3, 0xfb, 0x0f, 0x52, + 0xff, 0x00, 0x9f, 0x71, 0xff, 0x00, 0x7f, 0x13, + 0xfc, 0x6b, 0x52, 0x8a, 0x00, 0xcb, 0xfe, 0xc3, + 0xd4, 0xbf, 0xe7, 0xdc, 0x7f, 0xdf, 0xc4, 0xff, + 0x00, 0x1a, 0x7c, 0x7a, 0x1d, 0xd9, 0x61, 0xe7, + 0x18, 0xe1, 0x5e, 0xe5, 0x9c, 0x1f, 0xd0, 0x56, + 0x8d, 0x14, 0x00, 0xec, 0x45, 0x0c, 0x09, 0x6d, + 0x06, 0x7c, 0xb4, 0xe7, 0x71, 0xea, 0xc7, 0xd6, + 0x9b, 0x45, 0x14, 0x01, 0x7e, 0x4f, 0xf8, 0xf5, + 0x87, 0xfd, 0xe8, 0xff, 0x00, 0x98, 0xa2, 0x89, + 0x3f, 0xe3, 0xd6, 0x1f, 0xf7, 0xa3, 0xfe, 0x62, + 0x8a, 0x00, 0x92, 0xd7, 0xfd, 0x5b, 0xff, 0x00, + 0xd7, 0x47, 0xff, 0x00, 0xd0, 0x8d, 0x4d, 0x50, + 0xda, 0xff, 0x00, 0xab, 0x7f, 0xfa, 0xe8, 0xff, + 0x00, 0xfa, 0x11, 0xa9, 0xe8, 0x03, 0x2e, 0xf3, + 0xfe, 0x3e, 0x5f, 0xf0, 0xfe, 0x55, 0x15, 0xcc, + 0xf2, 0xdb, 0xe9, 0x12, 0xc9, 0x0b, 0x94, 0x7f, + 0x31, 0x46, 0x45, 0x4b, 0x79, 0xff, 0x00, 0x1f, + 0x2f, 0xf8, 0x7f, 0x2a, 0xad, 0xa8, 0x7f, 0xc8, + 0x12, 0x6f, 0xfa, 0xe8, 0xb4, 0x01, 0x97, 0xfd, + 0xaf, 0xa8, 0xff, 0x00, 0xcf, 0xdc, 0x94, 0x7f, + 0x6b, 0xea, 0x3f, 0xf3, 0xf7, 0x25, 0x51, 0xa2, + 0x80, 0x2f, 0x7f, 0x6b, 0xea, 0x3f, 0xf3, 0xf7, + 0x25, 0x1f, 0xda, 0xfa, 0x8f, 0xfc, 0xfd, 0xc9, + 0x54, 0x68, 0xa0, 0x0d, 0x08, 0xb5, 0x2d, 0x52, + 0x79, 0x16, 0x38, 0xae, 0x25, 0x67, 0x3d, 0x00, + 0xa9, 0xcc, 0xfa, 0xd8, 0x95, 0x23, 0xf3, 0x9f, + 0x73, 0xe7, 0x69, 0x0e, 0xb8, 0x38, 0xe4, 0xf3, + 0xd2, 0xaa, 0x58, 0xe7, 0xc8, 0xbd, 0xd9, 0xf7, + 0xfc, 0x9e, 0x3e, 0x9b, 0x97, 0x77, 0xe9, 0x52, + 0x69, 0x42, 0x43, 0x32, 0xee, 0x2e, 0x2d, 0xfe, + 0x7c, 0x91, 0xd3, 0x3e, 0x5b, 0x7e, 0xb8, 0xa0, + 0x09, 0x67, 0xbb, 0xd6, 0x20, 0x40, 0xf2, 0x5c, + 0x36, 0xc2, 0x71, 0xb9, 0x5d, 0x58, 0x67, 0xf0, + 0xa7, 0x7d, 0xa3, 0x5b, 0xf2, 0x7c, 0xdf, 0x36, + 0x5d, 0xbb, 0x77, 0x7d, 0xe1, 0x9c, 0x7a, 0xe3, + 0xae, 0x2a, 0x17, 0x58, 0x21, 0xd3, 0xc7, 0x94, + 0xef, 0x2a, 0x4d, 0x28, 0xde, 0xcc, 0xbb, 0x76, + 0xed, 0xed, 0x8c, 0x9f, 0x5a, 0x6d, 0xe8, 0x9c, + 0xeb, 0x33, 0x88, 0xf7, 0x79, 0x9e, 0x63, 0x6c, + 0xdb, 0xd7, 0x1d, 0xb1, 0xf8, 0x50, 0x03, 0xa1, + 0xd4, 0x75, 0x49, 0xe5, 0x58, 0xa2, 0xb9, 0x91, + 0x9d, 0x8e, 0x00, 0xc8, 0xa6, 0x36, 0xab, 0xa9, + 0x2b, 0x15, 0x37, 0x52, 0x02, 0x0e, 0x08, 0xa3, + 0x4e, 0x41, 0xe5, 0xdc, 0x4c, 0x65, 0x48, 0xb0, + 0x9b, 0x15, 0xdf, 0x38, 0xcb, 0x7d, 0x07, 0xa0, + 0x6a, 0xb1, 0x3a, 0x22, 0x4f, 0x75, 0x76, 0x04, + 0x72, 0xe6, 0x35, 0x95, 0x32, 0x32, 0xb9, 0x66, + 0x01, 0x8e, 0x0f, 0xbe, 0x68, 0x02, 0xbf, 0xf6, + 0xbe, 0xa3, 0xff, 0x00, 0x3f, 0x72, 0x51, 0xfd, + 0xaf, 0xa8, 0xff, 0x00, 0xcf, 0xdc, 0x95, 0x33, + 0x3a, 0xc7, 0x0c, 0x32, 0x0b, 0x28, 0xcb, 0x5c, + 0x39, 0x0c, 0x85, 0x73, 0xd9, 0x78, 0x5f, 0x4c, + 0xe7, 0x3c, 0x7a, 0x8a, 0x7c, 0x71, 0xdb, 0x47, + 0x6d, 0x02, 0xc8, 0xf6, 0xea, 0xb2, 0x44, 0x59, + 0xf7, 0x29, 0x2e, 0x4e, 0x4e, 0x08, 0x38, 0xe3, + 0x18, 0x1d, 0xe8, 0x02, 0x09, 0x35, 0x2d, 0x4e, + 0x26, 0xda, 0xf7, 0x32, 0x03, 0x80, 0xdd, 0x47, + 0x42, 0x32, 0x3f, 0x9d, 0x37, 0xfb, 0x5f, 0x51, + 0xff, 0x00, 0x9f, 0xb9, 0x2a, 0xeb, 0xa4, 0x61, + 0x5e, 0x62, 0xd0, 0x2b, 0xed, 0x85, 0x01, 0x9d, + 0x4b, 0x00, 0x3c, 0xb0, 0x7a, 0x60, 0xf3, 0xc5, + 0x57, 0xbb, 0x10, 0xad, 0xb0, 0x5b, 0x68, 0xe3, + 0x61, 0x2c, 0xee, 0xa1, 0xf6, 0xf2, 0x06, 0x14, + 0xe0, 0x67, 0x9e, 0xa6, 0x80, 0x22, 0x5d, 0x57, + 0x52, 0x62, 0x15, 0x6e, 0xa5, 0x24, 0x9c, 0x00, + 0x3b, 0xd1, 0xfd, 0xad, 0xa8, 0xff, 0x00, 0xcf, + 0xdc, 0x95, 0xa3, 0x12, 0x42, 0x2e, 0x10, 0xaa, + 0xc6, 0x5e, 0x1b, 0xa8, 0xe3, 0xf9, 0x21, 0x0a, + 0x06, 0x49, 0x04, 0x67, 0xab, 0x74, 0xea, 0x6a, + 0xa4, 0x6c, 0xaa, 0xb0, 0x39, 0x82, 0x27, 0x6b, + 0x89, 0xd9, 0x5f, 0x31, 0x8e, 0x83, 0x1c, 0x0f, + 0x4e, 0xbd, 0xa8, 0x02, 0x1f, 0xed, 0x7d, 0x47, + 0xfe, 0x7e, 0xe4, 0xa3, 0xfb, 0x5f, 0x51, 0xff, + 0x00, 0x9f, 0xb9, 0x29, 0xda, 0x8a, 0xc7, 0x0c, + 0x50, 0x43, 0x1c, 0x68, 0x06, 0x18, 0x97, 0xdb, + 0xcb, 0x61, 0xd8, 0x0e, 0x6b, 0x3e, 0x80, 0x2f, + 0x7f, 0x6b, 0xea, 0x3f, 0xf3, 0xf7, 0x25, 0x1f, + 0xda, 0xfa, 0x8f, 0xfc, 0xfd, 0xc9, 0x54, 0x68, + 0xa0, 0x0b, 0xdf, 0xda, 0xfa, 0x8f, 0xfc, 0xfd, + 0xc9, 0x5a, 0x1a, 0x2d, 0xfd, 0xdd, 0xcd, 0xf1, + 0x8e, 0x69, 0xdd, 0xd3, 0xcb, 0x63, 0x83, 0xf4, + 0xac, 0x1a, 0xd4, 0xf0, 0xf7, 0xfc, 0x84, 0x8f, + 0xfd, 0x72, 0x6f, 0xe5, 0x40, 0x1a, 0x34, 0x51, + 0x45, 0x00, 0x67, 0x78, 0x87, 0xfe, 0x42, 0x43, + 0xfe, 0xb9, 0x2f, 0xf2, 0xac, 0xba, 0xd4, 0xf1, + 0x0f, 0xfc, 0x84, 0x87, 0xfd, 0x72, 0x5f, 0xe5, + 0x59, 0x74, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, + 0x45, 0x14, 0x00, 0x53, 0x96, 0x39, 0x18, 0x29, + 0x54, 0x62, 0x19, 0xb6, 0x8c, 0x0e, 0xa7, 0xd2, + 0x9b, 0x5a, 0x96, 0x1f, 0xea, 0x6c, 0xff, 0x00, + 0xeb, 0xf4, 0x7f, 0xec, 0xb4, 0x01, 0x4d, 0xac, + 0x6f, 0x10, 0x65, 0xad, 0x27, 0x51, 0x90, 0x32, + 0x63, 0x3d, 0x69, 0x24, 0xb3, 0xba, 0x89, 0x0b, + 0xc9, 0x6d, 0x32, 0x20, 0xea, 0xcd, 0x19, 0x00, + 0x55, 0xd8, 0xbc, 0x8f, 0xed, 0x18, 0x3c, 0xbb, + 0xa9, 0xa4, 0x6f, 0xb4, 0x2f, 0xca, 0xd1, 0xe0, + 0x7d, 0xef, 0x5c, 0x9a, 0xaf, 0x77, 0xe4, 0x7c, + 0xfe, 0x5d, 0xd4, 0xd2, 0x36, 0xe3, 0xf2, 0xb4, + 0x78, 0x1f, 0x9e, 0x4d, 0x00, 0x46, 0xd6, 0x37, + 0x88, 0xa5, 0xda, 0xd2, 0x75, 0x50, 0x32, 0x49, + 0x8c, 0xe0, 0x0a, 0x85, 0x11, 0xe4, 0x6d, 0xa8, + 0x85, 0x9b, 0xae, 0x14, 0x66, 0xb4, 0xb5, 0x5f, + 0x23, 0xed, 0x77, 0x38, 0xba, 0x9b, 0xcc, 0xdc, + 0x7e, 0x4f, 0x2f, 0x8c, 0xfa, 0x67, 0x77, 0xf4, + 0xa8, 0x34, 0xa9, 0x5d, 0x2e, 0xf6, 0x2b, 0x61, + 0x5d, 0x5b, 0x77, 0xbf, 0xca, 0x68, 0x02, 0xbc, + 0x36, 0xf3, 0xcf, 0x9f, 0x26, 0x19, 0x24, 0xdb, + 0xd7, 0x62, 0x93, 0x8a, 0x05, 0xb4, 0xe4, 0xb8, + 0x10, 0x48, 0x4c, 0x7f, 0x7c, 0x04, 0x3f, 0x2f, + 0xd7, 0xd2, 0xa7, 0xb4, 0x78, 0x05, 0xa4, 0xd1, + 0x4b, 0x3b, 0x44, 0xcd, 0x22, 0x10, 0x55, 0x37, + 0x12, 0x00, 0x6f, 0xf1, 0xab, 0xf0, 0xc6, 0x2d, + 0xbc, 0x88, 0xe7, 0x98, 0xa1, 0x5b, 0x92, 0xd1, + 0x94, 0xe7, 0xcc, 0xe1, 0x7a, 0xfa, 0x0e, 0x9c, + 0xf3, 0xd4, 0xf1, 0x40, 0x18, 0xeb, 0x0c, 0xad, + 0x19, 0x95, 0x62, 0x73, 0x1a, 0xf5, 0x70, 0xa7, + 0x03, 0xf1, 0xa6, 0x56, 0xda, 0x0d, 0xa6, 0x14, + 0x76, 0x29, 0x70, 0x22, 0x91, 0x56, 0x11, 0xf7, + 0x5b, 0x25, 0xba, 0x9e, 0xdd, 0xff, 0x00, 0x21, + 0xd2, 0xb1, 0x28, 0x00, 0xa9, 0x1e, 0x56, 0x92, + 0x28, 0xe3, 0x60, 0x3f, 0x77, 0x90, 0x0f, 0x7c, + 0x75, 0xc7, 0xf3, 0xfc, 0xea, 0x3a, 0x28, 0x02, + 0x48, 0x65, 0x68, 0x1c, 0xba, 0x01, 0xbb, 0x04, + 0x02, 0x7b, 0x67, 0xbd, 0x47, 0x45, 0x14, 0x00, + 0x51, 0x45, 0x14, 0x01, 0xd5, 0xdd, 0x7d, 0xe8, + 0xff, 0x00, 0xeb, 0x92, 0xff, 0x00, 0x2a, 0x86, + 0xa6, 0xba, 0xfb, 0xd1, 0xff, 0x00, 0xd7, 0x25, + 0xfe, 0x55, 0x0d, 0x00, 0x14, 0x51, 0x45, 0x00, + 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, + 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, + 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, + 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, + 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, + 0x14, 0x51, 0x45, 0x00, 0x68, 0x49, 0xff, 0x00, + 0x1e, 0xb0, 0x7f, 0xbd, 0x1f, 0xf3, 0x14, 0x51, + 0x27, 0xfc, 0x7a, 0xc1, 0xfe, 0xf4, 0x7f, 0xcc, + 0x51, 0x40, 0x0f, 0xb4, 0xff, 0x00, 0x56, 0xff, + 0x00, 0xf5, 0xd1, 0xff, 0x00, 0xf4, 0x23, 0x53, + 0xd4, 0x36, 0x9f, 0xea, 0xdf, 0xfe, 0xba, 0x3f, + 0xfe, 0x84, 0x6a, 0x7a, 0x00, 0xca, 0xbc, 0xff, + 0x00, 0x8f, 0xa7, 0xfc, 0x3f, 0x95, 0x32, 0xe6, + 0xde, 0x5b, 0x8d, 0x1a, 0x44, 0x85, 0x0b, 0xb9, + 0x94, 0x70, 0x29, 0xf7, 0x9f, 0xf1, 0xf4, 0xff, + 0x00, 0x87, 0xf2, 0xaa, 0x7a, 0xa3, 0xba, 0x69, + 0x31, 0x94, 0x72, 0xa7, 0xcf, 0xec, 0x71, 0xfc, + 0x34, 0x01, 0x9b, 0xfd, 0x91, 0xa8, 0xff, 0x00, + 0xcf, 0xa4, 0x94, 0x7f, 0x64, 0x6a, 0x3f, 0xf3, + 0xe9, 0x25, 0x57, 0xfb, 0x44, 0xff, 0x00, 0xf3, + 0xda, 0x4f, 0xfb, 0xe8, 0xd1, 0xf6, 0x89, 0xff, + 0x00, 0xe7, 0xb4, 0x9f, 0xf7, 0xd1, 0xa0, 0x0b, + 0x1f, 0xd9, 0x1a, 0x8f, 0xfc, 0xfa, 0x49, 0x47, + 0xf6, 0x46, 0xa3, 0xff, 0x00, 0x3e, 0x92, 0x53, + 0x55, 0x6e, 0xda, 0xcd, 0xee, 0x84, 0xed, 0xb1, + 0x5b, 0x69, 0x1b, 0xce, 0x7b, 0x7f, 0x88, 0xfc, + 0xea, 0x44, 0x8a, 0x63, 0x04, 0x72, 0xbe, 0xa0, + 0x91, 0x09, 0x01, 0x2a, 0x1d, 0xdf, 0x3c, 0x1c, + 0x76, 0x1e, 0xd4, 0x00, 0xe8, 0xb4, 0xdd, 0x52, + 0x19, 0x04, 0x91, 0x5b, 0xca, 0x8e, 0x3a, 0x11, + 0x52, 0xbd, 0xbe, 0xb4, 0xee, 0xae, 0xd0, 0x49, + 0x95, 0x04, 0x00, 0x10, 0x00, 0x32, 0x30, 0x78, + 0xe9, 0x50, 0xa4, 0x17, 0x2e, 0x14, 0x9b, 0xe4, + 0x40, 0xe4, 0x88, 0xf7, 0x48, 0xc3, 0x7e, 0x0e, + 0x32, 0x3d, 0xbe, 0xb8, 0xaa, 0xaf, 0x35, 0xc2, + 0x39, 0x46, 0x96, 0x40, 0xca, 0x70, 0x46, 0xe3, + 0x40, 0x16, 0xd7, 0x4d, 0xd5, 0x16, 0x26, 0x88, + 0x5b, 0x49, 0xb1, 0xc8, 0x24, 0x60, 0x75, 0x15, + 0x2f, 0xd9, 0xf5, 0xbf, 0x27, 0xc9, 0xf2, 0xa5, + 0xd9, 0xb7, 0x6f, 0xdd, 0x19, 0xc7, 0xa6, 0x7a, + 0xe2, 0xa1, 0x8e, 0x0b, 0x87, 0x86, 0x29, 0x0d, + 0xf2, 0x21, 0x94, 0x12, 0x88, 0xf2, 0x30, 0x27, + 0x9c, 0x7a, 0x63, 0xb7, 0xad, 0x36, 0x28, 0xae, + 0x9f, 0xce, 0xf3, 0x2e, 0xfc, 0x8f, 0x25, 0x82, + 0xb7, 0x98, 0xed, 0xd4, 0xe7, 0xd0, 0x1f, 0x4a, + 0x00, 0x77, 0xf6, 0x6e, 0xa9, 0xe4, 0xf9, 0x3f, + 0x66, 0x93, 0x66, 0xed, 0xd8, 0xc0, 0xeb, 0x52, + 0x47, 0x69, 0xac, 0x45, 0xb3, 0x65, 0xbc, 0x80, + 0x20, 0x2a, 0x01, 0x50, 0x46, 0x09, 0xc9, 0x1e, + 0xf5, 0x08, 0x8e, 0xe1, 0xa6, 0x31, 0xc7, 0x7a, + 0xae, 0xa1, 0x77, 0xb4, 0x81, 0xdb, 0x6a, 0x8f, + 0x7c, 0x8f, 0xf3, 0x9a, 0x65, 0xc7, 0xda, 0x60, + 0xd8, 0xdf, 0x69, 0x32, 0x23, 0xfd, 0xd7, 0x47, + 0x38, 0x34, 0x01, 0x71, 0x60, 0xd6, 0xd4, 0xb9, + 0x11, 0x4b, 0x97, 0x39, 0x24, 0xa8, 0xe0, 0xe3, + 0x1c, 0x7a, 0x7e, 0x14, 0xd4, 0xb4, 0xd6, 0x23, + 0x87, 0xca, 0x58, 0x24, 0x09, 0x82, 0x07, 0xca, + 0x32, 0x33, 0xd7, 0x07, 0xa8, 0xaa, 0x76, 0xe6, + 0xe6, 0x77, 0x2a, 0xb3, 0xb2, 0x85, 0x1b, 0x99, + 0x99, 0xc8, 0x0a, 0x3d, 0x6a, 0x67, 0x86, 0xe9, + 0x55, 0x9d, 0x6e, 0x83, 0xa0, 0x42, 0xfb, 0xd6, + 0x43, 0x82, 0x01, 0x00, 0x8f, 0xaf, 0x34, 0x01, + 0x32, 0xda, 0xeb, 0x2a, 0xe5, 0x85, 0xbb, 0x92, + 0x55, 0x54, 0x82, 0x8a, 0x41, 0x00, 0x60, 0x70, + 0x69, 0x92, 0x58, 0xea, 0xd2, 0x80, 0x1e, 0x09, + 0x5b, 0xe6, 0x2f, 0xc8, 0xee, 0x71, 0x93, 0xfa, + 0x0a, 0xac, 0x5a, 0xe4, 0x5b, 0x89, 0xfc, 0xf7, + 0xda, 0x5c, 0xa6, 0x37, 0x9c, 0xe7, 0x19, 0xfe, + 0xb4, 0xeb, 0x85, 0xbb, 0xb7, 0x8e, 0x17, 0x79, + 0x9b, 0x12, 0xae, 0xe1, 0x87, 0x3c, 0x7d, 0x7f, + 0x31, 0xf9, 0xd0, 0x05, 0xd3, 0x0e, 0xb8, 0x49, + 0x26, 0x17, 0xc9, 0x20, 0xf0, 0x8b, 0xd4, 0x1c, + 0xe7, 0xeb, 0xef, 0x48, 0xb6, 0xfa, 0xd2, 0x16, + 0x2b, 0x03, 0x82, 0xcd, 0xb8, 0xe1, 0x17, 0x83, + 0xea, 0x3d, 0x0f, 0xd2, 0xaa, 0x40, 0x97, 0x53, + 0x46, 0x5d, 0x6e, 0x0a, 0xf2, 0x42, 0x86, 0x73, + 0x96, 0x20, 0x64, 0x81, 0x51, 0xc2, 0xf7, 0x13, + 0x4d, 0x1c, 0x2b, 0x3b, 0x86, 0x76, 0x0a, 0x32, + 0xe7, 0x1c, 0xd0, 0x05, 0x87, 0xd3, 0x75, 0x49, + 0x15, 0x15, 0xed, 0xa4, 0x21, 0x06, 0xd5, 0xe0, + 0x70, 0x32, 0x4f, 0xf3, 0x26, 0x99, 0xfd, 0x91, + 0xa8, 0xff, 0x00, 0xcf, 0xa4, 0x94, 0xe8, 0xa0, + 0xbd, 0x96, 0xf8, 0xd9, 0xac, 0xec, 0x24, 0x52, + 0x41, 0x25, 0xce, 0x38, 0xa7, 0x0b, 0x5b, 0xa2, + 0x10, 0x2d, 0xea, 0x99, 0x5d, 0x03, 0xac, 0x5e, + 0x63, 0x06, 0x39, 0x19, 0x1d, 0xb1, 0x9f, 0xc6, + 0x80, 0x23, 0xfe, 0xc8, 0xd4, 0x7f, 0xe7, 0xd2, + 0x4a, 0x3f, 0xb2, 0x35, 0x1f, 0xf9, 0xf4, 0x92, + 0x96, 0x14, 0x9e, 0x48, 0x04, 0xcf, 0x7c, 0xb0, + 0xa9, 0x62, 0x80, 0x48, 0xed, 0x92, 0x46, 0x33, + 0xd0, 0x1f, 0x51, 0x55, 0x8d, 0xc4, 0xe0, 0xe3, + 0xcf, 0x93, 0xfe, 0xfa, 0x34, 0x01, 0x63, 0xfb, + 0x23, 0x51, 0xff, 0x00, 0x9f, 0x49, 0x2b, 0x47, + 0x45, 0xb0, 0xbb, 0xb6, 0xbe, 0x32, 0x4d, 0x03, + 0xa2, 0x79, 0x6c, 0x32, 0x7e, 0x95, 0x8d, 0xf6, + 0x89, 0xff, 0x00, 0xe7, 0xb4, 0x9f, 0xf7, 0xd1, + 0xad, 0x3d, 0x0a, 0x59, 0x1e, 0x7b, 0x90, 0xf2, + 0x33, 0x0f, 0xb3, 0xb7, 0x04, 0xe7, 0xb8, 0xa0, + 0x0b, 0xb4, 0x51, 0x45, 0x00, 0x51, 0xd7, 0xe2, + 0x95, 0xf5, 0x00, 0xc9, 0x1b, 0xb0, 0xf2, 0xd7, + 0x90, 0xb9, 0xed, 0x59, 0xbf, 0x67, 0x9f, 0xfe, + 0x78, 0xc9, 0xff, 0x00, 0x7c, 0x9a, 0xd8, 0xd6, + 0x2f, 0xee, 0xed, 0xee, 0x21, 0x48, 0x6e, 0x1d, + 0x14, 0xc2, 0xa7, 0x03, 0xd6, 0xa8, 0x7f, 0x6b, + 0xea, 0x3f, 0xf3, 0xf7, 0x25, 0x00, 0x56, 0xfb, + 0x3c, 0xff, 0x00, 0xf3, 0xc6, 0x4f, 0xfb, 0xe4, + 0xd1, 0xf6, 0x79, 0xff, 0x00, 0xe7, 0x8c, 0x9f, + 0xf7, 0xc9, 0xab, 0x3f, 0xda, 0xfa, 0x8f, 0xfc, + 0xfd, 0xc9, 0x52, 0x2e, 0xa3, 0xa9, 0xb5, 0xbc, + 0x93, 0x0b, 0xc7, 0xda, 0x8c, 0xaa, 0x46, 0x79, + 0xe7, 0x3f, 0xe1, 0x40, 0x14, 0xbe, 0xcf, 0x3f, + 0xfc, 0xf1, 0x93, 0xfe, 0xf9, 0x34, 0x7d, 0x9e, + 0x7f, 0xf9, 0xe3, 0x27, 0xfd, 0xf2, 0x6b, 0x4a, + 0x3b, 0xad, 0x56, 0x45, 0x8d, 0xc5, 0xe9, 0x54, + 0x75, 0x67, 0x2c, 0xcd, 0xc2, 0x80, 0x71, 0xcf, + 0x14, 0xe1, 0x71, 0xaa, 0x34, 0xd1, 0xc6, 0xba, + 0x82, 0xb2, 0xc8, 0x19, 0x96, 0x40, 0xdf, 0x2f, + 0x03, 0x27, 0xb6, 0x7f, 0x4a, 0x00, 0xcb, 0xfb, + 0x3c, 0xff, 0x00, 0xf3, 0xc6, 0x4f, 0xfb, 0xe4, + 0xd4, 0xf0, 0xbd, 0xd4, 0x2b, 0x12, 0xac, 0x0c, + 0x44, 0x72, 0xf9, 0xa3, 0x28, 0x7a, 0xf1, 0xfe, + 0x15, 0x66, 0x7b, 0xdd, 0x4a, 0x18, 0xd6, 0x41, + 0x7f, 0xe6, 0xc6, 0xc4, 0xa8, 0x68, 0xdb, 0xb8, + 0xed, 0xc8, 0x14, 0xf4, 0xb9, 0xd4, 0x0c, 0x11, + 0xca, 0xfa, 0xaa, 0x44, 0x24, 0x04, 0xa8, 0x72, + 0xd9, 0xe0, 0xe3, 0xb2, 0xfb, 0x50, 0x04, 0x1e, + 0x7c, 0xc2, 0x45, 0x91, 0x74, 0xd8, 0x91, 0xd5, + 0x83, 0x06, 0x08, 0xf9, 0xc8, 0x39, 0xf5, 0xa6, + 0x4c, 0xf2, 0x4a, 0x8c, 0xbf, 0xd9, 0xb1, 0xa3, + 0x37, 0xf1, 0xaa, 0x3e, 0x47, 0xeb, 0x41, 0xd5, + 0xb5, 0x00, 0xc4, 0x7d, 0xb1, 0xce, 0x0f, 0x50, + 0x6a, 0x7f, 0xb6, 0x6a, 0xbe, 0x4f, 0x9b, 0xf6, + 0xc6, 0xdb, 0xe5, 0xf9, 0xbd, 0x79, 0xc6, 0xed, + 0xbe, 0x9e, 0xb4, 0x01, 0x1c, 0xf3, 0xcd, 0x3b, + 0x3b, 0x3e, 0x9b, 0x16, 0xf7, 0xce, 0x58, 0x23, + 0xe7, 0x3e, 0xbd, 0x6a, 0x2b, 0x46, 0xb8, 0xb5, + 0x72, 0xeb, 0x66, 0x24, 0x63, 0xd0, 0xba, 0x37, + 0x1f, 0x91, 0x1e, 0xb5, 0x66, 0x6b, 0xcd, 0x52, + 0x1b, 0x78, 0xe6, 0x6b, 0xc6, 0xc4, 0x9d, 0x00, + 0x3c, 0x8e, 0x01, 0xf4, 0xf4, 0x22, 0x9b, 0x25, + 0xfe, 0xa5, 0x17, 0xdf, 0xbe, 0x20, 0x98, 0xd6, + 0x40, 0x33, 0xd4, 0x1e, 0xdd, 0x3a, 0xf3, 0x40, + 0x11, 0x24, 0x93, 0xa3, 0x3f, 0xfa, 0x0a, 0xb2, + 0x39, 0x07, 0xcb, 0x31, 0xb1, 0x50, 0x47, 0xa7, + 0x39, 0xfd, 0x69, 0xeb, 0x73, 0x79, 0xb8, 0xb4, + 0x96, 0xa2, 0x56, 0xdf, 0xbd, 0x4b, 0xc6, 0x7e, + 0x46, 0xf6, 0xfc, 0x87, 0x1e, 0xd4, 0x41, 0xa8, + 0xea, 0x53, 0xcf, 0x1c, 0x2b, 0x78, 0xe1, 0x9d, + 0x82, 0x82, 0x4f, 0x1c, 0xd3, 0x3f, 0xb5, 0xb5, + 0x1f, 0xf9, 0xfb, 0x93, 0xf3, 0xa0, 0x07, 0x2d, + 0xc5, 0xe0, 0x41, 0x9b, 0x6d, 0xd2, 0x28, 0x21, + 0x65, 0x68, 0xce, 0xe5, 0x07, 0x39, 0xfe, 0x66, + 0xaa, 0x7d, 0x9e, 0x7f, 0xf9, 0xe3, 0x27, 0xfd, + 0xf2, 0x6b, 0x4a, 0x1b, 0xad, 0x4e, 0x58, 0xd1, + 0xce, 0xa0, 0x22, 0xf3, 0x0e, 0x10, 0x48, 0xd8, + 0x2d, 0xdb, 0xd3, 0xf9, 0xd5, 0x77, 0xd5, 0x35, + 0x24, 0x76, 0x46, 0xba, 0x90, 0x32, 0x9c, 0x11, + 0x9a, 0x00, 0xab, 0xf6, 0x79, 0xff, 0x00, 0xe7, + 0x8c, 0x9f, 0xf7, 0xc9, 0xa3, 0xec, 0xf3, 0xff, + 0x00, 0xcf, 0x19, 0x3f, 0xef, 0x93, 0x56, 0x7f, + 0xb5, 0xf5, 0x1f, 0xf9, 0xfb, 0x92, 0x8f, 0xed, + 0x7d, 0x47, 0xfe, 0x7e, 0xe4, 0xa0, 0x0a, 0xdf, + 0x67, 0x9f, 0xfe, 0x78, 0xc9, 0xff, 0x00, 0x7c, + 0x9a, 0x3e, 0xcf, 0x3f, 0xfc, 0xf1, 0x93, 0xfe, + 0xf9, 0x35, 0x71, 0x35, 0x1d, 0x4d, 0xe1, 0x92, + 0x51, 0x78, 0xfb, 0x63, 0x20, 0x1e, 0x79, 0xe7, + 0xff, 0x00, 0xd5, 0x4c, 0xfe, 0xd7, 0xd4, 0x7f, + 0xe7, 0xee, 0x4a, 0x00, 0xad, 0xf6, 0x79, 0xff, + 0x00, 0xe7, 0x8c, 0x9f, 0xf7, 0xc9, 0xa3, 0xec, + 0xf3, 0xff, 0x00, 0xcf, 0x19, 0x3f, 0xef, 0x93, + 0x56, 0x7f, 0xb5, 0xf5, 0x1f, 0xf9, 0xfb, 0x92, + 0x8f, 0xed, 0x7d, 0x47, 0xfe, 0x7e, 0xe4, 0xa0, + 0x0d, 0xdb, 0xae, 0x1a, 0x3f, 0x68, 0xd7, 0xf9, + 0x54, 0x35, 0x3d, 0xe9, 0x26, 0xe5, 0x89, 0x3d, + 0x97, 0xf9, 0x0a, 0x82, 0x80, 0x0a, 0x28, 0xa2, + 0x80, 0x0a, 0x28, 0xa2, 0x80, 0x0a, 0x28, 0xa2, + 0x80, 0x0a, 0x28, 0xa2, 0x80, 0x0a, 0x28, 0xa2, + 0x80, 0x0a, 0x28, 0xa2, 0x80, 0x0a, 0x28, 0xa2, + 0x80, 0x0a, 0x28, 0xa2, 0x80, 0x0a, 0x28, 0xa2, + 0x80, 0x0a, 0x28, 0xa2, 0x80, 0x0a, 0x28, 0xa2, + 0x80, 0x0a, 0x28, 0xa2, 0x80, 0x34, 0x24, 0xff, + 0x00, 0x8f, 0x48, 0x3f, 0xde, 0x8f, 0xf9, 0x8a, + 0x28, 0x93, 0xfe, 0x3d, 0x20, 0xff, 0x00, 0x7a, + 0x3f, 0xe6, 0x28, 0xa0, 0x09, 0x2d, 0x3f, 0xd5, + 0x3f, 0xfd, 0x74, 0x7f, 0xfd, 0x08, 0xd4, 0xf5, + 0x05, 0xa7, 0xfa, 0xb7, 0xff, 0x00, 0xae, 0x8f, + 0xff, 0x00, 0xa1, 0x1a, 0xb1, 0x40, 0x19, 0x37, + 0x9f, 0xf1, 0xf4, 0xff, 0x00, 0x87, 0xf2, 0xaa, + 0x5a, 0xb7, 0xfc, 0x82, 0x23, 0xff, 0x00, 0xaf, + 0x8f, 0xfd, 0x96, 0xaf, 0x5e, 0xff, 0x00, 0xc7, + 0xd3, 0xfe, 0x1f, 0xca, 0xa8, 0xea, 0xdf, 0xf2, + 0x08, 0x8f, 0xfe, 0xbe, 0x3f, 0xf6, 0x5a, 0x00, + 0xc1, 0xa2, 0x8a, 0x28, 0x03, 0x6a, 0x25, 0x81, + 0x7c, 0x9b, 0x26, 0x95, 0xc4, 0x8d, 0x0e, 0xc2, + 0x9b, 0x38, 0xdc, 0xff, 0x00, 0x30, 0xe7, 0x3e, + 0xbb, 0x7b, 0x76, 0xa8, 0x5d, 0xd5, 0x2c, 0x6c, + 0xc3, 0xd9, 0xac, 0xc7, 0x63, 0x72, 0xc5, 0x86, + 0x3e, 0x76, 0xe3, 0x83, 0x59, 0xa6, 0x47, 0x32, + 0x79, 0x85, 0xd8, 0xbe, 0x73, 0xb8, 0x9e, 0x73, + 0x52, 0xa5, 0xed, 0xdc, 0x6b, 0xb5, 0x2e, 0xa6, + 0x51, 0xd7, 0x02, 0x42, 0x28, 0x02, 0xe4, 0x45, + 0x8c, 0x50, 0xc5, 0x73, 0x62, 0x65, 0x89, 0xc9, + 0xf2, 0x8a, 0x12, 0x19, 0x72, 0x79, 0x00, 0xfd, + 0x7b, 0x1a, 0xa5, 0x73, 0x0f, 0x93, 0x3c, 0xa8, + 0xb9, 0x64, 0x49, 0x0a, 0x07, 0xc7, 0x07, 0x14, + 0x2d, 0xd5, 0xca, 0xef, 0xdb, 0x71, 0x28, 0xde, + 0x72, 0xd8, 0x73, 0xf3, 0x7d, 0x69, 0x9e, 0x6b, + 0x79, 0x22, 0x2f, 0xe1, 0xdd, 0xbb, 0xf1, 0xa0, + 0x0b, 0x73, 0x45, 0x24, 0xb6, 0xb6, 0x0b, 0x1a, + 0x33, 0x92, 0x8c, 0x00, 0x03, 0xfd, 0xb6, 0xab, + 0x92, 0xc8, 0x9f, 0xf1, 0x30, 0x3e, 0x52, 0xdc, + 0x01, 0x24, 0x4a, 0x41, 0x27, 0x04, 0x80, 0xc0, + 0x9e, 0x3d, 0xeb, 0x2d, 0x6e, 0xae, 0x52, 0x2f, + 0x29, 0x2e, 0x25, 0x58, 0xff, 0x00, 0xb8, 0x1c, + 0x81, 0xf9, 0x52, 0x43, 0x71, 0x3c, 0x19, 0xf2, + 0x66, 0x92, 0x3d, 0xdd, 0x76, 0x31, 0x19, 0xa0, + 0x0b, 0x50, 0x3c, 0xa2, 0x79, 0x24, 0x82, 0xd1, + 0x02, 0x88, 0xff, 0x00, 0x79, 0x0f, 0x24, 0x15, + 0xcf, 0x3d, 0x4e, 0x7d, 0x29, 0xb7, 0x90, 0x21, + 0x82, 0x2b, 0x88, 0x60, 0x78, 0xb7, 0xee, 0xdd, + 0x19, 0x25, 0xb1, 0x8c, 0x7c, 0xc3, 0xdb, 0x9a, + 0xae, 0xd7, 0x37, 0x0f, 0x22, 0xc8, 0xd3, 0xca, + 0xd2, 0x2f, 0x01, 0xcb, 0x9c, 0x8f, 0xc6, 0x94, + 0xdc, 0xcc, 0x59, 0xd9, 0xe4, 0x67, 0x67, 0x5d, + 0x84, 0xbb, 0x12, 0x71, 0x40, 0x12, 0x58, 0xb4, + 0xc8, 0xf2, 0x3c, 0x51, 0x2c, 0xaa, 0x10, 0xf9, + 0x88, 0x79, 0xca, 0xe4, 0x7f, 0xf5, 0xab, 0x42, + 0x24, 0x82, 0x3b, 0x79, 0x6e, 0x56, 0xd8, 0xa2, + 0xc9, 0x0b, 0x03, 0x0b, 0xb1, 0x23, 0x86, 0x4e, + 0x41, 0xeb, 0x8e, 0x7f, 0x4a, 0xc7, 0x47, 0x78, + 0xd8, 0x3a, 0x3b, 0x23, 0x0e, 0x85, 0x4e, 0x0d, + 0x39, 0xe7, 0x9e, 0x46, 0x66, 0x79, 0xa4, 0x66, + 0x61, 0xb4, 0x92, 0xc4, 0xe4, 0x7a, 0x50, 0x06, + 0x8e, 0x12, 0xf2, 0xce, 0xde, 0x38, 0xa1, 0x58, + 0x43, 0x5c, 0x95, 0x21, 0x49, 0x3d, 0x87, 0x3c, + 0x9a, 0x2e, 0xde, 0x0b, 0xab, 0x6b, 0x83, 0x0c, + 0xae, 0xe5, 0x1c, 0x4a, 0x15, 0x93, 0x6e, 0xd5, + 0xfb, 0xb8, 0x1c, 0x9c, 0xff, 0x00, 0x0f, 0xe5, + 0x59, 0xab, 0x2c, 0x88, 0x00, 0x59, 0x1d, 0x40, + 0x24, 0x80, 0x0e, 0x3d, 0xa9, 0x15, 0xd9, 0x73, + 0xb5, 0x88, 0xc8, 0xc1, 0xc1, 0xea, 0x28, 0x03, + 0x62, 0xca, 0x12, 0xd6, 0xd1, 0xda, 0xc4, 0x08, + 0x92, 0x55, 0xf3, 0x7c, 0xd2, 0x33, 0xc6, 0x70, + 0xc0, 0x7a, 0x70, 0x3f, 0x4a, 0xcf, 0xb2, 0x00, + 0x6a, 0xb6, 0xe1, 0x41, 0x0b, 0xe7, 0xae, 0x33, + 0xd7, 0x1b, 0xaa, 0x15, 0xb8, 0x99, 0x23, 0xf2, + 0xd2, 0x69, 0x15, 0x33, 0x9d, 0xa1, 0x88, 0x19, + 0xa4, 0x32, 0xc8, 0x65, 0xf3, 0x4c, 0x8c, 0x64, + 0xce, 0x77, 0x93, 0xce, 0x7d, 0x73, 0x40, 0x1b, + 0x76, 0xc4, 0x79, 0xd0, 0xdd, 0x7f, 0x14, 0xe5, + 0x22, 0xfc, 0x41, 0xe7, 0xff, 0x00, 0x41, 0x5f, + 0xfb, 0xea, 0xaa, 0xbc, 0x32, 0xcb, 0xa8, 0x59, + 0xf9, 0x6a, 0x7f, 0xd5, 0x44, 0x77, 0x76, 0x1f, + 0x28, 0xe6, 0xb3, 0x84, 0xb2, 0x2e, 0xdd, 0xb2, + 0x38, 0xda, 0x77, 0x2e, 0x0f, 0x43, 0xeb, 0x4f, + 0x37, 0x57, 0x2d, 0x17, 0x94, 0x6e, 0x25, 0x31, + 0xe3, 0x1b, 0x0b, 0x9c, 0x63, 0xe9, 0x40, 0x1a, + 0x0a, 0xc9, 0x3b, 0xaa, 0x1b, 0x23, 0x2c, 0x32, + 0x5c, 0xbe, 0xd7, 0x0c, 0x46, 0x37, 0x63, 0xa6, + 0x3b, 0xf4, 0xeb, 0x59, 0x92, 0xa8, 0x49, 0x9d, + 0x14, 0xee, 0x0a, 0xc4, 0x03, 0xeb, 0x4b, 0x1c, + 0xd3, 0x44, 0xac, 0xb1, 0xca, 0xe8, 0xad, 0xf7, + 0x82, 0xb1, 0x00, 0xd4, 0x74, 0x00, 0x56, 0xb7, + 0x87, 0xff, 0x00, 0xe3, 0xe6, 0xe7, 0xfe, 0xbd, + 0xdb, 0xf9, 0xad, 0x64, 0xd6, 0xb7, 0x87, 0xff, + 0x00, 0xe3, 0xe6, 0xe7, 0xfe, 0xbd, 0xdb, 0xf9, + 0xad, 0x00, 0x5f, 0xa2, 0x8a, 0x28, 0x03, 0x3b, + 0x5f, 0xff, 0x00, 0x8f, 0xb8, 0x3f, 0xeb, 0xdd, + 0x2b, 0x2e, 0xb5, 0x35, 0xff, 0x00, 0xf8, 0xfb, + 0x83, 0xfe, 0xbd, 0xd2, 0xb2, 0xe8, 0x00, 0xab, + 0x96, 0xca, 0xd2, 0x69, 0xd7, 0x68, 0x80, 0xb3, + 0x06, 0x8d, 0xb0, 0x07, 0x38, 0x1b, 0x81, 0x3f, + 0xa8, 0xaa, 0x74, 0xe8, 0xe4, 0x78, 0x9c, 0x3c, + 0x6e, 0xc8, 0xc3, 0xba, 0x9c, 0x1a, 0x00, 0xd4, + 0x5f, 0x3e, 0x18, 0x2d, 0xd5, 0x21, 0x0e, 0x56, + 0x16, 0x32, 0xc4, 0xe3, 0xaa, 0x16, 0xf4, 0xeb, + 0xe8, 0x69, 0xf6, 0xf1, 0x42, 0xb7, 0x16, 0xd7, + 0x11, 0xc0, 0xd1, 0x79, 0x8b, 0x28, 0x31, 0x31, + 0x24, 0x70, 0x87, 0x91, 0xdf, 0x07, 0x35, 0x93, + 0xe7, 0x4b, 0xe6, 0xf9, 0xbe, 0x6b, 0xf9, 0x9f, + 0xdf, 0xdc, 0x73, 0xf9, 0xd3, 0x8d, 0xcc, 0xe6, + 0x61, 0x31, 0x9e, 0x4f, 0x34, 0x74, 0x7d, 0xe7, + 0x23, 0xf1, 0xa0, 0x0b, 0x77, 0x24, 0x49, 0xa6, + 0xab, 0x88, 0x3e, 0xce, 0xa9, 0x2e, 0x02, 0x0c, + 0xe1, 0xb2, 0x3a, 0xf3, 0xcf, 0x18, 0x1f, 0x9d, + 0x39, 0xda, 0xd4, 0x58, 0x59, 0x79, 0xf1, 0xca, + 0xcd, 0xb1, 0xb1, 0xb1, 0xc2, 0xff, 0x00, 0x1b, + 0x7a, 0x83, 0x54, 0x65, 0x9e, 0x69, 0xc8, 0x33, + 0x4a, 0xf2, 0x11, 0xd0, 0xbb, 0x13, 0x4d, 0x2e, + 0xcc, 0xaa, 0xa5, 0x89, 0x0b, 0xc0, 0x04, 0xf4, + 0xa0, 0x0d, 0x58, 0x14, 0xb4, 0xd6, 0x2c, 0xa0, + 0xed, 0x16, 0xd2, 0x7e, 0x1c, 0xbd, 0x22, 0xa9, + 0x7b, 0x15, 0x45, 0x1f, 0x33, 0x5a, 0x00, 0x3f, + 0xef, 0xfd, 0x66, 0xac, 0xf3, 0x22, 0x6c, 0x59, + 0xa4, 0x54, 0xeb, 0xb4, 0x31, 0x02, 0x85, 0x9a, + 0x55, 0xc6, 0xd9, 0x5c, 0x60, 0x60, 0x61, 0x8f, + 0x03, 0x39, 0xfe, 0x7c, 0xd0, 0x06, 0xa5, 0xcc, + 0xf1, 0x2d, 0xb3, 0x16, 0xb7, 0x49, 0x90, 0x5c, + 0xba, 0xa6, 0xe2, 0x46, 0x00, 0x55, 0x03, 0xa1, + 0xf4, 0x14, 0xb2, 0x94, 0x73, 0x29, 0xda, 0x11, + 0x1a, 0xd2, 0x2f, 0x94, 0x1e, 0x00, 0xdc, 0x95, + 0x90, 0x5d, 0x8a, 0xec, 0x2c, 0x76, 0xe7, 0x38, + 0xcf, 0x19, 0xf5, 0xa5, 0x32, 0xc8, 0x41, 0x06, + 0x46, 0x20, 0xa8, 0x53, 0xcf, 0x61, 0xd0, 0x50, + 0x06, 0xfc, 0x2f, 0x3b, 0x5d, 0xca, 0xb2, 0x83, + 0xb1, 0x2f, 0x23, 0x54, 0xc8, 0xfb, 0xa3, 0x71, + 0xe0, 0x7b, 0x74, 0xac, 0xcb, 0x99, 0x5e, 0x7d, + 0x39, 0x1e, 0x43, 0xb9, 0x96, 0x66, 0x55, 0xf6, + 0x18, 0x1c, 0x7d, 0x29, 0x27, 0xd4, 0x19, 0xe2, + 0x0b, 0x12, 0xc9, 0x19, 0xca, 0xb6, 0xe3, 0x29, + 0x6c, 0x63, 0xa0, 0x5f, 0x41, 0xcd, 0x53, 0xde, + 0xdb, 0x76, 0x6e, 0x3b, 0x73, 0x9c, 0x67, 0x8c, + 0xd0, 0x05, 0xf8, 0x0b, 0x18, 0x20, 0x8a, 0xe2, + 0xcc, 0xcf, 0x13, 0x67, 0xca, 0x74, 0x38, 0x61, + 0xcf, 0x20, 0x11, 0xef, 0xd8, 0xd5, 0xe2, 0xb2, + 0x43, 0x3d, 0xad, 0xb2, 0xb1, 0x6b, 0x6f, 0x2e, + 0x45, 0x73, 0x8e, 0x18, 0x06, 0x7e, 0xb5, 0x89, + 0x1d, 0xc4, 0xf1, 0x29, 0x58, 0xe6, 0x91, 0x14, + 0xf5, 0x0a, 0xc4, 0x03, 0x52, 0x49, 0x77, 0x23, + 0x41, 0x1c, 0x2a, 0xce, 0x88, 0xb1, 0xec, 0x60, + 0x1b, 0x87, 0xf9, 0x89, 0xe4, 0x7e, 0x34, 0x01, + 0xa5, 0x0b, 0x46, 0x96, 0xb6, 0xc9, 0xba, 0x63, + 0x1b, 0xc4, 0xc5, 0xe2, 0x48, 0xb7, 0x07, 0x39, + 0x39, 0x24, 0xe7, 0xa8, 0xfd, 0x31, 0x4e, 0x94, + 0xc4, 0x10, 0xc2, 0xcf, 0x2b, 0x43, 0xe4, 0xa1, + 0x11, 0x88, 0xbe, 0x45, 0xe0, 0x7c, 0xdb, 0xb3, + 0xeb, 0xdf, 0x1d, 0xeb, 0x1d, 0x66, 0x95, 0x63, + 0x31, 0x2c, 0xae, 0x23, 0x6e, 0xa8, 0x18, 0xe0, + 0xfe, 0x14, 0x19, 0xa5, 0x31, 0x08, 0x4c, 0xae, + 0x62, 0x1f, 0xc1, 0xb8, 0xe3, 0xf2, 0xa0, 0x0d, + 0x5b, 0xd6, 0x9d, 0xad, 0xf5, 0x05, 0x94, 0x1d, + 0x89, 0x32, 0xaa, 0x02, 0x38, 0x51, 0x93, 0xc0, + 0xf6, 0xe9, 0x58, 0xd5, 0x23, 0xdc, 0x4d, 0x22, + 0xec, 0x79, 0xa4, 0x65, 0xc6, 0x30, 0x58, 0x91, + 0x51, 0xd0, 0x01, 0x45, 0x14, 0x50, 0x07, 0x57, + 0x79, 0xff, 0x00, 0x1f, 0x2d, 0xf4, 0x5f, 0xe4, + 0x2a, 0x1a, 0x9a, 0xf3, 0xfe, 0x3e, 0x5b, 0xe8, + 0xbf, 0xc8, 0x54, 0x34, 0x00, 0x51, 0x45, 0x14, + 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, + 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, + 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, + 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, + 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, + 0x00, 0x51, 0x45, 0x14, 0x01, 0xa3, 0x2f, 0xfc, + 0x7a, 0x41, 0xfe, 0xf4, 0x7f, 0xcc, 0x51, 0x44, + 0xbf, 0xf1, 0xe9, 0x07, 0xfb, 0xd1, 0xff, 0x00, + 0x31, 0x45, 0x00, 0x49, 0x67, 0xfe, 0xa9, 0xff, + 0x00, 0xeb, 0xa3, 0xff, 0x00, 0xe8, 0x46, 0xa7, + 0xa8, 0x2c, 0xff, 0x00, 0xd5, 0x3f, 0xfd, 0x74, + 0x7f, 0xfd, 0x08, 0xd4, 0xf4, 0x01, 0x95, 0x7b, + 0xff, 0x00, 0x1f, 0x4f, 0xf8, 0x7f, 0x2a, 0xa3, + 0xab, 0x02, 0x74, 0x84, 0xc7, 0x6b, 0x8f, 0xfd, + 0x96, 0xaf, 0x5e, 0xff, 0x00, 0xc7, 0xd3, 0xfe, + 0x1f, 0xca, 0xa2, 0x31, 0xad, 0xcd, 0xb4, 0xb6, + 0x8c, 0x40, 0x32, 0x00, 0x50, 0x9e, 0xcc, 0x3a, + 0x50, 0x07, 0x31, 0x45, 0x3e, 0x58, 0xde, 0x19, + 0x1a, 0x39, 0x14, 0xab, 0xa9, 0xc1, 0x07, 0xb5, + 0x32, 0x80, 0x0a, 0x28, 0xa2, 0x80, 0x0a, 0x28, + 0xa2, 0x80, 0x34, 0x62, 0x86, 0x33, 0xa7, 0x18, + 0xca, 0x2f, 0x9f, 0x22, 0x34, 0xca, 0xd8, 0xe4, + 0x05, 0x3d, 0x3f, 0x20, 0xc7, 0xf2, 0xa8, 0x56, + 0xd1, 0x3c, 0x94, 0x66, 0x9c, 0x2c, 0xb2, 0x29, + 0x74, 0x8c, 0xaf, 0x04, 0x7d, 0x7d, 0x4e, 0x0d, + 0x4e, 0x35, 0x49, 0x12, 0xe6, 0x31, 0x1c, 0x92, + 0x0b, 0x44, 0xda, 0xbe, 0x56, 0x7a, 0xa8, 0x18, + 0x3c, 0x7b, 0xf3, 0x51, 0x9b, 0x9b, 0x53, 0x1c, + 0x6c, 0xcb, 0x29, 0x96, 0x15, 0x28, 0x83, 0x8c, + 0x1e, 0x49, 0x52, 0x7e, 0x99, 0xe9, 0xed, 0x40, + 0x08, 0xf6, 0x0b, 0xe7, 0x2c, 0x11, 0x5c, 0x2b, + 0xcd, 0xe6, 0x79, 0x6e, 0xa4, 0x63, 0x07, 0xd4, + 0x7a, 0x8a, 0x96, 0x0b, 0x58, 0x43, 0x19, 0x23, + 0x90, 0x4f, 0x1f, 0x97, 0x2a, 0x9d, 0xc9, 0x8c, + 0x30, 0x42, 0x47, 0x1f, 0xe7, 0xa5, 0x35, 0xaf, + 0x2d, 0x92, 0xe9, 0x6e, 0xe1, 0x8e, 0x43, 0x29, + 0x97, 0xcc, 0x60, 0xc7, 0x01, 0x7d, 0x54, 0x7f, + 0x8d, 0x3d, 0xf5, 0x04, 0x2d, 0xcc, 0xf7, 0x53, + 0x0d, 0x92, 0x0f, 0xde, 0x91, 0xc1, 0x2a, 0x40, + 0xe3, 0x3e, 0xfd, 0x68, 0x02, 0x16, 0xb1, 0x55, + 0x42, 0x3c, 0xec, 0xce, 0xa8, 0x24, 0x68, 0xf6, + 0xf0, 0x01, 0xc7, 0x7f, 0x5c, 0x1a, 0x57, 0xb1, + 0x8d, 0x6f, 0x9e, 0xd8, 0x4e, 0xce, 0x53, 0x39, + 0x29, 0x11, 0x24, 0x90, 0x7a, 0x01, 0x9a, 0x92, + 0x6d, 0x47, 0xcd, 0x83, 0x1e, 0x75, 0xc8, 0x62, + 0x81, 0x4c, 0x41, 0xbe, 0x4e, 0x30, 0x33, 0xff, + 0x00, 0xd6, 0xc5, 0x33, 0xed, 0x90, 0xb5, 0xcd, + 0xeb, 0x37, 0x98, 0x91, 0xdc, 0x13, 0x86, 0x50, + 0x37, 0x0f, 0x9b, 0x3e, 0xb4, 0x00, 0xe9, 0x6c, + 0x23, 0x86, 0x09, 0xc3, 0xb3, 0x99, 0x55, 0xa3, + 0x09, 0xf2, 0x63, 0x86, 0x04, 0xf3, 0xcf, 0x1f, + 0xd3, 0x14, 0x2e, 0x9a, 0x8f, 0x37, 0x93, 0x1d, + 0xc6, 0xe7, 0x59, 0x56, 0x39, 0x3e, 0x4e, 0x17, + 0x27, 0x19, 0x1c, 0xf3, 0xcf, 0xd2, 0x96, 0x6b, + 0xeb, 0x77, 0x89, 0x82, 0x09, 0x55, 0xb1, 0x1e, + 0xdc, 0x80, 0x70, 0x50, 0x11, 0xeb, 0xef, 0x4e, + 0x4b, 0xfb, 0x68, 0xae, 0x4c, 0xd1, 0xac, 0xb9, + 0x96, 0x65, 0x92, 0x40, 0x40, 0xf9, 0x40, 0x39, + 0x20, 0x73, 0xcf, 0x3f, 0x4a, 0x00, 0x87, 0xec, + 0x50, 0x88, 0xbc, 0xd3, 0x72, 0x42, 0x16, 0x28, + 0xad, 0xe5, 0x71, 0x90, 0x07, 0x5e, 0x78, 0xeb, + 0x54, 0x6a, 0xfd, 0x8d, 0xdc, 0x36, 0xdf, 0x39, + 0x69, 0x83, 0x67, 0xe6, 0x8d, 0x70, 0x52, 0x41, + 0xe8, 0x7f, 0xc9, 0xaa, 0x14, 0x00, 0x51, 0x45, + 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x56, 0xb7, + 0x87, 0xc1, 0xf3, 0xee, 0x8f, 0x6f, 0xb3, 0xb7, + 0x3f, 0x88, 0xac, 0x9a, 0xe8, 0xac, 0x2d, 0x8d, + 0x95, 0x81, 0xf3, 0x06, 0x26, 0xb8, 0xc1, 0x2b, + 0xdd, 0x54, 0x74, 0xfc, 0xe8, 0x01, 0xf4, 0x51, + 0x45, 0x00, 0x67, 0xeb, 0xe0, 0xfd, 0xaa, 0x03, + 0xd8, 0xdb, 0xa6, 0x3f, 0x5a, 0xca, 0xae, 0x8a, + 0xfe, 0xd8, 0xdf, 0x59, 0x2f, 0x96, 0x33, 0x3c, + 0x19, 0xc2, 0xff, 0x00, 0x79, 0x6b, 0x9d, 0xa0, + 0x02, 0x8a, 0x28, 0xa0, 0x0d, 0x6b, 0x11, 0xb0, + 0xda, 0x42, 0x08, 0x5f, 0x36, 0x39, 0x64, 0x72, + 0x7f, 0xdd, 0x65, 0x19, 0xfa, 0x60, 0xfe, 0x74, + 0xc5, 0xb7, 0x54, 0xd3, 0xee, 0x15, 0x2e, 0x22, + 0x98, 0xbb, 0xc6, 0x3e, 0x4c, 0xf1, 0xd7, 0xd4, + 0x0a, 0x8e, 0x3b, 0x95, 0x48, 0x20, 0x94, 0x61, + 0x9e, 0x25, 0x78, 0x8a, 0x67, 0x07, 0x0c, 0x0e, + 0x0f, 0xfe, 0x3c, 0x7f, 0x2a, 0xad, 0x15, 0xc1, + 0x8e, 0xde, 0x58, 0x82, 0xf2, 0xec, 0xac, 0x1b, + 0x3d, 0x31, 0x9f, 0xf1, 0xa0, 0x0b, 0xbf, 0x61, + 0xb5, 0x79, 0x5e, 0x24, 0x96, 0x44, 0x30, 0xca, + 0xa9, 0x23, 0xb9, 0x18, 0x20, 0x9c, 0x12, 0x3d, + 0x39, 0xa7, 0x7d, 0x9a, 0xda, 0x15, 0xb9, 0x12, + 0x5b, 0xdc, 0x2b, 0x2c, 0x3b, 0x82, 0xc8, 0x47, + 0x1f, 0x32, 0x8c, 0x83, 0x8e, 0x7a, 0xff, 0x00, + 0x3f, 0x5a, 0x81, 0xef, 0xe3, 0x62, 0xe4, 0x5b, + 0x00, 0x65, 0x70, 0xf2, 0x82, 0xf9, 0x0d, 0xec, + 0x3d, 0x29, 0x7e, 0xdf, 0x18, 0x88, 0xc0, 0xb6, + 0xed, 0xe4, 0xec, 0x65, 0xc1, 0x93, 0x24, 0x64, + 0xa9, 0xeb, 0x8f, 0xf6, 0x47, 0x18, 0xa0, 0x0b, + 0x10, 0x48, 0xf6, 0xf1, 0x32, 0xc6, 0xc5, 0x1e, + 0x3b, 0x3d, 0xd9, 0x1d, 0x72, 0xce, 0xa7, 0xf9, + 0x11, 0x49, 0x0c, 0x4d, 0xa9, 0xc0, 0xb2, 0x4d, + 0xb9, 0xa4, 0x8d, 0xc8, 0x2c, 0x8b, 0x96, 0x75, + 0xdb, 0x9c, 0x7b, 0x9e, 0x3f, 0x5a, 0xac, 0x97, + 0xa9, 0xf6, 0x89, 0xe4, 0x92, 0x12, 0xd1, 0xca, + 0x9b, 0x36, 0x07, 0xc1, 0x03, 0x8c, 0x73, 0x8f, + 0x6a, 0x51, 0x7e, 0x11, 0x91, 0x61, 0x83, 0x64, + 0x0b, 0xbb, 0x31, 0x96, 0xc9, 0x6d, 0xc3, 0x07, + 0x27, 0xe9, 0x40, 0x12, 0x4f, 0xa7, 0xaa, 0x40, + 0xf2, 0x04, 0x9a, 0x36, 0xd9, 0xbd, 0x63, 0x97, + 0xa8, 0xc3, 0x61, 0xbb, 0x73, 0xd4, 0x1a, 0x70, + 0xb1, 0x53, 0xba, 0xd9, 0x65, 0x71, 0xfb, 0xe8, + 0x91, 0xf3, 0xd3, 0x71, 0x56, 0xdc, 0x7f, 0x0e, + 0x6a, 0xbc, 0x57, 0x91, 0x43, 0x74, 0x92, 0xc7, + 0x6e, 0x7c, 0xb5, 0x52, 0xac, 0x8d, 0x26, 0x4b, + 0x83, 0xea, 0x71, 0xfd, 0x29, 0x23, 0xbf, 0x92, + 0x32, 0xcf, 0xb4, 0x19, 0x1a, 0x75, 0x9b, 0x27, + 0xd4, 0x6e, 0xe3, 0xff, 0x00, 0x1e, 0xa0, 0x09, + 0xa0, 0xb4, 0xb6, 0xb9, 0xde, 0xf0, 0x2d, 0xc3, + 0x88, 0xd7, 0x2d, 0x10, 0x00, 0xb9, 0xe4, 0x01, + 0x82, 0x07, 0xbf, 0xe9, 0x4e, 0x4b, 0x5f, 0xb3, + 0x5e, 0xb1, 0xc3, 0xaa, 0x88, 0x77, 0x81, 0x20, + 0xc3, 0x2e, 0xe1, 0xb4, 0x67, 0xe8, 0x4d, 0x44, + 0x2f, 0x60, 0x40, 0x51, 0x2d, 0x76, 0xc2, 0xe0, + 0x87, 0x1e, 0x67, 0xcc, 0x79, 0x07, 0xef, 0x63, + 0xb6, 0x3f, 0x9d, 0x44, 0xf7, 0x28, 0x52, 0x65, + 0x8e, 0x2d, 0x82, 0x4d, 0xa3, 0xef, 0x67, 0x00, + 0x7f, 0x89, 0xc5, 0x00, 0x5e, 0x37, 0x52, 0x2e, + 0xa9, 0xf6, 0x30, 0x07, 0xd9, 0x44, 0xbe, 0x4f, + 0x93, 0x8e, 0x0a, 0xe7, 0x1f, 0x9f, 0xbd, 0x24, + 0x57, 0x77, 0x50, 0xda, 0x5e, 0x46, 0x97, 0x32, + 0x62, 0x12, 0xaa, 0x98, 0x6e, 0x83, 0x76, 0x2a, + 0x0f, 0xed, 0x04, 0xf3, 0x05, 0xc1, 0xb6, 0x06, + 0xe8, 0x7f, 0xcb, 0x4d, 0xfc, 0x6e, 0xfe, 0xf6, + 0xdf, 0x5a, 0xad, 0x1c, 0xe5, 0x20, 0x9a, 0x22, + 0xb9, 0xf3, 0x76, 0xf3, 0x9e, 0x98, 0x39, 0xa0, + 0x0b, 0xde, 0x75, 0xc4, 0x31, 0xda, 0xa5, 0xb4, + 0x9b, 0x24, 0x9d, 0x4c, 0x8e, 0xe4, 0x80, 0x58, + 0x96, 0x23, 0x92, 0x7e, 0x94, 0xd5, 0x59, 0x4d, + 0xf4, 0xd0, 0x4e, 0x88, 0x86, 0x78, 0xc9, 0x2a, + 0x98, 0xdb, 0x9d, 0xbb, 0x94, 0x8c, 0x7b, 0xff, + 0x00, 0x33, 0x55, 0xe3, 0xba, 0x8b, 0xc8, 0x48, + 0x6e, 0x60, 0xf3, 0x56, 0x3c, 0xec, 0x21, 0xf6, + 0x91, 0x9e, 0xdf, 0x4a, 0x92, 0x3b, 0x90, 0xf7, + 0x12, 0x5d, 0x38, 0x44, 0xf2, 0xe2, 0xdb, 0x1a, + 0x03, 0xfe, 0xce, 0xd5, 0x1f, 0x87, 0x5f, 0xc2, + 0x80, 0x28, 0xd1, 0x45, 0x14, 0x00, 0x50, 0x01, + 0x27, 0x00, 0x64, 0xd1, 0x5a, 0x9a, 0x2d, 0x9f, + 0x99, 0x38, 0xba, 0x94, 0x62, 0x08, 0x4e, 0xec, + 0x9f, 0xe2, 0x6e, 0xc0, 0x50, 0x06, 0xc5, 0xe7, + 0xfc, 0x7c, 0xb0, 0xf4, 0x00, 0x7e, 0x82, 0xa0, + 0xa5, 0x76, 0x2e, 0xec, 0xe7, 0xab, 0x1c, 0xd2, + 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, + 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, + 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, + 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, + 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, + 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, + 0x50, 0x06, 0x8c, 0xbf, 0xf1, 0xe7, 0x07, 0xfb, + 0xd1, 0xff, 0x00, 0x31, 0x45, 0x12, 0xff, 0x00, + 0xc7, 0x9c, 0x1f, 0xef, 0x47, 0xfc, 0xc5, 0x14, + 0x01, 0x25, 0x9f, 0xfa, 0xa7, 0xff, 0x00, 0xae, + 0x8f, 0xff, 0x00, 0xa1, 0x1a, 0xb1, 0x50, 0x59, + 0xff, 0x00, 0xaa, 0x7f, 0xfa, 0xe8, 0xff, 0x00, + 0xfa, 0x11, 0xa9, 0xe8, 0x03, 0x3b, 0x51, 0x8c, + 0x89, 0x04, 0x80, 0x70, 0x46, 0x0f, 0xd6, 0xa9, + 0xd6, 0xe3, 0xa2, 0xba, 0x95, 0x61, 0x90, 0x6b, + 0x3e, 0x5b, 0x07, 0x07, 0x31, 0x90, 0xc3, 0xd0, + 0xf5, 0xa0, 0x0a, 0x93, 0xac, 0x17, 0x8a, 0x16, + 0xee, 0x32, 0xcc, 0x06, 0x04, 0x88, 0x70, 0xc3, + 0xfc, 0x6a, 0xa9, 0xd2, 0x2c, 0xc9, 0xe2, 0xee, + 0x50, 0x3d, 0x0c, 0x79, 0xfe, 0xb5, 0xa1, 0xf6, + 0x3b, 0x8f, 0xf9, 0xe7, 0xfa, 0x8a, 0x3e, 0xc7, + 0x71, 0xff, 0x00, 0x3c, 0xff, 0x00, 0x51, 0x40, + 0x19, 0xdf, 0xd8, 0xf6, 0x7f, 0xf3, 0xf9, 0x27, + 0xfd, 0xfa, 0xff, 0x00, 0xeb, 0xd1, 0xfd, 0x8f, + 0x67, 0xff, 0x00, 0x3f, 0x92, 0x7f, 0xdf, 0xaf, + 0xfe, 0xbd, 0x68, 0xfd, 0x8e, 0xe3, 0xfe, 0x79, + 0xfe, 0xa2, 0x8f, 0xb1, 0xdc, 0x7f, 0xcf, 0x3f, + 0xd4, 0x50, 0x06, 0x77, 0xf6, 0x3d, 0x9f, 0xfc, + 0xfe, 0x49, 0xff, 0x00, 0x7e, 0xbf, 0xfa, 0xf4, + 0x7f, 0x63, 0xd9, 0xff, 0x00, 0xcf, 0xe4, 0x9f, + 0xf7, 0xeb, 0xff, 0x00, 0xaf, 0x5a, 0x3f, 0x63, + 0xb8, 0xff, 0x00, 0x9e, 0x7f, 0xa8, 0xa3, 0xec, + 0x77, 0x1f, 0xf3, 0xcf, 0xf5, 0x14, 0x01, 0x9d, + 0xfd, 0x8f, 0x67, 0xff, 0x00, 0x3f, 0x92, 0x7f, + 0xdf, 0xaf, 0xfe, 0xbd, 0x1f, 0xd8, 0xf6, 0x7f, + 0xf3, 0xf9, 0x27, 0xfd, 0xfa, 0xff, 0x00, 0xeb, + 0xd6, 0x8f, 0xd8, 0xee, 0x3f, 0xe7, 0x9f, 0xea, + 0x28, 0xfb, 0x1d, 0xc7, 0xfc, 0xf3, 0xfd, 0x45, + 0x00, 0x67, 0x7f, 0x63, 0xd9, 0xff, 0x00, 0xcf, + 0xe4, 0x9f, 0xf7, 0xeb, 0xff, 0x00, 0xaf, 0x47, + 0xf6, 0x3d, 0x9f, 0xfc, 0xfe, 0x49, 0xff, 0x00, + 0x7e, 0xbf, 0xfa, 0xf5, 0xa3, 0xf6, 0x3b, 0x8f, + 0xf9, 0xe7, 0xfa, 0x8a, 0x3e, 0xc7, 0x71, 0xff, + 0x00, 0x3c, 0xff, 0x00, 0x51, 0x40, 0x19, 0xdf, + 0xd8, 0xf6, 0x7f, 0xf3, 0xf9, 0x27, 0xfd, 0xfa, + 0xff, 0x00, 0xeb, 0xd1, 0xfd, 0x8f, 0x67, 0xff, + 0x00, 0x3f, 0x92, 0x7f, 0xdf, 0xaf, 0xfe, 0xbd, + 0x68, 0xfd, 0x8e, 0xe3, 0xfe, 0x79, 0xfe, 0xa2, + 0x8f, 0xb1, 0xdc, 0x7f, 0xcf, 0x3f, 0xd4, 0x50, + 0x06, 0x77, 0xf6, 0x3d, 0x9f, 0xfc, 0xfe, 0x49, + 0xff, 0x00, 0x7e, 0xbf, 0xfa, 0xf4, 0x7f, 0x63, + 0xd9, 0xff, 0x00, 0xcf, 0xe4, 0x9f, 0xf7, 0xeb, + 0xff, 0x00, 0xaf, 0x5a, 0x3f, 0x63, 0xb8, 0xff, + 0x00, 0x9e, 0x7f, 0xa8, 0xa3, 0xec, 0x77, 0x1f, + 0xf3, 0xcf, 0xf5, 0x14, 0x01, 0x9d, 0xfd, 0x8f, + 0x67, 0xff, 0x00, 0x3f, 0x92, 0x7f, 0xdf, 0xaf, + 0xfe, 0xbd, 0x1f, 0xd8, 0xf6, 0x7f, 0xf3, 0xf9, + 0x27, 0xfd, 0xfa, 0xff, 0x00, 0xeb, 0xd6, 0x8f, + 0xd8, 0xee, 0x3f, 0xe7, 0x9f, 0xea, 0x28, 0xfb, + 0x1d, 0xc7, 0xfc, 0xf3, 0xfd, 0x45, 0x00, 0x67, + 0x7f, 0x63, 0xd9, 0xff, 0x00, 0xcf, 0xe4, 0x9f, + 0xf7, 0xeb, 0xff, 0x00, 0xaf, 0x47, 0xf6, 0x3d, + 0x9f, 0xfc, 0xfe, 0x49, 0xff, 0x00, 0x7e, 0xbf, + 0xfa, 0xf5, 0xa3, 0xf6, 0x3b, 0x8f, 0xf9, 0xe7, + 0xfa, 0x8a, 0x3e, 0xc7, 0x71, 0xff, 0x00, 0x3c, + 0xff, 0x00, 0x51, 0x40, 0x19, 0xdf, 0xd8, 0xf6, + 0x7f, 0xf3, 0xf9, 0x27, 0xfd, 0xfa, 0xff, 0x00, + 0xeb, 0xd1, 0xfd, 0x8f, 0x67, 0xff, 0x00, 0x3f, + 0x92, 0x7f, 0xdf, 0xaf, 0xfe, 0xbd, 0x68, 0xfd, + 0x8e, 0xe3, 0xfe, 0x79, 0xfe, 0xa2, 0x8f, 0xb1, + 0xdc, 0x7f, 0xcf, 0x3f, 0xd4, 0x50, 0x05, 0x7b, + 0x7b, 0x6b, 0x2b, 0x46, 0xdf, 0x0c, 0x4d, 0x2c, + 0x83, 0xa3, 0xcd, 0x8f, 0x97, 0xe8, 0x29, 0xcc, + 0xcc, 0xec, 0x59, 0x8e, 0x49, 0xef, 0x53, 0x7d, + 0x8e, 0xe3, 0xfe, 0x79, 0xfe, 0xa2, 0x8f, 0xb1, + 0xdc, 0x7f, 0xcf, 0x3f, 0xd4, 0x50, 0x04, 0x14, + 0x54, 0xff, 0x00, 0x63, 0xb8, 0xff, 0x00, 0x9e, + 0x7f, 0xa8, 0xa3, 0xec, 0x77, 0x1f, 0xf3, 0xcf, + 0xf5, 0x14, 0x01, 0x02, 0xb1, 0x56, 0x0c, 0xa4, + 0x82, 0x3a, 0x11, 0x49, 0x71, 0x05, 0x9d, 0xe1, + 0xdd, 0x71, 0x13, 0x2c, 0x87, 0xac, 0x91, 0x1c, + 0x13, 0xf5, 0x1d, 0x2a, 0xc7, 0xd8, 0xee, 0x3f, + 0xe7, 0x9f, 0xea, 0x28, 0xfb, 0x1d, 0xc7, 0xfc, + 0xf3, 0xfd, 0x45, 0x00, 0x50, 0x3a, 0x4d, 0x87, + 0x6b, 0x89, 0xc7, 0xfc, 0x04, 0x52, 0x7f, 0x64, + 0xd8, 0xff, 0x00, 0xcf, 0xcc, 0xff, 0x00, 0xf7, + 0xc0, 0xad, 0x0f, 0xb1, 0xdc, 0x7f, 0xcf, 0x3f, + 0xd4, 0x51, 0xf6, 0x3b, 0x8f, 0xf9, 0xe7, 0xfa, + 0x8a, 0x00, 0xcf, 0xfe, 0xc9, 0xb1, 0xff, 0x00, + 0x9f, 0x99, 0xff, 0x00, 0xef, 0x81, 0x47, 0xf6, + 0x4d, 0x8f, 0xfc, 0xfc, 0xcf, 0xff, 0x00, 0x7c, + 0x0a, 0xd0, 0xfb, 0x1d, 0xc7, 0xfc, 0xf3, 0xfd, + 0x45, 0x1f, 0x63, 0xb8, 0xff, 0x00, 0x9e, 0x7f, + 0xa8, 0xa0, 0x0c, 0xff, 0x00, 0xec, 0x9b, 0x1f, + 0xf9, 0xf9, 0x9f, 0xfe, 0xf8, 0x14, 0x7f, 0x64, + 0xd8, 0xff, 0x00, 0xcf, 0xcc, 0xff, 0x00, 0xf7, + 0xc0, 0xad, 0x0f, 0xb1, 0xdc, 0x7f, 0xcf, 0x3f, + 0xd4, 0x51, 0xf6, 0x3b, 0x8f, 0xf9, 0xe7, 0xfa, + 0x8a, 0x00, 0xcf, 0xfe, 0xc9, 0xb1, 0xff, 0x00, + 0x9f, 0x99, 0xff, 0x00, 0xef, 0x81, 0x47, 0xf6, + 0x4d, 0x8f, 0xfc, 0xfc, 0xcf, 0xff, 0x00, 0x7c, + 0x0a, 0xd0, 0xfb, 0x1d, 0xc7, 0xfc, 0xf3, 0xfd, + 0x45, 0x1f, 0x63, 0xb8, 0xff, 0x00, 0x9e, 0x7f, + 0xa8, 0xa0, 0x0c, 0xff, 0x00, 0xec, 0x9b, 0x1f, + 0xf9, 0xf9, 0x9f, 0xfe, 0xf8, 0x14, 0x7f, 0x64, + 0xd8, 0xff, 0x00, 0xcf, 0xcc, 0xff, 0x00, 0xf7, + 0xc0, 0xad, 0x0f, 0xb1, 0xdc, 0x7f, 0xcf, 0x3f, + 0xd4, 0x51, 0xf6, 0x3b, 0x8f, 0xf9, 0xe7, 0xfa, + 0x8a, 0x00, 0xcf, 0xfe, 0xc9, 0xb1, 0xff, 0x00, + 0x9f, 0x99, 0xff, 0x00, 0xef, 0x81, 0x47, 0xf6, + 0x4d, 0x8f, 0xfc, 0xfc, 0xcf, 0xff, 0x00, 0x7c, + 0x0a, 0xd0, 0xfb, 0x1d, 0xc7, 0xfc, 0xf3, 0xfd, + 0x45, 0x1f, 0x63, 0xb8, 0xff, 0x00, 0x9e, 0x7f, + 0xa8, 0xa0, 0x0c, 0xff, 0x00, 0xec, 0x9b, 0x1f, + 0xf9, 0xf9, 0x9f, 0xfe, 0xf8, 0x14, 0x7f, 0x64, + 0xd8, 0xff, 0x00, 0xcf, 0xcc, 0xff, 0x00, 0xf7, + 0xc0, 0xad, 0x0f, 0xb1, 0xdc, 0x7f, 0xcf, 0x3f, + 0xd4, 0x51, 0xf6, 0x3b, 0x8f, 0xf9, 0xe7, 0xfa, + 0x8a, 0x00, 0xcf, 0xfe, 0xc9, 0xb1, 0xff, 0x00, + 0x9f, 0x99, 0xff, 0x00, 0xef, 0x81, 0x47, 0xf6, + 0x4d, 0x8f, 0xfc, 0xfc, 0xcf, 0xff, 0x00, 0x7c, + 0x0a, 0xd0, 0xfb, 0x1d, 0xc7, 0xfc, 0xf3, 0xfd, + 0x45, 0x1f, 0x63, 0xb8, 0xff, 0x00, 0x9e, 0x7f, + 0xa8, 0xa0, 0x0c, 0xff, 0x00, 0xec, 0x9b, 0x1f, + 0xf9, 0xf9, 0x9f, 0xfe, 0xf8, 0x14, 0xbf, 0xd9, + 0x36, 0x3f, 0xf3, 0xf1, 0x3f, 0xfd, 0xf0, 0x2a, + 0xff, 0x00, 0xd8, 0xee, 0x3f, 0xe7, 0x9f, 0xea, + 0x28, 0xfb, 0x1d, 0xc7, 0xfc, 0xf3, 0xfd, 0x45, + 0x00, 0x53, 0x4d, 0x3b, 0x4e, 0x88, 0x86, 0x22, + 0x69, 0x88, 0xec, 0xc4, 0x28, 0xfd, 0x39, 0xab, + 0x12, 0x4a, 0x64, 0x0a, 0xb8, 0x55, 0x45, 0xe1, + 0x51, 0x46, 0x00, 0xa9, 0x3e, 0xc7, 0x71, 0xff, + 0x00, 0x3c, 0xff, 0x00, 0x51, 0x47, 0xd8, 0xee, + 0x3f, 0xe7, 0x9f, 0xea, 0x28, 0x02, 0x0a, 0x2a, + 0x7f, 0xb1, 0xdc, 0x7f, 0xcf, 0x3f, 0xd4, 0x51, + 0xf6, 0x3b, 0x8f, 0xf9, 0xe7, 0xfa, 0x8a, 0x00, + 0x82, 0x8a, 0x9f, 0xec, 0x77, 0x1f, 0xf3, 0xcf, + 0xf5, 0x14, 0x7d, 0x8e, 0xe3, 0xfe, 0x79, 0xfe, + 0xa2, 0x80, 0x20, 0xa2, 0xa7, 0xfb, 0x1d, 0xc7, + 0xfc, 0xf3, 0xfd, 0x45, 0x1f, 0x63, 0xb8, 0xff, + 0x00, 0x9e, 0x7f, 0xa8, 0xa0, 0x08, 0x28, 0xa9, + 0xfe, 0xc7, 0x71, 0xff, 0x00, 0x3c, 0xff, 0x00, + 0x51, 0x47, 0xd8, 0xee, 0x3f, 0xe7, 0x9f, 0xea, + 0x28, 0x02, 0x0a, 0x2a, 0x7f, 0xb1, 0xdc, 0x7f, + 0xcf, 0x3f, 0xd4, 0x51, 0xf6, 0x3b, 0x8f, 0xf9, + 0xe7, 0xfa, 0x8a, 0x00, 0x82, 0x8a, 0x9f, 0xec, + 0x77, 0x1f, 0xf3, 0xcf, 0xf5, 0x14, 0x7d, 0x8e, + 0xe3, 0xfe, 0x79, 0xfe, 0xa2, 0x80, 0x20, 0xa2, + 0xa7, 0xfb, 0x1d, 0xc7, 0xfc, 0xf3, 0xfd, 0x45, + 0x1f, 0x63, 0xb8, 0xff, 0x00, 0x9e, 0x7f, 0xa8, + 0xa0, 0x08, 0x28, 0xa9, 0xfe, 0xc7, 0x71, 0xff, + 0x00, 0x3c, 0xff, 0x00, 0x51, 0x47, 0xd8, 0xee, + 0x3f, 0xe7, 0x9f, 0xea, 0x28, 0x02, 0x0a, 0x2a, + 0x7f, 0xb1, 0xdc, 0x7f, 0xcf, 0x3f, 0xd4, 0x51, + 0xf6, 0x3b, 0x8f, 0xf9, 0xe7, 0xfa, 0x8a, 0x00, + 0x82, 0x8a, 0x9f, 0xec, 0x77, 0x1f, 0xf3, 0xcf, + 0xf5, 0x14, 0x7d, 0x8e, 0xe3, 0xfe, 0x79, 0xfe, + 0xa2, 0x80, 0x20, 0xa2, 0xa7, 0xfb, 0x1d, 0xc7, + 0xfc, 0xf3, 0xfd, 0x45, 0x1f, 0x63, 0xb8, 0xff, + 0x00, 0x9e, 0x7f, 0xa8, 0xa0, 0x08, 0x28, 0xa9, + 0xfe, 0xc7, 0x71, 0xff, 0x00, 0x3c, 0xff, 0x00, + 0x51, 0x47, 0xd8, 0xee, 0x3f, 0xe7, 0x9f, 0xea, + 0x28, 0x02, 0x0a, 0x74, 0x68, 0x64, 0x91, 0x50, + 0x75, 0x35, 0x3a, 0xd9, 0x4e, 0x4e, 0x0a, 0x85, + 0x1e, 0xa4, 0xd5, 0xeb, 0x7b, 0x64, 0x80, 0x71, + 0xcb, 0x1e, 0xf4, 0x00, 0xcb, 0xa1, 0xb6, 0x14, + 0x51, 0xd0, 0x48, 0x83, 0xf5, 0x14, 0x53, 0xaf, + 0x3f, 0xd5, 0x27, 0xfd, 0x74, 0x4f, 0xfd, 0x08, + 0x51, 0x40, 0x18, 0x93, 0x5e, 0xdc, 0x41, 0x73, + 0x34, 0x51, 0xc8, 0x55, 0x56, 0x46, 0xc0, 0xc7, + 0xbd, 0x33, 0xfb, 0x4e, 0xf3, 0xfe, 0x7b, 0x1f, + 0xc8, 0x51, 0x45, 0x00, 0x1f, 0xda, 0x77, 0x9f, + 0xf3, 0xd8, 0xfe, 0x42, 0x8f, 0xed, 0x3b, 0xcf, + 0xf9, 0xec, 0x7f, 0x21, 0x45, 0x14, 0x00, 0x7f, + 0x69, 0xde, 0x7f, 0xcf, 0x63, 0xf9, 0x0a, 0x3f, + 0xb4, 0xef, 0x3f, 0xe7, 0xb1, 0xfc, 0x85, 0x14, + 0x50, 0x01, 0xfd, 0xa7, 0x79, 0xff, 0x00, 0x3d, + 0x8f, 0xe4, 0x28, 0xfe, 0xd3, 0xbc, 0xff, 0x00, + 0x9e, 0xc7, 0xf2, 0x14, 0x51, 0x40, 0x07, 0xf6, + 0x9d, 0xe7, 0xfc, 0xf6, 0x3f, 0x90, 0xa3, 0xfb, + 0x4e, 0xf3, 0xfe, 0x7b, 0x1f, 0xc8, 0x51, 0x45, + 0x00, 0x1f, 0xda, 0x77, 0x9f, 0xf3, 0xd8, 0xfe, + 0x42, 0x8f, 0xed, 0x3b, 0xcf, 0xf9, 0xec, 0x7f, + 0x21, 0x45, 0x14, 0x00, 0x7f, 0x69, 0xde, 0x7f, + 0xcf, 0x63, 0xf9, 0x0a, 0x3f, 0xb4, 0xef, 0x3f, + 0xe7, 0xb1, 0xfc, 0x85, 0x14, 0x50, 0x01, 0xfd, + 0xa7, 0x79, 0xff, 0x00, 0x3d, 0x8f, 0xe4, 0x28, + 0xfe, 0xd3, 0xbc, 0xff, 0x00, 0x9e, 0xc7, 0xf2, + 0x14, 0x51, 0x40, 0x07, 0xf6, 0x9d, 0xe7, 0xfc, + 0xf6, 0x3f, 0x90, 0xa3, 0xfb, 0x4e, 0xf3, 0xfe, + 0x7b, 0x1f, 0xc8, 0x51, 0x45, 0x00, 0x1f, 0xda, + 0x77, 0x9f, 0xf3, 0xd8, 0xfe, 0x42, 0x8f, 0xed, + 0x3b, 0xcf, 0xf9, 0xec, 0x7f, 0x21, 0x45, 0x14, + 0x00, 0x7f, 0x69, 0xde, 0x7f, 0xcf, 0x63, 0xf9, + 0x0a, 0x3f, 0xb4, 0xef, 0x3f, 0xe7, 0xb1, 0xfc, + 0x85, 0x14, 0x50, 0x01, 0xfd, 0xa7, 0x79, 0xff, + 0x00, 0x3d, 0x8f, 0xe4, 0x28, 0xfe, 0xd3, 0xbc, + 0xff, 0x00, 0x9e, 0xc7, 0xf2, 0x14, 0x51, 0x40, + 0x07, 0xf6, 0x9d, 0xe7, 0xfc, 0xf6, 0x3f, 0x90, + 0xa3, 0xfb, 0x4e, 0xf3, 0xfe, 0x7b, 0x1f, 0xc8, + 0x51, 0x45, 0x00, 0x1f, 0xda, 0x77, 0x9f, 0xf3, + 0xd8, 0xfe, 0x42, 0x8f, 0xed, 0x3b, 0xcf, 0xf9, + 0xec, 0x7f, 0x21, 0x45, 0x14, 0x00, 0x7f, 0x69, + 0xde, 0x7f, 0xcf, 0x63, 0xf9, 0x0a, 0x3f, 0xb4, + 0xef, 0x3f, 0xe7, 0xb1, 0xfc, 0x85, 0x14, 0x50, + 0x01, 0xfd, 0xa7, 0x79, 0xff, 0x00, 0x3d, 0x8f, + 0xe4, 0x28, 0xfe, 0xd3, 0xbc, 0xff, 0x00, 0x9e, + 0xc7, 0xf2, 0x14, 0x51, 0x40, 0x07, 0xf6, 0x9d, + 0xe7, 0xfc, 0xf6, 0x3f, 0x90, 0xa3, 0xfb, 0x4e, + 0xf3, 0xfe, 0x7b, 0x1f, 0xc8, 0x51, 0x45, 0x00, + 0x1f, 0xda, 0x77, 0x9f, 0xf3, 0xd8, 0xfe, 0x42, + 0x8f, 0xed, 0x3b, 0xcf, 0xf9, 0xec, 0x7f, 0x21, + 0x45, 0x14, 0x00, 0x7f, 0x69, 0xde, 0x7f, 0xcf, + 0x63, 0xf9, 0x0a, 0x3f, 0xb4, 0xef, 0x3f, 0xe7, + 0xb1, 0xfc, 0x85, 0x14, 0x50, 0x01, 0xfd, 0xa7, + 0x79, 0xff, 0x00, 0x3d, 0x8f, 0xe4, 0x28, 0xfe, + 0xd3, 0xbc, 0xff, 0x00, 0x9e, 0xc7, 0xf2, 0x14, + 0x51, 0x40, 0x07, 0xf6, 0x9d, 0xe7, 0xfc, 0xf6, + 0x3f, 0x90, 0xa3, 0xfb, 0x4e, 0xf3, 0xfe, 0x7b, + 0x1f, 0xc8, 0x51, 0x45, 0x00, 0x1f, 0xda, 0x77, + 0x9f, 0xf3, 0xd8, 0xfe, 0x42, 0x8f, 0xed, 0x3b, + 0xcf, 0xf9, 0xec, 0x7f, 0x21, 0x45, 0x14, 0x00, + 0x7f, 0x69, 0xde, 0x7f, 0xcf, 0x63, 0xf9, 0x0a, + 0x3f, 0xb4, 0xef, 0x3f, 0xe7, 0xb1, 0xfc, 0x85, + 0x14, 0x50, 0x01, 0xfd, 0xa7, 0x79, 0xff, 0x00, + 0x3d, 0x8f, 0xe4, 0x28, 0xfe, 0xd3, 0xbc, 0xff, + 0x00, 0x9e, 0xc7, 0xf2, 0x14, 0x51, 0x40, 0x07, + 0xf6, 0x9d, 0xe7, 0xfc, 0xf6, 0x3f, 0x90, 0xa3, + 0xfb, 0x4e, 0xf3, 0xfe, 0x7b, 0x1f, 0xc8, 0x51, + 0x45, 0x00, 0x1f, 0xda, 0x77, 0x9f, 0xf3, 0xd8, + 0xfe, 0x42, 0x8f, 0xed, 0x3b, 0xcf, 0xf9, 0xec, + 0x7f, 0x21, 0x45, 0x14, 0x00, 0x7f, 0x69, 0xde, + 0x7f, 0xcf, 0x63, 0xf9, 0x0a, 0x3f, 0xb4, 0xef, + 0x3f, 0xe7, 0xb1, 0xfc, 0x85, 0x14, 0x50, 0x01, + 0xfd, 0xa7, 0x79, 0xff, 0x00, 0x3d, 0x8f, 0xe4, + 0x28, 0xfe, 0xd3, 0xbc, 0xff, 0x00, 0x9e, 0xc7, + 0xf2, 0x14, 0x51, 0x40, 0x07, 0xf6, 0x9d, 0xe7, + 0xfc, 0xf6, 0x3f, 0x90, 0xa3, 0xfb, 0x4e, 0xf3, + 0xfe, 0x7b, 0x1f, 0xc8, 0x51, 0x45, 0x00, 0x1f, + 0xda, 0x77, 0x9f, 0xf3, 0xd8, 0xfe, 0x42, 0x8f, + 0xed, 0x3b, 0xcf, 0xf9, 0xec, 0x7f, 0x21, 0x45, + 0x14, 0x00, 0x7f, 0x69, 0xde, 0x7f, 0xcf, 0x63, + 0xf9, 0x0a, 0x3f, 0xb4, 0xef, 0x3f, 0xe7, 0xb1, + 0xfc, 0x85, 0x14, 0x50, 0x01, 0xfd, 0xa7, 0x79, + 0xff, 0x00, 0x3d, 0x8f, 0xe4, 0x28, 0xfe, 0xd3, + 0xbc, 0xff, 0x00, 0x9e, 0xc7, 0xf2, 0x14, 0x51, + 0x40, 0x07, 0xf6, 0x9d, 0xe7, 0xfc, 0xf6, 0x3f, + 0x90, 0xa3, 0xfb, 0x4e, 0xf3, 0xfe, 0x7b, 0x1f, + 0xc8, 0x51, 0x45, 0x00, 0x1f, 0xda, 0x77, 0x9f, + 0xf3, 0xd8, 0xfe, 0x42, 0x8f, 0xed, 0x3b, 0xcf, + 0xf9, 0xec, 0x7f, 0x21, 0x45, 0x14, 0x00, 0x7f, + 0x69, 0xde, 0x7f, 0xcf, 0x63, 0xf9, 0x0a, 0x3f, + 0xb4, 0xef, 0x3f, 0xe7, 0xb1, 0xfc, 0x85, 0x14, + 0x50, 0x01, 0xfd, 0xa7, 0x79, 0xff, 0x00, 0x3d, + 0x8f, 0xe4, 0x28, 0xfe, 0xd3, 0xbc, 0xff, 0x00, + 0x9e, 0xc7, 0xf2, 0x14, 0x51, 0x40, 0x07, 0xf6, + 0x9d, 0xe7, 0xfc, 0xf6, 0x3f, 0x90, 0xa3, 0xfb, + 0x4e, 0xf3, 0xfe, 0x7b, 0x1f, 0xc8, 0x51, 0x45, + 0x00, 0x1f, 0xda, 0x77, 0x9f, 0xf3, 0xd8, 0xfe, + 0x42, 0x8f, 0xed, 0x3b, 0xcf, 0xf9, 0xec, 0x7f, + 0x21, 0x45, 0x14, 0x01, 0x3d, 0x8d, 0xcd, 0xc5, + 0xe5, 0xec, 0x50, 0x4b, 0x29, 0x28, 0x4e, 0xe3, + 0xc0, 0xed, 0xcf, 0xf4, 0xa2, 0x8a, 0x28, 0x03, + 0xff, 0xd9, +}; + +static const uint8_t data_dk_tm4c129x_jpg[] = +{ + /* /dk-tm4c129x.jpg */ + 0x2f, 0x64, 0x6b, 0x2d, 0x74, 0x6d, 0x34, 0x63, + 0x31, 0x32, 0x39, 0x78, 0x2e, 0x6a, 0x70, 0x67, + 0x00, + 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, + 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, + 0x00, 0x48, 0x00, 0x00, 0xff, 0xe1, 0x00, 0x40, + 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x4d, 0x4d, + 0x00, 0x2a, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, + 0x87, 0x69, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0xa0, 0x02, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xd0, 0xa0, 0x03, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0xac, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdb, + 0x00, 0x43, 0x00, 0x06, 0x04, 0x05, 0x06, 0x05, + 0x04, 0x06, 0x06, 0x05, 0x06, 0x07, 0x07, 0x06, + 0x08, 0x0a, 0x10, 0x0a, 0x0a, 0x09, 0x09, 0x0a, + 0x14, 0x0e, 0x0f, 0x0c, 0x10, 0x17, 0x14, 0x18, + 0x18, 0x17, 0x14, 0x16, 0x16, 0x1a, 0x1d, 0x25, + 0x1f, 0x1a, 0x1b, 0x23, 0x1c, 0x16, 0x16, 0x20, + 0x2c, 0x20, 0x23, 0x26, 0x27, 0x29, 0x2a, 0x29, + 0x19, 0x1f, 0x2d, 0x30, 0x2d, 0x28, 0x30, 0x25, + 0x28, 0x29, 0x28, 0xff, 0xdb, 0x00, 0x43, 0x01, + 0x07, 0x07, 0x07, 0x0a, 0x08, 0x0a, 0x13, 0x0a, + 0x0a, 0x13, 0x28, 0x1a, 0x16, 0x1a, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0xff, 0xc0, 0x00, 0x11, 0x08, 0x00, 0xac, 0x00, + 0xd0, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, + 0x03, 0x11, 0x01, 0xff, 0xc4, 0x00, 0x1f, 0x00, + 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xc4, 0x00, 0xb5, + 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, + 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, + 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, + 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, + 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, + 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, + 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, + 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, + 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, + 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xff, 0xc4, 0x00, 0x1f, 0x01, + 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xc4, 0x00, 0xb5, + 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, + 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, + 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, + 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, + 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, + 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, + 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, + 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, + 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, + 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, + 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, + 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, + 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, + 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xff, 0xda, 0x00, 0x0c, 0x03, + 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, + 0x00, 0xba, 0x23, 0xf6, 0xa9, 0x16, 0x3c, 0x91, + 0x56, 0x12, 0x2c, 0xe2, 0xa7, 0x8e, 0x1a, 0xd8, + 0xc8, 0x81, 0x22, 0xe9, 0x56, 0x23, 0x87, 0xa7, + 0x15, 0x66, 0x28, 0x7d, 0xaa, 0xdc, 0x50, 0x50, + 0x17, 0x2a, 0xc5, 0x07, 0xb5, 0x5c, 0x8a, 0xdf, + 0xda, 0xac, 0xc5, 0x07, 0xb5, 0x57, 0xd7, 0xb5, + 0x4b, 0x6f, 0x0f, 0xe9, 0xdf, 0x6d, 0xbd, 0x8e, + 0x57, 0x87, 0x78, 0x43, 0xe5, 0x80, 0x48, 0x27, + 0x3d, 0x47, 0xa6, 0x78, 0xfa, 0x9a, 0x41, 0x72, + 0xdc, 0x56, 0xf5, 0x6e, 0x38, 0x3d, 0xab, 0x3b, + 0xc1, 0xfa, 0xe5, 0x9f, 0x89, 0x74, 0xe6, 0xbb, + 0xb2, 0x05, 0x4a, 0x48, 0x63, 0x92, 0x36, 0x39, + 0x2a, 0x47, 0xd3, 0xfc, 0xf6, 0xae, 0x90, 0x22, + 0x46, 0xbb, 0xa4, 0x2a, 0x8b, 0xc7, 0x2d, 0x8f, + 0xeb, 0x45, 0xd0, 0xca, 0xf1, 0xc1, 0xed, 0x53, + 0x79, 0x68, 0x8a, 0x59, 0xca, 0xaa, 0x8e, 0xe7, + 0x03, 0x1f, 0x5a, 0xe4, 0x75, 0x4f, 0x89, 0xbe, + 0x19, 0xd3, 0x2e, 0x26, 0x82, 0x4b, 0x89, 0x67, + 0x9a, 0x2e, 0x19, 0x61, 0x8f, 0x77, 0xcd, 0xcf, + 0xcb, 0xbb, 0xa6, 0x7f, 0x4e, 0xde, 0xd5, 0xe6, + 0x5f, 0x10, 0xbe, 0x2c, 0x5b, 0xeb, 0x76, 0x33, + 0x69, 0xb6, 0xb6, 0xb1, 0x43, 0x64, 0xe0, 0xe5, + 0xae, 0x1c, 0x17, 0x3c, 0x70, 0x40, 0x1c, 0x03, + 0xd7, 0xb9, 0xe7, 0xd3, 0xad, 0x4b, 0x7d, 0x82, + 0xce, 0xf6, 0x3d, 0xf6, 0xd8, 0xc3, 0x71, 0x18, + 0x92, 0xde, 0x48, 0xe5, 0x8f, 0x24, 0x06, 0x8d, + 0x83, 0x03, 0x83, 0xd3, 0x8e, 0x33, 0x9a, 0xb0, + 0xb0, 0xfb, 0x57, 0xc7, 0x3a, 0x7f, 0xc4, 0xdd, + 0x4b, 0x47, 0x81, 0x2d, 0xb4, 0x9b, 0xfb, 0xc8, + 0xe0, 0x42, 0xc5, 0x23, 0x4d, 0xa1, 0x57, 0x27, + 0x3d, 0xfe, 0xa7, 0xfc, 0xf4, 0xf5, 0x6f, 0x85, + 0xfe, 0x2c, 0xd4, 0xbc, 0x5d, 0x60, 0x6c, 0x6e, + 0xee, 0x27, 0x37, 0xac, 0xc7, 0xcb, 0x92, 0x5b, + 0x96, 0x40, 0x54, 0x93, 0xd4, 0x8e, 0x38, 0xda, + 0x78, 0xe0, 0x9c, 0x8f, 0xa5, 0x67, 0x52, 0xab, + 0xa7, 0x1e, 0x66, 0x8e, 0x8c, 0x3e, 0x1f, 0xdb, + 0x4d, 0x42, 0xf6, 0xf3, 0x3d, 0xae, 0xe6, 0x7b, + 0x5b, 0x50, 0x3e, 0xd5, 0x71, 0x0c, 0x23, 0xb7, + 0x98, 0xe0, 0x67, 0xf3, 0xaa, 0xf6, 0xda, 0xa5, + 0x9d, 0xdb, 0x4c, 0xb6, 0x2e, 0x6e, 0xda, 0x15, + 0xdc, 0xfe, 0x50, 0xe1, 0x41, 0xef, 0x93, 0x81, + 0xd7, 0xde, 0xbc, 0xa2, 0xea, 0xce, 0x08, 0x5a, + 0xe9, 0x2e, 0xee, 0x4c, 0x57, 0x96, 0xf9, 0x12, + 0x09, 0xdc, 0x05, 0x90, 0x8e, 0x7e, 0x43, 0xdf, + 0x8e, 0x41, 0xce, 0x0f, 0xad, 0x3f, 0xc3, 0x37, + 0x12, 0xc9, 0x24, 0x37, 0x1a, 0x73, 0xab, 0x49, + 0x92, 0x1b, 0xec, 0xa4, 0xb3, 0x26, 0xd2, 0x3a, + 0x8c, 0xf2, 0x39, 0x1c, 0x1e, 0x31, 0x5c, 0x2f, + 0x1b, 0x55, 0xed, 0x1b, 0x23, 0xdc, 0x59, 0x26, + 0x1f, 0x97, 0xf8, 0xb7, 0x97, 0x45, 0xb7, 0xf5, + 0xf2, 0x3d, 0x72, 0xc6, 0xe2, 0x1b, 0xc1, 0x2f, + 0x96, 0x48, 0x78, 0x9c, 0xc7, 0x22, 0x1e, 0xaa, + 0x47, 0xb5, 0x5a, 0xf2, 0xfd, 0xab, 0x99, 0xf0, + 0x0e, 0xb5, 0x25, 0x8d, 0xc5, 0xdd, 0xae, 0xb1, + 0x6a, 0x02, 0x11, 0xbd, 0x6f, 0x44, 0x59, 0xf3, + 0x32, 0xc1, 0x40, 0x38, 0x19, 0x2d, 0xbc, 0xb7, + 0x50, 0x31, 0x8e, 0x7b, 0x57, 0x64, 0x0c, 0x53, + 0xe6, 0x4b, 0x62, 0xc6, 0x22, 0x48, 0x19, 0x18, + 0x23, 0x07, 0x18, 0x3d, 0xc1, 0xe0, 0xe6, 0xbb, + 0xe8, 0xd4, 0xe6, 0x8a, 0xbb, 0xd4, 0xf0, 0x71, + 0x54, 0x1d, 0x29, 0xbb, 0x26, 0x91, 0x44, 0xc7, + 0xed, 0x51, 0x98, 0xfd, 0xab, 0x40, 0xc7, 0xed, + 0x4d, 0x31, 0xd6, 0xe7, 0x21, 0x9c, 0xd1, 0xf1, + 0x51, 0xb4, 0x7e, 0xd5, 0xa4, 0x62, 0xf6, 0xa8, + 0xcc, 0x34, 0xc9, 0x33, 0x0c, 0x5e, 0xd4, 0xd3, + 0x15, 0x69, 0x18, 0x71, 0xda, 0x98, 0x61, 0xf6, + 0xa6, 0x23, 0x37, 0xca, 0xa3, 0xc9, 0xfc, 0x6b, + 0x48, 0xc3, 0xed, 0x47, 0x93, 0xed, 0x4c, 0x46, + 0x70, 0x84, 0x74, 0xc5, 0x38, 0x43, 0xed, 0x5a, + 0x02, 0x1e, 0x29, 0xe2, 0x1f, 0x41, 0x48, 0x0f, + 0x3b, 0x8e, 0x1f, 0xad, 0x59, 0x8e, 0x1f, 0x6a, + 0x87, 0x54, 0x99, 0xac, 0x2d, 0x52, 0x70, 0xab, + 0xe5, 0xef, 0x08, 0xec, 0xdf, 0xc0, 0x09, 0xfb, + 0xde, 0xe3, 0xaf, 0xa5, 0x3f, 0x5b, 0x01, 0x1e, + 0xd2, 0xce, 0xd3, 0x52, 0x5b, 0x6b, 0xdb, 0x87, + 0x00, 0x09, 0x10, 0xf9, 0x6c, 0x0f, 0x20, 0x2c, + 0x80, 0x11, 0x93, 0x91, 0x81, 0x90, 0x6b, 0x96, + 0x75, 0xd4, 0x5b, 0x8a, 0x4d, 0xb3, 0xd0, 0xa7, + 0x85, 0x73, 0x51, 0x94, 0xa4, 0x92, 0x7d, 0xfc, + 0x8b, 0xd1, 0x42, 0x00, 0xe4, 0x70, 0x3a, 0xfb, + 0x53, 0x1e, 0xff, 0x00, 0x4f, 0xb5, 0x07, 0xcf, + 0xbb, 0x85, 0x48, 0xea, 0x37, 0x02, 0x7f, 0x21, + 0xcd, 0x67, 0xde, 0x78, 0x37, 0x51, 0x96, 0xca, + 0x47, 0x93, 0x52, 0x37, 0x17, 0x20, 0x7c, 0x91, + 0x9c, 0xed, 0x3d, 0x3b, 0xfd, 0x33, 0xd8, 0x73, + 0x5e, 0x7f, 0x7d, 0x73, 0x69, 0xa6, 0xbc, 0x7f, + 0x6f, 0xbb, 0x4e, 0x5b, 0x1e, 0x5c, 0x63, 0x2c, + 0x40, 0xeb, 0xcf, 0x00, 0x1f, 0xc4, 0x1f, 0xd2, + 0xb9, 0xe7, 0x89, 0xaa, 0x9d, 0xa3, 0x03, 0xd2, + 0xc3, 0xe5, 0xb8, 0x59, 0x45, 0xce, 0x75, 0xb4, + 0x5b, 0xd9, 0x5b, 0xf3, 0x3d, 0x09, 0xfc, 0x61, + 0xa5, 0x45, 0x30, 0x8e, 0x35, 0x9a, 0x52, 0x4f, + 0xde, 0xda, 0x11, 0x7a, 0x1e, 0xa5, 0xba, 0x7e, + 0x55, 0xc7, 0xfc, 0x41, 0xf1, 0x3c, 0xfa, 0xae, + 0x86, 0xf6, 0xb6, 0xb6, 0xe2, 0x18, 0x1d, 0x91, + 0xa4, 0x3b, 0x44, 0x8f, 0xb0, 0x1e, 0x4a, 0x8c, + 0x80, 0x48, 0x38, 0x38, 0xc1, 0xe3, 0x93, 0x8c, + 0x66, 0xb2, 0xef, 0x35, 0x9d, 0x12, 0xe5, 0x5e, + 0xeb, 0x45, 0xfb, 0x5d, 0xbc, 0xa2, 0x52, 0x11, + 0x64, 0x6e, 0x80, 0x77, 0x1c, 0x7a, 0x63, 0xbe, + 0x41, 0xe7, 0xa6, 0x2b, 0x9a, 0xf1, 0x46, 0xb2, + 0xf6, 0x3e, 0x24, 0xb5, 0x0c, 0xf1, 0x18, 0xa6, + 0x83, 0x71, 0x4c, 0x06, 0xc1, 0x24, 0x82, 0x09, + 0xc6, 0x08, 0xe3, 0x04, 0x72, 0x3a, 0xf5, 0xee, + 0xbd, 0xa5, 0x67, 0x75, 0xd5, 0x1a, 0x54, 0xc2, + 0xe1, 0x21, 0x08, 0xd4, 0x86, 0xcf, 0xb9, 0x5b, + 0xc3, 0x9e, 0x29, 0xbc, 0xf0, 0xdd, 0xec, 0xd3, + 0xd9, 0xdc, 0x43, 0xb4, 0x2b, 0x43, 0x2e, 0x5f, + 0x11, 0xbe, 0x01, 0x1d, 0x38, 0x3c, 0x75, 0x53, + 0xd4, 0x7b, 0x64, 0x8a, 0xdd, 0xf1, 0x47, 0xc4, + 0x1b, 0x0b, 0x71, 0x71, 0x6c, 0xab, 0x75, 0x2d, + 0xf3, 0x8c, 0xb4, 0xfe, 0x61, 0x08, 0x14, 0x93, + 0x8d, 0x9b, 0x86, 0xec, 0x7d, 0xd2, 0x0f, 0xb6, + 0x7e, 0x9e, 0x6b, 0xaa, 0xc5, 0x65, 0xa7, 0xdf, + 0xca, 0x2e, 0x2d, 0x84, 0x91, 0xc9, 0xf3, 0xc4, + 0xc4, 0x06, 0x38, 0x23, 0x90, 0x73, 0xe8, 0x7d, + 0xbd, 0xc7, 0x6a, 0x7f, 0x8a, 0x6e, 0x6e, 0x3e, + 0xd7, 0xa7, 0x5e, 0x0c, 0x79, 0x17, 0x56, 0x88, + 0x88, 0x8c, 0x77, 0x60, 0x28, 0xc1, 0x1d, 0x73, + 0x8e, 0x48, 0xfa, 0x1e, 0x2b, 0x5b, 0x46, 0x7c, + 0xad, 0x9c, 0x50, 0x94, 0xe9, 0x29, 0xc6, 0x3a, + 0x6c, 0x64, 0x6a, 0x11, 0x5d, 0xfd, 0xa9, 0x61, + 0x56, 0x96, 0x66, 0x61, 0x90, 0x55, 0x48, 0x2f, + 0x91, 0xd4, 0x8e, 0xa7, 0x20, 0x53, 0xa1, 0xf0, + 0xc6, 0xb3, 0x72, 0xac, 0xcb, 0xa7, 0xcc, 0x02, + 0x82, 0x49, 0x75, 0xd9, 0x8c, 0x2e, 0xef, 0xe2, + 0xf6, 0xe7, 0x18, 0xe9, 0xcd, 0x7b, 0x9d, 0xd3, + 0xc8, 0x1d, 0xa0, 0xd3, 0xf4, 0xc7, 0x86, 0x24, + 0x0a, 0x7c, 0xe8, 0x01, 0x22, 0x47, 0x55, 0x00, + 0x9c, 0xb2, 0x8d, 0xa3, 0xd7, 0xa8, 0xcf, 0x6e, + 0x49, 0x38, 0x37, 0x91, 0xc1, 0xb0, 0x7d, 0xa6, + 0xee, 0xf1, 0xc1, 0xdb, 0xfb, 0xa5, 0x5c, 0x81, + 0xb4, 0x63, 0x05, 0x9b, 0x03, 0x20, 0x71, 0x90, + 0xa4, 0x7a, 0x57, 0x3b, 0xc6, 0xbb, 0xda, 0x28, + 0xf5, 0xa9, 0xe4, 0x8a, 0x4b, 0x9a, 0x72, 0x3c, + 0x9a, 0x1d, 0x03, 0x69, 0x56, 0xb9, 0xb9, 0x45, + 0x4f, 0x48, 0xd4, 0xbb, 0x64, 0x10, 0x08, 0xc7, + 0x1e, 0xb9, 0x15, 0xd1, 0x78, 0x13, 0x5e, 0x7d, + 0x36, 0xe1, 0x62, 0x62, 0xc8, 0x50, 0x10, 0x3b, + 0x11, 0x9e, 0x33, 0x8c, 0xf2, 0xc3, 0xdf, 0x3d, + 0xa9, 0x3c, 0x6f, 0x7d, 0x15, 0x96, 0xa3, 0x0c, + 0x56, 0x36, 0xf2, 0xc2, 0x02, 0x12, 0xe2, 0x57, + 0xdc, 0x5b, 0x3c, 0x7a, 0x00, 0x38, 0x07, 0xb7, + 0x7a, 0xe5, 0xa4, 0x9e, 0x59, 0x10, 0x5e, 0x67, + 0x64, 0xca, 0xc3, 0x1b, 0x40, 0x19, 0x00, 0x7e, + 0xb5, 0xd3, 0x1b, 0xd4, 0xa7, 0xef, 0xf5, 0x3c, + 0xca, 0xd0, 0x8d, 0x0a, 0xd6, 0xa3, 0xf6, 0x4f, + 0x4d, 0xf1, 0x2c, 0xb0, 0xad, 0xd4, 0x1a, 0xb8, + 0x6c, 0x47, 0x71, 0x28, 0x8a, 0x68, 0xf9, 0xfd, + 0xcc, 0xa0, 0x74, 0xe7, 0x8d, 0xa4, 0x0c, 0x8e, + 0x78, 0x1d, 0x79, 0xcd, 0x6b, 0xf8, 0x4f, 0x50, + 0xb8, 0x13, 0xea, 0x13, 0xd9, 0x5e, 0xc6, 0x91, + 0x22, 0x01, 0x71, 0x12, 0xca, 0x56, 0x42, 0xa4, + 0xf0, 0x54, 0xe3, 0x6e, 0xee, 0x3f, 0x11, 0xc7, + 0xd3, 0xce, 0x3c, 0xdb, 0xad, 0x67, 0x45, 0xfb, + 0x35, 0x8c, 0x26, 0x69, 0xde, 0x45, 0x2d, 0x1c, + 0x6b, 0xb9, 0x89, 0x50, 0x78, 0x00, 0x76, 0xe9, + 0xe9, 0xc7, 0xd2, 0xba, 0x4f, 0x08, 0x4d, 0x77, + 0xa1, 0x1d, 0x53, 0x49, 0xb8, 0x81, 0x20, 0xb9, + 0x97, 0xcb, 0x37, 0x31, 0xcb, 0x12, 0xf9, 0x8b, + 0x18, 0x04, 0x8c, 0x16, 0x3f, 0x28, 0x3b, 0xb2, + 0x46, 0x09, 0xe8, 0x7d, 0x8b, 0x82, 0x97, 0x27, + 0x24, 0x8c, 0xa6, 0xe0, 0xaa, 0xaa, 0xd0, 0xba, + 0x5b, 0xfc, 0xce, 0xa7, 0x48, 0xf8, 0x91, 0x79, + 0x0d, 0xb1, 0x36, 0xae, 0x03, 0xb2, 0x80, 0xd3, + 0x5d, 0xcc, 0x64, 0x76, 0x3d, 0xc0, 0x55, 0xe4, + 0x2e, 0x7a, 0x72, 0x73, 0xd7, 0xd4, 0x51, 0x0f, + 0xc4, 0x0b, 0xe4, 0xd6, 0xec, 0xef, 0x6e, 0x75, + 0xb9, 0xb6, 0xdb, 0xc9, 0xe6, 0x0b, 0x68, 0xbe, + 0x58, 0x49, 0xcf, 0x21, 0x86, 0x72, 0xdd, 0x7b, + 0xf3, 0xf9, 0x53, 0xb4, 0x4f, 0x05, 0x78, 0x74, + 0x5b, 0x0b, 0x89, 0xdd, 0xee, 0x8b, 0x10, 0x63, + 0xb6, 0x77, 0x08, 0x70, 0xcc, 0x54, 0xae, 0x3a, + 0xee, 0x1b, 0x49, 0xe4, 0x0f, 0x4f, 0x43, 0x5b, + 0xba, 0x5e, 0x9f, 0x1a, 0xc6, 0xc0, 0x69, 0x10, + 0x69, 0x4a, 0xf1, 0xbb, 0x22, 0x3c, 0x42, 0x59, + 0x77, 0xa9, 0xdb, 0xb0, 0xe4, 0x72, 0x0e, 0x4f, + 0x3c, 0x0e, 0x0e, 0x73, 0x59, 0xba, 0xf0, 0x8b, + 0xba, 0x47, 0x44, 0x30, 0x15, 0x2a, 0xda, 0x32, + 0x96, 0x9f, 0x37, 0xfd, 0x7f, 0xc3, 0x9f, 0x4a, + 0x5a, 0x59, 0xc9, 0x25, 0x95, 0xbc, 0x92, 0xec, + 0xf3, 0x5e, 0x35, 0x67, 0xd9, 0xd3, 0x71, 0x19, + 0x38, 0xf6, 0xcd, 0x0f, 0x64, 0x47, 0x41, 0xfa, + 0x56, 0x27, 0xc3, 0x2d, 0x41, 0x67, 0xf0, 0xdc, + 0x63, 0xfb, 0x40, 0xdf, 0xb2, 0x9d, 0xa4, 0x2a, + 0x01, 0xe5, 0x71, 0xf7, 0x46, 0x3a, 0x81, 0xd8, + 0x8f, 0xd2, 0xbb, 0x62, 0x01, 0x1f, 0x5a, 0xe8, + 0x8c, 0xdb, 0x57, 0x3c, 0xda, 0x94, 0x94, 0x64, + 0xe2, 0x9d, 0xec, 0x73, 0xad, 0x6a, 0x41, 0xe8, + 0x6a, 0x26, 0x80, 0xe7, 0x91, 0x5d, 0x23, 0x42, + 0xac, 0x3a, 0x0a, 0x86, 0x4b, 0x55, 0x39, 0xff, + 0x00, 0x0a, 0xb5, 0x33, 0x27, 0x4c, 0xe7, 0xfc, + 0x9f, 0x6a, 0x4f, 0x27, 0xda, 0xb6, 0x64, 0xb4, + 0xc7, 0x20, 0x54, 0x06, 0x02, 0x0f, 0x22, 0xab, + 0x98, 0x87, 0x13, 0x2f, 0xc8, 0xf6, 0xa5, 0xf2, + 0x7d, 0xab, 0x47, 0xca, 0x1e, 0x94, 0x9e, 0x57, + 0xb5, 0x3b, 0x8b, 0x94, 0xa0, 0x21, 0xf6, 0xa5, + 0xf2, 0x79, 0xe9, 0x57, 0xfc, 0xac, 0x76, 0xa3, + 0xca, 0x14, 0x5c, 0x39, 0x4f, 0x34, 0xbd, 0x8d, + 0x3e, 0xcb, 0x22, 0x4b, 0xb8, 0x23, 0xa9, 0x52, + 0x53, 0xa8, 0xf7, 0x1e, 0x87, 0xb8, 0x3d, 0x8d, + 0x79, 0x9f, 0x8b, 0x35, 0x09, 0x63, 0xf0, 0xe5, + 0x9d, 0x8d, 0xd4, 0xa8, 0x35, 0x0b, 0x4b, 0xb2, + 0x91, 0x49, 0x85, 0x67, 0x91, 0x11, 0x77, 0xab, + 0xae, 0x7e, 0x65, 0x20, 0x60, 0xe7, 0x8c, 0x8e, + 0x39, 0xaf, 0x60, 0x96, 0xd7, 0xce, 0x81, 0x90, + 0x8e, 0xa2, 0xbc, 0xab, 0xe2, 0x6e, 0x82, 0xd7, + 0x5a, 0x69, 0x99, 0x4a, 0xa4, 0xb6, 0x67, 0xcc, + 0xdd, 0xe5, 0x8c, 0x91, 0x82, 0x30, 0x58, 0x7c, + 0xd8, 0x20, 0x91, 0x83, 0xc6, 0x48, 0xf7, 0x35, + 0x9c, 0xe1, 0xef, 0x29, 0x1b, 0x52, 0xaa, 0xf9, + 0x5d, 0x27, 0xb3, 0xd7, 0xe7, 0xff, 0x00, 0x04, + 0xe4, 0x75, 0x7f, 0x88, 0xfa, 0xe9, 0x91, 0x7c, + 0xdd, 0x5a, 0x78, 0xe4, 0xc6, 0x42, 0x43, 0x18, + 0x5e, 0xfd, 0x70, 0xa3, 0x9e, 0x9e, 0xb5, 0xcb, + 0x78, 0xbe, 0xf2, 0x5d, 0x5f, 0x4c, 0x67, 0x7b, + 0xa8, 0x0d, 0xc7, 0xc8, 0xfe, 0x4c, 0x4a, 0x10, + 0xf5, 0x0b, 0x80, 0x00, 0xc6, 0x79, 0xe6, 0xb9, + 0x89, 0x16, 0x77, 0x82, 0x49, 0x23, 0x12, 0xb4, + 0x31, 0x9f, 0x9d, 0x87, 0x21, 0x49, 0x3d, 0x4f, + 0xa7, 0xe9, 0x5d, 0x16, 0x95, 0xa7, 0xdd, 0x69, + 0x3a, 0x3e, 0x8d, 0xe2, 0x7d, 0x30, 0xdc, 0x49, + 0x3c, 0x97, 0x8f, 0x03, 0xa8, 0x8c, 0x2a, 0x47, + 0xb0, 0x1e, 0x0b, 0x83, 0xbb, 0xee, 0x9c, 0x9c, + 0x85, 0x00, 0x1e, 0xfd, 0x6a, 0x65, 0x64, 0xaf, + 0x63, 0x5a, 0x51, 0x93, 0x7c, 0xa9, 0xe8, 0xf7, + 0x17, 0xe1, 0xfb, 0xc7, 0x61, 0x29, 0x83, 0x52, + 0xb3, 0x74, 0x0a, 0xcc, 0xe6, 0x49, 0x08, 0x8f, + 0xae, 0x38, 0xc1, 0x20, 0x13, 0xc1, 0xc0, 0xeb, + 0x9f, 0xc4, 0x54, 0x1e, 0x33, 0x7f, 0xed, 0x27, + 0x5b, 0xdb, 0x65, 0x73, 0x2a, 0x64, 0xe7, 0x24, + 0xe0, 0x7a, 0x0e, 0xc0, 0x70, 0x7a, 0x00, 0x33, + 0xeb, 0x9c, 0xd6, 0x97, 0x8e, 0xb5, 0x66, 0xd5, + 0xad, 0xd2, 0xf2, 0xc2, 0xce, 0x0b, 0x59, 0xa6, + 0xb9, 0xdb, 0xb5, 0x77, 0x65, 0x46, 0xdc, 0x63, + 0x27, 0x8d, 0xb8, 0x1f, 0x5f, 0xad, 0x60, 0xd8, + 0xb4, 0x96, 0xf6, 0xf2, 0x47, 0x77, 0x2f, 0x9f, + 0x2c, 0x8d, 0xbc, 0x90, 0x9f, 0x77, 0x03, 0xb6, + 0x3a, 0x70, 0x3a, 0xf1, 0xe9, 0x59, 0x41, 0x4a, + 0x6b, 0x9d, 0x2d, 0x4e, 0xea, 0xce, 0x14, 0x5f, + 0xb0, 0x9b, 0xba, 0xb6, 0xfe, 0x65, 0xbd, 0x17, + 0x67, 0x88, 0x74, 0xe6, 0xb0, 0x9d, 0xd8, 0x00, + 0xa6, 0x44, 0x3c, 0xfe, 0xed, 0x80, 0x1c, 0xe3, + 0xbf, 0x1d, 0x7b, 0xe3, 0x38, 0xc5, 0x75, 0x10, + 0x78, 0x22, 0xca, 0xde, 0xd2, 0x3b, 0x99, 0xe6, + 0x97, 0x51, 0x68, 0xa5, 0xf2, 0xc4, 0x9c, 0xc5, + 0x14, 0x60, 0xf4, 0x2c, 0xa4, 0x64, 0xa9, 0x19, + 0xc1, 0xc8, 0x39, 0xfd, 0x78, 0x5b, 0x58, 0xa5, + 0xb3, 0xd4, 0x0d, 0xcd, 0x84, 0xaa, 0x91, 0x39, + 0x00, 0xae, 0x0f, 0xcb, 0x9c, 0x67, 0x8f, 0xe9, + 0xc6, 0x39, 0x15, 0xd8, 0xf8, 0x96, 0xfc, 0xc5, + 0xe1, 0xeb, 0x89, 0x22, 0x94, 0x89, 0xd0, 0x2e, + 0xdc, 0x71, 0xfc, 0x43, 0xd3, 0xa8, 0xc1, 0x3f, + 0x81, 0xae, 0x5c, 0x4a, 0xa9, 0x19, 0xa8, 0xc1, + 0xd9, 0x33, 0xd3, 0xca, 0xd6, 0x1e, 0xa5, 0x29, + 0x54, 0xac, 0xae, 0xe1, 0xf8, 0xa3, 0xd4, 0x26, + 0x9b, 0x4d, 0xbb, 0x48, 0x62, 0xbc, 0x92, 0x5b, + 0x89, 0x97, 0x85, 0x48, 0xa4, 0x2d, 0x12, 0x7d, + 0x01, 0xc1, 0xf7, 0xfb, 0xd8, 0x1f, 0x95, 0x67, + 0xea, 0xe7, 0x4f, 0x68, 0xa2, 0x8a, 0x2d, 0x2a, + 0xdb, 0x1b, 0x8f, 0xfc, 0xb4, 0x04, 0xf1, 0xc7, + 0x24, 0x73, 0x8e, 0x78, 0x19, 0x3e, 0xa7, 0xb5, + 0x70, 0x5f, 0x09, 0x6e, 0xee, 0x2f, 0x7f, 0xb6, + 0xe6, 0xbd, 0x8a, 0x4b, 0xb1, 0x18, 0x87, 0x0c, + 0x54, 0x9f, 0x2f, 0x97, 0xc9, 0xdc, 0x3a, 0x7e, + 0x44, 0x13, 0xc9, 0xe9, 0x82, 0xcd, 0x62, 0x29, + 0xf4, 0xfb, 0xdb, 0x8b, 0x6d, 0x4d, 0xe5, 0x90, + 0x28, 0x56, 0x88, 0xbe, 0x46, 0xf4, 0x23, 0x86, + 0xdb, 0xdb, 0x8e, 0xbe, 0x87, 0x23, 0xe9, 0x9c, + 0x70, 0xd2, 0x95, 0x47, 0x0e, 0x6d, 0x51, 0xd5, + 0x53, 0x32, 0x85, 0x2a, 0x11, 0xac, 0xe9, 0xb6, + 0x9d, 0xfa, 0xe9, 0xa7, 0xf5, 0xd8, 0xd7, 0xd5, + 0x7c, 0x27, 0x69, 0x77, 0x15, 0x9d, 0xed, 0xd5, + 0xbb, 0x4b, 0x68, 0x5c, 0x82, 0xd6, 0xf2, 0x65, + 0xc0, 0xe9, 0xd0, 0xf0, 0x07, 0x04, 0x67, 0x3d, + 0x78, 0xf4, 0xac, 0xe9, 0xfc, 0x37, 0xa5, 0x5d, + 0x5a, 0x7d, 0x8e, 0x38, 0x8d, 0xbd, 0xc5, 0xb2, + 0x36, 0x11, 0xc3, 0x13, 0x21, 0x07, 0x91, 0xcf, + 0x21, 0xb1, 0x9e, 0x0e, 0x47, 0x18, 0xf4, 0xce, + 0xe7, 0x81, 0x6e, 0x75, 0x12, 0x62, 0xb5, 0xb7, + 0xb7, 0xb9, 0x82, 0xc4, 0x36, 0xf8, 0x65, 0x95, + 0x98, 0x43, 0xbc, 0x72, 0xc1, 0x89, 0xf9, 0x40, + 0x20, 0x67, 0xd3, 0x3c, 0x77, 0xae, 0x97, 0x51, + 0xb2, 0xb9, 0xb7, 0xfb, 0x22, 0xc7, 0x1d, 0x88, + 0x8e, 0xfe, 0xe1, 0xa5, 0x59, 0x89, 0x50, 0x0b, + 0x93, 0x8c, 0x79, 0xaf, 0xce, 0x32, 0xc7, 0xbf, + 0x53, 0x8e, 0x69, 0x54, 0xe7, 0xa4, 0xdc, 0x2e, + 0xdd, 0xb6, 0x22, 0x94, 0xa8, 0xe2, 0xa2, 0xaa, + 0xa5, 0x18, 0x5f, 0xe2, 0xde, 0xff, 0x00, 0xe5, + 0xb1, 0xe1, 0xd6, 0xd6, 0x93, 0x78, 0x77, 0x56, + 0x13, 0x5a, 0x5c, 0x47, 0x24, 0x01, 0xce, 0x08, + 0x2c, 0x3b, 0x11, 0xb4, 0x86, 0x00, 0x11, 0xc9, + 0xf7, 0xc6, 0x45, 0x54, 0xb9, 0xfe, 0xd0, 0xff, + 0x00, 0x84, 0x99, 0xb5, 0x28, 0x42, 0x91, 0x34, + 0xcb, 0x19, 0x69, 0x24, 0xf9, 0x5b, 0x70, 0x23, + 0x6b, 0x1c, 0xe4, 0x8c, 0x03, 0xcf, 0xb7, 0xbd, + 0x77, 0x3f, 0x17, 0xf4, 0x65, 0xd3, 0xe1, 0x48, + 0xa2, 0x78, 0x24, 0xb9, 0x69, 0x37, 0xb2, 0xc3, + 0xbc, 0xed, 0xf9, 0x7d, 0x48, 0xda, 0x73, 0x9c, + 0xe0, 0x67, 0x1d, 0x7a, 0x75, 0xe7, 0xf4, 0x3b, + 0x85, 0xd3, 0xa2, 0x8f, 0x4e, 0xb8, 0x88, 0x34, + 0xe8, 0xa1, 0xdf, 0x7b, 0x30, 0x07, 0x76, 0x1b, + 0x6e, 0x38, 0xc7, 0x3c, 0x7a, 0xd7, 0x4d, 0x39, + 0xcd, 0xc3, 0xda, 0x4a, 0x3e, 0xf1, 0xe6, 0xe2, + 0x63, 0x45, 0x4d, 0xd2, 0xa5, 0x2f, 0x73, 0x7f, + 0x99, 0xd3, 0xfc, 0x3d, 0xd4, 0xb5, 0x36, 0xd3, + 0xaf, 0xbe, 0xd4, 0x44, 0x50, 0xc5, 0x3a, 0xa7, + 0x93, 0xb1, 0x46, 0xc7, 0x0b, 0x83, 0x95, 0xeb, + 0xe8, 0x0f, 0x00, 0x67, 0xde, 0xbb, 0x7d, 0x3b, + 0x51, 0xb8, 0x96, 0xe2, 0x47, 0x8a, 0x38, 0xcb, + 0xe4, 0xcb, 0x2c, 0xc4, 0x84, 0x65, 0x03, 0x39, + 0x3b, 0xfb, 0x75, 0x3e, 0xbf, 0xa6, 0x2b, 0x1b, + 0x47, 0xd5, 0xc1, 0xd3, 0x24, 0xb4, 0xd3, 0xe3, + 0x10, 0xc5, 0x23, 0x97, 0x77, 0xff, 0x00, 0x9e, + 0xe0, 0xed, 0xc6, 0xec, 0xf1, 0xb8, 0x02, 0x32, + 0x7a, 0x93, 0xce, 0x4f, 0x5a, 0xc7, 0xf1, 0x4b, + 0x5e, 0x49, 0xa5, 0xcf, 0x10, 0x99, 0x9d, 0x59, + 0x4a, 0x8c, 0x12, 0x40, 0x24, 0x81, 0xdf, 0xb7, + 0x6e, 0x3e, 0xb5, 0xc7, 0x29, 0x46, 0xa5, 0x5b, + 0xb7, 0x63, 0xde, 0xc2, 0xc6, 0x54, 0xb0, 0x76, + 0x8c, 0x53, 0x3b, 0xdd, 0x33, 0xc5, 0x56, 0x7e, + 0x1a, 0x17, 0x4c, 0x2f, 0xe3, 0xb6, 0x92, 0x6b, + 0xad, 0xd7, 0x51, 0x47, 0x2b, 0x31, 0x18, 0xc8, + 0xf2, 0xca, 0xa8, 0x24, 0x1e, 0x7a, 0xf1, 0xc8, + 0xc8, 0x23, 0x9a, 0xea, 0x7c, 0x31, 0xf1, 0x8a, + 0xe2, 0x5d, 0x5b, 0x4e, 0xd3, 0xe6, 0xd3, 0x19, + 0x34, 0xcc, 0x1f, 0xb4, 0x5f, 0xce, 0x4e, 0xf0, + 0x3b, 0x7c, 0xa0, 0x75, 0xe9, 0x9e, 0xe7, 0x93, + 0x81, 0x5e, 0x1f, 0xe0, 0xef, 0x07, 0x78, 0xc7, + 0x56, 0x85, 0x17, 0x4b, 0xd3, 0x0a, 0x45, 0x1f, + 0xee, 0xcc, 0xb2, 0x20, 0x8f, 0x04, 0xe4, 0xe0, + 0x9e, 0x1b, 0xd3, 0x9e, 0x9d, 0x2b, 0xd2, 0x74, + 0x3f, 0x82, 0x3a, 0xfb, 0xb4, 0x37, 0x1a, 0xa6, + 0xbd, 0x0d, 0xac, 0x8a, 0x55, 0xb6, 0xc4, 0xbb, + 0xf0, 0x41, 0xce, 0x0f, 0x3c, 0x8c, 0x0f, 0x5a, + 0xf4, 0xe1, 0x18, 0xc7, 0x66, 0x7c, 0x9e, 0x22, + 0xa4, 0xea, 0xb7, 0xce, 0x92, 0xfe, 0xbe, 0xf3, + 0xe9, 0x98, 0xdc, 0x49, 0x1a, 0xba, 0xe7, 0x6b, + 0x00, 0xc3, 0x23, 0xb5, 0x3e, 0xb0, 0x6f, 0xf5, + 0x3d, 0x42, 0xd8, 0xda, 0x25, 0x96, 0x9d, 0xf6, + 0xf5, 0x73, 0xb6, 0x67, 0x8a, 0x64, 0x8c, 0xc5, + 0xf2, 0x9c, 0x36, 0xd6, 0x23, 0x70, 0x24, 0x63, + 0x83, 0x9a, 0xbb, 0x6b, 0x3d, 0xdb, 0xc8, 0x0c, + 0xf1, 0xc5, 0x1a, 0x74, 0xe1, 0xcb, 0x1f, 0xe4, + 0x29, 0xb9, 0x6b, 0x63, 0x94, 0xd0, 0x23, 0x23, + 0x9a, 0x63, 0xc4, 0xac, 0x3a, 0x54, 0x94, 0x55, + 0x05, 0x8a, 0x8f, 0x07, 0xa0, 0xa8, 0x8c, 0x7e, + 0xd5, 0xa1, 0x8a, 0x8d, 0xd0, 0x1e, 0x82, 0xa9, + 0x32, 0x5c, 0x4a, 0x5b, 0x3d, 0xa8, 0xd9, 0xed, + 0x56, 0x0a, 0x63, 0xb5, 0x26, 0x28, 0xb8, 0xac, + 0x72, 0x76, 0x16, 0x26, 0x56, 0x19, 0x07, 0x19, + 0xf4, 0xac, 0x8f, 0x1c, 0xe8, 0x28, 0xb0, 0x17, + 0x68, 0xf7, 0x45, 0x2a, 0x94, 0x90, 0x7a, 0x82, + 0x08, 0xc5, 0x7a, 0x05, 0x8d, 0xaa, 0xc2, 0x83, + 0x81, 0xf9, 0x53, 0x75, 0xab, 0x25, 0xbe, 0xd3, + 0xe5, 0x89, 0x86, 0x49, 0x1c, 0x53, 0x72, 0xbb, + 0xb1, 0x2a, 0x16, 0x57, 0x5b, 0x9f, 0x2d, 0xd8, + 0x68, 0xb6, 0x96, 0x17, 0x1a, 0x9e, 0x89, 0x63, + 0x6d, 0x12, 0x35, 0xfc, 0x49, 0x10, 0x32, 0x82, + 0xa0, 0x4a, 0x84, 0x15, 0x71, 0xcf, 0x40, 0x1c, + 0x9d, 0xdc, 0x60, 0x0c, 0xf6, 0xcd, 0x66, 0xea, + 0x12, 0xdc, 0x45, 0x75, 0xa7, 0xe9, 0x96, 0x36, + 0xec, 0xba, 0x66, 0x16, 0xe2, 0x74, 0xb6, 0x0d, + 0x22, 0x47, 0x31, 0x52, 0xa7, 0x7f, 0xcd, 0x8c, + 0xe5, 0x5b, 0xbe, 0x4a, 0xfa, 0xe2, 0xbb, 0x7f, + 0x19, 0x58, 0xcb, 0x63, 0x33, 0x5e, 0xc1, 0x95, + 0x9e, 0x15, 0x31, 0x3f, 0xc8, 0x1b, 0x28, 0x73, + 0xd4, 0x1e, 0x3a, 0x9f, 0x43, 0xd6, 0xb8, 0x7b, + 0x3b, 0xeb, 0xa5, 0xbb, 0xb8, 0x92, 0x07, 0x22, + 0x4b, 0x80, 0x44, 0x8e, 0xd8, 0x6c, 0x93, 0xc8, + 0xce, 0x70, 0xbd, 0x7b, 0x9e, 0x3a, 0x9e, 0x71, + 0x8a, 0xf2, 0xa7, 0x37, 0x4a, 0xa3, 0x8c, 0xd5, + 0xcf, 0xad, 0xc3, 0xd2, 0x58, 0xbc, 0x32, 0xab, + 0x49, 0xa8, 0xf7, 0xf5, 0x5b, 0xff, 0x00, 0x9a, + 0x38, 0x5f, 0x13, 0x48, 0x6d, 0xf6, 0x89, 0x70, + 0xcf, 0xe6, 0x00, 0xcc, 0x30, 0x7d, 0xb3, 0x91, + 0xc0, 0x3d, 0xf8, 0xce, 0x7b, 0xe0, 0xf1, 0x5c, + 0xf4, 0x9a, 0x95, 0xa3, 0x31, 0x12, 0x4c, 0x50, + 0x8e, 0xbb, 0x86, 0x41, 0x23, 0xbf, 0xa0, 0x3d, + 0xfb, 0x7b, 0xd7, 0x77, 0xad, 0xe8, 0xb2, 0x88, + 0x56, 0x24, 0x0e, 0xde, 0x71, 0xc7, 0x93, 0xb4, + 0xe7, 0x78, 0x38, 0x20, 0xf6, 0xdd, 0x9e, 0x47, + 0x5c, 0x02, 0x3e, 0x95, 0xc9, 0xbe, 0x86, 0x34, + 0x8d, 0x65, 0xed, 0xbe, 0xd0, 0x8f, 0x30, 0x68, + 0xee, 0x23, 0x65, 0x5c, 0x15, 0x65, 0x24, 0xed, + 0xe9, 0xd7, 0x9c, 0x76, 0x04, 0xf3, 0xd8, 0x57, + 0x55, 0x1c, 0x4c, 0x79, 0x4f, 0x37, 0x1f, 0x81, + 0x92, 0x92, 0x9f, 0x46, 0x33, 0x48, 0x9a, 0xde, + 0x6b, 0xc8, 0xd6, 0x07, 0x2e, 0x1a, 0x4d, 0xcc, + 0xc0, 0x1e, 0x49, 0x39, 0xe0, 0xfa, 0xf1, 0xff, + 0x00, 0xea, 0xae, 0xba, 0xfe, 0xde, 0xc8, 0x5a, + 0x17, 0x96, 0xd3, 0xce, 0x8b, 0x70, 0xde, 0xac, + 0xc4, 0x06, 0x04, 0xf4, 0x38, 0xe7, 0xbf, 0xa8, + 0xe6, 0xb2, 0x34, 0x5f, 0x0e, 0xd9, 0x43, 0x72, + 0xba, 0x84, 0x77, 0xf0, 0x41, 0x6f, 0x23, 0x16, + 0x8e, 0x36, 0x57, 0x6f, 0x2c, 0x8c, 0x7c, 0x9d, + 0xce, 0x72, 0x78, 0xce, 0x38, 0xe7, 0x8a, 0x3c, + 0x79, 0x32, 0x41, 0xa4, 0xdb, 0xe6, 0x75, 0x9a, + 0x73, 0x28, 0x93, 0x11, 0x92, 0x76, 0x20, 0xdc, + 0x32, 0xdd, 0x31, 0xc8, 0xe0, 0x7f, 0xf5, 0xab, + 0x1a, 0xb2, 0x75, 0xea, 0x2e, 0x57, 0xa1, 0xdd, + 0x82, 0x8c, 0x30, 0x78, 0x49, 0xba, 0x8a, 0xed, + 0xec, 0x76, 0x7a, 0x74, 0x56, 0xab, 0xa7, 0x2f, + 0xf6, 0x5d, 0xac, 0x16, 0x50, 0x3e, 0x18, 0xb4, + 0x4a, 0xd9, 0x90, 0x0c, 0x80, 0x49, 0x3d, 0x71, + 0xc8, 0x27, 0xd4, 0x64, 0xe7, 0xad, 0x6b, 0xcf, + 0x77, 0xf6, 0xa8, 0xac, 0xc4, 0x68, 0xc2, 0x5b, + 0x58, 0xc4, 0x6d, 0x2c, 0x8a, 0xac, 0xd9, 0x03, + 0x18, 0x56, 0xea, 0x17, 0x80, 0x48, 0xe3, 0x04, + 0x93, 0x5e, 0x7d, 0xe0, 0x5d, 0x6d, 0x16, 0x45, + 0x47, 0x8d, 0x1c, 0x3b, 0x02, 0xaa, 0x41, 0xf9, + 0x8f, 0x4d, 0xa7, 0x03, 0x27, 0x38, 0xc7, 0x50, + 0x39, 0x35, 0xe9, 0x91, 0x5a, 0x9b, 0x86, 0x12, + 0xd8, 0x23, 0x4f, 0x6d, 0x24, 0x4d, 0x2c, 0x4e, + 0xdf, 0x2a, 0xe0, 0x26, 0xec, 0x36, 0x3a, 0x11, + 0xd3, 0x19, 0x3c, 0x73, 0xd3, 0x9a, 0xf3, 0xea, + 0xaa, 0xb0, 0x9f, 0x2d, 0xf7, 0x3d, 0x6c, 0xbe, + 0xbe, 0x16, 0xb5, 0x14, 0xea, 0x45, 0x7b, 0xba, + 0xff, 0x00, 0x5e, 0x65, 0xa8, 0x2d, 0xa3, 0x9e, + 0x09, 0x27, 0xd4, 0xa5, 0xdf, 0x26, 0xd5, 0x74, + 0x06, 0xe1, 0x09, 0x6e, 0x09, 0xc3, 0x0c, 0xee, + 0x07, 0x03, 0xa7, 0x1d, 0x7f, 0x0a, 0x5b, 0xcb, + 0x38, 0x9a, 0xd9, 0x66, 0xb1, 0x74, 0x5b, 0x43, + 0x2a, 0x93, 0x19, 0x2a, 0xde, 0x53, 0x03, 0xc6, + 0x65, 0xc6, 0xff, 0x00, 0xbd, 0xb4, 0xed, 0x03, + 0x19, 0xc9, 0xcf, 0x52, 0x33, 0x61, 0x81, 0x3f, + 0xb3, 0x44, 0xf7, 0x7b, 0xe2, 0x9a, 0x58, 0x83, + 0x46, 0xbb, 0x7e, 0xec, 0x98, 0x39, 0x07, 0xb1, + 0x1f, 0x77, 0x07, 0x20, 0x60, 0xe4, 0x64, 0x82, + 0x2a, 0x3b, 0x5b, 0x85, 0x81, 0x59, 0xe5, 0xb7, + 0x82, 0x76, 0xc0, 0xcf, 0x98, 0x18, 0x84, 0x6e, + 0x99, 0xc0, 0x38, 0x23, 0xf3, 0xe7, 0x15, 0x0a, + 0x5e, 0xcd, 0xd9, 0xa3, 0xba, 0x54, 0xbe, 0xb5, + 0x1e, 0x78, 0xc9, 0xe9, 0xd2, 0xd6, 0x5f, 0x73, + 0xeb, 0xf9, 0x33, 0x8f, 0xf1, 0x85, 0xb4, 0xd2, + 0xea, 0xdb, 0xca, 0x23, 0x05, 0x7f, 0x98, 0x47, + 0x21, 0x6c, 0xf4, 0xe5, 0x58, 0xe4, 0xe7, 0xbf, + 0x7e, 0x4f, 0xe1, 0x5c, 0x07, 0x89, 0x33, 0x6d, + 0xac, 0x9b, 0xfb, 0x5c, 0x79, 0x4e, 0xdc, 0x80, + 0x7a, 0x7f, 0x2e, 0x0e, 0x33, 0xd0, 0x73, 0xda, + 0xbd, 0x86, 0xfa, 0xe2, 0xe2, 0x65, 0x95, 0x63, + 0x60, 0x88, 0xe3, 0xe6, 0x58, 0x14, 0x2a, 0xb6, + 0x00, 0xe0, 0x85, 0xff, 0x00, 0x0f, 0x7a, 0xe4, + 0x3c, 0x43, 0xe1, 0xf9, 0xad, 0xad, 0xbc, 0xcb, + 0xab, 0x59, 0xe3, 0xb2, 0x98, 0xe0, 0x97, 0x52, + 0x00, 0x63, 0x93, 0xd0, 0x90, 0x07, 0xae, 0x4e, + 0x79, 0x15, 0xdb, 0x86, 0xae, 0x93, 0xf5, 0x3c, + 0x9c, 0xd3, 0x02, 0xe5, 0x4d, 0x79, 0x6c, 0x54, + 0xf0, 0xd6, 0xa7, 0xbf, 0xca, 0x36, 0xec, 0x13, + 0x76, 0xd2, 0x4e, 0xde, 0x54, 0x82, 0x79, 0xcf, + 0x50, 0x36, 0xb3, 0x7a, 0x72, 0x33, 0xd8, 0x57, + 0x69, 0x79, 0x2e, 0x77, 0x06, 0xfe, 0xf1, 0x5d, + 0xa4, 0xe7, 0x63, 0x0e, 0xdd, 0x49, 0xc7, 0x3c, + 0x1f, 0x4e, 0x6b, 0xc7, 0xb4, 0xe9, 0x65, 0xd1, + 0x35, 0x71, 0x6f, 0x39, 0x22, 0x22, 0xdc, 0x31, + 0x18, 0xca, 0x9c, 0x8c, 0xfe, 0x3f, 0xe3, 0x5d, + 0xc6, 0x8b, 0x7b, 0x0c, 0xf0, 0x99, 0x26, 0x2c, + 0xdb, 0x1b, 0x0b, 0xb9, 0x58, 0x89, 0x72, 0x79, + 0xe4, 0x73, 0x80, 0xa5, 0x7b, 0xe0, 0xfe, 0x35, + 0xad, 0x6c, 0x2f, 0x34, 0xb9, 0x96, 0xc7, 0x9f, + 0x96, 0xe6, 0x4e, 0x87, 0xee, 0xe5, 0xb9, 0xd1, + 0xf8, 0x33, 0xc7, 0x13, 0x78, 0x4f, 0xc5, 0x9e, + 0x72, 0xca, 0x64, 0xb1, 0x62, 0xb1, 0xdc, 0x40, + 0x0e, 0x03, 0x00, 0x31, 0x90, 0x07, 0x19, 0xf7, + 0xc1, 0x23, 0xdf, 0x90, 0x7e, 0xa9, 0xb1, 0xbc, + 0x83, 0x53, 0xb0, 0x82, 0xff, 0x00, 0x4f, 0x94, + 0xcb, 0x6f, 0x3a, 0x07, 0x8d, 0x87, 0xbf, 0xaf, + 0xa7, 0xa7, 0xd7, 0x39, 0xaf, 0x87, 0x2f, 0x60, + 0x96, 0x3b, 0xeb, 0x81, 0x2d, 0xb2, 0xa4, 0x85, + 0xf7, 0x0c, 0x49, 0xb8, 0x14, 0x61, 0x90, 0xc0, + 0x8e, 0x31, 0xd7, 0xbf, 0xe7, 0x5f, 0x42, 0xfc, + 0x08, 0xb8, 0xd6, 0xa3, 0xf0, 0x74, 0xfe, 0x44, + 0xca, 0xd6, 0x69, 0x74, 0x22, 0x89, 0x1d, 0x41, + 0xdb, 0xbb, 0x1b, 0x88, 0x6f, 0x41, 0x90, 0x4f, + 0x5e, 0x38, 0x18, 0xeb, 0x5b, 0xc3, 0xf7, 0x71, + 0xb1, 0xe6, 0xe3, 0x6d, 0x5e, 0x6e, 0xb2, 0xea, + 0xcf, 0x6c, 0x85, 0x5d, 0x7e, 0x6c, 0x60, 0x0e, + 0x79, 0xed, 0xec, 0x7d, 0xbf, 0x95, 0x73, 0x9a, + 0xa6, 0xb7, 0xa9, 0xe9, 0xfa, 0xa5, 0xe7, 0x9f, + 0x75, 0xa3, 0x26, 0x98, 0xbb, 0x1a, 0x27, 0xf9, + 0xfc, 0xd4, 0xca, 0xf2, 0x1c, 0x12, 0x13, 0x39, + 0xe8, 0x77, 0x2f, 0x1f, 0xa7, 0x29, 0xe2, 0x9d, + 0x49, 0xb4, 0x19, 0xed, 0xf5, 0x0d, 0x57, 0x55, + 0x92, 0x6b, 0x50, 0xfb, 0x64, 0x48, 0x48, 0xca, + 0xe7, 0xd1, 0x4e, 0x48, 0xf5, 0xe0, 0x83, 0x51, + 0xcb, 0xe2, 0xbf, 0x0a, 0x6b, 0x3a, 0xb5, 0xb8, + 0xd1, 0x74, 0xa1, 0xad, 0xde, 0xd9, 0x47, 0x88, + 0xe7, 0xb8, 0x94, 0x43, 0x02, 0x99, 0x0e, 0x79, + 0xde, 0x4b, 0x33, 0xfc, 0xbc, 0x90, 0x8c, 0x47, + 0xa8, 0xa7, 0xed, 0x1b, 0xd8, 0xe4, 0xf6, 0x56, + 0xdc, 0xf4, 0x8f, 0x08, 0xeb, 0x69, 0xad, 0x5b, + 0x49, 0x2c, 0x13, 0xad, 0xcc, 0x6b, 0x8f, 0xde, + 0x46, 0x84, 0x26, 0x4f, 0x50, 0xac, 0x32, 0xad, + 0xd3, 0xb3, 0x1c, 0x7e, 0x35, 0xd0, 0xd6, 0x6e, + 0x82, 0xd7, 0xef, 0xa7, 0x46, 0xda, 0xa8, 0xb4, + 0x4b, 0x86, 0x24, 0x88, 0xed, 0x37, 0x14, 0x45, + 0xec, 0xbb, 0x8f, 0x2c, 0x7d, 0xf0, 0x3d, 0x31, + 0xc6, 0x4e, 0x95, 0x6b, 0x1d, 0x8c, 0xad, 0x60, + 0xa2, 0x8a, 0x2a, 0x80, 0x6b, 0x2e, 0x6a, 0x32, + 0xb8, 0xcd, 0x4d, 0x48, 0x45, 0x00, 0xc3, 0xa7, + 0x4a, 0x3b, 0x51, 0x49, 0x9a, 0x00, 0xf3, 0x8f, + 0x88, 0x5a, 0x4a, 0x89, 0x5a, 0x5d, 0x99, 0x8a, + 0x51, 0x87, 0x1f, 0x51, 0x82, 0x2b, 0xe7, 0x8f, + 0x1e, 0xfd, 0xaf, 0x4c, 0xd3, 0x9a, 0xc6, 0xde, + 0x69, 0x56, 0x38, 0xa4, 0xdc, 0x58, 0xb8, 0x4f, + 0x30, 0x0c, 0x95, 0x1b, 0x43, 0x64, 0x8e, 0x7a, + 0x91, 0xd7, 0x20, 0x62, 0xbe, 0xbb, 0xf1, 0x0d, + 0x90, 0xbe, 0xd3, 0xa4, 0x8c, 0x81, 0xb8, 0x0c, + 0x8f, 0xad, 0x78, 0x1f, 0x8e, 0x74, 0x96, 0xb9, + 0xd3, 0xe7, 0x8c, 0x96, 0x46, 0x41, 0xb5, 0xf0, + 0x70, 0x08, 0xcf, 0x52, 0x0b, 0x01, 0xc1, 0xe7, + 0x9c, 0x8c, 0x64, 0xfa, 0x63, 0x3a, 0xd0, 0x4d, + 0x73, 0xf6, 0xfc, 0x8e, 0x9c, 0x1d, 0x57, 0x19, + 0x3a, 0x0d, 0xe9, 0x2f, 0xcc, 0xf3, 0x0d, 0x26, + 0xfa, 0x2b, 0x9b, 0x88, 0xde, 0x77, 0x68, 0xa0, + 0xd4, 0x18, 0xbe, 0x7e, 0xf9, 0x49, 0x95, 0xbe, + 0x61, 0x83, 0xb9, 0x89, 0x3d, 0x4f, 0x00, 0x65, + 0xb8, 0xc8, 0x18, 0xac, 0xff, 0x00, 0x1d, 0x69, + 0x52, 0x42, 0xdf, 0x69, 0x04, 0x34, 0xf1, 0x31, + 0x32, 0x6e, 0x98, 0x48, 0x46, 0x3d, 0x48, 0x3d, + 0x7a, 0x71, 0x8e, 0x31, 0x8a, 0xa1, 0x68, 0xad, + 0x67, 0x7f, 0x36, 0x9f, 0x27, 0xca, 0xae, 0x77, + 0xc2, 0x46, 0x78, 0x6c, 0x80, 0x0f, 0x04, 0x02, + 0x7d, 0x32, 0xc4, 0x74, 0x27, 0x3d, 0x2b, 0xa9, + 0xb7, 0xb8, 0x8e, 0xea, 0xcd, 0x2e, 0xd8, 0xa8, + 0x0d, 0x9b, 0x6b, 0xa4, 0x89, 0x8e, 0x15, 0x80, + 0xc7, 0x55, 0xc2, 0xe0, 0xe3, 0x38, 0xdc, 0x72, + 0x46, 0x7a, 0x57, 0x9e, 0xff, 0x00, 0x75, 0x3e, + 0x65, 0xb3, 0x3d, 0x9c, 0x35, 0xeb, 0xd3, 0x78, + 0x69, 0xbd, 0x56, 0xc7, 0x3d, 0xe1, 0x7b, 0xd5, + 0x97, 0x75, 0xbc, 0x93, 0x08, 0xa1, 0x9c, 0x81, + 0x92, 0x40, 0xd9, 0x28, 0x19, 0x56, 0xe7, 0x9c, + 0x70, 0xdd, 0x01, 0xc0, 0xe3, 0xa9, 0x15, 0x3e, + 0xa9, 0x0c, 0x97, 0x0b, 0x73, 0x6f, 0x74, 0x8f, + 0x23, 0x12, 0x77, 0x09, 0x1b, 0x6e, 0x08, 0x04, + 0x72, 0x49, 0xc0, 0xe0, 0x75, 0x3e, 0x98, 0x15, + 0x83, 0x75, 0x11, 0xd1, 0xf5, 0x89, 0x20, 0x62, + 0x12, 0x09, 0x0e, 0x46, 0xc6, 0xe0, 0x60, 0xf1, + 0x82, 0xa7, 0xb1, 0xc1, 0x03, 0x3e, 0x82, 0xba, + 0xe8, 0x35, 0x69, 0xb5, 0x1d, 0x18, 0x46, 0x40, + 0x33, 0x5b, 0xb0, 0x59, 0x59, 0x0e, 0x30, 0x00, + 0x1b, 0x4e, 0x17, 0xe5, 0xef, 0xd4, 0xe4, 0xe7, + 0xea, 0x6a, 0xa7, 0xee, 0x4b, 0x9a, 0x3b, 0x06, + 0x12, 0x5c, 0xe9, 0xe1, 0xe6, 0xb5, 0x3c, 0xca, + 0xcc, 0xbe, 0x99, 0xa9, 0x35, 0xbc, 0x84, 0xed, + 0x07, 0x2a, 0x4f, 0x75, 0xf5, 0xff, 0x00, 0x3e, + 0xf5, 0xec, 0xff, 0x00, 0x0f, 0xf5, 0xcb, 0x29, + 0x75, 0xb9, 0x20, 0xd5, 0x0c, 0xa9, 0xa5, 0xf1, + 0xe6, 0xec, 0x2d, 0x9d, 0xac, 0x32, 0x00, 0x0b, + 0x81, 0x8c, 0xe4, 0xe3, 0x07, 0xa0, 0x15, 0xe7, + 0x1e, 0x2d, 0xd2, 0xfc, 0xe4, 0x4b, 0x88, 0x4a, + 0x87, 0x52, 0x31, 0x9c, 0x82, 0x49, 0x1d, 0xf9, + 0x24, 0xfd, 0x4e, 0x3a, 0x0f, 0x7a, 0x93, 0xc2, + 0x73, 0x1b, 0x5d, 0x5d, 0x1f, 0x50, 0x66, 0x00, + 0x83, 0x08, 0x08, 0xdb, 0x76, 0xb6, 0x31, 0x96, + 0xee, 0x40, 0xce, 0x31, 0xde, 0xb6, 0xa9, 0x4d, + 0x57, 0x87, 0xb4, 0x5b, 0xa3, 0x9a, 0x84, 0xde, + 0x0b, 0x11, 0xec, 0xa4, 0xec, 0x9b, 0xfb, 0x93, + 0x3d, 0xeb, 0x52, 0xbe, 0xd0, 0xad, 0x9f, 0x4d, + 0x1a, 0x73, 0x1b, 0x98, 0x1d, 0x5b, 0xcf, 0x49, + 0x41, 0x61, 0x1e, 0x4f, 0x18, 0x43, 0xc8, 0x6f, + 0x5e, 0xc4, 0x60, 0x67, 0xbd, 0x59, 0x6b, 0x88, + 0x61, 0x87, 0xca, 0xb6, 0xb5, 0xdf, 0x03, 0xa9, + 0x47, 0x56, 0xf2, 0xe1, 0x12, 0x86, 0x2a, 0x17, + 0x85, 0x25, 0xb1, 0xd3, 0xdb, 0x3d, 0x71, 0x5e, + 0x71, 0x19, 0x91, 0x8f, 0x03, 0xaf, 0xe3, 0xc7, + 0xe1, 0xc5, 0x6b, 0x47, 0xa9, 0xdf, 0x5a, 0xd9, + 0xa4, 0x2b, 0x72, 0xd0, 0x44, 0x80, 0xf0, 0x98, + 0x8c, 0x9c, 0x9c, 0xf2, 0x47, 0x27, 0xf9, 0x62, + 0xbc, 0xc5, 0x53, 0x56, 0x7d, 0x64, 0xf0, 0x5e, + 0xea, 0xe5, 0x77, 0xb7, 0x76, 0x75, 0x6b, 0x34, + 0x36, 0x96, 0xb1, 0xcc, 0x23, 0x4b, 0x44, 0x93, + 0xe6, 0x4f, 0xb3, 0xc0, 0x88, 0xd8, 0xdd, 0xc1, + 0x12, 0x3e, 0x72, 0x3f, 0x00, 0x7b, 0xfd, 0x38, + 0xbd, 0x49, 0x97, 0x53, 0x92, 0x45, 0x92, 0xe2, + 0x67, 0xb7, 0x6e, 0x56, 0x3b, 0x87, 0x2c, 0xc3, + 0xa9, 0xfb, 0xdd, 0x33, 0x9c, 0xfa, 0x72, 0x6a, + 0xf6, 0x91, 0xa2, 0x6a, 0x3a, 0x95, 0xc4, 0x4d, + 0x06, 0x9b, 0x77, 0x75, 0x19, 0x61, 0x92, 0x32, + 0xa0, 0x8f, 0x4d, 0xed, 0xf2, 0xfe, 0xa6, 0xbb, + 0xdd, 0x37, 0xe1, 0xfd, 0xf7, 0x98, 0xaf, 0x28, + 0xd3, 0xb4, 0xf1, 0x8c, 0x11, 0x8f, 0xb4, 0xc8, + 0x3f, 0x03, 0x85, 0xcf, 0xe2, 0x45, 0x69, 0xec, + 0xea, 0x54, 0x56, 0x8a, 0x39, 0x67, 0x8b, 0xc2, + 0xe1, 0x1b, 0x75, 0x24, 0x9b, 0x67, 0x85, 0x6a, + 0xde, 0x18, 0xb7, 0xb9, 0x9a, 0x25, 0x96, 0x2b, + 0xa5, 0x92, 0x36, 0x24, 0x4f, 0x1b, 0xa6, 0x1d, + 0x40, 0x03, 0xa9, 0x19, 0xcf, 0x4c, 0x9e, 0x7a, + 0x7d, 0x6a, 0xde, 0x89, 0xa4, 0xa6, 0x99, 0xa7, + 0x2d, 0xb5, 0x89, 0x91, 0x67, 0x92, 0x5d, 0xc9, + 0xe5, 0xbe, 0xf6, 0x63, 0x80, 0x31, 0x8c, 0x64, + 0xf4, 0x3c, 0x67, 0x1c, 0xd7, 0xd0, 0xf6, 0x7e, + 0x01, 0xf0, 0xfd, 0xa0, 0x47, 0xbe, 0xf3, 0xef, + 0x8a, 0xf4, 0xf3, 0xdf, 0x6a, 0x67, 0xfd, 0xd5, + 0xc1, 0xfd, 0x4d, 0x37, 0x50, 0xf1, 0xaf, 0x83, + 0x7c, 0x2d, 0x1b, 0xc7, 0x1d, 0xee, 0x9f, 0x68, + 0xeb, 0xd6, 0x3b, 0x35, 0x05, 0xf8, 0xf6, 0x5e, + 0x4f, 0xeb, 0x5d, 0x54, 0xa9, 0x57, 0xb5, 0xa7, + 0x23, 0xc7, 0xc4, 0x66, 0x58, 0x0b, 0xb7, 0x46, + 0x8d, 0xdb, 0xea, 0xdd, 0x8f, 0x1d, 0xd3, 0x7e, + 0x17, 0xf8, 0xa7, 0x54, 0xb3, 0x0f, 0x26, 0x9c, + 0x22, 0xea, 0xf0, 0xc9, 0x72, 0xcb, 0x12, 0xa0, + 0x27, 0x95, 0x65, 0xe0, 0x85, 0x24, 0x67, 0x81, + 0x90, 0x79, 0xe4, 0x70, 0x7d, 0x5b, 0xc2, 0x9f, + 0x0d, 0x35, 0x4b, 0x4d, 0x16, 0xd2, 0xca, 0x7f, + 0x14, 0x0b, 0x1b, 0x58, 0xd8, 0xbc, 0x90, 0x69, + 0xc8, 0xac, 0x59, 0xce, 0x41, 0x3e, 0x63, 0x8f, + 0xfd, 0x97, 0xde, 0xb8, 0xdd, 0x73, 0xe3, 0xcd, + 0x94, 0x7b, 0x97, 0x46, 0xd3, 0x6e, 0x6e, 0x9f, + 0x24, 0x09, 0x2e, 0x5c, 0x22, 0x9f, 0x70, 0x07, + 0x3f, 0xa0, 0xae, 0x07, 0x5b, 0xf8, 0xc5, 0xe2, + 0xfd, 0x4e, 0x1f, 0x26, 0x2b, 0xd8, 0xec, 0x21, + 0xc1, 0x18, 0xb4, 0x8c, 0x29, 0x23, 0xd3, 0x71, + 0xc9, 0x1f, 0x86, 0x0d, 0x75, 0xaa, 0x6d, 0x25, + 0x73, 0xc4, 0xab, 0x5f, 0xda, 0x49, 0xc9, 0x2b, + 0x5c, 0xfa, 0x3d, 0xbc, 0x2b, 0xe1, 0x3f, 0x0f, + 0x5a, 0xbc, 0xda, 0xac, 0xa2, 0xe8, 0x60, 0x87, + 0xb9, 0xd5, 0x2e, 0xb7, 0xf0, 0x7d, 0x03, 0x7c, + 0x80, 0xfd, 0x00, 0x35, 0xe6, 0xda, 0x76, 0xad, + 0x0f, 0xc3, 0xdf, 0x14, 0x5b, 0x5c, 0x68, 0x12, + 0x43, 0x3f, 0x82, 0x75, 0x6f, 0x91, 0xef, 0x20, + 0x0b, 0x27, 0x93, 0x2a, 0xb9, 0xc0, 0x62, 0x71, + 0xc7, 0x20, 0x1e, 0x7a, 0x74, 0xe4, 0x73, 0xf3, + 0xf6, 0xa3, 0xa8, 0x5e, 0x6a, 0x53, 0xf9, 0xda, + 0x85, 0xd4, 0xf7, 0x53, 0x76, 0x79, 0xa4, 0x67, + 0x23, 0xe8, 0x4d, 0x75, 0xdf, 0x0c, 0xfc, 0x5e, + 0x9a, 0x0d, 0xd4, 0xba, 0x6e, 0xac, 0x5d, 0xf4, + 0x1b, 0xe3, 0xb6, 0x70, 0x3a, 0xc0, 0xdd, 0x04, + 0xa9, 0xe9, 0x8e, 0xfe, 0xdf, 0x85, 0x57, 0xb3, + 0xb6, 0xc4, 0x46, 0xa3, 0xda, 0x5b, 0x33, 0xea, + 0x1f, 0x05, 0x7c, 0x47, 0xd3, 0xbc, 0x47, 0x3c, + 0xb8, 0x82, 0x5b, 0x18, 0x1d, 0xd5, 0x20, 0x7b, + 0xa6, 0x0a, 0x67, 0x72, 0x39, 0xda, 0x06, 0x40, + 0x1c, 0x63, 0xef, 0x1e, 0x6b, 0xbb, 0x6b, 0x98, + 0x12, 0x74, 0x81, 0xe6, 0x8d, 0x67, 0x70, 0x4a, + 0xc6, 0x58, 0x6e, 0x61, 0xea, 0x07, 0x53, 0x5f, + 0x2f, 0x78, 0xaa, 0x79, 0x34, 0x29, 0x80, 0xd4, + 0x2e, 0x0c, 0xf6, 0xbb, 0x1a, 0x78, 0x25, 0xdf, + 0xf2, 0xcc, 0x98, 0xdd, 0xb9, 0x48, 0xe0, 0xf1, + 0x93, 0x59, 0x3f, 0xb3, 0xbd, 0xc3, 0x6a, 0xbf, + 0x10, 0xb4, 0xe9, 0xb5, 0x19, 0x9d, 0xae, 0x21, + 0x8e, 0x49, 0x43, 0xc8, 0xc7, 0x2c, 0xcc, 0xb8, + 0xc6, 0x7a, 0xe7, 0xee, 0x8c, 0x74, 0xc6, 0x7f, + 0x19, 0xa3, 0x39, 0x4a, 0xfc, 0xca, 0xd6, 0x3a, + 0xf1, 0x98, 0x5a, 0x74, 0x94, 0x5d, 0x29, 0x73, + 0x36, 0x7d, 0x7d, 0x45, 0x14, 0x56, 0xc7, 0x9e, + 0x14, 0x51, 0x45, 0x00, 0x34, 0x9a, 0x66, 0x68, + 0x34, 0xc6, 0x34, 0x00, 0xe2, 0x41, 0x18, 0x38, + 0xc1, 0xf5, 0xaf, 0x34, 0xf1, 0xc6, 0x9a, 0x2d, + 0xef, 0x4c, 0xaa, 0xbf, 0xbb, 0x94, 0x1c, 0xfe, + 0x35, 0xe8, 0xf9, 0xac, 0x8f, 0x13, 0x58, 0x8b, + 0xed, 0x35, 0xc0, 0x1f, 0x38, 0xe4, 0x53, 0x4f, + 0xb9, 0x32, 0x57, 0x57, 0x5b, 0x9f, 0x23, 0x7c, + 0x46, 0xd1, 0x0d, 0xbc, 0xef, 0x3a, 0x3b, 0x19, + 0x91, 0xf7, 0xa1, 0x77, 0xc9, 0x6c, 0x9f, 0x76, + 0x2c, 0x49, 0x18, 0x24, 0x80, 0x06, 0x7d, 0x80, + 0x35, 0x99, 0xa1, 0x6a, 0x10, 0x18, 0xa0, 0x9a, + 0x76, 0x5f, 0x26, 0x74, 0x16, 0xd7, 0x2e, 0xcd, + 0xf7, 0x1c, 0x67, 0xcb, 0x61, 0x92, 0x49, 0xf9, + 0x46, 0x3e, 0x55, 0x00, 0x2a, 0xfa, 0x9a, 0xf5, + 0xef, 0x16, 0x69, 0xbf, 0x69, 0xb4, 0x90, 0x61, + 0x8b, 0x20, 0xda, 0xea, 0x09, 0xf9, 0x97, 0x3d, + 0xc0, 0x65, 0xcf, 0x3d, 0xb2, 0x07, 0x7a, 0xf1, + 0x48, 0x31, 0xa5, 0x6a, 0xd7, 0x96, 0x73, 0x95, + 0x36, 0x77, 0x63, 0x6b, 0x92, 0xc3, 0x00, 0x83, + 0xbb, 0x39, 0x53, 0xd7, 0xa7, 0x7e, 0xf8, 0xe7, + 0xad, 0x70, 0xd6, 0xa7, 0x64, 0xe2, 0xfa, 0x7e, + 0x47, 0xaf, 0x4e, 0xb3, 0x97, 0x2e, 0x22, 0x1b, + 0xec, 0xfd, 0x7f, 0xe0, 0x9a, 0x5e, 0x2b, 0xd3, + 0x67, 0xb9, 0xb4, 0x78, 0x2e, 0x03, 0x2d, 0xdd, + 0xa9, 0xe3, 0xcc, 0xc8, 0xc8, 0xec, 0x7e, 0x76, + 0x18, 0x18, 0x3d, 0x02, 0xe7, 0x1c, 0xd6, 0x1e, + 0x81, 0xa8, 0x34, 0x72, 0xc5, 0x2c, 0x85, 0x8a, + 0x44, 0x3c, 0xb9, 0x10, 0xe3, 0x26, 0x33, 0x9c, + 0xe3, 0x77, 0x0a, 0x72, 0x5b, 0x18, 0x53, 0x82, + 0xc4, 0xf6, 0x15, 0xd5, 0xe8, 0x97, 0x09, 0x75, + 0xa2, 0xa5, 0xde, 0x0b, 0x5f, 0x44, 0x42, 0xca, + 0xa8, 0xe5, 0x36, 0xae, 0x3a, 0x95, 0x03, 0x27, + 0xa1, 0xf9, 0xb7, 0x0e, 0x7d, 0x6b, 0x8d, 0xf1, + 0x26, 0x9d, 0x25, 0x9e, 0xa2, 0xee, 0xb0, 0xbb, + 0x5b, 0xdc, 0x61, 0xd4, 0xa9, 0x03, 0x00, 0xe0, + 0xe4, 0xe4, 0xe5, 0x47, 0x42, 0x09, 0x3d, 0x79, + 0xc7, 0x38, 0xac, 0xe9, 0xfb, 0xcb, 0xd9, 0xc8, + 0xec, 0xc5, 0x46, 0xdc, 0xb8, 0xaa, 0x5d, 0x7f, + 0x33, 0x6f, 0x5f, 0x82, 0x7d, 0x52, 0xc7, 0xec, + 0x3a, 0x4a, 0xcb, 0x77, 0x78, 0xf2, 0xa4, 0x90, + 0xa5, 0xba, 0x96, 0xf3, 0x54, 0x03, 0x92, 0x07, + 0x04, 0xf0, 0x73, 0x9c, 0x7a, 0xfd, 0x6b, 0x63, + 0x44, 0xf8, 0x57, 0xe2, 0x6b, 0xe4, 0x22, 0xf6, + 0x3b, 0x7b, 0x14, 0x76, 0x04, 0x2d, 0xc4, 0xa0, + 0xb0, 0x50, 0x31, 0xf7, 0x63, 0xc9, 0x1e, 0xc0, + 0xe0, 0xe3, 0x8a, 0xe7, 0x34, 0xfd, 0x75, 0xec, + 0x65, 0xb0, 0xd4, 0x2c, 0x15, 0x7c, 0xfb, 0x29, + 0x04, 0x91, 0xf9, 0x68, 0xc1, 0x4a, 0x9c, 0x86, + 0x56, 0x63, 0x92, 0x46, 0x09, 0x00, 0xfa, 0x0c, + 0xf2, 0x4e, 0x6b, 0xda, 0xf5, 0xff, 0x00, 0x88, + 0x17, 0x56, 0x9e, 0x0d, 0xb5, 0xd7, 0x34, 0x1b, + 0x58, 0x2e, 0x62, 0x76, 0x11, 0x5c, 0x3b, 0x92, + 0x3c, 0x96, 0x3f, 0x74, 0x94, 0x1c, 0x10, 0x71, + 0x83, 0xe8, 0x7a, 0x70, 0x41, 0xae, 0x9a, 0x30, + 0x74, 0xe3, 0xca, 0x8f, 0x37, 0x30, 0xc4, 0x7d, + 0x66, 0xa2, 0xab, 0xe4, 0x74, 0x5a, 0x7f, 0xc3, + 0x9d, 0x26, 0x12, 0x7e, 0xdb, 0x77, 0x75, 0x70, + 0x41, 0x04, 0x46, 0xb8, 0x8c, 0x01, 0xd8, 0x1e, + 0xe7, 0xf4, 0xcd, 0x5d, 0x95, 0xbc, 0x2d, 0xe1, + 0xa2, 0x27, 0x94, 0x69, 0xf6, 0xaa, 0xa3, 0x6a, + 0xf9, 0xe4, 0x6e, 0xcf, 0x3d, 0x0b, 0x65, 0x81, + 0xf5, 0x18, 0xaf, 0x9d, 0x35, 0xaf, 0x88, 0xde, + 0x27, 0xd5, 0x81, 0x8e, 0x4d, 0x49, 0xed, 0xe1, + 0x3d, 0x62, 0xb6, 0x02, 0x31, 0xf9, 0x8e, 0x6b, + 0x94, 0x9e, 0x69, 0x2e, 0x25, 0x32, 0xcf, 0x23, + 0xc9, 0x21, 0xea, 0xce, 0xdb, 0x89, 0xfc, 0x7a, + 0xd1, 0x1c, 0x3c, 0x23, 0xb2, 0x22, 0xb6, 0x3f, + 0x11, 0x5d, 0x5a, 0xa4, 0xdb, 0x5f, 0x87, 0xdc, + 0x7d, 0x1d, 0xac, 0xfc, 0x65, 0xd0, 0x6c, 0x91, + 0xa2, 0xb6, 0x6b, 0xad, 0x46, 0x60, 0x47, 0xcd, + 0x12, 0xec, 0x40, 0x57, 0x3c, 0x83, 0xe9, 0x8e, + 0xbd, 0xbe, 0x99, 0xae, 0x1f, 0x5a, 0xf8, 0xe3, + 0xaf, 0x5d, 0xee, 0x5d, 0x36, 0xd6, 0xd6, 0xca, + 0x32, 0x3a, 0x9c, 0xc8, 0xdf, 0x5c, 0x9e, 0x07, + 0xd3, 0x06, 0xbc, 0x9a, 0x8a, 0xd9, 0x45, 0x23, + 0x92, 0xe6, 0xd6, 0xb1, 0xe2, 0xad, 0x77, 0x59, + 0x66, 0x3a, 0x9e, 0xab, 0x77, 0x38, 0x6e, 0xa9, + 0xe6, 0x6d, 0x5f, 0xfb, 0xe4, 0x71, 0x8f, 0xc2, + 0xb1, 0x30, 0x07, 0x03, 0xa5, 0x2d, 0x15, 0x42, + 0x0a, 0x28, 0xa2, 0x80, 0x0a, 0x28, 0xa2, 0x80, + 0x3d, 0x37, 0xe1, 0xd6, 0xb1, 0xa7, 0x6b, 0xf6, + 0x50, 0xf8, 0x43, 0xc5, 0x60, 0x3c, 0x21, 0xcb, + 0x69, 0x97, 0x2c, 0xe5, 0x4c, 0x2e, 0x7a, 0xc4, + 0x58, 0x73, 0xb5, 0xb3, 0xf8, 0x1e, 0x3d, 0x31, + 0xd8, 0xc3, 0x60, 0xbe, 0x1e, 0x9f, 0xec, 0xf6, + 0x16, 0x76, 0xb6, 0x37, 0x03, 0xef, 0xa7, 0xca, + 0xcc, 0x0a, 0xf0, 0x1b, 0x27, 0xab, 0x00, 0x7a, + 0xe0, 0x1c, 0x1c, 0xf4, 0xe6, 0xbc, 0x04, 0x12, + 0x08, 0x20, 0x9c, 0x8e, 0x9e, 0xd5, 0xef, 0x7f, + 0x0f, 0x7c, 0x4e, 0x3c, 0x67, 0xa2, 0x49, 0xa6, + 0xde, 0x38, 0x1e, 0x25, 0xb5, 0x8b, 0x09, 0x26, + 0x70, 0xd7, 0x90, 0xa8, 0xe9, 0xee, 0xe3, 0x24, + 0x1c, 0xe4, 0x11, 0xc9, 0xcf, 0x6c, 0x2b, 0xd3, + 0x73, 0x5a, 0x33, 0xd1, 0xcb, 0xb1, 0x31, 0xa1, + 0x52, 0xd3, 0x49, 0xa7, 0xd5, 0xf4, 0xff, 0x00, + 0x80, 0x7b, 0x5f, 0xc3, 0xbf, 0x16, 0xc5, 0xe2, + 0x0b, 0x01, 0x0d, 0xc4, 0xb1, 0xb5, 0xfc, 0x23, + 0x0c, 0x55, 0x81, 0x12, 0x8f, 0xef, 0x29, 0x1d, + 0x6b, 0xb4, 0xaf, 0x93, 0x3c, 0x35, 0xab, 0x4f, + 0xe1, 0x8d, 0x46, 0x04, 0xbc, 0xb7, 0x6b, 0x29, + 0x63, 0x69, 0x19, 0x26, 0x8b, 0xe5, 0x59, 0xb0, + 0x7a, 0x81, 0xdb, 0x92, 0x37, 0x0e, 0xdc, 0xe3, + 0x23, 0x15, 0xf4, 0x9f, 0x84, 0x3c, 0x47, 0x6d, + 0xe2, 0x4d, 0x2d, 0x2e, 0x60, 0x65, 0x13, 0x28, + 0x02, 0x54, 0x07, 0x3b, 0x4f, 0xf8, 0x1e, 0xd4, + 0xe9, 0xca, 0xd6, 0x8b, 0x77, 0xec, 0xfb, 0x99, + 0xe2, 0xa8, 0xde, 0xf5, 0x61, 0x1b, 0x77, 0x5d, + 0x9f, 0xf9, 0x3e, 0x9f, 0x71, 0xd0, 0x51, 0x45, + 0x15, 0xb1, 0xc4, 0x44, 0xdd, 0xea, 0x26, 0xe9, + 0x52, 0xb7, 0x5a, 0x8c, 0xd0, 0x03, 0x0d, 0x21, + 0x01, 0x81, 0x52, 0x38, 0x3d, 0x69, 0x48, 0xe6, + 0x8c, 0x73, 0x40, 0x1e, 0x65, 0xe2, 0xfd, 0x3b, + 0xec, 0x9a, 0x81, 0x70, 0xa3, 0xcb, 0x7e, 0x71, + 0x8c, 0x8f, 0x70, 0x6b, 0xc7, 0xbc, 0x4f, 0xe1, + 0x04, 0xd4, 0x6f, 0x4d, 0xb5, 0xbc, 0x53, 0xbb, + 0x28, 0xf3, 0x55, 0x63, 0x90, 0xe7, 0xca, 0x1c, + 0xe0, 0x0e, 0x38, 0x1c, 0x8c, 0x67, 0x71, 0xed, + 0x5f, 0x4a, 0x78, 0xb3, 0x4e, 0x17, 0x9a, 0x6b, + 0x32, 0x8f, 0x9d, 0x39, 0x15, 0xe4, 0xf7, 0x64, + 0xd9, 0xdc, 0x41, 0x7c, 0x2d, 0xa2, 0xb9, 0x92, + 0xc9, 0xcc, 0x86, 0x19, 0x14, 0x11, 0x22, 0x10, + 0x43, 0x21, 0xfc, 0x3a, 0x7a, 0x11, 0x59, 0x62, + 0x62, 0xe5, 0x0e, 0x68, 0x3b, 0x34, 0x75, 0x65, + 0xf5, 0xa3, 0x4a, 0xab, 0xa7, 0x51, 0x5e, 0x32, + 0xfc, 0xfa, 0x7f, 0x91, 0xc2, 0x58, 0x78, 0x5c, + 0x78, 0x76, 0x0b, 0xd8, 0xac, 0x5d, 0x52, 0x00, + 0xea, 0x65, 0xf2, 0xd1, 0xe7, 0x92, 0x55, 0xc7, + 0x49, 0x00, 0x3b, 0x4f, 0x2c, 0x78, 0x38, 0x1c, + 0xfd, 0x2b, 0x95, 0xd6, 0xe1, 0x9a, 0xe6, 0xce, + 0xe6, 0xd9, 0x95, 0xe3, 0xb9, 0x93, 0x26, 0x48, + 0xfc, 0x90, 0x18, 0x83, 0xd0, 0xaa, 0x2a, 0xfc, + 0x83, 0x1b, 0x7f, 0x88, 0x0c, 0xfb, 0x57, 0x53, + 0xe3, 0x5f, 0x12, 0x6a, 0xba, 0x76, 0x9b, 0x74, + 0xb0, 0x2a, 0x7d, 0x96, 0xfa, 0x44, 0xfb, 0x4c, + 0x44, 0xff, 0x00, 0xab, 0x2a, 0x4f, 0x96, 0xc3, + 0x6e, 0x08, 0x38, 0xc6, 0xe2, 0x70, 0x71, 0x8a, + 0xf2, 0x68, 0xf5, 0xb1, 0x25, 0xe7, 0xef, 0xae, + 0x23, 0x79, 0x4b, 0xe0, 0xae, 0xdd, 0xd9, 0x6c, + 0xf5, 0xf7, 0x19, 0xed, 0x93, 0xfd, 0x6b, 0x9a, + 0x95, 0x29, 0xb5, 0xed, 0x1b, 0xb9, 0xeb, 0xd5, + 0xc5, 0x52, 0xa7, 0x7c, 0x3d, 0xad, 0xe9, 0xb6, + 0xa6, 0x76, 0x9a, 0xe6, 0x3b, 0xb6, 0xb5, 0xb8, + 0x2a, 0x1b, 0x24, 0xa9, 0xda, 0x18, 0x06, 0xf5, + 0xc1, 0xe3, 0x07, 0x8f, 0xc2, 0xbd, 0x0f, 0xe1, + 0xde, 0xbf, 0x6f, 0x63, 0x7d, 0x36, 0x91, 0xab, + 0x05, 0x93, 0x47, 0xd5, 0x01, 0x86, 0x61, 0xbd, + 0x5b, 0xcb, 0x2d, 0xd0, 0xe4, 0x70, 0x0f, 0x7f, + 0x6c, 0x0a, 0xe1, 0x7c, 0x49, 0x68, 0x25, 0x8c, + 0xdd, 0xc0, 0x18, 0xb4, 0x63, 0x2f, 0xd4, 0xed, + 0x07, 0xd7, 0x00, 0x00, 0x46, 0x7d, 0xfa, 0xfb, + 0x72, 0xfb, 0x5b, 0x9f, 0xed, 0x2b, 0x3e, 0xb2, + 0xb6, 0xc3, 0xb5, 0xc0, 0x04, 0xec, 0x20, 0x0e, + 0x46, 0x38, 0x50, 0x4f, 0x1f, 0x81, 0x27, 0xdf, + 0xb5, 0x35, 0x35, 0x73, 0xc5, 0xad, 0x4d, 0xd2, + 0x9b, 0x8b, 0x35, 0x3c, 0x57, 0xa1, 0xcf, 0xe1, + 0xdd, 0x72, 0xe3, 0x4f, 0xb8, 0x3b, 0xc2, 0x1d, + 0xd1, 0x49, 0x8c, 0x09, 0x23, 0x3c, 0xab, 0x0f, + 0x6c, 0x7e, 0xbc, 0x76, 0xac, 0x9a, 0xf4, 0x8c, + 0x1f, 0x1c, 0x78, 0x21, 0xe2, 0x20, 0xbf, 0x88, + 0xf4, 0x15, 0x20, 0xe7, 0x1b, 0xa7, 0x84, 0x72, + 0x47, 0xb9, 0xe0, 0x9f, 0xa8, 0x38, 0xeb, 0x5e, + 0x6f, 0x4d, 0x18, 0x05, 0x14, 0x51, 0x40, 0x05, + 0x14, 0x51, 0x40, 0x05, 0x14, 0x0e, 0x4f, 0x19, + 0xe3, 0xad, 0x74, 0x5a, 0x6f, 0x82, 0xbc, 0x41, + 0xa8, 0x35, 0xf2, 0x43, 0xa6, 0xdc, 0x2c, 0xb6, + 0x61, 0x7c, 0xd8, 0x9e, 0x36, 0x12, 0x65, 0xc1, + 0x64, 0x1b, 0x00, 0xdd, 0xc8, 0x53, 0xce, 0x00, + 0xf5, 0x3d, 0x32, 0x01, 0xce, 0xd1, 0x4e, 0x96, + 0x37, 0x8a, 0x57, 0x8e, 0x54, 0x64, 0x91, 0x09, + 0x56, 0x56, 0x18, 0x2a, 0x47, 0x63, 0x9e, 0x41, + 0xc8, 0xe9, 0x4d, 0xee, 0x00, 0xea, 0x78, 0x14, + 0x00, 0x55, 0x9d, 0x36, 0xfa, 0xeb, 0x4c, 0xbf, + 0x82, 0xf6, 0xc2, 0x67, 0x82, 0xea, 0x06, 0x0f, + 0x1c, 0x88, 0x79, 0x56, 0x1d, 0xff, 0x00, 0xcf, + 0x04, 0x70, 0x78, 0xad, 0x3b, 0x0f, 0x09, 0x6b, + 0xd7, 0xce, 0x04, 0x1a, 0x5d, 0xde, 0x00, 0x56, + 0x66, 0x68, 0x98, 0x6d, 0x46, 0xe3, 0x71, 0x1d, + 0x76, 0xf7, 0xcf, 0x20, 0x0e, 0xb5, 0xb3, 0x6d, + 0xe0, 0xfb, 0x2b, 0x79, 0x23, 0xfe, 0xd5, 0xd4, + 0xcb, 0x2b, 0x48, 0xf6, 0xa5, 0x6d, 0xe2, 0x90, + 0x79, 0x77, 0x2a, 0x46, 0x22, 0x90, 0xec, 0x66, + 0x04, 0xae, 0xe6, 0x18, 0x42, 0x1b, 0x18, 0x1f, + 0xc4, 0x54, 0x03, 0xd4, 0xa0, 0xbc, 0xd3, 0xfe, + 0x23, 0x78, 0x6d, 0x75, 0x84, 0xb6, 0x56, 0xd5, + 0x6c, 0x8a, 0xad, 0xdd, 0xae, 0xec, 0x2c, 0x4d, + 0xcf, 0xef, 0x15, 0x4f, 0x55, 0x3f, 0x90, 0xe7, + 0xd2, 0xb6, 0xf4, 0x8d, 0x46, 0xfb, 0xc2, 0xbf, + 0x66, 0x91, 0x22, 0xb3, 0x0e, 0x9f, 0xba, 0x99, + 0x51, 0xb2, 0xe5, 0x47, 0x21, 0x5b, 0x1f, 0x28, + 0x18, 0xe8, 0x46, 0x78, 0x03, 0xbd, 0x78, 0x4e, + 0x99, 0xa8, 0x6a, 0x3f, 0x0e, 0xfc, 0x60, 0x93, + 0x5a, 0xcf, 0x14, 0xcf, 0x1a, 0x8f, 0x31, 0x17, + 0x70, 0x49, 0xe3, 0x70, 0x09, 0x47, 0x56, 0x01, + 0x81, 0xc7, 0x50, 0x40, 0x20, 0xf3, 0x5f, 0x40, + 0xe9, 0x07, 0x48, 0xd5, 0xe0, 0xb2, 0xd6, 0x2d, + 0xe6, 0x3f, 0xf0, 0x8e, 0xdd, 0xa3, 0x24, 0x88, + 0xa8, 0x4b, 0xc6, 0xf8, 0xff, 0x00, 0x56, 0xe0, + 0x76, 0x56, 0xef, 0xc6, 0x07, 0x43, 0xd2, 0xb8, + 0xab, 0xd2, 0x69, 0xf3, 0xc1, 0x9e, 0xd6, 0x03, + 0x19, 0x17, 0x1f, 0x63, 0x59, 0x5d, 0x7e, 0x2d, + 0x76, 0xff, 0x00, 0x23, 0xd7, 0x74, 0x6d, 0x4e, + 0xdf, 0x57, 0xd3, 0xe2, 0xbc, 0xb3, 0x6d, 0xd1, + 0x48, 0x3a, 0x1e, 0xaa, 0x7b, 0x82, 0x3d, 0x6b, + 0x42, 0xb8, 0x3f, 0x05, 0xe8, 0xf3, 0x69, 0x52, + 0x79, 0xda, 0x6d, 0xd4, 0x37, 0x9a, 0x74, 0xeb, + 0xbf, 0x7c, 0x4f, 0xf2, 0x3f, 0x3c, 0x6d, 0x19, + 0x24, 0x1c, 0x7f, 0x2e, 0xbe, 0x9d, 0xcc, 0x6e, + 0xb2, 0x20, 0x65, 0x39, 0x06, 0xba, 0x69, 0x49, + 0xca, 0x3e, 0xf2, 0xb3, 0x3c, 0xcc, 0x44, 0x21, + 0x09, 0xbf, 0x64, 0xef, 0x11, 0x08, 0xa6, 0x11, + 0x53, 0x11, 0x93, 0x4d, 0xc5, 0x68, 0x60, 0x44, + 0x45, 0x20, 0x15, 0x2e, 0x07, 0x6a, 0x4c, 0x0e, + 0xf4, 0x00, 0xc6, 0x40, 0xca, 0x55, 0xba, 0x1e, + 0x0d, 0x79, 0x67, 0x8b, 0x34, 0xd3, 0x63, 0xa8, + 0xb9, 0x0b, 0xfb, 0xb7, 0xe4, 0x71, 0x5e, 0xb0, + 0x05, 0x73, 0xde, 0x32, 0xd3, 0x45, 0xe6, 0x9c, + 0xce, 0x8b, 0xf3, 0xc6, 0x33, 0x55, 0x17, 0x66, + 0x45, 0x45, 0x74, 0x7c, 0x8f, 0xf1, 0x6a, 0xca, + 0x7b, 0x2b, 0x0b, 0xcb, 0x2b, 0x74, 0x67, 0x8a, + 0xe5, 0x84, 0x91, 0x2a, 0x83, 0x9e, 0x5d, 0x0e, + 0x07, 0x1f, 0xde, 0x1f, 0x86, 0x7b, 0xe7, 0x8f, + 0x2a, 0xd2, 0x34, 0x6b, 0x98, 0x75, 0x28, 0x26, + 0xbd, 0x43, 0x6d, 0x04, 0x2e, 0x1d, 0xcc, 0x8d, + 0xb1, 0x80, 0x07, 0x3d, 0x0f, 0xcd, 0x9e, 0x31, + 0xd2, 0xbe, 0xa8, 0xf1, 0x2d, 0x94, 0xf7, 0x16, + 0x0c, 0xd6, 0x84, 0xad, 0xf5, 0xb9, 0x12, 0xc0, + 0x47, 0x76, 0x53, 0xf7, 0x4f, 0xa8, 0x38, 0xfa, + 0x66, 0xbc, 0x37, 0xe2, 0x35, 0xcd, 0xa4, 0x11, + 0x5a, 0x6a, 0x16, 0xb6, 0x8b, 0x0b, 0x5c, 0x16, + 0x53, 0x6e, 0x0f, 0x0a, 0x08, 0xdd, 0x8e, 0x99, + 0xe0, 0xb7, 0x1f, 0xe1, 0xd7, 0x28, 0xde, 0x12, + 0xf6, 0x76, 0xd0, 0xee, 0x94, 0x95, 0x6a, 0x4b, + 0x10, 0xdd, 0xe5, 0x7b, 0x35, 0xfa, 0xfc, 0xff, + 0x00, 0xcc, 0xc5, 0xbb, 0x67, 0x49, 0x24, 0x55, + 0xdc, 0xd0, 0xbb, 0xb2, 0x6c, 0x90, 0x13, 0xc8, + 0xc0, 0xce, 0xdc, 0x81, 0xdf, 0xaf, 0x3d, 0x2b, + 0x9f, 0xb0, 0x99, 0xb4, 0xcd, 0x47, 0x63, 0x00, + 0xd6, 0xee, 0x76, 0xb8, 0xe1, 0xb8, 0xfe, 0xf0, + 0xea, 0x32, 0x3a, 0xfa, 0x64, 0x7a, 0x55, 0xdd, + 0x22, 0xe6, 0xe7, 0x52, 0xd4, 0x5a, 0x26, 0x40, + 0xb1, 0x88, 0x99, 0xe4, 0x55, 0x1f, 0x78, 0x28, + 0x3c, 0x92, 0x7b, 0xf3, 0xd7, 0xa9, 0x3e, 0xe7, + 0x97, 0xeb, 0x02, 0x2b, 0x8b, 0x79, 0x09, 0x03, + 0xed, 0x08, 0x77, 0x75, 0xea, 0x3b, 0x80, 0xa1, + 0x70, 0x07, 0x7e, 0x7b, 0x8c, 0x0a, 0x6b, 0xdd, + 0x97, 0x29, 0x73, 0xbd, 0x7a, 0x5e, 0xd2, 0x5b, + 0xa3, 0xa8, 0xd1, 0x75, 0xeb, 0x8f, 0x0f, 0xeb, + 0xb6, 0xba, 0xc5, 0xaa, 0x10, 0xd0, 0x90, 0x26, + 0x8d, 0x5c, 0x36, 0xe8, 0xf8, 0xcf, 0x03, 0x85, + 0x1c, 0x64, 0x0c, 0x67, 0x3e, 0xbd, 0x4e, 0xbf, + 0xc4, 0xbd, 0x0a, 0xde, 0xc6, 0xfe, 0x0d, 0x63, + 0x48, 0x0a, 0xda, 0x36, 0xa8, 0xbe, 0x74, 0x26, + 0x3f, 0xbb, 0x1b, 0x90, 0x0b, 0x47, 0xc7, 0x6e, + 0xe3, 0xa7, 0x07, 0x1d, 0x8d, 0x70, 0x7a, 0x3e, + 0xa0, 0x2e, 0xac, 0x84, 0x52, 0xb8, 0x0f, 0x10, + 0x19, 0xde, 0x49, 0x0c, 0xa1, 0xb2, 0x38, 0xc7, + 0x5c, 0xe4, 0xff, 0x00, 0xf5, 0xab, 0xd2, 0x3e, + 0x1d, 0x5d, 0x5b, 0xea, 0x76, 0x37, 0xfe, 0x04, + 0xd6, 0x26, 0x22, 0x39, 0xbf, 0x7b, 0x61, 0x24, + 0x83, 0x06, 0x19, 0x47, 0x38, 0xc1, 0xe4, 0x72, + 0x73, 0x8e, 0xbb, 0x49, 0xe9, 0x54, 0xd5, 0xb5, + 0x38, 0x4e, 0x12, 0xcd, 0x21, 0x92, 0xee, 0x14, + 0xbb, 0x95, 0xa1, 0xb7, 0x67, 0x51, 0x2c, 0x8a, + 0x9b, 0xca, 0x29, 0x38, 0x2c, 0x17, 0x23, 0x3c, + 0x67, 0x8c, 0x8c, 0xf4, 0xe2, 0xbd, 0xcf, 0x5f, + 0xf8, 0x27, 0xa7, 0x69, 0xd2, 0x68, 0xd7, 0x5a, + 0x7e, 0xad, 0xf6, 0xcd, 0x27, 0x50, 0x51, 0x00, + 0x9e, 0x59, 0xd6, 0x22, 0xd3, 0xc9, 0xfe, 0xa5, + 0x90, 0x85, 0x21, 0x91, 0x89, 0x5e, 0x06, 0x4f, + 0x5e, 0x7d, 0x3c, 0x82, 0xd2, 0x1b, 0x7d, 0x0b, + 0xc4, 0x8d, 0x6f, 0xe2, 0x6d, 0x32, 0x4b, 0xb8, + 0x6d, 0x64, 0x31, 0xdc, 0x5a, 0xa4, 0xfe, 0x4b, + 0x31, 0x07, 0x1f, 0x78, 0x02, 0x71, 0xf4, 0xed, + 0xf9, 0xd7, 0xd0, 0xf2, 0x7c, 0x52, 0xf8, 0x70, + 0x3c, 0x0f, 0xa7, 0x69, 0x70, 0xc1, 0x73, 0x1d, + 0xb9, 0xcc, 0x49, 0x6b, 0xe4, 0x19, 0x64, 0xb0, + 0x6c, 0x1c, 0x48, 0x4b, 0x1e, 0x76, 0xe7, 0x20, + 0x82, 0x4f, 0xe2, 0x08, 0xa0, 0x0f, 0x2f, 0xd5, + 0x3e, 0x14, 0x5c, 0x5b, 0xf8, 0x42, 0x1f, 0x10, + 0x68, 0x77, 0x4d, 0xad, 0xad, 0xb4, 0x8e, 0x9a, + 0x9d, 0xa7, 0x92, 0x60, 0x7b, 0x66, 0x4f, 0xbe, + 0x98, 0xce, 0x5b, 0x6e, 0x0a, 0xb1, 0x1c, 0xf4, + 0x20, 0x11, 0x92, 0x19, 0xe1, 0xcb, 0xbf, 0x0e, + 0xea, 0x7a, 0x3c, 0x13, 0x5e, 0xe9, 0x5a, 0x6d, + 0xa4, 0x36, 0x33, 0x79, 0x77, 0xd0, 0x20, 0x3b, + 0x9a, 0x39, 0x38, 0x8e, 0xe5, 0x19, 0xce, 0xf7, + 0x31, 0xb7, 0xde, 0x8c, 0xb1, 0x56, 0x04, 0x1c, + 0x0e, 0x71, 0xeb, 0xd7, 0xda, 0xff, 0x00, 0x8b, + 0xf4, 0xdf, 0x86, 0x3e, 0x21, 0xd7, 0xac, 0xef, + 0xb4, 0x4d, 0x4a, 0x29, 0xd8, 0x49, 0x6a, 0x74, + 0xb4, 0x79, 0x16, 0xd8, 0x3b, 0x13, 0x2b, 0x9d, + 0xdc, 0x9c, 0x67, 0x76, 0xd2, 0x3e, 0x52, 0x4e, + 0x78, 0x18, 0x1f, 0x33, 0x78, 0x7f, 0x57, 0x9f, + 0x43, 0xd6, 0xad, 0x75, 0x2b, 0x75, 0x49, 0x24, + 0x85, 0xf2, 0x63, 0x91, 0x41, 0x59, 0x14, 0xf0, + 0xc8, 0x47, 0xa1, 0x19, 0x1e, 0xa3, 0xaf, 0x04, + 0x03, 0x40, 0x1d, 0xcc, 0xda, 0x9e, 0x95, 0x6c, + 0xba, 0x96, 0x8f, 0x2c, 0x36, 0xda, 0x94, 0x37, + 0x72, 0x24, 0x11, 0x45, 0xa5, 0xa8, 0x13, 0x22, + 0x99, 0x10, 0xb1, 0x59, 0x52, 0x35, 0x56, 0xdc, + 0xc8, 0xac, 0x13, 0x0e, 0x01, 0xe0, 0x63, 0x93, + 0x57, 0x6e, 0x75, 0x6d, 0x6f, 0x54, 0xb6, 0xbb, + 0xb8, 0x96, 0xdb, 0x4d, 0xb6, 0xb4, 0xb1, 0x85, + 0x76, 0xbe, 0xa0, 0x44, 0xd7, 0x51, 0xa8, 0xc0, + 0x76, 0x0a, 0x83, 0x79, 0x56, 0x66, 0x04, 0xee, + 0x52, 0x81, 0x8f, 0x51, 0xc9, 0xa8, 0xee, 0x7c, + 0x59, 0xa0, 0x68, 0x6b, 0x6e, 0xba, 0x4d, 0x9d, + 0x9d, 0xe5, 0xb8, 0x5c, 0xc7, 0xe5, 0x86, 0x82, + 0xe9, 0x22, 0x7f, 0x9d, 0x55, 0xe5, 0x4f, 0x94, + 0xcb, 0x1b, 0x71, 0x96, 0x0d, 0xca, 0xa3, 0x0c, + 0x10, 0x49, 0xe6, 0x6e, 0xbc, 0x6f, 0x75, 0xba, + 0xd6, 0x4b, 0x2b, 0x78, 0x62, 0xb9, 0x80, 0xbf, + 0xef, 0xe4, 0x8e, 0x22, 0x64, 0x56, 0x42, 0x8c, + 0x85, 0x55, 0x15, 0x76, 0x10, 0x49, 0x28, 0x77, + 0x0c, 0xfa, 0x8c, 0xe4, 0x03, 0xa6, 0xd5, 0x3c, + 0x0b, 0x2d, 0xfd, 0xc5, 0xf5, 0xf5, 0xd6, 0xa8, + 0x75, 0x4d, 0x4a, 0xe1, 0x5a, 0xe9, 0x67, 0x0a, + 0x91, 0xc0, 0xc0, 0x05, 0x70, 0xef, 0xb4, 0x92, + 0x22, 0x90, 0x16, 0x55, 0x73, 0xe5, 0xe1, 0x97, + 0x04, 0x63, 0x90, 0x96, 0xfa, 0xd7, 0x86, 0x74, + 0x14, 0x49, 0xc6, 0x99, 0x6f, 0x0e, 0xa0, 0x96, + 0xae, 0xab, 0x14, 0x52, 0x19, 0x7c, 0xc1, 0x20, + 0x27, 0xcb, 0x97, 0xa8, 0xca, 0xe1, 0x97, 0x78, + 0x65, 0x70, 0xac, 0x8d, 0xc9, 0xc8, 0x5e, 0x47, + 0x49, 0xf0, 0xff, 0x00, 0x8a, 0x3c, 0x55, 0x1d, + 0xb4, 0x3a, 0x7d, 0x8d, 0xf5, 0xe5, 0xbc, 0x2a, + 0xc9, 0x09, 0x3c, 0x43, 0x12, 0x93, 0xb8, 0x80, + 0xc7, 0xe5, 0x03, 0x24, 0x9e, 0xa0, 0x66, 0xbb, + 0xad, 0x1b, 0xe0, 0xc3, 0x86, 0x0f, 0xe2, 0x2d, + 0x6a, 0x08, 0x14, 0x00, 0x5a, 0xde, 0xc5, 0x4c, + 0xf2, 0x7d, 0x0b, 0x7d, 0xd5, 0xfa, 0xf3, 0x45, + 0xc0, 0xe6, 0x35, 0xef, 0x1a, 0xdb, 0x5c, 0x5f, + 0x7d, 0xa3, 0x4f, 0xb2, 0x95, 0xe6, 0x08, 0xd1, + 0x35, 0xcd, 0xcb, 0x2a, 0xb4, 0xea, 0x5b, 0x87, + 0x90, 0x46, 0x01, 0x32, 0x80, 0x14, 0x17, 0xde, + 0x72, 0xca, 0x1c, 0x05, 0x3c, 0x8a, 0x1a, 0x75, + 0x87, 0x8b, 0xfc, 0x5f, 0x24, 0xff, 0x00, 0x62, + 0x87, 0x54, 0xd4, 0x85, 0xd1, 0x44, 0x9a, 0x4c, + 0xb1, 0x49, 0x76, 0x67, 0x6e, 0xf7, 0x3f, 0x29, + 0x23, 0x27, 0x05, 0x89, 0x23, 0xf2, 0xaf, 0x68, + 0xb3, 0xf0, 0xf7, 0x81, 0xbc, 0x22, 0xb1, 0xbb, + 0xd9, 0xda, 0x3c, 0xed, 0xd2, 0x7d, 0x52, 0x41, + 0x2b, 0x9c, 0x77, 0x54, 0xfb, 0x99, 0xf6, 0x1c, + 0xf6, 0xab, 0x77, 0x7e, 0x35, 0xb8, 0xb8, 0x53, + 0x1e, 0x99, 0xa7, 0xdc, 0xcd, 0x0a, 0x0d, 0xaa, + 0x6e, 0x08, 0xb5, 0x84, 0x63, 0xd1, 0x48, 0xdc, + 0x47, 0x1d, 0x36, 0x91, 0xf5, 0xeb, 0x59, 0x4a, + 0xb4, 0x63, 0xbb, 0x3a, 0x69, 0x61, 0x2b, 0x56, + 0xf8, 0x22, 0x70, 0x7a, 0x07, 0xc0, 0xfb, 0xe9, + 0x19, 0x5b, 0x5e, 0xd5, 0x6d, 0xad, 0x10, 0x0d, + 0xcd, 0x05, 0x9a, 0x9b, 0x89, 0x7e, 0x84, 0x8f, + 0x94, 0x7d, 0x72, 0x45, 0x7a, 0x7f, 0x87, 0x74, + 0x8d, 0x03, 0xc0, 0xfa, 0x2d, 0xdd, 0xbe, 0x9c, + 0x66, 0x78, 0xee, 0x80, 0x79, 0x3e, 0xd7, 0x71, + 0xb8, 0xc8, 0x47, 0x00, 0x85, 0x1f, 0x2a, 0x9e, + 0x47, 0xa1, 0xe8, 0x09, 0xe9, 0x58, 0x24, 0xf8, + 0x9e, 0xf5, 0x1e, 0x2b, 0x8d, 0x46, 0x4b, 0x3b, + 0x76, 0x3c, 0xad, 0x98, 0xfb, 0x3a, 0x10, 0x7b, + 0xee, 0x6c, 0xb9, 0xe3, 0x1c, 0x00, 0x33, 0xcd, + 0x5c, 0xb0, 0xd3, 0x6c, 0xad, 0x21, 0x92, 0x10, + 0x5f, 0xcb, 0x94, 0x83, 0x2e, 0xc6, 0x24, 0xb6, + 0x3b, 0x97, 0x6c, 0xb1, 0xfa, 0x60, 0x7f, 0x2a, + 0xcd, 0x55, 0x9d, 0x4f, 0xe1, 0xc4, 0xdd, 0xe1, + 0x68, 0xd0, 0xd6, 0xbd, 0x45, 0x7e, 0xcb, 0x56, + 0x71, 0x9f, 0x0e, 0xbc, 0x63, 0xae, 0x78, 0x28, + 0xea, 0x76, 0x5a, 0x8d, 0xb1, 0x9a, 0x19, 0x8b, + 0x4d, 0x63, 0x6a, 0x24, 0x2c, 0x60, 0x98, 0xb0, + 0xca, 0x30, 0x5e, 0x02, 0x10, 0xcc, 0x70, 0x70, + 0x41, 0x53, 0x80, 0x32, 0x6b, 0xdd, 0xbc, 0x03, + 0xae, 0xeb, 0x9a, 0xb2, 0x44, 0xfa, 0xae, 0x98, + 0xd0, 0xa4, 0x88, 0x59, 0xe5, 0x0b, 0xb1, 0x03, + 0x67, 0x23, 0x0a, 0xdc, 0xf4, 0xf7, 0x35, 0x7f, + 0xc2, 0x7a, 0x1e, 0x83, 0x14, 0x2b, 0x77, 0xa7, + 0xd8, 0xc3, 0xf6, 0x86, 0x1f, 0x34, 0xac, 0x37, + 0x3e, 0x7e, 0xa7, 0x9a, 0xea, 0xb0, 0x3b, 0x56, + 0x91, 0x8c, 0xfa, 0xe8, 0x63, 0x52, 0xa5, 0x0d, + 0x7d, 0x9c, 0x5b, 0xbf, 0x7f, 0xf2, 0xff, 0x00, + 0x82, 0x06, 0x8a, 0x5a, 0x2b, 0x53, 0x94, 0x6e, + 0x28, 0xc5, 0x3b, 0x14, 0x62, 0x80, 0x12, 0x9b, + 0x22, 0x09, 0x11, 0x95, 0xba, 0x11, 0x8a, 0x7e, + 0x28, 0xa0, 0x0f, 0x24, 0xf1, 0x56, 0x9e, 0x6c, + 0x35, 0x37, 0x00, 0x10, 0x8d, 0x92, 0xb5, 0xe1, + 0x7f, 0x12, 0x7c, 0x2b, 0x65, 0x2e, 0xa1, 0xe7, + 0x5e, 0xdc, 0x4d, 0x05, 0xa4, 0x82, 0x49, 0x63, + 0x2a, 0x38, 0x12, 0x63, 0x94, 0xe0, 0x64, 0x02, + 0x79, 0xff, 0x00, 0x81, 0x63, 0x80, 0x39, 0xfa, + 0xa7, 0xc6, 0xfa, 0x68, 0xbc, 0xd3, 0xcc, 0xc8, + 0x3f, 0x79, 0x1f, 0x3c, 0x57, 0x90, 0xeb, 0x5a, + 0x6c, 0x5a, 0x95, 0x99, 0x82, 0x74, 0xce, 0xc7, + 0x12, 0x27, 0xca, 0x0f, 0xcc, 0xbd, 0xb0, 0x78, + 0x23, 0xb7, 0x42, 0x3d, 0x69, 0x55, 0x52, 0x94, + 0x2f, 0x0d, 0xd1, 0x78, 0x3a, 0x94, 0xe9, 0x56, + 0xb5, 0x55, 0x78, 0xbd, 0xff, 0x00, 0x47, 0xf2, + 0xfc, 0x8e, 0x5f, 0xe1, 0x3f, 0xc3, 0x2d, 0x0f, + 0x57, 0x1f, 0x6f, 0x86, 0xf1, 0xac, 0x63, 0x2a, + 0x80, 0xc4, 0xf1, 0x9f, 0x37, 0x3b, 0x41, 0x60, + 0x59, 0xb8, 0x2a, 0xd9, 0x04, 0x60, 0x72, 0x39, + 0xeb, 0x9c, 0x71, 0x3f, 0x19, 0x7c, 0x18, 0x9e, + 0x14, 0xd7, 0x8c, 0x36, 0xc8, 0x8d, 0x61, 0x71, + 0x97, 0x89, 0xf7, 0x33, 0x16, 0x0b, 0x8c, 0xee, + 0x0b, 0x8e, 0x84, 0x92, 0x3b, 0x63, 0xf4, 0xe9, + 0x1f, 0x54, 0xd5, 0x34, 0xb9, 0xaf, 0xe4, 0xd1, + 0xb5, 0x08, 0x13, 0x51, 0xd4, 0x8e, 0xd9, 0x23, + 0x9c, 0x00, 0xb6, 0xfb, 0x48, 0xc3, 0x1c, 0xc7, + 0xb3, 0x70, 0xf9, 0x86, 0x30, 0x00, 0x1f, 0x98, + 0xe3, 0xce, 0xa5, 0xae, 0x5f, 0xc3, 0x27, 0xf6, + 0xc5, 0xe3, 0xea, 0x52, 0x33, 0x9c, 0x3d, 0xcb, + 0x99, 0x02, 0xe4, 0x82, 0x76, 0x03, 0xf7, 0x41, + 0x00, 0x03, 0xd3, 0x23, 0xd3, 0x8c, 0x73, 0x7b, + 0x68, 0x5b, 0xe2, 0x3d, 0x68, 0xe0, 0xf1, 0x2e, + 0xa3, 0x5c, 0x96, 0x5f, 0xd7, 0xde, 0x79, 0xc4, + 0x89, 0x26, 0x97, 0xa8, 0x2c, 0x81, 0x19, 0x51, + 0xb9, 0xc1, 0x05, 0x78, 0xc8, 0xfc, 0x7d, 0xc7, + 0x39, 0xc5, 0x69, 0xcb, 0x75, 0x3d, 0xbc, 0xd6, + 0xd7, 0x56, 0x50, 0x47, 0x66, 0x52, 0x3f, 0xb6, + 0x5b, 0xb0, 0x93, 0x7b, 0x38, 0xf3, 0x36, 0xf3, + 0x82, 0x70, 0x46, 0x0f, 0x07, 0x03, 0x00, 0xf0, + 0x38, 0x15, 0xd4, 0x6b, 0xde, 0x0f, 0x9b, 0xfb, + 0x38, 0xcb, 0x16, 0xc9, 0x21, 0x91, 0x7c, 0xd4, + 0x78, 0xe3, 0x8e, 0x35, 0x5f, 0x67, 0x6d, 0xc4, + 0x86, 0x1c, 0xfc, 0xbc, 0x9c, 0x1f, 0xcb, 0x36, + 0xcb, 0xc3, 0xfa, 0xe4, 0x1f, 0x65, 0xbc, 0x9e, + 0xc6, 0x78, 0x6c, 0x23, 0x85, 0x62, 0x32, 0x48, + 0xbb, 0x73, 0x19, 0x6e, 0x76, 0x8e, 0x4f, 0x3c, + 0xf3, 0xc0, 0xcf, 0x3e, 0xb5, 0xb7, 0xb4, 0x52, + 0x5a, 0x33, 0x92, 0x78, 0x59, 0x46, 0x76, 0x69, + 0x9d, 0xc7, 0x8b, 0x16, 0x0f, 0x1b, 0x78, 0x3e, + 0xd7, 0xc5, 0xfa, 0x6a, 0x8f, 0xb7, 0x5b, 0x28, + 0x83, 0x53, 0x88, 0x0e, 0x70, 0x06, 0x03, 0x9e, + 0xfe, 0xc4, 0xfa, 0x60, 0xd7, 0x9c, 0xd7, 0x63, + 0xf0, 0x9b, 0x59, 0x8f, 0xc3, 0xde, 0x33, 0xb8, + 0xd3, 0xef, 0x21, 0xff, 0x00, 0x89, 0x4e, 0xa8, + 0xbe, 0x4b, 0x47, 0x21, 0x2c, 0x39, 0xcf, 0xca, + 0x4f, 0x42, 0x08, 0x3b, 0x73, 0x8e, 0xb8, 0xae, + 0xdd, 0x7e, 0x11, 0xe8, 0xf6, 0xf7, 0xf7, 0x53, + 0x5f, 0x6b, 0x92, 0xbe, 0x9e, 0x1f, 0x74, 0x50, + 0x5a, 0xc5, 0x99, 0x04, 0x6d, 0xca, 0xef, 0x76, + 0xe0, 0x1c, 0x1f, 0x43, 0x9e, 0xb5, 0x4a, 0x48, + 0xe5, 0xa9, 0x4e, 0x54, 0xe5, 0xca, 0xd1, 0xe3, + 0x49, 0x2c, 0x89, 0x1b, 0xa2, 0xc8, 0xeb, 0x1b, + 0xfd, 0xf5, 0x04, 0x80, 0x71, 0xea, 0x3a, 0x56, + 0xee, 0x81, 0xe0, 0xbf, 0x10, 0xeb, 0xfb, 0x4e, + 0x97, 0xa5, 0x5c, 0xcb, 0x13, 0x73, 0xe7, 0x32, + 0x84, 0x8f, 0xeb, 0xb9, 0xb0, 0xb8, 0xfc, 0x6b, + 0xda, 0x21, 0xb3, 0xf0, 0x97, 0x84, 0xed, 0x44, + 0xd6, 0x96, 0x1a, 0x5c, 0x32, 0x0e, 0x52, 0x6b, + 0xf9, 0x96, 0xe2, 0x79, 0x08, 0xee, 0x8a, 0x78, + 0xfe, 0x43, 0xeb, 0x55, 0xb5, 0x1f, 0x1c, 0xdf, + 0x5e, 0xa9, 0x36, 0x96, 0x77, 0x12, 0x80, 0x71, + 0xba, 0xf1, 0xfc, 0xa8, 0xd7, 0xb7, 0xca, 0x9d, + 0x4f, 0xd3, 0x61, 0xfe, 0xb5, 0x13, 0xad, 0x08, + 0x6e, 0xcd, 0xa8, 0xe0, 0xeb, 0xd7, 0x7e, 0xe4, + 0x4e, 0x7f, 0x46, 0xf8, 0x3b, 0x1c, 0x6c, 0x5f, + 0xc4, 0x3a, 0xdc, 0x60, 0x26, 0x37, 0x5b, 0xe9, + 0xc8, 0x66, 0x61, 0xf5, 0x73, 0xf2, 0xaf, 0xeb, + 0x5d, 0x64, 0x1a, 0x67, 0x82, 0x3c, 0x21, 0x1a, + 0xb0, 0xb0, 0xb2, 0x13, 0x8c, 0x1f, 0x3b, 0x50, + 0x71, 0x71, 0x29, 0xf7, 0x08, 0x7e, 0x50, 0x7e, + 0x9c, 0xd6, 0x6a, 0x59, 0x78, 0x83, 0x56, 0x88, + 0xc7, 0x77, 0x77, 0x2c, 0x36, 0xe7, 0x2d, 0x18, + 0xb7, 0x1f, 0x66, 0x8c, 0x67, 0x9c, 0x86, 0x6c, + 0xb9, 0x1d, 0x7a, 0x63, 0x3e, 0xfd, 0x2b, 0x42, + 0xc3, 0xc3, 0x16, 0x36, 0xae, 0x27, 0x72, 0x0d, + 0xd6, 0x30, 0xcf, 0x10, 0x3b, 0x98, 0xf2, 0x32, + 0xd2, 0x3e, 0x58, 0x9e, 0x4f, 0x18, 0x02, 0xb3, + 0x55, 0x67, 0x3f, 0xe1, 0xc4, 0xe8, 0x78, 0x3a, + 0x14, 0x3f, 0xde, 0x2a, 0x2f, 0x45, 0xab, 0x26, + 0xbb, 0xf1, 0xc5, 0xd5, 0xe3, 0x79, 0x76, 0x36, + 0x97, 0x12, 0x44, 0x46, 0x23, 0x96, 0xed, 0xbe, + 0xcf, 0x00, 0xc7, 0x19, 0x0b, 0x8c, 0x91, 0xed, + 0xb0, 0xe7, 0xa0, 0xe7, 0x9a, 0xa4, 0x2d, 0xfc, + 0x41, 0xaa, 0x47, 0x1f, 0xdb, 0x6e, 0xe4, 0xb5, + 0x8b, 0xbc, 0x56, 0xca, 0x2d, 0xd0, 0x8f, 0x5d, + 0xe7, 0x2e, 0x7f, 0x00, 0x2b, 0x7e, 0xde, 0x18, + 0x6d, 0x48, 0x36, 0xb0, 0xc7, 0x13, 0x03, 0xf7, + 0xc0, 0xcb, 0x13, 0xea, 0x58, 0xe4, 0xfe, 0xb8, + 0xa9, 0x76, 0xbc, 0x8c, 0x4f, 0x2c, 0x4f, 0xea, + 0x6a, 0x96, 0x1a, 0xa4, 0xff, 0x00, 0x89, 0x2b, + 0x7a, 0x19, 0x4b, 0x31, 0xc3, 0xd1, 0xd3, 0x0f, + 0x4e, 0xfe, 0x6f, 0xfc, 0x8c, 0x8d, 0x3b, 0x40, + 0xb1, 0xb2, 0x63, 0x21, 0x01, 0xe6, 0xdd, 0xbf, + 0x7a, 0x81, 0xbf, 0x3e, 0xf2, 0xb6, 0x5c, 0x8e, + 0x3d, 0xbd, 0xb0, 0x6b, 0x5d, 0x59, 0x63, 0x60, + 0x61, 0x8d, 0x63, 0x6e, 0xbb, 0x86, 0x4b, 0x13, + 0xeb, 0xb8, 0xf3, 0x9a, 0xbf, 0x67, 0xa3, 0xde, + 0xdd, 0x1f, 0xdd, 0x40, 0xd8, 0x3d, 0xf1, 0x5d, + 0x05, 0x87, 0x82, 0xa7, 0x90, 0x86, 0xb8, 0x70, + 0x83, 0xb8, 0xad, 0xa1, 0x42, 0x95, 0x3d, 0x91, + 0xc7, 0x5b, 0x1d, 0x89, 0xc4, 0x7c, 0x52, 0xd3, + 0xb2, 0xd0, 0xe3, 0xce, 0x58, 0xe4, 0x92, 0x49, + 0x3c, 0xd4, 0xf6, 0xf6, 0x57, 0x17, 0x04, 0x08, + 0xa2, 0x66, 0x3f, 0x4a, 0xf4, 0xbb, 0x1f, 0x09, + 0xd8, 0xdb, 0x60, 0xba, 0xf9, 0x8d, 0xea, 0x6b, + 0x6e, 0x0b, 0x3b, 0x78, 0x17, 0x11, 0x44, 0x8a, + 0x3e, 0x95, 0xab, 0x99, 0xcc, 0xa9, 0x37, 0xb9, + 0xc9, 0x78, 0x37, 0x4d, 0xd4, 0xac, 0xa6, 0xcc, + 0xca, 0x56, 0x13, 0xd4, 0x1a, 0xed, 0x45, 0x02, + 0x8a, 0x86, 0xee, 0x6d, 0x18, 0xf2, 0xab, 0x09, + 0x4b, 0x4d, 0xcd, 0x28, 0x3e, 0xb4, 0x86, 0x2d, + 0x14, 0x64, 0x1a, 0x28, 0x18, 0x51, 0x45, 0x14, + 0x00, 0xc9, 0x51, 0x65, 0x8d, 0x91, 0x87, 0x04, + 0x60, 0xd7, 0x91, 0xf8, 0x9b, 0x4f, 0x36, 0x1a, + 0x94, 0x89, 0xb4, 0x85, 0x62, 0x4a, 0xfa, 0x57, + 0xaf, 0xd7, 0x29, 0xe3, 0xbd, 0x33, 0xed, 0x36, + 0x3e, 0x7c, 0x6b, 0xf3, 0xa7, 0x5a, 0xa8, 0xbb, + 0x33, 0x3a, 0x91, 0xba, 0x3c, 0x1b, 0xc4, 0x96, + 0x70, 0x58, 0x6a, 0xd6, 0xda, 0x9c, 0xb0, 0x99, + 0x2d, 0x5d, 0xff, 0x00, 0x7a, 0xa3, 0x1c, 0x30, + 0x1c, 0xe3, 0x3c, 0x67, 0x18, 0x3e, 0x99, 0x1e, + 0x95, 0xd3, 0xd9, 0xe8, 0xd6, 0x5e, 0x34, 0x82, + 0x1b, 0x2f, 0xb4, 0xa5, 0xb4, 0xb0, 0xba, 0x3e, + 0xf9, 0x53, 0x74, 0x8a, 0x8c, 0x1b, 0x00, 0x10, + 0x4e, 0x41, 0x23, 0x8e, 0x7b, 0x74, 0xe4, 0x52, + 0x6a, 0x56, 0x51, 0x6a, 0x16, 0x33, 0xd9, 0xcf, + 0xc2, 0xca, 0xb8, 0xdd, 0x9f, 0xb8, 0xc3, 0xa3, + 0x7e, 0x7f, 0xa7, 0x15, 0xca, 0x7f, 0x69, 0x4d, + 0xa3, 0xeb, 0xe3, 0x57, 0x26, 0x34, 0xb7, 0x82, + 0x36, 0xb1, 0xfe, 0xcc, 0x50, 0xa5, 0xd9, 0x47, + 0xf7, 0x63, 0x2c, 0x14, 0x0d, 0xdf, 0x31, 0xe7, + 0x2d, 0xdb, 0xb9, 0xae, 0x09, 0xe1, 0xe1, 0x0a, + 0x8f, 0x9b, 0x66, 0x7b, 0xb4, 0x71, 0xb5, 0x71, + 0x14, 0x21, 0x2a, 0x77, 0xf6, 0x94, 0xf4, 0xd3, + 0xb7, 0x4d, 0x0e, 0x97, 0xc6, 0x7e, 0x05, 0xb6, + 0xd1, 0x92, 0xd6, 0xca, 0x6b, 0xc6, 0x3a, 0x54, + 0x92, 0x2a, 0x89, 0x1f, 0x0c, 0xe9, 0x21, 0xdd, + 0xc0, 0xf4, 0x5c, 0x67, 0xa6, 0x79, 0x3e, 0xf5, + 0xcb, 0xc1, 0x16, 0x9f, 0x6d, 0x1d, 0xcb, 0xbe, + 0xcb, 0x8b, 0x81, 0x2f, 0x94, 0x92, 0x5d, 0x6e, + 0x6c, 0x06, 0x40, 0x07, 0xee, 0xf2, 0x3e, 0x71, + 0x8c, 0x74, 0xc1, 0xfa, 0x54, 0x9a, 0x4e, 0xab, + 0xe2, 0xed, 0x7d, 0xe7, 0x6d, 0x66, 0xd5, 0x5a, + 0xc9, 0xd0, 0x2c, 0x56, 0xd3, 0xa0, 0x82, 0x28, + 0xb9, 0xce, 0xe5, 0xda, 0x43, 0x6e, 0x18, 0x18, + 0x27, 0x71, 0xfa, 0x0e, 0x0e, 0xa6, 0x8f, 0xe1, + 0xf1, 0x66, 0xf2, 0xcb, 0x77, 0x2a, 0x4f, 0x24, + 0xa7, 0x73, 0x2e, 0xcd, 0xc0, 0x13, 0x8e, 0x41, + 0x6e, 0xa7, 0x20, 0x1e, 0x99, 0xc8, 0xeb, 0x50, + 0xf0, 0xfc, 0xd3, 0xbc, 0x11, 0xd7, 0x1c, 0xc5, + 0xd3, 0xa1, 0xcb, 0x89, 0x96, 0xbd, 0xba, 0xfd, + 0xcb, 0x5f, 0x5b, 0x9c, 0x0f, 0x89, 0x34, 0x8b, + 0x2b, 0xb8, 0x95, 0xec, 0xcc, 0xab, 0x7a, 0xb2, + 0x36, 0xf9, 0xb6, 0x15, 0x12, 0x83, 0xce, 0x40, + 0xe9, 0x8e, 0x48, 0xe3, 0x1e, 0xfc, 0xd7, 0x5b, + 0x1d, 0x86, 0xa7, 0x7d, 0x74, 0x24, 0x96, 0x59, + 0xe6, 0xb4, 0x39, 0x31, 0xc3, 0x22, 0xf9, 0x09, + 0x18, 0x3c, 0xf5, 0x24, 0xb1, 0x3d, 0x33, 0x8c, + 0x03, 0x5d, 0x45, 0xb5, 0x84, 0x10, 0xc9, 0xbe, + 0x08, 0x14, 0x48, 0x49, 0x3b, 0xb1, 0x92, 0x49, + 0xef, 0xcf, 0x23, 0xad, 0x6b, 0x5a, 0xe9, 0x57, + 0x97, 0x4d, 0xfb, 0xb8, 0x5c, 0xe7, 0xbe, 0x0d, + 0x6f, 0x1c, 0x24, 0xdf, 0xc7, 0x2b, 0x2e, 0xc8, + 0xe1, 0xaf, 0x9c, 0x51, 0xb5, 0xa8, 0xd3, 0xbb, + 0xee, 0xff, 0x00, 0xc9, 0x1c, 0x5e, 0x9b, 0xe1, + 0x4b, 0x7b, 0x79, 0x16, 0x59, 0x64, 0x55, 0x99, + 0x5f, 0x78, 0x6b, 0x74, 0x0a, 0xf9, 0x1c, 0xf3, + 0x21, 0x1b, 0x88, 0x1d, 0xb1, 0x80, 0x3b, 0x62, + 0xb7, 0xed, 0xad, 0x2d, 0xad, 0x58, 0x1b, 0x78, + 0x11, 0x64, 0xc9, 0xcc, 0x87, 0xe6, 0x72, 0x4f, + 0x53, 0xb8, 0xf3, 0x9f, 0xca, 0xbb, 0x3b, 0x1f, + 0x05, 0xdd, 0x4b, 0x83, 0x3b, 0x04, 0x07, 0xad, + 0x74, 0x36, 0x3e, 0x0f, 0xb2, 0x83, 0x06, 0x5c, + 0xc8, 0x7d, 0xeb, 0x78, 0x50, 0xa5, 0x4f, 0x65, + 0xa9, 0xe6, 0xd6, 0xc7, 0x62, 0xb1, 0x1a, 0x4a, + 0x56, 0x5d, 0x96, 0x9f, 0x91, 0xe6, 0xf1, 0xc1, + 0x3d, 0xc3, 0xe5, 0x51, 0xdd, 0x89, 0xe4, 0xf5, + 0xc9, 0xf7, 0xad, 0x8b, 0x1f, 0x0c, 0x5f, 0xdc, + 0x90, 0x4c, 0x45, 0x14, 0xfa, 0xd7, 0xa6, 0xdb, + 0x69, 0xf6, 0xb6, 0xeb, 0x88, 0xa1, 0x45, 0xfc, + 0x2a, 0xd6, 0x00, 0x1c, 0x56, 0xae, 0x7d, 0x8e, + 0x55, 0x4b, 0xb9, 0xc4, 0xd8, 0xf8, 0x21, 0x06, + 0x0d, 0xd4, 0x99, 0xf5, 0x02, 0xba, 0x1b, 0x2d, + 0x02, 0xc2, 0xd0, 0x0d, 0x90, 0xa9, 0x23, 0xb9, + 0xad, 0x6a, 0x2a, 0x79, 0x99, 0xa2, 0x82, 0x43, + 0x12, 0x34, 0x8c, 0x61, 0x14, 0x28, 0xf6, 0x14, + 0xfa, 0x28, 0xa4, 0x50, 0x51, 0x47, 0x4a, 0x46, + 0x60, 0x28, 0x01, 0x49, 0xc5, 0x31, 0x98, 0x74, + 0xa8, 0xd9, 0xfd, 0xe9, 0x9b, 0xbd, 0xe9, 0xa4, + 0x4d, 0xc9, 0xf3, 0x4d, 0xdd, 0x4d, 0xcd, 0x34, + 0x9a, 0x61, 0x72, 0x4d, 0xd4, 0xa1, 0xf9, 0xe6, + 0xa0, 0x2c, 0x7d, 0x69, 0xa5, 0x8d, 0x16, 0x13, + 0x65, 0xc0, 0xc0, 0xf4, 0xa5, 0xaa, 0x8a, 0xc7, + 0xd6, 0xa6, 0x46, 0x34, 0xac, 0x34, 0xc9, 0x6a, + 0x2b, 0x98, 0x96, 0x78, 0x5e, 0x36, 0x00, 0x86, + 0x18, 0xa9, 0x01, 0xa5, 0xa4, 0x51, 0xe3, 0x7a, + 0xfd, 0x8b, 0x58, 0xea, 0x32, 0x46, 0x54, 0xed, + 0xc9, 0x23, 0x8e, 0xd5, 0x9f, 0x1d, 0x91, 0x92, + 0xe3, 0xce, 0x8a, 0xdd, 0x7c, 0xe3, 0x8f, 0xde, + 0x04, 0x1b, 0xb2, 0x38, 0xeb, 0xd7, 0xb5, 0x7a, + 0xee, 0xa9, 0xa5, 0x5a, 0x5d, 0xdc, 0xa3, 0xcf, + 0x16, 0xe6, 0xf5, 0xab, 0x76, 0xba, 0x75, 0xac, + 0x0a, 0x3c, 0xa8, 0x50, 0x7e, 0x15, 0x4f, 0x96, + 0x56, 0xba, 0x33, 0x8a, 0x9c, 0x5b, 0xe5, 0x76, + 0xb9, 0xe6, 0x36, 0x5e, 0x1a, 0xd4, 0x2e, 0xc8, + 0x3e, 0x59, 0x50, 0x79, 0xcb, 0x57, 0x43, 0x63, + 0xe0, 0x81, 0xc1, 0xba, 0x93, 0x9f, 0x41, 0x5d, + 0xc8, 0x00, 0x0e, 0x06, 0x28, 0xa3, 0x9d, 0x82, + 0xa4, 0x91, 0x8d, 0x65, 0xe1, 0xdd, 0x3e, 0xd7, + 0x1b, 0x61, 0x0c, 0x47, 0x73, 0x5a, 0xb1, 0x43, + 0x1c, 0x63, 0x08, 0x8a, 0xa3, 0xd8, 0x54, 0x94, + 0x54, 0xdc, 0xb4, 0x92, 0xd8, 0x28, 0xa2, 0x8a, + 0x06, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x49, + 0x9a, 0x00, 0x5e, 0x94, 0x85, 0x80, 0xa8, 0xe4, + 0x62, 0x05, 0x56, 0x91, 0xcf, 0x3c, 0xd3, 0xb0, + 0x9b, 0x2c, 0x3c, 0xa0, 0x71, 0xc5, 0x42, 0xd2, + 0x75, 0x35, 0x5d, 0x98, 0xd4, 0x4e, 0xe7, 0xd6, + 0xaa, 0xc4, 0x36, 0x58, 0x69, 0x7d, 0xea, 0x36, + 0x98, 0x55, 0x47, 0x76, 0xcf, 0x5a, 0xaf, 0x23, + 0xb7, 0x3c, 0xd3, 0x48, 0x57, 0x3f, 0xff, 0xd9, + +}; + +static const uint8_t data_favicon_ico[] = +{ + /* /favicon.ico */ + 0x2f, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, + 0x2e, 0x69, 0x63, 0x6f, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x10, 0x10, + 0x10, 0x00, 0x01, 0x00, 0x04, 0x00, 0x28, 0x01, + 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x10, + 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x68, 0x05, + 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x97, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x79, 0x97, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x99, 0x97, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x79, 0x99, 0x99, 0x70, 0x00, 0x00, 0x07, + 0x77, 0x99, 0x97, 0x79, 0x97, 0x00, 0x00, 0x09, + 0x99, 0x99, 0x7f, 0xf7, 0x99, 0x70, 0x00, 0x79, + 0x99, 0x99, 0xf9, 0x97, 0x99, 0x97, 0x07, 0x99, + 0x99, 0x99, 0xf9, 0x9f, 0x99, 0x99, 0x79, 0x99, + 0x99, 0x99, 0xf9, 0x9f, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x97, 0xf9, 0x9f, 0x79, 0x97, 0x00, 0x00, + 0x99, 0x97, 0xf7, 0x9f, 0x79, 0x90, 0x00, 0x00, + 0x99, 0x99, 0x7f, 0xf7, 0x99, 0x70, 0x00, 0x00, + 0x99, 0x99, 0x9f, 0x99, 0x00, 0x00, 0x00, 0x00, + 0x99, 0x99, 0x90, 0x99, 0x00, 0x00, 0x00, 0x00, + 0x99, 0x99, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x99, 0x99, 0x00, 0x00, 0x00, 0x00, 0xff, 0x8f, + 0xfc, 0xfd, 0xff, 0x0f, 0xfc, 0xfd, 0xfe, 0x0f, + 0xfc, 0xfd, 0xfc, 0x07, 0xfc, 0xfd, 0xe0, 0x03, + 0xfc, 0xfd, 0xe0, 0x01, 0xfc, 0xfd, 0xc0, 0x00, + 0xfc, 0xfd, 0x80, 0x00, 0xfc, 0xfd, 0x00, 0x00, + 0xfc, 0xfd, 0x00, 0x00, 0xfc, 0xfd, 0xf0, 0x01, + 0xfc, 0xfd, 0xf0, 0x01, 0xfc, 0xfd, 0xf0, 0x0f, + 0xfc, 0xfd, 0xf0, 0x4f, 0xfc, 0xfd, 0xf0, 0x7f, + 0xfc, 0xfd, 0xf0, 0xff, 0xfc, 0xfd, 0x28, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0xc0, 0xdc, + 0xc0, 0x00, 0xf0, 0xca, 0xa6, 0x00, 0xd4, 0xf0, + 0xff, 0x00, 0xb1, 0xe2, 0xff, 0x00, 0x8e, 0xd4, + 0xff, 0x00, 0x6b, 0xc6, 0xff, 0x00, 0x48, 0xb8, + 0xff, 0x00, 0x25, 0xaa, 0xff, 0x00, 0x00, 0xaa, + 0xff, 0x00, 0x00, 0x92, 0xdc, 0x00, 0x00, 0x7a, + 0xb9, 0x00, 0x00, 0x62, 0x96, 0x00, 0x00, 0x4a, + 0x73, 0x00, 0x00, 0x32, 0x50, 0x00, 0xd4, 0xe3, + 0xff, 0x00, 0xb1, 0xc7, 0xff, 0x00, 0x8e, 0xab, + 0xff, 0x00, 0x6b, 0x8f, 0xff, 0x00, 0x48, 0x73, + 0xff, 0x00, 0x25, 0x57, 0xff, 0x00, 0x00, 0x55, + 0xff, 0x00, 0x00, 0x49, 0xdc, 0x00, 0x00, 0x3d, + 0xb9, 0x00, 0x00, 0x31, 0x96, 0x00, 0x00, 0x25, + 0x73, 0x00, 0x00, 0x19, 0x50, 0x00, 0xd4, 0xd4, + 0xff, 0x00, 0xb1, 0xb1, 0xff, 0x00, 0x8e, 0x8e, + 0xff, 0x00, 0x6b, 0x6b, 0xff, 0x00, 0x48, 0x48, + 0xff, 0x00, 0x25, 0x25, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0xb9, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x73, 0x00, 0x00, 0x00, 0x50, 0x00, 0xe3, 0xd4, + 0xff, 0x00, 0xc7, 0xb1, 0xff, 0x00, 0xab, 0x8e, + 0xff, 0x00, 0x8f, 0x6b, 0xff, 0x00, 0x73, 0x48, + 0xff, 0x00, 0x57, 0x25, 0xff, 0x00, 0x55, 0x00, + 0xff, 0x00, 0x49, 0x00, 0xdc, 0x00, 0x3d, 0x00, + 0xb9, 0x00, 0x31, 0x00, 0x96, 0x00, 0x25, 0x00, + 0x73, 0x00, 0x19, 0x00, 0x50, 0x00, 0xf0, 0xd4, + 0xff, 0x00, 0xe2, 0xb1, 0xff, 0x00, 0xd4, 0x8e, + 0xff, 0x00, 0xc6, 0x6b, 0xff, 0x00, 0xb8, 0x48, + 0xff, 0x00, 0xaa, 0x25, 0xff, 0x00, 0xaa, 0x00, + 0xff, 0x00, 0x92, 0x00, 0xdc, 0x00, 0x7a, 0x00, + 0xb9, 0x00, 0x62, 0x00, 0x96, 0x00, 0x4a, 0x00, + 0x73, 0x00, 0x32, 0x00, 0x50, 0x00, 0xff, 0xd4, + 0xff, 0x00, 0xff, 0xb1, 0xff, 0x00, 0xff, 0x8e, + 0xff, 0x00, 0xff, 0x6b, 0xff, 0x00, 0xff, 0x48, + 0xff, 0x00, 0xff, 0x25, 0xff, 0x00, 0xff, 0x00, + 0xff, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0xb9, 0x00, + 0xb9, 0x00, 0x96, 0x00, 0x96, 0x00, 0x73, 0x00, + 0x73, 0x00, 0x50, 0x00, 0x50, 0x00, 0xff, 0xd4, + 0xf0, 0x00, 0xff, 0xb1, 0xe2, 0x00, 0xff, 0x8e, + 0xd4, 0x00, 0xff, 0x6b, 0xc6, 0x00, 0xff, 0x48, + 0xb8, 0x00, 0xff, 0x25, 0xaa, 0x00, 0xff, 0x00, + 0xaa, 0x00, 0xdc, 0x00, 0x92, 0x00, 0xb9, 0x00, + 0x7a, 0x00, 0x96, 0x00, 0x62, 0x00, 0x73, 0x00, + 0x4a, 0x00, 0x50, 0x00, 0x32, 0x00, 0xff, 0xd4, + 0xe3, 0x00, 0xff, 0xb1, 0xc7, 0x00, 0xff, 0x8e, + 0xab, 0x00, 0xff, 0x6b, 0x8f, 0x00, 0xff, 0x48, + 0x73, 0x00, 0xff, 0x25, 0x57, 0x00, 0xff, 0x00, + 0x55, 0x00, 0xdc, 0x00, 0x49, 0x00, 0xb9, 0x00, + 0x3d, 0x00, 0x96, 0x00, 0x31, 0x00, 0x73, 0x00, + 0x25, 0x00, 0x50, 0x00, 0x19, 0x00, 0xff, 0xd4, + 0xd4, 0x00, 0xff, 0xb1, 0xb1, 0x00, 0xff, 0x8e, + 0x8e, 0x00, 0xff, 0x6b, 0x6b, 0x00, 0xff, 0x48, + 0x48, 0x00, 0xff, 0x25, 0x25, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xb9, 0x00, + 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0xff, 0xe3, + 0xd4, 0x00, 0xff, 0xc7, 0xb1, 0x00, 0xff, 0xab, + 0x8e, 0x00, 0xff, 0x8f, 0x6b, 0x00, 0xff, 0x73, + 0x48, 0x00, 0xff, 0x57, 0x25, 0x00, 0xff, 0x55, + 0x00, 0x00, 0xdc, 0x49, 0x00, 0x00, 0xb9, 0x3d, + 0x00, 0x00, 0x96, 0x31, 0x00, 0x00, 0x73, 0x25, + 0x00, 0x00, 0x50, 0x19, 0x00, 0x00, 0xff, 0xf0, + 0xd4, 0x00, 0xff, 0xe2, 0xb1, 0x00, 0xff, 0xd4, + 0x8e, 0x00, 0xff, 0xc6, 0x6b, 0x00, 0xff, 0xb8, + 0x48, 0x00, 0xff, 0xaa, 0x25, 0x00, 0xff, 0xaa, + 0x00, 0x00, 0xdc, 0x92, 0x00, 0x00, 0xb9, 0x7a, + 0x00, 0x00, 0x96, 0x62, 0x00, 0x00, 0x73, 0x4a, + 0x00, 0x00, 0x50, 0x32, 0x00, 0x00, 0xff, 0xff, + 0xd4, 0x00, 0xff, 0xff, 0xb1, 0x00, 0xff, 0xff, + 0x8e, 0x00, 0xff, 0xff, 0x6b, 0x00, 0xff, 0xff, + 0x48, 0x00, 0xff, 0xff, 0x25, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xdc, 0xdc, 0x00, 0x00, 0xb9, 0xb9, + 0x00, 0x00, 0x96, 0x96, 0x00, 0x00, 0x73, 0x73, + 0x00, 0x00, 0x50, 0x50, 0x00, 0x00, 0xf0, 0xff, + 0xd4, 0x00, 0xe2, 0xff, 0xb1, 0x00, 0xd4, 0xff, + 0x8e, 0x00, 0xc6, 0xff, 0x6b, 0x00, 0xb8, 0xff, + 0x48, 0x00, 0xaa, 0xff, 0x25, 0x00, 0xaa, 0xff, + 0x00, 0x00, 0x92, 0xdc, 0x00, 0x00, 0x7a, 0xb9, + 0x00, 0x00, 0x62, 0x96, 0x00, 0x00, 0x4a, 0x73, + 0x00, 0x00, 0x32, 0x50, 0x00, 0x00, 0xe3, 0xff, + 0xd4, 0x00, 0xc7, 0xff, 0xb1, 0x00, 0xab, 0xff, + 0x8e, 0x00, 0x8f, 0xff, 0x6b, 0x00, 0x73, 0xff, + 0x48, 0x00, 0x57, 0xff, 0x25, 0x00, 0x55, 0xff, + 0x00, 0x00, 0x49, 0xdc, 0x00, 0x00, 0x3d, 0xb9, + 0x00, 0x00, 0x31, 0x96, 0x00, 0x00, 0x25, 0x73, + 0x00, 0x00, 0x19, 0x50, 0x00, 0x00, 0xd4, 0xff, + 0xd4, 0x00, 0xb1, 0xff, 0xb1, 0x00, 0x8e, 0xff, + 0x8e, 0x00, 0x6b, 0xff, 0x6b, 0x00, 0x48, 0xff, + 0x48, 0x00, 0x25, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xb9, + 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x73, + 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0xd4, 0xff, + 0xe3, 0x00, 0xb1, 0xff, 0xc7, 0x00, 0x8e, 0xff, + 0xab, 0x00, 0x6b, 0xff, 0x8f, 0x00, 0x48, 0xff, + 0x73, 0x00, 0x25, 0xff, 0x57, 0x00, 0x00, 0xff, + 0x55, 0x00, 0x00, 0xdc, 0x49, 0x00, 0x00, 0xb9, + 0x3d, 0x00, 0x00, 0x96, 0x31, 0x00, 0x00, 0x73, + 0x25, 0x00, 0x00, 0x50, 0x19, 0x00, 0xd4, 0xff, + 0xf0, 0x00, 0xb1, 0xff, 0xe2, 0x00, 0x8e, 0xff, + 0xd4, 0x00, 0x6b, 0xff, 0xc6, 0x00, 0x48, 0xff, + 0xb8, 0x00, 0x25, 0xff, 0xaa, 0x00, 0x00, 0xff, + 0xaa, 0x00, 0x00, 0xdc, 0x92, 0x00, 0x00, 0xb9, + 0x7a, 0x00, 0x00, 0x96, 0x62, 0x00, 0x00, 0x73, + 0x4a, 0x00, 0x00, 0x50, 0x32, 0x00, 0xd4, 0xff, + 0xff, 0x00, 0xb1, 0xff, 0xff, 0x00, 0x8e, 0xff, + 0xff, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x48, 0xff, + 0xff, 0x00, 0x25, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xdc, 0xdc, 0x00, 0x00, 0xb9, + 0xb9, 0x00, 0x00, 0x96, 0x96, 0x00, 0x00, 0x73, + 0x73, 0x00, 0x00, 0x50, 0x50, 0x00, 0xf2, 0xf2, + 0xf2, 0x00, 0xe6, 0xe6, 0xe6, 0x00, 0xda, 0xda, + 0xda, 0x00, 0xce, 0xce, 0xce, 0x00, 0xc2, 0xc2, + 0xc2, 0x00, 0xb6, 0xb6, 0xb6, 0x00, 0xaa, 0xaa, + 0xaa, 0x00, 0x9e, 0x9e, 0x9e, 0x00, 0x92, 0x92, + 0x92, 0x00, 0x86, 0x86, 0x86, 0x00, 0x7a, 0x7a, + 0x7a, 0x00, 0x6e, 0x6e, 0x6e, 0x00, 0x62, 0x62, + 0x62, 0x00, 0x56, 0x56, 0x56, 0x00, 0x4a, 0x4a, + 0x4a, 0x00, 0x3e, 0x3e, 0x3e, 0x00, 0x32, 0x32, + 0x32, 0x00, 0x26, 0x26, 0x26, 0x00, 0x1a, 0x1a, + 0x1a, 0x00, 0x0e, 0x0e, 0x0e, 0x00, 0xf0, 0xfb, + 0xff, 0x00, 0xa4, 0xa0, 0xa0, 0x00, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, + 0x28, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x28, + 0x28, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x28, 0x28, + 0x28, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x25, 0x25, 0x25, 0x25, 0x28, 0x28, 0xf6, + 0xf6, 0x23, 0x28, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x23, 0x23, + 0x23, 0xf6, 0x23, 0x28, 0x25, 0x00, 0x00, 0x00, + 0x25, 0x28, 0x28, 0x28, 0x28, 0x28, 0x23, 0x28, + 0x28, 0xf6, 0x28, 0x28, 0x28, 0x25, 0x00, 0x25, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x23, 0x28, + 0x28, 0xf6, 0x28, 0x28, 0x28, 0x28, 0x25, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0xf6, 0xf6, 0x28, + 0x28, 0xf6, 0xf6, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0xf6, 0xf6, 0x28, + 0x28, 0x23, 0xf6, 0x28, 0x28, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x23, 0x23, + 0x28, 0x23, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x23, + 0x23, 0x23, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x23, + 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x25, 0x00, + 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x8f, + 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0x0f, + 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0xe0, 0x03, + 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, + 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x0f, + 0x00, 0x00, 0xf0, 0x4f, 0x00, 0x00, 0xf0, 0xff, + 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, +}; + +static const uint8_t data_index_htm[] = +{ + /* /index.htm */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, + 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x0d, + 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, + 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, + 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, + 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, + 0x78, 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, + 0x49, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, + 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, + 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, + 0x0a, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6d, 0x65, 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, + 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, + 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2d, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, + 0x6c, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, + 0x74, 0x3d, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x44, 0x4b, + 0x2d, 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, + 0x58, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x4b, 0x69, + 0x74, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, + 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, + 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x73, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x2f, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, + 0x3d, 0x22, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, + 0x75, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78, 0x2d, 0x69, + 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x66, 0x61, 0x76, 0x69, 0x63, + 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x2f, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x6a, + 0x73, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, + 0x61, 0x67, 0x65, 0x3d, 0x22, 0x4a, 0x61, 0x76, + 0x61, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x31, + 0x2e, 0x32, 0x22, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75, 0x74, 0x66, + 0x2d, 0x38, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, + 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x2e, + 0x6a, 0x73, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, + 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x4a, 0x61, + 0x76, 0x61, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x31, 0x2e, 0x32, 0x22, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75, 0x74, + 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x3c, 0x2f, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, + 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x3e, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x61, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x69, 0x22, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x74, 0x69, 0x2e, 0x6a, + 0x70, 0x67, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, + 0x22, 0x54, 0x65, 0x78, 0x61, 0x73, 0x20, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x61, 0x3e, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x20, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, + 0x30, 0x25, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x5f, 0x68, 0x31, 0x22, 0x3e, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, + 0x69, 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, + 0x65, 0x3b, 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x20, 0x54, 0x4d, 0x34, 0x43, + 0x31, 0x32, 0x39, 0x58, 0x20, 0x44, 0x65, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x4b, 0x69, 0x74, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, + 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, + 0x32, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x44, 0x4b, 0x2d, 0x54, 0x4d, + 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x61, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x74, 0x69, 0x76, 0x61, 0x22, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x74, 0x69, 0x76, 0x61, 0x22, 0x3e, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, + 0x22, 0x74, 0x6d, 0x34, 0x63, 0x2e, 0x6a, 0x70, + 0x67, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, + 0x54, 0x4d, 0x34, 0x43, 0x22, 0x3e, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x61, 0x3e, + 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, + 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x68, 0x72, 0x3e, 0x3c, 0x68, 0x72, 0x3e, + 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x22, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x61, 0x62, 0x6f, 0x75, + 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x61, 0x62, 0x6f, 0x75, 0x74, + 0x22, 0x3e, 0x41, 0x62, 0x6f, 0x75, 0x74, 0x20, + 0x54, 0x49, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x6c, 0x69, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, + 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x6f, 0x76, 0x65, 0x72, 0x76, 0x69, + 0x65, 0x77, 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x6f, 0x76, 0x65, 0x72, + 0x76, 0x69, 0x65, 0x77, 0x22, 0x3e, 0x54, 0x69, + 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, + 0x3b, 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x20, 0x4f, 0x76, 0x65, 0x72, 0x76, + 0x69, 0x65, 0x77, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, + 0x2f, 0x6c, 0x69, 0x3e, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, + 0x3e, 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, + 0x58, 0x4e, 0x43, 0x5a, 0x41, 0x44, 0x20, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x44, 0x69, 0x61, + 0x67, 0x72, 0x61, 0x6d, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x74, 0x6f, 0x6f, 0x6c, 0x2f, 0x64, 0x6b, + 0x2d, 0x74, 0x6d, 0x34, 0x63, 0x31, 0x32, 0x39, + 0x78, 0x22, 0x3e, 0x44, 0x4b, 0x2d, 0x54, 0x4d, + 0x34, 0x43, 0x31, 0x32, 0x39, 0x78, 0x20, 0x50, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x50, + 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, + 0x2f, 0x6c, 0x69, 0x3e, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x74, 0x69, 0x76, 0x61, 0x2d, 0x63, 0x22, 0x3e, + 0x54, 0x69, 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, + 0x64, 0x65, 0x3b, 0x20, 0x54, 0x4d, 0x34, 0x43, + 0x31, 0x32, 0x39, 0x58, 0x20, 0x46, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x20, 0x50, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x20, 0x50, 0x61, 0x67, 0x65, + 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x2e, + 0x68, 0x74, 0x6d, 0x22, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x69, 0x6f, 0x5f, 0x68, 0x74, 0x74, 0x70, + 0x22, 0x3e, 0x49, 0x2f, 0x4f, 0x20, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x44, 0x65, + 0x6d, 0x6f, 0x20, 0x31, 0x3c, 0x62, 0x72, 0x3e, + 0x28, 0x48, 0x54, 0x54, 0x50, 0x20, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x29, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, + 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, + 0x6f, 0x5f, 0x63, 0x67, 0x69, 0x2e, 0x73, 0x73, + 0x69, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, + 0x6f, 0x5f, 0x63, 0x67, 0x69, 0x22, 0x3e, 0x49, + 0x2f, 0x4f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x20, 0x44, 0x65, 0x6d, 0x6f, 0x20, + 0x32, 0x3c, 0x62, 0x72, 0x3e, 0x28, 0x53, 0x53, + 0x49, 0x2f, 0x43, 0x47, 0x49, 0x29, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, + 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x64, 0x6b, + 0x2d, 0x74, 0x6d, 0x34, 0x63, 0x31, 0x32, 0x39, + 0x78, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20, 0x61, + 0x6c, 0x74, 0x3d, 0x22, 0x44, 0x4b, 0x2d, 0x54, + 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x22, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x66, 0x6f, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x22, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x68, 0x72, 0x3e, 0x3c, 0x68, 0x72, + 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x20, 0x26, 0x63, 0x6f, 0x70, 0x79, + 0x3b, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, 0x32, + 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, 0x61, + 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, 0x6e, + 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, 0x6c, + 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x2e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0d, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, + 0x3e, 0x0d, 0x0a, +}; + +static const uint8_t data_io_cgi_ssi[] = +{ + /* /io_cgi.ssi */ + 0x2f, 0x69, 0x6f, 0x5f, 0x63, 0x67, 0x69, 0x2e, + 0x73, 0x73, 0x69, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x0a, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x20, + 0x54, 0x65, 0x78, 0x61, 0x73, 0x20, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x20, 0x49, 0x6e, 0x63, 0x6f, 0x72, 0x70, + 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x20, + 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, + 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, + 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, + 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, + 0x75, 0x69, 0x76, 0x3d, 0x22, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x63, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x55, 0x54, + 0x46, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3e, 0x49, 0x2f, 0x4f, 0x20, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x44, 0x65, 0x6d, + 0x6f, 0x20, 0x32, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, + 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, + 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x73, 0x73, 0x22, + 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, + 0x6c, 0x3d, 0x22, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x63, 0x75, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, + 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78, 0x2d, + 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x66, 0x61, 0x76, 0x69, + 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, + 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, + 0x73, 0x72, 0x63, 0x3d, 0x22, 0x6a, 0x61, 0x76, + 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x6a, 0x73, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, + 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x4a, 0x61, + 0x76, 0x61, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x31, 0x2e, 0x32, 0x22, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75, 0x74, + 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x3c, 0x2f, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, + 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x0a, + 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, + 0x21, 0x2d, 0x2d, 0x23, 0x46, 0x6f, 0x72, 0x6d, + 0x56, 0x61, 0x72, 0x73, 0x2d, 0x2d, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x61, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x74, 0x69, 0x22, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, + 0x3d, 0x22, 0x74, 0x69, 0x2e, 0x6a, 0x70, 0x67, + 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x54, + 0x65, 0x78, 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x61, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x64, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x31, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x54, 0x69, 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, + 0x64, 0x65, 0x3b, 0x20, 0x43, 0x20, 0x53, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x20, 0x54, 0x4d, 0x34, + 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, 0x44, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x4b, 0x69, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x32, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x44, 0x4b, 0x2d, 0x54, 0x4d, 0x34, 0x43, + 0x31, 0x32, 0x39, 0x58, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x64, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x61, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x69, 0x76, 0x61, 0x22, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, + 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x76, 0x61, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, + 0x3d, 0x22, 0x74, 0x6d, 0x34, 0x63, 0x2e, 0x6a, + 0x70, 0x67, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, + 0x22, 0x54, 0x4d, 0x34, 0x43, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x61, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x72, 0x3e, + 0x3c, 0x68, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, 0x65, 0x6e, + 0x75, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x75, 0x6c, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x61, 0x62, 0x6f, 0x75, + 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x61, 0x62, 0x6f, 0x75, 0x74, + 0x22, 0x3e, 0x41, 0x62, 0x6f, 0x75, 0x74, 0x20, + 0x54, 0x49, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x6f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x6f, 0x76, 0x65, 0x72, 0x76, + 0x69, 0x65, 0x77, 0x22, 0x3e, 0x54, 0x69, 0x76, + 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, + 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x20, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, + 0x65, 0x77, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x68, + 0x74, 0x6d, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x3e, 0x54, + 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x4e, + 0x43, 0x5a, 0x41, 0x44, 0x20, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x44, 0x69, 0x61, 0x67, 0x72, + 0x61, 0x6d, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, + 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, + 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, + 0x6f, 0x6c, 0x2f, 0x64, 0x6b, 0x2d, 0x74, 0x6d, + 0x34, 0x63, 0x31, 0x32, 0x39, 0x78, 0x22, 0x3e, + 0x44, 0x4b, 0x2d, 0x54, 0x4d, 0x34, 0x43, 0x31, + 0x32, 0x39, 0x58, 0x20, 0x50, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x20, 0x50, 0x61, 0x67, 0x65, + 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, + 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x76, 0x61, + 0x2d, 0x63, 0x22, 0x3e, 0x54, 0x69, 0x76, 0x61, + 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, 0x20, + 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x78, + 0x20, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, + 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, + 0x50, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x69, 0x6f, 0x5f, 0x68, 0x74, + 0x74, 0x70, 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x69, 0x6f, 0x5f, 0x68, + 0x74, 0x74, 0x70, 0x22, 0x3e, 0x49, 0x2f, 0x4f, + 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x20, 0x44, 0x65, 0x6d, 0x6f, 0x20, 0x31, 0x3c, + 0x62, 0x72, 0x3e, 0x28, 0x48, 0x54, 0x54, 0x50, + 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x29, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x69, 0x6f, 0x5f, 0x63, 0x67, 0x69, 0x2e, + 0x73, 0x73, 0x69, 0x22, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x69, 0x6f, 0x5f, 0x63, 0x67, 0x69, 0x22, + 0x3e, 0x49, 0x2f, 0x4f, 0x20, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x44, 0x65, 0x6d, + 0x6f, 0x20, 0x32, 0x3c, 0x62, 0x72, 0x3e, 0x28, + 0x53, 0x53, 0x49, 0x2f, 0x43, 0x47, 0x49, 0x29, + 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, + 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x64, 0x6b, + 0x2d, 0x74, 0x6d, 0x34, 0x63, 0x31, 0x32, 0x39, + 0x78, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20, 0x61, + 0x6c, 0x74, 0x3d, 0x22, 0x44, 0x4b, 0x2d, 0x54, + 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, + 0x30, 0x25, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, + 0x22, 0x6c, 0x65, 0x66, 0x74, 0x22, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, + 0x6f, 0x70, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x22, 0x37, 0x35, 0x25, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, + 0x32, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, + 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, + 0x3e, 0x49, 0x2f, 0x4f, 0x20, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x44, 0x65, 0x6d, + 0x6f, 0x20, 0x32, 0x3c, 0x2f, 0x68, 0x32, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x68, 0x72, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x3d, 0x22, 0x32, 0x22, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, + 0x30, 0x30, 0x25, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x75, 0x6c, 0x3e, 0x3c, 0x2f, + 0x75, 0x6c, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, + 0x64, 0x65, 0x6d, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, + 0x6f, 0x77, 0x73, 0x20, 0x61, 0x6e, 0x6f, 0x74, + 0x68, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x2c, 0x20, 0x77, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, + 0x53, 0x69, 0x64, 0x65, 0x20, 0x49, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x61, 0x67, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x61, 0x73, + 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x62, + 0x65, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x69, 0x76, + 0x61, 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x20, 0x44, 0x4b, 0x20, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, + 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x66, 0x6f, + 0x72, 0x6d, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, + 0x65, 0x6e, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x43, 0x47, + 0x49, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x2e, 0x20, 0x26, 0x6e, 0x62, 0x73, + 0x70, 0x3b, 0x54, 0x68, 0x69, 0x73, 0x20, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x64, + 0x6f, 0x65, 0x73, 0x20, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x20, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x65, 0x76, + 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, + 0x20, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x69, + 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x73, 0x20, + 0x6c, 0x65, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x20, 0x48, 0x54, 0x4d, + 0x4c, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, 0x72, + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x38, 0x30, 0x25, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x66, 0x6f, + 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, 0x22, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x69, 0x6f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x63, 0x67, 0x69, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6f, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, + 0x22, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x32, + 0x22, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, + 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x32, + 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x6c, 0x65, 0x66, 0x74, 0x22, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, + 0x70, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x62, 0x3e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x3c, 0x2f, + 0x62, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x62, 0x3e, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x62, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x62, 0x3e, 0x4e, 0x65, 0x77, 0x3c, 0x2f, + 0x62, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, + 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, + 0x65, 0x66, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, + 0x22, 0x3e, 0x4c, 0x45, 0x44, 0x20, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, + 0x2d, 0x2d, 0x23, 0x4c, 0x45, 0x44, 0x74, 0x78, + 0x74, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, + 0x70, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x45, 0x44, 0x4f, 0x6e, 0x22, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x31, + 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, + 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, + 0x65, 0x66, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, + 0x22, 0x3e, 0x41, 0x6e, 0x69, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x70, 0x65, 0x65, + 0x64, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, + 0x70, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x73, 0x70, 0x65, 0x65, 0x64, 0x2d, 0x2d, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x31, + 0x30, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x22, + 0x20, 0x73, 0x69, 0x7a, 0x65, 0x3d, 0x22, 0x34, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x73, 0x70, 0x65, 0x65, 0x64, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6f, 0x6c, + 0x73, 0x70, 0x61, 0x6e, 0x3d, 0x22, 0x33, 0x22, + 0x20, 0x72, 0x6f, 0x77, 0x73, 0x70, 0x61, 0x6e, + 0x3d, 0x22, 0x31, 0x22, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x6d, 0x69, 0x64, 0x64, + 0x6c, 0x65, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x66, 0x6f, 0x72, + 0x6d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, + 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x75, 0x6c, + 0x3e, 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x3d, 0x22, 0x31, 0x22, 0x20, 0x63, 0x65, 0x6c, + 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x3d, 0x22, 0x32, 0x22, 0x20, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, + 0x3d, 0x22, 0x32, 0x22, 0x20, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3d, 0x22, 0x38, 0x30, 0x25, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, + 0x66, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x66, + 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, 0x22, + 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x73, 0x65, 0x74, 0x74, 0x78, 0x74, 0x2e, + 0x63, 0x67, 0x69, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x73, 0x65, 0x74, 0x74, 0x78, + 0x74, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, + 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x3d, 0x22, 0x32, 0x22, 0x20, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, + 0x67, 0x3d, 0x22, 0x32, 0x22, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, + 0x25, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x72, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x62, 0x3e, 0x44, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, + 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x3c, 0x62, 0x72, + 0x3e, 0x3c, 0x2f, 0x62, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x78, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x22, + 0x34, 0x30, 0x22, 0x20, 0x73, 0x69, 0x7a, 0x65, + 0x3d, 0x22, 0x34, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x69, 0x73, 0x70, + 0x54, 0x65, 0x78, 0x74, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x22, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3d, 0x22, 0x53, 0x65, 0x6e, 0x64, + 0x20, 0x54, 0x65, 0x78, 0x74, 0x22, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x66, 0x6f, 0x6f, + 0x74, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x72, + 0x3e, 0x3c, 0x68, 0x72, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x70, 0x79, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x26, 0x63, + 0x6f, 0x70, 0x79, 0x3b, 0x20, 0x32, 0x30, 0x31, + 0x33, 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, + 0x65, 0x78, 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x20, 0x49, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, + 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, + 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, + 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, + +}; + +static const uint8_t data_io_http_htm[] = +{ + /* /io_http.htm */ + 0x2f, 0x69, 0x6f, 0x5f, 0x68, 0x74, 0x74, 0x70, + 0x2e, 0x68, 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x0a, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x20, + 0x54, 0x65, 0x78, 0x61, 0x73, 0x20, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x20, 0x49, 0x6e, 0x63, 0x6f, 0x72, 0x70, + 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x20, + 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, + 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x65, + 0x61, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, + 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, + 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, + 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x63, + 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x55, + 0x54, 0x46, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x49, 0x2f, + 0x4f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x20, 0x44, 0x65, 0x6d, 0x6f, 0x20, 0x31, + 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, + 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x73, 0x73, + 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, + 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, + 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, + 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, + 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x20, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, + 0x30, 0x30, 0x25, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, + 0x66, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x22, + 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, + 0x37, 0x35, 0x25, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x68, 0x32, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x49, 0x2f, + 0x4f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x20, 0x44, 0x65, 0x6d, 0x6f, 0x20, 0x31, + 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x68, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, + 0x3d, 0x22, 0x32, 0x22, 0x20, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x70, 0x3e, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x6e, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x68, 0x6f, 0x77, 0x73, 0x20, 0x68, + 0x6f, 0x77, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x65, + 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x4a, + 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x65, + 0x62, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x69, + 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x20, 0x55, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x20, 0x74, 0x68, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x74, 0x69, + 0x72, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x3e, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x20, 0x55, + 0x53, 0x45, 0x52, 0x20, 0x4c, 0x45, 0x44, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4c, 0x45, 0x44, 0x3c, + 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x22, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x20, 0x4c, + 0x45, 0x44, 0x22, 0x20, 0x6f, 0x6e, 0x63, 0x6c, + 0x69, 0x63, 0x6b, 0x3d, 0x22, 0x74, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x5f, 0x6c, 0x65, 0x64, 0x28, + 0x29, 0x3b, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x64, 0x3e, 0x55, 0x53, 0x45, + 0x52, 0x20, 0x4c, 0x45, 0x44, 0x3a, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x65, + 0x64, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x2d, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x3e, + 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x3e, + 0x53, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x70, 0x65, 0x65, 0x64, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6e, 0x69, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x2e, 0x20, 0x53, + 0x70, 0x65, 0x65, 0x64, 0x20, 0x69, 0x73, 0x20, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, + 0x65, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x3e, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x53, 0x70, 0x65, 0x65, 0x64, 0x3a, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, + 0x65, 0x65, 0x64, 0x22, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x2d, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x70, 0x65, + 0x65, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x22, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x53, + 0x65, 0x74, 0x20, 0x53, 0x70, 0x65, 0x65, 0x64, + 0x22, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x3d, 0x22, 0x73, 0x70, 0x65, 0x65, 0x64, + 0x53, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x22, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, + 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x3d, 0x22, 0x33, 0x22, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x3d, 0x22, 0x34, 0x22, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x73, 0x70, 0x65, 0x65, + 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3e, 0x25, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x70, 0x3e, 0x3c, 0x2f, 0x70, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x0a, 0x0a, 0x3c, 0x2f, 0x68, + 0x74, 0x6d, 0x6c, 0x3e, +}; + +static const uint8_t data_javascript_js[] = +{ + /* /javascript.js */ + 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x6a, 0x73, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x0a, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6f, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, + 0x28, 0x27, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x27, + 0x29, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x41, 0x62, 0x6f, 0x75, 0x74, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, + 0x49, 0x64, 0x28, 0x27, 0x6f, 0x76, 0x65, 0x72, + 0x76, 0x69, 0x65, 0x77, 0x27, 0x29, 0x2e, 0x6f, + 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x76, 0x65, + 0x72, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, + 0x49, 0x64, 0x28, 0x27, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, + 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x69, 0x6f, + 0x5f, 0x68, 0x74, 0x74, 0x70, 0x27, 0x29, 0x2e, + 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, + 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x4f, + 0x48, 0x74, 0x74, 0x70, 0x3b, 0x0a, 0x7d, 0x0a, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x62, + 0x6f, 0x75, 0x74, 0x28, 0x29, 0x0a, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x61, 0x67, 0x65, 0x28, 0x22, 0x61, 0x62, + 0x6f, 0x75, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x22, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x76, 0x65, + 0x72, 0x76, 0x69, 0x65, 0x77, 0x28, 0x29, 0x0a, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x67, 0x65, 0x28, 0x22, + 0x6f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x28, + 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x67, 0x65, + 0x28, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x68, 0x74, 0x6d, 0x22, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, + 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x49, 0x4f, 0x48, 0x74, 0x74, 0x70, 0x28, + 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x67, 0x65, + 0x28, 0x22, 0x69, 0x6f, 0x5f, 0x68, 0x74, 0x74, + 0x70, 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x64, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x47, 0x65, 0x74, + 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x70, 0x65, 0x65, 0x64, 0x47, 0x65, 0x74, + 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0a, 0x7d, 0x0a, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x53, 0x65, 0x74, 0x46, 0x6f, 0x72, + 0x6d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x69, 0x6f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x45, 0x44, + 0x4f, 0x6e, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x65, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x73, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x73, 0x70, 0x65, 0x65, 0x64, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x70, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x67, 0x67, 0x6c, 0x65, 0x5f, 0x6c, 0x65, 0x64, + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x71, + 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x28, 0x72, 0x65, 0x71, 0x2e, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, + 0x72, 0x65, 0x71, 0x2e, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x30, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, + 0x28, 0x22, 0x6c, 0x65, 0x64, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x22, 0x29, 0x2e, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, + 0x20, 0x22, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x22, + 0x20, 0x2b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, + 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x54, 0x65, 0x78, 0x74, 0x20, 0x2b, 0x20, + 0x22, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x22, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x58, + 0x4d, 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, + 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x58, + 0x4d, 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x69, 0x66, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x58, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x71, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x58, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x22, + 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, + 0x74, 0x2e, 0x58, 0x4d, 0x4c, 0x48, 0x54, 0x54, + 0x50, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x28, 0x72, 0x65, 0x71, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x22, 0x47, + 0x45, 0x54, 0x22, 0x2c, 0x20, 0x22, 0x2f, 0x63, + 0x67, 0x69, 0x2d, 0x62, 0x69, 0x6e, 0x2f, 0x74, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x5f, 0x6c, 0x65, + 0x64, 0x3f, 0x69, 0x64, 0x22, 0x20, 0x2b, 0x20, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, + 0x64, 0x6f, 0x6d, 0x28, 0x29, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x71, 0x2e, 0x6f, 0x6e, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x54, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x71, 0x2e, 0x73, 0x65, 0x6e, 0x64, 0x28, + 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x53, 0x65, + 0x74, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, + 0x71, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, + 0x61, 0x72, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, + 0x5f, 0x74, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, + 0x73, 0x70, 0x65, 0x65, 0x64, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, + 0x65, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x72, + 0x65, 0x71, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x3d, + 0x20, 0x34, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x28, 0x72, 0x65, 0x71, + 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, + 0x3d, 0x3d, 0x20, 0x32, 0x30, 0x30, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, + 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x70, 0x65, 0x65, 0x64, 0x22, 0x29, 0x2e, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, + 0x20, 0x3d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x3c, 0x64, 0x69, 0x76, + 0x3e, 0x22, 0x20, 0x2b, 0x20, 0x72, 0x65, 0x71, + 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x54, 0x65, 0x78, 0x74, 0x20, 0x2b, 0x20, + 0x22, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x22, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x58, 0x4d, + 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x20, + 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x58, 0x4d, + 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x28, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, + 0x66, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x58, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x71, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x58, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x22, 0x4d, + 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x2e, 0x58, 0x4d, 0x4c, 0x48, 0x54, 0x54, 0x50, + 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x28, 0x72, 0x65, 0x71, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x22, 0x47, 0x45, + 0x54, 0x22, 0x2c, 0x20, 0x22, 0x2f, 0x63, 0x67, + 0x69, 0x2d, 0x62, 0x69, 0x6e, 0x2f, 0x73, 0x65, + 0x74, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x3f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x20, 0x2b, 0x20, 0x73, 0x70, 0x65, 0x65, + 0x64, 0x5f, 0x74, 0x78, 0x74, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x2b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x26, + 0x69, 0x64, 0x22, 0x20, 0x2b, 0x20, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x28, 0x29, 0x2c, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x2e, + 0x6f, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, + 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x2e, + 0x73, 0x65, 0x6e, 0x64, 0x28, 0x6e, 0x75, 0x6c, + 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x65, + 0x64, 0x73, 0x74, 0x61, 0x74, 0x65, 0x47, 0x65, + 0x74, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x65, + 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x6c, + 0x65, 0x64, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x3d, + 0x20, 0x34, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x28, 0x6c, 0x65, 0x64, + 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, + 0x3d, 0x3d, 0x20, 0x32, 0x30, 0x30, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, + 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x6c, + 0x65, 0x64, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, + 0x29, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x22, 0x3c, + 0x64, 0x69, 0x76, 0x3e, 0x22, 0x20, 0x2b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x65, 0x64, 0x2e, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x65, + 0x78, 0x74, 0x20, 0x2b, 0x20, 0x22, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x22, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x28, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x58, 0x4d, 0x4c, 0x48, + 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x58, 0x4d, 0x4c, 0x48, + 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x20, 0x69, 0x66, 0x28, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x58, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x58, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, + 0x22, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, + 0x66, 0x74, 0x2e, 0x58, 0x4d, 0x4c, 0x48, 0x54, + 0x54, 0x50, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x28, 0x6c, 0x65, 0x64, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, + 0x64, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x22, + 0x47, 0x45, 0x54, 0x22, 0x2c, 0x20, 0x22, 0x2f, + 0x6c, 0x65, 0x64, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x3f, 0x69, 0x64, 0x3d, 0x22, 0x20, 0x2b, 0x20, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, + 0x64, 0x6f, 0x6d, 0x28, 0x29, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, + 0x64, 0x2e, 0x6f, 0x6e, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, + 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x64, 0x2e, + 0x73, 0x65, 0x6e, 0x64, 0x28, 0x6e, 0x75, 0x6c, + 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, + 0x65, 0x65, 0x64, 0x47, 0x65, 0x74, 0x28, 0x29, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, + 0x61, 0x72, 0x20, 0x72, 0x65, 0x71, 0x20, 0x3d, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, + 0x65, 0x64, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x72, 0x65, + 0x71, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x3d, 0x20, + 0x34, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x28, 0x72, 0x65, 0x71, 0x2e, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, + 0x3d, 0x20, 0x32, 0x30, 0x30, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, + 0x65, 0x65, 0x64, 0x22, 0x29, 0x2e, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x3d, 0x20, 0x22, 0x3c, 0x64, 0x69, 0x76, 0x3e, + 0x22, 0x20, 0x2b, 0x20, 0x72, 0x65, 0x71, 0x2e, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x54, 0x65, 0x78, 0x74, 0x20, 0x2b, 0x20, 0x22, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x22, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x58, 0x4d, + 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x20, + 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x58, 0x4d, + 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x28, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x58, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x71, 0x20, 0x3d, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x58, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x28, 0x22, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x58, 0x4d, 0x4c, + 0x48, 0x54, 0x54, 0x50, 0x22, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x28, 0x72, 0x65, 0x71, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x71, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x28, 0x22, 0x47, 0x45, 0x54, 0x22, 0x2c, 0x20, + 0x22, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x70, + 0x65, 0x65, 0x64, 0x3f, 0x69, 0x64, 0x3d, 0x22, + 0x20, 0x2b, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, + 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x29, + 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x71, 0x2e, 0x6f, 0x6e, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x71, 0x2e, 0x73, 0x65, 0x6e, + 0x64, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, + 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x61, 0x67, 0x65, 0x28, 0x70, 0x61, 0x67, 0x65, + 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x2e, 0x58, 0x4d, 0x4c, 0x48, 0x74, 0x74, + 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x78, 0x6d, 0x6c, 0x68, 0x74, 0x74, 0x70, 0x20, + 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x58, 0x4d, + 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x28, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, + 0x68, 0x74, 0x74, 0x70, 0x20, 0x3d, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x58, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x28, 0x22, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, + 0x6f, 0x66, 0x74, 0x2e, 0x58, 0x4d, 0x4c, 0x48, + 0x54, 0x54, 0x50, 0x22, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x68, 0x74, 0x74, + 0x70, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x22, + 0x47, 0x45, 0x54, 0x22, 0x2c, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6d, 0x6c, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x73, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x28, + 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2d, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x78, 0x2d, 0x77, 0x77, 0x77, 0x2d, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x75, 0x72, 0x6c, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6d, 0x6c, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x73, + 0x65, 0x6e, 0x64, 0x28, 0x29, 0x3b, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x68, + 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x6e, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x28, 0x78, + 0x6d, 0x6c, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x29, 0x20, + 0x26, 0x26, 0x20, 0x28, 0x78, 0x6d, 0x6c, 0x68, + 0x74, 0x74, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x30, + 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, + 0x64, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x29, 0x2e, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, + 0x20, 0x78, 0x6d, 0x6c, 0x68, 0x74, 0x74, 0x70, + 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x54, 0x65, 0x78, 0x74, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, + 0x0a, +}; + +static const uint8_t data_javascript_load_js[] = +{ + /* /javascript_load.js */ + 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x5f, 0x6c, 0x6f, 0x61, 0x64, + 0x2e, 0x6a, 0x73, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x0a, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6f, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, + 0x28, 0x27, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x27, + 0x29, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x41, 0x62, 0x6f, 0x75, 0x74, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, + 0x49, 0x64, 0x28, 0x27, 0x6f, 0x76, 0x65, 0x72, + 0x76, 0x69, 0x65, 0x77, 0x27, 0x29, 0x2e, 0x6f, + 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x76, 0x65, + 0x72, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, + 0x49, 0x64, 0x28, 0x27, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, + 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x69, 0x6f, + 0x5f, 0x68, 0x74, 0x74, 0x70, 0x27, 0x29, 0x2e, + 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, + 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x4f, + 0x48, 0x74, 0x74, 0x70, 0x3b, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x61, 0x67, 0x65, 0x28, 0x22, 0x61, 0x62, 0x6f, + 0x75, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x29, + 0x3b, 0x0a, 0x7d, 0x0a, +}; + +static const uint8_t data_overview_htm[] = +{ + /* /overview.htm */ + 0x2f, 0x6f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x68, 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x0a, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, + 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x3e, 0x0a, + 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x44, + 0x4b, 0x2d, 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, + 0x39, 0x58, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x4b, + 0x69, 0x74, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, + 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, + 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x2e, 0x63, + 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, + 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, + 0x22, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, + 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, + 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, + 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x2f, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, + 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, + 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x3e, + 0x54, 0x69, 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, + 0x64, 0x65, 0x3b, 0x20, 0x43, 0x20, 0x53, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x20, 0x50, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x20, 0x4c, 0x69, 0x6e, + 0x65, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x3c, 0x68, + 0x72, 0x3e, 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x0a, + 0x41, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x41, 0x52, 0x4d, + 0x26, 0x72, 0x65, 0x67, 0x3b, 0x20, 0x43, 0x6f, + 0x72, 0x74, 0x65, 0x78, 0x26, 0x74, 0x72, 0x61, + 0x64, 0x65, 0x3b, 0x2d, 0x4d, 0x34, 0x20, 0x6d, + 0x69, 0x63, 0x72, 0x6f, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x20, + 0x28, 0x4d, 0x43, 0x55, 0x73, 0x29, 0x20, 0x74, + 0x6f, 0x20, 0x62, 0x65, 0x0a, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, + 0x20, 0x6f, 0x6e, 0x20, 0x54, 0x49, 0x27, 0x73, + 0x20, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x65, + 0x74, 0x61, 0x72, 0x79, 0x20, 0x36, 0x35, 0x2d, + 0x6e, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x2c, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x54, 0x69, 0x76, 0x61, 0x20, + 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x73, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x69, + 0x74, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, + 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x77, 0x69, + 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x73, 0x61, + 0x63, 0x72, 0x69, 0x66, 0x69, 0x63, 0x69, 0x6e, + 0x67, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2c, + 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x6f, 0x72, + 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x20, 0x45, 0x76, 0x65, 0x72, + 0x79, 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x0a, 0x4d, 0x43, 0x55, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x68, 0x69, 0x67, 0x68, + 0x2d, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x61, + 0x6c, 0x6f, 0x67, 0x20, 0x77, 0x68, 0x69, 0x6c, + 0x65, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x0a, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x6c, 0x6f, 0x77, 0x2d, 0x70, 0x6f, + 0x77, 0x65, 0x72, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x61, 0x20, 0x67, 0x72, 0x65, + 0x61, 0x74, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x54, 0x6f, + 0x64, 0x61, 0x79, 0x27, 0x73, 0x0a, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x73, 0x20, + 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x73, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, + 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, + 0x6e, 0x20, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, + 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x65, + 0x2e, 0x20, 0x4f, 0x66, 0x74, 0x65, 0x6e, 0x2c, + 0x20, 0x74, 0x68, 0x65, 0x0a, 0x67, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x63, 0x68, + 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x20, + 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x0a, + 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, + 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, + 0x76, 0x61, 0x77, 0x61, 0x72, 0x65, 0x22, 0x3e, + 0x54, 0x69, 0x76, 0x61, 0x57, 0x61, 0x72, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x43, 0x20, 0x53, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x0a, 0x66, + 0x72, 0x65, 0x65, 0x20, 0x6c, 0x69, 0x62, 0x72, + 0x61, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x43, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x62, 0x6f, 0x74, 0x68, + 0x20, 0x70, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, + 0x72, 0x61, 0x6c, 0x2d, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2d, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x63, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x52, 0x4f, + 0x4d, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x76, + 0x65, 0x72, 0x79, 0x20, 0x54, 0x69, 0x76, 0x61, + 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x20, 0x4d, 0x43, 0x55, 0x2e, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x0a, 0x6f, 0x66, 0x66, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x20, 0x55, 0x53, + 0x42, 0x2c, 0x20, 0x43, 0x41, 0x4e, 0x2c, 0x20, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, + 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x20, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x20, 0x73, 0x6f, 0x0a, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x73, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, + 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x73, 0x20, + 0x6f, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, + 0x20, 0x6f, 0x66, 0x0a, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x20, 0x70, 0x65, 0x72, 0x69, 0x70, + 0x68, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x2e, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x54, 0x69, 0x76, 0x61, + 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x73, 0x20, 0x61, 0x6e, 0x0a, 0x65, 0x78, + 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x74, 0x20, + 0x62, 0x61, 0x73, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x68, 0x6f, 0x6d, + 0x65, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, + 0x69, 0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, + 0x3e, 0x0a, +}; + +static const uint8_t data_perror_htm[] = +{ + /* /perror.htm */ + 0x2f, 0x70, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x68, 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x0a, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, + 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, + 0x75, 0x69, 0x76, 0x3d, 0x22, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x63, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x55, 0x54, + 0x46, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3e, 0x46, 0x6f, 0x72, 0x6d, 0x20, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3c, 0x2f, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, + 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x73, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, + 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x68, 0x6f, 0x72, + 0x74, 0x63, 0x75, 0x74, 0x20, 0x69, 0x63, 0x6f, + 0x6e, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78, + 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x66, 0x61, 0x76, + 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, + 0x73, 0x72, 0x63, 0x3d, 0x22, 0x6a, 0x61, 0x76, + 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x6a, 0x73, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, + 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x4a, 0x61, + 0x76, 0x61, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x31, 0x2e, 0x32, 0x22, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75, 0x74, + 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x3c, 0x2f, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, + 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, + 0x25, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x61, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x22, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, + 0x6d, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x74, 0x69, 0x2e, 0x6a, + 0x70, 0x67, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, + 0x22, 0x54, 0x65, 0x78, 0x61, 0x73, 0x20, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x64, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, + 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, + 0x31, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x54, 0x69, 0x76, 0x61, 0x26, 0x74, + 0x72, 0x61, 0x64, 0x65, 0x3b, 0x20, 0x43, 0x20, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, 0x54, + 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, + 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x4b, 0x69, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x68, 0x32, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x44, 0x4b, 0x2d, 0x54, 0x4d, + 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x61, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x76, 0x61, + 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x69, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x76, + 0x61, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x74, 0x6d, 0x34, 0x63, + 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20, 0x61, 0x6c, + 0x74, 0x3d, 0x22, 0x54, 0x4d, 0x34, 0x43, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x61, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, + 0x72, 0x3e, 0x3c, 0x68, 0x72, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, + 0x65, 0x6e, 0x75, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x75, 0x6c, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x61, 0x62, + 0x6f, 0x75, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x22, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x61, 0x62, 0x6f, + 0x75, 0x74, 0x22, 0x3e, 0x41, 0x62, 0x6f, 0x75, + 0x74, 0x20, 0x54, 0x49, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x6f, 0x76, 0x65, 0x72, 0x76, + 0x69, 0x65, 0x77, 0x2e, 0x68, 0x74, 0x6d, 0x22, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6f, 0x76, 0x65, + 0x72, 0x76, 0x69, 0x65, 0x77, 0x22, 0x3e, 0x54, + 0x69, 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, + 0x65, 0x3b, 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x20, 0x4f, 0x76, 0x65, 0x72, + 0x76, 0x69, 0x65, 0x77, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, + 0x3e, 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, + 0x58, 0x4e, 0x43, 0x5a, 0x41, 0x44, 0x20, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x44, 0x69, 0x61, + 0x67, 0x72, 0x61, 0x6d, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x74, 0x6f, 0x6f, 0x6c, 0x2f, 0x64, 0x6b, 0x2d, + 0x74, 0x6d, 0x34, 0x63, 0x31, 0x32, 0x39, 0x78, + 0x22, 0x3e, 0x44, 0x4b, 0x2d, 0x54, 0x4d, 0x34, + 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, 0x50, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x50, 0x61, + 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, + 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, + 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, + 0x76, 0x61, 0x2d, 0x63, 0x22, 0x3e, 0x54, 0x69, + 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, + 0x3b, 0x20, 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, + 0x39, 0x78, 0x20, 0x46, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x20, 0x50, 0x61, 0x67, 0x65, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6f, 0x5f, + 0x68, 0x74, 0x74, 0x70, 0x2e, 0x68, 0x74, 0x6d, + 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x6f, + 0x5f, 0x68, 0x74, 0x74, 0x70, 0x22, 0x3e, 0x49, + 0x2f, 0x4f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x20, 0x44, 0x65, 0x6d, 0x6f, 0x20, + 0x31, 0x3c, 0x62, 0x72, 0x3e, 0x28, 0x48, 0x54, + 0x54, 0x50, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x29, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x69, 0x6f, 0x5f, 0x63, 0x67, + 0x69, 0x2e, 0x73, 0x73, 0x69, 0x22, 0x3e, 0x49, + 0x2f, 0x4f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x20, 0x44, 0x65, 0x6d, 0x6f, 0x20, + 0x32, 0x3c, 0x62, 0x72, 0x3e, 0x28, 0x53, 0x53, + 0x49, 0x2f, 0x43, 0x47, 0x49, 0x29, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x75, 0x6c, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x64, 0x6b, 0x2d, 0x74, + 0x6d, 0x34, 0x63, 0x31, 0x32, 0x39, 0x78, 0x2e, + 0x6a, 0x70, 0x67, 0x22, 0x20, 0x61, 0x6c, 0x74, + 0x3d, 0x22, 0x44, 0x4b, 0x2d, 0x54, 0x4d, 0x34, + 0x43, 0x31, 0x32, 0x39, 0x58, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x22, + 0x20, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, + 0x22, 0x74, 0x6f, 0x70, 0x22, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x37, 0x35, 0x25, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x68, 0x32, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x68, 0x72, 0x20, 0x73, 0x69, + 0x7a, 0x65, 0x3d, 0x22, 0x32, 0x22, 0x20, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, + 0x30, 0x25, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, + 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x4f, 0x6f, + 0x70, 0x73, 0x20, 0x2d, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x62, 0x72, 0x3e, 0x77, 0x61, 0x73, + 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2c, + 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x75, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x2e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, + 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x50, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x20, 0x74, 0x72, 0x79, + 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x21, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x66, 0x6f, 0x6f, 0x74, + 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x72, 0x3e, + 0x3c, 0x68, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x26, 0x63, 0x6f, + 0x70, 0x79, 0x3b, 0x20, 0x32, 0x30, 0x31, 0x33, + 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, + 0x78, 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, + 0x49, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, + 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0x0a, +}; + +static const uint8_t data_styles_css[] = +{ + /* /styles.css */ + 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x2e, + 0x63, 0x73, 0x73, 0x00, + 0x2f, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, + 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, 0x32, 0x30, + 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, 0x61, 0x73, + 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, 0x6e, 0x63, + 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, 0x6c, 0x20, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, + 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x2f, 0x2a, 0x20, + 0x53, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x20, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x20, 0x2a, 0x2f, 0x0a, 0x62, 0x6f, 0x64, 0x79, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x62, 0x6c, 0x61, 0x63, 0x6b, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x3a, 0x20, 0x41, 0x72, 0x69, 0x65, 0x6c, + 0x2c, 0x48, 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, + 0x63, 0x61, 0x2c, 0x73, 0x61, 0x6e, 0x73, 0x2d, + 0x73, 0x65, 0x72, 0x69, 0x66, 0x3b, 0x0a, 0x7d, + 0x0a, 0x0a, 0x2f, 0x2a, 0x20, 0x53, 0x74, 0x79, + 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x69, 0x76, + 0x2e, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x68, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x0a, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, + 0x72, 0x3a, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x68, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x31, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, + 0x3a, 0x20, 0x32, 0x65, 0x6d, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, + 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, + 0x0a, 0x23, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x68, 0x32, 0x0a, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31, 0x2e, + 0x32, 0x35, 0x65, 0x6d, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x62, + 0x6f, 0x6c, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, + 0x23, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x68, 0x72, 0x0a, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, + 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x20, 0x23, 0x66, 0x66, 0x30, 0x30, + 0x30, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, + 0x6f, 0x70, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x66, + 0x66, 0x30, 0x30, 0x30, 0x30, 0x3b, 0x0a, 0x7d, + 0x0a, 0x0a, 0x23, 0x68, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x61, 0x20, 0x69, 0x6d, 0x67, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x30, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x20, + 0x53, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x64, 0x69, 0x76, + 0x2e, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x6d, 0x65, + 0x6e, 0x75, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, + 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, + 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x20, 0x32, 0x32, 0x35, 0x70, 0x78, 0x3b, + 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x6d, 0x65, 0x6e, + 0x75, 0x20, 0x75, 0x6c, 0x0a, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x2d, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2d, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x3b, + 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x6d, 0x65, 0x6e, + 0x75, 0x20, 0x61, 0x3a, 0x6c, 0x69, 0x6e, 0x6b, + 0x2c, 0x20, 0x23, 0x6d, 0x65, 0x6e, 0x75, 0x20, + 0x61, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, + 0x64, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x66, 0x66, 0x30, 0x30, 0x30, + 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x3a, 0x20, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x20, 0x62, 0x6f, 0x6c, 0x64, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, + 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x32, 0x70, 0x78, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, + 0x3a, 0x20, 0x32, 0x70, 0x78, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x3a, 0x20, 0x34, 0x70, 0x78, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, + 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6e, 0x6f, + 0x6e, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x32, + 0x30, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x7d, 0x0a, + 0x0a, 0x23, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x20, + 0x23, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, 0x3a, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x0a, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, + 0x62, 0x66, 0x30, 0x30, 0x30, 0x30, 0x3b, 0x0a, + 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x20, 0x53, 0x74, + 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x69, + 0x76, 0x2e, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x0a, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x20, 0x32, 0x32, 0x35, 0x70, 0x78, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x0a, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31, + 0x2e, 0x35, 0x65, 0x6d, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x62, + 0x6f, 0x6c, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, + 0x2f, 0x2a, 0x20, 0x53, 0x74, 0x79, 0x6c, 0x69, + 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6f, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x64, 0x69, 0x76, 0x2e, 0x20, + 0x2a, 0x2f, 0x0a, 0x23, 0x66, 0x6f, 0x6f, 0x74, + 0x69, 0x6e, 0x67, 0x0a, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x3a, + 0x20, 0x62, 0x6f, 0x74, 0x68, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x2e, 0x37, + 0x35, 0x65, 0x6d, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3a, 0x20, 0x69, 0x74, 0x61, + 0x6c, 0x69, 0x63, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, + 0x66, 0x6f, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x68, 0x72, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, + 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x20, 0x23, 0x66, 0x66, 0x30, 0x30, 0x30, + 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, + 0x70, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x66, 0x66, + 0x30, 0x30, 0x30, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, + +}; + +static const uint8_t data_ti_jpg[] = +{ + /* /ti.jpg */ + 0x2f, 0x74, 0x69, 0x2e, 0x6a, 0x70, 0x67, 0x00, + + 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, + 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, + 0x00, 0x48, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43, + 0x00, 0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x03, + 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x05, + 0x08, 0x05, 0x05, 0x04, 0x04, 0x05, 0x0a, 0x07, + 0x07, 0x06, 0x08, 0x0c, 0x0a, 0x0c, 0x0c, 0x0b, + 0x0a, 0x0b, 0x0b, 0x0d, 0x0e, 0x12, 0x10, 0x0d, + 0x0e, 0x11, 0x0e, 0x0b, 0x0b, 0x10, 0x16, 0x10, + 0x11, 0x13, 0x14, 0x15, 0x15, 0x15, 0x0c, 0x0f, + 0x17, 0x18, 0x16, 0x14, 0x18, 0x12, 0x14, 0x15, + 0x14, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x03, 0x04, + 0x04, 0x05, 0x04, 0x05, 0x09, 0x05, 0x05, 0x09, + 0x14, 0x0d, 0x0b, 0x0d, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xff, 0xc2, + 0x00, 0x11, 0x08, 0x00, 0x4b, 0x01, 0x16, 0x03, + 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, + 0x01, 0xff, 0xc4, 0x00, 0x1c, 0x00, 0x01, 0x00, + 0x02, 0x02, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x07, 0x05, 0x08, 0x01, 0x02, 0x04, 0x03, 0xff, + 0xc4, 0x00, 0x1c, 0x01, 0x01, 0x00, 0x01, 0x05, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0x02, + 0x03, 0x04, 0x06, 0x07, 0x08, 0xff, 0xda, 0x00, + 0x0c, 0x03, 0x01, 0x00, 0x02, 0x10, 0x03, 0x10, + 0x00, 0x00, 0x01, 0xda, 0x90, 0x62, 0xec, 0xda, + 0x80, 0xea, 0x74, 0xb2, 0xbc, 0xf0, 0x92, 0x4c, + 0xf1, 0x5c, 0xab, 0xd8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0b, + 0xd6, 0xe8, 0x35, 0x63, 0x9d, 0xf6, 0x9b, 0xc2, + 0x67, 0xcd, 0x7d, 0x2d, 0x6b, 0x47, 0x7f, 0x91, + 0xf5, 0xd7, 0x0f, 0xda, 0xeb, 0x7e, 0x27, 0x53, + 0xb1, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x02, 0x90, 0xbd, 0x79, 0xfd, + 0x59, 0xe7, 0x3d, 0xb2, 0x67, 0xb9, 0xcd, 0xe4, + 0x32, 0xe9, 0xe1, 0xb0, 0xc8, 0xc9, 0x33, 0x45, + 0x6c, 0x64, 0xcf, 0x94, 0x54, 0x35, 0xae, 0xbc, + 0x96, 0x91, 0x35, 0x33, 0x86, 0x4c, 0xf2, 0x19, + 0x23, 0xd8, 0x60, 0x8f, 0x11, 0x63, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x16, 0xcd, 0xca, 0x32, + 0x23, 0xd2, 0x31, 0x96, 0x6e, 0xc1, 0x74, 0xba, + 0xad, 0x86, 0x9a, 0xf2, 0x3a, 0xff, 0x00, 0x53, + 0xa9, 0xf9, 0xd3, 0x2c, 0x6b, 0x5e, 0x5f, 0x6d, + 0x7a, 0x3f, 0x0d, 0xf4, 0x56, 0xdd, 0x47, 0x26, + 0x27, 0xb0, 0xb3, 0x8d, 0x50, 0x36, 0xa4, 0xad, + 0x48, 0xd9, 0x8f, 0x24, 0xe6, 0xc5, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x55, 0xb4, 0x74, 0x5f, + 0xa3, 0x53, 0x11, 0x5e, 0x8d, 0xc5, 0x69, 0x62, + 0xee, 0xf1, 0xbc, 0xd6, 0xea, 0xef, 0x43, 0xb0, + 0xeb, 0x75, 0x37, 0x2f, 0xa5, 0xf9, 0xf7, 0xdf, + 0x76, 0x0d, 0x36, 0x56, 0x74, 0x65, 0x8f, 0x69, + 0x16, 0x31, 0x06, 0x64, 0xaf, 0xcb, 0x80, 0xad, + 0x0d, 0xb8, 0x3e, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xe1, 0xb3, 0x2d, 0x3f, 0x1d, 0xdd, 0xfa, + 0xee, 0xc3, 0xf0, 0x64, 0x9d, 0xed, 0x73, 0x34, + 0x44, 0x57, 0xa6, 0x5d, 0xb2, 0x7e, 0x77, 0x37, + 0xda, 0xe7, 0xc6, 0xbe, 0x97, 0xf1, 0xc8, 0x39, + 0x38, 0x3b, 0x1c, 0x00, 0x77, 0x39, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xc2, 0x9d, 0x29, 0x76, + 0xa6, 0x73, 0xde, 0xe1, 0x80, 0xc5, 0x2d, 0xb8, + 0x7d, 0x1f, 0x81, 0x64, 0xb2, 0x6a, 0xf2, 0x0d, + 0x47, 0x33, 0x25, 0x90, 0x57, 0x06, 0x54, 0x90, + 0x95, 0x69, 0x6c, 0x15, 0x31, 0x99, 0x3b, 0x1b, + 0x18, 0x51, 0x24, 0x54, 0xb4, 0x48, 0xe9, 0x0d, + 0x2e, 0x12, 0x86, 0x2e, 0xf3, 0x18, 0x56, 0xa4, + 0xf8, 0xe0, 0xb4, 0x89, 0x70, 0x01, 0x48, 0xde, + 0x09, 0x5a, 0x72, 0x37, 0xbc, 0xd8, 0x29, 0x8f, + 0x31, 0xfa, 0xd6, 0xd0, 0x35, 0x1c, 0xb3, 0xca, + 0xf8, 0xc9, 0x1f, 0x33, 0x2e, 0x47, 0x8d, 0x99, + 0x34, 0xd0, 0xce, 0x19, 0x53, 0x66, 0xca, 0x04, + 0x81, 0x12, 0xa3, 0x2c, 0x57, 0x26, 0xc4, 0x90, + 0xc2, 0x8d, 0x37, 0x00, 0xd7, 0xd3, 0x60, 0x0a, + 0x2c, 0x93, 0x97, 0xc0, 0x00, 0x00, 0x01, 0xc1, + 0x48, 0x92, 0x12, 0xc9, 0x2b, 0x53, 0x08, 0x4d, + 0xc8, 0x71, 0x66, 0x15, 0xf1, 0xd4, 0xfa, 0x98, + 0xa2, 0x6e, 0x7c, 0x4e, 0x86, 0x18, 0x8d, 0x12, + 0x33, 0xde, 0x4a, 0x8f, 0xb9, 0x58, 0x96, 0x01, + 0x5d, 0x13, 0xf2, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xff, 0xc4, 0x00, 0x2b, 0x10, 0x00, 0x01, + 0x04, 0x02, 0x01, 0x01, 0x06, 0x06, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, + 0x03, 0x04, 0x06, 0x01, 0x07, 0x00, 0x13, 0x10, + 0x11, 0x12, 0x36, 0x37, 0x40, 0x14, 0x15, 0x17, + 0x30, 0x31, 0x34, 0x16, 0x20, 0x50, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, 0x05, 0x02, + 0xec, 0x26, 0x41, 0xb1, 0x70, 0xfe, 0xa1, 0x8d, + 0xe0, 0x53, 0xf1, 0xce, 0xa7, 0xbf, 0x98, 0xf7, + 0xf7, 0x1f, 0x2e, 0xf3, 0x5c, 0xaf, 0x09, 0x6a, + 0xd4, 0x24, 0x89, 0x32, 0x51, 0xfc, 0x11, 0x98, + 0x4b, 0x89, 0x56, 0x78, 0xa7, 0x50, 0x9c, 0xfc, + 0x43, 0x7c, 0x4b, 0xa8, 0x56, 0x7d, 0xcd, 0xc7, + 0xcb, 0xbc, 0xad, 0x8a, 0x91, 0x24, 0x9b, 0x39, + 0xc9, 0x7b, 0x9d, 0x85, 0x12, 0x72, 0x4e, 0x81, + 0x9c, 0xe4, 0xe7, 0x24, 0xeb, 0x68, 0x25, 0x48, + 0x2e, 0xb1, 0x0f, 0x1b, 0x28, 0xc0, 0x10, 0x34, + 0x59, 0xf8, 0xda, 0x21, 0x7c, 0x0f, 0x5e, 0x46, + 0xb0, 0x22, 0xbf, 0x68, 0x85, 0x66, 0x68, 0x75, + 0xc2, 0x19, 0x42, 0x47, 0xec, 0x90, 0x6b, 0x31, + 0x03, 0x19, 0x8a, 0x78, 0x79, 0xdb, 0x98, 0xca, + 0xf3, 0xc2, 0xaf, 0xe2, 0x0b, 0xcb, 0xfb, 0xe5, + 0x9e, 0x90, 0xc0, 0xef, 0xa8, 0x24, 0xb8, 0x46, + 0xe3, 0x38, 0x9c, 0x3e, 0x00, 0x3b, 0x13, 0x00, + 0x69, 0x7e, 0x06, 0xa7, 0xdb, 0xcf, 0x32, 0x69, + 0xc0, 0x85, 0x54, 0x1c, 0x8b, 0x2e, 0x75, 0x9a, + 0xe3, 0xbe, 0xb6, 0x6e, 0xaf, 0x2f, 0x0c, 0xbd, + 0xb4, 0x3a, 0xbb, 0x00, 0x74, 0x29, 0xa1, 0x55, + 0x3a, 0x7e, 0xb1, 0x39, 0x55, 0x04, 0xc8, 0x11, + 0x25, 0xa1, 0x26, 0xef, 0x72, 0xd4, 0x64, 0x57, + 0x02, 0x69, 0xf7, 0xc9, 0x52, 0x6f, 0x10, 0xb6, + 0x1d, 0x7a, 0xcd, 0x37, 0xd8, 0x5d, 0xeb, 0x8d, + 0xb0, 0xdf, 0x60, 0xc4, 0x2a, 0x3d, 0x4e, 0x0c, + 0x57, 0x63, 0xd5, 0x33, 0x8c, 0xa7, 0x3c, 0x83, + 0xfa, 0x7c, 0x70, 0x8c, 0x7c, 0xed, 0xad, 0xcd, + 0x21, 0xb7, 0x84, 0x86, 0xd8, 0x81, 0xe2, 0x03, + 0xfa, 0x88, 0xc3, 0x22, 0x23, 0x55, 0x22, 0x9d, + 0xa5, 0x50, 0xef, 0xd9, 0x1a, 0x16, 0x9b, 0x51, + 0x8c, 0x78, 0x49, 0xc8, 0x88, 0xa3, 0xde, 0xdb, + 0xd8, 0xa8, 0x83, 0x3a, 0xda, 0xec, 0x1b, 0xcc, + 0xf6, 0x51, 0xd3, 0x67, 0xef, 0xcc, 0x8a, 0x89, + 0xb1, 0xa1, 0xeb, 0xdc, 0xa2, 0x75, 0xb2, 0xab, + 0x19, 0x03, 0xea, 0x56, 0x31, 0xf0, 0x85, 0x2a, + 0xce, 0x2b, 0x09, 0x18, 0x0e, 0x55, 0x96, 0x68, + 0xda, 0x80, 0xe1, 0xfc, 0xc6, 0x31, 0x8c, 0x67, + 0xf0, 0xab, 0xc1, 0x24, 0x5a, 0x7c, 0x18, 0xce, + 0x3a, 0x68, 0xe7, 0x4d, 0x1c, 0xf0, 0x27, 0xbb, + 0xa6, 0x8e, 0x61, 0x29, 0x4f, 0x3c, 0x09, 0xcf, + 0x3c, 0x09, 0xee, 0x4a, 0x12, 0x8f, 0x66, 0xa4, + 0x61, 0x69, 0xb0, 0x0a, 0x50, 0x82, 0x6d, 0x23, + 0xaa, 0xe0, 0xe8, 0x4d, 0x8e, 0x87, 0xda, 0xef, + 0xad, 0x9b, 0x26, 0x61, 0x81, 0xa7, 0xe9, 0x96, + 0xe6, 0x6e, 0x22, 0x85, 0xd8, 0xa7, 0x09, 0xaa, + 0xd7, 0x82, 0x4f, 0xb0, 0x0d, 0xc0, 0xab, 0x2c, + 0x98, 0x07, 0x7e, 0x70, 0x26, 0xe0, 0xd0, 0x02, + 0xc2, 0xe4, 0xd0, 0xbe, 0x73, 0x70, 0xe3, 0x67, + 0xcc, 0xd5, 0x2e, 0xe5, 0xe5, 0xce, 0x6f, 0x66, + 0x11, 0x63, 0xac, 0x3e, 0xb4, 0xf4, 0xc2, 0x1a, + 0xf7, 0x5f, 0xdb, 0x49, 0xb3, 0x61, 0xd9, 0x07, + 0x25, 0x0e, 0x1d, 0xac, 0xdf, 0x96, 0x78, 0x0d, + 0x1f, 0x06, 0x2d, 0x92, 0x06, 0x82, 0x28, 0x28, + 0xc4, 0xcb, 0x49, 0xba, 0xd5, 0x96, 0xc8, 0x6d, + 0x05, 0x68, 0xf0, 0xc4, 0x17, 0x37, 0x0c, 0x5e, + 0x4c, 0x4f, 0xbb, 0x16, 0x9c, 0x62, 0x8a, 0x04, + 0x25, 0x7e, 0x79, 0x68, 0x15, 0x76, 0xc8, 0xb0, + 0x2f, 0xfa, 0x1a, 0x06, 0xc1, 0xb8, 0xd9, 0xa0, + 0x91, 0x65, 0xf6, 0xf1, 0x9c, 0x27, 0xb5, 0xdf, + 0x5b, 0x0e, 0xfa, 0x95, 0x75, 0xab, 0xc9, 0xaa, + 0x93, 0xa1, 0x3f, 0x06, 0x7d, 0x4a, 0x66, 0x9a, + 0xe9, 0x2f, 0x58, 0x1c, 0x24, 0xfc, 0xcb, 0x9f, + 0xaa, 0xd3, 0x3f, 0x53, 0x59, 0x0d, 0x27, 0x3d, + 0x14, 0x95, 0xc7, 0x6e, 0xee, 0x73, 0x3d, 0x3d, + 0xc7, 0x31, 0x58, 0x4c, 0x4a, 0x6f, 0xa5, 0x76, + 0x50, 0xeb, 0xc5, 0x24, 0x7b, 0xae, 0xda, 0x60, + 0x69, 0xcf, 0x2b, 0xeb, 0x80, 0x1f, 0x3c, 0x96, + 0x0a, 0xbd, 0x8a, 0xcc, 0x9a, 0xd4, 0x06, 0x09, + 0x9c, 0xb1, 0x8e, 0x23, 0x40, 0x55, 0x5b, 0xcb, + 0x35, 0xbf, 0x58, 0x2c, 0x4d, 0x8e, 0x95, 0x0a, + 0x5e, 0x9c, 0x72, 0x2a, 0xf5, 0x49, 0xf9, 0xc5, + 0x62, 0xfd, 0x9c, 0xfe, 0x33, 0xae, 0x1f, 0x51, + 0xd2, 0x35, 0x19, 0x53, 0xcf, 0xb8, 0xda, 0x5d, + 0x42, 0x68, 0x30, 0x9b, 0x07, 0x9a, 0x01, 0x06, + 0x31, 0x59, 0xaa, 0x43, 0xab, 0x45, 0x2b, 0xaf, + 0xde, 0x2c, 0x7a, 0x64, 0x59, 0x32, 0x06, 0xd4, + 0x68, 0x79, 0xa8, 0xc9, 0xb5, 0x6b, 0xc8, 0xf6, + 0x39, 0xa5, 0x68, 0x4d, 0x9e, 0x85, 0x9a, 0x01, + 0x29, 0x28, 0x95, 0x5a, 0x4f, 0xf1, 0xe1, 0xd5, + 0x8f, 0x86, 0xae, 0xaa, 0xab, 0xd3, 0xab, 0xd7, + 0x29, 0x2f, 0xd6, 0x20, 0x8f, 0xd5, 0xae, 0x8a, + 0x5c, 0x2a, 0x33, 0xed, 0x11, 0x01, 0x52, 0x90, + 0x0c, 0xa9, 0xc0, 0x91, 0xac, 0x03, 0x87, 0x40, + 0x50, 0xe1, 0x30, 0x35, 0xeb, 0xd0, 0x0f, 0xd8, + 0x81, 0x35, 0x63, 0x16, 0xba, 0x01, 0x2c, 0x26, + 0xb7, 0x59, 0x87, 0x57, 0x83, 0xfe, 0x1f, 0xff, + 0xc4, 0x00, 0x33, 0x11, 0x00, 0x01, 0x03, 0x03, + 0x02, 0x04, 0x03, 0x03, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x00, 0x05, 0x11, 0x12, 0x31, 0x06, 0x21, 0x40, + 0x41, 0x13, 0x14, 0x61, 0x50, 0x52, 0x71, 0x10, + 0x16, 0x22, 0x25, 0x32, 0x33, 0x35, 0x42, 0x51, + 0x60, 0x91, 0xb1, 0xe1, 0xff, 0xda, 0x00, 0x08, + 0x01, 0x03, 0x01, 0x01, 0x3f, 0x01, 0xf9, 0x22, + 0xc6, 0x5c, 0xc7, 0x43, 0x2d, 0xee, 0x6b, 0xe6, + 0xb5, 0xc0, 0x8c, 0x8d, 0x3f, 0xcf, 0xf9, 0x57, + 0x0b, 0x63, 0xd6, 0xd5, 0x25, 0x0f, 0x63, 0x9f, + 0xe9, 0x5b, 0xf6, 0xf6, 0x05, 0x87, 0xf1, 0x16, + 0xeb, 0xf2, 0xd7, 0x16, 0x65, 0x4e, 0xb6, 0xac, + 0x76, 0xab, 0x34, 0xc8, 0x71, 0x23, 0xa8, 0x3c, + 0x32, 0xa3, 0xe9, 0x4e, 0x6a, 0x75, 0xc2, 0xb4, + 0x8e, 0x46, 0x8a, 0x14, 0x9e, 0x6a, 0x1d, 0x75, + 0x84, 0xfd, 0x60, 0xdd, 0x76, 0xab, 0xc4, 0xe6, + 0x1b, 0x8c, 0xea, 0x0a, 0xc6, 0xac, 0x6d, 0x4b, + 0x4f, 0x91, 0xb3, 0x60, 0xfb, 0xbf, 0xdd, 0x59, + 0xd5, 0x1c, 0xc6, 0x43, 0x4d, 0xab, 0x24, 0x6f, + 0x5c, 0x4e, 0x94, 0xa6, 0x17, 0x2f, 0x7b, 0xac, + 0x86, 0x86, 0x9d, 0x7d, 0x08, 0x78, 0xe0, 0x1a, + 0x1c, 0x2d, 0x08, 0x8c, 0x85, 0x9c, 0x54, 0x4e, + 0x1e, 0x8f, 0x11, 0xe4, 0xbc, 0xda, 0x8e, 0x45, + 0x27, 0xb0, 0xab, 0x95, 0xbd, 0xff, 0x00, 0x3c, + 0x16, 0xe6, 0xcb, 0x55, 0x71, 0x06, 0xb5, 0xc7, + 0x6e, 0x22, 0x3e, 0xd2, 0x8e, 0x2a, 0xc3, 0x6b, + 0x76, 0xdc, 0x95, 0x99, 0x1b, 0x9a, 0xba, 0x43, + 0x4c, 0xd8, 0xab, 0x6e, 0x94, 0x9f, 0x0d, 0x65, + 0x1d, 0x5f, 0x3e, 0xd5, 0xc3, 0xb7, 0x65, 0xa9, + 0x5e, 0x55, 0xf3, 0xf0, 0xaf, 0x4a, 0x07, 0x35, + 0x39, 0x68, 0x72, 0xea, 0xca, 0x16, 0x79, 0x24, + 0x13, 0x52, 0x9e, 0x66, 0x45, 0xd5, 0x94, 0xea, + 0xfa, 0x29, 0x19, 0xa4, 0xa8, 0x29, 0x20, 0x8a, + 0x73, 0x48, 0x07, 0x34, 0xff, 0x00, 0xdf, 0x2b, + 0xe3, 0xd6, 0x32, 0xea, 0xa3, 0xb8, 0x97, 0x51, + 0xb8, 0xa7, 0xf8, 0xa0, 0xa9, 0x8d, 0x0d, 0x27, + 0x0b, 0x3d, 0xea, 0xcb, 0x7c, 0x79, 0x52, 0x43, + 0x52, 0x55, 0x90, 0x6a, 0xfd, 0x6a, 0x98, 0xec, + 0xb2, 0xeb, 0x69, 0xc8, 0x22, 0x85, 0xa6, 0x69, + 0x23, 0x2d, 0x9a, 0x97, 0x72, 0x66, 0xcc, 0xc2, + 0x59, 0x3c, 0xd5, 0x8d, 0xaa, 0x55, 0xfa, 0x64, + 0xb2, 0x46, 0xad, 0x23, 0xd3, 0xaf, 0x07, 0x49, + 0x04, 0x76, 0xab, 0x4c, 0xd1, 0x3e, 0x28, 0x20, + 0xf3, 0x1b, 0xd3, 0xae, 0x16, 0xdb, 0x2b, 0xa9, + 0x32, 0x17, 0x29, 0xe5, 0x3a, 0xbe, 0xfe, 0xc1, + 0xb7, 0xdc, 0x1d, 0xb7, 0xb9, 0xe2, 0x37, 0x47, + 0x89, 0xa2, 0x3a, 0xde, 0x95, 0xa4, 0xd2, 0xb0, + 0x49, 0x23, 0x6f, 0xdc, 0x7f, 0xff, 0xc4, 0x00, + 0x27, 0x11, 0x00, 0x02, 0x02, 0x01, 0x02, 0x04, + 0x07, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x03, 0x11, 0x04, + 0x12, 0x10, 0x21, 0x31, 0x40, 0x13, 0x14, 0x22, + 0x32, 0x41, 0x50, 0x61, 0x42, 0x60, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x02, 0x01, 0x01, 0x3f, 0x01, + 0xe0, 0xcc, 0x10, 0x64, 0xcf, 0x37, 0x5e, 0x25, + 0x76, 0xa5, 0xbc, 0xd7, 0xe8, 0x6f, 0xf6, 0x70, + 0xd2, 0x74, 0x9a, 0x94, 0x66, 0x71, 0xb4, 0xc1, + 0x85, 0x18, 0x80, 0x83, 0xdf, 0x5f, 0xec, 0xe1, + 0x45, 0x67, 0x3b, 0xa6, 0x4b, 0xdf, 0xf9, 0x2f, + 0xdc, 0x2c, 0x9a, 0x3c, 0xee, 0xef, 0x1c, 0x95, + 0x19, 0x10, 0xea, 0xdc, 0x46, 0xd4, 0xb3, 0xae, + 0x0c, 0x12, 0x9b, 0x57, 0xc3, 0x38, 0x9a, 0x4e, + 0xac, 0xe6, 0x6a, 0x2e, 0x5b, 0x71, 0x89, 0x43, + 0xec, 0x78, 0x0e, 0x46, 0x7b, 0xcd, 0x55, 0x3f, + 0xd0, 0x83, 0x82, 0x7a, 0x68, 0x62, 0x3e, 0x62, + 0xa9, 0x5a, 0x1b, 0x97, 0x59, 0xd3, 0x94, 0x1d, + 0x62, 0x72, 0x51, 0xde, 0x38, 0xdc, 0x31, 0x06, + 0x93, 0xd5, 0xf9, 0x35, 0x1a, 0x75, 0x0b, 0x94, + 0x9a, 0x7b, 0x50, 0x26, 0xd3, 0x0d, 0xf5, 0xe3, + 0xac, 0x5a, 0x9a, 0xe6, 0xcc, 0x4d, 0x3a, 0x2f, + 0xc7, 0x7e, 0x46, 0x79, 0x19, 0xa8, 0xaf, 0xc3, + 0x7e, 0x50, 0x28, 0x26, 0x22, 0xec, 0x50, 0x3e, + 0x86, 0xda, 0x85, 0x83, 0x13, 0xc9, 0xb2, 0xb0, + 0xc4, 0x1c, 0xbf, 0xd1, 0xff, 0x00, 0xff, 0xc4, + 0x00, 0x49, 0x10, 0x00, 0x01, 0x03, 0x02, 0x03, + 0x04, 0x04, 0x09, 0x06, 0x0a, 0x0b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, + 0x11, 0x05, 0x12, 0x21, 0x13, 0x31, 0x41, 0x51, + 0x14, 0x22, 0x32, 0x71, 0x06, 0x10, 0x15, 0x23, + 0x42, 0x61, 0x81, 0x91, 0xb1, 0x24, 0x33, 0x40, + 0x72, 0x73, 0xc1, 0x20, 0x43, 0x50, 0x74, 0x83, + 0x92, 0xb2, 0xc3, 0xd1, 0xf0, 0x16, 0x30, 0x34, + 0x52, 0x62, 0xa1, 0xc2, 0xd2, 0xe1, 0xe2, 0xf1, + 0xf2, 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, + 0x06, 0x3f, 0x02, 0xf1, 0x2e, 0x4b, 0xa1, 0x45, + 0x08, 0xde, 0x11, 0xbe, 0xbe, 0x66, 0x4f, 0xea, + 0xa7, 0xf8, 0xd3, 0xa6, 0x3a, 0x5c, 0x4e, 0xcf, + 0x7e, 0xd0, 0x01, 0xf9, 0x06, 0x5f, 0x70, 0xf8, + 0xf8, 0xa6, 0xdc, 0x81, 0xd6, 0x4f, 0xdf, 0x49, + 0x31, 0xc8, 0x0d, 0x25, 0x36, 0xf9, 0xdb, 0x53, + 0x6d, 0x15, 0x81, 0x91, 0x20, 0x6a, 0x6b, 0x45, + 0x03, 0xdd, 0xe2, 0xb1, 0x5a, 0x41, 0xf5, 0x9a, + 0xf9, 0xc4, 0xfb, 0xea, 0xc1, 0x69, 0x27, 0xd4, + 0x7e, 0x95, 0x2f, 0xb8, 0x7c, 0x7c, 0x51, 0x1c, + 0xd8, 0xb9, 0xd1, 0xf3, 0xdc, 0xae, 0xdd, 0x5d, + 0x2a, 0xfb, 0xd3, 0xb7, 0xbf, 0xb1, 0x3f, 0xf9, + 0x4f, 0xbe, 0xeb, 0x4e, 0x34, 0x97, 0x16, 0x72, + 0x95, 0x0b, 0x5e, 0x95, 0xaf, 0xe2, 0x8f, 0x8a, + 0x4c, 0xec, 0x49, 0xd7, 0x64, 0x3e, 0xf2, 0xee, + 0x02, 0x15, 0x95, 0x29, 0x1c, 0x05, 0x27, 0x05, + 0x05, 0xde, 0x84, 0x57, 0xbb, 0x3e, 0xbd, 0x8b, + 0xef, 0xa8, 0x53, 0x52, 0xe4, 0xc8, 0x8b, 0x4a, + 0xee, 0x95, 0x6a, 0xe3, 0x6b, 0xe6, 0x93, 0xec, + 0xac, 0xdf, 0x2b, 0x29, 0xe7, 0xd1, 0xd5, 0x4c, + 0xe2, 0x7e, 0x7d, 0x50, 0x9d, 0xfc, 0x6a, 0x1b, + 0xbe, 0x53, 0x7b, 0x58, 0xf2, 0xa7, 0x5d, 0x83, + 0xb5, 0x53, 0x6d, 0x9b, 0x15, 0xad, 0x19, 0x45, + 0xe9, 0xc8, 0x2c, 0x35, 0x24, 0xc8, 0x68, 0xe5, + 0x72, 0xed, 0x68, 0xdf, 0x79, 0xa4, 0xc8, 0x9c, + 0xb2, 0x84, 0x29, 0x59, 0x46, 0x51, 0x72, 0x4d, + 0x37, 0x32, 0x22, 0x8a, 0xd8, 0x5e, 0xeb, 0x8b, + 0x1a, 0x4b, 0x12, 0x5c, 0x52, 0xe4, 0xab, 0x50, + 0xc3, 0x29, 0xce, 0xba, 0x6a, 0x23, 0x6e, 0x3a, + 0xdc, 0xa7, 0x0d, 0x92, 0xcb, 0xcd, 0x94, 0x9d, + 0xd7, 0xfa, 0x03, 0xee, 0x45, 0x48, 0x5b, 0xe9, + 0x17, 0x4a, 0x54, 0x37, 0xd7, 0xcd, 0xc7, 0xfd, + 0x53, 0xfc, 0x69, 0xc8, 0xee, 0xa1, 0x90, 0xda, + 0xf7, 0xe5, 0x49, 0xbf, 0xc7, 0xc4, 0xa6, 0x9a, + 0x2a, 0xcd, 0x15, 0x8c, 0xcb, 0xb8, 0xa9, 0x33, + 0x9f, 0xec, 0x47, 0x68, 0xa8, 0x9f, 0xe7, 0xdb, + 0x51, 0xfa, 0x39, 0x56, 0xcd, 0xb0, 0x7b, 0x42, + 0xda, 0xd3, 0x72, 0x00, 0xcc, 0x06, 0x8a, 0x1c, + 0xc5, 0x21, 0x63, 0x72, 0x85, 0xfc, 0x48, 0xfb, + 0x4f, 0xdd, 0x54, 0x3f, 0xce, 0x7f, 0xd2, 0x6a, + 0x2a, 0x3c, 0x93, 0x89, 0x2f, 0x65, 0x19, 0x23, + 0x30, 0x8d, 0xd4, 0x3d, 0x5e, 0x7c, 0xaa, 0xdd, + 0x15, 0xb4, 0x31, 0x39, 0xbd, 0xab, 0xac, 0xa7, + 0xb3, 0x75, 0x01, 0x7a, 0x9f, 0x87, 0x47, 0x75, + 0x0e, 0x33, 0x21, 0x1e, 0x6c, 0xad, 0x5a, 0x22, + 0xfd, 0x95, 0x77, 0x8a, 0x6d, 0xa4, 0x2f, 0x6e, + 0xeb, 0x9e, 0x71, 0xe9, 0x17, 0xbe, 0xd5, 0x47, + 0x8d, 0x3f, 0x01, 0xcd, 0x60, 0x61, 0xb1, 0xca, + 0x55, 0xf6, 0xab, 0x1f, 0xcf, 0xba, 0xb1, 0x2c, + 0x0a, 0x49, 0xb3, 0xad, 0xa8, 0xad, 0x09, 0x3c, + 0xc6, 0x8a, 0xfb, 0xaa, 0x6e, 0x32, 0x60, 0x74, + 0xc8, 0x92, 0x06, 0x8e, 0xf0, 0x03, 0x4e, 0x3c, + 0x0e, 0x95, 0x10, 0x4d, 0x8c, 0xb8, 0x72, 0xdb, + 0x70, 0x29, 0xa7, 0x97, 0xe8, 0x9f, 0xac, 0x3e, + 0x83, 0xd3, 0xe3, 0xa7, 0x2e, 0xbe, 0x75, 0x23, + 0x77, 0x7f, 0x8f, 0x10, 0x75, 0x29, 0x25, 0x6f, + 0xb8, 0x1a, 0x16, 0x15, 0x88, 0x39, 0xb2, 0x5e, + 0x77, 0x96, 0x94, 0x76, 0x75, 0xb5, 0x58, 0x8b, + 0x1f, 0x5f, 0x89, 0x8f, 0xa8, 0x3e, 0x1e, 0x24, + 0xcf, 0x0e, 0x7c, 0x8c, 0x39, 0x6d, 0xbd, 0xba, + 0xbd, 0x8b, 0x7c, 0x6a, 0x14, 0x64, 0x2b, 0x3b, + 0xfb, 0x5d, 0xa6, 0x44, 0xea, 0x72, 0xd8, 0xeb, + 0x50, 0xe3, 0x3e, 0x24, 0xe7, 0x6d, 0x84, 0xa1, + 0x69, 0xd8, 0x13, 0xc2, 0xa4, 0x4c, 0x4c, 0x55, + 0x34, 0xd0, 0xea, 0x42, 0x8e, 0x45, 0x96, 0xed, + 0xb8, 0xdb, 0x80, 0xa9, 0x53, 0xa7, 0x49, 0x6d, + 0x53, 0xe5, 0x1e, 0x92, 0xb9, 0x67, 0xf1, 0x6a, + 0xe0, 0x9e, 0xee, 0x15, 0x22, 0x1e, 0x22, 0x17, + 0x9a, 0x33, 0x64, 0xc6, 0x25, 0x27, 0xaf, 0xfe, + 0x0a, 0x38, 0x93, 0xf3, 0xa6, 0x22, 0x5c, 0x87, + 0x54, 0xb7, 0xd3, 0x1d, 0xf2, 0x8b, 0x1b, 0xee, + 0x35, 0x12, 0x44, 0x27, 0x5e, 0x94, 0x84, 0xd9, + 0x6f, 0x67, 0x39, 0xd6, 0x2f, 0xda, 0xb9, 0xee, + 0xa9, 0x4c, 0xce, 0x61, 0xd7, 0xa0, 0x85, 0x82, + 0xcc, 0xe6, 0x1b, 0xba, 0x72, 0xab, 0x50, 0x15, + 0x50, 0x63, 0xe0, 0x30, 0x54, 0xb9, 0x19, 0xee, + 0xec, 0x90, 0xce, 0x40, 0x07, 0xae, 0x90, 0x8b, + 0xdf, 0x28, 0xb5, 0xfe, 0x80, 0xe3, 0x0e, 0x0b, + 0xb6, 0xe0, 0xca, 0x6b, 0x34, 0x87, 0x83, 0x91, + 0x46, 0xb9, 0x46, 0xf5, 0x52, 0xa4, 0x43, 0x67, + 0x64, 0xb6, 0xb5, 0x52, 0x53, 0xc5, 0x34, 0x98, + 0xd2, 0x1c, 0xd8, 0xb8, 0x95, 0x1d, 0xe3, 0x43, + 0x47, 0xe5, 0x8d, 0x7b, 0xe9, 0xe7, 0x53, 0xd4, + 0x68, 0xac, 0x95, 0x3a, 0xa1, 0x40, 0xec, 0x76, + 0xee, 0x7f, 0x7d, 0xdd, 0x6a, 0xc3, 0x41, 0x5a, + 0x50, 0xc0, 0x3c, 0x9f, 0x0f, 0xa4, 0x95, 0x65, + 0xda, 0x66, 0x39, 0x37, 0x5e, 0xf4, 0x33, 0x04, + 0xe6, 0xae, 0xc8, 0xf7, 0x57, 0x64, 0x55, 0xac, + 0x2d, 0xca, 0xbb, 0x22, 0xb4, 0x00, 0x57, 0x64, + 0x55, 0xb2, 0x8b, 0x72, 0xae, 0xaa, 0x42, 0x7b, + 0xbe, 0x86, 0x41, 0xd4, 0x1d, 0x2d, 0x4e, 0x32, + 0x47, 0x9b, 0x3d, 0x66, 0xcf, 0x31, 0x48, 0x40, + 0xf4, 0x8d, 0xa9, 0xb8, 0xed, 0x0b, 0x25, 0x03, + 0xf0, 0x11, 0xf6, 0x9f, 0xba, 0xa8, 0xe9, 0xc2, + 0xa6, 0xcb, 0x1b, 0x66, 0x4b, 0xa5, 0x84, 0x2f, + 0x4e, 0xaf, 0x21, 0x4b, 0x42, 0xd5, 0xb1, 0x9c, + 0x84, 0xd9, 0xe4, 0x36, 0xab, 0x1f, 0xac, 0x9a, + 0xc7, 0x31, 0x37, 0x25, 0x3d, 0x36, 0x43, 0x32, + 0x8c, 0x66, 0x83, 0xeb, 0x25, 0x29, 0xd4, 0x6b, + 0x6f, 0x6d, 0x31, 0x88, 0x7f, 0x4a, 0xe5, 0x74, + 0xa7, 0x53, 0x9f, 0x23, 0x44, 0x14, 0xa0, 0xf2, + 0xcb, 0x4d, 0xe1, 0xee, 0xcf, 0x53, 0x2f, 0x09, + 0x4a, 0x53, 0x98, 0x83, 0x7b, 0xd4, 0xd5, 0xae, + 0x2c, 0x3b, 0xcd, 0xad, 0xea, 0xac, 0x3f, 0x07, + 0x47, 0x84, 0x13, 0x96, 0xdc, 0xac, 0x97, 0x71, + 0x4a, 0xd4, 0x66, 0x55, 0xa9, 0xd4, 0xbb, 0x8b, + 0xcb, 0xc4, 0x20, 0x3c, 0xc2, 0x81, 0x59, 0x5e, + 0x57, 0x18, 0x58, 0xd4, 0x1f, 0x8d, 0x4c, 0xda, + 0xf8, 0x41, 0x3a, 0x3e, 0xc3, 0x2d, 0xb2, 0x2a, + 0xf7, 0xbd, 0x46, 0xc2, 0x25, 0x62, 0x0a, 0xc5, + 0x22, 0xbe, 0x50, 0x2e, 0xe0, 0xeb, 0x0c, 0xd5, + 0x1f, 0x0a, 0x46, 0x27, 0x31, 0x10, 0x9e, 0x29, + 0x51, 0x6c, 0x3c, 0x79, 0x5e, 0xc2, 0x9e, 0x40, + 0x71, 0xc6, 0xba, 0x9a, 0x2d, 0xb5, 0x59, 0x43, + 0xdb, 0x53, 0xe7, 0xbd, 0x88, 0xcb, 0x54, 0xbb, + 0x38, 0xa4, 0xbb, 0xb5, 0x37, 0x4e, 0x4d, 0xd6, + 0xa6, 0xe1, 0x62, 0xf2, 0x5d, 0x79, 0x13, 0x1a, + 0x0a, 0x64, 0xbc, 0xab, 0xd8, 0x9d, 0x53, 0x6e, + 0xfa, 0x6a, 0x26, 0x1e, 0xb5, 0x37, 0x3a, 0x49, + 0x24, 0x29, 0x06, 0xc5, 0x28, 0x48, 0xba, 0x8d, + 0x4f, 0x91, 0x37, 0x10, 0x96, 0xeb, 0xa5, 0x45, + 0xa0, 0x76, 0xa7, 0xa8, 0x2c, 0x0d, 0xc7, 0xae, + 0xb1, 0x04, 0x3b, 0xe1, 0x04, 0xe6, 0x13, 0x18, + 0x80, 0x32, 0x2a, 0xf7, 0xdf, 0xfc, 0x29, 0xb2, + 0x71, 0x97, 0xb1, 0x48, 0xab, 0x41, 0x43, 0xcc, + 0xc8, 0x55, 0x94, 0xdf, 0x25, 0x8f, 0x75, 0xaa, + 0x63, 0x89, 0x93, 0x22, 0x76, 0x1b, 0x16, 0x46, + 0xc9, 0x48, 0x7d, 0x79, 0x85, 0x8f, 0x0f, 0xf9, + 0xa7, 0xf1, 0x5c, 0x32, 0x5b, 0xad, 0x14, 0x27, + 0x3a, 0x16, 0xca, 0xf2, 0x90, 0x79, 0x1a, 0xc2, + 0xf2, 0x62, 0xf2, 0xe1, 0xc7, 0xe8, 0xa9, 0x75, + 0xc7, 0xc2, 0xf3, 0x2d, 0xe7, 0x17, 0xad, 0xbb, + 0x85, 0x4a, 0xc0, 0xd5, 0xe1, 0x04, 0xe4, 0xb4, + 0xce, 0x7b, 0x3a, 0x15, 0xd6, 0x36, 0xac, 0x49, + 0x6e, 0xcb, 0x5e, 0x25, 0x75, 0xa3, 0xa2, 0xc9, + 0x7b, 0x7a, 0x6f, 0xbc, 0x1e, 0xeb, 0x54, 0x79, + 0xed, 0xf8, 0x5b, 0x29, 0x52, 0x9c, 0x40, 0x5f, + 0x56, 0xca, 0x6d, 0x27, 0x96, 0x5a, 0x0c, 0xe2, + 0x8a, 0xda, 0x4b, 0x69, 0x6a, 0x4e, 0xda, 0xf7, + 0xda, 0x0e, 0x0a, 0xfc, 0x1d, 0x9b, 0xa2, 0xca, + 0x1d, 0x95, 0x8d, 0xe2, 0x81, 0x69, 0xc6, 0x56, + 0x01, 0xb8, 0x55, 0xed, 0x43, 0x37, 0x6a, 0xda, + 0xfe, 0x02, 0x3e, 0xd3, 0xf7, 0x55, 0x80, 0x7d, + 0x83, 0x9f, 0x7d, 0x0f, 0x08, 0xf0, 0x5b, 0xa1, + 0xb0, 0xac, 0xcf, 0x34, 0x9f, 0x47, 0xfe, 0xa6, + 0xb1, 0x01, 0x8a, 0x84, 0xa6, 0x34, 0xc9, 0xaa, + 0x4a, 0x82, 0xbb, 0x37, 0x55, 0xad, 0xaf, 0x0a, + 0xdb, 0x61, 0x58, 0xa3, 0x91, 0xd7, 0xe8, 0x87, + 0x3f, 0xdc, 0x2b, 0x12, 0xc2, 0x71, 0x17, 0x4c, + 0x85, 0x43, 0xdc, 0xe2, 0x8e, 0x62, 0x35, 0xb1, + 0x17, 0xe3, 0x58, 0x0f, 0xe8, 0x7f, 0x6c, 0xd3, + 0xff, 0x00, 0x50, 0xfc, 0x2b, 0x12, 0xf2, 0x76, + 0x27, 0xe4, 0xe2, 0x9c, 0xb9, 0xbc, 0xd8, 0x56, + 0x6d, 0xf4, 0xfb, 0x38, 0xf2, 0x56, 0xee, 0x36, + 0x16, 0x43, 0x4f, 0xb8, 0xbb, 0xa7, 0x37, 0x77, + 0xc2, 0xb0, 0xe5, 0x2b, 0x40, 0x42, 0x2c, 0x7d, + 0x86, 0x9e, 0x24, 0xd8, 0x04, 0x1f, 0x85, 0x4e, + 0xd3, 0xd0, 0x91, 0xf0, 0x35, 0xe0, 0xee, 0x37, + 0x1a, 0xe1, 0xf8, 0x8d, 0x21, 0x2a, 0x50, 0xe5, + 0xe8, 0x9f, 0x7d, 0x63, 0x9e, 0x11, 0xc8, 0x46, + 0x54, 0x88, 0x66, 0x2c, 0x74, 0x9e, 0x1d, 0x5e, + 0xb9, 0xf7, 0xd4, 0xcf, 0xb7, 0x3f, 0xb2, 0x2b, + 0x16, 0xf9, 0x7c, 0xb8, 0x5b, 0x35, 0x0f, 0xec, + 0xae, 0x65, 0xcd, 0xa9, 0xdf, 0x53, 0x1f, 0x77, + 0x11, 0x76, 0x53, 0x4f, 0x84, 0x00, 0xa9, 0x6b, + 0xba, 0x81, 0x17, 0xd2, 0xfe, 0xda, 0xf0, 0xc2, + 0x34, 0x96, 0xc3, 0xac, 0xb8, 0xfa, 0x42, 0x92, + 0x7b, 0x8d, 0x4f, 0xc3, 0xd2, 0x4b, 0xb8, 0x56, + 0x20, 0x8b, 0x24, 0xab, 0x77, 0xff, 0x00, 0x42, + 0xb0, 0x9f, 0xcd, 0x5a, 0xfd, 0x91, 0x58, 0x9f, + 0xe9, 0x3e, 0xea, 0x4c, 0x2c, 0x4e, 0xdd, 0x1e, + 0x5a, 0xf6, 0x42, 0xfa, 0x75, 0xb7, 0x8d, 0x78, + 0x6e, 0xa2, 0xf6, 0x13, 0x8a, 0xb8, 0xcb, 0x9c, + 0x03, 0x9a, 0x1f, 0xd6, 0x15, 0x88, 0x44, 0x9e, + 0xe1, 0x7d, 0x70, 0xd6, 0x90, 0x97, 0x54, 0x6e, + 0x4d, 0xef, 0xa5, 0xf8, 0xf6, 0x7f, 0xab, 0x18, + 0xc9, 0xc6, 0x55, 0xe5, 0x00, 0xac, 0xd9, 0x84, + 0x71, 0x97, 0x75, 0xb7, 0x5e, 0x98, 0xc5, 0x46, + 0x2b, 0xb2, 0x76, 0x38, 0xca, 0xd2, 0x03, 0x00, + 0xa4, 0x0e, 0x37, 0xd7, 0x5b, 0xeb, 0x4a, 0x42, + 0xc0, 0x52, 0x54, 0x2c, 0x41, 0xe3, 0x58, 0x8e, + 0x14, 0xda, 0xd4, 0x88, 0xb2, 0xdd, 0xda, 0xa7, + 0x4f, 0x9b, 0xdd, 0xf7, 0x8a, 0xd8, 0xc2, 0xf0, + 0x9e, 0x6c, 0x78, 0x7b, 0x83, 0x2a, 0x4e, 0x72, + 0x07, 0xd6, 0xbd, 0x2d, 0xa8, 0xd9, 0x96, 0xe3, + 0x86, 0xee, 0x3c, 0xe6, 0xaa, 0x59, 0xa4, 0x62, + 0xcb, 0xc5, 0x8a, 0x24, 0xb4, 0x41, 0x67, 0x2b, + 0x02, 0xc8, 0xb1, 0xb8, 0xe3, 0xad, 0x29, 0x86, + 0xe4, 0x86, 0x64, 0x29, 0x39, 0x76, 0xfb, 0x3b, + 0xf7, 0x9c, 0xb7, 0xa7, 0x16, 0xc6, 0x22, 0xa7, + 0x9a, 0x77, 0xe7, 0x1a, 0x5b, 0x43, 0x5e, 0x5a, + 0xde, 0x9b, 0x9c, 0xd4, 0x95, 0xe1, 0xf3, 0xd3, + 0x6f, 0x3c, 0x84, 0xde, 0xf6, 0xdd, 0xa7, 0x3a, + 0x8e, 0x31, 0x19, 0x8b, 0x77, 0x11, 0x63, 0xb1, + 0x39, 0x94, 0x06, 0xd5, 0xea, 0xd2, 0xb6, 0x13, + 0x3c, 0x28, 0x99, 0x22, 0x19, 0xd1, 0x4d, 0x25, + 0xb0, 0x92, 0x47, 0x2b, 0xde, 0xbc, 0x91, 0x05, + 0xee, 0x82, 0xc6, 0x4d, 0x99, 0x56, 0x4c, 0xe7, + 0x2f, 0x1f, 0x69, 0xe7, 0x4e, 0x60, 0xf2, 0xa5, + 0x74, 0xc8, 0xe5, 0x05, 0xa4, 0x2b, 0x67, 0x94, + 0xa5, 0x36, 0xff, 0x00, 0x3a, 0x4e, 0x0b, 0x16, + 0x4f, 0x46, 0x6f, 0x26, 0xcd, 0x4e, 0xec, 0xee, + 0x48, 0xf4, 0xbd, 0xf5, 0x2a, 0x2c, 0x4c, 0x52, + 0xe8, 0x7b, 0x51, 0xb4, 0x60, 0x1c, 0x8a, 0xe7, + 0xbf, 0x97, 0x0a, 0x75, 0x50, 0xf1, 0xf9, 0x51, + 0xd4, 0xef, 0x6f, 0x66, 0x80, 0x2f, 0x4c, 0x4a, + 0x99, 0x8d, 0xca, 0xc4, 0x36, 0x17, 0x53, 0x6d, + 0x3c, 0x3a, 0xa1, 0x5c, 0x0d, 0x4a, 0x9a, 0x71, + 0x33, 0x27, 0xa5, 0x9c, 0xcf, 0xa0, 0xb2, 0x00, + 0x51, 0xf5, 0x6b, 0xa5, 0x3b, 0x0e, 0x5a, 0x73, + 0x36, 0xbe, 0x3c, 0x52, 0x79, 0x8a, 0x8d, 0x0d, + 0x2e, 0xe6, 0x53, 0x0c, 0xa5, 0xa0, 0xe1, 0x4f, + 0x21, 0x6b, 0xda, 0x8e, 0x30, 0x9c, 0x58, 0xaa, + 0x62, 0xcd, 0xdc, 0xbc, 0x71, 0x95, 0x57, 0xde, + 0x2d, 0x7d, 0x29, 0x70, 0x5e, 0x51, 0x42, 0x14, + 0xa4, 0xab, 0x32, 0x77, 0x8b, 0x1b, 0xd1, 0x61, + 0x8f, 0x0a, 0x26, 0xb7, 0x0b, 0x70, 0x69, 0x49, + 0xcc, 0xa0, 0x39, 0x66, 0xbd, 0x74, 0x68, 0x60, + 0xd8, 0x9c, 0xcb, 0x5a, 0xfb, 0x4b, 0x3e, 0xbf, + 0xc8, 0x9f, 0xff, 0xc4, 0x00, 0x2a, 0x10, 0x01, + 0x00, 0x02, 0x02, 0x01, 0x03, 0x03, 0x03, 0x04, + 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x81, + 0x10, 0x71, 0xf0, 0x91, 0xa1, 0xb1, 0x30, 0x40, + 0xc1, 0xd1, 0x20, 0x50, 0xf1, 0xe1, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, 0x3f, 0x21, + 0xf4, 0xa0, 0xdb, 0x20, 0x1d, 0xab, 0x94, 0xf4, + 0x9a, 0x7d, 0x74, 0x1c, 0xe2, 0xf5, 0x4b, 0xd2, + 0x20, 0xde, 0x22, 0xbf, 0xdf, 0xfc, 0x07, 0x44, + 0xe2, 0x05, 0x28, 0xd0, 0x2e, 0xf1, 0x05, 0x3b, + 0xa7, 0x6a, 0xde, 0x71, 0x2e, 0xc2, 0xe4, 0x5c, + 0x12, 0x94, 0xff, 0x00, 0x45, 0x7e, 0x9d, 0x94, + 0x90, 0x13, 0xfe, 0x3e, 0x76, 0x72, 0x40, 0xfe, + 0xe2, 0xe5, 0xcf, 0x80, 0xe8, 0x9c, 0x4b, 0x25, + 0x57, 0x7f, 0x87, 0x77, 0x88, 0x2a, 0xd7, 0x32, + 0x0e, 0x38, 0xa2, 0xc1, 0xc7, 0xc8, 0x07, 0x4f, + 0x10, 0x41, 0x49, 0xca, 0xf7, 0x23, 0x98, 0xcc, + 0xe8, 0xdf, 0x5e, 0x06, 0xf0, 0x06, 0x61, 0xe0, + 0x14, 0xe9, 0x75, 0xf9, 0x10, 0x6e, 0x56, 0xa8, + 0x87, 0xba, 0x17, 0xe1, 0x89, 0x04, 0x49, 0x61, + 0xaa, 0xbd, 0xe3, 0xd4, 0xb6, 0x04, 0x80, 0xc0, + 0xed, 0x59, 0xcc, 0x10, 0x32, 0x48, 0x1d, 0x05, + 0xfc, 0xcc, 0x7d, 0x71, 0x17, 0x18, 0xf1, 0x12, + 0xb1, 0xb7, 0xf0, 0xc5, 0xeb, 0xc4, 0xb0, 0x38, + 0x8a, 0xa1, 0x1a, 0x44, 0xe2, 0x1f, 0x99, 0xb1, + 0xd1, 0xd6, 0x8d, 0x79, 0x88, 0x49, 0xf8, 0x8b, + 0xf0, 0x71, 0xd7, 0xf6, 0x19, 0x72, 0xce, 0x05, + 0x37, 0x8f, 0x6b, 0x95, 0xf6, 0x24, 0x34, 0xc1, + 0x91, 0x36, 0xf4, 0x64, 0x54, 0xf5, 0x25, 0xd5, + 0xfe, 0x62, 0x4c, 0xae, 0xf9, 0xdc, 0x40, 0xe3, + 0x2c, 0xb9, 0x0f, 0xf9, 0x3c, 0xc3, 0x1b, 0x77, + 0xfc, 0x43, 0xb5, 0x01, 0x37, 0xdf, 0xd3, 0xe0, + 0x77, 0x43, 0xf4, 0x71, 0xde, 0x45, 0x12, 0xf0, + 0x67, 0x3f, 0xaa, 0x62, 0x10, 0xb2, 0x09, 0x6a, + 0x1c, 0x78, 0xf7, 0xdc, 0x33, 0xa8, 0x72, 0x05, + 0x85, 0x38, 0xc9, 0x7d, 0x71, 0xda, 0x12, 0x7e, + 0x4c, 0x32, 0x9b, 0xf2, 0x67, 0x1d, 0xa3, 0x48, + 0xd4, 0xcd, 0x62, 0x0f, 0xb8, 0x43, 0x85, 0xc5, + 0x8e, 0x92, 0xb3, 0xee, 0xfa, 0xc4, 0x13, 0x99, + 0x87, 0x0b, 0x84, 0x6a, 0xc3, 0x3c, 0x4a, 0x9f, + 0x22, 0xd5, 0xc2, 0x6e, 0x07, 0x54, 0xe3, 0xac, + 0x3f, 0x5d, 0x2c, 0x89, 0x38, 0xff, 0x00, 0x50, + 0xfb, 0x3d, 0x73, 0x9d, 0x06, 0xb0, 0x65, 0xf1, + 0x96, 0x62, 0xe4, 0x50, 0x58, 0x13, 0x8f, 0xac, + 0x50, 0x82, 0xd9, 0xb4, 0x79, 0xc4, 0xf8, 0xbe, + 0x89, 0x74, 0x5c, 0xb8, 0x61, 0x50, 0x5d, 0xfd, + 0xf4, 0xd2, 0xe5, 0xe5, 0xa3, 0x5b, 0x42, 0xd3, + 0x8b, 0x62, 0x40, 0x56, 0x5c, 0xa1, 0x13, 0xbc, + 0x4f, 0x82, 0xd0, 0xd2, 0x94, 0x75, 0xb8, 0xf1, + 0x16, 0x6b, 0xb4, 0x27, 0x8b, 0x76, 0x0d, 0x8e, + 0xfd, 0x88, 0xdf, 0xee, 0x54, 0x83, 0x5a, 0x6e, + 0xea, 0xbb, 0x7b, 0x42, 0xd2, 0x68, 0x0b, 0xd4, + 0x15, 0xba, 0x79, 0xeb, 0x33, 0x44, 0x58, 0x64, + 0x01, 0xcc, 0xaa, 0xe3, 0x58, 0xa0, 0x0e, 0x55, + 0x9c, 0x20, 0xd6, 0x3a, 0x6a, 0x6c, 0x27, 0x4e, + 0x5a, 0xdb, 0x9e, 0x5b, 0x7a, 0x47, 0x6a, 0xd1, + 0xef, 0x51, 0xfa, 0xf5, 0x2d, 0x97, 0x23, 0xd9, + 0x84, 0xd5, 0x34, 0xb4, 0xe9, 0x0f, 0x48, 0x25, + 0xc7, 0x60, 0xd7, 0x37, 0x93, 0x70, 0x80, 0x30, + 0xcf, 0x97, 0x9b, 0x09, 0x43, 0xbe, 0x16, 0x8d, + 0xa7, 0x0a, 0x48, 0x46, 0x5b, 0xa3, 0xab, 0x06, + 0x60, 0x1f, 0x01, 0xa8, 0x28, 0x28, 0xc0, 0x1c, + 0x4b, 0xdf, 0x0b, 0xac, 0x5c, 0xb4, 0x9d, 0x1e, + 0xbb, 0x8d, 0x57, 0x55, 0xc4, 0x1c, 0x3a, 0x94, + 0xb5, 0xe9, 0x6d, 0x5c, 0x7d, 0xa6, 0x4f, 0x8d, + 0x62, 0x7f, 0xc1, 0x97, 0x99, 0x8e, 0x84, 0x5d, + 0x6a, 0xaf, 0x29, 0x33, 0xf3, 0x1d, 0x18, 0x87, + 0xd0, 0x4f, 0x45, 0x4c, 0x4b, 0x97, 0xe9, 0x72, + 0xfd, 0x2e, 0x5c, 0xb9, 0x7f, 0xe6, 0x97, 0x0c, + 0x70, 0x4a, 0x5c, 0x91, 0xf6, 0x09, 0x63, 0x97, + 0xfa, 0xd4, 0x5d, 0xa8, 0x4f, 0x96, 0xa6, 0x39, + 0x19, 0xee, 0xf2, 0xca, 0xf5, 0xf8, 0x1d, 0xd1, + 0x95, 0x29, 0xca, 0x6c, 0xdb, 0xec, 0x16, 0x93, + 0x2b, 0x44, 0x87, 0x4a, 0xed, 0x83, 0xf6, 0x71, + 0x07, 0xa7, 0x3b, 0x4a, 0x0e, 0xe6, 0xd3, 0x65, + 0xb8, 0x49, 0xb9, 0xdb, 0x8e, 0x98, 0x89, 0xfd, + 0x5b, 0xe0, 0x1c, 0x59, 0x7b, 0x07, 0x54, 0xb5, + 0xde, 0xe6, 0xb8, 0xa8, 0xd7, 0x13, 0x55, 0x09, + 0x64, 0x2e, 0x8e, 0x9a, 0x1e, 0x49, 0xaa, 0xcf, + 0x71, 0x8d, 0xdf, 0xb4, 0xa5, 0x33, 0xd7, 0x42, + 0xa1, 0xbe, 0xa3, 0xe1, 0x98, 0x33, 0x55, 0xa5, + 0xa4, 0x9c, 0x18, 0x96, 0xda, 0x5a, 0xdd, 0xc1, + 0x84, 0x81, 0x35, 0x02, 0x12, 0x06, 0x9d, 0x8f, + 0x3d, 0x65, 0x17, 0x9d, 0x08, 0x16, 0x2e, 0x83, + 0x1e, 0xf5, 0x37, 0x1f, 0x26, 0x87, 0x4e, 0x38, + 0x22, 0x64, 0x49, 0x15, 0x1d, 0x83, 0x6e, 0x66, + 0x73, 0xba, 0xaa, 0xee, 0xd7, 0x19, 0x80, 0x62, + 0x16, 0x5d, 0x5e, 0xfd, 0x0d, 0xd9, 0x75, 0x2f, + 0xf1, 0x2a, 0x6d, 0x04, 0xf0, 0xd6, 0xbb, 0x21, + 0x75, 0x7b, 0x0b, 0x50, 0x6b, 0xf7, 0xd4, 0x7b, + 0x27, 0x5f, 0x10, 0x72, 0x60, 0x7f, 0x3e, 0x66, + 0xff, 0x00, 0x1c, 0x1a, 0x05, 0x63, 0x5c, 0xca, + 0xed, 0x10, 0x56, 0x97, 0x0b, 0x7d, 0xc3, 0x86, + 0xc8, 0xfe, 0x98, 0x0d, 0x41, 0x6b, 0xb7, 0x1a, + 0xac, 0x6a, 0x33, 0x66, 0x1c, 0x0b, 0xec, 0x3c, + 0x35, 0xe3, 0xfc, 0x6e, 0x9b, 0x3b, 0x7f, 0xfe, + 0xbb, 0x43, 0x7a, 0x75, 0x34, 0x53, 0xd2, 0xa6, + 0x2b, 0x60, 0xc3, 0x57, 0xea, 0xcf, 0x81, 0xdd, + 0x10, 0xc2, 0x1b, 0xb4, 0x35, 0xc5, 0x9c, 0xb5, + 0xf5, 0x0e, 0x25, 0xf2, 0x2e, 0x80, 0x12, 0x1e, + 0xe6, 0x9e, 0xb5, 0x01, 0xc1, 0x72, 0x1c, 0x9d, + 0x34, 0xbf, 0x68, 0xe9, 0x0b, 0x6a, 0x07, 0xd2, + 0xd6, 0x62, 0x65, 0xee, 0x4c, 0x4f, 0x97, 0xb4, + 0xf7, 0xb3, 0x41, 0xe9, 0xbd, 0x7f, 0xec, 0xc2, + 0x9f, 0xea, 0xae, 0x0a, 0x6e, 0xb6, 0xfb, 0x10, + 0xb0, 0x9c, 0xa7, 0x36, 0x47, 0xde, 0x00, 0x84, + 0x2a, 0xf1, 0x01, 0x32, 0xb2, 0xc7, 0x78, 0x2c, + 0x5b, 0x6f, 0x4b, 0xdf, 0x83, 0xf3, 0x8a, 0x03, + 0xa5, 0x41, 0x60, 0xf7, 0x5b, 0xf7, 0xe9, 0xe9, + 0xd1, 0x4a, 0x5b, 0x77, 0xba, 0xf2, 0xb5, 0x2d, + 0x70, 0xad, 0x18, 0x3a, 0x14, 0xd2, 0x88, 0x21, + 0xfe, 0xbd, 0xff, 0x00, 0x24, 0x7a, 0x68, 0xdf, + 0x29, 0x13, 0xdb, 0x47, 0x73, 0xed, 0x25, 0x7c, + 0xde, 0xd1, 0x41, 0x00, 0x66, 0x8c, 0x5e, 0xe1, + 0xc1, 0xeb, 0x47, 0x35, 0x08, 0x45, 0x2c, 0x9e, + 0x0c, 0x3f, 0x89, 0x56, 0x95, 0x61, 0x32, 0xae, + 0x83, 0xb7, 0x7f, 0xd2, 0x0a, 0x81, 0xa7, 0x86, + 0x69, 0x67, 0x1b, 0xb6, 0x8e, 0x9d, 0x62, 0xae, + 0x3a, 0xc3, 0x29, 0xa2, 0xc7, 0x6d, 0x9f, 0x77, + 0x68, 0xa4, 0x58, 0x7d, 0x81, 0xd8, 0xca, 0x4e, + 0x80, 0x32, 0x7a, 0x86, 0x72, 0x1f, 0x45, 0xae, + 0xf1, 0x75, 0x07, 0x43, 0xe8, 0x85, 0x1f, 0x89, + 0x92, 0x1c, 0x6f, 0xf4, 0x87, 0x68, 0x67, 0x3e, + 0x29, 0x55, 0x34, 0xe8, 0x5e, 0x77, 0x05, 0xed, + 0x56, 0x18, 0xf0, 0x75, 0x33, 0xce, 0x2f, 0x98, + 0x0f, 0x1e, 0x81, 0x58, 0xbb, 0x1a, 0x2a, 0xe7, + 0x0c, 0x73, 0x2f, 0x31, 0xb1, 0x87, 0x51, 0x96, + 0x21, 0x2c, 0x2a, 0xbb, 0x0d, 0xdb, 0xaf, 0x7f, + 0xa4, 0xa0, 0x4a, 0xef, 0x47, 0xae, 0xfc, 0x46, + 0xef, 0x91, 0x2c, 0x31, 0x0e, 0x53, 0x67, 0xdd, + 0x1d, 0x91, 0xc0, 0x0e, 0xd0, 0x1c, 0xb6, 0x1c, + 0x8e, 0x38, 0x80, 0xd7, 0x8a, 0x83, 0xfc, 0x0b, + 0xc3, 0x6d, 0xe6, 0xa2, 0x28, 0x3d, 0xaa, 0x61, + 0x2b, 0xcf, 0x0f, 0xca, 0x64, 0x8b, 0x8b, 0xaa, + 0x73, 0x9e, 0xec, 0xb1, 0x63, 0x00, 0xc5, 0xa5, + 0x07, 0x35, 0x77, 0xfc, 0xc7, 0x13, 0x6d, 0xba, + 0x69, 0x46, 0x8b, 0x71, 0xed, 0x29, 0xea, 0xb0, + 0x3d, 0x87, 0x78, 0x80, 0x5b, 0x08, 0x62, 0x98, + 0xc9, 0xda, 0xea, 0xfc, 0xc4, 0xfe, 0x3c, 0x18, + 0xf2, 0x91, 0xf4, 0x94, 0xfb, 0x71, 0x5d, 0x0e, + 0x1f, 0x4a, 0xf3, 0x1d, 0x4a, 0xfb, 0x1c, 0x5f, + 0xe2, 0x26, 0x6e, 0xd1, 0x5f, 0x52, 0xbf, 0x8f, + 0xf4, 0x9f, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, + 0x91, 0x92, 0xac, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0xb8, 0xfb, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x26, 0xba, 0x16, 0x58, 0x80, 0x01, + 0x04, 0x00, 0x49, 0x24, 0x92, 0x49, 0x24, 0x90, + 0xd6, 0xc4, 0xe4, 0x40, 0x24, 0x02, 0x00, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x43, 0x1e, 0xf1, 0x31, + 0x60, 0x00, 0x09, 0x00, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x20, 0x29, 0x33, 0x55, 0x92, 0x41, 0x04, + 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x24, 0x5a, 0x09, 0x20, 0x80, 0x00, 0x20, 0x92, + 0x09, 0x04, 0x92, 0x01, 0x24, 0x33, 0x19, 0x04, + 0x12, 0x40, 0x20, 0x12, 0x08, 0x20, 0x00, 0x01, + 0x20, 0x92, 0x49, 0x24, 0x80, 0x48, 0x20, 0x90, + 0x49, 0x20, 0x10, 0x00, 0x00, 0x82, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x3f, 0xff, 0xc4, 0x00, 0x27, + 0x11, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x03, + 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x11, 0x21, 0x31, 0x41, 0x51, + 0x40, 0x61, 0x71, 0x81, 0x91, 0xb1, 0x10, 0x60, + 0xa1, 0xf1, 0xc1, 0xd1, 0xf0, 0xff, 0xda, 0x00, + 0x08, 0x01, 0x03, 0x01, 0x01, 0x3f, 0x10, 0xfa, + 0x53, 0x7f, 0x71, 0xa3, 0x9e, 0xf0, 0xb8, 0xa9, + 0xe5, 0xb4, 0x34, 0x29, 0x37, 0x95, 0xff, 0x00, + 0x04, 0x2f, 0x32, 0xd5, 0x33, 0xab, 0xd7, 0xe0, + 0xbd, 0xdf, 0x86, 0x15, 0x62, 0xb0, 0x67, 0xde, + 0x02, 0x49, 0x05, 0xb7, 0x88, 0xac, 0xac, 0x73, + 0x0e, 0x33, 0x0a, 0x35, 0x45, 0x28, 0xef, 0x32, + 0x40, 0x3c, 0x75, 0x9a, 0xb4, 0x4b, 0x0d, 0x60, + 0x7a, 0xef, 0xc3, 0x32, 0x34, 0xe6, 0xbf, 0x31, + 0xc2, 0x31, 0x1b, 0xad, 0xe2, 0x54, 0x88, 0x34, + 0x34, 0xcd, 0xfe, 0xd0, 0x32, 0x1c, 0xf0, 0x85, + 0x53, 0x94, 0x7b, 0x53, 0xd6, 0x5e, 0xf1, 0x52, + 0xf1, 0xfe, 0x65, 0xab, 0xf9, 0x63, 0xfa, 0x8c, + 0xd9, 0x66, 0xb5, 0x5a, 0x78, 0x82, 0xae, 0xdd, + 0x94, 0xac, 0x6a, 0x19, 0xcd, 0x5f, 0x1e, 0x20, + 0xcf, 0x87, 0xf6, 0x05, 0x42, 0xe8, 0xb8, 0xd3, + 0x38, 0x26, 0xfe, 0x75, 0x3c, 0xc7, 0x4b, 0x66, + 0xbd, 0xba, 0xb6, 0xc1, 0xa1, 0x8e, 0xae, 0x09, + 0xab, 0xe2, 0x50, 0x1d, 0x90, 0x94, 0xaa, 0x8a, + 0x0f, 0x39, 0xa8, 0x15, 0x22, 0xad, 0x7b, 0xd4, + 0x65, 0xae, 0xcd, 0x62, 0x19, 0x56, 0x18, 0x51, + 0x06, 0xcb, 0x7c, 0xc1, 0xbe, 0xab, 0x5c, 0xc7, + 0xa2, 0x96, 0xc9, 0xcf, 0x80, 0xe1, 0xde, 0x24, + 0x7c, 0x11, 0x6b, 0x0f, 0xa6, 0xce, 0x92, 0x8a, + 0xc1, 0xa4, 0x6a, 0xb9, 0x75, 0xef, 0x12, 0x40, + 0xf0, 0x1b, 0x79, 0x8d, 0x44, 0x9b, 0x61, 0xf9, + 0xd7, 0xe2, 0x5a, 0xb6, 0xcd, 0x3a, 0xc6, 0xe9, + 0x08, 0xd8, 0x53, 0xa2, 0x5b, 0x38, 0xa8, 0x6e, + 0x31, 0x5f, 0x80, 0x1f, 0x5a, 0x23, 0xa5, 0x6a, + 0x7f, 0x53, 0x3d, 0x7b, 0x0f, 0xaf, 0x93, 0x64, + 0x8a, 0xc5, 0x51, 0xc6, 0xd6, 0x91, 0xee, 0x49, + 0xab, 0xfb, 0x8f, 0xff, 0xc4, 0x00, 0x1f, 0x11, + 0x01, 0x01, 0x01, 0x00, 0x03, 0x01, 0x00, 0x02, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x11, 0x21, 0x31, 0x40, 0x41, 0x10, + 0x50, 0x51, 0x60, 0x81, 0xff, 0xda, 0x00, 0x08, + 0x01, 0x02, 0x01, 0x01, 0x3f, 0x10, 0xfc, 0x39, + 0xa0, 0xb9, 0x46, 0x4f, 0x5d, 0xb7, 0x3f, 0xe7, + 0xbf, 0xbe, 0xc3, 0x19, 0x06, 0x76, 0x08, 0xe0, + 0x88, 0x9b, 0x3a, 0x83, 0xec, 0xe6, 0xc8, 0xf3, + 0xb4, 0xea, 0x6e, 0x5d, 0x11, 0xb2, 0x31, 0xb3, + 0x64, 0x9e, 0xbe, 0xc6, 0xbd, 0xb2, 0x88, 0x93, + 0xa2, 0x87, 0x1b, 0x00, 0xbe, 0x24, 0x1f, 0x22, + 0x47, 0x0e, 0xb6, 0x5d, 0xfe, 0x46, 0x5e, 0xb1, + 0x99, 0x8c, 0x38, 0xd2, 0xe3, 0x21, 0xc7, 0x5b, + 0x60, 0xfb, 0x59, 0x6f, 0x2c, 0x5f, 0xc8, 0x63, + 0x1d, 0x04, 0x30, 0x7a, 0xde, 0x61, 0xdf, 0x19, + 0xa6, 0x62, 0x4c, 0x4b, 0x7a, 0xc0, 0x7f, 0x73, + 0x37, 0xd4, 0x30, 0xba, 0x63, 0x83, 0x0f, 0x69, + 0xa7, 0x76, 0x07, 0xa1, 0x87, 0x01, 0xc4, 0x7c, + 0x3e, 0xc6, 0x2f, 0xcb, 0x7f, 0x41, 0xa4, 0x42, + 0x47, 0xc1, 0x04, 0x62, 0xff, 0x00, 0x63, 0xff, + 0xc4, 0x00, 0x27, 0x10, 0x01, 0x01, 0x00, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x21, + 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x91, 0xa1, + 0x10, 0x30, 0x40, 0xc1, 0x20, 0x50, 0xb1, 0xf0, + 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, + 0x3f, 0x10, 0xfe, 0x03, 0x67, 0xa4, 0x9a, 0x04, + 0x01, 0xca, 0x72, 0x99, 0xa0, 0xc6, 0x92, 0x53, + 0xe5, 0x14, 0xa3, 0x97, 0xe5, 0xcc, 0xc8, 0x94, + 0x2e, 0xac, 0xde, 0x02, 0x67, 0x8f, 0xf3, 0xde, + 0x4f, 0xfe, 0x98, 0x2f, 0x97, 0x00, 0x7c, 0x0c, + 0xd7, 0x79, 0x3c, 0xfa, 0x53, 0x77, 0xbd, 0x61, + 0x46, 0x15, 0x86, 0xc0, 0x56, 0xbb, 0xf9, 0xce, + 0xdf, 0x84, 0x2a, 0x7d, 0x7f, 0x0b, 0xc2, 0x39, + 0x69, 0xf8, 0x5c, 0xff, 0x00, 0xe5, 0xff, 0x00, + 0xde, 0x09, 0x68, 0xe1, 0xa3, 0xf4, 0x3f, 0xe4, + 0x48, 0x57, 0x59, 0x38, 0xae, 0x4f, 0xb0, 0x21, + 0x59, 0x8c, 0xa9, 0x14, 0x04, 0xca, 0xde, 0x1c, + 0xc7, 0xde, 0x56, 0xbe, 0x46, 0x84, 0xb3, 0xf4, + 0x35, 0x86, 0x28, 0xa6, 0xd7, 0x43, 0x69, 0xd0, + 0x7e, 0xcf, 0x39, 0x60, 0x4a, 0x88, 0x9c, 0x7c, + 0x7d, 0x65, 0x44, 0xd7, 0x9c, 0x0d, 0x83, 0x8d, + 0x60, 0x38, 0x53, 0x51, 0x3b, 0x6e, 0xa6, 0xb1, + 0xbc, 0x61, 0x09, 0x36, 0x63, 0x9c, 0xd5, 0x65, + 0x8e, 0x6e, 0x3a, 0xe7, 0x98, 0x10, 0xe4, 0x05, + 0xea, 0x8c, 0x87, 0x2f, 0xda, 0x14, 0x3f, 0x2d, + 0x24, 0xcb, 0x0e, 0xea, 0x50, 0x21, 0x35, 0x20, + 0x44, 0x69, 0xbd, 0xe1, 0xb1, 0xf3, 0x34, 0xcb, + 0xbd, 0x54, 0x22, 0xea, 0x69, 0xbc, 0x5c, 0x9b, + 0x35, 0x24, 0x4a, 0xbb, 0x89, 0x2a, 0xbd, 0x58, + 0xc2, 0x97, 0xe7, 0xeb, 0x28, 0x0e, 0xe0, 0x25, + 0x7a, 0xfb, 0x31, 0x47, 0xa3, 0x2a, 0x12, 0x0d, + 0xa1, 0x38, 0x7e, 0x78, 0xc2, 0xff, 0x00, 0xd7, + 0x21, 0xd8, 0xb5, 0x06, 0x32, 0x8b, 0x8d, 0x4d, + 0x09, 0xd5, 0x12, 0xd2, 0x08, 0xbd, 0x9c, 0x1a, + 0x5f, 0xef, 0xa2, 0x07, 0x82, 0xc0, 0x98, 0x45, + 0x78, 0x36, 0x6e, 0x62, 0xa4, 0x76, 0x23, 0x46, + 0x23, 0x32, 0x29, 0x90, 0x00, 0x20, 0x48, 0xa8, + 0xe4, 0x3a, 0x73, 0xe3, 0x9c, 0xba, 0x79, 0x5f, + 0xbe, 0x51, 0xed, 0xd8, 0xfa, 0xc8, 0xc5, 0xfc, + 0x2a, 0x3e, 0x81, 0xda, 0x9f, 0x90, 0x66, 0xef, + 0xd8, 0xd5, 0x40, 0xe1, 0xf5, 0xfb, 0x62, 0x3f, + 0x52, 0x5e, 0x78, 0x13, 0xdf, 0x23, 0xe3, 0xe7, + 0x07, 0x30, 0xd8, 0x6c, 0x00, 0x97, 0xde, 0xf3, + 0xac, 0xfd, 0x16, 0x45, 0xa6, 0x18, 0x56, 0xbb, + 0x40, 0x7e, 0x60, 0x22, 0xdd, 0xeb, 0x25, 0x66, + 0x2b, 0xdc, 0xca, 0x2c, 0x9e, 0x2a, 0xd6, 0xc1, + 0xb3, 0xb1, 0x70, 0x91, 0x98, 0xc5, 0x0e, 0x86, + 0x90, 0x12, 0x01, 0x24, 0xc1, 0x03, 0xe3, 0x54, + 0x7a, 0x5e, 0xd3, 0x4b, 0x78, 0x1c, 0xaa, 0xe0, + 0x7c, 0x60, 0xab, 0x75, 0x1c, 0x31, 0x27, 0x85, + 0xf9, 0x4c, 0xe9, 0x8d, 0x96, 0x0d, 0xbc, 0xea, + 0x1e, 0x0f, 0x0c, 0x0c, 0xa0, 0x13, 0xbc, 0x12, + 0x07, 0x00, 0x05, 0xe1, 0xa7, 0x1a, 0x82, 0x9a, + 0xc2, 0xf2, 0xc2, 0x4a, 0x84, 0x63, 0x8e, 0x07, + 0xf7, 0xea, 0xbc, 0xf9, 0xca, 0x12, 0xa4, 0x06, + 0x96, 0x01, 0x3d, 0xb4, 0xcd, 0x36, 0xe0, 0x5c, + 0x75, 0x2b, 0x0f, 0x33, 0x8c, 0x31, 0x7e, 0x8a, + 0xe7, 0xc2, 0x57, 0x86, 0xfc, 0x61, 0x89, 0x27, + 0x90, 0x71, 0xb1, 0x65, 0x70, 0xc7, 0xed, 0x05, + 0x03, 0xd8, 0x9d, 0x60, 0x50, 0x0b, 0x8c, 0x2a, + 0x7c, 0x4b, 0x93, 0x04, 0x3a, 0x60, 0x15, 0x5c, + 0xaf, 0x0d, 0x41, 0x57, 0xaa, 0x48, 0x42, 0xe0, + 0x6f, 0x0c, 0x55, 0x51, 0x04, 0xb6, 0x06, 0x20, + 0x05, 0xe7, 0x24, 0xb4, 0x3f, 0x0c, 0xfa, 0x81, + 0x47, 0x9d, 0x26, 0x58, 0x50, 0x1b, 0xa5, 0x62, + 0x8a, 0x9e, 0xa3, 0xee, 0x62, 0xc3, 0x2e, 0x40, + 0xd5, 0x08, 0x82, 0xfb, 0x7c, 0x1c, 0x84, 0x8c, + 0x96, 0x81, 0xd8, 0x70, 0x21, 0xf4, 0x62, 0xf0, + 0x44, 0xbb, 0xf0, 0xea, 0x4d, 0xb5, 0xad, 0x61, + 0x88, 0xe1, 0x2e, 0xf5, 0x8a, 0x16, 0x0a, 0x3b, + 0xae, 0x1f, 0x0c, 0xbc, 0xa4, 0x04, 0xe4, 0xaa, + 0x5e, 0x75, 0x54, 0x3d, 0x36, 0xf3, 0x89, 0x24, + 0x68, 0x88, 0x1a, 0xd0, 0x5b, 0x96, 0x66, 0xb2, + 0xee, 0x05, 0xfb, 0x9f, 0xdf, 0x19, 0xd5, 0xf8, + 0x46, 0x87, 0x4f, 0x4e, 0x38, 0x1b, 0x86, 0x75, + 0xe9, 0xc1, 0x39, 0x46, 0xb3, 0x52, 0xe8, 0x51, + 0x5e, 0x00, 0xbc, 0x15, 0xd0, 0xed, 0xcb, 0x27, + 0x66, 0x38, 0x1b, 0xf4, 0x0a, 0xa5, 0x80, 0x7a, + 0x47, 0xf7, 0x89, 0x12, 0x48, 0xa5, 0x53, 0x89, + 0x37, 0x97, 0x85, 0xb7, 0x25, 0x78, 0x7c, 0x09, + 0xa3, 0x46, 0xaf, 0x39, 0xc8, 0x15, 0xf9, 0x2f, + 0x93, 0x8f, 0xf1, 0x86, 0xe4, 0x20, 0x50, 0x07, + 0x00, 0x61, 0x87, 0x65, 0x1b, 0x25, 0xea, 0xce, + 0xb1, 0xe0, 0x7c, 0x11, 0xa7, 0x21, 0xa0, 0x6f, + 0x6a, 0x21, 0xc9, 0x80, 0x85, 0x11, 0x59, 0x7b, + 0x0b, 0xb9, 0x57, 0x0e, 0x8f, 0xc2, 0xc6, 0x61, + 0x88, 0x42, 0x9d, 0x0f, 0x26, 0x77, 0xc9, 0xb6, + 0x15, 0xf2, 0x62, 0xf3, 0xeb, 0xd7, 0x09, 0x02, + 0xaa, 0x84, 0x0b, 0xe7, 0x5e, 0xb1, 0x67, 0x31, + 0x02, 0xae, 0xbb, 0x7b, 0xcf, 0x9c, 0xb4, 0x6b, + 0xeb, 0x14, 0x6c, 0x02, 0x18, 0x7f, 0x19, 0x41, + 0xc9, 0xf9, 0xc8, 0xf2, 0x64, 0x79, 0x32, 0x9e, + 0x71, 0x04, 0xa9, 0xbe, 0x3d, 0xe4, 0x0c, 0xa5, + 0xca, 0x79, 0xc8, 0xf2, 0x64, 0x3d, 0x99, 0x1e, + 0x4c, 0x8f, 0x26, 0x52, 0xca, 0x5c, 0x11, 0xef, + 0x29, 0xe7, 0x04, 0x7b, 0xfe, 0x13, 0x14, 0x73, + 0x1e, 0xb0, 0x33, 0xac, 0xb4, 0x42, 0x23, 0xf5, + 0x8a, 0x66, 0x61, 0x69, 0x5a, 0x8f, 0x6f, 0x27, + 0xc0, 0xf7, 0xa5, 0x20, 0x1d, 0x9f, 0x20, 0x3f, + 0xf7, 0x0d, 0xd8, 0xbe, 0xdd, 0xc7, 0x95, 0x6b, + 0x73, 0x97, 0xf0, 0xe7, 0xe8, 0xb2, 0x52, 0x80, + 0x67, 0xec, 0xbe, 0x06, 0x46, 0xd8, 0xc3, 0x73, + 0x1d, 0x73, 0xf3, 0x81, 0xa0, 0x29, 0xa0, 0x74, + 0xee, 0xda, 0x45, 0x1d, 0x3a, 0x19, 0xed, 0xaa, + 0x22, 0x92, 0xf3, 0x03, 0x42, 0xe4, 0x43, 0x93, + 0x6a, 0x23, 0x59, 0x6b, 0x4a, 0x07, 0xa3, 0x26, + 0x5c, 0x46, 0xe8, 0xa8, 0xa3, 0x62, 0x40, 0xbd, + 0x80, 0xb2, 0xf8, 0x19, 0x9a, 0x4c, 0x35, 0x0a, + 0x2e, 0x21, 0xc1, 0xae, 0x04, 0xd9, 0xc3, 0x6a, + 0x03, 0x41, 0x13, 0x65, 0x16, 0x68, 0x14, 0x73, + 0x54, 0xb5, 0x0f, 0xdf, 0x07, 0x90, 0x40, 0xa7, + 0xb8, 0xd8, 0x6d, 0x8a, 0x87, 0x45, 0xd0, 0xda, + 0xef, 0x39, 0xbd, 0x95, 0x58, 0x0b, 0xa1, 0x87, + 0x06, 0x32, 0x6f, 0xde, 0x02, 0x00, 0xd8, 0xd0, + 0xdf, 0x7b, 0xbc, 0xe2, 0xdf, 0xb6, 0x32, 0x72, + 0x30, 0x4b, 0x33, 0xa5, 0xe0, 0x8b, 0xb2, 0x72, + 0x50, 0x69, 0xc2, 0x17, 0x3c, 0x1d, 0x65, 0xd0, + 0xe1, 0x1c, 0x87, 0xe8, 0x2c, 0x74, 0xb9, 0x09, + 0x79, 0xf6, 0x12, 0x0f, 0x23, 0xcf, 0x5a, 0xe1, + 0x6c, 0x41, 0x45, 0x71, 0x7a, 0x9f, 0x40, 0xe0, + 0xdd, 0x70, 0x51, 0x98, 0x92, 0x35, 0x06, 0xfe, + 0x70, 0x1a, 0x68, 0xc6, 0xd7, 0x34, 0x30, 0x95, + 0xf5, 0x89, 0xa1, 0xc8, 0xf8, 0xc0, 0xf9, 0xb4, + 0x54, 0x4e, 0xb7, 0x28, 0x5f, 0x60, 0x9d, 0x65, + 0xbb, 0xfd, 0x23, 0x51, 0x62, 0x24, 0xa7, 0x88, + 0x38, 0xe2, 0x58, 0xa6, 0x0c, 0xa4, 0xf2, 0xe4, + 0xfa, 0xeb, 0x13, 0x59, 0xbf, 0x4c, 0xa2, 0xb8, + 0x04, 0xe6, 0xd5, 0xb4, 0x2a, 0x00, 0x7d, 0x8e, + 0x26, 0xe3, 0x55, 0xd8, 0xb4, 0x71, 0x93, 0x9a, + 0x82, 0xd0, 0xb9, 0x08, 0x3a, 0x48, 0x26, 0xbe, + 0x3f, 0xe0, 0xf0, 0xe1, 0x65, 0x8c, 0xb3, 0xe1, + 0x5e, 0x57, 0x6b, 0x4e, 0x6d, 0xa0, 0x55, 0xa0, + 0x15, 0xbf, 0x07, 0x6f, 0xde, 0x05, 0x58, 0x02, + 0xe6, 0x8d, 0xcf, 0x56, 0xff, 0x00, 0x28, 0x0a, + 0xb0, 0xcd, 0xa3, 0xbd, 0x32, 0x01, 0x51, 0x1f, + 0x6e, 0x2d, 0xac, 0x02, 0xbe, 0xc8, 0xe9, 0xe2, + 0x94, 0x68, 0xf1, 0xb1, 0xa2, 0x7f, 0x30, 0x4e, + 0x7c, 0xe0, 0xa9, 0x39, 0x46, 0x65, 0x5c, 0x4b, + 0x9f, 0x28, 0x14, 0x3e, 0x7f, 0x6c, 0x42, 0xdf, + 0x17, 0x57, 0x05, 0xba, 0x8a, 0x7c, 0x3e, 0x60, + 0x84, 0x88, 0x9d, 0x58, 0xf0, 0x02, 0xe2, 0x53, + 0xc1, 0x10, 0x99, 0x79, 0x52, 0xb2, 0x8f, 0x18, + 0x60, 0x13, 0x09, 0x81, 0x08, 0xd1, 0x2b, 0x44, + 0x89, 0x12, 0x65, 0x54, 0x2b, 0x30, 0x51, 0x4f, + 0xbd, 0x3e, 0x71, 0x37, 0x36, 0xf0, 0x02, 0xaa, + 0xf5, 0x89, 0xef, 0x43, 0x38, 0x72, 0x1e, 0x4f, + 0x79, 0x40, 0xb8, 0x9d, 0x52, 0x7e, 0x69, 0x7c, + 0x7a, 0xe3, 0x3f, 0xc9, 0xa9, 0xaf, 0xdc, 0x69, + 0x00, 0xe6, 0x8c, 0x30, 0xa6, 0xae, 0x78, 0xd9, + 0xcc, 0xfa, 0x25, 0x3a, 0x70, 0xf9, 0x73, 0x97, + 0x94, 0xb6, 0x92, 0x62, 0x43, 0x00, 0x6a, 0x9b, + 0xd6, 0x5e, 0xa8, 0x7a, 0x03, 0xb0, 0xf0, 0x1d, + 0x89, 0xb1, 0x04, 0xcb, 0x85, 0x41, 0xdb, 0x01, + 0x9a, 0x31, 0x5d, 0x20, 0xec, 0xc4, 0xef, 0xe8, + 0xb2, 0x85, 0x0d, 0x93, 0x17, 0x2d, 0xb1, 0xe2, + 0x8d, 0x9f, 0x3e, 0x89, 0x45, 0x14, 0x26, 0x8a, + 0xe5, 0xd6, 0xea, 0x95, 0xbf, 0x3f, 0x86, 0x68, + 0xc3, 0x45, 0x17, 0xf2, 0x28, 0x8a, 0xb0, 0x97, + 0x47, 0xf5, 0x13, 0xa7, 0x11, 0x0a, 0x0f, 0x4c, + 0xef, 0x1c, 0xf0, 0x80, 0x84, 0xc0, 0x35, 0xe7, + 0x6c, 0x8b, 0xbb, 0xbc, 0x68, 0x63, 0x0c, 0x20, + 0xa3, 0x60, 0x4b, 0x44, 0x08, 0x76, 0x47, 0x7b, + 0x85, 0x15, 0x00, 0xe9, 0x13, 0x48, 0xf2, 0x62, + 0x29, 0xc9, 0x36, 0x64, 0xb7, 0x94, 0x0b, 0x34, + 0x6d, 0x2b, 0x80, 0x42, 0x25, 0x53, 0x73, 0x03, + 0x72, 0x18, 0x4f, 0x17, 0x27, 0x8e, 0x8a, 0x81, + 0xda, 0x80, 0x05, 0x60, 0xf3, 0xb5, 0x77, 0x8e, + 0xaf, 0x73, 0xde, 0xad, 0x3b, 0x0a, 0xfd, 0x06, + 0x00, 0x19, 0xb9, 0x50, 0x06, 0x00, 0x46, 0x82, + 0x84, 0x3a, 0x6c, 0xf0, 0x55, 0x02, 0x48, 0x34, + 0xb4, 0x97, 0x48, 0x9a, 0x87, 0x38, 0x9d, 0x46, + 0xcf, 0xce, 0x51, 0xe9, 0x21, 0x74, 0x44, 0x79, + 0xc1, 0x46, 0xe7, 0x83, 0x08, 0x84, 0x69, 0xb0, + 0x36, 0xa3, 0x53, 0x14, 0xf9, 0x46, 0x30, 0x93, + 0x71, 0x35, 0xb7, 0xaa, 0x4c, 0x2d, 0x4c, 0x01, + 0xf3, 0x90, 0x60, 0xaa, 0xbb, 0xd3, 0x7a, 0xa7, + 0xb1, 0x86, 0x70, 0x82, 0xa5, 0xb2, 0x20, 0x8c, + 0xa9, 0xd6, 0x00, 0xa2, 0x8d, 0x29, 0x1c, 0x9a, + 0x76, 0x68, 0x79, 0xc6, 0x15, 0x15, 0x03, 0xb4, + 0x04, 0xd0, 0xa8, 0x54, 0xad, 0x45, 0x5e, 0xa1, + 0x5b, 0x45, 0x1d, 0x3a, 0x61, 0xf2, 0xe1, 0x60, + 0xc1, 0x32, 0x5c, 0x2b, 0xb4, 0x0d, 0x36, 0x69, + 0x37, 0x00, 0xc6, 0x72, 0x76, 0xe1, 0x3c, 0x20, + 0x89, 0x1d, 0x5c, 0xdd, 0x56, 0xcc, 0x4e, 0x6e, + 0x74, 0xdf, 0xec, 0x74, 0xe4, 0xd0, 0x65, 0x55, + 0x83, 0xd6, 0xbf, 0x83, 0xf2, 0xc9, 0x79, 0xcb, + 0x2f, 0x10, 0x01, 0x01, 0x04, 0x6f, 0x2a, 0xe3, + 0x48, 0x94, 0x15, 0xf3, 0x1d, 0x0a, 0x2a, 0xea, + 0xb4, 0xf1, 0x82, 0xab, 0x64, 0x66, 0x48, 0xa2, + 0x4a, 0x50, 0x6a, 0x6b, 0x59, 0x27, 0x13, 0x7c, + 0xc9, 0x20, 0x1a, 0x34, 0x00, 0x03, 0xdd, 0x5f, + 0xfa, 0x3f, 0xff, 0xd9, +}; + +static const uint8_t data_tm4c_jpg[] = +{ + /* /tm4c.jpg */ + 0x2f, 0x74, 0x6d, 0x34, 0x63, 0x2e, 0x6a, 0x70, + 0x67, 0x00, + 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, + 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, + 0x00, 0x48, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43, + 0x00, 0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x03, + 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x05, + 0x08, 0x05, 0x05, 0x04, 0x04, 0x05, 0x0a, 0x07, + 0x07, 0x06, 0x08, 0x0c, 0x0a, 0x0c, 0x0c, 0x0b, + 0x0a, 0x0b, 0x0b, 0x0d, 0x0e, 0x12, 0x10, 0x0d, + 0x0e, 0x11, 0x0e, 0x0b, 0x0b, 0x10, 0x16, 0x10, + 0x11, 0x13, 0x14, 0x15, 0x15, 0x15, 0x0c, 0x0f, + 0x17, 0x18, 0x16, 0x14, 0x18, 0x12, 0x14, 0x15, + 0x14, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x03, 0x04, + 0x04, 0x05, 0x04, 0x05, 0x09, 0x05, 0x05, 0x09, + 0x14, 0x0d, 0x0b, 0x0d, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xff, 0xc2, + 0x00, 0x11, 0x08, 0x00, 0x4b, 0x00, 0x4b, 0x03, + 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, + 0x01, 0xff, 0xc4, 0x00, 0x1c, 0x00, 0x00, 0x02, + 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x04, 0x08, 0x01, 0x05, 0x07, 0x03, 0x02, 0xff, + 0xc4, 0x00, 0x19, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, + 0x03, 0x05, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, + 0x00, 0x02, 0x10, 0x03, 0x10, 0x00, 0x00, 0x01, + 0x50, 0xb1, 0x28, 0x0c, 0x81, 0x80, 0x18, 0x7d, + 0x3c, 0xfa, 0xff, 0x00, 0x6f, 0x2f, 0x59, 0xf9, + 0xfd, 0xb4, 0x67, 0x37, 0xa3, 0x2e, 0x0f, 0x01, + 0x50, 0x73, 0x27, 0x8f, 0x7d, 0x7c, 0xab, 0x5d, + 0x1e, 0x1d, 0x4f, 0xe7, 0xf7, 0x54, 0x5c, 0x6f, + 0x70, 0x48, 0x30, 0x49, 0x17, 0x07, 0x9e, 0x9e, + 0x7d, 0xe7, 0xb7, 0x97, 0x85, 0x9d, 0x8f, 0x87, + 0xae, 0xa5, 0xe7, 0x4e, 0xca, 0xb8, 0x41, 0x36, + 0x43, 0x0e, 0xb2, 0xc3, 0xd1, 0xe1, 0xa2, 0xd4, + 0x0e, 0xeb, 0xcb, 0xd1, 0x50, 0xf3, 0x55, 0x54, + 0x02, 0x55, 0x9d, 0x37, 0xdf, 0xc7, 0xda, 0xcc, + 0x81, 0x61, 0x79, 0xfd, 0xaa, 0x3c, 0xaa, 0xaa, + 0x19, 0x1e, 0x3d, 0x7c, 0xb6, 0x56, 0x00, 0x05, + 0x94, 0xf2, 0xf5, 0xa9, 0x51, 0x31, 0x54, 0x8d, + 0xbe, 0xb3, 0xb9, 0xd6, 0x40, 0x00, 0x2d, 0x16, + 0x37, 0x55, 0x25, 0xb2, 0x67, 0x30, 0x49, 0xda, + 0x9e, 0x68, 0x8e, 0x41, 0x3e, 0xc8, 0x85, 0xa8, + 0xce, 0xaa, 0x9a, 0xea, 0x4f, 0x1d, 0x67, 0xa1, + 0x46, 0xbc, 0xfb, 0x25, 0x10, 0x4d, 0x5d, 0x5a, + 0xbc, 0xd9, 0xaa, 0x8c, 0x80, 0x00, 0x18, 0x03, + 0xd8, 0xb1, 0x6b, 0xff, 0xc4, 0x00, 0x25, 0x10, + 0x00, 0x00, 0x06, 0x03, 0x00, 0x01, 0x05, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x13, + 0x16, 0x36, 0x07, 0x10, 0x11, 0x15, 0x21, 0x12, + 0x14, 0x31, 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, + 0x00, 0x01, 0x05, 0x02, 0xb8, 0x5f, 0x25, 0x73, + 0x60, 0xee, 0x26, 0x87, 0x71, 0x34, 0x3b, 0x89, + 0xa1, 0xdc, 0x4d, 0x0e, 0xe2, 0x68, 0x77, 0x13, + 0x42, 0x12, 0xc5, 0x39, 0x2c, 0xf3, 0xfb, 0xeb, + 0x88, 0x29, 0xa3, 0xbc, 0x8b, 0xb2, 0xe4, 0xa5, + 0xb5, 0xa7, 0x03, 0x02, 0xa4, 0x93, 0x8f, 0x4e, + 0xb4, 0x30, 0x96, 0xab, 0x47, 0xd7, 0x4a, 0xc6, + 0xbc, 0x59, 0x0b, 0x67, 0x1a, 0xcd, 0x9a, 0xce, + 0x3d, 0x3d, 0x66, 0xb2, 0x3f, 0x53, 0x11, 0x5e, + 0x26, 0xc1, 0x56, 0xcf, 0xcc, 0x2d, 0x85, 0x0c, + 0xb9, 0xb7, 0x66, 0x3e, 0x4d, 0x65, 0x9e, 0xc4, + 0xcc, 0xbd, 0x68, 0xdd, 0x79, 0x18, 0xb7, 0x2c, + 0xeb, 0xb2, 0xee, 0xd1, 0x9d, 0xfb, 0x38, 0x51, + 0x04, 0xfa, 0x40, 0x84, 0x55, 0xd9, 0xd6, 0x1b, + 0x05, 0x4f, 0xf6, 0x0a, 0x7d, 0x2c, 0x38, 0xb8, + 0xbb, 0xab, 0xe7, 0x41, 0x20, 0x1d, 0x13, 0x0a, + 0x56, 0xd5, 0xce, 0x33, 0x5a, 0x55, 0x32, 0x34, + 0xa3, 0x91, 0x54, 0x9f, 0xc7, 0x65, 0x89, 0x36, + 0x0d, 0x82, 0xa1, 0xfb, 0x5f, 0xb5, 0x79, 0x37, + 0xc7, 0xbb, 0x66, 0xd9, 0x72, 0xb2, 0x25, 0x2a, + 0x09, 0xff, 0x00, 0x31, 0xb0, 0x6c, 0x14, 0xdf, + 0x1d, 0xb5, 0x79, 0x37, 0xb7, 0xfa, 0x18, 0xa1, + 0x86, 0xa9, 0x6c, 0x1b, 0x06, 0xc1, 0xb0, 0x52, + 0xbc, 0x6a, 0xd5, 0xe4, 0xcd, 0x6a, 0x2f, 0x5e, + 0x40, 0x99, 0xb2, 0xa4, 0x51, 0xa3, 0x43, 0x22, + 0x6d, 0x83, 0x60, 0xd8, 0x36, 0x0d, 0x82, 0x8f, + 0xfb, 0x58, 0xb2, 0x1c, 0xa9, 0xdb, 0x63, 0xa6, + 0x61, 0xd4, 0x87, 0xf5, 0x05, 0xe4, 0x6b, 0xc7, + 0x12, 0x2e, 0xf1, 0xf6, 0x65, 0xd3, 0xf0, 0xf9, + 0xba, 0x8b, 0x3f, 0x49, 0x8b, 0xb7, 0x05, 0x24, + 0x73, 0xd5, 0x4c, 0xb2, 0x4b, 0x37, 0xc5, 0x13, + 0xc5, 0x6d, 0xa5, 0xc9, 0x2d, 0x11, 0x72, 0x8e, + 0xe1, 0x9e, 0x61, 0x5f, 0x8c, 0xad, 0x77, 0x72, + 0xb2, 0x98, 0xb4, 0x98, 0x8e, 0x17, 0xb4, 0xe5, + 0x75, 0xd4, 0xb9, 0xaa, 0xe5, 0x37, 0x16, 0xb5, + 0xdd, 0x62, 0x46, 0x67, 0x32, 0x29, 0xd0, 0x48, + 0x6e, 0x4a, 0xd9, 0x59, 0x8c, 0x7e, 0xfb, 0x8d, + 0x86, 0x1c, 0x6c, 0x38, 0xe3, 0x61, 0x87, 0x1b, + 0x0e, 0x38, 0xd8, 0x61, 0xc6, 0xc3, 0x8e, 0x36, + 0x1c, 0x23, 0x4c, 0x86, 0xda, 0xd5, 0xba, 0x4d, + 0x9b, 0x7f, 0xff, 0xc4, 0x00, 0x21, 0x11, 0x00, + 0x01, 0x04, 0x01, 0x03, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x02, 0x11, 0x20, 0x31, 0x10, 0x12, 0x21, + 0x13, 0x30, 0x32, 0x40, 0x51, 0xff, 0xda, 0x00, + 0x08, 0x01, 0x03, 0x01, 0x01, 0x3f, 0x01, 0xbb, + 0xdd, 0xb4, 0x2e, 0xa3, 0xd3, 0x4c, 0x89, 0xec, + 0x3e, 0x09, 0x50, 0x99, 0xe2, 0x2e, 0xf7, 0x7c, + 0xd2, 0x13, 0x71, 0x62, 0xa1, 0x42, 0x84, 0xdc, + 0x54, 0xf1, 0x51, 0x8a, 0x9e, 0x6a, 0x28, 0x6c, + 0x3d, 0xff, 0x00, 0xff, 0xc4, 0x00, 0x22, 0x11, + 0x00, 0x01, 0x04, 0x00, 0x05, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x11, 0x20, 0x03, 0x10, 0x12, + 0x31, 0x32, 0x13, 0x21, 0x30, 0x40, 0x41, 0xff, + 0xda, 0x00, 0x08, 0x01, 0x02, 0x01, 0x01, 0x3f, + 0x01, 0xbe, 0x1b, 0x75, 0x95, 0xd2, 0x62, 0x70, + 0x83, 0x1e, 0x0c, 0x39, 0x01, 0x4a, 0x7f, 0x23, + 0x76, 0x37, 0xe9, 0xca, 0x53, 0xb9, 0x1b, 0x35, + 0x03, 0x9b, 0xb7, 0xa8, 0x13, 0x53, 0xbd, 0x47, + 0x6a, 0x9d, 0xe8, 0x2c, 0x7d, 0xff, 0x00, 0xff, + 0xc4, 0x00, 0x3f, 0x10, 0x00, 0x02, 0x01, 0x03, + 0x01, 0x03, 0x06, 0x0a, 0x09, 0x02, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, + 0x04, 0x11, 0x12, 0x13, 0x21, 0x31, 0x05, 0x22, + 0x34, 0x41, 0x51, 0xd1, 0x14, 0x20, 0x32, 0x61, + 0x71, 0x81, 0x91, 0x92, 0x93, 0xb3, 0x10, 0x15, + 0x23, 0x42, 0x52, 0x62, 0x72, 0x74, 0xa1, 0xa2, + 0xb2, 0x06, 0x24, 0x73, 0x83, 0x94, 0xb1, 0xf1, + 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, 0x06, + 0x3f, 0x02, 0xbc, 0x8a, 0x0b, 0x87, 0xb7, 0x8a, + 0x09, 0x1a, 0x25, 0x58, 0xd8, 0x8e, 0x07, 0x1d, + 0x55, 0xd3, 0xe7, 0xf8, 0xad, 0xdf, 0x5d, 0x3e, + 0x7f, 0x8a, 0xdd, 0xf5, 0xd3, 0xe7, 0xf8, 0xad, + 0xdf, 0x5d, 0x3e, 0x7f, 0x8a, 0xdd, 0xf5, 0xd3, + 0xe7, 0xf8, 0xad, 0xdf, 0x5d, 0x3e, 0x7f, 0x8a, + 0xdd, 0xf4, 0x13, 0xc3, 0xee, 0x04, 0x4b, 0xbe, + 0x46, 0xda, 0xb7, 0x0f, 0x6d, 0x74, 0x8b, 0x8f, + 0xf9, 0x0f, 0xdf, 0x51, 0x49, 0x37, 0x3a, 0x4c, + 0xba, 0x96, 0xed, 0xc3, 0x11, 0x9f, 0xe2, 0xb9, + 0x48, 0xba, 0x97, 0x41, 0x79, 0x26, 0xa5, 0x07, + 0x19, 0x1a, 0xbb, 0x6b, 0x93, 0x60, 0x6b, 0x7b, + 0x98, 0x21, 0x9e, 0xc8, 0xdf, 0x4b, 0x27, 0x84, + 0x6a, 0xd2, 0xba, 0x18, 0xe9, 0xf2, 0x7c, 0xdc, + 0x6a, 0x18, 0x35, 0x37, 0xd6, 0xaf, 0x77, 0xa0, + 0xfe, 0x11, 0x0f, 0xda, 0x6f, 0xc7, 0x13, 0xba, + 0x22, 0xde, 0xba, 0xbb, 0xbc, 0xb9, 0xb5, 0xbb, + 0x9e, 0xd9, 0x4c, 0x09, 0x0c, 0x0e, 0xfb, 0x26, + 0xe7, 0xa6, 0x4b, 0x31, 0xc7, 0x68, 0x23, 0xd3, + 0x4b, 0xc9, 0xf1, 0xc3, 0x77, 0x15, 0xb6, 0x75, + 0xb2, 0x4e, 0x98, 0x99, 0x63, 0xc6, 0xa3, 0xbb, + 0xb7, 0x1c, 0x3d, 0x55, 0xca, 0xed, 0x3c, 0x32, + 0x34, 0x70, 0xac, 0x12, 0xdb, 0xc7, 0x3d, 0xca, + 0xdb, 0x73, 0x64, 0xce, 0xe6, 0x66, 0xeb, 0x1c, + 0x3d, 0x55, 0xca, 0x30, 0xd9, 0x34, 0xe6, 0xfe, + 0x3b, 0xbd, 0x94, 0x0b, 0x21, 0xf2, 0x97, 0x11, + 0xea, 0xf6, 0x6b, 0x27, 0x3d, 0x82, 0x9a, 0xde, + 0xd8, 0x31, 0x47, 0x4d, 0xa0, 0x67, 0x39, 0x66, + 0xcf, 0xd1, 0x1f, 0xfa, 0x92, 0xfc, 0xc6, 0xae, + 0x51, 0x85, 0x70, 0x1a, 0x4b, 0xd7, 0x51, 0x9e, + 0x1b, 0xde, 0x93, 0xc1, 0xee, 0x9a, 0x5d, 0x11, + 0x1b, 0x45, 0x32, 0xae, 0xcc, 0xe9, 0xe7, 0xa9, + 0x41, 0x9e, 0xac, 0x06, 0xff, 0x00, 0xdd, 0xd4, + 0xaf, 0x2d, 0xf4, 0x57, 0x30, 0xcc, 0x23, 0x7c, + 0x99, 0x78, 0x91, 0xa9, 0x17, 0xd3, 0x80, 0x0d, + 0x5d, 0xb1, 0xe5, 0x91, 0x67, 0x7b, 0x18, 0xd8, + 0xcd, 0x13, 0xf5, 0xec, 0xc0, 0x0a, 0x3c, 0xfd, + 0x95, 0x71, 0x7a, 0x2f, 0x31, 0x2d, 0xcc, 0x53, + 0x6d, 0xf3, 0xbd, 0x8f, 0x5e, 0x9c, 0xfe, 0x6c, + 0x1f, 0x61, 0xaf, 0xaa, 0x6e, 0x6e, 0x0b, 0x45, + 0xb2, 0x8f, 0x29, 0xd5, 0x8f, 0x2c, 0x0f, 0x51, + 0x63, 0x42, 0xea, 0x7b, 0x97, 0x33, 0x31, 0xd6, + 0xb9, 0xfb, 0xbc, 0xd0, 0xb9, 0xf4, 0xe9, 0x02, + 0x97, 0x5b, 0x6a, 0xd2, 0xa1, 0x47, 0xa3, 0xe8, + 0x87, 0xf5, 0xcb, 0xf3, 0x1a, 0xaf, 0xe2, 0x27, + 0x48, 0x7b, 0xd7, 0x52, 0x7b, 0x39, 0xf5, 0xb5, + 0x87, 0x95, 0xda, 0x59, 0x1f, 0x56, 0xe6, 0x97, + 0x9d, 0xa1, 0x74, 0xe8, 0x18, 0x1c, 0x58, 0x86, + 0xe1, 0xdb, 0x45, 0x53, 0x95, 0x63, 0x5d, 0x18, + 0xcf, 0xda, 0x32, 0xaa, 0xef, 0x6c, 0x67, 0xb3, + 0x78, 0xf6, 0x91, 0x52, 0xc9, 0x25, 0xd2, 0x8d, + 0x9e, 0x73, 0xb4, 0x07, 0x3b, 0x94, 0x1c, 0x7a, + 0x7c, 0xde, 0x63, 0x48, 0x91, 0xf2, 0x90, 0xc1, + 0xd6, 0xba, 0x06, 0x79, 0xcc, 0x0c, 0xb9, 0x0b, + 0xdb, 0xb9, 0x3f, 0xac, 0x76, 0xd2, 0x5c, 0x35, + 0xf4, 0x72, 0x98, 0x8b, 0x87, 0x05, 0xb2, 0x0e, + 0x8d, 0x38, 0xc7, 0x9b, 0x7d, 0x17, 0xdb, 0x24, + 0xa0, 0x4a, 0x62, 0xe6, 0xf6, 0x8f, 0xa6, 0x0f, + 0xd7, 0x27, 0xcc, 0x6a, 0xe5, 0x6f, 0xdd, 0x49, + 0xfd, 0xc7, 0xc4, 0x08, 0xbe, 0xb3, 0xd9, 0x4a, + 0x88, 0x30, 0xa3, 0xc4, 0xb6, 0xfd, 0x52, 0x7c, + 0xc6, 0xae, 0x55, 0xfd, 0xd4, 0x9f, 0xdc, 0x7c, + 0x4f, 0xce, 0x78, 0xf8, 0xb6, 0xbe, 0x99, 0x3e, + 0x63, 0x57, 0x2b, 0x7e, 0xea, 0x4f, 0xee, 0x35, + 0xf5, 0xb4, 0x6d, 0x0f, 0x83, 0xed, 0x84, 0x3a, + 0x0b, 0xe1, 0xf2, 0x48, 0x1d, 0x98, 0xc6, 0xfe, + 0xda, 0xd0, 0x51, 0xb5, 0x1e, 0x18, 0x1c, 0x7d, + 0x15, 0xae, 0x54, 0x2a, 0x7e, 0xe8, 0x61, 0xe3, + 0x5a, 0x7a, 0x64, 0xf9, 0x8d, 0x5c, 0xa4, 0xcf, + 0x18, 0x99, 0x16, 0xf1, 0xc9, 0x8c, 0x92, 0x03, + 0x0d, 0x5c, 0x37, 0x54, 0x76, 0xdf, 0xe1, 0xfb, + 0x7b, 0xa7, 0x68, 0x19, 0x6e, 0x9e, 0xce, 0x02, + 0x49, 0xc9, 0x07, 0x8e, 0xae, 0x20, 0x36, 0x9f, + 0xe2, 0xb9, 0x32, 0xda, 0xc6, 0x69, 0x66, 0x9a, + 0xca, 0x23, 0x04, 0xd2, 0x31, 0xf4, 0x61, 0x73, + 0xd6, 0x7c, 0xae, 0x14, 0xd9, 0xe4, 0xd9, 0x1e, + 0x65, 0xba, 0x96, 0x46, 0x46, 0xb6, 0x57, 0xda, + 0x0d, 0xaf, 0x93, 0x9d, 0xff, 0x00, 0xa7, 0xaf, + 0x7d, 0x48, 0x13, 0x91, 0x2e, 0xa4, 0xd5, 0x2e, + 0xd1, 0x1d, 0xad, 0x78, 0x11, 0xbb, 0x65, 0x81, + 0xc4, 0x63, 0x3b, 0xf3, 0xc7, 0xaa, 0x9b, 0xc1, + 0xec, 0xee, 0x15, 0x5f, 0xc9, 0x8c, 0xc5, 0xbf, + 0x3c, 0x0e, 0xe1, 0xf9, 0xb7, 0x56, 0xa8, 0xad, + 0x67, 0x95, 0x7b, 0x52, 0x32, 0x45, 0x15, 0x4b, + 0x3b, 0x87, 0x61, 0xc4, 0x2c, 0x4c, 0x71, 0x48, + 0x65, 0x8a, 0x48, 0x83, 0x8c, 0xae, 0xb5, 0x23, + 0x50, 0xf3, 0x55, 0x97, 0xfb, 0x9f, 0x31, 0xab, + 0x95, 0x41, 0x18, 0x3e, 0x13, 0x21, 0xfe, 0x69, + 0x6e, 0xac, 0xa6, 0x30, 0x4e, 0xbb, 0x83, 0x0a, + 0xcf, 0xae, 0x9f, 0xec, 0xd5, 0x63, 0x62, 0xcd, + 0xa7, 0xf0, 0x93, 0x21, 0x72, 0x41, 0xf5, 0xe3, + 0xcf, 0x81, 0x9a, 0xda, 0xa5, 0xb4, 0x49, 0x83, + 0x2f, 0x30, 0x0e, 0x6f, 0x3e, 0x21, 0x19, 0xdd, + 0xc3, 0xab, 0x34, 0x93, 0xec, 0x34, 0xca, 0xb8, + 0xc1, 0x57, 0xdd, 0xe5, 0x87, 0xff, 0x00, 0xb1, + 0xec, 0xa9, 0x16, 0x78, 0x51, 0xb6, 0x9c, 0x74, + 0xe0, 0x7d, 0xe0, 0xdb, 0x81, 0x04, 0x71, 0x1f, + 0xc9, 0xa4, 0x12, 0x22, 0xb0, 0x8d, 0x65, 0x55, + 0xed, 0xc3, 0xa6, 0x9c, 0x67, 0xcd, 0xd5, 0x56, + 0xea, 0xc8, 0x03, 0x44, 0x31, 0xaf, 0xef, 0x36, + 0xe0, 0x38, 0xf9, 0xb1, 0xd7, 0x9a, 0xb0, 0xdc, + 0x77, 0xeb, 0x3f, 0xd6, 0xd4, 0x27, 0x9e, 0xd1, + 0x5e, 0x52, 0x37, 0xb6, 0x48, 0xcf, 0xb2, 0xba, + 0x10, 0xf7, 0xdb, 0xbe, 0xba, 0x10, 0xf7, 0xdb, + 0xbe, 0xba, 0x10, 0xf7, 0xdb, 0xbe, 0xba, 0x10, + 0xf7, 0xdb, 0xbe, 0xba, 0x10, 0xf7, 0xdb, 0xbe, + 0xba, 0x10, 0xf7, 0xdb, 0xbe, 0xba, 0x10, 0xf7, + 0xdb, 0xbe, 0x97, 0xfc, 0x90, 0xe3, 0xf8, 0xdb, + 0xbe, 0xa3, 0x8a, 0x24, 0x09, 0x1a, 0xae, 0x15, + 0x47, 0x55, 0x7f, 0xff, 0xc4, 0x00, 0x24, 0x10, + 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x03, 0x00, + 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x11, 0x21, 0x00, 0x31, 0x41, 0x51, 0x61, + 0x71, 0x10, 0x20, 0x81, 0x30, 0x91, 0xa1, 0xc1, + 0xf0, 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, + 0x01, 0x3f, 0x21, 0x23, 0x87, 0x57, 0x86, 0x93, + 0x22, 0x56, 0x26, 0xfb, 0xeb, 0xee, 0xc9, 0x93, + 0x26, 0x4c, 0x99, 0x6b, 0xbd, 0xa5, 0x3d, 0x0e, + 0xcf, 0xfd, 0xaf, 0x8a, 0x64, 0x9d, 0x34, 0xaa, + 0xec, 0x3b, 0x49, 0x3e, 0x71, 0x65, 0x91, 0x2f, + 0x9b, 0x21, 0x06, 0x3d, 0xc3, 0x90, 0xa3, 0xe2, + 0x58, 0x28, 0x11, 0xd2, 0x5f, 0xe9, 0x18, 0xcd, + 0x33, 0xe3, 0x96, 0x34, 0x49, 0x24, 0x40, 0x8b, + 0x40, 0x04, 0xe0, 0x18, 0x99, 0xe9, 0x2c, 0xe7, + 0xa8, 0x10, 0xd1, 0x38, 0xcd, 0x38, 0x56, 0xc3, + 0x11, 0x13, 0xd1, 0xda, 0x69, 0x78, 0xb4, 0x62, + 0x80, 0x2e, 0x08, 0x82, 0x0f, 0x92, 0xb2, 0x2a, + 0x63, 0xe4, 0x0a, 0x06, 0x89, 0xa4, 0xe5, 0x2e, + 0x42, 0x96, 0x1b, 0x41, 0x52, 0x21, 0x06, 0xbc, + 0x71, 0xbb, 0x3e, 0x32, 0x1c, 0x26, 0xe5, 0x06, + 0x70, 0x14, 0x09, 0x72, 0x7e, 0x97, 0x37, 0x54, + 0x9b, 0x49, 0xcf, 0x55, 0x58, 0x2a, 0x93, 0x43, + 0x85, 0x08, 0x92, 0xda, 0x1e, 0x1e, 0x5c, 0x96, + 0x5f, 0x80, 0x6a, 0x8e, 0xc6, 0x68, 0xc5, 0x23, + 0x0f, 0x38, 0xd1, 0x86, 0x35, 0x14, 0x2e, 0xe5, + 0xa9, 0x1e, 0x6c, 0xb9, 0x3e, 0x40, 0x6d, 0xd9, + 0x49, 0x4f, 0xd5, 0x9c, 0xd0, 0x2f, 0x2a, 0x65, + 0xc5, 0x6c, 0x0f, 0x47, 0xbc, 0x46, 0x7d, 0xa7, + 0xc1, 0xd1, 0xf1, 0x52, 0x32, 0x3c, 0x22, 0xdc, + 0x4a, 0x27, 0x25, 0x55, 0x2e, 0xfc, 0x87, 0x71, + 0xac, 0x4c, 0xb0, 0x18, 0x7e, 0x9a, 0x40, 0x19, + 0x13, 0xe1, 0x2d, 0xf4, 0xb6, 0xd5, 0x76, 0xc1, + 0x94, 0xdc, 0x27, 0xa3, 0x5d, 0x3a, 0x32, 0x7a, + 0x42, 0x52, 0x20, 0x02, 0x6c, 0xac, 0x14, 0xa8, + 0x62, 0x21, 0x84, 0xf9, 0x01, 0xdf, 0xbb, 0xf0, + 0x32, 0x4b, 0x0d, 0xb2, 0x36, 0x4c, 0x4e, 0xca, + 0x75, 0xe3, 0xbc, 0xf6, 0xcf, 0x6c, 0x72, 0x7e, + 0x13, 0x24, 0x3a, 0xc8, 0x3a, 0xc8, 0x3a, 0xc2, + 0xda, 0x27, 0xf0, 0x77, 0x83, 0xd0, 0x30, 0x7d, + 0x23, 0x96, 0xfa, 0x27, 0x40, 0x50, 0x04, 0xaf, + 0x06, 0x5e, 0xbb, 0xdf, 0xfa, 0xfa, 0x83, 0x95, + 0xf8, 0xcc, 0x92, 0xff, 0x00, 0x81, 0x54, 0x15, + 0x6e, 0x19, 0x0b, 0x46, 0x10, 0xe2, 0xa4, 0x9e, + 0xfd, 0x8f, 0x26, 0x18, 0xda, 0xf0, 0x8f, 0xbf, + 0xb0, 0x14, 0xbc, 0x00, 0xec, 0x0a, 0x84, 0xe5, + 0x36, 0x27, 0x52, 0x5e, 0x04, 0xf6, 0xc7, 0xea, + 0x13, 0xe6, 0x90, 0xd3, 0x22, 0x72, 0x53, 0x82, + 0x29, 0x02, 0xc6, 0xa1, 0xb3, 0x4b, 0xdf, 0x5b, + 0xd5, 0x35, 0x92, 0x04, 0x6c, 0x89, 0x64, 0x94, + 0xa1, 0x95, 0x1e, 0x91, 0xac, 0xd9, 0x54, 0x86, + 0xfb, 0x11, 0x2d, 0x27, 0x26, 0x58, 0x09, 0x23, + 0x51, 0x81, 0xab, 0x8f, 0xc1, 0xbc, 0xaa, 0xd2, + 0xba, 0xb9, 0x86, 0xc3, 0x87, 0x2a, 0xb3, 0x2e, + 0x94, 0x1b, 0x03, 0xa4, 0xfe, 0xcc, 0x94, 0x08, + 0xb1, 0x7b, 0x25, 0xb3, 0xd6, 0x29, 0x4f, 0x38, + 0x16, 0x55, 0x11, 0xe9, 0x69, 0xfe, 0x1c, 0x33, + 0x3c, 0xc1, 0xb4, 0xec, 0x46, 0x93, 0xc3, 0x92, + 0x14, 0x95, 0x94, 0x54, 0xb8, 0xe1, 0x41, 0x16, + 0x55, 0xf2, 0x2a, 0x6e, 0x2c, 0x10, 0x18, 0xc0, + 0x12, 0x02, 0x08, 0xe9, 0x0f, 0x0a, 0x22, 0x25, + 0x68, 0x2b, 0x16, 0xa2, 0xf8, 0x80, 0x68, 0x11, + 0x5c, 0x57, 0x4a, 0x22, 0x87, 0x1a, 0xee, 0x11, + 0x82, 0x15, 0x48, 0x02, 0xcb, 0xad, 0xa5, 0x38, + 0xcb, 0x89, 0xd6, 0xb7, 0xae, 0x45, 0x9e, 0x93, + 0x1a, 0x8c, 0xbe, 0x8e, 0xf8, 0x42, 0x10, 0xc0, + 0x53, 0x4c, 0x91, 0x2d, 0xc4, 0x43, 0x5b, 0xd4, + 0xb8, 0x72, 0xa7, 0x0d, 0xb4, 0xfb, 0x48, 0x9f, + 0xe0, 0x8d, 0x9a, 0x36, 0x68, 0xd9, 0xb3, 0x22, + 0x57, 0x21, 0x4a, 0x98, 0x31, 0x3a, 0x26, 0x01, + 0xd6, 0x7f, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, + 0x12, 0x01, 0x27, 0x03, 0xc0, 0x00, 0x97, 0x81, + 0x20, 0x90, 0x83, 0xe8, 0x82, 0x2d, 0x20, 0xb2, + 0x48, 0xa9, 0x2c, 0xc8, 0x0e, 0xdb, 0x03, 0x20, + 0xff, 0x00, 0xfe, 0x20, 0x70, 0xe4, 0x93, 0x92, + 0x3c, 0x9f, 0x9c, 0x16, 0xd9, 0xb4, 0x8f, 0xff, + 0xc4, 0x00, 0x1e, 0x11, 0x00, 0x03, 0x00, 0x02, + 0x02, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x10, + 0x31, 0x20, 0x21, 0x30, 0x41, 0x51, 0x61, 0xff, + 0xda, 0x00, 0x08, 0x01, 0x03, 0x01, 0x01, 0x3f, + 0x10, 0x94, 0x84, 0x21, 0x08, 0x43, 0xb2, 0xf6, + 0x7e, 0xc4, 0x3f, 0xaf, 0x03, 0x50, 0xfc, 0x20, + 0xc6, 0xe3, 0x68, 0x69, 0xbd, 0xe1, 0xaf, 0x93, + 0xf5, 0x10, 0xe7, 0x26, 0x8e, 0x2d, 0x14, 0x7d, + 0xba, 0xc8, 0x42, 0x1a, 0xb8, 0xb5, 0x10, 0x84, + 0x21, 0xa2, 0xe0, 0xde, 0x89, 0x88, 0x42, 0x1a, + 0x65, 0xb9, 0x98, 0x42, 0x32, 0x0b, 0x59, 0x7d, + 0xf2, 0x82, 0xd6, 0x21, 0x08, 0x42, 0x10, 0x84, + 0xc7, 0xff, 0xc4, 0x00, 0x1f, 0x11, 0x00, 0x03, + 0x00, 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x11, 0x20, 0x31, 0x10, 0x21, 0x41, 0x51, 0x61, + 0x30, 0x71, 0xff, 0xda, 0x00, 0x08, 0x01, 0x02, + 0x01, 0x01, 0x3f, 0x10, 0xb0, 0xbf, 0x0a, 0x5f, + 0x85, 0x29, 0x4e, 0x97, 0xc7, 0x93, 0xe6, 0x53, + 0xf4, 0xfc, 0x12, 0x45, 0xef, 0x87, 0x7f, 0xed, + 0x9a, 0xd2, 0x86, 0xc4, 0xd2, 0xd7, 0x07, 0xc8, + 0x44, 0xdd, 0x65, 0x4a, 0x53, 0x6e, 0x34, 0x41, + 0x44, 0xa2, 0x29, 0x4a, 0x6e, 0xc5, 0x60, 0xa5, + 0x29, 0x4d, 0x98, 0x27, 0x92, 0x94, 0xa5, 0x29, + 0xb7, 0x29, 0x5e, 0x69, 0x4a, 0x51, 0xef, 0x95, + 0xd6, 0x6f, 0x9a, 0x52, 0xe5, 0xff, 0xc4, 0x00, + 0x24, 0x10, 0x01, 0x01, 0x00, 0x02, 0x02, 0x03, + 0x00, 0x02, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x11, 0x00, 0x21, 0x31, 0x61, + 0x41, 0x51, 0x71, 0x20, 0xa1, 0x10, 0x81, 0x91, + 0xb1, 0xc1, 0xd1, 0xff, 0xda, 0x00, 0x08, 0x01, + 0x01, 0x00, 0x01, 0x3f, 0x10, 0x5a, 0xb8, 0xa5, + 0x42, 0x42, 0xd8, 0x10, 0xa2, 0x81, 0x80, 0x3f, + 0x28, 0x22, 0x64, 0xc9, 0x13, 0x35, 0x4f, 0x26, + 0x1c, 0xdf, 0x93, 0xd6, 0x43, 0xfa, 0xb1, 0x16, + 0x6b, 0x21, 0xa7, 0x08, 0x2e, 0x63, 0x96, 0x2d, + 0x37, 0x58, 0x08, 0x03, 0x00, 0x29, 0x80, 0x40, + 0x95, 0xe6, 0x00, 0x8f, 0xbc, 0x29, 0x43, 0x42, + 0xd8, 0xc9, 0x88, 0x86, 0x61, 0xbd, 0x45, 0xd7, + 0x64, 0x94, 0x18, 0xda, 0x72, 0xe7, 0xca, 0x3a, + 0x50, 0x08, 0x9b, 0x14, 0x29, 0x93, 0x16, 0xd8, + 0x5d, 0x6a, 0x61, 0xa8, 0x85, 0x97, 0x0b, 0xf9, + 0x93, 0x87, 0x26, 0x34, 0xa9, 0x03, 0x77, 0x8d, + 0x05, 0x05, 0xc1, 0x29, 0xa1, 0x52, 0x22, 0x11, + 0x83, 0x70, 0x27, 0x8a, 0x81, 0x6e, 0x9b, 0x90, + 0x88, 0x68, 0x42, 0xb8, 0xd4, 0x1f, 0xd0, 0xb7, + 0x16, 0x1b, 0x6c, 0x13, 0xba, 0xaf, 0x79, 0xd8, + 0xcf, 0x8d, 0x3a, 0xd9, 0xf9, 0x37, 0x80, 0xa9, + 0x5f, 0x06, 0x25, 0x2c, 0x49, 0x6d, 0x13, 0xa1, + 0x2c, 0x5d, 0x52, 0x45, 0x14, 0xaf, 0x43, 0x02, + 0xd1, 0x35, 0xa6, 0xc5, 0x1a, 0xdb, 0x72, 0x93, + 0x1d, 0xc8, 0x2e, 0x1a, 0x3b, 0x73, 0x42, 0xa6, + 0x0a, 0xbc, 0x4f, 0xe7, 0xa8, 0xb9, 0x46, 0x82, + 0xd3, 0x48, 0xf3, 0xaa, 0xcb, 0xb6, 0x94, 0x10, + 0x6e, 0x1a, 0x75, 0xac, 0x42, 0x4e, 0xf2, 0x80, + 0xd9, 0xa2, 0xab, 0xea, 0xf2, 0xe1, 0xb1, 0x34, + 0x5e, 0x36, 0x1f, 0x41, 0x9f, 0x59, 0xdc, 0xc9, + 0x9c, 0xe9, 0xe2, 0xa1, 0x4c, 0xdb, 0x5a, 0x1b, + 0xbc, 0xde, 0xe9, 0xf4, 0x8b, 0xf4, 0x40, 0xd9, + 0x82, 0x41, 0xa6, 0x0b, 0x7e, 0xa1, 0x16, 0x88, + 0x86, 0x91, 0x10, 0xe6, 0x97, 0x15, 0xad, 0x8e, + 0x12, 0x29, 0x48, 0xfd, 0xda, 0xa1, 0x0d, 0xea, + 0xe4, 0x11, 0x15, 0x2a, 0x85, 0x8b, 0xa3, 0x71, + 0x23, 0xaa, 0xd1, 0x8d, 0x31, 0x85, 0x79, 0x29, + 0x01, 0xc8, 0xb2, 0x02, 0x18, 0xe1, 0x70, 0xb4, + 0x72, 0x56, 0x80, 0x6d, 0x18, 0x3f, 0x8a, 0xed, + 0x25, 0xcf, 0x6c, 0x2b, 0xa1, 0xfd, 0xb3, 0x8b, + 0x4d, 0x71, 0xac, 0x0a, 0x40, 0x4e, 0xb0, 0x12, + 0x72, 0xa1, 0x41, 0xe5, 0x7f, 0xcf, 0x70, 0xc2, + 0xec, 0xa0, 0x85, 0x7d, 0xaf, 0xb5, 0x6a, 0xbe, + 0xdc, 0x09, 0xc4, 0x33, 0xeb, 0x3e, 0xf3, 0xb7, + 0x9b, 0xf0, 0xfd, 0x3b, 0x67, 0x40, 0x2a, 0xbe, + 0x8c, 0x93, 0x86, 0x23, 0x78, 0xf4, 0x3a, 0x3f, + 0xcd, 0xcf, 0xaf, 0xde, 0x7d, 0x7e, 0xf3, 0xeb, + 0xf7, 0x9f, 0x5f, 0xbc, 0xed, 0x86, 0xfe, 0x1d, + 0x57, 0x8f, 0x2d, 0x33, 0x02, 0x1b, 0x08, 0xe0, + 0xab, 0x26, 0x2d, 0x95, 0x2e, 0x48, 0xbb, 0x0a, + 0x6a, 0x52, 0x82, 0x6c, 0x66, 0x4b, 0xab, 0xa3, + 0x95, 0x4d, 0x5e, 0xc4, 0x3e, 0x39, 0xf5, 0x9f, + 0x59, 0xf5, 0x9f, 0x59, 0xf5, 0x9d, 0xa4, 0xf8, + 0xa8, 0x5a, 0xba, 0x86, 0xa8, 0x22, 0x29, 0x40, + 0x34, 0x46, 0x39, 0xce, 0xbf, 0x78, 0x07, 0x24, + 0x88, 0xcb, 0x87, 0x13, 0x18, 0x98, 0xab, 0x90, + 0x19, 0x1a, 0x8f, 0x53, 0xa9, 0x31, 0xbf, 0x01, + 0x9f, 0x79, 0x02, 0x52, 0x4c, 0x26, 0xc6, 0x60, + 0x24, 0xe2, 0x4d, 0x71, 0x84, 0x82, 0x52, 0x9e, + 0x25, 0x01, 0xdd, 0x5c, 0x48, 0x26, 0x49, 0x08, + 0x01, 0x45, 0x73, 0x74, 0x8a, 0xa0, 0x9f, 0x02, + 0x5a, 0x08, 0x80, 0xfa, 0x58, 0xe2, 0x8e, 0x75, + 0x09, 0x08, 0x11, 0x4d, 0xbd, 0xf8, 0x6f, 0x26, + 0x76, 0x3e, 0x2f, 0x81, 0x03, 0xed, 0x46, 0x76, + 0xc3, 0x62, 0x82, 0xf4, 0x0c, 0x69, 0x9f, 0x10, + 0x4e, 0x93, 0x05, 0xf4, 0x82, 0x09, 0x41, 0xca, + 0xbd, 0x09, 0x41, 0x94, 0x32, 0xc0, 0xa7, 0xa8, + 0x28, 0x6b, 0xa3, 0x47, 0xfa, 0xcd, 0x07, 0xc0, + 0x2f, 0x79, 0x3b, 0xae, 0x9a, 0x5c, 0xb3, 0xcc, + 0x2f, 0x1a, 0xb6, 0x1c, 0x42, 0xc0, 0x7c, 0x6a, + 0x14, 0xcf, 0x82, 0x5e, 0xd2, 0xe6, 0x50, 0x98, + 0x21, 0x50, 0x3f, 0x97, 0xcc, 0x68, 0x54, 0x93, + 0x4a, 0x98, 0xa0, 0x9b, 0x40, 0xb1, 0xde, 0xb9, + 0x29, 0x5a, 0x0b, 0x4a, 0x80, 0x3b, 0xf6, 0x3d, + 0x19, 0x9e, 0x5d, 0xae, 0x42, 0xb8, 0x61, 0xd2, + 0x50, 0x15, 0x15, 0x01, 0xf8, 0x88, 0x9f, 0x70, + 0xf5, 0xd8, 0x8f, 0x7a, 0x2b, 0x49, 0xdf, 0xe5, + 0x67, 0x6c, 0xdd, 0xb3, 0x4c, 0xda, 0xe6, 0xd0, + 0xed, 0x98, 0x58, 0xdf, 0x91, 0x94, 0xeb, 0x05, + 0x4f, 0xa5, 0x1c, 0xd0, 0x3c, 0x06, 0x7f, 0xff, + 0xd9, +}; + +const struct fsdata_file file_tm4c_jpg[] = +{ + { + NULL, + data_tm4c_jpg, + data_tm4c_jpg + 10, + sizeof(data_tm4c_jpg) - 10 + } +}; + +const struct fsdata_file file_ti_jpg[] = +{ + { + file_tm4c_jpg, + data_ti_jpg, + data_ti_jpg + 8, + sizeof(data_ti_jpg) - 8 + } +}; + +const struct fsdata_file file_styles_css[] = +{ + { + file_ti_jpg, + data_styles_css, + data_styles_css + 12, + sizeof(data_styles_css) - 12 + } +}; + +const struct fsdata_file file_perror_htm[] = +{ + { + file_styles_css, + data_perror_htm, + data_perror_htm + 12, + sizeof(data_perror_htm) - 12 + } +}; + +const struct fsdata_file file_overview_htm[] = +{ + { + file_perror_htm, + data_overview_htm, + data_overview_htm + 14, + sizeof(data_overview_htm) - 14 + } +}; + +const struct fsdata_file file_javascript_load_js[] = +{ + { + file_overview_htm, + data_javascript_load_js, + data_javascript_load_js + 20, + sizeof(data_javascript_load_js) - 20 + } +}; + +const struct fsdata_file file_javascript_js[] = +{ + { + file_javascript_load_js, + data_javascript_js, + data_javascript_js + 15, + sizeof(data_javascript_js) - 15 + } +}; + +const struct fsdata_file file_io_http_htm[] = +{ + { + file_javascript_js, + data_io_http_htm, + data_io_http_htm + 13, + sizeof(data_io_http_htm) - 13 + } +}; + +const struct fsdata_file file_io_cgi_ssi[] = +{ + { + file_io_http_htm, + data_io_cgi_ssi, + data_io_cgi_ssi + 12, + sizeof(data_io_cgi_ssi) - 12 + } +}; + +const struct fsdata_file file_index_htm[] = +{ + { + file_io_cgi_ssi, + data_index_htm, + data_index_htm + 11, + sizeof(data_index_htm) - 11 + } +}; + +const struct fsdata_file file_favicon_ico[] = +{ + { + file_index_htm, + data_favicon_ico, + data_favicon_ico + 13, + sizeof(data_favicon_ico) - 13 + } +}; + +const struct fsdata_file file_dk_tm4c129x_jpg[] = +{ + { + file_favicon_ico, + data_dk_tm4c129x_jpg, + data_dk_tm4c129x_jpg + 17, + sizeof(data_dk_tm4c129x_jpg) - 17 + } +}; + +const struct fsdata_file file_block_jpg[] = +{ + { + file_dk_tm4c129x_jpg, + data_block_jpg, + data_block_jpg + 11, + sizeof(data_block_jpg) - 11 + } +}; + +const struct fsdata_file file_block_htm[] = +{ + { + file_block_jpg, + data_block_htm, + data_block_htm + 11, + sizeof(data_block_htm) - 11 + } +}; + +const struct fsdata_file file_about_htm[] = +{ + { + file_block_htm, + data_about_htm, + data_about_htm + 11, + sizeof(data_about_htm) - 11 + } +}; + +const struct fsdata_file file_404_htm[] = +{ + { + file_about_htm, + data_404_htm, + data_404_htm + 9, + sizeof(data_404_htm) - 9 + } +}; + +#define FS_ROOT file_404_htm + +#define FS_NUMFILES 16 + diff --git a/boards/dk-tm4c129x/enet_io/lwipopts.h b/boards/dk-tm4c129x/enet_io/lwipopts.h new file mode 100644 index 0000000..de6ac67 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/lwipopts.h @@ -0,0 +1,439 @@ +//***************************************************************************** +// +// lwipopts.h - Configuration file for lwIP +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +// +// NOTE: This file has been derived from the lwIP/src/include/lwip/opt.h +// header file. +// +// For additional details, refer to the original "opt.h" file, and lwIP +// documentation. +// +//***************************************************************************** + +#ifndef __LWIPOPTS_H__ +#define __LWIPOPTS_H__ + +//***************************************************************************** +// +// ---------- Stellaris / lwIP Port Options ---------- +// +//***************************************************************************** +#define HOST_TMR_INTERVAL 100 // default is 0 +#define DHCP_EXPIRE_TIMER_MSECS (10 * 1000) +#define LWIP_HTTPD_SSI 1 +#define LWIP_HTTPD_CGI 1 +#define LWIP_HTTPD_DYNAMIC_HEADERS 1 +//#define HTTPD_DEBUG LWIP_DBG_ON +#define EMAC_PHY_CONFIG (EMAC_PHY_TYPE_INTERNAL | EMAC_PHY_INT_MDIX_EN | \ + EMAC_PHY_AN_100B_T_FULL_DUPLEX) +#define PHY_PHYS_ADDR 0 +#define NUM_TX_DESCRIPTORS 24 +#define NUM_RX_DESCRIPTORS 8 + +//***************************************************************************** +// +// ---------- Platform specific locking ---------- +// +//***************************************************************************** +#define SYS_LIGHTWEIGHT_PROT 1 // default is 0 +#define NO_SYS 1 // default is 0 +//#define MEMCPY(dst,src,len) memcpy(dst,src,len) +//#define SMEMCPY(dst,src,len) memcpy(dst,src,len) + +//***************************************************************************** +// +// ---------- Memory options ---------- +// +//***************************************************************************** +//#define MEM_LIBC_MALLOC 0 +#define MEM_ALIGNMENT 4 // default is 1 +#define MEM_SIZE (64 * 1024) // default is 1600 +//#define MEMP_OVERFLOW_CHECK 0 +//#define MEMP_SANITY_CHECK 0 +//#define MEM_USE_POOLS 0 +//#define MEMP_USE_CUSTOM_POOLS 0 + +//***************************************************************************** +// +// ---------- Internal Memory Pool Sizes ---------- +// +//***************************************************************************** +#define MEMP_NUM_PBUF 48 // Default 16 +//#define MEMP_NUM_RAW_PCB 4 +//#define MEMP_NUM_UDP_PCB 4 +#define MEMP_NUM_TCP_PCB 16 // Default 5 +//#define MEMP_NUM_TCP_PCB_LISTEN 8 +#define MEMP_NUM_TCP_SEG 32 // Default 16 +//#define MEMP_NUM_REASSDATA 5 +//#define MEMP_NUM_ARP_QUEUE 30 +//#define MEMP_NUM_IGMP_GROUP 8 +#define MEMP_NUM_SYS_TIMEOUT 8 +//#define MEMP_NUM_NETBUF 2 +//#define MEMP_NUM_NETCONN 4 +//#define MEMP_NUM_TCPIP_MSG_API 8 +//#define MEMP_NUM_TCPIP_MSG_INPKT 8 +#define PBUF_POOL_SIZE 48 // Default 16 + +//***************************************************************************** +// +// ---------- ARP options ---------- +// +//***************************************************************************** +//#define LWIP_ARP 1 +//#define ARP_TABLE_SIZE 10 +//#define ARP_QUEUEING 1 +//#define ETHARP_TRUST_IP_MAC 1 + +//***************************************************************************** +// +// ---------- IP options ---------- +// +//***************************************************************************** +//#define IP_FORWARD 0 +//#define IP_OPTIONS_ALLOWED 1 +#define IP_REASSEMBLY 0 // default is 1 +#define IP_FRAG 0 // default is 1 +//#define IP_REASS_MAXAGE 3 +//#define IP_REASS_MAX_PBUFS 10 +//#define IP_FRAG_USES_STATIC_BUF 1 +//#define IP_FRAG_MAX_MTU 1500 +//#define IP_DEFAULT_TTL 255 + +//***************************************************************************** +// +// ---------- ICMP options ---------- +// +//***************************************************************************** +//#define LWIP_ICMP 1 +//#define ICMP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- RAW options ---------- +// +//***************************************************************************** +//#define LWIP_RAW 1 +//#define RAW_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- DHCP options ---------- +// +//***************************************************************************** +#define LWIP_DHCP 1 // default is 0 +//#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) + +//***************************************************************************** +// +// ---------- UPNP options ---------- +// +//***************************************************************************** +//#define LWIP_UPNP 0 + +//***************************************************************************** +// +// ---------- PTPD options ---------- +// +//***************************************************************************** +//#define LWIP_PTPD 0 + +//***************************************************************************** +// +// ---------- AUTOIP options ---------- +// +//***************************************************************************** +#define LWIP_AUTOIP 1 // default is 0 +#define LWIP_DHCP_AUTOIP_COOP ((LWIP_DHCP) && (LWIP_AUTOIP)) + // default is 0 +#define LWIP_DHCP_AUTOIP_COOP_TRIES 5 // default is 9 + +//***************************************************************************** +// +// ---------- SNMP options ---------- +// +//***************************************************************************** +//#define LWIP_SNMP 0 +//#define SNMP_CONCURRENT_REQUESTS 1 +//#define SNMP_TRAP_DESTINATIONS 1 +//#define SNMP_PRIVATE_MIB 0 +//#define SNMP_SAFE_REQUESTS 1 + +//***************************************************************************** +// +// ---------- IGMP options ---------- +// +//***************************************************************************** +//#define LWIP_IGMP 0 + +//***************************************************************************** +// +// ---------- DNS options ----------- +// +//***************************************************************************** +//#define LWIP_DNS 0 +//#define DNS_TABLE_SIZE 4 +//#define DNS_MAX_NAME_LENGTH 256 +//#define DNS_MAX_SERVERS 2 +//#define DNS_DOES_NAME_CHECK 1 +//#define DNS_USES_STATIC_BUF 1 +//#define DNS_MSG_SIZE 512 + +//***************************************************************************** +// +// ---------- UDP options ---------- +// +//***************************************************************************** +//#define LWIP_UDP 1 +//#define LWIP_UDPLITE 0 +//#define UDP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- TCP options ---------- +// +//***************************************************************************** +//#define LWIP_TCP 1 +//#define TCP_TTL (IP_DEFAULT_TTL) +#define TCP_WND 4096 // default is 2048 +//#define TCP_MAXRTX 12 +//#define TCP_SYNMAXRTX 6 +//#define TCP_QUEUE_OOSEQ 1 +#define TCP_MSS 1500 // default is 128 +//#define TCP_CALCULATE_EFF_SEND_MSS 1 +#define TCP_SND_BUF (6 * TCP_MSS) + // default is 256 +//#define TCP_SND_QUEUELEN (4 * (TCP_SND_BUF/TCP_MSS)) +//#define TCP_SNDLOWAT (TCP_SND_BUF/2) +//#define TCP_LISTEN_BACKLOG 0 +//#define TCP_DEFAULT_LISTEN_BACKLOG 0xff + +//***************************************************************************** +// +// ---------- API options ---------- +// +//***************************************************************************** +//#define LWIP_EVENT_API 0 +//#define LWIP_CALLBACK_API 1 + +//***************************************************************************** +// +// ---------- Pbuf options ---------- +// +//***************************************************************************** +#define PBUF_LINK_HLEN 16 // default is 14 +#define PBUF_POOL_BUFSIZE 512 + // default is LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) +#define ETH_PAD_SIZE 0 // default is 0 + +//***************************************************************************** +// +// ---------- Network Interfaces options ---------- +// +//***************************************************************************** +//#define LWIP_NETIF_HOSTNAME 0 +//#define LWIP_NETIF_API 0 +//#define LWIP_NETIF_STATUS_CALLBACK 0 +//#define LWIP_NETIF_LINK_CALLBACK 0 +//#define LWIP_NETIF_HWADDRHINT 0 + +//***************************************************************************** +// +// ---------- LOOPIF options ---------- +// +//***************************************************************************** +//#define LWIP_HAVE_LOOPIF 0 +//#define LWIP_LOOPIF_MULTITHREADING 1 + +//***************************************************************************** +// +// ---------- Thread options ---------- +// +//***************************************************************************** +//#define TCPIP_THREAD_NAME "tcpip_thread" +//#define TCPIP_THREAD_STACKSIZE 0 +//#define TCPIP_THREAD_PRIO 1 +//#define TCPIP_MBOX_SIZE 0 +//#define SLIPIF_THREAD_NAME "slipif_loop" +//#define SLIPIF_THREAD_STACKSIZE 0 +//#define SLIPIF_THREAD_PRIO 1 +//#define PPP_THREAD_NAME "pppMain" +//#define PPP_THREAD_STACKSIZE 0 +//#define PPP_THREAD_PRIO 1 +//#define DEFAULT_THREAD_NAME "lwIP" +//#define DEFAULT_THREAD_STACKSIZE 0 +//#define DEFAULT_THREAD_PRIO 1 +//#define DEFAULT_RAW_RECVMBOX_SIZE 0 +//#define DEFAULT_UDP_RECVMBOX_SIZE 0 +//#define DEFAULT_TCP_RECVMBOX_SIZE 0 +//#define DEFAULT_ACCEPTMBOX_SIZE 0 + +//***************************************************************************** +// +// ---------- Sequential layer options ---------- +// +//***************************************************************************** +//#define LWIP_TCPIP_CORE_LOCKING 0 +#define LWIP_NETCONN 0 // default is 1 + +//***************************************************************************** +// +// ---------- Socket Options ---------- +// +//***************************************************************************** +#define LWIP_SOCKET 0 // default is 1 +//#define LWIP_COMPAT_SOCKETS 1 +//#define LWIP_POSIX_SOCKETS_IO_NAMES 1 +//#define LWIP_TCP_KEEPALIVE 0 +//#define LWIP_SO_RCVTIMEO 0 +//#define LWIP_SO_RCVBUF 0 +//#define SO_REUSE 0 + +//***************************************************************************** +// +// ---------- Statistics options ---------- +// +//***************************************************************************** +//#define LWIP_STATS 1 +//#define LWIP_STATS_DISPLAY 0 +//#define LINK_STATS 1 +//#define ETHARP_STATS (LWIP_ARP) +//#define IP_STATS 1 +//#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) +//#define ICMP_STATS 1 +//#define IGMP_STATS (LWIP_IGMP) +//#define UDP_STATS (LWIP_UDP) +//#define TCP_STATS (LWIP_TCP) +//#define MEM_STATS 1 +//#define MEMP_STATS 1 +//#define SYS_STATS 1 + +//***************************************************************************** +// +// ---------- PPP options ---------- +// +//***************************************************************************** +//#define PPP_SUPPORT 0 +//#define PPPOE_SUPPORT 0 +//#define PPPOS_SUPPORT PPP_SUPPORT + +#if PPP_SUPPORT +//#define NUM_PPP 1 +//#define PAP_SUPPORT 0 +//#define CHAP_SUPPORT 0 +//#define MSCHAP_SUPPORT 0 +//#define CBCP_SUPPORT 0 +//#define CCP_SUPPORT 0 +//#define VJ_SUPPORT 0 +//#define MD5_SUPPORT 0 +//#define FSM_DEFTIMEOUT 6 +//#define FSM_DEFMAXTERMREQS 2 +//#define FSM_DEFMAXCONFREQS 10 +//#define FSM_DEFMAXNAKLOOPS 5 +//#define UPAP_DEFTIMEOUT 6 +//#define UPAP_DEFREQTIME 30 +//#define CHAP_DEFTIMEOUT 6 +//#define CHAP_DEFTRANSMITS 10 +//#define LCP_ECHOINTERVAL 0 +//#define LCP_MAXECHOFAILS 3 +//#define PPP_MAXIDLEFLAG 100 + +//#define PPP_MAXMTU 1500 +//#define PPP_DEFMRU 296 +#endif + +//***************************************************************************** +// +// ---------- checksum options ---------- +// +//***************************************************************************** +#define CHECKSUM_GEN_IP 0 +#define CHECKSUM_GEN_ICMP 0 +#define CHECKSUM_GEN_UDP 0 +#define CHECKSUM_GEN_TCP 0 +#define CHECKSUM_CHECK_IP 0 +#define CHECKSUM_CHECK_UDP 0 +#define CHECKSUM_CHECK_TCP 0 + +//***************************************************************************** +// +// ---------- Debugging options ---------- +// +//***************************************************************************** +#if 0 +#define U8_F "c" +#define S8_F "c" +#define X8_F "x" +#define U16_F "u" +#define S16_F "d" +#define X16_F "x" +#define U32_F "u" +#define S32_F "d" +#define X32_F "x" +extern void UARTprintf(const char *pcString, ...); +#define LWIP_DEBUG +#endif + +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SERIOUS +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE + +//#define LWIP_DBG_TYPES_ON LWIP_DBG_ON +#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH) + +//#define ETHARP_DEBUG LWIP_DBG_ON // default is OFF +//#define NETIF_DEBUG LWIP_DBG_ON // default is OFF +//#define PBUF_DEBUG LWIP_DBG_OFF +//#define API_LIB_DEBUG LWIP_DBG_OFF +//#define API_MSG_DEBUG LWIP_DBG_OFF +//#define SOCKETS_DEBUG LWIP_DBG_OFF +//#define ICMP_DEBUG LWIP_DBG_OFF +//#define IGMP_DEBUG LWIP_DBG_OFF +//#define INET_DEBUG LWIP_DBG_OFF +//#define IP_DEBUG LWIP_DBG_ON // default is OFF +//#define IP_REASS_DEBUG LWIP_DBG_OFF +//#define RAW_DEBUG LWIP_DBG_OFF +//#define MEM_DEBUG LWIP_DBG_OFF +//#define MEMP_DEBUG LWIP_DBG_OFF +//#define SYS_DEBUG LWIP_DBG_OFF +//#define TCP_DEBUG LWIP_DBG_OFF +//#define TCP_INPUT_DEBUG LWIP_DBG_OFF +//#define TCP_FR_DEBUG LWIP_DBG_OFF +//#define TCP_RTO_DEBUG LWIP_DBG_OFF +//#define TCP_CWND_DEBUG LWIP_DBG_OFF +//#define TCP_WND_DEBUG LWIP_DBG_OFF +//#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +//#define TCP_RST_DEBUG LWIP_DBG_OFF +//#define TCP_QLEN_DEBUG LWIP_DBG_OFF +//#define UDP_DEBUG LWIP_DBG_ON // default is OFF +//#define TCPIP_DEBUG LWIP_DBG_OFF +//#define PPP_DEBUG LWIP_DBG_OFF +//#define SLIP_DEBUG LWIP_DBG_OFF +//#define DHCP_DEBUG LWIP_DBG_ON // default is OFF +//#define AUTOIP_DEBUG LWIP_DBG_OFF +//#define SNMP_MSG_DEBUG LWIP_DBG_OFF +//#define SNMP_MIB_DEBUG LWIP_DBG_OFF +//#define DNS_DEBUG LWIP_DBG_OFF + +#endif /* __LWIPOPTS_H__ */ diff --git a/boards/dk-tm4c129x/enet_io/readme.txt b/boards/dk-tm4c129x/enet_io/readme.txt new file mode 100644 index 0000000..900af8e --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/readme.txt @@ -0,0 +1,78 @@ +Ethernet-based I/O Control + +This example application demonstrates web-based I/O control using the +Tiva Ethernet controller and the lwIP TCP/IP Stack. DHCP is used to +obtain an Ethernet address. If DHCP times out without obtaining an +address, a static IP address will be chosen using AutoIP. The address that +is selected will be shown on the QVGA display allowing you to access the +internal web pages served by the application via your normal web browser. + +Two different methods of controlling board peripherals via web pages are +illustrated via pages labeled ``IO Control Demo 1'' and ``IO Control +Demo 2'' in the navigation menu on the left of the application's home page. +In both cases, the example allows you to toggle the state of the user LED +on the board and set the speed of a graphical animation on the display. + +``IO Control Demo 1'' uses JavaScript running in the web browser to send +HTTP requests for particular special URLs. These special URLs are +intercepted in the file system support layer (io_fs.c) and used to +control the LED and animation. Responses generated by the board are +returned to the browser and inserted into the page HTML dynamically by +more JavaScript code. + +``IO Control Demo 2'' uses standard HTML forms to pass parameters to CGI +(Common Gateway Interface) handlers running on the board. These handlers +process the form data and control the animation and LED as requested before +sending a response page (in this case, the original form) back to the +browser. The application registers the names and handlers for each of its +CGIs with the HTTPD server during initialization and the server calls +these handlers after parsing URL parameters each time one of the CGI URLs +is requested. + +Information on the state of the various controls in the second demo is +inserted into the served HTML using SSI (Server Side Include) tags which +are parsed by the HTTPD server in the application. As with the CGI +handlers, the application registers its list of SSI tags and a handler +function with the web server during initialization and this handler is +called whenever any registered tag is found in a .shtml, .ssi, .shtm or +.xml file being served to the browser. + +In addition to LED and animation speed control, the second example also +allows a line of text to be sent to the board for display on the LCD +panel. This is included to illustrate the decoding of HTTP text strings. + +Note that the web server used by this example has been modified from the +example shipped with the basic lwIP package. Additions include SSI and +CGI support along with the ability to have the server automatically insert +the HTTP headers rather than having these built in to the files in the +file system image. + +Source files for the internal file system image can be found in the ``fs'' +directory. If any of these files are changed, the file system image +(io_fsdata.h) should be rebuilt by running the following command from the +enet_io directory: + +../../../../tools/bin/makefsfile -i fs -o io_fsdata.h -r -h -q + +For additional details on lwIP, refer to the lwIP web page at: +http://savannah.nongnu.org/projects/lwip/ + +------------------------------------------------------------------------------- + +Copyright (c) 2007-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/enet_io/rvmdk/enet_io.axf b/boards/dk-tm4c129x/enet_io/rvmdk/enet_io.axf new file mode 100644 index 0000000..cf322ae Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/rvmdk/enet_io.axf differ diff --git a/boards/dk-tm4c129x/enet_io/rvmdk/enet_io.bin b/boards/dk-tm4c129x/enet_io/rvmdk/enet_io.bin new file mode 100644 index 0000000..8e93d7c Binary files /dev/null and b/boards/dk-tm4c129x/enet_io/rvmdk/enet_io.bin differ diff --git a/boards/dk-tm4c129x/enet_io/startup_ccs.c b/boards/dk-tm4c129x/enet_io/startup_ccs.c new file mode 100644 index 0000000..f1c8626 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void lwIPEthernetIntHandler(void); +extern void SysTickIntHandler(void); +extern void AnimTimerIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + AnimTimerIntHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/enet_io/startup_ewarm.c b/boards/dk-tm4c129x/enet_io/startup_ewarm.c new file mode 100644 index 0000000..d017f8d --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void lwIPEthernetIntHandler(void); +extern void SysTickIntHandler(void); +extern void AnimTimerIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + AnimTimerIntHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/enet_io/startup_gcc.c b/boards/dk-tm4c129x/enet_io/startup_gcc.c new file mode 100644 index 0000000..a011ff8 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void lwIPEthernetIntHandler(void); +extern void SysTickIntHandler(void); +extern void AnimTimerIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + AnimTimerIntHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/enet_io/startup_rvmdk.S b/boards/dk-tm4c129x/enet_io/startup_rvmdk.S new file mode 100644 index 0000000..0aee183 --- /dev/null +++ b/boards/dk-tm4c129x/enet_io/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN lwIPEthernetIntHandler + EXTERN SysTickIntHandler + EXTERN AnimTimerIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD AnimTimerIntHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD lwIPEthernetIntHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/enet_lwip/Makefile b/boards/dk-tm4c129x/enet_lwip/Makefile new file mode 100644 index 0000000..2b633ba --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/Makefile @@ -0,0 +1,106 @@ +#****************************************************************************** +# +# Makefile - Rules for building the web server using lwIP. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/lwip-1.4.1/apps/httpserver_raw +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/lwip-1.4.1/apps +IPATH+=../../../../third_party/lwip-1.4.1/ports/tiva-tm4c129/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include/ipv4 +IPATH+=../../../../third_party + +# +# The default rule, which causes the web server using lwIP to be built. +# +all: ${COMPILER} +all: ${COMPILER}/enet_lwip.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the web server using lwIP. +# +${COMPILER}/enet_lwip.axf: ${COMPILER}/enet_fs.o +${COMPILER}/enet_lwip.axf: ${COMPILER}/enet_lwip.o +${COMPILER}/enet_lwip.axf: ${COMPILER}/ff.o +${COMPILER}/enet_lwip.axf: ${COMPILER}/frame.o +${COMPILER}/enet_lwip.axf: ${COMPILER}/httpd.o +${COMPILER}/enet_lwip.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/enet_lwip.axf: ${COMPILER}/locator.o +${COMPILER}/enet_lwip.axf: ${COMPILER}/lwiplib.o +${COMPILER}/enet_lwip.axf: ${COMPILER}/mmc-dk-tm4c129x.o +${COMPILER}/enet_lwip.axf: ${COMPILER}/pinout.o +${COMPILER}/enet_lwip.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/enet_lwip.axf: ${COMPILER}/ustdlib.o +${COMPILER}/enet_lwip.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/enet_lwip.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/enet_lwip.axf: enet_lwip.ld +SCATTERgcc_enet_lwip=enet_lwip.ld +ENTRY_enet_lwip=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/enet_lwip/ccs/.ccsimportspec b/boards/dk-tm4c129x/enet_lwip/ccs/.ccsimportspec new file mode 100644 index 0000000..5537fcc --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/ccs/.ccsimportspec @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_lwip/ccs/.ccsproject b/boards/dk-tm4c129x/enet_lwip/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_lwip/ccs/.cproject b/boards/dk-tm4c129x/enet_lwip/ccs/.cproject new file mode 100644 index 0000000..d5b34c0 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/ccs/.cproject @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_lwip/ccs/.project b/boards/dk-tm4c129x/enet_lwip/ccs/.project new file mode 100644 index 0000000..f1e4978 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/ccs/.project @@ -0,0 +1,100 @@ + + + enet_lwip + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + enet_fs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_lwip/enet_fs.c + + + enet_lwip.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_lwip/enet_lwip.c + + + enet_lwip_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_lwip/enet_lwip_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_lwip/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/locator.c + 1 + SW_ROOT/utils/locator.c + + + utils/lwiplib.c + 1 + SW_ROOT/utils/lwiplib.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/fatfs/port/mmc-dk-tm4c129x.c + 1 + SW_ROOT/third_party/fatfs/port/mmc-dk-tm4c129x.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + third_party/lwip-1.4.1/apps/httpserver_raw/httpd.c + 1 + SW_ROOT/third_party/lwip-1.4.1/apps/httpserver_raw/httpd.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/enet_lwip/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/enet_lwip/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/enet_lwip/ccs/Debug/enet_lwip.bin b/boards/dk-tm4c129x/enet_lwip/ccs/Debug/enet_lwip.bin new file mode 100644 index 0000000..df15448 Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/ccs/Debug/enet_lwip.bin differ diff --git a/boards/dk-tm4c129x/enet_lwip/ccs/Debug/enet_lwip.out b/boards/dk-tm4c129x/enet_lwip/ccs/Debug/enet_lwip.out new file mode 100644 index 0000000..7e7356e Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/ccs/Debug/enet_lwip.out differ diff --git a/boards/dk-tm4c129x/enet_lwip/ccs/macros.ini_initial b/boards/dk-tm4c129x/enet_lwip/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/enet_lwip/ccs/target_config.ccxml b/boards/dk-tm4c129x/enet_lwip/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_lwip/enet_fs.c b/boards/dk-tm4c129x/enet_lwip/enet_fs.c new file mode 100644 index 0000000..4a38ee5 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_fs.c @@ -0,0 +1,338 @@ +//***************************************************************************** +// +// enet_fs.c - File System Processing for lwIP Web Server Apps. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/rom.h" +#include "driverlib/ssi.h" +#include "utils/lwiplib.h" +#include "utils/ustdlib.h" +#include "httpserver_raw/httpd.h" +#include "httpserver_raw/fs.h" +#include "httpserver_raw/fsdata.h" +#include "fatfs/src/ff.h" +#include "fatfs/src/diskio.h" + +//***************************************************************************** +// +// Include the file system data for this application. This file is generated +// by the makefsfile utility, using the following command: +// +// ../../../../tools/bin/makefsfile -i fs -o enet_fsdata.h -r -h -q +// +// If any changes are made to the static content of the web pages served by the +// application, this command must be used to regenerate enet_fsdata.h in order +// for those changes to be picked up by the web server. +// +//***************************************************************************** +#include "enet_fsdata.h" + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; + +//***************************************************************************** +// +// The number of milliseconds that has passed since the last disk_timerproc() +// call. +// +//***************************************************************************** +static uint32_t ui32TickCounter = 0; + +//***************************************************************************** +// +// Initialize the file system. +// +//***************************************************************************** +void +fs_init(void) +{ + // + // Initialize and mount the Fat File System. + // + f_mount(0, &g_sFatFs); +} + +//***************************************************************************** +// +// File System tick handler. +// +//***************************************************************************** +void +fs_tick(uint32_t ui32TickMS) +{ + // + // Increment the tick counter. + // + ui32TickCounter += ui32TickMS; + + // + // Check to see if the FAT FS tick needs to run. + // + if(ui32TickCounter >= 10) + { + ui32TickCounter = 0; + disk_timerproc(); + } +} + +//***************************************************************************** +// +// Open a file and return a handle to the file, if found. Otherwise, +// return NULL. +// +//***************************************************************************** +struct fs_file * +fs_open(const char *pcName) +{ + const struct fsdata_file *psTree; + struct fs_file *psFile = NULL; + FIL *psFatFile = NULL; + FRESULT fresult = FR_OK; + + // + // Allocate memory for the file system structure. + // + psFile = mem_malloc(sizeof(struct fs_file)); + if(psFile == NULL) + { + return(NULL); + } + + // + // See if a file on the SD card is being requested. + // + if(ustrncmp(pcName, "/sd/", 4) == 0) + { + // + // Allocate memory for the Fat File system handle. + // + psFatFile = mem_malloc(sizeof(FIL)); + if(psFatFile == NULL) + { + mem_free(psFile); + return(NULL); + } + + // + // Attempt to open the file on the Fat File System. + // + fresult = f_open(psFatFile, pcName + 3, FA_READ); + if(fresult == FR_OK) + { + psFile->data = NULL; + psFile->len = 0; + psFile->index = 0; + psFile->pextension = psFatFile; + return(psFile); + } + + // + // If we get here, we failed to find the file on the Fat File System, + // so free up the Fat File system handle/object. + // + mem_free(psFatFile); + mem_free(psFile); + return(NULL); + } + + // + // Initialize the file system tree pointer to the root of the linked list. + // + psTree = FS_ROOT; + + // + // Begin processing the linked list, looking for the requested file name. + // + while(NULL != psTree) + { + // + // Compare the requested file "name" to the file name in the + // current node. + // + if(ustrncmp(pcName, (char *)psTree->name, psTree->len) == 0) + { + // + // Fill in the data pointer and length values from the + // linked list node. + // + psFile->data = (char *)psTree->data; + psFile->len = psTree->len; + + // + // For now, we setup the read index to the end of the file, + // indicating that all data has been read. + // + psFile->index = psTree->len; + + // + // We are not using any file system extensions in this + // application, so set the pointer to NULL. + // + psFile->pextension = NULL; + + // + // Exit the loop and return the file system pointer. + // + break; + } + + // + // If we get here, we did not find the file at this node of the linked + // list. Get the next element in the list. + // + psTree = psTree->next; + } + + // + // If we didn't find the file, ptTee will be NULL. Make sure we + // return a NULL pointer if this happens. + // + if(psTree == NULL) + { + mem_free(psFile); + psFile = NULL; + } + + // + // Return the file system pointer. + // + return(psFile); +} + +//***************************************************************************** +// +// Close an opened file designated by the handle. +// +//***************************************************************************** +void +fs_close(struct fs_file *psFile) +{ + // + // If a Fat file was opened, free its object. + // + if(psFile->pextension) + { + mem_free(psFile->pextension); + } + + // + // Free the main file system object. + // + mem_free(psFile); +} + +//***************************************************************************** +// +// Read the next chunck of data from the file. Return the count of data +// that was read. Return 0 if no data is currently available. Return +// a -1 if at the end of file. +// +//***************************************************************************** +int +fs_read(struct fs_file *psFile, char *pcBuffer, int iCount) +{ + int iAvailable; + UINT uiBytesRead; + FRESULT fresult; + + // + // Check to see if a Fat File was opened and process it. + // + if(psFile->pextension) + { + // + // Read the data. + // + fresult = f_read(psFile->pextension, pcBuffer, iCount, &uiBytesRead); + if((fresult != FR_OK) || (uiBytesRead == 0)) + { + return(-1); + } + return((int)uiBytesRead); + } + + // + // Check to see if more data is available. + // + if(psFile->index == psFile->len) + { + // + // There is no remaining data. Return a -1 for EOF indication. + // + return(-1); + } + + // + // Determine how much data we can copy. The minimum of the 'iCount' + // parameter or the available data in the file system buffer. + // + iAvailable = psFile->len - psFile->index; + if(iAvailable > iCount) + { + iAvailable = iCount; + } + + // + // Copy the data. + // + memcpy(pcBuffer, psFile->data + iAvailable, iAvailable); + psFile->index += iAvailable; + + // + // Return the count of data that we copied. + // + return(iAvailable); +} + +//***************************************************************************** +// +// Determine the number of bytes left to read from the file. +// +//***************************************************************************** +int +fs_bytes_left(struct fs_file *psFile) +{ + // + // Check to see if a Fat File was opened and process it. + // + if(psFile->pextension) + { + // + // Return the number of bytes left to be read from the Fat File. + // + return(f_size((FIL *)psFile->pextension) - + f_tell((FIL *)psFile->pextension)); + } + + // + // Return the number of bytes left to be read from this file. + // + return(psFile->len - psFile->index); +} diff --git a/boards/dk-tm4c129x/enet_lwip/enet_fs.h b/boards/dk-tm4c129x/enet_lwip/enet_fs.h new file mode 100644 index 0000000..fd04321 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_fs.h @@ -0,0 +1,36 @@ +//***************************************************************************** +// +// enet_fs.h - Prototypes for the file system module. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __ENET_FS_H__ +#define __ENET_FS_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void fs_init(void); +extern void fs_tick(uint32_t ui32TickMS); + +#endif // __ENET_FS_H__ diff --git a/boards/dk-tm4c129x/enet_lwip/enet_fsdata.h b/boards/dk-tm4c129x/enet_lwip/enet_fsdata.h new file mode 100644 index 0000000..1faf92d --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_fsdata.h @@ -0,0 +1,16229 @@ +//*************************************************************************** +// +// File System Image. +// +// This file was automatically generated using the makefsfile utility. +// +//*************************************************************************** + +static const uint8_t data_404_htm[] = +{ + /* /404.htm */ + 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, + 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x0a, 0x3c, 0x68, + 0x31, 0x3e, 0x34, 0x30, 0x34, 0x20, 0x2d, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x2f, + 0x68, 0x31, 0x3e, 0x0a, 0x3c, 0x68, 0x33, 0x3e, + 0x54, 0x72, 0x79, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, + 0x68, 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x61, 0x3e, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, + 0x2e, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x0a, 0x3c, + 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, + 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0x0a, +}; + +static const uint8_t data_about_htm[] = +{ + /* /about.htm */ + 0x2f, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x2e, 0x68, + 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x0a, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3e, 0x44, 0x4b, 0x2d, 0x54, + 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, + 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x4b, 0x69, 0x74, 0x3c, + 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, + 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, + 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, + 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x73, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, + 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x20, 0x69, + 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x22, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x66, + 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, + 0x63, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x3c, 0x2f, + 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x70, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x41, 0x62, 0x6f, + 0x75, 0x74, 0x20, 0x54, 0x65, 0x78, 0x61, 0x73, + 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x3c, 0x2f, 0x70, 0x3e, + 0x0a, 0x3c, 0x68, 0x72, 0x3e, 0x0a, 0x3c, 0x62, + 0x72, 0x3e, 0x0a, 0x54, 0x65, 0x78, 0x61, 0x73, + 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x20, 0x28, 0x54, 0x49, + 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x0a, 0x3c, 0x61, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, + 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2e, 0x74, + 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2f, 0x64, 0x6f, + 0x63, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x73, + 0x70, 0x3f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x3d, 0x32, 0x39, 0x35, 0x36, + 0x36, 0x22, 0x3e, 0x61, 0x6e, 0x61, 0x6c, 0x6f, + 0x67, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x61, 0x6e, + 0x64, 0x20, 0x64, 0x69, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x0a, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x72, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x2f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x73, 0x65, 0x6d, 0x69, 0x63, + 0x6f, 0x6e, 0x64, 0x75, 0x63, 0x74, 0x6f, 0x72, + 0x20, 0x49, 0x43, 0x20, 0x64, 0x65, 0x73, 0x69, + 0x67, 0x6e, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x61, + 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x66, + 0x61, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, + 0x2e, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x6f, 0x67, 0x20, + 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, + 0x67, 0x69, 0x65, 0x73, 0x2c, 0x0a, 0x3c, 0x61, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, + 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2e, 0x74, + 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x73, + 0x70, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x2f, 0x64, + 0x73, 0x70, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x74, + 0x73, 0x70, 0x3f, 0x73, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x3d, 0x34, 0x36, 0x22, + 0x3e, 0x64, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x28, 0x44, 0x53, 0x50, 0x29, + 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x61, 0x6e, 0x64, + 0x0a, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6d, 0x63, 0x75, 0x2f, 0x64, 0x6f, 0x63, + 0x73, 0x2f, 0x6d, 0x63, 0x75, 0x68, 0x6f, 0x6d, + 0x65, 0x2e, 0x74, 0x73, 0x70, 0x3f, 0x73, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x3d, + 0x31, 0x30, 0x31, 0x22, 0x3e, 0x6d, 0x69, 0x63, + 0x72, 0x6f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x72, 0x20, 0x28, 0x4d, 0x43, + 0x55, 0x29, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x73, + 0x65, 0x6d, 0x69, 0x63, 0x6f, 0x6e, 0x64, 0x75, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x54, + 0x49, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, + 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x20, 0x73, 0x65, 0x6d, 0x69, 0x63, + 0x6f, 0x6e, 0x64, 0x75, 0x63, 0x74, 0x6f, 0x72, + 0x20, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x6e, 0x61, 0x6c, 0x6f, 0x67, 0x0a, 0x61, 0x6e, + 0x64, 0x20, 0x64, 0x69, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x20, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, + 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x49, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, + 0x63, 0x72, 0x6f, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x20, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x2c, 0x0a, 0x54, 0x49, 0x20, + 0x6f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x72, 0x6f, 0x61, 0x64, + 0x65, 0x73, 0x74, 0x20, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6d, 0x62, + 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2c, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x75, 0x6c, 0x74, + 0x72, 0x61, 0x2d, 0x6c, 0x6f, 0x77, 0x2d, 0x70, + 0x6f, 0x77, 0x65, 0x72, 0x0a, 0x3c, 0x61, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, + 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2e, 0x74, 0x69, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x63, 0x75, + 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x2f, 0x6d, 0x63, + 0x75, 0x70, 0x72, 0x6f, 0x64, 0x6f, 0x76, 0x65, + 0x72, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x74, 0x73, + 0x70, 0x3f, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x3d, 0x39, 0x35, 0x26, 0x74, + 0x61, 0x62, 0x49, 0x64, 0x3d, 0x31, 0x34, 0x30, + 0x26, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x49, + 0x64, 0x3d, 0x33, 0x34, 0x32, 0x22, 0x3e, 0x4d, + 0x53, 0x50, 0x34, 0x33, 0x30, 0x26, 0x74, 0x72, + 0x61, 0x64, 0x65, 0x3b, 0x3c, 0x2f, 0x61, 0x3e, + 0x0a, 0x4d, 0x43, 0x55, 0x73, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x68, 0x69, 0x67, 0x68, 0x2d, 0x70, + 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, + 0x63, 0x65, 0x0a, 0x3c, 0x61, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x2e, 0x74, 0x69, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6d, 0x63, 0x75, 0x2f, 0x64, + 0x6f, 0x63, 0x73, 0x2f, 0x6d, 0x63, 0x75, 0x70, + 0x72, 0x6f, 0x64, 0x6f, 0x76, 0x65, 0x72, 0x76, + 0x69, 0x65, 0x77, 0x2e, 0x74, 0x73, 0x70, 0x3f, + 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x3d, 0x39, 0x35, 0x26, 0x74, 0x61, 0x62, + 0x49, 0x64, 0x3d, 0x31, 0x35, 0x33, 0x31, 0x26, + 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x49, 0x64, + 0x3d, 0x39, 0x31, 0x36, 0x22, 0x3e, 0x54, 0x4d, + 0x53, 0x33, 0x32, 0x30, 0x43, 0x32, 0x30, 0x30, + 0x30, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, + 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x72, 0x65, 0x61, + 0x6c, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, + 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x33, 0x32, 0x20, 0x62, 0x69, + 0x74, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x6c, 0x2d, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, + 0x65, 0x20, 0x41, 0x52, 0x4d, 0x26, 0x72, 0x65, + 0x67, 0x3b, 0x2d, 0x62, 0x61, 0x73, 0x65, 0x64, + 0x20, 0x4d, 0x43, 0x55, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x0a, 0x3c, 0x61, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, + 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6c, 0x73, 0x64, 0x73, 0x2f, + 0x74, 0x69, 0x2f, 0x6d, 0x69, 0x63, 0x72, 0x6f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x2f, 0x74, 0x69, 0x76, 0x61, 0x5f, + 0x61, 0x72, 0x6d, 0x5f, 0x63, 0x6f, 0x72, 0x74, + 0x65, 0x78, 0x2f, 0x63, 0x5f, 0x73, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x2f, 0x74, 0x6d, 0x34, 0x63, + 0x5f, 0x61, 0x72, 0x6d, 0x5f, 0x63, 0x6f, 0x72, + 0x74, 0x65, 0x78, 0x2d, 0x6d, 0x34, 0x2f, 0x6f, + 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x2e, + 0x70, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x54, 0x69, + 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, + 0x3b, 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x2e, 0x20, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, + 0x62, 0x6f, 0x75, 0x74, 0x20, 0x75, 0x73, 0x20, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, + 0x65, 0x62, 0x20, 0x61, 0x74, 0x0a, 0x3c, 0x61, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, + 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x22, 0x3e, 0x77, 0x77, + 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x3c, 0x2f, 0x61, 0x3e, 0x2e, 0x0a, 0x3c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, +}; + +static const uint8_t data_block_htm[] = +{ + /* /block.htm */ + 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x68, + 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x0a, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3e, 0x44, 0x4b, 0x2d, 0x54, + 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, + 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x4b, 0x69, 0x74, 0x3c, + 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, + 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, + 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, + 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x73, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, + 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x20, 0x69, + 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x22, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x66, + 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, + 0x63, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x3c, 0x2f, + 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x70, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x54, 0x4d, 0x34, + 0x43, 0x31, 0x32, 0x39, 0x58, 0x4e, 0x43, 0x5a, + 0x41, 0x44, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x44, 0x69, 0x61, 0x67, 0x72, 0x61, 0x6d, + 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x3c, 0x68, 0x72, + 0x3e, 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x3c, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x0a, + 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, + 0x3d, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x6a, 0x70, 0x67, 0x22, 0x2f, 0x3e, 0x0a, 0x3c, + 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, + 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0x0a, +}; + +static const uint8_t data_block_jpg[] = +{ + /* /block.jpg */ + 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6a, + 0x70, 0x67, 0x00, + 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, + 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, + 0x00, 0x48, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43, + 0x00, 0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x03, + 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x05, + 0x08, 0x05, 0x05, 0x04, 0x04, 0x05, 0x0a, 0x07, + 0x07, 0x06, 0x08, 0x0c, 0x0a, 0x0c, 0x0c, 0x0b, + 0x0a, 0x0b, 0x0b, 0x0d, 0x0e, 0x12, 0x10, 0x0d, + 0x0e, 0x11, 0x0e, 0x0b, 0x0b, 0x10, 0x16, 0x10, + 0x11, 0x13, 0x14, 0x15, 0x15, 0x15, 0x0c, 0x0f, + 0x17, 0x18, 0x16, 0x14, 0x18, 0x12, 0x14, 0x15, + 0x14, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x03, 0x04, + 0x04, 0x05, 0x04, 0x05, 0x09, 0x05, 0x05, 0x09, + 0x14, 0x0d, 0x0b, 0x0d, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xff, 0xc2, + 0x00, 0x11, 0x08, 0x02, 0x35, 0x02, 0x68, 0x03, + 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, + 0x01, 0xff, 0xc4, 0x00, 0x1c, 0x00, 0x01, 0x00, + 0x02, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x05, 0x02, 0x03, 0x06, 0x07, 0x01, 0x08, 0xff, + 0xc4, 0x00, 0x1a, 0x01, 0x01, 0x00, 0x03, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, + 0x05, 0x04, 0x06, 0xff, 0xda, 0x00, 0x0c, 0x03, + 0x01, 0x00, 0x02, 0x10, 0x03, 0x10, 0x00, 0x00, + 0x01, 0xf7, 0xe2, 0x50, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x52, 0x51, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x31, 0x22, 0x1f, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x03, 0xe8, 0x00, 0x03, + 0xe1, 0xf4, 0x00, 0x01, 0x10, 0xdc, 0x59, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, + 0x46, 0x31, 0x3c, 0x61, 0xe8, 0xb0, 0x00, 0x0d, + 0x06, 0xf0, 0x00, 0x00, 0x15, 0x73, 0x12, 0x25, + 0x40, 0x69, 0x27, 0x95, 0xa7, 0x50, 0x42, 0x35, + 0x90, 0xcd, 0x26, 0xe2, 0x21, 0xd3, 0x94, 0x44, + 0xc2, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x6a, 0x37, 0xc4, 0xf8, 0x89, 0xc8, + 0x22, 0x59, 0x3c, 0x8e, 0x4c, 0x28, 0x8b, 0x92, + 0x5a, 0x6b, 0xd1, 0xe9, 0x29, 0xf4, 0x98, 0x00, + 0x2a, 0xe6, 0x24, 0x4b, 0xc5, 0x4b, 0xc3, 0x71, + 0xd5, 0x17, 0xc4, 0x22, 0xa8, 0xe7, 0xce, 0x7c, + 0xea, 0x4d, 0x27, 0x6c, 0x55, 0x12, 0xcb, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xac, 0x91, 0x13, 0x00, 0xa1, 0x2c, 0x4e, 0x58, + 0xe9, 0x8f, 0xa4, 0x62, 0x29, 0xd1, 0x42, 0x8e, + 0x57, 0x50, 0xbb, 0x00, 0x15, 0x73, 0x12, 0x25, + 0xcf, 0x1f, 0x0e, 0x84, 0xe6, 0x0e, 0xa0, 0x84, + 0x46, 0x2a, 0x89, 0x45, 0xc9, 0x40, 0x74, 0xc5, + 0x09, 0x30, 0xb0, 0x01, 0x14, 0xfe, 0x9c, 0x2b, + 0xf5, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x4b, 0x9f, 0x3e, 0xd3, 0xb1, 0xd7, 0xe1, + 0x4a, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xf0, 0x8a, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0f, 0xa0, 0x00, 0x0f, 0x87, 0xd0, 0x01, + 0xb0, 0xbb, 0x35, 0x9b, 0x8b, 0x10, 0x70, 0x9d, + 0x4e, 0x77, 0x8e, 0x77, 0xb9, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xd8, 0x9f, + 0xd0, 0x3f, 0x2f, 0xdf, 0xc3, 0xcb, 0xe8, 0xa8, + 0xe6, 0xd3, 0x0c, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xf6, 0x59, 0x74, 0xaf, 0x0b, + 0x59, 0xb1, 0xf2, 0xd7, 0x0f, 0x35, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x66, 0xf6, + 0xd3, 0xec, 0xb7, 0x46, 0x7c, 0x2c, 0x41, 0xe3, + 0x9f, 0x43, 0xc5, 0xe1, 0x3a, 0x3e, 0x10, 0x00, + 0x03, 0x74, 0x4f, 0x73, 0xcf, 0xf6, 0x8b, 0x0c, + 0xaf, 0x03, 0x5a, 0x47, 0xb5, 0x76, 0xd6, 0x78, + 0x3e, 0x8f, 0x8b, 0xe0, 0x00, 0x00, 0x7b, 0x0f, + 0x0b, 0xaf, 0x71, 0xc7, 0xe8, 0x79, 0x67, 0x13, + 0x30, 0x00, 0x03, 0xa3, 0xda, 0x45, 0x2e, 0x51, + 0x9c, 0xb5, 0xc3, 0x29, 0x04, 0x23, 0xc3, 0x10, + 0x00, 0x07, 0x63, 0xd0, 0xb4, 0xef, 0x6d, 0xf9, + 0xae, 0x2e, 0x55, 0xb9, 0xc0, 0xea, 0x7d, 0x16, + 0xe7, 0xf1, 0x88, 0xd5, 0x80, 0x00, 0xbb, 0xd6, + 0x6b, 0xa8, 0xb9, 0xd2, 0x60, 0x56, 0x2a, 0xf3, + 0x81, 0x69, 0xa4, 0xc5, 0xaa, 0x2d, 0x60, 0x01, + 0x94, 0xbd, 0x03, 0xbd, 0xb5, 0xb9, 0xb8, 0x9e, + 0x0f, 0x1e, 0xfa, 0x1e, 0x2f, 0x09, 0xd1, 0xf0, + 0x80, 0x00, 0x1d, 0x77, 0x8b, 0xd5, 0xd2, 0xf9, + 0x7d, 0x1a, 0xad, 0x17, 0x3e, 0x7d, 0xab, 0x36, + 0xca, 0x35, 0xab, 0xb6, 0x2d, 0xe6, 0x5d, 0x6e, + 0x6e, 0x00, 0x00, 0x01, 0xec, 0x1c, 0x2e, 0xbd, + 0xb7, 0x1f, 0xa1, 0xe3, 0x5c, 0x7c, 0xc0, 0x00, + 0x0e, 0xdf, 0xd3, 0x6e, 0xbf, 0xd1, 0x3a, 0x2a, + 0xac, 0xa4, 0x6f, 0xb4, 0xfc, 0x35, 0x56, 0x36, + 0xcc, 0xf9, 0x7f, 0x8a, 0x98, 0x80, 0x00, 0x3b, + 0xcf, 0x75, 0xee, 0x7d, 0x96, 0xf3, 0xbe, 0x4e, + 0x75, 0x59, 0xc0, 0xf4, 0xff, 0x00, 0x6d, 0xbe, + 0x93, 0xad, 0x32, 0x2c, 0x81, 0x44, 0x5a, 0xc7, + 0x0f, 0xe7, 0x8e, 0xfb, 0xd5, 0x6a, 0x0c, 0xa3, + 0x9b, 0xc6, 0x3d, 0x37, 0xd9, 0x6a, 0xea, 0x45, + 0x75, 0x1d, 0x46, 0xf3, 0x89, 0x53, 0x9c, 0x4e, + 0xb4, 0xf9, 0x37, 0x86, 0x80, 0x7b, 0x27, 0x6f, + 0x5b, 0x43, 0x79, 0x3c, 0x1e, 0x3f, 0xf4, 0x3c, + 0x5e, 0x13, 0xa3, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xeb, 0xfc, 0x2e, 0xbd, + 0xdf, 0x1f, 0xa1, 0xc5, 0xf0, 0x72, 0xc6, 0x00, + 0x00, 0x24, 0x59, 0x26, 0xd3, 0x99, 0x1e, 0x23, + 0x34, 0xed, 0x94, 0x4a, 0xc5, 0xae, 0xd3, 0x43, + 0xe7, 0x80, 0x00, 0x03, 0xa2, 0xea, 0x5f, 0xe7, + 0xb6, 0xf4, 0xfc, 0x4c, 0xab, 0xb2, 0x81, 0x3e, + 0xf3, 0xf6, 0x53, 0xae, 0xd5, 0x57, 0xd9, 0x47, + 0xaa, 0x35, 0x57, 0x7b, 0x4d, 0x2e, 0x31, 0x6d, + 0xab, 0x4c, 0x30, 0x86, 0xd9, 0x65, 0x2f, 0x90, + 0x8b, 0x57, 0x59, 0xec, 0xb7, 0x01, 0xcf, 0xa0, + 0xce, 0x5d, 0x87, 0xd0, 0x6d, 0x6a, 0x6f, 0x27, + 0x83, 0xc8, 0x3e, 0x87, 0x8b, 0xc2, 0x74, 0x7c, + 0x20, 0x0e, 0x8b, 0xcd, 0xbc, 0xdc, 0xef, 0x5b, + 0xae, 0x7a, 0xe6, 0x2c, 0xf2, 0xd6, 0xbb, 0x5c, + 0xe3, 0xda, 0xb7, 0x9e, 0x7d, 0xac, 0xb2, 0xd3, + 0x8f, 0xf7, 0x79, 0x7a, 0x5f, 0x27, 0xa0, 0x7c, + 0x98, 0xe2, 0xbd, 0xde, 0x40, 0x00, 0xf5, 0xfe, + 0x17, 0x5e, 0x6f, 0x2b, 0xa3, 0x0f, 0x18, 0xa5, + 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0xe5, 0xd8, 0xfa, 0x6d, 0x56, 0x4a, 0xc2, + 0x29, 0x7c, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0b, 0xfd, 0xe6, 0x07, 0xa2, 0xdd, + 0x29, 0xbc, 0x9c, 0x0f, 0x21, 0xfa, 0x1e, 0x2f, + 0x09, 0xd1, 0xf0, 0x80, 0x3b, 0xbe, 0x7f, 0xb6, + 0xaf, 0x6c, 0xbb, 0x0f, 0x0f, 0xaf, 0x38, 0x9a, + 0x2f, 0x46, 0x1d, 0x9f, 0x87, 0xd9, 0x4b, 0xbe, + 0x3e, 0x73, 0xd4, 0xe7, 0xe9, 0xb4, 0x58, 0x65, + 0xa7, 0x6f, 0xe0, 0xf6, 0x5c, 0xe1, 0xaf, 0xc3, + 0xc7, 0xfb, 0x7c, 0xa8, 0xd6, 0xa8, 0x03, 0xd7, + 0xf8, 0x5d, 0x79, 0xbc, 0xae, 0x8f, 0x18, 0x72, + 0x00, 0x00, 0x0b, 0xd2, 0x51, 0x60, 0x69, 0x35, + 0x9a, 0x8f, 0x86, 0x25, 0x29, 0x10, 0x00, 0x01, + 0xec, 0xa5, 0x79, 0x48, 0x70, 0xa0, 0x17, 0x84, + 0xa2, 0x01, 0x28, 0x86, 0x4c, 0x23, 0x98, 0x9b, + 0xcc, 0x4c, 0x4b, 0x02, 0x31, 0x18, 0x8c, 0x40, + 0x00, 0xf4, 0x52, 0xc0, 0xe9, 0x0d, 0xe4, 0xe0, + 0x79, 0x0f, 0xd0, 0xf1, 0x78, 0x5e, 0x8f, 0x84, + 0x01, 0x99, 0x22, 0x96, 0xfa, 0x6a, 0xb4, 0x65, + 0x13, 0x94, 0x30, 0x96, 0x33, 0x1a, 0x66, 0x06, + 0xf8, 0x9d, 0xb5, 0x9d, 0x56, 0x8d, 0x13, 0x00, + 0x01, 0xeb, 0xdc, 0x2e, 0xbc, 0xee, 0x57, 0x47, + 0x8c, 0x39, 0x00, 0x00, 0x05, 0xf1, 0xa0, 0xb4, + 0x21, 0x90, 0x8b, 0x03, 0x79, 0x14, 0xaf, 0x20, + 0x00, 0x00, 0x3d, 0x94, 0xaf, 0x29, 0x0e, 0x14, + 0x02, 0xf0, 0xd4, 0x5d, 0x9a, 0x8d, 0x64, 0xa2, + 0x09, 0x18, 0xc8, 0xba, 0x29, 0xcb, 0x83, 0x12, + 0x21, 0x4a, 0x57, 0x00, 0x7a, 0x29, 0x60, 0x74, + 0x86, 0xe2, 0x70, 0x3c, 0x8b, 0xe8, 0x78, 0xbc, + 0x2f, 0x47, 0xc2, 0x00, 0xb6, 0xc7, 0x59, 0x35, + 0x98, 0x3a, 0x56, 0x55, 0x2d, 0xaa, 0x62, 0x2d, + 0xe9, 0x6b, 0x8e, 0xb2, 0x2b, 0x6c, 0x26, 0x31, + 0x3e, 0x4c, 0x42, 0xbd, 0x66, 0xd2, 0xd5, 0x9a, + 0xe7, 0x5f, 0xa5, 0x00, 0x1e, 0xbd, 0xc2, 0xeb, + 0xcd, 0xe5, 0x74, 0x77, 0x15, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x15, 0x84, + 0x79, 0x8e, 0x5e, 0xd0, 0x36, 0x56, 0x7e, 0xc4, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xac, + 0x1d, 0x19, 0xb8, 0x9c, 0x0f, 0x23, 0xfa, 0x1e, + 0x2f, 0x0b, 0xd1, 0xf0, 0x80, 0x3a, 0xaf, 0x27, + 0xa7, 0xa0, 0xf3, 0x6f, 0xce, 0xfa, 0x70, 0xb2, + 0xcb, 0x48, 0xd7, 0xaf, 0x25, 0xec, 0xf2, 0xf5, + 0xde, 0x2f, 0x56, 0xf8, 0x98, 0xb6, 0xae, 0x9b, + 0x47, 0x4b, 0xe5, 0xf4, 0x55, 0xeb, 0x9e, 0xc8, + 0x9e, 0x53, 0xd9, 0xe5, 0xac, 0xd7, 0x30, 0x07, + 0xae, 0xf0, 0xba, 0xf3, 0xb9, 0x5d, 0x1e, 0x34, + 0xe4, 0x00, 0x00, 0xef, 0x0f, 0x85, 0x09, 0x7c, + 0x6f, 0x39, 0x63, 0xa1, 0x06, 0x26, 0x65, 0x09, + 0x44, 0x00, 0x07, 0xb2, 0x95, 0xe7, 0x9a, 0xf5, + 0x79, 0xdc, 0xef, 0xb3, 0xcd, 0x41, 0xb6, 0x7d, + 0xb7, 0x27, 0xa1, 0xd5, 0x73, 0xbd, 0xd9, 0x18, + 0x91, 0x48, 0x85, 0xe1, 0x89, 0x52, 0x4b, 0x06, + 0xb3, 0x79, 0x72, 0x50, 0x18, 0x82, 0xc0, 0xaf, + 0x3a, 0x42, 0xc8, 0xe8, 0x8d, 0xc4, 0xe0, 0x79, + 0x27, 0xd0, 0xf1, 0x78, 0x5e, 0x8f, 0x84, 0x01, + 0x26, 0xb6, 0x9d, 0x9d, 0xe0, 0xe9, 0x4c, 0x66, + 0x33, 0x89, 0xc5, 0x12, 0xe9, 0x7d, 0x73, 0x1a, + 0xad, 0x1a, 0x66, 0x36, 0x43, 0x09, 0x4a, 0xa5, + 0xb5, 0xda, 0x22, 0x5a, 0xa0, 0x0f, 0x5d, 0xe1, + 0x75, 0xe7, 0x72, 0xba, 0x3c, 0x69, 0xc8, 0x00, + 0x0f, 0xa7, 0x42, 0x62, 0x40, 0x25, 0x99, 0x90, + 0x0b, 0x02, 0x21, 0x91, 0xbc, 0xad, 0x21, 0x80, + 0x01, 0xec, 0xa5, 0x79, 0xc4, 0xfb, 0x7c, 0xbe, + 0x6b, 0xed, 0xf2, 0x8e, 0xb7, 0x9f, 0xec, 0xe9, + 0xbc, 0xbe, 0x8c, 0x8d, 0xe5, 0x49, 0x60, 0x43, + 0x2d, 0x0a, 0xe3, 0x61, 0x34, 0xa6, 0x22, 0x9d, + 0x11, 0xa8, 0x82, 0x64, 0x59, 0x1a, 0x0b, 0xc2, + 0x69, 0xd1, 0x1b, 0x89, 0xa0, 0xf2, 0x5f, 0xa1, + 0xe2, 0xf0, 0xbd, 0x1f, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x5d, 0xe1, 0x75, + 0xe7, 0x72, 0xba, 0x35, 0xc7, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x72, 0x56, + 0x1b, 0xca, 0xe3, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x64, 0xf3, 0x41, 0xd0, 0x9b, + 0x89, 0xa0, 0xf2, 0x6f, 0xa1, 0xe2, 0xf0, 0xbd, + 0x1f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x5c, 0xe1, 0x75, 0xe7, 0x72, 0xba, + 0x3c, 0x71, 0xc8, 0x00, 0x0b, 0xb3, 0x22, 0xf8, + 0xde, 0x51, 0x13, 0x89, 0x64, 0x52, 0xe4, 0xe7, + 0x4b, 0x62, 0xa8, 0xe4, 0xc0, 0x00, 0xf6, 0x52, + 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe8, 0x0d, 0xc4, 0xd0, 0x79, 0x3f, + 0xd0, 0xf1, 0x78, 0x5e, 0x8f, 0x84, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xae, 0x70, + 0xba, 0xf3, 0xb9, 0x5d, 0x1e, 0x38, 0xe4, 0x00, + 0x04, 0xb3, 0x71, 0x2c, 0xcc, 0x8c, 0x6d, 0x37, + 0x14, 0x25, 0xc1, 0x99, 0xa0, 0xc8, 0xa6, 0x00, + 0x03, 0xd9, 0x4a, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xa0, 0x37, 0x13, + 0x01, 0xe7, 0xdd, 0xbe, 0x4f, 0x23, 0xee, 0xf2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf4, 0x8e, 0x3f, 0x4d, 0xce, 0xf7, 0x57, 0x9c, + 0xf0, 0x00, 0x00, 0x0b, 0x33, 0xe1, 0x89, 0xf0, + 0x80, 0x00, 0x00, 0x00, 0x77, 0x25, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x7e, 0x6e, 0x26, 0x03, 0xf3, 0xe1, 0xe6, 0xc0, + 0x03, 0xac, 0x35, 0x90, 0x48, 0xa5, 0x78, 0x00, + 0xf4, 0x33, 0xcf, 0x01, 0x72, 0x0b, 0x93, 0x9d, + 0x05, 0x78, 0x3d, 0xf0, 0xea, 0x8e, 0x38, 0xe4, + 0x00, 0x00, 0x00, 0x75, 0x04, 0xd3, 0x51, 0x6e, + 0x79, 0xc0, 0x00, 0x00, 0x01, 0xec, 0xa5, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x7e, 0x6d, 0x26, 0x03, 0xf3, 0x91, 0xe6, + 0x20, 0x03, 0xd1, 0x4d, 0x66, 0x05, 0x79, 0xc8, + 0x80, 0x0f, 0x48, 0x3c, 0xdc, 0x1e, 0x82, 0x4f, + 0x3e, 0x94, 0x04, 0x73, 0x95, 0x07, 0xe8, 0x43, + 0xb2, 0x29, 0x0e, 0x64, 0x00, 0x00, 0x06, 0xf2, + 0x59, 0x89, 0xf0, 0x80, 0x00, 0x00, 0x00, 0x7a, + 0x41, 0x5a, 0x6c, 0x24, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x14, 0xc0, 0xbe, 0x36, + 0x93, 0x01, 0xe7, 0x27, 0x2a, 0x00, 0x36, 0x83, + 0x33, 0x61, 0xa0, 0x00, 0x75, 0x07, 0x2e, 0x01, + 0xb0, 0xd6, 0x49, 0x21, 0x1f, 0x01, 0xe8, 0xc6, + 0xd3, 0x96, 0x39, 0x30, 0x00, 0x24, 0x92, 0xcd, + 0x46, 0xa3, 0x41, 0x64, 0x6b, 0x2b, 0x8d, 0xc0, + 0xd2, 0x00, 0x00, 0xf5, 0xa2, 0x19, 0x9f, 0x23, + 0x3a, 0xbf, 0x2d, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0xdf, 0xdd, 0x68, 0xfd, 0x3d, + 0x2f, 0x0d, 0xa4, 0xc0, 0x78, 0xc1, 0xe7, 0xa5, + 0xd1, 0x00, 0x94, 0x4d, 0x39, 0xd3, 0xb7, 0x3c, + 0xa0, 0x1d, 0x89, 0xac, 0xfa, 0x43, 0x39, 0xd0, + 0x7a, 0xd9, 0x44, 0x44, 0x25, 0x11, 0x8b, 0x02, + 0xac, 0xf4, 0xd3, 0xa8, 0x38, 0xf3, 0x90, 0x00, + 0x02, 0xe8, 0xb5, 0x2e, 0x0a, 0xe2, 0x9c, 0x92, + 0x68, 0x30, 0x2e, 0x4a, 0x82, 0x80, 0x00, 0x01, + 0xec, 0x66, 0x07, 0x9d, 0xf1, 0xb2, 0x81, 0x40, + 0xe9, 0xb6, 0x99, 0x97, 0x9d, 0x55, 0x8c, 0x49, + 0x76, 0x42, 0xa2, 0xce, 0xea, 0x2c, 0xdd, 0x1e, + 0xd2, 0x21, 0x52, 0x22, 0xc2, 0xca, 0xf3, 0xbe, + 0x54, 0x79, 0x40, 0xa2, 0xce, 0x22, 0x54, 0x2e, + 0x34, 0x9e, 0xd7, 0xb1, 0xa5, 0xc1, 0xb4, 0x96, + 0x0f, 0xcf, 0x47, 0x96, 0x1e, 0xf2, 0x71, 0xc4, + 0x43, 0x49, 0xc5, 0x9d, 0xe9, 0xe7, 0xe0, 0xf6, + 0x23, 0x8a, 0x27, 0x96, 0xa7, 0x97, 0x03, 0xd6, + 0x8e, 0x60, 0xef, 0x4a, 0x33, 0x9a, 0x2e, 0xcf, + 0x35, 0x3d, 0xd4, 0xf4, 0x02, 0xa8, 0xe5, 0x00, + 0x00, 0x92, 0x4b, 0x35, 0x11, 0xc9, 0x66, 0xc3, + 0xe9, 0x18, 0xf8, 0x6d, 0x2b, 0x40, 0x00, 0x9c, + 0x76, 0x47, 0xd3, 0x80, 0xe2, 0xe5, 0x06, 0x81, + 0x6b, 0xa4, 0xf5, 0x3e, 0x89, 0xd8, 0x6e, 0xb2, + 0x25, 0x1b, 0xa5, 0x26, 0xce, 0x67, 0x08, 0xb9, + 0xd6, 0x50, 0x9d, 0x75, 0x65, 0x16, 0x7a, 0x3e, + 0x91, 0xea, 0x8d, 0x57, 0x39, 0x8c, 0x52, 0xe5, + 0x02, 0xdf, 0x59, 0xec, 0x3b, 0x1a, 0x5b, 0x9b, + 0x49, 0x60, 0xe0, 0x4e, 0x00, 0xb9, 0x23, 0x1a, + 0x4b, 0x73, 0x9e, 0x3a, 0x82, 0x98, 0xf8, 0x00, + 0x00, 0xfa, 0x74, 0x45, 0x39, 0xa4, 0x96, 0x6b, + 0x21, 0x10, 0x8f, 0x59, 0x32, 0x36, 0x43, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x25, 0x5f, 0x21, 0xb7, 0x8f, 0x9d, 0x67, 0x92, + 0xa0, 0x09, 0xfa, 0xcc, 0x0c, 0xa0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x16, 0xde, 0xeb, 0x45, 0xea, + 0xe9, 0x74, 0x6c, 0x25, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xab, 0x38, + 0xe5, 0xf8, 0x79, 0x69, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3a, 0x0e, 0x9d, 0xe3, + 0xf4, 0x2f, 0x5e, 0x73, 0x24, 0x82, 0x39, 0x24, + 0xf8, 0x6a, 0x06, 0xf3, 0x32, 0x10, 0x32, 0x27, + 0x11, 0x0d, 0x86, 0x26, 0x06, 0xe0, 0x6d, 0x20, + 0x1d, 0xb0, 0x2e, 0xcd, 0xa4, 0xa0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, + 0xf8, 0x47, 0x94, 0x72, 0xf3, 0xef, 0xbd, 0x56, + 0xcc, 0xa9, 0xce, 0x2c, 0xef, 0x3b, 0x65, 0xaa, + 0x23, 0x59, 0x43, 0x94, 0x77, 0xfe, 0xab, 0xd7, + 0xd6, 0x2a, 0xf3, 0x8d, 0xb2, 0xd7, 0x0d, 0xb3, + 0x3a, 0xa2, 0x36, 0x4a, 0x54, 0xcc, 0x48, 0x8d, + 0x50, 0xb8, 0xd2, 0x7c, 0xdf, 0xc7, 0x5e, 0xa3, + 0xd3, 0x37, 0xfd, 0x2d, 0x29, 0x0e, 0x60, 0xe8, + 0x0a, 0x52, 0xc0, 0xc0, 0xdc, 0x5a, 0x9c, 0x71, + 0x68, 0x4f, 0x37, 0x9a, 0x01, 0xbc, 0x96, 0x64, + 0x54, 0x90, 0x48, 0x27, 0x4e, 0x70, 0x67, 0xa7, + 0x9b, 0x8b, 0xa3, 0x69, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x78, + 0x47, 0x9a, 0xf2, 0x33, 0xbe, 0xda, 0x6c, 0x2e, + 0x9b, 0x79, 0x91, 0x2d, 0x70, 0xd3, 0x0a, 0xcc, + 0xe3, 0x4c, 0x3a, 0x9f, 0x44, 0xc1, 0xa3, 0x7d, + 0x90, 0x69, 0x17, 0x3a, 0xce, 0x52, 0xaf, 0xcd, + 0x06, 0x91, 0xbe, 0xd3, 0x22, 0x55, 0x19, 0xc5, + 0xbe, 0x93, 0xc2, 0x79, 0x2b, 0xd1, 0xfa, 0xad, + 0x6b, 0xd3, 0xbe, 0x07, 0x3a, 0x4e, 0x2b, 0x4b, + 0x63, 0x22, 0x39, 0x28, 0xa9, 0x24, 0x99, 0x92, + 0x88, 0xa4, 0x73, 0x71, 0xbc, 0x11, 0xc9, 0x26, + 0x65, 0x71, 0x14, 0xec, 0xc8, 0xe5, 0xd1, 0xb0, + 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0xca, 0x44, 0x1e, 0x36, 0x78, + 0x51, 0xbe, 0xcc, 0x21, 0xae, 0x00, 0x00, 0x00, + 0x02, 0xcb, 0x65, 0x6e, 0x20, 0x00, 0x02, 0x77, + 0x4a, 0xf5, 0xbe, 0xdb, 0x52, 0x1c, 0x28, 0x00, + 0x00, 0x01, 0xd0, 0x1f, 0x08, 0x65, 0x60, 0x00, + 0x00, 0x01, 0xe9, 0xe6, 0xe2, 0xe4, 0xd8, 0x4a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x09, 0x44, 0x71, 0x00, 0x00, 0x66, + 0x4f, 0x26, 0x91, 0xc8, 0x46, 0xb2, 0xd4, 0xfa, + 0x6b, 0x30, 0x2a, 0x80, 0x00, 0x1e, 0x9c, 0x60, + 0x52, 0x1c, 0x28, 0x00, 0x00, 0x01, 0xdf, 0x15, + 0x84, 0x22, 0x84, 0x00, 0x00, 0x00, 0xf4, 0xf3, + 0x71, 0x70, 0x6d, 0x24, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x84, 0xe7, + 0x4e, 0x10, 0x00, 0x0c, 0xce, 0xa8, 0xda, 0x59, + 0x90, 0xca, 0x62, 0xc0, 0x90, 0x4f, 0x39, 0x22, + 0x94, 0x00, 0x01, 0xea, 0xe6, 0x24, 0x92, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x90, 0x82, 0x5c, 0x1b, 0x09, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, + 0x34, 0x9c, 0xe8, 0x00, 0x00, 0x00, 0x04, 0x92, + 0x30, 0x24, 0x91, 0x80, 0x00, 0xda, 0x74, 0x64, + 0x72, 0x90, 0xe1, 0x40, 0x00, 0x00, 0x4a, 0x33, + 0x24, 0x96, 0x07, 0x32, 0x00, 0x00, 0x00, 0x7a, + 0x79, 0xb8, 0xb7, 0x36, 0x12, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x51, + 0x0c, 0xb9, 0xf4, 0xc3, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0xfd, 0xf7, 0x81, + 0xbc, 0xd2, 0x1c, 0x28, 0x00, 0x00, 0x0b, 0x32, + 0xec, 0xa8, 0x3a, 0x93, 0xcf, 0xc0, 0x00, 0x00, + 0x0f, 0x4f, 0x37, 0x16, 0xe6, 0x64, 0x90, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xa4, 0x79, 0xaf, 0x13, 0x30, 0x00, 0x00, + 0x75, 0x3b, 0xcd, 0x65, 0x22, 0x44, 0xab, 0x68, + 0xf9, 0x0c, 0x0c, 0x21, 0xa8, 0x00, 0x00, 0x3a, + 0x7f, 0x5d, 0xa7, 0xf4, 0xef, 0x24, 0xa0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xa4, + 0x20, 0x96, 0xc6, 0xc2, 0x48, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x69, + 0x1e, 0x3d, 0xc7, 0xcc, 0x00, 0x00, 0x1d, 0x9f, + 0xa2, 0x7a, 0xad, 0xed, 0xb2, 0x54, 0x79, 0x45, + 0xde, 0xb3, 0x49, 0x94, 0x50, 0x65, 0x1c, 0xce, + 0x30, 0x00, 0x00, 0x76, 0x1e, 0xab, 0x74, 0x1d, + 0x1b, 0xd2, 0x1c, 0x28, 0x00, 0x16, 0x87, 0xd3, + 0xe1, 0x24, 0x86, 0x6c, 0x26, 0x91, 0x0c, 0x4c, + 0x48, 0x46, 0x90, 0x00, 0x3d, 0x3c, 0xdc, 0x5b, + 0x1b, 0x49, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x83, 0x48, 0xe3, 0x38, + 0x39, 0x63, 0x00, 0x00, 0x02, 0xe7, 0x69, 0x81, + 0x48, 0x9f, 0x79, 0xd1, 0x56, 0xfb, 0x27, 0xeb, + 0x34, 0xf8, 0x45, 0x7e, 0x70, 0x00, 0x00, 0x74, + 0x1e, 0xfb, 0xfc, 0xe9, 0xde, 0x90, 0xe1, 0x40, + 0x00, 0xb3, 0x3a, 0x33, 0xe9, 0xf0, 0x80, 0x6f, + 0x29, 0xcb, 0x52, 0xc8, 0xd2, 0x71, 0x46, 0x20, + 0x00, 0x7a, 0x81, 0xb4, 0xb7, 0x36, 0x92, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x46, 0x69, 0xc2, 0x29, 0xb2, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x5d, 0x07, + 0xa6, 0x62, 0xda, 0x75, 0x9c, 0xc0, 0x00, 0x02, + 0x49, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd9, + 0x1a, 0x0b, 0x73, 0x69, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x47, + 0x22, 0x72, 0x00, 0x03, 0xa1, 0x2c, 0x0a, 0x72, + 0xc4, 0xae, 0x2d, 0x08, 0x25, 0x79, 0x66, 0x4c, + 0x04, 0x73, 0x99, 0x00, 0x03, 0xd3, 0x8d, 0xe7, + 0x3a, 0x71, 0x80, 0x1d, 0x11, 0xa0, 0xd6, 0x5d, + 0x9a, 0x0c, 0x0c, 0xcc, 0x88, 0x20, 0xdc, 0x64, + 0x69, 0x34, 0x91, 0x8a, 0xd0, 0x0f, 0x47, 0x27, + 0x17, 0x06, 0xd2, 0x50, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x4e, 0x54, + 0xe2, 0xc0, 0x05, 0x89, 0x68, 0x66, 0x7d, 0x21, + 0x93, 0x88, 0xe4, 0x53, 0xe9, 0xbc, 0xfa, 0x66, + 0x73, 0x40, 0x00, 0x7a, 0xa8, 0x28, 0x8e, 0x1c, + 0x02, 0xfc, 0x8a, 0x45, 0x3a, 0x23, 0x03, 0xe1, + 0x0c, 0xb0, 0x34, 0x96, 0x07, 0x30, 0x4e, 0x33, + 0x37, 0x14, 0xc4, 0x10, 0x0f, 0x4d, 0x24, 0x17, + 0x06, 0xe2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x0c, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x71, + 0xbc, 0xd4, 0x6f, 0x2a, 0xcc, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x36, 0x96, 0x26, 0x82, + 0xe4, 0xdc, 0x4a, 0x3e, 0x10, 0x08, 0xe7, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x33, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0xa3, 0x69, 0x2c, 0xab, + 0x34, 0x79, 0xab, 0x8f, 0x92, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x67, 0xa2, 0x6b, + 0xfd, 0x96, 0xdb, 0x09, 0x1c, 0xda, 0x61, 0x94, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, + 0xcb, 0xa5, 0x78, 0x5a, 0xcd, 0x8f, 0x8a, 0x9a, + 0xbc, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1b, 0x7d, 0x13, 0x03, 0xdd, 0x7b, 0x83, + 0x71, 0x2c, 0xe7, 0xce, 0x7f, 0x8f, 0x9d, 0x0e, + 0x11, 0x6d, 0xa2, 0x65, 0xe6, 0x9b, 0x28, 0xcc, + 0x95, 0x64, 0x3a, 0xbe, 0x16, 0x37, 0x5a, 0xe9, + 0x34, 0x99, 0x44, 0x4a, 0xa6, 0xd9, 0x0e, 0xab, + 0x7d, 0x66, 0x97, 0x18, 0xfb, 0x2d, 0x84, 0xeb, + 0xab, 0xa8, 0x8d, 0x56, 0xeb, 0x3b, 0xbe, 0xee, + 0xb8, 0xe7, 0x1e, 0x75, 0xc5, 0xcb, 0x33, 0xb1, + 0xf4, 0xdb, 0x97, 0xc2, 0x31, 0x86, 0x72, 0xc2, + 0x1f, 0x4f, 0x84, 0x9b, 0x2e, 0xf5, 0x9e, 0x6b, + 0x08, 0xc8, 0x9b, 0x76, 0xd9, 0x57, 0x51, 0x84, + 0x32, 0x3e, 0x16, 0xfa, 0xa8, 0xb1, 0x8d, 0x67, + 0x63, 0xd0, 0xbc, 0xff, 0x00, 0x6d, 0xf9, 0x4e, + 0x2e, 0x55, 0xb9, 0x80, 0x00, 0x0b, 0xbd, 0x66, + 0x15, 0x63, 0x44, 0x32, 0x2d, 0x34, 0x9a, 0xbc, + 0xe3, 0x22, 0x25, 0x40, 0x00, 0x07, 0xd9, 0x7a, + 0x37, 0x7b, 0x59, 0x46, 0xe2, 0x59, 0xcf, 0x1c, + 0x3f, 0x2b, 0x3e, 0x6f, 0x18, 0xed, 0x3d, 0x33, + 0x43, 0x93, 0xd3, 0x3d, 0x96, 0x8b, 0x58, 0xae, + 0xab, 0x7c, 0xb7, 0x4b, 0x9a, 0xc6, 0x2f, 0xf5, + 0x9d, 0x84, 0x9b, 0x2b, 0x28, 0xb1, 0xbc, 0xe1, + 0x10, 0x3e, 0x98, 0x9a, 0x21, 0xaa, 0x1e, 0x6d, + 0xe3, 0xae, 0xd9, 0x7a, 0xe7, 0x6b, 0x5d, 0x34, + 0x8f, 0x26, 0xe3, 0xe7, 0x6b, 0x75, 0xbe, 0xb3, + 0x61, 0x69, 0xea, 0x76, 0x9d, 0x30, 0xa1, 0xce, + 0x3a, 0x4d, 0x66, 0xb2, 0x91, 0xcb, 0xe3, 0x16, + 0x76, 0x9e, 0x8f, 0x69, 0xe7, 0x32, 0x8e, 0x9f, + 0x69, 0x8b, 0x11, 0x55, 0x9a, 0xf3, 0x59, 0xa7, + 0xce, 0x25, 0x59, 0x26, 0x67, 0x8a, 0xf3, 0xd7, + 0x98, 0xc2, 0x3b, 0xcf, 0x75, 0xae, 0xbd, 0x97, + 0xf3, 0xce, 0x4e, 0x75, 0x79, 0xc0, 0x00, 0x01, + 0xdf, 0xfa, 0xad, 0xd0, 0xed, 0x34, 0xb9, 0xc4, + 0xdb, 0x26, 0xda, 0x7e, 0x94, 0x19, 0x47, 0x9e, + 0xf9, 0x2a, 0x00, 0x00, 0x0f, 0x62, 0xed, 0xeb, + 0x24, 0xde, 0x4b, 0x39, 0xd2, 0xb7, 0x8d, 0x95, + 0x27, 0x9e, 0x24, 0x4a, 0x55, 0xe7, 0x61, 0xa2, + 0x23, 0x64, 0xcc, 0x6a, 0xc4, 0xcb, 0x4c, 0x3a, + 0xc0, 0xc8, 0xdf, 0x69, 0xfa, 0x4d, 0xd1, 0x5b, + 0x94, 0x6d, 0x99, 0xd5, 0x0d, 0x92, 0xc8, 0x15, + 0x59, 0xc4, 0x8b, 0xba, 0x7e, 0xf6, 0xd9, 0x56, + 0x39, 0x6e, 0x06, 0x58, 0x42, 0xe7, 0x59, 0x8b, + 0x58, 0xfa, 0x9f, 0xb2, 0xd5, 0x11, 0xbe, 0x67, + 0x64, 0xa0, 0x52, 0x34, 0xd5, 0x65, 0xa4, 0xc5, + 0xac, 0x5e, 0xfa, 0x2d, 0x59, 0x8c, 0x46, 0xac, + 0x49, 0xb4, 0xe8, 0x88, 0x97, 0x69, 0xf8, 0x42, + 0xa4, 0x45, 0xab, 0xa4, 0xea, 0x5f, 0x1f, 0x6d, + 0xeb, 0xb8, 0x99, 0x56, 0xe3, 0x00, 0x00, 0x04, + 0xab, 0x24, 0xda, 0x74, 0x42, 0x65, 0x91, 0xe1, + 0x26, 0xcb, 0x4d, 0xa7, 0x92, 0xf1, 0xd4, 0x00, + 0x00, 0xdb, 0x67, 0x51, 0xf4, 0x1b, 0x4d, 0x37, + 0x13, 0x0e, 0x74, 0xd3, 0x94, 0x53, 0xf9, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, + 0xf6, 0x98, 0x5b, 0xcf, 0xd3, 0xee, 0x31, 0x47, + 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x97, 0x61, 0xe8, 0xb5, 0x5c, 0xb7, 0x65, + 0x14, 0x38, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x74, 0x7b, 0x4c, 0x4d, 0x66, 0xf4, + 0xdc, 0x4c, 0x39, 0xc3, 0x98, 0x38, 0x50, 0x00, + 0x3e, 0x9d, 0x29, 0x46, 0x58, 0x96, 0x25, 0x29, + 0x62, 0x64, 0x6e, 0x31, 0x39, 0x60, 0x00, 0x07, + 0xa2, 0x96, 0x00, 0xe6, 0x4e, 0x40, 0x00, 0x01, + 0x34, 0xe8, 0x8a, 0x02, 0xd4, 0xda, 0x66, 0x59, + 0x9c, 0x41, 0x18, 0x00, 0x00, 0x3d, 0x94, 0xaf, + 0x2b, 0xce, 0x24, 0x82, 0x6e, 0x32, 0x23, 0x96, + 0x26, 0xa3, 0x41, 0x2c, 0x8e, 0x0c, 0x09, 0x26, + 0x93, 0x71, 0xb8, 0xd2, 0x7d, 0x34, 0x92, 0xcd, + 0x27, 0x78, 0x4a, 0x2f, 0x4d, 0xe4, 0xc3, 0x9b, + 0x39, 0x83, 0x85, 0x00, 0x03, 0x23, 0xb4, 0x29, + 0x09, 0xe5, 0x89, 0xcb, 0x96, 0x86, 0x64, 0xf3, + 0x23, 0x84, 0x00, 0x00, 0x7a, 0x29, 0x60, 0x0e, + 0x64, 0xe4, 0x00, 0x00, 0x13, 0x0b, 0x32, 0xac, + 0xbb, 0x23, 0x1b, 0x41, 0xce, 0x80, 0x00, 0x00, + 0xf6, 0x52, 0xbc, 0xdc, 0x71, 0xe6, 0xc3, 0x71, + 0x4c, 0x57, 0x1d, 0x69, 0xa4, 0xa8, 0x2e, 0x8a, + 0xb2, 0xf8, 0x84, 0x45, 0x3e, 0x96, 0x67, 0xc2, + 0x88, 0x94, 0x4d, 0x34, 0x9b, 0x0b, 0xc3, 0x71, + 0x7c, 0x6f, 0x26, 0x1c, 0xd1, 0x00, 0xe5, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, + 0x4c, 0x41, 0xb8, 0xa3, 0x00, 0x00, 0x6c, 0x35, + 0x92, 0x80, 0x34, 0x12, 0x81, 0x1c, 0xd4, 0x00, + 0x00, 0xea, 0x8a, 0xb3, 0x13, 0x96, 0x06, 0x66, + 0x27, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xae, 0x30, 0x2f, 0xcd, 0xc4, 0xd3, 0x9a, 0x39, + 0x73, 0x9d, 0x2c, 0x4d, 0x44, 0x82, 0x51, 0x0c, + 0xf8, 0x6b, 0x37, 0x9b, 0x88, 0x06, 0xe3, 0x51, + 0x3c, 0x8c, 0x55, 0x1d, 0x31, 0x5c, 0x43, 0x2d, + 0x0e, 0x58, 0xee, 0x4b, 0x30, 0x73, 0x27, 0x20, + 0x00, 0x05, 0xd9, 0x7e, 0x52, 0x12, 0x0f, 0xa4, + 0xa3, 0x59, 0xb8, 0xc4, 0xd4, 0x72, 0x40, 0x00, + 0x0f, 0x65, 0x2b, 0xca, 0x43, 0x85, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd1, 0x4b, + 0x02, 0xfc, 0xde, 0x4d, 0x39, 0x92, 0x94, 0xe0, + 0x8b, 0xd3, 0xe9, 0x1c, 0xc8, 0xf8, 0x60, 0x60, + 0x60, 0x0d, 0x25, 0x91, 0x1c, 0xda, 0x45, 0x21, + 0x16, 0xc4, 0xd2, 0x01, 0xac, 0x84, 0x7a, 0x19, + 0xb0, 0x14, 0x27, 0x24, 0x00, 0x06, 0x44, 0xa3, + 0x41, 0xd2, 0x95, 0xa6, 0xd3, 0x49, 0xf4, 0x8a, + 0x6b, 0x22, 0x80, 0x00, 0x3d, 0x6c, 0xaf, 0x3e, + 0x1c, 0x61, 0xa4, 0x9c, 0x56, 0x95, 0x67, 0x54, + 0x48, 0x28, 0x49, 0xa6, 0x04, 0xe2, 0x31, 0xac, + 0xc8, 0x9e, 0x6c, 0x20, 0x18, 0x12, 0xc8, 0xa6, + 0xf3, 0xa0, 0x24, 0x1d, 0x01, 0xbc, 0x9a, 0x73, + 0x04, 0x63, 0x71, 0x88, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0xc2, 0x31, 0x80, 0x3e, 0x14, + 0x00, 0x00, 0x01, 0xb0, 0xcc, 0xd0, 0x6d, 0x3e, + 0x99, 0x91, 0x80, 0x00, 0x00, 0x76, 0x65, 0x61, + 0x3c, 0xe7, 0x8d, 0x66, 0x46, 0x82, 0x39, 0x6a, + 0x56, 0x98, 0x97, 0x05, 0x39, 0x60, 0x68, 0x36, + 0x11, 0xc9, 0x47, 0xd2, 0xac, 0x9c, 0x6b, 0x2c, + 0x08, 0xa7, 0x42, 0x44, 0x3a, 0x02, 0x41, 0x34, + 0xe5, 0xcc, 0xfc, 0x75, 0xd3, 0xe3, 0xa8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0xf4, + 0xcc, 0x1f, 0x7d, 0xf1, 0x39, 0x93, 0x90, 0x00, + 0x00, 0x0e, 0x98, 0x96, 0x40, 0x33, 0x2c, 0x0e, + 0x60, 0x82, 0x00, 0x00, 0x03, 0xd9, 0x4a, 0xf2, + 0x90, 0xe1, 0x41, 0x34, 0xb9, 0x21, 0x18, 0x91, + 0xcd, 0x80, 0x8c, 0x0d, 0xc6, 0xf2, 0x01, 0xb0, + 0xcc, 0xd4, 0x4a, 0x21, 0x1a, 0x01, 0xe8, 0xa5, + 0x81, 0xd0, 0x9b, 0xc9, 0xc7, 0x2e, 0x72, 0xfc, + 0x8c, 0xe8, 0x30, 0xa8, 0x1d, 0x26, 0xf6, 0x8d, + 0x58, 0x87, 0x56, 0xd9, 0x41, 0xa3, 0xa4, 0xde, + 0x60, 0xd2, 0x2b, 0xe8, 0x97, 0x64, 0x4a, 0xb5, + 0x42, 0xc6, 0xed, 0x10, 0xd3, 0x0f, 0x84, 0x5a, + 0xc0, 0x1b, 0x66, 0x7d, 0x0f, 0xbb, 0xac, 0x02, + 0x90, 0xe5, 0x40, 0x00, 0x02, 0xe0, 0xf8, 0x55, + 0x16, 0xa6, 0xb3, 0x22, 0xa8, 0x00, 0x00, 0x07, + 0xab, 0x15, 0xc5, 0x29, 0xc2, 0x03, 0xa9, 0x2d, + 0xca, 0x52, 0x21, 0xd5, 0x11, 0x4f, 0xa4, 0x93, + 0xe9, 0x4e, 0x6b, 0x3a, 0x52, 0x09, 0xa0, 0xd8, + 0x4d, 0x39, 0x93, 0x9a, 0x07, 0xa2, 0x96, 0x07, + 0x44, 0x6f, 0x27, 0x1c, 0xb1, 0xc3, 0x72, 0xb3, + 0xe7, 0x31, 0x80, 0x3b, 0x1f, 0x45, 0xac, 0xee, + 0xbf, 0xd6, 0x6a, 0x29, 0x15, 0x99, 0xa6, 0x59, + 0x2a, 0x55, 0xd5, 0x74, 0x9b, 0x4c, 0x1a, 0x44, + 0x48, 0x64, 0x4c, 0xb4, 0xe8, 0x88, 0xd9, 0x2f, + 0x2b, 0xf0, 0xd4, 0x0d, 0xb2, 0xf5, 0x9e, 0xd6, + 0xb5, 0xe4, 0x03, 0x98, 0x00, 0x00, 0x0b, 0x62, + 0xac, 0x92, 0x6f, 0x31, 0x25, 0x14, 0xa0, 0x00, + 0x00, 0x3d, 0x20, 0xad, 0x30, 0x39, 0x70, 0x00, + 0x00, 0x02, 0x69, 0xa0, 0xd2, 0x0c, 0xc9, 0xa5, + 0x78, 0x00, 0x03, 0xae, 0x30, 0x3a, 0x22, 0x41, + 0x38, 0xe5, 0x48, 0x1c, 0x7c, 0xe9, 0x7c, 0xb5, + 0x02, 0xd3, 0x49, 0xd1, 0x09, 0x76, 0x7c, 0x23, + 0xd5, 0xa6, 0x20, 0x6d, 0x99, 0xfa, 0x48, 0xb3, + 0x45, 0x5f, 0x65, 0xae, 0x12, 0x2c, 0xd3, 0x54, + 0x0a, 0x40, 0x12, 0xf4, 0x9b, 0xbe, 0xf6, 0xb1, + 0x0e, 0x64, 0xe4, 0x00, 0x00, 0x02, 0xf4, 0xb0, + 0x2b, 0xcd, 0x25, 0xd9, 0x70, 0x79, 0xa8, 0x00, + 0x00, 0x0f, 0x65, 0x2b, 0xce, 0x74, 0xe3, 0x01, + 0x78, 0x53, 0x16, 0x64, 0x33, 0x12, 0x59, 0x14, + 0xc8, 0x98, 0x43, 0x3e, 0x98, 0x98, 0x9b, 0x8f, + 0xa6, 0x07, 0xc2, 0x20, 0x3d, 0x00, 0xb5, 0x3a, + 0x32, 0x41, 0x38, 0xe5, 0x0c, 0x29, 0x1c, 0xbe, + 0x31, 0xf4, 0x03, 0x61, 0xac, 0x98, 0x6a, 0x34, + 0x00, 0x0c, 0xcc, 0x00, 0x00, 0x00, 0x5c, 0xeb, + 0x39, 0xe9, 0x22, 0x19, 0xcd, 0x80, 0x00, 0x04, + 0xe2, 0x11, 0xf4, 0x90, 0x68, 0x36, 0x1a, 0x00, + 0x00, 0x00, 0x7a, 0x11, 0x5a, 0x73, 0xc7, 0x16, + 0x7d, 0x3b, 0x12, 0xb8, 0xb0, 0x27, 0x83, 0x51, + 0x62, 0x72, 0x84, 0xb2, 0xc8, 0x8a, 0x49, 0x37, + 0x1a, 0xc9, 0x84, 0x32, 0x11, 0xc6, 0x83, 0xd0, + 0x4b, 0x43, 0xa3, 0x24, 0x13, 0xce, 0x50, 0xaa, + 0x3c, 0xc0, 0x00, 0x76, 0xc5, 0x71, 0x18, 0xb0, + 0x36, 0x18, 0x12, 0x8a, 0xf3, 0x61, 0xb0, 0xd2, + 0x48, 0x21, 0x1c, 0xd8, 0x00, 0xeb, 0xce, 0x98, + 0x14, 0x25, 0x71, 0xf4, 0xd2, 0x6e, 0x06, 0x06, + 0xa3, 0x13, 0x41, 0xf4, 0xd4, 0x6e, 0x2d, 0x0c, + 0x08, 0x66, 0xb2, 0xc0, 0xc8, 0x88, 0x4c, 0x2a, + 0x8f, 0x4e, 0x2b, 0xcc, 0x8e, 0x48, 0xc0, 0x00, + 0x00, 0x2c, 0xca, 0xd3, 0xe0, 0x04, 0xa2, 0x28, + 0x00, 0x03, 0x79, 0xd6, 0x9a, 0x4e, 0x90, 0x90, + 0x4f, 0x39, 0x32, 0x21, 0xc2, 0x80, 0x09, 0x64, + 0x92, 0x29, 0x34, 0xfa, 0x4a, 0x34, 0x10, 0x8d, + 0xa4, 0xd3, 0x50, 0x34, 0x15, 0x60, 0x03, 0xa6, + 0x2c, 0x01, 0xcc, 0x93, 0x4d, 0x24, 0x12, 0x60, + 0x3e, 0x11, 0x8b, 0xe3, 0x51, 0x04, 0x90, 0x73, + 0xc7, 0x54, 0x42, 0x30, 0x39, 0x83, 0xa9, 0x35, + 0x13, 0x88, 0xc5, 0x09, 0xe9, 0x65, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xd2, 0x92, 0x09, 0xe7, 0x24, 0x44, 0x38, 0x50, + 0x01, 0xbc, 0xb0, 0x34, 0x9b, 0x48, 0x26, 0xa3, + 0x00, 0x6f, 0x34, 0x19, 0x1f, 0x0f, 0x80, 0x00, + 0x74, 0xc5, 0x80, 0x39, 0x93, 0x90, 0x00, 0x00, + 0x6d, 0x26, 0x98, 0x19, 0x90, 0x4d, 0xc7, 0xd3, + 0x02, 0x38, 0x24, 0x82, 0x30, 0x07, 0xb2, 0x95, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x4a, 0x49, 0x27, 0x9c, 0x89, 0x54, + 0x79, 0x80, 0x00, 0xbc, 0x24, 0x99, 0x9a, 0x8c, + 0x0b, 0x43, 0x49, 0xbc, 0x92, 0x57, 0x17, 0x85, + 0x29, 0x14, 0xe6, 0x80, 0x07, 0x5e, 0x74, 0xc0, + 0xe6, 0x4e, 0x40, 0x00, 0x01, 0xd6, 0x99, 0x15, + 0x65, 0xa1, 0x5e, 0x62, 0x74, 0x26, 0x47, 0x9f, + 0x80, 0x00, 0x07, 0xb2, 0x95, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x4c, + 0x48, 0x2c, 0x0e, 0x44, 0x8e, 0x70, 0x20, 0x02, + 0x41, 0x34, 0x84, 0x4d, 0x20, 0x92, 0x4d, 0xe6, + 0x93, 0x23, 0x41, 0x34, 0xc0, 0x80, 0x68, 0x00, + 0x1d, 0x31, 0x60, 0x0a, 0x13, 0x92, 0x00, 0x00, + 0x58, 0x93, 0x4d, 0x06, 0xf2, 0x21, 0x99, 0xbc, + 0xc0, 0xa5, 0x00, 0x00, 0x0f, 0x5b, 0x2b, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x98, 0x92, 0x58, 0x1c, 0x81, 0x46, 0x70, + 0x00, 0xb0, 0x25, 0x02, 0xa0, 0xb8, 0x30, 0x31, + 0x34, 0x18, 0x13, 0x08, 0x26, 0xe3, 0x22, 0x29, + 0x60, 0x6f, 0x23, 0x15, 0x47, 0xc3, 0xaf, 0x2f, + 0x01, 0x5e, 0x73, 0x20, 0x94, 0x4c, 0x36, 0x91, + 0x89, 0x05, 0x39, 0x62, 0x7c, 0x35, 0x9a, 0x88, + 0xe5, 0xb1, 0x56, 0x60, 0x09, 0x44, 0x50, 0x0f, + 0x48, 0x2b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x9c, 0x92, 0x58, 0x1c, + 0x79, 0xcf, 0x9e, 0x74, 0x0e, 0xf0, 0x82, 0x60, + 0x50, 0x96, 0x85, 0xe1, 0x48, 0x60, 0x47, 0x3a, + 0x62, 0x11, 0x91, 0x2c, 0xe6, 0x8e, 0xbc, 0xa6, + 0x37, 0x1c, 0x89, 0xa4, 0xec, 0x8e, 0x8c, 0x1c, + 0xc9, 0xc8, 0x02, 0xf0, 0xb7, 0x37, 0x15, 0x86, + 0xc2, 0x59, 0xf0, 0xda, 0x64, 0x5a, 0x9c, 0x89, + 0xbc, 0xbf, 0x22, 0x1b, 0x08, 0xe7, 0x0c, 0x01, + 0xec, 0xa5, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xd4, 0x12, 0x0b, 0x13, + 0x8e, 0x39, 0xf3, 0xce, 0x81, 0xb4, 0x98, 0x60, + 0x68, 0x37, 0x18, 0x19, 0x1f, 0x48, 0xc6, 0xe3, + 0x59, 0x81, 0xbc, 0xd6, 0x0d, 0xe6, 0xa2, 0x38, + 0x3b, 0x23, 0xa3, 0x07, 0x32, 0x72, 0x00, 0xda, + 0x66, 0x66, 0x62, 0x69, 0x37, 0x98, 0x9a, 0x8c, + 0xcb, 0xa2, 0x88, 0xde, 0x49, 0x22, 0x03, 0x22, + 0x28, 0x07, 0xb2, 0x95, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x50, 0x49, + 0x2c, 0x4e, 0x38, 0xe7, 0x8f, 0x3a, 0x00, 0x00, + 0x75, 0x04, 0x03, 0x71, 0x28, 0x86, 0x6c, 0x37, + 0x9f, 0x0d, 0x07, 0x3e, 0x00, 0x00, 0xec, 0xce, + 0x88, 0x1c, 0xd1, 0xc7, 0x80, 0x76, 0x84, 0x63, + 0xe9, 0xb4, 0xd8, 0x62, 0x45, 0x37, 0x11, 0xcd, + 0xc4, 0x93, 0x59, 0xac, 0xd6, 0x72, 0xa0, 0x1f, + 0x4f, 0x65, 0x2b, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0xa4, 0x92, 0x58, + 0x9c, 0x69, 0x10, 0xf2, 0xa3, 0x48, 0x00, 0x1d, + 0x49, 0x18, 0xdc, 0x6e, 0x31, 0x34, 0x1b, 0xcd, + 0xa4, 0x23, 0x9d, 0x00, 0x00, 0x7a, 0x71, 0xbc, + 0x1a, 0x4f, 0x30, 0x00, 0xe8, 0x8a, 0xb2, 0xcc, + 0xc8, 0xd2, 0x66, 0x60, 0x60, 0x6e, 0x21, 0x93, + 0xca, 0x92, 0x59, 0x24, 0xe7, 0x80, 0x3a, 0xe3, + 0xab, 0x35, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1d, 0x49, 0x28, 0xb1, 0x39, + 0x82, 0x88, 0xd8, 0x53, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5a, 0x1b, 0x0c, 0x01, 0x91, + 0x89, 0x5a, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x24, 0x16, 0x84, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x71, 0xd5, + 0x99, 0x16, 0x46, 0x07, 0x32, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6c, 0x3a, 0x13, 0x03, 0x82, 0x23, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x9f, 0xff, 0xc4, 0x00, 0x32, + 0x10, 0x00, 0x01, 0x04, 0x02, 0x01, 0x03, 0x02, + 0x06, 0x01, 0x04, 0x02, 0x03, 0x01, 0x01, 0x00, + 0x00, 0x04, 0x00, 0x02, 0x03, 0x05, 0x01, 0x15, + 0x14, 0x06, 0x13, 0x16, 0x12, 0x34, 0x10, 0x11, + 0x20, 0x32, 0x33, 0x35, 0x40, 0x07, 0x17, 0x30, + 0x31, 0x21, 0x23, 0x22, 0x24, 0x50, 0x25, 0x36, + 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, + 0x05, 0x02, 0x1c, 0x7c, 0x4e, 0xde, 0x03, 0x17, + 0x01, 0x8b, 0x80, 0xc5, 0xc0, 0x62, 0xe0, 0x31, + 0x70, 0x18, 0xb8, 0x0c, 0x5c, 0x06, 0x2e, 0x03, + 0x17, 0x01, 0x8b, 0x80, 0xc5, 0xc0, 0x62, 0xe0, + 0x31, 0x70, 0x18, 0xb8, 0x0c, 0x5c, 0x06, 0x2e, + 0x03, 0x17, 0x01, 0x8b, 0x80, 0xc5, 0xc0, 0x62, + 0xe0, 0x31, 0x70, 0x18, 0xb8, 0x0c, 0x5c, 0x06, + 0x2e, 0x03, 0x17, 0x01, 0x8b, 0x80, 0xc5, 0xc0, + 0x62, 0xe0, 0x31, 0x70, 0x18, 0xb8, 0x0c, 0x5c, + 0x06, 0x2e, 0x03, 0x17, 0x01, 0x8b, 0x80, 0xc5, + 0xc0, 0x62, 0xe0, 0x31, 0x70, 0x18, 0xb8, 0x0c, + 0x5c, 0x06, 0x2e, 0x03, 0x17, 0x01, 0x8b, 0x80, + 0xc5, 0xc0, 0x62, 0xe0, 0x31, 0x70, 0x18, 0xb8, + 0x0c, 0x5c, 0x06, 0x2e, 0x03, 0x17, 0x01, 0x8b, + 0x80, 0xc5, 0xc0, 0x62, 0xe0, 0x31, 0x70, 0x18, + 0xb8, 0x0c, 0x5c, 0x06, 0x2e, 0x03, 0x17, 0x01, + 0x8b, 0x80, 0xc5, 0xc0, 0x62, 0xe0, 0x31, 0x70, + 0x18, 0xb8, 0x0c, 0x5c, 0x06, 0x2e, 0x03, 0x17, + 0x01, 0x8b, 0x80, 0xc5, 0xc0, 0x62, 0xe0, 0x31, + 0x70, 0x18, 0xb8, 0x0c, 0x5c, 0x06, 0x2e, 0x03, + 0x17, 0x01, 0x8b, 0x80, 0xc4, 0x40, 0xf8, 0x81, + 0xa0, 0x7e, 0x2f, 0xfe, 0x66, 0x73, 0xf2, 0xc6, + 0x0a, 0xc6, 0x71, 0xc9, 0x5c, 0x95, 0xc9, 0x5c, + 0x95, 0xc9, 0x5c, 0x95, 0xc9, 0x5c, 0x95, 0xc9, + 0x5c, 0x95, 0xc9, 0x5c, 0x95, 0xc9, 0x5c, 0x95, + 0xc9, 0x5c, 0xbc, 0x7c, 0xf9, 0x58, 0x5c, 0xac, + 0x2e, 0x56, 0x17, 0x2b, 0x0b, 0x95, 0x85, 0xca, + 0xc2, 0xe6, 0x37, 0xe7, 0xca, 0xc2, 0xe5, 0x61, + 0x72, 0xb0, 0xb9, 0x58, 0x5c, 0xac, 0x2e, 0x56, + 0x11, 0x53, 0x62, 0x58, 0x41, 0xfc, 0x5f, 0xfc, + 0xc9, 0x3f, 0x1e, 0x27, 0x60, 0x95, 0xa2, 0x7f, + 0x50, 0x68, 0x0f, 0x2f, 0xe9, 0x9a, 0x78, 0xc6, + 0x8b, 0xfc, 0x12, 0x7b, 0xd5, 0x3d, 0xe8, 0x23, + 0x1b, 0x07, 0x51, 0x02, 0x49, 0xb1, 0x5a, 0x8b, + 0x39, 0x42, 0x75, 0x35, 0x61, 0xc4, 0xa6, 0xfb, + 0xb3, 0xec, 0x07, 0xab, 0x14, 0xcb, 0xb0, 0xab, + 0xe0, 0x2f, 0xa8, 0x40, 0x09, 0xb9, 0xbb, 0x0f, + 0x19, 0x33, 0xa9, 0xab, 0x40, 0x27, 0x19, 0xf9, + 0xe2, 0x7f, 0xf4, 0x0f, 0xe2, 0xff, 0x00, 0xe6, + 0x49, 0xf8, 0xc5, 0xf6, 0xc4, 0x9f, 0x35, 0x65, + 0xa9, 0x27, 0xdc, 0x09, 0x47, 0x6b, 0x2d, 0x8d, + 0x5e, 0x6f, 0x89, 0x2f, 0x05, 0x91, 0x73, 0x70, + 0x75, 0xc4, 0x45, 0x4e, 0xca, 0xeb, 0x12, 0x48, + 0x33, 0xa3, 0xed, 0x4f, 0x26, 0xb6, 0xb0, 0xd3, + 0x0e, 0x84, 0xf1, 0x65, 0xbe, 0x75, 0x7f, 0x45, + 0x99, 0x99, 0xa2, 0xfa, 0x24, 0xf7, 0xaa, 0xcf, + 0xbd, 0x97, 0x87, 0x29, 0xd4, 0x8e, 0xea, 0x2a, + 0x7c, 0x0f, 0x4b, 0xea, 0xaf, 0xe1, 0xa6, 0xfb, + 0xbe, 0xa1, 0x89, 0x92, 0x52, 0x01, 0xfb, 0xaa, + 0x71, 0x0d, 0x96, 0x00, 0x60, 0x8f, 0xa8, 0x84, + 0xe9, 0xbe, 0xce, 0xa0, 0x6c, 0xc5, 0x91, 0xa7, + 0x40, 0xfe, 0x2f, 0xfe, 0x64, 0x9f, 0x8c, 0x5f, + 0x6c, 0xda, 0x70, 0xd8, 0x4c, 0x5d, 0x17, 0x4b, + 0x00, 0xa5, 0x74, 0xdd, 0x71, 0xab, 0xc2, 0x06, + 0x36, 0xf4, 0xae, 0x98, 0xab, 0x3a, 0xc6, 0x4e, + 0x99, 0xad, 0x94, 0x2c, 0x74, 0x85, 0x43, 0x61, + 0x9f, 0xa1, 0xe8, 0xca, 0xcc, 0x74, 0xe1, 0xc5, + 0x2c, 0x3d, 0x19, 0x4a, 0x38, 0xb5, 0x74, 0xc1, + 0xd2, 0xc5, 0xf4, 0x49, 0xef, 0x54, 0xf4, 0x00, + 0x12, 0x64, 0x5d, 0x3f, 0x5f, 0x09, 0xdf, 0xed, + 0x07, 0xd3, 0x35, 0xa0, 0x12, 0x9b, 0xee, 0xec, + 0xaa, 0xc7, 0xb7, 0x1f, 0x3d, 0x2f, 0x5d, 0x91, + 0x0b, 0xa0, 0x00, 0xe8, 0xa0, 0x82, 0x31, 0x61, + 0x33, 0xa6, 0x6b, 0x4f, 0x2b, 0xfd, 0x29, 0xd0, + 0x3f, 0x8b, 0xe2, 0x55, 0xc8, 0x41, 0x3f, 0xc9, + 0xeb, 0x17, 0x93, 0xd6, 0x2f, 0x27, 0xac, 0x5e, + 0x4f, 0x58, 0xbc, 0x9e, 0xb1, 0x79, 0x3d, 0x62, + 0xf2, 0x7a, 0xc5, 0xe4, 0xf5, 0x8b, 0xc9, 0xeb, + 0x17, 0x93, 0xd6, 0x2f, 0x27, 0xac, 0x5e, 0x4f, + 0x58, 0xbc, 0x9e, 0xb1, 0x79, 0x3d, 0x62, 0xf2, + 0x7a, 0xc5, 0xe4, 0xf5, 0x8b, 0xc9, 0xeb, 0x17, + 0x93, 0xd6, 0x2f, 0x27, 0xac, 0x5e, 0x4f, 0x58, + 0x84, 0x3c, 0x63, 0xf0, 0xb3, 0x9f, 0x96, 0x25, + 0xb3, 0x6b, 0x73, 0xb4, 0x91, 0x6d, 0x24, 0x5b, + 0x49, 0x16, 0xd2, 0x45, 0xb4, 0x91, 0x6d, 0x24, + 0x5b, 0x49, 0x16, 0xd2, 0x45, 0xb4, 0x91, 0x6d, + 0x24, 0x5b, 0x49, 0x16, 0xd2, 0x45, 0xb4, 0x91, + 0x6d, 0x24, 0x5b, 0x49, 0x16, 0xd2, 0x45, 0x9b, + 0x37, 0xe7, 0x18, 0x2d, 0xf8, 0xc7, 0x32, 0x45, + 0xcc, 0x91, 0x73, 0x24, 0x5c, 0xc9, 0x17, 0x32, + 0x45, 0xcc, 0x91, 0x73, 0x24, 0x5c, 0xc9, 0x17, + 0x32, 0x45, 0xcc, 0x91, 0x73, 0x24, 0x5c, 0xc9, + 0x17, 0x32, 0x45, 0xcc, 0x91, 0x73, 0x24, 0x5c, + 0xa7, 0x7c, 0xf9, 0x6f, 0x5c, 0xb7, 0xae, 0x5b, + 0xd7, 0x2d, 0xeb, 0x96, 0xf5, 0xcb, 0x7a, 0xe4, + 0xbb, 0xe7, 0xcb, 0x7a, 0xe5, 0xbd, 0x72, 0xde, + 0xb9, 0x6f, 0x4c, 0x2d, 0x44, 0xc6, 0x4c, 0xd2, + 0x62, 0xc4, 0x51, 0x05, 0xf8, 0xfe, 0x1d, 0x53, + 0x6c, 0xe0, 0xa1, 0xfe, 0x2c, 0x52, 0xba, 0x19, + 0x29, 0xec, 0x36, 0x95, 0xc6, 0x39, 0xd3, 0xcc, + 0xe3, 0xa0, 0x83, 0x3b, 0x5c, 0x2d, 0xae, 0x16, + 0xd7, 0x0b, 0x6b, 0x85, 0xb5, 0xc2, 0xda, 0xe1, + 0x6d, 0x70, 0xb6, 0xb8, 0x5b, 0x5c, 0x2d, 0xae, + 0x16, 0xd7, 0x0b, 0x6b, 0x85, 0xb5, 0xc2, 0xda, + 0xe1, 0x6d, 0x70, 0xb6, 0xb8, 0x5b, 0x5c, 0x2d, + 0xae, 0x16, 0xd7, 0x0b, 0x6b, 0x85, 0xb4, 0x6e, + 0x54, 0xac, 0x63, 0xa2, 0x59, 0x64, 0x22, 0xe3, + 0x96, 0x22, 0xe5, 0x88, 0xb9, 0x62, 0x2e, 0x58, + 0x8b, 0x96, 0x22, 0xe5, 0x88, 0xb9, 0x62, 0x2e, + 0x58, 0x8b, 0x96, 0x22, 0xe5, 0x88, 0xb9, 0x62, + 0x2e, 0x58, 0x8b, 0x96, 0x22, 0xe5, 0x88, 0xb9, + 0x62, 0x2e, 0x58, 0x8b, 0x96, 0x22, 0xe5, 0x88, + 0xb9, 0x62, 0x2e, 0x58, 0x8b, 0x96, 0x22, 0x6f, + 0x1c, 0xbc, 0x8f, 0x2e, 0x46, 0x98, 0xdf, 0xc4, + 0x17, 0xe3, 0xf8, 0x75, 0x97, 0xed, 0x7e, 0xb8, + 0xa2, 0x74, 0xd2, 0xf5, 0x05, 0x58, 0x83, 0x0d, + 0x0c, 0x35, 0xe2, 0x51, 0xc7, 0x4e, 0x09, 0x24, + 0xc9, 0x4d, 0x06, 0x3a, 0x8a, 0xd2, 0xac, 0x71, + 0xee, 0x0a, 0xa9, 0x8b, 0x0b, 0xfd, 0x7f, 0x83, + 0xa3, 0x33, 0xff, 0x00, 0xe7, 0x49, 0x9f, 0x91, + 0x5c, 0xb5, 0xcb, 0x5c, 0xb5, 0xcb, 0x5c, 0xb5, + 0xcb, 0x5c, 0xb5, 0x50, 0x16, 0x6d, 0xb1, 0x56, + 0x13, 0xac, 0xa3, 0x6b, 0xa6, 0x7c, 0x4c, 0xef, + 0xc9, 0x8c, 0xbe, 0x5c, 0x46, 0xcc, 0xcd, 0x2c, + 0x78, 0xcc, 0xce, 0x66, 0x73, 0x33, 0x65, 0x71, + 0x39, 0x63, 0xb9, 0x6b, 0x96, 0xb9, 0x6b, 0x96, + 0xb9, 0x6b, 0x96, 0xaa, 0x25, 0xee, 0xd7, 0x43, + 0xff, 0x00, 0x33, 0x59, 0x17, 0xff, 0x00, 0xe8, + 0x72, 0xd7, 0x2d, 0x47, 0x53, 0x3c, 0x91, 0x12, + 0xe9, 0x04, 0x9f, 0x96, 0xb9, 0x6b, 0x96, 0xb9, + 0x6b, 0x96, 0x8a, 0x12, 0x71, 0x21, 0x1b, 0x32, + 0x19, 0x31, 0x55, 0x84, 0x8d, 0x09, 0xac, 0xe1, + 0xc7, 0xcb, 0x5c, 0xb5, 0x64, 0xcd, 0x71, 0x53, + 0x4f, 0x1b, 0x1b, 0xcb, 0x5c, 0xb5, 0xcb, 0x5c, + 0xb4, 0xd3, 0xb2, 0xc7, 0x58, 0x63, 0xe4, 0x64, + 0xd9, 0xf9, 0x88, 0x17, 0xe3, 0xf8, 0x75, 0x8f, + 0xed, 0x7e, 0xbe, 0x98, 0x87, 0x0e, 0xb2, 0x1c, + 0xb1, 0x6e, 0x46, 0x8e, 0xc3, 0x35, 0xdd, 0x31, + 0xf3, 0x71, 0x57, 0x72, 0x14, 0xcd, 0x0d, 0xe3, + 0x9a, 0xeb, 0xcb, 0x09, 0xf3, 0x36, 0x5e, 0xef, + 0x5b, 0xbe, 0xbe, 0x8c, 0xfd, 0x7c, 0xd8, 0xf9, + 0xcf, 0xc6, 0xca, 0xe3, 0x65, 0x71, 0xb2, 0xb8, + 0xd9, 0x5c, 0x6c, 0xae, 0x36, 0x57, 0x1b, 0x2b, + 0xa7, 0xf3, 0x90, 0xc3, 0x8c, 0x7c, 0x01, 0x37, + 0x76, 0x20, 0xf3, 0x0c, 0x92, 0x0d, 0x5c, 0x53, + 0xa4, 0x9d, 0x65, 0xc4, 0x0e, 0x65, 0xdb, 0x9c, + 0x35, 0x60, 0x6d, 0xee, 0xc4, 0xe8, 0x5c, 0xf7, + 0x71, 0xb2, 0xb8, 0xd9, 0x5c, 0x6c, 0xae, 0x36, + 0x57, 0x1b, 0x2b, 0x8d, 0x95, 0x41, 0x1f, 0x6e, + 0xba, 0x0f, 0xcd, 0x6b, 0x1b, 0xb6, 0x9d, 0xb7, + 0xae, 0xdb, 0xd1, 0x82, 0x89, 0x28, 0xbc, 0xde, + 0xfa, 0xc7, 0xaa, 0xc2, 0x9f, 0x31, 0x35, 0xe5, + 0x0b, 0x23, 0x44, 0xae, 0x69, 0x18, 0x0a, 0xaa, + 0xb6, 0xbd, 0xf6, 0x07, 0x59, 0x47, 0xb2, 0x1f, + 0xa6, 0x18, 0xfc, 0x4a, 0x2c, 0x46, 0x7c, 0xa2, + 0x87, 0x1e, 0x98, 0x9b, 0x9b, 0xa0, 0x6d, 0x8e, + 0x22, 0x77, 0x5d, 0xc7, 0x98, 0x21, 0x17, 0x1f, + 0x27, 0x47, 0xf3, 0xb5, 0x03, 0x25, 0xcc, 0x44, + 0x9d, 0xb7, 0xae, 0xdb, 0xd7, 0x6d, 0xea, 0xc7, + 0xde, 0xcb, 0xec, 0xc2, 0xfc, 0x7f, 0x0e, 0xb1, + 0xfd, 0xaf, 0xf1, 0xba, 0x33, 0xf5, 0xff, 0x00, + 0x71, 0xee, 0x07, 0x2c, 0x77, 0x11, 0x71, 0x17, + 0x11, 0x71, 0x17, 0x11, 0x71, 0x14, 0x6c, 0x92, + 0x28, 0xbb, 0xa4, 0x77, 0x23, 0x20, 0xa8, 0xa0, + 0xff, 0x00, 0xb7, 0xb7, 0x97, 0xcf, 0x9c, 0xc2, + 0x41, 0x43, 0xc2, 0xf6, 0xc9, 0x24, 0x2e, 0xc4, + 0x70, 0x56, 0x71, 0x17, 0x11, 0x71, 0x17, 0x11, + 0x71, 0x17, 0x11, 0x71, 0x10, 0xd0, 0x71, 0x6b, + 0xe1, 0xcf, 0xca, 0x5b, 0x10, 0xf3, 0xcf, 0xe2, + 0x2e, 0x22, 0x27, 0x2f, 0x29, 0x81, 0xba, 0x40, + 0x9d, 0xce, 0x23, 0x94, 0xc2, 0xa7, 0x8d, 0xa2, + 0x97, 0x30, 0xb0, 0xba, 0x59, 0x5e, 0x38, 0xec, + 0x78, 0xb3, 0x62, 0xca, 0x76, 0xe2, 0x16, 0xc8, + 0x34, 0xe4, 0xd8, 0x10, 0x4c, 0x38, 0x32, 0x76, + 0x3c, 0x92, 0x26, 0x21, 0x12, 0x6c, 0xe5, 0x45, + 0x93, 0x67, 0xc9, 0x0d, 0x36, 0x66, 0xa8, 0xdf, + 0x23, 0x47, 0x22, 0x6f, 0x94, 0x1c, 0x45, 0xc4, + 0x4c, 0x07, 0x32, 0x3c, 0xf7, 0x61, 0xc6, 0x4b, + 0xed, 0x03, 0xfc, 0x7f, 0x0e, 0xb1, 0xfd, 0xaf, + 0xd1, 0x4f, 0x57, 0x8b, 0x17, 0x12, 0x05, 0x74, + 0x81, 0x8b, 0x48, 0x71, 0x90, 0x0d, 0x4e, 0x61, + 0x6d, 0x97, 0xa7, 0xa7, 0x86, 0xa7, 0x34, 0xa6, + 0xe0, 0x5d, 0x69, 0x1d, 0xb0, 0x82, 0x86, 0x2c, + 0xb2, 0x98, 0x59, 0xa2, 0xb1, 0x85, 0xa3, 0x1f, + 0x53, 0x47, 0x15, 0x8d, 0x55, 0x45, 0x1c, 0x47, + 0x56, 0x74, 0xfd, 0x14, 0x76, 0x9f, 0x57, 0x46, + 0xfe, 0xbc, 0xcf, 0x75, 0x73, 0x77, 0xc2, 0x3b, + 0xc9, 0x62, 0x5e, 0x4b, 0x12, 0xf2, 0x58, 0x97, + 0x92, 0xc4, 0xbc, 0x96, 0x25, 0xe4, 0xb1, 0x2f, + 0x25, 0x89, 0x79, 0x2c, 0x4b, 0xc9, 0x62, 0x5e, + 0x4b, 0x12, 0xf2, 0x58, 0x97, 0x92, 0xc4, 0xbc, + 0x96, 0x25, 0xe4, 0xb1, 0x2f, 0x25, 0x89, 0x79, + 0x2c, 0x4b, 0xc9, 0x62, 0x5e, 0x4b, 0x12, 0xf2, + 0x58, 0x97, 0x92, 0xc4, 0x9f, 0xd4, 0xd8, 0xf9, + 0x1e, 0xfc, 0xc9, 0x22, 0xb2, 0xb3, 0x84, 0x46, + 0xef, 0x2b, 0x96, 0xf2, 0xb9, 0x6f, 0x2b, 0x96, + 0xf2, 0xb9, 0x6f, 0x2b, 0x96, 0xf2, 0xb9, 0x6f, + 0x2b, 0x96, 0xf2, 0xb9, 0x6f, 0x2b, 0x96, 0xf2, + 0xb9, 0x6f, 0x2b, 0x96, 0xf2, 0xb9, 0x6f, 0x2b, + 0x96, 0xf2, 0xb9, 0x6f, 0x2b, 0x96, 0xf2, 0xb9, + 0x6f, 0x2b, 0x96, 0xf2, 0xb9, 0x6f, 0x2b, 0x96, + 0xf2, 0xb9, 0x6f, 0x2b, 0x90, 0x27, 0x41, 0x38, + 0x8a, 0x5f, 0x68, 0x1f, 0xe3, 0xf8, 0x75, 0x8f, + 0xed, 0x7e, 0x8e, 0x9e, 0xc7, 0x2c, 0x0c, 0xf4, + 0xf9, 0x30, 0x87, 0x38, 0xe4, 0x15, 0x2d, 0xa4, + 0xf8, 0xd6, 0xbe, 0x37, 0x49, 0xd2, 0xc7, 0x4b, + 0x98, 0xac, 0xba, 0x63, 0x39, 0x18, 0x12, 0x3b, + 0xe2, 0x93, 0xc9, 0x9b, 0xd2, 0x0c, 0xa2, 0x3a, + 0x7a, 0xa2, 0xe3, 0x12, 0xbb, 0xb6, 0xd0, 0x64, + 0xaa, 0xc8, 0x52, 0x1a, 0x43, 0x19, 0x1c, 0xff, + 0x00, 0x47, 0x46, 0xfe, 0xbc, 0xcf, 0x73, 0xd5, + 0x3f, 0xb4, 0xfa, 0xa5, 0xed, 0xba, 0xa6, 0xae, + 0x06, 0x4e, 0x08, 0x83, 0x45, 0x80, 0xec, 0x22, + 0x77, 0x08, 0x26, 0x4d, 0xab, 0x90, 0x6e, 0xfc, + 0x4e, 0xa5, 0xf4, 0x3e, 0x21, 0x47, 0xe1, 0x96, + 0x3e, 0x45, 0x27, 0xea, 0x33, 0xee, 0x5d, 0x4f, + 0xf6, 0xfc, 0x42, 0xc4, 0x2d, 0x0e, 0x6a, 0xdc, + 0x4c, 0xf7, 0xd6, 0x48, 0xc8, 0x99, 0x52, 0xf6, + 0x13, 0x8a, 0xf7, 0x76, 0x5d, 0x52, 0xf7, 0x11, + 0x05, 0x5c, 0x93, 0x30, 0x21, 0xd9, 0x9c, 0xc9, + 0x1c, 0x25, 0x88, 0xea, 0x99, 0x31, 0x27, 0x03, + 0x31, 0xe0, 0xea, 0xf8, 0xda, 0xf6, 0x55, 0x63, + 0xd1, 0x9a, 0xc9, 0x31, 0x11, 0xa1, 0xe4, 0x19, + 0xfe, 0x3d, 0x3f, 0xfa, 0x95, 0x27, 0xb4, 0x0f, + 0xec, 0xf8, 0x75, 0x8f, 0xed, 0x7e, 0x86, 0xbb, + 0x2c, 0x74, 0xc5, 0xce, 0x4a, 0x8c, 0xb9, 0xe1, + 0x66, 0x27, 0x93, 0x11, 0x34, 0x89, 0x59, 0x17, + 0x2e, 0x7e, 0xcb, 0x88, 0x95, 0xed, 0x96, 0x69, + 0x27, 0x7f, 0xc3, 0xbd, 0x26, 0x22, 0xe6, 0x4f, + 0xeb, 0x8a, 0x69, 0x07, 0x7f, 0xd3, 0xd1, 0xbf, + 0xaf, 0x33, 0xdc, 0xf5, 0x4f, 0xed, 0x3e, 0xac, + 0xcc, 0x26, 0xb4, 0x33, 0x78, 0x91, 0x6d, 0x61, + 0xe4, 0x4a, 0x48, 0xb1, 0xc1, 0xca, 0xf9, 0x00, + 0x25, 0x8b, 0x21, 0x8b, 0x9c, 0x2f, 0xa4, 0xcb, + 0x06, 0x12, 0xc3, 0xe7, 0x69, 0x45, 0xfd, 0x46, + 0x7d, 0xcb, 0xaa, 0x3e, 0xdf, 0x88, 0x47, 0xb8, + 0x30, 0xa2, 0x2f, 0xd4, 0xc9, 0x6d, 0x1b, 0x98, + 0xf1, 0x30, 0x71, 0xd9, 0xc0, 0x4c, 0x2d, 0x0e, + 0x62, 0xc5, 0x28, 0x8e, 0x74, 0x6f, 0xcc, 0x04, + 0xc5, 0x89, 0xe4, 0x7c, 0x03, 0x0b, 0xcf, 0x1f, + 0xe4, 0xd7, 0x8c, 0x34, 0x6e, 0xb1, 0x19, 0xc4, + 0x4a, 0x6c, 0x13, 0x40, 0xe2, 0xe0, 0xf9, 0xd8, + 0xca, 0xd9, 0xec, 0x3e, 0x3d, 0x3f, 0xfa, 0x95, + 0x27, 0xb4, 0x13, 0xec, 0xf8, 0x75, 0x8f, 0xed, + 0x3e, 0x82, 0x05, 0x6c, 0x40, 0x66, 0xb3, 0x32, + 0x40, 0x4d, 0x7c, 0xe2, 0x31, 0x95, 0x72, 0x3e, + 0xb0, 0x9a, 0xa2, 0x84, 0x8c, 0x58, 0xe3, 0x96, + 0x52, 0x2b, 0xe1, 0x86, 0xe3, 0x35, 0xb0, 0x17, + 0x14, 0xe0, 0x88, 0xf8, 0x6a, 0x6b, 0x19, 0x63, + 0x15, 0x3d, 0x6b, 0x2c, 0x11, 0xe2, 0xb4, 0x5c, + 0x4f, 0x52, 0xec, 0xcc, 0x58, 0x33, 0x02, 0xef, + 0xa3, 0xa3, 0xbf, 0x5c, 0x5f, 0xb9, 0xb1, 0xbc, + 0x1e, 0xbe, 0x7f, 0x2a, 0x09, 0x79, 0x50, 0x4b, + 0xca, 0x82, 0x5e, 0x54, 0x12, 0xf2, 0xa0, 0x97, + 0x95, 0x04, 0xbc, 0xa8, 0x25, 0xe5, 0x41, 0x2f, + 0x2a, 0x09, 0x79, 0x50, 0x4b, 0xca, 0x82, 0x5e, + 0x54, 0x12, 0xf2, 0xa0, 0x97, 0x95, 0x04, 0xbc, + 0xa8, 0x25, 0xe5, 0x41, 0x2f, 0x2a, 0x09, 0x79, + 0x50, 0x4b, 0xca, 0x82, 0x5e, 0x54, 0x12, 0xf2, + 0xa0, 0x95, 0x83, 0xbd, 0x73, 0xab, 0xab, 0x28, + 0x44, 0x6e, 0xf4, 0x25, 0xbd, 0x09, 0x62, 0xe4, + 0x5c, 0xad, 0xc0, 0xcb, 0x70, 0x32, 0xdc, 0x0c, + 0xb7, 0x03, 0x2d, 0xc0, 0xcb, 0x70, 0x32, 0xdc, + 0x0c, 0xb7, 0x03, 0x2d, 0xc0, 0xcb, 0x70, 0x32, + 0xdc, 0x0c, 0xb7, 0x03, 0x2d, 0xc0, 0xcb, 0x70, + 0x32, 0xdc, 0x0c, 0xb7, 0x03, 0x2d, 0xc0, 0xcb, + 0x70, 0x32, 0xac, 0x32, 0x32, 0xab, 0x94, 0x9e, + 0xd4, 0x4f, 0xb3, 0xe1, 0xd6, 0x3f, 0xb4, 0xfa, + 0x25, 0x82, 0x42, 0xe9, 0x42, 0x63, 0xa0, 0x33, + 0x11, 0x3e, 0x0a, 0x3a, 0x7f, 0x96, 0x03, 0x8e, + 0x19, 0x60, 0x89, 0x91, 0xba, 0x4c, 0xda, 0x81, + 0x31, 0x7d, 0x41, 0x14, 0xfc, 0x53, 0xe1, 0x16, + 0x50, 0x22, 0xa9, 0x9f, 0x22, 0x89, 0x88, 0x98, + 0x11, 0x26, 0xd8, 0xe4, 0x48, 0x4c, 0x17, 0x63, + 0x63, 0x61, 0x3c, 0x84, 0x93, 0xf4, 0x74, 0x77, + 0xeb, 0x8b, 0xf7, 0x1d, 0x53, 0xfb, 0x4f, 0xa4, + 0x63, 0x1d, 0x26, 0x61, 0x61, 0x13, 0x91, 0x69, + 0x97, 0x48, 0x8b, 0x6f, 0x14, 0x50, 0xa5, 0x7b, + 0x05, 0x15, 0xec, 0x1a, 0xcf, 0x1c, 0x97, 0x14, + 0x56, 0x4a, 0xc0, 0xa5, 0x87, 0x2b, 0x6a, 0x4a, + 0x81, 0xa5, 0xab, 0xc9, 0x3b, 0xd6, 0x5f, 0x49, + 0x9f, 0x72, 0xfe, 0xa0, 0xfd, 0xce, 0xa9, 0x05, + 0x93, 0x38, 0x71, 0xf0, 0x3f, 0x45, 0xb3, 0x2f, + 0x8c, 0xd1, 0x71, 0x24, 0xf9, 0xa9, 0x8e, 0x06, + 0x93, 0x5a, 0x33, 0x14, 0xb5, 0x6c, 0x1e, 0x39, + 0xc0, 0xc8, 0xec, 0xaf, 0x89, 0xf9, 0xad, 0xcd, + 0x4b, 0x0b, 0x3b, 0x20, 0x31, 0x90, 0x1e, 0x0e, + 0x30, 0xb4, 0xfe, 0xb9, 0x49, 0x82, 0x18, 0xeb, + 0x5d, 0x5a, 0xf2, 0x01, 0x94, 0x18, 0xf9, 0xda, + 0xb6, 0x7a, 0x5f, 0x58, 0xc8, 0xe1, 0x96, 0xb1, + 0x8c, 0x64, 0x34, 0xac, 0xee, 0xb2, 0xba, 0x27, + 0xaa, 0x16, 0xe6, 0x30, 0x54, 0x9e, 0xd4, 0x4f, + 0xb3, 0xe1, 0xd6, 0x3f, 0xb4, 0xfa, 0x21, 0x26, + 0x51, 0xb3, 0x5e, 0x6e, 0x06, 0x3a, 0x52, 0x25, + 0x9f, 0x0d, 0x9e, 0x48, 0xd9, 0x29, 0x53, 0x4e, + 0xd8, 0x48, 0x94, 0x67, 0xe6, 0xcc, 0xb7, 0x3a, + 0x63, 0xc9, 0x25, 0x92, 0x13, 0x34, 0xcd, 0xc4, + 0x8e, 0x6b, 0x79, 0x12, 0xfa, 0x9f, 0x23, 0xa4, + 0x51, 0x9e, 0x4c, 0x59, 0x9c, 0xa9, 0x8a, 0xcf, + 0xd1, 0xd1, 0xdf, 0xae, 0x2f, 0xdc, 0x75, 0x4f, + 0xed, 0x3e, 0x8c, 0x7f, 0xb2, 0x6c, 0x47, 0x9e, + 0x6c, 0x5a, 0x32, 0x14, 0x59, 0x4d, 0x9f, 0x0d, + 0xb3, 0xf9, 0x4e, 0xc3, 0xc7, 0xec, 0xb4, 0xcf, + 0xfd, 0xc6, 0xd9, 0x47, 0x06, 0x60, 0x37, 0x11, + 0xac, 0x58, 0xbb, 0x97, 0xb5, 0x76, 0x18, 0x51, + 0x1c, 0x99, 0xbe, 0x93, 0x3e, 0xe5, 0xd6, 0xb5, + 0xd2, 0x1b, 0x16, 0xb8, 0xcc, 0x65, 0xb5, 0xe6, + 0x32, 0x2e, 0x9f, 0x64, 0x75, 0xd1, 0xc7, 0x62, + 0x3c, 0x0b, 0x60, 0x2f, 0x1d, 0x97, 0x11, 0xe2, + 0x22, 0xcb, 0xc1, 0x91, 0xd8, 0x9d, 0x28, 0xf2, + 0x46, 0x48, 0xf3, 0x07, 0x9b, 0x98, 0x1f, 0x21, + 0x05, 0x89, 0x3b, 0x09, 0xb5, 0x69, 0x11, 0xc9, + 0x7b, 0x8c, 0xce, 0x49, 0x03, 0xf0, 0xc8, 0x21, + 0xb2, 0x8e, 0xfb, 0x88, 0x1f, 0x3c, 0x36, 0xd1, + 0x8c, 0xc2, 0xec, 0x1b, 0x3c, 0x1b, 0x18, 0xf1, + 0x3e, 0x2d, 0xc6, 0x6c, 0xd0, 0x5a, 0xc7, 0x0c, + 0x54, 0xcd, 0x73, 0x6b, 0x14, 0x9e, 0xd4, 0x4f, + 0xb3, 0xe1, 0xd6, 0x1f, 0xb4, 0xfe, 0x37, 0x47, + 0x7e, 0xb8, 0xbf, 0x71, 0x79, 0x69, 0x10, 0xa6, + 0xef, 0x07, 0x5b, 0xc1, 0xd6, 0xf0, 0x75, 0xbc, + 0x1d, 0x6f, 0x07, 0x5b, 0xc1, 0xd6, 0xf0, 0x75, + 0xbc, 0x1d, 0x6f, 0x07, 0x5b, 0xc1, 0xd6, 0xf0, + 0x75, 0xbc, 0x1d, 0x6f, 0x07, 0x5b, 0xc1, 0xd6, + 0xf0, 0x75, 0xbc, 0x1d, 0x6f, 0x07, 0x5b, 0xc1, + 0xd6, 0xf0, 0x75, 0xbc, 0x1d, 0x6f, 0x07, 0x47, + 0xbb, 0xd5, 0x22, 0x6b, 0xf1, 0xdb, 0xd5, 0x56, + 0xe5, 0x6a, 0x6b, 0x56, 0xa6, 0xb5, 0x6a, 0x6b, + 0x56, 0xa6, 0xb5, 0x6a, 0x6b, 0x56, 0xa6, 0xb5, + 0x6a, 0x6b, 0x56, 0xa6, 0xb5, 0x6a, 0x6b, 0x56, + 0xa6, 0xb5, 0x6a, 0x6b, 0x56, 0xa6, 0xb5, 0x6a, + 0x6b, 0x56, 0xa6, 0xb5, 0x6a, 0x6b, 0x56, 0xa6, + 0xb5, 0x6a, 0x6b, 0x56, 0xa6, 0xb5, 0x6a, 0x6b, + 0x53, 0x6b, 0x2b, 0x63, 0xcc, 0xb2, 0xe6, 0x5f, + 0x84, 0x9e, 0xd8, 0x5f, 0xb3, 0xe1, 0xd6, 0x1f, + 0xb4, 0xfe, 0x37, 0x47, 0xfe, 0xb8, 0xbf, 0x71, + 0xd5, 0x3f, 0xb4, 0xfa, 0x29, 0xd9, 0x87, 0x99, + 0x69, 0x97, 0x48, 0x8b, 0x6f, 0x14, 0x50, 0xa5, + 0x7b, 0x05, 0xaa, 0xc6, 0x63, 0xb9, 0x64, 0xf3, + 0x48, 0x73, 0x48, 0x9d, 0xc7, 0x9b, 0x24, 0xfc, + 0x53, 0x72, 0x56, 0x0b, 0x24, 0xe9, 0x6b, 0x65, + 0x60, 0xec, 0x66, 0x48, 0xc7, 0x6a, 0x83, 0xe9, + 0x33, 0xee, 0xfe, 0x4c, 0x9e, 0xd8, 0x5f, 0xb7, + 0xe1, 0xd6, 0x1f, 0xb4, 0xfe, 0x37, 0x47, 0xfe, + 0xb8, 0xbf, 0x71, 0xd5, 0x3f, 0xb4, 0xfa, 0x04, + 0x23, 0x8b, 0x39, 0x65, 0x36, 0x7c, 0x36, 0xcf, + 0xe5, 0x3b, 0x0f, 0x1f, 0xb3, 0x01, 0xfe, 0x8b, + 0x06, 0x96, 0x2c, 0x33, 0x34, 0xe1, 0x23, 0x9d, + 0xee, 0xf5, 0xbd, 0xd6, 0x5e, 0xb3, 0x1b, 0x63, + 0x13, 0x9a, 0xdb, 0x29, 0x30, 0x8b, 0xb1, 0xe5, + 0x37, 0xe9, 0x33, 0xee, 0xfe, 0x4c, 0x9e, 0xd8, + 0x5f, 0xb7, 0xe1, 0xd4, 0xd5, 0x25, 0x98, 0x7f, + 0x8f, 0x58, 0xaf, 0x1e, 0xb1, 0x5e, 0x3d, 0x62, + 0xbc, 0x7a, 0xc5, 0x78, 0xf5, 0x8a, 0xf1, 0xeb, + 0x15, 0xe3, 0xd6, 0x2b, 0xc7, 0xac, 0x57, 0x8f, + 0x58, 0xaf, 0x1e, 0xb1, 0x5e, 0x3d, 0x62, 0xbc, + 0x7a, 0xc5, 0x78, 0xf5, 0x8a, 0xf1, 0xeb, 0x15, + 0xe3, 0xd6, 0x2b, 0xc7, 0xac, 0x57, 0x8f, 0x58, + 0xaf, 0x1e, 0xb1, 0x5e, 0x3d, 0x62, 0xbc, 0x7a, + 0xc5, 0x78, 0xf5, 0x8a, 0xf1, 0xeb, 0x15, 0xd3, + 0x40, 0xce, 0x08, 0x05, 0x7b, 0x8b, 0xcb, 0xc2, + 0x41, 0x37, 0xca, 0x4d, 0x5e, 0x52, 0x6a, 0xf2, + 0x93, 0x57, 0x94, 0x9a, 0xbc, 0xa4, 0xd5, 0xe5, + 0x26, 0xaf, 0x29, 0x35, 0x79, 0x49, 0xa8, 0x7b, + 0x7b, 0x42, 0xa2, 0x6d, 0xc5, 0xb3, 0x88, 0x7d, + 0xcd, 0xa4, 0x73, 0xc7, 0x77, 0x69, 0x29, 0x7e, + 0x52, 0x6a, 0xf2, 0x93, 0x57, 0x94, 0x9a, 0xbc, + 0xa4, 0xd5, 0xe5, 0x26, 0xaf, 0x29, 0x35, 0x79, + 0x49, 0xab, 0xca, 0x4d, 0x5e, 0x52, 0x6a, 0x3d, + 0xd9, 0x7c, 0x9f, 0xc9, 0x7f, 0xb7, 0x17, 0xed, + 0xf8, 0x7f, 0x50, 0x0b, 0x9e, 0x1e, 0xa1, 0xd8, + 0x14, 0xb6, 0x05, 0x2d, 0x81, 0x4b, 0x60, 0x52, + 0xc8, 0x04, 0xc7, 0x1c, 0x01, 0x97, 0x28, 0x92, + 0xc3, 0x65, 0x04, 0x72, 0x3c, 0xd8, 0x82, 0xd8, + 0x14, 0xb6, 0x05, 0x2d, 0x81, 0x4b, 0x60, 0x52, + 0x14, 0xb9, 0xf3, 0xd0, 0xdb, 0x02, 0x96, 0xc0, + 0xa4, 0x1c, 0x76, 0x06, 0x85, 0x1c, 0x76, 0x12, + 0x55, 0x91, 0x52, 0x7c, 0x32, 0x4e, 0xf3, 0x47, + 0x18, 0xe7, 0x9b, 0x5e, 0x46, 0xc0, 0xa5, 0xb0, + 0x29, 0x7f, 0x4e, 0xe7, 0x92, 0x7a, 0xb2, 0xbd, + 0xc7, 0x54, 0xfe, 0xd3, 0xfc, 0x03, 0xc7, 0x04, + 0xb5, 0x36, 0x19, 0xff, 0x00, 0xd4, 0xaf, 0xfc, + 0x21, 0xff, 0x00, 0xc1, 0xbf, 0xe1, 0x33, 0xee, + 0xfe, 0x4b, 0xfd, 0xb8, 0xdf, 0x6f, 0xc3, 0xfa, + 0x89, 0xff, 0x00, 0xf4, 0x7f, 0x45, 0xb4, 0x95, + 0xcd, 0xc4, 0xb2, 0x03, 0x1d, 0x2b, 0x08, 0x96, + 0xe0, 0x0b, 0x28, 0xdc, 0x3d, 0x17, 0xd0, 0x27, + 0xff, 0x00, 0xc1, 0x7c, 0x3a, 0x68, 0x86, 0x8c, + 0x25, 0x84, 0x39, 0x02, 0x96, 0xee, 0xc4, 0x4a, + 0xfb, 0xc3, 0x07, 0x94, 0xaa, 0x5e, 0xa6, 0xfd, + 0xcf, 0xc3, 0xfa, 0x6d, 0xfa, 0xa2, 0xbf, 0x3f, + 0x50, 0x55, 0x16, 0x59, 0xfa, 0x0b, 0x05, 0xa0, + 0xb0, 0x5a, 0x0b, 0x05, 0xa0, 0xb0, 0x5a, 0x0b, + 0x05, 0xa0, 0xb0, 0x5a, 0x0b, 0x05, 0xa0, 0xb0, + 0x5a, 0x6b, 0x3c, 0xc2, 0xd0, 0x6e, 0x59, 0x2b, + 0xeb, 0xee, 0x24, 0x9d, 0x95, 0xd6, 0xf1, 0xad, + 0x05, 0x82, 0xd0, 0x58, 0x2d, 0x05, 0x82, 0xd0, + 0x58, 0x2d, 0x05, 0x82, 0xd0, 0x58, 0x2d, 0x05, + 0x82, 0xd0, 0x58, 0x2d, 0x05, 0x82, 0x39, 0xb9, + 0x63, 0xd3, 0x23, 0x74, 0x99, 0xe1, 0x4e, 0xb8, + 0x53, 0xae, 0x14, 0xeb, 0x85, 0x3a, 0xe1, 0x4e, + 0xb8, 0x53, 0xae, 0x14, 0xeb, 0x85, 0x3a, 0xe1, + 0x4e, 0xb8, 0x53, 0xae, 0x14, 0xeb, 0x85, 0x3a, + 0xe1, 0x4e, 0xb8, 0x53, 0xae, 0x14, 0xeb, 0x85, + 0x3a, 0xe1, 0x4e, 0xb8, 0x53, 0xae, 0x14, 0xeb, + 0x85, 0x3a, 0xe1, 0x4e, 0x9c, 0xcc, 0xb3, 0x29, + 0xfe, 0xdc, 0x6f, 0xb7, 0xe1, 0xd4, 0xbd, 0x19, + 0x25, 0xf5, 0x9f, 0xf6, 0xca, 0x75, 0xfd, 0xb2, + 0x9d, 0x7f, 0x6c, 0xa7, 0x5f, 0xdb, 0x29, 0xd4, + 0x9f, 0xd3, 0x72, 0xe5, 0x4e, 0xfe, 0x9b, 0x96, + 0xf6, 0x0f, 0xfd, 0x39, 0x34, 0x79, 0x67, 0xfe, + 0x9a, 0x9e, 0x4c, 0x9f, 0xda, 0xd2, 0x97, 0xf6, + 0xb4, 0xa5, 0xfd, 0xad, 0x29, 0x7f, 0x6b, 0x4a, + 0x50, 0xf4, 0x24, 0xf1, 0xf4, 0xef, 0xf6, 0xb4, + 0xa5, 0xfd, 0xad, 0x29, 0x7f, 0x6d, 0x8b, 0x63, + 0x5f, 0xfd, 0x3c, 0x36, 0x45, 0x2f, 0xf4, 0xdc, + 0xb9, 0xe4, 0x1b, 0xa0, 0x6c, 0x03, 0x5f, 0xdb, + 0x32, 0x32, 0xbf, 0xb6, 0x53, 0xaf, 0xed, 0x94, + 0xeb, 0xa6, 0x7a, 0x7d, 0xdd, 0x3a, 0x11, 0x5f, + 0x9f, 0xa9, 0x27, 0x92, 0x32, 0xf9, 0x73, 0x2e, + 0x5c, 0xcb, 0x97, 0x32, 0xe5, 0xcc, 0xb9, 0x73, + 0x21, 0xdc, 0x51, 0x52, 0xbc, 0x7b, 0x08, 0xdf, + 0x1b, 0x0e, 0x94, 0xb8, 0xb2, 0x5c, 0xf1, 0xb4, + 0x82, 0x1e, 0xee, 0x3d, 0x87, 0x6d, 0xd1, 0x1c, + 0xd1, 0xf9, 0x73, 0x2c, 0xca, 0x4e, 0x22, 0x92, + 0x52, 0x62, 0xc7, 0x2e, 0x65, 0xcb, 0x99, 0x72, + 0xe6, 0x5c, 0xb9, 0x97, 0x2e, 0x65, 0xcb, 0x99, + 0x19, 0xff, 0x00, 0x32, 0x31, 0xbe, 0xb7, 0x99, + 0x63, 0xd8, 0x93, 0x60, 0xf5, 0xb0, 0x7a, 0xd8, + 0x3d, 0x6c, 0x1e, 0xb6, 0x0f, 0x5b, 0x07, 0xad, + 0x83, 0xd6, 0xc1, 0xeb, 0x60, 0xf5, 0xb0, 0x7a, + 0xd8, 0x3d, 0x6c, 0x1e, 0xb6, 0x0f, 0x5b, 0x07, + 0xad, 0x83, 0xd6, 0xc1, 0xeb, 0x60, 0xf5, 0xb0, + 0x7a, 0xd8, 0x3d, 0x6c, 0x1e, 0xb6, 0x0f, 0x41, + 0x9d, 0xcd, 0x7f, 0xfa, 0x4f, 0xf6, 0xe3, 0x7d, + 0xbf, 0x0e, 0xb7, 0xbe, 0xb0, 0xac, 0xb7, 0xf2, + 0xfb, 0x95, 0x2d, 0xb7, 0x52, 0xc1, 0x63, 0x3f, + 0x52, 0x5f, 0x0a, 0xa6, 0xba, 0xea, 0x38, 0x30, + 0xc3, 0xba, 0xa6, 0x51, 0xfc, 0xbe, 0xe5, 0x74, + 0xa7, 0x52, 0xd8, 0x9c, 0x66, 0xc0, 0xa5, 0xb0, + 0x29, 0x4b, 0x0c, 0x42, 0xb2, 0xb2, 0x36, 0x58, + 0x36, 0x11, 0x25, 0x30, 0x68, 0xe0, 0x2d, 0xf4, + 0x7b, 0x02, 0x96, 0xc0, 0xa5, 0xd4, 0x77, 0x76, + 0xd1, 0x5a, 0x4d, 0x65, 0xd4, 0xd0, 0x26, 0xde, + 0xf5, 0x13, 0xf2, 0x25, 0x9f, 0x52, 0x9a, 0xc3, + 0x6e, 0xfa, 0x8a, 0xb9, 0x0a, 0x6f, 0x54, 0x1b, + 0x83, 0x7a, 0x82, 0xfa, 0xbe, 0x4e, 0x83, 0xb7, + 0x32, 0xd6, 0x12, 0x7f, 0x3f, 0x53, 0xfb, 0xcf, + 0xa6, 0x9f, 0xdf, 0x50, 0xfc, 0xfe, 0x41, 0xff, + 0x00, 0xc1, 0xb5, 0xac, 0x64, 0x23, 0x57, 0xc5, + 0x98, 0x2c, 0x6b, 0x3f, 0x2f, 0xab, 0x23, 0x08, + 0x26, 0x70, 0x38, 0x30, 0x49, 0x86, 0x44, 0x4b, + 0x71, 0x8a, 0xff, 0x00, 0xa8, 0xcf, 0xc8, 0x27, + 0xba, 0x3c, 0xaf, 0x91, 0xdc, 0xb5, 0xcb, 0x5d, + 0x3d, 0xda, 0x30, 0xfb, 0x12, 0x71, 0x88, 0xb5, + 0x79, 0x6d, 0x8e, 0x2b, 0xd8, 0xd8, 0x6c, 0x44, + 0x86, 0x31, 0xcb, 0xaf, 0xc0, 0xf0, 0xbe, 0x83, + 0xfe, 0xeb, 0x01, 0xb0, 0x18, 0xcc, 0x8e, 0x29, + 0xba, 0x60, 0xa8, 0xa2, 0x83, 0xa7, 0x34, 0xb9, + 0xf5, 0x06, 0x17, 0xcc, 0x7e, 0xa1, 0x1f, 0xe5, + 0x25, 0x78, 0xfc, 0x13, 0x44, 0x03, 0x13, 0x8f, + 0x15, 0x7f, 0xa6, 0x32, 0xdf, 0xc5, 0x23, 0x96, + 0xb9, 0x6a, 0x9c, 0x9f, 0x55, 0xac, 0xbf, 0x95, + 0xff, 0x00, 0x80, 0x6f, 0xf5, 0xf0, 0xfe, 0xa3, + 0x7e, 0xf5, 0x7c, 0xf6, 0x9d, 0x45, 0x52, 0x23, + 0x6e, 0x81, 0x8c, 0xbe, 0x78, 0x57, 0x98, 0x2b, + 0xca, 0xdd, 0xf3, 0xf5, 0x74, 0x4f, 0xed, 0xbe, + 0x05, 0x45, 0x6a, 0xe8, 0x68, 0xd8, 0xe8, 0x8a, + 0xe9, 0xe2, 0xb0, 0x10, 0x56, 0x91, 0xe0, 0x3a, + 0xcf, 0x85, 0xe9, 0x12, 0x89, 0xd4, 0xd3, 0xc2, + 0x2c, 0xb5, 0xbf, 0xf8, 0xc6, 0x56, 0x7f, 0xe8, + 0x84, 0x66, 0xb9, 0xfd, 0x34, 0x2b, 0xb1, 0xe6, + 0xcb, 0xfa, 0x67, 0xf8, 0x49, 0xfc, 0xf6, 0xd5, + 0xaf, 0xb4, 0x66, 0x82, 0xc1, 0x68, 0x2c, 0x16, + 0x82, 0xc1, 0x68, 0x2c, 0x16, 0x82, 0xc1, 0x0f, + 0x51, 0x68, 0x2c, 0xb2, 0x07, 0x73, 0x23, 0xd9, + 0x5d, 0x6f, 0x1a, 0x92, 0x9a, 0xce, 0x65, 0x15, + 0x75, 0xa3, 0x4d, 0xe0, 0xdb, 0x45, 0x1c, 0x82, + 0xdc, 0xcb, 0x10, 0xd5, 0xb6, 0xc2, 0x2d, 0x65, + 0xb2, 0x22, 0xaa, 0xc2, 0x58, 0x74, 0x16, 0x0b, + 0x41, 0x60, 0xb4, 0x16, 0x0b, 0x41, 0x60, 0xb4, + 0x16, 0x08, 0x5e, 0x9c, 0x29, 0xf2, 0x13, 0x2f, + 0x7e, 0x71, 0x3d, 0xd1, 0xc2, 0xfc, 0xcd, 0xe2, + 0x2e, 0x22, 0xae, 0x00, 0x79, 0x66, 0x27, 0xfe, + 0x8a, 0x82, 0x1f, 0x8c, 0xd0, 0x80, 0xec, 0x30, + 0x69, 0x9d, 0x0e, 0x31, 0x6d, 0x2c, 0x8f, 0x89, + 0xf2, 0x45, 0xbc, 0x21, 0x8d, 0x75, 0x08, 0x32, + 0x47, 0x10, 0xa6, 0xce, 0xc9, 0x46, 0xff, 0x00, + 0xd6, 0xdb, 0xf6, 0xe1, 0x3c, 0x0b, 0x1c, 0x41, + 0x61, 0x1b, 0xa4, 0x83, 0x62, 0x11, 0x0e, 0x75, + 0x60, 0x52, 0x4d, 0xeb, 0xb8, 0x82, 0x09, 0x2c, + 0x38, 0x8b, 0x88, 0xaa, 0x06, 0xf4, 0xda, 0x4b, + 0xf9, 0x5f, 0xf8, 0x07, 0xff, 0x00, 0x5f, 0x0e, + 0xa8, 0xe9, 0x4f, 0x21, 0x7f, 0xf6, 0xda, 0xc5, + 0x43, 0xd1, 0xf7, 0xb0, 0x58, 0x8d, 0xd0, 0xb7, + 0x21, 0xc7, 0x1f, 0x40, 0x5b, 0x45, 0x03, 0x3a, + 0x5b, 0xa8, 0x63, 0x1f, 0xfb, 0x6d, 0x62, 0xba, + 0x73, 0xa2, 0x4b, 0xa9, 0x3b, 0xfb, 0x67, 0x32, + 0xfe, 0xda, 0x4c, 0xbf, 0xb6, 0x93, 0x2f, 0xed, + 0xa4, 0xcb, 0xfb, 0x69, 0x32, 0xfe, 0xda, 0x4c, + 0xbf, 0xb6, 0x93, 0x2f, 0xed, 0x9c, 0xca, 0xeb, + 0xa4, 0xac, 0x0a, 0xb5, 0x33, 0xa3, 0xaf, 0x0f, + 0x8a, 0x4e, 0x89, 0xba, 0x95, 0x8c, 0xe9, 0x2b, + 0xe6, 0x1d, 0x3f, 0x47, 0xde, 0x93, 0x34, 0x1d, + 0x05, 0x6e, 0x31, 0x7f, 0xdb, 0x6b, 0x15, 0xd3, + 0xd4, 0x4c, 0xe9, 0xea, 0xf2, 0x7f, 0x3b, 0x02, + 0x9a, 0x4c, 0x70, 0x0a, 0x5c, 0x02, 0x97, 0x00, + 0xa5, 0xc0, 0x29, 0x70, 0x0a, 0x5c, 0x02, 0x97, + 0x00, 0xa5, 0xc0, 0x29, 0x70, 0x0a, 0x5c, 0x02, + 0x97, 0x00, 0xa5, 0xc0, 0x29, 0x70, 0x0a, 0x5c, + 0x02, 0x97, 0x00, 0xa5, 0xc0, 0x29, 0x70, 0x0a, + 0x5c, 0x02, 0x97, 0x00, 0xa5, 0xc0, 0x29, 0x66, + 0xbc, 0x9c, 0xa7, 0xc6, 0xe8, 0xdd, 0x1b, 0xfb, + 0x6f, 0x36, 0xb7, 0xd5, 0x27, 0x0b, 0x2b, 0x85, + 0x95, 0xc2, 0xca, 0xe1, 0x65, 0x15, 0xdd, 0x2d, + 0x70, 0xb2, 0xb8, 0x59, 0x5c, 0x2c, 0xae, 0x16, + 0x57, 0x0b, 0x2b, 0x85, 0x95, 0xc2, 0xca, 0xe1, + 0x65, 0x70, 0xb2, 0xb8, 0x59, 0x5c, 0x2c, 0xae, + 0x16, 0x57, 0x0b, 0x2b, 0x85, 0x95, 0xc2, 0xca, + 0xe0, 0xe5, 0x06, 0x0f, 0x19, 0xd9, 0xcf, 0xab, + 0x2f, 0xfc, 0x03, 0xff, 0x00, 0xaf, 0xe5, 0x67, + 0xd3, 0x1c, 0xb2, 0xd8, 0xba, 0x67, 0xf2, 0xd7, + 0x2d, 0x72, 0xd7, 0x2d, 0x72, 0xd7, 0x2d, 0x72, + 0xd7, 0x2d, 0x72, 0xd7, 0x2d, 0x72, 0xd7, 0x2d, + 0x72, 0xd7, 0x2d, 0x72, 0xd7, 0x2d, 0x72, 0xd7, + 0x2d, 0x72, 0xd7, 0x2d, 0x72, 0xd0, 0x65, 0xf3, + 0xa2, 0x57, 0xe5, 0x4c, 0x2a, 0xc5, 0xf5, 0x82, + 0x96, 0xde, 0xd4, 0x7c, 0xef, 0xec, 0x13, 0x6d, + 0xad, 0x9d, 0x16, 0x6d, 0xed, 0x71, 0x16, 0xf2, + 0xcb, 0xd1, 0xbc, 0xb2, 0xf4, 0x41, 0x6b, 0x6e, + 0x4a, 0x96, 0xc6, 0xe6, 0x05, 0xbf, 0xb0, 0x5b, + 0xfb, 0x05, 0x8b, 0xeb, 0x1c, 0xe5, 0xa7, 0x5d, + 0xbd, 0x9b, 0xab, 0x34, 0xdb, 0x6b, 0x67, 0xbd, + 0xb7, 0x16, 0xaf, 0x97, 0x79, 0x65, 0xe9, 0x96, + 0xd6, 0xd8, 0x74, 0xfb, 0x5b, 0x78, 0xe3, 0x96, + 0xc2, 0xea, 0x06, 0x6f, 0xac, 0x32, 0x81, 0x99, + 0xf3, 0xd2, 0x27, 0x7e, 0x11, 0xff, 0x00, 0xd7, + 0xf2, 0x8f, 0x77, 0xa4, 0x3e, 0x56, 0x55, 0x04, + 0xf9, 0x90, 0x19, 0x5a, 0xf3, 0xad, 0x60, 0x03, + 0x0f, 0x0e, 0x50, 0x81, 0x18, 0xa2, 0x43, 0x88, + 0xeb, 0xd6, 0x54, 0xc7, 0x21, 0x79, 0x04, 0x1c, + 0x07, 0x73, 0x0e, 0xb0, 0xeb, 0xf8, 0x79, 0xa4, + 0x75, 0x04, 0xb1, 0x94, 0x64, 0xd5, 0xd0, 0xfa, + 0x67, 0xad, 0x17, 0x0a, 0xbe, 0xbc, 0x63, 0xa3, + 0x86, 0xb0, 0x5c, 0x3a, 0x2a, 0xc8, 0xfd, 0x3a, + 0x88, 0xe2, 0x93, 0x15, 0x21, 0x38, 0x81, 0x6a, + 0x19, 0xd8, 0xc5, 0x74, 0x30, 0x08, 0x18, 0x23, + 0x0b, 0x6b, 0x29, 0x4d, 0xee, 0xf4, 0xd4, 0xdd, + 0xc2, 0xd7, 0x53, 0xfd, 0xb5, 0x9e, 0xad, 0x8b, + 0x9b, 0x1c, 0xb1, 0x59, 0x8d, 0x18, 0x92, 0x55, + 0xca, 0xe7, 0xe5, 0x93, 0x4b, 0xc3, 0x8e, 0x2c, + 0x03, 0x5e, 0x20, 0xb0, 0x8d, 0x30, 0x4f, 0xce, + 0x0d, 0x73, 0x7b, 0xd2, 0x95, 0x10, 0x70, 0x67, + 0x55, 0x0c, 0x2f, 0x64, 0x10, 0x0d, 0x2e, 0x31, + 0xff, 0x00, 0xab, 0x04, 0x8d, 0x35, 0xd1, 0x7f, + 0xe2, 0x50, 0x78, 0xf9, 0x5a, 0x57, 0xff, 0x00, + 0xd4, 0xda, 0xb9, 0xe5, 0x20, 0xc7, 0x1e, 0x53, + 0xde, 0x7b, 0xd8, 0x29, 0xca, 0xb3, 0xf4, 0x29, + 0xdf, 0x84, 0x7f, 0xf5, 0xfc, 0xa3, 0x1b, 0xeb, + 0x17, 0x88, 0x83, 0x10, 0x19, 0x46, 0x3c, 0x86, + 0xe7, 0x1d, 0x41, 0x88, 0xdc, 0x56, 0x4d, 0x8a, + 0x11, 0xf0, 0x50, 0xf0, 0xdb, 0x43, 0x3c, 0x50, + 0x58, 0x65, 0xd1, 0xea, 0xae, 0xfb, 0x66, 0x99, + 0xb4, 0x85, 0x86, 0x8c, 0x58, 0xf1, 0x4d, 0x92, + 0xa0, 0x78, 0xf8, 0x9e, 0x1e, 0x6c, 0x16, 0x63, + 0xc5, 0x2b, 0x62, 0x18, 0x83, 0x5a, 0x4b, 0x3d, + 0x3d, 0xe8, 0xbb, 0x51, 0x91, 0x03, 0x49, 0xc1, + 0x91, 0x4e, 0x3c, 0x92, 0x47, 0x25, 0x53, 0x0c, + 0x1f, 0x07, 0xca, 0x13, 0x5b, 0x27, 0x4f, 0xc1, + 0xdb, 0x25, 0x5d, 0x55, 0xca, 0x7c, 0x70, 0xd0, + 0x98, 0x3c, 0xb3, 0x56, 0x1b, 0x23, 0x73, 0xd3, + 0xc5, 0xe7, 0x11, 0x80, 0x74, 0x51, 0x4d, 0x5c, + 0x49, 0x11, 0x8d, 0x54, 0x58, 0xd1, 0x30, 0x3b, + 0x06, 0x48, 0xca, 0x12, 0xa3, 0x9b, 0x50, 0x6e, + 0x33, 0x35, 0x59, 0xb3, 0xae, 0x11, 0xae, 0x7e, + 0xac, 0xdf, 0x44, 0x94, 0x85, 0xcb, 0x10, 0xf5, + 0x26, 0x8d, 0x0e, 0x2b, 0xcf, 0xc3, 0x63, 0xaf, + 0x3e, 0x26, 0xea, 0x4e, 0xc4, 0xd2, 0xd7, 0x9a, + 0xf6, 0x4c, 0x09, 0xd2, 0xb0, 0x9a, 0x42, 0xcb, + 0x23, 0xc7, 0x09, 0x43, 0x88, 0xf0, 0xa9, 0xd3, + 0xbf, 0x0c, 0x1f, 0xeb, 0xf9, 0x5e, 0xb6, 0xe2, + 0x77, 0xd4, 0x48, 0xdc, 0xea, 0x66, 0x50, 0x80, + 0x48, 0xf2, 0x49, 0x5a, 0x44, 0xaf, 0xd4, 0xcc, + 0xb5, 0x33, 0x2d, 0x4c, 0xcb, 0x53, 0x32, 0xd4, + 0xcc, 0xb5, 0x33, 0x2d, 0x4c, 0xcb, 0x53, 0x32, + 0xd4, 0xcc, 0xb5, 0x33, 0x28, 0xe2, 0x3e, 0x28, + 0xb5, 0x33, 0x2d, 0x4c, 0xcb, 0x53, 0x32, 0xd4, + 0xcc, 0xb5, 0x33, 0x2d, 0x4c, 0xcb, 0x53, 0x32, + 0x60, 0xf8, 0xae, 0x89, 0x75, 0x47, 0xdb, 0xfe, + 0x17, 0x82, 0x2c, 0x18, 0x8c, 0x01, 0xfb, 0x06, + 0x02, 0xe0, 0xb1, 0xfe, 0x1a, 0xcf, 0xd0, 0xa7, + 0x7e, 0x18, 0x3f, 0x96, 0x47, 0xe6, 0xbf, 0x95, + 0xf1, 0x05, 0xcb, 0x99, 0x72, 0xe6, 0x5c, 0xb9, + 0x97, 0x2e, 0x65, 0xcb, 0x99, 0x30, 0x89, 0xde, + 0xe3, 0xbb, 0xa1, 0xcb, 0x00, 0xb3, 0xce, 0x54, + 0x31, 0x4e, 0xf6, 0x63, 0x26, 0x65, 0xb2, 0xca, + 0x54, 0x0f, 0x8a, 0x09, 0x9e, 0xde, 0xd3, 0xa4, + 0x4e, 0x80, 0x9c, 0x0a, 0x7b, 0x26, 0x0d, 0xdc, + 0xb9, 0x97, 0x2e, 0x65, 0xcb, 0x99, 0x72, 0xe6, + 0x5c, 0xb9, 0x97, 0x2a, 0x6c, 0xa8, 0xff, 0x00, + 0x5c, 0xba, 0x9f, 0xed, 0xff, 0x00, 0x09, 0x11, + 0x1c, 0xf8, 0xde, 0x53, 0x45, 0x06, 0xc2, 0x47, + 0x4a, 0x27, 0xf8, 0x6b, 0x3f, 0x42, 0x9d, 0xf8, + 0xa0, 0xfe, 0x59, 0x1f, 0x9b, 0xa8, 0xfd, 0x9f, + 0xd2, 0xc6, 0x3a, 0x47, 0xd8, 0x8b, 0x91, 0x9f, + 0x14, 0x8d, 0xc5, 0x44, 0x99, 0xc3, 0x6d, 0x05, + 0x93, 0xe4, 0xeb, 0x5f, 0xfc, 0x71, 0x9c, 0x4f, + 0xce, 0xcf, 0xa6, 0x02, 0xe0, 0xf9, 0x30, 0x97, + 0xe7, 0xe7, 0x53, 0xf5, 0x47, 0xfa, 0xe5, 0x67, + 0x4d, 0xb3, 0x87, 0xc4, 0xd7, 0x89, 0xaf, 0x13, + 0x5e, 0x26, 0xbc, 0x4d, 0x78, 0x9a, 0xf1, 0x35, + 0xe2, 0x6b, 0xc4, 0xd7, 0x89, 0xaf, 0x13, 0x5e, + 0x26, 0xbc, 0x4d, 0x78, 0x9a, 0xf1, 0x35, 0xe2, + 0x6b, 0xc4, 0xd7, 0x89, 0xaf, 0x13, 0x5e, 0x26, + 0xbc, 0x4d, 0x34, 0x2d, 0x7d, 0x5a, 0x77, 0xe2, + 0x87, 0xf9, 0x73, 0xfe, 0x69, 0xa1, 0x88, 0xe1, + 0x3c, 0x67, 0x2b, 0xc6, 0x5c, 0xbc, 0x65, 0xcb, + 0xc6, 0x5c, 0xbc, 0x65, 0xcb, 0xc6, 0x5c, 0xbc, + 0x65, 0xcb, 0xc6, 0x5c, 0xbc, 0x65, 0xcb, 0xc6, + 0x5c, 0xbc, 0x65, 0xca, 0x4a, 0x09, 0x25, 0x8b, + 0xc6, 0x5c, 0xbc, 0x65, 0xca, 0x5a, 0x09, 0x25, + 0x67, 0x8c, 0xb9, 0x78, 0xcb, 0x97, 0x8c, 0xb9, + 0x78, 0xcb, 0x97, 0x8c, 0xb9, 0x47, 0xd3, 0x6c, + 0x6b, 0xa6, 0x93, 0x0f, 0xca, 0xea, 0x7f, 0xb7, + 0xfc, 0x02, 0xc3, 0xc9, 0x26, 0x11, 0x1c, 0x41, + 0x53, 0x89, 0x03, 0x61, 0x9e, 0xa6, 0x26, 0xcd, + 0xfe, 0x1a, 0xcf, 0xd0, 0xa7, 0x7e, 0x28, 0x7f, + 0x96, 0xe8, 0xf3, 0x29, 0x2e, 0x24, 0x61, 0xf3, + 0xb1, 0x89, 0x6c, 0x62, 0x5b, 0x18, 0x96, 0xc6, + 0x25, 0xb1, 0x89, 0x6c, 0x62, 0x5b, 0x18, 0x96, + 0xc6, 0x25, 0xb1, 0x89, 0x6c, 0x62, 0x5b, 0x18, + 0x96, 0xc6, 0x25, 0xb1, 0x89, 0x6c, 0x62, 0x5b, + 0x18, 0x96, 0xc6, 0x25, 0xb1, 0x89, 0x6c, 0x62, + 0x5b, 0x18, 0x96, 0xc6, 0x25, 0xb1, 0x89, 0x3d, + 0x91, 0xcd, 0x0a, 0xea, 0x7f, 0xb7, 0xfc, 0x15, + 0x7f, 0xb3, 0x80, 0x39, 0x83, 0x36, 0x7a, 0xc9, + 0x85, 0x86, 0x71, 0x25, 0x1a, 0xeb, 0xfc, 0x35, + 0x9f, 0xa1, 0x4e, 0xfc, 0x70, 0xff, 0x00, 0x2d, + 0xb9, 0xf4, 0xcd, 0xcb, 0x5c, 0xb5, 0xcb, 0x5c, + 0xb5, 0xcb, 0x5c, 0xb5, 0xcb, 0x5c, 0xb5, 0x00, + 0x51, 0x3c, 0x1b, 0x08, 0x64, 0xaf, 0x98, 0x01, + 0xdf, 0x35, 0x84, 0xf9, 0x92, 0x15, 0xff, 0x00, + 0x7f, 0x79, 0x8f, 0x96, 0x46, 0x49, 0x33, 0xe1, + 0x7f, 0x2d, 0x72, 0xd7, 0x2d, 0x72, 0xd7, 0x2d, + 0x72, 0xd7, 0x2d, 0x51, 0x4f, 0xdd, 0x91, 0x59, + 0x84, 0x11, 0x50, 0xe9, 0xea, 0x16, 0x9e, 0xa1, + 0x69, 0xea, 0x16, 0x9e, 0xa1, 0x69, 0xea, 0x16, + 0x9e, 0xa1, 0x69, 0xea, 0x16, 0x9e, 0xa1, 0x69, + 0xea, 0x16, 0x9e, 0xa1, 0x69, 0xea, 0x16, 0x9e, + 0xa1, 0x69, 0xea, 0x16, 0x9e, 0xa1, 0x69, 0xea, + 0x16, 0x9e, 0xa1, 0x69, 0xea, 0x16, 0x9e, 0xa1, + 0x69, 0xea, 0x16, 0x9e, 0xa1, 0x69, 0xea, 0x13, + 0x60, 0x80, 0x6a, 0xb5, 0x9f, 0xc7, 0x0f, 0xf2, + 0xff, 0x00, 0xdb, 0xfb, 0x0e, 0x5d, 0x87, 0x2e, + 0xc3, 0x97, 0x61, 0xcb, 0xb0, 0xe5, 0xd8, 0x72, + 0xec, 0x39, 0x76, 0x1c, 0x8b, 0x1d, 0xef, 0xe9, + 0xb1, 0x20, 0xed, 0x91, 0x5c, 0x43, 0x25, 0x9f, + 0x2e, 0x20, 0x8a, 0xae, 0xcb, 0xb3, 0xd5, 0xd8, + 0xc9, 0x03, 0xd5, 0x75, 0x2c, 0x59, 0x75, 0xdf, + 0x61, 0xcb, 0xb0, 0xe5, 0xd8, 0x72, 0xec, 0x39, + 0x76, 0x1c, 0xbb, 0x0e, 0x5d, 0x87, 0x2e, 0x99, + 0x8f, 0x2c, 0x21, 0x75, 0x3f, 0xdb, 0xf4, 0x80, + 0x2b, 0x4a, 0x7c, 0xb0, 0x45, 0x32, 0x8a, 0xb0, + 0x89, 0x99, 0x0d, 0x53, 0xdc, 0xc8, 0xc0, 0x9e, + 0x48, 0x4e, 0x0b, 0x23, 0x4c, 0x34, 0x40, 0xc8, + 0x1e, 0x40, 0x7c, 0xa9, 0xf5, 0x65, 0x46, 0x9f, + 0x5a, 0x43, 0x25, 0x9a, 0x17, 0x40, 0xff, 0x00, + 0xa6, 0xb3, 0xf4, 0x2b, 0x3f, 0x8e, 0x1f, 0xe5, + 0xc7, 0x8f, 0x51, 0x59, 0x0b, 0xd3, 0x9e, 0x22, + 0xe2, 0x2e, 0x22, 0xe2, 0x2e, 0x22, 0xe2, 0x2e, + 0x22, 0x1c, 0xc2, 0xc5, 0x85, 0xd8, 0x95, 0xf3, + 0xb8, 0xc3, 0x1f, 0x24, 0xf3, 0x12, 0x4c, 0x4d, + 0x34, 0xc6, 0xe2, 0xbd, 0xcd, 0x84, 0x6b, 0x0c, + 0x73, 0x0c, 0xe2, 0x2e, 0x22, 0xe2, 0x2e, 0x22, + 0xe2, 0x2e, 0x22, 0xe2, 0x2a, 0xb1, 0xfb, 0x0d, + 0x5d, 0x51, 0xfe, 0xbe, 0x90, 0x31, 0xf3, 0x99, + 0xe5, 0x7c, 0x89, 0xf5, 0xe3, 0xbc, 0x2b, 0xa0, + 0x64, 0x8e, 0xc3, 0x67, 0x82, 0xf6, 0x78, 0x8c, + 0x78, 0xcf, 0x6e, 0x00, 0xef, 0x33, 0x80, 0x21, + 0xb0, 0xc2, 0x7c, 0x72, 0xb2, 0x02, 0x9d, 0x9f, + 0x9e, 0x7e, 0x9a, 0xcf, 0xd0, 0xa7, 0x7e, 0x38, + 0x7f, 0x97, 0x37, 0xfc, 0x4d, 0x6b, 0x71, 0x18, + 0x84, 0x79, 0x08, 0x8b, 0xc8, 0x44, 0x5e, 0x42, + 0x22, 0xf2, 0x11, 0x17, 0x90, 0x88, 0xbc, 0x84, + 0x45, 0xe4, 0x22, 0x2f, 0x21, 0x11, 0x79, 0x08, + 0x8b, 0xc8, 0x44, 0x5e, 0x42, 0x22, 0xf2, 0x11, + 0x17, 0x90, 0x88, 0xbc, 0x84, 0x45, 0xe4, 0x22, + 0x2f, 0x21, 0x11, 0x79, 0x08, 0x8b, 0xc8, 0x44, + 0x5e, 0x42, 0x22, 0xf2, 0x11, 0x17, 0x91, 0x0b, + 0x84, 0xc3, 0x32, 0x75, 0x5a, 0xba, 0x68, 0x32, + 0xb7, 0x8f, 0x50, 0xb8, 0xf5, 0x0b, 0x8f, 0x50, + 0xb8, 0xf5, 0x0b, 0x8f, 0x50, 0xb8, 0xf5, 0x0a, + 0x0d, 0x60, 0xd2, 0x71, 0xea, 0x17, 0x1e, 0xa1, + 0x71, 0xea, 0x17, 0x1e, 0xa1, 0x71, 0xea, 0x17, + 0x1e, 0xa1, 0x71, 0xea, 0x17, 0x1e, 0xa1, 0x71, + 0xea, 0x17, 0x1e, 0xa1, 0x71, 0xea, 0x17, 0x1e, + 0xa1, 0x71, 0xea, 0x17, 0x1e, 0xa1, 0x0b, 0xc7, + 0xd3, 0x27, 0x7e, 0x28, 0x3f, 0x96, 0x47, 0xe6, + 0xea, 0x7f, 0x79, 0xf4, 0x53, 0x33, 0x2f, 0x74, + 0xe1, 0x38, 0x88, 0xb8, 0x0c, 0xcc, 0xaf, 0xad, + 0xe2, 0x42, 0x38, 0xf1, 0x3e, 0xbd, 0xf5, 0x0d, + 0x79, 0x38, 0xab, 0x6b, 0xd1, 0x43, 0x36, 0x1c, + 0x36, 0x6f, 0x4d, 0x59, 0x6e, 0xc9, 0x4f, 0x9c, + 0x68, 0x4f, 0x3b, 0xba, 0xe2, 0xe2, 0xfa, 0x6b, + 0x7f, 0x46, 0xba, 0x97, 0xee, 0xf8, 0xd5, 0x48, + 0xdc, 0xc8, 0xca, 0xf6, 0xcd, 0x15, 0x63, 0x1b, + 0x2c, 0xf8, 0x01, 0x93, 0x08, 0x4d, 0x73, 0x26, + 0xc1, 0x55, 0xa3, 0xc6, 0x54, 0x60, 0x43, 0x28, + 0xa1, 0x57, 0x47, 0x1c, 0xd9, 0xab, 0xc7, 0xa4, + 0x9a, 0xc6, 0x43, 0x15, 0x59, 0x3f, 0x28, 0xda, + 0x2f, 0x34, 0x39, 0xaa, 0x9a, 0xc6, 0x93, 0x5c, + 0xd8, 0x5b, 0x60, 0x2b, 0x42, 0x2b, 0xe3, 0x4b, + 0xfa, 0x34, 0xef, 0xc5, 0x07, 0xf2, 0xc8, 0xfc, + 0xdd, 0x4d, 0x1b, 0xbb, 0xbf, 0x40, 0x84, 0xe0, + 0x76, 0x8d, 0x6a, 0xd8, 0x96, 0xd1, 0xbc, 0xa7, + 0xd9, 0x41, 0x81, 0x36, 0x39, 0x9c, 0x77, 0x5a, + 0xc5, 0x93, 0x02, 0xb4, 0xc0, 0x91, 0x9a, 0x66, + 0x08, 0x94, 0xc2, 0x47, 0x74, 0x0d, 0xb1, 0x63, + 0x25, 0x6d, 0xc4, 0xd9, 0x8f, 0x06, 0x07, 0x03, + 0xbe, 0x91, 0x62, 0xc8, 0xd5, 0x2b, 0xa9, 0x63, + 0xce, 0x59, 0xf1, 0x16, 0x71, 0x58, 0x13, 0x2c, + 0x1f, 0x0b, 0x44, 0x9f, 0x8c, 0x53, 0x2d, 0xe2, + 0x8c, 0xa7, 0x59, 0x0e, 0xf6, 0xce, 0x78, 0xa4, + 0xc9, 0x83, 0xa2, 0x6a, 0x6d, 0x98, 0xd9, 0x97, + 0x65, 0x16, 0x33, 0x62, 0xc6, 0x42, 0x20, 0x84, + 0x34, 0x75, 0x11, 0xf1, 0xb2, 0xaf, 0x36, 0x2c, + 0xf5, 0x58, 0x5a, 0xe0, 0xb6, 0x9d, 0x3e, 0x09, + 0x37, 0xe3, 0x59, 0x1b, 0xa0, 0xa5, 0x4e, 0xfc, + 0x50, 0x7f, 0xaf, 0xe5, 0x11, 0xf9, 0xb0, 0xfc, + 0x66, 0x2d, 0x6d, 0x6a, 0xd6, 0x56, 0xad, 0x65, + 0x6a, 0xd6, 0x56, 0xad, 0x65, 0x6a, 0xd6, 0x56, + 0xad, 0x65, 0x6a, 0xd6, 0x56, 0xad, 0x65, 0x6a, + 0xd6, 0x56, 0xad, 0x65, 0x6a, 0xd6, 0x56, 0xad, + 0x65, 0x6a, 0xd6, 0x56, 0xad, 0x65, 0x6a, 0xd6, + 0x56, 0xad, 0x65, 0x6a, 0xd6, 0x56, 0xad, 0x65, + 0x6a, 0xd6, 0x56, 0xa8, 0x84, 0x00, 0x77, 0x49, + 0x23, 0xa5, 0x7a, 0x6b, 0xdb, 0x98, 0xb3, 0x4b, + 0x5b, 0x9c, 0xe9, 0x2b, 0x56, 0x92, 0xb5, 0x69, + 0x2b, 0x56, 0x92, 0xb5, 0x69, 0x2b, 0x56, 0x92, + 0xb5, 0x69, 0x2b, 0x56, 0x92, 0xb5, 0x69, 0x2b, + 0x56, 0x92, 0xb5, 0x69, 0x2b, 0x56, 0x92, 0xb5, + 0x69, 0x2b, 0x56, 0x92, 0xb5, 0x69, 0x2b, 0x56, + 0x92, 0xb5, 0x69, 0x2b, 0x56, 0x92, 0xb5, 0x69, + 0x2b, 0x54, 0x75, 0x55, 0xb0, 0xba, 0x59, 0x73, + 0x33, 0xd3, 0xbf, 0x14, 0x1f, 0xeb, 0xe1, 0x21, + 0x78, 0x6a, 0xe6, 0x39, 0x73, 0x1c, 0xb9, 0x8e, + 0x5c, 0xc7, 0x2e, 0x63, 0x97, 0x31, 0xcb, 0x98, + 0xe5, 0xcc, 0x72, 0xe6, 0x39, 0x73, 0x1c, 0xb9, + 0x8e, 0x5c, 0xc7, 0x2e, 0x63, 0x97, 0x31, 0xcb, + 0x98, 0xe5, 0xcc, 0x72, 0xe6, 0x39, 0x73, 0x1c, + 0xb9, 0x8e, 0x5c, 0xc7, 0x2e, 0x63, 0x97, 0x31, + 0xcb, 0x98, 0xe4, 0xf7, 0x7a, 0xdd, 0xff, 0x00, + 0xd0, 0x77, 0xe1, 0x1f, 0xfd, 0x23, 0x24, 0xf9, + 0x2f, 0x4c, 0x43, 0x37, 0x98, 0x32, 0xe6, 0x8a, + 0xb9, 0xa2, 0xae, 0x68, 0xab, 0x9a, 0x2a, 0xe6, + 0x8a, 0xb9, 0xa2, 0xae, 0x68, 0xab, 0x9a, 0x2a, + 0xe6, 0x8a, 0xb9, 0xa2, 0xae, 0x68, 0xab, 0x9a, + 0x2a, 0xe6, 0x8a, 0xb9, 0xa2, 0xae, 0x68, 0xab, + 0x9a, 0x2a, 0xe6, 0x8a, 0xb9, 0xa2, 0xae, 0x68, + 0xab, 0x9a, 0x2a, 0x67, 0x1c, 0xc5, 0xfe, 0x94, + 0x51, 0xe6, 0x69, 0x1c, 0x68, 0xe3, 0xe7, 0x6b, + 0x85, 0xb5, 0xc2, 0xda, 0xe1, 0x6d, 0x70, 0xb6, + 0xb8, 0x5b, 0x5c, 0x2d, 0xae, 0x16, 0xd7, 0x0b, + 0x6b, 0x85, 0xb5, 0xc2, 0xda, 0xe1, 0x6d, 0x70, + 0xb6, 0xb8, 0x5b, 0x5c, 0x2d, 0xae, 0x16, 0xd7, + 0x0b, 0x6b, 0x85, 0xb5, 0xc2, 0xda, 0xe1, 0x6d, + 0x70, 0xb6, 0x6c, 0xca, 0x96, 0x36, 0x66, 0x34, + 0xf7, 0x42, 0x12, 0xd8, 0xc4, 0xb6, 0x31, 0x2d, + 0x8c, 0x4b, 0x63, 0x12, 0xd8, 0xc4, 0xb6, 0x31, + 0x2d, 0x8c, 0x4b, 0x63, 0x12, 0xd8, 0xc4, 0xb6, + 0x31, 0x2d, 0x8c, 0x4b, 0x63, 0x12, 0xd8, 0xc4, + 0xb6, 0x31, 0x2d, 0x8c, 0x4b, 0x63, 0x12, 0xd8, + 0xc4, 0xb6, 0x31, 0x2d, 0x8c, 0x4b, 0x63, 0x12, + 0xd8, 0xc4, 0xa3, 0x94, 0x73, 0x1c, 0xe6, 0xe5, + 0x8e, 0x77, 0xe1, 0x1f, 0xfd, 0x22, 0xbf, 0x3d, + 0xe1, 0x3e, 0x8b, 0x4e, 0x5a, 0xae, 0x85, 0xf6, + 0x0f, 0x28, 0x4c, 0x44, 0x2f, 0xce, 0x6e, 0xd6, + 0x30, 0x43, 0x94, 0x43, 0xcf, 0x30, 0x52, 0x66, + 0x68, 0x70, 0xfc, 0xcd, 0x1c, 0x76, 0xed, 0x6d, + 0x79, 0x98, 0xaf, 0x85, 0xb1, 0x13, 0x0c, 0xe3, + 0x19, 0xea, 0x97, 0x2f, 0xf9, 0x67, 0x03, 0x3f, + 0xbf, 0x1b, 0x4b, 0x19, 0xd1, 0xc7, 0x13, 0xe5, + 0x23, 0x2c, 0x74, 0xb2, 0x26, 0xe2, 0x77, 0x26, + 0x35, 0xae, 0xa9, 0x93, 0x33, 0x42, 0xde, 0x5a, + 0x80, 0xdc, 0xb6, 0x63, 0xb1, 0xe9, 0x2c, 0x6c, + 0xfc, 0x97, 0x2d, 0x30, 0x8c, 0xc8, 0xed, 0x46, + 0x30, 0xfc, 0x77, 0x9d, 0x36, 0x33, 0x36, 0x57, + 0xc8, 0x8f, 0x54, 0x79, 0x9a, 0x56, 0xff, 0x00, + 0xdd, 0x8c, 0x37, 0x33, 0x3a, 0x2a, 0xec, 0x6c, + 0x0d, 0x7d, 0x74, 0x6e, 0x8d, 0xae, 0x95, 0xf1, + 0x63, 0xbc, 0xe6, 0x14, 0xdc, 0xe2, 0x60, 0x21, + 0x74, 0xf6, 0x53, 0xe6, 0x48, 0x56, 0x5d, 0x2e, + 0x22, 0xcf, 0x79, 0xac, 0x93, 0x33, 0x42, 0xdb, + 0x21, 0xb2, 0x31, 0xef, 0x9d, 0xd1, 0x3b, 0x96, + 0xaa, 0x25, 0xee, 0xd7, 0x43, 0xf9, 0xac, 0x8a, + 0xf9, 0x58, 0xf2, 0xd7, 0x2d, 0x72, 0xd7, 0x2d, + 0x72, 0xd7, 0x2d, 0x72, 0xd5, 0x54, 0x19, 0xb3, + 0x9a, 0x4c, 0x4a, 0xc2, 0x24, 0x7c, 0xb0, 0xa9, + 0x33, 0x34, 0x2d, 0xb5, 0x8b, 0x01, 0x1d, 0x23, + 0xa5, 0x85, 0xef, 0xef, 0xc5, 0x8e, 0x5a, 0xe5, + 0xae, 0x5a, 0xe5, 0xae, 0x5a, 0xe5, 0xae, 0x5a, + 0xc1, 0x99, 0x6e, 0x6c, 0x71, 0xf2, 0x35, 0xdf, + 0x84, 0x7f, 0xf4, 0x8a, 0xfc, 0xfd, 0x47, 0x1b, + 0xb3, 0x75, 0xda, 0x72, 0xa6, 0x85, 0xf3, 0x54, + 0x47, 0x54, 0x4e, 0x47, 0xf5, 0x91, 0xe4, 0xee, + 0x22, 0x58, 0x0a, 0x27, 0xbb, 0x1d, 0x55, 0xb4, + 0x8f, 0x9b, 0xa8, 0x5b, 0x21, 0x13, 0x9d, 0xd5, + 0x31, 0xb9, 0xd6, 0xc6, 0x70, 0x5a, 0x20, 0x86, + 0xe0, 0xd6, 0x0a, 0x46, 0x25, 0xb0, 0xae, 0x92, + 0x52, 0x2b, 0x32, 0xe9, 0xe4, 0xb1, 0xc1, 0x33, + 0xc1, 0x37, 0xca, 0x21, 0x40, 0xe4, 0xe7, 0xe7, + 0x57, 0x89, 0xa3, 0x6e, 0x5b, 0x98, 0x45, 0xb2, + 0xf9, 0x9e, 0x1f, 0x69, 0xca, 0x28, 0x9d, 0xdd, + 0x3f, 0xde, 0x43, 0x8f, 0x9b, 0x78, 0xf9, 0x55, + 0x4c, 0xec, 0xd9, 0xd9, 0xd4, 0x15, 0x35, 0xe4, + 0x71, 0x4d, 0x5f, 0xd3, 0xe4, 0x65, 0xf1, 0x87, + 0x19, 0x53, 0xf3, 0x19, 0x99, 0x03, 0xa3, 0x96, + 0x59, 0x24, 0xb9, 0x11, 0xf9, 0x25, 0x9d, 0x3a, + 0x3b, 0xa2, 0xbe, 0x90, 0xb0, 0x81, 0x5d, 0xd8, + 0x83, 0xc9, 0x52, 0x49, 0x07, 0x4e, 0x97, 0xdc, + 0x64, 0x81, 0xe1, 0xf2, 0x3b, 0xbb, 0x21, 0xb5, + 0x56, 0x33, 0x45, 0x11, 0x65, 0x72, 0x24, 0x69, + 0xed, 0xef, 0x54, 0x19, 0x36, 0x20, 0xb0, 0xbe, + 0x16, 0x5e, 0xff, 0x00, 0x1f, 0x2a, 0x82, 0x3f, + 0x45, 0x74, 0x1f, 0x9a, 0xd6, 0x17, 0x66, 0xd3, + 0xb0, 0xe5, 0xd8, 0x72, 0xec, 0x39, 0x76, 0x1c, + 0xbb, 0x0e, 0x5d, 0x87, 0x2e, 0xc3, 0x95, 0x58, + 0x6c, 0x8a, 0x8f, 0x10, 0xfa, 0x2e, 0xe2, 0x69, + 0x16, 0x35, 0x07, 0xb7, 0xbd, 0x51, 0x23, 0x33, + 0x8b, 0xca, 0x1f, 0x59, 0x22, 0x7a, 0xca, 0x23, + 0xa7, 0xfb, 0x0e, 0x5d, 0x87, 0x2e, 0xc3, 0x97, + 0x61, 0xcb, 0xb0, 0xe5, 0xd8, 0x72, 0xec, 0x39, + 0x76, 0x1c, 0xac, 0x7d, 0xeb, 0xff, 0x00, 0x00, + 0xdf, 0xe9, 0x15, 0xf9, 0xee, 0x45, 0xf5, 0x9f, + 0xc4, 0x50, 0x32, 0x41, 0xa4, 0x2a, 0x62, 0x4d, + 0xc7, 0x28, 0xbe, 0x3f, 0xae, 0x7c, 0xb9, 0x93, + 0x13, 0x1a, 0x23, 0x12, 0x95, 0x2c, 0xc4, 0x96, + 0x44, 0x24, 0x62, 0x42, 0xe4, 0x9b, 0x12, 0x10, + 0xd1, 0xbb, 0xc1, 0xbf, 0xbe, 0x4f, 0x78, 0x47, + 0x3e, 0x1c, 0xd8, 0x17, 0x34, 0xef, 0xf5, 0xcf, + 0x97, 0x42, 0x41, 0x43, 0xc9, 0xeb, 0x9d, 0x47, + 0x39, 0x31, 0x41, 0x29, 0x05, 0x4d, 0x82, 0x09, + 0x28, 0xa8, 0xf8, 0x88, 0x70, 0x73, 0x24, 0xe6, + 0xbb, 0x0f, 0x28, 0x3f, 0xfc, 0xa5, 0x70, 0x59, + 0x63, 0xb8, 0x8b, 0x06, 0x18, 0xd8, 0x85, 0x7c, + 0xe1, 0x67, 0x32, 0x10, 0xe5, 0x89, 0x27, 0xc3, + 0xb3, 0xdd, 0xcc, 0x3d, 0xe2, 0x3b, 0xcc, 0x28, + 0xb8, 0xe1, 0x81, 0x8f, 0x1a, 0x57, 0x0d, 0x97, + 0x66, 0x32, 0x0a, 0x8a, 0x07, 0x36, 0x47, 0xc0, + 0x39, 0x6f, 0xed, 0xb8, 0x82, 0x5e, 0x46, 0x3b, + 0xb8, 0x89, 0xc4, 0x14, 0xf1, 0xdd, 0x99, 0x9f, + 0x97, 0x16, 0x5b, 0xd6, 0x0a, 0x2d, 0xb3, 0x10, + 0xd9, 0x4a, 0x93, 0x88, 0x85, 0x83, 0x8b, 0x5d, + 0x13, 0xbd, 0x32, 0xd8, 0x85, 0x9c, 0x1d, 0xc4, + 0x5c, 0x45, 0xc4, 0x5c, 0x45, 0xc4, 0x5c, 0x45, + 0xc4, 0x52, 0x36, 0x49, 0x62, 0x64, 0xe4, 0xc7, + 0x1b, 0x73, 0x33, 0x22, 0x71, 0x65, 0xbd, 0x3a, + 0x42, 0x1c, 0x4f, 0x7e, 0x62, 0x09, 0x38, 0x8c, + 0x48, 0x27, 0x11, 0x71, 0x17, 0x11, 0x71, 0x17, + 0x11, 0x71, 0x17, 0x11, 0x45, 0x5f, 0x99, 0xa4, + 0x39, 0xf8, 0x90, 0xb7, 0xfe, 0x01, 0xbe, 0xd4, + 0x5f, 0xb8, 0xb4, 0xb5, 0xc0, 0x0c, 0xdf, 0x82, + 0xb7, 0xe0, 0x2d, 0xf8, 0x0b, 0x7e, 0x02, 0xdf, + 0x80, 0xb7, 0xe0, 0x2d, 0xf8, 0x0b, 0x7e, 0x02, + 0xdf, 0x80, 0xb7, 0xe0, 0x2d, 0xf8, 0x0b, 0x7e, + 0x02, 0xdf, 0x80, 0xb7, 0xe0, 0x2d, 0xf8, 0x0b, + 0x7e, 0x02, 0xdf, 0x80, 0xb7, 0xe0, 0x2d, 0xf8, + 0x0b, 0x7e, 0x02, 0xdf, 0x80, 0x80, 0xb0, 0x8c, + 0x90, 0xbe, 0x17, 0x37, 0x58, 0x08, 0xdf, 0x25, + 0x89, 0x79, 0x2c, 0x4b, 0xc9, 0x62, 0x5e, 0x4b, + 0x12, 0xf2, 0x58, 0x97, 0x92, 0xc4, 0xbc, 0x96, + 0x25, 0xe4, 0xb1, 0x2f, 0x25, 0x89, 0x79, 0x2c, + 0x4b, 0xc9, 0x62, 0x5e, 0x4b, 0x12, 0xf2, 0x58, + 0x97, 0x92, 0xc4, 0xbc, 0x96, 0x25, 0xe4, 0xb1, + 0x2f, 0x25, 0x89, 0x79, 0x2c, 0x4b, 0xc9, 0x62, + 0x5e, 0x4b, 0x12, 0x77, 0x52, 0xb3, 0xe4, 0x7b, + 0xf2, 0xf9, 0x15, 0xa5, 0xb7, 0x01, 0x9e, 0x48, + 0x3a, 0xf2, 0x41, 0xd7, 0x92, 0x0e, 0xbc, 0x90, + 0x75, 0xe4, 0x83, 0xaf, 0x24, 0x1d, 0x79, 0x20, + 0xeb, 0xc9, 0x07, 0x5e, 0x48, 0x3a, 0xf2, 0x41, + 0xd7, 0x92, 0x0e, 0xbc, 0x90, 0x75, 0xe4, 0x83, + 0xaf, 0x24, 0x1d, 0x79, 0x20, 0xeb, 0xc9, 0x07, + 0x5e, 0x48, 0x3a, 0xf2, 0x41, 0xd7, 0x92, 0x0e, + 0xbc, 0x90, 0x75, 0xe4, 0x83, 0xa0, 0x2c, 0x5a, + 0x58, 0x29, 0xff, 0x00, 0x80, 0x6f, 0xb5, 0x17, + 0xee, 0x3a, 0x9f, 0xed, 0xfa, 0x8a, 0xad, 0x8d, + 0x8a, 0x41, 0xa5, 0x89, 0x8d, 0x05, 0xaf, 0xa8, + 0xd4, 0x44, 0xd1, 0x49, 0x68, 0xbd, 0xb6, 0x0c, + 0x1b, 0x07, 0x75, 0x4e, 0x31, 0x34, 0x35, 0x31, + 0x38, 0xe1, 0xaa, 0x59, 0x2d, 0xbf, 0xd5, 0xd3, + 0xff, 0x00, 0xa9, 0xf8, 0x75, 0x4f, 0xed, 0x3e, + 0xa0, 0x9a, 0xc7, 0x98, 0x68, 0xb8, 0xf4, 0x98, + 0x1e, 0x42, 0x7c, 0x91, 0x33, 0x66, 0x13, 0x21, + 0x8c, 0x80, 0x46, 0x96, 0x18, 0x63, 0x77, 0x6c, + 0xb2, 0x27, 0xc9, 0x0f, 0xfa, 0xcc, 0xfb, 0x97, + 0x50, 0x0b, 0x29, 0x38, 0x80, 0x09, 0xc9, 0x66, + 0x31, 0xf3, 0xcc, 0xf0, 0xe4, 0x79, 0xc6, 0x1a, + 0x42, 0xe5, 0xce, 0x3e, 0x59, 0x92, 0xb8, 0x88, + 0xa3, 0x9c, 0x39, 0x07, 0x64, 0xb1, 0x3a, 0x07, + 0xe6, 0xbc, 0x8c, 0x49, 0x38, 0xf2, 0x0c, 0xf9, + 0xe0, 0xc8, 0xf2, 0x3e, 0x2c, 0xb1, 0x34, 0x09, + 0xdf, 0x03, 0x06, 0x92, 0x48, 0x58, 0x0c, 0xf2, + 0x33, 0x58, 0x47, 0x72, 0x50, 0x66, 0x87, 0x33, + 0x81, 0x30, 0xcc, 0x8c, 0x69, 0x25, 0x86, 0x3a, + 0xc2, 0x26, 0x8a, 0x00, 0x66, 0x25, 0x52, 0xc2, + 0xf8, 0x2b, 0x53, 0xff, 0x00, 0x00, 0xdf, 0x6a, + 0x2f, 0xdc, 0x75, 0x3f, 0xdb, 0xf4, 0xb7, 0xe5, + 0xea, 0x3e, 0x76, 0xbe, 0x3b, 0x03, 0xda, 0x7e, + 0x2b, 0xe5, 0x8f, 0x8a, 0xe3, 0x61, 0x2a, 0x02, + 0x45, 0x60, 0xd1, 0xba, 0xc5, 0xc3, 0x05, 0x5a, + 0x53, 0x70, 0x2b, 0x0b, 0x8b, 0xd2, 0x29, 0x90, + 0xe3, 0xeb, 0xe9, 0xff, 0x00, 0xd4, 0xfc, 0x3a, + 0xa7, 0xf6, 0x9f, 0x50, 0x64, 0x71, 0x0a, 0xc9, + 0xd1, 0x0d, 0x1c, 0xe5, 0x3c, 0x95, 0x19, 0xc2, + 0xfa, 0xb1, 0x6b, 0x2c, 0x03, 0x11, 0x64, 0xc9, + 0xa2, 0x6d, 0x84, 0x7c, 0xcf, 0xf0, 0x19, 0xf7, + 0x23, 0x60, 0x9a, 0x69, 0xc0, 0x04, 0xa8, 0x9b, + 0xf2, 0x9f, 0x85, 0x62, 0xe9, 0x0b, 0x54, 0xf0, + 0xca, 0xfb, 0x32, 0x21, 0x7c, 0x24, 0x48, 0x14, + 0x85, 0xe4, 0xa2, 0xe2, 0xe2, 0x5c, 0x67, 0xd4, + 0x7b, 0xea, 0xcc, 0x99, 0x86, 0x7a, 0x63, 0x94, + 0x9e, 0xef, 0x6e, 0xe1, 0xd2, 0x38, 0x78, 0x04, + 0x22, 0x10, 0x6a, 0x5d, 0x8e, 0x2b, 0xb3, 0x23, + 0x1a, 0x38, 0xcc, 0x86, 0x56, 0x95, 0x8c, 0xb8, + 0xd1, 0xbe, 0x42, 0x89, 0x91, 0xc5, 0x86, 0x7a, + 0xc2, 0x9f, 0x11, 0xad, 0xcd, 0xa3, 0x2a, 0x63, + 0x74, 0x35, 0xc9, 0xfe, 0xdc, 0x5f, 0xb5, 0x17, + 0xee, 0x2e, 0x24, 0x09, 0xa3, 0xf2, 0x2a, 0x17, + 0x22, 0xa1, 0x72, 0x2a, 0x17, 0x22, 0xa1, 0x72, + 0x2a, 0x17, 0x22, 0xa1, 0x72, 0x2a, 0x17, 0x22, + 0xa1, 0x72, 0x2a, 0x17, 0x22, 0xa1, 0x72, 0x2a, + 0x17, 0x22, 0xa1, 0x72, 0x2a, 0x17, 0x22, 0xa1, + 0x72, 0x2a, 0x17, 0x22, 0xa1, 0x72, 0x2a, 0x17, + 0x22, 0xa1, 0x72, 0x2a, 0x17, 0x22, 0xa1, 0x72, + 0x2a, 0x15, 0x6c, 0xa2, 0xba, 0xaf, 0xe1, 0x71, + 0x7d, 0xaf, 0x2b, 0xcb, 0x17, 0x96, 0x2f, 0x2c, + 0x5e, 0x58, 0xbc, 0xb1, 0x79, 0x62, 0x7f, 0x54, + 0x3a, 0x27, 0x79, 0x62, 0x7f, 0x51, 0x4d, 0x1c, + 0x71, 0x75, 0x0c, 0xd3, 0xb6, 0x2e, 0xa1, 0x9a, + 0x76, 0xf9, 0x43, 0xbd, 0x0d, 0xbf, 0x21, 0xea, + 0x1b, 0xe2, 0x09, 0x6f, 0x93, 0xbf, 0xe5, 0xe5, + 0x8b, 0xcb, 0x17, 0x96, 0x2f, 0x2c, 0x5e, 0x58, + 0xbc, 0xb1, 0x58, 0x3b, 0xd7, 0x32, 0xba, 0x0a, + 0x22, 0xa3, 0xd3, 0x8c, 0xb4, 0xe3, 0x26, 0x55, + 0x0e, 0xc7, 0x66, 0xa0, 0x6c, 0xad, 0x38, 0xcb, + 0x4e, 0x32, 0xd3, 0x8c, 0xb4, 0xe3, 0x2d, 0x38, + 0xcb, 0x4e, 0x32, 0xd3, 0x8c, 0xb4, 0xe3, 0x2d, + 0x38, 0xcb, 0x4e, 0x32, 0xd3, 0x8c, 0xb4, 0xe3, + 0x2d, 0x38, 0xcb, 0x4e, 0x32, 0xd3, 0x8c, 0xb4, + 0xe3, 0x2d, 0x38, 0xca, 0xb4, 0x58, 0xc5, 0xab, + 0x4f, 0xf6, 0xe2, 0xfd, 0xa8, 0xcf, 0x71, 0xd4, + 0x9e, 0xda, 0xa9, 0x8d, 0x71, 0x50, 0x15, 0x2d, + 0x9c, 0x39, 0xad, 0x8f, 0xbf, 0x25, 0x43, 0x33, + 0x24, 0x23, 0x8a, 0x50, 0x50, 0x56, 0x42, 0x4c, + 0x06, 0x0a, 0x3b, 0xb1, 0x20, 0x03, 0xc2, 0x1c, + 0xb4, 0xdd, 0xb1, 0xc0, 0x92, 0x48, 0xea, 0x33, + 0x1c, 0x72, 0xb2, 0x7a, 0xe1, 0x83, 0x74, 0x35, + 0xf0, 0xbf, 0x10, 0x8b, 0x14, 0x28, 0xea, 0x8c, + 0x0d, 0x15, 0x9c, 0x10, 0x8a, 0x61, 0xc1, 0x8f, + 0x21, 0xad, 0xac, 0x1f, 0xe7, 0x10, 0x11, 0xbe, + 0x47, 0x82, 0x3c, 0xe4, 0x92, 0xc6, 0xc5, 0x3d, + 0x0f, 0xea, 0xbe, 0x1d, 0x53, 0xfb, 0x4f, 0xa6, + 0xa8, 0x67, 0xcd, 0x2c, 0xe1, 0x72, 0xad, 0x04, + 0x85, 0x8f, 0xbb, 0xaf, 0x2a, 0x62, 0x4f, 0x16, + 0x78, 0xa6, 0x1f, 0xb9, 0x87, 0x67, 0x23, 0x49, + 0x24, 0x39, 0x36, 0x23, 0x9d, 0x98, 0x1f, 0xc1, + 0x26, 0x76, 0x93, 0x07, 0xd4, 0x67, 0xdc, 0xba, + 0x9f, 0xed, 0xfe, 0x2f, 0x4f, 0xfe, 0xa5, 0x3f, + 0xdb, 0x8b, 0xf6, 0xa3, 0x3d, 0xc5, 0xc0, 0x8f, + 0x36, 0xb8, 0x52, 0x5c, 0x24, 0xf3, 0xcb, 0x03, + 0x00, 0xc5, 0xdb, 0x59, 0x2b, 0x6d, 0x19, 0x0b, + 0x71, 0x6b, 0x1c, 0x71, 0xc1, 0x6a, 0xc8, 0x96, + 0xca, 0x37, 0x64, 0xab, 0x2c, 0x11, 0x04, 0xc7, + 0xb2, 0x78, 0xa0, 0x32, 0x06, 0x89, 0x21, 0x51, + 0xf6, 0x1f, 0x6e, 0xc9, 0x9d, 0x15, 0x9e, 0x23, + 0x66, 0xd9, 0xbe, 0x92, 0xce, 0x8c, 0x94, 0x5c, + 0xfc, 0xa2, 0xa7, 0xb6, 0xef, 0xcd, 0x2d, 0x94, + 0x51, 0xb2, 0x0b, 0x36, 0x42, 0xd7, 0x1d, 0x0c, + 0xb9, 0x30, 0x9c, 0x98, 0x45, 0x78, 0xae, 0xaf, + 0xab, 0xf8, 0x75, 0x34, 0x12, 0x49, 0x65, 0xc4, + 0x99, 0x71, 0x26, 0x5c, 0x49, 0x97, 0x12, 0x65, + 0xc4, 0x99, 0x60, 0x62, 0x30, 0x88, 0xe5, 0x92, + 0xfe, 0xc9, 0x3d, 0xc7, 0x4e, 0xf9, 0xc3, 0x86, + 0x72, 0x63, 0x8f, 0x06, 0x17, 0x94, 0xd2, 0x0d, + 0x6a, 0x86, 0x72, 0x63, 0x8e, 0x5c, 0x97, 0x3c, + 0x4c, 0x69, 0x2c, 0x83, 0x89, 0x32, 0xe2, 0x4c, + 0xb8, 0x93, 0x2e, 0x24, 0xcb, 0x89, 0x32, 0xe2, + 0x4c, 0x8d, 0xff, 0x00, 0x87, 0x2b, 0x2f, 0x46, + 0x64, 0xab, 0x7b, 0x57, 0x1e, 0x08, 0x62, 0xb7, + 0x82, 0x27, 0x49, 0x53, 0x96, 0xec, 0x5f, 0xf7, + 0x95, 0x86, 0xcf, 0x11, 0xa2, 0xc7, 0x28, 0xf6, + 0xd1, 0xb6, 0x23, 0x66, 0x7b, 0x30, 0x8c, 0x1f, + 0xbf, 0x31, 0x83, 0xc3, 0x3c, 0x96, 0x90, 0xc5, + 0x14, 0x42, 0xbd, 0xb9, 0x0e, 0xb6, 0x16, 0x4e, + 0x07, 0x6c, 0x61, 0x87, 0x82, 0x17, 0x48, 0x49, + 0x1d, 0xa6, 0xa3, 0x9b, 0x97, 0x8f, 0x5b, 0x5d, + 0x99, 0xc0, 0xc9, 0x18, 0x14, 0x52, 0xe3, 0x65, + 0x4b, 0x69, 0xe4, 0x6c, 0xb5, 0xca, 0x4f, 0x6c, + 0x2f, 0xd8, 0x8c, 0xf7, 0x2c, 0x91, 0xd1, 0x39, + 0xd2, 0xb1, 0xf9, 0xf5, 0x42, 0xbd, 0x50, 0xaf, + 0x54, 0x2b, 0xd5, 0x0a, 0xf5, 0x42, 0xbd, 0x50, + 0xaf, 0x54, 0x2b, 0xd5, 0x0a, 0xf5, 0x42, 0xbd, + 0x50, 0xaf, 0x54, 0x2b, 0xd5, 0x0a, 0xf5, 0x42, + 0xbd, 0x50, 0xaf, 0x54, 0x2b, 0xd5, 0x0a, 0xf5, + 0x42, 0xbd, 0x50, 0xaf, 0x54, 0x29, 0x84, 0x62, + 0x2c, 0xb9, 0xd9, 0x7b, 0xbe, 0x17, 0x5d, 0x40, + 0x5d, 0x71, 0x9e, 0x5f, 0x60, 0xbc, 0xbe, 0xc1, + 0x79, 0x7d, 0x82, 0xf2, 0xfb, 0x05, 0xe5, 0xf6, + 0x0b, 0xcb, 0xec, 0x17, 0x97, 0xd8, 0x2f, 0x2a, + 0xb3, 0xf4, 0x3f, 0xa9, 0xed, 0x62, 0x67, 0x97, + 0xd8, 0x26, 0xf5, 0x4d, 0xa3, 0xb1, 0x27, 0x54, + 0x5a, 0x42, 0xf9, 0x7a, 0x96, 0xd8, 0x75, 0xe5, + 0xf6, 0x0b, 0xcb, 0xec, 0x17, 0x97, 0xd8, 0x2f, + 0x2f, 0xb0, 0x5e, 0x5f, 0x60, 0xbc, 0xbe, 0xc1, + 0x79, 0x7d, 0x82, 0xf2, 0xfb, 0x04, 0x7b, 0xb3, + 0x24, 0xa8, 0xd1, 0xe5, 0x76, 0x1b, 0x5a, 0x43, + 0x62, 0xc5, 0x61, 0x98, 0x87, 0x58, 0x5b, 0xe5, + 0x16, 0x9c, 0x91, 0x49, 0x9a, 0x84, 0x99, 0x65, + 0xc0, 0x46, 0x35, 0xcf, 0xa6, 0x32, 0x48, 0x48, + 0xa3, 0x2c, 0x99, 0x70, 0x21, 0x4d, 0xcc, 0xf4, + 0x33, 0xcc, 0xe9, 0x00, 0x36, 0x46, 0x11, 0x56, + 0x61, 0x2c, 0xd5, 0x93, 0x91, 0xa0, 0xa8, 0x34, + 0x66, 0xf0, 0x0f, 0xf5, 0xeb, 0xcc, 0x6a, 0x8a, + 0x80, 0xb8, 0x64, 0x9a, 0xa8, 0xa9, 0x22, 0x75, + 0x49, 0xd9, 0x77, 0x0c, 0xb5, 0x15, 0x61, 0xac, + 0x68, 0xa3, 0xcf, 0x08, 0x0a, 0x4f, 0x6c, 0x27, + 0xd8, 0x8c, 0xf7, 0x2e, 0x74, 0x40, 0xb7, 0x6b, + 0x85, 0xb5, 0xc2, 0xda, 0xe1, 0x6d, 0x70, 0xb6, + 0xb8, 0x5b, 0x5c, 0x2d, 0xae, 0x16, 0xd7, 0x0b, + 0x6b, 0x85, 0xb5, 0xc2, 0xda, 0xe1, 0x6d, 0x70, + 0xb6, 0xb8, 0x5b, 0x5c, 0x2d, 0xae, 0x16, 0xd7, + 0x0b, 0x6b, 0x85, 0xb5, 0xc2, 0xda, 0xe1, 0x6d, + 0x70, 0xb6, 0xb8, 0x51, 0x4f, 0x09, 0xae, 0xce, + 0x3d, 0x39, 0x5d, 0x53, 0xfb, 0x4f, 0xaf, 0x12, + 0x64, 0x8a, 0xd9, 0x64, 0x74, 0xaf, 0xb4, 0x0e, + 0x30, 0x9a, 0x34, 0x92, 0xc7, 0x5b, 0x13, 0xfe, + 0x46, 0x72, 0xe7, 0x7c, 0x3f, 0xe0, 0x33, 0xee, + 0x5d, 0x51, 0xf6, 0xfc, 0x0a, 0x1f, 0x8c, 0xe9, + 0xea, 0x62, 0x6c, 0xd1, 0x05, 0x17, 0x63, 0x15, + 0xd9, 0xd8, 0x42, 0x26, 0x64, 0x64, 0x35, 0xf2, + 0xb8, 0xc9, 0xab, 0x49, 0x86, 0x56, 0x8b, 0x33, + 0x9e, 0xc1, 0x66, 0x92, 0x40, 0x85, 0xe5, 0x15, + 0x30, 0x71, 0x71, 0xde, 0x34, 0xb1, 0xb5, 0xe1, + 0x91, 0x1e, 0x62, 0x11, 0xd2, 0x40, 0xe1, 0x27, + 0x62, 0x9a, 0xb0, 0x98, 0x66, 0xcc, 0x12, 0x62, + 0x3f, 0x87, 0x4f, 0xfe, 0xa5, 0x49, 0xed, 0x84, + 0xfb, 0x11, 0xbe, 0xe6, 0xf8, 0x9f, 0x45, 0xb7, + 0x2d, 0x72, 0xd7, 0x2d, 0x02, 0x2c, 0x65, 0x05, + 0x62, 0x3b, 0x80, 0x6e, 0x23, 0x27, 0x2e, 0x32, + 0x19, 0x83, 0x2e, 0x59, 0x64, 0x81, 0xe3, 0x85, + 0x0b, 0xc1, 0x38, 0x49, 0x83, 0x9f, 0x1d, 0xf7, + 0x48, 0x10, 0xf3, 0x9d, 0x3b, 0x79, 0x0e, 0xcc, + 0x2f, 0x94, 0x8c, 0x88, 0x29, 0x06, 0x30, 0xa9, + 0x1b, 0x13, 0x5f, 0xdf, 0x8f, 0x2e, 0xef, 0xc6, + 0xce, 0x5a, 0xe5, 0xae, 0x5a, 0x88, 0xcf, 0x94, + 0xa7, 0xff, 0x00, 0xc1, 0x8b, 0xa9, 0x44, 0x9e, + 0x6b, 0x1d, 0x79, 0x4b, 0x5e, 0x52, 0xd7, 0x94, + 0xb5, 0xe5, 0x2d, 0x79, 0x4b, 0x5e, 0x52, 0xd7, + 0x94, 0xb3, 0x92, 0xb2, 0x1c, 0xef, 0xb0, 0x99, + 0xbc, 0x23, 0x3d, 0x22, 0x38, 0xe0, 0xdb, 0x96, + 0x97, 0x89, 0xe7, 0xe6, 0x4d, 0x16, 0xbc, 0xa5, + 0xaf, 0x29, 0x6b, 0xca, 0x5a, 0xf2, 0x96, 0xbc, + 0xa5, 0xaf, 0x29, 0x6b, 0xca, 0x5a, 0xf2, 0x91, + 0xb8, 0xf9, 0x3d, 0x75, 0x47, 0xfa, 0xf8, 0x59, + 0x00, 0x44, 0x8d, 0x9c, 0x49, 0x46, 0xba, 0x78, + 0xb2, 0x59, 0x0b, 0x65, 0x2f, 0xa4, 0xa7, 0xc9, + 0x14, 0x04, 0x87, 0x1c, 0xb0, 0x49, 0xd9, 0x73, + 0xa5, 0x3a, 0x29, 0xa4, 0x82, 0x6c, 0x62, 0x59, + 0xc7, 0x93, 0xd7, 0x7e, 0xe9, 0x63, 0x96, 0xbb, + 0x2f, 0xc4, 0x47, 0x0d, 0x14, 0xf1, 0x89, 0xd9, + 0xcc, 0x55, 0x96, 0x31, 0x3b, 0x86, 0x64, 0x33, + 0xb8, 0xcb, 0x89, 0x3d, 0x4d, 0xf8, 0x74, 0xff, + 0x00, 0xea, 0x54, 0x9e, 0xd8, 0x4f, 0xb1, 0x1b, + 0xee, 0x7a, 0x8a, 0x0c, 0xba, 0xeb, 0x8d, 0x95, + 0xc6, 0xca, 0xe3, 0x65, 0x40, 0x3b, 0xb3, 0xd2, + 0xd0, 0x85, 0x2e, 0x29, 0xdb, 0xea, 0x74, 0x0e, + 0x8a, 0x77, 0xdf, 0x75, 0x0c, 0x3d, 0xd0, 0x1b, + 0x18, 0x9e, 0x3d, 0x5e, 0x77, 0x2e, 0xcd, 0xb3, + 0x13, 0x8e, 0x9f, 0x67, 0xaf, 0x65, 0x04, 0x8d, + 0x1e, 0xb0, 0x87, 0x3a, 0x2a, 0xa8, 0x5e, 0x6f, + 0x6c, 0x78, 0x5a, 0xfb, 0x0a, 0xb7, 0x90, 0x48, + 0xef, 0x96, 0x59, 0xcb, 0xe3, 0x65, 0x71, 0xb2, + 0xb8, 0xd9, 0x51, 0x0f, 0x9e, 0xe9, 0xfe, 0xf1, + 0x75, 0x0d, 0xa9, 0x62, 0x1f, 0xbf, 0xb0, 0x5b, + 0xfb, 0x05, 0xbf, 0xb0, 0x5b, 0xfb, 0x05, 0xbf, + 0xb0, 0x5b, 0xfb, 0x05, 0xbf, 0xb0, 0x42, 0x9b, + 0x68, 0x53, 0x33, 0x7b, 0x63, 0x8c, 0x8d, 0x6b, + 0x68, 0x5c, 0xa4, 0xd8, 0xd9, 0x8f, 0x19, 0x36, + 0x36, 0x82, 0xc7, 0x31, 0x36, 0xe3, 0x9d, 0xbf, + 0xb0, 0x5b, 0xfb, 0x05, 0xbf, 0xb0, 0x5b, 0xfb, + 0x05, 0xbf, 0xb0, 0x5b, 0xfb, 0x05, 0xbf, 0xb0, + 0x5b, 0xfb, 0x04, 0x73, 0xb2, 0xf7, 0xab, 0xa1, + 0x21, 0x2d, 0x9a, 0x71, 0x96, 0x9c, 0x65, 0xa7, + 0x19, 0x69, 0xc6, 0x5a, 0x71, 0x96, 0x9c, 0x65, + 0xa7, 0x19, 0x69, 0xc6, 0x5a, 0x71, 0x90, 0xe0, + 0x8a, 0x3a, 0x9a, 0xb6, 0x02, 0x25, 0xd3, 0x8c, + 0xb4, 0xe3, 0x26, 0x55, 0x0d, 0x1b, 0xc9, 0x10, + 0x72, 0x19, 0xa7, 0x19, 0x69, 0xc6, 0x5a, 0x71, + 0x96, 0x9c, 0x65, 0xa7, 0x19, 0x69, 0xc6, 0x55, + 0x83, 0x44, 0x2d, 0x5a, 0x93, 0xda, 0x89, 0xf6, + 0x23, 0x7d, 0xcd, 0xb0, 0xbd, 0xc2, 0xf8, 0x8b, + 0x88, 0xb8, 0x88, 0x52, 0x09, 0x09, 0x92, 0xba, + 0x79, 0xa6, 0xc9, 0x86, 0x65, 0xdc, 0xb2, 0xfb, + 0xd2, 0xbe, 0x79, 0xe2, 0x73, 0x64, 0x7c, 0x10, + 0x36, 0x41, 0xb2, 0x2b, 0xa7, 0x0b, 0x2d, 0x79, + 0x0d, 0x26, 0x32, 0xcb, 0x89, 0x0f, 0x21, 0x02, + 0x3a, 0x29, 0x49, 0x86, 0x69, 0x33, 0x34, 0x99, + 0x94, 0x92, 0xa7, 0xcf, 0xae, 0x7f, 0x5f, 0x11, + 0x71, 0x17, 0x11, 0x0b, 0x5f, 0x99, 0x88, 0x2d, + 0xf8, 0x94, 0x95, 0xd5, 0x3f, 0xb4, 0xfa, 0xc0, + 0x8f, 0xb2, 0xc1, 0x48, 0x66, 0x04, 0xac, 0x6e, + 0x65, 0x8a, 0x0a, 0xd9, 0xa5, 0x71, 0xaf, 0x80, + 0xd1, 0xb3, 0x9e, 0x5d, 0x87, 0xf8, 0x0c, 0xfb, + 0x97, 0x52, 0xfd, 0xdf, 0x09, 0x6b, 0x9b, 0xdb, + 0xf4, 0x3b, 0xd2, 0x20, 0x19, 0x2a, 0x0c, 0x0b, + 0x33, 0xa3, 0xc0, 0xf2, 0xba, 0x29, 0x2b, 0xe4, + 0xc4, 0xec, 0x16, 0x69, 0x50, 0xc2, 0xbc, 0x92, + 0x26, 0x12, 0x1c, 0x44, 0xe0, 0xe7, 0x63, 0x9c, + 0x19, 0x0c, 0x4e, 0x16, 0x66, 0x47, 0x91, 0xa5, + 0xc4, 0x58, 0x04, 0x9c, 0xbf, 0x20, 0xcc, 0xd1, + 0x5c, 0x1c, 0xec, 0x7b, 0x83, 0x9d, 0x8c, 0xf8, + 0x74, 0xf7, 0xeb, 0x94, 0x9e, 0xd4, 0x3f, 0xb1, + 0x1b, 0xee, 0xa6, 0x37, 0x21, 0x54, 0xf9, 0x36, + 0x17, 0x93, 0x61, 0x79, 0x36, 0x17, 0x93, 0x61, + 0x33, 0xa8, 0xb3, 0x2b, 0xbc, 0x9b, 0x0a, 0x1b, + 0x99, 0x89, 0xc4, 0xd7, 0xef, 0x1d, 0xfe, 0x4d, + 0x85, 0xe4, 0xd8, 0x5e, 0x4d, 0x85, 0xe4, 0xd8, + 0x5e, 0x47, 0xff, 0x00, 0x87, 0x93, 0x61, 0x79, + 0x36, 0x17, 0x93, 0x61, 0x79, 0x36, 0x17, 0x93, + 0x61, 0x79, 0x36, 0x17, 0x93, 0x61, 0x79, 0x36, + 0x15, 0x35, 0xdc, 0x87, 0x1d, 0xf0, 0xbf, 0xa6, + 0x30, 0xc3, 0xbc, 0x6e, 0xc9, 0x78, 0xdd, 0x92, + 0xf1, 0xbb, 0x25, 0xe3, 0x76, 0x4b, 0xc6, 0xec, + 0x97, 0x8d, 0xd9, 0x2f, 0x1b, 0xb2, 0x50, 0xd5, + 0x5d, 0x8e, 0xcc, 0xf4, 0xed, 0x9b, 0xb2, 0xde, + 0x9e, 0xb3, 0x63, 0x9d, 0x4d, 0x73, 0x24, 0x8d, + 0xe9, 0xfb, 0x46, 0x2c, 0x51, 0xdb, 0xe2, 0x4f, + 0x1b, 0xb2, 0x5e, 0x37, 0x64, 0xbc, 0x6e, 0xc9, + 0x78, 0xdd, 0x92, 0xf1, 0xbb, 0x25, 0xe3, 0x76, + 0x4b, 0xc6, 0xec, 0x97, 0x8d, 0xd9, 0x23, 0x9b, + 0x96, 0x48, 0xba, 0x97, 0x19, 0xf9, 0xac, 0x7f, + 0xce, 0x65, 0x1e, 0x48, 0x00, 0xb4, 0x36, 0x33, + 0x5b, 0x01, 0x03, 0xd7, 0x44, 0xf8, 0xdc, 0x31, + 0xb5, 0xf1, 0x67, 0xb4, 0x4c, 0x72, 0xcd, 0x0b, + 0xbd, 0x73, 0x16, 0x1b, 0xda, 0xdb, 0x30, 0xab, + 0x9e, 0x09, 0x62, 0x36, 0x61, 0x61, 0x89, 0xee, + 0xcb, 0x67, 0x64, 0x8d, 0x5d, 0x9c, 0xf1, 0xe6, + 0xc3, 0xe4, 0x2a, 0x76, 0xfa, 0x0c, 0x13, 0x13, + 0x0b, 0x0c, 0x6c, 0x7c, 0xf5, 0xff, 0x00, 0x0e, + 0x9f, 0xc6, 0x71, 0x58, 0xa4, 0xf6, 0xa1, 0xfe, + 0x34, 0x77, 0xba, 0xb3, 0xfd, 0x0f, 0xd1, 0x44, + 0x2c, 0xac, 0x5c, 0x48, 0xdb, 0x5d, 0x4c, 0xec, + 0xe2, 0xc2, 0xb0, 0x58, 0x88, 0x6c, 0x62, 0x8b, + 0x8c, 0x60, 0x71, 0xbb, 0x38, 0xae, 0x87, 0xb4, + 0x78, 0xc3, 0x88, 0x2d, 0x7c, 0x4d, 0x9c, 0x61, + 0x46, 0x14, 0x96, 0x38, 0x58, 0x25, 0xaf, 0x8a, + 0x38, 0x47, 0x6d, 0x98, 0xf1, 0x47, 0x1f, 0xd1, + 0xd2, 0xdf, 0xb4, 0xf8, 0x75, 0x34, 0xf2, 0x47, + 0x65, 0x20, 0xc4, 0x61, 0xf9, 0x82, 0x47, 0xbb, + 0xd1, 0x27, 0x0d, 0xf0, 0x4a, 0xd8, 0x5f, 0x04, + 0xad, 0x86, 0x0c, 0x7a, 0x84, 0xcc, 0x64, 0xbe, + 0x33, 0x63, 0x2c, 0x39, 0x9d, 0x83, 0x98, 0xfc, + 0xb4, 0xf6, 0xe1, 0xae, 0x31, 0xd1, 0x15, 0x83, + 0x02, 0x74, 0xe1, 0x91, 0x0d, 0xac, 0x02, 0xcf, + 0x39, 0xc2, 0xe2, 0x59, 0xf0, 0x53, 0x9f, 0x0a, + 0x82, 0x07, 0xbd, 0x98, 0x1d, 0xf2, 0xa9, 0xe3, + 0x9e, 0x10, 0x27, 0x0e, 0x78, 0x32, 0x53, 0xa6, + 0x1b, 0x26, 0xff, 0x00, 0xcb, 0x94, 0xc3, 0xc5, + 0x60, 0x33, 0xba, 0x64, 0xfc, 0x3b, 0xc6, 0x6c, + 0x57, 0x8c, 0xd8, 0xaf, 0x19, 0xb1, 0x5e, 0x33, + 0x62, 0xbc, 0x66, 0xc5, 0x78, 0xcd, 0x8a, 0xf1, + 0x9b, 0x14, 0x2d, 0x45, 0x98, 0x98, 0xcf, 0x4d, + 0x59, 0x67, 0x3e, 0x33, 0x62, 0xbc, 0x66, 0xc5, + 0x78, 0xcd, 0x8a, 0x22, 0x86, 0xcc, 0x99, 0x3c, + 0x66, 0xc5, 0x78, 0xcd, 0x8a, 0xf1, 0x9b, 0x15, + 0xe3, 0x36, 0x2b, 0xc6, 0x6c, 0x57, 0x8c, 0xd8, + 0xa8, 0xfa, 0x64, 0xbf, 0x57, 0xca, 0x21, 0xe0, + 0x52, 0x7b, 0x40, 0xff, 0x00, 0x1a, 0x3b, 0xdd, + 0x14, 0x34, 0xa5, 0xd3, 0x68, 0x2c, 0x16, 0x82, + 0xc1, 0x68, 0x2c, 0x16, 0x82, 0xc1, 0x0d, 0x53, + 0x68, 0x2c, 0xb8, 0x06, 0xd7, 0x0c, 0x1a, 0xa2, + 0xc8, 0x59, 0x86, 0x0e, 0xd4, 0x56, 0x38, 0x3b, + 0x47, 0x48, 0x28, 0x56, 0x11, 0xc1, 0x91, 0x6d, + 0x1c, 0xe9, 0xab, 0x2c, 0xe7, 0x8c, 0x70, 0x2d, + 0x06, 0xc5, 0x68, 0x36, 0x03, 0x67, 0x8b, 0x67, + 0xf3, 0xe2, 0xda, 0xf7, 0x88, 0xaf, 0xb2, 0x9e, + 0x3d, 0x05, 0x82, 0xd0, 0x58, 0x2d, 0x05, 0x82, + 0xd0, 0x58, 0x2e, 0x9f, 0xaa, 0x2c, 0x43, 0xfe, + 0x1d, 0x53, 0xfb, 0x46, 0x0b, 0x30, 0x78, 0x1e, + 0x07, 0xd7, 0x88, 0x18, 0x04, 0x4b, 0x55, 0x2b, + 0x33, 0x87, 0x4a, 0xcc, 0xe1, 0xc0, 0x34, 0x97, + 0x54, 0x76, 0x67, 0xe2, 0x32, 0x7f, 0xff, 0x00, + 0x51, 0x99, 0x70, 0xf9, 0x81, 0xee, 0xcc, 0x90, + 0x67, 0x1c, 0x4b, 0x56, 0xbb, 0xb8, 0x5c, 0x8d, + 0xee, 0x12, 0xf8, 0x83, 0xcc, 0xf0, 0x72, 0x70, + 0x50, 0x6e, 0x0d, 0x61, 0xf8, 0x64, 0xd8, 0x77, + 0x79, 0xd1, 0xf6, 0x88, 0x6c, 0x92, 0xe6, 0x76, + 0xda, 0x7d, 0xe6, 0x7d, 0xdf, 0xc9, 0x97, 0xda, + 0x05, 0xf8, 0xd1, 0xde, 0xe8, 0xa2, 0x65, 0x12, + 0x9b, 0x7f, 0x60, 0xb7, 0xf6, 0x0b, 0x7f, 0x60, + 0xb7, 0xf6, 0x0a, 0x1b, 0x8b, 0x42, 0x64, 0xc9, + 0x37, 0x78, 0x94, 0x83, 0xed, 0xc5, 0x67, 0x2a, + 0xef, 0xb3, 0x05, 0xbd, 0xa1, 0x53, 0x3a, 0xf6, + 0xc5, 0x8e, 0xdf, 0xd8, 0x2d, 0xfd, 0x82, 0x96, + 0xe6, 0xce, 0x07, 0x6f, 0xec, 0x13, 0x6f, 0x6c, + 0x9d, 0x9d, 0xf5, 0x8a, 0xdf, 0xd8, 0x2d, 0xfd, + 0x82, 0xdf, 0xd8, 0x2d, 0xfd, 0x82, 0xdf, 0xd8, + 0x2e, 0x9f, 0xb5, 0x2c, 0xb3, 0xfe, 0x1d, 0x53, + 0xfb, 0x4f, 0xa9, 0xb0, 0xbd, 0xe9, 0xd5, 0x85, + 0xb3, 0x12, 0xd7, 0x95, 0x03, 0x1d, 0x58, 0x5b, + 0x1a, 0xc8, 0xdd, 0x2b, 0xa0, 0x16, 0x62, 0x96, + 0x04, 0x9d, 0xd9, 0x68, 0xf2, 0xba, 0x2f, 0x84, + 0x93, 0xba, 0x58, 0xa0, 0x9d, 0xc3, 0x3f, 0xe2, + 0x67, 0xdd, 0xfc, 0x99, 0x7d, 0xa0, 0x5f, 0x8d, + 0x1d, 0xee, 0xac, 0xff, 0x00, 0x43, 0xf4, 0x57, + 0x7c, 0xf8, 0xf4, 0xb8, 0x93, 0x33, 0xc8, 0xd8, + 0x07, 0xae, 0xb0, 0xc4, 0xfb, 0xba, 0xb8, 0xf1, + 0xdb, 0x22, 0x36, 0x47, 0x3b, 0x9e, 0xd8, 0xa1, + 0x8e, 0x11, 0xe2, 0x15, 0xf1, 0xb3, 0x0d, 0x37, + 0x10, 0xb4, 0x58, 0x19, 0x17, 0x26, 0x37, 0xb5, + 0xad, 0xb5, 0x6b, 0x07, 0x8b, 0xe8, 0xe9, 0x6f, + 0xda, 0x7c, 0x3a, 0xa7, 0xf6, 0x9f, 0x55, 0x67, + 0xe1, 0x87, 0xb1, 0xb3, 0x3b, 0xb0, 0xae, 0xbb, + 0x1c, 0xca, 0x59, 0x9e, 0xc3, 0x02, 0x92, 0x1e, + 0x1c, 0x10, 0xe0, 0x35, 0x1e, 0x3d, 0x39, 0xfa, + 0xcc, 0xfb, 0xbf, 0x93, 0x2f, 0xb3, 0x0b, 0xf1, + 0xa3, 0xfd, 0xd1, 0x62, 0x4a, 0x5d, 0x1e, 0x82, + 0xc1, 0x68, 0x2c, 0x16, 0x82, 0xc1, 0x68, 0x2c, + 0x14, 0x34, 0xf6, 0x83, 0x4a, 0xf1, 0x2e, 0xa4, + 0x7b, 0x69, 0xed, 0x1b, 0x0f, 0x12, 0xeb, 0xb1, + 0xa6, 0xb3, 0xec, 0xc5, 0x5f, 0x71, 0x0a, 0x68, + 0xd7, 0x6d, 0xcc, 0x60, 0x5c, 0x45, 0x0b, 0x02, + 0xb8, 0x63, 0xa5, 0xab, 0xb6, 0x9b, 0x19, 0x1e, + 0xef, 0x39, 0x60, 0x97, 0x51, 0xe6, 0x4a, 0x6b, + 0x39, 0x71, 0xa0, 0xb0, 0x5a, 0x0b, 0x05, 0xa0, + 0xb0, 0x5a, 0x0b, 0x05, 0xd3, 0xf5, 0x45, 0x88, + 0x7f, 0xc3, 0xa9, 0xa0, 0x92, 0x4b, 0x2e, 0x24, + 0xcb, 0x89, 0x32, 0xe2, 0x4c, 0xb8, 0x93, 0x2e, + 0x24, 0xcb, 0x89, 0x32, 0x81, 0xe5, 0x0e, 0xde, + 0x54, 0xd8, 0x92, 0x79, 0x24, 0x9d, 0x84, 0x15, + 0x31, 0x39, 0x05, 0xf3, 0x82, 0xf8, 0xe5, 0x9e, + 0x3c, 0xb4, 0xc3, 0x3d, 0x4d, 0x28, 0xc6, 0xb3, + 0x89, 0x32, 0xe2, 0x4c, 0xb8, 0x93, 0x2e, 0x24, + 0xcb, 0x89, 0x32, 0xe2, 0x4c, 0xb8, 0x93, 0x23, + 0x7f, 0xe1, 0xdf, 0xc9, 0x97, 0xd9, 0x85, 0xf8, + 0xd1, 0xfe, 0xee, 0xe2, 0x47, 0x47, 0x4f, 0xcb, + 0x99, 0x72, 0xe6, 0x4d, 0x69, 0x6f, 0x09, 0x90, + 0x4c, 0xe8, 0x23, 0x18, 0x87, 0xe1, 0xe4, 0x11, + 0x1b, 0xe2, 0x18, 0x89, 0x21, 0x86, 0x02, 0xa4, + 0x58, 0x8a, 0x77, 0xcc, 0x4f, 0x20, 0x64, 0x36, + 0x49, 0x29, 0xef, 0x1c, 0xa6, 0xb7, 0xd4, 0x4f, + 0x18, 0x96, 0x96, 0x2c, 0x63, 0xb0, 0xa2, 0x23, + 0x82, 0x42, 0x08, 0x9e, 0x11, 0x8d, 0x9a, 0xc3, + 0x01, 0x15, 0x9c, 0x41, 0x14, 0xf2, 0xc1, 0xca, + 0x99, 0x72, 0xe6, 0x5d, 0x37, 0x3c, 0x92, 0x11, + 0xf0, 0xbe, 0xb5, 0x2c, 0x42, 0x77, 0xf6, 0x0b, + 0x7f, 0x60, 0x9b, 0x6f, 0x64, 0xf1, 0xe2, 0x36, + 0xd6, 0x56, 0xe0, 0xab, 0x47, 0x4e, 0x4d, 0x8d, + 0x90, 0xf1, 0xb0, 0xcb, 0x07, 0x41, 0x9b, 0xeb, + 0x0c, 0x67, 0x61, 0x69, 0xd8, 0x9e, 0xc2, 0xd0, + 0x71, 0xe5, 0xb4, 0xb2, 0x85, 0x0d, 0x71, 0x64, + 0x51, 0x1b, 0xeb, 0x05, 0x01, 0xb6, 0x73, 0x46, + 0xfb, 0xcb, 0x28, 0xdf, 0xbf, 0xb0, 0x5b, 0xfb, + 0x04, 0xcb, 0x7b, 0x27, 0xc1, 0xbf, 0xb0, 0x5b, + 0xfb, 0x05, 0xbf, 0xb0, 0x56, 0x19, 0xf9, 0x95, + 0xfc, 0x99, 0x7d, 0x98, 0x5f, 0x89, 0x1f, 0xee, + 0xef, 0x3f, 0x4d, 0xf0, 0x89, 0x90, 0x35, 0x3d, + 0xed, 0x8e, 0xbe, 0x1c, 0xbb, 0x31, 0x16, 0x3f, + 0x1c, 0x89, 0xe0, 0x92, 0x71, 0x26, 0x95, 0x88, + 0x79, 0x25, 0xc1, 0x07, 0x0c, 0xcc, 0xc1, 0x5c, + 0xe9, 0x98, 0xf8, 0x63, 0x82, 0x21, 0xfe, 0x4d, + 0xb0, 0x08, 0xd7, 0xc0, 0x68, 0xc0, 0x41, 0x97, + 0x0a, 0x06, 0x31, 0x8b, 0x71, 0x33, 0xff, 0x00, + 0x7b, 0xc7, 0x92, 0x6b, 0x16, 0x3d, 0xa5, 0x3a, + 0x66, 0x62, 0x39, 0x97, 0x4b, 0xfb, 0x9f, 0x87, + 0x53, 0xfb, 0xcf, 0x80, 0x8d, 0xcc, 0xb5, 0x8d, + 0xef, 0x8e, 0x38, 0xb0, 0xc4, 0xd2, 0x4b, 0xce, + 0x25, 0xab, 0x91, 0xc2, 0xe2, 0xbc, 0x76, 0xfa, + 0xa6, 0x63, 0x33, 0x20, 0x05, 0x95, 0x13, 0x05, + 0x9b, 0x2d, 0x93, 0x30, 0x49, 0x33, 0xcc, 0x2a, + 0x77, 0x95, 0x58, 0x36, 0x5d, 0x91, 0xf2, 0xc7, + 0x8f, 0x3c, 0x0e, 0x64, 0x62, 0x4d, 0x98, 0xb0, + 0xcb, 0x07, 0xce, 0xe1, 0xfe, 0x27, 0xfb, 0xaf, + 0xe4, 0xcb, 0xec, 0xc1, 0xfc, 0x48, 0xff, 0x00, + 0x77, 0x79, 0xfa, 0x6f, 0x86, 0x65, 0x7b, 0xa4, + 0x65, 0x91, 0x71, 0x35, 0xa7, 0x12, 0xd5, 0xde, + 0x77, 0x61, 0x87, 0x13, 0x1c, 0x50, 0x15, 0x30, + 0xa9, 0xc6, 0x90, 0xf9, 0x79, 0xb3, 0x39, 0xd1, + 0xc8, 0xe8, 0x9c, 0xf2, 0xa6, 0x95, 0xcc, 0x9a, + 0x48, 0xf0, 0xd7, 0xb9, 0x89, 0x85, 0x4d, 0x1c, + 0x79, 0x9a, 0x4c, 0xcb, 0x89, 0xa4, 0x6a, 0xc9, + 0xc4, 0xba, 0x28, 0xc9, 0x96, 0x16, 0xfc, 0x3a, + 0x5f, 0xdc, 0xfc, 0x3a, 0x9f, 0xde, 0x7c, 0x22, + 0x95, 0xf0, 0x3f, 0x91, 0x2f, 0x77, 0x99, 0x3e, + 0x66, 0x98, 0x99, 0x89, 0xce, 0x5e, 0xe7, 0x61, + 0x85, 0x4d, 0x1b, 0x1a, 0x44, 0xac, 0x5e, 0xb7, + 0x65, 0xbd, 0xe9, 0x32, 0x88, 0xb6, 0xcc, 0x91, + 0x7a, 0xdd, 0xe9, 0x88, 0xb9, 0xe0, 0x6c, 0x87, + 0xc8, 0xe8, 0x1a, 0x44, 0xac, 0x8b, 0x91, 0x2e, + 0x61, 0x79, 0x53, 0x4a, 0xdf, 0x89, 0xfe, 0xeb, + 0xf9, 0x32, 0xfb, 0x20, 0x7f, 0x12, 0xb0, 0xf7, + 0x77, 0x7f, 0xa5, 0xfa, 0xa2, 0x1e, 0x3c, 0xd6, + 0x34, 0x06, 0xf6, 0x1f, 0x56, 0xde, 0xf8, 0xc0, + 0xc5, 0xea, 0x75, 0x6e, 0x1a, 0xc7, 0xd6, 0x46, + 0xc3, 0xe6, 0xaa, 0x60, 0xe3, 0xb6, 0x99, 0xb2, + 0x4f, 0xad, 0x87, 0x10, 0xfd, 0x5d, 0x2f, 0x8f, + 0xfd, 0x8f, 0x87, 0x53, 0xfb, 0xbf, 0x8d, 0x76, + 0x3b, 0x79, 0x68, 0x98, 0x8e, 0xb7, 0x58, 0x2c, + 0x92, 0xf0, 0xc7, 0x81, 0xa3, 0xca, 0xf1, 0x22, + 0x82, 0x17, 0x5d, 0x0e, 0x4d, 0x53, 0x63, 0x1f, + 0x15, 0x98, 0xca, 0x1c, 0x01, 0x8c, 0x51, 0x83, + 0xc3, 0x3d, 0xc7, 0x3d, 0x96, 0xf0, 0x9e, 0x50, + 0xe1, 0xf2, 0x08, 0x1e, 0x36, 0xb2, 0x4c, 0xd8, + 0x7c, 0x71, 0x8f, 0x9e, 0x4f, 0xf7, 0x5f, 0xc9, + 0x9b, 0xd9, 0x03, 0xf8, 0x95, 0x87, 0xbb, 0xed, + 0x60, 0xc1, 0x66, 0x85, 0xe3, 0xcb, 0xf4, 0xe2, + 0xed, 0xf1, 0x95, 0x92, 0xc6, 0x74, 0x6e, 0xb0, + 0x1a, 0x32, 0xdf, 0x6c, 0xdc, 0xba, 0x7b, 0x7e, + 0xf8, 0xfb, 0x08, 0x9e, 0x54, 0xf6, 0x43, 0xc9, + 0x14, 0x76, 0xa3, 0x40, 0x4d, 0x71, 0xd1, 0x07, + 0xf5, 0xd6, 0x87, 0x9a, 0xda, 0xff, 0x00, 0x85, + 0x90, 0x79, 0xb3, 0x07, 0xe3, 0x11, 0x8d, 0x8e, + 0x08, 0x4a, 0xec, 0x8f, 0x25, 0xa4, 0x6e, 0xce, + 0xd2, 0x3c, 0x42, 0xcb, 0x26, 0x72, 0x71, 0x6b, + 0x88, 0xf3, 0x0d, 0x84, 0x63, 0x97, 0x15, 0xa3, + 0xe2, 0xce, 0x2c, 0x61, 0x62, 0x79, 0x8d, 0xf4, + 0x6d, 0x99, 0xdc, 0x8c, 0x9f, 0x40, 0xf1, 0x1b, + 0x1f, 0x1e, 0x23, 0x30, 0xf2, 0x7e, 0x3d, 0x3f, + 0x5f, 0xdd, 0x22, 0x47, 0xe6, 0x47, 0xff, 0x00, + 0x26, 0x6f, 0x64, 0x07, 0xe2, 0x56, 0x91, 0x7c, + 0xa4, 0x44, 0x32, 0x0b, 0x06, 0xe7, 0xa7, 0xc3, + 0xce, 0x7c, 0x78, 0x45, 0xe3, 0xc2, 0x2f, 0x1e, + 0x11, 0x78, 0xf0, 0x8b, 0xc7, 0x84, 0x5e, 0x3c, + 0x22, 0xf1, 0xe1, 0x17, 0x8f, 0x08, 0xbc, 0x78, + 0x45, 0xe3, 0xc2, 0x2f, 0x1e, 0x11, 0x78, 0xf0, + 0x8b, 0xc7, 0x84, 0x5e, 0x3c, 0x22, 0xf1, 0xe1, + 0x17, 0x8f, 0x08, 0xbc, 0x78, 0x45, 0xe3, 0xc1, + 0xa1, 0x43, 0x0a, 0xbd, 0xcf, 0x7e, 0x64, 0x77, + 0xc1, 0xae, 0xcb, 0x1c, 0x50, 0xc2, 0x58, 0x67, + 0x42, 0x02, 0xd0, 0x82, 0xb4, 0x20, 0xad, 0x08, + 0x2b, 0x42, 0x0a, 0xd0, 0x82, 0xb4, 0x20, 0xad, + 0x08, 0x2b, 0x42, 0x0a, 0xd0, 0x82, 0xb4, 0x20, + 0xad, 0x08, 0x2b, 0x42, 0x0a, 0xd0, 0x82, 0xb4, + 0x20, 0xad, 0x08, 0x2b, 0x42, 0x0a, 0xd0, 0x82, + 0xa3, 0xa8, 0xae, 0x87, 0x32, 0xcf, 0x99, 0x71, + 0xfc, 0x98, 0xa3, 0xcc, 0xb2, 0x1b, 0x8f, 0x4c, + 0x00, 0x7e, 0x24, 0xf6, 0x62, 0x46, 0xcd, 0x56, + 0xf6, 0xe7, 0x5e, 0x42, 0xd7, 0x90, 0xb5, 0xe4, + 0x2d, 0x79, 0x0b, 0x5e, 0x42, 0xd7, 0x90, 0xb5, + 0xe4, 0x2d, 0x79, 0x0b, 0x5e, 0x42, 0xd7, 0x90, + 0xb5, 0xe4, 0x2d, 0x79, 0x0b, 0x5e, 0x42, 0xd7, + 0x90, 0xb5, 0xe4, 0x2d, 0x79, 0x0b, 0x5e, 0x42, + 0xd7, 0x90, 0xb5, 0xe4, 0x2d, 0x79, 0x0b, 0x5e, + 0x42, 0xd7, 0x90, 0xb5, 0xe4, 0x2d, 0x79, 0x0b, + 0x5e, 0x42, 0xd7, 0x90, 0xb5, 0xe4, 0x2d, 0x79, + 0x0b, 0x5e, 0x42, 0xd7, 0x90, 0xb5, 0xe4, 0x2d, + 0x79, 0x0b, 0x5e, 0x42, 0xd7, 0x90, 0xb5, 0xe4, + 0x2d, 0x79, 0x0b, 0x5e, 0x42, 0xd7, 0x90, 0xb5, + 0xe4, 0x2d, 0x79, 0x0b, 0x5e, 0x42, 0xd7, 0x90, + 0xb5, 0xe4, 0x2d, 0x79, 0x0b, 0x5e, 0x42, 0xd7, + 0x90, 0xb5, 0xe4, 0x2d, 0x79, 0x0b, 0x5e, 0x42, + 0xd7, 0x90, 0xb5, 0xe4, 0x2d, 0x79, 0x0b, 0x5e, + 0x42, 0xd7, 0x90, 0xb5, 0xe4, 0x2d, 0x79, 0x0b, + 0x5e, 0x42, 0xd7, 0x90, 0xb5, 0xe4, 0x2d, 0x79, + 0x0b, 0x5e, 0x42, 0xd7, 0x90, 0xb5, 0xe4, 0x2d, + 0x79, 0x0b, 0x5e, 0x42, 0xd7, 0x90, 0xb5, 0xe4, + 0x2d, 0x79, 0x0b, 0x5e, 0x42, 0xd7, 0x90, 0x99, + 0x5b, 0x33, 0xb2, 0x28, 0x6d, 0x1b, 0x07, 0xfe, + 0x22, 0x2c, 0x88, 0x14, 0xad, 0xc9, 0x8b, 0x72, + 0x62, 0xdc, 0x98, 0xb7, 0x26, 0x2d, 0xc9, 0x8b, + 0x72, 0x62, 0xdc, 0x98, 0xb7, 0x26, 0x2d, 0xc9, + 0x8b, 0x72, 0x62, 0xdc, 0x98, 0xb7, 0x26, 0x2d, + 0xc9, 0x8b, 0x72, 0x62, 0xdc, 0x98, 0xb7, 0x26, + 0x2d, 0xc9, 0x8b, 0x72, 0x62, 0xdc, 0x98, 0xb7, + 0x26, 0x2d, 0xc9, 0x8b, 0x72, 0x62, 0xdc, 0x98, + 0xb7, 0x26, 0x2d, 0xc9, 0x8b, 0x72, 0x62, 0xdc, + 0x98, 0xb7, 0x26, 0x2d, 0xc9, 0x8b, 0x72, 0x62, + 0xdc, 0x98, 0xb7, 0x26, 0x2d, 0xc9, 0x8b, 0x72, + 0x62, 0xdc, 0x98, 0xb7, 0x26, 0x2d, 0xc9, 0x8b, + 0x72, 0x62, 0xdc, 0x98, 0xb7, 0x26, 0x2d, 0xc9, + 0x8b, 0x72, 0x62, 0xdc, 0x98, 0xb7, 0x26, 0x2d, + 0xc9, 0x8b, 0x72, 0x62, 0xdc, 0x98, 0xb7, 0x26, + 0x2d, 0xc9, 0x8b, 0x72, 0x62, 0xdc, 0x98, 0xb7, + 0x26, 0x2d, 0xc9, 0x8b, 0x72, 0x62, 0xdc, 0x98, + 0xb7, 0x26, 0x2d, 0xc9, 0x8b, 0x72, 0x62, 0xdc, + 0x98, 0xb7, 0x26, 0x2d, 0xc9, 0x8b, 0x72, 0x62, + 0xdc, 0x98, 0xb7, 0x26, 0x2d, 0xc9, 0x8b, 0x72, + 0x62, 0xdc, 0x98, 0xb7, 0x26, 0x2d, 0xc9, 0x8b, + 0x72, 0x62, 0xdc, 0x98, 0xb7, 0x26, 0x2d, 0xc9, + 0x8b, 0x72, 0x62, 0xdc, 0x98, 0xab, 0x8c, 0x9e, + 0xc0, 0xef, 0xff, 0xc4, 0x00, 0x2f, 0x11, 0x00, + 0x02, 0x01, 0x03, 0x01, 0x06, 0x07, 0x00, 0x02, + 0x02, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x11, 0x02, 0x03, 0x12, 0x51, 0x04, 0x10, + 0x13, 0x20, 0x21, 0x41, 0x14, 0x30, 0x31, 0x32, + 0x33, 0x40, 0x50, 0x22, 0x80, 0x60, 0x71, 0x61, + 0x91, 0xa0, 0xa1, 0xff, 0xda, 0x00, 0x08, 0x01, + 0x03, 0x01, 0x01, 0x3f, 0x01, 0xfe, 0xc2, 0xd5, + 0x7e, 0xdd, 0x1d, 0x1b, 0x3c, 0x55, 0xad, 0x4f, + 0x15, 0x6b, 0x53, 0xc5, 0x5a, 0xd4, 0xf1, 0x56, + 0xb5, 0x3c, 0x55, 0xad, 0x4f, 0x15, 0x6b, 0x53, + 0xc5, 0x5a, 0xd4, 0xf1, 0x56, 0xb5, 0x3c, 0x55, + 0xad, 0x4f, 0x15, 0x6b, 0x53, 0xc5, 0x5a, 0xd4, + 0xf1, 0x56, 0xb5, 0x3c, 0x55, 0xad, 0x4f, 0x15, + 0x6b, 0x53, 0xc5, 0x5a, 0xd4, 0xf1, 0x56, 0xb5, + 0x3c, 0x55, 0xad, 0x4f, 0x15, 0x6b, 0x53, 0xc5, + 0x5a, 0xd4, 0xf1, 0x56, 0xb5, 0x28, 0xb9, 0x45, + 0xcf, 0x6b, 0xfd, 0x7d, 0xaa, 0xeb, 0xa5, 0x62, + 0xbe, 0xb2, 0x6d, 0x39, 0x45, 0x8b, 0x9c, 0x4a, + 0x27, 0x74, 0x92, 0xc9, 0x64, 0xb2, 0x59, 0x2c, + 0x96, 0x4b, 0x25, 0x92, 0xc9, 0x64, 0xb2, 0x59, + 0x2c, 0x96, 0x4b, 0x25, 0x92, 0xc9, 0x64, 0xb2, + 0x59, 0x2f, 0x7b, 0x70, 0x64, 0x64, 0x64, 0x64, + 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, + 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, + 0x64, 0x27, 0xcd, 0xb6, 0x7c, 0x9e, 0x42, 0x52, + 0xe0, 0xbf, 0x6e, 0x8a, 0x54, 0xd1, 0xd8, 0x4a, + 0xdd, 0x36, 0x95, 0x75, 0x53, 0x22, 0xb5, 0x6e, + 0xa7, 0x45, 0x4b, 0xd1, 0x8e, 0xd5, 0x3c, 0x68, + 0xec, 0x5c, 0xb7, 0x4a, 0xb8, 0xd7, 0x62, 0xab, + 0x4b, 0xd3, 0xc9, 0xd8, 0xbd, 0xaf, 0xc9, 0x82, + 0x3c, 0xe5, 0xb9, 0xef, 0x8e, 0x78, 0xdd, 0x1f, + 0x43, 0x6c, 0xf9, 0x3c, 0x8d, 0x99, 0x7f, 0x3c, + 0x9f, 0x62, 0x9a, 0xa8, 0xba, 0xaa, 0xa6, 0x95, + 0x02, 0xb9, 0xc3, 0xb1, 0x4b, 0x83, 0xdd, 0x76, + 0x8a, 0xd7, 0xa0, 0xea, 0x5c, 0x27, 0x57, 0x7f, + 0x42, 0xf7, 0xca, 0xe9, 0x2b, 0x73, 0xd6, 0xa5, + 0x1d, 0x7c, 0x9d, 0x8b, 0xda, 0xfc, 0x95, 0xe7, + 0xaf, 0x35, 0x6f, 0xf5, 0xf3, 0xb6, 0xcf, 0x93, + 0xeb, 0xec, 0x5e, 0xd7, 0xe5, 0x49, 0x24, 0x92, + 0x49, 0x24, 0xf9, 0x14, 0xee, 0x7c, 0xb2, 0x49, + 0x24, 0xee, 0x9d, 0xd2, 0x49, 0x24, 0x92, 0x4f, + 0x97, 0xb6, 0x7c, 0x9c, 0xb6, 0xad, 0xf1, 0x25, + 0xbf, 0x44, 0x55, 0x45, 0xb7, 0x4c, 0xd0, 0xca, + 0x6c, 0xdc, 0xad, 0x4a, 0x45, 0x36, 0xab, 0xab, + 0xd1, 0x0e, 0xc5, 0x4a, 0xde, 0x67, 0x06, 0xbc, + 0x72, 0x83, 0x87, 0x54, 0x27, 0xa9, 0x45, 0x09, + 0x64, 0xab, 0x5d, 0x51, 0xc2, 0xa5, 0xa4, 0xff, + 0x00, 0xec, 0xb8, 0xb1, 0xad, 0xa4, 0x5a, 0xb2, + 0xae, 0x5b, 0x75, 0x77, 0x2d, 0x59, 0x55, 0xd0, + 0xea, 0x65, 0x8b, 0x2a, 0xe7, 0x5a, 0xb9, 0xb6, + 0x2f, 0x6b, 0xdd, 0x04, 0x22, 0x11, 0x08, 0x84, + 0x42, 0x21, 0x10, 0x88, 0x44, 0x22, 0x11, 0x08, + 0x84, 0x42, 0x21, 0x10, 0x88, 0x44, 0x22, 0x11, + 0x08, 0x84, 0x42, 0xdf, 0x12, 0x62, 0x62, 0x62, + 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, + 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, + 0x62, 0x62, 0x44, 0x73, 0x6d, 0x9f, 0x27, 0x2d, + 0x8f, 0xe5, 0x4d, 0x54, 0x77, 0x67, 0x02, 0xa5, + 0x4b, 0xaa, 0xae, 0x83, 0xa6, 0xaa, 0x9d, 0xb7, + 0x47, 0xa1, 0x71, 0xff, 0x00, 0x0a, 0xe3, 0x52, + 0x26, 0xc2, 0xff, 0x00, 0x65, 0x6e, 0x2b, 0xc9, + 0x53, 0x26, 0xcd, 0xfc, 0x69, 0xfe, 0x5d, 0xfd, + 0x0a, 0xb2, 0xa5, 0xb4, 0xcc, 0x9e, 0xa5, 0x0e, + 0x89, 0x9b, 0x85, 0xaa, 0x95, 0x34, 0x4a, 0xf4, + 0x92, 0x30, 0x6e, 0xda, 0xd1, 0x96, 0xb0, 0x75, + 0x2c, 0x6a, 0xf4, 0x2a, 0x49, 0x3e, 0x9c, 0xbb, + 0x17, 0xb5, 0xfe, 0xb6, 0xd9, 0xf2, 0x73, 0x3a, + 0xaa, 0xab, 0xd5, 0x8a, 0xaa, 0x97, 0x44, 0xc9, + 0x71, 0x06, 0x4d, 0x28, 0x93, 0x2a, 0xa2, 0x24, + 0xc9, 0xb1, 0xb6, 0xfa, 0xbd, 0xf2, 0xe2, 0x0c, + 0xea, 0xf5, 0x91, 0x37, 0x4f, 0x55, 0xcd, 0xb1, + 0x7b, 0x5f, 0xeb, 0x6d, 0x9f, 0x27, 0x2d, 0x54, + 0xa5, 0x4a, 0xab, 0x53, 0x87, 0x2a, 0x9c, 0x7b, + 0x95, 0x51, 0x55, 0x3d, 0x59, 0xc3, 0x6e, 0x8c, + 0xca, 0xad, 0xd7, 0x4a, 0x96, 0x8a, 0x52, 0x6f, + 0xa9, 0x55, 0x09, 0x5c, 0xc6, 0x7a, 0x1c, 0x3a, + 0x6a, 0x49, 0xd0, 0x3a, 0x28, 0x87, 0x87, 0x62, + 0xd5, 0xb5, 0x71, 0x32, 0xd5, 0xb5, 0x5c, 0xc9, + 0x5d, 0x2a, 0x98, 0x1d, 0xae, 0xa9, 0x53, 0xa1, + 0x55, 0x15, 0x51, 0xee, 0xe5, 0xd8, 0xbd, 0xaf, + 0xed, 0x4c, 0x19, 0x2d, 0x4c, 0x96, 0xa7, 0xaf, + 0xd9, 0xdb, 0x3e, 0x4e, 0x56, 0x9d, 0x56, 0xe9, + 0x82, 0x85, 0x15, 0x51, 0x4f, 0x7e, 0xa4, 0x35, + 0x69, 0xce, 0xa5, 0xaf, 0x6a, 0xff, 0x00, 0x62, + 0x4e, 0x95, 0x5e, 0x42, 0x53, 0xe8, 0x5c, 0xa1, + 0xd5, 0x76, 0x04, 0xf1, 0xae, 0x95, 0xd9, 0x0a, + 0x97, 0x42, 0xaf, 0x22, 0xd3, 0xc6, 0x96, 0xff, + 0x00, 0xd1, 0x0a, 0x87, 0x8a, 0xef, 0x2f, 0xff, + 0x00, 0x85, 0x77, 0x31, 0x54, 0xa8, 0x5e, 0x85, + 0x74, 0xf1, 0x2b, 0x4d, 0xfa, 0x42, 0x2b, 0x6e, + 0xa7, 0x2f, 0x97, 0x62, 0xf6, 0xbf, 0xb5, 0xb5, + 0xf6, 0x30, 0xa4, 0x85, 0x06, 0xcb, 0xed, 0x7f, + 0x67, 0x6c, 0xf9, 0x39, 0x55, 0x4e, 0x9f, 0x46, + 0x51, 0x5e, 0x35, 0x64, 0xc7, 0x53, 0x7e, 0xa4, + 0xb5, 0xd0, 0x75, 0x37, 0xea, 0xc5, 0x53, 0xa7, + 0xaa, 0x38, 0x95, 0xea, 0x3a, 0xea, 0xab, 0xa3, + 0x63, 0xa9, 0xbf, 0x56, 0x49, 0x93, 0x25, 0xb1, + 0x57, 0x52, 0xf4, 0x63, 0xaa, 0xaa, 0xbd, 0x5f, + 0x2e, 0xc5, 0xed, 0x7f, 0x6a, 0xfd, 0xa7, 0x76, + 0x20, 0xf0, 0xd7, 0x35, 0x3c, 0x35, 0xcf, 0x49, + 0x2c, 0xdb, 0x76, 0xd4, 0x3f, 0xb3, 0xb6, 0x7c, + 0x9f, 0x5f, 0x62, 0xf6, 0xbf, 0xd6, 0xdb, 0x3e, + 0x4f, 0xaf, 0xb1, 0x7b, 0x5f, 0xeb, 0x6d, 0x9f, + 0x27, 0xd7, 0xd8, 0xbd, 0xaf, 0xf5, 0xb6, 0x9b, + 0x55, 0xd7, 0x5c, 0xd2, 0x8e, 0x05, 0xcd, 0x0e, + 0x05, 0xcd, 0x0e, 0x05, 0xcd, 0x0e, 0x05, 0xcd, + 0x0e, 0x05, 0xcd, 0x0e, 0x05, 0xcd, 0x0e, 0x05, + 0xcd, 0x0e, 0x05, 0xcd, 0x0e, 0x05, 0xcd, 0x0e, + 0x05, 0xcd, 0x0e, 0x05, 0xcd, 0x0e, 0x05, 0xcd, + 0x0e, 0x05, 0xdd, 0x0e, 0x05, 0xcd, 0x0e, 0x05, + 0xcd, 0x0e, 0x05, 0xcd, 0x0e, 0x05, 0xcd, 0x0e, + 0x05, 0xcd, 0x0e, 0x05, 0xcd, 0x0e, 0x05, 0xcd, + 0x0e, 0x05, 0xcd, 0x0e, 0x05, 0xcd, 0x0d, 0x96, + 0x8a, 0xa8, 0xa5, 0xe5, 0xfd, 0x01, 0x6f, 0xeb, + 0x27, 0xfb, 0x4b, 0x74, 0x10, 0x41, 0x04, 0x10, + 0x76, 0x3b, 0x10, 0x40, 0xf7, 0x41, 0x1f, 0xe0, + 0x1d, 0xb9, 0x7b, 0x6f, 0xff, 0x00, 0x9f, 0x25, + 0x7e, 0xbb, 0x5c, 0xb3, 0xf4, 0x52, 0xfd, 0x55, + 0xfa, 0xcf, 0x72, 0xdd, 0x04, 0x10, 0x41, 0x03, + 0x18, 0xc8, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, + 0x23, 0x72, 0xfd, 0x67, 0xbe, 0x46, 0x49, 0x3b, + 0xd9, 0x24, 0xef, 0x9e, 0x49, 0x27, 0x74, 0xee, + 0x5f, 0xaf, 0x0c, 0xea, 0x75, 0x3a, 0x9d, 0x4e, + 0xa7, 0x53, 0xa9, 0xd4, 0xea, 0x75, 0x3a, 0x9d, + 0x4e, 0xa7, 0x53, 0xa9, 0xd4, 0xea, 0x75, 0x3a, + 0x9d, 0x4e, 0xa2, 0x5f, 0xd1, 0xe9, 0x24, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x4e, 0x7f, + 0x7e, 0x08, 0x23, 0xcc, 0x5f, 0xbf, 0xdb, 0x93, + 0xbe, 0xe7, 0xe4, 0x2f, 0xdf, 0x9d, 0xd2, 0x49, + 0x22, 0x7e, 0x4d, 0x3f, 0xaf, 0x04, 0x10, 0x41, + 0x04, 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, + 0x41, 0x04, 0x10, 0x41, 0x04, 0x7f, 0x54, 0xdb, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x13, 0xdf, 0x24, + 0xb2, 0x59, 0x2c, 0x96, 0x4b, 0x25, 0x92, 0xc9, + 0x64, 0xb2, 0x59, 0x2c, 0x96, 0x4b, 0x25, 0x92, + 0xc9, 0x64, 0xb2, 0x59, 0x2c, 0x96, 0x4e, 0xf6, + 0xcc, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x85, 0x57, 0x33, + 0xdf, 0x1c, 0xcc, 0x8e, 0x58, 0xf3, 0x23, 0xc8, + 0x8e, 0x48, 0xe5, 0x8d, 0xf4, 0xf9, 0x51, 0xc9, + 0x1f, 0x41, 0xf2, 0x77, 0xe5, 0x7f, 0x4f, 0xb7, + 0x32, 0xf5, 0xdf, 0xdb, 0xc8, 0x7b, 0x97, 0x9e, + 0xbc, 0xf7, 0xbe, 0x49, 0x24, 0x9d, 0xd3, 0xbe, + 0x49, 0x24, 0x6c, 0x92, 0x49, 0x24, 0x92, 0x79, + 0xe7, 0x74, 0x93, 0xba, 0x49, 0xdf, 0x3b, 0xa4, + 0x9d, 0xd3, 0xba, 0x49, 0xdf, 0x4e, 0xe7, 0xe4, + 0xc9, 0x24, 0x92, 0x49, 0x3e, 0x7e, 0x26, 0x26, + 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, + 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, + 0x26, 0x26, 0x24, 0x6f, 0x82, 0x11, 0x08, 0x84, + 0x42, 0x21, 0x10, 0x88, 0x44, 0x22, 0x11, 0x08, + 0x84, 0x42, 0x21, 0x10, 0x88, 0x44, 0x22, 0x11, + 0x08, 0x84, 0x42, 0x21, 0x6f, 0x82, 0x11, 0x08, + 0x84, 0x42, 0x21, 0x10, 0x88, 0x44, 0x22, 0x11, + 0x08, 0x84, 0x42, 0x21, 0x10, 0x88, 0x44, 0x22, + 0x11, 0x08, 0x84, 0x42, 0x21, 0x11, 0xfd, 0xd4, + 0x6c, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0x4f, 0xf5, + 0xdf, 0x24, 0x72, 0xc1, 0x1f, 0xe0, 0x6f, 0x93, + 0xb7, 0x23, 0x3b, 0x6e, 0xed, 0xfe, 0x04, 0xf9, + 0x24, 0x92, 0x49, 0x27, 0x7c, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x3f, 0xb9, 0x08, 0x84, 0x42, 0x21, + 0x10, 0x88, 0x44, 0x22, 0x11, 0x08, 0x84, 0x42, + 0x21, 0x10, 0x88, 0x44, 0x22, 0x11, 0x08, 0x84, + 0x42, 0x21, 0x10, 0xbf, 0xf0, 0x3d, 0xff, 0xc4, + 0x00, 0x38, 0x11, 0x00, 0x01, 0x04, 0x01, 0x02, + 0x04, 0x04, 0x04, 0x05, 0x04, 0x01, 0x04, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x11, + 0x14, 0x12, 0x51, 0x04, 0x13, 0x21, 0x31, 0x22, + 0x32, 0x41, 0x52, 0x10, 0x20, 0x61, 0x62, 0x05, + 0x33, 0x40, 0x50, 0x71, 0x23, 0x30, 0x42, 0x80, + 0x81, 0x43, 0x91, 0xc1, 0xf0, 0xa0, 0xa1, 0xe1, + 0xff, 0xda, 0x00, 0x08, 0x01, 0x02, 0x01, 0x01, + 0x3f, 0x01, 0xff, 0x00, 0x61, 0x59, 0xc3, 0x4b, + 0x22, 0x5a, 0x21, 0x85, 0x36, 0xc6, 0x14, 0xdb, + 0x18, 0x53, 0x6c, 0x61, 0x4d, 0xb1, 0x85, 0x36, + 0xc6, 0x14, 0xdb, 0x18, 0x53, 0x6c, 0x61, 0x4d, + 0xb1, 0x85, 0x36, 0xc6, 0x14, 0xdb, 0x18, 0x53, + 0x6c, 0x61, 0x4d, 0xb1, 0x85, 0x36, 0xc6, 0x14, + 0xdb, 0x18, 0x53, 0x6c, 0x61, 0x4d, 0xb1, 0x85, + 0x36, 0xc6, 0x14, 0xdb, 0x18, 0x53, 0x6c, 0x61, + 0x4d, 0xb1, 0x24, 0x2f, 0x8b, 0xcc, 0x9f, 0xbb, + 0xf0, 0x50, 0x23, 0xd7, 0x5b, 0xbf, 0x4c, 0xa8, + 0x8e, 0x4a, 0x53, 0x88, 0x8b, 0x93, 0x26, 0x9f, + 0x84, 0x9c, 0x52, 0xdf, 0x80, 0xca, 0x90, 0xca, + 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, + 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, + 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, + 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, + 0x90, 0xca, 0x90, 0xca, 0x90, 0x4e, 0x2a, 0x4f, + 0x52, 0x37, 0xa4, 0x8d, 0xb4, 0xf8, 0x4b, 0x3a, + 0x47, 0xd0, 0xcc, 0xfb, 0x4c, 0xcf, 0xb4, 0xcc, + 0xfb, 0x4c, 0xcf, 0xb4, 0xcc, 0xfb, 0x4c, 0xcf, + 0xb4, 0xcc, 0xfb, 0x4c, 0xcf, 0xb4, 0xcc, 0xfb, + 0x4c, 0xcf, 0xb4, 0xcc, 0xfb, 0x4c, 0xcf, 0xb4, + 0xcc, 0xfb, 0x4c, 0xcf, 0xb4, 0xcc, 0xfb, 0x4c, + 0xcf, 0xb4, 0xcc, 0xfb, 0x4c, 0xcf, 0xb4, 0xcc, + 0xfb, 0x4c, 0xcf, 0xb4, 0xcc, 0xfb, 0x48, 0xb8, + 0x84, 0x91, 0x69, 0x7a, 0x7c, 0xdc, 0x07, 0xe5, + 0x7f, 0x61, 0x57, 0x4a, 0x5a, 0x9c, 0x34, 0xd2, + 0x39, 0xd5, 0x27, 0xaf, 0x54, 0x1c, 0xe9, 0x5f, + 0x33, 0x98, 0xc7, 0x55, 0x0b, 0x34, 0xac, 0x6b, + 0xda, 0xab, 0xd5, 0x04, 0x9d, 0xdc, 0x8d, 0x5f, + 0xe5, 0xd8, 0x86, 0x67, 0xba, 0x24, 0x5f, 0x55, + 0x19, 0x33, 0xbb, 0xff, 0x00, 0xcf, 0xfc, 0x7d, + 0x3f, 0xb3, 0xf8, 0x87, 0x9d, 0x07, 0xf9, 0x54, + 0xd2, 0x69, 0x34, 0x9a, 0x4d, 0x26, 0x93, 0x49, + 0x1c, 0x3c, 0xcb, 0x19, 0x0e, 0xbb, 0x34, 0x2f, + 0x73, 0x42, 0xa9, 0xa1, 0x7b, 0x9a, 0x15, 0x4d, + 0x0a, 0x68, 0x5e, 0xc6, 0x93, 0x49, 0xa4, 0xd2, + 0x69, 0x34, 0x9a, 0x4e, 0x17, 0xb2, 0xfc, 0x24, + 0x4b, 0x7a, 0x9a, 0x4d, 0x22, 0x70, 0xea, 0xa9, + 0x76, 0x2b, 0x15, 0xab, 0x4a, 0x69, 0x34, 0x9a, + 0x4d, 0x26, 0x91, 0xd0, 0xab, 0x52, 0xc4, 0x62, + 0xb9, 0x69, 0x07, 0x40, 0xe6, 0xa5, 0x8e, 0x8f, + 0x4d, 0x1a, 0x4d, 0x23, 0xe3, 0xd0, 0xb4, 0x2b, + 0x13, 0xd0, 0xd2, 0x69, 0x34, 0x9a, 0x44, 0x4a, + 0xeb, 0xf3, 0x70, 0x1f, 0x95, 0xfd, 0x8e, 0x2d, + 0xd5, 0x1e, 0x94, 0xf5, 0xe8, 0x39, 0x8f, 0x81, + 0xcc, 0x7b, 0x9d, 0x68, 0x9d, 0x05, 0x8f, 0x9b, + 0xc4, 0xb9, 0x2e, 0x8e, 0x8c, 0x86, 0x48, 0xd7, + 0xcc, 0x23, 0x17, 0x9e, 0x8c, 0xf4, 0xee, 0x70, + 0xf7, 0xc9, 0x6b, 0x93, 0xea, 0x46, 0xdd, 0x3d, + 0x1a, 0xb6, 0xaa, 0x95, 0xfc, 0x7f, 0xf8, 0x27, + 0x4f, 0xec, 0x7e, 0x21, 0xe7, 0x41, 0xfe, 0x55, + 0x2c, 0xb2, 0xcb, 0x2c, 0xb2, 0xc8, 0x9d, 0x4d, + 0x72, 0x9e, 0x55, 0xaf, 0xe4, 0xd4, 0x8d, 0xd2, + 0x23, 0xa9, 0xad, 0xa1, 0x5d, 0x7a, 0xd0, 0xb5, + 0x45, 0x62, 0x34, 0x95, 0xda, 0x5b, 0xd0, 0x6a, + 0xda, 0x24, 0x9b, 0x16, 0x59, 0x65, 0x96, 0x59, + 0x67, 0x0d, 0xeb, 0xf0, 0x7f, 0x99, 0x7e, 0x2e, + 0xd1, 0x4d, 0xd4, 0xa6, 0xbb, 0xd4, 0xf4, 0x3c, + 0xcc, 0xfe, 0x4e, 0x96, 0x9f, 0x41, 0x15, 0x1a, + 0xd4, 0x5b, 0xee, 0x6a, 0x46, 0xb1, 0x55, 0xbb, + 0x8c, 0x4d, 0x6e, 0xa1, 0xde, 0x34, 0xb4, 0xec, + 0x43, 0xea, 0x36, 0xfd, 0x04, 0xf4, 0x5f, 0xa0, + 0x9f, 0xd4, 0x6a, 0x2b, 0xb7, 0x1e, 0xf5, 0x5b, + 0x6d, 0x12, 0x74, 0x45, 0x54, 0xee, 0x27, 0xa7, + 0xf0, 0x27, 0x8d, 0xa8, 0xab, 0xb9, 0xaa, 0xf5, + 0xa7, 0xf6, 0x78, 0x0f, 0xca, 0xfd, 0x3f, 0xe2, + 0x1e, 0x74, 0x1c, 0x96, 0x94, 0x2f, 0x4e, 0x8a, + 0x59, 0x65, 0x96, 0x59, 0x62, 0x3d, 0x51, 0x28, + 0xe6, 0xba, 0xee, 0xc4, 0x99, 0xe8, 0x94, 0x8a, + 0x73, 0x16, 0x91, 0x0e, 0x6b, 0xba, 0xfd, 0x44, + 0x99, 0xed, 0x4a, 0x45, 0x39, 0x8a, 0xa9, 0x42, + 0xc8, 0xd6, 0xc7, 0xa5, 0xab, 0xdc, 0xb2, 0xcb, + 0x2c, 0xb2, 0xcb, 0x38, 0x54, 0x5d, 0x37, 0xf0, + 0x97, 0xa3, 0xd4, 0xb2, 0xc7, 0x48, 0xae, 0xa1, + 0xb2, 0x2b, 0x3b, 0x1c, 0xf7, 0x6a, 0xd4, 0x24, + 0xca, 0x97, 0xf5, 0x1b, 0x32, 0xb5, 0x28, 0xe6, + 0xaa, 0xa5, 0x0d, 0x7a, 0xb5, 0x6d, 0x0c, 0x85, + 0xd8, 0x47, 0xab, 0x56, 0xd0, 0x74, 0xee, 0x72, + 0x51, 0xce, 0x77, 0x4f, 0xa0, 0xe9, 0x95, 0xc3, + 0xa7, 0x73, 0x92, 0x8e, 0x7a, 0xdd, 0x9c, 0xf5, + 0x12, 0x45, 0xad, 0x23, 0xa4, 0x44, 0x45, 0xb5, + 0x42, 0xcb, 0x13, 0xaa, 0xd2, 0x7c, 0xdc, 0x07, + 0xe5, 0x7c, 0xb3, 0xcd, 0xca, 0xa4, 0x44, 0xb5, + 0x51, 0x92, 0x4c, 0x8f, 0x46, 0xc8, 0xde, 0xfb, + 0x0f, 0xe2, 0x22, 0x62, 0xe9, 0x72, 0x8e, 0x9e, + 0x36, 0x79, 0x94, 0x4e, 0x25, 0xae, 0x97, 0x96, + 0x73, 0xe3, 0xd5, 0xa2, 0xfa, 0x9c, 0xd6, 0x5a, + 0xa5, 0xf6, 0x24, 0x91, 0xcb, 0xa5, 0xd1, 0xaf, + 0x45, 0xfa, 0x0b, 0x3b, 0xda, 0xae, 0x6f, 0xfd, + 0x88, 0x9c, 0xae, 0x62, 0x39, 0x49, 0xb8, 0x87, + 0x45, 0x2a, 0x37, 0xd0, 0x9b, 0x88, 0x74, 0x72, + 0x35, 0x8d, 0x38, 0x9e, 0x21, 0x61, 0xe8, 0xde, + 0xff, 0x00, 0x37, 0xe2, 0x1e, 0x74, 0xf8, 0x3a, + 0x26, 0x3f, 0xcc, 0x86, 0x34, 0x5b, 0x18, 0xd1, + 0x6c, 0x63, 0x45, 0xb1, 0x8d, 0x16, 0xc6, 0x34, + 0x5b, 0x18, 0xd1, 0x6c, 0x63, 0x45, 0xb1, 0x8d, + 0x16, 0xc6, 0x34, 0x5b, 0x18, 0xd1, 0x6c, 0x63, + 0x45, 0xb1, 0x8d, 0x16, 0xc6, 0x34, 0x5b, 0x18, + 0xd1, 0x6c, 0x63, 0x45, 0xb1, 0x8d, 0x16, 0xc6, + 0x34, 0x5b, 0x18, 0xd1, 0x6c, 0x63, 0x45, 0xb1, + 0x8d, 0x16, 0xc2, 0x70, 0xf1, 0x27, 0xa7, 0xc6, + 0x48, 0x5b, 0x2f, 0x73, 0x0d, 0x9b, 0xa9, 0x86, + 0xcd, 0xd4, 0xc3, 0x66, 0xea, 0x61, 0xb3, 0x75, + 0x30, 0xd9, 0xba, 0x98, 0x6c, 0xdd, 0x4c, 0x36, + 0x6e, 0xa6, 0x1b, 0x37, 0x53, 0x0d, 0x9b, 0xa9, + 0x86, 0xcd, 0xd4, 0xc3, 0x66, 0xea, 0x61, 0xb3, + 0x75, 0x30, 0xd9, 0xba, 0x98, 0x6c, 0xdd, 0x4c, + 0x36, 0x6e, 0xa6, 0x1b, 0x37, 0x53, 0x0d, 0x9b, + 0xa9, 0x86, 0xcd, 0xd4, 0xc3, 0x66, 0xea, 0x61, + 0xb3, 0x75, 0x30, 0xd9, 0xba, 0x91, 0xc0, 0xc8, + 0xfa, 0xa7, 0xcd, 0xc0, 0x7e, 0x57, 0xcb, 0xc4, + 0xf8, 0x1e, 0xc9, 0x17, 0xb2, 0x19, 0x2c, 0x57, + 0xa3, 0x19, 0xd4, 0x6b, 0x98, 0xc4, 0x95, 0x24, + 0xee, 0x42, 0xdf, 0xea, 0x47, 0xab, 0x61, 0x16, + 0xb8, 0x97, 0x7f, 0x04, 0x69, 0x71, 0xe9, 0x73, + 0xeb, 0xaf, 0x6a, 0x38, 0xbf, 0x13, 0xfc, 0x3e, + 0x9d, 0xff, 0x00, 0x81, 0xba, 0x5e, 0xd4, 0x54, + 0xec, 0x69, 0x6e, 0xc4, 0x89, 0x25, 0x22, 0x44, + 0x4c, 0xc5, 0x7c, 0x9a, 0x5d, 0xdf, 0x49, 0x6b, + 0x22, 0x24, 0xab, 0xea, 0xe4, 0x26, 0xe6, 0x23, + 0x1d, 0xad, 0xbd, 0xfd, 0x46, 0xaa, 0xaa, 0x5a, + 0xa5, 0x7c, 0xbf, 0x88, 0x79, 0xd3, 0xf7, 0x6e, + 0x03, 0xf2, 0xbe, 0x5e, 0xe3, 0x58, 0xd6, 0xf9, + 0x50, 0x56, 0x35, 0xcb, 0x6a, 0x86, 0x94, 0xbb, + 0x34, 0xb5, 0x56, 0xe8, 0xd0, 0xdb, 0xd5, 0x5d, + 0x4d, 0x2d, 0x4e, 0xc8, 0x23, 0x51, 0xa9, 0x49, + 0xf1, 0xd2, 0x97, 0x66, 0x86, 0xd5, 0x50, 0xad, + 0x47, 0x74, 0x5f, 0x9b, 0xf1, 0x0f, 0x3a, 0x7e, + 0xed, 0xc0, 0x7e, 0x57, 0xca, 0xd7, 0xaa, 0xbd, + 0xcd, 0xd8, 0xe6, 0xd2, 0xbb, 0x57, 0x64, 0x1b, + 0x23, 0x5e, 0xb4, 0x82, 0xca, 0x89, 0x27, 0x2c, + 0x6c, 0xcc, 0x7a, 0xd3, 0x54, 0x7a, 0xaa, 0x27, + 0x85, 0x06, 0xc8, 0xe5, 0x8b, 0x5d, 0x75, 0x39, + 0xae, 0x62, 0xaa, 0x49, 0xb5, 0x8d, 0x92, 0x44, + 0x54, 0xd7, 0xea, 0x4d, 0x2a, 0xc4, 0xad, 0x27, + 0x95, 0x63, 0xaa, 0xf5, 0x23, 0x7a, 0xbf, 0x55, + 0xfa, 0x28, 0xd9, 0xba, 0x2a, 0xbb, 0x71, 0x92, + 0x36, 0x4f, 0x2f, 0xcb, 0xf8, 0x87, 0x9d, 0x3f, + 0x54, 0x88, 0xab, 0xd8, 0xd0, 0xed, 0x8d, 0x0e, + 0xd8, 0xaa, 0xfd, 0x4f, 0x01, 0xf9, 0x5f, 0x2a, + 0x39, 0x19, 0x33, 0xb5, 0x7a, 0xd0, 0xf5, 0x47, + 0x32, 0x47, 0xfa, 0x5a, 0x7f, 0xe0, 0xb4, 0x74, + 0xcd, 0xd3, 0xb1, 0x3f, 0x99, 0xc8, 0x9e, 0xd1, + 0x5c, 0xd7, 0x2c, 0x7a, 0x7f, 0xf7, 0xa0, 0xaa, + 0x89, 0xdc, 0x86, 0x46, 0xb2, 0x04, 0x55, 0x15, + 0xba, 0xd8, 0xe5, 0x55, 0xf1, 0x2a, 0x0e, 0x7a, + 0x48, 0xac, 0xd3, 0xfc, 0x93, 0x37, 0x5b, 0x9a, + 0xd5, 0xfa, 0x96, 0xb2, 0x37, 0x52, 0xfa, 0x52, + 0x7f, 0xf7, 0xd4, 0x8e, 0x2d, 0x6a, 0xf5, 0xb5, + 0xee, 0x31, 0xfc, 0xa8, 0xd5, 0x13, 0xbd, 0xa9, + 0x1b, 0x51, 0xad, 0xa4, 0xf9, 0x7f, 0x10, 0xf3, + 0xa7, 0xea, 0xb8, 0x0f, 0xf2, 0x39, 0x8f, 0xa5, + 0xff, 0x00, 0xdf, 0xfc, 0x96, 0xb6, 0x71, 0xde, + 0x74, 0xfd, 0x4f, 0x01, 0xf9, 0x5f, 0x2b, 0x9a, + 0xd7, 0x79, 0x90, 0x91, 0x9a, 0x99, 0xa5, 0xa2, + 0x35, 0xad, 0xec, 0x82, 0xb5, 0x15, 0x6d, 0x44, + 0x63, 0x5b, 0xd5, 0x10, 0x73, 0x51, 0xdd, 0x1c, + 0x87, 0x2a, 0x3e, 0xda, 0x50, 0x6c, 0x6c, 0x6f, + 0x56, 0xa0, 0x8d, 0x6b, 0x7a, 0xa2, 0x14, 0x9d, + 0xcd, 0x29, 0xb0, 0x88, 0x89, 0xd8, 0x58, 0xd8, + 0xbd, 0xd0, 0x6b, 0x1a, 0xcf, 0x2a, 0x57, 0xcb, + 0xf8, 0x87, 0x9d, 0x3f, 0x55, 0xc3, 0x4e, 0x90, + 0xdd, 0x99, 0x91, 0x6c, 0x66, 0x45, 0x77, 0x47, + 0x11, 0x32, 0x4c, 0xeb, 0x4f, 0xd4, 0xf0, 0x1f, + 0x95, 0xfa, 0x7f, 0xc4, 0x3c, 0xe9, 0xfb, 0xb7, + 0x01, 0xf9, 0x5f, 0xa7, 0xfc, 0x43, 0xce, 0x9f, + 0xbb, 0x70, 0x1f, 0x95, 0xfa, 0x7f, 0xc4, 0x3c, + 0xe9, 0xfb, 0xb7, 0x07, 0x34, 0x6c, 0x8e, 0x9c, + 0xa6, 0x4c, 0x3e, 0xe3, 0x26, 0x1f, 0x71, 0x93, + 0x0f, 0xb8, 0xc9, 0x87, 0xdc, 0x64, 0xc3, 0xee, + 0x32, 0x61, 0xf7, 0x19, 0x30, 0xfb, 0x8c, 0x98, + 0x7d, 0xc6, 0x4c, 0x3e, 0xe3, 0x26, 0x1f, 0x71, + 0x93, 0x0f, 0xb8, 0xc9, 0x87, 0xdc, 0x64, 0xc3, + 0xee, 0x32, 0x61, 0xf7, 0x19, 0x30, 0xfb, 0x8c, + 0x98, 0x7d, 0xc6, 0x4c, 0x3e, 0xe3, 0x26, 0x1f, + 0x71, 0x93, 0x0f, 0xb8, 0xc9, 0x87, 0xdc, 0x64, + 0xc3, 0xee, 0x32, 0x61, 0xf7, 0x1c, 0x6c, 0x8d, + 0x91, 0xc9, 0xa5, 0x7f, 0xd0, 0x19, 0xe5, 0x72, + 0xba, 0x90, 0xb5, 0xdc, 0xb7, 0x6e, 0x5b, 0xb7, + 0x2d, 0xdb, 0x96, 0xed, 0xcb, 0x76, 0xe5, 0xbb, + 0x72, 0xdd, 0xb9, 0x6e, 0xdc, 0xb7, 0x6e, 0x5b, + 0xb7, 0x2d, 0xdb, 0x96, 0xed, 0xcb, 0x76, 0xe5, + 0xbb, 0x72, 0xdd, 0xb9, 0x6e, 0xdc, 0xb7, 0x6e, + 0x5b, 0xb7, 0x2d, 0xdb, 0x96, 0xed, 0xce, 0x1e, + 0x57, 0x6a, 0xd2, 0xef, 0xdd, 0xde, 0x9e, 0x25, + 0x28, 0xa2, 0x26, 0x22, 0xbb, 0xa8, 0xf4, 0xe9, + 0x4e, 0x6d, 0x1c, 0x9f, 0x12, 0xa1, 0xc9, 0x4a, + 0xea, 0xa3, 0xe2, 0x4a, 0x4d, 0x23, 0xa1, 0xa4, + 0xe8, 0xa6, 0x3f, 0xa5, 0x8e, 0x8f, 0x4a, 0x5a, + 0x1a, 0x11, 0x62, 0xfa, 0x8a, 0xc4, 0x48, 0xbe, + 0xa7, 0x23, 0xd2, 0xfa, 0x8d, 0x8b, 0xa5, 0xaa, + 0x93, 0x33, 0xaa, 0xb8, 0x63, 0x34, 0x3b, 0xfe, + 0x06, 0xc5, 0x69, 0x6a, 0xa2, 0x45, 0xea, 0xe5, + 0x15, 0x94, 0xb4, 0x51, 0x44, 0x69, 0xe3, 0x4f, + 0xdd, 0xde, 0xbe, 0x25, 0x2c, 0xb1, 0x9a, 0x55, + 0x7c, 0x4a, 0x39, 0xda, 0x58, 0xa8, 0xae, 0xb1, + 0x5f, 0xfd, 0x2d, 0x43, 0x1c, 0x95, 0xd5, 0x7a, + 0x0a, 0xf6, 0xf8, 0x5d, 0x64, 0x8f, 0xe8, 0xbe, + 0x23, 0x5a, 0x73, 0x17, 0xaf, 0xa0, 0xae, 0x4e, + 0x5a, 0x0d, 0x7a, 0x53, 0x47, 0x48, 0x8a, 0x8e, + 0x35, 0x37, 0x5f, 0x32, 0xcd, 0x4d, 0x7b, 0x53, + 0xaf, 0x61, 0xee, 0x6b, 0xad, 0x2c, 0xd6, 0xdd, + 0x5d, 0xfd, 0x06, 0xbe, 0xd8, 0x88, 0x8b, 0x43, + 0x5f, 0xde, 0x9c, 0x48, 0xe6, 0xea, 0xf0, 0x96, + 0x59, 0x1a, 0xf8, 0xd3, 0xf5, 0xf6, 0x5a, 0x16, + 0x85, 0xa1, 0x68, 0x5a, 0x16, 0x85, 0xa1, 0x68, + 0x5a, 0x16, 0x85, 0xa1, 0x68, 0x5a, 0x16, 0x85, + 0xa1, 0x68, 0x5a, 0x16, 0x85, 0xa1, 0x68, 0x5a, + 0x7c, 0x67, 0x89, 0xcd, 0x75, 0xa2, 0x74, 0x3a, + 0x9d, 0x4e, 0xa7, 0x51, 0xf2, 0x39, 0xfe, 0x87, + 0x53, 0xa9, 0xd4, 0xea, 0x75, 0x3a, 0x9d, 0x4e, + 0xa7, 0x53, 0xa9, 0xd4, 0xea, 0x75, 0x3a, 0x9d, + 0x4e, 0xa7, 0x0f, 0x13, 0x95, 0xda, 0x9d, 0xfa, + 0xe9, 0x1d, 0xa5, 0xaa, 0xa3, 0x95, 0x5e, 0xb6, + 0xa5, 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, + 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, + 0x1c, 0x33, 0xd5, 0x7c, 0x2b, 0xfb, 0xb4, 0xde, + 0x45, 0x28, 0x8b, 0xca, 0xba, 0x7b, 0x8a, 0xdd, + 0x6e, 0x44, 0x7a, 0x09, 0x12, 0x57, 0x53, 0x96, + 0xc4, 0x5a, 0x1d, 0x1a, 0x3a, 0x45, 0x39, 0x29, + 0x69, 0xf5, 0x39, 0x4c, 0xab, 0x24, 0x66, 0x95, + 0xa2, 0x56, 0xeb, 0x54, 0x25, 0x44, 0x72, 0xa0, + 0xb1, 0x37, 0xa2, 0xa0, 0xb1, 0x37, 0xaa, 0x27, + 0xa0, 0xd8, 0x9a, 0xef, 0xe4, 0x48, 0x9b, 0xd1, + 0x17, 0xba, 0x89, 0x12, 0x75, 0x55, 0x39, 0x28, + 0x97, 0x7e, 0x87, 0x25, 0x96, 0x9f, 0x51, 0x21, + 0x4a, 0xea, 0x72, 0x9a, 0x88, 0xaa, 0xe1, 0xb1, + 0xb5, 0xaf, 0x15, 0x13, 0xd0, 0xe1, 0xd3, 0xc7, + 0xfb, 0xb4, 0xde, 0x45, 0x2c, 0x62, 0xb1, 0x52, + 0x9c, 0x3e, 0x44, 0xe8, 0x8d, 0xf4, 0x26, 0x72, + 0x23, 0x91, 0x0e, 0x6b, 0x51, 0x3b, 0xd9, 0xcd, + 0x6a, 0x3d, 0x56, 0xfb, 0x89, 0x23, 0x51, 0xc9, + 0xe2, 0xb3, 0x98, 0x9a, 0x15, 0x09, 0x5e, 0x8e, + 0x77, 0x43, 0x9c, 0xdd, 0x4a, 0x24, 0xad, 0x45, + 0x69, 0xcc, 0x6d, 0x55, 0x9c, 0xc6, 0xea, 0x72, + 0x89, 0x33, 0x12, 0x96, 0xc4, 0x56, 0xb9, 0xcd, + 0x39, 0x89, 0xd5, 0xaa, 0xb5, 0xd4, 0xe6, 0x36, + 0x9d, 0xd4, 0xe6, 0x36, 0xda, 0x73, 0x5a, 0xa9, + 0x57, 0x42, 0xc8, 0x9a, 0x15, 0x0e, 0x6b, 0x75, + 0x27, 0xf0, 0x2a, 0xec, 0x70, 0xcb, 0xe3, 0xfd, + 0xd9, 0xcd, 0xd4, 0x94, 0x3a, 0x19, 0x1a, 0xb5, + 0x47, 0x2e, 0x4f, 0x68, 0xd6, 0xca, 0xd5, 0xb4, + 0x41, 0x59, 0x2a, 0xad, 0xaa, 0x1c, 0xb9, 0x3d, + 0xa7, 0x2e, 0x4f, 0x69, 0xcb, 0x93, 0xda, 0x72, + 0xe4, 0xf6, 0x9c, 0xb9, 0x3d, 0xa7, 0x2e, 0x4f, + 0x69, 0xcb, 0x93, 0xda, 0x72, 0xe4, 0xf6, 0x9c, + 0xb9, 0x3d, 0xa7, 0x2e, 0x4f, 0x68, 0x9c, 0xf4, + 0x4a, 0x44, 0x39, 0x72, 0x7b, 0x4e, 0x5c, 0x9e, + 0xd3, 0x97, 0x27, 0xb4, 0xe5, 0xc9, 0xed, 0x39, + 0x72, 0x7b, 0x4e, 0x5c, 0x9e, 0xd3, 0x95, 0x27, + 0xb4, 0xe1, 0xe1, 0x56, 0x78, 0x9d, 0xdf, 0xfd, + 0x1e, 0x7f, 0x15, 0x4b, 0x4d, 0x32, 0xdf, 0xb1, + 0x96, 0xfd, 0x8c, 0xb7, 0xec, 0x65, 0xbf, 0x63, + 0x2d, 0xfb, 0x19, 0x6f, 0xd8, 0xcb, 0x7e, 0xc6, + 0x5b, 0xf6, 0x32, 0xdf, 0xb1, 0x96, 0xfd, 0x8c, + 0xb7, 0xec, 0x65, 0xbf, 0x63, 0x2d, 0xfb, 0x19, + 0x6f, 0xd8, 0xcb, 0x7e, 0xc6, 0x5b, 0xf6, 0x32, + 0xdf, 0xb1, 0x96, 0xfd, 0x8c, 0xb7, 0xec, 0x65, + 0xbf, 0x63, 0x2d, 0xfb, 0x11, 0x4a, 0x92, 0xa7, + 0xee, 0xcf, 0xf2, 0xa9, 0x45, 0x14, 0x51, 0x45, + 0x14, 0x50, 0x90, 0xa2, 0xb7, 0x52, 0xa8, 0xf8, + 0xd5, 0x8a, 0x32, 0x2b, 0x72, 0x23, 0x85, 0x62, + 0xa1, 0xa1, 0x6e, 0xa8, 0xd0, 0xaa, 0x2b, 0x6b, + 0xb9, 0x45, 0x14, 0x51, 0x45, 0x14, 0x70, 0xde, + 0x6f, 0xdd, 0x9f, 0xe5, 0x52, 0xcb, 0x2c, 0xb2, + 0xcb, 0x2c, 0xb1, 0x7f, 0x2d, 0xa2, 0x77, 0x62, + 0x28, 0xc7, 0x22, 0xaf, 0xa9, 0x6a, 0xad, 0x76, + 0xa3, 0xfe, 0xb1, 0x6a, 0x8c, 0x6e, 0x92, 0x6f, + 0x3a, 0x96, 0x59, 0x65, 0x96, 0x59, 0x67, 0x0f, + 0xe6, 0xfd, 0xd9, 0xc9, 0x68, 0x5d, 0x16, 0x59, + 0x65, 0x96, 0x59, 0x63, 0x67, 0x7b, 0x52, 0x91, + 0x4e, 0x62, 0xdd, 0x9c, 0xf7, 0xaa, 0xdd, 0x8b, + 0x2b, 0x9c, 0x94, 0xaa, 0x73, 0xdf, 0xb9, 0x1c, + 0x8d, 0x46, 0xd2, 0xba, 0x89, 0x24, 0xd6, 0xe5, + 0x52, 0xcb, 0x2c, 0xb2, 0xcb, 0x2c, 0xe1, 0x51, + 0x55, 0x55, 0x7f, 0x77, 0x7c, 0x2c, 0x7f, 0x55, + 0x43, 0x16, 0x33, 0x16, 0x33, 0x16, 0x33, 0x16, + 0x33, 0x16, 0x33, 0x16, 0x33, 0x16, 0x33, 0x16, + 0x33, 0x16, 0x33, 0x16, 0x33, 0x16, 0x33, 0x16, + 0x33, 0x16, 0x33, 0x16, 0x33, 0x16, 0x33, 0x16, + 0x33, 0x16, 0x33, 0x16, 0x33, 0x16, 0x33, 0x16, + 0x33, 0x16, 0x2d, 0x84, 0x44, 0x6a, 0x52, 0x7f, + 0xaa, 0x52, 0xcc, 0x91, 0x99, 0x8b, 0xb1, 0x98, + 0xbb, 0x19, 0x8b, 0xb1, 0x98, 0xbb, 0x19, 0x8b, + 0xb1, 0x98, 0xbb, 0x19, 0x8b, 0xb1, 0x98, 0xbb, + 0x19, 0x8b, 0xb1, 0x98, 0xbb, 0x19, 0x8b, 0xb1, + 0x98, 0xbb, 0x19, 0x8b, 0xb1, 0x98, 0xbb, 0x19, + 0x8b, 0xb1, 0x98, 0xbb, 0x19, 0x8b, 0xb1, 0x98, + 0xbb, 0x19, 0x8b, 0xb1, 0x98, 0xbb, 0x19, 0x8b, + 0xb1, 0x17, 0x10, 0x92, 0x2d, 0x2f, 0xc5, 0xfc, + 0x52, 0xdd, 0x30, 0xca, 0x90, 0xca, 0x90, 0xca, + 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, + 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, + 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, + 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, 0x90, 0xca, + 0x90, 0xca, 0x90, 0x4e, 0x2a, 0x4f, 0x52, 0x37, + 0xa4, 0x8d, 0xb4, 0xf8, 0x4b, 0xc4, 0x68, 0x5a, + 0x43, 0x2d, 0xfb, 0x19, 0x6f, 0xd8, 0xcb, 0x7e, + 0xc6, 0x5b, 0xf6, 0x32, 0xdf, 0xb1, 0x96, 0xfd, + 0x8c, 0xb7, 0xec, 0x65, 0xbf, 0x63, 0x2d, 0xfb, + 0x19, 0x6f, 0xd8, 0xcb, 0x7e, 0xc6, 0x5b, 0xf6, + 0x32, 0xdf, 0xb1, 0x96, 0xfd, 0x8c, 0xb7, 0xec, + 0x65, 0xbf, 0x63, 0x2d, 0xfb, 0x19, 0x6f, 0xd8, + 0xcb, 0x7e, 0xc6, 0x5b, 0xf6, 0x32, 0xdf, 0xb1, + 0x17, 0x13, 0xad, 0x69, 0xdf, 0x34, 0xc9, 0xfd, + 0x45, 0x28, 0x64, 0x5a, 0xc7, 0x43, 0x49, 0xa9, + 0xab, 0x66, 0x85, 0xab, 0x39, 0x6e, 0xd8, 0x48, + 0x95, 0x5b, 0xa8, 0x56, 0x2a, 0x77, 0x34, 0x2a, + 0x75, 0x24, 0x8d, 0x18, 0xea, 0x43, 0x90, 0xda, + 0x4b, 0x70, 0xe8, 0xd5, 0x1d, 0xa4, 0xd0, 0xa7, + 0x2f, 0xa7, 0x6e, 0xa6, 0x85, 0x4f, 0x41, 0xd1, + 0x52, 0x26, 0x91, 0x18, 0xab, 0xd8, 0xd0, 0xa6, + 0x85, 0xd8, 0xe5, 0xa6, 0x8d, 0x42, 0xb1, 0x53, + 0xb9, 0x43, 0x52, 0x97, 0xe0, 0xff, 0x00, 0x2a, + 0x94, 0x69, 0x31, 0xd3, 0xb6, 0xae, 0xa6, 0x85, + 0xba, 0x34, 0x29, 0xcb, 0x5d, 0x8d, 0x0a, 0xa6, + 0x85, 0x34, 0x2f, 0x71, 0x91, 0xeb, 0x75, 0x0b, + 0x02, 0x57, 0x85, 0x4d, 0x0b, 0xdc, 0xd0, 0xa3, + 0xa3, 0xeb, 0xe1, 0x41, 0x91, 0xdb, 0xb4, 0xb8, + 0x56, 0x2a, 0x1a, 0x16, 0xac, 0xd0, 0xa2, 0xb1, + 0x53, 0xb8, 0xf8, 0xa9, 0xd4, 0xd3, 0x4d, 0x14, + 0x70, 0xbd, 0x97, 0xe1, 0x22, 0x78, 0xd4, 0xa2, + 0x8a, 0x28, 0xa2, 0x8a, 0x23, 0x8b, 0x5a, 0x8b, + 0x1a, 0xdd, 0x0a, 0xc5, 0x4e, 0xe2, 0xb1, 0x53, + 0xb9, 0x24, 0x7a, 0x5d, 0x48, 0x68, 0x54, 0xee, + 0x68, 0x54, 0xf4, 0x28, 0xa2, 0x8a, 0x28, 0xa2, + 0x8a, 0xf9, 0xa5, 0xf3, 0xaf, 0xc2, 0x3e, 0xac, + 0x72, 0x20, 0x8d, 0x5a, 0xb2, 0xd7, 0x9b, 0xa7, + 0xd0, 0xd5, 0x4a, 0xc4, 0x41, 0x56, 0x9a, 0xef, + 0xe4, 0x7a, 0xff, 0x00, 0x51, 0x1a, 0xa5, 0xaa, + 0xb9, 0xc8, 0xbd, 0x89, 0xbc, 0xe3, 0x95, 0x94, + 0xdd, 0x43, 0x5e, 0x8e, 0xd4, 0xe1, 0x1d, 0x6e, + 0xbf, 0xa0, 0xc5, 0xb6, 0xda, 0xee, 0x5a, 0xea, + 0x72, 0x29, 0xa9, 0x51, 0x58, 0x87, 0x46, 0xb5, + 0x7f, 0x93, 0x57, 0x99, 0x50, 0x65, 0xf8, 0x6d, + 0x7b, 0x9d, 0x91, 0x7f, 0x91, 0xcb, 0xa9, 0x15, + 0x51, 0x7e, 0x09, 0xf0, 0x7f, 0x95, 0x4b, 0x18, + 0xbe, 0x24, 0x1e, 0xd7, 0x2c, 0x94, 0x75, 0x6c, + 0x7d, 0x37, 0x15, 0x69, 0x15, 0x7d, 0x68, 0x47, + 0x2d, 0xb0, 0xbd, 0x2c, 0x5a, 0xdc, 0x57, 0x78, + 0xd5, 0x3e, 0x83, 0x5d, 0xaa, 0x93, 0xb2, 0x91, + 0x7e, 0x62, 0x0b, 0x23, 0x1b, 0x7a, 0x4d, 0x48, + 0xdd, 0x23, 0x9d, 0x51, 0xa5, 0x0e, 0x5f, 0x35, + 0x0d, 0x5b, 0xd1, 0x66, 0xad, 0x4c, 0x75, 0x8f, + 0x72, 0x22, 0xaa, 0x0a, 0xab, 0xe1, 0x6a, 0x0e, + 0x5b, 0x63, 0x87, 0x3a, 0x9c, 0xb6, 0x4b, 0xdd, + 0x3a, 0x96, 0x70, 0xde, 0xbf, 0x07, 0xaf, 0x89, + 0x4b, 0x2c, 0xb2, 0xcb, 0x2c, 0xb1, 0x94, 0x8c, + 0xea, 0xb5, 0x67, 0xf9, 0xea, 0x4d, 0x84, 0x55, + 0x7b, 0x13, 0xf9, 0x1c, 0xb6, 0xc7, 0x1f, 0xe6, + 0xbf, 0xc1, 0x12, 0xea, 0x44, 0x57, 0x1a, 0x95, + 0x63, 0x75, 0x96, 0x59, 0x65, 0x96, 0x59, 0x65, + 0xfc, 0xdc, 0x47, 0x49, 0x14, 0xb1, 0x1e, 0xad, + 0x5b, 0x41, 0xd2, 0xb9, 0xfd, 0xd4, 0xe7, 0x3e, + 0xb4, 0xd9, 0xcd, 0x77, 0x4f, 0xa1, 0xcd, 0x72, + 0x5f, 0xd4, 0x74, 0x8a, 0xe5, 0xb5, 0x16, 0x67, + 0xb9, 0x29, 0x54, 0x73, 0xd5, 0xcb, 0x6a, 0x2c, + 0x8a, 0xee, 0xe3, 0x64, 0x56, 0xf5, 0x43, 0x9a, + 0xeb, 0xbb, 0x19, 0x25, 0x52, 0x7a, 0x12, 0x4c, + 0xaa, 0xaa, 0x88, 0xbd, 0x0e, 0x6b, 0xba, 0x7d, + 0x04, 0x99, 0xc8, 0xb6, 0x8a, 0x73, 0x5d, 0xd7, + 0xea, 0x24, 0xae, 0x44, 0xab, 0x16, 0x67, 0x2f, + 0xa8, 0xe9, 0x9c, 0xe4, 0xa5, 0x52, 0xc6, 0x78, + 0x9c, 0x88, 0x9f, 0x07, 0x25, 0xa5, 0x0b, 0xd3, + 0xa2, 0x96, 0x73, 0xdf, 0x55, 0x63, 0x65, 0x73, + 0x3c, 0xa7, 0x35, 0xdd, 0x7e, 0xa7, 0x35, 0xdd, + 0x3e, 0x87, 0x31, 0x6a, 0x8e, 0x73, 0xae, 0xc4, + 0x99, 0xe8, 0x95, 0x63, 0x5e, 0xad, 0x5b, 0x43, + 0x50, 0x93, 0x3d, 0x12, 0x91, 0x4e, 0x62, 0xaa, + 0x50, 0xd9, 0xba, 0x39, 0x55, 0x7a, 0x9c, 0xe7, + 0x5e, 0xab, 0x39, 0x8b, 0x4a, 0x87, 0x39, 0xf5, + 0xa6, 0xce, 0x62, 0xad, 0x7d, 0x0e, 0x7b, 0xd7, + 0xd4, 0xe7, 0x3e, 0xee, 0xc7, 0x48, 0xae, 0x5b, + 0x52, 0xce, 0x15, 0x17, 0x4d, 0xfc, 0x26, 0xb6, + 0xbd, 0x6c, 0xb2, 0xcb, 0x2c, 0xb2, 0xcb, 0x16, + 0x45, 0x54, 0xa1, 0x26, 0x72, 0x74, 0x39, 0x8a, + 0x89, 0x47, 0x3d, 0xeb, 0xea, 0x73, 0x5d, 0x7a, + 0xac, 0xe7, 0x2b, 0x9c, 0x8a, 0xe5, 0x24, 0x95, + 0x34, 0xd5, 0xd9, 0x65, 0x96, 0x59, 0x65, 0x96, + 0x36, 0xdc, 0xb4, 0x9f, 0x33, 0xe3, 0x6c, 0x9e, + 0x63, 0x12, 0x33, 0x12, 0x33, 0x12, 0x33, 0x12, + 0x33, 0x12, 0x33, 0x12, 0x33, 0x12, 0x33, 0x12, + 0x33, 0x12, 0x33, 0x12, 0x33, 0x12, 0x33, 0x12, + 0x33, 0x12, 0x33, 0x12, 0x33, 0x12, 0x33, 0x12, + 0x33, 0x12, 0x33, 0x12, 0x33, 0x12, 0x33, 0x12, + 0x33, 0x12, 0x31, 0x90, 0xb2, 0x3f, 0x2f, 0xc5, + 0xf1, 0x31, 0xfe, 0x64, 0x31, 0xa2, 0xd8, 0xc6, + 0x8b, 0x63, 0x1a, 0x2d, 0x8c, 0x68, 0xb6, 0x31, + 0xa2, 0xd8, 0xc6, 0x8b, 0x63, 0x1a, 0x2d, 0x8c, + 0x68, 0xb6, 0x31, 0xa2, 0xd8, 0xc6, 0x8b, 0x63, + 0x1a, 0x2d, 0x8c, 0x68, 0xb6, 0x31, 0xa2, 0xd8, + 0xc6, 0x8b, 0x63, 0x1a, 0x2d, 0x8c, 0x68, 0xb6, + 0x31, 0xa2, 0xd8, 0xc6, 0x8b, 0x63, 0x1a, 0x2d, + 0x8c, 0x68, 0xb6, 0x13, 0x87, 0x89, 0x3d, 0x3e, + 0x2f, 0x8d, 0xb2, 0x79, 0x90, 0xc6, 0x8b, 0x63, + 0x1a, 0x2d, 0x8c, 0x68, 0xb6, 0x31, 0xa2, 0xd8, + 0xc6, 0x8b, 0x63, 0x1a, 0x2d, 0x8c, 0x68, 0xb6, + 0x31, 0xa2, 0xd8, 0xc6, 0x8b, 0x63, 0x1a, 0x2d, + 0x8c, 0x68, 0xb6, 0x31, 0xa2, 0xd8, 0xc6, 0x8b, + 0x63, 0x1a, 0x2d, 0x8c, 0x68, 0xb6, 0x31, 0xa2, + 0xd8, 0xc6, 0x8b, 0x63, 0x1a, 0x2d, 0x8c, 0x68, + 0xb6, 0x31, 0xa2, 0xd8, 0xc6, 0x8b, 0x61, 0x91, + 0x32, 0x3f, 0x2a, 0x7f, 0xba, 0x93, 0x4f, 0xcb, + 0xe8, 0x9d, 0xcc, 0xa9, 0x0c, 0xa9, 0x0c, 0xa9, + 0x0c, 0xa9, 0x0c, 0xa9, 0x0c, 0xa9, 0x0c, 0xa9, + 0x0c, 0xa9, 0x0c, 0xa9, 0x0c, 0xa9, 0x0c, 0xa9, + 0x0c, 0xa9, 0x0c, 0xa9, 0x0c, 0xa9, 0x0c, 0xa9, + 0x0c, 0xa9, 0x0c, 0xa9, 0x0c, 0xa9, 0x0c, 0xa9, + 0x0c, 0xa9, 0x0c, 0xa9, 0x08, 0x78, 0x9d, 0x4b, + 0xa5, 0xdf, 0xbb, 0xcc, 0x9f, 0xd4, 0x52, 0x8a, + 0x28, 0x6c, 0x48, 0xe6, 0xea, 0x55, 0x1f, 0x16, + 0x9e, 0xa7, 0x2d, 0xdb, 0x0e, 0x8d, 0x5a, 0xb4, + 0x2b, 0x55, 0x3b, 0x89, 0x0a, 0x69, 0xd4, 0xaa, + 0x3a, 0x25, 0x6a, 0xd1, 0xa1, 0x7b, 0x50, 0xd8, + 0x95, 0xcb, 0x46, 0x85, 0xd8, 0x46, 0x2a, 0xf6, + 0x1b, 0x12, 0xba, 0xc7, 0x31, 0x12, 0xa8, 0xd0, + 0xa9, 0xe8, 0x68, 0x52, 0x8a, 0x28, 0x44, 0xeb, + 0xfb, 0xbc, 0xab, 0xe3, 0x52, 0xcb, 0x2c, 0x4f, + 0xca, 0x51, 0x11, 0x74, 0x35, 0x3e, 0xa5, 0xf4, + 0x53, 0xaf, 0x31, 0xdd, 0x7b, 0x12, 0xaf, 0x85, + 0xaa, 0x5b, 0x79, 0x69, 0xa8, 0x64, 0x9a, 0x9d, + 0xd3, 0x63, 0x52, 0xf2, 0xf5, 0x17, 0xe2, 0xff, + 0x00, 0x81, 0x1c, 0x88, 0xd6, 0xa8, 0xae, 0xa6, + 0x2a, 0xb7, 0x71, 0x15, 0xde, 0x2b, 0x13, 0xcc, + 0xc1, 0x8a, 0xae, 0x45, 0xd4, 0x6a, 0xb5, 0x7a, + 0x16, 0x59, 0x62, 0x2f, 0xee, 0xfc, 0x42, 0x2b, + 0x5e, 0x59, 0x65, 0x8d, 0x99, 0xcc, 0xe8, 0xd5, + 0x16, 0x47, 0x2a, 0xda, 0xa9, 0xcf, 0x7e, 0xe7, + 0x3d, 0xf7, 0x76, 0x2c, 0xae, 0x72, 0x52, 0xa9, + 0xcc, 0x55, 0x4d, 0x23, 0x5e, 0xad, 0xec, 0x36, + 0x57, 0x33, 0xca, 0xa7, 0x35, 0xd7, 0xaa, 0xfa, + 0x89, 0x3b, 0xd3, 0xd4, 0x6c, 0xae, 0x6f, 0x65, + 0x12, 0x57, 0x22, 0xda, 0x28, 0xb2, 0x39, 0x68, + 0x59, 0x9e, 0xee, 0xea, 0x73, 0x5d, 0xd5, 0x77, + 0x2c, 0xb2, 0xc8, 0xd1, 0x5e, 0xe4, 0x44, 0xfd, + 0xdd, 0xcd, 0x47, 0x74, 0x71, 0x8f, 0x16, 0xc6, + 0x3c, 0x5b, 0x18, 0xf1, 0x6c, 0x63, 0xc5, 0xb1, + 0x8f, 0x16, 0xc6, 0x3c, 0x5b, 0x18, 0xf1, 0x6c, + 0x63, 0xc5, 0xb1, 0x8f, 0x16, 0xc6, 0x3c, 0x5b, + 0x18, 0xf1, 0x6c, 0x63, 0xc5, 0xb1, 0x8f, 0x16, + 0xc6, 0x3c, 0x5b, 0x18, 0xf1, 0x6c, 0x63, 0xc5, + 0xb1, 0x8f, 0x16, 0xc6, 0x3c, 0x5b, 0x18, 0xf1, + 0x6c, 0x63, 0xc5, 0xb1, 0x8f, 0x16, 0xc3, 0x58, + 0xd6, 0x79, 0x53, 0xff, 0x00, 0x80, 0xef, 0xff, + 0xc4, 0x00, 0x50, 0x10, 0x00, 0x01, 0x03, 0x02, + 0x01, 0x05, 0x0a, 0x0a, 0x06, 0x07, 0x07, 0x05, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x03, + 0x04, 0x11, 0x12, 0x13, 0x21, 0x31, 0x33, 0x34, + 0x10, 0x22, 0x32, 0x41, 0x51, 0x91, 0x92, 0x93, + 0xa1, 0xb1, 0x05, 0x14, 0x23, 0x35, 0x61, 0x71, + 0x72, 0x73, 0x81, 0xc1, 0x20, 0x42, 0x52, 0xa2, + 0xd1, 0xe1, 0x24, 0x30, 0x40, 0x62, 0x83, 0xa3, + 0xf0, 0x15, 0x43, 0x53, 0x74, 0x82, 0xb2, 0xc2, + 0x06, 0x50, 0x63, 0xd2, 0xf1, 0x54, 0x44, 0x55, + 0xf2, 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, + 0x06, 0x3f, 0x02, 0x7b, 0xde, 0xf9, 0x2f, 0x8d, + 0xda, 0x24, 0x3c, 0xab, 0x87, 0x2f, 0x58, 0x57, + 0x0e, 0x5e, 0xb0, 0xae, 0x1c, 0xbd, 0x61, 0x5c, + 0x39, 0x7a, 0xc2, 0xb8, 0x72, 0xf5, 0x85, 0x70, + 0xe5, 0xeb, 0x0a, 0xe1, 0xcb, 0xd6, 0x15, 0xc3, + 0x97, 0xac, 0x2b, 0x87, 0x2f, 0x58, 0x57, 0x0e, + 0x5e, 0xb0, 0xae, 0x1c, 0xbd, 0x61, 0x5c, 0x39, + 0x7a, 0xc2, 0xb8, 0x72, 0xf5, 0x85, 0x70, 0xe5, + 0xeb, 0x0a, 0xe1, 0xcb, 0xd6, 0x15, 0xc3, 0x97, + 0xac, 0x2b, 0x87, 0x2f, 0x58, 0x57, 0x0e, 0x5e, + 0xb0, 0xae, 0x1c, 0xbd, 0x61, 0x5c, 0x39, 0x7a, + 0xc2, 0xb8, 0x72, 0xf5, 0x85, 0x70, 0xe5, 0xeb, + 0x0a, 0xe1, 0xcb, 0xd6, 0x15, 0xc3, 0x97, 0xac, + 0x2b, 0x87, 0x2f, 0x58, 0x57, 0x0e, 0x5e, 0xb0, + 0xae, 0x1c, 0xbd, 0x61, 0x5c, 0x39, 0x7a, 0xc2, + 0xb8, 0x72, 0xf5, 0x85, 0x70, 0xe5, 0xeb, 0x0a, + 0xe1, 0xcb, 0xd6, 0x15, 0xc3, 0x97, 0xac, 0x2b, + 0x87, 0x2f, 0x58, 0x57, 0x0e, 0x5e, 0xb0, 0xae, + 0x1c, 0xbd, 0x61, 0x5c, 0x39, 0x7a, 0xc2, 0xb8, + 0x72, 0xf5, 0x85, 0x70, 0xe5, 0xeb, 0x0a, 0xe1, + 0xcb, 0xd6, 0x15, 0xc3, 0x97, 0xac, 0x2b, 0x87, + 0x2f, 0x58, 0x57, 0x0e, 0x5e, 0xb0, 0xae, 0x1c, + 0xbd, 0x61, 0x5c, 0x39, 0x7a, 0xc2, 0xb8, 0x72, + 0xf5, 0x85, 0x70, 0xe5, 0xeb, 0x0a, 0xe1, 0xcb, + 0xd6, 0x15, 0xc3, 0x97, 0xac, 0x2b, 0x87, 0x2f, + 0x58, 0x57, 0x0e, 0x5e, 0xb0, 0xae, 0x1c, 0xbd, + 0x61, 0x5c, 0x39, 0x7a, 0xc2, 0xb8, 0x72, 0xf5, + 0x85, 0x70, 0xe5, 0xeb, 0x0a, 0xe1, 0xcb, 0xd6, + 0x15, 0xc3, 0x97, 0xac, 0x2b, 0x87, 0x2f, 0x58, + 0x57, 0x0e, 0x5e, 0xb0, 0xae, 0x1c, 0xbd, 0x61, + 0x5c, 0x39, 0x7a, 0xc2, 0xb8, 0x72, 0xf5, 0x85, + 0x70, 0xe5, 0xeb, 0x0a, 0xe1, 0xcb, 0xd6, 0x15, + 0xc3, 0x97, 0xac, 0x2b, 0x87, 0x2f, 0x58, 0x57, + 0x0e, 0x5e, 0xb0, 0xae, 0x1c, 0xbd, 0x61, 0x5c, + 0x39, 0x7a, 0xc2, 0xb8, 0x72, 0xf5, 0x85, 0x70, + 0xe5, 0xeb, 0x0a, 0xe1, 0xcb, 0xd6, 0x15, 0xc3, + 0x97, 0xac, 0x2b, 0x87, 0x2f, 0x58, 0x57, 0x0e, + 0x5e, 0xb0, 0xae, 0x1c, 0xbd, 0x61, 0x4c, 0x7b, + 0x1f, 0x25, 0xf1, 0xb7, 0x4c, 0x87, 0x95, 0x3f, + 0xde, 0x3f, 0xbf, 0xfe, 0xdb, 0x75, 0x71, 0x1c, + 0x84, 0x7b, 0x0b, 0x55, 0x2f, 0x40, 0xad, 0x54, + 0xbd, 0x02, 0xb5, 0x52, 0xf4, 0x0a, 0xd5, 0x4b, + 0xd0, 0x2b, 0x55, 0x2f, 0x40, 0xad, 0x54, 0xbd, + 0x02, 0xb5, 0x52, 0xf4, 0x0a, 0xd5, 0x4b, 0xd0, + 0x2b, 0x55, 0x2f, 0x40, 0xad, 0x54, 0xbd, 0x02, + 0xb5, 0x52, 0xf4, 0x0a, 0xd5, 0x4b, 0xd0, 0x2b, + 0x55, 0x2f, 0x40, 0xad, 0x54, 0xbd, 0x02, 0xb5, + 0x52, 0xf4, 0x0a, 0xb6, 0x09, 0x2f, 0xec, 0xad, + 0x5c, 0x9d, 0x05, 0xab, 0x93, 0xa0, 0xb5, 0x72, + 0x74, 0x16, 0xae, 0x4e, 0x82, 0xd5, 0xc9, 0xd0, + 0x5a, 0xb9, 0x3a, 0x0a, 0xd8, 0x24, 0xbf, 0xb2, + 0xb5, 0x72, 0x74, 0x16, 0xae, 0x4e, 0x82, 0xd5, + 0xc9, 0xd0, 0x5a, 0xb9, 0x3a, 0x0b, 0x57, 0x27, + 0x41, 0x6a, 0xe4, 0xe8, 0x21, 0x6b, 0x8b, 0x4a, + 0xcd, 0x3e, 0xb4, 0xff, 0x00, 0x78, 0xfe, 0xff, + 0x00, 0xfb, 0x6b, 0xbd, 0x48, 0x4d, 0x29, 0xc3, + 0x1c, 0x71, 0x63, 0x71, 0xb5, 0xec, 0x00, 0x51, + 0xd3, 0x41, 0x5c, 0x5f, 0x34, 0x8e, 0x0c, 0x6b, + 0x72, 0x12, 0x0c, 0xe7, 0x47, 0xd5, 0xfa, 0x4e, + 0x92, 0x59, 0x1b, 0x14, 0x6d, 0xd2, 0xf7, 0x9b, + 0x01, 0xfa, 0x96, 0xfb, 0xb3, 0xdf, 0xb9, 0xe2, + 0xb2, 0x4f, 0x69, 0xae, 0x1b, 0xc1, 0x36, 0x04, + 0xe8, 0x05, 0xda, 0x01, 0x3e, 0x94, 0x69, 0x62, + 0x74, 0xae, 0x94, 0x3d, 0xd1, 0x9f, 0xd1, 0xe4, + 0xc3, 0x88, 0x69, 0xdf, 0x5a, 0xdc, 0x5c, 0xa9, + 0xf4, 0xec, 0x92, 0xf2, 0x36, 0xff, 0x00, 0x54, + 0x81, 0x9b, 0x4d, 0x8e, 0x83, 0x6f, 0x42, 0x6c, + 0x10, 0xd5, 0x07, 0xc8, 0xeb, 0xe0, 0xde, 0xb8, + 0x35, 0xfe, 0xcb, 0xad, 0x67, 0x7c, 0x37, 0x24, + 0xf6, 0x42, 0x7d, 0x4d, 0x54, 0xa2, 0x18, 0x59, + 0xa5, 0xce, 0x50, 0xcb, 0x34, 0xb6, 0x6c, 0xd9, + 0xd9, 0x85, 0x8e, 0x71, 0x77, 0x1e, 0x80, 0x2e, + 0xa9, 0x9d, 0x24, 0xae, 0x70, 0xa8, 0x69, 0x7c, + 0x59, 0x18, 0x9f, 0x2e, 0x26, 0xe6, 0xcf, 0xbd, + 0x07, 0x94, 0x28, 0x41, 0x91, 0xcd, 0x32, 0x80, + 0xe6, 0xde, 0x37, 0x0b, 0x03, 0x98, 0x62, 0xcd, + 0xbd, 0xf8, 0xd9, 0x3a, 0x09, 0xea, 0x83, 0x24, + 0x6d, 0xb1, 0xef, 0x5c, 0x43, 0x3d, 0xa2, 0x05, + 0x9b, 0xf1, 0x57, 0x0a, 0x4f, 0x7e, 0xcf, 0x92, + 0x7f, 0xbc, 0x7f, 0x7f, 0xfd, 0xb5, 0xde, 0xa5, + 0x0f, 0xb0, 0x17, 0xfd, 0x79, 0x55, 0x4f, 0xae, + 0x8a, 0x1a, 0x77, 0x34, 0xf2, 0x1c, 0x91, 0xce, + 0xab, 0x1c, 0xd9, 0x7c, 0x21, 0x14, 0x4e, 0x86, + 0x9e, 0x46, 0xcd, 0x57, 0x30, 0x2f, 0x12, 0x65, + 0x5a, 0x0e, 0x1b, 0x1e, 0x09, 0x05, 0x7f, 0xd4, + 0x25, 0x9e, 0x17, 0xad, 0x78, 0xf0, 0x5c, 0xf4, + 0xcf, 0x84, 0x3e, 0x4e, 0x16, 0x53, 0x0e, 0x20, + 0xee, 0x51, 0xe8, 0x5f, 0xf5, 0x6c, 0xec, 0xf0, + 0xa5, 0x55, 0x39, 0xf0, 0x7e, 0x42, 0x48, 0x22, + 0x64, 0xb6, 0x68, 0x25, 0x83, 0x48, 0xe4, 0x3c, + 0x8a, 0xba, 0x6a, 0x76, 0xd6, 0xe5, 0x29, 0x65, + 0x84, 0x47, 0x14, 0x4f, 0x6b, 0x69, 0xc3, 0x6c, + 0x0b, 0x83, 0xc1, 0x39, 0xef, 0x72, 0xbc, 0x39, + 0x5b, 0x3f, 0x85, 0xab, 0x98, 0xef, 0x1f, 0x96, + 0x8a, 0x06, 0x45, 0xbf, 0xb0, 0xca, 0x0c, 0xcd, + 0x07, 0xeb, 0x71, 0x5e, 0xf9, 0x82, 0xff, 0x00, + 0xa8, 0x60, 0x9a, 0x6a, 0xc0, 0xda, 0x3a, 0xc8, + 0xc4, 0x62, 0xa2, 0x5b, 0xca, 0x01, 0x2d, 0xde, + 0xbc, 0x83, 0x9f, 0x49, 0x5f, 0xf5, 0x84, 0x4c, + 0xaf, 0xa9, 0xbd, 0x21, 0xa7, 0x64, 0x2f, 0x7c, + 0xce, 0x2f, 0x6d, 0xda, 0xde, 0x3f, 0x4a, 0xff, + 0x00, 0xaa, 0xab, 0x59, 0x5d, 0x53, 0x6f, 0x07, + 0x46, 0xc3, 0x05, 0x3e, 0x3f, 0x27, 0x77, 0x43, + 0x9c, 0x91, 0xe8, 0xd2, 0xaa, 0xe2, 0xa6, 0x7d, + 0x6b, 0x44, 0xb4, 0xd1, 0x3d, 0x8f, 0xae, 0xa8, + 0x66, 0x33, 0x26, 0x2d, 0xf6, 0x07, 0x5c, 0xdb, + 0x10, 0xd0, 0xab, 0x69, 0xe4, 0x7d, 0x76, 0x5e, + 0x09, 0x06, 0x38, 0x2b, 0xce, 0x27, 0xc5, 0x71, + 0xf6, 0xbe, 0xb0, 0xfa, 0x2d, 0xf7, 0x67, 0xbf, + 0x73, 0xc3, 0x13, 0x30, 0xb0, 0x78, 0x35, 0x95, + 0x91, 0x78, 0xc4, 0x47, 0x58, 0xf7, 0x01, 0x1d, + 0xcb, 0x4f, 0x17, 0xd5, 0xcd, 0xe8, 0xe2, 0xba, + 0x80, 0x3d, 0xf4, 0x95, 0x14, 0x55, 0x35, 0xb2, + 0x37, 0xc9, 0x5f, 0x18, 0x2f, 0x91, 0xce, 0x06, + 0xfa, 0x0f, 0x21, 0x16, 0x5e, 0x15, 0x9e, 0x07, + 0xca, 0xe7, 0xf8, 0xbc, 0xee, 0x64, 0x77, 0xcc, + 0xc2, 0xec, 0xef, 0x23, 0xd6, 0xa8, 0x49, 0xc9, + 0x78, 0xbd, 0xd9, 0xe2, 0xd7, 0xd1, 0x7f, 0xab, + 0x87, 0x72, 0x4f, 0x64, 0x2a, 0xd2, 0xf6, 0x87, + 0x60, 0x82, 0x47, 0x36, 0xe3, 0x41, 0xc2, 0x57, + 0x82, 0xf1, 0x7f, 0xfd, 0x61, 0xc1, 0xd2, 0x8e, + 0xff, 0x00, 0x25, 0xe0, 0xb9, 0xe8, 0x66, 0xa5, + 0x63, 0xa3, 0x82, 0xa1, 0x8d, 0x6d, 0x45, 0xce, + 0xf5, 0xd2, 0x36, 0xc4, 0x01, 0xc5, 0x66, 0x8e, + 0x75, 0x4f, 0xe1, 0x09, 0x31, 0xc0, 0xe9, 0x1a, + 0x1b, 0x2c, 0x51, 0xbb, 0x78, 0xfc, 0x0e, 0x36, + 0x1a, 0x34, 0x5e, 0xfc, 0x9a, 0x55, 0x7f, 0x8c, + 0x61, 0xbf, 0x8d, 0x54, 0xf8, 0xd6, 0x3f, 0x6d, + 0xda, 0x7f, 0xd3, 0x6f, 0x82, 0x88, 0xc1, 0x6c, + 0x8e, 0x11, 0x83, 0x0e, 0x8c, 0x3c, 0x4a, 0x4f, + 0x7c, 0xcf, 0x92, 0x7f, 0xbc, 0x7f, 0x7f, 0xfd, + 0xb5, 0xde, 0xa5, 0x0f, 0xb0, 0x15, 0x6c, 0xf9, + 0x00, 0x64, 0xad, 0x0d, 0x6d, 0x46, 0x22, 0x48, + 0x78, 0x02, 0xc3, 0x37, 0xa9, 0x4d, 0x4e, 0xca, + 0x20, 0x22, 0x9b, 0x0e, 0x31, 0x8d, 0xd7, 0x38, + 0x4d, 0xc6, 0x7b, 0xde, 0xde, 0x85, 0x5d, 0x96, + 0xa7, 0xc7, 0xe3, 0xc5, 0x86, 0xa3, 0x7e, 0xe1, + 0x8f, 0x07, 0x07, 0x8f, 0x36, 0x8e, 0x25, 0xe1, + 0x3a, 0xdf, 0x08, 0xc1, 0x15, 0x4c, 0x73, 0xc9, + 0x1b, 0xe0, 0x18, 0x8d, 0xc6, 0x16, 0x80, 0x71, + 0x7c, 0x46, 0x8c, 0xe9, 0xb5, 0xd3, 0xd1, 0xb5, + 0xf5, 0x42, 0xdb, 0xfb, 0x9c, 0xf6, 0xd1, 0x71, + 0xa0, 0xfc, 0x55, 0x45, 0x23, 0xe9, 0x83, 0xa9, + 0xea, 0x26, 0x33, 0xc8, 0xdc, 0x4e, 0xce, 0xf2, + 0x6f, 0x7b, 0xdf, 0x37, 0xc1, 0x55, 0x44, 0x28, + 0x9b, 0x93, 0xaa, 0x6b, 0x59, 0x33, 0x71, 0x3b, + 0x7f, 0x6d, 0x1c, 0x7a, 0x7d, 0x3a, 0x55, 0xe5, + 0xa1, 0x0f, 0x39, 0x31, 0x15, 0xf2, 0x8e, 0xce, + 0xd1, 0xa3, 0x8f, 0x4f, 0xa7, 0x4a, 0xac, 0x90, + 0x40, 0x31, 0x56, 0x58, 0x4f, 0x88, 0x92, 0x1f, + 0x61, 0x87, 0x47, 0xa9, 0x4f, 0x4e, 0xca, 0x16, + 0x64, 0xa7, 0xb0, 0x78, 0x2e, 0x71, 0x39, 0xb4, + 0x67, 0x27, 0x37, 0xc1, 0x3e, 0x3a, 0x38, 0x72, + 0x41, 0xe7, 0x13, 0x8e, 0x22, 0xe2, 0xe3, 0xe9, + 0x27, 0x3f, 0xd1, 0x6f, 0xbb, 0x3d, 0xfb, 0x9e, + 0x35, 0x24, 0x17, 0x9a, 0xe1, 0xc7, 0x7e, 0xec, + 0x2e, 0x23, 0x41, 0x2d, 0xbd, 0x8f, 0xc5, 0x78, + 0xdb, 0x29, 0xed, 0x3e, 0x22, 0xfe, 0x11, 0xc2, + 0x1c, 0x74, 0x90, 0xdd, 0x00, 0xfa, 0x77, 0x05, + 0x44, 0x14, 0xa1, 0x92, 0x36, 0xf8, 0x77, 0xc4, + 0xb5, 0x97, 0xfb, 0x22, 0xf6, 0x6f, 0xc3, 0x72, + 0x4f, 0x64, 0x2c, 0x85, 0x48, 0x7b, 0xa2, 0xbd, + 0xec, 0xc9, 0x1c, 0xcb, 0xf4, 0x48, 0x51, 0xd3, + 0x18, 0xa4, 0x31, 0x46, 0x6e, 0xcb, 0xce, 0xfc, + 0x4d, 0xff, 0x00, 0x55, 0xef, 0x6f, 0x42, 0x82, + 0x39, 0x20, 0xb3, 0x60, 0x6e, 0x18, 0xf2, 0x6e, + 0x31, 0x96, 0x8e, 0x4b, 0xb6, 0xd9, 0xbd, 0x09, + 0x90, 0xc4, 0xc1, 0x1c, 0x4c, 0x18, 0x5a, 0xc6, + 0xe8, 0x01, 0x1a, 0x89, 0xe9, 0x43, 0xe4, 0x75, + 0xb1, 0xef, 0x88, 0x0f, 0xb7, 0xda, 0x00, 0xd9, + 0xdf, 0x1d, 0xc7, 0xfb, 0xe6, 0x7c, 0x93, 0xfd, + 0xe3, 0xfb, 0xfe, 0x86, 0x09, 0x6a, 0x5a, 0x1f, + 0xc6, 0xd1, 0x77, 0x77, 0x2d, 0x7b, 0xba, 0xb2, + 0xb5, 0xee, 0xea, 0xca, 0xd7, 0xbb, 0xab, 0x2b, + 0x5e, 0xee, 0xac, 0xad, 0x7b, 0xba, 0xb2, 0xb5, + 0xee, 0xea, 0xca, 0xd7, 0xbb, 0xab, 0x2b, 0x5e, + 0xee, 0xac, 0xad, 0x7b, 0xba, 0xb2, 0xb5, 0xee, + 0xea, 0xca, 0xd7, 0xbb, 0xab, 0x2b, 0x5e, 0xee, + 0xac, 0xad, 0x7b, 0xba, 0xb2, 0xb5, 0xee, 0xea, + 0xca, 0xd7, 0xbb, 0xab, 0x2b, 0x5e, 0xee, 0xac, + 0xad, 0x7b, 0xba, 0xb2, 0xb5, 0xee, 0xea, 0xca, + 0xd7, 0xbb, 0xab, 0x2b, 0x68, 0x3d, 0x59, 0x5f, + 0xa3, 0xce, 0xd9, 0x7d, 0x1c, 0x7c, 0xdb, 0x97, + 0x39, 0x82, 0xb3, 0x1b, 0x8b, 0xd2, 0xb8, 0x2d, + 0x5c, 0x16, 0xae, 0x0b, 0x57, 0x05, 0xab, 0x82, + 0xd5, 0xc1, 0x6a, 0xe0, 0xb5, 0x70, 0x5a, 0xb8, + 0x2d, 0x5c, 0x16, 0xae, 0x0b, 0x57, 0x05, 0xab, + 0x82, 0xd5, 0xc1, 0x6a, 0xe0, 0xb5, 0x70, 0x5a, + 0xad, 0x85, 0xaa, 0xc0, 0xb8, 0x0f, 0x6c, 0xae, + 0x13, 0xfa, 0x65, 0x70, 0x9f, 0xd3, 0x2b, 0x84, + 0xfe, 0x99, 0x5c, 0x27, 0xf4, 0xca, 0xe1, 0x3f, + 0xa6, 0x57, 0x09, 0xfd, 0x32, 0xb8, 0x4f, 0xe9, + 0x95, 0xc2, 0x7f, 0x4c, 0xae, 0x13, 0xfa, 0x65, + 0x70, 0x9f, 0xd3, 0x2b, 0x84, 0xfe, 0x99, 0x5c, + 0x27, 0xf4, 0xca, 0xe1, 0x3f, 0xa6, 0x57, 0x09, + 0xfd, 0x32, 0xb8, 0x4f, 0xe9, 0x95, 0x7b, 0xba, + 0xfc, 0xb8, 0x8a, 0xd2, 0xee, 0x99, 0x5a, 0x5d, + 0xd3, 0x2b, 0x4b, 0xba, 0x65, 0x69, 0x77, 0x4c, + 0xad, 0x2e, 0xe9, 0x95, 0xa5, 0xdd, 0x32, 0xaf, + 0x9e, 0xfe, 0xd1, 0x5a, 0x5d, 0xd3, 0x2b, 0x4b, + 0xba, 0x65, 0x69, 0x77, 0x4c, 0xad, 0x2e, 0xe9, + 0x95, 0xbe, 0xca, 0x7c, 0x1e, 0x55, 0xdb, 0x2c, + 0x9d, 0x34, 0x2d, 0x73, 0x79, 0x19, 0xa7, 0xd6, + 0x9f, 0xef, 0x1f, 0xdf, 0xba, 0xda, 0x78, 0x4e, + 0x19, 0x65, 0x17, 0x2e, 0x1c, 0x4d, 0xfd, 0x99, + 0xaf, 0x63, 0x8b, 0x5e, 0xdc, 0xe0, 0x85, 0x1c, + 0xe7, 0x59, 0xc1, 0x7d, 0xb9, 0x53, 0x69, 0xd9, + 0xf1, 0x58, 0x62, 0x8d, 0xb2, 0x7e, 0xfc, 0x99, + 0xee, 0xb5, 0x10, 0x74, 0x16, 0xa2, 0x0e, 0x82, + 0xd4, 0x41, 0xd0, 0x5a, 0x88, 0x3a, 0x0b, 0x51, + 0x07, 0x41, 0x6a, 0x20, 0xe8, 0x2d, 0x44, 0x1d, + 0x05, 0xa8, 0x83, 0xa0, 0xb5, 0x10, 0x74, 0x16, + 0xa2, 0x0e, 0x82, 0xd4, 0x41, 0xd0, 0x5a, 0x88, + 0x3a, 0x0b, 0x51, 0x07, 0x41, 0x6a, 0x20, 0xe8, + 0x2d, 0x44, 0x1d, 0x05, 0xa8, 0x83, 0xa0, 0xb5, + 0x10, 0x74, 0x16, 0xa2, 0x0e, 0x82, 0xd4, 0x41, + 0xd0, 0x5a, 0x88, 0x3a, 0x0b, 0x7d, 0x4f, 0x09, + 0x1e, 0x86, 0xd9, 0x36, 0x68, 0xb5, 0x64, 0xda, + 0xc7, 0xea, 0x9d, 0xc1, 0x97, 0xbb, 0xa4, 0x39, + 0xf2, 0x63, 0x8b, 0xd6, 0xb6, 0x63, 0xd6, 0x2d, + 0x98, 0xf5, 0x8b, 0x66, 0x3d, 0x62, 0xd9, 0x8f, + 0x58, 0xb6, 0x63, 0xd6, 0x2d, 0x98, 0xf5, 0x8b, + 0x66, 0x3d, 0x62, 0xd9, 0x8f, 0x58, 0xb6, 0x63, + 0xd6, 0x2d, 0x98, 0xf5, 0x8b, 0x66, 0x3d, 0x62, + 0xd9, 0x8f, 0x58, 0xb6, 0x63, 0xd6, 0x2d, 0x98, + 0xf5, 0x8b, 0x66, 0x3d, 0x62, 0xd9, 0x8f, 0x58, + 0xb6, 0x63, 0xd6, 0x2d, 0x98, 0xf5, 0x8b, 0x66, + 0x3d, 0x62, 0xd9, 0x8f, 0x58, 0xb6, 0x63, 0xd6, + 0x2c, 0x31, 0xde, 0x29, 0x38, 0x9a, 0xe3, 0x70, + 0x57, 0x61, 0x09, 0x9e, 0xf1, 0x9d, 0xe9, 0xfe, + 0xf1, 0xdd, 0xfb, 0xac, 0xf7, 0x4d, 0xf9, 0xfe, + 0xa1, 0x91, 0xb7, 0x84, 0xe3, 0x84, 0x21, 0x25, + 0x1b, 0x6d, 0x92, 0x93, 0x23, 0x2e, 0x72, 0x6e, + 0x6c, 0xa9, 0xaa, 0xaa, 0x28, 0xcd, 0x44, 0x92, + 0x39, 0xcd, 0xcd, 0x21, 0x6f, 0x19, 0x5e, 0x0c, + 0x9a, 0x38, 0x9c, 0xda, 0x7a, 0x9c, 0x41, 0xd0, + 0xb9, 0xc7, 0x88, 0x26, 0x44, 0x1b, 0xfa, 0x11, + 0x66, 0x5a, 0xd7, 0xfa, 0x96, 0x53, 0xb1, 0xa0, + 0xc7, 0x4b, 0x13, 0x5a, 0x70, 0x83, 0x9c, 0xdf, + 0x89, 0x18, 0xf0, 0x45, 0x1b, 0xb1, 0xe4, 0x83, + 0xe1, 0x91, 0xc6, 0xcf, 0xe2, 0x0e, 0xc5, 0xf2, + 0xfd, 0x4d, 0x47, 0xbd, 0xf9, 0x2a, 0x93, 0xff, + 0x00, 0x8d, 0xdf, 0xed, 0xfd, 0x44, 0xf8, 0x65, + 0xc0, 0x63, 0xb6, 0x6b, 0x5e, 0xea, 0x77, 0xe5, + 0x32, 0x62, 0x2f, 0x45, 0xee, 0x8c, 0x82, 0x37, + 0x98, 0xc6, 0x97, 0x86, 0xe6, 0x4d, 0x2c, 0x86, + 0x47, 0x07, 0x70, 0x6c, 0xd3, 0x9d, 0x65, 0x0b, + 0x1e, 0x23, 0xbd, 0xb1, 0x5b, 0x32, 0x2f, 0x64, + 0x4f, 0x73, 0x06, 0x97, 0x06, 0xe6, 0x41, 0xe2, + 0x27, 0x96, 0x10, 0x4e, 0x20, 0xdc, 0xd9, 0xb4, + 0xa1, 0x19, 0x89, 0xe2, 0x43, 0xa1, 0x98, 0x73, + 0x94, 0x5a, 0xec, 0xce, 0x19, 0x88, 0x3f, 0x4e, + 0xab, 0xd0, 0xf6, 0xfc, 0xd3, 0x3d, 0x61, 0x54, + 0x8b, 0xe8, 0x91, 0xc3, 0xb5, 0x69, 0x5a, 0x54, + 0x4f, 0xcb, 0xc0, 0xdc, 0xab, 0x43, 0x9a, 0xd7, + 0x3e, 0xc5, 0x3a, 0x29, 0x46, 0x17, 0xb7, 0x48, + 0x5a, 0x56, 0x95, 0xa5, 0x69, 0xdc, 0x32, 0x3d, + 0xcc, 0x38, 0x6c, 0x1e, 0xd6, 0xba, 0xe5, 0x97, + 0xe5, 0x4d, 0x8a, 0x21, 0x89, 0xe7, 0x89, 0x3a, + 0x5c, 0x51, 0xca, 0xd6, 0x70, 0xb2, 0x6e, 0xbe, + 0x15, 0x4c, 0xec, 0x78, 0xb2, 0xd1, 0xe3, 0xd1, + 0xa1, 0x69, 0x5a, 0x56, 0x47, 0x1e, 0x3c, 0xc0, + 0xde, 0xd6, 0x51, 0xe0, 0x9b, 0x28, 0x4b, 0x6e, + 0xe1, 0x6b, 0x61, 0x3c, 0x8b, 0x4a, 0xd2, 0xb4, + 0xad, 0x28, 0x38, 0x1c, 0xe3, 0x3a, 0x97, 0xd6, + 0xa0, 0xf6, 0xa3, 0xef, 0x09, 0xfe, 0xf1, 0xdd, + 0xfb, 0xac, 0xf7, 0x4d, 0xf9, 0xfe, 0xa3, 0x2e, + 0xfd, 0x5d, 0x3b, 0x0c, 0xae, 0x5e, 0x10, 0xa5, + 0x82, 0x94, 0xc1, 0x2c, 0x8d, 0x33, 0x67, 0x93, + 0x16, 0x27, 0x05, 0x42, 0xe1, 0x0c, 0x53, 0x5e, + 0x47, 0x0b, 0x4c, 0xdb, 0xf1, 0x95, 0xe0, 0x9a, + 0xb8, 0xdd, 0x7a, 0x37, 0xb4, 0x86, 0x37, 0xec, + 0x1c, 0x26, 0xe1, 0x4b, 0x53, 0x7f, 0x2e, 0xd0, + 0xea, 0x4f, 0x81, 0x75, 0xfb, 0x95, 0x5c, 0x0e, + 0x70, 0x66, 0x31, 0x19, 0x69, 0x3a, 0x2e, 0x07, + 0xff, 0x00, 0x56, 0x52, 0x78, 0x9d, 0x4b, 0x14, + 0x73, 0xe5, 0x85, 0xda, 0x1b, 0x95, 0x1c, 0x5e, + 0xb7, 0x7e, 0x28, 0xb8, 0xe9, 0x39, 0xff, 0x00, + 0x51, 0x51, 0xef, 0x3e, 0x4a, 0xab, 0xdd, 0x3b, + 0xfd, 0xbf, 0xa8, 0xaf, 0x97, 0xec, 0x98, 0x8f, + 0xde, 0x4e, 0x81, 0x9a, 0x26, 0x33, 0x4f, 0xf0, + 0xb6, 0x65, 0xe0, 0xe0, 0x3c, 0x69, 0xe3, 0x20, + 0x2d, 0x0c, 0x20, 0x16, 0x3f, 0x96, 0xe1, 0x78, + 0x28, 0x42, 0xe7, 0x46, 0x0d, 0x41, 0xbf, 0xab, + 0x16, 0x85, 0xe1, 0xc8, 0x9c, 0xe2, 0x62, 0x00, + 0x61, 0x6f, 0x10, 0x5e, 0x06, 0x8a, 0x99, 0xce, + 0x6d, 0x3e, 0x4d, 0x97, 0x6b, 0x74, 0x3b, 0xed, + 0x5d, 0x32, 0x3a, 0x77, 0x64, 0xd8, 0xe9, 0xa5, + 0x07, 0x0f, 0x25, 0xce, 0x65, 0x47, 0xe1, 0x27, + 0x67, 0x75, 0x2c, 0x0f, 0x63, 0xbd, 0x63, 0x83, + 0xde, 0x8b, 0x89, 0x24, 0x9c, 0xff, 0x00, 0x4e, + 0xb3, 0xdb, 0x67, 0xcd, 0x47, 0xed, 0x05, 0x59, + 0xef, 0x9f, 0xdf, 0xbb, 0xe0, 0xc7, 0x55, 0x55, + 0x3a, 0x02, 0xd8, 0x1b, 0xbd, 0x6b, 0x09, 0xba, + 0xf0, 0xaf, 0x84, 0xa1, 0x67, 0x95, 0x60, 0x63, + 0x62, 0xc4, 0x2f, 0x87, 0x8a, 0xeb, 0x13, 0xc0, + 0xf1, 0x9a, 0x88, 0x1f, 0x7b, 0x0b, 0x63, 0x2d, + 0x39, 0x95, 0x2b, 0xbe, 0xa5, 0x03, 0x8c, 0x67, + 0xd4, 0x23, 0x1f, 0x30, 0xa8, 0xe5, 0x75, 0x43, + 0x60, 0x33, 0x3d, 0xcf, 0x96, 0xf1, 0x63, 0xca, + 0xe7, 0xd0, 0xab, 0x25, 0xa3, 0xb1, 0x1e, 0x37, + 0xe4, 0x89, 0x6f, 0x07, 0x32, 0x8e, 0x2c, 0x78, + 0x03, 0xb3, 0x97, 0x72, 0x27, 0xcd, 0x03, 0x84, + 0x54, 0x6e, 0x69, 0x92, 0x57, 0xdb, 0x7c, 0xe7, + 0x8c, 0xc0, 0x15, 0x5b, 0x87, 0x5b, 0xe2, 0xee, + 0xc1, 0xeb, 0x53, 0x64, 0x0b, 0xed, 0x83, 0xca, + 0x61, 0xfb, 0x2a, 0x96, 0x62, 0xd0, 0xf7, 0xc1, + 0x41, 0x8d, 0x8d, 0x3f, 0x69, 0x52, 0x4b, 0x57, + 0x63, 0x28, 0xaa, 0x11, 0xe3, 0xb5, 0xb1, 0x37, + 0x91, 0x57, 0x52, 0x98, 0x03, 0xe1, 0x8d, 0xd6, + 0x8c, 0xb5, 0xb6, 0xc9, 0x59, 0x56, 0x54, 0x53, + 0xba, 0xf5, 0x25, 0xac, 0x6b, 0xf9, 0x58, 0xc5, + 0x49, 0x71, 0x88, 0x7f, 0x67, 0x1b, 0x8e, 0x5d, + 0x0b, 0xc1, 0xef, 0xa9, 0x0d, 0x2f, 0x15, 0x62, + 0x3b, 0x86, 0xdb, 0x7b, 0xc8, 0xbc, 0x35, 0x13, + 0xda, 0xdc, 0x11, 0x44, 0xf6, 0xc7, 0x66, 0xdb, + 0x08, 0xfa, 0x12, 0xa8, 0x3d, 0xa8, 0xfb, 0xc2, + 0x7f, 0xbc, 0x77, 0x7e, 0xeb, 0x3d, 0xcb, 0x7e, + 0x7f, 0xb3, 0xd4, 0x7b, 0xcf, 0x92, 0x91, 0x97, + 0xb6, 0x30, 0x5b, 0xd8, 0x8b, 0x48, 0xb1, 0x0b, + 0x42, 0xd0, 0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0xa4, + 0x8d, 0xa6, 0xcc, 0x93, 0x84, 0x2d, 0xa5, 0x07, + 0xe3, 0xdf, 0x06, 0x64, 0xc1, 0xb7, 0x12, 0xc8, + 0xb2, 0x57, 0x08, 0xf9, 0x14, 0x4c, 0xc5, 0xbd, + 0x88, 0xe2, 0x60, 0xb6, 0x82, 0xa6, 0x38, 0xb5, + 0xdc, 0x3c, 0xda, 0x56, 0x4a, 0x39, 0x5c, 0xd6, + 0x72, 0x26, 0x44, 0xe3, 0x78, 0xd9, 0x9c, 0x04, + 0x69, 0xe2, 0x79, 0x79, 0x90, 0xe2, 0x7e, 0x6b, + 0x5b, 0xd0, 0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0xb4, + 0x2d, 0x0b, 0x42, 0x7d, 0xf3, 0x65, 0x5c, 0x2c, + 0x3d, 0x49, 0x84, 0xe8, 0xba, 0xa8, 0xb8, 0xd2, + 0xf2, 0x77, 0x61, 0x6b, 0xc0, 0xb4, 0x4d, 0xc0, + 0x2c, 0x9d, 0x80, 0x02, 0x1c, 0x2c, 0xe6, 0x38, + 0x5c, 0x15, 0x1c, 0xf6, 0x60, 0xc9, 0x8b, 0x35, + 0x80, 0x6f, 0x42, 0xaa, 0x02, 0xdf, 0xa4, 0x70, + 0xd0, 0x8c, 0x36, 0x39, 0x1a, 0xd3, 0x89, 0xb9, + 0x46, 0xdf, 0x09, 0xf4, 0x29, 0x21, 0x75, 0x9c, + 0x1e, 0xfc, 0xa1, 0x77, 0x1d, 0xd3, 0x65, 0x8f, + 0x33, 0xda, 0xb0, 0xb6, 0x18, 0x1b, 0x19, 0xd3, + 0x18, 0x8f, 0x7a, 0x50, 0x96, 0x33, 0x81, 0xe3, + 0x91, 0x3a, 0x3b, 0x32, 0x36, 0xbb, 0x85, 0x93, + 0x6d, 0xb1, 0x28, 0x1c, 0xdc, 0x2d, 0x31, 0x33, + 0x26, 0x33, 0x69, 0x1e, 0x95, 0x18, 0xb3, 0x62, + 0x6c, 0x67, 0x13, 0x5b, 0x10, 0xb0, 0x07, 0x95, + 0x39, 0x85, 0xac, 0x6e, 0x3e, 0x19, 0x63, 0x6c, + 0x5f, 0xeb, 0x52, 0x4a, 0x5a, 0xc3, 0x94, 0x66, + 0x4d, 0xcd, 0xb6, 0x62, 0x13, 0x37, 0xac, 0xde, + 0xc5, 0x91, 0xd1, 0xc4, 0xa3, 0x83, 0x33, 0x18, + 0xd9, 0x72, 0x98, 0x80, 0xce, 0x0a, 0xa9, 0x2e, + 0x96, 0x07, 0xe5, 0x59, 0x84, 0x64, 0x85, 0x8b, + 0xbd, 0x27, 0x74, 0x34, 0x0c, 0xe5, 0x4a, 0x47, + 0x2a, 0x83, 0xda, 0x8f, 0xbc, 0x27, 0xfb, 0xc7, + 0x77, 0xee, 0xb3, 0xdc, 0xb7, 0xe7, 0xf4, 0x65, + 0x7c, 0xb2, 0x64, 0x69, 0xe1, 0x6e, 0x29, 0x1e, + 0xa4, 0x9a, 0x8a, 0xa9, 0xf8, 0xe3, 0xd3, 0x1c, + 0xf6, 0x04, 0xfa, 0x96, 0x5a, 0x1a, 0x77, 0x3e, + 0x3e, 0x5e, 0x54, 0x4c, 0x50, 0x17, 0x59, 0xf9, + 0x33, 0x9c, 0x69, 0x5e, 0x36, 0xe1, 0x9f, 0x16, + 0x76, 0xdc, 0x66, 0x6f, 0x2a, 0xf1, 0x93, 0x4e, + 0xec, 0x8d, 0xb1, 0x5f, 0xd1, 0xcb, 0x65, 0x04, + 0x99, 0x3b, 0xb2, 0x73, 0x86, 0x32, 0x08, 0x37, + 0x2a, 0xb2, 0x1a, 0xca, 0x62, 0xe9, 0xa0, 0x61, + 0x93, 0x7b, 0x2f, 0xab, 0x36, 0x65, 0x4b, 0x30, + 0xc4, 0xc6, 0x61, 0xca, 0x4e, 0x31, 0x7d, 0x5c, + 0xf6, 0xff, 0x00, 0x6d, 0x95, 0x4c, 0x4c, 0xe0, + 0x32, 0x47, 0x34, 0x73, 0xaa, 0x99, 0xcb, 0x9e, + 0x27, 0x61, 0x21, 0x8d, 0x1a, 0x0e, 0x6b, 0xaa, + 0xaa, 0x99, 0x5c, 0xf6, 0xb9, 0x81, 0xd8, 0x03, + 0x78, 0xec, 0x13, 0xdf, 0x50, 0xf7, 0x47, 0x1f, + 0x05, 0x98, 0x74, 0xb9, 0xda, 0x7e, 0x95, 0x47, + 0xbc, 0xf9, 0x27, 0xac, 0x9b, 0xe9, 0x99, 0x33, + 0x70, 0x34, 0xdc, 0xe6, 0x2b, 0xcd, 0xed, 0xeb, + 0x4a, 0xf3, 0x7b, 0x7a, 0xd2, 0xbc, 0xde, 0xde, + 0xb4, 0xaf, 0x37, 0xb7, 0xad, 0x2b, 0xcd, 0xed, + 0xeb, 0x4a, 0xf3, 0x7b, 0x7a, 0xd2, 0xbc, 0xde, + 0xde, 0xb4, 0xaf, 0x37, 0xb7, 0xad, 0x2b, 0xcd, + 0xed, 0xeb, 0x4a, 0xf3, 0x7b, 0x7a, 0xd2, 0xbc, + 0xde, 0xde, 0xb4, 0xaf, 0x37, 0xb7, 0xad, 0x2b, + 0xcd, 0xed, 0xeb, 0x4a, 0xf3, 0x7b, 0x7a, 0xd2, + 0xbc, 0xde, 0xde, 0xb4, 0xaf, 0x37, 0xb7, 0xad, + 0x2b, 0xcd, 0xed, 0xeb, 0x4a, 0xf3, 0x7b, 0x7a, + 0xd2, 0xbc, 0xde, 0xde, 0xb4, 0xaf, 0x37, 0xb7, + 0xad, 0x2b, 0xc9, 0xd1, 0x46, 0xd7, 0x72, 0xb9, + 0xc5, 0xca, 0x32, 0x7f, 0xc3, 0x6e, 0xe5, 0x2b, + 0x67, 0x84, 0xc9, 0x8a, 0x3e, 0x1b, 0x0e, 0x70, + 0xb5, 0x55, 0x3f, 0x75, 0x6a, 0xaa, 0x7e, 0xea, + 0xd5, 0x54, 0xfd, 0xd5, 0xaa, 0xa9, 0xfb, 0xab, + 0x55, 0x53, 0xf7, 0x56, 0xaa, 0xa7, 0xee, 0xad, + 0x55, 0x4f, 0xdd, 0x5a, 0xaa, 0x9f, 0xba, 0xb5, + 0x55, 0x3f, 0x75, 0x6a, 0xaa, 0x7e, 0xea, 0xd5, + 0x54, 0xfd, 0xd5, 0xaa, 0xa9, 0xfb, 0xab, 0x55, + 0x53, 0xf7, 0x56, 0xaa, 0xa7, 0xee, 0xad, 0x55, + 0x4f, 0xdd, 0x5a, 0xaa, 0x9f, 0xba, 0xb5, 0x55, + 0x3f, 0x75, 0x6a, 0xaa, 0x7e, 0xea, 0xd5, 0x54, + 0xfd, 0xd5, 0xaa, 0xa9, 0xfb, 0xab, 0x55, 0x53, + 0xf7, 0x54, 0xd3, 0xd3, 0x46, 0xe6, 0x39, 0x84, + 0x37, 0x13, 0xf4, 0xee, 0x41, 0xed, 0x47, 0xde, + 0x13, 0xfd, 0xe3, 0xbb, 0xf7, 0x59, 0xee, 0x5b, + 0xf3, 0xfa, 0x3e, 0x12, 0xa2, 0x69, 0x02, 0x69, + 0x5a, 0x1c, 0xc1, 0xcb, 0x65, 0x35, 0x45, 0x47, + 0xe8, 0xcd, 0x8f, 0x40, 0x93, 0xeb, 0x9f, 0x42, + 0xf0, 0x1c, 0x94, 0x8d, 0x73, 0xa0, 0x6b, 0x19, + 0x9d, 0xba, 0x1a, 0x78, 0xee, 0xbc, 0x2e, 0xe8, + 0x5d, 0x66, 0x9a, 0xa0, 0x2e, 0xdf, 0x50, 0xba, + 0xa4, 0x70, 0x69, 0x7b, 0x59, 0x39, 0x2f, 0xb7, + 0x10, 0x4f, 0x9e, 0x2f, 0x07, 0x3a, 0xa0, 0x64, + 0x75, 0xf9, 0x6c, 0x2c, 0x2c, 0xb7, 0x32, 0xbc, + 0xef, 0x0c, 0x6c, 0xd2, 0xda, 0x9b, 0x10, 0xbd, + 0x9f, 0x6d, 0x2a, 0x76, 0x3d, 0xce, 0x6c, 0xb9, + 0xdb, 0x26, 0x7d, 0x2a, 0xd9, 0x57, 0xda, 0xd8, + 0x6d, 0x8b, 0x8b, 0x4a, 0x91, 0xfe, 0x10, 0x13, + 0x4a, 0x1d, 0x9e, 0xf1, 0x9c, 0xf7, 0x46, 0x68, + 0xae, 0xd8, 0x45, 0x78, 0xb6, 0x2d, 0x38, 0x6d, + 0xf8, 0x29, 0xe8, 0x59, 0xc1, 0x8a, 0x8a, 0x67, + 0xf4, 0x9d, 0xf8, 0x2a, 0x46, 0xd3, 0xd6, 0xe2, + 0x10, 0xc4, 0x5a, 0x20, 0xc9, 0x9d, 0x3c, 0x66, + 0xe9, 0xed, 0x8a, 0x4c, 0xb4, 0x60, 0xe6, 0x7d, + 0xad, 0x7f, 0xa3, 0x51, 0xef, 0x3e, 0x49, 0xeb, + 0xf8, 0x6d, 0xfa, 0x71, 0x16, 0xc4, 0xd6, 0x38, + 0x4b, 0x84, 0xbb, 0x8d, 0xd9, 0x95, 0x6b, 0x5c, + 0xc0, 0x64, 0x38, 0x43, 0x1d, 0x6c, 0xe0, 0xd9, + 0xc7, 0xe4, 0xa8, 0x43, 0xa3, 0x6b, 0xa4, 0x7d, + 0x4b, 0x0b, 0x89, 0x1c, 0x46, 0xf9, 0xbb, 0x14, + 0xae, 0x96, 0x28, 0x1a, 0xe1, 0x20, 0x0c, 0x30, + 0x06, 0xfa, 0x74, 0xe1, 0x41, 0xf4, 0xf4, 0xad, + 0xa8, 0x7e, 0x59, 0xc1, 0xc4, 0xc2, 0x24, 0xcd, + 0x60, 0xa0, 0x12, 0xb4, 0x41, 0x2b, 0xa6, 0x90, + 0x3a, 0xd1, 0xe7, 0xd0, 0xdc, 0xd6, 0x08, 0xe2, + 0x7c, 0x8d, 0x8f, 0x27, 0x94, 0xcf, 0x16, 0xff, + 0x00, 0x4d, 0xb8, 0x2a, 0xa7, 0x14, 0xc3, 0x03, + 0x65, 0x8e, 0xd2, 0x86, 0x5c, 0xda, 0xce, 0xfe, + 0xbe, 0x0a, 0x48, 0x89, 0xc5, 0x80, 0xda, 0xfc, + 0xbf, 0x4e, 0x2f, 0x76, 0xde, 0xed, 0xca, 0x1f, + 0x77, 0xf3, 0xfa, 0x15, 0x33, 0x49, 0x03, 0x67, + 0x2d, 0x73, 0x00, 0x0e, 0x24, 0x69, 0xbf, 0x27, + 0xa9, 0x07, 0x45, 0x86, 0x9d, 0xb9, 0x11, 0x33, + 0x9b, 0x21, 0x3b, 0xdc, 0xf6, 0xfc, 0xd6, 0x2c, + 0x6c, 0x2e, 0x0d, 0x0f, 0x31, 0x03, 0xbe, 0x03, + 0x95, 0x42, 0xc2, 0x62, 0x94, 0x99, 0x44, 0x6e, + 0x66, 0x23, 0xbd, 0x3c, 0x87, 0xf2, 0x4d, 0x90, + 0xc9, 0x13, 0x4b, 0x86, 0x21, 0x19, 0x3b, 0xe2, + 0x14, 0xa3, 0x14, 0x50, 0xf9, 0x57, 0x44, 0xd6, + 0x97, 0x1c, 0xe7, 0x90, 0x7e, 0x69, 0xae, 0xc7, + 0x1c, 0x78, 0x9e, 0x62, 0x01, 0xe7, 0x3e, 0x2c, + 0xd9, 0xbb, 0x54, 0xef, 0x9c, 0x13, 0x1c, 0x0d, + 0xc4, 0x5a, 0x0d, 0xae, 0x6f, 0x6b, 0x27, 0x4d, + 0x04, 0x39, 0x09, 0x23, 0x70, 0x6b, 0x98, 0x1c, + 0x48, 0x20, 0xfa, 0xd6, 0x4c, 0x4b, 0x0b, 0x9c, + 0x09, 0x0f, 0xb3, 0xb8, 0x16, 0xd3, 0x75, 0x36, + 0xae, 0x56, 0x88, 0xc3, 0xc3, 0xda, 0xe3, 0xa3, + 0x10, 0x19, 0xbf, 0x35, 0x82, 0x2c, 0x31, 0x7e, + 0x93, 0x33, 0x31, 0x3d, 0xd9, 0x83, 0x5b, 0x6b, + 0x29, 0x9c, 0xe9, 0xe3, 0xc2, 0xd8, 0xb2, 0x8c, + 0x73, 0x6f, 0x67, 0x6f, 0xad, 0xc8, 0xb1, 0x63, + 0x8f, 0x10, 0x68, 0x79, 0x8a, 0xfb, 0xe0, 0xde, + 0x54, 0x62, 0x73, 0xd8, 0xf7, 0xb7, 0x4e, 0x0e, + 0x2f, 0xa1, 0x55, 0xef, 0x1b, 0xb9, 0x07, 0xb5, + 0x1f, 0x78, 0x4f, 0xf7, 0x8e, 0xef, 0xdd, 0x67, + 0xb9, 0x6f, 0xcf, 0xe8, 0x82, 0xd3, 0x62, 0x38, + 0xc2, 0x19, 0x69, 0xa4, 0x96, 0xda, 0x31, 0xba, + 0xe8, 0xb2, 0x39, 0xa4, 0x63, 0x0e, 0x96, 0xb5, + 0xc4, 0x02, 0x8c, 0x42, 0x47, 0x64, 0xc9, 0xb9, + 0x65, 0xf3, 0x27, 0x46, 0xd9, 0x5e, 0xd8, 0xdd, + 0xa5, 0x81, 0xd9, 0x8a, 0xc8, 0xe5, 0xa4, 0xc9, + 0x7d, 0x8c, 0x59, 0xb9, 0x93, 0x03, 0xa4, 0x7b, + 0x84, 0x7c, 0x00, 0x5d, 0xc1, 0xf5, 0x22, 0xf9, + 0x5e, 0xe9, 0x1e, 0x7e, 0xb3, 0x8d, 0xce, 0xee, + 0x4b, 0x1b, 0xb2, 0x64, 0xdf, 0x05, 0xf3, 0x5d, + 0x39, 0xf9, 0x79, 0x31, 0xb8, 0x61, 0x73, 0xb1, + 0x1b, 0x91, 0xc8, 0xb1, 0xc4, 0xf7, 0x46, 0xef, + 0xb4, 0xd3, 0x63, 0xf4, 0xaa, 0x3d, 0xe7, 0xc9, + 0x3d, 0x7f, 0x0d, 0xbf, 0x4c, 0x43, 0x8a, 0x6c, + 0xad, 0xf1, 0xf0, 0x05, 0xaf, 0x6d, 0x1a, 0x53, + 0xac, 0x0e, 0x3c, 0xab, 0x24, 0x1c, 0x99, 0xaf, + 0xf8, 0xa0, 0xe0, 0xc7, 0x88, 0xdb, 0x51, 0x1b, + 0xda, 0x3f, 0x71, 0xa2, 0xdc, 0xea, 0xa1, 0xb0, + 0x65, 0x5e, 0xe9, 0xf4, 0x99, 0x1a, 0x05, 0x85, + 0xef, 0xca, 0x99, 0x00, 0xc4, 0x1e, 0x24, 0x2f, + 0xbf, 0xc0, 0x7e, 0x0a, 0x36, 0x3f, 0x1d, 0xc1, + 0x96, 0xee, 0x6e, 0x91, 0x89, 0xa0, 0x66, 0xe6, + 0x50, 0x06, 0xba, 0xa6, 0x27, 0x44, 0xd2, 0xd1, + 0x23, 0x2d, 0x7d, 0x37, 0xbe, 0x95, 0x50, 0x03, + 0x5c, 0x0c, 0x8f, 0x63, 0xae, 0x78, 0xec, 0xd2, + 0x09, 0x3e, 0x93, 0x75, 0x24, 0xad, 0xb8, 0x6b, + 0x8f, 0x1f, 0xd3, 0x8b, 0xdd, 0xb7, 0xbb, 0x72, + 0x87, 0xdd, 0xfc, 0xfe, 0x85, 0x48, 0x8e, 0x57, + 0x45, 0x33, 0xdc, 0xcb, 0x61, 0xe4, 0xcf, 0x75, + 0x5a, 0x66, 0x90, 0xba, 0x49, 0x63, 0x00, 0x17, + 0x67, 0xb9, 0xc4, 0xdf, 0xc1, 0x65, 0x59, 0x2c, + 0x6d, 0x71, 0x63, 0x5b, 0x93, 0xc8, 0x0c, 0x7c, + 0x57, 0xdf, 0x5b, 0x42, 0x8e, 0xa8, 0x4e, 0x5d, + 0x8a, 0xa0, 0x49, 0x6c, 0x27, 0x78, 0xdb, 0xdc, + 0xdf, 0xf2, 0x58, 0x25, 0x9c, 0x48, 0xcc, 0x26, + 0xd0, 0xba, 0x3d, 0xf3, 0x5d, 0xc5, 0x63, 0xc8, + 0xb1, 0x3a, 0x7c, 0x9b, 0x63, 0xa9, 0x7c, 0x83, + 0x7a, 0x77, 0xed, 0x26, 0xf9, 0xbd, 0x39, 0x95, + 0x33, 0x89, 0xc2, 0x45, 0x53, 0xa5, 0x70, 0xe4, + 0x07, 0x0f, 0xe0, 0x55, 0x53, 0x24, 0x24, 0x43, + 0x3d, 0xc6, 0x20, 0x34, 0x67, 0xb8, 0x29, 0xd0, + 0x45, 0x36, 0x58, 0xc8, 0xe0, 0x5e, 0xf6, 0xb6, + 0xc0, 0x01, 0xeb, 0x44, 0x4b, 0x38, 0x9d, 0xef, + 0xbb, 0x32, 0xc2, 0x3b, 0x39, 0xad, 0x2d, 0x23, + 0x7d, 0xcb, 0xc4, 0xaa, 0x18, 0xc9, 0x72, 0x98, + 0xe2, 0x03, 0x15, 0xb3, 0x17, 0x63, 0x07, 0x37, + 0xc1, 0x39, 0xd9, 0x4b, 0x79, 0x69, 0xdc, 0xd7, + 0x96, 0x9d, 0xee, 0x20, 0x30, 0xb9, 0x60, 0x7d, + 0x59, 0x7b, 0xf2, 0x06, 0x22, 0xf7, 0x87, 0x69, + 0xc6, 0x1c, 0xa4, 0xa8, 0x12, 0xde, 0x49, 0x21, + 0x11, 0xe4, 0xb0, 0x9c, 0xc6, 0xc0, 0x1f, 0x82, + 0xa9, 0x91, 0x86, 0xec, 0x7c, 0x8e, 0x20, 0xfa, + 0x2f, 0xf4, 0x2a, 0xbd, 0xe3, 0x77, 0x20, 0xf6, + 0x99, 0xde, 0x13, 0xfd, 0xe3, 0xbb, 0xf7, 0x59, + 0xee, 0x5b, 0xf3, 0xfa, 0x34, 0x93, 0x02, 0x71, + 0x4b, 0x8e, 0xff, 0x00, 0x02, 0xa8, 0x8c, 0x01, + 0xcf, 0x9a, 0x76, 0xbc, 0x96, 0xdf, 0x90, 0x9f, + 0xc1, 0x35, 0xf2, 0xb2, 0xcd, 0x26, 0xd7, 0x04, + 0x1c, 0xfc, 0x8b, 0xc6, 0xc5, 0xb8, 0x78, 0x6d, + 0x88, 0x2c, 0xa4, 0xb1, 0x61, 0x6e, 0x83, 0x9c, + 0x1b, 0x7a, 0xf9, 0x15, 0xa5, 0x93, 0x25, 0x1e, + 0x92, 0x6d, 0x7e, 0x64, 0xfa, 0x5c, 0xae, 0x4e, + 0x06, 0xbb, 0x58, 0xfe, 0x4b, 0x28, 0x9f, 0x44, + 0x65, 0x18, 0xa6, 0x10, 0x96, 0xcd, 0x6d, 0x27, + 0x41, 0xcc, 0xaa, 0x0d, 0x2b, 0xe5, 0x73, 0xe9, + 0xf8, 0x59, 0x4b, 0x59, 0xe2, 0xf6, 0xb8, 0x55, + 0x77, 0x73, 0x84, 0x91, 0xb2, 0xf1, 0xdb, 0x8c, + 0xaa, 0x83, 0x23, 0x9c, 0xd6, 0xc7, 0x19, 0x23, + 0x0f, 0x1b, 0xad, 0x71, 0xdc, 0x55, 0x36, 0x12, + 0x4e, 0x56, 0x11, 0x21, 0xbf, 0x2e, 0x75, 0x13, + 0x29, 0xf7, 0xd8, 0xa0, 0x64, 0xa7, 0x28, 0xf0, + 0xdd, 0x23, 0xd2, 0x9a, 0x26, 0x68, 0x6e, 0x21, + 0x88, 0x59, 0xc0, 0xdc, 0x7c, 0x3e, 0x8d, 0x47, + 0xbc, 0xf9, 0x27, 0xa6, 0xc3, 0x2d, 0x39, 0x99, + 0xf8, 0x01, 0xc5, 0x99, 0x6c, 0x27, 0x99, 0xab, + 0x61, 0x3c, 0xcd, 0x5b, 0x09, 0xe6, 0x6a, 0xd8, + 0x4f, 0x33, 0x56, 0xc2, 0x79, 0x9a, 0xb6, 0x13, + 0xcc, 0xd5, 0xb0, 0x9e, 0x66, 0xad, 0x84, 0xf3, + 0x35, 0x6c, 0x27, 0x99, 0xab, 0x61, 0x3c, 0xcd, + 0x5b, 0x09, 0xe6, 0x6a, 0xd8, 0x4f, 0x33, 0x56, + 0xc2, 0x79, 0x9a, 0xb6, 0x13, 0xcc, 0xd5, 0xb0, + 0x9e, 0x66, 0xad, 0x84, 0xf3, 0x35, 0x6c, 0x27, + 0x99, 0xab, 0x61, 0x3c, 0xcd, 0x5b, 0x09, 0xe6, + 0x6a, 0xd8, 0x4f, 0x33, 0x56, 0xc2, 0x79, 0x9a, + 0x83, 0xb8, 0x9c, 0xc0, 0x77, 0x29, 0x04, 0xd4, + 0xb1, 0x4f, 0xe4, 0xf4, 0xc8, 0x74, 0x67, 0x5e, + 0x6e, 0xa6, 0xe9, 0x2f, 0x37, 0x53, 0x74, 0x96, + 0x6f, 0x06, 0x53, 0x9f, 0x89, 0x5e, 0x6b, 0xa7, + 0xe7, 0x2b, 0xcd, 0x74, 0xfc, 0xe5, 0x79, 0xae, + 0x9f, 0x9c, 0xaf, 0x35, 0xd3, 0xf3, 0x95, 0xe6, + 0xba, 0x7e, 0x72, 0xbc, 0xd7, 0x4f, 0xce, 0x57, + 0x9a, 0xe9, 0xf9, 0xca, 0xf3, 0x5d, 0x3f, 0x39, + 0x5e, 0x6b, 0xa7, 0xe7, 0x2b, 0xcd, 0x74, 0xfc, + 0xe5, 0x79, 0xae, 0x9f, 0x9c, 0xaf, 0x35, 0xd3, + 0xf3, 0x95, 0xe6, 0xba, 0x7e, 0x72, 0xbc, 0xd7, + 0x4f, 0xce, 0x57, 0x9a, 0xe9, 0xf9, 0xca, 0xf3, + 0x5d, 0x3f, 0x39, 0x5e, 0x6b, 0xa7, 0xe7, 0x2b, + 0xcd, 0x74, 0xfc, 0xe5, 0x55, 0x64, 0xe9, 0x99, + 0x4e, 0x03, 0x9b, 0x99, 0x9c, 0x7b, 0x90, 0x7b, + 0x4c, 0xef, 0x09, 0xfe, 0xf1, 0xdd, 0xfb, 0xac, + 0xf7, 0x2d, 0xf9, 0xfd, 0x1a, 0x23, 0x0b, 0x0c, + 0x99, 0x27, 0x3d, 0xaf, 0xc2, 0x2f, 0x6b, 0xe7, + 0x0b, 0xc1, 0x14, 0xe7, 0x79, 0x3b, 0x22, 0x90, + 0x91, 0xf6, 0x6f, 0x88, 0x85, 0x52, 0x25, 0x69, + 0x65, 0xe7, 0x60, 0x68, 0x70, 0xe3, 0xb1, 0xba, + 0xa5, 0x73, 0x86, 0xf1, 0xb5, 0xcd, 0x2e, 0x3c, + 0x99, 0x97, 0x85, 0xcc, 0xed, 0x73, 0x46, 0x1c, + 0x3b, 0xee, 0x37, 0x63, 0x16, 0x56, 0x63, 0x4b, + 0x8f, 0x20, 0x0a, 0x48, 0x9a, 0xd2, 0x32, 0x8e, + 0xcc, 0xe2, 0x33, 0x68, 0x54, 0x51, 0xb6, 0x37, + 0xc7, 0x47, 0x14, 0xc0, 0xe3, 0x7b, 0x6d, 0x8c, + 0xfd, 0xa2, 0xbc, 0x28, 0xe9, 0x98, 0x58, 0x30, + 0x64, 0x85, 0xc6, 0x92, 0x5c, 0x3f, 0x05, 0x57, + 0x33, 0x74, 0xb1, 0xd1, 0x3b, 0xef, 0x26, 0xc1, + 0x1f, 0x06, 0x51, 0x35, 0x47, 0xfa, 0x70, 0x1c, + 0x1f, 0x35, 0x40, 0xc1, 0x4f, 0x4f, 0x2f, 0xe8, + 0xcd, 0x37, 0x96, 0x20, 0xe3, 0xc6, 0xa0, 0x7b, + 0xc6, 0x18, 0x5b, 0x4b, 0x1c, 0x92, 0x60, 0x1a, + 0x05, 0xb4, 0x04, 0x64, 0x91, 0x86, 0x31, 0xa1, + 0xac, 0xfb, 0x23, 0x88, 0x7d, 0x1a, 0x8f, 0x79, + 0xf2, 0x4f, 0x5f, 0xc3, 0x6f, 0xd2, 0xa7, 0x92, + 0xa8, 0xb5, 0x8c, 0x75, 0x43, 0x1d, 0x0b, 0x74, + 0x06, 0x34, 0x1c, 0xff, 0x00, 0x05, 0x1c, 0xb3, + 0xd5, 0xb6, 0xa6, 0x26, 0x07, 0xb8, 0x3a, 0xf8, + 0x83, 0x1c, 0x1b, 0x75, 0x0c, 0xa6, 0x6f, 0x18, + 0x6b, 0x9b, 0x9a, 0x42, 0xdb, 0x3b, 0x4f, 0x1a, + 0x6d, 0x53, 0x08, 0x74, 0xd9, 0x18, 0x99, 0x9b, + 0xfb, 0xb0, 0x5b, 0xa7, 0xe4, 0xbc, 0x1a, 0x3c, + 0x71, 0xb0, 0xc7, 0x9f, 0x14, 0x2e, 0xbe, 0xff, + 0x00, 0x7e, 0x7e, 0x0a, 0xf3, 0x37, 0x26, 0xd6, + 0xb8, 0x82, 0x2d, 0x7c, 0x07, 0xf2, 0x54, 0x2e, + 0x92, 0x68, 0xea, 0xe2, 0xf1, 0x86, 0xda, 0x66, + 0x9b, 0x91, 0x9f, 0x42, 0xab, 0x35, 0xb3, 0x09, + 0x22, 0x3b, 0xd8, 0xc6, 0x50, 0x3f, 0x7f, 0x7e, + 0x2b, 0x68, 0xcc, 0xb2, 0x46, 0x17, 0xb5, 0xb0, + 0x35, 0xb2, 0xe3, 0x2d, 0xcc, 0x49, 0xe1, 0x67, + 0xf8, 0x8e, 0x8a, 0xf0, 0x75, 0xf4, 0x31, 0x8c, + 0x64, 0x9e, 0xce, 0x00, 0xef, 0xfd, 0x94, 0x8f, + 0xfb, 0x4d, 0x61, 0xfb, 0xa3, 0xe9, 0x45, 0xee, + 0xdb, 0xdd, 0xb9, 0xe0, 0xdf, 0x74, 0x7b, 0xd4, + 0x0c, 0xbc, 0xaf, 0xca, 0x48, 0x22, 0x38, 0x24, + 0xd1, 0x98, 0x7e, 0xe7, 0xa7, 0xd2, 0x9a, 0xf1, + 0x1c, 0xc5, 0xd2, 0x87, 0x39, 0x96, 0x70, 0x38, + 0x6d, 0xcb, 0x9b, 0x3f, 0x62, 0xac, 0xb3, 0x23, + 0x7b, 0xdb, 0x19, 0x2d, 0xca, 0xdb, 0x0d, 0xee, + 0xde, 0x5c, 0xca, 0x91, 0xaf, 0x0c, 0x86, 0x47, + 0xb7, 0x7e, 0x61, 0x6d, 0xda, 0x73, 0x9d, 0x16, + 0xe3, 0xf5, 0x29, 0xcc, 0xae, 0x92, 0xd9, 0x0c, + 0xa3, 0x2f, 0x1d, 0x8f, 0x0a, 0xd9, 0xc5, 0xff, + 0x00, 0xab, 0xa1, 0x26, 0x59, 0xd1, 0xc3, 0x82, + 0x3b, 0x9c, 0x9d, 0xc9, 0x73, 0x9b, 0x7e, 0x55, + 0x8a, 0x69, 0xf0, 0xf9, 0x53, 0x1e, 0x66, 0xdf, + 0x93, 0x3f, 0x31, 0x53, 0x97, 0xbb, 0x3c, 0x72, + 0xe4, 0x80, 0xb7, 0x0b, 0xfa, 0xf9, 0xa6, 0xba, + 0x28, 0xa9, 0x9c, 0xf3, 0x31, 0x04, 0xce, 0x19, + 0xa2, 0xc3, 0x95, 0x4e, 0xc8, 0xb1, 0xc7, 0xe5, + 0x30, 0xb5, 0x82, 0x22, 0x6d, 0xeb, 0xe4, 0x08, + 0x19, 0x27, 0x11, 0xcc, 0xe6, 0x97, 0xb6, 0x32, + 0x38, 0xbd, 0x7f, 0x04, 0x24, 0xcd, 0x18, 0x2c, + 0x88, 0x31, 0xa0, 0x70, 0xdd, 0x81, 0xb7, 0x59, + 0x28, 0xa7, 0x12, 0x48, 0xd9, 0x04, 0x72, 0x0c, + 0x36, 0x03, 0xf1, 0x4c, 0x74, 0x4f, 0xca, 0xf9, + 0x62, 0x31, 0x96, 0x61, 0x3a, 0x02, 0xa3, 0x7c, + 0x42, 0x21, 0x76, 0xbb, 0x11, 0x73, 0xda, 0xd2, + 0x77, 0xc7, 0x95, 0x3c, 0x11, 0x1b, 0x63, 0x26, + 0x70, 0x06, 0x0e, 0x0d, 0xa3, 0x19, 0xd0, 0x98, + 0x54, 0x7e, 0x8b, 0x83, 0x11, 0x7e, 0x0c, 0xfa, + 0x6d, 0x6b, 0x29, 0x65, 0x33, 0xf9, 0x36, 0xe1, + 0xc1, 0x66, 0x70, 0xb1, 0x03, 0x6e, 0xe4, 0xfb, + 0x4f, 0x8a, 0x56, 0xc4, 0xd9, 0xb0, 0xe1, 0xcd, + 0x63, 0x6e, 0x3f, 0x8a, 0xa7, 0x73, 0x9e, 0xf7, + 0x42, 0xe9, 0x5b, 0x1b, 0x89, 0x88, 0xb6, 0xf7, + 0xe4, 0xe5, 0x08, 0x13, 0x50, 0x63, 0x6c, 0x92, + 0x16, 0x45, 0x76, 0x69, 0xf5, 0xe7, 0xcd, 0xa5, + 0x57, 0x34, 0xe9, 0x12, 0x34, 0x1e, 0xdd, 0xc8, + 0x3d, 0xa6, 0x77, 0x84, 0xff, 0x00, 0x78, 0xee, + 0xfd, 0xd6, 0x7b, 0x96, 0xfc, 0xfe, 0x8d, 0xe2, + 0x95, 0xf1, 0x1e, 0x56, 0x3a, 0xc8, 0x4f, 0x2e, + 0x27, 0xe6, 0x75, 0xf8, 0xce, 0x70, 0x42, 0x68, + 0x92, 0x57, 0xc9, 0x87, 0x46, 0x27, 0x5e, 0xc9, + 0xcc, 0x6c, 0x8e, 0x6b, 0x1d, 0xc2, 0x68, 0x39, + 0x8a, 0x6b, 0x64, 0x95, 0xf2, 0x35, 0xba, 0x03, + 0x9d, 0x7b, 0x2c, 0x51, 0x48, 0xf8, 0x9d, 0xa2, + 0xec, 0x36, 0x4d, 0x71, 0xaa, 0x98, 0xb9, 0xba, + 0x09, 0x90, 0xe6, 0x58, 0x65, 0xa8, 0x96, 0x56, + 0xf2, 0x3d, 0xe4, 0x84, 0xd6, 0xc9, 0x2b, 0xde, + 0xd6, 0xe8, 0x0e, 0x75, 0xec, 0x9c, 0xd0, 0xe2, + 0x1a, 0xed, 0x22, 0xfa, 0x50, 0x76, 0x51, 0xf8, + 0x80, 0xc2, 0x0d, 0xf8, 0xb9, 0x13, 0x71, 0x38, + 0xbb, 0x08, 0xb0, 0xb9, 0xd0, 0x15, 0xd9, 0x51, + 0x2b, 0x0d, 0xb0, 0xdd, 0xaf, 0x23, 0x37, 0x22, + 0x06, 0x69, 0x9f, 0x29, 0x1a, 0x31, 0xba, 0xff, + 0x00, 0x46, 0xa3, 0xde, 0x7c, 0x93, 0xd7, 0xf0, + 0xdb, 0xf4, 0x73, 0xe7, 0x08, 0x4a, 0x29, 0x1c, + 0x1e, 0x08, 0xcc, 0xf9, 0x31, 0x36, 0xdc, 0x96, + 0xb2, 0x63, 0x60, 0xa7, 0xc1, 0x10, 0x24, 0xb9, + 0xae, 0x7e, 0x2c, 0x57, 0x16, 0xee, 0x51, 0xb2, + 0x38, 0xf2, 0x51, 0x46, 0x33, 0x36, 0xf7, 0x29, + 0xaf, 0x31, 0xde, 0x3c, 0x90, 0x85, 0xf1, 0xdf, + 0x84, 0x2d, 0x65, 0x03, 0x64, 0xa5, 0x74, 0x8e, + 0x86, 0xf6, 0x39, 0x5b, 0x0d, 0x37, 0xd1, 0x64, + 0xea, 0x89, 0x18, 0xd9, 0x71, 0x92, 0x5c, 0xd3, + 0xa0, 0xdd, 0x44, 0x20, 0xa7, 0xc0, 0xc6, 0xca, + 0xd9, 0x5c, 0x1c, 0xfb, 0x97, 0x10, 0xa6, 0x6c, + 0x91, 0xe5, 0x62, 0x90, 0x87, 0x61, 0xbd, 0xac, + 0x6f, 0xff, 0x00, 0xd5, 0x2c, 0xcf, 0x18, 0x84, + 0x98, 0xb1, 0x32, 0xfc, 0xaa, 0x56, 0x86, 0x70, + 0xe2, 0x6c, 0x7a, 0x74, 0x58, 0x5a, 0xfc, 0xd7, + 0xe7, 0x58, 0xf0, 0xe1, 0xde, 0xb4, 0x5b, 0xd4, + 0x2d, 0xf4, 0xa2, 0xf7, 0x6d, 0xee, 0xdc, 0xa0, + 0x99, 0x84, 0x61, 0x6b, 0x4b, 0x33, 0xf2, 0xdd, + 0x5f, 0x2f, 0x9e, 0xe1, 0xdc, 0x33, 0xa7, 0x95, + 0x3a, 0x26, 0xcf, 0x86, 0x27, 0x70, 0x98, 0x1e, + 0x6c, 0x55, 0x44, 0x75, 0x0e, 0x75, 0xa6, 0x66, + 0x1b, 0xc4, 0x2f, 0x6c, 0xe3, 0xf0, 0x51, 0x47, + 0x1e, 0x57, 0x24, 0xd6, 0xc8, 0x32, 0x86, 0xd8, + 0xee, 0xe1, 0x6c, 0xcb, 0x25, 0xe5, 0x40, 0xc8, + 0x98, 0xaf, 0x61, 0xf6, 0xb1, 0x5f, 0x4a, 0x0c, + 0x12, 0x54, 0x40, 0x4b, 0x59, 0x77, 0x45, 0xca, + 0xd6, 0xdb, 0x97, 0x42, 0x64, 0x6d, 0xca, 0x39, + 0xf9, 0x57, 0x3a, 0xef, 0x37, 0x26, 0xf8, 0x6d, + 0xdc, 0xa9, 0xda, 0xc7, 0x18, 0x67, 0x8d, 0x9e, + 0x50, 0xb4, 0xe7, 0xc5, 0x60, 0x3b, 0x80, 0x59, + 0x3a, 0x97, 0xcc, 0x1f, 0x95, 0x74, 0x98, 0x98, + 0xd0, 0x6f, 0x70, 0x3d, 0x3e, 0x85, 0x0b, 0xdc, + 0xc9, 0x46, 0x46, 0x4c, 0x4d, 0x60, 0xd0, 0xec, + 0xc0, 0x0b, 0xf4, 0x55, 0xdc, 0xd9, 0x5c, 0xf6, + 0x34, 0xb1, 0x9c, 0x40, 0xe7, 0x36, 0x27, 0x9d, + 0x06, 0x1c, 0x5e, 0x4d, 0xac, 0xc8, 0x9f, 0xb2, + 0x40, 0x00, 0xfc, 0x0a, 0x6c, 0xa2, 0x4a, 0x99, + 0x3c, 0xa0, 0x79, 0x85, 0xee, 0xde, 0x01, 0xc8, + 0x9b, 0x04, 0x19, 0x43, 0x69, 0x0b, 0xf1, 0x48, + 0x07, 0x22, 0xa5, 0x8c, 0x5e, 0xf1, 0x34, 0x83, + 0xd2, 0x25, 0x62, 0x2c, 0x93, 0x0e, 0x29, 0x8d, + 0xbd, 0xa6, 0x00, 0x84, 0x11, 0x3a, 0x76, 0x45, + 0x80, 0x8c, 0xa8, 0xcc, 0xfb, 0xde, 0xfc, 0xaa, + 0x56, 0x62, 0x9a, 0x42, 0xe7, 0xb0, 0x87, 0x4a, + 0x6e, 0x73, 0x07, 0x7e, 0x2a, 0x49, 0x30, 0x92, + 0x0c, 0x0d, 0x8a, 0xde, 0x90, 0x1b, 0xf8, 0x29, + 0x24, 0xf2, 0xce, 0x2e, 0x9d, 0x93, 0xef, 0xad, + 0xc4, 0x78, 0x3a, 0x56, 0x49, 0xb3, 0x55, 0x44, + 0xc6, 0xbc, 0xb9, 0xa6, 0x2c, 0xc5, 0xc0, 0xf1, + 0x1c, 0xea, 0xa2, 0x57, 0xdf, 0xcb, 0x4b, 0x9a, + 0xfc, 0x76, 0xe3, 0xdc, 0x83, 0xda, 0x67, 0x78, + 0x4f, 0xf7, 0x8e, 0xef, 0xdd, 0x67, 0xb9, 0x6f, + 0xcf, 0xf6, 0x7a, 0x8f, 0x7a, 0x3b, 0x93, 0xd0, + 0x63, 0xe8, 0x60, 0x9c, 0xe0, 0x6e, 0xfd, 0xfa, + 0x57, 0x9a, 0xa9, 0x79, 0x97, 0x9a, 0xa9, 0x79, + 0x97, 0x9a, 0xa9, 0x79, 0x97, 0x9a, 0xa9, 0x79, + 0x97, 0x9a, 0xa9, 0x79, 0x97, 0x9a, 0xa9, 0x79, + 0x97, 0x9a, 0xa9, 0x79, 0x97, 0x9a, 0xa9, 0x79, + 0x97, 0x9a, 0xa9, 0x79, 0x97, 0x9a, 0xa9, 0x79, + 0x97, 0x9a, 0xa9, 0x79, 0x97, 0x9a, 0xa9, 0x79, + 0x97, 0x9a, 0xa9, 0x79, 0x97, 0x9a, 0xa9, 0x79, + 0x97, 0x9a, 0xa9, 0x79, 0x97, 0x9a, 0xa9, 0x79, + 0x97, 0x9a, 0xa9, 0x79, 0x97, 0x9a, 0xa9, 0x79, + 0x97, 0x9a, 0xa9, 0x79, 0x97, 0x9a, 0xa9, 0x79, + 0x97, 0x9a, 0xa9, 0x79, 0x93, 0x0d, 0xb0, 0xde, + 0x36, 0xe6, 0x1b, 0x8e, 0x8e, 0x46, 0x09, 0x62, + 0x76, 0x96, 0x39, 0x6a, 0xe7, 0x1e, 0x80, 0xf5, + 0xc0, 0xa8, 0xe9, 0x85, 0xc0, 0xa8, 0xe9, 0x85, + 0xc0, 0xa8, 0xe9, 0x85, 0xc0, 0xa8, 0xe9, 0x85, + 0xc0, 0xa8, 0xe9, 0x85, 0xc0, 0xa8, 0xe9, 0x85, + 0xc0, 0xa8, 0xe9, 0x85, 0xc0, 0xa8, 0xe9, 0x85, + 0xc0, 0xa8, 0xe9, 0x85, 0xc0, 0xa8, 0xe9, 0x85, + 0xc0, 0xa8, 0xe9, 0x85, 0xc0, 0xa8, 0xe9, 0x85, + 0xc0, 0xa8, 0xe9, 0x85, 0xc0, 0xa8, 0xe9, 0x85, + 0xc0, 0xa8, 0xe9, 0x85, 0xc0, 0xa8, 0xe9, 0x85, + 0xc0, 0xa8, 0xe9, 0x85, 0xc0, 0xa8, 0xe9, 0x85, + 0xc0, 0xa8, 0xe9, 0x85, 0x7c, 0x8c, 0xb2, 0x7a, + 0x1e, 0xfc, 0xc8, 0x66, 0x0d, 0x6b, 0x45, 0x83, + 0x5b, 0xa0, 0x6e, 0x41, 0xed, 0x33, 0xbc, 0x27, + 0xfb, 0xc7, 0x77, 0xee, 0xb3, 0xdc, 0xb7, 0xe7, + 0xfb, 0x3d, 0x47, 0xbd, 0x1d, 0xc9, 0xeb, 0xf8, + 0x6d, 0xfa, 0x37, 0x71, 0x03, 0x03, 0x1c, 0xfb, + 0xbb, 0x40, 0xb0, 0x50, 0xca, 0x66, 0xf1, 0x86, + 0xb9, 0xb9, 0xa4, 0x2d, 0xb3, 0xb4, 0xf1, 0xa6, + 0xd5, 0x30, 0x87, 0x4d, 0x91, 0x89, 0x99, 0xbf, + 0xbb, 0x05, 0xba, 0x7e, 0x4b, 0xc1, 0xa3, 0xc7, + 0x1b, 0x0c, 0x79, 0xf1, 0x42, 0xeb, 0xef, 0xf7, + 0xe7, 0xe0, 0xad, 0xa9, 0x70, 0xca, 0x69, 0xfa, + 0x9b, 0xd2, 0xa8, 0x44, 0x9e, 0x10, 0x15, 0x6d, + 0xcb, 0xb3, 0x7a, 0x0b, 0xb3, 0x67, 0xf4, 0x85, + 0x03, 0x5d, 0xe1, 0x26, 0xd4, 0x33, 0x2e, 0xcf, + 0x24, 0x0b, 0xbe, 0xd7, 0xa4, 0x2a, 0x96, 0xd6, + 0x4c, 0xd9, 0x6e, 0x46, 0x49, 0xb9, 0x40, 0xf2, + 0x0d, 0xfd, 0x1a, 0x33, 0x2a, 0xc7, 0x54, 0x4c, + 0x1d, 0x40, 0x31, 0x6f, 0x0c, 0x81, 0xdc, 0x59, + 0xb3, 0x71, 0x67, 0x51, 0xc1, 0x01, 0x0d, 0x89, + 0xac, 0x61, 0x2d, 0xb6, 0x67, 0x92, 0x01, 0x37, + 0xe5, 0xd2, 0xbc, 0x2b, 0x4a, 0xd1, 0x66, 0xc8, + 0xf6, 0xb5, 0xa3, 0x90, 0xd9, 0xc4, 0x0e, 0x7b, + 0x28, 0xe3, 0xe3, 0xca, 0x36, 0x47, 0x7c, 0x43, + 0xbe, 0x40, 0x7d, 0x28, 0xbd, 0xdb, 0x7b, 0xbf, + 0x6a, 0x83, 0xda, 0x67, 0x78, 0x4f, 0xf7, 0x8e, + 0xef, 0xdd, 0x8f, 0xdc, 0xb7, 0xe7, 0xfb, 0x3d, + 0x47, 0xbd, 0x1d, 0xc9, 0xeb, 0xf8, 0x6d, 0xfa, + 0x22, 0x4b, 0x62, 0x19, 0xc1, 0x69, 0xe3, 0x07, + 0x31, 0x51, 0xb2, 0x38, 0xf2, 0x51, 0x46, 0x33, + 0x36, 0xf7, 0x29, 0xaf, 0x31, 0xde, 0x3c, 0x90, + 0x85, 0xf1, 0xdf, 0x84, 0x2d, 0x65, 0x03, 0x64, + 0xa5, 0x74, 0x8e, 0x86, 0xf6, 0x39, 0x5b, 0x0d, + 0x37, 0xd1, 0x64, 0xea, 0xa9, 0x19, 0x94, 0xc5, + 0x8b, 0x13, 0x41, 0xb7, 0x08, 0x1f, 0xc5, 0x43, + 0x2c, 0x34, 0xcf, 0x6b, 0xa3, 0x78, 0x7e, 0xfa, + 0x5b, 0xde, 0xdf, 0x04, 0xc9, 0x99, 0x49, 0x20, + 0x91, 0xaf, 0x0f, 0xcf, 0x35, 0xf8, 0xfd, 0x94, + 0x5d, 0xca, 0x55, 0x4c, 0xc6, 0x3b, 0xc7, 0x3d, + 0xc3, 0xa3, 0xba, 0x8f, 0x2f, 0x4a, 0x26, 0x96, + 0x31, 0x85, 0xae, 0xc7, 0x60, 0x47, 0x15, 0xc7, + 0x1a, 0x95, 0xc7, 0x3c, 0xaf, 0x95, 0xb2, 0xe3, + 0xf4, 0x8b, 0xfe, 0x2a, 0x61, 0x93, 0xc0, 0x1f, + 0x20, 0x78, 0xcf, 0xc1, 0x00, 0x10, 0x07, 0xd2, + 0x8b, 0xdd, 0xb7, 0xbb, 0xf6, 0xa8, 0x3d, 0xa6, + 0x77, 0x84, 0xff, 0x00, 0x78, 0xee, 0xfd, 0xd6, + 0x3e, 0x18, 0x1d, 0x23, 0x32, 0x4d, 0x17, 0x0b, + 0x64, 0x91, 0x6c, 0x92, 0x2d, 0x92, 0x45, 0xb2, + 0x48, 0xb6, 0x49, 0x16, 0xc9, 0x22, 0xd9, 0x24, + 0x5b, 0x24, 0x8b, 0x64, 0x91, 0x6c, 0x92, 0x2d, + 0x92, 0x45, 0xb2, 0x48, 0xb6, 0x49, 0x16, 0xc9, + 0x22, 0xd9, 0x24, 0x5b, 0x24, 0x8b, 0x64, 0x91, + 0x6c, 0x92, 0x2d, 0x92, 0x45, 0xb2, 0x48, 0xb6, + 0x49, 0x16, 0xc9, 0x22, 0x9d, 0xb3, 0xc4, 0x62, + 0x26, 0x4b, 0x8b, 0xfa, 0x93, 0xd0, 0x8a, 0x3c, + 0x9e, 0x1c, 0x0d, 0x3b, 0xe6, 0x5d, 0x68, 0x87, + 0xab, 0x5a, 0x21, 0xea, 0xd6, 0x88, 0x7a, 0xb5, + 0xa2, 0x1e, 0xad, 0x68, 0x87, 0xab, 0x5a, 0x21, + 0xea, 0xd6, 0x88, 0x7a, 0xb5, 0xa2, 0x1e, 0xad, + 0x65, 0x18, 0xda, 0x7c, 0x17, 0xc3, 0x77, 0x61, + 0x6e, 0x7f, 0x89, 0x4e, 0x83, 0x23, 0x1e, 0x51, + 0xb9, 0xc8, 0xc0, 0x33, 0x28, 0xe1, 0x74, 0x71, + 0x63, 0x93, 0x83, 0xbc, 0x16, 0x3f, 0x14, 0x69, + 0x9b, 0x1c, 0x46, 0x70, 0x48, 0xc3, 0x80, 0x71, + 0x2d, 0x10, 0xf5, 0x6b, 0x44, 0x3d, 0x5a, 0xd1, + 0x0f, 0x56, 0xb4, 0x43, 0xd5, 0xad, 0x10, 0xf5, + 0x6b, 0x44, 0x3d, 0x5a, 0xd1, 0x0f, 0x56, 0xb4, + 0x43, 0xd5, 0xad, 0x10, 0xf5, 0x69, 0x8e, 0x3a, + 0x4c, 0x6d, 0x3f, 0xb5, 0x41, 0xed, 0x33, 0xbc, + 0x27, 0xfb, 0xc7, 0x77, 0xee, 0xb9, 0xac, 0x9a, + 0x46, 0x37, 0x24, 0xcc, 0xcd, 0x71, 0x0b, 0x69, + 0x9b, 0xa6, 0x56, 0xd3, 0x37, 0x4c, 0xad, 0xa6, + 0x6e, 0x99, 0x5b, 0x4c, 0xdd, 0x32, 0xa2, 0x74, + 0xbe, 0x1a, 0x86, 0x07, 0x49, 0x1b, 0x64, 0x0c, + 0x7c, 0xb2, 0x5e, 0xc7, 0xd4, 0xd5, 0x04, 0xef, + 0xf0, 0xbc, 0x54, 0xe2, 0x7b, 0xe0, 0x6c, 0xb2, + 0xbc, 0x1c, 0xc6, 0xdc, 0x96, 0x55, 0x8e, 0x92, + 0xa2, 0x46, 0x1a, 0x57, 0xb6, 0x39, 0x1a, 0x64, + 0x37, 0xb9, 0xbf, 0xe0, 0xa0, 0xa9, 0x35, 0x52, + 0x60, 0x99, 0xce, 0x6b, 0x46, 0x50, 0xdf, 0x7b, + 0x6b, 0xf7, 0xad, 0xa6, 0x6e, 0x99, 0x5b, 0x4c, + 0xdd, 0x32, 0xb6, 0x99, 0xba, 0x65, 0x6d, 0x33, + 0x74, 0xca, 0xad, 0x7e, 0x5a, 0x4c, 0x62, 0xad, + 0xa3, 0x16, 0x23, 0x7d, 0x01, 0x6d, 0x33, 0x74, + 0xca, 0xda, 0x66, 0xe9, 0x95, 0x59, 0x53, 0x1d, + 0x53, 0xf0, 0x52, 0x80, 0x5e, 0x0c, 0x86, 0xe6, + 0xfc, 0x8a, 0x5a, 0xff, 0x00, 0x1a, 0x78, 0x82, + 0x39, 0x04, 0x79, 0xe4, 0x37, 0x25, 0x4b, 0x13, + 0x7c, 0x2b, 0x1c, 0xd5, 0x11, 0x02, 0x5d, 0x04, + 0x73, 0x3f, 0x1e, 0x6c, 0xe7, 0x48, 0x54, 0xd3, + 0x3a, 0xaa, 0x4c, 0x35, 0x0d, 0x2e, 0x6d, 0xa4, + 0x3c, 0x46, 0xdf, 0x25, 0x91, 0x92, 0xaa, 0x42, + 0xec, 0x2d, 0x76, 0xf6, 0x43, 0xf5, 0x9a, 0x0f, + 0xcd, 0x6d, 0x33, 0x74, 0xca, 0xda, 0x66, 0xe9, + 0x95, 0x5d, 0x94, 0x91, 0xd2, 0x79, 0x56, 0xf0, + 0x8d, 0xf8, 0x93, 0xd7, 0xf0, 0xdb, 0xfa, 0x98, + 0x84, 0xf3, 0x3a, 0x11, 0xe3, 0x0e, 0xb1, 0x0c, + 0xc5, 0xc4, 0xdf, 0x4a, 0xab, 0x8d, 0xa0, 0xb7, + 0x24, 0xf8, 0xa3, 0x37, 0xd2, 0x5a, 0x01, 0x17, + 0xe7, 0x5e, 0x0d, 0xc5, 0xff, 0x00, 0xec, 0xde, + 0x7a, 0xb7, 0xb7, 0x51, 0xd6, 0x7f, 0x8f, 0x82, + 0x3f, 0xf5, 0x5f, 0x7d, 0xfe, 0xde, 0xdf, 0xd5, + 0x45, 0xee, 0xdb, 0xdd, 0xfb, 0x54, 0x1e, 0xd3, + 0x3b, 0xc2, 0x7f, 0xbc, 0x77, 0x7e, 0xeb, 0xbd, + 0xd3, 0x3e, 0x8d, 0x10, 0xa8, 0x82, 0xa5, 0xf3, + 0x78, 0x9c, 0x59, 0xe3, 0x95, 0xad, 0x6f, 0x07, + 0x93, 0x09, 0x5e, 0x08, 0x35, 0x50, 0x4d, 0x3b, + 0xb0, 0x49, 0x61, 0x1c, 0xa1, 0x83, 0x58, 0x74, + 0xef, 0x4a, 0xf0, 0xdc, 0x98, 0x2f, 0x34, 0x92, + 0x45, 0x36, 0x4d, 0x9c, 0x4d, 0x05, 0xdd, 0xd7, + 0x0b, 0xc1, 0x71, 0x48, 0xd2, 0xc9, 0x31, 0x4d, + 0x26, 0x17, 0x69, 0xc2, 0x70, 0x80, 0x7e, 0xe9, + 0xfa, 0x35, 0xdf, 0xe7, 0x1b, 0xdc, 0x37, 0x6a, + 0x8c, 0x9a, 0x97, 0x4d, 0x0c, 0x72, 0x7b, 0x2e, + 0x0f, 0x07, 0xb0, 0xaa, 0xaf, 0x07, 0x9e, 0x15, + 0x38, 0x88, 0xbf, 0xdb, 0x71, 0x27, 0xbb, 0x0f, + 0x32, 0xae, 0x92, 0x2a, 0x79, 0x4d, 0x6e, 0xf9, + 0xb9, 0x47, 0xca, 0x30, 0x0b, 0x8b, 0x5f, 0x0d, + 0xbe, 0x6b, 0xc1, 0x06, 0x18, 0xdd, 0x28, 0x68, + 0x92, 0x23, 0x80, 0x5e, 0xce, 0xc6, 0x4d, 0xbb, + 0x42, 0x95, 0xbc, 0x6c, 0x64, 0x71, 0x9f, 0x58, + 0x8d, 0xa0, 0xf6, 0x8d, 0xda, 0xef, 0x7a, 0xde, + 0xe4, 0xf4, 0x24, 0x86, 0x07, 0x48, 0xcc, 0x9b, + 0x73, 0x85, 0xb2, 0x48, 0xb6, 0x49, 0x16, 0xc9, + 0x22, 0xd9, 0x24, 0x5b, 0x24, 0x8b, 0x64, 0x91, + 0x6c, 0x92, 0x2d, 0x92, 0x44, 0x22, 0xf1, 0x69, + 0x32, 0x61, 0xd8, 0xad, 0x6e, 0x34, 0x24, 0x10, + 0xc9, 0x8f, 0x0e, 0x0e, 0x08, 0xce, 0x3d, 0x3c, + 0xaa, 0x39, 0x9d, 0x04, 0x98, 0xe3, 0xe0, 0xe6, + 0x16, 0x1f, 0x05, 0x1e, 0x18, 0x24, 0x19, 0x37, + 0x63, 0x6e, 0x61, 0x98, 0xad, 0x92, 0x45, 0xb2, + 0x48, 0xb6, 0x49, 0x16, 0xc9, 0x22, 0xd9, 0x24, + 0x5b, 0x24, 0x8b, 0x64, 0x91, 0x6c, 0x92, 0x2d, + 0x92, 0x45, 0x18, 0x39, 0x88, 0x8d, 0xbb, 0x96, + 0x6b, 0x4b, 0x8f, 0xa1, 0x6a, 0x9f, 0xcc, 0xb5, + 0x4f, 0xe6, 0x5a, 0xa7, 0xf3, 0x2d, 0x53, 0xf9, + 0x96, 0xa9, 0xfc, 0xcb, 0x54, 0xfe, 0x65, 0xaa, + 0x7f, 0x32, 0xd5, 0x3f, 0x99, 0x6a, 0x9f, 0xcc, + 0xb5, 0x4f, 0xe6, 0x5a, 0xa7, 0xf3, 0x2d, 0x53, + 0xf9, 0x96, 0xa9, 0xfc, 0xcb, 0x54, 0xfe, 0x65, + 0xaa, 0x7f, 0x32, 0xd5, 0x3f, 0x99, 0x6a, 0x9f, + 0xcc, 0xb5, 0x4f, 0xe6, 0x5a, 0xa7, 0xf3, 0x2d, + 0x53, 0xf9, 0x96, 0xa9, 0xfc, 0xca, 0xce, 0x04, + 0x1f, 0x4e, 0xe4, 0x1e, 0xd3, 0x3b, 0xc2, 0x7f, + 0xbc, 0x77, 0x7e, 0xef, 0x8d, 0x32, 0xae, 0x38, + 0x9a, 0x58, 0x1b, 0x85, 0xc0, 0xad, 0xbe, 0x1e, + 0x89, 0x5b, 0x7c, 0x3d, 0x12, 0xb6, 0xf8, 0x7a, + 0x25, 0x6d, 0xf0, 0xf4, 0x4a, 0x18, 0xfc, 0x25, + 0x1b, 0xec, 0x30, 0x8c, 0x41, 0xc6, 0xc3, 0x91, + 0x31, 0x8e, 0xf0, 0x94, 0x6e, 0x6b, 0x38, 0x20, + 0x87, 0x58, 0x20, 0xf8, 0x3c, 0x26, 0xc8, 0xe4, + 0x1a, 0x1c, 0xc0, 0xe0, 0x51, 0x92, 0x6f, 0x09, + 0x36, 0x59, 0x0e, 0x97, 0x3c, 0x38, 0x95, 0xb6, + 0xc5, 0xd0, 0x2b, 0x6d, 0x8b, 0xa0, 0x56, 0xdb, + 0x17, 0x40, 0xad, 0xb6, 0x2e, 0x81, 0x55, 0x1e, + 0x0e, 0xf1, 0xa8, 0xf1, 0xc9, 0x30, 0x97, 0x1e, + 0x13, 0x65, 0xb6, 0xc5, 0xd0, 0x2b, 0x6d, 0x8b, + 0xa0, 0x53, 0xa3, 0xfe, 0xd2, 0x8c, 0x35, 0xd6, + 0x25, 0xb6, 0x36, 0x2a, 0x4c, 0x5e, 0x15, 0x63, + 0xb2, 0x99, 0xdf, 0x7c, 0x5b, 0xef, 0x5a, 0x2f, + 0x93, 0xc2, 0x51, 0xc8, 0xf3, 0xa5, 0xce, 0x0e, + 0x24, 0xa7, 0x64, 0x3c, 0x30, 0x20, 0xc5, 0xa7, + 0x27, 0x89, 0xb7, 0x5e, 0x70, 0x87, 0xa2, 0x56, + 0xdf, 0x0f, 0x44, 0xad, 0xbe, 0x1e, 0x89, 0x55, + 0x11, 0x3e, 0x76, 0xcc, 0x64, 0x78, 0x76, 0xf4, + 0x27, 0x28, 0x03, 0x64, 0x73, 0x46, 0x41, 0x9a, + 0x0a, 0xd7, 0x49, 0xd2, 0x5a, 0xe9, 0x3a, 0x4b, + 0x5d, 0x27, 0x49, 0x6b, 0xa4, 0xe9, 0x2d, 0x74, + 0x9d, 0x24, 0x23, 0x8e, 0x47, 0x97, 0x9f, 0xdf, + 0xb2, 0x8d, 0xa5, 0xcf, 0xf2, 0x8e, 0xc2, 0xd2, + 0xd9, 0x2e, 0x09, 0xf5, 0xdd, 0x1a, 0x66, 0xba, + 0x43, 0x38, 0x24, 0x61, 0xc7, 0xc8, 0xa5, 0x7b, + 0x1f, 0x23, 0x9b, 0x18, 0xbb, 0x8e, 0x3d, 0x08, + 0x35, 0xb2, 0xc8, 0x49, 0xcc, 0x06, 0x22, 0x9c, + 0xfb, 0xbf, 0x0b, 0x6f, 0xfd, 0xe7, 0x26, 0x9b, + 0x67, 0xce, 0xb2, 0xe5, 0xd2, 0x64, 0xed, 0x7b, + 0xe3, 0xe2, 0xe5, 0xb2, 0xd7, 0x49, 0xd2, 0x4d, + 0x97, 0x29, 0x26, 0x07, 0x12, 0xd0, 0x71, 0xf1, + 0x8f, 0xfe, 0xa6, 0x17, 0x49, 0x20, 0x0f, 0x18, + 0x86, 0xff, 0x00, 0x4a, 0xd7, 0x49, 0xd2, 0x5a, + 0xe9, 0x3a, 0x4b, 0x5d, 0x27, 0x49, 0x6b, 0xa4, + 0xe9, 0x2d, 0x74, 0x9d, 0x25, 0xae, 0x93, 0xa4, + 0x9b, 0xec, 0x37, 0xb9, 0x35, 0xa3, 0x49, 0x36, + 0x4e, 0x82, 0x03, 0x81, 0x8c, 0x36, 0xb8, 0xd2, + 0xe2, 0xb8, 0x67, 0x9d, 0x6b, 0x0f, 0x3a, 0xd6, + 0x1e, 0x75, 0xac, 0x3c, 0xeb, 0x58, 0x79, 0xd6, + 0xb0, 0xf3, 0xad, 0x61, 0xe7, 0x5a, 0xc3, 0xce, + 0xb5, 0x87, 0x9d, 0x6b, 0x0f, 0x3a, 0xd6, 0x1e, + 0x75, 0xac, 0x3c, 0xeb, 0x58, 0x79, 0xd6, 0xb0, + 0xf3, 0xad, 0x61, 0xe7, 0x5a, 0xc3, 0xce, 0xb5, + 0x87, 0x9d, 0x6b, 0x0f, 0x3a, 0xd6, 0x1e, 0x75, + 0xac, 0x3c, 0xeb, 0x58, 0x79, 0xd0, 0xa7, 0x94, + 0xe2, 0xc5, 0xc0, 0x71, 0xd2, 0x0e, 0xe4, 0x1e, + 0xd3, 0x3b, 0xd3, 0xfd, 0xe3, 0xbb, 0xf7, 0x63, + 0x8a, 0x96, 0xa9, 0xf0, 0xc7, 0x90, 0x6b, 0xb0, + 0xb7, 0x97, 0x3a, 0xf3, 0x84, 0xdc, 0xe9, 0xb4, + 0x2f, 0xaa, 0x99, 0xb5, 0x4e, 0x20, 0x06, 0x62, + 0x19, 0xef, 0xa3, 0x3a, 0x8f, 0x29, 0x5d, 0x33, + 0x72, 0x8c, 0x12, 0x37, 0x7c, 0x33, 0x85, 0x31, + 0x7d, 0x5c, 0xcd, 0xc8, 0xe1, 0x2f, 0xdf, 0x0d, + 0xee, 0x2d, 0x08, 0x4c, 0xd9, 0xe7, 0x2d, 0x2d, + 0xc6, 0x06, 0x36, 0xe2, 0x23, 0x94, 0x37, 0x4a, + 0xf3, 0x84, 0xdc, 0xea, 0xa2, 0x0a, 0x8a, 0x93, + 0x34, 0x66, 0x9e, 0x43, 0xbe, 0x19, 0xc1, 0x03, + 0x95, 0x6d, 0x33, 0x74, 0xca, 0xda, 0x66, 0xe9, + 0x95, 0x07, 0x8c, 0x78, 0x66, 0xb1, 0x92, 0x49, + 0x13, 0x65, 0xc2, 0xc8, 0x71, 0x01, 0x71, 0x7d, + 0x38, 0xd4, 0x98, 0xbc, 0x2f, 0x57, 0x14, 0x8c, + 0x63, 0xe4, 0x2d, 0x11, 0xe2, 0xde, 0xb7, 0x3f, + 0xdb, 0x5e, 0x11, 0x9a, 0x97, 0xc2, 0x75, 0x12, + 0x32, 0x95, 0xad, 0x70, 0xc6, 0x0b, 0x4b, 0xf4, + 0xdf, 0xeb, 0x66, 0xb5, 0x8a, 0x97, 0xc2, 0x26, + 0xb6, 0x56, 0x86, 0xca, 0x23, 0x11, 0xe2, 0x3b, + 0xef, 0x4e, 0x95, 0xb4, 0xcd, 0xd3, 0x2b, 0x69, + 0x9b, 0xa6, 0x55, 0x35, 0x25, 0x15, 0x44, 0x83, + 0x14, 0x11, 0xd9, 0x91, 0x8c, 0xe4, 0xd9, 0x45, + 0x8a, 0xae, 0x4b, 0x48, 0xfc, 0x9b, 0x5c, 0xd9, + 0x58, 0xe1, 0x8b, 0x92, 0xe3, 0x42, 0xa9, 0x02, + 0xae, 0x7f, 0xd1, 0x85, 0xe5, 0xce, 0x37, 0xb9, + 0xec, 0x9a, 0xf8, 0xaa, 0xe4, 0x2c, 0x70, 0x73, + 0x83, 0x9d, 0x2b, 0x5a, 0x2c, 0xdb, 0x5f, 0x4f, + 0xac, 0x26, 0x65, 0xeb, 0x26, 0x68, 0x7f, 0x05, + 0xc1, 0xc1, 0xcd, 0x77, 0xa8, 0x8c, 0xc9, 0x99, + 0x2a, 0xc7, 0x1c, 0x62, 0xed, 0x0e, 0x9e, 0x36, + 0x93, 0xf0, 0x25, 0x06, 0x4d, 0xe1, 0x07, 0x62, + 0x22, 0xfb, 0xc9, 0x5a, 0xfe, 0xe5, 0xe1, 0x1f, + 0x1b, 0xa8, 0x7c, 0xf9, 0x3c, 0x9e, 0x1c, 0x5c, + 0x5c, 0x24, 0xe5, 0x07, 0xf9, 0x76, 0x7d, 0x21, + 0xee, 0xe4, 0xff, 0x00, 0x61, 0x46, 0xfc, 0x0c, + 0xbc, 0x36, 0xf6, 0xb1, 0x7e, 0x17, 0x51, 0xd6, + 0x7f, 0x8f, 0x82, 0x3f, 0xf5, 0x5f, 0x7d, 0xfe, + 0xde, 0xd5, 0x4e, 0x24, 0x9e, 0x38, 0x84, 0xce, + 0x25, 0xed, 0x7d, 0xee, 0x59, 0xc1, 0xe4, 0xf6, + 0x93, 0xc3, 0xb8, 0x70, 0xb6, 0x43, 0xfe, 0xa0, + 0xd2, 0x9a, 0xd7, 0x87, 0xe5, 0x9d, 0x19, 0xc8, + 0x38, 0x9d, 0xe8, 0x16, 0x3c, 0x5c, 0xe9, 0xef, + 0x95, 0xc5, 0xd3, 0x54, 0x33, 0x03, 0x5a, 0x78, + 0x99, 0xcb, 0xd9, 0x99, 0x49, 0x3e, 0x4d, 0x92, + 0x3f, 0x28, 0xd6, 0x79, 0x46, 0xe2, 0x00, 0x58, + 0xaa, 0x56, 0x1a, 0x76, 0x59, 0xf5, 0x6f, 0x69, + 0x64, 0x82, 0xf8, 0x46, 0xf3, 0x32, 0x03, 0xfc, + 0x3a, 0x87, 0xb5, 0xbe, 0xab, 0x0f, 0xa6, 0xdf, + 0x61, 0xbd, 0xca, 0x1f, 0x6c, 0x2a, 0x81, 0xff, + 0x00, 0x91, 0xdd, 0xfb, 0xb8, 0x24, 0x01, 0xfb, + 0xc2, 0x58, 0xc2, 0x78, 0x4e, 0xe4, 0x42, 0x3a, + 0xaa, 0x0f, 0x12, 0x9b, 0x1e, 0x69, 0x23, 0x65, + 0x9b, 0x6f, 0x9a, 0xa8, 0xa6, 0x74, 0xd6, 0x64, + 0x31, 0xe5, 0x4c, 0xb8, 0x78, 0x94, 0x39, 0x6a, + 0xd8, 0xe0, 0x9a, 0x66, 0x65, 0x18, 0xc7, 0x8c, + 0xd6, 0xf6, 0x95, 0x03, 0x69, 0xe5, 0xc7, 0x34, + 0xda, 0x06, 0x1b, 0x63, 0xbf, 0x1a, 0x9d, 0xd1, + 0xd5, 0x36, 0x77, 0xd3, 0x90, 0x26, 0x60, 0x6d, + 0xb0, 0xfe, 0x2a, 0x58, 0x5b, 0x56, 0xc3, 0x3b, + 0x59, 0x94, 0x0c, 0x2d, 0xb5, 0xc7, 0xc9, 0x41, + 0x51, 0x1d, 0x40, 0xa8, 0x86, 0x5b, 0x8c, 0x40, + 0x5b, 0x38, 0x4d, 0x78, 0x63, 0x72, 0xf8, 0x5d, + 0x26, 0x3b, 0x67, 0xb3, 0x5d, 0x9d, 0x31, 0xd8, + 0x1b, 0x97, 0xde, 0x38, 0xbe, 0xd9, 0xf7, 0xcb, + 0x21, 0xe3, 0x4c, 0xf1, 0xec, 0x18, 0xfc, 0x5e, + 0xdf, 0x35, 0x05, 0x44, 0xb5, 0x2d, 0x83, 0x2a, + 0xfb, 0x44, 0xc7, 0x0e, 0x17, 0xe0, 0xaa, 0xea, + 0xf2, 0x9c, 0x19, 0x84, 0x58, 0x2d, 0xfb, 0x80, + 0xa9, 0x19, 0x94, 0xc7, 0x8e, 0x88, 0xcb, 0xa2, + 0xca, 0x19, 0x66, 0xa9, 0x6d, 0x3e, 0x5d, 0xd8, + 0x62, 0x05, 0xb7, 0xc4, 0xa6, 0x92, 0xaa, 0xa0, + 0x53, 0x47, 0x1c, 0xb9, 0x1b, 0xe1, 0x2e, 0xdf, + 0x27, 0xc7, 0x95, 0x64, 0xa0, 0x7d, 0x76, 0x1b, + 0x83, 0xbb, 0x4a, 0x3f, 0xf2, 0x04, 0xff, 0x00, + 0x5a, 0x83, 0xda, 0x67, 0x7a, 0x7f, 0xbc, 0x77, + 0x7e, 0xec, 0x5f, 0xe5, 0xd9, 0xf3, 0xdc, 0x6f, + 0x1d, 0x4d, 0x05, 0x5f, 0x4a, 0x12, 0xef, 0xf8, + 0x9f, 0xf7, 0x2a, 0x21, 0x27, 0x06, 0x8a, 0x72, + 0x26, 0xf7, 0x26, 0xef, 0xff, 0x00, 0x8b, 0xf9, + 0xd7, 0x86, 0xea, 0x65, 0xfe, 0xf6, 0x58, 0x9e, + 0xee, 0x91, 0x55, 0x19, 0x0c, 0x79, 0x7c, 0xb7, + 0x91, 0xc1, 0xa6, 0xdf, 0x52, 0xdf, 0x0b, 0x23, + 0x7d, 0x3c, 0x6a, 0x6f, 0xf2, 0xd2, 0xf7, 0x6e, + 0xd0, 0x1a, 0x4f, 0x06, 0xc7, 0x53, 0x0f, 0x8a, + 0x45, 0xe5, 0x1d, 0x48, 0xd9, 0x3e, 0xaf, 0x29, + 0x0a, 0xb9, 0x8e, 0x18, 0x5c, 0xda, 0x49, 0xc1, + 0x07, 0x8b, 0x7a, 0x55, 0x4c, 0xaf, 0xd5, 0x89, + 0xe1, 0x0f, 0x1c, 0xad, 0x38, 0xc3, 0xbb, 0x2e, + 0xab, 0xa8, 0x1a, 0xec, 0x42, 0x94, 0x42, 0xd2, + 0x47, 0x1b, 0x89, 0x73, 0x8f, 0x7d, 0xbe, 0x1b, + 0xb4, 0xb3, 0x45, 0x0f, 0x8c, 0x16, 0x52, 0xb0, + 0x98, 0xf9, 0x5b, 0x83, 0x7d, 0xd9, 0x75, 0x35, + 0x57, 0x83, 0xa4, 0xa8, 0x80, 0x44, 0xf6, 0x65, + 0x69, 0xe5, 0x37, 0x19, 0xef, 0x62, 0x08, 0xd2, + 0x9e, 0xfc, 0xc1, 0x9e, 0x19, 0x94, 0x37, 0xe0, + 0xe8, 0xb3, 0xfd, 0xe9, 0x07, 0x32, 0x9a, 0x93, + 0x46, 0x43, 0xc1, 0x5b, 0xe1, 0xfb, 0xce, 0x7b, + 0x5e, 0x7f, 0xdc, 0xaa, 0x5a, 0xe1, 0x70, 0xea, + 0xa8, 0xc4, 0x23, 0xf7, 0xac, 0xec, 0x56, 0xec, + 0xec, 0x54, 0xf1, 0xb7, 0x3b, 0x61, 0x91, 0xb0, + 0x0f, 0xf4, 0x0c, 0x3f, 0x2d, 0xcf, 0x0a, 0xff, + 0x00, 0x0b, 0xfe, 0x49, 0xca, 0x29, 0x69, 0xf7, + 0xd3, 0xc6, 0xdc, 0x0e, 0x8e, 0xfa, 0x47, 0x28, + 0x5b, 0x24, 0x8b, 0x64, 0x91, 0x6c, 0x92, 0x2d, + 0x92, 0x45, 0xb2, 0x48, 0x84, 0x91, 0xd3, 0x3c, + 0x3c, 0x7a, 0x01, 0x51, 0xb8, 0xc0, 0xff, 0x00, + 0x26, 0x71, 0x34, 0x35, 0x80, 0x00, 0x7d, 0x4a, + 0x3c, 0x30, 0x48, 0x32, 0x6e, 0xc6, 0xdc, 0xc3, + 0x31, 0x4d, 0xc7, 0x4d, 0x21, 0xc2, 0xdc, 0x23, + 0x37, 0x12, 0x15, 0x2f, 0xa4, 0x7c, 0x8e, 0xbe, + 0xfb, 0x37, 0x0b, 0x95, 0x3a, 0x18, 0xa1, 0x97, + 0x23, 0x9c, 0x37, 0x13, 0x45, 0xed, 0xf2, 0x59, + 0x37, 0x53, 0x5d, 0xb8, 0x70, 0xea, 0x99, 0x7b, + 0x7a, 0xec, 0x9d, 0x92, 0xa7, 0x78, 0xc5, 0xa6, + 0xed, 0x05, 0x33, 0xc8, 0x48, 0x70, 0xbc, 0xc8, + 0x2e, 0x3e, 0xb7, 0x2f, 0x62, 0x8a, 0x31, 0x49, + 0x2e, 0x6b, 0xbd, 0xc4, 0x8d, 0x2e, 0x3f, 0xd0, + 0x5b, 0x24, 0x8b, 0x64, 0x91, 0x6c, 0x92, 0x2d, + 0x92, 0x45, 0xb2, 0x48, 0x81, 0xa8, 0x67, 0x8b, + 0xc0, 0x38, 0x4e, 0x77, 0xc9, 0x39, 0xfa, 0x01, + 0xd0, 0xa1, 0xf6, 0xc2, 0xa8, 0x3f, 0xf9, 0x1d, + 0xdf, 0xba, 0x5b, 0x51, 0x23, 0xa1, 0xcd, 0xbc, + 0x78, 0xe2, 0x77, 0xa5, 0x4f, 0x4f, 0x35, 0x63, + 0x6b, 0x5e, 0xf2, 0x32, 0x60, 0x1c, 0x58, 0x7e, + 0x28, 0x4b, 0xfd, 0xfc, 0xac, 0x6d, 0x39, 0xf5, + 0x02, 0x54, 0x4c, 0x9a, 0xaa, 0x09, 0xe8, 0xb0, + 0xef, 0xa2, 0x98, 0x6f, 0xdb, 0xe8, 0x0b, 0xc1, + 0x75, 0x2c, 0x7b, 0x48, 0xa7, 0xb3, 0x4c, 0x77, + 0xdf, 0x2a, 0x9b, 0x78, 0x42, 0x37, 0xc3, 0x21, + 0xde, 0x42, 0xc6, 0x02, 0x48, 0xf4, 0xf2, 0x29, + 0xe5, 0xca, 0xb3, 0x01, 0xa6, 0xc3, 0x8b, 0x16, + 0x6d, 0x0a, 0x96, 0x2c, 0x43, 0x1b, 0x64, 0x71, + 0x2d, 0xbe, 0x75, 0xe0, 0xd8, 0xdc, 0xf6, 0xe1, + 0xf2, 0xac, 0x90, 0x5f, 0x40, 0x77, 0x2a, 0xae, + 0xc2, 0xe6, 0xeb, 0x99, 0x81, 0xb7, 0xd2, 0x1a, + 0xbf, 0xb5, 0xbc, 0x61, 0x98, 0x70, 0xea, 0xbe, + 0xbd, 0xf0, 0xda, 0xd6, 0x54, 0x58, 0xe7, 0x64, + 0x2e, 0xa7, 0x7b, 0xb1, 0x35, 0xda, 0x48, 0x26, + 0xf9, 0x95, 0x6c, 0x02, 0xa2, 0x36, 0x1c, 0xb3, + 0x65, 0x0e, 0x71, 0xcc, 0x77, 0xa0, 0x2c, 0x4d, + 0x95, 0xb8, 0x3c, 0x47, 0x26, 0x0d, 0xf8, 0xf9, + 0x15, 0x2c, 0x51, 0x55, 0xc7, 0x48, 0xe8, 0x49, + 0x0f, 0xca, 0x00, 0x6e, 0x3d, 0x17, 0x55, 0x0f, + 0x8e, 0xbe, 0x2c, 0x4f, 0x93, 0x7c, 0xca, 0x86, + 0xe1, 0x6b, 0xc7, 0x2a, 0x91, 0xd4, 0xed, 0x02, + 0x3f, 0xdd, 0xd1, 0x7d, 0xda, 0x53, 0xff, 0x00, + 0x90, 0x27, 0xfa, 0xd4, 0x1e, 0xd3, 0x3b, 0xd4, + 0x9e, 0xf1, 0xdd, 0xfb, 0xb1, 0xcf, 0x0c, 0xcd, + 0x86, 0xa5, 0x8d, 0xc0, 0x44, 0x9c, 0x17, 0x05, + 0xb5, 0x51, 0x74, 0xdd, 0xff, 0x00, 0xaa, 0x35, + 0xd1, 0xf8, 0x46, 0x8d, 0xb5, 0x46, 0xe4, 0xbf, + 0x11, 0xe3, 0xf4, 0x61, 0xb2, 0x9d, 0x90, 0xd7, + 0xd1, 0xb1, 0xb3, 0xb3, 0x27, 0x20, 0xc6, 0xed, + 0xf0, 0xe8, 0xa9, 0x61, 0x6d, 0x65, 0x10, 0x8e, + 0x5b, 0x63, 0x18, 0x8e, 0x7b, 0x68, 0xfa, 0xa8, + 0x42, 0xdf, 0x09, 0xd1, 0xe0, 0x0d, 0xc0, 0x0d, + 0xce, 0x20, 0x39, 0x03, 0xb0, 0x5d, 0x6d, 0x54, + 0x5d, 0x37, 0x7f, 0xea, 0x9f, 0x2c, 0xd5, 0x34, + 0xa5, 0x8e, 0x89, 0xf1, 0xef, 0x1c, 0x49, 0xce, + 0x3d, 0x4b, 0xce, 0x10, 0x74, 0x4a, 0xf3, 0x84, + 0x1d, 0x12, 0xbc, 0xe1, 0x07, 0x44, 0xaf, 0x38, + 0x41, 0xd1, 0x2b, 0xce, 0x10, 0x74, 0x4a, 0xf3, + 0x84, 0x1d, 0x12, 0xbc, 0xe1, 0x07, 0x44, 0xaf, + 0x38, 0x41, 0xd1, 0x2a, 0x1a, 0xca, 0x2a, 0xca, + 0x78, 0x4c, 0x51, 0x31, 0x81, 0xce, 0x79, 0x06, + 0xe0, 0x7a, 0x90, 0x8a, 0x5a, 0xfa, 0x1c, 0x9d, + 0xf1, 0x60, 0x66, 0xf0, 0x5f, 0x97, 0x33, 0x15, + 0x2b, 0x5d, 0xe1, 0x0a, 0x32, 0xda, 0x6d, 0x56, + 0xf8, 0xef, 0x78, 0xfe, 0xca, 0x9a, 0xaf, 0xc7, + 0xe8, 0x4c, 0xf3, 0x0b, 0x48, 0xe7, 0x67, 0x0e, + 0x1e, 0xa2, 0xcb, 0x71, 0x28, 0x65, 0x93, 0xc2, + 0x14, 0x45, 0xd0, 0x9b, 0xc6, 0x01, 0xb3, 0x5b, + 0xfe, 0x9c, 0x16, 0x4d, 0xa9, 0x8e, 0xb6, 0x88, + 0x4e, 0xd7, 0x62, 0x0e, 0xc4, 0x4e, 0x7e, 0x8a, + 0xda, 0xa8, 0xba, 0x6e, 0xff, 0x00, 0xd5, 0x3a, + 0x10, 0xfc, 0xac, 0xf2, 0x1c, 0x52, 0xbc, 0x68, + 0xf5, 0x04, 0xe5, 0x70, 0xcc, 0xde, 0x9c, 0xcb, + 0x47, 0xdf, 0x0b, 0x47, 0xdf, 0x0b, 0x47, 0xdf, + 0x0b, 0x47, 0xdf, 0x0b, 0x47, 0xdf, 0x0b, 0x47, + 0xdf, 0x0b, 0x47, 0xdf, 0x0b, 0x47, 0xdf, 0x0b, + 0x47, 0xdf, 0x0b, 0x47, 0xdf, 0x0b, 0x47, 0xdf, + 0x0b, 0x47, 0xdf, 0x0b, 0x47, 0xdf, 0x0b, 0x47, + 0xdf, 0x0b, 0x47, 0xdf, 0x0b, 0x47, 0xdf, 0x0b, + 0x47, 0xdf, 0x0b, 0x47, 0xdf, 0x0b, 0x47, 0xdf, + 0x0b, 0x47, 0xdf, 0x0b, 0x83, 0x7f, 0xf5, 0x05, + 0x67, 0x02, 0xd3, 0xe9, 0x4d, 0x77, 0x21, 0xba, + 0x33, 0x46, 0xdb, 0xc7, 0x26, 0xfb, 0x37, 0x12, + 0xe0, 0x95, 0xc1, 0x2b, 0x82, 0x57, 0x05, 0x30, + 0x39, 0x81, 0xad, 0x6e, 0x86, 0xb0, 0x58, 0x05, + 0xc1, 0x2b, 0x82, 0x57, 0x04, 0xae, 0x09, 0x5c, + 0x12, 0xb8, 0x25, 0x70, 0x4a, 0xe0, 0x95, 0xc1, + 0x2b, 0x82, 0x57, 0x04, 0xae, 0x09, 0x5c, 0x12, + 0xb8, 0x25, 0x70, 0x4a, 0xe0, 0x94, 0x2a, 0x65, + 0x18, 0x58, 0xcd, 0x00, 0xfd, 0x62, 0x89, 0x50, + 0x7b, 0x4c, 0xef, 0x4f, 0xf7, 0x8e, 0xef, 0xfd, + 0xae, 0x79, 0x9c, 0x2e, 0x22, 0x17, 0xb7, 0xa5, + 0x62, 0x7b, 0xb1, 0x1f, 0xd9, 0xa5, 0x85, 0xfb, + 0xe7, 0x31, 0xb8, 0xda, 0xef, 0x96, 0xe5, 0x0b, + 0xa1, 0x95, 0xd1, 0x9c, 0x9f, 0xd5, 0x3e, 0x95, + 0xb5, 0x48, 0x80, 0x96, 0x69, 0xa3, 0x27, 0xed, + 0x8b, 0x2d, 0xae, 0x44, 0x64, 0x13, 0x4e, 0x63, + 0x1a, 0x5e, 0x06, 0x60, 0x84, 0xb9, 0x69, 0xf2, + 0x47, 0xeb, 0xdb, 0x32, 0x2e, 0xf1, 0x99, 0x70, + 0x8c, 0xd7, 0x45, 0xde, 0x33, 0x2e, 0x11, 0x9a, + 0xe8, 0xe4, 0x65, 0x9e, 0x5b, 0x69, 0xc0, 0x2e, + 0xbc, 0xa3, 0xea, 0x23, 0xcd, 0x7d, 0xf3, 0x6c, + 0xb6, 0xb9, 0x16, 0xd7, 0x22, 0xb0, 0xaa, 0x90, + 0x95, 0x8d, 0xa6, 0xa8, 0xb3, 0xed, 0x06, 0x1b, + 0x26, 0xfe, 0x91, 0x2e, 0xfb, 0x83, 0xe9, 0x4e, + 0x63, 0x66, 0x9c, 0xbd, 0xba, 0x5a, 0x06, 0x71, + 0xc4, 0xb2, 0x42, 0x79, 0x8c, 0x9a, 0x30, 0x01, + 0x9d, 0x62, 0xf1, 0x99, 0x70, 0xde, 0xd7, 0x43, + 0x2b, 0x2c, 0xf1, 0xdf, 0x46, 0x31, 0x6b, 0xa1, + 0x23, 0xa5, 0x9d, 0xb1, 0x9d, 0x0e, 0x23, 0x31, + 0x58, 0xe4, 0x75, 0x4c, 0x6d, 0xfb, 0x4e, 0x6d, + 0x82, 0xda, 0xe4, 0xe7, 0x50, 0xbe, 0x47, 0xb9, + 0xee, 0xca, 0x3b, 0x3b, 0x8d, 0xf7, 0x20, 0xf6, + 0x99, 0xde, 0xa4, 0xf7, 0x8e, 0xef, 0xfd, 0xaf, + 0xc2, 0x07, 0xf7, 0x07, 0x78, 0xdc, 0x9d, 0xb4, + 0xcf, 0x89, 0x9e, 0x10, 0xc7, 0x9b, 0x29, 0xc6, + 0xdf, 0x42, 0xa7, 0xa6, 0xf0, 0x84, 0x06, 0x96, + 0x57, 0x34, 0x8c, 0xa3, 0x3e, 0xb9, 0x58, 0xe4, + 0x73, 0x99, 0x33, 0xea, 0x45, 0x3b, 0x07, 0x17, + 0xa4, 0xa6, 0xc5, 0x23, 0xaa, 0x98, 0xe1, 0x20, + 0x6d, 0x9e, 0xcc, 0xd2, 0x7b, 0x2a, 0xa6, 0x38, + 0xf2, 0x8c, 0x8e, 0x26, 0x97, 0xcb, 0x61, 0xfe, + 0xd5, 0x45, 0x63, 0x3b, 0x20, 0xa8, 0xc4, 0x2d, + 0x20, 0xb3, 0xda, 0x42, 0x75, 0x4f, 0x8c, 0x4d, + 0x82, 0x19, 0x32, 0x72, 0xe6, 0x19, 0xfd, 0x94, + 0xe8, 0x5a, 0xe2, 0xf6, 0x58, 0x39, 0xa4, 0xf2, + 0x2a, 0x50, 0xdd, 0x22, 0x61, 0x0b, 0xbe, 0x20, + 0x1f, 0xc5, 0x50, 0x87, 0x49, 0x92, 0x85, 0xe1, + 0xdb, 0xfb, 0x71, 0x5d, 0x52, 0xcb, 0x0b, 0xa7, + 0x11, 0x49, 0x38, 0x81, 0xc2, 0x51, 0x67, 0x7a, + 0xc2, 0xaf, 0x8e, 0x29, 0xa5, 0x35, 0x14, 0xad, + 0x2f, 0xce, 0x37, 0xb6, 0x51, 0xb1, 0xb2, 0xca, + 0xea, 0x97, 0xb0, 0xba, 0xed, 0x6f, 0x93, 0x69, + 0xe4, 0x2a, 0x8a, 0x19, 0xe6, 0x95, 0xb5, 0x35, + 0x2d, 0x0f, 0xb3, 0x46, 0xf4, 0x05, 0x53, 0x2c, + 0xb9, 0x77, 0xc5, 0x1c, 0xc6, 0x16, 0x36, 0x16, + 0xdd, 0xc7, 0xd2, 0xbc, 0x20, 0x26, 0x95, 0xe1, + 0xb4, 0xe1, 0xaf, 0x6b, 0x9b, 0xc6, 0x0a, 0xa6, + 0x67, 0x8c, 0x4d, 0x6a, 0xa6, 0x62, 0x8b, 0x30, + 0xcd, 0xeb, 0x51, 0x3a, 0xa3, 0x2e, 0x5d, 0x33, + 0xcb, 0x1b, 0x91, 0x6d, 0xc3, 0x6c, 0x6d, 0x77, + 0x2a, 0x99, 0x6a, 0xa4, 0x90, 0x64, 0x27, 0xc9, + 0x1c, 0x9f, 0xd6, 0x1e, 0x84, 0xe6, 0x12, 0xf9, + 0x58, 0x69, 0xf2, 0xd1, 0x9c, 0xda, 0x3d, 0x29, + 0xd9, 0x2c, 0x59, 0x3b, 0xef, 0x71, 0x69, 0xb2, + 0xa8, 0x1f, 0xf8, 0x1f, 0xb9, 0x43, 0xee, 0xfe, + 0x6a, 0x9b, 0x08, 0x0e, 0x76, 0x50, 0x66, 0x2a, + 0x06, 0xc7, 0x8e, 0xb2, 0x23, 0x3b, 0x81, 0xc5, + 0x99, 0xd7, 0x23, 0xfa, 0x29, 0x91, 0xc7, 0xbf, + 0x6e, 0x1b, 0xe5, 0xbf, 0xc4, 0x58, 0x1d, 0x23, + 0xb1, 0xb6, 0x37, 0x36, 0x28, 0xad, 0x66, 0xba, + 0xe0, 0xa9, 0x1f, 0x33, 0xf5, 0xcc, 0x10, 0xc5, + 0x1f, 0x2d, 0x88, 0xcf, 0xf0, 0xb2, 0xa8, 0x13, + 0xc6, 0xd9, 0xbc, 0xac, 0x7b, 0xd1, 0x25, 0xc6, + 0x87, 0xf1, 0x85, 0x57, 0x68, 0xf1, 0x86, 0x9d, + 0xe8, 0x71, 0x39, 0x81, 0x89, 0xe5, 0x43, 0x6d, + 0xed, 0xe4, 0x19, 0x87, 0xad, 0x78, 0x48, 0xbe, + 0xe7, 0x06, 0x76, 0xe7, 0xff, 0x00, 0xc8, 0x15, + 0x5d, 0xa9, 0x41, 0xc8, 0x54, 0x64, 0x80, 0xc6, + 0xec, 0xe0, 0xdf, 0x4f, 0x32, 0x78, 0x31, 0xb6, + 0x46, 0xe5, 0xdf, 0x1d, 0xdf, 0x30, 0x66, 0x16, + 0x83, 0xc5, 0x9f, 0x4a, 0xa3, 0xc2, 0xc0, 0xe7, + 0x00, 0xe9, 0x9d, 0x25, 0xf4, 0xe1, 0x2e, 0xfc, + 0x17, 0x83, 0xa5, 0x75, 0x63, 0x69, 0xec, 0x1c, + 0x7e, 0xb6, 0x23, 0xbf, 0x3c, 0x81, 0x36, 0x70, + 0xdb, 0x32, 0x0a, 0x97, 0xc9, 0x6e, 0x46, 0xdb, + 0x17, 0xfc, 0x4a, 0x13, 0xff, 0x00, 0xfa, 0xa6, + 0x83, 0xff, 0x00, 0x67, 0x76, 0xa1, 0x59, 0xfe, + 0x2e, 0x00, 0x3d, 0xa2, 0x6c, 0xef, 0xf6, 0xb9, + 0x53, 0x0f, 0xaf, 0x82, 0x5a, 0x86, 0xfa, 0xed, + 0x9b, 0xfd, 0xaa, 0x28, 0x65, 0x71, 0x92, 0x17, + 0xca, 0xd2, 0xf0, 0xec, 0xfc, 0x6a, 0x7b, 0xbd, + 0xce, 0xca, 0x5f, 0x18, 0x39, 0xd5, 0x7b, 0xdd, + 0x54, 0xd7, 0xe3, 0x0f, 0x66, 0x41, 0xb8, 0xaf, + 0x73, 0xcb, 0x9a, 0xdb, 0x90, 0xfb, 0xc7, 0x6e, + 0x41, 0xed, 0x33, 0xbd, 0x49, 0xef, 0x1d, 0xdf, + 0xfb, 0x5d, 0x78, 0xfd, 0xd1, 0xde, 0x37, 0x1d, + 0x1d, 0x46, 0x28, 0x66, 0xc5, 0x71, 0x30, 0x17, + 0xcd, 0xc9, 0x65, 0x43, 0x15, 0x33, 0x9f, 0x2f, + 0x8b, 0x1b, 0x89, 0x1f, 0xa4, 0x95, 0x04, 0x25, + 0xae, 0x11, 0x37, 0xca, 0x3c, 0x37, 0x4d, 0xdc, + 0x6e, 0x53, 0x98, 0x6a, 0xa4, 0xad, 0x05, 0xcd, + 0x2c, 0x6b, 0xd9, 0x9d, 0x96, 0x3c, 0xaa, 0xa2, + 0x66, 0x4a, 0xe3, 0x15, 0x4b, 0x08, 0x73, 0x9a, + 0xdb, 0x16, 0x15, 0x48, 0xf7, 0x56, 0x4f, 0x52, + 0xd8, 0xee, 0x5c, 0xf9, 0x2f, 0x6d, 0x1c, 0x41, + 0x54, 0xc1, 0x7d, 0xfb, 0xe7, 0xc6, 0x05, 0xb8, + 0x93, 0x5f, 0x19, 0xc4, 0xdc, 0x00, 0x68, 0x55, + 0x92, 0x07, 0x62, 0x6b, 0x98, 0x1d, 0x19, 0xb1, + 0xe1, 0x81, 0x65, 0xe0, 0xe7, 0x3b, 0x3e, 0x46, + 0x32, 0xd7, 0x66, 0xe0, 0x95, 0x14, 0x6f, 0xaa, + 0x92, 0x57, 0xc5, 0x50, 0xd9, 0x72, 0x8f, 0x69, + 0xdf, 0x7e, 0x0b, 0xc2, 0x92, 0x62, 0xde, 0xcf, + 0x13, 0x9a, 0xcc, 0xda, 0x6e, 0xa9, 0x5f, 0x96, + 0x91, 0xb1, 0xb2, 0x31, 0x19, 0x81, 0xa3, 0x7a, + 0x0f, 0x2a, 0xf0, 0x7c, 0xb8, 0xa4, 0xca, 0xc6, + 0x03, 0x1a, 0x32, 0x64, 0x63, 0x03, 0xeb, 0x2a, + 0xba, 0x67, 0x54, 0xc9, 0x48, 0x7c, 0x61, 0xd2, + 0x36, 0x58, 0xef, 0xcd, 0x99, 0x78, 0x49, 0xb9, + 0x59, 0x5f, 0x95, 0x6b, 0x5a, 0xc3, 0x31, 0xc4, + 0xe3, 0x65, 0xe0, 0xa7, 0xe3, 0xcd, 0x04, 0x78, + 0x5f, 0x98, 0xe6, 0x4c, 0x8d, 0xd5, 0x73, 0x52, + 0x64, 0x9e, 0xe3, 0xe4, 0xaf, 0xbf, 0x69, 0x2a, + 0xa2, 0x1c, 0x6f, 0x74, 0x8f, 0x9f, 0x18, 0xca, + 0x67, 0x71, 0x1e, 0x92, 0xa9, 0xde, 0x5f, 0xe4, + 0xc5, 0x26, 0x45, 0xce, 0xb6, 0x82, 0x9c, 0x18, + 0x71, 0xb6, 0xf9, 0x9d, 0x6b, 0x5d, 0x4e, 0x7f, + 0xf0, 0x3b, 0x72, 0x8c, 0xc6, 0xe8, 0xdb, 0x68, + 0xfe, 0xbb, 0xec, 0x99, 0x23, 0x25, 0xa7, 0x0f, + 0x69, 0xb8, 0x39, 0x50, 0x83, 0x58, 0x69, 0x29, + 0xda, 0x09, 0x36, 0x8a, 0x5b, 0x5c, 0x94, 0x06, + 0x56, 0x0b, 0x0d, 0x03, 0x2c, 0x13, 0x59, 0xfa, + 0x19, 0x73, 0x41, 0x6b, 0x64, 0x2f, 0x18, 0x9a, + 0x10, 0x6b, 0xa2, 0xa0, 0xb8, 0x60, 0x60, 0x78, + 0x94, 0xdc, 0x76, 0xa7, 0xc5, 0xfa, 0x1c, 0xac, + 0x79, 0x0e, 0x21, 0xf2, 0x72, 0x5f, 0xf1, 0x52, + 0x3f, 0x15, 0x23, 0xb2, 0x8f, 0xc4, 0xeb, 0xc9, + 0xe8, 0x22, 0xdc, 0xce, 0x42, 0x40, 0xea, 0x6b, + 0x87, 0x62, 0x03, 0x2a, 0x2c, 0xaa, 0x0e, 0x2a, + 0x6f, 0x2f, 0xc2, 0xf2, 0xbf, 0xbd, 0x7f, 0x92, + 0x9e, 0xee, 0xa5, 0xf2, 0xd2, 0x65, 0x5d, 0x69, + 0x78, 0xf3, 0xfe, 0x2a, 0x47, 0x3c, 0x51, 0x49, + 0x8a, 0x43, 0x28, 0x0f, 0x7f, 0x04, 0x9e, 0x4c, + 0xe8, 0x37, 0x15, 0x2e, 0x68, 0xcc, 0x57, 0xca, + 0x0d, 0x18, 0xae, 0xa1, 0x8c, 0xbe, 0x9a, 0xd1, + 0x02, 0x07, 0x95, 0x1c, 0xb7, 0x53, 0xc6, 0xc7, + 0xd3, 0x61, 0x98, 0x61, 0x37, 0x94, 0x2a, 0x46, + 0xe3, 0xa5, 0xb5, 0x33, 0xb1, 0x33, 0xca, 0x69, + 0xcf, 0x7c, 0xea, 0x10, 0x1f, 0x4a, 0x44, 0x52, + 0x65, 0x1b, 0x79, 0x38, 0xd4, 0x52, 0xb6, 0x5a, + 0x76, 0x3e, 0x20, 0x03, 0x6d, 0x28, 0xe2, 0x58, + 0x59, 0xe2, 0x74, 0xe2, 0xf8, 0x8e, 0x45, 0xf6, + 0xb9, 0x4f, 0x1f, 0xa1, 0x46, 0xf9, 0x33, 0x3e, + 0x46, 0x3c, 0x07, 0x39, 0x49, 0x33, 0x9f, 0x4c, + 0x1c, 0xf3, 0x73, 0x69, 0x42, 0xd6, 0x53, 0xf5, + 0xa1, 0x43, 0x1b, 0xcb, 0x49, 0xca, 0x1e, 0x01, + 0xb8, 0xdc, 0x83, 0xda, 0x67, 0x7a, 0x93, 0xde, + 0x3b, 0xbf, 0xf6, 0xb9, 0x59, 0x26, 0xae, 0x41, + 0x84, 0xfa, 0x16, 0xf5, 0xb8, 0xda, 0x74, 0x39, + 0xbc, 0x6b, 0x54, 0xee, 0x64, 0x1f, 0x1b, 0x1c, + 0xd7, 0x0e, 0x3b, 0x22, 0xf7, 0xc6, 0xf7, 0x38, + 0xe9, 0x36, 0x5a, 0xa7, 0x73, 0x2d, 0x53, 0xb9, + 0x96, 0xa9, 0xdc, 0xcb, 0x54, 0xee, 0x65, 0xaa, + 0x77, 0x32, 0xd5, 0x3b, 0x99, 0x6a, 0x9d, 0xcc, + 0xb5, 0x4e, 0xe6, 0x5a, 0xa7, 0x73, 0x2d, 0x53, + 0xb9, 0x96, 0x4d, 0x99, 0x40, 0xcf, 0x52, 0xd5, + 0x3b, 0x99, 0x6a, 0x9d, 0xcc, 0xb5, 0x4e, 0xe6, + 0x5a, 0xa7, 0x73, 0x2d, 0x53, 0xb9, 0x96, 0xa9, + 0xdc, 0xcb, 0x54, 0xee, 0x64, 0xe2, 0xed, 0x74, + 0x83, 0x08, 0x1c, 0x83, 0x72, 0x87, 0xdd, 0xfc, + 0xff, 0x00, 0x55, 0x1e, 0x56, 0xaa, 0x46, 0xbd, + 0xcc, 0x6b, 0xec, 0xd8, 0x6f, 0xa4, 0x5f, 0xed, + 0x2a, 0x77, 0x4b, 0x54, 0xe8, 0x9f, 0x35, 0xec, + 0x32, 0x57, 0x03, 0x3d, 0xb4, 0xdd, 0x33, 0x11, + 0xbb, 0x8e, 0x20, 0x47, 0x25, 0x8d, 0xbf, 0x55, + 0x0f, 0xbc, 0x76, 0xe4, 0x1e, 0xd3, 0x3b, 0xd4, + 0x9e, 0xf1, 0xdd, 0xff, 0x00, 0xb5, 0xb9, 0x50, + 0xe0, 0x7b, 0x9b, 0x9e, 0x4d, 0x07, 0xd4, 0xb5, + 0xd2, 0x74, 0x96, 0xba, 0x4e, 0x92, 0xd7, 0x49, + 0xd2, 0x5a, 0xe9, 0x3a, 0x4b, 0x5d, 0x27, 0x49, + 0x06, 0xe5, 0x9f, 0x9f, 0x36, 0x77, 0xa6, 0xb4, + 0x55, 0x3e, 0x50, 0x58, 0x1d, 0x88, 0x12, 0x15, + 0x2c, 0x42, 0xad, 0xe0, 0x4e, 0xcc, 0x78, 0xef, + 0xa3, 0x4d, 0xfb, 0x96, 0x27, 0x54, 0x4a, 0xdf, + 0x2c, 0x22, 0xc2, 0xdb, 0xb8, 0xfa, 0x53, 0x5c, + 0x32, 0xf8, 0x5d, 0xa0, 0xe7, 0xce, 0xb0, 0xc8, + 0xf9, 0xa3, 0x77, 0x23, 0x89, 0x05, 0x35, 0xcf, + 0xab, 0x7b, 0x06, 0x4c, 0xca, 0xed, 0x27, 0x0b, + 0x6f, 0x60, 0x8e, 0x46, 0xb9, 0xf2, 0x0c, 0x9b, + 0x9e, 0x38, 0x8e, 0x6e, 0x22, 0x2e, 0xa9, 0x66, + 0x15, 0x0f, 0x39, 0x77, 0x16, 0x86, 0xdc, 0xe6, + 0xce, 0xb7, 0xb5, 0x4f, 0x96, 0x32, 0x5c, 0xdc, + 0x57, 0xb6, 0x70, 0x7f, 0xae, 0x75, 0xae, 0x93, + 0xa4, 0xb5, 0xd2, 0x74, 0x96, 0xba, 0x4e, 0x92, + 0xd7, 0x49, 0xd2, 0x5a, 0xe9, 0x3a, 0x4b, 0x5a, + 0xfe, 0x92, 0xa1, 0xf7, 0x5f, 0x3d, 0xca, 0x1f, + 0x77, 0xf3, 0xfd, 0x54, 0x19, 0x1a, 0x36, 0xcb, + 0x19, 0x82, 0x3d, 0xfe, 0x40, 0x3b, 0xea, 0xf2, + 0xaa, 0x0b, 0xd3, 0x47, 0x2b, 0xc3, 0x5c, 0x43, + 0x9f, 0x7c, 0xdb, 0xf3, 0xe9, 0x54, 0x6f, 0x71, + 0xbb, 0x9c, 0x1e, 0x49, 0xff, 0x00, 0x51, 0xfd, + 0x54, 0x3e, 0xf1, 0xdb, 0x90, 0x7b, 0x4c, 0xef, + 0x52, 0x7b, 0xc7, 0x77, 0xfe, 0xd6, 0xe5, 0x41, + 0xeb, 0x93, 0xe5, 0xf4, 0x9a, 0xc6, 0x8c, 0x4e, + 0x71, 0xb0, 0x01, 0x53, 0x3a, 0xaa, 0x09, 0x72, + 0x59, 0x16, 0xb7, 0x36, 0xf7, 0x3d, 0x93, 0xe7, + 0x66, 0xf4, 0xc5, 0x8a, 0x26, 0xdf, 0x4e, 0xf8, + 0x82, 0x3f, 0xe4, 0xbc, 0x1a, 0xd6, 0xe8, 0x96, + 0x6f, 0x19, 0xe9, 0x11, 0xf8, 0x2a, 0x06, 0x12, + 0x73, 0xd3, 0x49, 0x84, 0x07, 0x5b, 0x7c, 0x4b, + 0xfb, 0x55, 0x3c, 0x66, 0x19, 0x22, 0x2c, 0x69, + 0xd6, 0xbf, 0x13, 0xad, 0x74, 0xd7, 0x53, 0x38, + 0x07, 0xf8, 0xb4, 0x78, 0x58, 0x7e, 0xb8, 0xc2, + 0x2e, 0x3d, 0x2a, 0x85, 0xf2, 0xc2, 0xda, 0x69, + 0x9e, 0xe2, 0xd9, 0x63, 0x66, 0x6d, 0xee, 0x8b, + 0xdb, 0x8b, 0x49, 0x52, 0x40, 0xef, 0xff, 0x00, + 0x84, 0xd6, 0x4b, 0xf1, 0x60, 0xcf, 0xda, 0x53, + 0x31, 0x69, 0x33, 0xb8, 0x8e, 0x61, 0x7f, 0x97, + 0xd3, 0xa1, 0xf7, 0x5f, 0x3d, 0xca, 0x47, 0x78, + 0xc4, 0x70, 0xe1, 0x65, 0xac, 0xf5, 0xb7, 0xd3, + 0xf3, 0xad, 0xbe, 0x9f, 0x9d, 0x6d, 0xf4, 0xfc, + 0xeb, 0x6f, 0xa7, 0xe7, 0x5b, 0x7d, 0x3f, 0x3a, + 0xdb, 0xe9, 0xf9, 0xd6, 0xdf, 0x4f, 0xce, 0xb6, + 0xfa, 0x7e, 0x75, 0xb7, 0xd3, 0xf3, 0xad, 0xbe, + 0x9f, 0x9d, 0x6d, 0xf4, 0xfc, 0xeb, 0x6f, 0xa7, + 0xe7, 0x5b, 0x7d, 0x3f, 0x3a, 0xdb, 0xe9, 0xf9, + 0xd6, 0xdf, 0x4f, 0xce, 0xb6, 0xfa, 0x7e, 0x75, + 0xb7, 0xd3, 0xf3, 0xad, 0xbe, 0x9f, 0x9d, 0x6d, + 0xf4, 0xfc, 0xeb, 0x6f, 0xa7, 0xe7, 0x5b, 0x7d, + 0x3f, 0x3a, 0x86, 0x1c, 0xa3, 0x65, 0xdf, 0x93, + 0x89, 0x9a, 0x37, 0x21, 0xf6, 0x99, 0xde, 0xa4, + 0xf7, 0x8e, 0xef, 0xfd, 0xad, 0xcb, 0xc5, 0xe6, + 0x38, 0x2c, 0x71, 0x32, 0x4b, 0x5f, 0x0a, 0xdb, + 0x20, 0xed, 0x5b, 0x65, 0x3f, 0x6a, 0xdb, 0x29, + 0xfb, 0x56, 0xd9, 0x4f, 0xda, 0xb6, 0xca, 0x7e, + 0xd5, 0xb6, 0x53, 0xf6, 0xad, 0xb2, 0x9f, 0xb5, + 0x6d, 0x94, 0xfd, 0xab, 0x6c, 0xa7, 0xed, 0x5b, + 0x65, 0x3f, 0x6a, 0xdb, 0x29, 0xfb, 0x54, 0x6c, + 0x75, 0x65, 0x37, 0x93, 0xcc, 0x0e, 0x7b, 0xdb, + 0x91, 0x6d, 0x94, 0xfd, 0xab, 0x6c, 0xa7, 0xed, + 0x51, 0xb3, 0xc7, 0x29, 0x83, 0x63, 0x16, 0x00, + 0x5d, 0x6d, 0x94, 0xfd, 0xab, 0x6c, 0xa7, 0xed, + 0x5b, 0x65, 0x3f, 0x6a, 0xdb, 0x29, 0xfb, 0x56, + 0xd9, 0x4f, 0xda, 0xaf, 0x35, 0x63, 0x30, 0x72, + 0x46, 0x09, 0x25, 0x00, 0xc6, 0xe0, 0x8d, 0xa3, + 0x0b, 0x5b, 0xc8, 0x37, 0x28, 0x7d, 0xdf, 0xcf, + 0xf5, 0x31, 0x45, 0x7c, 0x39, 0x47, 0x86, 0xdf, + 0x92, 0xeb, 0x20, 0xd2, 0x2f, 0x7d, 0x27, 0x40, + 0xf4, 0xa2, 0xf8, 0x6a, 0x84, 0xb8, 0x4d, 0x8b, + 0x5c, 0xdc, 0x27, 0xe1, 0xca, 0xa5, 0x82, 0x2a, + 0x93, 0x25, 0x44, 0x77, 0xde, 0x3a, 0x3c, 0x37, + 0xb7, 0x26, 0x7f, 0xd5, 0x43, 0xef, 0x1d, 0xb9, + 0x0f, 0xb4, 0xce, 0xf5, 0x27, 0xbc, 0x77, 0x7f, + 0xed, 0x78, 0x1b, 0xa4, 0x95, 0x85, 0xac, 0x13, + 0x11, 0xa5, 0xee, 0xd0, 0xb6, 0x68, 0x96, 0xcd, + 0x12, 0xd9, 0xa2, 0x5b, 0x34, 0x4b, 0x66, 0x89, + 0x6c, 0xd1, 0x2d, 0x9a, 0x25, 0xb3, 0x44, 0xb6, + 0x68, 0x96, 0xcd, 0x12, 0xd9, 0xa2, 0x5b, 0x34, + 0x4b, 0x66, 0x89, 0x6c, 0xd1, 0x2d, 0x9a, 0x25, + 0xb3, 0x44, 0xb6, 0x68, 0x96, 0xcd, 0x12, 0xd9, + 0xa2, 0x5b, 0x34, 0x4b, 0x3d, 0x34, 0x6b, 0x2d, + 0x05, 0xc0, 0x1c, 0x26, 0x1e, 0x2d, 0xca, 0x1f, + 0x77, 0xf3, 0xfd, 0x4d, 0x27, 0xbe, 0x67, 0x7a, + 0x71, 0xa8, 0x8d, 0xd0, 0x47, 0x28, 0x7c, 0x42, + 0x47, 0x8b, 0x0b, 0x90, 0x6c, 0x9c, 0xf9, 0xc6, + 0x4b, 0x3d, 0x9a, 0xd3, 0xa5, 0xde, 0xa5, 0x3d, + 0x64, 0xac, 0x31, 0xd3, 0xb1, 0xce, 0x7e, 0x27, + 0x7d, 0x6e, 0x40, 0x3f, 0x55, 0x0f, 0xbc, 0x76, + 0xe4, 0x3e, 0xd3, 0x3b, 0xd4, 0x9e, 0xf1, 0xdd, + 0xff, 0x00, 0xb5, 0xce, 0x79, 0x23, 0x77, 0x77, + 0xea, 0x62, 0xa9, 0x9a, 0xb4, 0x40, 0x24, 0x24, + 0x00, 0x59, 0x74, 0xd6, 0x38, 0x87, 0x87, 0x8b, + 0xb1, 0xed, 0xd0, 0xe0, 0xa1, 0xa7, 0x9d, 0x92, + 0x44, 0x24, 0xbe, 0x91, 0x63, 0xa1, 0x5c, 0xb1, + 0xe2, 0x3b, 0xd9, 0xae, 0x23, 0x31, 0x59, 0x2c, + 0x8c, 0x99, 0x5f, 0xb1, 0x84, 0xdd, 0x17, 0xb2, + 0x37, 0xb9, 0x83, 0x4b, 0x80, 0xcc, 0x11, 0x64, + 0x8d, 0x2c, 0x78, 0xd2, 0xd7, 0x0b, 0x1f, 0xd4, + 0x55, 0x37, 0x8b, 0x20, 0x4f, 0x68, 0xdc, 0xa4, + 0x35, 0x55, 0x7e, 0x2c, 0xe0, 0xcc, 0xc3, 0x95, + 0x79, 0xd3, 0xb1, 0x79, 0xd3, 0xb1, 0x79, 0xd3, + 0xb1, 0x79, 0xd3, 0xb1, 0x79, 0xd3, 0xb1, 0x79, + 0xd3, 0xb1, 0x79, 0xd3, 0xb1, 0x79, 0xd3, 0xb1, + 0x79, 0xd3, 0xb1, 0x79, 0xd3, 0xb1, 0x79, 0xd3, + 0xb1, 0x79, 0xd3, 0xb1, 0x79, 0xd3, 0xb1, 0x79, + 0xd3, 0xb1, 0x79, 0xd3, 0xb1, 0x79, 0xd3, 0xb1, + 0x79, 0xd3, 0xb1, 0x79, 0xd3, 0xb1, 0x79, 0xd3, + 0xb1, 0x79, 0xd3, 0xb1, 0x79, 0xd3, 0xb1, 0x42, + 0xca, 0x79, 0xb2, 0xf1, 0xe3, 0x3b, 0xfd, 0xc8, + 0x7d, 0xa6, 0x77, 0xa9, 0x3d, 0xe3, 0xbb, 0xff, + 0x00, 0x6b, 0xa9, 0xf7, 0x4f, 0xff, 0x00, 0x6f, + 0xea, 0x7c, 0x1c, 0xd6, 0x82, 0x4e, 0x37, 0xe8, + 0xf5, 0xaf, 0x02, 0x43, 0x3e, 0xb6, 0x36, 0x3d, + 0xd6, 0x3c, 0x5c, 0x8a, 0x16, 0x5a, 0xb2, 0x52, + 0x27, 0x27, 0x2b, 0x50, 0x06, 0xf4, 0xe1, 0x37, + 0x17, 0x5e, 0x17, 0x6d, 0x4b, 0x9c, 0x43, 0x5e, + 0xdc, 0x18, 0xbe, 0xa9, 0xbe, 0x81, 0xd8, 0x9f, + 0x25, 0xb7, 0xb9, 0x2b, 0xf6, 0x2f, 0x04, 0x0a, + 0x67, 0x38, 0x07, 0x48, 0xec, 0x78, 0x7e, 0xb1, + 0xbe, 0x82, 0xaa, 0x4f, 0xab, 0xfd, 0xa3, 0xf5, + 0x15, 0x57, 0xff, 0x00, 0xf3, 0xbb, 0xbc, 0x6e, + 0x50, 0xfb, 0xbf, 0x9f, 0xd2, 0x93, 0x1e, 0x2c, + 0x31, 0xb0, 0xbc, 0x86, 0x69, 0x2b, 0x15, 0x2e, + 0x33, 0x66, 0x97, 0x3d, 0x8f, 0xd2, 0xdf, 0xc5, + 0x35, 0xed, 0x60, 0xc2, 0xed, 0x04, 0xb8, 0x0f, + 0xeb, 0x41, 0x50, 0xbd, 0xc2, 0xf8, 0xe6, 0xc9, + 0x64, 0xc3, 0x80, 0x77, 0x12, 0xcb, 0x06, 0x79, + 0x3e, 0x5b, 0xfc, 0x95, 0x46, 0x1b, 0xe4, 0x63, + 0x94, 0xc6, 0x1c, 0xe3, 0xa5, 0x49, 0x23, 0xd9, + 0x51, 0x8a, 0x2b, 0x5f, 0x0c, 0x82, 0xc6, 0xff, + 0x00, 0x04, 0xd3, 0x0c, 0x6e, 0xc2, 0x59, 0x94, + 0xdf, 0xbc, 0x68, 0xc5, 0x6b, 0xa3, 0x78, 0xb4, + 0x10, 0x2c, 0x08, 0x27, 0x3e, 0x85, 0x1c, 0x65, + 0x9b, 0xe9, 0x0e, 0x16, 0xd9, 0xc0, 0xdc, 0xf2, + 0x2c, 0x0f, 0x16, 0x77, 0x25, 0xfe, 0x94, 0x3e, + 0xf1, 0xdb, 0x90, 0xfb, 0x4c, 0xef, 0x52, 0x7b, + 0xc7, 0x77, 0xfe, 0xd7, 0x23, 0x38, 0xde, 0xd2, + 0xd1, 0xcc, 0xac, 0x45, 0x8f, 0xea, 0x04, 0x51, + 0x4b, 0x85, 0x83, 0x40, 0xc2, 0x16, 0x58, 0xbd, + 0xc6, 0x5d, 0x38, 0x93, 0x24, 0x33, 0x12, 0xe6, + 0x70, 0x73, 0x04, 0x22, 0x92, 0x52, 0xe6, 0x0e, + 0x24, 0xc0, 0x26, 0x36, 0x66, 0x8c, 0xcb, 0x26, + 0x6a, 0xa4, 0x87, 0x7d, 0x77, 0x37, 0x0d, 0xc1, + 0x1e, 0x8e, 0x45, 0x2c, 0xd6, 0xb6, 0x23, 0xfa, + 0x8a, 0x99, 0x4e, 0x66, 0xe4, 0xf0, 0x7c, 0x4e, + 0xe5, 0x0f, 0xbb, 0xf9, 0xfd, 0x22, 0x5b, 0x51, + 0xe2, 0xd2, 0x81, 0x76, 0x38, 0x9b, 0x67, 0xf5, + 0xf1, 0x2a, 0x2c, 0xb3, 0xe3, 0x9a, 0xa0, 0x97, + 0x36, 0x57, 0x45, 0x63, 0x76, 0x1c, 0xdc, 0x5a, + 0x4e, 0x95, 0x2c, 0x18, 0xa9, 0xe4, 0x82, 0x2c, + 0x31, 0xe4, 0xe6, 0x76, 0x1b, 0xdb, 0xeb, 0x03, + 0xcf, 0xce, 0xa9, 0xf0, 0x4c, 0xdc, 0x9c, 0x55, + 0xc5, 0xdb, 0xf7, 0x58, 0xe1, 0xde, 0xd8, 0xf6, + 0x2a, 0x79, 0x45, 0x43, 0x22, 0x11, 0x44, 0x58, + 0xe6, 0xdf, 0x7d, 0x7b, 0x9c, 0xd6, 0xf4, 0xdd, + 0x3e, 0x48, 0xdc, 0xd1, 0x93, 0x95, 0xcc, 0xc0, + 0x1d, 0xc2, 0x17, 0xbe, 0x20, 0xab, 0x1a, 0x5c, + 0x03, 0x8e, 0x0b, 0x0e, 0x5c, 0xeb, 0x0e, 0x36, + 0xe2, 0xf1, 0x4c, 0x36, 0xbf, 0x1e, 0x5a, 0xf6, + 0xe6, 0x4f, 0x91, 0xf2, 0x37, 0x06, 0x42, 0x11, + 0xa7, 0xdd, 0xdf, 0xe6, 0xa8, 0x99, 0xfa, 0x2c, + 0x4c, 0x15, 0x01, 0xe7, 0x25, 0x21, 0x77, 0xc4, + 0x92, 0x51, 0xfa, 0x50, 0xfb, 0xd7, 0x6e, 0x43, + 0xed, 0x33, 0xbd, 0x49, 0xef, 0x1d, 0xdf, 0xfb, + 0x59, 0x51, 0xb2, 0x5a, 0x6c, 0xa9, 0x74, 0x4d, + 0x7e, 0x36, 0xbb, 0x09, 0x5b, 0x1c, 0x9d, 0x67, + 0xe4, 0xb6, 0x39, 0x3a, 0xcf, 0xc9, 0x6c, 0x72, + 0x75, 0x9f, 0x92, 0xd8, 0xe4, 0xeb, 0x3f, 0x25, + 0xb1, 0xc9, 0xd6, 0x7e, 0x4b, 0x63, 0x93, 0xac, + 0xfc, 0x96, 0xc7, 0x27, 0x59, 0xf9, 0x2d, 0x8e, + 0x4e, 0xb3, 0xf2, 0x5b, 0x1c, 0x9d, 0x67, 0xe4, + 0xb6, 0x39, 0x3a, 0xcf, 0xc9, 0x6c, 0x72, 0x75, + 0x9f, 0x92, 0xd8, 0xe4, 0xeb, 0x3f, 0x25, 0xb1, + 0xc9, 0xd6, 0x7e, 0x4b, 0x63, 0x93, 0xac, 0xfc, + 0x96, 0xc7, 0x27, 0x59, 0xf9, 0x2d, 0x8e, 0x4e, + 0xb3, 0xf2, 0x5b, 0x1c, 0x9d, 0x67, 0xe4, 0xb6, + 0x39, 0x3a, 0xcf, 0xc9, 0x6c, 0x72, 0x75, 0x9f, + 0x92, 0xd8, 0xe4, 0xeb, 0x3f, 0x25, 0x9a, 0x89, + 0xc7, 0xd7, 0x2f, 0xe4, 0xa0, 0x93, 0x00, 0x8c, + 0x63, 0x76, 0xf5, 0xba, 0x37, 0x29, 0x3c, 0x66, + 0x69, 0x22, 0x70, 0x8f, 0x36, 0x06, 0xdd, 0x6d, + 0x75, 0x1d, 0x5a, 0xda, 0xea, 0x3a, 0xb5, 0xb5, + 0xd4, 0x75, 0x6b, 0x6b, 0xa8, 0xea, 0xd6, 0xd7, + 0x51, 0xd5, 0xad, 0xae, 0xa3, 0xab, 0x58, 0xe3, + 0xad, 0x9d, 0xaf, 0xe5, 0xc9, 0x05, 0xb5, 0xd4, + 0x75, 0x6b, 0x6b, 0xa8, 0xea, 0xd6, 0xd7, 0x51, + 0xd5, 0xad, 0xae, 0xa3, 0xab, 0x5b, 0x5d, 0x47, + 0x56, 0xb6, 0xba, 0x8e, 0xad, 0x6d, 0x75, 0x1d, + 0x5a, 0xda, 0xea, 0x3a, 0xb5, 0xb5, 0xd4, 0x75, + 0x6b, 0x6b, 0xa8, 0xea, 0xd6, 0xd7, 0x51, 0xd5, + 0xad, 0xae, 0xa3, 0xab, 0x5b, 0x5d, 0x47, 0x56, + 0xb6, 0xba, 0x8e, 0xad, 0x35, 0xb4, 0xcf, 0x74, + 0x8c, 0x6c, 0xc4, 0x5d, 0xe2, 0xdc, 0x5b, 0x90, + 0xfb, 0x4c, 0xef, 0x52, 0x7b, 0xc7, 0x77, 0xfe, + 0xd6, 0xe5, 0x07, 0xf9, 0x76, 0x7d, 0x1a, 0x9c, + 0x10, 0x89, 0xe4, 0x10, 0xdd, 0xad, 0x2c, 0xc7, + 0x9f, 0x10, 0xe2, 0x50, 0xe5, 0xe2, 0x65, 0x1c, + 0xf7, 0x79, 0x75, 0x99, 0x87, 0x78, 0x05, 0xef, + 0x87, 0x9d, 0x41, 0x86, 0x62, 0x61, 0x96, 0xf6, + 0x7e, 0x0c, 0xfe, 0xab, 0x2a, 0x9c, 0x40, 0xba, + 0xf0, 0x07, 0xb3, 0x28, 0xcc, 0x2e, 0x1e, 0x50, + 0x0d, 0x0a, 0x79, 0x5c, 0x5c, 0x25, 0x6b, 0xd8, + 0xd6, 0xef, 0x79, 0x6f, 0xe9, 0xf4, 0x27, 0x35, + 0xd3, 0x86, 0x39, 0xf5, 0x0f, 0x85, 0xa1, 0xb1, + 0xe6, 0xb8, 0xb7, 0x30, 0xce, 0xa3, 0x2c, 0x9e, + 0xf1, 0x9c, 0x78, 0x9e, 0x5b, 0x6c, 0x38, 0x45, + 0xca, 0x8d, 0xf1, 0xbf, 0x29, 0x14, 0x83, 0x31, + 0x22, 0xc5, 0x47, 0x26, 0x4e, 0x2c, 0x6c, 0x9b, + 0x0d, 0xcc, 0x63, 0x38, 0xb7, 0x1f, 0x2a, 0xa4, + 0xa7, 0x64, 0x50, 0x33, 0x2c, 0xc6, 0x12, 0x59, + 0x13, 0x41, 0xb9, 0x54, 0x86, 0x16, 0x88, 0xe1, + 0x99, 0xf9, 0x3d, 0xef, 0xa0, 0xfe, 0x16, 0x53, + 0x64, 0xfc, 0x1c, 0xd3, 0x00, 0x19, 0x9d, 0x13, + 0x33, 0xb3, 0xd6, 0xef, 0xa5, 0x4f, 0xed, 0xbf, + 0x72, 0x8f, 0xdc, 0xfc, 0xcf, 0xd0, 0x8e, 0x1f, + 0x17, 0x8e, 0x4c, 0x4f, 0xbc, 0x8f, 0x90, 0x5f, + 0x79, 0xf2, 0xe3, 0x4f, 0x9d, 0xb2, 0xda, 0x16, + 0x5f, 0x1d, 0xc6, 0x76, 0xf2, 0x7a, 0xee, 0x9f, + 0x13, 0x9a, 0x0e, 0x52, 0x37, 0x06, 0xdf, 0x88, + 0xda, 0xe1, 0x78, 0x3d, 0x8d, 0x68, 0xca, 0x97, + 0x8c, 0xa1, 0xf6, 0xef, 0x6e, 0xc0, 0xa6, 0xaa, + 0x8d, 0xce, 0x11, 0x5f, 0x1d, 0x9b, 0x0d, 0x98, + 0x1b, 0x7d, 0x00, 0xf2, 0xe7, 0x55, 0x5e, 0x58, + 0xc5, 0x4f, 0x1c, 0x99, 0x3b, 0xe0, 0xb9, 0xbf, + 0x3f, 0xa1, 0x42, 0xc7, 0x4c, 0xd6, 0x38, 0xd4, + 0x3e, 0x30, 0xf6, 0xb7, 0x16, 0x2e, 0x0d, 0xbe, + 0x1f, 0x8a, 0x8b, 0x2c, 0xf0, 0x65, 0x73, 0x1e, + 0xe1, 0x11, 0x6d, 0xc5, 0xb3, 0xf1, 0xfc, 0x11, + 0x68, 0x96, 0xf5, 0x2d, 0x60, 0x90, 0xc5, 0x87, + 0x35, 0xbd, 0x7c, 0xb9, 0xd4, 0xee, 0x6d, 0x46, + 0x51, 0xd0, 0xb8, 0x31, 0xed, 0xc3, 0x6c, 0xea, + 0x66, 0x18, 0xa1, 0x78, 0x64, 0x4e, 0x78, 0x2f, + 0x89, 0xa4, 0xdd, 0x1a, 0x99, 0x1e, 0xc8, 0x5a, + 0x0b, 0x9c, 0x44, 0x71, 0x0f, 0xdc, 0x1f, 0xf2, + 0x52, 0x60, 0x9b, 0x28, 0xf6, 0x35, 0xb2, 0x61, + 0xc1, 0x6b, 0xb5, 0xd6, 0xb7, 0xc7, 0x38, 0x52, + 0x60, 0x9b, 0x28, 0xf8, 0x9d, 0x86, 0x41, 0x86, + 0xd6, 0xf5, 0x72, 0xa7, 0xc2, 0xd9, 0x32, 0xa5, + 0x86, 0xc4, 0xe1, 0xb7, 0xd0, 0x3f, 0xe6, 0x0f, + 0xfb, 0x46, 0xe4, 0x3e, 0xd3, 0x3b, 0xd4, 0x9e, + 0xf1, 0xdd, 0xff, 0x00, 0xb5, 0xb9, 0x53, 0x4d, + 0xfd, 0xdb, 0xa2, 0x0d, 0xbf, 0xa4, 0x7d, 0x1a, + 0x80, 0x6f, 0x79, 0x23, 0xc0, 0x2d, 0xeb, 0x07, + 0xe4, 0xa0, 0x7b, 0xb1, 0xe5, 0x58, 0xd7, 0x46, + 0x5e, 0xdd, 0x38, 0x0e, 0x8f, 0x88, 0x4d, 0x73, + 0xa6, 0xa9, 0x95, 0xb9, 0x37, 0x33, 0x1b, 0xf8, + 0x42, 0xfc, 0x60, 0x7e, 0x6b, 0x25, 0x1e, 0x54, + 0x38, 0x47, 0x93, 0x04, 0xfb, 0x61, 0xd7, 0xef, + 0x53, 0xb6, 0xa5, 0xf2, 0x49, 0x23, 0x8b, 0x0b, + 0x5d, 0xa7, 0x45, 0xf3, 0x76, 0xa8, 0xa5, 0xc2, + 0xfc, 0x2d, 0xab, 0x7c, 0xe7, 0xd4, 0x4b, 0x7f, + 0x05, 0x10, 0xdf, 0x82, 0x1d, 0x26, 0x22, 0xdd, + 0x36, 0x70, 0x03, 0x37, 0xa7, 0x32, 0x88, 0xe5, + 0x26, 0xa8, 0x6b, 0x3f, 0xc7, 0x3a, 0x7f, 0x04, + 0x21, 0xa6, 0x6b, 0xc3, 0x31, 0x99, 0x0e, 0x53, + 0x8b, 0xd0, 0xa3, 0x94, 0x07, 0x07, 0xc7, 0x06, + 0x4d, 0xbe, 0xd7, 0x2a, 0x06, 0x59, 0x1f, 0x2c, + 0xd1, 0xc8, 0xd9, 0x22, 0x73, 0xb3, 0xdb, 0x95, + 0x49, 0x2c, 0x2d, 0x9b, 0x28, 0xe0, 0x40, 0x8c, + 0xdb, 0x03, 0x6e, 0x2d, 0xf1, 0xfa, 0x54, 0x91, + 0x3f, 0x33, 0xcd, 0xe4, 0xb7, 0x25, 0xf4, 0x6e, + 0x51, 0x4b, 0xf5, 0x30, 0x16, 0x5f, 0xd3, 0x7f, + 0xa0, 0xe8, 0x9e, 0xe9, 0xa3, 0x91, 0xee, 0xdf, + 0x3a, 0x36, 0x03, 0x71, 0xc4, 0x34, 0xac, 0x9c, + 0x76, 0xc8, 0xe7, 0xde, 0x91, 0xc3, 0xbf, 0x2a, + 0x8a, 0x5f, 0xb0, 0xe0, 0xe5, 0x54, 0xf0, 0xc7, + 0x64, 0xdd, 0x1e, 0x18, 0x87, 0x21, 0x02, 0xcd, + 0xba, 0x96, 0xf9, 0x5c, 0x52, 0x42, 0x22, 0xb6, + 0x6b, 0x32, 0xd6, 0xd1, 0xcc, 0xaa, 0x03, 0xf2, + 0xc2, 0x29, 0x64, 0x13, 0x66, 0x02, 0xe0, 0xe7, + 0xb8, 0xed, 0x54, 0xf8, 0x58, 0xe6, 0xb6, 0x3a, + 0x87, 0x4b, 0x87, 0x4e, 0xf7, 0x7b, 0x9b, 0xb1, + 0x32, 0x67, 0xb6, 0x5c, 0xab, 0x1a, 0xe6, 0x00, + 0x2d, 0x63, 0x7b, 0xd8, 0xf6, 0xa7, 0x4e, 0xd0, + 0xff, 0x00, 0x19, 0x74, 0x62, 0x32, 0x0f, 0x04, + 0x68, 0x17, 0xec, 0x55, 0x6f, 0xc0, 0xf8, 0xcc, + 0xf2, 0xb5, 0xc3, 0x1d, 0xbd, 0x27, 0x7b, 0x6d, + 0x23, 0xd2, 0xa6, 0xc5, 0x7d, 0xfc, 0x65, 0x82, + 0xc9, 0xf4, 0xc4, 0x3b, 0x19, 0xc5, 0x9f, 0x8b, + 0x39, 0x67, 0xfe, 0xa5, 0x4c, 0xe6, 0x87, 0x5d, + 0xd0, 0x47, 0x18, 0xf5, 0xb7, 0x07, 0xfe, 0xa9, + 0xd6, 0x9a, 0xa5, 0xd8, 0xdd, 0x8b, 0x26, 0xf7, + 0x6f, 0x1b, 0xf8, 0xa9, 0xe6, 0x6d, 0xc3, 0x5e, + 0xf2, 0xe1, 0x7f, 0x5f, 0xd0, 0x8c, 0x38, 0x58, + 0xcb, 0x21, 0x90, 0x7a, 0xad, 0x6d, 0xc8, 0x3d, + 0xa6, 0x77, 0xa9, 0x3d, 0xe3, 0xbb, 0xff, 0x00, + 0x6b, 0x72, 0x74, 0x52, 0xb0, 0x4d, 0x0b, 0xb4, + 0xb1, 0xcb, 0x67, 0x90, 0x7f, 0x11, 0x6a, 0x25, + 0xeb, 0x16, 0xa2, 0x5e, 0xb1, 0x6a, 0x25, 0xeb, + 0x16, 0xa2, 0x5e, 0xb1, 0x6a, 0x25, 0xeb, 0x16, + 0xa2, 0x5e, 0xb1, 0x6a, 0x25, 0xeb, 0x16, 0xa2, + 0x5e, 0xb1, 0x6a, 0x25, 0xeb, 0x16, 0xa2, 0x5e, + 0xb1, 0x6a, 0x25, 0xeb, 0x16, 0xa2, 0x5e, 0xb1, + 0x6a, 0x25, 0xeb, 0x16, 0xa2, 0x5e, 0xb1, 0x6a, + 0x25, 0xeb, 0x16, 0xa2, 0x5e, 0xb1, 0x6a, 0x25, + 0xeb, 0x16, 0xa2, 0x5e, 0xb1, 0x6a, 0x25, 0xeb, + 0x10, 0x7c, 0x74, 0xb7, 0x78, 0xd0, 0x64, 0x76, + 0x2e, 0xc4, 0x5c, 0xe3, 0x77, 0x1d, 0xc7, 0x45, + 0x2b, 0x04, 0xb0, 0xbb, 0x4b, 0x0a, 0xe1, 0x55, + 0x37, 0xd1, 0xbd, 0x5a, 0xca, 0xaf, 0xba, 0xb5, + 0x95, 0x5f, 0x75, 0x6b, 0x2a, 0xbe, 0xea, 0xd6, + 0x55, 0x7d, 0xd5, 0xac, 0xaa, 0xfb, 0xab, 0x59, + 0x55, 0xf7, 0x56, 0xb2, 0xab, 0xee, 0xad, 0x65, + 0x57, 0xdd, 0x5a, 0xca, 0xaf, 0xba, 0xb5, 0x95, + 0x5f, 0x75, 0x6b, 0x2a, 0xbe, 0xea, 0xd6, 0x55, + 0x7d, 0xd5, 0xac, 0xaa, 0xfb, 0xab, 0x59, 0x55, + 0xf7, 0x56, 0xb2, 0xab, 0xee, 0xad, 0x65, 0x57, + 0xdd, 0x5a, 0xca, 0xaf, 0xba, 0xb5, 0x95, 0x5f, + 0x75, 0x6b, 0x2a, 0xbe, 0xea, 0xc5, 0x86, 0x69, + 0xed, 0xf5, 0x64, 0x20, 0x0e, 0xc5, 0x88, 0xfa, + 0x80, 0x1c, 0x5b, 0x90, 0x7b, 0x4c, 0xef, 0x52, + 0x7b, 0xc7, 0x77, 0xee, 0xef, 0x77, 0xcb, 0x40, + 0x5a, 0x02, 0xd0, 0x16, 0x80, 0xb4, 0x05, 0xa0, + 0x2d, 0x01, 0x68, 0x0b, 0x40, 0x5a, 0x02, 0xd0, + 0x16, 0x80, 0xb4, 0x05, 0xa0, 0x2d, 0x01, 0x68, + 0x0b, 0x40, 0x5a, 0x02, 0xd0, 0x16, 0x80, 0xb4, + 0x05, 0xa0, 0x2d, 0x01, 0x13, 0xff, 0x00, 0x71, + 0x83, 0xda, 0x67, 0x7a, 0x93, 0xde, 0x3b, 0xbf, + 0x73, 0x00, 0xf8, 0xa6, 0xba, 0x7b, 0x97, 0x3b, + 0x38, 0x8c, 0x72, 0x2d, 0x98, 0x74, 0xca, 0xd9, + 0x47, 0x4c, 0xad, 0x94, 0x74, 0xca, 0xd9, 0x47, + 0x4c, 0xad, 0x94, 0x74, 0xca, 0xd9, 0x47, 0x4c, + 0xad, 0x94, 0x74, 0xca, 0xd9, 0x47, 0x4c, 0xad, + 0x94, 0x74, 0xca, 0xd9, 0x47, 0x4c, 0xad, 0x94, + 0x74, 0xca, 0xd9, 0x47, 0x4c, 0xad, 0x94, 0x74, + 0xca, 0xd9, 0x47, 0x4c, 0xad, 0x94, 0x74, 0xca, + 0xd9, 0x47, 0x4c, 0xad, 0x94, 0x74, 0xca, 0xd9, + 0x47, 0x4c, 0xad, 0x94, 0x74, 0xca, 0xd9, 0x47, + 0x4c, 0xad, 0x94, 0x74, 0xca, 0xc3, 0x1f, 0x92, + 0x97, 0x89, 0xa4, 0xdc, 0x1d, 0xc6, 0xb0, 0x69, + 0x2b, 0x0c, 0x51, 0xb6, 0x5b, 0x7d, 0x77, 0xe7, + 0xba, 0xd4, 0x41, 0xd0, 0x5a, 0x88, 0x3a, 0x0b, + 0x51, 0x07, 0x41, 0x6a, 0x20, 0xe8, 0x2d, 0x44, + 0x1d, 0x05, 0xa8, 0x83, 0xa0, 0xb5, 0x10, 0x74, + 0x16, 0xa2, 0x0e, 0x82, 0xd4, 0x41, 0xd0, 0x5a, + 0x88, 0x3a, 0x0b, 0x51, 0x07, 0x41, 0x6a, 0x20, + 0xe8, 0x2d, 0x44, 0x1d, 0x05, 0xa8, 0x83, 0xa0, + 0xb5, 0x10, 0x74, 0x16, 0xa2, 0x0e, 0x82, 0xd4, + 0x41, 0xd0, 0x5a, 0x88, 0x3a, 0x0b, 0x51, 0x07, + 0x41, 0x6a, 0x20, 0xe8, 0x2d, 0xf5, 0x3c, 0x44, + 0x7a, 0x05, 0x93, 0x66, 0x88, 0xde, 0x37, 0x66, + 0xb1, 0xfa, 0xa7, 0x93, 0x70, 0x07, 0xb7, 0x2b, + 0x37, 0x18, 0xe2, 0x6a, 0xd9, 0xe2, 0x5b, 0x3c, + 0x4b, 0x67, 0x89, 0x6c, 0xf1, 0x2d, 0x9e, 0x25, + 0xb3, 0xc4, 0xb6, 0x78, 0x96, 0xcf, 0x12, 0xd9, + 0xe2, 0x5b, 0x3c, 0x4b, 0x67, 0x89, 0x6c, 0xf1, + 0x2d, 0x9e, 0x25, 0xb3, 0xc4, 0xb6, 0x78, 0x96, + 0xcf, 0x12, 0xd9, 0xe2, 0x5b, 0x3c, 0x4b, 0x67, + 0x89, 0x6c, 0xf1, 0x2d, 0x9e, 0x25, 0x83, 0x0e, + 0x42, 0x43, 0xc1, 0x23, 0x41, 0x45, 0xa7, 0x31, + 0x0a, 0x0f, 0x69, 0x9d, 0xe9, 0xfe, 0xf1, 0xdd, + 0xfb, 0x8e, 0x53, 0x36, 0xfc, 0x1b, 0x0e, 0xcd, + 0xc7, 0xd9, 0xe2, 0x36, 0x30, 0x62, 0x7b, 0xdd, + 0xa0, 0x04, 0x6a, 0x20, 0xa9, 0x6d, 0x4c, 0x4d, + 0x36, 0x76, 0x1c, 0xd8, 0x56, 0x57, 0x26, 0xfc, + 0x97, 0xdb, 0xc3, 0x99, 0x0b, 0x43, 0x21, 0xb8, + 0xc5, 0xc1, 0x3a, 0x39, 0x54, 0x95, 0x2d, 0x6b, + 0xb0, 0x37, 0xd1, 0xa5, 0x13, 0x24, 0x4f, 0x60, + 0x19, 0xb7, 0xcd, 0xb2, 0x0f, 0x74, 0x6f, 0x6b, + 0x0e, 0x87, 0x16, 0xe6, 0x46, 0x26, 0x38, 0x91, + 0x60, 0x77, 0xca, 0x9d, 0xd2, 0xd7, 0xb6, 0x27, + 0x4c, 0xd0, 0xe0, 0xd2, 0xc4, 0xea, 0x6c, 0x26, + 0x49, 0x07, 0xd8, 0x17, 0xba, 0x73, 0x32, 0x6f, + 0xc6, 0xd1, 0x77, 0x37, 0x0e, 0x70, 0x8e, 0x28, + 0x6a, 0x04, 0xf8, 0xc3, 0x46, 0xf3, 0x7b, 0xff, + 0x00, 0xd4, 0x5c, 0xe8, 0xa4, 0x6b, 0x41, 0xb1, + 0x25, 0xba, 0x15, 0x31, 0x85, 0xb2, 0x4a, 0x64, + 0x88, 0x48, 0xeb, 0x0b, 0xd9, 0x5a, 0x26, 0x3a, + 0x43, 0xc8, 0xd1, 0x74, 0xec, 0x31, 0xbd, 0xd8, + 0x78, 0x56, 0x1a, 0x13, 0xed, 0x0c, 0x87, 0x07, + 0x0a, 0xcd, 0x39, 0x93, 0xea, 0xae, 0x71, 0xb6, + 0x5c, 0x16, 0xe2, 0x41, 0xd2, 0x46, 0xf6, 0x34, + 0xe8, 0x2e, 0x6d, 0xb7, 0x18, 0x41, 0xce, 0x1c, + 0x14, 0xbe, 0xd2, 0x94, 0xf2, 0x44, 0xee, 0xed, + 0xc0, 0xd6, 0xe7, 0x71, 0xcc, 0x02, 0x10, 0x3a, + 0xba, 0x26, 0xd5, 0x9f, 0xee, 0xbf, 0x34, 0xf8, + 0x9b, 0x1b, 0xdf, 0x23, 0x73, 0x16, 0xb4, 0x5d, + 0x3e, 0xd1, 0xbc, 0xe0, 0xe1, 0x6f, 0x74, 0x27, + 0x37, 0x23, 0x26, 0x26, 0x8b, 0x91, 0x84, 0xe6, + 0x58, 0x99, 0x1b, 0xde, 0xdb, 0xe1, 0xbb, 0x5b, + 0x7c, 0xfc, 0x89, 0xe7, 0x24, 0xfb, 0x33, 0x84, + 0x70, 0xf0, 0x7d, 0x68, 0xc8, 0x22, 0x79, 0x8c, + 0x7d, 0x70, 0xdc, 0xca, 0x3a, 0x7c, 0x78, 0x31, + 0xf1, 0xda, 0xfc, 0x4a, 0x63, 0x4d, 0x5a, 0xda, + 0x87, 0xc4, 0x31, 0x39, 0x98, 0x6c, 0x6c, 0x8c, + 0x82, 0x37, 0x98, 0xc6, 0x97, 0x86, 0xe6, 0x41, + 0xe2, 0x27, 0x96, 0x10, 0x4e, 0x20, 0xdc, 0xd9, + 0xb4, 0xa7, 0x08, 0x21, 0xa8, 0xc0, 0xd0, 0x2f, + 0x94, 0x66, 0x70, 0xa2, 0xa6, 0x9d, 0xaf, 0x8b, + 0x1f, 0xa2, 0xc7, 0x42, 0xc4, 0x58, 0xf1, 0x1d, + 0xec, 0xd7, 0x11, 0x98, 0xac, 0xa9, 0x8d, 0xe2, + 0x2f, 0xb7, 0x87, 0x32, 0xc6, 0x62, 0x78, 0x65, + 0xb1, 0x62, 0xc3, 0x9a, 0xdc, 0xa8, 0x3a, 0x48, + 0xde, 0xc6, 0xbb, 0x41, 0x73, 0x6d, 0x75, 0xe2, + 0xf0, 0x09, 0x25, 0xde, 0x83, 0x6d, 0x25, 0x16, + 0xbc, 0x16, 0x38, 0x71, 0x1d, 0xca, 0xaf, 0x43, + 0xda, 0x99, 0xed, 0x05, 0x54, 0x2f, 0xa2, 0x57, + 0x0e, 0xdf, 0xd4, 0x39, 0x99, 0x4c, 0x93, 0x5a, + 0x2e, 0x5d, 0x6b, 0xa9, 0xa1, 0x0d, 0x73, 0xdd, + 0x15, 0xf1, 0x61, 0x1c, 0x9c, 0x69, 0xb9, 0x46, + 0x39, 0x98, 0xb4, 0x62, 0x16, 0xba, 0x0e, 0x92, + 0x37, 0xb1, 0xa7, 0x41, 0x73, 0x6d, 0x75, 0x90, + 0x8b, 0x13, 0xf3, 0x0b, 0x5f, 0x39, 0x41, 0x8f, + 0x8d, 0xec, 0x71, 0xd0, 0xd7, 0x36, 0xc5, 0x38, + 0xbe, 0x19, 0x1a, 0x1b, 0xc2, 0xbb, 0x4e, 0x6f, + 0xd4, 0x5c, 0x1c, 0xea, 0x5f, 0x5a, 0x83, 0xda, + 0x67, 0x7a, 0x7f, 0xbc, 0x77, 0x7e, 0xe3, 0x95, + 0x57, 0xac, 0x77, 0x6e, 0x78, 0x52, 0x06, 0x67, + 0x99, 0xc1, 0xae, 0x03, 0x8c, 0x80, 0x9f, 0x33, + 0x81, 0x64, 0x0d, 0x70, 0x0e, 0xc5, 0x99, 0x78, + 0xbd, 0xcf, 0x88, 0xe4, 0xed, 0x93, 0xfa, 0x98, + 0x70, 0xfe, 0x2b, 0xc0, 0x91, 0xc5, 0x21, 0x6c, + 0x45, 0x8d, 0xc4, 0x07, 0xd6, 0xf5, 0xaf, 0x0a, + 0x35, 0x8f, 0x73, 0x40, 0xab, 0x20, 0x58, 0xe8, + 0x17, 0xd0, 0xa9, 0x60, 0x7b, 0xbf, 0x46, 0xc4, + 0xc2, 0x59, 0xc4, 0x4a, 0xf0, 0xcc, 0x55, 0x0e, + 0x71, 0xa6, 0x11, 0xbe, 0xcd, 0x76, 0x86, 0xfd, + 0x94, 0x6d, 0xf6, 0x1b, 0xdc, 0xbc, 0x18, 0x6b, + 0x19, 0x3b, 0xde, 0x20, 0x6d, 0x84, 0x76, 0xb7, + 0xc5, 0x78, 0x5a, 0xad, 0xf9, 0x48, 0x89, 0xc0, + 0x3c, 0x8f, 0x0d, 0xad, 0xf4, 0x2c, 0xab, 0x59, + 0x30, 0x2d, 0xa2, 0x23, 0x15, 0x43, 0x73, 0xbf, + 0x90, 0xfa, 0x53, 0x5f, 0x2b, 0xcc, 0x92, 0x1a, + 0xe8, 0xee, 0xe3, 0xf0, 0x5e, 0x19, 0x8e, 0x67, + 0x38, 0xd3, 0xe4, 0x5d, 0x66, 0x9d, 0x03, 0x91, + 0x78, 0x0e, 0x36, 0x3c, 0xb5, 0x8e, 0x8d, 0xb8, + 0xc0, 0xfa, 0xca, 0xb4, 0xe3, 0x9e, 0x2f, 0xd3, + 0x5c, 0x0b, 0xa9, 0xad, 0x8b, 0xd1, 0xf0, 0x5e, + 0x18, 0x9e, 0x26, 0x49, 0x03, 0xf2, 0x71, 0xe6, + 0x91, 0xb6, 0x37, 0xe5, 0x5e, 0x0e, 0x33, 0x55, + 0x4c, 0x4c, 0xcf, 0x2f, 0x0c, 0x8d, 0xba, 0x79, + 0x71, 0x1e, 0x35, 0x57, 0x82, 0x3c, 0xa6, 0x1f, + 0x08, 0xdc, 0x46, 0x38, 0xfd, 0x0a, 0xb6, 0x48, + 0x2a, 0xa7, 0x00, 0x10, 0xe9, 0x69, 0xaa, 0x07, + 0x07, 0x3f, 0x17, 0x26, 0xe3, 0x3d, 0x6a, 0x5f, + 0x5a, 0x9f, 0xdd, 0x3f, 0xbb, 0x72, 0x95, 0xef, + 0xe0, 0x89, 0x05, 0xd4, 0xcd, 0x6b, 0x5d, 0x89, + 0xf2, 0x62, 0x6b, 0xb8, 0xac, 0xa6, 0xc8, 0xb8, + 0xb2, 0x7f, 0x19, 0xc3, 0x23, 0xd8, 0x73, 0xda, + 0xdc, 0xaa, 0xa6, 0x5b, 0xe1, 0xaa, 0x34, 0x91, + 0x17, 0x9e, 0x3c, 0x59, 0xf3, 0xaf, 0x03, 0x79, + 0x43, 0xbf, 0x8b, 0xca, 0x7e, 0xfe, 0x6e, 0x35, + 0x59, 0x91, 0x71, 0x8d, 0xde, 0x37, 0x98, 0xb7, + 0x48, 0x53, 0xc4, 0x5d, 0xe4, 0x5d, 0x4a, 0x6e, + 0xce, 0x22, 0x6d, 0xa5, 0x52, 0x40, 0xd9, 0xaa, + 0x28, 0x2a, 0x9b, 0x16, 0x06, 0xb0, 0xb6, 0xf1, + 0xbf, 0xd3, 0x65, 0x4f, 0x7e, 0x22, 0xee, 0xe2, + 0xaa, 0xfc, 0x52, 0x29, 0xbc, 0x62, 0x50, 0x63, + 0x2e, 0x94, 0x8b, 0x0e, 0x55, 0xe0, 0xe0, 0x3c, + 0x69, 0xe3, 0x20, 0x2d, 0x0c, 0x20, 0x16, 0x3f, + 0x96, 0xea, 0x95, 0x90, 0xb9, 0xd1, 0x87, 0xbe, + 0x40, 0x79, 0x6d, 0x73, 0x99, 0x78, 0x59, 0xd1, + 0x5c, 0x3f, 0x21, 0x1d, 0x88, 0xf8, 0xaf, 0x01, + 0x49, 0x31, 0x26, 0x6f, 0x29, 0x9c, 0xe9, 0x23, + 0x89, 0x78, 0x4d, 0xb3, 0xbc, 0xb9, 0xad, 0x95, + 0x98, 0x7f, 0x74, 0x62, 0xe2, 0x55, 0x51, 0x5a, + 0xae, 0x40, 0x60, 0xc3, 0x92, 0x63, 0x41, 0x8c, + 0x0b, 0x69, 0x5e, 0x07, 0xa6, 0x8a, 0x4c, 0x98, + 0x74, 0x6c, 0xbf, 0x21, 0xf5, 0xf2, 0xaf, 0x09, + 0x83, 0x34, 0xd3, 0xb9, 0xb2, 0x37, 0x7d, 0x20, + 0xb0, 0x06, 0xff, 0x00, 0x55, 0x56, 0xe5, 0x04, + 0xcd, 0x8a, 0x48, 0xe3, 0x06, 0x78, 0x34, 0xb1, + 0x42, 0xf7, 0x54, 0x1a, 0x96, 0x3a, 0x31, 0x81, + 0xe4, 0x58, 0xdb, 0xd3, 0xb9, 0x59, 0xed, 0xb3, + 0xe6, 0xa3, 0xf6, 0x82, 0xac, 0xf7, 0xcf, 0xef, + 0xfd, 0x44, 0xa6, 0x5a, 0x9f, 0x15, 0x35, 0x12, + 0x00, 0x1f, 0x87, 0x16, 0x66, 0xa9, 0xaa, 0xe3, + 0x21, 0xec, 0x9a, 0x90, 0xbc, 0x1b, 0x66, 0x27, + 0x32, 0xa3, 0xc7, 0x2e, 0x29, 0xc5, 0x65, 0x83, + 0xe4, 0xcf, 0xc4, 0xbc, 0x26, 0x0c, 0xd3, 0x4e, + 0xe6, 0xc8, 0xdd, 0xf4, 0x82, 0xc0, 0x1b, 0xfd, + 0x55, 0x5b, 0x23, 0x75, 0xcd, 0xa4, 0xf2, 0x7e, + 0xbb, 0x2a, 0x57, 0xd5, 0xb8, 0xc9, 0x23, 0x6a, + 0x1d, 0x93, 0x73, 0xf4, 0xf0, 0x57, 0x84, 0x7c, + 0x65, 0xce, 0x73, 0xb2, 0xad, 0xb1, 0x77, 0xaf, + 0x47, 0xea, 0x65, 0x50, 0x7b, 0x4c, 0xef, 0x4f, + 0xf7, 0x8e, 0xef, 0xdc, 0x72, 0x7c, 0x9c, 0x4f, + 0xb3, 0x87, 0x36, 0xe0, 0x7c, 0x4e, 0x2c, 0x78, + 0xe3, 0x08, 0x09, 0xa4, 0x2f, 0x03, 0x89, 0x64, + 0x32, 0xce, 0xc9, 0xda, 0xd6, 0x50, 0xbb, 0x16, + 0x78, 0x45, 0x99, 0x9b, 0x42, 0x9b, 0x0c, 0x84, + 0x65, 0xb3, 0xbf, 0x36, 0x95, 0x94, 0x94, 0xe2, + 0x7f, 0x2a, 0xc9, 0x49, 0x33, 0x9c, 0xce, 0x45, + 0x94, 0x94, 0xe2, 0x7e, 0x8b, 0xd9, 0x46, 0x24, + 0x38, 0x84, 0x6d, 0xc2, 0xdc, 0xda, 0x02, 0xc7, + 0x0b, 0xcb, 0x1c, 0x9f, 0x2e, 0x50, 0x99, 0x1c, + 0xdc, 0x24, 0x9e, 0x45, 0x1c, 0x65, 0xd6, 0x83, + 0x2a, 0x24, 0x22, 0xca, 0x68, 0xd9, 0x29, 0x34, + 0xee, 0x75, 0xec, 0xa1, 0x76, 0x2c, 0xf0, 0x8b, + 0x33, 0x36, 0x85, 0x23, 0xe3, 0x94, 0xb5, 0xd2, + 0x1b, 0xbb, 0x36, 0x95, 0x36, 0xfc, 0x9c, 0xb7, + 0x0e, 0xfc, 0x68, 0x42, 0xd9, 0x5c, 0xd8, 0xc7, + 0x12, 0x21, 0xd2, 0x1c, 0xee, 0xc7, 0xa3, 0x8d, + 0x64, 0xe5, 0x94, 0xb9, 0x9c, 0x9b, 0x91, 0xb4, + 0x0c, 0xe4, 0xa9, 0x48, 0xd1, 0x74, 0x59, 0xf6, + 0xda, 0x5a, 0x88, 0x22, 0xc4, 0x6e, 0x64, 0xc4, + 0xee, 0xc3, 0xa3, 0xfa, 0x28, 0x98, 0x5e, 0x59, + 0x7d, 0x2a, 0x6b, 0xc8, 0x4e, 0x57, 0x87, 0x7e, + 0x35, 0x0b, 0xb1, 0xe7, 0x84, 0x59, 0x99, 0xb4, + 0x27, 0x45, 0x8b, 0x78, 0xe7, 0x63, 0x22, 0xdc, + 0x68, 0xcb, 0x8f, 0xca, 0x16, 0xe0, 0xbd, 0x86, + 0x85, 0x92, 0x6c, 0xce, 0x0c, 0xd0, 0x84, 0xb1, + 0x9c, 0x2f, 0x1a, 0x0a, 0x24, 0xe9, 0x2b, 0x22, + 0xc9, 0x5c, 0x23, 0xe4, 0x4c, 0x84, 0x9f, 0x26, + 0xce, 0x08, 0xb2, 0xaa, 0x74, 0x92, 0x1c, 0xbb, + 0xc3, 0x70, 0x9b, 0x72, 0x26, 0xce, 0x64, 0x26, + 0x56, 0xe8, 0x36, 0xd0, 0xa5, 0x8e, 0xfb, 0xc9, + 0x73, 0xb8, 0x5b, 0x4a, 0xc8, 0x99, 0x5d, 0x93, + 0xd1, 0x65, 0x11, 0x2e, 0xcf, 0x10, 0xb3, 0x3d, + 0x09, 0xd7, 0x98, 0x9c, 0x43, 0x09, 0xcd, 0xc4, + 0x8c, 0xa2, 0x53, 0x8c, 0x8b, 0x1c, 0xc1, 0x63, + 0x95, 0xc5, 0xee, 0xf4, 0xee, 0x3f, 0x16, 0x6c, + 0xab, 0xc5, 0x87, 0xa9, 0x30, 0x9d, 0x00, 0xa9, + 0x89, 0x1c, 0x27, 0x17, 0x0f, 0x8a, 0xd0, 0xb4, + 0x2d, 0x0b, 0x42, 0xd0, 0xb4, 0x2d, 0x0a, 0x38, + 0xdc, 0x6e, 0xc8, 0xf8, 0x22, 0xda, 0x13, 0x58, + 0xd7, 0xd9, 0xad, 0x69, 0x68, 0xcc, 0x34, 0x1d, + 0x29, 0xb1, 0xb5, 0xd6, 0x63, 0x5f, 0x94, 0x1e, + 0xb4, 0xeb, 0xcc, 0x4e, 0x26, 0xe1, 0x39, 0xb8, + 0x90, 0x9f, 0x28, 0x72, 0xa3, 0xeb, 0x0c, 0xca, + 0x29, 0x2a, 0x25, 0x79, 0x0c, 0x3a, 0x5b, 0x9a, + 0xca, 0x48, 0xb2, 0xee, 0xa9, 0x74, 0x84, 0x67, + 0x2d, 0xb6, 0x10, 0x16, 0x85, 0xa1, 0x68, 0x5a, + 0x16, 0x85, 0xa1, 0x68, 0x4d, 0x63, 0x46, 0x72, + 0xa5, 0x23, 0x45, 0xd4, 0x1e, 0xd3, 0x3b, 0xd3, + 0xfd, 0xe3, 0xbb, 0xf7, 0x1c, 0xa9, 0x19, 0x24, + 0x22, 0x68, 0xdd, 0x1d, 0xf4, 0xd8, 0x85, 0xb3, + 0x4d, 0xd2, 0x0b, 0x66, 0x9b, 0xa4, 0x16, 0xcd, + 0x37, 0x48, 0x2d, 0x9a, 0x6e, 0x90, 0x5b, 0x34, + 0xdd, 0x20, 0xb6, 0x69, 0xba, 0x41, 0x6c, 0xd3, + 0x74, 0x82, 0xd9, 0xa6, 0xe9, 0x05, 0xb3, 0x4d, + 0xd2, 0x0b, 0x66, 0x9b, 0xa4, 0x16, 0xcd, 0x37, + 0x48, 0x2d, 0x9a, 0x6e, 0x90, 0x5b, 0x34, 0xdd, + 0x20, 0xb6, 0x69, 0xba, 0x41, 0x6c, 0xd3, 0x74, + 0x82, 0xd9, 0xa6, 0xe9, 0x05, 0xb3, 0x4d, 0xd2, + 0x0b, 0x66, 0x9b, 0xa4, 0x16, 0xcd, 0x37, 0x48, + 0x2d, 0x9a, 0x6e, 0x90, 0x5b, 0x34, 0xdd, 0x20, + 0xaa, 0x25, 0x82, 0x2c, 0x89, 0x6b, 0x83, 0x31, + 0x13, 0x73, 0xbb, 0x93, 0x7d, 0x33, 0x27, 0x18, + 0x1a, 0x6f, 0x7b, 0x15, 0xe6, 0xf6, 0xf5, 0xa5, + 0x79, 0xbd, 0xbd, 0x69, 0x5e, 0x6f, 0x6f, 0x5a, + 0x57, 0x9b, 0xdb, 0xd6, 0x95, 0xe6, 0xf6, 0xf5, + 0xa5, 0x79, 0xbd, 0xbd, 0x69, 0x5e, 0x6f, 0x6f, + 0x5a, 0x57, 0x9b, 0xdb, 0xd6, 0x95, 0xe6, 0xf6, + 0xf5, 0xa5, 0x79, 0xbd, 0xbd, 0x69, 0x5e, 0x6f, + 0x6f, 0x5a, 0x57, 0x9b, 0xdb, 0xd6, 0x95, 0xe6, + 0xf6, 0xf5, 0xa5, 0x79, 0xbd, 0xbd, 0x69, 0x5e, + 0x6f, 0x6f, 0x5a, 0x57, 0x9b, 0xdb, 0xd6, 0x95, + 0xe6, 0xf6, 0xf5, 0xa5, 0x79, 0xbd, 0xbd, 0x69, + 0x5e, 0x6f, 0x6f, 0x5a, 0x57, 0x9b, 0xdb, 0xd6, + 0x95, 0xbc, 0xa1, 0x8d, 0xae, 0xe5, 0x73, 0xc9, + 0x51, 0x93, 0xfe, 0x1b, 0x73, 0x6e, 0x52, 0x35, + 0xf0, 0x36, 0x76, 0x3a, 0x3e, 0x33, 0x62, 0x3e, + 0x2b, 0xcd, 0xff, 0x00, 0xce, 0xfc, 0x97, 0x9b, + 0xff, 0x00, 0x9d, 0xf9, 0x2f, 0x37, 0xff, 0x00, + 0x3b, 0xf2, 0x5e, 0x6f, 0xfe, 0x77, 0xe4, 0xbc, + 0xdf, 0xfc, 0xef, 0xc9, 0x79, 0xbf, 0xf9, 0xdf, + 0x92, 0xf3, 0x7f, 0xf3, 0xbf, 0x25, 0xe6, 0xff, + 0x00, 0xe7, 0x7e, 0x4b, 0xcd, 0xff, 0x00, 0xce, + 0xfc, 0x97, 0x9b, 0xff, 0x00, 0x9d, 0xf9, 0x2f, + 0x37, 0xff, 0x00, 0x3b, 0xf2, 0x5e, 0x6f, 0xfe, + 0x77, 0xe4, 0xbc, 0xdf, 0xfc, 0xef, 0xc9, 0x79, + 0xbf, 0xf9, 0xdf, 0x92, 0xf3, 0x7f, 0xf3, 0xbf, + 0x25, 0xe6, 0xff, 0x00, 0xe7, 0x7e, 0x4b, 0xcd, + 0xff, 0x00, 0xce, 0xfc, 0x97, 0x9b, 0xff, 0x00, + 0x9d, 0xf9, 0x2f, 0x37, 0xff, 0x00, 0x3b, 0xf2, + 0x5e, 0x6f, 0xfe, 0x77, 0xe4, 0xbc, 0xdf, 0xfc, + 0xef, 0xc9, 0x54, 0x4b, 0x14, 0x22, 0x9c, 0xb5, + 0xc1, 0xba, 0x6e, 0x79, 0xf7, 0x20, 0xf6, 0x99, + 0xde, 0x9f, 0xef, 0x1d, 0xdf, 0xb8, 0xe5, 0x43, + 0xee, 0xfe, 0x7f, 0x4e, 0x56, 0xc5, 0x8f, 0x29, + 0x14, 0x82, 0x22, 0x64, 0x22, 0xcf, 0xbf, 0x27, + 0x22, 0xc4, 0xf6, 0x16, 0x8c, 0x58, 0x33, 0xf2, + 0xa7, 0x55, 0x02, 0x72, 0x8d, 0x92, 0xd6, 0xe2, + 0xc3, 0x9b, 0xe6, 0x42, 0x82, 0x67, 0xbd, 0xcd, + 0x18, 0x1d, 0x24, 0xb6, 0xf8, 0x58, 0x0e, 0x90, + 0x4d, 0x7d, 0x3b, 0x9e, 0x0d, 0xec, 0x63, 0x93, + 0x39, 0xf5, 0xdd, 0x52, 0x99, 0x84, 0xe5, 0xf3, + 0x03, 0x9d, 0x8e, 0x16, 0x1b, 0xe2, 0x34, 0x59, + 0x53, 0xc6, 0x1c, 0x49, 0x74, 0xee, 0x81, 0xe7, + 0xd2, 0x0f, 0xe0, 0x54, 0xf1, 0xb9, 0xcf, 0xc9, + 0x36, 0x46, 0x31, 0x84, 0x69, 0x38, 0x9d, 0x9b, + 0xb2, 0xe9, 0xf4, 0xce, 0x73, 0xb2, 0x03, 0x3e, + 0x21, 0xa6, 0xc7, 0x83, 0xde, 0x3e, 0x9d, 0x57, + 0xbc, 0x6e, 0xef, 0xf0, 0xdb, 0xf4, 0xe0, 0x12, + 0x02, 0x63, 0x2f, 0x18, 0x80, 0xe4, 0x50, 0x89, + 0xf2, 0x30, 0x48, 0xe9, 0x1c, 0xdc, 0x70, 0x81, + 0x86, 0xdc, 0x57, 0xb7, 0xa7, 0xe2, 0x84, 0x6f, + 0x3e, 0x5a, 0xdb, 0xf6, 0xfd, 0x95, 0x44, 0xdc, + 0x0d, 0xc2, 0xe6, 0xc3, 0x71, 0x6d, 0x37, 0x02, + 0xea, 0xa6, 0x59, 0x98, 0xd3, 0x10, 0x7e, 0x4a, + 0xc4, 0x68, 0xb9, 0xfc, 0x01, 0x55, 0xcd, 0x65, + 0x3b, 0x67, 0xa8, 0x8e, 0x46, 0xb6, 0xc6, 0x2c, + 0x76, 0xe1, 0x5d, 0x52, 0x47, 0x25, 0x34, 0x0d, + 0x92, 0x46, 0x93, 0x2c, 0x66, 0x11, 0x9b, 0x4d, + 0xbd, 0x4b, 0x11, 0x6b, 0x1b, 0xe8, 0x8d, 0xa1, + 0xa3, 0xb3, 0xf5, 0x11, 0x7b, 0xb6, 0xf7, 0x6e, + 0x51, 0xe4, 0xd9, 0x8b, 0x0c, 0x25, 0xc7, 0xd0, + 0x16, 0x28, 0xd9, 0x88, 0x68, 0xd2, 0x05, 0xfd, + 0x5c, 0xaa, 0xca, 0x48, 0x9d, 0x6c, 0x4c, 0x71, + 0x69, 0xb2, 0x11, 0xc4, 0xcc, 0x6f, 0x3c, 0x5b, + 0x85, 0xee, 0x66, 0x61, 0xa4, 0x62, 0x17, 0x6f, + 0xac, 0x71, 0x26, 0x3d, 0xd6, 0xc2, 0xed, 0x04, + 0x7a, 0x81, 0xf9, 0x85, 0x85, 0xe2, 0xce, 0xb0, + 0x2a, 0x26, 0x18, 0x88, 0x7c, 0x83, 0x13, 0x47, + 0xa1, 0x61, 0x90, 0x58, 0x91, 0x71, 0x63, 0x70, + 0x56, 0x07, 0x11, 0x7b, 0x03, 0x9b, 0xd2, 0x2e, + 0xaf, 0xc2, 0x66, 0x22, 0xd0, 0xf1, 0xa0, 0xd9, + 0x65, 0x83, 0x37, 0x96, 0xbe, 0x91, 0x7b, 0x72, + 0xd9, 0x4b, 0x2b, 0x5b, 0x78, 0xe3, 0xb6, 0x23, + 0xc9, 0x7d, 0x0a, 0x27, 0x36, 0x3b, 0x89, 0x49, + 0x0c, 0xf4, 0xdb, 0x4a, 0x63, 0x30, 0xb4, 0x97, + 0xde, 0xc4, 0x3d, 0xb6, 0xcd, 0xa7, 0x3d, 0xec, + 0x99, 0x76, 0xdf, 0x19, 0xb3, 0x4b, 0x1c, 0x1c, + 0x09, 0xf8, 0x2c, 0x6f, 0x68, 0xc3, 0x7b, 0x5d, + 0xae, 0x0e, 0xb1, 0xf8, 0x29, 0x65, 0x6b, 0x6e, + 0xc8, 0xed, 0x88, 0xf2, 0x26, 0x3d, 0x8c, 0x04, + 0x3f, 0x82, 0x31, 0x8c, 0x47, 0xe1, 0xa5, 0x38, + 0xb1, 0xb9, 0x9b, 0x98, 0x97, 0x10, 0xd1, 0xda, + 0xab, 0x23, 0x91, 0xa5, 0xaf, 0x12, 0xb6, 0xe0, + 0xee, 0x41, 0xed, 0x33, 0xbd, 0x3f, 0xde, 0x3b, + 0xbf, 0x71, 0xca, 0x87, 0xdd, 0xfc, 0xfe, 0x90, + 0xc5, 0xa3, 0x8d, 0x4c, 0x26, 0x9d, 0xb2, 0xc0, + 0x64, 0x19, 0x06, 0xc6, 0x41, 0x2c, 0x6f, 0xab, + 0x8b, 0x32, 0x61, 0xc2, 0x58, 0xf6, 0x6f, 0x46, + 0x7b, 0x8c, 0x3c, 0x5f, 0x15, 0x14, 0x32, 0x48, + 0xd6, 0xb6, 0x49, 0x24, 0x63, 0xae, 0x74, 0x02, + 0xd6, 0xd8, 0xf3, 0xf7, 0x27, 0xc4, 0x64, 0x6c, + 0x6d, 0x98, 0xc8, 0x1b, 0x7f, 0xab, 0x9d, 0x98, + 0x6f, 0xcc, 0x85, 0xe6, 0x64, 0x93, 0x13, 0xc1, + 0x8c, 0xe2, 0x00, 0x7a, 0xd5, 0x13, 0x62, 0xc9, + 0x17, 0x86, 0xba, 0xe4, 0xb1, 0xae, 0x73, 0x4e, + 0x23, 0xcc, 0xaa, 0x8c, 0x8f, 0x19, 0x46, 0x79, + 0x46, 0x62, 0x39, 0xc9, 0x2d, 0x23, 0xe6, 0x39, + 0x97, 0x83, 0x5d, 0x94, 0x6e, 0x27, 0xcb, 0x19, + 0x97, 0x3f, 0x07, 0x06, 0xf4, 0x5d, 0x52, 0x3c, + 0xc8, 0xd1, 0x21, 0x91, 0xac, 0x7d, 0xce, 0x86, + 0xb4, 0xfe, 0x6d, 0xe6, 0xfa, 0x75, 0x5e, 0xf1, + 0xbb, 0xbf, 0xc3, 0x6f, 0xd3, 0x8a, 0x6b, 0x62, + 0xc0, 0xeb, 0xd9, 0x31, 0x94, 0xc1, 0xcf, 0xb3, + 0xf2, 0x97, 0x98, 0x0d, 0x36, 0xb0, 0x4c, 0xca, + 0x6f, 0x9c, 0xd1, 0x6c, 0x5c, 0x67, 0xd6, 0xa0, + 0x9e, 0x56, 0x4a, 0x6a, 0x21, 0x68, 0x01, 0xad, + 0xb6, 0x17, 0x5b, 0x42, 0x6b, 0x20, 0x92, 0x48, + 0x9e, 0x5c, 0xe7, 0xc8, 0xe6, 0x9b, 0x5c, 0xa9, + 0xed, 0x8c, 0x4b, 0x36, 0x4c, 0x93, 0xe9, 0x00, + 0xdd, 0x53, 0xd4, 0xb8, 0x3b, 0x18, 0x6d, 0xa5, + 0xf4, 0x9b, 0x5a, 0xff, 0x00, 0xa9, 0x8b, 0xdd, + 0xb7, 0xbb, 0x72, 0x8f, 0x26, 0xc7, 0xbd, 0xa2, + 0x9e, 0x4b, 0xe1, 0x1f, 0xba, 0xeb, 0x2f, 0x18, + 0xc8, 0x4b, 0x23, 0xe2, 0x7d, 0xa3, 0x8c, 0x34, + 0xe6, 0x7f, 0x29, 0x50, 0xe4, 0xb6, 0x5c, 0x9f, + 0x94, 0xbe, 0x8c, 0x58, 0xbb, 0xf4, 0x2a, 0xd8, + 0xf8, 0x65, 0xb5, 0x81, 0x91, 0x8e, 0x4b, 0xe3, + 0xfc, 0x02, 0x80, 0x31, 0x8e, 0x76, 0x19, 0x1a, + 0x5d, 0x87, 0x88, 0x62, 0x09, 0xcc, 0x91, 0xa6, + 0x37, 0x5f, 0x43, 0x85, 0x94, 0xa6, 0x78, 0x32, + 0x32, 0xbb, 0x45, 0x43, 0x1d, 0xbd, 0x94, 0xdf, + 0xb6, 0xfe, 0x84, 0x5c, 0x60, 0x64, 0xed, 0x35, + 0x32, 0x61, 0xc4, 0x48, 0xb0, 0xb3, 0x79, 0x0a, + 0x71, 0x03, 0x0e, 0xf1, 0x99, 0x87, 0xb0, 0x15, + 0x0b, 0x32, 0x72, 0xc6, 0x70, 0x38, 0x3d, 0xc5, + 0xa7, 0x36, 0xf9, 0xc7, 0xb9, 0x06, 0x54, 0x53, + 0x4f, 0x1b, 0x18, 0xcc, 0x31, 0x34, 0x9c, 0x27, + 0x4e, 0x93, 0x9b, 0xd6, 0xa5, 0xca, 0x6c, 0xd9, + 0x08, 0xb0, 0x72, 0x63, 0xde, 0x76, 0xe9, 0x52, + 0x00, 0x5c, 0x63, 0x6d, 0x64, 0xd7, 0x1c, 0x43, + 0x45, 0xbe, 0x6b, 0xc6, 0x04, 0x52, 0xca, 0x5e, + 0xc7, 0x35, 0xa4, 0x02, 0x5a, 0xc6, 0x71, 0x9e, + 0xf5, 0x3b, 0x1d, 0xc0, 0x96, 0x56, 0x46, 0x7e, + 0x2d, 0x7a, 0x82, 0x28, 0x70, 0x17, 0x42, 0xf7, + 0xc4, 0x03, 0xf4, 0x3b, 0x78, 0x31, 0x0f, 0x8e, + 0x75, 0x1b, 0xdf, 0x03, 0xe9, 0x9c, 0x5b, 0x2d, + 0xe0, 0xc5, 0xa4, 0x64, 0xce, 0x71, 0x7d, 0x0a, + 0x9e, 0x2a, 0x56, 0xe4, 0x70, 0xcb, 0x8c, 0x3a, + 0x57, 0xdf, 0x7d, 0xcc, 0x9f, 0x24, 0x94, 0xc6, + 0x8e, 0x4c, 0x43, 0x35, 0xf7, 0xb2, 0x7a, 0x82, + 0xa6, 0x8a, 0x69, 0x5c, 0xc3, 0x2d, 0xdc, 0xf0, + 0x19, 0x71, 0x67, 0x66, 0x17, 0xcf, 0xf1, 0xf8, + 0xaa, 0x20, 0xd8, 0xdc, 0x32, 0x6d, 0x73, 0x5d, + 0x27, 0xd5, 0x69, 0xca, 0x3b, 0x8d, 0x3f, 0xc5, + 0x06, 0x53, 0x0d, 0x44, 0x8e, 0x2c, 0x6e, 0x92, + 0x0d, 0xac, 0xeb, 0x2a, 0xb6, 0x3d, 0xe1, 0xee, + 0x0f, 0x66, 0x83, 0x7b, 0x66, 0xd1, 0xb9, 0x07, + 0xb4, 0xce, 0xf0, 0x9f, 0xef, 0x1d, 0xdf, 0xb8, + 0xe5, 0x44, 0x6a, 0xa1, 0x92, 0x42, 0x5a, 0x40, + 0xc0, 0xeb, 0x71, 0xad, 0x92, 0xa3, 0xac, 0x5b, + 0x25, 0x47, 0x58, 0xb6, 0x4a, 0x8e, 0xb1, 0x6c, + 0x95, 0x1d, 0x62, 0xd9, 0x2a, 0x3a, 0xc5, 0xb2, + 0x54, 0x75, 0x8b, 0x64, 0xa8, 0xeb, 0x16, 0xc9, + 0x51, 0xd6, 0x2d, 0x92, 0xa3, 0xac, 0x5b, 0x25, + 0x47, 0x58, 0xb6, 0x4a, 0x8e, 0xb1, 0x6c, 0x95, + 0x1d, 0x62, 0xd9, 0x2a, 0x3a, 0xc5, 0xb2, 0x54, + 0x75, 0x8b, 0x64, 0xa8, 0xeb, 0x16, 0xc9, 0x51, + 0xd6, 0x2d, 0x92, 0xa3, 0xac, 0x5b, 0x25, 0x47, + 0x58, 0xb6, 0x4a, 0x8e, 0xb1, 0x6c, 0x95, 0x1d, + 0x62, 0xd9, 0x2a, 0x3a, 0xc5, 0x3f, 0x8a, 0xc4, + 0xf8, 0xdb, 0x94, 0x17, 0xc6, 0xeb, 0xee, 0x88, + 0xbc, 0x56, 0x29, 0x77, 0x8d, 0x38, 0x9f, 0xa5, + 0x6c, 0x14, 0xfc, 0xcb, 0x60, 0xa7, 0xe6, 0x5b, + 0x05, 0x3f, 0x32, 0xd8, 0x29, 0xf9, 0x96, 0xc1, + 0x4f, 0xcc, 0xb6, 0x0a, 0x7e, 0x64, 0x5a, 0xff, + 0x00, 0x07, 0x42, 0xc7, 0x0e, 0x27, 0x05, 0xb0, + 0x53, 0xf3, 0x21, 0x23, 0xbc, 0x15, 0x1b, 0x63, + 0x3a, 0x1c, 0x59, 0x99, 0x17, 0x47, 0xe0, 0xa8, + 0xe4, 0x68, 0xd2, 0x5a, 0xcb, 0xd9, 0x17, 0x47, + 0xe0, 0xa8, 0xe4, 0x68, 0xd2, 0x5a, 0xcb, 0xd9, + 0x63, 0xfe, 0xce, 0x87, 0x0d, 0xed, 0x7b, 0x66, + 0x4e, 0xc3, 0xe0, 0x86, 0x3b, 0x0e, 0x9b, 0x30, + 0xe6, 0x58, 0xa2, 0xf0, 0x43, 0x25, 0x6e, 0x8b, + 0xb2, 0x32, 0x53, 0x8f, 0xf6, 0x6c, 0x36, 0x6e, + 0x67, 0x6f, 0x74, 0x2d, 0x82, 0x9f, 0x99, 0x6c, + 0x14, 0xfc, 0xcb, 0x60, 0xa7, 0xe6, 0x5b, 0x05, + 0x3f, 0x32, 0xd8, 0x29, 0xf9, 0x96, 0xc1, 0x4f, + 0xcc, 0x9a, 0xeb, 0x5a, 0xec, 0x69, 0xb6, 0xe5, + 0x19, 0x92, 0xae, 0x3a, 0x7b, 0x47, 0xa1, 0xfc, + 0x6b, 0xce, 0x94, 0xfc, 0xc5, 0x79, 0xd2, 0x9f, + 0x98, 0xa0, 0xe1, 0xe1, 0x4a, 0x7b, 0x8c, 0xfa, + 0x0a, 0xf3, 0xa4, 0x1c, 0xc5, 0x79, 0xd2, 0x9f, + 0x98, 0xaf, 0x3a, 0x53, 0xf3, 0x15, 0xe7, 0x4a, + 0x7e, 0x62, 0xbc, 0xe9, 0x4f, 0xcc, 0x57, 0x9d, + 0x29, 0xf9, 0x8a, 0xf3, 0xa5, 0x3f, 0x31, 0x5e, + 0x74, 0xa7, 0xe6, 0x2b, 0xce, 0x94, 0xfc, 0xc5, + 0x79, 0xd2, 0x9f, 0x98, 0xaf, 0x3a, 0x53, 0xf3, + 0x15, 0xe7, 0x4a, 0x7e, 0x62, 0xbc, 0xe9, 0x4f, + 0xcc, 0x57, 0x9d, 0x29, 0xf9, 0x8a, 0xf3, 0xa5, + 0x3f, 0x31, 0x5e, 0x74, 0xa7, 0xe6, 0x2b, 0xce, + 0x94, 0xfc, 0xc5, 0x79, 0xd2, 0x9f, 0x98, 0xaa, + 0x81, 0x1d, 0x4b, 0x2a, 0x2e, 0xf1, 0x9d, 0x9c, + 0x5b, 0x90, 0x7b, 0x4c, 0xef, 0x09, 0xfe, 0xf1, + 0xdd, 0xfb, 0x8e, 0x5e, 0x0f, 0xf5, 0x3f, 0xbd, + 0x17, 0x39, 0xa1, 0xe2, 0x36, 0x3e, 0x4c, 0x27, + 0x8e, 0xc2, 0xea, 0xa6, 0x3a, 0x97, 0x65, 0x30, + 0xb3, 0x28, 0xc7, 0x1f, 0xaa, 0x6e, 0x15, 0x5c, + 0x63, 0x28, 0x72, 0x53, 0x88, 0x9b, 0x6c, 0xe4, + 0x8b, 0x91, 0xf2, 0x54, 0xc1, 0x85, 0xd1, 0x89, + 0x64, 0x31, 0x90, 0xe7, 0xb5, 0xf6, 0xd1, 0x9f, + 0x37, 0x72, 0x6b, 0x5a, 0x65, 0x64, 0x59, 0x49, + 0x1c, 0x6f, 0x62, 0x73, 0x32, 0xe8, 0xb9, 0xa2, + 0x56, 0x17, 0x35, 0xee, 0x69, 0x7b, 0xdb, 0xc5, + 0x7e, 0x2d, 0x27, 0x46, 0x95, 0x23, 0xa3, 0x6b, + 0xa3, 0xc9, 0xd3, 0x47, 0x26, 0x91, 0x9c, 0x9c, + 0x3e, 0x8f, 0x4a, 0x74, 0xce, 0x32, 0x13, 0x86, + 0x3b, 0x00, 0x46, 0x97, 0x34, 0x9f, 0x92, 0x71, + 0xc9, 0xcf, 0x8d, 0x91, 0x89, 0x32, 0xa4, 0x79, + 0x33, 0xe8, 0x43, 0x27, 0x58, 0x28, 0xfc, 0xbb, + 0xb3, 0x92, 0x73, 0xef, 0x5b, 0xc8, 0x15, 0x4d, + 0x4d, 0x4c, 0xaf, 0xa8, 0x73, 0x64, 0x63, 0x71, + 0x46, 0xee, 0x15, 0xc1, 0xe5, 0x1e, 0x84, 0x44, + 0xef, 0x92, 0xce, 0x91, 0xcc, 0x63, 0x9b, 0xc4, + 0x05, 0xb3, 0x9e, 0x75, 0x04, 0x6e, 0x2f, 0xf1, + 0x89, 0xd8, 0x5e, 0xd2, 0x38, 0x23, 0x4d, 0xbb, + 0x95, 0x4c, 0x2d, 0x2f, 0x35, 0x1e, 0x2f, 0x9c, + 0x9e, 0x0e, 0x7c, 0x2a, 0x42, 0x23, 0x9d, 0xb9, + 0x27, 0x06, 0x97, 0xca, 0xdb, 0x35, 0xfe, 0x90, + 0xa4, 0x86, 0x1c, 0x64, 0x46, 0xe2, 0xd2, 0x5f, + 0xeb, 0x58, 0xa5, 0x32, 0x62, 0x9a, 0xa0, 0xc5, + 0xbc, 0x23, 0x37, 0x07, 0x3f, 0x6a, 0x82, 0x22, + 0x64, 0xcb, 0xcc, 0xc7, 0x1b, 0x82, 0x30, 0x82, + 0x0b, 0x87, 0xc9, 0x52, 0x36, 0xee, 0xf2, 0xb0, + 0xba, 0x43, 0xeb, 0x18, 0xbf, 0x04, 0x1b, 0x1c, + 0x72, 0x66, 0xa7, 0x63, 0xf2, 0x4d, 0x70, 0xc4, + 0xf2, 0x40, 0xd1, 0x9b, 0xd2, 0x9e, 0xd6, 0x87, + 0x80, 0x38, 0xa4, 0x16, 0x70, 0x55, 0x1e, 0xf4, + 0x77, 0x6e, 0xff, 0x00, 0x0d, 0xbf, 0x49, 0xd2, + 0xb6, 0x27, 0x4d, 0x91, 0x18, 0xb0, 0x34, 0x5e, + 0xe7, 0x89, 0x4e, 0xca, 0x90, 0xe8, 0xb1, 0x35, + 0xaf, 0xcb, 0x3b, 0x36, 0x1f, 0xfe, 0xa8, 0xa3, + 0x74, 0x59, 0x36, 0x65, 0x80, 0xc9, 0xbb, 0xd7, + 0xa1, 0x48, 0xd9, 0x9e, 0xe7, 0x36, 0x56, 0xbf, + 0x28, 0x0f, 0xa8, 0xaa, 0x78, 0xbc, 0x61, 0xf4, + 0x73, 0x44, 0x4e, 0x17, 0x5b, 0x78, 0xec, 0xfd, + 0x89, 0x90, 0x4b, 0x50, 0xea, 0x3a, 0xb8, 0x1e, + 0xed, 0xf5, 0xb7, 0x8e, 0x38, 0xbd, 0x1a, 0x13, + 0x20, 0x93, 0x58, 0x6b, 0x4b, 0x1d, 0xeb, 0xcc, + 0x9b, 0xfa, 0x43, 0xa8, 0xe5, 0x63, 0xdc, 0x58, + 0x6d, 0xbc, 0x37, 0x37, 0x1e, 0xa4, 0x5b, 0x2d, + 0x43, 0x29, 0xe4, 0x6d, 0x53, 0xf1, 0x17, 0x5f, + 0x39, 0xb3, 0x79, 0x02, 0xf0, 0x84, 0x8c, 0x38, + 0x9b, 0x78, 0x86, 0x23, 0xf5, 0xac, 0x2d, 0x7f, + 0xa7, 0x17, 0xbb, 0x6f, 0x76, 0xe5, 0x0f, 0xbb, + 0xf9, 0xfe, 0xcd, 0x55, 0xef, 0x1b, 0xb9, 0x07, + 0xb4, 0xce, 0xf0, 0x9f, 0xef, 0x1d, 0xdf, 0xb8, + 0xe5, 0x13, 0xe3, 0x18, 0x9d, 0x4f, 0x7c, 0x4d, + 0x1a, 0x70, 0x9e, 0x34, 0xd9, 0x5b, 0x62, 0x47, + 0x11, 0xd0, 0x56, 0x2a, 0x46, 0xb6, 0x33, 0x2e, + 0x69, 0x43, 0xa4, 0xbb, 0xc6, 0x7d, 0x03, 0xd1, + 0xa1, 0x3e, 0x46, 0x53, 0xd9, 0xf2, 0x48, 0x25, + 0x7d, 0xdf, 0x7c, 0xff, 0x00, 0xd1, 0x50, 0x88, + 0x60, 0xc1, 0x92, 0x97, 0x28, 0xdb, 0xbe, 0xfe, + 0xbb, 0xac, 0x9c, 0x54, 0xd8, 0x19, 0xbf, 0xd2, + 0xfb, 0xf0, 0x9b, 0x87, 0x91, 0x42, 0x5d, 0x4f, + 0x8d, 0xf1, 0xb0, 0xc5, 0x8b, 0x1f, 0xd5, 0xcf, + 0xdb, 0x9d, 0x6f, 0xa0, 0x38, 0x5d, 0x08, 0x85, + 0xe0, 0x3f, 0x4d, 0xad, 0x63, 0xa3, 0xd0, 0x11, + 0x88, 0x45, 0x80, 0x6f, 0x3e, 0xb7, 0xd9, 0x04, + 0x7c, 0xd6, 0xfa, 0x1f, 0x2f, 0x84, 0x37, 0x1e, + 0x3c, 0xd9, 0xb8, 0xed, 0xca, 0xb2, 0x13, 0x40, + 0xe9, 0x6c, 0xf2, 0xf0, 0x5b, 0x26, 0x1e, 0x21, + 0xe8, 0xf4, 0x29, 0x62, 0x8a, 0x22, 0xc6, 0x3d, + 0xed, 0x7e, 0xf9, 0xf7, 0xb5, 0x81, 0xf4, 0x7a, + 0x51, 0x32, 0xd3, 0x09, 0x2c, 0xfc, 0x6c, 0x05, + 0xda, 0x3d, 0x7c, 0xa3, 0x32, 0x8c, 0x98, 0x71, + 0x4f, 0x13, 0x4b, 0x19, 0x26, 0x2c, 0xc0, 0x7a, + 0xbe, 0x29, 0xe7, 0x21, 0xe5, 0xdf, 0x18, 0x8d, + 0xd2, 0x63, 0xe4, 0xb6, 0x7b, 0x7c, 0x11, 0x70, + 0x83, 0x04, 0xaf, 0x76, 0x27, 0x3b, 0x1d, 0xc7, + 0xc0, 0x29, 0xa6, 0xb6, 0x1c, 0xa3, 0xcb, 0xad, + 0xc8, 0xa3, 0x7e, 0x4a, 0xd8, 0x26, 0x32, 0xdb, + 0x17, 0xb3, 0x9b, 0xee, 0xaa, 0x69, 0x04, 0x61, + 0xf3, 0x08, 0xdd, 0x62, 0x1f, 0xc0, 0x25, 0xce, + 0xd2, 0xa1, 0xc5, 0x06, 0x39, 0x22, 0x63, 0xa3, + 0x6b, 0xb1, 0xe6, 0xb1, 0xbf, 0x17, 0xc5, 0x30, + 0xcb, 0x4c, 0x5d, 0x68, 0xda, 0xc2, 0x44, 0x96, + 0xd1, 0xa0, 0x8c, 0xc8, 0xc9, 0x86, 0xd7, 0xb0, + 0x03, 0x4e, 0x81, 0x64, 0x19, 0x28, 0xc3, 0x2c, + 0xce, 0xc7, 0x87, 0xec, 0x8e, 0x2d, 0xd0, 0x5b, + 0x1b, 0x9c, 0x32, 0x6d, 0xce, 0x02, 0xd4, 0xc9, + 0xd1, 0x5a, 0x99, 0x3a, 0x2b, 0x53, 0x27, 0x45, + 0x6a, 0x64, 0xe8, 0xad, 0x4c, 0x9d, 0x15, 0x9a, + 0x29, 0x07, 0xfa, 0x4a, 0x73, 0x9d, 0x14, 0x83, + 0x15, 0xae, 0x03, 0x4d, 0xb3, 0x20, 0xfc, 0x12, + 0xe3, 0x1f, 0x5a, 0xc5, 0x4a, 0x72, 0x02, 0x0a, + 0xb7, 0x66, 0x7b, 0x9b, 0x11, 0xf2, 0x83, 0xe4, + 0x98, 0xd7, 0x51, 0xb6, 0x6c, 0x9f, 0x00, 0xc9, + 0x19, 0xbb, 0x50, 0x32, 0xd2, 0x0a, 0x87, 0x82, + 0x48, 0x7c, 0x91, 0x9b, 0x8c, 0xf7, 0x5a, 0x97, + 0x39, 0xd8, 0xdd, 0x26, 0x22, 0xc3, 0xa4, 0x8b, + 0x26, 0x35, 0xd4, 0x6d, 0x9b, 0x27, 0xc0, 0x32, + 0x46, 0x6e, 0xd5, 0x81, 0xf1, 0x3c, 0xf9, 0x43, + 0x29, 0x76, 0x13, 0x72, 0x4a, 0x96, 0x21, 0x03, + 0xb0, 0xc9, 0x62, 0x77, 0xa7, 0x89, 0x6a, 0x64, + 0xe8, 0xad, 0x4c, 0x9d, 0x15, 0xa9, 0x93, 0xa2, + 0xb5, 0x32, 0x74, 0x56, 0xa6, 0x4e, 0x8a, 0xd4, + 0xc9, 0xd1, 0x51, 0xfb, 0xb6, 0xf7, 0x6e, 0x52, + 0x31, 0xd1, 0xb5, 0xf8, 0xa9, 0xa4, 0xce, 0xee, + 0x2c, 0xc5, 0x59, 0xf0, 0xc6, 0x61, 0x69, 0xc5, + 0x34, 0x8f, 0x17, 0xde, 0xf2, 0x0e, 0x45, 0x16, + 0x32, 0xfc, 0xb3, 0xdb, 0x8c, 0x11, 0xc1, 0xd3, + 0xa1, 0x56, 0x4d, 0x1e, 0x3c, 0x6c, 0xa9, 0xc2, + 0xec, 0x5a, 0x0d, 0xf1, 0x68, 0xe6, 0x54, 0xe1, + 0xf1, 0xb6, 0x50, 0xe7, 0x86, 0xd9, 0xfa, 0x34, + 0xa7, 0x7a, 0xd4, 0xbe, 0x2c, 0xca, 0x79, 0x20, + 0xb5, 0xc0, 0x6b, 0x6d, 0x24, 0x7e, 0xbe, 0x33, + 0xda, 0x85, 0xe5, 0x8a, 0x13, 0x1c, 0xae, 0x8b, + 0x13, 0xef, 0x9f, 0x0b, 0x58, 0x38, 0x87, 0xf5, + 0x74, 0xe6, 0xb3, 0x0e, 0x10, 0xd6, 0x70, 0x74, + 0x70, 0x42, 0xa1, 0x91, 0x94, 0xcc, 0x25, 0xd1, + 0x9f, 0x26, 0x06, 0x93, 0x89, 0xc0, 0x7a, 0xd0, + 0x0c, 0x11, 0x36, 0x56, 0x47, 0xe5, 0xac, 0xe6, + 0xb0, 0x62, 0xfe, 0xad, 0xa1, 0x3e, 0xc5, 0xe2, + 0x68, 0xe1, 0x89, 0xf7, 0xfa, 0xba, 0x1a, 0x2d, + 0xda, 0x9d, 0x99, 0xee, 0x9b, 0xc6, 0x65, 0x69, + 0x91, 0xce, 0xd3, 0x6b, 0x7e, 0x2a, 0x4c, 0x70, + 0xc6, 0x21, 0x6b, 0x08, 0x2f, 0x23, 0x7c, 0xe7, + 0xf1, 0x58, 0xf3, 0x2a, 0xc6, 0x96, 0x83, 0x21, + 0x2d, 0x0c, 0x75, 0xb3, 0x83, 0x67, 0x1e, 0xdb, + 0x2a, 0x2c, 0xab, 0x1b, 0x98, 0xbb, 0x1b, 0xb0, + 0xdf, 0x39, 0x68, 0x22, 0xfe, 0xab, 0x85, 0x09, + 0x31, 0xd2, 0xca, 0x2d, 0x25, 0xa4, 0x8c, 0x0c, + 0x24, 0xe0, 0x36, 0xb8, 0xfc, 0x55, 0x31, 0xa9, + 0x6c, 0x39, 0x4c, 0xa6, 0xfc, 0x53, 0xe1, 0xe0, + 0x66, 0xfb, 0x39, 0x93, 0x9e, 0xd1, 0x4d, 0x24, + 0x61, 0xd9, 0xa4, 0x81, 0xb8, 0x4b, 0x7d, 0x04, + 0x27, 0x7e, 0x8e, 0x64, 0x33, 0xe2, 0x0d, 0x93, + 0x0d, 0xf0, 0x61, 0x19, 0xb3, 0xfa, 0x4a, 0xa2, + 0x19, 0x08, 0x64, 0x6b, 0xd8, 0x4b, 0xf1, 0x46, + 0x2e, 0x77, 0xee, 0xe3, 0xd2, 0x9f, 0x93, 0x8d, + 0x92, 0x38, 0xcc, 0xf6, 0x62, 0x95, 0xb8, 0xac, + 0x1b, 0x6f, 0xc5, 0x56, 0x3d, 0xb1, 0x88, 0x81, + 0x91, 0xbb, 0xd6, 0xe8, 0xd1, 0xb9, 0x07, 0xb4, + 0xce, 0xf0, 0x9f, 0xef, 0x1d, 0xdf, 0xb8, 0xf5, + 0x89, 0xa7, 0x09, 0x57, 0x7d, 0x2d, 0x33, 0xdd, + 0xf6, 0x9d, 0x10, 0xba, 0xd8, 0xa9, 0x3a, 0x90, + 0xb6, 0x2a, 0x4e, 0xa4, 0x2d, 0x8a, 0x93, 0xa9, + 0x0b, 0x62, 0xa4, 0xea, 0x42, 0xd8, 0xa9, 0x3a, + 0x90, 0xb6, 0x2a, 0x4e, 0xa4, 0x2d, 0x8a, 0x93, + 0xa9, 0x0b, 0x62, 0xa4, 0xea, 0x42, 0xd8, 0xa9, + 0x3a, 0x90, 0xb6, 0x2a, 0x4e, 0xa4, 0x2d, 0x8a, + 0x93, 0xa9, 0x0b, 0x62, 0xa4, 0xea, 0x42, 0xd8, + 0xa9, 0x3a, 0x90, 0xb6, 0x2a, 0x4e, 0xa4, 0x2d, + 0x8a, 0x93, 0xa9, 0x0b, 0x62, 0xa4, 0xea, 0x42, + 0xd8, 0xa9, 0x3a, 0x90, 0xb6, 0x2a, 0x4e, 0xa4, + 0x2d, 0x8a, 0x93, 0xa9, 0x0a, 0xf1, 0x41, 0x04, + 0x27, 0x95, 0x91, 0x80, 0xae, 0xe3, 0x73, 0xcb, + 0xba, 0x21, 0x84, 0xb7, 0x06, 0x06, 0x9c, 0xed, + 0x5c, 0x28, 0xfa, 0x0b, 0x85, 0x1f, 0x41, 0x70, + 0xa3, 0xe8, 0x2e, 0x14, 0x7d, 0x05, 0xc2, 0x8f, + 0xa0, 0xb8, 0x51, 0xf4, 0x17, 0x0a, 0x3e, 0x82, + 0xc7, 0xbd, 0xc0, 0x4d, 0xb1, 0x64, 0xf3, 0x26, + 0xb9, 0xed, 0x0c, 0x6b, 0xb8, 0x25, 0xd1, 0xe9, + 0x5c, 0x28, 0xfa, 0x08, 0x10, 0x1a, 0x41, 0x38, + 0x45, 0xa3, 0xe3, 0x58, 0x24, 0x01, 0x8f, 0xfb, + 0x2e, 0x8e, 0xc5, 0x0c, 0xab, 0x32, 0x77, 0xd1, + 0x8e, 0x2b, 0x5d, 0x70, 0xa3, 0xe8, 0x2e, 0x14, + 0x7d, 0x05, 0xc2, 0x8f, 0xa0, 0xb8, 0x51, 0xf4, + 0x17, 0x0a, 0x3e, 0x82, 0xe1, 0x47, 0xd0, 0x5c, + 0x28, 0xfa, 0x0b, 0x85, 0x1f, 0x41, 0x31, 0xc7, + 0x4b, 0x98, 0xd3, 0xb9, 0x4b, 0x24, 0x71, 0xd3, + 0xbc, 0xe4, 0x8b, 0x7c, 0xbb, 0xed, 0x6b, 0xfc, + 0x7d, 0x28, 0xc4, 0x61, 0xa0, 0x73, 0x31, 0x63, + 0xb1, 0x94, 0xff, 0x00, 0xec, 0x83, 0x3f, 0x43, + 0x24, 0x0c, 0x21, 0xe6, 0x4d, 0xf0, 0x1c, 0x89, + 0xe6, 0x43, 0x4a, 0x59, 0x2c, 0xc2, 0x67, 0x8c, + 0xa7, 0xaf, 0xf1, 0x2b, 0x2c, 0x05, 0x23, 0xc8, + 0x37, 0x68, 0x7c, 0xba, 0x39, 0x8a, 0x2f, 0x1e, + 0x2b, 0x17, 0xee, 0xb2, 0x5c, 0xdd, 0xa8, 0xbd, + 0xac, 0xa1, 0x6c, 0x87, 0x84, 0xe0, 0xfe, 0x17, + 0x6f, 0x72, 0x11, 0xb9, 0xf4, 0xd6, 0xc6, 0x64, + 0xbe, 0x54, 0x5e, 0xe6, 0xdf, 0x82, 0xc6, 0xe7, + 0xd3, 0x5e, 0xc0, 0x66, 0x94, 0x71, 0x0b, 0x28, + 0x8b, 0x60, 0xa0, 0x19, 0x30, 0x43, 0x7c, 0xa9, + 0xe3, 0xbf, 0xef, 0x7a, 0x50, 0x2d, 0x6d, 0x24, + 0x3e, 0x86, 0x4b, 0xf8, 0x94, 0x47, 0xe8, 0x6d, + 0x71, 0x6b, 0x58, 0x5e, 0x24, 0xce, 0x40, 0xb6, + 0x6d, 0x3e, 0x84, 0xf6, 0xbc, 0xd2, 0x6f, 0xa5, + 0x74, 0xb7, 0xca, 0xe8, 0x27, 0x4a, 0x64, 0x2e, + 0x8a, 0x89, 0xd8, 0x01, 0x01, 0xc6, 0x53, 0x7e, + 0xf5, 0x66, 0x3e, 0x9b, 0x58, 0xd9, 0x2f, 0x95, + 0x1a, 0x5b, 0x7b, 0x77, 0xac, 0x58, 0xa9, 0x0d, + 0xde, 0xe7, 0x90, 0x5e, 0x2d, 0x9f, 0x31, 0x1e, + 0xa4, 0x04, 0x62, 0x8e, 0x26, 0x0c, 0x5b, 0xd6, + 0xc9, 0x9b, 0x38, 0xb5, 0xf4, 0xa6, 0xbd, 0xb2, + 0x53, 0xe2, 0x69, 0xb8, 0xf2, 0x81, 0x18, 0xda, + 0xda, 0x28, 0x5a, 0xe3, 0x77, 0x64, 0xe4, 0xd3, + 0xda, 0xa1, 0x22, 0x5a, 0x76, 0x64, 0x80, 0x0d, + 0xc3, 0x2a, 0x61, 0xc9, 0x50, 0x63, 0x65, 0xf0, + 0x3b, 0x29, 0xc1, 0xb9, 0x27, 0x96, 0xdc, 0x69, + 0xed, 0x79, 0xa4, 0xa8, 0x6b, 0x9d, 0x8e, 0xd2, + 0xc9, 0xc7, 0xca, 0xaa, 0x5d, 0x39, 0x8c, 0x97, + 0x3d, 0xb6, 0xc9, 0x1c, 0xc0, 0x6e, 0x41, 0xed, + 0x33, 0xbc, 0x27, 0xfb, 0xc7, 0x77, 0xee, 0x3d, + 0x37, 0x1b, 0x72, 0x93, 0x38, 0x5f, 0x09, 0xd0, + 0xd5, 0xa8, 0x83, 0xa0, 0xb5, 0x10, 0x74, 0x16, + 0xa2, 0x0e, 0x82, 0xd4, 0x41, 0xd0, 0x5a, 0x88, + 0x3a, 0x0b, 0x51, 0x07, 0x41, 0x6a, 0x20, 0xe8, + 0x2d, 0x44, 0x1d, 0x05, 0xa8, 0x83, 0xa0, 0xb5, + 0x10, 0x74, 0x16, 0xa2, 0x0e, 0x82, 0xd4, 0x41, + 0xd0, 0x5a, 0x88, 0x3a, 0x0b, 0x51, 0x07, 0x41, + 0x6a, 0x20, 0xe8, 0x2d, 0x44, 0x1d, 0x05, 0xa8, + 0x83, 0xa0, 0xb5, 0x10, 0x74, 0x16, 0xa2, 0x0e, + 0x82, 0xd4, 0x41, 0xd0, 0x5a, 0x88, 0x3a, 0x0b, + 0x26, 0x58, 0xd8, 0x65, 0x3c, 0x17, 0x37, 0x42, + 0x20, 0xe9, 0x1b, 0x9f, 0xc3, 0x6f, 0xea, 0x29, + 0xdb, 0x21, 0xbb, 0x44, 0xf8, 0x47, 0xa0, 0x58, + 0x2f, 0x09, 0xe5, 0x06, 0x50, 0x36, 0x60, 0x43, + 0x0f, 0xb5, 0x6b, 0x73, 0x26, 0x08, 0xc1, 0x38, + 0x89, 0x25, 0xe4, 0xf0, 0x7f, 0x73, 0xe0, 0xa2, + 0xc8, 0xdf, 0x2a, 0x67, 0x73, 0x45, 0xb4, 0xe7, + 0x68, 0x0a, 0x18, 0xf1, 0x65, 0x65, 0xa6, 0x82, + 0x43, 0x8b, 0x4e, 0xfe, 0xc4, 0xf6, 0x29, 0x18, + 0x5e, 0xe7, 0xb1, 0xc7, 0x13, 0xb1, 0x67, 0xfd, + 0x4c, 0x5e, 0xed, 0xbd, 0xdb, 0x94, 0x3e, 0xef, + 0xe7, 0xba, 0xc1, 0x8b, 0x16, 0x28, 0xda, 0xfe, + 0x71, 0x75, 0x2c, 0x11, 0x54, 0x99, 0x2a, 0x23, + 0xbe, 0xf1, 0xd1, 0xe1, 0xbd, 0xb9, 0x33, 0xa6, + 0x4b, 0x51, 0x51, 0x90, 0x12, 0x70, 0x00, 0x66, + 0x22, 0x7d, 0x29, 0xb4, 0xae, 0x90, 0x0c, 0x64, + 0x61, 0x78, 0xce, 0x0d, 0xf4, 0x2a, 0x87, 0x38, + 0xe0, 0xc9, 0x0e, 0x4d, 0x26, 0xf6, 0xb2, 0x82, + 0x09, 0x5a, 0xf8, 0x0c, 0xae, 0x00, 0x17, 0xb5, + 0x32, 0x33, 0x0b, 0xcb, 0xde, 0xdc, 0x40, 0x06, + 0x9c, 0xe9, 0xcd, 0x11, 0x3c, 0xb9, 0x9c, 0x20, + 0x1b, 0xa1, 0x18, 0xdb, 0x0b, 0xdc, 0xf1, 0xa5, + 0xa1, 0xb9, 0xd0, 0x89, 0xce, 0xc9, 0x8b, 0x12, + 0x4d, 0xaf, 0x6b, 0x0b, 0xa7, 0x4d, 0x4f, 0x39, + 0x95, 0xac, 0x20, 0x38, 0x39, 0x98, 0x48, 0xbf, + 0xc5, 0x35, 0xce, 0x89, 0xed, 0x0f, 0xe0, 0x92, + 0xdd, 0x2b, 0x7d, 0x04, 0x8d, 0xf5, 0xb4, 0xa9, + 0xa5, 0x37, 0x68, 0x63, 0x31, 0x8c, 0xdc, 0x2d, + 0xf0, 0x1f, 0x34, 0xcc, 0x50, 0xc8, 0x31, 0xf0, + 0x6e, 0xde, 0x17, 0xa9, 0x4b, 0x1e, 0x45, 0xee, + 0x31, 0xf0, 0xb0, 0xb4, 0xa1, 0x21, 0x8d, 0xc2, + 0x33, 0xf5, 0xad, 0x9b, 0x76, 0xab, 0xde, 0x37, + 0x72, 0x0f, 0x69, 0x9d, 0xe1, 0x3f, 0xde, 0x3b, + 0xbf, 0x71, 0xea, 0xa1, 0xbc, 0x84, 0x77, 0x2d, + 0x2b, 0x4a, 0xd2, 0x9f, 0x53, 0x2d, 0x57, 0x8b, + 0xb1, 0xaf, 0xc1, 0x9d, 0x97, 0x51, 0xc8, 0x24, + 0x6c, 0xd0, 0x49, 0xc1, 0x91, 0x8a, 0x31, 0x90, + 0x92, 0xf2, 0x70, 0x6e, 0xd3, 0x9d, 0x1a, 0x72, + 0xd7, 0x39, 0xff, 0x00, 0x56, 0xcd, 0xe1, 0x7a, + 0x96, 0x19, 0x1a, 0xe8, 0xdd, 0xc8, 0xe1, 0x65, + 0x15, 0x4c, 0xd5, 0xa2, 0x9c, 0x48, 0x48, 0x00, + 0xb2, 0xeb, 0x03, 0x7c, 0xb8, 0x2c, 0xca, 0x07, + 0x46, 0x2f, 0xbd, 0xe5, 0x59, 0x31, 0x0c, 0x86, + 0x4d, 0x38, 0x70, 0x9b, 0xa7, 0x44, 0xd6, 0xb8, + 0x16, 0x8b, 0xba, 0xe3, 0x42, 0x78, 0x10, 0xc8, + 0x4b, 0x38, 0x56, 0x69, 0xde, 0xfa, 0xd5, 0xa2, + 0x63, 0xe4, 0x3c, 0x8c, 0x17, 0x53, 0x39, 0x8c, + 0x77, 0x92, 0x1f, 0x67, 0x49, 0xe4, 0x50, 0x61, + 0x6c, 0xcd, 0x2e, 0x6d, 0xce, 0x54, 0x69, 0x3e, + 0x8f, 0x42, 0x68, 0x7c, 0x32, 0x34, 0xbf, 0x82, + 0x0b, 0x4e, 0x74, 0x5c, 0xe8, 0xa4, 0x6b, 0x5a, + 0x6c, 0x49, 0x6e, 0x82, 0xb4, 0xad, 0x2b, 0x4a, + 0x66, 0x7e, 0x35, 0x2f, 0xaf, 0x70, 0x39, 0x90, + 0xc8, 0xf6, 0xe4, 0xdb, 0x9d, 0xad, 0x25, 0x6c, + 0xd3, 0x74, 0x0a, 0xd9, 0xa6, 0xe8, 0x15, 0xb3, + 0x4d, 0xd0, 0x2b, 0x66, 0x9b, 0xa0, 0x56, 0xcd, + 0x37, 0x40, 0xad, 0x9a, 0x6e, 0x81, 0x5b, 0x34, + 0xdd, 0x02, 0xbc, 0x5f, 0xfb, 0x37, 0x37, 0xda, + 0xc9, 0xbe, 0xf7, 0xe5, 0xd2, 0xb6, 0x57, 0xc6, + 0xe2, 0xe0, 0xf7, 0x3d, 0x91, 0x90, 0x5c, 0x79, + 0x4a, 0xc3, 0x90, 0x9e, 0xda, 0x6d, 0x80, 0xa6, + 0xb5, 0xb4, 0x4e, 0x78, 0x0e, 0x2e, 0xdf, 0x46, + 0xee, 0x31, 0x65, 0x1c, 0xb0, 0xd0, 0x9a, 0x67, + 0xb3, 0x46, 0x4e, 0x37, 0x7c, 0xd1, 0x8d, 0xb4, + 0x39, 0x06, 0xb8, 0xdd, 0xd9, 0x28, 0x88, 0xc4, + 0xb6, 0x69, 0xba, 0x05, 0x6c, 0xd3, 0x74, 0x0a, + 0xd9, 0xa6, 0xe8, 0x15, 0xb3, 0x4d, 0xd0, 0x2b, + 0x66, 0x9b, 0xa0, 0x56, 0xcd, 0x37, 0x40, 0xad, + 0x9a, 0x6e, 0x81, 0x5b, 0x34, 0xdd, 0x02, 0xa3, + 0x07, 0xfc, 0x36, 0xf7, 0x6e, 0x50, 0xfb, 0xaf, + 0x9e, 0xec, 0x33, 0xb6, 0x17, 0x98, 0x45, 0x3c, + 0x7b, 0xf0, 0x33, 0x70, 0x54, 0xf5, 0x92, 0xb0, + 0xc7, 0x4e, 0xc7, 0x39, 0xf8, 0x9d, 0xf5, 0xb9, + 0x00, 0x54, 0x8e, 0xa7, 0x6e, 0x50, 0xc6, 0xcc, + 0x9b, 0xda, 0x34, 0xb7, 0x39, 0x3f, 0x35, 0x18, + 0x63, 0xae, 0x61, 0x8d, 0xac, 0xc4, 0xde, 0x50, + 0x15, 0x2b, 0xee, 0x03, 0x6a, 0xa6, 0x15, 0x07, + 0xd1, 0xc9, 0xf7, 0x8b, 0x95, 0x0c, 0x75, 0x37, + 0x12, 0x9a, 0xc0, 0xe6, 0x87, 0x69, 0xb7, 0x19, + 0x45, 0xe1, 0x8e, 0x94, 0x9a, 0x48, 0xf0, 0x46, + 0x09, 0x18, 0xf3, 0x34, 0x1d, 0x1c, 0x89, 0xd9, + 0x01, 0x69, 0x0e, 0x45, 0xc7, 0x26, 0x78, 0x83, + 0x48, 0xd3, 0xc8, 0x0a, 0xf0, 0x8c, 0x61, 0x92, + 0x4b, 0x26, 0x59, 0xae, 0xc3, 0x03, 0xb0, 0x92, + 0x2c, 0x7d, 0x0a, 0x47, 0x96, 0x71, 0x49, 0x76, + 0xe2, 0xbf, 0xd4, 0x3c, 0x61, 0x35, 0xd1, 0x42, + 0xd8, 0x63, 0x12, 0x8c, 0xbb, 0x1b, 0x73, 0x7f, + 0xb2, 0x73, 0xfc, 0x51, 0x73, 0xa3, 0x90, 0x47, + 0x25, 0x43, 0x4b, 0x65, 0x96, 0x50, 0x59, 0xa7, + 0x31, 0x6e, 0x64, 0xd8, 0xa7, 0xbe, 0x55, 0xce, + 0x99, 0xad, 0x6b, 0xb4, 0xe7, 0x8f, 0xf1, 0x59, + 0x39, 0x37, 0x87, 0x21, 0x9e, 0xfc, 0x5e, 0x58, + 0x2a, 0xd1, 0x92, 0x23, 0x0c, 0xad, 0x70, 0x73, + 0x9c, 0x5c, 0xe7, 0x0c, 0xe3, 0x12, 0x69, 0x86, + 0xe0, 0x36, 0xa9, 0xf2, 0x3c, 0x8e, 0x20, 0x6d, + 0x67, 0x1f, 0x45, 0x95, 0x28, 0x61, 0xf2, 0x58, + 0x1c, 0x5a, 0x3f, 0x88, 0xed, 0xda, 0xaf, 0x78, + 0xdd, 0xc8, 0x3d, 0xa6, 0x77, 0x84, 0xff, 0x00, + 0x78, 0xee, 0xfd, 0xc7, 0xaa, 0x93, 0xe9, 0x1d, + 0xdf, 0x42, 0x76, 0x8b, 0x93, 0xe3, 0x1f, 0x20, + 0xa8, 0x29, 0xce, 0xf2, 0x67, 0xd5, 0x63, 0x66, + 0x31, 0xa0, 0x2a, 0xbf, 0x2f, 0x3c, 0xcf, 0x65, + 0x43, 0x37, 0xcf, 0x16, 0x00, 0xe2, 0x00, 0xe1, + 0x55, 0xf2, 0xf8, 0xc3, 0xa2, 0x6c, 0x4c, 0x39, + 0xed, 0x88, 0x86, 0xfe, 0xea, 0xf0, 0x63, 0xc1, + 0x91, 0xfb, 0xd7, 0x6f, 0xe5, 0xe1, 0x11, 0x9b, + 0x4a, 0xa1, 0x15, 0x8d, 0x99, 0xc3, 0x13, 0xed, + 0x92, 0xf5, 0xa9, 0x1f, 0x1c, 0x79, 0x38, 0x61, + 0xa4, 0x2c, 0x8d, 0xa7, 0x90, 0x29, 0x67, 0x64, + 0xaf, 0xf1, 0x97, 0xcf, 0x69, 0x24, 0x07, 0x7d, + 0x6b, 0x28, 0x9c, 0x49, 0x13, 0x3e, 0x86, 0xf2, + 0x5b, 0x8d, 0xcb, 0xc1, 0xaf, 0x2f, 0xaa, 0xc6, + 0xe7, 0xb9, 0xc7, 0x21, 0x9f, 0x1b, 0xaf, 0xf5, + 0x95, 0x54, 0xb4, 0x62, 0x4a, 0x77, 0xbe, 0xaf, + 0x7d, 0xc4, 0xe0, 0x39, 0x17, 0x85, 0x9d, 0x3d, + 0xe2, 0x9c, 0xc4, 0xd7, 0x59, 0x86, 0xdf, 0x15, + 0xe0, 0x4c, 0x79, 0xf0, 0xd3, 0xf1, 0xf2, 0xd9, + 0x54, 0xf8, 0xe3, 0x9c, 0xfc, 0x35, 0x11, 0x96, + 0x63, 0xe2, 0x76, 0x2c, 0xf6, 0x5e, 0x1b, 0x89, + 0xee, 0x26, 0x11, 0x0b, 0xb0, 0xb3, 0x88, 0x7d, + 0x06, 0x7a, 0xd4, 0xbe, 0xbd, 0xc0, 0xc8, 0xa7, + 0x73, 0x19, 0x93, 0x69, 0xb0, 0x5b, 0x5c, 0x8b, + 0x6b, 0x91, 0x6d, 0x72, 0x2d, 0xae, 0x45, 0xb5, + 0xc8, 0xb6, 0xb9, 0x16, 0xd7, 0x22, 0x0e, 0x15, + 0xd9, 0x3c, 0x4e, 0xc0, 0xcc, 0x6e, 0xb6, 0x33, + 0xc8, 0x15, 0x8d, 0x54, 0x97, 0x58, 0x19, 0x56, + 0xed, 0x17, 0x25, 0xc6, 0xc0, 0x0e, 0x54, 0xd9, + 0x05, 0x7e, 0x5a, 0x32, 0x6d, 0x8e, 0x37, 0x66, + 0xbf, 0x22, 0x85, 0xef, 0xab, 0x75, 0xa5, 0x6e, + 0x21, 0x63, 0xfd, 0x7a, 0x17, 0x8a, 0xba, 0xac, + 0xe3, 0xb5, 0xef, 0x7c, 0xc7, 0x35, 0xd6, 0xd7, + 0x22, 0xda, 0xe4, 0x5b, 0x5c, 0x8b, 0x6b, 0x91, + 0x6d, 0x72, 0x2d, 0xae, 0x45, 0xb5, 0xc8, 0xb6, + 0xb9, 0x14, 0x64, 0xe7, 0x26, 0x36, 0xee, 0x51, + 0xe3, 0xac, 0x8e, 0x9c, 0x88, 0xf4, 0x3f, 0x8d, + 0x79, 0xd2, 0x9f, 0x98, 0xaf, 0x3a, 0x53, 0xf3, + 0x15, 0xe7, 0x4a, 0x7e, 0x62, 0xbc, 0xe9, 0x4f, + 0xcc, 0x57, 0x9d, 0x29, 0xf9, 0x8a, 0xf3, 0xa5, + 0x3f, 0x31, 0x5e, 0x74, 0xa7, 0xe6, 0x2b, 0xce, + 0x94, 0xfc, 0xc5, 0x79, 0xd2, 0x9f, 0x98, 0xa7, + 0x5e, 0xba, 0x8e, 0x60, 0x78, 0xa4, 0x69, 0x4f, + 0x91, 0xfe, 0x15, 0xa7, 0x2f, 0x71, 0xb9, 0xcc, + 0x57, 0x9d, 0x29, 0xf9, 0x8a, 0xf3, 0xa5, 0x3f, + 0x31, 0x4d, 0x70, 0xf0, 0x9d, 0x31, 0xb1, 0xbe, + 0x76, 0x92, 0x9a, 0xcf, 0xed, 0x0a, 0x48, 0x98, + 0xd2, 0x4e, 0x18, 0xda, 0xed, 0x2b, 0xce, 0x94, + 0xfc, 0xc5, 0x79, 0xd2, 0x9f, 0x98, 0xaf, 0x3a, + 0x53, 0xf3, 0x15, 0xe7, 0x4a, 0x7e, 0x62, 0xbc, + 0xe9, 0x4f, 0xcc, 0x57, 0x9d, 0x29, 0xf9, 0x8a, + 0xaa, 0x6c, 0x75, 0x2c, 0xa8, 0xbb, 0xdb, 0xc0, + 0xe2, 0xdc, 0x83, 0xda, 0x67, 0x78, 0x4f, 0xf7, + 0x8e, 0xef, 0xdc, 0x7a, 0x33, 0x69, 0x6c, 0xa0, + 0x38, 0x1f, 0xa0, 0x59, 0x0c, 0x98, 0x1a, 0x4d, + 0xf4, 0x04, 0x25, 0x7c, 0x8e, 0x32, 0x0d, 0x07, + 0x91, 0x38, 0xe5, 0x8d, 0xc8, 0xb1, 0x42, 0x5c, + 0xa9, 0xca, 0x5b, 0x0d, 0xec, 0x34, 0x2c, 0x9c, + 0x92, 0x17, 0xb3, 0x16, 0x2b, 0x1e, 0x54, 0xc8, + 0x49, 0xf2, 0x6c, 0xe0, 0x8b, 0x27, 0x18, 0xce, + 0x12, 0xe1, 0x84, 0xe6, 0xe2, 0x44, 0xc2, 0xf2, + 0xcb, 0xe9, 0x5e, 0x30, 0x24, 0x39, 0x6f, 0xb4, + 0x9f, 0x86, 0x62, 0x31, 0x9b, 0x94, 0xe3, 0x14, + 0x85, 0xa5, 0xda, 0x78, 0xee, 0x9f, 0x2b, 0x64, + 0x22, 0x47, 0xf0, 0x8e, 0x9b, 0xa8, 0xcb, 0x9e, + 0x6f, 0x18, 0xb3, 0x08, 0xcd, 0x64, 0xcc, 0x72, + 0x97, 0x60, 0x37, 0x1e, 0xb5, 0x33, 0xf1, 0x6f, + 0xa5, 0x16, 0x79, 0xb6, 0x9f, 0xa0, 0xc6, 0x81, + 0xc6, 0xa4, 0x70, 0xd0, 0x4e, 0xe7, 0xf0, 0xdb, + 0xfa, 0x8f, 0x1c, 0x78, 0x2e, 0x0c, 0x77, 0x93, + 0x67, 0xda, 0x77, 0xe0, 0x15, 0xa4, 0x91, 0xbe, + 0x34, 0x71, 0x64, 0x9c, 0x7f, 0xbb, 0xe5, 0xbf, + 0xaf, 0x3a, 0xad, 0x89, 0x99, 0xe5, 0x7c, 0x5b, + 0xd1, 0xcb, 0x67, 0x02, 0x42, 0x87, 0x10, 0xc0, + 0xc9, 0x24, 0xc0, 0x2f, 0xda, 0x55, 0x49, 0x86, + 0x47, 0xbc, 0xb1, 0xf9, 0x50, 0xd7, 0x33, 0x0e, + 0x16, 0xf0, 0x79, 0x7d, 0x9e, 0x65, 0x50, 0x3f, + 0xbd, 0xa6, 0x7c, 0x84, 0x7a, 0x58, 0x6f, 0xdc, + 0x7b, 0xff, 0x00, 0x53, 0x17, 0xbb, 0x6f, 0x76, + 0xe5, 0x1f, 0xb9, 0xf9, 0x9d, 0xd7, 0x18, 0x27, + 0xf1, 0x87, 0x31, 0xc1, 0x8e, 0x0d, 0x6f, 0x19, + 0xe4, 0xe5, 0x58, 0xb0, 0x9c, 0x37, 0xb5, 0xd4, + 0xf2, 0x63, 0xc3, 0x93, 0x19, 0x85, 0xb8, 0x59, + 0x89, 0xee, 0x05, 0x63, 0x11, 0x3c, 0xb2, 0xd7, + 0xc5, 0x87, 0x35, 0x91, 0x94, 0x44, 0xf3, 0x18, + 0xd2, 0xfc, 0x39, 0x96, 0x4a, 0x26, 0xba, 0x73, + 0x81, 0xaf, 0xde, 0x37, 0x94, 0x03, 0xf3, 0x4e, + 0xc1, 0x13, 0xdf, 0x87, 0x31, 0xb3, 0x74, 0x26, + 0xc2, 0x37, 0xae, 0x3f, 0x6b, 0x8b, 0x95, 0x17, + 0xc1, 0x52, 0x26, 0xc2, 0x6c, 0x5a, 0x5b, 0x84, + 0xfc, 0x39, 0x50, 0x6b, 0xa1, 0x91, 0xae, 0x22, + 0xf6, 0x2d, 0x3a, 0x13, 0xb1, 0x41, 0x23, 0x70, + 0x70, 0xae, 0xc3, 0x99, 0x65, 0x1d, 0x0b, 0xc3, + 0x3e, 0xd1, 0x6e, 0x64, 0x25, 0x31, 0x3c, 0x46, + 0x74, 0x3f, 0x0e, 0x65, 0x83, 0xc5, 0xe5, 0xc5, + 0xa7, 0x0e, 0x03, 0x74, 0x2a, 0x30, 0x1c, 0x99, + 0x76, 0x1b, 0xd9, 0x06, 0xba, 0x09, 0x1a, 0xe2, + 0x2e, 0x01, 0x69, 0xd0, 0x9c, 0xf3, 0x0c, 0x81, + 0xad, 0x36, 0x2e, 0x2d, 0x36, 0x1b, 0xb5, 0x9e, + 0xdb, 0x3e, 0x7b, 0x90, 0x7b, 0x4c, 0xef, 0x09, + 0xfe, 0xf1, 0xdd, 0xfb, 0x8f, 0x52, 0x49, 0x81, + 0xb2, 0x5a, 0x40, 0x30, 0xbd, 0x6c, 0x51, 0x74, + 0x8a, 0xd8, 0x62, 0xe9, 0x15, 0xb0, 0xc5, 0xd2, + 0x2b, 0x61, 0x8b, 0xa4, 0x56, 0x16, 0x78, 0x3d, + 0x8f, 0x77, 0x20, 0x25, 0x6c, 0x31, 0x74, 0x8a, + 0x26, 0x1f, 0x05, 0x65, 0x40, 0xe3, 0x66, 0x22, + 0xb0, 0xcb, 0xe0, 0xd6, 0xc4, 0xee, 0x47, 0xe2, + 0x0b, 0x61, 0x8b, 0xa4, 0x56, 0xc3, 0x17, 0x48, + 0xad, 0x86, 0x2e, 0x91, 0x5b, 0x0c, 0x5d, 0x22, + 0xb1, 0xff, 0x00, 0x67, 0xc7, 0x86, 0xf6, 0xc5, + 0x73, 0x65, 0xb0, 0xc5, 0xd2, 0x2b, 0x61, 0x8b, + 0xa4, 0x56, 0xc3, 0x17, 0x48, 0xad, 0x86, 0x2e, + 0x91, 0x5b, 0x0c, 0x5d, 0x22, 0xb6, 0x18, 0xba, + 0x45, 0x6c, 0x31, 0x74, 0x8a, 0xd8, 0x62, 0xe9, + 0x15, 0x92, 0x11, 0x47, 0x0c, 0x78, 0x1c, 0x77, + 0x83, 0x39, 0xdd, 0x12, 0x43, 0x01, 0x7b, 0x32, + 0x6d, 0x17, 0xb8, 0x5b, 0x2b, 0xb9, 0xc2, 0xd9, + 0x5d, 0xce, 0x16, 0xca, 0xee, 0x70, 0xb6, 0x57, + 0x73, 0x85, 0xb2, 0xbb, 0x9c, 0x2d, 0x95, 0xdc, + 0xe1, 0x6c, 0xae, 0xe7, 0x0b, 0x0c, 0x4d, 0x9e, + 0x36, 0xf2, 0x32, 0x5b, 0x7c, 0xd1, 0x26, 0x99, + 0xc4, 0x9e, 0x32, 0xe0, 0x81, 0x6d, 0x33, 0x81, + 0x1c, 0x61, 0xc1, 0x65, 0x1d, 0x1c, 0xce, 0x7e, + 0x8c, 0x46, 0x4c, 0xfd, 0xe8, 0xe1, 0xa7, 0x78, + 0xb8, 0xb1, 0xb3, 0x82, 0x32, 0x64, 0x64, 0xc6, + 0x74, 0xbb, 0x1e, 0x73, 0xda, 0xb6, 0x57, 0x73, + 0x85, 0xb2, 0xbb, 0x9c, 0x2d, 0x95, 0xdc, 0xe1, + 0x6c, 0xae, 0xe7, 0x0b, 0x65, 0x77, 0x38, 0x5b, + 0x2b, 0xb9, 0xc2, 0xd9, 0x5d, 0xce, 0x16, 0xca, + 0xee, 0x70, 0xa3, 0x69, 0xcc, 0x44, 0x6d, 0xdc, + 0xa3, 0x3c, 0x59, 0x2f, 0x9e, 0xe7, 0x22, 0x74, + 0x53, 0xe1, 0x8a, 0x36, 0xc8, 0xdc, 0x94, 0xad, + 0xfa, 0xfe, 0x9c, 0xda, 0x73, 0x26, 0x16, 0x12, + 0xdc, 0x24, 0x8c, 0x27, 0xeb, 0x7e, 0xff, 0x00, + 0xac, 0xaa, 0x21, 0x2b, 0x24, 0x73, 0xf5, 0xc7, + 0x03, 0x80, 0x19, 0xf3, 0x67, 0xcd, 0xc8, 0x3b, + 0x55, 0x15, 0x3d, 0xee, 0xd6, 0xc5, 0x28, 0xf5, + 0xe7, 0x7a, 0xa7, 0x01, 0x99, 0x46, 0x3e, 0x17, + 0x8c, 0xa3, 0x9c, 0x73, 0x13, 0x8b, 0x7a, 0x02, + 0x92, 0x28, 0x01, 0x33, 0x5a, 0x02, 0x5a, 0xdd, + 0x36, 0xc9, 0xaa, 0x67, 0x53, 0xba, 0xed, 0x65, + 0x49, 0xca, 0xb9, 0xa7, 0x35, 0xf7, 0xb9, 0xcf, + 0x6a, 0x95, 0xaf, 0x70, 0x60, 0x93, 0x29, 0x1e, + 0x23, 0xc5, 0x70, 0x42, 0x86, 0x5a, 0xab, 0x40, + 0x04, 0x8d, 0xb0, 0x7f, 0xd6, 0xfc, 0x96, 0x19, + 0xf1, 0x36, 0x7f, 0x2c, 0xf6, 0xe2, 0xd3, 0xab, + 0x39, 0xd5, 0x1b, 0x49, 0x36, 0xf1, 0x39, 0xbf, + 0xe7, 0xf8, 0x29, 0x65, 0x7e, 0xcf, 0xe2, 0x6c, + 0x6d, 0xf8, 0xaf, 0x85, 0xb6, 0x1c, 0xea, 0x76, + 0x08, 0xcb, 0x9a, 0x69, 0x9b, 0x86, 0x57, 0x38, + 0x92, 0xfe, 0x09, 0xcd, 0xc5, 0x60, 0xbc, 0x24, + 0xe0, 0xd3, 0x3b, 0x85, 0x46, 0x1c, 0x05, 0xe4, + 0x34, 0x0c, 0xfb, 0xe3, 0x65, 0x1c, 0x8e, 0x16, + 0x89, 0xb5, 0xce, 0x71, 0x77, 0x10, 0xb8, 0x6d, + 0x8a, 0xc3, 0x3e, 0x26, 0xcf, 0xe5, 0x9e, 0xdc, + 0x5a, 0x75, 0x67, 0x3a, 0xc4, 0xf6, 0xbe, 0x30, + 0xc8, 0x5d, 0x86, 0xa1, 0x8f, 0xde, 0x9d, 0x3b, + 0xd7, 0x6e, 0xd5, 0x9e, 0x23, 0x23, 0x46, 0xe4, + 0x1e, 0xd3, 0x3b, 0xc2, 0x7f, 0xbc, 0x77, 0x7e, + 0xe3, 0xd4, 0xde, 0xf1, 0xbf, 0x45, 0x93, 0xb2, + 0x27, 0xbf, 0x2a, 0xec, 0x18, 0x83, 0x6e, 0x1a, + 0xde, 0x3f, 0xeb, 0xd6, 0x9d, 0x50, 0xf8, 0x88, + 0x7c, 0x77, 0x85, 0xcc, 0x37, 0xe1, 0xf2, 0xa8, + 0x85, 0xcd, 0xb3, 0xf7, 0x28, 0xbc, 0x61, 0xad, + 0x39, 0x59, 0x32, 0x61, 0xef, 0x7b, 0xaf, 0xfe, + 0x90, 0x3d, 0x7c, 0x6a, 0x16, 0x3e, 0x1c, 0x4e, + 0x74, 0x12, 0x48, 0xe7, 0xe2, 0x37, 0xde, 0x97, + 0x7f, 0xea, 0x9d, 0x39, 0x80, 0x5b, 0xc5, 0xb2, + 0x99, 0x3c, 0x46, 0xc1, 0xd9, 0x4c, 0x2b, 0xc6, + 0x19, 0x0b, 0x1d, 0x8c, 0x32, 0xd1, 0x3e, 0x5c, + 0x2d, 0x6d, 0xef, 0x7c, 0xf7, 0xf4, 0x23, 0x81, + 0xa1, 0xee, 0x74, 0xae, 0x6b, 0x5f, 0x8e, 0xf6, + 0x16, 0x69, 0xf9, 0xaa, 0x38, 0xde, 0x2e, 0xc7, + 0xd6, 0x58, 0x8f, 0x80, 0x42, 0x43, 0x06, 0x16, + 0xb7, 0x2a, 0x08, 0x0e, 0x39, 0xec, 0xcb, 0x8f, + 0x8a, 0x7d, 0x4b, 0x62, 0xc9, 0xbb, 0x25, 0xc1, + 0x04, 0xd8, 0x10, 0xf6, 0x8b, 0xf3, 0x15, 0x51, + 0xe4, 0x81, 0x06, 0x91, 0x8f, 0x37, 0x27, 0x8c, + 0xb6, 0xfd, 0xeb, 0x1c, 0x31, 0x37, 0x25, 0x8a, + 0xcd, 0x9a, 0x39, 0x31, 0x5c, 0x7a, 0x79, 0x0f, + 0xd1, 0xfe, 0x1b, 0xb7, 0x40, 0x6c, 0x8e, 0x68, + 0xc9, 0xb7, 0x30, 0x2a, 0x95, 0x8c, 0xab, 0x32, + 0x3a, 0x7c, 0xd9, 0x9c, 0x6c, 0x0d, 0xed, 0xa5, + 0x43, 0x90, 0xac, 0x92, 0x66, 0x49, 0x26, 0x4a, + 0xf9, 0xc5, 0x8a, 0x96, 0x71, 0x58, 0xe3, 0x85, + 0xd6, 0x0c, 0xb9, 0xbd, 0xb9, 0x7d, 0x09, 0xdf, + 0xa6, 0x3c, 0xce, 0xd6, 0x09, 0x1d, 0x16, 0x7d, + 0x1e, 0xbf, 0x8a, 0x77, 0xe9, 0x8f, 0x33, 0xb5, + 0x82, 0x47, 0x45, 0x9f, 0x47, 0xaf, 0xe2, 0x84, + 0xf3, 0x57, 0x4d, 0x15, 0xde, 0x58, 0x03, 0x5b, + 0x8b, 0x88, 0x7a, 0x7d, 0x2a, 0x59, 0xa0, 0x9a, + 0x69, 0x69, 0xe3, 0x20, 0x63, 0x37, 0x0a, 0x46, + 0x97, 0xcc, 0x58, 0x1e, 0x58, 0x24, 0xce, 0x03, + 0xac, 0x83, 0x5d, 0xe3, 0x01, 0xc4, 0x5e, 0xc6, + 0xfa, 0x13, 0x89, 0x15, 0x00, 0x37, 0x49, 0xdf, + 0x66, 0x46, 0x40, 0x67, 0x31, 0x8d, 0x2f, 0x17, + 0xb0, 0x4d, 0x12, 0xbe, 0x56, 0x97, 0x34, 0x38, + 0x5c, 0x94, 0xda, 0x3f, 0x1a, 0x7b, 0x81, 0x23, + 0xca, 0x67, 0xd1, 0xc6, 0x7b, 0xd4, 0xf4, 0xfe, + 0x36, 0xf6, 0xe4, 0x89, 0x18, 0xae, 0x73, 0x9b, + 0xd8, 0x73, 0xa9, 0x1f, 0x25, 0x53, 0xe1, 0x86, + 0x3e, 0x13, 0xae, 0x4f, 0xc2, 0xc9, 0x86, 0x3a, + 0xc7, 0x4c, 0xc7, 0x8c, 0xc6, 0xe4, 0x11, 0xeb, + 0x0b, 0x14, 0xb5, 0x92, 0xc5, 0xe4, 0x8c, 0xa4, + 0x0d, 0xf6, 0x6b, 0xd8, 0x71, 0xa6, 0x18, 0x2b, + 0x64, 0x91, 0xaf, 0xbb, 0x5b, 0x7b, 0x83, 0x88, + 0x71, 0x69, 0x54, 0xf5, 0x3e, 0x32, 0xf7, 0x09, + 0x6f, 0x76, 0xdc, 0xef, 0x73, 0xa2, 0x0d, 0x5b, + 0xee, 0x29, 0xf2, 0xe7, 0x4f, 0x2d, 0xb0, 0xe9, + 0x51, 0x8f, 0x18, 0x91, 0xd8, 0xe3, 0x6b, 0xf4, + 0xf2, 0xa8, 0xbd, 0xdb, 0x7b, 0xb7, 0x3c, 0x5e, + 0x67, 0x64, 0xc8, 0x37, 0x8e, 0x4f, 0xb2, 0xb7, + 0x8c, 0x64, 0xa3, 0xed, 0x32, 0x41, 0x65, 0xb3, + 0x8e, 0xb1, 0xbf, 0x8a, 0xd9, 0xc7, 0x58, 0xdf, + 0xc5, 0x6c, 0xe3, 0xac, 0x6f, 0xe2, 0xb6, 0x71, + 0xd6, 0x37, 0xf1, 0x5b, 0x38, 0xeb, 0x1b, 0xf8, + 0xad, 0x9c, 0x75, 0x8d, 0xfc, 0x56, 0xce, 0x3a, + 0xc6, 0xfe, 0x2b, 0x35, 0x14, 0x2f, 0x70, 0x38, + 0x9a, 0xf7, 0x39, 0xb7, 0x69, 0xe7, 0x5a, 0x8f, + 0xe6, 0x37, 0xf1, 0x5b, 0x38, 0xeb, 0x1b, 0xf8, + 0xad, 0x9c, 0x75, 0x8d, 0xfc, 0x56, 0xce, 0x3a, + 0xc6, 0xfe, 0x2b, 0x1b, 0xa9, 0xda, 0x0e, 0x16, + 0xb7, 0x34, 0x8d, 0xe2, 0x16, 0xe5, 0x5b, 0x38, + 0xeb, 0x1b, 0xf8, 0xad, 0x9c, 0x75, 0x8d, 0xfc, + 0x56, 0xce, 0x3a, 0xc6, 0xfe, 0x2b, 0x67, 0x1d, + 0x63, 0x7f, 0x15, 0xb3, 0x8e, 0xb1, 0xbf, 0x8a, + 0xd9, 0xc7, 0x58, 0xdf, 0xc5, 0x0c, 0xb1, 0x8e, + 0x9d, 0xbc, 0x65, 0xcf, 0x07, 0xb9, 0x47, 0x4f, + 0x06, 0xa9, 0x9f, 0x58, 0xfd, 0x63, 0xcb, 0xb9, + 0x07, 0xb5, 0x1f, 0x78, 0x4f, 0xf7, 0x8e, 0xef, + 0xdc, 0x7a, 0x9a, 0x38, 0x58, 0x64, 0x7e, 0x51, + 0xb9, 0x82, 0xd9, 0x24, 0x5b, 0x24, 0x8b, 0x64, + 0x91, 0x6c, 0x92, 0x26, 0xc8, 0xda, 0x57, 0xdd, + 0xbc, 0x47, 0x42, 0x0c, 0xf1, 0x33, 0x83, 0x26, + 0x63, 0xc3, 0x6d, 0x37, 0xe3, 0xf5, 0xfe, 0x09, + 0xb2, 0xb6, 0x91, 0xc5, 0xc3, 0x94, 0x26, 0x35, + 0xb4, 0x57, 0x31, 0xbb, 0x13, 0x1c, 0xe6, 0xe7, + 0x6a, 0x6b, 0xfc, 0x47, 0x0e, 0x16, 0x3a, 0x30, + 0x00, 0xcd, 0x67, 0x5f, 0xd3, 0xfb, 0xca, 0x46, + 0xbe, 0x8c, 0x9b, 0x41, 0x92, 0x63, 0x4b, 0x78, + 0x5b, 0xfc, 0x59, 0xfb, 0x53, 0xb1, 0xf8, 0x3c, + 0x3e, 0x33, 0x61, 0x92, 0x2d, 0xde, 0x8b, 0x68, + 0xb6, 0x74, 0x18, 0x68, 0xc8, 0x01, 0xee, 0x7e, + 0xf5, 0xb6, 0xd3, 0x6f, 0xc1, 0x44, 0x1b, 0x46, + 0x4e, 0x4e, 0x5c, 0xa8, 0xb8, 0xe3, 0x58, 0x5d, + 0x4a, 0xe0, 0xc0, 0x24, 0x70, 0xde, 0xdf, 0x7c, + 0x59, 0x65, 0x6f, 0xec, 0xf1, 0x92, 0xc1, 0x83, + 0x25, 0x63, 0x86, 0xd7, 0xbf, 0x2d, 0xf4, 0xa2, + 0xf3, 0x43, 0x7b, 0xc6, 0x22, 0xc3, 0x87, 0x35, + 0xbf, 0xa0, 0xb0, 0x0f, 0x07, 0xe4, 0x9a, 0x5d, + 0x89, 0xd9, 0x36, 0xe9, 0x3c, 0xeb, 0x64, 0x91, + 0x6c, 0x92, 0x2d, 0x92, 0x45, 0xb2, 0x48, 0x8c, + 0x93, 0x40, 0xe8, 0xd9, 0x93, 0x76, 0x73, 0xbb, + 0xfc, 0x36, 0xaf, 0x06, 0x3e, 0x78, 0x9d, 0x13, + 0x18, 0x48, 0x7b, 0x9c, 0x38, 0x37, 0x72, 0x76, + 0x58, 0x60, 0x91, 0xa5, 0xd2, 0x81, 0xea, 0x6d, + 0x81, 0xe7, 0x70, 0x55, 0x4e, 0x64, 0x2f, 0x73, + 0x5c, 0x5b, 0x84, 0x81, 0xa6, 0xc4, 0xdd, 0x4f, + 0x59, 0xfd, 0xc3, 0xe9, 0xec, 0xd7, 0x72, 0x92, + 0xd0, 0x2c, 0xa7, 0xac, 0xfe, 0xe1, 0xf4, 0xf6, + 0x6b, 0xb9, 0x49, 0x68, 0x16, 0x43, 0xc5, 0xa9, + 0xc4, 0xe7, 0x2e, 0xeb, 0xde, 0x20, 0xfb, 0x6f, + 0x5b, 0xca, 0xab, 0x9b, 0x24, 0x59, 0x39, 0x44, + 0x91, 0xbd, 0xcc, 0x0d, 0xc3, 0x61, 0x67, 0x71, + 0x2a, 0xe3, 0x33, 0xb7, 0x8d, 0xab, 0x66, 0x9e, + 0x2d, 0xf1, 0x41, 0xb9, 0x29, 0xa2, 0x75, 0xa6, + 0x78, 0x74, 0xd2, 0x07, 0x1d, 0x59, 0xd1, 0x99, + 0x78, 0x35, 0xb7, 0x36, 0xf1, 0x79, 0x3b, 0xde, + 0xa9, 0x65, 0x64, 0x32, 0xca, 0xd6, 0x44, 0xe0, + 0xe2, 0xd9, 0x03, 0x58, 0x34, 0xde, 0xf9, 0x94, + 0x0f, 0xb6, 0xf5, 0xd0, 0x47, 0x63, 0xcb, 0xbd, + 0x0a, 0xa6, 0x6b, 0xf9, 0x48, 0xa4, 0x7c, 0x03, + 0xfd, 0x47, 0xff, 0x00, 0xf6, 0xaa, 0x1d, 0x2b, + 0x64, 0x2e, 0x9a, 0xa9, 0xce, 0x19, 0x37, 0x06, + 0xe6, 0x69, 0xf5, 0x72, 0x93, 0xcc, 0xaa, 0xa1, + 0x87, 0x85, 0x2b, 0x99, 0x53, 0x1b, 0x3e, 0xd0, + 0xb1, 0xcd, 0xda, 0x98, 0x24, 0x20, 0x48, 0x73, + 0x98, 0xf8, 0xdb, 0xeb, 0x55, 0x0f, 0x2c, 0x12, + 0x47, 0xe2, 0x31, 0xd9, 0xa7, 0x41, 0xe0, 0x2f, + 0x06, 0x3a, 0x9e, 0x31, 0x14, 0x39, 0x5e, 0x03, + 0x78, 0xa4, 0xb8, 0xf9, 0x59, 0x45, 0x0b, 0xcf, + 0x92, 0x2d, 0x32, 0xf4, 0x64, 0x77, 0xfc, 0x71, + 0x27, 0xc8, 0xee, 0x13, 0xe8, 0x9c, 0xe3, 0xd6, + 0x2a, 0x7f, 0x70, 0xce, 0xe5, 0x17, 0xbb, 0x6f, + 0x77, 0xed, 0x50, 0x7b, 0x51, 0xf7, 0x84, 0xff, + 0x00, 0x78, 0xee, 0xfd, 0xc7, 0xa9, 0xa4, 0x85, + 0xe6, 0x37, 0xe5, 0x1b, 0x9c, 0x2d, 0xae, 0x45, + 0xb5, 0xc8, 0xb6, 0xb9, 0x16, 0xd7, 0x22, 0x11, + 0xc7, 0x51, 0x2b, 0xde, 0x78, 0x82, 0x64, 0x79, + 0x67, 0xdd, 0xf7, 0xc2, 0x71, 0xb6, 0xc6, 0xda, + 0x73, 0xe8, 0x41, 0xef, 0xa8, 0x76, 0x02, 0x6d, + 0x89, 0xaf, 0x0e, 0x1d, 0x8b, 0x2b, 0x95, 0x93, + 0x0d, 0xb1, 0x70, 0x85, 0xed, 0xcb, 0x6d, 0x29, + 0xb1, 0x45, 0x53, 0x23, 0x9e, 0xed, 0x02, 0xe8, + 0x83, 0x55, 0x20, 0x21, 0x6d, 0x72, 0x2d, 0xae, + 0x45, 0x85, 0xf5, 0x32, 0x03, 0x60, 0xed, 0x3c, + 0xa2, 0xeb, 0x6b, 0x91, 0x00, 0x2a, 0xa4, 0x24, + 0xf1, 0x05, 0xb5, 0x48, 0xb6, 0xb9, 0x16, 0xd7, + 0x22, 0xda, 0xe4, 0x5b, 0x5c, 0x8b, 0x6b, 0x91, + 0x18, 0xe6, 0x9d, 0xd2, 0x33, 0x26, 0xec, 0xc7, + 0x77, 0xf8, 0x6d, 0xfa, 0x63, 0x0b, 0x1c, 0x71, + 0x1c, 0x22, 0xc3, 0x49, 0xe4, 0x57, 0x75, 0x2c, + 0xcd, 0x1a, 0x33, 0xc6, 0x51, 0x7c, 0x94, 0xd3, + 0x46, 0xc1, 0xf5, 0x9c, 0xc2, 0x02, 0x2e, 0x75, + 0x2c, 0xcd, 0x68, 0xce, 0x49, 0x8c, 0xab, 0x31, + 0xa5, 0xe7, 0x91, 0xa1, 0x1c, 0x8c, 0x32, 0x4b, + 0x6d, 0x38, 0x1b, 0x7b, 0x27, 0x81, 0x0c, 0x84, + 0xb3, 0x85, 0xbd, 0x3b, 0xdf, 0x5a, 0x32, 0x08, + 0xde, 0x63, 0x1a, 0x5e, 0x1b, 0x98, 0x6e, 0xc6, + 0xc7, 0x5b, 0xc9, 0xe6, 0x07, 0x8e, 0xdc, 0x8b, + 0x1b, 0x6d, 0x8a, 0xc4, 0x02, 0x78, 0xbe, 0x84, + 0x5e, 0xed, 0xbd, 0xdf, 0xb5, 0x41, 0xed, 0x47, + 0xde, 0x13, 0xfd, 0xe3, 0xbb, 0xf7, 0x1f, 0xfd, + 0x71, 0x29, 0xbd, 0xe3, 0x7e, 0x8d, 0x7e, 0x1d, + 0x66, 0x47, 0x37, 0xab, 0x10, 0xbf, 0x62, 0x6d, + 0xcb, 0x85, 0x3e, 0xfe, 0xfc, 0x97, 0xc9, 0x94, + 0x32, 0x4f, 0x7c, 0xcc, 0x9a, 0x41, 0x89, 0xce, + 0x6e, 0x1c, 0x38, 0x78, 0xb4, 0xfa, 0x55, 0x46, + 0x4f, 0x16, 0x57, 0x28, 0x70, 0xe1, 0xe4, 0xe2, + 0xec, 0x55, 0x32, 0x99, 0x5b, 0x0d, 0x9b, 0x93, + 0x6b, 0xdf, 0x7d, 0x2e, 0xf5, 0x7a, 0x2e, 0xaa, + 0xea, 0x80, 0x8e, 0x6b, 0xc6, 0xd9, 0x59, 0x9a, + 0xed, 0xb9, 0x20, 0x13, 0x6f, 0x5d, 0xd4, 0x32, + 0x0a, 0x26, 0x17, 0x54, 0x3c, 0xe2, 0x8c, 0xb7, + 0xd0, 0xde, 0x0f, 0x26, 0x9b, 0xfc, 0x55, 0x3b, + 0x64, 0x75, 0x3b, 0x5b, 0x24, 0x65, 0xcf, 0xc6, + 0xd2, 0x64, 0xbe, 0x7d, 0x06, 0xc9, 0xf3, 0x17, + 0x40, 0xd7, 0xe1, 0x81, 0x80, 0xce, 0xdc, 0x40, + 0x0c, 0x9f, 0xa8, 0xa0, 0xda, 0x76, 0x46, 0xec, + 0xac, 0xef, 0x68, 0x7e, 0x1e, 0x2b, 0x37, 0x30, + 0xba, 0x8f, 0x0b, 0x63, 0xc7, 0x0d, 0x54, 0x71, + 0xef, 0x21, 0xc2, 0x05, 0xef, 0x71, 0x7e, 0x3f, + 0x8a, 0xa7, 0x7e, 0x46, 0x29, 0x0d, 0x44, 0xee, + 0x6b, 0xee, 0xc1, 0xa3, 0x36, 0x61, 0xc9, 0xa5, + 0x41, 0x0c, 0x6c, 0x66, 0x87, 0x12, 0xfb, 0x67, + 0x3b, 0xf7, 0x0d, 0x3f, 0x47, 0xf8, 0x6e, 0xdd, + 0xfe, 0x1b, 0x7e, 0x9d, 0x0f, 0xf9, 0xd1, 0xff, + 0x00, 0x15, 0x06, 0x0a, 0x99, 0x64, 0x77, 0x8c, + 0x37, 0x7a, 0xe8, 0xec, 0x38, 0x5e, 0xb4, 0xfc, + 0x15, 0x32, 0xc8, 0xec, 0x5c, 0x17, 0x47, 0x61, + 0xde, 0xaa, 0xbf, 0x49, 0x97, 0x29, 0x88, 0xf9, + 0x3c, 0x9e, 0x6e, 0x7b, 0xac, 0x0d, 0x36, 0x6b, + 0xc1, 0xc5, 0xe9, 0xcc, 0x54, 0xd1, 0xc9, 0x3b, + 0xa1, 0x2e, 0x91, 0x87, 0x7a, 0xdb, 0xe8, 0x0e, + 0xfc, 0x54, 0x11, 0xcf, 0x31, 0x61, 0x6d, 0x49, + 0x31, 0x96, 0x7f, 0x79, 0xc1, 0xd3, 0xc9, 0xc5, + 0xce, 0xa0, 0x6b, 0xce, 0x0a, 0x9c, 0x9c, 0x81, + 0xb0, 0x0e, 0x0b, 0xae, 0x5d, 0xa7, 0xb7, 0x9b, + 0xf5, 0x11, 0x7b, 0xb6, 0xf7, 0x7e, 0xd5, 0x07, + 0xb5, 0x1f, 0x78, 0x4f, 0xf7, 0x8e, 0xef, 0xdc, + 0x7f, 0xc3, 0xb9, 0x4a, 0xd8, 0x58, 0x64, 0x79, + 0x94, 0x66, 0x0b, 0x64, 0x91, 0x6c, 0x92, 0x2d, + 0x92, 0x45, 0xb2, 0x48, 0x84, 0x91, 0xd3, 0xca, + 0xc7, 0x8d, 0x04, 0x26, 0xb8, 0xc2, 0xfb, 0xb4, + 0x10, 0x2c, 0xd0, 0x00, 0xbe, 0x9c, 0xc9, 0xd1, + 0x0a, 0x69, 0x32, 0x6e, 0x20, 0x91, 0x65, 0x92, + 0xc9, 0x49, 0x82, 0xd8, 0x74, 0x0b, 0xdb, 0x92, + 0xfa, 0x56, 0x4b, 0xc5, 0xa4, 0xc9, 0xe2, 0xc5, + 0x6b, 0x71, 0xa6, 0x61, 0x81, 0xfb, 0xc0, 0x5a, + 0x06, 0x10, 0x73, 0x1e, 0x24, 0xf3, 0x92, 0x92, + 0xef, 0x37, 0x3b, 0xd1, 0xd9, 0xc8, 0xb2, 0x4d, + 0x82, 0x40, 0xcc, 0xff, 0x00, 0x54, 0x5c, 0x7a, + 0x8f, 0x12, 0x2e, 0x10, 0x3f, 0x38, 0x0d, 0x20, + 0xb0, 0x11, 0x9b, 0x46, 0x65, 0x67, 0xc1, 0x2b, + 0xb7, 0xc5, 0xff, 0x00, 0x13, 0xff, 0x00, 0xc5, + 0x7c, 0x8b, 0xf4, 0xdf, 0x80, 0xdd, 0x3c, 0xbe, + 0xbf, 0x4a, 0x71, 0x6c, 0x0f, 0x18, 0x8e, 0x2e, + 0x03, 0x73, 0x1e, 0x51, 0xc9, 0xf0, 0x4c, 0x0e, + 0xa6, 0x90, 0x86, 0x0c, 0x2d, 0xcd, 0xe9, 0xbf, + 0xcd, 0x6c, 0x92, 0x2d, 0x92, 0x45, 0xb2, 0x48, + 0xb6, 0x49, 0x11, 0x92, 0x68, 0x1d, 0x1b, 0x32, + 0x6e, 0xce, 0x77, 0x41, 0x6c, 0x6e, 0x70, 0xc9, + 0xb7, 0x38, 0x0b, 0x53, 0x27, 0x45, 0x6a, 0x64, + 0xe8, 0xad, 0x4c, 0x9d, 0x15, 0xa9, 0x93, 0xa2, + 0xb5, 0x32, 0x74, 0x56, 0xa6, 0x4e, 0x8a, 0x88, + 0x36, 0x03, 0xe4, 0xe5, 0xca, 0x8b, 0xb0, 0xe9, + 0xfe, 0x82, 0x6c, 0x8d, 0xf0, 0x6c, 0x6c, 0x78, + 0x70, 0x70, 0x70, 0x63, 0xf4, 0xdf, 0xd6, 0x9c, + 0x3f, 0xb3, 0x99, 0x19, 0x3f, 0x5d, 0xac, 0x7d, + 0xfb, 0xd3, 0xdc, 0xff, 0x00, 0x06, 0xc7, 0x8d, + 0xfa, 0x5f, 0x81, 0xf7, 0xef, 0x45, 0xe2, 0x8f, + 0x2a, 0xee, 0x23, 0x23, 0x1d, 0x9b, 0x99, 0x49, + 0xfa, 0x0b, 0x5d, 0x1b, 0xcd, 0xf2, 0x66, 0x37, + 0x58, 0x7a, 0x91, 0x73, 0xe9, 0xb2, 0xae, 0xc7, + 0x94, 0x69, 0x7c, 0x67, 0x7a, 0x7d, 0x08, 0x5e, + 0x9f, 0x14, 0x80, 0x10, 0xd9, 0x5c, 0xc3, 0x89, + 0xb7, 0xff, 0x00, 0xea, 0xd4, 0xc9, 0xd1, 0x5a, + 0x99, 0x3a, 0x2b, 0x53, 0x27, 0x45, 0x6a, 0x64, + 0xe8, 0xad, 0x4c, 0x9d, 0x15, 0xa9, 0x93, 0xa2, + 0xb5, 0x32, 0x74, 0x54, 0x7e, 0xed, 0xbd, 0xdf, + 0xb5, 0x41, 0xed, 0x47, 0xde, 0x13, 0xfd, 0xe3, + 0xbb, 0xf7, 0x1f, 0xf0, 0xee, 0x51, 0x96, 0x38, + 0xb4, 0xe5, 0xf8, 0x8f, 0xee, 0xad, 0x74, 0x9d, + 0x25, 0xae, 0x93, 0xa4, 0x9f, 0x53, 0x96, 0x76, + 0x4d, 0xae, 0xc3, 0xc3, 0x37, 0xfe, 0xb3, 0x8e, + 0x75, 0x1c, 0xaf, 0xf0, 0x83, 0x21, 0x12, 0x5c, + 0x80, 0xf7, 0xbe, 0xfa, 0x6d, 0xc8, 0x81, 0xf1, + 0xd6, 0xb3, 0x11, 0x21, 0x98, 0xa4, 0x3b, 0xff, + 0x00, 0x57, 0xe6, 0x8b, 0x5d, 0x2c, 0x81, 0xc0, + 0xd8, 0xef, 0x94, 0x4f, 0xf1, 0xe6, 0x30, 0xcb, + 0xc1, 0x63, 0xe4, 0x70, 0x27, 0x3d, 0xbd, 0x4a, + 0x7c, 0xa5, 0x57, 0x8b, 0xe4, 0x48, 0x6b, 0xb2, + 0xae, 0x76, 0x9c, 0xfc, 0x9e, 0xa5, 0x81, 0x95, + 0xa2, 0x40, 0x1b, 0x8d, 0xd2, 0x07, 0xbb, 0x0b, + 0x42, 0x61, 0xf1, 0x9c, 0xab, 0x1f, 0xa1, 0xec, + 0x79, 0xb2, 0x21, 0xb3, 0xb9, 0xa1, 0xa3, 0x13, + 0x9c, 0xe7, 0x9b, 0x00, 0x9c, 0xf1, 0x55, 0x94, + 0x8c, 0x33, 0x1e, 0x36, 0xbc, 0xe7, 0xce, 0x07, + 0xcd, 0x09, 0xf2, 0xee, 0xc2, 0x5f, 0x83, 0x84, + 0x6e, 0xa1, 0x7b, 0xe6, 0x75, 0xa5, 0x6e, 0x21, + 0x67, 0x9f, 0xeb, 0x91, 0x17, 0x8a, 0x82, 0xdd, + 0x21, 0xa1, 0xcf, 0x37, 0x71, 0xb5, 0xf3, 0x28, + 0xe2, 0x6c, 0xcf, 0xc4, 0xf7, 0x06, 0x8b, 0xb8, + 0xa3, 0x46, 0x27, 0x22, 0x40, 0x48, 0xb9, 0x79, + 0xb6, 0x64, 0xc0, 0xda, 0xd6, 0x99, 0x5e, 0xd0, + 0xf1, 0x0e, 0x51, 0xd8, 0xb3, 0x85, 0x95, 0x75, + 0x70, 0x81, 0xb8, 0x8b, 0x06, 0x51, 0xee, 0xe2, + 0xb7, 0x20, 0xf4, 0xad, 0x73, 0xfa, 0x45, 0x6b, + 0xa4, 0xe9, 0x2a, 0xa0, 0xe9, 0x1c, 0xe1, 0xe2, + 0xee, 0xd2, 0x7d, 0x23, 0x76, 0x06, 0x43, 0x3b, + 0x98, 0xdc, 0x8b, 0x4d, 0x82, 0xda, 0xe4, 0x5b, + 0x5c, 0x8a, 0x49, 0xbc, 0x6d, 0xd8, 0x58, 0x43, + 0x4e, 0x7e, 0x5b, 0xfe, 0x0a, 0x37, 0x78, 0xe9, + 0x6b, 0x1c, 0xd2, 0xfc, 0x4e, 0x3c, 0x10, 0x0d, + 0xb3, 0xa8, 0x98, 0xdf, 0x08, 0x07, 0x36, 0x40, + 0x48, 0x90, 0x3b, 0x7b, 0x9b, 0x4f, 0x15, 0xd3, + 0x64, 0x15, 0xf9, 0x68, 0xdc, 0x6d, 0x8a, 0x33, + 0xc7, 0xcc, 0xa3, 0x95, 0xfe, 0x15, 0x64, 0x22, + 0x4b, 0x90, 0x1e, 0x4d, 0xf4, 0xdb, 0x91, 0x11, + 0xe3, 0x8f, 0x3e, 0x90, 0xb2, 0xbe, 0x38, 0x70, + 0xe4, 0xf2, 0xba, 0x78, 0xb1, 0x61, 0x51, 0xcc, + 0xea, 0xc3, 0x67, 0xf1, 0x03, 0x9f, 0x40, 0x3f, + 0x35, 0xbe, 0xae, 0x23, 0xc9, 0x89, 0x00, 0xbe, + 0x9b, 0xa8, 0xe1, 0x6d, 0x5b, 0xc3, 0x9e, 0xe0, + 0xd1, 0x72, 0xb6, 0xb9, 0x13, 0x1c, 0x7c, 0x20, + 0x22, 0xca, 0x70, 0x04, 0x8e, 0xe1, 0x76, 0x22, + 0xd7, 0x55, 0x48, 0x1c, 0x0d, 0x8a, 0xda, 0xe4, + 0x5b, 0x5c, 0x8a, 0x49, 0x45, 0x5b, 0xb0, 0xc7, + 0x6b, 0xe7, 0xe5, 0x5b, 0x5c, 0x8b, 0x6b, 0x91, + 0x6d, 0x72, 0x27, 0x5f, 0x90, 0x77, 0x7e, 0xd5, + 0x07, 0xb5, 0x1f, 0x78, 0x4f, 0xf7, 0x8f, 0xef, + 0xdc, 0x7f, 0xc3, 0xb9, 0x47, 0xfe, 0x63, 0xfe, + 0x3b, 0xb0, 0xd1, 0xba, 0x57, 0x09, 0x5d, 0x0e, + 0x03, 0x1e, 0x0c, 0xd8, 0x9d, 0x9c, 0x67, 0xbf, + 0xb3, 0xcc, 0xa8, 0x43, 0xa8, 0xdb, 0x50, 0x70, + 0x3b, 0x3b, 0xb1, 0x66, 0xdf, 0x9e, 0x42, 0xa0, + 0x8a, 0xa2, 0x8b, 0x2d, 0x0b, 0x89, 0xc9, 0x16, + 0x13, 0x89, 0xb9, 0xf4, 0x7e, 0x45, 0x4c, 0xc1, + 0x77, 0x46, 0xc7, 0x96, 0x07, 0xf2, 0xaf, 0x07, + 0x36, 0x36, 0x17, 0x92, 0xc7, 0x0b, 0x01, 0xfb, + 0xe5, 0x78, 0x48, 0xe4, 0x9b, 0x52, 0x03, 0xe2, + 0x6d, 0xae, 0x74, 0xd8, 0xe7, 0xcc, 0xa5, 0x7c, + 0x14, 0x8d, 0x0d, 0xc9, 0xef, 0xe1, 0xce, 0x41, + 0x6f, 0xc7, 0x3a, 0x86, 0x78, 0x61, 0x7c, 0x38, + 0xf1, 0x62, 0x8c, 0xe7, 0xb5, 0xad, 0x9f, 0xd5, + 0x9d, 0x4a, 0xe8, 0xa3, 0x13, 0x00, 0xcf, 0x29, + 0x19, 0xe3, 0x6a, 0x96, 0xa5, 0xb4, 0xd8, 0x03, + 0xe1, 0x70, 0x30, 0x3d, 0xc6, 0xd9, 0x9c, 0xcc, + 0xfc, 0xbc, 0x7d, 0x8a, 0x9a, 0x38, 0xe1, 0x6d, + 0x38, 0x75, 0x49, 0x6e, 0xf4, 0x93, 0xc4, 0x33, + 0xe7, 0x55, 0x26, 0x19, 0x1e, 0xf2, 0xc7, 0xe5, + 0x43, 0x5c, 0xcc, 0x38, 0x5b, 0xc1, 0xe5, 0xf6, + 0x79, 0x94, 0x74, 0xd1, 0xe6, 0x92, 0x56, 0xe5, + 0x72, 0xc4, 0x7c, 0x1c, 0x07, 0x26, 0x65, 0x4d, + 0x86, 0xe1, 0xb9, 0x76, 0xda, 0xfa, 0x78, 0x4a, + 0x0a, 0xaf, 0xad, 0x39, 0x64, 0x3c, 0xc7, 0x3f, + 0xfb, 0x5b, 0xce, 0xa8, 0xb0, 0x03, 0xaa, 0x88, + 0xe2, 0xe4, 0xde, 0x8c, 0xe9, 0xac, 0x34, 0x66, + 0x68, 0x64, 0xa9, 0x7e, 0x17, 0x87, 0x1e, 0x3b, + 0x7e, 0x49, 0xed, 0x07, 0x10, 0x6b, 0x88, 0x07, + 0x97, 0x72, 0xaf, 0xfc, 0xbb, 0xbb, 0xc6, 0xec, + 0x1f, 0xe5, 0xd9, 0xbb, 0x58, 0xd6, 0x8c, 0x4e, + 0xc5, 0x1b, 0xac, 0x39, 0x37, 0xdf, 0x88, 0x54, + 0xc1, 0xb0, 0x89, 0x0b, 0x61, 0x71, 0x96, 0x27, + 0xfd, 0x82, 0xe5, 0x4b, 0x51, 0x1c, 0x06, 0x2c, + 0xa3, 0x65, 0xbc, 0x2e, 0x37, 0xd0, 0xce, 0x2f, + 0x42, 0x6b, 0xc4, 0x3e, 0x2c, 0x1b, 0x2d, 0xb0, + 0x0b, 0xd9, 0xd7, 0x1a, 0x73, 0xfa, 0x95, 0x06, + 0x5e, 0x39, 0x5e, 0xec, 0x0e, 0xb6, 0x4d, 0xe0, + 0x7d, 0x73, 0xe8, 0x5e, 0x0f, 0x2d, 0x07, 0x0f, + 0x8b, 0x49, 0xde, 0xf4, 0x1a, 0x34, 0xba, 0x90, + 0x01, 0xd7, 0xa7, 0x62, 0x81, 0x95, 0x0c, 0xf1, + 0x97, 0x35, 0xb8, 0x89, 0x16, 0x01, 0xad, 0x1c, + 0x4a, 0x6d, 0xe8, 0x63, 0x0d, 0x24, 0x3b, 0xd1, + 0xc4, 0x31, 0x31, 0x4c, 0xd9, 0x06, 0xf1, 0x95, + 0x91, 0xb5, 0x99, 0xb4, 0x0c, 0x47, 0x30, 0xec, + 0x4c, 0x7c, 0x87, 0x13, 0x9b, 0x31, 0x68, 0xf4, + 0x0b, 0x0c, 0xca, 0x9e, 0x2a, 0x8a, 0x3f, 0x18, + 0x85, 0xda, 0xa7, 0xb0, 0xef, 0x86, 0x7f, 0xeb, + 0x31, 0x54, 0x94, 0xcd, 0x25, 0xd4, 0xb8, 0x24, + 0x6b, 0x8f, 0x13, 0x80, 0x73, 0xf4, 0xaa, 0x56, + 0xe2, 0x94, 0xc6, 0xf8, 0x9c, 0x5d, 0x14, 0x71, + 0x62, 0x0f, 0xd3, 0x7b, 0x9b, 0xa3, 0x09, 0x74, + 0xae, 0x83, 0x22, 0xc2, 0x23, 0x11, 0x6f, 0x1b, + 0xa3, 0x7d, 0x7b, 0xaf, 0x09, 0x36, 0x4b, 0xe0, + 0x64, 0xcd, 0x6b, 0x2e, 0x34, 0x0b, 0x9c, 0xc3, + 0xe8, 0x3b, 0xd4, 0xde, 0xef, 0xda, 0xa0, 0xf5, + 0xc7, 0xde, 0x13, 0xfd, 0xe3, 0xfb, 0xf7, 0x1f, + 0xf0, 0xee, 0x51, 0xff, 0x00, 0x98, 0xff, 0x00, + 0x8e, 0xee, 0x50, 0xbd, 0xc5, 0xfa, 0x71, 0x5f, + 0x3a, 0xc2, 0xca, 0xa9, 0x9a, 0x39, 0x04, 0x85, + 0x3e, 0xd5, 0x12, 0x8c, 0x79, 0xdd, 0x67, 0x9c, + 0xeb, 0x25, 0xf5, 0x71, 0x62, 0x59, 0x26, 0xd4, + 0x4a, 0xd8, 0xfe, 0xc0, 0x79, 0xb2, 0x39, 0x19, + 0xa4, 0x8a, 0xfa, 0x70, 0x3a, 0xd7, 0x42, 0x47, + 0x4f, 0x23, 0xa4, 0x6e, 0x87, 0x97, 0x9b, 0x84, + 0xf7, 0x3e, 0x47, 0x48, 0xe7, 0xb7, 0x01, 0x2f, + 0x37, 0xcc, 0x83, 0x98, 0xe2, 0xc7, 0x0e, 0x36, + 0x9b, 0x27, 0x39, 0xf2, 0xbd, 0xce, 0x70, 0xb1, + 0x25, 0xda, 0x42, 0xb3, 0x5e, 0xe6, 0x8d, 0x39, + 0x8a, 0x38, 0x5c, 0x45, 0xc5, 0x8d, 0x96, 0x06, + 0xcc, 0xf6, 0xb2, 0xf7, 0xc2, 0x1d, 0x99, 0x65, + 0x4b, 0xdc, 0x64, 0xbd, 0xf1, 0xdf, 0x3d, 0xd3, + 0x6c, 0xf7, 0x0c, 0x27, 0x10, 0xb1, 0xd0, 0x56, + 0x48, 0xd4, 0x4a, 0x62, 0xb5, 0xb0, 0x63, 0x36, + 0x4e, 0x6c, 0x72, 0xbd, 0x8d, 0x76, 0x90, 0xd7, + 0x5a, 0xfb, 0xb5, 0x7f, 0xe5, 0xdd, 0xde, 0x37, + 0x60, 0xff, 0x00, 0x2e, 0xcd, 0xdc, 0x51, 0xbd, + 0xd1, 0xbb, 0x95, 0xa6, 0xc5, 0x65, 0x72, 0x8f, + 0xca, 0xfd, 0xbc, 0x59, 0xd0, 0x9b, 0x2d, 0x26, + 0x54, 0x7d, 0x7c, 0x46, 0xfc, 0xe8, 0x19, 0xa5, + 0x7c, 0xa4, 0x7d, 0xb7, 0x5d, 0x34, 0x17, 0x12, + 0x1b, 0xa0, 0x72, 0x2c, 0x0d, 0x95, 0xed, 0x67, + 0xd9, 0x0e, 0xcc, 0x86, 0x19, 0x5e, 0x2c, 0x2c, + 0x2c, 0xef, 0x4d, 0xfb, 0xd6, 0x1c, 0x47, 0x0d, + 0xef, 0x6f, 0x4a, 0x3b, 0xf7, 0x67, 0x18, 0x74, + 0xf1, 0x72, 0x20, 0xd8, 0xc3, 0xe2, 0x37, 0x07, + 0x11, 0x94, 0xba, 0xd6, 0xd1, 0x87, 0x91, 0x61, + 0xc4, 0x70, 0xde, 0xf6, 0x45, 0xb1, 0xcd, 0x24, + 0x6d, 0x3a, 0x43, 0x5d, 0x65, 0x14, 0x4d, 0x73, + 0xa3, 0x63, 0x59, 0x81, 0xc0, 0x3b, 0x33, 0xb3, + 0x93, 0xf3, 0x46, 0x36, 0xca, 0xf1, 0x19, 0xd2, + 0xc0, 0xec, 0xc5, 0x64, 0xb2, 0xaf, 0xc9, 0x7d, + 0x8c, 0x59, 0x96, 0x17, 0xca, 0xf7, 0xb7, 0x45, + 0x8b, 0xbe, 0x83, 0xbd, 0x4d, 0xee, 0xfd, 0xaa, + 0x9f, 0xd7, 0x1f, 0x78, 0x4f, 0xf7, 0x8f, 0xef, + 0xdc, 0x7f, 0xc3, 0xb9, 0x33, 0xd1, 0x51, 0xff, + 0x00, 0x1f, 0xa7, 0x93, 0x2c, 0x19, 0x79, 0x1a, + 0xe9, 0xda, 0xeb, 0x67, 0xb0, 0xe2, 0xec, 0x72, + 0x61, 0x74, 0xe1, 0x93, 0x48, 0xdc, 0x6c, 0x8e, + 0xda, 0x47, 0xaf, 0xe0, 0x9b, 0x04, 0x75, 0x0d, + 0x92, 0x6c, 0xa6, 0x4d, 0xcd, 0x22, 0xd6, 0x3f, + 0x30, 0x8c, 0x8c, 0x93, 0xc6, 0x22, 0xc1, 0x28, + 0xdf, 0x32, 0xd6, 0x70, 0x61, 0x28, 0x8c, 0xb5, + 0xe7, 0x6b, 0x04, 0x8e, 0x8f, 0x0f, 0x17, 0xaf, + 0xe2, 0x9f, 0x4c, 0x27, 0x73, 0xf0, 0x5e, 0xe5, + 0x91, 0x5c, 0x93, 0x7d, 0x00, 0x2a, 0x8c, 0x6e, + 0x79, 0x99, 0xae, 0x8f, 0x06, 0xf2, 0xdc, 0x20, + 0x4f, 0x2a, 0xc9, 0x32, 0xa3, 0x13, 0xdb, 0x2b, + 0x62, 0x93, 0x79, 0xc1, 0xb9, 0xb6, 0x6e, 0x55, + 0x94, 0x35, 0x27, 0x01, 0x71, 0x60, 0x76, 0x4f, + 0x35, 0xc7, 0x2f, 0x27, 0xd3, 0xab, 0x3c, 0x5e, + 0x2e, 0x7b, 0xc6, 0xed, 0x3f, 0xf9, 0x76, 0x7d, + 0x0a, 0x38, 0xaf, 0x87, 0x2b, 0x1c, 0xb2, 0xb8, + 0x9f, 0x53, 0x9a, 0x3b, 0xbb, 0x55, 0x48, 0x65, + 0x44, 0x53, 0x97, 0x3e, 0x31, 0xe4, 0xef, 0x9b, + 0x4f, 0x28, 0x4f, 0x8d, 0xb2, 0x3d, 0x99, 0x19, + 0x03, 0x24, 0x7b, 0xed, 0x62, 0x2f, 0x6b, 0x8e, + 0x45, 0x55, 0x8e, 0x9e, 0x76, 0x38, 0x43, 0x8b, + 0x0c, 0x84, 0x7d, 0xa1, 0x9c, 0x1b, 0x7a, 0x53, + 0x84, 0x6e, 0x2c, 0x7c, 0x74, 0x78, 0xae, 0x39, + 0x5c, 0xf0, 0x7b, 0x88, 0x4d, 0x7c, 0xd8, 0x9d, + 0x24, 0x6f, 0x20, 0xb9, 0x83, 0x7e, 0xf6, 0xe1, + 0xbd, 0xbd, 0x79, 0xbb, 0x53, 0xe4, 0x0c, 0x9a, + 0x27, 0x60, 0xc6, 0x23, 0x97, 0x4e, 0x9b, 0x1e, + 0xf0, 0x9d, 0x4e, 0xd9, 0x1c, 0x3c, 0xb4, 0x4c, + 0x75, 0xf4, 0x5f, 0x0b, 0xaf, 0xcc, 0x9e, 0xf8, + 0x05, 0x43, 0xc4, 0x6d, 0xbb, 0xa2, 0x19, 0xde, + 0x73, 0xe6, 0xb6, 0x6f, 0xea, 0xc9, 0xc7, 0x7e, + 0xc6, 0x88, 0x71, 0x81, 0x20, 0xdf, 0x36, 0xf9, + 0x85, 0xfe, 0x25, 0x78, 0x9e, 0x6f, 0x13, 0x12, + 0xe4, 0x72, 0x16, 0xcd, 0x6b, 0xdb, 0x9d, 0x56, + 0xc6, 0xda, 0x89, 0x2d, 0x09, 0x6b, 0x59, 0x9f, + 0x46, 0x75, 0x48, 0xca, 0x77, 0xe0, 0x92, 0x76, + 0x99, 0x5e, 0xfb, 0x81, 0x88, 0xe2, 0x3a, 0x49, + 0xf5, 0x29, 0xa0, 0x99, 0x8c, 0x66, 0x5e, 0x33, + 0x76, 0xc7, 0xc1, 0xbd, 0xae, 0x0f, 0xd0, 0xb2, + 0x77, 0xa8, 0x77, 0x7e, 0xd5, 0x4f, 0xeb, 0x8f, + 0xbc, 0x27, 0xfb, 0xc7, 0xf7, 0xee, 0x3f, 0xe1, + 0xdc, 0xa6, 0xa4, 0x39, 0xb2, 0x9c, 0x12, 0x78, + 0x9c, 0x34, 0x27, 0x47, 0x23, 0x4b, 0x1e, 0xdc, + 0xc4, 0x1f, 0xa5, 0x1e, 0x07, 0xc9, 0xe2, 0x6d, + 0xc2, 0xdc, 0x8d, 0xf4, 0xb7, 0x8d, 0x46, 0x5c, + 0xd9, 0x0c, 0xb0, 0xb4, 0xb1, 0x9c, 0x87, 0x39, + 0xb1, 0x3c, 0xe9, 0xb5, 0x50, 0xc7, 0x26, 0x54, + 0xcb, 0x94, 0x76, 0x2d, 0x03, 0x94, 0x05, 0xae, + 0xaa, 0x9c, 0x61, 0x90, 0x79, 0x53, 0xa2, 0xed, + 0x20, 0x2b, 0x65, 0xaa, 0x43, 0xb0, 0x06, 0xe4, + 0x81, 0xf2, 0x7f, 0xd7, 0xa1, 0x57, 0xb8, 0xe5, + 0x19, 0x1d, 0x49, 0x36, 0x73, 0x46, 0xf8, 0x6f, + 0xae, 0x9c, 0x1a, 0x24, 0x63, 0xad, 0x1e, 0x1c, + 0xc0, 0xe7, 0x65, 0xc7, 0xcd, 0x19, 0x98, 0xd9, + 0x6f, 0x24, 0xcd, 0x92, 0x40, 0x6d, 0xbd, 0x00, + 0xde, 0xc3, 0x95, 0x62, 0x2e, 0x98, 0x3a, 0xfb, + 0xe8, 0xdb, 0xc0, 0x90, 0x72, 0x1f, 0xa6, 0x72, + 0x82, 0xd3, 0xd4, 0x58, 0x91, 0xf6, 0x5b, 0xba, + 0xdc, 0x9e, 0x7a, 0x88, 0x34, 0x0f, 0xb4, 0xdf, + 0xa1, 0x4f, 0x2e, 0x67, 0x3e, 0x20, 0xf8, 0x4b, + 0x2f, 0x63, 0x63, 0x7b, 0x1e, 0xd2, 0xa5, 0x8c, + 0x0c, 0xef, 0x2d, 0x38, 0xb9, 0x2c, 0x9e, 0x45, + 0x30, 0x06, 0x57, 0x87, 0xcb, 0x77, 0x66, 0x77, + 0xab, 0x91, 0x64, 0x1b, 0x03, 0xb2, 0x18, 0x5c, + 0xdb, 0x19, 0x2e, 0x73, 0x90, 0x74, 0xdb, 0xf7, + 0x42, 0xa8, 0x7c, 0x90, 0x97, 0x47, 0x2b, 0x30, + 0x60, 0x0f, 0xb5, 0x86, 0x6e, 0x3b, 0x7a, 0x13, + 0x1b, 0x14, 0x38, 0x29, 0xdb, 0x8a, 0xf1, 0xe2, + 0xb9, 0x75, 0xc5, 0x8d, 0xca, 0x64, 0x8c, 0xa7, + 0xf2, 0x60, 0x16, 0xb9, 0x8e, 0x7d, 0xf1, 0x5f, + 0xd2, 0x9c, 0xeb, 0x5e, 0x47, 0x4e, 0xd9, 0xae, + 0x7d, 0x17, 0xfc, 0x51, 0x63, 0x29, 0x70, 0xc2, + 0xe1, 0x67, 0x8c, 0x7b, 0xe3, 0xa3, 0x8f, 0xe0, + 0xa6, 0x6c, 0x71, 0x64, 0xc4, 0x98, 0x47, 0x0a, + 0xf9, 0x82, 0xf1, 0x83, 0x4c, 0x0d, 0x67, 0xf8, + 0xb8, 0xb3, 0x5f, 0xed, 0x61, 0xe5, 0x53, 0xc7, + 0x6b, 0xe5, 0x6d, 0x9e, 0xfa, 0x2c, 0x99, 0x15, + 0x44, 0x19, 0x61, 0x1f, 0x00, 0x87, 0xe1, 0x23, + 0xd0, 0xa4, 0xa9, 0x76, 0x18, 0xf2, 0x71, 0xe1, + 0x63, 0x07, 0xab, 0x08, 0xfa, 0x02, 0xaa, 0x51, + 0x6a, 0x78, 0x73, 0xfb, 0x4e, 0xe2, 0x09, 0xce, + 0x3a, 0x49, 0xbf, 0xed, 0x54, 0xfe, 0xb8, 0xfb, + 0xc2, 0x7f, 0xbc, 0x7f, 0x7e, 0xe0, 0x93, 0x88, + 0xe6, 0xdc, 0x02, 0xae, 0x32, 0xe7, 0x01, 0x61, + 0x2b, 0x33, 0x3f, 0xf3, 0x59, 0xaa, 0xe4, 0x03, + 0xd3, 0x1a, 0xdb, 0x24, 0xea, 0xbf, 0x35, 0xb6, + 0x49, 0xd5, 0x7e, 0x6b, 0x6c, 0x93, 0xaa, 0xfc, + 0xd6, 0xd9, 0x27, 0x55, 0xf9, 0xad, 0xb2, 0x4e, + 0xab, 0xf3, 0x5b, 0x64, 0x9d, 0x57, 0xe6, 0xb6, + 0xc9, 0x3a, 0xaf, 0xcd, 0x6d, 0x92, 0x75, 0x5f, + 0x9a, 0xdb, 0x24, 0xea, 0xbf, 0x35, 0xb6, 0x49, + 0xd5, 0x7e, 0x6b, 0x6c, 0x93, 0xaa, 0xfc, 0xd6, + 0xd9, 0x27, 0x55, 0xf9, 0xad, 0xb2, 0x4e, 0xab, + 0xf3, 0x5b, 0x64, 0x9d, 0x57, 0xe6, 0xb6, 0xc9, + 0x3a, 0xaf, 0xcd, 0x6d, 0x92, 0x75, 0x5f, 0x9a, + 0xdb, 0x24, 0xea, 0xbf, 0x35, 0xb6, 0x49, 0xd5, + 0xac, 0x71, 0x46, 0xe9, 0xa5, 0xe2, 0x7c, 0xdc, + 0x5e, 0xa0, 0x8b, 0x9c, 0x6e, 0x77, 0x41, 0x06, + 0xc4, 0x2c, 0x53, 0xc4, 0x59, 0x2f, 0x1c, 0xb0, + 0xe6, 0x27, 0xe0, 0xb6, 0x89, 0xfa, 0x21, 0x6d, + 0x13, 0xf4, 0x02, 0xda, 0x27, 0xe8, 0x05, 0xb4, + 0x4f, 0xd0, 0x0b, 0x68, 0x9f, 0xa0, 0x16, 0xd1, + 0x3f, 0x40, 0x2d, 0xa2, 0x7e, 0x80, 0x5b, 0x44, + 0xfd, 0x00, 0xb6, 0x89, 0xfa, 0x01, 0x6d, 0x13, + 0xf4, 0x02, 0xda, 0x27, 0xe8, 0x05, 0xb4, 0x4f, + 0xd0, 0x0b, 0x68, 0x9f, 0xa0, 0x16, 0xd1, 0x3f, + 0x40, 0x2d, 0xa2, 0x7e, 0x80, 0x5b, 0x44, 0xfd, + 0x00, 0xb6, 0x89, 0xfa, 0x01, 0x6d, 0x13, 0xf4, + 0x02, 0xbd, 0xa6, 0xa8, 0x3c, 0x8f, 0x38, 0x42, + 0x6b, 0x6c, 0x18, 0xc6, 0xf0, 0x58, 0xdc, 0xc0, + 0x7e, 0xd4, 0xd6, 0x8e, 0x35, 0x18, 0xe4, 0x7b, + 0x3b, 0xd3, 0xfd, 0xe3, 0xfb, 0xf7, 0x0b, 0x5c, + 0x2e, 0x0a, 0xf2, 0x67, 0x10, 0xe4, 0x2b, 0x57, + 0xda, 0x16, 0xaf, 0xb4, 0x2d, 0x5f, 0x68, 0x5a, + 0xbe, 0xd0, 0xb5, 0x7d, 0xa1, 0x6a, 0xfb, 0x42, + 0xd5, 0xf6, 0x85, 0xab, 0xed, 0x0b, 0x57, 0xda, + 0x16, 0xaf, 0xb4, 0x2d, 0x5f, 0x68, 0x5a, 0xbe, + 0xd0, 0xb5, 0x7d, 0xa1, 0x6a, 0xfb, 0x42, 0xd5, + 0xf6, 0x85, 0xab, 0xed, 0x0b, 0x57, 0xda, 0x16, + 0xaf, 0xb4, 0x2d, 0x5f, 0x68, 0x5a, 0xbe, 0xd0, + 0xb5, 0x7d, 0xa1, 0x6a, 0xfb, 0x42, 0xd5, 0xf6, + 0x85, 0xab, 0xed, 0x0b, 0x57, 0xda, 0x16, 0xaf, + 0xb4, 0x2d, 0x5f, 0x68, 0x5a, 0xbe, 0xd0, 0xb5, + 0x7d, 0xa1, 0x6a, 0xfb, 0x42, 0xd5, 0xf6, 0x85, + 0xab, 0xed, 0x0b, 0x57, 0xda, 0x16, 0xaf, 0xb4, + 0x2d, 0x5f, 0x68, 0x5a, 0xbe, 0xd0, 0xb5, 0x7d, + 0xa1, 0x6a, 0xfb, 0x42, 0xd5, 0xf6, 0x85, 0xab, + 0xed, 0x0b, 0x57, 0xda, 0x16, 0xaf, 0xb4, 0x2d, + 0x5f, 0x68, 0x5a, 0xbe, 0xd0, 0xb5, 0x7d, 0xa1, + 0x6a, 0xfb, 0x42, 0xd5, 0xf6, 0x85, 0xab, 0xed, + 0x0b, 0x57, 0xda, 0x16, 0xaf, 0xb4, 0x2d, 0x5f, + 0x68, 0x5a, 0xbe, 0xd0, 0xb5, 0x7d, 0xa1, 0x6a, + 0xfb, 0x42, 0xd5, 0xf6, 0x85, 0xab, 0xed, 0x0b, + 0x57, 0xda, 0x16, 0xaf, 0xb4, 0x2d, 0x5f, 0x68, + 0x5a, 0xbe, 0xd0, 0xb5, 0x7d, 0xa1, 0x6a, 0xfb, + 0x42, 0xd5, 0xf6, 0x85, 0xab, 0xed, 0x0b, 0x57, + 0xda, 0x16, 0xaf, 0xb4, 0x2d, 0x5f, 0x68, 0x5a, + 0xbe, 0xd0, 0xb5, 0x7d, 0xa1, 0x6a, 0xfb, 0x42, + 0xce, 0x03, 0x7d, 0x65, 0x72, 0xbb, 0x95, 0x33, + 0xde, 0x33, 0xbd, 0x4f, 0x1c, 0x72, 0x61, 0x68, + 0x91, 0xdd, 0xeb, 0x5c, 0x79, 0x96, 0xb8, 0xf3, + 0x2d, 0x71, 0xe6, 0x5a, 0xe3, 0xcc, 0xb5, 0xc7, + 0x99, 0x6b, 0x8f, 0x32, 0xd7, 0x1e, 0x65, 0xae, + 0x3c, 0xcb, 0x5c, 0x79, 0x96, 0xb8, 0xf3, 0x2d, + 0x71, 0xe6, 0x5a, 0xe3, 0xcc, 0xb5, 0xc7, 0x99, + 0x6b, 0x8f, 0x32, 0xd7, 0x1e, 0x65, 0xae, 0x3c, + 0xcb, 0x5c, 0x79, 0x96, 0xb8, 0xf3, 0x2d, 0x71, + 0xe6, 0x5a, 0xe3, 0xcc, 0xb5, 0xc7, 0x99, 0x6b, + 0x8f, 0x32, 0xd7, 0x1e, 0x65, 0xae, 0x3c, 0xcb, + 0x5c, 0x79, 0x96, 0xb8, 0xf3, 0x2d, 0x71, 0xe6, + 0x5a, 0xe3, 0xcc, 0xb5, 0xc7, 0x99, 0x6b, 0x8f, + 0x32, 0xd7, 0x1e, 0x65, 0xae, 0x3c, 0xcb, 0x5c, + 0x79, 0x96, 0xb8, 0xf3, 0x2d, 0x71, 0xe6, 0x5a, + 0xe3, 0xcc, 0xb5, 0xc7, 0x99, 0x6b, 0x8f, 0x32, + 0xd7, 0x1e, 0x65, 0xae, 0x3c, 0xcb, 0x5c, 0x79, + 0x96, 0xb8, 0xf3, 0x2d, 0x71, 0xe6, 0x5a, 0xe3, + 0xcc, 0xb5, 0xc7, 0x99, 0x6b, 0x8f, 0x32, 0xd7, + 0x1e, 0x65, 0xae, 0x3c, 0xcb, 0x5c, 0x79, 0x96, + 0xb8, 0xf3, 0x2d, 0x71, 0xe6, 0x5a, 0xe3, 0xcc, + 0xb5, 0xc7, 0x99, 0x6b, 0x8f, 0x32, 0xd7, 0x1e, + 0x65, 0xae, 0x3c, 0xcb, 0x5c, 0x79, 0x96, 0xb8, + 0xf3, 0x2d, 0x71, 0xe6, 0x5a, 0xe3, 0xcc, 0xb5, + 0xc7, 0x99, 0x6b, 0x8f, 0x32, 0xd7, 0x1e, 0x65, + 0xae, 0x3c, 0xcb, 0x5c, 0x79, 0x96, 0xb8, 0xf3, + 0x2d, 0x71, 0xe6, 0x5a, 0xe3, 0xcc, 0xb5, 0xc7, + 0x99, 0x6b, 0x8f, 0x32, 0xd7, 0x1e, 0x65, 0xae, + 0x3c, 0xcb, 0x5c, 0x79, 0x96, 0xb8, 0xf3, 0x2d, + 0x71, 0xe6, 0x50, 0xc3, 0x2c, 0xa4, 0xb0, 0x9b, + 0xf3, 0x67, 0x5f, 0xff, 0xc4, 0x00, 0x2a, 0x10, + 0x00, 0x02, 0x01, 0x02, 0x05, 0x03, 0x05, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x11, 0x00, 0x21, 0x31, 0x41, 0x51, 0x61, + 0xf0, 0xf1, 0x71, 0xc1, 0xd1, 0x10, 0x81, 0x91, + 0xa1, 0xb1, 0x20, 0x40, 0x30, 0xe1, 0x50, 0xff, + 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, 0x3f, + 0x21, 0x3e, 0x0a, 0xf4, 0x21, 0x03, 0xd6, 0x6d, + 0x7e, 0xf3, 0x6b, 0xf7, 0x9b, 0x5f, 0xbc, 0xda, + 0xfd, 0xe6, 0xd7, 0xef, 0x36, 0xbf, 0x79, 0xb5, + 0xfb, 0xcd, 0xaf, 0xde, 0x6d, 0x7e, 0xf3, 0x6b, + 0xf7, 0x9b, 0x5f, 0xbc, 0xda, 0xfd, 0xe6, 0xd7, + 0xef, 0x36, 0xbf, 0x79, 0xb5, 0xfb, 0xcd, 0xaf, + 0xde, 0x6d, 0x7e, 0xf3, 0x6b, 0xf7, 0x9b, 0x5f, + 0xbc, 0xda, 0xfd, 0xe6, 0xd7, 0xef, 0x36, 0xbf, + 0x79, 0xb5, 0xfb, 0xcd, 0xaf, 0xde, 0x6d, 0x7e, + 0xf3, 0x6b, 0xf7, 0x9b, 0x5f, 0xbc, 0xda, 0xfd, + 0xe6, 0xd7, 0xef, 0x36, 0xbf, 0x79, 0xb5, 0xfb, + 0xcd, 0xaf, 0xde, 0x6d, 0x7e, 0xf3, 0x6b, 0xf7, + 0x9b, 0x5f, 0xbc, 0xda, 0xfd, 0xe6, 0xd7, 0xef, + 0x36, 0xbf, 0x79, 0xb5, 0xfb, 0xcd, 0xaf, 0xde, + 0x6d, 0x7e, 0xf3, 0x6b, 0xf7, 0x9b, 0x5f, 0xbc, + 0xda, 0xfd, 0xe6, 0xd7, 0xef, 0x36, 0xbf, 0x79, + 0xb5, 0xfb, 0xcd, 0xaf, 0xde, 0x6d, 0x7e, 0xf3, + 0x6b, 0xf7, 0x9b, 0x5f, 0xbc, 0xda, 0xfd, 0xe6, + 0xd7, 0xef, 0x36, 0xbf, 0x79, 0xb5, 0xfb, 0xcd, + 0xaf, 0xde, 0x6d, 0x7e, 0xf3, 0x6b, 0xf7, 0x9b, + 0x5f, 0xbc, 0xda, 0xfd, 0xe6, 0xd7, 0xef, 0x36, + 0xbf, 0x79, 0xb5, 0xfb, 0xcd, 0xaf, 0xde, 0x6d, + 0x7e, 0xf3, 0x6b, 0xf7, 0x9b, 0x5f, 0xbc, 0xda, + 0xfd, 0xe6, 0xd7, 0xef, 0x36, 0xbf, 0x79, 0xb5, + 0xfb, 0xcd, 0xaf, 0xde, 0x6d, 0x7e, 0xf3, 0x6b, + 0xf7, 0x9b, 0x5f, 0xbc, 0x1e, 0x0a, 0xf5, 0x21, + 0x11, 0xd6, 0x6d, 0x19, 0xe3, 0x8e, 0x38, 0xe3, + 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0xe3, 0x8e, 0x38, + 0xe3, 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0xe3, 0x8e, + 0x38, 0xe3, 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0xe3, + 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0xe3, 0xe2, 0xb0, + 0x0e, 0x01, 0x11, 0x2a, 0x08, 0x22, 0x0f, 0xf8, + 0x04, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, + 0x42, 0x11, 0x1b, 0xc6, 0x8d, 0x3b, 0x9c, 0xca, + 0x73, 0x29, 0xcc, 0xa7, 0x32, 0x9c, 0xca, 0x73, + 0x28, 0xe3, 0xa2, 0x55, 0x3b, 0x9c, 0xca, 0x73, + 0x29, 0xcc, 0xa7, 0x32, 0x9c, 0xca, 0x73, 0x28, + 0x8f, 0x20, 0x10, 0x28, 0xdb, 0x37, 0x8c, 0xf1, + 0xc7, 0x1c, 0x71, 0xc7, 0x1c, 0x71, 0xc7, 0x1c, + 0x71, 0xc7, 0x1c, 0x71, 0xc7, 0x1c, 0x71, 0xc7, + 0x1c, 0x71, 0xc7, 0x1c, 0x71, 0xc7, 0x1c, 0x71, + 0xc7, 0x1c, 0x71, 0xc7, 0x1c, 0x71, 0xc7, 0x1c, + 0x70, 0xfe, 0x54, 0xbf, 0x15, 0xda, 0xa5, 0x25, + 0x0a, 0x9a, 0x0c, 0x25, 0x71, 0x8f, 0x34, 0x64, + 0x0c, 0xa0, 0xf7, 0xfe, 0x85, 0x1a, 0x98, 0x91, + 0xb5, 0x26, 0xdf, 0xf1, 0xdc, 0x32, 0x7a, 0x04, + 0x56, 0x58, 0x3e, 0xdf, 0x42, 0xa8, 0x10, 0x20, + 0x4b, 0x19, 0xc3, 0x2d, 0xfa, 0x08, 0x94, 0x81, + 0xcb, 0x92, 0x10, 0x60, 0x35, 0x76, 0x55, 0xd3, + 0xa2, 0xa0, 0xa2, 0xc5, 0x63, 0x0e, 0xd8, 0x40, + 0x89, 0x88, 0xbb, 0x03, 0xdc, 0x1f, 0x4d, 0xcf, + 0x33, 0x05, 0x6f, 0x9f, 0xe6, 0x02, 0xe4, 0xe8, + 0x2b, 0x0e, 0x1c, 0x64, 0x81, 0x95, 0x40, 0xc4, + 0x02, 0xa4, 0xaa, 0x63, 0x29, 0x31, 0xfb, 0xca, + 0xa0, 0xb4, 0xc7, 0xd6, 0x05, 0x54, 0xe3, 0xe2, + 0xd6, 0xba, 0x68, 0x2f, 0x1a, 0x4b, 0x1d, 0x04, + 0x77, 0xb3, 0x4f, 0x70, 0x20, 0x04, 0x46, 0x0d, + 0x41, 0x13, 0x60, 0xce, 0x77, 0x0c, 0xff, 0x00, + 0xfc, 0xdf, 0xba, 0x9b, 0xce, 0x52, 0x82, 0x4a, + 0xd3, 0xec, 0x0b, 0xfb, 0x42, 0xe1, 0xdd, 0x99, + 0x22, 0x47, 0x22, 0xd9, 0x6a, 0x11, 0x18, 0xdf, + 0xc9, 0xde, 0x50, 0xe2, 0xd2, 0xd1, 0x5a, 0x43, + 0xd7, 0x12, 0x59, 0x40, 0x46, 0x29, 0x29, 0x81, + 0x93, 0x78, 0x79, 0x12, 0x71, 0x10, 0x56, 0x12, + 0x14, 0x14, 0x70, 0x50, 0xde, 0xf1, 0x89, 0xcc, + 0xa2, 0xc2, 0xaa, 0x82, 0x05, 0x88, 0x26, 0x73, + 0x48, 0x0b, 0x26, 0x80, 0x43, 0xae, 0x6a, 0xb2, + 0x88, 0xb1, 0x46, 0x88, 0x0c, 0x33, 0x04, 0x9b, + 0x22, 0xe4, 0x98, 0x9c, 0x02, 0x86, 0x40, 0x46, + 0x37, 0x16, 0x45, 0x9d, 0x4b, 0x82, 0x02, 0x2f, + 0x87, 0x08, 0x1a, 0x44, 0xb7, 0x58, 0xd9, 0x41, + 0x8c, 0x06, 0x06, 0xb6, 0x40, 0x03, 0x72, 0xa4, + 0x13, 0xfc, 0xee, 0x19, 0x3d, 0x04, 0x9f, 0x2c, + 0x73, 0x96, 0x82, 0x28, 0x56, 0x04, 0x96, 0x46, + 0x03, 0xcc, 0x5e, 0xbd, 0x75, 0x1a, 0x04, 0xe0, + 0x08, 0xd4, 0xa9, 0x45, 0x7d, 0x19, 0x49, 0x42, + 0x1b, 0x26, 0x6a, 0x4a, 0x65, 0x27, 0x08, 0x18, + 0xca, 0x9a, 0x0d, 0x1f, 0x99, 0x59, 0x7a, 0x6e, + 0x79, 0x98, 0x55, 0x39, 0x03, 0xa9, 0x6c, 0x6a, + 0x89, 0xf9, 0x9d, 0x12, 0xeb, 0x3b, 0x19, 0x01, + 0xcc, 0x08, 0xe4, 0xd1, 0x98, 0xb1, 0x37, 0x44, + 0xbc, 0x38, 0xa2, 0xf6, 0x16, 0xa2, 0x12, 0xc4, + 0x1e, 0x08, 0xa8, 0x54, 0xc5, 0x21, 0x61, 0x95, + 0x81, 0x3f, 0xab, 0xf9, 0xa5, 0x65, 0x33, 0x2d, + 0x50, 0xb3, 0x44, 0xa5, 0x9b, 0x55, 0x9d, 0x83, + 0x3f, 0xff, 0x00, 0x37, 0xec, 0xa6, 0xf3, 0x94, + 0x10, 0x8a, 0xa0, 0x8a, 0xc4, 0x48, 0xa0, 0x18, + 0x8a, 0x0a, 0xe3, 0x0e, 0x77, 0x8d, 0x9a, 0x00, + 0xb2, 0x00, 0x80, 0x50, 0xa8, 0x00, 0x73, 0x44, + 0x84, 0xc3, 0x61, 0x30, 0x3c, 0x66, 0x0b, 0xdc, + 0xd5, 0x40, 0x04, 0x08, 0x20, 0x36, 0x29, 0x0e, + 0x53, 0x4d, 0x80, 0x0a, 0xf8, 0x4b, 0x46, 0x04, + 0x0c, 0x27, 0xd0, 0x2d, 0xe4, 0x0d, 0x42, 0x63, + 0x10, 0x83, 0x98, 0x14, 0x54, 0x17, 0x8f, 0x42, + 0xca, 0x8d, 0x49, 0x87, 0x04, 0xc3, 0xc9, 0xa0, + 0x26, 0x37, 0x00, 0xa7, 0xd9, 0x0e, 0xa8, 0x05, + 0x45, 0x48, 0x12, 0x29, 0x59, 0x4b, 0xc5, 0xad, + 0x46, 0xa4, 0x09, 0x88, 0x20, 0x80, 0x36, 0x60, + 0xa0, 0xf9, 0xbd, 0x48, 0x44, 0xcb, 0x25, 0xee, + 0x7f, 0x9d, 0xc3, 0x27, 0xa6, 0x01, 0x96, 0x02, + 0xc7, 0x4d, 0x84, 0x11, 0x02, 0x42, 0x19, 0x44, + 0xb8, 0xa4, 0x5f, 0x74, 0x42, 0xe3, 0x2c, 0x03, + 0xa9, 0xce, 0x10, 0x01, 0x1a, 0x83, 0x09, 0xe1, + 0x0b, 0x5e, 0x0d, 0x26, 0x68, 0x1e, 0x9b, 0x9e, + 0x66, 0x5e, 0x3c, 0x16, 0xb8, 0x84, 0x49, 0x04, + 0x22, 0x68, 0x69, 0x09, 0xcd, 0x26, 0x35, 0xc1, + 0x10, 0x2e, 0xc2, 0x95, 0x2d, 0x26, 0x10, 0x30, + 0xf9, 0x80, 0x44, 0x85, 0x40, 0x19, 0x28, 0x20, + 0xcd, 0x6c, 0x22, 0x0a, 0xc0, 0x4b, 0x12, 0x0c, + 0xc3, 0xe4, 0x9e, 0xc0, 0xc0, 0x00, 0x00, 0x02, + 0x03, 0x09, 0x6e, 0xf5, 0x67, 0x60, 0xcf, 0xea, + 0xe1, 0xa0, 0x5a, 0xc4, 0x83, 0xaa, 0x15, 0xfe, + 0x4a, 0x69, 0xa6, 0x9a, 0x69, 0xa6, 0x9a, 0x69, + 0xa6, 0x9a, 0x69, 0xa6, 0x9a, 0x69, 0xa4, 0x10, + 0xd9, 0xd4, 0xf8, 0x61, 0x91, 0x34, 0x2a, 0x45, + 0x81, 0xf7, 0x57, 0xd0, 0x26, 0x20, 0x05, 0xc9, + 0x87, 0x1d, 0x51, 0x41, 0x37, 0x46, 0x6e, 0x8c, + 0xdd, 0x19, 0xba, 0x33, 0x74, 0x66, 0xe8, 0xcd, + 0xd1, 0x9b, 0xa3, 0x37, 0x46, 0x6e, 0x8c, 0xdd, + 0x19, 0xba, 0x33, 0x74, 0x66, 0xe8, 0xcd, 0xd1, + 0x9b, 0xa3, 0x0b, 0x89, 0x44, 0x2c, 0x60, 0x50, + 0x32, 0x80, 0x00, 0x01, 0xf7, 0x37, 0x1f, 0x79, + 0xb8, 0xfb, 0xcd, 0xc7, 0xde, 0x6e, 0x3e, 0xf3, + 0x71, 0xf7, 0x9b, 0x8f, 0xbc, 0xdc, 0x7d, 0xe6, + 0xe3, 0xef, 0x37, 0x1f, 0x79, 0xb8, 0xfb, 0xcd, + 0xc7, 0xde, 0x6e, 0x3e, 0xf3, 0x71, 0xf7, 0x9b, + 0x8f, 0xbc, 0xdc, 0x7d, 0xe1, 0x3b, 0x88, 0x8a, + 0xea, 0x6c, 0xce, 0xf3, 0x66, 0x77, 0x9b, 0x33, + 0xbc, 0xd9, 0x9d, 0xe6, 0xcc, 0xef, 0x36, 0x67, + 0x78, 0xa2, 0x67, 0x51, 0xd6, 0x9b, 0x33, 0xbc, + 0xd9, 0x9d, 0xe6, 0xcc, 0xef, 0x36, 0x67, 0x79, + 0x56, 0xb2, 0x13, 0x3b, 0x78, 0xc4, 0x33, 0x11, + 0x86, 0x62, 0x24, 0xd9, 0x34, 0xcd, 0xe3, 0x3c, + 0x71, 0xc2, 0xc9, 0x21, 0x74, 0xb5, 0x4e, 0xa5, + 0xfc, 0x7f, 0x98, 0x99, 0x91, 0xb2, 0x20, 0xca, + 0x21, 0x00, 0x4e, 0x19, 0x71, 0xf7, 0x08, 0xc3, + 0xd8, 0x9d, 0x64, 0x9c, 0x7c, 0x50, 0x8b, 0xe0, + 0x18, 0x4e, 0x03, 0x38, 0x0c, 0xe0, 0x33, 0x80, + 0xce, 0x03, 0x38, 0x0c, 0xe0, 0x33, 0x80, 0xce, + 0x03, 0x38, 0x0c, 0xe0, 0x33, 0x80, 0xce, 0x03, + 0x38, 0x0c, 0xe0, 0x33, 0x80, 0xce, 0x03, 0x38, + 0x0c, 0xe0, 0x33, 0x80, 0xcb, 0x22, 0x1b, 0x86, + 0x3e, 0x63, 0xe3, 0xaa, 0xdc, 0xc8, 0xf4, 0x32, + 0xa2, 0x55, 0xa4, 0xd5, 0x39, 0x07, 0x89, 0xc8, + 0x3c, 0x4e, 0x41, 0xe2, 0x72, 0x0f, 0x13, 0x90, + 0x78, 0x9c, 0x83, 0xc4, 0xe4, 0x1e, 0x27, 0x20, + 0xf1, 0x39, 0x07, 0x89, 0xc8, 0x3c, 0x4e, 0x41, + 0xe2, 0x72, 0x0f, 0x13, 0x90, 0x78, 0x9c, 0x83, + 0xc4, 0xe4, 0x1e, 0x27, 0x20, 0xf1, 0x39, 0x07, + 0x89, 0xc8, 0x3c, 0x4e, 0x41, 0xe2, 0x72, 0x0f, + 0x13, 0x90, 0x78, 0x83, 0xe2, 0x2c, 0x0b, 0xce, + 0x06, 0x92, 0xc0, 0x06, 0x23, 0x7b, 0x0a, 0x66, + 0xf3, 0x9f, 0xd7, 0x6a, 0xcf, 0xfe, 0x01, 0x22, + 0xc7, 0x06, 0xa4, 0xa1, 0x0e, 0x61, 0xb3, 0xda, + 0x22, 0xea, 0x69, 0x8c, 0x35, 0xe5, 0x86, 0xcc, + 0x8b, 0x15, 0x84, 0x37, 0xe7, 0xa4, 0xc2, 0x4b, + 0x16, 0xee, 0x33, 0xca, 0x12, 0x28, 0x0a, 0xa3, + 0x34, 0xd5, 0xbb, 0x82, 0x21, 0x66, 0xa8, 0x2c, + 0x90, 0x02, 0x02, 0x5d, 0xc9, 0xf6, 0x0e, 0x1e, + 0xc8, 0xcd, 0xde, 0x8c, 0x31, 0x57, 0xb2, 0x10, + 0x48, 0x82, 0x11, 0x18, 0x7f, 0xc2, 0x81, 0x80, + 0x03, 0xf4, 0x9a, 0x34, 0x78, 0xeb, 0x9d, 0x73, + 0xae, 0x75, 0xce, 0xb9, 0xd7, 0x3a, 0xe1, 0x29, + 0x14, 0x81, 0x56, 0x96, 0x85, 0xe9, 0x69, 0x4d, + 0x5d, 0x8d, 0x62, 0x25, 0x5c, 0x65, 0x2e, 0x0f, + 0x70, 0x23, 0xd4, 0xc1, 0x7e, 0x15, 0x8e, 0x0b, + 0x75, 0x9a, 0x98, 0x8c, 0x86, 0x75, 0x64, 0xe5, + 0xe9, 0x9e, 0x44, 0x3a, 0x98, 0x2e, 0x58, 0x09, + 0x24, 0x2e, 0x3d, 0x31, 0x8a, 0x99, 0x64, 0xc5, + 0xa4, 0x84, 0x04, 0x04, 0xd4, 0x08, 0x83, 0x94, + 0xeb, 0x9d, 0x73, 0xae, 0x75, 0xce, 0xb9, 0xd7, + 0x2f, 0xc7, 0x43, 0x00, 0x89, 0xb1, 0xfd, 0xa1, + 0xc1, 0xdd, 0x88, 0x43, 0xd6, 0xab, 0xa9, 0x85, + 0x14, 0x1b, 0x51, 0x46, 0xac, 0x69, 0x9f, 0xcd, + 0x57, 0x54, 0x6a, 0x8c, 0xc2, 0x56, 0x26, 0x10, + 0xf5, 0xed, 0xc2, 0x60, 0x38, 0x17, 0xba, 0x84, + 0x21, 0x1a, 0x62, 0xd1, 0x56, 0x17, 0xaf, 0xad, + 0x18, 0x85, 0x4f, 0x5a, 0x07, 0x58, 0x6d, 0xbd, + 0x43, 0xdc, 0x3a, 0xff, 0x00, 0x35, 0x4a, 0x36, + 0x70, 0x07, 0x58, 0x31, 0x86, 0xaf, 0xa8, 0xc4, + 0x6e, 0x60, 0x6d, 0x39, 0xfd, 0x77, 0xac, 0xff, + 0x00, 0xe0, 0x5e, 0x6b, 0xb7, 0x41, 0x4f, 0xba, + 0xfb, 0x47, 0xe0, 0xd8, 0x47, 0xcf, 0x1b, 0x1e, + 0x91, 0xb1, 0x7a, 0x42, 0x32, 0x2b, 0x79, 0x4c, + 0x02, 0xb0, 0x00, 0xc3, 0x1e, 0x9f, 0x47, 0x29, + 0x80, 0xcd, 0xea, 0x04, 0x4d, 0xa8, 0x32, 0xd2, + 0x64, 0x09, 0xc1, 0x82, 0x0f, 0x35, 0x18, 0xfe, + 0xf4, 0x08, 0x50, 0xe8, 0x30, 0xc2, 0x26, 0x69, + 0x0b, 0x76, 0x24, 0xbf, 0xe1, 0xf4, 0xf0, 0xa7, + 0x9c, 0x5a, 0xa6, 0x6a, 0x99, 0xaa, 0x66, 0xa9, + 0x9a, 0xa6, 0x6a, 0x99, 0xaa, 0x60, 0xf8, 0xdf, + 0xb4, 0x8a, 0xa1, 0xe2, 0xa8, 0x16, 0x04, 0x83, + 0xf0, 0xe2, 0x17, 0x7b, 0x18, 0x03, 0x71, 0x53, + 0x8c, 0x08, 0x62, 0xc2, 0xc4, 0xbe, 0xad, 0x34, + 0x85, 0x0f, 0x2d, 0x8e, 0x83, 0x70, 0x30, 0x66, + 0xb0, 0xe6, 0x6b, 0x05, 0xc3, 0x56, 0x6a, 0x56, + 0x1e, 0xbd, 0x8d, 0x5d, 0x77, 0x47, 0x88, 0x0b, + 0xc4, 0x8e, 0x23, 0x5e, 0xe2, 0x20, 0xf2, 0x89, + 0x8e, 0x66, 0x6a, 0x99, 0xaa, 0x66, 0xa9, 0x9a, + 0xa6, 0x6a, 0x99, 0xaa, 0x61, 0x1a, 0xc6, 0x0d, + 0xa3, 0x38, 0x69, 0x01, 0xa7, 0x73, 0x35, 0xa6, + 0xb4, 0x57, 0xb8, 0x8c, 0x45, 0x0c, 0x45, 0xa2, + 0x18, 0x46, 0x18, 0xc8, 0x2e, 0x5c, 0xf1, 0x80, + 0x81, 0x3e, 0x8a, 0xe7, 0xac, 0xef, 0xf3, 0x02, + 0x8c, 0x3d, 0xc4, 0x80, 0x3f, 0x24, 0x77, 0x5d, + 0x38, 0xb1, 0x1c, 0x0a, 0x05, 0x12, 0x35, 0x6a, + 0x70, 0x10, 0xb0, 0x3a, 0x31, 0x58, 0x58, 0xb8, + 0x29, 0x58, 0x03, 0x30, 0x5d, 0x7a, 0x5a, 0xec, + 0xba, 0x21, 0xa9, 0x8c, 0x01, 0x71, 0xad, 0xec, + 0xb7, 0xd4, 0x28, 0x75, 0xa7, 0xea, 0x71, 0x8d, + 0x24, 0x0b, 0x08, 0x91, 0x50, 0x65, 0x9e, 0xa0, + 0x26, 0x70, 0xd9, 0x6e, 0x92, 0xc9, 0x3e, 0x85, + 0x24, 0xc1, 0x03, 0x1d, 0x60, 0x09, 0x1f, 0x58, + 0xb1, 0x86, 0xa4, 0xc3, 0x18, 0x20, 0xb9, 0xb6, + 0x44, 0x6e, 0x09, 0x40, 0x63, 0x0e, 0x81, 0x85, + 0x84, 0x12, 0x02, 0x08, 0x20, 0x30, 0x9e, 0xa8, + 0x19, 0xad, 0x35, 0xa6, 0xb4, 0xfb, 0xc3, 0xf0, + 0x7a, 0x10, 0xd8, 0x73, 0xfa, 0xee, 0x19, 0xff, + 0x00, 0x9d, 0xf4, 0xf0, 0x40, 0x24, 0xc1, 0xa7, + 0x53, 0x44, 0x70, 0x34, 0x88, 0x38, 0x7f, 0x75, + 0x55, 0x40, 0x50, 0x0a, 0x59, 0x51, 0x2f, 0xbd, + 0x70, 0x0a, 0x65, 0xb4, 0xa4, 0x8a, 0x48, 0xa9, + 0xd0, 0xdc, 0x40, 0x44, 0x1c, 0x14, 0x2e, 0x37, + 0x08, 0x6a, 0xc1, 0x53, 0xed, 0xa7, 0xb4, 0xc9, + 0x84, 0x82, 0xa7, 0x43, 0x84, 0x65, 0x50, 0x53, + 0x14, 0x26, 0xf5, 0x80, 0x09, 0xf6, 0x22, 0xdf, + 0xd0, 0xff, 0x00, 0x85, 0x55, 0x47, 0x2a, 0xb6, + 0xba, 0x18, 0xbe, 0xe0, 0x0f, 0x10, 0x09, 0x27, + 0xde, 0x08, 0x4b, 0x1f, 0xd0, 0x96, 0x3f, 0x67, + 0x4c, 0xe9, 0x82, 0xc3, 0x05, 0x33, 0x50, 0x33, + 0x85, 0xda, 0x5e, 0x93, 0xd4, 0x45, 0x0c, 0x41, + 0x97, 0x44, 0x42, 0x48, 0x41, 0x04, 0x60, 0xc9, + 0x60, 0x68, 0xdb, 0x55, 0xd6, 0x5c, 0x1a, 0x54, + 0x67, 0x64, 0x95, 0xb9, 0x1e, 0x15, 0x49, 0xbd, + 0x71, 0x83, 0x0a, 0x18, 0x23, 0x58, 0x73, 0x22, + 0x38, 0x32, 0x60, 0x84, 0xc4, 0x8f, 0x6c, 0x75, + 0x19, 0x6a, 0x21, 0x14, 0x64, 0xe6, 0x81, 0x43, + 0xff, 0x00, 0xbe, 0x16, 0x10, 0x17, 0xb4, 0xb2, + 0x8b, 0x34, 0x2b, 0x59, 0x84, 0xbe, 0xe4, 0xa1, + 0xab, 0x61, 0x57, 0x7d, 0xe9, 0x04, 0x92, 0x00, + 0x2e, 0x5a, 0x38, 0x03, 0x52, 0x8d, 0xe8, 0xd3, + 0xd9, 0x9d, 0x33, 0xa6, 0x34, 0x79, 0xd0, 0x10, + 0xcc, 0x31, 0x47, 0xa3, 0x0d, 0xc7, 0x3c, 0x71, + 0xcd, 0xc3, 0x3f, 0xe5, 0x66, 0xcf, 0x56, 0x40, + 0xc0, 0x0d, 0x68, 0x65, 0x3d, 0x66, 0x9c, 0x4f, + 0xb7, 0xe2, 0x64, 0xa2, 0x1c, 0x0f, 0x63, 0x35, + 0xf6, 0x80, 0x4d, 0xd8, 0x02, 0x15, 0xa2, 0x09, + 0x70, 0x79, 0x5c, 0xa2, 0x4d, 0x2e, 0xbb, 0xc2, + 0x2b, 0x86, 0x2a, 0x1f, 0xb8, 0x6b, 0x55, 0x1a, + 0x31, 0xde, 0x44, 0x49, 0x50, 0xd0, 0xf5, 0x84, + 0xa1, 0x72, 0x88, 0xa2, 0x63, 0x0c, 0x6f, 0x02, + 0xad, 0x48, 0xb2, 0x2b, 0x7e, 0xe5, 0xee, 0x11, + 0xb5, 0x06, 0x89, 0x65, 0x02, 0x02, 0x17, 0xac, + 0x7a, 0x1e, 0x29, 0x10, 0x9e, 0x78, 0xc2, 0xf7, + 0x90, 0xf0, 0x05, 0x59, 0x6c, 0x1a, 0x54, 0x40, + 0x8d, 0x2d, 0x48, 0x08, 0x35, 0xc1, 0xa0, 0x03, + 0xef, 0xfa, 0xfa, 0xf8, 0x24, 0x4c, 0x58, 0xfc, + 0x98, 0x84, 0xc4, 0x2f, 0x23, 0x31, 0xfe, 0x5c, + 0x71, 0xc7, 0x1c, 0x71, 0xc7, 0x1c, 0x71, 0xc7, + 0x1c, 0x71, 0xc7, 0x1c, 0x71, 0xc7, 0x10, 0x7a, + 0x5c, 0x8f, 0x89, 0x7c, 0x22, 0x44, 0x2c, 0x18, + 0xf4, 0x17, 0xb9, 0xd4, 0x2a, 0x29, 0x56, 0xf3, + 0x96, 0x8e, 0x5a, 0x39, 0x68, 0xe5, 0xa3, 0x96, + 0x8e, 0x5a, 0x39, 0x68, 0xe5, 0xa3, 0x96, 0x8e, + 0x5a, 0x39, 0x68, 0xe5, 0xa3, 0x96, 0x8e, 0x5a, + 0x39, 0x68, 0xe5, 0xa3, 0x96, 0x8e, 0x5a, 0x39, + 0x68, 0xe5, 0xa3, 0x96, 0x81, 0x09, 0x4a, 0x50, + 0x6a, 0x15, 0x4a, 0x82, 0x5f, 0xd1, 0x86, 0xe3, + 0x9f, 0xd7, 0x74, 0xcf, 0xf9, 0x34, 0x62, 0xd1, + 0x57, 0x98, 0xfc, 0x82, 0x9c, 0x20, 0x2f, 0x32, + 0x20, 0x4d, 0x26, 0xc3, 0x44, 0x74, 0xbf, 0xf2, + 0x57, 0x48, 0x92, 0x5f, 0xca, 0x06, 0x21, 0x8f, + 0xf5, 0xdc, 0xa9, 0x84, 0xfe, 0x9b, 0x5d, 0x02, + 0xa3, 0xe1, 0xef, 0x29, 0x93, 0x6a, 0xf9, 0x05, + 0xd3, 0x08, 0x07, 0x32, 0x29, 0x16, 0x3a, 0xbc, + 0xc1, 0xbc, 0xd2, 0x4e, 0xa1, 0x21, 0x41, 0xd1, + 0xd6, 0x04, 0x94, 0x20, 0x04, 0xde, 0xa4, 0x92, + 0x65, 0x27, 0xa8, 0x5a, 0x34, 0xae, 0xad, 0x09, + 0x16, 0x18, 0x56, 0x60, 0x5f, 0x00, 0x20, 0xb5, + 0x82, 0xa1, 0xb2, 0x15, 0xcb, 0x19, 0x4f, 0x28, + 0x3e, 0xbc, 0xd1, 0xb7, 0xf3, 0xf4, 0xf1, 0xf7, + 0x7b, 0x4b, 0x5b, 0xe9, 0xfd, 0x99, 0xee, 0x2b, + 0x9a, 0x52, 0x59, 0xeb, 0x84, 0x6f, 0x8c, 0x2a, + 0x02, 0x20, 0xe0, 0xe9, 0xf7, 0x83, 0xd1, 0x1c, + 0xc9, 0x78, 0xbe, 0x89, 0xd6, 0xb0, 0x6a, 0x3e, + 0x47, 0x05, 0xd8, 0x59, 0x5e, 0xb1, 0xed, 0x92, + 0x04, 0x14, 0x77, 0x05, 0x5c, 0xcb, 0x0c, 0xaf, + 0xe0, 0x96, 0x97, 0x54, 0x35, 0x87, 0x30, 0x46, + 0xfa, 0x16, 0xdd, 0x59, 0xd6, 0xf6, 0x86, 0xd1, + 0x88, 0xdd, 0x2a, 0x40, 0x15, 0xa3, 0x0f, 0xdd, + 0x00, 0x94, 0x8a, 0x9b, 0x6a, 0xff, 0x00, 0x88, + 0xdf, 0x77, 0xfc, 0x06, 0xc8, 0xcc, 0xc2, 0xed, + 0xc3, 0x24, 0x7f, 0xed, 0x49, 0x09, 0xb6, 0x51, + 0x39, 0x74, 0x18, 0x42, 0xee, 0x00, 0xea, 0x48, + 0x96, 0x22, 0x8d, 0xd6, 0x03, 0x1c, 0x3e, 0xb3, + 0x96, 0x1e, 0x06, 0xad, 0x68, 0xc0, 0x42, 0x7e, + 0x03, 0x24, 0x31, 0x45, 0x81, 0xa3, 0x73, 0x0b, + 0x2e, 0x50, 0x66, 0xea, 0x68, 0x31, 0x54, 0xb8, + 0x85, 0x53, 0xb9, 0xc0, 0x83, 0x20, 0x1f, 0x75, + 0xb3, 0x52, 0xbb, 0x50, 0xb0, 0xa0, 0x36, 0x15, + 0x3f, 0x52, 0xab, 0x81, 0x89, 0xd4, 0x45, 0xc0, + 0xb0, 0xbd, 0xe2, 0x0b, 0x62, 0x35, 0xa2, 0x6a, + 0x0b, 0x00, 0x0d, 0x43, 0x14, 0x8c, 0x44, 0xac, + 0x28, 0x67, 0x75, 0x32, 0x42, 0xd5, 0xa4, 0x3d, + 0x01, 0x2a, 0x40, 0xb8, 0x44, 0xe4, 0xce, 0xa7, + 0x59, 0x74, 0x31, 0xa3, 0xa0, 0xd6, 0xbb, 0x18, + 0x55, 0x61, 0x0f, 0xdc, 0x15, 0x89, 0xe4, 0x88, + 0x25, 0x88, 0x37, 0x75, 0x84, 0x9c, 0x04, 0x38, + 0x90, 0x4d, 0x2b, 0x7b, 0xfb, 0xff, 0x00, 0x1b, + 0x76, 0x5e, 0xb4, 0x36, 0x9c, 0xfe, 0xbb, 0x26, + 0x7f, 0xc8, 0x91, 0x0e, 0x60, 0x88, 0x89, 0xd6, + 0x40, 0x6b, 0xf3, 0x3e, 0xf7, 0x2a, 0x60, 0x04, + 0x03, 0x0a, 0x90, 0xdc, 0xe6, 0xad, 0x2b, 0xe4, + 0x23, 0x03, 0xac, 0x31, 0x8c, 0xf9, 0x8f, 0xe2, + 0x94, 0x96, 0x91, 0x02, 0x3b, 0x12, 0xf3, 0x54, + 0x2c, 0x9e, 0xe7, 0xd4, 0x19, 0x01, 0x39, 0x6b, + 0xe6, 0x59, 0xc2, 0x73, 0xcb, 0xee, 0xe4, 0xc7, + 0x11, 0x41, 0x48, 0x30, 0x0b, 0xa3, 0x7f, 0x20, + 0xfe, 0xbe, 0x9e, 0x3e, 0xcf, 0x69, 0x6b, 0x7d, + 0x3f, 0xb5, 0x6a, 0xf7, 0xed, 0xe1, 0x55, 0x6a, + 0x97, 0x5e, 0xd0, 0x62, 0x11, 0xf7, 0x56, 0x0f, + 0xc2, 0x11, 0x20, 0x01, 0xc3, 0x05, 0x00, 0xbe, + 0x05, 0xe6, 0x1d, 0x35, 0x40, 0x12, 0x21, 0xa5, + 0x13, 0x2c, 0x08, 0xa5, 0x25, 0x30, 0x50, 0x22, + 0x11, 0xfa, 0x98, 0x7e, 0x43, 0x20, 0x51, 0xaa, + 0xe1, 0xb2, 0x8e, 0xfa, 0x0a, 0x88, 0xc5, 0xd9, + 0xa3, 0xa5, 0x2a, 0x60, 0xaf, 0x07, 0x00, 0xc1, + 0x43, 0x11, 0xbe, 0x60, 0x4d, 0x60, 0x02, 0xfb, + 0x7f, 0xc4, 0x6f, 0xb3, 0xfe, 0x0c, 0x4e, 0x04, + 0xc8, 0x24, 0x31, 0x87, 0x51, 0x0c, 0x50, 0xea, + 0x89, 0x3a, 0xbf, 0x42, 0xf8, 0x8e, 0xc2, 0xa5, + 0x60, 0x80, 0x00, 0x74, 0x17, 0x6e, 0xd4, 0x8c, + 0x39, 0x0a, 0x5a, 0x01, 0x53, 0x6f, 0x61, 0x8b, + 0x03, 0x0c, 0x91, 0x2d, 0xb2, 0xe8, 0xc8, 0xdf, + 0x3a, 0x43, 0x3b, 0xc2, 0xd2, 0x20, 0xb2, 0x9a, + 0x8a, 0xf2, 0xdc, 0xe5, 0xc6, 0xb8, 0xc6, 0xcc, + 0x20, 0xc9, 0x99, 0x5e, 0x34, 0xd0, 0xea, 0x04, + 0x2f, 0x03, 0xf8, 0x33, 0x20, 0x28, 0x24, 0xb2, + 0xfd, 0x84, 0x34, 0x0f, 0x11, 0xf8, 0x08, 0x03, + 0x32, 0x78, 0xd8, 0xd6, 0x19, 0x69, 0x54, 0xd0, + 0xd6, 0x14, 0x34, 0x98, 0xe4, 0x60, 0x88, 0x0c, + 0x78, 0x85, 0x86, 0x59, 0x83, 0xa8, 0x85, 0x44, + 0x13, 0x84, 0x4a, 0x83, 0x6b, 0x10, 0x08, 0x1d, + 0x2a, 0xa6, 0x77, 0x80, 0xc7, 0x01, 0x36, 0xb0, + 0x91, 0x8d, 0xa5, 0x3c, 0xd2, 0xc9, 0x91, 0x2f, + 0xe3, 0x6e, 0xcb, 0xd6, 0xa6, 0xfb, 0x9f, 0xd7, + 0x6c, 0xcf, 0xf9, 0x1f, 0x76, 0x9a, 0x4d, 0x02, + 0x00, 0x50, 0x9e, 0x14, 0x80, 0xb2, 0x9e, 0xd1, + 0x42, 0x8f, 0x45, 0x46, 0x62, 0x25, 0x1d, 0x0c, + 0x22, 0x39, 0x0a, 0x75, 0x84, 0x74, 0x6d, 0xb5, + 0x48, 0xc6, 0x02, 0x41, 0x03, 0x93, 0x80, 0x03, + 0xf6, 0x81, 0x29, 0x80, 0xd5, 0x8b, 0x20, 0xc4, + 0x98, 0x6a, 0x1a, 0x82, 0x92, 0x45, 0x4d, 0x2b, + 0x2b, 0x65, 0x1c, 0x8a, 0x18, 0x0e, 0x0a, 0x18, + 0xa3, 0x64, 0x55, 0x71, 0x13, 0x6a, 0x91, 0x43, + 0x81, 0x84, 0xa5, 0x20, 0x30, 0xaa, 0xd0, 0xd3, + 0x15, 0x2a, 0x9c, 0x66, 0x02, 0xa0, 0x15, 0xc1, + 0x7c, 0x10, 0xb3, 0x5a, 0x6e, 0xc4, 0x6c, 0xd2, + 0x91, 0x21, 0x15, 0x02, 0xc4, 0x44, 0xa2, 0x99, + 0xc3, 0xef, 0x29, 0xa3, 0x61, 0xb2, 0x3f, 0xcf, + 0xd5, 0xc7, 0xdd, 0xed, 0x07, 0x84, 0x51, 0x71, + 0x8d, 0x44, 0xdc, 0x1d, 0xa6, 0xe0, 0xed, 0x37, + 0x07, 0x69, 0xb8, 0x3b, 0x4d, 0xc1, 0xda, 0x6e, + 0x0e, 0xd3, 0x70, 0x76, 0x9b, 0x83, 0xb4, 0xdc, + 0x1d, 0xa6, 0xe0, 0xed, 0x37, 0x07, 0x69, 0xb8, + 0x3b, 0x4d, 0xc1, 0xda, 0x6e, 0x0e, 0xd3, 0x70, + 0x76, 0x9b, 0x83, 0xb4, 0xdc, 0x1d, 0xa6, 0xe0, + 0xed, 0x37, 0x07, 0x69, 0xb8, 0x3b, 0x4d, 0xc1, + 0xda, 0x08, 0x13, 0x42, 0x07, 0x00, 0x45, 0xbd, + 0x1c, 0x57, 0x70, 0x60, 0xb8, 0x17, 0xd4, 0xe4, + 0x53, 0x91, 0x40, 0x6c, 0x36, 0x63, 0xfc, 0x72, + 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, + 0x82, 0x08, 0x20, 0x82, 0x08, 0x0c, 0x99, 0xb9, + 0x49, 0xa9, 0xe7, 0xd3, 0xd7, 0xa6, 0xfb, 0x9e, + 0x38, 0xe6, 0xd9, 0x9f, 0xf2, 0x40, 0x4d, 0xce, + 0x19, 0x06, 0x01, 0x9c, 0xa9, 0xd8, 0x7d, 0x09, + 0x0b, 0x19, 0x14, 0xa5, 0x3d, 0x74, 0x11, 0x4f, + 0xc4, 0x44, 0xac, 0x22, 0x41, 0x40, 0x5a, 0x98, + 0x4c, 0x65, 0x84, 0x13, 0x49, 0xd5, 0x62, 0x66, + 0x37, 0xbe, 0xa8, 0xc2, 0x2b, 0x52, 0x48, 0x20, + 0x06, 0x7d, 0x84, 0x19, 0x6d, 0xc1, 0x44, 0x52, + 0x8f, 0x60, 0x60, 0x20, 0x59, 0x47, 0x95, 0x4d, + 0x2c, 0xe8, 0x46, 0x59, 0xb3, 0x1e, 0xd2, 0x67, + 0xc1, 0x18, 0x59, 0xc7, 0xf4, 0xfb, 0x41, 0xd0, + 0x8e, 0x2b, 0x2a, 0x19, 0xc2, 0x60, 0x03, 0x8f, + 0x09, 0xd0, 0xd6, 0xc0, 0x43, 0x49, 0x56, 0x48, + 0x06, 0x80, 0xd0, 0x0f, 0xe7, 0xea, 0xe3, 0xef, + 0x76, 0x96, 0xb7, 0xd3, 0xf9, 0x17, 0xce, 0x10, + 0x5e, 0x65, 0x13, 0x9c, 0x65, 0x68, 0xd5, 0x69, + 0x18, 0x8a, 0x37, 0x38, 0x54, 0x08, 0xc2, 0x87, + 0x55, 0x2a, 0x7c, 0xc1, 0xd4, 0x89, 0x8b, 0xea, + 0x3a, 0xd9, 0x42, 0x97, 0x80, 0x8d, 0x51, 0x21, + 0xf5, 0x28, 0x86, 0x5e, 0xe2, 0x08, 0x05, 0x43, + 0x8d, 0x15, 0x2b, 0xad, 0x52, 0x20, 0xab, 0xeb, + 0x18, 0xe0, 0x05, 0x62, 0xc8, 0xfb, 0x4a, 0x45, + 0xbd, 0xf0, 0x4a, 0xdd, 0x46, 0x68, 0x8c, 0x20, + 0x40, 0x7b, 0x45, 0x50, 0x22, 0xa1, 0xa1, 0x9c, + 0x54, 0x61, 0x8d, 0x16, 0x16, 0x6e, 0xfa, 0x1d, + 0x2a, 0x0c, 0xd9, 0x54, 0x3e, 0x3e, 0xb0, 0xa5, + 0x42, 0x2a, 0x46, 0xa7, 0xff, 0x00, 0x80, 0xc7, + 0x47, 0x09, 0xc9, 0xa0, 0xd2, 0x16, 0x4c, 0x24, + 0xba, 0x2c, 0x42, 0xea, 0xd6, 0x95, 0x41, 0x0c, + 0x48, 0x1c, 0x3d, 0x13, 0x26, 0xc0, 0x41, 0x88, + 0x7b, 0x0c, 0x4c, 0x2e, 0x3a, 0x4e, 0x1c, 0x29, + 0xcb, 0x51, 0x41, 0x29, 0x28, 0x86, 0x07, 0xef, + 0x03, 0x8e, 0x16, 0x7e, 0x56, 0xb2, 0x8f, 0xba, + 0x34, 0x0a, 0x8c, 0x61, 0x80, 0x00, 0xd2, 0xc9, + 0xad, 0x2d, 0x59, 0x51, 0x11, 0x04, 0x57, 0x00, + 0xf8, 0xc5, 0x2a, 0xfc, 0x67, 0x44, 0xc0, 0x58, + 0x5c, 0xab, 0x3d, 0x02, 0x1f, 0x09, 0x95, 0x49, + 0x3f, 0x18, 0x06, 0xbc, 0x4d, 0xa1, 0x54, 0x51, + 0x89, 0xfa, 0xcf, 0xcc, 0x74, 0x94, 0x57, 0x04, + 0x12, 0x04, 0x8a, 0xb5, 0x09, 0x64, 0x17, 0xec, + 0x52, 0x62, 0x37, 0xc2, 0x7e, 0x99, 0x39, 0x91, + 0x08, 0x10, 0xa3, 0x03, 0x12, 0x53, 0x05, 0xd0, + 0x08, 0xd2, 0x0e, 0xb3, 0x60, 0xc3, 0x4a, 0xe6, + 0x98, 0xdf, 0x18, 0x47, 0xab, 0x42, 0x9a, 0xe0, + 0xe8, 0xa0, 0x08, 0xbd, 0xca, 0x22, 0x2a, 0x17, + 0x01, 0xb1, 0x92, 0xd6, 0x34, 0xc0, 0xb0, 0xd5, + 0x12, 0x06, 0xf6, 0xec, 0x8c, 0x65, 0xd3, 0xe4, + 0xaa, 0x38, 0xa1, 0xd2, 0xa8, 0x7d, 0xfd, 0xea, + 0xb4, 0x25, 0x34, 0x89, 0x55, 0x71, 0xa3, 0xc4, + 0x58, 0x19, 0x80, 0xc3, 0x72, 0x70, 0x13, 0xa1, + 0x0e, 0xd2, 0xf6, 0x84, 0x59, 0x30, 0xab, 0x80, + 0xa3, 0x38, 0x12, 0xd0, 0xd3, 0x51, 0xea, 0xa9, + 0xb2, 0xe7, 0x8e, 0x39, 0xb6, 0x67, 0xfc, 0x8d, + 0x4e, 0x21, 0x12, 0x0c, 0xfc, 0x42, 0x1f, 0x48, + 0x21, 0x50, 0xe2, 0x9d, 0x60, 0x71, 0x00, 0x84, + 0xc8, 0xd1, 0xda, 0x5e, 0xbd, 0x26, 0x3a, 0xa3, + 0x19, 0x72, 0xbd, 0x70, 0x74, 0x03, 0x29, 0x0e, + 0x6a, 0xa6, 0xba, 0x88, 0xee, 0xfe, 0xf2, 0x5e, + 0xe8, 0xba, 0x4a, 0xf3, 0xd7, 0x5a, 0xba, 0x13, + 0x29, 0xb5, 0xc3, 0xc1, 0xd0, 0x0d, 0xa2, 0xaa, + 0x42, 0xe8, 0x4b, 0x3c, 0xe0, 0x00, 0x42, 0xab, + 0x96, 0x15, 0x26, 0x8a, 0x8a, 0x6a, 0xcf, 0x3b, + 0x40, 0x69, 0x28, 0x7f, 0x6c, 0x44, 0xb5, 0xd6, + 0x19, 0x4a, 0x30, 0xb4, 0x8e, 0xbf, 0x3f, 0xcf, + 0xd1, 0xc7, 0xde, 0xed, 0x2d, 0x6f, 0xa7, 0xf2, + 0x60, 0x01, 0x0a, 0x95, 0x19, 0xc5, 0x66, 0x01, + 0x54, 0x74, 0xb4, 0x54, 0xbc, 0xac, 0xc6, 0xfc, + 0x55, 0x90, 0xd0, 0x41, 0x88, 0xf7, 0x8c, 0x30, + 0x00, 0xd5, 0xc4, 0xb2, 0x49, 0x43, 0xf3, 0x08, + 0x4a, 0xb1, 0x62, 0x91, 0x8d, 0xca, 0x96, 0x63, + 0x23, 0x07, 0x1e, 0x20, 0xac, 0x19, 0xd7, 0xd5, + 0xce, 0x10, 0x95, 0xe1, 0xbe, 0x21, 0xf4, 0xbd, + 0x0e, 0x10, 0xf2, 0x30, 0xf4, 0x62, 0x1a, 0x08, + 0x54, 0xe1, 0x8c, 0x0c, 0xd4, 0xcb, 0x61, 0x81, + 0x05, 0x1c, 0x08, 0x7b, 0xc3, 0xcd, 0x17, 0xd0, + 0x84, 0x24, 0x7d, 0x3f, 0xa8, 0x04, 0x48, 0x1a, + 0xf8, 0x3c, 0x2c, 0x52, 0xa3, 0xde, 0xa1, 0x3b, + 0x3d, 0x9f, 0xf0, 0x18, 0x3e, 0x97, 0xb9, 0x0a, + 0x97, 0x80, 0x88, 0x08, 0x27, 0x2a, 0xa5, 0xac, + 0xb8, 0x66, 0xba, 0xc1, 0xfb, 0xa9, 0x05, 0xeb, + 0x84, 0x8c, 0x2b, 0xa9, 0xa8, 0x48, 0x9b, 0x89, + 0x10, 0x44, 0x66, 0xc0, 0x02, 0xe4, 0x06, 0x82, + 0x43, 0x1c, 0xe1, 0x30, 0x08, 0xbd, 0x78, 0x9a, + 0x47, 0xa8, 0x41, 0xa6, 0x1a, 0xc0, 0xb3, 0x8c, + 0x60, 0xc5, 0x06, 0xc6, 0x42, 0xb8, 0x25, 0x8c, + 0xc3, 0x23, 0xe5, 0x04, 0x01, 0xe2, 0x7c, 0x60, + 0xa3, 0x44, 0xa3, 0x69, 0x0f, 0x5a, 0xbd, 0x5c, + 0x5c, 0xd6, 0xc5, 0xb1, 0x52, 0x42, 0xb0, 0x1e, + 0x88, 0x8f, 0x84, 0x82, 0x86, 0xee, 0x34, 0x17, + 0xa4, 0x06, 0x00, 0xf0, 0x80, 0x19, 0x25, 0x63, + 0x04, 0x60, 0x0d, 0xa1, 0x00, 0xc9, 0x83, 0x48, + 0x05, 0x14, 0xdf, 0x00, 0x9f, 0x61, 0x04, 0xb4, + 0x20, 0x55, 0x53, 0x21, 0x52, 0xf4, 0xb2, 0x8a, + 0xdb, 0x84, 0x03, 0x60, 0x15, 0x09, 0xca, 0x01, + 0x90, 0x37, 0x9b, 0x12, 0x68, 0x3d, 0x8c, 0x66, + 0x83, 0x21, 0x00, 0x24, 0x09, 0xc7, 0x30, 0x7f, + 0xf6, 0x3b, 0x58, 0x21, 0x00, 0x31, 0x60, 0x28, + 0x54, 0x01, 0x38, 0x85, 0xd9, 0xf1, 0x00, 0x85, + 0xe5, 0x5a, 0x45, 0x7a, 0xc0, 0xa4, 0xce, 0x20, + 0x2c, 0x45, 0xd6, 0xd5, 0xc0, 0x34, 0x3f, 0x01, + 0x41, 0x39, 0xe8, 0x22, 0x6b, 0xd2, 0x82, 0x11, + 0x2a, 0x74, 0x2a, 0x68, 0xad, 0x7a, 0xde, 0xd2, + 0xd1, 0x0a, 0xbd, 0x6a, 0x36, 0xc6, 0xa5, 0x7a, + 0x94, 0xd9, 0x73, 0xfa, 0xef, 0x99, 0xff, 0x00, + 0xa0, 0xc7, 0xda, 0xed, 0x1d, 0x15, 0xc9, 0xc9, + 0x6f, 0xf3, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, + 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x04, + 0x3c, 0x40, 0x8c, 0x01, 0x4f, 0x4e, 0x89, 0x97, + 0x8e, 0xba, 0x18, 0x4e, 0x26, 0xa7, 0x02, 0x87, + 0xc8, 0x9b, 0xc3, 0xb4, 0xde, 0x1d, 0xa6, 0xf0, + 0xed, 0x37, 0x87, 0x69, 0xbc, 0x3b, 0x4d, 0xe1, + 0xda, 0x6f, 0x0e, 0xd3, 0x78, 0x76, 0x9b, 0xc3, + 0xb4, 0xde, 0x1d, 0xa6, 0xf0, 0xed, 0x37, 0x87, + 0x69, 0xbc, 0x3b, 0x4d, 0xe1, 0xda, 0x6f, 0x0e, + 0xd3, 0x78, 0x76, 0x9b, 0xc3, 0xb4, 0xde, 0x1d, + 0xa6, 0xf0, 0xed, 0x04, 0x44, 0xc1, 0xbe, 0x02, + 0x14, 0xb5, 0x0e, 0x41, 0xc8, 0x0f, 0x56, 0x9b, + 0xae, 0x7f, 0x5d, 0xd3, 0x3f, 0xf4, 0x38, 0xfb, + 0x1d, 0xa5, 0xad, 0xf4, 0xfe, 0x53, 0x44, 0x1c, + 0x0c, 0x85, 0x20, 0x91, 0x8a, 0x35, 0xf6, 0x95, + 0x3e, 0x60, 0xea, 0x44, 0xc5, 0xf5, 0x1d, 0x6c, + 0xa1, 0x4b, 0xc0, 0x46, 0xa8, 0x90, 0xfa, 0x94, + 0x43, 0x2f, 0x71, 0x04, 0x02, 0xa1, 0xc6, 0x8a, + 0x95, 0xd6, 0xa9, 0x13, 0x0a, 0x28, 0xea, 0x69, + 0xe5, 0x19, 0x53, 0x4f, 0x99, 0x2b, 0x42, 0x12, + 0x18, 0x11, 0x26, 0x6c, 0xc8, 0x14, 0x8f, 0x6e, + 0xcc, 0x4a, 0x48, 0x62, 0x95, 0x0f, 0x71, 0x02, + 0x42, 0x44, 0xdd, 0x44, 0xa1, 0xc9, 0x2a, 0x15, + 0xa2, 0xe2, 0x2c, 0xa4, 0xa4, 0x6b, 0x7d, 0x26, + 0xe8, 0x6b, 0x43, 0x80, 0x20, 0x51, 0xfd, 0xe1, + 0x6f, 0xb3, 0xef, 0xff, 0x00, 0xc1, 0x18, 0x26, + 0xfb, 0x9f, 0xfd, 0x70, 0x31, 0xf6, 0x3b, 0x4b, + 0x5b, 0xe9, 0xfc, 0x94, 0x50, 0xaa, 0xcc, 0x18, + 0x83, 0xe0, 0x98, 0xc3, 0x00, 0x0d, 0x5c, 0x4b, + 0x24, 0x94, 0x3f, 0x30, 0x84, 0xab, 0x16, 0x29, + 0x18, 0xdc, 0xa9, 0x66, 0x32, 0x30, 0x71, 0xe2, + 0x0a, 0xc1, 0x9d, 0x7d, 0x5c, 0xe1, 0xdc, 0x53, + 0x3a, 0x85, 0x02, 0x8a, 0x2a, 0x2c, 0x81, 0xec, + 0xc0, 0x9a, 0xb7, 0xe6, 0x05, 0x12, 0x42, 0x10, + 0xa0, 0x14, 0xa2, 0x81, 0x26, 0x15, 0x28, 0xa6, + 0x72, 0xa9, 0xa8, 0xaa, 0xb8, 0x28, 0xdb, 0x08, + 0x6b, 0x02, 0xd9, 0x08, 0xb1, 0x56, 0x5a, 0xe2, + 0x90, 0xee, 0x2a, 0xf2, 0x4d, 0xdb, 0x6a, 0x4a, + 0x06, 0x05, 0x03, 0x60, 0x03, 0x91, 0x15, 0xd3, + 0xff, 0x00, 0x82, 0x30, 0x4d, 0xb7, 0x3c, 0x71, + 0xc1, 0x7f, 0xc8, 0x78, 0xd6, 0x70, 0xc2, 0x70, + 0xc2, 0x70, 0xc2, 0x70, 0xc2, 0x70, 0xc2, 0x70, + 0xc2, 0x70, 0xc2, 0x70, 0xc2, 0x70, 0xc2, 0x70, + 0xc2, 0x70, 0xc2, 0x70, 0xc2, 0x70, 0xc2, 0x70, + 0xc2, 0x70, 0xc2, 0x70, 0xc2, 0x70, 0xc2, 0x70, + 0xc2, 0x70, 0xc2, 0x70, 0xc2, 0x70, 0xc2, 0x70, + 0xc2, 0x02, 0x15, 0x81, 0x8c, 0x47, 0xdc, 0xed, + 0x06, 0x8a, 0x69, 0x02, 0xa8, 0x9c, 0x02, 0x70, + 0x09, 0xc0, 0x27, 0x00, 0x9c, 0x02, 0x70, 0x09, + 0xc0, 0x27, 0x00, 0x85, 0xb5, 0xff, 0x00, 0x03, + 0x00, 0x2a, 0x86, 0x62, 0x00, 0x49, 0xda, 0x18, + 0x0c, 0xc9, 0xb2, 0xb5, 0x60, 0xf8, 0xcc, 0x00, + 0xb5, 0xa5, 0x04, 0xc8, 0xd7, 0x58, 0x48, 0xf0, + 0x55, 0x45, 0x9d, 0x6d, 0x81, 0x9c, 0x02, 0x70, + 0x09, 0xc0, 0x27, 0x00, 0x9c, 0x02, 0x70, 0x09, + 0xc0, 0x27, 0x00, 0x9c, 0x02, 0x2d, 0xc6, 0x85, + 0xd3, 0xfd, 0x79, 0x36, 0xdc, 0xfe, 0xac, 0x06, + 0x85, 0x4b, 0x4d, 0xc5, 0xde, 0x6e, 0x2e, 0xf3, + 0x71, 0x77, 0x9b, 0x8b, 0xbc, 0x44, 0xb9, 0x2d, + 0x8d, 0x86, 0xc1, 0xf7, 0x02, 0x29, 0x0c, 0xfd, + 0x69, 0xb4, 0x61, 0x51, 0x9c, 0xc0, 0x02, 0x35, + 0x64, 0xb0, 0x22, 0xbc, 0x72, 0x87, 0x8a, 0x17, + 0x12, 0x37, 0x5f, 0x1f, 0xb9, 0xb8, 0xbb, 0xcd, + 0xc5, 0xde, 0x6e, 0x2e, 0xf3, 0x71, 0x77, 0x85, + 0x89, 0x80, 0xa8, 0x82, 0xc3, 0x9b, 0x8b, 0xbc, + 0xdc, 0x5d, 0xe5, 0x1c, 0x61, 0xae, 0x23, 0xee, + 0x48, 0x93, 0x6a, 0x40, 0xd4, 0xa0, 0x86, 0xe0, + 0x74, 0x1a, 0x30, 0xeb, 0x88, 0x94, 0x36, 0x75, + 0x48, 0x28, 0x24, 0x12, 0x03, 0x28, 0x1c, 0x21, + 0xe6, 0x84, 0xac, 0x80, 0x53, 0x7e, 0xe5, 0x0b, + 0x41, 0x6f, 0x9a, 0x10, 0x1b, 0xe8, 0x13, 0x71, + 0x77, 0x9b, 0x8b, 0xbc, 0x3c, 0x1a, 0x00, 0x04, + 0xe9, 0xee, 0x9f, 0x73, 0xb4, 0xb5, 0xbe, 0x9f, + 0xf1, 0x28, 0x44, 0x04, 0xcd, 0x6a, 0x14, 0x26, + 0x9b, 0xb6, 0x3c, 0x5a, 0x14, 0x3f, 0x11, 0xb3, + 0xb8, 0xdf, 0x03, 0x46, 0xa2, 0x62, 0x49, 0x7c, + 0x05, 0xf7, 0xff, 0x00, 0xe2, 0xc6, 0xc9, 0xbe, + 0xe7, 0xf5, 0xda, 0xb2, 0xfe, 0x74, 0xad, 0x67, + 0x8a, 0xa8, 0x9f, 0x70, 0x28, 0xe9, 0x15, 0x9b, + 0x2c, 0x4f, 0x82, 0x20, 0x50, 0xd8, 0x05, 0xa0, + 0x14, 0x2e, 0xa3, 0x34, 0x26, 0xac, 0xac, 0x23, + 0x53, 0xf0, 0x7f, 0xc0, 0x31, 0xaf, 0x5b, 0x4e, + 0x76, 0x45, 0x7f, 0x4c, 0x73, 0x3f, 0xe1, 0x0f, + 0xef, 0xc2, 0x50, 0xad, 0x00, 0x09, 0xb1, 0x29, + 0xc3, 0x53, 0xe4, 0xb7, 0x94, 0xb1, 0x46, 0x86, + 0x03, 0x00, 0xa5, 0x4d, 0x86, 0x5e, 0xc4, 0x1f, + 0xc1, 0x9f, 0x6b, 0xb4, 0x3e, 0x18, 0x05, 0xd1, + 0xa9, 0xc2, 0x4e, 0x12, 0x70, 0x93, 0x84, 0x9c, + 0x24, 0xe1, 0x27, 0x09, 0x38, 0x48, 0x4a, 0x2e, + 0x02, 0xab, 0x80, 0x04, 0xfd, 0x08, 0x20, 0xf0, + 0x13, 0x2c, 0x48, 0x40, 0x05, 0xac, 0x17, 0xca, + 0x19, 0x80, 0xc0, 0x9a, 0x92, 0x58, 0x56, 0x0a, + 0xe9, 0x05, 0x08, 0x22, 0x8d, 0xcd, 0x4c, 0xfd, + 0x09, 0xc2, 0x4e, 0x12, 0x70, 0x93, 0x84, 0x9c, + 0x24, 0xe1, 0x27, 0x09, 0x38, 0x49, 0xc2, 0x41, + 0x1c, 0x94, 0x46, 0x45, 0x7a, 0x68, 0x74, 0x05, + 0xff, 0x00, 0x99, 0x8c, 0x63, 0x18, 0xc6, 0x31, + 0x8c, 0x63, 0x18, 0xc6, 0x31, 0x8c, 0x63, 0x19, + 0xa5, 0x0a, 0x05, 0xeb, 0x13, 0x75, 0xcf, 0xea, + 0x54, 0xf4, 0x22, 0x34, 0x1f, 0xcf, 0xff, 0x00, + 0xff, 0x00, 0xf9, 0x13, 0x3c, 0x32, 0x24, 0x28, + 0x03, 0x41, 0x94, 0x10, 0x1a, 0x20, 0xe8, 0x24, + 0xb2, 0x86, 0x15, 0xac, 0xb2, 0x77, 0x89, 0xf4, + 0x22, 0x5d, 0x61, 0xac, 0xbd, 0xcf, 0xf2, 0x69, + 0xa6, 0x9a, 0x46, 0x90, 0x3a, 0x80, 0x00, 0x01, + 0x2f, 0x6f, 0x53, 0x4d, 0x57, 0x97, 0x03, 0x19, + 0x03, 0x44, 0x8c, 0x53, 0x3f, 0x32, 0xec, 0x90, + 0x44, 0x98, 0x58, 0xe6, 0x5a, 0xc2, 0x0f, 0xb6, + 0x7c, 0x35, 0x26, 0x07, 0x01, 0x14, 0x89, 0xfb, + 0xd4, 0x6b, 0x09, 0x84, 0x92, 0x13, 0x8f, 0xaf, + 0xff, 0x00, 0xe0, 0xc5, 0xe0, 0x98, 0x24, 0x16, + 0x33, 0xed, 0xf6, 0x8c, 0x95, 0x24, 0x70, 0x31, + 0x9c, 0xa6, 0x72, 0x99, 0xca, 0x67, 0x29, 0x9c, + 0xa6, 0x3f, 0xfe, 0x90, 0x0a, 0xa8, 0x19, 0xa9, + 0x2a, 0xc2, 0x19, 0x44, 0x88, 0x67, 0x2c, 0x44, + 0xfb, 0x85, 0x0d, 0x06, 0x9a, 0x2c, 0xea, 0xd6, + 0x06, 0x0a, 0x3d, 0x9e, 0x51, 0xf3, 0x0e, 0xe3, + 0xd0, 0x61, 0x32, 0x92, 0x3d, 0x42, 0x12, 0x4e, + 0x20, 0x54, 0x03, 0x31, 0x48, 0x0e, 0x01, 0x58, + 0xd0, 0x54, 0x15, 0x1a, 0xd5, 0x4e, 0x53, 0x09, + 0xc1, 0x3a, 0x0a, 0xa0, 0x9c, 0x74, 0x46, 0x41, + 0x0a, 0xc4, 0x05, 0xb3, 0xd0, 0xce, 0x53, 0x39, + 0x4c, 0xe5, 0x33, 0x94, 0xce, 0x53, 0x39, 0x4c, + 0x32, 0x51, 0x2c, 0xf6, 0xb0, 0xf6, 0x92, 0x08, + 0xd5, 0x4b, 0x19, 0x10, 0x17, 0x24, 0xff, 0x00, + 0x98, 0xd2, 0x94, 0xa5, 0x29, 0x4a, 0x52, 0x94, + 0xa5, 0x29, 0x4a, 0x52, 0x94, 0xa4, 0x6b, 0xcf, + 0x64, 0x16, 0x70, 0x86, 0x20, 0xdc, 0x4d, 0x87, + 0x24, 0xd9, 0x73, 0xc7, 0x1c, 0x38, 0xde, 0xd2, + 0x13, 0x16, 0x33, 0x82, 0x78, 0x85, 0x0d, 0x4b, + 0xae, 0xf6, 0x18, 0xe7, 0x06, 0x18, 0x83, 0x16, + 0x35, 0xa3, 0x4e, 0x87, 0xe2, 0x05, 0x58, 0x15, + 0xbd, 0x07, 0xf3, 0xfa, 0xc6, 0x52, 0x92, 0x66, + 0x7b, 0xf1, 0x1a, 0x81, 0x38, 0x27, 0x89, 0x4a, + 0x36, 0x9a, 0xc1, 0x21, 0x1f, 0x33, 0x71, 0x77, + 0x9b, 0x8b, 0xbc, 0x67, 0xef, 0xcc, 0x05, 0x41, + 0x41, 0xfc, 0x41, 0xc1, 0xd4, 0x08, 0x20, 0xb3, + 0x4a, 0x90, 0x2c, 0xa0, 0x92, 0x08, 0xb0, 0x41, + 0x52, 0xd4, 0x0d, 0x8b, 0x58, 0x4a, 0x93, 0x64, + 0xc5, 0x8d, 0xac, 0x4c, 0x61, 0x37, 0x17, 0x79, + 0xb8, 0xbb, 0xca, 0x2f, 0xbb, 0x8d, 0xe7, 0x4c, + 0xc3, 0x2d, 0x82, 0x62, 0x2b, 0x19, 0x08, 0x2e, + 0xaa, 0x19, 0x58, 0x98, 0x76, 0xa1, 0x9d, 0x6a, + 0x70, 0x8d, 0xfe, 0x30, 0xb0, 0x06, 0xc8, 0x24, + 0x7e, 0x6d, 0x0c, 0x38, 0x93, 0x12, 0xbe, 0x2f, + 0x54, 0x5f, 0x30, 0xc2, 0x60, 0x43, 0x86, 0x6c, + 0x80, 0x38, 0x40, 0x48, 0xa5, 0x56, 0xba, 0x99, + 0x12, 0xbc, 0xca, 0xbf, 0x15, 0x5f, 0x82, 0x7d, + 0xfe, 0xd3, 0x6c, 0xd7, 0xfb, 0x03, 0xf2, 0x31, + 0xb6, 0x8e, 0xb0, 0x4c, 0x49, 0x2f, 0x80, 0xbe, + 0xf3, 0x5b, 0x8e, 0xf1, 0x40, 0x8a, 0x44, 0x31, + 0xbd, 0x61, 0x01, 0xd2, 0x16, 0x1a, 0xa8, 0xfb, + 0x10, 0x08, 0x02, 0x8f, 0x6c, 0x77, 0xc2, 0xea, + 0xa1, 0xc0, 0xc5, 0x8a, 0x52, 0x8c, 0x80, 0x8a, + 0xbe, 0x00, 0x3d, 0xf2, 0x81, 0x9d, 0x3e, 0x80, + 0x81, 0x0d, 0x0e, 0x25, 0x5f, 0x48, 0x1e, 0x2a, + 0xe9, 0xe5, 0x55, 0xd8, 0xd6, 0xf7, 0xa4, 0xcf, + 0x24, 0x8e, 0x6a, 0x1f, 0x5f, 0x7f, 0xde, 0xcf, + 0x96, 0x6c, 0x39, 0xca, 0x95, 0x61, 0x7d, 0xa7, + 0x54, 0xea, 0x84, 0x49, 0xc0, 0x4c, 0x80, 0x2d, + 0xfa, 0xf8, 0x94, 0xd8, 0x41, 0xae, 0x18, 0x2d, + 0x47, 0x6a, 0x00, 0xa8, 0x2d, 0x3d, 0x73, 0x87, + 0x06, 0x07, 0xa0, 0xce, 0xce, 0xc1, 0x13, 0x27, + 0x80, 0xed, 0x56, 0x2c, 0x15, 0x02, 0x87, 0x1c, + 0x00, 0x2a, 0x15, 0x42, 0x73, 0x42, 0x07, 0x74, + 0xb3, 0x56, 0x4b, 0x55, 0x52, 0x24, 0x44, 0x87, + 0xad, 0xc0, 0x8c, 0xa6, 0x1f, 0x40, 0x2e, 0x8d, + 0x57, 0xb1, 0x96, 0x99, 0x13, 0x6f, 0x12, 0x03, + 0xbd, 0x94, 0x1e, 0xe1, 0x8e, 0xc9, 0xac, 0x2f, + 0x48, 0x13, 0x74, 0xd8, 0x97, 0x05, 0x16, 0x75, + 0x43, 0x52, 0x43, 0xe4, 0x84, 0xde, 0xb9, 0x43, + 0x90, 0xba, 0x16, 0x1a, 0xa5, 0xf4, 0x8e, 0x22, + 0x87, 0x8f, 0x05, 0x55, 0x58, 0x3c, 0x63, 0x1e, + 0x51, 0x57, 0x6e, 0xb0, 0xc3, 0x58, 0x10, 0x24, + 0xb4, 0x4d, 0x75, 0x9d, 0x53, 0xaa, 0x57, 0xab, + 0x8f, 0xee, 0x7d, 0xcf, 0xec, 0xda, 0xf2, 0x4d, + 0xb7, 0x3f, 0xae, 0xd5, 0x9f, 0xa0, 0xb2, 0xb0, + 0x8d, 0x7b, 0x93, 0xf1, 0xa2, 0x5c, 0xb0, 0x2c, + 0x80, 0xcf, 0x63, 0xf0, 0x21, 0xf0, 0xaa, 0x32, + 0x04, 0xcb, 0xe2, 0x18, 0x2a, 0x9c, 0xbd, 0x8e, + 0xc9, 0x04, 0x2a, 0x6b, 0xba, 0xef, 0xf8, 0x16, + 0x9b, 0x04, 0x91, 0x12, 0x8c, 0x38, 0x61, 0xc5, + 0xdd, 0x1c, 0x41, 0xc2, 0x0e, 0x67, 0x91, 0xa4, + 0x27, 0xb9, 0x40, 0x10, 0x5b, 0x94, 0x64, 0xfd, + 0x3d, 0x43, 0x06, 0x0e, 0x40, 0xdc, 0x8b, 0x2d, + 0x55, 0x58, 0x42, 0x89, 0xa8, 0x1b, 0x2c, 0x5a, + 0x82, 0xee, 0x1d, 0x63, 0xa7, 0x91, 0x64, 0xf1, + 0xf8, 0xcf, 0x02, 0x6c, 0x37, 0x49, 0xf7, 0x42, + 0x81, 0xed, 0x0b, 0x43, 0x35, 0x8f, 0xcc, 0x57, + 0x04, 0x14, 0x6e, 0x45, 0x90, 0x5b, 0xde, 0xaf, + 0x7f, 0x5b, 0xfd, 0xde, 0xd1, 0x2f, 0x01, 0x3d, + 0x08, 0x2c, 0xcb, 0xeb, 0x1b, 0xe0, 0x9c, 0x24, + 0xe1, 0x27, 0x09, 0x38, 0x48, 0xef, 0xfa, 0x01, + 0x22, 0x54, 0x23, 0x43, 0x4b, 0x18, 0x0d, 0x02, + 0x3c, 0xf1, 0xc4, 0x09, 0xc1, 0x42, 0x08, 0xa3, + 0x73, 0x53, 0x3f, 0x42, 0x5a, 0xa9, 0x53, 0x04, + 0x16, 0x10, 0x86, 0xab, 0x0a, 0x04, 0x21, 0x05, + 0x33, 0x0e, 0x69, 0xc5, 0x87, 0x3b, 0x87, 0x76, + 0xc4, 0x03, 0x1a, 0x9a, 0x8e, 0x69, 0x01, 0x0c, + 0x4b, 0x6b, 0x0b, 0x95, 0x1c, 0x80, 0x4a, 0xb5, + 0x0b, 0xa8, 0xce, 0x34, 0x91, 0x38, 0xec, 0x04, + 0xb2, 0x7a, 0xac, 0x95, 0x99, 0x22, 0x81, 0x8f, + 0x37, 0xb2, 0x01, 0x38, 0x49, 0xc2, 0x4e, 0x12, + 0x70, 0x93, 0x84, 0x87, 0x26, 0x63, 0x3c, 0x02, + 0xb2, 0x0c, 0x4c, 0x18, 0x20, 0xc5, 0x19, 0x01, + 0x41, 0x36, 0x1c, 0xe5, 0x2c, 0xb9, 0x3e, 0xd3, + 0xa6, 0x74, 0xc0, 0x98, 0x09, 0xe0, 0xf0, 0x3a, + 0x20, 0x0c, 0x1f, 0x14, 0xd3, 0x53, 0x15, 0xd6, + 0xda, 0xd5, 0x09, 0xf7, 0x10, 0x49, 0xf6, 0x91, + 0x2c, 0x62, 0xa6, 0x03, 0x9a, 0x34, 0x3c, 0xba, + 0x42, 0xf5, 0x4d, 0x1d, 0x0d, 0x8d, 0x34, 0x85, + 0x84, 0xc4, 0x28, 0x62, 0x94, 0x79, 0xc0, 0xcc, + 0xa0, 0x85, 0x00, 0x5e, 0x10, 0x33, 0x96, 0x3a, + 0xab, 0xe1, 0x81, 0x8e, 0xc1, 0x85, 0x28, 0x80, + 0x04, 0x0c, 0xa9, 0x3d, 0xc5, 0xd5, 0xb5, 0x2f, + 0x2b, 0xf2, 0xc3, 0x95, 0x80, 0x63, 0x61, 0x08, + 0xa3, 0x50, 0x4e, 0xf2, 0x22, 0xf6, 0x31, 0x81, + 0xba, 0xc4, 0x71, 0x7d, 0xb4, 0x80, 0xc7, 0x42, + 0x50, 0x85, 0x82, 0x82, 0xce, 0x90, 0x66, 0x50, + 0x22, 0xfb, 0x84, 0xe4, 0x21, 0x71, 0x45, 0x6a, + 0xa5, 0x55, 0xa3, 0x9d, 0x33, 0xa6, 0x53, 0xab, + 0x17, 0xee, 0x7d, 0xcf, 0xec, 0xd8, 0xf2, 0x4d, + 0xe7, 0x3f, 0xaa, 0xcd, 0xeb, 0x95, 0x4b, 0x15, + 0x00, 0xa2, 0x19, 0xc3, 0xd2, 0xb1, 0x76, 0x78, + 0x1a, 0x88, 0x8f, 0xfe, 0x28, 0xa4, 0xcc, 0x04, + 0xd1, 0xaf, 0xe6, 0x34, 0xf9, 0x71, 0x71, 0xd5, + 0x6d, 0xf0, 0x80, 0x38, 0xaa, 0x57, 0x4e, 0x11, + 0xa0, 0x3e, 0x95, 0xa8, 0x56, 0x49, 0xc2, 0xa0, + 0x6a, 0x3f, 0xf0, 0x63, 0x9e, 0x79, 0xe7, 0x9e, + 0x41, 0x64, 0x01, 0x8d, 0x08, 0xa9, 0x13, 0x43, + 0xa4, 0x41, 0x2e, 0xf2, 0x5c, 0xc0, 0x26, 0x75, + 0x30, 0x35, 0x85, 0x0e, 0x7f, 0xdd, 0xae, 0x70, + 0x0b, 0x3f, 0x56, 0x61, 0x51, 0xcc, 0x0c, 0x30, + 0x82, 0x71, 0x23, 0xc3, 0xdb, 0xa0, 0x05, 0xc0, + 0x61, 0x58, 0xc0, 0xa8, 0xbd, 0x71, 0x15, 0xf4, + 0xac, 0x28, 0xa2, 0xc5, 0x26, 0x02, 0x9a, 0x02, + 0xbf, 0x26, 0x7d, 0xd8, 0x2a, 0x7b, 0x58, 0x90, + 0x6f, 0x99, 0xb3, 0xe4, 0x9b, 0x3e, 0x49, 0xb3, + 0xe4, 0x9b, 0x3e, 0x49, 0xb3, 0xe4, 0x9b, 0x3e, + 0x49, 0xb3, 0xe4, 0x9b, 0x3e, 0x49, 0xb3, 0xe4, + 0x9b, 0x3e, 0x49, 0xb3, 0xe4, 0x9b, 0x3e, 0x49, + 0xb3, 0xe4, 0x9b, 0x3e, 0x49, 0xb3, 0xe4, 0x9b, + 0x3e, 0x49, 0xb3, 0xe4, 0x9b, 0x3e, 0x49, 0xb3, + 0xe4, 0x9b, 0x3e, 0x49, 0x70, 0xf9, 0xae, 0xf0, + 0xcb, 0x2e, 0x41, 0x42, 0x05, 0xb8, 0x83, 0xda, + 0x10, 0xa5, 0x4d, 0x4c, 0x58, 0x19, 0xc6, 0x4e, + 0x32, 0x71, 0x90, 0x0c, 0xdd, 0xf1, 0x05, 0x21, + 0xeb, 0xe3, 0x44, 0xe3, 0x27, 0x19, 0x38, 0xc9, + 0xc6, 0x4e, 0x32, 0x71, 0x93, 0x8c, 0x9c, 0x64, + 0xe3, 0x27, 0x19, 0x38, 0xc9, 0xc6, 0x4e, 0x32, + 0x71, 0x93, 0x8c, 0x8d, 0xf0, 0x4c, 0x78, 0xc5, + 0xe6, 0x02, 0x10, 0xc5, 0x2e, 0x4b, 0x33, 0x63, + 0xc9, 0x36, 0xdc, 0xff, 0x00, 0xeb, 0x20, 0x39, + 0x4c, 0xf1, 0xa0, 0x0f, 0xb8, 0x4c, 0x69, 0x73, + 0x33, 0xaa, 0x75, 0x4e, 0xa9, 0xd5, 0x3a, 0xa7, + 0x54, 0xea, 0x9d, 0x53, 0xaa, 0x75, 0x4e, 0xa9, + 0xd5, 0x3a, 0xa7, 0x54, 0xea, 0x9d, 0x53, 0xaa, + 0x75, 0x4e, 0xa9, 0xd5, 0x3a, 0xa1, 0x8a, 0x59, + 0x9d, 0x52, 0x00, 0xbf, 0xa2, 0xbb, 0x1a, 0xde, + 0x1e, 0xa9, 0x42, 0x06, 0x50, 0x00, 0xc1, 0xc1, + 0xc6, 0x05, 0x40, 0xf7, 0x13, 0x94, 0x94, 0x57, + 0x3b, 0x0e, 0xb1, 0x50, 0x94, 0x01, 0x10, 0x2a, + 0xa7, 0xaa, 0x50, 0x14, 0x12, 0x18, 0x16, 0x10, + 0x4b, 0x41, 0xfb, 0x1f, 0x88, 0x0a, 0x09, 0x0c, + 0x0b, 0x08, 0x25, 0xa0, 0xfd, 0x8f, 0xc4, 0x22, + 0x24, 0xed, 0x1d, 0x7a, 0xa1, 0x02, 0x92, 0x38, + 0x30, 0x9e, 0x86, 0x03, 0xa8, 0xcc, 0x81, 0xef, + 0x39, 0x49, 0xca, 0x40, 0x62, 0x21, 0x40, 0x0c, + 0x61, 0x40, 0x29, 0xd4, 0x28, 0xa1, 0xaa, 0x89, + 0x07, 0x46, 0xf2, 0xce, 0xa9, 0x4a, 0xd6, 0x14, + 0xa2, 0x27, 0x04, 0x77, 0x05, 0x99, 0x02, 0x54, + 0x0b, 0x9a, 0x83, 0x8b, 0x84, 0xa0, 0x2a, 0x3d, + 0x80, 0x79, 0x41, 0xc6, 0x1e, 0xf1, 0x7d, 0x86, + 0x25, 0xc7, 0x5a, 0xe3, 0xa0, 0x54, 0xd6, 0x4e, + 0xbf, 0x90, 0x88, 0x46, 0x5f, 0x04, 0x12, 0x13, + 0x71, 0x85, 0xe9, 0xbd, 0xe4, 0x9b, 0x0e, 0x78, + 0xe3, 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0xe3, 0x8e, + 0x38, 0xe3, 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0xe3, + 0x8e, 0x38, 0xe3, 0x9a, 0x7d, 0x1b, 0xa9, 0x17, + 0x68, 0x0d, 0x36, 0x81, 0x46, 0xd5, 0xc6, 0x70, + 0x1a, 0x85, 0x80, 0x6c, 0x46, 0x94, 0xce, 0x08, + 0xb6, 0x80, 0x08, 0x5d, 0x4e, 0x95, 0x89, 0x29, + 0x45, 0x06, 0x94, 0xc9, 0x25, 0x8d, 0x70, 0x87, + 0x89, 0x2c, 0x24, 0xb1, 0x80, 0x0c, 0xe9, 0xf7, + 0x03, 0xa6, 0x32, 0x8c, 0x3a, 0x4e, 0x4a, 0xbd, + 0x23, 0x94, 0x1a, 0x20, 0xe3, 0xe4, 0x2f, 0xac, + 0x06, 0x29, 0x90, 0x89, 0x0c, 0x61, 0x80, 0xec, + 0x9e, 0x43, 0x4c, 0x02, 0x40, 0x85, 0x42, 0x82, + 0x8a, 0x0c, 0xd7, 0xdc, 0x34, 0x70, 0xe3, 0x01, + 0x9c, 0x8b, 0x28, 0xd1, 0xd0, 0x81, 0x30, 0xd5, + 0x66, 0x4a, 0xe9, 0x59, 0x65, 0xbc, 0x8a, 0x85, + 0xe2, 0x2f, 0xd2, 0x00, 0x68, 0x10, 0x19, 0xc0, + 0xeb, 0x7f, 0x78, 0x22, 0xea, 0xcc, 0xb1, 0xba, + 0x96, 0x51, 0x33, 0x9e, 0x02, 0xe8, 0xd4, 0x1c, + 0x50, 0x58, 0x56, 0x08, 0x94, 0x3f, 0x50, 0x93, + 0x3c, 0x75, 0x8c, 0x7f, 0xe5, 0x46, 0x40, 0xe1, + 0xf2, 0xa7, 0x08, 0x03, 0x40, 0x58, 0x71, 0x2f, + 0x3b, 0x47, 0x4b, 0xb2, 0x17, 0x41, 0x07, 0xab, + 0x29, 0x9d, 0x5b, 0xe9, 0x9a, 0xc6, 0x17, 0x50, + 0xbf, 0x3d, 0x3e, 0xee, 0x2b, 0x63, 0x05, 0x05, + 0x40, 0xa3, 0x8c, 0x3d, 0xf8, 0x70, 0xb1, 0x41, + 0x5c, 0x85, 0x59, 0x8a, 0x81, 0x35, 0xdd, 0x45, + 0x1b, 0x11, 0x80, 0x02, 0xde, 0xc6, 0x04, 0xb2, + 0xbe, 0x89, 0x86, 0x7d, 0xce, 0x15, 0xcc, 0x40, + 0x1d, 0x81, 0x50, 0xa0, 0x16, 0x1b, 0x01, 0x89, + 0x99, 0xeb, 0x2b, 0x1b, 0x80, 0x16, 0xa8, 0x5e, + 0xb8, 0xe5, 0x09, 0xe1, 0xcb, 0x2c, 0x1d, 0x08, + 0x76, 0x01, 0xf5, 0x84, 0x23, 0x21, 0x52, 0x18, + 0x19, 0x21, 0x40, 0xb0, 0xe9, 0x47, 0xf0, 0x98, + 0x52, 0x10, 0x02, 0x11, 0xac, 0xb0, 0xb5, 0x2d, + 0x5c, 0x07, 0x03, 0x98, 0x70, 0x38, 0x36, 0x07, + 0x56, 0xa2, 0x96, 0x95, 0xcd, 0x39, 0xc8, 0x0b, + 0x70, 0xd5, 0x57, 0xeb, 0xdc, 0x45, 0xc1, 0xc0, + 0x5a, 0xa6, 0xc5, 0x0f, 0xb9, 0xd4, 0x98, 0x2d, + 0x21, 0x1b, 0xaf, 0x0f, 0x3b, 0x5f, 0x56, 0xbe, + 0x88, 0x82, 0x55, 0x41, 0x27, 0x78, 0xfd, 0x60, + 0x26, 0x0c, 0x46, 0x1c, 0xa6, 0x3e, 0x35, 0xca, + 0x0b, 0x77, 0x39, 0x3d, 0x56, 0x6d, 0x7b, 0xc7, + 0x37, 0x08, 0x53, 0x13, 0x76, 0xc1, 0x7d, 0x45, + 0x0a, 0x21, 0x84, 0x10, 0xaa, 0xc5, 0xef, 0x87, + 0xf1, 0x6d, 0xef, 0x24, 0xd8, 0x73, 0xc7, 0x1c, + 0x71, 0xc7, 0x1c, 0x71, 0xc7, 0x1c, 0x71, 0xc7, + 0x1c, 0x71, 0xc7, 0x1c, 0x71, 0xc7, 0x1c, 0x71, + 0xc7, 0x1c, 0xd5, 0x79, 0x9d, 0x31, 0x71, 0xa6, + 0x50, 0x9c, 0xc8, 0x25, 0x14, 0xc2, 0xae, 0x81, + 0x00, 0x69, 0x48, 0x5b, 0x0a, 0x4a, 0x01, 0xf7, + 0x07, 0x98, 0xbb, 0x85, 0x7a, 0xa9, 0x52, 0xb9, + 0x50, 0xac, 0x62, 0xa1, 0xec, 0x46, 0x69, 0x7d, + 0xc3, 0x71, 0xa3, 0x73, 0x12, 0x48, 0x06, 0xb3, + 0x8c, 0x27, 0x3d, 0xdd, 0x5c, 0xd2, 0x80, 0xd3, + 0xec, 0x2a, 0x06, 0xb3, 0xb2, 0x40, 0x54, 0x5a, + 0xfd, 0x43, 0xbe, 0x44, 0xb9, 0xcb, 0x2c, 0x75, + 0xf6, 0x8e, 0xae, 0xa5, 0x14, 0x1a, 0xac, 0x80, + 0x1f, 0xa8, 0x3d, 0xd5, 0x67, 0xae, 0xcc, 0x29, + 0xef, 0x04, 0x33, 0xc9, 0xa1, 0x2a, 0x9e, 0x06, + 0x1c, 0xc7, 0x2d, 0x40, 0xb0, 0x63, 0x61, 0x8c, + 0x62, 0x00, 0x1a, 0x4c, 0x12, 0x59, 0x5d, 0x05, + 0xfb, 0x63, 0x19, 0x17, 0x5c, 0x21, 0x49, 0x76, + 0x2f, 0x57, 0x4a, 0xfb, 0x43, 0x08, 0x9a, 0x22, + 0xb1, 0x85, 0x8f, 0x59, 0x7c, 0x00, 0xe2, 0xa4, + 0x07, 0x61, 0xc2, 0x40, 0x40, 0x43, 0xc6, 0xc2, + 0x23, 0x2e, 0x96, 0x06, 0x6b, 0x09, 0x43, 0x2e, + 0x1f, 0xcf, 0x41, 0xcc, 0x8c, 0x0a, 0x8e, 0xfa, + 0xc0, 0x56, 0x56, 0x39, 0x12, 0xdb, 0xc2, 0x38, + 0x11, 0x25, 0x93, 0x85, 0x15, 0xa1, 0x2a, 0x6b, + 0xc2, 0x04, 0x19, 0x09, 0x7b, 0xe3, 0x1b, 0x00, + 0xb5, 0x89, 0xb8, 0xa3, 0x94, 0xab, 0xa0, 0x08, + 0x04, 0x15, 0xbf, 0x51, 0x36, 0x05, 0xbc, 0xb3, + 0x42, 0xc4, 0x41, 0x84, 0x4a, 0x21, 0x23, 0x97, + 0x1b, 0x30, 0x7c, 0x40, 0xcb, 0x05, 0x80, 0x05, + 0xab, 0xc1, 0x59, 0x30, 0x54, 0x29, 0x45, 0x35, + 0xcc, 0x25, 0x1b, 0x92, 0xa2, 0x81, 0x68, 0xad, + 0xab, 0x85, 0x71, 0xf4, 0x24, 0x5f, 0x68, 0x50, + 0x50, 0xb1, 0x48, 0x4e, 0xae, 0x90, 0x1c, 0xc4, + 0x66, 0xf7, 0xa9, 0x1d, 0x20, 0xf1, 0x0d, 0x61, + 0x84, 0x12, 0xaa, 0xb9, 0x98, 0xac, 0xb3, 0x54, + 0x0e, 0x95, 0xd4, 0x8f, 0x78, 0xcb, 0x25, 0x38, + 0x6a, 0x4c, 0x4a, 0xda, 0x1a, 0x69, 0x80, 0x1a, + 0x96, 0x06, 0xb6, 0xbf, 0xc9, 0x80, 0xbd, 0x47, + 0x52, 0x00, 0xd7, 0x3c, 0x7a, 0x99, 0x5f, 0x78, + 0x52, 0x98, 0xac, 0xea, 0x6d, 0x90, 0xa4, 0x02, + 0x80, 0x84, 0xc1, 0xc5, 0xd5, 0x07, 0x8a, 0x01, + 0xc3, 0xc2, 0x28, 0x94, 0x7f, 0x3e, 0x99, 0x04, + 0x97, 0x2b, 0x0d, 0x6d, 0x7d, 0x37, 0x2c, 0x93, + 0x71, 0xcf, 0xfe, 0xbb, 0x6a, 0x61, 0x01, 0xe8, + 0x3e, 0xd0, 0x23, 0xa9, 0x08, 0xf4, 0x52, 0xd7, + 0x5a, 0xab, 0x09, 0xa0, 0x59, 0x2e, 0xff, 0x00, + 0x9d, 0x29, 0x4a, 0x52, 0x94, 0xa5, 0x29, 0x49, + 0x4a, 0x80, 0x60, 0xe8, 0x70, 0xff, 0x00, 0x80, + 0x29, 0x4a, 0x52, 0x94, 0x41, 0x94, 0x67, 0xdf, + 0x7a, 0xfa, 0x7d, 0x9f, 0xfc, 0x82, 0xa2, 0x9d, + 0x14, 0x02, 0x11, 0xa6, 0x70, 0xe0, 0x41, 0x21, + 0xd1, 0x8e, 0xae, 0x86, 0x51, 0x6f, 0x96, 0x24, + 0x5c, 0x73, 0xae, 0x36, 0xff, 0x00, 0xa5, 0xb7, + 0x2c, 0x92, 0xdd, 0x9a, 0xff, 0x00, 0xd8, 0x2b, + 0xc8, 0xb1, 0xc1, 0xd6, 0x79, 0x4c, 0xe5, 0x33, + 0x94, 0xce, 0x53, 0x39, 0x4c, 0x09, 0x84, 0x48, + 0x31, 0x00, 0xf7, 0x31, 0x27, 0xbb, 0x00, 0x2c, + 0x61, 0x59, 0x5f, 0xa5, 0x62, 0x43, 0xd4, 0xc1, + 0xa3, 0x3a, 0x93, 0x69, 0x25, 0xb0, 0x0e, 0xa9, + 0x0a, 0x62, 0xe1, 0x30, 0x32, 0x00, 0x3a, 0x48, + 0xb0, 0x17, 0xc1, 0xf8, 0x30, 0x90, 0x63, 0x7f, + 0x8c, 0x0c, 0xbc, 0x6b, 0x19, 0x12, 0x25, 0xea, + 0x49, 0xc3, 0x24, 0x5c, 0x04, 0x9a, 0x45, 0x16, + 0xda, 0xcd, 0x82, 0x8c, 0xba, 0xc3, 0x78, 0xf0, + 0x82, 0x20, 0xc7, 0x1a, 0xfc, 0x40, 0x15, 0xe4, + 0x75, 0x88, 0x84, 0xce, 0x87, 0xa0, 0x4e, 0x53, + 0x39, 0x4c, 0xe5, 0x33, 0x94, 0xce, 0x53, 0x08, + 0x44, 0x13, 0x83, 0x83, 0x4a, 0xb6, 0xee, 0xf4, + 0xfb, 0xbf, 0xf9, 0x14, 0xf3, 0x40, 0x8a, 0xb1, + 0xd4, 0x1c, 0x24, 0x99, 0xa1, 0xaf, 0x92, 0x00, + 0x1f, 0x79, 0xa8, 0xfb, 0xb8, 0x97, 0x7f, 0xd2, + 0xdb, 0x56, 0x49, 0x66, 0xcd, 0x7f, 0xec, 0x05, + 0x43, 0x63, 0xfe, 0xa6, 0x46, 0x12, 0xe4, 0x49, + 0xb0, 0x81, 0xbd, 0x76, 0xec, 0xb6, 0x32, 0x0c, + 0x38, 0x85, 0x3e, 0x4c, 0x07, 0xd3, 0x25, 0x5a, + 0x80, 0xc8, 0x0e, 0x9a, 0x06, 0x8a, 0x80, 0xea, + 0x88, 0x22, 0x6c, 0x56, 0x06, 0x3a, 0xd1, 0x00, + 0x26, 0x98, 0x02, 0x80, 0x58, 0xdf, 0x38, 0x48, + 0xfc, 0x22, 0x26, 0x86, 0x10, 0x69, 0x8a, 0x9a, + 0x18, 0xaf, 0xfb, 0x84, 0x74, 0xcc, 0xe1, 0x47, + 0x48, 0xd6, 0x02, 0x3d, 0xc8, 0xfd, 0xe6, 0x62, + 0x89, 0xb6, 0x31, 0xff, 0x00, 0xdd, 0xfd, 0xb7, + 0xda, 0xbd, 0x2e, 0x0f, 0xd9, 0xa9, 0xaf, 0xf9, + 0x91, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x12, 0xce, 0x7d, 0x70, 0xf4, 0xd9, + 0xb2, 0x4b, 0x76, 0x6b, 0x8e, 0x38, 0xe3, 0x8e, + 0x38, 0xe3, 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0xe3, + 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0xe3, 0x8e, 0x3f, + 0x48, 0x4c, 0x6d, 0x2b, 0xa8, 0xc5, 0x8c, 0x41, + 0x8f, 0xb2, 0xf5, 0xff, 0x00, 0xcc, 0xe6, 0xbc, + 0x67, 0x35, 0xe3, 0x39, 0xaf, 0x19, 0xcd, 0x78, + 0xce, 0x6b, 0xc6, 0x73, 0x5e, 0x33, 0x9a, 0xf1, + 0x9c, 0xd7, 0x8c, 0xe6, 0xbc, 0x67, 0x35, 0xe3, + 0x08, 0x30, 0x87, 0x17, 0x0b, 0xc1, 0x60, 0x5f, + 0xc9, 0x9c, 0xd7, 0x8c, 0xe6, 0xbc, 0x61, 0x05, + 0xd4, 0xdc, 0xb2, 0x6d, 0x73, 0x39, 0xaf, 0x19, + 0xcd, 0x78, 0xce, 0x6b, 0xc6, 0x73, 0x5e, 0x33, + 0x9a, 0xf1, 0x81, 0x64, 0xc2, 0xa7, 0x44, 0x55, + 0xb4, 0x47, 0x83, 0xcb, 0x36, 0xf4, 0xfb, 0xbf, + 0xf8, 0xb4, 0x5e, 0x3b, 0xa8, 0x9c, 0x11, 0x08, + 0x44, 0x2d, 0x80, 0x54, 0x96, 0x80, 0x02, 0x62, + 0x07, 0x25, 0xd3, 0x62, 0xc4, 0xa7, 0xde, 0x92, + 0xa2, 0xb0, 0x2c, 0xbc, 0x41, 0x35, 0x57, 0x4f, + 0xfa, 0x5b, 0x66, 0xc9, 0x37, 0x3a, 0xff, 0x00, + 0xd7, 0x95, 0xcc, 0x21, 0x7d, 0x3b, 0x13, 0x51, + 0xd0, 0x4d, 0xc1, 0xf3, 0x37, 0x07, 0xcc, 0xdc, + 0x1f, 0x33, 0x70, 0x7c, 0xcd, 0xc1, 0xf3, 0x37, + 0x07, 0xcc, 0xdc, 0x1f, 0x33, 0x70, 0x7c, 0xcd, + 0xc1, 0xf3, 0x37, 0x07, 0xcc, 0xdc, 0x1f, 0x33, + 0x70, 0x7c, 0xcd, 0xc1, 0xf3, 0x37, 0x07, 0xcc, + 0xdc, 0x1f, 0x33, 0x70, 0x7c, 0xcd, 0xc1, 0xf3, + 0x37, 0x07, 0xcc, 0xdc, 0x1f, 0x33, 0x70, 0x7c, + 0xc6, 0xe0, 0x74, 0x62, 0x12, 0x30, 0x51, 0x8c, + 0xe5, 0x2f, 0x2f, 0x4f, 0xbb, 0xff, 0x00, 0x8b, + 0x74, 0xcb, 0x10, 0xed, 0xd1, 0x01, 0xaa, 0x81, + 0xc8, 0xa0, 0x47, 0xe9, 0x60, 0x33, 0xb4, 0x13, + 0x24, 0x94, 0x85, 0x07, 0x50, 0xca, 0xff, 0x00, + 0xa5, 0xb6, 0xec, 0x93, 0x63, 0xaf, 0xfd, 0x6b, + 0xfa, 0x12, 0xc1, 0xca, 0x7a, 0xe7, 0x5c, 0xeb, + 0x9d, 0x73, 0xae, 0x75, 0xce, 0xb9, 0xd7, 0x0d, + 0xa3, 0x45, 0x03, 0x04, 0x8b, 0xbd, 0x20, 0x60, + 0xb2, 0xb2, 0x46, 0x53, 0x35, 0x56, 0x18, 0x02, + 0x34, 0x63, 0x48, 0xc4, 0xe6, 0x64, 0xe3, 0xa0, + 0x71, 0x8b, 0x0a, 0x03, 0xc3, 0x7a, 0x5e, 0x5e, + 0x70, 0xb6, 0x7a, 0x86, 0x5f, 0x61, 0x80, 0x0f, + 0x63, 0x3a, 0xe7, 0x5c, 0xeb, 0x9d, 0x73, 0xae, + 0x75, 0xce, 0xb9, 0x5c, 0xdd, 0x0b, 0xa7, 0x93, + 0xd1, 0xa8, 0x44, 0x2a, 0xc7, 0x79, 0xb4, 0x13, + 0x68, 0x26, 0xd0, 0x4d, 0xa0, 0x9b, 0x41, 0x36, + 0x82, 0x6d, 0x04, 0xda, 0x09, 0xb4, 0x13, 0x68, + 0x26, 0xd0, 0x4d, 0xa0, 0x9b, 0x41, 0x36, 0x82, + 0x6d, 0x04, 0xda, 0x09, 0xb4, 0x13, 0x68, 0x26, + 0xd0, 0x4d, 0xa0, 0x9b, 0x41, 0x2a, 0x92, 0xfe, + 0xac, 0xbd, 0x37, 0xec, 0x93, 0x63, 0xaf, 0xfd, + 0x64, 0x21, 0xb9, 0xa6, 0xa1, 0x9a, 0x86, 0x6a, + 0x19, 0xa8, 0x66, 0xa1, 0x9a, 0x86, 0x6a, 0x19, + 0xa8, 0x60, 0x30, 0x7b, 0x47, 0x8a, 0x04, 0x5a, + 0xbe, 0xbe, 0xc2, 0xff, 0x00, 0x8f, 0xa8, 0x3b, + 0x81, 0xb4, 0x48, 0x12, 0x34, 0xe9, 0x14, 0x29, + 0x6f, 0x51, 0xc8, 0xd1, 0x16, 0x85, 0x8e, 0xc1, + 0x53, 0xfb, 0x16, 0x59, 0x4f, 0x41, 0xcc, 0x17, + 0xa4, 0x0d, 0x89, 0x44, 0xc9, 0xa8, 0x66, 0xa1, + 0x9a, 0x86, 0x6a, 0x19, 0xa8, 0x66, 0xa1, 0x9a, + 0x86, 0x16, 0xc8, 0xaf, 0x49, 0xfb, 0xbf, 0xe9, + 0x58, 0xdc, 0x2a, 0xf2, 0x02, 0x1f, 0x3f, 0x00, + 0xc0, 0x81, 0x21, 0xc2, 0x10, 0x0d, 0xdd, 0x31, + 0x60, 0x33, 0x8a, 0xe6, 0x98, 0x7c, 0xd4, 0x8c, + 0x4d, 0xdd, 0x0d, 0x22, 0x26, 0x48, 0x6f, 0xf1, + 0x65, 0x4d, 0x0d, 0x71, 0x14, 0xf7, 0x8d, 0x2c, + 0xd6, 0x68, 0x32, 0x05, 0xc8, 0xb8, 0x81, 0x9a, + 0x89, 0xe1, 0x03, 0xc3, 0x20, 0x4f, 0xcd, 0x2e, + 0xb3, 0xd6, 0x14, 0x78, 0x54, 0xc9, 0x09, 0x53, + 0x0c, 0x43, 0xe2, 0x48, 0xe2, 0x7a, 0xd4, 0x42, + 0xc2, 0xba, 0x9b, 0x41, 0x85, 0x5a, 0xe0, 0x41, + 0x12, 0x05, 0x90, 0x4d, 0x8d, 0xa0, 0x7e, 0xdb, + 0xe0, 0xd5, 0x50, 0x28, 0x1a, 0x8a, 0x18, 0x4e, + 0x00, 0x13, 0x00, 0x2b, 0xe3, 0xfe, 0x16, 0xdf, + 0xb2, 0x4d, 0xce, 0xb8, 0xa2, 0x8a, 0x28, 0xa2, + 0x8a, 0x28, 0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28, + 0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28, 0xa2, 0x95, + 0xb0, 0x06, 0x75, 0x99, 0x83, 0x15, 0x10, 0xa2, + 0x0c, 0xe9, 0x9d, 0x33, 0xa6, 0x74, 0xce, 0x99, + 0xd3, 0x3a, 0x65, 0x5d, 0x1e, 0xa0, 0x99, 0x78, + 0x89, 0x5a, 0x71, 0x76, 0xa0, 0xc7, 0xba, 0x33, + 0x60, 0x0a, 0x4d, 0x25, 0x08, 0x6b, 0x98, 0x3d, + 0xd6, 0x27, 0xcc, 0x42, 0x40, 0xe0, 0xb2, 0xaf, + 0xbc, 0x0d, 0x03, 0xa0, 0xf5, 0x51, 0x38, 0x08, + 0x85, 0x50, 0x07, 0x20, 0x10, 0xfc, 0x9d, 0x33, + 0xa6, 0x74, 0xce, 0x99, 0xd3, 0x3a, 0x67, 0x4c, + 0x38, 0x55, 0x57, 0x59, 0x07, 0x8f, 0x4f, 0xb7, + 0xfe, 0x87, 0x01, 0x50, 0x91, 0x39, 0x3a, 0x0e, + 0x08, 0x8b, 0x09, 0x69, 0x40, 0x13, 0x42, 0x0f, + 0xd6, 0x13, 0x0a, 0x48, 0x4b, 0x3a, 0x41, 0x68, + 0x63, 0x80, 0xf4, 0x18, 0x73, 0xa9, 0x90, 0x59, + 0x4a, 0xbd, 0x4c, 0xc2, 0xe3, 0x08, 0x2d, 0x45, + 0x2e, 0x21, 0x15, 0xb5, 0x4b, 0x8c, 0x65, 0x53, + 0x40, 0x86, 0x19, 0xce, 0xad, 0x69, 0x2a, 0x30, + 0x10, 0x6a, 0x95, 0x28, 0x46, 0xaa, 0x4d, 0x2b, + 0xfd, 0x0b, 0x96, 0x50, 0xcc, 0x00, 0xf5, 0x55, + 0x05, 0x03, 0x50, 0xa8, 0xd0, 0xc2, 0xa0, 0x12, + 0x65, 0xa0, 0x11, 0x50, 0x00, 0x3e, 0xe9, 0x18, + 0x89, 0x64, 0x9b, 0xff, 0x00, 0xc3, 0x9b, 0x76, + 0x49, 0x6e, 0xcd, 0x71, 0x45, 0x14, 0x51, 0x45, + 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, 0x51, + 0x45, 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, 0x0c, + 0x9e, 0x0a, 0x20, 0xb0, 0x44, 0x76, 0xba, 0x2a, + 0x42, 0x31, 0xa5, 0x6d, 0x38, 0x4c, 0x70, 0x98, + 0xe1, 0x31, 0xc2, 0x63, 0x84, 0xc7, 0x09, 0x8e, + 0x13, 0x1c, 0x26, 0x38, 0x4c, 0x70, 0x98, 0xe1, + 0x31, 0xc2, 0x63, 0x84, 0xc7, 0x09, 0x8e, 0x13, + 0x1c, 0x26, 0x38, 0x4c, 0x70, 0x98, 0xe1, 0x31, + 0xc2, 0x60, 0xd5, 0x17, 0xc9, 0x42, 0x0e, 0x12, + 0xc0, 0x16, 0xc0, 0x2f, 0x40, 0x1d, 0x3a, 0x92, + 0x21, 0xff, 0x00, 0xe4, 0xe3, 0xb3, 0x8e, 0xce, + 0x3b, 0x38, 0xec, 0xe3, 0xb3, 0x8e, 0xc5, 0xc3, + 0x40, 0x83, 0xc4, 0x74, 0x76, 0x3a, 0xc2, 0x43, + 0xda, 0xce, 0x3b, 0x38, 0xec, 0xe3, 0xb3, 0x8e, + 0xce, 0x3b, 0x38, 0xec, 0xe3, 0xb3, 0x8e, 0xce, + 0x3b, 0x38, 0xec, 0xe3, 0xb3, 0x8e, 0xce, 0x3b, + 0x0c, 0x4e, 0xf8, 0x3a, 0x75, 0x1f, 0xd1, 0xe9, + 0xb3, 0x64, 0x96, 0x6c, 0xd7, 0xfe, 0xc1, 0xb6, + 0x6b, 0xfc, 0x96, 0xc9, 0x60, 0xfb, 0x0d, 0x08, + 0x1c, 0x09, 0x9a, 0x0a, 0x00, 0x79, 0xa1, 0xec, + 0x19, 0xc2, 0x04, 0x25, 0x27, 0x54, 0x86, 0xd2, + 0xeb, 0xef, 0x88, 0x82, 0x3c, 0x01, 0xc3, 0x4b, + 0x55, 0x34, 0x6f, 0xec, 0x60, 0x65, 0x8c, 0x06, + 0x14, 0x7d, 0xda, 0x30, 0xd6, 0x88, 0x66, 0x76, + 0x48, 0xc8, 0x53, 0xa9, 0xf0, 0xa5, 0xe7, 0x49, + 0xee, 0xb2, 0xa2, 0xea, 0x11, 0x0a, 0xcf, 0x48, + 0x44, 0x26, 0x0d, 0x76, 0x05, 0x10, 0x43, 0x3f, + 0xb8, 0xc4, 0x59, 0xca, 0x02, 0x37, 0x2a, 0x8f, + 0xb4, 0x3d, 0x55, 0xc2, 0xa2, 0xec, 0x06, 0x21, + 0x44, 0xb0, 0xc0, 0x25, 0x45, 0xf5, 0x73, 0xea, + 0x61, 0x77, 0x1c, 0x0c, 0x8c, 0x50, 0x40, 0x2b, + 0x4b, 0xbf, 0xaf, 0xeb, 0x66, 0xcc, 0x7f, 0x5d, + 0x3b, 0x22, 0xc2, 0x14, 0x35, 0xa4, 0x33, 0x82, + 0xa6, 0x5b, 0x71, 0x0a, 0x57, 0x43, 0xef, 0x28, + 0x66, 0x0a, 0x71, 0xd5, 0x10, 0x7b, 0x80, 0x3d, + 0xe0, 0x6a, 0x01, 0x84, 0x54, 0x82, 0x27, 0xe9, + 0xf6, 0xca, 0xfd, 0x12, 0x41, 0x21, 0x15, 0x40, + 0x10, 0x4a, 0x52, 0xc6, 0xb2, 0xc9, 0x34, 0x2a, + 0xab, 0xa2, 0xc0, 0x1a, 0xaf, 0xda, 0x61, 0xde, + 0xf4, 0xed, 0xea, 0x66, 0xec, 0x83, 0x6a, 0x22, + 0x54, 0x01, 0xae, 0x66, 0x44, 0x05, 0x84, 0xd5, + 0x7e, 0x4a, 0x22, 0x83, 0xd8, 0x00, 0xdb, 0xde, + 0x67, 0x7e, 0x34, 0x8c, 0x50, 0xba, 0x8a, 0x1a, + 0xca, 0x44, 0xc8, 0x94, 0xd4, 0x87, 0x02, 0x39, + 0x94, 0x23, 0x42, 0xa0, 0x88, 0xe8, 0x19, 0xbc, + 0xe5, 0x25, 0xf6, 0xb8, 0x01, 0x53, 0xe8, 0xb5, + 0xbc, 0xa1, 0x0d, 0xd3, 0xc4, 0x68, 0xc9, 0xd0, + 0xc2, 0xc2, 0x36, 0x28, 0x53, 0xac, 0x1e, 0xa7, + 0xfa, 0x71, 0xb3, 0x64, 0x96, 0xec, 0xd7, 0xfe, + 0xc0, 0x50, 0x60, 0x90, 0x5c, 0x8c, 0x63, 0xf9, + 0xad, 0xe4, 0x97, 0x09, 0xbe, 0xf9, 0x4a, 0x00, + 0x9c, 0xd4, 0x40, 0xa8, 0x1c, 0xc2, 0x7d, 0x94, + 0xa2, 0x06, 0x51, 0xc1, 0x38, 0x91, 0x55, 0x4c, + 0x20, 0xd4, 0x28, 0xaa, 0x2b, 0x7b, 0x2e, 0x96, + 0xa3, 0x0a, 0x40, 0x61, 0xe4, 0xfe, 0xfc, 0xcd, + 0xa4, 0x7b, 0x42, 0x48, 0x37, 0x00, 0x5e, 0xf5, + 0xc0, 0x4d, 0xcc, 0x5a, 0x00, 0x62, 0x59, 0x2a, + 0xf8, 0x85, 0x25, 0xc8, 0x6b, 0x55, 0x50, 0x00, + 0x25, 0x3d, 0xe1, 0x48, 0x6a, 0x4a, 0xa2, 0x10, + 0x05, 0x80, 0xce, 0x3b, 0xd5, 0xd0, 0x05, 0x14, + 0x8c, 0x56, 0x0d, 0xf5, 0x10, 0xae, 0xa6, 0x14, + 0x46, 0x86, 0xb6, 0x34, 0xf8, 0x80, 0x0d, 0x2e, + 0x60, 0x43, 0x15, 0x45, 0x40, 0x32, 0xa8, 0x3f, + 0xa0, 0xf1, 0x55, 0x1d, 0xc0, 0xbb, 0x3d, 0x01, + 0x40, 0xcb, 0x48, 0x02, 0x24, 0x7d, 0xff, 0x00, + 0x16, 0xef, 0x82, 0x1d, 0x54, 0x23, 0x46, 0xc9, + 0xf6, 0xca, 0x03, 0xd2, 0x14, 0xd9, 0x31, 0x0b, + 0xba, 0x5d, 0x15, 0x21, 0x05, 0xd6, 0x98, 0x31, + 0x46, 0x2a, 0x97, 0x24, 0x1b, 0xa2, 0xac, 0x03, + 0xb4, 0x36, 0x05, 0xbe, 0x51, 0x33, 0x2a, 0x09, + 0x1c, 0x96, 0xb0, 0x1e, 0x81, 0x07, 0x2d, 0xc3, + 0x44, 0x66, 0xd2, 0xd1, 0x15, 0x2a, 0x16, 0x15, + 0x00, 0x5d, 0x4d, 0x71, 0x13, 0x0f, 0x69, 0x55, + 0x2b, 0x71, 0x87, 0x49, 0x4e, 0x3f, 0x90, 0xa4, + 0x08, 0xcd, 0xd4, 0x58, 0xb1, 0xbc, 0x58, 0x36, + 0x06, 0x86, 0xf0, 0x22, 0x28, 0x7f, 0x21, 0x29, + 0x11, 0x75, 0x60, 0xcb, 0x2a, 0x58, 0x00, 0xb9, + 0x8c, 0x77, 0x08, 0xb4, 0x0d, 0x10, 0x29, 0x58, + 0x4d, 0x6d, 0x57, 0xd4, 0xa4, 0xc0, 0x90, 0xd9, + 0xa8, 0x57, 0x15, 0xad, 0x05, 0xa8, 0x1e, 0xbc, + 0x02, 0x46, 0xbf, 0xc1, 0xdf, 0x01, 0xe7, 0x48, + 0x3f, 0x3d, 0x36, 0xac, 0x93, 0x71, 0xcf, 0xfe, + 0xce, 0x78, 0x30, 0xf3, 0x19, 0x83, 0x81, 0x84, + 0xc4, 0x9e, 0x88, 0x5b, 0xf5, 0x36, 0xdf, 0x13, + 0x6d, 0xf1, 0x36, 0xdf, 0x13, 0x6d, 0xf1, 0x36, + 0xdf, 0x13, 0x6d, 0xf1, 0x36, 0xdf, 0x13, 0x6d, + 0xf1, 0x36, 0xdf, 0x13, 0x6d, 0xf1, 0x36, 0xdf, + 0x13, 0x6d, 0xf1, 0x36, 0xdf, 0x13, 0x6d, 0xf1, + 0x36, 0xdf, 0x13, 0x6d, 0xf1, 0x36, 0xdf, 0x13, + 0x6d, 0xf1, 0x36, 0xdf, 0x12, 0xe3, 0x3c, 0x4c, + 0x01, 0xfa, 0x19, 0x8c, 0x9a, 0x1f, 0x4a, 0x9b, + 0xdc, 0x95, 0x5c, 0xc1, 0xc0, 0xc7, 0x61, 0xa1, + 0x12, 0x5f, 0xe4, 0x94, 0xa5, 0x29, 0x4a, 0x52, + 0x94, 0xa5, 0x29, 0x4a, 0x52, 0x94, 0xa4, 0x36, + 0x27, 0x59, 0xee, 0xca, 0x4a, 0x79, 0x14, 0x40, + 0x80, 0x60, 0x07, 0xa6, 0xf5, 0x92, 0x6e, 0x39, + 0xe2, 0x96, 0x85, 0x90, 0x75, 0x61, 0xfe, 0x8a, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x39, 0xda, + 0x13, 0x97, 0xff, 0x00, 0x47, 0x72, 0xc9, 0x36, + 0x1c, 0xfe, 0x85, 0x4c, 0x4a, 0xc5, 0x35, 0xa3, + 0x55, 0xd4, 0x4c, 0x1f, 0xe5, 0xe8, 0x20, 0x82, + 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, + 0x82, 0x08, 0x20, 0x82, 0x0a, 0xb0, 0x26, 0xff, + 0x00, 0x48, 0x6f, 0x38, 0x41, 0x22, 0x0d, 0x08, + 0x97, 0xc9, 0x57, 0x48, 0x43, 0x6b, 0x08, 0xfe, + 0x01, 0x38, 0x0c, 0xe0, 0x33, 0x80, 0xce, 0x03, + 0x38, 0x0c, 0xe0, 0x33, 0x80, 0xce, 0x03, 0x38, + 0x0c, 0xe0, 0x33, 0x80, 0xce, 0x03, 0x38, 0x0c, + 0xe0, 0x33, 0x80, 0xce, 0x03, 0x38, 0x0c, 0xe0, + 0x33, 0x80, 0xce, 0x03, 0x2d, 0xf1, 0xad, 0x7f, + 0xc8, 0x86, 0xe4, 0x53, 0x5c, 0xf4, 0x16, 0x36, + 0x99, 0x4a, 0xd2, 0xd4, 0xcd, 0xd1, 0xf3, 0x37, + 0x47, 0xcc, 0xdd, 0x1f, 0x33, 0x74, 0x7c, 0xcd, + 0xd1, 0xf3, 0x37, 0x47, 0xcc, 0xdd, 0x1f, 0x33, + 0x74, 0x7c, 0xcd, 0xd1, 0xf3, 0x37, 0x47, 0xcc, + 0xdd, 0x1f, 0x33, 0x74, 0x7c, 0xcd, 0xd1, 0xf3, + 0x37, 0x47, 0xcc, 0xdd, 0x1f, 0x33, 0x74, 0x7c, + 0xcd, 0xd1, 0xf3, 0x37, 0x47, 0xcc, 0xdd, 0x1f, + 0x33, 0x74, 0x7c, 0xcd, 0xd1, 0xf3, 0x01, 0x17, + 0x44, 0x4b, 0x36, 0x44, 0x61, 0x04, 0x0b, 0x48, + 0x89, 0xbd, 0x64, 0x9b, 0x6e, 0x7f, 0x43, 0xfa, + 0x3f, 0x21, 0xad, 0x64, 0x34, 0x09, 0x3a, 0xe0, + 0x19, 0xd7, 0x28, 0x87, 0x3b, 0x47, 0x06, 0x6b, + 0x31, 0x3f, 0x6b, 0x1f, 0x7b, 0x4c, 0x31, 0xcd, + 0x56, 0xed, 0x6b, 0x0c, 0x54, 0x70, 0x28, 0x65, + 0x2a, 0xc8, 0xd0, 0x2a, 0xc3, 0x40, 0xc0, 0x44, + 0x88, 0x48, 0x60, 0x57, 0x49, 0x75, 0x3f, 0xb0, + 0x2f, 0x78, 0x0a, 0x95, 0xc2, 0xad, 0x44, 0x2d, + 0x66, 0xb7, 0x8e, 0xae, 0x61, 0x9c, 0x60, 0x88, + 0x4d, 0x81, 0x00, 0x58, 0xc5, 0x00, 0x49, 0x17, + 0x24, 0x61, 0x1f, 0x74, 0x00, 0x24, 0x04, 0x33, + 0x67, 0x2a, 0x3e, 0xeb, 0x80, 0x59, 0x13, 0x02, + 0xfa, 0x6a, 0xe5, 0xd0, 0x5a, 0x1c, 0x8b, 0xc3, + 0x25, 0x90, 0xf8, 0x97, 0x6c, 0x40, 0x6c, 0xb9, + 0x28, 0x3c, 0xab, 0x09, 0x81, 0xb2, 0x4e, 0x9f, + 0x5c, 0xa5, 0x1b, 0xe0, 0x5a, 0xc4, 0x0c, 0xbe, + 0xe7, 0x50, 0x0f, 0x47, 0x3a, 0xe2, 0x1e, 0x10, + 0x1f, 0x30, 0x21, 0x8c, 0xc6, 0x75, 0x31, 0xfb, + 0x4e, 0xb8, 0xdb, 0x8d, 0x00, 0x62, 0x4c, 0x4a, + 0x01, 0x45, 0xc7, 0x2e, 0x10, 0x0d, 0x53, 0x25, + 0xe4, 0x08, 0xa1, 0xb4, 0x2b, 0x53, 0x00, 0x52, + 0xac, 0xd9, 0xe5, 0x15, 0x9e, 0xd7, 0x87, 0x33, + 0x94, 0x0a, 0x2e, 0x28, 0x80, 0x37, 0x7b, 0xb4, + 0x84, 0x9b, 0x84, 0xe8, 0xc4, 0x8b, 0xf1, 0x2e, + 0x66, 0xe2, 0x08, 0xfb, 0xc3, 0x8a, 0x63, 0x65, + 0x11, 0x1b, 0x7b, 0x43, 0x9c, 0xbb, 0x75, 0x2e, + 0xab, 0x2e, 0x4f, 0x70, 0x23, 0xd4, 0xc3, 0x1c, + 0xb0, 0x10, 0x48, 0x5c, 0x7a, 0x63, 0x01, 0xa6, + 0x44, 0x6f, 0x56, 0x68, 0x51, 0xe1, 0x2b, 0xae, + 0xcc, 0x1a, 0x36, 0x38, 0x8d, 0x23, 0x12, 0x19, + 0x93, 0x84, 0x64, 0x71, 0x80, 0xe4, 0x8b, 0x11, + 0x3f, 0xbd, 0xa1, 0xd2, 0x09, 0x61, 0x54, 0xb3, + 0x64, 0x73, 0x97, 0xdc, 0xe7, 0x07, 0x43, 0x86, + 0x67, 0xb4, 0x21, 0x7c, 0x68, 0x25, 0xfa, 0xb4, + 0x34, 0x47, 0xb4, 0xeb, 0x95, 0x71, 0x60, 0xd1, + 0xa5, 0xe0, 0xb6, 0xdb, 0xb9, 0x0e, 0x43, 0xc8, + 0x13, 0xaa, 0x75, 0x4e, 0xa9, 0xd5, 0x3a, 0xa7, + 0x54, 0xea, 0x8b, 0x75, 0x9d, 0x40, 0xa8, 0x00, + 0x5c, 0x67, 0x0d, 0xcd, 0xaa, 0x25, 0x02, 0xaf, + 0x44, 0x1a, 0x41, 0xc1, 0x99, 0xd1, 0xa3, 0x97, + 0xdc, 0xee, 0x07, 0x43, 0x8c, 0x33, 0x8e, 0x15, + 0x04, 0x8d, 0x25, 0xe8, 0x4c, 0x04, 0xf6, 0x82, + 0xa4, 0x2b, 0x0c, 0x1e, 0xcf, 0x27, 0x3a, 0xa7, + 0x54, 0xea, 0x9d, 0x53, 0xaa, 0x75, 0x4e, 0xa8, + 0x32, 0x88, 0x16, 0x0c, 0x00, 0x02, 0x9f, 0xf8, + 0x9b, 0xde, 0x49, 0xbe, 0xe7, 0xf4, 0xfc, 0xff, + 0x00, 0x90, 0xac, 0x09, 0x5d, 0xa4, 0xd7, 0x31, + 0x84, 0x85, 0x8b, 0x85, 0x56, 0xf1, 0x87, 0x8d, + 0x28, 0x55, 0x32, 0xa8, 0x31, 0x5d, 0xe5, 0x27, + 0xfe, 0x95, 0x2a, 0xd9, 0x1c, 0x15, 0x68, 0x88, + 0xb2, 0xdd, 0x54, 0xfd, 0x86, 0x0f, 0x5f, 0x98, + 0x36, 0xae, 0x88, 0x60, 0xeb, 0xf2, 0x98, 0x7f, + 0x26, 0x46, 0xb5, 0x84, 0x6c, 0xca, 0x95, 0x86, + 0x32, 0xa4, 0x15, 0xf1, 0x5a, 0xb4, 0x21, 0x46, + 0x31, 0x1d, 0xe8, 0x69, 0x36, 0x35, 0x1e, 0x95, + 0x80, 0x89, 0x92, 0x01, 0x24, 0x59, 0xfb, 0x42, + 0x47, 0x88, 0x96, 0x4c, 0x8b, 0x41, 0x36, 0x43, + 0x0c, 0x06, 0x14, 0x66, 0x0c, 0xf1, 0x7e, 0xc1, + 0x5f, 0xb9, 0x48, 0xc1, 0xa2, 0x80, 0x06, 0x82, + 0xe0, 0xb5, 0xe4, 0x89, 0x0e, 0xb1, 0x47, 0xdc, + 0x17, 0x26, 0xdc, 0xaa, 0xa9, 0xce, 0xe8, 0xde, + 0x28, 0xf2, 0xd0, 0x44, 0x2c, 0x30, 0x92, 0x74, + 0x0f, 0x21, 0xc0, 0x65, 0x35, 0xcc, 0xbf, 0x0d, + 0xbf, 0xbe, 0x9e, 0xa1, 0xb9, 0xe6, 0xb9, 0x83, + 0x20, 0x45, 0xc8, 0xe1, 0x5b, 0xc2, 0x6b, 0x94, + 0x81, 0xa8, 0x58, 0x2f, 0x21, 0xda, 0x02, 0x47, + 0xec, 0xd8, 0x2c, 0x4c, 0x1a, 0xf9, 0x8f, 0xe8, + 0x10, 0xd0, 0x1b, 0xe4, 0xf0, 0x21, 0xaf, 0x4e, + 0x32, 0xef, 0xb3, 0x3f, 0x78, 0x89, 0xd1, 0x03, + 0x90, 0x10, 0xb4, 0x36, 0x6d, 0x5a, 0x18, 0x19, + 0xe0, 0xf2, 0x81, 0xb6, 0x74, 0x86, 0x8d, 0x45, + 0x77, 0x99, 0x8e, 0x0d, 0x44, 0x39, 0x48, 0x78, + 0x9e, 0xbc, 0x84, 0x9b, 0x11, 0x8a, 0x5d, 0xec, + 0x68, 0x0d, 0x07, 0x53, 0x8c, 0x54, 0xe2, 0x8a, + 0x15, 0xe2, 0x01, 0xb3, 0x32, 0x11, 0x46, 0x22, + 0x53, 0x30, 0xe7, 0x0c, 0x9a, 0xbd, 0x94, 0x25, + 0x48, 0x61, 0x3a, 0x42, 0x32, 0x05, 0x0c, 0x9b, + 0x59, 0x87, 0x21, 0x0e, 0x8b, 0x3e, 0xb0, 0x1b, + 0xe7, 0x38, 0x64, 0x09, 0x26, 0x00, 0xad, 0x0a, + 0x0a, 0x78, 0x86, 0x14, 0x41, 0x40, 0x68, 0x14, + 0x12, 0x51, 0xda, 0x0e, 0x2d, 0x5c, 0x1c, 0x69, + 0xab, 0x69, 0xfc, 0x66, 0x3a, 0x99, 0xae, 0x61, + 0x1e, 0xc6, 0x0d, 0xa3, 0x38, 0x50, 0x04, 0xd4, + 0x9f, 0x79, 0xac, 0x66, 0xb1, 0x9a, 0xc6, 0x6b, + 0x19, 0xac, 0x66, 0xb1, 0x9a, 0xc6, 0x55, 0x97, + 0xc7, 0x26, 0x3a, 0x01, 0xab, 0x82, 0xb0, 0x27, + 0x90, 0x43, 0x4f, 0x61, 0xf3, 0x1a, 0x20, 0x8b, + 0x34, 0x31, 0xab, 0xb8, 0xd2, 0x10, 0x14, 0xf1, + 0x0c, 0x28, 0x82, 0x80, 0xd0, 0x29, 0x54, 0xb7, + 0xa9, 0x69, 0x55, 0x1a, 0xca, 0x97, 0x78, 0xd9, + 0x07, 0xc4, 0xea, 0xfe, 0x04, 0x34, 0x4b, 0x8b, + 0x91, 0x4b, 0x0d, 0x06, 0x53, 0x58, 0xcd, 0x63, + 0x35, 0x8c, 0xd6, 0x33, 0x58, 0xcd, 0x63, 0x35, + 0x8c, 0xd6, 0x33, 0xef, 0x0f, 0xc1, 0x36, 0x3c, + 0x93, 0x6d, 0xcf, 0x14, 0xfc, 0xff, 0x00, 0x90, + 0x89, 0x98, 0xc9, 0xcc, 0x24, 0xe8, 0x96, 0x42, + 0x24, 0x6b, 0x2b, 0xa0, 0x80, 0x0f, 0x81, 0x3e, + 0x82, 0x86, 0xb2, 0x77, 0x84, 0x8d, 0x4c, 0x2a, + 0x52, 0x2d, 0x85, 0x7d, 0xe5, 0xd2, 0x02, 0x14, + 0xac, 0xdf, 0x0a, 0x5f, 0x09, 0x65, 0x50, 0x0a, + 0x00, 0xb5, 0xad, 0x33, 0xd0, 0x64, 0xab, 0xd4, + 0xe3, 0xef, 0x0f, 0x68, 0xe1, 0x40, 0x28, 0x3a, + 0x4a, 0x71, 0x43, 0x41, 0xa1, 0x1d, 0x90, 0x82, + 0x24, 0x55, 0x8e, 0x91, 0x86, 0x98, 0x87, 0x03, + 0x5e, 0x1a, 0x45, 0x68, 0x33, 0x50, 0x11, 0x5c, + 0xf0, 0x84, 0xc3, 0x60, 0x54, 0xc7, 0xef, 0xb4, + 0x24, 0x6a, 0x61, 0x52, 0x91, 0x6c, 0x2b, 0xef, + 0x08, 0x50, 0x14, 0xc8, 0xb3, 0x49, 0x4a, 0x22, + 0x69, 0x14, 0x81, 0x2b, 0x68, 0x48, 0x60, 0xc0, + 0xe1, 0x57, 0x7b, 0xc2, 0x8b, 0x28, 0x90, 0x02, + 0xa1, 0x02, 0xc0, 0xd2, 0x66, 0xf3, 0x90, 0x07, + 0xd5, 0x5e, 0x74, 0x46, 0xa2, 0x04, 0x42, 0x94, + 0xdb, 0x58, 0x20, 0xa1, 0x00, 0x87, 0x27, 0x32, + 0x10, 0x85, 0x0e, 0x52, 0x20, 0xe1, 0x3a, 0x62, + 0xec, 0xae, 0x46, 0xbe, 0xd0, 0x96, 0xdb, 0x40, + 0x02, 0x0f, 0xb1, 0x96, 0x84, 0xc0, 0x40, 0x28, + 0x2d, 0xd3, 0xda, 0x03, 0xb7, 0x4d, 0x69, 0xf8, + 0xaf, 0xbc, 0x6d, 0x35, 0x3b, 0x57, 0x3c, 0x27, + 0xc6, 0xc3, 0xe3, 0x2d, 0x07, 0x82, 0x41, 0x02, + 0x0c, 0x0d, 0x0d, 0xe5, 0x7f, 0x4e, 0x80, 0x2a, + 0x8b, 0x19, 0x55, 0xa2, 0x32, 0x65, 0x24, 0x52, + 0x45, 0x4e, 0x86, 0xe2, 0x3d, 0x59, 0x89, 0x4a, + 0x84, 0xde, 0x02, 0x1e, 0x04, 0x34, 0x35, 0x1c, + 0x84, 0x05, 0xb1, 0x47, 0x0f, 0xa2, 0x50, 0x02, + 0x14, 0x81, 0x25, 0x40, 0xb1, 0x18, 0x39, 0x70, + 0x6d, 0x93, 0xbc, 0x30, 0x94, 0x88, 0x00, 0x04, + 0x45, 0xa1, 0xf3, 0xa5, 0x6a, 0x23, 0xd0, 0xa0, + 0xce, 0x06, 0x35, 0x02, 0x05, 0xa8, 0x94, 0xa0, + 0xbb, 0x4f, 0x24, 0xe9, 0x84, 0x48, 0xda, 0x88, + 0x35, 0x7e, 0xe0, 0xad, 0x22, 0x4f, 0xcc, 0xa4, + 0x20, 0xeb, 0x30, 0x4c, 0x7f, 0xc2, 0xaa, 0xaa, + 0x9f, 0xd0, 0x58, 0x55, 0x78, 0xa4, 0xa1, 0x9c, + 0xac, 0x2d, 0x0c, 0xd5, 0x42, 0x00, 0xa6, 0x77, + 0x78, 0x7c, 0xe9, 0x56, 0x88, 0xf4, 0x28, 0x54, + 0x80, 0x40, 0x01, 0x0a, 0x3d, 0xa5, 0x46, 0x60, + 0x12, 0x5a, 0xc0, 0x4a, 0x32, 0x4b, 0xa9, 0xf5, + 0x40, 0x2c, 0xff, 0x00, 0xe1, 0x55, 0x53, 0x28, + 0x9d, 0x0a, 0x43, 0x16, 0xe8, 0x3e, 0x94, 0x9b, + 0x1e, 0x49, 0xb2, 0xe7, 0xf4, 0xfc, 0x3f, 0x93, + 0x32, 0x48, 0x84, 0xf0, 0x3d, 0xa0, 0xc5, 0x95, + 0xb2, 0xbb, 0x4d, 0x95, 0xda, 0x6c, 0xae, 0xd3, + 0x65, 0x76, 0x9b, 0x2b, 0xb4, 0xd9, 0x5d, 0xa6, + 0xca, 0xed, 0x36, 0x57, 0x69, 0xb2, 0xbb, 0x4d, + 0x95, 0xda, 0x6c, 0xae, 0xd3, 0x65, 0x76, 0x9b, + 0x2b, 0xb4, 0xd9, 0x5d, 0xa6, 0xca, 0xed, 0x36, + 0x57, 0x69, 0xb2, 0xbb, 0x4d, 0x95, 0xda, 0x6c, + 0xae, 0xd3, 0x65, 0x76, 0x87, 0x27, 0x54, 0x1a, + 0x0f, 0xe7, 0xa0, 0x28, 0xb1, 0x28, 0x9e, 0x29, + 0x9b, 0xc8, 0xc4, 0x8b, 0xff, 0x00, 0x95, 0x14, + 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, + 0x14, 0x51, 0x45, 0x14, 0x51, 0x44, 0x23, 0xcb, + 0x00, 0x3f, 0x12, 0x92, 0x0c, 0x89, 0x60, 0xc6, + 0x1e, 0x82, 0x7e, 0xa1, 0x10, 0xe0, 0x70, 0x8d, + 0x57, 0xce, 0x75, 0x5f, 0x39, 0xd5, 0x7c, 0xe7, + 0x55, 0xf3, 0x9d, 0x57, 0xce, 0x75, 0x5f, 0x39, + 0xd5, 0x7c, 0xe7, 0x55, 0xf3, 0x9d, 0x57, 0xce, + 0x75, 0x5f, 0x39, 0xd5, 0x7c, 0xe7, 0x55, 0xf3, + 0x9d, 0x57, 0xce, 0x75, 0x5f, 0x39, 0xd5, 0x7c, + 0xe7, 0x55, 0xf3, 0x9d, 0x57, 0xce, 0x75, 0x5f, + 0x39, 0xd5, 0x7c, 0xe7, 0x55, 0xf3, 0x9d, 0x57, + 0xce, 0x46, 0xc4, 0x19, 0x14, 0xc6, 0xfe, 0x8d, + 0xaf, 0x24, 0xdd, 0x73, 0xfa, 0x7e, 0x1f, 0xc9, + 0xf7, 0x7f, 0xd0, 0x06, 0x40, 0xb7, 0x58, 0x18, + 0xf1, 0x0e, 0x01, 0x98, 0x3b, 0x30, 0x3a, 0x93, + 0x49, 0x55, 0x24, 0xc1, 0x29, 0x70, 0xb4, 0x8f, + 0x93, 0xa7, 0xa4, 0xaf, 0xac, 0x40, 0xc5, 0xda, + 0x48, 0xa1, 0x6d, 0xcc, 0xe2, 0x67, 0x0e, 0x70, + 0xe4, 0xe0, 0xd0, 0x00, 0x05, 0x0d, 0x30, 0xc3, + 0xae, 0xa5, 0x55, 0xb3, 0x98, 0x59, 0x59, 0x60, + 0x30, 0xc6, 0x57, 0x23, 0x32, 0x90, 0x00, 0x00, + 0x01, 0x1a, 0x6b, 0x40, 0xf1, 0x5d, 0xc1, 0xd5, + 0x91, 0x57, 0xed, 0xfe, 0xf6, 0xec, 0xbd, 0x6d, + 0x6f, 0xa7, 0xf6, 0x2a, 0xc9, 0x82, 0x49, 0x2d, + 0x51, 0x48, 0x70, 0xfa, 0x32, 0xa8, 0x81, 0x91, + 0xfc, 0x05, 0xf0, 0x82, 0x5e, 0x6a, 0x07, 0xe2, + 0x1e, 0x25, 0x57, 0xde, 0x06, 0x38, 0x0d, 0xac, + 0xae, 0x61, 0xac, 0x0f, 0x36, 0x8d, 0x01, 0x57, + 0x23, 0xa7, 0xd4, 0x88, 0x96, 0xac, 0x18, 0x50, + 0x80, 0x83, 0x90, 0x82, 0x23, 0xfd, 0x2b, 0x0c, + 0x02, 0x2f, 0x00, 0x15, 0xe6, 0x37, 0xed, 0x2f, + 0xa2, 0x3f, 0xe4, 0x19, 0xad, 0x3f, 0x6c, 0x00, + 0x5d, 0xfd, 0xa1, 0x92, 0xe9, 0x46, 0x61, 0x26, + 0x80, 0x9a, 0xb4, 0x11, 0x10, 0x62, 0x54, 0x36, + 0xc4, 0x52, 0xb1, 0x82, 0xa9, 0x0b, 0xfa, 0xc0, + 0x3c, 0xe1, 0x08, 0x40, 0x6e, 0x29, 0x06, 0xfc, + 0x0c, 0x11, 0x10, 0x46, 0xc8, 0x2f, 0xdc, 0x20, + 0x39, 0xa3, 0x63, 0x1a, 0x5f, 0x8f, 0x9a, 0x61, + 0xcd, 0x06, 0xe8, 0x40, 0x23, 0xe8, 0x88, 0xdc, + 0x83, 0x24, 0x33, 0x55, 0x4e, 0x56, 0x37, 0x83, + 0x42, 0xb8, 0x80, 0x06, 0x60, 0x8a, 0x18, 0x1a, + 0x70, 0x9f, 0xb1, 0x00, 0x3e, 0x8c, 0x1e, 0x58, + 0x62, 0x02, 0xa3, 0x4f, 0xa8, 0xf9, 0x86, 0x2d, + 0xb9, 0xeb, 0x02, 0xe0, 0xcc, 0x81, 0x9a, 0x98, + 0xdd, 0x0b, 0x19, 0x1f, 0x88, 0x58, 0x85, 0x10, + 0x22, 0xae, 0xc6, 0x71, 0xe1, 0x08, 0x19, 0xd1, + 0xa3, 0xd1, 0x06, 0xb0, 0x7a, 0x3e, 0x98, 0x0a, + 0x04, 0x88, 0x75, 0x14, 0x98, 0xd1, 0x0e, 0x86, + 0x0b, 0x14, 0x7a, 0xc2, 0xe3, 0xbf, 0x62, 0xeb, + 0x41, 0xc4, 0xe2, 0x68, 0x68, 0x24, 0x51, 0xda, + 0xa0, 0xe1, 0x05, 0x03, 0x72, 0x78, 0x39, 0x32, + 0x01, 0xe9, 0x00, 0x81, 0x4c, 0x15, 0x3d, 0x36, + 0x9c, 0x93, 0x7d, 0xcf, 0xe9, 0xf9, 0x7f, 0x04, + 0xfb, 0xbf, 0xe8, 0x62, 0x70, 0x25, 0xc2, 0x0c, + 0xa1, 0x38, 0xca, 0xdd, 0xa5, 0xaf, 0x66, 0x8a, + 0xaa, 0x87, 0x75, 0x33, 0xfb, 0x89, 0xfc, 0x8e, + 0x32, 0x9d, 0x8a, 0x25, 0x28, 0x5d, 0x00, 0x03, + 0x04, 0xbe, 0x14, 0x58, 0x49, 0xa4, 0x2d, 0x73, + 0x05, 0xd0, 0xbc, 0xd4, 0x85, 0x1b, 0xc2, 0x14, + 0xd2, 0x35, 0x00, 0x5d, 0x48, 0x27, 0x01, 0x82, + 0xe6, 0x21, 0xbe, 0x33, 0x59, 0x96, 0x58, 0x05, + 0x66, 0x95, 0x68, 0x42, 0x64, 0xa3, 0x31, 0xe0, + 0x39, 0x80, 0x32, 0x20, 0x9d, 0x08, 0xfe, 0xce, + 0xdd, 0x97, 0xad, 0xad, 0xf4, 0xfe, 0xf0, 0x9a, + 0x0d, 0xd3, 0x8c, 0xb5, 0x76, 0x55, 0x80, 0x02, + 0x6d, 0x77, 0x9a, 0xa4, 0x16, 0xdb, 0x97, 0x6b, + 0x06, 0xc5, 0x43, 0xaa, 0x81, 0x61, 0xdf, 0x26, + 0xe2, 0xc1, 0xd0, 0xda, 0x56, 0x16, 0x72, 0x12, + 0x56, 0xc0, 0x01, 0xf6, 0x62, 0x8f, 0x60, 0xe4, + 0xb0, 0xef, 0x89, 0x2f, 0xe6, 0x61, 0xc7, 0xf0, + 0x14, 0x88, 0x02, 0xb8, 0x84, 0xf5, 0x7f, 0xf3, + 0x18, 0xe8, 0x11, 0x9c, 0x20, 0x12, 0x06, 0xeb, + 0x84, 0x4b, 0x14, 0x0d, 0x8a, 0x4f, 0x20, 0x0a, + 0x53, 0x13, 0xd0, 0xc2, 0x1a, 0x11, 0xf2, 0x99, + 0xbf, 0xab, 0x14, 0xa3, 0xf8, 0x9e, 0x9d, 0x61, + 0x0e, 0xb0, 0x2b, 0xe8, 0x44, 0x09, 0x43, 0x09, + 0xd2, 0x5f, 0xd7, 0x45, 0x10, 0x72, 0x93, 0x04, + 0x09, 0x3a, 0x00, 0x05, 0x6a, 0x8f, 0xf1, 0x10, + 0x39, 0xc2, 0xba, 0x18, 0x48, 0xc1, 0x41, 0x04, + 0x40, 0x94, 0x5a, 0x18, 0x30, 0xe0, 0x30, 0xf0, + 0x2a, 0x00, 0xe6, 0x4e, 0x0c, 0x60, 0x25, 0xcd, + 0x42, 0xd8, 0xd4, 0x26, 0xc9, 0x2a, 0x42, 0xbc, + 0xe3, 0xf9, 0x56, 0x72, 0x2d, 0x20, 0x6c, 0xd0, + 0x22, 0x6b, 0x3b, 0x7e, 0x7d, 0xe3, 0x77, 0x39, + 0x22, 0x60, 0xc7, 0x33, 0x83, 0x06, 0xf2, 0x80, + 0x1a, 0x44, 0x73, 0x82, 0x20, 0xfb, 0x14, 0x7d, + 0xa3, 0xcd, 0x08, 0xab, 0x0f, 0x90, 0x1f, 0x9c, + 0x01, 0xa4, 0x4c, 0x5e, 0xe9, 0x32, 0x55, 0xc3, + 0xd4, 0x10, 0x0b, 0x61, 0x22, 0x4a, 0x00, 0x02, + 0xca, 0x51, 0xf9, 0x80, 0x4e, 0xa3, 0x6c, 0xad, + 0x33, 0x05, 0x41, 0x16, 0xd1, 0x21, 0x01, 0x58, + 0x89, 0x0c, 0x86, 0x30, 0x8f, 0x02, 0x04, 0xd7, + 0x60, 0x51, 0xe7, 0xf6, 0x0c, 0x10, 0xa1, 0xe9, + 0x03, 0x08, 0xe2, 0x53, 0xd5, 0x69, 0x6f, 0x6f, + 0x58, 0x9b, 0x6e, 0x78, 0xa7, 0xe7, 0xfc, 0x12, + 0xc8, 0x5e, 0xdc, 0x04, 0x71, 0xd9, 0xc7, 0x67, + 0x1d, 0x9c, 0x76, 0x71, 0xd9, 0xc7, 0x67, 0x1d, + 0x9c, 0x76, 0x71, 0xd9, 0xc7, 0x67, 0x1d, 0x9c, + 0x76, 0x71, 0xd9, 0xc7, 0x67, 0x1d, 0x9c, 0x76, + 0x71, 0xd9, 0xc7, 0x67, 0x1d, 0x9c, 0x76, 0x71, + 0xd8, 0xc5, 0x30, 0x46, 0xb4, 0xaf, 0x5b, 0x2f, + 0xd4, 0x31, 0x0f, 0xed, 0x11, 0x11, 0x12, 0xf5, + 0x5a, 0x54, 0x8f, 0x65, 0xe8, 0x97, 0x3d, 0xab, + 0x02, 0xe8, 0x54, 0xbb, 0x6c, 0x58, 0x3a, 0x90, + 0x97, 0x6d, 0x8b, 0x07, 0x52, 0x13, 0xbc, 0x73, + 0x64, 0xd4, 0x12, 0x40, 0x31, 0x57, 0xba, 0x94, + 0x87, 0xa1, 0x02, 0xc2, 0x20, 0xe5, 0x41, 0x08, + 0x0a, 0x11, 0x58, 0xd5, 0xe4, 0x69, 0x4f, 0xed, + 0x11, 0x11, 0x12, 0x8d, 0xa8, 0xc5, 0x85, 0x3d, + 0x0f, 0x27, 0x20, 0x01, 0x38, 0xb4, 0xf5, 0x41, + 0x00, 0x7b, 0x1c, 0x01, 0x75, 0x61, 0x02, 0x49, + 0xc9, 0xc7, 0xfc, 0x42, 0x08, 0x20, 0x82, 0x08, + 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, + 0x03, 0xb1, 0x96, 0x42, 0x7d, 0x95, 0xf5, 0xc9, + 0xb6, 0xe7, 0x8a, 0x7e, 0x3f, 0xc1, 0xe8, 0x38, + 0x01, 0x0c, 0x0b, 0x04, 0x70, 0x07, 0x46, 0x04, + 0xb2, 0x97, 0x80, 0x62, 0xb1, 0x90, 0x20, 0x90, + 0xba, 0x47, 0xb0, 0x02, 0x82, 0x0a, 0x5a, 0x62, + 0x7d, 0x90, 0xfe, 0x8a, 0x40, 0xad, 0x56, 0x93, + 0x76, 0x50, 0x42, 0x8b, 0x48, 0x39, 0xe4, 0xb0, + 0x1b, 0xac, 0x00, 0x50, 0x39, 0x09, 0xc0, 0x7c, + 0x90, 0x25, 0x95, 0x22, 0xc5, 0xc4, 0x09, 0x82, + 0x3a, 0xd1, 0x81, 0xfb, 0xd7, 0x48, 0x11, 0x44, + 0xaa, 0x07, 0x25, 0x58, 0x1d, 0xaf, 0x29, 0xb2, + 0x4b, 0x72, 0x00, 0x48, 0xd3, 0x00, 0x6e, 0xee, + 0x2d, 0x1b, 0xfc, 0x58, 0x17, 0xde, 0x12, 0x92, + 0x37, 0x23, 0x59, 0x66, 0x1c, 0x30, 0x88, 0x83, + 0xc1, 0x19, 0x47, 0x8d, 0x94, 0x0a, 0xc6, 0x3a, + 0xbc, 0x0c, 0x64, 0x84, 0x26, 0x5e, 0xa0, 0x9c, + 0x1c, 0x98, 0x49, 0xa1, 0x8b, 0x90, 0x09, 0x84, + 0xc7, 0x5a, 0xca, 0x23, 0xbc, 0x02, 0x4a, 0xb3, + 0x4a, 0xf5, 0xa1, 0x84, 0x38, 0x90, 0x40, 0x92, + 0x41, 0x64, 0x25, 0x19, 0xa2, 0x00, 0x00, 0x03, + 0x10, 0x1f, 0x6e, 0x3a, 0x4a, 0x07, 0x80, 0xa1, + 0xa5, 0x13, 0x20, 0xeb, 0xa6, 0xb0, 0xa4, 0x52, + 0x89, 0x14, 0x22, 0xaa, 0x5a, 0x9f, 0xb8, 0xde, + 0xa1, 0x41, 0xee, 0x9b, 0x12, 0x22, 0x68, 0x5a, + 0x87, 0x0c, 0x4b, 0xd8, 0x02, 0x26, 0xff, 0x00, + 0x9b, 0xd6, 0xd6, 0xfa, 0x7f, 0x41, 0x10, 0x55, + 0x93, 0xb6, 0x28, 0x60, 0xea, 0x74, 0x06, 0x7b, + 0x2d, 0xe5, 0x80, 0x55, 0xa0, 0x59, 0x8e, 0xbe, + 0xf2, 0xa1, 0xc8, 0x99, 0xac, 0xc7, 0x00, 0xd9, + 0x62, 0xe8, 0x9d, 0x6c, 0x11, 0x0c, 0x64, 0xa1, + 0x55, 0x59, 0x90, 0x90, 0xb0, 0x25, 0x54, 0xb0, + 0x68, 0xd0, 0x08, 0x81, 0xe2, 0x47, 0x24, 0x8b, + 0x38, 0x8e, 0x8d, 0x10, 0x80, 0x89, 0x2c, 0x1d, + 0x45, 0xa8, 0x03, 0x2f, 0xbe, 0xaa, 0x2d, 0x58, + 0xaa, 0x42, 0xcd, 0x1a, 0x01, 0x16, 0xff, 0x00, + 0xa8, 0x6e, 0x09, 0xd0, 0xfa, 0x08, 0xb0, 0x89, + 0x10, 0xbd, 0xc4, 0x3f, 0x7f, 0xf8, 0x8d, 0xf7, + 0x7f, 0xe6, 0x6d, 0xd9, 0x7a, 0xe4, 0xdf, 0x73, + 0xfa, 0x7e, 0x3f, 0xc1, 0x18, 0xc9, 0xe3, 0x4a, + 0x9f, 0x02, 0x20, 0x9d, 0x62, 0xed, 0x84, 0x22, + 0x0e, 0x84, 0x12, 0x21, 0x4e, 0x1d, 0x2b, 0x58, + 0x02, 0x95, 0x22, 0x75, 0xca, 0x31, 0x7e, 0xc4, + 0x08, 0x12, 0x48, 0x14, 0xa0, 0x2d, 0x12, 0x55, + 0x8d, 0xd6, 0x92, 0x80, 0xda, 0x19, 0x46, 0x75, + 0x5b, 0x74, 0xcb, 0x76, 0x4e, 0xde, 0xf0, 0x4e, + 0x00, 0xa0, 0x09, 0x60, 0x0a, 0x95, 0x03, 0xfa, + 0x84, 0xc0, 0x25, 0x08, 0x48, 0x53, 0x0d, 0x87, + 0xad, 0x06, 0xac, 0xf4, 0xa6, 0x43, 0x2e, 0xc7, + 0xf1, 0x2b, 0x64, 0x91, 0xaf, 0xb4, 0x07, 0xb2, + 0x19, 0xad, 0x20, 0xc8, 0xf5, 0x15, 0xec, 0x0a, + 0xe8, 0x38, 0x13, 0x95, 0x4a, 0x55, 0x63, 0x7f, + 0x98, 0xea, 0xa1, 0x4c, 0x99, 0x00, 0x11, 0x46, + 0x00, 0xaa, 0x4b, 0x56, 0x14, 0x84, 0x3b, 0xa5, + 0x48, 0x65, 0x51, 0x0a, 0x2a, 0x5a, 0xab, 0x00, + 0x12, 0x86, 0x87, 0xda, 0x30, 0xc6, 0x18, 0xd9, + 0x8d, 0x0a, 0x02, 0x73, 0x73, 0x5f, 0x73, 0xba, + 0x8b, 0x4e, 0x75, 0x8d, 0x51, 0xbd, 0x0f, 0x96, + 0xb3, 0x4c, 0x59, 0x78, 0x30, 0x55, 0x40, 0x82, + 0x2d, 0x78, 0x62, 0x25, 0x10, 0x1d, 0x11, 0x70, + 0xf8, 0xc3, 0x70, 0x1a, 0x91, 0x88, 0x18, 0x05, + 0x05, 0x6f, 0x2a, 0x3d, 0x06, 0xac, 0x80, 0x15, + 0xc4, 0xa1, 0x79, 0x56, 0xa2, 0xce, 0xe1, 0x09, + 0xb5, 0x37, 0xf5, 0xbf, 0x5a, 0x6c, 0x8b, 0x4e, + 0x53, 0x39, 0x4c, 0xe5, 0x33, 0x94, 0xce, 0x53, + 0x3e, 0x84, 0xa1, 0x98, 0x00, 0x20, 0x88, 0x53, + 0x77, 0x32, 0xe9, 0xc8, 0x08, 0x27, 0x31, 0x6a, + 0xc7, 0x5c, 0xa5, 0x86, 0x75, 0x40, 0x43, 0x04, + 0xdb, 0xb3, 0x73, 0x15, 0xe8, 0x78, 0x1b, 0x54, + 0x21, 0x86, 0xe8, 0x5c, 0x62, 0x52, 0x2c, 0xc2, + 0x2b, 0x27, 0x52, 0x4a, 0x2e, 0xf1, 0xe1, 0x26, + 0x8c, 0x69, 0x5c, 0x3d, 0xfa, 0xcc, 0x57, 0xa1, + 0xe0, 0x6d, 0x50, 0x86, 0x1b, 0xa1, 0x70, 0xe1, + 0xd6, 0x88, 0x88, 0x3f, 0xc8, 0xd6, 0x90, 0xc2, + 0xe1, 0x52, 0x5f, 0x33, 0x94, 0xce, 0x53, 0x39, + 0x4c, 0xe5, 0x33, 0x94, 0xce, 0x53, 0x00, 0x86, + 0x42, 0x22, 0x9f, 0xa0, 0xe8, 0xcf, 0x01, 0x74, + 0x9e, 0x83, 0x36, 0x05, 0x66, 0x06, 0xb1, 0xa5, + 0xa8, 0x37, 0x5d, 0x2a, 0x92, 0x74, 0x86, 0x89, + 0x3c, 0xe0, 0x4a, 0x80, 0x20, 0x9d, 0x85, 0xdf, + 0xb4, 0x25, 0x80, 0x43, 0xc2, 0xa4, 0x98, 0x2a, + 0x27, 0xce, 0x50, 0x94, 0xf4, 0xea, 0x00, 0xd6, + 0x34, 0x70, 0x50, 0x85, 0x03, 0x42, 0x58, 0x90, + 0x06, 0x0c, 0xc5, 0x68, 0x19, 0x06, 0xa1, 0x58, + 0x2c, 0x4f, 0xd5, 0x86, 0x88, 0x49, 0x8b, 0x30, + 0x1e, 0xa8, 0x22, 0x28, 0xaf, 0x11, 0xd6, 0xf1, + 0x7a, 0xc2, 0x18, 0x0c, 0x03, 0x9a, 0xd7, 0xba, + 0x87, 0x06, 0xe0, 0x85, 0x62, 0x36, 0x0c, 0x06, + 0x90, 0x8c, 0x4e, 0x11, 0x4d, 0x55, 0x83, 0x0a, + 0x60, 0x4d, 0xd0, 0x5b, 0xf6, 0x85, 0x60, 0x83, + 0xa1, 0x23, 0x8a, 0x16, 0xcf, 0x3a, 0x22, 0x34, + 0x6a, 0x49, 0x79, 0xca, 0x60, 0x14, 0x40, 0xb8, + 0x58, 0x77, 0xec, 0x03, 0x83, 0xec, 0xfb, 0xc0, + 0xa7, 0x0b, 0x5e, 0x40, 0x6a, 0x91, 0x56, 0x34, + 0x32, 0x93, 0xe3, 0xec, 0x62, 0x02, 0x80, 0x08, + 0xa3, 0x40, 0x84, 0x04, 0x43, 0xdf, 0xb3, 0xb1, + 0x2e, 0xb1, 0x82, 0x26, 0xd4, 0x03, 0x96, 0x90, + 0x06, 0xba, 0xbb, 0x5e, 0x54, 0x85, 0x80, 0x3b, + 0x86, 0x85, 0x8f, 0x68, 0xbf, 0x43, 0x8c, 0xa6, + 0x61, 0x4a, 0x01, 0x8c, 0x4c, 0x1f, 0x80, 0xb7, + 0x02, 0x34, 0x78, 0x8c, 0xae, 0xca, 0x3a, 0x83, + 0x72, 0xf7, 0xc3, 0xd4, 0x26, 0xeb, 0x9f, 0xd3, + 0xf2, 0x7e, 0x08, 0x22, 0x58, 0x6c, 0x44, 0x2e, + 0x31, 0x5c, 0x99, 0x7f, 0x92, 0x18, 0x61, 0x86, + 0x18, 0x61, 0x86, 0x18, 0x61, 0x86, 0x18, 0x61, + 0x86, 0x18, 0x61, 0xc8, 0x00, 0x9e, 0x08, 0x78, + 0x61, 0xee, 0x5e, 0xa2, 0x93, 0x0b, 0xc8, 0xb2, + 0x3f, 0xe0, 0x84, 0x21, 0x08, 0x42, 0x08, 0xc4, + 0xd1, 0x05, 0xc1, 0xc9, 0xc1, 0x4c, 0x36, 0x94, + 0x74, 0x9c, 0x7d, 0x10, 0xc5, 0x4b, 0x18, 0xf2, + 0x0d, 0x62, 0xf8, 0xdf, 0xf8, 0x43, 0x05, 0x18, + 0x06, 0xf1, 0x3d, 0x87, 0xff, 0x00, 0x14, 0x21, + 0x08, 0x42, 0x10, 0x8b, 0xe1, 0xd3, 0xa9, 0x1e, + 0x82, 0xb5, 0x18, 0x21, 0x83, 0x02, 0x90, 0x5c, + 0x41, 0x88, 0xb3, 0x0a, 0x59, 0x34, 0xc0, 0x1a, + 0xc1, 0xca, 0x95, 0x18, 0xe1, 0x2c, 0xb4, 0xaa, + 0xc4, 0xe0, 0xeb, 0x78, 0x05, 0xf2, 0x6c, 0x0d, + 0x41, 0xa0, 0x56, 0xdd, 0xaa, 0xc0, 0xab, 0x3d, + 0x54, 0xdb, 0x06, 0x84, 0xa8, 0x59, 0x5b, 0x17, + 0xc8, 0x98, 0x4a, 0x12, 0x0a, 0xd3, 0x50, 0x24, + 0x11, 0x40, 0x6a, 0xa8, 0x21, 0xfa, 0x82, 0xf8, + 0x02, 0x07, 0xf1, 0x11, 0x32, 0x9e, 0x82, 0x00, + 0x63, 0x90, 0x86, 0x41, 0xa9, 0xd3, 0x15, 0x3e, + 0x44, 0x5d, 0xe0, 0xa0, 0x40, 0x2b, 0x73, 0xad, + 0x49, 0x4e, 0x22, 0x2e, 0xd6, 0xc0, 0xc1, 0x2c, + 0xc0, 0x04, 0x1a, 0xa8, 0x2b, 0x6a, 0x0b, 0xe5, + 0x08, 0x28, 0xc2, 0x68, 0x19, 0x64, 0xd1, 0x5f, + 0xb6, 0x02, 0x2e, 0x55, 0x19, 0x30, 0x6a, 0x16, + 0xae, 0x38, 0x89, 0xa4, 0x11, 0x28, 0x41, 0xe0, + 0x12, 0x8a, 0x20, 0x2f, 0xc4, 0xe6, 0x4c, 0x8b, + 0x46, 0x95, 0x80, 0xff, 0x00, 0x01, 0x87, 0x0f, + 0xa4, 0x07, 0xa4, 0x64, 0x3b, 0x36, 0x5f, 0x01, + 0x42, 0xcc, 0x86, 0xc2, 0x00, 0x45, 0xbb, 0xdd, + 0x92, 0x61, 0x2b, 0x0a, 0x43, 0x2b, 0x1b, 0x14, + 0x61, 0x12, 0x4c, 0x46, 0x16, 0x30, 0x53, 0xac, + 0x08, 0x20, 0xb8, 0xb1, 0x3d, 0x02, 0x42, 0x08, + 0x0a, 0x5b, 0x0f, 0x50, 0x9b, 0x2e, 0x7f, 0x4f, + 0xc9, 0xf8, 0x22, 0xaa, 0x11, 0x84, 0xb0, 0x79, + 0x99, 0xc0, 0x67, 0x01, 0x9c, 0x06, 0x70, 0x19, + 0xc0, 0x67, 0x01, 0x9c, 0x06, 0x70, 0x19, 0xc0, + 0x67, 0x01, 0x9c, 0x06, 0x70, 0x19, 0xc0, 0x67, + 0x01, 0x9c, 0x06, 0x70, 0x19, 0xc0, 0x67, 0x01, + 0x9c, 0x06, 0x70, 0x19, 0xc0, 0x60, 0x75, 0x10, + 0xd0, 0x99, 0xc8, 0x88, 0x70, 0xa4, 0x44, 0x47, + 0xa5, 0xad, 0xf4, 0xff, 0x00, 0x85, 0x0b, 0x2f, + 0x58, 0x42, 0x18, 0x10, 0xe6, 0x8a, 0x60, 0xd1, + 0x95, 0x44, 0x52, 0x57, 0xb6, 0xc0, 0x37, 0x45, + 0x1e, 0x23, 0xac, 0x20, 0x5a, 0x66, 0xf0, 0x26, + 0xb5, 0x82, 0x16, 0x23, 0x86, 0x42, 0x01, 0x81, + 0x9b, 0x7d, 0x88, 0x42, 0x39, 0x01, 0x8b, 0x9b, + 0x36, 0xbf, 0xfc, 0xc6, 0xfb, 0x3f, 0x56, 0x7f, + 0x96, 0x92, 0x52, 0x7d, 0xca, 0x8a, 0xc0, 0xb2, + 0xf1, 0x04, 0xd5, 0x5d, 0x20, 0xd5, 0xd0, 0x6c, + 0x20, 0x28, 0x95, 0x42, 0x0e, 0x9e, 0xc6, 0x08, + 0xbd, 0x80, 0xa8, 0x0c, 0xc6, 0x85, 0x8f, 0x98, + 0x66, 0x80, 0x32, 0x45, 0x44, 0xa0, 0x1f, 0x73, + 0xf1, 0x08, 0x94, 0x08, 0x8a, 0x12, 0x9a, 0x29, + 0xc0, 0xb4, 0x21, 0x70, 0x81, 0x0e, 0xcb, 0x0c, + 0x60, 0x37, 0xf3, 0x28, 0x4f, 0x58, 0xc2, 0x55, + 0x95, 0x65, 0x88, 0x75, 0x10, 0x46, 0xfb, 0xc9, + 0x99, 0x2a, 0x31, 0x94, 0xc4, 0xc3, 0x2f, 0xc2, + 0x37, 0x31, 0x43, 0x2e, 0x4a, 0x62, 0x03, 0xa7, + 0x38, 0x50, 0x0d, 0x00, 0x49, 0x03, 0x58, 0x33, + 0xf5, 0x59, 0x7c, 0x07, 0x34, 0xe0, 0x27, 0x6a, + 0x40, 0x18, 0x46, 0xe8, 0xf2, 0x42, 0x46, 0xfb, + 0x14, 0x00, 0xce, 0xd6, 0xd6, 0x58, 0xe1, 0x06, + 0x6d, 0x7c, 0x7d, 0x8f, 0xc1, 0xf5, 0xdb, 0xb2, + 0xf5, 0x49, 0xb2, 0xe7, 0x8a, 0x7e, 0x0f, 0xc1, + 0x2a, 0x05, 0x87, 0xd3, 0xf8, 0xa8, 0x65, 0xf5, + 0x49, 0x40, 0xe7, 0xac, 0xd1, 0x92, 0xb8, 0xe9, + 0xa1, 0x88, 0x8a, 0x44, 0xab, 0xdb, 0x19, 0x58, + 0x5c, 0x7b, 0xf3, 0x4c, 0x65, 0xcb, 0xe5, 0xf0, + 0x61, 0x0f, 0x98, 0x9a, 0x81, 0x22, 0xef, 0x49, + 0x52, 0xcd, 0x38, 0x07, 0xf0, 0x82, 0x68, 0xd0, + 0x30, 0xa8, 0x33, 0x50, 0xc6, 0x9c, 0x42, 0xda, + 0x0d, 0x0e, 0xa5, 0x28, 0x05, 0x16, 0xa1, 0x2b, + 0xc1, 0x0a, 0x45, 0x61, 0x92, 0x48, 0x7c, 0x43, + 0x2a, 0x82, 0x12, 0x18, 0x9a, 0x14, 0xeb, 0x10, + 0x1b, 0xe8, 0xa3, 0x33, 0x3c, 0x01, 0xf9, 0x88, + 0x18, 0x9e, 0x99, 0xc3, 0x63, 0xc9, 0xf0, 0x32, + 0x09, 0xcf, 0xf8, 0xa8, 0xe5, 0x04, 0x20, 0x57, + 0xcc, 0x00, 0x8e, 0x7f, 0x44, 0x13, 0x5a, 0xa5, + 0xa6, 0xe2, 0xed, 0x37, 0x17, 0x69, 0xb8, 0xbb, + 0x4d, 0xc5, 0xda, 0x6e, 0x2e, 0xd3, 0x71, 0x76, + 0x9b, 0x8b, 0xb4, 0x00, 0x58, 0x1a, 0xad, 0x8d, + 0x65, 0x3a, 0x64, 0xa2, 0x52, 0x90, 0xfb, 0xd8, + 0x99, 0xd4, 0xd9, 0x56, 0x3a, 0xe5, 0x38, 0x0b, + 0xce, 0xd0, 0x68, 0x05, 0x0b, 0xc6, 0xec, 0xb0, + 0x86, 0x8b, 0x2c, 0xab, 0x7a, 0xb1, 0x86, 0x74, + 0x84, 0x0b, 0x60, 0xb3, 0x6f, 0xe0, 0x52, 0x6e, + 0x2e, 0xd3, 0x71, 0x76, 0x9b, 0x8b, 0xb4, 0xdc, + 0x5d, 0xa6, 0xe2, 0xed, 0x37, 0x17, 0x69, 0xb8, + 0xbb, 0x4d, 0xc5, 0xda, 0x10, 0x50, 0x82, 0x04, + 0x41, 0xf4, 0x02, 0xeb, 0xbd, 0x45, 0xa6, 0x81, + 0xa1, 0x00, 0x2e, 0xb0, 0x4c, 0x92, 0x52, 0x14, + 0x1d, 0x43, 0x2a, 0x3e, 0xb7, 0x9b, 0x0c, 0x02, + 0x13, 0xa1, 0x17, 0x68, 0x60, 0x81, 0xee, 0xa9, + 0x83, 0x58, 0x8e, 0x87, 0xf2, 0x07, 0x59, 0x77, + 0xc5, 0x04, 0x3d, 0x3e, 0x04, 0x06, 0x07, 0x83, + 0x76, 0x3d, 0x82, 0x55, 0x71, 0x50, 0xae, 0xf8, + 0x4c, 0xeb, 0x11, 0x18, 0x80, 0xca, 0x63, 0x84, + 0x12, 0xaa, 0x40, 0x46, 0xa0, 0x26, 0xe1, 0x70, + 0x63, 0x01, 0x09, 0x52, 0xe6, 0x01, 0xfd, 0x10, + 0x20, 0x11, 0x58, 0xf5, 0x4d, 0x57, 0x71, 0xd6, + 0xd1, 0xe8, 0xf6, 0x24, 0xd4, 0x11, 0x2a, 0xd5, + 0x9f, 0x58, 0x6a, 0xa2, 0x52, 0x16, 0x41, 0x28, + 0xb5, 0xa0, 0x89, 0xfe, 0x44, 0xef, 0x28, 0x03, + 0xde, 0xce, 0xba, 0xcb, 0xe2, 0xf8, 0x1b, 0x9e, + 0xec, 0x14, 0xd4, 0x50, 0x4f, 0x5a, 0xca, 0x55, + 0x15, 0x00, 0x0a, 0xc0, 0x28, 0x62, 0x04, 0x08, + 0x3e, 0x90, 0x35, 0xd0, 0xc1, 0xd7, 0x88, 0x65, + 0x91, 0xec, 0xaf, 0x5d, 0xbb, 0x2f, 0x56, 0x9b, + 0xee, 0x7f, 0x4f, 0xc5, 0xf8, 0x20, 0x94, 0xeb, + 0xf9, 0x27, 0x56, 0x75, 0x67, 0x56, 0x01, 0x22, + 0x04, 0xd2, 0x05, 0x5c, 0x2a, 0x98, 0xa0, 0x6a, + 0x46, 0x5a, 0x6b, 0x08, 0x92, 0x96, 0x46, 0x11, + 0x48, 0x1a, 0x05, 0x4f, 0x79, 0x50, 0x6b, 0xed, + 0x20, 0xa0, 0x1b, 0x75, 0x80, 0x20, 0xc4, 0x39, + 0x91, 0x20, 0x71, 0xc3, 0x5b, 0x0d, 0xbd, 0xdc, + 0x05, 0xc2, 0x1d, 0xd8, 0xbc, 0x58, 0x39, 0x2c, + 0xa3, 0x48, 0x79, 0x5b, 0xe6, 0x00, 0xa2, 0xe9, + 0x24, 0x8b, 0x12, 0x33, 0xbc, 0x38, 0x35, 0x0a, + 0x16, 0x1d, 0x8d, 0x72, 0x86, 0xd8, 0xa2, 0x20, + 0x53, 0xae, 0x56, 0xaf, 0xec, 0x10, 0xc5, 0x90, + 0x21, 0xe8, 0x34, 0x28, 0x08, 0x52, 0xc6, 0x40, + 0xc8, 0x25, 0x2b, 0x2f, 0x50, 0x9e, 0x15, 0x93, + 0x0a, 0x6b, 0x0d, 0x15, 0x12, 0x1a, 0xa0, 0x50, + 0x81, 0x86, 0x73, 0xab, 0x3a, 0xb3, 0xab, 0x02, + 0xb9, 0x6f, 0xef, 0xaf, 0xd5, 0xaf, 0x85, 0x46, + 0xa7, 0x29, 0x39, 0x49, 0xca, 0x4e, 0x52, 0x72, + 0x93, 0x94, 0x9c, 0xa4, 0x5f, 0x52, 0x07, 0x28, + 0xe0, 0x6a, 0x2e, 0x85, 0x61, 0xf8, 0x10, 0x28, + 0x87, 0x16, 0x24, 0x82, 0x15, 0x05, 0x72, 0x38, + 0x08, 0xc4, 0x0c, 0x2d, 0x06, 0x63, 0x00, 0x83, + 0x0f, 0xa7, 0x88, 0x41, 0x62, 0x8d, 0x2e, 0x89, + 0x7b, 0x88, 0x72, 0x3d, 0xc2, 0x34, 0x58, 0x05, + 0x68, 0x7d, 0xe7, 0x29, 0x39, 0x49, 0xca, 0x4e, + 0x52, 0x72, 0x93, 0x94, 0x9c, 0xa4, 0xe5, 0x21, + 0x8b, 0x60, 0x24, 0xf4, 0xf4, 0x3e, 0x2b, 0x6b, + 0x2e, 0xab, 0xd3, 0xfe, 0x48, 0x20, 0x82, 0x08, + 0x20, 0x82, 0x08, 0x2c, 0x22, 0xcb, 0x34, 0x46, + 0x44, 0x23, 0x0c, 0x58, 0x46, 0xc6, 0x3e, 0xa8, + 0x20, 0x60, 0xa0, 0x80, 0x08, 0x3d, 0x46, 0x30, + 0x2a, 0x0e, 0x22, 0x01, 0x24, 0xcd, 0x5e, 0x43, + 0xfb, 0x41, 0x04, 0x10, 0x41, 0x07, 0x20, 0xe1, + 0x22, 0x7f, 0x5e, 0xb5, 0x37, 0xdc, 0xfe, 0x9f, + 0x9b, 0xf0, 0x43, 0x85, 0x1f, 0x08, 0x08, 0x89, + 0xd3, 0x3a, 0x67, 0x4c, 0xad, 0x48, 0x21, 0xd5, + 0xf7, 0x1a, 0x42, 0x3c, 0x50, 0x7b, 0x6c, 0xa1, + 0xd3, 0x86, 0xe0, 0x97, 0x45, 0xf7, 0x09, 0x69, + 0x67, 0xe4, 0x09, 0x43, 0xeb, 0x00, 0x02, 0x1d, + 0xec, 0xc4, 0xa5, 0x42, 0x6f, 0x1a, 0xd8, 0x48, + 0x85, 0x95, 0xc5, 0x66, 0x08, 0xb6, 0x00, 0x10, + 0x7d, 0x8c, 0x2a, 0x62, 0xc7, 0x58, 0x4a, 0xaa, + 0x29, 0x8b, 0x9c, 0x6d, 0x4f, 0x69, 0x5e, 0x6c, + 0xe7, 0x33, 0xac, 0xa2, 0x9e, 0x0a, 0xbe, 0xc8, + 0x9f, 0x8c, 0x00, 0x10, 0x8e, 0x90, 0xfa, 0xb9, + 0x1a, 0x00, 0x00, 0xb1, 0x4a, 0xbe, 0xf0, 0x02, + 0xf2, 0xd4, 0x52, 0x6f, 0x85, 0x3d, 0xa7, 0x4c, + 0xe9, 0x9d, 0x32, 0xfe, 0xe0, 0x24, 0xe4, 0x31, + 0x32, 0xe8, 0xc5, 0x7a, 0x5a, 0xdf, 0x4f, 0xf8, + 0x5b, 0x8a, 0x84, 0x2c, 0xd6, 0xbe, 0xc1, 0x3e, + 0xc2, 0x14, 0x8b, 0x09, 0x8f, 0x8a, 0xc2, 0xc0, + 0xd8, 0xc9, 0xbc, 0x60, 0x02, 0xb1, 0xd7, 0x52, + 0x3d, 0x81, 0xf8, 0x82, 0x52, 0x8a, 0x25, 0x27, + 0xa1, 0x90, 0x18, 0xc1, 0xdb, 0x6d, 0x62, 0x11, + 0x01, 0x53, 0xf8, 0x40, 0x0b, 0xfb, 0xb8, 0x13, + 0x0f, 0x73, 0xef, 0xff, 0x00, 0x51, 0xba, 0x01, + 0x95, 0x07, 0x16, 0x3b, 0xe8, 0x05, 0x89, 0xdd, + 0x2c, 0x2c, 0x21, 0x11, 0x90, 0x02, 0xca, 0x8f, + 0x28, 0x36, 0x81, 0x32, 0xb9, 0xd8, 0x03, 0xa1, + 0x50, 0xd0, 0x5a, 0xd1, 0x24, 0x62, 0x1b, 0xc9, + 0x83, 0xf1, 0x29, 0xd2, 0x30, 0x11, 0x1f, 0x78, + 0x2c, 0xcd, 0xe0, 0xa4, 0x81, 0x6c, 0x0e, 0xd4, + 0x41, 0x04, 0x18, 0x9a, 0x62, 0xd9, 0x18, 0x86, + 0x48, 0x2c, 0xd0, 0x04, 0x54, 0x8f, 0x40, 0x0c, + 0x3f, 0xd0, 0x0d, 0xf3, 0xc4, 0x19, 0x4f, 0xbd, + 0x21, 0xbb, 0x90, 0x45, 0x12, 0x15, 0x25, 0x65, + 0x06, 0x98, 0x24, 0x24, 0x05, 0x76, 0x79, 0x44, + 0xc1, 0xd5, 0x68, 0xa8, 0x31, 0x5d, 0x41, 0x10, + 0x98, 0x0d, 0x10, 0x9c, 0xf5, 0x89, 0x02, 0x29, + 0x45, 0x00, 0x28, 0x94, 0xb3, 0x04, 0x43, 0x48, + 0x67, 0x8b, 0x2e, 0x17, 0x95, 0xec, 0x61, 0xb2, + 0x50, 0x54, 0x48, 0x54, 0x95, 0x94, 0x44, 0x36, + 0x64, 0x4c, 0x89, 0xc3, 0xfa, 0x63, 0xa6, 0xdb, + 0x9f, 0xd3, 0xf2, 0x7e, 0x08, 0x0a, 0xd1, 0xd0, + 0xc2, 0x37, 0xe9, 0x00, 0x05, 0xef, 0xe0, 0xc7, + 0x1c, 0x46, 0x49, 0x96, 0x3a, 0x4f, 0xa6, 0x23, + 0xea, 0x52, 0x21, 0x18, 0x3e, 0xd2, 0x82, 0xf5, + 0xb8, 0xab, 0xa1, 0xfe, 0x71, 0xc7, 0x1c, 0x5b, + 0x10, 0xe6, 0x16, 0x4f, 0xfe, 0x38, 0xe3, 0x8e, + 0x38, 0xe3, 0x8e, 0x26, 0x0e, 0x1c, 0x09, 0x62, + 0x8c, 0x9f, 0x5a, 0x5d, 0xb0, 0x02, 0xa0, 0x6a, + 0x66, 0xc3, 0xef, 0x36, 0x1f, 0x79, 0xb0, 0xfb, + 0xcd, 0x87, 0xde, 0x6c, 0x3e, 0xf3, 0x61, 0xf7, + 0x9b, 0x0f, 0xbc, 0xa8, 0xa3, 0x74, 0x87, 0xd0, + 0x41, 0x9b, 0x73, 0x24, 0x09, 0x3f, 0x30, 0xb1, + 0x39, 0x80, 0x04, 0x7d, 0xc1, 0x00, 0x88, 0x41, + 0x88, 0x0c, 0x9c, 0x65, 0x91, 0x80, 0xc6, 0x46, + 0xb0, 0x06, 0x0b, 0xd2, 0x15, 0x2e, 0xce, 0x69, + 0xb0, 0xfb, 0xcd, 0x87, 0xde, 0x6c, 0x3e, 0xf3, + 0x61, 0xf7, 0x9b, 0x0f, 0xbc, 0xd8, 0x7d, 0xe6, + 0xc3, 0xef, 0x36, 0x1f, 0x78, 0x30, 0x52, 0x08, + 0xd5, 0x7a, 0x52, 0x3a, 0xc8, 0x03, 0x9d, 0x6f, + 0xf7, 0xd0, 0x40, 0x41, 0x28, 0x4d, 0xf2, 0x86, + 0x4d, 0x4c, 0xd5, 0xc5, 0xe5, 0x45, 0x4e, 0xe2, + 0xd8, 0xc3, 0xee, 0x8c, 0x8c, 0x7b, 0x8b, 0xdc, + 0xe8, 0x23, 0x8b, 0xe3, 0x49, 0x14, 0x80, 0x12, + 0x74, 0xb2, 0x87, 0xba, 0x1c, 0xad, 0x00, 0x8d, + 0xfb, 0x80, 0x23, 0xd3, 0xa0, 0xc4, 0x10, 0x57, + 0x26, 0xd5, 0x08, 0x26, 0xae, 0x62, 0x8a, 0xaf, + 0x47, 0xf2, 0x09, 0x1f, 0x22, 0x57, 0xd8, 0xd4, + 0x82, 0x09, 0xd0, 0x2b, 0xaa, 0xb0, 0x16, 0x09, + 0x95, 0x0c, 0x41, 0x3e, 0xe4, 0x45, 0x7f, 0x71, + 0x82, 0xa7, 0x71, 0xa2, 0xee, 0xd0, 0x96, 0xca, + 0x25, 0x48, 0xaf, 0xd0, 0x4a, 0xae, 0x2a, 0x1d, + 0x0a, 0xd8, 0x9d, 0xf0, 0x7c, 0x4a, 0xfe, 0x61, + 0x48, 0xdc, 0xf7, 0x8b, 0x97, 0xbc, 0x5d, 0x24, + 0xcc, 0x8b, 0x00, 0x3b, 0x03, 0x61, 0x45, 0x1c, + 0xd2, 0xa1, 0x16, 0x55, 0x80, 0x50, 0x49, 0xb4, + 0x25, 0x64, 0x03, 0x2c, 0x1a, 0x6d, 0x0d, 0xe5, + 0xfc, 0xa0, 0x4a, 0x91, 0x5f, 0xa0, 0x95, 0x5c, + 0x54, 0x14, 0x0a, 0x1a, 0x05, 0x52, 0x33, 0x24, + 0x91, 0x9d, 0x45, 0x3d, 0x4a, 0x10, 0x86, 0x8e, + 0x64, 0x02, 0xff, 0x00, 0x7d, 0x7a, 0x6c, 0x39, + 0xe2, 0x9f, 0x83, 0xf0, 0x7f, 0x56, 0x16, 0x44, + 0x20, 0x14, 0x00, 0x54, 0x4e, 0x0c, 0xa1, 0x02, + 0x99, 0x98, 0x25, 0xd4, 0x3c, 0x90, 0x35, 0x19, + 0x81, 0x9c, 0x1f, 0x84, 0x56, 0x03, 0xae, 0x1d, + 0x28, 0x5a, 0xc6, 0x29, 0x40, 0x2e, 0x31, 0x51, + 0x68, 0xb7, 0x94, 0x00, 0x64, 0x55, 0x55, 0x42, + 0x1a, 0x4a, 0x82, 0x80, 0x21, 0xee, 0x85, 0xa4, + 0x33, 0xc6, 0x14, 0xb5, 0x2a, 0x9f, 0x17, 0x40, + 0x4e, 0x40, 0xf1, 0xc6, 0x58, 0x8d, 0xba, 0x04, + 0x2b, 0x14, 0x48, 0x60, 0xfa, 0xe8, 0xae, 0xe6, + 0x8c, 0x98, 0x2d, 0x8c, 0x38, 0x1a, 0xa1, 0x7c, + 0x6b, 0x8b, 0x2a, 0x69, 0x04, 0x41, 0x82, 0x0b, + 0x22, 0x86, 0x49, 0xae, 0x2c, 0x11, 0x67, 0xd8, + 0x0d, 0xaf, 0xd5, 0xec, 0x35, 0x83, 0x37, 0x7f, + 0x00, 0xaa, 0x01, 0x3d, 0x5c, 0x31, 0xa7, 0xf3, + 0x7b, 0x7d, 0x3d, 0x6f, 0xd6, 0x9b, 0x02, 0xd0, + 0x8a, 0xbf, 0xa2, 0x62, 0xaa, 0xf5, 0x95, 0x9f, + 0x00, 0xdb, 0x4f, 0x07, 0x6a, 0xdf, 0x43, 0x0d, + 0x3a, 0xb0, 0x0e, 0x11, 0x21, 0xab, 0x92, 0xd0, + 0xa8, 0x2c, 0xba, 0x01, 0xa3, 0x8a, 0xa5, 0x01, + 0x21, 0x42, 0xa0, 0xb2, 0xe8, 0x06, 0x8e, 0x2a, + 0x94, 0x04, 0x85, 0x16, 0xb4, 0x55, 0x9d, 0x11, + 0xdb, 0x04, 0x51, 0x14, 0x44, 0xa8, 0xc9, 0x94, + 0xba, 0xe2, 0x33, 0x84, 0xcf, 0x7e, 0x70, 0x44, + 0x53, 0xe2, 0x00, 0x22, 0xc1, 0x54, 0x90, 0xa9, + 0x2b, 0x28, 0x32, 0xd0, 0xcc, 0x10, 0x19, 0x15, + 0xca, 0xa0, 0x8f, 0x63, 0x28, 0xaf, 0x72, 0x0f, + 0xac, 0x62, 0xe7, 0x20, 0x3a, 0x10, 0xf1, 0xcb, + 0x18, 0x3e, 0xac, 0x8e, 0x1d, 0x03, 0xc1, 0x62, + 0xc2, 0x2e, 0x40, 0x09, 0xe0, 0x59, 0x3a, 0x31, + 0x11, 0x57, 0xa5, 0xa4, 0x33, 0x60, 0x6a, 0x92, + 0x8f, 0xc1, 0x95, 0xd7, 0xe0, 0x33, 0x90, 0x65, + 0x22, 0xef, 0x11, 0x24, 0x82, 0xf0, 0x95, 0x2c, + 0x9e, 0x8b, 0x38, 0x14, 0xec, 0xad, 0x4a, 0x60, + 0xc3, 0x5d, 0xd0, 0xd6, 0x02, 0x65, 0x22, 0x82, + 0x82, 0x02, 0xae, 0xad, 0x1f, 0x88, 0x7e, 0x91, + 0x00, 0xe8, 0x35, 0x3a, 0x19, 0xcc, 0xcb, 0x01, + 0x84, 0x8d, 0x5e, 0x11, 0x28, 0x96, 0x4d, 0x7f, + 0x46, 0xa7, 0x0d, 0xc1, 0x1b, 0x82, 0x32, 0x30, + 0xe0, 0x60, 0x97, 0x2f, 0x92, 0x3f, 0xe0, 0x99, + 0x32, 0x64, 0xc9, 0x93, 0x26, 0x08, 0xac, 0x39, + 0xb3, 0x80, 0xdf, 0x6b, 0x16, 0x21, 0x01, 0x22, + 0x49, 0xb9, 0xfe, 0x32, 0x64, 0xc9, 0x81, 0x01, + 0x16, 0x25, 0x0c, 0x3e, 0x23, 0xfb, 0x4c, 0x99, + 0x32, 0x64, 0xc9, 0x8e, 0xcc, 0xaa, 0x00, 0x74, + 0x22, 0xe1, 0x12, 0xcd, 0x52, 0x6e, 0x1e, 0xe5, + 0xeb, 0x43, 0x71, 0xcf, 0xe9, 0xf8, 0x3f, 0x04, + 0x3b, 0x10, 0x4c, 0x75, 0x38, 0x49, 0xc2, 0x4e, + 0x12, 0x70, 0x90, 0x86, 0xe4, 0x60, 0x1e, 0x51, + 0xe8, 0xc4, 0x83, 0xa0, 0x09, 0x92, 0xae, 0x24, + 0x5e, 0x88, 0xca, 0x72, 0x85, 0x2a, 0x85, 0x9c, + 0x69, 0x9c, 0x7c, 0x29, 0x4d, 0x55, 0x61, 0x8f, + 0xb4, 0x17, 0x2b, 0x33, 0x25, 0x4d, 0xf5, 0x17, + 0xb4, 0xae, 0x2c, 0x80, 0x45, 0x12, 0x15, 0x64, + 0x6a, 0xa5, 0xb3, 0x88, 0x50, 0xc4, 0x55, 0x1a, + 0xa0, 0xc1, 0x33, 0x8e, 0x35, 0x83, 0xee, 0xc5, + 0x55, 0x08, 0x10, 0xac, 0xa9, 0x81, 0xb7, 0x67, + 0x75, 0x34, 0x35, 0xb5, 0x21, 0x61, 0x60, 0x06, + 0xa1, 0x02, 0x3a, 0x35, 0x29, 0x92, 0x72, 0xdc, + 0x26, 0x6a, 0x20, 0x2d, 0xe1, 0x28, 0x35, 0xb0, + 0xec, 0xd2, 0xa3, 0xc1, 0x3e, 0x21, 0x38, 0x82, + 0x84, 0x85, 0x82, 0x01, 0x2c, 0xb3, 0x34, 0x08, + 0x56, 0x70, 0x93, 0x84, 0x9c, 0x24, 0xe1, 0x20, + 0xf0, 0xc0, 0x2e, 0x96, 0xf5, 0xb5, 0xbe, 0x91, + 0x79, 0x2f, 0x08, 0x61, 0x3f, 0x98, 0x39, 0x68, + 0x49, 0xa8, 0x04, 0xe9, 0x0a, 0x99, 0xa8, 0x6a, + 0xa2, 0x91, 0x20, 0x28, 0x1d, 0x21, 0x1e, 0x29, + 0x9d, 0xa7, 0xba, 0x30, 0x5d, 0x34, 0x84, 0x78, + 0xa6, 0x76, 0x9e, 0xe8, 0xc1, 0x74, 0xd2, 0x59, + 0xb3, 0x1f, 0x69, 0x02, 0xa1, 0x60, 0x00, 0xc3, + 0x8a, 0x52, 0xc2, 0xa3, 0xe6, 0x0a, 0xad, 0xbe, + 0x68, 0x81, 0x07, 0x45, 0x0d, 0xd1, 0x6e, 0xd9, + 0xa8, 0x40, 0x05, 0x0d, 0x2b, 0xa4, 0x38, 0x8c, + 0x6c, 0x0f, 0x36, 0xfe, 0x40, 0xcc, 0x0e, 0x89, + 0xb5, 0x89, 0xb8, 0x83, 0x9d, 0x69, 0x06, 0x28, + 0xb4, 0x9d, 0x04, 0x7e, 0xc4, 0x73, 0x02, 0xe7, + 0x14, 0xf1, 0xf4, 0x65, 0xbc, 0x91, 0xf0, 0x16, + 0x8d, 0x4a, 0x00, 0x87, 0xc0, 0x75, 0xaa, 0x56, + 0x06, 0x64, 0x61, 0xd0, 0xc5, 0xec, 0x64, 0x02, + 0xc3, 0x87, 0x51, 0xca, 0x3a, 0x1a, 0x0b, 0x20, + 0x08, 0x70, 0x20, 0xdd, 0xc7, 0x65, 0x04, 0x16, + 0x9b, 0xc3, 0x24, 0x93, 0x56, 0x08, 0x01, 0xe0, + 0x1e, 0xe8, 0x59, 0xfb, 0x47, 0xdb, 0x90, 0x04, + 0xcf, 0xfb, 0x4f, 0x18, 0x86, 0xc3, 0x9f, 0xd3, + 0xf3, 0xfe, 0x08, 0x36, 0x20, 0x18, 0xea, 0x72, + 0x93, 0x94, 0x9c, 0xa4, 0xe5, 0x25, 0xab, 0x62, + 0x61, 0x2e, 0x1a, 0xc0, 0x32, 0x8e, 0xed, 0x83, + 0x59, 0x8d, 0x4e, 0x2f, 0x64, 0xc8, 0xa8, 0xed, + 0x2f, 0xf8, 0x35, 0xaa, 0x87, 0x90, 0xc9, 0x00, + 0xfe, 0x61, 0x23, 0x12, 0x20, 0x9b, 0x19, 0xca, + 0x4e, 0x52, 0x0e, 0x92, 0xd4, 0x43, 0x40, 0x07, + 0xd1, 0x13, 0x94, 0x84, 0x6d, 0xc8, 0x54, 0x24, + 0xc2, 0x22, 0x8f, 0xcd, 0x39, 0x49, 0xca, 0x4e, + 0x52, 0x72, 0x93, 0x94, 0x87, 0xc3, 0x48, 0xfa, + 0x5b, 0xd6, 0xd6, 0xfa, 0x7f, 0x60, 0x8c, 0x0b, + 0x72, 0x1d, 0x16, 0xba, 0x41, 0x62, 0x61, 0x0c, + 0x0d, 0x49, 0x40, 0x5b, 0x39, 0x70, 0x90, 0x06, + 0x3d, 0xc8, 0x82, 0xff, 0x00, 0x68, 0x90, 0x06, + 0x64, 0xa9, 0x4e, 0x5a, 0x4d, 0x41, 0x42, 0xf3, + 0x06, 0x8e, 0xaf, 0xde, 0x52, 0xd8, 0x91, 0x8f, + 0xfc, 0x89, 0x41, 0x7b, 0x90, 0x3d, 0x63, 0xea, + 0x11, 0x89, 0x0e, 0x6c, 0x2f, 0xd8, 0x0b, 0xf9, + 0x30, 0xe0, 0x3d, 0x5a, 0x01, 0x31, 0xaf, 0xfb, + 0xc6, 0x61, 0xb4, 0xe7, 0xf4, 0xfc, 0xff, 0x00, + 0x8f, 0xea, 0xce, 0xf6, 0x2a, 0xff, 0x00, 0xfa, + 0x6f, 0x67, 0x28, 0x05, 0xc4, 0x85, 0x43, 0x2b, + 0x89, 0x51, 0x2d, 0xbc, 0x37, 0xa2, 0x35, 0x4d, + 0x6f, 0x28, 0x68, 0xab, 0x33, 0x7d, 0x2d, 0x3f, + 0x30, 0x6c, 0x1d, 0xa8, 0x1d, 0x21, 0x36, 0xc9, + 0xca, 0x25, 0x05, 0xd6, 0xc8, 0x2a, 0x93, 0x51, + 0x06, 0x2b, 0x06, 0x2c, 0x04, 0x0c, 0x4c, 0xd4, + 0x64, 0x8e, 0x82, 0xd0, 0xc2, 0x22, 0x08, 0x09, + 0x24, 0x28, 0xc5, 0x8b, 0x83, 0xd0, 0x48, 0x62, + 0x82, 0x4a, 0x02, 0xa1, 0x59, 0x60, 0x60, 0xd1, + 0x97, 0x00, 0x19, 0x60, 0x30, 0x19, 0xdb, 0x30, + 0x32, 0x10, 0x7c, 0x86, 0x80, 0x02, 0x24, 0xdb, + 0x7a, 0x82, 0x86, 0x46, 0x12, 0x0c, 0x22, 0x85, + 0x98, 0x69, 0x5a, 0x88, 0x3f, 0x20, 0x82, 0x34, + 0xc6, 0xf8, 0x0f, 0xcc, 0x87, 0xf3, 0x7b, 0x7d, + 0x3d, 0x6d, 0x6f, 0xa7, 0xf7, 0xb3, 0x65, 0x02, + 0x3e, 0xcf, 0xdd, 0x31, 0x7f, 0xc8, 0x03, 0x7f, + 0xda, 0xeb, 0x37, 0xfc, 0x81, 0x4f, 0xef, 0xe3, + 0x96, 0x4f, 0xb4, 0x12, 0x46, 0x60, 0x30, 0x0a, + 0x5d, 0x20, 0x23, 0xce, 0x49, 0x4c, 0x80, 0x0e, + 0x23, 0x26, 0x30, 0xcb, 0x93, 0x2c, 0x8a, 0x2a, + 0xc8, 0xcd, 0x5b, 0xa9, 0x18, 0xe8, 0xc7, 0xba, + 0xc1, 0x81, 0xad, 0x08, 0xb4, 0xa8, 0xff, 0x00, + 0xe1, 0x8c, 0x43, 0x79, 0xcf, 0x14, 0xdb, 0x68, + 0x99, 0xc5, 0x08, 0xd0, 0x03, 0xcc, 0xe1, 0x27, + 0x09, 0x38, 0x49, 0xc2, 0x7a, 0x52, 0xc5, 0x2c, + 0xbc, 0x70, 0xc0, 0x24, 0x0a, 0x54, 0x18, 0xc5, + 0x24, 0xa0, 0x6a, 0x1a, 0x3a, 0x5c, 0xcd, 0xae, + 0xef, 0x45, 0xa3, 0x9f, 0x0f, 0x1b, 0x02, 0x71, + 0x08, 0x70, 0x50, 0x01, 0x8c, 0x90, 0x37, 0x0e, + 0xb5, 0x81, 0x15, 0x51, 0x12, 0x10, 0x52, 0x7d, + 0x0a, 0x51, 0x4a, 0x05, 0x80, 0x15, 0x00, 0x6e, + 0x2e, 0x36, 0x86, 0x17, 0xc8, 0x9e, 0x28, 0x05, + 0x54, 0xa5, 0x00, 0xbc, 0x02, 0x4c, 0x70, 0x80, + 0xe9, 0x32, 0xfd, 0x9f, 0x10, 0xd8, 0x9a, 0x40, + 0xd0, 0x28, 0x2c, 0x59, 0x8b, 0xaa, 0x10, 0xc2, + 0xd2, 0xf8, 0x92, 0xad, 0x52, 0x58, 0xbe, 0xb1, + 0x40, 0xdf, 0xa2, 0x9c, 0x24, 0xe1, 0x27, 0x09, + 0x38, 0x48, 0x3c, 0x30, 0x0b, 0xa5, 0xbd, 0x6f, + 0xd6, 0x9b, 0x22, 0xd3, 0x94, 0xce, 0x53, 0x39, + 0x4c, 0xe5, 0x33, 0x94, 0xce, 0x53, 0x0b, 0x36, + 0x05, 0x7c, 0x53, 0x43, 0xa4, 0x54, 0x8e, 0xe9, + 0x11, 0xb1, 0xd3, 0x34, 0x87, 0xb4, 0x57, 0x06, + 0x42, 0x54, 0x73, 0x91, 0x50, 0x71, 0xc3, 0x01, + 0xc8, 0x94, 0xc0, 0x12, 0x0a, 0x61, 0x77, 0x28, + 0x12, 0x0f, 0x87, 0x16, 0x35, 0x3c, 0x4e, 0x31, + 0x31, 0xb9, 0x51, 0x35, 0x54, 0x59, 0x0a, 0x16, + 0x29, 0x06, 0x0d, 0xe5, 0x62, 0x66, 0xb0, 0xc5, + 0x71, 0x47, 0x39, 0x4c, 0xe5, 0x33, 0x94, 0xce, + 0x53, 0x39, 0x4c, 0xe5, 0x33, 0x94, 0xc0, 0x21, + 0x90, 0x88, 0xa7, 0xfe, 0xb1, 0x0d, 0xe7, 0x3c, + 0x53, 0x65, 0xa2, 0x1f, 0x8e, 0x30, 0xd5, 0x1c, + 0xa6, 0x72, 0x98, 0x30, 0xd6, 0x41, 0x51, 0x6a, + 0x8d, 0x07, 0xd0, 0x83, 0xb0, 0x14, 0x38, 0x05, + 0x80, 0xb1, 0x10, 0x9a, 0x18, 0xec, 0x5a, 0x4a, + 0x74, 0x50, 0x3c, 0x52, 0x10, 0x60, 0x80, 0xf4, + 0x22, 0x11, 0xe0, 0x84, 0xa8, 0x02, 0xb9, 0x25, + 0x46, 0x73, 0x24, 0x35, 0xaa, 0xac, 0xa0, 0xe6, + 0x84, 0xab, 0x5c, 0xe6, 0x15, 0x58, 0x07, 0x2c, + 0x31, 0x11, 0x76, 0xc0, 0x24, 0xd8, 0x95, 0xc5, + 0x51, 0x1e, 0xe2, 0x18, 0x6a, 0x41, 0x81, 0x62, + 0x7e, 0x47, 0xcc, 0x0d, 0x32, 0x62, 0x5c, 0x00, + 0x20, 0x0c, 0x5b, 0x0b, 0xa8, 0x45, 0x58, 0xc4, + 0xbc, 0x00, 0x1e, 0xf0, 0xea, 0x57, 0x08, 0x16, + 0x28, 0xea, 0x89, 0x7b, 0x89, 0x55, 0x98, 0x84, + 0xa6, 0x0f, 0x66, 0x6a, 0xf0, 0x79, 0x45, 0x24, + 0x99, 0x2a, 0xb0, 0x8a, 0xad, 0x75, 0x89, 0xe5, + 0xe4, 0x44, 0x68, 0xe9, 0x06, 0x18, 0x05, 0x42, + 0x7a, 0x38, 0x06, 0x74, 0x10, 0xe9, 0x20, 0x46, + 0xe6, 0x48, 0x46, 0x48, 0x7e, 0xa2, 0x5c, 0xa6, + 0x3a, 0x56, 0x11, 0xcf, 0xaa, 0x68, 0x3c, 0xf2, + 0x63, 0x5a, 0xce, 0x52, 0x72, 0x90, 0x56, 0x5f, + 0x86, 0xa7, 0x41, 0x53, 0x54, 0x0b, 0x48, 0x52, + 0x21, 0x80, 0xd1, 0x9e, 0x4e, 0xf0, 0xe9, 0x63, + 0xe5, 0x02, 0x4b, 0x58, 0x4b, 0x28, 0xd5, 0x38, + 0x27, 0x90, 0x03, 0x02, 0xc0, 0xe3, 0x06, 0x60, + 0x28, 0x74, 0x0b, 0x01, 0xe2, 0x25, 0x2e, 0x02, + 0x99, 0x43, 0xf5, 0x13, 0xa1, 0xab, 0xb0, 0x76, + 0xbb, 0xfa, 0x86, 0xf3, 0x3a, 0x14, 0x0c, 0x4d, + 0x32, 0x08, 0x06, 0xb0, 0x6e, 0x80, 0x22, 0x02, + 0x97, 0xab, 0xf6, 0x30, 0x92, 0xc4, 0xa9, 0x32, + 0x55, 0x69, 0x08, 0xcf, 0x72, 0x31, 0x6a, 0x21, + 0x41, 0x42, 0xa8, 0x89, 0x56, 0x8c, 0xa8, 0x41, + 0x82, 0x03, 0x14, 0x22, 0x72, 0x93, 0x94, 0x8d, + 0xd3, 0x04, 0x0d, 0x46, 0xa4, 0xa9, 0xa4, 0xe5, + 0x27, 0x29, 0x39, 0x48, 0x73, 0x89, 0x9e, 0xcf, + 0xfd, 0x7c, 0x37, 0x0c, 0xfe, 0x9b, 0xad, 0x13, + 0xed, 0xbd, 0x4e, 0x37, 0x4a, 0x5e, 0xfd, 0x94, + 0x72, 0x45, 0xd4, 0x41, 0x04, 0xe0, 0x68, 0x42, + 0x33, 0x44, 0x60, 0xc9, 0xb0, 0x21, 0xd8, 0xbf, + 0xfd, 0x23, 0xe2, 0x93, 0x14, 0x43, 0x04, 0x62, + 0x83, 0x55, 0x98, 0x15, 0xa9, 0x09, 0x04, 0x06, + 0x58, 0x81, 0xb8, 0x30, 0x41, 0x6d, 0x5d, 0x64, + 0x1d, 0x0b, 0x12, 0x34, 0xb2, 0x97, 0xea, 0xa2, + 0x22, 0x16, 0x24, 0xd5, 0xa8, 0xae, 0x50, 0xcd, + 0x7a, 0x8b, 0x0f, 0x0e, 0x97, 0xba, 0x34, 0xb2, + 0x86, 0x68, 0x5e, 0xe1, 0x59, 0x0d, 0x10, 0xc0, + 0x1e, 0xa9, 0x00, 0x46, 0x3d, 0x43, 0x87, 0xe4, + 0x1d, 0xb6, 0xd6, 0x21, 0x10, 0x15, 0x3f, 0x84, + 0x0d, 0x72, 0xbc, 0xc0, 0x00, 0x9b, 0x56, 0x0d, + 0xef, 0x42, 0x31, 0x82, 0xa0, 0xa0, 0x18, 0x48, + 0x9c, 0x18, 0x08, 0xd6, 0xdd, 0x7b, 0x58, 0x6d, + 0x7e, 0x29, 0x28, 0x20, 0x84, 0x8e, 0x42, 0x16, + 0xab, 0x23, 0x89, 0xdd, 0x01, 0x88, 0x00, 0xab, + 0x34, 0x97, 0xa0, 0x81, 0xbf, 0xf2, 0xaf, 0x6c, + 0xd7, 0xd4, 0xb7, 0x82, 0xac, 0xca, 0x21, 0x3f, + 0x3f, 0x24, 0x5c, 0xc5, 0xd5, 0xf1, 0x22, 0xf9, + 0x1a, 0x75, 0x83, 0xe1, 0x86, 0x5c, 0x0b, 0x2a, + 0x57, 0x66, 0xbd, 0x8c, 0x03, 0xb5, 0xf2, 0xb2, + 0xc3, 0x70, 0xb0, 0x82, 0xf8, 0x89, 0x71, 0xa8, + 0x82, 0xad, 0x52, 0x87, 0x3a, 0x82, 0xa6, 0x4b, + 0xca, 0x3e, 0x60, 0x1f, 0x62, 0x8d, 0x4c, 0x9a, + 0x42, 0x28, 0xfc, 0x45, 0xc3, 0x00, 0x21, 0x26, + 0xe7, 0x02, 0xad, 0x55, 0xac, 0x35, 0x20, 0xff, + 0x00, 0x41, 0xf1, 0x02, 0xd9, 0xc7, 0x02, 0x0a, + 0xb1, 0xe4, 0xd3, 0x48, 0x41, 0xce, 0xb2, 0x03, + 0x24, 0xc0, 0x22, 0x97, 0x65, 0x18, 0xeb, 0x29, + 0x7d, 0x5e, 0xbe, 0x47, 0xa0, 0x23, 0xa4, 0x4f, + 0x55, 0x34, 0xa6, 0xec, 0x40, 0x43, 0x0a, 0x21, + 0x16, 0x8e, 0x04, 0xa8, 0x0f, 0xdf, 0x5c, 0xac, + 0x48, 0x81, 0x74, 0x07, 0x28, 0x02, 0x4e, 0x82, + 0x5b, 0x3f, 0xc6, 0xc5, 0x97, 0xfd, 0x7e, 0x36, + 0x0c, 0xfe, 0x9b, 0xad, 0x13, 0xed, 0xbd, 0x55, + 0x80, 0x35, 0x4a, 0xac, 0xdc, 0xac, 0x07, 0x25, + 0x28, 0x64, 0xb3, 0x8c, 0xb8, 0xa5, 0x40, 0x3e, + 0x66, 0xb5, 0x84, 0x81, 0x86, 0x5e, 0xf4, 0xa5, + 0xc0, 0x98, 0x49, 0x5d, 0xe8, 0xe6, 0x0d, 0x1d, + 0x5f, 0xbc, 0xa0, 0x97, 0xc2, 0x34, 0x16, 0x86, + 0x16, 0x90, 0x52, 0x97, 0xda, 0x58, 0xef, 0x4e, + 0x07, 0xbc, 0x74, 0x1c, 0x68, 0x9b, 0x88, 0xe9, + 0x02, 0x03, 0x84, 0x80, 0x38, 0x44, 0x84, 0x4f, + 0xc5, 0x26, 0x79, 0x18, 0x26, 0x32, 0x33, 0x16, + 0x6e, 0x70, 0xd9, 0xa9, 0x8a, 0xcd, 0x47, 0xd6, + 0x79, 0xcb, 0xeb, 0xd6, 0xa1, 0x89, 0x91, 0x91, + 0xa0, 0xf8, 0x82, 0x20, 0x04, 0x15, 0x0e, 0x49, + 0xa9, 0x4b, 0x02, 0x18, 0x0e, 0xa5, 0x7f, 0xe9, + 0x5e, 0xd9, 0xaf, 0xa8, 0x60, 0x86, 0xc7, 0x03, + 0xdc, 0x4d, 0x4a, 0x3a, 0xdf, 0x7b, 0xc2, 0x54, + 0x35, 0x20, 0x6a, 0xfe, 0xa5, 0x30, 0x10, 0x09, + 0x97, 0xe6, 0x0c, 0xb1, 0x23, 0x1a, 0x03, 0x74, + 0xf7, 0x95, 0x2f, 0x8d, 0xa0, 0xdd, 0x25, 0x98, + 0x33, 0x00, 0x80, 0x40, 0xfd, 0x75, 0xac, 0x23, + 0x4c, 0x82, 0x4f, 0x34, 0x6b, 0x95, 0x9d, 0x04, + 0x22, 0x01, 0x30, 0x09, 0x02, 0x75, 0x14, 0xba, + 0x02, 0x14, 0xd2, 0x66, 0xc7, 0xbc, 0x1a, 0x35, + 0x42, 0xae, 0xe7, 0x0a, 0xc7, 0x75, 0xc9, 0xa3, + 0xcd, 0x4b, 0x87, 0x85, 0xc0, 0xf5, 0x51, 0xfd, + 0xa7, 0x3c, 0x5c, 0x46, 0xf4, 0x97, 0x66, 0x3c, + 0x0e, 0xb0, 0x84, 0x61, 0x90, 0x0b, 0x06, 0x4b, + 0xed, 0x68, 0x3a, 0x2d, 0x00, 0x0e, 0x21, 0x0b, + 0x53, 0xf8, 0xd8, 0xb2, 0xff, 0x00, 0xae, 0x46, + 0xe1, 0x9f, 0xd3, 0x6d, 0xa2, 0x09, 0x25, 0x1a, + 0x9a, 0x7f, 0x63, 0x02, 0x26, 0x85, 0x02, 0x81, + 0xf4, 0x2f, 0xc4, 0x6c, 0xc1, 0x22, 0x90, 0x12, + 0x11, 0x6a, 0x12, 0xc8, 0x2c, 0xb3, 0x94, 0x82, + 0x25, 0x9e, 0x21, 0x07, 0x01, 0x1a, 0xd2, 0x02, + 0x14, 0xcb, 0x6a, 0x21, 0x4c, 0xf5, 0x07, 0x4c, + 0x26, 0x5d, 0x8a, 0x30, 0x68, 0xe2, 0xa9, 0x00, + 0x0a, 0x5e, 0xf0, 0xe7, 0x35, 0x18, 0x10, 0x88, + 0x1a, 0xfb, 0x91, 0x8f, 0xb8, 0x34, 0x01, 0x0d, + 0xc0, 0x10, 0x10, 0x68, 0x34, 0xae, 0x4b, 0x17, + 0x32, 0x27, 0x22, 0x05, 0x51, 0x55, 0x00, 0xd3, + 0x09, 0x40, 0x80, 0x0c, 0xca, 0xc1, 0xb3, 0xa1, + 0x9a, 0x5d, 0xe5, 0xfd, 0x93, 0x24, 0x0b, 0xd7, + 0xd5, 0x02, 0xec, 0x0a, 0x0f, 0xcf, 0xf0, 0x30, + 0x60, 0x36, 0x8d, 0x8e, 0x68, 0x01, 0x1f, 0x74, + 0x4f, 0x61, 0x99, 0xab, 0xd1, 0x18, 0xfc, 0x5c, + 0xb4, 0x67, 0x51, 0x99, 0x37, 0x8b, 0xea, 0xb2, + 0x8d, 0x4c, 0x5c, 0x1f, 0xe0, 0xdd, 0xd2, 0xb9, + 0xd6, 0xb4, 0x43, 0x1c, 0x15, 0x8e, 0x65, 0xac, + 0x3a, 0xcc, 0x82, 0x28, 0xa0, 0x7d, 0x42, 0x85, + 0xb4, 0x0e, 0xe0, 0x34, 0xc6, 0x51, 0xdf, 0x0e, + 0x40, 0x81, 0x90, 0xd2, 0xc4, 0x08, 0x1e, 0xf1, + 0x80, 0xf0, 0x10, 0x21, 0x03, 0x02, 0x22, 0xc9, + 0xb1, 0x59, 0xa5, 0x00, 0x22, 0x50, 0x20, 0xfb, + 0xc0, 0x2f, 0x88, 0x48, 0x23, 0x00, 0x8f, 0x7b, + 0xfa, 0x77, 0x70, 0x4e, 0xc8, 0x03, 0xa1, 0xc5, + 0x22, 0x83, 0x3c, 0x64, 0x1c, 0x2b, 0x00, 0x07, + 0xd8, 0xc3, 0x6b, 0x48, 0x20, 0x1b, 0x1e, 0x89, + 0x17, 0x02, 0xd9, 0x9f, 0xe0, 0x82, 0x00, 0xc9, + 0xa0, 0x12, 0xdf, 0x10, 0x13, 0xd5, 0x3f, 0xd6, + 0xa3, 0x78, 0xcf, 0x14, 0xdb, 0x68, 0x84, 0xf1, + 0x06, 0x20, 0xdb, 0x77, 0x0b, 0x42, 0x0c, 0x2c, + 0x58, 0x1f, 0xe8, 0x30, 0x3d, 0x70, 0x80, 0x40, + 0x06, 0x0d, 0x33, 0x5f, 0x98, 0x18, 0x9d, 0x34, + 0x15, 0x83, 0x9b, 0x04, 0x60, 0xc5, 0x42, 0x34, + 0x08, 0x23, 0x00, 0x35, 0x29, 0x1a, 0xb7, 0x73, + 0x94, 0xad, 0x2d, 0x76, 0xa9, 0x68, 0x33, 0x9d, + 0x4b, 0xf6, 0x95, 0xc1, 0x02, 0xc5, 0x14, 0x00, + 0x09, 0xbd, 0x88, 0x18, 0x31, 0xbc, 0xaa, 0xb0, + 0x01, 0x10, 0xa2, 0x90, 0xf1, 0x48, 0xd6, 0x1d, + 0xfc, 0x38, 0x10, 0x00, 0x80, 0x09, 0x76, 0x21, + 0x9f, 0xd4, 0x41, 0x72, 0xd2, 0x31, 0xd5, 0xc5, + 0x89, 0x56, 0x97, 0x69, 0x05, 0x03, 0xaa, 0x4d, + 0x3e, 0x0f, 0xf7, 0x78, 0xc6, 0x37, 0x0d, 0x81, + 0xd4, 0xfa, 0xa4, 0x95, 0x67, 0x14, 0xb5, 0x20, + 0x6a, 0x3f, 0x80, 0x39, 0x9e, 0x1c, 0x09, 0x83, + 0xdf, 0xe2, 0x19, 0xc2, 0xd1, 0xd6, 0xb6, 0x6e, + 0x1e, 0xf0, 0x2a, 0x44, 0x4a, 0x50, 0x49, 0x40, + 0x82, 0x12, 0x5e, 0x38, 0x40, 0x69, 0x92, 0x93, + 0xa5, 0x96, 0x43, 0xa0, 0xb3, 0x98, 0xce, 0xaa, + 0xae, 0x4b, 0x96, 0x51, 0x68, 0x0f, 0xe2, 0x01, + 0x0e, 0xa6, 0x33, 0x55, 0xa9, 0x48, 0x59, 0xcf, + 0x8e, 0x42, 0x04, 0x16, 0x9a, 0xe0, 0x30, 0x8b, + 0x9c, 0xc2, 0x6a, 0x3b, 0x2b, 0x59, 0x1e, 0xfb, + 0xae, 0x61, 0x24, 0x12, 0xd1, 0x22, 0xa6, 0x27, + 0x38, 0x6d, 0x18, 0x0a, 0xc8, 0x54, 0x2f, 0x32, + 0x4a, 0x38, 0x5a, 0xd1, 0xa2, 0x00, 0xad, 0x5f, + 0x8c, 0xea, 0xba, 0x78, 0x43, 0x9b, 0x7f, 0xbb, + 0x0f, 0xde, 0x1e, 0x4e, 0x71, 0xa3, 0x42, 0x59, + 0x2a, 0x16, 0x1d, 0x7d, 0xcc, 0x1a, 0xe2, 0x29, + 0xec, 0x69, 0x43, 0xa9, 0x57, 0x27, 0x4f, 0xe1, + 0x83, 0x95, 0x59, 0xf6, 0x8f, 0x79, 0x75, 0xb4, + 0x5f, 0xeb, 0x51, 0xb4, 0x67, 0xf4, 0x38, 0xa1, + 0x49, 0x8e, 0xbe, 0x8e, 0x98, 0xa0, 0x40, 0xfc, + 0xf7, 0x42, 0x43, 0x81, 0x80, 0x09, 0xfd, 0xff, + 0x00, 0x13, 0x0c, 0x30, 0xc3, 0x0c, 0x30, 0xc3, + 0x0c, 0x30, 0xc3, 0x0c, 0x30, 0xc3, 0x00, 0x06, + 0xa4, 0x19, 0x0f, 0xfd, 0xc4, 0x06, 0xaa, 0x99, + 0x07, 0x98, 0x3b, 0xc2, 0x40, 0x3d, 0xc9, 0xf5, + 0x20, 0x62, 0x98, 0x23, 0x08, 0xce, 0xa5, 0xc0, + 0xea, 0x4a, 0x87, 0xac, 0x24, 0x34, 0x00, 0xc8, + 0xf9, 0xa6, 0xf8, 0xef, 0x37, 0xc7, 0x79, 0xbe, + 0x3b, 0xcd, 0xf1, 0xde, 0x6f, 0x8e, 0xf3, 0x7c, + 0x77, 0x9b, 0xe3, 0xbc, 0xdf, 0x1d, 0xe6, 0xf8, + 0xef, 0x37, 0xc7, 0x79, 0xbe, 0x3b, 0xcd, 0xf1, + 0xde, 0x6f, 0x8e, 0xf3, 0x7c, 0x77, 0x9b, 0xe3, + 0xbc, 0xdf, 0x1d, 0xe6, 0xf8, 0xef, 0x03, 0xcc, + 0x26, 0x10, 0xbf, 0x15, 0xfb, 0x88, 0x82, 0x90, + 0x69, 0xe8, 0x3f, 0xd5, 0x7d, 0x32, 0x50, 0x20, + 0x6c, 0x10, 0xf8, 0xcd, 0xa3, 0x3f, 0xa6, 0x3f, + 0x04, 0x21, 0x41, 0x07, 0x4c, 0x33, 0x73, 0xcd, + 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, + 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, + 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, + 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, + 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, + 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, + 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, + 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, + 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, + 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, + 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, + 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, + 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, + 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, + 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, + 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, + 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, + 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, + 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, + 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, 0x73, 0xcd, + 0x37, 0x3c, 0xd3, 0x73, 0xcd, 0x37, 0x3c, 0xd3, + 0x73, 0xcd, 0x37, 0x3c, 0xd1, 0x30, 0x2e, 0x60, + 0xed, 0x09, 0x88, 0xaf, 0x73, 0x9b, 0x46, 0x58, + 0x69, 0x89, 0xc1, 0x0c, 0xd3, 0x88, 0x78, 0x9c, + 0x43, 0xc4, 0xe2, 0x1e, 0x27, 0x10, 0xf1, 0x38, + 0x87, 0x89, 0xc4, 0x3c, 0x4e, 0x21, 0xe2, 0x71, + 0x0f, 0x13, 0x88, 0x78, 0x9c, 0x43, 0xc4, 0xe2, + 0x1e, 0x27, 0x10, 0xf1, 0x38, 0x87, 0x89, 0xc4, + 0x3c, 0x4e, 0x21, 0xe2, 0x71, 0x0f, 0x13, 0x88, + 0x78, 0x9c, 0x43, 0xc4, 0xe2, 0x1e, 0x27, 0x10, + 0xf1, 0x38, 0x87, 0x89, 0xc4, 0x3c, 0x4e, 0x21, + 0xe2, 0x71, 0x0f, 0x13, 0x88, 0x78, 0x9c, 0x43, + 0xc4, 0xe2, 0x1e, 0x27, 0x10, 0xf1, 0x38, 0x87, + 0x89, 0xc4, 0x3c, 0x4e, 0x21, 0xe2, 0x71, 0x0f, + 0x13, 0x88, 0x78, 0x9c, 0x43, 0xc4, 0xe2, 0x1e, + 0x27, 0x10, 0xf1, 0x38, 0x87, 0x89, 0xc4, 0x3c, + 0x4e, 0x21, 0xe2, 0x71, 0x0f, 0x13, 0x88, 0x78, + 0x9c, 0x43, 0xc4, 0xe2, 0x1e, 0x27, 0x10, 0xf1, + 0x38, 0x87, 0x89, 0xc4, 0x3c, 0x4e, 0x21, 0xe2, + 0x71, 0x0f, 0x13, 0x88, 0x78, 0x9c, 0x43, 0xc4, + 0xe2, 0x1e, 0x27, 0x10, 0xf1, 0x38, 0x87, 0x89, + 0xc4, 0x3c, 0x4e, 0x21, 0xe2, 0x71, 0x0f, 0x13, + 0x88, 0x78, 0x9c, 0x43, 0xc4, 0xe2, 0x1e, 0x27, + 0x10, 0xf1, 0x38, 0x87, 0x89, 0xc4, 0x3c, 0x4e, + 0x21, 0xe2, 0x71, 0x0f, 0x13, 0x88, 0x78, 0x9c, + 0x43, 0xc4, 0xe2, 0x1e, 0x27, 0x10, 0xf1, 0x38, + 0x87, 0x89, 0xc4, 0x3c, 0x4e, 0x21, 0xe2, 0x71, + 0x0f, 0x13, 0x88, 0x78, 0x9c, 0x43, 0xc4, 0xe2, + 0x1e, 0x23, 0x63, 0x06, 0x00, 0x17, 0x02, 0x1f, + 0x62, 0x7f, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, + 0x12, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x24, 0x90, 0x49, + 0x24, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x11, 0xb6, 0xdf, 0x6d, 0xb6, + 0xdb, 0xe2, 0x40, 0x00, 0x80, 0x08, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x25, 0x66, 0x93, 0x45, 0x0d, 0xb7, 0xc0, 0x90, + 0x00, 0x04, 0x90, 0x09, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x90, 0x09, 0x00, 0x82, + 0x21, 0x9b, 0x6f, 0x88, 0x24, 0x02, 0x49, 0x04, + 0x82, 0x4e, 0xf6, 0xdb, 0x6d, 0xb6, 0xdb, 0x6d, + 0xb6, 0xc2, 0xc9, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x92, 0x49, 0x04, 0x92, 0x49, 0x20, 0x0d, 0x6d, + 0xb6, 0xdb, 0x6d, 0xb6, 0xdb, 0x6d, 0xb6, 0x6a, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x20, + 0x52, 0xdb, 0x6d, 0xb6, 0xdb, 0x6d, 0xb6, 0xdb, + 0x6d, 0x42, 0x40, 0x36, 0xdb, 0x6d, 0x84, 0x8c, + 0x1f, 0xb6, 0xdb, 0x6d, 0x6c, 0x92, 0x49, 0x16, + 0xc3, 0x08, 0xb4, 0x92, 0x49, 0x73, 0x26, 0x42, + 0x49, 0x24, 0x6a, 0x4d, 0x44, 0x93, 0x40, 0x12, + 0x2d, 0xb6, 0xdb, 0x76, 0x73, 0x7a, 0xed, 0xb6, + 0xd9, 0x52, 0x49, 0x24, 0xc6, 0x9c, 0x9f, 0x32, + 0x49, 0x25, 0x21, 0xf9, 0x3a, 0xaf, 0x20, 0xc1, + 0xab, 0x3a, 0xff, 0x00, 0xc0, 0x24, 0x5b, 0x6d, + 0xb6, 0xdb, 0x6d, 0xb6, 0xdb, 0x6d, 0xb6, 0xf4, + 0x00, 0x00, 0xb1, 0x55, 0xaf, 0x00, 0x00, 0x07, + 0x54, 0x95, 0x0b, 0xb8, 0x64, 0xeb, 0xe5, 0xf4, + 0x4b, 0x92, 0x48, 0xb6, 0xd8, 0xf7, 0xf4, 0xcf, + 0xcd, 0x8e, 0xdb, 0x65, 0x33, 0x6d, 0xb6, 0xdb, + 0x6d, 0xb6, 0xdb, 0x6d, 0xf1, 0x27, 0xff, 0x00, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, + 0xff, 0x00, 0xff, 0x00, 0xf3, 0x00, 0x91, 0x6d, + 0xb4, 0x2f, 0x78, 0x98, 0xc2, 0x9d, 0xb6, 0xc8, + 0x40, 0x00, 0x02, 0x09, 0x20, 0x90, 0x00, 0x00, + 0x02, 0x40, 0x04, 0x92, 0x49, 0x00, 0x10, 0x00, + 0x00, 0x02, 0x41, 0x26, 0xdb, 0x63, 0xdd, 0x5f, + 0x5d, 0x8f, 0x3b, 0x6d, 0xb0, 0x80, 0x00, 0x04, + 0x02, 0x49, 0x24, 0x00, 0x00, 0x04, 0x80, 0x01, + 0x24, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x02, + 0x4d, 0xb6, 0xc8, 0xc9, 0x9f, 0xd5, 0x54, 0x7e, + 0xdb, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x24, 0x9b, 0x6d, 0x85, + 0x5a, 0x6c, 0x5a, 0xaa, 0x6d, 0xb6, 0xd2, 0x00, + 0x04, 0x80, 0x48, 0x00, 0x02, 0x00, 0x00, 0x11, + 0xbb, 0xe0, 0x12, 0x01, 0x20, 0x82, 0x49, 0x24, + 0x12, 0x49, 0x36, 0xdb, 0x48, 0xac, 0xeb, 0x8d, + 0xd2, 0x3b, 0x6d, 0x84, 0x00, 0x08, 0x20, 0x12, + 0x09, 0x00, 0x00, 0x00, 0x24, 0x37, 0x49, 0x04, + 0x02, 0x09, 0x20, 0x82, 0x48, 0x20, 0x12, 0x2d, + 0xb6, 0xdb, 0x6d, 0xb6, 0xdb, 0x6d, 0xb6, 0xd9, + 0x09, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x90, 0x40, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x48, 0x24, 0x5b, 0x6d, 0xb6, 0xdb, + 0x6d, 0xb6, 0xdb, 0x6d, 0xb6, 0x90, 0x00, 0x00, + 0x92, 0x41, 0x24, 0x00, 0x00, 0x00, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x48, 0xb6, 0xdb, 0x6d, 0xb6, 0xdb, 0x6d, 0xb6, + 0xdb, 0x65, 0x20, 0x00, 0x40, 0x20, 0x80, 0x41, + 0x00, 0x00, 0x01, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x00, 0x90, 0x92, 0x49, + 0x24, 0x92, 0x4d, 0x24, 0x92, 0x49, 0x2e, 0x49, + 0x24, 0x92, 0x48, 0x24, 0x92, 0x49, 0x24, 0x82, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x41, 0x20, 0x92, 0x40, 0x00, 0x92, 0x49, + 0x24, 0x00, 0x09, 0x20, 0x80, 0x00, 0x00, 0x02, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x12, 0x41, + 0x24, 0x92, 0x09, 0x24, 0x82, 0x41, 0x24, 0x12, + 0x41, 0x24, 0x92, 0x49, 0x04, 0x82, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x09, 0x20, 0x10, 0x00, 0x24, 0x80, + 0x00, 0x00, 0x12, 0x48, 0x00, 0x92, 0x49, 0x24, + 0x92, 0x40, 0x24, 0x92, 0x49, 0x24, 0x91, 0x5b, + 0x6d, 0xb6, 0xdb, 0x6d, 0xb6, 0xdb, 0x6d, 0xa2, + 0x40, 0x24, 0x02, 0x48, 0x24, 0x90, 0x09, 0x24, + 0x02, 0x48, 0x24, 0x00, 0x00, 0x24, 0x80, 0x01, + 0x00, 0x00, 0x01, 0x01, 0x27, 0xc3, 0x4f, 0xe3, + 0x2f, 0x56, 0x4a, 0x93, 0xa0, 0x12, 0x48, 0x04, + 0x80, 0x48, 0x24, 0x12, 0x09, 0x04, 0x10, 0x49, + 0x24, 0x92, 0x40, 0x20, 0x00, 0x09, 0x24, 0x80, + 0x02, 0x96, 0x8a, 0xa6, 0xdc, 0x4f, 0x1b, 0x76, + 0x4a, 0x49, 0x24, 0x82, 0x09, 0x04, 0x12, 0x49, + 0x20, 0x92, 0x00, 0x00, 0x13, 0x6d, 0xb6, 0xdb, + 0x6d, 0xb6, 0xdb, 0x6d, 0xa0, 0x10, 0x01, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4b, 0x6d, 0xb6, 0xdb, 0x6d, 0xb6, 0xdb, + 0x6d, 0xbb, 0x04, 0x90, 0x49, 0x24, 0x90, 0x48, + 0x20, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x49, 0x86, + 0xc6, 0x95, 0xed, 0x31, 0x95, 0x49, 0xce, 0x40, + 0x24, 0x82, 0x08, 0x20, 0x12, 0x00, 0x04, 0x12, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xda, 0x80, 0xa3, 0xd7, 0x0b, + 0x5a, 0xe3, 0x5d, 0xe4, 0x90, 0x48, 0x20, 0x82, + 0x08, 0x04, 0x90, 0x00, 0x24, 0x12, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x4e, + 0x56, 0x49, 0x24, 0x92, 0x49, 0x14, 0x92, 0x49, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x49, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x24, 0x82, + 0x40, 0x20, 0x92, 0x49, 0x20, 0x12, 0x00, 0x00, + 0x00, 0x09, 0x20, 0x00, 0x00, 0x00, 0x92, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x01, 0x04, 0x10, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x20, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, + 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x4a, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x3a, 0x90, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x64, 0x92, 0x49, 0x31, 0x73, 0x45, 0x24, 0x92, + 0x4d, 0x04, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0xa4, 0x92, 0x49, + 0x7c, 0x30, 0xd9, 0x24, 0x92, 0x5a, 0x40, 0x00, + 0x00, 0x08, 0x04, 0x92, 0x40, 0x00, 0x12, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x3f, 0xff, 0x00, 0xff, 0x00, 0x34, + 0xab, 0xb7, 0xff, 0x00, 0xff, 0x00, 0xc4, 0x80, + 0x00, 0x00, 0x10, 0x09, 0x20, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x36, 0xdb, 0x6d, 0xb6, 0xdb, + 0x6d, 0xb6, 0xd8, 0x78, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x00, 0x00, 0x12, 0x40, 0x24, 0x12, 0x00, 0x00, + 0x92, 0x00, 0x24, 0x02, 0x40, 0x24, 0x90, 0x40, + 0x00, 0x90, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x04, 0x92, 0x08, 0x20, 0x80, 0x01, 0x24, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x48, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x24, 0x90, 0x48, 0x04, 0x02, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x12, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x82, 0x01, 0x56, 0xdb, 0x6d, 0xb6, 0xdb, 0x6d, + 0xb6, 0xdb, 0x60, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x77, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x24, 0x11, 0x2f, + 0x26, 0xe2, 0x36, 0x47, 0x83, 0x44, 0xe2, 0x93, + 0xde, 0xe2, 0x89, 0x65, 0xf2, 0x66, 0x64, 0xaf, + 0xb5, 0x34, 0x92, 0x49, 0x23, 0x20, 0x1d, 0x24, + 0x92, 0x52, 0x00, 0x22, 0x57, 0x67, 0x0d, 0x37, + 0x90, 0x2f, 0x26, 0xb4, 0xc1, 0xdc, 0xcc, 0x86, + 0xe1, 0x21, 0x8e, 0x18, 0xc9, 0xba, 0x8d, 0xb6, + 0xdb, 0x50, 0xd0, 0x03, 0x6d, 0xb6, 0xdc, 0x80, + 0x4f, 0x1c, 0xdc, 0x55, 0x6b, 0x1a, 0xfc, 0x22, + 0xd2, 0xc2, 0x62, 0xf8, 0x54, 0x2e, 0xc6, 0x6f, + 0xaa, 0x46, 0x7c, 0x49, 0x24, 0x92, 0xf4, 0x63, + 0xf2, 0x49, 0x24, 0xf1, 0x20, 0x0c, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x26, 0x80, 0x7f, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, + 0xff, 0x00, 0xff, 0x00, 0xfb, 0x51, 0x6d, 0xb6, + 0xdb, 0x6d, 0xb6, 0xdb, 0x6d, 0xb6, 0x90, 0x40, + 0x20, 0x00, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, + 0x01, 0x24, 0x00, 0x00, 0x20, 0x82, 0x48, 0x00, + 0x00, 0x00, 0x20, 0x92, 0x41, 0x20, 0x00, 0x49, + 0x00, 0x80, 0x00, 0x24, 0x92, 0x40, 0x00, 0x10, + 0x08, 0x00, 0x12, 0x00, 0x00, 0x02, 0x48, 0x00, + 0x00, 0x49, 0x04, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x00, 0x00, 0x40, 0x24, 0x10, 0x08, 0x20, 0x92, + 0x48, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x82, 0x49, 0x24, 0x12, 0x49, + 0x00, 0x12, 0x49, 0x20, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x01, 0x04, + 0x00, 0x49, 0x04, 0x00, 0x08, 0x24, 0x82, 0x49, + 0x20, 0x00, 0x00, 0x24, 0x80, 0x09, 0x00, 0x00, + 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x02, 0x09, 0x24, 0x10, 0x09, + 0x04, 0x92, 0x08, 0x20, 0x12, 0x09, 0x24, 0x82, + 0x41, 0x00, 0x92, 0x49, 0x24, 0x92, 0x49, 0x00, + 0x90, 0x48, 0x20, 0x12, 0x48, 0x00, 0x82, 0x01, + 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, + 0x00, 0x00, 0x04, 0x10, 0x01, 0x24, 0x92, 0x09, + 0x00, 0x92, 0x00, 0x24, 0x82, 0x4c, 0x24, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x89, 0x00, + 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0x00, 0x09, + 0x00, 0x00, 0x49, 0x20, 0x02, 0x41, 0x20, 0x00, + 0x09, 0x20, 0x01, 0xb7, 0x0c, 0xa8, 0x14, 0x56, + 0xee, 0x46, 0xde, 0x92, 0x00, 0x00, 0x00, 0x48, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x01, 0x04, 0x02, + 0x00, 0x20, 0x10, 0x08, 0x00, 0x90, 0x00, 0x29, + 0x27, 0x74, 0x73, 0xe3, 0x3b, 0xd7, 0xa4, 0x92, + 0x20, 0x92, 0x49, 0x24, 0x92, 0x41, 0x24, 0x92, + 0x48, 0x20, 0x00, 0x00, 0x00, 0x12, 0x01, 0x20, + 0x00, 0x01, 0x24, 0x12, 0x42, 0x4a, 0x9f, 0x6a, + 0x66, 0x1a, 0x08, 0x89, 0x22, 0x48, 0x00, 0x00, + 0x09, 0x20, 0x10, 0x00, 0x00, 0x00, 0x48, 0x20, + 0x80, 0x49, 0x20, 0x80, 0x40, 0x04, 0x00, 0x40, + 0x24, 0xfd, 0xb6, 0xdf, 0x6d, 0xb7, 0xdb, 0x6d, + 0xb6, 0xfc, 0x90, 0x00, 0x00, 0x02, 0x09, 0x20, + 0x00, 0x00, 0x04, 0x90, 0x48, 0x20, 0x02, 0x01, + 0x00, 0x12, 0x08, 0x00, 0x92, 0x41, 0x00, 0x02, + 0x40, 0x24, 0x92, 0x49, 0x00, 0x00, 0x49, 0x04, + 0x00, 0x01, 0x00, 0x90, 0x00, 0x20, 0x02, 0x49, + 0x04, 0x92, 0x49, 0x24, 0x92, 0x41, 0x24, 0x92, + 0x09, 0x20, 0x82, 0x49, 0x24, 0x92, 0x01, 0x20, + 0x00, 0x09, 0x24, 0x92, 0x41, 0x04, 0x82, 0x08, + 0x20, 0x00, 0x41, 0x20, 0x02, 0x49, 0x24, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x01, 0x24, + 0x92, 0x49, 0x20, 0x82, 0x41, 0x20, 0x92, 0x49, + 0x24, 0x80, 0x00, 0x04, 0x10, 0x48, 0x00, 0x00, + 0x00, 0x04, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x82, 0x48, 0x00, 0x12, 0x01, + 0x24, 0x12, 0x00, 0x00, 0x02, 0x49, 0x00, 0x00, + 0x09, 0x24, 0x80, 0x00, 0x00, 0x00, 0x09, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x48, + 0x24, 0x02, 0x49, 0x00, 0x10, 0x41, 0x00, 0x00, + 0x49, 0x24, 0x90, 0x49, 0x24, 0x90, 0x00, 0x00, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x08, 0x04, 0x90, + 0x48, 0x00, 0x02, 0x49, 0x00, 0x10, 0x41, 0x20, + 0x92, 0x01, 0x04, 0x12, 0x41, 0x24, 0x82, 0x48, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x24, 0x12, 0x00, 0x00, 0x90, 0x01, 0x00, + 0x02, 0x00, 0x04, 0x12, 0x48, 0x04, 0x90, 0x01, + 0x04, 0x80, 0x01, 0x20, 0x02, 0x49, 0x24, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x41, 0x24, + 0x00, 0x00, 0x24, 0x92, 0x01, 0x20, 0x92, 0x40, + 0x24, 0x90, 0x08, 0x20, 0x82, 0x49, 0x24, 0x92, + 0x00, 0x04, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x41, 0x00, 0x00, 0x01, + 0x00, 0x82, 0x48, 0x00, 0x00, 0x49, 0x20, 0x02, + 0x40, 0x24, 0x12, 0x01, 0x04, 0x00, 0x01, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x00, 0x90, 0x00, 0x00, 0x02, 0x01, 0x24, 0x80, + 0x00, 0x00, 0x92, 0x00, 0x00, 0x90, 0x40, 0x20, + 0x12, 0x48, 0x00, 0x12, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x41, 0x24, 0x90, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x24, + 0x80, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x40, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x20, 0x12, 0x09, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x04, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x7f, 0xff, 0xc4, 0x00, + 0x2d, 0x11, 0x00, 0x03, 0x00, 0x01, 0x02, 0x04, + 0x05, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x11, 0x21, 0x31, 0x61, + 0x10, 0x41, 0x51, 0x71, 0x20, 0x40, 0x50, 0xc1, + 0xf0, 0x30, 0x81, 0xa1, 0xd1, 0x80, 0x91, 0xb1, + 0xe1, 0x60, 0x70, 0xa0, 0xff, 0xda, 0x00, 0x08, + 0x01, 0x03, 0x01, 0x01, 0x3f, 0x10, 0xff, 0x00, + 0xd9, 0x37, 0xeb, 0xbf, 0xfc, 0x35, 0xfa, 0xfc, + 0xe1, 0x3c, 0x13, 0x84, 0xf1, 0x3f, 0x25, 0x60, + 0xe3, 0x57, 0xfd, 0xff, 0x00, 0x87, 0xc8, 0x99, + 0xf2, 0x26, 0x7c, 0x89, 0x9f, 0x22, 0x67, 0xc8, + 0x99, 0xf2, 0x26, 0x7c, 0x89, 0x9f, 0x22, 0x67, + 0xc8, 0x99, 0xf2, 0x26, 0x7c, 0x89, 0x9f, 0x22, + 0x67, 0xc8, 0x99, 0xf2, 0x26, 0x7c, 0x89, 0x9f, + 0x22, 0x67, 0xc8, 0x99, 0xf2, 0x26, 0x7c, 0x89, + 0x9f, 0x02, 0x67, 0x34, 0x3d, 0x5d, 0x69, 0xf9, + 0x7f, 0xe7, 0xfd, 0xf2, 0xc8, 0x4c, 0x8d, 0x10, + 0x9f, 0x5d, 0x1f, 0x7e, 0x0d, 0xf9, 0x79, 0x6a, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0x3a, 0xaf, 0x04, + 0xf9, 0x60, 0x00, 0x00, 0x12, 0xf1, 0xe2, 0xd1, + 0xec, 0xbd, 0xfe, 0x83, 0x94, 0x9a, 0xb1, 0x65, + 0x1a, 0xa3, 0xef, 0x0b, 0xea, 0x36, 0xd6, 0xad, + 0x09, 0x26, 0x56, 0xab, 0xd0, 0x49, 0x15, 0x66, + 0xaf, 0xda, 0x0b, 0xe2, 0x89, 0x3f, 0x3c, 0xb2, + 0x72, 0xa4, 0x9d, 0x95, 0x36, 0xf3, 0xd1, 0xde, + 0xbd, 0x51, 0xa7, 0xd0, 0xd1, 0x6f, 0xec, 0x3d, + 0x3e, 0x82, 0xa1, 0x51, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x1f, 0xd2, 0xea, 0x7e, 0x0b, 0x53, 0xc4, + 0xe0, 0x4a, 0x8d, 0xd0, 0xd4, 0xe2, 0xd4, 0x70, + 0x69, 0x7d, 0x3d, 0x1e, 0xcb, 0xdf, 0xe8, 0x25, + 0xf2, 0x88, 0xd9, 0x57, 0xa6, 0xae, 0xb6, 0xb4, + 0x31, 0x02, 0x3a, 0xde, 0xaa, 0xf5, 0x2b, 0x74, + 0xcf, 0x4d, 0x9c, 0x75, 0x1d, 0x15, 0x5f, 0xee, + 0xff, 0x00, 0x43, 0xa6, 0xd3, 0x96, 0x4e, 0xe8, + 0x7b, 0xe2, 0x15, 0x68, 0x95, 0xfd, 0xbd, 0xf3, + 0xa8, 0xdd, 0x6d, 0xbf, 0xa1, 0xf9, 0x7e, 0xc3, + 0xd0, 0xa5, 0x29, 0x4a, 0x52, 0x8d, 0x86, 0x69, + 0x82, 0xc8, 0x58, 0x91, 0x75, 0x2e, 0x54, 0x1b, + 0x88, 0x5d, 0x4a, 0x52, 0x94, 0xa5, 0x2f, 0x1b, + 0xd4, 0xc1, 0x81, 0xcc, 0x52, 0xea, 0xcd, 0x51, + 0xec, 0x2c, 0x22, 0xc5, 0x50, 0x95, 0x63, 0xca, + 0xe0, 0x5b, 0x70, 0xd1, 0x91, 0xbd, 0x50, 0xf0, + 0x23, 0x54, 0xa9, 0x75, 0x30, 0x60, 0xc7, 0x8b, + 0x47, 0xb2, 0xf7, 0xf2, 0xff, 0x00, 0x97, 0xec, + 0x3c, 0x9a, 0x14, 0xa5, 0x29, 0x4a, 0x52, 0x8a, + 0xd3, 0x88, 0x99, 0x1d, 0x04, 0x25, 0x11, 0x4a, + 0x52, 0x94, 0xa5, 0x34, 0x5e, 0x1a, 0x9f, 0x16, + 0xe8, 0x9c, 0x35, 0x53, 0x98, 0x50, 0x68, 0x82, + 0x73, 0x3c, 0x29, 0xcc, 0x8d, 0xdf, 0x03, 0xa1, + 0xd1, 0xaa, 0xf0, 0x5e, 0x43, 0x78, 0x79, 0xe3, + 0xaf, 0x8b, 0x47, 0xb2, 0xf7, 0xf0, 0xad, 0x99, + 0x99, 0x1b, 0x1b, 0x1f, 0xab, 0x93, 0xe7, 0xd8, + 0xcc, 0x3a, 0x13, 0xdb, 0x66, 0x7d, 0xcb, 0xa7, + 0xb6, 0x9d, 0x46, 0x9e, 0x4b, 0xe7, 0x2d, 0x4d, + 0x11, 0x8d, 0x03, 0x2c, 0x39, 0x75, 0xed, 0x8c, + 0x51, 0x2e, 0xf0, 0xa5, 0xec, 0xcc, 0xff, 0x00, + 0x20, 0x9d, 0x0c, 0x9b, 0x1b, 0x26, 0xe2, 0xcf, + 0xea, 0x8d, 0xbd, 0xe2, 0xcf, 0xb2, 0x2a, 0xb2, + 0x2d, 0x16, 0xef, 0x5f, 0x17, 0xe5, 0xfb, 0x70, + 0x68, 0xf5, 0x36, 0x8d, 0xa3, 0x68, 0xda, 0x36, + 0x8d, 0xa3, 0x68, 0xda, 0x36, 0x8d, 0xa3, 0x68, + 0xda, 0x36, 0x8d, 0xa3, 0x68, 0xda, 0x36, 0x8d, + 0xa3, 0x68, 0xda, 0x36, 0xb8, 0xb4, 0xd4, 0x41, + 0x04, 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, + 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, 0x40, 0x93, + 0xc4, 0xd1, 0xec, 0xbd, 0xfc, 0x2b, 0x3f, 0x41, + 0x4f, 0xb0, 0xf0, 0xcc, 0xba, 0xf3, 0x14, 0x86, + 0x09, 0x69, 0xcb, 0xad, 0x17, 0x77, 0xf8, 0x94, + 0x6c, 0xda, 0x55, 0x26, 0xa3, 0x1b, 0xa3, 0x6b, + 0x62, 0x9f, 0xe0, 0xce, 0xad, 0x13, 0x7f, 0x69, + 0xaf, 0xb1, 0x4c, 0x47, 0xa3, 0x30, 0xca, 0x1a, + 0x7a, 0xbb, 0xd3, 0x5a, 0x35, 0x7f, 0xcd, 0x9f, + 0xa2, 0x34, 0x02, 0x77, 0xf6, 0xff, 0x00, 0x43, + 0x2b, 0xd2, 0x3c, 0x47, 0xf7, 0x74, 0x61, 0x4f, + 0x57, 0x5f, 0x0f, 0xe5, 0xfb, 0x7a, 0xb6, 0x8f, + 0x65, 0xef, 0xe1, 0x4d, 0xa7, 0x51, 0xae, 0x4f, + 0xbb, 0x12, 0xd0, 0x97, 0x72, 0x51, 0x78, 0xe9, + 0xc8, 0x4d, 0x15, 0xa3, 0xe4, 0x73, 0x94, 0xe9, + 0x70, 0x34, 0x92, 0x6d, 0xe3, 0x4d, 0x87, 0xb5, + 0xaf, 0x7e, 0x3c, 0xe7, 0x1d, 0x0c, 0x8e, 0x95, + 0xe3, 0x5e, 0x43, 0xca, 0xc7, 0xb7, 0x8b, 0xf2, + 0xfd, 0xbd, 0x5b, 0x47, 0xb2, 0xf7, 0xf0, 0xa5, + 0xda, 0xd7, 0xe0, 0xbd, 0x51, 0xd7, 0xe1, 0xfe, + 0x84, 0xa9, 0x38, 0x14, 0x97, 0x59, 0xc8, 0xd1, + 0x4b, 0xe6, 0xbd, 0x08, 0x07, 0x88, 0x6f, 0xc4, + 0x9c, 0xd8, 0xd9, 0x17, 0x96, 0x96, 0x77, 0xe7, + 0x81, 0xc6, 0xb3, 0xba, 0xaf, 0x35, 0xa5, 0x45, + 0x45, 0xe5, 0x2c, 0x77, 0x2c, 0xdb, 0x09, 0x7e, + 0x75, 0xf6, 0x66, 0x37, 0xcd, 0x26, 0x39, 0xf3, + 0x04, 0x79, 0x69, 0x6b, 0xde, 0x0f, 0x52, 0x4d, + 0x77, 0x4f, 0xfc, 0xf0, 0xfe, 0x5f, 0xb7, 0x9a, + 0x69, 0x93, 0x66, 0xdb, 0xfb, 0x36, 0xdf, 0xd8, + 0x9a, 0x4a, 0xbc, 0xce, 0x8f, 0x65, 0xef, 0xe1, + 0x6b, 0x2d, 0x8d, 0xa7, 0xf7, 0x18, 0xfb, 0x08, + 0xbe, 0xcb, 0x5a, 0x12, 0xaa, 0xcc, 0x27, 0xe6, + 0x93, 0x57, 0xa2, 0x5f, 0xf0, 0x6c, 0xa6, 0xdf, + 0x7a, 0x86, 0x34, 0x4a, 0x3f, 0xaa, 0xd5, 0xfb, + 0x11, 0x04, 0xd3, 0xb5, 0x7c, 0xdf, 0x57, 0xf3, + 0x41, 0xf8, 0x93, 0x13, 0xee, 0xda, 0xfd, 0x0d, + 0x57, 0xcb, 0xdc, 0x41, 0xd0, 0xfe, 0x85, 0x4f, + 0x71, 0x8a, 0x19, 0x86, 0xa9, 0x3e, 0xa4, 0x41, + 0x11, 0x8e, 0x74, 0x9a, 0x2f, 0xf1, 0x13, 0x24, + 0xe8, 0xba, 0x2e, 0x9e, 0x1f, 0xcb, 0xf6, 0xf3, + 0x5c, 0xbe, 0xfe, 0xc3, 0x4b, 0x4b, 0x39, 0x73, + 0x5f, 0xf9, 0xfb, 0x1e, 0x54, 0x79, 0xbf, 0x34, + 0xfd, 0x1f, 0x9d, 0xed, 0xe6, 0x74, 0x7b, 0x2f, + 0x7f, 0x0b, 0xaa, 0xe5, 0xd8, 0x52, 0x72, 0xeb, + 0xf9, 0x4d, 0x10, 0xed, 0xb8, 0x25, 0x1a, 0x3c, + 0x31, 0x3a, 0x4c, 0x69, 0x6e, 0x3a, 0xab, 0x4f, + 0x61, 0xb1, 0xa6, 0xde, 0xad, 0xd8, 0xba, 0xb6, + 0xb7, 0x6c, 0x46, 0x93, 0x1a, 0x42, 0x64, 0x9a, + 0x4f, 0x0c, 0xcb, 0x6b, 0xe9, 0xf6, 0x1c, 0x15, + 0xd8, 0x36, 0xad, 0x5f, 0x76, 0x67, 0x5c, 0xfb, + 0xbb, 0xe1, 0xfc, 0xbf, 0x6f, 0x34, 0x92, 0xba, + 0x75, 0x36, 0x9f, 0xdb, 0xfd, 0x09, 0x4a, 0x12, + 0x77, 0x7f, 0xa1, 0xed, 0x95, 0xbf, 0x33, 0xa3, + 0xd9, 0x7b, 0xf9, 0x7f, 0xcb, 0xf6, 0xf5, 0x6d, + 0x1e, 0xcb, 0xdf, 0xcb, 0xfe, 0x5f, 0xb7, 0xab, + 0x68, 0xf6, 0x5e, 0xfe, 0x5f, 0xf2, 0xfd, 0xbd, + 0x5b, 0x31, 0x0a, 0x1b, 0xf3, 0x7e, 0x6f, 0xcd, + 0xf9, 0xbf, 0x37, 0xe6, 0xfc, 0xdf, 0x9b, 0xf3, + 0x7e, 0x6f, 0xcd, 0xf9, 0xbd, 0x37, 0xe6, 0xfc, + 0xdf, 0x9b, 0xf3, 0x7e, 0x6f, 0xcd, 0xf9, 0xbf, + 0x37, 0xe2, 0x81, 0x26, 0x7f, 0x80, 0x2c, 0x6e, + 0x23, 0x26, 0x4c, 0x99, 0x32, 0x64, 0xc9, 0x93, + 0x26, 0x4c, 0x99, 0x32, 0x64, 0xc9, 0x93, 0x26, + 0x4c, 0x99, 0x32, 0x3a, 0xc7, 0xea, 0xed, 0x64, + 0x84, 0x13, 0x23, 0xdd, 0x1a, 0xa1, 0xdc, 0x34, + 0xc4, 0x1f, 0x05, 0xc1, 0x10, 0x69, 0x70, 0x57, + 0x30, 0x9c, 0xc4, 0xa3, 0x10, 0xdc, 0x34, 0x42, + 0x09, 0x67, 0xd5, 0xdb, 0xc9, 0x4a, 0x29, 0xcc, + 0x6e, 0x29, 0x46, 0xf5, 0x09, 0xe0, 0xab, 0x0c, + 0x6f, 0x72, 0xaa, 0x36, 0x82, 0x6a, 0x21, 0xb5, + 0x92, 0xaa, 0x2a, 0x69, 0x0d, 0xa7, 0x51, 0x55, + 0x13, 0xc0, 0x9e, 0xe3, 0x6a, 0xe0, 0xa5, 0x35, + 0x7a, 0xbb, 0x13, 0x29, 0x4a, 0x51, 0xb3, 0x29, + 0x4a, 0x52, 0x94, 0xa5, 0x29, 0x4a, 0x52, 0x94, + 0xbc, 0x1d, 0x6b, 0xf3, 0xcd, 0xc5, 0x47, 0x5f, + 0x96, 0x77, 0xa3, 0xf5, 0x6d, 0x1c, 0x34, 0x63, + 0x51, 0xaa, 0xf2, 0x68, 0x21, 0x0e, 0x99, 0xa9, + 0x11, 0xa8, 0x91, 0x89, 0x4c, 0x9a, 0x1a, 0x0d, + 0x32, 0x24, 0x64, 0x63, 0x83, 0x9a, 0x90, 0x2e, + 0xa2, 0x39, 0x89, 0x13, 0xe1, 0xaf, 0xd5, 0xb4, + 0x14, 0x4d, 0x73, 0x1e, 0x88, 0x36, 0x61, 0x1d, + 0x48, 0xa5, 0x57, 0x52, 0xe0, 0x6a, 0xf0, 0x45, + 0x62, 0x4c, 0x15, 0x75, 0x2a, 0xac, 0x48, 0x61, + 0xb4, 0x5e, 0x45, 0x59, 0x22, 0xa2, 0x1f, 0x32, + 0xa8, 0x45, 0xe1, 0xaf, 0xd5, 0x9a, 0xaa, 0x0d, + 0x04, 0xe8, 0x12, 0x4e, 0x44, 0x6e, 0x44, 0xe8, + 0x27, 0x41, 0x3a, 0x09, 0xd0, 0x4e, 0x82, 0x74, + 0x13, 0xa0, 0x9d, 0x04, 0xe8, 0x27, 0x41, 0x8e, + 0x09, 0xd0, 0x4e, 0x82, 0x74, 0x13, 0xa0, 0x9d, + 0x04, 0xe8, 0x27, 0x40, 0xe5, 0x97, 0xfc, 0x1e, + 0x7d, 0x25, 0x96, 0x59, 0x65, 0x96, 0x59, 0x65, + 0x96, 0x59, 0x65, 0x96, 0x59, 0x65, 0x96, 0x59, + 0x65, 0xfa, 0xb8, 0x7a, 0x10, 0x84, 0x21, 0x08, + 0x42, 0x09, 0x25, 0xa3, 0x81, 0x53, 0x8c, 0x84, + 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0xaf, 0xd5, + 0x9e, 0x9f, 0x45, 0xe8, 0x3a, 0x26, 0x26, 0x66, + 0x3b, 0xc1, 0x98, 0xa1, 0xab, 0xe8, 0x6b, 0xf5, + 0x67, 0xa7, 0x0a, 0x52, 0x94, 0xa5, 0x28, 0x99, + 0x68, 0x57, 0xa9, 0x43, 0x66, 0x59, 0x83, 0x51, + 0xba, 0xe9, 0x4a, 0x52, 0x94, 0xa5, 0x35, 0x5f, + 0x57, 0x68, 0xc9, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x12, 0x9f, 0xc5, 0x28, 0x1d, 0x87, + 0x61, 0xd8, 0x76, 0x1d, 0x87, 0x61, 0xd8, 0x76, + 0x1d, 0x87, 0x61, 0xd8, 0x76, 0x1d, 0x87, 0x61, + 0xd8, 0x76, 0x1d, 0x87, 0x61, 0xd8, 0x76, 0x1d, + 0x82, 0x5e, 0x38, 0xbe, 0x9f, 0x2b, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x62, 0x75, 0x5e, 0x11, 0xc1, + 0x45, 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, + 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, + 0x30, 0xfc, 0x5a, 0xb8, 0x25, 0x47, 0x19, 0x44, + 0x64, 0x64, 0x72, 0x91, 0x91, 0x89, 0x1e, 0x0e, + 0xe1, 0xa6, 0x9c, 0x23, 0x26, 0x08, 0xc7, 0xd0, + 0x46, 0x46, 0x46, 0x4c, 0x52, 0x3e, 0x0b, 0x83, + 0xd0, 0x84, 0x3b, 0xc8, 0xc8, 0x46, 0x42, 0x32, + 0x09, 0x57, 0x0d, 0xac, 0x84, 0x63, 0x5d, 0x05, + 0x4e, 0x31, 0xa2, 0x11, 0x90, 0x70, 0xe2, 0x21, + 0x38, 0x9a, 0xc9, 0x08, 0x42, 0x10, 0x84, 0x15, + 0x11, 0x91, 0x91, 0x8e, 0x1c, 0x44, 0x64, 0x64, + 0x21, 0x08, 0x42, 0x10, 0x9e, 0x2d, 0x5c, 0x16, + 0x8c, 0x9c, 0xce, 0x82, 0xc6, 0x87, 0xa3, 0x1b, + 0xcc, 0x2e, 0x5d, 0x35, 0x0e, 0x45, 0x44, 0xed, + 0x62, 0x79, 0x13, 0xa8, 0xe6, 0xcb, 0xa1, 0x84, + 0x99, 0x75, 0x62, 0xe4, 0x75, 0x1e, 0x53, 0xf0, + 0x3d, 0x38, 0x2d, 0x46, 0x9d, 0x34, 0xc0, 0xe5, + 0x4b, 0x94, 0x68, 0x9c, 0x2e, 0x60, 0x9d, 0x8b, + 0x81, 0x52, 0xd0, 0xb2, 0x0d, 0xc0, 0xf9, 0x8b, + 0x91, 0x6a, 0x74, 0x6f, 0x30, 0x7c, 0x90, 0xf4, + 0x63, 0x71, 0xbf, 0x0a, 0xde, 0x4a, 0x52, 0x94, + 0xa5, 0x28, 0xa4, 0x39, 0xd1, 0x65, 0x0d, 0xe1, + 0x9c, 0xcc, 0x96, 0x4b, 0x87, 0x4a, 0x52, 0x94, + 0xa5, 0x29, 0x7c, 0x58, 0xb2, 0x89, 0xc1, 0xb3, + 0xd4, 0xa9, 0x29, 0x45, 0x0d, 0xd1, 0xb3, 0xc5, + 0x1b, 0xba, 0x8d, 0xd1, 0x46, 0x85, 0x6a, 0x28, + 0x28, 0x50, 0x99, 0x14, 0x56, 0x94, 0xa1, 0xb3, + 0xd4, 0xa2, 0xcb, 0x9c, 0x1e, 0x57, 0x1a, 0x13, + 0x6b, 0x42, 0x8a, 0x2b, 0xd0, 0xad, 0x4a, 0xd0, + 0x4e, 0x70, 0xad, 0x0a, 0xf4, 0x16, 0x0e, 0x95, + 0x69, 0x59, 0x52, 0x15, 0x94, 0x56, 0xa3, 0x6d, + 0xeb, 0xc1, 0x31, 0x78, 0x60, 0xca, 0x52, 0x94, + 0xa5, 0x29, 0x4a, 0xe0, 0xa3, 0x55, 0x32, 0x79, + 0x1a, 0x49, 0x4a, 0x52, 0x94, 0xa5, 0x28, 0xb2, + 0xe7, 0x89, 0xa4, 0xf5, 0x20, 0x82, 0x08, 0x20, + 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, + 0x20, 0x82, 0x08, 0x20, 0x48, 0xb4, 0xe2, 0xd1, + 0xea, 0x6d, 0x1b, 0x46, 0xd1, 0xb4, 0x6d, 0x1b, + 0x46, 0xd1, 0xb4, 0x6d, 0x1b, 0x46, 0xd1, 0xb4, + 0x6d, 0x1b, 0x46, 0xd1, 0xb4, 0x6d, 0x1b, 0x46, + 0xd1, 0xb4, 0x6d, 0x71, 0x68, 0xf5, 0xf2, 0xd5, + 0x55, 0x55, 0x55, 0x55, 0x52, 0x45, 0xa7, 0xf3, + 0x52, 0x3a, 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, + 0x14, 0x51, 0x45, 0x14, 0x51, 0x45, 0x14, 0x51, + 0x45, 0x14, 0x57, 0x0f, 0xd5, 0xf5, 0x78, 0x15, + 0x2a, 0xc6, 0xa1, 0x18, 0xd3, 0x4e, 0x70, 0x49, + 0x2b, 0x63, 0x82, 0x31, 0x26, 0xc8, 0xc8, 0x24, + 0xd8, 0xd1, 0x19, 0x1f, 0x81, 0x7a, 0xbe, 0xa3, + 0x06, 0x0c, 0x70, 0x4c, 0x25, 0xc3, 0x9b, 0x34, + 0x23, 0x11, 0x44, 0xeb, 0x2e, 0xa3, 0x99, 0x70, + 0x8b, 0x8c, 0x15, 0xe4, 0xe6, 0x85, 0x9d, 0x4b, + 0x96, 0x8c, 0x18, 0x30, 0x63, 0xd5, 0xf1, 0x65, + 0x29, 0x44, 0xcb, 0x43, 0x2c, 0x96, 0x56, 0xa6, + 0x45, 0xe4, 0x27, 0x05, 0x1a, 0x1a, 0xa9, 0x42, + 0x82, 0x96, 0x78, 0x1b, 0x3e, 0x0a, 0x52, 0x8b, + 0x2e, 0x7a, 0xbb, 0x49, 0xea, 0x6d, 0x1b, 0x46, + 0xd1, 0xb4, 0x6d, 0x1b, 0x46, 0xd1, 0xb4, 0x6d, + 0x1b, 0x46, 0xd1, 0xb4, 0x6d, 0x1b, 0x46, 0xd1, + 0xb4, 0x6d, 0x1b, 0x46, 0xd1, 0xb4, 0x6d, 0x09, + 0x25, 0xa7, 0xff, 0x00, 0x03, 0xbf, 0xff, 0xc4, + 0x00, 0x2e, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, + 0x05, 0x03, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x21, 0x61, + 0x31, 0x91, 0xe1, 0xf0, 0x41, 0x51, 0x71, 0xa1, + 0xd1, 0x81, 0xc1, 0xf1, 0x10, 0x20, 0x30, 0x50, + 0xb1, 0x40, 0x80, 0x60, 0x70, 0xa0, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x02, 0x01, 0x01, 0x3f, 0x10, + 0xff, 0x00, 0xe9, 0x31, 0xf9, 0xd7, 0xfe, 0x35, + 0x7f, 0xe3, 0x57, 0xf8, 0x92, 0x9c, 0x09, 0x03, + 0x8c, 0xbf, 0xb0, 0x59, 0x66, 0x8b, 0x2c, 0xd1, + 0x65, 0x9a, 0x2c, 0xb3, 0x45, 0x96, 0x68, 0xb2, + 0xcd, 0x16, 0x59, 0xa2, 0xcb, 0x34, 0x59, 0x66, + 0x8b, 0x2c, 0xd1, 0x65, 0x9a, 0x2c, 0xb3, 0x45, + 0x96, 0x68, 0xb2, 0xcd, 0x16, 0x59, 0xa2, 0xcb, + 0x34, 0x59, 0x66, 0x8b, 0x2c, 0xd1, 0x65, 0x9a, + 0x36, 0x9a, 0x31, 0x2d, 0x6f, 0x9f, 0xed, 0xd8, + 0x91, 0x29, 0x61, 0xd7, 0x4f, 0xf3, 0x3c, 0x2e, + 0x53, 0x27, 0x13, 0x0c, 0x57, 0x41, 0xb8, 0x11, + 0x64, 0x94, 0xe6, 0xce, 0x8e, 0x5a, 0x9d, 0x1c, + 0xb5, 0x3a, 0x39, 0x6a, 0x74, 0x72, 0xd4, 0xe8, + 0xe5, 0xa9, 0xd1, 0xcb, 0x53, 0xa3, 0x96, 0xa7, + 0x47, 0x2d, 0x4e, 0x8e, 0x5a, 0x9d, 0x1c, 0xb5, + 0x3a, 0x39, 0x6a, 0x74, 0x72, 0xd4, 0xe8, 0xe5, + 0xa9, 0xd1, 0xcb, 0x53, 0xa3, 0x96, 0xa7, 0x47, + 0x2d, 0x4e, 0x8e, 0x5a, 0x9d, 0x1c, 0xb5, 0x3a, + 0x39, 0x6a, 0x74, 0x72, 0xd4, 0x49, 0xd0, 0x9a, + 0x12, 0x3e, 0x96, 0x0e, 0x97, 0xc8, 0x97, 0xcb, + 0x42, 0x5f, 0x2d, 0x09, 0x7c, 0xb4, 0x25, 0xf2, + 0xd0, 0x97, 0xcb, 0x42, 0x5f, 0x2d, 0x09, 0x7c, + 0xb4, 0x25, 0xf2, 0xd0, 0x97, 0xcb, 0x42, 0x5f, + 0x2d, 0x09, 0x7c, 0xb4, 0x25, 0xf2, 0xd0, 0x97, + 0xcb, 0x42, 0x5f, 0x2d, 0x09, 0x7c, 0xb4, 0x25, + 0xf2, 0xd0, 0x97, 0xcb, 0x42, 0x5f, 0x2d, 0x09, + 0x7c, 0xb4, 0x25, 0xf2, 0xd0, 0x97, 0xcb, 0x42, + 0x19, 0x4b, 0xee, 0xc5, 0xea, 0xfd, 0xbf, 0x02, + 0xd9, 0x84, 0xaa, 0x31, 0x3b, 0x07, 0x03, 0x09, + 0x68, 0x82, 0xa9, 0x13, 0xc1, 0x3e, 0x42, 0xc5, + 0x38, 0xe1, 0xa5, 0xcd, 0xae, 0x18, 0x0c, 0xbb, + 0x3a, 0x1e, 0x69, 0xf0, 0x31, 0xce, 0x5c, 0xfb, + 0x4d, 0x69, 0x18, 0x2c, 0xd8, 0xd6, 0x36, 0xd4, + 0x50, 0xd2, 0x53, 0xc4, 0xe1, 0xcb, 0x93, 0x31, + 0xfc, 0x0b, 0x5e, 0xde, 0xe7, 0x60, 0xff, 0x00, + 0x9f, 0x80, 0x04, 0x0a, 0xa2, 0x08, 0x8c, 0xdc, + 0x40, 0x9c, 0xa0, 0xa8, 0x28, 0xd0, 0x9d, 0x48, + 0x15, 0x14, 0x12, 0xd2, 0x95, 0x04, 0xf5, 0x29, + 0x50, 0x8d, 0xd1, 0x51, 0xb2, 0x70, 0xfe, 0xf0, + 0x12, 0x13, 0xd0, 0x78, 0x0f, 0x65, 0xf3, 0x7f, + 0x51, 0x12, 0x0a, 0xdf, 0x41, 0xe1, 0x15, 0x5f, + 0x70, 0x24, 0x88, 0xbd, 0xba, 0x8b, 0x08, 0xa8, + 0xd1, 0x24, 0xe3, 0x91, 0x1d, 0xa6, 0x65, 0x4f, + 0xd4, 0xc7, 0x72, 0x28, 0x94, 0xa7, 0x9d, 0xbe, + 0xd0, 0x63, 0x24, 0xc5, 0x7d, 0xd8, 0xbd, 0x5f, + 0xb7, 0xe0, 0x67, 0x12, 0x74, 0x9e, 0xa4, 0xd9, + 0x87, 0x02, 0x50, 0x9d, 0x04, 0xb2, 0x68, 0x25, + 0x83, 0x8e, 0x08, 0x84, 0x0d, 0x0d, 0x4b, 0xe6, + 0xa5, 0x43, 0xdf, 0xb9, 0xcc, 0x04, 0x65, 0x51, + 0xfd, 0x15, 0x15, 0x4c, 0x55, 0xd1, 0xbf, 0x6a, + 0x7a, 0x0a, 0x48, 0xdc, 0x60, 0xdc, 0xb8, 0xf4, + 0xe2, 0x8a, 0x55, 0x51, 0x08, 0x91, 0x25, 0xf8, + 0x3b, 0x5f, 0x73, 0xb0, 0x7f, 0xcf, 0xc1, 0xfe, + 0xc4, 0xc7, 0xf4, 0x49, 0x45, 0xe3, 0x2f, 0x03, + 0x80, 0xab, 0xa6, 0x0b, 0x06, 0x33, 0x0a, 0x97, + 0xee, 0x3a, 0x46, 0x08, 0x78, 0x78, 0x69, 0x6a, + 0x40, 0xac, 0x2d, 0xbf, 0xe8, 0x86, 0x1c, 0x0e, + 0x7d, 0x30, 0xfe, 0x8e, 0x6e, 0x5f, 0xdf, 0xfb, + 0x4a, 0xf4, 0x0f, 0x01, 0xd7, 0xae, 0xff, 0x00, + 0xa4, 0xa2, 0x50, 0x8c, 0xe8, 0x28, 0xb8, 0x10, + 0x8a, 0xaa, 0x88, 0x13, 0xac, 0xf1, 0x47, 0xeb, + 0x04, 0x33, 0xb8, 0x53, 0xd8, 0x79, 0xe1, 0x53, + 0x74, 0x99, 0x17, 0x48, 0xe2, 0x10, 0xc5, 0xb4, + 0xda, 0xad, 0xf1, 0x95, 0xc0, 0x79, 0x71, 0xc6, + 0x1c, 0x12, 0xcd, 0xb5, 0xe8, 0x22, 0x86, 0x29, + 0x89, 0x8c, 0xb1, 0x85, 0x03, 0x87, 0x49, 0x2e, + 0xc7, 0x4d, 0xd3, 0x64, 0x3a, 0x91, 0x65, 0x6a, + 0x89, 0xbb, 0x16, 0x09, 0xc1, 0x28, 0x94, 0x4a, + 0xfb, 0xb1, 0x7a, 0xbf, 0x6f, 0xf3, 0xf6, 0xbe, + 0xe3, 0x1e, 0x9c, 0x50, 0xcd, 0xde, 0x22, 0xfb, + 0xff, 0x00, 0x68, 0x47, 0x47, 0x89, 0x4d, 0x88, + 0x94, 0x7a, 0x18, 0x0e, 0x18, 0xe2, 0x8b, 0x02, + 0x46, 0xd3, 0x71, 0x86, 0x20, 0xd2, 0xbb, 0xa2, + 0x2a, 0x08, 0xea, 0x76, 0xb7, 0xe0, 0xfe, 0xb3, + 0x3f, 0x1c, 0x07, 0x80, 0xcd, 0x77, 0xcd, 0xfd, + 0x74, 0xa8, 0xf8, 0x28, 0x1e, 0x37, 0xc5, 0xc1, + 0xe0, 0x50, 0x51, 0x4c, 0x17, 0x01, 0x32, 0xfa, + 0x8a, 0x78, 0x9a, 0x58, 0x4f, 0x0e, 0x83, 0x6a, + 0xfc, 0x5c, 0x89, 0x4e, 0xaa, 0x12, 0xe8, 0x92, + 0x39, 0x45, 0x09, 0xcd, 0x0c, 0x68, 0xa1, 0x4e, + 0x31, 0xc4, 0x4a, 0x6c, 0xb8, 0x23, 0xe4, 0x82, + 0x54, 0x49, 0x72, 0xa0, 0xc4, 0xd0, 0xa7, 0x18, + 0xe3, 0xd4, 0x6d, 0x77, 0x4a, 0xaa, 0x23, 0x80, + 0x93, 0x14, 0x54, 0x51, 0xe8, 0x24, 0xb8, 0x12, + 0x73, 0x3c, 0x47, 0x1b, 0x52, 0xa1, 0x46, 0x2e, + 0xef, 0xeb, 0xbb, 0x56, 0x23, 0xfb, 0xb1, 0x7a, + 0xbf, 0x6f, 0xb5, 0x89, 0x24, 0xa1, 0x21, 0x28, + 0xa3, 0x8a, 0x54, 0xea, 0x50, 0x65, 0xef, 0x21, + 0xcc, 0x43, 0x49, 0xf4, 0x23, 0x87, 0xc3, 0x1a, + 0xe3, 0xcb, 0x21, 0x3e, 0x25, 0xe0, 0xf5, 0xe5, + 0x38, 0x15, 0x1d, 0x55, 0xbb, 0x2d, 0xf2, 0x10, + 0xc4, 0xb5, 0x2e, 0xea, 0xd6, 0x39, 0x0c, 0x85, + 0x5c, 0xc5, 0x1c, 0x54, 0x4f, 0xf6, 0x7d, 0x19, + 0x88, 0xe3, 0x49, 0xf6, 0x14, 0x34, 0xa5, 0x13, + 0xce, 0xae, 0x39, 0x8a, 0x29, 0x34, 0xe2, 0x66, + 0xee, 0x39, 0xf5, 0x21, 0x92, 0x9e, 0x27, 0x3c, + 0x16, 0x1d, 0xdf, 0xdd, 0xda, 0xfb, 0xfd, 0x1f, + 0xcc, 0x8c, 0xdf, 0x6f, 0xc9, 0xbe, 0xdf, 0x93, + 0x7d, 0xbf, 0x26, 0xfb, 0x7e, 0x4d, 0xf6, 0xfc, + 0x9b, 0xed, 0xf9, 0x37, 0xdb, 0xf2, 0x6f, 0xb7, + 0xe4, 0xdf, 0x6f, 0xc9, 0xbe, 0xdf, 0x93, 0x7d, + 0xbf, 0x26, 0xfb, 0x7e, 0x4d, 0xf6, 0xfc, 0x9b, + 0xed, 0xf9, 0x37, 0xdb, 0xf2, 0x6f, 0xb7, 0xe4, + 0xdf, 0x6f, 0xc9, 0xbe, 0xdf, 0x93, 0x7d, 0xbf, + 0x26, 0xfb, 0x7e, 0x46, 0x32, 0xbf, 0xb7, 0xfd, + 0xfa, 0xe1, 0x5a, 0xf3, 0x47, 0xca, 0x2f, 0x07, + 0xca, 0x2f, 0x07, 0xca, 0x2f, 0x07, 0xca, 0x2f, + 0x07, 0xca, 0x2f, 0x07, 0xca, 0x2f, 0x07, 0xca, + 0x2f, 0x07, 0xca, 0x2f, 0x07, 0xca, 0x2f, 0x07, + 0xca, 0x2f, 0x07, 0xca, 0x2f, 0x07, 0xca, 0x2f, + 0x07, 0xca, 0x2f, 0x07, 0xca, 0x2f, 0x07, 0xca, + 0x2f, 0x07, 0xca, 0x2f, 0x07, 0xca, 0x2f, 0x07, + 0xca, 0x2f, 0x07, 0xca, 0x2f, 0x07, 0xca, 0x2f, + 0x07, 0xca, 0x2f, 0x03, 0x18, 0x65, 0xf3, 0x7f, + 0x76, 0x2f, 0x57, 0xed, 0xf6, 0xbc, 0x3a, 0xa3, + 0x4e, 0xd2, 0x2a, 0x94, 0x3e, 0x5c, 0x3a, 0x8d, + 0x39, 0x26, 0x6f, 0x1c, 0x5a, 0xe1, 0x03, 0x21, + 0x4a, 0xa7, 0xfe, 0xb8, 0xec, 0x21, 0x66, 0xe1, + 0xb4, 0x81, 0x2b, 0x57, 0xa8, 0x39, 0x9e, 0xb3, + 0xb8, 0x11, 0x46, 0xb2, 0xd2, 0x63, 0x72, 0xa7, + 0xb9, 0x09, 0xd3, 0xa1, 0xab, 0x15, 0xa6, 0x13, + 0x8e, 0x1c, 0x70, 0xfe, 0x50, 0x4a, 0x25, 0x47, + 0x3c, 0x22, 0xd0, 0x23, 0x54, 0xe4, 0x73, 0x4f, + 0xc9, 0xc4, 0x22, 0x39, 0x2f, 0x22, 0xbc, 0x86, + 0x49, 0xb9, 0x2e, 0x18, 0x28, 0x15, 0xe5, 0x39, + 0x63, 0x1e, 0xbf, 0x6f, 0x6b, 0xef, 0xfb, 0x6c, + 0x5e, 0xaf, 0xdb, 0xed, 0x69, 0x24, 0x3c, 0x0c, + 0x0c, 0x5d, 0x14, 0x0a, 0x89, 0x36, 0xb9, 0xa4, + 0x36, 0xce, 0x94, 0xf3, 0xe2, 0x35, 0x0e, 0x8d, + 0xae, 0x31, 0x53, 0x83, 0x2e, 0x8a, 0xe6, 0x27, + 0x1b, 0x42, 0x9c, 0x69, 0x8f, 0x5e, 0x64, 0x51, + 0x49, 0x5b, 0xeb, 0x2d, 0x15, 0x3c, 0xf8, 0x94, + 0xd0, 0xc2, 0x72, 0x94, 0x2a, 0x3e, 0x7d, 0x45, + 0x70, 0xa6, 0xaf, 0x5f, 0xbb, 0xb5, 0xf7, 0xfd, + 0xb6, 0x2f, 0x57, 0xed, 0xf6, 0xb9, 0xb8, 0x42, + 0x3d, 0x50, 0x95, 0x3a, 0x5a, 0xab, 0xd5, 0x2c, + 0x7d, 0x58, 0xf8, 0xda, 0xae, 0xab, 0xd6, 0xb8, + 0xab, 0x92, 0xd7, 0x29, 0xc1, 0xfc, 0x7a, 0x95, + 0xa4, 0x7e, 0xb5, 0xe9, 0x38, 0xfa, 0x12, 0xe9, + 0x1e, 0xf1, 0xb0, 0xb7, 0x59, 0x96, 0x0b, 0x9c, + 0xc0, 0x92, 0x35, 0x46, 0x92, 0x9e, 0x18, 0xaa, + 0x88, 0x35, 0x51, 0x86, 0x26, 0x8e, 0x26, 0x1f, + 0x3a, 0x09, 0x24, 0x94, 0x37, 0x5e, 0x94, 0x21, + 0x6b, 0x2d, 0x96, 0x3c, 0xa5, 0x27, 0xfd, 0x43, + 0x8e, 0x60, 0xb2, 0x81, 0x3c, 0xad, 0x95, 0x13, + 0x78, 0x3b, 0x48, 0xa9, 0xb6, 0x98, 0xa6, 0x0d, + 0x7f, 0x63, 0xed, 0xed, 0x7d, 0xff, 0x00, 0xd4, + 0xc2, 0x12, 0x4b, 0x8c, 0x8b, 0x8c, 0x86, 0xcd, + 0x0d, 0x47, 0xfa, 0x71, 0x7a, 0xbf, 0x6f, 0xb5, + 0x52, 0xd1, 0x06, 0x53, 0xc6, 0x25, 0x31, 0x42, + 0xab, 0x7a, 0x91, 0x06, 0x37, 0x26, 0x98, 0x69, + 0x8e, 0x4d, 0xa8, 0x24, 0xf1, 0x86, 0xd1, 0x98, + 0x81, 0x79, 0xac, 0xd3, 0x94, 0xa7, 0xd8, 0x43, + 0x2d, 0x03, 0x42, 0xc1, 0x7b, 0xfb, 0x8e, 0x4e, + 0x36, 0x28, 0x9c, 0xc2, 0xe4, 0xbd, 0xdf, 0x16, + 0x23, 0xda, 0x6b, 0xe8, 0x49, 0x3c, 0x73, 0x81, + 0x18, 0x21, 0xa4, 0xec, 0x37, 0x18, 0xf9, 0xa8, + 0x3f, 0x60, 0x86, 0x8a, 0xaf, 0x06, 0xd2, 0xe0, + 0x4c, 0x49, 0x65, 0x29, 0xe7, 0x38, 0xbe, 0x98, + 0xb1, 0x59, 0xf3, 0xcd, 0xf3, 0x7c, 0x5f, 0xdb, + 0xda, 0xfb, 0xff, 0x00, 0xa9, 0x31, 0xf4, 0xf7, + 0x13, 0x19, 0x45, 0x0a, 0x70, 0xdb, 0xf9, 0xd2, + 0xa2, 0xa6, 0x95, 0x48, 0x9b, 0xcf, 0x2a, 0xd2, + 0xd8, 0xd4, 0x4c, 0xaf, 0x77, 0xfe, 0x9c, 0x5e, + 0xaf, 0xdb, 0xed, 0x4b, 0x08, 0x7d, 0x54, 0x8f, + 0x7c, 0x4b, 0x0e, 0x94, 0x69, 0x93, 0x8d, 0x4a, + 0x79, 0x21, 0x11, 0x09, 0xb5, 0x85, 0x87, 0x0d, + 0x24, 0xdf, 0x24, 0x27, 0x80, 0xd5, 0xd4, 0x89, + 0x49, 0xa4, 0x0f, 0x1a, 0x21, 0xbc, 0x14, 0xec, + 0x92, 0x1e, 0x34, 0x93, 0x78, 0xc2, 0x1b, 0x1a, + 0x65, 0x54, 0x53, 0x6a, 0x10, 0xdc, 0xe1, 0xc7, + 0x9f, 0x52, 0x52, 0x11, 0x35, 0x10, 0xc2, 0x5f, + 0x1c, 0x16, 0x2f, 0x16, 0x48, 0x24, 0x74, 0x28, + 0xfb, 0x7b, 0x5f, 0x7f, 0xf5, 0x33, 0x85, 0xb4, + 0xe3, 0x0b, 0x4f, 0x93, 0x87, 0x3c, 0x97, 0x91, + 0xb5, 0x19, 0xe5, 0x59, 0x79, 0x14, 0x57, 0x09, + 0x28, 0xaf, 0xfa, 0x71, 0x7a, 0xbf, 0x6f, 0xf3, + 0xf6, 0xbe, 0xff, 0x00, 0xb6, 0xc5, 0xea, 0xfd, + 0xbf, 0xcf, 0xda, 0xfb, 0xfe, 0xdb, 0x17, 0xab, + 0xf6, 0xff, 0x00, 0x3f, 0x6b, 0xef, 0xfb, 0x68, + 0x1f, 0x4e, 0x5f, 0xb1, 0x68, 0x5a, 0x16, 0x85, + 0xa1, 0x68, 0x5a, 0x16, 0x85, 0xa1, 0x68, 0x5a, + 0x16, 0x85, 0xa1, 0x68, 0x5a, 0x16, 0x85, 0xa1, + 0x68, 0x5a, 0x16, 0x85, 0xa1, 0x68, 0x5a, 0x0e, + 0xb9, 0x92, 0x5e, 0xff, 0x00, 0xf0, 0x0b, 0x53, + 0xe1, 0x2e, 0xe5, 0xd1, 0x70, 0x5c, 0x17, 0x05, + 0xc1, 0x70, 0x5c, 0x17, 0x05, 0xc1, 0x70, 0x5c, + 0x17, 0x05, 0xc1, 0x70, 0x5c, 0x17, 0x05, 0xc1, + 0x70, 0x5c, 0x17, 0x05, 0xc1, 0x08, 0xe9, 0x4f, + 0xf6, 0xf9, 0xa3, 0xfa, 0xf1, 0x25, 0x9a, 0x77, + 0x10, 0xea, 0x09, 0xc5, 0x22, 0x96, 0x5d, 0x12, + 0x99, 0x14, 0x0a, 0x2d, 0xa9, 0xdb, 0x11, 0x5b, + 0x4b, 0x7d, 0xc4, 0x39, 0xc8, 0xd6, 0x23, 0xa9, + 0xa5, 0x71, 0x22, 0xd0, 0xe9, 0x4c, 0x58, 0x2f, + 0x13, 0xc9, 0x8a, 0x94, 0xe0, 0xaf, 0x1a, 0x9e, + 0x03, 0x51, 0x50, 0x89, 0x2e, 0x84, 0xb2, 0xf8, + 0xa5, 0xd9, 0x13, 0x8a, 0x66, 0x64, 0x25, 0x10, + 0xa7, 0x02, 0x8b, 0x80, 0x93, 0x8e, 0x64, 0xd4, + 0xa7, 0xeb, 0xc6, 0xdb, 0xfe, 0xdf, 0x34, 0x7f, + 0x5d, 0xe0, 0x41, 0xc9, 0xdc, 0x42, 0x59, 0x9e, + 0x11, 0x51, 0x50, 0xe2, 0x74, 0xc8, 0x49, 0x12, + 0xdc, 0x70, 0x78, 0xa1, 0x04, 0xa4, 0xa7, 0x0e, + 0x23, 0x24, 0x48, 0xd3, 0xc1, 0x28, 0xef, 0xc8, + 0x72, 0x90, 0x8b, 0x88, 0xdc, 0xd6, 0x58, 0xba, + 0xdb, 0xe6, 0x9f, 0xa9, 0x15, 0x3e, 0x2a, 0x3a, + 0x23, 0x86, 0xe2, 0x30, 0xe3, 0x31, 0x18, 0x09, + 0x8d, 0xa2, 0x6c, 0xe7, 0x41, 0x0a, 0xd5, 0x55, + 0x3e, 0xc8, 0x75, 0x29, 0x23, 0x7c, 0xc8, 0xc1, + 0x65, 0x8c, 0xfb, 0x0e, 0x6d, 0x91, 0x8f, 0x1a, + 0x27, 0x71, 0xc7, 0xe0, 0xfa, 0xf3, 0xf5, 0x7f, + 0xde, 0xd1, 0x62, 0xcb, 0xc5, 0xe2, 0xf1, 0x78, + 0xbc, 0x5e, 0x2f, 0x17, 0x8b, 0xc5, 0xe2, 0xf1, + 0x78, 0xbc, 0x5e, 0x2f, 0x17, 0x8b, 0xc5, 0xe2, + 0xf1, 0x78, 0xbd, 0xf5, 0x62, 0x98, 0xd5, 0x27, + 0x90, 0x9e, 0x42, 0x79, 0x09, 0xe4, 0x21, 0x53, + 0x82, 0x5c, 0x12, 0xa1, 0x3c, 0x84, 0xf2, 0x13, + 0xc8, 0x4f, 0x21, 0x3c, 0x84, 0xf2, 0x13, 0xc8, + 0x4f, 0x21, 0x3c, 0x84, 0xf2, 0x13, 0xc8, 0x4f, + 0x21, 0x3c, 0x84, 0xf2, 0x13, 0xc8, 0x55, 0xc0, + 0x48, 0x54, 0x25, 0xcf, 0x8f, 0xfb, 0xac, 0x49, + 0x34, 0xe5, 0xff, 0x00, 0x9b, 0xff, 0x00, 0xff, + 0x00, 0xef, 0x9b, 0xe7, 0x97, 0xed, 0x92, 0x76, + 0x71, 0x22, 0x2c, 0x22, 0x0a, 0xfe, 0x43, 0xa1, + 0x27, 0xcd, 0x71, 0x18, 0x9d, 0x0d, 0xb8, 0x1a, + 0xf6, 0x9c, 0x73, 0xe8, 0x23, 0x15, 0x12, 0xab, + 0xd0, 0x4d, 0x8e, 0x62, 0x58, 0xe2, 0x34, 0xd7, + 0x70, 0x9c, 0x3d, 0x04, 0xc6, 0xc0, 0x5d, 0x83, + 0x8c, 0xea, 0x4c, 0xee, 0x15, 0x48, 0x12, 0x21, + 0xb8, 0xa9, 0x57, 0x1c, 0xd4, 0x2e, 0x49, 0x37, + 0x2c, 0xba, 0x15, 0x75, 0xe2, 0x18, 0xb1, 0x09, + 0xc5, 0x31, 0x25, 0x2b, 0x70, 0x12, 0xa2, 0x5d, + 0x14, 0xd4, 0x8a, 0x73, 0xab, 0xe1, 0xee, 0x27, + 0x21, 0xd1, 0xc5, 0x07, 0xc5, 0x8a, 0x89, 0x44, + 0xa7, 0xc0, 0x40, 0xdd, 0x3f, 0x6c, 0xf0, 0xed, + 0xe2, 0xbe, 0x96, 0xd6, 0x43, 0xe6, 0x55, 0x59, + 0xe6, 0x1f, 0x1c, 0x15, 0x5f, 0xa8, 0xdd, 0xa9, + 0xe0, 0x8a, 0x61, 0xea, 0x42, 0x94, 0x26, 0x43, + 0x5d, 0xb2, 0x29, 0x96, 0xe6, 0x3d, 0x16, 0x23, + 0xaa, 0x2a, 0xdc, 0x89, 0x8d, 0xe5, 0x42, 0x23, + 0x6a, 0x74, 0x8a, 0x75, 0x48, 0x74, 0x37, 0x82, + 0xad, 0x86, 0xf4, 0x67, 0x6d, 0x34, 0xe5, 0xa7, + 0x51, 0x56, 0x54, 0x69, 0xc0, 0xf2, 0x64, 0x44, + 0x47, 0xb8, 0xc8, 0x97, 0x2a, 0x8a, 0x98, 0xdf, + 0xa0, 0xb9, 0xfa, 0x34, 0xd6, 0x85, 0x26, 0x4e, + 0x62, 0x27, 0x11, 0x2d, 0xf3, 0x82, 0xa8, 0x91, + 0x33, 0xc1, 0xbc, 0x26, 0xa8, 0x66, 0x45, 0x5b, + 0x9a, 0xe3, 0x02, 0x9e, 0x6e, 0x94, 0x3e, 0xa2, + 0x53, 0x69, 0xa5, 0x12, 0x32, 0xb7, 0xed, 0x94, + 0xf7, 0xe2, 0x63, 0x82, 0xe8, 0xbe, 0xc8, 0x97, + 0x74, 0xfa, 0x0d, 0x4c, 0xb6, 0xec, 0x5f, 0x64, + 0x5f, 0x64, 0x5f, 0x64, 0x5f, 0x64, 0x5f, 0x64, + 0x5f, 0x64, 0x5f, 0x64, 0x5f, 0x64, 0x5f, 0x64, + 0x5f, 0x64, 0x3c, 0xf9, 0x1d, 0x0b, 0xec, 0x8b, + 0xec, 0x8b, 0xec, 0x8b, 0xec, 0x8b, 0xec, 0x8b, + 0xec, 0x89, 0x78, 0xb2, 0x24, 0x71, 0x1c, 0x3f, + 0xe1, 0xd7, 0x42, 0x61, 0x33, 0x72, 0xc3, 0xbf, + 0x92, 0xc3, 0xbf, 0x92, 0xc3, 0xbf, 0x92, 0xc3, + 0xbf, 0x92, 0xc3, 0xbf, 0x92, 0xc3, 0xbf, 0x92, + 0xc3, 0xbf, 0x92, 0xc3, 0xbf, 0x92, 0xc3, 0xbf, + 0x92, 0xc3, 0xbf, 0x92, 0xc3, 0xbf, 0x92, 0xc3, + 0xbf, 0x92, 0xc3, 0xbf, 0x92, 0xc3, 0xbf, 0x92, + 0xc3, 0xbf, 0x92, 0xc3, 0xbf, 0x92, 0xc3, 0xbf, + 0x92, 0xc3, 0xbf, 0x92, 0xc3, 0xbf, 0x92, 0xc3, + 0xbf, 0x91, 0x21, 0xd5, 0x3b, 0x92, 0x05, 0x46, + 0xb1, 0x5f, 0xb6, 0xe0, 0x39, 0x3f, 0xe7, 0xe1, + 0xff, 0x00, 0x54, 0x87, 0x36, 0x21, 0x0e, 0xb3, + 0x80, 0xc5, 0xa6, 0x93, 0x2b, 0x11, 0x43, 0x8e, + 0x27, 0xa0, 0x90, 0x94, 0xa8, 0x35, 0xa1, 0x21, + 0xfe, 0x0f, 0xeb, 0x0f, 0xd3, 0xdd, 0x7e, 0xdb, + 0xb0, 0x7f, 0xc2, 0x04, 0x08, 0x10, 0x20, 0x40, + 0x81, 0x02, 0xb8, 0xb9, 0xb1, 0x52, 0xc4, 0xd2, + 0x62, 0x52, 0x52, 0xae, 0x2f, 0xa6, 0x03, 0xe5, + 0x73, 0xf7, 0x21, 0xb6, 0x76, 0xf6, 0x17, 0x3a, + 0x9f, 0xb8, 0xcb, 0x77, 0x22, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x80, 0xe9, 0xbf, 0x4f, 0x75, 0xfb, + 0x67, 0x35, 0x2c, 0x60, 0x6c, 0xd0, 0xf1, 0xfc, + 0x1f, 0xe8, 0x2c, 0xba, 0x21, 0xb6, 0x77, 0x51, + 0xa0, 0x6a, 0x91, 0x5e, 0x64, 0x24, 0x24, 0x96, + 0x02, 0x70, 0x2a, 0xaa, 0x89, 0x9e, 0x9c, 0x84, + 0x25, 0xc1, 0xfe, 0x0f, 0xfc, 0x22, 0xc4, 0x7e, + 0xdd, 0xbe, 0x28, 0xb2, 0xf3, 0x2c, 0xbc, 0xcb, + 0x2f, 0x32, 0xcb, 0xcc, 0xb2, 0xf3, 0x2c, 0xbc, + 0xcb, 0x2f, 0x32, 0xcb, 0xcc, 0xb2, 0xf3, 0x2c, + 0xbc, 0xcb, 0x2f, 0x32, 0xcb, 0xcc, 0xb2, 0xf3, + 0x2c, 0xbc, 0xcb, 0x2f, 0x32, 0xcb, 0xcc, 0xb2, + 0xf3, 0x2c, 0xbc, 0xcb, 0x2f, 0x32, 0xcb, 0xcc, + 0x48, 0xd4, 0xc8, 0xc3, 0x0b, 0xfe, 0x52, 0xa3, + 0xb5, 0x2c, 0xdb, 0x66, 0xdb, 0x36, 0xd9, 0xb6, + 0xcd, 0xb6, 0x6d, 0xb3, 0x6d, 0x9b, 0x6c, 0xdb, + 0x66, 0xdb, 0x36, 0xd9, 0xb6, 0xcd, 0xb6, 0x6d, + 0xb3, 0x6d, 0x9b, 0x6c, 0xdb, 0x66, 0xdb, 0x36, + 0xd9, 0xb6, 0xcd, 0xb6, 0x43, 0x28, 0x7f, 0x46, + 0xe0, 0x51, 0x91, 0x4e, 0x6c, 0xb2, 0xb2, 0xd4, + 0xb2, 0xb2, 0xd4, 0xb2, 0xb2, 0xd4, 0xb2, 0xb2, + 0xd4, 0xb2, 0xb2, 0xd4, 0xb2, 0xb2, 0xd4, 0xb2, + 0xb2, 0xd4, 0xb2, 0xb2, 0xd4, 0xb2, 0xb2, 0xd4, + 0xb2, 0xb2, 0xd4, 0xb2, 0xb2, 0xd4, 0xb2, 0xb2, + 0xd4, 0xb2, 0xb2, 0xd4, 0xb2, 0xb2, 0xd4, 0xb2, + 0xb2, 0xd4, 0xb2, 0xb2, 0xd4, 0xb2, 0xb2, 0xd4, + 0xb2, 0xb2, 0xd4, 0xb2, 0xb2, 0xd4, 0xb2, 0xb2, + 0xd4, 0x49, 0xd0, 0x9a, 0x12, 0x3e, 0x92, 0xa2, + 0xe5, 0x96, 0x1d, 0xfc, 0x96, 0x1d, 0xfc, 0x96, + 0x1d, 0xfc, 0x96, 0x1d, 0xfc, 0x96, 0x1d, 0xfc, + 0x96, 0x1d, 0xfc, 0x96, 0x1d, 0xfc, 0x96, 0x1d, + 0xfc, 0x96, 0x1d, 0xfc, 0x96, 0x1d, 0xfc, 0x96, + 0x1d, 0xfc, 0x96, 0x1d, 0xfc, 0x96, 0x1d, 0xfc, + 0x96, 0x1d, 0xfc, 0x96, 0x1d, 0xfc, 0x96, 0x1d, + 0xfc, 0x96, 0x1d, 0xfc, 0x96, 0x1d, 0xfc, 0x96, + 0x1d, 0xfc, 0x96, 0x1d, 0xfc, 0x96, 0x1d, 0xfc, + 0x89, 0x42, 0xa1, 0xbf, 0xb9, 0xcf, 0x67, 0x0f, + 0xa5, 0xcc, 0xd4, 0xc2, 0x58, 0xb1, 0x54, 0x41, + 0x62, 0x70, 0xc7, 0x02, 0x66, 0x0c, 0x32, 0x22, + 0xa2, 0xdf, 0x62, 0xac, 0x8d, 0x0d, 0x69, 0x27, + 0x07, 0x08, 0x42, 0x43, 0x22, 0x6d, 0x72, 0xd4, + 0x6e, 0x84, 0xb2, 0xab, 0x51, 0x54, 0x51, 0x5b, + 0x55, 0xe9, 0xf2, 0x35, 0xa5, 0xb1, 0x39, 0x46, + 0xe5, 0x4b, 0x28, 0x29, 0x22, 0x64, 0xc2, 0xc0, + 0x4f, 0x98, 0x6a, 0x09, 0x8f, 0xc7, 0x30, 0x22, + 0x94, 0x6b, 0xe9, 0x62, 0x5a, 0xfa, 0x76, 0x0f, + 0xf9, 0xf4, 0xa6, 0x6e, 0x11, 0x52, 0x69, 0x61, + 0x3b, 0x22, 0xaa, 0x24, 0x9a, 0x60, 0x55, 0x6a, + 0x54, 0xb0, 0x90, 0x94, 0x8c, 0x77, 0x18, 0x09, + 0xca, 0x0a, 0x84, 0x04, 0xe2, 0x46, 0x19, 0xca, + 0xd7, 0x08, 0x81, 0x31, 0x41, 0x50, 0x4f, 0x52, + 0x95, 0x0a, 0x89, 0x22, 0xe8, 0x87, 0x43, 0x52, + 0x57, 0x22, 0x84, 0x14, 0x28, 0x46, 0xa6, 0x28, + 0x20, 0x94, 0x83, 0x1b, 0x98, 0xdd, 0xa1, 0xfd, + 0x29, 0x09, 0xe8, 0x3c, 0x09, 0x5b, 0x77, 0xfd, + 0xfc, 0x1f, 0xe4, 0x93, 0x70, 0x90, 0x83, 0xaa, + 0x98, 0x30, 0x04, 0x09, 0x25, 0x1a, 0x13, 0x5b, + 0x63, 0x62, 0x11, 0xa6, 0x39, 0xd2, 0xd4, 0xfc, + 0x1f, 0xd3, 0xa7, 0x2b, 0xee, 0x72, 0x94, 0x73, + 0x4a, 0x84, 0xa3, 0xaa, 0x23, 0xd0, 0x1e, 0x91, + 0x03, 0x66, 0x8a, 0x34, 0x87, 0x24, 0x9e, 0x02, + 0x7c, 0x22, 0x82, 0xc2, 0x29, 0x3d, 0x07, 0x8f, + 0x42, 0x11, 0x72, 0xb7, 0x45, 0x80, 0x85, 0xf2, + 0xb0, 0xc3, 0x18, 0x15, 0x01, 0x3e, 0xae, 0x23, + 0x67, 0x25, 0xc3, 0xd8, 0x6c, 0xc1, 0x21, 0x89, + 0x40, 0xe8, 0xd2, 0x25, 0xcd, 0x55, 0x58, 0x1c, + 0x19, 0xa7, 0x0b, 0x11, 0x91, 0x48, 0xa9, 0xba, + 0x7b, 0x93, 0x44, 0xa6, 0x30, 0x8a, 0x7d, 0x53, + 0x14, 0xc9, 0x43, 0x29, 0x5f, 0x4e, 0xc1, 0xff, + 0x00, 0x08, 0x0b, 0x4e, 0x7c, 0xc6, 0x84, 0x58, + 0xb1, 0x36, 0x9e, 0x2a, 0x1c, 0x0e, 0xe4, 0xa4, + 0xf7, 0x21, 0x53, 0x8a, 0xa8, 0x9d, 0xba, 0x03, + 0x1b, 0xb8, 0x0a, 0x05, 0xb8, 0x3d, 0x18, 0xf4, + 0x3a, 0xff, 0x00, 0x0a, 0x08, 0xe5, 0xd2, 0xa3, + 0x80, 0x52, 0xe9, 0x82, 0xc1, 0x8c, 0xc3, 0x25, + 0xb1, 0x89, 0xbe, 0x28, 0x43, 0x19, 0xb1, 0x54, + 0x9f, 0x01, 0x4d, 0x7f, 0x48, 0x0a, 0xdd, 0x30, + 0xe1, 0x1c, 0xc7, 0x26, 0x62, 0x91, 0x58, 0x36, + 0xe1, 0xac, 0x7a, 0xf0, 0x14, 0xaa, 0x38, 0x69, + 0x55, 0x70, 0x24, 0x98, 0xe4, 0x9a, 0xa1, 0x01, + 0xa5, 0x7a, 0x07, 0x80, 0xaf, 0x5d, 0xff, 0x00, + 0x48, 0x10, 0x20, 0x40, 0x81, 0x02, 0x02, 0x3a, + 0xeb, 0x1f, 0xc2, 0x89, 0xb0, 0x1c, 0x86, 0x0b, + 0x75, 0xe6, 0x15, 0x21, 0xb7, 0x0d, 0x63, 0xd7, + 0x80, 0xdd, 0x75, 0x8a, 0xa0, 0x65, 0x50, 0xe5, + 0xc6, 0x44, 0xa3, 0x9d, 0x7f, 0x48, 0x10, 0x20, + 0x40, 0x81, 0x02, 0x04, 0x3e, 0xe9, 0x4c, 0xe3, + 0xf4, 0xce, 0x18, 0x65, 0x3a, 0x62, 0xd4, 0x2a, + 0x34, 0xd8, 0x2a, 0x63, 0xb8, 0x93, 0x35, 0x30, + 0x84, 0x25, 0x4c, 0xb1, 0x42, 0x4d, 0x85, 0x10, + 0xce, 0x58, 0x2b, 0xb1, 0x9d, 0x06, 0xbb, 0x1e, + 0x24, 0xca, 0xb8, 0x0f, 0x77, 0x2a, 0x34, 0xd8, + 0x3b, 0x54, 0x3c, 0x4e, 0x62, 0xe2, 0x1b, 0xa0, + 0x93, 0x4f, 0x8a, 0x7d, 0x4c, 0x0c, 0xbe, 0x99, + 0x71, 0x13, 0xfa, 0x31, 0xe9, 0xc8, 0x66, 0xed, + 0x15, 0x5f, 0x4a, 0x4c, 0x34, 0x0e, 0x25, 0xa0, + 0x6e, 0xa9, 0xdc, 0x25, 0x36, 0x9b, 0x06, 0xf6, + 0x9d, 0x1b, 0x9f, 0x53, 0x8b, 0xd6, 0x23, 0x86, + 0x04, 0x23, 0x40, 0x94, 0xfa, 0xa1, 0xc9, 0xcb, + 0x30, 0x1c, 0x1a, 0x17, 0x74, 0x43, 0xf1, 0x12, + 0x23, 0xd3, 0xa0, 0xda, 0xad, 0x52, 0x12, 0x64, + 0x51, 0xe2, 0x36, 0x4d, 0x40, 0xe7, 0x1b, 0xb0, + 0x72, 0x27, 0x15, 0x04, 0xa6, 0x5a, 0x99, 0x26, + 0x65, 0xfd, 0x2b, 0x33, 0xf1, 0xc0, 0x62, 0x23, + 0xe6, 0x9c, 0xff, 0x00, 0x07, 0xf4, 0x27, 0x74, + 0x58, 0x08, 0x92, 0x3a, 0x29, 0x59, 0x89, 0x62, + 0xba, 0x27, 0x3e, 0xa3, 0x91, 0x38, 0xa8, 0x36, + 0x4d, 0x50, 0x9a, 0x14, 0x2e, 0x43, 0x6e, 0xb3, + 0x3b, 0x44, 0x25, 0xf8, 0x3f, 0xa2, 0x78, 0xcf, + 0xee, 0x5d, 0x08, 0x5e, 0x79, 0xe8, 0x5e, 0x79, + 0xe8, 0x5e, 0x79, 0xe8, 0x5e, 0x79, 0xe8, 0x5e, + 0x79, 0xe8, 0x5e, 0x79, 0xe8, 0x5e, 0x79, 0xe8, + 0x5e, 0x79, 0xe8, 0x5e, 0x79, 0xe8, 0x5e, 0x79, + 0xe8, 0x5e, 0x79, 0xe8, 0x5e, 0x79, 0xe8, 0x5e, + 0x79, 0xe8, 0x5e, 0x79, 0xe8, 0x5e, 0x79, 0xe8, + 0x5e, 0x79, 0xe8, 0x5e, 0x79, 0xe8, 0x5e, 0x79, + 0xe8, 0x5e, 0x79, 0xe8, 0x5e, 0x79, 0xe8, 0x5e, + 0x79, 0xe8, 0x56, 0x52, 0xbc, 0xfe, 0xad, 0xe6, + 0x47, 0xbe, 0x46, 0xfb, 0x7e, 0x4d, 0xf6, 0xfc, + 0x9b, 0xed, 0xf9, 0x37, 0xdb, 0xf2, 0x6f, 0xb7, + 0xe4, 0xdf, 0x6f, 0xc9, 0xbe, 0xdf, 0x93, 0x7d, + 0xbf, 0x26, 0xfb, 0x7e, 0x4d, 0xf6, 0xfc, 0x9b, + 0xed, 0xf9, 0x37, 0xdb, 0xf2, 0x6f, 0xb7, 0xe4, + 0xdf, 0x6f, 0xc9, 0xbe, 0xdf, 0x93, 0x7d, 0xbf, + 0x26, 0xfb, 0x7e, 0x4d, 0xf6, 0xfc, 0x9b, 0xed, + 0xf9, 0x37, 0xdb, 0xf2, 0x34, 0x95, 0xfd, 0xbf, + 0xe8, 0x92, 0x4a, 0x17, 0xd1, 0x14, 0x48, 0x6e, + 0x36, 0x6e, 0x36, 0x6e, 0x36, 0x6e, 0x36, 0x6e, + 0x36, 0x6e, 0x36, 0x6e, 0x36, 0x6e, 0x36, 0x6e, + 0x36, 0x6e, 0x36, 0x6e, 0x36, 0x6e, 0x36, 0x6e, + 0x36, 0x6e, 0x36, 0x6e, 0x36, 0x6e, 0x36, 0x6e, + 0x36, 0x6e, 0x36, 0x6e, 0x36, 0x6e, 0x36, 0x6e, + 0x36, 0x54, 0x20, 0xff, 0x00, 0xb5, 0x26, 0x47, + 0x23, 0xa3, 0x96, 0xa7, 0x47, 0x2d, 0x4e, 0x8e, + 0x5a, 0x9d, 0x1c, 0xb5, 0x3a, 0x39, 0x6a, 0x74, + 0x72, 0xd4, 0xe8, 0xe5, 0xa9, 0xd1, 0xcb, 0x53, + 0xa3, 0x96, 0xa7, 0x47, 0x2d, 0x4e, 0x8e, 0x5a, + 0x9d, 0x1c, 0xb5, 0x3a, 0x39, 0x6a, 0x74, 0x72, + 0xd4, 0xe8, 0xe5, 0xa9, 0xd1, 0xcb, 0x53, 0xa3, + 0x96, 0xa7, 0x47, 0x2d, 0x4e, 0x8e, 0x5a, 0x9d, + 0x1c, 0xb5, 0x3a, 0x39, 0x6a, 0x31, 0x49, 0x86, + 0xf0, 0x6b, 0xf6, 0xf3, 0xb3, 0x78, 0x7d, 0x9d, + 0xf2, 0x12, 0x98, 0xc0, 0x64, 0x51, 0xca, 0x7c, + 0x4a, 0xc9, 0x4a, 0xa5, 0x13, 0x1a, 0x42, 0x40, + 0xea, 0x43, 0x9b, 0x6a, 0x46, 0x15, 0xa4, 0xd3, + 0x90, 0x9e, 0xe1, 0x50, 0xec, 0x8b, 0x01, 0x3e, + 0x63, 0x01, 0x41, 0x49, 0x13, 0x32, 0x58, 0x6e, + 0x04, 0x10, 0x3a, 0xae, 0x3e, 0xd6, 0x1c, 0x64, + 0xf1, 0x0d, 0x6a, 0x5a, 0xfb, 0x3c, 0x68, 0xd7, + 0xed, 0xe2, 0xfb, 0x20, 0xf3, 0x17, 0x31, 0x06, + 0x68, 0xdd, 0x02, 0x9b, 0x65, 0xb6, 0x9a, 0xfe, + 0xf0, 0x1b, 0x66, 0x50, 0x93, 0xb5, 0x85, 0x62, + 0x2b, 0x38, 0xe2, 0x24, 0xbe, 0x7c, 0x70, 0x10, + 0xf6, 0x90, 0x93, 0x40, 0xa7, 0xa3, 0xab, 0x75, + 0x62, 0x68, 0xf3, 0x75, 0x0d, 0x63, 0x75, 0x7c, + 0x38, 0xbb, 0x8e, 0x91, 0x2e, 0xe2, 0x1b, 0xd2, + 0xe1, 0x11, 0x72, 0x72, 0x39, 0x71, 0x6b, 0x39, + 0x1b, 0x35, 0x74, 0x49, 0xfd, 0x82, 0xa2, 0xfd, + 0xbb, 0x8b, 0x78, 0x3f, 0xb3, 0xaa, 0xa0, 0x5e, + 0x82, 0xdd, 0x60, 0xde, 0xdb, 0xe2, 0x2e, 0x6c, + 0x0a, 0xc0, 0x2c, 0x46, 0x85, 0x9d, 0x10, 0xd5, + 0xb7, 0xc6, 0x83, 0x89, 0x80, 0x48, 0x88, 0x24, + 0x63, 0x10, 0xdd, 0xbc, 0x61, 0xfa, 0xb1, 0x8d, + 0x19, 0xbc, 0x30, 0x23, 0x38, 0x05, 0x49, 0x2b, + 0x8b, 0xf7, 0x7c, 0x29, 0x3c, 0x12, 0x8d, 0xd9, + 0x37, 0x64, 0xdd, 0x93, 0x76, 0x4d, 0xd9, 0x37, + 0x64, 0xdd, 0x93, 0x76, 0x4d, 0xd9, 0x37, 0x64, + 0xdd, 0x93, 0x76, 0x4d, 0xd9, 0x37, 0x64, 0xdd, + 0x93, 0x76, 0x4d, 0xd9, 0x37, 0x64, 0xdd, 0x93, + 0x76, 0x4d, 0xd9, 0x17, 0x44, 0x1f, 0xfe, 0x07, + 0x7f, 0xff, 0xc4, 0x00, 0x2b, 0x10, 0x01, 0x01, + 0x00, 0x02, 0x01, 0x03, 0x03, 0x03, 0x04, 0x03, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x11, + 0x00, 0x21, 0x31, 0x41, 0x51, 0xf0, 0x61, 0xc1, + 0xf1, 0x10, 0x71, 0xd1, 0x20, 0x81, 0x91, 0xa1, + 0x30, 0x40, 0xb1, 0xe1, 0x50, 0x60, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, 0x3f, 0x10, + 0x77, 0x33, 0x54, 0x40, 0x00, 0x10, 0x40, 0x3f, + 0xfc, 0x66, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, + 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, + 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, + 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, + 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, + 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, + 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, + 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, + 0x3e, 0x7c, 0xf9, 0xcd, 0xcc, 0xdd, 0x10, 0x08, + 0x8c, 0x34, 0x5c, 0x53, 0xff, 0x00, 0x9b, 0x58, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3c, 0x4a, + 0x76, 0x30, 0x40, 0xc0, 0x1e, 0x1e, 0x11, 0x08, + 0x9e, 0xb9, 0x3e, 0x27, 0xfc, 0xc9, 0xf1, 0x3f, + 0xe6, 0x4f, 0x89, 0xff, 0x00, 0x32, 0x7c, 0x4f, + 0xf9, 0x93, 0xe2, 0x7f, 0xcc, 0x9f, 0x13, 0xfe, + 0x64, 0xf8, 0x9f, 0xf3, 0x27, 0xc4, 0xff, 0x00, + 0x99, 0x3e, 0x27, 0xfc, 0xc9, 0xf1, 0x3f, 0xe6, + 0x4f, 0x89, 0xff, 0x00, 0x32, 0x7c, 0x4f, 0xf9, + 0x93, 0xe2, 0x7f, 0xcc, 0x9f, 0x13, 0xfe, 0x64, + 0xf8, 0x9f, 0xf3, 0x05, 0xa4, 0xa2, 0xcd, 0x16, + 0x59, 0xcc, 0xdf, 0x39, 0xe7, 0xfe, 0xd9, 0xe7, + 0xfe, 0xd9, 0xe7, 0xfe, 0xd9, 0xe7, 0xfe, 0xd9, + 0xe7, 0xfe, 0xd9, 0xe7, 0xfe, 0xd8, 0x00, 0xa8, + 0x08, 0xc8, 0x3c, 0x29, 0xc9, 0x9e, 0x7f, 0xed, + 0x9e, 0x7f, 0xed, 0x9e, 0x7f, 0xed, 0x9e, 0x7f, + 0xed, 0x9e, 0x7f, 0xed, 0x9e, 0x7f, 0xed, 0x88, + 0xaf, 0x33, 0xa4, 0xd7, 0x63, 0xf7, 0xc7, 0x3f, + 0xf9, 0xa5, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x85, 0xf4, 0x71, 0xe2, 0x18, 0x44, 0x68, 0x30, + 0xc1, 0x18, 0x15, 0xe8, 0x2e, 0x30, 0xaa, 0x64, + 0x90, 0x81, 0x51, 0x4d, 0xa0, 0xee, 0xfe, 0xae, + 0x93, 0xe5, 0x68, 0x55, 0x40, 0x37, 0xca, 0xff, + 0x00, 0x8f, 0x8d, 0x25, 0x62, 0xa7, 0xdb, 0x8f, + 0x48, 0x34, 0x03, 0x14, 0x18, 0xe0, 0x5b, 0x2d, + 0x67, 0x98, 0xb4, 0x52, 0x0a, 0xa6, 0x6a, 0x10, + 0x6b, 0x88, 0x19, 0xaa, 0x41, 0x43, 0x64, 0x38, + 0x07, 0x8c, 0x8a, 0x2a, 0x5a, 0x40, 0x2f, 0x4c, + 0x2f, 0x07, 0xd5, 0x0e, 0xc2, 0x96, 0x64, 0x2e, + 0x80, 0x0a, 0x9d, 0x00, 0xa5, 0x80, 0xb9, 0xac, + 0xff, 0x00, 0x12, 0x5a, 0xb2, 0x08, 0x88, 0x09, + 0x45, 0xc7, 0x40, 0xa0, 0x80, 0x58, 0x94, 0x13, + 0x72, 0x0c, 0xcb, 0x8d, 0xf4, 0x78, 0x9a, 0xb1, + 0x79, 0x7c, 0x50, 0x8a, 0x88, 0x74, 0xf7, 0x1b, + 0x94, 0x77, 0xc4, 0x23, 0xd2, 0x23, 0xc3, 0x70, + 0x20, 0x18, 0x42, 0x88, 0xf0, 0x8e, 0x3f, 0xfe, + 0x70, 0xca, 0xfc, 0x5f, 0x67, 0x3c, 0x47, 0x6e, + 0x6c, 0x40, 0xe8, 0xcc, 0x64, 0x3a, 0x77, 0xd1, + 0xd7, 0x56, 0xb0, 0x97, 0xfb, 0xd2, 0x4d, 0x69, + 0xdb, 0x4e, 0x08, 0x14, 0x77, 0x42, 0x0a, 0x95, + 0x48, 0x12, 0x18, 0x52, 0xdb, 0x2e, 0x90, 0x2f, + 0xe4, 0xb1, 0x05, 0x08, 0x78, 0x1a, 0x91, 0x24, + 0xda, 0xd8, 0xde, 0xca, 0x13, 0x29, 0x01, 0x94, + 0x4d, 0x57, 0x8e, 0x11, 0xa2, 0x4a, 0x02, 0xb2, + 0x26, 0x07, 0x94, 0x38, 0x1b, 0x57, 0x21, 0x40, + 0x03, 0x20, 0xed, 0x20, 0x10, 0x56, 0x46, 0x22, + 0x76, 0x65, 0x02, 0xc3, 0x55, 0xc8, 0xdf, 0x0e, + 0x93, 0xab, 0x06, 0x30, 0xcd, 0xa0, 0xb8, 0x04, + 0x5b, 0xc6, 0x44, 0xd6, 0xf6, 0xa0, 0x1d, 0x16, + 0x5a, 0x8a, 0xf6, 0xe5, 0xd2, 0x8c, 0x51, 0x41, + 0x49, 0x22, 0xfe, 0xae, 0x2c, 0xc5, 0x2e, 0xa1, + 0xb4, 0xd2, 0x0e, 0x86, 0xac, 0x94, 0x21, 0xe5, + 0x61, 0x42, 0xe0, 0x70, 0x1a, 0x37, 0x0c, 0x25, + 0x31, 0x1b, 0x9e, 0x48, 0xbe, 0xb2, 0xe0, 0x21, + 0x18, 0x30, 0x13, 0xee, 0xcc, 0xca, 0x6a, 0xdb, + 0x6c, 0x15, 0xe3, 0xea, 0x84, 0xb4, 0xd1, 0x84, + 0x24, 0xbf, 0x10, 0xa9, 0xb8, 0xbb, 0xe7, 0x88, + 0xc7, 0xee, 0x53, 0x7f, 0x49, 0x88, 0xfe, 0x70, + 0xa5, 0x69, 0xa3, 0x47, 0x83, 0x47, 0x0c, 0xa6, + 0xcb, 0xd7, 0x06, 0x42, 0x54, 0x2a, 0x4b, 0x31, + 0x39, 0xa6, 0xfb, 0x8a, 0x76, 0xd6, 0xc9, 0xba, + 0xf4, 0x26, 0x0e, 0x24, 0xf4, 0x05, 0x1d, 0x24, + 0x9c, 0x03, 0xb4, 0xff, 0x00, 0xe7, 0xee, 0xb7, + 0xe4, 0xbb, 0x39, 0xe2, 0x3b, 0x71, 0xe7, 0x08, + 0x41, 0xce, 0xc4, 0x50, 0x08, 0x79, 0x38, 0xa1, + 0xc4, 0x44, 0x0d, 0xda, 0x2c, 0x0b, 0x49, 0x26, + 0xb2, 0x50, 0x80, 0xb4, 0xa1, 0x5a, 0x34, 0xfa, + 0x23, 0x95, 0x72, 0x36, 0x0e, 0x04, 0xe2, 0xca, + 0x80, 0x95, 0x02, 0x83, 0xac, 0xe9, 0xcc, 0xf6, + 0xee, 0x27, 0x43, 0x40, 0x40, 0x38, 0x32, 0xf8, + 0x41, 0xd8, 0x4d, 0xb1, 0x89, 0x20, 0x38, 0x00, + 0x53, 0x34, 0xd2, 0x49, 0x2b, 0x93, 0x80, 0x42, + 0xc8, 0x14, 0x3b, 0xc3, 0x2e, 0x76, 0xa4, 0xcc, + 0x0a, 0x08, 0x1d, 0x8d, 0x69, 0x9b, 0x2b, 0x5c, + 0x01, 0xd1, 0x1e, 0x58, 0x00, 0x73, 0x5d, 0xe1, + 0x13, 0x72, 0x47, 0x5c, 0x31, 0xa0, 0x05, 0xb2, + 0x66, 0xb0, 0x87, 0x97, 0x41, 0x0d, 0x00, 0x0a, + 0x43, 0x8f, 0xd7, 0xc6, 0xed, 0xb2, 0xf0, 0x72, + 0x39, 0xd0, 0xc5, 0x12, 0x44, 0x75, 0x78, 0xb9, + 0x85, 0x1f, 0x43, 0x81, 0xad, 0x8e, 0xd5, 0xc0, + 0x00, 0x88, 0x94, 0x4c, 0x0b, 0x56, 0x2a, 0xda, + 0x1b, 0xc8, 0x28, 0xf1, 0x94, 0xe1, 0x7e, 0xa8, + 0x6d, 0xdf, 0xa9, 0xaa, 0xd5, 0x82, 0x25, 0x95, + 0xa5, 0x14, 0x23, 0x2d, 0x56, 0x38, 0x6f, 0xd8, + 0x00, 0x85, 0xc2, 0x38, 0x20, 0x4a, 0x5b, 0x88, + 0x09, 0x18, 0xda, 0xad, 0x83, 0x0c, 0x2f, 0x77, + 0xcc, 0x90, 0x08, 0xe0, 0x00, 0x33, 0x67, 0xca, + 0x34, 0x53, 0x8e, 0x20, 0x03, 0x88, 0x07, 0x04, + 0xc3, 0x2c, 0x08, 0x02, 0x01, 0xf4, 0x3c, 0xa6, + 0x17, 0x5c, 0xae, 0x30, 0x6d, 0xc5, 0xa3, 0x68, + 0x91, 0xf6, 0x80, 0xbd, 0x14, 0xcf, 0x2e, 0xf6, + 0xcf, 0x2e, 0xf6, 0xcf, 0x2e, 0xf6, 0xcf, 0x2e, + 0xf6, 0xcf, 0x2e, 0xf6, 0xcf, 0x2e, 0xf6, 0xcf, + 0x2e, 0xf6, 0xcf, 0x2e, 0xf6, 0xcf, 0x2e, 0xf6, + 0xcf, 0x2e, 0xf6, 0xcf, 0x2e, 0xf6, 0xcf, 0x2e, + 0xf6, 0xcf, 0x2e, 0xf6, 0xcf, 0x2e, 0xf6, 0xcf, + 0x2e, 0xf6, 0xcf, 0x2e, 0xf6, 0xcf, 0x2e, 0xf6, + 0xcf, 0x2e, 0xf6, 0xcf, 0x2e, 0xf6, 0xc3, 0x46, + 0xff, 0x00, 0x63, 0x3e, 0xf1, 0x3f, 0xd6, 0x0a, + 0xa7, 0xd2, 0xa7, 0x74, 0x48, 0xf5, 0x99, 0x5c, + 0x24, 0x21, 0x51, 0x00, 0xee, 0xb8, 0xa0, 0x19, + 0xab, 0xff, 0x00, 0x01, 0xcb, 0xfd, 0x67, 0x97, + 0xf9, 0x67, 0x97, 0xf9, 0x67, 0x97, 0xf9, 0x67, + 0x97, 0xf9, 0x67, 0x97, 0xf9, 0x67, 0x97, 0xf9, + 0x67, 0x97, 0xf9, 0x67, 0x97, 0xf9, 0x67, 0x97, + 0xf9, 0x67, 0x97, 0xf9, 0x67, 0x97, 0xf9, 0x67, + 0x97, 0xf9, 0x67, 0x97, 0xf9, 0x67, 0x97, 0xf9, + 0x67, 0x97, 0xf9, 0x67, 0x97, 0xf9, 0x65, 0xec, + 0xd2, 0xf4, 0x3f, 0xbe, 0x0c, 0x00, 0x03, 0x41, + 0xc0, 0x04, 0x07, 0xa7, 0xfa, 0x14, 0x28, 0x50, + 0xa1, 0x42, 0x85, 0x0a, 0x14, 0x28, 0x50, 0xa1, + 0x42, 0x85, 0x00, 0x44, 0x28, 0x26, 0x07, 0x32, + 0xdb, 0x35, 0xc7, 0x1f, 0xae, 0x14, 0x28, 0x50, + 0xa1, 0x42, 0x0d, 0x44, 0x04, 0x68, 0x0e, 0x05, + 0xb5, 0xe7, 0xf4, 0xc2, 0x85, 0x0a, 0x12, 0x12, + 0xe7, 0xa8, 0x93, 0xf6, 0x56, 0xff, 0x00, 0x26, + 0x4b, 0xe5, 0xa4, 0x14, 0xec, 0x97, 0x0e, 0x5e, + 0x77, 0x59, 0x1d, 0xaf, 0xa1, 0x8e, 0x7d, 0x7b, + 0x1a, 0x6b, 0x1d, 0x2d, 0x61, 0x72, 0x24, 0x2f, + 0x65, 0x39, 0xc5, 0xad, 0x76, 0xff, 0x00, 0xaa, + 0x15, 0x9b, 0x0c, 0x5c, 0x23, 0x8e, 0x04, 0x3a, + 0x01, 0x18, 0xc0, 0x71, 0x48, 0x74, 0xb9, 0x12, + 0x39, 0x4e, 0x9d, 0xf7, 0xe8, 0x05, 0xc6, 0x50, + 0x3c, 0x85, 0x39, 0x6b, 0x07, 0x6c, 0xf1, 0x0f, + 0x7c, 0xf1, 0x0f, 0x7c, 0xf1, 0x0f, 0x7c, 0xf1, + 0x0f, 0x7c, 0xf1, 0x0f, 0x7c, 0xf1, 0x0f, 0x7c, + 0xf1, 0x0f, 0x7c, 0xf1, 0x0f, 0x7c, 0xf1, 0x0f, + 0x7c, 0xf1, 0x0f, 0x7c, 0xf1, 0x0f, 0x7c, 0xf1, + 0x0f, 0x7c, 0xf1, 0x0f, 0x7c, 0xf1, 0x0f, 0x7c, + 0xf1, 0x0f, 0x7c, 0xf1, 0x0f, 0x7c, 0xf1, 0x0f, + 0x7c, 0xf1, 0x0f, 0x7c, 0xf1, 0x0f, 0x7c, 0xf1, + 0x0f, 0x7c, 0x2e, 0x20, 0x40, 0xff, 0x00, 0x68, + 0x34, 0xc5, 0x46, 0xf2, 0xd4, 0x25, 0xb7, 0xad, + 0x36, 0x7a, 0x7d, 0x17, 0x93, 0xe3, 0x6e, 0x71, + 0xd9, 0x5e, 0xc6, 0xff, 0x00, 0xd6, 0xad, 0x5a, + 0xb5, 0x6a, 0xd5, 0xab, 0x56, 0xad, 0x5a, 0xb5, + 0x6a, 0xd5, 0xab, 0x56, 0xad, 0x5a, 0xb5, 0x6a, + 0xdb, 0xd3, 0xc7, 0x72, 0xbb, 0x24, 0x45, 0xeb, + 0xac, 0x2c, 0xaa, 0x56, 0xb5, 0x62, 0x27, 0x73, + 0xdb, 0x02, 0x1d, 0x8e, 0x5a, 0xcf, 0xee, 0x5f, + 0xf0, 0x88, 0xf5, 0x9e, 0xd5, 0x18, 0x3f, 0x94, + 0xca, 0xad, 0x51, 0x44, 0xfc, 0xa6, 0x8c, 0x6a, + 0x15, 0xc7, 0xd6, 0x77, 0x23, 0x71, 0x3a, 0x00, + 0x68, 0x31, 0x39, 0x4b, 0xb2, 0xd4, 0x47, 0x4d, + 0x3d, 0x53, 0xb9, 0x32, 0xc9, 0x14, 0x9e, 0x04, + 0x4f, 0x11, 0xb9, 0x6e, 0xf9, 0xc0, 0x13, 0x8e, + 0x92, 0x57, 0xa1, 0x72, 0xad, 0x82, 0x8c, 0x07, + 0x81, 0x2b, 0xc6, 0xc9, 0x04, 0xd5, 0x8d, 0x42, + 0xde, 0xc2, 0x63, 0xb6, 0x54, 0x51, 0x11, 0xff, + 0x00, 0x03, 0x2d, 0x74, 0x03, 0xd5, 0x27, 0xfe, + 0x18, 0xf5, 0x76, 0x43, 0xda, 0x29, 0xff, 0x00, + 0x3f, 0xc0, 0xaa, 0xa8, 0xd9, 0x8b, 0x4b, 0x93, + 0x23, 0x94, 0xdd, 0xf3, 0x9a, 0x7b, 0x97, 0x95, + 0x74, 0x38, 0x21, 0xeb, 0xe7, 0x2a, 0x5b, 0x34, + 0x13, 0xcc, 0x48, 0x7e, 0xee, 0x02, 0x4e, 0x75, + 0xd3, 0x2e, 0x1c, 0x9c, 0xce, 0x3a, 0xe3, 0xf2, + 0x84, 0x8b, 0x25, 0x8e, 0x99, 0x6f, 0x4b, 0x72, + 0xe1, 0xb3, 0x5f, 0xbc, 0xc0, 0x87, 0xef, 0x9c, + 0x51, 0xe0, 0xc4, 0x40, 0x22, 0x75, 0x3a, 0x75, + 0xc1, 0x3d, 0xa0, 0x70, 0x79, 0x29, 0x5b, 0xd2, + 0x18, 0xee, 0x32, 0x98, 0x66, 0x28, 0x76, 0x23, + 0xa8, 0xfe, 0xb5, 0x55, 0x4b, 0xa2, 0xe0, 0xf4, + 0x52, 0x9f, 0xeb, 0x0f, 0x62, 0x09, 0xfb, 0x46, + 0x52, 0x9a, 0x4d, 0x78, 0x00, 0x3f, 0x60, 0x0f, + 0xdb, 0x3c, 0x2e, 0x78, 0x5c, 0xd3, 0x5c, 0x2b, + 0x28, 0x81, 0x6e, 0xee, 0x69, 0x77, 0x8c, 0x32, + 0xc0, 0xae, 0x41, 0x11, 0xea, 0x22, 0x23, 0xd9, + 0xcf, 0x0b, 0x9e, 0x17, 0x3c, 0x2e, 0x78, 0x5c, + 0x1a, 0x81, 0x6b, 0xeb, 0x86, 0x06, 0x99, 0xa4, + 0xa6, 0x5c, 0xbd, 0x17, 0x1d, 0xc2, 0xa3, 0x20, + 0x01, 0x55, 0x5d, 0x00, 0x75, 0xc4, 0xfb, 0xad, + 0xc7, 0xed, 0xe2, 0x4e, 0xb2, 0xcf, 0xb6, 0x49, + 0x88, 0xbe, 0x0f, 0xb9, 0x5f, 0xbb, 0x5f, 0x6c, + 0xf0, 0xb9, 0xe1, 0x72, 0x8b, 0xdf, 0x70, 0x94, + 0x95, 0xc7, 0xdf, 0x04, 0x38, 0xc2, 0xb6, 0xe6, + 0x97, 0x8f, 0x66, 0xb3, 0xc2, 0xe7, 0x85, 0xcf, + 0x0b, 0x9e, 0x17, 0x24, 0x82, 0x49, 0xe0, 0x34, + 0x7f, 0x9c, 0x07, 0x60, 0xff, 0x00, 0x32, 0x17, + 0xfb, 0x71, 0x9b, 0x54, 0x97, 0xd7, 0xfc, 0x95, + 0xfb, 0x09, 0xf6, 0x38, 0x70, 0x6a, 0xfd, 0xc2, + 0x30, 0x61, 0xb7, 0x66, 0x84, 0xc3, 0x90, 0xbf, + 0x70, 0xbd, 0xb2, 0xeb, 0xbd, 0x53, 0x5e, 0x80, + 0x4d, 0x25, 0xde, 0x2d, 0x31, 0xe3, 0x9b, 0x44, + 0x02, 0xde, 0x4f, 0x63, 0x81, 0x80, 0x70, 0xab, + 0x3c, 0x84, 0x1e, 0x91, 0x3f, 0xde, 0x19, 0x18, + 0x9f, 0x69, 0x5a, 0x00, 0x02, 0xd0, 0xa9, 0x0a, + 0x9a, 0x64, 0x2c, 0xc8, 0x8c, 0x29, 0x62, 0x37, + 0x00, 0x36, 0x61, 0xe6, 0x88, 0xe2, 0xad, 0x7f, + 0xc1, 0xe4, 0xfb, 0x71, 0x0f, 0xe4, 0x7f, 0xdf, + 0x3e, 0x47, 0x3e, 0x47, 0x3e, 0x47, 0x3e, 0x47, + 0x3e, 0x47, 0x3e, 0x47, 0x3e, 0x47, 0x1f, 0xe7, + 0x0f, 0xdd, 0x68, 0xfd, 0xca, 0x7e, 0xf8, 0x00, + 0x52, 0x15, 0x60, 0x7d, 0xb5, 0x4e, 0x04, 0x62, + 0x85, 0x3e, 0xd6, 0x0e, 0xfa, 0xd6, 0xb4, 0xf7, + 0xc1, 0xa3, 0x68, 0x7b, 0x39, 0xbb, 0x43, 0xba, + 0x8c, 0x3b, 0x18, 0xf0, 0x81, 0xee, 0xd0, 0xbc, + 0x25, 0xb0, 0x9c, 0xbb, 0x77, 0x8a, 0x11, 0xc6, + 0x86, 0xd0, 0x0d, 0x2e, 0x6b, 0xc2, 0xae, 0x9c, + 0xb0, 0x68, 0x56, 0xc4, 0x94, 0xeb, 0x5d, 0x86, + 0x98, 0xed, 0x9a, 0xe4, 0x80, 0xfa, 0x40, 0xf7, + 0x45, 0xfb, 0xe2, 0xf3, 0x1a, 0xdd, 0xa3, 0x57, + 0xf9, 0xcf, 0x91, 0xcf, 0x91, 0xcf, 0x91, 0xcf, + 0x91, 0xcf, 0x91, 0xcf, 0x91, 0xc1, 0x86, 0xbd, + 0x47, 0xdb, 0x1b, 0x78, 0x1a, 0x62, 0xf9, 0x13, + 0x1a, 0xe9, 0x9f, 0xaf, 0xfe, 0x33, 0xd7, 0xff, + 0x00, 0x18, 0x74, 0x5d, 0x0c, 0x48, 0xa1, 0x23, + 0xba, 0xde, 0x23, 0xb5, 0x48, 0x05, 0x28, 0x52, + 0xa7, 0xd8, 0x13, 0x65, 0xae, 0x6e, 0xde, 0x40, + 0x94, 0x00, 0x68, 0xab, 0xff, 0x00, 0x01, 0x87, + 0x61, 0x65, 0x1b, 0x41, 0x3e, 0xc5, 0xc4, 0xd2, + 0xea, 0x39, 0xcc, 0x44, 0x94, 0xfd, 0xe9, 0xc3, + 0x8f, 0xea, 0x06, 0x0e, 0xc7, 0x1f, 0x22, 0x08, + 0xd5, 0xc4, 0x6c, 0x4c, 0xd2, 0xa3, 0x07, 0x56, + 0x0c, 0xf5, 0x4c, 0x91, 0x03, 0xe9, 0xd4, 0x8e, + 0x85, 0xac, 0x21, 0xb3, 0x07, 0xae, 0xe3, 0xb9, + 0x8f, 0xba, 0xe0, 0xb1, 0xeb, 0x2d, 0x2d, 0x11, + 0x3c, 0x9d, 0xce, 0xd7, 0xa5, 0xcd, 0xdf, 0xed, + 0x3c, 0x28, 0xea, 0x9f, 0xf5, 0x1e, 0x43, 0x03, + 0x14, 0xeb, 0x00, 0xa0, 0x07, 0x6c, 0x27, 0x1e, + 0xa5, 0xa8, 0x1f, 0x24, 0x12, 0xa3, 0x81, 0x10, + 0xb5, 0x36, 0xcd, 0x60, 0x22, 0x93, 0x5d, 0x61, + 0x7d, 0x2b, 0x6f, 0x43, 0x7a, 0x95, 0x07, 0xaa, + 0xf7, 0x25, 0xaf, 0x46, 0x4c, 0x03, 0xed, 0x35, + 0xb2, 0xe4, 0x03, 0x48, 0x07, 0x07, 0x7c, 0x57, + 0x49, 0x3c, 0x61, 0x10, 0x29, 0xa0, 0x6e, 0xcd, + 0x43, 0x3d, 0x7f, 0xf1, 0x9e, 0xbf, 0xf8, 0xcf, + 0x5f, 0xfc, 0x7d, 0x65, 0x50, 0x59, 0xfd, 0x72, + 0xbf, 0xec, 0x70, 0xf0, 0xfd, 0xb8, 0x42, 0x19, + 0xfe, 0x08, 0xeb, 0xee, 0xeb, 0xf7, 0xc4, 0xf6, + 0xd1, 0xdb, 0x47, 0x26, 0x78, 0x4c, 0xf0, 0x99, + 0xe1, 0x33, 0xc2, 0x67, 0x84, 0xcf, 0x09, 0x91, + 0x0b, 0xec, 0x90, 0xf9, 0x12, 0x91, 0x7a, 0x26, + 0x05, 0x7d, 0x78, 0x7a, 0x53, 0x56, 0x3a, 0xbb, + 0xe7, 0xd7, 0x13, 0xd0, 0xc0, 0xa8, 0x3c, 0x88, + 0x43, 0xec, 0x99, 0x2d, 0x08, 0xe4, 0x75, 0x2a, + 0x57, 0x7b, 0x8d, 0x32, 0xa9, 0xcc, 0x9c, 0x23, + 0xc3, 0x86, 0x3a, 0x85, 0x20, 0x93, 0x7c, 0xd0, + 0xbf, 0xb1, 0x31, 0x84, 0x33, 0x5b, 0xad, 0x5a, + 0x56, 0xaf, 0x55, 0xc7, 0x8c, 0x7e, 0xa2, 0x05, + 0x03, 0xcb, 0x0d, 0x9c, 0xcf, 0xb6, 0x78, 0x4c, + 0xf0, 0x99, 0xe1, 0x33, 0xc2, 0x67, 0x84, 0xcf, + 0x09, 0x9e, 0x13, 0x03, 0x95, 0x93, 0x91, 0x13, + 0x7e, 0xdb, 0x18, 0x3d, 0x1b, 0x8e, 0x80, 0x2b, + 0x91, 0x2a, 0xe8, 0x5c, 0xad, 0xbf, 0x70, 0x67, + 0x8c, 0xcf, 0x19, 0x8a, 0xb7, 0x6c, 0x0c, 0x51, + 0xa5, 0xae, 0xba, 0x4f, 0xb6, 0x7d, 0xb6, 0x9e, + 0x5b, 0xf5, 0xba, 0xff, 0x00, 0x2f, 0x77, 0x05, + 0xac, 0x2d, 0x36, 0x20, 0xc3, 0xd7, 0xbf, 0x43, + 0xb4, 0xc5, 0x33, 0x28, 0xe5, 0x7d, 0x95, 0x46, + 0x6e, 0xf4, 0xc4, 0xce, 0x21, 0xac, 0x6e, 0xd4, + 0xab, 0xbe, 0xbb, 0xc2, 0x7a, 0xdd, 0x5a, 0x80, + 0xee, 0xc9, 0xae, 0x26, 0x71, 0x25, 0xe7, 0x4d, + 0x88, 0x89, 0xd4, 0x45, 0x1f, 0xbe, 0x4c, 0x44, + 0x9c, 0x2a, 0x73, 0xaa, 0xe8, 0xeb, 0x96, 0x3c, + 0x7a, 0xc1, 0x79, 0x27, 0x08, 0x8a, 0x4c, 0x41, + 0x7b, 0xe4, 0x34, 0xdb, 0xd6, 0x4b, 0xf6, 0xc2, + 0xb4, 0x18, 0xb3, 0xd5, 0x02, 0xbb, 0x4e, 0x93, + 0xf6, 0xce, 0x4b, 0x1d, 0x6e, 0xd8, 0x2b, 0xcb, + 0xaf, 0xdf, 0xbb, 0x8e, 0x1b, 0x19, 0x8e, 0xee, + 0x5b, 0x9e, 0x93, 0xf8, 0xcb, 0xb7, 0x2b, 0x32, + 0xcd, 0x9b, 0xdd, 0x73, 0x7a, 0xb9, 0xbb, 0x5d, + 0x8f, 0x6a, 0x95, 0x7e, 0xd3, 0x7c, 0x7a, 0x62, + 0x04, 0x37, 0x81, 0x9a, 0x37, 0x10, 0x1b, 0x25, + 0xa7, 0x38, 0xae, 0x53, 0x26, 0xed, 0x1d, 0xa2, + 0x38, 0xac, 0xe7, 0x8c, 0xf1, 0x99, 0xe3, 0x31, + 0xa1, 0x12, 0x63, 0x95, 0x61, 0x84, 0x2b, 0x9e, + 0x3b, 0x80, 0x3f, 0xd8, 0xe3, 0xcc, 0x1c, 0xff, + 0x00, 0x07, 0xe3, 0x0d, 0x7a, 0x51, 0x5c, 0x58, + 0x3b, 0xbd, 0x4e, 0x38, 0x58, 0x63, 0x9c, 0x2a, + 0xb5, 0x69, 0x50, 0x53, 0xcb, 0xc9, 0xd7, 0x4d, + 0x55, 0xdb, 0x57, 0xa3, 0xdc, 0xc8, 0x3b, 0x89, + 0xa3, 0xb3, 0x1f, 0xb3, 0x42, 0x1f, 0x42, 0x02, + 0x1c, 0xa9, 0x0e, 0xae, 0x25, 0x60, 0x49, 0xac, + 0x0d, 0xa5, 0x29, 0xc8, 0xa8, 0x74, 0xce, 0x56, + 0x60, 0xa3, 0xe7, 0x5a, 0x31, 0xbe, 0x09, 0xbe, + 0x32, 0xa9, 0x88, 0xa8, 0x3c, 0x14, 0x6d, 0xa9, + 0x1c, 0x3d, 0x9c, 0x74, 0x4e, 0xe5, 0x04, 0x4e, + 0x2d, 0x5a, 0x85, 0x9c, 0x26, 0xb0, 0x8f, 0x8d, + 0xe9, 0x4c, 0x1a, 0x11, 0x68, 0xce, 0x5b, 0x58, + 0x6c, 0x81, 0x52, 0x2e, 0x0f, 0x56, 0x06, 0x19, + 0x77, 0x43, 0x06, 0x50, 0xd2, 0xe9, 0xa1, 0x8c, + 0x34, 0x40, 0xc0, 0x31, 0x53, 0x47, 0xa4, 0xeb, + 0xfb, 0x13, 0x02, 0x8c, 0x94, 0xc0, 0x41, 0xc9, + 0x6b, 0x91, 0xbf, 0xd4, 0xa7, 0x9f, 0xae, 0x30, + 0x4a, 0x06, 0x13, 0xa6, 0x99, 0x09, 0x98, 0x9c, + 0xda, 0x6f, 0x31, 0x4e, 0xa6, 0x79, 0xa7, 0xb6, + 0x79, 0xa7, 0xb6, 0x79, 0xa7, 0xb6, 0x79, 0xa7, + 0xb6, 0x79, 0xa7, 0xb6, 0x79, 0xa7, 0xb6, 0x79, + 0xa7, 0xb6, 0x79, 0xa7, 0xb6, 0x79, 0xa7, 0xb6, + 0x79, 0xa7, 0xb6, 0x79, 0xa7, 0xb6, 0x79, 0xa7, + 0xb6, 0x79, 0xa7, 0xb6, 0x79, 0xa7, 0xb6, 0x79, + 0xa7, 0xb6, 0x79, 0xa7, 0xb6, 0x79, 0xa7, 0xb6, + 0x79, 0xa7, 0xb6, 0x79, 0xa7, 0xb6, 0x79, 0xa7, + 0xb6, 0x24, 0xed, 0x80, 0xc6, 0x9d, 0x53, 0xd7, + 0x12, 0x53, 0x49, 0x22, 0x55, 0x87, 0x42, 0xaf, + 0xd2, 0x4e, 0xb5, 0x25, 0xc5, 0x01, 0x04, 0x9c, + 0xa4, 0x9d, 0x6f, 0xfa, 0xcf, 0x3c, 0xf3, 0xcf, + 0x3c, 0xf3, 0xcf, 0x3c, 0xf3, 0xcf, 0x3c, 0xf3, + 0xcf, 0x3c, 0xf3, 0xcf, 0x10, 0x1a, 0x9e, 0xed, + 0x43, 0xa0, 0xd5, 0xf5, 0xc5, 0x52, 0xaa, 0xae, + 0xd5, 0xc5, 0x88, 0x2c, 0x7e, 0x99, 0x4f, 0xd4, + 0x10, 0x0d, 0x4e, 0x1d, 0x5a, 0x15, 0xd5, 0xff, + 0x00, 0x85, 0x78, 0x1c, 0x27, 0x3d, 0xa1, 0x31, + 0x92, 0x2b, 0x7d, 0x52, 0x37, 0xb0, 0xa3, 0x50, + 0x62, 0x6b, 0x7e, 0x23, 0x5a, 0x11, 0xbc, 0xd1, + 0xbc, 0x2e, 0xa0, 0x7c, 0x50, 0x72, 0x9d, 0x1b, + 0x3b, 0xef, 0xbe, 0x38, 0x58, 0x55, 0xeb, 0xb1, + 0xe0, 0xd9, 0xb7, 0x5b, 0x3b, 0xe1, 0x91, 0xbe, + 0xc3, 0x03, 0x42, 0x99, 0xb7, 0x6a, 0xf4, 0x6f, + 0x26, 0x86, 0xb9, 0x90, 0xe4, 0xf1, 0x49, 0xf7, + 0x93, 0x57, 0x70, 0xff, 0x00, 0x58, 0x9b, 0xa2, + 0xba, 0xc0, 0xdb, 0x4e, 0x9c, 0x00, 0x13, 0x31, + 0x7a, 0x2e, 0xef, 0x0d, 0x47, 0x03, 0xbe, 0x71, + 0xe6, 0x21, 0x10, 0x68, 0x2a, 0xd2, 0xee, 0xad, + 0x70, 0xb5, 0x2c, 0x61, 0x3e, 0xc9, 0x52, 0x12, + 0xee, 0x5c, 0x6e, 0xc6, 0x5e, 0xb6, 0x43, 0xea, + 0x0f, 0xd9, 0xc7, 0x8c, 0xd2, 0x56, 0xd9, 0xa1, + 0x4e, 0xd2, 0x74, 0x03, 0x07, 0x02, 0x40, 0xfb, + 0xc1, 0x2f, 0xd8, 0xfe, 0x97, 0x3c, 0xfd, 0x73, + 0xfa, 0x4f, 0xf8, 0xff, 0x00, 0x01, 0xa4, 0x59, + 0x95, 0xb1, 0x71, 0x7a, 0x53, 0x06, 0x82, 0x72, + 0xd5, 0x87, 0x4b, 0x89, 0xea, 0x89, 0x69, 0xb9, + 0xcc, 0x63, 0x9b, 0x1d, 0x04, 0x8b, 0x26, 0xd8, + 0x74, 0x9c, 0x8b, 0xb2, 0xfd, 0x5f, 0x4a, 0x68, + 0x10, 0x92, 0x6b, 0x8e, 0x1c, 0x9c, 0x3d, 0x54, + 0xce, 0x6a, 0x85, 0xfe, 0x47, 0x19, 0x77, 0x47, + 0x7d, 0x82, 0x06, 0xd4, 0x44, 0x05, 0xf1, 0x57, + 0x28, 0xd4, 0xd4, 0x06, 0xf2, 0x66, 0x26, 0xc7, + 0x5d, 0x1b, 0xb9, 0x88, 0x54, 0x93, 0x10, 0xab, + 0xc8, 0x56, 0xa0, 0x36, 0xdc, 0x16, 0x2b, 0xa0, + 0xa8, 0x07, 0x00, 0x78, 0xa4, 0x67, 0xaf, 0xeb, + 0xf2, 0xdd, 0x9f, 0xaa, 0xe3, 0x7e, 0xfe, 0xf4, + 0x37, 0xbc, 0xbd, 0xcb, 0x87, 0x2b, 0x7f, 0x57, + 0x22, 0x80, 0x74, 0x0d, 0x78, 0x2b, 0x05, 0x66, + 0xaa, 0xdb, 0x66, 0xb8, 0x08, 0xf0, 0x80, 0x14, + 0x0c, 0x2a, 0x3c, 0x30, 0x2f, 0x4a, 0x00, 0x60, + 0xa4, 0x51, 0x6e, 0x5f, 0x22, 0xb6, 0x84, 0xf5, + 0x99, 0x20, 0xa6, 0x87, 0x59, 0x35, 0xf3, 0x53, + 0x7f, 0x58, 0x94, 0x1d, 0x4e, 0x46, 0xdc, 0x49, + 0x71, 0x81, 0x1f, 0x04, 0x56, 0x01, 0x40, 0x8d, + 0x69, 0x52, 0xb6, 0xab, 0x9b, 0x9f, 0xa1, 0x3a, + 0x9b, 0x8a, 0x6f, 0x35, 0xc0, 0x39, 0x00, 0x39, + 0x20, 0xa8, 0xa8, 0xc2, 0x48, 0xe0, 0xb0, 0x26, + 0x55, 0x2a, 0x97, 0x63, 0x7a, 0x22, 0xd4, 0x12, + 0xf9, 0x9a, 0x82, 0x08, 0x82, 0xd0, 0x81, 0x0a, + 0x94, 0xc2, 0xd0, 0x90, 0x12, 0x18, 0x43, 0xc3, + 0x86, 0xd2, 0x6d, 0x0c, 0x60, 0xe4, 0x9c, 0x3a, + 0x3b, 0x41, 0x40, 0x8a, 0xbb, 0x88, 0xeb, 0xf4, + 0x90, 0x10, 0x80, 0x8e, 0x04, 0x00, 0xa1, 0x85, + 0xfc, 0x08, 0xd0, 0xa8, 0xa3, 0x68, 0x1a, 0x5d, + 0x0b, 0x1a, 0x1f, 0x5f, 0x35, 0xdf, 0xf4, 0x7f, + 0xe1, 0x83, 0xfc, 0x43, 0x0b, 0xc5, 0x88, 0xe8, + 0x89, 0xb1, 0xc2, 0x08, 0xbc, 0x5f, 0xb1, 0x69, + 0x99, 0x6c, 0xd9, 0xb8, 0x0e, 0x68, 0x07, 0xf7, + 0xc0, 0x90, 0xe0, 0x81, 0xc8, 0xae, 0x9d, 0x1b, + 0x4b, 0xac, 0x52, 0xd3, 0x55, 0x3d, 0xc5, 0x9c, + 0x0e, 0x4e, 0x98, 0x80, 0x98, 0xf0, 0xfa, 0xbb, + 0xd5, 0xd5, 0xe9, 0x83, 0x3c, 0xa0, 0xa7, 0x5a, + 0x0b, 0x38, 0x9c, 0x4e, 0x0c, 0x16, 0x14, 0x13, + 0x90, 0x85, 0x45, 0x60, 0x07, 0xd4, 0x84, 0xd4, + 0xe0, 0x02, 0x0e, 0xe3, 0x1a, 0xb2, 0xe2, 0x78, + 0x3a, 0x59, 0x00, 0x35, 0x58, 0x85, 0x6b, 0x47, + 0x6c, 0x22, 0x34, 0x81, 0x21, 0x22, 0x50, 0x62, + 0x7e, 0xaf, 0x1f, 0xdb, 0x9f, 0xd6, 0x7f, 0xc7, + 0xf8, 0x0d, 0x4a, 0x3a, 0xf4, 0x16, 0x6f, 0x40, + 0xbd, 0xc6, 0x2a, 0x00, 0xe0, 0x1a, 0x6e, 0x16, + 0xef, 0x82, 0x22, 0x5b, 0xea, 0x01, 0x9d, 0x8a, + 0xb8, 0x78, 0x6c, 0xd7, 0x8b, 0x7e, 0xee, 0x01, + 0x09, 0xc7, 0x81, 0x68, 0x2a, 0xc8, 0x5e, 0xf9, + 0x4c, 0x87, 0xda, 0x9d, 0x51, 0xb6, 0xf4, 0x26, + 0xcd, 0xe1, 0x5c, 0x08, 0x3a, 0xa8, 0x50, 0xac, + 0x88, 0xba, 0x3a, 0x77, 0xa4, 0x9c, 0x7f, 0xe0, + 0xaa, 0x86, 0xc6, 0x36, 0x5d, 0x0d, 0x98, 0x34, + 0x8f, 0x4e, 0x2c, 0x84, 0x00, 0x60, 0x25, 0x76, + 0xee, 0x27, 0xe4, 0x60, 0x12, 0x0d, 0x82, 0x9d, + 0x3b, 0xfe, 0xbf, 0x2d, 0xd9, 0xfa, 0x8e, 0x61, + 0x59, 0x81, 0xef, 0x68, 0x03, 0x8d, 0x77, 0x75, + 0x63, 0x86, 0xde, 0x4c, 0x71, 0xa3, 0xb4, 0xdc, + 0xaa, 0x1c, 0x3b, 0x18, 0xd0, 0x51, 0x64, 0x85, + 0x45, 0xb5, 0xa0, 0x71, 0x1c, 0x33, 0x57, 0x74, + 0xb0, 0xc8, 0x2f, 0x4d, 0x41, 0xb1, 0x13, 0xa8, + 0x67, 0x5d, 0x88, 0x90, 0x41, 0xc1, 0x35, 0xd6, + 0x90, 0xb5, 0xca, 0xc4, 0x06, 0xae, 0x6c, 0x1d, + 0x40, 0x92, 0x83, 0x64, 0x4c, 0xe4, 0x09, 0x66, + 0xa0, 0x28, 0x6f, 0xb0, 0x57, 0xb3, 0x65, 0x69, + 0x05, 0x41, 0xbd, 0x0f, 0x50, 0xa8, 0xd3, 0x17, + 0xae, 0x68, 0x70, 0xf9, 0x71, 0x30, 0x8d, 0x4a, + 0x01, 0x02, 0xd5, 0xc6, 0x91, 0xd6, 0x2f, 0x52, + 0x96, 0xd5, 0x05, 0x84, 0x55, 0x0c, 0xd0, 0x3f, + 0xa7, 0x80, 0x84, 0x01, 0xca, 0x4a, 0xf7, 0x03, + 0x35, 0x33, 0xa6, 0x14, 0x22, 0x4b, 0xb5, 0x01, + 0x85, 0x96, 0x60, 0x10, 0x54, 0xea, 0xb4, 0xa7, + 0xbc, 0x22, 0x22, 0xb3, 0xa3, 0x63, 0xd3, 0x56, + 0xad, 0x82, 0x42, 0xec, 0x10, 0x8b, 0x9b, 0x04, + 0xe3, 0xaa, 0x0a, 0x20, 0x94, 0x4d, 0x25, 0xfd, + 0x1e, 0x6b, 0xbf, 0xfc, 0x71, 0x37, 0xe4, 0x58, + 0x86, 0x0e, 0x75, 0x42, 0x14, 0xa3, 0xba, 0xbf, + 0xb6, 0x19, 0x91, 0x49, 0xd3, 0x73, 0x93, 0x72, + 0x8a, 0xab, 0xc7, 0x21, 0x83, 0x95, 0xa0, 0x20, + 0x2a, 0x92, 0x67, 0x61, 0xf4, 0xc8, 0x98, 0xe1, + 0xe9, 0x8d, 0x4d, 0xcd, 0x00, 0x15, 0x1b, 0x26, + 0xf1, 0x2a, 0xda, 0x23, 0xc2, 0x54, 0xa7, 0xb1, + 0x30, 0x24, 0x1e, 0xa9, 0x41, 0x7f, 0x68, 0x81, + 0x43, 0x75, 0x40, 0xcb, 0x9d, 0x40, 0x06, 0xad, + 0x80, 0x56, 0xc0, 0x85, 0x50, 0xc5, 0xee, 0x49, + 0xc1, 0x41, 0x01, 0xa5, 0x0e, 0x4e, 0xe9, 0x8d, + 0x12, 0xf6, 0x84, 0x05, 0x1b, 0x2c, 0xa3, 0xdc, + 0xa4, 0xc2, 0x2d, 0x62, 0x87, 0x0c, 0x35, 0x29, + 0xa4, 0x89, 0xb4, 0xc1, 0x9e, 0x64, 0x60, 0x54, + 0xc3, 0xb2, 0xd9, 0xbe, 0xe3, 0x1f, 0xd1, 0x0c, + 0x30, 0x89, 0x01, 0x34, 0xc1, 0xaf, 0x3b, 0xc4, + 0x1a, 0x13, 0x90, 0x01, 0x05, 0x07, 0x43, 0x6c, + 0xef, 0xce, 0x5f, 0x63, 0x9b, 0xe1, 0x80, 0x12, + 0x89, 0xcf, 0x4f, 0xd3, 0xe5, 0xfb, 0x73, 0xfa, + 0x8f, 0xf8, 0xc7, 0xc6, 0xb9, 0x3d, 0x34, 0x1c, + 0x9a, 0xff, 0x00, 0x5b, 0x1e, 0x3c, 0x78, 0xf1, + 0xe3, 0xc7, 0x8f, 0x1e, 0x3c, 0x78, 0xf1, 0xe3, + 0xc7, 0x8f, 0x1e, 0x3c, 0x78, 0xf1, 0xc0, 0x70, + 0x3c, 0x12, 0x53, 0x40, 0x35, 0xf4, 0xdd, 0x34, + 0xf8, 0xf0, 0x48, 0xfd, 0xf9, 0xe1, 0xfe, 0xf9, + 0xe1, 0xfe, 0xf8, 0x6d, 0x87, 0x85, 0x47, 0xfb, + 0xcf, 0x19, 0xf7, 0xcf, 0x19, 0xf7, 0xcf, 0x19, + 0xf7, 0xcf, 0x19, 0xf7, 0xcf, 0x19, 0xf7, 0xcf, + 0x19, 0xf7, 0xcf, 0x19, 0xf7, 0xcf, 0x19, 0xf7, + 0xcf, 0x19, 0xf7, 0xcf, 0x19, 0xf7, 0xcf, 0x19, + 0xf7, 0xcf, 0x19, 0xf7, 0xcf, 0x19, 0xf7, 0xcf, + 0x19, 0xf7, 0xcf, 0x19, 0xf7, 0xcf, 0x19, 0xf7, + 0xcf, 0x19, 0xf7, 0xcf, 0x19, 0xf7, 0xc1, 0x67, + 0xd1, 0x03, 0xa5, 0x7b, 0x8d, 0x3f, 0x7f, 0xa8, + 0x47, 0x3f, 0xc0, 0x78, 0xd2, 0xe4, 0xfe, 0xe5, + 0xd9, 0x42, 0x02, 0xc7, 0x8a, 0x4c, 0x19, 0x55, + 0xe7, 0x12, 0xb7, 0xd4, 0x24, 0x76, 0x52, 0xe2, + 0x53, 0xde, 0x86, 0xbb, 0x07, 0xb0, 0x17, 0xd4, + 0xca, 0xd5, 0xb5, 0x46, 0xb0, 0xfd, 0x01, 0xea, + 0xf6, 0xcb, 0xf6, 0x5e, 0xc4, 0xc0, 0xbc, 0xba, + 0x2e, 0x95, 0xe3, 0x34, 0xe0, 0xb6, 0x52, 0xef, + 0x0c, 0x30, 0x33, 0xaa, 0x25, 0x79, 0xb0, 0x15, + 0x9d, 0xb0, 0xe3, 0x7a, 0x44, 0x0b, 0xa4, 0x34, + 0x7a, 0x07, 0x75, 0xc7, 0x8b, 0xd6, 0x45, 0x48, + 0x6f, 0xd8, 0xdd, 0x0b, 0xd7, 0x38, 0xfd, 0xce, + 0xf2, 0xd2, 0x7d, 0x99, 0x3f, 0x7c, 0xf4, 0x14, + 0x8e, 0x86, 0xfd, 0xab, 0x99, 0xb4, 0x0a, 0x6d, + 0x38, 0x2a, 0x69, 0xc7, 0xab, 0xdf, 0x08, 0x9f, + 0x9a, 0xb1, 0x53, 0xe8, 0x52, 0x1b, 0x8a, 0x74, + 0x1c, 0x04, 0x82, 0x39, 0x9b, 0x86, 0x86, 0x80, + 0x7a, 0xb5, 0xe5, 0xfd, 0x3a, 0x79, 0xfa, 0xe7, + 0xf5, 0xdf, 0xf1, 0xfa, 0x8d, 0x40, 0x14, 0x00, + 0xf0, 0xf5, 0xc0, 0x5d, 0xa4, 0x6d, 0x00, 0xfe, + 0xf6, 0xc4, 0x9d, 0xa9, 0xc4, 0xcc, 0xfa, 0x35, + 0xc0, 0xe7, 0x62, 0x60, 0x83, 0x55, 0xca, 0xd3, + 0x4f, 0x58, 0x41, 0x5a, 0x44, 0x8d, 0x6d, 0xb6, + 0xa1, 0x19, 0x9b, 0x7a, 0xf4, 0x2e, 0x4a, 0x87, + 0x72, 0xf3, 0x8b, 0xfc, 0x59, 0xa4, 0x6e, 0xa3, + 0x71, 0xd3, 0xbb, 0xc3, 0x78, 0xfc, 0x06, 0x99, + 0x41, 0xae, 0xf3, 0x0e, 0xb9, 0x23, 0x4c, 0xad, + 0x7d, 0x2e, 0x03, 0x43, 0xf6, 0x43, 0xce, 0x2c, + 0x66, 0x0e, 0x7c, 0xb0, 0x15, 0x34, 0x9a, 0x66, + 0xe9, 0x82, 0xd1, 0x7b, 0x2d, 0x50, 0x44, 0x44, + 0xe0, 0xff, 0x00, 0x03, 0x82, 0xf8, 0x16, 0x1d, + 0x17, 0x92, 0x03, 0x9c, 0x78, 0x06, 0x27, 0xf7, + 0xfa, 0xbc, 0xb7, 0x67, 0xd1, 0x0a, 0x9a, 0x64, + 0xba, 0x5b, 0xfc, 0xb8, 0x52, 0x52, 0x40, 0xf8, + 0x2c, 0x33, 0x40, 0x8b, 0xd3, 0x78, 0xbf, 0xca, + 0x4c, 0xe4, 0x8c, 0x2c, 0xa1, 0x3a, 0x21, 0xe1, + 0xd6, 0xa0, 0x07, 0xd7, 0x5c, 0x4d, 0x0a, 0xce, + 0x7d, 0x72, 0x31, 0xf3, 0xd6, 0x72, 0x73, 0x82, + 0x0b, 0x60, 0x29, 0xc3, 0x67, 0x64, 0x55, 0xef, + 0x16, 0xab, 0x02, 0x87, 0x62, 0x80, 0x87, 0xb5, + 0xd8, 0x90, 0x3d, 0x92, 0x2a, 0x05, 0x00, 0xd1, + 0xc8, 0x1a, 0xc1, 0xe4, 0xac, 0x17, 0x73, 0x41, + 0x2d, 0x07, 0x53, 0x88, 0xed, 0x0a, 0x4d, 0x0c, + 0xdb, 0xa0, 0x6e, 0xb7, 0x0a, 0xa0, 0x2f, 0x08, + 0x54, 0x24, 0x0a, 0x4d, 0xf7, 0xeb, 0x83, 0x0d, + 0xab, 0xcf, 0x23, 0x52, 0xab, 0x05, 0x80, 0x2a, + 0x03, 0x68, 0x54, 0x5c, 0xb3, 0x56, 0x92, 0xb6, + 0x8b, 0xaa, 0x91, 0x89, 0xc4, 0x43, 0x6b, 0x04, + 0x04, 0x81, 0xd6, 0x68, 0xb6, 0xaa, 0x2d, 0x53, + 0x66, 0xfc, 0xef, 0x54, 0x0b, 0x17, 0x10, 0x46, + 0xe1, 0x63, 0x5c, 0xd6, 0x51, 0x65, 0x36, 0x63, + 0xf8, 0x06, 0x98, 0x46, 0x82, 0x03, 0x64, 0x28, + 0xa8, 0x02, 0xef, 0x40, 0x74, 0xc9, 0x10, 0x82, + 0xa2, 0x85, 0x4a, 0x08, 0x06, 0xc9, 0x37, 0x86, + 0xf9, 0x04, 0x8b, 0x01, 0xa8, 0xb8, 0xf5, 0x23, + 0x54, 0x93, 0x35, 0x66, 0x51, 0x11, 0xdb, 0x86, + 0xc5, 0x06, 0xcd, 0x85, 0x81, 0x80, 0x04, 0x6a, + 0x77, 0x1d, 0xb3, 0xd6, 0xcd, 0x10, 0xb4, 0x58, + 0x55, 0xcc, 0xab, 0x63, 0x47, 0xa8, 0xa5, 0xa0, + 0x0d, 0x71, 0x89, 0x75, 0x60, 0x20, 0x03, 0x14, + 0xd1, 0xa2, 0xf9, 0xd6, 0xb3, 0xd1, 0xb5, 0xd9, + 0x0a, 0x7f, 0x27, 0xd1, 0x65, 0x8e, 0x7f, 0x82, + 0xf0, 0xa4, 0xbd, 0x69, 0x51, 0xd9, 0x51, 0x4c, + 0x23, 0xc8, 0xad, 0x19, 0x15, 0x45, 0xd9, 0x55, + 0x78, 0xbc, 0xe4, 0xc5, 0x7b, 0x5f, 0x68, 0x26, + 0x34, 0x68, 0xc2, 0x30, 0xe0, 0x62, 0x1c, 0x49, + 0x91, 0xeb, 0x9a, 0x48, 0xce, 0x87, 0xe6, 0xc2, + 0x1a, 0xed, 0x88, 0x9c, 0xda, 0xbe, 0xa5, 0x28, + 0x33, 0x46, 0xbd, 0x31, 0xac, 0xc2, 0x9a, 0x49, + 0x55, 0x51, 0xa6, 0x72, 0x66, 0x89, 0xcb, 0x5d, + 0x1c, 0x34, 0x17, 0x6e, 0xfd, 0x70, 0x8d, 0x3c, + 0x4d, 0xf1, 0x10, 0x9f, 0xb3, 0x36, 0x23, 0x75, + 0x17, 0x58, 0x1a, 0x87, 0x65, 0xe3, 0x20, 0xc0, + 0x27, 0x7e, 0x59, 0x69, 0x66, 0x1a, 0x8a, 0x71, + 0x81, 0x82, 0x04, 0x92, 0x6a, 0x96, 0x74, 0x2b, + 0x03, 0x5b, 0x73, 0xa0, 0x42, 0x62, 0x72, 0xc7, + 0x03, 0x47, 0x03, 0xa6, 0x12, 0x8c, 0x53, 0x65, + 0xe4, 0x14, 0xcf, 0xdb, 0xf4, 0xb9, 0xe7, 0xeb, + 0x9b, 0x7d, 0xb7, 0xfc, 0x7e, 0xa3, 0x52, 0xc8, + 0x04, 0x58, 0x8e, 0xa5, 0xe9, 0x8f, 0x40, 0x33, + 0x62, 0x40, 0x95, 0x25, 0x13, 0x4e, 0x76, 0xe3, + 0x82, 0x50, 0x30, 0x75, 0xf1, 0x02, 0x02, 0x94, + 0xaa, 0xcc, 0x4c, 0xf7, 0xbb, 0x95, 0xb7, 0x8a, + 0xc3, 0x40, 0x00, 0x4e, 0xa8, 0xb5, 0xe4, 0x50, + 0xa3, 0xb8, 0x52, 0xd1, 0x80, 0xee, 0x6f, 0x48, + 0x4d, 0x3b, 0x8c, 0x12, 0x58, 0xcb, 0x05, 0x9d, + 0x32, 0x7e, 0xc5, 0xdf, 0x42, 0xf5, 0x7b, 0x21, + 0xb4, 0x0f, 0x4c, 0x74, 0x78, 0xa5, 0xe3, 0xc7, + 0x88, 0xea, 0x9b, 0x4a, 0xcc, 0xe6, 0xa6, 0x8b, + 0x75, 0x62, 0x14, 0x75, 0xb1, 0xf6, 0x30, 0x2d, + 0xed, 0x92, 0x3e, 0x06, 0x33, 0x4a, 0x6b, 0x91, + 0x82, 0xd9, 0x7a, 0xda, 0xc2, 0x7a, 0x94, 0xec, + 0x2f, 0x6c, 0xdd, 0xbe, 0x6f, 0xdc, 0xbb, 0xb0, + 0xe7, 0x79, 0xd2, 0xcd, 0xf3, 0xfa, 0xbc, 0xb7, + 0x67, 0xd1, 0xcc, 0xca, 0x48, 0x05, 0x04, 0x5d, + 0xa3, 0x4d, 0x6c, 0xbd, 0xb1, 0xa2, 0x55, 0x20, + 0x8d, 0x2d, 0xd0, 0x01, 0xc8, 0xa9, 0xce, 0x37, + 0x54, 0xa5, 0x4d, 0x6c, 0xfa, 0x03, 0x93, 0xa1, + 0x89, 0xac, 0x8b, 0x14, 0x56, 0x5e, 0x47, 0xd4, + 0xe4, 0xd6, 0x29, 0x79, 0x9d, 0x01, 0x45, 0x60, + 0x64, 0x73, 0xbb, 0x17, 0x0b, 0x2c, 0xa9, 0x4c, + 0xef, 0x4d, 0x80, 0xf4, 0x12, 0x31, 0x85, 0x8d, + 0x38, 0x6f, 0xa0, 0xd5, 0x45, 0x2a, 0x43, 0x58, + 0x8b, 0x08, 0x60, 0x5d, 0x63, 0xbd, 0xab, 0xa0, + 0xdc, 0x5c, 0x5d, 0x25, 0xa3, 0x67, 0x23, 0xb2, + 0x0e, 0x90, 0x77, 0x72, 0x96, 0x14, 0x07, 0x55, + 0x4e, 0x52, 0x6c, 0x79, 0xc6, 0x02, 0xb8, 0x30, + 0xd0, 0x90, 0x82, 0xc0, 0xa9, 0x79, 0x63, 0x09, + 0xe7, 0xd1, 0x16, 0x3e, 0x47, 0x27, 0x28, 0x17, + 0x13, 0xfc, 0xe3, 0x2f, 0x59, 0xd5, 0x6a, 0x2b, + 0x56, 0x6d, 0xc2, 0x03, 0x14, 0x42, 0x4b, 0x89, + 0xce, 0x24, 0x91, 0xc3, 0x89, 0x18, 0x38, 0xc8, + 0x06, 0x24, 0x9f, 0xcb, 0x6e, 0xb8, 0x06, 0x8c, + 0x12, 0x00, 0x9d, 0x1d, 0x91, 0x36, 0x1b, 0xbf, + 0x7c, 0x78, 0x3e, 0x10, 0xad, 0xc6, 0x81, 0x2a, + 0xe6, 0x08, 0x9d, 0x18, 0x3e, 0x5c, 0x85, 0xf9, + 0xba, 0x07, 0x5a, 0x8a, 0xd3, 0x8c, 0x75, 0xd8, + 0x84, 0x0a, 0x43, 0xc8, 0x10, 0x80, 0xbf, 0x70, + 0x53, 0x6f, 0x1e, 0x72, 0xee, 0x5d, 0x9b, 0x62, + 0x6b, 0x98, 0x94, 0xcc, 0xd6, 0x80, 0xb6, 0x82, + 0x3e, 0x6a, 0x09, 0x18, 0xe0, 0x89, 0x02, 0x4b, + 0x0d, 0x18, 0xb8, 0x5e, 0x6c, 0x3c, 0x5b, 0x77, + 0x63, 0x0f, 0xef, 0x02, 0x7b, 0x8f, 0xd1, 0xff, + 0x00, 0xb6, 0x62, 0xfb, 0x9e, 0x13, 0xb7, 0x3f, + 0xaa, 0xff, 0x00, 0x8c, 0x2f, 0x22, 0xd2, 0xa1, + 0xd6, 0xa7, 0x06, 0x7c, 0xa7, 0xf1, 0x9f, 0x29, + 0xfc, 0x67, 0xca, 0x7f, 0x19, 0xf2, 0x9f, 0xc6, + 0x7c, 0xa7, 0xf1, 0x9f, 0x29, 0xfc, 0x67, 0xca, + 0x7f, 0x19, 0xf2, 0x9f, 0xc6, 0x7c, 0xa7, 0xf1, + 0x9f, 0x29, 0xfc, 0x67, 0xca, 0x7f, 0x19, 0xf2, + 0x9f, 0xc6, 0x7c, 0xa7, 0xf1, 0x9f, 0x29, 0xfc, + 0x67, 0xca, 0x7f, 0x19, 0xf2, 0x9f, 0xc6, 0x7c, + 0xa7, 0xf1, 0x9f, 0x29, 0xfc, 0x67, 0xca, 0x7f, + 0x19, 0xf2, 0x9f, 0xc6, 0x7c, 0xa7, 0xf1, 0x80, + 0x6a, 0x8f, 0x12, 0xdc, 0x3d, 0x0e, 0x3f, 0x6f, + 0xa6, 0xb9, 0x59, 0x2e, 0xc3, 0x80, 0x9b, 0x0e, + 0xe6, 0xf1, 0x1b, 0x6a, 0xd5, 0xf4, 0x05, 0x5f, + 0xe7, 0xfd, 0x46, 0xad, 0x5a, 0xb5, 0x6a, 0xd5, + 0xab, 0x56, 0xad, 0x5a, 0xb5, 0x6a, 0xd5, 0xab, + 0x56, 0xad, 0x5a, 0xa2, 0x34, 0xa0, 0x4f, 0xdd, + 0x25, 0xfb, 0x5c, 0x2e, 0x4a, 0x05, 0x9b, 0xc0, + 0x38, 0x3f, 0xdd, 0xd9, 0x3d, 0xe7, 0x84, 0xed, + 0xcf, 0xe9, 0xbf, 0xe3, 0xf5, 0x1a, 0x3f, 0x51, + 0xd0, 0xcf, 0xe3, 0x00, 0x44, 0xde, 0x99, 0x5a, + 0x69, 0xeb, 0x08, 0x2b, 0x48, 0x91, 0xad, 0xb6, + 0xd4, 0x23, 0x33, 0x6f, 0x5e, 0x85, 0xc9, 0x50, + 0xee, 0x5e, 0x71, 0x7f, 0x8b, 0x34, 0x8d, 0xd4, + 0x6e, 0x3a, 0x77, 0x78, 0x6f, 0x18, 0x82, 0x50, + 0x24, 0x87, 0x2a, 0x17, 0x73, 0xa0, 0xba, 0xc9, + 0xc6, 0xc6, 0x2e, 0x21, 0x87, 0xe1, 0x4d, 0x2b, + 0xbc, 0x65, 0xc3, 0x1c, 0x03, 0x94, 0xda, 0x01, + 0xe7, 0xa6, 0xb0, 0xe6, 0x5e, 0x63, 0xf0, 0xd4, + 0x21, 0x6b, 0x2a, 0x12, 0xe4, 0x7c, 0x01, 0xc2, + 0x53, 0x39, 0x2a, 0x44, 0x4b, 0x48, 0xe4, 0xe7, + 0x9d, 0xc0, 0xd0, 0x9a, 0x24, 0x46, 0xc0, 0x04, + 0xcb, 0xb2, 0x67, 0xda, 0x85, 0xbc, 0x57, 0x0e, + 0x80, 0x7d, 0xf8, 0x9b, 0xfd, 0x50, 0xf2, 0xdd, + 0x9f, 0xed, 0xbc, 0x59, 0x6d, 0x72, 0xb9, 0xe2, + 0xfb, 0xff, 0x00, 0xae, 0x73, 0x13, 0xfd, 0x27, + 0xfc, 0x7e, 0xa3, 0x42, 0x8e, 0x62, 0x44, 0x22, + 0x9b, 0x29, 0x2f, 0x4b, 0x71, 0x33, 0xde, 0xee, + 0x56, 0xde, 0x2b, 0x0d, 0x00, 0x01, 0x3a, 0xa2, + 0xd7, 0x91, 0x42, 0x8e, 0xe1, 0x4b, 0x46, 0x03, + 0xb9, 0xbd, 0x21, 0x34, 0xee, 0x30, 0x49, 0x63, + 0x2c, 0x16, 0x74, 0xce, 0x48, 0x4f, 0xdf, 0xd0, + 0x60, 0xa4, 0xd3, 0xc6, 0x28, 0xbe, 0xd3, 0x21, + 0x52, 0x49, 0x61, 0xc9, 0x9d, 0x9c, 0x5a, 0xf6, + 0xec, 0xae, 0xa8, 0x72, 0x09, 0xce, 0xad, 0xdc, + 0x99, 0xeb, 0x93, 0x2b, 0x2b, 0x66, 0x17, 0xee, + 0x10, 0x8d, 0x4e, 0x93, 0x37, 0xab, 0x86, 0xf1, + 0x17, 0x02, 0x38, 0x0a, 0x4b, 0x44, 0xd2, 0x80, + 0x1b, 0x30, 0x6e, 0xa8, 0xf2, 0xb4, 0x34, 0xea, + 0xf7, 0x93, 0xee, 0xd3, 0x6a, 0x03, 0xfc, 0x3a, + 0x11, 0x40, 0xdc, 0x3d, 0x3b, 0xd7, 0xe9, 0xf2, + 0xdd, 0x9f, 0xed, 0x2c, 0x71, 0xcf, 0xaf, 0xa3, + 0x77, 0x8a, 0x08, 0x15, 0xa6, 0xde, 0x76, 0x67, + 0x82, 0x7b, 0xe7, 0x82, 0x7b, 0xe7, 0x82, 0x7b, + 0xe7, 0x82, 0x7b, 0xe7, 0x82, 0x7b, 0xe7, 0x82, + 0x7b, 0xe7, 0x82, 0x7b, 0xe7, 0x82, 0x7b, 0xe7, + 0x82, 0x7b, 0xe7, 0x82, 0x7b, 0xe7, 0x82, 0x7b, + 0xe7, 0x82, 0x7b, 0xe6, 0xb5, 0xf0, 0x3e, 0xf9, + 0xe0, 0x9e, 0xf9, 0xe0, 0x9e, 0xf9, 0xe0, 0x9e, + 0xf9, 0xe0, 0x9e, 0xf9, 0xe0, 0x9e, 0xf9, 0xe0, + 0x9e, 0xf9, 0xe0, 0x9e, 0xf9, 0xe0, 0x9e, 0xf9, + 0xe0, 0x9e, 0xf8, 0x6c, 0x2b, 0x30, 0x74, 0x29, + 0x3d, 0x73, 0x7f, 0xb0, 0xff, 0x00, 0x8c, 0x7f, + 0xf0, 0xbb, 0x05, 0x5d, 0xbd, 0x3f, 0xc3, 0x9e, + 0x79, 0xe7, 0x9e, 0x79, 0xe7, 0x30, 0x44, 0xb5, + 0xd0, 0x01, 0x8c, 0x1b, 0x47, 0x5c, 0x16, 0x5d, + 0x15, 0x2c, 0x6d, 0x42, 0x86, 0x13, 0x1a, 0x47, + 0x66, 0x1e, 0x7e, 0x72, 0x9b, 0x04, 0x89, 0xd2, + 0x90, 0x75, 0x72, 0x8c, 0x53, 0x70, 0x08, 0xa9, + 0x34, 0x36, 0x58, 0xcd, 0x7f, 0x8b, 0x3c, 0xf3, + 0xcf, 0x3c, 0xf3, 0xcf, 0x38, 0xbe, 0x80, 0x21, + 0x5b, 0x75, 0xfb, 0xff, 0x00, 0xb4, 0xfe, 0x9e, + 0x1d, 0xb9, 0x70, 0x4b, 0x00, 0x08, 0xab, 0xac, + 0x10, 0xfd, 0x2d, 0x9b, 0x36, 0x6d, 0x23, 0xe2, + 0x63, 0x9d, 0x74, 0x63, 0xc0, 0xbe, 0xf8, 0x2b, + 0x40, 0x34, 0xa0, 0x44, 0x2b, 0xb4, 0x92, 0x2c, + 0xc6, 0x4d, 0xd0, 0x17, 0x1d, 0x2a, 0x0d, 0xcc, + 0x69, 0x45, 0xba, 0x6d, 0xc4, 0xce, 0x52, 0x45, + 0xd0, 0x3a, 0xe2, 0xf1, 0x53, 0x57, 0xf4, 0x36, + 0x6c, 0xd9, 0xb3, 0x99, 0xa9, 0xb2, 0x2c, 0x2a, + 0x87, 0xa7, 0xd5, 0xb3, 0x68, 0xa4, 0x99, 0xa3, + 0x82, 0x4a, 0x42, 0xc3, 0x01, 0x4b, 0xc6, 0x03, + 0xf0, 0x19, 0x18, 0xa5, 0x44, 0x15, 0x22, 0x71, + 0x38, 0x2a, 0xed, 0x81, 0x24, 0x09, 0x72, 0x89, + 0x51, 0x41, 0xc4, 0xc4, 0x85, 0xe6, 0xf1, 0x60, + 0x34, 0x11, 0x74, 0x9c, 0x3a, 0xc6, 0x8c, 0x06, + 0x5b, 0x1d, 0x86, 0x86, 0x75, 0xc8, 0xca, 0x6d, + 0xfa, 0x36, 0x6c, 0xc1, 0x4c, 0x4a, 0x36, 0x82, + 0x99, 0x9f, 0xd0, 0x7f, 0xc7, 0xf8, 0x8d, 0x3a, + 0x75, 0x8f, 0x71, 0xad, 0xc4, 0x69, 0xa5, 0xfb, + 0x65, 0x6b, 0x0b, 0xb1, 0x60, 0x53, 0x50, 0x6a, + 0xa6, 0xf7, 0x74, 0xe3, 0x96, 0xb5, 0x77, 0x77, + 0xf3, 0x22, 0xdf, 0x5c, 0x82, 0x4d, 0xc7, 0xa9, + 0x5f, 0xbc, 0x46, 0x7d, 0x0f, 0x73, 0xfc, 0x5e, + 0x5b, 0xb3, 0xfd, 0xeb, 0x15, 0x7c, 0x87, 0x7f, + 0xe9, 0xe8, 0x10, 0x0f, 0x1e, 0x81, 0x9d, 0x7a, + 0xbd, 0x31, 0xed, 0xc2, 0x8e, 0x68, 0x08, 0x57, + 0xae, 0x87, 0xf3, 0x95, 0x9d, 0x2c, 0xa5, 0x1e, + 0xe5, 0x21, 0x77, 0x06, 0xbd, 0x5c, 0x15, 0x93, + 0x1a, 0x6a, 0x92, 0xd8, 0x41, 0x5e, 0x4a, 0x35, + 0xfe, 0x02, 0x1b, 0x6c, 0x18, 0xe2, 0xff, 0x00, + 0xfb, 0x20, 0xf5, 0x0c, 0x64, 0x21, 0x57, 0xa5, + 0xf7, 0xee, 0x37, 0xf5, 0xc5, 0x81, 0xeb, 0x27, + 0xdf, 0x22, 0x4c, 0x40, 0x51, 0x6c, 0x99, 0x5d, + 0x90, 0x10, 0xa0, 0x20, 0xc4, 0x40, 0xf2, 0x3a, + 0xe1, 0xc2, 0x39, 0x29, 0x04, 0xbc, 0x67, 0x54, + 0x5e, 0xa7, 0xd7, 0xc8, 0x77, 0xe7, 0xf5, 0x9f, + 0xf1, 0x84, 0x6a, 0x99, 0x14, 0x37, 0x39, 0xcf, + 0x8c, 0x7e, 0x73, 0xe3, 0x1f, 0x9c, 0xf8, 0xc7, + 0xe7, 0x3e, 0x31, 0xf9, 0xcf, 0x8c, 0x7e, 0x73, + 0xe3, 0x1f, 0x9c, 0xf8, 0xc7, 0xe7, 0x3e, 0x31, + 0xf9, 0xc6, 0xb0, 0xe1, 0x57, 0x70, 0x73, 0xb0, + 0xa5, 0x9a, 0xfb, 0xe2, 0xb1, 0x04, 0x88, 0xe4, + 0x84, 0x00, 0x35, 0x78, 0x76, 0x30, 0xba, 0xf7, + 0x9c, 0xc8, 0x20, 0x23, 0x68, 0x43, 0xd4, 0xc5, + 0x6a, 0x78, 0x07, 0x04, 0xbc, 0xde, 0x26, 0x86, + 0xe1, 0xb6, 0xfc, 0x63, 0xf3, 0x9f, 0x18, 0xfc, + 0xe7, 0xc6, 0x3f, 0x39, 0xf1, 0x8f, 0xce, 0x7c, + 0x63, 0xf3, 0x9f, 0x18, 0xfc, 0xe7, 0xc6, 0x3f, + 0x39, 0xf1, 0x8f, 0xce, 0x7c, 0x63, 0xf3, 0x8e, + 0x09, 0x0f, 0xe4, 0x25, 0x3f, 0xaf, 0xa7, 0xac, + 0x3e, 0xab, 0xfa, 0xcb, 0x7e, 0x6e, 0x7c, 0xd7, + 0x3e, 0x6b, 0x9f, 0x35, 0xcf, 0x9a, 0xe7, 0xcd, + 0x73, 0xe6, 0xb9, 0xf3, 0x5c, 0xf9, 0xae, 0x7c, + 0xd7, 0x3e, 0x6b, 0x9f, 0x35, 0xcf, 0x9a, 0xe7, + 0xcd, 0x73, 0xe6, 0xb9, 0xf3, 0x5c, 0xf9, 0xae, + 0x7c, 0xd7, 0x3e, 0x6b, 0x9f, 0x35, 0xcf, 0x9a, + 0xe6, 0x8e, 0x15, 0xb9, 0x4f, 0xb3, 0xf5, 0x70, + 0xb3, 0x5b, 0x97, 0x25, 0xbd, 0x3b, 0x6c, 0x96, + 0x9a, 0xfd, 0x25, 0x14, 0x51, 0x4a, 0xf5, 0x5c, + 0x03, 0xda, 0x2c, 0x0d, 0x03, 0x41, 0xc6, 0x2a, + 0x13, 0x2c, 0x20, 0x19, 0x81, 0x4a, 0x09, 0x55, + 0x72, 0xe8, 0x5d, 0xd7, 0x0e, 0xe8, 0x13, 0xf6, + 0x72, 0x03, 0x63, 0x4b, 0x7a, 0x2b, 0x2b, 0xfb, + 0xbf, 0xa7, 0x8e, 0x38, 0xe0, 0xb2, 0x35, 0xee, + 0xb1, 0xf2, 0xaf, 0x57, 0xd7, 0x8e, 0x0e, 0x64, + 0x10, 0x64, 0xa8, 0x8b, 0x49, 0x78, 0xa9, 0xcb, + 0x8b, 0xa7, 0x1e, 0xec, 0xee, 0xe3, 0xbd, 0x31, + 0xa9, 0x75, 0x9e, 0xb8, 0xd1, 0x41, 0x88, 0x55, + 0xf5, 0x70, 0x6f, 0x54, 0x48, 0x3b, 0x4d, 0xd5, + 0xd7, 0x1c, 0xbc, 0x55, 0x22, 0xbd, 0xfe, 0xa5, + 0x14, 0x27, 0x77, 0xde, 0x55, 0x0e, 0x3f, 0xa2, + 0xff, 0x00, 0x8c, 0x56, 0xcf, 0x62, 0xa9, 0xb4, + 0x1c, 0xf1, 0x9f, 0x7c, 0xf1, 0x9f, 0x7c, 0xf1, + 0x9f, 0x7c, 0xf1, 0x9f, 0x7c, 0xf1, 0x9f, 0x7c, + 0x0a, 0xec, 0xdf, 0x25, 0x64, 0x60, 0x11, 0xda, + 0x71, 0x8e, 0x3d, 0x06, 0x8d, 0x00, 0xb8, 0xb5, + 0x34, 0x89, 0x94, 0x62, 0x9b, 0x20, 0x22, 0xa3, + 0xa1, 0xb2, 0xc6, 0x6b, 0x02, 0x81, 0xc8, 0x2e, + 0xc1, 0x8d, 0x3d, 0x74, 0x56, 0x0b, 0xc0, 0xe0, + 0x44, 0x2a, 0x32, 0x98, 0x01, 0x76, 0xae, 0x5d, + 0x2e, 0xdc, 0x85, 0xa0, 0x14, 0x03, 0x45, 0x11, + 0xde, 0xb1, 0x61, 0x6e, 0x42, 0xc5, 0x1a, 0x6d, + 0x40, 0x40, 0x69, 0x1d, 0xe7, 0x8c, 0xfb, 0xe7, + 0x17, 0xb1, 0x18, 0x0b, 0x36, 0x21, 0xb5, 0x23, + 0x75, 0xc3, 0x82, 0x4c, 0x03, 0x41, 0x5a, 0x11, + 0x70, 0x82, 0x72, 0x22, 0x33, 0x3c, 0x67, 0xdf, + 0x3c, 0x67, 0xdf, 0x3c, 0x67, 0xdf, 0x3c, 0x67, + 0xdf, 0x3c, 0x67, 0xdf, 0x3c, 0x67, 0xdf, 0x1c, + 0xc2, 0x2a, 0xad, 0x57, 0x0f, 0xed, 0xe1, 0x05, + 0x87, 0xfd, 0xc0, 0xe2, 0x96, 0x34, 0x03, 0x3d, + 0x44, 0x03, 0x53, 0x02, 0x21, 0x3f, 0xbf, 0xf3, + 0x9f, 0x2b, 0xfc, 0xe7, 0xca, 0xff, 0x00, 0x39, + 0xf2, 0xbf, 0xce, 0x7c, 0xaf, 0xf3, 0x9f, 0x2b, + 0xfc, 0xe7, 0xca, 0xff, 0x00, 0x39, 0xf2, 0xbf, + 0xce, 0x7c, 0xaf, 0xf3, 0x9f, 0x2b, 0xfc, 0xe7, + 0xca, 0xff, 0x00, 0x39, 0xf2, 0xbf, 0xce, 0x7c, + 0xaf, 0xf3, 0x9f, 0x2b, 0xfc, 0xe7, 0xca, 0xff, + 0x00, 0x39, 0xf2, 0xbf, 0xce, 0x7c, 0xaf, 0xf3, + 0x9f, 0x2b, 0xfc, 0xe7, 0xca, 0xff, 0x00, 0x39, + 0xf2, 0xbf, 0xce, 0x7c, 0xaf, 0xf3, 0x89, 0x16, + 0x41, 0x34, 0x29, 0x0a, 0xda, 0x32, 0x47, 0xd3, + 0x1c, 0x44, 0x48, 0x9d, 0x9f, 0xa5, 0x97, 0x3e, + 0xaa, 0x8d, 0x5b, 0x81, 0x0f, 0x90, 0x0e, 0x58, + 0x7f, 0x1f, 0x40, 0x12, 0xb5, 0xa1, 0xa1, 0x18, + 0x0d, 0x88, 0x37, 0xa1, 0xb1, 0x44, 0x70, 0xc5, + 0x2d, 0x86, 0xf0, 0x2d, 0x4d, 0x82, 0x31, 0x14, + 0x20, 0x99, 0x46, 0x63, 0xae, 0x05, 0x50, 0x55, + 0x42, 0x50, 0xaf, 0x00, 0x38, 0xe1, 0xe7, 0x00, + 0xa2, 0xda, 0xe9, 0x8b, 0x48, 0x9b, 0x35, 0xf4, + 0x00, 0x3f, 0x42, 0xa9, 0x60, 0x94, 0x0c, 0xde, + 0xac, 0xd9, 0x97, 0x7f, 0x56, 0xcd, 0xa1, 0x09, + 0xa0, 0x87, 0x4a, 0xe2, 0xcb, 0x1f, 0x6c, 0xa5, + 0x99, 0x33, 0x60, 0x37, 0x69, 0x74, 0x16, 0x57, + 0x9c, 0x2c, 0xa9, 0xfd, 0xc9, 0x47, 0x74, 0xa8, + 0x60, 0xf8, 0xcc, 0x4b, 0x41, 0x6a, 0xa2, 0x3e, + 0x55, 0x5d, 0x93, 0xea, 0xd9, 0xb2, 0xe6, 0xd6, + 0xc6, 0x89, 0x5d, 0x82, 0xaf, 0x2c, 0xd7, 0xa6, + 0x6d, 0xc3, 0xb9, 0xbf, 0x67, 0xaf, 0x67, 0xa0, + 0xbc, 0x0e, 0x4b, 0xd3, 0x6b, 0x8e, 0xcd, 0xe8, + 0x22, 0x53, 0xcb, 0xc0, 0xa3, 0xb1, 0x85, 0x11, + 0x3a, 0x30, 0x0a, 0xb2, 0xaa, 0x5d, 0x13, 0xc8, + 0x40, 0xe2, 0x94, 0x50, 0x52, 0x82, 0x4a, 0x5e, + 0x72, 0xcc, 0x39, 0x2a, 0x74, 0xbb, 0x6a, 0x6b, + 0xfe, 0x99, 0xd5, 0x8e, 0x17, 0xa4, 0xd9, 0xa6, + 0x8e, 0x94, 0x7a, 0xc8, 0x99, 0xd0, 0x54, 0x09, + 0xdf, 0xae, 0x07, 0x3f, 0xd4, 0x67, 0xf5, 0x5f, + 0xf1, 0x9e, 0x33, 0xb7, 0xeb, 0x27, 0x83, 0x5d, + 0x9f, 0xa0, 0xa7, 0xf6, 0x73, 0xa6, 0x41, 0x26, + 0xe3, 0xd4, 0xaf, 0xde, 0x23, 0x3e, 0x87, 0xb9, + 0x9c, 0x30, 0x8f, 0xe2, 0x7b, 0x51, 0x62, 0xb6, + 0x7e, 0xec, 0xef, 0x6c, 0xc4, 0x23, 0x1e, 0xa1, + 0xbf, 0xb6, 0x4f, 0xfe, 0xba, 0x80, 0xaa, 0xda, + 0x96, 0x12, 0x11, 0x5d, 0x98, 0x24, 0xcd, 0xf3, + 0x93, 0x3f, 0x02, 0x76, 0xa0, 0xf0, 0x28, 0xbe, + 0x21, 0x40, 0x13, 0x6a, 0xa1, 0x3a, 0x81, 0x48, + 0xb7, 0x2d, 0x89, 0x0a, 0xcc, 0x0a, 0x6c, 0x01, + 0xa0, 0x38, 0x25, 0x73, 0x7a, 0x53, 0x62, 0x1b, + 0x0f, 0xd8, 0x37, 0xf7, 0x7d, 0xff, 0x00, 0xc0, + 0x83, 0xc7, 0x76, 0xe1, 0xfe, 0x13, 0x59, 0x4e, + 0x67, 0x3a, 0x9c, 0x7d, 0x6e, 0x51, 0xed, 0x15, + 0x8a, 0xf0, 0xea, 0x86, 0x80, 0xa5, 0x88, 0x2b, + 0xa7, 0x70, 0xd9, 0xba, 0x79, 0x82, 0x79, 0x32, + 0x0e, 0xfe, 0x9f, 0x63, 0x83, 0x14, 0xa1, 0x24, + 0x5b, 0x91, 0xd0, 0xe1, 0xfb, 0x75, 0x30, 0xfd, + 0x5d, 0xfc, 0x16, 0x34, 0xa5, 0x9a, 0x37, 0x1b, + 0xd3, 0x18, 0x97, 0xde, 0xde, 0xc2, 0x20, 0x28, + 0x50, 0x24, 0xc0, 0xca, 0xa7, 0xc4, 0x0b, 0x43, + 0x62, 0x0a, 0xba, 0xa8, 0x0d, 0xc6, 0xc5, 0xd6, + 0x9b, 0x4a, 0x15, 0x2d, 0x8e, 0xb8, 0x75, 0xc5, + 0x14, 0x20, 0x70, 0x00, 0x06, 0x68, 0x3b, 0xfd, + 0x0c, 0xa3, 0xbe, 0x30, 0x22, 0xdc, 0x76, 0x52, + 0xf6, 0xc5, 0x96, 0x4e, 0x3b, 0x7e, 0xa2, 0xe1, + 0xec, 0xf5, 0xe3, 0x79, 0x7a, 0xc4, 0xa5, 0xa3, + 0x0e, 0x11, 0x2a, 0x27, 0x15, 0x2e, 0x7d, 0xe6, + 0x97, 0xd7, 0xfa, 0x19, 0x3f, 0x96, 0x51, 0xe4, + 0xfe, 0x15, 0xf0, 0x55, 0x9d, 0x5a, 0xb7, 0x8c, + 0x19, 0xf3, 0xbd, 0x54, 0x29, 0x1b, 0x81, 0x57, + 0x9f, 0xb6, 0x2d, 0x0b, 0x44, 0x0c, 0xa0, 0x8c, + 0x88, 0xfd, 0xd8, 0x17, 0x84, 0x1c, 0xd0, 0x22, + 0x07, 0xd6, 0x27, 0x44, 0x4e, 0x99, 0x39, 0x9c, + 0x96, 0xdf, 0xff, 0x00, 0x21, 0x9e, 0x37, 0xbb, + 0x1e, 0x22, 0xb3, 0x5a, 0x65, 0x3e, 0xb8, 0x41, + 0xed, 0xbf, 0xd4, 0x8c, 0x7b, 0xba, 0x7e, 0x85, + 0xd3, 0x09, 0x38, 0xf2, 0xb5, 0x55, 0x5e, 0x80, + 0x76, 0xa5, 0xd7, 0x02, 0x84, 0x94, 0xb6, 0xfc, + 0x3d, 0x05, 0x0f, 0x40, 0xc5, 0x90, 0x1e, 0xdb, + 0x5b, 0xb0, 0x70, 0x74, 0xda, 0x93, 0xa6, 0x05, + 0xea, 0xb2, 0xb7, 0x66, 0xef, 0xad, 0xcf, 0x03, + 0xdf, 0xf5, 0x4e, 0x64, 0x39, 0x9e, 0xe1, 0x23, + 0xd2, 0xeb, 0x08, 0x57, 0x61, 0x02, 0x90, 0xe8, + 0x88, 0x99, 0xff, 0x00, 0x9e, 0x4f, 0xc5, 0x56, + 0xfd, 0xf1, 0x73, 0xff, 0x00, 0xe3, 0x6f, 0x27, + 0x28, 0xd9, 0xd8, 0xfd, 0x54, 0x0c, 0x7a, 0xf3, + 0x83, 0xb8, 0x19, 0x3e, 0xae, 0x99, 0x48, 0x84, + 0x9b, 0x02, 0x60, 0x88, 0x81, 0x81, 0x23, 0xce, + 0x06, 0x34, 0x79, 0xd4, 0x01, 0xe9, 0x49, 0x7a, + 0x23, 0xb6, 0x35, 0x4b, 0xcd, 0xcd, 0xc1, 0xe8, + 0x15, 0xfb, 0x7a, 0x63, 0x5a, 0xe5, 0x75, 0x0c, + 0x7e, 0xe9, 0xfb, 0xab, 0xa6, 0x0d, 0x7e, 0x5e, + 0x89, 0x17, 0xa2, 0x75, 0xd6, 0x9e, 0xbf, 0x45, + 0x3e, 0xf7, 0xfd, 0x67, 0xfa, 0xef, 0xf8, 0xc9, + 0x26, 0x15, 0x2f, 0xdb, 0xc0, 0xa2, 0x82, 0xf4, + 0x21, 0xdc, 0x05, 0x13, 0xa7, 0x1f, 0xce, 0x7c, + 0x63, 0xf3, 0x9f, 0x18, 0xfc, 0xe7, 0xc6, 0x3f, + 0x39, 0xf1, 0x8f, 0xce, 0x01, 0x66, 0x97, 0xa5, + 0x26, 0xa8, 0x50, 0xd8, 0xf3, 0x82, 0x7f, 0xe6, + 0x4d, 0x10, 0x99, 0xd0, 0x6d, 0x1b, 0x26, 0x2b, + 0x53, 0xc0, 0x38, 0x25, 0xe6, 0xf1, 0x34, 0x37, + 0x0d, 0xb5, 0xb5, 0x04, 0x81, 0xba, 0x50, 0x9d, + 0xdd, 0xf2, 0xaa, 0xb5, 0xc4, 0x2d, 0x16, 0x6d, + 0xa4, 0xd0, 0x2a, 0x16, 0x75, 0xb8, 0x09, 0x9b, + 0x98, 0x3a, 0xc3, 0x78, 0x17, 0x44, 0xab, 0xcd, + 0xc7, 0x0a, 0x50, 0x11, 0x00, 0x06, 0x30, 0x00, + 0xed, 0xae, 0x70, 0xd9, 0x20, 0x3b, 0x4a, 0xa8, + 0x8a, 0x2c, 0x8a, 0x56, 0x38, 0x98, 0x16, 0x16, + 0x2b, 0x65, 0xda, 0x5d, 0x6d, 0x35, 0xc6, 0xda, + 0xe7, 0xc3, 0x9d, 0x20, 0x90, 0x44, 0x09, 0xf6, + 0x58, 0x58, 0x7c, 0x63, 0xf3, 0x9f, 0x18, 0xfc, + 0xe7, 0xc6, 0x3f, 0x39, 0xf1, 0x8f, 0xce, 0x7c, + 0x63, 0xf3, 0x83, 0xa2, 0x5d, 0xca, 0x34, 0x2a, + 0x94, 0x35, 0x3b, 0xe2, 0xa7, 0x10, 0x5e, 0x88, + 0x0f, 0xe0, 0x33, 0xc7, 0x76, 0xe7, 0xed, 0xb7, + 0x3b, 0xe5, 0xe3, 0x33, 0xc6, 0x65, 0xa3, 0x2c, + 0x03, 0xae, 0xe8, 0xbd, 0xda, 0x4e, 0x0d, 0x9c, + 0xe2, 0xb7, 0xd5, 0x6d, 0x5a, 0x8a, 0xa5, 0x0e, + 0x3a, 0x48, 0x72, 0xe2, 0x18, 0x0c, 0x33, 0x6d, + 0xc1, 0xd7, 0x40, 0xbe, 0xa6, 0x42, 0x7f, 0xe4, + 0xbd, 0x75, 0x6d, 0x20, 0x35, 0xd7, 0x01, 0xac, + 0x47, 0x66, 0x95, 0x1a, 0xd7, 0xd2, 0x07, 0x6c, + 0xdc, 0x96, 0xe4, 0xe8, 0x4a, 0x80, 0x44, 0xa6, + 0x0e, 0xaa, 0xac, 0xe8, 0xe2, 0x24, 0x84, 0xb4, + 0x92, 0x6a, 0x34, 0x71, 0xce, 0x17, 0xef, 0x68, + 0xe9, 0x0b, 0x54, 0x1b, 0xce, 0x27, 0x93, 0xa8, + 0x96, 0x01, 0x17, 0x4a, 0xd1, 0xd4, 0x30, 0xdb, + 0x5c, 0x1b, 0x35, 0x12, 0xac, 0x5d, 0x3b, 0xe6, + 0xe7, 0xd4, 0xbf, 0xed, 0x87, 0x13, 0xec, 0xbe, + 0x9b, 0xca, 0x46, 0x5b, 0x00, 0x34, 0x46, 0xd0, + 0x3b, 0x55, 0xa9, 0x32, 0xf7, 0x66, 0xe0, 0x4a, + 0xa2, 0x8e, 0x22, 0xb6, 0x18, 0x3a, 0xc9, 0x27, + 0xbc, 0x0b, 0x7a, 0x9f, 0xbb, 0x22, 0x6a, 0x9d, + 0xc5, 0x38, 0x83, 0xa1, 0x2a, 0xb5, 0xd1, 0x8f, + 0xa3, 0x32, 0xae, 0x81, 0x0a, 0x10, 0x06, 0x4c, + 0x36, 0xba, 0xc3, 0x15, 0xf6, 0x56, 0x85, 0x9e, + 0x9b, 0x3f, 0xb9, 0xac, 0xf1, 0x99, 0xe3, 0x33, + 0x8d, 0x7d, 0x33, 0xd1, 0x9e, 0x37, 0xbb, 0x1f, + 0xe8, 0x87, 0x2a, 0xc6, 0xe4, 0x3a, 0x85, 0xb9, + 0xde, 0x0a, 0x27, 0x13, 0xe8, 0xb6, 0x0f, 0x07, + 0x75, 0xa5, 0x55, 0x84, 0x5d, 0x69, 0xc2, 0x6c, + 0x31, 0x94, 0x60, 0x78, 0xa8, 0xae, 0x93, 0x8e, + 0x61, 0x8a, 0x58, 0xa2, 0x80, 0x7e, 0x8f, 0x6d, + 0xb1, 0x50, 0xa7, 0x62, 0xdd, 0xdc, 0x6a, 0xab, + 0x4b, 0x08, 0x96, 0xe8, 0xd4, 0x84, 0x9a, 0x93, + 0xe8, 0xb4, 0x0f, 0x14, 0x1e, 0x24, 0x85, 0x83, + 0xce, 0xf1, 0x05, 0x3f, 0x83, 0xf5, 0xf1, 0x45, + 0x14, 0x51, 0x44, 0xbc, 0x3f, 0x7c, 0x72, 0x74, + 0x08, 0xaf, 0x18, 0x16, 0xb7, 0xa5, 0x68, 0xa2, + 0x63, 0xc2, 0xed, 0x08, 0xb4, 0x07, 0xcc, 0x50, + 0x05, 0x2b, 0xbd, 0xb8, 0x9b, 0x35, 0x16, 0x84, + 0xa8, 0x97, 0xa0, 0x6d, 0x70, 0x1c, 0x01, 0x85, + 0x26, 0xa8, 0x58, 0x35, 0x04, 0x2f, 0x08, 0x91, + 0x30, 0xcc, 0x4c, 0x28, 0x9b, 0x29, 0xa8, 0x7b, + 0x45, 0xb8, 0xda, 0xd0, 0x96, 0x1a, 0xaa, 0x42, + 0xda, 0xf2, 0x3f, 0x45, 0xbc, 0x70, 0xd5, 0x2a, + 0x2f, 0xdb, 0x78, 0x5d, 0xaa, 0x42, 0xc3, 0xfa, + 0x2f, 0xf8, 0x61, 0xde, 0xff, 0x00, 0x6f, 0xa2, + 0x8b, 0xfb, 0x67, 0xa9, 0xc7, 0xea, 0x71, 0xfa, + 0x9c, 0x7e, 0xa7, 0x1f, 0xa9, 0xc7, 0xea, 0x71, + 0xfa, 0x9c, 0x7e, 0xa7, 0x1f, 0xa9, 0xc7, 0xea, + 0x71, 0xfa, 0x9c, 0x7e, 0xa7, 0x1f, 0xa9, 0xc7, + 0xea, 0x71, 0xfa, 0x9c, 0x7e, 0xa7, 0x1f, 0xa9, + 0xc7, 0xea, 0x71, 0xfa, 0x9c, 0x7e, 0xa7, 0x1c, + 0x7e, 0x37, 0x02, 0xaf, 0xd8, 0xc8, 0x67, 0x5c, + 0xb9, 0x60, 0x1b, 0x7e, 0xfd, 0x21, 0x3f, 0xe6, + 0x6d, 0xdf, 0xcd, 0x1e, 0x74, 0x0e, 0x23, 0x43, + 0xa6, 0x7c, 0xd7, 0x3e, 0x6b, 0x9f, 0x35, 0xc0, + 0x0d, 0xe3, 0x62, 0xe6, 0x04, 0x9a, 0x97, 0xd4, + 0xd5, 0x36, 0xdb, 0xac, 0xf9, 0xae, 0x7c, 0xd7, + 0x3e, 0x6b, 0x9f, 0x35, 0xcf, 0x9a, 0xe7, 0xcd, + 0x73, 0xe6, 0xb9, 0xf3, 0x5c, 0xf9, 0xae, 0x7c, + 0xd7, 0x3e, 0x6b, 0x9f, 0x35, 0xcf, 0x9a, 0xe7, + 0xcd, 0x73, 0xe6, 0xb8, 0x38, 0x06, 0x5e, 0x83, + 0xcd, 0xae, 0x04, 0xf9, 0x2b, 0x29, 0xd0, 0x63, + 0x7d, 0x3e, 0xf1, 0x43, 0xae, 0x4f, 0x57, 0xfd, + 0xd0, 0x34, 0x7a, 0x12, 0x9b, 0x2d, 0xb3, 0xe9, + 0x42, 0xfd, 0xb1, 0xb5, 0xc5, 0xba, 0x0f, 0x40, + 0xe8, 0x7a, 0x19, 0xe7, 0x73, 0xce, 0xe7, 0x9d, + 0xcf, 0x3b, 0x9e, 0x77, 0x3c, 0xee, 0x79, 0xdc, + 0xf3, 0xb9, 0xe7, 0x73, 0xce, 0xe7, 0x9d, 0xcf, + 0x3b, 0x9e, 0x77, 0x3c, 0xee, 0x79, 0xdc, 0xf3, + 0xb9, 0xe7, 0x73, 0xce, 0xe7, 0x9d, 0xcf, 0x3b, + 0x9e, 0x77, 0x11, 0x8a, 0x47, 0xad, 0x37, 0x76, + 0x47, 0xfa, 0xfb, 0x4c, 0x7d, 0x2f, 0x77, 0x22, + 0x68, 0x0c, 0x4f, 0x47, 0x05, 0xd9, 0x80, 0x3f, + 0x60, 0x26, 0x5a, 0x84, 0xba, 0xfb, 0xc0, 0x14, + 0xf5, 0xcf, 0x8c, 0x7e, 0x31, 0x5b, 0x85, 0x4a, + 0x3b, 0x0c, 0x1f, 0xbb, 0x94, 0xee, 0x8e, 0x9d, + 0xa1, 0xb8, 0xfa, 0x5c, 0x0c, 0xb1, 0x7d, 0x94, + 0x92, 0x20, 0xa2, 0x07, 0x5a, 0xec, 0xe0, 0x65, + 0x8b, 0xf1, 0x49, 0x22, 0x0a, 0x20, 0x75, 0xae, + 0xce, 0x03, 0x7a, 0x14, 0x42, 0xf0, 0xd1, 0x2c, + 0x79, 0xc9, 0x92, 0xc4, 0xb3, 0x70, 0x8e, 0xb6, + 0x9d, 0xc1, 0xd4, 0xcf, 0x8c, 0x7e, 0x33, 0xe3, + 0x1f, 0x8c, 0x27, 0xe2, 0x4c, 0x54, 0xf0, 0x04, + 0xdb, 0x8e, 0xc5, 0x0a, 0x20, 0xa7, 0x42, 0x74, + 0x88, 0xf6, 0x47, 0x17, 0x73, 0xb8, 0x9a, 0x45, + 0x3f, 0x88, 0xd7, 0x5d, 0x65, 0xc8, 0xb2, 0xb0, + 0xb0, 0x14, 0x3a, 0x87, 0xaa, 0x1c, 0xb8, 0xa4, + 0x4d, 0x8c, 0x0a, 0x68, 0xd5, 0x23, 0x49, 0xa8, + 0xe0, 0x74, 0xd6, 0x9f, 0x6e, 0xed, 0x25, 0x9b, + 0x98, 0x55, 0x02, 0x90, 0x8f, 0xb0, 0xbf, 0xb6, + 0x4c, 0x3c, 0xef, 0xdb, 0x8a, 0xc3, 0xfb, 0x38, + 0xac, 0x4d, 0x04, 0x79, 0x78, 0x21, 0x31, 0x8a, + 0x11, 0x26, 0x81, 0xfe, 0x43, 0x0b, 0x0a, 0x69, + 0x90, 0x08, 0x55, 0xb0, 0xfa, 0xe3, 0x73, 0xfd, + 0xb8, 0x40, 0x00, 0x00, 0x06, 0x37, 0x94, 0x6b, + 0x1f, 0x01, 0x88, 0x1c, 0x69, 0x4e, 0x94, 0x69, + 0x79, 0x35, 0xda, 0xcd, 0x39, 0x09, 0x38, 0x0c, + 0x62, 0xba, 0x24, 0xa2, 0x8d, 0xa8, 0x29, 0xa3, + 0x10, 0x53, 0xb8, 0x24, 0x05, 0x4a, 0x9a, 0x34, + 0x9b, 0x31, 0x3f, 0x9f, 0x38, 0xe9, 0xd8, 0x06, + 0x25, 0xef, 0x86, 0xf8, 0xa4, 0x28, 0x33, 0x47, + 0x5d, 0xb8, 0x60, 0x77, 0x7a, 0xb4, 0x64, 0x44, + 0x52, 0xd6, 0x23, 0xb4, 0x40, 0x8f, 0x45, 0xc5, + 0x67, 0x1c, 0xb6, 0xa0, 0x8e, 0x85, 0xd8, 0xf8, + 0x14, 0x10, 0x15, 0x9d, 0x89, 0x35, 0x24, 0xd0, + 0x0a, 0x34, 0xfd, 0xba, 0x63, 0x82, 0xa3, 0x72, + 0x11, 0x1e, 0x80, 0xed, 0xf7, 0xc5, 0x9a, 0xd0, + 0x85, 0xf1, 0x00, 0xaa, 0x00, 0x1d, 0xc6, 0x35, + 0x67, 0x12, 0x9a, 0x21, 0x14, 0x14, 0xa3, 0xd3, + 0xd4, 0xc3, 0x79, 0xc4, 0x35, 0x61, 0x40, 0x0c, + 0x0b, 0xa5, 0x68, 0x4d, 0xe0, 0xb7, 0xcb, 0x25, + 0x21, 0x60, 0xe9, 0x15, 0x4c, 0xe7, 0x93, 0x48, + 0xaa, 0x32, 0x28, 0xc0, 0x0e, 0xc8, 0xd9, 0x32, + 0xfb, 0x55, 0x63, 0x6b, 0x58, 0x00, 0x2b, 0x0a, + 0xde, 0x35, 0x42, 0x82, 0x6a, 0x9b, 0xc0, 0x5b, + 0xd4, 0x14, 0x75, 0x6b, 0x0f, 0x7e, 0xd4, 0xc6, + 0x76, 0xc9, 0x38, 0x00, 0x5b, 0x0a, 0x41, 0x58, + 0x34, 0x54, 0x8b, 0x43, 0x23, 0x16, 0xd0, 0x9a, + 0xdf, 0x78, 0xca, 0xf0, 0x14, 0x10, 0x83, 0x48, + 0x1a, 0xc1, 0x5a, 0x5e, 0x54, 0x64, 0xfa, 0x69, + 0xa9, 0x36, 0x7b, 0x00, 0xef, 0x9f, 0xb5, 0x44, + 0xf2, 0x7a, 0x2d, 0x39, 0x9a, 0xc4, 0x2d, 0x86, + 0xe7, 0xd7, 0x70, 0xdc, 0x7b, 0xf9, 0x0b, 0xb4, + 0x61, 0xae, 0x63, 0x3b, 0x38, 0xbb, 0xff, 0x00, + 0x0a, 0x42, 0x83, 0x41, 0xb0, 0x36, 0x3a, 0x01, + 0xb4, 0x0e, 0x40, 0x8a, 0x64, 0xd3, 0x15, 0x01, + 0x93, 0x76, 0x9c, 0xc0, 0xd4, 0xec, 0x34, 0x89, + 0x3e, 0xeb, 0x15, 0x50, 0x08, 0x04, 0x70, 0x20, + 0xd0, 0x68, 0xe8, 0x68, 0x9d, 0xcd, 0xbd, 0x3c, + 0x44, 0x58, 0xbc, 0x0a, 0x55, 0x3e, 0x86, 0x80, + 0x6d, 0x3a, 0xd2, 0xb6, 0x06, 0x47, 0xd5, 0x65, + 0xce, 0x6b, 0x61, 0xa4, 0x5b, 0x96, 0x04, 0xc8, + 0xc0, 0x46, 0xb9, 0xa9, 0xf7, 0xb9, 0x1b, 0x9e, + 0x04, 0x6b, 0xf4, 0x31, 0x22, 0x8d, 0x38, 0x79, + 0x04, 0xab, 0x52, 0x5e, 0x4b, 0xd2, 0xed, 0x44, + 0xb9, 0x1c, 0x0d, 0x24, 0x7b, 0xcd, 0xc2, 0x14, + 0xd4, 0xaa, 0x04, 0x1c, 0xb3, 0x7b, 0x1f, 0xe4, + 0xf0, 0x70, 0x04, 0x9d, 0x6e, 0x44, 0xae, 0x1a, + 0x3d, 0xa9, 0xa0, 0x83, 0x44, 0xf4, 0xd8, 0xdf, + 0xa6, 0x1f, 0x47, 0x36, 0x41, 0x37, 0x9d, 0x04, + 0x31, 0x14, 0xe4, 0x99, 0xad, 0xbf, 0xc3, 0x0e, + 0x0d, 0x47, 0xdd, 0x82, 0xf0, 0x7a, 0x32, 0x07, + 0x17, 0xab, 0x75, 0x3f, 0x55, 0x22, 0x7a, 0xfa, + 0xe3, 0xbd, 0xb6, 0x60, 0x10, 0x56, 0xa9, 0x51, + 0x22, 0x90, 0xe3, 0x0d, 0x8a, 0xb5, 0xd8, 0xde, + 0x94, 0x34, 0x81, 0xa6, 0xa6, 0x1e, 0x5c, 0x4b, + 0x42, 0xd0, 0x00, 0xd2, 0xc5, 0xb3, 0x3e, 0x9e, + 0x3f, 0xd3, 0xe8, 0xf0, 0x15, 0x3f, 0xdb, 0x84, + 0x00, 0x00, 0x00, 0xd7, 0x96, 0x6f, 0xee, 0xf6, + 0xcf, 0x19, 0x8f, 0x41, 0x89, 0x2c, 0x48, 0x17, + 0xad, 0x68, 0x1d, 0x37, 0xad, 0xb4, 0xaa, 0x1a, + 0x20, 0x81, 0xd8, 0x20, 0x07, 0xa4, 0x3a, 0x61, + 0x7c, 0x6e, 0xc3, 0x58, 0x51, 0x24, 0x89, 0x70, + 0xc0, 0x91, 0x80, 0x05, 0xbb, 0x72, 0x4d, 0x75, + 0x3a, 0x0b, 0x92, 0xdf, 0x85, 0xa4, 0x94, 0x8a, + 0xd9, 0x49, 0x38, 0x59, 0xbd, 0x16, 0x11, 0xf1, + 0x0b, 0x17, 0x82, 0xef, 0x0e, 0x1a, 0x8e, 0x81, + 0x0e, 0x52, 0x1f, 0x65, 0xb8, 0xea, 0x53, 0xfa, + 0x48, 0x48, 0x07, 0x14, 0x79, 0xaa, 0x02, 0xb0, + 0x03, 0x45, 0xbd, 0xa0, 0x7f, 0x0c, 0x25, 0x63, + 0x36, 0x5f, 0x01, 0x38, 0x5e, 0x6b, 0x9c, 0x03, + 0xdb, 0xb4, 0xb0, 0x05, 0x55, 0x03, 0x1e, 0xe8, + 0x6f, 0x4c, 0xb6, 0x71, 0x25, 0x44, 0x4d, 0xab, + 0xbc, 0x18, 0x4b, 0x50, 0x24, 0x11, 0x0e, 0x9d, + 0x80, 0x02, 0xf0, 0xfa, 0x65, 0x84, 0x2d, 0xb7, + 0x25, 0xab, 0x6a, 0xcd, 0xbc, 0x1a, 0xe7, 0x34, + 0xb1, 0x91, 0x09, 0x01, 0x08, 0x79, 0xed, 0x67, + 0x6c, 0x1f, 0x25, 0xb5, 0x48, 0xa2, 0x41, 0xbd, + 0x0c, 0xd3, 0xde, 0xe2, 0x82, 0x3b, 0xa6, 0x02, + 0x4d, 0xb9, 0x77, 0x64, 0xfa, 0x82, 0x6d, 0x24, + 0xac, 0x81, 0xa1, 0x30, 0xde, 0xb7, 0x8f, 0x23, + 0xb0, 0x00, 0x12, 0x0a, 0xd3, 0x7b, 0xc1, 0x2d, + 0x47, 0x77, 0x94, 0x69, 0x59, 0x4d, 0x82, 0x6f, + 0x14, 0xda, 0xcb, 0x7b, 0x5a, 0xa6, 0xeb, 0xb3, + 0x9c, 0x64, 0x47, 0xf5, 0x66, 0x9f, 0xd7, 0xd0, + 0xea, 0x1d, 0x26, 0xb6, 0x43, 0x91, 0x32, 0xc1, + 0x46, 0x14, 0x4a, 0x69, 0xd2, 0x7a, 0x38, 0xaf, + 0x88, 0x10, 0x51, 0xc5, 0x6e, 0xe0, 0x80, 0x50, + 0x0a, 0xe5, 0x5f, 0x2a, 0x82, 0xbc, 0xc2, 0xea, + 0xc2, 0xe7, 0x1d, 0xb1, 0x9a, 0x39, 0x9d, 0x9a, + 0x8d, 0x22, 0x64, 0xcc, 0xb3, 0x80, 0xc8, 0x35, + 0xba, 0xbd, 0x0a, 0xac, 0xde, 0x31, 0x01, 0xce, + 0x02, 0x08, 0xb8, 0x36, 0x58, 0xdd, 0x05, 0x94, + 0x4f, 0x9f, 0x39, 0xbe, 0x60, 0x18, 0xe1, 0x1b, + 0x24, 0x24, 0xdd, 0xcf, 0xe8, 0x60, 0xc1, 0xd4, + 0x9a, 0x9c, 0xdf, 0x5c, 0x21, 0x73, 0x86, 0x27, + 0xec, 0xed, 0x0d, 0xdd, 0x2f, 0x5d, 0xe7, 0x4a, + 0x5f, 0x0f, 0x09, 0x55, 0x3a, 0x36, 0xba, 0x37, + 0xcd, 0x70, 0x5a, 0x02, 0xd8, 0xb1, 0x15, 0x75, + 0x12, 0x28, 0xe4, 0x34, 0x05, 0x80, 0x32, 0x48, + 0x13, 0xc4, 0x95, 0x25, 0xde, 0x15, 0x18, 0x26, + 0x47, 0xed, 0xb3, 0x53, 0x41, 0xa9, 0xf7, 0xc5, + 0xd0, 0x49, 0x60, 0x8b, 0xb6, 0x08, 0xca, 0x1b, + 0xa5, 0x9c, 0xee, 0x0c, 0x37, 0xf4, 0x10, 0x40, + 0x49, 0x0d, 0x7a, 0xe3, 0x6c, 0x16, 0xb2, 0x0e, + 0x01, 0x42, 0x20, 0x23, 0xd6, 0xde, 0xa1, 0xd3, + 0x0c, 0x60, 0x54, 0x4d, 0xe4, 0x87, 0x4b, 0xa2, + 0x33, 0x1d, 0x8d, 0xbe, 0x61, 0xad, 0x2c, 0x0b, + 0x64, 0x03, 0xb9, 0xa3, 0x29, 0xa0, 0xea, 0x03, + 0x42, 0xaa, 0x01, 0xf5, 0x46, 0x15, 0x39, 0x2e, + 0x29, 0xac, 0x14, 0xcf, 0xba, 0xe7, 0x98, 0xfb, + 0xe2, 0xc5, 0x1f, 0x28, 0x14, 0xd3, 0x57, 0x4f, + 0xd1, 0x7f, 0xb9, 0x2c, 0x11, 0x28, 0xed, 0x70, + 0xa0, 0x63, 0xea, 0x07, 0x21, 0x43, 0x37, 0x03, + 0x77, 0x27, 0xdb, 0x8c, 0xf9, 0x56, 0x1e, 0xf7, + 0x42, 0x31, 0x44, 0x74, 0x89, 0xc2, 0xe5, 0xc8, + 0x10, 0xca, 0xb3, 0xe5, 0x59, 0xf2, 0xac, 0xf9, + 0x56, 0x7c, 0xab, 0x3e, 0x55, 0x9f, 0x2a, 0xcf, + 0x95, 0x67, 0xca, 0xb3, 0xe5, 0x59, 0xf2, 0xac, + 0x0e, 0x82, 0x21, 0x2a, 0x5e, 0x88, 0x5f, 0xd8, + 0xe2, 0xed, 0x5d, 0xfb, 0xb3, 0xe5, 0x59, 0xf2, + 0xac, 0xf9, 0x56, 0x7c, 0xab, 0x3e, 0x55, 0x82, + 0xbe, 0xeb, 0x2a, 0x61, 0xe8, 0x0d, 0x5d, 0xfd, + 0x48, 0x13, 0xff, 0x00, 0x67, 0xf8, 0xce, 0x3b, + 0x61, 0x01, 0xcc, 0xad, 0x21, 0x16, 0x19, 0x16, + 0xc1, 0x40, 0x07, 0x22, 0x82, 0xde, 0x9c, 0x1e, + 0xb8, 0x63, 0x31, 0xb0, 0x1b, 0x0a, 0xd1, 0x5b, + 0x61, 0xcf, 0xf8, 0xbc, 0x7f, 0xa7, 0xfb, 0xc1, + 0x50, 0xff, 0x00, 0x7c, 0xff, 0x00, 0x86, 0x7a, + 0x00, 0x3f, 0xa8, 0xd8, 0xef, 0x97, 0xf9, 0xcf, + 0x19, 0xf7, 0xcf, 0x19, 0xf7, 0xcf, 0x19, 0xf7, + 0xcf, 0x19, 0xf7, 0xcf, 0x19, 0xf7, 0xc1, 0xf6, + 0xb0, 0x7d, 0x59, 0x51, 0x81, 0xdd, 0x70, 0x89, + 0xc4, 0xbd, 0x5a, 0x06, 0x93, 0xb2, 0x85, 0xec, + 0x71, 0x80, 0x78, 0xba, 0xca, 0x20, 0x9c, 0xe8, + 0xed, 0x2c, 0xe9, 0x8c, 0x62, 0xa5, 0x02, 0x30, + 0x0a, 0xa4, 0x8e, 0x47, 0x66, 0x2d, 0x56, 0x21, + 0x38, 0x05, 0xc2, 0xa9, 0x81, 0xcb, 0xda, 0x70, + 0x06, 0x18, 0x8b, 0x87, 0x8a, 0x83, 0x8b, 0x07, + 0x00, 0x00, 0x00, 0x03, 0x5b, 0x5a, 0x02, 0x48, + 0x74, 0x44, 0x7e, 0x9b, 0xfe, 0xd8, 0xdc, 0x80, + 0x43, 0x3e, 0xf0, 0x2b, 0x0a, 0x49, 0x74, 0xd7, + 0x95, 0x93, 0xa3, 0xef, 0xc9, 0x3d, 0x17, 0xdb, + 0x8e, 0xd2, 0xd4, 0xf7, 0xfc, 0x83, 0x3c, 0x67, + 0xdf, 0x3c, 0x67, 0xdf, 0x3c, 0x67, 0xdf, 0x3c, + 0x67, 0xdf, 0x3c, 0x67, 0xdf, 0x0c, 0x8c, 0x45, + 0x38, 0x9f, 0xce, 0x35, 0x0a, 0xaa, 0x15, 0x7f, + 0xc8, 0xdc, 0x12, 0xdd, 0x07, 0xb3, 0x86, 0xe8, + 0xde, 0xba, 0xe9, 0x96, 0xc1, 0x5a, 0xe1, 0x32, + 0x64, 0x25, 0x81, 0xfe, 0x31, 0x9d, 0x20, 0x9c, + 0xba, 0x5f, 0xba, 0xbf, 0xe2, 0xf1, 0xfe, 0x9f, + 0x58, 0xaa, 0x64, 0x35, 0xca, 0xe5, 0x72, 0xb9, + 0x5c, 0xae, 0x57, 0x2b, 0x95, 0xca, 0xe5, 0x72, + 0xb9, 0x5c, 0xae, 0x57, 0x2b, 0x95, 0xca, 0xe5, + 0x72, 0xb9, 0x5c, 0xae, 0x57, 0x2b, 0x95, 0xca, + 0xe7, 0xf6, 0x4f, 0xf8, 0x60, 0x6b, 0x34, 0x5e, + 0x19, 0xf7, 0x7f, 0x6f, 0xd4, 0x2c, 0xa0, 0xca, + 0xb4, 0x03, 0xaa, 0xa8, 0x61, 0x15, 0x50, 0x2e, + 0x5b, 0x3d, 0x4e, 0xa4, 0xc7, 0x0d, 0x03, 0x34, + 0xc0, 0x81, 0x5b, 0xb4, 0x0d, 0xf4, 0x31, 0xe8, + 0xe0, 0xcb, 0x35, 0x3f, 0xb0, 0xf5, 0xd2, 0xe4, + 0xd1, 0xec, 0xcf, 0x08, 0xc9, 0x00, 0x81, 0xda, + 0x64, 0x3e, 0xe2, 0xac, 0x00, 0xac, 0x8d, 0x80, + 0xe2, 0xb8, 0xce, 0x34, 0x5c, 0x21, 0xb9, 0x29, + 0x6d, 0x7c, 0xea, 0xa8, 0x60, 0xe1, 0xfd, 0x9c, + 0x9e, 0xc6, 0xc0, 0xe0, 0x3b, 0xc2, 0xe0, 0x1f, + 0x7d, 0x17, 0x54, 0x49, 0xf7, 0x3a, 0xeb, 0x0c, + 0x59, 0x8b, 0x4e, 0x51, 0x67, 0xf3, 0xfa, 0xc7, + 0x5a, 0x26, 0xa6, 0xc8, 0xf8, 0xf5, 0xfa, 0x76, + 0xaa, 0x88, 0xad, 0xd3, 0x66, 0xb3, 0xc9, 0xff, + 0x00, 0xac, 0xf2, 0x7f, 0xeb, 0x3c, 0x9f, 0xfa, + 0xcf, 0x27, 0xfe, 0xb3, 0xc9, 0xff, 0x00, 0xac, + 0xf2, 0x7f, 0xeb, 0x3c, 0x9f, 0xfa, 0xcf, 0x27, + 0xfe, 0xb3, 0xc9, 0xff, 0x00, 0xac, 0xf2, 0x7f, + 0xeb, 0x3c, 0x9f, 0xfa, 0xcf, 0x27, 0xfe, 0xb3, + 0xc9, 0xff, 0x00, 0xac, 0xf2, 0x7f, 0xeb, 0x3c, + 0x9f, 0xfa, 0xcf, 0x27, 0xfe, 0xb3, 0xc9, 0xff, + 0x00, 0xac, 0xf2, 0x7f, 0xeb, 0x3c, 0x9f, 0xfa, + 0xcf, 0x27, 0xfe, 0xb3, 0xc9, 0xff, 0x00, 0xac, + 0xea, 0xa5, 0x3a, 0xa8, 0x35, 0xf7, 0x3e, 0x8f, + 0x37, 0x73, 0xfd, 0xb0, 0x40, 0x00, 0x00, 0x0d, + 0xfe, 0xe9, 0xff, 0x00, 0x0c, 0xde, 0x8a, 0x84, + 0x9c, 0x80, 0x1a, 0x2e, 0x43, 0xa9, 0x95, 0x2e, + 0xd3, 0x54, 0x14, 0xfb, 0x71, 0xff, 0x00, 0x1d, + 0x1a, 0x34, 0x68, 0xd1, 0xa3, 0x46, 0x8d, 0x1a, + 0x22, 0x60, 0xa4, 0xf5, 0x84, 0xea, 0xa1, 0x9a, + 0xa7, 0x32, 0x40, 0xfa, 0x51, 0xa2, 0xae, 0x80, + 0x99, 0x36, 0x93, 0x5d, 0x47, 0x6f, 0xa0, 0x10, + 0x03, 0xf5, 0x51, 0xa3, 0x46, 0x8d, 0x17, 0xbd, + 0xd1, 0x69, 0xd4, 0x40, 0x27, 0xbb, 0x67, 0x6c, + 0x23, 0x03, 0x5b, 0x65, 0x82, 0xf5, 0x7f, 0x3f, + 0xe3, 0xbb, 0xf8, 0xfd, 0x14, 0x74, 0x52, 0xcb, + 0x65, 0x31, 0xa5, 0x17, 0x68, 0x37, 0x94, 0x88, + 0x1c, 0xe8, 0xc6, 0x1c, 0xb1, 0x8e, 0x50, 0x1e, + 0xc0, 0x6f, 0x81, 0x45, 0x8e, 0x0e, 0xaa, 0xb4, + 0x61, 0x22, 0xc5, 0x82, 0x82, 0x54, 0xd6, 0xf5, + 0xfe, 0x2f, 0x1f, 0xe9, 0xf4, 0x58, 0xba, 0xd6, + 0x06, 0x99, 0x4c, 0xa6, 0x53, 0x29, 0x94, 0xca, + 0x65, 0x32, 0x99, 0x4c, 0xa6, 0x53, 0x29, 0x94, + 0xca, 0x65, 0x32, 0x99, 0x4c, 0xa6, 0x53, 0x29, + 0x94, 0xca, 0x65, 0x32, 0x99, 0x4c, 0x76, 0x02, + 0x0a, 0x68, 0x34, 0x55, 0xf4, 0x0d, 0xfe, 0xd8, + 0xc3, 0x92, 0x96, 0x0e, 0x67, 0xd3, 0xd5, 0x73, + 0xe1, 0x32, 0xf8, 0x4c, 0xbe, 0x13, 0x2f, 0x84, + 0xcb, 0xe1, 0x32, 0xf8, 0x4c, 0xbe, 0x13, 0x2f, + 0x84, 0xcb, 0xe1, 0x32, 0xf8, 0x4c, 0xbe, 0x13, + 0x2f, 0x84, 0xcb, 0xe1, 0x32, 0xf8, 0x4c, 0xbe, + 0x13, 0x2f, 0x84, 0xcb, 0xe1, 0x32, 0xf8, 0x4c, + 0xbe, 0x13, 0x2f, 0x84, 0xc8, 0x74, 0x43, 0xe4, + 0x6d, 0x3d, 0x1b, 0xac, 0x8e, 0x84, 0xbe, 0xaf, + 0x07, 0x52, 0xe2, 0xbd, 0x7f, 0xaf, 0xf1, 0xdc, + 0x85, 0xe3, 0x48, 0x85, 0xbc, 0xae, 0x0a, 0x95, + 0xe8, 0x57, 0xa6, 0x3a, 0xe8, 0x09, 0x55, 0x76, + 0x84, 0xd2, 0xdb, 0xde, 0x01, 0x57, 0x03, 0xa0, + 0xc7, 0x6f, 0x21, 0xe6, 0xc2, 0x1d, 0x15, 0x74, + 0x7f, 0x8b, 0xc7, 0xfa, 0x7d, 0x16, 0x7f, 0xc7, + 0xfd, 0xb8, 0x2a, 0x28, 0xc9, 0xca, 0x1b, 0x4c, + 0xf1, 0xb9, 0xe3, 0x73, 0xc6, 0xe7, 0x8d, 0xcf, + 0x1b, 0x9e, 0x37, 0x3c, 0x6e, 0x78, 0xdc, 0xbd, + 0xa7, 0x6a, 0x18, 0x49, 0xf5, 0x6c, 0x39, 0xc4, + 0x7d, 0x16, 0xf4, 0x23, 0xea, 0xf4, 0xf5, 0x39, + 0x11, 0xca, 0x32, 0x70, 0xa5, 0x00, 0xd2, 0x4a, + 0x3a, 0x38, 0xfc, 0xd1, 0x6c, 0x2a, 0x6d, 0x01, + 0x43, 0xa6, 0x20, 0x96, 0xd9, 0xd0, 0xc5, 0xba, + 0xe9, 0x37, 0x67, 0x18, 0x9b, 0x16, 0x27, 0x9e, + 0x81, 0x0f, 0xdf, 0x25, 0x33, 0x76, 0x42, 0x09, + 0x40, 0x4d, 0x23, 0xfb, 0xe7, 0x8d, 0xcf, 0x1b, + 0x9e, 0x37, 0x3c, 0x6e, 0x78, 0xdc, 0xf1, 0xb9, + 0xe3, 0x71, 0xd4, 0xdc, 0x3d, 0x14, 0x23, 0xfb, + 0x57, 0xf3, 0xf4, 0xd5, 0x38, 0x86, 0xf2, 0x5d, + 0xbd, 0x73, 0xc3, 0xf8, 0xb3, 0xc3, 0xf8, 0xb3, + 0xc3, 0xf8, 0xb3, 0xc3, 0xf8, 0xb3, 0xc3, 0xf8, + 0xb3, 0xc3, 0xf8, 0xb3, 0xc3, 0xf8, 0xb3, 0xc3, + 0xf8, 0xb3, 0xc3, 0xf8, 0xb3, 0xc3, 0xf8, 0xb3, + 0xc3, 0xf8, 0xb3, 0xc3, 0xf8, 0xb3, 0xc3, 0xf8, + 0xb3, 0xc3, 0xf8, 0xb3, 0xc3, 0xf8, 0xb3, 0xc3, + 0xf8, 0xb3, 0xc3, 0xf8, 0xb3, 0xc3, 0xf8, 0xb3, + 0xc3, 0xf8, 0xb3, 0xc3, 0xf8, 0xb3, 0xc3, 0xf8, + 0xb2, 0x15, 0xd1, 0xc0, 0x54, 0x16, 0x0e, 0xdf, + 0x5b, 0xfc, 0x7f, 0xdb, 0x83, 0x8d, 0xa5, 0x0f, + 0xf0, 0x8e, 0xee, 0xee, 0xee, 0xe8, 0xa9, 0x54, + 0x75, 0xb9, 0xf1, 0x96, 0x89, 0xcd, 0x70, 0x68, + 0x1d, 0xca, 0x87, 0x47, 0x28, 0xe0, 0x39, 0xa5, + 0xca, 0xb6, 0x1b, 0xaf, 0x39, 0xbd, 0xe1, 0xc2, + 0x5a, 0x05, 0xe0, 0x00, 0x8d, 0x03, 0xeb, 0x95, + 0x9b, 0xd3, 0xf9, 0x09, 0x6f, 0xf0, 0xcd, 0xff, + 0x00, 0xb8, 0x32, 0x72, 0x0e, 0x42, 0x6b, 0x48, + 0x7a, 0x61, 0x63, 0x43, 0x0f, 0xf0, 0x0e, 0xee, + 0xee, 0xee, 0xc7, 0x08, 0x37, 0xfe, 0x0a, 0xe7, + 0xa4, 0x29, 0xc2, 0x5b, 0x0c, 0x41, 0xd5, 0x54, + 0x62, 0x23, 0x95, 0xa7, 0x1f, 0xcd, 0x08, 0x20, + 0x08, 0x19, 0x42, 0x51, 0x0b, 0x90, 0xb8, 0xb7, + 0x62, 0x70, 0x4f, 0x60, 0x1c, 0x9a, 0x83, 0x33, + 0x76, 0x32, 0x32, 0x41, 0x1c, 0xc2, 0xce, 0xc0, + 0x5d, 0x0a, 0xb8, 0x22, 0xb1, 0xb5, 0x1c, 0x6c, + 0x72, 0x10, 0x46, 0xba, 0x70, 0xcb, 0x59, 0x34, + 0xc8, 0x4d, 0x28, 0x02, 0x84, 0x22, 0xc8, 0xb3, + 0x18, 0x5f, 0x66, 0x91, 0x5a, 0x09, 0x62, 0xbf, + 0x7c, 0x16, 0x12, 0x0e, 0x90, 0xb8, 0x00, 0x89, + 0xca, 0x9a, 0x22, 0x23, 0x05, 0x03, 0xc4, 0x00, + 0xc4, 0x80, 0x22, 0x94, 0x05, 0xc4, 0xd6, 0x94, + 0x9d, 0x09, 0x30, 0x0d, 0x10, 0x4a, 0x59, 0x81, + 0x79, 0xd6, 0xe1, 0x03, 0x15, 0x20, 0x97, 0x67, + 0x23, 0x44, 0x11, 0x3f, 0x57, 0x8f, 0xf4, 0xfa, + 0xdf, 0x14, 0xff, 0x00, 0x6c, 0x20, 0x00, 0x00, + 0x04, 0xc5, 0x2a, 0x39, 0x5c, 0x07, 0xef, 0xc7, + 0xef, 0x89, 0xb9, 0x60, 0xa2, 0x27, 0x23, 0x9f, + 0x67, 0xf8, 0xcf, 0xb3, 0xfc, 0x67, 0xd9, 0xfe, + 0x33, 0xec, 0xff, 0x00, 0x19, 0xf6, 0x7f, 0x8c, + 0xfb, 0x3f, 0xc6, 0x7d, 0x9f, 0xe3, 0x18, 0x16, + 0xa1, 0xda, 0x0b, 0x6a, 0xf2, 0xbd, 0x70, 0x58, + 0x89, 0x0d, 0xc9, 0xc4, 0x7a, 0x4e, 0xc6, 0xb1, + 0x4d, 0x42, 0x1b, 0x24, 0xb9, 0x46, 0x29, 0x51, + 0x77, 0x82, 0xc9, 0xc0, 0x86, 0xce, 0x2a, 0x16, + 0x3a, 0x55, 0x99, 0x40, 0x84, 0x62, 0x0a, 0xda, + 0xae, 0x0a, 0x72, 0x99, 0x64, 0x08, 0x3b, 0xaa, + 0x01, 0x42, 0x69, 0xdc, 0xf4, 0xc5, 0x20, 0x32, + 0x5d, 0xc1, 0x4f, 0x58, 0x33, 0xec, 0xff, 0x00, + 0x19, 0xf6, 0x7f, 0x8c, 0xfb, 0x3f, 0xc6, 0x7d, + 0x9f, 0xe3, 0x3e, 0xcf, 0xf1, 0x9f, 0x67, 0xf8, + 0xcf, 0xb3, 0xfc, 0x65, 0xde, 0x02, 0x53, 0x98, + 0x01, 0xea, 0x42, 0xfd, 0x04, 0xbf, 0xea, 0xcb, + 0x04, 0xe9, 0x2b, 0x82, 0xec, 0xd9, 0x42, 0xe9, + 0x48, 0xcb, 0x71, 0x83, 0x45, 0x91, 0x06, 0xee, + 0xb0, 0x15, 0x8d, 0x2b, 0x92, 0x3c, 0xde, 0x02, + 0xea, 0x82, 0xb7, 0x11, 0xec, 0x30, 0x6d, 0xae, + 0x35, 0x76, 0x84, 0x29, 0x35, 0x1a, 0x9b, 0x97, + 0x06, 0x66, 0x11, 0x8c, 0x95, 0x80, 0xd0, 0x69, + 0xd9, 0x46, 0x7e, 0xf0, 0x21, 0x2b, 0xde, 0x54, + 0x3a, 0x09, 0xd2, 0x93, 0x4a, 0x89, 0x79, 0x65, + 0x87, 0x2c, 0x36, 0xce, 0x31, 0x68, 0x7a, 0x8f, + 0x27, 0x51, 0x6f, 0xee, 0x1c, 0xb8, 0xc9, 0xc7, + 0xbf, 0x3c, 0x30, 0x0d, 0x6b, 0x23, 0x67, 0xa4, + 0xe0, 0x59, 0x29, 0x30, 0x15, 0x8d, 0x1d, 0x14, + 0xea, 0x06, 0x25, 0xf0, 0x15, 0x36, 0xef, 0x9f, + 0xd4, 0x1a, 0x74, 0xfc, 0x3f, 0x41, 0x9f, 0x9b, + 0xfe, 0xd8, 0x20, 0x00, 0x00, 0x03, 0x9e, 0x31, + 0x08, 0x8c, 0x22, 0x38, 0x32, 0x28, 0xd8, 0xba, + 0xc5, 0x9b, 0x7a, 0x39, 0xff, 0x00, 0x56, 0x85, + 0x0a, 0x14, 0x28, 0x50, 0xa1, 0x42, 0x85, 0x0a, + 0x14, 0x28, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x14, + 0x0d, 0xda, 0xdc, 0x5f, 0xe4, 0x2f, 0x2b, 0x42, + 0xfe, 0xd2, 0x0b, 0x5a, 0xbb, 0x76, 0xf7, 0x7e, + 0x9a, 0xdd, 0x6f, 0xed, 0x45, 0x55, 0xd3, 0x56, + 0x78, 0x17, 0xbe, 0x78, 0x17, 0xbe, 0x78, 0x17, + 0xbe, 0x78, 0x17, 0xbe, 0x78, 0x17, 0xbe, 0x78, + 0x17, 0xbe, 0x17, 0xa0, 0x15, 0x7b, 0xd7, 0x64, + 0x3a, 0x08, 0x9d, 0x13, 0x12, 0x2b, 0x2e, 0xd5, + 0xd9, 0xfd, 0xe7, 0x81, 0x7b, 0xe7, 0x81, 0x7b, + 0xe7, 0x81, 0x7b, 0xe7, 0x81, 0x7b, 0xe7, 0x81, + 0x7b, 0xe7, 0x81, 0x7b, 0xe7, 0x81, 0x7b, 0xe7, + 0x81, 0x7b, 0xe7, 0x81, 0x7b, 0xe7, 0x81, 0x7b, + 0xe7, 0x81, 0x7b, 0xe7, 0x81, 0x7b, 0xe7, 0x81, + 0x7b, 0xe0, 0x7c, 0xa0, 0xf7, 0x82, 0x87, 0x49, + 0xbb, 0xe8, 0x3f, 0xdc, 0x7d, 0x0f, 0xf6, 0x4f, + 0xf8, 0x67, 0x8c, 0xed, 0xfa, 0x5d, 0x4b, 0x53, + 0xe8, 0x21, 0x0b, 0xd8, 0x70, 0xb9, 0x5c, 0x84, + 0xb5, 0x5a, 0x08, 0x6c, 0x74, 0x03, 0xa7, 0xa5, + 0xc7, 0xac, 0x90, 0xa8, 0x84, 0x64, 0xd8, 0x00, + 0x21, 0xe6, 0x37, 0x19, 0x4d, 0xb7, 0xdf, 0x72, + 0x29, 0x06, 0x8b, 0x79, 0x76, 0x98, 0x34, 0x9e, + 0x04, 0xd1, 0x15, 0x1a, 0xa5, 0x6a, 0x4c, 0xb5, + 0x82, 0xc1, 0x4d, 0xb4, 0x80, 0x11, 0x04, 0x85, + 0xe9, 0x02, 0xc8, 0x79, 0x19, 0x81, 0x60, 0x02, + 0x59, 0x4b, 0x64, 0xc4, 0xc4, 0xdc, 0xa1, 0xd9, + 0x5a, 0x78, 0x88, 0x3a, 0x42, 0x0d, 0xf4, 0x09, + 0x65, 0xe7, 0xac, 0xf6, 0x7a, 0x8d, 0xe5, 0xc1, + 0xdb, 0x0a, 0x51, 0xe0, 0x4d, 0x10, 0x70, 0xd1, + 0x41, 0x90, 0x70, 0x7f, 0x39, 0xf2, 0xec, 0x80, + 0x94, 0xe3, 0xd5, 0x1c, 0x1f, 0x4c, 0x5a, 0x61, + 0x58, 0x32, 0x28, 0x6d, 0x2f, 0x62, 0x7f, 0x8f, + 0x80, 0x64, 0xe6, 0xa1, 0xe4, 0xcd, 0x84, 0xd0, + 0x98, 0xb7, 0x66, 0xf5, 0x1e, 0x6e, 0xd8, 0x97, + 0x52, 0xad, 0x8c, 0x09, 0x22, 0x5c, 0x29, 0x5c, + 0x9c, 0xc6, 0x86, 0xc9, 0xc3, 0xbc, 0x37, 0xb7, + 0x7c, 0x1e, 0x2d, 0xf8, 0xb5, 0x0e, 0x52, 0x92, + 0xf1, 0x5d, 0xf0, 0x1c, 0x6d, 0x96, 0x88, 0x20, + 0xbc, 0x10, 0xe8, 0x52, 0xe5, 0x9c, 0xdd, 0xdd, + 0x27, 0x3c, 0x84, 0x8b, 0xa9, 0x39, 0x33, 0x36, + 0x08, 0x23, 0xc4, 0x12, 0x15, 0x2a, 0xad, 0x53, + 0x82, 0xae, 0x5e, 0x1c, 0x21, 0x47, 0xa8, 0xc3, + 0x74, 0x1a, 0x0d, 0x14, 0x33, 0x9d, 0x3d, 0xc0, + 0x07, 0xac, 0x09, 0x04, 0x1c, 0x82, 0x4c, 0x0e, + 0x77, 0xa2, 0x2c, 0xd6, 0x71, 0x48, 0x81, 0x67, + 0x01, 0x15, 0x07, 0xf3, 0x13, 0x41, 0x15, 0xe8, + 0x2b, 0xa5, 0x99, 0x29, 0xc2, 0x81, 0x31, 0x0a, + 0xd8, 0x74, 0x00, 0xd8, 0xb4, 0x2c, 0x70, 0x02, + 0x0a, 0x4d, 0xb3, 0x69, 0x94, 0x0e, 0x48, 0x99, + 0x17, 0xc8, 0xc4, 0x99, 0xa2, 0xa0, 0xc9, 0x45, + 0x52, 0x08, 0xdc, 0x6d, 0x7a, 0xbe, 0x0d, 0x20, + 0x6c, 0xd0, 0x5e, 0x22, 0xa6, 0xe5, 0x7f, 0xf8, + 0x33, 0xdb, 0xa1, 0xfe, 0xf9, 0xff, 0x00, 0x0c, + 0xd2, 0xa1, 0x5f, 0x16, 0x35, 0xfd, 0xc7, 0x7d, + 0xfd, 0x3f, 0x49, 0x19, 0xa7, 0x66, 0xda, 0x15, + 0x21, 0x38, 0x2b, 0x53, 0x58, 0xec, 0xb4, 0xe9, + 0x04, 0x55, 0xa4, 0xc5, 0x22, 0x05, 0x26, 0x2d, + 0xbf, 0x31, 0x70, 0x28, 0x90, 0x3a, 0x72, 0x8e, + 0xcb, 0x8c, 0x64, 0xf2, 0xb4, 0x18, 0x16, 0x9e, + 0x00, 0xf0, 0x57, 0x68, 0xc0, 0x5a, 0x81, 0x0c, + 0xaa, 0x08, 0x86, 0xd2, 0xc4, 0xe3, 0x78, 0x7e, + 0x2f, 0x0b, 0xcc, 0x06, 0x92, 0x50, 0xb3, 0x66, + 0xde, 0x85, 0x30, 0x28, 0xad, 0xf1, 0x72, 0xb8, + 0x61, 0xa1, 0x76, 0xc3, 0x8b, 0x9c, 0x4a, 0xb7, + 0x44, 0x00, 0x0c, 0x6b, 0x2e, 0xb8, 0xce, 0x63, + 0xff, 0x00, 0xc8, 0x15, 0xcd, 0x01, 0xda, 0x2d, + 0xe0, 0x99, 0x33, 0x53, 0x23, 0x5f, 0xae, 0x00, + 0xc3, 0xcc, 0x35, 0x97, 0x46, 0xcc, 0x6e, 0xe4, + 0xd1, 0x47, 0x0b, 0xbf, 0x5e, 0x3b, 0x3d, 0xcc, + 0x20, 0x59, 0x02, 0x45, 0x34, 0x57, 0xf5, 0x2c, + 0x32, 0xf1, 0x43, 0x21, 0x3b, 0xa2, 0xc7, 0x8b, + 0x3e, 0x9a, 0x05, 0x60, 0xea, 0xe1, 0xdb, 0x45, + 0x3b, 0xef, 0xb7, 0xe8, 0xa9, 0xbd, 0x17, 0x0b, + 0x64, 0x4d, 0x02, 0x6d, 0xf4, 0x32, 0x95, 0x86, + 0x72, 0x32, 0x22, 0x54, 0x02, 0x47, 0x85, 0xda, + 0xa9, 0xbc, 0xae, 0xae, 0x01, 0x53, 0xf7, 0x09, + 0xfb, 0xe0, 0xac, 0xa1, 0xe3, 0xd3, 0xb4, 0x0d, + 0x8a, 0x5a, 0xf5, 0xc2, 0x9e, 0x79, 0x52, 0xca, + 0x0e, 0xf0, 0x11, 0x05, 0xd2, 0x71, 0xfc, 0xa4, + 0xec, 0x22, 0xab, 0x24, 0x16, 0x24, 0x3d, 0x46, + 0x18, 0xb3, 0x84, 0x03, 0x6e, 0x28, 0x00, 0x6c, + 0xe9, 0xbd, 0xb1, 0xf5, 0x91, 0x09, 0x2b, 0x09, + 0x40, 0x84, 0x11, 0x86, 0xf4, 0x5d, 0xf6, 0xa0, + 0x38, 0x4f, 0x73, 0xaa, 0x88, 0xad, 0xa0, 0x63, + 0xb9, 0x5b, 0x0e, 0xf0, 0x81, 0xe9, 0x11, 0x8c, + 0x1e, 0x7a, 0x41, 0xfd, 0x19, 0x38, 0xb5, 0x35, + 0xae, 0x97, 0xed, 0x8c, 0x42, 0x26, 0x03, 0xb1, + 0x3b, 0x71, 0x6d, 0x72, 0xf7, 0x30, 0x8e, 0x41, + 0xf7, 0x82, 0xee, 0x0d, 0x69, 0x5d, 0xd0, 0x56, + 0x55, 0xd9, 0x9c, 0x05, 0x54, 0xd2, 0x08, 0xa4, + 0x90, 0xe1, 0xc0, 0xf2, 0x7b, 0x01, 0x20, 0x02, + 0x96, 0x3b, 0x8b, 0xfa, 0x34, 0xa2, 0x60, 0x1d, + 0x92, 0x73, 0x15, 0xa3, 0xd4, 0x47, 0xeb, 0x14, + 0x60, 0x30, 0xc8, 0x64, 0x32, 0x19, 0x0c, 0x86, + 0x43, 0x21, 0x90, 0xc8, 0x64, 0x32, 0x19, 0x0c, + 0x86, 0x43, 0x21, 0x90, 0xc8, 0x64, 0x32, 0x19, + 0x0c, 0x86, 0x43, 0x21, 0x90, 0xc8, 0x67, 0xf6, + 0x0f, 0xf8, 0x60, 0xe5, 0x85, 0x38, 0x0e, 0x05, + 0xbe, 0x95, 0x32, 0x1c, 0x8b, 0x47, 0xcf, 0x41, + 0x6b, 0xfd, 0x42, 0x8a, 0x28, 0xa2, 0x8a, 0x28, + 0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28, 0xa2, 0x8a, + 0x29, 0x91, 0x27, 0xb3, 0xcc, 0xe8, 0x7e, 0xe6, + 0x29, 0xf4, 0xd5, 0x25, 0xe9, 0xc1, 0xc7, 0xd1, + 0x53, 0xa0, 0xa2, 0x07, 0x06, 0xd9, 0xf7, 0x31, + 0x51, 0x47, 0x72, 0xbf, 0x62, 0x83, 0x3e, 0xf9, + 0xf1, 0x5f, 0x8e, 0x7c, 0x57, 0xe3, 0x9f, 0x15, + 0xf8, 0xe7, 0xc5, 0x7e, 0x39, 0xf1, 0x5f, 0x8e, + 0x7c, 0x57, 0xe3, 0x9f, 0x15, 0xf8, 0xe7, 0xc5, + 0x7e, 0x39, 0xf1, 0x5f, 0x8e, 0x7c, 0x57, 0xe3, + 0x9f, 0x15, 0xf8, 0xe7, 0xc5, 0x7e, 0x39, 0xf1, + 0x5f, 0x8e, 0x7c, 0x57, 0xe3, 0x9f, 0x15, 0xf8, + 0xe7, 0xc5, 0x7e, 0x39, 0xf1, 0x5f, 0x8e, 0x7c, + 0x57, 0xe3, 0x9f, 0x15, 0xf8, 0xe6, 0xc7, 0x34, + 0x8c, 0x7a, 0x45, 0x13, 0xd2, 0xc7, 0x27, 0x13, + 0x04, 0x33, 0xf0, 0xba, 0x07, 0x6f, 0xa0, 0xc9, + 0x4d, 0xfa, 0x42, 0x74, 0x55, 0x00, 0xe5, 0x71, + 0x2d, 0xa3, 0x9a, 0x9f, 0xb3, 0xbe, 0x37, 0xd1, + 0x9e, 0xb7, 0xf3, 0x9e, 0x53, 0xf9, 0xcf, 0x29, + 0xfc, 0xe7, 0x94, 0xfe, 0x73, 0xca, 0x7f, 0x39, + 0xe5, 0x3f, 0x9c, 0xf2, 0x9f, 0xce, 0x79, 0x4f, + 0xe7, 0x3c, 0xa7, 0xf3, 0x9e, 0x53, 0xf9, 0xcf, + 0x29, 0xfc, 0xe7, 0x94, 0xfe, 0x73, 0xca, 0x7f, + 0x39, 0xe5, 0x3f, 0x9c, 0xf2, 0x9f, 0xce, 0x79, + 0x4f, 0xe7, 0x3c, 0xa7, 0xf3, 0x9e, 0x53, 0xf9, + 0xcf, 0x29, 0xfc, 0xe7, 0x94, 0xfe, 0x73, 0xca, + 0x7f, 0x39, 0xe5, 0x3f, 0x9c, 0xf2, 0x9f, 0xce, + 0x0a, 0x62, 0x6a, 0x70, 0xe3, 0xff, 0x00, 0xa2, + 0x30, 0x51, 0x90, 0xcc, 0x31, 0xd2, 0x28, 0x76, + 0xe8, 0x61, 0x24, 0x6e, 0xe2, 0xae, 0x3a, 0x61, + 0xe8, 0x1b, 0xc1, 0x9b, 0x67, 0xbf, 0xfe, 0xf9, + 0xe0, 0x7e, 0xf9, 0xe0, 0x7e, 0xf9, 0xe0, 0x7e, + 0xf9, 0xe0, 0x7e, 0xf9, 0xe0, 0x7e, 0xf9, 0xe0, + 0x7e, 0xf9, 0xe0, 0x7e, 0xf9, 0xe0, 0x7e, 0xf9, + 0xe0, 0x7e, 0xf9, 0xe0, 0x7e, 0xf9, 0xe0, 0x7e, + 0xf9, 0xe0, 0x7e, 0xf9, 0xe0, 0x7e, 0xf9, 0xe0, + 0x7e, 0xf9, 0xe0, 0x7e, 0xf9, 0xe0, 0x7e, 0xf9, + 0xe0, 0x7e, 0xf9, 0xe0, 0x7e, 0xf9, 0xe0, 0x7e, + 0xf9, 0xe0, 0x7e, 0xf8, 0x12, 0x5e, 0x74, 0x52, + 0x58, 0x5b, 0x3b, 0x2e, 0xb0, 0xc8, 0x51, 0x11, + 0xe8, 0xe4, 0xf3, 0x20, 0x2f, 0x03, 0x95, 0x7d, + 0x00, 0x5f, 0xdb, 0x2e, 0x20, 0x51, 0x07, 0xdf, + 0x84, 0x3b, 0x7f, 0xaa, 0x82, 0x08, 0x20, 0x82, + 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, + 0x82, 0x08, 0x20, 0x58, 0xcd, 0xa1, 0xfc, 0x2a, + 0x6b, 0x14, 0xf4, 0x38, 0xc2, 0x55, 0x3d, 0x75, + 0xb3, 0xd3, 0x01, 0x50, 0x0a, 0xbd, 0x0c, 0x68, + 0x45, 0x0f, 0xe9, 0x28, 0xa6, 0xf8, 0x29, 0xc6, + 0xf3, 0xe0, 0xb2, 0xf8, 0x2c, 0xbe, 0x0b, 0x2f, + 0x82, 0xcb, 0xe0, 0xb2, 0xf8, 0x2c, 0xbe, 0x0b, + 0x2f, 0x82, 0xcb, 0xe0, 0xb2, 0xf8, 0x2c, 0xbe, + 0x0b, 0x2f, 0x82, 0xcb, 0xe0, 0xb2, 0xf8, 0x2c, + 0xbe, 0x0b, 0x2f, 0x82, 0xcb, 0xe0, 0xb2, 0xf8, + 0x2c, 0xbe, 0x0b, 0x2f, 0x82, 0xcb, 0xe0, 0xb2, + 0x14, 0x6c, 0x25, 0xe8, 0xa8, 0xdd, 0x70, 0x27, + 0x7f, 0xe5, 0x7c, 0xa4, 0xfe, 0x44, 0x62, 0x7e, + 0x88, 0xb4, 0x51, 0x25, 0xe0, 0x07, 0xf0, 0xc5, + 0x3a, 0x5c, 0xef, 0x42, 0x66, 0x78, 0xdc, 0x5e, + 0x94, 0x8e, 0xee, 0x9f, 0x56, 0x3a, 0xd7, 0x0e, + 0xf5, 0x8c, 0xcf, 0x26, 0xb9, 0x44, 0x8b, 0xa5, + 0x85, 0xf5, 0xfb, 0xc1, 0x66, 0xde, 0xca, 0xe9, + 0xff, 0x00, 0xac, 0x2d, 0x06, 0x35, 0xd4, 0xe0, + 0x43, 0x6f, 0xf6, 0x60, 0xec, 0x78, 0x3d, 0xcc, + 0xc1, 0x3a, 0xa7, 0x07, 0xed, 0x82, 0xd2, 0x2f, + 0xd7, 0x02, 0x08, 0xbb, 0x07, 0x53, 0x79, 0x2b, + 0xe1, 0xb0, 0xfe, 0x22, 0x23, 0xfb, 0x64, 0x52, + 0x67, 0x0d, 0xd1, 0xd8, 0x07, 0xf5, 0x8d, 0x41, + 0x7f, 0x08, 0x46, 0x71, 0xc1, 0x65, 0x66, 0x50, + 0xff, 0x00, 0x15, 0x96, 0x00, 0x05, 0xe1, 0x3e, + 0xd8, 0xf3, 0xa4, 0x86, 0x16, 0x8a, 0x82, 0x95, + 0x78, 0xb9, 0xac, 0x1b, 0x34, 0x52, 0x2d, 0x38, + 0x44, 0x0e, 0x44, 0xef, 0x89, 0x6c, 0x01, 0x9d, + 0x62, 0x82, 0x0d, 0xd4, 0x77, 0x8c, 0x34, 0xa6, + 0x77, 0x48, 0x6a, 0xfb, 0xaf, 0xdf, 0x24, 0x62, + 0x42, 0x4e, 0xe8, 0x18, 0x67, 0xa2, 0x84, 0x4e, + 0x04, 0x9b, 0x3a, 0x03, 0xcb, 0xac, 0x4c, 0x62, + 0x25, 0x0b, 0x92, 0x4d, 0x8e, 0xcc, 0xc4, 0x51, + 0x80, 0x05, 0xab, 0x12, 0x5b, 0xbe, 0xff, 0x00, + 0xb6, 0x7d, 0xe8, 0xad, 0x57, 0xb0, 0x07, 0xf6, + 0xcf, 0x1b, 0x95, 0x14, 0x8a, 0xf0, 0x81, 0x33, + 0x84, 0x3f, 0xe4, 0x3b, 0x7f, 0xb7, 0x01, 0x75, + 0x83, 0x7b, 0x23, 0x5c, 0xf1, 0xb8, 0x06, 0xec, + 0x69, 0x59, 0x00, 0xf5, 0x57, 0x27, 0x9d, 0x55, + 0x49, 0x65, 0x1d, 0x69, 0x75, 0xad, 0xbb, 0x0e, + 0x34, 0x71, 0xd0, 0xe6, 0xc0, 0x3c, 0x27, 0x38, + 0x58, 0xa1, 0x26, 0xd9, 0x06, 0xbb, 0x2e, 0x8b, + 0x2b, 0x8b, 0x89, 0x91, 0x56, 0xbc, 0x0c, 0xa3, + 0xd5, 0xd6, 0x69, 0x30, 0xaa, 0x47, 0x42, 0x11, + 0x8d, 0xf5, 0x4c, 0x9c, 0x38, 0x67, 0xd8, 0x29, + 0xb7, 0xa3, 0x32, 0xad, 0xa1, 0x93, 0x1c, 0xd2, + 0x43, 0xf9, 0xcb, 0x01, 0x84, 0xfd, 0xe4, 0x45, + 0xe8, 0xe7, 0xae, 0x13, 0x3d, 0x48, 0x5c, 0xba, + 0x56, 0x4f, 0xf9, 0xbd, 0x99, 0x4a, 0xd9, 0xa0, + 0x9e, 0x62, 0x43, 0xf7, 0x73, 0x8e, 0x3c, 0x19, + 0x88, 0x04, 0x4e, 0xa7, 0x4e, 0xb8, 0xf9, 0x0c, + 0x10, 0xfa, 0xa3, 0x00, 0xba, 0xb9, 0xc7, 0x29, + 0x55, 0xe0, 0x02, 0x43, 0x89, 0x7b, 0x3b, 0xe3, + 0xf6, 0xc3, 0xa0, 0x93, 0x84, 0x16, 0xba, 0x63, + 0x7c, 0x98, 0x25, 0xbd, 0x26, 0xbf, 0x9c, 0xe1, + 0xaf, 0x37, 0xae, 0x58, 0x4a, 0x68, 0xe0, 0xbc, + 0x67, 0x6c, 0x7b, 0x05, 0x5d, 0x80, 0x3a, 0xed, + 0x81, 0x28, 0x9e, 0x92, 0x0b, 0xa2, 0xd6, 0xfb, + 0x63, 0x12, 0x08, 0xfb, 0xfb, 0x2b, 0x66, 0x78, + 0xdc, 0x72, 0x42, 0x43, 0xba, 0x42, 0xa7, 0xec, + 0x61, 0x0c, 0x54, 0x09, 0xfb, 0x31, 0x10, 0x30, + 0xab, 0xc0, 0x10, 0x7f, 0x07, 0xf8, 0x3f, 0xff, + 0x00, 0xe5, 0x04, 0xaf, 0x0c, 0x87, 0x22, 0xf7, + 0x74, 0x70, 0x42, 0x06, 0x11, 0x88, 0x81, 0x67, + 0x06, 0xba, 0xd9, 0x93, 0x65, 0x88, 0x9d, 0xe8, + 0x14, 0xd9, 0xb3, 0x3b, 0x63, 0x1c, 0xaa, 0xec, + 0x01, 0xd7, 0x6c, 0xe0, 0x5b, 0x15, 0x5a, 0x80, + 0x0b, 0xe8, 0x4c, 0x8f, 0xbb, 0xd9, 0x4b, 0x08, + 0x81, 0x6b, 0xdb, 0x02, 0xa7, 0x3a, 0xe9, 0x97, + 0x4e, 0x4d, 0x17, 0x9e, 0x9f, 0xe0, 0xff, 0x00, + 0xfd, 0x46, 0x14, 0x07, 0x62, 0x6c, 0x70, 0x15, + 0x88, 0x67, 0xaa, 0x17, 0xfb, 0x7e, 0x98, 0xcd, + 0xc5, 0x61, 0x9e, 0x07, 0xa7, 0x0a, 0x39, 0xc0, + 0x3e, 0x9b, 0x47, 0xb8, 0x1e, 0xa9, 0x48, 0xe5, + 0xd5, 0x27, 0xa7, 0xbe, 0x3b, 0x47, 0x10, 0xfa, + 0xc5, 0xca, 0xb7, 0x36, 0x7e, 0xec, 0x00, 0xa4, + 0x7c, 0xc8, 0x7e, 0x25, 0x98, 0x96, 0x0d, 0x80, + 0x3a, 0x13, 0xb0, 0x26, 0x0f, 0x0a, 0x4d, 0xe0, + 0xa5, 0x42, 0xa2, 0x80, 0x03, 0xa5, 0x5a, 0x70, + 0xdf, 0x5c, 0xa2, 0x62, 0x86, 0x22, 0x69, 0xea, + 0xb7, 0x67, 0xa6, 0xb1, 0x65, 0x70, 0xc5, 0x40, + 0xa2, 0xe9, 0x36, 0x27, 0x28, 0x3b, 0x71, 0x86, + 0x11, 0xeb, 0xec, 0xcb, 0xc0, 0x88, 0x41, 0x52, + 0x03, 0xb7, 0xb7, 0x4c, 0xa1, 0xc5, 0x28, 0x32, + 0xf0, 0x06, 0xf6, 0x54, 0xe1, 0x9c, 0x18, 0xc0, + 0xb7, 0x17, 0xde, 0x94, 0x94, 0x51, 0xea, 0x99, + 0x29, 0x52, 0x49, 0x00, 0x0b, 0xd8, 0x09, 0x8b, + 0x5a, 0x31, 0x68, 0x23, 0x5a, 0x4a, 0xb1, 0xcb, + 0x5e, 0x73, 0x5f, 0x35, 0x58, 0x08, 0x4f, 0x78, + 0x0a, 0x0e, 0x8a, 0xb9, 0x4d, 0x8e, 0x84, 0xd2, + 0xe4, 0x00, 0xd7, 0x5e, 0x53, 0xbb, 0x83, 0x0b, + 0xb0, 0x67, 0x1a, 0x6a, 0x0b, 0xa0, 0xf7, 0xde, + 0x75, 0xa8, 0x9f, 0xdf, 0x4c, 0x02, 0x53, 0xa6, + 0x1d, 0x35, 0x8b, 0x4e, 0x55, 0xea, 0xb8, 0x20, + 0x3c, 0x84, 0xe3, 0x21, 0x50, 0x85, 0x57, 0x04, + 0x8f, 0x33, 0x65, 0x48, 0x5e, 0x3e, 0x8c, 0x14, + 0xf8, 0x96, 0x7f, 0x71, 0xff, 0x00, 0x0c, 0x62, + 0x39, 0x4f, 0x2f, 0x95, 0xc5, 0x1a, 0xb6, 0x74, + 0x03, 0xb7, 0xa1, 0xcf, 0xed, 0x83, 0x5e, 0x74, + 0x03, 0x48, 0xc8, 0x02, 0x57, 0xa5, 0x76, 0xce, + 0x86, 0x50, 0xaa, 0x40, 0x4b, 0xdd, 0x0f, 0x57, + 0x77, 0x08, 0x61, 0x65, 0xd0, 0x3c, 0x38, 0x2a, + 0xc7, 0x93, 0x47, 0x06, 0x12, 0x2e, 0x9d, 0xdc, + 0x90, 0x7d, 0x36, 0x8b, 0xc2, 0x93, 0x6b, 0x8e, + 0x3d, 0x0a, 0x29, 0x6a, 0x36, 0x68, 0x9a, 0xe8, + 0xa7, 0x0e, 0x2d, 0x8b, 0x42, 0xc2, 0x15, 0x70, + 0x67, 0x93, 0x70, 0x1c, 0x64, 0xb0, 0x04, 0x29, + 0xd5, 0x48, 0x8d, 0x61, 0xd3, 0x56, 0x18, 0x61, + 0x48, 0x73, 0xc8, 0x3d, 0x67, 0x2b, 0x38, 0x5c, + 0xb0, 0xa5, 0xd8, 0x25, 0x3a, 0x1e, 0xa2, 0x05, + 0xaa, 0x14, 0x75, 0x5c, 0x3b, 0xeb, 0x5a, 0xd3, + 0xd5, 0xcb, 0x89, 0x63, 0x55, 0xdd, 0x73, 0x11, + 0x29, 0x77, 0x0c, 0xb1, 0xf8, 0xd9, 0xae, 0x80, + 0xd8, 0x85, 0x44, 0xd9, 0x2e, 0x15, 0x5c, 0x2f, + 0x5d, 0xcc, 0x9d, 0xbc, 0x82, 0xf7, 0xf5, 0xce, + 0x0e, 0x0e, 0x22, 0x1e, 0xc0, 0x18, 0x07, 0x1b, + 0xee, 0xe6, 0xc1, 0x2e, 0x07, 0xea, 0x23, 0x4e, + 0x67, 0x4f, 0x64, 0xc9, 0x5d, 0x70, 0x48, 0x1a, + 0xeb, 0x0a, 0x16, 0xaa, 0xf7, 0xcb, 0x26, 0xd6, + 0x7b, 0xfc, 0x74, 0x09, 0x0d, 0x27, 0x7c, 0xbe, + 0x7e, 0x58, 0x2a, 0x8e, 0xd3, 0x63, 0xd5, 0x92, + 0x37, 0x46, 0x01, 0x7c, 0xd4, 0xae, 0x88, 0x3b, + 0x17, 0x91, 0xbb, 0xcf, 0x95, 0xc0, 0xd6, 0xba, + 0x17, 0xed, 0x8d, 0xbc, 0x0d, 0x30, 0xd2, 0x01, + 0x3f, 0x7f, 0xf0, 0x7f, 0xff, 0x00, 0xff, 0x00, + 0xff, 0x00, 0x6d, 0x50, 0x08, 0x10, 0x08, 0x12, + 0xee, 0x6f, 0x4f, 0x5c, 0x0f, 0x48, 0x08, 0xe6, + 0x87, 0xbd, 0x91, 0xfb, 0xb0, 0xd4, 0x12, 0xfb, + 0x76, 0xc7, 0x09, 0x2d, 0x69, 0x81, 0xc6, 0x5f, + 0xef, 0xb3, 0xdf, 0xe3, 0x62, 0x24, 0x34, 0x9d, + 0xf0, 0x49, 0xb2, 0x70, 0xa2, 0x01, 0xf7, 0x07, + 0xd9, 0x73, 0x79, 0x0c, 0xd5, 0xdd, 0x39, 0x10, + 0x0b, 0xef, 0xda, 0x32, 0x6c, 0x44, 0x05, 0x51, + 0xd8, 0xf0, 0x92, 0x70, 0x2b, 0x27, 0xf8, 0xbf, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xe5, 0x0c, + 0x04, 0x5f, 0xa6, 0xad, 0x7c, 0xbc, 0x70, 0x1f, + 0x2f, 0xbc, 0x28, 0x5f, 0xe4, 0x4f, 0xdb, 0xe9, + 0xf2, 0xd5, 0x85, 0x19, 0xd4, 0x7b, 0x9e, 0x8e, + 0xb1, 0x4a, 0xad, 0x61, 0xbd, 0xe0, 0x0b, 0xce, + 0xdd, 0xef, 0x3f, 0x8e, 0x6f, 0x83, 0x38, 0x74, + 0x9a, 0x96, 0x4d, 0x63, 0x95, 0x79, 0xdd, 0x9a, + 0x27, 0x43, 0xee, 0xcd, 0x21, 0x0e, 0x14, 0xa6, + 0xa3, 0x09, 0xae, 0x8c, 0x62, 0x97, 0x86, 0xd8, + 0x26, 0x80, 0x35, 0x82, 0x67, 0xa0, 0x20, 0x93, + 0x88, 0x03, 0xfb, 0x8e, 0x3f, 0x06, 0x67, 0x02, + 0x40, 0x80, 0x38, 0xc4, 0xda, 0x26, 0x80, 0x38, + 0xd0, 0x2f, 0xdd, 0xae, 0x38, 0x58, 0x12, 0x0e, + 0xc2, 0x84, 0x4f, 0xb9, 0x8d, 0x62, 0x9a, 0x34, + 0x29, 0x12, 0x0d, 0x74, 0x0c, 0x66, 0x32, 0xae, + 0xf7, 0xcc, 0xe0, 0x70, 0x1f, 0xdb, 0x34, 0x9d, + 0xc1, 0x88, 0xd9, 0x50, 0x05, 0xee, 0x9e, 0x98, + 0xe5, 0x5e, 0x77, 0x66, 0x89, 0xd0, 0xfb, 0xb1, + 0xce, 0x7c, 0x0a, 0xb5, 0x54, 0xd0, 0x6a, 0xf0, + 0x6a, 0xe5, 0x24, 0x98, 0x64, 0xa9, 0x69, 0x45, + 0x25, 0xe9, 0x32, 0x3e, 0x8f, 0xa0, 0xbe, 0x84, + 0x41, 0x77, 0x2c, 0xf4, 0xc1, 0x76, 0xad, 0x9e, + 0x43, 0x02, 0x20, 0x38, 0x9c, 0x65, 0xa8, 0x08, + 0xc7, 0xb3, 0x8d, 0x03, 0xc0, 0xe6, 0xf1, 0xf4, + 0xda, 0xa0, 0x76, 0xb8, 0xd9, 0x57, 0xd0, 0x37, + 0xfb, 0x65, 0x19, 0x04, 0x77, 0x4d, 0x5f, 0xeb, + 0x1a, 0x42, 0x99, 0x01, 0x74, 0xfd, 0xf5, 0xfb, + 0xe3, 0xc7, 0x41, 0xd1, 0x47, 0x23, 0x9e, 0x33, + 0x08, 0x94, 0xc8, 0xe1, 0xe1, 0x08, 0x8f, 0xe7, + 0x00, 0x0c, 0x04, 0x01, 0xe1, 0x41, 0x2e, 0xdd, + 0xce, 0xb8, 0x2d, 0x13, 0x76, 0x2c, 0x8a, 0x94, + 0x17, 0xb3, 0x1c, 0xd1, 0xda, 0x95, 0x92, 0x69, + 0xfc, 0x99, 0xba, 0xa6, 0xfe, 0x63, 0x25, 0x3e, + 0xc3, 0x3d, 0x31, 0x2a, 0x9e, 0xb4, 0x53, 0x34, + 0xd3, 0x8e, 0xb2, 0xfa, 0xe4, 0xde, 0x9d, 0xa7, + 0x64, 0xa4, 0x1f, 0x67, 0x59, 0x5f, 0x75, 0x72, + 0xc2, 0x5a, 0x08, 0xe9, 0x79, 0x30, 0x09, 0xa9, + 0x24, 0xaa, 0xd5, 0xc5, 0xf6, 0xb0, 0x2a, 0x0f, + 0x22, 0x10, 0xfb, 0x26, 0x6a, 0x85, 0x7a, 0x5b, + 0x55, 0x0a, 0xd5, 0xea, 0xb9, 0x47, 0x83, 0xcc, + 0x58, 0x49, 0x04, 0x13, 0x9e, 0x71, 0xaf, 0xa9, + 0xc4, 0x08, 0x8c, 0xeb, 0x05, 0xe9, 0x9d, 0xf4, + 0xeb, 0x64, 0x16, 0x52, 0x3b, 0xd2, 0x61, 0xc9, + 0x5e, 0xc5, 0x27, 0xaa, 0x68, 0xf4, 0x59, 0x94, + 0xf7, 0x1f, 0xa1, 0x40, 0x81, 0x67, 0x76, 0xb9, + 0x63, 0x46, 0xda, 0xcb, 0x4e, 0x01, 0xdb, 0xb0, + 0x1f, 0x5c, 0x01, 0x2a, 0x39, 0x24, 0x0e, 0xe4, + 0xef, 0x3a, 0xb8, 0xcd, 0x00, 0x6b, 0x68, 0x70, + 0x01, 0xa0, 0xdb, 0xa3, 0xbe, 0x78, 0xcc, 0x41, + 0xa3, 0x18, 0x88, 0xab, 0xed, 0xb1, 0x89, 0x12, + 0x41, 0xbb, 0x01, 0x72, 0xef, 0x00, 0x06, 0x9c, + 0x63, 0xf6, 0x72, 0x3e, 0x19, 0x1f, 0x0c, 0x8f, + 0x86, 0x47, 0xc3, 0x23, 0xe1, 0x91, 0xf0, 0xc8, + 0xf8, 0x64, 0x82, 0x32, 0x01, 0x41, 0xe0, 0x0b, + 0x53, 0x96, 0xe3, 0xab, 0x58, 0xd8, 0xf1, 0xa2, + 0x98, 0xa1, 0xd7, 0x53, 0x53, 0x09, 0xff, 0x00, + 0x83, 0x93, 0x20, 0x63, 0x69, 0xd2, 0xcf, 0x4c, + 0xbb, 0xa2, 0x4d, 0x65, 0xa7, 0x00, 0xed, 0xd8, + 0x0f, 0xae, 0x30, 0x6a, 0x22, 0x00, 0x81, 0x00, + 0x49, 0xae, 0x37, 0xd7, 0x09, 0x27, 0x07, 0xf4, + 0xa5, 0xb3, 0x8b, 0xad, 0x84, 0xc2, 0x73, 0x4d, + 0x44, 0x38, 0x00, 0x6b, 0x94, 0x37, 0x72, 0x3e, + 0x19, 0x1f, 0x0c, 0x8f, 0x86, 0x47, 0xc3, 0x23, + 0xe1, 0x91, 0xf0, 0xc8, 0xf8, 0x63, 0x2e, 0x2c, + 0x8e, 0x1d, 0xdf, 0xb0, 0x6f, 0xf6, 0xca, 0xc4, + 0x25, 0xdd, 0x07, 0xb3, 0x0e, 0x42, 0x71, 0x58, + 0xe7, 0x83, 0xe9, 0xc4, 0x39, 0xc4, 0x11, 0x73, + 0x62, 0xea, 0x72, 0x8d, 0xc3, 0x66, 0x00, 0xd8, + 0x6b, 0xc0, 0x6b, 0xa7, 0x4f, 0xf5, 0x4f, 0x1e, + 0x3c, 0x78, 0xf1, 0xe3, 0xc7, 0x8f, 0x1e, 0x3c, + 0x78, 0xf1, 0xe3, 0xc7, 0x8f, 0x1e, 0x3c, 0x78, + 0x2a, 0xe0, 0x01, 0x3a, 0xc6, 0x06, 0xa0, 0x6a, + 0xf7, 0xbc, 0x4c, 0x40, 0x44, 0x46, 0x89, 0xd3, + 0x2a, 0x45, 0xd8, 0x0c, 0x1d, 0x88, 0xfd, 0xb3, + 0xcf, 0x3d, 0xb3, 0xcf, 0x3d, 0xb3, 0xcf, 0x3d, + 0xb3, 0xcf, 0x3d, 0xb3, 0xcf, 0x3d, 0xb3, 0xcf, + 0x3d, 0xb3, 0xcf, 0x3d, 0xb3, 0xcf, 0x3d, 0xb3, + 0xcf, 0x3d, 0xb3, 0xcf, 0x3d, 0xb3, 0xcf, 0x3d, + 0xb3, 0xcf, 0x3d, 0xb3, 0xcf, 0x3d, 0xb3, 0xcf, + 0x3d, 0xb3, 0xcf, 0x3d, 0xb3, 0xcf, 0x3d, 0xb3, + 0xcf, 0x3d, 0xb3, 0xcf, 0x3d, 0xb3, 0xcf, 0x3d, + 0xb3, 0xcf, 0x3d, 0xb3, 0xb6, 0x01, 0x0f, 0xf7, + 0x72, 0xff, 0x00, 0x39, 0x15, 0xa0, 0x46, 0x6f, + 0x50, 0x74, 0x2b, 0xf4, 0x55, 0x57, 0x69, 0x02, + 0x10, 0xb0, 0x9d, 0x11, 0xe0, 0xff, 0x00, 0x5b, + 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, + 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, + 0x9f, 0x3e, 0x3b, 0x36, 0xa6, 0xe1, 0x55, 0x04, + 0xbc, 0x68, 0x3e, 0x87, 0xea, 0x8b, 0x5f, 0x2f, + 0xd3, 0xfa, 0xee, 0xdd, 0x85, 0x32, 0xf0, 0x31, + 0x6e, 0x9e, 0xc2, 0x89, 0xa4, 0x2c, 0x8a, 0x15, + 0xa4, 0xc6, 0x44, 0x7c, 0x62, 0x4e, 0x4b, 0x6e, + 0xc5, 0x64, 0x14, 0x31, 0xbc, 0x6f, 0x73, 0x58, + 0x33, 0x2c, 0x0a, 0xd9, 0x1e, 0x32, 0x3b, 0xe2, + 0xc8, 0x6d, 0xc0, 0x6b, 0x3d, 0x93, 0x97, 0x04, + 0x53, 0x7c, 0x6d, 0x02, 0x51, 0x10, 0xb6, 0x22, + 0x08, 0x9d, 0x4d, 0x84, 0x8c, 0x48, 0xa4, 0x08, + 0x97, 0x42, 0xa4, 0xdf, 0x4c, 0x24, 0xd3, 0x44, + 0xe9, 0x8b, 0xd1, 0x0d, 0xaf, 0x0f, 0xdb, 0x14, + 0x71, 0x93, 0x8b, 0x82, 0x8b, 0x7a, 0x03, 0x61, + 0xd3, 0x58, 0x37, 0xbd, 0x20, 0x05, 0x4a, 0xaa, + 0x56, 0xd7, 0x54, 0xfd, 0x7e, 0x6b, 0xbf, 0xfc, + 0x46, 0xb9, 0xf7, 0x68, 0x62, 0x01, 0xb2, 0xa5, + 0x21, 0xbe, 0xdb, 0xc0, 0x1e, 0x21, 0x00, 0x30, + 0xd6, 0xc2, 0x8d, 0xd8, 0x50, 0xe8, 0x97, 0x91, + 0x16, 0x22, 0x76, 0xe5, 0x44, 0x85, 0x34, 0x41, + 0x56, 0xc2, 0x50, 0x11, 0x27, 0x4a, 0x84, 0x54, + 0xab, 0x79, 0xad, 0xc3, 0xf4, 0xcb, 0x96, 0x40, + 0x9d, 0x0b, 0x24, 0xe1, 0xac, 0xd9, 0x5d, 0x5f, + 0xc3, 0x22, 0x85, 0xb2, 0x1d, 0x0c, 0x64, 0xb8, + 0xe2, 0xde, 0xe8, 0x52, 0xe3, 0x0e, 0xb0, 0xc0, + 0x13, 0xb3, 0xa9, 0x45, 0xdc, 0x82, 0xef, 0x99, + 0x7f, 0xc1, 0xe5, 0xbb, 0x3e, 0x85, 0x87, 0x13, + 0x22, 0x02, 0x54, 0x87, 0x0a, 0x1c, 0xb3, 0x43, + 0x96, 0xf8, 0xac, 0x03, 0xa1, 0x04, 0x04, 0x62, + 0xbb, 0x35, 0xbc, 0x68, 0xc1, 0x01, 0x7d, 0x71, + 0xd9, 0xac, 0xaa, 0xd4, 0x94, 0x83, 0x29, 0xaa, + 0x18, 0x95, 0xbe, 0x24, 0x0e, 0xd5, 0x48, 0x0d, + 0x9b, 0x50, 0xde, 0x02, 0x71, 0x14, 0x76, 0x4c, + 0x64, 0x1a, 0x67, 0x00, 0x4e, 0x12, 0xa1, 0xa3, + 0x69, 0xdf, 0x1c, 0x68, 0x60, 0x58, 0xaa, 0x9c, + 0x88, 0xf7, 0x53, 0x80, 0xb1, 0x8b, 0xe5, 0xb4, + 0x6d, 0x9b, 0xa2, 0x9b, 0x47, 0xef, 0xbd, 0xe3, + 0xa2, 0x89, 0xa0, 0x1a, 0xa3, 0xa9, 0x67, 0x58, + 0x0a, 0xeb, 0x78, 0x6e, 0xc8, 0x87, 0x36, 0x2e, + 0x85, 0x12, 0x8a, 0x51, 0xed, 0x96, 0xe1, 0x4e, + 0x51, 0xcb, 0xc0, 0xd0, 0x6e, 0xb9, 0x1e, 0x70, + 0x92, 0x85, 0x73, 0x70, 0x52, 0x19, 0x1f, 0x60, + 0xc1, 0xa3, 0x21, 0x91, 0x12, 0x04, 0x63, 0x15, + 0x42, 0x21, 0x04, 0x6b, 0xa7, 0x15, 0xbb, 0xc9, + 0x16, 0xf7, 0x42, 0xd6, 0xa8, 0xd0, 0xce, 0xb3, + 0x34, 0x9d, 0xea, 0x08, 0x3a, 0x5a, 0x01, 0xda, + 0x86, 0x9d, 0xe9, 0x81, 0xae, 0xa2, 0xd9, 0xee, + 0x10, 0x42, 0xa2, 0x10, 0x9d, 0xcc, 0xbf, 0x78, + 0x35, 0x04, 0x16, 0xc7, 0x70, 0xbb, 0x35, 0xbc, + 0x85, 0x32, 0x4c, 0x0c, 0x29, 0xc6, 0xa1, 0xd4, + 0x3a, 0x7b, 0x61, 0x43, 0x34, 0x41, 0xb5, 0x34, + 0x5a, 0xd4, 0x78, 0x18, 0x0a, 0xe8, 0xc3, 0xc9, + 0xb7, 0x15, 0x2a, 0xdc, 0x45, 0xad, 0xa6, 0xb2, + 0x4e, 0x49, 0x2b, 0xec, 0x77, 0x08, 0xf2, 0xba, + 0xe3, 0x0b, 0xda, 0x81, 0x15, 0xb9, 0xf7, 0x11, + 0x11, 0x34, 0x88, 0x9f, 0xe4, 0xf3, 0x55, 0xeb, + 0x88, 0x03, 0x64, 0x45, 0xad, 0x87, 0xed, 0x81, + 0x9f, 0x34, 0x83, 0x99, 0x88, 0x23, 0x96, 0xe0, + 0x65, 0xc2, 0x5e, 0x2d, 0x94, 0x3b, 0x09, 0x59, + 0x54, 0xee, 0x6b, 0x13, 0x75, 0xb1, 0x74, 0x92, + 0x6a, 0xba, 0xa6, 0x3a, 0xdb, 0xb3, 0x9a, 0x02, + 0x29, 0xf3, 0x27, 0x2a, 0xa7, 0x1b, 0xd7, 0xa3, + 0x87, 0xe9, 0xaa, 0x31, 0x1e, 0xa4, 0x70, 0x0b, + 0x01, 0xb2, 0x86, 0x25, 0x29, 0x0e, 0x86, 0x87, + 0x08, 0x81, 0xae, 0x47, 0xae, 0x47, 0x1b, 0xa2, + 0x6d, 0x98, 0xde, 0x01, 0xde, 0xce, 0x00, 0x88, + 0x8a, 0x0f, 0x34, 0x3a, 0x2a, 0x8f, 0x42, 0xe6, + 0xc4, 0x26, 0x88, 0x9a, 0x5d, 0x00, 0x17, 0x5b, + 0xf6, 0x67, 0xea, 0x2b, 0xe9, 0xff, 0x00, 0xd9, + 0xfe, 0x23, 0x78, 0x55, 0xdf, 0x01, 0x1d, 0x83, + 0xd1, 0x96, 0x3d, 0x1c, 0xb6, 0x73, 0xce, 0xe2, + 0x03, 0x9d, 0xda, 0x3b, 0x15, 0x04, 0x5a, 0xc5, + 0xc1, 0x76, 0xba, 0x11, 0xea, 0x20, 0xbb, 0x90, + 0xb0, 0x26, 0x91, 0x00, 0x92, 0x41, 0xb6, 0x20, + 0x20, 0xa7, 0x04, 0xb9, 0x39, 0x6c, 0x62, 0xd0, + 0x45, 0x56, 0x8e, 0xe6, 0xfe, 0xf6, 0x08, 0x24, + 0x26, 0x05, 0x7b, 0x15, 0xaa, 0x35, 0xcb, 0x52, + 0x15, 0x6e, 0x4e, 0xa6, 0x1c, 0x3a, 0x2b, 0xcb, + 0x4d, 0x16, 0xef, 0xf8, 0x7c, 0xb7, 0x67, 0xd1, + 0x45, 0xb0, 0x9b, 0xe7, 0x04, 0x14, 0xa5, 0x72, + 0xa8, 0x64, 0x77, 0xec, 0x28, 0x10, 0xc3, 0x76, + 0xfa, 0x88, 0x38, 0xc0, 0x82, 0x02, 0x0c, 0xc9, + 0x8e, 0xfb, 0xf9, 0x3b, 0x0d, 0x67, 0x07, 0x51, + 0x1e, 0x66, 0xed, 0x89, 0x1e, 0xe9, 0x5d, 0xef, + 0x38, 0x78, 0x07, 0xd1, 0x87, 0x80, 0xca, 0xba, + 0x35, 0x87, 0x95, 0x50, 0x80, 0xa8, 0xa2, 0x58, + 0x88, 0xe6, 0x88, 0xa4, 0xe5, 0xfc, 0x15, 0x39, + 0x0c, 0xd9, 0x5e, 0x59, 0x09, 0x39, 0xd4, 0x3d, + 0xda, 0xea, 0x37, 0x78, 0xd4, 0xc4, 0x84, 0x78, + 0x28, 0xb0, 0x0a, 0xaa, 0x1c, 0x6d, 0x5c, 0x9c, + 0xb8, 0xaf, 0x13, 0x49, 0x68, 0x27, 0x3a, 0x0e, + 0xb8, 0x4a, 0x33, 0x28, 0x6a, 0xe7, 0xc6, 0x10, + 0x0b, 0x06, 0x19, 0x32, 0x3a, 0x60, 0x74, 0x2f, + 0xdb, 0xdf, 0xd5, 0xbc, 0x31, 0x30, 0xbc, 0x92, + 0x20, 0x8e, 0x0a, 0xaa, 0xba, 0xb3, 0xcb, 0x90, + 0x15, 0xa3, 0x80, 0x60, 0x48, 0x24, 0xe0, 0x13, + 0xe7, 0x07, 0x6f, 0x8b, 0x80, 0x6d, 0xfb, 0xf9, + 0xe0, 0x73, 0xe4, 0x00, 0x6f, 0x41, 0x8e, 0x14, + 0xb2, 0x0d, 0x8e, 0x51, 0xa7, 0xd9, 0x03, 0xa2, + 0x1b, 0x6e, 0xa4, 0xc1, 0x2c, 0x4c, 0x7b, 0x4a, + 0x06, 0x5c, 0x93, 0x12, 0x7e, 0xe5, 0x5e, 0xce, + 0x79, 0x7a, 0xee, 0xc1, 0x6f, 0x05, 0xa2, 0x19, + 0xaa, 0x63, 0x9c, 0xaf, 0xeb, 0xee, 0xb4, 0x28, + 0x90, 0xdb, 0xd3, 0x34, 0xd3, 0x3a, 0x6c, 0xe3, + 0xce, 0xaa, 0xae, 0x23, 0xc9, 0x57, 0xd2, 0x37, + 0x25, 0x06, 0xb3, 0xd5, 0x2e, 0x6a, 0x98, 0x76, + 0x80, 0xf4, 0xa9, 0xd8, 0x28, 0x28, 0x1d, 0x7d, + 0x5c, 0x0b, 0xf4, 0x75, 0xae, 0x39, 0xc3, 0x13, + 0x89, 0x96, 0xda, 0x6e, 0xad, 0xcf, 0x02, 0xf6, + 0xcf, 0x02, 0xf6, 0xcf, 0x02, 0xf6, 0xcf, 0x02, + 0xf6, 0xcf, 0x02, 0xf6, 0xcf, 0x02, 0xf6, 0xcf, + 0x02, 0xf6, 0xcf, 0x02, 0xf6, 0xcf, 0x02, 0xf6, + 0xcf, 0x02, 0xf6, 0xcf, 0x02, 0xf6, 0xcf, 0x02, + 0xf6, 0xcf, 0x02, 0xf6, 0xcf, 0x02, 0xf6, 0xcf, + 0x02, 0xf6, 0xcf, 0x02, 0xf6, 0xcf, 0x02, 0xf6, + 0xcf, 0x02, 0xf6, 0xcf, 0x02, 0xf6, 0xcf, 0x02, + 0xf6, 0xcf, 0x02, 0xf6, 0xc8, 0x4e, 0x8c, 0x15, + 0x08, 0x88, 0x68, 0x84, 0xfa, 0xf7, 0x2e, 0x84, + 0x5d, 0x1e, 0x38, 0x33, 0xc9, 0xff, 0x00, 0x8c, + 0xf2, 0x7f, 0xe3, 0x3c, 0x9f, 0xf8, 0xcf, 0x27, + 0xfe, 0x33, 0xc9, 0xff, 0x00, 0x8c, 0xf2, 0x7f, + 0xe3, 0x1d, 0x98, 0x03, 0xba, 0xd7, 0x6a, 0x8d, + 0x26, 0x79, 0x3f, 0xf1, 0x92, 0x0d, 0x1b, 0xdf, + 0xe2, 0xb2, 0xfe, 0xce, 0x76, 0xc6, 0x4c, 0xf5, + 0xd9, 0x43, 0xf7, 0xce, 0xc8, 0xc9, 0x9e, 0xbb, + 0x28, 0x7e, 0xf8, 0x99, 0x42, 0xd1, 0xbd, 0x10, + 0x5e, 0x05, 0x88, 0xce, 0x62, 0x64, 0x25, 0x4d, + 0x99, 0x65, 0x34, 0xe9, 0x23, 0xbe, 0x8e, 0x28, + 0xfb, 0x8a, 0x20, 0x2a, 0x54, 0x18, 0x8c, 0xf5, + 0x30, 0x70, 0x45, 0x10, 0x45, 0x05, 0xe4, 0x51, + 0xd3, 0xd9, 0xcf, 0x27, 0xfe, 0x33, 0xc9, 0xff, + 0x00, 0x8c, 0xf2, 0x7f, 0xe3, 0x3c, 0x9f, 0xf8, + 0xcf, 0x27, 0xfe, 0x33, 0xc9, 0xff, 0x00, 0x8c, + 0xfd, 0xfa, 0x32, 0xa5, 0x87, 0xa1, 0xf4, 0x7a, + 0xa7, 0x06, 0x86, 0xd4, 0xec, 0x1d, 0x67, 0x8c, + 0xfb, 0x67, 0x8c, 0xfb, 0x62, 0xbf, 0x89, 0x00, + 0x0d, 0x34, 0x88, 0xec, 0xe1, 0xc4, 0xef, 0x4a, + 0xaa, 0xaf, 0xf1, 0x9e, 0x33, 0xed, 0x9e, 0x33, + 0xed, 0x9e, 0x33, 0xed, 0x9e, 0x33, 0xed, 0x9e, + 0x33, 0xed, 0x9e, 0x33, 0xed, 0x9e, 0x33, 0xed, + 0x9e, 0x33, 0xed, 0x9e, 0x33, 0xed, 0x9e, 0x33, + 0xed, 0x9e, 0x33, 0xed, 0x9e, 0x33, 0xed, 0x9e, + 0x33, 0xed, 0x9e, 0x33, 0xed, 0x9e, 0x33, 0xed, + 0x9e, 0x33, 0xed, 0x9e, 0x33, 0xed, 0x86, 0x94, + 0xf8, 0x05, 0x25, 0x77, 0x4d, 0xfd, 0x0e, 0x30, + 0x6f, 0xd1, 0xd6, 0x99, 0xef, 0x31, 0xdb, 0x93, + 0xe8, 0x15, 0x1d, 0xa7, 0x5a, 0x09, 0xd4, 0x13, + 0x14, 0x40, 0x50, 0x62, 0x64, 0x61, 0xb4, 0x9c, + 0x2f, 0x0d, 0x65, 0x53, 0x49, 0x48, 0xe7, 0x43, + 0x58, 0x80, 0x85, 0x5f, 0xda, 0x27, 0x40, 0xdb, + 0x53, 0x44, 0x1a, 0xf5, 0x07, 0x92, 0x23, 0x87, + 0xb3, 0x89, 0xcc, 0x4a, 0x00, 0x87, 0x8a, 0x0f, + 0x25, 0xe3, 0x02, 0x5d, 0x0d, 0x90, 0x05, 0x85, + 0x48, 0x08, 0x4b, 0xb0, 0xb1, 0xcc, 0xd7, 0x95, + 0x09, 0x07, 0x51, 0x2f, 0x51, 0xc0, 0xc0, 0x21, + 0x88, 0xc4, 0x85, 0x57, 0x00, 0x7b, 0xc1, 0x2d, + 0x41, 0x2e, 0x92, 0x96, 0xe9, 0xde, 0xb4, 0xf3, + 0xd5, 0x23, 0x9c, 0x59, 0x29, 0xe4, 0xfd, 0x01, + 0xbb, 0x3d, 0x67, 0x38, 0x34, 0xf4, 0xc8, 0x35, + 0x37, 0x08, 0x41, 0x78, 0x22, 0x6c, 0x45, 0xd2, + 0x80, 0x89, 0x95, 0x02, 0xda, 0x56, 0xe4, 0x5e, + 0x0c, 0x9d, 0x59, 0x23, 0x34, 0x3f, 0xdc, 0x29, + 0xa0, 0xd3, 0x1c, 0xdf, 0xca, 0x38, 0xe2, 0x98, + 0x68, 0x55, 0x5d, 0x34, 0x35, 0x77, 0xfe, 0xd6, + 0x00, 0x7a, 0x71, 0x04, 0x16, 0x81, 0xa4, 0x98, + 0x6e, 0x91, 0x88, 0xc5, 0x00, 0x80, 0x43, 0xad, + 0x45, 0xd5, 0x82, 0x14, 0x25, 0x45, 0x4f, 0x74, + 0xc5, 0x5d, 0x38, 0x46, 0x37, 0x47, 0xe0, 0xa1, + 0x40, 0x5e, 0xa2, 0x24, 0x3b, 0x36, 0xa0, 0x0a, + 0xac, 0xb4, 0x02, 0x1d, 0x0e, 0x5d, 0xae, 0xf6, + 0xe2, 0x06, 0x8a, 0x79, 0x09, 0x44, 0x24, 0x6c, + 0x02, 0x48, 0x16, 0x11, 0x24, 0xf5, 0xa2, 0x14, + 0xdd, 0x46, 0x97, 0x56, 0x58, 0x59, 0xfe, 0x26, + 0xc6, 0x8b, 0xa1, 0x1a, 0xc1, 0x48, 0x2b, 0xa7, + 0xa1, 0xea, 0x8c, 0x3a, 0x1a, 0x40, 0x9d, 0xbc, + 0x30, 0x27, 0x74, 0x26, 0xe0, 0x71, 0xa3, 0xba, + 0x51, 0x10, 0x15, 0xe4, 0xb2, 0x3d, 0xd5, 0x90, + 0xd6, 0x26, 0x90, 0x7e, 0xb1, 0x6d, 0x6a, 0x27, + 0xa0, 0x4c, 0x61, 0x62, 0x3b, 0x46, 0xdb, 0x85, + 0x6a, 0x0f, 0x41, 0x81, 0xb2, 0x7d, 0x8e, 0x83, + 0x42, 0x0d, 0xf4, 0x00, 0x0c, 0xd0, 0x98, 0xe2, + 0x04, 0xe9, 0x20, 0x16, 0xba, 0xd4, 0xc1, 0xf6, + 0x3b, 0xf4, 0x70, 0x9e, 0xc0, 0xd4, 0x7a, 0x2c, + 0x32, 0x94, 0xd4, 0x04, 0xbb, 0x61, 0x17, 0x80, + 0xd9, 0x30, 0x85, 0xc7, 0x62, 0x04, 0x8e, 0xc5, + 0xbb, 0xef, 0xab, 0x7f, 0xaf, 0xcb, 0x76, 0x7f, + 0xb1, 0x77, 0x9a, 0xef, 0xfa, 0x1f, 0xd1, 0xc2, + 0xdf, 0x98, 0x31, 0xf0, 0x54, 0x48, 0x1d, 0x44, + 0x59, 0xc0, 0xde, 0x0c, 0x6b, 0xaa, 0x01, 0x56, + 0x0d, 0xdc, 0x0f, 0x47, 0x13, 0x86, 0x03, 0xb6, + 0x53, 0x89, 0xb1, 0x22, 0xa5, 0x24, 0xd9, 0x14, + 0x4f, 0x70, 0xe8, 0x87, 0xa6, 0x2a, 0x97, 0x96, + 0x00, 0xe1, 0x2f, 0x16, 0x30, 0x3a, 0x3a, 0x21, + 0x34, 0x09, 0x17, 0x78, 0x7c, 0xc2, 0x03, 0xba, + 0x85, 0x85, 0x28, 0x42, 0x71, 0x1c, 0xae, 0x29, + 0x5b, 0x00, 0xb7, 0x36, 0xde, 0x8d, 0xca, 0x4e, + 0xed, 0xe1, 0x2a, 0x7d, 0x29, 0x2a, 0x98, 0x5b, + 0x84, 0x0e, 0xf8, 0xba, 0x47, 0x0a, 0x5a, 0x12, + 0x13, 0x61, 0x60, 0xb6, 0xeb, 0xba, 0xe9, 0x8f, + 0x34, 0x3d, 0x00, 0x00, 0x11, 0x08, 0xaa, 0x55, + 0x76, 0x70, 0xbd, 0xfa, 0x84, 0x99, 0x43, 0x7e, + 0x0d, 0xa7, 0x38, 0x17, 0xd4, 0x41, 0xe8, 0xa4, + 0xd8, 0x26, 0xc2, 0x69, 0xbb, 0x72, 0x9b, 0xbe, + 0xa0, 0xbc, 0xf9, 0xcf, 0xdf, 0x1b, 0x8b, 0x90, + 0x64, 0x12, 0xd8, 0xb1, 0xe7, 0x5b, 0x80, 0xe2, + 0x8c, 0xcd, 0x3d, 0xdc, 0x25, 0x00, 0x73, 0x10, + 0xe7, 0x35, 0x35, 0xb3, 0x5b, 0x28, 0x3c, 0x82, + 0x51, 0x20, 0xc5, 0x45, 0x30, 0x04, 0xcf, 0xe5, + 0x6a, 0x7b, 0xe0, 0x16, 0x59, 0x61, 0x9f, 0xc6, + 0x55, 0x8c, 0x6d, 0x32, 0x7a, 0x9e, 0x9d, 0x6d, + 0x0c, 0x9d, 0xa1, 0xd3, 0x9a, 0xa0, 0xab, 0xd6, + 0x68, 0x86, 0x73, 0x90, 0x60, 0xa5, 0xee, 0xb5, + 0xa6, 0xe9, 0x3a, 0x58, 0xe2, 0xc0, 0x53, 0x0e, + 0xbc, 0x51, 0x66, 0x04, 0xba, 0xa4, 0xc4, 0xa2, + 0x0e, 0x18, 0x50, 0x56, 0xe0, 0xde, 0xa6, 0xb8, + 0xa8, 0x07, 0xd6, 0xca, 0x87, 0xa2, 0x2c, 0x74, + 0x34, 0xc7, 0xea, 0x90, 0x78, 0x6c, 0xaf, 0x58, + 0x67, 0x8c, 0xfb, 0x67, 0x8c, 0xfb, 0x67, 0x8c, + 0xfb, 0x67, 0x8c, 0xfb, 0x67, 0x8c, 0xfb, 0x63, + 0xaa, 0xa3, 0xcc, 0x17, 0xfa, 0xc2, 0x1a, 0x34, + 0xb5, 0x2b, 0xaa, 0xd4, 0x2f, 0x3e, 0x87, 0x39, + 0xb4, 0x32, 0x32, 0x30, 0xaa, 0x2e, 0xa1, 0x3e, + 0xd8, 0x03, 0x14, 0x96, 0x5d, 0x08, 0x98, 0xe1, + 0x20, 0x6f, 0x91, 0x8c, 0xe4, 0x8e, 0x21, 0x49, + 0x00, 0x24, 0x08, 0x2b, 0x96, 0xa0, 0x2d, 0x79, + 0x01, 0x40, 0x48, 0x10, 0x2b, 0x53, 0x58, 0x02, + 0x40, 0xc6, 0xf8, 0xa6, 0x1a, 0xe1, 0xad, 0x77, + 0x1a, 0xc8, 0xce, 0x48, 0xe2, 0x14, 0x90, 0x02, + 0x40, 0x82, 0xb9, 0x6e, 0x6f, 0x12, 0x96, 0xd9, + 0x26, 0xac, 0x0e, 0x57, 0xf6, 0x74, 0x1b, 0x49, + 0x4d, 0x53, 0x8e, 0xbb, 0x47, 0xa7, 0x19, 0xe3, + 0x3e, 0xd9, 0xe3, 0x3e, 0xd9, 0xe3, 0x3e, 0xd9, + 0xe3, 0x3e, 0xd9, 0xe3, 0x3e, 0xd9, 0xe3, 0x3e, + 0xd8, 0xa2, 0x00, 0x28, 0x88, 0xc7, 0xd1, 0xad, + 0xa8, 0xe3, 0x3f, 0x78, 0xb6, 0x22, 0x19, 0x35, + 0x16, 0xe4, 0x55, 0x44, 0x11, 0x60, 0x04, 0x55, + 0x4d, 0x90, 0x0e, 0x98, 0x97, 0x75, 0xad, 0xae, + 0xe6, 0x8a, 0xaa, 0x44, 0x50, 0xa9, 0x70, 0xec, + 0x5b, 0xad, 0xe0, 0x80, 0x94, 0x11, 0x68, 0x47, + 0x5c, 0x60, 0x53, 0x43, 0x41, 0x5e, 0x5c, 0x36, + 0x00, 0x69, 0x5a, 0x8c, 0xc2, 0x20, 0x00, 0x01, + 0xa0, 0x2e, 0x19, 0xc1, 0x1c, 0xd2, 0xd8, 0x89, + 0x69, 0xd4, 0x35, 0xa8, 0x11, 0x76, 0xea, 0xda, + 0x27, 0x40, 0x49, 0x85, 0x49, 0xcb, 0x80, 0xd1, + 0xb3, 0x1a, 0xa8, 0xa0, 0xec, 0xbb, 0x02, 0xda, + 0xef, 0x2a, 0xc0, 0xe9, 0x1c, 0xb7, 0x69, 0x47, + 0x39, 0x01, 0xc6, 0xb0, 0x31, 0x18, 0x63, 0x5a, + 0x32, 0x43, 0xe8, 0x04, 0x18, 0xa0, 0x1a, 0x7b, + 0xde, 0xd0, 0x01, 0xb0, 0x0a, 0x24, 0x69, 0xc5, + 0xcf, 0x93, 0x69, 0xc2, 0x46, 0xac, 0x36, 0x9b, + 0xbd, 0xc1, 0x81, 0xe0, 0x7c, 0xc7, 0xa2, 0xa4, + 0x29, 0xa6, 0x87, 0x72, 0xc1, 0xee, 0xa9, 0x91, + 0x75, 0x48, 0xd3, 0x27, 0x31, 0xdb, 0x39, 0x2f, + 0xae, 0x8c, 0xe5, 0xfd, 0x18, 0x59, 0x59, 0x8c, + 0x5e, 0x1b, 0x75, 0x55, 0x48, 0x85, 0x54, 0x6b, + 0x43, 0x4e, 0x6e, 0xb4, 0x8c, 0xe9, 0x0b, 0x86, + 0xcc, 0x48, 0xb7, 0xa6, 0x49, 0x03, 0xa8, 0x04, + 0x1c, 0x7a, 0x6c, 0xed, 0x06, 0xdb, 0x18, 0x0e, + 0x5b, 0x37, 0x08, 0x12, 0xf1, 0xb7, 0x87, 0xd3, + 0x90, 0x32, 0xc0, 0x93, 0xd2, 0xea, 0x88, 0x41, + 0x21, 0x82, 0x80, 0xb6, 0x67, 0x01, 0x36, 0xb5, + 0xa2, 0xe8, 0x93, 0x78, 0x88, 0x04, 0x50, 0xe8, + 0x95, 0x6c, 0x1a, 0x4d, 0xa5, 0x9d, 0x3f, 0x51, + 0xc9, 0xe3, 0x34, 0xfb, 0xab, 0x8f, 0xfe, 0x9e, + 0x99, 0xb0, 0x93, 0x34, 0xbd, 0xd6, 0x67, 0x9d, + 0x7b, 0x67, 0x9d, 0x7b, 0x67, 0x9d, 0x7b, 0x67, + 0x9d, 0x7b, 0x67, 0x9d, 0x7b, 0x67, 0x9d, 0x7b, + 0x67, 0x9d, 0x7b, 0x67, 0x9d, 0x7b, 0x67, 0x9d, + 0x7b, 0x67, 0x9d, 0x7b, 0x67, 0x9d, 0x7b, 0x67, + 0x9d, 0x7b, 0x67, 0x9d, 0x7b, 0x67, 0x9d, 0x7b, + 0x67, 0x9d, 0x7b, 0x67, 0x9d, 0x7b, 0x67, 0x9d, + 0x7b, 0x67, 0x9d, 0x7b, 0x67, 0x9d, 0x7b, 0x64, + 0x35, 0xbc, 0x9f, 0x77, 0x19, 0xa7, 0x11, 0x6c, + 0xd4, 0xd5, 0x7d, 0x5f, 0xa9, 0xb6, 0xfa, 0x07, + 0x31, 0xde, 0x7c, 0x33, 0xf3, 0x9f, 0x0c, 0xfc, + 0xe7, 0xc3, 0x3f, 0x39, 0xf0, 0xcf, 0xce, 0x7c, + 0x33, 0xf3, 0x9f, 0x0c, 0xfc, 0xe7, 0xc3, 0x3f, + 0x38, 0x0e, 0x34, 0x7c, 0x04, 0x14, 0x70, 0x50, + 0x46, 0x7a, 0xe5, 0xb3, 0x88, 0xa6, 0xee, 0xda, + 0x1f, 0x6c, 0xf8, 0x67, 0xe7, 0x34, 0xf2, 0x03, + 0x53, 0x1b, 0x1c, 0xc2, 0x68, 0xde, 0xcc, 0x69, + 0x3e, 0x58, 0x8b, 0xc7, 0x03, 0x87, 0x54, 0x29, + 0x28, 0xfd, 0x8b, 0xfb, 0x67, 0xc3, 0x3f, 0x39, + 0xf0, 0xcf, 0xce, 0x7c, 0x33, 0xf3, 0x9f, 0x0c, + 0xfc, 0xe7, 0xc3, 0x3f, 0x39, 0xf0, 0xcf, 0xce, + 0x7c, 0x33, 0xf3, 0x9f, 0x0c, 0xfc, 0xe4, 0x4e, + 0x52, 0xc2, 0x10, 0xaf, 0xd1, 0xe1, 0x7c, 0x1c, + 0x05, 0x37, 0x8a, 0x15, 0xb3, 0x52, 0x38, 0x74, + 0x43, 0x18, 0x31, 0x15, 0x00, 0x13, 0x62, 0x57, + 0x7b, 0x6b, 0xce, 0xa0, 0x98, 0xad, 0xb8, 0xac, + 0x15, 0x01, 0x00, 0x30, 0xe5, 0xc1, 0x19, 0x55, + 0x24, 0xee, 0x14, 0x5a, 0xcd, 0x1b, 0xa3, 0xf8, + 0xb5, 0x47, 0x26, 0xa5, 0x49, 0x36, 0xa6, 0xdd, + 0x63, 0x63, 0x78, 0x07, 0x43, 0xa9, 0xcb, 0x3b, + 0xdb, 0xfc, 0x60, 0x54, 0x78, 0xc3, 0x35, 0x41, + 0x31, 0xb1, 0x45, 0x29, 0x73, 0xaf, 0xb5, 0xd6, + 0x21, 0x6c, 0x9b, 0x8d, 0x72, 0xbb, 0x75, 0x1b, + 0x37, 0x40, 0xdd, 0x4c, 0x26, 0xa3, 0x77, 0xcd, + 0xe3, 0x1e, 0x8e, 0xc5, 0xb7, 0x00, 0xb7, 0x63, + 0x0d, 0x19, 0x12, 0x65, 0x3b, 0x24, 0xb5, 0xea, + 0xd5, 0xf7, 0xa6, 0x90, 0xd7, 0x19, 0xa7, 0xd1, + 0xd8, 0x3d, 0x4a, 0xa2, 0xba, 0x80, 0xb2, 0x59, + 0x0c, 0x5e, 0x64, 0x91, 0x3b, 0x52, 0xef, 0x8c, + 0x29, 0x11, 0xe6, 0xa1, 0x6b, 0x32, 0x6d, 0x08, + 0xbb, 0x79, 0x7a, 0x06, 0x80, 0x65, 0xcb, 0xa8, + 0x00, 0x44, 0x1c, 0x3a, 0x82, 0x74, 0x36, 0x6e, + 0xef, 0x29, 0x35, 0x97, 0x15, 0x1a, 0x00, 0x1b, + 0x3a, 0x3a, 0x20, 0xbd, 0x8e, 0xe8, 0xad, 0x8c, + 0x87, 0xe8, 0x0f, 0x4e, 0x6b, 0x54, 0x3a, 0x98, + 0x34, 0xab, 0x49, 0xe8, 0xf3, 0x91, 0x9c, 0xef, + 0x0b, 0xa8, 0x52, 0x82, 0xae, 0x85, 0x9a, 0xd1, + 0x95, 0x64, 0x28, 0x22, 0xb0, 0xaa, 0x98, 0xf5, + 0x5d, 0x1c, 0x63, 0xea, 0x88, 0x2d, 0x05, 0x54, + 0x8d, 0xb0, 0xd0, 0x5b, 0x31, 0xb5, 0x5c, 0xfa, + 0x3d, 0x09, 0x88, 0xe7, 0x71, 0x85, 0x18, 0x63, + 0x99, 0x34, 0x4e, 0x65, 0x35, 0x00, 0x00, 0xec, + 0x7d, 0x5e, 0x0c, 0xbe, 0x1f, 0x4d, 0x98, 0x4f, + 0x8b, 0xa2, 0x7a, 0x23, 0x53, 0xb7, 0x88, 0x1f, + 0x73, 0xfd, 0x50, 0x82, 0x08, 0x20, 0x82, 0x08, + 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, + 0x08, 0x23, 0xf6, 0x32, 0x83, 0x9d, 0xf0, 0xbc, + 0x09, 0xd5, 0x31, 0xf9, 0x38, 0xce, 0x44, 0x62, + 0x7f, 0x88, 0xd7, 0xee, 0x5e, 0xae, 0xc4, 0x00, + 0xd1, 0xca, 0xaf, 0x55, 0x57, 0x6e, 0x5e, 0xae, + 0xac, 0x0a, 0x80, 0xda, 0x83, 0x0c, 0xe3, 0x83, + 0x27, 0x33, 0x6b, 0x62, 0x82, 0xed, 0xdb, 0x2d, + 0xb5, 0x10, 0x0e, 0x61, 0xda, 0x5e, 0xa2, 0xe1, + 0xda, 0x84, 0x09, 0xb1, 0x69, 0xbc, 0xdf, 0x02, + 0xc2, 0x8b, 0xfb, 0x86, 0x23, 0xc2, 0x93, 0x53, + 0x1d, 0xf7, 0xa0, 0xc1, 0x59, 0xb8, 0xa5, 0x42, + 0x91, 0x6c, 0x6f, 0xf8, 0x7c, 0xb7, 0x67, 0xe9, + 0x3b, 0xf2, 0xaa, 0x0c, 0x86, 0xcd, 0x2f, 0x59, + 0xc1, 0x87, 0x55, 0x5a, 0x30, 0x91, 0x62, 0xc1, + 0x41, 0x2a, 0x6b, 0x7a, 0xc5, 0x08, 0xad, 0x64, + 0x21, 0x01, 0x32, 0x1a, 0xab, 0x03, 0x58, 0x9e, + 0x88, 0x2c, 0xce, 0xb2, 0x77, 0x5e, 0x9c, 0x8d, + 0x4c, 0x56, 0xa7, 0x6d, 0x01, 0x2a, 0x45, 0x52, + 0xee, 0x0f, 0x58, 0xb2, 0xd7, 0x8c, 0x0e, 0x3a, + 0x02, 0xf7, 0xfd, 0xf0, 0x2b, 0x63, 0xd2, 0xb0, + 0x6c, 0x5a, 0x80, 0xe1, 0x13, 0xa6, 0x2a, 0xf8, + 0x0d, 0xb3, 0x94, 0x8a, 0x0f, 0x5c, 0x02, 0x1d, + 0x03, 0xfd, 0xc0, 0xa1, 0xb3, 0x93, 0x16, 0x8e, + 0x1f, 0x30, 0xb5, 0xd1, 0xdc, 0x94, 0xe7, 0x0d, + 0xaa, 0xa5, 0xa6, 0x8c, 0x05, 0x12, 0x76, 0x23, + 0x35, 0xbc, 0xfe, 0xcf, 0x55, 0x9b, 0x49, 0xc8, + 0xe3, 0x10, 0x23, 0x01, 0x42, 0xb2, 0x27, 0x01, + 0x57, 0x63, 0x7c, 0x62, 0x22, 0x45, 0x1a, 0x37, + 0x94, 0x0d, 0x29, 0xa5, 0xdc, 0x7d, 0x98, 0x05, + 0x62, 0xd2, 0x32, 0x14, 0x73, 0xa7, 0x17, 0x9c, + 0x5c, 0x74, 0xf2, 0xcc, 0x97, 0xd5, 0x8a, 0x28, + 0x26, 0x49, 0x20, 0x4e, 0x59, 0x04, 0x98, 0xd4, + 0xf9, 0xfe, 0x27, 0xeb, 0xe6, 0xbb, 0xfe, 0x87, + 0x3c, 0x37, 0xe9, 0x7b, 0x4c, 0xb2, 0xde, 0x81, + 0x07, 0x63, 0x59, 0xfa, 0x2a, 0xbd, 0x5d, 0x94, + 0x0c, 0x46, 0x86, 0x5d, 0x38, 0xe9, 0x83, 0x0c, + 0x95, 0xdb, 0xce, 0x51, 0xfd, 0x15, 0xeb, 0xd4, + 0x42, 0x6d, 0x62, 0x48, 0xa5, 0xd9, 0x36, 0x4a, + 0xeb, 0xa0, 0xb9, 0xad, 0x8e, 0x2d, 0x57, 0x62, + 0x51, 0x44, 0xa5, 0xe1, 0xc5, 0x07, 0xc0, 0x8c, + 0xc7, 0x86, 0x03, 0x82, 0xea, 0x53, 0xb5, 0x84, + 0x1f, 0x57, 0x07, 0x38, 0x22, 0x5d, 0xea, 0x71, + 0xb0, 0xb0, 0x75, 0x78, 0x29, 0xbd, 0xe0, 0xf8, + 0x7a, 0xf3, 0x01, 0x11, 0x28, 0x22, 0x36, 0x75, + 0x33, 0x7e, 0x51, 0x53, 0x20, 0x09, 0x44, 0x80, + 0xf2, 0xfd, 0xb1, 0x55, 0x81, 0x08, 0x8e, 0x40, + 0x1b, 0x1e, 0xb3, 0x22, 0xf9, 0x41, 0x4e, 0xe8, + 0x16, 0x61, 0x7d, 0x19, 0x08, 0xa2, 0x01, 0xd2, + 0xd9, 0xc8, 0x18, 0xfd, 0x19, 0xa5, 0xae, 0x62, + 0x7d, 0x85, 0xc2, 0xd0, 0xc7, 0x6a, 0x60, 0x14, + 0xd9, 0xa6, 0x8e, 0xf8, 0xc3, 0x12, 0x53, 0x8c, + 0x58, 0x42, 0xb5, 0x1d, 0xfe, 0x8a, 0x9b, 0x7a, + 0xb5, 0xd9, 0x89, 0x82, 0x42, 0x16, 0xfd, 0xdd, + 0xbf, 0x47, 0x2c, 0x00, 0xa2, 0x9b, 0x94, 0x13, + 0xfc, 0x0d, 0x9b, 0x36, 0x6c, 0xd9, 0xb3, 0x61, + 0x16, 0x9f, 0xe2, 0xeb, 0xae, 0x48, 0x3d, 0x4e, + 0x99, 0x14, 0x39, 0x0b, 0xf7, 0x9c, 0xd1, 0x4d, + 0x05, 0x2c, 0xbb, 0xc5, 0x44, 0xd6, 0xdd, 0x13, + 0x34, 0xd2, 0xcd, 0x5c, 0x63, 0x1e, 0xcf, 0xa5, + 0xb1, 0xa2, 0x0d, 0x24, 0x45, 0xb7, 0x35, 0x29, + 0x84, 0xcf, 0xb8, 0xb7, 0x54, 0x9c, 0x22, 0x88, + 0xe6, 0xee, 0x94, 0x5f, 0x9b, 0x69, 0x05, 0x52, + 0x15, 0xb9, 0xa3, 0xfc, 0x2d, 0x9b, 0x36, 0x6c, + 0xd9, 0xb3, 0x66, 0xc5, 0x21, 0x90, 0x88, 0x82, + 0x89, 0xf4, 0x61, 0xba, 0xdb, 0xf5, 0x26, 0x1c, + 0xb8, 0xd9, 0x4f, 0x0d, 0x46, 0xe0, 0x74, 0x18, + 0xed, 0xe4, 0x3c, 0xd8, 0x43, 0xa2, 0xae, 0x8c, + 0x5a, 0x32, 0x08, 0x06, 0x4a, 0x21, 0x2f, 0x45, + 0x05, 0xc4, 0x8b, 0xcc, 0xa2, 0x56, 0x5c, 0x95, + 0x07, 0xae, 0xc6, 0xb1, 0xbe, 0x6a, 0xa8, 0x1c, + 0xbb, 0x12, 0x9f, 0x42, 0x73, 0xa2, 0x0a, 0xd9, + 0xb8, 0x55, 0x78, 0x7e, 0x09, 0x25, 0x99, 0x39, + 0x92, 0x10, 0x82, 0x2a, 0x14, 0x15, 0x03, 0x76, + 0x40, 0x70, 0x33, 0x9d, 0x54, 0x9e, 0xb4, 0x51, + 0x26, 0xa2, 0x0a, 0xf5, 0xc2, 0x45, 0x4b, 0xea, + 0x03, 0x6a, 0xa2, 0x81, 0xa5, 0x1e, 0x32, 0xb3, + 0xf0, 0x39, 0x29, 0x62, 0x28, 0x25, 0x8e, 0x59, + 0x93, 0x05, 0x6d, 0x64, 0x7a, 0x06, 0xbb, 0x10, + 0x87, 0xa2, 0x16, 0x6d, 0xe0, 0xa4, 0x35, 0x9b, + 0x4a, 0x21, 0x81, 0xc0, 0x82, 0xb8, 0x1e, 0x58, + 0x9a, 0x59, 0x8e, 0xad, 0x1c, 0x14, 0x9c, 0x8c, + 0x9e, 0x74, 0xdb, 0xa2, 0x08, 0xa3, 0xb3, 0xae, + 0x75, 0xb5, 0x25, 0x33, 0x1a, 0x16, 0xb7, 0x1a, + 0xee, 0x6a, 0x9b, 0x96, 0x8c, 0xa2, 0xbc, 0xe1, + 0x7a, 0xd1, 0x77, 0xb5, 0xe4, 0x68, 0x68, 0xc3, + 0x43, 0xec, 0xfe, 0x1f, 0x52, 0xbe, 0x9d, 0xbf, + 0x97, 0xd0, 0xe5, 0x83, 0x0f, 0x9f, 0x49, 0x90, + 0x68, 0xe0, 0x39, 0xfa, 0x9f, 0xcf, 0x3d, 0x4f, + 0xe7, 0x9e, 0xa7, 0xf3, 0xc9, 0x07, 0x2e, 0x55, + 0x99, 0x0b, 0xf2, 0x72, 0xa2, 0x13, 0xcd, 0x23, + 0x5a, 0x63, 0xbe, 0x08, 0x40, 0xb4, 0x58, 0x4a, + 0x55, 0xa8, 0xd6, 0xb8, 0x6d, 0xc2, 0xba, 0x30, + 0x4b, 0x48, 0xb3, 0x1b, 0xb4, 0x12, 0x57, 0xbe, + 0x48, 0x19, 0x74, 0x2e, 0x2c, 0x2d, 0xd2, 0xcd, + 0xba, 0x7d, 0x71, 0x39, 0x78, 0x4b, 0xc8, 0xef, + 0x35, 0x3b, 0x62, 0xce, 0x6b, 0x77, 0x46, 0x3c, + 0xc5, 0x78, 0x9b, 0xd0, 0x73, 0xbc, 0x48, 0x21, + 0xca, 0x98, 0x4b, 0xb0, 0x32, 0x4e, 0xe3, 0xae, + 0x03, 0x46, 0xac, 0x62, 0xd3, 0x74, 0xa8, 0x1e, + 0x4e, 0x99, 0xdf, 0xef, 0x13, 0x92, 0x33, 0x7b, + 0x06, 0xe9, 0x7b, 0x18, 0xbc, 0x2a, 0x46, 0xea, + 0x02, 0x52, 0x33, 0x56, 0x6c, 0x75, 0x98, 0x98, + 0x18, 0x70, 0x3a, 0x48, 0xc2, 0xd8, 0x91, 0x81, + 0x70, 0xa9, 0x08, 0xed, 0x05, 0xa4, 0xfa, 0x8e, + 0xcf, 0x50, 0xc6, 0xc4, 0x57, 0x05, 0x36, 0xd7, + 0x00, 0x88, 0xd0, 0x2d, 0x6d, 0xcf, 0xb0, 0x9f, + 0x2e, 0x58, 0x92, 0xaa, 0x4e, 0x56, 0xbb, 0xcf, + 0x53, 0xf9, 0xe7, 0xa9, 0xfc, 0xf3, 0xd4, 0xfe, + 0x78, 0xf1, 0x74, 0xea, 0xfa, 0x33, 0xfb, 0x8f, + 0xf8, 0x7d, 0x06, 0xbe, 0x10, 0xb6, 0x6e, 0xf1, + 0xd7, 0x3e, 0x31, 0xf8, 0xcf, 0x8c, 0x7e, 0x33, + 0xe3, 0x1f, 0x8c, 0xf8, 0xc7, 0xe3, 0x3e, 0x31, + 0xf8, 0xcf, 0x8c, 0x7e, 0x33, 0xe3, 0x1f, 0x8c, + 0x05, 0x48, 0xcb, 0x88, 0x98, 0x3d, 0x9c, 0xfb, + 0x00, 0xbb, 0xc4, 0xda, 0x84, 0x0a, 0x23, 0x13, + 0x8e, 0xf8, 0x60, 0x58, 0x30, 0xea, 0x91, 0x00, + 0xeb, 0xf6, 0x0a, 0xa1, 0x9a, 0x96, 0x72, 0xd2, + 0x54, 0x22, 0x0d, 0x29, 0xb3, 0x8b, 0x1c, 0x0e, + 0xc6, 0x0b, 0x8a, 0x41, 0x44, 0xd1, 0x0b, 0xae, + 0xf6, 0x14, 0xf2, 0xc1, 0x4a, 0xd3, 0xb2, 0xe8, + 0x38, 0xe0, 0x99, 0xf1, 0x8f, 0xc6, 0x7c, 0x63, + 0xf1, 0x9f, 0x18, 0xfc, 0x67, 0xc6, 0x3f, 0x19, + 0xf1, 0x8f, 0xc6, 0x7c, 0x63, 0xf1, 0x9f, 0x18, + 0xfc, 0x67, 0xc6, 0x3f, 0x18, 0xb7, 0x79, 0x5f, + 0x2a, 0x55, 0xfe, 0x5f, 0xa4, 0xcf, 0x18, 0x98, + 0x2f, 0x48, 0xe2, 0x89, 0xfb, 0x67, 0x8c, 0xfb, + 0x67, 0x8c, 0xfb, 0x67, 0x8c, 0xfb, 0x67, 0x8c, + 0xfb, 0x67, 0x8c, 0xfb, 0x67, 0x8c, 0xfb, 0x67, + 0x8c, 0xfb, 0x67, 0x8c, 0xfb, 0x67, 0x8c, 0xfb, + 0x61, 0x4e, 0xcb, 0x6d, 0xf2, 0x29, 0x0e, 0x5a, + 0x58, 0xea, 0x8c, 0x30, 0x2a, 0xac, 0xc0, 0x52, + 0xb0, 0x08, 0x1e, 0x9d, 0x33, 0xc6, 0x7d, 0xb3, + 0xc6, 0x7d, 0xb1, 0x08, 0x18, 0x42, 0x1a, 0x08, + 0x20, 0xd6, 0xc7, 0x4e, 0x14, 0x6e, 0x2c, 0x58, + 0x5b, 0x4a, 0x85, 0xcc, 0x03, 0x41, 0x9e, 0x33, + 0xed, 0x9e, 0x33, 0xed, 0x9e, 0x33, 0xed, 0x9e, + 0x33, 0xed, 0x9e, 0x33, 0xed, 0x9e, 0x33, 0xed, + 0x92, 0x4e, 0x8e, 0x07, 0xd0, 0x7d, 0x51, 0x7f, + 0x6f, 0xd4, 0x33, 0x7b, 0xd3, 0x54, 0x84, 0x6b, + 0x8f, 0xdc, 0x08, 0xeb, 0xed, 0x9e, 0x33, 0x3c, + 0x66, 0x78, 0xcc, 0x47, 0x8e, 0x0e, 0xd6, 0x05, + 0xa8, 0xf0, 0x3f, 0x8c, 0x6f, 0xce, 0x16, 0x28, + 0x69, 0x06, 0xb6, 0xde, 0x8c, 0x4c, 0xdd, 0x28, + 0xd6, 0xee, 0x84, 0x0e, 0xdd, 0x01, 0xf5, 0xc7, + 0x46, 0x97, 0x25, 0x6a, 0xd6, 0x87, 0x7b, 0xd8, + 0xe3, 0xc6, 0x8a, 0xd1, 0xab, 0x51, 0x94, 0x36, + 0xea, 0xcf, 0x4c, 0xd4, 0x1a, 0xf4, 0xb1, 0x55, + 0x0a, 0xd5, 0x79, 0x5c, 0xe9, 0x51, 0x9e, 0x03, + 0x80, 0xcb, 0x0d, 0x9b, 0xc7, 0xe1, 0x00, 0x80, + 0x3c, 0x50, 0x4a, 0x6f, 0x73, 0x36, 0x91, 0x83, + 0x04, 0x89, 0x24, 0x44, 0x93, 0xa4, 0x98, 0x8b, + 0x0f, 0x17, 0x1e, 0x60, 0x3b, 0x1f, 0xb3, 0x1c, + 0xb7, 0x55, 0x01, 0xb3, 0x60, 0x22, 0xed, 0xdf, + 0x3b, 0xc3, 0x27, 0x10, 0xd0, 0x7a, 0x81, 0x35, + 0xd3, 0x5a, 0xe9, 0x88, 0xe0, 0xa4, 0x00, 0xa4, + 0x40, 0xd3, 0xbb, 0xbc, 0xbc, 0x62, 0x67, 0x05, + 0x40, 0x04, 0x7d, 0xd8, 0x0d, 0x67, 0xa6, 0xed, + 0xa6, 0x95, 0xde, 0x1c, 0xf1, 0x99, 0xe3, 0x33, + 0xc6, 0x63, 0x99, 0x62, 0x47, 0x1b, 0x53, 0xec, + 0x5c, 0xde, 0x4d, 0xa7, 0x70, 0xd0, 0xfe, 0xf3, + 0xfc, 0x46, 0xc0, 0xa6, 0xb6, 0x43, 0x15, 0x1c, + 0x53, 0xbc, 0xbd, 0x45, 0x00, 0xfc, 0xc0, 0x50, + 0x9d, 0xf8, 0x37, 0x94, 0x6d, 0x69, 0x28, 0xfc, + 0x85, 0xe5, 0xc8, 0x47, 0x2a, 0xba, 0x1c, 0xe3, + 0x70, 0xb9, 0xa6, 0xe1, 0x05, 0xb5, 0x5b, 0xe0, + 0x71, 0x86, 0xf4, 0x17, 0x8b, 0x86, 0x39, 0x04, + 0xf1, 0xa5, 0x7d, 0x95, 0x91, 0x40, 0x78, 0x17, + 0xd4, 0x89, 0xfb, 0x76, 0x3f, 0xc3, 0xe5, 0xbb, + 0x3f, 0x40, 0x6c, 0x42, 0x0a, 0xcd, 0xb0, 0xfe, + 0x72, 0x6a, 0x0e, 0x30, 0x26, 0x6a, 0x8b, 0x51, + 0x34, 0x41, 0x1c, 0xae, 0x48, 0x1b, 0x04, 0xdd, + 0xb8, 0xb3, 0x73, 0x2a, 0xe1, 0x4e, 0x82, 0x95, + 0x49, 0xb0, 0x47, 0x80, 0xeb, 0x95, 0x3f, 0x79, + 0xf7, 0x06, 0x21, 0x0a, 0xf1, 0x51, 0xd1, 0xc7, + 0x51, 0xd4, 0xd3, 0xd9, 0x24, 0x39, 0xea, 0xe3, + 0x52, 0xa8, 0x04, 0x28, 0xd1, 0x39, 0x1d, 0x65, + 0xd5, 0x98, 0x55, 0xce, 0x0f, 0x66, 0x10, 0x34, + 0xae, 0xa3, 0x90, 0x0c, 0x86, 0x24, 0x5e, 0xa6, + 0x08, 0x3d, 0x74, 0xe3, 0x53, 0x0e, 0x7b, 0xc0, + 0x76, 0xc0, 0xdf, 0x02, 0x8b, 0x1c, 0x13, 0x1c, + 0xbe, 0x42, 0x14, 0x54, 0x02, 0xaf, 0x00, 0x38, + 0x6f, 0xc8, 0x28, 0x3c, 0x96, 0x72, 0xe9, 0x79, + 0xc7, 0xfb, 0x1d, 0x15, 0x96, 0xd1, 0x36, 0x06, + 0xf6, 0x22, 0x73, 0x92, 0xb3, 0x4a, 0x7b, 0x22, + 0x62, 0xfd, 0x9c, 0x5e, 0x3e, 0xc4, 0xc2, 0x39, + 0x84, 0x10, 0x7a, 0x22, 0x74, 0xc6, 0x3f, 0x4d, + 0x99, 0xb9, 0x59, 0x22, 0xa1, 0xbd, 0xa1, 0xd3, + 0x06, 0x70, 0xc7, 0x31, 0x0a, 0x2a, 0x01, 0x57, + 0x80, 0x1c, 0x63, 0x7e, 0x12, 0x36, 0x28, 0x22, + 0x1d, 0x47, 0x77, 0xeb, 0xe6, 0xbb, 0x7d, 0x41, + 0x06, 0x5f, 0x0f, 0xa5, 0xc1, 0xe5, 0x31, 0x42, + 0x2e, 0x91, 0x15, 0xeb, 0xfd, 0x64, 0xe2, 0xca, + 0xed, 0xf6, 0x5c, 0xf2, 0xcf, 0x7c, 0xf2, 0xcf, + 0x7c, 0xf2, 0xcf, 0x7c, 0x35, 0xd6, 0xb0, 0xf8, + 0x56, 0x06, 0xd8, 0x0b, 0xf6, 0x33, 0xcb, 0x3d, + 0xf3, 0x59, 0x54, 0x64, 0x16, 0x28, 0x41, 0x8f, + 0x18, 0x79, 0x80, 0x6f, 0x0b, 0x87, 0x43, 0x34, + 0xef, 0xd3, 0x3c, 0xb3, 0xdf, 0x3c, 0xb3, 0xdf, + 0x3c, 0xb3, 0xdf, 0x3c, 0xb3, 0xdf, 0x12, 0x28, + 0x98, 0x76, 0xc4, 0x17, 0x64, 0xb1, 0x19, 0xcc, + 0x4c, 0xf2, 0xcf, 0x7c, 0xf2, 0xcf, 0x7c, 0xf2, + 0xcf, 0x7c, 0xf2, 0xcf, 0x7c, 0xf2, 0xcf, 0x7c, + 0xf2, 0xcf, 0x7c, 0xf2, 0xcf, 0x7c, 0xf2, 0xcf, + 0x7c, 0x6d, 0x39, 0x38, 0x43, 0x52, 0x96, 0x1d, + 0x89, 0xf5, 0x4e, 0x24, 0x44, 0x39, 0x24, 0x07, + 0x5f, 0xe0, 0x22, 0x44, 0x89, 0x12, 0x24, 0x48, + 0xed, 0x9b, 0x26, 0x5d, 0xcb, 0x09, 0x75, 0xce, + 0x3d, 0x18, 0x38, 0x83, 0x55, 0x5d, 0xd5, 0xeb, + 0x86, 0x13, 0x8b, 0x20, 0xe1, 0x12, 0xc7, 0x18, + 0xc3, 0xd0, 0x30, 0x44, 0x2a, 0x04, 0x52, 0x5e, + 0x17, 0x39, 0x33, 0x9b, 0xb3, 0xe6, 0x1b, 0x8c, + 0x34, 0xeb, 0x22, 0xab, 0xe4, 0xe5, 0x4e, 0x69, + 0x85, 0xb5, 0xdd, 0xdf, 0xf8, 0x48, 0x91, 0x22, + 0x44, 0x89, 0x12, 0x24, 0x5b, 0x9a, 0x6d, 0xd0, + 0x11, 0x3f, 0x91, 0xfa, 0x0d, 0xc6, 0x17, 0x6d, + 0x0a, 0x3e, 0xe4, 0x7f, 0x3f, 0x41, 0x16, 0x00, + 0xb2, 0x83, 0xbe, 0xb1, 0x01, 0xe2, 0x70, 0xa1, + 0xeb, 0x18, 0x4b, 0x1d, 0x01, 0x28, 0xc0, 0x51, + 0x63, 0x5b, 0x36, 0x80, 0x3b, 0x57, 0x76, 0x0a, + 0x71, 0x12, 0xe0, 0x6a, 0x8a, 0x40, 0x54, 0x41, + 0xd1, 0xf7, 0xb8, 0xad, 0x33, 0x5f, 0xd8, 0x90, + 0x57, 0xed, 0x33, 0x7f, 0x79, 0xac, 0xa2, 0x63, + 0x6a, 0x28, 0x2f, 0x4d, 0x38, 0x4b, 0x7a, 0xca, + 0x0c, 0x2c, 0x36, 0xd6, 0x76, 0x51, 0xe2, 0xe1, + 0x9d, 0x70, 0x9a, 0x51, 0x06, 0x31, 0x47, 0x66, + 0x82, 0xac, 0x45, 0x8a, 0xf8, 0x9a, 0xd3, 0xa1, + 0xb0, 0xf4, 0x15, 0xcb, 0x5f, 0x66, 0x4a, 0x71, + 0x85, 0xe8, 0xa7, 0xd9, 0xb6, 0xe3, 0xf7, 0x42, + 0x7a, 0x12, 0x3d, 0xde, 0x0f, 0x82, 0x49, 0x66, + 0x23, 0x15, 0x76, 0x23, 0xa3, 0xe3, 0xd9, 0xdb, + 0x06, 0xe4, 0x4f, 0x9e, 0x61, 0xa6, 0x76, 0x6f, + 0x2b, 0x40, 0x16, 0x3b, 0xc2, 0x73, 0xa6, 0x93, + 0x17, 0x6d, 0x16, 0xce, 0xe8, 0x19, 0xb2, 0x88, + 0x21, 0x45, 0x79, 0x30, 0x49, 0x00, 0x7e, 0xfd, + 0x67, 0x86, 0x10, 0xba, 0x63, 0x8b, 0xd0, 0x34, + 0x78, 0x65, 0xee, 0xf0, 0x7c, 0x12, 0x4b, 0x32, + 0xd6, 0xca, 0x55, 0x75, 0xb4, 0xe3, 0x94, 0xaa, + 0x2e, 0x7e, 0xb6, 0x62, 0x8e, 0xf2, 0x90, 0x7d, + 0x80, 0xfe, 0xff, 0x00, 0x43, 0x92, 0x1b, 0xf4, + 0x7d, 0xa6, 0x3b, 0xc7, 0xfa, 0xfe, 0x9b, 0xd1, + 0xe7, 0xf2, 0x88, 0x11, 0x49, 0xdf, 0x00, 0xea, + 0x63, 0xc5, 0x8d, 0xe2, 0x61, 0xda, 0xa1, 0x45, + 0x02, 0x74, 0x93, 0x8c, 0x49, 0x1a, 0xc0, 0x7b, + 0xa6, 0x41, 0x14, 0xe8, 0x60, 0xa8, 0xb7, 0x77, + 0x35, 0x1a, 0x8b, 0x8e, 0xbc, 0x25, 0x73, 0xb1, + 0xd1, 0x05, 0x16, 0xa2, 0x46, 0xaa, 0x34, 0x47, + 0x6d, 0x4e, 0x8a, 0xdb, 0xa2, 0x29, 0xda, 0x23, + 0x11, 0x09, 0x7f, 0x9b, 0x14, 0x8d, 0xbb, 0xcc, + 0xa0, 0x97, 0x4c, 0x79, 0x17, 0xc2, 0x2e, 0x03, + 0xe9, 0x64, 0x37, 0x4b, 0x84, 0xb9, 0xe5, 0xe8, + 0xd8, 0xa2, 0x25, 0x17, 0x63, 0x89, 0x62, 0xb1, + 0xd4, 0x3c, 0xa8, 0x03, 0x74, 0x5a, 0xe1, 0xac, + 0x68, 0xf9, 0x2b, 0x35, 0xd1, 0x88, 0x11, 0x25, + 0xa9, 0x35, 0x18, 0x8b, 0xb1, 0xa8, 0x50, 0x43, + 0xcb, 0xa3, 0xb9, 0x10, 0x42, 0x3b, 0xa9, 0xd1, + 0x90, 0xaf, 0x58, 0x04, 0x43, 0xdc, 0x94, 0xfd, + 0x66, 0x94, 0x1e, 0x9b, 0x2b, 0xd2, 0x38, 0xab, + 0x59, 0x42, 0x15, 0xba, 0x08, 0xf2, 0x09, 0xa6, + 0x53, 0x68, 0x49, 0x9c, 0x37, 0x2c, 0x56, 0xeb, + 0x2c, 0xa2, 0xec, 0x09, 0x89, 0xa6, 0xfc, 0x82, + 0x55, 0xd2, 0x97, 0x36, 0x5e, 0x74, 0x45, 0xb7, + 0x16, 0xf9, 0x1c, 0xa7, 0x1b, 0x28, 0x42, 0xed, + 0x49, 0x96, 0xe2, 0xdf, 0x23, 0x94, 0xe3, 0x65, + 0x08, 0x5d, 0xa9, 0x30, 0x1c, 0xbd, 0x40, 0x99, + 0x4b, 0x3e, 0x04, 0x8f, 0x18, 0xec, 0xeb, 0xd6, + 0x59, 0x54, 0x08, 0x44, 0x6e, 0x15, 0xd8, 0xf8, + 0xe6, 0x45, 0x2a, 0x5d, 0xb4, 0x2c, 0xc2, 0xc9, + 0xd7, 0x94, 0x21, 0x5b, 0x40, 0x2a, 0xf0, 0x03, + 0x8d, 0xa7, 0xc6, 0x82, 0x42, 0x9e, 0x05, 0x67, + 0xa8, 0x74, 0x71, 0x57, 0x0d, 0x40, 0x76, 0x1d, + 0x1c, 0x9c, 0xb9, 0xb4, 0xb6, 0x98, 0x8a, 0x38, + 0x6e, 0xa0, 0xe8, 0x89, 0xd3, 0x0d, 0x41, 0x90, + 0x82, 0x3a, 0x9f, 0x48, 0x9c, 0xaf, 0x78, 0x0b, + 0x89, 0xec, 0x31, 0xd7, 0xa1, 0x39, 0x60, 0xae, + 0xe6, 0x17, 0x14, 0x36, 0x3e, 0x85, 0x0d, 0xa2, + 0x28, 0x02, 0x29, 0x31, 0x77, 0x88, 0xc5, 0x06, + 0x26, 0x97, 0xdb, 0x68, 0x8d, 0x17, 0x70, 0xf8, + 0xe0, 0x4e, 0xfa, 0xc7, 0x7b, 0x07, 0x40, 0xb7, + 0xc1, 0x75, 0xbf, 0x4d, 0x59, 0x58, 0x90, 0x03, + 0xb3, 0x10, 0xe7, 0x2b, 0x72, 0x19, 0x1d, 0x9d, + 0x79, 0x7e, 0x09, 0x5c, 0xe0, 0xc2, 0xd8, 0x86, + 0xb7, 0xa8, 0x2b, 0xfb, 0x38, 0xce, 0x4c, 0x50, + 0xe3, 0x7e, 0xa2, 0xcb, 0x2f, 0x5e, 0xc6, 0x28, + 0x24, 0x0a, 0x6a, 0xb1, 0xf4, 0x36, 0x85, 0xa0, + 0xfd, 0xc4, 0xda, 0xac, 0xe1, 0x07, 0x2d, 0x97, + 0xba, 0x1b, 0xdc, 0xbb, 0xf9, 0x0f, 0xf0, 0x23, + 0x46, 0x8d, 0x1a, 0x34, 0x68, 0xf8, 0xaf, 0x2a, + 0xa6, 0x40, 0x1d, 0x21, 0x04, 0x12, 0x86, 0xda, + 0x99, 0xa9, 0x51, 0x15, 0xef, 0xfa, 0x28, 0xd1, + 0xa3, 0x39, 0x77, 0x03, 0x50, 0xdb, 0x5b, 0x45, + 0x7d, 0x6f, 0x1c, 0x7e, 0xb4, 0x68, 0xd1, 0xa3, + 0x46, 0x8c, 0x9a, 0xa2, 0xd3, 0xc6, 0xe3, 0x0b, + 0xb1, 0xaf, 0xb9, 0x8a, 0x53, 0x04, 0x4e, 0x31, + 0x74, 0xec, 0x1d, 0x0d, 0x7d, 0x0e, 0x00, 0x2e, + 0x3f, 0x1f, 0xa7, 0xc7, 0x2a, 0xa9, 0x54, 0x06, + 0xb9, 0xf1, 0x8f, 0xce, 0x7c, 0x63, 0xf3, 0x9f, + 0x18, 0xfc, 0xe7, 0xc6, 0x3f, 0x38, 0x80, 0xa1, + 0x54, 0x94, 0x4d, 0x80, 0xef, 0x82, 0x55, 0x48, + 0x5e, 0xb8, 0xab, 0xa5, 0xae, 0x74, 0xc2, 0x67, + 0x3f, 0xb9, 0x03, 0xa2, 0xa0, 0x1e, 0x17, 0xae, + 0x21, 0x3e, 0xd2, 0x36, 0x99, 0x43, 0x3c, 0x14, + 0xe5, 0x0e, 0xf1, 0xc9, 0x6e, 0xea, 0x27, 0xcc, + 0x69, 0xd7, 0x74, 0xa1, 0x8d, 0x63, 0x99, 0x0a, + 0x36, 0x69, 0xa3, 0xc1, 0x30, 0x08, 0xe8, 0xa1, + 0x31, 0xdc, 0x8d, 0x16, 0x06, 0x01, 0x6a, 0xd6, + 0xd7, 0x0c, 0x4f, 0xc0, 0x21, 0x20, 0x30, 0x08, + 0x00, 0x72, 0xd5, 0xe8, 0x7a, 0x25, 0x65, 0x40, + 0x3a, 0x0d, 0xd3, 0xa2, 0x3c, 0xef, 0x2b, 0xb5, + 0x2f, 0x13, 0xb2, 0xa2, 0xa3, 0xb3, 0xab, 0x59, + 0x8a, 0x84, 0xc6, 0x90, 0x45, 0x97, 0x99, 0xc8, + 0x3a, 0x1c, 0x6b, 0x2a, 0x35, 0x66, 0x4a, 0x5c, + 0x82, 0x8a, 0x53, 0x73, 0xa8, 0x4a, 0x63, 0xbd, + 0xea, 0x5a, 0xc0, 0x01, 0x09, 0xc0, 0xad, 0x67, + 0xc6, 0x3f, 0x39, 0xf1, 0x8f, 0xce, 0x7c, 0x63, + 0xf3, 0x9f, 0x18, 0xfc, 0xe3, 0x3e, 0xee, 0x40, + 0x2e, 0xa7, 0x3f, 0xa0, 0xd6, 0x0b, 0x55, 0xa7, + 0x89, 0xbc, 0x68, 0x3f, 0x6c, 0x61, 0xe3, 0xbc, + 0xe8, 0x2f, 0xdc, 0x0e, 0xec, 0xc2, 0x01, 0xad, + 0x84, 0x52, 0xeb, 0x5c, 0xf6, 0xc2, 0xb0, 0x47, + 0xca, 0xc8, 0x77, 0xde, 0xf4, 0x0d, 0xe2, 0x61, + 0x58, 0x23, 0xe5, 0x64, 0x3b, 0xef, 0x7a, 0x06, + 0xf1, 0x30, 0x14, 0x36, 0xb6, 0xba, 0x10, 0xd8, + 0x6f, 0x8e, 0x66, 0x42, 0x31, 0x5c, 0x08, 0x33, + 0x07, 0x63, 0x26, 0x9d, 0xf2, 0xd0, 0x20, 0x1e, + 0xfe, 0x35, 0x00, 0x9b, 0xe8, 0x18, 0x90, 0xe7, + 0x09, 0xdf, 0x82, 0x20, 0xf9, 0x8b, 0xa3, 0x8f, + 0xcc, 0x95, 0x48, 0xa6, 0xbf, 0xb8, 0x07, 0xed, + 0x8e, 0x52, 0x7c, 0xc2, 0x8e, 0x40, 0x1d, 0x89, + 0x49, 0xc6, 0x6f, 0x55, 0x6b, 0xb1, 0xf7, 0xac, + 0x41, 0xec, 0x8e, 0x20, 0xf9, 0x60, 0xed, 0xe1, + 0x67, 0x6c, 0x7b, 0xb0, 0x20, 0x60, 0xcd, 0xa3, + 0xa0, 0x06, 0xce, 0xf5, 0x8a, 0x6c, 0x76, 0x44, + 0x7b, 0xe0, 0x99, 0xea, 0x75, 0x71, 0x81, 0x6e, + 0x36, 0x42, 0x4d, 0x1a, 0x36, 0x3d, 0x41, 0x2c, + 0xa6, 0x4b, 0xc4, 0x07, 0x04, 0x0a, 0x44, 0x3c, + 0x13, 0x63, 0x8a, 0xf1, 0x8f, 0xc8, 0xb5, 0xe2, + 0x0c, 0x5d, 0x14, 0xe8, 0xaa, 0x38, 0xfb, 0x78, + 0xd3, 0x7e, 0x2d, 0x63, 0x07, 0x50, 0x3d, 0x55, + 0xfd, 0xb9, 0xe5, 0xfb, 0x33, 0xcb, 0x76, 0x7f, + 0xb4, 0x3f, 0x44, 0x0f, 0xc6, 0x39, 0xd5, 0x5a, + 0x04, 0x34, 0xcf, 0x8c, 0x7e, 0x33, 0xe3, 0x1f, + 0x8c, 0xf8, 0xc7, 0xe3, 0x3e, 0x31, 0xf8, 0xc7, + 0x3c, 0x48, 0xd1, 0x61, 0x57, 0x8d, 0x00, 0x2a, + 0xba, 0x02, 0xb8, 0xa3, 0x52, 0xa5, 0x11, 0xa9, + 0x04, 0x15, 0x1d, 0x3f, 0x7c, 0xd3, 0x99, 0x06, + 0x93, 0x68, 0x45, 0x05, 0x8c, 0x58, 0xf6, 0xc0, + 0x83, 0x54, 0xb6, 0x51, 0x79, 0x38, 0x77, 0xc1, + 0x37, 0x66, 0x48, 0x25, 0xbd, 0xc8, 0xae, 0xe0, + 0x08, 0x2d, 0x59, 0xac, 0x7b, 0xb3, 0x39, 0x41, + 0x88, 0xeb, 0xbe, 0x7c, 0x63, 0xf1, 0x9f, 0x18, + 0xfc, 0x60, 0x16, 0x45, 0xb6, 0x61, 0xa5, 0x36, + 0xa9, 0xc9, 0x77, 0x1c, 0xf8, 0xc7, 0xe3, 0x05, + 0xb4, 0x9c, 0x12, 0x60, 0x00, 0x6d, 0x5e, 0x98, + 0xa0, 0x34, 0x62, 0x23, 0x5f, 0xd6, 0x7c, 0x63, + 0xf1, 0x9f, 0x18, 0xfc, 0x67, 0xc6, 0x3f, 0x19, + 0xf1, 0x8f, 0xc6, 0x7c, 0x63, 0xf1, 0x88, 0xfb, + 0x39, 0x14, 0x9a, 0xbc, 0x7f, 0x88, 0xd2, 0xfb, + 0xd0, 0x62, 0x49, 0x03, 0x7b, 0x1a, 0x6f, 0x67, + 0x7c, 0x2e, 0x71, 0x8e, 0x24, 0xa1, 0xe4, 0xa0, + 0x0e, 0xaa, 0x19, 0x3c, 0xa5, 0xb9, 0xd4, 0x0a, + 0x00, 0xaa, 0x1f, 0x77, 0x1b, 0xae, 0x43, 0x9c, + 0xaa, 0x20, 0x03, 0x75, 0xce, 0x6d, 0x89, 0x92, + 0x2a, 0x81, 0x60, 0x0a, 0xbd, 0x03, 0x1e, 0x0c, + 0x77, 0xa4, 0xb3, 0x43, 0x2c, 0x65, 0xec, 0xe2, + 0xde, 0x94, 0x7c, 0xb3, 0x98, 0x9d, 0xaf, 0x33, + 0x8c, 0x5c, 0xe3, 0x51, 0x1d, 0x84, 0x87, 0x3d, + 0x5f, 0xa8, 0x19, 0x21, 0x2f, 0x50, 0x9b, 0x14, + 0x33, 0x54, 0xe6, 0x48, 0x0c, 0x6c, 0x80, 0x95, + 0xb9, 0x49, 0x34, 0x16, 0x2d, 0x96, 0xf2, 0x09, + 0xf5, 0xf2, 0xdd, 0x9f, 0xef, 0x10, 0xbf, 0xa7, + 0x8f, 0xf5, 0xfd, 0x20, 0x1b, 0xf6, 0x47, 0xff, + 0x00, 0x67, 0xe4, 0xcd, 0x67, 0x54, 0xd5, 0x2a, + 0x94, 0x03, 0x7d, 0x4d, 0x75, 0x2e, 0x06, 0x01, + 0xea, 0x60, 0xba, 0x56, 0x10, 0xa9, 0x08, 0x6e, + 0xc8, 0x35, 0xb3, 0x49, 0x6b, 0xb4, 0xe3, 0x44, + 0xe9, 0xf6, 0x63, 0x14, 0x8d, 0x11, 0x60, 0x41, + 0xa9, 0x1e, 0x8e, 0xa7, 0x19, 0x27, 0xc1, 0x4a, + 0x77, 0x14, 0x40, 0x39, 0x11, 0x4d, 0x4c, 0x4b, + 0xb1, 0xe1, 0xec, 0x48, 0xdb, 0x23, 0xbe, 0x91, + 0x40, 0x12, 0x86, 0x7c, 0x03, 0x4e, 0x45, 0x98, + 0x09, 0x60, 0x6e, 0x12, 0xe4, 0x87, 0x43, 0x08, + 0xb1, 0x2b, 0xa1, 0x04, 0x5c, 0x3a, 0x57, 0x3a, + 0x20, 0xc8, 0x11, 0xc1, 0x62, 0x14, 0xe2, 0x8a, + 0x83, 0xa8, 0x2f, 0x6b, 0x01, 0x28, 0x42, 0x04, + 0x77, 0xab, 0x83, 0xf1, 0x44, 0xc1, 0x81, 0xd6, + 0x09, 0x5b, 0x35, 0x8c, 0x31, 0xf3, 0x25, 0xce, + 0x2c, 0x87, 0xdf, 0x95, 0xd1, 0xfe, 0x73, 0x4d, + 0x59, 0x43, 0xed, 0x09, 0x1d, 0xde, 0x9f, 0xa7, + 0x57, 0xa6, 0x6c, 0x3d, 0xa1, 0x23, 0x57, 0xd3, + 0xf4, 0xea, 0xf4, 0xc2, 0x3a, 0xfa, 0x10, 0xdf, + 0xbf, 0xfb, 0x5f, 0xc7, 0x15, 0x28, 0x70, 0x05, + 0x18, 0x9e, 0x76, 0x8c, 0xe1, 0x42, 0xf0, 0x66, + 0xb4, 0xec, 0x7d, 0xe0, 0x00, 0x05, 0xb7, 0x5d, + 0x87, 0x0a, 0x57, 0x50, 0xaa, 0xd5, 0xd3, 0xd1, + 0x4b, 0x83, 0xc7, 0x75, 0x8f, 0x7a, 0x24, 0x11, + 0xae, 0xe4, 0x34, 0x05, 0x6b, 0xaf, 0xd7, 0xe5, + 0xbb, 0x3f, 0xdb, 0xa0, 0x2f, 0xd1, 0xf6, 0x99, + 0x05, 0x6f, 0x5c, 0x86, 0x81, 0x71, 0xf1, 0x8f, + 0xce, 0x7c, 0x63, 0xf3, 0x9f, 0x18, 0xfc, 0xe7, + 0xc6, 0x3f, 0x38, 0xe3, 0x99, 0x42, 0x09, 0x48, + 0x9c, 0xec, 0x45, 0x11, 0xd2, 0x31, 0xc1, 0x3b, + 0x58, 0xe4, 0xe4, 0x02, 0xa0, 0x59, 0x78, 0xde, + 0x8c, 0x11, 0x81, 0x13, 0x3a, 0xc2, 0xed, 0x00, + 0x51, 0x28, 0xc6, 0xe6, 0x96, 0x8a, 0x4f, 0xa6, + 0x71, 0x70, 0xeb, 0x82, 0x6a, 0x4c, 0xd2, 0x80, + 0x68, 0x6f, 0xe6, 0x1e, 0x5d, 0x6a, 0x58, 0x57, + 0xbb, 0x84, 0x6a, 0xf8, 0xdd, 0xb8, 0x23, 0x2d, + 0x28, 0x1d, 0x99, 0xdd, 0xe7, 0x06, 0x9e, 0x23, + 0x70, 0x55, 0x80, 0x0e, 0x03, 0x27, 0xa0, 0xa7, + 0x72, 0xd8, 0x12, 0xa6, 0x80, 0x35, 0xef, 0x83, + 0x47, 0xbd, 0x7d, 0xb8, 0xa9, 0x00, 0x45, 0xe5, + 0xb5, 0x70, 0xfc, 0x21, 0xe9, 0x89, 0xeb, 0xb6, + 0x69, 0xb0, 0xe1, 0x37, 0x81, 0xa0, 0xed, 0x70, + 0xfa, 0xbd, 0x00, 0xbc, 0x9c, 0x2a, 0x67, 0x12, + 0xf3, 0xd2, 0x12, 0x3a, 0x4c, 0x39, 0x1a, 0x3b, + 0x62, 0x78, 0x80, 0x23, 0x75, 0x14, 0xdb, 0xbb, + 0x5a, 0xef, 0xb0, 0x67, 0xc6, 0x3f, 0x39, 0xf1, + 0x8f, 0xce, 0x7c, 0x63, 0xf3, 0x9f, 0x18, 0xfc, + 0xe3, 0x3e, 0xee, 0x40, 0x2e, 0xa7, 0x3f, 0x54, + 0x83, 0xc3, 0x65, 0x7a, 0xc3, 0x3c, 0x67, 0xdb, + 0x3c, 0x67, 0xdb, 0x3c, 0x67, 0xdb, 0x3c, 0x67, + 0xdb, 0x3c, 0x67, 0xdb, 0x3c, 0x67, 0xdb, 0x10, + 0xa7, 0x53, 0x50, 0x09, 0x09, 0x74, 0x68, 0x8f, + 0x3b, 0xc2, 0x40, 0x79, 0x5c, 0x47, 0x90, 0x8b, + 0x0e, 0xb8, 0x59, 0x39, 0xc1, 0xa3, 0xba, 0x88, + 0xfb, 0x2f, 0x24, 0xe3, 0x63, 0xcb, 0x8e, 0x7b, + 0x78, 0x70, 0x5c, 0x7a, 0x87, 0x3c, 0x4f, 0x4c, + 0x21, 0x35, 0x45, 0x43, 0xd8, 0x0c, 0xc6, 0xde, + 0x09, 0x30, 0x08, 0x90, 0x49, 0xb4, 0x46, 0xbd, + 0x50, 0x58, 0xdd, 0x8e, 0xa4, 0x40, 0xc8, 0xda, + 0x60, 0x82, 0x13, 0xa7, 0x68, 0xeb, 0x12, 0x0b, + 0x56, 0x94, 0xca, 0x11, 0x6d, 0x45, 0x1a, 0x44, + 0xd6, 0x78, 0xcf, 0xb6, 0x78, 0xcf, 0xb6, 0x78, + 0xcf, 0xb6, 0x78, 0xcf, 0xb6, 0x78, 0xcf, 0xb6, + 0x78, 0xcf, 0xb6, 0x78, 0xcf, 0xb6, 0x28, 0x80, + 0x0a, 0x22, 0x31, 0xfe, 0xd1, 0xcc, 0x0d, 0xfa, + 0x7e, 0xd7, 0x00, 0x9e, 0x10, 0x29, 0xa7, 0x45, + 0x1c, 0xf1, 0x9f, 0x7c, 0xf1, 0x9f, 0x7c, 0x10, + 0xd0, 0x2e, 0x97, 0x30, 0xe1, 0x40, 0x5b, 0xcf, + 0x73, 0x2c, 0x3a, 0x66, 0xaa, 0x14, 0x31, 0xb7, + 0xae, 0x6c, 0xb4, 0xe2, 0x77, 0xce, 0x54, 0x21, + 0xd0, 0xbd, 0x9c, 0x69, 0x2a, 0x5a, 0xa2, 0x27, + 0x3d, 0xcc, 0x18, 0xe8, 0xfc, 0xbd, 0x41, 0x16, + 0x53, 0xd3, 0x8c, 0x21, 0x41, 0xac, 0x63, 0x80, + 0x0b, 0xbc, 0xdc, 0x74, 0xc7, 0xff, 0x00, 0x41, + 0x04, 0xa5, 0xdc, 0xa8, 0x82, 0xb2, 0x2a, 0xe1, + 0xd8, 0x94, 0x2a, 0x52, 0x14, 0x06, 0x50, 0x39, + 0x3b, 0xe2, 0xf4, 0x22, 0x6f, 0x02, 0xc2, 0xb2, + 0x84, 0x05, 0x50, 0x06, 0x12, 0xa4, 0x66, 0x7d, + 0xc8, 0x03, 0xa4, 0x34, 0x6d, 0xe2, 0xba, 0xa3, + 0x3e, 0x72, 0xac, 0xe2, 0x43, 0xd6, 0xdb, 0xac, + 0x16, 0xd6, 0x06, 0x0a, 0x41, 0x64, 0xd1, 0x0b, + 0xae, 0xf6, 0x1b, 0x09, 0x28, 0xb4, 0x26, 0x12, + 0x88, 0x76, 0x1a, 0x03, 0x59, 0x86, 0x6d, 0x65, + 0x88, 0x82, 0x85, 0x65, 0x77, 0x07, 0x04, 0xc0, + 0xc9, 0x98, 0x56, 0x15, 0xa8, 0x46, 0x6f, 0xd4, + 0xc1, 0x60, 0xba, 0x2a, 0x0d, 0x16, 0xc4, 0xd1, + 0xab, 0xa2, 0xe0, 0x06, 0xf4, 0x89, 0xc2, 0x68, + 0x87, 0x3a, 0x61, 0x70, 0x43, 0x34, 0x0f, 0xaf, + 0x39, 0xe3, 0x3e, 0xf8, 0x4c, 0x81, 0x08, 0x8c, + 0xac, 0x5e, 0x76, 0xff, 0x00, 0x3f, 0x51, 0x41, + 0xb8, 0xa2, 0xca, 0xd8, 0xe5, 0x86, 0x7c, 0x63, + 0xf1, 0x9f, 0x18, 0xfc, 0x61, 0xc7, 0xed, 0xd9, + 0x14, 0x86, 0x90, 0xdd, 0x53, 0x93, 0x9e, 0x9b, + 0xaf, 0x0e, 0x17, 0x83, 0x8e, 0xc0, 0x14, 0x63, + 0x55, 0x98, 0xc9, 0x0d, 0xf2, 0x4b, 0xe4, 0x02, + 0xd3, 0x7b, 0x3a, 0x37, 0x0a, 0xb8, 0x3a, 0x80, + 0x29, 0x14, 0xc0, 0xec, 0x8f, 0x47, 0x2f, 0x3a, + 0x66, 0xea, 0x14, 0x31, 0xb7, 0xae, 0x19, 0x06, + 0xc0, 0x3a, 0x1e, 0x4a, 0x18, 0xfa, 0x98, 0xab, + 0xc5, 0x77, 0x77, 0xf1, 0x35, 0xea, 0xcb, 0x39, + 0x5b, 0xac, 0x10, 0x56, 0x5a, 0xaa, 0x48, 0x48, + 0x57, 0xe9, 0x79, 0xc3, 0x8d, 0x2d, 0xdf, 0xd9, + 0xcb, 0x2c, 0x30, 0x90, 0x5d, 0x0c, 0x00, 0x9c, + 0xc2, 0x20, 0xa1, 0x32, 0xbd, 0x07, 0x16, 0x0d, + 0x06, 0x71, 0xfc, 0x61, 0x96, 0xd5, 0x7d, 0xf2, + 0xc0, 0x10, 0xd2, 0x28, 0xef, 0x58, 0xf2, 0x74, + 0xb6, 0x44, 0x4e, 0x3b, 0x99, 0xf1, 0x8f, 0xc6, + 0x7c, 0x63, 0xf1, 0x85, 0x77, 0xb2, 0xc4, 0x84, + 0x34, 0xeb, 0xb5, 0x3a, 0x73, 0x9f, 0x18, 0xfc, + 0x67, 0xc6, 0x3f, 0x19, 0xf1, 0x8f, 0xc6, 0x36, + 0x1e, 0x6d, 0xf5, 0x57, 0xfb, 0x5f, 0xf6, 0x87, + 0xeb, 0x42, 0x58, 0x0c, 0x9e, 0x07, 0x19, 0x24, + 0xb4, 0x28, 0xa9, 0x4b, 0xe9, 0xf5, 0x3b, 0x77, + 0xe9, 0xd7, 0xd4, 0x9e, 0xbb, 0x2e, 0xf2, 0x73, + 0x5d, 0x24, 0x46, 0xc1, 0xda, 0x82, 0xee, 0xeb, + 0x6c, 0x5e, 0x62, 0x1a, 0xf6, 0x39, 0xe2, 0xc8, + 0xc3, 0xbe, 0x22, 0x7f, 0xd4, 0x95, 0x13, 0x59, + 0x61, 0x09, 0xba, 0x7b, 0x94, 0x75, 0x96, 0x37, + 0x14, 0x27, 0xcb, 0x82, 0x4e, 0x95, 0xd5, 0x2e, + 0xa6, 0x81, 0xce, 0x53, 0xf6, 0xba, 0x89, 0x9b, + 0x1d, 0x44, 0x51, 0x5c, 0x34, 0x74, 0xd2, 0x83, + 0x10, 0x8a, 0x6d, 0x6d, 0xb3, 0x81, 0xcd, 0x52, + 0xbf, 0x17, 0x41, 0xb4, 0x91, 0xb6, 0xd4, 0x54, + 0xc1, 0x8e, 0x07, 0xe0, 0xd0, 0x5c, 0x45, 0xb8, + 0xc9, 0x83, 0x7a, 0x0b, 0xc5, 0xc3, 0x1c, 0x82, + 0x78, 0xd2, 0xbe, 0xce, 0xbf, 0x16, 0x12, 0xab, + 0x54, 0x55, 0x1b, 0x3a, 0x90, 0x61, 0x2b, 0xbd, + 0x1a, 0xed, 0x03, 0x72, 0x5d, 0x61, 0x50, 0xf5, + 0x08, 0x68, 0xbe, 0xea, 0xd7, 0xad, 0xfa, 0xe1, + 0x4e, 0xb9, 0xa8, 0xe2, 0x10, 0x00, 0x2a, 0xf4, + 0x98, 0x8e, 0x2e, 0x03, 0x30, 0x4a, 0x04, 0x1b, + 0x91, 0xe3, 0x97, 0x06, 0xf1, 0x89, 0xc2, 0x01, + 0xfb, 0x82, 0xfe, 0x91, 0xbe, 0x33, 0xb7, 0xd4, + 0xa1, 0xf4, 0xab, 0x87, 0x73, 0x70, 0xab, 0xb6, + 0x29, 0xc3, 0x45, 0x56, 0xe4, 0x53, 0x98, 0x6e, + 0xc0, 0x1c, 0x30, 0x26, 0x6b, 0x8a, 0xdd, 0x93, + 0x77, 0xb3, 0x46, 0x0b, 0x94, 0x22, 0xe7, 0x18, + 0x85, 0x6b, 0x5d, 0xb1, 0x24, 0x0d, 0xa7, 0x8a, + 0x18, 0x0d, 0xc3, 0x47, 0xad, 0xbb, 0xa7, 0xdb, + 0x13, 0xd1, 0xd5, 0xb9, 0xae, 0xb2, 0x52, 0x1f, + 0x71, 0xdc, 0xcf, 0x56, 0x72, 0x64, 0x21, 0xfc, + 0xb8, 0x0b, 0x07, 0xc8, 0x57, 0x9d, 0x77, 0x3a, + 0xf1, 0x8b, 0x96, 0xb2, 0x93, 0x2c, 0x14, 0xc0, + 0x75, 0x55, 0xf5, 0xc0, 0xa7, 0x01, 0x22, 0x23, + 0x57, 0x10, 0xa1, 0xa2, 0x8f, 0xaa, 0xf3, 0x4f, + 0x81, 0x4d, 0x0b, 0x82, 0x9a, 0xe0, 0x6e, 0x62, + 0xe8, 0xa9, 0x44, 0x2b, 0xf5, 0x37, 0x02, 0x35, + 0xa0, 0x60, 0xc1, 0x67, 0xb4, 0x22, 0x0d, 0x30, + 0x0b, 0xc9, 0xa4, 0xb9, 0xa3, 0x9b, 0xf0, 0x5a, + 0x25, 0xe3, 0x1a, 0x4b, 0x1c, 0xe7, 0x17, 0x17, + 0xad, 0x20, 0x36, 0x2b, 0x74, 0xd5, 0x66, 0x48, + 0x19, 0x14, 0x61, 0xa7, 0xc4, 0x38, 0x6b, 0x63, + 0xea, 0xff, 0x00, 0xe2, 0x41, 0x71, 0x6f, 0x86, + 0x74, 0xd4, 0xf6, 0xd3, 0xe3, 0x65, 0xa4, 0x37, + 0x70, 0x20, 0xde, 0xce, 0x41, 0x21, 0x15, 0x55, + 0x5e, 0xaa, 0xb8, 0xaa, 0x69, 0x76, 0xa5, 0xcc, + 0x76, 0x3d, 0x57, 0x16, 0x49, 0xaa, 0x56, 0xac, + 0x77, 0x4e, 0x0e, 0x85, 0xee, 0xb0, 0x82, 0xc4, + 0x40, 0x95, 0x25, 0x13, 0x1b, 0x55, 0x75, 0xba, + 0xe3, 0xc9, 0x8e, 0xd4, 0x96, 0x6c, 0x2c, 0xac, + 0xbd, 0xdc, 0xe6, 0xd1, 0xc8, 0x03, 0x4a, 0xd0, + 0xdb, 0xc3, 0xd5, 0xc6, 0x2b, 0x05, 0xbd, 0x22, + 0x95, 0xdb, 0x8e, 0x1a, 0x75, 0x96, 0x22, 0xd4, + 0x4a, 0xe2, 0xbd, 0x06, 0xcc, 0xda, 0x47, 0x37, + 0xd1, 0x52, 0xd6, 0x81, 0x8e, 0xa8, 0x60, 0xd9, + 0x5d, 0x8c, 0x08, 0x0e, 0x97, 0x63, 0xd4, 0xd7, + 0x19, 0xc9, 0x8c, 0xb7, 0x5f, 0x30, 0xe4, 0x61, + 0xa7, 0x59, 0xa1, 0x68, 0xd4, 0x7a, 0x24, 0x19, + 0x68, 0x37, 0xd3, 0x35, 0xe6, 0x55, 0x90, 0x44, + 0xdf, 0x61, 0x0d, 0xdb, 0xac, 0x79, 0x7a, 0x24, + 0x43, 0x13, 0xb3, 0x62, 0x6d, 0x8e, 0xc6, 0x0b, + 0x64, 0x37, 0x12, 0x40, 0x3d, 0x00, 0x71, 0x30, + 0xac, 0x6c, 0x75, 0xf1, 0x02, 0x0f, 0xdd, 0xfa, + 0x86, 0xf8, 0xce, 0xdf, 0x55, 0x47, 0x9e, 0xd4, + 0x39, 0x88, 0x26, 0x06, 0xc9, 0x2a, 0x72, 0x72, + 0x5d, 0xf6, 0x9e, 0xb8, 0x40, 0xe2, 0xb4, 0x71, + 0x21, 0x51, 0xa5, 0x39, 0xea, 0xe1, 0x35, 0x4a, + 0xd8, 0x76, 0x14, 0xcc, 0x4e, 0x98, 0x66, 0xa9, + 0x20, 0x3c, 0x0a, 0x5d, 0x75, 0x57, 0x36, 0x93, + 0xdb, 0xdc, 0x22, 0xc3, 0x2a, 0x29, 0x73, 0xd3, + 0x66, 0x2a, 0xc9, 0x1d, 0x06, 0x90, 0xe3, 0xb9, + 0xbc, 0x32, 0x70, 0x1a, 0x90, 0x0e, 0x8a, 0x80, + 0x5e, 0x58, 0x76, 0xc6, 0x2f, 0xde, 0x02, 0x53, + 0x17, 0x68, 0x87, 0x02, 0x27, 0x06, 0x5b, 0x9d, + 0x6b, 0xd0, 0xd1, 0x01, 0xae, 0x29, 0x4e, 0x86, + 0x22, 0xb5, 0x08, 0xb7, 0xbc, 0x8f, 0x42, 0xc0, + 0x2f, 0x3a, 0xcf, 0xb4, 0x84, 0x83, 0xf4, 0x40, + 0xfe, 0xf8, 0xa5, 0x62, 0x10, 0x3a, 0xae, 0x1d, + 0x91, 0xbd, 0x5d, 0x60, 0xeb, 0x36, 0xa5, 0x1e, + 0x8b, 0x1f, 0xdc, 0xcb, 0xaa, 0xf0, 0x2d, 0x6d, + 0x2f, 0x6b, 0xe9, 0x84, 0x4e, 0x21, 0xfe, 0x00, + 0x99, 0x0e, 0x87, 0x4f, 0xf7, 0xe0, 0xc8, 0x19, + 0x5c, 0x3e, 0x84, 0x0b, 0x94, 0x4a, 0x3b, 0x94, + 0xbf, 0x78, 0xff, 0x00, 0x1f, 0xac, 0x86, 0x94, + 0xc4, 0xf8, 0x1e, 0x41, 0x6c, 0xeb, 0x1f, 0x4c, + 0x5b, 0xc2, 0x7e, 0x98, 0x39, 0x27, 0xb4, 0x5e, + 0x49, 0x18, 0x10, 0x61, 0xb8, 0x9d, 0x2b, 0x34, + 0x03, 0x08, 0xd6, 0xa2, 0x65, 0xb7, 0x6f, 0xa8, + 0x8a, 0x74, 0x38, 0xa0, 0x45, 0xe9, 0x06, 0x1e, + 0x48, 0xdc, 0x83, 0x64, 0x73, 0x28, 0x81, 0xc8, + 0x24, 0x99, 0xdd, 0x30, 0x70, 0xd6, 0x35, 0x22, + 0xa0, 0x20, 0xac, 0x1c, 0x53, 0xe1, 0xb0, 0x86, + 0x08, 0x5b, 0x40, 0x8a, 0xc8, 0x6c, 0x41, 0x80, + 0x30, 0xde, 0xd2, 0x7c, 0x66, 0xad, 0xec, 0x9a, + 0x6e, 0x2c, 0x57, 0xd2, 0x41, 0xc5, 0x69, 0x15, + 0x10, 0x2a, 0x38, 0xfd, 0x74, 0x51, 0x13, 0x4e, + 0x85, 0x23, 0xf7, 0x8f, 0xf1, 0xf5, 0x34, 0xef, + 0xa6, 0x0c, 0x97, 0xfb, 0x13, 0xf4, 0x5c, 0x9c, + 0x09, 0xb7, 0x1b, 0x16, 0x2d, 0x07, 0xf7, 0x30, + 0xa6, 0xba, 0xe4, 0x20, 0x77, 0x1b, 0xd2, 0xf0, + 0xe0, 0x87, 0x3f, 0x52, 0xb3, 0x80, 0xd0, 0x90, + 0xd0, 0xa5, 0x23, 0x96, 0xde, 0xf5, 0x17, 0x1b, + 0xc9, 0xea, 0x01, 0x01, 0xb1, 0x71, 0xb2, 0x54, + 0x2a, 0x21, 0x13, 0x86, 0x5f, 0xb1, 0x91, 0x41, + 0xa8, 0x90, 0x40, 0x06, 0xaa, 0x0d, 0x7a, 0xe8, + 0x06, 0x46, 0x24, 0x0e, 0x09, 0xbe, 0x16, 0x04, + 0x34, 0x84, 0x65, 0xca, 0x11, 0x44, 0x82, 0xe6, + 0x0a, 0x82, 0x5e, 0x36, 0xb7, 0x49, 0xd3, 0x20, + 0xfa, 0x68, 0xca, 0x4d, 0x81, 0x75, 0x0e, 0x74, + 0x22, 0x16, 0xa3, 0x84, 0x3a, 0xaa, 0x16, 0x18, + 0x59, 0x9b, 0x21, 0x99, 0x49, 0xd9, 0x12, 0xd9, + 0xf7, 0x4b, 0x71, 0x01, 0x9b, 0x9a, 0x6d, 0xf4, + 0x50, 0xe9, 0x88, 0xbe, 0x51, 0xd9, 0x29, 0x04, + 0x1d, 0x28, 0x54, 0x76, 0xe0, 0x92, 0xf2, 0x92, + 0xbc, 0xec, 0x33, 0x6e, 0x0c, 0x83, 0x3f, 0x42, + 0x02, 0x70, 0x02, 0xaa, 0xf0, 0x66, 0x88, 0x20, + 0x95, 0x18, 0x0d, 0x35, 0xea, 0x7f, 0xb4, 0x30, + 0xc3, 0x7e, 0x85, 0x8c, 0xc4, 0x72, 0x8b, 0xb7, + 0x8a, 0xd7, 0x63, 0x64, 0xfa, 0xe2, 0x43, 0x18, + 0x70, 0x5e, 0x73, 0xc3, 0xcf, 0xea, 0x0d, 0xae, + 0xb0, 0x0e, 0x87, 0x42, 0x37, 0x7c, 0xf2, 0xc9, + 0xd9, 0x22, 0x96, 0x06, 0x3a, 0x84, 0x44, 0x8e, + 0xc1, 0x71, 0xc9, 0x35, 0x75, 0x28, 0xd2, 0x17, + 0x08, 0x40, 0x6b, 0x6b, 0x81, 0x6e, 0x64, 0x68, + 0x21, 0x12, 0x62, 0xf4, 0xa9, 0xc7, 0x70, 0xc6, + 0xbd, 0x90, 0xdb, 0x69, 0x50, 0x58, 0xed, 0x70, + 0xc5, 0x7a, 0xf2, 0xaa, 0x11, 0x04, 0x41, 0x01, + 0xfc, 0xa4, 0x62, 0xe8, 0x15, 0x09, 0xc2, 0xa0, + 0x28, 0x1a, 0x26, 0x9b, 0xc6, 0xb0, 0xdb, 0x4c, + 0x06, 0x37, 0x33, 0x34, 0x40, 0x4d, 0xdc, 0x3c, + 0x10, 0xed, 0x3e, 0x48, 0x23, 0x91, 0x78, 0x5d, + 0x47, 0x1d, 0xbd, 0xbf, 0x55, 0xc8, 0xe2, 0x29, + 0xda, 0x4e, 0x8a, 0xd4, 0xec, 0x03, 0x13, 0xea, + 0x7a, 0xb2, 0x5f, 0xf6, 0x80, 0x85, 0x0e, 0xa3, + 0x0d, 0xb8, 0x91, 0x8e, 0x9f, 0xa9, 0x8c, 0x2c, + 0x8d, 0x0e, 0x65, 0x40, 0x6c, 0x35, 0x25, 0x23, + 0x12, 0xa2, 0x1c, 0x9b, 0x4c, 0xe1, 0xbb, 0xeb, + 0x24, 0xeb, 0x8c, 0x9a, 0x07, 0xaa, 0x04, 0x46, + 0x1c, 0x90, 0x90, 0xc2, 0x23, 0xa1, 0xc5, 0x22, + 0x52, 0x20, 0x22, 0x3d, 0x7b, 0x56, 0xe0, 0x74, + 0x4f, 0xf8, 0xaa, 0x45, 0x48, 0xe0, 0x2f, 0xa6, + 0x71, 0x39, 0x01, 0xc1, 0x20, 0xe8, 0x88, 0x04, + 0x1a, 0xe6, 0xa9, 0xce, 0x9e, 0x2f, 0x05, 0x0d, + 0x09, 0x19, 0x1c, 0xbb, 0xc0, 0xfe, 0xf4, 0x50, + 0x56, 0xe3, 0x62, 0x75, 0xa6, 0x8f, 0x5d, 0x4d, + 0xcd, 0xcb, 0x5c, 0xae, 0x19, 0xc8, 0xa2, 0x56, + 0xd3, 0x8e, 0x84, 0x4c, 0x52, 0xa8, 0x24, 0xd1, + 0xb2, 0x40, 0xe9, 0xb6, 0xa0, 0xec, 0x81, 0x5a, + 0x48, 0x2d, 0x0e, 0x87, 0xdc, 0x30, 0x8d, 0x52, + 0xd7, 0x0a, 0x5e, 0x33, 0x95, 0xee, 0x7e, 0xf8, + 0xb1, 0x19, 0x6a, 0xb4, 0x10, 0xda, 0x04, 0x11, + 0x83, 0xbc, 0xea, 0x1c, 0x49, 0xe9, 0xe4, 0xc2, + 0xd9, 0xdf, 0x65, 0x0f, 0xd0, 0xc4, 0x03, 0x9e, + 0x01, 0xbe, 0xed, 0x81, 0x79, 0x00, 0x8f, 0x38, + 0xcd, 0x5f, 0xbe, 0x0b, 0x7f, 0xda, 0x13, 0x0c, + 0x18, 0x5c, 0xc7, 0xaf, 0x1f, 0x64, 0x78, 0xbf, + 0x72, 0x7f, 0x19, 0xc6, 0x40, 0xa8, 0x1f, 0xd0, + 0x85, 0x68, 0x1d, 0x87, 0x57, 0xae, 0x29, 0x3b, + 0xc2, 0x2f, 0xba, 0x13, 0x3e, 0x31, 0x8f, 0x8c, + 0x63, 0xe3, 0x18, 0xf8, 0xc6, 0x3e, 0x31, 0x8f, + 0x8c, 0x63, 0xe3, 0x18, 0xf8, 0xc6, 0x3e, 0x31, + 0x8f, 0x8c, 0x63, 0xe3, 0x18, 0xf8, 0xc6, 0x3e, + 0x31, 0x8f, 0x8c, 0x63, 0xe3, 0x18, 0xf8, 0xc6, + 0x3e, 0x31, 0x80, 0x88, 0x4e, 0x42, 0x29, 0xd8, + 0x72, 0x11, 0x76, 0x2a, 0x4b, 0xa1, 0x4b, 0x62, + 0x34, 0x8e, 0x25, 0x11, 0xaa, 0xdb, 0xe7, 0x6f, + 0xa9, 0xc6, 0x42, 0xf1, 0x59, 0x41, 0xc3, 0xf7, + 0x34, 0x22, 0xdd, 0xf4, 0x5c, 0x70, 0xb6, 0xe1, + 0x14, 0xfb, 0xa7, 0xfa, 0x42, 0x44, 0x89, 0x12, + 0x24, 0x48, 0x91, 0x22, 0x44, 0x89, 0x12, 0x24, + 0x48, 0x91, 0x20, 0x56, 0x7c, 0xbb, 0xb5, 0xd2, + 0x86, 0xff, 0x00, 0x86, 0x10, 0x24, 0xd9, 0xec, + 0x01, 0xff, 0x00, 0x7f, 0xda, 0x0e, 0x94, 0xd4, + 0x16, 0x1d, 0x5f, 0xd8, 0xde, 0x0b, 0x28, 0x5c, + 0xf6, 0x04, 0xfa, 0xeb, 0x0a, 0xc4, 0x89, 0x9d, + 0x38, 0xc1, 0x01, 0xf4, 0xec, 0xfd, 0xf5, 0xff, + 0x00, 0xe1, 0xe0, 0x82, 0x08, 0x20, 0x82, 0x08, + 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, + 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, + 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, + 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, + 0x08, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, + 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0x80, 0x2d, + 0x47, 0x6c, 0x4f, 0xd9, 0x38, 0x90, 0xa5, 0x82, + 0x8c, 0xec, 0x1d, 0x0f, 0xa6, 0xb2, 0x27, 0x69, + 0xb7, 0x79, 0xd9, 0xff, 0x00, 0xe3, 0x21, 0x42, + 0x85, 0x0a, 0x14, 0x28, 0x50, 0xa1, 0x42, 0x85, + 0x0a, 0x14, 0x28, 0x50, 0xa1, 0x42, 0x85, 0x0a, + 0x14, 0x28, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x14, + 0x28, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x14, 0x28, + 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x14, 0x28, 0x50, + 0xa1, 0x42, 0x85, 0x0a, 0x14, 0x28, 0x50, 0xa1, + 0x42, 0x85, 0x0a, 0x14, 0x28, 0x50, 0xa1, 0x42, + 0x85, 0x0a, 0x14, 0x28, 0x50, 0xa1, 0x42, 0x84, + 0xe2, 0x28, 0x46, 0xbd, 0x12, 0xec, 0xe7, 0xff, + 0xd9, +}; + +static const uint8_t data_dk_tm4c129x_jpg[] = +{ + /* /dk-tm4c129x.jpg */ + 0x2f, 0x64, 0x6b, 0x2d, 0x74, 0x6d, 0x34, 0x63, + 0x31, 0x32, 0x39, 0x78, 0x2e, 0x6a, 0x70, 0x67, + 0x00, + 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, + 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, + 0x00, 0x48, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43, + 0x00, 0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x03, + 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x05, + 0x08, 0x05, 0x05, 0x04, 0x04, 0x05, 0x0a, 0x07, + 0x07, 0x06, 0x08, 0x0c, 0x0a, 0x0c, 0x0c, 0x0b, + 0x0a, 0x0b, 0x0b, 0x0d, 0x0e, 0x12, 0x10, 0x0d, + 0x0e, 0x11, 0x0e, 0x0b, 0x0b, 0x10, 0x16, 0x10, + 0x11, 0x13, 0x14, 0x15, 0x15, 0x15, 0x0c, 0x0f, + 0x17, 0x18, 0x16, 0x14, 0x18, 0x12, 0x14, 0x15, + 0x14, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x03, 0x04, + 0x04, 0x05, 0x04, 0x05, 0x09, 0x05, 0x05, 0x09, + 0x14, 0x0d, 0x0b, 0x0d, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xff, 0xc2, + 0x00, 0x11, 0x08, 0x00, 0xac, 0x00, 0xd0, 0x03, + 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, + 0x01, 0xff, 0xc4, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x07, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x03, 0x04, 0x05, 0x06, 0x07, 0x01, 0x08, 0xff, + 0xc4, 0x00, 0x1b, 0x01, 0x00, 0x01, 0x05, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x06, 0x07, 0xff, 0xda, 0x00, 0x0c, + 0x03, 0x01, 0x00, 0x02, 0x10, 0x03, 0x10, 0x00, + 0x00, 0x01, 0x7b, 0x34, 0x2a, 0x02, 0xe0, 0xe4, + 0x1d, 0x03, 0xc0, 0x78, 0x0e, 0xd0, 0x74, 0x82, + 0xe0, 0x60, 0x70, 0xe1, 0x28, 0xe5, 0x6f, 0x5e, + 0xd3, 0x89, 0xab, 0xb9, 0xb1, 0x53, 0x82, 0x26, + 0xa8, 0x41, 0x12, 0x11, 0x35, 0x08, 0xa8, 0x50, + 0x01, 0xd0, 0x32, 0x19, 0xec, 0x76, 0x5c, 0x03, + 0xa1, 0x1d, 0x03, 0xc0, 0x6e, 0x82, 0xa2, 0xd8, + 0xc7, 0x54, 0x18, 0x99, 0x93, 0x5d, 0x9e, 0xab, + 0xb5, 0x7c, 0xdd, 0xe7, 0x99, 0xdd, 0x61, 0xdf, + 0x1e, 0x81, 0xa9, 0xc7, 0xdc, 0x74, 0x31, 0x38, + 0xf8, 0x8a, 0xa8, 0x98, 0x84, 0x10, 0x8a, 0x11, + 0x50, 0x00, 0x0e, 0x81, 0xd1, 0x73, 0xa6, 0x4c, + 0xe9, 0x11, 0xd8, 0xa4, 0x82, 0xeb, 0x08, 0x6f, + 0x54, 0x1a, 0xdc, 0xf6, 0x7a, 0x33, 0xb5, 0x76, + 0xb2, 0x1b, 0xb8, 0xfd, 0x6c, 0xa9, 0xb6, 0x5b, + 0x1c, 0x69, 0x63, 0x47, 0xcb, 0xcb, 0x02, 0xca, + 0xce, 0x49, 0x0f, 0xad, 0x1d, 0x00, 0x54, 0x41, + 0xcc, 0x49, 0x50, 0xaa, 0x85, 0x0e, 0x08, 0x03, + 0xa0, 0x61, 0x72, 0xda, 0x5a, 0xc7, 0xad, 0x69, + 0x28, 0x74, 0xb3, 0xfa, 0xfb, 0x05, 0x9e, 0x95, + 0x6a, 0x7c, 0xaa, 0x4d, 0x8c, 0xd3, 0x12, 0xeb, + 0xf9, 0x1d, 0x8c, 0x0c, 0x77, 0x28, 0xfa, 0xbc, + 0x9d, 0x5a, 0xde, 0x34, 0xec, 0x53, 0xd9, 0x25, + 0xaf, 0x6b, 0xa5, 0xb1, 0x39, 0x05, 0xfd, 0xea, + 0xf7, 0x3d, 0x76, 0x9a, 0x91, 0x15, 0x11, 0x54, + 0x6c, 0xe6, 0x22, 0xad, 0x2b, 0x93, 0x80, 0x03, + 0xa1, 0x9a, 0x31, 0xd9, 0x9d, 0x6d, 0x1a, 0xe5, + 0x9a, 0x15, 0x68, 0xed, 0x27, 0x0d, 0xd6, 0xea, + 0xa2, 0xbc, 0xd6, 0x7a, 0x5d, 0x0e, 0x91, 0x06, + 0x84, 0x79, 0x25, 0x5a, 0x6a, 0x31, 0xb6, 0x32, + 0x29, 0xf6, 0x6a, 0xb5, 0x9b, 0x3b, 0x40, 0xa5, + 0xd0, 0x5d, 0xe8, 0x74, 0x0f, 0x35, 0x38, 0xdb, + 0x4d, 0xac, 0x6d, 0xcd, 0xcc, 0x30, 0x70, 0x42, + 0x08, 0x83, 0x9a, 0x92, 0xa7, 0x00, 0x06, 0x7b, + 0x35, 0x7c, 0xaa, 0x1b, 0x38, 0x08, 0xfb, 0x0c, + 0x57, 0x1e, 0xd6, 0xd4, 0x81, 0xb9, 0x8e, 0xdd, + 0xae, 0xb8, 0xe1, 0xf7, 0xc7, 0xb9, 0x86, 0x5b, + 0xf8, 0x16, 0x1a, 0xba, 0x16, 0x6c, 0xce, 0x93, + 0x3c, 0xb7, 0x91, 0x5e, 0x9f, 0x37, 0x45, 0xce, + 0xe9, 0x62, 0x26, 0x9d, 0xae, 0xb7, 0x09, 0xa4, + 0xab, 0x37, 0xe4, 0x89, 0xf3, 0x16, 0x42, 0x54, + 0x00, 0x01, 0x35, 0x44, 0x95, 0xbc, 0x0a, 0x9c, + 0xd0, 0x44, 0x46, 0xfc, 0x67, 0x1b, 0xb3, 0x8d, + 0x9a, 0xb5, 0x12, 0x7a, 0xd5, 0xdb, 0xd8, 0x2f, + 0x61, 0xbb, 0x6e, 0xc0, 0xef, 0xe7, 0x20, 0x25, + 0xd6, 0xd4, 0xa3, 0x26, 0x35, 0xbc, 0x5c, 0xe5, + 0x67, 0xcf, 0xf6, 0x38, 0xbb, 0x46, 0x7d, 0xeb, + 0xa6, 0x7f, 0x6a, 0x8e, 0xa7, 0x23, 0xea, 0x9b, + 0xdc, 0xc3, 0xd0, 0xae, 0xc6, 0xe9, 0x97, 0x25, + 0x86, 0x40, 0x00, 0x02, 0x82, 0x6a, 0xd4, 0x15, + 0x0a, 0x8b, 0x80, 0x67, 0x74, 0x74, 0x7c, 0xde, + 0xa6, 0xbf, 0x3d, 0x0a, 0x9d, 0xfe, 0x62, 0x52, + 0xbe, 0xaf, 0x24, 0x73, 0xaa, 0xf5, 0xb4, 0xbc, + 0xde, 0xc9, 0x09, 0x10, 0x95, 0xf5, 0x18, 0xd8, + 0xa5, 0x4f, 0xd0, 0xe6, 0xe9, 0x1a, 0x9c, 0x9d, + 0xde, 0xb6, 0xb4, 0x4b, 0xab, 0xfa, 0x15, 0xb4, + 0xe7, 0x63, 0x52, 0x49, 0x16, 0xb1, 0x62, 0x09, + 0x17, 0xa0, 0x00, 0x00, 0x38, 0x20, 0x14, 0x06, + 0x6c, 0xe8, 0xbc, 0xf3, 0x9b, 0xd3, 0xc7, 0xd3, + 0x7c, 0x7d, 0x97, 0xa1, 0x1c, 0x2b, 0xbf, 0x4a, + 0x83, 0x7f, 0x95, 0xda, 0x31, 0xba, 0xdb, 0xbc, + 0x7a, 0x2e, 0x64, 0xac, 0x80, 0xb4, 0xca, 0x7b, + 0x55, 0x4b, 0x59, 0xaf, 0x2c, 0xd4, 0xb1, 0xd9, + 0xe7, 0x35, 0x69, 0x33, 0xe7, 0xc6, 0x66, 0xcb, + 0x2e, 0x9e, 0xf6, 0x5e, 0xe6, 0xac, 0xb0, 0x00, + 0x00, 0x03, 0x81, 0xc0, 0x8b, 0x56, 0x60, 0x70, + 0x69, 0x62, 0x55, 0x65, 0xb4, 0xd0, 0xe9, 0xa8, + 0xfa, 0x3c, 0xd5, 0xba, 0x8e, 0xfd, 0x46, 0xfe, + 0x62, 0xb3, 0xd1, 0xbe, 0x73, 0x7e, 0xa1, 0x2a, + 0xea, 0xcb, 0x4d, 0x46, 0xfb, 0x6f, 0x9e, 0x9d, + 0x9b, 0x38, 0xb6, 0xf2, 0x68, 0x0f, 0x8e, 0x84, + 0x2d, 0x11, 0xe9, 0x6e, 0x6c, 0x97, 0xbc, 0x8e, + 0xd6, 0x27, 0x67, 0x8c, 0xf5, 0xf1, 0x08, 0x00, + 0x00, 0x08, 0x05, 0x02, 0x86, 0x6b, 0x24, 0x1e, + 0x76, 0xce, 0xe9, 0x63, 0x2a, 0x2a, 0x8e, 0xd0, + 0x84, 0x7e, 0x4c, 0xa4, 0x7b, 0x33, 0x1a, 0xbc, + 0x66, 0xd5, 0x97, 0xd4, 0xbd, 0xb3, 0x8b, 0x57, + 0x9e, 0x9d, 0x1d, 0xed, 0xa0, 0x38, 0x84, 0x50, + 0x00, 0x00, 0x00, 0x34, 0xe6, 0xba, 0xe3, 0x91, + 0xdb, 0xed, 0x37, 0xf9, 0xdb, 0x9d, 0xac, 0x80, + 0x00, 0x12, 0x02, 0x01, 0x42, 0x1d, 0x59, 0x89, + 0x43, 0xa3, 0x8a, 0x53, 0xb1, 0x61, 0xab, 0xd0, + 0x53, 0x6f, 0xe1, 0x48, 0x3e, 0x0d, 0xad, 0xf9, + 0xf9, 0x1c, 0x8d, 0xaa, 0x38, 0x4c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1d, 0x0d, 0xee, 0xbe, + 0x94, 0x5b, 0x6c, 0x7a, 0x55, 0xf4, 0xe7, 0xa7, + 0xa2, 0x01, 0x20, 0x48, 0x08, 0x00, 0x33, 0x39, + 0x6b, 0x63, 0xd8, 0x5d, 0xb0, 0x8e, 0x6a, 0xb5, + 0x96, 0x67, 0xda, 0x9c, 0x9e, 0x86, 0xc4, 0xae, + 0x2b, 0x22, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe4, 0x37, 0xea, 0x3b, 0xd3, + 0x99, 0xfb, 0xbb, 0x56, 0xd7, 0x16, 0xfa, 0x48, + 0x12, 0x04, 0xc0, 0x80, 0x02, 0x15, 0xd1, 0xe4, + 0xf5, 0xb4, 0x68, 0x55, 0xb5, 0xb2, 0x7b, 0x74, + 0x1b, 0xa4, 0x87, 0x9f, 0x23, 0x46, 0x62, 0x66, + 0xce, 0x00, 0x00, 0x00, 0x03, 0xa1, 0x62, 0x0a, + 0xf8, 0x14, 0x27, 0x02, 0x64, 0x1a, 0xa1, 0xe8, + 0x2c, 0xee, 0x8a, 0xe4, 0xfa, 0xd7, 0x9b, 0xd8, + 0xc5, 0x50, 0x80, 0x50, 0x01, 0xd0, 0xcb, 0x26, + 0xa9, 0xe7, 0xea, 0x5b, 0xf9, 0x4d, 0x8a, 0x33, + 0xb5, 0xf5, 0x2b, 0xf6, 0x72, 0x6f, 0x0d, 0x64, + 0xb2, 0x36, 0xa2, 0xab, 0xb9, 0x85, 0x5c, 0x08, + 0x05, 0x07, 0x80, 0x40, 0xe0, 0x42, 0x03, 0x01, + 0x2e, 0xed, 0x34, 0xf8, 0xed, 0x67, 0x4c, 0xb5, + 0xbb, 0x0d, 0xbc, 0x59, 0xce, 0x28, 0x70, 0x00, + 0x74, 0x2b, 0xee, 0x8b, 0x1a, 0x86, 0xfe, 0x1a, + 0x49, 0x51, 0x73, 0x54, 0x65, 0xa3, 0x4f, 0x93, + 0xa4, 0xb1, 0x6a, 0xea, 0x9e, 0x88, 0x07, 0x61, + 0xe6, 0x50, 0xd0, 0xc2, 0xb0, 0x0d, 0x91, 0x2f, + 0x68, 0x5c, 0xa2, 0xb4, 0xee, 0xae, 0xb3, 0x36, + 0x59, 0x7b, 0x3e, 0x7e, 0xa5, 0x3d, 0x1b, 0x54, + 0xd5, 0x00, 0xa0, 0x38, 0x00, 0x3a, 0x05, 0x0c, + 0x9a, 0x6a, 0x78, 0x66, 0x6f, 0x53, 0x63, 0x92, + 0xa5, 0x25, 0xce, 0xca, 0xe7, 0xa3, 0x27, 0x1a, + 0xe9, 0xeb, 0x06, 0x70, 0xe0, 0xe1, 0x3c, 0x25, + 0xfd, 0xa5, 0xae, 0x3b, 0x6a, 0xd4, 0xd6, 0x65, + 0x15, 0xb7, 0xb3, 0xd0, 0x96, 0xbd, 0x86, 0x2c, + 0xd0, 0x5d, 0x0b, 0xcc, 0x73, 0xdd, 0x59, 0x60, + 0x00, 0x0e, 0x00, 0x0e, 0x80, 0x0a, 0xcb, 0xa1, + 0xc8, 0x59, 0x62, 0x8b, 0x47, 0xa0, 0xa7, 0xb6, + 0xcb, 0x39, 0xe9, 0xc6, 0x3e, 0x9d, 0x8d, 0x59, + 0x78, 0x7e, 0x7d, 0x82, 0x3b, 0x2d, 0x6a, 0x6d, + 0xa3, 0x1d, 0xa9, 0x09, 0xf3, 0xa6, 0x6e, 0xe2, + 0x2b, 0x6b, 0x39, 0xfa, 0x2d, 0x81, 0xb2, 0xd8, + 0x99, 0x24, 0xdb, 0x64, 0x70, 0x28, 0x0e, 0x09, + 0xd1, 0x40, 0x00, 0x00, 0x00, 0x82, 0x64, 0x53, + 0x53, 0xce, 0xf9, 0xef, 0x42, 0xb3, 0xcb, 0x96, + 0x83, 0x75, 0x6a, 0xd1, 0x5a, 0xad, 0x4a, 0xdb, + 0x69, 0x49, 0xd5, 0x8c, 0xe9, 0xeb, 0xd8, 0x4f, + 0x6d, 0x66, 0xcb, 0xb5, 0xf6, 0x26, 0xc9, 0x61, + 0x6c, 0xb2, 0x6d, 0x71, 0xc5, 0x00, 0x00, 0x08, + 0x9a, 0xa1, 0x91, 0x42, 0x9d, 0x45, 0xe8, 0x00, + 0x00, 0x02, 0xa8, 0xf8, 0x72, 0xc6, 0xc9, 0x54, + 0xa3, 0xbf, 0xd1, 0x25, 0x1f, 0x1c, 0xbd, 0x8c, + 0xb9, 0x5b, 0x39, 0xb3, 0xed, 0x92, 0xc2, 0xd9, + 0x27, 0x5b, 0x23, 0xa4, 0x77, 0x40, 0x00, 0x00, + 0x00, 0x0a, 0x22, 0x4a, 0x84, 0x54, 0x59, 0x17, + 0x81, 0xc5, 0x0c, 0x81, 0xd1, 0x7a, 0x28, 0x04, + 0x84, 0xc7, 0xe7, 0xa4, 0xc2, 0x0b, 0x93, 0x53, + 0x55, 0xb0, 0xb6, 0x4b, 0x03, 0x24, 0x95, 0x47, + 0xa8, 0x28, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc1, + 0x12, 0x73, 0x50, 0x54, 0x4c, 0x44, 0x95, 0x1f, + 0x35, 0xfc, 0x10, 0xaa, 0x14, 0x6f, 0x45, 0x59, + 0x1c, 0xab, 0x5d, 0xd1, 0x62, 0x15, 0x8e, 0xc5, + 0x76, 0x8e, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x22, 0x4a, 0x8d, 0xd5, 0xa8, 0xb9, + 0x11, 0x51, 0x15, 0x6b, 0x71, 0x3f, 0xff, 0xc4, + 0x00, 0x2b, 0x10, 0x00, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x01, 0x04, 0x01, 0x04, 0x03, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x05, 0x00, + 0x01, 0x06, 0x12, 0x11, 0x13, 0x14, 0x07, 0x10, + 0x20, 0x30, 0x15, 0x16, 0x23, 0x24, 0x31, 0x21, + 0x22, 0x25, 0x36, 0xff, 0xda, 0x00, 0x08, 0x01, + 0x01, 0x00, 0x01, 0x05, 0x02, 0xeb, 0x9a, 0x8e, + 0x6a, 0x19, 0x18, 0x64, 0x47, 0x91, 0x1e, 0x44, + 0x79, 0x11, 0xe4, 0x47, 0x9d, 0x75, 0x1d, 0x0f, + 0xa9, 0x63, 0xd3, 0x08, 0x41, 0x87, 0x06, 0xe0, + 0x4f, 0x81, 0x2c, 0x4f, 0x9d, 0x73, 0xae, 0x75, + 0xcd, 0xc7, 0x3a, 0xe7, 0x4c, 0xe9, 0x9d, 0x33, + 0xa6, 0x74, 0xcf, 0x5e, 0x6a, 0x19, 0x18, 0x64, + 0x47, 0x91, 0x1e, 0x44, 0x78, 0xfb, 0x83, 0xac, + 0x5e, 0x9e, 0xc4, 0x36, 0xeb, 0xf5, 0xd4, 0x71, + 0xae, 0x61, 0x58, 0x99, 0x39, 0x0f, 0x37, 0x85, + 0x88, 0x57, 0xe6, 0x0c, 0xa1, 0x0e, 0x2f, 0x76, + 0xcd, 0xe0, 0x0a, 0x08, 0x43, 0x75, 0x84, 0x94, + 0xa5, 0x43, 0x61, 0x25, 0xe7, 0xff, 0x00, 0x52, + 0x67, 0x5c, 0xeb, 0x9d, 0x33, 0xa6, 0x74, 0xcf, + 0x5e, 0x7a, 0xf3, 0xd7, 0x9e, 0xbc, 0xf5, 0xe6, + 0xa1, 0x91, 0x1e, 0x44, 0x79, 0xb6, 0x57, 0x0e, + 0x6e, 0xf9, 0x58, 0x4b, 0x90, 0x5c, 0x4d, 0xd4, + 0x6b, 0xae, 0x4d, 0x52, 0x6b, 0x4e, 0x50, 0x01, + 0x63, 0x10, 0x2f, 0xb2, 0x14, 0xee, 0x17, 0x50, + 0xac, 0xf1, 0x94, 0x56, 0x7b, 0x52, 0x76, 0x53, + 0x8e, 0x89, 0x52, 0xcc, 0xfb, 0xa9, 0xcb, 0x0c, + 0x31, 0xc3, 0x94, 0x1b, 0x4e, 0x88, 0x12, 0x90, + 0x76, 0xbe, 0x6c, 0x39, 0xeb, 0xcf, 0x5e, 0x7a, + 0xf3, 0xd7, 0x9d, 0x33, 0xa6, 0x74, 0xc6, 0x89, + 0xb5, 0x84, 0xef, 0xfc, 0x6c, 0xb4, 0x0c, 0x4c, + 0x27, 0x28, 0x94, 0xd9, 0x5f, 0x48, 0xba, 0xb4, + 0x7f, 0x6b, 0xd9, 0x35, 0x00, 0xaa, 0x7b, 0x42, + 0x93, 0xda, 0x4d, 0xcb, 0xc9, 0xa3, 0x0f, 0x17, + 0x6c, 0x45, 0x76, 0x24, 0x49, 0x4b, 0x5d, 0xca, + 0xfa, 0x55, 0x13, 0x2d, 0x6e, 0x25, 0xc7, 0xab, + 0xfd, 0x6a, 0xab, 0x1d, 0x47, 0x8c, 0x35, 0xa9, + 0xd6, 0xf8, 0xcd, 0xc3, 0x5b, 0xcd, 0x87, 0x36, + 0x1c, 0xf5, 0xe7, 0x4c, 0xe9, 0x9d, 0x33, 0xa6, + 0x1a, 0x3a, 0xf5, 0x5b, 0x33, 0x28, 0xd7, 0x37, + 0xcb, 0x1e, 0xf3, 0x6e, 0x79, 0x3c, 0xb5, 0x06, + 0xe2, 0xb4, 0xae, 0x65, 0xf2, 0xf6, 0x97, 0x8b, + 0x45, 0xe1, 0xc7, 0x42, 0x31, 0x4e, 0x6b, 0x9f, + 0x4d, 0xfc, 0x7d, 0xc5, 0xaa, 0x41, 0x1a, 0x33, + 0xa9, 0x54, 0xc2, 0x18, 0x25, 0x54, 0xd9, 0x3e, + 0x47, 0xf2, 0x7c, 0x79, 0xb6, 0x76, 0xba, 0xed, + 0x12, 0x64, 0x5a, 0xe8, 0x35, 0x19, 0x57, 0xcf, + 0x89, 0x36, 0xa3, 0xbe, 0xd1, 0xfb, 0x6e, 0x1e, + 0x73, 0x63, 0xce, 0xb9, 0xe3, 0x3c, 0x64, 0x83, + 0xde, 0x1c, 0x9a, 0xb7, 0x66, 0x5a, 0x5a, 0x9c, + 0xa0, 0xaa, 0xa5, 0x49, 0x3b, 0xd7, 0x76, 0xe8, + 0xc3, 0xbd, 0x88, 0x62, 0x84, 0x80, 0xc5, 0x93, + 0x3d, 0x2b, 0xf8, 0x91, 0x88, 0xc6, 0x39, 0x09, + 0xaa, 0x6a, 0x22, 0xb1, 0x8c, 0x2e, 0x41, 0x67, + 0x2f, 0x43, 0x4b, 0x41, 0x12, 0x69, 0x58, 0xa6, + 0xf7, 0xf8, 0xd6, 0x9b, 0x34, 0x95, 0xa7, 0xa1, + 0xb8, 0x76, 0x09, 0x7d, 0x3b, 0x7f, 0x78, 0x77, + 0x18, 0x16, 0x08, 0x85, 0xdc, 0xbe, 0xfb, 0x8e, + 0x78, 0xfb, 0x01, 0x7e, 0xfb, 0xbc, 0xac, 0xd6, + 0xa0, 0x0a, 0xf1, 0x2c, 0x43, 0xcc, 0x90, 0x2d, + 0x9c, 0xbd, 0x59, 0xb6, 0xc5, 0xbd, 0xa9, 0x38, + 0x4c, 0xa7, 0x18, 0x7d, 0x4b, 0xc0, 0x5a, 0x5e, + 0x66, 0xf7, 0x46, 0x02, 0xd1, 0x20, 0x60, 0x47, + 0x63, 0xb7, 0x14, 0xe6, 0xd5, 0x97, 0xf6, 0x5c, + 0xad, 0x73, 0xce, 0x16, 0x79, 0x4d, 0xc8, 0xa7, + 0x49, 0x6c, 0x03, 0xc1, 0xb0, 0x47, 0x5b, 0xd6, + 0x33, 0x60, 0xca, 0xac, 0xd4, 0x58, 0x6a, 0xc0, + 0x7f, 0x7d, 0xeb, 0x3c, 0x60, 0x03, 0xd3, 0x4e, + 0xaf, 0xa6, 0x17, 0xb9, 0x5e, 0x4b, 0x48, 0x4c, + 0x17, 0x45, 0x76, 0xbe, 0x5d, 0x37, 0x5d, 0xf0, + 0x5c, 0x4a, 0xa8, 0x23, 0x25, 0xf4, 0xf4, 0x35, + 0x28, 0xac, 0x75, 0xad, 0xc4, 0x3e, 0xcd, 0xc0, + 0x7a, 0xf8, 0xc2, 0x26, 0x87, 0xa3, 0x94, 0x93, + 0xcb, 0x0a, 0xc9, 0x88, 0x6b, 0xce, 0x55, 0xed, + 0xa4, 0xc4, 0x49, 0x03, 0x0e, 0x51, 0x3f, 0x04, + 0x23, 0xb1, 0xa7, 0xb4, 0x6f, 0x75, 0x93, 0x95, + 0xdd, 0x53, 0xed, 0x21, 0xb3, 0xed, 0x6f, 0xcf, + 0x90, 0xa5, 0xae, 0xd7, 0xde, 0xd4, 0xd7, 0x51, + 0x88, 0x96, 0x77, 0x89, 0x4a, 0x1b, 0xab, 0x63, + 0x53, 0xc6, 0xa1, 0x22, 0x68, 0x3e, 0x53, 0x67, + 0x8f, 0xd8, 0x86, 0x6e, 0xb0, 0xc2, 0x22, 0xde, + 0xcb, 0x08, 0x43, 0x53, 0x88, 0x46, 0xce, 0xfe, + 0x5e, 0xdb, 0xa7, 0x81, 0x66, 0x92, 0x5a, 0x4d, + 0x75, 0xb8, 0x6d, 0xa3, 0x81, 0xa9, 0xe2, 0x0c, + 0x85, 0x3d, 0xd2, 0xd4, 0xd5, 0x8d, 0x67, 0xa3, + 0xc5, 0xad, 0x29, 0x39, 0x62, 0xf6, 0xa4, 0xd9, + 0x61, 0xa9, 0xfe, 0x56, 0x0b, 0xfc, 0x95, 0xef, + 0x12, 0xf6, 0xae, 0x2d, 0x6c, 0x07, 0x19, 0x22, + 0x60, 0x92, 0x3f, 0x05, 0xc8, 0x3b, 0x26, 0x93, + 0xb6, 0x4f, 0xd9, 0xaa, 0x99, 0xfa, 0x5b, 0xd7, + 0x6d, 0xe6, 0x9c, 0x38, 0x42, 0xa5, 0x73, 0x0d, + 0x91, 0x6e, 0x2e, 0x7e, 0xc2, 0xe3, 0x15, 0xe1, + 0xc6, 0x39, 0x0d, 0x3d, 0x34, 0x5e, 0xfa, 0x96, + 0x18, 0xe3, 0xbc, 0xf6, 0xdd, 0xb8, 0xb0, 0xc9, + 0x9b, 0x9f, 0x1a, 0xbd, 0xd5, 0x69, 0x6d, 0x49, + 0x2a, 0xd9, 0xfd, 0x3b, 0x2e, 0xdd, 0xe4, 0x3f, + 0x9d, 0xda, 0x9e, 0xa3, 0x72, 0x2a, 0xff, 0x00, + 0x54, 0xd1, 0x6a, 0x1d, 0x6d, 0x54, 0x99, 0x44, + 0x83, 0x3d, 0x64, 0xf8, 0xe6, 0xe0, 0x52, 0xe1, + 0x76, 0x6c, 0x68, 0x1c, 0x51, 0x51, 0xe4, 0xb7, + 0x57, 0x53, 0x8e, 0x73, 0xf4, 0x17, 0xd3, 0xbf, + 0x51, 0x9f, 0x36, 0x39, 0x74, 0xf3, 0xfb, 0xfc, + 0x78, 0xeb, 0xeb, 0xd9, 0x86, 0x2b, 0x6a, 0xae, + 0x7c, 0x76, 0xf2, 0x36, 0x80, 0xfc, 0xac, 0xd7, + 0xf9, 0x0b, 0xda, 0xa9, 0xed, 0x14, 0x3f, 0xc2, + 0x6d, 0x22, 0xe8, 0xc9, 0x59, 0x2b, 0x20, 0x30, + 0xbd, 0x96, 0xd6, 0x93, 0xfc, 0xa0, 0xa1, 0xa6, + 0x77, 0x95, 0xd9, 0xbb, 0x93, 0x9c, 0x89, 0x2f, + 0xd3, 0xc7, 0xae, 0x3f, 0xa8, 0x12, 0xad, 0x7a, + 0x74, 0xec, 0x53, 0xdb, 0x0e, 0xd9, 0x5f, 0xb6, + 0xfe, 0xff, 0x00, 0xef, 0x2d, 0xd5, 0xf4, 0x31, + 0x67, 0x45, 0xa6, 0x8c, 0x0a, 0x6f, 0xe2, 0xa0, + 0xec, 0x24, 0x50, 0xad, 0x2e, 0xa5, 0xe3, 0xd6, + 0x63, 0x5c, 0xf6, 0xb5, 0xd3, 0xaa, 0x7b, 0xf5, + 0x2c, 0xc1, 0x14, 0x3c, 0x0e, 0xbf, 0x2b, 0xad, + 0x51, 0xb3, 0xd2, 0xe2, 0x6e, 0x0d, 0xe5, 0xf3, + 0x7f, 0x85, 0xb2, 0xbe, 0xf5, 0xcb, 0xfd, 0x82, + 0x5d, 0x5b, 0x34, 0xaa, 0xf1, 0xb0, 0xec, 0x6b, + 0x20, 0x77, 0xd0, 0x8b, 0xf2, 0xc3, 0xff, 0x00, + 0xd1, 0xd2, 0x7e, 0x4b, 0x71, 0xe7, 0xda, 0xdc, + 0xa3, 0xb8, 0x4b, 0x01, 0x46, 0xfb, 0x3b, 0x1d, + 0x08, 0x45, 0x25, 0x9a, 0x63, 0x8a, 0xdc, 0x27, + 0xf1, 0x1e, 0x85, 0x2a, 0x33, 0x4a, 0x51, 0x97, + 0x6d, 0x7d, 0xbc, 0x7d, 0xb7, 0x1f, 0x3a, 0xb6, + 0x53, 0xe3, 0x31, 0xcb, 0x41, 0x35, 0xc0, 0xa2, + 0x04, 0x83, 0x25, 0xde, 0xf5, 0x20, 0x13, 0x69, + 0xb0, 0x95, 0x91, 0x2a, 0xde, 0xe4, 0xb5, 0xb0, + 0x5c, 0xe1, 0xd4, 0x24, 0x57, 0xfe, 0x9d, 0xae, + 0xac, 0x9a, 0xe1, 0x24, 0x15, 0x3d, 0x71, 0xeb, + 0x9c, 0x4e, 0x4e, 0x2a, 0x2d, 0x11, 0xd7, 0x5c, + 0x1b, 0x5c, 0x6e, 0x4c, 0x90, 0x76, 0x15, 0xb5, + 0xba, 0x7b, 0x90, 0x8c, 0xa7, 0x5d, 0x6b, 0x7b, + 0xdd, 0xa1, 0xf4, 0xe4, 0xd2, 0xdd, 0x72, 0x28, + 0x71, 0xc4, 0xf8, 0xed, 0xf3, 0xdc, 0x7b, 0x28, + 0x2c, 0x9e, 0x7b, 0x5f, 0x8d, 0xca, 0x9e, 0xf5, + 0xec, 0x97, 0x99, 0x01, 0xc8, 0xca, 0x21, 0xc5, + 0x42, 0x91, 0xb6, 0x1c, 0xea, 0x41, 0xa6, 0xd7, + 0xb8, 0x3c, 0x74, 0xc3, 0x70, 0x02, 0x80, 0xeb, + 0x6c, 0xa5, 0xcc, 0xf8, 0xe7, 0xf0, 0x67, 0xb3, + 0xb7, 0x53, 0x8c, 0x57, 0xbd, 0x3a, 0xe7, 0x49, + 0x76, 0x85, 0x76, 0x17, 0x91, 0x17, 0xca, 0x95, + 0x76, 0x97, 0x51, 0x4f, 0xe9, 0xfe, 0xfc, 0x8a, + 0xae, 0x8e, 0x8f, 0x45, 0xe4, 0x24, 0x2e, 0xbf, + 0xf4, 0xd8, 0xd0, 0x14, 0x08, 0x21, 0x53, 0x5c, + 0x84, 0x21, 0xf9, 0x6f, 0x5d, 0xb5, 0x6a, 0xaf, + 0xc6, 0x67, 0x92, 0x52, 0x86, 0x6c, 0x71, 0x3e, + 0x1e, 0x8b, 0xd9, 0xcc, 0xb8, 0xfe, 0xa9, 0x1f, + 0x96, 0xb6, 0x9b, 0x12, 0x34, 0xc7, 0x3b, 0x5d, + 0x43, 0x90, 0xd3, 0xe6, 0xa7, 0x28, 0xc5, 0x0e, + 0x3f, 0x61, 0x67, 0x89, 0xf0, 0x2d, 0x47, 0x70, + 0x52, 0x92, 0x8b, 0x45, 0xe4, 0x65, 0x3e, 0xfd, + 0x56, 0x0e, 0x45, 0x7a, 0xc0, 0xaf, 0xbd, 0x6f, + 0x51, 0xdf, 0xfb, 0xc1, 0xae, 0x42, 0xe5, 0x32, + 0x8c, 0x2f, 0x2f, 0xce, 0xed, 0x4f, 0x78, 0x1d, + 0x52, 0x2d, 0x87, 0x6e, 0x34, 0x9c, 0xfe, 0x5b, + 0xcc, 0xc1, 0xea, 0x19, 0xfc, 0x70, 0xd5, 0xba, + 0x3c, 0xe2, 0x6f, 0xea, 0xae, 0xe7, 0xfa, 0x19, + 0x31, 0x9e, 0x00, 0xa9, 0xa4, 0x13, 0x1c, 0x8c, + 0xec, 0x6b, 0x4b, 0xd8, 0x3b, 0x10, 0x53, 0x84, + 0x3b, 0x1c, 0x20, 0x1c, 0xf1, 0xb9, 0x6c, 0x48, + 0x18, 0xd8, 0x0e, 0x3d, 0x39, 0x60, 0x29, 0x00, + 0x2c, 0x80, 0x20, 0x3f, 0xd3, 0x38, 0xf7, 0x8d, + 0x9a, 0xdf, 0x19, 0x9b, 0x20, 0x41, 0x66, 0xc3, + 0x5e, 0x1e, 0x41, 0x0b, 0x9e, 0x36, 0x3a, 0xfd, + 0x42, 0x00, 0x14, 0x6c, 0x51, 0x09, 0xa3, 0x15, + 0x99, 0x60, 0x8b, 0x52, 0x40, 0x5b, 0x18, 0x06, + 0x1c, 0x88, 0xe6, 0x5d, 0x82, 0x9c, 0xe6, 0xc0, + 0x71, 0xdd, 0x60, 0x6b, 0x00, 0x1c, 0xd4, 0x75, + 0x1f, 0xc7, 0xcf, 0xe8, 0xbd, 0x53, 0xda, 0x16, + 0x17, 0x8b, 0x40, 0xf9, 0x73, 0x41, 0xf5, 0x1d, + 0xb7, 0xb3, 0xda, 0x75, 0x9e, 0x8d, 0x8d, 0x68, + 0x43, 0x62, 0x48, 0xc6, 0xd8, 0x38, 0xf9, 0x67, + 0x80, 0xa1, 0x08, 0xf0, 0x6a, 0x88, 0x5f, 0x9f, + 0x9c, 0xed, 0x9e, 0x7e, 0xde, 0x73, 0xce, 0x76, + 0xcf, 0x3f, 0x72, 0x43, 0xd9, 0x07, 0xd7, 0xda, + 0xcc, 0x45, 0x7e, 0xd3, 0x0d, 0x43, 0x06, 0xc0, + 0x71, 0xdc, 0x0d, 0x50, 0x03, 0x91, 0x84, 0x63, + 0xfa, 0x3c, 0xe6, 0xe7, 0x9b, 0x96, 0x77, 0xcd, + 0xcf, 0xef, 0xe7, 0x3c, 0xe6, 0xb7, 0x9a, 0xdf, + 0xdd, 0x94, 0x84, 0x72, 0x0d, 0x51, 0x0b, 0xf5, + 0xef, 0x79, 0xb9, 0x66, 0xf7, 0x9b, 0xde, 0x6e, + 0x59, 0x29, 0x6f, 0x3f, 0xff, 0xc4, 0x00, 0x36, + 0x11, 0x00, 0x01, 0x04, 0x01, 0x03, 0x02, 0x02, + 0x08, 0x05, 0x04, 0x02, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x03, 0x04, 0x11, 0x05, + 0x12, 0x21, 0x13, 0x31, 0x30, 0x41, 0x14, 0x20, + 0x22, 0x23, 0x32, 0x51, 0x61, 0xb1, 0x10, 0x33, + 0x42, 0x81, 0x91, 0x40, 0x71, 0xa1, 0xd1, 0x15, + 0xf0, 0x24, 0xc1, 0xe1, 0xff, 0xda, 0x00, 0x08, + 0x01, 0x03, 0x01, 0x01, 0x3f, 0x01, 0xf1, 0x1b, + 0x0c, 0x92, 0x7c, 0x0d, 0xca, 0x76, 0x9f, 0x3b, + 0x30, 0x65, 0x1b, 0x73, 0xf3, 0x56, 0x2b, 0x3e, + 0xb9, 0xc3, 0xbc, 0xfc, 0x7c, 0xfa, 0x80, 0x13, + 0xd9, 0x10, 0x47, 0x08, 0x2f, 0xa2, 0xd3, 0x84, + 0x6c, 0x6e, 0xf9, 0x3e, 0xd9, 0x42, 0xec, 0x51, + 0xe0, 0xfe, 0x93, 0xdb, 0xcb, 0xf9, 0x4f, 0x9e, + 0x0b, 0x91, 0x96, 0x82, 0x0f, 0xd9, 0x5c, 0x82, + 0x52, 0xfe, 0xf9, 0x1f, 0x65, 0x24, 0x66, 0x37, + 0x6d, 0x77, 0x8a, 0x39, 0xec, 0xa3, 0xa5, 0x66, + 0x5f, 0x85, 0x85, 0x7f, 0xc4, 0x4e, 0xd6, 0xee, + 0x7f, 0x0b, 0xd0, 0x76, 0x8c, 0xe5, 0x63, 0x6b, + 0x94, 0xf6, 0xcb, 0x7d, 0xd0, 0x45, 0xa7, 0x38, + 0x4d, 0xad, 0x2b, 0xbb, 0x35, 0x1a, 0x6f, 0x67, + 0xe6, 0x70, 0xaa, 0x4b, 0xd3, 0x7e, 0xd3, 0xe6, + 0xaf, 0x57, 0x73, 0x5d, 0xbf, 0xc9, 0x53, 0x73, + 0xe3, 0x93, 0x2d, 0x42, 0x79, 0x31, 0xb7, 0x29, + 0xf9, 0x7f, 0x75, 0xb5, 0x61, 0x61, 0x63, 0xd7, + 0xa1, 0x5a, 0x3b, 0x4e, 0x2d, 0x90, 0xe1, 0x40, + 0xfa, 0x71, 0x93, 0xbd, 0x99, 0x51, 0xea, 0x90, + 0xb1, 0xc0, 0x36, 0x3c, 0x05, 0x67, 0x50, 0x64, + 0x0d, 0xc9, 0x07, 0x95, 0x52, 0xe1, 0xb4, 0xc2, + 0x1e, 0xa4, 0x9f, 0xa5, 0x3e, 0x3c, 0x95, 0x88, + 0xcb, 0x5e, 0xa6, 0x6e, 0x5c, 0xd7, 0x7c, 0xd4, + 0x30, 0xb1, 0xa0, 0x39, 0xce, 0x08, 0x9d, 0xa3, + 0x86, 0x2d, 0x4e, 0x5d, 0xe4, 0x34, 0x2e, 0x9e, + 0x63, 0xde, 0x84, 0xce, 0x92, 0x2e, 0x92, 0xdc, + 0x63, 0x38, 0x51, 0xd5, 0x89, 0xec, 0xeb, 0x79, + 0x2a, 0xf1, 0x37, 0x66, 0xee, 0x9f, 0x63, 0xca, + 0xb8, 0xf6, 0xbe, 0x5f, 0x65, 0xbb, 0x7f, 0x0c, + 0x2c, 0x2c, 0x2c, 0x7a, 0xb1, 0x4a, 0x60, 0x78, + 0x90, 0x79, 0x2b, 0x65, 0x9b, 0xb3, 0x1f, 0x62, + 0xb2, 0x51, 0x9e, 0x59, 0x9a, 0x18, 0xf3, 0x9c, + 0x2a, 0xe5, 0xd1, 0xf2, 0xee, 0x02, 0x9d, 0x8d, + 0x91, 0xbb, 0x98, 0xaa, 0x33, 0xd3, 0x07, 0x43, + 0xcf, 0xc9, 0x56, 0xd1, 0x9b, 0xb8, 0x36, 0x63, + 0xcf, 0x74, 0xd8, 0x64, 0x8b, 0xf2, 0x80, 0x03, + 0xfc, 0xa6, 0xd7, 0x2f, 0xe5, 0xef, 0x2a, 0x5d, + 0x3e, 0xa5, 0x82, 0xec, 0x3b, 0xb7, 0xf0, 0x9b, + 0xe8, 0xb2, 0x1f, 0x47, 0x85, 0x1a, 0xd2, 0x69, + 0xf2, 0x75, 0x5c, 0xde, 0x14, 0xe5, 0xd6, 0x24, + 0xea, 0x7c, 0xd6, 0x8c, 0xc6, 0x10, 0xf6, 0xbd, + 0x59, 0x30, 0xb5, 0x99, 0x71, 0xc6, 0x15, 0x99, + 0xaa, 0x48, 0xf2, 0x5b, 0x92, 0xa5, 0x76, 0x5d, + 0xb8, 0x0c, 0x7a, 0x98, 0x58, 0x58, 0xf5, 0x23, + 0x76, 0xe6, 0x6c, 0x3d, 0xc2, 0xc2, 0x85, 0xa5, + 0xaf, 0x04, 0x2d, 0x41, 0xcd, 0xe9, 0x35, 0x80, + 0xf6, 0x51, 0x59, 0x31, 0x34, 0xb4, 0x05, 0x5e, + 0x52, 0xd9, 0x9a, 0xf6, 0xf1, 0xca, 0xbd, 0x67, + 0xff, 0x00, 0x19, 0xf8, 0x3c, 0xad, 0x20, 0x49, + 0x2b, 0xde, 0x03, 0xf1, 0x95, 0x72, 0x4b, 0x02, + 0x42, 0xc9, 0x9c, 0x4a, 0xd2, 0x64, 0xd8, 0xe3, + 0x1c, 0xac, 0xdc, 0xd7, 0x7d, 0x3b, 0x7d, 0x53, + 0x2c, 0x53, 0x80, 0x97, 0x86, 0xe0, 0x80, 0xb5, + 0x0d, 0x43, 0xd2, 0xe3, 0x0d, 0x60, 0xec, 0x99, + 0x33, 0x58, 0x1b, 0x16, 0x15, 0x18, 0xe2, 0x3c, + 0xab, 0x90, 0x4a, 0xe6, 0x16, 0xc6, 0x13, 0xa2, + 0x2c, 0xe1, 0xfc, 0x2f, 0x76, 0x3f, 0x03, 0x8f, + 0x2f, 0x5c, 0x0c, 0xaf, 0xcb, 0x21, 0xc9, 0xb1, + 0x57, 0xda, 0xc9, 0xda, 0xdf, 0xaf, 0x1f, 0x65, + 0x3c, 0x8f, 0x12, 0x9d, 0xcc, 0xe0, 0xf6, 0x2a, + 0xdc, 0x78, 0x6f, 0x6e, 0x16, 0xd5, 0x4a, 0x3d, + 0xf3, 0xb3, 0x3f, 0x35, 0x6a, 0x08, 0x7a, 0x2e, + 0xc8, 0x5a, 0x74, 0x51, 0x33, 0xf2, 0x94, 0x3a, + 0x64, 0x41, 0xee, 0x7b, 0xc6, 0x54, 0xb3, 0x39, + 0xa5, 0xb1, 0x40, 0xcf, 0xf0, 0x7f, 0xd2, 0x76, + 0x77, 0xed, 0x98, 0x12, 0xef, 0xed, 0xdf, 0xf6, + 0xed, 0xff, 0x00, 0xb4, 0x5b, 0xb6, 0x3c, 0x85, + 0x6a, 0x37, 0x35, 0xfb, 0xd5, 0x2b, 0x04, 0x10, + 0x14, 0x56, 0x38, 0xca, 0xd5, 0xbd, 0xfc, 0xa5, + 0xff, 0x00, 0x8e, 0xc7, 0x1e, 0xcb, 0x18, 0xf5, + 0x80, 0x4e, 0x19, 0x5a, 0x25, 0x80, 0xfc, 0xd2, + 0x97, 0xb1, 0xe4, 0x2b, 0x31, 0xc3, 0xb0, 0x17, + 0x0e, 0xc9, 0xd5, 0xa2, 0xb2, 0xd2, 0x77, 0x27, + 0x42, 0x21, 0x7e, 0xd5, 0x4e, 0xbb, 0x58, 0xee, + 0xb8, 0xe5, 0x6a, 0x76, 0x8c, 0x8c, 0xd9, 0x8e, + 0xca, 0x8d, 0xa2, 0xd2, 0x39, 0x52, 0x5f, 0xd9, + 0x06, 0x47, 0xc7, 0xdb, 0x0a, 0x1b, 0x76, 0x25, + 0xc3, 0x76, 0x8c, 0xfe, 0xa5, 0x2b, 0x3a, 0x80, + 0x7b, 0x58, 0x4e, 0xae, 0xc0, 0xae, 0x44, 0xc9, + 0x38, 0x05, 0x73, 0x04, 0x8a, 0x0b, 0x52, 0x39, + 0xa4, 0x61, 0x75, 0xba, 0x8e, 0x21, 0xca, 0x46, + 0x0c, 0xa1, 0xd9, 0x72, 0x4a, 0x3d, 0xfc, 0x0d, + 0xce, 0x85, 0xe2, 0x46, 0x77, 0x0a, 0xcc, 0xce, + 0xb0, 0xc1, 0x33, 0x7c, 0xd5, 0x2b, 0x66, 0x23, + 0x81, 0xe6, 0xaf, 0xc4, 0xf3, 0xef, 0x15, 0x39, + 0xb6, 0x3b, 0x07, 0xb1, 0x56, 0x60, 0x6b, 0x87, + 0x0b, 0x98, 0x24, 0x55, 0xe5, 0x92, 0x66, 0xb9, + 0x90, 0xfc, 0x43, 0xb2, 0x86, 0x3b, 0x8f, 0x0f, + 0xea, 0xfb, 0x27, 0xee, 0xb0, 0xec, 0xee, 0x73, + 0xb9, 0xfd, 0xca, 0x77, 0xbd, 0x76, 0x3b, 0xff, + 0x00, 0xdf, 0x90, 0x4c, 0xae, 0xdd, 0x98, 0xe1, + 0x4d, 0xa1, 0x36, 0xc1, 0xdc, 0x1d, 0x84, 0xfd, + 0x32, 0x1a, 0xc3, 0x66, 0xf5, 0x71, 0xb0, 0xb5, + 0xde, 0xc3, 0xb9, 0x4f, 0x93, 0x27, 0x38, 0x5d, + 0x47, 0x29, 0x1e, 0xd9, 0x70, 0x40, 0x42, 0xbc, + 0x8f, 0x69, 0x70, 0x1d, 0xbc, 0x07, 0x0c, 0x85, + 0xa6, 0xcb, 0xde, 0x07, 0x7e, 0xc9, 0xcd, 0xe9, + 0x3f, 0x6a, 0x81, 0xc2, 0xd4, 0x1b, 0x4f, 0x74, + 0xf6, 0x74, 0x64, 0xda, 0xa9, 0x39, 0xb3, 0x0e, + 0x7b, 0xad, 0x46, 0x0d, 0x83, 0x72, 0xd3, 0xec, + 0xf4, 0x2c, 0xb5, 0xe5, 0x02, 0x4a, 0x7d, 0x78, + 0x41, 0x2f, 0x7a, 0x9b, 0x51, 0xad, 0x08, 0x3b, + 0x5d, 0xca, 0x9b, 0x5a, 0xc8, 0xc0, 0xe5, 0x4b, + 0xab, 0xdb, 0x97, 0xf5, 0x61, 0x3a, 0x47, 0xbf, + 0x97, 0x1c, 0xfe, 0x19, 0xfc, 0x23, 0x90, 0xc4, + 0xf0, 0xf0, 0xa3, 0xbf, 0x5f, 0xa3, 0xbd, 0xbc, + 0x14, 0x63, 0x74, 0x99, 0x7b, 0x47, 0xd4, 0xf8, + 0x1c, 0xc6, 0xe0, 0xf6, 0xa9, 0xb1, 0x62, 0x21, + 0x33, 0x55, 0x39, 0xfa, 0x6f, 0xca, 0xbd, 0x5f, + 0xa8, 0xde, 0xa3, 0x15, 0x69, 0xcc, 0x2f, 0x0f, + 0x5a, 0x9d, 0x91, 0x35, 0x71, 0x84, 0x13, 0xf5, + 0xe9, 0xf0, 0x04, 0x6d, 0x01, 0x4d, 0x72, 0x6b, + 0x07, 0x32, 0x3b, 0x2b, 0x3e, 0x03, 0x48, 0x0e, + 0x19, 0xec, 0xab, 0x47, 0x51, 0xad, 0xc8, 0xec, + 0x55, 0xfa, 0x62, 0x1f, 0x7d, 0x17, 0x2c, 0x3f, + 0xe3, 0xe9, 0xeb, 0xb8, 0x64, 0x2d, 0x36, 0x6e, + 0x4c, 0x0e, 0xf3, 0xfb, 0xa2, 0xce, 0x94, 0x98, + 0x77, 0x62, 0xa9, 0x4a, 0x2c, 0xc7, 0xd3, 0x2a, + 0xcc, 0x0e, 0x8d, 0xe7, 0x68, 0xe1, 0x1b, 0x19, + 0x6f, 0x4d, 0xc9, 0xc3, 0x6f, 0x89, 0x4a, 0xcf, + 0x45, 0xe1, 0x8f, 0xf8, 0x53, 0x77, 0xd4, 0x79, + 0x8e, 0x73, 0xee, 0xdd, 0xfb, 0xfe, 0xea, 0xdd, + 0x53, 0x55, 0xf8, 0xee, 0xd3, 0xd8, 0xfa, 0xe7, + 0x2d, 0x76, 0x42, 0x8e, 0x28, 0xaf, 0xc2, 0x26, + 0x71, 0xc7, 0xfb, 0xff, 0x00, 0xea, 0x86, 0x08, + 0xab, 0xf2, 0xdf, 0x35, 0x6f, 0xdb, 0x6e, 0x33, + 0xc2, 0x7b, 0x70, 0x70, 0x57, 0x71, 0xe2, 0xe9, + 0xf6, 0x5a, 0x48, 0x82, 0x7c, 0x63, 0xea, 0x9d, + 0x5a, 0x1b, 0x40, 0xc7, 0x93, 0xf4, 0x53, 0xc2, + 0xea, 0xf2, 0x18, 0xdf, 0xeb, 0x3c, 0x64, 0x2d, + 0x36, 0x7c, 0x38, 0xd6, 0x73, 0xb0, 0x1f, 0xf7, + 0x57, 0xa4, 0xf4, 0x7d, 0x98, 0xee, 0xa3, 0xbb, + 0x23, 0xde, 0x04, 0x87, 0x85, 0x72, 0x12, 0xd3, + 0xb9, 0x76, 0xf1, 0xab, 0xdc, 0x74, 0x91, 0xed, + 0x6f, 0xe6, 0x05, 0x6a, 0xd8, 0xb2, 0xc0, 0x24, + 0x1e, 0xd0, 0x58, 0xc7, 0xac, 0xe0, 0x5a, 0x72, + 0x14, 0xf3, 0x3a, 0xe4, 0x4d, 0x97, 0xcc, 0x70, + 0x53, 0x5a, 0x5a, 0xe1, 0xbb, 0x84, 0x66, 0xeb, + 0x82, 0x9c, 0xdd, 0xa7, 0x08, 0x7c, 0xbc, 0x58, + 0x60, 0x91, 0xce, 0xf6, 0x51, 0xa5, 0x31, 0x71, + 0xd8, 0x32, 0x14, 0xd5, 0xdb, 0x14, 0x7e, 0xd3, + 0xc6, 0xef, 0x97, 0xac, 0xf1, 0x90, 0xb4, 0xbb, + 0x42, 0xbc, 0xdb, 0x24, 0xf8, 0x5d, 0xc1, 0x57, + 0x81, 0xf4, 0x87, 0x0c, 0xaa, 0x9c, 0x4b, 0xca, + 0xb4, 0x07, 0x71, 0xf8, 0x1e, 0x79, 0xf0, 0x39, + 0x3d, 0x93, 0x2b, 0x4b, 0x27, 0x60, 0xa2, 0xd2, + 0xcf, 0xeb, 0x45, 0xb4, 0x6a, 0xf3, 0x21, 0x19, + 0x52, 0x6a, 0xed, 0x69, 0xf7, 0x2d, 0x52, 0x5d, + 0x9e, 0xc0, 0xc3, 0x9d, 0xe0, 0x38, 0x61, 0x54, + 0xac, 0x35, 0x18, 0xba, 0x99, 0xf6, 0x9b, 0xdf, + 0xfd, 0xa9, 0x76, 0xc0, 0xf3, 0x1b, 0x06, 0x4f, + 0xcd, 0x46, 0xee, 0xab, 0x79, 0xee, 0xa4, 0x66, + 0xd2, 0x99, 0x19, 0x28, 0x8d, 0xbc, 0x7a, 0x83, + 0x25, 0x47, 0x56, 0x49, 0x3b, 0x05, 0x16, 0x96, + 0x71, 0x97, 0x22, 0xda, 0x55, 0x3e, 0x27, 0x29, + 0xb5, 0x96, 0x0e, 0x21, 0x62, 0x96, 0xfd, 0x89, + 0xb8, 0x73, 0x91, 0xe5, 0x61, 0x30, 0x1f, 0x01, + 0xe3, 0x2a, 0x8d, 0x9f, 0x46, 0x97, 0xe8, 0x78, + 0x2a, 0x5d, 0x2e, 0x70, 0x77, 0x30, 0x70, 0xa3, + 0xd2, 0xde, 0xc1, 0xca, 0x9a, 0xab, 0xdc, 0x0b, + 0x71, 0xca, 0x8e, 0x29, 0x9c, 0xe0, 0xac, 0x40, + 0xe1, 0xca, 0x00, 0x9e, 0x13, 0x2b, 0x49, 0x21, + 0xc0, 0x0a, 0x1d, 0x24, 0x9f, 0x89, 0x11, 0x4e, + 0xaf, 0xc6, 0xee, 0x7f, 0xef, 0xc9, 0x4b, 0xad, + 0x31, 0xa3, 0x6c, 0x0c, 0xfe, 0x54, 0xfa, 0x8d, + 0x99, 0xfe, 0x27, 0x70, 0xbb, 0xa0, 0xd2, 0x84, + 0x6b, 0x60, 0x58, 0xf0, 0x9c, 0x39, 0x5a, 0x45, + 0xa3, 0x6e, 0xa3, 0xa0, 0xdd, 0x87, 0x37, 0xcd, + 0x45, 0x6e, 0x6d, 0x39, 0xee, 0x6b, 0xce, 0xe2, + 0xa9, 0x6a, 0x6e, 0x94, 0xb9, 0xdb, 0x7d, 0xb1, + 0xf6, 0xff, 0x00, 0x6a, 0x79, 0x01, 0x0d, 0xfd, + 0x21, 0xdf, 0x2f, 0x9f, 0xf7, 0x50, 0xd4, 0x75, + 0x9d, 0xdb, 0xfd, 0x91, 0xe4, 0xa4, 0x65, 0x4a, + 0x8d, 0xc4, 0x8f, 0x19, 0x53, 0x6b, 0x71, 0xb3, + 0x22, 0xbb, 0x3f, 0x95, 0x3e, 0xa3, 0x66, 0x7e, + 0x1c, 0xee, 0x3e, 0x8b, 0x92, 0x83, 0x09, 0x42, + 0x34, 0x1a, 0x07, 0x8d, 0x20, 0x54, 0xac, 0xba, + 0xac, 0xc1, 0xe1, 0x4f, 0x46, 0x69, 0x1d, 0xba, + 0x31, 0x9c, 0xf9, 0xa8, 0x58, 0xca, 0x6f, 0xea, + 0x4f, 0x26, 0x0f, 0xd3, 0x92, 0xa6, 0xd5, 0x21, + 0xed, 0x03, 0x14, 0xfa, 0x95, 0xab, 0x1c, 0x39, + 0xdc, 0x2c, 0x12, 0x84, 0x68, 0x46, 0x16, 0x07, + 0xf4, 0x3d, 0xd3, 0x86, 0x0a, 0x36, 0xec, 0x18, + 0xc4, 0x5b, 0xce, 0xd0, 0xb6, 0x12, 0x84, 0x68, + 0x30, 0x78, 0x59, 0xf1, 0x30, 0x0a, 0xc0, 0xfe, + 0x87, 0xff, 0xc4, 0x00, 0x2d, 0x11, 0x00, 0x02, + 0x02, 0x01, 0x03, 0x02, 0x06, 0x01, 0x04, 0x02, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x03, 0x11, 0x04, 0x12, 0x21, 0x30, 0x31, + 0x10, 0x13, 0x20, 0x22, 0x32, 0x41, 0x23, 0x14, + 0x42, 0x61, 0x71, 0x33, 0x40, 0x43, 0x51, 0x52, + 0xff, 0xda, 0x00, 0x08, 0x01, 0x02, 0x01, 0x01, + 0x3f, 0x01, 0xea, 0x1b, 0x11, 0x7b, 0x98, 0x75, + 0x55, 0xfd, 0x73, 0x2a, 0xb5, 0x6d, 0x19, 0x1f, + 0xe8, 0x93, 0x88, 0x0c, 0x27, 0x13, 0x76, 0x61, + 0x19, 0x9b, 0x04, 0xd4, 0xee, 0xdd, 0x81, 0x3c, + 0xa6, 0x6f, 0xee, 0x0a, 0xda, 0xa3, 0x92, 0x25, + 0x2e, 0xaa, 0x22, 0x36, 0xe1, 0x91, 0xd6, 0x6b, + 0xeb, 0x5e, 0xe6, 0x0d, 0x52, 0x1e, 0xd1, 0xb5, + 0x1c, 0xe2, 0x77, 0x11, 0x29, 0x07, 0x99, 0xc6, + 0x21, 0xb1, 0x47, 0xdc, 0x16, 0x83, 0xda, 0x5f, + 0x5e, 0xf5, 0xcc, 0xd3, 0x5b, 0x91, 0xb4, 0xcb, + 0xb0, 0xc3, 0x06, 0x1a, 0xd7, 0xbe, 0x22, 0x8c, + 0x4d, 0xd3, 0x74, 0xcf, 0x43, 0x51, 0x6b, 0xd7, + 0x8d, 0xa2, 0x1f, 0xd4, 0x37, 0xdc, 0x6d, 0x3b, + 0x11, 0x92, 0xd2, 0xba, 0x0b, 0x19, 0x65, 0x5e, + 0x59, 0xe2, 0x1a, 0xbc, 0xca, 0xff, 0x00, 0x99, + 0x4b, 0xee, 0x59, 0x59, 0xe0, 0x88, 0xee, 0xc4, + 0xe0, 0x40, 0xb9, 0xfb, 0x9a, 0x74, 0xc0, 0xcc, + 0xdd, 0xce, 0x27, 0x96, 0x11, 0xf7, 0x43, 0xee, + 0x8d, 0x73, 0xee, 0xd9, 0x1d, 0x8e, 0xec, 0x6e, + 0x95, 0x0c, 0x2f, 0x7f, 0x1c, 0xcc, 0xcc, 0xfa, + 0x5d, 0x37, 0xae, 0x25, 0x23, 0xff, 0x00, 0x53, + 0x68, 0x9b, 0x15, 0x4e, 0x40, 0x8f, 0xee, 0xed, + 0x10, 0x95, 0xe0, 0xcb, 0x7f, 0x03, 0x79, 0x83, + 0xb4, 0x7d, 0x61, 0xc6, 0x6b, 0x85, 0xd4, 0xfc, + 0xa7, 0x99, 0x8f, 0x88, 0x8b, 0xa8, 0xb5, 0x38, + 0xc4, 0x2d, 0x6a, 0x7e, 0x57, 0x82, 0xc4, 0xd4, + 0x0d, 0xa2, 0x2e, 0xda, 0x97, 0x6c, 0xd5, 0x93, + 0xc1, 0x12, 0xb5, 0x62, 0x78, 0x89, 0x5d, 0x80, + 0x60, 0x9c, 0x44, 0x1c, 0x63, 0xd3, 0x9f, 0x49, + 0x18, 0x6c, 0xf8, 0x39, 0xcf, 0x13, 0x4e, 0x87, + 0x71, 0x31, 0xaa, 0x0c, 0x73, 0x2c, 0x5d, 0xc8, + 0x41, 0x94, 0x55, 0xf9, 0x00, 0xc7, 0x13, 0x59, + 0xb5, 0x00, 0xe2, 0x54, 0xb5, 0x95, 0x05, 0x04, + 0xd5, 0xa6, 0x46, 0x43, 0x60, 0x88, 0xc9, 0x6d, + 0x8b, 0x82, 0x66, 0x92, 0x9f, 0x28, 0xfb, 0x8c, + 0xb6, 0xb2, 0xf9, 0x6c, 0xc7, 0xb1, 0x87, 0x12, + 0xab, 0x10, 0x1c, 0xb4, 0xde, 0xbf, 0x53, 0x7b, + 0x78, 0x29, 0x7f, 0xdc, 0x3d, 0x64, 0xcf, 0x90, + 0xc4, 0x67, 0x7e, 0x54, 0x98, 0x81, 0x4a, 0x70, + 0xd2, 0xa3, 0x32, 0x25, 0xcf, 0xb5, 0x0e, 0x22, + 0x58, 0xf9, 0xe0, 0xcb, 0x2d, 0x66, 0x38, 0xb2, + 0x36, 0xa1, 0xb1, 0x80, 0x62, 0xa8, 0xf9, 0xb9, + 0x83, 0x18, 0xf6, 0xc1, 0xc9, 0x95, 0x90, 0x57, + 0x13, 0x53, 0x5e, 0x39, 0x81, 0x77, 0x4d, 0x38, + 0xd8, 0xbe, 0x2c, 0xf8, 0x8a, 0x49, 0xef, 0xea, + 0x26, 0x09, 0xad, 0xac, 0x8f, 0xca, 0xb1, 0x1d, + 0x87, 0x68, 0x97, 0xb2, 0x9e, 0xd1, 0x9c, 0xb2, + 0xe6, 0x3d, 0xc5, 0x97, 0x61, 0x9a, 0x7a, 0xf6, + 0x99, 0xa9, 0xab, 0xee, 0x57, 0x5e, 0xf7, 0xc1, + 0xed, 0x1a, 0xa4, 0x43, 0x9c, 0xc5, 0x3b, 0x7e, + 0xa2, 0xd8, 0x65, 0x36, 0x10, 0x79, 0x8c, 0x3c, + 0xc5, 0x9e, 0x4a, 0xa4, 0xc6, 0x39, 0x10, 0xb6, + 0x27, 0x26, 0x7c, 0x62, 0xf6, 0xe8, 0x10, 0x1d, + 0x76, 0x98, 0x95, 0x85, 0xf6, 0x19, 0x65, 0x7c, + 0xff, 0x00, 0x52, 0x96, 0x18, 0xdb, 0x2c, 0x52, + 0x25, 0x6e, 0x63, 0x0f, 0x31, 0x61, 0xac, 0x21, + 0xcb, 0x76, 0x31, 0x8d, 0x60, 0x8d, 0xb3, 0xeb, + 0x00, 0x41, 0xed, 0x8e, 0xc7, 0x39, 0x12, 0xbd, + 0x79, 0x41, 0xc8, 0x83, 0x52, 0xd6, 0x73, 0x89, + 0x5b, 0x1c, 0x72, 0x26, 0xd1, 0x36, 0x8f, 0xa8, + 0x01, 0x03, 0xbc, 0xde, 0x14, 0xe0, 0xf4, 0x01, + 0x9a, 0x85, 0xff, 0x00, 0x90, 0x47, 0xe4, 0x6e, + 0x9f, 0xe3, 0x78, 0x7f, 0x22, 0xe6, 0x37, 0xb6, + 0x69, 0x9f, 0x3c, 0x4b, 0xeb, 0x0f, 0x59, 0x02, + 0x18, 0x1d, 0x8f, 0x02, 0x2d, 0x4e, 0xdf, 0x51, + 0x74, 0xa6, 0x26, 0x96, 0xb5, 0x3d, 0xa0, 0x40, + 0x3b, 0x4d, 0xb3, 0x68, 0x1e, 0x0c, 0xbb, 0x86, + 0x23, 0xd0, 0xf9, 0xc4, 0xc8, 0x5e, 0x0f, 0x43, + 0x01, 0x97, 0x06, 0x2f, 0xb4, 0x94, 0x32, 0xd4, + 0x94, 0xbe, 0x38, 0x96, 0x27, 0xd4, 0xd3, 0x26, + 0xc7, 0xdd, 0x0b, 0x41, 0xa4, 0x5c, 0xf2, 0x62, + 0xd2, 0xab, 0xf1, 0x13, 0x64, 0xdb, 0xeb, 0x39, + 0xc7, 0x11, 0xda, 0xc6, 0x38, 0x32, 0x9b, 0x4b, + 0x7b, 0x5f, 0xbf, 0xac, 0x19, 0xa8, 0x5f, 0xdf, + 0x2d, 0xf7, 0xa6, 0xe1, 0xdc, 0x47, 0x43, 0x59, + 0xcc, 0x46, 0x0e, 0x39, 0x82, 0xb3, 0xde, 0x01, + 0x31, 0xd3, 0xb6, 0xbd, 0xc3, 0x23, 0xbc, 0x38, + 0xb9, 0x77, 0x27, 0x71, 0x2a, 0xb3, 0xcc, 0x1f, + 0xcf, 0xaf, 0xe4, 0x30, 0x63, 0xda, 0x74, 0xc7, + 0x69, 0x9e, 0x7b, 0x5c, 0x71, 0x89, 0x50, 0xc1, + 0xcf, 0x81, 0x1f, 0x7d, 0x5b, 0xab, 0x23, 0xde, + 0x91, 0x2e, 0x20, 0xe4, 0x08, 0x8e, 0x1c, 0x64, + 0x7a, 0x94, 0xcd, 0x52, 0x64, 0x79, 0x80, 0x76, + 0x94, 0x57, 0xbf, 0x39, 0x86, 0xa0, 0x07, 0x12, + 0xa7, 0xcf, 0x13, 0xb4, 0xec, 0x7a, 0xb6, 0xd7, + 0x83, 0xfc, 0x4a, 0x6a, 0x6a, 0xcf, 0xf1, 0xeb, + 0x1c, 0x89, 0x5a, 0x8a, 0x98, 0xa4, 0xce, 0x47, + 0x13, 0x6e, 0xd3, 0x3b, 0xc2, 0x33, 0x07, 0x4f, + 0x31, 0x9c, 0x0e, 0xf3, 0x7d, 0x7c, 0x64, 0xc5, + 0xb7, 0x73, 0x70, 0x38, 0xf5, 0x2c, 0xd4, 0xd7, + 0xbd, 0x77, 0x0e, 0xe2, 0x53, 0xf0, 0x12, 0xcf, + 0x8c, 0xaf, 0x3e, 0x07, 0xa1, 0x91, 0x1a, 0xc0, + 0x23, 0x6a, 0x00, 0x81, 0xae, 0xb3, 0xe0, 0x22, + 0x68, 0xc9, 0xe5, 0xcc, 0x14, 0xa2, 0x7d, 0x74, + 0x04, 0xb2, 0xc3, 0xa7, 0x6d, 0xb3, 0x71, 0x2b, + 0xb9, 0xa7, 0x68, 0x0e, 0x44, 0x2c, 0x3b, 0x41, + 0xff, 0x00, 0x5e, 0x8c, 0xc6, 0xb0, 0x08, 0xda, + 0x80, 0x20, 0x6b, 0xad, 0xf8, 0x88, 0xba, 0x36, + 0x3f, 0x33, 0x13, 0x4f, 0x5a, 0x76, 0x1e, 0x2d, + 0xd0, 0x59, 0x7d, 0x7e, 0x62, 0xff, 0x00, 0x51, + 0x75, 0x15, 0x9e, 0x0c, 0xfd, 0x4a, 0x98, 0xb6, + 0x8e, 0xf3, 0x28, 0x20, 0x33, 0x74, 0x36, 0x01, + 0x1f, 0x52, 0x20, 0x36, 0xd9, 0xf0, 0x11, 0x74, + 0x6c, 0xdf, 0x33, 0x13, 0x4d, 0x5d, 0x7f, 0x5e, + 0x19, 0x9b, 0xa6, 0xee, 0x98, 0xe6, 0x6a, 0xea, + 0xf2, 0xec, 0xc8, 0xec, 0x67, 0xe9, 0xab, 0x7f, + 0x7a, 0x8d, 0xa2, 0x5b, 0x47, 0x61, 0x9e, 0x22, + 0x2f, 0x3f, 0xd4, 0x6b, 0xbc, 0xbc, 0x62, 0x06, + 0xb6, 0xe3, 0xed, 0x11, 0x74, 0x6c, 0xdf, 0x33, + 0x13, 0x4d, 0x5a, 0x76, 0x1e, 0x19, 0x9b, 0xa6, + 0x7a, 0xca, 0x65, 0xd5, 0xf9, 0xab, 0x88, 0xb7, + 0x20, 0x18, 0x31, 0x9b, 0xcc, 0x5d, 0xb5, 0xae, + 0x62, 0x69, 0x9c, 0xfc, 0xcc, 0x4d, 0x35, 0x69, + 0xf5, 0x3b, 0x4d, 0xd3, 0x74, 0xcf, 0x57, 0x1e, + 0x91, 0x05, 0x15, 0x86, 0xdd, 0x89, 0xba, 0x6f, + 0x99, 0xe9, 0x63, 0xa9, 0x99, 0x9e, 0xbe, 0x3c, + 0x3f, 0xff, 0xc4, 0x00, 0x42, 0x10, 0x00, 0x02, + 0x01, 0x02, 0x03, 0x05, 0x04, 0x06, 0x06, 0x08, + 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x03, 0x00, 0x11, 0x04, 0x12, 0x21, 0x13, 0x22, + 0x31, 0x41, 0x51, 0x32, 0x52, 0x61, 0x71, 0x14, + 0x23, 0x30, 0x42, 0x81, 0x91, 0x05, 0x20, 0x62, + 0xa1, 0xd1, 0xf0, 0x10, 0x24, 0x33, 0x40, 0x92, + 0xb1, 0xc1, 0xe1, 0x25, 0x53, 0x72, 0x82, 0xf1, + 0x15, 0x34, 0x63, 0x83, 0xa3, 0xff, 0xda, 0x00, + 0x08, 0x01, 0x01, 0x00, 0x06, 0x3f, 0x02, 0xf6, + 0x37, 0x3a, 0x0a, 0xcc, 0x8c, 0x1d, 0x7a, 0xa9, + 0xfd, 0x1e, 0xb1, 0xd5, 0x3f, 0xd4, 0x69, 0xf6, + 0x27, 0x6c, 0x50, 0x5c, 0xe5, 0xa6, 0xb7, 0x15, + 0x39, 0x58, 0x74, 0xfd, 0xc7, 0x6d, 0x28, 0x62, + 0x97, 0xb6, 0xed, 0x19, 0x62, 0xd2, 0xc6, 0xc5, + 0x4f, 0x2a, 0xd7, 0x4f, 0x3a, 0x74, 0x32, 0x34, + 0x8e, 0xbc, 0x91, 0x69, 0xf0, 0xf1, 0xc4, 0xa9, + 0x09, 0xe7, 0x21, 0xd6, 0x84, 0x78, 0x69, 0xe5, + 0x54, 0x17, 0xb2, 0x8e, 0x15, 0xb0, 0x92, 0x47, + 0xdb, 0x13, 0xba, 0xcf, 0x21, 0x1a, 0x54, 0x82, + 0x49, 0x32, 0x4d, 0x1f, 0x6b, 0x68, 0x74, 0x3e, + 0x54, 0xaf, 0x01, 0xb9, 0xe7, 0xb2, 0xd4, 0x8a, + 0x96, 0x2c, 0x54, 0x5a, 0x71, 0x13, 0xe5, 0xed, + 0x6b, 0x6f, 0xe7, 0x59, 0x93, 0xb3, 0xed, 0xb7, + 0xa5, 0x51, 0xf1, 0xac, 0xa3, 0x33, 0x78, 0xda, + 0xc2, 0x8c, 0x51, 0xc7, 0x91, 0x09, 0x05, 0xb9, + 0x9b, 0x53, 0x3c, 0x52, 0x2d, 0xb5, 0x46, 0xd7, + 0x74, 0xd4, 0x91, 0x81, 0x23, 0xce, 0x78, 0xc9, + 0x9b, 0x4b, 0x78, 0x73, 0xa0, 0xb7, 0x67, 0x27, + 0xa0, 0xe3, 0x44, 0x8c, 0x3b, 0x69, 0xd7, 0x4e, + 0x55, 0x77, 0x90, 0x01, 0xf6, 0x45, 0xcd, 0x05, + 0xec, 0xda, 0x93, 0x17, 0x7d, 0xd9, 0x1b, 0x2b, + 0xaf, 0x75, 0xbf, 0x0a, 0x9d, 0xe2, 0x98, 0x2a, + 0x81, 0xbe, 0x81, 0xac, 0xd6, 0xf0, 0xe5, 0x5e, + 0xac, 0xea, 0x78, 0xbc, 0xcf, 0x98, 0x9f, 0x80, + 0xa8, 0x66, 0x7c, 0x6b, 0x5a, 0x36, 0xbe, 0xc9, + 0x74, 0x4f, 0x8f, 0x5a, 0x42, 0xd6, 0xcc, 0x54, + 0x5e, 0xde, 0xc8, 0x3d, 0xb4, 0xbd, 0x89, 0x3c, + 0xaa, 0x28, 0x63, 0xc4, 0xec, 0xa6, 0x73, 0xef, + 0x0d, 0xdf, 0x83, 0x53, 0x13, 0x89, 0xda, 0x49, + 0xc9, 0x79, 0x52, 0xed, 0xa5, 0x1c, 0x7b, 0x2b, + 0xc6, 0x8c, 0x98, 0x4d, 0xa4, 0x6d, 0x9b, 0x40, + 0xd5, 0x16, 0xab, 0x95, 0x92, 0xf6, 0xe3, 0x4d, + 0x9e, 0x3c, 0xc0, 0xea, 0xa7, 0x8d, 0x61, 0xe6, + 0xf7, 0x25, 0x88, 0x00, 0x0f, 0x85, 0x14, 0x87, + 0x0c, 0x51, 0x45, 0xb7, 0xd3, 0xde, 0x23, 0xcc, + 0x56, 0xfc, 0xb2, 0x9f, 0xb0, 0x3f, 0x1a, 0x45, + 0x86, 0x36, 0x4d, 0x35, 0xcc, 0x78, 0xd6, 0xd7, + 0x83, 0x83, 0xca, 0xb6, 0x71, 0x26, 0x77, 0x24, + 0x5d, 0x57, 0x53, 0x58, 0xac, 0x23, 0xa0, 0x8e, + 0x46, 0xcb, 0xb4, 0x57, 0x51, 0x98, 0x0f, 0xc9, + 0xad, 0xa3, 0x93, 0x37, 0x76, 0x22, 0x6d, 0xce, + 0xbf, 0xed, 0x13, 0x06, 0x0a, 0x92, 0x01, 0x5c, + 0xcd, 0x71, 0xa5, 0xa9, 0x7f, 0x58, 0xf4, 0x82, + 0x3c, 0x3b, 0x3e, 0x1e, 0xc8, 0x86, 0xbd, 0x8f, + 0x4a, 0x86, 0x19, 0x18, 0x7a, 0x44, 0x52, 0xd9, + 0x5b, 0x9b, 0x00, 0x2e, 0x08, 0xad, 0xec, 0x5b, + 0xa9, 0xe8, 0x82, 0xd4, 0x49, 0x95, 0x36, 0x9a, + 0x1c, 0x8a, 0x2d, 0x59, 0x27, 0x84, 0x8b, 0x1b, + 0xe6, 0x6d, 0x28, 0x4c, 0x97, 0xcc, 0x28, 0xc0, + 0xc7, 0xc4, 0x78, 0x1a, 0x59, 0x19, 0xdb, 0x14, + 0x55, 0xb2, 0xe6, 0xec, 0xaa, 0xd2, 0xac, 0xac, + 0xd2, 0x30, 0xe0, 0x11, 0xae, 0xa3, 0xf3, 0xe7, + 0x4a, 0xab, 0x85, 0x8f, 0xf8, 0xaa, 0x29, 0xa4, + 0x42, 0xf1, 0x5f, 0x8c, 0x67, 0x5a, 0xd8, 0x85, + 0xd9, 0xc9, 0x18, 0x3a, 0x1b, 0xeb, 0x59, 0xa3, + 0x90, 0x32, 0x5f, 0xc6, 0x8e, 0x25, 0x6d, 0xbc, + 0xc1, 0x6e, 0xcd, 0xa1, 0xbf, 0x2a, 0x9f, 0x69, + 0xba, 0x8a, 0xe0, 0x64, 0xb7, 0x03, 0xe5, 0x4c, + 0x55, 0x45, 0xfb, 0x4c, 0xfc, 0x08, 0xf8, 0xd4, + 0xa7, 0x6e, 0x22, 0x66, 0x96, 0xf2, 0xa2, 0xb1, + 0x3f, 0xed, 0xb0, 0xac, 0x3e, 0x1d, 0xb0, 0xd6, + 0xc3, 0x7b, 0xf8, 0x87, 0xe3, 0xf2, 0xa0, 0x7a, + 0xfb, 0x02, 0x2b, 0x3f, 0x65, 0xa1, 0xde, 0xbe, + 0x5f, 0xeb, 0x4c, 0xc3, 0x31, 0x45, 0xe2, 0x7a, + 0x56, 0x0f, 0xe9, 0x3c, 0x3e, 0x76, 0x76, 0x98, + 0xa1, 0x19, 0x74, 0x16, 0xf1, 0xa1, 0x34, 0x30, + 0xa4, 0x4e, 0xf2, 0x70, 0x1e, 0x54, 0xcb, 0x23, + 0x6d, 0x19, 0x8d, 0xf8, 0x70, 0xad, 0xa4, 0x2c, + 0x02, 0x9e, 0x5d, 0x2a, 0x46, 0x56, 0xdf, 0x16, + 0xb7, 0xce, 0xb1, 0xaf, 0x2a, 0x99, 0xad, 0x97, + 0x5b, 0x76, 0x78, 0xf3, 0xa7, 0x8f, 0x10, 0x59, + 0xb9, 0xad, 0xf9, 0x8a, 0x58, 0x91, 0x1e, 0x38, + 0x38, 0xab, 0xb1, 0x39, 0x2f, 0xce, 0xf5, 0x10, + 0x0b, 0x0e, 0x59, 0xe4, 0x2c, 0x1f, 0xc7, 0xfd, + 0x47, 0xce, 0x82, 0xa9, 0x46, 0x90, 0xb5, 0xc8, + 0x4b, 0xe9, 0x4b, 0x87, 0x75, 0xbb, 0x81, 0x73, + 0x72, 0x7c, 0xed, 0x46, 0x28, 0x57, 0x22, 0xb1, + 0xb9, 0x3d, 0xff, 0x00, 0x3a, 0x75, 0xcc, 0x48, + 0x22, 0xd4, 0x06, 0x1f, 0x0d, 0x65, 0x1b, 0xb9, + 0x98, 0x65, 0xa5, 0x7c, 0x46, 0x3d, 0x62, 0x61, + 0xad, 0x94, 0x5e, 0xa2, 0x11, 0x61, 0xfd, 0x26, + 0xfa, 0x39, 0x56, 0x03, 0x2f, 0x8d, 0x8d, 0x6f, + 0xaa, 0xa8, 0xf3, 0xbf, 0xb0, 0xbd, 0xae, 0xac, + 0x2c, 0xd5, 0x89, 0xc1, 0x45, 0x1a, 0x8d, 0xba, + 0x85, 0xde, 0xef, 0x0e, 0x07, 0xef, 0xac, 0x3e, + 0x1a, 0x24, 0x23, 0x0d, 0xa4, 0x8e, 0x22, 0xbb, + 0x05, 0x7b, 0x5b, 0x5d, 0x7c, 0x28, 0x66, 0xd4, + 0xe6, 0xd4, 0xd6, 0xaf, 0x6f, 0x3a, 0x50, 0xa6, + 0xf7, 0x6e, 0x35, 0x76, 0x8b, 0x3a, 0xf3, 0x04, + 0xd0, 0xf4, 0x78, 0xd2, 0x04, 0x3a, 0xdd, 0x7d, + 0xea, 0x86, 0xc3, 0x7a, 0x35, 0xcb, 0x9d, 0x80, + 0x27, 0xe0, 0x69, 0x9e, 0x76, 0xcc, 0x6c, 0x08, + 0xdf, 0x1a, 0xd0, 0x68, 0x88, 0x11, 0x66, 0x1b, + 0xba, 0x1c, 0xbf, 0xee, 0xe3, 0x57, 0xb0, 0x3a, + 0xfb, 0xad, 0x7f, 0xbe, 0xb6, 0xf1, 0xf6, 0x4d, + 0x2e, 0x43, 0x6b, 0xdb, 0xe1, 0xf9, 0xd6, 0x8d, + 0xfa, 0xf0, 0xe9, 0x59, 0xf3, 0x66, 0x84, 0xee, + 0xba, 0x52, 0x4f, 0x0b, 0x66, 0x8d, 0xc5, 0xc1, + 0xab, 0xd4, 0xd9, 0xa4, 0xc2, 0x8c, 0x30, 0xb1, + 0x53, 0xae, 0x61, 0xe7, 0xcb, 0xef, 0x14, 0xcc, + 0xae, 0x25, 0x51, 0xef, 0x28, 0xd3, 0xf0, 0xfb, + 0xfe, 0xbb, 0x2d, 0x19, 0x93, 0x47, 0x4d, 0xd3, + 0xa5, 0xf4, 0xa9, 0x19, 0x4e, 0xaf, 0xc4, 0x9d, + 0x68, 0x28, 0xb9, 0xcf, 0xee, 0x5b, 0x9d, 0x18, + 0xf6, 0x81, 0x9e, 0xea, 0xea, 0x47, 0x23, 0xd2, + 0x86, 0x20, 0x4e, 0x91, 0xc6, 0x75, 0x0a, 0x41, + 0xdd, 0xf0, 0xa8, 0xf7, 0xf3, 0xbe, 0x6c, 0xdb, + 0xbc, 0x86, 0xb4, 0x01, 0x50, 0xd7, 0xe0, 0x2b, + 0x34, 0x20, 0xc9, 0x1b, 0x29, 0x65, 0x27, 0x41, + 0xc2, 0xb3, 0xc9, 0x74, 0x66, 0x5b, 0xa8, 0xb7, + 0x3a, 0x25, 0xa3, 0x49, 0x0f, 0xda, 0xe5, 0x4d, + 0x63, 0x60, 0x78, 0x88, 0xc5, 0x87, 0xdd, 0x57, + 0x92, 0x37, 0x58, 0x5f, 0xa8, 0xe7, 0x5b, 0x37, + 0xec, 0xf5, 0xf0, 0xab, 0xb5, 0xcd, 0x8e, 0x97, + 0x07, 0x7a, 0xa4, 0xcd, 0x1e, 0x53, 0x7b, 0xf6, + 0xaf, 0xa5, 0x3e, 0x57, 0x06, 0x21, 0x2e, 0x55, + 0x04, 0x70, 0xeb, 0x49, 0x88, 0xc4, 0x62, 0x8b, + 0xc5, 0x7b, 0x30, 0x4e, 0x5f, 0x0a, 0x8f, 0xd1, + 0x70, 0xbf, 0xf5, 0x09, 0xa1, 0x5d, 0xd7, 0x91, + 0xb2, 0x46, 0x2f, 0xe7, 0xa9, 0x3a, 0x74, 0x34, + 0x0e, 0x23, 0x64, 0x24, 0xee, 0xc3, 0x7b, 0x01, + 0xec, 0x0b, 0x5b, 0x75, 0xb8, 0xd6, 0xc1, 0x1d, + 0x82, 0xab, 0x5e, 0xf7, 0xb5, 0xfa, 0x69, 0x7a, + 0x52, 0xc7, 0x22, 0x4e, 0x6f, 0xd6, 0xcd, 0xcf, + 0xa9, 0xff, 0x00, 0x9a, 0xda, 0x71, 0x75, 0xe3, + 0x77, 0xbd, 0x64, 0x2d, 0x95, 0x1f, 0xee, 0x6e, + 0x46, 0xa4, 0x8e, 0x40, 0x58, 0xf3, 0xcc, 0x68, + 0xc6, 0x78, 0x72, 0xa6, 0x4c, 0x46, 0x61, 0x85, + 0xf7, 0xad, 0xd0, 0xf9, 0x56, 0x1b, 0x60, 0x76, + 0xa8, 0x7b, 0x61, 0xb5, 0xb7, 0xc2, 0xb2, 0xc7, + 0x1d, 0xd0, 0x8b, 0x10, 0x6c, 0xb9, 0xba, 0x70, + 0xa5, 0x7c, 0xa2, 0x10, 0xdc, 0x36, 0x68, 0x01, + 0xfe, 0x23, 0x4c, 0x0c, 0x8c, 0x63, 0x3c, 0x16, + 0x43, 0xaf, 0xce, 0x94, 0x32, 0xc8, 0x19, 0x4f, + 0x6d, 0x48, 0xd6, 0x84, 0x70, 0xdc, 0x39, 0x6b, + 0x8c, 0xa6, 0xe4, 0xd5, 0xce, 0x1f, 0x27, 0x34, + 0x69, 0x48, 0x50, 0x3c, 0x08, 0xe9, 0x51, 0x42, + 0xff, 0x00, 0x4a, 0x7a, 0x3c, 0x4b, 0xa9, 0x8f, + 0x0c, 0x2f, 0x73, 0xfe, 0xa3, 0xf8, 0x51, 0x6c, + 0x43, 0x6d, 0xba, 0xcb, 0x8b, 0x96, 0xff, 0x00, + 0xda, 0xa3, 0x93, 0x06, 0xca, 0xff, 0x00, 0x42, + 0xe2, 0xf4, 0x33, 0xa6, 0xf6, 0x46, 0x06, 0x9b, + 0x71, 0xb0, 0xe8, 0x4d, 0x90, 0xcb, 0xef, 0x9a, + 0x08, 0x5c, 0x07, 0x3c, 0x16, 0xfa, 0xfd, 0x76, + 0x5e, 0x74, 0xe3, 0x50, 0x47, 0x1f, 0xcd, 0xe9, + 0xf0, 0xe7, 0x40, 0x75, 0x4f, 0x3a, 0x12, 0xff, + 0x00, 0xeb, 0x94, 0x27, 0x5f, 0x87, 0xe3, 0x4c, + 0x9c, 0x11, 0xba, 0x1f, 0xc2, 0xad, 0xef, 0xc6, + 0x77, 0x88, 0xfb, 0xb8, 0x69, 0x42, 0x45, 0xb5, + 0xe8, 0x19, 0x8f, 0xd9, 0xdd, 0x36, 0xb1, 0xf1, + 0xfd, 0x01, 0x04, 0x9b, 0x35, 0x1d, 0x34, 0xa5, + 0x2b, 0x87, 0x92, 0x65, 0xfc, 0xf3, 0xe1, 0x40, + 0xb6, 0xc3, 0x0d, 0xff, 0x00, 0xd1, 0xbf, 0x0a, + 0x06, 0x5c, 0xf8, 0x8b, 0x7f, 0x98, 0x6c, 0x3e, + 0xea, 0x20, 0x4d, 0x04, 0x24, 0x7b, 0xb0, 0x8d, + 0x7e, 0xea, 0x3e, 0x8b, 0x87, 0x79, 0x4f, 0x7a, + 0x53, 0x61, 0x59, 0x16, 0x61, 0x86, 0x4f, 0xfc, + 0x2b, 0x6f, 0xbe, 0xb3, 0xcd, 0x2b, 0xcc, 0xdd, + 0x5d, 0xaf, 0x4d, 0x86, 0xc4, 0xdc, 0xe0, 0x67, + 0xed, 0xfd, 0x83, 0xde, 0x15, 0xeb, 0xa4, 0xda, + 0x47, 0x6c, 0xe8, 0xd7, 0xd1, 0xc7, 0x1d, 0x2b, + 0x0e, 0xf3, 0xb9, 0x32, 0x20, 0x66, 0xbb, 0x1e, + 0x26, 0xde, 0xc3, 0x35, 0xb7, 0x5a, 0x8b, 0x83, + 0xbe, 0x0d, 0xc5, 0xcf, 0x1f, 0xbe, 0xf4, 0x8e, + 0xd6, 0xc8, 0xe3, 0x67, 0x21, 0x3c, 0x8f, 0xba, + 0x7f, 0xe0, 0x72, 0xa2, 0x8f, 0x71, 0x2c, 0x5d, + 0xef, 0xee, 0x7f, 0xa5, 0x2b, 0x1b, 0xd9, 0x74, + 0x61, 0xe1, 0xf1, 0xe1, 0xcf, 0xe7, 0x5b, 0x0c, + 0x30, 0x69, 0xa6, 0x2c, 0x19, 0x04, 0x63, 0xb5, + 0x5e, 0xb5, 0x53, 0x0e, 0x09, 0xe1, 0x23, 0x6b, + 0x6f, 0x21, 0x5e, 0xb6, 0x59, 0x24, 0xfb, 0x23, + 0x76, 0xb3, 0xb6, 0xc2, 0x20, 0x3b, 0xfc, 0x6b, + 0x2a, 0x19, 0x31, 0x2f, 0xd5, 0x45, 0x85, 0x11, + 0x04, 0x51, 0xc0, 0x3f, 0x88, 0xd1, 0xdb, 0xe2, + 0xa4, 0x92, 0xfc, 0xaf, 0xa7, 0xcb, 0xeb, 0x27, + 0xd1, 0x1f, 0x48, 0xea, 0xb7, 0xfd, 0x5a, 0x52, + 0x6d, 0x94, 0xf7, 0x6f, 0xd0, 0xd6, 0xce, 0x18, + 0xa3, 0xc3, 0xc9, 0xcc, 0x69, 0x7f, 0x3a, 0xc8, + 0xec, 0x36, 0xe9, 0xc6, 0xc7, 0xb5, 0xe3, 0xf5, + 0xcf, 0x5a, 0x6e, 0xa3, 0x88, 0xea, 0x3e, 0x62, + 0xa5, 0x85, 0xbf, 0x63, 0x2e, 0x87, 0x5f, 0xc2, + 0x84, 0xbc, 0x66, 0x5d, 0x18, 0x03, 0x6b, 0x0f, + 0x2f, 0xeb, 0x44, 0x85, 0x25, 0x24, 0xd4, 0x5a, + 0xa0, 0xc4, 0x43, 0x6c, 0xf0, 0xb6, 0x65, 0xca, + 0x0d, 0xad, 0xcc, 0x13, 0x51, 0x63, 0xb0, 0x71, + 0xa4, 0xaa, 0x77, 0x64, 0x27, 0xdc, 0x3c, 0xb4, + 0xab, 0x1c, 0x41, 0x8d, 0x3b, 0xb1, 0x6e, 0xd6, + 0x67, 0x62, 0xcd, 0xd4, 0xfb, 0x23, 0x86, 0x94, + 0xff, 0x00, 0x89, 0x44, 0xba, 0x37, 0x39, 0x94, + 0x7f, 0x5a, 0x41, 0x24, 0x66, 0x06, 0x52, 0x48, + 0x75, 0xd0, 0x3f, 0xe7, 0x9d, 0x09, 0x13, 0xb4, + 0x3b, 0x4b, 0xd3, 0xeb, 0xde, 0xdb, 0xa6, 0xb6, + 0x68, 0xae, 0xd6, 0xde, 0x01, 0x5b, 0xdd, 0xa9, + 0x96, 0x22, 0x15, 0x2f, 0xbd, 0x94, 0x17, 0x66, + 0x1e, 0x3c, 0xaa, 0x48, 0xec, 0x56, 0x43, 0xda, + 0x5c, 0xba, 0xfc, 0x05, 0xb4, 0xa3, 0x13, 0xf1, + 0xe5, 0xa5, 0xf5, 0xa7, 0xc2, 0x62, 0x77, 0xb0, + 0x98, 0x9d, 0xc7, 0xd6, 0xf6, 0xbd, 0x49, 0x87, + 0x7d, 0x6d, 0xaa, 0xb7, 0x79, 0x79, 0x1f, 0x66, + 0x93, 0x42, 0xe6, 0x39, 0x50, 0xdd, 0x58, 0x72, + 0xa1, 0x8b, 0x11, 0xdf, 0x15, 0x0d, 0x84, 0xb1, + 0x5f, 0x45, 0x3d, 0xef, 0x2a, 0x8d, 0x82, 0xc5, + 0x71, 0xba, 0xe0, 0x71, 0xb7, 0x8d, 0x2c, 0xd1, + 0x1b, 0xa9, 0xfb, 0xbe, 0xb1, 0xea, 0x29, 0x27, + 0xd9, 0xac, 0xad, 0x09, 0xbe, 0x46, 0x1d, 0xa1, + 0xcc, 0x54, 0xa1, 0x00, 0xd9, 0x4e, 0xc3, 0x68, + 0xbd, 0x3b, 0xa7, 0xf1, 0xad, 0xe9, 0x01, 0x6b, + 0xf0, 0xe3, 0xad, 0x6d, 0x56, 0xf7, 0x1c, 0x7c, + 0x2b, 0xde, 0x36, 0xe3, 0xe1, 0x45, 0x78, 0xfd, + 0x23, 0x80, 0xf9, 0xba, 0x7d, 0x79, 0x82, 0xe1, + 0x9c, 0x34, 0x36, 0xcc, 0x85, 0x4e, 0x6d, 0x78, + 0x69, 0x45, 0x58, 0x59, 0x86, 0x84, 0x1f, 0xd1, + 0xb9, 0x85, 0x93, 0x91, 0x24, 0xaf, 0x01, 0xd7, + 0xca, 0x87, 0xa4, 0x62, 0x6e, 0x0b, 0x18, 0xad, + 0x1a, 0xb6, 0xec, 0x9d, 0xd3, 0xa1, 0x3d, 0x79, + 0x7f, 0x60, 0xf1, 0xba, 0xb9, 0x51, 0xbc, 0x05, + 0xec, 0xea, 0x79, 0x1b, 0xd4, 0x38, 0xc4, 0x7f, + 0xf0, 0xe9, 0x45, 0x98, 0x01, 0xaa, 0x9e, 0xe9, + 0xf2, 0xac, 0xf0, 0x48, 0xb3, 0x61, 0xdc, 0x5e, + 0xea, 0x74, 0x35, 0x71, 0xf5, 0x6d, 0x47, 0xa1, + 0xa9, 0x61, 0x41, 0x75, 0x93, 0x79, 0x40, 0xf3, + 0x14, 0x8f, 0x28, 0xd9, 0x22, 0x9b, 0x9c, 0xc6, + 0xc6, 0x98, 0x0d, 0x50, 0x92, 0x2c, 0xd5, 0x63, + 0xaa, 0x1d, 0x0f, 0x3a, 0x8b, 0x17, 0x18, 0xd5, + 0x7b, 0x6a, 0x0d, 0xee, 0xb4, 0x98, 0xcc, 0x35, + 0x8e, 0x0f, 0x15, 0xbe, 0xb9, 0x78, 0x29, 0xe6, + 0x29, 0x04, 0x8c, 0x52, 0x32, 0x77, 0x98, 0x0b, + 0xd8, 0x79, 0x56, 0x0e, 0x48, 0x71, 0x7b, 0x7c, + 0x26, 0x20, 0x64, 0xce, 0xce, 0x17, 0x7d, 0xbb, + 0x16, 0xd3, 0x85, 0x27, 0xd2, 0x18, 0x49, 0x4e, + 0x3f, 0x66, 0xc4, 0x62, 0x61, 0xc9, 0x90, 0xc7, + 0x6e, 0x23, 0xe1, 0x48, 0xd2, 0xe1, 0x60, 0x85, + 0x20, 0x6c, 0xb3, 0xc6, 0xbc, 0x4a, 0xb7, 0x66, + 0x40, 0x4e, 0xa7, 0x29, 0xe2, 0xb7, 0xac, 0x46, + 0x0d, 0x95, 0x31, 0x49, 0x29, 0x08, 0xab, 0x84, + 0xed, 0x8d, 0xe1, 0x7d, 0xe0, 0xa0, 0x1b, 0xd8, + 0x69, 0xad, 0x4a, 0xed, 0x1e, 0x1e, 0x28, 0xa0, + 0x41, 0x63, 0x89, 0xde, 0x95, 0x47, 0x33, 0xa6, + 0xba, 0x93, 0xcf, 0x4a, 0x9e, 0x79, 0x31, 0x5e, + 0x97, 0x89, 0x90, 0x6d, 0x43, 0xd8, 0x2a, 0x1e, + 0x06, 0xe6, 0xde, 0xeb, 0x6a, 0x01, 0xd3, 0x51, + 0x41, 0xfd, 0x19, 0x13, 0x10, 0x22, 0x20, 0x2a, + 0x36, 0x6c, 0xd9, 0xbd, 0xd6, 0xfe, 0x57, 0xd0, + 0xea, 0x3e, 0x1b, 0x48, 0x61, 0x62, 0xf6, 0x2a, + 0x65, 0x94, 0xd8, 0xbf, 0x89, 0xb7, 0xbd, 0xc3, + 0x5b, 0xf2, 0xbd, 0x3e, 0xc9, 0x31, 0x18, 0xad, + 0xa5, 0x83, 0xb7, 0x26, 0xb7, 0x0b, 0x9f, 0xc6, + 0x81, 0xc6, 0x62, 0xa3, 0x84, 0x7f, 0x97, 0x08, + 0xda, 0x37, 0xe1, 0x52, 0xc7, 0x06, 0x66, 0x59, + 0x75, 0x6d, 0xb3, 0xde, 0xff, 0x00, 0x0e, 0x15, + 0x89, 0x86, 0x68, 0xf3, 0xab, 0x5d, 0xe0, 0x8b, + 0x37, 0x61, 0xef, 0xc0, 0xdb, 0x97, 0x1f, 0x95, + 0x29, 0xc4, 0x61, 0x8a, 0x06, 0x17, 0x2d, 0xc0, + 0x7c, 0xbe, 0xb5, 0xc7, 0x11, 0x44, 0xc7, 0xa4, + 0xf1, 0xef, 0x27, 0x9f, 0x4a, 0x8a, 0x78, 0xe2, + 0xc8, 0x5e, 0xe3, 0x67, 0xd3, 0x9d, 0x15, 0x22, + 0xcb, 0x96, 0xe4, 0x0a, 0x3f, 0xe6, 0x0f, 0xcf, + 0x0b, 0x56, 0x56, 0x3a, 0xaf, 0x5e, 0x75, 0x3f, + 0xd0, 0x58, 0xa7, 0xdd, 0x6d, 0xe8, 0x19, 0xbd, + 0xc6, 0xad, 0x9e, 0x3f, 0x0c, 0xd3, 0x2c, 0x6d, + 0x96, 0x48, 0x83, 0xe4, 0x3f, 0x3a, 0xc3, 0xe1, + 0x95, 0x24, 0x58, 0xfb, 0x22, 0x2c, 0x99, 0x9a, + 0x0f, 0xb5, 0xad, 0x7d, 0x21, 0x8f, 0x8a, 0x7c, + 0x26, 0x29, 0x5c, 0xe6, 0x8b, 0xd1, 0x01, 0x61, + 0x1d, 0xce, 0xf1, 0xd7, 0xf2, 0x2a, 0x2c, 0x4a, + 0x00, 0xcc, 0x87, 0xb2, 0xdc, 0x18, 0x73, 0x15, + 0x18, 0xc3, 0x43, 0x14, 0xf1, 0xf2, 0xcb, 0x74, + 0x94, 0x29, 0xd4, 0x02, 0xc3, 0xde, 0x53, 0xd6, + 0xfc, 0x05, 0x46, 0xd1, 0x46, 0xa9, 0x22, 0x5f, + 0xd6, 0x32, 0xae, 0xa0, 0x8b, 0x11, 0x60, 0x06, + 0x9e, 0x1a, 0xd4, 0x6b, 0x0c, 0x13, 0x4f, 0x1a, + 0x0b, 0x27, 0x71, 0x47, 0x9f, 0x0a, 0xbe, 0x3b, + 0x1a, 0x91, 0x8e, 0x71, 0xe1, 0xc6, 0x76, 0xa5, + 0x26, 0x28, 0xcb, 0xf7, 0xf1, 0x6d, 0x98, 0xfc, + 0xb8, 0x55, 0xa0, 0x82, 0x47, 0x41, 0xa0, 0xda, + 0x7a, 0xa4, 0xf9, 0x7f, 0x6a, 0x2a, 0xf8, 0x83, + 0x02, 0x1e, 0x50, 0xfa, 0xb1, 0xf3, 0x3a, 0xd1, + 0x4d, 0x6c, 0xdd, 0xab, 0x1e, 0x3f, 0x13, 0x42, + 0x58, 0x61, 0x5d, 0xa1, 0xe2, 0xc7, 0x53, 0xf5, + 0xed, 0x47, 0xa1, 0xac, 0xf2, 0xbb, 0x47, 0x13, + 0x66, 0x65, 0xb7, 0x7b, 0xa7, 0xe7, 0xad, 0x6d, + 0xd6, 0x6f, 0x47, 0x1a, 0x6e, 0x91, 0xbd, 0xc3, + 0x5d, 0x4f, 0x23, 0x59, 0x10, 0x03, 0x03, 0xea, + 0xa6, 0xe7, 0x5a, 0x0d, 0x62, 0x01, 0xf8, 0x54, + 0x72, 0x44, 0x82, 0x1b, 0x2e, 0xd9, 0x0e, 0x6b, + 0x93, 0xbd, 0x6a, 0x8b, 0xe9, 0x78, 0x07, 0xaf, + 0x8c, 0x64, 0xc4, 0xaf, 0xf5, 0xfd, 0x04, 0x06, + 0x20, 0x1e, 0x22, 0x87, 0xa3, 0xe1, 0x5d, 0xd7, + 0xbe, 0x74, 0x5f, 0x99, 0xab, 0xe3, 0x71, 0xab, + 0xa7, 0x18, 0xf0, 0xc3, 0x31, 0xf9, 0xd7, 0xec, + 0x22, 0xcf, 0xdf, 0xc4, 0x9d, 0xa3, 0x7c, 0xb8, + 0x55, 0xa2, 0x89, 0xd9, 0x7d, 0xd6, 0x9b, 0x71, + 0x3e, 0x5f, 0xda, 0x97, 0x6b, 0x29, 0x89, 0x7b, + 0x91, 0x0c, 0x83, 0xe7, 0xc6, 0xb3, 0x71, 0x7b, + 0xde, 0xe3, 0x8f, 0xf1, 0x1d, 0x6b, 0x74, 0x05, + 0x3d, 0x79, 0xfc, 0xff, 0x00, 0x46, 0xea, 0x93, + 0x5b, 0xda, 0x27, 0xb0, 0xcc, 0x38, 0xad, 0x64, + 0x71, 0xc0, 0xe6, 0x1e, 0x75, 0x3b, 0x61, 0x67, + 0x45, 0xc4, 0x62, 0x7b, 0x4b, 0x27, 0x08, 0xfc, + 0x7b, 0x36, 0xbd, 0x37, 0xa5, 0x4c, 0x71, 0x4c, + 0x4f, 0x19, 0x4e, 0x6f, 0x97, 0x4a, 0xcc, 0xb6, + 0x65, 0x6d, 0xe0, 0x54, 0x00, 0x07, 0x9e, 0xbc, + 0x7c, 0x2a, 0x29, 0x9e, 0x17, 0x48, 0x02, 0x05, + 0xcc, 0xc3, 0xdd, 0xbd, 0x3e, 0x1e, 0x54, 0xfd, + 0x57, 0x15, 0xb9, 0x95, 0xbf, 0x95, 0x4a, 0xf2, + 0xe3, 0x98, 0xe1, 0xef, 0xba, 0x91, 0x2e, 0xf5, + 0xb9, 0x5c, 0xd6, 0x78, 0xe0, 0xc3, 0xa1, 0xe4, + 0xf8, 0x87, 0x0f, 0x23, 0x79, 0x0a, 0xf5, 0x70, + 0xbb, 0xf8, 0xce, 0x72, 0xaf, 0xcb, 0xfb, 0x55, + 0xa4, 0x95, 0x92, 0x3e, 0x5b, 0x3f, 0x56, 0xbf, + 0x33, 0xad, 0x67, 0x3f, 0xb4, 0xea, 0x9c, 0x4f, + 0xfb, 0x8e, 0xb5, 0xea, 0xd0, 0x21, 0xeb, 0xcf, + 0xe7, 0x5d, 0x6b, 0x44, 0x35, 0xbe, 0x6d, 0x5a, + 0x8c, 0xc6, 0xb7, 0x54, 0x0f, 0x62, 0x45, 0x30, + 0xe5, 0x51, 0xe2, 0x59, 0x33, 0x44, 0x4e, 0xf0, + 0xf1, 0xa4, 0x87, 0x68, 0x22, 0x65, 0x20, 0xdd, + 0x86, 0xf5, 0xaa, 0x38, 0x5a, 0x6f, 0xd5, 0x58, + 0x8d, 0xe3, 0xa9, 0x0d, 0x52, 0x13, 0x69, 0x24, + 0xcd, 0x94, 0x34, 0xba, 0xf2, 0xee, 0xf5, 0xa0, + 0x62, 0xcc, 0x26, 0x0c, 0x6e, 0xf6, 0xb6, 0x6a, + 0xcc, 0xcc, 0xef, 0x17, 0x24, 0x61, 0x90, 0x0a, + 0x0c, 0xcd, 0x67, 0x06, 0xf7, 0x8c, 0x58, 0xff, + 0x00, 0x17, 0x1a, 0xdc, 0x40, 0x1b, 0xbd, 0xc4, + 0xd6, 0x80, 0x93, 0x5d, 0x9b, 0x57, 0xac, 0x6a, + 0xd1, 0x2b, 0x41, 0x6f, 0x6b, 0x9c, 0x71, 0x14, + 0xf0, 0xbf, 0x06, 0xe7, 0xd0, 0xd7, 0xa5, 0xe8, + 0x11, 0x14, 0xc1, 0xe8, 0xa3, 0x89, 0xf8, 0x5f, + 0xae, 0xb4, 0xe7, 0x15, 0x10, 0x30, 0x91, 0x65, + 0x8a, 0x41, 0x91, 0x57, 0xc7, 0x4a, 0x66, 0x91, + 0x84, 0x85, 0xb5, 0xb5, 0xaf, 0xfc, 0xea, 0xea, + 0x9b, 0xdd, 0x6b, 0x44, 0x35, 0xbf, 0xbb, 0x5b, + 0xdb, 0xd5, 0xba, 0x80, 0x7e, 0xe2, 0x54, 0xf3, + 0xa6, 0x5a, 0xcc, 0xb1, 0x8c, 0xfd, 0xeb, 0x6b, + 0x5d, 0x9b, 0x79, 0xd7, 0xac, 0x6a, 0xec, 0xde, + 0xb4, 0x16, 0xfd, 0xd4, 0x17, 0x5b, 0x9a, 0xdd, + 0x41, 0xfb, 0x8f, 0xff, 0xc4, 0x00, 0x28, 0x10, + 0x01, 0x00, 0x02, 0x02, 0x01, 0x03, 0x03, 0x05, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, + 0x71, 0x81, 0x91, 0xa1, 0x10, 0x20, 0xb1, 0xc1, + 0xf0, 0xd1, 0x30, 0xe1, 0xf1, 0xff, 0xda, 0x00, + 0x08, 0x01, 0x01, 0x00, 0x01, 0x3f, 0x21, 0x3e, + 0xa6, 0xec, 0xfd, 0xcf, 0xa6, 0x40, 0x03, 0x96, + 0x3e, 0x20, 0x99, 0x04, 0x24, 0xbf, 0x67, 0x48, + 0xe0, 0x5c, 0x03, 0xd1, 0xe5, 0xa2, 0x15, 0xa5, + 0xe9, 0xda, 0x3e, 0xbb, 0xf4, 0xac, 0xb0, 0xfd, + 0x4f, 0x8c, 0x3b, 0x3e, 0xd9, 0x1e, 0xd4, 0xc2, + 0xea, 0xba, 0x5a, 0x5c, 0xb4, 0x8b, 0x6e, 0x5a, + 0xa0, 0x1b, 0x61, 0xeb, 0x18, 0x03, 0x0b, 0x6b, + 0x3d, 0x2f, 0x53, 0x65, 0x46, 0xc9, 0xf4, 0xc1, + 0xae, 0x7a, 0xc5, 0x2a, 0xf8, 0x50, 0x5b, 0x7c, + 0xf9, 0x96, 0xb4, 0x65, 0x28, 0xd9, 0xda, 0x74, + 0xaf, 0x92, 0x65, 0xde, 0x28, 0x22, 0xf7, 0x78, + 0x83, 0x37, 0x29, 0x6b, 0x46, 0xb6, 0x5e, 0xb5, + 0x0d, 0xc0, 0xca, 0x97, 0xca, 0x81, 0xa2, 0xd6, + 0xce, 0xcc, 0x56, 0x60, 0xdf, 0x6b, 0xc6, 0xca, + 0x4e, 0xcc, 0x65, 0x96, 0x19, 0x7b, 0x63, 0xd9, + 0x3c, 0x27, 0x87, 0xd0, 0x7d, 0x59, 0x44, 0x31, + 0xc7, 0x71, 0x93, 0xf1, 0x0a, 0x8b, 0xbd, 0x0f, + 0x71, 0x97, 0xc0, 0x49, 0x5d, 0xfa, 0x66, 0x9a, + 0xc3, 0xff, 0x00, 0xc9, 0x8d, 0xe5, 0x66, 0xb4, + 0x95, 0xd9, 0xc6, 0xcf, 0xfd, 0x82, 0x00, 0x17, + 0x62, 0xa9, 0x6b, 0x33, 0xb1, 0xf4, 0x94, 0x6e, + 0x40, 0x28, 0x3d, 0xf5, 0x07, 0x04, 0x0a, 0xa7, + 0x1d, 0xb9, 0xed, 0x98, 0xa8, 0xe8, 0xe2, 0x6c, + 0xd5, 0x62, 0x35, 0x57, 0x28, 0x70, 0x9d, 0xeb, + 0xa9, 0xfe, 0x42, 0xed, 0x03, 0xf1, 0x3c, 0xf2, + 0xf3, 0x06, 0x7e, 0xf7, 0x29, 0x6c, 0x38, 0x65, + 0x1c, 0x22, 0x15, 0x24, 0xae, 0x6b, 0x41, 0x7d, + 0xe7, 0x53, 0xb4, 0x51, 0xe6, 0x97, 0x7e, 0xa9, + 0x99, 0xe4, 0x70, 0xdd, 0x66, 0xa3, 0x1c, 0x44, + 0x38, 0x8a, 0x9e, 0x13, 0xc2, 0x78, 0x4f, 0x19, + 0xe3, 0x3c, 0x60, 0x28, 0x63, 0xe1, 0x2f, 0x33, + 0x1e, 0x87, 0x29, 0xec, 0x3a, 0xc1, 0x56, 0xf4, + 0xdc, 0xaa, 0x97, 0xb6, 0xfe, 0x53, 0x6d, 0x0a, + 0x6d, 0x47, 0x3d, 0x8f, 0x79, 0x5e, 0xdd, 0x88, + 0xd0, 0x72, 0x7f, 0xf6, 0x0e, 0x2d, 0x7d, 0x52, + 0x8b, 0x84, 0x71, 0x9f, 0x10, 0x08, 0x73, 0xf5, + 0x2a, 0x4c, 0x9e, 0x8f, 0x69, 0x5b, 0x55, 0xdf, + 0x5d, 0x18, 0x27, 0x8f, 0xf6, 0x1b, 0x43, 0xe2, + 0xa0, 0x01, 0x6c, 0x2b, 0xbf, 0xfe, 0xcd, 0x36, + 0xe3, 0x05, 0x85, 0x15, 0x4a, 0xad, 0x18, 0xc0, + 0xca, 0x4a, 0x16, 0x17, 0xe5, 0xe8, 0x77, 0xf7, + 0x83, 0x2f, 0xd2, 0x1b, 0x09, 0x92, 0x55, 0x65, + 0x65, 0x74, 0x23, 0x9c, 0x09, 0x80, 0x5a, 0xa5, + 0x71, 0x7b, 0x63, 0xa4, 0x09, 0xb3, 0x52, 0x1b, + 0xa5, 0x09, 0xd6, 0xca, 0xe6, 0xa2, 0x02, 0xaa, + 0xbe, 0xdb, 0x94, 0xcd, 0xe7, 0xb6, 0x18, 0x29, + 0x94, 0xa4, 0x2b, 0xe2, 0xad, 0x9d, 0xe5, 0x1f, + 0xa2, 0x1b, 0x2b, 0x8d, 0x78, 0xfb, 0x43, 0x0d, + 0x87, 0x4b, 0xb9, 0xdc, 0xef, 0x05, 0xa9, 0x78, + 0xcf, 0x59, 0x51, 0x5b, 0xb8, 0xf3, 0x80, 0xd8, + 0x7f, 0xc0, 0x8f, 0xc1, 0xa6, 0x97, 0x05, 0x51, + 0xce, 0x63, 0xab, 0x49, 0x77, 0xb7, 0x19, 0x4c, + 0xca, 0x92, 0xad, 0x79, 0x68, 0xe9, 0xfc, 0x1f, + 0x32, 0xcc, 0xc0, 0x17, 0xe9, 0x1b, 0xae, 0x71, + 0xf1, 0x29, 0x64, 0x26, 0x8b, 0x8b, 0x2a, 0xd1, + 0x3b, 0x93, 0x6d, 0xc6, 0x4f, 0x0a, 0xe9, 0x85, + 0x45, 0x17, 0xdc, 0xe3, 0xad, 0x67, 0xe6, 0x75, + 0xd4, 0x9b, 0x26, 0xb5, 0xae, 0x19, 0xaf, 0xba, + 0x1a, 0x5f, 0x26, 0x72, 0x35, 0xd7, 0xa4, 0x28, + 0x6b, 0xb8, 0x8e, 0x34, 0xd8, 0x5f, 0x3f, 0x33, + 0x14, 0xa3, 0xb6, 0x01, 0x66, 0xf5, 0x86, 0x59, + 0x0d, 0x59, 0x14, 0x19, 0xbf, 0x65, 0xf7, 0x8e, + 0x13, 0x65, 0xa8, 0x4c, 0xdb, 0xd3, 0xb6, 0x11, + 0x93, 0x21, 0x98, 0xbc, 0x82, 0xc7, 0xbf, 0x6f, + 0x31, 0x0f, 0xd6, 0xdf, 0x6a, 0x78, 0x73, 0xf2, + 0xf4, 0x82, 0x4e, 0x85, 0x97, 0xf4, 0xab, 0x85, + 0xf4, 0x4f, 0xd5, 0xe2, 0x88, 0xe8, 0x22, 0xb4, + 0x2d, 0x29, 0xf2, 0xd2, 0x9e, 0xa4, 0x1a, 0x50, + 0xc5, 0xaf, 0x28, 0xcb, 0x14, 0xaa, 0x7a, 0xed, + 0xeb, 0x2e, 0xb0, 0xca, 0x50, 0x27, 0x25, 0x86, + 0x15, 0xe3, 0x13, 0x34, 0x30, 0x27, 0x43, 0x8f, + 0x6d, 0xc4, 0x8c, 0x5c, 0xd3, 0xd5, 0x1d, 0x42, + 0xbc, 0x18, 0xe1, 0xfa, 0xb9, 0x84, 0x9b, 0x99, + 0x77, 0x5e, 0x8f, 0xdf, 0xa4, 0x0b, 0xa8, 0x09, + 0x7c, 0xfa, 0x6b, 0xfb, 0x99, 0x86, 0x31, 0xad, + 0x39, 0x6c, 0x71, 0x4f, 0xe7, 0xcc, 0xa2, 0xa2, + 0x91, 0x2b, 0xf5, 0x3c, 0xb9, 0x99, 0xd2, 0xb2, + 0x3a, 0x75, 0xaa, 0x77, 0xc5, 0xca, 0xda, 0xb6, + 0x38, 0xdd, 0x60, 0xc4, 0x06, 0xfd, 0x9d, 0x2f, + 0x15, 0x96, 0x2c, 0x2b, 0xbc, 0xc6, 0xba, 0x14, + 0xd8, 0x2f, 0xf7, 0x13, 0x6e, 0x9a, 0x2d, 0x17, + 0xbe, 0xfd, 0x63, 0xee, 0x61, 0xa2, 0xd3, 0xa7, + 0xaf, 0xbc, 0x76, 0xbd, 0x99, 0xfc, 0x71, 0x63, + 0x25, 0xf4, 0x67, 0xa3, 0x83, 0x77, 0xe3, 0xed, + 0x9a, 0xca, 0x8e, 0x18, 0x97, 0x5d, 0xd8, 0xba, + 0x8c, 0x6c, 0xe9, 0x69, 0xa2, 0xfb, 0x1c, 0xf0, + 0x36, 0xfa, 0x78, 0x9c, 0xc1, 0xc1, 0x88, 0x5e, + 0xf3, 0x9d, 0x4e, 0x01, 0xa4, 0x53, 0xdb, 0x67, + 0xea, 0x55, 0x99, 0xf6, 0x59, 0x1f, 0x99, 0xb1, + 0xcb, 0x70, 0xcf, 0x25, 0x2e, 0x01, 0x2f, 0xb4, + 0xc4, 0xcb, 0xa1, 0x6c, 0x68, 0xb5, 0xdd, 0x64, + 0xf2, 0x4c, 0xab, 0x0c, 0xb0, 0x06, 0x3a, 0x81, + 0x8d, 0x75, 0x59, 0x86, 0x1a, 0x6b, 0x38, 0x2d, + 0x39, 0xb3, 0x5a, 0xef, 0x13, 0xbd, 0x65, 0xe4, + 0xf1, 0xaf, 0x3a, 0x68, 0x3a, 0xbd, 0xe5, 0xe6, + 0x43, 0x31, 0xad, 0xe1, 0x5b, 0x2c, 0xbb, 0xbc, + 0x87, 0x1f, 0xde, 0x09, 0x9a, 0x0d, 0xc6, 0xb2, + 0x87, 0x7d, 0x6a, 0x9f, 0x67, 0x69, 0x77, 0x90, + 0x59, 0xbb, 0x7b, 0xbe, 0xf2, 0x90, 0xb2, 0x07, + 0x81, 0x3a, 0xf4, 0xbe, 0xf2, 0x8f, 0x74, 0x69, + 0xaa, 0x50, 0x75, 0xe2, 0x78, 0xcb, 0xe3, 0xf9, + 0x33, 0x37, 0xd3, 0xa2, 0x57, 0x9c, 0x35, 0x6f, + 0xd0, 0x72, 0xbd, 0x17, 0xd9, 0x64, 0x69, 0x04, + 0xf1, 0x11, 0x65, 0xe3, 0x13, 0x0d, 0x49, 0xc6, + 0xb3, 0xec, 0xc7, 0x66, 0x1a, 0x6f, 0x1d, 0x97, + 0x74, 0x6f, 0xac, 0x18, 0x57, 0x2b, 0x25, 0xd5, + 0xa4, 0xf3, 0x7f, 0x92, 0x62, 0x50, 0x08, 0xc8, + 0x67, 0xd5, 0xc7, 0xcc, 0x5a, 0x62, 0xa8, 0x5b, + 0xdf, 0xd7, 0x99, 0x86, 0x35, 0x29, 0x77, 0x43, + 0x3e, 0xb2, 0xc2, 0x84, 0xb0, 0xdb, 0xd3, 0x05, + 0xb7, 0xe4, 0xdb, 0x1c, 0xb5, 0x4a, 0xe0, 0xb6, + 0x6b, 0x55, 0xa9, 0xa0, 0x6d, 0xc0, 0x57, 0x27, + 0xe2, 0x9d, 0x53, 0xcd, 0x54, 0xa4, 0x20, 0xcd, + 0x54, 0x7d, 0x68, 0x60, 0x24, 0xb5, 0xc1, 0x22, + 0xf7, 0x5a, 0x96, 0xa0, 0x5e, 0xa0, 0x75, 0xb7, + 0xa4, 0x26, 0x88, 0xdc, 0x22, 0xae, 0x12, 0x3e, + 0x02, 0xc0, 0xcb, 0x39, 0xec, 0x24, 0x38, 0x1c, + 0x35, 0x51, 0x6d, 0x37, 0x2b, 0x78, 0xdc, 0xd9, + 0x58, 0x3d, 0xac, 0x7f, 0xc9, 0x94, 0xd6, 0x96, + 0x6d, 0xd1, 0x5f, 0xc4, 0x2e, 0xc4, 0xde, 0x5c, + 0x73, 0xea, 0x05, 0x10, 0xb5, 0x53, 0xc8, 0xe3, + 0x16, 0xef, 0xcd, 0x1e, 0x3e, 0xd4, 0x9a, 0xfa, + 0x0b, 0x36, 0x74, 0x25, 0xed, 0x80, 0x11, 0xa7, + 0x62, 0x99, 0x19, 0xda, 0x45, 0xee, 0xb5, 0xb7, + 0x37, 0xaa, 0xcb, 0xf4, 0x2f, 0xb2, 0x66, 0x4b, + 0x3a, 0x8f, 0xde, 0xfe, 0x2a, 0x58, 0x1d, 0xa6, + 0x6e, 0xab, 0x2f, 0xe0, 0x74, 0x7e, 0x62, 0xa0, + 0x57, 0x4a, 0xa9, 0xaa, 0xca, 0xb8, 0xf5, 0xe9, + 0x13, 0x0e, 0xd9, 0x3c, 0x9f, 0xdf, 0xb9, 0xa6, + 0x85, 0x9d, 0xba, 0x2c, 0xa2, 0x9e, 0x75, 0xc1, + 0x0f, 0x10, 0x4d, 0x74, 0x67, 0x8a, 0x59, 0x1e, + 0xbd, 0x4e, 0x67, 0x02, 0x35, 0x99, 0x68, 0xc1, + 0x2f, 0x4f, 0xdc, 0x1e, 0x64, 0xd8, 0x1a, 0xf8, + 0xb6, 0xcf, 0x4e, 0xf0, 0x39, 0xcb, 0x0c, 0x7f, + 0x2f, 0xa6, 0xe6, 0x1d, 0x30, 0xaa, 0x3e, 0x53, + 0x7d, 0xf3, 0x1c, 0x2d, 0xdd, 0x45, 0x55, 0x6b, + 0xb6, 0xbb, 0xc0, 0x9c, 0xe1, 0x04, 0x77, 0x80, + 0xdb, 0x78, 0x31, 0x03, 0xe2, 0x13, 0x76, 0x77, + 0x86, 0x34, 0x3e, 0x57, 0xc5, 0x47, 0x0f, 0x42, + 0x60, 0x85, 0xca, 0x59, 0x2a, 0xdc, 0x63, 0x35, + 0xbd, 0x78, 0x98, 0x72, 0x77, 0xc1, 0xab, 0x34, + 0x16, 0x07, 0xac, 0x1f, 0x93, 0x68, 0x2d, 0xe0, + 0xfb, 0xae, 0x02, 0x86, 0x96, 0x47, 0xbb, 0xc2, + 0xd5, 0xab, 0x3b, 0xe0, 0x63, 0xbf, 0x79, 0x9c, + 0x93, 0x61, 0x78, 0xb6, 0x1c, 0x27, 0xa5, 0xb5, + 0x14, 0x08, 0x5d, 0xb5, 0x80, 0x63, 0x74, 0x33, + 0x5e, 0x55, 0x1d, 0x84, 0xce, 0x38, 0xb3, 0x8d, + 0xb8, 0x6b, 0x17, 0xd2, 0x1f, 0xa8, 0x80, 0xc1, + 0xc7, 0x2a, 0xee, 0x6d, 0xcd, 0xcb, 0xd2, 0x0b, + 0x8b, 0xb1, 0x5f, 0x9f, 0x7e, 0xd1, 0x52, 0x81, + 0x12, 0x68, 0x15, 0x7d, 0x41, 0x75, 0x51, 0xff, + 0x00, 0x17, 0x18, 0x4f, 0x0a, 0xad, 0xf2, 0x99, + 0x8d, 0x2e, 0x39, 0x4c, 0x09, 0xe7, 0x18, 0x05, + 0x55, 0x25, 0x55, 0xfe, 0xbd, 0x66, 0x67, 0x9e, + 0x4b, 0xe2, 0x9f, 0x99, 0xb3, 0x73, 0x09, 0xfd, + 0xd2, 0x95, 0xc3, 0xfd, 0x4d, 0x44, 0xe2, 0x66, + 0x50, 0x2f, 0x75, 0xa7, 0xa5, 0x4e, 0xe8, 0x47, + 0x3f, 0x98, 0xda, 0x2d, 0x40, 0xdf, 0x07, 0x8b, + 0x9e, 0xd2, 0x81, 0x99, 0x71, 0xc7, 0x25, 0xe2, + 0x6e, 0x30, 0x17, 0x25, 0x37, 0xbb, 0xd6, 0x3e, + 0xd5, 0x97, 0x16, 0xc8, 0x4a, 0x7a, 0x89, 0x7a, + 0x0d, 0xa2, 0xf7, 0xdc, 0x97, 0x1a, 0x02, 0xfc, + 0x46, 0x3b, 0x44, 0xf7, 0x5f, 0x62, 0xba, 0x2b, + 0x80, 0xee, 0x84, 0xee, 0x8b, 0x22, 0xce, 0x35, + 0x56, 0x38, 0x21, 0xdf, 0xac, 0xd7, 0x7d, 0x75, + 0xa2, 0xce, 0x83, 0x9e, 0xc9, 0x65, 0x00, 0x99, + 0xae, 0x6d, 0xad, 0xff, 0x00, 0x31, 0xdd, 0x12, + 0xa1, 0xd2, 0x9d, 0xdf, 0x66, 0xa3, 0xd9, 0x53, + 0x54, 0x00, 0xef, 0xcb, 0x1b, 0x08, 0x4a, 0x2e, + 0x65, 0xd9, 0x6d, 0xf8, 0x88, 0x45, 0xab, 0x4b, + 0x4e, 0x6e, 0x77, 0x52, 0x6d, 0xc1, 0x70, 0xed, + 0xb1, 0xfb, 0x18, 0xfb, 0xaa, 0xe4, 0xef, 0x62, + 0x7d, 0xbf, 0xe1, 0xed, 0x2b, 0x44, 0x75, 0xd6, + 0x30, 0x59, 0xe4, 0xbe, 0x9c, 0xdc, 0xb8, 0x89, + 0x64, 0x08, 0x7a, 0x2b, 0x7f, 0x63, 0x16, 0x5c, + 0x13, 0xd6, 0x19, 0x25, 0x7a, 0x9d, 0x24, 0xbe, + 0xc1, 0x67, 0xbc, 0xaa, 0x51, 0x1b, 0x5c, 0x04, + 0xcd, 0xda, 0xfe, 0xb9, 0x9b, 0x6f, 0x34, 0xa1, + 0xb4, 0x67, 0xdd, 0x32, 0xbd, 0xa9, 0x07, 0xab, + 0x9c, 0x7a, 0xfe, 0xe0, 0x49, 0x49, 0x44, 0x4b, + 0x08, 0x5e, 0x29, 0xaf, 0x4e, 0xf1, 0x91, 0xa9, + 0x76, 0x75, 0x08, 0xeb, 0xaf, 0x3e, 0x60, 0xab, + 0xd7, 0x15, 0x3f, 0xd8, 0xed, 0x0b, 0x6b, 0x6f, + 0xfc, 0x46, 0x9b, 0x37, 0x00, 0x24, 0xa3, 0x65, + 0x7e, 0x48, 0x5b, 0xbd, 0xee, 0x6a, 0xb4, 0xca, + 0x8e, 0x87, 0x1d, 0x9c, 0x67, 0x71, 0x2e, 0x0a, + 0x82, 0x76, 0xff, 0x00, 0x1f, 0xb0, 0xea, 0x31, + 0x28, 0x8e, 0xa5, 0xc1, 0x85, 0xd2, 0x01, 0x60, + 0xbf, 0x0d, 0x6b, 0x5d, 0x61, 0x0b, 0x92, 0xe0, + 0xeb, 0xa5, 0xb6, 0xdc, 0x3d, 0x7c, 0x45, 0xdd, + 0x9d, 0xa2, 0x23, 0x84, 0x3b, 0x1c, 0xee, 0x23, + 0x00, 0xb6, 0x54, 0x07, 0x83, 0xd6, 0x12, 0x06, + 0x39, 0x4b, 0x74, 0xc9, 0x8f, 0xf3, 0x11, 0xc0, + 0xab, 0xe8, 0xd3, 0x47, 0xfc, 0xc7, 0xe0, 0x99, + 0xca, 0x86, 0x93, 0xd9, 0x18, 0x07, 0x6b, 0xfd, + 0x95, 0x32, 0xcf, 0x36, 0xf6, 0x0a, 0x63, 0x5a, + 0x4e, 0xd2, 0xa5, 0x07, 0xd5, 0x74, 0x7e, 0xa6, + 0x54, 0xa9, 0x6e, 0x0e, 0x78, 0xd0, 0x10, 0x33, + 0x45, 0x15, 0xec, 0x7e, 0x26, 0x66, 0x00, 0xdd, + 0xc7, 0x05, 0x67, 0xa5, 0x9a, 0xe2, 0x0f, 0x15, + 0x98, 0x65, 0xfb, 0x66, 0x02, 0x9a, 0xcb, 0xca, + 0x9d, 0xe8, 0x01, 0x3f, 0x7d, 0xa7, 0x2d, 0xa2, + 0x02, 0xed, 0xd7, 0xa1, 0x7f, 0xa6, 0x52, 0x91, + 0x51, 0xbb, 0xf2, 0x8e, 0xfd, 0x7d, 0x1e, 0xbf, + 0x76, 0xe0, 0x4e, 0xaa, 0x52, 0xc1, 0x4e, 0x37, + 0x90, 0x73, 0xae, 0xf1, 0x20, 0x32, 0x82, 0x91, + 0xe8, 0xfd, 0x2a, 0x14, 0x69, 0x04, 0xb3, 0x91, + 0xbf, 0x29, 0x9a, 0x70, 0x86, 0xa5, 0x29, 0x6a, + 0x59, 0x62, 0x9d, 0xd7, 0x98, 0x28, 0x0c, 0xc2, + 0x10, 0x29, 0x01, 0x3c, 0x25, 0x8c, 0xdb, 0x42, + 0x6a, 0xf4, 0x89, 0xd5, 0xff, 0x00, 0x8e, 0xa7, + 0x9d, 0x3f, 0x7f, 0x8a, 0x2d, 0xcf, 0xf9, 0xec, + 0x1b, 0xc1, 0x8c, 0x48, 0xc0, 0x40, 0x65, 0xa6, + 0x25, 0x23, 0x9c, 0x8a, 0x75, 0xe0, 0x1d, 0x71, + 0x1e, 0xa7, 0xcf, 0x78, 0xfa, 0x47, 0x7a, 0x2a, + 0xed, 0xbf, 0x89, 0x6e, 0x14, 0x6d, 0xce, 0xb5, + 0x61, 0xce, 0xfb, 0x4a, 0x8d, 0x7f, 0x83, 0x0e, + 0xbd, 0x2c, 0xfd, 0x45, 0x2a, 0x52, 0x03, 0xd4, + 0x6b, 0x01, 0x8b, 0xaa, 0x95, 0x6a, 0x56, 0xf7, + 0x1f, 0xda, 0x76, 0x7b, 0x41, 0x6e, 0x92, 0xd7, + 0x76, 0x5c, 0x8b, 0xf1, 0x2a, 0xdc, 0x06, 0xfb, + 0xb9, 0x45, 0x69, 0x4c, 0x6f, 0xbc, 0x10, 0x4d, + 0x9c, 0x5f, 0x1a, 0xed, 0xd8, 0x53, 0xc9, 0x2a, + 0x1b, 0x10, 0x74, 0x0a, 0x2e, 0xe8, 0x04, 0xac, + 0x6e, 0x16, 0x9d, 0xc8, 0x02, 0xca, 0x5c, 0x04, + 0x28, 0x0d, 0x62, 0x63, 0xba, 0xc2, 0xc4, 0x15, + 0x1b, 0x00, 0x5a, 0x55, 0x78, 0xcb, 0x13, 0x03, + 0x01, 0x05, 0x82, 0xe3, 0x45, 0x63, 0x8d, 0x09, + 0xc9, 0xa7, 0x99, 0x09, 0x07, 0xaa, 0x62, 0x9a, + 0x10, 0x17, 0x2d, 0xc5, 0x51, 0xa2, 0x80, 0x6f, + 0x06, 0x45, 0xa1, 0x6e, 0x70, 0x01, 0x9d, 0x7b, + 0xac, 0xf7, 0x8f, 0x0d, 0x77, 0x40, 0xc6, 0x8b, + 0x7d, 0x13, 0xd1, 0xf3, 0x14, 0x82, 0x37, 0x2a, + 0xe9, 0x06, 0x0f, 0xce, 0xa3, 0x97, 0xdc, 0x14, + 0xac, 0x2c, 0x34, 0x56, 0xab, 0xae, 0x85, 0xb1, + 0xc3, 0x90, 0x65, 0x6f, 0x14, 0xb3, 0xae, 0xec, + 0x4b, 0x95, 0x2a, 0x54, 0xa9, 0x6e, 0x5c, 0xf1, + 0x11, 0x51, 0x71, 0xc8, 0xfd, 0xa0, 0x95, 0x6a, + 0x17, 0x01, 0xfd, 0x16, 0x1f, 0x50, 0x42, 0x6c, + 0x3a, 0xff, 0x00, 0x7c, 0xb0, 0x3b, 0x59, 0x6f, + 0x7b, 0xf0, 0x28, 0x1f, 0xe4, 0x01, 0x28, 0x45, + 0xe6, 0x82, 0xf1, 0x89, 0x58, 0xce, 0x16, 0x43, + 0x8f, 0xee, 0x16, 0x38, 0x53, 0xac, 0xe7, 0xa0, + 0x61, 0xd7, 0x8d, 0xf2, 0x69, 0xab, 0x2c, 0xd5, + 0xd8, 0x8a, 0xcb, 0x24, 0x70, 0x11, 0xc9, 0xfa, + 0xae, 0x9d, 0xae, 0xf1, 0x89, 0x6c, 0x28, 0xa1, + 0x7c, 0x83, 0xb2, 0x59, 0x0d, 0x00, 0x17, 0x57, + 0x09, 0xc8, 0xe0, 0x58, 0xd9, 0x29, 0x19, 0x69, + 0x13, 0x98, 0x37, 0x34, 0x2b, 0x8e, 0x57, 0xfe, + 0x90, 0x70, 0x19, 0xc2, 0x1b, 0x41, 0x60, 0x5a, + 0xb0, 0xe0, 0x83, 0x3e, 0xe1, 0x3a, 0x3e, 0x63, + 0xe5, 0xda, 0x23, 0xf8, 0xfd, 0x53, 0x70, 0xea, + 0x2a, 0x3c, 0x52, 0xdf, 0x16, 0x8b, 0xba, 0xf5, + 0x95, 0x3d, 0x47, 0xe8, 0x10, 0x84, 0xdf, 0x1b, + 0x4b, 0xdc, 0xd8, 0xbf, 0x13, 0x8c, 0x3c, 0x5f, + 0x2b, 0x2b, 0xeb, 0x52, 0xbe, 0x86, 0xeb, 0x4c, + 0x4a, 0xe5, 0x64, 0x25, 0x31, 0xd2, 0x86, 0x0a, + 0x76, 0xf5, 0xfe, 0x54, 0x16, 0xf2, 0x96, 0x7e, + 0x74, 0x43, 0x81, 0xb0, 0x4a, 0xe2, 0x66, 0x89, + 0xed, 0x88, 0x37, 0x61, 0x5a, 0xb8, 0x38, 0xcc, + 0xa9, 0x18, 0x7d, 0xfe, 0xa4, 0xbd, 0x8b, 0xce, + 0x1c, 0x35, 0xa7, 0x1a, 0x84, 0x9a, 0x91, 0xf7, + 0x8c, 0x1f, 0xaf, 0x8a, 0xfa, 0x68, 0x18, 0x63, + 0x87, 0xcc, 0xbb, 0x3d, 0xe0, 0xfc, 0x41, 0x1e, + 0x19, 0xc8, 0xbd, 0x67, 0x82, 0x0b, 0x41, 0x1c, + 0x55, 0xf1, 0xfa, 0x25, 0xcb, 0xf3, 0x2a, 0xbe, + 0xe5, 0x2d, 0xf1, 0x07, 0x50, 0x3f, 0x03, 0xf3, + 0xb5, 0xe8, 0x12, 0xf8, 0x38, 0x8b, 0x7f, 0x51, + 0x40, 0x0f, 0x4c, 0x33, 0xee, 0x66, 0x65, 0x5e, + 0xd8, 0x85, 0x7a, 0x24, 0xb2, 0x8b, 0x38, 0x7e, + 0xca, 0x95, 0x2b, 0xe9, 0x7a, 0x5c, 0xd1, 0x35, + 0xca, 0xf0, 0x0e, 0x1e, 0x71, 0xda, 0x62, 0x06, + 0x40, 0x30, 0x55, 0x65, 0x85, 0x92, 0xaa, 0x82, + 0x36, 0x43, 0x19, 0xa0, 0xce, 0x6a, 0xf2, 0xa2, + 0x5c, 0xd4, 0xde, 0x1f, 0x8f, 0x2a, 0x7e, 0x52, + 0xec, 0x44, 0xd0, 0xbe, 0x81, 0x9d, 0xe7, 0x3a, + 0x98, 0xfc, 0x56, 0x4b, 0x3c, 0xbc, 0xeb, 0xda, + 0x01, 0x92, 0xbd, 0xf8, 0x79, 0xb7, 0x83, 0xda, + 0x08, 0xdb, 0xbd, 0xe9, 0x34, 0x7e, 0x23, 0x84, + 0x83, 0xa1, 0xbc, 0x72, 0x86, 0x5b, 0xe8, 0x9a, + 0x3e, 0x47, 0xa5, 0x4b, 0xe9, 0x75, 0xa6, 0xef, + 0x23, 0x62, 0xf8, 0x8a, 0x08, 0x4e, 0x39, 0xf7, + 0x33, 0x3a, 0xa2, 0x63, 0x7e, 0xf2, 0x55, 0x35, + 0xfa, 0x4a, 0x47, 0xc8, 0x43, 0xeb, 0xd1, 0x3f, + 0xe2, 0x08, 0xe9, 0xc4, 0x5a, 0x8a, 0x4d, 0x93, + 0x48, 0x4b, 0xb8, 0xfe, 0x67, 0xd2, 0x6c, 0x48, + 0xf6, 0x0c, 0x68, 0xbb, 0xd3, 0x5d, 0x78, 0xef, + 0x1c, 0xf2, 0x16, 0x15, 0xaf, 0x5d, 0x0a, 0xbf, + 0x7e, 0xf2, 0xad, 0x36, 0x6b, 0xb5, 0x0d, 0xb4, + 0xaa, 0xd5, 0x46, 0x43, 0x44, 0x51, 0x73, 0x61, + 0xfe, 0x40, 0x69, 0x19, 0xac, 0x6f, 0x75, 0x57, + 0x8d, 0x40, 0xa9, 0x41, 0x1d, 0xbd, 0xd4, 0x31, + 0x7c, 0xa1, 0x65, 0xf5, 0x66, 0x5a, 0xae, 0x65, + 0x36, 0x9e, 0xf0, 0x74, 0xd9, 0xd8, 0x95, 0xf4, + 0x2f, 0x56, 0x1d, 0x41, 0xe1, 0xf6, 0x2d, 0x46, + 0x2e, 0x5c, 0xbf, 0xb7, 0x1f, 0xcf, 0x10, 0x83, + 0x5f, 0x01, 0x99, 0x13, 0x5e, 0x22, 0xae, 0xd5, + 0x01, 0xdc, 0xcf, 0x13, 0xb8, 0xa8, 0xe8, 0x74, + 0xb0, 0xd9, 0xde, 0xff, 0x00, 0xd1, 0x5a, 0xab, + 0x61, 0x0f, 0x5f, 0x83, 0xae, 0x25, 0x5d, 0x89, + 0xbc, 0x2d, 0x99, 0x04, 0xbe, 0x65, 0x02, 0x81, + 0x28, 0x9c, 0x9d, 0xe1, 0x15, 0xe8, 0x12, 0xab, + 0xee, 0x69, 0x1f, 0xa3, 0x7f, 0x54, 0x80, 0x3f, + 0x53, 0xc9, 0x01, 0x52, 0x92, 0x62, 0xf1, 0x36, + 0x70, 0xe1, 0xf9, 0xa3, 0x37, 0x60, 0xf3, 0x01, + 0x87, 0xd0, 0x25, 0x7d, 0x15, 0xde, 0x0b, 0x43, + 0xe0, 0x7f, 0xc1, 0x07, 0xd6, 0x5f, 0xa1, 0xb8, + 0xb1, 0x52, 0xd1, 0x63, 0xc1, 0xfa, 0x55, 0xd0, + 0x86, 0x14, 0x3d, 0x20, 0x06, 0xbf, 0xe3, 0x71, + 0xe3, 0x44, 0x8b, 0x1b, 0xe8, 0x3f, 0xff, 0xda, + 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x10, 0x7f, 0xfe, 0xdf, 0xe3, + 0x76, 0x6c, 0x15, 0x75, 0x22, 0xdf, 0xf5, 0x91, + 0xb1, 0xfc, 0x1c, 0xb6, 0x1c, 0xd4, 0x00, 0x28, + 0xd7, 0xa9, 0xab, 0xc9, 0x89, 0xce, 0xed, 0x30, + 0x48, 0x18, 0x64, 0xc5, 0x01, 0xc4, 0xbb, 0x65, + 0xa3, 0xb3, 0x6c, 0x4e, 0x67, 0x7e, 0x32, 0x78, + 0x66, 0x9a, 0x4a, 0xdb, 0xd9, 0x97, 0x88, 0x9a, + 0xdd, 0x4f, 0x97, 0xec, 0x64, 0x1a, 0x29, 0x52, + 0x5e, 0x84, 0xe5, 0x6a, 0x12, 0xaa, 0x92, 0x48, + 0x66, 0x11, 0x19, 0x75, 0x99, 0xd1, 0x91, 0xc4, + 0xc9, 0x23, 0x92, 0x97, 0xc4, 0xe4, 0x6e, 0xa0, + 0x63, 0x37, 0x24, 0x90, 0x0f, 0x1b, 0x86, 0x17, + 0xba, 0x02, 0xa0, 0x38, 0x92, 0x49, 0x22, 0x23, + 0xfb, 0x5c, 0x8c, 0x49, 0x24, 0xee, 0x09, 0x20, + 0x18, 0x78, 0x23, 0xc2, 0x49, 0x24, 0x90, 0x16, + 0xa4, 0x12, 0x04, 0x6f, 0x26, 0x49, 0x24, 0x92, + 0x49, 0x33, 0x50, 0x00, 0x14, 0xa6, 0xdf, 0xa4, + 0x90, 0x40, 0x24, 0xc8, 0x39, 0x24, 0x47, 0x66, + 0xa5, 0x82, 0x09, 0x20, 0x07, 0x8f, 0xe4, 0x92, + 0x71, 0xbe, 0xd6, 0x41, 0x04, 0xcd, 0x7a, 0x3d, + 0x82, 0x40, 0x37, 0xa7, 0x6d, 0x25, 0xb1, 0x97, + 0x53, 0x60, 0x09, 0x04, 0xe8, 0xbf, 0xaf, 0x7b, + 0x70, 0x00, 0xb8, 0x02, 0x24, 0x92, 0xe7, 0xe7, + 0x23, 0x43, 0x88, 0xb2, 0x43, 0xf4, 0x92, 0x48, + 0x0b, 0x40, 0x47, 0x64, 0x92, 0x41, 0xe6, 0xda, + 0x6a, 0x27, 0xe0, 0x3f, 0xe4, 0x92, 0x40, 0x4c, + 0x7e, 0x35, 0xff, 0x00, 0x72, 0x59, 0x24, 0x92, + 0x49, 0x6b, 0x10, 0x3f, 0xff, 0xc4, 0x00, 0x28, + 0x11, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x03, + 0x05, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x11, 0x21, 0x31, 0x41, 0x51, + 0x61, 0x71, 0x81, 0x10, 0x91, 0xa1, 0x20, 0x30, + 0xb1, 0xc1, 0xd1, 0xf0, 0xe1, 0xf1, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x03, 0x01, 0x01, 0x3f, 0x10, + 0xfb, 0x37, 0x50, 0x6f, 0x49, 0x66, 0xb3, 0x16, + 0x9d, 0x82, 0xc0, 0x40, 0x1a, 0x14, 0x67, 0xc1, + 0x6c, 0x0f, 0x94, 0x16, 0x26, 0x89, 0x2f, 0xd1, + 0x97, 0xe9, 0x72, 0xe5, 0xcb, 0x97, 0xf4, 0x5b, + 0x2d, 0x2d, 0x83, 0x6d, 0x47, 0x0d, 0x31, 0x5a, + 0x0b, 0xda, 0x3f, 0x61, 0x18, 0x68, 0xb4, 0xcc, + 0xb5, 0x21, 0x2d, 0x54, 0x74, 0xa7, 0xde, 0x14, + 0xd4, 0x6a, 0xb1, 0x4e, 0xcc, 0x7c, 0x43, 0x10, + 0x0d, 0x5b, 0xbb, 0x2e, 0x17, 0xb4, 0x34, 0x8a, + 0x8c, 0x1a, 0xf2, 0xc7, 0x4a, 0xc9, 0xc9, 0x28, + 0xc5, 0x3f, 0xdd, 0x1f, 0x6f, 0x46, 0x27, 0xa5, + 0x7a, 0x54, 0xaf, 0x42, 0x5c, 0xb2, 0x05, 0x56, + 0x5d, 0xb3, 0xf8, 0x94, 0x9e, 0xf8, 0xaf, 0xcc, + 0x6d, 0x00, 0x1d, 0x6e, 0x25, 0x05, 0x91, 0xcf, + 0x13, 0x47, 0x42, 0x9e, 0x66, 0x0c, 0x00, 0x36, + 0x2b, 0x31, 0xb8, 0x16, 0x53, 0xd9, 0xfe, 0xff, + 0x00, 0x54, 0x77, 0x62, 0x64, 0xdc, 0x7e, 0x5b, + 0x45, 0xa5, 0x55, 0xbc, 0xb8, 0x14, 0x3a, 0xde, + 0x95, 0x4f, 0xcf, 0x1c, 0x40, 0xad, 0x1b, 0xbe, + 0xdb, 0x7e, 0x25, 0xbb, 0xba, 0xf5, 0x8b, 0x30, + 0x91, 0xf4, 0xd5, 0x2b, 0xd2, 0xa5, 0x4a, 0x81, + 0x16, 0x4a, 0x0b, 0x03, 0x7f, 0x31, 0xb9, 0xc6, + 0xd6, 0xda, 0xfb, 0x42, 0xef, 0xba, 0xe2, 0xe0, + 0xfc, 0x03, 0x0d, 0x45, 0x87, 0x4d, 0x71, 0x4b, + 0xe0, 0x84, 0x1b, 0xf8, 0x4f, 0xdc, 0x76, 0x1a, + 0x39, 0x18, 0xfc, 0x18, 0x96, 0xf0, 0x3b, 0x34, + 0xb9, 0xd3, 0x45, 0xb6, 0x60, 0x0a, 0xb9, 0x71, + 0x7e, 0x36, 0xe7, 0x2d, 0xc3, 0x74, 0x60, 0xbb, + 0x34, 0x6f, 0x6f, 0x10, 0xc1, 0x6c, 0xcb, 0xa1, + 0xb4, 0xd3, 0xac, 0xcb, 0x09, 0x41, 0x5b, 0x9d, + 0xa9, 0x81, 0x01, 0xcc, 0xa6, 0x7a, 0x83, 0x3d, + 0x0a, 0xb1, 0x39, 0xb8, 0xa5, 0xfe, 0xae, 0xe6, + 0xd2, 0xae, 0x23, 0xd2, 0xa8, 0xc5, 0x12, 0x89, + 0x44, 0xa2, 0x6e, 0x80, 0xf7, 0x37, 0x3c, 0xc6, + 0x9e, 0x7a, 0xa7, 0x52, 0x52, 0x11, 0xa3, 0xa4, + 0xdd, 0x5a, 0xf2, 0x9a, 0xf4, 0x89, 0x1a, 0xfa, + 0xcc, 0xc1, 0xa3, 0xaa, 0x59, 0x33, 0x4a, 0x1c, + 0xf4, 0xee, 0x4b, 0x8a, 0x46, 0xe8, 0x7e, 0x0a, + 0x7c, 0x46, 0x9f, 0x6c, 0x03, 0x3d, 0x5f, 0xf9, + 0xda, 0x5f, 0xc8, 0xef, 0xdd, 0xce, 0x7f, 0x90, + 0x1e, 0xe7, 0x3a, 0xa4, 0xcf, 0xb6, 0x93, 0x9c, + 0x91, 0x3b, 0x36, 0x69, 0xa6, 0x92, 0x9a, 0x5c, + 0xe8, 0xcc, 0x0d, 0x0e, 0x0d, 0x4f, 0x63, 0x5a, + 0xda, 0x18, 0x4b, 0x40, 0x56, 0x0b, 0xf3, 0x0b, + 0x13, 0x3b, 0x5d, 0xd7, 0x6e, 0x9d, 0x36, 0xf5, + 0x4b, 0x88, 0x8c, 0xe1, 0x2a, 0x54, 0x4b, 0x96, + 0x9c, 0x81, 0xdb, 0x73, 0xc6, 0xb3, 0x28, 0xfa, + 0x5d, 0xb9, 0x37, 0xad, 0xd8, 0x76, 0x8f, 0xf9, + 0xf3, 0x0c, 0xa2, 0x3c, 0xc5, 0xc2, 0xd4, 0xfc, + 0x92, 0xf4, 0xae, 0x9b, 0x6b, 0x96, 0x58, 0x86, + 0x0c, 0xad, 0xda, 0xf4, 0x65, 0x16, 0x56, 0xb5, + 0x6b, 0xd8, 0xc4, 0xb5, 0x11, 0x55, 0x96, 0x57, + 0x0e, 0xf1, 0x49, 0x90, 0x55, 0x16, 0xf5, 0x43, + 0x76, 0x3a, 0x2d, 0x2d, 0x53, 0xa5, 0x13, 0x18, + 0xa8, 0x65, 0x77, 0x62, 0x69, 0xd5, 0xcf, 0x66, + 0x5e, 0xa9, 0x63, 0xb6, 0x79, 0x4e, 0x6b, 0x7b, + 0x57, 0xee, 0x29, 0x76, 0x69, 0x30, 0xe5, 0xf4, + 0x24, 0xa9, 0x53, 0x75, 0x06, 0x94, 0xba, 0xf9, + 0xe9, 0xe6, 0x5a, 0x82, 0x78, 0xab, 0x4b, 0x59, + 0x57, 0x7a, 0x10, 0x9e, 0xd4, 0xa4, 0xc3, 0x5d, + 0x2b, 0x04, 0x24, 0x0a, 0x0d, 0x18, 0xa3, 0x12, + 0x9d, 0x81, 0x48, 0x84, 0xc3, 0x5c, 0xcb, 0xb5, + 0x52, 0xc2, 0xee, 0xd6, 0xc5, 0xcd, 0x78, 0x71, + 0x30, 0xe2, 0x54, 0x5a, 0x2b, 0xa9, 0xa2, 0x0b, + 0x02, 0x86, 0x9d, 0x5e, 0x0b, 0xf7, 0x40, 0x96, + 0x1e, 0xe0, 0x7e, 0x23, 0x25, 0xbb, 0x0e, 0x0f, + 0xfb, 0xff, 0x00, 0x2e, 0x0a, 0x03, 0x98, 0x03, + 0xb5, 0x30, 0x78, 0x89, 0x58, 0x66, 0x5d, 0x20, + 0x0f, 0xda, 0x5f, 0x5b, 0x7f, 0x4a, 0x4a, 0xa5, + 0x3a, 0x85, 0x66, 0xb6, 0xa6, 0xe6, 0xbe, 0xfa, + 0xf7, 0x83, 0x05, 0x54, 0xae, 0x99, 0xab, 0xf1, + 0x19, 0xe2, 0x8b, 0xcc, 0x38, 0x9b, 0xdc, 0xec, + 0x4a, 0x82, 0xd3, 0x21, 0xc7, 0x7e, 0x7c, 0x42, + 0x61, 0x96, 0x1b, 0xbf, 0xe4, 0x2e, 0xb1, 0xcc, + 0x75, 0xe1, 0x0e, 0xa7, 0x4f, 0x0e, 0xb1, 0x5a, + 0x83, 0xa2, 0xee, 0xba, 0x89, 0x82, 0xf8, 0xcb, + 0x71, 0xcd, 0x6a, 0xeb, 0x58, 0x86, 0x58, 0x5d, + 0x6e, 0xab, 0xf2, 0xc2, 0x91, 0x2f, 0x06, 0x62, + 0x11, 0xe3, 0xf1, 0x2e, 0xe5, 0xce, 0xbf, 0xaf, + 0x11, 0x58, 0xc2, 0x42, 0xc8, 0x0a, 0x04, 0xaa, + 0xd0, 0xd5, 0x3e, 0x9a, 0xf5, 0x19, 0x94, 0x96, + 0x4c, 0x6c, 0x80, 0x68, 0x3d, 0xf3, 0xf3, 0x1b, + 0x26, 0x39, 0xe4, 0xbd, 0xf5, 0x80, 0x80, 0xd3, + 0x82, 0xb1, 0xe2, 0x10, 0xff, 0x00, 0x01, 0x98, + 0x2b, 0x14, 0xc0, 0xa2, 0xed, 0x06, 0x81, 0xa5, + 0xb5, 0x78, 0xd7, 0xa2, 0x9e, 0x62, 0x8e, 0x0e, + 0x89, 0x42, 0xb7, 0xc9, 0x42, 0x70, 0xd5, 0xdc, + 0x28, 0xd3, 0x0d, 0x9b, 0x15, 0xae, 0xb4, 0x7f, + 0x36, 0x82, 0xc4, 0xac, 0xdd, 0x5a, 0xf8, 0x20, + 0x05, 0x6d, 0xda, 0x8f, 0xcb, 0xf9, 0x98, 0x58, + 0x7b, 0xf7, 0xdf, 0x48, 0x90, 0x90, 0x75, 0xe7, + 0xde, 0xf4, 0x84, 0xea, 0x47, 0x19, 0xbf, 0x3a, + 0x45, 0xad, 0x16, 0x6f, 0x44, 0x44, 0x11, 0x0a, + 0x7a, 0xbc, 0xf9, 0x89, 0x1d, 0x32, 0xf1, 0xf6, + 0x31, 0x50, 0x14, 0x17, 0x79, 0xee, 0x35, 0x3c, + 0x91, 0x57, 0xcc, 0x9b, 0x7f, 0x1d, 0x3d, 0xb7, + 0x8c, 0x99, 0x53, 0xa4, 0xe1, 0x34, 0x4b, 0xa5, + 0x56, 0x8e, 0xcc, 0xb8, 0x0d, 0x60, 0x60, 0x18, + 0xc1, 0xfe, 0xe6, 0x05, 0x65, 0xbc, 0xbf, 0xa8, + 0x6c, 0x1c, 0x2b, 0x30, 0x10, 0xdc, 0xbb, 0x7e, + 0x26, 0x30, 0xa3, 0xa4, 0x66, 0xda, 0xea, 0xc1, + 0xa9, 0x6f, 0x4d, 0x48, 0x48, 0x47, 0x5b, 0x1a, + 0x75, 0x8c, 0x20, 0x86, 0x86, 0xc7, 0x3e, 0xff, + 0x00, 0x61, 0x75, 0x60, 0x6e, 0x00, 0xdc, 0xa7, + 0xb3, 0x79, 0x3c, 0x31, 0x4c, 0x68, 0xe1, 0xef, + 0x31, 0x85, 0xde, 0x71, 0x9a, 0xe6, 0x14, 0x1d, + 0x30, 0xca, 0xa2, 0x55, 0xdf, 0x58, 0x29, 0xc4, + 0x55, 0x59, 0x37, 0xb6, 0x5f, 0x17, 0xc2, 0x2d, + 0x8b, 0x7f, 0x5b, 0xa1, 0xea, 0x84, 0x52, 0xb4, + 0x76, 0xbd, 0xd1, 0xe7, 0xde, 0x26, 0x2e, 0xcd, + 0x37, 0x6f, 0xf5, 0xaf, 0x21, 0x1a, 0x56, 0x67, + 0x61, 0xa7, 0x98, 0xcb, 0x88, 0x31, 0xdf, 0xfb, + 0x02, 0xa5, 0xa1, 0xa5, 0x6f, 0xde, 0xff, 0x00, + 0x51, 0xe1, 0xb9, 0x70, 0x7c, 0x1f, 0xed, 0xe5, + 0xae, 0x4b, 0xc4, 0xb1, 0x44, 0xd7, 0xed, 0x6b, + 0x2e, 0x4e, 0x77, 0x77, 0x9a, 0xc5, 0x5f, 0xbd, + 0x69, 0x9d, 0xe3, 0x1b, 0x6e, 0x6c, 0xec, 0xad, + 0x39, 0x2f, 0x69, 0x9a, 0x35, 0x01, 0xa2, 0x7f, + 0x7e, 0xba, 0xb7, 0xa4, 0xd2, 0x66, 0xb4, 0xd7, + 0x4c, 0x70, 0xe7, 0x95, 0xc0, 0xb5, 0x53, 0xbd, + 0x1a, 0x6f, 0x9b, 0x7b, 0x24, 0xb5, 0x7b, 0x53, + 0xbf, 0xcd, 0xcb, 0x2d, 0x89, 0x78, 0x9d, 0x4f, + 0xba, 0x60, 0x2b, 0xd8, 0x8b, 0xa7, 0xfd, 0xa4, + 0x27, 0x51, 0xad, 0xb4, 0x1e, 0x97, 0x9c, 0x56, + 0x47, 0xa8, 0x62, 0x0c, 0x19, 0x3e, 0x4e, 0x4e, + 0x8f, 0xd5, 0x69, 0x52, 0xe8, 0x31, 0xae, 0xf4, + 0x1a, 0x3f, 0xa7, 0x98, 0xa8, 0x91, 0x03, 0x4e, + 0x5e, 0x2c, 0xcd, 0x0e, 0x74, 0xad, 0x25, 0xd7, + 0x16, 0x38, 0xd6, 0x50, 0x11, 0xcb, 0x11, 0x30, + 0x27, 0xdc, 0x6f, 0x68, 0x9f, 0x26, 0x41, 0x5d, + 0x79, 0x4b, 0x75, 0x74, 0xe1, 0xde, 0x51, 0x99, + 0x2a, 0xf8, 0x3a, 0xf3, 0x9f, 0xec, 0x52, 0xa7, + 0x5f, 0xa7, 0x59, 0x61, 0x29, 0x88, 0xec, 0x87, + 0x93, 0x97, 0xbc, 0x44, 0xf7, 0x21, 0x18, 0xda, + 0x32, 0xa8, 0x6d, 0xb6, 0xf3, 0x4c, 0x7d, 0xab, + 0x26, 0xa4, 0x06, 0x8a, 0x7f, 0x07, 0x3f, 0xd8, + 0x5c, 0xed, 0xbd, 0x61, 0xf2, 0xe2, 0x65, 0xe0, + 0xba, 0x1b, 0xc7, 0x16, 0x63, 0xeb, 0x4d, 0x40, + 0xe3, 0x1e, 0xb8, 0x1e, 0xe7, 0x32, 0xc2, 0xb2, + 0x51, 0x7c, 0xd1, 0x51, 0x86, 0xe8, 0x8f, 0xc7, + 0xa4, 0x5d, 0x66, 0x0a, 0x7d, 0x77, 0x01, 0x28, + 0x46, 0x69, 0xe2, 0xf2, 0xa9, 0xf7, 0xff, 0x00, + 0x79, 0x60, 0xc2, 0x1c, 0x35, 0x7d, 0x8f, 0xec, + 0x39, 0xaa, 0x68, 0xb4, 0x6b, 0xd0, 0xfd, 0xcb, + 0x03, 0x4e, 0x2f, 0x1e, 0xda, 0x4a, 0xfa, 0x9d, + 0x25, 0xea, 0x27, 0x1e, 0x00, 0xee, 0x9b, 0x78, + 0x9f, 0x89, 0x8e, 0xd3, 0x0d, 0xb5, 0xe1, 0x2b, + 0x48, 0x6f, 0xb5, 0xe2, 0x62, 0xdd, 0xe2, 0xce, + 0x31, 0x57, 0xe2, 0xea, 0x22, 0xb7, 0xa5, 0xcb, + 0x1c, 0x10, 0x60, 0x22, 0xf5, 0xfb, 0x3e, 0x3f, + 0xb1, 0x56, 0x74, 0xd4, 0xdf, 0xe3, 0xf6, 0xcb, + 0x9a, 0xaf, 0x8d, 0x5f, 0x63, 0xf6, 0xc3, 0x7e, + 0x73, 0x47, 0xb1, 0x88, 0x4d, 0x80, 0xe0, 0xc1, + 0xed, 0x12, 0xad, 0x83, 0x74, 0x85, 0xd7, 0x4f, + 0xb1, 0x5a, 0xc8, 0xe0, 0xae, 0x3f, 0x03, 0x8b, + 0xf0, 0xc7, 0x1d, 0x09, 0x13, 0x3d, 0x75, 0x71, + 0x14, 0xab, 0x2f, 0x10, 0x41, 0x83, 0x6a, 0x6f, + 0xda, 0xb4, 0xeb, 0x05, 0x2a, 0xab, 0x1e, 0x06, + 0xea, 0x28, 0xd2, 0x2f, 0x43, 0xda, 0x5e, 0x1f, + 0xb4, 0x50, 0xbf, 0xf3, 0xfd, 0xe6, 0x16, 0x24, + 0x70, 0xd5, 0x7f, 0xce, 0xac, 0x49, 0x60, 0xec, + 0xaf, 0x63, 0x6e, 0xf3, 0x02, 0xa7, 0x03, 0x07, + 0xc4, 0x6f, 0x28, 0x8d, 0xa2, 0x3a, 0xb0, 0x26, + 0x00, 0xd3, 0xd7, 0x4f, 0xa9, 0x2c, 0x95, 0x42, + 0xf6, 0x8a, 0x8e, 0x8d, 0x9f, 0x1a, 0x41, 0x8c, + 0xc6, 0x03, 0x01, 0xdf, 0xfe, 0x11, 0xd6, 0x6a, + 0xd0, 0xc0, 0xff, 0x00, 0x0d, 0x3b, 0x4c, 0x12, + 0x50, 0xb2, 0x9e, 0x1a, 0x8a, 0x71, 0xae, 0x78, + 0x98, 0x0e, 0x86, 0xac, 0x7e, 0x1e, 0x25, 0x37, + 0x03, 0xb3, 0x6b, 0xf8, 0xfc, 0xca, 0x05, 0xce, + 0xfa, 0x3d, 0x8c, 0x4b, 0x16, 0x9c, 0x30, 0x0e, + 0xc4, 0xdd, 0x66, 0xc9, 0x29, 0xd5, 0xf4, 0x40, + 0x0f, 0xa2, 0xe2, 0xcb, 0x97, 0xf5, 0x5a, 0x5c, + 0x55, 0xb1, 0xa2, 0x72, 0x4b, 0x04, 0xd4, 0xa6, + 0x4a, 0x7a, 0xe2, 0x56, 0x08, 0x6d, 0xec, 0x1d, + 0xa1, 0xae, 0xb1, 0x77, 0x96, 0x85, 0xe6, 0xba, + 0x6d, 0x4d, 0x4c, 0x81, 0x38, 0x0d, 0x10, 0x7d, + 0xeb, 0x17, 0x78, 0x08, 0x16, 0x9f, 0x62, 0xe2, + 0xcb, 0x97, 0x2e, 0x5c, 0xbf, 0x54, 0x05, 0x33, + 0x4a, 0x98, 0x72, 0x14, 0x04, 0x32, 0xd9, 0xba, + 0xc0, 0x40, 0x0d, 0x3e, 0xc5, 0xc5, 0x45, 0xe6, + 0x5c, 0x52, 0x32, 0xe2, 0xc7, 0x30, 0x60, 0xb0, + 0x7d, 0x16, 0x5b, 0x02, 0xd0, 0xfb, 0x4c, 0x58, + 0xcb, 0xf4, 0xb6, 0x2d, 0xcf, 0xff, 0xc4, 0x00, + 0x27, 0x11, 0x01, 0x00, 0x02, 0x02, 0x01, 0x03, + 0x03, 0x04, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x11, 0x21, 0x31, 0x41, + 0x10, 0x51, 0x61, 0x20, 0x30, 0x71, 0x81, 0x91, + 0xa1, 0xf0, 0xb1, 0xc1, 0xe1, 0xd1, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x02, 0x01, 0x01, 0x3f, 0x10, + 0xf5, 0xa5, 0xc4, 0xae, 0x82, 0x19, 0x97, 0xcc, + 0x32, 0xcc, 0x85, 0x73, 0x57, 0x82, 0xe5, 0x91, + 0xc9, 0xb3, 0xa9, 0xd2, 0xba, 0x54, 0xa8, 0x47, + 0xd7, 0xd8, 0x44, 0x77, 0x07, 0x66, 0x07, 0x4d, + 0x46, 0x66, 0x71, 0x02, 0xc9, 0x11, 0xce, 0xce, + 0x36, 0x81, 0x2e, 0x26, 0xc6, 0xf9, 0x87, 0x50, + 0x5f, 0x6d, 0xcb, 0x6e, 0xa0, 0x1f, 0x40, 0xe9, + 0x7d, 0x2e, 0x5c, 0xb9, 0x7d, 0x2b, 0xa2, 0x86, + 0x59, 0xa3, 0x62, 0x94, 0x56, 0x20, 0x51, 0xde, + 0xbe, 0x61, 0xba, 0x66, 0x30, 0x45, 0xae, 0x6c, + 0xc4, 0xef, 0xb9, 0x8a, 0xec, 0x81, 0xcf, 0x12, + 0x94, 0xd5, 0xbc, 0x46, 0x20, 0xe3, 0x2c, 0xf0, + 0x7c, 0x74, 0x11, 0x48, 0x27, 0x4b, 0x97, 0x2e, + 0x5c, 0xb8, 0x4a, 0x26, 0xda, 0xcf, 0x1f, 0x48, + 0x69, 0x12, 0x7c, 0x63, 0xf9, 0x8e, 0x10, 0xb3, + 0x0a, 0xac, 0x6e, 0x52, 0xbc, 0xe5, 0xe2, 0x7c, + 0x25, 0x7f, 0x73, 0x0c, 0xb3, 0xb2, 0x63, 0x60, + 0x6a, 0x06, 0xd0, 0xcc, 0x8d, 0xc6, 0x97, 0xca, + 0x1d, 0x65, 0x0d, 0x90, 0x9d, 0xcf, 0xe6, 0x59, + 0x72, 0x6b, 0xcc, 0x6a, 0x1b, 0x74, 0xb6, 0x12, + 0x4d, 0xe5, 0xcb, 0x97, 0x2e, 0x12, 0x3e, 0x62, + 0x7c, 0x89, 0xe3, 0x86, 0x29, 0x2c, 0x22, 0xbc, + 0x9c, 0x44, 0x3b, 0x91, 0xa6, 0x59, 0x6c, 0x88, + 0xa0, 0x05, 0xd4, 0xdc, 0xd5, 0xfc, 0x4c, 0x75, + 0xfd, 0x90, 0xf1, 0x5a, 0xfe, 0xf1, 0x06, 0x9a, + 0xed, 0x2d, 0x16, 0x65, 0x4d, 0xb5, 0x00, 0xb7, + 0x12, 0x9f, 0x9d, 0xfe, 0xee, 0x0e, 0x06, 0x51, + 0x4c, 0x97, 0xe8, 0x14, 0x84, 0x5c, 0xb9, 0x7d, + 0x31, 0xdd, 0x38, 0x83, 0x50, 0x8a, 0x8e, 0x37, + 0x00, 0xd2, 0xae, 0xa1, 0x24, 0xea, 0x18, 0x8b, + 0x2a, 0x08, 0x8d, 0x90, 0x2f, 0x98, 0x40, 0x0a, + 0x5c, 0x22, 0x32, 0xbe, 0x31, 0x0c, 0x5f, 0x18, + 0xea, 0xe4, 0xe2, 0x53, 0x38, 0x71, 0x29, 0x1f, + 0x10, 0x8a, 0x4b, 0x32, 0x6f, 0xcc, 0x53, 0xc4, + 0x54, 0x2c, 0xdc, 0x6a, 0xd4, 0x1e, 0x1b, 0xf4, + 0x0c, 0xbe, 0x94, 0x44, 0xba, 0xfb, 0x8b, 0x69, + 0x1d, 0x7e, 0xf8, 0x86, 0x1c, 0x81, 0xae, 0x23, + 0xd9, 0x9c, 0xcb, 0x32, 0xcf, 0x80, 0x20, 0xab, + 0x0a, 0xe1, 0xad, 0x4a, 0x37, 0x04, 0xca, 0xc8, + 0x3c, 0xee, 0x24, 0x14, 0x07, 0x27, 0xee, 0x62, + 0x3f, 0xe7, 0xd0, 0x91, 0xc5, 0xa9, 0x4a, 0x98, + 0x86, 0x43, 0x39, 0x8a, 0x1b, 0x81, 0xab, 0xf8, + 0x97, 0xbe, 0xa5, 0x8c, 0x74, 0xc4, 0x0d, 0xfa, + 0x65, 0x92, 0xb7, 0x28, 0x4e, 0x52, 0x91, 0x2b, + 0x87, 0xeb, 0x35, 0x29, 0xef, 0xde, 0x12, 0xb7, + 0x37, 0x83, 0x50, 0x2c, 0x30, 0xdc, 0x44, 0x2c, + 0x70, 0xf7, 0x8e, 0xf9, 0x7c, 0xc4, 0xb9, 0x6b, + 0xc4, 0xaf, 0x88, 0x2e, 0x77, 0x8a, 0x2c, 0x65, + 0x0e, 0xc1, 0x8b, 0xa4, 0xbc, 0x17, 0x0a, 0x19, + 0x23, 0x50, 0xbe, 0x9b, 0xea, 0xab, 0x5b, 0x2e, + 0x8f, 0x26, 0x26, 0x25, 0xc2, 0x7c, 0x91, 0xcb, + 0x36, 0x7e, 0x61, 0xb7, 0x0b, 0x0c, 0x1f, 0xce, + 0x5c, 0xdd, 0x83, 0x9f, 0xf0, 0xe2, 0x28, 0xe4, + 0x0f, 0xb7, 0xfb, 0x2c, 0x2f, 0x5f, 0xbd, 0xe1, + 0xa9, 0x38, 0xf3, 0x2b, 0x96, 0x30, 0xeb, 0xb8, + 0x9e, 0xe2, 0x00, 0xda, 0xc0, 0x34, 0x8b, 0x6f, + 0x2b, 0xfd, 0x25, 0x23, 0xd2, 0xfb, 0x14, 0x46, + 0x2b, 0xe0, 0x61, 0x2b, 0xef, 0x98, 0x5d, 0x03, + 0x88, 0xa8, 0x3b, 0x85, 0xc3, 0x8d, 0xcc, 0xb0, + 0xc1, 0x0b, 0x32, 0x86, 0x20, 0x04, 0x94, 0x38, + 0x44, 0x36, 0xb8, 0x89, 0x92, 0xcc, 0x22, 0x84, + 0x24, 0x64, 0xf8, 0x80, 0xf0, 0x1b, 0xb3, 0x5c, + 0xc4, 0x62, 0x52, 0xe0, 0xf6, 0x04, 0xb5, 0x3d, + 0x3b, 0xa5, 0x4e, 0x4d, 0x7c, 0x43, 0xcf, 0x2f, + 0xbe, 0x11, 0x55, 0x76, 0x83, 0xa9, 0x92, 0xba, + 0x70, 0xf4, 0x24, 0x04, 0x00, 0xd1, 0xea, 0x29, + 0x72, 0x9b, 0xe8, 0x93, 0x80, 0x8f, 0xe7, 0xd7, + 0x53, 0x28, 0xa3, 0xc6, 0xff, 0x00, 0xec, 0x08, + 0xed, 0x27, 0xce, 0x18, 0x85, 0x6c, 0x59, 0x2c, + 0x0b, 0x55, 0x01, 0x69, 0x80, 0x21, 0x8d, 0x7b, + 0x57, 0x07, 0x87, 0xe6, 0xa0, 0xac, 0xbf, 0xb6, + 0x18, 0x39, 0x30, 0x36, 0x7a, 0xc0, 0x4c, 0xc3, + 0x1e, 0x95, 0xfd, 0x36, 0x44, 0xd4, 0xc0, 0x81, + 0xdf, 0x4c, 0x25, 0x93, 0x30, 0x20, 0xdf, 0xb8, + 0x42, 0x88, 0xf8, 0x61, 0xf0, 0x59, 0xb7, 0xbc, + 0x0f, 0xad, 0xf5, 0x50, 0xc3, 0x3b, 0x0f, 0x0e, + 0xe4, 0x2b, 0xb5, 0xb8, 0xfd, 0x30, 0x04, 0x6d, + 0x6c, 0x6b, 0xc0, 0xca, 0xaf, 0x6d, 0x04, 0xa7, + 0x53, 0x3e, 0x6f, 0x8c, 0x71, 0x19, 0xd3, 0x6a, + 0x0d, 0xeb, 0xd2, 0x35, 0x18, 0xc2, 0x4b, 0xe3, + 0x5c, 0x9f, 0x11, 0x0d, 0xb4, 0x01, 0x30, 0x69, + 0x64, 0x21, 0xe6, 0x2b, 0x2b, 0xdb, 0x41, 0x0e, + 0xa8, 0x58, 0x44, 0x24, 0x6f, 0xbd, 0x3d, 0x4b, + 0x35, 0x1f, 0xc8, 0x9f, 0x4e, 0xd3, 0x62, 0xaa, + 0x0e, 0x11, 0x8c, 0x31, 0x2a, 0xaa, 0x00, 0x47, + 0xd6, 0xb5, 0x12, 0x20, 0x16, 0xb3, 0x4d, 0x2c, + 0x44, 0xf9, 0xd7, 0xf3, 0x98, 0xb7, 0xe0, 0x47, + 0x6c, 0xcb, 0xbf, 0x3e, 0xc3, 0xb2, 0x29, 0x45, + 0x8e, 0x47, 0xfa, 0x81, 0x0d, 0x87, 0x47, 0x69, + 0xb5, 0x9a, 0x7a, 0x10, 0xb6, 0xbc, 0xd7, 0xc4, + 0x59, 0xf4, 0x12, 0x41, 0x77, 0x1c, 0xa2, 0x23, + 0x49, 0xfd, 0x4c, 0xf7, 0xdb, 0x99, 0x3b, 0x1e, + 0xef, 0x45, 0x08, 0x87, 0xd8, 0x48, 0xd4, 0x3d, + 0x36, 0xe4, 0x40, 0x09, 0xa9, 0xc6, 0x02, 0x09, + 0xcb, 0x11, 0xbc, 0xde, 0xdb, 0x82, 0x98, 0x88, + 0xa8, 0x45, 0xac, 0x01, 0x8c, 0xc4, 0x51, 0x2b, + 0xbc, 0x5a, 0xfe, 0x99, 0x35, 0xd6, 0x7c, 0xc0, + 0x02, 0x88, 0x80, 0x89, 0x8a, 0x62, 0xaf, 0xb3, + 0x75, 0x1d, 0x26, 0x32, 0xbe, 0x1f, 0xe6, 0x50, + 0x3b, 0xa3, 0x97, 0xe9, 0xda, 0x10, 0x06, 0x5e, + 0x79, 0x18, 0xe2, 0x36, 0xdb, 0x3e, 0x3e, 0x21, + 0x15, 0x93, 0xcf, 0xfb, 0x32, 0x0e, 0xa0, 0xc6, + 0x3a, 0xed, 0x32, 0x76, 0x3d, 0xd9, 0x82, 0x24, + 0x9e, 0x31, 0x6f, 0xa8, 0x21, 0x2b, 0xd5, 0x4b, + 0x50, 0x95, 0x19, 0xd9, 0x2d, 0x78, 0x7f, 0x93, + 0x35, 0x3c, 0x92, 0x88, 0x95, 0xf1, 0xd4, 0x5e, + 0xcc, 0xe5, 0x98, 0x54, 0x45, 0x62, 0x29, 0x96, + 0x7d, 0x61, 0x03, 0xad, 0x4a, 0xf4, 0x86, 0x98, + 0xf1, 0x71, 0x25, 0x56, 0xc4, 0x11, 0xec, 0x8b, + 0x62, 0xdf, 0xb4, 0x09, 0x50, 0x2e, 0x57, 0x4a, + 0x95, 0x28, 0x88, 0x44, 0xe8, 0x20, 0xa8, 0xa7, + 0xdb, 0x0e, 0xa1, 0x72, 0x90, 0x2a, 0x7f, 0xff, + 0xc4, 0x00, 0x25, 0x10, 0x01, 0x01, 0x00, 0x03, + 0x01, 0x00, 0x02, 0x02, 0x03, 0x01, 0x00, 0x03, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x21, + 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x10, 0x20, + 0x91, 0xa1, 0x30, 0xc1, 0xd1, 0xb1, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, 0x3f, 0x10, + 0xfa, 0xf2, 0xa9, 0xac, 0xa4, 0xd6, 0x71, 0xc7, + 0x2d, 0x67, 0xd3, 0x9f, 0x4e, 0x72, 0xd6, 0x44, + 0x35, 0x97, 0x76, 0xb1, 0x50, 0x0f, 0xca, 0xe1, + 0x75, 0x45, 0x04, 0x74, 0x62, 0x53, 0x54, 0x75, + 0x85, 0xf1, 0x83, 0x11, 0x1e, 0x6c, 0x7f, 0xd7, + 0x01, 0xe2, 0x0c, 0xa3, 0x30, 0x76, 0x1b, 0xf0, + 0x57, 0x0f, 0x5b, 0xa0, 0x1b, 0xd1, 0x13, 0x3f, + 0x0c, 0x74, 0xe6, 0x5f, 0xcc, 0x89, 0x9f, 0x56, + 0x6c, 0xe6, 0x53, 0x1a, 0xf3, 0x0a, 0xf2, 0xe0, + 0x79, 0x8d, 0x98, 0xa4, 0xca, 0x4d, 0x67, 0xd5, + 0x92, 0x9a, 0xfe, 0x14, 0xb3, 0x10, 0x34, 0x54, + 0x51, 0x4d, 0x52, 0x7e, 0x53, 0x00, 0x35, 0x17, + 0x06, 0xe5, 0x9e, 0x26, 0xc7, 0xf2, 0x74, 0x70, + 0x2d, 0xb4, 0x28, 0x05, 0xfd, 0xe2, 0x00, 0x8a, + 0x93, 0xdd, 0xbc, 0xad, 0x1b, 0xb1, 0xb2, 0xdd, + 0x60, 0x5c, 0x56, 0x3b, 0xaf, 0x61, 0x01, 0x78, + 0xdc, 0x33, 0x9d, 0xc4, 0x13, 0x20, 0x6d, 0x8a, + 0x15, 0xea, 0x39, 0xf8, 0x79, 0x17, 0x25, 0x24, + 0x31, 0x4b, 0x23, 0xb7, 0x50, 0x5e, 0x8c, 0x98, + 0xde, 0x10, 0x01, 0x33, 0x49, 0xad, 0xbb, 0x0a, + 0xc7, 0xe7, 0x2f, 0xbb, 0xbe, 0xb1, 0x4a, 0x02, + 0xab, 0xa2, 0xc4, 0x73, 0xc9, 0xc2, 0x18, 0x10, + 0xc4, 0x9d, 0x42, 0x05, 0x6c, 0xca, 0xc5, 0x8a, + 0x0b, 0x31, 0x88, 0x3b, 0x11, 0x11, 0x1f, 0x8c, + 0xaf, 0x99, 0x7c, 0xaf, 0x97, 0x3e, 0xac, 0x8b, + 0xfc, 0x03, 0x58, 0x23, 0x00, 0x0e, 0x67, 0xc4, + 0x63, 0x33, 0x4e, 0x5a, 0x6b, 0x08, 0x54, 0x81, + 0xd5, 0xe1, 0x8e, 0x0d, 0xf4, 0x07, 0xf8, 0x53, + 0x8a, 0x47, 0x20, 0x29, 0x47, 0xaa, 0x4f, 0xf3, + 0x0b, 0xc4, 0xa2, 0xca, 0xeb, 0xc2, 0x3d, 0x00, + 0xe8, 0x56, 0x09, 0xc7, 0x91, 0x16, 0x2a, 0x4a, + 0x9b, 0x3d, 0x7a, 0x4b, 0xc2, 0x8c, 0x4e, 0x96, + 0x90, 0xd2, 0x06, 0xa7, 0x25, 0xe6, 0xf5, 0xa4, + 0x82, 0xed, 0x2c, 0x09, 0x68, 0x6d, 0xa1, 0x91, + 0xa1, 0xc3, 0xc0, 0xaf, 0x97, 0x5c, 0x02, 0xcd, + 0xe2, 0x3f, 0x75, 0xb9, 0x20, 0x1a, 0x68, 0xc6, + 0x8d, 0x8c, 0x66, 0x27, 0x78, 0x41, 0xa0, 0xe9, + 0x92, 0x5b, 0x7b, 0x75, 0x5e, 0x64, 0x2c, 0xb0, + 0x8e, 0xb3, 0x8a, 0x48, 0x14, 0xf0, 0x4b, 0xbb, + 0x87, 0x32, 0x36, 0x85, 0x0c, 0x14, 0x52, 0x05, + 0xd8, 0xcf, 0x58, 0x26, 0x13, 0x38, 0x4d, 0x44, + 0x2f, 0x51, 0x5d, 0xec, 0x15, 0x32, 0x19, 0xc8, + 0xbb, 0x4b, 0x4a, 0x29, 0x7b, 0xbe, 0xf5, 0x26, + 0x0a, 0xef, 0xa9, 0xae, 0x1f, 0x4d, 0x5b, 0x37, + 0x9c, 0x2a, 0xfd, 0x63, 0x7d, 0x61, 0x9d, 0x98, + 0xe0, 0xe0, 0xd7, 0xf0, 0x8c, 0x8d, 0xb0, 0x85, + 0x2c, 0xb1, 0x45, 0x42, 0x4e, 0x9d, 0xd5, 0x3c, + 0xf9, 0xc0, 0x10, 0xc9, 0x28, 0x4a, 0x41, 0xaa, + 0x11, 0xa7, 0xc3, 0x1d, 0x30, 0x06, 0x53, 0x69, + 0x4a, 0x7e, 0x2c, 0xd1, 0xb9, 0x90, 0x4f, 0x14, + 0x48, 0x09, 0xd4, 0x13, 0x6e, 0x90, 0xe9, 0x9e, + 0x61, 0xd5, 0x64, 0xff, 0x00, 0x65, 0x23, 0x74, + 0x9f, 0x21, 0x6c, 0x93, 0x29, 0xda, 0xd4, 0x48, + 0x54, 0x80, 0x68, 0x15, 0x43, 0x66, 0xeb, 0x4e, + 0x59, 0xc6, 0xd1, 0x0b, 0x5d, 0x3e, 0x8f, 0xd8, + 0xf3, 0x17, 0x41, 0x78, 0xf0, 0x2a, 0x2a, 0x9b, + 0x21, 0x7c, 0x41, 0xcb, 0x86, 0xd9, 0x53, 0x38, + 0x52, 0x42, 0x8c, 0xa1, 0x2d, 0xa3, 0x4b, 0x26, + 0xca, 0xfc, 0x22, 0x2a, 0x2d, 0x28, 0x5f, 0x1a, + 0xe9, 0xf5, 0xde, 0xaa, 0x20, 0x38, 0x06, 0x8e, + 0x0f, 0xcb, 0x34, 0x35, 0x11, 0x10, 0x01, 0x1f, + 0xb4, 0xb2, 0x3d, 0x1f, 0xac, 0xdc, 0x72, 0xe9, + 0xa2, 0xd0, 0x2e, 0x82, 0x24, 0x0d, 0x7e, 0x1c, + 0xac, 0xaf, 0xc9, 0x14, 0x3a, 0x6e, 0xc1, 0x49, + 0x14, 0xf1, 0x7b, 0x23, 0xa9, 0x94, 0xa1, 0x15, + 0xee, 0x9e, 0x09, 0xb1, 0x49, 0x51, 0x7b, 0x90, + 0x4b, 0x80, 0xa2, 0x88, 0x36, 0x0c, 0xc0, 0xc2, + 0x95, 0x7d, 0x06, 0xec, 0x43, 0x44, 0x06, 0xbf, + 0x06, 0x84, 0x7c, 0xd3, 0x82, 0x70, 0xc2, 0xd6, + 0x7f, 0xcc, 0x75, 0x43, 0xfe, 0x63, 0x3d, 0xe9, + 0x89, 0xf8, 0x99, 0xf8, 0xe6, 0xbe, 0x64, 0x7c, + 0x66, 0xee, 0x95, 0xa9, 0xf1, 0x27, 0x81, 0x88, + 0xf8, 0x83, 0x8b, 0x52, 0xc8, 0x5e, 0x80, 0xd7, + 0x13, 0x85, 0x09, 0xb9, 0x80, 0xe1, 0xc7, 0xa1, + 0x34, 0xcd, 0xfc, 0xf5, 0xce, 0x83, 0xb9, 0xde, + 0xd4, 0x08, 0x70, 0x50, 0xf8, 0x70, 0xca, 0x69, + 0x13, 0xb8, 0xd4, 0x8e, 0x8c, 0x1d, 0xd3, 0xf2, + 0x62, 0x1b, 0xf0, 0x34, 0x83, 0x83, 0x68, 0x10, + 0x5d, 0x05, 0xf1, 0xdb, 0x23, 0xb6, 0x55, 0x59, + 0x9a, 0x7d, 0x0d, 0xfb, 0xb4, 0x93, 0x0b, 0x70, + 0xf6, 0xd9, 0x77, 0x75, 0x4c, 0x88, 0x94, 0x69, + 0xad, 0xeb, 0xb2, 0x4a, 0x0c, 0x9a, 0x1f, 0x81, + 0xdc, 0x1b, 0xf2, 0x61, 0xaf, 0x55, 0xd8, 0xae, + 0x9b, 0xea, 0x1b, 0xa1, 0x77, 0xad, 0xd6, 0x27, + 0xd2, 0x87, 0x74, 0x10, 0x08, 0x41, 0xa0, 0x57, + 0x68, 0x0b, 0xcc, 0x0a, 0xa4, 0x44, 0x0d, 0xd7, + 0x08, 0xeb, 0x56, 0x6e, 0x5e, 0x56, 0xed, 0xe9, + 0x44, 0xd1, 0x22, 0x08, 0x8d, 0x95, 0x11, 0x85, + 0xa2, 0x19, 0x4c, 0x0e, 0x88, 0xa8, 0xb3, 0xf0, + 0x0d, 0x29, 0x92, 0xb2, 0x42, 0xd7, 0xd6, 0xa5, + 0x2c, 0x1a, 0x04, 0x6f, 0x79, 0x3e, 0x54, 0xd4, + 0x0d, 0xa7, 0xb3, 0xe4, 0xfc, 0x32, 0x61, 0x00, + 0x4c, 0x83, 0x01, 0xb0, 0x65, 0x6a, 0x9b, 0xb1, + 0x1d, 0xa1, 0x6a, 0x9d, 0xe2, 0x9a, 0x36, 0x35, + 0x57, 0xd1, 0x8f, 0x6e, 0x2c, 0x92, 0x46, 0x25, + 0x28, 0xf3, 0xf8, 0x48, 0x89, 0x81, 0x70, 0xc8, + 0xd8, 0x64, 0x7c, 0xcf, 0xc7, 0x3f, 0x1c, 0x05, + 0x6a, 0x9a, 0xc4, 0x25, 0x78, 0x69, 0xa2, 0x20, + 0xd5, 0x80, 0xb2, 0xe8, 0x36, 0xe7, 0x40, 0xe8, + 0xeb, 0x2c, 0x16, 0x72, 0xba, 0x2c, 0xb8, 0x0a, + 0x50, 0xa4, 0xf5, 0x44, 0x37, 0x59, 0x40, 0x9d, + 0x1e, 0xe4, 0x9d, 0x62, 0x0f, 0x4a, 0xa7, 0x52, + 0x57, 0x07, 0xf3, 0x87, 0x00, 0x4d, 0xc6, 0x3e, + 0x01, 0x9a, 0xf0, 0x3e, 0x30, 0xd3, 0xb4, 0xa1, + 0x6d, 0x34, 0x3f, 0x6e, 0xb5, 0x05, 0x30, 0xe1, + 0xbf, 0x4a, 0xb5, 0xa7, 0x4a, 0xfd, 0x17, 0x22, + 0x92, 0xd1, 0x40, 0x5d, 0x13, 0xfe, 0x11, 0x16, + 0xdf, 0x0c, 0x14, 0x8a, 0xd8, 0x29, 0xb6, 0x14, + 0xef, 0xc3, 0x1e, 0x69, 0xce, 0xaf, 0x3a, 0x0d, + 0x1a, 0x11, 0x2c, 0xe0, 0x27, 0xbc, 0x92, 0x41, + 0x1a, 0x93, 0x11, 0x7b, 0x0a, 0x3e, 0xc8, 0xad, + 0xc1, 0x56, 0x7a, 0xf8, 0xb9, 0x11, 0xb4, 0x31, + 0xc6, 0x9d, 0x1d, 0x15, 0x53, 0xc6, 0x13, 0x50, + 0x63, 0x70, 0x7d, 0xa3, 0xbe, 0x60, 0xa8, 0x26, + 0xb8, 0x86, 0xa0, 0xdb, 0x15, 0x1a, 0x55, 0xaf, + 0x70, 0x24, 0xc8, 0x2c, 0xb0, 0x2e, 0xfc, 0xf1, + 0xfd, 0xbc, 0xc7, 0xa4, 0xf8, 0x62, 0xc4, 0x14, + 0x0f, 0x48, 0xd3, 0x39, 0x5c, 0x67, 0xc0, 0xe5, + 0x2a, 0x76, 0x21, 0x0d, 0xfe, 0x5d, 0xcb, 0xa1, + 0x48, 0x14, 0xb6, 0x08, 0x61, 0x25, 0x0b, 0xc7, + 0x0c, 0xac, 0x34, 0x8d, 0xf4, 0x3c, 0x07, 0xfd, + 0xfe, 0x50, 0x70, 0x1e, 0x19, 0xf1, 0xbf, 0xe7, + 0xf1, 0xae, 0x29, 0x7e, 0x31, 0x37, 0xc3, 0x55, + 0x02, 0x27, 0xf8, 0xe3, 0x1f, 0x28, 0x66, 0x08, + 0x0a, 0x94, 0x19, 0x05, 0xdd, 0xb9, 0x25, 0x64, + 0xd2, 0x48, 0xba, 0x04, 0x76, 0xb4, 0xcf, 0x66, + 0xd6, 0x52, 0xc0, 0x1a, 0x68, 0x4c, 0x20, 0xae, + 0xfa, 0xbe, 0xc7, 0x58, 0xe0, 0xc9, 0xd8, 0x88, + 0x9c, 0x66, 0xc1, 0x18, 0xea, 0x58, 0x5b, 0x83, + 0x68, 0x06, 0x05, 0x4d, 0x63, 0x3b, 0xaf, 0x39, + 0xf5, 0x9a, 0xe7, 0x72, 0xa2, 0x14, 0x54, 0x3c, + 0x7c, 0x4d, 0xe0, 0x01, 0x8c, 0x9f, 0x45, 0x3d, + 0x45, 0x53, 0xa8, 0xaa, 0xd7, 0x26, 0x69, 0x22, + 0x88, 0x22, 0x34, 0x81, 0x74, 0x88, 0xf7, 0x0b, + 0xa4, 0x62, 0xc6, 0x83, 0xbc, 0x84, 0x04, 0x7e, + 0x56, 0x0b, 0x87, 0x10, 0x40, 0x51, 0xb8, 0xc4, + 0xb4, 0x82, 0x51, 0x88, 0xf2, 0x63, 0x51, 0x35, + 0x56, 0xa2, 0xf6, 0xb7, 0x6f, 0xeb, 0x11, 0x50, + 0x16, 0xbd, 0x3d, 0x1c, 0x83, 0x18, 0x3c, 0x2d, + 0xd4, 0x0c, 0xa6, 0xd0, 0x42, 0x6a, 0x3a, 0x88, + 0x8e, 0x82, 0x6c, 0x2f, 0x19, 0x70, 0x83, 0x64, + 0x91, 0xca, 0x4a, 0x42, 0xe9, 0x3b, 0x0b, 0x87, + 0xde, 0xe7, 0xa7, 0x80, 0x80, 0x74, 0x79, 0x0a, + 0x4f, 0x4a, 0x2a, 0x96, 0xfd, 0x7d, 0xe2, 0x9e, + 0x4e, 0x27, 0x8d, 0xbc, 0xcf, 0x30, 0x95, 0xa9, + 0xf6, 0x1f, 0xaf, 0xff, 0x00, 0x32, 0x7d, 0xcb, + 0x2c, 0x0e, 0xb1, 0xa1, 0x85, 0x0b, 0x4a, 0x37, + 0x5d, 0x69, 0x80, 0x51, 0x68, 0xd8, 0x66, 0xf5, + 0x7d, 0xe9, 0x7f, 0x90, 0x19, 0x73, 0x8d, 0x11, + 0x67, 0xc6, 0x00, 0x64, 0xa7, 0xf2, 0xc2, 0xa1, + 0xbf, 0x49, 0x71, 0xb0, 0x9a, 0x5f, 0x47, 0xbf, + 0x59, 0x30, 0x6f, 0x68, 0x6d, 0x14, 0x1a, 0x02, + 0xe8, 0x55, 0xdc, 0x98, 0x40, 0x91, 0xaa, 0x6c, + 0x0e, 0x82, 0x76, 0x25, 0x87, 0xe0, 0xc1, 0xd5, + 0x26, 0xca, 0x2b, 0x4c, 0xd6, 0xcc, 0x68, 0x59, + 0xc0, 0x62, 0x10, 0x59, 0x98, 0x05, 0x52, 0xd4, + 0x74, 0x51, 0x42, 0xb3, 0x72, 0xfc, 0xfd, 0xc0, + 0x1a, 0xad, 0x84, 0xd3, 0x47, 0xdd, 0xe4, 0xc0, + 0xfd, 0x2d, 0x67, 0x58, 0x2c, 0x4d, 0x09, 0x10, + 0x3e, 0x5c, 0x44, 0x40, 0x2f, 0x43, 0x2d, 0xb2, + 0xd8, 0xae, 0x85, 0xe1, 0x71, 0xe4, 0x82, 0xcc, + 0x6f, 0x2f, 0xa4, 0x45, 0xb0, 0x45, 0x51, 0x4b, + 0x11, 0xf0, 0x7f, 0x03, 0xba, 0x01, 0x1e, 0x36, + 0x96, 0x60, 0x75, 0x33, 0x48, 0x20, 0x44, 0x07, + 0xc1, 0xd3, 0xcb, 0x91, 0x3c, 0x4d, 0x05, 0x29, + 0x06, 0xa1, 0xa5, 0x23, 0xa7, 0x73, 0x77, 0x02, + 0xa0, 0x4a, 0x50, 0xfb, 0x29, 0xaf, 0xbd, 0xf7, + 0x36, 0xe4, 0x72, 0x86, 0xf8, 0x22, 0x13, 0x77, + 0x19, 0xdd, 0xe3, 0x20, 0xa2, 0x1a, 0x1d, 0x31, + 0xa4, 0x77, 0xef, 0x9e, 0xe0, 0xa1, 0x10, 0xa6, + 0x8d, 0x23, 0xca, 0x04, 0x74, 0x20, 0xd5, 0xc2, + 0x17, 0xa0, 0xcf, 0xc8, 0x4b, 0x3e, 0x76, 0x13, + 0xc7, 0x00, 0x98, 0x81, 0x12, 0xeb, 0xb3, 0xd1, + 0x25, 0x1d, 0x2e, 0x3a, 0xf1, 0x22, 0x70, 0xda, + 0x75, 0x93, 0x70, 0xee, 0x71, 0x5f, 0xe8, 0x69, + 0x9c, 0x01, 0x8b, 0x49, 0x9b, 0x58, 0xef, 0x32, + 0x24, 0x4c, 0x02, 0xb1, 0x49, 0xbd, 0xd8, 0x01, + 0x5e, 0x86, 0x82, 0x73, 0x20, 0x6a, 0x68, 0x34, + 0x38, 0x12, 0x3b, 0x50, 0x81, 0x29, 0x39, 0x25, + 0x2a, 0xb2, 0x38, 0xe8, 0x46, 0xec, 0x0d, 0x35, + 0x93, 0xdc, 0x78, 0xf6, 0x06, 0x02, 0x1b, 0x0d, + 0x88, 0x2d, 0xa0, 0x07, 0x4e, 0x36, 0xb8, 0xd9, + 0x60, 0x90, 0x19, 0xa1, 0xdf, 0x80, 0x0c, 0x50, + 0x53, 0x5c, 0xde, 0x2f, 0xc6, 0xb0, 0xc9, 0xd1, + 0x00, 0xb0, 0x13, 0x00, 0x2d, 0x81, 0x49, 0xf2, + 0xd9, 0x11, 0x7d, 0x0d, 0xdb, 0x58, 0xce, 0x0a, + 0x40, 0x03, 0xb3, 0x69, 0xbc, 0x8b, 0xcc, 0x90, + 0x34, 0x0f, 0x94, 0x14, 0x56, 0x17, 0x48, 0xbb, + 0x9e, 0x2d, 0x00, 0xd4, 0x61, 0x47, 0xe1, 0xa4, + 0xef, 0x15, 0x1d, 0xd5, 0xe0, 0x0b, 0x55, 0x7d, + 0x61, 0xb8, 0x29, 0x8f, 0x20, 0x1d, 0x14, 0x41, + 0x4f, 0x04, 0x3b, 0x65, 0x53, 0x56, 0xaa, 0x50, + 0x85, 0xb5, 0xa3, 0x36, 0xd6, 0x1a, 0x38, 0xa7, + 0x09, 0x6c, 0x82, 0x10, 0x51, 0x14, 0x11, 0x8a, + 0x72, 0x6f, 0x35, 0x02, 0x7e, 0x03, 0x3f, 0x11, + 0xc0, 0xaa, 0x29, 0x00, 0x07, 0x6d, 0x63, 0x6b, + 0xc1, 0xc5, 0xdc, 0xdc, 0x9e, 0x33, 0xb1, 0x45, + 0x8e, 0xd0, 0x8d, 0xdd, 0xc6, 0xb1, 0xaa, 0x57, + 0x18, 0x12, 0x5b, 0xaf, 0xdb, 0xb5, 0x21, 0x41, + 0xa1, 0x36, 0xb4, 0xa8, 0x7d, 0x7f, 0x55, 0x98, + 0xce, 0x1d, 0x84, 0x2f, 0xcb, 0x89, 0x12, 0x0d, + 0xb1, 0x5d, 0x21, 0xda, 0x6e, 0xa4, 0x05, 0x4d, + 0x11, 0x18, 0x9c, 0xc8, 0x26, 0x00, 0x12, 0x86, + 0xc2, 0xe8, 0x2d, 0xe6, 0x0a, 0xfe, 0xc5, 0x44, + 0xa6, 0x93, 0xd8, 0x02, 0xa6, 0xac, 0x71, 0xf7, + 0x04, 0x68, 0x02, 0xa1, 0x5d, 0xd8, 0x0f, 0x85, + 0x7b, 0x8d, 0x94, 0xce, 0xd0, 0x02, 0x90, 0x1c, + 0x1b, 0x34, 0x6e, 0xae, 0x49, 0xa7, 0x50, 0x4e, + 0x0a, 0x2a, 0xa6, 0x97, 0x69, 0xcc, 0x95, 0xc9, + 0x36, 0xa6, 0xa1, 0x23, 0x4a, 0xd2, 0x87, 0x66, + 0x9d, 0x4c, 0x64, 0x85, 0xbe, 0x7c, 0x3f, 0x50, + 0xc2, 0x41, 0x68, 0x6c, 0x55, 0x5d, 0x05, 0xdf, + 0x59, 0x03, 0xe3, 0x01, 0x9d, 0x61, 0x7e, 0x23, + 0x48, 0xfc, 0xd7, 0xf7, 0x91, 0xce, 0xd0, 0x26, + 0xfc, 0xc6, 0x7f, 0xa0, 0xfa, 0x61, 0x84, 0xa7, + 0x9b, 0xfb, 0x66, 0xe7, 0xe9, 0x59, 0xaf, 0x28, + 0x68, 0x7f, 0x88, 0x15, 0xfb, 0xb9, 0x09, 0xf2, + 0x83, 0xb7, 0xc0, 0xa3, 0xfa, 0x87, 0xeb, 0x34, + 0xf5, 0x14, 0xc2, 0x7c, 0x7f, 0xa0, 0x4b, 0x3e, + 0x36, 0xe8, 0x2f, 0xe1, 0x4c, 0xc3, 0x01, 0xcb, + 0xfe, 0x7f, 0x82, 0xe9, 0xa7, 0x47, 0xa8, 0x61, + 0xd4, 0xf7, 0xce, 0x9a, 0x26, 0x9a, 0x56, 0x1c, + 0xe1, 0xdc, 0x04, 0x11, 0x18, 0xc9, 0x05, 0x74, + 0x27, 0x68, 0x83, 0xad, 0xb7, 0xfa, 0x8c, 0xf3, + 0x01, 0x06, 0x47, 0xe7, 0x2c, 0x18, 0x58, 0xf3, + 0x7d, 0x31, 0xcb, 0xe2, 0x60, 0xca, 0xf2, 0x81, + 0x29, 0x68, 0x1b, 0xa0, 0xe7, 0x86, 0x31, 0x05, + 0x21, 0x5a, 0xba, 0x80, 0x0b, 0xdc, 0x24, 0x45, + 0xf6, 0x7d, 0x8e, 0x91, 0x53, 0x62, 0x47, 0xb8, + 0x30, 0x8e, 0xe9, 0x4d, 0x62, 0x90, 0x30, 0x14, + 0x2b, 0xd1, 0x8e, 0xe7, 0x58, 0xea, 0x48, 0x81, + 0x41, 0xb6, 0x7f, 0xed, 0x81, 0x0c, 0x62, 0x80, + 0x48, 0x6f, 0x91, 0xb2, 0x80, 0x66, 0xb1, 0xe5, + 0xb4, 0x55, 0xe0, 0x00, 0x0f, 0x0e, 0x92, 0xfc, + 0x65, 0xf3, 0x23, 0x63, 0x87, 0xac, 0x5f, 0x93, + 0xe1, 0xe6, 0x3b, 0xf5, 0x31, 0x31, 0x60, 0x4e, + 0xc4, 0xd2, 0x1a, 0x67, 0x97, 0x28, 0xa7, 0x21, + 0xfb, 0xcd, 0x60, 0x7e, 0x23, 0xfb, 0xcd, 0x5a, + 0xa1, 0x1c, 0xfe, 0x34, 0x47, 0xeb, 0x00, 0x08, + 0x68, 0xfe, 0xa6, 0x3a, 0x47, 0xc5, 0x10, 0x04, + 0x4a, 0x21, 0xbd, 0x2c, 0xf6, 0x09, 0xf0, 0xf3, + 0x12, 0x9a, 0x55, 0x2e, 0xa1, 0x0d, 0x91, 0xb8, + 0x3a, 0x7c, 0x8c, 0xfd, 0x5d, 0x27, 0xda, 0x6b, + 0xd3, 0x4e, 0x0d, 0xfe, 0x5c, 0xc9, 0xe3, 0x2e, + 0x0b, 0xa8, 0xdc, 0x1a, 0xa2, 0x12, 0x1d, 0x95, + 0x1d, 0x01, 0xd8, 0x20, 0xeb, 0x82, 0x1b, 0xe1, + 0xa8, 0x4d, 0x0d, 0x8a, 0x30, 0x75, 0x06, 0xe5, + 0xc8, 0x01, 0x23, 0xef, 0x88, 0x11, 0x58, 0xd4, + 0x76, 0x9d, 0xc8, 0x51, 0x30, 0x40, 0x31, 0x68, + 0xd2, 0xe9, 0x15, 0xda, 0xce, 0x30, 0x49, 0x84, + 0x2a, 0x02, 0x6a, 0x68, 0x2a, 0xf1, 0x31, 0x6f, + 0x19, 0x49, 0x43, 0x50, 0xf0, 0x48, 0x85, 0x57, + 0x43, 0x4a, 0x07, 0x3a, 0xdf, 0xe2, 0x7f, 0xa9, + 0xff, 0x00, 0xb6, 0x68, 0xc9, 0x0b, 0xbf, 0xed, + 0xdf, 0xfe, 0x14, 0x24, 0x40, 0xd1, 0x3a, 0x61, + 0x98, 0x72, 0xe1, 0xcc, 0x2e, 0xa3, 0x04, 0xa0, + 0x34, 0x3b, 0x9b, 0x37, 0x2f, 0xc9, 0x75, 0x2f, + 0x48, 0x25, 0x34, 0x11, 0x30, 0x58, 0xd5, 0x2b, + 0x4f, 0x4f, 0x9e, 0x83, 0xff, 0x00, 0xcf, 0xe7, + 0xa7, 0x1f, 0x5f, 0xc0, 0x45, 0x54, 0x47, 0x22, + 0x42, 0xb6, 0x25, 0x1f, 0x91, 0xc0, 0xaf, 0x7b, + 0xc4, 0xaa, 0x87, 0x40, 0x4a, 0x8b, 0x75, 0x9d, + 0xc2, 0xf4, 0x1b, 0x26, 0x10, 0x21, 0x04, 0xf4, + 0x1a, 0x79, 0xbb, 0xfe, 0xb4, 0x58, 0x22, 0x0d, + 0x31, 0x9a, 0x4f, 0x84, 0xca, 0x12, 0xd7, 0xd2, + 0x01, 0x20, 0x41, 0x3b, 0xe2, 0x61, 0xac, 0xb6, + 0x4e, 0x46, 0xdd, 0x05, 0x76, 0x7d, 0x35, 0x26, + 0x42, 0xf0, 0x00, 0x9b, 0x4f, 0xa4, 0x9f, 0x1c, + 0x44, 0xf3, 0xff, 0x00, 0x1c, 0x71, 0x44, 0x40, + 0xf1, 0xff, 0x00, 0xe9, 0xc4, 0xa3, 0xa7, 0x12, + 0xff, 0x00, 0x87, 0x1b, 0x7a, 0xee, 0x97, 0xd8, + 0x68, 0xf1, 0xc6, 0x1e, 0x8d, 0x15, 0x5d, 0xb2, + 0x47, 0xd0, 0x21, 0xeb, 0xbe, 0x57, 0x79, 0xfc, + 0x82, 0xf1, 0x3f, 0x8e, 0xb0, 0x79, 0x8e, 0xd8, + 0x6d, 0x81, 0x76, 0x08, 0x7d, 0xc4, 0x52, 0x74, + 0x8a, 0xa5, 0xd1, 0x36, 0x94, 0x66, 0x91, 0x8b, + 0xf3, 0xec, 0xb5, 0x6e, 0x40, 0xa0, 0x28, 0x21, + 0xe0, 0x30, 0x75, 0x2d, 0xa2, 0x29, 0xa6, 0x6e, + 0x1f, 0x0a, 0xf9, 0x43, 0xb8, 0x04, 0x85, 0x8d, + 0x4b, 0x26, 0xcc, 0x13, 0x45, 0xd7, 0xec, 0x15, + 0xa1, 0x57, 0x11, 0x02, 0x09, 0xa5, 0xb2, 0x87, + 0xa3, 0xf7, 0x65, 0x05, 0x50, 0x86, 0xbf, 0x60, + 0x88, 0xfb, 0x13, 0xfb, 0x01, 0x4c, 0x16, 0x15, + 0x9e, 0x18, 0xb2, 0x11, 0x08, 0x8f, 0x02, 0xe6, + 0x90, 0x71, 0x45, 0x2b, 0xb9, 0xda, 0x61, 0x98, + 0x83, 0xb1, 0x12, 0x23, 0x86, 0xd0, 0x36, 0xac, + 0x0f, 0x97, 0x0c, 0x86, 0x00, 0x53, 0xe1, 0x27, + 0x82, 0xa4, 0x40, 0xee, 0x2a, 0xb1, 0x64, 0x1b, + 0xa7, 0x45, 0xd0, 0xa6, 0x0f, 0x78, 0xde, 0xbf, + 0x10, 0x7c, 0x33, 0x22, 0x51, 0x00, 0x66, 0x8c, + 0x49, 0x31, 0x78, 0x3c, 0x90, 0x5d, 0x2d, 0x1d, + 0x21, 0x81, 0x74, 0xab, 0xe8, 0x42, 0x13, 0x21, + 0x1f, 0x69, 0x50, 0xbb, 0xc1, 0x46, 0xf1, 0x38, + 0x32, 0xbf, 0xc1, 0xb7, 0x93, 0x00, 0xda, 0x11, + 0xb8, 0xe3, 0x16, 0xa0, 0x6b, 0x16, 0x54, 0x6b, + 0x54, 0x4a, 0x41, 0xb8, 0xda, 0xf2, 0x7b, 0xc1, + 0x46, 0x5d, 0xc2, 0x56, 0x0f, 0x55, 0x49, 0x78, + 0x72, 0x58, 0x40, 0x43, 0x00, 0x53, 0xdc, 0x01, + 0x57, 0x08, 0xc1, 0x13, 0x3b, 0x5d, 0x1e, 0xd3, + 0xb3, 0xa5, 0xda, 0x98, 0xc9, 0x97, 0x81, 0x3d, + 0xc9, 0x11, 0x05, 0x57, 0xe4, 0x6a, 0x14, 0x41, + 0xa6, 0xc0, 0x68, 0xf0, 0xdc, 0x35, 0xc2, 0x6d, + 0x95, 0x92, 0x8a, 0x94, 0x07, 0xb1, 0x0a, 0xec, + 0x59, 0x29, 0x96, 0xd9, 0x33, 0xda, 0xcf, 0x1d, + 0xe4, 0x0c, 0x0b, 0xa3, 0x40, 0x18, 0x73, 0x39, + 0x0d, 0x4a, 0xa3, 0x7c, 0xe0, 0x25, 0x4d, 0x83, + 0xb6, 0x84, 0x5d, 0xea, 0x22, 0x27, 0x28, 0xa8, + 0x61, 0x35, 0x74, 0xea, 0xda, 0x0d, 0xdc, 0x83, + 0xa7, 0x2a, 0xd0, 0x06, 0x32, 0x74, 0x97, 0x25, + 0xd3, 0x2a, 0x86, 0x28, 0xbb, 0x40, 0xaf, 0x4d, + 0xf0, 0x30, 0x07, 0x02, 0xfa, 0x46, 0x94, 0x0f, + 0x69, 0x6a, 0x95, 0x4b, 0x0c, 0x58, 0x86, 0x45, + 0x5b, 0x2e, 0x12, 0xa2, 0xbb, 0xd3, 0x20, 0xc6, + 0xeb, 0x35, 0xbd, 0xe0, 0xf6, 0xc5, 0x13, 0xe7, + 0x99, 0x7c, 0x44, 0xc7, 0xda, 0x92, 0x7e, 0x5a, + 0x3f, 0x38, 0x56, 0xe5, 0xb5, 0x61, 0x03, 0x9b, + 0x41, 0xa8, 0xb4, 0x5d, 0x18, 0xc8, 0xd6, 0x0b, + 0x8d, 0xcc, 0x1d, 0x94, 0x44, 0x89, 0x83, 0x1a, + 0x48, 0xf4, 0x6c, 0x98, 0xb0, 0x3e, 0x80, 0xde, + 0xe5, 0x18, 0xe9, 0x89, 0x79, 0x81, 0x1d, 0xe1, + 0x82, 0xb6, 0x9c, 0x4e, 0xcc, 0x3e, 0x4b, 0xb9, + 0x53, 0x6b, 0xe4, 0x89, 0x39, 0x67, 0xc6, 0x5f, + 0xf4, 0x98, 0x20, 0x25, 0x83, 0xb3, 0x3f, 0xcd, + 0x86, 0xf6, 0x10, 0x0f, 0x05, 0x62, 0x9e, 0xbb, + 0xeb, 0xb5, 0xf9, 0xd8, 0x9b, 0x04, 0x9a, 0x98, + 0xf4, 0x0b, 0x60, 0x76, 0xf6, 0x09, 0x70, 0x02, + 0x3d, 0x60, 0x37, 0xa0, 0x6a, 0x2a, 0xd7, 0xe0, + 0xe0, 0x63, 0x50, 0xb4, 0x8e, 0x88, 0x87, 0x64, + 0x5b, 0x1d, 0xef, 0x49, 0x8b, 0x6c, 0xf3, 0x24, + 0x66, 0x98, 0x0f, 0x49, 0xd3, 0x89, 0x6e, 0x0f, + 0xf6, 0x63, 0xae, 0x8a, 0xa9, 0xfd, 0x04, 0x02, + 0x20, 0x3c, 0x34, 0x8a, 0x73, 0x36, 0xb2, 0xe7, + 0x68, 0xb4, 0x44, 0x90, 0x2a, 0x2a, 0x68, 0x7f, + 0x29, 0x26, 0xcb, 0x48, 0x82, 0x05, 0x68, 0x88, + 0x5c, 0x01, 0xfd, 0xdc, 0x14, 0x91, 0x42, 0xa2, + 0x94, 0xd9, 0x48, 0x2a, 0x23, 0x16, 0x6d, 0x2e, + 0x0d, 0x76, 0x26, 0xb4, 0xb8, 0x95, 0x00, 0x21, + 0x57, 0x09, 0x14, 0x89, 0x3f, 0x0e, 0x9f, 0xcf, + 0xfa, 0x65, 0xc1, 0xda, 0x3a, 0x9e, 0xea, 0xbf, + 0xa1, 0x7c, 0xc4, 0xa7, 0x60, 0x34, 0x56, 0x5a, + 0x2d, 0x70, 0x1f, 0x9e, 0xe3, 0x08, 0xe2, 0x05, + 0x77, 0x6b, 0xc0, 0xcd, 0x59, 0xbc, 0x79, 0x82, + 0x94, 0x83, 0xd3, 0xfc, 0x29, 0xff, 0x00, 0x06, + 0x14, 0x18, 0x51, 0x9d, 0xfb, 0xb3, 0x80, 0x0d, + 0x62, 0x4c, 0x4b, 0x91, 0x91, 0x81, 0x30, 0xc7, + 0xa3, 0x11, 0xc1, 0x95, 0x52, 0xa6, 0x6e, 0x84, + 0xa9, 0xca, 0x55, 0x12, 0x08, 0xa4, 0x35, 0x46, + 0x8d, 0xa0, 0x0f, 0xfd, 0x52, 0x85, 0x02, 0x40, + 0x18, 0x48, 0x88, 0x23, 0x9e, 0xf1, 0x2a, 0x6f, + 0x7a, 0xa4, 0x02, 0x44, 0xfd, 0x3c, 0x00, 0x38, + 0x8d, 0x14, 0x0b, 0x4f, 0x93, 0x76, 0x61, 0x65, + 0xf1, 0xd6, 0x94, 0xaa, 0x80, 0xde, 0x09, 0xa1, + 0x43, 0x2e, 0x83, 0x9b, 0x20, 0x5f, 0xac, 0xd2, + 0x5e, 0xa7, 0x75, 0xfc, 0x4c, 0x07, 0x5b, 0x23, + 0xc8, 0xe3, 0xfb, 0xc7, 0xb6, 0x32, 0x1c, 0xcf, + 0x95, 0xa3, 0xfb, 0xc0, 0xc6, 0xca, 0x2b, 0xfa, + 0x21, 0xfe, 0x6e, 0x4f, 0xef, 0x3f, 0x49, 0x95, + 0x40, 0xfd, 0x6f, 0xf3, 0x9a, 0xef, 0x1c, 0x78, + 0x69, 0xd0, 0x86, 0xcd, 0xb6, 0x43, 0x7b, 0xc2, + 0x77, 0xdb, 0x25, 0xbe, 0x55, 0xab, 0x7a, 0xf2, + 0x77, 0x98, 0xd0, 0x1a, 0x93, 0x47, 0x85, 0x21, + 0x6b, 0x9a, 0xee, 0xa3, 0x80, 0x95, 0x6f, 0x72, + 0xbf, 0x2a, 0x35, 0xfb, 0xc5, 0x52, 0x54, 0x76, + 0xad, 0x5c, 0x02, 0x81, 0xf8, 0xc5, 0x3f, 0xeb, + 0x6c, 0x30, 0x6e, 0x25, 0xfe, 0xa0, 0x2e, 0xe5, + 0xc1, 0xb4, 0xcb, 0x85, 0x85, 0xd4, 0x5a, 0x10, + 0x28, 0x76, 0x84, 0x44, 0x5b, 0x8a, 0xb4, 0x25, + 0x36, 0xd6, 0x95, 0x1a, 0x81, 0x1a, 0xab, 0x4d, + 0x42, 0x25, 0x41, 0x87, 0x41, 0x00, 0x19, 0x29, + 0xa8, 0x42, 0x1f, 0xf7, 0xb5, 0xae, 0x94, 0x28, + 0x91, 0x58, 0x37, 0xbd, 0x3d, 0x55, 0xea, 0x5d, + 0x53, 0x73, 0x66, 0x74, 0xaa, 0xfc, 0xe6, 0xf9, + 0x15, 0x64, 0xda, 0x09, 0x01, 0x0a, 0xdc, 0x36, + 0xf2, 0x0e, 0x5d, 0x9a, 0xa9, 0xaf, 0x9b, 0x2c, + 0x4f, 0x57, 0xb7, 0x07, 0xaf, 0x29, 0x10, 0xf5, + 0x28, 0xfd, 0x46, 0xbd, 0xb8, 0xaf, 0xe8, 0x00, + 0x79, 0x77, 0x83, 0xef, 0x57, 0x3e, 0x7d, 0xc4, + 0x2d, 0x6c, 0xc5, 0x77, 0x40, 0x4b, 0xba, 0x35, + 0xae, 0xf3, 0x03, 0x9b, 0x49, 0xa8, 0xd8, 0xba, + 0x86, 0xba, 0x01, 0x88, 0x04, 0x2c, 0x55, 0x7d, + 0x54, 0x7f, 0xea, 0x60, 0x93, 0x12, 0xda, 0xed, + 0x5c, 0x30, 0x38, 0x7d, 0x10, 0xc5, 0xc4, 0x4e, + 0x8e, 0xe1, 0x70, 0xae, 0xb8, 0x2a, 0x08, 0xf8, + 0x18, 0x01, 0xc2, 0x62, 0xcc, 0x19, 0x83, 0x7f, + 0xa8, 0xd2, 0x26, 0xa1, 0xca, 0xd6, 0xb2, 0xf9, + 0x31, 0xb4, 0x81, 0x10, 0xc0, 0xda, 0x5d, 0x54, + 0x82, 0xea, 0xaf, 0x33, 0x55, 0x3b, 0x79, 0xd4, + 0x82, 0xab, 0xa5, 0xd2, 0x35, 0xa6, 0x0c, 0x8e, + 0xe1, 0x4a, 0x80, 0x85, 0x56, 0x80, 0xed, 0x6b, + 0xa1, 0x3f, 0x03, 0x22, 0x03, 0x8a, 0x1c, 0x82, + 0xd2, 0x17, 0x41, 0x8f, 0xd1, 0xa5, 0x64, 0x01, + 0x62, 0x05, 0x50, 0xd3, 0x8d, 0x29, 0xbb, 0xd4, + 0xe5, 0x0d, 0x14, 0x16, 0xa3, 0xad, 0x47, 0x78, + 0x1d, 0xf2, 0x80, 0x16, 0x88, 0x14, 0x1a, 0x81, + 0x02, 0x6a, 0x61, 0x77, 0x45, 0x47, 0x43, 0xd5, + 0xb3, 0x7f, 0x13, 0x10, 0x29, 0xb5, 0x85, 0x57, + 0xed, 0xc4, 0x92, 0xdf, 0xdd, 0x73, 0xf3, 0x22, + 0xc0, 0x54, 0x5b, 0xc6, 0xe1, 0xa1, 0x87, 0x82, + 0x7f, 0x40, 0x18, 0x7c, 0xfe, 0x07, 0xcb, 0x00, + 0xff, 0x00, 0x5e, 0xfd, 0xda, 0xc3, 0xcc, 0xe7, + 0x80, 0xab, 0x96, 0xff, 0x00, 0x5b, 0xdf, 0xa5, + 0x3d, 0xc9, 0x56, 0xd2, 0xd0, 0xbb, 0xb8, 0x6d, + 0xf6, 0xe4, 0x8e, 0xb8, 0x26, 0x06, 0x67, 0x7a, + 0x05, 0x56, 0x08, 0xa7, 0xae, 0x82, 0x98, 0x54, + 0xaf, 0x8a, 0xa0, 0x50, 0xd5, 0x54, 0xa3, 0x54, + 0x6f, 0x11, 0xba, 0x0b, 0x72, 0xbb, 0x5a, 0xec, + 0xef, 0x99, 0xf9, 0x75, 0x83, 0x97, 0xc4, 0x74, + 0xf7, 0x09, 0xa4, 0xfc, 0xe3, 0x05, 0xc5, 0x7a, + 0x60, 0x22, 0x04, 0x3e, 0x0f, 0xeb, 0xcc, 0x31, + 0xdc, 0xb3, 0xdc, 0x41, 0xee, 0x4e, 0x35, 0xee, + 0x08, 0x7b, 0x7f, 0x18, 0x17, 0x79, 0xc0, 0x72, + 0xdf, 0xe0, 0x38, 0x14, 0x43, 0x8e, 0x36, 0x59, + 0xd3, 0xcc, 0x6b, 0xd4, 0xa8, 0xa9, 0x08, 0x71, + 0x78, 0x60, 0xae, 0xa8, 0xe0, 0x6d, 0xab, 0xd7, + 0x00, 0x91, 0xef, 0x4d, 0xc3, 0x62, 0x8f, 0x21, + 0xfd, 0xf9, 0x9d, 0x47, 0x04, 0xa5, 0x32, 0xf5, + 0xb8, 0x5f, 0x38, 0x07, 0xb8, 0xb3, 0x13, 0x20, + 0xee, 0x21, 0xbb, 0x81, 0xf7, 0x11, 0xd7, 0x11, + 0x3f, 0x81, 0x8b, 0xec, 0xb9, 0xae, 0x9f, 0xd8, + 0xc1, 0x60, 0x03, 0xeb, 0xff, 0x00, 0x0a, 0x83, + 0x08, 0x31, 0xe6, 0x6e, 0xef, 0x26, 0x5b, 0x92, + 0xf7, 0x29, 0xee, 0x6d, 0x6f, 0x3f, 0xff, 0xd9, + +}; + +static const uint8_t data_favicon_ico[] = +{ + /* /favicon.ico */ + 0x2f, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, + 0x2e, 0x69, 0x63, 0x6f, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x10, 0x10, + 0x10, 0x00, 0x01, 0x00, 0x04, 0x00, 0x28, 0x01, + 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x10, + 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x68, 0x05, + 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x97, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x79, 0x97, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x99, 0x97, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x79, 0x99, 0x99, 0x70, 0x00, 0x00, 0x07, + 0x77, 0x99, 0x97, 0x79, 0x97, 0x00, 0x00, 0x09, + 0x99, 0x99, 0x7f, 0xf7, 0x99, 0x70, 0x00, 0x79, + 0x99, 0x99, 0xf9, 0x97, 0x99, 0x97, 0x07, 0x99, + 0x99, 0x99, 0xf9, 0x9f, 0x99, 0x99, 0x79, 0x99, + 0x99, 0x99, 0xf9, 0x9f, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x97, 0xf9, 0x9f, 0x79, 0x97, 0x00, 0x00, + 0x99, 0x97, 0xf7, 0x9f, 0x79, 0x90, 0x00, 0x00, + 0x99, 0x99, 0x7f, 0xf7, 0x99, 0x70, 0x00, 0x00, + 0x99, 0x99, 0x9f, 0x99, 0x00, 0x00, 0x00, 0x00, + 0x99, 0x99, 0x90, 0x99, 0x00, 0x00, 0x00, 0x00, + 0x99, 0x99, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x99, 0x99, 0x00, 0x00, 0x00, 0x00, 0xff, 0x8f, + 0xfc, 0xfd, 0xff, 0x0f, 0xfc, 0xfd, 0xfe, 0x0f, + 0xfc, 0xfd, 0xfc, 0x07, 0xfc, 0xfd, 0xe0, 0x03, + 0xfc, 0xfd, 0xe0, 0x01, 0xfc, 0xfd, 0xc0, 0x00, + 0xfc, 0xfd, 0x80, 0x00, 0xfc, 0xfd, 0x00, 0x00, + 0xfc, 0xfd, 0x00, 0x00, 0xfc, 0xfd, 0xf0, 0x01, + 0xfc, 0xfd, 0xf0, 0x01, 0xfc, 0xfd, 0xf0, 0x0f, + 0xfc, 0xfd, 0xf0, 0x4f, 0xfc, 0xfd, 0xf0, 0x7f, + 0xfc, 0xfd, 0xf0, 0xff, 0xfc, 0xfd, 0x28, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0xc0, 0xdc, + 0xc0, 0x00, 0xf0, 0xca, 0xa6, 0x00, 0xd4, 0xf0, + 0xff, 0x00, 0xb1, 0xe2, 0xff, 0x00, 0x8e, 0xd4, + 0xff, 0x00, 0x6b, 0xc6, 0xff, 0x00, 0x48, 0xb8, + 0xff, 0x00, 0x25, 0xaa, 0xff, 0x00, 0x00, 0xaa, + 0xff, 0x00, 0x00, 0x92, 0xdc, 0x00, 0x00, 0x7a, + 0xb9, 0x00, 0x00, 0x62, 0x96, 0x00, 0x00, 0x4a, + 0x73, 0x00, 0x00, 0x32, 0x50, 0x00, 0xd4, 0xe3, + 0xff, 0x00, 0xb1, 0xc7, 0xff, 0x00, 0x8e, 0xab, + 0xff, 0x00, 0x6b, 0x8f, 0xff, 0x00, 0x48, 0x73, + 0xff, 0x00, 0x25, 0x57, 0xff, 0x00, 0x00, 0x55, + 0xff, 0x00, 0x00, 0x49, 0xdc, 0x00, 0x00, 0x3d, + 0xb9, 0x00, 0x00, 0x31, 0x96, 0x00, 0x00, 0x25, + 0x73, 0x00, 0x00, 0x19, 0x50, 0x00, 0xd4, 0xd4, + 0xff, 0x00, 0xb1, 0xb1, 0xff, 0x00, 0x8e, 0x8e, + 0xff, 0x00, 0x6b, 0x6b, 0xff, 0x00, 0x48, 0x48, + 0xff, 0x00, 0x25, 0x25, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0xb9, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x73, 0x00, 0x00, 0x00, 0x50, 0x00, 0xe3, 0xd4, + 0xff, 0x00, 0xc7, 0xb1, 0xff, 0x00, 0xab, 0x8e, + 0xff, 0x00, 0x8f, 0x6b, 0xff, 0x00, 0x73, 0x48, + 0xff, 0x00, 0x57, 0x25, 0xff, 0x00, 0x55, 0x00, + 0xff, 0x00, 0x49, 0x00, 0xdc, 0x00, 0x3d, 0x00, + 0xb9, 0x00, 0x31, 0x00, 0x96, 0x00, 0x25, 0x00, + 0x73, 0x00, 0x19, 0x00, 0x50, 0x00, 0xf0, 0xd4, + 0xff, 0x00, 0xe2, 0xb1, 0xff, 0x00, 0xd4, 0x8e, + 0xff, 0x00, 0xc6, 0x6b, 0xff, 0x00, 0xb8, 0x48, + 0xff, 0x00, 0xaa, 0x25, 0xff, 0x00, 0xaa, 0x00, + 0xff, 0x00, 0x92, 0x00, 0xdc, 0x00, 0x7a, 0x00, + 0xb9, 0x00, 0x62, 0x00, 0x96, 0x00, 0x4a, 0x00, + 0x73, 0x00, 0x32, 0x00, 0x50, 0x00, 0xff, 0xd4, + 0xff, 0x00, 0xff, 0xb1, 0xff, 0x00, 0xff, 0x8e, + 0xff, 0x00, 0xff, 0x6b, 0xff, 0x00, 0xff, 0x48, + 0xff, 0x00, 0xff, 0x25, 0xff, 0x00, 0xff, 0x00, + 0xff, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0xb9, 0x00, + 0xb9, 0x00, 0x96, 0x00, 0x96, 0x00, 0x73, 0x00, + 0x73, 0x00, 0x50, 0x00, 0x50, 0x00, 0xff, 0xd4, + 0xf0, 0x00, 0xff, 0xb1, 0xe2, 0x00, 0xff, 0x8e, + 0xd4, 0x00, 0xff, 0x6b, 0xc6, 0x00, 0xff, 0x48, + 0xb8, 0x00, 0xff, 0x25, 0xaa, 0x00, 0xff, 0x00, + 0xaa, 0x00, 0xdc, 0x00, 0x92, 0x00, 0xb9, 0x00, + 0x7a, 0x00, 0x96, 0x00, 0x62, 0x00, 0x73, 0x00, + 0x4a, 0x00, 0x50, 0x00, 0x32, 0x00, 0xff, 0xd4, + 0xe3, 0x00, 0xff, 0xb1, 0xc7, 0x00, 0xff, 0x8e, + 0xab, 0x00, 0xff, 0x6b, 0x8f, 0x00, 0xff, 0x48, + 0x73, 0x00, 0xff, 0x25, 0x57, 0x00, 0xff, 0x00, + 0x55, 0x00, 0xdc, 0x00, 0x49, 0x00, 0xb9, 0x00, + 0x3d, 0x00, 0x96, 0x00, 0x31, 0x00, 0x73, 0x00, + 0x25, 0x00, 0x50, 0x00, 0x19, 0x00, 0xff, 0xd4, + 0xd4, 0x00, 0xff, 0xb1, 0xb1, 0x00, 0xff, 0x8e, + 0x8e, 0x00, 0xff, 0x6b, 0x6b, 0x00, 0xff, 0x48, + 0x48, 0x00, 0xff, 0x25, 0x25, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xb9, 0x00, + 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0xff, 0xe3, + 0xd4, 0x00, 0xff, 0xc7, 0xb1, 0x00, 0xff, 0xab, + 0x8e, 0x00, 0xff, 0x8f, 0x6b, 0x00, 0xff, 0x73, + 0x48, 0x00, 0xff, 0x57, 0x25, 0x00, 0xff, 0x55, + 0x00, 0x00, 0xdc, 0x49, 0x00, 0x00, 0xb9, 0x3d, + 0x00, 0x00, 0x96, 0x31, 0x00, 0x00, 0x73, 0x25, + 0x00, 0x00, 0x50, 0x19, 0x00, 0x00, 0xff, 0xf0, + 0xd4, 0x00, 0xff, 0xe2, 0xb1, 0x00, 0xff, 0xd4, + 0x8e, 0x00, 0xff, 0xc6, 0x6b, 0x00, 0xff, 0xb8, + 0x48, 0x00, 0xff, 0xaa, 0x25, 0x00, 0xff, 0xaa, + 0x00, 0x00, 0xdc, 0x92, 0x00, 0x00, 0xb9, 0x7a, + 0x00, 0x00, 0x96, 0x62, 0x00, 0x00, 0x73, 0x4a, + 0x00, 0x00, 0x50, 0x32, 0x00, 0x00, 0xff, 0xff, + 0xd4, 0x00, 0xff, 0xff, 0xb1, 0x00, 0xff, 0xff, + 0x8e, 0x00, 0xff, 0xff, 0x6b, 0x00, 0xff, 0xff, + 0x48, 0x00, 0xff, 0xff, 0x25, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xdc, 0xdc, 0x00, 0x00, 0xb9, 0xb9, + 0x00, 0x00, 0x96, 0x96, 0x00, 0x00, 0x73, 0x73, + 0x00, 0x00, 0x50, 0x50, 0x00, 0x00, 0xf0, 0xff, + 0xd4, 0x00, 0xe2, 0xff, 0xb1, 0x00, 0xd4, 0xff, + 0x8e, 0x00, 0xc6, 0xff, 0x6b, 0x00, 0xb8, 0xff, + 0x48, 0x00, 0xaa, 0xff, 0x25, 0x00, 0xaa, 0xff, + 0x00, 0x00, 0x92, 0xdc, 0x00, 0x00, 0x7a, 0xb9, + 0x00, 0x00, 0x62, 0x96, 0x00, 0x00, 0x4a, 0x73, + 0x00, 0x00, 0x32, 0x50, 0x00, 0x00, 0xe3, 0xff, + 0xd4, 0x00, 0xc7, 0xff, 0xb1, 0x00, 0xab, 0xff, + 0x8e, 0x00, 0x8f, 0xff, 0x6b, 0x00, 0x73, 0xff, + 0x48, 0x00, 0x57, 0xff, 0x25, 0x00, 0x55, 0xff, + 0x00, 0x00, 0x49, 0xdc, 0x00, 0x00, 0x3d, 0xb9, + 0x00, 0x00, 0x31, 0x96, 0x00, 0x00, 0x25, 0x73, + 0x00, 0x00, 0x19, 0x50, 0x00, 0x00, 0xd4, 0xff, + 0xd4, 0x00, 0xb1, 0xff, 0xb1, 0x00, 0x8e, 0xff, + 0x8e, 0x00, 0x6b, 0xff, 0x6b, 0x00, 0x48, 0xff, + 0x48, 0x00, 0x25, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xb9, + 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x73, + 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0xd4, 0xff, + 0xe3, 0x00, 0xb1, 0xff, 0xc7, 0x00, 0x8e, 0xff, + 0xab, 0x00, 0x6b, 0xff, 0x8f, 0x00, 0x48, 0xff, + 0x73, 0x00, 0x25, 0xff, 0x57, 0x00, 0x00, 0xff, + 0x55, 0x00, 0x00, 0xdc, 0x49, 0x00, 0x00, 0xb9, + 0x3d, 0x00, 0x00, 0x96, 0x31, 0x00, 0x00, 0x73, + 0x25, 0x00, 0x00, 0x50, 0x19, 0x00, 0xd4, 0xff, + 0xf0, 0x00, 0xb1, 0xff, 0xe2, 0x00, 0x8e, 0xff, + 0xd4, 0x00, 0x6b, 0xff, 0xc6, 0x00, 0x48, 0xff, + 0xb8, 0x00, 0x25, 0xff, 0xaa, 0x00, 0x00, 0xff, + 0xaa, 0x00, 0x00, 0xdc, 0x92, 0x00, 0x00, 0xb9, + 0x7a, 0x00, 0x00, 0x96, 0x62, 0x00, 0x00, 0x73, + 0x4a, 0x00, 0x00, 0x50, 0x32, 0x00, 0xd4, 0xff, + 0xff, 0x00, 0xb1, 0xff, 0xff, 0x00, 0x8e, 0xff, + 0xff, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x48, 0xff, + 0xff, 0x00, 0x25, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xdc, 0xdc, 0x00, 0x00, 0xb9, + 0xb9, 0x00, 0x00, 0x96, 0x96, 0x00, 0x00, 0x73, + 0x73, 0x00, 0x00, 0x50, 0x50, 0x00, 0xf2, 0xf2, + 0xf2, 0x00, 0xe6, 0xe6, 0xe6, 0x00, 0xda, 0xda, + 0xda, 0x00, 0xce, 0xce, 0xce, 0x00, 0xc2, 0xc2, + 0xc2, 0x00, 0xb6, 0xb6, 0xb6, 0x00, 0xaa, 0xaa, + 0xaa, 0x00, 0x9e, 0x9e, 0x9e, 0x00, 0x92, 0x92, + 0x92, 0x00, 0x86, 0x86, 0x86, 0x00, 0x7a, 0x7a, + 0x7a, 0x00, 0x6e, 0x6e, 0x6e, 0x00, 0x62, 0x62, + 0x62, 0x00, 0x56, 0x56, 0x56, 0x00, 0x4a, 0x4a, + 0x4a, 0x00, 0x3e, 0x3e, 0x3e, 0x00, 0x32, 0x32, + 0x32, 0x00, 0x26, 0x26, 0x26, 0x00, 0x1a, 0x1a, + 0x1a, 0x00, 0x0e, 0x0e, 0x0e, 0x00, 0xf0, 0xfb, + 0xff, 0x00, 0xa4, 0xa0, 0xa0, 0x00, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, + 0x28, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x28, + 0x28, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x28, 0x28, + 0x28, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x25, 0x25, 0x25, 0x25, 0x28, 0x28, 0xf6, + 0xf6, 0x23, 0x28, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x23, 0x23, + 0x23, 0xf6, 0x23, 0x28, 0x25, 0x00, 0x00, 0x00, + 0x25, 0x28, 0x28, 0x28, 0x28, 0x28, 0x23, 0x28, + 0x28, 0xf6, 0x28, 0x28, 0x28, 0x25, 0x00, 0x25, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x23, 0x28, + 0x28, 0xf6, 0x28, 0x28, 0x28, 0x28, 0x25, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0xf6, 0xf6, 0x28, + 0x28, 0xf6, 0xf6, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0xf6, 0xf6, 0x28, + 0x28, 0x23, 0xf6, 0x28, 0x28, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x23, 0x23, + 0x28, 0x23, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x23, + 0x23, 0x23, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x23, + 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x25, 0x00, + 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x8f, + 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0x0f, + 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0xe0, 0x03, + 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, + 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x0f, + 0x00, 0x00, 0xf0, 0x4f, 0x00, 0x00, 0xf0, 0xff, + 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, +}; + +static const uint8_t data_index_htm[] = +{ + /* /index.htm */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, + 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x0a, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3e, 0x44, 0x4b, 0x2d, 0x54, 0x4d, 0x34, + 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, 0x44, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x4b, 0x69, 0x74, 0x3c, 0x2f, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, + 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x73, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, + 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x68, 0x6f, 0x72, + 0x74, 0x63, 0x75, 0x74, 0x20, 0x69, 0x63, 0x6f, + 0x6e, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78, + 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x66, 0x61, 0x76, + 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, + 0x73, 0x72, 0x63, 0x3d, 0x22, 0x6a, 0x61, 0x76, + 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x6a, 0x73, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, + 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x4a, 0x61, + 0x76, 0x61, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x31, 0x2e, 0x32, 0x22, 0x3e, 0x3c, 0x2f, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, + 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, + 0x25, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x61, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x22, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, + 0x6d, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x74, 0x69, 0x2e, 0x6a, + 0x70, 0x67, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, + 0x22, 0x54, 0x65, 0x78, 0x61, 0x73, 0x20, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x64, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, + 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, + 0x31, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x54, 0x69, 0x76, 0x61, 0x26, 0x74, + 0x72, 0x61, 0x64, 0x65, 0x3b, 0x20, 0x43, 0x20, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, 0x54, + 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, + 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x4b, 0x69, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x68, 0x32, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x44, 0x4b, 0x2d, 0x54, 0x4d, + 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x61, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x76, 0x61, + 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x69, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x76, + 0x61, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x74, 0x6d, 0x34, 0x63, + 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20, 0x61, 0x6c, + 0x74, 0x3d, 0x22, 0x54, 0x4d, 0x34, 0x43, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x61, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, + 0x72, 0x3e, 0x3c, 0x68, 0x72, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, + 0x65, 0x6e, 0x75, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x75, 0x6c, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x61, 0x62, + 0x6f, 0x75, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x22, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x61, 0x62, 0x6f, + 0x75, 0x74, 0x22, 0x3e, 0x41, 0x62, 0x6f, 0x75, + 0x74, 0x20, 0x54, 0x49, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x6f, 0x76, 0x65, 0x72, 0x76, + 0x69, 0x65, 0x77, 0x2e, 0x68, 0x74, 0x6d, 0x22, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6f, 0x76, 0x65, + 0x72, 0x76, 0x69, 0x65, 0x77, 0x22, 0x3e, 0x54, + 0x69, 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, + 0x65, 0x3b, 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x20, 0x4f, 0x76, 0x65, 0x72, + 0x76, 0x69, 0x65, 0x77, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, + 0x3e, 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, + 0x58, 0x4e, 0x43, 0x5a, 0x41, 0x44, 0x20, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x44, 0x69, 0x61, + 0x67, 0x72, 0x61, 0x6d, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x74, 0x6f, 0x6f, 0x6c, 0x2f, 0x64, 0x6b, 0x2d, + 0x74, 0x6d, 0x34, 0x63, 0x31, 0x32, 0x39, 0x78, + 0x22, 0x3e, 0x44, 0x4b, 0x2d, 0x54, 0x4d, 0x34, + 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, 0x50, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x50, 0x61, + 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, + 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3d, 0x22, 0x5f, 0x22, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, + 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, + 0x76, 0x61, 0x2d, 0x63, 0x22, 0x3e, 0x54, 0x69, + 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, + 0x3b, 0x20, 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, + 0x39, 0x58, 0x20, 0x46, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x20, 0x50, 0x61, 0x67, 0x65, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x64, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x73, 0x64, 0x22, 0x3e, 0x53, 0x44, + 0x20, 0x43, 0x61, 0x72, 0x64, 0x20, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x75, 0x6c, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x64, 0x6b, 0x2d, 0x74, + 0x6d, 0x34, 0x63, 0x31, 0x32, 0x39, 0x78, 0x2e, + 0x6a, 0x70, 0x67, 0x22, 0x20, 0x61, 0x6c, 0x74, + 0x3d, 0x22, 0x44, 0x4b, 0x2d, 0x54, 0x4d, 0x34, + 0x43, 0x31, 0x32, 0x39, 0x58, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x66, 0x6f, 0x6f, 0x74, 0x69, 0x6e, + 0x67, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x68, 0x72, 0x3e, 0x3c, 0x68, + 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x20, 0x26, 0x63, 0x6f, 0x70, 0x79, + 0x3b, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, 0x32, + 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, 0x61, + 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, 0x6e, + 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, 0x6c, + 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, +}; + +static const uint8_t data_javascript_js[] = +{ + /* /javascript.js */ + 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x6a, 0x73, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x0a, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6f, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, + 0x28, 0x27, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x27, + 0x29, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x41, 0x62, 0x6f, 0x75, 0x74, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, + 0x49, 0x64, 0x28, 0x27, 0x6f, 0x76, 0x65, 0x72, + 0x76, 0x69, 0x65, 0x77, 0x27, 0x29, 0x2e, 0x6f, + 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x76, 0x65, + 0x72, 0x76, 0x69, 0x65, 0x77, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, + 0x49, 0x64, 0x28, 0x27, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x27, 0x29, 0x2e, 0x6f, 0x6e, 0x63, 0x6c, + 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x67, 0x65, 0x28, 0x22, + 0x61, 0x62, 0x6f, 0x75, 0x74, 0x2e, 0x68, 0x74, + 0x6d, 0x22, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x62, 0x6f, + 0x75, 0x74, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x61, 0x67, 0x65, 0x28, 0x22, 0x61, 0x62, 0x6f, + 0x75, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x76, 0x65, 0x72, + 0x76, 0x69, 0x65, 0x77, 0x28, 0x29, 0x0a, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x61, 0x67, 0x65, 0x28, 0x22, 0x6f, + 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x2e, + 0x68, 0x74, 0x6d, 0x22, 0x29, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, + 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x29, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x67, 0x65, 0x28, + 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x68, + 0x74, 0x6d, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0a, + 0x7d, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x61, 0x67, 0x65, 0x28, 0x70, 0x61, 0x67, + 0x65, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x28, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x2e, 0x58, 0x4d, 0x4c, 0x48, 0x74, + 0x74, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x78, 0x6d, 0x6c, 0x68, 0x74, 0x74, 0x70, + 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x58, + 0x4d, 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x29, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, + 0x6c, 0x68, 0x74, 0x74, 0x70, 0x20, 0x3d, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x58, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x28, 0x22, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x58, 0x4d, 0x4c, + 0x48, 0x54, 0x54, 0x50, 0x22, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x68, 0x74, + 0x74, 0x70, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, + 0x22, 0x47, 0x45, 0x54, 0x22, 0x2c, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x78, 0x6d, 0x6c, 0x68, 0x74, 0x74, 0x70, 0x2e, + 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x28, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x78, 0x2d, 0x77, 0x77, 0x77, + 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x75, 0x72, + 0x6c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x78, 0x6d, 0x6c, 0x68, 0x74, 0x74, 0x70, 0x2e, + 0x73, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x3b, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, + 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x6e, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x28, + 0x78, 0x6d, 0x6c, 0x68, 0x74, 0x74, 0x70, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x29, + 0x20, 0x26, 0x26, 0x20, 0x28, 0x78, 0x6d, 0x6c, + 0x68, 0x74, 0x74, 0x70, 0x2e, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x32, + 0x30, 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, + 0x49, 0x64, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x29, 0x2e, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x3d, 0x20, 0x78, 0x6d, 0x6c, 0x68, 0x74, 0x74, + 0x70, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x54, 0x65, 0x78, 0x74, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x7d, 0x0a, +}; + +static const uint8_t data_overview_htm[] = +{ + /* /overview.htm */ + 0x2f, 0x6f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x68, 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x0a, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3e, 0x44, 0x4b, 0x2d, 0x54, + 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, + 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x4b, 0x69, 0x74, 0x3c, + 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, + 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, + 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, + 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x73, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, + 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x20, 0x69, + 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x22, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x66, + 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, + 0x63, 0x6f, 0x22, 0x2f, 0x3e, 0x0a, 0x3c, 0x2f, + 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x70, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x54, 0x69, 0x76, + 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, + 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x3c, 0x2f, + 0x70, 0x3e, 0x0a, 0x3c, 0x68, 0x72, 0x3e, 0x0a, + 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x41, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x41, 0x52, 0x4d, 0x26, 0x72, 0x65, + 0x67, 0x3b, 0x20, 0x43, 0x6f, 0x72, 0x74, 0x65, + 0x78, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, + 0x2d, 0x4d, 0x34, 0x20, 0x6d, 0x69, 0x63, 0x72, + 0x6f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x73, 0x20, 0x28, 0x4d, 0x43, + 0x55, 0x73, 0x29, 0x20, 0x74, 0x6f, 0x20, 0x62, + 0x65, 0x0a, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, + 0x20, 0x54, 0x49, 0x27, 0x73, 0x20, 0x70, 0x72, + 0x6f, 0x70, 0x72, 0x69, 0x65, 0x74, 0x61, 0x72, + 0x79, 0x20, 0x36, 0x35, 0x2d, 0x6e, 0x6d, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x54, 0x69, 0x76, 0x61, 0x20, 0x43, 0x20, 0x53, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x0a, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x73, + 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x20, + 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, + 0x61, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x69, + 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x6f, + 0x75, 0x74, 0x20, 0x73, 0x61, 0x63, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, + 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x6f, + 0x77, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x20, 0x45, 0x76, 0x65, 0x72, 0x79, 0x20, 0x43, + 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x0a, + 0x4d, 0x43, 0x55, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x2d, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x68, 0x69, 0x67, 0x68, 0x2d, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, + 0x65, 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x6f, 0x67, + 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, + 0x74, 0x69, 0x6c, 0x6c, 0x0a, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6c, + 0x6f, 0x77, 0x2d, 0x70, 0x6f, 0x77, 0x65, 0x72, + 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x20, + 0x61, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x20, + 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x20, 0x54, 0x6f, 0x64, 0x61, 0x79, + 0x27, 0x73, 0x0a, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x65, 0x72, 0x73, 0x20, 0x75, 0x6e, 0x64, + 0x65, 0x72, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x65, 0x73, + 0x69, 0x67, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x72, + 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x68, + 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x20, + 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x2e, 0x20, 0x4f, + 0x66, 0x74, 0x65, 0x6e, 0x2c, 0x20, 0x74, 0x68, + 0x65, 0x0a, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x6c, 0x6c, + 0x65, 0x6e, 0x67, 0x65, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x3c, 0x61, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, + 0x5f, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x76, 0x61, 0x77, + 0x61, 0x72, 0x65, 0x22, 0x3e, 0x54, 0x69, 0x76, + 0x61, 0x57, 0x61, 0x72, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x0a, 0x66, 0x72, 0x65, 0x65, + 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, + 0x20, 0x6f, 0x66, 0x20, 0x43, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x70, 0x65, + 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, + 0x2d, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x61, + 0x6e, 0x64, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x52, 0x4f, 0x4d, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, + 0x20, 0x54, 0x69, 0x76, 0x61, 0x20, 0x43, 0x20, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, 0x4d, + 0x43, 0x55, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, + 0x0a, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x20, 0x55, 0x53, 0x42, 0x2c, 0x20, + 0x43, 0x41, 0x4e, 0x2c, 0x20, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x69, 0x63, 0x73, 0x2c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, + 0x73, 0x6f, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x65, 0x72, 0x73, 0x20, 0x63, 0x61, 0x6e, + 0x20, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x69, 0x72, 0x20, 0x65, 0x66, 0x66, + 0x6f, 0x72, 0x74, 0x73, 0x20, 0x6f, 0x6e, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, + 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x69, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x20, + 0x70, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x61, 0x6c, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x54, 0x69, 0x76, 0x61, 0x20, 0x43, 0x20, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, + 0x61, 0x6e, 0x0a, 0x65, 0x78, 0x63, 0x65, 0x6c, + 0x6c, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x61, 0x73, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x68, 0x6f, 0x6d, 0x65, 0x2c, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, + 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, + 0x64, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6c, + 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, +}; + +static const uint8_t data_styles_css[] = +{ + /* /styles.css */ + 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x2e, + 0x63, 0x73, 0x73, 0x00, + 0x2f, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, + 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, 0x32, 0x30, + 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, 0x61, 0x73, + 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, 0x6e, 0x63, + 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, 0x6c, 0x20, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, + 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x2f, 0x2a, 0x20, + 0x53, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x20, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x20, 0x2a, 0x2f, 0x0a, 0x62, 0x6f, 0x64, 0x79, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x20, 0x62, 0x6c, 0x61, 0x63, 0x6b, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x3a, 0x20, 0x41, 0x72, 0x69, 0x65, 0x6c, + 0x2c, 0x48, 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, + 0x63, 0x61, 0x2c, 0x73, 0x61, 0x6e, 0x73, 0x2d, + 0x73, 0x65, 0x72, 0x69, 0x66, 0x3b, 0x0a, 0x7d, + 0x0a, 0x0a, 0x2f, 0x2a, 0x20, 0x53, 0x74, 0x79, + 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x69, 0x76, + 0x2e, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x68, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x0a, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, + 0x72, 0x3a, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x68, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x31, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, + 0x3a, 0x20, 0x32, 0x65, 0x6d, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, + 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, + 0x0a, 0x23, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x68, 0x32, 0x0a, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31, 0x2e, + 0x32, 0x35, 0x65, 0x6d, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x62, + 0x6f, 0x6c, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, + 0x23, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x68, 0x72, 0x0a, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, + 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x20, 0x23, 0x66, 0x66, 0x30, 0x30, + 0x30, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, + 0x6f, 0x70, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x66, + 0x66, 0x30, 0x30, 0x30, 0x30, 0x3b, 0x0a, 0x7d, + 0x0a, 0x0a, 0x23, 0x68, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x61, 0x20, 0x69, 0x6d, 0x67, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x30, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x20, + 0x53, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x64, 0x69, 0x76, + 0x2e, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x6d, 0x65, + 0x6e, 0x75, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, + 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, + 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x20, 0x32, 0x32, 0x35, 0x70, 0x78, 0x3b, + 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x6d, 0x65, 0x6e, + 0x75, 0x20, 0x75, 0x6c, 0x0a, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x2d, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2d, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x3b, + 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x6d, 0x65, 0x6e, + 0x75, 0x20, 0x61, 0x3a, 0x6c, 0x69, 0x6e, 0x6b, + 0x2c, 0x20, 0x23, 0x6d, 0x65, 0x6e, 0x75, 0x20, + 0x61, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, + 0x64, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x66, 0x66, 0x30, 0x30, 0x30, + 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x3a, 0x20, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x20, 0x62, 0x6f, 0x6c, 0x64, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, + 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x32, 0x70, 0x78, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, + 0x3a, 0x20, 0x32, 0x70, 0x78, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x3a, 0x20, 0x34, 0x70, 0x78, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, + 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6e, 0x6f, + 0x6e, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x32, + 0x30, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x7d, 0x0a, + 0x0a, 0x23, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, + 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x20, + 0x23, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, 0x3a, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x0a, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, + 0x62, 0x66, 0x30, 0x30, 0x30, 0x30, 0x3b, 0x0a, + 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x20, 0x53, 0x74, + 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x69, + 0x76, 0x2e, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x0a, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, + 0x74, 0x3a, 0x20, 0x32, 0x32, 0x35, 0x70, 0x78, + 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x0a, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31, + 0x2e, 0x35, 0x65, 0x6d, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x62, + 0x6f, 0x6c, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, + 0x2f, 0x2a, 0x20, 0x53, 0x74, 0x79, 0x6c, 0x69, + 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6f, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x64, 0x69, 0x76, 0x2e, 0x20, + 0x2a, 0x2f, 0x0a, 0x23, 0x66, 0x6f, 0x6f, 0x74, + 0x69, 0x6e, 0x67, 0x0a, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x3a, + 0x20, 0x62, 0x6f, 0x74, 0x68, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x2e, 0x37, + 0x35, 0x65, 0x6d, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3a, 0x20, 0x69, 0x74, 0x61, + 0x6c, 0x69, 0x63, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, + 0x66, 0x6f, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x68, 0x72, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, + 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x20, 0x23, 0x66, 0x66, 0x30, 0x30, 0x30, + 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, + 0x70, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x66, 0x66, + 0x30, 0x30, 0x30, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, + +}; + +static const uint8_t data_ti_jpg[] = +{ + /* /ti.jpg */ + 0x2f, 0x74, 0x69, 0x2e, 0x6a, 0x70, 0x67, 0x00, + + 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, + 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, + 0x00, 0x48, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43, + 0x00, 0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x03, + 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x05, + 0x08, 0x05, 0x05, 0x04, 0x04, 0x05, 0x0a, 0x07, + 0x07, 0x06, 0x08, 0x0c, 0x0a, 0x0c, 0x0c, 0x0b, + 0x0a, 0x0b, 0x0b, 0x0d, 0x0e, 0x12, 0x10, 0x0d, + 0x0e, 0x11, 0x0e, 0x0b, 0x0b, 0x10, 0x16, 0x10, + 0x11, 0x13, 0x14, 0x15, 0x15, 0x15, 0x0c, 0x0f, + 0x17, 0x18, 0x16, 0x14, 0x18, 0x12, 0x14, 0x15, + 0x14, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x03, 0x04, + 0x04, 0x05, 0x04, 0x05, 0x09, 0x05, 0x05, 0x09, + 0x14, 0x0d, 0x0b, 0x0d, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xff, 0xc2, + 0x00, 0x11, 0x08, 0x00, 0x4b, 0x01, 0x16, 0x03, + 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, + 0x01, 0xff, 0xc4, 0x00, 0x1c, 0x00, 0x01, 0x00, + 0x02, 0x02, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x07, 0x05, 0x08, 0x01, 0x02, 0x04, 0x03, 0xff, + 0xc4, 0x00, 0x1c, 0x01, 0x01, 0x00, 0x01, 0x05, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0x02, + 0x03, 0x04, 0x06, 0x07, 0x08, 0xff, 0xda, 0x00, + 0x0c, 0x03, 0x01, 0x00, 0x02, 0x10, 0x03, 0x10, + 0x00, 0x00, 0x01, 0xda, 0x90, 0x62, 0xec, 0xda, + 0x80, 0xea, 0x74, 0xb2, 0xbc, 0xf0, 0x92, 0x4c, + 0xf1, 0x5c, 0xab, 0xd8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0b, + 0xd6, 0xe8, 0x35, 0x63, 0x9d, 0xf6, 0x9b, 0xc2, + 0x67, 0xcd, 0x7d, 0x2d, 0x6b, 0x47, 0x7f, 0x91, + 0xf5, 0xd7, 0x0f, 0xda, 0xeb, 0x7e, 0x27, 0x53, + 0xb1, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x02, 0x90, 0xbd, 0x79, 0xfd, + 0x59, 0xe7, 0x3d, 0xb2, 0x67, 0xb9, 0xcd, 0xe4, + 0x32, 0xe9, 0xe1, 0xb0, 0xc8, 0xc9, 0x33, 0x45, + 0x6c, 0x64, 0xcf, 0x94, 0x54, 0x35, 0xae, 0xbc, + 0x96, 0x91, 0x35, 0x33, 0x86, 0x4c, 0xf2, 0x19, + 0x23, 0xd8, 0x60, 0x8f, 0x11, 0x63, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x16, 0xcd, 0xca, 0x32, + 0x23, 0xd2, 0x31, 0x96, 0x6e, 0xc1, 0x74, 0xba, + 0xad, 0x86, 0x9a, 0xf2, 0x3a, 0xff, 0x00, 0x53, + 0xa9, 0xf9, 0xd3, 0x2c, 0x6b, 0x5e, 0x5f, 0x6d, + 0x7a, 0x3f, 0x0d, 0xf4, 0x56, 0xdd, 0x47, 0x26, + 0x27, 0xb0, 0xb3, 0x8d, 0x50, 0x36, 0xa4, 0xad, + 0x48, 0xd9, 0x8f, 0x24, 0xe6, 0xc5, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x55, 0xb4, 0x74, 0x5f, + 0xa3, 0x53, 0x11, 0x5e, 0x8d, 0xc5, 0x69, 0x62, + 0xee, 0xf1, 0xbc, 0xd6, 0xea, 0xef, 0x43, 0xb0, + 0xeb, 0x75, 0x37, 0x2f, 0xa5, 0xf9, 0xf7, 0xdf, + 0x76, 0x0d, 0x36, 0x56, 0x74, 0x65, 0x8f, 0x69, + 0x16, 0x31, 0x06, 0x64, 0xaf, 0xcb, 0x80, 0xad, + 0x0d, 0xb8, 0x3e, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xe1, 0xb3, 0x2d, 0x3f, 0x1d, 0xdd, 0xfa, + 0xee, 0xc3, 0xf0, 0x64, 0x9d, 0xed, 0x73, 0x34, + 0x44, 0x57, 0xa6, 0x5d, 0xb2, 0x7e, 0x77, 0x37, + 0xda, 0xe7, 0xc6, 0xbe, 0x97, 0xf1, 0xc8, 0x39, + 0x38, 0x3b, 0x1c, 0x00, 0x77, 0x39, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xc2, 0x9d, 0x29, 0x76, + 0xa6, 0x73, 0xde, 0xe1, 0x80, 0xc5, 0x2d, 0xb8, + 0x7d, 0x1f, 0x81, 0x64, 0xb2, 0x6a, 0xf2, 0x0d, + 0x47, 0x33, 0x25, 0x90, 0x57, 0x06, 0x54, 0x90, + 0x95, 0x69, 0x6c, 0x15, 0x31, 0x99, 0x3b, 0x1b, + 0x18, 0x51, 0x24, 0x54, 0xb4, 0x48, 0xe9, 0x0d, + 0x2e, 0x12, 0x86, 0x2e, 0xf3, 0x18, 0x56, 0xa4, + 0xf8, 0xe0, 0xb4, 0x89, 0x70, 0x01, 0x48, 0xde, + 0x09, 0x5a, 0x72, 0x37, 0xbc, 0xd8, 0x29, 0x8f, + 0x31, 0xfa, 0xd6, 0xd0, 0x35, 0x1c, 0xb3, 0xca, + 0xf8, 0xc9, 0x1f, 0x33, 0x2e, 0x47, 0x8d, 0x99, + 0x34, 0xd0, 0xce, 0x19, 0x53, 0x66, 0xca, 0x04, + 0x81, 0x12, 0xa3, 0x2c, 0x57, 0x26, 0xc4, 0x90, + 0xc2, 0x8d, 0x37, 0x00, 0xd7, 0xd3, 0x60, 0x0a, + 0x2c, 0x93, 0x97, 0xc0, 0x00, 0x00, 0x01, 0xc1, + 0x48, 0x92, 0x12, 0xc9, 0x2b, 0x53, 0x08, 0x4d, + 0xc8, 0x71, 0x66, 0x15, 0xf1, 0xd4, 0xfa, 0x98, + 0xa2, 0x6e, 0x7c, 0x4e, 0x86, 0x18, 0x8d, 0x12, + 0x33, 0xde, 0x4a, 0x8f, 0xb9, 0x58, 0x96, 0x01, + 0x5d, 0x13, 0xf2, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xff, 0xc4, 0x00, 0x2b, 0x10, 0x00, 0x01, + 0x04, 0x02, 0x01, 0x01, 0x06, 0x06, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, + 0x03, 0x04, 0x06, 0x01, 0x07, 0x00, 0x13, 0x10, + 0x11, 0x12, 0x36, 0x37, 0x40, 0x14, 0x15, 0x17, + 0x30, 0x31, 0x34, 0x16, 0x20, 0x50, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, 0x05, 0x02, + 0xec, 0x26, 0x41, 0xb1, 0x70, 0xfe, 0xa1, 0x8d, + 0xe0, 0x53, 0xf1, 0xce, 0xa7, 0xbf, 0x98, 0xf7, + 0xf7, 0x1f, 0x2e, 0xf3, 0x5c, 0xaf, 0x09, 0x6a, + 0xd4, 0x24, 0x89, 0x32, 0x51, 0xfc, 0x11, 0x98, + 0x4b, 0x89, 0x56, 0x78, 0xa7, 0x50, 0x9c, 0xfc, + 0x43, 0x7c, 0x4b, 0xa8, 0x56, 0x7d, 0xcd, 0xc7, + 0xcb, 0xbc, 0xad, 0x8a, 0x91, 0x24, 0x9b, 0x39, + 0xc9, 0x7b, 0x9d, 0x85, 0x12, 0x72, 0x4e, 0x81, + 0x9c, 0xe4, 0xe7, 0x24, 0xeb, 0x68, 0x25, 0x48, + 0x2e, 0xb1, 0x0f, 0x1b, 0x28, 0xc0, 0x10, 0x34, + 0x59, 0xf8, 0xda, 0x21, 0x7c, 0x0f, 0x5e, 0x46, + 0xb0, 0x22, 0xbf, 0x68, 0x85, 0x66, 0x68, 0x75, + 0xc2, 0x19, 0x42, 0x47, 0xec, 0x90, 0x6b, 0x31, + 0x03, 0x19, 0x8a, 0x78, 0x79, 0xdb, 0x98, 0xca, + 0xf3, 0xc2, 0xaf, 0xe2, 0x0b, 0xcb, 0xfb, 0xe5, + 0x9e, 0x90, 0xc0, 0xef, 0xa8, 0x24, 0xb8, 0x46, + 0xe3, 0x38, 0x9c, 0x3e, 0x00, 0x3b, 0x13, 0x00, + 0x69, 0x7e, 0x06, 0xa7, 0xdb, 0xcf, 0x32, 0x69, + 0xc0, 0x85, 0x54, 0x1c, 0x8b, 0x2e, 0x75, 0x9a, + 0xe3, 0xbe, 0xb6, 0x6e, 0xaf, 0x2f, 0x0c, 0xbd, + 0xb4, 0x3a, 0xbb, 0x00, 0x74, 0x29, 0xa1, 0x55, + 0x3a, 0x7e, 0xb1, 0x39, 0x55, 0x04, 0xc8, 0x11, + 0x25, 0xa1, 0x26, 0xef, 0x72, 0xd4, 0x64, 0x57, + 0x02, 0x69, 0xf7, 0xc9, 0x52, 0x6f, 0x10, 0xb6, + 0x1d, 0x7a, 0xcd, 0x37, 0xd8, 0x5d, 0xeb, 0x8d, + 0xb0, 0xdf, 0x60, 0xc4, 0x2a, 0x3d, 0x4e, 0x0c, + 0x57, 0x63, 0xd5, 0x33, 0x8c, 0xa7, 0x3c, 0x83, + 0xfa, 0x7c, 0x70, 0x8c, 0x7c, 0xed, 0xad, 0xcd, + 0x21, 0xb7, 0x84, 0x86, 0xd8, 0x81, 0xe2, 0x03, + 0xfa, 0x88, 0xc3, 0x22, 0x23, 0x55, 0x22, 0x9d, + 0xa5, 0x50, 0xef, 0xd9, 0x1a, 0x16, 0x9b, 0x51, + 0x8c, 0x78, 0x49, 0xc8, 0x88, 0xa3, 0xde, 0xdb, + 0xd8, 0xa8, 0x83, 0x3a, 0xda, 0xec, 0x1b, 0xcc, + 0xf6, 0x51, 0xd3, 0x67, 0xef, 0xcc, 0x8a, 0x89, + 0xb1, 0xa1, 0xeb, 0xdc, 0xa2, 0x75, 0xb2, 0xab, + 0x19, 0x03, 0xea, 0x56, 0x31, 0xf0, 0x85, 0x2a, + 0xce, 0x2b, 0x09, 0x18, 0x0e, 0x55, 0x96, 0x68, + 0xda, 0x80, 0xe1, 0xfc, 0xc6, 0x31, 0x8c, 0x67, + 0xf0, 0xab, 0xc1, 0x24, 0x5a, 0x7c, 0x18, 0xce, + 0x3a, 0x68, 0xe7, 0x4d, 0x1c, 0xf0, 0x27, 0xbb, + 0xa6, 0x8e, 0x61, 0x29, 0x4f, 0x3c, 0x09, 0xcf, + 0x3c, 0x09, 0xee, 0x4a, 0x12, 0x8f, 0x66, 0xa4, + 0x61, 0x69, 0xb0, 0x0a, 0x50, 0x82, 0x6d, 0x23, + 0xaa, 0xe0, 0xe8, 0x4d, 0x8e, 0x87, 0xda, 0xef, + 0xad, 0x9b, 0x26, 0x61, 0x81, 0xa7, 0xe9, 0x96, + 0xe6, 0x6e, 0x22, 0x85, 0xd8, 0xa7, 0x09, 0xaa, + 0xd7, 0x82, 0x4f, 0xb0, 0x0d, 0xc0, 0xab, 0x2c, + 0x98, 0x07, 0x7e, 0x70, 0x26, 0xe0, 0xd0, 0x02, + 0xc2, 0xe4, 0xd0, 0xbe, 0x73, 0x70, 0xe3, 0x67, + 0xcc, 0xd5, 0x2e, 0xe5, 0xe5, 0xce, 0x6f, 0x66, + 0x11, 0x63, 0xac, 0x3e, 0xb4, 0xf4, 0xc2, 0x1a, + 0xf7, 0x5f, 0xdb, 0x49, 0xb3, 0x61, 0xd9, 0x07, + 0x25, 0x0e, 0x1d, 0xac, 0xdf, 0x96, 0x78, 0x0d, + 0x1f, 0x06, 0x2d, 0x92, 0x06, 0x82, 0x28, 0x28, + 0xc4, 0xcb, 0x49, 0xba, 0xd5, 0x96, 0xc8, 0x6d, + 0x05, 0x68, 0xf0, 0xc4, 0x17, 0x37, 0x0c, 0x5e, + 0x4c, 0x4f, 0xbb, 0x16, 0x9c, 0x62, 0x8a, 0x04, + 0x25, 0x7e, 0x79, 0x68, 0x15, 0x76, 0xc8, 0xb0, + 0x2f, 0xfa, 0x1a, 0x06, 0xc1, 0xb8, 0xd9, 0xa0, + 0x91, 0x65, 0xf6, 0xf1, 0x9c, 0x27, 0xb5, 0xdf, + 0x5b, 0x0e, 0xfa, 0x95, 0x75, 0xab, 0xc9, 0xaa, + 0x93, 0xa1, 0x3f, 0x06, 0x7d, 0x4a, 0x66, 0x9a, + 0xe9, 0x2f, 0x58, 0x1c, 0x24, 0xfc, 0xcb, 0x9f, + 0xaa, 0xd3, 0x3f, 0x53, 0x59, 0x0d, 0x27, 0x3d, + 0x14, 0x95, 0xc7, 0x6e, 0xee, 0x73, 0x3d, 0x3d, + 0xc7, 0x31, 0x58, 0x4c, 0x4a, 0x6f, 0xa5, 0x76, + 0x50, 0xeb, 0xc5, 0x24, 0x7b, 0xae, 0xda, 0x60, + 0x69, 0xcf, 0x2b, 0xeb, 0x80, 0x1f, 0x3c, 0x96, + 0x0a, 0xbd, 0x8a, 0xcc, 0x9a, 0xd4, 0x06, 0x09, + 0x9c, 0xb1, 0x8e, 0x23, 0x40, 0x55, 0x5b, 0xcb, + 0x35, 0xbf, 0x58, 0x2c, 0x4d, 0x8e, 0x95, 0x0a, + 0x5e, 0x9c, 0x72, 0x2a, 0xf5, 0x49, 0xf9, 0xc5, + 0x62, 0xfd, 0x9c, 0xfe, 0x33, 0xae, 0x1f, 0x51, + 0xd2, 0x35, 0x19, 0x53, 0xcf, 0xb8, 0xda, 0x5d, + 0x42, 0x68, 0x30, 0x9b, 0x07, 0x9a, 0x01, 0x06, + 0x31, 0x59, 0xaa, 0x43, 0xab, 0x45, 0x2b, 0xaf, + 0xde, 0x2c, 0x7a, 0x64, 0x59, 0x32, 0x06, 0xd4, + 0x68, 0x79, 0xa8, 0xc9, 0xb5, 0x6b, 0xc8, 0xf6, + 0x39, 0xa5, 0x68, 0x4d, 0x9e, 0x85, 0x9a, 0x01, + 0x29, 0x28, 0x95, 0x5a, 0x4f, 0xf1, 0xe1, 0xd5, + 0x8f, 0x86, 0xae, 0xaa, 0xab, 0xd3, 0xab, 0xd7, + 0x29, 0x2f, 0xd6, 0x20, 0x8f, 0xd5, 0xae, 0x8a, + 0x5c, 0x2a, 0x33, 0xed, 0x11, 0x01, 0x52, 0x90, + 0x0c, 0xa9, 0xc0, 0x91, 0xac, 0x03, 0x87, 0x40, + 0x50, 0xe1, 0x30, 0x35, 0xeb, 0xd0, 0x0f, 0xd8, + 0x81, 0x35, 0x63, 0x16, 0xba, 0x01, 0x2c, 0x26, + 0xb7, 0x59, 0x87, 0x57, 0x83, 0xfe, 0x1f, 0xff, + 0xc4, 0x00, 0x33, 0x11, 0x00, 0x01, 0x03, 0x03, + 0x02, 0x04, 0x03, 0x03, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x00, 0x05, 0x11, 0x12, 0x31, 0x06, 0x21, 0x40, + 0x41, 0x13, 0x14, 0x61, 0x50, 0x52, 0x71, 0x10, + 0x16, 0x22, 0x25, 0x32, 0x33, 0x35, 0x42, 0x51, + 0x60, 0x91, 0xb1, 0xe1, 0xff, 0xda, 0x00, 0x08, + 0x01, 0x03, 0x01, 0x01, 0x3f, 0x01, 0xf9, 0x22, + 0xc6, 0x5c, 0xc7, 0x43, 0x2d, 0xee, 0x6b, 0xe6, + 0xb5, 0xc0, 0x8c, 0x8d, 0x3f, 0xcf, 0xf9, 0x57, + 0x0b, 0x63, 0xd6, 0xd5, 0x25, 0x0f, 0x63, 0x9f, + 0xe9, 0x5b, 0xf6, 0xf6, 0x05, 0x87, 0xf1, 0x16, + 0xeb, 0xf2, 0xd7, 0x16, 0x65, 0x4e, 0xb6, 0xac, + 0x76, 0xab, 0x34, 0xc8, 0x71, 0x23, 0xa8, 0x3c, + 0x32, 0xa3, 0xe9, 0x4e, 0x6a, 0x75, 0xc2, 0xb4, + 0x8e, 0x46, 0x8a, 0x14, 0x9e, 0x6a, 0x1d, 0x75, + 0x84, 0xfd, 0x60, 0xdd, 0x76, 0xab, 0xc4, 0xe6, + 0x1b, 0x8c, 0xea, 0x0a, 0xc6, 0xac, 0x6d, 0x4b, + 0x4f, 0x91, 0xb3, 0x60, 0xfb, 0xbf, 0xdd, 0x59, + 0xd5, 0x1c, 0xc6, 0x43, 0x4d, 0xab, 0x24, 0x6f, + 0x5c, 0x4e, 0x94, 0xa6, 0x17, 0x2f, 0x7b, 0xac, + 0x86, 0x86, 0x9d, 0x7d, 0x08, 0x78, 0xe0, 0x1a, + 0x1c, 0x2d, 0x08, 0x8c, 0x85, 0x9c, 0x54, 0x4e, + 0x1e, 0x8f, 0x11, 0xe4, 0xbc, 0xda, 0x8e, 0x45, + 0x27, 0xb0, 0xab, 0x95, 0xbd, 0xff, 0x00, 0x3c, + 0x16, 0xe6, 0xcb, 0x55, 0x71, 0x06, 0xb5, 0xc7, + 0x6e, 0x22, 0x3e, 0xd2, 0x8e, 0x2a, 0xc3, 0x6b, + 0x76, 0xdc, 0x95, 0x99, 0x1b, 0x9a, 0xba, 0x43, + 0x4c, 0xd8, 0xab, 0x6e, 0x94, 0x9f, 0x0d, 0x65, + 0x1d, 0x5f, 0x3e, 0xd5, 0xc3, 0xb7, 0x65, 0xa9, + 0x5e, 0x55, 0xf3, 0xf0, 0xaf, 0x4a, 0x07, 0x35, + 0x39, 0x68, 0x72, 0xea, 0xca, 0x16, 0x79, 0x24, + 0x13, 0x52, 0x9e, 0x66, 0x45, 0xd5, 0x94, 0xea, + 0xfa, 0x29, 0x19, 0xa4, 0xa8, 0x29, 0x20, 0x8a, + 0x73, 0x48, 0x07, 0x34, 0xff, 0x00, 0xdf, 0x2b, + 0xe3, 0xd6, 0x32, 0xea, 0xa3, 0xb8, 0x97, 0x51, + 0xb8, 0xa7, 0xf8, 0xa0, 0xa9, 0x8d, 0x0d, 0x27, + 0x0b, 0x3d, 0xea, 0xcb, 0x7c, 0x79, 0x52, 0x43, + 0x52, 0x55, 0x90, 0x6a, 0xfd, 0x6a, 0x98, 0xec, + 0xb2, 0xeb, 0x69, 0xc8, 0x22, 0x85, 0xa6, 0x69, + 0x23, 0x2d, 0x9a, 0x97, 0x72, 0x66, 0xcc, 0xc2, + 0x59, 0x3c, 0xd5, 0x8d, 0xaa, 0x55, 0xfa, 0x64, + 0xb2, 0x46, 0xad, 0x23, 0xd3, 0xaf, 0x07, 0x49, + 0x04, 0x76, 0xab, 0x4c, 0xd1, 0x3e, 0x28, 0x20, + 0xf3, 0x1b, 0xd3, 0xae, 0x16, 0xdb, 0x2b, 0xa9, + 0x32, 0x17, 0x29, 0xe5, 0x3a, 0xbe, 0xfe, 0xc1, + 0xb7, 0xdc, 0x1d, 0xb7, 0xb9, 0xe2, 0x37, 0x47, + 0x89, 0xa2, 0x3a, 0xde, 0x95, 0xa4, 0xd2, 0xb0, + 0x49, 0x23, 0x6f, 0xdc, 0x7f, 0xff, 0xc4, 0x00, + 0x27, 0x11, 0x00, 0x02, 0x02, 0x01, 0x02, 0x04, + 0x07, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x03, 0x11, 0x04, + 0x12, 0x10, 0x21, 0x31, 0x40, 0x13, 0x14, 0x22, + 0x32, 0x41, 0x50, 0x61, 0x42, 0x60, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x02, 0x01, 0x01, 0x3f, 0x01, + 0xe0, 0xcc, 0x10, 0x64, 0xcf, 0x37, 0x5e, 0x25, + 0x76, 0xa5, 0xbc, 0xd7, 0xe8, 0x6f, 0xf6, 0x70, + 0xd2, 0x74, 0x9a, 0x94, 0x66, 0x71, 0xb4, 0xc1, + 0x85, 0x18, 0x80, 0x83, 0xdf, 0x5f, 0xec, 0xe1, + 0x45, 0x67, 0x3b, 0xa6, 0x4b, 0xdf, 0xf9, 0x2f, + 0xdc, 0x2c, 0x9a, 0x3c, 0xee, 0xef, 0x1c, 0x95, + 0x19, 0x10, 0xea, 0xdc, 0x46, 0xd4, 0xb3, 0xae, + 0x0c, 0x12, 0x9b, 0x57, 0xc3, 0x38, 0x9a, 0x4e, + 0xac, 0xe6, 0x6a, 0x2e, 0x5b, 0x71, 0x89, 0x43, + 0xec, 0x78, 0x0e, 0x46, 0x7b, 0xcd, 0x55, 0x3f, + 0xd0, 0x83, 0x82, 0x7a, 0x68, 0x62, 0x3e, 0x62, + 0xa9, 0x5a, 0x1b, 0x97, 0x59, 0xd3, 0x94, 0x1d, + 0x62, 0x72, 0x51, 0xde, 0x38, 0xdc, 0x31, 0x06, + 0x93, 0xd5, 0xf9, 0x35, 0x1a, 0x75, 0x0b, 0x94, + 0x9a, 0x7b, 0x50, 0x26, 0xd3, 0x0d, 0xf5, 0xe3, + 0xac, 0x5a, 0x9a, 0xe6, 0xcc, 0x4d, 0x3a, 0x2f, + 0xc7, 0x7e, 0x46, 0x79, 0x19, 0xa8, 0xaf, 0xc3, + 0x7e, 0x50, 0x28, 0x26, 0x22, 0xec, 0x50, 0x3e, + 0x86, 0xda, 0x85, 0x83, 0x13, 0xc9, 0xb2, 0xb0, + 0xc4, 0x1c, 0xbf, 0xd1, 0xff, 0x00, 0xff, 0xc4, + 0x00, 0x49, 0x10, 0x00, 0x01, 0x03, 0x02, 0x03, + 0x04, 0x04, 0x09, 0x06, 0x0a, 0x0b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, + 0x11, 0x05, 0x12, 0x21, 0x13, 0x31, 0x41, 0x51, + 0x14, 0x22, 0x32, 0x71, 0x06, 0x10, 0x15, 0x23, + 0x42, 0x61, 0x81, 0x91, 0xb1, 0x24, 0x33, 0x40, + 0x72, 0x73, 0xc1, 0x20, 0x43, 0x50, 0x74, 0x83, + 0x92, 0xb2, 0xc3, 0xd1, 0xf0, 0x16, 0x30, 0x34, + 0x52, 0x62, 0xa1, 0xc2, 0xd2, 0xe1, 0xe2, 0xf1, + 0xf2, 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, + 0x06, 0x3f, 0x02, 0xf1, 0x2e, 0x4b, 0xa1, 0x45, + 0x08, 0xde, 0x11, 0xbe, 0xbe, 0x66, 0x4f, 0xea, + 0xa7, 0xf8, 0xd3, 0xa6, 0x3a, 0x5c, 0x4e, 0xcf, + 0x7e, 0xd0, 0x01, 0xf9, 0x06, 0x5f, 0x70, 0xf8, + 0xf8, 0xa6, 0xdc, 0x81, 0xd6, 0x4f, 0xdf, 0x49, + 0x31, 0xc8, 0x0d, 0x25, 0x36, 0xf9, 0xdb, 0x53, + 0x6d, 0x15, 0x81, 0x91, 0x20, 0x6a, 0x6b, 0x45, + 0x03, 0xdd, 0xe2, 0xb1, 0x5a, 0x41, 0xf5, 0x9a, + 0xf9, 0xc4, 0xfb, 0xea, 0xc1, 0x69, 0x27, 0xd4, + 0x7e, 0x95, 0x2f, 0xb8, 0x7c, 0x7c, 0x51, 0x1c, + 0xd8, 0xb9, 0xd1, 0xf3, 0xdc, 0xae, 0xdd, 0x5d, + 0x2a, 0xfb, 0xd3, 0xb7, 0xbf, 0xb1, 0x3f, 0xf9, + 0x4f, 0xbe, 0xeb, 0x4e, 0x34, 0x97, 0x16, 0x72, + 0x95, 0x0b, 0x5e, 0x95, 0xaf, 0xe2, 0x8f, 0x8a, + 0x4c, 0xec, 0x49, 0xd7, 0x64, 0x3e, 0xf2, 0xee, + 0x02, 0x15, 0x95, 0x29, 0x1c, 0x05, 0x27, 0x05, + 0x05, 0xde, 0x84, 0x57, 0xbb, 0x3e, 0xbd, 0x8b, + 0xef, 0xa8, 0x53, 0x52, 0xe4, 0xc8, 0x8b, 0x4a, + 0xee, 0x95, 0x6a, 0xe3, 0x6b, 0xe6, 0x93, 0xec, + 0xac, 0xdf, 0x2b, 0x29, 0xe7, 0xd1, 0xd5, 0x4c, + 0xe2, 0x7e, 0x7d, 0x50, 0x9d, 0xfc, 0x6a, 0x1b, + 0xbe, 0x53, 0x7b, 0x58, 0xf2, 0xa7, 0x5d, 0x83, + 0xb5, 0x53, 0x6d, 0x9b, 0x15, 0xad, 0x19, 0x45, + 0xe9, 0xc8, 0x2c, 0x35, 0x24, 0xc8, 0x68, 0xe5, + 0x72, 0xed, 0x68, 0xdf, 0x79, 0xa4, 0xc8, 0x9c, + 0xb2, 0x84, 0x29, 0x59, 0x46, 0x51, 0x72, 0x4d, + 0x37, 0x32, 0x22, 0x8a, 0xd8, 0x5e, 0xeb, 0x8b, + 0x1a, 0x4b, 0x12, 0x5c, 0x52, 0xe4, 0xab, 0x50, + 0xc3, 0x29, 0xce, 0xba, 0x6a, 0x23, 0x6e, 0x3a, + 0xdc, 0xa7, 0x0d, 0x92, 0xcb, 0xcd, 0x94, 0x9d, + 0xd7, 0xfa, 0x03, 0xee, 0x45, 0x48, 0x5b, 0xe9, + 0x17, 0x4a, 0x54, 0x37, 0xd7, 0xcd, 0xc7, 0xfd, + 0x53, 0xfc, 0x69, 0xc8, 0xee, 0xa1, 0x90, 0xda, + 0xf7, 0xe5, 0x49, 0xbf, 0xc7, 0xc4, 0xa6, 0x9a, + 0x2a, 0xcd, 0x15, 0x8c, 0xcb, 0xb8, 0xa9, 0x33, + 0x9f, 0xec, 0x47, 0x68, 0xa8, 0x9f, 0xe7, 0xdb, + 0x51, 0xfa, 0x39, 0x56, 0xcd, 0xb0, 0x7b, 0x42, + 0xda, 0xd3, 0x72, 0x00, 0xcc, 0x06, 0x8a, 0x1c, + 0xc5, 0x21, 0x63, 0x72, 0x85, 0xfc, 0x48, 0xfb, + 0x4f, 0xdd, 0x54, 0x3f, 0xce, 0x7f, 0xd2, 0x6a, + 0x2a, 0x3c, 0x93, 0x89, 0x2f, 0x65, 0x19, 0x23, + 0x30, 0x8d, 0xd4, 0x3d, 0x5e, 0x7c, 0xaa, 0xdd, + 0x15, 0xb4, 0x31, 0x39, 0xbd, 0xab, 0xac, 0xa7, + 0xb3, 0x75, 0x01, 0x7a, 0x9f, 0x87, 0x47, 0x75, + 0x0e, 0x33, 0x21, 0x1e, 0x6c, 0xad, 0x5a, 0x22, + 0xfd, 0x95, 0x77, 0x8a, 0x6d, 0xa4, 0x2f, 0x6e, + 0xeb, 0x9e, 0x71, 0xe9, 0x17, 0xbe, 0xd5, 0x47, + 0x8d, 0x3f, 0x01, 0xcd, 0x60, 0x61, 0xb1, 0xca, + 0x55, 0xf6, 0xab, 0x1f, 0xcf, 0xba, 0xb1, 0x2c, + 0x0a, 0x49, 0xb3, 0xad, 0xa8, 0xad, 0x09, 0x3c, + 0xc6, 0x8a, 0xfb, 0xaa, 0x6e, 0x32, 0x60, 0x74, + 0xc8, 0x92, 0x06, 0x8e, 0xf0, 0x03, 0x4e, 0x3c, + 0x0e, 0x95, 0x10, 0x4d, 0x8c, 0xb8, 0x72, 0xdb, + 0x70, 0x29, 0xa7, 0x97, 0xe8, 0x9f, 0xac, 0x3e, + 0x83, 0xd3, 0xe3, 0xa7, 0x2e, 0xbe, 0x75, 0x23, + 0x77, 0x7f, 0x8f, 0x10, 0x75, 0x29, 0x25, 0x6f, + 0xb8, 0x1a, 0x16, 0x15, 0x88, 0x39, 0xb2, 0x5e, + 0x77, 0x96, 0x94, 0x76, 0x75, 0xb5, 0x58, 0x8b, + 0x1f, 0x5f, 0x89, 0x8f, 0xa8, 0x3e, 0x1e, 0x24, + 0xcf, 0x0e, 0x7c, 0x8c, 0x39, 0x6d, 0xbd, 0xba, + 0xbd, 0x8b, 0x7c, 0x6a, 0x14, 0x64, 0x2b, 0x3b, + 0xfb, 0x5d, 0xa6, 0x44, 0xea, 0x72, 0xd8, 0xeb, + 0x50, 0xe3, 0x3e, 0x24, 0xe7, 0x6d, 0x84, 0xa1, + 0x69, 0xd8, 0x13, 0xc2, 0xa4, 0x4c, 0x4c, 0x55, + 0x34, 0xd0, 0xea, 0x42, 0x8e, 0x45, 0x96, 0xed, + 0xb8, 0xdb, 0x80, 0xa9, 0x53, 0xa7, 0x49, 0x6d, + 0x53, 0xe5, 0x1e, 0x92, 0xb9, 0x67, 0xf1, 0x6a, + 0xe0, 0x9e, 0xee, 0x15, 0x22, 0x1e, 0x22, 0x17, + 0x9a, 0x33, 0x64, 0xc6, 0x25, 0x27, 0xaf, 0xfe, + 0x0a, 0x38, 0x93, 0xf3, 0xa6, 0x22, 0x5c, 0x87, + 0x54, 0xb7, 0xd3, 0x1d, 0xf2, 0x8b, 0x1b, 0xee, + 0x35, 0x12, 0x44, 0x27, 0x5e, 0x94, 0x84, 0xd9, + 0x6f, 0x67, 0x39, 0xd6, 0x2f, 0xda, 0xb9, 0xee, + 0xa9, 0x4c, 0xce, 0x61, 0xd7, 0xa0, 0x85, 0x82, + 0xcc, 0xe6, 0x1b, 0xba, 0x72, 0xab, 0x50, 0x15, + 0x50, 0x63, 0xe0, 0x30, 0x54, 0xb9, 0x19, 0xee, + 0xec, 0x90, 0xce, 0x40, 0x07, 0xae, 0x90, 0x8b, + 0xdf, 0x28, 0xb5, 0xfe, 0x80, 0xe3, 0x0e, 0x0b, + 0xb6, 0xe0, 0xca, 0x6b, 0x34, 0x87, 0x83, 0x91, + 0x46, 0xb9, 0x46, 0xf5, 0x52, 0xa4, 0x43, 0x67, + 0x64, 0xb6, 0xb5, 0x52, 0x53, 0xc5, 0x34, 0x98, + 0xd2, 0x1c, 0xd8, 0xb8, 0x95, 0x1d, 0xe3, 0x43, + 0x47, 0xe5, 0x8d, 0x7b, 0xe9, 0xe7, 0x53, 0xd4, + 0x68, 0xac, 0x95, 0x3a, 0xa1, 0x40, 0xec, 0x76, + 0xee, 0x7f, 0x7d, 0xdd, 0x6a, 0xc3, 0x41, 0x5a, + 0x50, 0xc0, 0x3c, 0x9f, 0x0f, 0xa4, 0x95, 0x65, + 0xda, 0x66, 0x39, 0x37, 0x5e, 0xf4, 0x33, 0x04, + 0xe6, 0xae, 0xc8, 0xf7, 0x57, 0x64, 0x55, 0xac, + 0x2d, 0xca, 0xbb, 0x22, 0xb4, 0x00, 0x57, 0x64, + 0x55, 0xb2, 0x8b, 0x72, 0xae, 0xaa, 0x42, 0x7b, + 0xbe, 0x86, 0x41, 0xd4, 0x1d, 0x2d, 0x4e, 0x32, + 0x47, 0x9b, 0x3d, 0x66, 0xcf, 0x31, 0x48, 0x40, + 0xf4, 0x8d, 0xa9, 0xb8, 0xed, 0x0b, 0x25, 0x03, + 0xf0, 0x11, 0xf6, 0x9f, 0xba, 0xa8, 0xe9, 0xc2, + 0xa6, 0xcb, 0x1b, 0x66, 0x4b, 0xa5, 0x84, 0x2f, + 0x4e, 0xaf, 0x21, 0x4b, 0x42, 0xd5, 0xb1, 0x9c, + 0x84, 0xd9, 0xe4, 0x36, 0xab, 0x1f, 0xac, 0x9a, + 0xc7, 0x31, 0x37, 0x25, 0x3d, 0x36, 0x43, 0x32, + 0x8c, 0x66, 0x83, 0xeb, 0x25, 0x29, 0xd4, 0x6b, + 0x6f, 0x6d, 0x31, 0x88, 0x7f, 0x4a, 0xe5, 0x74, + 0xa7, 0x53, 0x9f, 0x23, 0x44, 0x14, 0xa0, 0xf2, + 0xcb, 0x4d, 0xe1, 0xee, 0xcf, 0x53, 0x2f, 0x09, + 0x4a, 0x53, 0x98, 0x83, 0x7b, 0xd4, 0xd5, 0xae, + 0x2c, 0x3b, 0xcd, 0xad, 0xea, 0xac, 0x3f, 0x07, + 0x47, 0x84, 0x13, 0x96, 0xdc, 0xac, 0x97, 0x71, + 0x4a, 0xd4, 0x66, 0x55, 0xa9, 0xd4, 0xbb, 0x8b, + 0xcb, 0xc4, 0x20, 0x3c, 0xc2, 0x81, 0x59, 0x5e, + 0x57, 0x18, 0x58, 0xd4, 0x1f, 0x8d, 0x4c, 0xda, + 0xf8, 0x41, 0x3a, 0x3e, 0xc3, 0x2d, 0xb2, 0x2a, + 0xf7, 0xbd, 0x46, 0xc2, 0x25, 0x62, 0x0a, 0xc5, + 0x22, 0xbe, 0x50, 0x2e, 0xe0, 0xeb, 0x0c, 0xd5, + 0x1f, 0x0a, 0x46, 0x27, 0x31, 0x10, 0x9e, 0x29, + 0x51, 0x6c, 0x3c, 0x79, 0x5e, 0xc2, 0x9e, 0x40, + 0x71, 0xc6, 0xba, 0x9a, 0x2d, 0xb5, 0x59, 0x43, + 0xdb, 0x53, 0xe7, 0xbd, 0x88, 0xcb, 0x54, 0xbb, + 0x38, 0xa4, 0xbb, 0xb5, 0x37, 0x4e, 0x4d, 0xd6, + 0xa6, 0xe1, 0x62, 0xf2, 0x5d, 0x79, 0x13, 0x1a, + 0x0a, 0x64, 0xbc, 0xab, 0xd8, 0x9d, 0x53, 0x6e, + 0xfa, 0x6a, 0x26, 0x1e, 0xb5, 0x37, 0x3a, 0x49, + 0x24, 0x29, 0x06, 0xc5, 0x28, 0x48, 0xba, 0x8d, + 0x4f, 0x91, 0x37, 0x10, 0x96, 0xeb, 0xa5, 0x45, + 0xa0, 0x76, 0xa7, 0xa8, 0x2c, 0x0d, 0xc7, 0xae, + 0xb1, 0x04, 0x3b, 0xe1, 0x04, 0xe6, 0x13, 0x18, + 0x80, 0x32, 0x2a, 0xf7, 0xdf, 0xfc, 0x29, 0xb2, + 0x71, 0x97, 0xb1, 0x48, 0xab, 0x41, 0x43, 0xcc, + 0xc8, 0x55, 0x94, 0xdf, 0x25, 0x8f, 0x75, 0xaa, + 0x63, 0x89, 0x93, 0x22, 0x76, 0x1b, 0x16, 0x46, + 0xc9, 0x48, 0x7d, 0x79, 0x85, 0x8f, 0x0f, 0xf9, + 0xa7, 0xf1, 0x5c, 0x32, 0x5b, 0xad, 0x14, 0x27, + 0x3a, 0x16, 0xca, 0xf2, 0x90, 0x79, 0x1a, 0xc2, + 0xf2, 0x62, 0xf2, 0xe1, 0xc7, 0xe8, 0xa9, 0x75, + 0xc7, 0xc2, 0xf3, 0x2d, 0xe7, 0x17, 0xad, 0xbb, + 0x85, 0x4a, 0xc0, 0xd5, 0xe1, 0x04, 0xe4, 0xb4, + 0xce, 0x7b, 0x3a, 0x15, 0xd6, 0x36, 0xac, 0x49, + 0x6e, 0xcb, 0x5e, 0x25, 0x75, 0xa3, 0xa2, 0xc9, + 0x7b, 0x7a, 0x6f, 0xbc, 0x1e, 0xeb, 0x54, 0x79, + 0xed, 0xf8, 0x5b, 0x29, 0x52, 0x9c, 0x40, 0x5f, + 0x56, 0xca, 0x6d, 0x27, 0x96, 0x5a, 0x0c, 0xe2, + 0x8a, 0xda, 0x4b, 0x69, 0x6a, 0x4e, 0xda, 0xf7, + 0xda, 0x0e, 0x0a, 0xfc, 0x1d, 0x9b, 0xa2, 0xca, + 0x1d, 0x95, 0x8d, 0xe2, 0x81, 0x69, 0xc6, 0x56, + 0x01, 0xb8, 0x55, 0xed, 0x43, 0x37, 0x6a, 0xda, + 0xfe, 0x02, 0x3e, 0xd3, 0xf7, 0x55, 0x80, 0x7d, + 0x83, 0x9f, 0x7d, 0x0f, 0x08, 0xf0, 0x5b, 0xa1, + 0xb0, 0xac, 0xcf, 0x34, 0x9f, 0x47, 0xfe, 0xa6, + 0xb1, 0x01, 0x8a, 0x84, 0xa6, 0x34, 0xc9, 0xaa, + 0x4a, 0x82, 0xbb, 0x37, 0x55, 0xad, 0xaf, 0x0a, + 0xdb, 0x61, 0x58, 0xa3, 0x91, 0xd7, 0xe8, 0x87, + 0x3f, 0xdc, 0x2b, 0x12, 0xc2, 0x71, 0x17, 0x4c, + 0x85, 0x43, 0xdc, 0xe2, 0x8e, 0x62, 0x35, 0xb1, + 0x17, 0xe3, 0x58, 0x0f, 0xe8, 0x7f, 0x6c, 0xd3, + 0xff, 0x00, 0x50, 0xfc, 0x2b, 0x12, 0xf2, 0x76, + 0x27, 0xe4, 0xe2, 0x9c, 0xb9, 0xbc, 0xd8, 0x56, + 0x6d, 0xf4, 0xfb, 0x38, 0xf2, 0x56, 0xee, 0x36, + 0x16, 0x43, 0x4f, 0xb8, 0xbb, 0xa7, 0x37, 0x77, + 0xc2, 0xb0, 0xe5, 0x2b, 0x40, 0x42, 0x2c, 0x7d, + 0x86, 0x9e, 0x24, 0xd8, 0x04, 0x1f, 0x85, 0x4e, + 0xd3, 0xd0, 0x91, 0xf0, 0x35, 0xe0, 0xee, 0x37, + 0x1a, 0xe1, 0xf8, 0x8d, 0x21, 0x2a, 0x50, 0xe5, + 0xe8, 0x9f, 0x7d, 0x63, 0x9e, 0x11, 0xc8, 0x46, + 0x54, 0x88, 0x66, 0x2c, 0x74, 0x9e, 0x1d, 0x5e, + 0xb9, 0xf7, 0xd4, 0xcf, 0xb7, 0x3f, 0xb2, 0x2b, + 0x16, 0xf9, 0x7c, 0xb8, 0x5b, 0x35, 0x0f, 0xec, + 0xae, 0x65, 0xcd, 0xa9, 0xdf, 0x53, 0x1f, 0x77, + 0x11, 0x76, 0x53, 0x4f, 0x84, 0x00, 0xa9, 0x6b, + 0xba, 0x81, 0x17, 0xd2, 0xfe, 0xda, 0xf0, 0xc2, + 0x34, 0x96, 0xc3, 0xac, 0xb8, 0xfa, 0x42, 0x92, + 0x7b, 0x8d, 0x4f, 0xc3, 0xd2, 0x4b, 0xb8, 0x56, + 0x20, 0x8b, 0x24, 0xab, 0x77, 0xff, 0x00, 0x42, + 0xb0, 0x9f, 0xcd, 0x5a, 0xfd, 0x91, 0x58, 0x9f, + 0xe9, 0x3e, 0xea, 0x4c, 0x2c, 0x4e, 0xdd, 0x1e, + 0x5a, 0xf6, 0x42, 0xfa, 0x75, 0xb7, 0x8d, 0x78, + 0x6e, 0xa2, 0xf6, 0x13, 0x8a, 0xb8, 0xcb, 0x9c, + 0x03, 0x9a, 0x1f, 0xd6, 0x15, 0x88, 0x44, 0x9e, + 0xe1, 0x7d, 0x70, 0xd6, 0x90, 0x97, 0x54, 0x6e, + 0x4d, 0xef, 0xa5, 0xf8, 0xf6, 0x7f, 0xab, 0x18, + 0xc9, 0xc6, 0x55, 0xe5, 0x00, 0xac, 0xd9, 0x84, + 0x71, 0x97, 0x75, 0xb7, 0x5e, 0x98, 0xc5, 0x46, + 0x2b, 0xb2, 0x76, 0x38, 0xca, 0xd2, 0x03, 0x00, + 0xa4, 0x0e, 0x37, 0xd7, 0x5b, 0xeb, 0x4a, 0x42, + 0xc0, 0x52, 0x54, 0x2c, 0x41, 0xe3, 0x58, 0x8e, + 0x14, 0xda, 0xd4, 0x88, 0xb2, 0xdd, 0xda, 0xa7, + 0x4f, 0x9b, 0xdd, 0xf7, 0x8a, 0xd8, 0xc2, 0xf0, + 0x9e, 0x6c, 0x78, 0x7b, 0x83, 0x2a, 0x4e, 0x72, + 0x07, 0xd6, 0xbd, 0x2d, 0xa8, 0xd9, 0x96, 0xe3, + 0x86, 0xee, 0x3c, 0xe6, 0xaa, 0x59, 0xa4, 0x62, + 0xcb, 0xc5, 0x8a, 0x24, 0xb4, 0x41, 0x67, 0x2b, + 0x02, 0xc8, 0xb1, 0xb8, 0xe3, 0xad, 0x29, 0x86, + 0xe4, 0x86, 0x64, 0x29, 0x39, 0x76, 0xfb, 0x3b, + 0xf7, 0x9c, 0xb7, 0xa7, 0x16, 0xc6, 0x22, 0xa7, + 0x9a, 0x77, 0xe7, 0x1a, 0x5b, 0x43, 0x5e, 0x5a, + 0xde, 0x9b, 0x9c, 0xd4, 0x95, 0xe1, 0xf3, 0xd3, + 0x6f, 0x3c, 0x84, 0xde, 0xf6, 0xdd, 0xa7, 0x3a, + 0x8e, 0x31, 0x19, 0x8b, 0x77, 0x11, 0x63, 0xb1, + 0x39, 0x94, 0x06, 0xd5, 0xea, 0xd2, 0xb6, 0x13, + 0x3c, 0x28, 0x99, 0x22, 0x19, 0xd1, 0x4d, 0x25, + 0xb0, 0x92, 0x47, 0x2b, 0xde, 0xbc, 0x91, 0x05, + 0xee, 0x82, 0xc6, 0x4d, 0x99, 0x56, 0x4c, 0xe7, + 0x2f, 0x1f, 0x69, 0xe7, 0x4e, 0x60, 0xf2, 0xa5, + 0x74, 0xc8, 0xe5, 0x05, 0xa4, 0x2b, 0x67, 0x94, + 0xa5, 0x36, 0xff, 0x00, 0x3a, 0x4e, 0x0b, 0x16, + 0x4f, 0x46, 0x6f, 0x26, 0xcd, 0x4e, 0xec, 0xee, + 0x48, 0xf4, 0xbd, 0xf5, 0x2a, 0x2c, 0x4c, 0x52, + 0xe8, 0x7b, 0x51, 0xb4, 0x60, 0x1c, 0x8a, 0xe7, + 0xbf, 0x97, 0x0a, 0x75, 0x50, 0xf1, 0xf9, 0x51, + 0xd4, 0xef, 0x6f, 0x66, 0x80, 0x2f, 0x4c, 0x4a, + 0x99, 0x8d, 0xca, 0xc4, 0x36, 0x17, 0x53, 0x6d, + 0x3c, 0x3a, 0xa1, 0x5c, 0x0d, 0x4a, 0x9a, 0x71, + 0x33, 0x27, 0xa5, 0x9c, 0xcf, 0xa0, 0xb2, 0x00, + 0x51, 0xf5, 0x6b, 0xa5, 0x3b, 0x0e, 0x5a, 0x73, + 0x36, 0xbe, 0x3c, 0x52, 0x79, 0x8a, 0x8d, 0x0d, + 0x2e, 0xe6, 0x53, 0x0c, 0xa5, 0xa0, 0xe1, 0x4f, + 0x21, 0x6b, 0xda, 0x8e, 0x30, 0x9c, 0x58, 0xaa, + 0x62, 0xcd, 0xdc, 0xbc, 0x71, 0x95, 0x57, 0xde, + 0x2d, 0x7d, 0x29, 0x70, 0x5e, 0x51, 0x42, 0x14, + 0xa4, 0xab, 0x32, 0x77, 0x8b, 0x1b, 0xd1, 0x61, + 0x8f, 0x0a, 0x26, 0xb7, 0x0b, 0x70, 0x69, 0x49, + 0xcc, 0xa0, 0x39, 0x66, 0xbd, 0x74, 0x68, 0x60, + 0xd8, 0x9c, 0xcb, 0x5a, 0xfb, 0x4b, 0x3e, 0xbf, + 0xc8, 0x9f, 0xff, 0xc4, 0x00, 0x2a, 0x10, 0x01, + 0x00, 0x02, 0x02, 0x01, 0x03, 0x03, 0x03, 0x04, + 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x81, + 0x10, 0x71, 0xf0, 0x91, 0xa1, 0xb1, 0x30, 0x40, + 0xc1, 0xd1, 0x20, 0x50, 0xf1, 0xe1, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, 0x3f, 0x21, + 0xf4, 0xa0, 0xdb, 0x20, 0x1d, 0xab, 0x94, 0xf4, + 0x9a, 0x7d, 0x74, 0x1c, 0xe2, 0xf5, 0x4b, 0xd2, + 0x20, 0xde, 0x22, 0xbf, 0xdf, 0xfc, 0x07, 0x44, + 0xe2, 0x05, 0x28, 0xd0, 0x2e, 0xf1, 0x05, 0x3b, + 0xa7, 0x6a, 0xde, 0x71, 0x2e, 0xc2, 0xe4, 0x5c, + 0x12, 0x94, 0xff, 0x00, 0x45, 0x7e, 0x9d, 0x94, + 0x90, 0x13, 0xfe, 0x3e, 0x76, 0x72, 0x40, 0xfe, + 0xe2, 0xe5, 0xcf, 0x80, 0xe8, 0x9c, 0x4b, 0x25, + 0x57, 0x7f, 0x87, 0x77, 0x88, 0x2a, 0xd7, 0x32, + 0x0e, 0x38, 0xa2, 0xc1, 0xc7, 0xc8, 0x07, 0x4f, + 0x10, 0x41, 0x49, 0xca, 0xf7, 0x23, 0x98, 0xcc, + 0xe8, 0xdf, 0x5e, 0x06, 0xf0, 0x06, 0x61, 0xe0, + 0x14, 0xe9, 0x75, 0xf9, 0x10, 0x6e, 0x56, 0xa8, + 0x87, 0xba, 0x17, 0xe1, 0x89, 0x04, 0x49, 0x61, + 0xaa, 0xbd, 0xe3, 0xd4, 0xb6, 0x04, 0x80, 0xc0, + 0xed, 0x59, 0xcc, 0x10, 0x32, 0x48, 0x1d, 0x05, + 0xfc, 0xcc, 0x7d, 0x71, 0x17, 0x18, 0xf1, 0x12, + 0xb1, 0xb7, 0xf0, 0xc5, 0xeb, 0xc4, 0xb0, 0x38, + 0x8a, 0xa1, 0x1a, 0x44, 0xe2, 0x1f, 0x99, 0xb1, + 0xd1, 0xd6, 0x8d, 0x79, 0x88, 0x49, 0xf8, 0x8b, + 0xf0, 0x71, 0xd7, 0xf6, 0x19, 0x72, 0xce, 0x05, + 0x37, 0x8f, 0x6b, 0x95, 0xf6, 0x24, 0x34, 0xc1, + 0x91, 0x36, 0xf4, 0x64, 0x54, 0xf5, 0x25, 0xd5, + 0xfe, 0x62, 0x4c, 0xae, 0xf9, 0xdc, 0x40, 0xe3, + 0x2c, 0xb9, 0x0f, 0xf9, 0x3c, 0xc3, 0x1b, 0x77, + 0xfc, 0x43, 0xb5, 0x01, 0x37, 0xdf, 0xd3, 0xe0, + 0x77, 0x43, 0xf4, 0x71, 0xde, 0x45, 0x12, 0xf0, + 0x67, 0x3f, 0xaa, 0x62, 0x10, 0xb2, 0x09, 0x6a, + 0x1c, 0x78, 0xf7, 0xdc, 0x33, 0xa8, 0x72, 0x05, + 0x85, 0x38, 0xc9, 0x7d, 0x71, 0xda, 0x12, 0x7e, + 0x4c, 0x32, 0x9b, 0xf2, 0x67, 0x1d, 0xa3, 0x48, + 0xd4, 0xcd, 0x62, 0x0f, 0xb8, 0x43, 0x85, 0xc5, + 0x8e, 0x92, 0xb3, 0xee, 0xfa, 0xc4, 0x13, 0x99, + 0x87, 0x0b, 0x84, 0x6a, 0xc3, 0x3c, 0x4a, 0x9f, + 0x22, 0xd5, 0xc2, 0x6e, 0x07, 0x54, 0xe3, 0xac, + 0x3f, 0x5d, 0x2c, 0x89, 0x38, 0xff, 0x00, 0x50, + 0xfb, 0x3d, 0x73, 0x9d, 0x06, 0xb0, 0x65, 0xf1, + 0x96, 0x62, 0xe4, 0x50, 0x58, 0x13, 0x8f, 0xac, + 0x50, 0x82, 0xd9, 0xb4, 0x79, 0xc4, 0xf8, 0xbe, + 0x89, 0x74, 0x5c, 0xb8, 0x61, 0x50, 0x5d, 0xfd, + 0xf4, 0xd2, 0xe5, 0xe5, 0xa3, 0x5b, 0x42, 0xd3, + 0x8b, 0x62, 0x40, 0x56, 0x5c, 0xa1, 0x13, 0xbc, + 0x4f, 0x82, 0xd0, 0xd2, 0x94, 0x75, 0xb8, 0xf1, + 0x16, 0x6b, 0xb4, 0x27, 0x8b, 0x76, 0x0d, 0x8e, + 0xfd, 0x88, 0xdf, 0xee, 0x54, 0x83, 0x5a, 0x6e, + 0xea, 0xbb, 0x7b, 0x42, 0xd2, 0x68, 0x0b, 0xd4, + 0x15, 0xba, 0x79, 0xeb, 0x33, 0x44, 0x58, 0x64, + 0x01, 0xcc, 0xaa, 0xe3, 0x58, 0xa0, 0x0e, 0x55, + 0x9c, 0x20, 0xd6, 0x3a, 0x6a, 0x6c, 0x27, 0x4e, + 0x5a, 0xdb, 0x9e, 0x5b, 0x7a, 0x47, 0x6a, 0xd1, + 0xef, 0x51, 0xfa, 0xf5, 0x2d, 0x97, 0x23, 0xd9, + 0x84, 0xd5, 0x34, 0xb4, 0xe9, 0x0f, 0x48, 0x25, + 0xc7, 0x60, 0xd7, 0x37, 0x93, 0x70, 0x80, 0x30, + 0xcf, 0x97, 0x9b, 0x09, 0x43, 0xbe, 0x16, 0x8d, + 0xa7, 0x0a, 0x48, 0x46, 0x5b, 0xa3, 0xab, 0x06, + 0x60, 0x1f, 0x01, 0xa8, 0x28, 0x28, 0xc0, 0x1c, + 0x4b, 0xdf, 0x0b, 0xac, 0x5c, 0xb4, 0x9d, 0x1e, + 0xbb, 0x8d, 0x57, 0x55, 0xc4, 0x1c, 0x3a, 0x94, + 0xb5, 0xe9, 0x6d, 0x5c, 0x7d, 0xa6, 0x4f, 0x8d, + 0x62, 0x7f, 0xc1, 0x97, 0x99, 0x8e, 0x84, 0x5d, + 0x6a, 0xaf, 0x29, 0x33, 0xf3, 0x1d, 0x18, 0x87, + 0xd0, 0x4f, 0x45, 0x4c, 0x4b, 0x97, 0xe9, 0x72, + 0xfd, 0x2e, 0x5c, 0xb9, 0x7f, 0xe6, 0x97, 0x0c, + 0x70, 0x4a, 0x5c, 0x91, 0xf6, 0x09, 0x63, 0x97, + 0xfa, 0xd4, 0x5d, 0xa8, 0x4f, 0x96, 0xa6, 0x39, + 0x19, 0xee, 0xf2, 0xca, 0xf5, 0xf8, 0x1d, 0xd1, + 0x95, 0x29, 0xca, 0x6c, 0xdb, 0xec, 0x16, 0x93, + 0x2b, 0x44, 0x87, 0x4a, 0xed, 0x83, 0xf6, 0x71, + 0x07, 0xa7, 0x3b, 0x4a, 0x0e, 0xe6, 0xd3, 0x65, + 0xb8, 0x49, 0xb9, 0xdb, 0x8e, 0x98, 0x89, 0xfd, + 0x5b, 0xe0, 0x1c, 0x59, 0x7b, 0x07, 0x54, 0xb5, + 0xde, 0xe6, 0xb8, 0xa8, 0xd7, 0x13, 0x55, 0x09, + 0x64, 0x2e, 0x8e, 0x9a, 0x1e, 0x49, 0xaa, 0xcf, + 0x71, 0x8d, 0xdf, 0xb4, 0xa5, 0x33, 0xd7, 0x42, + 0xa1, 0xbe, 0xa3, 0xe1, 0x98, 0x33, 0x55, 0xa5, + 0xa4, 0x9c, 0x18, 0x96, 0xda, 0x5a, 0xdd, 0xc1, + 0x84, 0x81, 0x35, 0x02, 0x12, 0x06, 0x9d, 0x8f, + 0x3d, 0x65, 0x17, 0x9d, 0x08, 0x16, 0x2e, 0x83, + 0x1e, 0xf5, 0x37, 0x1f, 0x26, 0x87, 0x4e, 0x38, + 0x22, 0x64, 0x49, 0x15, 0x1d, 0x83, 0x6e, 0x66, + 0x73, 0xba, 0xaa, 0xee, 0xd7, 0x19, 0x80, 0x62, + 0x16, 0x5d, 0x5e, 0xfd, 0x0d, 0xd9, 0x75, 0x2f, + 0xf1, 0x2a, 0x6d, 0x04, 0xf0, 0xd6, 0xbb, 0x21, + 0x75, 0x7b, 0x0b, 0x50, 0x6b, 0xf7, 0xd4, 0x7b, + 0x27, 0x5f, 0x10, 0x72, 0x60, 0x7f, 0x3e, 0x66, + 0xff, 0x00, 0x1c, 0x1a, 0x05, 0x63, 0x5c, 0xca, + 0xed, 0x10, 0x56, 0x97, 0x0b, 0x7d, 0xc3, 0x86, + 0xc8, 0xfe, 0x98, 0x0d, 0x41, 0x6b, 0xb7, 0x1a, + 0xac, 0x6a, 0x33, 0x66, 0x1c, 0x0b, 0xec, 0x3c, + 0x35, 0xe3, 0xfc, 0x6e, 0x9b, 0x3b, 0x7f, 0xfe, + 0xbb, 0x43, 0x7a, 0x75, 0x34, 0x53, 0xd2, 0xa6, + 0x2b, 0x60, 0xc3, 0x57, 0xea, 0xcf, 0x81, 0xdd, + 0x10, 0xc2, 0x1b, 0xb4, 0x35, 0xc5, 0x9c, 0xb5, + 0xf5, 0x0e, 0x25, 0xf2, 0x2e, 0x80, 0x12, 0x1e, + 0xe6, 0x9e, 0xb5, 0x01, 0xc1, 0x72, 0x1c, 0x9d, + 0x34, 0xbf, 0x68, 0xe9, 0x0b, 0x6a, 0x07, 0xd2, + 0xd6, 0x62, 0x65, 0xee, 0x4c, 0x4f, 0x97, 0xb4, + 0xf7, 0xb3, 0x41, 0xe9, 0xbd, 0x7f, 0xec, 0xc2, + 0x9f, 0xea, 0xae, 0x0a, 0x6e, 0xb6, 0xfb, 0x10, + 0xb0, 0x9c, 0xa7, 0x36, 0x47, 0xde, 0x00, 0x84, + 0x2a, 0xf1, 0x01, 0x32, 0xb2, 0xc7, 0x78, 0x2c, + 0x5b, 0x6f, 0x4b, 0xdf, 0x83, 0xf3, 0x8a, 0x03, + 0xa5, 0x41, 0x60, 0xf7, 0x5b, 0xf7, 0xe9, 0xe9, + 0xd1, 0x4a, 0x5b, 0x77, 0xba, 0xf2, 0xb5, 0x2d, + 0x70, 0xad, 0x18, 0x3a, 0x14, 0xd2, 0x88, 0x21, + 0xfe, 0xbd, 0xff, 0x00, 0x24, 0x7a, 0x68, 0xdf, + 0x29, 0x13, 0xdb, 0x47, 0x73, 0xed, 0x25, 0x7c, + 0xde, 0xd1, 0x41, 0x00, 0x66, 0x8c, 0x5e, 0xe1, + 0xc1, 0xeb, 0x47, 0x35, 0x08, 0x45, 0x2c, 0x9e, + 0x0c, 0x3f, 0x89, 0x56, 0x95, 0x61, 0x32, 0xae, + 0x83, 0xb7, 0x7f, 0xd2, 0x0a, 0x81, 0xa7, 0x86, + 0x69, 0x67, 0x1b, 0xb6, 0x8e, 0x9d, 0x62, 0xae, + 0x3a, 0xc3, 0x29, 0xa2, 0xc7, 0x6d, 0x9f, 0x77, + 0x68, 0xa4, 0x58, 0x7d, 0x81, 0xd8, 0xca, 0x4e, + 0x80, 0x32, 0x7a, 0x86, 0x72, 0x1f, 0x45, 0xae, + 0xf1, 0x75, 0x07, 0x43, 0xe8, 0x85, 0x1f, 0x89, + 0x92, 0x1c, 0x6f, 0xf4, 0x87, 0x68, 0x67, 0x3e, + 0x29, 0x55, 0x34, 0xe8, 0x5e, 0x77, 0x05, 0xed, + 0x56, 0x18, 0xf0, 0x75, 0x33, 0xce, 0x2f, 0x98, + 0x0f, 0x1e, 0x81, 0x58, 0xbb, 0x1a, 0x2a, 0xe7, + 0x0c, 0x73, 0x2f, 0x31, 0xb1, 0x87, 0x51, 0x96, + 0x21, 0x2c, 0x2a, 0xbb, 0x0d, 0xdb, 0xaf, 0x7f, + 0xa4, 0xa0, 0x4a, 0xef, 0x47, 0xae, 0xfc, 0x46, + 0xef, 0x91, 0x2c, 0x31, 0x0e, 0x53, 0x67, 0xdd, + 0x1d, 0x91, 0xc0, 0x0e, 0xd0, 0x1c, 0xb6, 0x1c, + 0x8e, 0x38, 0x80, 0xd7, 0x8a, 0x83, 0xfc, 0x0b, + 0xc3, 0x6d, 0xe6, 0xa2, 0x28, 0x3d, 0xaa, 0x61, + 0x2b, 0xcf, 0x0f, 0xca, 0x64, 0x8b, 0x8b, 0xaa, + 0x73, 0x9e, 0xec, 0xb1, 0x63, 0x00, 0xc5, 0xa5, + 0x07, 0x35, 0x77, 0xfc, 0xc7, 0x13, 0x6d, 0xba, + 0x69, 0x46, 0x8b, 0x71, 0xed, 0x29, 0xea, 0xb0, + 0x3d, 0x87, 0x78, 0x80, 0x5b, 0x08, 0x62, 0x98, + 0xc9, 0xda, 0xea, 0xfc, 0xc4, 0xfe, 0x3c, 0x18, + 0xf2, 0x91, 0xf4, 0x94, 0xfb, 0x71, 0x5d, 0x0e, + 0x1f, 0x4a, 0xf3, 0x1d, 0x4a, 0xfb, 0x1c, 0x5f, + 0xe2, 0x26, 0x6e, 0xd1, 0x5f, 0x52, 0xbf, 0x8f, + 0xf4, 0x9f, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, + 0x91, 0x92, 0xac, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0xb8, 0xfb, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, + 0x92, 0x49, 0x26, 0xba, 0x16, 0x58, 0x80, 0x01, + 0x04, 0x00, 0x49, 0x24, 0x92, 0x49, 0x24, 0x90, + 0xd6, 0xc4, 0xe4, 0x40, 0x24, 0x02, 0x00, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x43, 0x1e, 0xf1, 0x31, + 0x60, 0x00, 0x09, 0x00, 0x92, 0x49, 0x24, 0x92, + 0x49, 0x20, 0x29, 0x33, 0x55, 0x92, 0x41, 0x04, + 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x24, 0x5a, 0x09, 0x20, 0x80, 0x00, 0x20, 0x92, + 0x09, 0x04, 0x92, 0x01, 0x24, 0x33, 0x19, 0x04, + 0x12, 0x40, 0x20, 0x12, 0x08, 0x20, 0x00, 0x01, + 0x20, 0x92, 0x49, 0x24, 0x80, 0x48, 0x20, 0x90, + 0x49, 0x20, 0x10, 0x00, 0x00, 0x82, 0x49, 0x24, + 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x3f, 0xff, 0xc4, 0x00, 0x27, + 0x11, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x03, + 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x11, 0x21, 0x31, 0x41, 0x51, + 0x40, 0x61, 0x71, 0x81, 0x91, 0xb1, 0x10, 0x60, + 0xa1, 0xf1, 0xc1, 0xd1, 0xf0, 0xff, 0xda, 0x00, + 0x08, 0x01, 0x03, 0x01, 0x01, 0x3f, 0x10, 0xfa, + 0x53, 0x7f, 0x71, 0xa3, 0x9e, 0xf0, 0xb8, 0xa9, + 0xe5, 0xb4, 0x34, 0x29, 0x37, 0x95, 0xff, 0x00, + 0x04, 0x2f, 0x32, 0xd5, 0x33, 0xab, 0xd7, 0xe0, + 0xbd, 0xdf, 0x86, 0x15, 0x62, 0xb0, 0x67, 0xde, + 0x02, 0x49, 0x05, 0xb7, 0x88, 0xac, 0xac, 0x73, + 0x0e, 0x33, 0x0a, 0x35, 0x45, 0x28, 0xef, 0x32, + 0x40, 0x3c, 0x75, 0x9a, 0xb4, 0x4b, 0x0d, 0x60, + 0x7a, 0xef, 0xc3, 0x32, 0x34, 0xe6, 0xbf, 0x31, + 0xc2, 0x31, 0x1b, 0xad, 0xe2, 0x54, 0x88, 0x34, + 0x34, 0xcd, 0xfe, 0xd0, 0x32, 0x1c, 0xf0, 0x85, + 0x53, 0x94, 0x7b, 0x53, 0xd6, 0x5e, 0xf1, 0x52, + 0xf1, 0xfe, 0x65, 0xab, 0xf9, 0x63, 0xfa, 0x8c, + 0xd9, 0x66, 0xb5, 0x5a, 0x78, 0x82, 0xae, 0xdd, + 0x94, 0xac, 0x6a, 0x19, 0xcd, 0x5f, 0x1e, 0x20, + 0xcf, 0x87, 0xf6, 0x05, 0x42, 0xe8, 0xb8, 0xd3, + 0x38, 0x26, 0xfe, 0x75, 0x3c, 0xc7, 0x4b, 0x66, + 0xbd, 0xba, 0xb6, 0xc1, 0xa1, 0x8e, 0xae, 0x09, + 0xab, 0xe2, 0x50, 0x1d, 0x90, 0x94, 0xaa, 0x8a, + 0x0f, 0x39, 0xa8, 0x15, 0x22, 0xad, 0x7b, 0xd4, + 0x65, 0xae, 0xcd, 0x62, 0x19, 0x56, 0x18, 0x51, + 0x06, 0xcb, 0x7c, 0xc1, 0xbe, 0xab, 0x5c, 0xc7, + 0xa2, 0x96, 0xc9, 0xcf, 0x80, 0xe1, 0xde, 0x24, + 0x7c, 0x11, 0x6b, 0x0f, 0xa6, 0xce, 0x92, 0x8a, + 0xc1, 0xa4, 0x6a, 0xb9, 0x75, 0xef, 0x12, 0x40, + 0xf0, 0x1b, 0x79, 0x8d, 0x44, 0x9b, 0x61, 0xf9, + 0xd7, 0xe2, 0x5a, 0xb6, 0xcd, 0x3a, 0xc6, 0xe9, + 0x08, 0xd8, 0x53, 0xa2, 0x5b, 0x38, 0xa8, 0x6e, + 0x31, 0x5f, 0x80, 0x1f, 0x5a, 0x23, 0xa5, 0x6a, + 0x7f, 0x53, 0x3d, 0x7b, 0x0f, 0xaf, 0x93, 0x64, + 0x8a, 0xc5, 0x51, 0xc6, 0xd6, 0x91, 0xee, 0x49, + 0xab, 0xfb, 0x8f, 0xff, 0xc4, 0x00, 0x1f, 0x11, + 0x01, 0x01, 0x01, 0x00, 0x03, 0x01, 0x00, 0x02, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x11, 0x21, 0x31, 0x40, 0x41, 0x10, + 0x50, 0x51, 0x60, 0x81, 0xff, 0xda, 0x00, 0x08, + 0x01, 0x02, 0x01, 0x01, 0x3f, 0x10, 0xfc, 0x39, + 0xa0, 0xb9, 0x46, 0x4f, 0x5d, 0xb7, 0x3f, 0xe7, + 0xbf, 0xbe, 0xc3, 0x19, 0x06, 0x76, 0x08, 0xe0, + 0x88, 0x9b, 0x3a, 0x83, 0xec, 0xe6, 0xc8, 0xf3, + 0xb4, 0xea, 0x6e, 0x5d, 0x11, 0xb2, 0x31, 0xb3, + 0x64, 0x9e, 0xbe, 0xc6, 0xbd, 0xb2, 0x88, 0x93, + 0xa2, 0x87, 0x1b, 0x00, 0xbe, 0x24, 0x1f, 0x22, + 0x47, 0x0e, 0xb6, 0x5d, 0xfe, 0x46, 0x5e, 0xb1, + 0x99, 0x8c, 0x38, 0xd2, 0xe3, 0x21, 0xc7, 0x5b, + 0x60, 0xfb, 0x59, 0x6f, 0x2c, 0x5f, 0xc8, 0x63, + 0x1d, 0x04, 0x30, 0x7a, 0xde, 0x61, 0xdf, 0x19, + 0xa6, 0x62, 0x4c, 0x4b, 0x7a, 0xc0, 0x7f, 0x73, + 0x37, 0xd4, 0x30, 0xba, 0x63, 0x83, 0x0f, 0x69, + 0xa7, 0x76, 0x07, 0xa1, 0x87, 0x01, 0xc4, 0x7c, + 0x3e, 0xc6, 0x2f, 0xcb, 0x7f, 0x41, 0xa4, 0x42, + 0x47, 0xc1, 0x04, 0x62, 0xff, 0x00, 0x63, 0xff, + 0xc4, 0x00, 0x27, 0x10, 0x01, 0x01, 0x00, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x21, + 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x91, 0xa1, + 0x10, 0x30, 0x40, 0xc1, 0x20, 0x50, 0xb1, 0xf0, + 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, + 0x3f, 0x10, 0xfe, 0x03, 0x67, 0xa4, 0x9a, 0x04, + 0x01, 0xca, 0x72, 0x99, 0xa0, 0xc6, 0x92, 0x53, + 0xe5, 0x14, 0xa3, 0x97, 0xe5, 0xcc, 0xc8, 0x94, + 0x2e, 0xac, 0xde, 0x02, 0x67, 0x8f, 0xf3, 0xde, + 0x4f, 0xfe, 0x98, 0x2f, 0x97, 0x00, 0x7c, 0x0c, + 0xd7, 0x79, 0x3c, 0xfa, 0x53, 0x77, 0xbd, 0x61, + 0x46, 0x15, 0x86, 0xc0, 0x56, 0xbb, 0xf9, 0xce, + 0xdf, 0x84, 0x2a, 0x7d, 0x7f, 0x0b, 0xc2, 0x39, + 0x69, 0xf8, 0x5c, 0xff, 0x00, 0xe5, 0xff, 0x00, + 0xde, 0x09, 0x68, 0xe1, 0xa3, 0xf4, 0x3f, 0xe4, + 0x48, 0x57, 0x59, 0x38, 0xae, 0x4f, 0xb0, 0x21, + 0x59, 0x8c, 0xa9, 0x14, 0x04, 0xca, 0xde, 0x1c, + 0xc7, 0xde, 0x56, 0xbe, 0x46, 0x84, 0xb3, 0xf4, + 0x35, 0x86, 0x28, 0xa6, 0xd7, 0x43, 0x69, 0xd0, + 0x7e, 0xcf, 0x39, 0x60, 0x4a, 0x88, 0x9c, 0x7c, + 0x7d, 0x65, 0x44, 0xd7, 0x9c, 0x0d, 0x83, 0x8d, + 0x60, 0x38, 0x53, 0x51, 0x3b, 0x6e, 0xa6, 0xb1, + 0xbc, 0x61, 0x09, 0x36, 0x63, 0x9c, 0xd5, 0x65, + 0x8e, 0x6e, 0x3a, 0xe7, 0x98, 0x10, 0xe4, 0x05, + 0xea, 0x8c, 0x87, 0x2f, 0xda, 0x14, 0x3f, 0x2d, + 0x24, 0xcb, 0x0e, 0xea, 0x50, 0x21, 0x35, 0x20, + 0x44, 0x69, 0xbd, 0xe1, 0xb1, 0xf3, 0x34, 0xcb, + 0xbd, 0x54, 0x22, 0xea, 0x69, 0xbc, 0x5c, 0x9b, + 0x35, 0x24, 0x4a, 0xbb, 0x89, 0x2a, 0xbd, 0x58, + 0xc2, 0x97, 0xe7, 0xeb, 0x28, 0x0e, 0xe0, 0x25, + 0x7a, 0xfb, 0x31, 0x47, 0xa3, 0x2a, 0x12, 0x0d, + 0xa1, 0x38, 0x7e, 0x78, 0xc2, 0xff, 0x00, 0xd7, + 0x21, 0xd8, 0xb5, 0x06, 0x32, 0x8b, 0x8d, 0x4d, + 0x09, 0xd5, 0x12, 0xd2, 0x08, 0xbd, 0x9c, 0x1a, + 0x5f, 0xef, 0xa2, 0x07, 0x82, 0xc0, 0x98, 0x45, + 0x78, 0x36, 0x6e, 0x62, 0xa4, 0x76, 0x23, 0x46, + 0x23, 0x32, 0x29, 0x90, 0x00, 0x20, 0x48, 0xa8, + 0xe4, 0x3a, 0x73, 0xe3, 0x9c, 0xba, 0x79, 0x5f, + 0xbe, 0x51, 0xed, 0xd8, 0xfa, 0xc8, 0xc5, 0xfc, + 0x2a, 0x3e, 0x81, 0xda, 0x9f, 0x90, 0x66, 0xef, + 0xd8, 0xd5, 0x40, 0xe1, 0xf5, 0xfb, 0x62, 0x3f, + 0x52, 0x5e, 0x78, 0x13, 0xdf, 0x23, 0xe3, 0xe7, + 0x07, 0x30, 0xd8, 0x6c, 0x00, 0x97, 0xde, 0xf3, + 0xac, 0xfd, 0x16, 0x45, 0xa6, 0x18, 0x56, 0xbb, + 0x40, 0x7e, 0x60, 0x22, 0xdd, 0xeb, 0x25, 0x66, + 0x2b, 0xdc, 0xca, 0x2c, 0x9e, 0x2a, 0xd6, 0xc1, + 0xb3, 0xb1, 0x70, 0x91, 0x98, 0xc5, 0x0e, 0x86, + 0x90, 0x12, 0x01, 0x24, 0xc1, 0x03, 0xe3, 0x54, + 0x7a, 0x5e, 0xd3, 0x4b, 0x78, 0x1c, 0xaa, 0xe0, + 0x7c, 0x60, 0xab, 0x75, 0x1c, 0x31, 0x27, 0x85, + 0xf9, 0x4c, 0xe9, 0x8d, 0x96, 0x0d, 0xbc, 0xea, + 0x1e, 0x0f, 0x0c, 0x0c, 0xa0, 0x13, 0xbc, 0x12, + 0x07, 0x00, 0x05, 0xe1, 0xa7, 0x1a, 0x82, 0x9a, + 0xc2, 0xf2, 0xc2, 0x4a, 0x84, 0x63, 0x8e, 0x07, + 0xf7, 0xea, 0xbc, 0xf9, 0xca, 0x12, 0xa4, 0x06, + 0x96, 0x01, 0x3d, 0xb4, 0xcd, 0x36, 0xe0, 0x5c, + 0x75, 0x2b, 0x0f, 0x33, 0x8c, 0x31, 0x7e, 0x8a, + 0xe7, 0xc2, 0x57, 0x86, 0xfc, 0x61, 0x89, 0x27, + 0x90, 0x71, 0xb1, 0x65, 0x70, 0xc7, 0xed, 0x05, + 0x03, 0xd8, 0x9d, 0x60, 0x50, 0x0b, 0x8c, 0x2a, + 0x7c, 0x4b, 0x93, 0x04, 0x3a, 0x60, 0x15, 0x5c, + 0xaf, 0x0d, 0x41, 0x57, 0xaa, 0x48, 0x42, 0xe0, + 0x6f, 0x0c, 0x55, 0x51, 0x04, 0xb6, 0x06, 0x20, + 0x05, 0xe7, 0x24, 0xb4, 0x3f, 0x0c, 0xfa, 0x81, + 0x47, 0x9d, 0x26, 0x58, 0x50, 0x1b, 0xa5, 0x62, + 0x8a, 0x9e, 0xa3, 0xee, 0x62, 0xc3, 0x2e, 0x40, + 0xd5, 0x08, 0x82, 0xfb, 0x7c, 0x1c, 0x84, 0x8c, + 0x96, 0x81, 0xd8, 0x70, 0x21, 0xf4, 0x62, 0xf0, + 0x44, 0xbb, 0xf0, 0xea, 0x4d, 0xb5, 0xad, 0x61, + 0x88, 0xe1, 0x2e, 0xf5, 0x8a, 0x16, 0x0a, 0x3b, + 0xae, 0x1f, 0x0c, 0xbc, 0xa4, 0x04, 0xe4, 0xaa, + 0x5e, 0x75, 0x54, 0x3d, 0x36, 0xf3, 0x89, 0x24, + 0x68, 0x88, 0x1a, 0xd0, 0x5b, 0x96, 0x66, 0xb2, + 0xee, 0x05, 0xfb, 0x9f, 0xdf, 0x19, 0xd5, 0xf8, + 0x46, 0x87, 0x4f, 0x4e, 0x38, 0x1b, 0x86, 0x75, + 0xe9, 0xc1, 0x39, 0x46, 0xb3, 0x52, 0xe8, 0x51, + 0x5e, 0x00, 0xbc, 0x15, 0xd0, 0xed, 0xcb, 0x27, + 0x66, 0x38, 0x1b, 0xf4, 0x0a, 0xa5, 0x80, 0x7a, + 0x47, 0xf7, 0x89, 0x12, 0x48, 0xa5, 0x53, 0x89, + 0x37, 0x97, 0x85, 0xb7, 0x25, 0x78, 0x7c, 0x09, + 0xa3, 0x46, 0xaf, 0x39, 0xc8, 0x15, 0xf9, 0x2f, + 0x93, 0x8f, 0xf1, 0x86, 0xe4, 0x20, 0x50, 0x07, + 0x00, 0x61, 0x87, 0x65, 0x1b, 0x25, 0xea, 0xce, + 0xb1, 0xe0, 0x7c, 0x11, 0xa7, 0x21, 0xa0, 0x6f, + 0x6a, 0x21, 0xc9, 0x80, 0x85, 0x11, 0x59, 0x7b, + 0x0b, 0xb9, 0x57, 0x0e, 0x8f, 0xc2, 0xc6, 0x61, + 0x88, 0x42, 0x9d, 0x0f, 0x26, 0x77, 0xc9, 0xb6, + 0x15, 0xf2, 0x62, 0xf3, 0xeb, 0xd7, 0x09, 0x02, + 0xaa, 0x84, 0x0b, 0xe7, 0x5e, 0xb1, 0x67, 0x31, + 0x02, 0xae, 0xbb, 0x7b, 0xcf, 0x9c, 0xb4, 0x6b, + 0xeb, 0x14, 0x6c, 0x02, 0x18, 0x7f, 0x19, 0x41, + 0xc9, 0xf9, 0xc8, 0xf2, 0x64, 0x79, 0x32, 0x9e, + 0x71, 0x04, 0xa9, 0xbe, 0x3d, 0xe4, 0x0c, 0xa5, + 0xca, 0x79, 0xc8, 0xf2, 0x64, 0x3d, 0x99, 0x1e, + 0x4c, 0x8f, 0x26, 0x52, 0xca, 0x5c, 0x11, 0xef, + 0x29, 0xe7, 0x04, 0x7b, 0xfe, 0x13, 0x14, 0x73, + 0x1e, 0xb0, 0x33, 0xac, 0xb4, 0x42, 0x23, 0xf5, + 0x8a, 0x66, 0x61, 0x69, 0x5a, 0x8f, 0x6f, 0x27, + 0xc0, 0xf7, 0xa5, 0x20, 0x1d, 0x9f, 0x20, 0x3f, + 0xf7, 0x0d, 0xd8, 0xbe, 0xdd, 0xc7, 0x95, 0x6b, + 0x73, 0x97, 0xf0, 0xe7, 0xe8, 0xb2, 0x52, 0x80, + 0x67, 0xec, 0xbe, 0x06, 0x46, 0xd8, 0xc3, 0x73, + 0x1d, 0x73, 0xf3, 0x81, 0xa0, 0x29, 0xa0, 0x74, + 0xee, 0xda, 0x45, 0x1d, 0x3a, 0x19, 0xed, 0xaa, + 0x22, 0x92, 0xf3, 0x03, 0x42, 0xe4, 0x43, 0x93, + 0x6a, 0x23, 0x59, 0x6b, 0x4a, 0x07, 0xa3, 0x26, + 0x5c, 0x46, 0xe8, 0xa8, 0xa3, 0x62, 0x40, 0xbd, + 0x80, 0xb2, 0xf8, 0x19, 0x9a, 0x4c, 0x35, 0x0a, + 0x2e, 0x21, 0xc1, 0xae, 0x04, 0xd9, 0xc3, 0x6a, + 0x03, 0x41, 0x13, 0x65, 0x16, 0x68, 0x14, 0x73, + 0x54, 0xb5, 0x0f, 0xdf, 0x07, 0x90, 0x40, 0xa7, + 0xb8, 0xd8, 0x6d, 0x8a, 0x87, 0x45, 0xd0, 0xda, + 0xef, 0x39, 0xbd, 0x95, 0x58, 0x0b, 0xa1, 0x87, + 0x06, 0x32, 0x6f, 0xde, 0x02, 0x00, 0xd8, 0xd0, + 0xdf, 0x7b, 0xbc, 0xe2, 0xdf, 0xb6, 0x32, 0x72, + 0x30, 0x4b, 0x33, 0xa5, 0xe0, 0x8b, 0xb2, 0x72, + 0x50, 0x69, 0xc2, 0x17, 0x3c, 0x1d, 0x65, 0xd0, + 0xe1, 0x1c, 0x87, 0xe8, 0x2c, 0x74, 0xb9, 0x09, + 0x79, 0xf6, 0x12, 0x0f, 0x23, 0xcf, 0x5a, 0xe1, + 0x6c, 0x41, 0x45, 0x71, 0x7a, 0x9f, 0x40, 0xe0, + 0xdd, 0x70, 0x51, 0x98, 0x92, 0x35, 0x06, 0xfe, + 0x70, 0x1a, 0x68, 0xc6, 0xd7, 0x34, 0x30, 0x95, + 0xf5, 0x89, 0xa1, 0xc8, 0xf8, 0xc0, 0xf9, 0xb4, + 0x54, 0x4e, 0xb7, 0x28, 0x5f, 0x60, 0x9d, 0x65, + 0xbb, 0xfd, 0x23, 0x51, 0x62, 0x24, 0xa7, 0x88, + 0x38, 0xe2, 0x58, 0xa6, 0x0c, 0xa4, 0xf2, 0xe4, + 0xfa, 0xeb, 0x13, 0x59, 0xbf, 0x4c, 0xa2, 0xb8, + 0x04, 0xe6, 0xd5, 0xb4, 0x2a, 0x00, 0x7d, 0x8e, + 0x26, 0xe3, 0x55, 0xd8, 0xb4, 0x71, 0x93, 0x9a, + 0x82, 0xd0, 0xb9, 0x08, 0x3a, 0x48, 0x26, 0xbe, + 0x3f, 0xe0, 0xf0, 0xe1, 0x65, 0x8c, 0xb3, 0xe1, + 0x5e, 0x57, 0x6b, 0x4e, 0x6d, 0xa0, 0x55, 0xa0, + 0x15, 0xbf, 0x07, 0x6f, 0xde, 0x05, 0x58, 0x02, + 0xe6, 0x8d, 0xcf, 0x56, 0xff, 0x00, 0x28, 0x0a, + 0xb0, 0xcd, 0xa3, 0xbd, 0x32, 0x01, 0x51, 0x1f, + 0x6e, 0x2d, 0xac, 0x02, 0xbe, 0xc8, 0xe9, 0xe2, + 0x94, 0x68, 0xf1, 0xb1, 0xa2, 0x7f, 0x30, 0x4e, + 0x7c, 0xe0, 0xa9, 0x39, 0x46, 0x65, 0x5c, 0x4b, + 0x9f, 0x28, 0x14, 0x3e, 0x7f, 0x6c, 0x42, 0xdf, + 0x17, 0x57, 0x05, 0xba, 0x8a, 0x7c, 0x3e, 0x60, + 0x84, 0x88, 0x9d, 0x58, 0xf0, 0x02, 0xe2, 0x53, + 0xc1, 0x10, 0x99, 0x79, 0x52, 0xb2, 0x8f, 0x18, + 0x60, 0x13, 0x09, 0x81, 0x08, 0xd1, 0x2b, 0x44, + 0x89, 0x12, 0x65, 0x54, 0x2b, 0x30, 0x51, 0x4f, + 0xbd, 0x3e, 0x71, 0x37, 0x36, 0xf0, 0x02, 0xaa, + 0xf5, 0x89, 0xef, 0x43, 0x38, 0x72, 0x1e, 0x4f, + 0x79, 0x40, 0xb8, 0x9d, 0x52, 0x7e, 0x69, 0x7c, + 0x7a, 0xe3, 0x3f, 0xc9, 0xa9, 0xaf, 0xdc, 0x69, + 0x00, 0xe6, 0x8c, 0x30, 0xa6, 0xae, 0x78, 0xd9, + 0xcc, 0xfa, 0x25, 0x3a, 0x70, 0xf9, 0x73, 0x97, + 0x94, 0xb6, 0x92, 0x62, 0x43, 0x00, 0x6a, 0x9b, + 0xd6, 0x5e, 0xa8, 0x7a, 0x03, 0xb0, 0xf0, 0x1d, + 0x89, 0xb1, 0x04, 0xcb, 0x85, 0x41, 0xdb, 0x01, + 0x9a, 0x31, 0x5d, 0x20, 0xec, 0xc4, 0xef, 0xe8, + 0xb2, 0x85, 0x0d, 0x93, 0x17, 0x2d, 0xb1, 0xe2, + 0x8d, 0x9f, 0x3e, 0x89, 0x45, 0x14, 0x26, 0x8a, + 0xe5, 0xd6, 0xea, 0x95, 0xbf, 0x3f, 0x86, 0x68, + 0xc3, 0x45, 0x17, 0xf2, 0x28, 0x8a, 0xb0, 0x97, + 0x47, 0xf5, 0x13, 0xa7, 0x11, 0x0a, 0x0f, 0x4c, + 0xef, 0x1c, 0xf0, 0x80, 0x84, 0xc0, 0x35, 0xe7, + 0x6c, 0x8b, 0xbb, 0xbc, 0x68, 0x63, 0x0c, 0x20, + 0xa3, 0x60, 0x4b, 0x44, 0x08, 0x76, 0x47, 0x7b, + 0x85, 0x15, 0x00, 0xe9, 0x13, 0x48, 0xf2, 0x62, + 0x29, 0xc9, 0x36, 0x64, 0xb7, 0x94, 0x0b, 0x34, + 0x6d, 0x2b, 0x80, 0x42, 0x25, 0x53, 0x73, 0x03, + 0x72, 0x18, 0x4f, 0x17, 0x27, 0x8e, 0x8a, 0x81, + 0xda, 0x80, 0x05, 0x60, 0xf3, 0xb5, 0x77, 0x8e, + 0xaf, 0x73, 0xde, 0xad, 0x3b, 0x0a, 0xfd, 0x06, + 0x00, 0x19, 0xb9, 0x50, 0x06, 0x00, 0x46, 0x82, + 0x84, 0x3a, 0x6c, 0xf0, 0x55, 0x02, 0x48, 0x34, + 0xb4, 0x97, 0x48, 0x9a, 0x87, 0x38, 0x9d, 0x46, + 0xcf, 0xce, 0x51, 0xe9, 0x21, 0x74, 0x44, 0x79, + 0xc1, 0x46, 0xe7, 0x83, 0x08, 0x84, 0x69, 0xb0, + 0x36, 0xa3, 0x53, 0x14, 0xf9, 0x46, 0x30, 0x93, + 0x71, 0x35, 0xb7, 0xaa, 0x4c, 0x2d, 0x4c, 0x01, + 0xf3, 0x90, 0x60, 0xaa, 0xbb, 0xd3, 0x7a, 0xa7, + 0xb1, 0x86, 0x70, 0x82, 0xa5, 0xb2, 0x20, 0x8c, + 0xa9, 0xd6, 0x00, 0xa2, 0x8d, 0x29, 0x1c, 0x9a, + 0x76, 0x68, 0x79, 0xc6, 0x15, 0x15, 0x03, 0xb4, + 0x04, 0xd0, 0xa8, 0x54, 0xad, 0x45, 0x5e, 0xa1, + 0x5b, 0x45, 0x1d, 0x3a, 0x61, 0xf2, 0xe1, 0x60, + 0xc1, 0x32, 0x5c, 0x2b, 0xb4, 0x0d, 0x36, 0x69, + 0x37, 0x00, 0xc6, 0x72, 0x76, 0xe1, 0x3c, 0x20, + 0x89, 0x1d, 0x5c, 0xdd, 0x56, 0xcc, 0x4e, 0x6e, + 0x74, 0xdf, 0xec, 0x74, 0xe4, 0xd0, 0x65, 0x55, + 0x83, 0xd6, 0xbf, 0x83, 0xf2, 0xc9, 0x79, 0xcb, + 0x2f, 0x10, 0x01, 0x01, 0x04, 0x6f, 0x2a, 0xe3, + 0x48, 0x94, 0x15, 0xf3, 0x1d, 0x0a, 0x2a, 0xea, + 0xb4, 0xf1, 0x82, 0xab, 0x64, 0x66, 0x48, 0xa2, + 0x4a, 0x50, 0x6a, 0x6b, 0x59, 0x27, 0x13, 0x7c, + 0xc9, 0x20, 0x1a, 0x34, 0x00, 0x03, 0xdd, 0x5f, + 0xfa, 0x3f, 0xff, 0xd9, +}; + +static const uint8_t data_tm4c_jpg[] = +{ + /* /tm4c.jpg */ + 0x2f, 0x74, 0x6d, 0x34, 0x63, 0x2e, 0x6a, 0x70, + 0x67, 0x00, + 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, + 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, + 0x00, 0x48, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43, + 0x00, 0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x03, + 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x05, + 0x08, 0x05, 0x05, 0x04, 0x04, 0x05, 0x0a, 0x07, + 0x07, 0x06, 0x08, 0x0c, 0x0a, 0x0c, 0x0c, 0x0b, + 0x0a, 0x0b, 0x0b, 0x0d, 0x0e, 0x12, 0x10, 0x0d, + 0x0e, 0x11, 0x0e, 0x0b, 0x0b, 0x10, 0x16, 0x10, + 0x11, 0x13, 0x14, 0x15, 0x15, 0x15, 0x0c, 0x0f, + 0x17, 0x18, 0x16, 0x14, 0x18, 0x12, 0x14, 0x15, + 0x14, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x03, 0x04, + 0x04, 0x05, 0x04, 0x05, 0x09, 0x05, 0x05, 0x09, + 0x14, 0x0d, 0x0b, 0x0d, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xff, 0xc2, + 0x00, 0x11, 0x08, 0x00, 0x4b, 0x00, 0x4b, 0x03, + 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, + 0x01, 0xff, 0xc4, 0x00, 0x1c, 0x00, 0x00, 0x02, + 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x04, 0x08, 0x01, 0x05, 0x07, 0x03, 0x02, 0xff, + 0xc4, 0x00, 0x19, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, + 0x03, 0x05, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, + 0x00, 0x02, 0x10, 0x03, 0x10, 0x00, 0x00, 0x01, + 0x50, 0xb1, 0x28, 0x0c, 0x81, 0x80, 0x18, 0x7d, + 0x3c, 0xfa, 0xff, 0x00, 0x6f, 0x2f, 0x59, 0xf9, + 0xfd, 0xb4, 0x67, 0x37, 0xa3, 0x2e, 0x0f, 0x01, + 0x50, 0x73, 0x27, 0x8f, 0x7d, 0x7c, 0xab, 0x5d, + 0x1e, 0x1d, 0x4f, 0xe7, 0xf7, 0x54, 0x5c, 0x6f, + 0x70, 0x48, 0x30, 0x49, 0x17, 0x07, 0x9e, 0x9e, + 0x7d, 0xe7, 0xb7, 0x97, 0x85, 0x9d, 0x8f, 0x87, + 0xae, 0xa5, 0xe7, 0x4e, 0xca, 0xb8, 0x41, 0x36, + 0x43, 0x0e, 0xb2, 0xc3, 0xd1, 0xe1, 0xa2, 0xd4, + 0x0e, 0xeb, 0xcb, 0xd1, 0x50, 0xf3, 0x55, 0x54, + 0x02, 0x55, 0x9d, 0x37, 0xdf, 0xc7, 0xda, 0xcc, + 0x81, 0x61, 0x79, 0xfd, 0xaa, 0x3c, 0xaa, 0xaa, + 0x19, 0x1e, 0x3d, 0x7c, 0xb6, 0x56, 0x00, 0x05, + 0x94, 0xf2, 0xf5, 0xa9, 0x51, 0x31, 0x54, 0x8d, + 0xbe, 0xb3, 0xb9, 0xd6, 0x40, 0x00, 0x2d, 0x16, + 0x37, 0x55, 0x25, 0xb2, 0x67, 0x30, 0x49, 0xda, + 0x9e, 0x68, 0x8e, 0x41, 0x3e, 0xc8, 0x85, 0xa8, + 0xce, 0xaa, 0x9a, 0xea, 0x4f, 0x1d, 0x67, 0xa1, + 0x46, 0xbc, 0xfb, 0x25, 0x10, 0x4d, 0x5d, 0x5a, + 0xbc, 0xd9, 0xaa, 0x8c, 0x80, 0x00, 0x18, 0x03, + 0xd8, 0xb1, 0x6b, 0xff, 0xc4, 0x00, 0x25, 0x10, + 0x00, 0x00, 0x06, 0x03, 0x00, 0x01, 0x05, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x13, + 0x16, 0x36, 0x07, 0x10, 0x11, 0x15, 0x21, 0x12, + 0x14, 0x31, 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, + 0x00, 0x01, 0x05, 0x02, 0xb8, 0x5f, 0x25, 0x73, + 0x60, 0xee, 0x26, 0x87, 0x71, 0x34, 0x3b, 0x89, + 0xa1, 0xdc, 0x4d, 0x0e, 0xe2, 0x68, 0x77, 0x13, + 0x42, 0x12, 0xc5, 0x39, 0x2c, 0xf3, 0xfb, 0xeb, + 0x88, 0x29, 0xa3, 0xbc, 0x8b, 0xb2, 0xe4, 0xa5, + 0xb5, 0xa7, 0x03, 0x02, 0xa4, 0x93, 0x8f, 0x4e, + 0xb4, 0x30, 0x96, 0xab, 0x47, 0xd7, 0x4a, 0xc6, + 0xbc, 0x59, 0x0b, 0x67, 0x1a, 0xcd, 0x9a, 0xce, + 0x3d, 0x3d, 0x66, 0xb2, 0x3f, 0x53, 0x11, 0x5e, + 0x26, 0xc1, 0x56, 0xcf, 0xcc, 0x2d, 0x85, 0x0c, + 0xb9, 0xb7, 0x66, 0x3e, 0x4d, 0x65, 0x9e, 0xc4, + 0xcc, 0xbd, 0x68, 0xdd, 0x79, 0x18, 0xb7, 0x2c, + 0xeb, 0xb2, 0xee, 0xd1, 0x9d, 0xfb, 0x38, 0x51, + 0x04, 0xfa, 0x40, 0x84, 0x55, 0xd9, 0xd6, 0x1b, + 0x05, 0x4f, 0xf6, 0x0a, 0x7d, 0x2c, 0x38, 0xb8, + 0xbb, 0xab, 0xe7, 0x41, 0x20, 0x1d, 0x13, 0x0a, + 0x56, 0xd5, 0xce, 0x33, 0x5a, 0x55, 0x32, 0x34, + 0xa3, 0x91, 0x54, 0x9f, 0xc7, 0x65, 0x89, 0x36, + 0x0d, 0x82, 0xa1, 0xfb, 0x5f, 0xb5, 0x79, 0x37, + 0xc7, 0xbb, 0x66, 0xd9, 0x72, 0xb2, 0x25, 0x2a, + 0x09, 0xff, 0x00, 0x31, 0xb0, 0x6c, 0x14, 0xdf, + 0x1d, 0xb5, 0x79, 0x37, 0xb7, 0xfa, 0x18, 0xa1, + 0x86, 0xa9, 0x6c, 0x1b, 0x06, 0xc1, 0xb0, 0x52, + 0xbc, 0x6a, 0xd5, 0xe4, 0xcd, 0x6a, 0x2f, 0x5e, + 0x40, 0x99, 0xb2, 0xa4, 0x51, 0xa3, 0x43, 0x22, + 0x6d, 0x83, 0x60, 0xd8, 0x36, 0x0d, 0x82, 0x8f, + 0xfb, 0x58, 0xb2, 0x1c, 0xa9, 0xdb, 0x63, 0xa6, + 0x61, 0xd4, 0x87, 0xf5, 0x05, 0xe4, 0x6b, 0xc7, + 0x12, 0x2e, 0xf1, 0xf6, 0x65, 0xd3, 0xf0, 0xf9, + 0xba, 0x8b, 0x3f, 0x49, 0x8b, 0xb7, 0x05, 0x24, + 0x73, 0xd5, 0x4c, 0xb2, 0x4b, 0x37, 0xc5, 0x13, + 0xc5, 0x6d, 0xa5, 0xc9, 0x2d, 0x11, 0x72, 0x8e, + 0xe1, 0x9e, 0x61, 0x5f, 0x8c, 0xad, 0x77, 0x72, + 0xb2, 0x98, 0xb4, 0x98, 0x8e, 0x17, 0xb4, 0xe5, + 0x75, 0xd4, 0xb9, 0xaa, 0xe5, 0x37, 0x16, 0xb5, + 0xdd, 0x62, 0x46, 0x67, 0x32, 0x29, 0xd0, 0x48, + 0x6e, 0x4a, 0xd9, 0x59, 0x8c, 0x7e, 0xfb, 0x8d, + 0x86, 0x1c, 0x6c, 0x38, 0xe3, 0x61, 0x87, 0x1b, + 0x0e, 0x38, 0xd8, 0x61, 0xc6, 0xc3, 0x8e, 0x36, + 0x1c, 0x23, 0x4c, 0x86, 0xda, 0xd5, 0xba, 0x4d, + 0x9b, 0x7f, 0xff, 0xc4, 0x00, 0x21, 0x11, 0x00, + 0x01, 0x04, 0x01, 0x03, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x02, 0x11, 0x20, 0x31, 0x10, 0x12, 0x21, + 0x13, 0x30, 0x32, 0x40, 0x51, 0xff, 0xda, 0x00, + 0x08, 0x01, 0x03, 0x01, 0x01, 0x3f, 0x01, 0xbb, + 0xdd, 0xb4, 0x2e, 0xa3, 0xd3, 0x4c, 0x89, 0xec, + 0x3e, 0x09, 0x50, 0x99, 0xe2, 0x2e, 0xf7, 0x7c, + 0xd2, 0x13, 0x71, 0x62, 0xa1, 0x42, 0x84, 0xdc, + 0x54, 0xf1, 0x51, 0x8a, 0x9e, 0x6a, 0x28, 0x6c, + 0x3d, 0xff, 0x00, 0xff, 0xc4, 0x00, 0x22, 0x11, + 0x00, 0x01, 0x04, 0x00, 0x05, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x11, 0x20, 0x03, 0x10, 0x12, + 0x31, 0x32, 0x13, 0x21, 0x30, 0x40, 0x41, 0xff, + 0xda, 0x00, 0x08, 0x01, 0x02, 0x01, 0x01, 0x3f, + 0x01, 0xbe, 0x1b, 0x75, 0x95, 0xd2, 0x62, 0x70, + 0x83, 0x1e, 0x0c, 0x39, 0x01, 0x4a, 0x7f, 0x23, + 0x76, 0x37, 0xe9, 0xca, 0x53, 0xb9, 0x1b, 0x35, + 0x03, 0x9b, 0xb7, 0xa8, 0x13, 0x53, 0xbd, 0x47, + 0x6a, 0x9d, 0xe8, 0x2c, 0x7d, 0xff, 0x00, 0xff, + 0xc4, 0x00, 0x3f, 0x10, 0x00, 0x02, 0x01, 0x03, + 0x01, 0x03, 0x06, 0x0a, 0x09, 0x02, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, + 0x04, 0x11, 0x12, 0x13, 0x21, 0x31, 0x05, 0x22, + 0x34, 0x41, 0x51, 0xd1, 0x14, 0x20, 0x32, 0x61, + 0x71, 0x81, 0x91, 0x92, 0x93, 0xb3, 0x10, 0x15, + 0x23, 0x42, 0x52, 0x62, 0x72, 0x74, 0xa1, 0xa2, + 0xb2, 0x06, 0x24, 0x73, 0x83, 0x94, 0xb1, 0xf1, + 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, 0x06, + 0x3f, 0x02, 0xbc, 0x8a, 0x0b, 0x87, 0xb7, 0x8a, + 0x09, 0x1a, 0x25, 0x58, 0xd8, 0x8e, 0x07, 0x1d, + 0x55, 0xd3, 0xe7, 0xf8, 0xad, 0xdf, 0x5d, 0x3e, + 0x7f, 0x8a, 0xdd, 0xf5, 0xd3, 0xe7, 0xf8, 0xad, + 0xdf, 0x5d, 0x3e, 0x7f, 0x8a, 0xdd, 0xf5, 0xd3, + 0xe7, 0xf8, 0xad, 0xdf, 0x5d, 0x3e, 0x7f, 0x8a, + 0xdd, 0xf4, 0x13, 0xc3, 0xee, 0x04, 0x4b, 0xbe, + 0x46, 0xda, 0xb7, 0x0f, 0x6d, 0x74, 0x8b, 0x8f, + 0xf9, 0x0f, 0xdf, 0x51, 0x49, 0x37, 0x3a, 0x4c, + 0xba, 0x96, 0xed, 0xc3, 0x11, 0x9f, 0xe2, 0xb9, + 0x48, 0xba, 0x97, 0x41, 0x79, 0x26, 0xa5, 0x07, + 0x19, 0x1a, 0xbb, 0x6b, 0x93, 0x60, 0x6b, 0x7b, + 0x98, 0x21, 0x9e, 0xc8, 0xdf, 0x4b, 0x27, 0x84, + 0x6a, 0xd2, 0xba, 0x18, 0xe9, 0xf2, 0x7c, 0xdc, + 0x6a, 0x18, 0x35, 0x37, 0xd6, 0xaf, 0x77, 0xa0, + 0xfe, 0x11, 0x0f, 0xda, 0x6f, 0xc7, 0x13, 0xba, + 0x22, 0xde, 0xba, 0xbb, 0xbc, 0xb9, 0xb5, 0xbb, + 0x9e, 0xd9, 0x4c, 0x09, 0x0c, 0x0e, 0xfb, 0x26, + 0xe7, 0xa6, 0x4b, 0x31, 0xc7, 0x68, 0x23, 0xd3, + 0x4b, 0xc9, 0xf1, 0xc3, 0x77, 0x15, 0xb6, 0x75, + 0xb2, 0x4e, 0x98, 0x99, 0x63, 0xc6, 0xa3, 0xbb, + 0xb7, 0x1c, 0x3d, 0x55, 0xca, 0xed, 0x3c, 0x32, + 0x34, 0x70, 0xac, 0x12, 0xdb, 0xc7, 0x3d, 0xca, + 0xdb, 0x73, 0x64, 0xce, 0xe6, 0x66, 0xeb, 0x1c, + 0x3d, 0x55, 0xca, 0x30, 0xd9, 0x34, 0xe6, 0xfe, + 0x3b, 0xbd, 0x94, 0x0b, 0x21, 0xf2, 0x97, 0x11, + 0xea, 0xf6, 0x6b, 0x27, 0x3d, 0x82, 0x9a, 0xde, + 0xd8, 0x31, 0x47, 0x4d, 0xa0, 0x67, 0x39, 0x66, + 0xcf, 0xd1, 0x1f, 0xfa, 0x92, 0xfc, 0xc6, 0xae, + 0x51, 0x85, 0x70, 0x1a, 0x4b, 0xd7, 0x51, 0x9e, + 0x1b, 0xde, 0x93, 0xc1, 0xee, 0x9a, 0x5d, 0x11, + 0x1b, 0x45, 0x32, 0xae, 0xcc, 0xe9, 0xe7, 0xa9, + 0x41, 0x9e, 0xac, 0x06, 0xff, 0x00, 0xdd, 0xd4, + 0xaf, 0x2d, 0xf4, 0x57, 0x30, 0xcc, 0x23, 0x7c, + 0x99, 0x78, 0x91, 0xa9, 0x17, 0xd3, 0x80, 0x0d, + 0x5d, 0xb1, 0xe5, 0x91, 0x67, 0x7b, 0x18, 0xd8, + 0xcd, 0x13, 0xf5, 0xec, 0xc0, 0x0a, 0x3c, 0xfd, + 0x95, 0x71, 0x7a, 0x2f, 0x31, 0x2d, 0xcc, 0x53, + 0x6d, 0xf3, 0xbd, 0x8f, 0x5e, 0x9c, 0xfe, 0x6c, + 0x1f, 0x61, 0xaf, 0xaa, 0x6e, 0x6e, 0x0b, 0x45, + 0xb2, 0x8f, 0x29, 0xd5, 0x8f, 0x2c, 0x0f, 0x51, + 0x63, 0x42, 0xea, 0x7b, 0x97, 0x33, 0x31, 0xd6, + 0xb9, 0xfb, 0xbc, 0xd0, 0xb9, 0xf4, 0xe9, 0x02, + 0x97, 0x5b, 0x6a, 0xd2, 0xa1, 0x47, 0xa3, 0xe8, + 0x87, 0xf5, 0xcb, 0xf3, 0x1a, 0xaf, 0xe2, 0x27, + 0x48, 0x7b, 0xd7, 0x52, 0x7b, 0x39, 0xf5, 0xb5, + 0x87, 0x95, 0xda, 0x59, 0x1f, 0x56, 0xe6, 0x97, + 0x9d, 0xa1, 0x74, 0xe8, 0x18, 0x1c, 0x58, 0x86, + 0xe1, 0xdb, 0x45, 0x53, 0x95, 0x63, 0x5d, 0x18, + 0xcf, 0xda, 0x32, 0xaa, 0xef, 0x6c, 0x67, 0xb3, + 0x78, 0xf6, 0x91, 0x52, 0xc9, 0x25, 0xd2, 0x8d, + 0x9e, 0x73, 0xb4, 0x07, 0x3b, 0x94, 0x1c, 0x7a, + 0x7c, 0xde, 0x63, 0x48, 0x91, 0xf2, 0x90, 0xc1, + 0xd6, 0xba, 0x06, 0x79, 0xcc, 0x0c, 0xb9, 0x0b, + 0xdb, 0xb9, 0x3f, 0xac, 0x76, 0xd2, 0x5c, 0x35, + 0xf4, 0x72, 0x98, 0x8b, 0x87, 0x05, 0xb2, 0x0e, + 0x8d, 0x38, 0xc7, 0x9b, 0x7d, 0x17, 0xdb, 0x24, + 0xa0, 0x4a, 0x62, 0xe6, 0xf6, 0x8f, 0xa6, 0x0f, + 0xd7, 0x27, 0xcc, 0x6a, 0xe5, 0x6f, 0xdd, 0x49, + 0xfd, 0xc7, 0xc4, 0x08, 0xbe, 0xb3, 0xd9, 0x4a, + 0x88, 0x30, 0xa3, 0xc4, 0xb6, 0xfd, 0x52, 0x7c, + 0xc6, 0xae, 0x55, 0xfd, 0xd4, 0x9f, 0xdc, 0x7c, + 0x4f, 0xce, 0x78, 0xf8, 0xb6, 0xbe, 0x99, 0x3e, + 0x63, 0x57, 0x2b, 0x7e, 0xea, 0x4f, 0xee, 0x35, + 0xf5, 0xb4, 0x6d, 0x0f, 0x83, 0xed, 0x84, 0x3a, + 0x0b, 0xe1, 0xf2, 0x48, 0x1d, 0x98, 0xc6, 0xfe, + 0xda, 0xd0, 0x51, 0xb5, 0x1e, 0x18, 0x1c, 0x7d, + 0x15, 0xae, 0x54, 0x2a, 0x7e, 0xe8, 0x61, 0xe3, + 0x5a, 0x7a, 0x64, 0xf9, 0x8d, 0x5c, 0xa4, 0xcf, + 0x18, 0x99, 0x16, 0xf1, 0xc9, 0x8c, 0x92, 0x03, + 0x0d, 0x5c, 0x37, 0x54, 0x76, 0xdf, 0xe1, 0xfb, + 0x7b, 0xa7, 0x68, 0x19, 0x6e, 0x9e, 0xce, 0x02, + 0x49, 0xc9, 0x07, 0x8e, 0xae, 0x20, 0x36, 0x9f, + 0xe2, 0xb9, 0x32, 0xda, 0xc6, 0x69, 0x66, 0x9a, + 0xca, 0x23, 0x04, 0xd2, 0x31, 0xf4, 0x61, 0x73, + 0xd6, 0x7c, 0xae, 0x14, 0xd9, 0xe4, 0xd9, 0x1e, + 0x65, 0xba, 0x96, 0x46, 0x46, 0xb6, 0x57, 0xda, + 0x0d, 0xaf, 0x93, 0x9d, 0xff, 0x00, 0xa7, 0xaf, + 0x7d, 0x48, 0x13, 0x91, 0x2e, 0xa4, 0xd5, 0x2e, + 0xd1, 0x1d, 0xad, 0x78, 0x11, 0xbb, 0x65, 0x81, + 0xc4, 0x63, 0x3b, 0xf3, 0xc7, 0xaa, 0x9b, 0xc1, + 0xec, 0xee, 0x15, 0x5f, 0xc9, 0x8c, 0xc5, 0xbf, + 0x3c, 0x0e, 0xe1, 0xf9, 0xb7, 0x56, 0xa8, 0xad, + 0x67, 0x95, 0x7b, 0x52, 0x32, 0x45, 0x15, 0x4b, + 0x3b, 0x87, 0x61, 0xc4, 0x2c, 0x4c, 0x71, 0x48, + 0x65, 0x8a, 0x48, 0x83, 0x8c, 0xae, 0xb5, 0x23, + 0x50, 0xf3, 0x55, 0x97, 0xfb, 0x9f, 0x31, 0xab, + 0x95, 0x41, 0x18, 0x3e, 0x13, 0x21, 0xfe, 0x69, + 0x6e, 0xac, 0xa6, 0x30, 0x4e, 0xbb, 0x83, 0x0a, + 0xcf, 0xae, 0x9f, 0xec, 0xd5, 0x63, 0x62, 0xcd, + 0xa7, 0xf0, 0x93, 0x21, 0x72, 0x41, 0xf5, 0xe3, + 0xcf, 0x81, 0x9a, 0xda, 0xa5, 0xb4, 0x49, 0x83, + 0x2f, 0x30, 0x0e, 0x6f, 0x3e, 0x21, 0x19, 0xdd, + 0xc3, 0xab, 0x34, 0x93, 0xec, 0x34, 0xca, 0xb8, + 0xc1, 0x57, 0xdd, 0xe5, 0x87, 0xff, 0x00, 0xb1, + 0xec, 0xa9, 0x16, 0x78, 0x51, 0xb6, 0x9c, 0x74, + 0xe0, 0x7d, 0xe0, 0xdb, 0x81, 0x04, 0x71, 0x1f, + 0xc9, 0xa4, 0x12, 0x22, 0xb0, 0x8d, 0x65, 0x55, + 0xed, 0xc3, 0xa6, 0x9c, 0x67, 0xcd, 0xd5, 0x56, + 0xea, 0xc8, 0x03, 0x44, 0x31, 0xaf, 0xef, 0x36, + 0xe0, 0x38, 0xf9, 0xb1, 0xd7, 0x9a, 0xb0, 0xdc, + 0x77, 0xeb, 0x3f, 0xd6, 0xd4, 0x27, 0x9e, 0xd1, + 0x5e, 0x52, 0x37, 0xb6, 0x48, 0xcf, 0xb2, 0xba, + 0x10, 0xf7, 0xdb, 0xbe, 0xba, 0x10, 0xf7, 0xdb, + 0xbe, 0xba, 0x10, 0xf7, 0xdb, 0xbe, 0xba, 0x10, + 0xf7, 0xdb, 0xbe, 0xba, 0x10, 0xf7, 0xdb, 0xbe, + 0xba, 0x10, 0xf7, 0xdb, 0xbe, 0xba, 0x10, 0xf7, + 0xdb, 0xbe, 0x97, 0xfc, 0x90, 0xe3, 0xf8, 0xdb, + 0xbe, 0xa3, 0x8a, 0x24, 0x09, 0x1a, 0xae, 0x15, + 0x47, 0x55, 0x7f, 0xff, 0xc4, 0x00, 0x24, 0x10, + 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x03, 0x00, + 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x11, 0x21, 0x00, 0x31, 0x41, 0x51, 0x61, + 0x71, 0x10, 0x20, 0x81, 0x30, 0x91, 0xa1, 0xc1, + 0xf0, 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, + 0x01, 0x3f, 0x21, 0x23, 0x87, 0x57, 0x86, 0x93, + 0x22, 0x56, 0x26, 0xfb, 0xeb, 0xee, 0xc9, 0x93, + 0x26, 0x4c, 0x99, 0x6b, 0xbd, 0xa5, 0x3d, 0x0e, + 0xcf, 0xfd, 0xaf, 0x8a, 0x64, 0x9d, 0x34, 0xaa, + 0xec, 0x3b, 0x49, 0x3e, 0x71, 0x65, 0x91, 0x2f, + 0x9b, 0x21, 0x06, 0x3d, 0xc3, 0x90, 0xa3, 0xe2, + 0x58, 0x28, 0x11, 0xd2, 0x5f, 0xe9, 0x18, 0xcd, + 0x33, 0xe3, 0x96, 0x34, 0x49, 0x24, 0x40, 0x8b, + 0x40, 0x04, 0xe0, 0x18, 0x99, 0xe9, 0x2c, 0xe7, + 0xa8, 0x10, 0xd1, 0x38, 0xcd, 0x38, 0x56, 0xc3, + 0x11, 0x13, 0xd1, 0xda, 0x69, 0x78, 0xb4, 0x62, + 0x80, 0x2e, 0x08, 0x82, 0x0f, 0x92, 0xb2, 0x2a, + 0x63, 0xe4, 0x0a, 0x06, 0x89, 0xa4, 0xe5, 0x2e, + 0x42, 0x96, 0x1b, 0x41, 0x52, 0x21, 0x06, 0xbc, + 0x71, 0xbb, 0x3e, 0x32, 0x1c, 0x26, 0xe5, 0x06, + 0x70, 0x14, 0x09, 0x72, 0x7e, 0x97, 0x37, 0x54, + 0x9b, 0x49, 0xcf, 0x55, 0x58, 0x2a, 0x93, 0x43, + 0x85, 0x08, 0x92, 0xda, 0x1e, 0x1e, 0x5c, 0x96, + 0x5f, 0x80, 0x6a, 0x8e, 0xc6, 0x68, 0xc5, 0x23, + 0x0f, 0x38, 0xd1, 0x86, 0x35, 0x14, 0x2e, 0xe5, + 0xa9, 0x1e, 0x6c, 0xb9, 0x3e, 0x40, 0x6d, 0xd9, + 0x49, 0x4f, 0xd5, 0x9c, 0xd0, 0x2f, 0x2a, 0x65, + 0xc5, 0x6c, 0x0f, 0x47, 0xbc, 0x46, 0x7d, 0xa7, + 0xc1, 0xd1, 0xf1, 0x52, 0x32, 0x3c, 0x22, 0xdc, + 0x4a, 0x27, 0x25, 0x55, 0x2e, 0xfc, 0x87, 0x71, + 0xac, 0x4c, 0xb0, 0x18, 0x7e, 0x9a, 0x40, 0x19, + 0x13, 0xe1, 0x2d, 0xf4, 0xb6, 0xd5, 0x76, 0xc1, + 0x94, 0xdc, 0x27, 0xa3, 0x5d, 0x3a, 0x32, 0x7a, + 0x42, 0x52, 0x20, 0x02, 0x6c, 0xac, 0x14, 0xa8, + 0x62, 0x21, 0x84, 0xf9, 0x01, 0xdf, 0xbb, 0xf0, + 0x32, 0x4b, 0x0d, 0xb2, 0x36, 0x4c, 0x4e, 0xca, + 0x75, 0xe3, 0xbc, 0xf6, 0xcf, 0x6c, 0x72, 0x7e, + 0x13, 0x24, 0x3a, 0xc8, 0x3a, 0xc8, 0x3a, 0xc2, + 0xda, 0x27, 0xf0, 0x77, 0x83, 0xd0, 0x30, 0x7d, + 0x23, 0x96, 0xfa, 0x27, 0x40, 0x50, 0x04, 0xaf, + 0x06, 0x5e, 0xbb, 0xdf, 0xfa, 0xfa, 0x83, 0x95, + 0xf8, 0xcc, 0x92, 0xff, 0x00, 0x81, 0x54, 0x15, + 0x6e, 0x19, 0x0b, 0x46, 0x10, 0xe2, 0xa4, 0x9e, + 0xfd, 0x8f, 0x26, 0x18, 0xda, 0xf0, 0x8f, 0xbf, + 0xb0, 0x14, 0xbc, 0x00, 0xec, 0x0a, 0x84, 0xe5, + 0x36, 0x27, 0x52, 0x5e, 0x04, 0xf6, 0xc7, 0xea, + 0x13, 0xe6, 0x90, 0xd3, 0x22, 0x72, 0x53, 0x82, + 0x29, 0x02, 0xc6, 0xa1, 0xb3, 0x4b, 0xdf, 0x5b, + 0xd5, 0x35, 0x92, 0x04, 0x6c, 0x89, 0x64, 0x94, + 0xa1, 0x95, 0x1e, 0x91, 0xac, 0xd9, 0x54, 0x86, + 0xfb, 0x11, 0x2d, 0x27, 0x26, 0x58, 0x09, 0x23, + 0x51, 0x81, 0xab, 0x8f, 0xc1, 0xbc, 0xaa, 0xd2, + 0xba, 0xb9, 0x86, 0xc3, 0x87, 0x2a, 0xb3, 0x2e, + 0x94, 0x1b, 0x03, 0xa4, 0xfe, 0xcc, 0x94, 0x08, + 0xb1, 0x7b, 0x25, 0xb3, 0xd6, 0x29, 0x4f, 0x38, + 0x16, 0x55, 0x11, 0xe9, 0x69, 0xfe, 0x1c, 0x33, + 0x3c, 0xc1, 0xb4, 0xec, 0x46, 0x93, 0xc3, 0x92, + 0x14, 0x95, 0x94, 0x54, 0xb8, 0xe1, 0x41, 0x16, + 0x55, 0xf2, 0x2a, 0x6e, 0x2c, 0x10, 0x18, 0xc0, + 0x12, 0x02, 0x08, 0xe9, 0x0f, 0x0a, 0x22, 0x25, + 0x68, 0x2b, 0x16, 0xa2, 0xf8, 0x80, 0x68, 0x11, + 0x5c, 0x57, 0x4a, 0x22, 0x87, 0x1a, 0xee, 0x11, + 0x82, 0x15, 0x48, 0x02, 0xcb, 0xad, 0xa5, 0x38, + 0xcb, 0x89, 0xd6, 0xb7, 0xae, 0x45, 0x9e, 0x93, + 0x1a, 0x8c, 0xbe, 0x8e, 0xf8, 0x42, 0x10, 0xc0, + 0x53, 0x4c, 0x91, 0x2d, 0xc4, 0x43, 0x5b, 0xd4, + 0xb8, 0x72, 0xa7, 0x0d, 0xb4, 0xfb, 0x48, 0x9f, + 0xe0, 0x8d, 0x9a, 0x36, 0x68, 0xd9, 0xb3, 0x22, + 0x57, 0x21, 0x4a, 0x98, 0x31, 0x3a, 0x26, 0x01, + 0xd6, 0x7f, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, + 0x12, 0x01, 0x27, 0x03, 0xc0, 0x00, 0x97, 0x81, + 0x20, 0x90, 0x83, 0xe8, 0x82, 0x2d, 0x20, 0xb2, + 0x48, 0xa9, 0x2c, 0xc8, 0x0e, 0xdb, 0x03, 0x20, + 0xff, 0x00, 0xfe, 0x20, 0x70, 0xe4, 0x93, 0x92, + 0x3c, 0x9f, 0x9c, 0x16, 0xd9, 0xb4, 0x8f, 0xff, + 0xc4, 0x00, 0x1e, 0x11, 0x00, 0x03, 0x00, 0x02, + 0x02, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x10, + 0x31, 0x20, 0x21, 0x30, 0x41, 0x51, 0x61, 0xff, + 0xda, 0x00, 0x08, 0x01, 0x03, 0x01, 0x01, 0x3f, + 0x10, 0x94, 0x84, 0x21, 0x08, 0x43, 0xb2, 0xf6, + 0x7e, 0xc4, 0x3f, 0xaf, 0x03, 0x50, 0xfc, 0x20, + 0xc6, 0xe3, 0x68, 0x69, 0xbd, 0xe1, 0xaf, 0x93, + 0xf5, 0x10, 0xe7, 0x26, 0x8e, 0x2d, 0x14, 0x7d, + 0xba, 0xc8, 0x42, 0x1a, 0xb8, 0xb5, 0x10, 0x84, + 0x21, 0xa2, 0xe0, 0xde, 0x89, 0x88, 0x42, 0x1a, + 0x65, 0xb9, 0x98, 0x42, 0x32, 0x0b, 0x59, 0x7d, + 0xf2, 0x82, 0xd6, 0x21, 0x08, 0x42, 0x10, 0x84, + 0xc7, 0xff, 0xc4, 0x00, 0x1f, 0x11, 0x00, 0x03, + 0x00, 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x11, 0x20, 0x31, 0x10, 0x21, 0x41, 0x51, 0x61, + 0x30, 0x71, 0xff, 0xda, 0x00, 0x08, 0x01, 0x02, + 0x01, 0x01, 0x3f, 0x10, 0xb0, 0xbf, 0x0a, 0x5f, + 0x85, 0x29, 0x4e, 0x97, 0xc7, 0x93, 0xe6, 0x53, + 0xf4, 0xfc, 0x12, 0x45, 0xef, 0x87, 0x7f, 0xed, + 0x9a, 0xd2, 0x86, 0xc4, 0xd2, 0xd7, 0x07, 0xc8, + 0x44, 0xdd, 0x65, 0x4a, 0x53, 0x6e, 0x34, 0x41, + 0x44, 0xa2, 0x29, 0x4a, 0x6e, 0xc5, 0x60, 0xa5, + 0x29, 0x4d, 0x98, 0x27, 0x92, 0x94, 0xa5, 0x29, + 0xb7, 0x29, 0x5e, 0x69, 0x4a, 0x51, 0xef, 0x95, + 0xd6, 0x6f, 0x9a, 0x52, 0xe5, 0xff, 0xc4, 0x00, + 0x24, 0x10, 0x01, 0x01, 0x00, 0x02, 0x02, 0x03, + 0x00, 0x02, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x11, 0x00, 0x21, 0x31, 0x61, + 0x41, 0x51, 0x71, 0x20, 0xa1, 0x10, 0x81, 0x91, + 0xb1, 0xc1, 0xd1, 0xff, 0xda, 0x00, 0x08, 0x01, + 0x01, 0x00, 0x01, 0x3f, 0x10, 0x5a, 0xb8, 0xa5, + 0x42, 0x42, 0xd8, 0x10, 0xa2, 0x81, 0x80, 0x3f, + 0x28, 0x22, 0x64, 0xc9, 0x13, 0x35, 0x4f, 0x26, + 0x1c, 0xdf, 0x93, 0xd6, 0x43, 0xfa, 0xb1, 0x16, + 0x6b, 0x21, 0xa7, 0x08, 0x2e, 0x63, 0x96, 0x2d, + 0x37, 0x58, 0x08, 0x03, 0x00, 0x29, 0x80, 0x40, + 0x95, 0xe6, 0x00, 0x8f, 0xbc, 0x29, 0x43, 0x42, + 0xd8, 0xc9, 0x88, 0x86, 0x61, 0xbd, 0x45, 0xd7, + 0x64, 0x94, 0x18, 0xda, 0x72, 0xe7, 0xca, 0x3a, + 0x50, 0x08, 0x9b, 0x14, 0x29, 0x93, 0x16, 0xd8, + 0x5d, 0x6a, 0x61, 0xa8, 0x85, 0x97, 0x0b, 0xf9, + 0x93, 0x87, 0x26, 0x34, 0xa9, 0x03, 0x77, 0x8d, + 0x05, 0x05, 0xc1, 0x29, 0xa1, 0x52, 0x22, 0x11, + 0x83, 0x70, 0x27, 0x8a, 0x81, 0x6e, 0x9b, 0x90, + 0x88, 0x68, 0x42, 0xb8, 0xd4, 0x1f, 0xd0, 0xb7, + 0x16, 0x1b, 0x6c, 0x13, 0xba, 0xaf, 0x79, 0xd8, + 0xcf, 0x8d, 0x3a, 0xd9, 0xf9, 0x37, 0x80, 0xa9, + 0x5f, 0x06, 0x25, 0x2c, 0x49, 0x6d, 0x13, 0xa1, + 0x2c, 0x5d, 0x52, 0x45, 0x14, 0xaf, 0x43, 0x02, + 0xd1, 0x35, 0xa6, 0xc5, 0x1a, 0xdb, 0x72, 0x93, + 0x1d, 0xc8, 0x2e, 0x1a, 0x3b, 0x73, 0x42, 0xa6, + 0x0a, 0xbc, 0x4f, 0xe7, 0xa8, 0xb9, 0x46, 0x82, + 0xd3, 0x48, 0xf3, 0xaa, 0xcb, 0xb6, 0x94, 0x10, + 0x6e, 0x1a, 0x75, 0xac, 0x42, 0x4e, 0xf2, 0x80, + 0xd9, 0xa2, 0xab, 0xea, 0xf2, 0xe1, 0xb1, 0x34, + 0x5e, 0x36, 0x1f, 0x41, 0x9f, 0x59, 0xdc, 0xc9, + 0x9c, 0xe9, 0xe2, 0xa1, 0x4c, 0xdb, 0x5a, 0x1b, + 0xbc, 0xde, 0xe9, 0xf4, 0x8b, 0xf4, 0x40, 0xd9, + 0x82, 0x41, 0xa6, 0x0b, 0x7e, 0xa1, 0x16, 0x88, + 0x86, 0x91, 0x10, 0xe6, 0x97, 0x15, 0xad, 0x8e, + 0x12, 0x29, 0x48, 0xfd, 0xda, 0xa1, 0x0d, 0xea, + 0xe4, 0x11, 0x15, 0x2a, 0x85, 0x8b, 0xa3, 0x71, + 0x23, 0xaa, 0xd1, 0x8d, 0x31, 0x85, 0x79, 0x29, + 0x01, 0xc8, 0xb2, 0x02, 0x18, 0xe1, 0x70, 0xb4, + 0x72, 0x56, 0x80, 0x6d, 0x18, 0x3f, 0x8a, 0xed, + 0x25, 0xcf, 0x6c, 0x2b, 0xa1, 0xfd, 0xb3, 0x8b, + 0x4d, 0x71, 0xac, 0x0a, 0x40, 0x4e, 0xb0, 0x12, + 0x72, 0xa1, 0x41, 0xe5, 0x7f, 0xcf, 0x70, 0xc2, + 0xec, 0xa0, 0x85, 0x7d, 0xaf, 0xb5, 0x6a, 0xbe, + 0xdc, 0x09, 0xc4, 0x33, 0xeb, 0x3e, 0xf3, 0xb7, + 0x9b, 0xf0, 0xfd, 0x3b, 0x67, 0x40, 0x2a, 0xbe, + 0x8c, 0x93, 0x86, 0x23, 0x78, 0xf4, 0x3a, 0x3f, + 0xcd, 0xcf, 0xaf, 0xde, 0x7d, 0x7e, 0xf3, 0xeb, + 0xf7, 0x9f, 0x5f, 0xbc, 0xed, 0x86, 0xfe, 0x1d, + 0x57, 0x8f, 0x2d, 0x33, 0x02, 0x1b, 0x08, 0xe0, + 0xab, 0x26, 0x2d, 0x95, 0x2e, 0x48, 0xbb, 0x0a, + 0x6a, 0x52, 0x82, 0x6c, 0x66, 0x4b, 0xab, 0xa3, + 0x95, 0x4d, 0x5e, 0xc4, 0x3e, 0x39, 0xf5, 0x9f, + 0x59, 0xf5, 0x9f, 0x59, 0xf5, 0x9d, 0xa4, 0xf8, + 0xa8, 0x5a, 0xba, 0x86, 0xa8, 0x22, 0x29, 0x40, + 0x34, 0x46, 0x39, 0xce, 0xbf, 0x78, 0x07, 0x24, + 0x88, 0xcb, 0x87, 0x13, 0x18, 0x98, 0xab, 0x90, + 0x19, 0x1a, 0x8f, 0x53, 0xa9, 0x31, 0xbf, 0x01, + 0x9f, 0x79, 0x02, 0x52, 0x4c, 0x26, 0xc6, 0x60, + 0x24, 0xe2, 0x4d, 0x71, 0x84, 0x82, 0x52, 0x9e, + 0x25, 0x01, 0xdd, 0x5c, 0x48, 0x26, 0x49, 0x08, + 0x01, 0x45, 0x73, 0x74, 0x8a, 0xa0, 0x9f, 0x02, + 0x5a, 0x08, 0x80, 0xfa, 0x58, 0xe2, 0x8e, 0x75, + 0x09, 0x08, 0x11, 0x4d, 0xbd, 0xf8, 0x6f, 0x26, + 0x76, 0x3e, 0x2f, 0x81, 0x03, 0xed, 0x46, 0x76, + 0xc3, 0x62, 0x82, 0xf4, 0x0c, 0x69, 0x9f, 0x10, + 0x4e, 0x93, 0x05, 0xf4, 0x82, 0x09, 0x41, 0xca, + 0xbd, 0x09, 0x41, 0x94, 0x32, 0xc0, 0xa7, 0xa8, + 0x28, 0x6b, 0xa3, 0x47, 0xfa, 0xcd, 0x07, 0xc0, + 0x2f, 0x79, 0x3b, 0xae, 0x9a, 0x5c, 0xb3, 0xcc, + 0x2f, 0x1a, 0xb6, 0x1c, 0x42, 0xc0, 0x7c, 0x6a, + 0x14, 0xcf, 0x82, 0x5e, 0xd2, 0xe6, 0x50, 0x98, + 0x21, 0x50, 0x3f, 0x97, 0xcc, 0x68, 0x54, 0x93, + 0x4a, 0x98, 0xa0, 0x9b, 0x40, 0xb1, 0xde, 0xb9, + 0x29, 0x5a, 0x0b, 0x4a, 0x80, 0x3b, 0xf6, 0x3d, + 0x19, 0x9e, 0x5d, 0xae, 0x42, 0xb8, 0x61, 0xd2, + 0x50, 0x15, 0x15, 0x01, 0xf8, 0x88, 0x9f, 0x70, + 0xf5, 0xd8, 0x8f, 0x7a, 0x2b, 0x49, 0xdf, 0xe5, + 0x67, 0x6c, 0xdd, 0xb3, 0x4c, 0xda, 0xe6, 0xd0, + 0xed, 0x98, 0x58, 0xdf, 0x91, 0x94, 0xeb, 0x05, + 0x4f, 0xa5, 0x1c, 0xd0, 0x3c, 0x06, 0x7f, 0xff, + 0xd9, +}; + +const struct fsdata_file file_tm4c_jpg[] = +{ + { + NULL, + data_tm4c_jpg, + data_tm4c_jpg + 10, + sizeof(data_tm4c_jpg) - 10 + } +}; + +const struct fsdata_file file_ti_jpg[] = +{ + { + file_tm4c_jpg, + data_ti_jpg, + data_ti_jpg + 8, + sizeof(data_ti_jpg) - 8 + } +}; + +const struct fsdata_file file_styles_css[] = +{ + { + file_ti_jpg, + data_styles_css, + data_styles_css + 12, + sizeof(data_styles_css) - 12 + } +}; + +const struct fsdata_file file_overview_htm[] = +{ + { + file_styles_css, + data_overview_htm, + data_overview_htm + 14, + sizeof(data_overview_htm) - 14 + } +}; + +const struct fsdata_file file_javascript_js[] = +{ + { + file_overview_htm, + data_javascript_js, + data_javascript_js + 15, + sizeof(data_javascript_js) - 15 + } +}; + +const struct fsdata_file file_index_htm[] = +{ + { + file_javascript_js, + data_index_htm, + data_index_htm + 11, + sizeof(data_index_htm) - 11 + } +}; + +const struct fsdata_file file_favicon_ico[] = +{ + { + file_index_htm, + data_favicon_ico, + data_favicon_ico + 13, + sizeof(data_favicon_ico) - 13 + } +}; + +const struct fsdata_file file_dk_tm4c129x_jpg[] = +{ + { + file_favicon_ico, + data_dk_tm4c129x_jpg, + data_dk_tm4c129x_jpg + 17, + sizeof(data_dk_tm4c129x_jpg) - 17 + } +}; + +const struct fsdata_file file_block_jpg[] = +{ + { + file_dk_tm4c129x_jpg, + data_block_jpg, + data_block_jpg + 11, + sizeof(data_block_jpg) - 11 + } +}; + +const struct fsdata_file file_block_htm[] = +{ + { + file_block_jpg, + data_block_htm, + data_block_htm + 11, + sizeof(data_block_htm) - 11 + } +}; + +const struct fsdata_file file_about_htm[] = +{ + { + file_block_htm, + data_about_htm, + data_about_htm + 11, + sizeof(data_about_htm) - 11 + } +}; + +const struct fsdata_file file_404_htm[] = +{ + { + file_about_htm, + data_404_htm, + data_404_htm + 9, + sizeof(data_404_htm) - 9 + } +}; + +#define FS_ROOT file_404_htm + +#define FS_NUMFILES 12 + diff --git a/boards/dk-tm4c129x/enet_lwip/enet_lwip.c b/boards/dk-tm4c129x/enet_lwip/enet_lwip.c new file mode 100644 index 0000000..cb09eb5 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_lwip.c @@ -0,0 +1,455 @@ +//***************************************************************************** +// +// enet_lwip.c - Sample WebServer Application using lwIP. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "grlib/grlib.h" +#include "utils/locator.h" +#include "utils/lwiplib.h" +#include "utils/ustdlib.h" +#include "httpserver_raw/httpd.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "enet_fs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Ethernet with lwIP (enet_lwip)

      +//! +//! This example application demonstrates the operation of the Tiva +//! Ethernet controller using the lwIP TCP/IP Stack configured to operate as +//! an HTTP file server (web server). DHCP is used to obtain an Ethernet +//! address. If DHCP times out without obtaining an address, AUTOIP will be +//! used to obtain a link-local address. The address that is selected will be +//! shown on the QVGA display. +//! +//! The file system code will first check to see if an SD card has been plugged +//! into the microSD slot. If so, all file requests from the web server will +//! be directed to the SD card. Otherwise, a default set of pages served up +//! by an internal file system will be used. Source files for the internal +//! file system image can be found in the ``fs'' directory. If any of these +//! files are changed, the file system image (enet_fsdata.h) should be +//! rebuilt using the command: +//! +//! ../../../../tools/bin/makefsfile -i fs -o enet_fsdata.h -r -h -q +//! +//! For additional details on lwIP, refer to the lwIP web page at: +//! http://savannah.nongnu.org/projects/lwip/ +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines for setting up the system clock. +// +//***************************************************************************** +#define SYSTICKHZ 100 +#define SYSTICKMS (1000 / SYSTICKHZ) + +//***************************************************************************** +// +// Interrupt priority definitions. The top 3 bits of these values are +// significant with lower values indicating higher priority interrupts. +// +//***************************************************************************** +#define SYSTICK_INT_PRIORITY 0x80 +#define ETHERNET_INT_PRIORITY 0xC0 + +//***************************************************************************** +// +// The positions of the circles in the animation used while waiting for an IP +// address. +// +//***************************************************************************** +const int32_t g_ppi32CirclePos[][2] = +{ + { + 12, 0 + }, + { + 8, -9 + }, + { + 0, -12 + }, + { + -8, -9 + }, + { + -12, 0 + }, + { + -8, 9 + }, + { + 0, 12 + }, + { + 8, 9 + } +}; + +//***************************************************************************** +// +// The colors of the circles in the animation used while waiting for an IP +// address. +// +//***************************************************************************** +const uint32_t g_pui32CircleColor[] = +{ + 0x111111, + 0x333333, + 0x555555, + 0x777777, + 0x999999, + 0xbbbbbb, + 0xdddddd, + 0xffffff, +}; + +//***************************************************************************** +// +// The current color index for the animation used while waiting for an IP +// address. +// +//***************************************************************************** +uint32_t g_ui32ColorIdx; + +//***************************************************************************** +// +// The current IP address. +// +//***************************************************************************** +uint32_t g_ui32IPAddress; + +//***************************************************************************** +// +// The application's graphics context. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The system clock frequency. Used by the SD card driver. +// +//***************************************************************************** +uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Display an lwIP type IP Address. +// +//***************************************************************************** +void +DisplayIPAddress(uint32_t ui32Addr, uint32_t ui32Col, uint32_t ui32Row) +{ + char pcBuf[16]; + + // + // Convert the IP Address into a string. + // + usprintf(pcBuf, "%d.%d.%d.%d", ui32Addr & 0xff, (ui32Addr >> 8) & 0xff, + (ui32Addr >> 16) & 0xff, (ui32Addr >> 24) & 0xff); + + // + // Display the string. + // + GrStringDraw(&g_sContext, pcBuf, -1, ui32Col, ui32Row, false); +} + +//***************************************************************************** +// +// Required by lwIP library to support any host-related timer functions. +// +//***************************************************************************** +void +lwIPHostTimerHandler(void) +{ + uint32_t ui32Idx, ui32NewIPAddress, ui32Width, ui32Height; + tRectangle sRect; + + // + // Get the width and height of the display. + // + ui32Width = GrContextDpyWidthGet(&g_sContext); + ui32Height = GrContextDpyHeightGet(&g_sContext); + + // + // Get the current IP address. + // + ui32NewIPAddress = lwIPLocalIPAddrGet(); + + // + // See if the IP address has changed. + // + if(ui32NewIPAddress != g_ui32IPAddress) + { + // + // Clear the display. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = ui32Width - 1; + sRect.i16YMax = ui32Height - 1; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // See if there is an IP address assigned. + // + if(ui32NewIPAddress == 0xffffffff) + { + // + // Indicate that there is no link. + // + GrStringDrawCentered(&g_sContext, "Waiting for link", -1, + ui32Width / 2, (ui32Height / 2) - 18, false); + } + else if(ui32NewIPAddress == 0) + { + // + // There is no IP address, so indicate that the DHCP process is + // running. + // + GrStringDrawCentered(&g_sContext, "Waiting for IP address", -1, + ui32Width / 2, (ui32Height / 2) - 18, false); + } + else + { + // + // Display the new IP address information. + // + GrStringDraw(&g_sContext, "IP Address:", -1, (ui32Width / 2) - 110, + (ui32Height / 2) + 8 - 10 - 20, false); + GrStringDraw(&g_sContext, "Subnet Mask:", -1, + (ui32Width / 2) - 110, (ui32Height / 2) + 8 - 10, + false); + GrStringDraw(&g_sContext, "Gateway:", -1, (ui32Width / 2) - 110, + (ui32Height / 2) + 8 - 10 + 20, false); + DisplayIPAddress(ui32NewIPAddress, ui32Width / 2, + (ui32Height / 2) + 8 - 10 - 20); + DisplayIPAddress(lwIPLocalNetMaskGet(), ui32Width / 2, + (ui32Height / 2) + 8 - 10); + DisplayIPAddress(lwIPLocalGWAddrGet(), ui32Width / 2, + (ui32Height / 2) + 8 - 10 + 20); + } + + // + // Save the new IP address. + // + g_ui32IPAddress = ui32NewIPAddress; + } + + // + // If there is not an IP address, draw the animated circle. + // + if((ui32NewIPAddress == 0) || (ui32NewIPAddress == 0xffffffff)) + { + // + // Loop through the circles in the animation. + // + for(ui32Idx = 0; ui32Idx < 8; ui32Idx++) + { + // + // Draw this circle. + // + GrContextForegroundSet(&g_sContext, + g_pui32CircleColor[(g_ui32ColorIdx + + ui32Idx) & 7]); + GrCircleFill(&g_sContext, + (ui32Width / 2) + g_ppi32CirclePos[ui32Idx][0], + (ui32Height / 2) + g_ppi32CirclePos[ui32Idx][1] + 24, + 2); + } + + // + // Increment the color index. + // + g_ui32ColorIdx++; + } +} + +//***************************************************************************** +// +// The interrupt handler for the SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Call the lwIP timer handler. + // + lwIPTimer(SYSTICKMS); + + // + // Run the file system tick handler. + // + fs_tick(SYSTICKMS); +} + +//***************************************************************************** +// +// This example demonstrates the use of the Ethernet Controller. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32User0, ui32User1; + uint8_t pui8MACArray[8]; + + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "enet-lwip"); + + // + // Configure SysTick for a periodic interrupt. + // + ROM_SysTickPeriodSet(g_ui32SysClock / SYSTICKHZ); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Initialize the file system. + // + fs_init(); + + // + // Configure the hardware MAC address for Ethernet Controller filtering of + // incoming packets. The MAC address will be stored in the non-volatile + // USER0 and USER1 registers. + // + ROM_FlashUserGet(&ui32User0, &ui32User1); + if((ui32User0 == 0xffffffff) || (ui32User1 == 0xffffffff)) + { + // + // We should never get here. This is an error if the MAC address has + // not been programmed into the device. Exit the program. + // + GrContextForegroundSet(&g_sContext, ClrRed); + GrStringDrawCentered(&g_sContext, "MAC Address", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + (GrContextDpyHeightGet(&g_sContext) / 2) - 4, + false); + GrStringDrawCentered(&g_sContext, "Not Programmed!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + (GrContextDpyHeightGet(&g_sContext) / 2) + 16, + false); + while(1) + { + } + } + + // + // Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC + // address needed to program the hardware registers, then program the MAC + // address into the Ethernet Controller registers. + // + pui8MACArray[0] = ((ui32User0 >> 0) & 0xff); + pui8MACArray[1] = ((ui32User0 >> 8) & 0xff); + pui8MACArray[2] = ((ui32User0 >> 16) & 0xff); + pui8MACArray[3] = ((ui32User1 >> 0) & 0xff); + pui8MACArray[4] = ((ui32User1 >> 8) & 0xff); + pui8MACArray[5] = ((ui32User1 >> 16) & 0xff); + + // + // Initialze the lwIP library, using DHCP. + // + lwIPInit(g_ui32SysClock, pui8MACArray, 0, 0, 0, IPADDR_USE_DHCP); + + // + // Setup the device locator service. + // + LocatorInit(); + LocatorMACAddrSet(pui8MACArray); + LocatorAppTitleSet("DK-TM4C129X enet_lwip"); + + // + // Initialize the sample httpd server. + // + httpd_init(); + + // + // Set the interrupt priorities. We set the SysTick interrupt to a higher + // priority than the Ethernet interrupt to ensure that the file system + // tick is processed if SysTick occurs while the Ethernet handler is being + // processed. This is very likely since all the TCP/IP and HTTP work is + // done in the context of the Ethernet interrupt. + // + ROM_IntPrioritySet(INT_EMAC0, ETHERNET_INT_PRIORITY); + ROM_IntPrioritySet(FAULT_SYSTICK, SYSTICK_INT_PRIORITY); + + // + // Loop forever. All the work is done in interrupt handlers. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/enet_lwip/enet_lwip.ewd b/boards/dk-tm4c129x/enet_lwip/enet_lwip.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_lwip.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/enet_lwip/enet_lwip.ewp b/boards/dk-tm4c129x/enet_lwip/enet_lwip.ewp new file mode 100644 index 0000000..1ba03ba --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_lwip.ewp @@ -0,0 +1,831 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\enet_fs.c + + + $PROJ_DIR$\enet_lwip.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\..\..\..\third_party\lwip-1.4.1\apps\httpserver_raw\httpd.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\..\..\..\utils\locator.c + + + $PROJ_DIR$\..\..\..\..\utils\lwiplib.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/enet_lwip/enet_lwip.icf b/boards/dk-tm4c129x/enet_lwip/enet_lwip.icf new file mode 100644 index 0000000..807a33b --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_lwip.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// enet_lwip.icf - Linker configuration file for enet_lwip. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/enet_lwip/enet_lwip.ld b/boards/dk-tm4c129x/enet_lwip/enet_lwip.ld new file mode 100644 index 0000000..baa4004 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_lwip.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * enet_lwip.ld - Linker configuration file for enet_lwip. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/enet_lwip/enet_lwip.sct b/boards/dk-tm4c129x/enet_lwip/enet_lwip.sct new file mode 100644 index 0000000..1013c6d --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_lwip.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; enet_lwip.sct - Linker configuration file for enet_lwip. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/enet_lwip/enet_lwip.uvopt b/boards/dk-tm4c129x/enet_lwip/enet_lwip.uvopt new file mode 100644 index 0000000..428b6c8 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_lwip.uvopt @@ -0,0 +1,443 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + enet_lwip + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\enet_fs.c + enet_fs.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\enet_lwip.c + enet_lwip.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\lwip-1.4.1\apps\httpserver_raw\httpd.c + httpd.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\locator.c + locator.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\lwiplib.c + lwiplib.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + mmc-dk-tm4c129x.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 11 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 14 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 15 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/enet_lwip/enet_lwip.uvproj b/boards/dk-tm4c129x/enet_lwip/enet_lwip.uvproj new file mode 100644 index 0000000..0116cfd --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_lwip.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + enet_lwip + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + enet_lwip + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\enet_lwip.bin .\rvmdk\enet_lwip.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + .;..;..\..\..\..;..\..\..\..\third_party\lwip-1.4.1\apps;..\..\..\..\third_party\lwip-1.4.1\ports\tiva-tm4c129\include;..\..\..\..\third_party\lwip-1.4.1\src\include;..\..\..\..\third_party\lwip-1.4.1\src\include\ipv4;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + enet_lwip.sct + + + --entry Reset_Handler + + + + + + + + Source + + + enet_fs.c + 1 + .\enet_fs.c + + + enet_lwip.c + 1 + .\enet_lwip.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + frame.c + 1 + ..\drivers\frame.c + + + httpd.c + 1 + ..\..\..\..\third_party\lwip-1.4.1\apps\httpserver_raw\httpd.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + locator.c + 1 + ..\..\..\..\utils\locator.c + + + lwiplib.c + 1 + ..\..\..\..\utils\lwiplib.c + + + mmc-dk-tm4c129x.c + 1 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/enet_lwip/enet_lwip_ccs.cmd b/boards/dk-tm4c129x/enet_lwip/enet_lwip_ccs.cmd new file mode 100644 index 0000000..8b42fbf --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/enet_lwip_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * enet_lwip_ccs.cmd - CCS linker configuration file for enet_lwip. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/dk-tm4c129x/enet_lwip/ewarm/Exe/enet_lwip.bin b/boards/dk-tm4c129x/enet_lwip/ewarm/Exe/enet_lwip.bin new file mode 100644 index 0000000..e42598f Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/ewarm/Exe/enet_lwip.bin differ diff --git a/boards/dk-tm4c129x/enet_lwip/ewarm/Exe/enet_lwip.out b/boards/dk-tm4c129x/enet_lwip/ewarm/Exe/enet_lwip.out new file mode 100644 index 0000000..7cc3450 Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/ewarm/Exe/enet_lwip.out differ diff --git a/boards/dk-tm4c129x/enet_lwip/fs/404.htm b/boards/dk-tm4c129x/enet_lwip/fs/404.htm new file mode 100644 index 0000000..bc5fdb0 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/fs/404.htm @@ -0,0 +1,9 @@ + + + +
      +

      404 - file not found

      +

      Try here instead.

      +
      + + diff --git a/boards/dk-tm4c129x/enet_lwip/fs/about.htm b/boards/dk-tm4c129x/enet_lwip/fs/about.htm new file mode 100644 index 0000000..41528ca --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/fs/about.htm @@ -0,0 +1,32 @@ + + + + +DK-TM4C129X Development Kit + + + + +

      About Texas Instruments

      +
      +
      +Texas Instruments (TI) is a global +analog +and digital +semiconductor IC design +and manufacturing company. In addition to analog technologies, +digital signal processing (DSP) +and +microcontroller (MCU) +semiconductors, TI designs and manufactures semiconductor solutions for analog +and digital embedded and application processing. In the microcontroller space, +TI offers the broadest range of embedded control products, from ultra-low-power +MSP430™ +MCUs and high-performance +TMS320C2000™ +real-time controllers, to the 32 bit general-purpose ARM®-based MCUs of the +Tiva™ C Series +product line. Read more about us on the web at +www.ti.com. + + diff --git a/boards/dk-tm4c129x/enet_lwip/fs/block.htm b/boards/dk-tm4c129x/enet_lwip/fs/block.htm new file mode 100644 index 0000000..f9d4c04 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/fs/block.htm @@ -0,0 +1,17 @@ + + + + +DK-TM4C129X Development Kit + + + + +

      TM4C129XNCZAD Block Diagram

      +
      +
      +
      + +
      + + diff --git a/boards/dk-tm4c129x/enet_lwip/fs/block.jpg b/boards/dk-tm4c129x/enet_lwip/fs/block.jpg new file mode 100644 index 0000000..4a2504d Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/fs/block.jpg differ diff --git a/boards/dk-tm4c129x/enet_lwip/fs/dk-tm4c129x.jpg b/boards/dk-tm4c129x/enet_lwip/fs/dk-tm4c129x.jpg new file mode 100644 index 0000000..e59a70b Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/fs/dk-tm4c129x.jpg differ diff --git a/boards/dk-tm4c129x/enet_lwip/fs/favicon.ico b/boards/dk-tm4c129x/enet_lwip/fs/favicon.ico new file mode 100644 index 0000000..d14b5d9 Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/fs/favicon.ico differ diff --git a/boards/dk-tm4c129x/enet_lwip/fs/index.htm b/boards/dk-tm4c129x/enet_lwip/fs/index.htm new file mode 100644 index 0000000..f3e8e78 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/fs/index.htm @@ -0,0 +1,54 @@ + + + + + DK-TM4C129X Development Kit + + + + + +
      + + + + + + +
      + + Texas Instruments + + +
      + Tiva™ C Series TM4C129X Development Kit +
      +
      + DK-TM4C129X +
      +
      + + TM4C + +
      +

      +
      + +
      +
      +
      +

      + Copyright © 2013-2014 Texas Instruments Incorporated. All rights reserved. +
      + + diff --git a/boards/dk-tm4c129x/enet_lwip/fs/javascript.js b/boards/dk-tm4c129x/enet_lwip/fs/javascript.js new file mode 100644 index 0000000..e492c23 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/fs/javascript.js @@ -0,0 +1,53 @@ + + +window.onload = function() +{ + document.getElementById('about').onclick = loadAbout; + document.getElementById('overview').onclick = loadOverview; + document.getElementById('block').onclick = loadBlock; + + loadPage("about.htm"); +} + +function loadAbout() +{ + loadPage("about.htm"); + return false; +} + +function loadOverview() +{ + loadPage("overview.htm"); + return false; +} + +function loadBlock() +{ + loadPage("block.htm"); + return false; +} + +function loadPage(page) +{ + if(window.XMLHttpRequest) + { + xmlhttp = new XMLHttpRequest(); + } + else + { + xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + + xmlhttp.open("GET", page, true); + xmlhttp.setRequestHeader("Content-type", + "application/x-www-form-urlencoded"); + xmlhttp.send(); + + xmlhttp.onreadystatechange = function () + { + if((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) + { + document.getElementById("content").innerHTML = xmlhttp.responseText; + } + } +} diff --git a/boards/dk-tm4c129x/enet_lwip/fs/overview.htm b/boards/dk-tm4c129x/enet_lwip/fs/overview.htm new file mode 100644 index 0000000..b4f9094 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/fs/overview.htm @@ -0,0 +1,29 @@ + + + + +DK-TM4C129X Development Kit + + + + +

      Tiva™ C Series Product Line

      +
      +
      +As the first ARM® Cortex™-M4 microcontrollers (MCUs) to be +implemented on TI's proprietary 65-nm process technology, the Tiva C Series +provides customers an opportunity to increase their connectivity integration +without sacrificing price, performance, or power consumption. Every C Series +MCU integrates a floating-point core and high-performance analog while still +providing low-power modes to offer a great set of functional options. Today's +engineers understand that designs require more than hardware alone. Often, the +greatest challenge is software and +TivaWare for C Series is a +free library of C files that include both peripheral-level and +application-level code in source and in ROM for every Tiva C Series MCU. This +offering delivers USB, CAN, graphics, and sensor application libraries so +customers can focus their efforts on building applications instead of +programming their connectivity peripherals. The Tiva C Series provides an +excellent baseline for home, building, and industrial applications. + + diff --git a/boards/dk-tm4c129x/enet_lwip/fs/styles.css b/boards/dk-tm4c129x/enet_lwip/fs/styles.css new file mode 100644 index 0000000..3403359 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/fs/styles.css @@ -0,0 +1,104 @@ +/* Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. */ + +/* Styling for the entire document. */ +body +{ + background-color: white; + color: black; + font-family: Ariel,Helvetica,sans-serif; +} + +/* Styling for the heading div. */ +#heading +{ + clear: both; + margin-bottom: 10px; +} + +#heading_h1 +{ + font-size: 2em; + font-weight: bold; + text-align: center; +} + +#heading_h2 +{ + font-size: 1.25em; + font-weight: bold; + text-align: center; +} + +#heading hr +{ + border-bottom: 1px solid #ff0000; + border-top: 1px solid #ff0000; +} + +#heading a img +{ + border: 0; +} + +/* Styling for the menu div. */ +#menu +{ + float: left; + margin-bottom: 10px; + width: 225px; +} + +#menu ul +{ + list-style-type: none; + margin: 0; + padding: 0; +} + +#menu a:link, #menu a:visited +{ + background-color: #ff0000; + color: #ffffff; + display: block; + font-weight: bold; + margin-bottom: 2px; + margin-top: 2px; + padding: 4px; + text-align: center; + text-decoration: none; + width: 200px; +} + +#menu a:hover, #menu a:active +{ + background-color: #bf0000; +} + +/* Styling for the content div. */ +#content +{ + margin-bottom: 10px; + margin-left: 225px; +} + +#content_heading +{ + font-size: 1.5em; + font-weight: bold; + text-align: center; +} + +/* Styling for the footing div. */ +#footing +{ + clear: both; + font-size: .75em; + font-style: italic; + text-align: right; +} + +#footing hr +{ + border-bottom: 1px solid #ff0000; + border-top: 1px solid #ff0000; +} diff --git a/boards/dk-tm4c129x/enet_lwip/fs/ti.jpg b/boards/dk-tm4c129x/enet_lwip/fs/ti.jpg new file mode 100644 index 0000000..5d1669c Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/fs/ti.jpg differ diff --git a/boards/dk-tm4c129x/enet_lwip/fs/tm4c.jpg b/boards/dk-tm4c129x/enet_lwip/fs/tm4c.jpg new file mode 100644 index 0000000..1672a1d Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/fs/tm4c.jpg differ diff --git a/boards/dk-tm4c129x/enet_lwip/gcc/enet_lwip.axf b/boards/dk-tm4c129x/enet_lwip/gcc/enet_lwip.axf new file mode 100644 index 0000000..636e57c Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/gcc/enet_lwip.axf differ diff --git a/boards/dk-tm4c129x/enet_lwip/gcc/enet_lwip.bin b/boards/dk-tm4c129x/enet_lwip/gcc/enet_lwip.bin new file mode 100644 index 0000000..5f84444 Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/gcc/enet_lwip.bin differ diff --git a/boards/dk-tm4c129x/enet_lwip/lwipopts.h b/boards/dk-tm4c129x/enet_lwip/lwipopts.h new file mode 100644 index 0000000..314d1d1 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/lwipopts.h @@ -0,0 +1,439 @@ +//***************************************************************************** +// +// lwipopts.h - Configuration file for lwIP +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +// +// NOTE: This file has been derived from the lwIP/src/include/lwip/opt.h +// header file. +// +// For additional details, refer to the original "opt.h" file, and lwIP +// documentation. +// +//***************************************************************************** + +#ifndef __LWIPOPTS_H__ +#define __LWIPOPTS_H__ + +//***************************************************************************** +// +// ---------- Stellaris / lwIP Port Options ---------- +// +//***************************************************************************** +#define HOST_TMR_INTERVAL 100 // default is 0 +//#define DHCP_EXPIRE_TIMER_MSECS (60 * 1000) +//#define LWIP_HTTPD_SSI 1 +//#define LWIP_HTTPD_CGI 1 +#define LWIP_HTTPD_DYNAMIC_HEADERS 1 +//#define HTTPD_DEBUG LWIP_DBG_ON +#define EMAC_PHY_CONFIG (EMAC_PHY_TYPE_INTERNAL | EMAC_PHY_INT_MDIX_EN | \ + EMAC_PHY_AN_100B_T_FULL_DUPLEX) +#define PHY_PHYS_ADDR 0 +#define NUM_TX_DESCRIPTORS 24 +#define NUM_RX_DESCRIPTORS 8 + +//***************************************************************************** +// +// ---------- Platform specific locking ---------- +// +//***************************************************************************** +#define SYS_LIGHTWEIGHT_PROT 1 // default is 0 +#define NO_SYS 1 // default is 0 +//#define MEMCPY(dst,src,len) memcpy(dst,src,len) +//#define SMEMCPY(dst,src,len) memcpy(dst,src,len) + +//***************************************************************************** +// +// ---------- Memory options ---------- +// +//***************************************************************************** +//#define MEM_LIBC_MALLOC 0 +#define MEM_ALIGNMENT 4 +#define MEM_SIZE (64 * 1024) +//#define MEMP_OVERFLOW_CHECK 0 +//#define MEMP_SANITY_CHECK 0 +//#define MEM_USE_POOLS 0 +//#define MEMP_USE_CUSTOM_POOLS 0 + +//***************************************************************************** +// +// ---------- Internal Memory Pool Sizes ---------- +// +//***************************************************************************** +#define MEMP_NUM_PBUF 48 // Default 16 +//#define MEMP_NUM_RAW_PCB 4 +//#define MEMP_NUM_UDP_PCB 4 +#define MEMP_NUM_TCP_PCB 16 // Default 5 +//#define MEMP_NUM_TCP_PCB_LISTEN 8 +//#define MEMP_NUM_TCP_SEG 16 +//#define MEMP_NUM_REASSDATA 5 +//#define MEMP_NUM_ARP_QUEUE 30 +//#define MEMP_NUM_IGMP_GROUP 8 +#define MEMP_NUM_SYS_TIMEOUT 8 +//#define MEMP_NUM_NETBUF 2 +//#define MEMP_NUM_NETCONN 4 +//#define MEMP_NUM_TCPIP_MSG_API 8 +//#define MEMP_NUM_TCPIP_MSG_INPKT 8 +#define PBUF_POOL_SIZE 48 // Default 16 + +//***************************************************************************** +// +// ---------- ARP options ---------- +// +//***************************************************************************** +//#define LWIP_ARP 1 +//#define ARP_TABLE_SIZE 10 +//#define ARP_QUEUEING 1 +//#define ETHARP_TRUST_IP_MAC 1 + +//***************************************************************************** +// +// ---------- IP options ---------- +// +//***************************************************************************** +//#define IP_FORWARD 0 +//#define IP_OPTIONS_ALLOWED 1 +#define IP_REASSEMBLY 0 // default is 1 +#define IP_FRAG 0 // default is 1 +//#define IP_REASS_MAXAGE 3 +//#define IP_REASS_MAX_PBUFS 10 +//#define IP_FRAG_USES_STATIC_BUF 1 +//#define IP_FRAG_MAX_MTU 1500 +//#define IP_DEFAULT_TTL 255 + +//***************************************************************************** +// +// ---------- ICMP options ---------- +// +//***************************************************************************** +//#define LWIP_ICMP 1 +//#define ICMP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- RAW options ---------- +// +//***************************************************************************** +//#define LWIP_RAW 1 +//#define RAW_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- DHCP options ---------- +// +//***************************************************************************** +#define LWIP_DHCP 1 // default is 0 +//#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) + +//***************************************************************************** +// +// ---------- UPNP options ---------- +// +//***************************************************************************** +//#define LWIP_UPNP 0 + +//***************************************************************************** +// +// ---------- PTPD options ---------- +// +//***************************************************************************** +//#define LWIP_PTPD 0 + +//***************************************************************************** +// +// ---------- AUTOIP options ---------- +// +//***************************************************************************** +#define LWIP_AUTOIP 1 // default is 0 +#define LWIP_DHCP_AUTOIP_COOP ((LWIP_DHCP) && (LWIP_AUTOIP)) + // default is 0 +#define LWIP_DHCP_AUTOIP_COOP_TRIES 5 // default is 9 + +//***************************************************************************** +// +// ---------- SNMP options ---------- +// +//***************************************************************************** +//#define LWIP_SNMP 0 +//#define SNMP_CONCURRENT_REQUESTS 1 +//#define SNMP_TRAP_DESTINATIONS 1 +//#define SNMP_PRIVATE_MIB 0 +//#define SNMP_SAFE_REQUESTS 1 + +//***************************************************************************** +// +// ---------- IGMP options ---------- +// +//***************************************************************************** +//#define LWIP_IGMP 0 + +//***************************************************************************** +// +// ---------- DNS options ----------- +// +//***************************************************************************** +//#define LWIP_DNS 0 +//#define DNS_TABLE_SIZE 4 +//#define DNS_MAX_NAME_LENGTH 256 +//#define DNS_MAX_SERVERS 2 +//#define DNS_DOES_NAME_CHECK 1 +//#define DNS_USES_STATIC_BUF 1 +//#define DNS_MSG_SIZE 512 + +//***************************************************************************** +// +// ---------- UDP options ---------- +// +//***************************************************************************** +//#define LWIP_UDP 1 +//#define LWIP_UDPLITE 0 +//#define UDP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- TCP options ---------- +// +//***************************************************************************** +#define LWIP_TCP 1 +//#define TCP_TTL (IP_DEFAULT_TTL) +#define TCP_WND 4096 // default is 2048 +//#define TCP_MAXRTX 12 +//#define TCP_SYNMAXRTX 6 +//#define TCP_QUEUE_OOSEQ 1 +#define TCP_MSS 1500 // default is 128 +//#define TCP_CALCULATE_EFF_SEND_MSS 1 +#define TCP_SND_BUF (4 * TCP_MSS) + // default is 256, was 6 * +//#define TCP_SND_QUEUELEN (4 * (TCP_SND_BUF/TCP_MSS)) +//#define TCP_SNDLOWAT (TCP_SND_BUF/2) +//#define TCP_LISTEN_BACKLOG 0 +//#define TCP_DEFAULT_LISTEN_BACKLOG 0xff + +//***************************************************************************** +// +// ---------- API options ---------- +// +//***************************************************************************** +//#define LWIP_EVENT_API 0 +//#define LWIP_CALLBACK_API 1 + +//***************************************************************************** +// +// ---------- Pbuf options ---------- +// +//***************************************************************************** +#define PBUF_LINK_HLEN 16 // default is 14 +#define PBUF_POOL_BUFSIZE 512 + // default is LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) +#define ETH_PAD_SIZE 0 // default is 0 + +//***************************************************************************** +// +// ---------- Network Interfaces options ---------- +// +//***************************************************************************** +//#define LWIP_NETIF_HOSTNAME 0 +//#define LWIP_NETIF_API 0 +//#define LWIP_NETIF_STATUS_CALLBACK 0 +//#define LWIP_NETIF_LINK_CALLBACK 0 +//#define LWIP_NETIF_HWADDRHINT 0 + +//***************************************************************************** +// +// ---------- LOOPIF options ---------- +// +//***************************************************************************** +//#define LWIP_HAVE_LOOPIF 0 +//#define LWIP_LOOPIF_MULTITHREADING 1 + +//***************************************************************************** +// +// ---------- Thread options ---------- +// +//***************************************************************************** +//#define TCPIP_THREAD_NAME "tcpip_thread" +//#define TCPIP_THREAD_STACKSIZE 0 +//#define TCPIP_THREAD_PRIO 1 +//#define TCPIP_MBOX_SIZE 0 +//#define SLIPIF_THREAD_NAME "slipif_loop" +//#define SLIPIF_THREAD_STACKSIZE 0 +//#define SLIPIF_THREAD_PRIO 1 +//#define PPP_THREAD_NAME "pppMain" +//#define PPP_THREAD_STACKSIZE 0 +//#define PPP_THREAD_PRIO 1 +//#define DEFAULT_THREAD_NAME "lwIP" +//#define DEFAULT_THREAD_STACKSIZE 0 +//#define DEFAULT_THREAD_PRIO 1 +//#define DEFAULT_RAW_RECVMBOX_SIZE 0 +//#define DEFAULT_UDP_RECVMBOX_SIZE 0 +//#define DEFAULT_TCP_RECVMBOX_SIZE 0 +//#define DEFAULT_ACCEPTMBOX_SIZE 0 + +//***************************************************************************** +// +// ---------- Sequential layer options ---------- +// +//***************************************************************************** +//#define LWIP_TCPIP_CORE_LOCKING 0 +#define LWIP_NETCONN 0 // default is 1 + +//***************************************************************************** +// +// ---------- Socket Options ---------- +// +//***************************************************************************** +#define LWIP_SOCKET 0 // default is 1 +//#define LWIP_COMPAT_SOCKETS 1 +//#define LWIP_POSIX_SOCKETS_IO_NAMES 1 +//#define LWIP_TCP_KEEPALIVE 0 +//#define LWIP_SO_RCVTIMEO 0 +//#define LWIP_SO_RCVBUF 0 +//#define SO_REUSE 0 + +//***************************************************************************** +// +// ---------- Statistics options ---------- +// +//***************************************************************************** +//#define LWIP_STATS 1 +//#define LWIP_STATS_DISPLAY 0 +//#define LINK_STATS 1 +//#define ETHARP_STATS (LWIP_ARP) +//#define IP_STATS 1 +//#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) +//#define ICMP_STATS 1 +//#define IGMP_STATS (LWIP_IGMP) +//#define UDP_STATS (LWIP_UDP) +//#define TCP_STATS (LWIP_TCP) +//#define MEM_STATS 1 +//#define MEMP_STATS 1 +//#define SYS_STATS 1 + +//***************************************************************************** +// +// ---------- PPP options ---------- +// +//***************************************************************************** +//#define PPP_SUPPORT 0 +//#define PPPOE_SUPPORT 0 +//#define PPPOS_SUPPORT PPP_SUPPORT + +#if PPP_SUPPORT +//#define NUM_PPP 1 +//#define PAP_SUPPORT 0 +//#define CHAP_SUPPORT 0 +//#define MSCHAP_SUPPORT 0 +//#define CBCP_SUPPORT 0 +//#define CCP_SUPPORT 0 +//#define VJ_SUPPORT 0 +//#define MD5_SUPPORT 0 +//#define FSM_DEFTIMEOUT 6 +//#define FSM_DEFMAXTERMREQS 2 +//#define FSM_DEFMAXCONFREQS 10 +//#define FSM_DEFMAXNAKLOOPS 5 +//#define UPAP_DEFTIMEOUT 6 +//#define UPAP_DEFREQTIME 30 +//#define CHAP_DEFTIMEOUT 6 +//#define CHAP_DEFTRANSMITS 10 +//#define LCP_ECHOINTERVAL 0 +//#define LCP_MAXECHOFAILS 3 +//#define PPP_MAXIDLEFLAG 100 + +//#define PPP_MAXMTU 1500 +//#define PPP_DEFMRU 296 +#endif + +//***************************************************************************** +// +// ---------- checksum options ---------- +// +//***************************************************************************** +#define CHECKSUM_GEN_IP 0 +#define CHECKSUM_GEN_ICMP 0 +#define CHECKSUM_GEN_UDP 0 +#define CHECKSUM_GEN_TCP 0 +#define CHECKSUM_CHECK_IP 0 +#define CHECKSUM_CHECK_UDP 0 +#define CHECKSUM_CHECK_TCP 0 + +//***************************************************************************** +// +// ---------- Debugging options ---------- +// +//***************************************************************************** +#if 0 +#define U8_F "c" +#define S8_F "c" +#define X8_F "x" +#define U16_F "u" +#define S16_F "d" +#define X16_F "x" +#define U32_F "u" +#define S32_F "d" +#define X32_F "x" +extern void UARTprintf(const char *pcString, ...); +#define LWIP_DEBUG +#endif + +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SERIOUS +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE + +//#define LWIP_DBG_TYPES_ON LWIP_DBG_ON +#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH) + +//#define ETHARP_DEBUG LWIP_DBG_ON // default is OFF +//#define NETIF_DEBUG LWIP_DBG_ON // default is OFF +//#define PBUF_DEBUG LWIP_DBG_OFF +//#define API_LIB_DEBUG LWIP_DBG_OFF +//#define API_MSG_DEBUG LWIP_DBG_OFF +//#define SOCKETS_DEBUG LWIP_DBG_OFF +//#define ICMP_DEBUG LWIP_DBG_OFF +//#define IGMP_DEBUG LWIP_DBG_OFF +//#define INET_DEBUG LWIP_DBG_OFF +//#define IP_DEBUG LWIP_DBG_ON // default is OFF +//#define IP_REASS_DEBUG LWIP_DBG_OFF +//#define RAW_DEBUG LWIP_DBG_OFF +//#define MEM_DEBUG LWIP_DBG_OFF +//#define MEMP_DEBUG LWIP_DBG_OFF +//#define SYS_DEBUG LWIP_DBG_OFF +//#define TCP_DEBUG LWIP_DBG_OFF +//#define TCP_INPUT_DEBUG LWIP_DBG_OFF +//#define TCP_FR_DEBUG LWIP_DBG_OFF +//#define TCP_RTO_DEBUG LWIP_DBG_OFF +//#define TCP_CWND_DEBUG LWIP_DBG_OFF +//#define TCP_WND_DEBUG LWIP_DBG_OFF +//#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +//#define TCP_RST_DEBUG LWIP_DBG_OFF +//#define TCP_QLEN_DEBUG LWIP_DBG_OFF +//#define UDP_DEBUG LWIP_DBG_ON // default is OFF +//#define TCPIP_DEBUG LWIP_DBG_OFF +//#define PPP_DEBUG LWIP_DBG_OFF +//#define SLIP_DEBUG LWIP_DBG_OFF +//#define DHCP_DEBUG LWIP_DBG_ON // default is OFF +//#define AUTOIP_DEBUG LWIP_DBG_OFF +//#define SNMP_MSG_DEBUG LWIP_DBG_OFF +//#define SNMP_MIB_DEBUG LWIP_DBG_OFF +//#define DNS_DEBUG LWIP_DBG_OFF + +#endif /* __LWIPOPTS_H__ */ diff --git a/boards/dk-tm4c129x/enet_lwip/readme.txt b/boards/dk-tm4c129x/enet_lwip/readme.txt new file mode 100644 index 0000000..605aa1c --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/readme.txt @@ -0,0 +1,41 @@ +Ethernet with lwIP + +This example application demonstrates the operation of the Tiva +Ethernet controller using the lwIP TCP/IP Stack configured to operate as +an HTTP file server (web server). DHCP is used to obtain an Ethernet +address. If DHCP times out without obtaining an address, AUTOIP will be +used to obtain a link-local address. The address that is selected will be +shown on the QVGA display. + +The file system code will first check to see if an SD card has been plugged +into the microSD slot. If so, all file requests from the web server will +be directed to the SD card. Otherwise, a default set of pages served up +by an internal file system will be used. Source files for the internal +file system image can be found in the ``fs'' directory. If any of these +files are changed, the file system image (enet_fsdata.h) should be +rebuilt using the command: + + ../../../../tools/bin/makefsfile -i fs -o enet_fsdata.h -r -h -q + +For additional details on lwIP, refer to the lwIP web page at: +http://savannah.nongnu.org/projects/lwip/ + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/enet_lwip/rvmdk/enet_lwip.axf b/boards/dk-tm4c129x/enet_lwip/rvmdk/enet_lwip.axf new file mode 100644 index 0000000..ef7bd87 Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/rvmdk/enet_lwip.axf differ diff --git a/boards/dk-tm4c129x/enet_lwip/rvmdk/enet_lwip.bin b/boards/dk-tm4c129x/enet_lwip/rvmdk/enet_lwip.bin new file mode 100644 index 0000000..3be1620 Binary files /dev/null and b/boards/dk-tm4c129x/enet_lwip/rvmdk/enet_lwip.bin differ diff --git a/boards/dk-tm4c129x/enet_lwip/startup_ccs.c b/boards/dk-tm4c129x/enet_lwip/startup_ccs.c new file mode 100644 index 0000000..09439c6 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void lwIPEthernetIntHandler(void); +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/enet_lwip/startup_ewarm.c b/boards/dk-tm4c129x/enet_lwip/startup_ewarm.c new file mode 100644 index 0000000..21174f2 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void lwIPEthernetIntHandler(void); +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/enet_lwip/startup_gcc.c b/boards/dk-tm4c129x/enet_lwip/startup_gcc.c new file mode 100644 index 0000000..7ba6b86 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void lwIPEthernetIntHandler(void); +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/enet_lwip/startup_rvmdk.S b/boards/dk-tm4c129x/enet_lwip/startup_rvmdk.S new file mode 100644 index 0000000..d0afaf0 --- /dev/null +++ b/boards/dk-tm4c129x/enet_lwip/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN lwIPEthernetIntHandler + EXTERN SysTickIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD lwIPEthernetIntHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/enet_uip/Makefile b/boards/dk-tm4c129x/enet_uip/Makefile new file mode 100644 index 0000000..f0c0525 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/Makefile @@ -0,0 +1,106 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Ethernet with uIP. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=. +VPATH+=../../../../third_party/uip-1.0/apps/dhcpc +VPATH+=../drivers +VPATH+=../../../../third_party/uip-1.0/apps/httpd +VPATH+=../../../../third_party/uip-1.0/uip +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/uip-1.0/apps +IPATH+=../../../../third_party/uip-1.0/uip +IPATH+=../../../../third_party/uip-1.0 +IPATH+=../../../../utils + +# +# The default rule, which causes the Ethernet with uIP to be built. +# +all: ${COMPILER} +all: ${COMPILER}/enet_uip.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Ethernet with uIP. +# +${COMPILER}/enet_uip.axf: ${COMPILER}/dhcpc.o +${COMPILER}/enet_uip.axf: ${COMPILER}/enet_uip.o +${COMPILER}/enet_uip.axf: ${COMPILER}/frame.o +${COMPILER}/enet_uip.axf: ${COMPILER}/httpd.o +${COMPILER}/enet_uip.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/enet_uip.axf: ${COMPILER}/pinout.o +${COMPILER}/enet_uip.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/enet_uip.axf: ${COMPILER}/uartstdio.o +${COMPILER}/enet_uip.axf: ${COMPILER}/uip.o +${COMPILER}/enet_uip.axf: ${COMPILER}/uip_arp.o +${COMPILER}/enet_uip.axf: ${COMPILER}/uip_timer.o +${COMPILER}/enet_uip.axf: ${COMPILER}/ustdlib.o +${COMPILER}/enet_uip.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/enet_uip.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/enet_uip.axf: enet_uip.ld +SCATTERgcc_enet_uip=enet_uip.ld +ENTRY_enet_uip=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 -DDEBUG_OUTPUT -DUIP_OFFLOAD_ICMP_CHKSUM + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/enet_uip/ccs/.ccsimportspec b/boards/dk-tm4c129x/enet_uip/ccs/.ccsimportspec new file mode 100644 index 0000000..a415eb8 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_uip/ccs/.ccsproject b/boards/dk-tm4c129x/enet_uip/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_uip/ccs/.cproject b/boards/dk-tm4c129x/enet_uip/ccs/.cproject new file mode 100644 index 0000000..8fa2006 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/ccs/.cproject @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_uip/ccs/.project b/boards/dk-tm4c129x/enet_uip/ccs/.project new file mode 100644 index 0000000..ddf4617 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/ccs/.project @@ -0,0 +1,100 @@ + + + enet_uip + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + enet_uip.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_uip/enet_uip.c + + + enet_uip_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_uip/enet_uip_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/enet_uip/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/uip-1.0/uip/uip.c + 1 + SW_ROOT/third_party/uip-1.0/uip/uip.c + + + third_party/uip-1.0/uip/uip_arp.c + 1 + SW_ROOT/third_party/uip-1.0/uip/uip_arp.c + + + third_party/uip-1.0/uip/uip_timer.c + 1 + SW_ROOT/third_party/uip-1.0/uip/uip_timer.c + + + third_party/uip-1.0/apps/dhcpc/dhcpc.c + 1 + SW_ROOT/third_party/uip-1.0/apps/dhcpc/dhcpc.c + + + third_party/uip-1.0/apps/httpd/httpd.c + 1 + SW_ROOT/third_party/uip-1.0/apps/httpd/httpd.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/enet_uip/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/enet_uip/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/enet_uip/ccs/Debug/enet_uip.bin b/boards/dk-tm4c129x/enet_uip/ccs/Debug/enet_uip.bin new file mode 100644 index 0000000..f54b913 Binary files /dev/null and b/boards/dk-tm4c129x/enet_uip/ccs/Debug/enet_uip.bin differ diff --git a/boards/dk-tm4c129x/enet_uip/ccs/Debug/enet_uip.out b/boards/dk-tm4c129x/enet_uip/ccs/Debug/enet_uip.out new file mode 100644 index 0000000..ef573d9 Binary files /dev/null and b/boards/dk-tm4c129x/enet_uip/ccs/Debug/enet_uip.out differ diff --git a/boards/dk-tm4c129x/enet_uip/ccs/macros.ini_initial b/boards/dk-tm4c129x/enet_uip/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/enet_uip/ccs/target_config.ccxml b/boards/dk-tm4c129x/enet_uip/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/enet_uip/clock-arch.h b/boards/dk-tm4c129x/enet_uip/clock-arch.h new file mode 100644 index 0000000..f30285e --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/clock-arch.h @@ -0,0 +1,41 @@ +//***************************************************************************** +// +// clock-arch.h - uIP Project Specific Clock-Architecture header file. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +#include + +// +// Define how many clock ticks in one second. +// Note: This should match the value of SYSTICKHZ in the main program. +// +#define CLOCK_CONF_SECOND 100 + +// +// Define the clock type used for returning system ticks. +// +typedef uint32_t clock_time_t; + +#endif // __CLOCK_ARCH_H__ diff --git a/boards/dk-tm4c129x/enet_uip/enet_uip.c b/boards/dk-tm4c129x/enet_uip/enet_uip.c new file mode 100644 index 0000000..675f9af --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/enet_uip.c @@ -0,0 +1,1065 @@ +//***************************************************************************** +// +// enet_uip.c - Sample WebServer Application for Ethernet Demo +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_emac.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/emac.h" +#include "driverlib/flash.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "grlib/grlib.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "uip/uip.h" +#include "uip/uip_arp.h" +#include "httpd/httpd.h" +#include "dhcpc/dhcpc.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Ethernet with uIP (enet_uip)

      +//! +//! This example application demonstrates the operation of the Tiva C Series +//! Ethernet controller using the uIP TCP/IP Stack. DHCP is used to obtain +//! an Ethernet address. A basic web site is served over the Ethernet port. +//! The web site displays a few lines of text, and a counter that increments +//! each time the page is sent. +//! +//! UART0, connected to the ICDI virtual COM port and running at 115,200, +//! 8-N-1, is used to display messages from this application. +//! +//! For additional details on uIP, refer to the uIP web page at: +//! http://www.sics.se/~adam/uip/ +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines for setting up the system clock. +// +//***************************************************************************** +#define SYSTICKHZ CLOCK_CONF_SECOND +#define SYSTICKMS (1000 / SYSTICKHZ) +#define SYSTICKUS (1000000 / SYSTICKHZ) +#define SYSTICKNS (1000000000 / SYSTICKHZ) + +//***************************************************************************** +// +// Macro for accessing the Ethernet header information in the buffer. +// +//***************************************************************************** +u8_t g_pui8UIPBuffer[UIP_BUFSIZE + 2]; +u8_t *uip_buf = g_pui8UIPBuffer; + +#define BUF ((struct uip_eth_hdr *)uip_buf) + +//***************************************************************************** +// +// Ethernet DMA descriptors. +// +// Although uIP uses a single buffer, the MAC hardware needs a minimum of +// 3 receive descriptors to operate. +// +//***************************************************************************** +#define NUM_TX_DESCRIPTORS 3 +#define NUM_RX_DESCRIPTORS 3 +tEMACDMADescriptor g_psRxDescriptor[NUM_TX_DESCRIPTORS]; +tEMACDMADescriptor g_psTxDescriptor[NUM_RX_DESCRIPTORS]; + +uint32_t g_ui32RxDescIndex; +uint32_t g_ui32TxDescIndex; + +//***************************************************************************** +// +// Transmit and receive buffers. +// +//***************************************************************************** +#define RX_BUFFER_SIZE 1536 +#define TX_BUFFER_SIZE 1536 +uint8_t g_pui8RxBuffer[RX_BUFFER_SIZE]; +uint8_t g_pui8TxBuffer[TX_BUFFER_SIZE]; + +//***************************************************************************** +// +// A set of flags. The flag bits are defined as follows: +// +// 0 -> An indicator that a SysTick interrupt has occurred. +// 1 -> An RX Packet has been received. +// 2 -> A TX packet DMA transfer is pending. +// 3 -> A RX packet DMA transfer is pending. +// +//***************************************************************************** +#define FLAG_SYSTICK 0 +#define FLAG_RXPKT 1 +#define FLAG_TXPKT 2 +#define FLAG_RXPKTPEND 3 +static volatile uint32_t g_ui32Flags; + +//***************************************************************************** +// +// A system tick counter, incremented every SYSTICKMS. +// +//***************************************************************************** +volatile uint32_t g_ui32TickCounter = 0; + +//***************************************************************************** +// +// Default TCP/IP Settings for this application. +// +// Default to Link Local address ... (169.254.1.0 to 169.254.254.255). Note: +// This application does not implement the Zeroconf protocol. No ARP query is +// issued to determine if this static IP address is already in use. +// +// Uncomment the following #define statement to enable STATIC IP +// instead of DHCP. +// +//***************************************************************************** +//#define USE_STATIC_IP + +#ifndef DEFAULT_IPADDR0 +#define DEFAULT_IPADDR0 169 +#endif + +#ifndef DEFAULT_IPADDR1 +#define DEFAULT_IPADDR1 254 +#endif + +#ifndef DEFAULT_IPADDR2 +#define DEFAULT_IPADDR2 19 +#endif + +#ifndef DEFAULT_IPADDR3 +#define DEFAULT_IPADDR3 63 +#endif + +#ifndef DEFAULT_NETMASK0 +#define DEFAULT_NETMASK0 255 +#endif + +#ifndef DEFAULT_NETMASK1 +#define DEFAULT_NETMASK1 255 +#endif + +#ifndef DEFAULT_NETMASK2 +#define DEFAULT_NETMASK2 0 +#endif + +#ifndef DEFAULT_NETMASK3 +#define DEFAULT_NETMASK3 0 +#endif + +//***************************************************************************** +// +// UIP Timers (in MS) +// +//***************************************************************************** +#define UIP_PERIODIC_TIMER_MS 500 +#define UIP_ARP_TIMER_MS 10000 + +//***************************************************************************** +// +// The drawing context used to draw to the screen. +// +//***************************************************************************** +static tContext g_sContext; + +//***************************************************************************** +// +// The vertical position of the status string on the LCD display. +// +//***************************************************************************** +#define STATUS_Y 128 + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} + +//***************************************************************************** +// +// The interrupt handler for the SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Increment the system tick count. + // + g_ui32TickCounter++; + + // + // Indicate that a SysTick interrupt has occurred. + // + HWREGBITW(&g_ui32Flags, FLAG_SYSTICK) = 1; +} + +//***************************************************************************** +// +// When using the timer module in UIP, this function is required to return +// the number of ticks. Note that the file "clock-arch.h" must be provided +// by the application, and define CLOCK_CONF_SECONDS as the number of ticks +// per second, and must also define the typedef "clock_time_t". +// +//***************************************************************************** +clock_time_t +clock_time(void) +{ + return((clock_time_t)g_ui32TickCounter); +} + +//***************************************************************************** +// +// Display a status string on the LCD and also transmit it via the serial port. +// +//***************************************************************************** +void +UpdateStatus(char *pcStatus) +{ + tRectangle sRect; + + // + // Dump that status string to the serial port. + // + UARTprintf("%s\n", pcStatus); + + // + // Clear any previous status message. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMin = STATUS_Y - 16; + sRect.i16YMax = STATUS_Y + 16; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + + // + // Display the new status string. + // + GrContextFontSet(&g_sContext, g_psFontCmss20); + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(&g_sContext, pcStatus, -1, + GrContextDpyWidthGet(&g_sContext) / 2, STATUS_Y, 0); +} + +//***************************************************************************** +// +// Display the current IP address on the screen and transmit it via the UART. +// +//***************************************************************************** +void +ShowIPAddress(const uip_ipaddr_t sIPAddr) +{ + char pcBuffer[24]; + + usprintf(pcBuffer, "IP: %d.%d.%d.%d", sIPAddr[0] & 0xff, + sIPAddr[0] >> 8, sIPAddr[1] & 0xff, sIPAddr[1] >> 8); + UpdateStatus(pcBuffer); +} + +//***************************************************************************** +// +// The interrupt handler for the Ethernet interrupt. +// +//***************************************************************************** +void +EthernetIntHandler(void) +{ + uint32_t ui32Temp; + + // + // Read and Clear the interrupt. + // + ui32Temp = ROM_EMACIntStatus(EMAC0_BASE, true); + ROM_EMACIntClear(EMAC0_BASE, ui32Temp); + + // + // Check to see if an RX Interrupt has occurred. + // + if(ui32Temp & EMAC_INT_RECEIVE) + { + // + // Indicate that a packet has been received. + // + HWREGBITW(&g_ui32Flags, FLAG_RXPKT) = 1; + } + + // + // Has the DMA finished transferring a packet to the transmitter? + // + if(ui32Temp & EMAC_INT_TRANSMIT) + { + // + // Indicate that a packet has been sent. + // + HWREGBITW(&g_ui32Flags, FLAG_TXPKT) = 0; + } +} + +//***************************************************************************** +// +// Callback for when DHCP client has been configured. +// +//***************************************************************************** +void +dhcpc_configured(const struct dhcpc_state *s) +{ + uip_sethostaddr(&s->ipaddr); + uip_setnetmask(&s->netmask); + uip_setdraddr(&s->default_router); + ShowIPAddress(s->ipaddr); +} + +//***************************************************************************** +// +// Read a packet from the DMA receive buffer into the uIP packet buffer. +// +//***************************************************************************** +int32_t +PacketReceive(uint32_t ui32Base, uint8_t *pui8Buf, int32_t i32BufLen) +{ + int_fast32_t i32FrameLen, i32Loop; + + // + // Check the arguments. + // + ASSERT(ui32Base == EMAC0_BASE); + ASSERT(pui8Buf != 0); + ASSERT(i32BufLen > 0); + + // + // By default, we assume we got a bad frame. + // + i32FrameLen = 0; + + // + // Make sure that we own the receive descriptor. + // + if(!(g_psRxDescriptor[g_ui32RxDescIndex].ui32CtrlStatus & DES0_RX_CTRL_OWN)) + { + // + // We own the receive descriptor so check to see if it contains a valid + // frame. Look for a descriptor error, indicating that the incoming + // packet was truncated or, if this is the last frame in a packet, + // the receive error bit. + // + if(!(g_psRxDescriptor[g_ui32RxDescIndex].ui32CtrlStatus & + DES0_RX_STAT_ERR)) + { + // + // We have a valid frame so copy the content to the supplied + // buffer. First check that the "last descriptor" flag is set. We + // sized the receive buffer such that it can always hold a valid + // frame so this flag should never be clear at this point but... + // + if(g_psRxDescriptor[g_ui32RxDescIndex].ui32CtrlStatus & + DES0_RX_STAT_LAST_DESC) + { + i32FrameLen = + ((g_psRxDescriptor[g_ui32RxDescIndex].ui32CtrlStatus & + DES0_RX_STAT_FRAME_LENGTH_M) >> + DES0_RX_STAT_FRAME_LENGTH_S); + + // + // Sanity check. This shouldn't be required since we sized the + // uIP buffer such that it's the same size as the DMA receive + // buffer but, just in case... + // + if(i32FrameLen > i32BufLen) + { + i32FrameLen = i32BufLen; + } + + // + // Copy the data from the DMA receive buffer into the provided + // frame buffer. + // + for(i32Loop = 0; i32Loop < i32FrameLen; i32Loop++) + { + pui8Buf[i32Loop] = g_pui8RxBuffer[i32Loop]; + } + } + } + + // + // Move on to the next descriptor in the chain. + // + g_ui32RxDescIndex++; + if(g_ui32RxDescIndex == NUM_RX_DESCRIPTORS) + { + g_ui32RxDescIndex = 0; + } + + // + // Mark the next descriptor in the ring as available for the receiver + // to write into. + // + g_psRxDescriptor[g_ui32RxDescIndex].ui32CtrlStatus = DES0_RX_CTRL_OWN; + } + + // + // Return the Frame Length + // + return(i32FrameLen); +} + +//***************************************************************************** +// +// Transmit a packet from the supplied buffer. +// +//***************************************************************************** +static int32_t +PacketTransmit(uint32_t ui32Base, uint8_t *pui8Buf, int32_t i32BufLen) +{ + int_fast32_t i32Loop; + + // + // Indicate that a packet is being sent. + // + HWREGBITW(&g_ui32Flags, FLAG_TXPKT) = 1; + + // + // Wait for the previous packet to be transmitted. + // + while(g_psTxDescriptor[g_ui32TxDescIndex].ui32CtrlStatus & + DES0_TX_CTRL_OWN) + { + // + // Spin and waste time. + // + } + + // + // Check that we're not going to overflow the transmit buffer. This + // shouldn't be necessary since the uIP buffer is smaller than our DMA + // transmit buffer but, just in case... + // + if(i32BufLen > TX_BUFFER_SIZE) + { + i32BufLen = TX_BUFFER_SIZE; + } + + // + // Copy the packet data into the transmit buffer. + // + for(i32Loop = 0; i32Loop < i32BufLen; i32Loop++) + { + g_pui8TxBuffer[i32Loop] = pui8Buf[i32Loop]; + } + + // + // Move to the next descriptor. + // + g_ui32TxDescIndex++; + if(g_ui32TxDescIndex == NUM_TX_DESCRIPTORS) + { + g_ui32TxDescIndex = 0; + } + + // + // Fill in the packet size and tell the transmitter to start work. + // + g_psTxDescriptor[g_ui32TxDescIndex].ui32Count = (uint32_t)i32BufLen; + g_psTxDescriptor[g_ui32TxDescIndex].ui32CtrlStatus = + (DES0_TX_CTRL_LAST_SEG | DES0_TX_CTRL_FIRST_SEG | + DES0_TX_CTRL_INTERRUPT | DES0_TX_CTRL_IP_ALL_CKHSUMS | + DES0_TX_CTRL_CHAINED | DES0_TX_CTRL_OWN); + + // + // Tell the DMA to reacquire the descriptor now that we've filled it in. + // + ROM_EMACTxDMAPollDemand(EMAC0_BASE); + + // + // Return the number of bytes sent. + // + return(i32BufLen); +} + +//***************************************************************************** +// +// Initialize the transmit and receive DMA descriptors. We apparently need +// a minimum of 3 descriptors in each chain. This is overkill since uIP uses +// a single, common transmit and receive buffer so we tag each descriptor +// with the same buffer and will make sure we only hand the DMA one descriptor +// at a time. +// +//***************************************************************************** +void +InitDescriptors(uint32_t ui32Base) +{ + uint32_t ui32Loop; + + // + // Initialize each of the transmit descriptors. Note that we leave the OWN + // bit clear here since we have not set up any transmissions yet. + // + for(ui32Loop = 0; ui32Loop < NUM_TX_DESCRIPTORS; ui32Loop++) + { + g_psTxDescriptor[ui32Loop].ui32Count = + (DES1_TX_CTRL_SADDR_INSERT | + (TX_BUFFER_SIZE << DES1_TX_CTRL_BUFF1_SIZE_S)); + g_psTxDescriptor[ui32Loop].pvBuffer1 = g_pui8TxBuffer; + g_psTxDescriptor[ui32Loop].DES3.pLink = + (ui32Loop == (NUM_TX_DESCRIPTORS - 1)) ? + g_psTxDescriptor : &g_psTxDescriptor[ui32Loop + 1]; + g_psTxDescriptor[ui32Loop].ui32CtrlStatus = + (DES0_TX_CTRL_LAST_SEG | DES0_TX_CTRL_FIRST_SEG | + DES0_TX_CTRL_INTERRUPT | DES0_TX_CTRL_CHAINED | + DES0_TX_CTRL_IP_ALL_CKHSUMS); + } + + // + // Initialize each of the receive descriptors. We clear the OWN bit here + // to make sure that the receiver doesn't start writing anything + // immediately. + // + for(ui32Loop = 0; ui32Loop < NUM_RX_DESCRIPTORS; ui32Loop++) + { + g_psRxDescriptor[ui32Loop].ui32CtrlStatus = 0; + g_psRxDescriptor[ui32Loop].ui32Count = + (DES1_RX_CTRL_CHAINED | + (RX_BUFFER_SIZE << DES1_RX_CTRL_BUFF1_SIZE_S)); + g_psRxDescriptor[ui32Loop].pvBuffer1 = g_pui8RxBuffer; + g_psRxDescriptor[ui32Loop].DES3.pLink = + (ui32Loop == (NUM_RX_DESCRIPTORS - 1)) ? + g_psRxDescriptor : &g_psRxDescriptor[ui32Loop + 1]; + } + + // + // Set the descriptor pointers in the hardware. + // + ROM_EMACRxDMADescriptorListSet(ui32Base, g_psRxDescriptor); + ROM_EMACTxDMADescriptorListSet(ui32Base, g_psTxDescriptor); + + // + // Start from the beginning of both descriptor chains. We actually set + // the transmit descriptor index to the last descriptor in the chain + // since it will be incremented before use and this means the first + // transmission we perform will use the correct descriptor. + // + g_ui32RxDescIndex = 0; + g_ui32TxDescIndex = NUM_TX_DESCRIPTORS - 1; +} + +//***************************************************************************** +// +// This example demonstrates the use of the Ethernet Controller with the uIP +// TCP/IP stack. +// +//***************************************************************************** +int +main(void) +{ + uip_ipaddr_t sIPAddr; + static struct uip_eth_addr sTempAddr; + int32_t i32PeriodicTimer, i32ARPTimer; +#ifdef EXTERNAL_RMII_PHY + uint16_t ui16Val; +#endif + uint32_t ui32User0, ui32User1; + uint32_t ui32Temp, ui32PHYConfig, ui32SysClock; + uint8_t ui8PHYAddr; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "enet-uip"); + + // + // Initialize the UART. + // + UARTStdioConfig(0, 115200, ui32SysClock); + UARTprintf("Ethernet with uIP\n-----------------\n\n"); + +#ifdef EXTERNAL_RMII_PHY + UpdateStatus("Using RMII PHY."); + ui32PHYConfig = EMAC_PHY_TYPE_EXTERNAL_RMII; + ui8PHYAddr = 0; +#elif defined EXTERNAL_MII_PHY + UpdateStatus("Using MII PHY."); + ui32PHYConfig = EMAC_PHY_TYPE_EXTERNAL_MII; + ui8PHYAddr = 0; +#else + UpdateStatus("Using Internal PHY."); + ui32PHYConfig = (EMAC_PHY_TYPE_INTERNAL | EMAC_PHY_INT_MDIX_EN | + EMAC_PHY_AN_100B_T_FULL_DUPLEX); + ui8PHYAddr = 0; +#endif + + // + // Read the MAC address from the user registers. + // + ROM_FlashUserGet(&ui32User0, &ui32User1); + if((ui32User0 == 0xffffffff) || (ui32User1 == 0xffffffff)) + { + // + // We should never get here. This is an error if the MAC address has + // not been programmed into the device. Exit the program. + // + UpdateStatus("MAC Address Not Programmed!"); + while(1) + { + } + } + + // + // Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC + // address needed to program the hardware registers, then program the MAC + // address into the Ethernet Controller registers. + // + sTempAddr.addr[0] = ((ui32User0 >> 0) & 0xff); + sTempAddr.addr[1] = ((ui32User0 >> 8) & 0xff); + sTempAddr.addr[2] = ((ui32User0 >> 16) & 0xff); + sTempAddr.addr[3] = ((ui32User1 >> 0) & 0xff); + sTempAddr.addr[4] = ((ui32User1 >> 8) & 0xff); + sTempAddr.addr[5] = ((ui32User1 >> 16) & 0xff); + + // + // Configure SysTick for a periodic interrupt. + // + ROM_SysTickPeriodSet(ui32SysClock / SYSTICKHZ); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable and reset the Ethernet modules. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_EMAC0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_EPHY0); + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_EMAC0); + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_EPHY0); + + // + // Wait for the MAC to be ready. + // + UpdateStatus("Waiting for MAC to be ready..."); + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_EMAC0)) + { + } + + // + // Configure for use with the internal PHY. + // + MAP_EMACPHYConfigSet(EMAC0_BASE, ui32PHYConfig); + UpdateStatus("MAC ready."); + + // + // Reset the MAC. + // + ROM_EMACReset(EMAC0_BASE); + + // + // Initialize the MAC and set the DMA mode. + // + ROM_EMACInit(EMAC0_BASE, ui32SysClock, + EMAC_BCONFIG_MIXED_BURST | EMAC_BCONFIG_PRIORITY_FIXED, 4, 4, + 0); + +#ifdef EXTERNAL_RMII_PHY + // + // When using an external RMII PHY, we need to acquire link before we can + // determine how to configure the MAC. Unfortunately, the bit signalling + // on RMII changes depending upon whether the PHY is configured to use + // 10Mbps or 100Mbps and we need to tell the MAC which signalling method + // to use. + // + // With MII, the signalling is the same for both speeds so we don't need to + // include code to wait for the link to be acquired. + // + + // + // Write the PHY register that tells it to start auto-negotiation. + // + UpdateStatus("Starting autonegotiation..."); + ROM_EMACPHYWrite(EMAC0_BASE, ui8PHYAddr, EPHY_BMCR, + EPHY_BMCR_ANEN | EPHY_BMCR_RESTARTAN); + + // + // Poll, waiting for auto-negotiation to complete. + // + UpdateStatus("Waiting for autonegotiation to complete..."); + do + { + ui16Val = ROM_EMACPHYRead(EMAC0_BASE, ui8PHYAddr, EPHY_BMSR); + ROM_SysCtlDelay(ui32SysClock / (10 * 3)); + } + while(!(ui16Val & EPHY_BMSR_ANC)); + + // + // Wait for link to be acquired. + // + UpdateStatus("Waiting for link..."); + while(!(ui16Val & EPHY_BMSR_LINKSTAT)) + { + ui16Val = ROM_EMACPHYRead(EMAC0_BASE, ui8PHYAddr, EPHY_BMSR); + } + + UpdateStatus("Link acquired."); + + // + // What's the operating speed? + // + ui16Val = ROM_EMACPHYRead(EMAC0_BASE, ui8PHYAddr, EPHY_STS); + + // + // Set the MAC to PHY communication speed and duplex mode accordingly. + // + UARTprintf("Speed is 10%sMbps.\n", (ui16Val & EPHY_STS_SPEED) ? "" : "0"); + + ROM_EMACConfigSet(EMAC0_BASE, + (((ui16Val & EPHY_STS_SPEED) ? 0 : EMAC_CONFIG_100MBPS) | + ((ui16Val & EPHY_STS_DUPLEX) ? EMAC_CONFIG_FULL_DUPLEX : + 0) | + EMAC_CONFIG_FULL_DUPLEX | + EMAC_CONFIG_CHECKSUM_OFFLOAD | + EMAC_CONFIG_7BYTE_PREAMBLE | + EMAC_CONFIG_IF_GAP_96BITS | EMAC_CONFIG_USE_MACADDR0 | + EMAC_CONFIG_SA_FROM_DESCRIPTOR | + EMAC_CONFIG_BO_LIMIT_1024), + (EMAC_MODE_RX_STORE_FORWARD | + EMAC_MODE_TX_STORE_FORWARD | + EMAC_MODE_TX_THRESHOLD_64_BYTES | + EMAC_MODE_RX_THRESHOLD_64_BYTES), 0); +#else + // + // Set MAC configuration options. + // + ROM_EMACConfigSet(EMAC0_BASE, + (EMAC_CONFIG_FULL_DUPLEX | EMAC_CONFIG_CHECKSUM_OFFLOAD | + EMAC_CONFIG_7BYTE_PREAMBLE | EMAC_CONFIG_IF_GAP_96BITS | + EMAC_CONFIG_USE_MACADDR0 | + EMAC_CONFIG_SA_FROM_DESCRIPTOR | + EMAC_CONFIG_BO_LIMIT_1024), + (EMAC_MODE_RX_STORE_FORWARD | + EMAC_MODE_TX_STORE_FORWARD | + EMAC_MODE_TX_THRESHOLD_64_BYTES | + EMAC_MODE_RX_THRESHOLD_64_BYTES), 0); +#endif + + // + // Initialize the Ethernet DMA descriptors. + // + InitDescriptors(EMAC0_BASE); + + // + // Program the hardware with its MAC address (for filtering). + // + ROM_EMACAddrSet(EMAC0_BASE, 0, (uint8_t *)&sTempAddr); + +#ifndef EXTERNAL_RMII_PHY + // + // Wait for the link to become active. If we are using an external + // RMII PHY, we already waited for link to be acquired prior to + // configuring the MAC so don't wait again here. + // + UpdateStatus("Waiting for Link"); + while((ROM_EMACPHYRead(EMAC0_BASE, ui8PHYAddr, EPHY_BMSR) & + EPHY_BMSR_LINKSTAT) == 0) + { + } + UpdateStatus("Link Established"); +#endif + + // + // Set MAC filtering options. We receive all broadcast and multicast + // packets along with those addressed specifically for us. + // + ROM_EMACFrameFilterSet(EMAC0_BASE, (EMAC_FRMFILTER_SADDR | + EMAC_FRMFILTER_PASS_MULTICAST | + EMAC_FRMFILTER_PASS_NO_CTRL)); + + // + // Clear any pending interrupts. + // + ROM_EMACIntClear(EMAC0_BASE, EMACIntStatus(EMAC0_BASE, false)); + + // + // Initialize the uIP TCP/IP stack. + // + uip_init(); + + // + // Set the local MAC address (for uIP). + // + uip_setethaddr(sTempAddr); +#ifdef USE_STATIC_IP + uip_ipaddr(sIPAddr, DEFAULT_IPADDR0, DEFAULT_IPADDR1, DEFAULT_IPADDR2, + DEFAULT_IPADDR3); + uip_sethostaddr(sIPAddr); + ShowIPAddress(sIPAddr); + uip_ipaddr(sIPAddr, DEFAULT_NETMASK0, DEFAULT_NETMASK1, DEFAULT_NETMASK2, + DEFAULT_NETMASK3); + uip_setnetmask(sIPAddr); +#else + uip_ipaddr(sIPAddr, 0, 0, 0, 0); + uip_sethostaddr(sIPAddr); + UpdateStatus("Waiting for IP address..."); + uip_ipaddr(sIPAddr, 0, 0, 0, 0); + uip_setnetmask(sIPAddr); +#endif + + // + // Enable the Ethernet MAC transmitter and receiver. + // + ROM_EMACTxEnable(EMAC0_BASE); + ROM_EMACRxEnable(EMAC0_BASE); + + // + // Enable the Ethernet interrupt. + // + ROM_IntEnable(INT_EMAC0); + + // + // Enable the Ethernet RX Packet interrupt source. + // + ROM_EMACIntEnable(EMAC0_BASE, EMAC_INT_RECEIVE); + + // + // Mark the first receive descriptor as available to the DMA to start + // the receive processing. + // + g_psRxDescriptor[g_ui32RxDescIndex].ui32CtrlStatus |= DES0_RX_CTRL_OWN; + + // + // Initialize the TCP/IP Application (e.g. web server). + // + httpd_init(); + +#ifndef USE_STATIC_IP + // + // Initialize the DHCP Client Application. + // + dhcpc_init(&sTempAddr.addr[0], 6); + dhcpc_request(); +#endif + + // + // Main Application Loop. + // + i32PeriodicTimer = 0; + i32ARPTimer = 0; + while(true) + { + // + // Wait for an event to occur. This can be either a System Tick event, + // or an RX Packet event. + // + while(!g_ui32Flags) + { + } + + // + // If SysTick, Clear the SysTick interrupt flag and increment the + // timers. + // + if(HWREGBITW(&g_ui32Flags, FLAG_SYSTICK) == 1) + { + HWREGBITW(&g_ui32Flags, FLAG_SYSTICK) = 0; + i32PeriodicTimer += SYSTICKMS; + i32ARPTimer += SYSTICKMS; + } + + // + // Check for an RX Packet and read it. + // + if(HWREGBITW(&g_ui32Flags, FLAG_RXPKT)) + { + // + // Clear the RX Packet event flag. + // + HWREGBITW(&g_ui32Flags, FLAG_RXPKT) = 0; + + // Get the packet and set uip_len for uIP stack usage. + // + uip_len = (unsigned short)PacketReceive(EMAC0_BASE, uip_buf, + sizeof(g_pui8UIPBuffer)); + + // + // Process incoming IP packets here. + // + if(BUF->type == htons(UIP_ETHTYPE_IP)) + { + uip_arp_ipin(); + uip_input(); + + // + // If the above function invocation resulted in data that + // should be sent out on the network, the global variable + // uip_len is set to a value > 0. + // + if(uip_len > 0) + { + uip_arp_out(); + PacketTransmit(EMAC0_BASE, uip_buf, uip_len); + uip_len = 0; + } + } + + // + // Process incoming ARP packets here. + // + else if(BUF->type == htons(UIP_ETHTYPE_ARP)) + { + uip_arp_arpin(); + + // + // If the above function invocation resulted in data that + // should be sent out on the network, the global variable + // uip_len is set to a value > 0. + // + if(uip_len > 0) + { + PacketTransmit(EMAC0_BASE, uip_buf, uip_len); + uip_len = 0; + } + } + } + + // + // Process TCP/IP Periodic Timer here. + // + if(i32PeriodicTimer > UIP_PERIODIC_TIMER_MS) + { + i32PeriodicTimer = 0; + for(ui32Temp = 0; ui32Temp < UIP_CONNS; ui32Temp++) + { + uip_periodic(ui32Temp); + + // + // If the above function invocation resulted in data that + // should be sent out on the network, the global variable + // uip_len is set to a value > 0. + // + if(uip_len > 0) + { + uip_arp_out(); + PacketTransmit(EMAC0_BASE, uip_buf, uip_len); + uip_len = 0; + } + } + +#if UIP_UDP + for(ui32Temp = 0; ui32Temp < UIP_UDP_CONNS; ui32Temp++) + { + uip_udp_periodic(ui32Temp); + + // + // If the above function invocation resulted in data that + // should be sent out on the network, the global variable + // uip_len is set to a value > 0. + // + if(uip_len > 0) + { + uip_arp_out(); + PacketTransmit(EMAC0_BASE, uip_buf, uip_len); + uip_len = 0; + } + } +#endif + } + + // + // Process ARP Timer here. + // + if(i32ARPTimer > UIP_ARP_TIMER_MS) + { + i32ARPTimer = 0; + uip_arp_timer(); + } + } +} + +#ifdef UIP_ARCH_IPCHKSUM +// +// Return the IP checksum for the packet in uip_buf. This is a dummy since +// the hardware calculates this for us. +// +u16_t +uip_ipchksum(void) +{ + // + // Dummy function - the hardware calculates and inserts all required + // checksums for us. + // + return(0xffff); +} + +u16_t +uip_chksum(u16_t *data, u16_t len) +{ + return(0xffff); +} + +u16_t +uip_icmp6chksum(void) +{ + return(0xffff); +} + +u16_t +uip_tcpchksum(void) +{ + return(0xffff); +} +#endif diff --git a/boards/dk-tm4c129x/enet_uip/enet_uip.ewd b/boards/dk-tm4c129x/enet_uip/enet_uip.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/enet_uip.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/enet_uip/enet_uip.ewp b/boards/dk-tm4c129x/enet_uip/enet_uip.ewp new file mode 100644 index 0000000..a4c24c1 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/enet_uip.ewp @@ -0,0 +1,831 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\..\..\..\third_party\uip-1.0\apps\dhcpc\dhcpc.c + + + $PROJ_DIR$\enet_uip.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\..\..\..\third_party\uip-1.0\apps\httpd\httpd.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\..\..\..\..\third_party\uip-1.0\uip\uip.c + + + $PROJ_DIR$\..\..\..\..\third_party\uip-1.0\uip\uip_arp.c + + + $PROJ_DIR$\..\..\..\..\third_party\uip-1.0\uip\uip_timer.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/enet_uip/enet_uip.icf b/boards/dk-tm4c129x/enet_uip/enet_uip.icf new file mode 100644 index 0000000..9255df7 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/enet_uip.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// enet_uip.icf - Linker configuration file for enet_uip. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/enet_uip/enet_uip.ld b/boards/dk-tm4c129x/enet_uip/enet_uip.ld new file mode 100644 index 0000000..beef25d --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/enet_uip.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * enet_uip.ld - Linker configuration file for enet_uip. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/enet_uip/enet_uip.sct b/boards/dk-tm4c129x/enet_uip/enet_uip.sct new file mode 100644 index 0000000..53e9515 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/enet_uip.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; enet_uip.sct - Linker configuration file for enet_uip. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/enet_uip/enet_uip.uvopt b/boards/dk-tm4c129x/enet_uip/enet_uip.uvopt new file mode 100644 index 0000000..d77228e --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/enet_uip.uvopt @@ -0,0 +1,443 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + enet_uip + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\uip-1.0\apps\dhcpc\dhcpc.c + dhcpc.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\enet_uip.c + enet_uip.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\uip-1.0\apps\httpd\httpd.c + httpd.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 7 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\uip-1.0\uip\uip.c + uip.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\uip-1.0\uip\uip_arp.c + uip_arp.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\uip-1.0\uip\uip_timer.c + uip_timer.c + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 14 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 15 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/enet_uip/enet_uip.uvproj b/boards/dk-tm4c129x/enet_uip/enet_uip.uvproj new file mode 100644 index 0000000..5b5af9c --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/enet_uip.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + enet_uip + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + enet_uip + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\enet_uip.bin .\rvmdk\enet_uip.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 DEBUG_OUTPUT UIP_OFFLOAD_ICMP_CHKSUM + + .;..;..\..\..\..;..\..\..\..\third_party\uip-1.0\apps;..\..\..\..\third_party\uip-1.0\uip;..\..\..\..\third_party\uip-1.0;..\..\..\..\utils; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + enet_uip.sct + + + --entry Reset_Handler + + + + + + + + Source + + + dhcpc.c + 1 + ..\..\..\..\third_party\uip-1.0\apps\dhcpc\dhcpc.c + + + enet_uip.c + 1 + .\enet_uip.c + + + frame.c + 1 + ..\drivers\frame.c + + + httpd.c + 1 + ..\..\..\..\third_party\uip-1.0\apps\httpd\httpd.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + uip.c + 1 + ..\..\..\..\third_party\uip-1.0\uip\uip.c + + + uip_arp.c + 1 + ..\..\..\..\third_party\uip-1.0\uip\uip_arp.c + + + uip_timer.c + 1 + ..\..\..\..\third_party\uip-1.0\uip\uip_timer.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/enet_uip/enet_uip_ccs.cmd b/boards/dk-tm4c129x/enet_uip/enet_uip_ccs.cmd new file mode 100644 index 0000000..ed998cf --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/enet_uip_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * enet_uip_ccs.cmd - CCS linker configuration file for enet_uip. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c129x/enet_uip/ewarm/Exe/enet_uip.bin b/boards/dk-tm4c129x/enet_uip/ewarm/Exe/enet_uip.bin new file mode 100644 index 0000000..9629b78 Binary files /dev/null and b/boards/dk-tm4c129x/enet_uip/ewarm/Exe/enet_uip.bin differ diff --git a/boards/dk-tm4c129x/enet_uip/ewarm/Exe/enet_uip.out b/boards/dk-tm4c129x/enet_uip/ewarm/Exe/enet_uip.out new file mode 100644 index 0000000..0cb9e40 Binary files /dev/null and b/boards/dk-tm4c129x/enet_uip/ewarm/Exe/enet_uip.out differ diff --git a/boards/dk-tm4c129x/enet_uip/gcc/enet_uip.axf b/boards/dk-tm4c129x/enet_uip/gcc/enet_uip.axf new file mode 100644 index 0000000..8583dc1 Binary files /dev/null and b/boards/dk-tm4c129x/enet_uip/gcc/enet_uip.axf differ diff --git a/boards/dk-tm4c129x/enet_uip/gcc/enet_uip.bin b/boards/dk-tm4c129x/enet_uip/gcc/enet_uip.bin new file mode 100644 index 0000000..19eafcb Binary files /dev/null and b/boards/dk-tm4c129x/enet_uip/gcc/enet_uip.bin differ diff --git a/boards/dk-tm4c129x/enet_uip/readme.txt b/boards/dk-tm4c129x/enet_uip/readme.txt new file mode 100644 index 0000000..d8313dc --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/readme.txt @@ -0,0 +1,33 @@ +Ethernet with uIP + +This example application demonstrates the operation of the Tiva C Series +Ethernet controller using the uIP TCP/IP Stack. DHCP is used to obtain +an Ethernet address. A basic web site is served over the Ethernet port. +The web site displays a few lines of text, and a counter that increments +each time the page is sent. + +UART0, connected to the ICDI virtual COM port and running at 115,200, +8-N-1, is used to display messages from this application. + +For additional details on uIP, refer to the uIP web page at: +http://www.sics.se/~adam/uip/ + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/enet_uip/rvmdk/enet_uip.axf b/boards/dk-tm4c129x/enet_uip/rvmdk/enet_uip.axf new file mode 100644 index 0000000..fc04caf Binary files /dev/null and b/boards/dk-tm4c129x/enet_uip/rvmdk/enet_uip.axf differ diff --git a/boards/dk-tm4c129x/enet_uip/rvmdk/enet_uip.bin b/boards/dk-tm4c129x/enet_uip/rvmdk/enet_uip.bin new file mode 100644 index 0000000..f2799ca Binary files /dev/null and b/boards/dk-tm4c129x/enet_uip/rvmdk/enet_uip.bin differ diff --git a/boards/dk-tm4c129x/enet_uip/startup_ccs.c b/boards/dk-tm4c129x/enet_uip/startup_ccs.c new file mode 100644 index 0000000..d2bb22a --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void EthernetIntHandler(void); +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + EthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/enet_uip/startup_ewarm.c b/boards/dk-tm4c129x/enet_uip/startup_ewarm.c new file mode 100644 index 0000000..79a712c --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void EthernetIntHandler(void); +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + EthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/enet_uip/startup_gcc.c b/boards/dk-tm4c129x/enet_uip/startup_gcc.c new file mode 100644 index 0000000..2cfa08f --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void EthernetIntHandler(void); +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + EthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/enet_uip/startup_rvmdk.S b/boards/dk-tm4c129x/enet_uip/startup_rvmdk.S new file mode 100644 index 0000000..043a697 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN EthernetIntHandler + EXTERN SysTickIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD EthernetIntHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/enet_uip/uip-conf.h b/boards/dk-tm4c129x/enet_uip/uip-conf.h new file mode 100644 index 0000000..5176f49 --- /dev/null +++ b/boards/dk-tm4c129x/enet_uip/uip-conf.h @@ -0,0 +1,162 @@ +//***************************************************************************** +// +// uip-conf.h - uIP Project Specific Configuration File +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + +// +// 8 bit datatype +// This typedef defines the 8-bit type used throughout uIP. +// +typedef unsigned char u8_t; + +// +// 16 bit datatype +// This typedef defines the 16-bit type used throughout uIP. +// +typedef unsigned short u16_t; + +// +// Statistics datatype +// This typedef defines the dataype used for keeping statistics in +// uIP. +// +typedef unsigned short uip_stats_t; + +// +// Ping IP address assignment +// Use first incoming "ping" packet to derive host IP address +// +#define UIP_CONF_PINGADDRCONF 0 + +// +// UDP support on or off +// +#define UIP_CONF_UDP 1 + +// +// UDP checksums on or off +// (not currently supported ... should be 0) +// +#define UIP_CONF_UDP_CHECKSUMS 0 + +// +// UDP Maximum Connections +// +#define UIP_CONF_UDP_CONNS 4 + +// +// Maximum number of TCP connections. +// +#define UIP_CONF_MAX_CONNECTIONS 2 + +// +// Maximum number of listening TCP ports. +// +#define UIP_CONF_MAX_LISTENPORTS 4 + +// +// Size of advertised receiver's window +// +//#define UIP_CONF_RECEIVE_WINDOW 400 + +// +// Size of ARP table +// +#define UIP_CONF_ARPTAB_SIZE 8 + +// +// uIP buffer size. +// +#define UIP_CONF_BUFFER_SIZE 1600 + +// +// uIP buffer is defined in the application. +// +#define UIP_CONF_EXTERNAL_BUFFER + +// +// uIP statistics on or off +// +#define UIP_CONF_STATISTICS 1 + +// +// Logging on or off +// +#define UIP_CONF_LOGGING 0 + +// +// Broadcast Support +// +#define UIP_CONF_BROADCAST 0 + +// +// Link-Level Header length +// +#define UIP_CONF_LLH_LEN 14 + +// +// CPU byte order. +// +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +// +// Offload checksum calculation to the hardware. +// +// TODO: Once things are working, turn on hardware checksum calculation and +// make sure the application source includes stubs for uip_ipchksum(), +// uip_tcpchksum() and uip_udpchksum(). uip_icmp6chksum() is also needed if +// IPv6 is in use. +// +#define UIP_ARCH_IPCHKSUM +#define UIP_ARCH_CHKSUM 1 + + +// +// Here we include the header file for the application we are using in +// this example +// +#include "httpd/httpd.h" + +// +// Define the uIP Application State type, based on the httpd.h state variable. +// +typedef struct httpd_state uip_tcp_appstate_t; + +// +// UIP_APPCALL: the name of the application function. This function +// must return void and take no arguments (i.e., C type "void +// appfunc(void)"). +// +#ifndef UIP_APPCALL +#define UIP_APPCALL httpd_appcall +#endif + +// +// Here we include the header file for the DPCP client we are using in +// this example +// +#include "dhcpc/dhcpc.h" + +#endif // __UIP_CONF_H_ diff --git a/boards/dk-tm4c129x/fontview/Makefile b/boards/dk-tm4c129x/fontview/Makefile new file mode 100644 index 0000000..b81e3a3 --- /dev/null +++ b/boards/dk-tm4c129x/fontview/Makefile @@ -0,0 +1,102 @@ +#****************************************************************************** +# +# Makefile - Rules for building the FontView example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fonts/ofl/fonts +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/fonts/ofl +IPATH+=../../../../third_party + +# +# The default rule, which causes the FontView example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/fontview.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the FontView example. +# +${COMPILER}/fontview.axf: ${COMPILER}/fatwrapper.o +${COMPILER}/fontview.axf: ${COMPILER}/ff.o +${COMPILER}/fontview.axf: ${COMPILER}/fontcjktest20pt.o +${COMPILER}/fontview.axf: ${COMPILER}/fontview.o +${COMPILER}/fontview.axf: ${COMPILER}/frame.o +${COMPILER}/fontview.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/fontview.axf: ${COMPILER}/mmc-dk-tm4c129x.o +${COMPILER}/fontview.axf: ${COMPILER}/pinout.o +${COMPILER}/fontview.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/fontview.axf: ${COMPILER}/touch.o +${COMPILER}/fontview.axf: ${COMPILER}/uartstdio.o +${COMPILER}/fontview.axf: ${COMPILER}/ustdlib.o +${COMPILER}/fontview.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/fontview.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/fontview.axf: fontview.ld +SCATTERgcc_fontview=fontview.ld +ENTRY_fontview=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/fontview/ccs/.ccsimportspec b/boards/dk-tm4c129x/fontview/ccs/.ccsimportspec new file mode 100644 index 0000000..eb59859 --- /dev/null +++ b/boards/dk-tm4c129x/fontview/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/fontview/ccs/.ccsproject b/boards/dk-tm4c129x/fontview/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/fontview/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/fontview/ccs/.cproject b/boards/dk-tm4c129x/fontview/ccs/.cproject new file mode 100644 index 0000000..7c07c7f --- /dev/null +++ b/boards/dk-tm4c129x/fontview/ccs/.cproject @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/fontview/ccs/.project b/boards/dk-tm4c129x/fontview/ccs/.project new file mode 100644 index 0000000..eb1c68b --- /dev/null +++ b/boards/dk-tm4c129x/fontview/ccs/.project @@ -0,0 +1,100 @@ + + + fontview + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + fatwrapper.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/fontview/fatwrapper.c + + + fontview.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/fontview/fontview.c + + + fontview_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/fontview/fontview_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/fontview/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/fatfs/port/mmc-dk-tm4c129x.c + 1 + SW_ROOT/third_party/fatfs/port/mmc-dk-tm4c129x.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + third_party/fonts/ofl/fonts/fontcjktest20pt.c + 1 + SW_ROOT/third_party/fonts/ofl/fonts/fontcjktest20pt.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/fontview/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/fontview/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/fontview/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/fontview/ccs/Debug/fontview.bin b/boards/dk-tm4c129x/fontview/ccs/Debug/fontview.bin new file mode 100644 index 0000000..1dca09f Binary files /dev/null and b/boards/dk-tm4c129x/fontview/ccs/Debug/fontview.bin differ diff --git a/boards/dk-tm4c129x/fontview/ccs/Debug/fontview.out b/boards/dk-tm4c129x/fontview/ccs/Debug/fontview.out new file mode 100644 index 0000000..ba55b15 Binary files /dev/null and b/boards/dk-tm4c129x/fontview/ccs/Debug/fontview.out differ diff --git a/boards/dk-tm4c129x/fontview/ccs/macros.ini_initial b/boards/dk-tm4c129x/fontview/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/fontview/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/fontview/ccs/target_config.ccxml b/boards/dk-tm4c129x/fontview/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/fontview/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/fontview/ewarm/Exe/fontview.bin b/boards/dk-tm4c129x/fontview/ewarm/Exe/fontview.bin new file mode 100644 index 0000000..bda8e93 Binary files /dev/null and b/boards/dk-tm4c129x/fontview/ewarm/Exe/fontview.bin differ diff --git a/boards/dk-tm4c129x/fontview/ewarm/Exe/fontview.out b/boards/dk-tm4c129x/fontview/ewarm/Exe/fontview.out new file mode 100644 index 0000000..12f13cc Binary files /dev/null and b/boards/dk-tm4c129x/fontview/ewarm/Exe/fontview.out differ diff --git a/boards/dk-tm4c129x/fontview/fatwrapper.c b/boards/dk-tm4c129x/fontview/fatwrapper.c new file mode 100644 index 0000000..2d7607c --- /dev/null +++ b/boards/dk-tm4c129x/fontview/fatwrapper.c @@ -0,0 +1,858 @@ +//***************************************************************************** +// +// fatwrapper.c - A simple wrapper allowing access to binary fonts stored in +// the FAT file system. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "third_party/fatfs/src/ff.h" +#include "third_party/fatfs/src/diskio.h" + +//***************************************************************************** +// +// The number of font block headers that we cache when a font is opened. +// +//***************************************************************************** +#define MAX_FONT_BLOCKS 16 + +//***************************************************************************** +// +// The amount of memory set aside to hold compressed data for a single glyph. +// Fonts for use with the graphics library limit compressed glyphs to 256 bytes. +// If you are sure your fonts contain small glyphs, you could reduce this to +// save space. +// +//***************************************************************************** +#define MAX_GLYPH_SIZE 256 + +//***************************************************************************** +// +// Instance data for a single loaded font. +// +//***************************************************************************** +typedef struct +{ + // + // The FATfs file object associated with the font. + // + FIL sFile; + + // + // The font header as read from the file. + // + tFontWide sFontHeader; + + // + // Storage for the font block table. + // + tFontBlock psBlocks[MAX_FONT_BLOCKS]; + + // + // A marker indicating whether or not the structure is in use. + // + bool bInUse; + + // + // The codepoint of the character whose glyph data is currently stored in + // pui8GlyphStore. + // + uint32_t ui32CurrentGlyph; + + // + // Storage for the compressed data of the latest glyph. In a more complex + // implementation, you would likely want to cache this data to reduce + // slow disk interaction. + // + uint8_t pui8GlyphStore[MAX_GLYPH_SIZE]; +} +tFontFile; + +//***************************************************************************** +// +// Workspace for FATfs. +// +//***************************************************************************** +FATFS g_sFatFs; + +//***************************************************************************** +// +// Instance data for a single loaded font. This implementation only supports +// a single font open at any one time. If you wanted to implement something +// more general, a memory manager could be used to allocate these structures +// dynamically in FATWrapperFontLoad(). +// +//***************************************************************************** +tFontFile g_sFontFile; + +//***************************************************************************** +// +// A structure that holds a mapping between an FRESULT numerical code, +// and a string represenation. FRESULT codes are returned from the FatFs +// FAT file system driver. +// +//***************************************************************************** +typedef struct +{ + FRESULT iFResult; + char *pcResultStr; +} +tFresultString; + +//***************************************************************************** +// +// A macro to make it easy to add result codes to the table. +// +//***************************************************************************** +#define FRESULT_ENTRY(f) { (f), (#f) } + +//***************************************************************************** +// +// A table that holds a mapping between the numerical FRESULT code and +// it's name as a string. This is used for looking up error codes for +// printing to the console. +// +//***************************************************************************** +tFresultString g_psFresultStrings[] = +{ + FRESULT_ENTRY(FR_OK), + FRESULT_ENTRY(FR_DISK_ERR), + FRESULT_ENTRY(FR_INT_ERR), + FRESULT_ENTRY(FR_NOT_READY), + FRESULT_ENTRY(FR_NO_FILE), + FRESULT_ENTRY(FR_NO_PATH), + FRESULT_ENTRY(FR_INVALID_NAME), + FRESULT_ENTRY(FR_DENIED), + FRESULT_ENTRY(FR_EXIST), + FRESULT_ENTRY(FR_INVALID_OBJECT), + FRESULT_ENTRY(FR_WRITE_PROTECTED), + FRESULT_ENTRY(FR_INVALID_DRIVE), + FRESULT_ENTRY(FR_NOT_ENABLED), + FRESULT_ENTRY(FR_NO_FILESYSTEM), + FRESULT_ENTRY(FR_MKFS_ABORTED), + FRESULT_ENTRY(FR_TIMEOUT), + FRESULT_ENTRY(FR_LOCKED), + FRESULT_ENTRY(FR_NOT_ENOUGH_CORE), + FRESULT_ENTRY(FR_TOO_MANY_OPEN_FILES), + FRESULT_ENTRY(FR_INVALID_PARAMETER), +}; + +//***************************************************************************** +// +// Error reasons returned by ChangeDirectory(). +// +//***************************************************************************** +#define NAME_TOO_LONG_ERROR 1 +#define OPENDIR_ERROR 2 + +//***************************************************************************** +// +// A macro that holds the number of result codes. +// +//***************************************************************************** +#define NUM_FRESULT_CODES (sizeof(g_psFresultStrings) / sizeof(tFresultString)) + +//***************************************************************************** +// +// Internal function prototypes. +// +//***************************************************************************** +static const char *StringFromFresult(FRESULT iFResult); +static void FATWrapperFontInfoGet(uint8_t *pui8FontID, + uint8_t *pui8Format, + uint8_t *pui8Width, + uint8_t *pui8Height, + uint8_t *pui8Baseline); +static const uint8_t *FATWrapperFontGlyphDataGet( + uint8_t *pui8FontID, + uint32_t ui32CodePoint, + uint8_t *pui8Width); +static uint16_t FATWrapperFontCodepageGet(uint8_t *pui8FontID); +static uint16_t FATWrapperFontNumBlocksGet(uint8_t *pui8FontID); +static uint32_t FATWrapperFontBlockCodepointsGet( + uint8_t *pui8FontID, + uint16_t ui16BlockIndex, + uint32_t *pui32Start); + +//***************************************************************************** +// +// Access function pointers required to complete the tFontWrapper structure +// for this font. +// +//***************************************************************************** +const tFontAccessFuncs g_sFATFontAccessFuncs = +{ + FATWrapperFontInfoGet, + FATWrapperFontGlyphDataGet, + FATWrapperFontCodepageGet, + FATWrapperFontNumBlocksGet, + FATWrapperFontBlockCodepointsGet +}; + +//***************************************************************************** +// +// This function returns a string representation of an error code +// that was returned from a function call to FatFs. It can be used +// for printing human readable error messages. +// +//***************************************************************************** +static const char * +StringFromFresult(FRESULT iFResult) +{ + uint32_t ui32Idx; + + // + // Enter a loop to search the error code table for a matching + // error code. + // + for(ui32Idx = 0; ui32Idx < NUM_FRESULT_CODES; ui32Idx++) + { + // + // If a match is found, then return the string name of the + // error code. + // + if(g_psFresultStrings[ui32Idx].iFResult == iFResult) + { + return(g_psFresultStrings[ui32Idx].pcResultStr); + } + } + + // + // At this point no matching code was found, so return a + // string indicating unknown error. + // + return("UNKNOWN ERROR CODE"); +} + +//***************************************************************************** +// +// Returns information about a font previously loaded using FATFontWrapperLoad. +// +//***************************************************************************** +static void +FATWrapperFontInfoGet(uint8_t *pui8FontID, uint8_t *pui8Format, + uint8_t *pui8Width, uint8_t *pui8Height, + uint8_t *pui8Baseline) +{ + tFontFile *psFont; + + // + // Parameter sanity check. + // + ASSERT(pui8FontID); + ASSERT(pui8Format); + ASSERT(pui8Width); + ASSERT(pui8Height); + ASSERT(pui8Baseline); + + // + // Get a pointer to our instance data. + // + psFont = (tFontFile *)pui8FontID; + + ASSERT(psFont->bInUse); + + // + // Return the requested information. + // + *pui8Format = psFont->sFontHeader.ui8Format; + *pui8Width = psFont->sFontHeader.ui8MaxWidth; + *pui8Height = psFont->sFontHeader.ui8Height; + *pui8Baseline = psFont->sFontHeader.ui8Baseline; +} + +//***************************************************************************** +// +// Returns the codepage used by the font whose handle is passed. +// +//***************************************************************************** +static uint16_t +FATWrapperFontCodepageGet(uint8_t *pui8FontID) +{ + tFontFile *psFont; + + // + // Parameter sanity check. + // + ASSERT(pui8FontID); + + // + // Get a pointer to our instance data. + // + psFont = (tFontFile *)pui8FontID; + + ASSERT(psFont->bInUse); + + // + // Return the codepage identifier from the font. + // + return(psFont->sFontHeader.ui16Codepage); +} + +//***************************************************************************** +// +// Returns the number of glyph blocks supported by a particular font. +// +//***************************************************************************** +static uint16_t +FATWrapperFontNumBlocksGet(uint8_t *pui8FontID) +{ + tFontFile *psFont; + + // + // Parameter sanity check. + // + ASSERT(pui8FontID); + + // + // Get a pointer to our instance data. + // + psFont = (tFontFile *)pui8FontID; + + ASSERT(psFont->bInUse); + + // + // Return the number of glyph blocks contained in the font. + // + return(psFont->sFontHeader.ui16NumBlocks); +} + +//***************************************************************************** +// +// Read a given font block header from the provided file. +// +//***************************************************************************** +static bool +FATWrapperFontBlockHeaderGet(FIL *psFile, tFontBlock *psBlock, + uint32_t ui32Index) +{ + FRESULT iFResult; + UINT uiRead; + + // + // Set the file pointer to the position of the block header we want. + // + iFResult = f_lseek(psFile, sizeof(tFontWide) + + (sizeof(tFontBlock) * ui32Index)); + if(iFResult == FR_OK) + { + // + // Now read the block header. + // + iFResult = f_read(psFile, psBlock, sizeof(tFontBlock), &uiRead); + if((iFResult == FR_OK) && (uiRead == sizeof(tFontBlock))) + { + return(true); + } + } + + // + // If we get here, we experienced an error so return a bad return code. + // + return(false); +} + +//***************************************************************************** +// +// Returns information on the glyphs contained within a given font block. +// +//***************************************************************************** +static uint32_t +FATWrapperFontBlockCodepointsGet(uint8_t *pui8FontID, + uint16_t ui16BlockIndex, + uint32_t *pui32Start) +{ + tFontBlock sBlock; + tFontFile *psFont; + bool bRetcode; + + // + // Parameter sanity check. + // + ASSERT(pui8FontID); + + // + // Get a pointer to our instance data. + // + psFont = (tFontFile *)pui8FontID; + + ASSERT(psFont->bInUse); + + // + // Have we been passed a valid block index? + // + if(ui16BlockIndex >= psFont->sFontHeader.ui16NumBlocks) + { + // + // No - return an error. + // + return(0); + } + + // + // Is this block header cached? + // + if(ui16BlockIndex < MAX_FONT_BLOCKS) + { + // + // Yes - return the information from our cached copy. + // + *pui32Start = psFont->psBlocks[ui16BlockIndex].ui32StartCodepoint; + return(psFont->psBlocks[ui16BlockIndex].ui32NumCodepoints); + } + else + { + // + // We don't have the block header cached so read it from the + // SDCard. First move the file pointer to the expected position. + // + bRetcode = FATWrapperFontBlockHeaderGet(&psFont->sFile, &sBlock, + ui16BlockIndex); + if(bRetcode) + { + *pui32Start = sBlock.ui32StartCodepoint; + return(sBlock.ui32NumCodepoints); + } + else + { + UARTprintf("Error reading block header!\n"); + } + } + + // + // If we get here, something horrible happened so return a failure. + // + *pui32Start = 0; + return(0); +} + +//***************************************************************************** +// +// Retrieves the data for a particular font glyph. This function returns +// a pointer to the glyph data in linear, random access memory if the glyph +// exists or NULL if not. +// +//***************************************************************************** +static const uint8_t * +FATWrapperFontGlyphDataGet(uint8_t *pui8FontID, + uint32_t ui32Codepoint, + uint8_t *pui8Width) +{ + tFontFile *psFont; + uint32_t ui32Loop, ui32GlyphOffset, ui32TableOffset; + UINT uiRead; + tFontBlock sBlock; + tFontBlock *psBlock; + bool bRetcode; + FRESULT iFResult; + + // + // Parameter sanity check. + // + ASSERT(pui8FontID); + ASSERT(pui8Width); + + // + // If passed a NULL codepoint, return immediately. + // + if(!ui32Codepoint) + { + return(0); + } + + // + // Get a pointer to our instance data. + // + psFont = (tFontFile *)pui8FontID; + + ASSERT(psFont->bInUse); + + // + // Look for the trivial case - do we have this glyph in our glyph store + // already? + // + if(psFont->ui32CurrentGlyph == ui32Codepoint) + { + // + // We struck gold - we already have this glyph in our buffer. Return + // the width (from the second byte of the data) and a pointer to the + // glyph data. + // + *pui8Width = psFont->pui8GlyphStore[1]; + return(psFont->pui8GlyphStore); + } + + // + // First find the block that contains the glyph we've been asked for. + // + for(ui32Loop = 0; ui32Loop < psFont->sFontHeader.ui16NumBlocks; ui32Loop++) + { + if(ui32Loop < MAX_FONT_BLOCKS) + { + psBlock = &psFont->psBlocks[ui32Loop]; + } + else + { + bRetcode = FATWrapperFontBlockHeaderGet(&psFont->sFile, &sBlock, + ui32Loop); + psBlock = &sBlock; + if(!bRetcode) + { + // + // We failed to read the block header so return an error. + // + return(0); + } + } + + // + // Does the requested character exist in this block? + // + if((ui32Codepoint >= (psBlock->ui32StartCodepoint)) && + ((ui32Codepoint < (psBlock->ui32StartCodepoint + + psBlock->ui32NumCodepoints)))) + { + // + // The glyph is in this block. Calculate the offset of it's + // glyph table entry in the file. + // + ui32TableOffset = psBlock->ui32GlyphTableOffset + + ((ui32Codepoint - psBlock->ui32StartCodepoint) * + sizeof(uint32_t)); + + // + // Move the file pointer to the offset position. + // + iFResult = f_lseek(&psFont->sFile, ui32TableOffset); + + if(iFResult != FR_OK) + { + return(0); + } + + // + // Read the glyph data offset. + // + iFResult = f_read(&psFont->sFile, &ui32GlyphOffset, + sizeof(uint32_t), &uiRead); + + // + // Return if there was an error or if the offset is 0 (which + // indicates that the character is not included in the font. + // + if((iFResult != FR_OK) || (uiRead != sizeof(uint32_t)) || + !ui32GlyphOffset) + { + return(0); + } + + // + // Move the file pointer to the start of the glyph data remembering + // that the glyph table offset is relative to the start of the + // block not the start of the file (so we add the table offset + // here). + // + iFResult = f_lseek(&psFont->sFile, (psBlock->ui32GlyphTableOffset + + ui32GlyphOffset)); + + if(iFResult != FR_OK) + { + return(0); + } + + // + // Read the first byte of the glyph data to find out how long it + // is. + // + iFResult = f_read(&psFont->sFile, psFont->pui8GlyphStore, 1, + &uiRead); + + if((iFResult != FR_OK) || !uiRead) + { + return(0); + } + + // + // Now read the glyph data. + // + iFResult = f_read(&psFont->sFile, psFont->pui8GlyphStore + 1, + psFont->pui8GlyphStore[0] - 1, &uiRead); + + if((iFResult != FR_OK) || + (uiRead != (psFont->pui8GlyphStore[0] - 1))) + { + return(0); + } + + // + // If we get here, things are good. Return a pointer to the glyph + // store data. + // + psFont->ui32CurrentGlyph = ui32Codepoint; + *pui8Width = psFont->pui8GlyphStore[1]; + return(psFont->pui8GlyphStore); + } + } + + // + // If we get here, the codepoint doesn't exist in the font so return an + // error. + // + return(0); +} + +//***************************************************************************** +// +// Prepares the FAT file system font wrapper for use. +// +// This function must be called before any attempt to use a font stored on the +// FAT file system. It initializes FATfs for use. +// +// \return Returns \b true on success or \b false on failure. +// +//***************************************************************************** +bool +FATFontWrapperInit(void) +{ + FRESULT iFResult; + + // + // Mount the file system, using logical disk 0. + // + iFResult = f_mount(0, &g_sFatFs); + if(iFResult != FR_OK) + { + // + // We failed to mount the volume. Tell the user and return an error. + // + UARTprintf("f_mount error: %s (%d)\n", StringFromFresult(iFResult), + iFResult); + return(false); + } + + // + // All is well so tell the caller. + // + return(true); +} + +//***************************************************************************** +// +// Provides the FATfs timer tick. +// +// This function must be called every 10mS or so by the application. It +// provides the time reference required by the FAT file system. +// +// \return None. +// +//***************************************************************************** +void +FATWrapperSysTickHandler(void) +{ + // + // Call the FatFs tick timer. + // + disk_timerproc(); +} + +//***************************************************************************** +// +// Prepares a font in the FATfs file system for use by the graphics library. +// +// This function must be called to prepare a font for use by the graphics +// library. It opens the font file whose name is passed and reads the +// header information. The value returned should be written into the +// pui8FontID field of the tFontWrapper structure that will be passed to +// graphics library. +// +// This is a very simple (and slow) implementation. More complex wrappers +// may also initialize a glyph cache here. +// +// \return On success, returns a non-zero pointer identifying the font. On +// error, zero is returned. +// +//***************************************************************************** +uint8_t * +FATFontWrapperLoad(char *pcFilename) +{ + FRESULT iFResult; + UINT uiRead, uiToRead; + + UARTprintf("Attempting to load font %s from FAT file system.\n", + pcFilename); + + // + // Make sure a font is not already open. + // + if(g_sFontFile.bInUse) + { + // + // Oops - someone tried to load a new font without unloading the + // previous one. + // + UARTprintf("Another font is already loaded!\n"); + return(0); + } + + // + // Try to open the file whose name we've been given. + // + iFResult = f_open(&g_sFontFile.sFile, pcFilename, FA_READ); + if(iFResult != FR_OK) + { + // + // We can't open the file. Either the file doesn't exist or there is + // no SDCard installed. Regardless, return an error. + // + UARTprintf("Error %s (%d) from f_open.\n", StringFromFresult(iFResult), + iFResult); + return(0); + } + + // + // We opened the file successfully. Does it seem to contain a valid + // font? Read the header and see. + // + iFResult = f_read(&g_sFontFile.sFile, &g_sFontFile.sFontHeader, + sizeof(tFontWide), &uiRead); + if((iFResult == FR_OK) && (uiRead == sizeof(tFontWide))) + { + // + // We read the font header. Is the format correct? We only support + // wide fonts via wrappers. + // + if((g_sFontFile.sFontHeader.ui8Format != FONT_FMT_WIDE_UNCOMPRESSED) && + (g_sFontFile.sFontHeader.ui8Format != FONT_FMT_WIDE_PIXEL_RLE)) + { + // + // This is not a supported font format. + // + UARTprintf("Unrecognized font format. Failing " + "FATFontWrapperLoad.\n"); + f_close(&g_sFontFile.sFile); + return(0); + } + + // + // The format seems to be correct so read as many block headers as we + // have storage for. + // + uiToRead = ((g_sFontFile.sFontHeader.ui16NumBlocks > MAX_FONT_BLOCKS) ? + MAX_FONT_BLOCKS * sizeof(tFontBlock) : + (g_sFontFile.sFontHeader.ui16NumBlocks * + sizeof(tFontBlock))); + + iFResult = f_read(&g_sFontFile.sFile, &g_sFontFile.psBlocks, uiToRead, + &uiRead); + if((iFResult == FR_OK) && (uiRead == uiToRead)) + { + // + // All is well. Tell the caller the font was opened successfully. + // + UARTprintf("Font %s opened successfully.\n", pcFilename); + g_sFontFile.bInUse = true; + return((uint8_t *)&g_sFontFile); + } + else + { + UARTprintf("Error %s (%d) reading block headers. Read %d, exp %d " + "bytes.\n", StringFromFresult(iFResult), iFResult, + uiRead, uiToRead); + f_close(&g_sFontFile.sFile); + return(0); + } + } + else + { + // + // We received an error while reading the file header so fail the call. + // + UARTprintf("Error %s (%d) reading font header.\n", + StringFromFresult(iFResult), iFResult); + f_close(&g_sFontFile.sFile); + return(0); + } +} + +//***************************************************************************** +// +// Frees a font and cleans up once an application has finished using it. +// +// This function releases all resources allocated during a previous call to +// FATFontWrapperLoad(). The caller must not make any further use of the +// font following this call unless another call to FATFontWrapperLoad() is +// made. +// +// \return None. +// +//***************************************************************************** +void FATFontWrapperUnload(uint8_t *pui8FontID) +{ + tFontFile *psFont; + FRESULT iFResult; + + // + // Parameter sanity check. + // + ASSERT(pui8FontID); + + // + // Get a pointer to our instance data. + // + psFont = (tFontFile *)pui8FontID; + + // + // Make sure a font is already open. If not, just return. + // + if(!psFont->bInUse) + { + return; + } + + // + // Close the font file. + // + UARTprintf("Unloading font... \n"); + iFResult = f_close(&psFont->sFile); + if(iFResult != FR_OK) + { + UARTprintf("Error %s (%d) from f_close.\n", StringFromFresult(iFResult), + iFResult); + } + + // + // Clean up our instance data. + // + psFont->bInUse = false; + psFont->ui32CurrentGlyph = 0; +} diff --git a/boards/dk-tm4c129x/fontview/fatwrapper.h b/boards/dk-tm4c129x/fontview/fatwrapper.h new file mode 100644 index 0000000..d021cc2 --- /dev/null +++ b/boards/dk-tm4c129x/fontview/fatwrapper.h @@ -0,0 +1,45 @@ +//***************************************************************************** +// +// fatwrapper.h - Prototypes for the FAT font wrapper module. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __FATWRAPPER_H__ +#define __FATWRAPPER_H__ + +//***************************************************************************** +// +// Exported globals. +// +//***************************************************************************** +extern const tFontAccessFuncs g_sFATFontAccessFuncs; + +//***************************************************************************** +// +// Public function prototypes. +// +//***************************************************************************** +extern void FATWrapperSysTickHandler(void); +extern bool FATFontWrapperInit(void); +extern unsigned char *FATFontWrapperLoad(char *pcFilename); +extern void FATFontWrapperUnload(unsigned char *pucFontId); + +#endif diff --git a/boards/dk-tm4c129x/fontview/fontview.c b/boards/dk-tm4c129x/fontview/fontview.c new file mode 100644 index 0000000..31aee18 --- /dev/null +++ b/boards/dk-tm4c129x/fontview/fontview.c @@ -0,0 +1,705 @@ +//***************************************************************************** +// +// fonttest.c - Simple font testcase. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/pushbutton.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "third_party/fonts/ofl/ofl_fonts.h" +#include "fatwrapper.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Font Viewer (fontview)

      +//! +//! This example displays the contents of a TivaWare graphics library font +//! on the DK board's LCD touchscreen. By default, the application shows a +//! test font containing ASCII, the Japanese Hiragana and Katakana alphabets, +//! and a group of Korean Hangul characters. If an SDCard is installed and +//! the root directory contains a file named font.bin, this file is +//! opened and used as the display font instead. In this case, the graphics +//! library font wrapper feature is used to access the font from the file +//! system rather than from internal memory. +// +//***************************************************************************** + +//***************************************************************************** +// +// Change the following to set the font whose characters you want to view if +// no "font.bin" is found in the root directory of the SDCard. +// +//***************************************************************************** +#define FONT_TO_USE g_pFontCjktest20pt + +//***************************************************************************** +// +// A pointer to the font we intend to use. This will be set depending upon +// whether we are using a font from the SDCard or the internal font defined +// above. +// +//***************************************************************************** +const tFont *g_psFont; + +//***************************************************************************** +// +// The font wrapper structure used to describe the SDCard-based font to grlib. +// +//***************************************************************************** +tFontWrapper g_sFontWrapper = +{ + FONT_FMT_WRAPPED, + 0, + &g_sFATFontAccessFuncs +}; + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 + +//***************************************************************************** +// +// Forward reference to various widget structures. +// +//***************************************************************************** +extern tCanvasWidget g_sBackground; +extern tCanvasWidget g_sBlockNumCanvas; +extern tCanvasWidget g_sCharNumCanvas; +extern tCanvasWidget g_sCharCanvas; +extern tPushButtonWidget g_sBlockIncBtn; +extern tPushButtonWidget g_sBlockDecBtn; +extern tPushButtonWidget g_sCharIncBtn; +extern tPushButtonWidget g_sCharDecBtn; + +//***************************************************************************** +// +// Buffers for various strings. +// +//***************************************************************************** +char g_pcBlocks[20]; +char g_pcStartChar[32]; + +//***************************************************************************** +// +// Forward reference to various handlers and internal functions. +// +//***************************************************************************** +void SetBlockNum(uint32_t ui32BlockNum); +void OnBlockButtonPress(tWidget *psWidget); +void OnCharButtonPress(tWidget *psWidget); +void PaintFontGlyphs(tWidget *psWidget, tContext *psContext); + +//***************************************************************************** +// +// The canvas widget acting as the background to the display. +// +//***************************************************************************** +Canvas(g_sBackground, WIDGET_ROOT, &g_sCharCanvas, &g_sBlockNumCanvas, + &g_sKentec320x240x16_SSD2119, 8, 24, 304, 208, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The canvas containing the rendered characters. +// +//***************************************************************************** +Canvas(g_sCharCanvas, WIDGET_ROOT, 0, 0, + &g_sKentec320x240x16_SSD2119, 8, 48, 304, 184, + CANVAS_STYLE_APP_DRAWN, + ClrDarkBlue, ClrWhite, ClrWhite, 0, 0, 0, PaintFontGlyphs); + +//***************************************************************************** +// +// The canvas widget displaying the maximum and current block number. +// +//***************************************************************************** +Canvas(g_sBlockNumCanvas, &g_sBackground, &g_sCharNumCanvas, 0, + &g_sKentec320x240x16_SSD2119, 8, 24, 200, 10, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT), + ClrBlack, 0, ClrWhite, + g_psFontFixed6x8, g_pcBlocks, 0, 0); + +//***************************************************************************** +// +// The canvas widget displaying the start codepoint for the block. +// +//***************************************************************************** +Canvas(g_sCharNumCanvas, &g_sBackground, &g_sBlockDecBtn, 0, + &g_sKentec320x240x16_SSD2119, 8, 34, 200, 10, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT), + ClrBlack, 0, ClrWhite, + g_psFontFixed6x8, g_pcStartChar, 0, 0); + +//***************************************************************************** +// +// The button used to decrement the block number. +// +//***************************************************************************** +RectangularButton(g_sBlockDecBtn, &g_sBackground, &g_sBlockIncBtn, 0, + &g_sKentec320x240x16_SSD2119, 200, 26, 20, 20, + (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT | + PB_STYLE_FILL), + ClrDarkBlue, ClrRed, ClrWhite, ClrWhite, + g_psFontFixed6x8, "<", 0, 0, 0, 0, + OnBlockButtonPress); + +//***************************************************************************** +// +// The button used to increment the block number. +// +//***************************************************************************** +RectangularButton(g_sBlockIncBtn, &g_sBackground, &g_sCharDecBtn, 0, + &g_sKentec320x240x16_SSD2119, 230, 26, 20, 20, + (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT | + PB_STYLE_FILL), + ClrDarkBlue, ClrRed, ClrWhite, ClrWhite, + g_psFontFixed6x8, ">", 0, 0, 0, 0, + OnBlockButtonPress); + +//***************************************************************************** +// +// The button used to decrement the character row number. +// +//***************************************************************************** +RectangularButton(g_sCharDecBtn, &g_sBackground, &g_sCharIncBtn, 0, + &g_sKentec320x240x16_SSD2119, 260, 26, 20, 20, + (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrRed, ClrWhite, ClrWhite, + g_psFontFixed6x8, "^", 0, 0, 70, 20, + OnCharButtonPress); + +//***************************************************************************** +// +// The button used to increment the character row number. +// +//***************************************************************************** +RectangularButton(g_sCharIncBtn, &g_sBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, 290, 26, 20, 20, + (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrRed, ClrWhite, ClrWhite, + g_psFontFixed6x8, "v", 0, 0, 70, 20, + OnCharButtonPress); + +//***************************************************************************** +// +// Text codepage mapping functions. +// +//***************************************************************************** +tCodePointMap g_psCodepointMappings[] = +{ + {CODEPAGE_ISO8859_1, CODEPAGE_UNICODE, GrMapISO8859_1_Unicode}, + {CODEPAGE_UTF_8, CODEPAGE_UNICODE, GrMapUTF8_Unicode}, + {CODEPAGE_UNICODE, CODEPAGE_UNICODE, GrMapUnicode_Unicode} +}; + +#define NUM_CHAR_MAPPINGS (sizeof(g_psCodepointMappings)/sizeof(tCodePointMap)) + +//***************************************************************************** +// +// Default text rendering parameters. The only real difference between the +// grlib defaults and this set is the addition of a mapping function to allow +// 32 bit Unicode source. +// +//***************************************************************************** +tGrLibDefaults g_psGrLibSettingDefaults = +{ + GrDefaultStringRenderer, + g_psCodepointMappings, + CODEPAGE_UTF_8, + NUM_CHAR_MAPPINGS, + 0 +}; + +//***************************************************************************** +// +// Top left corner of the grid we use to draw the characters. +// +//***************************************************************************** +#define TOP 50 +#define LEFT 44 + +//***************************************************************************** +// +// The character cell size used when redrawing the display. +// +//***************************************************************************** +uint32_t g_ui32CellWidth; +uint32_t g_ui32CellHeight; +uint32_t g_ui32LinesPerPage; +uint32_t g_ui32CharsPerLine; +uint32_t g_ui32StartLine; +uint32_t g_ui32NumBlocks; +uint32_t g_ui32StartChar; +uint32_t g_ui32NumBlockChars; +uint32_t g_ui32BlockNum; + +//***************************************************************************** +// +// The system clock frequency in Hz. +// +//***************************************************************************** +uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// Macros used to derive the screen position given the character's X and Y +// coordinates in the grid. +// +//***************************************************************************** +#define POSX(x) (LEFT + (g_ui32CellWidth / 2) + (g_ui32CellWidth * (x))) +#define POSY(y) (TOP + (g_ui32CellHeight / 2) + (g_ui32CellHeight * (y))) + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This function is called by the graphics library widget manager in the +// context of WidgetMessageQueueProcess whenever the user releases the +// ">" or "<" button. +// +//***************************************************************************** +void +OnBlockButtonPress(tWidget *psWidget) +{ + bool bRedraw; + + // + // Assume no redraw until we determine otherwise. + // + bRedraw = false; + + // + // Are we incrementing or decrementing the block number? + // + if(psWidget == (tWidget *)&g_sBlockIncBtn) + { + // + // We are incrementing. Have we already reached the top block? + // + if((g_ui32BlockNum + 1) < g_ui32NumBlocks) + { + // + // No - increment the block number. + // + g_ui32BlockNum++; + bRedraw = true; + } + } + else + { + // + // We are decrementing. Are we already showing the first block? + // + if(g_ui32BlockNum) + { + // + // No - move back 1 block. + // + g_ui32BlockNum--; + bRedraw = true; + } + } + + // + // If we made a change, set things up to display the new block. + // + if(bRedraw) + { + SetBlockNum(g_ui32BlockNum); + } +} + +//***************************************************************************** +// +// This function is called by the graphics library widget manager in the +// context of WidgetMessageQueueProcess whenever the user releases the +// "^" or "v" button. +// +//***************************************************************************** +void +OnCharButtonPress(tWidget *psWidget) +{ + bool bRedraw; + + // + // Assume no redraw until we determine otherwise. + // + bRedraw = false; + + // + // Were we asked to scroll up or down? + // + if(psWidget == (tWidget *)&g_sCharIncBtn) + { + // + // Scroll down if there are more characters to display. + // + if(((g_ui32StartLine + g_ui32LinesPerPage) * g_ui32CharsPerLine) < + g_ui32NumBlockChars) + { + g_ui32StartLine++; + bRedraw = true; + } + } + else + { + // + // Scroll up if we're not already showing the first line. + // + if(g_ui32StartLine) + { + g_ui32StartLine--; + bRedraw = true; + } + } + + // + // If we made a change, redraw the character area. + // + if(bRedraw) + { + WidgetPaint((tWidget *)&g_sCharCanvas); + } +} + +//***************************************************************************** +// +// Update the display for a new font block. +// +//***************************************************************************** +void +SetBlockNum(uint32_t ui32BlockNum) +{ + uint32_t ui32Start, ui32Chars; + + // + // Set the new block number. + // + ui32Chars = GrFontBlockCodepointsGet(g_psFont, ui32BlockNum, &ui32Start); + + // + // If this block exists, update our state. + // + if(ui32Chars) + { + // + // Remember details of the new block. + // + g_ui32BlockNum = ui32BlockNum; + g_ui32StartChar = ui32Start; + g_ui32NumBlockChars = ui32Chars; + g_ui32StartLine = 0; + + // + // Update the valid block display and start character. + // + usnprintf(g_pcBlocks, sizeof(g_pcBlocks), "Block %d of %d ", + g_ui32BlockNum + 1, g_ui32NumBlocks); + usnprintf(g_pcStartChar, sizeof(g_pcStartChar), "%d chars from 0x%08x", + g_ui32NumBlockChars, g_ui32StartChar); + } + + // + // Repaint the display + // + WidgetPaint((tWidget *)WIDGET_ROOT); +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. FatFs requires a +// timer tick every 10 ms for internal timing purposes. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Call the FAT module to provide its tick. + // + FATWrapperSysTickHandler(); +} + +//***************************************************************************** +// +// Main entry function for the fontview application. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Height, ui32Width; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "fontview"); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(g_ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(WidgetPointerMessage); + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(g_ui32SysClock / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the UART as a console for text I/O. + // + UARTStdioConfig(0, 115200, g_ui32SysClock); + UARTprintf("FontView example running...\n"); + + // + // Set graphics library text rendering defaults. + // + GrLibInit(&g_psGrLibSettingDefaults); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sBackground); + + // + // Paint the widget tree to make sure they all appear on the display. + // + WidgetPaint(WIDGET_ROOT); + + // + // Initialize the FAT file system font wrapper. + // + if(!FATFontWrapperInit()) + { + UARTprintf("ERROR: Can't initialize FAT file system!\n"); + while(1) + { + // + // Hang. + // + } + } + + // + // See if there is a file called "font.bin" in the root directory of the + // SDCard. If there is, use this as the font to display rather than the + // one defined via FONT_TO_USE. + // + g_sFontWrapper.pui8FontId = FATFontWrapperLoad("/font.bin"); + if(g_sFontWrapper.pui8FontId) + { + UARTprintf("Using font from SDCard.\n"); + g_psFont = (tFont *)&g_sFontWrapper; + } + else + { + UARTprintf("No font found on SDCard. Displaying internal font.\n"); + g_psFont = FONT_TO_USE; + } + + // + // How big is the test font character cell? + // + ui32Height = GrFontHeightGet(g_psFont); + ui32Width = GrFontMaxWidthGet(g_psFont); + + // + // Determine the size of the character cell to use for this font. We + // limit the cell size such that we either get 8 or 16 characters per line. + // + g_ui32CharsPerLine = (ui32Width > ((320 - LEFT) / 16)) ? 8 : 16; + g_ui32CellWidth = (320 - LEFT) / g_ui32CharsPerLine; + g_ui32CellHeight = ui32Height + 4; + g_ui32LinesPerPage = (240 - TOP) / g_ui32CellHeight; + g_ui32StartLine = (0x20 / g_ui32CharsPerLine); + + // + // Get the number of blocks in the font and set up to display the content + // of the first. + // + g_ui32NumBlocks = GrFontNumBlocksGet(g_psFont); + SetBlockNum(0); + + // + // Loop forever, processing widget messages. + // + while(1) + { + // + // Process any messages from or for the widgets. + // + WidgetMessageQueueProcess(); + } +} + +//***************************************************************************** +// +// Paints the main font glyph section of the display. +// +//***************************************************************************** +void +PaintFontGlyphs(tWidget *psWidget, tContext *psContext) +{ + uint32_t ui32X, ui32Y, ui32Char; + tRectangle sRect; + tCanvasWidget *psCanvas; + char pcBuffer[6]; + + // + // Tell the graphics library we will be using UTF-8 text for now. + // + GrStringCodepageSet(psContext, CODEPAGE_UTF_8); + + // + // Erase the background. + // + psCanvas = (tCanvasWidget *)psWidget; + GrContextForegroundSet(psContext, psCanvas->ui32FillColor); + sRect = psCanvas->sBase.sPosition; + GrRectFill(psContext, &sRect); + + // + // Draw the character indices. + // + GrContextForegroundSet(psContext, ClrYellow); + GrContextFontSet(psContext, g_psFontFixed6x8); + + for(ui32Y = 0; ui32Y < g_ui32LinesPerPage; ui32Y++ ) + { + usprintf(pcBuffer, "%06x", g_ui32StartChar + ((ui32Y + g_ui32StartLine) * + g_ui32CharsPerLine) ); + GrStringDraw(psContext, pcBuffer, -1, 8, POSY(ui32Y), 0); + } + + // + // Tell the graphics library to render pure, 32 bit Unicode source + // text. + // + GrStringCodepageSet(psContext, CODEPAGE_UNICODE); + + // + // Draw the required characters at their positions in the grid. + // + GrContextFontSet(psContext, g_psFont); + GrContextForegroundSet(psContext, ClrWhite); + + for(ui32Y = 0; ui32Y < g_ui32LinesPerPage; ui32Y++) + { + for(ui32X = 0; ui32X < g_ui32CharsPerLine; ui32X++) + { + // + // Which character are we about to show? + // + ui32Char = g_ui32StartChar + + ((g_ui32StartLine + ui32Y) * g_ui32CharsPerLine) + ui32X; + + // + // Fill the character cell with the background color. + // + sRect.i16XMin = LEFT + (ui32X * g_ui32CellWidth); + sRect.i16YMin = TOP + (ui32Y * g_ui32CellHeight); + sRect.i16XMax = sRect.i16XMin + g_ui32CellWidth; + sRect.i16YMax = sRect.i16YMin + g_ui32CellHeight; + GrContextForegroundSet(psContext, psCanvas->ui32FillColor); + GrRectFill(psContext, &sRect); + GrContextForegroundSet(psContext, ClrWhite); + + // + // Have we run off the end of the end of the block? + // + if((ui32Char - g_ui32StartChar) < g_ui32NumBlockChars) + { + // + // No - display the character. + // + + GrStringDrawCentered(psContext, (char const *)&ui32Char, 4, + POSX(ui32X), POSY(ui32Y), 0); + } + } + } +} diff --git a/boards/dk-tm4c129x/fontview/fontview.ewd b/boards/dk-tm4c129x/fontview/fontview.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/fontview/fontview.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/fontview/fontview.ewp b/boards/dk-tm4c129x/fontview/fontview.ewp new file mode 100644 index 0000000..87f9f7b --- /dev/null +++ b/boards/dk-tm4c129x/fontview/fontview.ewp @@ -0,0 +1,824 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\fatwrapper.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\..\..\..\third_party\fonts\ofl\fonts\fontcjktest20pt.c + + + $PROJ_DIR$\fontview.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/fontview/fontview.icf b/boards/dk-tm4c129x/fontview/fontview.icf new file mode 100644 index 0000000..1c1b0de --- /dev/null +++ b/boards/dk-tm4c129x/fontview/fontview.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// fontview.icf - Linker configuration file for fontview. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/fontview/fontview.ld b/boards/dk-tm4c129x/fontview/fontview.ld new file mode 100644 index 0000000..c8300c5 --- /dev/null +++ b/boards/dk-tm4c129x/fontview/fontview.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * fontview.ld - Linker configuration file for fontview. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/fontview/fontview.sct b/boards/dk-tm4c129x/fontview/fontview.sct new file mode 100644 index 0000000..43f6d57 --- /dev/null +++ b/boards/dk-tm4c129x/fontview/fontview.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; fontview.sct - Linker configuration file for fontview. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/fontview/fontview.uvopt b/boards/dk-tm4c129x/fontview/fontview.uvopt new file mode 100644 index 0000000..89710ff --- /dev/null +++ b/boards/dk-tm4c129x/fontview/fontview.uvopt @@ -0,0 +1,443 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + fontview + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\fatwrapper.c + fatwrapper.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fonts\ofl\fonts\fontcjktest20pt.c + fontcjktest20pt.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\fontview.c + fontview.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + mmc-dk-tm4c129x.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 9 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 14 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 15 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/fontview/fontview.uvproj b/boards/dk-tm4c129x/fontview/fontview.uvproj new file mode 100644 index 0000000..6a7914f --- /dev/null +++ b/boards/dk-tm4c129x/fontview/fontview.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + fontview + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + fontview + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\fontview.bin .\rvmdk\fontview.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 UART_BUFFERED + + ..;..\..\..\..;..\..\..\..\third_party\fonts\ofl;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + fontview.sct + + + --entry Reset_Handler + + + + + + + + Source + + + fatwrapper.c + 1 + .\fatwrapper.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + fontcjktest20pt.c + 1 + ..\..\..\..\third_party\fonts\ofl\fonts\fontcjktest20pt.c + + + fontview.c + 1 + .\fontview.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + mmc-dk-tm4c129x.c + 1 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/fontview/fontview_ccs.cmd b/boards/dk-tm4c129x/fontview/fontview_ccs.cmd new file mode 100644 index 0000000..eed371f --- /dev/null +++ b/boards/dk-tm4c129x/fontview/fontview_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * fontview_ccs.cmd - CCS linker configuration file for fontview. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/fontview/gcc/fontview.axf b/boards/dk-tm4c129x/fontview/gcc/fontview.axf new file mode 100644 index 0000000..7c8c960 Binary files /dev/null and b/boards/dk-tm4c129x/fontview/gcc/fontview.axf differ diff --git a/boards/dk-tm4c129x/fontview/gcc/fontview.bin b/boards/dk-tm4c129x/fontview/gcc/fontview.bin new file mode 100644 index 0000000..51ac45c Binary files /dev/null and b/boards/dk-tm4c129x/fontview/gcc/fontview.bin differ diff --git a/boards/dk-tm4c129x/fontview/readme.txt b/boards/dk-tm4c129x/fontview/readme.txt new file mode 100644 index 0000000..91f637a --- /dev/null +++ b/boards/dk-tm4c129x/fontview/readme.txt @@ -0,0 +1,30 @@ +Font Viewer + +This example displays the contents of a TivaWare graphics library font +on the DK board's LCD touchscreen. By default, the application shows a +test font containing ASCII, the Japanese Hiragana and Katakana alphabets, +and a group of Korean Hangul characters. If an SDCard is installed and +the root directory contains a file named font.bin, this file is +opened and used as the display font instead. In this case, the graphics +library font wrapper feature is used to access the font from the file +system rather than from internal memory. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/fontview/rvmdk/fontview.axf b/boards/dk-tm4c129x/fontview/rvmdk/fontview.axf new file mode 100644 index 0000000..c28d7f6 Binary files /dev/null and b/boards/dk-tm4c129x/fontview/rvmdk/fontview.axf differ diff --git a/boards/dk-tm4c129x/fontview/rvmdk/fontview.bin b/boards/dk-tm4c129x/fontview/rvmdk/fontview.bin new file mode 100644 index 0000000..d715927 Binary files /dev/null and b/boards/dk-tm4c129x/fontview/rvmdk/fontview.bin differ diff --git a/boards/dk-tm4c129x/fontview/startup_ccs.c b/boards/dk-tm4c129x/fontview/startup_ccs.c new file mode 100644 index 0000000..630b0c5 --- /dev/null +++ b/boards/dk-tm4c129x/fontview/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void UARTStdioIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/fontview/startup_ewarm.c b/boards/dk-tm4c129x/fontview/startup_ewarm.c new file mode 100644 index 0000000..3e79ade --- /dev/null +++ b/boards/dk-tm4c129x/fontview/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void UARTStdioIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/fontview/startup_gcc.c b/boards/dk-tm4c129x/fontview/startup_gcc.c new file mode 100644 index 0000000..0e4632c --- /dev/null +++ b/boards/dk-tm4c129x/fontview/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void UARTStdioIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/fontview/startup_rvmdk.S b/boards/dk-tm4c129x/fontview/startup_rvmdk.S new file mode 100644 index 0000000..3be1d1c --- /dev/null +++ b/boards/dk-tm4c129x/fontview/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SysTickHandler + EXTERN UARTStdioIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTStdioIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/freertos_demo/FreeRTOSConfig.h b/boards/dk-tm4c129x/freertos_demo/FreeRTOSConfig.h new file mode 100644 index 0000000..956d1b4 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/FreeRTOSConfig.h @@ -0,0 +1,107 @@ +/* + FreeRTOS V7.0.2 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 80000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 200 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 20240 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configCHECK_FOR_STACK_OVERFLOW 2 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 16 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) +#define configQUEUE_REGISTRY_SIZE 10 + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 + +/* Be ENORMOUSLY careful if you want to modify these two values and make sure + * you read http://www.freertos.org/a00110.html#kernel_priority first! + */ +#define configKERNEL_INTERRUPT_PRIORITY ( 7 << 5 ) /* Priority 7, or 0xE0 as only the top three bits are implemented. This is the lowest priority. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 5 << 5 ) /* Priority 5, or 0xA0 as only the top three bits are implemented. */ + +#endif /* FREERTOS_CONFIG_H */ diff --git a/boards/dk-tm4c129x/freertos_demo/Makefile b/boards/dk-tm4c129x/freertos_demo/Makefile new file mode 100644 index 0000000..e8d76d3 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/Makefile @@ -0,0 +1,124 @@ +#****************************************************************************** +# +# Makefile - Rules for building the FreeRTOS example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F +VPATH+=../../../../third_party/FreeRTOS/Source/portable/MemMang/ +VPATH+=../../../../third_party/FreeRTOS/Source +VPATH+=../drivers +VPATH+=../../../../third_party/lwip-1.4.1/apps/httpserver_raw +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F +IPATH+=../../../../third_party/FreeRTOS +IPATH+=../../../../third_party/lwip-1.4.1/apps +IPATH+=../../../../third_party/FreeRTOS/Source/include +IPATH+=../../../../third_party/lwip-1.4.1/ports/tiva-tm4c129/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include/ipv4 +IPATH+=../../../../third_party + +# +# The default rule, which causes the FreeRTOS example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/freertos_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the FreeRTOS example. +# +${COMPILER}/freertos_demo.axf: ${COMPILER}/cgifuncs.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/croutine.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/display_task.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/frame.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/freertos_demo.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/fs.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/heap_2.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/httpd.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/idle_task.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/images.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/led_task.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/list.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/locator.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/lwip_task.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/lwiplib.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/pinout.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/port.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/queue.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/random.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/spider_task.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/tasks.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/timers.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/touch.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/ustdlib.o +${COMPILER}/freertos_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/freertos_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/freertos_demo.axf: freertos_demo.ld +SCATTERgcc_freertos_demo=freertos_demo.ld +ENTRY_freertos_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 -DSNOWFLAKE + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/freertos_demo/ccs/.ccsimportspec b/boards/dk-tm4c129x/freertos_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..41907ca --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/ccs/.ccsimportspec @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/freertos_demo/ccs/.ccsproject b/boards/dk-tm4c129x/freertos_demo/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/freertos_demo/ccs/.cproject b/boards/dk-tm4c129x/freertos_demo/ccs/.cproject new file mode 100644 index 0000000..79942b5 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/ccs/.cproject @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/freertos_demo/ccs/.project b/boards/dk-tm4c129x/freertos_demo/ccs/.project new file mode 100644 index 0000000..0a6affe --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/ccs/.project @@ -0,0 +1,175 @@ + + + freertos_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + cgifuncs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/cgifuncs.c + + + display_task.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/display_task.c + + + freertos_demo.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/freertos_demo.c + + + freertos_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/freertos_demo_ccs.cmd + + + fs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/fs.c + + + idle_task.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/idle_task.c + + + images.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/images.c + + + led_task.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/led_task.c + + + lwip_task.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/lwip_task.c + + + random.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/random.c + + + spider_task.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/spider_task.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/freertos_demo/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/locator.c + 1 + SW_ROOT/utils/locator.c + + + utils/lwiplib.c + 1 + SW_ROOT/utils/lwiplib.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/FreeRTOS/Source/croutine.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/croutine.c + + + third_party/FreeRTOS/Source/list.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/list.c + + + third_party/FreeRTOS/Source/queue.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/queue.c + + + third_party/FreeRTOS/Source/tasks.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/tasks.c + + + third_party/FreeRTOS/Source/timers.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/timers.c + + + third_party/lwip-1.4.1/apps/httpserver_raw/httpd.c + 1 + SW_ROOT/third_party/lwip-1.4.1/apps/httpserver_raw/httpd.c + + + third_party/FreeRTOS/Source/portable/MemMang/heap_2.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/portable/MemMang/heap_2.c + + + third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c + + + third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm + 1 + SW_ROOT/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/freertos_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/freertos_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/freertos_demo/ccs/Debug/freertos_demo.bin b/boards/dk-tm4c129x/freertos_demo/ccs/Debug/freertos_demo.bin new file mode 100644 index 0000000..0caf86c Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/ccs/Debug/freertos_demo.bin differ diff --git a/boards/dk-tm4c129x/freertos_demo/ccs/Debug/freertos_demo.out b/boards/dk-tm4c129x/freertos_demo/ccs/Debug/freertos_demo.out new file mode 100644 index 0000000..4276cdb Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/ccs/Debug/freertos_demo.out differ diff --git a/boards/dk-tm4c129x/freertos_demo/ccs/macros.ini_initial b/boards/dk-tm4c129x/freertos_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/freertos_demo/ccs/target_config.ccxml b/boards/dk-tm4c129x/freertos_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/freertos_demo/cgifuncs.c b/boards/dk-tm4c129x/freertos_demo/cgifuncs.c new file mode 100644 index 0000000..b6b8efd --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/cgifuncs.c @@ -0,0 +1,552 @@ +//***************************************************************************** +// +// cgifuncs.c - Helper functions related to CGI script parameter parsing. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_types.h" +#include "utils/ustdlib.h" +#include "cgifuncs.h" + +//***************************************************************************** +// +// Searches the list of parameters passed to a CGI handler and returns the +// index of a given parameter within that list. +// +// \param pcToFind is a pointer to a string containing the name of the +// parameter that is to be found. +// \param pcParam is an array of character pointers, each containing the name +// of a single parameter as encoded in the URI requesting the CGI. +// \param i32NumParams is the number of elements in the pcParam array. +// +// This function searches an array of parameters to find the string passed in +// \e pcToFind. If the string is found, the index of that string within the +// \e pcParam array is returned, otherwise -1 is returned. +// +// \return Returns the index of string \e pcToFind within array \e pcParam +// or -1 if the string does not exist in the array. +// +//***************************************************************************** +int32_t +FindCGIParameter(const char *pcToFind, char *pcParam[], int32_t i32NumParams) +{ + int32_t i32Loop; + + // + // Scan through all the parameters in the array. + // + for(i32Loop = 0; i32Loop < i32NumParams; i32Loop++) + { + // + // Does the parameter name match the provided string? + // + if(strcmp(pcToFind, pcParam[i32Loop]) == 0) + { + // + // We found a match - return the index. + // + return(i32Loop); + } + } + + // + // If we drop out, the parameter was not found. + // + return(-1); +} + +//***************************************************************************** +// +// Determines whether a given character is a valid hexadecimal digit. +// +// \param cDigit is the ASCII character code to be checked for validity. +// +// This function checks the passed character to determime whether or not it is +// a valid hexadecimal digit. +// +// \return Returns \e true if the passed character is a valid hex digit or \e +// false otherwise +// +//***************************************************************************** +bool +IsValidHexDigit(const char cDigit) +{ + if(((cDigit >= '0') && (cDigit <= '9')) || + ((cDigit >= 'a') && (cDigit <= 'f')) || + ((cDigit >= 'A') && (cDigit <= 'F'))) + { + return(true); + } + else + { + return(false); + } +} + +//***************************************************************************** +// +// Converts an ASCII character to a hex digit value. +// +// \param cDigit is the ASCII character code to convert to a number. +// +// This function converts a passed ASCII character to a number assuming that +// the character is a valid hexadecimal digit. If the character is not a valid +// hex digit, the value 0xFF is returned. +// +// \return Returns the number represented by hex digit \e cDigit or 0xFF if +// the character passed is not valid hex. +// +//***************************************************************************** +uint8_t +HexDigit(const char cDigit) +{ + if((cDigit >= '0') && (cDigit <= '9')) + { + return(cDigit - '0'); + } + else + { + if((cDigit >= 'a') && (cDigit <= 'f')) + { + return((cDigit - 'a') + 10); + } + else + { + if((cDigit >= 'A') && (cDigit <= 'F')) + { + return((cDigit - 'A') + 10); + } + } + } + + // + // If we get here, we were passed an invalid hex digit so return 0xFF. + // + return(0xFF); +} + +//***************************************************************************** +// +// Decodes a single %xx escape sequence as an ASCII character. +// +// \param pcEncoded points to the ``%'' character at the start of a three +// character escape sequence which represents a single ASCII character. +// \param pcDecoded points to a byte which will be written with the decoded +// character assuming the escape sequence is valid. +// +// This function decodes a single escape sequence of the form ``%xy'' where +// x and y represent hexadecimal digits. If each digit is a valid hex digit, +// the function writes the decoded character to the pcDecoded buffer and +// returns true, else it returns false. +// +// \return Returns \b true on success or \b false if pcEncoded does not point +// to a valid escape sequence. +// +//***************************************************************************** +bool +DecodeHexEscape(const char *pcEncoded, char *pcDecoded) +{ + if((pcEncoded[0] != '%') || !IsValidHexDigit(pcEncoded[1]) || + !IsValidHexDigit(pcEncoded[2])) + { + return(false); + } + else + { + *pcDecoded = ((HexDigit(pcEncoded[1]) * 16) + + HexDigit(pcEncoded[2])); + return(true); + } +} + +//***************************************************************************** +// +// Encodes a string for use within an HTML tag, escaping non alphanumeric +// characters. +// +// \param pcDecoded is a pointer to a null terminated ASCII string. +// \param pcEncoded is a pointer to a storage for the encoded string. +// \param ui32Len is the number of bytes of storage pointed to by pcEncoded. +// +// This function encodes a string, adding escapes in place of any special, +// non-alphanumeric characters. If the encoded string is too long for the +// provided output buffer, the output will be truncated. +// +// \return Returns the number of characters written to the output buffer +// not including the terminating NULL. +// +//***************************************************************************** +uint32_t +EncodeFormString(const char *pcDecoded, char *pcEncoded, uint32_t ui32Len) +{ + uint32_t ui32Loop; + uint32_t ui32Count; + + // + // Make sure we were not passed a tiny buffer. + // + if(ui32Len <= 1) + { + return(0); + } + + // + // Initialize our output character counter. + // + ui32Count = 0; + + // + // Step through each character of the input until we run out of data or + // space to put our output in. + // + for(ui32Loop = 0; pcDecoded[ui32Loop] && (ui32Count < (ui32Len - 1)); + ui32Loop++) + { + switch(pcDecoded[ui32Loop]) + { + // + // Pass most characters without modification. + // + default: + { + pcEncoded[ui32Count++] = pcDecoded[ui32Loop]; + break; + } + + case '\'': + { + ui32Count += usnprintf(&pcEncoded[ui32Count], + (ui32Len - ui32Count), "'"); + break; + } + } + } + + return(ui32Count); +} + +//***************************************************************************** +// +// Decodes a string encoded as part of an HTTP URI. +// +// \param pcEncoded is a pointer to a null terminated string encoded as per +// RFC1738, section 2.2. +// \param pcDecoded is a pointer to storage for the decoded, null terminated +// string. +// \param ui32Len is the number of bytes of storage pointed to by pcDecoded. +// +// This function decodes a string which has been encoded using the method +// described in RFC1738, section 2.2 for URLs. If the decoded string is too +// long for the provided output buffer, the output will be truncated. +// +// \return Returns the number of character written to the output buffer, not +// including the terminating NULL. +// +//***************************************************************************** +uint32_t +DecodeFormString(const char *pcEncoded, char *pcDecoded, uint32_t ui32Len) +{ + uint32_t ui32Loop; + uint32_t ui32Count; + bool bValid; + + ui32Count = 0; + ui32Loop = 0; + + // + // Keep going until we run out of input or fill the output buffer. + // + while(pcEncoded[ui32Loop] && (ui32Count < (ui32Len - 1))) + { + switch(pcEncoded[ui32Loop]) + { + // + // '+' in the encoded data is decoded as a space. + // + case '+': + { + pcDecoded[ui32Count++] = ' '; + ui32Loop++; + break; + } + + // + // '%' in the encoded data indicates that the following 2 + // characters indicate the hex ASCII code of the decoded character. + // + case '%': + { + if(pcEncoded[ui32Loop + 1] && pcEncoded[ui32Loop + 2]) + { + // + // Decode the escape sequence. + // + bValid = DecodeHexEscape(&pcEncoded[ui32Loop], + &pcDecoded[ui32Count]); + + // + // If the escape sequence was valid, move to the next + // output character. + // + if(bValid) + { + ui32Count++; + } + + // + // Skip past the escape sequence in the encoded string. + // + ui32Loop += 3; + } + else + { + // + // We reached the end of the string partway through an + // escape sequence so just ignore it and return the number + // of decoded characters found so far. + // + pcDecoded[ui32Count] = '\0'; + return(ui32Count); + } + break; + } + + // + // For all other characters, just copy the input to the output. + // + default: + { + pcDecoded[ui32Count++] = pcEncoded[ui32Loop++]; + break; + } + } + } + + // + // Terminate the string and return the number of characters we decoded. + // + pcDecoded[ui32Count] = '\0'; + return(ui32Count); +} + +//***************************************************************************** +// +// Ensures that a string passed represents a valid decimal number and, +// if so, converts that number to a long. +// +// \param pcValue points to a null terminated string which should contain an +// ASCII representation of a decimal number. +// \param pi32Value points to storage which will receive the number represented +// by pcValue assuming the string is a valid decimal number. +// +// This function determines whether or not a given string represents a valid +// decimal number and, if it does, converts the string into a decimal number +// which is returned to the caller. +// +// \return Returns \b true if the string is a valid representation of a +// decimal number or \b false if not. + +//***************************************************************************** +bool +CheckDecimalParam(const char *pcValue, int32_t *pi32Value) +{ + uint32_t ui32Loop; + bool bStarted; + bool bFinished; + bool bNeg; + int32_t l32Accum; + + // + // Check that the string is a valid decimal number. + // + bStarted = false; + bFinished = false; + bNeg = false; + ui32Loop = 0; + l32Accum = 0; + + while(pcValue[ui32Loop]) + { + // + // Ignore whitespace before the string. + // + if(!bStarted) + { + if((pcValue[ui32Loop] == ' ') || (pcValue[ui32Loop] == '\t')) + { + ui32Loop++; + continue; + } + + // + // Ignore a + or - character as long as we have not started. + // + if((pcValue[ui32Loop] == '+') || (pcValue[ui32Loop] == '-')) + { + // + // If the string starts with a '-', remember to negate the + // result. + // + bNeg = (pcValue[ui32Loop] == '-') ? true : false; + bStarted = true; + ui32Loop++; + } + else + { + // + // We found something other than whitespace or a sign character + // so we start looking for numerals now. + // + bStarted = true; + } + } + + if(bStarted) + { + if(!bFinished) + { + // + // We expect to see nothing other than valid digit characters + // here. + // + if((pcValue[ui32Loop] >= '0') && (pcValue[ui32Loop] <= '9')) + { + l32Accum = (l32Accum * 10) + (pcValue[ui32Loop] - '0'); + } + else + { + // + // Have we hit whitespace? If so, check for no more + // characters until the end of the string. + // + if((pcValue[ui32Loop] == ' ') || + (pcValue[ui32Loop] == '\t')) + { + bFinished = true; + } + else + { + // + // We got something other than a digit or whitespace so + // this makes the string invalid as a decimal number. + // + return(false); + } + } + } + else + { + // + // We are scanning for whitespace until the end of the string. + // + if((pcValue[ui32Loop] != ' ') && (pcValue[ui32Loop] != '\t')) + { + // + // We found something other than whitespace so the string + // is not valid. + // + return(false); + } + } + + // + // Move on to the next character in the string. + // + ui32Loop++; + } + } + + // + // If we drop out of the loop, the string must be valid. All we need to do + // now is negate the accumulated value if the string started with a '-'. + // + *pi32Value = bNeg ? -l32Accum : l32Accum; + return(true); +} + +//***************************************************************************** +// +// Searches the list of parameters passed to a CGI handler for a parameter +// with the given name and, if found, reads the parameter value as a decimal +// number. +// +// \param pcName is a pointer to a string containing the name of the +// parameter that is to be found. +// \param pcParam is an array of character pointers, each containing the name +// of a single parameter as encoded in the URI requesting the CGI. +// \param i32NumParams is the number of elements in the pcParam array. +// \param pcValues is an array of values associated with each parameter from +// the pcParam array. +// \param pbError is a pointer that will be written to \b true if there is any +// error during the parameter parsing process (parameter not found, value is +// not a valid decimal number). +// +// This function searches an array of parameters to find the string passed in +// \e pcName. If the string is found, the corresponding parameter value is +// read from array pcValues and checked to make sure that it is a valid +// decimal number. If so, the number is returned. If any error is detected, +// parameter \e pbError is written to \b true. Note that \e pbError is NOT +// written if the parameter is successfully found and validated. This is to +// allow multiple parameters to be parsed without the caller needing to check +// return codes after each individual call. +// +// \return Returns the value of the parameter or 0 if an error is detected (in +// which case \e *pbError will be \b true). +// +//***************************************************************************** +int32_t +GetCGIParam(const char *pcName, char *pcParams[], char *pcValue[], + int32_t i32NumParams, bool *pbError) +{ + int32_t i32Param; + int32_t i32Value; + bool bRetcode; + + // + // Is the parameter we are looking for in the list? + // + i32Param = FindCGIParameter(pcName, pcParams, i32NumParams); + if(i32Param != -1) + { + // + // We found the parameter so now get its value. + // + bRetcode = CheckDecimalParam(pcValue[i32Param], &i32Value); + if(bRetcode) + { + // + // All is well - return the parameter value. + // + return(i32Value); + } + } + + // + // If we reach here, there was a problem so return 0 and set the error + // flag. + // + *pbError = true; + return(0); +} + diff --git a/boards/dk-tm4c129x/freertos_demo/cgifuncs.h b/boards/dk-tm4c129x/freertos_demo/cgifuncs.h new file mode 100644 index 0000000..32dfbf9 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/cgifuncs.h @@ -0,0 +1,46 @@ +//***************************************************************************** +// +// cgifuncs.c - Helper functions related to CGI script parameter parsing. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __CGIFUNCS_H__ +#define __CGIFUNCS_H__ + +//***************************************************************************** +// +// Prototypes of functions exported by this module. +// +//***************************************************************************** +int32_t FindCGIParameter(const char *pcToFind, char *pcParam[], + int32_t i32NumParams); +bool IsValidHexDigit(const char cDigit); +uint8_t HexDigit(const char cDigit); +bool DecodeHexEscape(const char *pcEncoded, char *pcDecoded); +uint32_t EncodeFormString(const char *pcDecoded, char *pcEncoded, + uint32_t ui32Len); +uint32_t DecodeFormString(const char *pcEncoded, char *pcDecoded, + uint32_t ui32Len); +bool CheckDecimalParam(const char *pcValue, int32_t *pi32Value); +int32_t GetCGIParam(const char *pcName, char *pcParams[], char *pcValue[], + int32_t i32NumParams, bool *pbError); + +#endif // __CGIFUNCS_H__ diff --git a/boards/dk-tm4c129x/freertos_demo/display_task.c b/boards/dk-tm4c129x/freertos_demo/display_task.c new file mode 100644 index 0000000..f2199ba --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/display_task.c @@ -0,0 +1,329 @@ +//***************************************************************************** +// +// display_task.c - Task to display text and images on the LCD. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "display_task.h" +#include "idle_task.h" +#include "priorities.h" +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" +//***************************************************************************** +// +// This structure defines the messages that are sent to the display task. +// +//***************************************************************************** +typedef struct +{ + uint32_t ui32Type; + uint16_t ui16X; + uint16_t ui16Y; + const char *pcMessage; +} + +tDisplayMessage; +xTaskHandle g_sDisplayTask; // FIXME +//***************************************************************************** +// +// The stack size for the display task. +// +//***************************************************************************** +#define STACKSIZE_DISPLAYTASK 128 + +//***************************************************************************** +// +// Defines to indicate the contents of the display message. +// +//***************************************************************************** +#define DISPLAY_IMAGE 1 +#define DISPLAY_STRING 2 +#define DISPLAY_MOVE 3 +#define DISPLAY_DRAW 4 + +//***************************************************************************** +// +// The item size, queue size, and memory size for the display message queue. +// +//***************************************************************************** +#define DISPLAY_ITEM_SIZE sizeof(tDisplayMessage) +#define DISPLAY_QUEUE_SIZE 10 + +//***************************************************************************** +// +// The queue that holds messages sent to the display task. +// +//***************************************************************************** +static xQueueHandle g_pDisplayQueue; + +//***************************************************************************** +// +// The most recent position of the display pen. +// +//***************************************************************************** +static uint32_t g_ui32DisplayX, g_ui32DisplayY; + +//***************************************************************************** +// +// This task receives messages from the other tasks and updates the display as +// directed. +// +//***************************************************************************** +static void +DisplayTask(void *pvParameters) +{ + tDisplayMessage sMessage; + tContext sContext; + + // + // Initialize the graphics library context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + GrContextForegroundSet(&sContext, ClrWhite); + GrContextBackgroundSet(&sContext, ClrBlack); + GrContextFontSet(&sContext, g_psFontFixed6x8); + + // + // Loop forever. + // + while(1) + { + // + // Read the next message from the queue. + // + if(xQueueReceive(g_pDisplayQueue, &sMessage, portMAX_DELAY) == pdPASS) + { + // + // Determine the message type. + // + switch(sMessage.ui32Type) + { + // + // The drawing of an image has been requested. + // + case DISPLAY_IMAGE: + { + // + // Draw this image on the display. + // + GrImageDraw(&sContext, (uint8_t *)sMessage.pcMessage, + sMessage.ui16X, sMessage.ui16Y); + + // + // This message has been handled. + // + break; + } + + // + // The drawing of a string has been requested. + // + case DISPLAY_STRING: + { + // + // Draw this string on the display. + // + GrStringDraw(&sContext, sMessage.pcMessage, -1, + sMessage.ui16X, sMessage.ui16Y, 1); + + // + // This message has been handled. + // + break; + } + + // + // A move of the pen has been requested. + // + case DISPLAY_MOVE: + { + // + // Save the new pen position. + // + g_ui32DisplayX = sMessage.ui16X; + g_ui32DisplayY = sMessage.ui16Y; + + // + // This message has been handled. + // + break; + } + + // + // A draw with the pen has been requested. + // + case DISPLAY_DRAW: + { + // + // Draw a line from the previous pen position to the new + // pen position. + // + GrLineDraw(&sContext, g_ui32DisplayX, g_ui32DisplayY, + sMessage.ui16X, sMessage.ui16Y); + + // + // Save the new pen position. + // + g_ui32DisplayX = sMessage.ui16X; + g_ui32DisplayY = sMessage.ui16Y; + + // + // This message has been handled. + // + break; + } + } + } + } +} + +//***************************************************************************** +// +// Sends a request to the display task to draw an image on the display. +// +//***************************************************************************** +void +DisplayImage(uint32_t ui16X, uint32_t ui16Y, const uint8_t *pui8Image) +{ + tDisplayMessage sMessage; + + // + // Construct the message to be sent. + // + sMessage.ui32Type = DISPLAY_IMAGE; + sMessage.ui16X = ui16X; + sMessage.ui16Y = ui16Y; + sMessage.pcMessage = (char *)pui8Image; + + // + // Send the image draw request to the display task. + // + xQueueSend(g_pDisplayQueue, &sMessage, portMAX_DELAY); +} + +//***************************************************************************** +// +// Sends a request to the display task to draw a string on the display. +// +//***************************************************************************** +void +DisplayString(uint32_t ui16X, uint32_t ui16Y, const char *pcString) +{ + tDisplayMessage sMessage; + + // + // Construct the message to be sent. + // + sMessage.ui32Type = DISPLAY_STRING; + sMessage.ui16X = ui16X; + sMessage.ui16Y = ui16Y; + sMessage.pcMessage = pcString; + + // + // Send the string draw request to the display task. + // + xQueueSend(g_pDisplayQueue, &sMessage, portMAX_DELAY); +} + +//***************************************************************************** +// +// Sends a request to the display task to move the pen. +// +//***************************************************************************** +void +DisplayMove(uint32_t ui16X, uint32_t ui16Y) +{ + tDisplayMessage sMessage; + + // + // Construct the message to be sent. + // + sMessage.ui32Type = DISPLAY_MOVE; + sMessage.ui16X = ui16X; + sMessage.ui16Y = ui16Y; + + // + // Send the pen move request to the display task. + // + xQueueSend(g_pDisplayQueue, &sMessage, portMAX_DELAY); +} + +//***************************************************************************** +// +// Sends a request to the display task to draw with the pen. +// +//***************************************************************************** +void +DisplayDraw(uint32_t ui16X, uint32_t ui16Y) +{ + tDisplayMessage sMessage; + + // + // Construct the message to be sent. + // + sMessage.ui32Type = DISPLAY_DRAW; + sMessage.ui16X = ui16X; + sMessage.ui16Y = ui16Y; + + // + // Send the pen draw request to the display task. + // + xQueueSend(g_pDisplayQueue, &sMessage, portMAX_DELAY); +} + +//***************************************************************************** +// +// Initializes the display task. +// +//***************************************************************************** +uint32_t +DisplayTaskInit(void) +{ + // + // Create a queue for sending messages to the display task. + // + g_pDisplayQueue = xQueueCreate(DISPLAY_QUEUE_SIZE, DISPLAY_ITEM_SIZE); + if(g_pDisplayQueue == NULL) + { + return(1); + } + + // + // Create the display task. + // + if(xTaskCreate(DisplayTask, (signed portCHAR *)"Display", + STACKSIZE_DISPLAYTASK, NULL, + tskIDLE_PRIORITY + PRIORITY_DISPLAY_TASK, &g_sDisplayTask) != pdTRUE) + { // FIXME + return(1); + } + + // + // Success. + // + return(0); +} diff --git a/boards/dk-tm4c129x/freertos_demo/display_task.h b/boards/dk-tm4c129x/freertos_demo/display_task.h new file mode 100644 index 0000000..29be2db --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/display_task.h @@ -0,0 +1,41 @@ +//***************************************************************************** +// +// display_task.h - Prototypes for the display task. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __DISPLAY_TASK_H__ +#define __DISPLAY_TASK_H__ + +//***************************************************************************** +// +// Prototypes for the display task. +// +//***************************************************************************** +extern void DisplayImage(uint32_t ui16X, uint32_t ui16Y, + const uint8_t *pui8Image); +extern void DisplayString(uint32_t ui16X, uint32_t ui16Y, + const char *pcString); +extern void DisplayMove(uint32_t ui16X, uint32_t ui16Y); +extern void DisplayDraw(uint32_t ui16X, uint32_t ui16Y); +extern uint32_t DisplayTaskInit(void); + +#endif // __DISPLAY_TASK_H__ diff --git a/boards/dk-tm4c129x/freertos_demo/ewarm/Exe/freertos_demo.bin b/boards/dk-tm4c129x/freertos_demo/ewarm/Exe/freertos_demo.bin new file mode 100644 index 0000000..3890a67 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/ewarm/Exe/freertos_demo.bin differ diff --git a/boards/dk-tm4c129x/freertos_demo/ewarm/Exe/freertos_demo.out b/boards/dk-tm4c129x/freertos_demo/ewarm/Exe/freertos_demo.out new file mode 100644 index 0000000..41bbb25 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/ewarm/Exe/freertos_demo.out differ diff --git a/boards/dk-tm4c129x/freertos_demo/freertos_demo.c b/boards/dk-tm4c129x/freertos_demo/freertos_demo.c new file mode 100644 index 0000000..f54ebcf --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/freertos_demo.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// freertos_demo.c - Simple FreeRTOS example. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" +#include "display_task.h" +#include "idle_task.h" +#include "led_task.h" +#include "lwip_task.h" +#include "spider_task.h" + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      FreeRTOS Example (freertos_demo)

      +//! +//! This application utilizes FreeRTOS to perform a variety of tasks in a +//! concurrent fashion. The following tasks are created: +//! +//! * An lwIP task, which serves up web pages via the Ethernet interface. This +//! is actually two tasks, one which runs the lwIP stack and one which +//! manages the Ethernet interface (sending and receiving raw packets). +//! +//! * An LED task, which simply blinks the on-board LED at a user-controllable +//! rate (changed via the web interface). +//! +//! * A set of spider tasks, each of which controls a spider that crawls around +//! the LCD. The speed at which the spiders move is controllable via the web +//! interface. Up to thirty-two spider tasks can be run concurrently (an +//! application-imposed limit). +//! +//! * A spider control task, which manages presses on the touch screen and +//! determines if a spider task should be terminated (if the spider is +//! ``squished'') or if a new spider task should be created (if no spider is +//! ``squished''). +//! +//! * There is an automatically created idle task, which monitors changes in +//! the board's IP address and sends those changes to the user via a UART +//! message. +//! +//! Across the bottom of the LCD, several status items are displayed: the +//! amount of time the application has been running, the number of tasks that +//! are running, the IP address of the board, the number of Ethernet packets +//! that have been transmitted, and the number of Ethernet packets that have +//! been received. +//! +//! The finder application (in tools/finder) can also be used to discover the +//! IP address of the board. The finder application will search the network +//! for all boards that respond to its requests and display information about +//! them. +//! +//! The web site served by lwIP includes the ability to adjust the toggle rate +//! of the LED task and the update speed of the spiders (all spiders move at +//! the same speed). +//! +//! For additional details on FreeRTOS, refer to the FreeRTOS web page at: +//! http://www.freertos.org/ +//! +//! For additional details on lwIP, refer to the lwIP web page at: +//! http://savannah.nongnu.org/projects/lwip/ +// +//***************************************************************************** + +//***************************************************************************** +// +// System clock rate in Hz. +// +//***************************************************************************** +uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This hook is called by FreeRTOS when an stack overflow error is detected. +// +//***************************************************************************** +void +vApplicationStackOverflowHook(xTaskHandle *pxTask, signed char *pcTaskName) +{ + tContext sContext; + + // + // A fatal FreeRTOS error was detected, so display an error message. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + GrContextForegroundSet(&sContext, ClrRed); + GrContextBackgroundSet(&sContext, ClrBlack); + GrContextFontSet(&sContext, g_psFontCm20); + GrStringDrawCentered(&sContext, "Fatal FreeRTOS error!", -1, + GrContextDpyWidthGet(&sContext) / 2, + (((GrContextDpyHeightGet(&sContext) - 24) / 2) + + 24), 1); + + // + // This function can not return, so loop forever. Interrupts are disabled + // on entry to this function, so no processor interrupts will interrupt + // this loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// Initialize FreeRTOS and start the initial set of tasks. +// +//***************************************************************************** +int +main(void) +{ + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | + SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), + configCPU_CLOCK_HZ); + + // + // Initialize the device pinout appropriately for this board. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "freertos-demo"); + + // + // Make sure the main oscillator is enabled because this is required by + // the PHY. The system must have a 25MHz crystal attached to the OSC + // pins. The SYSCTL_MOSC_HIGHFREQ parameter is used when the crystal + // frequency is 10MHz or higher. + // + SysCtlMOSCConfigSet(SYSCTL_MOSC_HIGHFREQ); + + // + // Create the display task. + // + if(DisplayTaskInit() != 0) + { + GrContextForegroundSet(&sContext, ClrRed); + GrStringDrawCentered(&sContext, "Failed to create display task!", -1, + GrContextDpyWidthGet(&sContext) / 2, + (((GrContextDpyHeightGet(&sContext) - 24) / 2) + + 24), 0); + while(1) + { + } + } + + // + // Create the spider task. + // + if(SpiderTaskInit() != 0) + { + GrContextForegroundSet(&sContext, ClrRed); + GrStringDrawCentered(&sContext, "Failed to create spider task!", -1, + GrContextDpyWidthGet(&sContext) / 2, + (((GrContextDpyHeightGet(&sContext) - 24) / 2) + + 24), 0); + while(1) + { + } + } + + // + // Create the LED task. + // + if(LEDTaskInit() != 0) + { + GrContextForegroundSet(&sContext, ClrRed); + GrStringDrawCentered(&sContext, "Failed to create LED task!", -1, + GrContextDpyWidthGet(&sContext) / 2, + (((GrContextDpyHeightGet(&sContext) - 24) / 2) + + 24), 0); + while(1) + { + } + } + + // + // Create the lwIP tasks. + // + if(lwIPTaskInit() != 0) + { + GrContextForegroundSet(&sContext, ClrRed); + GrStringDrawCentered(&sContext, "Failed to create lwIP tasks!", -1, + GrContextDpyWidthGet(&sContext) / 2, + (((GrContextDpyHeightGet(&sContext) - 24) / 2) + + 24), 0); + while(1) + { + } + } + + // + // Start the scheduler. This should not return. + // + vTaskStartScheduler(); + + // + // In case the scheduler returns for some reason, print an error and loop + // forever. + // + GrContextForegroundSet(&sContext, ClrRed); + GrStringDrawCentered(&sContext, "Failed to start scheduler!", -1, + GrContextDpyWidthGet(&sContext) / 2, + (((GrContextDpyHeightGet(&sContext) - 24) / 2) + 24), + 0); + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/freertos_demo/freertos_demo.ewd b/boards/dk-tm4c129x/freertos_demo/freertos_demo.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/freertos_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/freertos_demo/freertos_demo.ewp b/boards/dk-tm4c129x/freertos_demo/freertos_demo.ewp new file mode 100644 index 0000000..34a4eff --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/freertos_demo.ewp @@ -0,0 +1,883 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\cgifuncs.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\croutine.c + + + $PROJ_DIR$\display_task.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\freertos_demo.c + + + $PROJ_DIR$\fs.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\portable\MemMang\heap_2.c + + + $PROJ_DIR$\..\..\..\..\third_party\lwip-1.4.1\apps\httpserver_raw\httpd.c + + + $PROJ_DIR$\idle_task.c + + + $PROJ_DIR$\images.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\led_task.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\list.c + + + $PROJ_DIR$\..\..\..\..\utils\locator.c + + + $PROJ_DIR$\lwip_task.c + + + $PROJ_DIR$\..\..\..\..\utils\lwiplib.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\portable\IAR\ARM_CM4F\port.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\portable\IAR\ARM_CM4F\portasm.S + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\queue.c + + + $PROJ_DIR$\random.c + + + $PROJ_DIR$\spider_task.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\tasks.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\timers.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/freertos_demo/freertos_demo.h b/boards/dk-tm4c129x/freertos_demo/freertos_demo.h new file mode 100644 index 0000000..60d162f --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/freertos_demo.h @@ -0,0 +1,35 @@ +//***************************************************************************** +// +// freertos_demo.h - Prototypes for the freertos_demo. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __FREERTOS_DEMO_H__ +#define __FREERTOS_DEMO_H__ + +//***************************************************************************** +// +// System clock rate in Hz. +// +//***************************************************************************** +extern uint32_t g_ui32SysClock; + +#endif // __FREERTOS_DEMO_H__ diff --git a/boards/dk-tm4c129x/freertos_demo/freertos_demo.icf b/boards/dk-tm4c129x/freertos_demo/freertos_demo.icf new file mode 100644 index 0000000..612e7da --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/freertos_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// freertos_demo.icf - Linker configuration file for freertos_demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/freertos_demo/freertos_demo.ld b/boards/dk-tm4c129x/freertos_demo/freertos_demo.ld new file mode 100644 index 0000000..ea56396 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/freertos_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * freertos_demo.ld - Linker configuration file for freertos_demo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/freertos_demo/freertos_demo.sct b/boards/dk-tm4c129x/freertos_demo/freertos_demo.sct new file mode 100644 index 0000000..cb334f3 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/freertos_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; freertos_demo.sct - Linker configuration file for freertos_demo. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/freertos_demo/freertos_demo.uvopt b/boards/dk-tm4c129x/freertos_demo/freertos_demo.uvopt new file mode 100644 index 0000000..239b69c --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/freertos_demo.uvopt @@ -0,0 +1,639 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + freertos_demo + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\cgifuncs.c + cgifuncs.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\croutine.c + croutine.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\display_task.c + display_task.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\freertos_demo.c + freertos_demo.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\fs.c + fs.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\portable\MemMang\heap_2.c + heap_2.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\lwip-1.4.1\apps\httpserver_raw\httpd.c + httpd.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\idle_task.c + idle_task.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\images.c + images.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\led_task.c + led_task.c + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\list.c + list.c + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\locator.c + locator.c + + + 1 + 15 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\lwip_task.c + lwip_task.c + + + 1 + 16 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\lwiplib.c + lwiplib.c + + + 1 + 17 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 18 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c + port.c + + + 1 + 19 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\queue.c + queue.c + + + 1 + 20 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\random.c + random.c + + + 1 + 21 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\spider_task.c + spider_task.c + + + 1 + 22 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 23 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\tasks.c + tasks.c + + + 1 + 24 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\timers.c + timers.c + + + 1 + 25 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 26 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 27 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 28 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 29 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/freertos_demo/freertos_demo.uvproj b/boards/dk-tm4c129x/freertos_demo/freertos_demo.uvproj new file mode 100644 index 0000000..f77f89f --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/freertos_demo.uvproj @@ -0,0 +1,549 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + freertos_demo + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + freertos_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\freertos_demo.bin .\rvmdk\freertos_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 SNOWFLAKE + + .;..;..\..\..\..;..\..\..\..\third_party\FreeRTOS\Source\portable\RVDS\ARM_CM4F;..\..\..\..\third_party\FreeRTOS;..\..\..\..\third_party\lwip-1.4.1\apps;..\..\..\..\third_party\FreeRTOS\Source\include;..\..\..\..\third_party\lwip-1.4.1\ports\tiva-tm4c129\include;..\..\..\..\third_party\lwip-1.4.1\src\include;..\..\..\..\third_party\lwip-1.4.1\src\include\ipv4;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + freertos_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cgifuncs.c + 1 + .\cgifuncs.c + + + croutine.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\croutine.c + + + display_task.c + 1 + .\display_task.c + + + frame.c + 1 + ..\drivers\frame.c + + + freertos_demo.c + 1 + .\freertos_demo.c + + + fs.c + 1 + .\fs.c + + + heap_2.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\portable\MemMang\heap_2.c + + + httpd.c + 1 + ..\..\..\..\third_party\lwip-1.4.1\apps\httpserver_raw\httpd.c + + + idle_task.c + 1 + .\idle_task.c + + + images.c + 1 + .\images.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + led_task.c + 1 + .\led_task.c + + + list.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\list.c + + + locator.c + 1 + ..\..\..\..\utils\locator.c + + + lwip_task.c + 1 + .\lwip_task.c + + + lwiplib.c + 1 + ..\..\..\..\utils\lwiplib.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + port.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c + + + queue.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\queue.c + + + random.c + 1 + .\random.c + + + spider_task.c + 1 + .\spider_task.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + tasks.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\tasks.c + + + timers.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\timers.c + + + touch.c + 1 + ..\drivers\touch.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/freertos_demo/freertos_demo_ccs.cmd b/boards/dk-tm4c129x/freertos_demo/freertos_demo_ccs.cmd new file mode 100644 index 0000000..14864ba --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/freertos_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * freertos_demo_ccs.cmd - CCS linker configuration file for freertos_demo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 4096; diff --git a/boards/dk-tm4c129x/freertos_demo/fs.c b/boards/dk-tm4c129x/freertos_demo/fs.c new file mode 100644 index 0000000..78a86c1 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/fs.c @@ -0,0 +1,236 @@ +//***************************************************************************** +// +// fs.c - File System Processing for lwIP Web Server Apps. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "utils/lwiplib.h" +#include "httpserver_raw/httpd.h" +#include "httpserver_raw/fs.h" +#include "httpserver_raw/fsdata.h" + +//***************************************************************************** +// +// Include the file system data for this application. This file is generated +// by the makefsfile utility, using the following command: +// +// makefsfile -i fs -o htmldata.h -r -h +// +// If any changes are made to the static content of the web pages served by the +// application, this command must be used to regenerate lmi-fsdata.h in order +// for those changes to be picked up by the web server. +// +//***************************************************************************** +#include "htmldata.h" + +//***************************************************************************** +// +// Initialize the file system. +// +//***************************************************************************** +void +fs_init(void) +{ + // + // Nothing special to do for this application. Flash File System only. + // +} + +//***************************************************************************** +// +// File System tick handler. +// +//***************************************************************************** +void +fs_tick(uint32_t ui32TickMS) +{ + // + // Nothing special to do for this application. Flash File System only. + // +} + +//***************************************************************************** +// +// Open a file and return a handle to the file, if found. Otherwise, +// return NULL. +// +//***************************************************************************** +struct fs_file * +fs_open(const char *name) +{ + const struct fsdata_file *psTree; + struct fs_file *psFile = NULL; + + // + // Allocate memory for the file system structure. + // + psFile = mem_malloc(sizeof(struct fs_file)); + if(NULL == psFile) + { + return(NULL); + } + + // + // Initialize the file system tree pointer to the root of the linked list. + // + psTree = FS_ROOT; + + // + // Begin processing the linked list, looking for the requested file name. + // + while(NULL != psTree) + { + // + // Compare the requested file "name" to the file name in the + // current node. + // + if(strncmp(name, (char *)psTree->name, psTree->len) == 0) + { + // + // Fill in the data pointer and length values from the + // linked list node. + // + psFile->data = (char *)psTree->data; + psFile->len = psTree->len; + + // + // For now, we setup the read index to the end of the file, + // indicating that all data has been read. + // + psFile->index = psTree->len; + + // + // We are not using any file system extensions in this + // application, so set the pointer to NULL. + // + psFile->pextension = NULL; + + // + // Exit the loop and return the file system pointer. + // + break; + } + + // + // If we get here, we did not find the file at this node of the linked + // list. Get the next element in the list. + // + psTree = psTree->next; + } + + // + // If we didn't find the file, ptTee will be NULL. Make sure we + // return a NULL pointer if this happens. + // + if(NULL == psTree) + { + mem_free(psFile); + psFile = NULL; + } + + // + // Return the file system pointer. + // + return(psFile); +} + +//***************************************************************************** +// +// Close an opened file designated by the handle. +// +//***************************************************************************** +void +fs_close(struct fs_file *file) +{ + // + // If a Fat file was opened, free its object. + // + if(file->pextension) + { + mem_free(file->pextension); + } + + // + // Free the main file system object. + // + mem_free(file); +} + +//***************************************************************************** +// +// Read the next chunck of data from the file. Return the count of data +// that was read. Return 0 if no data is currently available. Return +// a -1 if at the end of file. +// +//***************************************************************************** +int +fs_read(struct fs_file *file, char *buffer, int count) +{ + int iAvailable; + + // + // Check to see if more data is available. + // + if(file->len == file->index) + { + // + // There is no remaining data. Return a -1 for EOF indication. + // + return(-1); + } + + // + // Determine how much data we can copy. The minimum of the 'count' + // parameter or the available data in the file system buffer. + // + iAvailable = file->len - file->index; + if(iAvailable > count) + { + iAvailable = count; + } + + // + // Copy the data. + // + memcpy(buffer, file->data + iAvailable, iAvailable); + file->index += iAvailable; + + // + // Return the count of data that we copied. + // + return(iAvailable); +} + +//***************************************************************************** +// +// Determine the number of bytes left to read from the file. +// +//***************************************************************************** +int fs_bytes_left(struct fs_file *file) +{ + // + // Return the number of bytes left to be read from this file. + // + return(file->len - file->index); +} diff --git a/boards/dk-tm4c129x/freertos_demo/gcc/freertos_demo.axf b/boards/dk-tm4c129x/freertos_demo/gcc/freertos_demo.axf new file mode 100644 index 0000000..96a6023 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/gcc/freertos_demo.axf differ diff --git a/boards/dk-tm4c129x/freertos_demo/gcc/freertos_demo.bin b/boards/dk-tm4c129x/freertos_demo/gcc/freertos_demo.bin new file mode 100644 index 0000000..d7a1ef9 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/gcc/freertos_demo.bin differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/404.htm b/boards/dk-tm4c129x/freertos_demo/html/404.htm new file mode 100644 index 0000000..bb5af32 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/404.htm @@ -0,0 +1,9 @@ + + + +
      +

      404 - file not found

      +

      Try here instead.

      +
      + + diff --git a/boards/dk-tm4c129x/freertos_demo/html/block.htm b/boards/dk-tm4c129x/freertos_demo/html/block.htm new file mode 100644 index 0000000..341751a --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/block.htm @@ -0,0 +1,27 @@ + + + + + +Tiva™ C Series Family Block Diagram + + + + +
      +

      Tiva C Series TM4C129x Family Block Diagram

      +
      +

      + TM4C129X Block Diagram +

      +

      +

      + + + diff --git a/boards/dk-tm4c129x/freertos_demo/html/family.htm b/boards/dk-tm4c129x/freertos_demo/html/family.htm new file mode 100644 index 0000000..bc2dbb4 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/family.htm @@ -0,0 +1,45 @@ + + + + + + +About Tiva™ C Series + + + + +

      About Tiva C Series MCUs

      +
      + +

      +The Tiva C Series ARM® Cortex™-M MCU family is ideal for a variety of applications, with development and evaluation kits available for industrial needs, communications systems, automotive technologies, and more. Rich analog and digital peripherals for connecting and controlling a wide range of systems and devices make the Tiva C Series an excellent choice for many general-purpose applications and designs. +

      +Furthermore, with over 20 years of ARM architecture behind the part definition and design, the Tiva C Series enables robust on-chip integration for greater system functionality at reduced BOM costs. The Tiva C Series are manufactured in a 65-nm process to stretch the performance vector with over 200 MHz and faster clock rates for outstanding high performance. +

      +Learn more about the Tiva C Series at www.ti.com/tiva-c. +

      + + + + + +
      +
      + +
      +
      + + diff --git a/boards/dk-tm4c129x/freertos_demo/html/favicon.ico b/boards/dk-tm4c129x/freertos_demo/html/favicon.ico new file mode 100644 index 0000000..36469ac Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/favicon.ico differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/footer.htm b/boards/dk-tm4c129x/freertos_demo/html/footer.htm new file mode 100644 index 0000000..7c343ff --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/footer.htm @@ -0,0 +1,38 @@ + + + + +Tiva® TM4C129x Development Kit Footer + + + + + + + + +
      +

      Copyright © 2013-2014 Texas Instruments Incorporated. All rights reserved.

      + diff --git a/boards/dk-tm4c129x/freertos_demo/html/freertos.htm b/boards/dk-tm4c129x/freertos_demo/html/freertos.htm new file mode 100644 index 0000000..adef089 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/freertos.htm @@ -0,0 +1,30 @@ + + + + + +About FreeRTOS™ + + + + + + + + + +

      About FreeRTOS™

      +
      + + + + +
      Developed by Real Time Engineers Ltd., FreeRTOS™ is a market leading Real-time Operating System. With support for multiple architectures and a huge user community, FreeRTOS is reliable and reduces the time to market for embedded developers.
      +

      Highlights:

      +
        +
      • Can be used as a general purpose operating system
      • +
      • Integrated hardware/software solution shortens the time to market and significantly reduces cost
      • +
      +

      For support, visit the Tiva™ C Series Microcontrollers page on the TI forums web site. + + diff --git a/boards/dk-tm4c129x/freertos_demo/html/header.htm b/boards/dk-tm4c129x/freertos_demo/html/header.htm new file mode 100644 index 0000000..52ede56 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/header.htm @@ -0,0 +1,51 @@ + + + + +Tiva™ C Series TM4C129X Development Kit Header + + + + + + + + +
      + + +

      Tiva™ C Series TM4C129X Development Kit

      +

      DK-TM4C129X

      +
      + + diff --git a/boards/dk-tm4c129x/freertos_demo/html/images/apps.jpg b/boards/dk-tm4c129x/freertos_demo/html/images/apps.jpg new file mode 100644 index 0000000..aa86c97 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/images/apps.jpg differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-communicate-small.jpg b/boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-communicate-small.jpg new file mode 100644 index 0000000..7e5ae02 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-communicate-small.jpg differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-connect-small.jpg b/boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-connect-small.jpg new file mode 100644 index 0000000..38f450b Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-connect-small.jpg differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-control-small.jpg b/boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-control-small.jpg new file mode 100644 index 0000000..41fd6af Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/images/c-c-c-control-small.jpg differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/images/cortex.jpg b/boards/dk-tm4c129x/freertos_demo/html/images/cortex.jpg new file mode 100644 index 0000000..abd19d1 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/images/cortex.jpg differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/images/freertos.jpg b/boards/dk-tm4c129x/freertos_demo/html/images/freertos.jpg new file mode 100644 index 0000000..1eba80f Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/images/freertos.jpg differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/images/mcu_side-by-side.jpg b/boards/dk-tm4c129x/freertos_demo/html/images/mcu_side-by-side.jpg new file mode 100644 index 0000000..89fa464 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/images/mcu_side-by-side.jpg differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/images/ti.gif b/boards/dk-tm4c129x/freertos_demo/html/images/ti.gif new file mode 100644 index 0000000..1a23a9b Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/images/ti.gif differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/images/ti_logo.gif b/boards/dk-tm4c129x/freertos_demo/html/images/ti_logo.gif new file mode 100644 index 0000000..2e89d74 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/images/ti_logo.gif differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/images/tiva.jpg b/boards/dk-tm4c129x/freertos_demo/html/images/tiva.jpg new file mode 100644 index 0000000..cee9030 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/images/tiva.jpg differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/images/tiva_globe-small.gif b/boards/dk-tm4c129x/freertos_demo/html/images/tiva_globe-small.gif new file mode 100644 index 0000000..6744092 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/html/images/tiva_globe-small.gif differ diff --git a/boards/dk-tm4c129x/freertos_demo/html/index.htm b/boards/dk-tm4c129x/freertos_demo/html/index.htm new file mode 100644 index 0000000..e48cf5c --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/index.htm @@ -0,0 +1,19 @@ + + + + +Tiva™ C Series TM4C129X Development Kit + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/freertos_demo/html/io.ssi b/boards/dk-tm4c129x/freertos_demo/html/io.ssi new file mode 100644 index 0000000..d0c0d32 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/io.ssi @@ -0,0 +1,44 @@ + + + + + +I/O Control + + + +

      I/O Control

      +
      +The controls on this page provide interaction with the FreeRTOS tasks running +on the development board. +
        +
      • LED Toggle Rate +

        +This controls the rate at which the on-board LED toggles. +

        +Current toggle rate: milliseconds. +
        +
        +New toggle rate: + +milliseconds. + +
        +
      • Spider Speed +

        +This controls the rate at which the spiders crawl about the LCD. +

        +Current spider move rate: milliseconds. +
        +
        +New spider move rate: + +milliseconds. + +
        +Note: If there are a large number of spiders alive, it is possible that +decreasing the spider move rate will not make them move any faster (since the +processor is being fully consumed). +
      + + diff --git a/boards/dk-tm4c129x/freertos_demo/html/lwipstat.ssi b/boards/dk-tm4c129x/freertos_demo/html/lwipstat.ssi new file mode 100644 index 0000000..75b37ae --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/lwipstat.ssi @@ -0,0 +1,110 @@ + + + + + + +lwIP Statistics + + + +

      lwIP Statistics

      +
      +Statistics collected by the lwIP stack. The display is automatically updated +every five seconds. +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Packet
      Type
      Packets
      Sent
      Packets
      Received
      Packets
      Dropped
      Checksum
      Errors
      Length
      Errors
      Memory
      Errors
      Routing
      Errors
      Protocol
      Errors
      Options
      Errors
      Other
      Errors
      Link
      ARP
      ICMP
      IP
      TCP
      UDP
      + + diff --git a/boards/dk-tm4c129x/freertos_demo/html/perror.htm b/boards/dk-tm4c129x/freertos_demo/html/perror.htm new file mode 100644 index 0000000..155953c --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/perror.htm @@ -0,0 +1,25 @@ + + + + + +Form Parameter Error + + + +

      I/O Control

      +
      +
      +Parameter Error +

      +Oops - one of the parameters sent to the board was either missing, invalid or +out of range. +

      +Please try again! +

      + + + +
      + + diff --git a/boards/dk-tm4c129x/freertos_demo/html/side.htm b/boards/dk-tm4c129x/freertos_demo/html/side.htm new file mode 100644 index 0000000..46f7d7c --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/side.htm @@ -0,0 +1,33 @@ + + + + +Side + + + +
      + + + diff --git a/boards/dk-tm4c129x/freertos_demo/html/styles.css b/boards/dk-tm4c129x/freertos_demo/html/styles.css new file mode 100644 index 0000000..f85f0df --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/styles.css @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. + */ + +BODY +{ + font-family: Arial; + background-color: white; + margin: 10px; + padding: 0px +} + +BODY.side +{ + font-family: Arial; + background-color: white; + margin: 10px; + padding: 0px +} + +H1 +{ + background-color: white; + color: black; + font-weight: normal; + font-family: Arial; + font-size: 24pt; + text-decoration: none; + text-align: center; + line-height: 50%; +} diff --git a/boards/dk-tm4c129x/freertos_demo/html/ti.htm b/boards/dk-tm4c129x/freertos_demo/html/ti.htm new file mode 100644 index 0000000..8f4ef9e --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/html/ti.htm @@ -0,0 +1,43 @@ + + + + + +About Texas Instruments + + + + + +

      About Texas Instruments

      +
      + +

      Texas Instruments (TI) is +a global analog and digital semiconductor IC design and manufacturing company. In addition to +analog technologies, +digital signal processing (DSP), and +microcontroller (MCU) semiconductors, TI designs and manufactures semiconductor solutions for analog and digital embedded and application-specific processing. +

      +In the microcontroller space, TI offers the broadest range of embedded control products, from the ultra-low-power +MSP430™ MCUs and high-performance +C2000™ real-time controllers, to the 32-bit, general-purpose ARM®-based MCUs of the +Tiva™ C Series line and the +Hercules™ Safety MCUs. +

      +Visit us on the web at www.ti.com. +
      +
      +
      + + + + diff --git a/boards/dk-tm4c129x/freertos_demo/htmldata.h b/boards/dk-tm4c129x/freertos_demo/htmldata.h new file mode 100644 index 0000000..f024f76 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/htmldata.h @@ -0,0 +1,46756 @@ +//*************************************************************************** +// +// File System Image. +// +// This file was automatically generated using the makefsfile utility. +// +//*************************************************************************** + +static const uint8_t data_404_htm[] = +{ + /* /404.htm */ + 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, + 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x62, + 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, + 0x74, 0x65, 0x22, 0x3e, 0x0a, 0x3c, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x0a, 0x3c, 0x68, + 0x31, 0x3e, 0x34, 0x30, 0x34, 0x20, 0x2d, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x2f, + 0x68, 0x31, 0x3e, 0x0a, 0x3c, 0x68, 0x33, 0x3e, + 0x54, 0x72, 0x79, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, + 0x68, 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x61, 0x3e, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, + 0x2e, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0x0a, 0x3c, + 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, + 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0x0a, +}; + +static const uint8_t data_block_htm[] = +{ + /* /block.htm */ + 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x68, + 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, + 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x36, 0x39, + 0x2d, 0x31, 0x22, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, + 0x6e, 0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x2e, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x73, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x20, 0x72, + 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d, 0x22, 0x73, + 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x3e, 0x0a, + 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x54, + 0x69, 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, + 0x65, 0x3b, 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x20, 0x46, 0x61, 0x6d, 0x69, + 0x6c, 0x79, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x44, 0x69, 0x61, 0x67, 0x72, 0x61, 0x6d, + 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x0a, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x3e, + 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x0a, 0x20, 0x20, + 0x2e, 0x64, 0x69, 0x61, 0x67, 0x72, 0x61, 0x6d, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30, 0x25, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x2d, 0x2d, + 0x3e, 0x0a, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x0a, 0x0a, 0x3c, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x68, + 0x31, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, + 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, + 0x3e, 0x54, 0x69, 0x76, 0x61, 0x20, 0x43, 0x20, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, 0x54, + 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, 0x78, 0x20, + 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x44, 0x69, 0x61, + 0x67, 0x72, 0x61, 0x6d, 0x3c, 0x2f, 0x68, 0x31, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x68, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, 0x20, + 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2e, 0x2f, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x74, 0x69, + 0x76, 0x61, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x64, + 0x69, 0x61, 0x67, 0x72, 0x61, 0x6d, 0x22, 0x20, + 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x54, 0x4d, 0x34, + 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x44, 0x69, 0x61, 0x67, + 0x72, 0x61, 0x6d, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x54, 0x69, 0x76, 0x61, + 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, 0x20, + 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x44, + 0x69, 0x61, 0x67, 0x72, 0x61, 0x6d, 0x22, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x70, 0x3e, 0x0a, 0x3c, 0x2f, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x0a, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x0a, + +}; + +static const uint8_t data_connect_htm[] = +{ + /* /connect.htm */ + 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x2e, 0x68, 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, + 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x36, 0x39, + 0x2d, 0x31, 0x22, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, + 0x6e, 0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x2e, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x73, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x20, 0x72, + 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d, 0x22, 0x73, + 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x3e, 0x0a, + 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2c, 0x20, + 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x2c, 0x20, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x3c, 0x2f, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x0a, 0x3c, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, + 0x63, 0x73, 0x73, 0x22, 0x3e, 0x0a, 0x3c, 0x21, + 0x2d, 0x2d, 0x0a, 0x20, 0x20, 0x2e, 0x63, 0x63, + 0x63, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x35, 0x25, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x23, 0x62, 0x6f, 0x6c, 0x64, 0x42, + 0x6c, 0x75, 0x65, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x62, + 0x6c, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, + 0x7a, 0x65, 0x3a, 0x20, 0x32, 0x30, 0x30, 0x25, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x20, 0x62, 0x6f, 0x6c, + 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x23, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x52, + 0x65, 0x64, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x72, 0x65, + 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, + 0x3a, 0x20, 0x31, 0x33, 0x35, 0x25, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, + 0x20, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x22, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x2d, + 0x2d, 0x3e, 0x0a, 0x3c, 0x2f, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x65, + 0x61, 0x64, 0x3e, 0x0a, 0x0a, 0x3c, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x68, 0x31, 0x3e, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2c, + 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x3c, 0x2f, 0x68, + 0x31, 0x3e, 0x0a, 0x3c, 0x68, 0x72, 0x3e, 0x0a, + 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x3c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, + 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, + 0x2e, 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, + 0x2f, 0x63, 0x2d, 0x63, 0x2d, 0x63, 0x2d, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2d, 0x73, + 0x6d, 0x61, 0x6c, 0x6c, 0x2e, 0x6a, 0x70, 0x67, + 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x63, 0x63, 0x63, 0x22, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, 0x66, + 0x74, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x70, 0x61, + 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x6f, + 0x6c, 0x64, 0x42, 0x6c, 0x75, 0x65, 0x22, 0x3e, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x3c, + 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x62, + 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61, 0x72, + 0x67, 0x65, 0x52, 0x65, 0x64, 0x22, 0x3e, 0x55, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, + 0x65, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, + 0x63, 0x63, 0x22, 0x3e, 0x54, 0x68, 0x65, 0x20, + 0x62, 0x72, 0x65, 0x61, 0x64, 0x74, 0x68, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x64, 0x76, 0x61, 0x6e, + 0x63, 0x65, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x70, + 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, + 0x6c, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x73, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, + 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, + 0x75, 0x74, 0x20, 0x73, 0x61, 0x63, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, + 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x6f, + 0x77, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x70, + 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, + 0x6c, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x3a, 0x20, 0x45, 0x74, 0x68, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x20, 0x4d, 0x41, 0x43, + 0x20, 0x26, 0x20, 0x50, 0x48, 0x59, 0x2c, 0x20, + 0x43, 0x41, 0x4e, 0x2c, 0x20, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x50, 0x61, + 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x20, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, + 0x20, 0x28, 0x45, 0x50, 0x49, 0x29, 0x2c, 0x20, + 0x55, 0x53, 0x42, 0x20, 0x4f, 0x6e, 0x2d, 0x54, + 0x68, 0x65, 0x2d, 0x47, 0x6f, 0x2f, 0x48, 0x6f, + 0x73, 0x74, 0x2f, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x20, + 0x53, 0x53, 0x49, 0x2f, 0x53, 0x50, 0x49, 0x2c, + 0x20, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x31, + 0x30, 0x20, 0x49, 0x32, 0x43, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x75, 0x70, 0x20, 0x74, 0x6f, + 0x20, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x55, + 0x41, 0x52, 0x54, 0x53, 0x2e, 0x3c, 0x2f, 0x73, + 0x70, 0x61, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, 0x3c, + 0x62, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6d, + 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2e, + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x63, 0x2d, 0x63, 0x2d, 0x63, 0x2d, 0x63, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x2d, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2e, + 0x6a, 0x70, 0x67, 0x22, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x63, 0x63, 0x63, 0x22, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x62, 0x6f, 0x6c, 0x64, 0x42, 0x6c, + 0x75, 0x65, 0x22, 0x3e, 0x43, 0x6f, 0x6d, 0x6d, + 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x65, 0x3c, + 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x62, + 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61, 0x72, + 0x67, 0x65, 0x52, 0x65, 0x64, 0x22, 0x3e, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, + 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, + 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x63, 0x63, + 0x22, 0x3e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x65, 0x72, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, + 0x67, 0x72, 0x65, 0x61, 0x74, 0x20, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x54, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2c, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, + 0x67, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, + 0x67, 0x68, 0x20, 0x68, 0x75, 0x6d, 0x61, 0x6e, + 0x2d, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, + 0x63, 0x65, 0x73, 0x20, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x75, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x2d, 0x63, + 0x68, 0x69, 0x70, 0x20, 0x68, 0x61, 0x72, 0x64, + 0x77, 0x61, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, + 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x73, 0x75, 0x69, + 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x28, 0x54, + 0x69, 0x76, 0x61, 0x57, 0x61, 0x72, 0x65, 0x26, + 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x73, 0x2c, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x72, 0x65, 0x61, 0x64, 0x79, 0x2d, 0x74, + 0x6f, 0x2d, 0x72, 0x75, 0x6e, 0x20, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, + 0x69, 0x76, 0x61, 0x20, 0x65, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6b, + 0x69, 0x74, 0x73, 0x2e, 0x3c, 0x2f, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x62, + 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x74, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, + 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2e, 0x2f, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x63, + 0x2d, 0x63, 0x2d, 0x63, 0x2d, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, 0x61, + 0x6c, 0x6c, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, + 0x63, 0x63, 0x22, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x62, 0x6f, 0x6c, 0x64, + 0x42, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x3c, 0x2f, 0x73, + 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x62, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x6c, 0x61, 0x72, 0x67, 0x65, + 0x52, 0x65, 0x64, 0x22, 0x3e, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x63, + 0x72, 0x6f, 0x73, 0x73, 0x20, 0x61, 0x20, 0x76, + 0x61, 0x72, 0x69, 0x65, 0x74, 0x79, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, + 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x62, 0x72, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x63, 0x63, 0x63, 0x22, 0x3e, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6e, 0x65, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e, 0x67, 0x2c, + 0x20, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x6e, 0x67, + 0x2c, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, + 0x2c, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, + 0x2e, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x73, + 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x20, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x61, 0x73, + 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x34, 0x30, 0x20, + 0x50, 0x57, 0x4d, 0x20, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x73, 0x2c, 0x20, 0x74, 0x77, 0x6f, + 0x20, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x73, 0x2c, 0x20, 0x74, 0x77, 0x6f, 0x20, + 0x66, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x61, 0x63, + 0x63, 0x75, 0x72, 0x61, 0x74, 0x65, 0x2c, 0x20, + 0x31, 0x32, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x41, + 0x44, 0x43, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x68, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x6e, + 0x2d, 0x63, 0x68, 0x69, 0x70, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x73, 0x2c, 0x20, 0x54, 0x69, 0x76, 0x61, 0x20, + 0x43, 0x20, 0x4d, 0x43, 0x55, 0x73, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x77, 0x6f, + 0x72, 0x6c, 0x64, 0x2e, 0x3c, 0x2f, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x3c, 0x2f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, +}; + +static const uint8_t data_family_htm[] = +{ + /* /family.htm */ + 0x2f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x2e, + 0x68, 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, + 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x50, 0x55, + 0x42, 0x4c, 0x49, 0x43, 0x20, 0x22, 0x2d, 0x2f, + 0x2f, 0x57, 0x33, 0x43, 0x2f, 0x2f, 0x44, 0x54, + 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x34, + 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x2f, 0x2f, 0x45, 0x4e, 0x22, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, + 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x36, 0x39, + 0x2d, 0x31, 0x22, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, + 0x6e, 0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x2e, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x73, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x20, 0x72, + 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d, 0x22, 0x73, + 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x3e, 0x0a, + 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x41, + 0x62, 0x6f, 0x75, 0x74, 0x20, 0x54, 0x69, 0x76, + 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, + 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3e, 0x0a, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, + 0x3e, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x0a, 0x20, + 0x20, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x32, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x2e, 0x61, 0x70, 0x70, + 0x73, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30, + 0x25, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x2e, 0x74, 0x69, 0x76, 0x61, 0x47, 0x6c, + 0x6f, 0x62, 0x65, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x32, + 0x30, 0x25, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, 0x2f, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x0a, 0x3c, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x68, 0x31, + 0x3e, 0x41, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x54, + 0x69, 0x76, 0x61, 0x20, 0x43, 0x20, 0x53, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x20, 0x4d, 0x43, 0x55, + 0x73, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x0a, 0x3c, + 0x68, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, + 0x3d, 0x22, 0x2e, 0x2f, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x73, 0x2f, 0x74, 0x69, 0x76, 0x61, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x65, 0x2d, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x2e, 0x67, 0x69, 0x66, 0x22, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x74, 0x69, 0x76, 0x61, 0x47, 0x6c, 0x6f, 0x62, + 0x65, 0x22, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, + 0x3e, 0x0a, 0x3c, 0x70, 0x3e, 0x0a, 0x54, 0x68, + 0x65, 0x20, 0x54, 0x69, 0x76, 0x61, 0x20, 0x43, + 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, + 0x41, 0x52, 0x4d, 0x26, 0x72, 0x65, 0x67, 0x3b, + 0x20, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x26, + 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, 0x2d, 0x4d, + 0x20, 0x4d, 0x43, 0x55, 0x20, 0x66, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x20, 0x69, 0x73, 0x20, 0x69, + 0x64, 0x65, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x76, 0x61, 0x72, 0x69, 0x65, + 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x69, 0x74, 0x73, + 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, + 0x6c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x2c, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2c, + 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x6f, 0x74, + 0x69, 0x76, 0x65, 0x20, 0x74, 0x65, 0x63, 0x68, + 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, + 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x6f, + 0x72, 0x65, 0x2e, 0x20, 0x52, 0x69, 0x63, 0x68, + 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x6f, 0x67, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x69, + 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x20, 0x77, 0x69, 0x64, 0x65, 0x20, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x54, 0x69, 0x76, 0x61, + 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, + 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x68, 0x6f, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2d, 0x70, + 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x20, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x73, 0x2e, + 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x62, 0x72, + 0x3e, 0x0a, 0x46, 0x75, 0x72, 0x74, 0x68, 0x65, + 0x72, 0x6d, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, + 0x20, 0x32, 0x30, 0x20, 0x79, 0x65, 0x61, 0x72, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x52, 0x4d, + 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x62, 0x65, + 0x68, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x73, + 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x54, 0x69, 0x76, 0x61, 0x20, 0x43, 0x20, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x72, + 0x6f, 0x62, 0x75, 0x73, 0x74, 0x20, 0x6f, 0x6e, + 0x2d, 0x63, 0x68, 0x69, 0x70, 0x20, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x67, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x73, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x20, 0x61, 0x74, 0x20, 0x72, 0x65, + 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x42, 0x4f, + 0x4d, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x2e, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x54, 0x69, 0x76, + 0x61, 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, + 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, + 0x20, 0x36, 0x35, 0x2d, 0x6e, 0x6d, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, + 0x65, 0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x76, + 0x65, 0x72, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4d, + 0x48, 0x7a, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x72, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x75, + 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, 0x70, + 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, + 0x63, 0x65, 0x2e, 0x0a, 0x3c, 0x62, 0x72, 0x3e, + 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x4c, 0x65, 0x61, + 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, + 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x54, 0x69, 0x76, 0x61, 0x20, 0x43, + 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, + 0x61, 0x74, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, + 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, + 0x76, 0x61, 0x2d, 0x63, 0x22, 0x3e, 0x77, 0x77, + 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x74, 0x69, 0x76, 0x61, 0x2d, 0x63, 0x3c, + 0x2f, 0x61, 0x3e, 0x2e, 0x0a, 0x3c, 0x2f, 0x70, + 0x3e, 0x0a, 0x0a, 0x3c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x22, 0x38, 0x30, 0x25, 0x22, 0x20, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, + 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x31, 0x22, 0x20, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, 0x61, 0x63, + 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x31, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, + 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2e, 0x2f, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x61, + 0x70, 0x70, 0x73, 0x2e, 0x6a, 0x70, 0x67, 0x22, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x61, 0x70, 0x70, 0x73, 0x22, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x62, 0x72, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, + 0x3e, 0x0a, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x0a, + 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, + 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, + +}; + +static const uint8_t data_favicon_ico[] = +{ + /* /favicon.ico */ + 0x2f, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, + 0x2e, 0x69, 0x63, 0x6f, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x10, 0x10, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, + 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x05, + 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x07, + 0x77, 0x70, 0x07, 0x78, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x77, 0x77, 0x80, 0x70, 0x00, 0x70, + 0x00, 0x00, 0x70, 0x07, 0x00, 0x07, 0x07, 0x00, + 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x07, 0x70, 0x07, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x70, 0x08, 0x70, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x77, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x8f, + 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0x0f, + 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0xe0, 0x03, + 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, + 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x0f, + 0x00, 0x00, 0xf0, 0x4f, 0x00, 0x00, 0xf0, 0xff, + 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0xc0, 0xdc, + 0xc0, 0x00, 0xf0, 0xca, 0xa6, 0x00, 0xd4, 0xf0, + 0xff, 0x00, 0xb1, 0xe2, 0xff, 0x00, 0x8e, 0xd4, + 0xff, 0x00, 0x6b, 0xc6, 0xff, 0x00, 0x48, 0xb8, + 0xff, 0x00, 0x25, 0xaa, 0xff, 0x00, 0x00, 0xaa, + 0xff, 0x00, 0x00, 0x92, 0xdc, 0x00, 0x00, 0x7a, + 0xb9, 0x00, 0x00, 0x62, 0x96, 0x00, 0x00, 0x4a, + 0x73, 0x00, 0x00, 0x32, 0x50, 0x00, 0xd4, 0xe3, + 0xff, 0x00, 0xb1, 0xc7, 0xff, 0x00, 0x8e, 0xab, + 0xff, 0x00, 0x6b, 0x8f, 0xff, 0x00, 0x48, 0x73, + 0xff, 0x00, 0x25, 0x57, 0xff, 0x00, 0x00, 0x55, + 0xff, 0x00, 0x00, 0x49, 0xdc, 0x00, 0x00, 0x3d, + 0xb9, 0x00, 0x00, 0x31, 0x96, 0x00, 0x00, 0x25, + 0x73, 0x00, 0x00, 0x19, 0x50, 0x00, 0xd4, 0xd4, + 0xff, 0x00, 0xb1, 0xb1, 0xff, 0x00, 0x8e, 0x8e, + 0xff, 0x00, 0x6b, 0x6b, 0xff, 0x00, 0x48, 0x48, + 0xff, 0x00, 0x25, 0x25, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0xb9, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x73, 0x00, 0x00, 0x00, 0x50, 0x00, 0xe3, 0xd4, + 0xff, 0x00, 0xc7, 0xb1, 0xff, 0x00, 0xab, 0x8e, + 0xff, 0x00, 0x8f, 0x6b, 0xff, 0x00, 0x73, 0x48, + 0xff, 0x00, 0x57, 0x25, 0xff, 0x00, 0x55, 0x00, + 0xff, 0x00, 0x49, 0x00, 0xdc, 0x00, 0x3d, 0x00, + 0xb9, 0x00, 0x31, 0x00, 0x96, 0x00, 0x25, 0x00, + 0x73, 0x00, 0x19, 0x00, 0x50, 0x00, 0xf0, 0xd4, + 0xff, 0x00, 0xe2, 0xb1, 0xff, 0x00, 0xd4, 0x8e, + 0xff, 0x00, 0xc6, 0x6b, 0xff, 0x00, 0xb8, 0x48, + 0xff, 0x00, 0xaa, 0x25, 0xff, 0x00, 0xaa, 0x00, + 0xff, 0x00, 0x92, 0x00, 0xdc, 0x00, 0x7a, 0x00, + 0xb9, 0x00, 0x62, 0x00, 0x96, 0x00, 0x4a, 0x00, + 0x73, 0x00, 0x32, 0x00, 0x50, 0x00, 0xff, 0xd4, + 0xff, 0x00, 0xff, 0xb1, 0xff, 0x00, 0xff, 0x8e, + 0xff, 0x00, 0xff, 0x6b, 0xff, 0x00, 0xff, 0x48, + 0xff, 0x00, 0xff, 0x25, 0xff, 0x00, 0xff, 0x00, + 0xff, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0xb9, 0x00, + 0xb9, 0x00, 0x96, 0x00, 0x96, 0x00, 0x73, 0x00, + 0x73, 0x00, 0x50, 0x00, 0x50, 0x00, 0xff, 0xd4, + 0xf0, 0x00, 0xff, 0xb1, 0xe2, 0x00, 0xff, 0x8e, + 0xd4, 0x00, 0xff, 0x6b, 0xc6, 0x00, 0xff, 0x48, + 0xb8, 0x00, 0xff, 0x25, 0xaa, 0x00, 0xff, 0x00, + 0xaa, 0x00, 0xdc, 0x00, 0x92, 0x00, 0xb9, 0x00, + 0x7a, 0x00, 0x96, 0x00, 0x62, 0x00, 0x73, 0x00, + 0x4a, 0x00, 0x50, 0x00, 0x32, 0x00, 0xff, 0xd4, + 0xe3, 0x00, 0xff, 0xb1, 0xc7, 0x00, 0xff, 0x8e, + 0xab, 0x00, 0xff, 0x6b, 0x8f, 0x00, 0xff, 0x48, + 0x73, 0x00, 0xff, 0x25, 0x57, 0x00, 0xff, 0x00, + 0x55, 0x00, 0xdc, 0x00, 0x49, 0x00, 0xb9, 0x00, + 0x3d, 0x00, 0x96, 0x00, 0x31, 0x00, 0x73, 0x00, + 0x25, 0x00, 0x50, 0x00, 0x19, 0x00, 0xff, 0xd4, + 0xd4, 0x00, 0xff, 0xb1, 0xb1, 0x00, 0xff, 0x8e, + 0x8e, 0x00, 0xff, 0x6b, 0x6b, 0x00, 0xff, 0x48, + 0x48, 0x00, 0xff, 0x25, 0x25, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xb9, 0x00, + 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0xff, 0xe3, + 0xd4, 0x00, 0xff, 0xc7, 0xb1, 0x00, 0xff, 0xab, + 0x8e, 0x00, 0xff, 0x8f, 0x6b, 0x00, 0xff, 0x73, + 0x48, 0x00, 0xff, 0x57, 0x25, 0x00, 0xff, 0x55, + 0x00, 0x00, 0xdc, 0x49, 0x00, 0x00, 0xb9, 0x3d, + 0x00, 0x00, 0x96, 0x31, 0x00, 0x00, 0x73, 0x25, + 0x00, 0x00, 0x50, 0x19, 0x00, 0x00, 0xff, 0xf0, + 0xd4, 0x00, 0xff, 0xe2, 0xb1, 0x00, 0xff, 0xd4, + 0x8e, 0x00, 0xff, 0xc6, 0x6b, 0x00, 0xff, 0xb8, + 0x48, 0x00, 0xff, 0xaa, 0x25, 0x00, 0xff, 0xaa, + 0x00, 0x00, 0xdc, 0x92, 0x00, 0x00, 0xb9, 0x7a, + 0x00, 0x00, 0x96, 0x62, 0x00, 0x00, 0x73, 0x4a, + 0x00, 0x00, 0x50, 0x32, 0x00, 0x00, 0xff, 0xff, + 0xd4, 0x00, 0xff, 0xff, 0xb1, 0x00, 0xff, 0xff, + 0x8e, 0x00, 0xff, 0xff, 0x6b, 0x00, 0xff, 0xff, + 0x48, 0x00, 0xff, 0xff, 0x25, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xdc, 0xdc, 0x00, 0x00, 0xb9, 0xb9, + 0x00, 0x00, 0x96, 0x96, 0x00, 0x00, 0x73, 0x73, + 0x00, 0x00, 0x50, 0x50, 0x00, 0x00, 0xf0, 0xff, + 0xd4, 0x00, 0xe2, 0xff, 0xb1, 0x00, 0xd4, 0xff, + 0x8e, 0x00, 0xc6, 0xff, 0x6b, 0x00, 0xb8, 0xff, + 0x48, 0x00, 0xaa, 0xff, 0x25, 0x00, 0xaa, 0xff, + 0x00, 0x00, 0x92, 0xdc, 0x00, 0x00, 0x7a, 0xb9, + 0x00, 0x00, 0x62, 0x96, 0x00, 0x00, 0x4a, 0x73, + 0x00, 0x00, 0x32, 0x50, 0x00, 0x00, 0xe3, 0xff, + 0xd4, 0x00, 0xc7, 0xff, 0xb1, 0x00, 0xab, 0xff, + 0x8e, 0x00, 0x8f, 0xff, 0x6b, 0x00, 0x73, 0xff, + 0x48, 0x00, 0x57, 0xff, 0x25, 0x00, 0x55, 0xff, + 0x00, 0x00, 0x49, 0xdc, 0x00, 0x00, 0x3d, 0xb9, + 0x00, 0x00, 0x31, 0x96, 0x00, 0x00, 0x25, 0x73, + 0x00, 0x00, 0x19, 0x50, 0x00, 0x00, 0xd4, 0xff, + 0xd4, 0x00, 0xb1, 0xff, 0xb1, 0x00, 0x8e, 0xff, + 0x8e, 0x00, 0x6b, 0xff, 0x6b, 0x00, 0x48, 0xff, + 0x48, 0x00, 0x25, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xb9, + 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x73, + 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0xd4, 0xff, + 0xe3, 0x00, 0xb1, 0xff, 0xc7, 0x00, 0x8e, 0xff, + 0xab, 0x00, 0x6b, 0xff, 0x8f, 0x00, 0x48, 0xff, + 0x73, 0x00, 0x25, 0xff, 0x57, 0x00, 0x00, 0xff, + 0x55, 0x00, 0x00, 0xdc, 0x49, 0x00, 0x00, 0xb9, + 0x3d, 0x00, 0x00, 0x96, 0x31, 0x00, 0x00, 0x73, + 0x25, 0x00, 0x00, 0x50, 0x19, 0x00, 0xd4, 0xff, + 0xf0, 0x00, 0xb1, 0xff, 0xe2, 0x00, 0x8e, 0xff, + 0xd4, 0x00, 0x6b, 0xff, 0xc6, 0x00, 0x48, 0xff, + 0xb8, 0x00, 0x25, 0xff, 0xaa, 0x00, 0x00, 0xff, + 0xaa, 0x00, 0x00, 0xdc, 0x92, 0x00, 0x00, 0xb9, + 0x7a, 0x00, 0x00, 0x96, 0x62, 0x00, 0x00, 0x73, + 0x4a, 0x00, 0x00, 0x50, 0x32, 0x00, 0xd4, 0xff, + 0xff, 0x00, 0xb1, 0xff, 0xff, 0x00, 0x8e, 0xff, + 0xff, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x48, 0xff, + 0xff, 0x00, 0x25, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xdc, 0xdc, 0x00, 0x00, 0xb9, + 0xb9, 0x00, 0x00, 0x96, 0x96, 0x00, 0x00, 0x73, + 0x73, 0x00, 0x00, 0x50, 0x50, 0x00, 0xf2, 0xf2, + 0xf2, 0x00, 0xe6, 0xe6, 0xe6, 0x00, 0xda, 0xda, + 0xda, 0x00, 0xce, 0xce, 0xce, 0x00, 0xc2, 0xc2, + 0xc2, 0x00, 0xb6, 0xb6, 0xb6, 0x00, 0xaa, 0xaa, + 0xaa, 0x00, 0x9e, 0x9e, 0x9e, 0x00, 0x92, 0x92, + 0x92, 0x00, 0x86, 0x86, 0x86, 0x00, 0x7a, 0x7a, + 0x7a, 0x00, 0x6e, 0x6e, 0x6e, 0x00, 0x62, 0x62, + 0x62, 0x00, 0x56, 0x56, 0x56, 0x00, 0x4a, 0x4a, + 0x4a, 0x00, 0x3e, 0x3e, 0x3e, 0x00, 0x32, 0x32, + 0x32, 0x00, 0x26, 0x26, 0x26, 0x00, 0x1a, 0x1a, + 0x1a, 0x00, 0x0e, 0x0e, 0x0e, 0x00, 0xf0, 0xfb, + 0xff, 0x00, 0xa4, 0xa0, 0xa0, 0x00, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, + 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, + 0x00, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, + 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf7, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0xe6, + 0xe6, 0xf8, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xf7, + 0xf7, 0xe6, 0xf8, 0x00, 0xf7, 0x00, 0x00, 0x00, + 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, + 0x00, 0xe6, 0x00, 0x00, 0x00, 0xf7, 0x00, 0xf7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, + 0x00, 0xe6, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xe6, 0x00, + 0x00, 0xe6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xe6, 0x00, + 0x00, 0xf8, 0xe6, 0x00, 0x00, 0xf7, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, + 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xe6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xfe, 0x0f, + 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xe0, 0x03, + 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xc0, 0x00, + 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x01, + 0xff, 0xff, 0xf0, 0x01, 0xff, 0xff, 0xf0, 0x0f, + 0xff, 0xff, 0xf0, 0x4f, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, +}; + +static const uint8_t data_footer_htm[] = +{ + /* /footer.htm */ + 0x2f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, + 0x68, 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, + 0x45, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, + 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x22, 0x2d, + 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 0x2f, 0x44, + 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x2f, 0x2f, 0x45, 0x4e, 0x22, 0x3e, 0x0a, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x21, 0x2d, + 0x2d, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, + 0x32, 0x30, 0x31, 0x33, 0x2d, 0x32, 0x30, 0x31, + 0x34, 0x20, 0x54, 0x65, 0x78, 0x61, 0x73, 0x20, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x20, 0x49, 0x6e, 0x63, 0x6f, + 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x2e, 0x20, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x20, + 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74, + 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, + 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, + 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x63, + 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x49, + 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x36, 0x39, 0x2d, + 0x31, 0x22, 0x3e, 0x0a, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x54, 0x69, 0x76, 0x61, 0x26, + 0x72, 0x65, 0x67, 0x3b, 0x20, 0x54, 0x4d, 0x34, + 0x43, 0x31, 0x32, 0x39, 0x78, 0x20, 0x44, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x4b, 0x69, 0x74, 0x20, 0x46, 0x6f, + 0x6f, 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x0a, 0x3c, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, + 0x63, 0x73, 0x73, 0x22, 0x3e, 0x0a, 0x62, 0x6f, + 0x64, 0x79, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x3a, 0x20, 0x41, 0x72, 0x69, + 0x61, 0x6c, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x70, 0x78, + 0x0a, 0x7d, 0x0a, 0x68, 0x31, 0x0a, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x20, 0x23, 0x37, 0x43, 0x37, 0x33, 0x36, + 0x39, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x3a, 0x20, 0x41, 0x72, 0x69, 0x61, 0x6c, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, + 0x31, 0x32, 0x70, 0x74, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3a, 0x20, 0x69, 0x74, 0x61, + 0x6c, 0x69, 0x63, 0x3b, 0x0a, 0x7d, 0x0a, 0x68, + 0x32, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x62, 0x6c, + 0x61, 0x63, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x3a, 0x20, 0x41, 0x72, 0x69, + 0x61, 0x6c, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, + 0x3a, 0x20, 0x31, 0x32, 0x70, 0x74, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3a, 0x20, 0x62, + 0x6f, 0x6c, 0x64, 0x3b, 0x0a, 0x7d, 0x0a, 0x3c, + 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, + 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x0a, + 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, + 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, + 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, 0x61, + 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, + 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, + 0x31, 0x30, 0x30, 0x25, 0x22, 0x3e, 0x0a, 0x3c, + 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x74, + 0x72, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x0a, 0x3c, 0x68, + 0x31, 0x3e, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x26, 0x63, 0x6f, 0x70, + 0x79, 0x3b, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x2f, 0x74, + 0x72, 0x3e, 0x0a, 0x3c, 0x2f, 0x74, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, + 0x6c, 0x3e, 0x0a, +}; + +static const uint8_t data_freertos_htm[] = +{ + /* /freertos.htm */ + 0x2f, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, + 0x73, 0x2e, 0x68, 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0x0a, + 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, + 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x68, 0x74, + 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, + 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x73, + 0x65, 0x74, 0x3d, 0x49, 0x53, 0x4f, 0x2d, 0x38, + 0x38, 0x36, 0x39, 0x2d, 0x31, 0x22, 0x3e, 0x0d, + 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2e, 0x2f, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x73, + 0x73, 0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, + 0x65, 0x74, 0x22, 0x20, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x3d, 0x22, 0x73, 0x63, 0x72, 0x65, 0x65, + 0x6e, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3e, 0x41, 0x62, 0x6f, 0x75, + 0x74, 0x20, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, + 0x4f, 0x53, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, + 0x3b, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, + 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0d, 0x0a, + 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x37, 0x30, + 0x25, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x20, 0x63, 0x65, 0x6c, + 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, + 0x3d, 0x22, 0x30, 0x22, 0x3e, 0x0d, 0x0a, 0x20, + 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x20, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x37, 0x30, + 0x25, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, + 0x68, 0x31, 0x3e, 0x41, 0x62, 0x6f, 0x75, 0x74, + 0x20, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, + 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x64, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x22, 0x37, 0x30, 0x25, 0x22, 0x3e, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x2e, 0x2f, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x73, 0x2f, 0x66, 0x72, 0x65, + 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, 0x6a, 0x70, + 0x67, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, + 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0d, + 0x0a, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x72, 0x3e, 0x0d, + 0x0a, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, + 0x30, 0x30, 0x25, 0x22, 0x20, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, 0x61, 0x63, + 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x20, + 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x3e, + 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, + 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, + 0x64, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x22, 0x39, 0x31, 0x25, 0x22, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, + 0x70, 0x22, 0x3e, 0x44, 0x65, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x52, 0x65, 0x61, 0x6c, 0x20, 0x54, 0x69, 0x6d, + 0x65, 0x20, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x65, 0x72, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x2e, + 0x2c, 0x20, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c, + 0x61, 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x72, + 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, 0x6f, + 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, + 0x65, 0x52, 0x54, 0x4f, 0x53, 0x3c, 0x2f, 0x61, + 0x3e, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x20, 0x6c, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x52, 0x65, 0x61, + 0x6c, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, + 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, + 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x68, + 0x75, 0x67, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x74, 0x79, 0x2c, 0x20, 0x46, 0x72, 0x65, 0x65, + 0x52, 0x54, 0x4f, 0x53, 0x20, 0x69, 0x73, 0x20, + 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x64, + 0x75, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x65, 0x6d, 0x62, 0x65, + 0x64, 0x64, 0x65, 0x64, 0x20, 0x64, 0x65, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x2e, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0d, 0x0a, + 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x0d, 0x0a, 0x3c, 0x70, 0x3e, 0x3c, 0x65, 0x6d, + 0x3e, 0x3c, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, + 0x3e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, + 0x68, 0x74, 0x73, 0x3a, 0x3c, 0x2f, 0x73, 0x74, + 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x65, + 0x6d, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, + 0x3c, 0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x20, 0x20, + 0x3c, 0x6c, 0x69, 0x3e, 0x43, 0x61, 0x6e, 0x20, + 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x61, 0x20, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x75, 0x72, + 0x70, 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x3c, 0x2f, 0x6c, + 0x69, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x6c, + 0x69, 0x3e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x68, 0x61, 0x72, + 0x64, 0x77, 0x61, 0x72, 0x65, 0x2f, 0x73, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x72, 0x65, + 0x64, 0x75, 0x63, 0x65, 0x73, 0x20, 0x63, 0x6f, + 0x73, 0x74, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0d, + 0x0a, 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x0d, 0x0a, + 0x3c, 0x70, 0x3e, 0x46, 0x6f, 0x72, 0x20, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, + 0x76, 0x69, 0x73, 0x69, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c, + 0x61, 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x65, 0x32, 0x65, 0x2e, 0x74, 0x69, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x69, 0x63, + 0x72, 0x6f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x2f, 0x74, 0x69, + 0x76, 0x61, 0x5f, 0x61, 0x72, 0x6d, 0x2f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x61, + 0x73, 0x70, 0x78, 0x22, 0x3e, 0x20, 0x54, 0x69, + 0x76, 0x61, 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, + 0x3b, 0x20, 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x20, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x54, 0x49, 0x20, 0x66, + 0x6f, 0x72, 0x75, 0x6d, 0x73, 0x20, 0x77, 0x65, + 0x62, 0x20, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x0d, + 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0d, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, + 0x3e, 0x0d, 0x0a, +}; + +static const uint8_t data_header_htm[] = +{ + /* /header.htm */ + 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, + 0x68, 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, + 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x36, 0x39, + 0x2d, 0x31, 0x22, 0x3e, 0x0a, 0x3c, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3e, 0x54, 0x69, 0x76, 0x61, + 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, 0x20, + 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x20, 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, + 0x58, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x4b, 0x69, + 0x74, 0x20, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x0a, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x3e, + 0x0a, 0x62, 0x6f, 0x64, 0x79, 0x0a, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x20, + 0x41, 0x72, 0x69, 0x61, 0x6c, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x74, + 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x31, 0x30, + 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, + 0x30, 0x70, 0x78, 0x0a, 0x7d, 0x0a, 0x68, 0x31, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, + 0x77, 0x68, 0x69, 0x74, 0x65, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x37, 0x43, 0x37, 0x33, 0x36, 0x39, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, + 0x3a, 0x20, 0x41, 0x72, 0x69, 0x61, 0x6c, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x32, + 0x34, 0x70, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, + 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3a, 0x20, 0x35, 0x30, 0x25, + 0x3b, 0x0a, 0x7d, 0x0a, 0x68, 0x32, 0x0a, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x77, 0x68, + 0x69, 0x74, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, + 0x37, 0x43, 0x37, 0x33, 0x36, 0x39, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, + 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x20, + 0x41, 0x72, 0x69, 0x61, 0x6c, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x32, 0x32, 0x70, + 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3a, 0x20, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x20, 0x35, 0x30, 0x25, 0x3b, 0x0a, + 0x7d, 0x0a, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x0a, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, + 0x31, 0x30, 0x30, 0x25, 0x22, 0x20, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, + 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, 0x61, + 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, + 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, + 0x3e, 0x0a, 0x3c, 0x74, 0x72, 0x3e, 0x0a, 0x3c, + 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x22, 0x20, + 0x20, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, + 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, + 0x3e, 0x0a, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x2e, 0x2f, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x73, 0x2f, 0x74, 0x69, 0x5f, + 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x67, 0x69, 0x66, + 0x22, 0x3e, 0x0a, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x0a, 0x3c, 0x68, 0x31, + 0x3e, 0x54, 0x69, 0x76, 0x61, 0x26, 0x74, 0x72, + 0x61, 0x64, 0x65, 0x3b, 0x20, 0x43, 0x20, 0x53, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, 0x54, 0x4d, + 0x34, 0x43, 0x31, 0x32, 0x39, 0x58, 0x20, 0x44, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x4b, 0x69, 0x74, 0x3c, 0x2f, + 0x68, 0x31, 0x3e, 0x0a, 0x3c, 0x68, 0x32, 0x3e, + 0x44, 0x4b, 0x2d, 0x54, 0x4d, 0x34, 0x43, 0x31, + 0x32, 0x39, 0x58, 0x3c, 0x2f, 0x68, 0x32, 0x3e, + 0x0a, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, + 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x3c, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, +}; + +static const uint8_t data_images_apps_jpg[] = +{ + /* /images/apps.jpg */ + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x61, 0x70, 0x70, 0x73, 0x2e, 0x6a, 0x70, 0x67, + 0x00, + 0xff, 0xd8, 0xff, 0xe1, 0x00, 0x18, 0x45, 0x78, + 0x69, 0x66, 0x00, 0x00, 0x49, 0x49, 0x2a, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x11, + 0x44, 0x75, 0x63, 0x6b, 0x79, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0xff, + 0xe1, 0x03, 0xb4, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, + 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, + 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x00, + 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, + 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, + 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, + 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, + 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, + 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, + 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, + 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, + 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, + 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, + 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, + 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, + 0x65, 0x20, 0x35, 0x2e, 0x30, 0x2d, 0x63, 0x30, + 0x36, 0x30, 0x20, 0x36, 0x31, 0x2e, 0x31, 0x33, + 0x34, 0x37, 0x37, 0x37, 0x2c, 0x20, 0x32, 0x30, + 0x31, 0x30, 0x2f, 0x30, 0x32, 0x2f, 0x31, 0x32, + 0x2d, 0x31, 0x37, 0x3a, 0x33, 0x32, 0x3a, 0x30, + 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, + 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, + 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, + 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, + 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, + 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, + 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, + 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, + 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, + 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, + 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, + 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, + 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, + 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, + 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x64, 0x63, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x70, 0x75, 0x72, 0x6c, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x64, 0x63, 0x2f, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x31, 0x2e, 0x31, + 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, + 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, + 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, + 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, + 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, + 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x37, + 0x38, 0x46, 0x46, 0x33, 0x45, 0x35, 0x32, 0x36, + 0x44, 0x44, 0x31, 0x31, 0x45, 0x33, 0x39, 0x38, + 0x36, 0x34, 0x39, 0x31, 0x39, 0x45, 0x43, 0x44, + 0x30, 0x35, 0x30, 0x42, 0x36, 0x39, 0x22, 0x20, + 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, + 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, + 0x64, 0x3a, 0x37, 0x37, 0x38, 0x46, 0x46, 0x33, + 0x45, 0x36, 0x32, 0x36, 0x44, 0x44, 0x31, 0x31, + 0x45, 0x33, 0x39, 0x38, 0x36, 0x34, 0x39, 0x31, + 0x39, 0x45, 0x43, 0x44, 0x30, 0x35, 0x30, 0x42, + 0x36, 0x39, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, + 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, + 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x53, 0x35, + 0x20, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, + 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, + 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, + 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, + 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, + 0x75, 0x75, 0x69, 0x64, 0x3a, 0x66, 0x61, 0x66, + 0x35, 0x62, 0x64, 0x64, 0x35, 0x2d, 0x62, 0x61, + 0x33, 0x64, 0x2d, 0x31, 0x31, 0x64, 0x61, 0x2d, + 0x61, 0x64, 0x33, 0x31, 0x2d, 0x64, 0x33, 0x33, + 0x64, 0x37, 0x35, 0x31, 0x38, 0x32, 0x66, 0x31, + 0x62, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, + 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, + 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x37, 0x38, + 0x46, 0x46, 0x33, 0x45, 0x34, 0x32, 0x36, 0x44, + 0x44, 0x31, 0x31, 0x45, 0x33, 0x39, 0x38, 0x36, + 0x34, 0x39, 0x31, 0x39, 0x45, 0x43, 0x44, 0x30, + 0x35, 0x30, 0x42, 0x36, 0x39, 0x22, 0x2f, 0x3e, + 0x20, 0x3c, 0x64, 0x63, 0x3a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x6f, 0x72, 0x3e, 0x20, 0x3c, 0x72, + 0x64, 0x66, 0x3a, 0x53, 0x65, 0x71, 0x3e, 0x20, + 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, 0x3e, + 0x48, 0x61, 0x75, 0x67, 0x6c, 0x69, 0x65, 0x3c, + 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, 0x3e, + 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, + 0x3e, 0x4a, 0x6f, 0x65, 0x3c, 0x2f, 0x72, 0x64, + 0x66, 0x3a, 0x6c, 0x69, 0x3e, 0x20, 0x3c, 0x2f, + 0x72, 0x64, 0x66, 0x3a, 0x53, 0x65, 0x71, 0x3e, + 0x20, 0x3c, 0x2f, 0x64, 0x63, 0x3a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3e, 0x20, 0x3c, + 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, + 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, + 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, + 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, + 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xff, 0xed, 0x00, + 0x48, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, + 0x6f, 0x70, 0x20, 0x33, 0x2e, 0x30, 0x00, 0x38, + 0x42, 0x49, 0x4d, 0x04, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x1c, 0x01, 0x5a, 0x00, 0x03, + 0x1b, 0x25, 0x47, 0x1c, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xfc, + 0xe1, 0x1f, 0x89, 0xc8, 0xb7, 0xc9, 0x78, 0x2f, + 0x34, 0x62, 0x34, 0x07, 0x58, 0x77, 0xeb, 0xff, + 0xee, 0x00, 0x0e, 0x41, 0x64, 0x6f, 0x62, 0x65, + 0x00, 0x64, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, + 0xdb, 0x00, 0x84, 0x00, 0x0c, 0x08, 0x08, 0x08, + 0x09, 0x08, 0x0c, 0x09, 0x09, 0x0c, 0x11, 0x0b, + 0x0a, 0x0b, 0x11, 0x15, 0x0f, 0x0c, 0x0c, 0x0f, + 0x15, 0x18, 0x13, 0x13, 0x15, 0x13, 0x13, 0x18, + 0x17, 0x12, 0x14, 0x14, 0x14, 0x14, 0x12, 0x17, + 0x17, 0x1b, 0x1c, 0x1e, 0x1c, 0x1b, 0x17, 0x24, + 0x24, 0x27, 0x27, 0x24, 0x24, 0x35, 0x33, 0x33, + 0x33, 0x35, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x01, 0x0d, 0x0b, 0x0b, + 0x0d, 0x0e, 0x0d, 0x10, 0x0e, 0x0e, 0x10, 0x14, + 0x0e, 0x0f, 0x0e, 0x14, 0x14, 0x10, 0x11, 0x11, + 0x10, 0x14, 0x1d, 0x14, 0x14, 0x15, 0x14, 0x14, + 0x1d, 0x25, 0x1a, 0x17, 0x17, 0x17, 0x17, 0x1a, + 0x25, 0x20, 0x23, 0x1e, 0x1e, 0x1e, 0x23, 0x20, + 0x28, 0x28, 0x25, 0x25, 0x28, 0x28, 0x32, 0x32, + 0x30, 0x32, 0x32, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xff, 0xc0, 0x00, + 0x11, 0x08, 0x02, 0x54, 0x05, 0x00, 0x03, 0x01, + 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, + 0xff, 0xc4, 0x00, 0xba, 0x00, 0x01, 0x00, 0x02, + 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x05, 0x07, 0x03, 0x02, 0x08, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x10, 0x00, + 0x01, 0x03, 0x03, 0x01, 0x03, 0x05, 0x09, 0x0d, + 0x06, 0x06, 0x02, 0x02, 0x02, 0x01, 0x05, 0x01, + 0x00, 0x02, 0x03, 0x11, 0x04, 0x05, 0x06, 0x21, + 0x31, 0x12, 0x41, 0x51, 0x91, 0x13, 0x53, 0x61, + 0x71, 0xd1, 0x22, 0x14, 0x54, 0x15, 0x16, 0x07, + 0x81, 0xa1, 0xb1, 0x32, 0x52, 0x72, 0x63, 0x93, + 0xa3, 0x35, 0x26, 0x36, 0x17, 0x42, 0xb2, 0x23, + 0x33, 0x73, 0xb3, 0xf0, 0xc1, 0xe1, 0x62, 0x24, + 0x34, 0x92, 0x43, 0x82, 0x25, 0xf1, 0x44, 0xc2, + 0x64, 0xa2, 0x83, 0x84, 0x55, 0x11, 0x01, 0x00, + 0x02, 0x01, 0x01, 0x05, 0x05, 0x06, 0x04, 0x04, + 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x11, 0x02, 0x03, 0x21, 0x31, 0x41, 0x51, 0x61, + 0xf0, 0x81, 0xa1, 0x12, 0x04, 0x71, 0x91, 0xb1, + 0xc1, 0xd1, 0x13, 0xe1, 0x22, 0x32, 0x05, 0x52, + 0x62, 0x23, 0x53, 0x42, 0x82, 0xa2, 0xd2, 0x93, + 0x14, 0xf1, 0xe2, 0x15, 0xff, 0xda, 0x00, 0x0c, + 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, + 0x3f, 0x00, 0xea, 0xa8, 0x88, 0x80, 0xaa, 0xba, + 0xb6, 0xea, 0xf1, 0x97, 0x96, 0xb6, 0xb6, 0xf2, + 0x3a, 0x31, 0x2b, 0x6b, 0xe2, 0xb8, 0xb4, 0x97, + 0x17, 0x53, 0x69, 0x05, 0x5a, 0x95, 0x4f, 0x55, + 0xfd, 0xf5, 0x8f, 0xef, 0x0f, 0xee, 0x04, 0x18, + 0xfe, 0xaf, 0xea, 0x8e, 0xdd, 0xdf, 0x5e, 0xef, + 0x0a, 0x7a, 0x03, 0x54, 0xf6, 0xee, 0xfa, 0xf7, + 0x78, 0x55, 0xcd, 0x10, 0x53, 0x3d, 0x01, 0xaa, + 0x7b, 0x77, 0x7d, 0x7b, 0xbc, 0x29, 0xe8, 0x0d, + 0x53, 0xdb, 0xbb, 0xeb, 0xdd, 0xe1, 0x57, 0x34, + 0x41, 0x4c, 0xf4, 0x06, 0xa9, 0xed, 0xdd, 0xf5, + 0xee, 0xf0, 0xa7, 0xa0, 0x35, 0x4f, 0x6e, 0xef, + 0xaf, 0x77, 0x85, 0x5c, 0xd1, 0x05, 0x33, 0xd0, + 0x1a, 0xa7, 0xb7, 0x77, 0xd7, 0xbb, 0xc2, 0x9e, + 0x80, 0xd5, 0x3d, 0xbb, 0xbe, 0xbd, 0xde, 0x15, + 0x73, 0x44, 0x14, 0xcf, 0x40, 0x6a, 0x9e, 0xdd, + 0xdf, 0x5e, 0xef, 0x0a, 0x7a, 0x03, 0x54, 0xf6, + 0xee, 0xfa, 0xf7, 0x78, 0x55, 0xcd, 0x10, 0x53, + 0x3d, 0x01, 0xaa, 0x7b, 0x77, 0x7d, 0x7b, 0xbc, + 0x29, 0xe8, 0x0d, 0x53, 0xdb, 0xbb, 0xeb, 0xdd, + 0xe1, 0x57, 0x34, 0x41, 0x4c, 0xf4, 0x06, 0xa9, + 0xed, 0xdd, 0xf5, 0xee, 0xf0, 0xa7, 0xa0, 0x35, + 0x4f, 0x6e, 0xef, 0xaf, 0x77, 0x85, 0x5c, 0xd1, + 0x05, 0x33, 0xd0, 0x1a, 0xa7, 0xb7, 0x77, 0xd7, + 0xbb, 0xc2, 0x9e, 0x80, 0xd5, 0x3d, 0xbb, 0xbe, + 0xbd, 0xde, 0x15, 0x73, 0x44, 0x14, 0xcf, 0x40, + 0x6a, 0x9e, 0xdd, 0xdf, 0x5e, 0xef, 0x0a, 0x7a, + 0x03, 0x54, 0xf6, 0xee, 0xfa, 0xf7, 0x78, 0x55, + 0xcd, 0x10, 0x53, 0x3d, 0x01, 0xaa, 0x7b, 0x77, + 0x7d, 0x7b, 0xbc, 0x29, 0xe8, 0x0d, 0x53, 0xdb, + 0xbb, 0xeb, 0xdd, 0xe1, 0x57, 0x34, 0x41, 0x4c, + 0xf4, 0x06, 0xa9, 0xed, 0xdd, 0xf5, 0xee, 0xf0, + 0xa7, 0xa0, 0x35, 0x4f, 0x6e, 0xef, 0xaf, 0x77, + 0x85, 0x5c, 0xd1, 0x05, 0x33, 0xd0, 0x1a, 0xa7, + 0xb7, 0x77, 0xd7, 0xbb, 0xc2, 0x9e, 0x80, 0xd5, + 0x3d, 0xbb, 0xbe, 0xbd, 0xde, 0x15, 0x73, 0x44, + 0x14, 0xcf, 0x40, 0x6a, 0x9e, 0xdd, 0xdf, 0x5e, + 0xef, 0x0a, 0x7a, 0x03, 0x54, 0xf6, 0xee, 0xfa, + 0xf7, 0x78, 0x55, 0xcd, 0x10, 0x53, 0x3d, 0x01, + 0xaa, 0x7b, 0x77, 0x7d, 0x7b, 0xbc, 0x29, 0xe8, + 0x0d, 0x53, 0xdb, 0xbb, 0xeb, 0xdd, 0xe1, 0x57, + 0x34, 0x41, 0x4c, 0xf4, 0x06, 0xa9, 0xed, 0xdd, + 0xf5, 0xee, 0xf0, 0xa7, 0xa0, 0x35, 0x4f, 0x6e, + 0xef, 0xaf, 0x77, 0x85, 0x5c, 0xd1, 0x05, 0x33, + 0xd0, 0x1a, 0xa7, 0xb7, 0x77, 0xd7, 0xbb, 0xc2, + 0x9e, 0x80, 0xd5, 0x3d, 0xbb, 0xbe, 0xbd, 0xde, + 0x15, 0x73, 0x44, 0x14, 0xcf, 0x40, 0x6a, 0x9e, + 0xdd, 0xdf, 0x5e, 0xef, 0x0a, 0x7a, 0x03, 0x54, + 0xf6, 0xee, 0xfa, 0xf7, 0x78, 0x55, 0xcd, 0x10, + 0x53, 0x3d, 0x01, 0xaa, 0x7b, 0x77, 0x7d, 0x7b, + 0xbc, 0x29, 0xe8, 0x0d, 0x53, 0xdb, 0xbb, 0xeb, + 0xdd, 0xe1, 0x57, 0x34, 0x41, 0x4c, 0xf4, 0x06, + 0xa9, 0xed, 0xdd, 0xf5, 0xee, 0xf0, 0xa7, 0xa0, + 0x35, 0x4f, 0x6e, 0xef, 0xaf, 0x77, 0x85, 0x5c, + 0xd1, 0x05, 0x33, 0xd0, 0x1a, 0xa7, 0xb7, 0x77, + 0xd7, 0xbb, 0xc2, 0x9e, 0x80, 0xd5, 0x3d, 0xbb, + 0xbe, 0xbd, 0xde, 0x15, 0x73, 0x44, 0x14, 0xcf, + 0x40, 0x6a, 0x9e, 0xdd, 0xdf, 0x5e, 0xef, 0x0a, + 0x7a, 0x03, 0x54, 0xf6, 0xee, 0xfa, 0xf7, 0x78, + 0x55, 0xcd, 0x10, 0x53, 0x3d, 0x01, 0xaa, 0x7b, + 0x77, 0x7d, 0x7b, 0xbc, 0x29, 0xe8, 0x0d, 0x53, + 0xdb, 0xbb, 0xeb, 0xdd, 0xe1, 0x57, 0x34, 0x41, + 0x4c, 0xf4, 0x06, 0xa9, 0xed, 0xdd, 0xf5, 0xee, + 0xf0, 0xa7, 0xa0, 0x35, 0x4f, 0x6e, 0xef, 0xaf, + 0x77, 0x85, 0x5c, 0xd1, 0x05, 0x33, 0xd0, 0x1a, + 0xa7, 0xb7, 0x77, 0xd7, 0xbb, 0xc2, 0x9e, 0x80, + 0xd5, 0x3d, 0xbb, 0xbe, 0xbd, 0xde, 0x15, 0x73, + 0x44, 0x14, 0xcf, 0x40, 0x6a, 0x9e, 0xdd, 0xdf, + 0x5e, 0xef, 0x0a, 0x7a, 0x03, 0x54, 0xf6, 0xee, + 0xfa, 0xf7, 0x78, 0x55, 0xcd, 0x10, 0x53, 0x3d, + 0x01, 0xaa, 0x7b, 0x77, 0x7d, 0x7b, 0xbc, 0x29, + 0xe8, 0x0d, 0x53, 0xdb, 0xbb, 0xeb, 0xdd, 0xe1, + 0x57, 0x34, 0x41, 0x4c, 0xf4, 0x06, 0xa9, 0xed, + 0xdd, 0xf5, 0xee, 0xf0, 0xa7, 0xa0, 0x35, 0x4f, + 0x6e, 0xef, 0xaf, 0x77, 0x85, 0x5c, 0xd1, 0x05, + 0x33, 0xd0, 0x1a, 0xa7, 0xb7, 0x77, 0xd7, 0xbb, + 0xc2, 0x9e, 0x80, 0xd5, 0x3d, 0xbb, 0xbe, 0xbd, + 0xde, 0x15, 0x73, 0x44, 0x14, 0xcf, 0x40, 0x6a, + 0x9e, 0xdd, 0xdf, 0x5e, 0xef, 0x0a, 0x7a, 0x03, + 0x54, 0xf6, 0xee, 0xfa, 0xf7, 0x78, 0x55, 0xcd, + 0x10, 0x53, 0x3d, 0x01, 0xaa, 0x7b, 0x77, 0x7d, + 0x7b, 0xbc, 0x29, 0xe8, 0x0d, 0x53, 0xdb, 0xbb, + 0xeb, 0xdd, 0xe1, 0x57, 0x34, 0x41, 0x4c, 0xf4, + 0x06, 0xa9, 0xed, 0xdd, 0xf5, 0xee, 0xf0, 0xa7, + 0xa0, 0x35, 0x4f, 0x6e, 0xef, 0xaf, 0x77, 0x85, + 0x5c, 0xd1, 0x05, 0x33, 0xd0, 0x1a, 0xa7, 0xb7, + 0x77, 0xd7, 0xbb, 0xc2, 0x9e, 0x80, 0xd5, 0x3d, + 0xbb, 0xbe, 0xbd, 0xde, 0x15, 0x73, 0x44, 0x14, + 0xcf, 0x40, 0x6a, 0x9e, 0xdd, 0xdf, 0x5e, 0xef, + 0x0a, 0x7a, 0x03, 0x54, 0xf6, 0xee, 0xfa, 0xf7, + 0x78, 0x55, 0xcd, 0x10, 0x53, 0x3d, 0x01, 0xaa, + 0x7b, 0x77, 0x7d, 0x7b, 0xbc, 0x29, 0xe8, 0x0d, + 0x53, 0xdb, 0xbb, 0xeb, 0xdd, 0xe1, 0x57, 0x34, + 0x41, 0x4c, 0xf4, 0x06, 0xa9, 0xed, 0xdd, 0xf5, + 0xee, 0xf0, 0xa7, 0xa0, 0x35, 0x4f, 0x6e, 0xef, + 0xaf, 0x77, 0x85, 0x5c, 0xd1, 0x05, 0x33, 0xd0, + 0x1a, 0xa7, 0xb7, 0x77, 0xd7, 0xbb, 0xc2, 0x9e, + 0x80, 0xd5, 0x3d, 0xbb, 0xbe, 0xbd, 0xde, 0x15, + 0x73, 0x44, 0x14, 0xcf, 0x40, 0x6a, 0x9e, 0xdd, + 0xdf, 0x5e, 0xef, 0x0a, 0x7a, 0x03, 0x54, 0xf6, + 0xee, 0xfa, 0xf7, 0x78, 0x55, 0xcd, 0x10, 0x53, + 0x3d, 0x01, 0xaa, 0x7b, 0x77, 0x7d, 0x7b, 0xbc, + 0x29, 0xe8, 0x0d, 0x53, 0xdb, 0xbb, 0xeb, 0xdd, + 0xe1, 0x57, 0x34, 0x41, 0x4c, 0xf4, 0x06, 0xa9, + 0xed, 0xdd, 0xf5, 0xee, 0xf0, 0xa7, 0xa0, 0x35, + 0x4f, 0x6e, 0xef, 0xaf, 0x77, 0x85, 0x5c, 0xd1, + 0x05, 0x33, 0xd0, 0x1a, 0xa7, 0xb7, 0x77, 0xd7, + 0xbb, 0xc2, 0x9e, 0x80, 0xd5, 0x3d, 0xbb, 0xbe, + 0xbd, 0xde, 0x15, 0x73, 0x44, 0x14, 0xcf, 0x40, + 0x6a, 0x9e, 0xdd, 0xdf, 0x5e, 0xef, 0x0a, 0x7a, + 0x03, 0x54, 0xf6, 0xee, 0xfa, 0xf7, 0x78, 0x55, + 0xcd, 0x10, 0x53, 0x3d, 0x01, 0xaa, 0x7b, 0x77, + 0x7d, 0x7b, 0xbc, 0x29, 0xe8, 0x0d, 0x53, 0xdb, + 0xbb, 0xeb, 0xdd, 0xe1, 0x57, 0x34, 0x41, 0x4c, + 0xf4, 0x06, 0xa9, 0xed, 0xdd, 0xf5, 0xee, 0xf0, + 0xa7, 0xa0, 0x35, 0x4f, 0x6e, 0xef, 0xaf, 0x77, + 0x85, 0x5c, 0xd1, 0x05, 0x33, 0xd0, 0x1a, 0xa7, + 0xb7, 0x77, 0xd7, 0xbb, 0xc2, 0x9e, 0x80, 0xd5, + 0x3d, 0xbb, 0xbe, 0xbd, 0xde, 0x15, 0x73, 0x44, + 0x14, 0xcf, 0x40, 0x6a, 0x9e, 0xdd, 0xdf, 0x5e, + 0xef, 0x0a, 0x7a, 0x03, 0x54, 0xf6, 0xee, 0xfa, + 0xf7, 0x78, 0x55, 0xcd, 0x10, 0x53, 0x3d, 0x01, + 0xaa, 0x7b, 0x77, 0x7d, 0x7b, 0xbc, 0x29, 0xe8, + 0x0d, 0x53, 0xdb, 0xbb, 0xeb, 0xdd, 0xe1, 0x57, + 0x34, 0x41, 0x4c, 0xf4, 0x06, 0xa9, 0xed, 0xdd, + 0xf5, 0xee, 0xf0, 0xa7, 0xa0, 0x35, 0x4f, 0x6e, + 0xef, 0xaf, 0x77, 0x85, 0x5c, 0xd1, 0x05, 0x33, + 0xd0, 0x1a, 0xa7, 0xb7, 0x77, 0xd7, 0xbb, 0xc2, + 0x9e, 0x80, 0xd5, 0x3d, 0xbb, 0xbe, 0xbd, 0xde, + 0x15, 0x73, 0x44, 0x14, 0xcf, 0x40, 0x6a, 0x9e, + 0xdd, 0xdf, 0x5e, 0xef, 0x0a, 0x7a, 0x03, 0x54, + 0xf6, 0xee, 0xfa, 0xf7, 0x78, 0x55, 0xcd, 0x10, + 0x53, 0x3d, 0x01, 0xaa, 0x7b, 0x77, 0x7d, 0x7b, + 0xbc, 0x29, 0xe8, 0x0d, 0x53, 0xdb, 0xbb, 0xeb, + 0xdd, 0xe1, 0x57, 0x34, 0x41, 0x4c, 0xf4, 0x06, + 0xa9, 0xed, 0xdd, 0xf5, 0xee, 0xf0, 0xa7, 0xa0, + 0x35, 0x4f, 0x6e, 0xef, 0xaf, 0x77, 0x85, 0x5c, + 0xd1, 0x05, 0x33, 0xd0, 0x1a, 0xa7, 0xb7, 0x77, + 0xd7, 0xbb, 0xc2, 0x9e, 0x80, 0xd5, 0x3d, 0xbb, + 0xbe, 0xbd, 0xde, 0x15, 0x73, 0x44, 0x14, 0xcf, + 0x40, 0x6a, 0x9e, 0xdd, 0xdf, 0x5e, 0xef, 0x0a, + 0x7a, 0x03, 0x54, 0xf6, 0xee, 0xfa, 0xf7, 0x78, + 0x55, 0xcd, 0x10, 0x53, 0x3d, 0x01, 0xaa, 0x7b, + 0x77, 0x7d, 0x7b, 0xbc, 0x29, 0xe8, 0x0d, 0x53, + 0xdb, 0xbb, 0xeb, 0xdd, 0xe1, 0x57, 0x34, 0x41, + 0x4c, 0xf4, 0x06, 0xa9, 0xed, 0xdd, 0xf5, 0xee, + 0xf0, 0xa7, 0xa0, 0x35, 0x4f, 0x6e, 0xef, 0xaf, + 0x77, 0x85, 0x5c, 0xd1, 0x05, 0x33, 0xd0, 0x1a, + 0xa7, 0xb7, 0x77, 0xd7, 0xbb, 0xc2, 0x9e, 0x80, + 0xd5, 0x3d, 0xbb, 0xbe, 0xbd, 0xde, 0x15, 0x73, + 0x44, 0x14, 0xcf, 0x40, 0x6a, 0x9e, 0xdd, 0xdf, + 0x5e, 0xef, 0x0a, 0x7a, 0x03, 0x54, 0xf6, 0xee, + 0xfa, 0xf7, 0x78, 0x55, 0xcd, 0x10, 0x53, 0x3d, + 0x01, 0xaa, 0x7b, 0x77, 0x7d, 0x7b, 0xbc, 0x29, + 0xe8, 0x0d, 0x53, 0xdb, 0xbb, 0xeb, 0xdd, 0xe1, + 0x57, 0x34, 0x41, 0x4c, 0xf4, 0x06, 0xa9, 0xed, + 0xdd, 0xf5, 0xee, 0xf0, 0xa7, 0xa0, 0x35, 0x4f, + 0x6e, 0xef, 0xaf, 0x77, 0x85, 0x5c, 0xd1, 0x05, + 0x33, 0xd0, 0x1a, 0xa7, 0xb7, 0x77, 0xd7, 0xbb, + 0xc2, 0x9e, 0x80, 0xd5, 0x3d, 0xbb, 0xbe, 0xbd, + 0xde, 0x15, 0x73, 0x44, 0x14, 0xcf, 0x40, 0x6a, + 0x9e, 0xdd, 0xdf, 0x5e, 0xef, 0x0a, 0x7a, 0x03, + 0x54, 0xf6, 0xee, 0xfa, 0xf7, 0x78, 0x55, 0xcd, + 0x10, 0x53, 0x3d, 0x01, 0xaa, 0x7b, 0x77, 0x7d, + 0x7b, 0xbc, 0x29, 0xe8, 0x0d, 0x53, 0xdb, 0xbb, + 0xeb, 0xdd, 0xe1, 0x57, 0x34, 0x41, 0x4c, 0xf4, + 0x06, 0xa9, 0xed, 0xdd, 0xf5, 0xee, 0xf0, 0xa7, + 0xa0, 0x35, 0x4f, 0x6e, 0xef, 0xaf, 0x77, 0x85, + 0x5c, 0xd1, 0x05, 0x33, 0xd0, 0x1a, 0xa7, 0xb7, + 0x77, 0xd7, 0xbb, 0xc2, 0x9e, 0x80, 0xd5, 0x3d, + 0xbb, 0xbe, 0xbd, 0xde, 0x15, 0x73, 0x44, 0x14, + 0xcf, 0x40, 0x6a, 0x9e, 0xdd, 0xdf, 0x5e, 0xef, + 0x0a, 0x7a, 0x03, 0x54, 0xf6, 0xee, 0xfa, 0xf7, + 0x78, 0x55, 0xcd, 0x10, 0x53, 0x3d, 0x01, 0xaa, + 0x7b, 0x77, 0x7d, 0x7b, 0xbc, 0x29, 0xe8, 0x0d, + 0x53, 0xdb, 0xbb, 0xeb, 0xdd, 0xe1, 0x57, 0x34, + 0x41, 0x4c, 0xf4, 0x06, 0xa9, 0xed, 0xdd, 0xf5, + 0xee, 0xf0, 0xa7, 0xa0, 0x35, 0x4f, 0x6e, 0xef, + 0xaf, 0x77, 0x85, 0x5c, 0xd1, 0x05, 0x33, 0xd0, + 0x1a, 0xa7, 0xb7, 0x77, 0xd7, 0xbb, 0xc2, 0x9e, + 0x80, 0xd5, 0x3d, 0xbb, 0xbe, 0xbd, 0xde, 0x15, + 0x73, 0x44, 0x14, 0xcf, 0x40, 0x6a, 0x9e, 0xdd, + 0xdf, 0x5e, 0xef, 0x0a, 0x7a, 0x03, 0x54, 0xf6, + 0xee, 0xfa, 0xf7, 0x78, 0x55, 0xcd, 0x10, 0x53, + 0x3d, 0x01, 0xaa, 0x7b, 0x77, 0x7d, 0x7b, 0xbc, + 0x29, 0xe8, 0x0d, 0x53, 0xdb, 0xbb, 0xeb, 0xdd, + 0xe1, 0x57, 0x34, 0x41, 0x4c, 0xf4, 0x06, 0xa9, + 0xed, 0xdd, 0xf5, 0xee, 0xf0, 0xa7, 0xa0, 0x35, + 0x4f, 0x6e, 0xef, 0xaf, 0x77, 0x85, 0x5c, 0xd1, + 0x05, 0x33, 0xd0, 0x1a, 0xa7, 0xb7, 0x77, 0xd7, + 0xbb, 0xc2, 0x9e, 0x80, 0xd5, 0x3d, 0xbb, 0xbe, + 0xbd, 0xde, 0x15, 0x73, 0x44, 0x14, 0xcf, 0x40, + 0x6a, 0x9e, 0xdd, 0xdf, 0x5e, 0xef, 0x0a, 0x7a, + 0x03, 0x54, 0xf6, 0xee, 0xfa, 0xf7, 0x78, 0x55, + 0xcd, 0x10, 0x53, 0x3d, 0x01, 0xaa, 0x7b, 0x77, + 0x7d, 0x7b, 0xbc, 0x29, 0xe8, 0x0d, 0x53, 0xdb, + 0xbb, 0xeb, 0xdd, 0xe1, 0x57, 0x34, 0x41, 0x4c, + 0xf4, 0x06, 0xa9, 0xed, 0xdd, 0xf5, 0xee, 0xf0, + 0xa7, 0xa0, 0x35, 0x4f, 0x6e, 0xef, 0xaf, 0x77, + 0x85, 0x5c, 0xd1, 0x05, 0x22, 0xdb, 0xd3, 0x18, + 0xec, 0xcd, 0xad, 0xb5, 0xd4, 0xef, 0x71, 0x91, + 0xed, 0xab, 0x4c, 0x8e, 0x78, 0xe1, 0x27, 0xbe, + 0xae, 0xe1, 0x55, 0x33, 0x7f, 0x9a, 0x6c, 0x3b, + 0xf1, 0xfe, 0xf2, 0xb5, 0x84, 0x12, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x0a, 0xa7, 0xaa, + 0xfe, 0xfa, 0xc7, 0xf7, 0x87, 0xf7, 0x15, 0xb1, + 0x54, 0xf5, 0x5f, 0xdf, 0x58, 0xfe, 0xf3, 0x7f, + 0xb8, 0x10, 0x5a, 0xd4, 0xa8, 0xe5, 0x52, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x82, 0xa7, 0x9b, 0xfc, 0xd3, 0x63, 0xdf, 0x8f, + 0xf7, 0x95, 0xad, 0x55, 0x33, 0x7f, 0x9a, 0x6c, + 0x7b, 0xf1, 0xfe, 0xf2, 0xb5, 0xa0, 0x94, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x55, 0x3d, + 0x57, 0xf7, 0xd6, 0x3f, 0xbc, 0xdf, 0xee, 0x05, + 0x6c, 0x55, 0x3d, 0x57, 0xf7, 0xd6, 0x3f, 0xbc, + 0xdf, 0xee, 0x04, 0x16, 0xbe, 0x55, 0x2a, 0x39, + 0x54, 0xa0, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0xa9, 0xe6, 0xff, 0x00, 0x34, + 0xd8, 0xf7, 0xe3, 0xfd, 0xe5, 0x6b, 0x55, 0x4c, + 0xdf, 0xe6, 0x9b, 0x1e, 0xfc, 0x7f, 0xbc, 0xad, + 0x63, 0x95, 0x04, 0xa2, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0xa9, 0xea, 0xbf, 0xbe, 0xb1, + 0xfd, 0xe6, 0xff, 0x00, 0x70, 0x2b, 0x62, 0xa9, + 0xea, 0xbf, 0xbe, 0xb1, 0xfd, 0xe1, 0xfd, 0xc0, + 0x82, 0xd7, 0xca, 0xa5, 0x42, 0x94, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x5e, 0x57, 0x13, 0xc7, 0x6f, + 0x03, 0xe6, 0x93, 0x63, 0x23, 0x1c, 0x4e, 0xa6, + 0xdd, 0x8b, 0xd5, 0x60, 0xe6, 0x6b, 0xe8, 0xab, + 0xaa, 0x6f, 0xea, 0xcd, 0x11, 0x63, 0x7b, 0xd6, + 0x6b, 0xc8, 0x61, 0xb5, 0x37, 0x6f, 0x27, 0xaa, + 0x68, 0xe3, 0x24, 0x0d, 0xb4, 0x5e, 0xed, 0x70, + 0x73, 0x43, 0x86, 0xe2, 0x2a, 0x3d, 0xd5, 0x5a, + 0xbe, 0xb9, 0xcd, 0x1c, 0x2b, 0xd9, 0x25, 0x9c, + 0x6d, 0x87, 0xab, 0x15, 0x93, 0xac, 0xa9, 0xe1, + 0xd9, 0xb7, 0x86, 0x8b, 0x3a, 0xd6, 0x59, 0x3d, + 0x32, 0xe6, 0x71, 0x12, 0xc1, 0x6d, 0x19, 0x0d, + 0xae, 0xca, 0xf3, 0xd1, 0x19, 0xe1, 0x0d, 0xc2, + 0x55, 0x55, 0x67, 0x96, 0xe1, 0xf6, 0x8f, 0x68, + 0x95, 0xc1, 0xc7, 0x20, 0x23, 0x06, 0xa7, 0xe2, + 0xf3, 0x2f, 0x56, 0x63, 0x4f, 0x97, 0xdc, 0xd9, + 0x75, 0xf2, 0xf9, 0x33, 0x22, 0x64, 0xa0, 0x71, + 0xbb, 0x8b, 0x8c, 0xd7, 0xf6, 0x93, 0xb7, 0x85, + 0xaf, 0x6f, 0x1a, 0x59, 0x50, 0x9a, 0x2a, 0xdb, + 0x66, 0x8e, 0x6c, 0x3d, 0xa3, 0xef, 0xae, 0x5d, + 0x1c, 0x6d, 0x04, 0x39, 0x8c, 0x75, 0x24, 0x94, + 0xb7, 0x60, 0xa1, 0xad, 0x4a, 0xc5, 0x8a, 0xe5, + 0xed, 0xb2, 0xcb, 0x45, 0x6e, 0xf9, 0x99, 0x0c, + 0x4c, 0x6b, 0xa1, 0xeb, 0xab, 0xc6, 0xd2, 0x7b, + 0xfb, 0x79, 0x10, 0x8f, 0x9d, 0x78, 0xd2, 0xdd, + 0x54, 0x55, 0xb1, 0x0c, 0x96, 0x33, 0xe3, 0xee, + 0x5b, 0x34, 0x8f, 0x96, 0xe5, 0xed, 0x8e, 0x70, + 0xe7, 0x12, 0xd7, 0x07, 0x0a, 0xec, 0x69, 0xd8, + 0x16, 0xfe, 0xe4, 0x91, 0x6d, 0x29, 0x1b, 0x08, + 0x63, 0x88, 0xe8, 0x49, 0xd9, 0x77, 0xc2, 0xfc, + 0x0f, 0xa5, 0xbd, 0x6a, 0x95, 0x55, 0x18, 0xad, + 0x6e, 0x45, 0x8d, 0x85, 0xdb, 0x6e, 0x24, 0xf2, + 0x89, 0xe4, 0x11, 0xbc, 0x97, 0x92, 0xd2, 0xc3, + 0x5d, 0x9c, 0x2b, 0x3e, 0x06, 0x9b, 0x4b, 0xab, + 0xfb, 0x36, 0x5c, 0x3a, 0x28, 0x1b, 0x1b, 0x1e, + 0xd9, 0x64, 0x71, 0x77, 0x01, 0x77, 0xc6, 0x35, + 0x71, 0x49, 0xd9, 0xb3, 0xdb, 0xe0, 0x37, 0xf5, + 0x45, 0x52, 0x8a, 0x7b, 0x6b, 0x6c, 0x9d, 0x98, + 0xb0, 0x92, 0xe1, 0xe1, 0xef, 0x31, 0xcc, 0xf9, + 0x0b, 0x9d, 0x1b, 0xc5, 0x09, 0xab, 0x4b, 0x8d, + 0x39, 0x16, 0x7d, 0x85, 0xb4, 0xd7, 0xf2, 0x3b, + 0x24, 0x67, 0x7b, 0x25, 0x6c, 0xce, 0x6b, 0x40, + 0x27, 0x83, 0x81, 0xa7, 0x86, 0x85, 0x9b, 0x92, + 0x3b, 0x7c, 0x09, 0x6d, 0xe3, 0xbc, 0x86, 0x4b, + 0xa9, 0x6d, 0x5a, 0x49, 0x96, 0x10, 0x1c, 0xf1, + 0x4d, 0x94, 0x76, 0xed, 0xab, 0xee, 0x49, 0x9b, + 0x19, 0x60, 0x2d, 0x71, 0xeb, 0x0f, 0x08, 0xe1, + 0x15, 0xa6, 0xca, 0xed, 0xe6, 0x5a, 0x09, 0x6c, + 0x1b, 0x7b, 0x9e, 0xbd, 0x12, 0x48, 0xf6, 0x46, + 0xd8, 0xd8, 0x78, 0x58, 0xe2, 0xd2, 0x4f, 0x0e, + 0xc3, 0x50, 0xa2, 0xd2, 0xea, 0xe1, 0xd6, 0xd6, + 0x4c, 0x74, 0x8e, 0x3d, 0x5d, 0xdb, 0xa2, 0xad, + 0x76, 0xb9, 0xac, 0xe2, 0x03, 0x8b, 0x9d, 0x48, + 0x9d, 0x9d, 0xb9, 0xd1, 0x3d, 0xbd, 0xde, 0x65, + 0x92, 0xa8, 0xaa, 0xec, 0xb4, 0x92, 0xe6, 0xde, + 0xfa, 0xea, 0x49, 0xe5, 0xe3, 0xb7, 0x96, 0x43, + 0x6e, 0x1a, 0xe2, 0xd0, 0xde, 0x13, 0xb8, 0xf3, + 0xa8, 0xb9, 0xc9, 0x9b, 0x97, 0x5a, 0x5b, 0x5c, + 0x89, 0x9d, 0x13, 0xe0, 0x12, 0xcb, 0xe4, 0xe1, + 0xdc, 0x45, 0xfb, 0x37, 0x96, 0xee, 0x0a, 0xf1, + 0xaf, 0x67, 0x8e, 0xdf, 0x91, 0xdb, 0xdc, 0xb4, + 0xa9, 0x5a, 0x6c, 0x0d, 0xc4, 0x85, 0xf3, 0x40, + 0xd6, 0xcc, 0x2d, 0x98, 0x41, 0x80, 0xce, 0xd2, + 0x1d, 0x42, 0x36, 0x8a, 0xbb, 0x7a, 0xdc, 0x20, + 0x94, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x41, 0x53, 0xcd, 0xfe, 0x69, + 0xb0, 0xef, 0xc7, 0xfb, 0xca, 0xd6, 0x39, 0x55, + 0x53, 0x37, 0xf9, 0xa6, 0xc3, 0xbf, 0x1f, 0xef, + 0x2b, 0x58, 0xe5, 0x41, 0x28, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0xaa, 0x5a, 0xaf, 0xef, + 0xbc, 0x77, 0x79, 0xbf, 0xdc, 0x0a, 0xda, 0xaa, + 0x5a, 0xaf, 0xef, 0xbc, 0x77, 0x79, 0xbf, 0xdc, + 0x08, 0x2d, 0x9c, 0xaa, 0x54, 0x72, 0xa9, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x10, 0xb1, 0xb2, 0x30, + 0x49, 0x71, 0x63, 0x3c, 0x11, 0xfc, 0x79, 0x18, + 0x5a, 0xda, 0xf3, 0xac, 0xa4, 0x49, 0x8b, 0x1a, + 0xeb, 0xcb, 0x39, 0xa6, 0xc4, 0xbe, 0xd1, 0x83, + 0xf8, 0xa6, 0x30, 0xc1, 0x5d, 0xd5, 0x58, 0xf7, + 0x36, 0x79, 0x18, 0x2f, 0x59, 0x79, 0x67, 0x1b, + 0x66, 0x73, 0xa2, 0x11, 0x4b, 0x1b, 0xdd, 0xc2, + 0x05, 0x37, 0x10, 0x56, 0xe5, 0x13, 0x89, 0xcb, + 0xa2, 0xbd, 0x16, 0x1e, 0xfc, 0x40, 0xd6, 0xc8, + 0x1a, 0x5f, 0xe5, 0x82, 0xe1, 0xd4, 0x3f, 0xb3, + 0xca, 0xb3, 0xdb, 0x67, 0x38, 0xc8, 0xdc, 0xdc, + 0x50, 0x75, 0x72, 0xc2, 0xc6, 0x37, 0x9f, 0x89, + 0xb5, 0xaf, 0xc2, 0xb6, 0x4b, 0xca, 0xea, 0x57, + 0x43, 0x03, 0xe4, 0x68, 0x69, 0x2d, 0x15, 0x01, + 0xc7, 0x84, 0x74, 0xa4, 0xed, 0xed, 0xd2, 0x8e, + 0xde, 0x36, 0xd0, 0xc7, 0x89, 0xc8, 0xdb, 0x32, + 0xd2, 0x56, 0x43, 0x1d, 0xc4, 0xb0, 0x07, 0x35, + 0xd1, 0x3c, 0xd0, 0x0e, 0x23, 0xb1, 0xc0, 0xd0, + 0xa3, 0xf1, 0x59, 0x49, 0x9b, 0x90, 0x7c, 0xdc, + 0x3c, 0x77, 0xb1, 0x34, 0x31, 0xa0, 0xec, 0x69, + 0x6f, 0xec, 0x77, 0x7b, 0xeb, 0x74, 0xfb, 0xfb, + 0x48, 0x5b, 0x59, 0xe6, 0x64, 0x66, 0x80, 0xb8, + 0x17, 0x0d, 0x95, 0x58, 0xd9, 0x2c, 0xcd, 0xb5, + 0x9d, 0xb4, 0x53, 0xb5, 0xec, 0x7b, 0x66, 0x70, + 0x6b, 0x4f, 0x15, 0x01, 0x07, 0x94, 0x27, 0xfe, + 0x08, 0xdf, 0xec, 0xfa, 0xdb, 0xca, 0xea, 0xc2, + 0xe6, 0x51, 0x62, 0x18, 0x36, 0xdb, 0x4a, 0xc7, + 0xc9, 0xde, 0x00, 0xd6, 0x8b, 0x65, 0x33, 0x4b, + 0xe1, 0x7b, 0x1b, 0xbd, 0xcd, 0x20, 0x77, 0xc8, + 0x5f, 0x12, 0xdf, 0xd9, 0xc2, 0xc6, 0x3e, 0x69, + 0x99, 0x1b, 0x64, 0xda, 0xc7, 0x39, 0xc0, 0x03, + 0xde, 0x5f, 0x46, 0xe2, 0x01, 0x1b, 0x65, 0x2f, + 0x68, 0x8d, 0xdf, 0x15, 0xf5, 0xd8, 0x7d, 0xd5, + 0x32, 0xdb, 0x13, 0xd6, 0xfc, 0x48, 0xf9, 0x53, + 0x56, 0xcc, 0x65, 0xcb, 0x6c, 0x2c, 0x20, 0x20, + 0x71, 0xdb, 0x48, 0xd7, 0x49, 0xb7, 0x65, 0x00, + 0x21, 0x7c, 0x64, 0x31, 0x17, 0x57, 0x53, 0xde, + 0xbd, 0x94, 0xe1, 0x9e, 0x36, 0x36, 0x30, 0x79, + 0x4b, 0x4d, 0x48, 0x3d, 0xf5, 0xe9, 0x90, 0xd4, + 0x56, 0xd0, 0x3a, 0x16, 0x5a, 0x3e, 0x2b, 0x89, + 0x26, 0x77, 0x0e, 0xd7, 0x86, 0x80, 0x3b, 0xa5, + 0x67, 0x3b, 0x25, 0x67, 0x09, 0x11, 0xdc, 0xcd, + 0x1c, 0x53, 0x10, 0x09, 0x8c, 0xb8, 0x57, 0x6a, + 0xb3, 0xb6, 0xe7, 0x9c, 0xcf, 0x89, 0xcb, 0xb9, + 0xaa, 0x7d, 0x96, 0x5e, 0xe2, 0x5b, 0x37, 0xba, + 0x08, 0xad, 0xa2, 0xb4, 0x94, 0x3b, 0xa9, 0x61, + 0x04, 0x10, 0x41, 0x05, 0xdb, 0x85, 0x3b, 0xcb, + 0xda, 0x0b, 0x4c, 0xad, 0x9c, 0xce, 0xb6, 0xb7, + 0x6b, 0x4d, 0xa4, 0x92, 0x99, 0x3a, 0xf2, 0x7c, + 0x66, 0x87, 0x6d, 0x2d, 0xe0, 0x5b, 0x49, 0xae, + 0xed, 0xa0, 0x60, 0x92, 0x69, 0x1b, 0x1b, 0x1d, + 0xb0, 0x39, 0xc4, 0x00, 0x57, 0xd1, 0x9e, 0x16, + 0xc7, 0xd6, 0x97, 0xb4, 0x45, 0x4a, 0xf1, 0xd7, + 0xc5, 0xa7, 0x3d, 0x52, 0xfb, 0x77, 0xd8, 0xc0, + 0x86, 0xca, 0x76, 0x65, 0x2e, 0xee, 0x9c, 0x07, + 0x57, 0x33, 0x18, 0xd6, 0x1e, 0x5a, 0xb4, 0x51, + 0x62, 0xdb, 0xe2, 0xaf, 0x18, 0xc8, 0x5a, 0xe0, + 0x2b, 0x1d, 0xd3, 0xe7, 0x76, 0xdf, 0xd8, 0x77, + 0x15, 0x3e, 0x15, 0xb7, 0xb7, 0xbb, 0xb6, 0xb9, + 0x69, 0x75, 0xbc, 0xad, 0x94, 0x0d, 0xe5, 0x86, + 0xab, 0xd9, 0x4a, 0xed, 0xdf, 0x64, 0xed, 0xed, + 0xfc, 0xbe, 0x56, 0xa2, 0xdf, 0x1d, 0x73, 0x1d, + 0x9d, 0xec, 0x4e, 0x03, 0x8e, 0xe1, 0xf2, 0x39, + 0x80, 0x73, 0x38, 0x9a, 0x55, 0x78, 0x0c, 0x6e, + 0x42, 0xd5, 0xb6, 0x77, 0x36, 0xad, 0x6b, 0xee, + 0x21, 0x88, 0x43, 0x34, 0x4e, 0x34, 0x6b, 0x86, + 0xff, 0x00, 0x8d, 0xdc, 0x2b, 0x7c, 0x8a, 0xf1, + 0xbf, 0x67, 0x84, 0x4c, 0x7c, 0xc9, 0xfa, 0xf8, + 0xb0, 0xac, 0x06, 0x44, 0x87, 0xc9, 0x7d, 0xc2, + 0xd2, 0xf3, 0xe2, 0x42, 0xda, 0x10, 0xc0, 0x3f, + 0xdd, 0xcb, 0x55, 0x98, 0xa5, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x45, 0x50, 0x4a, 0x85, + 0x83, 0x7d, 0x9a, 0xc6, 0xd9, 0x3f, 0xaa, 0x9e, + 0x66, 0xf5, 0xe7, 0x68, 0x85, 0xa6, 0xaf, 0x3d, + 0xe6, 0xad, 0x3c, 0x9a, 0x93, 0x22, 0xe7, 0x9e, + 0x1b, 0x76, 0x41, 0x0d, 0x7c, 0x59, 0x1c, 0xfa, + 0xbc, 0x8e, 0xeb, 0x08, 0xd8, 0xac, 0x44, 0xce, + 0xe4, 0x99, 0x88, 0xde, 0xb3, 0x29, 0x55, 0xa9, + 0x75, 0x44, 0xec, 0x61, 0x30, 0x42, 0xc9, 0x9d, + 0x41, 0x40, 0xe7, 0x70, 0x6d, 0xe5, 0x5b, 0x5c, + 0x56, 0x66, 0xd3, 0x27, 0x17, 0x14, 0x47, 0x86, + 0x56, 0xff, 0x00, 0x32, 0x27, 0x6c, 0x70, 0xf7, + 0x39, 0x92, 0x71, 0x98, 0xdf, 0x04, 0x65, 0x12, + 0xd8, 0x22, 0x85, 0x2a, 0x28, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x83, 0xe1, 0xf2, + 0xc6, 0xc3, 0x47, 0x1a, 0x2f, 0x9f, 0x29, 0x83, + 0xe5, 0x85, 0xf3, 0x75, 0x6e, 0xd9, 0xa3, 0x20, + 0xfc, 0x60, 0x36, 0x15, 0x85, 0x67, 0x6b, 0x1c, + 0xa1, 0xcc, 0x93, 0xe3, 0xb4, 0xd0, 0xa0, 0xcf, + 0xf2, 0xa8, 0x3e, 0x58, 0x4f, 0x29, 0x83, 0xe5, + 0x85, 0xe3, 0xe8, 0xdb, 0x7e, 0xea, 0x7a, 0x36, + 0x0e, 0xea, 0x0f, 0x6f, 0x29, 0x83, 0xe5, 0x85, + 0x22, 0x78, 0x49, 0xa0, 0x78, 0xe9, 0x58, 0xfe, + 0x8d, 0x83, 0xba, 0xbc, 0xe6, 0xc7, 0x46, 0xc8, + 0x8b, 0x98, 0x48, 0x73, 0x45, 0x50, 0x67, 0x85, + 0x2b, 0xc2, 0xca, 0x43, 0x25, 0xbb, 0x5c, 0xed, + 0xfb, 0x97, 0xba, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x0a, 0x9e, 0x6f, + 0xf3, 0x4d, 0x87, 0x7e, 0x3f, 0xde, 0x56, 0xb1, + 0xca, 0xaa, 0x99, 0xbf, 0xcd, 0x36, 0x1d, 0xf8, + 0xff, 0x00, 0x79, 0x5a, 0xc7, 0x2a, 0x09, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, 0x52, + 0xd5, 0x7f, 0x7d, 0xe3, 0xbb, 0xcd, 0xfe, 0xe0, + 0x56, 0xd5, 0x52, 0xd5, 0x7f, 0x7d, 0x63, 0xbb, + 0xcd, 0xfe, 0xe0, 0x41, 0x6c, 0xe5, 0x52, 0xa3, + 0x95, 0x4a, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x2d, 0x7e, 0x70, 0xff, + 0x00, 0xf5, 0x57, 0x3f, 0x30, 0xfc, 0x21, 0x6c, + 0x16, 0x35, 0xf5, 0xaf, 0x95, 0xda, 0xc9, 0x6e, + 0x49, 0x68, 0x90, 0x53, 0x88, 0x72, 0x29, 0x27, + 0x16, 0x9a, 0xde, 0xd6, 0x09, 0xf3, 0x8e, 0xeb, + 0x9a, 0x24, 0x0d, 0xb5, 0x88, 0x06, 0xbb, 0x6b, + 0x76, 0x83, 0xc8, 0xb0, 0x9d, 0x14, 0x67, 0x16, + 0xe8, 0xdc, 0xd6, 0xb9, 0xb1, 0x5f, 0x16, 0x46, + 0x08, 0x06, 0x8d, 0xe6, 0x56, 0x08, 0x31, 0xbd, + 0x4d, 0xe3, 0xae, 0xb8, 0xc9, 0x2e, 0x89, 0xb1, + 0x70, 0xd3, 0xe4, 0x72, 0xac, 0x79, 0x30, 0x7c, + 0x56, 0x92, 0xdb, 0x89, 0x4b, 0x5d, 0x24, 0xc6, + 0x76, 0xc9, 0xc3, 0x5e, 0x17, 0x1e, 0x4a, 0x2b, + 0x7b, 0x7a, 0x7e, 0x27, 0x0f, 0x73, 0x02, 0x41, + 0x79, 0x26, 0x5a, 0xe5, 0x90, 0xd9, 0xc5, 0x75, + 0x1c, 0x2c, 0x63, 0x5a, 0xc9, 0x5d, 0xc0, 0xd6, + 0x02, 0x3f, 0x64, 0x50, 0xef, 0x5f, 0x33, 0x5a, + 0x5e, 0xb7, 0x1c, 0xd8, 0x2f, 0x18, 0xd8, 0x9a, + 0xfb, 0x96, 0x98, 0xd8, 0xd7, 0x71, 0xf0, 0xb4, + 0xd7, 0xc5, 0xaa, 0xd9, 0x4f, 0x88, 0xb9, 0x74, + 0xcd, 0xb9, 0xb7, 0xb9, 0xea, 0x2e, 0x78, 0x03, + 0x25, 0x93, 0x84, 0x10, 0xfa, 0x72, 0xf0, 0xaf, + 0x4f, 0x44, 0x93, 0x6d, 0x1c, 0x2f, 0x99, 0xd2, + 0x3d, 0x92, 0x09, 0x5f, 0x23, 0xb6, 0xd4, 0x8e, + 0x61, 0xc8, 0x97, 0xf2, 0xf8, 0xc8, 0xc3, 0xc8, + 0x59, 0x59, 0xb3, 0x25, 0x8e, 0x6b, 0x60, 0x8c, + 0x0e, 0x33, 0xb9, 0xa0, 0x2c, 0x4b, 0xe7, 0x43, + 0x38, 0xbb, 0x8e, 0xc2, 0xcb, 0xca, 0x1c, 0x38, + 0xfa, 0xf9, 0xe6, 0xf1, 0x78, 0x5c, 0x3e, 0x43, + 0x88, 0x3b, 0x96, 0xf6, 0xe6, 0xc4, 0x5c, 0x5c, + 0xdb, 0xce, 0x5c, 0x47, 0x93, 0x92, 0x78, 0x79, + 0xea, 0xb0, 0x9d, 0x82, 0x9c, 0x99, 0x62, 0x6d, + 0xd3, 0x99, 0x67, 0x33, 0x9c, 0xe7, 0xc0, 0x1b, + 0xb6, 0xae, 0xdf, 0x47, 0xef, 0x53, 0xe5, 0x36, + 0x47, 0x3f, 0x63, 0x07, 0x1c, 0xc6, 0xde, 0x4f, + 0x61, 0x0d, 0xc8, 0xeb, 0x22, 0x6d, 0x9f, 0x10, + 0x63, 0xb6, 0x82, 0xea, 0x81, 0x5d, 0xab, 0xdf, + 0x35, 0x14, 0x96, 0xf1, 0x58, 0xd8, 0xd9, 0xc6, + 0x24, 0x63, 0xa5, 0xfe, 0x53, 0xdd, 0x46, 0xb8, + 0x00, 0x4f, 0x09, 0x76, 0xd5, 0x91, 0xe8, 0x39, + 0x23, 0xb7, 0xb6, 0x6d, 0xb5, 0xc1, 0x8a, 0xe2, + 0xd9, 0x9d, 0x5b, 0x66, 0xe1, 0xe2, 0x25, 0x9c, + 0xc4, 0x15, 0xed, 0x36, 0x20, 0x4d, 0x62, 0xcb, + 0x67, 0xca, 0xee, 0xb5, 0x87, 0x8d, 0xb3, 0xf2, + 0x87, 0xfc, 0xaa, 0x2b, 0x3c, 0x24, 0xf9, 0xb1, + 0x2c, 0x6d, 0x72, 0x6c, 0xc8, 0xb6, 0x77, 0x5a, + 0x43, 0x67, 0x0f, 0x09, 0x6c, 0x8d, 0x8a, 0x4e, + 0x2a, 0x9e, 0x43, 0xc2, 0x1a, 0x16, 0xf1, 0x60, + 0x59, 0x63, 0xee, 0xa2, 0x98, 0xcf, 0x79, 0x74, + 0x6e, 0x5e, 0x1b, 0xc2, 0xc0, 0x1b, 0xc0, 0xd0, + 0x3b, 0xc3, 0x7a, 0xd8, 0x22, 0x08, 0x88, 0x8a, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x28, 0xaa, 0x09, 0x50, 0xb1, + 0x32, 0x39, 0x5b, 0x0c, 0x6c, 0x7d, 0x65, 0xec, + 0xec, 0x84, 0x1f, 0x8a, 0x1c, 0x40, 0x2e, 0x3c, + 0xcd, 0x07, 0x7a, 0xa8, 0x66, 0xb5, 0xa5, 0xfb, + 0xc1, 0xf2, 0x26, 0xb6, 0xd2, 0xcc, 0x6f, 0xba, + 0x94, 0xd1, 0xe4, 0x7f, 0xb5, 0x8e, 0xde, 0x89, + 0x6b, 0x65, 0xfe, 0x6f, 0x19, 0x8f, 0x3c, 0x37, + 0x77, 0x0c, 0x8e, 0x42, 0x2a, 0xd8, 0xea, 0x38, + 0xc8, 0xee, 0x35, 0x56, 0xee, 0x35, 0x06, 0x5f, + 0x22, 0xe7, 0x75, 0x0c, 0x65, 0x95, 0x80, 0x34, + 0x33, 0x17, 0x56, 0x57, 0x8f, 0x99, 0x4d, 0x9d, + 0x2b, 0x9d, 0x65, 0xb5, 0x5d, 0xb8, 0x9d, 0xcf, + 0xb3, 0x06, 0xe6, 0xe4, 0xfc, 0x6b, 0xa9, 0x86, + 0xe3, 0xfe, 0xc6, 0xbb, 0x72, 0xdb, 0xe9, 0x5b, + 0xb9, 0xee, 0xf1, 0x4e, 0x9e, 0xe1, 0xe5, 0xd2, + 0x3a, 0x53, 0x53, 0xee, 0x2d, 0xe1, 0x8c, 0x65, + 0x31, 0x0c, 0xe7, 0x94, 0xc4, 0x5b, 0x7d, 0xc7, + 0x6b, 0x0c, 0x8e, 0x7c, 0x0c, 0xe3, 0x95, 0xdf, + 0x1a, 0x79, 0x7c, 0x77, 0x93, 0xdc, 0xae, 0xe5, + 0xe4, 0xf7, 0xb9, 0xc4, 0xb9, 0xe4, 0xb8, 0x9e, + 0x75, 0xf0, 0x49, 0x50, 0x49, 0xde, 0xbb, 0xc4, + 0x44, 0x6c, 0x71, 0x99, 0x99, 0xde, 0x92, 0x76, + 0xd7, 0x97, 0x9d, 0x7c, 0xb6, 0xea, 0xe6, 0xce, + 0xe1, 0x97, 0xf6, 0x9b, 0x66, 0x8b, 0x6b, 0x99, + 0x5a, 0x07, 0xb7, 0x94, 0x39, 0x41, 0x2b, 0xe7, + 0x8a, 0x89, 0x94, 0x5e, 0xc5, 0x89, 0xa9, 0xb7, + 0x41, 0xc3, 0xe5, 0xed, 0xb2, 0xd6, 0x31, 0xdd, + 0xdb, 0x9d, 0x8f, 0x1e, 0x33, 0x79, 0x5a, 0xee, + 0x50, 0x56, 0x72, 0xe6, 0x18, 0xec, 0xb4, 0xb8, + 0x0c, 0x80, 0xba, 0x69, 0x2e, 0xb0, 0x98, 0x81, + 0x75, 0x1f, 0xc9, 0xae, 0xce, 0x30, 0xba, 0x55, + 0xbd, 0xc4, 0x57, 0x30, 0xb2, 0x78, 0x5c, 0x1f, + 0x14, 0x80, 0x39, 0xae, 0x1c, 0xa0, 0xaf, 0x36, + 0x78, 0xce, 0x32, 0xef, 0x8c, 0xf9, 0xa1, 0xec, + 0x88, 0x8a, 0x28, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, 0x17, + 0x8c, 0xb7, 0xb6, 0xb0, 0x9a, 0x49, 0x23, 0x5a, + 0x79, 0x89, 0x5f, 0x19, 0x1b, 0x9f, 0x25, 0xb3, + 0x96, 0x71, 0xbd, 0x8d, 0xd9, 0xdf, 0x55, 0x08, + 0xed, 0x9d, 0x75, 0x13, 0xee, 0x6e, 0x1e, 0x5c, + 0xe7, 0x54, 0x81, 0xcc, 0x90, 0x2e, 0x91, 0xdc, + 0x45, 0x33, 0x0b, 0xe3, 0x70, 0x73, 0x47, 0x28, + 0x58, 0xd6, 0x27, 0x8e, 0x69, 0xa4, 0x1b, 0x89, + 0xa5, 0x56, 0xa7, 0x07, 0x23, 0x99, 0x88, 0x73, + 0x1a, 0x7c, 0x67, 0xbc, 0x80, 0xb7, 0x76, 0xcc, + 0x10, 0xc4, 0x19, 0xcb, 0xca, 0x83, 0x25, 0x17, + 0x9f, 0x19, 0x4e, 0x32, 0x83, 0xd1, 0x78, 0x5d, + 0xbb, 0x86, 0xdd, 0xe7, 0x94, 0x8a, 0x05, 0xf7, + 0xc6, 0xb1, 0x6f, 0x1e, 0x64, 0x7c, 0x70, 0x0d, + 0xee, 0x35, 0x28, 0x22, 0xce, 0xf2, 0xd2, 0x28, + 0x5b, 0x1b, 0xe4, 0x6b, 0x5f, 0xca, 0x09, 0x59, + 0xad, 0x7b, 0x5e, 0x38, 0x98, 0x43, 0x87, 0x38, + 0xda, 0xa9, 0xb7, 0x56, 0x8c, 0x97, 0x2d, 0x3c, + 0x4e, 0x71, 0x1c, 0x3b, 0x8a, 0xcf, 0xd3, 0x77, + 0x33, 0x45, 0x77, 0x25, 0x84, 0xae, 0x2e, 0x14, + 0xab, 0x2a, 0x82, 0xca, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, 0xa7, 0x9b, + 0xfc, 0xd3, 0x61, 0xdf, 0x8f, 0xf7, 0x95, 0xac, + 0x72, 0xaa, 0xa6, 0x6f, 0xf3, 0x4d, 0x87, 0x7e, + 0x3f, 0xde, 0x56, 0xb1, 0xca, 0x82, 0x51, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x54, 0xf5, + 0x5f, 0xdf, 0x58, 0xfe, 0xf0, 0xfe, 0xe0, 0x56, + 0xc5, 0x53, 0xd5, 0x7f, 0x7d, 0x63, 0xfb, 0xcd, + 0xfe, 0xe0, 0x41, 0x6b, 0x52, 0xa3, 0x95, 0x4a, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x84, 0x12, 0xa2, 0xab, 0xc6, 0xee, + 0xfa, 0xd2, 0xca, 0x23, 0x35, 0xdc, 0xcc, 0x82, + 0x31, 0xbd, 0xcf, 0x20, 0x05, 0x57, 0xcc, 0xeb, + 0x39, 0x78, 0x4b, 0x30, 0xcd, 0x6b, 0xda, 0x3e, + 0x35, 0xdb, 0xcd, 0x18, 0xdf, 0x9b, 0xc8, 0x50, + 0x59, 0x6f, 0xb2, 0x76, 0x18, 0xf8, 0xc4, 0x97, + 0xb7, 0x11, 0xdb, 0xb5, 0xdf, 0x14, 0xc8, 0xe0, + 0xda, 0xf7, 0xaa, 0xaa, 0x59, 0x9d, 0x6b, 0x79, + 0x20, 0x73, 0x71, 0x2c, 0x6c, 0x50, 0x0d, 0x8e, + 0xbc, 0x98, 0xd0, 0x53, 0xfd, 0xa0, 0xec, 0x2a, + 0x91, 0x9d, 0xd5, 0x56, 0xaf, 0x93, 0x8e, 0x77, + 0x9c, 0x9d, 0xe0, 0x07, 0xe3, 0x0a, 0x44, 0xda, + 0xf3, 0x37, 0xe2, 0x95, 0x56, 0xc8, 0xe6, 0x6f, + 0xb2, 0x0e, 0xac, 0xf2, 0x11, 0x1e, 0xe1, 0x13, + 0x7c, 0x56, 0x8f, 0xfe, 0x23, 0x62, 0xa9, 0x6b, + 0x26, 0x67, 0x56, 0x5a, 0xf5, 0x80, 0xc6, 0x5d, + 0x7f, 0x76, 0x37, 0xcb, 0x28, 0xf1, 0x1a, 0x79, + 0x78, 0x5a, 0xea, 0x85, 0x57, 0xbe, 0xc9, 0x5e, + 0x5f, 0xc9, 0xc5, 0x71, 0x2b, 0x9c, 0x39, 0x19, + 0x5a, 0x34, 0x77, 0x9a, 0xb1, 0x92, 0x89, 0x6a, + 0x15, 0x7c, 0xd1, 0x87, 0xff, 0x00, 0xa4, 0xdd, + 0xff, 0x00, 0xb4, 0xfc, 0x0a, 0x86, 0x55, 0xeb, + 0x47, 0x1f, 0xfe, 0x97, 0x9b, 0xf8, 0x87, 0xe0, + 0x5d, 0x34, 0xbf, 0x53, 0x1a, 0xbf, 0xa5, 0xbd, + 0x25, 0x7c, 0x97, 0x2f, 0x92, 0xe5, 0xf2, 0x4a, + 0xea, 0xe3, 0x4f, 0xa7, 0x39, 0x7c, 0x97, 0x21, + 0x2b, 0xe3, 0x8b, 0x91, 0x15, 0x2e, 0x0d, 0x7b, + 0x4b, 0x1e, 0x01, 0x63, 0x85, 0x1c, 0x0f, 0x31, + 0x5e, 0xda, 0x67, 0x39, 0x79, 0x86, 0xcb, 0x43, + 0x8d, 0x9e, 0x4e, 0x2c, 0x7d, 0xc1, 0xe1, 0x85, + 0xce, 0x3b, 0x1b, 0x5f, 0xd9, 0x58, 0xf5, 0x5e, + 0x37, 0x56, 0xf1, 0xdc, 0xc2, 0x61, 0x7e, 0xc3, + 0x50, 0xe6, 0x38, 0x6c, 0x2d, 0x70, 0xdc, 0x41, + 0x59, 0xcf, 0x1b, 0x6b, 0x1c, 0xa9, 0xd7, 0x01, + 0x07, 0x68, 0xda, 0x0e, 0xe5, 0x2a, 0x99, 0xa0, + 0xb5, 0x0c, 0xb3, 0xc2, 0xfc, 0x46, 0x41, 0xdf, + 0xf3, 0x2d, 0x7e, 0x2b, 0x9c, 0x7e, 0x3b, 0x0e, + 0xe2, 0x15, 0xc9, 0x79, 0xe6, 0x29, 0xd9, 0x28, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x35, 0xba, 0x84, 0xff, 0x00, + 0xf5, 0x33, 0x77, 0x96, 0x82, 0xdc, 0xff, 0x00, + 0xc1, 0x00, 0x7c, 0x95, 0xbe, 0xd4, 0x5f, 0x74, + 0xcd, 0xde, 0x5a, 0x1b, 0x51, 0x5b, 0x36, 0x8e, + 0x76, 0xab, 0x03, 0x27, 0x09, 0xb2, 0xc9, 0x84, + 0xfc, 0x5e, 0x32, 0xb7, 0xdc, 0x4a, 0xa3, 0x0b, + 0xb2, 0x30, 0x45, 0xd4, 0x46, 0x07, 0x05, 0x78, + 0x82, 0xf7, 0x17, 0xf9, 0x80, 0x29, 0xb1, 0x05, + 0x9b, 0x88, 0xa7, 0x11, 0x55, 0x9f, 0x48, 0x66, + 0x3b, 0x9d, 0x09, 0xe9, 0x0c, 0xc7, 0x73, 0xa1, + 0x28, 0x59, 0xc3, 0x97, 0x8c, 0x7b, 0x6f, 0xdb, + 0xc5, 0xcc, 0x68, 0xab, 0xde, 0x90, 0xcc, 0x77, + 0x3a, 0x14, 0x0b, 0xdc, 0xb8, 0x94, 0x48, 0x3e, + 0x33, 0x52, 0x87, 0xdc, 0xa7, 0xff, 0x00, 0xbb, + 0xb8, 0xf7, 0x17, 0xa6, 0x23, 0xef, 0xf3, 0xf3, + 0x16, 0x3d, 0xbb, 0x2e, 0x5f, 0x74, 0xfb, 0x89, + 0xfe, 0x33, 0xfe, 0x15, 0x91, 0x88, 0xfb, 0xfc, + 0xfc, 0xc4, 0x16, 0xb4, 0x44, 0x50, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x05, 0x4f, 0x37, + 0xf9, 0xa6, 0xc3, 0xbf, 0x1f, 0xef, 0x2b, 0x58, + 0xe5, 0x55, 0x4c, 0xdf, 0xe6, 0x9b, 0x0e, 0xfc, + 0x7f, 0xbc, 0xad, 0x63, 0x95, 0x04, 0xa2, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0xa9, 0xea, + 0xbf, 0xbe, 0xb1, 0xfd, 0xe6, 0xff, 0x00, 0x70, + 0x2b, 0x62, 0xa9, 0x6a, 0xbf, 0xbe, 0xb1, 0xdd, + 0xe6, 0xff, 0x00, 0x70, 0x20, 0xb6, 0x72, 0xa9, + 0x51, 0xca, 0xa5, 0x01, 0x11, 0x10, 0x11, 0x17, + 0xcb, 0x9c, 0x1a, 0x2a, 0xe3, 0x40, 0x37, 0x92, + 0x82, 0x54, 0xad, 0x16, 0x4b, 0x54, 0xda, 0xdb, + 0x3f, 0xa9, 0xb6, 0x69, 0xb8, 0x9b, 0x77, 0x0b, + 0x56, 0x17, 0xad, 0x59, 0x1a, 0x7f, 0xd2, 0x77, + 0xbe, 0x82, 0xd4, 0x8a, 0xab, 0xeb, 0x6d, 0xe3, + 0x3c, 0x69, 0x6c, 0xdc, 0xd8, 0xc7, 0xc6, 0x3b, + 0x76, 0x05, 0x61, 0xb1, 0xbd, 0x86, 0xf6, 0xd9, + 0xb7, 0x10, 0x9a, 0xb5, 0xde, 0xf1, 0x41, 0x92, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0xaa, 0x3a, + 0xbf, 0x25, 0x96, 0xb7, 0xc8, 0xda, 0x5a, 0x63, + 0x5f, 0xc2, 0xf9, 0xc6, 0xee, 0xea, 0x0b, 0x72, + 0x2a, 0x2f, 0x53, 0xae, 0xfb, 0x46, 0xf4, 0xff, + 0x00, 0xa2, 0x83, 0x0e, 0xba, 0xed, 0x19, 0x41, + 0xcb, 0xfe, 0x02, 0x0b, 0xda, 0x2a, 0x28, 0x8b, + 0x5c, 0x8f, 0xfd, 0xac, 0xe9, 0x1e, 0x04, 0xea, + 0xb5, 0xc7, 0x6a, 0xce, 0x91, 0xe0, 0x41, 0x7a, + 0x45, 0x45, 0xea, 0xb5, 0xc7, 0x6a, 0xce, 0x91, + 0xe0, 0x4e, 0xab, 0x5c, 0x76, 0xac, 0xe9, 0x1e, + 0x04, 0x17, 0xa4, 0x54, 0x5e, 0xab, 0x5c, 0x76, + 0xac, 0xe9, 0x1e, 0x04, 0xea, 0xb5, 0xc7, 0x6a, + 0xce, 0x91, 0xe0, 0x41, 0x7a, 0x45, 0x45, 0xea, + 0xb5, 0xc7, 0x6a, 0xce, 0x91, 0xe0, 0x4e, 0xa7, + 0x5d, 0x76, 0x8c, 0x3f, 0xe3, 0xbc, 0x82, 0xf4, + 0xa1, 0x51, 0x7a, 0x9d, 0x77, 0x53, 0xfc, 0x46, + 0xff, 0x00, 0x8f, 0x71, 0x63, 0x64, 0x2e, 0xb5, + 0x96, 0x3a, 0xdc, 0x5d, 0x5c, 0xca, 0xde, 0xa8, + 0x10, 0x09, 0x1b, 0x7f, 0xc9, 0x07, 0x44, 0x45, + 0x89, 0x8b, 0x9a, 0x49, 0xf1, 0xf6, 0xf3, 0x48, + 0x6a, 0xf7, 0xb0, 0x17, 0x1e, 0xea, 0xcb, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x50, 0x82, 0x54, 0x55, 0x7c, 0xbe, 0x46, + 0x31, 0xa5, 0xef, 0x21, 0xad, 0x1b, 0xc9, 0x34, + 0x0a, 0xb5, 0x94, 0xd7, 0x16, 0x70, 0x4a, 0xfb, + 0x5c, 0x74, 0x4f, 0xbc, 0xb8, 0x66, 0xc7, 0x3c, + 0x0f, 0xe1, 0x0f, 0xff, 0x00, 0xc8, 0x10, 0x59, + 0x27, 0xb8, 0x82, 0xde, 0x33, 0x2c, 0xf2, 0x36, + 0x38, 0xc6, 0xf7, 0xb8, 0xd0, 0x0f, 0x75, 0x55, + 0x32, 0xda, 0xe5, 0x95, 0x7c, 0x18, 0x58, 0xfc, + 0xa5, 0xec, 0xd8, 0xfb, 0x87, 0x78, 0xb1, 0x0e, + 0xeb, 0x5d, 0xb8, 0xaa, 0x5e, 0xa0, 0xd4, 0x80, + 0xc9, 0xd6, 0xe4, 0xef, 0x3c, 0xb6, 0x60, 0x4f, + 0x05, 0x9c, 0x5e, 0x2b, 0x19, 0xfe, 0xd7, 0x16, + 0xef, 0xf7, 0x55, 0x4b, 0x25, 0xa8, 0xaf, 0xef, + 0xc7, 0x56, 0xda, 0x5a, 0xc0, 0x37, 0x45, 0x17, + 0x8a, 0x3d, 0xda, 0x6f, 0x56, 0x92, 0xe5, 0x67, + 0xce, 0xea, 0x78, 0xdc, 0xee, 0xb3, 0x25, 0x73, + 0xe9, 0x4b, 0xb6, 0xee, 0x85, 0xa0, 0x32, 0x16, + 0xf7, 0xc3, 0x76, 0x1a, 0x2a, 0xae, 0x4b, 0x39, + 0x7d, 0x90, 0x34, 0x73, 0xba, 0xa8, 0x5b, 0xba, + 0x18, 0xfc, 0x56, 0xf4, 0x36, 0x8b, 0x5c, 0x45, + 0x79, 0x6b, 0x5e, 0x52, 0x88, 0x03, 0xba, 0x88, + 0x8a, 0x5a, 0x88, 0x89, 0x44, 0x05, 0x78, 0xd2, + 0x24, 0x0c, 0x28, 0xfe, 0xa1, 0xf8, 0x15, 0x7b, + 0x4f, 0x69, 0x6c, 0xa6, 0xa3, 0x99, 0xd1, 0x58, + 0x34, 0x11, 0x16, 0xd7, 0xbd, 0xc6, 0x80, 0x2b, + 0x4e, 0x17, 0x1f, 0x73, 0x8c, 0xb5, 0x92, 0xc2, + 0xe9, 0xbc, 0x13, 0x43, 0x29, 0x0e, 0x1d, 0xca, + 0x0d, 0xab, 0xa6, 0x97, 0xea, 0x63, 0x53, 0x73, + 0x61, 0x5d, 0xa5, 0x45, 0x56, 0xc7, 0x0b, 0x85, + 0x9b, 0x2a, 0xe7, 0x10, 0x78, 0x20, 0x67, 0xc6, + 0x93, 0xfc, 0x82, 0xdb, 0xbb, 0x49, 0x58, 0xca, + 0xd7, 0x32, 0xda, 0xec, 0x19, 0x9b, 0xb8, 0x0a, + 0x72, 0x72, 0x15, 0xd2, 0x72, 0x8d, 0xde, 0xf7, + 0x38, 0x89, 0xfa, 0x35, 0xd8, 0x4c, 0x08, 0xc8, + 0x35, 0xd7, 0x57, 0x2e, 0xea, 0xed, 0x23, 0xf8, + 0xc7, 0x75, 0x69, 0xbf, 0x6a, 0xce, 0x96, 0x1d, + 0x21, 0x24, 0x12, 0x47, 0x11, 0x25, 0xd1, 0xee, + 0x2d, 0x24, 0x92, 0x7b, 0x9c, 0xeb, 0xd3, 0x19, + 0x7c, 0xcc, 0x33, 0x24, 0xc5, 0x65, 0x9b, 0xc2, + 0x0d, 0x4c, 0x72, 0x01, 0x56, 0xb8, 0x11, 0xb4, + 0x29, 0x76, 0x6b, 0x4d, 0xd8, 0x81, 0xe4, 0xd6, + 0xe1, 0xfb, 0x76, 0x78, 0xa3, 0xde, 0x2b, 0x13, + 0x33, 0x77, 0x53, 0x3e, 0xc6, 0xea, 0x22, 0x2a, + 0xe2, 0x15, 0x39, 0x41, 0x63, 0xc8, 0xa1, 0x02, + 0xa7, 0x86, 0xbb, 0x0d, 0x17, 0xc5, 0x55, 0xdb, + 0x21, 0x15, 0x8e, 0x63, 0x04, 0xfb, 0xd1, 0x17, + 0x52, 0x5a, 0xd2, 0xe6, 0x38, 0x8e, 0x13, 0xb1, + 0x51, 0x41, 0x22, 0x95, 0x5a, 0x8c, 0xae, 0x39, + 0x33, 0x31, 0x55, 0xc5, 0xf1, 0x2f, 0x94, 0x32, + 0x58, 0xef, 0x6d, 0x5d, 0xc1, 0x79, 0x6c, 0x43, + 0xa3, 0x70, 0x34, 0xe2, 0x03, 0x7b, 0x4a, 0xe9, + 0x7a, 0x73, 0x3d, 0x6d, 0x9c, 0xc7, 0x36, 0xe6, + 0x3d, 0x92, 0xb7, 0xc5, 0x9e, 0x23, 0xbd, 0xaf, + 0x1b, 0xd7, 0x37, 0xad, 0x0d, 0x54, 0xe3, 0xb2, + 0x93, 0x60, 0x32, 0x43, 0x25, 0x6e, 0xd2, 0xfb, + 0x79, 0x28, 0xdb, 0xd8, 0x41, 0x20, 0x10, 0x4f, + 0xf3, 0x00, 0xe7, 0x0b, 0x39, 0xe3, 0x7b, 0x61, + 0xac, 0x32, 0xad, 0x92, 0xeb, 0x8a, 0x57, 0x85, + 0x9d, 0xdd, 0xbd, 0xed, 0xb4, 0x77, 0x56, 0xcf, + 0x12, 0x43, 0x2b, 0x43, 0x9a, 0xe6, 0xed, 0x1b, + 0x57, 0xba, 0xe4, 0xe8, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x0d, 0x66, 0xa2, + 0xfb, 0xa6, 0x6e, 0xf2, 0xd0, 0xdb, 0x3d, 0xac, + 0xb3, 0x63, 0xde, 0x68, 0xc6, 0x8a, 0xb8, 0xad, + 0xf6, 0xa2, 0xfb, 0xaa, 0x6e, 0xf2, 0xad, 0x4f, + 0xf7, 0x1c, 0xbf, 0xd3, 0x3f, 0x02, 0x09, 0xf4, + 0xf6, 0x1f, 0xce, 0x07, 0x48, 0x4f, 0x4f, 0xe1, + 0xfc, 0xe0, 0x74, 0x85, 0xc8, 0x36, 0xd4, 0xf8, + 0xc7, 0x79, 0xe5, 0x53, 0xb7, 0xe5, 0x1e, 0x95, + 0x6d, 0x5d, 0x7b, 0xd3, 0xf8, 0x7f, 0x38, 0x1d, + 0x21, 0x3d, 0x3f, 0x87, 0xf3, 0x81, 0xd2, 0x17, + 0x21, 0xdb, 0xf2, 0x8f, 0x4a, 0x6d, 0xf9, 0x47, + 0xa5, 0x2c, 0xa7, 0x5e, 0xf4, 0xfe, 0x1f, 0xce, + 0x07, 0x48, 0x4f, 0x4f, 0xe1, 0xfc, 0xe0, 0x74, + 0x85, 0xc8, 0x76, 0xfc, 0xa3, 0xd2, 0x9b, 0x7e, + 0x51, 0xe9, 0x4b, 0x29, 0xd8, 0xed, 0xb2, 0x98, + 0xfb, 0xb9, 0x3a, 0xbb, 0x69, 0x43, 0xdf, 0x4a, + 0xd0, 0x15, 0xef, 0x88, 0xfb, 0xf8, 0xfc, 0xc5, + 0xce, 0xb4, 0x05, 0x46, 0x73, 0x79, 0x3e, 0x21, + 0xde, 0x57, 0x46, 0xc4, 0xfd, 0xfe, 0x7e, 0x62, + 0x22, 0xd4, 0x88, 0x8a, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0xa9, 0xe6, 0xff, 0x00, + 0x34, 0xd8, 0xf7, 0xe3, 0xfd, 0xe5, 0x6b, 0x1c, + 0xaa, 0xa9, 0x9b, 0xfc, 0xd3, 0x63, 0xdf, 0x8f, + 0xf7, 0x95, 0xac, 0x20, 0x94, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x55, 0x3d, 0x57, 0xf7, + 0xd6, 0x3f, 0xbc, 0xdf, 0xee, 0x05, 0x6c, 0x55, + 0x3d, 0x57, 0xf7, 0xd6, 0x3f, 0xbc, 0x3f, 0xb8, + 0x82, 0xd7, 0xca, 0xa5, 0x42, 0x94, 0x05, 0x08, + 0x48, 0x03, 0x6e, 0xc0, 0xab, 0xd9, 0x4d, 0x45, + 0x29, 0x91, 0xd6, 0x98, 0xb6, 0x19, 0xa7, 0xdc, + 0x5c, 0x36, 0x80, 0x83, 0x69, 0x92, 0xcb, 0xd9, + 0xe3, 0x62, 0x2f, 0x9d, 0xe3, 0x8b, 0x91, 0x83, + 0x7a, 0xd0, 0x9b, 0x8c, 0xce, 0x7d, 0xc5, 0x91, + 0x34, 0xdb, 0x5a, 0x13, 0x42, 0xf3, 0xb0, 0x91, + 0xdc, 0x5e, 0xd8, 0xdd, 0x35, 0x24, 0xb2, 0xf9, + 0x66, 0x55, 0xe6, 0x59, 0x4e, 0xd1, 0x19, 0xdc, + 0x15, 0x8e, 0x38, 0xd9, 0x1b, 0x43, 0x18, 0xd0, + 0xd6, 0x8d, 0x80, 0x04, 0x1a, 0xdc, 0x66, 0x9e, + 0xb1, 0xc7, 0x8e, 0x20, 0xde, 0xb6, 0x5e, 0x57, + 0xbb, 0x7a, 0xd8, 0xb9, 0xb0, 0xb1, 0xbc, 0x4e, + 0x0d, 0x68, 0x1b, 0xc9, 0xa2, 0xf4, 0x58, 0xf7, + 0xd6, 0xa6, 0xee, 0xd5, 0xf0, 0x71, 0x70, 0x71, + 0x8a, 0x71, 0x04, 0x1e, 0x37, 0x93, 0x63, 0xbc, + 0x9a, 0x4e, 0xb1, 0xd1, 0x96, 0xf0, 0x9a, 0x8a, + 0x85, 0xa9, 0xd2, 0x73, 0xc2, 0xcb, 0x29, 0xaa, + 0xf0, 0xd6, 0x75, 0x87, 0x80, 0x13, 0xc8, 0xbc, + 0x8e, 0x8b, 0x0e, 0x68, 0x6b, 0xae, 0x1c, 0x40, + 0xe4, 0x52, 0xdd, 0x18, 0xd6, 0x8a, 0x32, 0xe1, + 0xcd, 0x1c, 0xc1, 0x51, 0x62, 0xf2, 0xab, 0x6e, + 0xd5, 0x9d, 0x21, 0x3c, 0xae, 0xdb, 0xb5, 0x67, + 0x48, 0x55, 0xef, 0x53, 0xcf, 0x9c, 0xbb, 0xa4, + 0xa7, 0xa9, 0xe7, 0xce, 0x5d, 0xd2, 0x54, 0x16, + 0x1f, 0x2b, 0xb6, 0xed, 0x59, 0xd2, 0x14, 0xb6, + 0xe6, 0x07, 0x9a, 0x36, 0x46, 0xb8, 0xf3, 0x02, + 0xab, 0xbe, 0xa7, 0x9f, 0x39, 0x77, 0x49, 0x5e, + 0x17, 0x7a, 0x62, 0xea, 0xce, 0x17, 0x5c, 0xda, + 0xdc, 0xb8, 0xc9, 0x17, 0x8d, 0xb7, 0x98, 0x20, + 0xb7, 0x2a, 0x7e, 0xa5, 0xfc, 0xd3, 0x8a, 0xef, + 0xab, 0x06, 0x0e, 0xf5, 0xf7, 0xb8, 0xe8, 0xa6, + 0x93, 0xe3, 0xfc, 0x57, 0x77, 0xc2, 0xaf, 0xea, + 0x5f, 0xcd, 0x18, 0xbe, 0xfa, 0x0c, 0xeb, 0xdb, + 0x2c, 0xcb, 0xee, 0xa4, 0x74, 0x2f, 0xa3, 0x09, + 0x05, 0xa2, 0xbb, 0x28, 0xbc, 0x73, 0x8e, 0xbd, + 0xb4, 0xd3, 0x83, 0x8d, 0xe5, 0xb3, 0xf1, 0x8a, + 0xb8, 0x6f, 0xa1, 0x59, 0x77, 0x7a, 0x80, 0xdb, + 0xdc, 0xbe, 0x10, 0xc2, 0x43, 0x28, 0xb0, 0xf5, + 0x25, 0xd9, 0xbd, 0xd3, 0x7e, 0x51, 0xc3, 0xc3, + 0x57, 0x8a, 0x84, 0x14, 0xf1, 0x93, 0xc9, 0x53, + 0xfe, 0xc3, 0xba, 0x4a, 0x91, 0x92, 0xc9, 0x93, + 0x41, 0x3b, 0x89, 0xef, 0x95, 0x8c, 0xb2, 0x2c, + 0xa9, 0xe5, 0x01, 0x67, 0x3c, 0xbc, 0xb8, 0xce, + 0x5b, 0xfc, 0xb1, 0x6c, 0xe7, 0x97, 0x97, 0x19, + 0xcb, 0x92, 0x4e, 0x47, 0x28, 0xdd, 0x8e, 0x9d, + 0xe0, 0xf3, 0x54, 0xa7, 0xa4, 0xb2, 0x5e, 0x70, + 0xe5, 0xf5, 0x91, 0xa7, 0x5a, 0x3b, 0xcb, 0x14, + 0x10, 0xa6, 0x9e, 0x7e, 0x7c, 0x31, 0xcb, 0x9c, + 0x18, 0x65, 0xe6, 0xc3, 0x1c, 0xb9, 0xc2, 0x5f, + 0x9c, 0xc8, 0xb5, 0xc5, 0xbd, 0x7b, 0x8f, 0xba, + 0x54, 0x7a, 0x7b, 0x23, 0xdb, 0xbb, 0xa4, 0xac, + 0x19, 0xff, 0x00, 0x9a, 0x57, 0x9d, 0x16, 0xda, + 0x6c, 0xbd, 0x3f, 0x91, 0x03, 0xf9, 0xee, 0xe9, + 0x2a, 0xc7, 0xa1, 0xf2, 0x57, 0xb7, 0x97, 0xd7, + 0x0c, 0x96, 0x52, 0xfa, 0x46, 0x78, 0x41, 0xe7, + 0x54, 0xaa, 0x2b, 0x5f, 0xb3, 0xc3, 0xc3, 0x91, + 0xba, 0x77, 0x20, 0x8c, 0x9e, 0x84, 0x16, 0x07, + 0x63, 0xb3, 0x9c, 0x47, 0xf8, 0x86, 0x95, 0x34, + 0xdb, 0xc8, 0xb1, 0x35, 0x24, 0x17, 0x90, 0xe9, + 0x99, 0x5b, 0x76, 0xee, 0x27, 0x17, 0x8a, 0x74, + 0xad, 0x8b, 0xb5, 0x33, 0x9a, 0xe7, 0x37, 0xab, + 0xdc, 0x48, 0x5a, 0xfd, 0x4f, 0x7e, 0x6f, 0xf4, + 0xcc, 0xb2, 0x16, 0xf0, 0x90, 0xf1, 0xb3, 0xdd, + 0x41, 0x63, 0xc2, 0x7d, 0xd3, 0x6b, 0xfd, 0x36, + 0xac, 0xe5, 0x83, 0x84, 0xfb, 0xa6, 0xd7, 0xfa, + 0x6d, 0x59, 0xc8, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x8a, + 0x10, 0x4a, 0x28, 0x24, 0x0d, 0xa7, 0x70, 0x5a, + 0x2c, 0x96, 0xb0, 0xc5, 0x59, 0x97, 0x45, 0x03, + 0x8d, 0xe5, 0xc8, 0xa8, 0x11, 0x43, 0xe3, 0xd0, + 0xff, 0x00, 0xba, 0x9b, 0x90, 0x6f, 0x49, 0xa2, + 0xae, 0x65, 0x75, 0xb6, 0x3a, 0xce, 0x67, 0x5a, + 0x5b, 0x32, 0x4b, 0xcb, 0xa1, 0x51, 0x48, 0x9a, + 0x5c, 0xc6, 0x9f, 0xf7, 0xb8, 0x6e, 0x54, 0xec, + 0xf6, 0xaa, 0xb8, 0x9c, 0x39, 0xd9, 0x6b, 0x8f, + 0x26, 0x87, 0x7b, 0x6c, 0xad, 0x9f, 0x57, 0xec, + 0xe7, 0x78, 0xa3, 0x82, 0xa6, 0xe4, 0x35, 0x4d, + 0xc4, 0x95, 0x8b, 0x1e, 0xdf, 0x25, 0x80, 0xec, + 0x27, 0x7b, 0xdc, 0x3b, 0xae, 0xde, 0xaa, 0x2d, + 0x7a, 0x87, 0x53, 0x39, 0xf2, 0xf5, 0x99, 0x4b, + 0xce, 0x20, 0x3e, 0x2d, 0x8c, 0x0e, 0xa5, 0x3e, + 0x73, 0x9b, 0xe0, 0x55, 0x0c, 0x96, 0xa8, 0xbd, + 0xbc, 0x26, 0x3b, 0x60, 0x2d, 0x6d, 0xf7, 0x70, + 0xb0, 0xed, 0x3d, 0xd2, 0x56, 0x9d, 0xce, 0x73, + 0xdc, 0x5e, 0xe2, 0x5c, 0xf7, 0x1a, 0x92, 0x54, + 0x77, 0x39, 0x10, 0xa0, 0x9e, 0x22, 0x49, 0xda, + 0x4e, 0xf2, 0x77, 0x94, 0x44, 0x51, 0x4e, 0xef, + 0x22, 0x27, 0x2f, 0x75, 0x3e, 0x04, 0x04, 0x4f, + 0x85, 0x36, 0x7b, 0x9c, 0xe8, 0x09, 0xfe, 0x39, + 0x97, 0xa3, 0x6d, 0xae, 0xa4, 0x8c, 0xcb, 0x1c, + 0x2f, 0x74, 0x63, 0x7b, 0xc0, 0x24, 0x74, 0xab, + 0x47, 0xb3, 0xac, 0x56, 0x9f, 0xc9, 0xe5, 0x5f, + 0x6d, 0x98, 0xaf, 0x5b, 0x41, 0xd4, 0x46, 0x76, + 0x02, 0x7b, 0xa5, 0x06, 0x2e, 0x96, 0x3a, 0xaa, + 0xca, 0x3b, 0x8c, 0x9e, 0x11, 0xaf, 0x6c, 0x0c, + 0x69, 0x6c, 0xaf, 0xa5, 0x5a, 0x7d, 0xc3, 0xb3, + 0x62, 0xe8, 0x76, 0xda, 0x6e, 0x59, 0x74, 0xfb, + 0x72, 0x4d, 0xba, 0x37, 0xb7, 0x73, 0x0e, 0xbe, + 0x49, 0x37, 0x57, 0x66, 0xd6, 0x8e, 0xf2, 0xf5, + 0xd5, 0x12, 0xb7, 0x44, 0xe9, 0x57, 0xc1, 0x8d, + 0x60, 0x77, 0x5f, 0x21, 0x6b, 0x4b, 0x86, 0xc1, + 0xc5, 0xbf, 0x89, 0x60, 0x7b, 0x32, 0xce, 0xbd, + 0x96, 0x1e, 0x4b, 0x78, 0xfa, 0xb2, 0x69, 0x09, + 0x61, 0x3b, 0x81, 0x3c, 0x83, 0xb8, 0xb5, 0x8d, + 0xde, 0xc6, 0x72, 0xae, 0x2b, 0x1e, 0x9b, 0x6f, + 0x94, 0xe9, 0xf9, 0x60, 0x81, 0xdd, 0x5c, 0xce, + 0xe2, 0x69, 0x23, 0x61, 0x6b, 0x97, 0x83, 0x5b, + 0x89, 0xd3, 0x6d, 0xeb, 0x25, 0x94, 0xdc, 0x64, + 0x29, 0xb5, 0x81, 0xd5, 0x3e, 0xe8, 0x4c, 0xa0, + 0xb8, 0xd3, 0xd9, 0x0f, 0x48, 0x5a, 0xb7, 0x8a, + 0xc6, 0x73, 0xfc, 0x58, 0xc6, 0xe0, 0x79, 0xf6, + 0x2f, 0x49, 0x6f, 0x34, 0xa6, 0x51, 0xed, 0xb9, + 0xb9, 0xa3, 0x65, 0xa6, 0xde, 0x2f, 0x14, 0xf7, + 0x8f, 0x3a, 0xd7, 0xc2, 0x79, 0x27, 0x0a, 0xdd, + 0x4c, 0x2c, 0x94, 0x57, 0xd9, 0x8c, 0x73, 0xb2, + 0xf7, 0x1c, 0x31, 0xc1, 0x08, 0x2e, 0x86, 0x11, + 0xb6, 0xa0, 0x73, 0x95, 0xf5, 0x6d, 0xa8, 0xb0, + 0x4f, 0xb3, 0x8e, 0x1b, 0x9b, 0x40, 0xd7, 0xb0, + 0x0a, 0x35, 0xad, 0xa8, 0xaf, 0x3d, 0x57, 0x86, + 0xa0, 0xd4, 0x50, 0x4f, 0x6d, 0xe8, 0xec, 0x7b, + 0x78, 0x6d, 0xc5, 0x03, 0x9f, 0xba, 0xa0, 0x72, + 0x00, 0xab, 0x64, 0xab, 0x11, 0xcd, 0x26, 0x79, + 0x37, 0x99, 0xad, 0x4b, 0x25, 0xf4, 0x22, 0xce, + 0xde, 0x31, 0x05, 0xab, 0x76, 0x1a, 0x1d, 0xa4, + 0x73, 0x2d, 0x19, 0x2a, 0x38, 0x97, 0xc9, 0x2b, + 0x55, 0x10, 0xce, 0xd9, 0x49, 0x35, 0x5f, 0x24, + 0x82, 0xd2, 0x1d, 0xb4, 0x73, 0x14, 0x25, 0x41, + 0x22, 0x88, 0x53, 0x6f, 0xa3, 0x33, 0xe7, 0x0b, + 0x7c, 0x31, 0x97, 0x4f, 0xa6, 0x3a, 0xe9, 0xdf, + 0xc0, 0x71, 0x3b, 0x23, 0x93, 0xe4, 0xf7, 0x8a, + 0xe9, 0x80, 0x82, 0x2a, 0x0d, 0x41, 0xdc, 0xb8, + 0xbc, 0xd1, 0xb2, 0x66, 0x16, 0x3b, 0x97, 0x68, + 0x3c, 0xa0, 0xab, 0xbe, 0x85, 0xd4, 0xce, 0xba, + 0x8f, 0xd1, 0x19, 0x07, 0x8f, 0x2c, 0x80, 0x52, + 0x17, 0x1d, 0x9d, 0x64, 0x63, 0x77, 0x42, 0xe5, + 0x96, 0x35, 0x2e, 0x98, 0xce, 0xc5, 0xc9, 0x14, + 0x05, 0x2b, 0x2d, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x35, 0x9a, 0x8b, 0xee, 0x99, 0xbb, + 0xca, 0xb3, 0x3f, 0xdc, 0x72, 0xff, 0x00, 0x4c, + 0xfc, 0x0a, 0xcd, 0xa8, 0xbe, 0xe9, 0x9b, 0xbc, + 0xab, 0x33, 0x9a, 0x60, 0xe5, 0xfe, 0x99, 0xf8, + 0x10, 0x72, 0x3e, 0x53, 0xdf, 0x28, 0x95, 0x75, + 0x4e, 0xc3, 0xbc, 0xf2, 0x26, 0xdf, 0x92, 0x51, + 0x44, 0x4d, 0xbf, 0x24, 0xa9, 0xf1, 0xb9, 0x8a, + 0x08, 0x45, 0x3e, 0x37, 0x31, 0x51, 0xb7, 0xe4, + 0x94, 0x16, 0x5d, 0x03, 0xf7, 0xdf, 0xff, 0x00, + 0x02, 0xba, 0x36, 0x27, 0xef, 0xf3, 0xf3, 0x17, + 0x39, 0xf6, 0x7f, 0x53, 0x9c, 0x3b, 0x08, 0xf1, + 0x0a, 0xe8, 0xb8, 0x9f, 0xbf, 0xcf, 0xcc, 0x55, + 0x16, 0xb4, 0x44, 0x50, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x05, 0x4f, 0x37, 0xf9, 0xa6, + 0xc7, 0xbf, 0x1f, 0xef, 0x2b, 0x58, 0xe5, 0x55, + 0x4c, 0xdf, 0xe6, 0x9b, 0x1e, 0xfc, 0x7f, 0xbc, + 0xad, 0x68, 0x25, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x15, 0x4f, 0x55, 0xfd, 0xf5, 0x8f, + 0xef, 0x0f, 0xee, 0x05, 0x6c, 0x55, 0x2d, 0x57, + 0xf7, 0xd6, 0x3b, 0xbc, 0xdf, 0xee, 0x04, 0x16, + 0xc5, 0x2a, 0x14, 0xa0, 0xf3, 0x9f, 0xf9, 0x2f, + 0xf9, 0xa7, 0xe0, 0x55, 0xfd, 0x1d, 0x14, 0x62, + 0x2b, 0x99, 0x03, 0x7c, 0x7e, 0xb5, 0xc3, 0x8b, + 0x96, 0x95, 0x56, 0x19, 0xff, 0x00, 0x92, 0xff, + 0x00, 0x9a, 0x7e, 0x05, 0xa1, 0xd1, 0xff, 0x00, + 0xf5, 0xee, 0x3f, 0xaa, 0xe4, 0x16, 0x05, 0x28, + 0x88, 0x0a, 0x14, 0xa2, 0x0a, 0xed, 0xf6, 0xa7, + 0x9a, 0xd6, 0xee, 0x4b, 0x76, 0xdb, 0x39, 0xe1, + 0x9b, 0x38, 0x86, 0xe2, 0xbc, 0x3d, 0x6f, 0xb8, + 0xf3, 0x47, 0x7b, 0xea, 0xc6, 0xf6, 0xdb, 0x07, + 0x55, 0xe1, 0x95, 0xee, 0x81, 0x55, 0x14, 0xb3, + 0xe6, 0x8f, 0xa0, 0x20, 0xaf, 0x7a, 0xdf, 0x3f, + 0x9a, 0x3b, 0xdf, 0x5f, 0x0e, 0xd6, 0xae, 0x69, + 0x0d, 0x75, 0xb3, 0x9a, 0xe3, 0xb8, 0x1e, 0x55, + 0x64, 0xa5, 0x9f, 0x34, 0x7d, 0x01, 0x68, 0x75, + 0x5f, 0x91, 0x79, 0x3c, 0x42, 0x30, 0xdf, 0x29, + 0xe3, 0x1c, 0x01, 0xb4, 0xae, 0xfe, 0xe2, 0x0f, + 0x8f, 0x5b, 0xe7, 0xf3, 0x47, 0x74, 0x15, 0xe3, + 0x75, 0xa8, 0xf2, 0x37, 0xb0, 0xba, 0xd6, 0xda, + 0xd9, 0xcd, 0x92, 0x5f, 0x17, 0x88, 0x83, 0xb8, + 0xab, 0x2d, 0xac, 0x11, 0xf9, 0x3c, 0x7c, 0x71, + 0xb7, 0x8b, 0x84, 0x57, 0xc5, 0x0b, 0xd8, 0x43, + 0x13, 0x4d, 0x5a, 0xc6, 0x83, 0xce, 0x00, 0x41, + 0x87, 0x84, 0xb1, 0x75, 0x8e, 0x3e, 0x38, 0x1d, + 0xf1, 0xfe, 0x33, 0xfb, 0xe7, 0x7a, 0xaf, 0x6a, + 0x6f, 0xcd, 0x38, 0xaa, 0x73, 0xab, 0x82, 0xa8, + 0x6a, 0x53, 0x4d, 0x51, 0x8b, 0xef, 0x8f, 0x85, + 0x05, 0x8e, 0x48, 0x6c, 0x1c, 0xea, 0xc8, 0x18, + 0x5e, 0x69, 0xc5, 0x5d, 0xeb, 0x4f, 0xab, 0xdb, + 0x13, 0x70, 0x44, 0x42, 0x07, 0x07, 0x18, 0x1b, + 0x37, 0x2f, 0x5b, 0xcc, 0x1d, 0xdc, 0xf7, 0x32, + 0x4c, 0xc9, 0x68, 0x1f, 0xb8, 0x55, 0x62, 0x6a, + 0x1b, 0x67, 0xda, 0x69, 0xa1, 0x04, 0xa7, 0x89, + 0xc1, 0xe0, 0xd5, 0x05, 0x23, 0xba, 0xbd, 0xec, + 0x8f, 0xfc, 0x80, 0xb1, 0x9e, 0x4d, 0x02, 0xc8, + 0xb0, 0xfe, 0x7b, 0x57, 0x0d, 0x4d, 0x4b, 0xfb, + 0x98, 0x57, 0xe9, 0xc6, 0x6d, 0xdf, 0xd4, 0x7a, + 0x4c, 0xb1, 0xf4, 0x58, 0xfa, 0x99, 0xca, 0x2b, + 0x53, 0xcd, 0x8c, 0x63, 0xec, 0x7b, 0x5f, 0x8a, + 0xdc, 0x37, 0xba, 0xbe, 0x2e, 0x62, 0x63, 0x58, + 0x08, 0x14, 0x2b, 0xee, 0xfb, 0xfe, 0xc3, 0x3d, + 0xc5, 0x17, 0x7f, 0xcb, 0x0b, 0xd9, 0xe8, 0x22, + 0x27, 0xd1, 0x65, 0x33, 0x11, 0x78, 0xc7, 0xc5, + 0xf1, 0xa7, 0x2c, 0xa3, 0x53, 0xd2, 0xe3, 0x13, + 0x3e, 0x5c, 0xa3, 0x6c, 0x35, 0x72, 0xc3, 0x23, + 0x9e, 0x5c, 0x06, 0xc2, 0xbe, 0x3c, 0x9e, 0x5e, + 0x65, 0x9b, 0x47, 0x9f, 0xd9, 0x71, 0xe6, 0x34, + 0x4e, 0x19, 0x3e, 0x43, 0xba, 0x17, 0x28, 0x7d, + 0x2e, 0x32, 0xc2, 0xf2, 0x79, 0x39, 0x95, 0xa7, + 0xd9, 0xf4, 0x45, 0xb9, 0x29, 0xc3, 0xb9, 0x59, + 0x4a, 0x2d, 0x17, 0x03, 0xfe, 0x43, 0xba, 0x15, + 0x93, 0x43, 0x71, 0x0c, 0x9c, 0xa1, 0xc0, 0x8f, + 0x13, 0x95, 0x05, 0xd3, 0xd1, 0xf6, 0x64, 0x93, + 0xd5, 0x37, 0x69, 0xe6, 0x5a, 0x2d, 0x6d, 0x0c, + 0x50, 0xe9, 0xf9, 0x1b, 0x13, 0x43, 0x47, 0x10, + 0x26, 0x8a, 0xca, 0x15, 0x77, 0x5e, 0x7d, 0xc1, + 0x2f, 0x74, 0x84, 0x18, 0xb8, 0xdd, 0x75, 0xa6, + 0xed, 0xec, 0x20, 0x82, 0x5b, 0xa6, 0xb6, 0x48, + 0xd8, 0x1a, 0xe6, 0x9e, 0x42, 0x16, 0x4f, 0xea, + 0x06, 0x96, 0xf3, 0xc6, 0xf4, 0x85, 0xca, 0x4f, + 0xb3, 0x7d, 0x45, 0x76, 0x7c, 0xa2, 0x28, 0xc1, + 0x8e, 0x5f, 0x19, 0xa7, 0xb8, 0x53, 0xf4, 0xbb, + 0x53, 0x76, 0x43, 0xa5, 0x07, 0x56, 0xfd, 0x41, + 0xd2, 0xde, 0x78, 0xde, 0x90, 0x9f, 0xa8, 0x1a, + 0x5e, 0xbf, 0xf7, 0x1a, 0xb9, 0x4f, 0xe9, 0x76, + 0xa6, 0xec, 0x87, 0x4a, 0x7e, 0x97, 0x6a, 0x6e, + 0xc8, 0x74, 0xa0, 0xea, 0xdf, 0xa8, 0x3a, 0x5b, + 0xcf, 0x1b, 0xd2, 0x13, 0xf5, 0x07, 0x4b, 0x79, + 0xe3, 0x7a, 0x42, 0xe5, 0x3f, 0xa5, 0xda, 0x9b, + 0xb2, 0x1d, 0x29, 0xfa, 0x5d, 0xa9, 0xbb, 0x21, + 0xd2, 0x83, 0xab, 0x7e, 0xa0, 0xe9, 0x6f, 0x3c, + 0x6f, 0x48, 0x4f, 0xd4, 0x0d, 0x2d, 0xe7, 0x8d, + 0xe9, 0x0b, 0x94, 0xfe, 0x97, 0x6a, 0x6e, 0xc8, + 0x74, 0xa7, 0xe9, 0x76, 0xa6, 0xec, 0x87, 0x4a, + 0x0e, 0xad, 0xfa, 0x83, 0xa5, 0xbc, 0xf1, 0xbd, + 0x21, 0x07, 0xb4, 0x1d, 0x2e, 0x7f, 0xfd, 0xb6, + 0xae, 0x53, 0xfa, 0x5d, 0xa9, 0xbb, 0x21, 0xd2, + 0x9f, 0xa5, 0xda, 0x9b, 0xb2, 0x1d, 0x28, 0x3a, + 0xb7, 0xea, 0x0e, 0x96, 0xf3, 0xc6, 0xf4, 0x85, + 0x3f, 0xa8, 0x1a, 0x5b, 0xcf, 0x1a, 0xb9, 0x47, + 0xe9, 0x76, 0xa6, 0xec, 0x87, 0x4a, 0x7e, 0x97, + 0x6a, 0x6e, 0xc8, 0x74, 0xa0, 0xea, 0xdf, 0xa8, + 0x3a, 0x5b, 0xcf, 0x1b, 0xd2, 0x13, 0xf5, 0x07, + 0x4b, 0xf9, 0xe3, 0x7a, 0x42, 0xe5, 0x3f, 0xa5, + 0xda, 0x9b, 0xb2, 0x1d, 0x29, 0xfa, 0x5d, 0xa9, + 0xbb, 0x21, 0xd2, 0x83, 0xab, 0x7e, 0xa0, 0xe9, + 0x6f, 0x3c, 0x6f, 0x48, 0x4f, 0xd4, 0x1d, 0x2d, + 0xe7, 0x8d, 0xe9, 0x0b, 0x94, 0xfe, 0x97, 0x6a, + 0x6e, 0xc8, 0x74, 0xa7, 0xe9, 0x76, 0xa6, 0xec, + 0x87, 0x4a, 0x0e, 0xad, 0xfa, 0x83, 0xa5, 0xfc, + 0xed, 0xa9, 0xfa, 0x83, 0xa5, 0xbc, 0xf1, 0xbd, + 0x21, 0x72, 0x9f, 0xd2, 0xed, 0x4d, 0x4f, 0xe5, + 0x0e, 0x94, 0xfd, 0x2e, 0xd4, 0xdd, 0x90, 0xe9, + 0x41, 0xd5, 0xbf, 0x50, 0x74, 0xb7, 0x9e, 0x37, + 0xa4, 0x27, 0xea, 0x0e, 0x97, 0xf3, 0xc6, 0xf4, + 0x85, 0xca, 0x7f, 0x4b, 0xb5, 0x37, 0x64, 0x3a, + 0x53, 0xf4, 0xbb, 0x53, 0x76, 0x43, 0xa5, 0x07, + 0x56, 0xfd, 0x41, 0xd2, 0xde, 0x78, 0xde, 0x90, + 0x9f, 0xa8, 0x3a, 0x5b, 0xcf, 0x1b, 0xd2, 0x17, + 0x29, 0xfd, 0x2e, 0xd4, 0xdd, 0x90, 0xe9, 0x4f, + 0xd2, 0xed, 0x4d, 0xd9, 0x0e, 0x94, 0x1d, 0x5b, + 0xf5, 0x07, 0x4b, 0xf9, 0xdb, 0x53, 0xf5, 0x03, + 0x4b, 0xf9, 0xe3, 0x7d, 0xe5, 0xca, 0x7f, 0x4b, + 0xb5, 0x37, 0x64, 0x3a, 0x53, 0xf4, 0xbb, 0x53, + 0x76, 0x43, 0xa5, 0x07, 0x56, 0xfd, 0x41, 0xd2, + 0xde, 0x78, 0xde, 0x90, 0x9f, 0xa8, 0x1a, 0x5b, + 0xcf, 0x1b, 0xd2, 0x17, 0x29, 0xfd, 0x2e, 0xd4, + 0xdd, 0x90, 0xe9, 0x4f, 0xd2, 0xed, 0x4d, 0xd9, + 0x0e, 0x94, 0x1d, 0x5b, 0xf5, 0x07, 0x4b, 0x79, + 0xe3, 0x7a, 0x42, 0x7e, 0xa0, 0xe9, 0x6f, 0x3c, + 0x6f, 0x48, 0x5c, 0xa7, 0xf4, 0xbb, 0x53, 0x76, + 0x43, 0xa5, 0x3f, 0x4b, 0xb5, 0x37, 0x64, 0x3a, + 0x50, 0x75, 0x6f, 0xd4, 0x1d, 0x2d, 0xe7, 0x8d, + 0xe9, 0x09, 0xfa, 0x81, 0xa5, 0xfc, 0xf1, 0xab, + 0x94, 0xfe, 0x97, 0xea, 0x6e, 0xc8, 0x74, 0xad, + 0x7e, 0x43, 0x47, 0x64, 0x31, 0xd2, 0x08, 0xee, + 0x9c, 0xc1, 0x21, 0x34, 0x11, 0x34, 0xd5, 0xe7, + 0xbc, 0x10, 0x76, 0x6f, 0xd4, 0x1d, 0x2d, 0xe7, + 0x8d, 0x5f, 0x17, 0x3a, 0xff, 0x00, 0x04, 0xc8, + 0xdd, 0xe4, 0xcf, 0x37, 0x33, 0x7e, 0xcc, 0x4c, + 0x15, 0x26, 0xab, 0x93, 0x43, 0xa6, 0x6d, 0xed, + 0x61, 0x6d, 0xce, 0x4e, 0x41, 0x6b, 0x1f, 0x31, + 0xf8, 0xee, 0x1f, 0x34, 0xee, 0x51, 0x71, 0xa9, + 0xad, 0xed, 0x22, 0xf2, 0x5c, 0x34, 0x0d, 0x8d, + 0xa0, 0x70, 0xf9, 0x43, 0xc0, 0x2f, 0x3d, 0xe2, + 0x55, 0x4b, 0x5c, 0x73, 0x9a, 0xae, 0xf6, 0xea, + 0x27, 0x3f, 0x27, 0x28, 0xc7, 0xda, 0xd0, 0xf0, + 0xdb, 0xc2, 0xfa, 0xc8, 0xe0, 0x79, 0xc8, 0xa1, + 0x0a, 0x97, 0x75, 0xaa, 0x9d, 0x13, 0x1d, 0x06, + 0x1e, 0x3f, 0x26, 0x88, 0xef, 0x91, 0xdb, 0x64, + 0x77, 0xff, 0x00, 0x23, 0xb5, 0x68, 0xa7, 0x9e, + 0x7b, 0x87, 0xf1, 0xcf, 0x23, 0xa4, 0x71, 0xdb, + 0x57, 0x1a, 0xaf, 0x80, 0x97, 0x05, 0x3e, 0xa4, + 0x7b, 0xe4, 0x79, 0x7c, 0x8e, 0x2f, 0x79, 0xda, + 0x5c, 0xed, 0xa6, 0xab, 0xe5, 0x10, 0xa8, 0xa2, + 0x22, 0x20, 0x22, 0x14, 0x04, 0xf2, 0x20, 0xf5, + 0xb6, 0xb4, 0xb9, 0xbc, 0x9d, 0x96, 0xd6, 0xd1, + 0x99, 0x67, 0x79, 0xa3, 0x58, 0xdd, 0xa4, 0xab, + 0xee, 0x2b, 0xd8, 0xf6, 0x46, 0xe2, 0x16, 0xcb, + 0x7f, 0x72, 0x2d, 0x5c, 0xed, 0xa1, 0x8d, 0x01, + 0xc7, 0xdd, 0xaa, 0xcb, 0xf6, 0x33, 0x8f, 0xb5, + 0x96, 0x4b, 0xcb, 0xf7, 0xb4, 0x3a, 0x78, 0x48, + 0x64, 0x64, 0xf2, 0x02, 0x16, 0x36, 0xb2, 0xcb, + 0x6b, 0x8b, 0x9c, 0xf4, 0x96, 0xf6, 0x71, 0xcf, + 0x1c, 0x10, 0xb8, 0xb6, 0xdd, 0xb1, 0xb4, 0xd1, + 0xc3, 0x9e, 0xa3, 0x7a, 0x0d, 0x56, 0xa9, 0xf6, + 0x71, 0x95, 0xc0, 0xdb, 0xf9, 0x64, 0x6e, 0xf2, + 0x9b, 0x51, 0xfc, 0xc7, 0x0d, 0xed, 0xef, 0x81, + 0xc8, 0xb1, 0x74, 0x0e, 0x9a, 0x8b, 0x51, 0x66, + 0xc4, 0x17, 0x1f, 0xf5, 0x60, 0x6f, 0x59, 0x28, + 0x1f, 0xb4, 0x39, 0x95, 0x8a, 0x7c, 0x3f, 0xb4, + 0xcd, 0x47, 0x67, 0x1d, 0xb5, 0xcb, 0x84, 0x70, + 0x31, 0xb4, 0x2d, 0x79, 0xea, 0xcb, 0xbe, 0x75, + 0x17, 0xa6, 0x8b, 0xc6, 0x64, 0xb4, 0x6e, 0xa3, + 0x11, 0xe5, 0xa3, 0xe1, 0x83, 0x20, 0xce, 0xaa, + 0x39, 0xdb, 0xb5, 0x81, 0xd5, 0xd9, 0x52, 0x83, + 0x6f, 0x75, 0xac, 0x70, 0xd8, 0xdc, 0xab, 0x74, + 0xfe, 0x37, 0x16, 0xdb, 0xa8, 0xe2, 0x22, 0x39, + 0x0b, 0x1a, 0x0d, 0x0e, 0xee, 0x6d, 0xa9, 0xad, + 0x34, 0xbe, 0x25, 0xb6, 0xac, 0xce, 0xd9, 0xbd, + 0x98, 0xcc, 0x84, 0x40, 0x4a, 0xd0, 0x48, 0x60, + 0x71, 0xdf, 0xc3, 0x4e, 0x75, 0xb3, 0xd4, 0x9c, + 0x3a, 0x72, 0xde, 0x5b, 0xec, 0x36, 0x33, 0xca, + 0x6f, 0x6e, 0x9c, 0x4b, 0xa4, 0x68, 0xe2, 0x2d, + 0x27, 0x97, 0x72, 0xae, 0xe9, 0x4c, 0x36, 0x5b, + 0x52, 0xde, 0xcb, 0x97, 0xd5, 0x81, 0xee, 0xb6, + 0x88, 0x56, 0x28, 0x9f, 0x58, 0xdb, 0x51, 0xcb, + 0xc3, 0xb8, 0x80, 0x83, 0x79, 0x8c, 0xba, 0xb1, + 0xd7, 0xba, 0x55, 0xf6, 0xb7, 0x34, 0xf2, 0x96, + 0x0e, 0x17, 0xb4, 0x1d, 0xa1, 0xe0, 0x50, 0x3b, + 0xdd, 0x54, 0xfc, 0x6e, 0x3e, 0xeb, 0x11, 0x0b, + 0xac, 0x6e, 0x5a, 0x59, 0x35, 0xbc, 0xa6, 0x87, + 0x9c, 0x0d, 0xc5, 0xab, 0x55, 0x1e, 0xa7, 0x7e, + 0x9d, 0xd5, 0x97, 0x77, 0x78, 0xc0, 0x1d, 0x69, + 0xd6, 0x16, 0xf5, 0x20, 0xd1, 0xae, 0x68, 0x5b, + 0xb6, 0x67, 0x6e, 0xb3, 0xd1, 0x7a, 0x42, 0xec, + 0x06, 0xbd, 0xc4, 0xb5, 0xac, 0x68, 0xd8, 0x1b, + 0xc8, 0x2a, 0xb7, 0xa7, 0xbd, 0x9c, 0xf7, 0x2c, + 0x53, 0xea, 0xb3, 0x3e, 0x27, 0xc8, 0xa7, 0x84, + 0x4b, 0x29, 0x1c, 0x0e, 0x71, 0xf7, 0x8a, 0xae, + 0x38, 0x37, 0x71, 0x00, 0xfb, 0xe8, 0x48, 0x50, + 0x4f, 0x32, 0xe9, 0x51, 0x1b, 0x9c, 0xf7, 0xa4, + 0x9a, 0x50, 0x73, 0x28, 0xaa, 0x87, 0x15, 0xf3, + 0x5e, 0x64, 0x29, 0x24, 0xa8, 0x2e, 0xd8, 0xa0, + 0x92, 0xa0, 0x94, 0x52, 0xaa, 0x09, 0x50, 0x4a, + 0x8e, 0x25, 0x04, 0xd5, 0x7c, 0x38, 0xcf, 0x14, + 0xac, 0xbc, 0xb4, 0x77, 0x57, 0x77, 0x6e, 0x78, + 0xa2, 0x7f, 0x2e, 0xcf, 0xd9, 0xf7, 0x54, 0x92, + 0x54, 0x55, 0x49, 0xda, 0xb1, 0x6e, 0xa5, 0xa6, + 0x35, 0x0c, 0x39, 0xdc, 0x73, 0x67, 0x6f, 0x8b, + 0x71, 0x1f, 0x89, 0x71, 0x17, 0x2b, 0x5c, 0x16, + 0xe5, 0x71, 0x7c, 0x7e, 0x56, 0xeb, 0x05, 0x91, + 0x6e, 0x52, 0xd3, 0xc7, 0x67, 0xc5, 0xbb, 0x83, + 0x91, 0xec, 0xd9, 0xb7, 0xbe, 0x17, 0x5e, 0xc6, + 0xe4, 0x6d, 0x72, 0x76, 0x71, 0xde, 0x5a, 0xbc, + 0x3e, 0x29, 0x40, 0x20, 0x8e, 0x4e, 0xe1, 0x5c, + 0xe6, 0x2a, 0x5b, 0x89, 0x65, 0x22, 0x22, 0x8a, + 0x22, 0x2d, 0x5e, 0x7b, 0x50, 0xe3, 0xf0, 0x76, + 0x8e, 0xb8, 0xbc, 0x90, 0x02, 0x05, 0x5a, 0xca, + 0xed, 0x25, 0x06, 0xc9, 0xef, 0x6b, 0x05, 0x5c, + 0x40, 0x1c, 0xe5, 0x7c, 0x79, 0x4c, 0x1d, 0xa3, + 0x7a, 0x57, 0x08, 0xd4, 0x7a, 0xff, 0x00, 0x37, + 0x9c, 0xba, 0x2d, 0xb7, 0x7b, 0xa0, 0x82, 0xb4, + 0x8a, 0x36, 0x6c, 0x3e, 0xf2, 0xd5, 0x79, 0x6e, + 0xa8, 0xed, 0x2e, 0x7a, 0x5d, 0xe1, 0x41, 0xfa, + 0x33, 0xca, 0x60, 0xed, 0x1b, 0xd2, 0x9e, 0x53, + 0x07, 0x68, 0xde, 0x95, 0xf9, 0xcf, 0xcb, 0x75, + 0x47, 0xcb, 0xb9, 0xe9, 0x72, 0x79, 0x6e, 0xa8, + 0xf9, 0x77, 0x3d, 0x2e, 0x41, 0xfa, 0x33, 0xca, + 0x60, 0xed, 0x1b, 0xd2, 0x9e, 0x53, 0x07, 0x68, + 0xde, 0x95, 0xf9, 0xcf, 0xcb, 0x75, 0x47, 0xcb, + 0xb9, 0xe9, 0x72, 0x79, 0x6e, 0xa8, 0xf9, 0x77, + 0x3d, 0x2e, 0x41, 0xfa, 0x33, 0xca, 0x60, 0xed, + 0x1b, 0xd2, 0x9e, 0x53, 0x07, 0x68, 0xde, 0x95, + 0xf9, 0xcf, 0xcb, 0x75, 0x47, 0xcb, 0xb9, 0xe9, + 0x77, 0x85, 0x3c, 0xb7, 0x54, 0x76, 0x97, 0x3d, + 0x2e, 0xf0, 0xa0, 0xef, 0x99, 0xf9, 0x62, 0x7e, + 0x2a, 0x60, 0xd7, 0xb4, 0x9a, 0x6e, 0xaa, 0xd1, + 0x45, 0xc2, 0x31, 0xd5, 0x7b, 0x78, 0x98, 0x19, + 0x57, 0x0e, 0x75, 0xcc, 0x70, 0x17, 0x59, 0xe7, + 0xe4, 0xe2, 0x6d, 0xdb, 0xa7, 0x30, 0x9f, 0x8c, + 0x1e, 0x4d, 0x3d, 0xf5, 0xd3, 0x4f, 0xdd, 0x92, + 0x73, 0x75, 0x67, 0xe0, 0x56, 0x05, 0x41, 0xda, + 0xa7, 0x4e, 0x35, 0xee, 0x69, 0xb1, 0x15, 0x69, + 0xa1, 0xd8, 0xbd, 0x61, 0xcf, 0xe9, 0xe9, 0xad, + 0xe5, 0xb8, 0x16, 0x40, 0x08, 0x69, 0x51, 0x4e, + 0x75, 0x49, 0x93, 0xf9, 0xd2, 0x7c, 0xe2, 0xb3, + 0xec, 0x7e, 0xeb, 0xbd, 0xff, 0x00, 0xe2, 0xa4, + 0xaa, 0xc1, 0xeb, 0x56, 0x9b, 0xa5, 0x7c, 0x80, + 0x74, 0x2f, 0x49, 0x75, 0x26, 0x9d, 0x8f, 0x86, + 0xb6, 0x23, 0xc6, 0x15, 0x1b, 0x15, 0x24, 0x8f, + 0x15, 0x65, 0x5e, 0x6d, 0x11, 0x7c, 0xc0, 0x82, + 0xdb, 0x6b, 0xa8, 0xf4, 0xed, 0xc4, 0xed, 0x81, + 0xb6, 0x20, 0x17, 0x9a, 0x02, 0x42, 0xf9, 0x97, + 0x53, 0x69, 0xc8, 0xe5, 0x7c, 0x66, 0xc4, 0x7f, + 0x0c, 0x91, 0xbb, 0x99, 0x55, 0xf1, 0x1f, 0x79, + 0x42, 0xbc, 0x6f, 0x3f, 0xee, 0x4f, 0xf3, 0xdc, + 0x83, 0xa1, 0xe9, 0x9c, 0xb6, 0x27, 0x21, 0x76, + 0xf6, 0x59, 0x5b, 0x08, 0x64, 0x60, 0xda, 0xee, + 0xe2, 0xb0, 0xe2, 0x7e, 0xff, 0x00, 0x3f, 0x31, + 0x50, 0xbd, 0x9c, 0xfd, 0xe1, 0x3f, 0xcd, 0x57, + 0xdc, 0x47, 0xdf, 0xe7, 0xe6, 0x2a, 0x8b, 0x5a, + 0x22, 0x28, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x82, 0xa7, 0x9b, 0xfc, 0xd3, 0x61, 0xdf, + 0x8f, 0xf7, 0x95, 0xac, 0x2a, 0xa6, 0x6f, 0xf3, + 0x4d, 0x8f, 0x7e, 0x3f, 0xde, 0x56, 0xb1, 0xca, + 0x82, 0x51, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x54, 0xb5, 0x5f, 0xdf, 0x78, 0xee, 0xf3, + 0x7f, 0xb8, 0x15, 0xb5, 0x54, 0xf5, 0x5f, 0xdf, + 0x58, 0xfe, 0xf0, 0xfe, 0xe0, 0x41, 0x6b, 0xe5, + 0x52, 0xa1, 0x4a, 0x0f, 0x89, 0xff, 0x00, 0x92, + 0xff, 0x00, 0x9a, 0x7e, 0x05, 0xa1, 0xd1, 0xff, + 0x00, 0xf5, 0xee, 0x3f, 0xaa, 0xe5, 0xbe, 0x98, + 0x13, 0x13, 0xc0, 0xde, 0x5a, 0x55, 0x73, 0x49, + 0xdc, 0x45, 0x10, 0xb9, 0xb7, 0x91, 0xc1, 0x92, + 0x89, 0x49, 0xe1, 0x76, 0xc3, 0x4a, 0xa0, 0xb3, + 0x22, 0x8a, 0xa9, 0x40, 0x44, 0x44, 0x1a, 0x1c, + 0xae, 0x9f, 0xb9, 0xbd, 0xbb, 0x33, 0xc7, 0x72, + 0xe8, 0xda, 0x45, 0x38, 0x42, 0xc3, 0xf5, 0x4e, + 0xfb, 0xcf, 0x1f, 0xd3, 0xfe, 0xab, 0x7d, 0x93, + 0xbe, 0x36, 0x36, 0xa6, 0x7e, 0x03, 0x25, 0x3f, + 0x65, 0xbb, 0x4a, 0xd3, 0xfa, 0xda, 0xea, 0x7f, + 0xd4, 0x93, 0xa0, 0xa0, 0xd7, 0xe4, 0xb4, 0xf6, + 0x46, 0xca, 0xd1, 0xf7, 0x0c, 0xba, 0x73, 0xf8, + 0x36, 0x91, 0x53, 0xbb, 0xa5, 0x65, 0x69, 0xdc, + 0x1c, 0x57, 0x2d, 0x8b, 0x25, 0x71, 0x21, 0x95, + 0xdb, 0xda, 0xc3, 0xb4, 0x02, 0xbc, 0x6f, 0xf5, + 0x1c, 0xd9, 0x48, 0x4d, 0x85, 0x9c, 0x2e, 0xeb, + 0x64, 0xf1, 0x5f, 0xce, 0x01, 0x56, 0x3c, 0x3d, + 0x91, 0xb1, 0xb0, 0x8a, 0xdc, 0xfc, 0x66, 0x8f, + 0x1b, 0xbe, 0x83, 0x31, 0x4a, 0x22, 0x02, 0xa7, + 0xea, 0x5f, 0xcd, 0x18, 0xbe, 0xf8, 0xf8, 0x55, + 0xc1, 0x53, 0xf5, 0x37, 0xe6, 0x9c, 0x57, 0x7d, + 0x06, 0x7d, 0xe6, 0x6a, 0xfa, 0x1b, 0x97, 0xc7, + 0x1c, 0x64, 0xb5, 0xa6, 0x8d, 0xd9, 0xc9, 0x45, + 0x8b, 0xa8, 0x6e, 0x25, 0xbb, 0xd3, 0x5d, 0x74, + 0xcd, 0xe1, 0x79, 0x90, 0x6c, 0xf7, 0x56, 0xfa, + 0x4b, 0xdc, 0x7c, 0x6f, 0x2c, 0x91, 0xcd, 0xe3, + 0x6e, 0xf0, 0xb5, 0x3a, 0xba, 0x48, 0xe5, 0xc0, + 0x97, 0xc3, 0x42, 0xce, 0x36, 0xd2, 0x88, 0x39, + 0xf3, 0xf7, 0x0f, 0x71, 0x64, 0xd8, 0x7f, 0x39, + 0xbd, 0xf5, 0x8d, 0x25, 0x48, 0x14, 0x59, 0x16, + 0x26, 0x93, 0x34, 0x9d, 0x8b, 0xc9, 0x9c, 0x4f, + 0x9f, 0x5a, 0x6b, 0x7e, 0x3f, 0x27, 0xd3, 0xf5, + 0x93, 0x13, 0xfb, 0x36, 0x8c, 0x44, 0xc4, 0xe5, + 0x19, 0x65, 0xb2, 0xf6, 0xbd, 0xef, 0xbf, 0xec, + 0x33, 0xdc, 0x5f, 0x37, 0x9f, 0xca, 0x6f, 0x7c, + 0x29, 0xbd, 0x73, 0x4d, 0xc3, 0x48, 0x35, 0x1d, + 0xc5, 0xf3, 0x76, 0xf6, 0xba, 0x21, 0xc2, 0x6a, + 0x42, 0xfa, 0x1e, 0x82, 0x62, 0x3d, 0x1e, 0x71, + 0x3b, 0x26, 0xa2, 0xbb, 0x9f, 0x9a, 0x9c, 0x67, + 0xee, 0x7a, 0x59, 0x88, 0x9a, 0xc6, 0x25, 0x7a, + 0xc4, 0xc7, 0x87, 0x38, 0xe8, 0x0c, 0x9d, 0x5f, + 0x1f, 0x0f, 0x8d, 0x5a, 0x56, 0xab, 0x2f, 0xab, + 0xc2, 0x7d, 0x17, 0xbc, 0xb5, 0xd8, 0x3b, 0x4c, + 0x43, 0xf1, 0x90, 0x3a, 0x67, 0x37, 0xac, 0x23, + 0xc6, 0xab, 0xa8, 0x56, 0x71, 0xb2, 0xc2, 0x50, + 0xd0, 0xb3, 0x77, 0xca, 0x5c, 0xb8, 0x3e, 0x97, + 0x19, 0x7d, 0xf5, 0x78, 0x3a, 0xff, 0x00, 0xe9, + 0xe9, 0x0b, 0x16, 0x1f, 0x24, 0x66, 0x68, 0xf9, + 0x27, 0x0d, 0x04, 0x24, 0x90, 0xdd, 0xd5, 0x54, + 0x3c, 0x81, 0x2c, 0xbe, 0x9d, 0xb1, 0xc8, 0x7a, + 0xb0, 0xe2, 0x1b, 0x43, 0xc8, 0xb7, 0xba, 0x18, + 0xff, 0x00, 0xf6, 0x33, 0x39, 0xee, 0x2e, 0xa3, + 0x37, 0x93, 0x54, 0x1b, 0x67, 0xe7, 0xf2, 0x21, + 0xe4, 0x75, 0x46, 0x80, 0xd0, 0x6c, 0x58, 0x5a, + 0x92, 0xf6, 0x7b, 0xbd, 0x35, 0x2b, 0xe7, 0x6f, + 0x09, 0x12, 0x34, 0x0d, 0x94, 0xe5, 0x56, 0x53, + 0x7f, 0x8d, 0xad, 0x09, 0x6e, 0xcd, 0x9c, 0x8b, + 0x47, 0xad, 0x26, 0x82, 0x5c, 0x03, 0x8c, 0x04, + 0x16, 0xf1, 0xb6, 0xb4, 0xef, 0xa0, 0xde, 0xe1, + 0x7e, 0xea, 0xb5, 0xfe, 0x9b, 0x56, 0x6a, 0xc2, + 0xc3, 0x7d, 0xd7, 0x6d, 0xfd, 0x36, 0xfc, 0x0b, + 0x35, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x42, 0xc2, + 0xc9, 0x66, 0xb1, 0xb8, 0xb8, 0xf8, 0xef, 0x6e, + 0x19, 0x0d, 0x41, 0x2d, 0x6b, 0x88, 0x0e, 0x75, + 0x39, 0x1a, 0x0e, 0xf4, 0x19, 0xab, 0x5d, 0x95, + 0xcf, 0x63, 0x71, 0x51, 0xf1, 0x5d, 0x49, 0xe3, + 0x72, 0x44, 0xcf, 0x19, 0xe7, 0xbc, 0xd5, 0x55, + 0xc8, 0xeb, 0x5b, 0xfb, 0xcb, 0x69, 0x3c, 0x92, + 0x26, 0xd9, 0xda, 0x10, 0x43, 0xae, 0xa6, 0x77, + 0x0b, 0xe9, 0xfe, 0xd6, 0x11, 0xfe, 0x6a, 0x85, + 0x79, 0xa9, 0xac, 0xad, 0x1c, 0xf7, 0x59, 0x75, + 0x97, 0x57, 0x67, 0x7d, 0xcc, 0xc4, 0xb8, 0x03, + 0xce, 0xd0, 0x49, 0x0a, 0xd2, 0x5f, 0x25, 0xd7, + 0x2b, 0xac, 0xf2, 0x77, 0x9c, 0x7d, 0x43, 0xc6, + 0x2a, 0xc6, 0x86, 0x92, 0xcc, 0x07, 0x5a, 0xe1, + 0xf3, 0x1d, 0xbb, 0xa5, 0x51, 0xf2, 0x3a, 0xaa, + 0xde, 0x07, 0xba, 0x3c, 0x7b, 0x3a, 0xf9, 0x39, + 0x6f, 0x26, 0x3c, 0x4e, 0xaf, 0x38, 0x06, 0xb4, + 0x55, 0xfb, 0xdc, 0x95, 0xf5, 0xfc, 0x86, 0x4b, + 0xa9, 0x4c, 0x84, 0xf2, 0x72, 0x74, 0x2c, 0x7a, + 0x0e, 0x44, 0xba, 0x2b, 0x9b, 0xda, 0xea, 0xf2, + 0xea, 0xf2, 0x43, 0x25, 0xcc, 0x8e, 0x91, 0xc4, + 0xd7, 0x69, 0x24, 0x74, 0x2f, 0x0a, 0x29, 0x45, + 0x2d, 0x51, 0x45, 0x28, 0x9f, 0x02, 0x02, 0x21, + 0x34, 0xef, 0xaf, 0xa2, 0xc7, 0x86, 0x07, 0xf0, + 0x9e, 0x07, 0x1a, 0x07, 0xf2, 0x14, 0x1f, 0x3b, + 0x15, 0xa3, 0x4d, 0xfb, 0x3c, 0xce, 0xe7, 0xa3, + 0x6d, 0xc0, 0x02, 0xda, 0xd1, 0xdf, 0xfb, 0x1e, + 0x68, 0x48, 0xff, 0x00, 0x68, 0x2b, 0x5f, 0xa4, + 0x31, 0x31, 0xe6, 0x35, 0x15, 0x9d, 0x84, 0xdb, + 0x23, 0x91, 0xdc, 0x4f, 0x34, 0xe4, 0x6f, 0x8d, + 0xfe, 0x4b, 0xa9, 0xfb, 0x44, 0xd4, 0xef, 0xd2, + 0xf8, 0xa8, 0x2c, 0xb1, 0xac, 0x11, 0xcb, 0x70, + 0x0b, 0x63, 0x20, 0x6c, 0x63, 0x07, 0x32, 0x0d, + 0x24, 0x9e, 0xc5, 0xb8, 0x6d, 0xcf, 0x55, 0x90, + 0x2f, 0x9b, 0xe4, 0x96, 0x00, 0x07, 0xbb, 0x55, + 0x43, 0xd4, 0x3a, 0x6b, 0x27, 0xa7, 0xee, 0xc5, + 0xad, 0xfb, 0x29, 0xc4, 0x2b, 0x1c, 0x8d, 0x35, + 0x0e, 0x1d, 0xf5, 0x97, 0x8f, 0xd7, 0x3a, 0x92, + 0xc2, 0x7e, 0xb5, 0x97, 0x4e, 0x93, 0x69, 0x25, + 0xaf, 0xf1, 0x87, 0xbe, 0xb0, 0xaf, 0xf2, 0x59, + 0xbd, 0x45, 0x7b, 0xd6, 0x4e, 0x5f, 0x77, 0x3b, + 0x8f, 0x89, 0x1b, 0x01, 0x20, 0x03, 0xc8, 0x02, + 0x0c, 0xbd, 0x23, 0xaa, 0xee, 0xb4, 0xcd, 0xf1, + 0x9e, 0x36, 0xf5, 0xb6, 0xf2, 0x7f, 0x36, 0x22, + 0x69, 0x5e, 0xea, 0xe8, 0x4e, 0xf6, 0xc1, 0x84, + 0x2d, 0x0f, 0x6d, 0xb3, 0xdd, 0x30, 0x1b, 0x41, + 0x6e, 0xe3, 0xdc, 0x2b, 0x91, 0xcd, 0x0c, 0xb0, + 0x48, 0xe8, 0x66, 0x61, 0x8e, 0x56, 0x12, 0xd7, + 0x31, 0xc2, 0x84, 0x10, 0xba, 0x1f, 0xb3, 0x5b, + 0xbd, 0x1e, 0x2d, 0x5f, 0x6f, 0x91, 0x6b, 0x19, + 0x7c, 0xe1, 0x42, 0xf9, 0xe9, 0xc2, 0x5a, 0x7e, + 0x49, 0x28, 0x22, 0xef, 0xdb, 0x2e, 0x45, 0xd2, + 0x7f, 0xc5, 0xb5, 0x63, 0x23, 0xdd, 0xe3, 0x13, + 0x5f, 0x81, 0x5d, 0x6e, 0x67, 0x8f, 0x51, 0xe8, + 0x77, 0x5e, 0xdf, 0xc5, 0xe4, 0xee, 0x92, 0x13, + 0x30, 0x1b, 0x8b, 0x5c, 0xdd, 0xad, 0x20, 0xf7, + 0xc2, 0xd7, 0xb7, 0x49, 0x7b, 0x3f, 0xb1, 0xb8, + 0xf4, 0x83, 0xe6, 0x84, 0x31, 0xc4, 0xbc, 0x07, + 0xc8, 0x0b, 0x49, 0xee, 0x2a, 0xd6, 0xbc, 0xf6, + 0x87, 0x05, 0xe5, 0xab, 0xf0, 0x98, 0x50, 0x1b, + 0x69, 0xf1, 0x64, 0x99, 0xbb, 0x01, 0x68, 0xfd, + 0x96, 0xa0, 0xc2, 0xc2, 0xfb, 0x57, 0xcc, 0x63, + 0xed, 0xdb, 0x6b, 0x79, 0x0b, 0x6f, 0xa3, 0x6f, + 0x8a, 0x1c, 0xf3, 0xc2, 0x69, 0xdd, 0xa0, 0x35, + 0x5e, 0x7a, 0x8b, 0xda, 0x7e, 0x53, 0x2d, 0x6a, + 0x6c, 0xec, 0xe1, 0x6d, 0x84, 0x0e, 0xa8, 0x7f, + 0x03, 0xaa, 0x5c, 0x3d, 0xea, 0x2a, 0x5d, 0x10, + 0x0a, 0x20, 0x13, 0xca, 0x77, 0x9d, 0xea, 0xe5, + 0xa7, 0xab, 0xe8, 0x98, 0xfb, 0xe5, 0x53, 0x4e, + 0xe5, 0x71, 0xc0, 0x1a, 0x62, 0xa3, 0xef, 0x95, + 0xbc, 0x37, 0xb3, 0x9e, 0xe6, 0xc4, 0xa8, 0x27, + 0x99, 0x45, 0x54, 0x13, 0x55, 0xd1, 0x8a, 0x2a, + 0x6a, 0xa0, 0x9e, 0x65, 0x04, 0xd1, 0x45, 0x50, + 0x09, 0x29, 0xbf, 0x7a, 0x82, 0x57, 0xc9, 0x28, + 0x3e, 0x89, 0x5f, 0x35, 0x3b, 0x94, 0x12, 0xa0, + 0x95, 0x16, 0x93, 0x52, 0xbe, 0x49, 0x28, 0x4a, + 0xf9, 0x25, 0x49, 0x12, 0x68, 0x77, 0xf2, 0xef, + 0x0b, 0x3f, 0x4b, 0x6a, 0x49, 0x34, 0xde, 0x44, + 0x45, 0x29, 0xe2, 0xc6, 0x5d, 0x3b, 0xc6, 0x69, + 0xdd, 0x1b, 0x8f, 0x28, 0x5a, 0xe2, 0x76, 0xaf, + 0x89, 0x63, 0x8e, 0x58, 0xcc, 0x6f, 0x15, 0x6b, + 0x94, 0x9d, 0xab, 0x1b, 0x1d, 0xc2, 0x19, 0xe2, + 0x9e, 0x26, 0xcb, 0x13, 0x83, 0xd8, 0xf0, 0x0b, + 0x5c, 0x36, 0xec, 0x2b, 0xee, 0xa1, 0x73, 0x4f, + 0x67, 0x9a, 0x95, 0xf6, 0xb7, 0x0e, 0xc2, 0xe4, + 0xa5, 0x0d, 0x8d, 0x8d, 0x2e, 0x82, 0x47, 0x9a, + 0x02, 0xd1, 0xc9, 0x55, 0xe5, 0xae, 0x7d, 0xa6, + 0x88, 0xf8, 0xf1, 0xd8, 0x57, 0xd5, 0xc6, 0xad, + 0x92, 0x71, 0xb8, 0x77, 0x97, 0x39, 0x86, 0xe2, + 0x56, 0x2d, 0x5d, 0xed, 0x07, 0x1d, 0x81, 0x8d, + 0xd0, 0xc2, 0x45, 0xc5, 0xe1, 0x07, 0x85, 0x80, + 0xec, 0x07, 0xba, 0xb9, 0x15, 0xc5, 0xe6, 0x7b, + 0x57, 0xe5, 0x43, 0x49, 0x74, 0xd2, 0xc8, 0xef, + 0x15, 0x82, 0xbc, 0x2d, 0x0b, 0xef, 0x01, 0xa6, + 0x73, 0x3a, 0xa3, 0x22, 0x08, 0x0f, 0x2c, 0x79, + 0xac, 0x97, 0x0f, 0xad, 0x29, 0xcb, 0xb5, 0x76, + 0xbd, 0x33, 0xa4, 0x31, 0x7a, 0x7a, 0xd9, 0xac, + 0x81, 0x81, 0xd3, 0xd3, 0xc7, 0x98, 0x8d, 0xa4, + 0xa0, 0xd0, 0x68, 0xef, 0x66, 0x76, 0x78, 0xa2, + 0x2e, 0xf2, 0x54, 0xb8, 0xb9, 0xa0, 0x2d, 0x61, + 0xf8, 0xad, 0x3f, 0xe6, 0xae, 0xbe, 0x41, 0x65, + 0xe6, 0xf1, 0x7f, 0xe0, 0xdf, 0x02, 0xf7, 0x52, + 0x83, 0xc3, 0xc8, 0x6c, 0xbc, 0xde, 0x3f, 0xfc, + 0x1b, 0xe0, 0x4f, 0x21, 0xb2, 0xf3, 0x78, 0xff, + 0x00, 0xf0, 0x6f, 0x81, 0x7b, 0xa2, 0x0f, 0x0f, + 0x21, 0xb2, 0xf3, 0x78, 0xff, 0x00, 0xf0, 0x6f, + 0x81, 0x3c, 0x86, 0xcb, 0xcd, 0xe3, 0xff, 0x00, + 0xc1, 0xbe, 0x05, 0xee, 0x88, 0x3c, 0x3c, 0x86, + 0xcb, 0xcd, 0xe3, 0xff, 0x00, 0xc1, 0xbe, 0x04, + 0xf2, 0x1b, 0x2f, 0x37, 0x8f, 0xff, 0x00, 0x06, + 0xf8, 0x17, 0xba, 0x20, 0xd3, 0xe7, 0xed, 0x2d, + 0x23, 0xc5, 0xcc, 0xf6, 0x42, 0xc6, 0xb8, 0x0d, + 0x8e, 0x6b, 0x40, 0x3e, 0xf0, 0x5a, 0x46, 0x00, + 0x71, 0x8e, 0xe2, 0x34, 0x06, 0x33, 0x53, 0xee, + 0x2b, 0x06, 0xa2, 0xfb, 0xa6, 0x6e, 0xf2, 0xaf, + 0x37, 0x66, 0x29, 0xff, 0x00, 0xd3, 0x3f, 0x02, + 0xb0, 0x39, 0xa3, 0xed, 0x30, 0xa6, 0x47, 0xd6, + 0xe0, 0xd7, 0x88, 0xec, 0xa0, 0x59, 0x96, 0x96, + 0xb8, 0x81, 0x8f, 0xba, 0x6b, 0x67, 0x25, 0x86, + 0x9c, 0x46, 0x9b, 0x95, 0x7e, 0x40, 0x3a, 0xe9, + 0x36, 0x7e, 0xd1, 0x59, 0xf6, 0x20, 0x7a, 0x32, + 0xf7, 0x67, 0xc9, 0x52, 0x55, 0xf7, 0xe4, 0x78, + 0x40, 0xda, 0x79, 0x49, 0xa7, 0x78, 0x78, 0x56, + 0x45, 0xcd, 0xa6, 0x1c, 0xf5, 0x7c, 0x57, 0x04, + 0x51, 0xa2, 0x9b, 0x39, 0x16, 0x8a, 0x83, 0x85, + 0x65, 0x5e, 0x01, 0x48, 0xbe, 0x60, 0x41, 0xb5, + 0xc6, 0xda, 0x62, 0x05, 0xfc, 0x65, 0x97, 0x05, + 0xce, 0x1b, 0xb6, 0x05, 0xe5, 0x75, 0x69, 0x86, + 0x37, 0x33, 0x17, 0x5c, 0x10, 0xe2, 0xf2, 0x4e, + 0xc0, 0xb0, 0xb1, 0x00, 0x7a, 0x4a, 0x25, 0xe1, + 0x78, 0x07, 0x96, 0x4f, 0xcb, 0xe3, 0x94, 0x17, + 0x5d, 0x0d, 0x05, 0x84, 0x77, 0xb3, 0x3a, 0xd6, + 0x63, 0x23, 0xb8, 0x76, 0x83, 0xcc, 0xae, 0x18, + 0x8f, 0xbf, 0xcf, 0xcc, 0x54, 0x2f, 0x67, 0x34, + 0xf4, 0x8c, 0xfc, 0x9e, 0x2a, 0xbe, 0xe2, 0x7e, + 0xff, 0x00, 0x3f, 0x31, 0x54, 0x5a, 0xd1, 0x11, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x15, 0x3c, 0xdf, 0xe6, 0x9b, 0x1e, 0xfc, 0x7f, + 0xbc, 0xad, 0x63, 0x95, 0x55, 0x33, 0x7f, 0x9a, + 0x6c, 0x3b, 0xf1, 0xfe, 0xf2, 0xb5, 0x8e, 0x54, + 0x12, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x0a, 0xa7, 0xaa, 0xfe, 0xfa, 0xc7, 0xf7, 0x87, + 0xef, 0xab, 0x62, 0xa9, 0x6a, 0xbf, 0xbe, 0xf1, + 0xdd, 0xe6, 0xff, 0x00, 0x70, 0x20, 0xb6, 0x29, + 0x51, 0xca, 0xa5, 0x04, 0x15, 0xa4, 0xcc, 0x69, + 0xc6, 0x5e, 0x3f, 0xca, 0x2d, 0x9c, 0x61, 0xb9, + 0x1b, 0x78, 0x86, 0xc0, 0x56, 0xf1, 0x10, 0x54, + 0x5b, 0x77, 0xa9, 0x31, 0x5e, 0x24, 0xd1, 0x9b, + 0x88, 0xc7, 0xed, 0x0d, 0xab, 0x26, 0x2d, 0x65, + 0x08, 0x00, 0x5c, 0xc2, 0xe8, 0xdd, 0xcb, 0xb1, + 0x59, 0x0b, 0x41, 0xd8, 0x45, 0x47, 0x75, 0x63, + 0xcb, 0x8f, 0xb3, 0x96, 0xbc, 0x70, 0xb4, 0x93, + 0xcb, 0x40, 0x83, 0x5b, 0x1e, 0xac, 0xc5, 0x3b, + 0x7b, 0xe9, 0xdf, 0x5e, 0xe3, 0x51, 0xe2, 0x4f, + 0xfe, 0xe0, 0x92, 0x69, 0xdc, 0x5c, 0x84, 0xd6, + 0x10, 0x2b, 0xcc, 0xbc, 0x5d, 0xa5, 0x31, 0x47, + 0xff, 0x00, 0x5d, 0x3d, 0xd4, 0x1e, 0xaf, 0xd4, + 0x18, 0x77, 0x0a, 0x3a, 0x66, 0xb8, 0x73, 0x1a, + 0x15, 0xe2, 0xfd, 0x43, 0x82, 0x67, 0x2b, 0x0f, + 0xb8, 0x14, 0xfa, 0xa7, 0x8a, 0xf9, 0x1e, 0xfa, + 0xfb, 0x66, 0x98, 0xc5, 0x37, 0xff, 0x00, 0x50, + 0x28, 0x35, 0x78, 0x37, 0xc5, 0x7b, 0x9e, 0x9e, + 0xee, 0xd6, 0x3e, 0x1b, 0x70, 0xda, 0x57, 0x9c, + 0xf7, 0x15, 0xad, 0x78, 0x5b, 0x59, 0xdb, 0xda, + 0x33, 0x82, 0x06, 0x06, 0x37, 0xb8, 0xbd, 0xd0, + 0x11, 0x11, 0x01, 0x52, 0xf5, 0x64, 0xf1, 0x5b, + 0xea, 0x4c, 0x64, 0xd3, 0x10, 0xd8, 0xd8, 0x6a, + 0x49, 0x57, 0x45, 0xab, 0xcb, 0xe9, 0xeb, 0x0c, + 0xb3, 0xd8, 0xfb, 0xa6, 0xd4, 0xc6, 0x28, 0xd2, + 0x10, 0x69, 0xae, 0x64, 0xd3, 0xd7, 0x13, 0xba, + 0x63, 0x78, 0xd0, 0x5e, 0x6a, 0x47, 0x10, 0xf0, + 0xaf, 0xbb, 0x89, 0xf4, 0xf5, 0xc6, 0x33, 0xd1, + 0xce, 0xbc, 0x68, 0x65, 0x6b, 0xc5, 0xc4, 0x3c, + 0x2b, 0xdb, 0xd4, 0x4c, 0x2f, 0xc8, 0x3d, 0x25, + 0x06, 0x84, 0xc2, 0xfc, 0x83, 0xd2, 0x50, 0x69, + 0x7d, 0x0d, 0xa5, 0xbc, 0xfc, 0x6c, 0xee, 0x8f, + 0x0a, 0x0c, 0x46, 0x96, 0x1b, 0xaf, 0xda, 0x3f, + 0xf9, 0x0f, 0x0a, 0xdd, 0x7a, 0x8b, 0x84, 0xf9, + 0x0e, 0xe9, 0x2b, 0x51, 0xea, 0xbc, 0x72, 0xdc, + 0x4f, 0x1d, 0x9d, 0x93, 0x24, 0x8e, 0x07, 0x96, + 0x71, 0x3e, 0x52, 0xd2, 0x48, 0xee, 0x04, 0xd8, + 0x5e, 0xce, 0x90, 0xf8, 0xf4, 0x46, 0x97, 0xf3, + 0xf1, 0xff, 0x00, 0x97, 0xfa, 0xa7, 0xa2, 0x34, + 0xbf, 0x9f, 0x8f, 0xfc, 0x87, 0x85, 0x66, 0xd8, + 0x69, 0x6c, 0x1d, 0xd3, 0x1e, 0x25, 0x89, 0xd0, + 0xcf, 0x09, 0xe1, 0x99, 0x84, 0x9a, 0x02, 0x39, + 0x6b, 0xcc, 0xbe, 0xe1, 0xd3, 0x3a, 0x52, 0x69, + 0x3a, 0xa8, 0x65, 0x6c, 0x92, 0x01, 0x52, 0xd6, + 0xbe, 0xa7, 0x62, 0x46, 0xed, 0x9b, 0x89, 0xeb, + 0xfe, 0x1f, 0x06, 0x00, 0xc6, 0x69, 0xd0, 0x28, + 0xdc, 0x95, 0x1a, 0x37, 0x00, 0xef, 0xf5, 0x53, + 0xe8, 0xdd, 0x3d, 0xff, 0x00, 0xfd, 0x3f, 0xff, + 0x00, 0xbb, 0xfd, 0x57, 0xb6, 0x3f, 0x4e, 0xe9, + 0xeb, 0xd9, 0xae, 0x62, 0x00, 0x37, 0xc9, 0xdc, + 0x40, 0xa3, 0xab, 0x56, 0x8f, 0xda, 0x59, 0x10, + 0x69, 0x7d, 0x2b, 0x70, 0xfe, 0xae, 0x09, 0x5b, + 0x23, 0xfe, 0x4b, 0x5f, 0x53, 0xb3, 0xb8, 0x87, + 0x3e, 0x9b, 0xda, 0xff, 0x00, 0x44, 0x69, 0x83, + 0x52, 0x6f, 0xda, 0x49, 0xe5, 0xe2, 0x1e, 0x15, + 0x9f, 0x88, 0x6e, 0x9b, 0xc5, 0xcb, 0x24, 0x91, + 0xde, 0xb5, 0xc6, 0x56, 0xf0, 0xd3, 0x88, 0x6e, + 0x3e, 0xea, 0xcb, 0xf5, 0x13, 0x09, 0xf2, 0x0f, + 0x49, 0x53, 0xea, 0x26, 0x13, 0xe4, 0x1e, 0x92, + 0x83, 0x05, 0xcc, 0xd3, 0xa5, 0xc4, 0xf9, 0x6b, + 0x76, 0x92, 0x7e, 0x30, 0xf0, 0xac, 0x3d, 0x43, + 0x77, 0x89, 0x8f, 0x06, 0xeb, 0x4b, 0x4b, 0x81, + 0x2c, 0x8e, 0x78, 0x34, 0x06, 0xab, 0x72, 0x74, + 0x26, 0x17, 0xe4, 0x1e, 0x92, 0x83, 0x42, 0x61, + 0x41, 0x07, 0x80, 0xec, 0x35, 0xde, 0x83, 0x6f, + 0x87, 0xfb, 0xae, 0xdb, 0xfa, 0x6d, 0xf8, 0x16, + 0x6a, 0xf3, 0x82, 0x16, 0x41, 0x0b, 0x21, 0x67, + 0xc5, 0x60, 0xa0, 0x5e, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0xbc, 0xe6, 0x9a, + 0x38, 0x63, 0x74, 0xb2, 0xb8, 0x35, 0x8c, 0x1c, + 0x4e, 0x71, 0xe4, 0x03, 0x79, 0x41, 0xf6, 0x56, + 0x35, 0xf6, 0x46, 0xca, 0xc2, 0x2e, 0xb6, 0xee, + 0x76, 0x40, 0xce, 0x77, 0x90, 0x2b, 0x4e, 0x6a, + 0xaa, 0xb6, 0x47, 0x5c, 0xbe, 0x72, 0xe8, 0xf0, + 0xd1, 0x12, 0xc6, 0xd4, 0x3e, 0xee, 0x50, 0x5b, + 0x18, 0xee, 0xb4, 0xee, 0x2a, 0x87, 0x91, 0xd4, + 0x16, 0x76, 0xf3, 0x3e, 0x7b, 0x99, 0xce, 0x5a, + 0xf5, 0xd5, 0x3e, 0x33, 0xbf, 0x86, 0x0f, 0xcd, + 0xdd, 0xb1, 0x5a, 0x4b, 0x5d, 0xb2, 0xba, 0xda, + 0xf2, 0xe9, 0xa4, 0x61, 0xd8, 0x60, 0x80, 0x1f, + 0x1e, 0xee, 0x61, 0xc2, 0x3f, 0xf8, 0x83, 0xb0, + 0xaa, 0x3e, 0x5f, 0x54, 0x59, 0x45, 0x2f, 0x1f, + 0x19, 0xc9, 0x5f, 0x6f, 0x74, 0xaf, 0x1e, 0x23, + 0x4f, 0xfb, 0x46, 0xe5, 0x5c, 0xc9, 0x66, 0xf2, + 0x19, 0x17, 0x9e, 0xba, 0x42, 0xc8, 0xbf, 0x66, + 0x26, 0x6c, 0x68, 0xe8, 0x5a, 0xf0, 0x28, 0x83, + 0x33, 0x23, 0x96, 0xbe, 0xc8, 0xc9, 0xc5, 0x3c, + 0x87, 0x87, 0xf6, 0x58, 0xdd, 0x8d, 0x1e, 0xe0, + 0x58, 0x61, 0x13, 0xe1, 0x51, 0x44, 0x44, 0x40, + 0xff, 0x00, 0x15, 0x44, 0xf8, 0x13, 0xbe, 0x80, + 0x9b, 0x39, 0x77, 0x25, 0x57, 0xb5, 0xad, 0x95, + 0xe5, 0xe4, 0x82, 0x3b, 0x48, 0x1f, 0x3b, 0xcf, + 0xec, 0xb1, 0xa5, 0xc5, 0x05, 0x9f, 0x17, 0xa7, + 0xf0, 0xd0, 0x5a, 0x5b, 0x64, 0x6f, 0xe5, 0x37, + 0x71, 0x4b, 0x20, 0x8a, 0x76, 0x47, 0xb5, 0xb1, + 0x71, 0x0d, 0x9c, 0x4e, 0x0b, 0x77, 0x7d, 0x8c, + 0xc6, 0xc7, 0xa5, 0xe4, 0xb0, 0x99, 0xcc, 0xea, + 0xa2, 0x95, 0xee, 0xb5, 0x98, 0x01, 0xc4, 0xd2, + 0x49, 0xe1, 0x6b, 0x8f, 0x31, 0x1c, 0xea, 0xab, + 0x13, 0x73, 0x5a, 0x7a, 0xd2, 0xe2, 0x0c, 0x85, + 0x8c, 0x82, 0xce, 0xf9, 0x9c, 0x2e, 0x8e, 0x40, + 0x5a, 0x01, 0xe4, 0x75, 0x79, 0x08, 0x5a, 0xbb, + 0xac, 0x95, 0xe5, 0xdb, 0x5a, 0xd9, 0xa4, 0x71, + 0x68, 0x01, 0xbc, 0x23, 0x60, 0x21, 0xa3, 0x85, + 0xb5, 0x1d, 0xe4, 0x1b, 0x0d, 0x1f, 0x91, 0x66, + 0x27, 0x54, 0x59, 0xdd, 0x3c, 0x82, 0xc8, 0xe4, + 0x2c, 0x71, 0xae, 0xca, 0x3a, 0xac, 0xff, 0x00, + 0x35, 0xd4, 0xbd, 0xa7, 0xe9, 0xd7, 0xe6, 0xb0, + 0x8c, 0xbc, 0xb3, 0x1d, 0x64, 0xf6, 0xbe, 0x38, + 0xa6, 0xda, 0xb0, 0xf3, 0x74, 0xae, 0x25, 0x45, + 0xd4, 0xb4, 0x0f, 0xb4, 0x5b, 0x66, 0x59, 0xb3, + 0x13, 0x9b, 0x7d, 0x0b, 0x3c, 0x48, 0xe6, 0x75, + 0x28, 0x5b, 0xc8, 0x1d, 0x54, 0x1c, 0xb8, 0x82, + 0x09, 0x69, 0x14, 0x70, 0xd8, 0x41, 0xe4, 0x21, + 0x74, 0xcf, 0x63, 0x10, 0x87, 0xcd, 0x7c, 0xf7, + 0xc2, 0xd7, 0xb1, 0x9c, 0x25, 0x93, 0x91, 0x52, + 0x1d, 0xcc, 0x0a, 0xb2, 0x64, 0x34, 0x3e, 0x8b, + 0xcc, 0xdc, 0x0b, 0xc6, 0x96, 0x02, 0xf3, 0xc4, + 0xe3, 0x1b, 0xe8, 0x1d, 0xd0, 0xbe, 0x6f, 0xb5, + 0x0e, 0x93, 0xd0, 0xf8, 0xd3, 0x69, 0x8e, 0xe1, + 0x74, 0xb4, 0x3c, 0x10, 0xb0, 0xf1, 0x12, 0xee, + 0x42, 0xf2, 0x83, 0x9d, 0xfb, 0x4e, 0x8a, 0x08, + 0xf5, 0x7d, 0xcb, 0x60, 0x00, 0x02, 0xd6, 0xb9, + 0xd4, 0xf9, 0x44, 0x54, 0xaa, 0xa5, 0x48, 0x35, + 0x1b, 0x08, 0xe5, 0x59, 0x59, 0x1c, 0x84, 0xf9, + 0x2b, 0xe9, 0xaf, 0xae, 0x0d, 0x65, 0x9d, 0xc5, + 0xce, 0xaf, 0x75, 0x63, 0x55, 0x07, 0xdb, 0xa6, + 0x9a, 0x46, 0xf0, 0x3e, 0x47, 0x39, 0xa3, 0xf6, + 0x5c, 0x49, 0x1e, 0xfa, 0xf8, 0xa0, 0xdf, 0x4f, + 0x71, 0x36, 0x93, 0x40, 0x2b, 0x5d, 0x9d, 0x2b, + 0xde, 0x7b, 0x2b, 0xdb, 0x68, 0xdb, 0x2c, 0xf0, + 0x3e, 0x26, 0x3b, 0xe2, 0xb9, 0xc2, 0x80, 0xa0, + 0xf0, 0x44, 0x4a, 0xa0, 0x1d, 0xca, 0xe1, 0x82, + 0xd9, 0x8b, 0x8b, 0xdd, 0x54, 0xf3, 0xb9, 0x5b, + 0xb0, 0x9b, 0x31, 0x91, 0x0e, 0xfa, 0xde, 0x1b, + 0xd9, 0xcf, 0x73, 0x3c, 0x94, 0xaa, 0xf9, 0x25, + 0x2a, 0x28, 0xb6, 0xc0, 0x4a, 0x85, 0x15, 0x50, + 0x4a, 0x09, 0x25, 0x7c, 0x92, 0xa0, 0x90, 0xa1, + 0x4b, 0x54, 0xa8, 0x2a, 0x2a, 0xa2, 0xa1, 0x24, + 0x2a, 0xa0, 0xa8, 0x25, 0x45, 0x54, 0x12, 0x57, + 0xca, 0x12, 0xa0, 0x94, 0x57, 0x9d, 0xc4, 0x3d, + 0x6b, 0x41, 0x61, 0xe1, 0x95, 0x9b, 0x63, 0x7f, + 0x31, 0x5b, 0x2d, 0x31, 0xa6, 0x30, 0x7a, 0x82, + 0xe8, 0x49, 0x70, 0xe3, 0x05, 0xcc, 0x24, 0x79, + 0x45, 0xbf, 0xca, 0x3f, 0x28, 0x77, 0x0a, 0xc0, + 0x25, 0x7c, 0x47, 0x75, 0x73, 0x8e, 0xbd, 0x8f, + 0x25, 0x68, 0x48, 0x92, 0x12, 0x3a, 0xc6, 0x0d, + 0xcf, 0x6f, 0x31, 0x53, 0x25, 0x89, 0x77, 0x0c, + 0x7e, 0x3a, 0xcf, 0x1f, 0x6e, 0xdb, 0x7b, 0x48, + 0xdb, 0x1c, 0x6c, 0x14, 0x14, 0x1b, 0xd6, 0x52, + 0xd2, 0xe9, 0x8c, 0xf5, 0xb6, 0x66, 0xc1, 0x93, + 0xc6, 0xea, 0xb8, 0x81, 0xc4, 0x2b, 0xb4, 0x1e, + 0x65, 0xba, 0x58, 0x68, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x50, 0x48, 0x58, 0x76, + 0x39, 0x5b, 0x5b, 0xe9, 0x26, 0x8e, 0x1a, 0xf1, + 0x5b, 0xbb, 0x81, 0xe0, 0x8a, 0x6d, 0xee, 0x20, + 0xf8, 0xce, 0xc4, 0xe9, 0x71, 0x93, 0xb5, 0xa2, + 0xa7, 0x86, 0xbd, 0x0a, 0xb5, 0x6e, 0xe1, 0x3e, + 0x3d, 0xd1, 0x03, 0x47, 0x16, 0x96, 0xfb, 0xb4, + 0x56, 0x73, 0x93, 0xb4, 0x7d, 0xdc, 0xd6, 0x14, + 0x73, 0xa5, 0x8a, 0x3e, 0xb1, 0xed, 0x02, 0xa0, + 0xb4, 0xf2, 0x77, 0xd6, 0xae, 0x5d, 0x39, 0x1c, + 0xf4, 0x9e, 0xd5, 0xee, 0x84, 0x49, 0xe3, 0x16, + 0x1d, 0x94, 0xf7, 0x15, 0x81, 0xcd, 0xdd, 0xec, + 0xfa, 0xfc, 0xc8, 0xf7, 0x75, 0xad, 0xf1, 0x8d, + 0x46, 0xde, 0x75, 0x95, 0x6f, 0xa1, 0xaf, 0x62, + 0xb3, 0xb8, 0x80, 0xca, 0xde, 0x29, 0xa9, 0x4d, + 0xbc, 0xca, 0xf7, 0xea, 0xc5, 0xc7, 0x9c, 0x14, + 0xf5, 0x66, 0x7f, 0x38, 0x28, 0x39, 0xcf, 0xe9, + 0xe6, 0x42, 0x94, 0xeb, 0x5b, 0xd2, 0xbd, 0xa7, + 0xd0, 0x57, 0xd2, 0x70, 0x7f, 0x15, 0xbe, 0x2b, + 0x69, 0xbd, 0x74, 0x1f, 0x56, 0x27, 0xf3, 0x82, + 0x9e, 0xac, 0x5c, 0x79, 0xc1, 0x41, 0x40, 0xb1, + 0xd0, 0x77, 0xb6, 0xf7, 0x4c, 0x9d, 0xd2, 0xb6, + 0x8c, 0xde, 0x2a, 0xbc, 0xe7, 0xd0, 0x17, 0xf2, + 0x4f, 0x24, 0x82, 0x56, 0xd2, 0x42, 0x48, 0xda, + 0xba, 0x17, 0xab, 0x17, 0x1e, 0x70, 0x57, 0x9c, + 0x9a, 0x7a, 0x76, 0x3e, 0x36, 0xf5, 0xcf, 0x3d, + 0x61, 0xa0, 0x20, 0x54, 0x0a, 0x73, 0xa7, 0x41, + 0x59, 0xd2, 0xda, 0x62, 0x7c, 0x2d, 0xd4, 0xb3, + 0x4e, 0xf0, 0xe0, 0xf1, 0x41, 0x42, 0xac, 0x98, + 0x3f, 0xe3, 0x66, 0xdf, 0x23, 0x36, 0xb1, 0x8d, + 0xa1, 0x2b, 0xd4, 0xe9, 0x89, 0xce, 0xc7, 0x5c, + 0x1a, 0x1d, 0xeb, 0x63, 0x61, 0x0d, 0x96, 0x3a, + 0x76, 0xd8, 0xc4, 0x09, 0x9a, 0x46, 0x97, 0x97, + 0x73, 0x80, 0x97, 0x03, 0x6a, 0x8a, 0x2a, 0x95, + 0x0a, 0x09, 0x45, 0x15, 0x52, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x82, 0xa7, 0x9b, 0xfc, 0xd3, 0x61, + 0xdf, 0x8f, 0xf7, 0x95, 0xac, 0x72, 0xaa, 0xa6, + 0x6f, 0xf3, 0x4d, 0x87, 0x7e, 0x3f, 0xde, 0x56, + 0xb1, 0xca, 0x82, 0x51, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x54, 0xb5, 0x5f, 0xdf, 0x78, + 0xee, 0xf3, 0x7f, 0xb8, 0x15, 0xb5, 0x54, 0xf5, + 0x5f, 0xdf, 0x58, 0xfe, 0xf3, 0x7f, 0xb8, 0x10, + 0x5a, 0xf9, 0x54, 0xa8, 0xe5, 0x52, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x82, 0x0a, 0xd5, 0xe2, 0x7f, 0xec, + 0xdf, 0x7f, 0x5c, 0xfc, 0x0b, 0x68, 0xb5, 0x2f, + 0xc4, 0x5f, 0xb6, 0xe2, 0x69, 0x6d, 0x6f, 0xcc, + 0x0d, 0x9d, 0xdc, 0x6e, 0x67, 0x56, 0xd7, 0x50, + 0xf7, 0xc9, 0x43, 0x87, 0x7c, 0x31, 0xa6, 0x7d, + 0xbb, 0x32, 0x19, 0x27, 0xcd, 0x53, 0x6e, 0x22, + 0x67, 0x5a, 0x19, 0x5e, 0x22, 0x79, 0x85, 0x16, + 0x1c, 0xbd, 0x63, 0xaf, 0x31, 0xf2, 0xb2, 0xcd, + 0x96, 0x96, 0xfd, 0x70, 0x6c, 0x6f, 0x1e, 0x2c, + 0x8e, 0x6d, 0x0e, 0xc7, 0x36, 0x9c, 0xab, 0x72, + 0xcc, 0x24, 0x3e, 0x43, 0x2d, 0xac, 0x8f, 0x2f, + 0x92, 0x73, 0xc5, 0x2c, 0xe7, 0x61, 0x2e, 0xdf, + 0x5a, 0x77, 0x17, 0x87, 0xa0, 0xae, 0x24, 0x96, + 0x19, 0x6e, 0xef, 0x1d, 0x3c, 0x96, 0xef, 0x0f, + 0x88, 0xf0, 0x06, 0x80, 0x06, 0xca, 0x10, 0xd3, + 0xb6, 0xbc, 0xe9, 0x1b, 0x2b, 0xa1, 0x3f, 0xe2, + 0xfe, 0x68, 0x9f, 0x85, 0x31, 0x6d, 0x5b, 0x65, + 0x0b, 0x32, 0xb2, 0x5c, 0x32, 0x91, 0x75, 0xa4, + 0x3b, 0x80, 0x51, 0xd4, 0xae, 0xe6, 0xd1, 0x78, + 0x3b, 0xad, 0x39, 0x0c, 0x74, 0xad, 0xb3, 0x65, + 0xa5, 0xb9, 0x9b, 0x82, 0x37, 0x83, 0xc3, 0x23, + 0x9b, 0x43, 0xf1, 0xdb, 0x45, 0xb5, 0x7e, 0x0c, + 0x3d, 0xd7, 0x43, 0xaf, 0x22, 0x2b, 0xa2, 0x1d, + 0xd5, 0xf0, 0xfc, 0x57, 0x8f, 0xda, 0x06, 0xab, + 0xe3, 0xd0, 0x57, 0x12, 0x4d, 0x0c, 0xf7, 0x77, + 0xae, 0x9e, 0x4b, 0x67, 0x87, 0xc6, 0x78, 0x43, + 0x00, 0x00, 0x10, 0x45, 0x01, 0xf7, 0xd2, 0x37, + 0xc7, 0x48, 0x88, 0xf7, 0x2e, 0x53, 0x7e, 0x69, + 0xfe, 0x29, 0x99, 0x6e, 0x06, 0xe5, 0x2a, 0x06, + 0xe5, 0x28, 0x82, 0x28, 0x4a, 0x84, 0x12, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, + 0x0a, 0xa1, 0x6b, 0x1d, 0x42, 0xcb, 0x9b, 0xc9, + 0xb1, 0x81, 0xe5, 0x96, 0x36, 0x23, 0x8e, 0xfd, + 0xc3, 0x67, 0x1b, 0xbf, 0x66, 0x30, 0x55, 0xf4, + 0xae, 0x1b, 0xad, 0xa6, 0x74, 0x33, 0xe4, 0xa0, + 0x04, 0x87, 0xdc, 0x5e, 0xbc, 0xc8, 0x79, 0xda, + 0x00, 0xa2, 0x41, 0x2d, 0x26, 0x5f, 0x51, 0xde, + 0x5f, 0x13, 0x0c, 0x47, 0xa8, 0xb3, 0x6e, 0xc8, + 0xe2, 0x66, 0xcd, 0x9d, 0xd2, 0x16, 0xa4, 0x28, + 0x0a, 0x55, 0x04, 0x4f, 0x87, 0x91, 0x14, 0x04, + 0x44, 0xee, 0x73, 0xf2, 0x20, 0x14, 0x5b, 0xad, + 0x37, 0xa5, 0x6f, 0xb3, 0xb9, 0x66, 0xe3, 0xc1, + 0x10, 0x10, 0xd1, 0x24, 0x9c, 0x7b, 0x0f, 0x07, + 0x38, 0x07, 0x7a, 0xf7, 0xd6, 0xda, 0x62, 0x3d, + 0x37, 0x92, 0x65, 0xac, 0x32, 0xf5, 0xd1, 0xc8, + 0xca, 0x8e, 0x70, 0x7b, 0xa8, 0x2b, 0xca, 0x5a, + 0xc7, 0x48, 0xe0, 0xc6, 0x0e, 0x27, 0xb8, 0xd1, + 0xa0, 0x6d, 0x5b, 0x48, 0x34, 0xb6, 0x7e, 0x7c, + 0x7b, 0xb2, 0x51, 0x5a, 0x3c, 0xdb, 0x33, 0xf6, + 0x88, 0x35, 0x23, 0x9c, 0x2d, 0xb7, 0xb3, 0x39, + 0xad, 0xa2, 0xd5, 0x50, 0xc7, 0x75, 0x1b, 0x5e, + 0x24, 0x69, 0x63, 0x43, 0xda, 0x0d, 0x1f, 0xee, + 0xa0, 0xd6, 0x61, 0x74, 0xcd, 0xee, 0x4b, 0x39, + 0x6f, 0x88, 0x99, 0x86, 0x07, 0xca, 0x6a, 0xf2, + 0xee, 0x46, 0x6f, 0x25, 0x74, 0x9c, 0xfe, 0x6b, + 0x11, 0xec, 0xfe, 0x2b, 0x7c, 0x7e, 0x2a, 0xc5, + 0x92, 0xdc, 0xc8, 0x2a, 0x1c, 0xef, 0x8d, 0xcd, + 0xf1, 0xb7, 0xad, 0x77, 0xb4, 0x4b, 0xd9, 0xf4, + 0xee, 0xa9, 0xb4, 0xcc, 0xda, 0x30, 0x07, 0x18, + 0x8b, 0x47, 0x31, 0x3d, 0xd5, 0x95, 0x80, 0xc4, + 0x1c, 0x8d, 0x93, 0xb5, 0x96, 0xaa, 0x3e, 0x55, + 0x23, 0x58, 0x64, 0x82, 0x1a, 0x51, 0xad, 0x68, + 0xda, 0x36, 0x0d, 0xe8, 0x2d, 0x30, 0xc3, 0x1e, + 0xad, 0xd3, 0x0d, 0xf4, 0x8d, 0xbf, 0x52, 0xeb, + 0xb8, 0xcf, 0x8a, 0x77, 0xb4, 0xf2, 0x10, 0x57, + 0x0a, 0xcd, 0xe2, 0xae, 0x70, 0xd9, 0x39, 0xf1, + 0xf7, 0x0d, 0xa3, 0xa2, 0x71, 0xe1, 0x27, 0x67, + 0x13, 0x79, 0x0a, 0xe8, 0xba, 0x4f, 0x5b, 0xe5, + 0xf3, 0x9a, 0xc0, 0x46, 0xc8, 0xf8, 0x71, 0xae, + 0x6b, 0x98, 0x22, 0x02, 0x8d, 0x8d, 0x9c, 0x84, + 0xf4, 0x2c, 0xbf, 0x6a, 0xf8, 0x1c, 0x7d, 0xd5, + 0x98, 0xca, 0x36, 0x68, 0xe1, 0xbb, 0x84, 0x50, + 0xb5, 0xc6, 0x86, 0x41, 0xcc, 0x10, 0x72, 0x14, + 0x22, 0xa2, 0x87, 0x6a, 0x6d, 0x43, 0xdc, 0xdc, + 0x83, 0xda, 0x3b, 0xcb, 0xc8, 0x9b, 0xc3, 0x1c, + 0xf2, 0xb1, 0xbb, 0xa8, 0x1e, 0xe1, 0xf0, 0x15, + 0xe4, 0xf7, 0xb9, 0xef, 0xe2, 0x7b, 0x8b, 0x9c, + 0x77, 0xb9, 0xc4, 0x93, 0xd2, 0xb2, 0x31, 0xb8, + 0xfb, 0x9c, 0x9d, 0xe4, 0x56, 0x36, 0x8d, 0xe3, + 0x9e, 0x67, 0x06, 0xb0, 0x2b, 0xef, 0xe9, 0xfe, + 0x95, 0xb0, 0xe0, 0xb2, 0xcb, 0xe5, 0x43, 0x2f, + 0xe4, 0x02, 0xa3, 0x60, 0x0c, 0x71, 0xe4, 0xde, + 0x82, 0x91, 0x06, 0x13, 0x29, 0x71, 0x8e, 0x93, + 0x25, 0x0d, 0xbb, 0x9d, 0x69, 0x11, 0xf1, 0xe5, + 0xa6, 0xc5, 0x62, 0xf6, 0x70, 0xdc, 0x05, 0xdd, + 0xd5, 0xc6, 0x3b, 0x29, 0x13, 0x4c, 0xf7, 0x4c, + 0x2d, 0x82, 0x57, 0x1d, 0x82, 0xbc, 0x8b, 0x79, + 0xa5, 0xef, 0xec, 0x70, 0xb9, 0x8b, 0x8d, 0x23, + 0x35, 0xcb, 0x6f, 0x71, 0x97, 0x35, 0x11, 0xca, + 0x29, 0x40, 0xe7, 0x6c, 0xa2, 0xa9, 0xea, 0x9c, + 0x1d, 0xd6, 0x96, 0xcf, 0x8f, 0x27, 0xa8, 0x8c, + 0xbf, 0xad, 0xb5, 0x90, 0x6e, 0xdf, 0xb9, 0x05, + 0x8b, 0x4c, 0x69, 0xcb, 0x1c, 0x36, 0xad, 0xbd, + 0xb3, 0xca, 0x86, 0x36, 0x58, 0x62, 0x73, 0xf1, + 0xa2, 0x6a, 0x70, 0x39, 0xd5, 0xd8, 0x7c, 0x6d, + 0xfb, 0x16, 0xde, 0xf7, 0x19, 0x26, 0x76, 0x11, + 0x89, 0xc8, 0xe7, 0x2d, 0x8c, 0xb2, 0x92, 0x61, + 0xb7, 0x85, 0x91, 0xd4, 0x1e, 0x6e, 0x26, 0x8a, + 0xac, 0x6d, 0x67, 0x4c, 0x9e, 0x8a, 0xc6, 0xea, + 0x0b, 0xa6, 0x18, 0x32, 0x11, 0x11, 0xb3, 0xe2, + 0xbd, 0xe0, 0x9e, 0x12, 0x2b, 0xbf, 0x68, 0xda, + 0xb4, 0xd0, 0x6b, 0x6d, 0x3b, 0x60, 0xc6, 0x5e, + 0x58, 0x62, 0x80, 0xca, 0x31, 0x9c, 0x21, 0xef, + 0x79, 0x73, 0x41, 0xdd, 0xc4, 0x2a, 0x10, 0x55, + 0x33, 0x38, 0xc9, 0xb1, 0x39, 0x29, 0xf1, 0xf3, + 0x1e, 0x27, 0xc0, 0xee, 0x12, 0xe1, 0xcb, 0xcc, + 0xb0, 0x42, 0xc8, 0xbd, 0xbd, 0x9e, 0xfe, 0xee, + 0x5b, 0xdb, 0x87, 0x71, 0xcd, 0x33, 0x8b, 0x9c, + 0x4f, 0x75, 0x78, 0x04, 0x03, 0xba, 0xaa, 0xdd, + 0x86, 0xfb, 0xb6, 0x2e, 0xf2, 0xa8, 0x9f, 0xf2, + 0x56, 0xcc, 0x39, 0xa6, 0x36, 0x2e, 0xf7, 0xf9, + 0xad, 0x61, 0xbd, 0x9c, 0xd9, 0xc4, 0xaf, 0x92, + 0x54, 0x55, 0x41, 0x72, 0xe8, 0xcd, 0x27, 0x89, + 0x41, 0x2b, 0xe5, 0x09, 0x52, 0xc0, 0x95, 0x0a, + 0x09, 0x50, 0x4a, 0x82, 0x49, 0xdb, 0x45, 0x15, + 0x50, 0x4d, 0x14, 0x55, 0x04, 0x92, 0xbe, 0x6a, + 0xa0, 0x94, 0xaa, 0x01, 0x3b, 0xd4, 0x71, 0x21, + 0x2b, 0xe5, 0x15, 0x24, 0xa8, 0xe2, 0x21, 0x41, + 0x2b, 0xe4, 0x94, 0x29, 0x99, 0xa7, 0xb3, 0x73, + 0x69, 0xec, 0x9b, 0x65, 0x69, 0x3e, 0x43, 0x3b, + 0x87, 0x58, 0xdf, 0x92, 0xee, 0x75, 0xda, 0x2c, + 0x2f, 0x62, 0xbd, 0xb6, 0x64, 0xf1, 0x38, 0x39, + 0xaf, 0x15, 0xd8, 0xb8, 0x53, 0xc3, 0x5e, 0xd2, + 0xc7, 0x8a, 0xb5, 0xdb, 0x08, 0x56, 0xbf, 0x67, + 0x5a, 0xa1, 0xf6, 0x17, 0x43, 0x0b, 0x7f, 0x27, + 0xf0, 0x24, 0xff, 0x00, 0xad, 0x21, 0xe7, 0x3f, + 0xb2, 0x4a, 0xc4, 0xc3, 0x51, 0x2e, 0xa6, 0x8a, + 0x01, 0x04, 0x6c, 0xe5, 0x52, 0xa2, 0x88, 0x88, + 0x80, 0x88, 0x88, 0x3e, 0x4a, 0xad, 0xe2, 0x4b, + 0x6d, 0xaf, 0x5d, 0x39, 0xd8, 0xc9, 0x9f, 0x33, + 0x1e, 0x79, 0xdc, 0xd7, 0x13, 0xf0, 0x05, 0x65, + 0x5a, 0x29, 0x70, 0xd7, 0x6f, 0xc7, 0xbe, 0x16, + 0x16, 0xb2, 0x7e, 0xbd, 0xf2, 0xb0, 0xf2, 0x70, + 0xbd, 0xc7, 0x7f, 0xff, 0x00, 0x12, 0x9c, 0x57, + 0x7e, 0xce, 0xb6, 0xc6, 0x83, 0x8b, 0xcb, 0x67, + 0xb8, 0xa9, 0x0f, 0x96, 0xd6, 0x67, 0xf1, 0x72, + 0xd3, 0x8b, 0xc5, 0xf7, 0x94, 0xdb, 0xb1, 0xd9, + 0x47, 0x5b, 0x59, 0x4f, 0x23, 0xc4, 0x4c, 0xb6, + 0x12, 0x12, 0xd7, 0x16, 0xb8, 0xbc, 0xd0, 0x57, + 0x88, 0x6f, 0xde, 0xb6, 0x12, 0x62, 0xe6, 0x13, + 0xd6, 0x3a, 0x75, 0x62, 0xd1, 0xd6, 0xe0, 0xff, + 0x00, 0xb8, 0xee, 0x5e, 0x03, 0x1b, 0x92, 0xb4, + 0x16, 0xd7, 0x16, 0x6c, 0x63, 0xee, 0x19, 0x08, + 0x86, 0x58, 0xde, 0xee, 0x16, 0xec, 0xe5, 0x04, + 0x04, 0xfa, 0x24, 0xed, 0x8e, 0xf4, 0xe5, 0x60, + 0x99, 0x96, 0xd6, 0x36, 0xbd, 0x73, 0x89, 0x32, + 0x06, 0x3a, 0x40, 0x4b, 0x49, 0x6d, 0x3b, 0x8b, + 0xe2, 0x4b, 0x08, 0xa4, 0xbd, 0x8f, 0x14, 0xd7, + 0xc8, 0xdb, 0x48, 0x63, 0x33, 0x39, 0xbc, 0x6e, + 0xe2, 0x73, 0x8b, 0xb8, 0x47, 0x8f, 0x5a, 0xac, + 0xb9, 0xac, 0xaf, 0x66, 0x8e, 0xcc, 0xca, 0x5a, + 0xe9, 0x61, 0x7f, 0x1c, 0xa7, 0x93, 0x71, 0xd8, + 0x14, 0xdf, 0xda, 0xdf, 0x36, 0xed, 0x97, 0xd6, + 0x0d, 0x6c, 0x92, 0x86, 0x18, 0xa4, 0x89, 0xe7, + 0x85, 0xa5, 0xb5, 0xa8, 0x3c, 0x5b, 0x77, 0x14, + 0xe2, 0x7d, 0x29, 0xe7, 0x88, 0x73, 0xe0, 0xb9, + 0xb9, 0xc7, 0x17, 0x17, 0xc7, 0x6e, 0x5a, 0x61, + 0x73, 0x8d, 0x48, 0x6b, 0x85, 0x68, 0x4f, 0x2a, + 0xf1, 0xc8, 0x5a, 0xba, 0xf7, 0x39, 0x1d, 0xbb, + 0xe4, 0x7b, 0x6d, 0xfa, 0x82, 0xe9, 0x18, 0xd7, + 0x16, 0xd7, 0x6d, 0x06, 0xd6, 0xac, 0xcc, 0x65, + 0x8d, 0xc4, 0x2e, 0x9a, 0xea, 0xee, 0x9e, 0x53, + 0x72, 0x41, 0x7b, 0x5b, 0xb5, 0xad, 0x03, 0x60, + 0x00, 0xac, 0x1c, 0x89, 0xbe, 0x6e, 0xa0, 0x85, + 0xd6, 0x41, 0xaf, 0x78, 0x80, 0xd6, 0x37, 0x9e, + 0x10, 0xe1, 0x53, 0xfb, 0x4a, 0x71, 0xc6, 0x39, + 0xdf, 0xc0, 0xfe, 0x26, 0x3c, 0xcf, 0x9a, 0xda, + 0xd6, 0xfa, 0xc1, 0x92, 0x38, 0xb6, 0x07, 0xb3, + 0xa8, 0x71, 0x24, 0xb8, 0x35, 0xc4, 0x6c, 0x2e, + 0xdf, 0xca, 0xb2, 0x7c, 0x8d, 0xb6, 0x33, 0xe3, + 0xdb, 0x0b, 0xdf, 0x59, 0xa4, 0x73, 0xa5, 0xe2, + 0x7b, 0x9d, 0xc4, 0x78, 0x3b, 0xa5, 0x7d, 0x7a, + 0x26, 0xf2, 0x4b, 0x4b, 0x87, 0xcb, 0xc3, 0xe5, + 0x77, 0x4f, 0x63, 0x9c, 0xd0, 0x6a, 0xd6, 0x86, + 0x91, 0xb0, 0x1e, 0x5d, 0x8b, 0x32, 0xea, 0xce, + 0x59, 0x66, 0xb2, 0x7b, 0x29, 0x4b, 0x77, 0x17, + 0x3e, 0xbd, 0xd6, 0xf0, 0xec, 0x57, 0x76, 0xd5, + 0x8d, 0xf1, 0xc9, 0xa0, 0x8e, 0xd5, 0xf2, 0x62, + 0xae, 0x72, 0x12, 0x4d, 0x23, 0xa7, 0xb7, 0x7c, + 0x86, 0x02, 0x1e, 0xe0, 0x1a, 0x1a, 0x4e, 0xc2, + 0x01, 0xda, 0xb2, 0x4d, 0xbc, 0x12, 0xe6, 0x6d, + 0xae, 0xe4, 0xe2, 0x32, 0x3a, 0xd8, 0x4a, 0xea, + 0x38, 0x81, 0xc4, 0x07, 0x32, 0xcc, 0x8b, 0x15, + 0x74, 0xcc, 0x3d, 0xcd, 0x99, 0xe1, 0xeb, 0xa5, + 0xeb, 0x38, 0x4d, 0x76, 0x78, 0xc4, 0x90, 0xbe, + 0x8e, 0x3e, 0xf1, 0x97, 0x56, 0x92, 0xc6, 0xd6, + 0xbd, 0x8c, 0x84, 0x43, 0x38, 0x73, 0xa9, 0x4d, + 0x9b, 0x4b, 0x79, 0xd2, 0x3e, 0x1f, 0xed, 0xa6, + 0x78, 0x47, 0x6e, 0x2d, 0x2b, 0x2e, 0x9b, 0x72, + 0xc7, 0x5e, 0xba, 0x2b, 0xc3, 0x7c, 0x5c, 0xe3, + 0x13, 0xe3, 0x0e, 0xea, 0xb6, 0x13, 0xc2, 0x28, + 0x0d, 0x16, 0xc2, 0x48, 0x64, 0xc9, 0x64, 0x6d, + 0xe2, 0xb9, 0x32, 0x47, 0x1b, 0xad, 0xc3, 0xe5, + 0x88, 0x38, 0xb0, 0xf1, 0x57, 0xfd, 0xa4, 0x2f, + 0x78, 0xad, 0x73, 0x76, 0x4d, 0x7d, 0xa5, 0xa0, + 0x8d, 0xf6, 0xe5, 0xe4, 0xc7, 0x3b, 0xdd, 0x47, + 0x31, 0xae, 0x35, 0xf8, 0xb4, 0x35, 0xa2, 0xcb, + 0x65, 0x9d, 0xc0, 0xc9, 0xb2, 0xe5, 0xe4, 0x3d, + 0x8d, 0x84, 0x46, 0xe7, 0xee, 0x25, 0xc0, 0xef, + 0xa2, 0x72, 0x5e, 0x6c, 0xd6, 0x30, 0x31, 0x8d, + 0x60, 0xad, 0x1a, 0x00, 0x15, 0xda, 0x76, 0x2f, + 0xb5, 0x0a, 0x50, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x54, 0xf3, 0x7f, 0x9a, 0x6c, 0x3b, 0xf1, 0xfe, + 0xf2, 0xb5, 0x8e, 0x55, 0x54, 0xcd, 0xfe, 0x69, + 0xb0, 0xef, 0xc7, 0xfb, 0xca, 0xd6, 0x39, 0x50, + 0x4a, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x2a, 0x96, 0xab, 0xfb, 0xeb, 0x1d, 0xde, 0x6f, + 0xf7, 0x02, 0xb6, 0xaa, 0x9e, 0xab, 0xfb, 0xeb, + 0x1f, 0xde, 0x6f, 0xf7, 0x02, 0x0b, 0x5a, 0x95, + 0x0a, 0x50, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x45, 0x56, + 0xb6, 0xef, 0x3f, 0x67, 0x6b, 0x23, 0xe3, 0x31, + 0xcd, 0x28, 0x8b, 0xf9, 0x8f, 0x89, 0x9c, 0x4d, + 0x69, 0xee, 0x95, 0xb2, 0x3c, 0xaa, 0xbb, 0x75, + 0x35, 0xed, 0xe4, 0x57, 0x8f, 0x8a, 0x46, 0x59, + 0x59, 0xc2, 0x5e, 0xd7, 0xc8, 0x00, 0x73, 0xa4, + 0x70, 0x1f, 0xb4, 0x0e, 0xe5, 0x26, 0x6a, 0xfd, + 0x84, 0x36, 0x97, 0x19, 0x9b, 0x38, 0x20, 0x8a, + 0x6a, 0x3e, 0x51, 0x30, 0xac, 0x6c, 0x8d, 0xbc, + 0x4e, 0x23, 0x9e, 0x8b, 0xe8, 0xe5, 0x6d, 0x05, + 0x90, 0xbd, 0xa9, 0x31, 0x38, 0x55, 0xad, 0x03, + 0xc6, 0x27, 0xe4, 0xf0, 0xf3, 0xad, 0x26, 0x18, + 0xb7, 0xca, 0x31, 0x85, 0xfb, 0x5b, 0xe4, 0x8f, + 0xe0, 0x3c, 0x95, 0x24, 0x2c, 0xdc, 0xab, 0xa1, + 0xe3, 0xb1, 0x7b, 0x0b, 0x7c, 0x99, 0x97, 0x00, + 0x3c, 0xb6, 0x9c, 0x20, 0xed, 0xde, 0xae, 0xe9, + 0xaf, 0xe6, 0x98, 0xee, 0xba, 0x23, 0x6c, 0xb2, + 0xad, 0xf3, 0x96, 0x73, 0xcb, 0xd4, 0x06, 0xc9, + 0x1c, 0xdc, 0x2e, 0x79, 0x8e, 0x46, 0xf0, 0xb8, + 0x35, 0xbc, 0xa4, 0x55, 0x7d, 0x9c, 0xc5, 0x98, + 0xb0, 0x19, 0x03, 0xc5, 0xd4, 0x10, 0x08, 0x34, + 0xdb, 0xb4, 0xd3, 0x77, 0xba, 0xb0, 0x2e, 0xdd, + 0x01, 0xcf, 0x34, 0x34, 0x83, 0x2f, 0x92, 0xc9, + 0xc6, 0x06, 0xfa, 0x72, 0x55, 0x60, 0xc8, 0xf6, + 0x8d, 0x24, 0xd0, 0x48, 0x0e, 0xf1, 0x5b, 0xff, + 0x00, 0xc8, 0x38, 0x6c, 0x52, 0x3f, 0xdb, 0xe3, + 0x95, 0x2f, 0x6f, 0x06, 0xe9, 0xf9, 0x18, 0x20, + 0x9e, 0xe4, 0xcd, 0x29, 0xe0, 0x85, 0xad, 0x71, + 0x67, 0x08, 0xd9, 0xc5, 0xcc, 0x79, 0x6a, 0x96, + 0xf9, 0x8b, 0x7b, 0xa1, 0x23, 0x1a, 0xc9, 0x60, + 0x91, 0x8c, 0x2f, 0x0d, 0x95, 0x9c, 0x2e, 0x20, + 0x0f, 0x8c, 0xd1, 0x5d, 0xab, 0x5f, 0x3c, 0x16, + 0xf7, 0x17, 0x59, 0x08, 0x6e, 0x24, 0x11, 0x31, + 0xd1, 0xc3, 0xe3, 0x9f, 0xd9, 0x20, 0x6c, 0x28, + 0xc9, 0xef, 0xad, 0xee, 0x1f, 0x67, 0x7b, 0xc1, + 0x70, 0x5f, 0x14, 0x8e, 0x8a, 0xe1, 0xb4, 0x0f, + 0xe1, 0x03, 0x73, 0x82, 0x6d, 0xdb, 0xec, 0x9a, + 0xee, 0x4e, 0x11, 0xdd, 0x7d, 0xf5, 0xf5, 0x4b, + 0xb3, 0x6f, 0x17, 0x96, 0x11, 0x33, 0xad, 0x96, + 0x29, 0x9b, 0xc4, 0xf7, 0xf0, 0x53, 0x8a, 0xbb, + 0x8f, 0xb8, 0xb3, 0x63, 0xca, 0xc1, 0x15, 0xb4, + 0xd3, 0xcd, 0x2b, 0xa4, 0x6b, 0x25, 0x73, 0x00, + 0xe1, 0xa3, 0x89, 0x07, 0xe2, 0xb4, 0x72, 0xad, + 0x65, 0x99, 0xff, 0x00, 0x91, 0x89, 0xe7, 0xea, + 0x9c, 0xbe, 0x62, 0x2d, 0x12, 0xc2, 0xe9, 0x36, + 0x42, 0x2f, 0xe5, 0xe2, 0x27, 0x75, 0x49, 0x75, + 0x2a, 0xb5, 0x5b, 0x6b, 0x76, 0xfd, 0xbe, 0xc2, + 0x38, 0xf4, 0xa6, 0xe6, 0xd7, 0x31, 0x6b, 0x72, + 0x24, 0xa3, 0x64, 0x89, 0xf0, 0x8e, 0x27, 0xc7, + 0x2b, 0x78, 0x5f, 0x4e, 0x7a, 0x2f, 0x08, 0xf5, + 0x26, 0x3e, 0x57, 0x46, 0x1a, 0xd9, 0x7a, 0xb9, + 0x48, 0x0d, 0x98, 0xb3, 0xf8, 0x75, 0x3c, 0x9c, + 0x55, 0x5e, 0x19, 0x22, 0x0e, 0x5d, 0x81, 0x86, + 0x8e, 0x6d, 0xbb, 0xcc, 0xb4, 0xf9, 0x27, 0x75, + 0x56, 0x24, 0xac, 0x6b, 0x74, 0xbd, 0xbf, 0x08, + 0xa6, 0xd8, 0xce, 0xce, 0x7e, 0x26, 0xed, 0x53, + 0xaf, 0xb3, 0x67, 0x7d, 0x1f, 0x8f, 0xc2, 0xd6, + 0x3b, 0x89, 0x1d, 0x1d, 0xbc, 0x92, 0x30, 0x71, + 0x39, 0x8d, 0x2e, 0x0d, 0xe7, 0x20, 0x56, 0x8b, + 0x49, 0x88, 0xc9, 0x5d, 0xcd, 0x79, 0x1b, 0x5d, + 0x70, 0x2e, 0x59, 0x3b, 0x0b, 0xdf, 0x18, 0x00, + 0x75, 0x47, 0xe4, 0x9a, 0x2c, 0xfc, 0xc5, 0xc4, + 0xb0, 0x63, 0x9c, 0xf8, 0x8f, 0x0b, 0xdc, 0x5a, + 0xce, 0x2d, 0xe1, 0xbc, 0x44, 0x36, 0xbe, 0xfa, + 0xd1, 0xcd, 0xc5, 0x82, 0xbd, 0x8e, 0xda, 0xd5, + 0xec, 0x0d, 0xbf, 0x2d, 0x70, 0x91, 0xd4, 0xa8, + 0x75, 0x7c, 0x6f, 0x70, 0xa4, 0x6f, 0x9f, 0x04, + 0x9d, 0xd0, 0xb6, 0x55, 0x4a, 0xf9, 0x07, 0x62, + 0xfa, 0x45, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x04, 0x2e, 0x4f, 0xed, 0x77, + 0x0c, 0x6d, 0xa5, 0x66, 0x4a, 0x21, 0xfc, 0x29, + 0xe8, 0xc7, 0xb4, 0x72, 0x3b, 0xe5, 0x2e, 0xb2, + 0xb5, 0x3a, 0x9f, 0x0d, 0x1e, 0x6b, 0x0d, 0x71, + 0x64, 0xf0, 0x0b, 0x9e, 0xd3, 0xd5, 0x9e, 0x67, + 0x20, 0xfc, 0xe1, 0xca, 0xa5, 0x7a, 0xdd, 0xda, + 0x4f, 0x63, 0x77, 0x2d, 0xa5, 0xc3, 0x78, 0x65, + 0x85, 0xc5, 0x8e, 0x07, 0x9c, 0x2f, 0x24, 0x0f, + 0x87, 0x91, 0x39, 0x13, 0xe0, 0xe5, 0x56, 0x5d, + 0x05, 0x6f, 0x80, 0xba, 0xcd, 0xb6, 0xdf, 0x36, + 0xda, 0xb1, 0xc3, 0xf8, 0x35, 0x3c, 0x23, 0x8c, + 0x6e, 0xaa, 0x0c, 0x4c, 0x0e, 0x90, 0xcd, 0xe7, + 0x64, 0x68, 0xb5, 0xb7, 0x7b, 0x61, 0x77, 0xfe, + 0xf7, 0x82, 0x19, 0x4e, 0xfa, 0xe9, 0xd8, 0x3d, + 0x01, 0xa7, 0xb4, 0xc4, 0x5e, 0x5f, 0x97, 0x9d, + 0x93, 0x4a, 0x36, 0xf5, 0x93, 0x51, 0xad, 0x69, + 0xe6, 0x1c, 0xeb, 0xeb, 0x27, 0xed, 0x23, 0x4f, + 0x61, 0x25, 0x66, 0x3b, 0x1c, 0xc1, 0x37, 0x0b, + 0x83, 0x1d, 0xd5, 0xec, 0x8c, 0x72, 0x7c, 0x60, + 0xb7, 0x3a, 0x9b, 0x19, 0x06, 0xa5, 0xd3, 0x6f, + 0x64, 0x4e, 0xe2, 0x12, 0x30, 0x4b, 0x0b, 0x9b, + 0xb6, 0xa6, 0x95, 0x01, 0x07, 0x35, 0xd7, 0x1a, + 0xaf, 0x1d, 0x26, 0x62, 0x0b, 0xcd, 0x3a, 0x7a, + 0x9b, 0x88, 0x1a, 0x59, 0x25, 0xc3, 0x36, 0x07, + 0x0a, 0xec, 0xd8, 0x16, 0xf2, 0xc7, 0x40, 0x5b, + 0xe6, 0xb0, 0x12, 0x65, 0x65, 0xbd, 0x7d, 0xe6, + 0x42, 0xe2, 0x32, 0xf8, 0xe4, 0x76, 0xe6, 0xb8, + 0x6d, 0xa0, 0x15, 0x5c, 0xba, 0x68, 0x24, 0xb6, + 0x9d, 0xf6, 0xf3, 0x37, 0x85, 0xf1, 0x38, 0xb1, + 0xc0, 0xf2, 0x10, 0x57, 0x45, 0xf6, 0x49, 0xaa, + 0x04, 0x17, 0x0e, 0xc1, 0xdd, 0x3e, 0x8d, 0x97, + 0x6d, 0xbf, 0x11, 0xd9, 0xc4, 0x39, 0x3d, 0xd4, + 0x1b, 0x1d, 0x13, 0xaf, 0xa3, 0x0e, 0xf4, 0x06, + 0x74, 0x36, 0x09, 0xa2, 0x3d, 0x53, 0x1e, 0x40, + 0x6b, 0x4d, 0x36, 0x51, 0xc3, 0x72, 0xf4, 0xd4, + 0x7a, 0x25, 0xb6, 0x59, 0x6b, 0x6d, 0x4b, 0x83, + 0x67, 0x17, 0x04, 0xad, 0x7c, 0xd0, 0x33, 0x71, + 0x07, 0x65, 0x5b, 0x45, 0xa6, 0xf6, 0xaf, 0xa5, + 0xbc, 0x92, 0xed, 0xb9, 0xbb, 0x46, 0x90, 0xc9, + 0xcd, 0x25, 0xe1, 0x1b, 0x1a, 0xee, 0x75, 0x1a, + 0x13, 0xda, 0x43, 0xec, 0xdd, 0x1e, 0x2f, 0x32, + 0xfe, 0x3b, 0x63, 0x41, 0x14, 0xee, 0xfd, 0x9a, + 0xf2, 0x14, 0x1b, 0xaf, 0x6b, 0xd6, 0x4f, 0xba, + 0xc0, 0x5a, 0xde, 0xb5, 0x94, 0x30, 0xb8, 0x19, + 0x2b, 0xbc, 0x02, 0x16, 0x36, 0x86, 0xd7, 0xd8, + 0x93, 0x87, 0x6e, 0x1f, 0x32, 0x44, 0x7d, 0x4b, + 0x78, 0x1a, 0xe7, 0x7c, 0x57, 0x33, 0x90, 0x1a, + 0xac, 0xaf, 0x68, 0xfa, 0xc3, 0x03, 0x36, 0x16, + 0x7c, 0x54, 0x52, 0x79, 0x45, 0xc4, 0xe0, 0x70, + 0x16, 0x6d, 0x68, 0x3b, 0xf6, 0x95, 0xc8, 0x0f, + 0x49, 0x41, 0xd4, 0xf3, 0xba, 0xd7, 0x4d, 0x60, + 0xed, 0xa6, 0xb6, 0xd3, 0x51, 0x31, 0xd7, 0x57, + 0x2d, 0x20, 0xcc, 0xcd, 0xcd, 0xae, 0xcd, 0x85, + 0x73, 0x4b, 0x9c, 0x85, 0xf5, 0xe3, 0x40, 0xba, + 0x9d, 0xf3, 0x06, 0xee, 0x0e, 0x71, 0x34, 0xaa, + 0xf3, 0xb7, 0xb5, 0x9e, 0xe6, 0x4e, 0xaa, 0xdd, + 0x85, 0xef, 0x3c, 0x80, 0x2f, 0xab, 0xab, 0x3b, + 0xab, 0x39, 0x04, 0x77, 0x90, 0xbe, 0x12, 0x7c, + 0x6e, 0x17, 0x8a, 0x55, 0xbd, 0xc4, 0x1e, 0x35, + 0xe4, 0x57, 0x0f, 0x67, 0x9a, 0x42, 0xcb, 0x52, + 0x5c, 0x4e, 0xeb, 0xc9, 0x4b, 0x63, 0xb6, 0xa5, + 0x61, 0x1f, 0xb5, 0x5a, 0x6d, 0x57, 0x4d, 0x37, + 0xa7, 0x74, 0x6e, 0x53, 0x49, 0x87, 0x32, 0x21, + 0xc2, 0xf6, 0x52, 0x79, 0x4f, 0xc6, 0x6b, 0xf9, + 0xd6, 0xb3, 0x4c, 0x60, 0x2f, 0x74, 0xa6, 0xab, + 0xea, 0x78, 0x8c, 0xd6, 0x39, 0x18, 0xcb, 0x2d, + 0xae, 0x19, 0xb5, 0xb5, 0x3b, 0x5a, 0x4f, 0x42, + 0x0f, 0x0c, 0x3e, 0x0a, 0x3d, 0x2d, 0xed, 0x0e, + 0x28, 0xa5, 0x01, 0x96, 0xb3, 0x87, 0x79, 0x2c, + 0x87, 0x68, 0xdb, 0xc9, 0x52, 0xab, 0x1a, 0xff, + 0x00, 0x1d, 0x7d, 0x63, 0xa9, 0xae, 0x9d, 0x75, + 0xc4, 0x5b, 0x2b, 0xb8, 0xe1, 0x94, 0xd6, 0x85, + 0xa7, 0x6e, 0xc3, 0xdc, 0x57, 0xfb, 0xc8, 0xfd, + 0x66, 0xb1, 0xbc, 0xc6, 0x57, 0x87, 0x37, 0x87, + 0x93, 0x8e, 0x19, 0x3f, 0x68, 0xd3, 0x68, 0x21, + 0x69, 0x21, 0xd7, 0xf8, 0xcb, 0x9b, 0x71, 0x8f, + 0xd5, 0x76, 0x1d, 0x6d, 0xcd, 0x99, 0xe0, 0xeb, + 0x1a, 0x2a, 0xe3, 0x41, 0x4d, 0xa8, 0x35, 0x5a, + 0x7b, 0x4d, 0x59, 0xdc, 0x69, 0x3b, 0xec, 0xf4, + 0xae, 0x78, 0xbb, 0xb7, 0x35, 0x82, 0x4d, 0xa3, + 0x68, 0x35, 0xe2, 0xaf, 0x2a, 0xcc, 0xc7, 0xfb, + 0x4d, 0xb6, 0x92, 0xc1, 0x96, 0xf9, 0xbb, 0x06, + 0xde, 0x4b, 0x08, 0x1d, 0x5c, 0xa4, 0x02, 0x49, + 0x1c, 0xfb, 0x16, 0x16, 0xa8, 0xd7, 0x50, 0xdf, + 0xe3, 0x86, 0x1b, 0x0d, 0x07, 0x91, 0xe3, 0xbf, + 0x6f, 0x65, 0x0b, 0xa9, 0xb7, 0x6a, 0xa7, 0x0a, + 0x81, 0xcc, 0x79, 0x90, 0x6f, 0xf5, 0x56, 0xb0, + 0xbf, 0xd4, 0x72, 0xb2, 0x37, 0xb0, 0x5b, 0xd9, + 0xc3, 0xfc, 0x9b, 0x76, 0x7c, 0x51, 0xc9, 0x55, + 0xa0, 0x3b, 0x76, 0xa2, 0x7c, 0x28, 0x08, 0x88, + 0x80, 0x55, 0xaf, 0x12, 0x7f, 0xfa, 0xe8, 0x7b, + 0xdf, 0xe6, 0xaa, 0x87, 0xfc, 0x95, 0xa7, 0x15, + 0xf7, 0x7c, 0x3d, 0xef, 0xf3, 0x5a, 0xc5, 0x32, + 0x66, 0x55, 0x45, 0x52, 0xaa, 0x09, 0x5a, 0xb6, + 0x0a, 0x95, 0x04, 0x95, 0x04, 0xa8, 0xa9, 0x40, + 0x25, 0x09, 0x50, 0x4a, 0x8a, 0xa0, 0x9a, 0xa8, + 0x25, 0x45, 0x4a, 0x8a, 0xa0, 0x12, 0x57, 0xcd, + 0x4a, 0x13, 0xbd, 0x45, 0x50, 0x49, 0x25, 0x7c, + 0xd5, 0x09, 0xda, 0xa1, 0x14, 0x24, 0xaf, 0x92, + 0x54, 0x92, 0xbe, 0x4a, 0x82, 0x6a, 0xbc, 0xa5, + 0x61, 0x70, 0x0e, 0x69, 0xe0, 0x91, 0x87, 0x8a, + 0x37, 0x8d, 0xe0, 0x8d, 0xcb, 0xec, 0x95, 0x1c, + 0xb5, 0x49, 0x57, 0x55, 0xd0, 0x3a, 0xa9, 0xb9, + 0xab, 0x01, 0x69, 0x70, 0x78, 0x6f, 0xed, 0x47, + 0x0c, 0xad, 0xf9, 0x4d, 0x1b, 0x9c, 0x15, 0xb2, + 0xab, 0x82, 0x63, 0xf2, 0x37, 0x58, 0x9b, 0xf8, + 0xf2, 0x36, 0x6e, 0xe1, 0x96, 0x33, 0xe3, 0x8f, + 0x96, 0xcf, 0xda, 0x05, 0x76, 0xbc, 0x16, 0x6a, + 0xd3, 0x35, 0x8f, 0x8a, 0xfa, 0xd5, 0xd5, 0x6b, + 0xc7, 0x8c, 0xde, 0x56, 0xb8, 0x6f, 0x05, 0x66, + 0x9a, 0x6c, 0x51, 0x11, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x41, 0x0a, 0x51, 0x10, 0x11, 0x11, 0x04, + 0x2f, 0x13, 0x69, 0x09, 0xba, 0x6d, 0xd9, 0x6f, + 0xf1, 0x9a, 0xde, 0x00, 0xee, 0xe2, 0xf7, 0x44, + 0x10, 0xa5, 0x11, 0x04, 0x22, 0x94, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x41, 0x53, 0xcd, 0xfe, 0x69, 0xb0, 0xef, 0xc7, + 0xfb, 0xca, 0xd6, 0x39, 0x55, 0x53, 0x37, 0xf9, + 0xa6, 0xc3, 0xbf, 0x1f, 0xef, 0x2b, 0x58, 0xe5, + 0x41, 0x28, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0xaa, 0x7a, 0xaf, 0xef, 0xac, 0x7f, 0x79, + 0xbf, 0xdc, 0x0a, 0xd8, 0xaa, 0x7a, 0xaf, 0xef, + 0xac, 0x7f, 0x79, 0xbf, 0xdc, 0x08, 0x2d, 0x7c, + 0xaa, 0x54, 0x72, 0xa9, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x5a, 0xe7, 0xe0, 0xb1, 0xcf, 0xb8, 0x37, + 0x0e, 0x8c, 0x97, 0xb8, 0xd5, 0xcd, 0xe2, 0x3c, + 0x04, 0x9e, 0x76, 0xee, 0x5b, 0x05, 0xaa, 0x9b, + 0x52, 0xd8, 0x44, 0xe9, 0x1a, 0xe6, 0xca, 0x44, + 0x2e, 0x2c, 0x95, 0xe1, 0xb5, 0x6b, 0x48, 0xe7, + 0x28, 0x3d, 0xe4, 0xc2, 0xe3, 0xe4, 0xb5, 0x8e, + 0xd5, 0xcc, 0x22, 0x28, 0x8d, 0x59, 0xc2, 0xe2, + 0x1c, 0x2b, 0xfe, 0xe1, 0xb5, 0x7a, 0x1c, 0x75, + 0xa7, 0x91, 0xf9, 0x17, 0x07, 0xf0, 0x29, 0x4a, + 0x72, 0xf7, 0xeb, 0xce, 0xbc, 0xad, 0xb3, 0x56, + 0xb7, 0x37, 0x3e, 0x4c, 0xd6, 0xbd, 0x8e, 0xe1, + 0x2f, 0x6b, 0x9e, 0xda, 0x35, 0xcd, 0x1c, 0xad, + 0x3c, 0xab, 0xcf, 0xd3, 0xf6, 0x5d, 0x77, 0x57, + 0xc3, 0x27, 0x07, 0x17, 0x0f, 0x5f, 0xc3, 0xfc, + 0x2a, 0xfc, 0xf4, 0x18, 0xd0, 0x62, 0x63, 0xb3, + 0xcd, 0x44, 0xeb, 0x78, 0x9d, 0xd5, 0x18, 0x5e, + 0x1f, 0x23, 0x89, 0x76, 0xd2, 0x5b, 0x40, 0x49, + 0x59, 0x2e, 0xd3, 0xf8, 0xc7, 0xc8, 0xf7, 0x3a, + 0x33, 0xfc, 0x43, 0x57, 0x37, 0x88, 0xf0, 0xd6, + 0xb5, 0xd8, 0xdd, 0xc1, 0x7d, 0x5d, 0x67, 0x2d, + 0x2d, 0xae, 0x1d, 0x6c, 0x59, 0x24, 0xb3, 0x31, + 0xa1, 0xc5, 0x91, 0xb7, 0x88, 0xf0, 0xbb, 0x94, + 0x28, 0x76, 0x56, 0x19, 0x60, 0xb7, 0x9e, 0x27, + 0xb9, 0x8c, 0x96, 0x40, 0xda, 0x70, 0x82, 0xe3, + 0xb0, 0xd5, 0xa4, 0x72, 0x6e, 0x43, 0x8f, 0xb7, + 0xe9, 0x6c, 0x89, 0x31, 0xb6, 0x92, 0xf5, 0xdd, + 0x63, 0x2b, 0xd7, 0xb4, 0x36, 0x4d, 0xbb, 0xc3, + 0x77, 0x2f, 0x3b, 0x4c, 0x35, 0x8d, 0xa1, 0x79, + 0x89, 0xae, 0x26, 0x41, 0xc2, 0xe2, 0xf7, 0x17, + 0x1a, 0x1d, 0xf4, 0xe2, 0xdc, 0xb0, 0xf1, 0x59, + 0xb7, 0x4f, 0x25, 0xe1, 0xb8, 0x0f, 0x64, 0x70, + 0x38, 0xf0, 0xb9, 0xed, 0xe1, 0x68, 0x68, 0xe4, + 0xaf, 0x3a, 0xca, 0xb4, 0xce, 0x5a, 0xdd, 0x4c, + 0xd8, 0x43, 0x24, 0x89, 0xcf, 0x15, 0x8c, 0xc8, + 0xde, 0x10, 0xef, 0x9a, 0x79, 0x53, 0xf0, 0xf1, + 0x3a, 0x76, 0xd8, 0xfb, 0x7e, 0x22, 0xc5, 0xed, + 0x81, 0xa5, 0x84, 0x0b, 0x63, 0x58, 0x88, 0x24, + 0x11, 0x4e, 0xef, 0x2a, 0xfa, 0x76, 0x2e, 0xcd, + 0xd0, 0x49, 0x6e, 0xe6, 0x56, 0x39, 0x5c, 0x5e, + 0xe1, 0xb6, 0xbc, 0x4e, 0x35, 0xa8, 0x2b, 0xc1, + 0xf9, 0xbb, 0x67, 0x4b, 0x24, 0x11, 0x36, 0x57, + 0x39, 0x9c, 0x4d, 0x7c, 0x8c, 0x65, 0x5a, 0xc2, + 0xd0, 0x7e, 0x32, 0xf8, 0x19, 0xbb, 0x68, 0x21, + 0xb7, 0x12, 0x19, 0x26, 0x92, 0x76, 0x71, 0xb3, + 0x85, 0xbe, 0x33, 0xf7, 0x7e, 0xc8, 0x4d, 0xfd, + 0xff, 0x00, 0x31, 0x93, 0x6b, 0x89, 0xb2, 0xb4, + 0x64, 0x8d, 0x85, 0x87, 0xf8, 0xa2, 0x8f, 0x73, + 0x89, 0x73, 0x88, 0xa5, 0x29, 0x53, 0xb5, 0x7d, + 0x3b, 0x19, 0x66, 0xeb, 0x56, 0x59, 0x96, 0x1e, + 0xa1, 0x94, 0x2d, 0x6d, 0x7e, 0x49, 0xa8, 0xda, + 0xbc, 0xed, 0xf3, 0x36, 0x93, 0xdb, 0x49, 0x73, + 0xe3, 0x44, 0xd8, 0x76, 0x48, 0xd9, 0x07, 0x0b, + 0x81, 0xe6, 0xa2, 0xf1, 0x83, 0x51, 0x59, 0xcb, + 0x3c, 0x50, 0x18, 0xe5, 0x8e, 0x49, 0xcd, 0x23, + 0x6b, 0xdb, 0x4a, 0x8a, 0x57, 0x8b, 0xbc, 0x87, + 0x3e, 0x8d, 0x8c, 0x91, 0x47, 0x2c, 0x6e, 0x8a, + 0x46, 0x87, 0x31, 0xc2, 0x84, 0x1e, 0x65, 0x81, + 0x1e, 0x9e, 0xc5, 0xb0, 0x3b, 0xf8, 0x65, 0xc5, + 0xe2, 0x95, 0x7b, 0x8b, 0x88, 0x15, 0xaf, 0x8a, + 0x4e, 0xe5, 0xb3, 0x44, 0x1f, 0x2c, 0x63, 0x58, + 0xc0, 0xc6, 0xfc, 0x56, 0x8a, 0x0e, 0xf0, 0x5f, + 0x48, 0xb0, 0xf2, 0x19, 0x3b, 0x6b, 0x08, 0xb8, + 0xe6, 0x70, 0xe2, 0x3f, 0x15, 0xbc, 0xa5, 0x06, + 0x44, 0xd3, 0x45, 0x03, 0x0c, 0x92, 0xb8, 0x31, + 0xa3, 0x69, 0x25, 0x6a, 0xce, 0xa4, 0xb7, 0x2f, + 0x22, 0x38, 0xdc, 0xf6, 0x72, 0x38, 0x0d, 0x8b, + 0x57, 0x2b, 0xae, 0xb2, 0xf2, 0x09, 0x6e, 0x8f, + 0x55, 0x6c, 0x36, 0xb2, 0x31, 0xb2, 0xbd, 0xf5, + 0x92, 0xd6, 0x46, 0xc1, 0xc2, 0xc0, 0x00, 0x1c, + 0x88, 0x32, 0xfd, 0x62, 0x8f, 0xb1, 0x7f, 0x42, + 0x8f, 0x58, 0x99, 0xd8, 0xbf, 0xa1, 0x63, 0x51, + 0xbd, 0xc4, 0xa0, 0xe6, 0x08, 0x32, 0x7d, 0x62, + 0x67, 0x62, 0xfe, 0x84, 0xf5, 0x89, 0x9d, 0x8b, + 0xfa, 0x16, 0x35, 0x07, 0x30, 0x4a, 0x37, 0xb8, + 0x83, 0x27, 0xd6, 0x26, 0x76, 0x2f, 0xe8, 0x4f, + 0x58, 0xa3, 0xec, 0x5f, 0xd0, 0xb1, 0xa8, 0xde, + 0xe2, 0x51, 0xbd, 0xc4, 0x19, 0x5e, 0xb0, 0xc7, + 0xd8, 0xbf, 0xa1, 0x3d, 0x62, 0x8f, 0xb1, 0x7f, + 0x42, 0xc5, 0xa3, 0x7b, 0x89, 0x46, 0xf7, 0x10, + 0x64, 0xfa, 0xc5, 0x1f, 0x62, 0xfe, 0x84, 0xf5, + 0x8a, 0x3a, 0x54, 0xc4, 0xe0, 0x07, 0x29, 0x0b, + 0x0e, 0x69, 0xa1, 0x81, 0x86, 0x49, 0x5c, 0x1a, + 0xd0, 0xab, 0x19, 0x6c, 0xfc, 0x97, 0x0e, 0x30, + 0xdb, 0x78, 0x91, 0x6e, 0x24, 0x72, 0xa0, 0xb7, + 0xdb, 0xea, 0xdb, 0x0b, 0x8b, 0xb6, 0x5a, 0xb0, + 0x1e, 0xb1, 0xe6, 0x83, 0xbe, 0xb6, 0xd7, 0x57, + 0x76, 0xd6, 0x90, 0x99, 0xae, 0x5e, 0x22, 0x8c, + 0x6f, 0x73, 0x8d, 0x02, 0xe5, 0x36, 0x17, 0x91, + 0x63, 0xef, 0x63, 0xbf, 0x9b, 0x6b, 0x20, 0xab, + 0x9d, 0xdd, 0x5a, 0x1d, 0x5f, 0xae, 0x32, 0x1a, + 0x92, 0xe7, 0xc9, 0xe0, 0xe2, 0x8e, 0xcc, 0x3b, + 0xf8, 0x71, 0x36, 0xb5, 0x28, 0x3b, 0x08, 0xd5, + 0xfa, 0x77, 0xcf, 0x62, 0xff, 0x00, 0xc8, 0x29, + 0xf5, 0xbf, 0x4e, 0xf9, 0xf4, 0x5f, 0xf9, 0x05, + 0xc2, 0xd9, 0xa4, 0x75, 0x1c, 0x8c, 0x6b, 0xdb, + 0x6b, 0x21, 0x6b, 0x85, 0x46, 0xf5, 0x3e, 0xa6, + 0xea, 0x5f, 0x35, 0x93, 0xa0, 0xa0, 0xdf, 0xfb, + 0x50, 0x87, 0x11, 0x71, 0x7e, 0xcc, 0xae, 0x32, + 0x76, 0x4a, 0x66, 0x1c, 0x33, 0x31, 0x94, 0xd8, + 0x47, 0xed, 0x1a, 0x73, 0xd5, 0x52, 0x3b, 0xab, + 0x79, 0x0e, 0x90, 0xd4, 0x8c, 0x75, 0x1d, 0x6b, + 0x27, 0x03, 0xb6, 0x3b, 0x62, 0xd4, 0xdd, 0xda, + 0xcf, 0x67, 0x70, 0xfb, 0x6b, 0x86, 0x18, 0xe4, + 0x66, 0xce, 0x17, 0x0a, 0x20, 0xf1, 0x52, 0x0b, + 0x9a, 0x43, 0x9a, 0x48, 0x70, 0xdc, 0x46, 0xc2, + 0x14, 0x7c, 0x3c, 0xc8, 0x80, 0x6a, 0x6a, 0x4e, + 0xfe, 0x53, 0xca, 0xba, 0xd7, 0xb2, 0x5d, 0x51, + 0xe5, 0x16, 0xee, 0xc2, 0xdd, 0x3c, 0x75, 0x90, + 0xed, 0xb7, 0xa9, 0xda, 0x5b, 0xcd, 0xee, 0x2e, + 0x4a, 0xb3, 0xb0, 0xb9, 0x59, 0xb0, 0xf9, 0x38, + 0x32, 0x10, 0x1a, 0x3a, 0x27, 0x0a, 0xf7, 0x47, + 0x28, 0x41, 0x74, 0xf6, 0xaf, 0xa5, 0xdb, 0x63, + 0x76, 0xdc, 0xdd, 0xab, 0x69, 0x05, 0xc9, 0xa4, + 0xe0, 0x6e, 0x0f, 0xff, 0x00, 0x55, 0x41, 0xb6, + 0xb9, 0x96, 0xd6, 0xe2, 0x2b, 0x98, 0x0f, 0x0c, + 0x91, 0x38, 0x39, 0xa4, 0x6f, 0xd8, 0x6a, 0xbb, + 0xa6, 0x6f, 0x31, 0xa7, 0x73, 0x1a, 0x55, 0xd2, + 0x5e, 0xdc, 0x32, 0x38, 0x6e, 0x63, 0xe2, 0x60, + 0x24, 0x71, 0x07, 0xd3, 0x90, 0x73, 0xae, 0x12, + 0xf6, 0xb1, 0xb2, 0x3d, 0xac, 0x35, 0x8c, 0x38, + 0xf0, 0x3b, 0x9c, 0x72, 0x20, 0xec, 0x39, 0x2d, + 0x6d, 0xa6, 0xf2, 0x9a, 0x42, 0x99, 0x19, 0x1a, + 0x67, 0x9a, 0x3a, 0x3a, 0xdd, 0xa4, 0x17, 0x07, + 0x81, 0xbe, 0x8b, 0x8e, 0x3b, 0x86, 0xa4, 0x33, + 0xe2, 0xd7, 0xc5, 0xef, 0x28, 0xff, 0x00, 0x1b, + 0x53, 0x67, 0x7c, 0x72, 0xa0, 0x9a, 0x93, 0xbc, + 0xd4, 0xad, 0x9e, 0x03, 0x01, 0x7d, 0x9f, 0xbf, + 0x16, 0x56, 0x3c, 0x3c, 0x74, 0xe2, 0x71, 0x71, + 0xa5, 0x07, 0x2a, 0xb8, 0x69, 0x6f, 0x66, 0x56, + 0x99, 0x9c, 0x1f, 0xa4, 0x26, 0xba, 0x22, 0x69, + 0xdb, 0x58, 0x43, 0x69, 0x46, 0x9e, 0x4a, 0xac, + 0x5d, 0x27, 0x63, 0x90, 0xd2, 0x7a, 0xde, 0x1b, + 0x6c, 0x8c, 0x65, 0xad, 0x9a, 0xb1, 0x32, 0x4f, + 0xd9, 0x75, 0x79, 0x41, 0xe5, 0x41, 0x95, 0x63, + 0x81, 0x76, 0x94, 0xc9, 0xba, 0xce, 0xf0, 0xb0, + 0x99, 0x9b, 0xc6, 0xc9, 0xde, 0x68, 0xd7, 0xb4, + 0x7c, 0x68, 0xc1, 0xe7, 0x5a, 0x6d, 0x67, 0x7d, + 0x05, 0xc4, 0x50, 0xc3, 0xc4, 0x24, 0x98, 0x3e, + 0x42, 0xda, 0x6d, 0xe0, 0x67, 0x16, 0xc1, 0x5e, + 0x5d, 0x8b, 0xa1, 0x6a, 0x6b, 0x7b, 0x7d, 0x59, + 0x6b, 0x90, 0xc4, 0x00, 0x19, 0x91, 0xc6, 0x38, + 0x49, 0x11, 0xdc, 0xe2, 0x29, 0x5d, 0x8b, 0x8a, + 0xcd, 0x1c, 0x91, 0x4f, 0x24, 0x53, 0x54, 0x49, + 0x19, 0x2d, 0x78, 0x3b, 0xea, 0xdd, 0x85, 0x05, + 0xbf, 0xd9, 0xc6, 0xa7, 0x66, 0x33, 0x22, 0x71, + 0xb7, 0x87, 0xfe, 0x0d, 0xf7, 0xf0, 0xdc, 0x39, + 0x03, 0x9d, 0xb0, 0x15, 0x6c, 0x97, 0x39, 0x3e, + 0x8b, 0xcd, 0xb7, 0x1b, 0x91, 0x06, 0x7c, 0x44, + 0xc7, 0x8e, 0xca, 0x67, 0x6d, 0x31, 0xd7, 0x65, + 0x01, 0xee, 0x2e, 0x44, 0x0b, 0x9a, 0xe0, 0xf6, + 0x9a, 0x39, 0xa6, 0xad, 0x23, 0x92, 0x8b, 0x61, + 0x95, 0xcf, 0xe5, 0x72, 0xec, 0x85, 0x97, 0xf2, + 0xf5, 0x8d, 0xb7, 0x68, 0x6c, 0x60, 0xf7, 0x10, + 0x58, 0x73, 0xfa, 0xb2, 0x3b, 0x5d, 0x5b, 0x2e, + 0x5f, 0x4f, 0xca, 0x69, 0x23, 0x38, 0x5e, 0x48, + 0xd8, 0x49, 0xee, 0x2a, 0x9d, 0xd5, 0xcc, 0xd7, + 0x97, 0x32, 0x5c, 0xce, 0x43, 0xa5, 0x99, 0xdc, + 0x6f, 0x23, 0x65, 0x49, 0xee, 0x2f, 0x1a, 0x51, + 0x4d, 0x50, 0x11, 0x3e, 0x14, 0x40, 0x44, 0xaa, + 0x20, 0x22, 0x25, 0x50, 0x0e, 0xef, 0x71, 0x5a, + 0x31, 0x7f, 0x77, 0xc3, 0xde, 0xff, 0x00, 0x35, + 0x57, 0x3b, 0xaa, 0xac, 0xf8, 0xc3, 0xff, 0x00, + 0x02, 0x1e, 0xf7, 0xf9, 0xad, 0x62, 0x99, 0x32, + 0x89, 0x51, 0x54, 0x25, 0x45, 0x76, 0x2d, 0x30, + 0x55, 0x41, 0x2a, 0x2a, 0xa0, 0x94, 0x12, 0x4a, + 0x8a, 0xa8, 0x25, 0x45, 0x42, 0x01, 0x29, 0x55, + 0xf2, 0x4e, 0xd4, 0x45, 0x09, 0x50, 0xa0, 0x95, + 0x15, 0x41, 0x24, 0xaf, 0x9a, 0xa5, 0x57, 0xcd, + 0x54, 0x12, 0x4a, 0x82, 0x50, 0x95, 0x15, 0x45, + 0x09, 0x51, 0x54, 0x2a, 0x2a, 0xa0, 0x6c, 0x5b, + 0xbd, 0x1f, 0xa9, 0xa4, 0xd3, 0xd9, 0x20, 0x25, + 0x25, 0xd8, 0xfb, 0x92, 0x04, 0xad, 0x1b, 0x9a, + 0xe2, 0x69, 0xc4, 0xb4, 0x55, 0x5f, 0x2f, 0x00, + 0xb4, 0x82, 0x2a, 0x0e, 0xf0, 0xa2, 0xbf, 0x42, + 0xc3, 0x2c, 0x73, 0x44, 0xd9, 0x62, 0x70, 0x7b, + 0x1e, 0x2a, 0xd7, 0x0d, 0xa0, 0x82, 0xbd, 0x17, + 0x2f, 0xf6, 0x71, 0xab, 0x5d, 0x6d, 0x2b, 0x70, + 0x19, 0x07, 0xd6, 0x27, 0x6d, 0xb4, 0x95, 0xdc, + 0x9f, 0xec, 0x25, 0x74, 0xfa, 0xa8, 0xa9, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x15, 0x3c, 0xdf, 0xe6, 0x9b, 0x1e, + 0xfc, 0x7f, 0xbc, 0xad, 0x6a, 0xa9, 0x9b, 0xfc, + 0xd3, 0x63, 0xdf, 0x8f, 0xf7, 0x95, 0xac, 0x20, + 0x94, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x55, 0x3d, 0x57, 0xf7, 0xd6, 0x3f, 0xbc, 0xdf, + 0xee, 0x05, 0x6c, 0x55, 0x3d, 0x57, 0xf7, 0xd6, + 0x3f, 0xbc, 0xdf, 0xee, 0x04, 0x16, 0xbe, 0x55, + 0x2a, 0x14, 0xa0, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x8e, + 0x75, 0x58, 0x73, 0x1b, 0xe8, 0xac, 0xd1, 0x22, + 0xa5, 0xd3, 0x3c, 0x1e, 0xe8, 0x04, 0x2b, 0x3a, + 0xc5, 0xf4, 0x6d, 0xa7, 0x55, 0x34, 0x3c, 0x1e, + 0x25, 0xc3, 0x8b, 0xa5, 0x15, 0xde, 0x4a, 0x0d, + 0x4d, 0xeb, 0x78, 0x6f, 0x31, 0xec, 0x8f, 0x65, + 0x2d, 0xe5, 0x0d, 0x03, 0xbc, 0xd5, 0x0e, 0x7c, + 0x07, 0x4b, 0x86, 0x8a, 0x7f, 0x2d, 0xad, 0xa0, + 0xdf, 0xc7, 0x5f, 0x85, 0x6e, 0x9d, 0x65, 0x6e, + 0xe9, 0xa2, 0x98, 0xb2, 0xaf, 0x81, 0xa5, 0xb1, + 0x9e, 0x60, 0x7f, 0xfc, 0x2c, 0x61, 0x82, 0xc7, + 0x0b, 0x9f, 0x29, 0xea, 0xcf, 0x17, 0x17, 0x17, + 0x0f, 0x11, 0xe0, 0xaf, 0x3f, 0x06, 0xe4, 0x9d, + 0xbe, 0x3e, 0x2b, 0xcb, 0xa4, 0xdb, 0x07, 0x1a, + 0xc2, 0x33, 0x13, 0x97, 0x8a, 0xbc, 0x5b, 0x44, + 0x09, 0x3b, 0xf7, 0x2c, 0x3b, 0x61, 0x48, 0xa2, + 0x03, 0x70, 0xc8, 0xbf, 0x67, 0xfe, 0x4a, 0xc6, + 0x2c, 0xe0, 0x6d, 0xcb, 0xee, 0x5a, 0xda, 0x4b, + 0x23, 0x43, 0x5e, 0xe1, 0xca, 0x06, 0xe5, 0xe6, + 0xdc, 0x5d, 0x9b, 0x40, 0x02, 0x3d, 0x8d, 0x94, + 0xce, 0x36, 0xff, 0x00, 0xec, 0x3c, 0xaa, 0xc7, + 0x6f, 0x7d, 0xa7, 0x6f, 0xf4, 0xf9, 0x5a, 0x39, + 0x76, 0xd9, 0xe5, 0x79, 0x47, 0x5e, 0x0b, 0xbb, + 0xdc, 0x4b, 0x37, 0x2c, 0xe8, 0xdc, 0xcb, 0x01, + 0x0d, 0x0c, 0x86, 0x66, 0x18, 0xb8, 0x77, 0xf0, + 0xd3, 0x6d, 0x16, 0xc1, 0xb8, 0xcb, 0x46, 0x4f, + 0x2c, 0xe1, 0x9e, 0x34, 0xe2, 0x92, 0x8a, 0x92, + 0xd3, 0xff, 0x00, 0xc5, 0x79, 0xda, 0x61, 0x6c, + 0x6d, 0x26, 0xeb, 0xa2, 0x63, 0xb8, 0xe9, 0x46, + 0x97, 0x38, 0xb8, 0x01, 0xdc, 0x07, 0x72, 0x91, + 0xb3, 0xcb, 0xd3, 0xcb, 0xfe, 0x98, 0x38, 0xf7, + 0xe5, 0x3e, 0xf9, 0xb6, 0x16, 0x3d, 0xad, 0x10, + 0x64, 0x9c, 0x06, 0xd7, 0x3e, 0x5a, 0xf7, 0x69, + 0x55, 0x8d, 0x60, 0xd6, 0x9b, 0xbc, 0x4d, 0x40, + 0xd9, 0x6a, 0x48, 0xee, 0x6e, 0x5b, 0xd8, 0xec, + 0xed, 0xe3, 0x6c, 0xac, 0x6b, 0x68, 0x26, 0x24, + 0xc9, 0xdd, 0xe2, 0xde, 0xbe, 0x23, 0xc7, 0x5a, + 0x44, 0xf8, 0x5e, 0xc6, 0x51, 0xd0, 0x34, 0xc7, + 0x1e, 0xd3, 0xb1, 0xa5, 0x4a, 0xdd, 0xfe, 0x5f, + 0x03, 0x84, 0xf7, 0xf8, 0xb4, 0x17, 0x80, 0xf5, + 0xb9, 0x3d, 0x95, 0x60, 0x9a, 0x12, 0xf1, 0xdc, + 0xd8, 0xb3, 0x72, 0xae, 0xb7, 0x76, 0x53, 0x14, + 0x18, 0x41, 0x90, 0xc8, 0x4b, 0x48, 0xf9, 0x1c, + 0x25, 0x66, 0x5e, 0x5b, 0x36, 0xde, 0x1b, 0x99, + 0xe0, 0x83, 0xae, 0x96, 0x7a, 0x19, 0x58, 0x49, + 0xf1, 0x80, 0xd9, 0xb3, 0xdc, 0x5a, 0xbc, 0x7d, + 0x8c, 0x32, 0xdf, 0xc1, 0x25, 0xad, 0xb4, 0xd0, + 0x32, 0xd8, 0x97, 0x3d, 0xd7, 0x1c, 0x55, 0xa9, + 0x14, 0xe1, 0x67, 0x15, 0x76, 0x2b, 0x1b, 0xfd, + 0xde, 0x04, 0xf1, 0xeb, 0x6b, 0x22, 0x94, 0x44, + 0x10, 0xa9, 0x0e, 0xc5, 0x5d, 0x66, 0x72, 0xd7, + 0x72, 0x19, 0xcb, 0x45, 0xbb, 0xe8, 0xc6, 0x9d, + 0xca, 0xee, 0xab, 0x98, 0x0f, 0xfb, 0xf9, 0x2d, + 0xbf, 0xfb, 0x0a, 0x0c, 0x47, 0xe9, 0xcb, 0xf8, + 0xda, 0x5f, 0x25, 0xef, 0x0b, 0x07, 0x29, 0xa0, + 0x0b, 0x55, 0x33, 0xe3, 0x89, 0xfc, 0x1e, 0x5e, + 0x5c, 0x79, 0xf6, 0x2f, 0xad, 0x57, 0x9e, 0x92, + 0xe6, 0xe0, 0xd9, 0x40, 0xe2, 0xd8, 0x62, 0xd8, + 0xf7, 0x0e, 0x53, 0xcc, 0xab, 0x63, 0x6f, 0x75, + 0x72, 0xd4, 0xd7, 0xc3, 0x09, 0xa9, 0xde, 0xf7, + 0x7a, 0x3f, 0xdb, 0x35, 0xfd, 0x4e, 0x33, 0x9e, + 0x35, 0x8e, 0x1c, 0x32, 0xcb, 0x8a, 0xdf, 0x67, + 0x8b, 0x96, 0xf8, 0x56, 0xde, 0xfe, 0xa7, 0x98, + 0xd2, 0xab, 0x27, 0xd5, 0x9c, 0x97, 0x9d, 0x9f, + 0x79, 0x53, 0xac, 0xef, 0x67, 0xb3, 0x99, 0x93, + 0xc2, 0xe2, 0xd2, 0xd3, 0xb5, 0xbd, 0xc5, 0xd2, + 0xb1, 0x39, 0x16, 0x64, 0xec, 0x59, 0x70, 0xcd, + 0x8e, 0x3b, 0x1f, 0xdf, 0x5a, 0xd3, 0xd4, 0xc7, + 0x52, 0x2f, 0x19, 0x70, 0xf5, 0x5e, 0x97, 0x57, + 0xd3, 0x6a, 0x79, 0x35, 0x62, 0x23, 0x94, 0xde, + 0xf6, 0x99, 0xda, 0x6b, 0x22, 0xd6, 0x97, 0x3a, + 0xf7, 0x85, 0xa3, 0x79, 0x34, 0x5a, 0xab, 0x97, + 0x45, 0x04, 0x86, 0x33, 0x90, 0x2e, 0x23, 0x7d, + 0x28, 0x56, 0xcb, 0x31, 0x79, 0x77, 0x96, 0xc8, + 0xfa, 0x1e, 0xc1, 0xc5, 0x8c, 0x6f, 0xf3, 0xde, + 0x0f, 0x22, 0xda, 0xd9, 0x69, 0x2c, 0x55, 0xbc, + 0x21, 0x92, 0xc7, 0xd7, 0x49, 0xfb, 0x4f, 0x77, + 0x29, 0x5b, 0x70, 0x68, 0x6c, 0x2c, 0x1d, 0x90, + 0xd9, 0x6f, 0x91, 0xab, 0xbe, 0x4e, 0xc5, 0x99, + 0xea, 0xce, 0x4b, 0xcf, 0x0f, 0xbc, 0xa7, 0x33, + 0xa5, 0xfc, 0x94, 0x79, 0x7e, 0x24, 0x98, 0xa5, + 0x8b, 0xc6, 0x31, 0x8d, 0xc4, 0x05, 0xb1, 0xc1, + 0x65, 0xbd, 0x25, 0x60, 0x65, 0x76, 0xc9, 0xe2, + 0x05, 0xaf, 0x6f, 0x74, 0x20, 0xac, 0x65, 0xe3, + 0x9f, 0x18, 0xf1, 0x17, 0x95, 0x99, 0x67, 0x3f, + 0xfa, 0xdb, 0xb4, 0xa9, 0xc4, 0xc5, 0x3e, 0x4d, + 0xc6, 0x2f, 0x2b, 0x31, 0x4e, 0x3f, 0xf5, 0x9d, + 0x8b, 0x37, 0x4f, 0xdb, 0x36, 0xfa, 0xef, 0x23, + 0x7d, 0x2b, 0x44, 0xd7, 0x31, 0xb8, 0x88, 0xd8, + 0xee, 0x45, 0xae, 0x9a, 0xc2, 0xfb, 0x1d, 0x7b, + 0x6d, 0x90, 0x9c, 0x88, 0xe7, 0xb8, 0x97, 0xf9, + 0x4d, 0xe4, 0x04, 0xa0, 0xf0, 0xd4, 0x56, 0x77, + 0x76, 0x33, 0x32, 0xde, 0x79, 0x8c, 0xa1, 0xc2, + 0xab, 0x51, 0x41, 0x4a, 0x2b, 0x26, 0xb9, 0x35, + 0xbe, 0x80, 0x9d, 0xe5, 0x80, 0xf4, 0x85, 0x5b, + 0x41, 0xe3, 0x77, 0x6b, 0x2d, 0xdd, 0xbb, 0xad, + 0xa0, 0x6f, 0x1c, 0xb2, 0x78, 0xac, 0x6f, 0x74, + 0xab, 0x56, 0x88, 0xf6, 0x6b, 0x6b, 0x8c, 0x8d, + 0x97, 0xd9, 0x46, 0x89, 0xae, 0xdc, 0x2a, 0xd8, + 0xce, 0xe6, 0xad, 0x5e, 0x9f, 0x15, 0xcc, 0x5b, + 0x0d, 0xfe, 0x32, 0xb7, 0x6a, 0xcd, 0x6f, 0x8e, + 0xd3, 0xb0, 0xf0, 0xb8, 0x89, 0xae, 0x8f, 0xc5, + 0x88, 0x1d, 0xdd, 0xf4, 0x16, 0x31, 0x1c, 0x60, + 0x00, 0x1a, 0x00, 0x1b, 0x80, 0x0a, 0x78, 0x19, + 0xf2, 0x42, 0xe5, 0x9f, 0xad, 0x23, 0xcc, 0xfd, + 0xf4, 0xfd, 0x6a, 0x1e, 0x67, 0xef, 0x94, 0x1d, + 0x4c, 0xb1, 0x9f, 0x24, 0x74, 0x2e, 0x5f, 0xed, + 0x7b, 0x4d, 0x02, 0xd8, 0xb3, 0xb6, 0xcc, 0xda, + 0xd0, 0x23, 0xb8, 0x03, 0x98, 0x7c, 0x52, 0xbe, + 0x3f, 0x5a, 0x87, 0x99, 0xfb, 0xe5, 0x63, 0x64, + 0xbd, 0xac, 0xdb, 0x64, 0xec, 0xa4, 0xb2, 0xb9, + 0xb2, 0xac, 0x52, 0x8e, 0x13, 0xb7, 0x75, 0x79, + 0x50, 0x73, 0x91, 0xbb, 0xfc, 0xd1, 0x7d, 0xce, + 0xc6, 0x32, 0x67, 0x35, 0x9f, 0xcb, 0x26, 0xac, + 0xef, 0x1d, 0xcb, 0xe1, 0x01, 0x08, 0x1f, 0xe8, + 0x89, 0xf0, 0xa0, 0x93, 0x2c, 0xae, 0x8d, 0xb1, + 0x39, 0xee, 0x74, 0x6d, 0xf8, 0xac, 0x24, 0x90, + 0x3d, 0xc5, 0xf3, 0x5a, 0x6d, 0xe4, 0x5b, 0x1c, + 0x0e, 0x21, 0xf9, 0x9c, 0xac, 0x18, 0xd8, 0xde, + 0x23, 0xeb, 0x9c, 0x01, 0x71, 0xf7, 0xd5, 0xa7, + 0x57, 0x7b, 0x32, 0xba, 0xc3, 0xc0, 0xdb, 0xbc, + 0x73, 0x8d, 0xd4, 0x2d, 0x6f, 0xf1, 0x9b, 0x4f, + 0x19, 0xa6, 0x9b, 0xc0, 0x08, 0x3c, 0xb4, 0xdf, + 0xb3, 0xe1, 0x79, 0x62, 0xdc, 0xd6, 0x66, 0xe4, + 0x5a, 0xe3, 0x5a, 0x38, 0xc5, 0x36, 0x97, 0x34, + 0x72, 0x6d, 0xe7, 0x56, 0x7c, 0x2d, 0xfe, 0x86, + 0xcd, 0x5c, 0xbb, 0x4e, 0xda, 0x58, 0x8e, 0x10, + 0xd3, 0xd5, 0xce, 0x5a, 0x2a, 0xea, 0x0d, 0xfc, + 0x4b, 0x5b, 0xec, 0xd3, 0x39, 0x15, 0xed, 0xa5, + 0xc6, 0x96, 0xc9, 0x9a, 0xb2, 0x56, 0x91, 0x17, + 0x17, 0x77, 0x93, 0x6f, 0x32, 0xf6, 0xbb, 0xbd, + 0xd3, 0xde, 0xce, 0xae, 0xcd, 0xb5, 0x95, 0xab, + 0xae, 0xf2, 0x6e, 0x1c, 0x46, 0x59, 0x2a, 0xd6, + 0xf0, 0x38, 0xee, 0x6e, 0xfd, 0xc8, 0x27, 0x46, + 0xe5, 0x61, 0xc2, 0x6a, 0x1b, 0xdd, 0x2b, 0x2c, + 0xc5, 0xd6, 0xb2, 0x3d, 0xcd, 0xb6, 0x97, 0xe4, + 0x95, 0xb9, 0x7e, 0x56, 0xcc, 0x66, 0x1b, 0xa7, + 0xf5, 0x33, 0x07, 0x5f, 0x0b, 0xc4, 0x96, 0x17, + 0xbb, 0xb8, 0x87, 0xec, 0xed, 0xe4, 0x5a, 0x6c, + 0xe5, 0xa6, 0x23, 0x51, 0x60, 0x9b, 0xaa, 0x31, + 0x4e, 0x6d, 0x9d, 0xf5, 0xb1, 0xeb, 0x25, 0x6d, + 0x69, 0x57, 0x03, 0x5e, 0x15, 0x5b, 0xd5, 0x7a, + 0xce, 0x0d, 0x43, 0x63, 0x64, 0xde, 0xa0, 0xc7, + 0x7d, 0x6e, 0xd1, 0xd6, 0x4f, 0xbb, 0x6f, 0x2d, + 0x10, 0x59, 0xf5, 0x86, 0x69, 0xba, 0x6b, 0x5a, + 0xda, 0xe5, 0x2d, 0x88, 0x92, 0x29, 0xa1, 0xe1, + 0xb8, 0x63, 0x4d, 0x4b, 0x80, 0x23, 0x7a, 0xe7, + 0xfa, 0x93, 0x29, 0x6b, 0x96, 0xcc, 0x4f, 0x90, + 0xb6, 0x83, 0xc9, 0xe3, 0x98, 0xd7, 0x82, 0xbb, + 0x49, 0x3b, 0xca, 0xc1, 0x9e, 0xea, 0xe6, 0xe9, + 0xfd, 0x65, 0xc4, 0x8e, 0x95, 0xc0, 0x50, 0x17, + 0x1a, 0xd0, 0x73, 0x2f, 0x24, 0x04, 0x08, 0x9d, + 0xde, 0x5e, 0x64, 0x0a, 0x25, 0x11, 0x10, 0x11, + 0x39, 0x29, 0xc9, 0xce, 0x88, 0x14, 0x44, 0x4f, + 0x85, 0x01, 0x28, 0x88, 0x82, 0x0a, 0xb3, 0xe3, + 0x88, 0x16, 0x10, 0xf7, 0xbf, 0xcd, 0x56, 0x4e, + 0xe5, 0x66, 0xc7, 0xff, 0x00, 0xd1, 0x86, 0xbf, + 0x27, 0xfc, 0xd6, 0xb1, 0x4c, 0x99, 0x15, 0x0a, + 0x09, 0x0a, 0x2a, 0xa0, 0x95, 0xa6, 0x13, 0x55, + 0x04, 0x85, 0x15, 0xda, 0xa0, 0x94, 0x50, 0x95, + 0x15, 0x03, 0xdc, 0x50, 0x4a, 0x20, 0x12, 0xa2, + 0xa1, 0x41, 0x3c, 0xea, 0x2a, 0x82, 0x49, 0xe4, + 0xe5, 0x5f, 0x35, 0x4a, 0xa8, 0x2a, 0x28, 0x5d, + 0xb5, 0x45, 0x42, 0x82, 0x50, 0xee, 0x41, 0x35, + 0x0a, 0x09, 0x0b, 0xe4, 0x9a, 0xa5, 0x54, 0x54, + 0x14, 0xaa, 0x82, 0x4a, 0x8a, 0x94, 0x12, 0x4a, + 0xf9, 0x27, 0x95, 0x09, 0x5f, 0x35, 0x50, 0x09, + 0x75, 0x5a, 0xe6, 0x12, 0xd9, 0x1a, 0x6a, 0xc7, + 0x0d, 0xe0, 0x8d, 0xcb, 0xae, 0x7b, 0x3f, 0xd5, + 0xcd, 0xcd, 0x58, 0xf9, 0x1d, 0xdb, 0xc0, 0xc8, + 0xdb, 0x0a, 0x3d, 0xa7, 0xf6, 0x9b, 0xc8, 0xe0, + 0xb9, 0x11, 0x34, 0x5e, 0xf8, 0xfc, 0x8d, 0xd6, + 0x2e, 0xfe, 0x2c, 0x8d, 0x9b, 0xb8, 0x67, 0x80, + 0xee, 0xdc, 0x0b, 0x79, 0x41, 0x41, 0xfa, 0x15, + 0x4a, 0xd5, 0x69, 0xdc, 0xed, 0xa6, 0x77, 0x1b, + 0x15, 0xed, 0xb1, 0xf8, 0xc0, 0x09, 0x1a, 0x76, + 0x10, 0xfe, 0x50, 0xb6, 0xaa, 0x28, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, 0xa7, + 0x9b, 0xfc, 0xd3, 0x63, 0xdf, 0x8f, 0xf7, 0x95, + 0xad, 0x55, 0x33, 0x7f, 0x9a, 0x6c, 0x7b, 0xf1, + 0xfe, 0xf2, 0xb5, 0xa0, 0x94, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x55, 0x3d, 0x57, 0xf7, + 0xd6, 0x3f, 0xbc, 0x3f, 0xb8, 0x15, 0xb1, 0x54, + 0xf5, 0x5f, 0xdf, 0x58, 0xfe, 0xf3, 0x7f, 0xb8, + 0x10, 0x5a, 0xd4, 0xa8, 0xe5, 0x52, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x21, + 0x28, 0x54, 0xa2, 0x02, 0x22, 0x20, 0x85, 0x57, + 0xc5, 0xbc, 0xc7, 0x2e, 0x5d, 0xe3, 0x7b, 0x4b, + 0x8a, 0xb4, 0x2a, 0xd6, 0x1e, 0x21, 0x2d, 0xce, + 0x56, 0x3f, 0x96, 0xe2, 0x3a, 0x50, 0x69, 0xf1, + 0x98, 0x01, 0x96, 0xc3, 0x4f, 0x2b, 0x4f, 0xfc, + 0x97, 0xca, 0x48, 0x71, 0xee, 0x2c, 0x26, 0x68, + 0xdc, 0xc3, 0x9d, 0xc2, 0x40, 0x14, 0xe5, 0x56, + 0x0d, 0x1b, 0x37, 0x53, 0x2d, 0xde, 0x36, 0x4f, + 0x16, 0x48, 0x9f, 0xc4, 0xd0, 0x77, 0xd0, 0xab, + 0x49, 0x15, 0x5c, 0x75, 0x34, 0x30, 0xce, 0x7c, + 0xd3, 0x76, 0xf7, 0x7a, 0x5f, 0xdc, 0xfd, 0x47, + 0xa7, 0xd3, 0x9d, 0x2c, 0x2a, 0x71, 0xbf, 0x34, + 0x46, 0x51, 0x7b, 0x5c, 0xab, 0x29, 0x85, 0xbd, + 0xc5, 0x3c, 0x36, 0xe1, 0xb5, 0x6b, 0xb7, 0x3c, + 0x6e, 0x56, 0x2d, 0x09, 0x3b, 0x85, 0xbd, 0xd4, + 0x47, 0xe2, 0xb4, 0x12, 0x16, 0xd3, 0x59, 0xb2, + 0x2f, 0x43, 0xbd, 0xd2, 0x52, 0xad, 0xf8, 0xa4, + 0xf3, 0xac, 0x1d, 0x0d, 0x6a, 0xe6, 0x58, 0xcd, + 0x3b, 0xc1, 0x1d, 0x76, 0xc0, 0x14, 0xd2, 0xd2, + 0xf2, 0x67, 0x94, 0x63, 0xfa, 0x66, 0x21, 0xbf, + 0x5d, 0xeb, 0x3f, 0xec, 0xfa, 0x7d, 0x0c, 0xb3, + 0x88, 0x8d, 0x4c, 0x72, 0xcb, 0x19, 0x9e, 0x6f, + 0x3d, 0x21, 0x2c, 0x43, 0x27, 0x7a, 0xe9, 0x0f, + 0xf1, 0x24, 0x76, 0xc2, 0x77, 0xef, 0x57, 0x07, + 0x3d, 0xac, 0x05, 0xce, 0x21, 0xad, 0x1b, 0xc9, + 0x2b, 0x9b, 0x03, 0x25, 0x9e, 0x52, 0x78, 0x49, + 0x2c, 0x78, 0x7f, 0x13, 0x4e, 0xee, 0x55, 0xb0, + 0xb8, 0xca, 0x5f, 0x5c, 0x46, 0x22, 0x95, 0xfe, + 0x28, 0xd9, 0xb3, 0x95, 0x63, 0x3f, 0x55, 0xf6, + 0xf2, 0xcb, 0x1c, 0xa3, 0x6f, 0x07, 0xc6, 0xcf, + 0xd4, 0x4e, 0x19, 0x65, 0x8c, 0xc7, 0xb1, 0x67, + 0x93, 0x3f, 0x8f, 0x13, 0x75, 0x1c, 0x55, 0x0e, + 0xf1, 0x4b, 0xb9, 0x36, 0xf7, 0x56, 0x93, 0x4f, + 0x96, 0x41, 0xa8, 0x2f, 0xad, 0xe3, 0x20, 0xc0, + 0xf1, 0xc6, 0x07, 0x7d, 0x6a, 0x1d, 0xc2, 0xd6, + 0x92, 0x76, 0x00, 0x2b, 0x55, 0xb2, 0xd1, 0x90, + 0xbd, 0xf3, 0x5c, 0xe4, 0x1d, 0xb5, 0xb4, 0x21, + 0xa4, 0xf7, 0x15, 0xf4, 0xda, 0xd9, 0xea, 0x4e, + 0x5e, 0x6c, 0x6a, 0xa3, 0x62, 0x7a, 0x7d, 0x6c, + 0xb5, 0x27, 0x2b, 0x8a, 0xad, 0xcf, 0x3c, 0xc3, + 0x2e, 0x34, 0xf6, 0x41, 0xd9, 0x0b, 0x39, 0x1b, + 0xd5, 0xcd, 0xb5, 0xd1, 0x13, 0xfe, 0x49, 0x87, + 0x65, 0xce, 0xa0, 0xc8, 0x33, 0x23, 0x78, 0xf0, + 0x63, 0x83, 0x6b, 0x22, 0xaf, 0x2f, 0x79, 0x45, + 0x95, 0xb0, 0xcc, 0x5f, 0x5e, 0xe4, 0x2f, 0x2a, + 0xf8, 0x2d, 0x49, 0x0d, 0x8f, 0x9e, 0x8b, 0x5d, + 0x63, 0x35, 0xd5, 0x9e, 0x46, 0x2b, 0xf8, 0xd8, + 0xe8, 0x6d, 0x26, 0x93, 0x85, 0xac, 0x3b, 0x01, + 0x15, 0x5e, 0x97, 0xa5, 0x97, 0xae, 0x7e, 0xf0, + 0x8b, 0xb8, 0xd1, 0x45, 0x5b, 0x56, 0x5d, 0x72, + 0x6b, 0x7d, 0x0b, 0xb9, 0x1c, 0xc0, 0x7d, 0xd2, + 0xab, 0x4a, 0x48, 0xf8, 0xb8, 0xbd, 0x9a, 0xc6, + 0x17, 0xdd, 0x40, 0x78, 0x65, 0x8d, 0xa4, 0xb4, + 0xf3, 0x2a, 0xd6, 0x37, 0x13, 0x9c, 0xd5, 0x99, + 0x3a, 0xb7, 0x8a, 0x57, 0xc8, 0xef, 0x1e, 0x67, + 0x7c, 0x50, 0x3b, 0xe5, 0x5b, 0x6d, 0xb1, 0xec, + 0xc9, 0xdc, 0xc7, 0x60, 0xf2, 0x43, 0x26, 0x34, + 0x79, 0x1b, 0xe8, 0xba, 0x7e, 0x1f, 0x0b, 0x61, + 0x87, 0xb5, 0x65, 0xb5, 0x9c, 0x41, 0x81, 0xa3, + 0x6b, 0x80, 0xda, 0x7b, 0xaa, 0x8a, 0x2c, 0x5e, + 0xc6, 0xb1, 0xfd, 0x53, 0x7a, 0xdb, 0x97, 0x75, + 0x94, 0xf1, 0xa8, 0x36, 0x55, 0x7d, 0x7e, 0x8d, + 0x62, 0xfc, 0xe5, 0xdd, 0x0b, 0xa3, 0xa2, 0x0e, + 0x71, 0xfa, 0x35, 0x8b, 0xf3, 0x97, 0x74, 0x27, + 0xe8, 0xd6, 0x33, 0x92, 0xe5, 0xdd, 0x0b, 0xa3, + 0xa2, 0x0e, 0x37, 0xad, 0x3d, 0x9b, 0x3b, 0x0d, + 0x8c, 0x6d, 0xfd, 0x93, 0xcc, 0xec, 0x84, 0xd2, + 0x60, 0x46, 0xd0, 0xde, 0x75, 0x40, 0x06, 0xbe, + 0x15, 0xfa, 0x72, 0xf6, 0xd2, 0x1b, 0xdb, 0x49, + 0x6d, 0x26, 0x1c, 0x51, 0xcc, 0xd2, 0xc7, 0x03, + 0xcc, 0x57, 0xe7, 0x6d, 0x4b, 0x87, 0x97, 0x0d, + 0x99, 0xb8, 0xb1, 0x91, 0xbc, 0x2d, 0x6b, 0x89, + 0x8f, 0xba, 0xd3, 0xb9, 0x06, 0xb1, 0x3f, 0xc5, + 0x51, 0x10, 0x6d, 0x74, 0xa5, 0xc7, 0x93, 0xea, + 0x4c, 0x74, 0xc7, 0x60, 0x13, 0x36, 0xab, 0xb0, + 0x4b, 0x0e, 0xa0, 0x83, 0x56, 0x39, 0xf0, 0x06, + 0xcb, 0x88, 0xb8, 0x8c, 0x3a, 0xe0, 0xcc, 0xea, + 0x31, 0xa0, 0x0e, 0x45, 0xc3, 0xad, 0x66, 0x74, + 0x17, 0x50, 0xcc, 0xdf, 0x8c, 0xc7, 0xb4, 0x8e, + 0x95, 0xd2, 0xfd, 0xa6, 0xe7, 0x6e, 0x99, 0x8d, + 0xc7, 0x41, 0x69, 0x76, 0x18, 0xd9, 0xa3, 0x06, + 0x68, 0x98, 0xef, 0x1b, 0x93, 0x7a, 0x0c, 0xad, + 0x43, 0xa3, 0xe0, 0x17, 0x5e, 0xb1, 0x69, 0x79, + 0x58, 0xe9, 0x6d, 0xdd, 0xc7, 0x34, 0x4c, 0x76, + 0xca, 0x8d, 0xfb, 0x96, 0x87, 0xda, 0x16, 0xa0, + 0xc1, 0x67, 0x6c, 0x2c, 0xa5, 0x8a, 0xa3, 0x2b, + 0x18, 0xa4, 0xb4, 0x1b, 0xb6, 0x6d, 0x0e, 0xf7, + 0x55, 0x3e, 0xdb, 0x31, 0x94, 0xb5, 0x82, 0x4b, + 0x78, 0x2e, 0x5e, 0xc8, 0xa6, 0xfe, 0x63, 0x6a, + 0x76, 0xac, 0x53, 0xb4, 0x92, 0x77, 0x9d, 0xe7, + 0x9d, 0x07, 0xd3, 0x66, 0x99, 0xb1, 0x98, 0x99, + 0x23, 0x9b, 0x11, 0xda, 0xe6, 0x07, 0x1e, 0x13, + 0xdf, 0x0b, 0xe3, 0xfc, 0x55, 0x11, 0x01, 0x11, + 0x10, 0x13, 0xfc, 0x55, 0x11, 0x01, 0x11, 0x10, + 0x3f, 0xc5, 0x11, 0x39, 0x6a, 0x88, 0x09, 0xfe, + 0x2a, 0x89, 0xc9, 0x44, 0x04, 0x44, 0x40, 0x21, + 0x59, 0x2c, 0x49, 0x16, 0x50, 0xfc, 0xdf, 0xf3, + 0x55, 0xb2, 0xac, 0x76, 0x47, 0xfe, 0x24, 0x3f, + 0x37, 0xfc, 0xd5, 0xc5, 0x32, 0x7b, 0xd5, 0x45, + 0x51, 0x41, 0x5b, 0x64, 0xaa, 0x82, 0x54, 0x57, + 0x6a, 0x12, 0x80, 0x4a, 0xf9, 0x25, 0x41, 0x25, + 0x09, 0x50, 0x09, 0x51, 0x54, 0x50, 0x51, 0x4a, + 0xa8, 0x25, 0x45, 0x50, 0x94, 0x05, 0x04, 0xa8, + 0xa9, 0x50, 0x4a, 0x8a, 0x9a, 0xa8, 0x25, 0x45, + 0x54, 0x12, 0x81, 0x54, 0x25, 0x45, 0x6a, 0xa1, + 0x40, 0x25, 0x42, 0x82, 0x50, 0x94, 0x05, 0x15, + 0x45, 0xf2, 0x4a, 0x0d, 0xee, 0x90, 0xd5, 0x12, + 0x69, 0xcc, 0x9b, 0x5e, 0xf7, 0x13, 0x8f, 0x9c, + 0x81, 0x72, 0xc1, 0xb7, 0x84, 0xfc, 0xa0, 0x17, + 0x6f, 0xb6, 0xb8, 0x86, 0xe6, 0x06, 0x5c, 0x40, + 0xe0, 0xf8, 0xa5, 0x68, 0x73, 0x1c, 0x37, 0x10, + 0x57, 0xe7, 0x22, 0x45, 0x36, 0x8d, 0x9c, 0xaa, + 0xf5, 0xec, 0xdb, 0x57, 0x8b, 0x19, 0x9b, 0x83, + 0xbe, 0x79, 0x30, 0x4a, 0x69, 0x6a, 0xf2, 0x7e, + 0x29, 0xf9, 0x2a, 0x4a, 0xc3, 0xac, 0x22, 0x85, + 0x28, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0xbe, 0x24, 0x91, 0x91, 0xb0, 0xbd, 0xee, + 0x0d, 0x68, 0xde, 0x4e, 0xe4, 0x1f, 0x6b, 0xca, + 0x6b, 0x88, 0x20, 0x6f, 0x14, 0xcf, 0x6c, 0x6d, + 0xe7, 0x71, 0xa2, 0xaf, 0x65, 0xb5, 0x8d, 0xbc, + 0x04, 0xc1, 0x60, 0x3c, 0xa2, 0x73, 0xb0, 0x16, + 0xed, 0x00, 0xad, 0x2b, 0x6c, 0xb2, 0xf9, 0x69, + 0x04, 0xd9, 0x09, 0x1c, 0xc8, 0xb7, 0x88, 0xc6, + 0xc4, 0x17, 0x3f, 0x4c, 0xe2, 0xfc, 0xe6, 0x3f, + 0xfc, 0x82, 0x7a, 0x67, 0x17, 0xe7, 0x31, 0xff, + 0x00, 0xe4, 0x15, 0x63, 0xd5, 0xeb, 0x0a, 0x6f, + 0x77, 0x73, 0x6a, 0x7a, 0xbd, 0x61, 0xce, 0xee, + 0x94, 0x16, 0x7f, 0x4c, 0xe2, 0xfc, 0xe6, 0x3f, + 0xfc, 0x82, 0x7a, 0x67, 0x17, 0xe7, 0x31, 0xff, + 0x00, 0xe4, 0x15, 0x63, 0xd5, 0xdb, 0x0e, 0x77, + 0x74, 0xac, 0x6b, 0xbc, 0x76, 0x1a, 0xcd, 0xa4, + 0xcd, 0x21, 0xa8, 0xfd, 0x9a, 0xa0, 0xb8, 0x7a, + 0x63, 0x19, 0xe7, 0x31, 0xff, 0x00, 0xe4, 0x17, + 0xa4, 0x39, 0x1b, 0x29, 0xdf, 0xd5, 0xc3, 0x33, + 0x1e, 0xff, 0x00, 0x92, 0x0e, 0xd5, 0xcb, 0xe7, + 0x6b, 0x6e, 0xa5, 0xa5, 0x9b, 0x5c, 0xd6, 0x0f, + 0xda, 0x35, 0x5b, 0x4d, 0x27, 0x03, 0xa0, 0xd4, + 0x11, 0xc6, 0xe7, 0x17, 0x10, 0xc2, 0x4f, 0xbc, + 0x83, 0xa2, 0xa2, 0x80, 0xa5, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x05, 0x4f, + 0x37, 0xf9, 0xa6, 0xc3, 0xbf, 0x1f, 0xef, 0x2b, + 0x58, 0xe5, 0x55, 0x4c, 0xdf, 0xe6, 0x9b, 0x1e, + 0xfc, 0x7f, 0xbc, 0xad, 0x68, 0x25, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x15, 0x4b, 0x55, + 0xfd, 0xf7, 0x8e, 0xef, 0x37, 0xfb, 0x81, 0x5b, + 0x55, 0x4b, 0x55, 0xfd, 0xf7, 0x8e, 0xef, 0x37, + 0xfb, 0x81, 0x05, 0xb3, 0x95, 0x4a, 0x8e, 0x55, + 0x28, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, 0x15, + 0x73, 0x00, 0x7f, 0xfb, 0x0c, 0x95, 0x3b, 0x42, + 0xac, 0x6a, 0xb9, 0x81, 0xfb, 0xc3, 0x25, 0xfd, + 0x43, 0xf0, 0xa0, 0xf3, 0xce, 0x62, 0x2e, 0x7a, + 0xf1, 0x93, 0xc6, 0x1e, 0x0b, 0x96, 0x7c, 0x70, + 0x3f, 0x69, 0x63, 0x43, 0xac, 0x72, 0x30, 0x30, + 0xc5, 0x79, 0x66, 0xe7, 0x4a, 0x36, 0x54, 0x02, + 0xb7, 0x59, 0x3c, 0xc5, 0xb6, 0x2a, 0x26, 0xc9, + 0x31, 0xab, 0x9f, 0xf1, 0x59, 0xca, 0x56, 0x8d, + 0xd9, 0x9c, 0xc5, 0xd9, 0xeb, 0x6d, 0xf1, 0xe0, + 0xc6, 0x37, 0x12, 0x36, 0xd1, 0x07, 0x8c, 0x8d, + 0xcc, 0x6a, 0x6b, 0x88, 0xdb, 0x70, 0xce, 0xa2, + 0xc9, 0x86, 0xa4, 0x1e, 0x55, 0x6a, 0xb7, 0xb7, + 0x65, 0xac, 0x2d, 0x82, 0x21, 0x46, 0x30, 0x52, + 0x8b, 0x4b, 0x61, 0xaa, 0xa3, 0x33, 0x0b, 0x4b, + 0xd8, 0x4d, 0xac, 0xae, 0x21, 0xad, 0xa8, 0xa0, + 0x5b, 0xfa, 0x8a, 0x0e, 0x6e, 0x44, 0x2e, 0x7d, + 0xcd, 0x0e, 0xa3, 0xd3, 0xde, 0x5c, 0x05, 0xe5, + 0xaf, 0x8b, 0x72, 0xcd, 0xe3, 0x9d, 0x55, 0xdd, + 0x26, 0x42, 0xdc, 0x98, 0xee, 0x20, 0x77, 0x18, + 0xe5, 0x00, 0xed, 0x57, 0xcc, 0x8e, 0x4a, 0xdb, + 0x19, 0x07, 0x5d, 0x70, 0xea, 0x57, 0x73, 0x79, + 0x4a, 0xd0, 0x3f, 0x3b, 0x93, 0xbe, 0x77, 0x1d, + 0xa5, 0x80, 0x74, 0x5c, 0x8e, 0x70, 0xdf, 0xef, + 0x2c, 0x6a, 0x69, 0x61, 0xa9, 0x15, 0x9c, 0x5b, + 0x19, 0xe9, 0xe1, 0x9c, 0x56, 0x50, 0xd4, 0x59, + 0xe3, 0x32, 0x59, 0x69, 0x5b, 0x1f, 0x01, 0x86, + 0x0a, 0xf8, 0xce, 0x3c, 0xca, 0xf3, 0x63, 0x63, + 0x05, 0x8d, 0xa3, 0x6d, 0x61, 0x14, 0x68, 0x14, + 0x77, 0x74, 0x90, 0xb4, 0xb6, 0x5a, 0xa3, 0xaa, + 0x95, 0xb6, 0xd9, 0x18, 0x3c, 0x95, 0xc4, 0xd0, + 0x3a, 0x94, 0x0a, 0xc0, 0x0b, 0x48, 0x0e, 0x69, + 0xa8, 0x75, 0x0b, 0x4f, 0x3a, 0xd6, 0x18, 0x63, + 0x86, 0x3e, 0x5c, 0x62, 0x97, 0x1c, 0x31, 0xc6, + 0x2b, 0x18, 0xa5, 0x48, 0xcd, 0x77, 0xa7, 0x32, + 0x33, 0x38, 0xc4, 0x66, 0xb1, 0xb9, 0x25, 0xc4, + 0x0d, 0xbb, 0xd4, 0x32, 0x4b, 0x9d, 0x45, 0x92, + 0x80, 0xb2, 0x0e, 0xa2, 0xc6, 0xd8, 0xf1, 0x01, + 0x4a, 0x54, 0xad, 0xce, 0x5f, 0x3d, 0x8e, 0xb3, + 0x78, 0xb6, 0x99, 0x82, 0x79, 0x4f, 0xec, 0x52, + 0xa9, 0x88, 0xce, 0xe3, 0xef, 0x5f, 0xe4, 0xf0, + 0xb0, 0x5b, 0xca, 0x37, 0x30, 0x8a, 0x12, 0xab, + 0x4a, 0xfe, 0xb9, 0x03, 0xcb, 0xe1, 0x03, 0x70, + 0x6d, 0x02, 0xad, 0xab, 0x2e, 0xb9, 0xd9, 0x7f, + 0x17, 0xcd, 0x55, 0xa5, 0x24, 0x67, 0x61, 0x24, + 0x8e, 0x2c, 0xad, 0xbc, 0x92, 0x9e, 0x16, 0x31, + 0xd5, 0x73, 0xb7, 0x6c, 0x5f, 0x7a, 0xdb, 0xda, + 0x81, 0x8d, 0xee, 0xc7, 0xe1, 0x1d, 0xb5, 0xa6, + 0x8f, 0x9c, 0x7f, 0x92, 0xd2, 0xe4, 0xdc, 0xf1, + 0x61, 0x37, 0x05, 0x78, 0x88, 0xa0, 0xa6, 0xfd, + 0xa9, 0xa2, 0xfd, 0x9b, 0xde, 0xe5, 0x65, 0x8e, + 0xfb, 0x24, 0xd3, 0x15, 0x99, 0xf1, 0x9a, 0xd3, + 0xf1, 0x9c, 0xa8, 0xd2, 0xfa, 0xeb, 0xaa, 0x29, + 0xb2, 0x77, 0xd1, 0x4f, 0xae, 0xba, 0xa3, 0xb7, + 0x93, 0xdf, 0x5d, 0xbe, 0x3d, 0x29, 0x81, 0x8d, + 0x8d, 0x60, 0xb3, 0x65, 0x18, 0x28, 0x2a, 0x2b, + 0xb9, 0x7d, 0x7a, 0xaf, 0x82, 0xf3, 0x38, 0xfa, + 0x02, 0x0e, 0x1d, 0xeb, 0xb6, 0xa8, 0xed, 0xe4, + 0xf7, 0xd0, 0xeb, 0x6d, 0x51, 0xdb, 0xc9, 0xef, + 0xae, 0xe3, 0xea, 0xbe, 0x0b, 0xcc, 0xe3, 0xe8, + 0x09, 0xea, 0xbe, 0x0b, 0xcc, 0xe3, 0xe8, 0x08, + 0x38, 0x77, 0xae, 0xba, 0xa3, 0xb7, 0x93, 0xdf, + 0x5a, 0xfc, 0x86, 0x4a, 0xff, 0x00, 0x2a, 0x4c, + 0xb7, 0xb5, 0x7c, 0xb1, 0x8a, 0x89, 0x0e, 0xfa, + 0x73, 0x2f, 0xd0, 0x3e, 0xac, 0x60, 0xbc, 0xce, + 0x3e, 0x80, 0xbe, 0x65, 0xd2, 0x98, 0x19, 0x23, + 0x74, 0x66, 0xd1, 0x80, 0x3c, 0x50, 0x90, 0x02, + 0x0f, 0xce, 0x20, 0xa9, 0xff, 0x00, 0x14, 0x5b, + 0xad, 0x5f, 0xa7, 0xe4, 0xc0, 0x66, 0x65, 0xb4, + 0x22, 0x90, 0xb8, 0x97, 0x42, 0x4f, 0x28, 0x2b, + 0x4a, 0x80, 0x06, 0xd5, 0xf7, 0x24, 0xd3, 0x4c, + 0xee, 0x29, 0x9e, 0x64, 0x20, 0x50, 0x71, 0x12, + 0x68, 0x3d, 0xd5, 0xf0, 0x88, 0x1f, 0xe2, 0xa8, + 0x51, 0x0e, 0xd4, 0x10, 0xa5, 0x11, 0x01, 0x41, + 0x52, 0x94, 0x41, 0x01, 0x49, 0x4a, 0x22, 0x08, + 0xa2, 0x94, 0x44, 0x0f, 0x87, 0x9d, 0x13, 0xb9, + 0xc8, 0x88, 0x22, 0x8a, 0x42, 0x22, 0x05, 0x14, + 0x05, 0x29, 0x44, 0x03, 0xb9, 0x58, 0xac, 0xff, + 0x00, 0xea, 0x43, 0xde, 0xff, 0x00, 0x35, 0x5d, + 0x3b, 0x95, 0x82, 0xd3, 0x65, 0xac, 0x43, 0xb8, + 0xb5, 0x8a, 0x4b, 0xda, 0xbb, 0xd4, 0x72, 0x25, + 0x54, 0x12, 0xab, 0x25, 0x54, 0x12, 0x95, 0x50, + 0x4a, 0x28, 0x54, 0x55, 0x2a, 0xa0, 0x94, 0x05, + 0x05, 0x45, 0x54, 0x12, 0xa2, 0x95, 0x42, 0x8b, + 0xe4, 0x94, 0x12, 0xa0, 0x95, 0x15, 0x51, 0x55, + 0x04, 0xd4, 0x2f, 0x94, 0xaa, 0x82, 0x50, 0x2a, + 0xa0, 0xa2, 0xf9, 0x25, 0x04, 0xa8, 0x25, 0x45, + 0x54, 0x12, 0x80, 0x4a, 0x72, 0x28, 0xde, 0x68, + 0x01, 0x27, 0x90, 0x0e, 0x75, 0xb0, 0x76, 0x9d, + 0xce, 0x36, 0xc0, 0xe4, 0x1f, 0x67, 0x23, 0x6d, + 0xda, 0x76, 0x92, 0xdd, 0xa0, 0x7c, 0xaa, 0x73, + 0x20, 0xd7, 0x14, 0x04, 0xb5, 0xc1, 0xcd, 0x3c, + 0x2f, 0x69, 0x05, 0xae, 0x1c, 0x84, 0x6d, 0x0b, + 0xe6, 0xb5, 0x15, 0x50, 0x4a, 0x0e, 0xc5, 0xec, + 0xf3, 0x59, 0x7a, 0x66, 0xd7, 0xc8, 0x2f, 0xdf, + 0xff, 0x00, 0xd8, 0xdb, 0xec, 0x2e, 0x3f, 0xb6, + 0xde, 0x42, 0x15, 0xd5, 0x7e, 0x6d, 0xb2, 0xc8, + 0x5d, 0x63, 0xaf, 0x22, 0xbe, 0xb4, 0x79, 0x64, + 0xd0, 0xbb, 0x89, 0xb4, 0xe5, 0xe7, 0x07, 0xbe, + 0xbb, 0xbe, 0x94, 0xd4, 0xb6, 0xba, 0x8b, 0x17, + 0x1d, 0xdc, 0x44, 0x09, 0x80, 0xe1, 0x9e, 0x2f, + 0xda, 0x6b, 0x87, 0xf9, 0x28, 0xad, 0xda, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0xd1, 0x6a, 0x0d, + 0x4d, 0x0e, 0x21, 0xc2, 0x1e, 0x02, 0xf9, 0x9c, + 0x2a, 0xd0, 0x15, 0x32, 0xeb, 0x50, 0x5f, 0x64, + 0xe6, 0xa5, 0xdc, 0x8e, 0x8a, 0x0f, 0x92, 0xda, + 0x8d, 0x8a, 0xc1, 0x9c, 0x82, 0x29, 0xb5, 0x65, + 0xab, 0x25, 0x1c, 0x4c, 0x2c, 0xda, 0x14, 0xcf, + 0x91, 0xd2, 0x10, 0xba, 0x51, 0x23, 0x47, 0xf0, + 0x89, 0x0f, 0xd9, 0xba, 0x8a, 0xc0, 0xd4, 0xd9, + 0xe4, 0x70, 0x76, 0x7b, 0x63, 0x88, 0xb9, 0xe7, + 0x7b, 0x9d, 0xb5, 0x66, 0x7a, 0xd1, 0x63, 0xf2, + 0x4a, 0xf7, 0xb6, 0xcb, 0x68, 0xeb, 0xb8, 0xba, + 0xe8, 0x5a, 0x0b, 0x09, 0x2d, 0x06, 0x9c, 0xa2, + 0x8b, 0xca, 0xeb, 0x3d, 0xa2, 0x2d, 0x1c, 0xc6, + 0x4e, 0x03, 0x5d, 0x20, 0xab, 0x76, 0x0d, 0xc8, + 0x3e, 0x7d, 0x68, 0xb0, 0xf9, 0x25, 0x3d, 0x68, + 0xb1, 0xf9, 0x25, 0x64, 0xc7, 0x91, 0xd2, 0x12, + 0x46, 0x24, 0x63, 0x41, 0x69, 0xdc, 0x68, 0xbd, + 0x69, 0xa7, 0x6f, 0x20, 0xb9, 0x65, 0xa4, 0x60, + 0xcb, 0x14, 0x7c, 0x67, 0x66, 0xea, 0x8d, 0x88, + 0x34, 0x97, 0x7a, 0x86, 0xee, 0xe5, 0xe6, 0x3b, + 0x16, 0x51, 0x9c, 0xe5, 0x63, 0x36, 0xc5, 0xd2, + 0xbb, 0xac, 0xbb, 0x71, 0x7b, 0xce, 0xda, 0x57, + 0x60, 0x5f, 0x58, 0xe0, 0x05, 0xbe, 0xc1, 0xca, + 0x76, 0xac, 0x94, 0x06, 0x31, 0x8c, 0x1c, 0x2c, + 0x00, 0x05, 0xeb, 0xa7, 0x7f, 0x33, 0xb7, 0xe6, + 0x1f, 0xf2, 0x5e, 0x4b, 0xd7, 0x4e, 0xfe, 0x67, + 0x6f, 0xcc, 0x3f, 0xe4, 0x82, 0xfc, 0x14, 0xa8, + 0x45, 0x04, 0xa2, 0x84, 0x41, 0x28, 0xa1, 0x10, + 0x4a, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x0a, 0x9e, 0x6f, 0xf3, + 0x4d, 0x8f, 0x7e, 0x3f, 0xde, 0x56, 0xb1, 0xca, + 0xaa, 0x99, 0xbf, 0xcd, 0x36, 0x1d, 0xf8, 0xff, + 0x00, 0x79, 0x5a, 0xc7, 0x2a, 0x09, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, 0x52, 0xd5, + 0x7f, 0x7d, 0xe3, 0xbb, 0xcd, 0xfe, 0xe0, 0x56, + 0xd5, 0x52, 0xd5, 0x7f, 0x7d, 0xe3, 0xbb, 0xcd, + 0xfe, 0xe0, 0x41, 0x6c, 0xe5, 0x52, 0xa3, 0x95, + 0x4a, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x85, + 0x5c, 0xc1, 0x38, 0x36, 0xfb, 0x26, 0xe7, 0x6e, + 0x0f, 0x24, 0xfb, 0x8a, 0xc6, 0xaa, 0xd8, 0xea, + 0xf1, 0xe6, 0x29, 0xbe, 0xae, 0xa2, 0x0d, 0x3d, + 0xcd, 0xa5, 0xe6, 0xa0, 0xba, 0xbb, 0xbd, 0x88, + 0xd5, 0xb6, 0x86, 0x91, 0x33, 0x90, 0xd1, 0x59, + 0x34, 0xd6, 0x6e, 0x2b, 0xfb, 0x7f, 0x26, 0x95, + 0xa2, 0x1b, 0xa8, 0x7c, 0x47, 0x47, 0xba, 0xb4, + 0xd9, 0x55, 0xe1, 0xa1, 0xc3, 0x3d, 0x18, 0xfa, + 0x7c, 0x6e, 0xb0, 0xf1, 0x15, 0x9e, 0x70, 0x16, + 0xed, 0xcb, 0x33, 0x27, 0x11, 0xea, 0xdc, 0x05, + 0x1c, 0xc1, 0xb8, 0xa0, 0xf8, 0xd4, 0x58, 0x4b, + 0x7b, 0xfb, 0x27, 0xbd, 0xad, 0x0d, 0xb8, 0x88, + 0x17, 0x46, 0xf0, 0x28, 0x6a, 0x16, 0x3e, 0x97, + 0xbf, 0x75, 0xee, 0x38, 0xb6, 0x63, 0xfc, 0x5b, + 0x63, 0xc0, 0xef, 0x73, 0x62, 0xdf, 0xba, 0x9c, + 0x26, 0xbb, 0xa9, 0xb5, 0x54, 0xb4, 0xb9, 0x3e, + 0x5d, 0x94, 0xe0, 0xfe, 0x5f, 0x13, 0xa8, 0x10, + 0x78, 0xc3, 0x6e, 0xed, 0x45, 0xa8, 0x24, 0x74, + 0xdb, 0x6c, 0xec, 0xcd, 0x38, 0x79, 0x09, 0x57, + 0x18, 0xa1, 0x8a, 0x28, 0xc4, 0x71, 0xb4, 0x35, + 0xad, 0x14, 0x00, 0x05, 0x5c, 0xd1, 0x61, 0xa2, + 0x3b, 0xc3, 0xfb, 0x66, 0x63, 0x55, 0xbd, 0xbc, + 0xc8, 0xda, 0xd9, 0x96, 0x0b, 0x89, 0x03, 0x3a, + 0xc3, 0x46, 0xf3, 0x92, 0x83, 0x17, 0x39, 0x86, + 0xb6, 0xca, 0x5a, 0x3e, 0x37, 0x34, 0x09, 0x40, + 0xab, 0x1e, 0x06, 0xd0, 0x56, 0xab, 0x4a, 0x5f, + 0xcc, 0xfb, 0x69, 0xec, 0xee, 0x0d, 0x66, 0xb5, + 0xa8, 0x15, 0xee, 0x2b, 0x38, 0x20, 0xb6, 0xbc, + 0x85, 0x54, 0xf1, 0x00, 0x7a, 0xd7, 0x7d, 0xc1, + 0xb1, 0x94, 0xf1, 0x80, 0x41, 0xa7, 0xb7, 0xc7, + 0x5d, 0x64, 0xae, 0xae, 0x2f, 0xe1, 0xa4, 0x97, + 0x36, 0xf3, 0x7f, 0x2c, 0xf3, 0x2d, 0x96, 0xa3, + 0xb7, 0x8e, 0xce, 0xf7, 0x1f, 0x7d, 0x0b, 0x44, + 0x57, 0x2f, 0x73, 0x44, 0x8c, 0x6f, 0xbe, 0xbe, + 0xb2, 0x18, 0xcc, 0x9e, 0x33, 0x22, 0xfc, 0x86, + 0x27, 0xc6, 0x64, 0xbb, 0x64, 0x8d, 0x31, 0xd8, + 0xcc, 0xa6, 0x4b, 0x22, 0xcc, 0x86, 0x5b, 0xc5, + 0x64, 0x5b, 0x59, 0x1a, 0x0c, 0x1d, 0x71, 0xb6, + 0xfa, 0x03, 0xce, 0xc0, 0x7d, 0xe5, 0x5b, 0x56, + 0x4d, 0x73, 0xff, 0x00, 0x7e, 0x2e, 0x60, 0xc0, + 0x02, 0xad, 0xa9, 0x23, 0x37, 0x0d, 0x0c, 0x73, + 0xe5, 0x6d, 0xe2, 0x94, 0x07, 0x30, 0xbb, 0x68, + 0x3b, 0x97, 0x54, 0x63, 0x18, 0xc6, 0x86, 0x30, + 0x06, 0xb4, 0x0a, 0x00, 0x36, 0x05, 0xcb, 0xb4, + 0xff, 0x00, 0xdf, 0x36, 0xdf, 0x39, 0x75, 0x31, + 0xc8, 0xa8, 0x94, 0x44, 0x40, 0x44, 0x44, 0x05, + 0x0a, 0x51, 0x05, 0x1b, 0xda, 0x96, 0x9a, 0x39, + 0x4c, 0x47, 0x96, 0xdb, 0xb3, 0x8a, 0xe6, 0xd3, + 0xc6, 0x34, 0xde, 0x59, 0xca, 0x17, 0x14, 0x15, + 0xa6, 0xdd, 0xeb, 0xf5, 0x0c, 0xb1, 0xb2, 0x58, + 0xdd, 0x1b, 0xc5, 0x5a, 0xf0, 0x5a, 0xe1, 0xdc, + 0x3b, 0x17, 0xe7, 0xbd, 0x67, 0x80, 0x97, 0x07, + 0x9d, 0x9e, 0xdf, 0x87, 0x86, 0xda, 0x47, 0x71, + 0xdb, 0x9e, 0x4e, 0x03, 0xb9, 0x06, 0x89, 0x12, + 0xa8, 0x81, 0xdd, 0xe4, 0x44, 0xf8, 0x51, 0x01, + 0x3b, 0x9c, 0xa8, 0x9f, 0x02, 0x02, 0x27, 0x7d, + 0x10, 0x13, 0xe1, 0x44, 0xf8, 0x10, 0x11, 0x11, + 0x03, 0xbb, 0xc8, 0x89, 0xf0, 0xa2, 0x02, 0x7c, + 0x28, 0x9f, 0x02, 0x02, 0x22, 0x20, 0x15, 0x60, + 0xb5, 0x23, 0xc9, 0x62, 0xef, 0x2a, 0xf9, 0x5b, + 0xeb, 0x63, 0xff, 0x00, 0x1a, 0x21, 0xfe, 0xdf, + 0xf3, 0x5a, 0xc6, 0x53, 0x27, 0xaa, 0x82, 0xa1, + 0x41, 0x2a, 0xa2, 0x54, 0x56, 0xa9, 0x55, 0xf3, + 0x55, 0x07, 0xd1, 0x5f, 0x35, 0x42, 0x54, 0x12, + 0x11, 0x42, 0xa0, 0x95, 0x15, 0x0a, 0x14, 0x12, + 0x48, 0x5f, 0x24, 0xa1, 0x2a, 0x2a, 0x82, 0x57, + 0xcd, 0x46, 0xe4, 0x25, 0x42, 0x06, 0xe5, 0x07, + 0x7a, 0x12, 0xbe, 0x50, 0x49, 0x2a, 0x14, 0x12, + 0xa0, 0xa0, 0x92, 0x57, 0xdd, 0xbd, 0xbc, 0xf7, + 0x73, 0x32, 0xde, 0xda, 0x37, 0x4d, 0x2c, 0x86, + 0x8d, 0x63, 0x45, 0x49, 0x59, 0x16, 0x78, 0x7b, + 0xeb, 0xc8, 0x5f, 0x72, 0xd8, 0xcb, 0x2c, 0xe2, + 0x23, 0xad, 0x9c, 0x8d, 0x80, 0x12, 0x1b, 0x51, + 0xd2, 0xba, 0x36, 0x0e, 0xe3, 0x4b, 0x69, 0xfc, + 0xbb, 0x30, 0x0c, 0xf1, 0xaf, 0x26, 0x8c, 0x1f, + 0x2d, 0x70, 0x14, 0xab, 0xc5, 0x45, 0x09, 0x28, + 0x34, 0x3a, 0x73, 0x48, 0xdd, 0xe3, 0x75, 0x25, + 0xa0, 0xcb, 0xc4, 0xd7, 0x44, 0x5a, 0x5f, 0x19, + 0x1b, 0x59, 0xd6, 0x6c, 0xa3, 0x5e, 0xb2, 0x6e, + 0xf1, 0xfe, 0xd0, 0xf2, 0xf9, 0x69, 0xd8, 0xdf, + 0xf8, 0xd6, 0xfc, 0x45, 0x8d, 0x0e, 0x14, 0x8f, + 0xab, 0xaf, 0x8b, 0xc9, 0x42, 0xb4, 0x3a, 0xa2, + 0x0c, 0xf6, 0x9e, 0xcd, 0x49, 0x1c, 0x97, 0x32, + 0xb9, 0xb2, 0x3b, 0xac, 0xb7, 0x98, 0x92, 0x43, + 0x85, 0x6b, 0xb2, 0xa6, 0x8b, 0x35, 0xba, 0xff, + 0x00, 0x59, 0xdd, 0xd9, 0x16, 0xdb, 0x30, 0xc8, + 0xc6, 0x78, 0x92, 0x4c, 0xc6, 0xd6, 0x9d, 0xf4, + 0x18, 0x9a, 0x87, 0x41, 0x66, 0xf0, 0x96, 0xc6, + 0xf2, 0x5e, 0x1b, 0x88, 0x6b, 0x59, 0x1d, 0x1e, + 0xde, 0x1e, 0x7a, 0x80, 0xaa, 0xe4, 0x8a, 0x2e, + 0x93, 0xa4, 0xee, 0x73, 0xc3, 0x15, 0x96, 0xba, + 0xd4, 0x45, 0xc3, 0x1a, 0xe8, 0x5d, 0xc0, 0x27, + 0x14, 0xab, 0xc8, 0x34, 0xe1, 0x05, 0x73, 0x30, + 0xed, 0x9b, 0x37, 0x72, 0x20, 0x92, 0x76, 0x2d, + 0xce, 0x94, 0xd4, 0xb7, 0x3a, 0x77, 0x2a, 0xcb, + 0xa8, 0xcf, 0x15, 0xbc, 0x84, 0x36, 0xe2, 0x3e, + 0x42, 0xde, 0x7f, 0x71, 0x69, 0x6b, 0xca, 0xbe, + 0x09, 0xaa, 0x14, 0xfd, 0x2d, 0x8e, 0xc8, 0x5a, + 0xe4, 0x6c, 0xe2, 0xbc, 0xb4, 0x78, 0x7c, 0x32, + 0x8a, 0xb4, 0x8f, 0x81, 0x65, 0x2e, 0x65, 0xec, + 0x73, 0x2c, 0xe7, 0xc1, 0x77, 0x8a, 0x79, 0x27, + 0xab, 0x3d, 0x6c, 0x55, 0xe4, 0x69, 0xd8, 0x42, + 0xe9, 0xaa, 0x28, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x8b, 0xe4, 0xef, + 0x41, 0x54, 0xcc, 0x6d, 0xd5, 0xb6, 0xbf, 0xd2, + 0x3f, 0x02, 0xa0, 0xe5, 0xda, 0x38, 0xf2, 0x3b, + 0x3f, 0xf6, 0x3d, 0x5c, 0xb5, 0x5c, 0xf7, 0x30, + 0x6a, 0x18, 0x24, 0xb4, 0x6f, 0x1c, 0xc2, 0x3d, + 0x8d, 0x1d, 0xd5, 0x4f, 0xbb, 0x26, 0x47, 0x5c, + 0xf5, 0xbe, 0x29, 0x91, 0xc4, 0xcb, 0xdc, 0x27, + 0x7a, 0xc4, 0xea, 0xc6, 0x33, 0x55, 0x33, 0xec, + 0x87, 0xb3, 0x47, 0xd0, 0x6a, 0x6a, 0xe1, 0x19, + 0xe3, 0x96, 0x9c, 0x44, 0xff, 0x00, 0x16, 0x71, + 0x12, 0xc3, 0xd2, 0xe0, 0x7a, 0x25, 0x9f, 0xd4, + 0x93, 0xfc, 0x96, 0xb3, 0x56, 0x01, 0xe5, 0x36, + 0x9f, 0xd3, 0x1f, 0x0a, 0xdc, 0x62, 0xdb, 0x1c, + 0x36, 0x62, 0x3b, 0x53, 0xc7, 0x17, 0x13, 0x8f, + 0x17, 0x74, 0xd2, 0xab, 0x1f, 0x2d, 0x6d, 0x65, + 0x3c, 0x91, 0x1b, 0xb7, 0xf0, 0x39, 0x8d, 0xa3, + 0x07, 0x38, 0x53, 0xef, 0xc7, 0xf0, 0xe5, 0xee, + 0x74, 0xff, 0x00, 0xe5, 0x6b, 0x7f, 0x1e, 0x97, + 0xfc, 0x90, 0xcc, 0xb1, 0x6b, 0x7d, 0x1d, 0x1e, + 0xce, 0x45, 0x66, 0xd2, 0xe2, 0x97, 0x19, 0x0a, + 0x79, 0xa3, 0x7e, 0x05, 0x5b, 0x83, 0xc5, 0xb7, + 0x6b, 0x23, 0xdb, 0x1d, 0x36, 0x15, 0xb9, 0xd3, + 0xf7, 0x17, 0x4c, 0xba, 0xb8, 0x11, 0xb6, 0xad, + 0x7c, 0x3c, 0x32, 0x77, 0x00, 0x1b, 0x15, 0x8d, + 0x68, 0x99, 0x88, 0x88, 0x9e, 0xf8, 0x67, 0x3f, + 0xdb, 0x75, 0x71, 0xc7, 0x2c, 0xa7, 0x3d, 0x2a, + 0xc6, 0x2f, 0xf5, 0xc4, 0xbd, 0x31, 0xff, 0x00, + 0xc8, 0x3f, 0x38, 0xac, 0x95, 0x8f, 0x8f, 0xd9, + 0x01, 0xdb, 0x41, 0xc4, 0x76, 0xa9, 0x9e, 0xfa, + 0x18, 0x45, 0x01, 0xe2, 0x77, 0x30, 0x5d, 0x1e, + 0x16, 0x40, 0x5e, 0x38, 0xfc, 0x85, 0xbe, 0x3b, + 0x39, 0xe5, 0x52, 0x9a, 0xb1, 0xac, 0xa6, 0xcd, + 0xbb, 0x57, 0x8c, 0x36, 0xf9, 0x3c, 0x93, 0xa9, + 0x1b, 0x4c, 0x51, 0x9d, 0xee, 0x3b, 0x36, 0x2d, + 0xc5, 0x8e, 0x9c, 0xb5, 0xb7, 0x21, 0xf3, 0x9e, + 0xb5, 0xfd, 0xd4, 0x2d, 0xed, 0x26, 0xb9, 0xb9, + 0x2f, 0x3d, 0x4d, 0x99, 0x74, 0x7c, 0x8e, 0x35, + 0xda, 0xbe, 0x7d, 0x78, 0xbe, 0xf3, 0x23, 0xef, + 0xf8, 0x16, 0x78, 0x86, 0x06, 0x8a, 0x35, 0x8d, + 0x01, 0x4f, 0x55, 0x17, 0xc9, 0x6a, 0x83, 0x5f, + 0xeb, 0xc5, 0xf7, 0x99, 0x14, 0xf5, 0xe2, 0xfb, + 0xcc, 0x4f, 0xbf, 0xe0, 0x59, 0xd2, 0x79, 0x34, + 0x4d, 0xe2, 0x93, 0x85, 0xad, 0x1b, 0xeb, 0x45, + 0xa7, 0xbd, 0xd4, 0x56, 0xb1, 0x93, 0x1d, 0xac, + 0x62, 0x47, 0xf3, 0xd0, 0x10, 0xad, 0x0c, 0x97, + 0x6b, 0xab, 0xb6, 0x0a, 0xbe, 0xcf, 0x84, 0x77, + 0x57, 0xc1, 0xf6, 0x85, 0x25, 0x36, 0x5b, 0x0e, + 0x92, 0xb4, 0x8f, 0x6d, 0xf5, 0xfb, 0xb8, 0xa7, + 0x3c, 0x0c, 0xdf, 0xc2, 0x02, 0x8b, 0xbb, 0x38, + 0x60, 0xb4, 0x71, 0x68, 0xf1, 0x87, 0x2a, 0x50, + 0xe9, 0x58, 0xeb, 0xa3, 0x79, 0x67, 0x15, 0xc9, + 0x1c, 0x26, 0x46, 0xd6, 0x8b, 0x25, 0x6b, 0xf0, + 0x1f, 0x74, 0x5b, 0x1f, 0xf6, 0x05, 0xb0, 0x50, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x05, 0x4f, 0x37, 0xf9, 0xa6, 0xc3, 0xbf, + 0x1f, 0xef, 0x2b, 0x58, 0xe5, 0x55, 0x4c, 0xdf, + 0xe6, 0x9b, 0x0e, 0xfc, 0x7f, 0xbc, 0xad, 0x63, + 0x95, 0x04, 0xa2, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0xa9, 0x6a, 0xbf, 0xbe, 0xf1, 0xdd, + 0xe6, 0xff, 0x00, 0x70, 0x2b, 0x6a, 0xa9, 0x6a, + 0xbf, 0xbe, 0xf1, 0xdd, 0xe6, 0xff, 0x00, 0x70, + 0x20, 0xb6, 0x72, 0xa9, 0x51, 0xca, 0xa5, 0x01, + 0x42, 0x95, 0x08, 0x3e, 0x25, 0x9a, 0x38, 0x58, + 0x64, 0x91, 0xc1, 0x8c, 0x1b, 0xdc, 0x76, 0x05, + 0xf3, 0x2d, 0xd4, 0x10, 0xc6, 0x25, 0x95, 0xed, + 0x64, 0x6e, 0xa5, 0x1c, 0x4d, 0x01, 0xae, 0xe5, + 0xe5, 0x92, 0x83, 0xca, 0x2c, 0x67, 0x8a, 0x95, + 0x2e, 0x61, 0xa0, 0xee, 0x8d, 0xcb, 0x51, 0x74, + 0xc3, 0x91, 0xb2, 0xb3, 0xb7, 0x68, 0xdb, 0xd5, + 0xb9, 0xce, 0x1c, 0xc5, 0xad, 0xe1, 0x1e, 0xf8, + 0x4e, 0x63, 0x79, 0x25, 0xcc, 0x51, 0x06, 0x97, + 0xb9, 0xad, 0x0f, 0x20, 0x34, 0x93, 0xbc, 0x9e, + 0x65, 0x31, 0x4e, 0xc9, 0x87, 0x14, 0x6e, 0x0e, + 0x6e, 0xd1, 0x50, 0x6b, 0xb4, 0x6c, 0x2b, 0x4f, + 0xc6, 0x2f, 0x26, 0xc6, 0x36, 0x9c, 0x41, 0x81, + 0xd2, 0x3f, 0x9a, 0xac, 0x1c, 0x3f, 0x08, 0x5e, + 0x0d, 0xbe, 0xbf, 0x75, 0xa5, 0x9b, 0x60, 0x78, + 0x8e, 0x49, 0xe5, 0x92, 0x37, 0x38, 0x01, 0xb0, + 0x02, 0x45, 0x40, 0xee, 0x27, 0x33, 0x84, 0x76, + 0xe6, 0xb2, 0x2f, 0x39, 0x66, 0x8e, 0x20, 0x1d, + 0x23, 0x83, 0x1a, 0x48, 0x68, 0x27, 0x9c, 0xee, + 0x0b, 0x43, 0x77, 0x90, 0x96, 0x1b, 0x96, 0xe3, + 0xa4, 0xc8, 0x8b, 0x77, 0xc4, 0xc0, 0xf9, 0x2e, + 0x5e, 0x1a, 0x0b, 0xaa, 0x7e, 0x28, 0x69, 0xd8, + 0xbc, 0xe4, 0xc8, 0xf9, 0x65, 0x81, 0x8d, 0xd2, + 0xb6, 0x77, 0xdb, 0xdc, 0xc4, 0xd3, 0x33, 0x77, + 0x3c, 0x71, 0x0f, 0x19, 0x05, 0x96, 0xaa, 0x55, + 0x6e, 0x7c, 0xc1, 0x9e, 0xe6, 0x76, 0x37, 0x20, + 0xcb, 0x16, 0xdb, 0x3b, 0x80, 0x31, 0xc0, 0x12, + 0xf2, 0x05, 0x6a, 0x6b, 0xb9, 0x25, 0xce, 0x4b, + 0x71, 0x05, 0xa7, 0x0d, 0xc3, 0x6c, 0xdb, 0x3f, + 0x17, 0x59, 0x73, 0x40, 0xe0, 0x1c, 0xcd, 0x94, + 0x1c, 0x5b, 0x36, 0xa0, 0xb1, 0xa2, 0xd2, 0x5d, + 0x5e, 0xdf, 0xda, 0x63, 0x5a, 0x64, 0x99, 0xae, + 0x2f, 0x95, 0xac, 0x17, 0x6d, 0xa6, 0xc8, 0xdd, + 0xff, 0x00, 0xb0, 0x8d, 0xcb, 0x2b, 0x12, 0xeb, + 0xb7, 0x35, 0xc6, 0x4b, 0x96, 0xde, 0xc0, 0xea, + 0x18, 0xae, 0x05, 0x01, 0x3c, 0xe2, 0x8d, 0xd8, + 0x83, 0x64, 0x8b, 0x57, 0x93, 0xb9, 0xba, 0x75, + 0xd4, 0x16, 0x16, 0x92, 0x75, 0x12, 0x4c, 0x1c, + 0xf7, 0x4b, 0x40, 0xea, 0x06, 0x8a, 0xd2, 0x87, + 0x9d, 0x7c, 0xcf, 0x73, 0x91, 0xb5, 0xc7, 0x45, + 0x1c, 0x85, 0xae, 0xbd, 0x95, 0xe2, 0x16, 0xc8, + 0x37, 0x54, 0xfe, 0xdd, 0x10, 0x6d, 0x94, 0x2d, + 0x34, 0x73, 0xdf, 0xd8, 0x5e, 0x32, 0xda, 0xee, + 0xe3, 0xca, 0x5b, 0x72, 0xd7, 0x18, 0xde, 0x5a, + 0x1a, 0x5a, 0xe6, 0xf2, 0x78, 0xbd, 0xf5, 0x85, + 0x1d, 0xee, 0x67, 0xd1, 0xcd, 0xca, 0x49, 0x73, + 0x46, 0x46, 0xef, 0x1a, 0x00, 0xd1, 0x47, 0x34, + 0x1a, 0x56, 0xbc, 0xe5, 0x05, 0x99, 0x16, 0x92, + 0x69, 0xf2, 0x77, 0x39, 0x57, 0xda, 0x5b, 0xdc, + 0x0b, 0x78, 0x9b, 0x0b, 0x24, 0x2e, 0x00, 0x38, + 0x82, 0x6b, 0xb0, 0x07, 0x73, 0xaf, 0x0f, 0x4e, + 0x4f, 0x16, 0x38, 0x36, 0x79, 0x5a, 0xdb, 0x8e, + 0xb8, 0xdb, 0x19, 0xcd, 0x28, 0x0b, 0x7f, 0x6c, + 0x8d, 0xc8, 0x2c, 0x6a, 0x2a, 0xb4, 0x16, 0x99, + 0x81, 0x05, 0xc9, 0x81, 0xf7, 0xcc, 0xbf, 0x6c, + 0x8c, 0x2f, 0x0f, 0x68, 0x00, 0xb4, 0xb7, 0x90, + 0x86, 0xf3, 0xaf, 0x7c, 0x6b, 0xb2, 0xd3, 0x98, + 0xaf, 0x24, 0x98, 0x3a, 0xde, 0xe1, 0xa5, 0xc6, + 0x22, 0x00, 0x31, 0xd7, 0xe2, 0xf0, 0xd3, 0x7f, + 0xba, 0x89, 0x2d, 0x97, 0x96, 0x5b, 0x51, 0xee, + 0xeb, 0x1b, 0x48, 0x8d, 0x24, 0x35, 0xdc, 0x7b, + 0xab, 0xd8, 0x38, 0x38, 0x54, 0x6d, 0x07, 0x68, + 0x2a, 0xab, 0x6d, 0xe5, 0x76, 0xd1, 0x65, 0xa7, + 0xeb, 0xfa, 0xc2, 0xd9, 0x0f, 0x8a, 0xe6, 0x8a, + 0x13, 0x51, 0xb7, 0xa1, 0x6c, 0xed, 0xf2, 0x13, + 0xc5, 0x3d, 0xdc, 0x57, 0x0e, 0xab, 0x63, 0x8d, + 0xb2, 0x43, 0xb0, 0x0d, 0x84, 0x6d, 0x09, 0xc3, + 0xb9, 0x78, 0xd7, 0x5a, 0x6c, 0xdd, 0x71, 0x1b, + 0x24, 0x11, 0xb9, 0xc0, 0x3c, 0x82, 0x43, 0x49, + 0xda, 0x40, 0xde, 0xa6, 0x19, 0xe3, 0x9d, 0xbc, + 0x71, 0x38, 0x3d, 0x87, 0x73, 0x86, 0xe5, 0xa0, + 0x8a, 0xe6, 0xfa, 0x71, 0x6e, 0xd9, 0x64, 0xe0, + 0x92, 0xe2, 0xda, 0x49, 0x0b, 0xb8, 0x47, 0x10, + 0xda, 0x29, 0xf0, 0xaf, 0x1c, 0x5c, 0xd7, 0xb6, + 0x36, 0x36, 0x72, 0x99, 0xfa, 0xc8, 0x24, 0x9b, + 0xab, 0x91, 0xa5, 0xa0, 0x50, 0x1e, 0xf2, 0x9d, + 0xbc, 0x4e, 0xde, 0x0b, 0x4a, 0x2d, 0x7d, 0xb5, + 0xd4, 0xd3, 0xe4, 0xae, 0x23, 0x07, 0xf8, 0x10, + 0x35, 0xad, 0xa7, 0x3b, 0x9c, 0x2a, 0x76, 0xf7, + 0x16, 0xc1, 0x50, 0x44, 0x44, 0x04, 0x44, 0x41, + 0x0a, 0xb7, 0x82, 0x68, 0x7d, 0xee, 0x4d, 0x87, + 0x73, 0x9e, 0x41, 0x56, 0x45, 0x50, 0xc7, 0xe5, + 0xac, 0x6c, 0x32, 0x59, 0x06, 0x5c, 0xbf, 0x80, + 0xba, 0x43, 0x4e, 0x94, 0x11, 0x89, 0xb9, 0x6e, + 0x07, 0x33, 0x3d, 0x85, 0xc9, 0xe0, 0x82, 0xe5, + 0xdc, 0x50, 0xb8, 0xee, 0xa9, 0x2a, 0xde, 0x1c, + 0x08, 0xa8, 0x35, 0x07, 0x71, 0x55, 0x3c, 0xbd, + 0xee, 0x9f, 0xca, 0xc2, 0x19, 0x24, 0xbc, 0x32, + 0x37, 0xe2, 0x49, 0xb2, 0xa1, 0x68, 0x46, 0x43, + 0x21, 0x69, 0xfc, 0x18, 0x2f, 0x4b, 0xe2, 0xdc, + 0x09, 0x3c, 0x88, 0x2e, 0xda, 0x83, 0x31, 0x06, + 0x36, 0xc9, 0xfe, 0x30, 0x33, 0xbc, 0x16, 0xc4, + 0xc0, 0x76, 0x92, 0x56, 0x1e, 0x96, 0xc7, 0xba, + 0xd2, 0xc5, 0xd2, 0xcd, 0xb2, 0x5b, 0x92, 0x5c, + 0xfa, 0xf7, 0x55, 0x7f, 0x1c, 0xdc, 0x6b, 0xae, + 0x5b, 0x79, 0x95, 0xba, 0xeb, 0xe5, 0x6e, 0xd0, + 0xd2, 0x6a, 0x07, 0xb8, 0xac, 0x9e, 0xb3, 0xe1, + 0xa9, 0x4e, 0xb6, 0x80, 0x6e, 0x08, 0x34, 0xd1, + 0x5e, 0x1d, 0x35, 0x99, 0x9d, 0xb3, 0x83, 0xe4, + 0x97, 0x3e, 0x30, 0x3d, 0xd5, 0xef, 0x8e, 0xb3, + 0x9b, 0x51, 0xdf, 0xfa, 0x4e, 0xf0, 0x91, 0x69, + 0x11, 0xfe, 0x04, 0x7b, 0xab, 0x45, 0xef, 0x93, + 0xc9, 0xe9, 0xdc, 0xa5, 0xb1, 0x86, 0x79, 0x07, + 0x10, 0xf8, 0xae, 0xe5, 0x0a, 0xb8, 0x2e, 0xee, + 0xb1, 0xd5, 0x8a, 0xc2, 0xee, 0xb0, 0x7e, 0xc8, + 0xee, 0x20, 0xbd, 0x66, 0x72, 0xd6, 0xf8, 0x9b, + 0x27, 0x48, 0xf7, 0x0e, 0x3a, 0x52, 0x36, 0x72, + 0x93, 0xb8, 0x2d, 0x46, 0x93, 0xb4, 0x95, 0xac, + 0x9b, 0x25, 0x70, 0x3f, 0x8d, 0x74, 0x6a, 0x3b, + 0xcb, 0x47, 0x64, 0x2c, 0x6e, 0x27, 0x6d, 0xce, + 0x62, 0xeb, 0xad, 0xe1, 0xda, 0xd8, 0xeb, 0xca, + 0xac, 0xc3, 0x52, 0x61, 0x18, 0xd0, 0xc6, 0x49, + 0x46, 0xb7, 0x60, 0x01, 0x06, 0xd4, 0x1a, 0x6c, + 0x4a, 0xf2, 0x2d, 0x5f, 0xac, 0xd8, 0x6e, 0xd7, + 0xe0, 0x4f, 0x59, 0xf0, 0xdd, 0xae, 0xe4, 0x15, + 0xed, 0x73, 0xff, 0x00, 0x7e, 0x2f, 0x9a, 0xab, + 0x4b, 0x79, 0xab, 0x32, 0x16, 0xb9, 0x0b, 0xc8, + 0x9f, 0x6a, 0x78, 0xc7, 0x0d, 0x28, 0x17, 0xb6, + 0x0f, 0x48, 0x5c, 0xde, 0x16, 0xcd, 0x78, 0x0c, + 0x70, 0x6f, 0xe1, 0xe5, 0x21, 0x49, 0x18, 0x9a, + 0x5a, 0xc2, 0xe6, 0xeb, 0x29, 0x14, 0xd1, 0xb0, + 0xf5, 0x51, 0x1a, 0xb9, 0xfc, 0x8b, 0xa6, 0x05, + 0xe1, 0x67, 0x65, 0x6f, 0x65, 0x0b, 0x61, 0xb7, + 0x60, 0x63, 0x5b, 0xb3, 0x62, 0xc8, 0x54, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x53, + 0x7d, 0xa6, 0x69, 0xc6, 0xe5, 0xf0, 0x8f, 0xb8, + 0x89, 0xb5, 0xba, 0xb4, 0x05, 0xec, 0xa7, 0x28, + 0xe5, 0x57, 0x25, 0xf2, 0xf6, 0xb5, 0xed, 0x73, + 0x5c, 0x2a, 0xd7, 0x02, 0x08, 0xee, 0x14, 0x1f, + 0x97, 0x47, 0x37, 0x2a, 0x2b, 0x2f, 0xb4, 0x1d, + 0x3e, 0x70, 0x7a, 0x82, 0x56, 0x46, 0xd2, 0x2d, + 0x6e, 0x7f, 0x8b, 0x09, 0xa5, 0x05, 0x4f, 0xc6, + 0x1e, 0xe2, 0xad, 0x04, 0x0e, 0xe7, 0x2a, 0x27, + 0xc0, 0x85, 0x01, 0x10, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x0a, 0xa0, 0x77, 0x39, + 0x51, 0x39, 0x3b, 0x88, 0x80, 0x88, 0x88, 0x09, + 0x54, 0x50, 0x10, 0x49, 0x5b, 0xdb, 0x63, 0x4b, + 0x78, 0xfe, 0x6a, 0xd1, 0x1e, 0x45, 0xbc, 0x83, + 0xfe, 0xbc, 0x7f, 0x35, 0x5c, 0x52, 0x5e, 0x84, + 0xa8, 0x42, 0x54, 0x6d, 0x54, 0x2a, 0xa1, 0x14, + 0x12, 0x81, 0x55, 0x05, 0x41, 0x4d, 0xaa, 0x08, + 0x4a, 0xa8, 0x35, 0x51, 0x54, 0x12, 0x4a, 0xf9, + 0xaa, 0x28, 0x28, 0x04, 0xa1, 0x3b, 0x14, 0x12, + 0xa0, 0x94, 0x02, 0x54, 0x55, 0x41, 0x24, 0xec, + 0x5e, 0xf6, 0x36, 0x17, 0xd9, 0x2b, 0x86, 0xda, + 0xd8, 0xc4, 0x65, 0x99, 0xdb, 0x80, 0x1b, 0xbb, + 0xa5, 0x06, 0x3b, 0x9c, 0x00, 0xdb, 0xee, 0x05, + 0x65, 0xc7, 0xfb, 0x3d, 0xd4, 0x59, 0x0c, 0x79, + 0xbe, 0x89, 0xac, 0x63, 0x5c, 0x2b, 0x1c, 0x6f, + 0x34, 0x71, 0x0b, 0x3d, 0xf8, 0xcd, 0x31, 0xa5, + 0x6d, 0xcc, 0x79, 0xca, 0xe4, 0x72, 0x93, 0x36, + 0x86, 0xde, 0x33, 0xb2, 0x30, 0x7e, 0x6a, 0x9d, + 0x27, 0xaa, 0xfd, 0x1d, 0x96, 0x93, 0x1e, 0x24, + 0x96, 0x3c, 0x7d, 0xe8, 0x02, 0xdf, 0xae, 0xad, + 0x62, 0x2e, 0x1e, 0x29, 0x15, 0x3b, 0x90, 0x78, + 0x61, 0xe7, 0xcc, 0xe9, 0xd9, 0x5d, 0x8d, 0xce, + 0xda, 0xc9, 0xe8, 0x7b, 0xa0, 0x63, 0x94, 0x16, + 0xf8, 0xa2, 0xa7, 0xe3, 0x87, 0x72, 0xd0, 0xad, + 0x3e, 0xac, 0xc6, 0xdd, 0xe2, 0xf2, 0xa3, 0x8e, + 0x53, 0x24, 0x0f, 0x0d, 0x75, 0x95, 0xc8, 0x3b, + 0xe3, 0x1b, 0x58, 0x2b, 0xce, 0x15, 0xc6, 0xef, + 0x5e, 0xe4, 0x70, 0xd7, 0xef, 0xc6, 0xea, 0x0b, + 0x36, 0x5e, 0x43, 0xbe, 0x3b, 0x80, 0x01, 0x2e, + 0x63, 0xb7, 0x10, 0x37, 0x2f, 0x6c, 0xae, 0x4f, + 0x49, 0x6a, 0xec, 0x37, 0x91, 0x5b, 0xca, 0xdb, + 0x6b, 0x98, 0x45, 0x6d, 0x9b, 0x2d, 0x1a, 0x43, + 0xa9, 0xf1, 0x54, 0x56, 0x3e, 0x36, 0xe6, 0xd7, + 0x5e, 0x69, 0xb7, 0x63, 0x2f, 0x08, 0x6e, 0x62, + 0xc4, 0x7f, 0x09, 0xe7, 0x79, 0xa6, 0xe2, 0x3b, + 0xea, 0x99, 0x6d, 0x73, 0x9b, 0xd2, 0x59, 0x3f, + 0xe2, 0x33, 0xaa, 0x95, 0xa7, 0xf8, 0x90, 0xbc, + 0x55, 0xaf, 0x6f, 0xba, 0xbc, 0x31, 0x59, 0x4b, + 0xbd, 0x3d, 0x93, 0x92, 0x78, 0x40, 0x37, 0x11, + 0x07, 0xc4, 0x0d, 0x68, 0x01, 0x3b, 0x2b, 0xdd, + 0x58, 0x57, 0x97, 0xd7, 0x77, 0xd7, 0x0f, 0xb9, + 0xbb, 0x90, 0xcb, 0x2b, 0xcd, 0x49, 0x76, 0xdd, + 0xea, 0xa3, 0x3f, 0x39, 0xaa, 0x73, 0x19, 0xb2, + 0x5b, 0x77, 0x2d, 0x2d, 0xf8, 0x8b, 0x9b, 0x6e, + 0xcd, 0x8d, 0x00, 0xed, 0xa6, 0xc5, 0xa8, 0x27, + 0xb8, 0xa0, 0xa8, 0x28, 0x05, 0x41, 0x2a, 0x0b, + 0x94, 0x54, 0xa2, 0xaf, 0x5e, 0xc8, 0x8c, 0x9e, + 0xb1, 0xbc, 0x37, 0xe2, 0xf5, 0x47, 0x8b, 0xbc, + 0xbb, 0x4a, 0xe6, 0x5e, 0xc6, 0x71, 0xd1, 0xf9, + 0x2d, 0xe6, 0x48, 0xff, 0x00, 0x31, 0xce, 0x11, + 0x37, 0xe6, 0xd2, 0xab, 0xa6, 0xa8, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x8a, 0x16, + 0x16, 0x43, 0x31, 0x63, 0x60, 0xda, 0xcf, 0x28, + 0x07, 0x91, 0xb5, 0xda, 0x83, 0x39, 0x6a, 0xf2, + 0x9a, 0x83, 0x1f, 0x8d, 0x69, 0xeb, 0x64, 0x0e, + 0x93, 0x91, 0x83, 0x69, 0xaa, 0xaf, 0x5e, 0xea, + 0x3c, 0xb6, 0x4c, 0x98, 0xb1, 0x91, 0x98, 0xe2, + 0x3b, 0x0c, 0x87, 0x62, 0xf3, 0xb3, 0xd3, 0xcc, + 0x6b, 0x84, 0xf7, 0xcf, 0x33, 0xca, 0x76, 0xed, + 0xe7, 0x41, 0xea, 0x75, 0x6e, 0x66, 0xe1, 0xc5, + 0xf6, 0xb6, 0xdf, 0xc1, 0xfd, 0x9a, 0x84, 0xf5, + 0x97, 0x51, 0x79, 0xb0, 0xff, 0x00, 0x1e, 0xe2, + 0xd9, 0x35, 0x8c, 0x63, 0x78, 0x18, 0x00, 0x68, + 0xdc, 0x02, 0x9f, 0x70, 0x20, 0xd6, 0x0d, 0x49, + 0xa8, 0xcf, 0xff, 0x00, 0xac, 0x3f, 0xc7, 0xb8, + 0x9e, 0xb2, 0x6a, 0x2f, 0x36, 0x1f, 0xe3, 0xdc, + 0x5b, 0x27, 0xbd, 0xac, 0x69, 0x73, 0xc8, 0x6b, + 0x47, 0x2a, 0xd5, 0x5e, 0xea, 0x2b, 0x68, 0x6a, + 0xdb, 0x7f, 0xe2, 0xcb, 0xc9, 0x4e, 0x74, 0x13, + 0x26, 0xa8, 0xcf, 0xc6, 0xd2, 0xf9, 0x2d, 0xc3, + 0x5a, 0x37, 0x93, 0xff, 0x00, 0xe1, 0x62, 0x7a, + 0xf9, 0x91, 0xaf, 0xf2, 0xdb, 0xbe, 0x8b, 0x06, + 0x77, 0x64, 0x72, 0x2f, 0xe2, 0x9d, 0xdc, 0x11, + 0xfc, 0x91, 0xb3, 0x62, 0xf8, 0xba, 0xb6, 0x86, + 0x0b, 0x42, 0x1a, 0x36, 0xd7, 0x7a, 0x40, 0xdf, + 0x4f, 0x70, 0xeb, 0x8d, 0x43, 0x61, 0x3b, 0x80, + 0x0e, 0x92, 0x02, 0x48, 0xe4, 0xdc, 0xa9, 0x59, + 0x6d, 0x92, 0x64, 0x77, 0x7c, 0x77, 0x2b, 0x7b, + 0x47, 0xff, 0x00, 0x73, 0x8c, 0xe7, 0x30, 0x2d, + 0x46, 0x47, 0x49, 0xe6, 0x66, 0x92, 0xf0, 0xb2, + 0x3a, 0x89, 0x9e, 0xe2, 0xcd, 0x9c, 0x89, 0x22, + 0xb9, 0xa5, 0xcd, 0x71, 0x2d, 0x3f, 0x49, 0x25, + 0x7d, 0xe5, 0xac, 0xd5, 0x67, 0xfe, 0x45, 0xa7, + 0xf4, 0x87, 0xc2, 0xad, 0xb8, 0x1d, 0x1f, 0x9b, + 0xb5, 0xc7, 0x36, 0x29, 0x62, 0x2d, 0x7f, 0x1b, + 0xcd, 0x3b, 0x86, 0x94, 0x58, 0x3a, 0x83, 0x42, + 0xea, 0x0b, 0xb9, 0xad, 0xdd, 0x04, 0x45, 0xc2, + 0x36, 0x06, 0xb8, 0xf3, 0x10, 0x87, 0x74, 0x7b, + 0x9f, 0x16, 0x14, 0x18, 0xe8, 0xfe, 0x6a, 0xb3, + 0x69, 0x8a, 0x75, 0xf9, 0x0d, 0x9f, 0xfe, 0xab, + 0x7e, 0x02, 0xb0, 0x6d, 0x34, 0x96, 0x69, 0x96, + 0x6c, 0x89, 0xd1, 0x9e, 0x30, 0x28, 0xb7, 0x58, + 0x6c, 0x3d, 0xf5, 0x83, 0xaf, 0xa6, 0xb9, 0x69, + 0x6b, 0x1f, 0x6e, 0x1a, 0x0f, 0x74, 0x02, 0xb4, + 0x34, 0x1c, 0x4f, 0xf2, 0x56, 0xb1, 0x87, 0x87, + 0x8d, 0xe5, 0xb5, 0xf7, 0x56, 0xe2, 0x3d, 0x0d, + 0x72, 0xf6, 0xb2, 0x4e, 0xb4, 0x55, 0xc0, 0x38, + 0x54, 0xf3, 0xad, 0x30, 0xfe, 0x44, 0x5f, 0xd5, + 0xff, 0x00, 0x35, 0xd2, 0xed, 0xff, 0x00, 0xeb, + 0x43, 0xf3, 0x07, 0xc0, 0xa0, 0xab, 0xb7, 0x4a, + 0xe5, 0x98, 0xde, 0x16, 0xdd, 0x00, 0x39, 0x81, + 0x53, 0xea, 0xb6, 0x67, 0xce, 0xfd, 0xf5, 0x6b, + 0x51, 0xb5, 0x41, 0x55, 0xf5, 0x5b, 0x31, 0xe7, + 0x5e, 0xfa, 0x7a, 0xad, 0x98, 0xf3, 0xbf, 0x7d, + 0x5a, 0x89, 0x21, 0x48, 0xde, 0x15, 0x81, 0xce, + 0x6f, 0x6d, 0x2e, 0xe3, 0xc8, 0x1b, 0x1b, 0x89, + 0xcb, 0xc3, 0x06, 0xdd, 0xab, 0xda, 0x1b, 0x58, + 0x21, 0x03, 0x85, 0xa0, 0x91, 0xca, 0xbd, 0xf3, + 0x5f, 0x99, 0x25, 0xef, 0x21, 0x40, 0xae, 0xca, + 0x2c, 0x5c, 0x89, 0xff, 0x00, 0x88, 0xf5, 0x92, + 0xb1, 0xb2, 0x3f, 0xf5, 0x1e, 0x82, 0xf9, 0xa7, + 0xcf, 0xff, 0x00, 0x4f, 0x6d, 0xf3, 0x02, 0xd8, + 0x2d, 0x76, 0x03, 0xee, 0x7b, 0x6f, 0x98, 0x16, + 0xc3, 0x6a, 0x83, 0xe9, 0x17, 0xcd, 0x4a, 0x54, + 0xa0, 0xfa, 0x45, 0xf3, 0x52, 0x95, 0xff, 0x00, + 0xf2, 0x83, 0xe9, 0x79, 0xbe, 0x78, 0x98, 0xf6, + 0xc6, 0xe7, 0x80, 0xf7, 0xfc, 0x56, 0x9e, 0x55, + 0xa9, 0xca, 0x6a, 0x2b, 0x7b, 0x4f, 0xe0, 0x5b, + 0x9e, 0xba, 0xe8, 0xec, 0x6b, 0x07, 0x39, 0x58, + 0x58, 0xac, 0x2e, 0x46, 0xe6, 0xed, 0xb9, 0x2c, + 0x93, 0xcb, 0x5e, 0xd3, 0x56, 0x47, 0xcc, 0x82, + 0xcc, 0xa5, 0x42, 0x94, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x41, 0x53, 0xcd, 0xfe, 0x69, + 0xb0, 0xef, 0xc7, 0xfb, 0xca, 0xd6, 0x39, 0x55, + 0x53, 0x37, 0xf9, 0xa6, 0xc7, 0xbf, 0x1f, 0xef, + 0x2b, 0x58, 0xe5, 0x41, 0x28, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0xaa, 0x7a, 0xaf, 0xef, + 0xac, 0x7f, 0x79, 0xbf, 0xdc, 0x0a, 0xd8, 0xaa, + 0x7a, 0xaf, 0xef, 0xac, 0x7f, 0x78, 0x7f, 0x70, + 0x20, 0xb5, 0xf2, 0xa9, 0x50, 0xa5, 0x01, 0x11, + 0x10, 0x41, 0x15, 0x04, 0x73, 0xad, 0x1e, 0x12, + 0xd2, 0xe2, 0x3b, 0xdb, 0x83, 0x33, 0x0b, 0x19, + 0x10, 0xea, 0xa2, 0x27, 0x71, 0x05, 0xc5, 0xf5, + 0x1d, 0x2b, 0x7a, 0xa2, 0x88, 0x34, 0xb8, 0x8b, + 0x4b, 0x88, 0x6f, 0x6e, 0x3a, 0xe6, 0x91, 0x1c, + 0x23, 0xab, 0x84, 0x9d, 0xc4, 0x13, 0xc7, 0x51, + 0xd2, 0xbc, 0x6d, 0x6d, 0x6e, 0x59, 0x1d, 0x80, + 0x74, 0x4e, 0xac, 0x73, 0x4a, 0x5e, 0x29, 0xb8, + 0x13, 0xb2, 0xaa, 0xc1, 0x44, 0xe1, 0x52, 0x2f, + 0xb7, 0xb4, 0x68, 0xef, 0xa2, 0x36, 0x99, 0x47, + 0x5e, 0x3a, 0xd4, 0xdd, 0xdb, 0xce, 0xc0, 0xc7, + 0x06, 0xb4, 0x3d, 0xcd, 0x73, 0x6a, 0x77, 0x1e, + 0x75, 0x13, 0x89, 0xee, 0xb1, 0xed, 0x73, 0x2d, + 0x3c, 0x9d, 0xa6, 0x78, 0xcb, 0x23, 0x68, 0xa3, + 0xb8, 0x01, 0xda, 0x5c, 0xd5, 0xbd, 0x45, 0x45, + 0x78, 0x30, 0xe3, 0x2e, 0xae, 0x1b, 0x35, 0x89, + 0xba, 0x8e, 0x77, 0x75, 0x90, 0xc8, 0xc6, 0x07, + 0x90, 0x48, 0x03, 0x85, 0xd5, 0x59, 0x17, 0x33, + 0x48, 0xcb, 0x58, 0x45, 0xce, 0x3c, 0x49, 0x14, + 0xa0, 0xf5, 0xb1, 0x44, 0xde, 0x22, 0xca, 0xee, + 0xa0, 0x5b, 0x94, 0x41, 0x5e, 0xb2, 0x8e, 0x7b, + 0x3b, 0x29, 0xa6, 0x8a, 0xd5, 0xd2, 0x5b, 0x49, + 0x28, 0x2d, 0xb5, 0x92, 0xa5, 0xcd, 0x8f, 0x94, + 0xd1, 0xdc, 0xab, 0xd3, 0x09, 0x6a, 0x1b, 0x7d, + 0x35, 0xcd, 0xbc, 0x32, 0x5a, 0xda, 0xbd, 0xa0, + 0x75, 0x52, 0x54, 0x12, 0xfd, 0xb5, 0x3c, 0x27, + 0x60, 0x5b, 0xda, 0x25, 0x13, 0xaf, 0x4a, 0x4e, + 0x9d, 0x6d, 0xaa, 0xc9, 0xb2, 0x5b, 0x7b, 0xeb, + 0x7c, 0x8c, 0x71, 0xba, 0x66, 0xc6, 0x1c, 0xc9, + 0x18, 0xc1, 0x57, 0x51, 0xc3, 0x61, 0x01, 0x7c, + 0x5d, 0xf9, 0x65, 0xdd, 0x84, 0x57, 0x6d, 0x84, + 0xb2, 0x68, 0x25, 0x13, 0x36, 0x13, 0x5e, 0x22, + 0xd6, 0xf2, 0x53, 0x9c, 0xad, 0xc2, 0x51, 0x15, + 0xa3, 0x06, 0xe3, 0x29, 0x7b, 0x14, 0xfd, 0x44, + 0x96, 0xf0, 0xda, 0xb5, 0xe7, 0xf8, 0x83, 0x85, + 0xce, 0x7b, 0x80, 0xa5, 0x07, 0xb8, 0xbc, 0xbc, + 0x92, 0xe7, 0xd5, 0xa7, 0x5b, 0xf5, 0x6e, 0xeb, + 0x8f, 0xfe, 0xba, 0x6d, 0xde, 0xac, 0x34, 0x51, + 0xc2, 0x14, 0xdb, 0xf0, 0xf0, 0x92, 0x37, 0xb5, + 0x36, 0xb0, 0x4c, 0xdc, 0xcc, 0xb2, 0xb9, 0x84, + 0x46, 0xe8, 0x23, 0x68, 0x71, 0xdd, 0x50, 0x0d, + 0x42, 0xc0, 0x38, 0xeb, 0xaf, 0x26, 0x92, 0x61, + 0x0f, 0x1b, 0xe0, 0xbc, 0x7c, 0xe2, 0x17, 0x8f, + 0x8e, 0xc2, 0xac, 0xd4, 0x4a, 0x2b, 0xf8, 0x7c, + 0x6c, 0xe1, 0x4d, 0x35, 0xbb, 0xc5, 0xf3, 0x9f, + 0x14, 0x56, 0x3e, 0x4b, 0x19, 0x61, 0x0f, 0x92, + 0x46, 0x06, 0x3b, 0x88, 0xee, 0xe1, 0xa6, 0xf4, + 0xc5, 0x5d, 0x5d, 0xc6, 0xd8, 0x71, 0xee, 0xb6, + 0x7b, 0x4c, 0x23, 0x86, 0x59, 0x9c, 0x28, 0xca, + 0x37, 0xe4, 0x9e, 0x55, 0xb9, 0xa2, 0x51, 0x3e, + 0x02, 0xb7, 0x2d, 0xbd, 0xc8, 0x66, 0x52, 0xdb, + 0xa9, 0x79, 0x33, 0x3b, 0x8e, 0x37, 0x81, 0xe2, + 0x90, 0x48, 0xdc, 0xbe, 0xf3, 0xb8, 0xfb, 0xa9, + 0xbc, 0x99, 0xf6, 0xcd, 0x25, 0xd2, 0x34, 0x41, + 0x35, 0x39, 0x1a, 0x48, 0x35, 0x3d, 0xea, 0x2b, + 0x0d, 0x12, 0x8a, 0x6e, 0xae, 0x95, 0xe0, 0x7e, + 0x2d, 0x4c, 0xf6, 0xaf, 0x19, 0x28, 0x3a, 0xb6, + 0x1e, 0xa9, 0x96, 0xef, 0x67, 0x17, 0x20, 0xa9, + 0x14, 0x0b, 0x1a, 0xda, 0xde, 0x47, 0xe0, 0xa6, + 0xb6, 0x92, 0x37, 0x45, 0x24, 0x3c, 0x44, 0x17, + 0x0a, 0x0a, 0xb4, 0xf1, 0x02, 0xde, 0x85, 0xbe, + 0xe0, 0x0b, 0x1e, 0xfa, 0xd2, 0x4b, 0x98, 0x84, + 0x6c, 0x98, 0xc2, 0x0b, 0x81, 0x7d, 0x00, 0x3c, + 0x4d, 0xe5, 0x6e, 0xde, 0x74, 0xad, 0x93, 0x1c, + 0xfe, 0xb6, 0x47, 0x0e, 0x9f, 0x4a, 0x62, 0x69, + 0xd8, 0xe4, 0xf4, 0x78, 0xb8, 0x98, 0x7f, 0x16, + 0xe1, 0xc6, 0x47, 0xf7, 0x89, 0xf1, 0x7d, 0xe5, + 0xb5, 0x5f, 0x11, 0x46, 0xd8, 0xe3, 0x6c, 0x6c, + 0x14, 0x6b, 0x40, 0x0d, 0x1d, 0xc0, 0xbe, 0xd5, + 0x9d, 0xe0, 0x8b, 0xca, 0x79, 0xe3, 0x82, 0x33, + 0x24, 0x8e, 0x0d, 0x60, 0xde, 0x4a, 0x98, 0xa6, + 0x12, 0xc6, 0xd9, 0x1b, 0xb5, 0xae, 0xda, 0x0a, + 0x2d, 0x4d, 0x79, 0xab, 0x65, 0xd5, 0xbd, 0x11, + 0x11, 0x10, 0x5a, 0xb9, 0xf4, 0xe6, 0x26, 0xe2, + 0x67, 0x4d, 0x2c, 0x20, 0xc8, 0xed, 0xae, 0x35, + 0x5b, 0x44, 0x41, 0xa8, 0xf5, 0x5b, 0x0d, 0xd8, + 0x0e, 0x95, 0x3e, 0xac, 0x61, 0xc7, 0xfe, 0x8f, + 0x7d, 0x6d, 0x91, 0x06, 0xa3, 0xd5, 0x6c, 0x2d, + 0x6b, 0xd4, 0x0e, 0x94, 0xf5, 0x5f, 0x0d, 0xd8, + 0x0e, 0x95, 0xb7, 0x44, 0x1a, 0x8f, 0x55, 0xb0, + 0xdd, 0x80, 0xe9, 0x53, 0xea, 0xbe, 0x1e, 0x94, + 0xea, 0x3d, 0xf5, 0xb6, 0x44, 0x1a, 0x8f, 0x55, + 0xf0, 0xdd, 0x80, 0xe9, 0x4f, 0x55, 0xb0, 0xdd, + 0x80, 0xe9, 0x5b, 0x74, 0x41, 0xa8, 0xf5, 0x5b, + 0x0d, 0xd8, 0x0e, 0x94, 0xf5, 0x5b, 0x0d, 0xd8, + 0x0e, 0x95, 0xb7, 0x44, 0x1a, 0xb8, 0xb4, 0xde, + 0x26, 0x19, 0x04, 0x8c, 0x80, 0x71, 0x37, 0x75, + 0x76, 0xad, 0x9b, 0x40, 0x68, 0xa0, 0xd8, 0x06, + 0xe0, 0xa5, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x05, + 0x57, 0xda, 0x16, 0x9c, 0x8f, 0x37, 0x82, 0x95, + 0xcd, 0x6d, 0x6e, 0xad, 0x41, 0x92, 0x22, 0x06, + 0xdd, 0x9c, 0x8b, 0x82, 0x90, 0xe6, 0x92, 0xd7, + 0x0a, 0x39, 0xa6, 0x84, 0x1e, 0x70, 0xbf, 0x51, + 0x39, 0xa1, 0xcd, 0x2d, 0x3b, 0x41, 0xd8, 0x42, + 0xe1, 0x7e, 0xd2, 0xb4, 0xdb, 0x70, 0xb9, 0xa3, + 0x3c, 0x2d, 0xa5, 0xad, 0xe5, 0x5e, 0xda, 0x6e, + 0x0e, 0xe6, 0x41, 0x51, 0x42, 0x9c, 0x9d, 0xd4, + 0x41, 0x14, 0x52, 0x89, 0xf0, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x7c, 0x08, 0x08, 0x88, 0x81, 0xc9, + 0x5f, 0x79, 0x13, 0xe1, 0xe6, 0x44, 0x04, 0xee, + 0x22, 0x7c, 0x1c, 0xe8, 0x08, 0x02, 0x22, 0x01, + 0xe4, 0x5b, 0xb8, 0x3f, 0x91, 0x1f, 0xcd, 0x5a, + 0x43, 0xc8, 0xb7, 0x50, 0xff, 0x00, 0x25, 0x9d, + 0xe5, 0x61, 0x25, 0xf7, 0x55, 0x04, 0xa8, 0xaa, + 0x55, 0x50, 0xaa, 0x82, 0x51, 0x45, 0x42, 0x80, + 0x4a, 0xc9, 0xc6, 0xe3, 0xae, 0xb2, 0x97, 0xb1, + 0x58, 0xda, 0x8a, 0xcb, 0x29, 0xa5, 0x79, 0x00, + 0xe5, 0x25, 0x67, 0x59, 0x69, 0x2c, 0xd5, 0xfe, + 0x36, 0x4c, 0x9d, 0xbc, 0x5c, 0x50, 0xb0, 0x55, + 0xad, 0xfd, 0xa7, 0x0f, 0xf6, 0x85, 0xed, 0xa1, + 0xb2, 0xb6, 0xd8, 0x9d, 0x42, 0x1f, 0x7c, 0x0c, + 0x6d, 0x95, 0xa6, 0x17, 0x17, 0x6c, 0xe0, 0x27, + 0x66, 0xd4, 0x19, 0xf7, 0x58, 0x5d, 0x1d, 0x8a, + 0x8a, 0x5b, 0x0b, 0xdb, 0xf7, 0x4b, 0x91, 0x70, + 0xd9, 0x33, 0x40, 0xa4, 0x6e, 0x1f, 0xb2, 0x68, + 0x55, 0x46, 0x4e, 0x01, 0x23, 0xda, 0xc7, 0xf5, + 0x8d, 0x69, 0x34, 0x78, 0xe5, 0x1c, 0xeb, 0xa6, + 0x8d, 0x0b, 0xa4, 0xe0, 0xb8, 0x97, 0x23, 0x7b, + 0x78, 0x26, 0x8a, 0x57, 0x19, 0x38, 0x5e, 0x40, + 0x1b, 0x76, 0xef, 0xaa, 0xf3, 0xbc, 0xc0, 0xe8, + 0xfd, 0x43, 0x63, 0x71, 0x0e, 0x08, 0xb6, 0x3b, + 0xeb, 0x46, 0xf1, 0x34, 0xb4, 0xf3, 0x77, 0x2b, + 0xca, 0x83, 0x99, 0xd5, 0x0a, 0x82, 0x08, 0x25, + 0xae, 0xa8, 0x2d, 0x24, 0x1e, 0xf8, 0x50, 0x4a, + 0x05, 0x54, 0x56, 0xbb, 0x11, 0xa0, 0xb9, 0xed, + 0x8d, 0x80, 0xba, 0x47, 0x7c, 0x56, 0x8d, 0xe5, + 0x5c, 0x74, 0xe7, 0xb3, 0x89, 0xb3, 0x16, 0x0f, + 0xbb, 0x9e, 0xe5, 0xb1, 0x97, 0x0f, 0xe0, 0x31, + 0x9e, 0x35, 0x0f, 0xfb, 0x90, 0x57, 0xb4, 0xfe, + 0x20, 0xe6, 0xb2, 0xd0, 0xe3, 0x9b, 0x20, 0x88, + 0xcb, 0x52, 0x5e, 0x79, 0x86, 0xf0, 0xad, 0x39, + 0xc8, 0x6f, 0x74, 0x16, 0x5e, 0xd6, 0x7c, 0x6b, + 0x69, 0x8f, 0x91, 0xad, 0x6c, 0xb2, 0x10, 0x09, + 0x73, 0x87, 0xc6, 0x15, 0xa6, 0xca, 0xaa, 0xff, + 0x00, 0xa3, 0xf2, 0xba, 0x4f, 0x3f, 0x6b, 0x35, + 0xf4, 0x65, 0xad, 0x86, 0x61, 0x49, 0x5b, 0xf1, + 0x1c, 0xd3, 0xb3, 0x7a, 0xe9, 0x57, 0x8e, 0xb6, + 0xd4, 0x4e, 0xc8, 0x69, 0x9c, 0x95, 0x3c, 0xa1, + 0xad, 0x13, 0x5a, 0xbf, 0xe5, 0x31, 0xe3, 0xc5, + 0x70, 0xef, 0x20, 0xd6, 0x67, 0x34, 0xbe, 0x17, + 0x53, 0x75, 0x1a, 0x98, 0x4f, 0xd5, 0x5a, 0xf5, + 0x7c, 0x77, 0x9c, 0x3b, 0x49, 0x03, 0x93, 0xb8, + 0xa9, 0x5a, 0xaf, 0x35, 0x87, 0xca, 0xba, 0x08, + 0x31, 0x96, 0xdd, 0x41, 0xb3, 0xe1, 0x86, 0x09, + 0xea, 0x6a, 0xf6, 0x8d, 0x82, 0xab, 0x73, 0xa4, + 0x32, 0xd3, 0x69, 0xdc, 0xcc, 0xda, 0x5f, 0x34, + 0x0b, 0xac, 0xee, 0x1c, 0x58, 0xd0, 0xed, 0xd5, + 0x26, 0x83, 0xdc, 0x2b, 0x2b, 0x23, 0xa7, 0xb4, + 0xae, 0x93, 0xbf, 0x9b, 0x25, 0x91, 0x9b, 0xca, + 0x89, 0x7f, 0x59, 0x65, 0x60, 0xda, 0x12, 0x09, + 0xda, 0x2b, 0x42, 0x83, 0xca, 0x6b, 0x3f, 0x4d, + 0x60, 0xe4, 0xb0, 0xcd, 0x48, 0xdb, 0x5c, 0x96, + 0x1d, 0xad, 0x31, 0xdd, 0x3b, 0x73, 0xe3, 0x78, + 0xf1, 0x5a, 0x6b, 0xdc, 0x5c, 0xfe, 0x46, 0x86, + 0x48, 0x78, 0x1d, 0x5e, 0x12, 0x78, 0x5e, 0x36, + 0x54, 0x0e, 0x55, 0xb0, 0xcf, 0x67, 0xaf, 0x33, + 0x99, 0x09, 0xaf, 0x66, 0xfe, 0x13, 0x64, 0xa0, + 0x10, 0xb3, 0x63, 0x68, 0xdd, 0x8d, 0xa8, 0xe5, + 0x5a, 0xb2, 0x69, 0xb1, 0x0a, 0x49, 0x24, 0xed, + 0xad, 0x49, 0xde, 0x4e, 0xd3, 0x55, 0xf2, 0x49, + 0x51, 0x5a, 0x28, 0xe2, 0x49, 0x21, 0x24, 0x95, + 0xf3, 0x52, 0x85, 0x7d, 0xdb, 0xdb, 0x5c, 0xdd, + 0xcc, 0xd8, 0x2d, 0x63, 0x74, 0xd3, 0x3c, 0xd1, + 0xac, 0x68, 0xa9, 0x25, 0x15, 0xe7, 0xb4, 0x90, + 0x06, 0xda, 0x9a, 0x0a, 0x73, 0xab, 0xce, 0x8d, + 0xf6, 0x6b, 0x7b, 0x96, 0x74, 0x77, 0xb9, 0x56, + 0x98, 0x2c, 0x89, 0xa8, 0x8c, 0xd7, 0x89, 0xca, + 0xc5, 0xa2, 0x3d, 0x99, 0x41, 0x68, 0xd8, 0xf2, + 0x39, 0xa6, 0x75, 0x97, 0x27, 0x6b, 0x2d, 0xce, + 0xe6, 0x77, 0xd7, 0x46, 0x6b, 0x1a, 0xc6, 0x86, + 0xb0, 0x06, 0xb5, 0xa2, 0x80, 0x05, 0x06, 0x36, + 0x3b, 0x1b, 0x67, 0x8c, 0xb6, 0x6d, 0xad, 0x94, + 0x42, 0x28, 0x98, 0x00, 0x0d, 0x1d, 0xce, 0x75, + 0x96, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x35, 0x9a, 0x8a, 0xe6, 0x6b, 0x6c, + 0x44, 0xf3, 0x42, 0x68, 0xf6, 0xb7, 0x61, 0x54, + 0x68, 0x34, 0xee, 0x67, 0x27, 0x13, 0x6f, 0x1c, + 0xe3, 0x20, 0x93, 0x6e, 0xd3, 0x5d, 0xea, 0xe9, + 0xaa, 0xbe, 0xe4, 0xb8, 0xf9, 0xaa, 0xad, 0x7b, + 0x99, 0xbe, 0xc6, 0x62, 0x31, 0xe2, 0xd5, 0xfc, + 0x22, 0x46, 0x12, 0xee, 0xed, 0x10, 0x7d, 0xb3, + 0x01, 0xa8, 0xe2, 0x6f, 0x04, 0x6e, 0x0c, 0x68, + 0xdc, 0x05, 0x3c, 0x0a, 0x7d, 0x0b, 0xaa, 0x3b, + 0x4f, 0xf1, 0xd0, 0xab, 0xae, 0xd7, 0x39, 0xe1, + 0xa8, 0x21, 0xb3, 0xeb, 0x7f, 0x82, 0xf0, 0x09, + 0x1d, 0xf0, 0xb3, 0xef, 0x35, 0x7e, 0x66, 0x2b, + 0x39, 0x24, 0x6c, 0x9e, 0x33, 0x58, 0xe7, 0x03, + 0xb3, 0x78, 0x28, 0x36, 0x9e, 0x85, 0xd5, 0x1f, + 0x2d, 0x41, 0xc2, 0x6a, 0x83, 0xb3, 0x8d, 0x56, + 0x74, 0xe6, 0xbc, 0xd4, 0x17, 0x92, 0xb5, 0xb3, + 0xcb, 0xc4, 0x0b, 0xa8, 0xb7, 0x4c, 0xd5, 0x59, + 0x63, 0x14, 0x64, 0xc9, 0xb5, 0xc6, 0x87, 0xff, + 0x00, 0x22, 0x10, 0x78, 0xdf, 0x41, 0x96, 0x8e, + 0xe5, 0xb6, 0x37, 0x72, 0xd0, 0x91, 0x5a, 0x0e, + 0x65, 0xeb, 0x05, 0x9c, 0x10, 0x6e, 0x15, 0x77, + 0x39, 0x59, 0x99, 0xf2, 0x5d, 0x9c, 0x85, 0xc7, + 0x7b, 0xa2, 0x69, 0x3e, 0xe8, 0x5e, 0x44, 0x6d, + 0x41, 0x15, 0x58, 0xd9, 0x1f, 0xfa, 0xa7, 0xbe, + 0x16, 0x55, 0x16, 0x2e, 0x47, 0xfe, 0xa9, 0xef, + 0x84, 0x1b, 0x46, 0xfd, 0xf5, 0x8a, 0x1f, 0x42, + 0xae, 0x05, 0xce, 0x07, 0x7a, 0xa7, 0xb4, 0x8f, + 0x4d, 0xe2, 0x89, 0xd8, 0x04, 0x22, 0xa5, 0x6f, + 0x32, 0x7a, 0x87, 0x1b, 0x60, 0x0f, 0x13, 0xc4, + 0x92, 0x0d, 0xcd, 0x6a, 0xb0, 0x36, 0x75, 0x27, + 0x69, 0xe9, 0x2b, 0x0a, 0xfb, 0x37, 0x63, 0x60, + 0xd2, 0xe9, 0xa5, 0x04, 0x8d, 0xcd, 0x07, 0x7a, + 0xac, 0xcd, 0x97, 0xcd, 0xe6, 0x1f, 0xc1, 0x6a, + 0xd3, 0x04, 0x3f, 0x28, 0xf3, 0x2f, 0x5b, 0x5d, + 0x3d, 0x18, 0x77, 0x5d, 0x79, 0x21, 0x9a, 0x43, + 0xbc, 0x13, 0x50, 0x83, 0xd6, 0x4d, 0x72, 0xf2, + 0xe3, 0xd5, 0x5b, 0x39, 0xcc, 0xe4, 0x3b, 0x57, + 0x8c, 0xfa, 0xca, 0x69, 0xed, 0xe4, 0x84, 0xda, + 0xbb, 0xf8, 0x8d, 0x2d, 0xaf, 0x7d, 0x6d, 0x1b, + 0x6d, 0x6e, 0xc6, 0xf0, 0xb1, 0x8d, 0x00, 0x72, + 0x50, 0x2f, 0xae, 0xa6, 0x1a, 0x53, 0x85, 0xbd, + 0x01, 0x05, 0x1b, 0xac, 0x9f, 0xab, 0x63, 0x3a, + 0xa7, 0x78, 0x8f, 0xe3, 0xdc, 0xac, 0xb1, 0xeb, + 0x29, 0x99, 0x13, 0x19, 0xe4, 0x8e, 0x3c, 0x20, + 0x37, 0xa1, 0x6c, 0x5c, 0xdb, 0x66, 0x0e, 0x27, + 0x86, 0x35, 0xbc, 0xa4, 0xd1, 0x6a, 0x2f, 0xb3, + 0xd6, 0x30, 0x13, 0x1d, 0xb4, 0x62, 0x59, 0x07, + 0x28, 0x08, 0x3d, 0xce, 0xb6, 0x95, 0xbb, 0x5d, + 0x6a, 0x5a, 0x07, 0x3d, 0x42, 0xf9, 0xf5, 0xf4, + 0x76, 0x0b, 0x4d, 0x23, 0xaf, 0xaf, 0xc9, 0x74, + 0xb4, 0x8a, 0x33, 0xfb, 0x34, 0x0b, 0xe2, 0xea, + 0xce, 0x28, 0x2d, 0x1c, 0x46, 0xd7, 0x73, 0xa0, + 0xe8, 0x76, 0x77, 0x1e, 0x55, 0x69, 0x1d, 0xcd, + 0x29, 0xd6, 0x0a, 0xd1, 0x7b, 0x8d, 0xe1, 0x60, + 0xe1, 0x7e, 0xe9, 0xb6, 0xf9, 0x81, 0x67, 0x0d, + 0xe1, 0x05, 0x1f, 0x35, 0xf9, 0x92, 0x4e, 0xf2, + 0x82, 0xa7, 0x33, 0xf9, 0x8e, 0x4e, 0xf2, 0x8a, + 0x20, 0x85, 0x8d, 0x91, 0xff, 0x00, 0xa8, 0xf5, + 0x95, 0x45, 0x8b, 0x91, 0x1f, 0xf1, 0x1e, 0x82, + 0xc7, 0x89, 0xd4, 0xd8, 0xfb, 0x7c, 0x75, 0xbc, + 0x32, 0x02, 0x1c, 0xc6, 0x80, 0x56, 0x6f, 0xad, + 0xb8, 0xbe, 0x73, 0xd0, 0x98, 0x4c, 0x55, 0x84, + 0xb8, 0xab, 0x77, 0xbe, 0x16, 0x97, 0x39, 0xa0, + 0x92, 0xb3, 0xbd, 0x0d, 0x8c, 0xec, 0x1a, 0x83, + 0x07, 0xd6, 0xdc, 0x5f, 0x39, 0xe8, 0x4f, 0x5b, + 0x31, 0x7c, 0xe5, 0x67, 0x7a, 0x1b, 0x19, 0xd8, + 0x37, 0xa1, 0x61, 0xe4, 0x61, 0xc0, 0xe3, 0xe2, + 0x32, 0xdc, 0x44, 0xda, 0xf2, 0x37, 0x94, 0xa0, + 0x8f, 0x5a, 0xf1, 0x5f, 0x28, 0x85, 0x81, 0x7f, + 0x9d, 0xb9, 0xca, 0x3c, 0x58, 0xe2, 0x5a, 0x68, + 0xfd, 0x8f, 0x97, 0xfd, 0x56, 0x15, 0xb6, 0x25, + 0xf9, 0xdb, 0x9e, 0xb9, 0xb1, 0x79, 0x35, 0xa3, + 0x77, 0x6c, 0xde, 0xad, 0xb6, 0x18, 0xdb, 0x5b, + 0x18, 0x84, 0x70, 0x30, 0x36, 0x9b, 0xcf, 0x29, + 0x28, 0x30, 0x30, 0xfa, 0x72, 0xde, 0xc7, 0xf8, + 0xd3, 0xff, 0x00, 0x1a, 0xe9, 0xdb, 0x4b, 0xdd, + 0xb6, 0x85, 0x6e, 0x51, 0x4a, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, + 0xa7, 0x9b, 0xfc, 0xd3, 0x63, 0xdf, 0x8f, 0xf7, + 0x95, 0xac, 0x72, 0xaa, 0xa6, 0x6f, 0xf3, 0x4d, + 0x8f, 0x7e, 0x3f, 0xde, 0x56, 0xb4, 0x12, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x0a, 0xa7, + 0xaa, 0xfe, 0xfa, 0xc7, 0xf7, 0x9b, 0xfd, 0xc0, + 0xad, 0x8a, 0xa7, 0xaa, 0xfe, 0xfa, 0xc7, 0xf7, + 0x9b, 0xfd, 0xc0, 0x82, 0xd7, 0xca, 0xa5, 0x47, + 0x2a, 0x94, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x45, 0x15, 0x41, 0x28, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0xa2, 0xaa, 0x57, 0xc1, 0xde, 0x83, + 0x45, 0xa9, 0x0b, 0xee, 0x6e, 0x2d, 0x31, 0xcc, + 0x34, 0x13, 0xbe, 0xaf, 0xa7, 0xc9, 0x01, 0x67, + 0xde, 0xdd, 0x0c, 0x7d, 0xac, 0x6c, 0x85, 0xb5, + 0x75, 0x43, 0x23, 0x67, 0xbc, 0xb5, 0xf3, 0x78, + 0xfa, 0xa6, 0x16, 0x9d, 0xd1, 0xc7, 0x51, 0xd0, + 0x56, 0x46, 0x49, 0xc1, 0xf9, 0x6b, 0x18, 0x4e, + 0xea, 0x97, 0x15, 0xce, 0xff, 0x00, 0x54, 0xf5, + 0xf2, 0xbd, 0xde, 0x58, 0x9f, 0xfa, 0xf8, 0x4c, + 0x7e, 0x58, 0xd2, 0x9d, 0x5c, 0xa3, 0x9c, 0xcd, + 0xcb, 0x68, 0xc9, 0x47, 0x0b, 0x43, 0xc8, 0x6b, + 0xdc, 0x07, 0x8b, 0x55, 0xe8, 0x16, 0xae, 0xa6, + 0x5c, 0xc9, 0x61, 0x3e, 0x2c, 0x2c, 0xad, 0x3b, + 0xa5, 0x7b, 0xdc, 0x65, 0xb1, 0xd6, 0x92, 0x75, + 0x57, 0x13, 0xb2, 0x37, 0xf3, 0x38, 0xd1, 0x6e, + 0x26, 0xef, 0xa4, 0xd3, 0xc9, 0x9e, 0x1e, 0x5f, + 0x2f, 0xf3, 0x63, 0x19, 0x7b, 0xd9, 0xc8, 0xbe, + 0x22, 0x96, 0x39, 0x63, 0x6c, 0x91, 0xb8, 0x39, + 0x8e, 0x15, 0x6b, 0x86, 0xe2, 0xbe, 0xd5, 0x60, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x05, 0x5d, 0xd7, 0x1a, 0x72, + 0x3c, 0xfe, 0x12, 0x58, 0x00, 0x1e, 0x51, 0x08, + 0x32, 0x40, 0xee, 0x67, 0x01, 0xb9, 0x58, 0x94, + 0x11, 0x50, 0x83, 0xf2, 0xeb, 0x98, 0xe6, 0x3d, + 0xd1, 0xbc, 0x70, 0xbd, 0x84, 0xb4, 0x83, 0xbe, + 0xa1, 0x42, 0xbb, 0xfb, 0x52, 0xd3, 0x2d, 0xc5, + 0x65, 0x86, 0x42, 0xdd, 0xbc, 0x36, 0xd7, 0x86, + 0xa6, 0x9b, 0x83, 0xb9, 0x55, 0x21, 0x01, 0x3f, + 0xc5, 0x11, 0x10, 0x11, 0x11, 0x01, 0x3f, 0xc5, + 0x11, 0x3b, 0xfb, 0xd0, 0x11, 0x2a, 0x88, 0x1d, + 0xcf, 0x7d, 0x11, 0x10, 0x13, 0xfc, 0x51, 0x13, + 0xbd, 0xbd, 0x01, 0x11, 0x10, 0x0f, 0x22, 0xdc, + 0x45, 0xfc, 0x96, 0x77, 0x96, 0x9c, 0x8d, 0xcb, + 0x6d, 0x1b, 0x9a, 0xd8, 0xe3, 0x04, 0xed, 0xe1, + 0xdc, 0xaa, 0x4b, 0xd1, 0x41, 0x42, 0x79, 0x69, + 0xb2, 0x95, 0x59, 0x98, 0xbc, 0x5b, 0x2f, 0xae, + 0xa3, 0x8e, 0xee, 0x76, 0xd8, 0xdb, 0x3f, 0xff, + 0x00, 0x7c, 0xa7, 0x84, 0x1f, 0x9b, 0x54, 0x18, + 0x91, 0x44, 0xf9, 0xe5, 0x6c, 0x31, 0xd3, 0x8d, + 0xe4, 0x34, 0x54, 0xf2, 0x95, 0xb5, 0xd4, 0x1a, + 0x78, 0xe0, 0xa0, 0xb4, 0x13, 0x4a, 0x24, 0xb9, + 0xba, 0x05, 0xee, 0x0d, 0xda, 0xd0, 0xde, 0x4a, + 0x2b, 0x6e, 0x63, 0xd9, 0xe4, 0x37, 0x18, 0xcb, + 0x77, 0x69, 0xe9, 0x98, 0xf3, 0x05, 0x5c, 0x5d, + 0x5f, 0xe6, 0x12, 0x37, 0xf1, 0x2d, 0x2e, 0xbe, + 0x82, 0xe6, 0xde, 0xdf, 0x0a, 0x2e, 0x58, 0x5a, + 0xf8, 0xe0, 0x2c, 0x96, 0xbc, 0x87, 0x6a, 0x0d, + 0xae, 0x99, 0xd4, 0xf7, 0x18, 0xed, 0x1a, 0x6e, + 0x23, 0x67, 0x5d, 0xe4, 0x12, 0x81, 0x3b, 0x3e, + 0x8c, 0xac, 0xbc, 0xae, 0x9c, 0xc3, 0x6b, 0x2c, + 0x77, 0xa5, 0xf0, 0x8e, 0x11, 0x5e, 0x52, 0xa4, + 0x0d, 0x80, 0xbb, 0x99, 0xca, 0xbf, 0xec, 0xf1, + 0xf6, 0xd7, 0x52, 0xdf, 0x61, 0xee, 0xbc, 0x6b, + 0x7b, 0xb8, 0x89, 0x23, 0x9e, 0x83, 0x91, 0x7c, + 0xdd, 0x6b, 0xb9, 0xec, 0x2e, 0x19, 0x67, 0x80, + 0x88, 0x59, 0xd8, 0xda, 0x49, 0xc0, 0xe6, 0x10, + 0x2a, 0xfd, 0xbb, 0x78, 0x90, 0x62, 0x58, 0xe9, + 0x2c, 0xbe, 0x46, 0x49, 0x71, 0xef, 0xba, 0x10, + 0x5e, 0xc0, 0xea, 0x1b, 0x59, 0xde, 0x5b, 0x51, + 0xf2, 0x9b, 0xbf, 0x62, 0xdd, 0xd9, 0x41, 0x8d, + 0xd0, 0xd6, 0x97, 0x37, 0x73, 0x5d, 0x32, 0xe7, + 0x2b, 0x72, 0xc3, 0x14, 0x70, 0xc4, 0x78, 0x83, + 0x68, 0x3f, 0xd5, 0x79, 0xea, 0xad, 0x75, 0x69, + 0x74, 0xc6, 0x33, 0x1d, 0x10, 0xf2, 0xc2, 0xc1, + 0xd6, 0x5d, 0x0d, 0x84, 0x13, 0xbc, 0x0a, 0x6f, + 0x54, 0x49, 0x1e, 0xe7, 0xbc, 0xcb, 0x2b, 0x8b, + 0x9c, 0x77, 0x97, 0x12, 0x76, 0xfb, 0xa8, 0x24, + 0xb8, 0x97, 0x12, 0xef, 0x8c, 0xe2, 0x49, 0xf7, + 0x57, 0xdd, 0xbd, 0xad, 0xcd, 0xd0, 0x91, 0xd6, + 0xf1, 0x97, 0xb2, 0x16, 0xf1, 0x4a, 0xfe, 0x46, + 0x8e, 0xe9, 0x5b, 0x2c, 0x6e, 0x92, 0xd4, 0x59, + 0x48, 0x7a, 0xfb, 0x4b, 0x67, 0x18, 0x7f, 0x65, + 0xee, 0x04, 0x57, 0xbc, 0xae, 0x7a, 0x46, 0xee, + 0xd6, 0x58, 0xee, 0x74, 0x8e, 0x52, 0xd1, 0xb6, + 0x37, 0x2e, 0x61, 0x68, 0x3f, 0xb5, 0x25, 0x7f, + 0x6a, 0xa5, 0x05, 0x5b, 0x45, 0xe6, 0xb1, 0x98, + 0xec, 0x8b, 0x19, 0x90, 0xb6, 0x6c, 0x8c, 0xb8, + 0x3c, 0x1e, 0x52, 0xed, 0xf1, 0xd7, 0x96, 0x87, + 0x62, 0xda, 0xd9, 0x5d, 0x5d, 0x68, 0xbd, 0x4d, + 0x25, 0x9d, 0xc4, 0x8e, 0x7e, 0x2e, 0xff, 0x00, + 0x6c, 0x73, 0x56, 0xad, 0xe1, 0x7f, 0xc5, 0x23, + 0xbc, 0xaa, 0xba, 0x83, 0x0d, 0x71, 0x85, 0xc9, + 0xcd, 0x8f, 0xb8, 0x07, 0xc4, 0x3c, 0x51, 0xbb, + 0x90, 0xb6, 0xbb, 0xc2, 0xb3, 0x62, 0xa7, 0x8f, + 0x56, 0xe9, 0xc9, 0x70, 0x97, 0x66, 0xb9, 0x2c, + 0x7b, 0x4c, 0xb6, 0x52, 0xf2, 0x96, 0x0d, 0xbc, + 0x28, 0x2c, 0x57, 0x59, 0xdb, 0x01, 0x73, 0xe8, + 0x0d, 0x52, 0xc6, 0xba, 0xda, 0x71, 0x5b, 0x2b, + 0xfd, 0x9c, 0x2e, 0x69, 0xda, 0xd2, 0x5d, 0xb2, + 0x94, 0x5a, 0xdd, 0x7f, 0x1b, 0xf0, 0x97, 0x78, + 0x6c, 0xe6, 0x2d, 0xe5, 0xcc, 0x8d, 0xa2, 0x1e, + 0xb0, 0x1a, 0xf1, 0x34, 0x7c, 0x4a, 0x9e, 0x5a, + 0x85, 0xab, 0xc3, 0x3e, 0xdb, 0x52, 0x69, 0xdb, + 0x9c, 0x66, 0x66, 0x61, 0x6f, 0x3e, 0x2b, 0x6c, + 0x37, 0x4e, 0xdf, 0x41, 0xfb, 0x3b, 0x7b, 0xca, + 0xb3, 0x71, 0x97, 0xbd, 0xf2, 0x27, 0xe2, 0x0d, + 0xc7, 0x94, 0x58, 0xb6, 0x40, 0xe8, 0xcb, 0xb6, + 0xee, 0xae, 0xd6, 0x95, 0x15, 0x6e, 0xd7, 0x5a, + 0x93, 0x4f, 0xde, 0xf9, 0x24, 0xf6, 0xf1, 0xf1, + 0xe6, 0x1a, 0xd6, 0xbc, 0xca, 0xc3, 0xe2, 0xb0, + 0xf3, 0x1e, 0xea, 0xa3, 0x5e, 0x5f, 0x5d, 0x5f, + 0x5c, 0x3e, 0xe6, 0xf2, 0x53, 0x2c, 0xaf, 0x35, + 0x25, 0xdf, 0xe4, 0xbc, 0x09, 0xdb, 0x53, 0xb4, + 0x9e, 0x55, 0xf2, 0x4a, 0x0f, 0xa2, 0x57, 0xc9, + 0x28, 0x4a, 0xf9, 0x25, 0x5b, 0x02, 0xbe, 0x6a, + 0x39, 0x50, 0x9a, 0x2b, 0x4e, 0x8a, 0xd0, 0xb7, + 0xba, 0x8a, 0xe5, 0xb3, 0xcc, 0x0c, 0x38, 0xe6, + 0x9a, 0xbe, 0x42, 0x36, 0xba, 0x9c, 0x8d, 0x50, + 0x6a, 0x70, 0x3a, 0x77, 0x27, 0x9f, 0xba, 0x6d, + 0xb5, 0x8c, 0x45, 0xcd, 0xad, 0x25, 0x9a, 0x9e, + 0x2b, 0x07, 0x74, 0xae, 0xd7, 0xa4, 0xf4, 0x3e, + 0x33, 0x4e, 0xc2, 0x1c, 0xd1, 0xd7, 0xde, 0x11, + 0xe3, 0xce, 0xe0, 0x2b, 0x5e, 0xe0, 0x5b, 0x9c, + 0x56, 0x22, 0xc3, 0x13, 0x6a, 0xcb, 0x5b, 0x28, + 0x9b, 0x1c, 0x6c, 0x14, 0xa8, 0x1b, 0x4f, 0x74, + 0x95, 0x9a, 0x82, 0x14, 0xa2, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0xd3, 0xea, 0xaf, 0xb9, 0x2e, 0x3e, 0x6a, 0xa2, + 0x66, 0xe7, 0x86, 0x5c, 0x66, 0x39, 0xb1, 0xb8, + 0x39, 0xcc, 0x8d, 0xc1, 0xcd, 0x07, 0x71, 0xda, + 0xaf, 0x7a, 0xab, 0xee, 0x5b, 0x8f, 0x9a, 0xb9, + 0xf6, 0x4f, 0x1b, 0x15, 0xa5, 0x8d, 0x9c, 0xec, + 0x71, 0x2e, 0xb8, 0x61, 0x73, 0x81, 0xe4, 0xa7, + 0x32, 0xce, 0x53, 0x96, 0xcf, 0x2c, 0x44, 0xfb, + 0x5e, 0x8f, 0x4f, 0x87, 0xa5, 0xca, 0x32, 0x9f, + 0x51, 0xa9, 0x96, 0x15, 0xba, 0x31, 0xc6, 0x65, + 0x5c, 0x7c, 0x52, 0x1d, 0x4f, 0x0c, 0xc1, 0xbf, + 0xc3, 0x6b, 0x5b, 0x57, 0xf2, 0x6e, 0x5b, 0x3b, + 0xfa, 0x3e, 0xc2, 0x56, 0x8d, 0xae, 0x31, 0x38, + 0x00, 0x39, 0xea, 0x56, 0x0b, 0xaf, 0x1e, 0x33, + 0x91, 0x58, 0x00, 0x3a, 0xb7, 0x80, 0x4b, 0xb9, + 0x76, 0x8a, 0xac, 0xcb, 0xb1, 0xd4, 0xda, 0xbe, + 0x56, 0x9a, 0x96, 0xc6, 0xe7, 0x0e, 0xf8, 0x59, + 0xbd, 0x6e, 0x50, 0xf4, 0x7d, 0x9f, 0xdb, 0x7f, + 0xbf, 0xa9, 0xff, 0x00, 0x1f, 0xe2, 0xd4, 0xe9, + 0x58, 0x64, 0x86, 0x56, 0xba, 0x56, 0x96, 0x00, + 0xfa, 0xd4, 0xab, 0x04, 0x6f, 0x6f, 0x55, 0x10, + 0x27, 0x68, 0x71, 0xdf, 0xf3, 0x8a, 0xd2, 0xe0, + 0x6f, 0xe4, 0xc8, 0x48, 0x1b, 0x20, 0x0d, 0x05, + 0xd4, 0xd8, 0xb6, 0xed, 0x81, 0xaf, 0x89, 0x8e, + 0x24, 0xd5, 0xc6, 0x87, 0xa6, 0x89, 0x7a, 0xbc, + 0xa0, 0x8d, 0x1f, 0xdb, 0x6e, 0x23, 0xef, 0xea, + 0x6d, 0xdf, 0xfd, 0x39, 0x58, 0xf3, 0x52, 0x47, + 0x26, 0x5a, 0xd9, 0xf1, 0x9e, 0x26, 0x98, 0x5b, + 0xb4, 0x77, 0x94, 0x15, 0xf1, 0x93, 0xb6, 0x65, + 0xa6, 0x4a, 0xda, 0x06, 0x12, 0x40, 0x88, 0x1a, + 0x9e, 0xe8, 0x5f, 0x44, 0x6d, 0x2b, 0xa3, 0xc1, + 0x97, 0x97, 0xcd, 0x3e, 0x59, 0xbc, 0x6f, 0x64, + 0xf4, 0x42, 0xc6, 0xc8, 0xff, 0x00, 0xd5, 0x3d, + 0xf0, 0xb2, 0x80, 0x2b, 0x17, 0x25, 0x51, 0x6a, + 0x7b, 0xe1, 0x54, 0x7d, 0xe7, 0x9f, 0x2b, 0x66, + 0xc7, 0xf5, 0x4e, 0xe1, 0x7b, 0xa2, 0x6b, 0x6b, + 0xcd, 0x55, 0x92, 0x34, 0x45, 0xfc, 0xb4, 0x99, + 0xd2, 0xf1, 0x17, 0x0a, 0xd4, 0x9e, 0x75, 0x39, + 0xeb, 0x13, 0xe4, 0xf8, 0xbb, 0xea, 0xd4, 0x10, + 0xd6, 0x51, 0x5d, 0x21, 0x6b, 0xba, 0x88, 0xfe, + 0x68, 0xf8, 0x14, 0x15, 0x46, 0x69, 0x8c, 0xdb, + 0x07, 0x0b, 0x2e, 0x03, 0x47, 0x30, 0x53, 0xea, + 0xd6, 0x73, 0xce, 0x55, 0xb3, 0x85, 0xc9, 0xc2, + 0xe5, 0x45, 0x4b, 0xd5, 0xac, 0xef, 0x9c, 0xa9, + 0xf5, 0x6b, 0x3b, 0xe7, 0x2a, 0xd6, 0x6a, 0x39, + 0x54, 0xb4, 0xed, 0xde, 0x83, 0x9c, 0xdd, 0xc1, + 0x7c, 0xdb, 0xe7, 0x58, 0x5c, 0x4c, 0x4f, 0x00, + 0xa9, 0xa1, 0x5e, 0xd0, 0xd9, 0x41, 0x08, 0x1c, + 0x2d, 0xab, 0xb9, 0xca, 0xf5, 0xcb, 0x57, 0xd6, + 0x49, 0x7e, 0x68, 0xaa, 0xfa, 0x49, 0x0d, 0x94, + 0xd9, 0xb9, 0x62, 0xe4, 0xbf, 0xea, 0x3b, 0xbe, + 0x16, 0x55, 0x76, 0x2c, 0x6c, 0x97, 0xfd, 0x47, + 0x77, 0xd0, 0x5d, 0x30, 0xbf, 0x74, 0xdb, 0x7c, + 0xc0, 0xb3, 0x86, 0xf0, 0xb0, 0x70, 0xbf, 0x74, + 0xdb, 0x7c, 0xc0, 0xb3, 0x86, 0xf0, 0x90, 0x28, + 0xf9, 0xaf, 0xcc, 0x92, 0x77, 0x94, 0x26, 0x6b, + 0xf3, 0x1c, 0x9d, 0xe5, 0x08, 0x25, 0x63, 0x64, + 0xbf, 0xea, 0x3f, 0xdc, 0x5e, 0xef, 0x91, 0x8c, + 0x6f, 0x13, 0xcf, 0x08, 0xee, 0xac, 0x61, 0x15, + 0xde, 0x5e, 0x4f, 0x25, 0xb2, 0x61, 0x2c, 0x26, + 0x8e, 0x7d, 0x36, 0x20, 0xbd, 0xe0, 0x3e, 0xe7, + 0xb6, 0xf9, 0x81, 0x6c, 0x16, 0x25, 0x94, 0x4d, + 0xc7, 0x63, 0xa2, 0x8a, 0x67, 0x81, 0xd5, 0x36, + 0x8e, 0x71, 0x5a, 0x3c, 0x86, 0x76, 0xf3, 0x21, + 0x2f, 0x91, 0xe2, 0x1a, 0xe2, 0xd3, 0xb1, 0xd3, + 0x72, 0x28, 0x33, 0x72, 0xba, 0x92, 0x1b, 0x47, + 0xf9, 0x3d, 0xa8, 0xeb, 0xee, 0x4e, 0xc0, 0xd1, + 0xb7, 0x6a, 0xc4, 0xb1, 0xc0, 0x5c, 0xdf, 0xcc, + 0x2f, 0xf2, 0xae, 0x24, 0x93, 0xc4, 0xd8, 0xb9, + 0x02, 0xcf, 0xc3, 0x69, 0xdb, 0x7b, 0x11, 0xd7, + 0x4b, 0xfc, 0x6b, 0x97, 0x6d, 0x73, 0xdd, 0xb6, + 0x84, 0xad, 0xc5, 0x10, 0x7c, 0xc5, 0x14, 0x71, + 0x30, 0x32, 0x36, 0x86, 0xb4, 0x6e, 0x01, 0x7d, + 0xa2, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x0a, 0x9e, + 0x6f, 0xf3, 0x4d, 0x87, 0x7e, 0x3f, 0xde, 0x56, + 0xb1, 0xca, 0xaa, 0x99, 0xbf, 0xcd, 0x36, 0x3d, + 0xf8, 0xff, 0x00, 0x79, 0x5a, 0xd0, 0x4a, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x2a, 0x96, + 0xab, 0xfb, 0xeb, 0x1d, 0xde, 0x6f, 0xf7, 0x02, + 0xb6, 0xaa, 0x9e, 0xab, 0xfb, 0xeb, 0x1f, 0xde, + 0x6f, 0xf7, 0x02, 0x0b, 0x5f, 0x2a, 0x95, 0x1c, + 0xaa, 0x50, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x41, 0x20, 0x0a, + 0x93, 0x41, 0xce, 0x50, 0x10, 0x45, 0x46, 0xd0, + 0x80, 0xa0, 0x9a, 0x0e, 0xf2, 0x95, 0xab, 0x92, + 0xee, 0x78, 0x73, 0x0d, 0x82, 0x43, 0x58, 0x27, + 0x6f, 0x88, 0x39, 0x9c, 0x14, 0x99, 0xaa, 0x6b, + 0x0c, 0x32, 0xce, 0xe3, 0x1d, 0xf1, 0x13, 0x97, + 0xb9, 0x99, 0x6f, 0x7d, 0x05, 0xc3, 0xe4, 0x64, + 0x6e, 0xab, 0xa2, 0x34, 0x70, 0xe5, 0x0b, 0x4d, + 0x93, 0xca, 0xdc, 0xe3, 0xb3, 0x96, 0xec, 0x94, + 0xff, 0x00, 0xc2, 0xb9, 0x1c, 0x15, 0xe6, 0x72, + 0xf8, 0x9a, 0xb8, 0xcd, 0x49, 0x1b, 0x98, 0x7f, + 0x85, 0x7c, 0x28, 0xf1, 0xfe, 0xe0, 0xbd, 0x35, + 0x8d, 0xa8, 0x9f, 0x0f, 0x24, 0xc0, 0x7f, 0x12, + 0xdc, 0xf5, 0x8c, 0x3d, 0xe5, 0x8c, 0xb2, 0x9f, + 0x2e, 0x53, 0x1b, 0x3c, 0xb2, 0xf6, 0x68, 0xe9, + 0x69, 0x63, 0xaf, 0xa5, 0x19, 0x7e, 0x6d, 0x2f, + 0x51, 0x8d, 0x5c, 0xef, 0xc6, 0x67, 0x67, 0x84, + 0xb7, 0xed, 0x35, 0xa1, 0xad, 0x45, 0x17, 0xd2, + 0xd6, 0xe9, 0xfb, 0xb3, 0x79, 0x8a, 0xb7, 0x9c, + 0xed, 0x71, 0x6d, 0x1c, 0x7b, 0xa3, 0x62, 0xd9, + 0x2e, 0x91, 0x37, 0x16, 0xf1, 0xea, 0x61, 0x3a, + 0x79, 0xe5, 0x86, 0x5b, 0xf0, 0xca, 0x71, 0x9e, + 0xe1, 0x11, 0x11, 0x91, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x17, 0xc9, 0x01, 0x7d, 0x2f, + 0x94, 0x1a, 0x1b, 0xbf, 0xe0, 0xea, 0x6b, 0x69, + 0x0e, 0xc1, 0x33, 0x4b, 0x07, 0x42, 0xf6, 0xc9, + 0x0e, 0x0c, 0xad, 0x94, 0xee, 0xf8, 0xa0, 0x90, + 0x4f, 0x7d, 0x7c, 0xea, 0x4b, 0x29, 0xe4, 0x8a, + 0x1b, 0xbb, 0x61, 0x59, 0xed, 0x5c, 0x1e, 0x07, + 0x38, 0xe5, 0x59, 0x53, 0xc0, 0xec, 0x8e, 0x3e, + 0x3a, 0x83, 0x1c, 0x9b, 0x1e, 0x39, 0xc1, 0x0b, + 0x9d, 0x4f, 0xe6, 0x8f, 0xf3, 0x3d, 0xbe, 0x7c, + 0x67, 0x1d, 0x0d, 0x4b, 0xff, 0x00, 0x04, 0xe8, + 0xe7, 0xd3, 0x7d, 0x4f, 0xb9, 0xe6, 0x2b, 0x1e, + 0x71, 0xe4, 0xee, 0x99, 0x80, 0x03, 0xde, 0x54, + 0x6d, 0x6c, 0xc1, 0x26, 0x7a, 0x6a, 0xfe, 0xcc, + 0x60, 0x80, 0x3b, 0xcb, 0xa3, 0xb6, 0xd9, 0xa7, + 0xab, 0x7c, 0x83, 0x8a, 0x58, 0xc6, 0xc7, 0x2e, + 0x75, 0xac, 0xfe, 0xfe, 0x9f, 0x9f, 0xab, 0x1f, + 0x02, 0xdc, 0x43, 0xcd, 0xa9, 0x94, 0x65, 0x38, + 0xff, 0x00, 0x2e, 0x31, 0x8f, 0xb9, 0x7a, 0xd3, + 0xbf, 0x72, 0xda, 0x7f, 0x4c, 0x2d, 0x9a, 0xd6, + 0x69, 0xdf, 0xb9, 0x6d, 0x3f, 0xa6, 0x16, 0xcd, + 0x57, 0x31, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x06, + 0x8f, 0x57, 0xe0, 0x21, 0xcf, 0x61, 0x66, 0xb5, + 0x70, 0xfe, 0x23, 0x41, 0x74, 0x4e, 0xe6, 0x70, + 0x5f, 0x9e, 0xe7, 0x86, 0x4b, 0x7b, 0x89, 0x2d, + 0xe5, 0x14, 0x92, 0x17, 0x16, 0x38, 0x77, 0x5b, + 0xb1, 0x7e, 0x9f, 0xee, 0xae, 0x33, 0xed, 0x5f, + 0x4c, 0x8c, 0x76, 0x44, 0x65, 0xad, 0x9b, 0x48, + 0x2f, 0x09, 0xeb, 0x40, 0x1b, 0x04, 0x9f, 0xea, + 0x82, 0x84, 0x4a, 0x26, 0xde, 0x5f, 0x71, 0x10, + 0x11, 0x3b, 0xe8, 0x80, 0x88, 0x9d, 0xed, 0xc8, + 0x14, 0x44, 0x44, 0x0f, 0x83, 0x99, 0x13, 0x97, + 0xba, 0x88, 0x15, 0x44, 0x44, 0x04, 0xaa, 0x2d, + 0xe6, 0x8c, 0xc3, 0xe3, 0xf3, 0x39, 0xc8, 0xed, + 0x32, 0x12, 0x18, 0xed, 0xc0, 0x2f, 0x75, 0x3f, + 0x6a, 0x9c, 0x88, 0x3c, 0x74, 0xfe, 0x98, 0xca, + 0xea, 0x0b, 0x96, 0xc3, 0x67, 0x0b, 0xba, 0xaa, + 0xf8, 0xf3, 0x91, 0xe2, 0xb4, 0x2b, 0xec, 0x90, + 0x69, 0x3d, 0x2f, 0x0f, 0xa2, 0x1f, 0x11, 0xc9, + 0xe4, 0xa5, 0x01, 0x93, 0x50, 0x56, 0x84, 0xf2, + 0x2f, 0x8b, 0x6f, 0x68, 0xf8, 0xec, 0x66, 0x62, + 0x1c, 0x4e, 0x2e, 0xd1, 0x90, 0xe2, 0x22, 0x7f, + 0x55, 0x24, 0xbb, 0x9c, 0x69, 0xb2, 0xab, 0xeb, + 0xda, 0x46, 0x00, 0x47, 0x24, 0x7a, 0x8e, 0xc0, + 0x93, 0x1c, 0xa0, 0x09, 0x8b, 0x77, 0xf7, 0x1c, + 0x83, 0xca, 0xdb, 0x47, 0xe3, 0x71, 0x76, 0xb2, + 0xe7, 0x73, 0x8d, 0x73, 0x2c, 0xa3, 0x3c, 0x70, + 0xda, 0x6d, 0xae, 0xdd, 0xa0, 0x15, 0xae, 0xc9, + 0xea, 0x59, 0xb5, 0x14, 0x52, 0xe3, 0xed, 0xb1, + 0xd1, 0x0b, 0x78, 0x98, 0x5f, 0x10, 0x61, 0x21, + 0xcd, 0x63, 0x45, 0x78, 0xaa, 0x39, 0x95, 0x83, + 0x43, 0xe6, 0x22, 0xcf, 0x62, 0xe6, 0xd3, 0xb9, + 0x67, 0x75, 0xb2, 0x39, 0xa4, 0xb1, 0xee, 0xda, + 0x4b, 0x4f, 0x81, 0x62, 0x64, 0xaf, 0xb1, 0x7a, + 0x18, 0xbb, 0x15, 0x8e, 0xb7, 0x33, 0xde, 0xca, + 0xdf, 0xe2, 0xdc, 0x4a, 0x36, 0x16, 0x1e, 0x41, + 0xbf, 0x91, 0x54, 0x55, 0x30, 0xda, 0x87, 0x2b, + 0x88, 0x95, 0xaf, 0xb2, 0xb8, 0x73, 0x59, 0x50, + 0x0c, 0x6e, 0x3c, 0x43, 0xa0, 0xae, 0x97, 0x99, + 0xd5, 0x38, 0x48, 0xee, 0xa0, 0xc5, 0xe7, 0x60, + 0x0e, 0x65, 0xc4, 0x0d, 0x93, 0xae, 0x22, 0xa2, + 0xae, 0xdf, 0xb5, 0x73, 0x5b, 0x4c, 0x4c, 0xf9, + 0x48, 0xaf, 0xb2, 0x36, 0xcc, 0x2c, 0x8e, 0xd8, + 0x87, 0xf0, 0x37, 0x68, 0x2e, 0x71, 0xdc, 0x09, + 0x5b, 0xaf, 0x68, 0x12, 0xe2, 0xa5, 0x92, 0xcb, + 0xab, 0xb8, 0x2f, 0xbf, 0x86, 0x06, 0x47, 0x2c, + 0x4d, 0x00, 0xb4, 0x6c, 0xae, 0xd3, 0xcf, 0xb5, + 0x06, 0xf6, 0xe7, 0x05, 0xa5, 0xf4, 0xd5, 0xec, + 0x1a, 0x8e, 0xde, 0xec, 0xc1, 0x05, 0x0b, 0x9b, + 0x6c, 0x28, 0x7a, 0xc0, 0x77, 0x06, 0xd5, 0x50, + 0x73, 0x99, 0x0b, 0x6c, 0x8e, 0x4a, 0x5b, 0xab, + 0x68, 0x05, 0xbc, 0x6f, 0x3b, 0x18, 0x39, 0x7b, + 0xa5, 0x63, 0x5d, 0x5e, 0xdd, 0x5e, 0x38, 0x3a, + 0xe6, 0x57, 0x49, 0xd5, 0x8e, 0x16, 0x34, 0xec, + 0x00, 0x0e, 0x40, 0x06, 0xc5, 0x91, 0x84, 0xc3, + 0x5e, 0xe7, 0x2f, 0x05, 0x9d, 0x9d, 0x2a, 0x05, + 0x5e, 0xf3, 0xfb, 0x2d, 0x41, 0x89, 0x04, 0x32, + 0xdc, 0x4c, 0xd8, 0x2d, 0xd8, 0x65, 0x96, 0x43, + 0xb1, 0x8d, 0xda, 0x49, 0x57, 0x5d, 0x0f, 0xa5, + 0xb1, 0x73, 0xe4, 0x5d, 0x1e, 0x61, 0xdf, 0xf3, + 0xa1, 0xf1, 0x99, 0x62, 0xed, 0x87, 0x67, 0x29, + 0x5b, 0xfc, 0x56, 0x02, 0xc7, 0x0d, 0x85, 0xba, + 0xb9, 0xc2, 0x3a, 0x3b, 0xec, 0xb5, 0xbb, 0x48, + 0x74, 0x86, 0x8e, 0xe1, 0x70, 0xdf, 0x41, 0xb5, + 0x73, 0xf9, 0x75, 0x8e, 0x6e, 0x4b, 0xdb, 0x7b, + 0xdb, 0x9e, 0x1f, 0x2d, 0xb4, 0x90, 0x9e, 0xb4, + 0x00, 0xd7, 0x16, 0xfe, 0xd3, 0x1d, 0xc2, 0x36, + 0xa0, 0xb0, 0xe6, 0x75, 0x86, 0xa6, 0xc7, 0x6a, + 0x9f, 0x21, 0x63, 0x7a, 0x8b, 0x78, 0xa4, 0x0c, + 0x86, 0xd5, 0x8d, 0x14, 0x73, 0x39, 0xc6, 0xe5, + 0xf7, 0xed, 0x42, 0xea, 0x4b, 0x4c, 0xc6, 0x3b, + 0x23, 0x6a, 0xd3, 0x1d, 0xdc, 0x0c, 0x12, 0x3d, + 0xe0, 0x6c, 0xae, 0xc3, 0xc2, 0x4a, 0xb4, 0xcf, + 0x7b, 0x8f, 0xca, 0xe1, 0x1b, 0xaa, 0xb1, 0xf6, + 0x8c, 0xbb, 0xc8, 0x43, 0x11, 0x11, 0xb5, 0xdb, + 0x4b, 0x5c, 0x37, 0x82, 0x3b, 0x8a, 0xbf, 0x85, + 0xf6, 0x8f, 0x8a, 0xca, 0x31, 0xd6, 0x7a, 0x92, + 0xd5, 0x8c, 0x7b, 0xea, 0xd3, 0x2d, 0x01, 0x1d, + 0xd0, 0x49, 0xdc, 0xa2, 0xb2, 0xaf, 0x6c, 0xac, + 0xbd, 0xa1, 0x60, 0x60, 0xbb, 0xb4, 0x91, 0x8c, + 0xca, 0xdb, 0x8a, 0x3c, 0x6e, 0xa9, 0xe5, 0x6b, + 0xbb, 0xeb, 0x57, 0x8a, 0xc3, 0xc5, 0xa1, 0xe1, + 0xb8, 0xcb, 0x66, 0x27, 0x63, 0xaf, 0xdf, 0x1b, + 0xa3, 0xb6, 0xb6, 0x61, 0xa9, 0xf1, 0x82, 0xd6, + 0xea, 0x79, 0x34, 0xb6, 0x2a, 0xaf, 0xd3, 0x53, + 0xc8, 0xcb, 0xa9, 0x5c, 0x09, 0xea, 0x9c, 0x4b, + 0x03, 0x76, 0xf1, 0x72, 0xaa, 0x8d, 0xcd, 0xd5, + 0xcd, 0xd3, 0xfa, 0xcb, 0x99, 0x5f, 0x33, 0xc6, + 0xe2, 0xf2, 0x4d, 0x3b, 0xc8, 0x12, 0x4f, 0x2c, + 0x8e, 0x95, 0xc5, 0xc5, 0xa2, 0x77, 0x17, 0xc8, + 0xd0, 0x76, 0x12, 0x57, 0x96, 0xed, 0x81, 0x45, + 0x50, 0x95, 0x44, 0x1e, 0x75, 0x04, 0xa1, 0x2b, + 0xe4, 0x95, 0x04, 0x97, 0x72, 0x28, 0x6f, 0x13, + 0x9c, 0x18, 0xc0, 0x5c, 0xe7, 0x1a, 0x34, 0x0d, + 0xa6, 0xab, 0x23, 0x1f, 0x8e, 0xbd, 0xc9, 0xdc, + 0xb6, 0xd2, 0xc6, 0x23, 0x2c, 0xcf, 0xd9, 0x41, + 0xb8, 0x57, 0x94, 0xae, 0xc3, 0xa2, 0xbd, 0x9b, + 0xd9, 0x61, 0xdb, 0x1d, 0xee, 0x49, 0xad, 0xb8, + 0xbf, 0xde, 0x39, 0x5a, 0xcf, 0x73, 0x95, 0x05, + 0x77, 0x44, 0x7b, 0x2f, 0x92, 0xe4, 0xb3, 0x23, + 0x9c, 0x6f, 0x0c, 0x26, 0x8e, 0x8a, 0xdb, 0x94, + 0xfc, 0xe5, 0xd5, 0xe0, 0xb7, 0x82, 0xde, 0x26, + 0xc5, 0x03, 0x1b, 0x1c, 0x6d, 0x14, 0x0d, 0x68, + 0xa0, 0x5e, 0x80, 0x00, 0x29, 0x4a, 0x01, 0xc8, + 0xa5, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x14, 0x25, 0x42, 0x09, + 0x44, 0x44, 0x1a, 0x7d, 0x57, 0xf7, 0x25, 0xc7, + 0xcd, 0x54, 0x7c, 0xf9, 0xff, 0x00, 0xea, 0xb1, + 0x95, 0xec, 0xdd, 0xfe, 0x6a, 0xf3, 0xaa, 0xb6, + 0xe1, 0x2e, 0x3e, 0x6a, 0xd6, 0xe3, 0x31, 0x16, + 0x39, 0x1c, 0x35, 0xa1, 0xba, 0x6f, 0x11, 0x63, + 0x48, 0x69, 0xee, 0x14, 0x1c, 0xa1, 0xe6, 0xba, + 0xb2, 0x0e, 0xf3, 0x7e, 0x05, 0xb6, 0xc8, 0xd0, + 0x63, 0xe6, 0xfe, 0x93, 0xfe, 0x12, 0xba, 0x19, + 0xd1, 0x78, 0x03, 0x74, 0xdb, 0xce, 0xab, 0xf8, + 0xec, 0xd8, 0x0f, 0x79, 0x7a, 0xc9, 0xa5, 0x70, + 0xd2, 0xc4, 0xe8, 0x9f, 0x1f, 0x8a, 0x41, 0x69, + 0x1d, 0xc3, 0xbd, 0x51, 0xc7, 0x34, 0x81, 0xfe, + 0x33, 0x7e, 0x7a, 0xb2, 0x44, 0xea, 0xc3, 0x17, + 0xce, 0xff, 0x00, 0xf9, 0x15, 0x78, 0xb6, 0xd1, + 0x7a, 0x73, 0x1e, 0xd3, 0x24, 0x51, 0x70, 0xb5, + 0x9e, 0x31, 0x25, 0x6a, 0xb2, 0x77, 0x5a, 0x6a, + 0xc9, 0xbd, 0x4d, 0xb4, 0x7d, 0x6b, 0xdb, 0xb8, + 0xf3, 0x1a, 0xd5, 0x41, 0xf1, 0x9e, 0xd9, 0x98, + 0xb7, 0x27, 0x60, 0x10, 0xb7, 0x69, 0xef, 0x2c, + 0x49, 0xf2, 0x10, 0xc6, 0x68, 0xdf, 0x1d, 0xfc, + 0xc3, 0x6a, 0xf8, 0x2e, 0x93, 0x31, 0x70, 0x2e, + 0x2e, 0x66, 0x10, 0xb4, 0x00, 0xd0, 0x3b, 0x81, + 0x6d, 0x2d, 0x2c, 0xf0, 0x56, 0xa4, 0x38, 0xc8, + 0x24, 0x78, 0xfd, 0xa2, 0x83, 0x57, 0x1c, 0x39, + 0x6b, 0xc1, 0xc7, 0x13, 0x0b, 0x19, 0xc8, 0xa6, + 0x4c, 0x3e, 0x66, 0x46, 0xf0, 0xb8, 0x54, 0x15, + 0x64, 0x19, 0x1c, 0x7b, 0x40, 0x0d, 0x94, 0x34, + 0x0e, 0x40, 0x9e, 0x94, 0xb1, 0xed, 0x87, 0xbc, + 0xa8, 0xd1, 0x4f, 0x65, 0x9f, 0xb8, 0x82, 0x2b, + 0x79, 0x68, 0x63, 0x84, 0xd6, 0x3e, 0xfa, 0xf7, + 0x0e, 0xd5, 0x2d, 0x01, 0xa1, 0xfb, 0x00, 0xa0, + 0x5b, 0x63, 0x95, 0xb0, 0x6b, 0x4b, 0xba, 0xd1, + 0x41, 0xbf, 0x72, 0xd4, 0x5e, 0x6a, 0x69, 0x1e, + 0x7a, 0xbb, 0x16, 0x13, 0xc9, 0xc4, 0xa0, 0x89, + 0x6e, 0xb5, 0x24, 0x0d, 0xe2, 0x96, 0x50, 0xd6, + 0x8e, 0x72, 0xb0, 0x3d, 0x63, 0xcc, 0xf1, 0x16, + 0xb6, 0x4e, 0x22, 0x39, 0x97, 0xd3, 0xa2, 0xbd, + 0xbb, 0x3c, 0x57, 0x72, 0x9a, 0x7c, 0x90, 0xbd, + 0x9b, 0x6b, 0x0c, 0x4c, 0x3c, 0x2d, 0xdb, 0x43, + 0xb5, 0x51, 0xbf, 0xd2, 0x17, 0xf7, 0x77, 0xd6, + 0xd3, 0x3e, 0xe9, 0xdc, 0x4e, 0x61, 0xd8, 0xb7, + 0xe3, 0x7a, 0xac, 0xe8, 0x8f, 0xe4, 0x5d, 0x7c, + 0xe5, 0x67, 0x1b, 0xc2, 0x0a, 0x26, 0x5b, 0xf3, + 0x2c, 0xbd, 0xe0, 0xbe, 0x97, 0xce, 0x5b, 0xf3, + 0x24, 0xbd, 0xe0, 0xbe, 0x92, 0x44, 0x2c, 0x7c, + 0x97, 0xfd, 0x47, 0x77, 0xd6, 0x42, 0xc7, 0xc9, + 0x0a, 0xda, 0xbb, 0xbe, 0x82, 0xe9, 0x85, 0xfb, + 0xa6, 0xdb, 0xe6, 0x05, 0x9c, 0x39, 0x15, 0x57, + 0x1d, 0xac, 0x2c, 0xad, 0xac, 0x62, 0x81, 0xf1, + 0x38, 0xba, 0x36, 0x80, 0x56, 0x40, 0xd6, 0xd8, + 0xfe, 0xc9, 0xc2, 0x9d, 0xc4, 0x1a, 0x8c, 0xcd, + 0x7d, 0x63, 0x90, 0x77, 0x16, 0x3d, 0xcd, 0xdc, + 0x56, 0xe2, 0x84, 0xf1, 0x3c, 0xee, 0x68, 0x5e, + 0x77, 0xf7, 0x73, 0x64, 0xf3, 0x0e, 0x9a, 0xc6, + 0x33, 0xc7, 0x25, 0x03, 0x76, 0x2b, 0x2e, 0x13, + 0x48, 0x45, 0x1b, 0x5b, 0x75, 0x92, 0xfe, 0x25, + 0xc6, 0xf0, 0x0e, 0xe0, 0xa0, 0xd3, 0xe2, 0x74, + 0xfd, 0xee, 0x66, 0x41, 0x3d, 0xd5, 0x62, 0xb5, + 0x1b, 0x9b, 0xce, 0x15, 0xb2, 0x59, 0x71, 0x7a, + 0x7e, 0xca, 0xb4, 0x6b, 0x03, 0x46, 0xc6, 0x8f, + 0x8c, 0x56, 0x2e, 0x6b, 0x51, 0xdb, 0xe3, 0xa3, + 0xea, 0x2d, 0x68, 0xe9, 0x40, 0xe4, 0xdc, 0x15, + 0x62, 0xc2, 0x0b, 0xbc, 0xfd, 0xdb, 0xae, 0x6f, + 0x9e, 0x4d, 0xbb, 0x0f, 0xc5, 0xe4, 0x2a, 0x8f, + 0x8c, 0xa6, 0xa3, 0xbc, 0xca, 0xcd, 0xe2, 0xb5, + 0xc2, 0xdc, 0x1d, 0x8c, 0x6d, 0x77, 0x2d, 0xde, + 0x13, 0x54, 0x62, 0x61, 0x0c, 0xb5, 0x31, 0x1b, + 0x62, 0x05, 0x0b, 0x88, 0xa5, 0x4a, 0xcb, 0x82, + 0xca, 0xce, 0x06, 0x06, 0x47, 0x10, 0xa0, 0xd8, + 0x2a, 0x17, 0x9d, 0xde, 0x26, 0xc2, 0xf2, 0x32, + 0xd9, 0x23, 0x0d, 0x77, 0x21, 0x02, 0x89, 0x22, + 0xcb, 0x1c, 0x8c, 0x91, 0xa1, 0xec, 0x21, 0xcd, + 0x70, 0xa8, 0x21, 0x7d, 0xaa, 0x6e, 0x9f, 0xc9, + 0xdc, 0xe3, 0x72, 0x47, 0x0f, 0x78, 0xe2, 0xe8, + 0x9c, 0x7f, 0x80, 0xf3, 0xf0, 0x2b, 0x8a, 0x82, + 0x51, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x54, + 0xf3, 0x7f, 0x9a, 0x6c, 0x7b, 0xf1, 0xfe, 0xf2, + 0xb5, 0xaa, 0xa6, 0x6f, 0xf3, 0x4d, 0x8f, 0x7e, + 0x3f, 0xde, 0x56, 0xb1, 0xca, 0x82, 0x51, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x54, 0xf5, + 0x5f, 0xdf, 0x58, 0xfe, 0xf0, 0xfe, 0xe0, 0x56, + 0xc5, 0x53, 0xd5, 0x7f, 0x7d, 0x63, 0xfb, 0xcd, + 0xfe, 0xe0, 0x41, 0x6b, 0x52, 0xa3, 0x95, 0x4a, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0xf8, + 0x92, 0x58, 0xe2, 0x6f, 0x14, 0x8e, 0x0c, 0x1c, + 0xe4, 0xd1, 0x07, 0xd5, 0x56, 0x0e, 0x4b, 0x33, + 0x63, 0x8d, 0x8f, 0x8e, 0xe1, 0xe0, 0x1e, 0x46, + 0x8d, 0xeb, 0x45, 0x9a, 0xd6, 0x4d, 0x8c, 0xba, + 0xdb, 0x1c, 0xde, 0xb2, 0x4d, 0xdc, 0x7c, 0x80, + 0xaa, 0xd9, 0x8a, 0x7b, 0xa9, 0x3c, 0xa2, 0xf5, + 0xe6, 0x47, 0x9d, 0xb4, 0xe4, 0x08, 0x36, 0x19, + 0x8d, 0x4d, 0x7f, 0x93, 0x6b, 0xa2, 0xb2, 0x06, + 0x28, 0x07, 0xed, 0x72, 0x95, 0x65, 0xd2, 0x59, + 0x1f, 0x2d, 0xc5, 0x30, 0x39, 0xd5, 0x92, 0x1f, + 0x11, 0xea, 0xa4, 0x1a, 0xd6, 0x37, 0x85, 0xa2, + 0x81, 0x66, 0xe9, 0x1b, 0xaf, 0x23, 0xcb, 0xc9, + 0x66, 0xe3, 0xe2, 0x4e, 0x2a, 0xd1, 0xdd, 0x41, + 0x79, 0x3b, 0xd6, 0x9b, 0x35, 0xb2, 0xfe, 0xc0, + 0xb7, 0xe3, 0x71, 0x9e, 0x85, 0xba, 0xa2, 0xd3, + 0xdc, 0xb5, 0xf7, 0x59, 0xa8, 0x59, 0xc2, 0x78, + 0x2d, 0x81, 0x71, 0x77, 0x25, 0x4a, 0xce, 0x7b, + 0xa2, 0x3a, 0xbb, 0x7a, 0x69, 0x88, 0xce, 0x72, + 0x9d, 0xd8, 0xe3, 0x9f, 0x8c, 0x31, 0x35, 0x37, + 0x8b, 0x7b, 0x8e, 0x7f, 0x2f, 0x59, 0x4a, 0xf7, + 0xd6, 0xd3, 0x32, 0xd0, 0xec, 0x45, 0xcb, 0x48, + 0xad, 0x62, 0x3f, 0x02, 0xd5, 0xe6, 0xbf, 0xe4, + 0xe6, 0xec, 0x2d, 0x46, 0xd2, 0xc3, 0xc6, 0xee, + 0xe2, 0xd8, 0xe7, 0xa5, 0x10, 0xe1, 0xee, 0x9e, + 0x4d, 0x07, 0x56, 0x45, 0x7b, 0xeb, 0x3f, 0xdc, + 0x7a, 0x26, 0x26, 0xbd, 0x16, 0x3c, 0x67, 0x6f, + 0x76, 0x59, 0xec, 0x60, 0xe8, 0x77, 0x97, 0x60, + 0xa3, 0x07, 0x91, 0xce, 0x03, 0xa5, 0x58, 0x56, + 0x83, 0x45, 0xc4, 0xe8, 0xf0, 0x70, 0xd4, 0x53, + 0x88, 0xb9, 0xdd, 0x2b, 0x7e, 0xae, 0x9f, 0xe8, + 0xc7, 0xd8, 0xe5, 0xeb, 0xe6, 0x27, 0xd5, 0xeb, + 0xd7, 0xf7, 0x33, 0xf8, 0x88, 0x88, 0xb6, 0xf3, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x20, 0x80, 0x77, 0xa0, 0x00, 0x6e, + 0x45, 0x8d, 0x7b, 0x91, 0xb3, 0xb1, 0x8c, 0xc9, + 0x73, 0x28, 0x8c, 0x0e, 0x42, 0x76, 0xa0, 0xc9, + 0x5c, 0xcf, 0x5a, 0x7d, 0xfd, 0x3f, 0xf4, 0xc7, + 0xc0, 0xae, 0x1e, 0xb9, 0xe0, 0xe9, 0xfc, 0xd3, + 0xef, 0x78, 0x55, 0x1b, 0x53, 0x64, 0x6d, 0xaf, + 0xb2, 0xf2, 0xdc, 0x5b, 0x92, 0xe8, 0xdc, 0xc0, + 0xd0, 0x7b, 0xb4, 0x41, 0xd0, 0xf4, 0xef, 0xdc, + 0xb6, 0x9f, 0xd3, 0x0b, 0x66, 0xaa, 0x78, 0x6d, + 0x5b, 0x86, 0xb6, 0xc6, 0x5b, 0xc1, 0x2c, 0x84, + 0x48, 0xc6, 0x00, 0x45, 0x06, 0xfe, 0x95, 0x9c, + 0x75, 0xa6, 0x0c, 0x6f, 0x94, 0xf4, 0x20, 0xdf, + 0x22, 0xf0, 0xb3, 0xbb, 0x86, 0xf2, 0x06, 0xdc, + 0x42, 0x6b, 0x1b, 0xf7, 0x12, 0xbd, 0xd0, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x69, 0xf5, 0x56, 0x0a, 0x3c, + 0xe6, 0x1e, 0x6b, 0x27, 0x8f, 0x1c, 0x8a, 0xc4, + 0x79, 0x9c, 0x16, 0xe1, 0x42, 0x0f, 0xcc, 0x57, + 0x96, 0x72, 0xd9, 0x5d, 0xcd, 0x69, 0x30, 0xe1, + 0x92, 0x17, 0x16, 0xba, 0xbd, 0xc5, 0xe3, 0xc9, + 0xfe, 0x4b, 0xa2, 0xfb, 0x5b, 0xd3, 0x5e, 0x4d, + 0x76, 0xdc, 0xd4, 0x0c, 0xa4, 0x53, 0x1e, 0x19, + 0x88, 0x1b, 0x9c, 0x79, 0x4a, 0xe7, 0x5f, 0x0a, + 0x02, 0x27, 0x79, 0x10, 0x11, 0x13, 0xe1, 0x40, + 0x44, 0x5b, 0x8d, 0x3b, 0xa5, 0x72, 0xf9, 0xfb, + 0x81, 0x1d, 0xa4, 0x45, 0xb1, 0x57, 0xc7, 0x99, + 0xc2, 0x8d, 0x03, 0xbe, 0x83, 0x4f, 0xf0, 0xf3, + 0xaf, 0x6b, 0x1b, 0x2b, 0x9c, 0x85, 0xd4, 0x76, + 0x96, 0x8c, 0x32, 0x4d, 0x29, 0xa3, 0x5a, 0x3e, + 0x15, 0xd9, 0xe1, 0xf6, 0x63, 0x88, 0xb5, 0xc0, + 0xcd, 0x64, 0x2b, 0x35, 0xdc, 0x8c, 0xaf, 0x94, + 0x11, 0xb7, 0x8e, 0x9c, 0x8b, 0x92, 0xda, 0x4b, + 0x73, 0xa7, 0x73, 0xf1, 0xc9, 0x23, 0x4b, 0x65, + 0xb4, 0x96, 0x8f, 0x1b, 0x89, 0x68, 0x28, 0x33, + 0x35, 0x4e, 0x90, 0xbd, 0xd3, 0x4c, 0xb5, 0x75, + 0xd3, 0xb8, 0xfc, 0xa5, 0xb5, 0x24, 0x6e, 0x6b, + 0xbe, 0x4a, 0xd6, 0xe2, 0xb0, 0xd9, 0x1c, 0xcd, + 0xc8, 0xb6, 0xb0, 0x88, 0xc8, 0xe2, 0x68, 0xe7, + 0x01, 0xb0, 0x77, 0x4a, 0xbe, 0xea, 0x89, 0x73, + 0xba, 0xcb, 0x1a, 0xfc, 0x84, 0x56, 0xbd, 0x46, + 0x2e, 0xc8, 0x19, 0x59, 0xc6, 0x28, 0xf9, 0x28, + 0x28, 0xea, 0x2b, 0xde, 0x8d, 0xb0, 0xc3, 0xdb, + 0xe1, 0x2d, 0x67, 0xc6, 0x46, 0xd6, 0xb2, 0x58, + 0xc3, 0x9c, 0xf0, 0x36, 0x97, 0x53, 0xc6, 0xdb, + 0xdf, 0x41, 0xc5, 0x75, 0x56, 0x93, 0xbe, 0xd3, + 0x53, 0x45, 0x1d, 0xc9, 0x0f, 0x6c, 0xcc, 0x04, + 0x3c, 0x73, 0xf3, 0x2d, 0x45, 0xbd, 0xc4, 0xf6, + 0xd2, 0x75, 0xb0, 0x3f, 0xab, 0x79, 0x14, 0xa8, + 0xe6, 0x5f, 0xa0, 0x75, 0x96, 0x9b, 0x8f, 0x50, + 0xe1, 0xe4, 0xb5, 0xa0, 0xf2, 0x86, 0xf8, 0xd0, + 0x3c, 0xf2, 0x15, 0xc1, 0xf2, 0x78, 0x5c, 0x9e, + 0x26, 0x67, 0x43, 0x7d, 0x03, 0xe2, 0x2c, 0x24, + 0x71, 0x91, 0xe2, 0x9e, 0xe8, 0x41, 0x84, 0x76, + 0x9d, 0xa4, 0x92, 0x4d, 0x6b, 0xdd, 0x5d, 0x83, + 0x40, 0x65, 0xe0, 0xce, 0xe1, 0x64, 0xc0, 0x64, + 0x48, 0x73, 0xe3, 0x67, 0x0b, 0x03, 0xb7, 0x96, + 0xfb, 0xab, 0x8f, 0x1a, 0x9a, 0x73, 0x55, 0x6f, + 0xb0, 0xf9, 0x2b, 0x8c, 0x55, 0xed, 0xbd, 0xfc, + 0x04, 0x87, 0x44, 0x41, 0x2d, 0x1f, 0xb5, 0xdc, + 0x41, 0x9b, 0x79, 0x6d, 0x90, 0xd2, 0x5a, 0x87, + 0x85, 0xae, 0x2d, 0x92, 0x07, 0xf1, 0xc4, 0xff, + 0x00, 0x95, 0x19, 0x2b, 0xa0, 0x66, 0x71, 0xd8, + 0x2d, 0x59, 0x89, 0xb2, 0xce, 0x5c, 0xce, 0x2d, + 0x04, 0x63, 0x8a, 0x49, 0x36, 0x02, 0x47, 0xed, + 0x35, 0x61, 0xeb, 0xf9, 0x74, 0xe5, 0xf6, 0x2a, + 0xde, 0xfa, 0xf6, 0x43, 0x15, 0xfb, 0xa3, 0x0e, + 0x89, 0x8c, 0xda, 0xed, 0xa3, 0x71, 0x15, 0x5c, + 0xee, 0x7c, 0x95, 0xfc, 0xb6, 0x71, 0x59, 0x49, + 0x23, 0x9b, 0x6b, 0x10, 0xab, 0x22, 0x1e, 0x2d, + 0x6b, 0xca, 0x68, 0xaa, 0x2c, 0x39, 0xbd, 0x5d, + 0x6e, 0xdb, 0x47, 0x61, 0x74, 0xec, 0x5e, 0x4d, + 0x60, 0x36, 0x3e, 0x62, 0x3c, 0x69, 0x08, 0xdf, + 0xb5, 0x55, 0x49, 0x24, 0xf1, 0x38, 0xf1, 0x13, + 0xfb, 0x47, 0x69, 0x3f, 0xe6, 0xa3, 0x89, 0xb4, + 0xa5, 0x7a, 0x05, 0x15, 0xaf, 0x48, 0x61, 0x30, + 0xb9, 0x4b, 0x4b, 0xb8, 0xcb, 0xcb, 0xb3, 0x06, + 0x27, 0x75, 0x31, 0x3f, 0x63, 0x41, 0xa7, 0xec, + 0x94, 0x1e, 0x3a, 0x77, 0x49, 0xdb, 0xdf, 0xd9, + 0xbf, 0x2f, 0x97, 0x9f, 0xc9, 0x31, 0xd1, 0x1a, + 0x35, 0xdc, 0xaf, 0x23, 0xbe, 0xb3, 0xa7, 0xcd, + 0x69, 0x3c, 0x5c, 0x8f, 0xbc, 0xc0, 0xc8, 0xf8, + 0xe6, 0x10, 0xba, 0xdd, 0xcc, 0x70, 0xa0, 0x7f, + 0x10, 0xa7, 0x1e, 0xf5, 0xb4, 0xc1, 0xe3, 0x2d, + 0x35, 0x36, 0x92, 0x8f, 0x01, 0x34, 0xc6, 0xce, + 0xee, 0xc2, 0x42, 0x25, 0x67, 0x2d, 0x41, 0x3b, + 0x68, 0x56, 0xc2, 0x2d, 0x21, 0xa1, 0x74, 0xec, + 0x55, 0xc9, 0xcb, 0x1c, 0x92, 0x90, 0x01, 0x7c, + 0xa6, 0x87, 0xff, 0x00, 0x10, 0x52, 0xca, 0x51, + 0xf4, 0x3e, 0xa6, 0x7e, 0x0f, 0x32, 0x0c, 0xee, + 0x2e, 0xb3, 0xbd, 0x77, 0x0c, 0xfc, 0x44, 0x90, + 0x2b, 0xfb, 0x4b, 0x61, 0xed, 0x1f, 0x4d, 0x36, + 0xc2, 0xf1, 0xb9, 0x8b, 0x21, 0xc5, 0x63, 0x7d, + 0xe3, 0x12, 0xdd, 0xcd, 0x71, 0xdb, 0xc9, 0xc8, + 0x54, 0x6b, 0xdd, 0x2d, 0x8d, 0xb1, 0xb7, 0x8b, + 0x31, 0x86, 0x70, 0x75, 0x8d, 0xc1, 0xa3, 0x83, + 0x4d, 0x43, 0x4f, 0x38, 0x2b, 0x3b, 0x09, 0xab, + 0x31, 0xbe, 0xa4, 0xc9, 0x6b, 0xa8, 0x1a, 0x2e, + 0x9a, 0xc7, 0x98, 0x60, 0x8b, 0x7b, 0xde, 0x00, + 0x14, 0xef, 0x21, 0x4d, 0x77, 0xb3, 0x8d, 0x46, + 0xec, 0x65, 0xfc, 0xd6, 0x97, 0x2f, 0x02, 0xc2, + 0x66, 0x17, 0x48, 0x1c, 0x76, 0x02, 0xde, 0x6e, + 0xe9, 0x5a, 0x3d, 0x55, 0x7b, 0x83, 0xbd, 0xc9, + 0xc9, 0x26, 0x16, 0xdc, 0xc1, 0x01, 0x71, 0x2e, + 0x26, 0xbe, 0x33, 0xab, 0xb5, 0xd4, 0x2b, 0x59, + 0x71, 0x2c, 0x52, 0x5c, 0x49, 0x24, 0x0c, 0xea, + 0x62, 0x79, 0x3c, 0x11, 0xd6, 0xb4, 0x6f, 0x32, + 0xf1, 0xaa, 0x14, 0x10, 0x37, 0xa8, 0x25, 0x0a, + 0xf9, 0x45, 0x37, 0xa8, 0x25, 0x09, 0x51, 0x5e, + 0x6d, 0xb5, 0xd8, 0x80, 0x4a, 0xdb, 0x69, 0xed, + 0x2d, 0x97, 0xd4, 0x17, 0x2d, 0x8e, 0xce, 0x27, + 0x08, 0x49, 0xf1, 0xe7, 0x23, 0xc5, 0x68, 0xef, + 0xab, 0x06, 0x8c, 0xf6, 0x6d, 0x7d, 0x98, 0x7b, + 0x6f, 0x72, 0x4d, 0x36, 0xf6, 0x00, 0x82, 0x1a, + 0x76, 0x3d, 0xfe, 0xe7, 0x32, 0xec, 0x58, 0xec, + 0x65, 0x8e, 0x32, 0xd5, 0xb6, 0x96, 0x51, 0x08, + 0xa1, 0x60, 0xa0, 0x68, 0xff, 0x00, 0x32, 0xa0, + 0xd5, 0xe9, 0x6d, 0x1f, 0x8b, 0xd3, 0x96, 0xad, + 0x6d, 0xb4, 0x61, 0xd7, 0x2e, 0x03, 0xad, 0x9c, + 0xed, 0x24, 0xf7, 0x16, 0xf9, 0x4a, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x85, 0xe5, 0x3d, + 0xdd, 0xbd, 0xbb, 0x4b, 0xa6, 0x91, 0xac, 0x03, + 0x69, 0xa9, 0x41, 0xea, 0xb1, 0x2f, 0xf2, 0xb6, + 0x56, 0x11, 0x97, 0xdc, 0xc8, 0x1b, 0x4f, 0xd9, + 0xe5, 0xe8, 0x55, 0xcc, 0xa6, 0xb0, 0x96, 0x67, + 0x9b, 0x6c, 0x4c, 0x46, 0x47, 0x13, 0x43, 0x27, + 0x20, 0x58, 0x10, 0x61, 0x2e, 0x6f, 0x24, 0xf2, + 0x9c, 0xa4, 0xdc, 0x6e, 0x3b, 0x99, 0x5a, 0xa0, + 0xce, 0xb8, 0xd6, 0x17, 0x97, 0x52, 0x70, 0x62, + 0xe0, 0xe2, 0x03, 0x7b, 0xdd, 0x5d, 0xab, 0xe3, + 0xd3, 0xda, 0x9b, 0x67, 0xf0, 0x01, 0xff, 0x00, + 0x1d, 0xe5, 0x9d, 0x05, 0xbc, 0x16, 0xec, 0xe0, + 0x81, 0xad, 0x68, 0x1c, 0xa1, 0x7a, 0x54, 0xf7, + 0x10, 0x6b, 0xbd, 0x3d, 0xa9, 0xbb, 0x01, 0xfe, + 0x3d, 0xc5, 0x07, 0x3b, 0xa9, 0x87, 0xfe, 0x91, + 0xfe, 0x3d, 0xc5, 0xb2, 0x26, 0x80, 0x92, 0x56, + 0x0d, 0xee, 0x6a, 0xd2, 0xcc, 0x50, 0xbc, 0x3e, + 0x4e, 0x46, 0x84, 0x1e, 0x67, 0x3f, 0xa9, 0x1a, + 0x2a, 0xe8, 0x5a, 0x00, 0xde, 0x4f, 0xff, 0x00, + 0x85, 0x85, 0x26, 0xb6, 0xca, 0xc7, 0x27, 0x56, + 0x58, 0x0b, 0x87, 0x36, 0xe5, 0x85, 0x73, 0x91, + 0xc9, 0x64, 0x5e, 0x5a, 0xda, 0xc5, 0x0f, 0x37, + 0x3a, 0x98, 0x6c, 0xa3, 0x84, 0x55, 0xde, 0x33, + 0xf9, 0x49, 0x41, 0xb8, 0x19, 0xab, 0x8c, 0xbe, + 0x9c, 0xc8, 0x3e, 0xe1, 0xa1, 0xae, 0x8f, 0x60, + 0xa7, 0x75, 0x6e, 0x34, 0xe7, 0xdc, 0x96, 0xdd, + 0xe5, 0x59, 0xc5, 0x7e, 0x5d, 0xca, 0xfc, 0xef, + 0x02, 0xb3, 0x69, 0xcf, 0xb9, 0x2d, 0xbb, 0xdf, + 0xe4, 0x83, 0x60, 0x8a, 0x68, 0x85, 0x5b, 0x18, + 0x99, 0x73, 0x4c, 0x55, 0xcf, 0xcc, 0x3b, 0x55, + 0x5f, 0x03, 0xa5, 0xac, 0xb2, 0x38, 0xf1, 0x73, + 0x2b, 0xbc, 0x77, 0x12, 0xac, 0xf9, 0x8f, 0xba, + 0xae, 0xbe, 0x62, 0xc1, 0xd2, 0x1f, 0x72, 0xb3, + 0xe7, 0x1f, 0x85, 0x2c, 0x78, 0x7a, 0x91, 0x61, + 0xc9, 0x21, 0x1d, 0xca, 0xff, 0x00, 0xaa, 0x7a, + 0x93, 0x8f, 0xf9, 0x6e, 0xe9, 0xff, 0x00, 0x55, + 0x61, 0xaa, 0x28, 0x2b, 0xde, 0xa4, 0xe3, 0xcf, + 0xfe, 0xc3, 0xd3, 0xfe, 0xa9, 0xea, 0x45, 0x87, + 0x68, 0x7a, 0x7f, 0xd5, 0x58, 0x6a, 0x95, 0x54, + 0x51, 0x35, 0x1e, 0x02, 0xdb, 0x16, 0x20, 0x31, + 0x39, 0xce, 0xeb, 0x1d, 0x47, 0x02, 0xa2, 0x28, + 0x62, 0x89, 0xa0, 0x31, 0xb4, 0x5b, 0x3d, 0x73, + 0xf1, 0x6d, 0x7e, 0x7a, 0xd7, 0x8d, 0xc3, 0xbc, + 0x10, 0x7d, 0x2f, 0x97, 0xfc, 0x47, 0x77, 0x8a, + 0x9a, 0xa8, 0x7f, 0xc4, 0x3d, 0xe2, 0x83, 0x67, + 0xa2, 0x3f, 0xeb, 0xdc, 0xfc, 0xe5, 0x66, 0x1b, + 0xc2, 0xac, 0xe8, 0x8f, 0xe4, 0x5d, 0x7c, 0xe5, + 0x66, 0x1b, 0xc2, 0x0a, 0x2e, 0x5b, 0xf3, 0x2c, + 0xbd, 0xe0, 0xbe, 0x97, 0xce, 0x5b, 0xf3, 0x24, + 0xdf, 0x34, 0x2f, 0xaa, 0x24, 0x85, 0x16, 0x36, + 0x4b, 0xfe, 0xab, 0xa9, 0xce, 0xb2, 0x1c, 0xf6, + 0xb0, 0x55, 0xc6, 0x83, 0x9d, 0x61, 0x91, 0x75, + 0x94, 0x90, 0x5a, 0x59, 0xc6, 0x5c, 0x09, 0xda, + 0xfe, 0x44, 0x17, 0x4c, 0x36, 0x27, 0x1b, 0x26, + 0x2e, 0xdd, 0xef, 0x81, 0xae, 0x71, 0x60, 0xa9, + 0xa2, 0xcc, 0xf4, 0x2e, 0x2b, 0xcd, 0xdb, 0xd0, + 0xbd, 0x71, 0xd6, 0xce, 0xb5, 0xb1, 0x86, 0xdd, + 0xfb, 0x5d, 0x1b, 0x40, 0x27, 0xba, 0xbe, 0x32, + 0x19, 0x3b, 0x4c, 0x7c, 0x45, 0xf3, 0xbc, 0x57, + 0x91, 0xa3, 0x7d, 0x54, 0x01, 0x67, 0x8c, 0xb0, + 0xad, 0xc0, 0x8d, 0x91, 0x70, 0x8f, 0x8c, 0xab, + 0xf9, 0x4d, 0x49, 0x35, 0xe3, 0xcd, 0xae, 0x38, + 0x51, 0x9b, 0x9d, 0x2f, 0x71, 0x6b, 0xef, 0x2f, + 0xaf, 0xf3, 0x32, 0x92, 0xe2, 0x63, 0xb6, 0x07, + 0x63, 0x79, 0xc2, 0xf5, 0x86, 0x18, 0xe0, 0x67, + 0x0c, 0x62, 0x9c, 0xe5, 0x06, 0xb2, 0xfe, 0xdf, + 0xc9, 0xed, 0x2a, 0x49, 0x74, 0xd3, 0x3a, 0x84, + 0x9e, 0xea, 0xb2, 0xe2, 0xed, 0x19, 0x69, 0x8f, + 0x86, 0x36, 0xef, 0x23, 0x89, 0xde, 0xea, 0xd0, + 0x66, 0x29, 0xd6, 0x5b, 0x57, 0x77, 0x18, 0x56, + 0x86, 0xd3, 0x81, 0xa0, 0x6e, 0xe1, 0x1f, 0x02, + 0xa2, 0x51, 0x11, 0x41, 0xa7, 0xd4, 0xd0, 0x7f, + 0x06, 0x2b, 0xf8, 0xc5, 0x24, 0xb7, 0x78, 0x3c, + 0x43, 0x9a, 0xaa, 0xd9, 0x8d, 0xb9, 0xf2, 0xab, + 0x18, 0x67, 0xf9, 0x6d, 0x04, 0xaa, 0xe6, 0x7e, + 0x9e, 0x89, 0x9e, 0xbc, 0xcb, 0x6f, 0xa6, 0x09, + 0x38, 0x3b, 0x5e, 0x2f, 0x92, 0x83, 0x6a, 0x8a, + 0x01, 0x52, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x2a, + 0x79, 0xbf, 0xcd, 0x36, 0x1d, 0xf8, 0xff, 0x00, + 0x79, 0x5a, 0xd5, 0x53, 0x37, 0xf9, 0xa6, 0xc3, + 0xbf, 0x1f, 0xef, 0x2b, 0x58, 0xe5, 0x41, 0x28, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0xaa, + 0x5a, 0xaf, 0xef, 0xbc, 0x77, 0x79, 0xbf, 0xdc, + 0x0a, 0xda, 0xaa, 0x5a, 0xaf, 0xef, 0xbc, 0x77, + 0x79, 0xbf, 0xdc, 0x08, 0x2d, 0x9c, 0xaa, 0x54, + 0x72, 0xa9, 0x40, 0x44, 0x50, 0x82, 0x54, 0x2c, + 0x7b, 0xdb, 0xfb, 0x6b, 0x18, 0x4c, 0xb7, 0x0f, + 0x0c, 0x01, 0x53, 0xb2, 0x5a, 0xc2, 0xf2, 0xf5, + 0xef, 0xb7, 0xc6, 0xb7, 0x82, 0x3d, 0xc6, 0x44, + 0x16, 0x3c, 0xbe, 0xa4, 0xb0, 0xc6, 0xb0, 0x82, + 0xf0, 0xf9, 0xb9, 0x18, 0xdd, 0xa6, 0xbd, 0xd5, + 0x4c, 0xbc, 0xc9, 0x64, 0xf2, 0xf2, 0x71, 0xca, + 0xf3, 0x15, 0xbf, 0xc8, 0x0b, 0xca, 0x3b, 0x31, + 0xc7, 0xd6, 0xdc, 0x38, 0xcb, 0x29, 0xda, 0x49, + 0xe7, 0x59, 0x04, 0x86, 0x8f, 0x1b, 0xc5, 0x1c, + 0x88, 0x3e, 0x22, 0x82, 0x38, 0x85, 0x1a, 0x36, + 0xf2, 0x92, 0xa5, 0xf2, 0x35, 0x82, 0xae, 0x20, + 0x0a, 0xd1, 0x7c, 0x5c, 0xbd, 0xf1, 0xc2, 0x5e, + 0xc1, 0x57, 0x05, 0xf2, 0xc0, 0xcb, 0xb8, 0x18, + 0xf7, 0x6f, 0x1b, 0xc7, 0x75, 0x4c, 0xa6, 0xa2, + 0x67, 0x96, 0xd4, 0x99, 0xa8, 0x99, 0xe4, 0x8b, + 0xb9, 0x9f, 0x13, 0x1a, 0xf6, 0xfc, 0x53, 0xbc, + 0xa9, 0xeb, 0x8c, 0x17, 0x36, 0xd7, 0xd1, 0x9f, + 0x8a, 0xe1, 0x5a, 0x73, 0x15, 0xf7, 0x34, 0x21, + 0xf0, 0xba, 0x3e, 0xe6, 0xcf, 0x71, 0x63, 0xc5, + 0x1b, 0xdf, 0x64, 0xf8, 0x9f, 0xbd, 0xa0, 0xd1, + 0x30, 0xfc, 0xf8, 0x79, 0xe3, 0x74, 0x45, 0xcf, + 0x48, 0x66, 0x35, 0x31, 0x9f, 0x2e, 0xda, 0x9c, + 0xb7, 0x5b, 0xa7, 0xc1, 0x33, 0x67, 0x85, 0x92, + 0xb7, 0x6b, 0x5e, 0xd0, 0x47, 0xba, 0xa7, 0x81, + 0xa0, 0x97, 0x01, 0xb4, 0xef, 0x2b, 0x47, 0xa3, + 0x72, 0x1e, 0x55, 0x8a, 0x11, 0x38, 0xd6, 0x4b, + 0x73, 0xc0, 0x7b, 0xcb, 0x7e, 0xab, 0x6d, 0x35, + 0x96, 0x36, 0xe0, 0x65, 0x6e, 0x32, 0x17, 0x02, + 0xae, 0x77, 0x8b, 0x0b, 0x79, 0x9a, 0xb0, 0x75, + 0x9d, 0xd1, 0x75, 0x9c, 0x58, 0xe8, 0xf6, 0xcd, + 0x74, 0xf0, 0xd2, 0xd1, 0xbc, 0x05, 0x66, 0x5a, + 0xeb, 0x8c, 0x34, 0x17, 0x19, 0x38, 0xf2, 0x12, + 0x12, 0xe7, 0xc4, 0x28, 0xc6, 0xf2, 0x0e, 0xea, + 0xc4, 0xe3, 0xf9, 0x7c, 0xb1, 0xc7, 0x7c, 0xbd, + 0x5a, 0x3e, 0xa2, 0x3e, 0xfe, 0x3a, 0xba, 0xbb, + 0x7e, 0xde, 0x31, 0xe5, 0xc6, 0x37, 0x7e, 0x5f, + 0xd3, 0x0f, 0x7c, 0x6d, 0xbf, 0x93, 0x59, 0xc3, + 0x6e, 0x05, 0x38, 0x18, 0x01, 0xef, 0xd1, 0x65, + 0xaf, 0x90, 0x28, 0x57, 0xd2, 0xd4, 0x45, 0x44, + 0x47, 0x27, 0x9b, 0x2c, 0xa7, 0x29, 0x9c, 0xa7, + 0x7e, 0x53, 0x33, 0x3d, 0xe2, 0x22, 0x2a, 0x82, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x82, 0xe0, + 0xd0, 0x49, 0xd8, 0x06, 0xda, 0xa0, 0x95, 0xe7, + 0x34, 0xf0, 0xc0, 0xc3, 0x24, 0xcf, 0x0c, 0x60, + 0xde, 0x4a, 0xae, 0xe6, 0x75, 0xa5, 0x9d, 0x9b, + 0x8d, 0xbd, 0x98, 0xf2, 0x9b, 0x8d, 0xd4, 0x6e, + 0xd0, 0x0a, 0xd4, 0x7a, 0x37, 0x39, 0xa8, 0x18, + 0xeb, 0xac, 0x8c, 0x86, 0xde, 0x00, 0x2a, 0xd8, + 0x46, 0xca, 0xa0, 0xcd, 0xcb, 0x6b, 0x47, 0xc9, + 0x29, 0xb3, 0xc2, 0xc6, 0x67, 0x97, 0x71, 0x78, + 0xdc, 0x16, 0x15, 0x96, 0x9b, 0xb8, 0xbb, 0x73, + 0xae, 0xb3, 0x77, 0x25, 0xee, 0xa5, 0x5b, 0x0d, + 0x76, 0x02, 0xbe, 0x71, 0x97, 0x13, 0xe2, 0x9a, + 0x63, 0xb5, 0xb3, 0xa9, 0x1b, 0x38, 0xc8, 0xda, + 0xbd, 0x64, 0xc8, 0x65, 0xa4, 0x24, 0xf5, 0x24, + 0x39, 0xc8, 0x35, 0xb7, 0x98, 0xe1, 0x6c, 0x5c, + 0xe7, 0xc6, 0xd0, 0xd0, 0x68, 0xd1, 0xdc, 0x5e, + 0x96, 0xd8, 0xd6, 0xdf, 0xc9, 0x11, 0x6c, 0x02, + 0x28, 0x9b, 0x4e, 0x23, 0xcf, 0x45, 0x98, 0x2c, + 0xb8, 0x58, 0x6e, 0xf2, 0x52, 0x54, 0x0d, 0xbc, + 0x24, 0xec, 0x5a, 0xdb, 0xcd, 0x43, 0x3d, 0xcd, + 0x6d, 0xb1, 0xad, 0xe0, 0x8b, 0x77, 0x18, 0x41, + 0x97, 0x9e, 0xba, 0xc0, 0x5a, 0x37, 0xc9, 0x6c, + 0xad, 0xdb, 0x2d, 0xd3, 0x85, 0x09, 0x1b, 0x81, + 0x5a, 0x1b, 0x6c, 0x73, 0x5c, 0xee, 0x39, 0x5b, + 0x57, 0x3c, 0xec, 0x60, 0x5e, 0x8e, 0x16, 0x96, + 0x11, 0xba, 0xe2, 0xe5, 0xf5, 0x7e, 0xf2, 0xe7, + 0x6f, 0x58, 0x96, 0x1e, 0xd1, 0x31, 0xf6, 0x53, + 0x39, 0xee, 0xb5, 0xeb, 0x88, 0xd8, 0xd2, 0x77, + 0x20, 0xea, 0xda, 0x7a, 0x17, 0x41, 0x8a, 0x86, + 0x37, 0xb7, 0x80, 0x81, 0xb9, 0x6c, 0x57, 0x2d, + 0xfd, 0x67, 0x88, 0x6e, 0xb5, 0x21, 0x3f, 0x5a, + 0x23, 0xf3, 0x52, 0x83, 0xa9, 0x22, 0xe5, 0xbf, + 0xad, 0x11, 0xf9, 0xa9, 0x4f, 0xd6, 0x88, 0xfc, + 0xd4, 0xa0, 0xea, 0x48, 0xb9, 0x6f, 0xeb, 0x44, + 0x7e, 0x6a, 0x53, 0xf5, 0xa2, 0x3f, 0x35, 0x28, + 0x3a, 0x92, 0x2e, 0x5b, 0xfa, 0xd1, 0x1f, 0x9a, + 0x94, 0xfd, 0x68, 0x8f, 0xcd, 0x4a, 0x0e, 0xa4, + 0x8b, 0x96, 0xfe, 0xb4, 0x47, 0xe6, 0xa5, 0x3f, + 0x5a, 0x23, 0xf3, 0x52, 0x83, 0xa9, 0x22, 0xe5, + 0xbf, 0xad, 0x11, 0xf9, 0xa9, 0x4f, 0xd6, 0x88, + 0xfc, 0xd4, 0xa0, 0xea, 0x48, 0xb9, 0x6f, 0xeb, + 0x44, 0x7e, 0x6a, 0x53, 0xf5, 0xa2, 0x3f, 0x35, + 0x28, 0x3a, 0x92, 0x2e, 0x5b, 0xfa, 0xd1, 0x1f, + 0x9a, 0x94, 0xfd, 0x68, 0x8f, 0xcd, 0x4a, 0x0e, + 0xa4, 0x8b, 0x96, 0xfe, 0xb4, 0x47, 0xe6, 0xa5, + 0x3f, 0x5a, 0x23, 0xf3, 0x52, 0x83, 0xa9, 0x22, + 0xe5, 0xbf, 0xad, 0x11, 0xf9, 0xa9, 0x4f, 0xd6, + 0x88, 0xfc, 0xd4, 0xa0, 0xea, 0x4a, 0x57, 0x2c, + 0xfd, 0x68, 0x8f, 0xcd, 0x4a, 0x7e, 0xb3, 0xc5, + 0xe6, 0xa5, 0x07, 0x52, 0x45, 0xcb, 0x7f, 0x5a, + 0x23, 0xf3, 0x52, 0x9f, 0xad, 0x11, 0xf9, 0xa9, + 0x41, 0xd4, 0x91, 0x72, 0xdf, 0xd6, 0x88, 0xfc, + 0xd4, 0xa7, 0xeb, 0x44, 0x7e, 0x6a, 0x50, 0x74, + 0x1d, 0x43, 0x89, 0x8b, 0x31, 0x89, 0xb8, 0xb1, + 0x90, 0x03, 0xd6, 0x34, 0xf0, 0xd7, 0xe5, 0x53, + 0x62, 0xfc, 0xe9, 0x7d, 0x65, 0x71, 0x61, 0x77, + 0x25, 0xa5, 0xc3, 0x78, 0x65, 0x89, 0xc5, 0xa6, + 0xbb, 0x37, 0x2e, 0x97, 0xfa, 0xd1, 0x17, 0x9a, + 0x9f, 0x7d, 0x53, 0xb5, 0x66, 0x72, 0xdb, 0x52, + 0x5c, 0xfa, 0x4a, 0x08, 0x7a, 0x99, 0x18, 0x29, + 0x28, 0xdd, 0x51, 0xce, 0x82, 0xbc, 0x88, 0xa0, + 0xa0, 0x94, 0x44, 0xf8, 0x10, 0x41, 0xaf, 0x21, + 0x5d, 0xa3, 0xd9, 0x3e, 0x7a, 0xda, 0xf3, 0x0f, + 0xe8, 0xce, 0x16, 0xb2, 0xe6, 0xd2, 0xa5, 0xd4, + 0xde, 0xe6, 0x93, 0xf1, 0x97, 0x18, 0xa2, 0xdb, + 0x69, 0x6c, 0xec, 0xd8, 0x2c, 0xcc, 0x37, 0xb1, + 0x3a, 0x8c, 0xe2, 0x0d, 0x98, 0x73, 0xb0, 0x9d, + 0xb5, 0x41, 0xfa, 0x35, 0x55, 0xb3, 0x7a, 0x03, + 0x0f, 0x95, 0xbe, 0x9b, 0x21, 0x33, 0x4f, 0x5a, + 0xf8, 0xcb, 0x43, 0x46, 0xee, 0x2a, 0x7c, 0x65, + 0x63, 0xb2, 0xbb, 0x86, 0xf2, 0xd6, 0x3b, 0xa8, + 0x1d, 0xc5, 0x14, 0xcd, 0x0e, 0x69, 0x1c, 0xc5, + 0x78, 0xe6, 0x2e, 0xe6, 0xb3, 0xc6, 0x5c, 0xdd, + 0x5b, 0xb3, 0xac, 0x9a, 0x26, 0x17, 0x31, 0xbc, + 0xe4, 0x04, 0x15, 0xbd, 0x01, 0x33, 0x6e, 0x70, + 0x57, 0x38, 0x4b, 0x91, 0xfc, 0x4b, 0x19, 0x1f, + 0x6d, 0x23, 0x4e, 0xf2, 0xc7, 0x6d, 0x06, 0x9d, + 0xe2, 0xa8, 0x17, 0xba, 0x97, 0x39, 0xa6, 0x32, + 0x0d, 0xc0, 0x32, 0x53, 0x15, 0x95, 0x95, 0xc7, + 0x15, 0x39, 0x5d, 0x19, 0x77, 0x1d, 0x3d, 0xf5, + 0x95, 0xec, 0xf7, 0x54, 0xdc, 0x3f, 0x59, 0x4e, + 0xfb, 0xd7, 0x70, 0xbf, 0x26, 0x38, 0x1e, 0xde, + 0x40, 0xf1, 0xb4, 0x7c, 0x0a, 0xc5, 0xae, 0x70, + 0x78, 0xf1, 0xaa, 0x71, 0x59, 0x2b, 0xd8, 0xf8, + 0xed, 0x6e, 0x5f, 0xd4, 0xcc, 0x37, 0x0e, 0x3f, + 0xd9, 0xaa, 0x0b, 0xe5, 0x8d, 0xcb, 0x2e, 0xed, + 0x21, 0xb9, 0x8f, 0xe2, 0xca, 0xc6, 0xb9, 0xbe, + 0xe8, 0xaa, 0xd7, 0xea, 0x6c, 0x0d, 0xb6, 0x6f, + 0x15, 0x3d, 0xac, 0x8c, 0x06, 0x47, 0x34, 0xf5, + 0x6f, 0xa6, 0xd0, 0xe5, 0xb4, 0x82, 0x38, 0xa1, + 0x85, 0x91, 0xc2, 0xd0, 0xd8, 0xda, 0x00, 0x60, + 0x1b, 0x80, 0x1b, 0x97, 0xd9, 0xd8, 0x10, 0x7e, + 0x64, 0xbf, 0xb2, 0x9f, 0x1f, 0x79, 0x2d, 0x9d, + 0xc0, 0xa4, 0x90, 0xbb, 0x84, 0xd7, 0xb9, 0xb9, + 0x65, 0x03, 0xe2, 0xb7, 0xbc, 0xb7, 0xbe, 0xd4, + 0x6f, 0x31, 0x77, 0x3a, 0x8d, 0xc2, 0xc5, 0xa3, + 0xac, 0x84, 0x70, 0xdc, 0x3d, 0xbc, 0xae, 0x0b, + 0x40, 0x0f, 0x88, 0xde, 0xf0, 0x55, 0x25, 0x67, + 0xd1, 0xf6, 0x58, 0x5c, 0xae, 0x5a, 0x33, 0x9c, + 0xb9, 0x73, 0xe5, 0xa8, 0x6c, 0x10, 0x38, 0xf8, + 0xa6, 0x9b, 0x82, 0xc8, 0xf6, 0x89, 0x83, 0x36, + 0x19, 0xf8, 0xa6, 0x70, 0xea, 0xf1, 0xf7, 0x01, + 0xad, 0x63, 0xdb, 0xfb, 0x14, 0xe4, 0x55, 0x16, + 0x49, 0x24, 0x52, 0x32, 0x58, 0xcf, 0x0c, 0x91, + 0x9e, 0x26, 0x38, 0x6f, 0x04, 0x2e, 0xb3, 0x66, + 0xfb, 0x5d, 0x77, 0xa4, 0x5d, 0x6b, 0x39, 0x06, + 0xf6, 0x16, 0x80, 0xf3, 0xca, 0x1e, 0x37, 0x1f, + 0x75, 0x07, 0x8e, 0x2b, 0x46, 0x68, 0x8c, 0x86, + 0x9f, 0x64, 0x91, 0x3b, 0x8e, 0x31, 0xf1, 0xee, + 0x5c, 0x68, 0xee, 0x2f, 0xf7, 0x2c, 0x09, 0x3d, + 0x9a, 0xe4, 0xf1, 0x37, 0x91, 0x64, 0xf0, 0x17, + 0x42, 0x6e, 0xa8, 0xf1, 0x35, 0x8f, 0x3c, 0x35, + 0x1c, 0xdb, 0x37, 0xad, 0x1e, 0x8f, 0xc9, 0x9c, + 0x66, 0x42, 0xe7, 0x4e, 0x65, 0xc9, 0x65, 0xa5, + 0xc9, 0x31, 0x3d, 0xa7, 0x67, 0x0b, 0xce, 0xc6, + 0xb9, 0x79, 0xdd, 0xe6, 0x35, 0x3e, 0x8f, 0xcb, + 0x49, 0x61, 0x1d, 0xd3, 0x9f, 0x0b, 0x4d, 0x61, + 0x0f, 0xf1, 0x83, 0xa3, 0xde, 0xdd, 0xae, 0xaa, + 0x83, 0x6b, 0xaf, 0x30, 0x99, 0x1b, 0x67, 0x5b, + 0xe7, 0xed, 0x2b, 0x67, 0x25, 0xc8, 0x6b, 0x6f, + 0x18, 0xd2, 0x5a, 0x1a, 0xf2, 0x77, 0x95, 0xa8, + 0x1a, 0x0f, 0x56, 0x64, 0xa5, 0x8d, 0xcf, 0xa4, + 0xb1, 0xcf, 0x42, 0x27, 0x2f, 0x2e, 0x65, 0x0f, + 0x2a, 0xdd, 0xc3, 0xed, 0x3e, 0xcf, 0x27, 0x66, + 0xfc, 0x7e, 0x7e, 0xd2, 0x91, 0xca, 0xde, 0x07, + 0x3e, 0x3d, 0xbb, 0x7e, 0x51, 0xae, 0xe5, 0x52, + 0xb8, 0xd4, 0x79, 0x28, 0x6d, 0xa4, 0xc4, 0xd9, + 0x5d, 0xbc, 0xe3, 0x9a, 0xfa, 0xc4, 0xea, 0xd1, + 0xfc, 0x3c, 0xd5, 0x08, 0xab, 0x06, 0xb3, 0xbd, + 0xb3, 0xc5, 0xe0, 0x2c, 0xb4, 0x9d, 0xac, 0xde, + 0x53, 0x2c, 0x14, 0x75, 0xd4, 0x95, 0xa8, 0x04, + 0x6d, 0xa5, 0x55, 0x18, 0xff, 0x00, 0xad, 0x14, + 0x12, 0x49, 0x25, 0xc4, 0xb8, 0x9d, 0xee, 0x3b, + 0x49, 0x2b, 0xe4, 0x93, 0x54, 0x02, 0x54, 0x55, + 0x09, 0x5f, 0x24, 0xa0, 0x95, 0xf3, 0x54, 0xa9, + 0x5b, 0x2c, 0x1e, 0x9e, 0xc9, 0xe7, 0xae, 0xc5, + 0xb6, 0x3e, 0x3a, 0xd3, 0xe3, 0xc8, 0x76, 0x35, + 0xbd, 0xf5, 0x6c, 0x6b, 0xe1, 0x86, 0x59, 0xe5, + 0x6c, 0x30, 0xb0, 0xc9, 0x2b, 0xcd, 0x1a, 0xc6, + 0xed, 0x24, 0x95, 0xd5, 0x74, 0x3f, 0xb3, 0x08, + 0xed, 0xc3, 0x32, 0x59, 0xd6, 0x07, 0xcc, 0x68, + 0xe8, 0xad, 0xce, 0xe6, 0x9f, 0xf7, 0x2b, 0x06, + 0x93, 0xf6, 0x7f, 0x8a, 0xc0, 0xb1, 0x93, 0xbd, + 0x82, 0x6b, 0xf0, 0x3c, 0x69, 0x9d, 0xb4, 0x02, + 0x79, 0x86, 0xe5, 0x6b, 0xa2, 0x82, 0x18, 0xc6, + 0xc6, 0xc0, 0xc6, 0x0e, 0x16, 0xb4, 0x50, 0x01, + 0xb8, 0x05, 0xf4, 0x88, 0x80, 0x88, 0xbc, 0xdf, + 0x33, 0x18, 0x0d, 0x4e, 0xed, 0xa8, 0x3e, 0xd2, + 0xa3, 0x9d, 0x55, 0x32, 0x3a, 0xe6, 0x08, 0x1e, + 0xf8, 0x60, 0x8c, 0xb9, 0xec, 0x34, 0x26, 0x8b, + 0x0a, 0xd3, 0x57, 0x65, 0xaf, 0xee, 0x44, 0x30, + 0x30, 0x34, 0x52, 0xae, 0x71, 0xdc, 0x07, 0x39, + 0x41, 0x78, 0x52, 0xab, 0x51, 0xe7, 0xaf, 0xad, + 0x26, 0x8c, 0xde, 0x81, 0x2d, 0xa4, 0xa7, 0x84, + 0x4e, 0xcd, 0xa0, 0x1e, 0xea, 0xb1, 0xb1, 0xc1, + 0xec, 0x0e, 0x6e, 0xd0, 0xe1, 0x51, 0xde, 0x42, + 0x62, 0x62, 0x6a, 0x62, 0xa6, 0x12, 0xed, 0x80, + 0xae, 0x77, 0x3e, 0x3f, 0x25, 0x9c, 0xca, 0xdd, + 0xc4, 0xc9, 0xcf, 0x0c, 0x2e, 0x22, 0x84, 0xd0, + 0x51, 0x74, 0x47, 0x7c, 0x53, 0xde, 0x54, 0x3b, + 0x5b, 0xa9, 0x6c, 0xe4, 0xcd, 0x5c, 0x43, 0xb2, + 0x46, 0x3b, 0x67, 0xba, 0x50, 0x44, 0x3a, 0x3f, + 0x33, 0x00, 0xa4, 0x52, 0x35, 0xbd, 0xd0, 0x57, + 0xa7, 0xab, 0x3a, 0x86, 0xbf, 0xf6, 0x3d, 0xf5, + 0x5e, 0xcf, 0xeb, 0x8c, 0xed, 0x9d, 0x9c, 0x73, + 0x42, 0xf0, 0x1c, 0xe7, 0x50, 0xad, 0xaf, 0xad, + 0x59, 0x63, 0x61, 0x6f, 0x3f, 0x1f, 0x8c, 0xf8, + 0x98, 0xe3, 0xdf, 0x71, 0x1e, 0x14, 0x19, 0xbe, + 0xac, 0x6a, 0x1f, 0x38, 0x1d, 0x2a, 0x3d, 0x59, + 0xd4, 0x1e, 0x70, 0x3a, 0x55, 0x46, 0x5f, 0x68, + 0x7a, 0x81, 0xb9, 0x79, 0x6d, 0x5a, 0xf1, 0xc0, + 0xd7, 0x10, 0x3d, 0xc5, 0x62, 0x8f, 0x55, 0xe5, + 0xdc, 0x48, 0x2e, 0xff, 0x00, 0xd6, 0xd7, 0x7b, + 0xa5, 0x50, 0xca, 0xe2, 0xf3, 0x78, 0xdb, 0x71, + 0x3c, 0xd7, 0x15, 0x61, 0x3c, 0x3b, 0x0f, 0x3a, + 0xc7, 0xb6, 0xb1, 0x8c, 0x01, 0x24, 0xbe, 0x3b, + 0xdd, 0xb6, 0xa7, 0x6a, 0xd8, 0xde, 0xe4, 0x2e, + 0x32, 0x1a, 0x5b, 0xca, 0x2e, 0x0d, 0x5e, 0x27, + 0x2c, 0xf7, 0x01, 0x58, 0xd1, 0xff, 0x00, 0x29, + 0x9d, 0xe0, 0xa0, 0xfb, 0x14, 0x1b, 0x85, 0x10, + 0xee, 0x2a, 0x14, 0xbb, 0x71, 0x41, 0x38, 0xa0, + 0x4e, 0x9e, 0xca, 0x81, 0xb7, 0xc6, 0xdd, 0xd0, + 0xbd, 0xf1, 0x1a, 0xb6, 0xde, 0xcf, 0x1d, 0x15, + 0xb3, 0xe2, 0x71, 0x74, 0x63, 0x69, 0xa6, 0xc5, + 0x97, 0xa1, 0x58, 0xd9, 0x21, 0xbc, 0x63, 0xc7, + 0x13, 0x5c, 0xfa, 0x10, 0x77, 0x6e, 0x0a, 0xc3, + 0x3d, 0x96, 0x2a, 0xde, 0x27, 0x4b, 0x2c, 0x51, + 0xb2, 0x36, 0x0a, 0xb9, 0xc4, 0x01, 0x44, 0x1a, + 0x01, 0xad, 0xed, 0x7b, 0x17, 0x74, 0x2f, 0x93, + 0xae, 0x6c, 0x46, 0xf6, 0x10, 0xab, 0x3a, 0xb3, + 0xda, 0x26, 0x2e, 0xdb, 0xac, 0xb2, 0xc3, 0x40, + 0xc9, 0x1f, 0xb4, 0x3a, 0x6a, 0x0a, 0x7b, 0x8a, + 0x97, 0x87, 0xc6, 0x67, 0xb5, 0x0d, 0xe7, 0x0d, + 0xa0, 0x7b, 0x84, 0x86, 0xaf, 0x93, 0x90, 0x0a, + 0xed, 0x41, 0xd4, 0xef, 0xf5, 0xa5, 0x95, 0xcd, + 0x94, 0xd6, 0xcc, 0x69, 0xe3, 0x91, 0xb4, 0x0b, + 0x65, 0xa4, 0x3e, 0xe5, 0x67, 0x7c, 0xad, 0x4e, + 0x3f, 0x42, 0x5a, 0x60, 0xf1, 0x33, 0xdc, 0x4e, + 0xf3, 0x3d, 0xd9, 0x8c, 0xf1, 0x38, 0xee, 0x07, + 0xb8, 0xb6, 0xfa, 0x43, 0x6e, 0x15, 0xbf, 0x38, + 0xa0, 0xdc, 0x9e, 0x45, 0x0a, 0x4a, 0x84, 0x12, + 0x11, 0x42, 0x9a, 0xaa, 0x2a, 0xda, 0xe7, 0xe2, + 0xda, 0xfc, 0xf5, 0xaf, 0x1f, 0x14, 0x77, 0x82, + 0xd8, 0x6b, 0x9f, 0x8b, 0x6b, 0xf3, 0xd6, 0xbc, + 0x7c, 0x51, 0xde, 0x08, 0x08, 0xef, 0x88, 0xee, + 0xf2, 0x23, 0xbe, 0x23, 0xbb, 0xc8, 0x36, 0x7a, + 0x23, 0xf9, 0x17, 0x5f, 0x39, 0x59, 0xc6, 0xf0, + 0xa8, 0xda, 0x6f, 0x3d, 0x69, 0x8c, 0x8e, 0x78, + 0xe7, 0x04, 0x97, 0xb8, 0xd2, 0x8b, 0x74, 0x35, + 0xa6, 0x36, 0xbf, 0xcb, 0x77, 0x42, 0x0d, 0x1e, + 0x5b, 0xf3, 0x24, 0xbf, 0x34, 0x2f, 0x3b, 0x8b, + 0xa8, 0xed, 0xdb, 0x57, 0x1a, 0xbb, 0x91, 0xab, + 0xc2, 0xfa, 0xee, 0x4c, 0x86, 0x61, 0xf3, 0x58, + 0xc6, 0xe7, 0x19, 0x76, 0x34, 0x00, 0xac, 0x78, + 0x6d, 0x1e, 0xc6, 0xf0, 0xdd, 0x64, 0x8f, 0x1c, + 0xbb, 0xf8, 0x0e, 0xe0, 0x92, 0x35, 0x38, 0x9c, + 0x0d, 0xf6, 0x6a, 0x41, 0x35, 0xc5, 0x62, 0xb5, + 0x69, 0xdd, 0xb8, 0x95, 0x77, 0xb1, 0xc6, 0xda, + 0x58, 0x44, 0x23, 0xb7, 0x60, 0x68, 0x68, 0xda, + 0xee, 0x52, 0xbd, 0x64, 0x7c, 0x16, 0xb0, 0x71, + 0x38, 0x88, 0xa2, 0x60, 0xef, 0x2a, 0x86, 0x53, + 0x54, 0xde, 0x5f, 0xca, 0xeb, 0x2c, 0x4b, 0x4f, + 0x0e, 0xe7, 0x48, 0x14, 0x1b, 0x8c, 0xd6, 0xa3, + 0x86, 0xce, 0xb6, 0xf6, 0xd4, 0x96, 0xe0, 0xec, + 0x14, 0xda, 0x01, 0x2a, 0xb8, 0xcb, 0x59, 0xae, + 0x64, 0xf2, 0x8b, 0xe7, 0x97, 0xb8, 0xed, 0xe1, + 0x5e, 0x0c, 0xc0, 0x65, 0xda, 0x7a, 0xe2, 0xea, + 0xc9, 0xbc, 0xd5, 0x19, 0x91, 0xba, 0xb5, 0x9b, + 0xa8, 0xbf, 0x61, 0x6d, 0x76, 0x07, 0x72, 0x20, + 0xd9, 0x80, 0x1a, 0x28, 0xdd, 0x80, 0x6e, 0xa2, + 0x20, 0xa1, 0x00, 0x8d, 0xa0, 0x8a, 0x82, 0xa4, + 0x04, 0x1a, 0xfc, 0xd4, 0x65, 0xd6, 0xa2, 0x46, + 0x8a, 0xba, 0x37, 0x07, 0x7b, 0x8b, 0x7d, 0x8d, + 0xb9, 0x6d, 0xd5, 0x84, 0x53, 0x34, 0xef, 0x68, + 0x07, 0xbe, 0x16, 0xbd, 0xec, 0x0f, 0x63, 0x98, + 0xe1, 0x56, 0xb8, 0x50, 0xac, 0x0c, 0x75, 0xf4, + 0x98, 0x5b, 0xb3, 0x6d, 0x3e, 0xdb, 0x59, 0x0d, + 0x5a, 0x4f, 0x22, 0x0b, 0x42, 0x2f, 0x98, 0xe6, + 0x86, 0x66, 0x87, 0x44, 0xf0, 0x5a, 0x76, 0x85, + 0xe5, 0x77, 0x7f, 0x6b, 0x67, 0x19, 0x92, 0x57, + 0x81, 0x4d, 0xc3, 0x9c, 0xa0, 0xd6, 0xea, 0x99, + 0xc3, 0x2d, 0x23, 0xb6, 0x07, 0xc7, 0x9d, 0xc0, + 0x1e, 0xf1, 0x5e, 0xce, 0xcb, 0xcc, 0x2d, 0x60, + 0xc4, 0xe2, 0x5b, 0xc7, 0x23, 0x58, 0x1a, 0xf9, + 0x06, 0xe0, 0x68, 0xb5, 0x96, 0xb8, 0xdc, 0x8e, + 0xa3, 0xbe, 0xf2, 0xa7, 0x83, 0x1d, 0xab, 0x4d, + 0x1a, 0x4f, 0x37, 0x71, 0x5d, 0x31, 0x78, 0x7b, + 0x4c, 0x74, 0x5c, 0x10, 0xb6, 0xae, 0x3f, 0x19, + 0xe7, 0x79, 0x28, 0x3e, 0xf1, 0x50, 0x5d, 0x41, + 0x66, 0xc8, 0xee, 0xdf, 0xc7, 0x30, 0x1e, 0x31, + 0xde, 0xb3, 0x14, 0x29, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x15, 0x3c, 0xdf, 0xe6, 0x9b, 0x0e, 0xfc, + 0x7f, 0xbc, 0xad, 0x63, 0x95, 0x55, 0x33, 0x7f, + 0x9a, 0x6c, 0x7b, 0xf1, 0xfe, 0xf2, 0xb5, 0x8e, + 0x54, 0x12, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x0a, 0xa5, 0xaa, 0xfe, 0xfb, 0xc7, 0x77, + 0x9b, 0xfd, 0xc0, 0xad, 0xaa, 0xa5, 0xaa, 0xfe, + 0xfa, 0xc7, 0x77, 0x9b, 0xfd, 0xc0, 0x82, 0xd9, + 0xca, 0xa5, 0x42, 0x94, 0x1f, 0x2f, 0x70, 0x6b, + 0x4b, 0x9c, 0x68, 0x06, 0xd2, 0x4a, 0xae, 0xe5, + 0xf5, 0x7d, 0xad, 0xaf, 0x14, 0x16, 0x9f, 0xc6, + 0x9c, 0xec, 0x14, 0xdc, 0x0a, 0xde, 0x5f, 0xc0, + 0x6e, 0x2c, 0xe5, 0x84, 0x1a, 0x17, 0xb4, 0x80, + 0x42, 0xe6, 0xb6, 0x70, 0x88, 0x64, 0x9a, 0x27, + 0x8f, 0xe2, 0xc6, 0xe2, 0x09, 0x3b, 0x77, 0x20, + 0xf4, 0x9d, 0xf7, 0xf9, 0x39, 0x7a, 0xeb, 0xe9, + 0x09, 0x6e, 0xf0, 0xca, 0xec, 0x5e, 0xac, 0x8d, + 0xb1, 0xb7, 0x85, 0xa0, 0x00, 0x39, 0x57, 0xcd, + 0xc5, 0xc4, 0x56, 0xec, 0xe3, 0x94, 0xd0, 0x2d, + 0x45, 0xcd, 0xe6, 0x42, 0xee, 0x29, 0x24, 0xb6, + 0x89, 0xcd, 0xb5, 0x67, 0xc6, 0x91, 0x06, 0x7d, + 0xd6, 0x5a, 0xda, 0xdc, 0x11, 0x5e, 0x37, 0xf3, + 0x05, 0xa3, 0xba, 0xc9, 0x5c, 0xcf, 0x23, 0x5e, + 0x4f, 0x0b, 0x5a, 0x6b, 0xc2, 0x16, 0x2d, 0x49, + 0xda, 0x4d, 0x4f, 0x3a, 0x20, 0xb6, 0xdb, 0xbd, + 0xb7, 0x36, 0xcd, 0x70, 0xda, 0x1c, 0x36, 0xf7, + 0xd7, 0x8d, 0x89, 0xea, 0xe4, 0x7d, 0xbb, 0xb7, + 0x8d, 0xa1, 0x63, 0x60, 0x67, 0x2f, 0x85, 0xd0, + 0x1d, 0xec, 0xdc, 0xbd, 0x6f, 0x78, 0xa1, 0xb9, + 0x8e, 0x71, 0xb8, 0xec, 0x2b, 0x39, 0xe5, 0x18, + 0xc5, 0xce, 0xd8, 0xe2, 0xef, 0xe9, 0xb4, 0x3e, + 0xfe, 0x73, 0xa7, 0x75, 0x78, 0xcc, 0xfb, 0x6b, + 0x6d, 0x33, 0xea, 0xbe, 0x3e, 0x2b, 0xfb, 0x87, + 0x62, 0xfa, 0x1b, 0x40, 0x23, 0x95, 0x43, 0x9a, + 0x48, 0xd8, 0xb5, 0xe8, 0xb3, 0x8c, 0x35, 0x33, + 0xd1, 0xca, 0x76, 0x65, 0xb3, 0xbb, 0x2d, 0xde, + 0xe7, 0xcb, 0xd7, 0xd3, 0xca, 0x30, 0x9a, 0x8f, + 0xea, 0x68, 0xe5, 0xf7, 0x74, 0xe3, 0x9f, 0x3c, + 0x59, 0x9a, 0x56, 0xec, 0xd8, 0xe6, 0x9f, 0x6c, + 0xed, 0x91, 0xdc, 0x8d, 0x9d, 0xf5, 0x7c, 0x5c, + 0xc6, 0x72, 0xe8, 0x66, 0x82, 0xe9, 0xa6, 0x8e, + 0x89, 0xe0, 0x92, 0x39, 0x97, 0x49, 0xb5, 0x99, + 0xb3, 0xdb, 0xc7, 0x2b, 0x4d, 0x43, 0xda, 0x0a, + 0xb3, 0xbd, 0xec, 0x89, 0xb8, 0x89, 0xe7, 0x0f, + 0x65, 0x14, 0x52, 0x8a, 0x2a, 0x28, 0xa5, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x79, 0xcf, 0x28, 0x86, 0x17, 0xca, 0x76, 0x86, + 0x02, 0x69, 0xde, 0x5c, 0xc7, 0x31, 0xab, 0x72, + 0x99, 0x39, 0x5d, 0x0b, 0x38, 0xa0, 0xb7, 0xe2, + 0xa5, 0x06, 0xc3, 0x45, 0xd3, 0xe5, 0x01, 0xd1, + 0xb8, 0x1d, 0xa0, 0x83, 0x50, 0xaa, 0xc7, 0x1d, + 0x05, 0x4f, 0xfc, 0x7d, 0xe7, 0x99, 0x06, 0x82, + 0xc2, 0xff, 0x00, 0x4f, 0xd8, 0xc4, 0xd2, 0x21, + 0x2f, 0xb8, 0x3f, 0x1e, 0x43, 0xb7, 0x6a, 0xcf, + 0xf5, 0xb2, 0xc6, 0x94, 0xa3, 0xa9, 0xcd, 0xb5, + 0x67, 0xfa, 0x36, 0xdf, 0xcd, 0xfd, 0xe5, 0x1e, + 0x8c, 0xb7, 0xf3, 0x71, 0xd0, 0x83, 0x03, 0xd6, + 0x9c, 0x7f, 0xc8, 0x3d, 0x08, 0xed, 0x59, 0x64, + 0xd6, 0x92, 0xd6, 0x12, 0x46, 0xe1, 0x45, 0xb0, + 0x18, 0xdb, 0x7f, 0x37, 0x1d, 0x0b, 0xe2, 0x5c, + 0x7d, 0xbf, 0x56, 0xfe, 0x1b, 0x7d, 0xb4, 0xd9, + 0xb1, 0x05, 0x5a, 0xee, 0xea, 0xf7, 0x2d, 0x2f, + 0x1c, 0xa4, 0xb2, 0xdf, 0x91, 0xab, 0x69, 0x88, + 0xd3, 0xf7, 0x17, 0x34, 0x10, 0x33, 0xab, 0x88, + 0x7e, 0xd9, 0x5b, 0x4c, 0x36, 0x98, 0x92, 0x67, + 0x75, 0xd7, 0x63, 0x82, 0x20, 0x6a, 0xd8, 0xf9, + 0xfb, 0xea, 0xdb, 0x14, 0x31, 0xc2, 0xc1, 0x1c, + 0x6d, 0x0d, 0x68, 0xe4, 0x0a, 0x8e, 0x77, 0x93, + 0xf6, 0x57, 0x73, 0x91, 0x98, 0xbe, 0x5b, 0xd2, + 0x19, 0xfb, 0x2d, 0x1b, 0x96, 0x17, 0xe8, 0xb0, + 0xf3, 0xb3, 0xef, 0x2e, 0xaa, 0x8a, 0x0e, 0x55, + 0xfa, 0x2c, 0x3c, 0xec, 0xfb, 0xc9, 0xfa, 0x2d, + 0xff, 0x00, 0xf5, 0x67, 0xde, 0x5d, 0x55, 0x10, + 0x72, 0xaf, 0xd1, 0x61, 0xe7, 0x67, 0xde, 0x4f, + 0xd1, 0x61, 0xe7, 0x67, 0xde, 0x5d, 0x55, 0x10, + 0x72, 0xaf, 0xd1, 0x61, 0xe7, 0x67, 0xde, 0x4f, + 0xd1, 0x61, 0xe7, 0x67, 0xde, 0x5d, 0x55, 0x10, + 0x72, 0xaf, 0xd1, 0x61, 0xe7, 0x67, 0xde, 0x4f, + 0xd1, 0x6f, 0xff, 0x00, 0xab, 0x3e, 0xf2, 0xea, + 0xa8, 0x83, 0x95, 0x7e, 0x8b, 0x0f, 0x3b, 0x3e, + 0xf2, 0x7e, 0x8b, 0x0f, 0x3b, 0x3e, 0xf2, 0xea, + 0xa8, 0x83, 0x95, 0x7e, 0x8b, 0x0f, 0x3b, 0x3e, + 0xf2, 0x7e, 0x8b, 0x0f, 0x3b, 0x3e, 0xf2, 0xea, + 0xa8, 0x83, 0x95, 0x7e, 0x8b, 0x0f, 0x3b, 0x3e, + 0xf2, 0x7e, 0x8b, 0x7f, 0xfd, 0x59, 0xf7, 0x97, + 0x55, 0x44, 0x1c, 0xab, 0xf4, 0x58, 0x79, 0xd9, + 0xf7, 0x93, 0xf4, 0x58, 0x79, 0xd9, 0xf7, 0x97, + 0x55, 0x44, 0x1c, 0xab, 0xf4, 0x58, 0x79, 0xd9, + 0xf7, 0x93, 0xf4, 0x58, 0x79, 0xd9, 0xf7, 0x97, + 0x55, 0x44, 0x1c, 0xab, 0xf4, 0x58, 0x79, 0xd9, + 0xf7, 0x93, 0xf4, 0x58, 0x79, 0xd9, 0xf7, 0x97, + 0x55, 0x44, 0x1c, 0xab, 0xf4, 0x58, 0x79, 0xd9, + 0xf7, 0x93, 0xf4, 0x58, 0x79, 0xd9, 0xf7, 0x97, + 0x55, 0x44, 0x1c, 0xab, 0xf4, 0x58, 0x79, 0xd9, + 0xf7, 0x93, 0xf4, 0x58, 0x79, 0xd9, 0xf7, 0x97, + 0x55, 0x44, 0x1c, 0xab, 0xf4, 0x58, 0x79, 0xd9, + 0xf7, 0x93, 0xf4, 0x5b, 0xff, 0x00, 0xea, 0xcf, + 0xbc, 0xba, 0xaa, 0x20, 0xe5, 0x5f, 0xa2, 0xc3, + 0xce, 0xcf, 0xbc, 0xa4, 0x7b, 0x1a, 0x31, 0x82, + 0xe6, 0xdd, 0x9d, 0xdb, 0xb6, 0x50, 0xae, 0xa8, + 0xa0, 0xa0, 0xfc, 0xcd, 0x93, 0xc7, 0xcd, 0x8d, + 0xbf, 0x9a, 0xca, 0x66, 0xd1, 0xd1, 0x38, 0x8f, + 0x71, 0x62, 0xd1, 0x75, 0x2f, 0x6b, 0xfa, 0x75, + 0x9c, 0x30, 0xe6, 0x6d, 0x99, 0xc2, 0x58, 0x0b, + 0x6e, 0x28, 0x36, 0x1a, 0x9d, 0xe5, 0x72, 0xda, + 0xa0, 0x22, 0x27, 0xc2, 0x80, 0x84, 0x04, 0x5b, + 0xbd, 0x37, 0xa4, 0x72, 0xda, 0x86, 0x76, 0x8b, + 0x66, 0x16, 0x5b, 0xd7, 0xc7, 0x99, 0xdb, 0x05, + 0x39, 0x68, 0x82, 0xfb, 0xec, 0x8f, 0x53, 0x19, + 0xa0, 0x7e, 0x12, 0xe1, 0xc5, 0xcf, 0x8a, 0xa6, + 0x13, 0xfe, 0xd5, 0xd2, 0x64, 0x8d, 0xb2, 0x46, + 0xe8, 0xdd, 0xb5, 0xaf, 0x05, 0xa7, 0xdd, 0x5a, + 0x1d, 0x2d, 0xa3, 0x71, 0x7a, 0x72, 0x11, 0xd4, + 0x33, 0x8e, 0xe8, 0x8f, 0xe2, 0x4c, 0x77, 0x9a, + 0xf3, 0x2b, 0x02, 0x0e, 0x71, 0xa8, 0xf4, 0x2d, + 0x8e, 0x17, 0x15, 0x26, 0x5b, 0x1a, 0x09, 0xbd, + 0xb6, 0x9c, 0x5c, 0xf1, 0xff, 0x00, 0xb6, 0xbb, + 0x5a, 0x16, 0xf7, 0x3d, 0x1b, 0x35, 0x1e, 0x8b, + 0xf2, 0xbb, 0x62, 0x1d, 0x2f, 0x54, 0xdb, 0x98, + 0x5d, 0xcc, 0xf6, 0x00, 0xef, 0xf2, 0x56, 0x5b, + 0xbb, 0x78, 0xee, 0xad, 0xa5, 0xb6, 0x94, 0x55, + 0x93, 0x34, 0xb1, 0xc3, 0xb8, 0x45, 0x17, 0x13, + 0xc9, 0x6a, 0xbc, 0xce, 0x0a, 0xca, 0xe3, 0x4a, + 0x44, 0x3a, 0xa6, 0x5b, 0xc8, 0xf6, 0xf5, 0xbf, + 0xb5, 0xd5, 0xb8, 0x92, 0x07, 0xbe, 0x82, 0xf9, + 0x80, 0xf6, 0x8b, 0x88, 0xb9, 0x8f, 0x1f, 0x8f, + 0x79, 0x71, 0xbc, 0x95, 0xa2, 0x39, 0x39, 0x9a, + 0xe6, 0x8a, 0x1a, 0xad, 0xbe, 0xb5, 0xce, 0x0c, + 0x2e, 0x9e, 0xb9, 0xbb, 0x69, 0xfe, 0x2b, 0x9b, + 0xd5, 0xc5, 0xf3, 0x9d, 0xb2, 0xab, 0x87, 0x69, + 0xdc, 0x5e, 0x57, 0x25, 0x94, 0x83, 0xd1, 0xd1, + 0xba, 0x49, 0x19, 0x23, 0x5e, 0x64, 0xa6, 0xc1, + 0xb4, 0x12, 0x4a, 0xe8, 0x1e, 0xd7, 0xee, 0x2e, + 0x22, 0xc3, 0xe3, 0xad, 0x24, 0x35, 0x2e, 0x3f, + 0xc5, 0xa6, 0xe2, 0x43, 0x42, 0x0e, 0x5b, 0x23, + 0xdf, 0x24, 0x8e, 0x95, 0xe4, 0xb9, 0xef, 0x71, + 0x73, 0x9c, 0x77, 0x92, 0x77, 0xac, 0xc0, 0x7c, + 0x41, 0xde, 0x58, 0x27, 0xde, 0x59, 0xa0, 0xf8, + 0xa1, 0x54, 0x94, 0xd5, 0x6f, 0x74, 0x5e, 0xa3, + 0x93, 0x03, 0x99, 0x8e, 0x42, 0x7f, 0xe2, 0xce, + 0x78, 0x27, 0x15, 0xd9, 0x43, 0xcb, 0xee, 0x2d, + 0x01, 0xde, 0xbe, 0x5d, 0xb4, 0x20, 0xe8, 0xfe, + 0xd3, 0xb4, 0xe8, 0x91, 0xb1, 0x6a, 0x5c, 0x68, + 0xe2, 0x69, 0x0d, 0xeb, 0xb8, 0x39, 0x8e, 0xd0, + 0xf5, 0x83, 0x92, 0xbe, 0xc3, 0x66, 0x74, 0x85, + 0xad, 0xde, 0x6e, 0x4e, 0xaf, 0x27, 0x6d, 0x58, + 0xe1, 0x0d, 0xda, 0xf7, 0x8a, 0x6c, 0xaa, 0x8b, + 0x4f, 0x68, 0x4e, 0xc6, 0xe9, 0x58, 0x71, 0xac, + 0xa5, 0xdd, 0xf3, 0x81, 0x6f, 0xf1, 0x28, 0x5a, + 0xc6, 0x72, 0x57, 0xba, 0xa8, 0xf7, 0x13, 0xc9, + 0x71, 0x2b, 0xa7, 0x94, 0xd5, 0xee, 0x35, 0xa6, + 0xe0, 0x2b, 0xcc, 0x02, 0x0f, 0x82, 0x6b, 0xbf, + 0x6a, 0x82, 0x42, 0x82, 0x54, 0x55, 0x15, 0x24, + 0xec, 0x50, 0x4a, 0x8a, 0x85, 0x15, 0xa2, 0x90, + 0x04, 0xaf, 0x92, 0x68, 0xbe, 0x98, 0xd9, 0x25, + 0x7b, 0x63, 0x8d, 0xa5, 0xcf, 0x79, 0x01, 0xad, + 0x02, 0xa4, 0x92, 0xb2, 0xef, 0xb1, 0x59, 0x1c, + 0x3c, 0xb1, 0xba, 0xf6, 0x17, 0x44, 0xe3, 0x47, + 0xb7, 0x8d, 0xbb, 0x39, 0xd2, 0x46, 0xfb, 0x47, + 0xe8, 0x1c, 0x8e, 0xa1, 0x91, 0x97, 0x32, 0x8e, + 0xa3, 0x1e, 0xd3, 0xe3, 0x3d, 0xdb, 0x1c, 0xe1, + 0xfe, 0xd0, 0xbb, 0x4e, 0x1b, 0x09, 0x8f, 0xc3, + 0x5a, 0x32, 0xd2, 0xc2, 0x26, 0xc5, 0x1b, 0x06, + 0xd2, 0x37, 0x9e, 0xe9, 0x3b, 0xd5, 0x6b, 0x41, + 0x6b, 0x7c, 0x7e, 0x5e, 0xd1, 0x96, 0x52, 0x06, + 0x5b, 0xdd, 0xc4, 0xd0, 0x38, 0x05, 0x1a, 0x1d, + 0xdd, 0x14, 0x57, 0x4a, 0xa0, 0x29, 0x44, 0x40, + 0x5f, 0x12, 0xc8, 0xd8, 0xda, 0x5c, 0xef, 0x71, + 0x25, 0x91, 0x91, 0x30, 0xbd, 0xe6, 0x8d, 0x6e, + 0xd2, 0xb4, 0xd7, 0x19, 0x68, 0x9e, 0xea, 0x8d, + 0xad, 0x1b, 0x82, 0x0c, 0xa9, 0x2e, 0x25, 0x79, + 0xdf, 0xc2, 0x17, 0x93, 0xdd, 0x46, 0x39, 0xc4, + 0xd6, 0x80, 0x9d, 0xbd, 0xe5, 0x82, 0xfc, 0xa1, + 0x1f, 0x15, 0xab, 0xc2, 0x4b, 0xe9, 0xa4, 0xa8, + 0xdc, 0xd3, 0xb0, 0x84, 0x14, 0x9b, 0x97, 0x89, + 0x2e, 0xa6, 0x7f, 0x3b, 0x8f, 0xc2, 0xb7, 0x5a, + 0x6a, 0xdc, 0xdc, 0x59, 0xdf, 0x45, 0x03, 0x83, + 0x6e, 0x9e, 0xca, 0x30, 0x72, 0xd1, 0x6b, 0xf2, + 0xf6, 0x26, 0xda, 0x77, 0x48, 0xd1, 0xe2, 0x3b, + 0x6f, 0x4a, 0xc6, 0xb4, 0xbd, 0x9a, 0xc6, 0xe5, + 0x97, 0x30, 0x3b, 0x85, 0xec, 0x3b, 0x7b, 0xa1, + 0x49, 0x8b, 0x89, 0x8e, 0x6d, 0x69, 0xe7, 0x38, + 0x67, 0x8e, 0x71, 0x11, 0x33, 0x8c, 0xf9, 0xa2, + 0xfa, 0x36, 0x58, 0x8b, 0xfb, 0x8b, 0x29, 0x9f, + 0x88, 0xc9, 0xb4, 0xba, 0x19, 0x2a, 0xde, 0x13, + 0xb6, 0x8e, 0xe4, 0x21, 0x74, 0x0c, 0x33, 0x89, + 0xc7, 0xc6, 0xda, 0xd4, 0xb7, 0x67, 0x42, 0xaf, + 0xc3, 0x77, 0x81, 0xcd, 0x44, 0xdb, 0xf9, 0x8b, + 0x62, 0xba, 0xb7, 0x04, 0xb8, 0x1d, 0xe4, 0xd1, + 0x6e, 0xf4, 0xfb, 0x9c, 0xfc, 0x73, 0x25, 0x23, + 0xe3, 0x92, 0x47, 0x79, 0x63, 0x4f, 0x1c, 0xb1, + 0xb8, 0x99, 0xb8, 0x7a, 0xbd, 0x7f, 0xa9, 0xd2, + 0xf5, 0x39, 0x61, 0xab, 0x86, 0x1f, 0x6f, 0x3c, + 0xa3, 0xfa, 0x91, 0x55, 0x16, 0xd9, 0x1a, 0xd0, + 0xf7, 0x97, 0x3a, 0x9e, 0xe6, 0x08, 0xbd, 0x35, + 0x0b, 0xdd, 0xc3, 0x24, 0xae, 0xf1, 0x07, 0x3d, + 0x17, 0x45, 0x35, 0xe1, 0x3b, 0x17, 0x36, 0xb9, + 0xb0, 0x82, 0xe2, 0x5c, 0xbd, 0xcb, 0xff, 0x00, + 0x99, 0x03, 0x87, 0x0f, 0xba, 0x56, 0xb2, 0xf3, + 0x57, 0xe5, 0xae, 0xf7, 0x0f, 0x4f, 0x8e, 0x84, + 0xe7, 0xfd, 0x79, 0xcb, 0x1c, 0x6b, 0x67, 0x93, + 0x7d, 0xaa, 0x7a, 0x8e, 0x19, 0x2e, 0x6c, 0x23, + 0x8e, 0x11, 0xc6, 0xe0, 0xfa, 0x90, 0x39, 0x96, + 0xe0, 0x4a, 0xcf, 0x46, 0xdb, 0x47, 0x5f, 0x1d, + 0x91, 0x46, 0x08, 0xe6, 0x20, 0xb6, 0xab, 0x53, + 0x9d, 0xb8, 0x92, 0xca, 0xc5, 0x93, 0x42, 0x7c, + 0x67, 0x3a, 0x85, 0x6c, 0xc4, 0x0c, 0xf2, 0x18, + 0x27, 0xdb, 0xc5, 0x2c, 0x6c, 0x71, 0xff, 0x00, + 0xe4, 0x5a, 0xb1, 0x7a, 0xdc, 0xb1, 0x7a, 0xfe, + 0xdf, 0xed, 0xbf, 0xdc, 0xd6, 0xf7, 0x42, 0xb5, + 0x2d, 0x95, 0xc3, 0xb3, 0x93, 0x4e, 0x19, 0x58, + 0xdc, 0xe3, 0x47, 0x77, 0x08, 0x56, 0x88, 0x64, + 0x60, 0x24, 0x93, 0x41, 0xd5, 0x30, 0x7b, 0xa0, + 0xaa, 0xe4, 0xb9, 0x4b, 0x86, 0xe5, 0xe4, 0xb4, + 0x07, 0xf8, 0x6c, 0x71, 0x03, 0xdc, 0x0a, 0xc1, + 0x15, 0xbb, 0x1e, 0x4d, 0x79, 0x18, 0xd7, 0x7b, + 0xa5, 0x2f, 0x5b, 0x96, 0x27, 0xdb, 0xfd, 0xb7, + 0xfb, 0x9a, 0xde, 0xe8, 0x6e, 0x19, 0x3c, 0x4e, + 0xd2, 0xce, 0x80, 0x1f, 0xe2, 0x36, 0x72, 0xe2, + 0xde, 0xe1, 0x25, 0x7a, 0x45, 0xfc, 0xa6, 0x77, + 0x82, 0xc7, 0x86, 0xd2, 0x38, 0xf4, 0xd3, 0xee, + 0x9b, 0xfc, 0xc7, 0xcd, 0xc0, 0x7b, 0xc0, 0xac, + 0x98, 0xb6, 0xc4, 0xce, 0xf0, 0x5d, 0x31, 0xba, + 0x8b, 0xde, 0xf1, 0xeb, 0x46, 0x94, 0x67, 0x3f, + 0x66, 0x66, 0x74, 0xf8, 0x79, 0xb7, 0xa5, 0x49, + 0xdc, 0x54, 0x29, 0x3b, 0x8a, 0xae, 0x68, 0xc1, + 0xea, 0x4c, 0x6e, 0x9f, 0xb4, 0xbb, 0x9a, 0xf5, + 0xe1, 0xae, 0x73, 0x89, 0x8d, 0x9c, 0xae, 0x54, + 0xad, 0x53, 0xaf, 0xb2, 0xba, 0x8a, 0x57, 0x5a, + 0xdb, 0xd6, 0x2b, 0x57, 0x1a, 0x36, 0x36, 0x56, + 0xa5, 0x33, 0x78, 0x8b, 0xfc, 0xc6, 0x4e, 0x2b, + 0x5b, 0x28, 0xdd, 0x23, 0x89, 0x35, 0x3c, 0x83, + 0xbe, 0xaf, 0xfa, 0x3b, 0xd9, 0xad, 0x8e, 0x1c, + 0x32, 0xee, 0xfc, 0x0b, 0x8b, 0xcd, 0x86, 0x84, + 0x6c, 0x69, 0x41, 0x4c, 0xd2, 0x9e, 0xcc, 0x72, + 0x59, 0x27, 0xc7, 0x71, 0x91, 0x06, 0x0b, 0x5d, + 0x8e, 0xe1, 0x3b, 0xdc, 0x17, 0x5f, 0xc5, 0xe1, + 0xec, 0x31, 0x36, 0xcd, 0xb6, 0xb3, 0x88, 0x46, + 0xc6, 0x8a, 0x54, 0x0d, 0xa7, 0xbe, 0xb3, 0x1a, + 0x00, 0x00, 0x01, 0x40, 0x37, 0x05, 0xf4, 0x83, + 0x03, 0x35, 0xf7, 0x55, 0xd7, 0xf4, 0xdd, 0xf0, + 0x2d, 0x56, 0x90, 0xd9, 0x85, 0x6f, 0xce, 0x2b, + 0x6b, 0x9b, 0x70, 0x18, 0xab, 0xa2, 0x4d, 0x3f, + 0x86, 0x7e, 0x05, 0xaa, 0xd2, 0x1f, 0x73, 0x37, + 0xe7, 0x14, 0x1b, 0x92, 0xa1, 0x4a, 0x84, 0x13, + 0x44, 0xa2, 0x85, 0x21, 0x58, 0x15, 0x6d, 0x73, + 0xf1, 0x2d, 0x7e, 0x7a, 0xd7, 0x8f, 0x8a, 0x3b, + 0xc1, 0x6c, 0x35, 0xcf, 0xc4, 0xb5, 0xf9, 0xeb, + 0x5e, 0xdd, 0xc3, 0xbc, 0x10, 0x11, 0xff, 0x00, + 0x15, 0xc4, 0xf3, 0x28, 0x91, 0xec, 0x8d, 0xbc, + 0x4f, 0x34, 0x01, 0x63, 0xc2, 0xcb, 0xdc, 0xb4, + 0xe2, 0xde, 0xcd, 0xa5, 0xb1, 0x9f, 0x8d, 0x26, + 0xe1, 0x44, 0x1b, 0x9d, 0x15, 0x63, 0x67, 0x75, + 0x05, 0xc3, 0xa7, 0x8d, 0xb2, 0x38, 0x3f, 0x61, + 0x21, 0x59, 0x7d, 0x0f, 0x8b, 0xe5, 0xb7, 0x6f, + 0x42, 0xf1, 0xc0, 0xe1, 0x62, 0xc3, 0xda, 0x98, + 0x9a, 0xee, 0x27, 0xbb, 0x6b, 0xc9, 0xe5, 0x2b, + 0x65, 0xb0, 0x0a, 0x9d, 0x8a, 0x0c, 0x78, 0x71, + 0xd6, 0x30, 0x3b, 0x8a, 0x18, 0x5a, 0xd7, 0x73, + 0x80, 0xbc, 0xb2, 0x39, 0x7b, 0x4c, 0x7b, 0x38, + 0xa7, 0x78, 0xe3, 0x3f, 0x15, 0x83, 0x7a, 0xc0, + 0xcc, 0xea, 0x58, 0x6c, 0xc1, 0x82, 0xdb, 0xf8, + 0xb7, 0x07, 0x9b, 0x70, 0x55, 0xd8, 0xad, 0xe6, + 0xbb, 0x9b, 0xca, 0xef, 0x9c, 0x5c, 0xf7, 0x6d, + 0xe1, 0xe6, 0x54, 0x78, 0xe6, 0xf2, 0xf9, 0x0c, + 0xb4, 0xcc, 0x85, 0xb5, 0x8e, 0x39, 0x0d, 0x18, + 0xc1, 0xca, 0x16, 0xf7, 0x15, 0x8c, 0x87, 0x1d, + 0x6e, 0xd6, 0x34, 0x03, 0x29, 0x00, 0xb9, 0xdd, + 0xd5, 0xa9, 0xc7, 0xc6, 0x27, 0xcf, 0x56, 0x9e, + 0x24, 0x2d, 0xd8, 0x3b, 0xaa, 0xc8, 0x77, 0xa0, + 0x54, 0xef, 0xaa, 0xc4, 0xc8, 0xe3, 0xa1, 0xc8, + 0x5b, 0xba, 0x29, 0x00, 0x0f, 0xa5, 0x58, 0xfe, + 0x50, 0x56, 0x52, 0x54, 0x8d, 0xc9, 0x02, 0xa7, + 0x8d, 0x6e, 0x4e, 0x59, 0x64, 0xb1, 0x87, 0x6c, + 0x90, 0x6f, 0xaf, 0x32, 0xd8, 0xfa, 0x2f, 0x50, + 0x0d, 0x9d, 0x5d, 0x57, 0xdc, 0x35, 0xb3, 0xd5, + 0xb1, 0x39, 0x9b, 0x1b, 0x72, 0x28, 0xe1, 0xcf, + 0x55, 0x74, 0x0a, 0x48, 0xa4, 0x7a, 0x33, 0x50, + 0x76, 0x4b, 0xca, 0xe3, 0x07, 0x9a, 0xb9, 0x67, + 0x04, 0xd0, 0x82, 0x39, 0x09, 0xe4, 0x57, 0xb7, + 0xc8, 0xc8, 0xda, 0x5d, 0x23, 0x83, 0x5a, 0x37, + 0x93, 0xb1, 0x56, 0x72, 0x5a, 0x82, 0x7b, 0xd9, + 0x8e, 0x3f, 0x12, 0x0b, 0x9e, 0xe3, 0x47, 0x4a, + 0x37, 0x04, 0x15, 0x29, 0x2d, 0x32, 0x36, 0x53, + 0xf9, 0x33, 0x24, 0x26, 0x4a, 0xd3, 0x84, 0x12, + 0xb7, 0xd8, 0x7d, 0x1f, 0x71, 0x72, 0xf6, 0xdc, + 0xe5, 0x1e, 0x4b, 0x06, 0xd1, 0x19, 0x5b, 0xcc, + 0x36, 0x9d, 0x8a, 0xce, 0x93, 0xdc, 0x9e, 0xba, + 0xe8, 0xed, 0x2e, 0x77, 0x21, 0x5b, 0xa5, 0x64, + 0x7c, 0x41, 0x04, 0x56, 0xf1, 0xb6, 0x28, 0x9a, + 0x1a, 0xc6, 0x8a, 0x00, 0x17, 0xa2, 0x22, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, 0xa7, + 0x9b, 0xfc, 0xd3, 0x61, 0xdf, 0x8f, 0xf7, 0x95, + 0xac, 0x72, 0xaa, 0xa6, 0x6f, 0xf3, 0x4d, 0x87, + 0x7e, 0x3f, 0xde, 0x56, 0xb1, 0xca, 0x82, 0x51, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x54, + 0xf5, 0x5f, 0xdf, 0x58, 0xfe, 0xf0, 0xfe, 0xe0, + 0x56, 0xc5, 0x52, 0xd5, 0x7f, 0x7d, 0x63, 0xbb, + 0xcd, 0xfe, 0xe0, 0x41, 0x6c, 0x52, 0xa3, 0x95, + 0x4a, 0x02, 0xa0, 0xea, 0x3b, 0x5f, 0x22, 0xce, + 0xf5, 0x8d, 0x1c, 0x31, 0xdc, 0x8a, 0xfb, 0xaa, + 0xfa, 0xab, 0x3a, 0xe2, 0xc4, 0xcb, 0x65, 0x1d, + 0xe3, 0x07, 0x8f, 0x6e, 0xed, 0xbd, 0xe4, 0x15, + 0x2c, 0xcd, 0xbb, 0xa7, 0xb2, 0x75, 0x37, 0xb3, + 0x6a, 0xdf, 0x68, 0x89, 0xad, 0xb2, 0x78, 0x19, + 0xf1, 0x8f, 0x6b, 0x7a, 0xc8, 0xc1, 0x6b, 0x87, + 0x2d, 0x0f, 0x2a, 0xd5, 0xc6, 0xe1, 0x3c, 0x00, + 0xf2, 0x3c, 0x50, 0xf4, 0x2c, 0x1d, 0x35, 0x76, + 0xec, 0x3e, 0xa5, 0x6c, 0x44, 0xd2, 0x29, 0x8f, + 0x03, 0xb9, 0x90, 0x69, 0x6f, 0xad, 0x24, 0xb2, + 0xbe, 0x9a, 0xd1, 0xe2, 0x8e, 0x8d, 0xe4, 0x01, + 0xcb, 0x4e, 0x45, 0xb3, 0xc2, 0xe9, 0x4c, 0xa6, + 0x55, 0xe1, 0xdc, 0x1d, 0x4c, 0x1c, 0xaf, 0x76, + 0xc5, 0xb8, 0xf6, 0x81, 0x69, 0x6f, 0x6d, 0x93, + 0xb7, 0xc8, 0xc6, 0x43, 0x9e, 0xf2, 0x0c, 0x91, + 0xf3, 0xd1, 0x78, 0x5f, 0x6a, 0x9c, 0xee, 0x42, + 0xd5, 0xb1, 0xe3, 0xad, 0x9d, 0x0d, 0xbd, 0x29, + 0xd6, 0x46, 0xde, 0x6d, 0x88, 0x35, 0x2e, 0x84, + 0x62, 0x33, 0x6e, 0xb4, 0x0f, 0x12, 0x35, 0xa4, + 0x37, 0x8c, 0x6e, 0x2b, 0x6f, 0x77, 0x10, 0x9a, + 0xdd, 0xcd, 0x1b, 0xc6, 0xd6, 0xaa, 0xcc, 0xb6, + 0xf9, 0x2e, 0x2e, 0xb2, 0x68, 0x5f, 0xc5, 0x5a, + 0x97, 0x10, 0xac, 0x98, 0xfb, 0x8f, 0x28, 0xb4, + 0x63, 0xc7, 0xc6, 0x02, 0x85, 0x4c, 0xa2, 0x32, + 0x89, 0xc6, 0x77, 0x65, 0x14, 0xde, 0x96, 0xa6, + 0x5a, 0x7a, 0x98, 0xea, 0x63, 0xbf, 0x09, 0xf3, + 0x47, 0x77, 0x04, 0xd9, 0xf5, 0x8d, 0xb6, 0x68, + 0x90, 0x78, 0xc1, 0x7b, 0x92, 0x1a, 0x38, 0x9d, + 0xb0, 0x0e, 0x55, 0x8d, 0x79, 0x7f, 0x0d, 0xa3, + 0x7c, 0x73, 0x57, 0x7c, 0x91, 0xbd, 0x68, 0xaf, + 0x32, 0xb3, 0xdc, 0x8e, 0x11, 0xe2, 0xb0, 0xf2, + 0x26, 0x38, 0xc4, 0x57, 0x3a, 0xab, 0x4d, 0x5c, + 0xfe, 0xe6, 0xa6, 0x5a, 0x93, 0x8c, 0x44, 0xe7, + 0x37, 0x51, 0xba, 0x2d, 0xbf, 0x32, 0x43, 0x77, + 0x14, 0x8d, 0x8c, 0xf1, 0x53, 0x62, 0xb6, 0x68, + 0xab, 0xff, 0x00, 0x28, 0xc6, 0x9b, 0x77, 0x9a, + 0xc9, 0x6e, 0xee, 0x13, 0xde, 0x5c, 0xeb, 0x07, + 0x72, 0x22, 0xb9, 0x30, 0x9f, 0x8b, 0x22, 0xb3, + 0xe9, 0xab, 0xaf, 0x47, 0xe7, 0x0c, 0x4e, 0x34, + 0x8e, 0xe4, 0x6e, 0xee, 0xaa, 0xcb, 0xa0, 0x22, + 0x85, 0x28, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x22, 0x8a, 0x38, 0x1b, + 0xcc, 0x17, 0xd2, 0x20, 0x8e, 0x16, 0xf3, 0x05, + 0x1c, 0x2d, 0xe6, 0x0b, 0xe9, 0x10, 0x7c, 0xf0, + 0x37, 0x98, 0x74, 0x27, 0x56, 0xcf, 0x92, 0x3a, + 0x17, 0xd2, 0x20, 0x80, 0x00, 0xdc, 0xa5, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x62, 0x64, + 0xf1, 0xb6, 0xf9, 0x3b, 0x19, 0x6c, 0xae, 0x47, + 0x14, 0x52, 0x8e, 0x13, 0x55, 0xf9, 0xd3, 0x3d, + 0x8c, 0x76, 0x27, 0x2f, 0x73, 0x60, 0x47, 0x8b, + 0x0b, 0xdc, 0x18, 0x4f, 0x2b, 0x6b, 0xb1, 0x7e, + 0x95, 0x2b, 0x9a, 0x7b, 0x56, 0xd2, 0xac, 0x7d, + 0xb3, 0xb3, 0x70, 0x7c, 0x78, 0xe8, 0x1e, 0xd0, + 0x37, 0x84, 0x1c, 0x9d, 0x3f, 0xc5, 0x50, 0x12, + 0x88, 0x3d, 0x6d, 0xa5, 0x8e, 0x1b, 0x88, 0xa5, + 0x95, 0xbc, 0x71, 0xb1, 0xc0, 0xbd, 0x87, 0x94, + 0x0e, 0x4d, 0x8b, 0xb9, 0xe9, 0x9d, 0x61, 0xa5, + 0x27, 0xb0, 0x8a, 0x3b, 0x69, 0x63, 0xb3, 0x70, + 0x00, 0x18, 0x5d, 0x46, 0x90, 0x79, 0x57, 0x07, + 0x50, 0x09, 0x06, 0xa0, 0x91, 0xde, 0xd8, 0x83, + 0xf5, 0x0c, 0x33, 0xc5, 0x33, 0x04, 0x90, 0xbd, + 0xb2, 0x30, 0xee, 0x73, 0x4d, 0x42, 0xfb, 0x24, + 0x00, 0x49, 0xd8, 0x06, 0xda, 0xaf, 0xcf, 0xba, + 0x5b, 0x5a, 0xe5, 0x74, 0xf5, 0xc8, 0x22, 0x47, + 0x4f, 0x6a, 0x7e, 0x3c, 0x2e, 0x24, 0xf4, 0x55, + 0x74, 0x9b, 0xcf, 0x6a, 0x1a, 0x76, 0x5c, 0x24, + 0xd3, 0x45, 0x21, 0x17, 0x2f, 0x8c, 0xb5, 0x90, + 0x7e, 0xd7, 0x11, 0x08, 0x32, 0x1d, 0xed, 0x47, + 0x4e, 0x47, 0x94, 0x7e, 0x3e, 0x57, 0x3d, 0x81, + 0x8f, 0xea, 0xcc, 0xd4, 0x1c, 0x15, 0x1c, 0xe6, + 0xaa, 0x73, 0x7a, 0x07, 0x01, 0xaa, 0x2e, 0xd9, + 0x97, 0x13, 0x10, 0x64, 0x00, 0xb9, 0xd1, 0x50, + 0x87, 0x80, 0x29, 0xbe, 0xab, 0x86, 0xc8, 0xe3, + 0x23, 0xdf, 0x23, 0xbe, 0x33, 0xc9, 0x71, 0xf7, + 0x4d, 0x55, 0x8f, 0x49, 0xeb, 0xac, 0xae, 0x9d, + 0x90, 0x30, 0x38, 0xdc, 0x59, 0x13, 0xe3, 0x42, + 0xee, 0x4e, 0xeb, 0x50, 0x76, 0xfc, 0x36, 0x07, + 0x19, 0x85, 0xb6, 0x16, 0xf8, 0xf8, 0x44, 0x4d, + 0x1b, 0xcf, 0x29, 0x3d, 0xd2, 0xaa, 0xfe, 0xd5, + 0xb0, 0x93, 0x64, 0x70, 0x62, 0xe6, 0x06, 0xf1, + 0xcb, 0x6a, 0x78, 0x8f, 0xcd, 0xa2, 0xdd, 0x60, + 0xb5, 0xae, 0x0b, 0x37, 0x0b, 0x5f, 0x05, 0xc3, + 0x63, 0x94, 0xef, 0x85, 0xe4, 0x07, 0x02, 0xb6, + 0x57, 0xf9, 0x0c, 0x65, 0xbd, 0xb3, 0x9f, 0x7b, + 0x34, 0x6c, 0x80, 0xb4, 0x97, 0x71, 0x9d, 0x84, + 0x20, 0xfc, 0xd1, 0xcb, 0x4d, 0xcb, 0x2c, 0x1a, + 0x00, 0xb2, 0x35, 0x35, 0xce, 0x2e, 0xe7, 0x35, + 0x71, 0x2e, 0x29, 0x9d, 0x5d, 0xa1, 0x77, 0x8b, + 0xdd, 0xee, 0xac, 0x50, 0x76, 0x05, 0x52, 0x92, + 0x4a, 0xf9, 0x25, 0x09, 0x2a, 0x09, 0x41, 0x1b, + 0x2b, 0xb0, 0x77, 0xca, 0x82, 0xe4, 0xa9, 0x50, + 0x8a, 0x12, 0xbe, 0x6a, 0x95, 0x2b, 0xe4, 0x9a, + 0x6f, 0x4b, 0x13, 0x55, 0x97, 0x8b, 0xc5, 0x5f, + 0x65, 0xee, 0x9b, 0x69, 0x63, 0x11, 0x96, 0x57, + 0x73, 0x6e, 0x03, 0x9c, 0xad, 0x96, 0x96, 0xd1, + 0xf9, 0x3d, 0x45, 0x72, 0xd6, 0xc4, 0xc7, 0x45, + 0x69, 0x5f, 0x1e, 0x72, 0x36, 0x53, 0xb8, 0xbb, + 0x66, 0x9b, 0xd2, 0xd8, 0xed, 0x3f, 0x6a, 0xd8, + 0xad, 0x5a, 0x1d, 0x2d, 0x28, 0xf9, 0x48, 0xf1, + 0x89, 0xe5, 0x50, 0x69, 0xb4, 0x67, 0xb3, 0xcb, + 0x1c, 0x13, 0x1b, 0x73, 0x77, 0x4b, 0x8b, 0xe7, + 0x00, 0x5d, 0xc4, 0x01, 0x6b, 0x0f, 0x30, 0x5b, + 0xec, 0xfe, 0x9d, 0xc7, 0xe7, 0x6c, 0xdd, 0x6d, + 0x77, 0x18, 0x2e, 0x22, 0x8c, 0x92, 0x9b, 0x5a, + 0x79, 0x16, 0xd5, 0x10, 0x7e, 0x76, 0xcf, 0xe0, + 0x32, 0xfa, 0x53, 0x28, 0x0d, 0x5c, 0xc0, 0x1d, + 0x58, 0x67, 0x6e, 0xe2, 0x3b, 0xa5, 0x74, 0xed, + 0x03, 0xed, 0x02, 0x0c, 0xb4, 0x0c, 0xb0, 0xc8, + 0x3c, 0x47, 0x7c, 0xc0, 0x03, 0x49, 0xdc, 0xf1, + 0xdf, 0x56, 0x9c, 0xe6, 0x0e, 0xc7, 0x35, 0x66, + 0xfb, 0x4b, 0xc6, 0x07, 0x07, 0x0f, 0x15, 0xfc, + 0xad, 0x3d, 0xc5, 0xc3, 0xb5, 0x46, 0x95, 0xca, + 0xe9, 0x4c, 0x80, 0x91, 0xa5, 0xdd, 0x48, 0x77, + 0x14, 0x17, 0x0d, 0xff, 0x00, 0x34, 0x1f, 0xa0, + 0xaa, 0xa5, 0x73, 0xbd, 0x05, 0xed, 0x1a, 0x2c, + 0x8b, 0x59, 0x8d, 0xca, 0xbc, 0x47, 0x74, 0x00, + 0x6b, 0x24, 0x3b, 0x9c, 0xba, 0x18, 0xdc, 0x83, + 0xce, 0xe6, 0x11, 0x3c, 0x0f, 0x88, 0xec, 0xe2, + 0x14, 0x5a, 0x28, 0xb0, 0x32, 0xb6, 0x4e, 0x19, + 0x5d, 0xe2, 0x73, 0x85, 0x61, 0x2b, 0xca, 0x43, + 0x57, 0x50, 0x72, 0x20, 0xd2, 0xcb, 0x87, 0x8a, + 0x3a, 0x78, 0xc4, 0xd5, 0x7c, 0xc7, 0x8c, 0x87, + 0xac, 0x6b, 0x1c, 0xed, 0xeb, 0x3e, 0x57, 0x71, + 0x3c, 0xf7, 0x16, 0xb6, 0xf3, 0x25, 0x05, 0x94, + 0xcd, 0x9a, 0x63, 0xe2, 0xb4, 0xec, 0x68, 0xde, + 0x50, 0x66, 0x4d, 0xa6, 0xac, 0xa7, 0x88, 0xc7, + 0x21, 0x24, 0x15, 0x86, 0xcd, 0x0b, 0x8b, 0x6e, + 0xf7, 0x39, 0xdb, 0x79, 0x56, 0xfe, 0xd2, 0xe0, + 0x5c, 0xc0, 0xc9, 0x83, 0x4b, 0x43, 0xc5, 0x40, + 0x76, 0xf5, 0xec, 0x83, 0x47, 0x0e, 0x90, 0xc3, + 0xc4, 0xee, 0x20, 0xc2, 0x7b, 0x95, 0x5b, 0x98, + 0xe2, 0x64, 0x4c, 0x6c, 0x71, 0x8e, 0x16, 0x34, + 0x50, 0x00, 0xbe, 0xd1, 0x04, 0x3b, 0xe2, 0x9e, + 0xf2, 0xe7, 0xae, 0x34, 0x8f, 0x3a, 0x4f, 0xca, + 0xff, 0x00, 0x35, 0xd0, 0x8e, 0xe2, 0xa9, 0xb8, + 0x28, 0x22, 0xb9, 0xca, 0x65, 0x60, 0x98, 0x56, + 0x37, 0xbb, 0xc6, 0x08, 0x39, 0xb6, 0xab, 0x70, + 0xf4, 0x64, 0x23, 0x9d, 0xeb, 0x7c, 0x08, 0xf4, + 0x55, 0xa7, 0xf4, 0x22, 0xaf, 0x4b, 0x55, 0xf6, + 0xe7, 0x4a, 0x60, 0xee, 0x63, 0x11, 0xcd, 0x08, + 0x73, 0x41, 0xa8, 0x5e, 0xa3, 0x4f, 0x62, 0xba, + 0xb6, 0xc5, 0xd5, 0x0e, 0x06, 0x00, 0xd6, 0x8e, + 0xe3, 0x77, 0x20, 0xe1, 0x93, 0xb9, 0xa3, 0x51, + 0x4d, 0xb7, 0x61, 0x73, 0xa8, 0x55, 0xc6, 0x02, + 0x03, 0x8e, 0xdf, 0xfd, 0x4c, 0x57, 0x93, 0xa3, + 0x74, 0xf9, 0x9c, 0xce, 0x60, 0x06, 0x47, 0x6f, + 0x34, 0xe7, 0x59, 0x23, 0x4f, 0xe2, 0x86, 0xe8, + 0xe9, 0xb0, 0x37, 0xdc, 0x1b, 0x95, 0xb1, 0x54, + 0x69, 0x1e, 0xa8, 0x7f, 0xfe, 0xc1, 0xf8, 0x4a, + 0xfa, 0x8b, 0x64, 0x4c, 0xef, 0x05, 0xb7, 0xd5, + 0x16, 0x56, 0xf6, 0x78, 0x41, 0x15, 0xbb, 0x78, + 0x58, 0x64, 0x06, 0x9d, 0xd2, 0x56, 0xa2, 0x3f, + 0xe5, 0x33, 0xbc, 0x12, 0xc7, 0xd2, 0x82, 0x76, + 0x1e, 0xf2, 0x29, 0x3b, 0x8a, 0x83, 0x67, 0xa0, + 0xa3, 0x8c, 0xf9, 0x5c, 0x85, 0xa3, 0x8c, 0x3e, + 0x81, 0xdc, 0xb4, 0xde, 0xad, 0xea, 0xa5, 0xa0, + 0x7e, 0x25, 0xdf, 0xcf, 0xff, 0x00, 0x20, 0xad, + 0xa8, 0x25, 0x62, 0xdf, 0x64, 0x2d, 0xac, 0x61, + 0x32, 0xdc, 0x3c, 0x34, 0x0d, 0xc3, 0x94, 0xac, + 0x2c, 0xc6, 0xa0, 0xb6, 0xc7, 0xb7, 0xab, 0x61, + 0xeb, 0x6e, 0x1d, 0xb1, 0xb1, 0xb7, 0x69, 0xaa, + 0xd6, 0x5a, 0xe1, 0x2f, 0x32, 0xd2, 0x8b, 0xdc, + 0xa3, 0x88, 0x65, 0x78, 0x99, 0x0f, 0x30, 0x41, + 0x83, 0x91, 0xb9, 0xca, 0x66, 0xe0, 0x9e, 0x76, + 0x56, 0x1b, 0x18, 0x9a, 0x69, 0x5d, 0x95, 0x5b, + 0x4d, 0x21, 0x51, 0x84, 0x60, 0xee, 0x9f, 0x85, + 0x6c, 0xf2, 0x36, 0xad, 0x6e, 0x26, 0x6b, 0x6b, + 0x66, 0x53, 0xc4, 0x21, 0xad, 0x01, 0x54, 0xf1, + 0x79, 0x0c, 0xe6, 0x3a, 0xd0, 0x5a, 0xb6, 0xcd, + 0xce, 0x6b, 0x49, 0x20, 0xd1, 0x05, 0xc9, 0x15, + 0x63, 0xd6, 0x1c, 0xff, 0x00, 0x99, 0x3b, 0xa1, + 0x3d, 0x60, 0xcf, 0xf9, 0x8b, 0xba, 0x15, 0xb1, + 0x66, 0x52, 0xab, 0x1e, 0xb0, 0xe7, 0xfc, 0xc9, + 0xdd, 0x09, 0xeb, 0x0e, 0x7f, 0xcc, 0x9d, 0xd0, + 0x52, 0xc7, 0xce, 0xb9, 0xf8, 0xb6, 0x9f, 0x3d, + 0x69, 0xee, 0x2f, 0x23, 0xb7, 0x68, 0x1f, 0x1a, + 0x42, 0x36, 0x34, 0x6f, 0xdc, 0xb2, 0x73, 0x12, + 0x66, 0xf3, 0x3d, 0x54, 0x6e, 0xb4, 0x74, 0x65, + 0x8e, 0xd8, 0xea, 0x2d, 0xde, 0x0f, 0x48, 0xc3, + 0x6c, 0xe6, 0xdc, 0xdf, 0x1e, 0xba, 0x6d, 0xe1, + 0xa7, 0x68, 0x09, 0x63, 0x51, 0x86, 0xd3, 0x97, + 0xb9, 0x57, 0x8b, 0x8b, 0xfa, 0xc5, 0x6c, 0x36, + 0xb5, 0x9c, 0xa5, 0x5d, 0x6d, 0x2c, 0x6d, 0x6c, + 0xa2, 0x11, 0x5b, 0xc6, 0x18, 0x06, 0xf2, 0x17, + 0xbb, 0x5a, 0xd6, 0x80, 0xd6, 0x8a, 0x01, 0xb8, + 0x05, 0x85, 0x93, 0xcb, 0x5b, 0x63, 0x61, 0x2f, + 0x94, 0xd5, 0xe7, 0xe2, 0xb0, 0x6f, 0x4b, 0x19, + 0x53, 0x4d, 0x14, 0x31, 0x99, 0x26, 0x70, 0x6b, + 0x06, 0xda, 0x95, 0x52, 0xca, 0xea, 0x3b, 0x9b, + 0xe9, 0x0d, 0xb6, 0x3e, 0xac, 0x8b, 0x73, 0xa4, + 0xe5, 0x2b, 0x1a, 0xee, 0xf2, 0xff, 0x00, 0x30, + 0xfe, 0x29, 0x09, 0x8a, 0xdf, 0xe4, 0xf7, 0x17, + 0xa4, 0x50, 0xc7, 0x0b, 0x78, 0x63, 0x14, 0x03, + 0x95, 0x07, 0x9d, 0xbd, 0x9c, 0x71, 0x8e, 0x37, + 0xf8, 0xf2, 0x1d, 0xee, 0x3b, 0x57, 0xb8, 0x00, + 0x9d, 0xa8, 0x8a, 0x0c, 0x6c, 0x41, 0x11, 0xe7, + 0x26, 0x69, 0xde, 0xe6, 0xec, 0x56, 0x12, 0x6a, + 0xaa, 0xd7, 0x92, 0x9b, 0x1b, 0xf8, 0x2f, 0x87, + 0xc5, 0x27, 0x86, 0x4e, 0xf1, 0x56, 0x86, 0x3d, + 0x92, 0xc6, 0xd9, 0x63, 0x35, 0x63, 0x80, 0x23, + 0xdd, 0x54, 0x4a, 0x7c, 0x08, 0x95, 0x6b, 0x5a, + 0x64, 0x79, 0xa3, 0x5b, 0xb4, 0x94, 0x81, 0xa5, + 0xb9, 0xfe, 0x2e, 0xa9, 0xb2, 0x63, 0x76, 0x96, + 0x6f, 0xf7, 0x15, 0xb2, 0xff, 0x00, 0x25, 0x6b, + 0x61, 0x11, 0x92, 0xe1, 0xe1, 0xbc, 0xcd, 0xe5, + 0x25, 0x51, 0x2c, 0xf2, 0xa1, 0xb9, 0xa9, 0xaf, + 0x9a, 0xc3, 0x24, 0x86, 0xad, 0x85, 0xa3, 0x9d, + 0x6f, 0xec, 0xf0, 0x37, 0x39, 0x19, 0x5b, 0x7d, + 0x96, 0x71, 0xa9, 0xf1, 0x9b, 0x0f, 0x20, 0x52, + 0x46, 0x3b, 0x5d, 0x92, 0xd4, 0x93, 0x12, 0x38, + 0xad, 0xec, 0x5a, 0x7b, 0xc4, 0x85, 0x63, 0xb0, + 0xc6, 0xda, 0x58, 0x44, 0x19, 0x03, 0x40, 0x34, + 0xda, 0xee, 0x52, 0xbc, 0xf2, 0x87, 0xc8, 0xb1, + 0x17, 0x0f, 0xb7, 0x02, 0x33, 0x14, 0x64, 0xb7, + 0x84, 0x52, 0x94, 0x0b, 0x99, 0xe0, 0xc6, 0xbe, + 0xcf, 0x5a, 0xbe, 0xf2, 0xce, 0xf0, 0x36, 0x2e, + 0x32, 0xd0, 0x1c, 0x76, 0xec, 0xf7, 0x10, 0x75, + 0xba, 0x84, 0xaa, 0xe6, 0x9e, 0x80, 0xf6, 0x95, + 0xe7, 0xac, 0xe9, 0xff, 0x00, 0x44, 0xf4, 0x07, + 0xb4, 0xaf, 0x3e, 0x67, 0x4f, 0xfa, 0x20, 0xe9, + 0x75, 0x09, 0x50, 0xb9, 0xa7, 0xa0, 0x3d, 0xa5, + 0x79, 0xeb, 0x3a, 0x7f, 0xd1, 0x3d, 0x01, 0xed, + 0x2b, 0xcf, 0x59, 0xd3, 0xfe, 0x88, 0x3a, 0x5d, + 0x42, 0x54, 0x2e, 0x69, 0xe8, 0x0f, 0x69, 0x5e, + 0x7a, 0xce, 0x9f, 0xf4, 0x4f, 0x40, 0x7b, 0x4a, + 0xf3, 0xd6, 0x74, 0xff, 0x00, 0xa2, 0x0e, 0x97, + 0x50, 0x95, 0x0b, 0x9a, 0x7a, 0x03, 0xda, 0x57, + 0x9e, 0xb3, 0xa7, 0xfd, 0x13, 0xd0, 0x1e, 0xd2, + 0xbc, 0xf5, 0x9d, 0x3f, 0xe8, 0x83, 0xa5, 0xd5, + 0x2a, 0x17, 0x34, 0xf4, 0x07, 0xb4, 0xaf, 0x3d, + 0x67, 0x4f, 0xfa, 0x27, 0xa0, 0x3d, 0xa5, 0x79, + 0xeb, 0x3a, 0x7f, 0xd1, 0x07, 0x4b, 0xa8, 0x4a, + 0x85, 0xcd, 0x3d, 0x01, 0xed, 0x2b, 0xcf, 0x59, + 0xd3, 0xfe, 0x89, 0xe8, 0x0f, 0x69, 0x5e, 0x7a, + 0xce, 0x9f, 0xf4, 0x41, 0xd2, 0xea, 0x11, 0x72, + 0xbc, 0x8e, 0x3b, 0xda, 0x2e, 0x3e, 0xc6, 0x6b, + 0xd9, 0xaf, 0x5a, 0x63, 0x81, 0xbc, 0x4e, 0x00, + 0xed, 0x20, 0x7b, 0x8a, 0xe5, 0xa0, 0x72, 0x37, + 0x59, 0x2d, 0x37, 0x6f, 0x77, 0x76, 0xee, 0x39, + 0x9f, 0x5e, 0x27, 0x1e, 0xe2, 0x0b, 0x1a, 0x22, + 0x20, 0xa9, 0xe6, 0xff, 0x00, 0x34, 0xd8, 0x77, + 0xe3, 0xfd, 0xe5, 0x6b, 0x1c, 0xaa, 0xa9, 0x9b, + 0xfc, 0xd3, 0x61, 0xdf, 0x8f, 0xf7, 0x95, 0xac, + 0x72, 0xa0, 0x94, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x55, 0x2d, 0x57, 0xf7, 0xd6, 0x3b, + 0xbc, 0xdf, 0xee, 0x05, 0x6d, 0x55, 0x3d, 0x57, + 0xf7, 0xd6, 0x3f, 0xbc, 0xdf, 0xee, 0x04, 0x16, + 0xbe, 0x55, 0x2a, 0x39, 0x54, 0xa0, 0x2c, 0x6c, + 0x85, 0xb3, 0x6e, 0xac, 0xe5, 0x81, 0xdb, 0x9e, + 0xd3, 0x4e, 0xfa, 0xc9, 0x50, 0x50, 0x73, 0x1b, + 0x30, 0xe8, 0x5d, 0x25, 0xb3, 0xf6, 0x3a, 0x27, + 0x11, 0x45, 0xaf, 0xce, 0xc2, 0x5a, 0x59, 0x77, + 0x1e, 0xc7, 0x37, 0x94, 0x72, 0x2b, 0x0e, 0xa4, + 0xb4, 0xf2, 0x2c, 0xf7, 0x5b, 0x4a, 0x47, 0x72, + 0xda, 0xfb, 0xab, 0x5f, 0x7d, 0x07, 0x5d, 0x69, + 0x24, 0x74, 0xe4, 0xa8, 0x41, 0x58, 0x9e, 0xea, + 0xe6, 0xe8, 0x97, 0x5c, 0x48, 0x64, 0x24, 0x50, + 0x54, 0xab, 0x06, 0x1b, 0x59, 0xbf, 0x17, 0x64, + 0xdb, 0x31, 0x00, 0x91, 0xad, 0x3b, 0xc8, 0x55, + 0xb2, 0x38, 0x7c, 0x53, 0xbc, 0x1a, 0x51, 0x7d, + 0x47, 0x1c, 0x93, 0x3b, 0x82, 0x36, 0x97, 0x14, + 0x16, 0xf9, 0xb5, 0xfd, 0xb4, 0xd0, 0x49, 0x14, + 0x96, 0x63, 0x89, 0xed, 0x2d, 0xad, 0x39, 0xd6, + 0xaf, 0x02, 0x65, 0x0d, 0x90, 0x39, 0xa4, 0x31, + 0xc7, 0x89, 0xb5, 0x4b, 0x1c, 0x34, 0x71, 0x81, + 0x2d, 0xc5, 0x0b, 0xc7, 0xec, 0xad, 0xf5, 0x8e, + 0x32, 0xe6, 0xf2, 0x8d, 0x81, 0x9c, 0x2c, 0x1f, + 0xb5, 0xc8, 0x82, 0xb5, 0xa8, 0x20, 0x3d, 0x63, + 0x27, 0x1b, 0x9d, 0xb0, 0x85, 0xa9, 0xe4, 0x56, + 0x8c, 0xe5, 0xa3, 0xbc, 0x9e, 0x48, 0xdd, 0xfc, + 0xc8, 0x8a, 0xab, 0x84, 0x1f, 0x51, 0x3f, 0xab, + 0x95, 0xaf, 0x1b, 0x08, 0x20, 0xd5, 0x59, 0x67, + 0x79, 0x0d, 0x82, 0xf2, 0x33, 0xe3, 0x30, 0x87, + 0x12, 0x3b, 0x8a, 0xb1, 0xb0, 0x85, 0xbe, 0xc3, + 0xca, 0x2e, 0x2c, 0x5f, 0x6e, 0xef, 0x8c, 0xca, + 0xef, 0x41, 0xd4, 0xb1, 0xf7, 0x22, 0xea, 0xca, + 0x19, 0xc1, 0xaf, 0x1b, 0x41, 0x3d, 0xf5, 0x92, + 0xab, 0x5a, 0x22, 0xfb, 0xad, 0xc7, 0xba, 0xd1, + 0xe7, 0xf8, 0x96, 0xee, 0x22, 0x9d, 0xc5, 0x65, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x05, 0x0a, 0x54, 0x14, 0x90, 0xa8, + 0x4e, 0x20, 0xb5, 0x96, 0x2e, 0x71, 0xca, 0x5f, + 0x82, 0x49, 0x00, 0xb2, 0x83, 0x9b, 0xc5, 0x58, + 0x92, 0x4b, 0x72, 0xc1, 0x96, 0x74, 0x04, 0x97, + 0xb5, 0xec, 0xa0, 0x1b, 0x68, 0xde, 0x11, 0xc5, + 0x4f, 0x71, 0x27, 0xe5, 0x67, 0x1a, 0x6f, 0xb8, + 0x87, 0x3a, 0x71, 0x0e, 0x75, 0x5c, 0xb5, 0xb5, + 0xc7, 0xca, 0xf8, 0xa6, 0xc3, 0xdc, 0x0f, 0x2b, + 0x61, 0x6b, 0xa6, 0x0e, 0x7b, 0x8d, 0x5a, 0x7e, + 0x30, 0x2d, 0x71, 0xd8, 0xbc, 0xae, 0x1b, 0x87, + 0x93, 0x37, 0x7a, 0x32, 0x92, 0xf0, 0x70, 0xf0, + 0x75, 0x6d, 0x2f, 0x73, 0x47, 0xc5, 0x15, 0xf8, + 0xa5, 0x39, 0x75, 0x39, 0xf4, 0x5a, 0x2a, 0x12, + 0xa1, 0x6a, 0x34, 0xeb, 0x9a, 0x60, 0x99, 0xb0, + 0xbf, 0xac, 0xb5, 0x6c, 0x84, 0x5b, 0xed, 0x26, + 0x8d, 0xe6, 0xdb, 0xb5, 0x66, 0xe4, 0x6f, 0x45, + 0x95, 0xb3, 0xa6, 0xa7, 0x13, 0xaa, 0x1a, 0xc6, + 0xf3, 0xb9, 0xc6, 0x81, 0x39, 0x7b, 0x0e, 0x6c, + 0xa4, 0xaa, 0xd7, 0x5a, 0xdf, 0xdd, 0xb6, 0x19, + 0xdf, 0x91, 0x84, 0x42, 0x60, 0x1c, 0x5c, 0x4c, + 0xda, 0xd2, 0xda, 0x57, 0x65, 0x56, 0x33, 0x33, + 0x17, 0xec, 0xea, 0xae, 0x2e, 0xad, 0xd9, 0x1d, + 0x94, 0xee, 0x0d, 0x6b, 0x81, 0x25, 0xe3, 0x88, + 0xd1, 0xa5, 0xc3, 0xba, 0x9f, 0x22, 0xdb, 0xaa, + 0xa5, 0x56, 0x96, 0x5c, 0xbe, 0x45, 0xf7, 0x77, + 0x36, 0xf6, 0x56, 0xec, 0x7f, 0x92, 0xd0, 0xb9, + 0xd2, 0x12, 0x01, 0x69, 0x15, 0xd9, 0x4e, 0x54, + 0x9b, 0x3d, 0x2f, 0x93, 0xd9, 0x4b, 0x6f, 0x0f, + 0x58, 0xfb, 0xc7, 0x39, 0x81, 0xa7, 0xf6, 0x5c, + 0x07, 0xc1, 0x54, 0x38, 0xb7, 0x55, 0x4a, 0xad, + 0x4d, 0xb6, 0x62, 0x66, 0x3a, 0xea, 0x2c, 0x8c, + 0x6d, 0x8a, 0x5b, 0x56, 0x75, 0x87, 0xab, 0x35, + 0x69, 0x61, 0xe6, 0xaa, 0xf9, 0x8f, 0x2d, 0x7e, + 0xc7, 0x45, 0x35, 0xd4, 0x31, 0xb2, 0xd2, 0x72, + 0x1a, 0xc7, 0x31, 0xd5, 0x78, 0xe2, 0xf8, 0xbc, + 0x41, 0x06, 0xe2, 0xaa, 0x3a, 0xc6, 0xee, 0xaa, + 0xd4, 0xc9, 0x96, 0xbc, 0x7d, 0xd3, 0xdb, 0x69, + 0x03, 0x66, 0xb6, 0x85, 0xed, 0x8e, 0x67, 0x57, + 0xc6, 0xa9, 0xdf, 0xc2, 0x16, 0x34, 0x92, 0x5f, + 0x7a, 0xc4, 0xd6, 0xb5, 0xad, 0x30, 0xf5, 0x3b, + 0x89, 0x20, 0xf0, 0xf2, 0x9a, 0x73, 0xa7, 0xd2, + 0x7c, 0x0e, 0x13, 0xec, 0xf9, 0xc2, 0xc0, 0x1c, + 0x0a, 0x54, 0x2d, 0x2e, 0x3b, 0x27, 0x43, 0x6b, + 0x0f, 0x54, 0x19, 0x0d, 0xc8, 0x93, 0x85, 0xd5, + 0x24, 0x82, 0xd2, 0x76, 0x54, 0xa8, 0xba, 0xc9, + 0x99, 0x1f, 0x23, 0x4c, 0x41, 0xd1, 0xc3, 0x72, + 0xc8, 0x5a, 0xee, 0x22, 0x2a, 0xef, 0x73, 0xbe, + 0x9c, 0x4e, 0x7d, 0x1b, 0xba, 0x84, 0xaa, 0xac, + 0xdb, 0xdf, 0x64, 0xed, 0x6e, 0x72, 0x77, 0x0f, + 0x89, 0x8f, 0x64, 0x4e, 0xe2, 0x73, 0x43, 0x89, + 0x20, 0x01, 0xc8, 0xb7, 0x12, 0xe4, 0x69, 0x35, + 0xa4, 0x51, 0x34, 0x3d, 0xd7, 0x40, 0xbb, 0xbc, + 0xd0, 0x01, 0x25, 0x11, 0x9c, 0xa5, 0x42, 0x94, + 0x51, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x16, 0x1e, 0x5b, + 0x1f, 0x1e, 0x46, 0xc2, 0x6b, 0x49, 0x05, 0x5b, + 0x23, 0x48, 0x1d, 0xfa, 0x6c, 0x59, 0x75, 0x55, + 0x2d, 0x61, 0xaf, 0xb1, 0xf8, 0x18, 0xdd, 0x04, + 0x4e, 0x12, 0xde, 0x91, 0xb1, 0x83, 0x6d, 0x3b, + 0xa5, 0x07, 0x1e, 0xd4, 0xb8, 0x1b, 0x9c, 0x16, + 0x56, 0x4b, 0x3b, 0x81, 0x4a, 0x9e, 0x38, 0xc8, + 0xdd, 0x42, 0xb5, 0x4b, 0x77, 0x7f, 0x90, 0xc8, + 0x6a, 0x6e, 0xbe, 0xea, 0x6e, 0x29, 0x6e, 0x63, + 0x3c, 0x6d, 0x00, 0x6e, 0x6f, 0x32, 0xd1, 0x8d, + 0xbb, 0x50, 0x4a, 0x25, 0x11, 0x03, 0xfc, 0x55, + 0x28, 0x2b, 0x5a, 0x27, 0xc0, 0x88, 0x08, 0x12, + 0x89, 0xde, 0xde, 0x82, 0x58, 0xf9, 0x23, 0x35, + 0x8d, 0xce, 0x61, 0xe7, 0x69, 0x23, 0xe0, 0x5f, + 0x6f, 0xba, 0xbb, 0x91, 0xbc, 0x32, 0xcd, 0x23, + 0xda, 0x79, 0x0b, 0x89, 0x0b, 0xcd, 0x2a, 0x80, + 0x05, 0x28, 0xbd, 0xce, 0xe0, 0xbc, 0x39, 0x42, + 0xf5, 0x25, 0x2c, 0x49, 0x21, 0x7c, 0x92, 0x95, + 0x50, 0x4f, 0x2a, 0xa0, 0xbe, 0x49, 0xd8, 0x84, + 0xaf, 0x4b, 0x6b, 0x79, 0xee, 0xe7, 0x6d, 0xbd, + 0xb3, 0x0c, 0x92, 0xbc, 0xd0, 0x34, 0x6d, 0x29, + 0x63, 0xcf, 0x69, 0x21, 0xa3, 0x69, 0x26, 0x80, + 0x77, 0x55, 0xeb, 0x45, 0xfb, 0x36, 0xbb, 0xcb, + 0x3a, 0x3b, 0xec, 0x98, 0x30, 0xd9, 0x83, 0x51, + 0x19, 0xd8, 0xe7, 0x2b, 0x16, 0x89, 0xf6, 0x65, + 0x0d, 0x9f, 0x06, 0x43, 0x30, 0x04, 0x97, 0x3b, + 0x1d, 0x1c, 0x5c, 0x8d, 0xef, 0xae, 0x8a, 0xc6, + 0x35, 0x8d, 0x0d, 0x68, 0x01, 0xa3, 0x70, 0x1b, + 0x02, 0x83, 0xc2, 0xc3, 0x1f, 0x69, 0x8f, 0xb7, + 0x6d, 0xb5, 0xa4, 0x62, 0x28, 0x99, 0xb8, 0x05, + 0x92, 0x88, 0x80, 0x88, 0x88, 0x0b, 0x0b, 0x2b, + 0x89, 0xb3, 0xcb, 0x5a, 0x3e, 0xd2, 0xf2, 0x30, + 0xf6, 0x3c, 0x11, 0x52, 0x36, 0x8e, 0xf2, 0xcd, + 0x44, 0x1f, 0x9f, 0xf5, 0x6e, 0x8f, 0xc8, 0xe9, + 0x9b, 0xf7, 0x4b, 0x10, 0x71, 0xb5, 0xad, 0x62, + 0x9d, 0xb5, 0xd9, 0xdc, 0xaa, 0xd9, 0x63, 0x3d, + 0xac, 0xe6, 0x6c, 0xed, 0x23, 0xb7, 0x91, 0x82, + 0x63, 0x18, 0x00, 0x3c, 0x9d, 0xb4, 0x0b, 0xb2, + 0xe4, 0x31, 0xf6, 0xb9, 0x1b, 0x57, 0xda, 0xdd, + 0x30, 0x49, 0x13, 0xc5, 0x0b, 0x48, 0xe7, 0x54, + 0xe3, 0xec, 0x8b, 0x4d, 0x12, 0x4f, 0x8e, 0x2b, + 0xc9, 0x53, 0xe1, 0x41, 0x58, 0xb6, 0xf6, 0xbb, + 0x98, 0xb8, 0xb8, 0x8e, 0x06, 0x40, 0xde, 0x29, + 0x1c, 0x1a, 0x3d, 0xd5, 0xd5, 0x22, 0x7b, 0xdd, + 0x6f, 0x1c, 0x92, 0x6c, 0x7b, 0xd8, 0x1c, 0xe1, + 0xdd, 0x21, 0x55, 0xed, 0x3d, 0x96, 0x69, 0xdb, + 0x3b, 0x98, 0xee, 0xa3, 0xe2, 0x2f, 0x85, 0xc1, + 0xed, 0x04, 0xec, 0xa8, 0x56, 0xa9, 0x8d, 0x18, + 0x7a, 0x02, 0x0c, 0x19, 0xe6, 0x64, 0x51, 0x49, + 0x3c, 0xa7, 0x85, 0x8c, 0x05, 0xce, 0x71, 0xdc, + 0x00, 0x5c, 0xaf, 0x27, 0xed, 0x04, 0x37, 0x2e, + 0xe9, 0x61, 0x8c, 0x4d, 0x04, 0x24, 0x88, 0xda, + 0x77, 0x77, 0xd7, 0x53, 0xb8, 0xc7, 0xb3, 0x25, + 0x6f, 0x25, 0x94, 0xa4, 0x88, 0xa5, 0x6d, 0x1f, + 0x45, 0x5f, 0xfd, 0x22, 0xd3, 0x7c, 0xbc, 0x67, + 0xdd, 0x3e, 0x14, 0x15, 0x4f, 0xd6, 0x3c, 0xa0, + 0xd8, 0x20, 0x68, 0x1d, 0xc4, 0xfd, 0x63, 0xca, + 0xf6, 0x2d, 0xe9, 0x56, 0xbf, 0xd2, 0x2d, 0x35, + 0xfe, 0xfe, 0x92, 0x9f, 0xa4, 0x5a, 0x6b, 0xfd, + 0xfd, 0x25, 0x05, 0x53, 0xf5, 0x8f, 0x2b, 0xd8, + 0x37, 0xa5, 0x3f, 0x59, 0x32, 0xbd, 0x83, 0x55, + 0xaf, 0xf4, 0x8b, 0x4d, 0x7f, 0xbf, 0xa4, 0xa7, + 0xe9, 0x16, 0x9a, 0xff, 0x00, 0x7f, 0x49, 0x41, + 0x55, 0x1e, 0xd8, 0xf2, 0xa7, 0x67, 0x52, 0xdd, + 0xaa, 0xd5, 0xa0, 0xee, 0xdf, 0x7f, 0x2d, 0xcd, + 0xf3, 0xf6, 0x3e, 0xe3, 0xc6, 0x20, 0x27, 0xe9, + 0x16, 0x9a, 0x1b, 0x7c, 0x7e, 0x95, 0xeb, 0xa3, + 0x6d, 0x59, 0x65, 0x7d, 0x7b, 0x67, 0x17, 0xf2, + 0xe0, 0x3c, 0x2d, 0xef, 0x20, 0xb4, 0xa2, 0x9a, + 0x14, 0xa1, 0x41, 0x08, 0xa6, 0x85, 0x28, 0x55, + 0xa1, 0xa1, 0xd6, 0x7f, 0x74, 0x8f, 0x9e, 0x16, + 0x8a, 0x2f, 0xe4, 0xb3, 0xbc, 0x16, 0xf7, 0x5a, + 0x7d, 0xd0, 0x3e, 0x78, 0x55, 0xfe, 0xba, 0x38, + 0x2d, 0xda, 0xe9, 0x0f, 0x20, 0xa7, 0x42, 0x50, + 0xf5, 0x24, 0x34, 0x55, 0xc4, 0x01, 0xce, 0x56, + 0xaf, 0x29, 0x9a, 0xb7, 0xb6, 0x61, 0x1c, 0x60, + 0x0e, 0x72, 0x77, 0xad, 0x86, 0x3f, 0x17, 0x90, + 0xcd, 0xcc, 0x0b, 0x41, 0x8a, 0xd0, 0x1d, 0xaf, + 0x3b, 0x2a, 0xb6, 0xb7, 0x3e, 0xcc, 0x30, 0x97, + 0x6e, 0x0e, 0x9d, 0xcf, 0x3b, 0x36, 0x8a, 0x9a, + 0x7c, 0x2a, 0x0a, 0x06, 0x37, 0xda, 0x45, 0xde, + 0x29, 0xd2, 0xc7, 0x67, 0x10, 0x7b, 0x64, 0x35, + 0xa9, 0xde, 0x4a, 0xb6, 0xe2, 0x35, 0x8e, 0xa4, + 0xcb, 0x30, 0xb3, 0xc9, 0xc3, 0x0c, 0x9b, 0x1b, + 0x4d, 0xe2, 0xbc, 0xab, 0xcf, 0x33, 0xec, 0xe7, + 0x4f, 0x62, 0x6d, 0xdb, 0x71, 0x08, 0x71, 0x9b, + 0x88, 0x06, 0x03, 0xce, 0xae, 0x3a, 0x7f, 0x15, + 0x15, 0x8d, 0x94, 0x64, 0xb4, 0x75, 0xcf, 0x15, + 0x27, 0xb8, 0xa8, 0xc6, 0xc3, 0x69, 0xb6, 0xc0, + 0xef, 0x2b, 0xbe, 0x3d, 0x75, 0xcb, 0xb6, 0xf8, + 0xdb, 0x40, 0x5b, 0xe1, 0xbb, 0x9b, 0xb8, 0xa5, + 0x10, 0x14, 0x51, 0xbf, 0x24, 0x29, 0x44, 0xa1, + 0x14, 0x6f, 0xc9, 0x09, 0x46, 0xfc, 0x90, 0xa5, + 0x12, 0x84, 0x51, 0xbf, 0x24, 0x25, 0x1b, 0xf2, + 0x42, 0x94, 0x4a, 0x11, 0x41, 0xf2, 0x42, 0x95, + 0x0b, 0x55, 0xa9, 0xb2, 0x7e, 0x8e, 0xc6, 0x3d, + 0xec, 0x3f, 0xc6, 0x93, 0xc5, 0x8f, 0xbe, 0x54, + 0x18, 0x59, 0xdd, 0x4e, 0x2d, 0xdf, 0xe4, 0x78, + 0xe6, 0xf5, 0xf7, 0x27, 0x63, 0xb8, 0x76, 0xf0, + 0xaa, 0xe4, 0xb8, 0x7c, 0xdd, 0xfb, 0x8d, 0xcd, + 0xc3, 0xbc, 0x72, 0x76, 0x34, 0xd6, 0x81, 0x6d, + 0x70, 0x18, 0xc1, 0x6d, 0x07, 0x95, 0xcf, 0xe3, + 0xdc, 0xcf, 0xe3, 0x12, 0x77, 0xed, 0x5b, 0x7a, + 0x9e, 0x74, 0x15, 0x1e, 0xbb, 0x27, 0x8e, 0x70, + 0x65, 0xdc, 0x65, 0xd0, 0x8d, 0x85, 0xc1, 0x67, + 0xb6, 0xf2, 0xd9, 0xed, 0x0e, 0x6b, 0xc5, 0x0a, + 0xde, 0x4d, 0x13, 0x27, 0x8d, 0xd1, 0x48, 0x38, + 0x9a, 0xe1, 0x42, 0xab, 0x16, 0x58, 0xab, 0x78, + 0x73, 0x87, 0x1f, 0x78, 0x4f, 0x53, 0x28, 0x26, + 0x22, 0xac, 0x8c, 0xcf, 0x29, 0xb7, 0xf9, 0x61, + 0x48, 0xba, 0xb7, 0xf9, 0x61, 0x6e, 0x7d, 0x4d, + 0xc6, 0x1d, 0xb5, 0x72, 0x7a, 0x9b, 0x8c, 0xe7, + 0x72, 0x83, 0x43, 0x72, 0xeb, 0x3b, 0x98, 0x5d, + 0x13, 0xde, 0x28, 0x77, 0x6d, 0x58, 0x98, 0xcc, + 0xcc, 0xb8, 0xb7, 0x9b, 0x69, 0xcf, 0x59, 0x6e, + 0x36, 0x34, 0xef, 0xa2, 0xb4, 0xfa, 0x99, 0x8c, + 0xf9, 0x4e, 0x58, 0x79, 0x2d, 0x3f, 0x82, 0xb0, + 0x85, 0xd2, 0x5c, 0x38, 0xff, 0x00, 0xb5, 0xb5, + 0xda, 0x4a, 0x58, 0xf8, 0xf5, 0x83, 0x17, 0xc1, + 0xc4, 0x1e, 0x39, 0xf8, 0x55, 0x77, 0x50, 0x6a, + 0xd8, 0x5d, 0x19, 0x89, 0xaf, 0x11, 0x42, 0x7a, + 0x4a, 0xce, 0xc5, 0xe9, 0x97, 0xe4, 0xa7, 0xeb, + 0x78, 0x0c, 0x36, 0x80, 0xd4, 0x13, 0xca, 0x16, + 0x7d, 0xd7, 0xb2, 0xec, 0x15, 0xd4, 0x9d, 0x64, + 0xce, 0x79, 0xee, 0x54, 0xd3, 0xe1, 0x41, 0xcf, + 0xac, 0x3d, 0xa1, 0x3f, 0x19, 0x23, 0x8c, 0x16, + 0xed, 0x92, 0x87, 0xc5, 0x2e, 0xf8, 0x56, 0xc3, + 0xf5, 0x8f, 0x2b, 0xd8, 0x35, 0x5a, 0xff, 0x00, + 0x48, 0xb4, 0xd7, 0xfb, 0xfd, 0xf4, 0xfd, 0x22, + 0xd3, 0x5f, 0xef, 0xe9, 0x28, 0x29, 0xd7, 0xbe, + 0xd6, 0xb2, 0x57, 0x76, 0x92, 0xdb, 0x3a, 0x16, + 0x81, 0x2b, 0x4b, 0x49, 0xaf, 0x3e, 0xc5, 0x74, + 0xf6, 0x4d, 0x53, 0xa6, 0x89, 0x3c, 0xb2, 0x12, + 0x3d, 0xd2, 0x4a, 0xc1, 0xca, 0xfb, 0x2b, 0xd3, + 0xd6, 0xb8, 0xeb, 0x9b, 0x88, 0xb8, 0xba, 0xc8, + 0xa3, 0x2e, 0x6f, 0x7c, 0x05, 0x9f, 0xec, 0x9f, + 0x66, 0x9c, 0x70, 0xe6, 0x95, 0xc3, 0xa0, 0x90, + 0x82, 0xec, 0x88, 0x88, 0x08, 0x88, 0x80, 0x8a, + 0x2a, 0xb1, 0xee, 0xb2, 0x16, 0x96, 0x8c, 0x2f, + 0x9e, 0x56, 0xb0, 0x0e, 0x72, 0x83, 0x21, 0x1c, + 0xe0, 0xd1, 0x52, 0x68, 0x3b, 0xaa, 0xab, 0x90, + 0xd7, 0x36, 0xcc, 0x0e, 0x65, 0x93, 0x0c, 0xae, + 0xe4, 0x77, 0x20, 0x55, 0xf7, 0x66, 0xf2, 0x59, + 0x7b, 0x91, 0x0d, 0xcd, 0xc1, 0xb7, 0x8c, 0xf3, + 0x6c, 0x41, 0x7f, 0x7e, 0x5b, 0x1b, 0x19, 0x21, + 0xf7, 0x0c, 0x04, 0x6f, 0x15, 0x58, 0x33, 0xea, + 0xdc, 0x3c, 0x4f, 0xe1, 0xeb, 0x43, 0x8f, 0x38, + 0xdc, 0xb5, 0x50, 0x68, 0xbb, 0x17, 0xb0, 0x48, + 0xe9, 0xcc, 0xa5, 0xdf, 0xb4, 0x0a, 0xc4, 0xc8, + 0x68, 0x52, 0xc6, 0x19, 0x2c, 0xdf, 0xc4, 0x46, + 0xd2, 0xd4, 0x16, 0xbb, 0x2c, 0xd6, 0x3a, 0xf8, + 0xf0, 0xc1, 0x33, 0x5c, 0xef, 0x93, 0x5d, 0xab, + 0x39, 0x73, 0x2b, 0x6b, 0x47, 0xba, 0x43, 0x0b, + 0x09, 0xb5, 0xc8, 0x41, 0xf1, 0x05, 0x68, 0x1c, + 0xad, 0xfa, 0x63, 0x3a, 0xfb, 0xf6, 0x3a, 0xd2, + 0xec, 0x70, 0x5e, 0xc1, 0xb1, 0xc0, 0xf2, 0x81, + 0xca, 0x83, 0xd7, 0x58, 0x7e, 0x5a, 0xc8, 0x7f, + 0x45, 0xdf, 0x02, 0xd6, 0x7b, 0x2f, 0xfc, 0xa1, + 0x69, 0xee, 0xad, 0x9e, 0xb0, 0xfc, 0xb5, 0x90, + 0xfe, 0x8b, 0xbe, 0x05, 0xac, 0xf6, 0x5f, 0xf9, + 0x42, 0xd3, 0xdd, 0x41, 0x6d, 0x44, 0x44, 0x15, + 0x3c, 0xdf, 0xe6, 0x9b, 0x1e, 0xfc, 0x7f, 0xbc, + 0xad, 0x6a, 0xa9, 0x9b, 0xfc, 0xd3, 0x63, 0xdf, + 0x8f, 0xf7, 0x95, 0xad, 0x04, 0xa2, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0xa9, 0xea, 0xbf, + 0xbe, 0xb1, 0xfd, 0xe1, 0xfb, 0xea, 0xd8, 0xaa, + 0x7a, 0xaf, 0xef, 0xac, 0x7f, 0x78, 0x7f, 0x71, + 0x05, 0xad, 0x4a, 0x85, 0x28, 0x08, 0x88, 0x82, + 0xb7, 0xad, 0xed, 0x7a, 0xcc, 0x73, 0x2e, 0x5a, + 0x2a, 0xf8, 0x1c, 0x0d, 0x7b, 0x8a, 0xb3, 0x13, + 0x83, 0xe2, 0x6b, 0xf7, 0x87, 0x0d, 0xab, 0xa0, + 0xe4, 0x2d, 0x5b, 0x77, 0x67, 0x35, 0xbb, 0x85, + 0x43, 0xda, 0x47, 0xbb, 0xc8, 0xb9, 0xcd, 0xa7, + 0x14, 0x4f, 0x96, 0xd5, 0xfb, 0x1d, 0x0b, 0x88, + 0x03, 0xb9, 0x54, 0x1a, 0xe9, 0x70, 0x8e, 0x96, + 0xf5, 0xce, 0xd8, 0xd8, 0x89, 0xad, 0x56, 0xd6, + 0xcb, 0x1e, 0xc6, 0x1e, 0xae, 0xd6, 0x3e, 0x27, + 0x9d, 0x87, 0x95, 0x6c, 0xb1, 0x98, 0xb7, 0xdf, + 0xb9, 0xde, 0x38, 0x6c, 0x4c, 0xf8, 0xeb, 0x6a, + 0x6f, 0xb1, 0xb8, 0xb1, 0xd4, 0xd9, 0xc7, 0xd7, + 0xdc, 0x6e, 0x24, 0x0a, 0xed, 0x41, 0xe5, 0x67, + 0x82, 0xb7, 0xb7, 0x67, 0x94, 0x64, 0xdc, 0x05, + 0x36, 0xf0, 0x2f, 0xa7, 0xe5, 0x2e, 0x6e, 0x08, + 0xb5, 0xc3, 0xc5, 0xc1, 0x1e, 0xe3, 0x22, 0x91, + 0x8d, 0xbb, 0xbe, 0x77, 0x95, 0x65, 0x25, 0xea, + 0xe1, 0xde, 0x23, 0xdd, 0xb3, 0x99, 0x7c, 0x5c, + 0x67, 0x2d, 0x2c, 0xe3, 0xf2, 0x6c, 0x73, 0x06, + 0xcd, 0x85, 0xe8, 0x30, 0xf2, 0xf8, 0x91, 0x6b, + 0x6e, 0x1f, 0x2c, 0x82, 0x49, 0xa5, 0xd9, 0x20, + 0xe6, 0x2b, 0x9f, 0xdd, 0x43, 0xd4, 0xdc, 0x3e, + 0x3e, 0x40, 0x76, 0x2b, 0x94, 0xf7, 0x13, 0x5c, + 0x3c, 0xc9, 0x33, 0x8b, 0x9c, 0x77, 0x8e, 0x45, + 0xa6, 0xbf, 0xc4, 0xbe, 0xe6, 0xe8, 0x48, 0xd3, + 0xc2, 0xdd, 0xce, 0x41, 0xa3, 0x6b, 0x1c, 0xf7, + 0x06, 0xc6, 0x38, 0x9c, 0x79, 0x16, 0xf7, 0x0f, + 0x8e, 0x96, 0xd9, 0xc6, 0x59, 0x4d, 0x38, 0x86, + 0xd6, 0xac, 0xbb, 0x6b, 0x0b, 0x7b, 0x66, 0xf8, + 0xad, 0xa9, 0xa6, 0xf2, 0x97, 0x39, 0x18, 0x2d, + 0xf6, 0x57, 0x8d, 0xfc, 0x8d, 0x1b, 0xea, 0x83, + 0x3b, 0x01, 0x79, 0xe8, 0xfc, 0xe8, 0x0f, 0x77, + 0x0c, 0x57, 0x3b, 0x0f, 0x7d, 0x5f, 0x7c, 0xaa, + 0xdf, 0xb4, 0x6f, 0x4a, 0xe7, 0x56, 0x3a, 0x6b, + 0x2b, 0x98, 0x22, 0xe6, 0x52, 0x6d, 0xe2, 0xfd, + 0x83, 0xb8, 0xd1, 0x6c, 0x7d, 0x48, 0xbf, 0xf3, + 0xd7, 0xf4, 0xa0, 0xba, 0x79, 0x55, 0xbf, 0x68, + 0xde, 0x94, 0xf2, 0xab, 0x7e, 0xd1, 0xbd, 0x2a, + 0x97, 0xea, 0x45, 0xff, 0x00, 0x9e, 0xbf, 0xa4, + 0xa7, 0xa9, 0x17, 0xfe, 0x7a, 0xfe, 0x92, 0x82, + 0xe9, 0xe5, 0x56, 0xfd, 0xa3, 0x7a, 0x53, 0xca, + 0xad, 0xfb, 0x46, 0xf4, 0xaa, 0x5f, 0xa9, 0x17, + 0xfe, 0x7a, 0xfe, 0x92, 0xa3, 0xd4, 0x8b, 0xff, + 0x00, 0x3d, 0x7f, 0x49, 0x41, 0x75, 0xf2, 0xab, + 0x7e, 0xd1, 0xbd, 0x29, 0xe5, 0x56, 0xfd, 0xa3, + 0x7a, 0x55, 0x2b, 0xd4, 0x9b, 0xff, 0x00, 0x3d, + 0x7f, 0x49, 0x4f, 0x52, 0x6f, 0xfc, 0xf5, 0xfd, + 0x25, 0x05, 0xd7, 0xca, 0xad, 0xfb, 0x46, 0xf4, + 0xa7, 0x95, 0x5b, 0xf6, 0x8d, 0xe9, 0x54, 0xbf, + 0x51, 0xef, 0xeb, 0x4f, 0x2d, 0x7f, 0x4a, 0xd2, + 0x66, 0xac, 0x5d, 0x8b, 0x22, 0x26, 0x5f, 0x3e, + 0x69, 0xc9, 0xda, 0xd0, 0x6b, 0x44, 0x1d, 0x3f, + 0xca, 0xad, 0xf7, 0x75, 0x8d, 0xe9, 0x5e, 0x80, + 0xd5, 0x72, 0x0b, 0x4f, 0x2e, 0xe3, 0x63, 0xe4, + 0x99, 0xd4, 0xe2, 0x06, 0x95, 0x3c, 0xeb, 0xad, + 0x5a, 0x12, 0x6d, 0xa2, 0x24, 0xd4, 0xf0, 0x0d, + 0xbe, 0xe2, 0x0f, 0x64, 0x44, 0x40, 0x44, 0x44, + 0x05, 0x05, 0x4a, 0x84, 0x1a, 0x6f, 0x2a, 0xb7, + 0xc7, 0x65, 0xae, 0x4d, 0xdb, 0xc4, 0x51, 0xdc, + 0x06, 0xbe, 0x39, 0x1d, 0xbb, 0x60, 0xe1, 0xa2, + 0xf3, 0x82, 0xe2, 0x76, 0x45, 0x7d, 0x91, 0x82, + 0x2e, 0xb5, 0x92, 0xc8, 0xd7, 0x35, 0x87, 0xf6, + 0x98, 0xd1, 0xc2, 0x48, 0x5b, 0xa9, 0x21, 0x8a, + 0x4f, 0xe6, 0x31, 0xaf, 0xa6, 0xee, 0x20, 0x0f, + 0xc2, 0xbe, 0x9a, 0xc6, 0xb5, 0xbc, 0x2d, 0x00, + 0x34, 0x6e, 0x03, 0x60, 0x43, 0x8a, 0xb7, 0x90, + 0x97, 0x15, 0x77, 0xd4, 0xc9, 0x8e, 0xe1, 0x39, + 0x00, 0xe6, 0x70, 0x32, 0x3a, 0xb5, 0xc0, 0x71, + 0x02, 0xee, 0x26, 0x8a, 0x2f, 0xb8, 0xee, 0xb1, + 0xb0, 0x66, 0x6f, 0xbc, 0xbd, 0xf1, 0xb5, 0xce, + 0xea, 0xf8, 0x7a, 0xc1, 0x5f, 0xd9, 0x1b, 0xaa, + 0x16, 0xfd, 0xb6, 0xf0, 0x35, 0xdc, 0x4d, 0x8d, + 0x8d, 0x77, 0xca, 0x0d, 0x00, 0xf4, 0xa3, 0xed, + 0xe0, 0x79, 0x25, 0xf1, 0xb1, 0xce, 0x3c, 0xa5, + 0xa0, 0x9f, 0x7d, 0x06, 0xab, 0x06, 0xd6, 0x3a, + 0xe2, 0xf2, 0xe2, 0xdc, 0x01, 0x69, 0x2b, 0xc7, + 0x53, 0x4d, 0x80, 0xd0, 0x0a, 0x91, 0xee, 0xaf, + 0x4d, 0x41, 0x1b, 0xcd, 0xa3, 0x25, 0x68, 0xe2, + 0x10, 0xc8, 0xc9, 0x1c, 0x3f, 0xda, 0x1c, 0x2a, + 0x7d, 0xc5, 0xb2, 0x64, 0x6d, 0x63, 0x43, 0x58, + 0x03, 0x5a, 0x37, 0x00, 0x28, 0x14, 0x96, 0x82, + 0x08, 0x22, 0xa0, 0xf2, 0x15, 0x26, 0x2e, 0xba, + 0x1c, 0xda, 0xb9, 0xaf, 0x20, 0xc9, 0xd9, 0x5d, + 0x43, 0x64, 0x4c, 0x94, 0x8c, 0xf8, 0xe3, 0xe2, + 0x92, 0x47, 0xc5, 0x58, 0x37, 0x39, 0x08, 0x2f, + 0x71, 0xd0, 0x58, 0x40, 0x78, 0xae, 0x9e, 0x58, + 0xc7, 0xc5, 0xca, 0xde, 0x13, 0x47, 0x17, 0x2b, + 0x0c, 0x71, 0x47, 0x18, 0x22, 0x36, 0x35, 0x80, + 0xf2, 0x34, 0x01, 0xf0, 0x28, 0x10, 0x44, 0xd7, + 0x71, 0xb6, 0x36, 0x87, 0x9d, 0xee, 0x00, 0x03, + 0xd2, 0xaf, 0x3e, 0xa4, 0x46, 0xee, 0x8d, 0x46, + 0x39, 0xa5, 0x97, 0xb9, 0x36, 0xf3, 0x16, 0x8a, + 0xf3, 0xd1, 0x80, 0x2d, 0x7d, 0x98, 0x22, 0x3c, + 0x3e, 0xfd, 0x93, 0x4d, 0xfe, 0x6a, 0xd1, 0xd5, + 0xb4, 0x12, 0x40, 0x00, 0xbb, 0x79, 0xe7, 0xef, + 0xa8, 0x10, 0xb0, 0x52, 0x8d, 0x6f, 0x8b, 0xf1, + 0x76, 0x0d, 0x9d, 0xe4, 0x89, 0xdb, 0x1d, 0x28, + 0xbf, 0x8a, 0xbf, 0x91, 0xb7, 0x92, 0xe7, 0x25, + 0x91, 0x8a, 0x30, 0x4b, 0x9d, 0x68, 0xde, 0x11, + 0xce, 0x43, 0x8e, 0xc5, 0xe3, 0x69, 0x0e, 0x9a, + 0x7b, 0x60, 0x6b, 0x63, 0x7c, 0x97, 0x24, 0xb5, + 0xa6, 0x00, 0xf7, 0x97, 0x35, 0xc0, 0xd0, 0x97, + 0x02, 0xea, 0x6c, 0x56, 0x80, 0xc6, 0x82, 0x5d, + 0x41, 0xc4, 0x45, 0x0b, 0xb9, 0x68, 0xbe, 0x5b, + 0x04, 0x2d, 0x77, 0x1b, 0x63, 0x68, 0x7f, 0xca, + 0x00, 0x03, 0xd2, 0x83, 0x49, 0x65, 0x7d, 0x6f, + 0x8c, 0x9e, 0xee, 0xda, 0xe0, 0x91, 0x23, 0xe6, + 0xe2, 0x85, 0x9c, 0xaf, 0x6b, 0x80, 0x02, 0x8b, + 0xd2, 0x79, 0x23, 0x8f, 0x3f, 0x19, 0x90, 0xf0, + 0x09, 0x20, 0xe1, 0x65, 0x79, 0xcd, 0x76, 0x2d, + 0xc3, 0xa1, 0x89, 0xce, 0x0f, 0x73, 0x1a, 0xe7, + 0x0d, 0xce, 0x20, 0x13, 0xd2, 0x8e, 0x8d, 0x8e, + 0x21, 0xce, 0x68, 0x25, 0xbb, 0x89, 0x02, 0xa3, + 0xbc, 0x82, 0xb6, 0x58, 0xf6, 0x60, 0x60, 0xbc, + 0x8d, 0xa4, 0xc9, 0x69, 0x21, 0x92, 0x9f, 0xed, + 0xe2, 0x3c, 0x41, 0x7d, 0x32, 0x17, 0x45, 0x86, + 0xb4, 0x7b, 0xc5, 0x65, 0x9a, 0xe6, 0x39, 0x64, + 0xef, 0xb8, 0xab, 0x17, 0x56, 0xde, 0x1e, 0x1e, + 0x11, 0xc3, 0xf2, 0x69, 0xb1, 0x3a, 0xb6, 0xd0, + 0x0e, 0x11, 0x41, 0xb8, 0x72, 0x0a, 0x27, 0x3e, + 0xe3, 0x97, 0x7b, 0x4b, 0x64, 0x21, 0x93, 0x23, + 0x92, 0xb5, 0x94, 0xf8, 0xd3, 0x1f, 0x89, 0xca, + 0x5a, 0x46, 0xf5, 0xe5, 0xa7, 0xc4, 0xb2, 0xdd, + 0xcb, 0xd7, 0x34, 0xd2, 0xc1, 0xbd, 0x43, 0x09, + 0xe7, 0x24, 0xf1, 0x7b, 0xcb, 0x77, 0x3b, 0x1e, + 0x18, 0xf9, 0x20, 0x63, 0x0d, 0xc5, 0x3c, 0x42, + 0xed, 0x80, 0x9e, 0xe9, 0x1b, 0x57, 0x8e, 0x36, + 0xcd, 0xf6, 0xd0, 0xb8, 0xca, 0x1b, 0xd7, 0xcc, + 0xe3, 0x24, 0xbc, 0x3b, 0xb8, 0x8f, 0x32, 0x73, + 0x4e, 0x0c, 0xc5, 0x2a, 0x14, 0xa2, 0x88, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0xa1, + 0x04, 0xaf, 0x39, 0xa6, 0x8a, 0x08, 0xdd, 0x2c, + 0xae, 0x0c, 0x63, 0x45, 0x4b, 0x8a, 0xc1, 0xcd, + 0xe7, 0x71, 0xf8, 0x5b, 0x47, 0x5d, 0xde, 0xc8, + 0x18, 0x1a, 0x3c, 0x56, 0xfe, 0xd1, 0x3d, 0xc5, + 0xc7, 0x35, 0x7f, 0xb4, 0x3c, 0x86, 0x7a, 0x43, + 0x6b, 0x67, 0xc5, 0x0d, 0xa5, 0x68, 0x1a, 0xdf, + 0x8c, 0xee, 0xfa, 0x0b, 0x0e, 0xb4, 0xf6, 0xa4, + 0xe0, 0xe7, 0xd8, 0x61, 0x0f, 0xfb, 0x5f, 0x3f, + 0xc3, 0x45, 0x4e, 0xc0, 0x69, 0x8c, 0xce, 0xab, + 0xbe, 0x32, 0x9e, 0x2e, 0x07, 0xba, 0xb2, 0xdc, + 0x3b, 0x98, 0xf3, 0x55, 0x6e, 0xf4, 0x7f, 0xb3, + 0x1b, 0xdc, 0x91, 0x8e, 0xf3, 0x27, 0x58, 0x2d, + 0x89, 0xe2, 0x0c, 0x3f, 0x19, 0xc1, 0x75, 0xfc, + 0x76, 0x36, 0xcf, 0x1b, 0x6c, 0xcb, 0x5b, 0x38, + 0xc4, 0x51, 0x30, 0x50, 0x00, 0x36, 0xfb, 0xa8, + 0x34, 0xf8, 0x3d, 0x17, 0x8b, 0xc2, 0x63, 0x9f, + 0x6f, 0x6f, 0x18, 0x74, 0xf2, 0x30, 0xb1, 0xf2, + 0xbb, 0x69, 0x35, 0x14, 0x5c, 0x43, 0x51, 0x62, + 0x66, 0xc4, 0x65, 0x25, 0xb6, 0x91, 0xa5, 0xad, + 0xe2, 0x3c, 0x35, 0xdd, 0x4a, 0xf2, 0x2f, 0xd2, + 0x4b, 0x9f, 0x7b, 0x5a, 0xc4, 0xb6, 0xe3, 0x15, + 0x1d, 0xc4, 0x50, 0xd6, 0x56, 0x3a, 0xae, 0x90, + 0x0d, 0xb4, 0xee, 0xa0, 0xe3, 0x9d, 0xd4, 0x4d, + 0xbc, 0xa3, 0x68, 0xd8, 0x42, 0x20, 0x77, 0x7d, + 0xe4, 0x4f, 0x85, 0x3e, 0x04, 0x04, 0xee, 0x7b, + 0xe8, 0x9d, 0xce, 0x44, 0x04, 0x44, 0x40, 0xee, + 0xaf, 0xba, 0xd5, 0x7c, 0x29, 0xaa, 0x09, 0x2a, + 0x0e, 0xe5, 0x04, 0xd1, 0x59, 0xf4, 0x96, 0x84, + 0xc9, 0xea, 0x29, 0x84, 0xae, 0x69, 0x82, 0xc4, + 0x6d, 0x74, 0xae, 0x1f, 0x18, 0x73, 0x35, 0x06, + 0xa3, 0x09, 0x81, 0xc9, 0xe6, 0xee, 0x85, 0xbd, + 0x8c, 0x45, 0xf5, 0x3e, 0x33, 0xf9, 0x1a, 0x39, + 0xd7, 0x6a, 0xd2, 0x1a, 0x13, 0x1d, 0xa7, 0x61, + 0x6b, 0xc8, 0xeb, 0xef, 0x1c, 0x01, 0x7c, 0xae, + 0x03, 0x61, 0xe6, 0x6a, 0xdb, 0xe0, 0xf4, 0xfe, + 0x3b, 0x07, 0x68, 0xdb, 0x6b, 0x18, 0xc3, 0x00, + 0x03, 0x8d, 0xdc, 0xae, 0x3c, 0xe4, 0xad, 0x9a, + 0x08, 0x52, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x83, 0xe2, 0x43, + 0x46, 0xd1, 0x61, 0xdc, 0x9d, 0xcd, 0x59, 0x32, + 0x3b, 0x6d, 0x39, 0x96, 0x14, 0xce, 0xab, 0xcf, + 0x73, 0x72, 0x0c, 0x9b, 0x16, 0xf8, 0xae, 0x77, + 0x3a, 0xca, 0x5e, 0x50, 0x34, 0x36, 0x26, 0xd3, + 0x97, 0x6a, 0xf5, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x41, 0x07, 0x71, 0xef, 0x2e, 0x7f, 0x6f, 0x95, + 0x9b, 0x11, 0x96, 0xbe, 0x77, 0x93, 0xba, 0x41, + 0x23, 0x8d, 0x08, 0x0b, 0xa0, 0xaf, 0x23, 0x6b, + 0x6e, 0xe3, 0x53, 0x1b, 0x49, 0xe7, 0xa0, 0x41, + 0x51, 0xf5, 0xd2, 0x5f, 0x32, 0x7f, 0x41, 0x4f, + 0x5d, 0x25, 0xf3, 0x27, 0xf4, 0x15, 0x6d, 0xf2, + 0x4b, 0x6e, 0xc9, 0xbd, 0x01, 0x3c, 0x92, 0xdb, + 0xb2, 0x6f, 0x40, 0x41, 0x52, 0x3a, 0xd2, 0x5f, + 0x32, 0x7f, 0x41, 0x52, 0x35, 0xa4, 0xbe, 0x64, + 0xfe, 0x82, 0xad, 0x9e, 0x49, 0x6d, 0xd9, 0x37, + 0xa0, 0x27, 0x92, 0x5b, 0x76, 0x4d, 0xe8, 0x08, + 0x28, 0x59, 0xcd, 0x41, 0x36, 0x52, 0xcc, 0x5b, + 0x36, 0xd5, 0xcd, 0x77, 0x15, 0x6b, 0x45, 0x9b, + 0x81, 0xd2, 0x52, 0x5c, 0x86, 0x5c, 0xe5, 0x2b, + 0xc3, 0xbd, 0xb1, 0x77, 0x15, 0xc3, 0xc8, 0xed, + 0xbb, 0x26, 0x74, 0x05, 0xea, 0x00, 0x02, 0x83, + 0x70, 0x41, 0xe7, 0x04, 0x11, 0x41, 0x10, 0x8a, + 0x16, 0x86, 0x31, 0xbb, 0x80, 0x5e, 0x85, 0x4a, + 0x84, 0x15, 0xed, 0x46, 0x3a, 0xec, 0x85, 0x85, + 0xb9, 0xf8, 0xa5, 0xfc, 0x45, 0x6f, 0xc0, 0x00, + 0x01, 0xcc, 0x28, 0xb4, 0x1a, 0x80, 0xf5, 0x79, + 0x4c, 0x7c, 0xc7, 0xe2, 0x87, 0x53, 0xa5, 0x58, + 0x2b, 0x5d, 0xbc, 0xea, 0x88, 0x52, 0x8a, 0x10, + 0x4a, 0x28, 0x52, 0x82, 0x14, 0xa2, 0x20, 0x22, + 0x22, 0x08, 0x55, 0x1d, 0x58, 0x5d, 0x73, 0x98, + 0xb2, 0xb3, 0x3f, 0x10, 0x1e, 0x22, 0x15, 0xbd, + 0x54, 0x35, 0x11, 0xea, 0xf5, 0x35, 0x9b, 0xdd, + 0xb1, 0xae, 0x14, 0x05, 0x49, 0x1b, 0x42, 0xd0, + 0x36, 0x0d, 0xc3, 0x72, 0x29, 0x76, 0xf5, 0x08, + 0x0b, 0x4b, 0xa9, 0x99, 0xd5, 0x3a, 0xd6, 0xf1, + 0xbb, 0x1f, 0x1c, 0x83, 0x6a, 0xdd, 0x2d, 0x3e, + 0xaa, 0x70, 0xf2, 0x48, 0x63, 0xde, 0xe7, 0xbc, + 0x51, 0x05, 0xc2, 0xda, 0x4e, 0xb2, 0x08, 0xe4, + 0x3f, 0xb4, 0xd0, 0x57, 0xa1, 0x20, 0x0a, 0x93, + 0x4a, 0x2c, 0x48, 0x26, 0x8e, 0xdb, 0x1f, 0x13, + 0xa6, 0x70, 0x6b, 0x59, 0x18, 0xa9, 0x3d, 0xc0, + 0xb4, 0x57, 0x79, 0x8b, 0xdc, 0xc3, 0xfc, 0x97, + 0x12, 0xd2, 0xd8, 0x89, 0xa3, 0xe7, 0x28, 0x32, + 0xf3, 0x3a, 0x8d, 0xb6, 0xc7, 0xc9, 0xac, 0x87, + 0x5d, 0x74, 0xed, 0x80, 0x0d, 0xb4, 0x25, 0x78, + 0x63, 0xb0, 0x17, 0x17, 0x72, 0xf9, 0x66, 0x61, + 0xc6, 0x47, 0x9d, 0xad, 0x8b, 0x90, 0x2c, 0xdc, + 0x36, 0x9e, 0xb7, 0xc7, 0x8e, 0xb5, 0xe7, 0xad, + 0xb8, 0x76, 0xd7, 0x3d, 0xdb, 0x68, 0xb6, 0xe1, + 0x04, 0x47, 0x1b, 0x23, 0x68, 0x63, 0x00, 0x6b, + 0x46, 0xe0, 0x17, 0xd2, 0x22, 0x02, 0x22, 0x20, + 0xd7, 0x6a, 0x0f, 0xb9, 0x6f, 0x3f, 0xa4, 0xef, + 0x81, 0x56, 0xbd, 0x94, 0x7e, 0x5d, 0x7f, 0xf5, + 0x9f, 0xf0, 0x95, 0x65, 0xd4, 0x3f, 0x72, 0xde, + 0x7f, 0x49, 0xdf, 0x02, 0xad, 0x7b, 0x28, 0xfc, + 0xbc, 0xff, 0x00, 0xeb, 0x3f, 0xe1, 0x28, 0x2e, + 0xca, 0x2a, 0xbc, 0x6f, 0xae, 0x9b, 0x69, 0x6b, + 0x2d, 0xcb, 0xb6, 0xb6, 0x36, 0xf1, 0x51, 0x52, + 0x6f, 0x35, 0xb6, 0x4a, 0x70, 0x7c, 0x92, 0x02, + 0xc6, 0x6d, 0x01, 0xf4, 0xaa, 0x0b, 0xc4, 0xb7, + 0x10, 0xc4, 0x2b, 0x24, 0x81, 0x83, 0xba, 0x56, + 0x93, 0x23, 0xac, 0xb1, 0x76, 0x95, 0x6b, 0x1d, + 0xd6, 0xbc, 0x72, 0x05, 0x46, 0x96, 0xf7, 0x23, + 0x76, 0xfa, 0xdd, 0xba, 0x42, 0x0e, 0xf0, 0x36, + 0x2f, 0xb6, 0xf9, 0x18, 0x02, 0xb0, 0x3c, 0x91, + 0xca, 0x42, 0x0d, 0x85, 0xfe, 0xb6, 0xc9, 0x5d, + 0x3c, 0x8b, 0x7a, 0x40, 0xcf, 0xf1, 0xce, 0xb4, + 0x73, 0xdd, 0xdc, 0x5c, 0xb8, 0xba, 0x79, 0x0b, + 0xc9, 0xe4, 0xae, 0xc5, 0x9b, 0xc5, 0x67, 0xbc, + 0x40, 0xfe, 0x85, 0x15, 0xb4, 0xec, 0x1f, 0xd0, + 0xa8, 0xc3, 0xb7, 0xb8, 0x7d, 0xbb, 0xf8, 0xa3, + 0x00, 0xd7, 0x7d, 0x56, 0xf6, 0xcd, 0xd8, 0xcc, + 0xa3, 0x7a, 0xb9, 0x18, 0x22, 0x9f, 0x9c, 0x6c, + 0x5a, 0x99, 0xa0, 0x81, 0xf0, 0x3a, 0xe2, 0x1a, + 0x80, 0xc3, 0x42, 0xd2, 0xb1, 0xa3, 0x92, 0x48, + 0xe4, 0x6b, 0xe2, 0x27, 0x8d, 0xbb, 0xa8, 0x82, + 0xc7, 0x0d, 0xde, 0x4b, 0x4f, 0xdc, 0x34, 0x17, + 0x19, 0x6c, 0x89, 0xe5, 0xe4, 0x0a, 0xdd, 0x16, + 0x46, 0xd1, 0xf6, 0xed, 0xba, 0x12, 0x34, 0x46, + 0xf1, 0x5d, 0xea, 0xa3, 0x26, 0x40, 0xdd, 0x58, + 0xf5, 0x72, 0xc7, 0xf1, 0x85, 0x1c, 0x0e, 0xfa, + 0xaf, 0x0c, 0x5c, 0x0f, 0xb8, 0x95, 0x98, 0xd0, + 0xe7, 0x07, 0x0d, 0xa0, 0x3b, 0x60, 0x1e, 0xe2, + 0x0c, 0xed, 0x47, 0x75, 0x69, 0x7d, 0x2c, 0x72, + 0xd9, 0x80, 0xc9, 0xe1, 0x35, 0xeb, 0xb7, 0x15, + 0x83, 0x67, 0x79, 0x25, 0xb6, 0x46, 0x0c, 0x9b, + 0x08, 0x73, 0x0b, 0x84, 0x73, 0xbf, 0x9d, 0x5a, + 0xac, 0xb4, 0xfd, 0xa4, 0x2d, 0xa4, 0xff, 0x00, + 0xc6, 0x91, 0xc3, 0x69, 0x3c, 0x8a, 0x9d, 0x74, + 0x3c, 0x9c, 0x5e, 0xda, 0x57, 0x64, 0x72, 0x87, + 0xb1, 0x41, 0x74, 0xd5, 0xae, 0x0f, 0xd2, 0xf7, + 0xef, 0x1b, 0x9d, 0x03, 0x88, 0xf7, 0x42, 0xd6, + 0xfb, 0x2f, 0xfc, 0xa1, 0x69, 0xee, 0xac, 0x9c, + 0xeb, 0x8b, 0xb4, 0x55, 0xc3, 0x9d, 0xbc, 0xda, + 0x9a, 0xff, 0x00, 0xe2, 0xb1, 0xbd, 0x97, 0xfe, + 0x50, 0xb4, 0xf7, 0x50, 0x5b, 0x51, 0x11, 0x05, + 0x4f, 0x37, 0xf9, 0xa6, 0xc7, 0xbf, 0x1f, 0xef, + 0x2b, 0x5a, 0xaa, 0x66, 0xff, 0x00, 0x34, 0xd8, + 0xf7, 0xe3, 0xfd, 0xe5, 0x6b, 0x41, 0x28, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0xaa, 0x7a, + 0xaf, 0xef, 0xac, 0x7f, 0x79, 0xbf, 0xdc, 0x0a, + 0xd8, 0xaa, 0x7a, 0xaf, 0xef, 0xac, 0x7f, 0x79, + 0xbf, 0xdc, 0x08, 0x2d, 0x7c, 0xaa, 0x54, 0x72, + 0xa9, 0x40, 0x44, 0x44, 0x10, 0xa8, 0x1a, 0x96, + 0xd1, 0xd6, 0x59, 0xde, 0xb1, 0xa2, 0x91, 0xdc, + 0xed, 0xee, 0x55, 0x74, 0x05, 0x5c, 0xd6, 0xb6, + 0x46, 0x7c, 0x68, 0xb8, 0x68, 0xf1, 0xad, 0xcf, + 0x11, 0xef, 0x20, 0xd0, 0x5b, 0xcd, 0x2b, 0x1d, + 0xd5, 0xc6, 0xf3, 0x1b, 0x65, 0x21, 0xae, 0xef, + 0x2d, 0xf8, 0x93, 0x13, 0x86, 0x88, 0x39, 0xb4, + 0x9e, 0xe5, 0xc3, 0x67, 0x29, 0xa9, 0x55, 0x88, + 0x9f, 0xd6, 0x44, 0xd7, 0x8d, 0xe4, 0x2d, 0xe6, + 0x18, 0x62, 0xe3, 0x81, 0xd7, 0x77, 0x87, 0x8a, + 0x56, 0x9a, 0x06, 0x9d, 0xbd, 0x08, 0x3e, 0xdb, + 0x06, 0x53, 0x34, 0xfe, 0xb2, 0x62, 0x60, 0xb6, + 0xe6, 0x3b, 0x36, 0x2c, 0x7c, 0xcd, 0xae, 0x3e, + 0xd5, 0x91, 0xc5, 0x6a, 0xe0, 0xf9, 0x47, 0xc6, + 0x21, 0x32, 0x39, 0xeb, 0x8b, 0xa3, 0xd5, 0xc1, + 0xfc, 0x28, 0x46, 0xca, 0x0d, 0xe4, 0x2d, 0x60, + 0xa9, 0x35, 0x24, 0x9e, 0xe9, 0x41, 0x15, 0xe7, + 0x5f, 0x2f, 0x7b, 0x23, 0x6f, 0x13, 0xcf, 0x0b, + 0x46, 0xf2, 0xb1, 0xee, 0xef, 0xe2, 0xb6, 0x04, + 0x03, 0xc5, 0x29, 0xd8, 0x1a, 0x37, 0xaf, 0x7c, + 0x56, 0x9b, 0xc9, 0x66, 0x24, 0x6c, 0xf7, 0xb5, + 0x86, 0xdb, 0x7f, 0x09, 0xe5, 0x08, 0x30, 0xbc, + 0xa2, 0xee, 0xfe, 0x5f, 0x27, 0xc7, 0x46, 0xe7, + 0xf1, 0x6c, 0x2f, 0xe4, 0x0a, 0xd1, 0x82, 0xd1, + 0xb6, 0xf6, 0x84, 0x5c, 0xdf, 0x91, 0x35, 0xc1, + 0xda, 0x41, 0xe4, 0x2b, 0x77, 0x67, 0x61, 0x65, + 0x8e, 0x84, 0x47, 0x6e, 0xc0, 0xd0, 0xd1, 0x42, + 0xf3, 0x4a, 0xac, 0x7b, 0xcc, 0xbb, 0x59, 0x58, + 0xe1, 0xf1, 0x9c, 0x3f, 0x69, 0x06, 0x64, 0xf7, + 0x50, 0x5b, 0x33, 0xc6, 0x21, 0xa0, 0x6e, 0x60, + 0x5a, 0xf3, 0x9d, 0x20, 0x9a, 0x33, 0x67, 0x22, + 0xd6, 0x3e, 0x47, 0xc8, 0x4b, 0x9e, 0x49, 0x27, + 0x9d, 0x7c, 0xa0, 0xda, 0x7a, 0x74, 0xfc, 0x95, + 0x3e, 0x9c, 0xff, 0x00, 0x6a, 0xd5, 0x2c, 0xab, + 0x2b, 0x29, 0x6e, 0x5c, 0x0d, 0x29, 0x18, 0xda, + 0x4a, 0xb6, 0x33, 0xe0, 0xca, 0xcb, 0x70, 0xf0, + 0xc6, 0x47, 0x5d, 0xbb, 0x4a, 0xd8, 0x8a, 0xec, + 0xaa, 0xd7, 0xba, 0xf6, 0xd6, 0xc6, 0x91, 0x44, + 0xde, 0x2a, 0x6f, 0x2a, 0x1b, 0x99, 0x0f, 0x70, + 0x6b, 0x58, 0x4b, 0x8f, 0x22, 0x58, 0xd8, 0x9d, + 0x8a, 0x1c, 0xf6, 0xc6, 0xde, 0x39, 0x1c, 0x18, + 0xc1, 0xbd, 0xc7, 0x60, 0x58, 0xf7, 0x79, 0x0b, + 0x6b, 0x1b, 0x6f, 0x28, 0xbb, 0x77, 0x06, 0xca, + 0x86, 0x9d, 0xe4, 0xaa, 0x1e, 0x67, 0x50, 0x5e, + 0x66, 0xe6, 0x31, 0xc0, 0x4c, 0x56, 0x8d, 0x34, + 0x14, 0xe5, 0x50, 0x6d, 0x75, 0x1e, 0xaf, 0x24, + 0x9b, 0x1c, 0x51, 0xa9, 0x3b, 0x1f, 0x28, 0x55, + 0xb8, 0x6d, 0x88, 0x26, 0x59, 0xdc, 0x64, 0x9d, + 0xdb, 0x6a, 0x79, 0xca, 0xf5, 0xb6, 0xb5, 0x20, + 0x88, 0xa1, 0x69, 0x7c, 0x8e, 0x3c, 0x83, 0x6d, + 0x55, 0xc7, 0x03, 0xa5, 0x84, 0x45, 0xb7, 0x57, + 0xbb, 0x5f, 0xbc, 0x46, 0x79, 0x3b, 0xe8, 0x35, + 0x78, 0x5d, 0x37, 0x73, 0x7f, 0x23, 0x66, 0x9d, + 0xbd, 0x5c, 0x0d, 0x20, 0x8a, 0xf2, 0xab, 0xd4, + 0x6c, 0x11, 0xb1, 0xac, 0x6e, 0xe6, 0x80, 0x07, + 0xb8, 0xa5, 0xad, 0x0d, 0x14, 0x68, 0x00, 0x0e, + 0x40, 0xbe, 0x90, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x7c, 0xbd, 0xed, 0x8d, 0xa5, 0xef, + 0x21, 0xad, 0x68, 0xab, 0x89, 0xdc, 0x00, 0x41, + 0x25, 0x56, 0x75, 0x66, 0xb9, 0xc6, 0xe9, 0xfb, + 0x77, 0x00, 0xf1, 0x35, 0xd9, 0xd8, 0xc8, 0x9b, + 0xb6, 0x87, 0xba, 0xab, 0x1a, 0xe7, 0xda, 0x6b, + 0x20, 0x2f, 0xc7, 0x61, 0x5e, 0x1d, 0x21, 0xf1, + 0x64, 0x9c, 0x6e, 0x1d, 0xe5, 0x43, 0xc2, 0x60, + 0x33, 0x5a, 0xb3, 0x20, 0x78, 0x4b, 0x9f, 0x53, + 0x59, 0x67, 0x75, 0x68, 0x36, 0xa0, 0xf8, 0xc9, + 0x65, 0x73, 0x9a, 0xaf, 0x25, 0x47, 0x71, 0x4c, + 0xf9, 0x1d, 0xe2, 0x42, 0xdd, 0xa1, 0xb5, 0x2b, + 0xa3, 0xe8, 0xaf, 0x66, 0x36, 0xf6, 0x21, 0x97, + 0xd9, 0x76, 0x89, 0x6e, 0x4e, 0xd6, 0xc4, 0x77, + 0x0e, 0x5d, 0xaa, 0xc9, 0xa5, 0xf4, 0x66, 0x2f, + 0x4f, 0xdb, 0x35, 0xb1, 0xb0, 0x49, 0x70, 0x69, + 0xc7, 0x29, 0x1b, 0x6b, 0xdc, 0x56, 0x14, 0x10, + 0xd6, 0xb5, 0x8d, 0x0d, 0x68, 0xa3, 0x46, 0xc0, + 0x07, 0x20, 0x5f, 0x48, 0x88, 0x0b, 0x1e, 0xf6, + 0xca, 0xde, 0xfa, 0xdd, 0xd6, 0xf7, 0x0d, 0x0f, + 0x8d, 0xfb, 0xc1, 0x59, 0x08, 0x83, 0x81, 0xfb, + 0x41, 0xd3, 0x07, 0x03, 0x98, 0x71, 0x85, 0xa4, + 0x5a, 0x5c, 0xf8, 0xd1, 0x3b, 0x90, 0x1e, 0x65, + 0x57, 0x5f, 0xa0, 0x35, 0xde, 0x9d, 0x8b, 0x3b, + 0x83, 0x96, 0x33, 0xb2, 0x6b, 0x76, 0x99, 0x62, + 0x23, 0x7d, 0x5a, 0x2b, 0x45, 0xf9, 0xfc, 0x87, + 0x35, 0xc5, 0x8e, 0x04, 0x3d, 0x86, 0x8e, 0x07, + 0x9c, 0x20, 0x77, 0x39, 0x51, 0x39, 0x3b, 0x88, + 0x80, 0x88, 0x9d, 0xed, 0xe8, 0x08, 0x8a, 0x36, + 0xa0, 0x95, 0x2d, 0x0e, 0x73, 0xc3, 0x1a, 0x38, + 0x9c, 0xe3, 0x46, 0x81, 0xb4, 0xd5, 0x64, 0x63, + 0xf1, 0xb7, 0xd9, 0x3b, 0x86, 0xdb, 0x59, 0x44, + 0xe9, 0xa4, 0x71, 0x1b, 0x1a, 0x2b, 0x4e, 0xfa, + 0xec, 0x7a, 0x2b, 0xd9, 0xcd, 0x9e, 0x15, 0xad, + 0xbd, 0xbd, 0x1d, 0x7d, 0xeb, 0x85, 0x78, 0x5c, + 0x2a, 0xd6, 0x20, 0xae, 0x68, 0xaf, 0x65, 0xd2, + 0x4e, 0x59, 0x91, 0xce, 0xb7, 0x86, 0x27, 0x51, + 0xd1, 0xdb, 0xf2, 0x9f, 0x9c, 0xba, 0xad, 0xb5, + 0xac, 0x16, 0xb0, 0xb6, 0x0b, 0x76, 0x08, 0xe3, + 0x60, 0xa3, 0x5a, 0xd1, 0x4d, 0x81, 0x7a, 0x80, + 0x37, 0x72, 0x29, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x51, 0x5a, + 0x6f, 0x45, 0xa6, 0xd5, 0x0e, 0x8c, 0x58, 0xc5, + 0xd7, 0x3b, 0x86, 0x23, 0x33, 0x04, 0x86, 0xa4, + 0x78, 0xbd, 0xf0, 0x9c, 0xba, 0xcd, 0x0d, 0xcd, + 0x41, 0xdc, 0x42, 0x55, 0x56, 0x60, 0xf4, 0x4b, + 0x32, 0x56, 0x83, 0x0d, 0x38, 0x74, 0x8e, 0x75, + 0x25, 0x68, 0x79, 0x70, 0x2c, 0xe5, 0xde, 0x56, + 0x7d, 0xe5, 0xfe, 0x62, 0x37, 0x4b, 0x25, 0xb5, + 0xb4, 0x66, 0xde, 0x1e, 0x59, 0x5c, 0x43, 0x9d, + 0x4d, 0xfc, 0x20, 0x27, 0x0b, 0x29, 0xb1, 0x95, + 0xae, 0x00, 0xb9, 0x60, 0x96, 0xbc, 0x93, 0xb1, + 0x79, 0x4d, 0x99, 0xb8, 0x73, 0x2c, 0xfc, 0x96, + 0x20, 0xf7, 0xde, 0xb0, 0x96, 0x87, 0x92, 0x00, + 0x22, 0x9b, 0xe8, 0xb6, 0x4c, 0x73, 0xd9, 0x6d, + 0xd6, 0xdc, 0x86, 0xb6, 0x46, 0xb4, 0x99, 0x03, + 0x36, 0x8d, 0x82, 0xbb, 0x2a, 0x9c, 0xfa, 0x4d, + 0x7b, 0x8e, 0x5d, 0x5f, 0x16, 0x46, 0x41, 0x56, + 0x3b, 0x70, 0xdc, 0x56, 0x5a, 0xd4, 0xd8, 0x64, + 0x6f, 0xee, 0x65, 0x8d, 0xef, 0xb7, 0x02, 0xce, + 0x70, 0x4c, 0x32, 0xb4, 0x92, 0xea, 0x0d, 0xdc, + 0x63, 0x91, 0x7c, 0xcd, 0x95, 0xc9, 0x3d, 0xf3, + 0x3e, 0xc6, 0xdd, 0x92, 0x5b, 0x5b, 0x92, 0xd7, + 0xb9, 0xe4, 0x87, 0x38, 0xb7, 0xe3, 0x70, 0x01, + 0xcc, 0x83, 0x6e, 0x95, 0xda, 0xb5, 0x52, 0xe6, + 0x24, 0x99, 0xb6, 0xec, 0xc7, 0x31, 0xb2, 0xcf, + 0x70, 0xde, 0x30, 0xd9, 0x09, 0x0d, 0x0c, 0x1b, + 0xeb, 0x4e, 0xea, 0xc1, 0xc7, 0xe4, 0x65, 0x86, + 0xe3, 0x29, 0x71, 0x78, 0xd2, 0xc7, 0xc6, 0xe8, + 0xda, 0x58, 0x09, 0x20, 0x9e, 0x1a, 0x78, 0xb5, + 0xe7, 0x29, 0xdb, 0xc6, 0xbe, 0x62, 0xc8, 0x8b, + 0x53, 0x06, 0x47, 0x21, 0x1c, 0xd1, 0x36, 0xfe, + 0x28, 0xe3, 0x8a, 0x73, 0xc3, 0x1b, 0xa3, 0x71, + 0x24, 0x13, 0xb4, 0x71, 0x57, 0xb8, 0xb6, 0xa8, + 0x25, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x42, 0x94, 0x41, 0xa3, 0xd5, + 0x76, 0xb2, 0x4d, 0x8f, 0x13, 0x44, 0x2b, 0x25, + 0xbb, 0x83, 0xc7, 0x78, 0x2c, 0xcc, 0x3d, 0xfc, + 0x77, 0xd6, 0x31, 0xcc, 0xd3, 0x52, 0x00, 0x0f, + 0x1c, 0xa0, 0x85, 0x9c, 0xf6, 0xb5, 0xed, 0x2d, + 0x70, 0xab, 0x5c, 0x28, 0x47, 0x70, 0xaa, 0x9d, + 0xcd, 0xb5, 0xee, 0x9e, 0xbd, 0x37, 0x76, 0xa0, + 0xbe, 0xc6, 0x43, 0xe3, 0xb3, 0x9a, 0xaa, 0x8b, + 0x62, 0x85, 0xa8, 0xb6, 0xd5, 0x38, 0xb9, 0x9a, + 0x1c, 0xe7, 0xf0, 0x3b, 0x94, 0x39, 0x7b, 0x7a, + 0xc3, 0x8a, 0xed, 0x87, 0x4a, 0x0d, 0x92, 0x2d, + 0x77, 0xa7, 0xf1, 0x5d, 0xb3, 0x7a, 0x54, 0xfa, + 0x7b, 0x16, 0x7f, 0xf7, 0x37, 0xa5, 0x06, 0xc1, + 0x16, 0xbf, 0xd3, 0xb8, 0xbe, 0xd8, 0x74, 0xa9, + 0xf4, 0xde, 0x33, 0xb7, 0x6f, 0x4a, 0x0c, 0xf4, + 0x58, 0x3e, 0x9a, 0xc6, 0x76, 0xed, 0xe9, 0x41, + 0x99, 0xc6, 0xf6, 0xed, 0x41, 0x9a, 0xab, 0x5a, + 0xd6, 0xd2, 0x47, 0x5b, 0xc3, 0x7f, 0x08, 0xab, + 0xad, 0x9c, 0x0b, 0xb9, 0xe9, 0x55, 0xb9, 0xf4, + 0xc6, 0x3b, 0xb7, 0x6f, 0x4a, 0xf9, 0x9b, 0x23, + 0x8a, 0xb8, 0x89, 0xf0, 0xc9, 0x33, 0x5c, 0xc7, + 0x8a, 0x38, 0x77, 0xd0, 0x6b, 0x6c, 0xae, 0x62, + 0xbb, 0xb5, 0x64, 0xf1, 0xb8, 0x10, 0xe0, 0x38, + 0xa9, 0xc8, 0x57, 0xb2, 0xac, 0x3a, 0x7f, 0x57, + 0xef, 0xde, 0xd8, 0x24, 0xeb, 0xec, 0xa5, 0x35, + 0x00, 0x6d, 0xa6, 0xd5, 0xb6, 0x87, 0x50, 0xe2, + 0xe5, 0x6f, 0x11, 0x90, 0x37, 0xb8, 0x52, 0x86, + 0xc8, 0x0a, 0xf8, 0x55, 0x63, 0x33, 0x91, 0x82, + 0x5c, 0xbc, 0x0c, 0x27, 0x8a, 0x2b, 0x72, 0x1c, + 0xea, 0x6d, 0xa9, 0x0b, 0xde, 0xff, 0x00, 0x52, + 0x75, 0xc7, 0xc9, 0x71, 0x8c, 0x2f, 0x96, 0x4f, + 0x14, 0x10, 0xb6, 0x3a, 0x7f, 0x49, 0x36, 0x1a, + 0x5d, 0xe4, 0x3c, 0x79, 0x9d, 0xe3, 0x70, 0x9e, + 0x7e, 0xea, 0x83, 0xe1, 0x96, 0x99, 0x3d, 0x43, + 0x3f, 0x59, 0x71, 0x58, 0x2c, 0x9a, 0x7c, 0x56, + 0x6e, 0xa8, 0x56, 0x6b, 0x2b, 0x1b, 0x6b, 0x28, + 0x44, 0x30, 0x30, 0x35, 0xad, 0xd8, 0xbd, 0x98, + 0xc6, 0xb1, 0xa1, 0xad, 0x00, 0x01, 0xc8, 0xbe, + 0x90, 0x42, 0x94, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x1a, 0xed, 0x43, 0xf7, 0x2d, 0xe7, 0xf4, + 0x9d, 0xf0, 0x2a, 0xd7, 0xb2, 0x8f, 0xcb, 0xcf, + 0xfe, 0xb3, 0xfe, 0x12, 0xac, 0xba, 0x87, 0xee, + 0x5b, 0xcf, 0xe9, 0x3b, 0xe0, 0x55, 0xaf, 0x65, + 0x1f, 0x97, 0x9f, 0xfd, 0x67, 0xfc, 0x25, 0x05, + 0x9b, 0x3f, 0xf7, 0x3d, 0xd7, 0xcc, 0x2a, 0x93, + 0x6a, 0x6e, 0x9a, 0xdb, 0x36, 0x43, 0x08, 0x74, + 0x2e, 0x1e, 0x3b, 0xa9, 0xd3, 0x55, 0x75, 0xcf, + 0xfd, 0xcf, 0x75, 0xf3, 0x0a, 0xa9, 0xbb, 0x20, + 0xfb, 0x5c, 0x05, 0xb4, 0x10, 0x6d, 0xb8, 0xb8, + 0xf1, 0x59, 0xce, 0x2b, 0xb1, 0x06, 0x4e, 0x43, + 0x2d, 0x8f, 0xb7, 0x7f, 0x51, 0x6d, 0x00, 0x9e, + 0x7a, 0x0a, 0x86, 0x8a, 0xed, 0x58, 0x7e, 0x57, + 0x96, 0x24, 0x49, 0xe8, 0xef, 0x13, 0x9a, 0x8b, + 0xec, 0x39, 0xb8, 0x96, 0xc7, 0x63, 0x63, 0x17, + 0x95, 0x65, 0x67, 0x15, 0x99, 0xe7, 0x6f, 0x09, + 0x2b, 0x23, 0xd0, 0xba, 0xa4, 0xb0, 0xcf, 0xd7, + 0x80, 0xf3, 0xb7, 0xab, 0x3f, 0x02, 0x09, 0xc7, + 0xe5, 0xac, 0x2e, 0x24, 0xea, 0x2e, 0xad, 0xc5, + 0xbc, 0xdc, 0x81, 0xc2, 0x8a, 0x33, 0x4d, 0x9a, + 0x2b, 0x88, 0x5b, 0x6b, 0x00, 0x74, 0x4e, 0x1e, + 0x33, 0x80, 0xd9, 0x45, 0x85, 0x79, 0x70, 0xcb, + 0xb8, 0x24, 0xb6, 0xca, 0xc6, 0x2d, 0x72, 0x36, + 0xc2, 0xb1, 0x48, 0x36, 0x71, 0x2c, 0xed, 0x3d, + 0x93, 0x75, 0xed, 0x8b, 0xe1, 0x97, 0x6c, 0xd0, + 0x82, 0x2a, 0x79, 0x40, 0x41, 0xa0, 0x64, 0x61, + 0xf0, 0x5c, 0xb0, 0x0d, 0x9d, 0x66, 0xd0, 0x17, + 0x94, 0x93, 0x43, 0x69, 0x48, 0xe2, 0x8e, 0xaf, + 0x23, 0xe3, 0x3b, 0x7a, 0xd8, 0xe2, 0x68, 0x65, + 0xb9, 0xaf, 0xcb, 0xe5, 0x5a, 0xfc, 0xde, 0xcb, + 0xdf, 0x71, 0x5a, 0x19, 0x18, 0x1b, 0x91, 0x35, + 0xf1, 0x65, 0xc7, 0x8d, 0xc4, 0x3c, 0x5a, 0xad, + 0x85, 0xef, 0xfc, 0x4c, 0xf5, 0x9d, 0xc3, 0x3c, + 0x5e, 0x32, 0x1a, 0xea, 0x2d, 0x1e, 0x29, 0xc5, + 0xb9, 0x18, 0x88, 0xe7, 0x5b, 0xdc, 0xbf, 0x8f, + 0x92, 0xb1, 0x63, 0x77, 0xf1, 0x82, 0x82, 0xe9, + 0x5d, 0xce, 0x1b, 0xa9, 0x52, 0x57, 0x38, 0xbf, + 0x71, 0xbb, 0xce, 0xcb, 0x04, 0x22, 0xa6, 0x69, + 0x00, 0xd9, 0xdc, 0x57, 0x8c, 0xce, 0x42, 0x3c, + 0x6e, 0x39, 0xf2, 0xb8, 0x80, 0xf2, 0xde, 0x16, + 0x37, 0x96, 0xb4, 0x5a, 0x6d, 0x1f, 0x81, 0x93, + 0xad, 0x39, 0x7b, 0xb1, 0xe3, 0x4b, 0x53, 0x1b, + 0x4f, 0x25, 0x52, 0x46, 0xd3, 0x53, 0x45, 0xd4, + 0xe9, 0x1b, 0xc8, 0xbe, 0x45, 0xb1, 0x6f, 0x43, + 0x56, 0x07, 0xb2, 0xff, 0x00, 0xca, 0x16, 0x9e, + 0xea, 0xd9, 0xeb, 0x0f, 0xcb, 0x59, 0x0f, 0xe8, + 0xbb, 0xe0, 0x5a, 0xcf, 0x65, 0xff, 0x00, 0x94, + 0x2d, 0x3d, 0xd5, 0x05, 0xb5, 0x11, 0x10, 0x54, + 0xf3, 0x7f, 0x9a, 0x6c, 0x7b, 0xf1, 0xfe, 0xf2, + 0xb5, 0x85, 0x54, 0xcd, 0xfe, 0x69, 0xb1, 0xef, + 0xc7, 0xfb, 0xca, 0xd6, 0x82, 0x51, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x54, 0xb5, 0x5f, + 0xdf, 0x58, 0xee, 0xf3, 0x7f, 0xb8, 0x15, 0xb5, + 0x54, 0xf5, 0x5f, 0xdf, 0x58, 0xfe, 0xf3, 0x7f, + 0xb8, 0x10, 0x5a, 0xf9, 0x54, 0xa8, 0xe5, 0x52, + 0x80, 0x88, 0x88, 0x0b, 0x1e, 0xfe, 0xd9, 0xb7, + 0x76, 0x72, 0xdb, 0xbb, 0x74, 0x8d, 0x21, 0x64, + 0x28, 0x28, 0x39, 0x85, 0xa0, 0x30, 0xbe, 0x5b, + 0x57, 0xfc, 0x68, 0x9c, 0x40, 0xef, 0x2c, 0x93, + 0xbb, 0xb9, 0xcc, 0xb2, 0x35, 0x2d, 0xa9, 0xb0, + 0xce, 0x75, 0xc0, 0x52, 0x2b, 0x9d, 0xbd, 0xca, + 0xad, 0x6d, 0xce, 0x42, 0x18, 0x6a, 0xd6, 0x83, + 0x24, 0x87, 0x63, 0x5a, 0xdd, 0xa8, 0x32, 0x24, + 0x7b, 0x22, 0x6f, 0x13, 0xcd, 0x02, 0xc2, 0x8a, + 0x5b, 0xec, 0xa4, 0xfe, 0x4f, 0x8e, 0x65, 0x41, + 0xd8, 0xe9, 0x29, 0xb9, 0x67, 0xe3, 0xb4, 0xbe, + 0x4f, 0x2d, 0x2b, 0x66, 0xbd, 0x26, 0x1b, 0x63, + 0xb7, 0x83, 0xb8, 0xae, 0x96, 0x18, 0xdb, 0x4c, + 0x6c, 0x22, 0x1b, 0x58, 0xc3, 0x68, 0x28, 0x5d, + 0x41, 0x52, 0x83, 0x4b, 0x86, 0xd1, 0xb6, 0xb6, + 0x65, 0xb7, 0x17, 0xa7, 0xaf, 0xb9, 0x3b, 0x4d, + 0x76, 0x80, 0x56, 0xf6, 0xe2, 0xe6, 0x1b, 0x58, + 0xf6, 0x90, 0x1a, 0x07, 0x8a, 0xc0, 0xbd, 0x1e, + 0xd9, 0x0b, 0x4f, 0x01, 0xa3, 0x8f, 0x2a, 0xd6, + 0xcb, 0x88, 0x9e, 0x67, 0x71, 0x49, 0x25, 0x4a, + 0x0c, 0x4b, 0xac, 0x94, 0xd7, 0x1e, 0x28, 0x3c, + 0x2c, 0x3c, 0x9c, 0xab, 0x0e, 0x9d, 0x27, 0x95, + 0x6d, 0x3d, 0x05, 0x27, 0xcb, 0x50, 0x70, 0x52, + 0xfc, 0xb4, 0x1a, 0xc4, 0xe5, 0xa0, 0xda, 0x4a, + 0xd9, 0x1c, 0x1c, 0xfc, 0x8e, 0x0b, 0x26, 0xcf, + 0x10, 0xd8, 0x49, 0x7c, 0xbe, 0x3b, 0xb9, 0x10, + 0x62, 0xd8, 0x62, 0xcc, 0x94, 0x92, 0x61, 0x41, + 0xc8, 0xd5, 0x97, 0x76, 0xdb, 0x90, 0xce, 0xa6, + 0xd5, 0xa1, 0xad, 0xe7, 0x0b, 0x3f, 0x84, 0xd2, + 0x9b, 0x28, 0x14, 0x1a, 0x30, 0x17, 0x3d, 0xc1, + 0xad, 0x1b, 0xc9, 0xe4, 0x41, 0xa1, 0x6e, 0x2a, + 0xed, 0xce, 0x15, 0x1b, 0xf7, 0x95, 0xf1, 0x90, + 0xca, 0xe3, 0xb0, 0x11, 0x11, 0xb2, 0x5b, 0xc2, + 0x36, 0x34, 0x6d, 0xa1, 0x5e, 0x19, 0xdd, 0x65, + 0x14, 0x41, 0xd6, 0xb8, 0xcf, 0xe2, 0x4c, 0x76, + 0x17, 0x8e, 0x45, 0x53, 0x6c, 0x0f, 0x92, 0x43, + 0x71, 0x74, 0xe3, 0x24, 0xae, 0x35, 0xdb, 0xb5, + 0x07, 0xad, 0xed, 0xd5, 0xfe, 0x62, 0x6f, 0x28, + 0xbc, 0x79, 0x0c, 0xde, 0xd6, 0x03, 0xb3, 0xa1, + 0x7d, 0xdb, 0xb2, 0xdf, 0xad, 0x65, 0xbb, 0xa4, + 0x6c, 0x35, 0xe5, 0xdd, 0x45, 0x17, 0x36, 0xf9, + 0x48, 0xed, 0xfa, 0xcb, 0x6b, 0x67, 0x4a, 0x5c, + 0x3c, 0x4d, 0x8a, 0xab, 0x79, 0xa7, 0x75, 0x6d, + 0xe4, 0xc6, 0x69, 0x20, 0x90, 0x1e, 0x40, 0x2a, + 0x28, 0xac, 0x8e, 0xb3, 0x88, 0x76, 0x9a, 0xc6, + 0x80, 0xff, 0x00, 0x29, 0x8d, 0xf3, 0x11, 0xb5, + 0xc4, 0xd5, 0x6d, 0xbd, 0x63, 0xc2, 0xf9, 0xd4, + 0x7d, 0x2b, 0x85, 0x7a, 0xa5, 0xaa, 0xbb, 0x19, + 0x3a, 0x4a, 0x8f, 0x54, 0xb5, 0x57, 0x61, 0x2f, + 0x49, 0x50, 0x77, 0x6f, 0x59, 0x30, 0xde, 0x75, + 0x1f, 0x4a, 0x7a, 0xc9, 0x86, 0xf3, 0xa8, 0xfa, + 0x57, 0x09, 0xf5, 0x4b, 0x55, 0x76, 0x12, 0xf4, + 0x94, 0xf5, 0x4f, 0x54, 0xf6, 0x32, 0xf4, 0x94, + 0x1d, 0xdb, 0xd6, 0x4c, 0x37, 0x9d, 0x47, 0xd2, + 0x9e, 0xb2, 0x61, 0xbc, 0xea, 0x3e, 0x95, 0xc2, + 0x7d, 0x52, 0xd5, 0x5d, 0x84, 0xbd, 0x25, 0x3d, + 0x52, 0xd5, 0x5d, 0x84, 0xbd, 0x25, 0x07, 0x76, + 0xf5, 0x93, 0x0d, 0xe7, 0x51, 0xf4, 0xa7, 0xac, + 0x98, 0x6f, 0x3a, 0x8f, 0xa5, 0x70, 0x9f, 0x54, + 0xf5, 0x4f, 0x63, 0x2f, 0x49, 0x4f, 0x54, 0xb5, + 0x57, 0x63, 0x2f, 0x49, 0x41, 0xdd, 0xbd, 0x64, + 0xc3, 0x79, 0xd4, 0x7d, 0x29, 0xeb, 0x26, 0x1b, + 0xce, 0xa3, 0xe9, 0x5c, 0x27, 0xd5, 0x2d, 0x55, + 0xd8, 0x4b, 0xd2, 0x53, 0xd5, 0x3d, 0x55, 0xd8, + 0xcb, 0xd2, 0x50, 0x77, 0x6f, 0x59, 0x30, 0xde, + 0x75, 0x1f, 0x4a, 0x7a, 0xc9, 0x86, 0xf3, 0xa8, + 0xfa, 0x57, 0x09, 0xf5, 0x4b, 0x55, 0x76, 0x12, + 0xf4, 0x94, 0xf5, 0x4b, 0x55, 0x76, 0x12, 0xf4, + 0x94, 0x1d, 0xdb, 0xd6, 0x4c, 0x37, 0x9d, 0x47, + 0xd2, 0x9e, 0xb2, 0x61, 0xbc, 0xea, 0x3e, 0x95, + 0xc2, 0x7d, 0x53, 0xd5, 0x3d, 0x8c, 0xbd, 0x25, + 0x3d, 0x52, 0xd5, 0x5d, 0x84, 0xbd, 0x25, 0x07, + 0x76, 0xf5, 0x93, 0x0d, 0xe7, 0x51, 0xf4, 0xa7, + 0xac, 0x98, 0x6f, 0x3a, 0x8f, 0xa5, 0x70, 0x9f, + 0x54, 0xb5, 0x57, 0x61, 0x2f, 0x49, 0x4f, 0x54, + 0xf5, 0x57, 0x63, 0x2f, 0x49, 0x41, 0xdd, 0xbd, + 0x64, 0xc3, 0x79, 0xd4, 0x7d, 0x29, 0xeb, 0x26, + 0x1b, 0xce, 0xa3, 0xe9, 0x5c, 0x27, 0xd5, 0x2d, + 0x55, 0xd8, 0x4b, 0xd2, 0x53, 0xd5, 0x2d, 0x55, + 0xd8, 0x4b, 0xd2, 0x50, 0x77, 0x6f, 0x59, 0x30, + 0xde, 0x75, 0x1f, 0x4a, 0x7a, 0xc9, 0x86, 0xf3, + 0xa8, 0xfa, 0x57, 0x09, 0xf5, 0x4f, 0x54, 0xf6, + 0x32, 0xf4, 0x94, 0xf5, 0x4f, 0x54, 0xf6, 0x32, + 0xf4, 0x94, 0x1d, 0xdb, 0xd6, 0x4c, 0x37, 0x9d, + 0x47, 0xd2, 0x9e, 0xb2, 0x61, 0xbc, 0xea, 0x3e, + 0x95, 0xc2, 0x7d, 0x52, 0xd5, 0x5d, 0x84, 0xbd, + 0x25, 0x3d, 0x52, 0xd5, 0x5d, 0x84, 0xbd, 0x25, + 0x07, 0x76, 0xf5, 0x93, 0x0d, 0xe7, 0x51, 0xf4, + 0xa7, 0xac, 0x98, 0x6f, 0x3a, 0x8f, 0xa5, 0x70, + 0x9f, 0x54, 0xf5, 0x4f, 0x63, 0x2f, 0x49, 0x4f, + 0x54, 0xf5, 0x57, 0x63, 0x2f, 0x49, 0x41, 0xdd, + 0xbd, 0x64, 0xc3, 0x79, 0xd4, 0x7d, 0x29, 0xeb, + 0x26, 0x1b, 0xce, 0xa3, 0xe9, 0x5c, 0x27, 0xd5, + 0x2d, 0x55, 0xd8, 0x4b, 0xd2, 0x53, 0xd5, 0x3d, + 0x53, 0xd8, 0xcb, 0xd2, 0x50, 0x77, 0x6f, 0x59, + 0x30, 0xde, 0x75, 0x1f, 0x4a, 0x7a, 0xc9, 0x86, + 0xf3, 0xa8, 0xfa, 0x57, 0x09, 0xf5, 0x4b, 0x55, + 0x76, 0x12, 0xf4, 0x94, 0xf5, 0x4b, 0x55, 0x76, + 0x12, 0xf4, 0x94, 0x1d, 0xdb, 0xd6, 0x4c, 0x37, + 0x9d, 0x47, 0xd2, 0x9e, 0xb2, 0x61, 0xbc, 0xea, + 0x3e, 0x95, 0xc2, 0x7d, 0x53, 0xd5, 0x3d, 0x8c, + 0xbd, 0x25, 0x3d, 0x53, 0xd5, 0x3d, 0x8c, 0xbd, + 0x25, 0x07, 0x76, 0xf5, 0x93, 0x0d, 0xe7, 0x51, + 0xf4, 0xa7, 0xac, 0x98, 0x6f, 0x3a, 0x8f, 0xa5, + 0x70, 0x9f, 0x54, 0xb5, 0x57, 0x61, 0x2f, 0x49, + 0x4f, 0x54, 0xf5, 0x4f, 0x63, 0x2f, 0x49, 0x41, + 0xdd, 0xbd, 0x64, 0xc3, 0x79, 0xd4, 0x7d, 0x29, + 0xeb, 0x26, 0x1b, 0xce, 0xa3, 0xe9, 0x5c, 0x27, + 0xd5, 0x2d, 0x55, 0xd8, 0xcb, 0xd2, 0x53, 0xd5, + 0x2d, 0x55, 0xd8, 0x4b, 0xd2, 0x50, 0x77, 0x1b, + 0xad, 0x57, 0x82, 0xb6, 0x81, 0xf3, 0xc9, 0x74, + 0xce, 0x16, 0x0a, 0x90, 0x0e, 0xd5, 0xc9, 0x75, + 0x7f, 0xb4, 0x7c, 0x8e, 0x69, 0xf2, 0x5a, 0x59, + 0x38, 0xc3, 0x66, 0x4d, 0x00, 0x6e, 0xf7, 0x05, + 0xa8, 0x3a, 0x43, 0x54, 0x3c, 0x70, 0x18, 0x24, + 0x20, 0xec, 0xa1, 0x26, 0x8a, 0xfd, 0xa2, 0xbd, + 0x98, 0x47, 0x6d, 0xc1, 0x7d, 0x99, 0x1c, 0x72, + 0xef, 0x64, 0x07, 0x70, 0x23, 0x9d, 0x05, 0x73, + 0x45, 0xfb, 0x38, 0xbb, 0xcd, 0x38, 0x5f, 0x64, + 0x41, 0x8a, 0xd2, 0xb5, 0x00, 0xef, 0x72, 0xec, + 0x18, 0x9c, 0x3d, 0x86, 0x22, 0xd5, 0xb6, 0xb6, + 0x51, 0x08, 0xd8, 0xd1, 0x4d, 0x9b, 0xcf, 0x7d, + 0x65, 0xc7, 0x1c, 0x71, 0xb0, 0x32, 0x36, 0x86, + 0xb5, 0xa2, 0x80, 0x0d, 0x80, 0x2f, 0xb4, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x41, 0x04, + 0x02, 0x28, 0x76, 0x83, 0xbc, 0x2e, 0x1d, 0xed, + 0x37, 0x4d, 0x3b, 0x13, 0x99, 0x7d, 0xec, 0x11, + 0x86, 0x59, 0x5e, 0x10, 0x5b, 0x4d, 0xc1, 0xf4, + 0xf1, 0x87, 0xba, 0xbb, 0x92, 0xd3, 0x6a, 0x9d, + 0x3d, 0x6f, 0x9f, 0xc4, 0xc9, 0x65, 0x33, 0x41, + 0x78, 0xf1, 0xa1, 0x77, 0x33, 0xc6, 0xe4, 0x1f, + 0x9d, 0x3b, 0xbe, 0xf2, 0x2c, 0x8b, 0xfb, 0x0b, + 0x8c, 0x7d, 0xe4, 0xb6, 0xb7, 0x0d, 0x2d, 0x92, + 0x27, 0x16, 0x9a, 0xf2, 0xd3, 0x95, 0x63, 0xa0, + 0x22, 0x20, 0x0e, 0x71, 0x0d, 0x68, 0x24, 0x9d, + 0xc0, 0x20, 0x12, 0x39, 0x56, 0xef, 0x4c, 0xe9, + 0x1c, 0xa6, 0xa1, 0xb8, 0x0d, 0xb6, 0x69, 0x6c, + 0x0d, 0x23, 0xac, 0x95, 0xdb, 0x00, 0x1d, 0xc5, + 0xbf, 0xd1, 0x9e, 0xcd, 0xae, 0xf2, 0xae, 0x6d, + 0xee, 0x4c, 0x18, 0x2d, 0x5a, 0x41, 0x6b, 0x08, + 0xa1, 0x70, 0xf7, 0x57, 0x60, 0xc7, 0xe3, 0xac, + 0xf1, 0xd6, 0xed, 0xb7, 0xb3, 0x89, 0xb1, 0x46, + 0xd1, 0x4a, 0x01, 0xcc, 0x83, 0x59, 0xa6, 0x74, + 0x96, 0x2f, 0x4f, 0x5b, 0x06, 0x5b, 0x44, 0x0c, + 0xc4, 0x0e, 0xb2, 0x53, 0xbc, 0x9f, 0x75, 0x6f, + 0x51, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x04, 0x2d, + 0x3e, 0xa5, 0x74, 0x6c, 0xb4, 0x81, 0xf2, 0xd0, + 0x46, 0xd9, 0xd8, 0x5c, 0x5d, 0xba, 0x9d, 0xd5, + 0xb8, 0x50, 0xe8, 0xd8, 0xf1, 0xc2, 0xf0, 0x1c, + 0x39, 0x88, 0xa8, 0x4e, 0x5d, 0x24, 0x68, 0x2f, + 0x27, 0xc7, 0x5f, 0x4f, 0x69, 0x1e, 0x35, 0xd1, + 0xc9, 0x3b, 0x25, 0x0f, 0x26, 0x3d, 0x94, 0x60, + 0xdf, 0x5a, 0x51, 0x61, 0xdd, 0x3e, 0xda, 0xe9, + 0xf7, 0x5e, 0x91, 0x99, 0xd2, 0xdc, 0x46, 0x5e, + 0xdb, 0x6b, 0x21, 0xe2, 0xb8, 0x0f, 0xd9, 0x2d, + 0xe1, 0xa5, 0x55, 0xa5, 0x90, 0x42, 0xc3, 0xc4, + 0xc6, 0x35, 0xa7, 0x9c, 0x00, 0x0f, 0xbc, 0x86, + 0x08, 0x4b, 0xb8, 0xcb, 0x1a, 0x5d, 0xf2, 0xa8, + 0x2b, 0xd2, 0x9c, 0x28, 0x57, 0xb1, 0xd4, 0x3e, + 0x87, 0xd9, 0xba, 0x17, 0x8d, 0xbc, 0x86, 0xa1, + 0x6f, 0x6f, 0x23, 0x74, 0xb6, 0x92, 0xc6, 0xcf, + 0x8c, 0xe6, 0x10, 0x3b, 0xf4, 0x5e, 0xa2, 0x36, + 0x0a, 0x50, 0x01, 0x4d, 0xd4, 0x1b, 0xaa, 0xbe, + 0xa8, 0x93, 0xb7, 0xdf, 0x7e, 0xf2, 0x37, 0xf7, + 0x34, 0xd8, 0x7c, 0x95, 0xb1, 0xb6, 0xb6, 0xc7, + 0x82, 0x4d, 0xd3, 0x18, 0x19, 0x2c, 0x6d, 0xfd, + 0x82, 0xd1, 0x42, 0x5c, 0xbc, 0x6d, 0xf2, 0x16, + 0xf8, 0xf8, 0xae, 0xed, 0x6e, 0x9d, 0xd5, 0xcf, + 0xd6, 0x48, 0xe8, 0xd8, 0x77, 0xbc, 0x3f, 0xe2, + 0xf0, 0xad, 0xe8, 0x8a, 0x26, 0xb8, 0xbd, 0xac, + 0x68, 0x71, 0xde, 0xe0, 0x05, 0x7a, 0x51, 0xd0, + 0xc4, 0xe7, 0x07, 0x39, 0x8d, 0x73, 0x86, 0xe2, + 0x40, 0x25, 0x4a, 0xf1, 0x15, 0xab, 0x38, 0xdd, + 0x89, 0xb8, 0xb4, 0xb9, 0xbb, 0x1d, 0x5c, 0x2f, + 0x85, 0xd1, 0xbd, 0xe7, 0x73, 0x1c, 0xe2, 0xd7, + 0x00, 0x7a, 0x17, 0x8c, 0xd4, 0xca, 0x37, 0x2c, + 0xe8, 0x58, 0x5c, 0xce, 0x28, 0x48, 0x1f, 0x29, + 0xad, 0x1b, 0x48, 0xa2, 0xb6, 0x3e, 0x36, 0x3c, + 0x70, 0xbd, 0xa1, 0xc3, 0x99, 0xc0, 0x11, 0xef, + 0xa8, 0x6c, 0x71, 0xb7, 0xe2, 0xb4, 0x36, 0xbb, + 0xe8, 0x00, 0x56, 0xfb, 0x78, 0x9f, 0x35, 0x72, + 0xce, 0x2d, 0x35, 0x24, 0xf6, 0xfe, 0x4f, 0x19, + 0x96, 0xe0, 0x90, 0xee, 0x10, 0xf7, 0x38, 0xb0, + 0xf3, 0xb8, 0x17, 0x2b, 0x28, 0x1b, 0x17, 0xcb, + 0x21, 0x89, 0x86, 0xac, 0x63, 0x5a, 0x4e, 0xf2, + 0x00, 0x1f, 0x02, 0xfb, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x50, 0xe7, 0x35, 0xa2, 0xae, 0x20, 0x01, 0xca, + 0x50, 0x16, 0x26, 0x46, 0xfa, 0xce, 0xd6, 0x07, + 0x3a, 0xe4, 0x82, 0xdf, 0x90, 0x79, 0x56, 0xb7, + 0x2d, 0xa9, 0xed, 0xed, 0x81, 0x8e, 0xd8, 0xf5, + 0xb3, 0x6e, 0xd9, 0xc8, 0xaa, 0x57, 0x57, 0x77, + 0x37, 0x72, 0x19, 0x67, 0x79, 0x71, 0x3c, 0x87, + 0x70, 0x55, 0x1e, 0x5a, 0x82, 0xf6, 0x19, 0x6b, + 0x3d, 0xb4, 0x7d, 0x50, 0xae, 0xc0, 0xb4, 0x5e, + 0x5d, 0x39, 0xe5, 0x5b, 0x1c, 0xa6, 0xcb, 0x5f, + 0x76, 0x8b, 0x4c, 0x8a, 0xc8, 0xf2, 0xf9, 0xb9, + 0xd3, 0xcb, 0xa6, 0xe7, 0x58, 0xe8, 0xa5, 0x8c, + 0x8f, 0x2f, 0x9d, 0x3c, 0xba, 0x7e, 0x75, 0x8e, + 0x89, 0x63, 0x20, 0x5f, 0xcf, 0xcf, 0xf0, 0xa9, + 0xf2, 0xf9, 0xfe, 0x52, 0xc6, 0x44, 0xb1, 0x91, + 0xe5, 0xf7, 0x1f, 0x29, 0x4f, 0x97, 0xdc, 0xfc, + 0xa5, 0x8c, 0x89, 0x63, 0x6b, 0x88, 0x95, 0xf7, + 0xb9, 0x28, 0x2d, 0x26, 0x35, 0x8e, 0x53, 0x47, + 0x2b, 0xef, 0xa8, 0xd8, 0x6a, 0xd4, 0x34, 0x8e, + 0xe5, 0x57, 0x3f, 0xd3, 0x5f, 0x7e, 0xda, 0xfc, + 0xe5, 0xd8, 0x86, 0xe4, 0xb1, 0xad, 0xc6, 0xe9, + 0xfc, 0x6e, 0x38, 0xf1, 0x41, 0x18, 0xe3, 0xe4, + 0x71, 0xde, 0x16, 0xc9, 0x4a, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0xd7, 0x6a, 0x1f, 0xb9, 0x6f, 0x3f, 0xa4, 0xef, + 0x81, 0x56, 0xbd, 0x94, 0x7e, 0x5e, 0x7f, 0xf5, + 0x9f, 0xf0, 0x95, 0x65, 0xd4, 0x3f, 0x72, 0xde, + 0x7f, 0x49, 0xdf, 0x02, 0xad, 0x7b, 0x28, 0xfc, + 0xbc, 0xff, 0x00, 0xeb, 0x3f, 0xe1, 0x28, 0x2c, + 0xd9, 0xe1, 0x5c, 0x45, 0xd7, 0xcc, 0x2a, 0x91, + 0x85, 0x02, 0xe7, 0x23, 0x6e, 0x24, 0xdb, 0x1d, + 0xac, 0x4e, 0x7f, 0x0f, 0x74, 0x54, 0xab, 0xbe, + 0x7b, 0x66, 0x22, 0xeb, 0xe6, 0x15, 0x43, 0xc3, + 0xce, 0x2d, 0x2e, 0xdb, 0x21, 0x1c, 0x4c, 0x96, + 0x22, 0xda, 0xf2, 0x02, 0x50, 0x59, 0x34, 0x9d, + 0xac, 0x72, 0x1b, 0x9c, 0xb4, 0xf4, 0x32, 0xcb, + 0x21, 0x0d, 0x71, 0xe4, 0x68, 0x24, 0x2f, 0x7c, + 0xbe, 0xad, 0xb4, 0xb3, 0xac, 0x36, 0xdf, 0xc7, + 0xb8, 0x3b, 0x1a, 0xd1, 0xce, 0xab, 0xb8, 0xd7, + 0x64, 0x2e, 0x23, 0x7e, 0x36, 0xda, 0x4a, 0x34, + 0x3c, 0xb8, 0xb0, 0x6c, 0xa0, 0x25, 0x59, 0xb0, + 0xfa, 0x66, 0xde, 0xd1, 0xcd, 0xb9, 0xb8, 0x02, + 0x4b, 0x8e, 0x42, 0x79, 0x10, 0x55, 0xb2, 0xd6, + 0x39, 0x29, 0x61, 0x66, 0x67, 0x22, 0x38, 0x5c, + 0xe7, 0xb4, 0x75, 0x7b, 0xb6, 0x55, 0x66, 0x45, + 0x14, 0x76, 0x99, 0xc6, 0x88, 0x47, 0x0c, 0x57, + 0x30, 0x71, 0xd3, 0xba, 0x42, 0xd9, 0x6b, 0x5b, + 0x86, 0xba, 0x0b, 0x7c, 0x74, 0x7b, 0x65, 0x9e, + 0x41, 0x46, 0x8d, 0xe0, 0x02, 0xb0, 0x5d, 0x47, + 0xea, 0x06, 0xc4, 0xdd, 0xbe, 0x49, 0x6e, 0x18, + 0xee, 0xfd, 0x10, 0x6b, 0x71, 0x3f, 0xcd, 0xba, + 0xf9, 0xeb, 0x03, 0x39, 0xff, 0x00, 0x77, 0xdc, + 0x59, 0xf8, 0x9f, 0xe6, 0xdd, 0x7c, 0xf5, 0x81, + 0x9b, 0xff, 0x00, 0xbb, 0xee, 0x2a, 0x90, 0x8c, + 0x2c, 0x7d, 0x66, 0x46, 0x2e, 0x61, 0xe3, 0x15, + 0x99, 0x77, 0x92, 0xa6, 0x6c, 0x4e, 0xc6, 0xf5, + 0x9d, 0x48, 0xa3, 0x07, 0x25, 0x42, 0xd6, 0xd9, + 0x49, 0x71, 0x13, 0x9c, 0x61, 0x1e, 0x33, 0x85, + 0x2b, 0xcb, 0xb7, 0x99, 0x59, 0x30, 0x7a, 0x5e, + 0x6b, 0x82, 0x26, 0xb8, 0x1c, 0x11, 0x9d, 0xa6, + 0xbb, 0xdc, 0xa4, 0xab, 0x1e, 0x2b, 0x3c, 0x96, + 0xa2, 0xb9, 0x0e, 0xb8, 0x24, 0xb4, 0x1f, 0x1a, + 0x9b, 0x9a, 0x15, 0xf6, 0xde, 0x16, 0xc1, 0x03, + 0x21, 0x66, 0xc6, 0xb0, 0x06, 0x8f, 0x71, 0x7c, + 0xda, 0xda, 0x43, 0x69, 0x10, 0x8a, 0x16, 0x86, + 0xb4, 0x73, 0x2f, 0x74, 0x1a, 0x5d, 0x61, 0xf9, + 0x6b, 0x21, 0xfd, 0x17, 0x7c, 0x0b, 0x59, 0xec, + 0xbf, 0xf2, 0x85, 0xa7, 0xba, 0xb6, 0x7a, 0xc3, + 0xf2, 0xd6, 0x43, 0xfa, 0x2e, 0xf8, 0x16, 0xb3, + 0xd9, 0x7f, 0xe5, 0x0b, 0x4f, 0x75, 0x05, 0xb5, + 0x11, 0x10, 0x54, 0xf3, 0x7f, 0x9a, 0x6c, 0x3b, + 0xf1, 0xfe, 0xf2, 0xb5, 0x85, 0x54, 0xcd, 0xfe, + 0x69, 0xb0, 0xef, 0xc7, 0xfb, 0xca, 0xd6, 0x10, + 0x4a, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x2a, 0x9e, 0xab, 0xfb, 0xeb, 0x1f, 0xde, 0x1f, + 0xdc, 0x56, 0xc5, 0x52, 0xd5, 0x7f, 0x7d, 0xe3, + 0xbb, 0xcd, 0xfe, 0xe0, 0x41, 0x6c, 0x52, 0xa3, + 0x95, 0x4a, 0x02, 0x22, 0x20, 0x28, 0x52, 0x88, + 0x2b, 0xba, 0xd3, 0x17, 0x25, 0xf6, 0x38, 0x3a, + 0x01, 0x59, 0xa2, 0x35, 0x05, 0x51, 0xe0, 0xc0, + 0xe6, 0x21, 0x90, 0x4e, 0xd6, 0x83, 0x26, 0xc2, + 0x09, 0xda, 0xba, 0x9d, 0xe3, 0x1c, 0xfb, 0x77, + 0xb5, 0xa2, 0xa4, 0x8d, 0x81, 0x69, 0x45, 0xa5, + 0xd5, 0x3f, 0x96, 0x7a, 0x10, 0x56, 0x04, 0x9a, + 0xbc, 0x00, 0xd1, 0x20, 0x00, 0x6e, 0x01, 0x4f, + 0x5b, 0xac, 0x3b, 0x45, 0x66, 0xf2, 0x4b, 0xae, + 0xcc, 0xf4, 0x27, 0x92, 0x5d, 0x7c, 0x83, 0xd0, + 0x82, 0xb3, 0xd6, 0xeb, 0x0e, 0xd5, 0x3a, 0xdd, + 0x61, 0xda, 0xab, 0x37, 0x92, 0x5d, 0x7c, 0x83, + 0xd0, 0x9e, 0x49, 0x75, 0xd9, 0x9e, 0x84, 0x15, + 0x9e, 0xb7, 0x58, 0x76, 0xa9, 0xd6, 0xeb, 0x0e, + 0xd5, 0x59, 0xbc, 0x92, 0xeb, 0xe4, 0x1e, 0x84, + 0xf2, 0x4b, 0xae, 0xcc, 0xf4, 0x20, 0xac, 0xf5, + 0xba, 0xc3, 0xb5, 0x4e, 0xb3, 0x57, 0xf6, 0x8a, + 0xcd, 0xe4, 0x97, 0x5d, 0x99, 0xe8, 0x4f, 0x24, + 0xba, 0xf9, 0x07, 0xa1, 0x05, 0x67, 0xad, 0xd6, + 0x1d, 0xaa, 0xf0, 0xbc, 0x3a, 0xa6, 0x4b, 0x77, + 0x36, 0xe2, 0x5a, 0x44, 0x7e, 0x35, 0x15, 0xb7, + 0xc9, 0x2e, 0xbb, 0x33, 0xd0, 0xbc, 0x2f, 0x31, + 0xb7, 0xb3, 0xdb, 0xba, 0x16, 0x30, 0x87, 0x3b, + 0x60, 0x28, 0x29, 0x76, 0xd6, 0xac, 0x8e, 0x8d, + 0x60, 0x2f, 0x7b, 0xb9, 0x77, 0x9a, 0xab, 0x6e, + 0x0b, 0x4a, 0x17, 0x70, 0xdc, 0xdf, 0x8d, 0x9b, + 0x0b, 0x63, 0x5b, 0x3c, 0x2e, 0x9b, 0xb7, 0xb0, + 0x60, 0x92, 0x61, 0xd6, 0x4e, 0x76, 0x92, 0x79, + 0x0a, 0xdd, 0x81, 0x4d, 0xc8, 0x3e, 0x19, 0x0c, + 0x4c, 0x68, 0x63, 0x58, 0x03, 0x5b, 0xb0, 0x0a, + 0x2f, 0xae, 0x06, 0x7c, 0x91, 0xd0, 0xbe, 0x91, + 0x07, 0xcf, 0x03, 0x3e, 0x48, 0xe8, 0x4e, 0x06, + 0x7c, 0x91, 0xd0, 0xbe, 0x91, 0x07, 0xcf, 0x03, + 0x3e, 0x48, 0xe8, 0x4e, 0x06, 0x7c, 0x91, 0xd0, + 0xbe, 0x91, 0x07, 0xcf, 0x03, 0x3e, 0x48, 0xe8, + 0x4e, 0x06, 0x7c, 0x91, 0xd0, 0xbe, 0x91, 0x07, + 0xcf, 0x03, 0x3e, 0x48, 0xe8, 0x4e, 0x06, 0x7c, + 0x91, 0xd0, 0xbe, 0x91, 0x07, 0xcf, 0x03, 0x3e, + 0x48, 0xe8, 0x4e, 0x06, 0x7c, 0x91, 0xd0, 0xbe, + 0x91, 0x07, 0xcf, 0x03, 0x3e, 0x48, 0xe8, 0x4e, + 0x06, 0x7c, 0x91, 0xd0, 0xbe, 0x91, 0x07, 0xcf, + 0x03, 0x3e, 0x48, 0xe8, 0x4e, 0x06, 0x7c, 0x91, + 0xd0, 0xbe, 0x91, 0x07, 0xcf, 0x03, 0x3e, 0x48, + 0xe8, 0x4e, 0x06, 0x7c, 0x91, 0xd0, 0xbe, 0x91, + 0x07, 0xcf, 0x03, 0x3e, 0x48, 0xe8, 0x4e, 0x06, + 0x7c, 0x91, 0xd0, 0xbe, 0x91, 0x07, 0xcf, 0x03, + 0x3e, 0x48, 0xe8, 0x4e, 0x06, 0x7c, 0x91, 0xd0, + 0xbe, 0x91, 0x07, 0xcf, 0x03, 0x3e, 0x48, 0xe8, + 0x4e, 0x06, 0x7c, 0x91, 0xd0, 0xbe, 0x91, 0x07, + 0xcf, 0x03, 0x3e, 0x48, 0xe8, 0x4e, 0x06, 0x7c, + 0x91, 0xd0, 0xbe, 0x91, 0x07, 0xcf, 0x03, 0x3e, + 0x48, 0xe8, 0x4e, 0x06, 0x7c, 0x91, 0xd0, 0xbe, + 0x91, 0x07, 0xcf, 0x03, 0x3e, 0x48, 0xe8, 0x4e, + 0x06, 0x7c, 0x91, 0xd0, 0xbe, 0x91, 0x07, 0xcf, + 0x03, 0x3e, 0x48, 0xe8, 0x4e, 0x06, 0x7c, 0x91, + 0xd0, 0xbe, 0x91, 0x07, 0xcf, 0x03, 0x3e, 0x48, + 0xe8, 0x4e, 0x06, 0x7c, 0x91, 0xd0, 0xbe, 0x91, + 0x07, 0xcf, 0x03, 0x3e, 0x48, 0xe8, 0x4e, 0x06, + 0x7c, 0x91, 0xd0, 0xbe, 0x91, 0x07, 0xcf, 0x03, + 0x3e, 0x48, 0xe8, 0x5f, 0x48, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x0a, 0x14, 0xa2, 0x0a, 0x56, 0xbe, 0xd0, 0x91, + 0xe7, 0x61, 0x37, 0x96, 0x6d, 0x0c, 0xbf, 0x8c, + 0x6c, 0x3f, 0x2a, 0x9c, 0x8b, 0x97, 0x5b, 0x68, + 0x6d, 0x4d, 0x71, 0x1c, 0xaf, 0x65, 0x9b, 0xff, + 0x00, 0x82, 0xee, 0x07, 0x0a, 0x6f, 0x3d, 0xc5, + 0xfa, 0x15, 0x40, 0x68, 0x1b, 0x80, 0x15, 0xdf, + 0x44, 0x1c, 0x22, 0xc7, 0xd9, 0x9e, 0xa8, 0xbb, + 0x90, 0x46, 0xe8, 0x04, 0x03, 0x95, 0xf2, 0x54, + 0x0f, 0xf3, 0x5d, 0x07, 0x4b, 0x7b, 0x31, 0xc6, + 0x62, 0x1e, 0xdb, 0xab, 0xc3, 0xe5, 0x57, 0x34, + 0xf8, 0xae, 0x1e, 0x23, 0x4f, 0x71, 0x5d, 0xe8, + 0x88, 0x21, 0xad, 0x6b, 0x5a, 0x1a, 0xd0, 0x00, + 0x1b, 0x80, 0xd8, 0xbe, 0x91, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x14, 0x1d, 0xca, + 0x54, 0x14, 0x15, 0xd6, 0x5e, 0x5f, 0x5c, 0xde, + 0xcc, 0xd6, 0x5e, 0x88, 0x2e, 0x62, 0x95, 0xcd, + 0x65, 0x8b, 0xc0, 0x0d, 0x73, 0x5b, 0xca, 0x5d, + 0xbf, 0x68, 0x59, 0x17, 0x12, 0xe4, 0xaf, 0x6f, + 0xa6, 0x82, 0xce, 0x7f, 0x27, 0x16, 0x8d, 0x69, + 0xa0, 0x00, 0x87, 0xb9, 0xdb, 0x78, 0x5d, 0x50, + 0xb1, 0xb2, 0x8c, 0x96, 0xf0, 0xbe, 0xda, 0x4c, + 0x7c, 0x9e, 0x52, 0x1f, 0xff, 0x00, 0x1e, 0xea, + 0x31, 0x46, 0x01, 0xc8, 0xe7, 0x3d, 0x7b, 0x52, + 0xf3, 0x15, 0x77, 0x23, 0xd9, 0x04, 0x97, 0x62, + 0xe1, 0x8c, 0x00, 0xc6, 0x38, 0xa8, 0xf6, 0xef, + 0xe2, 0x48, 0xe0, 0x73, 0x65, 0xe4, 0x7c, 0xb8, + 0xc3, 0x19, 0xf2, 0x86, 0xd9, 0xc6, 0xc1, 0xc5, + 0x71, 0x30, 0xda, 0x45, 0x39, 0x1a, 0x1d, 0xb2, + 0x8b, 0x53, 0x06, 0x5e, 0xef, 0xc8, 0xf2, 0x22, + 0x3b, 0xa1, 0x74, 0xeb, 0x50, 0xd3, 0x0d, 0xc5, + 0x29, 0x5e, 0x2e, 0x42, 0x02, 0xca, 0xca, 0xc5, + 0x3b, 0xae, 0x6d, 0x2e, 0x2e, 0x6d, 0xa4, 0xba, + 0x85, 0x8c, 0x3c, 0x70, 0xc3, 0xe3, 0x11, 0x21, + 0xa6, 0xda, 0x6c, 0xaa, 0xc4, 0xf2, 0x4b, 0xf9, + 0x1b, 0x93, 0x77, 0x92, 0x98, 0x85, 0xcb, 0x23, + 0x30, 0xb1, 0xa3, 0x90, 0x72, 0x1a, 0x7e, 0xd7, + 0x3a, 0x91, 0xbe, 0x7b, 0xfd, 0xf7, 0x04, 0x70, + 0xe9, 0x31, 0x2c, 0xb8, 0xe5, 0xc9, 0xdb, 0x5c, + 0x59, 0x4b, 0x71, 0x72, 0x66, 0x65, 0xe9, 0xe0, + 0x7c, 0x34, 0x01, 0xac, 0x24, 0x57, 0xc5, 0x23, + 0x6a, 0xf2, 0x12, 0x65, 0xee, 0x45, 0xec, 0xcc, + 0xbb, 0x30, 0xb2, 0xd2, 0x47, 0x88, 0xd8, 0x00, + 0x3c, 0x41, 0xbb, 0x68, 0xfa, 0xff, 0x00, 0x92, + 0xcc, 0xbb, 0xb6, 0x9d, 0xc7, 0x17, 0xc3, 0x1b, + 0x8f, 0x53, 0x23, 0x4c, 0x9f, 0xed, 0x01, 0xa7, + 0x69, 0x51, 0x69, 0x6b, 0x70, 0xcb, 0x6c, 0x93, + 0x5d, 0x1b, 0x83, 0xa5, 0x92, 0x57, 0x46, 0x3e, + 0x50, 0x3b, 0xa8, 0xac, 0xf1, 0xf6, 0x65, 0xf1, + 0xd8, 0x47, 0x0f, 0x16, 0x2d, 0xce, 0x70, 0xc8, + 0xdb, 0x48, 0x4d, 0xc8, 0xb2, 0x74, 0xf1, 0x09, + 0xa4, 0x9e, 0x95, 0xa7, 0x27, 0x08, 0x07, 0x66, + 0xda, 0xa4, 0x59, 0x89, 0x8d, 0x9d, 0xe4, 0x70, + 0xdc, 0x0b, 0xa9, 0x2d, 0xc0, 0x74, 0x57, 0x1f, + 0x2b, 0x88, 0xf2, 0x8d, 0x83, 0x66, 0xe5, 0xf0, + 0xdb, 0x2b, 0x9b, 0x46, 0x58, 0x5e, 0x1b, 0x67, + 0x5c, 0x70, 0x41, 0xd4, 0xcf, 0x00, 0x6f, 0x13, + 0xc1, 0x34, 0xda, 0x01, 0xef, 0x2c, 0xa7, 0xf9, + 0x4d, 0xde, 0x3e, 0xe7, 0x86, 0xcc, 0xdb, 0x87, + 0x50, 0x45, 0x19, 0x68, 0x6c, 0x86, 0x87, 0x6f, + 0x13, 0x42, 0x4f, 0x6f, 0x7c, 0x8c, 0xec, 0x5c, + 0x57, 0x6d, 0x8b, 0xad, 0xba, 0xb8, 0x74, 0xce, + 0x98, 0x07, 0x06, 0x10, 0x00, 0x65, 0x79, 0x05, + 0x16, 0x6a, 0xf8, 0xb7, 0x05, 0xb0, 0x46, 0xd2, + 0x28, 0x43, 0x40, 0x23, 0xdc, 0x5e, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0xa1, + 0x09, 0x00, 0x54, 0x9a, 0x05, 0xa2, 0xcb, 0xea, + 0x68, 0x2d, 0x2b, 0x15, 0xbd, 0x25, 0x9b, 0x76, + 0xcd, 0xc1, 0x06, 0xda, 0xee, 0xfa, 0xda, 0xd2, + 0x33, 0x24, 0xcf, 0x0d, 0x00, 0x6e, 0xe5, 0x54, + 0xfc, 0xc6, 0xa3, 0x9e, 0xf4, 0x98, 0xad, 0xcf, + 0x57, 0x08, 0xe9, 0x2b, 0x5b, 0x75, 0x79, 0x73, + 0x79, 0x21, 0x92, 0xe2, 0x42, 0xe3, 0xc8, 0x39, + 0x02, 0xf0, 0xa0, 0xae, 0xc5, 0x61, 0x24, 0xf7, + 0xfb, 0xa5, 0x11, 0x10, 0x62, 0x65, 0x7f, 0xea, + 0x9e, 0xfa, 0xd3, 0x2d, 0xc6, 0x54, 0xff, 0x00, + 0xc5, 0xf7, 0x56, 0x9d, 0x01, 0x14, 0xed, 0xe7, + 0x51, 0xb5, 0x45, 0x11, 0x4d, 0x0f, 0x3a, 0x50, + 0xa0, 0x84, 0x4d, 0xaa, 0x76, 0xa0, 0x84, 0x53, + 0x43, 0xce, 0x9b, 0x50, 0x6c, 0x74, 0xd7, 0xdf, + 0xb6, 0xbf, 0x39, 0x76, 0x20, 0xb8, 0xee, 0x9b, + 0xfb, 0xf6, 0xd7, 0xe7, 0x2e, 0xc4, 0x82, 0x51, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x06, 0xbb, 0x50, 0xfd, 0xcb, + 0x79, 0xfd, 0x27, 0x7c, 0x0a, 0xb5, 0xec, 0xa3, + 0xf2, 0xf3, 0xff, 0x00, 0xac, 0xff, 0x00, 0x84, + 0xab, 0x2e, 0xa1, 0xfb, 0x96, 0xf3, 0xfa, 0x4e, + 0xf8, 0x15, 0x6b, 0xd9, 0x47, 0xe5, 0xe7, 0xff, + 0x00, 0x59, 0xff, 0x00, 0x09, 0x41, 0x66, 0xcf, + 0x9a, 0x61, 0xee, 0xbe, 0x61, 0x54, 0x58, 0xf1, + 0xb7, 0x67, 0x0e, 0xdb, 0xb8, 0xb7, 0x03, 0x52, + 0xc1, 0xb6, 0xa0, 0x15, 0x79, 0xcf, 0xfd, 0xcf, + 0x75, 0xf3, 0x0a, 0xa8, 0xd9, 0x65, 0xe6, 0xb5, + 0x8a, 0xd2, 0xd1, 0xb1, 0xf1, 0xb2, 0x51, 0xe3, + 0x38, 0xf7, 0x4a, 0x40, 0x45, 0x0b, 0xe7, 0x6c, + 0x79, 0x6c, 0x1b, 0xc3, 0x2e, 0x58, 0xda, 0x5c, + 0x5b, 0x93, 0xb4, 0x90, 0xb3, 0x7d, 0x6e, 0xcc, + 0x75, 0x7d, 0x4f, 0x90, 0x3b, 0xaf, 0xa5, 0x38, + 0xb6, 0xd1, 0x45, 0xe6, 0x9e, 0x95, 0xb3, 0x1b, + 0xac, 0x6c, 0x86, 0x09, 0x5d, 0xb4, 0xb7, 0x91, + 0x63, 0x18, 0xb5, 0x4d, 0x78, 0x2a, 0xda, 0xfc, + 0xaa, 0x04, 0x0e, 0x29, 0x6d, 0x1c, 0xec, 0xd6, + 0x64, 0x87, 0x5d, 0x38, 0x11, 0x6d, 0x00, 0xda, + 0x41, 0x3d, 0xc5, 0x91, 0x80, 0xb4, 0x97, 0xaa, + 0xb8, 0xc8, 0x5c, 0x8f, 0xf9, 0x17, 0x35, 0x77, + 0xb8, 0x42, 0x59, 0x69, 0xf9, 0x5d, 0x28, 0xb9, + 0xc9, 0xc8, 0x67, 0x94, 0x7c, 0x56, 0x9d, 0xd5, + 0x5e, 0xd9, 0x5c, 0x94, 0xf6, 0x53, 0x45, 0x6f, + 0x14, 0x7c, 0x4c, 0x90, 0x52, 0xbc, 0xca, 0x8d, + 0x1e, 0x35, 0xed, 0x88, 0xdd, 0xc8, 0x7e, 0x2b, + 0x5e, 0x49, 0x58, 0x37, 0x05, 0xf9, 0x2b, 0xd6, + 0x98, 0x62, 0x27, 0x8b, 0x60, 0xd8, 0xbd, 0xa2, + 0x9a, 0x38, 0xa0, 0xbc, 0x0f, 0x34, 0x2f, 0x71, + 0xa0, 0xe5, 0x2a, 0xe9, 0xa5, 0x2c, 0xe2, 0x6e, + 0x26, 0x09, 0x5f, 0x10, 0x6c, 0xa6, 0xa6, 0xa4, + 0x6d, 0x49, 0x48, 0x78, 0x60, 0x74, 0xb4, 0x56, + 0xcd, 0x6c, 0xf7, 0x43, 0x8a, 0x4e, 0x46, 0x72, + 0x05, 0x64, 0x00, 0x34, 0x00, 0x05, 0x00, 0xdc, + 0x11, 0x4a, 0x8a, 0x22, 0x22, 0x0d, 0x2e, 0xb0, + 0xfc, 0xb5, 0x90, 0xfe, 0x8b, 0xbe, 0x05, 0xac, + 0xf6, 0x5f, 0xf9, 0x42, 0xd3, 0xdd, 0x5b, 0x3d, + 0x61, 0xf9, 0x6b, 0x21, 0xfd, 0x17, 0x7c, 0x0b, + 0x59, 0xec, 0xbf, 0xf2, 0x85, 0xa7, 0xba, 0x82, + 0xda, 0x88, 0x88, 0x2a, 0x79, 0xbf, 0xcd, 0x36, + 0x1d, 0xf8, 0xff, 0x00, 0x79, 0x5a, 0xc7, 0x2a, + 0xaa, 0x66, 0xff, 0x00, 0x34, 0xd8, 0x77, 0xe3, + 0xfd, 0xe5, 0x6b, 0x1c, 0xa8, 0x25, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x15, 0x4b, 0x55, + 0xfd, 0xf7, 0x8e, 0xef, 0x37, 0xfb, 0x81, 0x5b, + 0x55, 0x4b, 0x55, 0xfd, 0xf7, 0x8e, 0xef, 0x37, + 0xfb, 0x81, 0x05, 0xb3, 0x95, 0x4a, 0x85, 0x28, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x0a, 0x28, 0x14, + 0xa2, 0x08, 0xa0, 0x4a, 0x05, 0x28, 0x82, 0x28, + 0x12, 0x81, 0x4a, 0x20, 0x8a, 0x04, 0xa0, 0x52, + 0x88, 0x22, 0x81, 0x28, 0x14, 0xa2, 0x08, 0xa0, + 0x4a, 0x05, 0x28, 0x82, 0x14, 0xa2, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x8a, 0x25, 0x02, 0x94, + 0x41, 0x09, 0x40, 0xa5, 0x10, 0x45, 0x12, 0x8a, + 0x51, 0x04, 0x51, 0x28, 0x14, 0xa2, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x0c, 0x1c, 0x8d, 0x9c, 0xf7, 0x71, 0xf5, 0x71, + 0xc9, 0xd5, 0xb4, 0xef, 0x23, 0x7a, 0xd2, 0xfa, + 0x99, 0x1d, 0x49, 0xeb, 0x09, 0x27, 0x79, 0x2a, + 0xd0, 0x88, 0x2a, 0xfe, 0xa6, 0x45, 0xda, 0x27, + 0xa9, 0x91, 0x76, 0x8a, 0xd0, 0x8a, 0xda, 0x52, + 0xaf, 0xea, 0x64, 0x5d, 0xa2, 0x7a, 0x99, 0x17, + 0x68, 0xad, 0x08, 0x96, 0x52, 0xa3, 0x77, 0xa1, + 0x21, 0xb8, 0x8b, 0xab, 0xeb, 0x29, 0xb5, 0x61, + 0x8f, 0x66, 0xb0, 0xd3, 0xf9, 0xca, 0xf4, 0x8a, + 0x2a, 0x8b, 0xfa, 0x6b, 0x07, 0x6c, 0xa4, 0xfb, + 0x35, 0x83, 0xb6, 0x57, 0x94, 0x41, 0x45, 0xfd, + 0x35, 0x83, 0xb6, 0x4f, 0xd3, 0x58, 0x3b, 0x65, + 0x7a, 0x44, 0x14, 0x6f, 0xd3, 0x58, 0x3b, 0x65, + 0x07, 0xd9, 0xac, 0x1d, 0xb2, 0xbd, 0x22, 0x0a, + 0x2f, 0xe9, 0xac, 0x1d, 0xb2, 0x7e, 0x9a, 0xc1, + 0xdb, 0x2b, 0xd2, 0x20, 0xa7, 0x63, 0x74, 0x0c, + 0x36, 0x37, 0xf1, 0x5d, 0x89, 0xaa, 0x62, 0x35, + 0xa7, 0x3a, 0xb8, 0xa2, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x0d, 0x76, 0xa1, 0xfb, 0x96, 0xf3, 0xfa, + 0x4e, 0xf8, 0x15, 0x6b, 0xd9, 0x47, 0xe5, 0xe7, + 0xff, 0x00, 0x59, 0xff, 0x00, 0x09, 0x56, 0x5d, + 0x41, 0xf7, 0x2d, 0xe7, 0xf4, 0x9d, 0xf0, 0x2a, + 0x37, 0xb3, 0x8d, 0x4b, 0x85, 0xc6, 0xe1, 0x1f, + 0x05, 0xe5, 0xcb, 0x22, 0x93, 0xad, 0x71, 0xe1, + 0x71, 0xa1, 0xde, 0x50, 0x74, 0x0c, 0x9d, 0xb3, + 0xee, 0xec, 0x66, 0xb7, 0x67, 0xc6, 0x91, 0xbc, + 0x22, 0xaa, 0xa1, 0x1e, 0x93, 0xcd, 0xc6, 0xc6, + 0xb4, 0x48, 0xcf, 0x13, 0x71, 0xe6, 0x5b, 0xaf, + 0x5e, 0x34, 0xcf, 0x9e, 0xc7, 0xd2, 0x9e, 0xbc, + 0xe9, 0x9f, 0x3d, 0x8f, 0xa5, 0x06, 0xb3, 0xd5, + 0xfd, 0x49, 0xe7, 0x2d, 0xe9, 0x29, 0xe8, 0x1d, + 0x4b, 0xe7, 0x2d, 0xe9, 0x5b, 0x3f, 0x5e, 0x74, + 0xc7, 0x9e, 0xc7, 0xd2, 0x9e, 0xbc, 0xe9, 0x9f, + 0x3d, 0x8f, 0xa5, 0x06, 0xb3, 0xd0, 0x1a, 0x94, + 0x9f, 0xfb, 0x23, 0xa5, 0x7c, 0x3f, 0x4d, 0x67, + 0xe4, 0x20, 0xc9, 0x33, 0x1c, 0x46, 0xe2, 0x56, + 0xdb, 0xd7, 0x9d, 0x33, 0xe7, 0xb1, 0xf4, 0xa7, + 0xaf, 0x3a, 0x63, 0xcf, 0x63, 0xe9, 0x41, 0xac, + 0xc5, 0x68, 0x87, 0xb2, 0xeb, 0xaf, 0xc8, 0x3c, + 0x3c, 0x34, 0x87, 0x06, 0x8d, 0xc4, 0xab, 0x83, + 0x18, 0xc8, 0xd8, 0x18, 0xc1, 0xc2, 0xd6, 0xec, + 0x00, 0x2d, 0x17, 0xaf, 0x3a, 0x67, 0xcf, 0x63, + 0xe9, 0x4f, 0x5e, 0x74, 0xc7, 0x9e, 0xc7, 0xd2, + 0x83, 0x7e, 0x8b, 0x41, 0xeb, 0xce, 0x98, 0xf3, + 0xd8, 0xfa, 0x53, 0xd7, 0x9d, 0x33, 0xe7, 0xb1, + 0xf4, 0xa0, 0xdf, 0xa2, 0xd0, 0x7a, 0xf3, 0xa6, + 0x7c, 0xf6, 0x3e, 0x94, 0xf5, 0xe7, 0x4c, 0xf9, + 0xec, 0x7d, 0x28, 0x3d, 0x75, 0x87, 0xe5, 0xac, + 0x87, 0xf4, 0x5d, 0xf0, 0x2d, 0x67, 0xb2, 0xff, + 0x00, 0xca, 0x16, 0x9e, 0xef, 0xc2, 0xbc, 0x75, + 0x3e, 0xb0, 0xd3, 0xd7, 0x38, 0x0b, 0xe8, 0x21, + 0xbb, 0x63, 0xa4, 0x92, 0x27, 0x35, 0xad, 0x07, + 0x69, 0x24, 0x2f, 0x6f, 0x65, 0xff, 0x00, 0x94, + 0x2d, 0x3d, 0xdf, 0x85, 0x05, 0xb5, 0x11, 0x10, + 0x54, 0xf3, 0x7f, 0x9a, 0x6c, 0x7b, 0xf1, 0xfe, + 0xf2, 0xb5, 0x8e, 0x55, 0x54, 0xcd, 0xfe, 0x69, + 0xb0, 0xef, 0xc7, 0xfb, 0xca, 0xd6, 0x39, 0x50, + 0x4a, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x2a, 0x9e, 0xab, 0xfb, 0xeb, 0x1f, 0xde, 0x1f, + 0xdc, 0x0a, 0xd8, 0xaa, 0x7a, 0xaf, 0xef, 0xac, + 0x7f, 0x78, 0x7f, 0x71, 0x05, 0xad, 0x4a, 0x85, + 0x28, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x83, 0xc6, 0xe6, 0xde, 0x3b, + 0x98, 0x1f, 0x04, 0xa2, 0xac, 0x90, 0x16, 0xb8, + 0x77, 0x0a, 0xa9, 0x9f, 0x65, 0x9a, 0x59, 0xce, + 0x24, 0xc4, 0x76, 0x92, 0x77, 0x9e, 0x5f, 0x75, + 0x5c, 0x56, 0x90, 0x5f, 0xdd, 0xb3, 0x51, 0xc9, + 0x6e, 0xf7, 0xd6, 0xd1, 0xc1, 0xac, 0x63, 0x36, + 0x6c, 0x79, 0x6f, 0x15, 0x7d, 0xe4, 0x8d, 0xa3, + 0x53, 0xfa, 0x57, 0xa5, 0xbb, 0x27, 0x74, 0x9f, + 0x0a, 0x7e, 0x95, 0xe9, 0x6e, 0xc9, 0xdd, 0x27, + 0xc2, 0xb7, 0x17, 0xb7, 0xf7, 0x4d, 0xce, 0x5a, + 0x5b, 0xc2, 0xfe, 0x1b, 0x72, 0xe2, 0xc9, 0x9b, + 0xce, 0x78, 0x4b, 0x87, 0xbc, 0x17, 0xb4, 0xf9, + 0xe8, 0x22, 0x95, 0xf1, 0x88, 0x65, 0x96, 0x38, + 0xc8, 0x12, 0x4c, 0xc1, 0x56, 0x34, 0xf7, 0x4a, + 0x13, 0xb1, 0xa1, 0xfd, 0x2c, 0xd2, 0xbd, 0x93, + 0xba, 0x4f, 0x85, 0x3f, 0x4a, 0xf4, 0xb7, 0x64, + 0xee, 0x93, 0xe1, 0x5b, 0x7b, 0x9c, 0xac, 0xad, + 0xcd, 0x5a, 0xc1, 0x13, 0x24, 0x7c, 0x12, 0x32, + 0xb5, 0x68, 0x05, 0xa6, 0xbb, 0x9d, 0xee, 0x2f, + 0x69, 0xf3, 0xf0, 0x45, 0x2b, 0x9a, 0x22, 0x96, + 0x48, 0xa3, 0x70, 0x6c, 0x93, 0xb0, 0x02, 0xc6, + 0x9e, 0xe9, 0x48, 0xdb, 0x11, 0xd5, 0x6b, 0x6c, + 0xc7, 0x26, 0x8b, 0xf4, 0xaf, 0x4b, 0x76, 0x4e, + 0xe9, 0x3e, 0x14, 0xfd, 0x2a, 0xd2, 0xbd, 0x93, + 0xba, 0x4f, 0x85, 0x58, 0x6e, 0xf3, 0x30, 0x5b, + 0x3e, 0x38, 0xc3, 0x1f, 0x3b, 0xe6, 0x67, 0x1c, + 0x4d, 0x88, 0x02, 0x5c, 0x3b, 0x9f, 0x0a, 0xcc, + 0x13, 0x8e, 0xa3, 0xaf, 0x90, 0x18, 0x9b, 0xc3, + 0xc4, 0xe0, 0xed, 0xed, 0xef, 0xa2, 0x2a, 0x5f, + 0xa5, 0x7a, 0x5b, 0xb2, 0x77, 0x49, 0xf0, 0xa7, + 0xe9, 0x56, 0x95, 0xec, 0x9d, 0xd2, 0x7c, 0x2a, + 0xc3, 0x67, 0x99, 0x86, 0xee, 0x73, 0x00, 0x8a, + 0x48, 0x89, 0x1c, 0x51, 0xbd, 0xe2, 0x8d, 0x78, + 0x06, 0x95, 0x69, 0x5e, 0x72, 0xe7, 0xed, 0xe3, + 0x95, 0xcc, 0x11, 0x4b, 0x24, 0x4c, 0x77, 0x0c, + 0x97, 0x0c, 0x00, 0xc6, 0xd3, 0xdd, 0x29, 0xf3, + 0x1a, 0x2f, 0xd2, 0xad, 0x2d, 0xd9, 0x3b, 0xa4, + 0xf8, 0x53, 0xf4, 0xaf, 0x4b, 0x76, 0x4e, 0xe9, + 0x3e, 0x15, 0x60, 0xbb, 0xcd, 0xdb, 0xdb, 0xcc, + 0xc8, 0x03, 0x1f, 0x34, 0xb2, 0x30, 0x49, 0x1b, + 0x23, 0x15, 0x2e, 0x69, 0xe6, 0xf8, 0x56, 0x26, + 0x4b, 0x3a, 0xe3, 0x8a, 0x75, 0xcd, 0xa3, 0x25, + 0x6c, 0x81, 0xe1, 0x8f, 0x6d, 0x07, 0x13, 0x08, + 0x3b, 0x9d, 0xdf, 0x4e, 0x16, 0x35, 0x3f, 0xa5, + 0x9a, 0x5b, 0xb2, 0x77, 0x49, 0xf0, 0xa9, 0xfd, + 0x2b, 0xd2, 0xdd, 0x93, 0xba, 0x4f, 0x85, 0x6f, + 0x1f, 0x9b, 0x8e, 0x16, 0xc2, 0xc7, 0x41, 0x33, + 0xe7, 0x96, 0x30, 0xf6, 0xc4, 0xd6, 0x8e, 0x2a, + 0x74, 0xaf, 0xab, 0x8c, 0xe4, 0x50, 0x3c, 0xb1, + 0xb0, 0x4d, 0x33, 0x9a, 0xd0, 0xe9, 0x44, 0x60, + 0x1e, 0x0a, 0xfc, 0xbd, 0xa9, 0x27, 0xd2, 0xda, + 0x1f, 0xd2, 0xbd, 0x2b, 0xd9, 0x1e, 0xee, 0xd3, + 0xe1, 0x56, 0x5c, 0x4e, 0x26, 0xd3, 0x11, 0x64, + 0xcb, 0x1b, 0x36, 0xf0, 0xc3, 0x1f, 0xc5, 0x0b, + 0xc2, 0x6c, 0x81, 0x7d, 0xd6, 0x3c, 0xdb, 0xbe, + 0xb0, 0x5c, 0x17, 0xf1, 0x53, 0x96, 0x8d, 0xa8, + 0x5b, 0x44, 0xe0, 0x08, 0x88, 0x82, 0xa7, 0x9b, + 0xfc, 0xd3, 0x61, 0xdf, 0x8f, 0xf7, 0x95, 0xac, + 0x72, 0xaa, 0xa6, 0x6f, 0xf3, 0x4d, 0x8f, 0x7e, + 0x3f, 0xde, 0x56, 0xb4, 0x12, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x0a, 0xa7, 0xaa, 0xfe, + 0xfa, 0xc7, 0xf7, 0x9b, 0xfd, 0xc0, 0xad, 0x8a, + 0xa5, 0xaa, 0xfe, 0xfa, 0xc7, 0x77, 0x9b, 0xfd, + 0xc0, 0x82, 0xd9, 0xca, 0xa5, 0x47, 0x2a, 0x94, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x41, 0x0a, 0xbb, 0x78, 0x29, 0x7b, + 0x7f, 0x70, 0x37, 0xdb, 0xba, 0x19, 0x07, 0x7b, + 0x84, 0x71, 0x7b, 0xd5, 0x56, 0x25, 0xe2, 0x6c, + 0xad, 0xcb, 0xa5, 0x71, 0x60, 0x26, 0x71, 0xc3, + 0x29, 0xe7, 0x14, 0xa2, 0x9c, 0x7b, 0x86, 0x81, + 0xaf, 0x37, 0x17, 0x36, 0x57, 0x83, 0xff, 0x00, + 0xd8, 0xb9, 0x71, 0x67, 0xcd, 0x6b, 0x1c, 0xd6, + 0xfb, 0xcb, 0x26, 0xc2, 0x58, 0x1b, 0x87, 0xbb, + 0x6c, 0x84, 0x02, 0xd7, 0x4c, 0x24, 0x07, 0x7d, + 0x49, 0x34, 0xe9, 0x5b, 0x46, 0xd8, 0x5a, 0xb5, + 0xb0, 0xb5, 0xac, 0x01, 0xb6, 0xc6, 0xb1, 0x0f, + 0x92, 0x69, 0x45, 0xe3, 0x36, 0x17, 0x1d, 0x3d, + 0xc7, 0x94, 0xcb, 0x10, 0x32, 0xec, 0x24, 0xd4, + 0x80, 0x48, 0xdd, 0x50, 0x0d, 0x16, 0xa6, 0x78, + 0x73, 0xa3, 0xab, 0x53, 0x62, 0x1c, 0xdb, 0xac, + 0x63, 0x5f, 0xb0, 0xf5, 0x0e, 0xe1, 0x07, 0x90, + 0x13, 0xe2, 0xaf, 0x7b, 0x09, 0x60, 0x66, 0x16, + 0xe9, 0xb2, 0x10, 0x1c, 0xc7, 0x4c, 0x24, 0x07, + 0x7d, 0x49, 0x75, 0x3a, 0x56, 0xd6, 0xe3, 0x1f, + 0x6b, 0x70, 0xf8, 0xa4, 0x95, 0x80, 0xba, 0x13, + 0x58, 0xc8, 0xd9, 0x4e, 0x85, 0xe3, 0x36, 0x17, + 0x1d, 0x35, 0xc7, 0x94, 0x49, 0x10, 0x32, 0xd4, + 0x12, 0x41, 0x20, 0x12, 0x39, 0xc5, 0x68, 0xa7, + 0x0a, 0xf6, 0x9c, 0x6f, 0xac, 0x35, 0x98, 0xb8, + 0xdc, 0x2e, 0xf1, 0xfd, 0x60, 0xf1, 0x85, 0xb1, + 0x22, 0xbb, 0xc0, 0x27, 0x62, 0xda, 0x66, 0x1a, + 0xe7, 0x63, 0x2e, 0x03, 0x77, 0xf0, 0x1e, 0x85, + 0x93, 0xe4, 0xd0, 0x99, 0x9b, 0x39, 0x68, 0xeb, + 0x1a, 0x38, 0x5a, 0xee, 0x61, 0xcc, 0xbd, 0x0b, + 0x41, 0x14, 0x3b, 0x8e, 0xf4, 0x99, 0x99, 0x18, + 0x16, 0x33, 0x5b, 0x9b, 0x3b, 0x66, 0x35, 0xcd, + 0xeb, 0x5f, 0x10, 0x11, 0xb7, 0x97, 0x63, 0x76, + 0xad, 0x7d, 0x8c, 0xb6, 0xed, 0xd3, 0xd7, 0x2d, + 0x90, 0x8e, 0x26, 0xf5, 0xc2, 0x46, 0xf2, 0xf1, + 0x17, 0x3a, 0x9d, 0x35, 0x5b, 0x4b, 0x5c, 0x4d, + 0x8d, 0xa4, 0xce, 0x9e, 0x08, 0xf8, 0x24, 0x7e, + 0xc2, 0x6a, 0x4f, 0x2d, 0x76, 0x57, 0x72, 0xf9, + 0x97, 0x0b, 0x8e, 0x96, 0xe3, 0xca, 0x64, 0x88, + 0x19, 0x6a, 0x1c, 0x4d, 0x48, 0x04, 0x8e, 0x71, + 0xb9, 0x39, 0xf5, 0x23, 0x67, 0x73, 0x53, 0x8b, + 0x63, 0xdb, 0x92, 0xb3, 0x6c, 0x83, 0xc7, 0x16, + 0x83, 0x7e, 0xf0, 0x09, 0xd8, 0xbc, 0x66, 0xa0, + 0xb4, 0xca, 0x01, 0xe7, 0x4c, 0xff, 0x00, 0xf8, + 0xab, 0x21, 0xb4, 0x83, 0xaf, 0x17, 0x1c, 0x20, + 0x4a, 0x1b, 0xc0, 0x1d, 0xfe, 0xde, 0x65, 0xe4, + 0x71, 0x96, 0x8e, 0x8e, 0x58, 0x8b, 0x01, 0x65, + 0xc1, 0xe2, 0x94, 0x7c, 0xa3, 0x4a, 0x27, 0x2f, + 0x65, 0x78, 0xc4, 0x93, 0xbf, 0xbe, 0xfc, 0x25, + 0x82, 0xd0, 0xd3, 0x9a, 0x85, 0xdb, 0xc8, 0xb6, + 0x14, 0x3c, 0xdb, 0x4a, 0xfa, 0xc6, 0xbe, 0x28, + 0xee, 0x72, 0x22, 0x52, 0x1a, 0xf1, 0x2f, 0x13, + 0xab, 0xf2, 0x78, 0x46, 0xd5, 0x9b, 0x16, 0x3e, + 0xda, 0x17, 0x31, 0xd1, 0xb6, 0x8e, 0x8d, 0xbd, + 0x5b, 0x0e, 0xd3, 0x46, 0xd6, 0xb4, 0x5e, 0x77, + 0x58, 0x6b, 0x0b, 0xc9, 0x04, 0x97, 0x11, 0xf1, + 0xbc, 0x0a, 0x54, 0x12, 0x2a, 0x3b, 0xb4, 0x3b, + 0x54, 0xe3, 0xdd, 0x3f, 0x14, 0xff, 0x00, 0xd7, + 0xc2, 0x1a, 0x4c, 0x70, 0x7f, 0x59, 0x8e, 0x27, + 0x63, 0x1d, 0x34, 0xe6, 0x31, 0xfe, 0xda, 0x2b, + 0x4a, 0xf0, 0x36, 0x76, 0xe5, 0xd1, 0x3b, 0x80, + 0x56, 0xde, 0xbd, 0x55, 0x3f, 0x66, 0xa2, 0x8b, + 0xdd, 0x5e, 0x11, 0x0b, 0x3b, 0xec, 0x44, 0x44, + 0x15, 0x3c, 0xdf, 0xe6, 0x9b, 0x1e, 0xfc, 0x7f, + 0xbc, 0xad, 0x63, 0x95, 0x55, 0x33, 0x7f, 0x9a, + 0x6c, 0x7b, 0xf1, 0xfe, 0xf2, 0xb5, 0x84, 0x12, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x0a, + 0xa7, 0xaa, 0xfe, 0xfa, 0xc7, 0xf7, 0x9b, 0xfd, + 0xc0, 0xad, 0x8a, 0xa7, 0xaa, 0xfe, 0xfa, 0xc7, + 0xf7, 0x9b, 0xfd, 0xc0, 0x82, 0xd7, 0xca, 0xa5, + 0x42, 0x94, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x15, 0x3c, 0xdf, 0xe6, 0x9b, + 0x1e, 0xfc, 0x7f, 0xbc, 0xad, 0x6a, 0xa9, 0x9b, + 0xfc, 0xd3, 0x61, 0xdf, 0x8f, 0xf7, 0x95, 0xac, + 0x72, 0xa0, 0x94, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x55, 0x3d, 0x57, 0xf7, 0xd6, 0x3f, + 0xbc, 0x3f, 0xb8, 0x15, 0xb1, 0x54, 0x75, 0x7c, + 0x82, 0x2c, 0xb5, 0x8c, 0xae, 0x04, 0xb5, 0x8d, + 0xe2, 0x34, 0xee, 0x3e, 0xa8, 0x2d, 0xaa, 0x55, + 0x7b, 0xd7, 0x4c, 0x67, 0x67, 0x2f, 0x40, 0xf0, + 0xa9, 0xf5, 0xd3, 0x19, 0xd9, 0xcb, 0xd0, 0x3c, + 0x28, 0x2c, 0x08, 0xab, 0xfe, 0xba, 0x63, 0x3b, + 0x39, 0x7a, 0x07, 0x85, 0x3d, 0x74, 0xc6, 0x76, + 0x72, 0xf4, 0x0f, 0x0a, 0x0b, 0x02, 0x2a, 0xff, + 0x00, 0xae, 0x98, 0xce, 0xce, 0x5e, 0x81, 0xe1, + 0x4f, 0x5d, 0x31, 0x9d, 0x9c, 0xbd, 0x03, 0xc2, + 0x82, 0xc0, 0x8a, 0xbf, 0xeb, 0xae, 0x33, 0xb3, + 0x97, 0xa0, 0x78, 0x53, 0xd7, 0x4c, 0x67, 0x67, + 0x2f, 0x40, 0xf0, 0xa0, 0xb0, 0x22, 0xaf, 0xfa, + 0xe9, 0x8c, 0xec, 0xe5, 0xe8, 0x1e, 0x14, 0xf5, + 0xd3, 0x19, 0xd9, 0xcb, 0xd0, 0x3c, 0x28, 0x2c, + 0x08, 0xab, 0xfe, 0xba, 0x63, 0x3b, 0x39, 0x7a, + 0x07, 0x85, 0x3d, 0x74, 0xc6, 0x76, 0x72, 0xf4, + 0x0f, 0x0a, 0x0b, 0x02, 0x2a, 0xff, 0x00, 0xae, + 0x98, 0xce, 0xce, 0x5e, 0x81, 0xe1, 0x4f, 0x5d, + 0x31, 0x9d, 0x9c, 0xbd, 0x03, 0xc2, 0x82, 0xc0, + 0x8a, 0xbf, 0xeb, 0xa6, 0x33, 0xb3, 0x97, 0xa0, + 0x78, 0x53, 0xd7, 0x4c, 0x67, 0x67, 0x2f, 0x40, + 0xf0, 0xa0, 0xb0, 0x22, 0xaf, 0xfa, 0xeb, 0x8c, + 0xec, 0xe5, 0xe8, 0x1e, 0x14, 0xf5, 0xd7, 0x19, + 0xd9, 0xcb, 0xd0, 0x3c, 0x28, 0x2c, 0x08, 0xab, + 0xfe, 0xba, 0x63, 0x3b, 0x39, 0x7a, 0x07, 0x85, + 0x3d, 0x74, 0xc6, 0x76, 0x72, 0xf4, 0x0f, 0x0a, + 0x0b, 0x02, 0x2a, 0xff, 0x00, 0xae, 0x98, 0xce, + 0xce, 0x5e, 0x81, 0xe1, 0x4f, 0x5d, 0x31, 0x9d, + 0x9c, 0xbd, 0x03, 0xc2, 0x82, 0xc0, 0x8a, 0xbf, + 0xeb, 0xa6, 0x33, 0xb3, 0x97, 0xa0, 0x78, 0x53, + 0xd7, 0x4c, 0x67, 0x67, 0x2f, 0x40, 0xf0, 0xa0, + 0xb0, 0x22, 0xaf, 0xfa, 0xe9, 0x8c, 0xec, 0xe5, + 0xe8, 0x1e, 0x14, 0xf5, 0xd3, 0x19, 0xd9, 0xcb, + 0xd0, 0x3c, 0x28, 0x2c, 0x08, 0xab, 0xfe, 0xba, + 0x63, 0x3b, 0x39, 0x7a, 0x07, 0x85, 0x3d, 0x75, + 0xc6, 0x76, 0x72, 0xf4, 0x0f, 0x0a, 0x0b, 0x02, + 0x2a, 0xff, 0x00, 0xae, 0x98, 0xce, 0xce, 0x5e, + 0x81, 0xe1, 0x4f, 0x5d, 0x31, 0x9d, 0x9c, 0xbd, + 0x03, 0xc2, 0x82, 0xc0, 0x8a, 0xbf, 0xeb, 0xa6, + 0x33, 0xb3, 0x97, 0xa0, 0x78, 0x53, 0xd7, 0x4c, + 0x67, 0x67, 0x2f, 0x40, 0xf0, 0xa0, 0xb0, 0x22, + 0xaf, 0xfa, 0xe9, 0x8c, 0xec, 0xe5, 0xe8, 0x1e, + 0x14, 0xf5, 0xd7, 0x19, 0xd9, 0xcb, 0xd0, 0x3c, + 0x28, 0x2c, 0x08, 0xab, 0xfe, 0xba, 0x63, 0x3b, + 0x39, 0x7a, 0x07, 0x85, 0x3d, 0x74, 0xc6, 0x76, + 0x72, 0xf4, 0x0f, 0x0a, 0x0b, 0x02, 0x2a, 0xff, + 0x00, 0xae, 0x98, 0xce, 0xce, 0x5e, 0x81, 0xe1, + 0x4f, 0x5d, 0x31, 0x9d, 0x9c, 0xbd, 0x03, 0xc2, + 0x82, 0xc0, 0x8a, 0xbf, 0xeb, 0xa6, 0x33, 0xb3, + 0x97, 0xa0, 0x78, 0x53, 0xd7, 0x4c, 0x67, 0x67, + 0x2f, 0x40, 0xf0, 0xa0, 0xb0, 0x22, 0xaf, 0xfa, + 0xe9, 0x8c, 0xec, 0xe5, 0xe8, 0x1e, 0x14, 0xf5, + 0xd3, 0x19, 0xd9, 0xcb, 0xd0, 0x3c, 0x28, 0x2c, + 0x08, 0xab, 0xfe, 0xba, 0x63, 0x3b, 0x39, 0x7a, + 0x07, 0x85, 0x3d, 0x74, 0xc6, 0x76, 0x72, 0xf4, + 0x0f, 0x0a, 0x0b, 0x02, 0x2a, 0xff, 0x00, 0xae, + 0x98, 0xce, 0xce, 0x5e, 0x81, 0xe1, 0x4f, 0x5d, + 0x31, 0x9d, 0x9c, 0xbd, 0x03, 0xc2, 0x82, 0xc0, + 0x8a, 0xbf, 0xeb, 0xae, 0x33, 0xb3, 0x97, 0xa0, + 0x78, 0x53, 0xd7, 0x4c, 0x67, 0x67, 0x2f, 0x40, + 0xf0, 0xa0, 0xb0, 0x22, 0xaf, 0xfa, 0xe9, 0x8c, + 0xec, 0xe5, 0xe8, 0x1e, 0x14, 0xf5, 0xd3, 0x19, + 0xd9, 0xcb, 0xd0, 0x3c, 0x28, 0x2c, 0x08, 0xab, + 0xfe, 0xba, 0x63, 0x3b, 0x39, 0x7a, 0x07, 0x85, + 0x3d, 0x74, 0xc6, 0x76, 0x72, 0xf4, 0x0f, 0x0a, + 0x0b, 0x02, 0x2a, 0xff, 0x00, 0xae, 0xb8, 0xce, + 0xce, 0x5e, 0x81, 0xe1, 0x4f, 0x5d, 0x31, 0x9d, + 0x9c, 0xbd, 0x03, 0xc2, 0x82, 0xc0, 0x8a, 0xbf, + 0xeb, 0xa6, 0x33, 0xb3, 0x97, 0xa0, 0x78, 0x53, + 0xd7, 0x5c, 0x67, 0x67, 0x2f, 0x40, 0xf0, 0xa0, + 0xb0, 0x22, 0xaf, 0xfa, 0xe9, 0x8c, 0xec, 0xe5, + 0xe8, 0x1e, 0x14, 0xf5, 0xd3, 0x19, 0xd9, 0xcb, + 0xd0, 0x3c, 0x28, 0x2c, 0x08, 0xab, 0xfe, 0xba, + 0x63, 0x3b, 0x39, 0x7a, 0x07, 0x85, 0x3d, 0x74, + 0xc6, 0x76, 0x72, 0xf4, 0x0f, 0x0a, 0x0b, 0x02, + 0x2a, 0xff, 0x00, 0xae, 0x98, 0xce, 0xce, 0x5e, + 0x81, 0xe1, 0x4f, 0x5d, 0x31, 0x9d, 0x9c, 0xbd, + 0x03, 0xc2, 0x82, 0xc0, 0x8a, 0xbf, 0xeb, 0xae, + 0x33, 0xb3, 0x97, 0xa0, 0x78, 0x53, 0xd7, 0x4c, + 0x67, 0x67, 0x2f, 0x40, 0xf0, 0xa0, 0xb0, 0x22, + 0xaf, 0xfa, 0xe9, 0x8c, 0xec, 0xe5, 0xe8, 0x1e, + 0x14, 0xf5, 0xd7, 0x19, 0xd9, 0xcb, 0xd0, 0x3c, + 0x28, 0x2c, 0x08, 0xab, 0xfe, 0xba, 0x63, 0x3b, + 0x39, 0x7a, 0x07, 0x85, 0x3d, 0x74, 0xc6, 0x76, + 0x72, 0xf4, 0x0f, 0x0a, 0x0b, 0x02, 0x2a, 0xff, + 0x00, 0xae, 0x98, 0xce, 0xce, 0x5e, 0x81, 0xe1, + 0x4f, 0x5d, 0x31, 0x9d, 0x9c, 0xbd, 0x03, 0xc2, + 0x82, 0xc0, 0x8a, 0xbf, 0xeb, 0xa6, 0x33, 0xb3, + 0x97, 0xa0, 0x78, 0x53, 0xd7, 0x5c, 0x67, 0x67, + 0x2f, 0x40, 0xf0, 0xa0, 0xb0, 0x22, 0xaf, 0xfa, + 0xe9, 0x8c, 0xec, 0xe5, 0xe8, 0x1e, 0x14, 0xf5, + 0xd3, 0x19, 0xd9, 0xcb, 0xd0, 0x3c, 0x28, 0x2c, + 0x08, 0xab, 0xfe, 0xba, 0xe3, 0x3b, 0x39, 0x7a, + 0x07, 0x85, 0x3d, 0x74, 0xc6, 0x76, 0x72, 0xf4, + 0x0f, 0x0a, 0x0b, 0x02, 0x2a, 0xff, 0x00, 0xae, + 0x98, 0xce, 0xce, 0x5e, 0x81, 0xe1, 0x4f, 0x5d, + 0x31, 0x9d, 0x9c, 0xbd, 0x03, 0xc2, 0x82, 0xc0, + 0x8a, 0xbf, 0xeb, 0xa6, 0x33, 0xb3, 0x97, 0xa0, + 0x78, 0x53, 0xd7, 0x4c, 0x67, 0x67, 0x2f, 0x40, + 0xf0, 0xa0, 0xb0, 0x22, 0xaf, 0xfa, 0xe9, 0x8c, + 0xec, 0xe5, 0xe8, 0x1e, 0x14, 0xf5, 0xd7, 0x19, + 0xd9, 0xcb, 0xd0, 0x3c, 0x28, 0x2c, 0x08, 0xab, + 0xfe, 0xba, 0x63, 0x3b, 0x39, 0x7a, 0x07, 0x85, + 0x3d, 0x74, 0xc6, 0x76, 0x72, 0xf4, 0x0f, 0x0a, + 0x0b, 0x02, 0x2a, 0xff, 0x00, 0xae, 0xb8, 0xce, + 0xce, 0x5e, 0x81, 0xe1, 0x4f, 0x5d, 0x31, 0x9d, + 0x9c, 0xbd, 0x03, 0xc2, 0x82, 0xc0, 0x8a, 0xbf, + 0xeb, 0xa6, 0x33, 0xb3, 0x97, 0xa0, 0x78, 0x53, + 0xd7, 0x4c, 0x67, 0x67, 0x2f, 0x40, 0xf0, 0xa0, + 0xb0, 0x22, 0xaf, 0xfa, 0xe9, 0x8c, 0xec, 0xe5, + 0xe8, 0x1e, 0x14, 0xf5, 0xd3, 0x19, 0xd9, 0xcb, + 0xd0, 0x3c, 0x28, 0x2c, 0x08, 0xab, 0xfe, 0xba, + 0x63, 0x3b, 0x39, 0x7a, 0x07, 0x85, 0x3d, 0x75, + 0xc6, 0x76, 0x72, 0xf4, 0x0f, 0x0a, 0x0b, 0x02, + 0x2a, 0xff, 0x00, 0xae, 0x98, 0xce, 0xce, 0x5e, + 0x81, 0xe1, 0x4f, 0x5d, 0x31, 0x9d, 0x9c, 0xbd, + 0x03, 0xc2, 0x82, 0xc0, 0x8a, 0xbf, 0xeb, 0xa6, + 0x33, 0xb3, 0x97, 0xa0, 0x78, 0x53, 0xd7, 0x4c, + 0x67, 0x67, 0x2f, 0x40, 0xf0, 0xa0, 0xb0, 0x22, + 0xaf, 0xfa, 0xe9, 0x8c, 0xec, 0xe5, 0xe8, 0x1e, + 0x14, 0xf5, 0xd3, 0x19, 0xd9, 0xcb, 0xd0, 0x3c, + 0x28, 0x2c, 0x08, 0xab, 0xfe, 0xba, 0x63, 0x3b, + 0x39, 0x7a, 0x07, 0x85, 0x3d, 0x74, 0xc6, 0x76, + 0x72, 0xf4, 0x0f, 0x0a, 0x0b, 0x02, 0x2a, 0xff, + 0x00, 0xae, 0xb8, 0xce, 0xce, 0x5e, 0x81, 0xe1, + 0x4f, 0x5d, 0x31, 0x9d, 0x9c, 0xbd, 0x03, 0xc2, + 0x82, 0xc0, 0x8a, 0xbf, 0xeb, 0xa6, 0x33, 0xb3, + 0x97, 0xa0, 0x78, 0x53, 0xd7, 0x5c, 0x67, 0x67, + 0x2f, 0x40, 0xf0, 0xa0, 0xb0, 0x22, 0xaf, 0xfa, + 0xe9, 0x8c, 0xec, 0xe5, 0xe8, 0x1e, 0x14, 0xf5, + 0xd3, 0x19, 0xd9, 0xcb, 0xd0, 0x3c, 0x28, 0x2c, + 0x08, 0xab, 0xfe, 0xba, 0x63, 0x3b, 0x39, 0x7a, + 0x07, 0x85, 0x3d, 0x74, 0xc6, 0x76, 0x72, 0xf4, + 0x0f, 0x0a, 0x0b, 0x02, 0x2a, 0xff, 0x00, 0xae, + 0x98, 0xce, 0xce, 0x5e, 0x81, 0xe1, 0x4f, 0x5d, + 0x31, 0x9d, 0x9c, 0xbd, 0x03, 0xc2, 0x82, 0xc0, + 0x8a, 0xbf, 0xeb, 0xae, 0x33, 0xb3, 0x97, 0xa0, + 0x78, 0x53, 0xd7, 0x4c, 0x67, 0x67, 0x2f, 0x40, + 0xf0, 0xa0, 0xb0, 0x22, 0xaf, 0xfa, 0xe9, 0x8c, + 0xec, 0xe5, 0xe8, 0x1e, 0x14, 0xf5, 0xd7, 0x19, + 0xd9, 0xcb, 0xd0, 0x3c, 0x28, 0x2c, 0x08, 0xab, + 0xfe, 0xba, 0x63, 0x3b, 0x39, 0x7a, 0x07, 0x85, + 0x3d, 0x74, 0xc6, 0x76, 0x72, 0xf4, 0x0f, 0x0a, + 0x0b, 0x02, 0x2a, 0xff, 0x00, 0xae, 0x98, 0xce, + 0xce, 0x5e, 0x81, 0xe1, 0x4f, 0x5d, 0x31, 0x9d, + 0x9c, 0xbd, 0x03, 0xc2, 0x82, 0xc0, 0x8a, 0xbf, + 0xeb, 0xa6, 0x33, 0xb3, 0x97, 0xa0, 0x78, 0x53, + 0xd7, 0x5c, 0x67, 0x67, 0x2f, 0x40, 0xf0, 0xa0, + 0xb0, 0x22, 0xaf, 0xfa, 0xe9, 0x8c, 0xec, 0xe5, + 0xe8, 0x1e, 0x14, 0xf5, 0xd3, 0x19, 0xd9, 0xcb, + 0xd0, 0x3c, 0x28, 0x2c, 0x08, 0xab, 0xfe, 0xba, + 0xe3, 0x3b, 0x39, 0x7a, 0x07, 0x85, 0x3d, 0x74, + 0xc6, 0x76, 0x72, 0xf4, 0x0f, 0x0a, 0x0b, 0x02, + 0x2a, 0xff, 0x00, 0xae, 0x98, 0xce, 0xce, 0x5e, + 0x81, 0xe1, 0x4f, 0x5d, 0x31, 0x9d, 0x9c, 0xbd, + 0x03, 0xc2, 0x82, 0xc0, 0x8a, 0xbf, 0xeb, 0xa6, + 0x33, 0xb3, 0x97, 0xa0, 0x78, 0x53, 0xd7, 0x4c, + 0x67, 0x67, 0x2f, 0x40, 0xf0, 0xa0, 0xb0, 0x22, + 0xaf, 0xfa, 0xeb, 0x8c, 0xec, 0xe5, 0xe8, 0x1e, + 0x14, 0xf5, 0xd3, 0x19, 0xd9, 0xcb, 0xd0, 0x3c, + 0x28, 0x2c, 0x08, 0xab, 0xfe, 0xba, 0x63, 0x3b, + 0x39, 0x7a, 0x07, 0x85, 0x3d, 0x74, 0xc6, 0x76, + 0x72, 0xf4, 0x0f, 0x0a, 0x0b, 0x02, 0x2a, 0xff, + 0x00, 0xae, 0xb8, 0xce, 0xce, 0x5e, 0x81, 0xe1, + 0x4f, 0x5d, 0x31, 0x9d, 0x9c, 0xbd, 0x03, 0xc2, + 0x82, 0xc0, 0x8a, 0xbf, 0xeb, 0xa6, 0x33, 0xb3, + 0x97, 0xa0, 0x78, 0x53, 0xd7, 0x4c, 0x67, 0x67, + 0x2f, 0x40, 0xf0, 0xa0, 0xb0, 0x22, 0xaf, 0xfa, + 0xe9, 0x8c, 0xec, 0xe5, 0xe8, 0x1e, 0x14, 0xf5, + 0xd3, 0x19, 0xd9, 0xcb, 0xd0, 0x3c, 0x28, 0x2c, + 0x08, 0xab, 0xfe, 0xba, 0xe3, 0x3b, 0x39, 0x7a, + 0x07, 0x85, 0x3d, 0x74, 0xc6, 0x76, 0x72, 0xf4, + 0x0f, 0x0a, 0x0b, 0x02, 0x2a, 0xff, 0x00, 0xae, + 0x98, 0xce, 0xce, 0x5e, 0x81, 0xe1, 0x4f, 0x5d, + 0x31, 0x9d, 0x9c, 0xbd, 0x03, 0xc2, 0x82, 0xc0, + 0x8a, 0xbf, 0xeb, 0xa6, 0x33, 0xb3, 0x97, 0xa0, + 0x78, 0x53, 0xd7, 0x4c, 0x67, 0x67, 0x2f, 0x40, + 0xf0, 0xa0, 0xb0, 0x22, 0xaf, 0xfa, 0xe9, 0x8c, + 0xec, 0xe5, 0xe8, 0x1e, 0x14, 0xf5, 0xd3, 0x19, + 0xd9, 0xcb, 0xd0, 0x3c, 0x28, 0x2c, 0x08, 0xab, + 0xfe, 0xba, 0x63, 0x3b, 0x39, 0x7a, 0x07, 0x85, + 0x3d, 0x74, 0xc6, 0x76, 0x72, 0xf4, 0x0f, 0x0a, + 0x0b, 0x02, 0x2a, 0xff, 0x00, 0xae, 0x98, 0xce, + 0xce, 0x5e, 0x81, 0xe1, 0x4f, 0x5d, 0x31, 0x9d, + 0x9c, 0xbd, 0x03, 0xc2, 0x83, 0x0f, 0x37, 0xf9, + 0xa6, 0xc7, 0xbf, 0x1f, 0xef, 0x2b, 0x58, 0x54, + 0x99, 0xf2, 0x50, 0xe4, 0xf5, 0x0d, 0x95, 0xc4, + 0x0d, 0x73, 0x58, 0x1c, 0xc6, 0x90, 0xe1, 0x43, + 0x50, 0x55, 0xd8, 0x72, 0xa0, 0x94, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x5a, 0xbc, 0xc7, + 0xa0, 0xbf, 0x87, 0xe9, 0x6e, 0x0d, 0xdf, 0xc3, + 0xe2, 0xe2, 0xf7, 0xb8, 0x51, 0x10, 0x6b, 0x3f, + 0x03, 0x7d, 0x17, 0xda, 0x27, 0xe0, 0x6f, 0xa3, + 0xfb, 0x44, 0x44, 0x0f, 0xc0, 0xff, 0x00, 0x47, + 0xf6, 0x89, 0xf8, 0x1f, 0xe8, 0xfe, 0xd1, 0x11, + 0x03, 0xf0, 0x3f, 0xd1, 0xfd, 0xa2, 0x7e, 0x07, + 0xfa, 0x3f, 0xb4, 0x44, 0x40, 0xfc, 0x0d, 0xf4, + 0x5f, 0x68, 0x9f, 0x81, 0xbe, 0x8f, 0xed, 0x11, + 0x10, 0x3f, 0x03, 0xfd, 0x1f, 0xda, 0x27, 0xe0, + 0x7f, 0xa3, 0xfb, 0x44, 0x44, 0x0f, 0xc0, 0xff, + 0x00, 0x47, 0xf6, 0x89, 0xf8, 0x1f, 0xe8, 0xfe, + 0xd1, 0x11, 0x03, 0xf0, 0x3f, 0xd1, 0xfd, 0xa2, + 0x7e, 0x07, 0xfa, 0x3f, 0xb4, 0x44, 0x40, 0xfc, + 0x0f, 0xf4, 0x7f, 0x68, 0x9f, 0x81, 0xfe, 0x8f, + 0xed, 0x11, 0x10, 0x3f, 0x03, 0x7d, 0x17, 0xda, + 0x27, 0xe0, 0x6f, 0xa3, 0xfb, 0x44, 0x44, 0x0f, + 0xc0, 0xdf, 0x47, 0xf6, 0x89, 0xf8, 0x1f, 0xe8, + 0xfe, 0xd1, 0x11, 0x03, 0xf0, 0x3f, 0xd1, 0xfd, + 0xa2, 0x7e, 0x07, 0xfa, 0x3f, 0xb4, 0x44, 0x40, + 0xfc, 0x0f, 0xf4, 0x7f, 0x68, 0x9f, 0x81, 0xfe, + 0x8f, 0xed, 0x11, 0x10, 0x3f, 0x03, 0xfd, 0x1f, + 0xda, 0x27, 0xe0, 0x7f, 0xa3, 0xfb, 0x44, 0x44, + 0x0f, 0xc0, 0xff, 0x00, 0x47, 0xf6, 0x89, 0xf8, + 0x1b, 0xe8, 0xbe, 0xd1, 0x11, 0x03, 0xf0, 0x3f, + 0xd1, 0xfd, 0xa2, 0x7e, 0x07, 0xfa, 0x3f, 0xb4, + 0x44, 0x40, 0xfc, 0x0f, 0xf4, 0x7f, 0x68, 0x9f, + 0x81, 0xfe, 0x8f, 0xed, 0x11, 0x10, 0x3f, 0x03, + 0xfd, 0x1f, 0xda, 0x27, 0xe0, 0x6f, 0xa2, 0xfb, + 0x44, 0x44, 0x0f, 0xc0, 0xff, 0x00, 0x47, 0xf6, + 0x89, 0xf8, 0x1f, 0xe8, 0xfe, 0xd1, 0x11, 0x03, + 0xf0, 0x37, 0xd1, 0xfd, 0xa2, 0x7e, 0x06, 0xfa, + 0x3f, 0xb4, 0x44, 0x40, 0xfc, 0x0f, 0xf4, 0x7f, + 0x68, 0x9f, 0x81, 0xfe, 0x8f, 0xed, 0x11, 0x10, + 0x3f, 0x03, 0xfd, 0x1f, 0xda, 0x27, 0xe0, 0x7f, + 0xa3, 0xfb, 0x44, 0x44, 0x0f, 0xc0, 0xdf, 0x47, + 0xf6, 0x89, 0xf8, 0x1b, 0xe8, 0xfe, 0xd1, 0x11, + 0x03, 0xf0, 0x3f, 0xd1, 0xfd, 0xa2, 0x7e, 0x07, + 0xfa, 0x3f, 0xb4, 0x44, 0x40, 0xfc, 0x0d, 0xf4, + 0x5f, 0x68, 0x9f, 0x81, 0xfe, 0x8f, 0xed, 0x11, + 0x10, 0x3f, 0x03, 0xfd, 0x1f, 0xda, 0x27, 0xe0, + 0x7f, 0xa3, 0xfb, 0x44, 0x44, 0x0f, 0xc0, 0xff, + 0x00, 0x47, 0xf6, 0x89, 0xf8, 0x1f, 0xe8, 0xfe, + 0xd1, 0x11, 0x03, 0xf0, 0x37, 0xd1, 0x7d, 0xa2, + 0x7e, 0x07, 0xfa, 0x3f, 0xb4, 0x44, 0x40, 0xfc, + 0x0f, 0xf4, 0x7f, 0x68, 0x9f, 0x81, 0xbe, 0x8b, + 0xed, 0x11, 0x10, 0x3f, 0x03, 0xfd, 0x1f, 0xda, + 0x27, 0xe0, 0x7f, 0xa3, 0xfb, 0x44, 0x44, 0x0f, + 0xc0, 0xff, 0x00, 0x47, 0xf6, 0x89, 0xf8, 0x1f, + 0xe8, 0xfe, 0xd1, 0x11, 0x03, 0xf0, 0x3f, 0xd1, + 0xfd, 0xa2, 0x7e, 0x06, 0xfa, 0x3f, 0xb4, 0x44, + 0x40, 0xfc, 0x0d, 0xf4, 0x7f, 0x68, 0x9f, 0x81, + 0xfe, 0x8f, 0xed, 0x11, 0x10, 0x3f, 0x03, 0x7d, + 0x1f, 0xda, 0x27, 0xe0, 0x6f, 0xa3, 0xfb, 0x44, + 0x44, 0x0f, 0xc0, 0xff, 0x00, 0x47, 0xf6, 0x89, + 0xf8, 0x1f, 0xe8, 0xfe, 0xd1, 0x11, 0x03, 0xf0, + 0x3f, 0xd1, 0xfd, 0xa2, 0x7e, 0x07, 0xfa, 0x3f, + 0xb4, 0x44, 0x40, 0xfc, 0x0f, 0xf4, 0x7f, 0x68, + 0x9f, 0x81, 0xbe, 0x8f, 0xed, 0x11, 0x10, 0x3f, + 0x03, 0x7d, 0x1f, 0xda, 0x27, 0xe0, 0x7f, 0xa3, + 0xfb, 0x44, 0x44, 0x0f, 0xc0, 0xdf, 0x47, 0xf6, + 0x89, 0xf8, 0x1b, 0xe8, 0xfe, 0xd1, 0x11, 0x03, + 0xf0, 0x3f, 0xd1, 0xfd, 0xa2, 0x7e, 0x07, 0xfa, + 0x3f, 0xb4, 0x44, 0x40, 0xfc, 0x0f, 0xf4, 0x7f, + 0x68, 0x9f, 0x81, 0xfe, 0x8f, 0xed, 0x11, 0x10, + 0x3f, 0x03, 0xfd, 0x1f, 0xda, 0x27, 0xe0, 0x6f, + 0xa2, 0xfb, 0x44, 0x44, 0x0f, 0xc0, 0xff, 0x00, + 0x47, 0xf6, 0x89, 0xf8, 0x1f, 0xe8, 0xfe, 0xd1, + 0x11, 0x03, 0xf0, 0x37, 0xd1, 0x7d, 0xa2, 0x7e, + 0x07, 0xfa, 0x3f, 0xb4, 0x44, 0x40, 0xfc, 0x0f, + 0xf4, 0x7f, 0x68, 0x9f, 0x81, 0xfe, 0x8f, 0xed, + 0x11, 0x10, 0x3f, 0x03, 0xfd, 0x1f, 0xda, 0x27, + 0xe0, 0x7f, 0xa3, 0xfb, 0x44, 0x44, 0x0f, 0xc0, + 0xdf, 0x47, 0xf6, 0x89, 0xf8, 0x1b, 0xe8, 0xfe, + 0xd1, 0x11, 0x03, 0xf0, 0x3f, 0xd1, 0xfd, 0xa2, + 0x7e, 0x06, 0xfa, 0x3f, 0xb4, 0x44, 0x40, 0xfc, + 0x0d, 0xf4, 0x7f, 0x68, 0x9f, 0x81, 0xfe, 0x8f, + 0xed, 0x11, 0x10, 0x3f, 0x03, 0xfd, 0x1f, 0xda, + 0x27, 0xe0, 0x7f, 0xa3, 0xfb, 0x44, 0x44, 0x0f, + 0xc0, 0xff, 0x00, 0x47, 0xf6, 0x89, 0xf8, 0x1f, + 0xe8, 0xfe, 0xd1, 0x11, 0x03, 0xf0, 0x37, 0xd1, + 0x7d, 0xa2, 0x7e, 0x06, 0xfa, 0x3f, 0xb4, 0x44, + 0x40, 0xfc, 0x0f, 0xf4, 0x7f, 0x68, 0x9f, 0x81, + 0xbe, 0x8b, 0xed, 0x11, 0x10, 0x3f, 0x03, 0xfd, + 0x1f, 0xda, 0x27, 0xe0, 0x7f, 0xa3, 0xfb, 0x44, + 0x44, 0x0f, 0xc0, 0xff, 0x00, 0x47, 0xf6, 0x89, + 0xf8, 0x1f, 0xe8, 0xfe, 0xd1, 0x11, 0x03, 0xf0, + 0x3f, 0xd1, 0xfd, 0xa2, 0x7e, 0x07, 0xfa, 0x3f, + 0xb4, 0x44, 0x40, 0xfc, 0x0d, 0xf4, 0x5f, 0x68, + 0x9f, 0x81, 0xfe, 0x8f, 0xed, 0x11, 0x10, 0x3f, + 0x03, 0x7d, 0x1f, 0xda, 0x27, 0xe0, 0x6f, 0xa2, + 0xfb, 0x44, 0x44, 0x0f, 0xc0, 0xff, 0x00, 0x47, + 0xf6, 0x89, 0xf8, 0x1f, 0xe8, 0xfe, 0xd1, 0x11, + 0x03, 0xf0, 0x3f, 0xd1, 0xfd, 0xa2, 0x7e, 0x07, + 0xfa, 0x3f, 0xb4, 0x44, 0x40, 0xfc, 0x0d, 0xf4, + 0x7f, 0x68, 0x9f, 0x81, 0xbe, 0x8f, 0xed, 0x11, + 0x10, 0x3f, 0x03, 0xfd, 0x1f, 0xda, 0x27, 0xe0, + 0x7f, 0xa3, 0xfb, 0x44, 0x44, 0x0f, 0xc0, 0xdf, + 0x47, 0xf6, 0x89, 0xf8, 0x1b, 0xe8, 0xfe, 0xd1, + 0x11, 0x03, 0xf0, 0x3f, 0xd1, 0xfd, 0xa2, 0x7e, + 0x07, 0xfa, 0x3f, 0xb4, 0x44, 0x40, 0xfc, 0x0f, + 0xf4, 0x7f, 0x68, 0x9f, 0x81, 0xfe, 0x8f, 0xed, + 0x11, 0x10, 0x3f, 0x03, 0x7d, 0x1f, 0xda, 0x27, + 0xe0, 0x6f, 0xa3, 0xfb, 0x44, 0x44, 0x0f, 0xc0, + 0xff, 0x00, 0x47, 0xf6, 0x89, 0xf8, 0x1f, 0xe8, + 0xfe, 0xd1, 0x11, 0x03, 0xf0, 0x37, 0xd1, 0x7d, + 0xa2, 0x7e, 0x07, 0xfa, 0x3f, 0xb4, 0x44, 0x40, + 0xfc, 0x0f, 0xf4, 0x7f, 0x68, 0x9f, 0x81, 0xfe, + 0x8f, 0xed, 0x11, 0x10, 0x3f, 0x03, 0xfd, 0x1f, + 0xda, 0x27, 0xe0, 0x7f, 0xa3, 0xfb, 0x44, 0x44, + 0x0f, 0xc0, 0xdf, 0x45, 0xf6, 0x89, 0xf8, 0x1f, + 0xe8, 0xfe, 0xd1, 0x11, 0x03, 0xf0, 0x3f, 0xd1, + 0xfd, 0xa2, 0x7e, 0x07, 0xfa, 0x3f, 0xb4, 0x44, + 0x40, 0xfc, 0x0f, 0xf4, 0x7f, 0x68, 0x9f, 0x81, + 0xfe, 0x8f, 0xed, 0x11, 0x10, 0x3f, 0x03, 0xfd, + 0x1f, 0xda, 0x27, 0xe0, 0x7f, 0xa3, 0xfb, 0x44, + 0x44, 0x0f, 0xc0, 0xff, 0x00, 0x47, 0xf6, 0x89, + 0xf8, 0x1b, 0xe8, 0xfe, 0xd1, 0x11, 0x03, 0xf0, + 0x37, 0xd1, 0xfd, 0xa2, 0x7e, 0x06, 0xfa, 0x2f, + 0xb4, 0x44, 0x41, 0x91, 0x63, 0xea, 0x97, 0x95, + 0x33, 0xc8, 0xba, 0xbf, 0x28, 0xaf, 0x89, 0x4e, + 0x3a, 0xd7, 0xff, 0x00, 0x92, 0xdf, 0xa2, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0xff, 0xd9, +}; + +static const uint8_t data_images_c_c_c_communicate_small_jpg[] = +{ + /* /images/c-c-c-communicate-small.jpg */ + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x63, 0x2d, 0x63, 0x2d, 0x63, 0x2d, 0x63, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x2d, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2e, + 0x6a, 0x70, 0x67, 0x00, + 0xff, 0xd8, 0xff, 0xe1, 0x00, 0x18, 0x45, 0x78, + 0x69, 0x66, 0x00, 0x00, 0x49, 0x49, 0x2a, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x11, + 0x44, 0x75, 0x63, 0x6b, 0x79, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0xff, + 0xe1, 0x03, 0x29, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, + 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, + 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x00, + 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, + 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, + 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, + 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, + 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, + 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, + 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, + 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, + 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, + 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, + 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, + 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, + 0x65, 0x20, 0x35, 0x2e, 0x30, 0x2d, 0x63, 0x30, + 0x36, 0x30, 0x20, 0x36, 0x31, 0x2e, 0x31, 0x33, + 0x34, 0x37, 0x37, 0x37, 0x2c, 0x20, 0x32, 0x30, + 0x31, 0x30, 0x2f, 0x30, 0x32, 0x2f, 0x31, 0x32, + 0x2d, 0x31, 0x37, 0x3a, 0x33, 0x32, 0x3a, 0x30, + 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, + 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, + 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, + 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, + 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, + 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, + 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, + 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, + 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, + 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, + 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, + 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, + 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, + 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, + 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, + 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, + 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, + 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, + 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, + 0x20, 0x43, 0x53, 0x35, 0x20, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x73, 0x22, 0x20, 0x78, 0x6d, + 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, + 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, + 0x33, 0x34, 0x31, 0x30, 0x31, 0x36, 0x37, 0x33, + 0x32, 0x36, 0x44, 0x44, 0x31, 0x31, 0x45, 0x33, + 0x38, 0x34, 0x42, 0x46, 0x38, 0x34, 0x37, 0x30, + 0x45, 0x44, 0x31, 0x39, 0x41, 0x30, 0x46, 0x45, + 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, + 0x64, 0x69, 0x64, 0x3a, 0x33, 0x34, 0x31, 0x30, + 0x31, 0x36, 0x37, 0x34, 0x32, 0x36, 0x44, 0x44, + 0x31, 0x31, 0x45, 0x33, 0x38, 0x34, 0x42, 0x46, + 0x38, 0x34, 0x37, 0x30, 0x45, 0x44, 0x31, 0x39, + 0x41, 0x30, 0x46, 0x45, 0x22, 0x3e, 0x20, 0x3c, + 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, + 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, + 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, + 0x69, 0x69, 0x64, 0x3a, 0x33, 0x34, 0x31, 0x30, + 0x31, 0x36, 0x37, 0x31, 0x32, 0x36, 0x44, 0x44, + 0x31, 0x31, 0x45, 0x33, 0x38, 0x34, 0x42, 0x46, + 0x38, 0x34, 0x37, 0x30, 0x45, 0x44, 0x31, 0x39, + 0x41, 0x30, 0x46, 0x45, 0x22, 0x20, 0x73, 0x74, + 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, + 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, + 0x33, 0x34, 0x31, 0x30, 0x31, 0x36, 0x37, 0x32, + 0x32, 0x36, 0x44, 0x44, 0x31, 0x31, 0x45, 0x33, + 0x38, 0x34, 0x42, 0x46, 0x38, 0x34, 0x37, 0x30, + 0x45, 0x44, 0x31, 0x39, 0x41, 0x30, 0x46, 0x45, + 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, + 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, + 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, + 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, + 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, + 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, + 0x3f, 0x3e, 0xff, 0xee, 0x00, 0x0e, 0x41, 0x64, + 0x6f, 0x62, 0x65, 0x00, 0x64, 0xc0, 0x00, 0x00, + 0x00, 0x01, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x0c, + 0x08, 0x08, 0x08, 0x09, 0x08, 0x0c, 0x09, 0x09, + 0x0c, 0x11, 0x0b, 0x0a, 0x0b, 0x11, 0x15, 0x0f, + 0x0c, 0x0c, 0x0f, 0x15, 0x18, 0x13, 0x13, 0x15, + 0x13, 0x13, 0x18, 0x17, 0x12, 0x14, 0x14, 0x14, + 0x14, 0x12, 0x17, 0x17, 0x1b, 0x1c, 0x1e, 0x1c, + 0x1b, 0x17, 0x24, 0x24, 0x27, 0x27, 0x24, 0x24, + 0x35, 0x33, 0x33, 0x33, 0x35, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x01, + 0x0d, 0x0b, 0x0b, 0x0d, 0x0e, 0x0d, 0x10, 0x0e, + 0x0e, 0x10, 0x14, 0x0e, 0x0f, 0x0e, 0x14, 0x14, + 0x10, 0x11, 0x11, 0x10, 0x14, 0x1d, 0x14, 0x14, + 0x15, 0x14, 0x14, 0x1d, 0x25, 0x1a, 0x17, 0x17, + 0x17, 0x17, 0x1a, 0x25, 0x20, 0x23, 0x1e, 0x1e, + 0x1e, 0x23, 0x20, 0x28, 0x28, 0x25, 0x25, 0x28, + 0x28, 0x32, 0x32, 0x30, 0x32, 0x32, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0xff, 0xc0, 0x00, 0x11, 0x08, 0x00, 0xf5, 0x00, + 0xbf, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, + 0x03, 0x11, 0x01, 0xff, 0xc4, 0x00, 0x8a, 0x00, + 0x00, 0x02, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x03, 0x04, 0x06, 0x02, 0x01, 0x07, + 0x01, 0x01, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x04, 0x03, 0x05, 0x10, + 0x00, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x02, + 0x03, 0x05, 0x08, 0x01, 0x05, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x03, 0x00, 0x11, 0x04, 0x21, 0x12, + 0x05, 0x31, 0x41, 0x51, 0x61, 0x22, 0x13, 0x71, + 0x32, 0x81, 0x23, 0x14, 0x91, 0xa1, 0xb1, 0xc1, + 0x42, 0xf0, 0xd1, 0xe1, 0x52, 0x62, 0x24, 0x15, + 0x06, 0x33, 0x72, 0x82, 0xa2, 0x43, 0x63, 0x11, + 0x01, 0x00, 0x02, 0x02, 0x02, 0x03, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x11, 0x03, 0x21, 0x04, 0x31, + 0x41, 0x12, 0x51, 0x22, 0x71, 0x61, 0x62, 0xff, + 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, + 0x03, 0x11, 0x00, 0x3f, 0x00, 0xfa, 0xad, 0x14, + 0x51, 0x40, 0x51, 0x45, 0x14, 0x05, 0x14, 0x51, + 0x40, 0x51, 0x45, 0x14, 0x05, 0x14, 0x57, 0x94, + 0x1e, 0xd1, 0x5e, 0x16, 0x51, 0xd4, 0x81, 0xf5, + 0xaf, 0x0c, 0x91, 0xa8, 0xbb, 0x30, 0x03, 0xc9, + 0x22, 0x83, 0xaa, 0x2b, 0x81, 0x34, 0x27, 0xa3, + 0xa9, 0xfc, 0x45, 0x7a, 0x24, 0x8d, 0xba, 0x30, + 0x3f, 0x42, 0x28, 0x3a, 0xa2, 0x8a, 0x28, 0x0a, + 0x28, 0xa2, 0x80, 0xa2, 0x8a, 0x28, 0x0a, 0x28, + 0xa2, 0x80, 0xa2, 0x8a, 0x28, 0x0a, 0x28, 0xa2, + 0x80, 0xa2, 0x8a, 0x28, 0x0a, 0x28, 0xa2, 0x80, + 0xa2, 0xaa, 0xe7, 0x65, 0xae, 0x34, 0x57, 0xbf, + 0xbc, 0xfd, 0xa2, 0x93, 0x8c, 0xbe, 0x43, 0x25, + 0xf6, 0xc6, 0xc7, 0xdd, 0xa3, 0x20, 0x1a, 0x50, + 0x39, 0x9f, 0x90, 0xc6, 0x83, 0x46, 0x6b, 0x9f, + 0x02, 0x95, 0x64, 0x67, 0xf2, 0x33, 0xb2, 0x9c, + 0x7f, 0x6a, 0x31, 0xd1, 0x57, 0xaf, 0xed, 0xa9, + 0x3f, 0xe2, 0x19, 0xe3, 0x1f, 0x33, 0x04, 0x5b, + 0xdc, 0x82, 0x6e, 0x48, 0xf5, 0xed, 0x56, 0x21, + 0x93, 0x0b, 0x06, 0x3f, 0x8e, 0x2d, 0x40, 0xd6, + 0xe7, 0xd7, 0xd6, 0x99, 0x4c, 0x44, 0xcf, 0x88, + 0x2d, 0x68, 0xf3, 0xe4, 0x25, 0xa7, 0x0c, 0x41, + 0x17, 0xb1, 0xb9, 0x36, 0xa3, 0x0b, 0x8b, 0xc8, + 0x98, 0x12, 0xcb, 0xb4, 0x1b, 0xb0, 0xdd, 0xd2, + 0xf7, 0xd3, 0x43, 0x4c, 0x24, 0xe5, 0x96, 0xf6, + 0x05, 0x40, 0xf5, 0x1f, 0xdf, 0x5c, 0x49, 0xc9, + 0xb2, 0x25, 0xd5, 0x81, 0xfa, 0x0a, 0x8f, 0xa8, + 0x5e, 0x34, 0xde, 0x7d, 0x21, 0x97, 0x87, 0x9a, + 0x38, 0xc1, 0x07, 0x7e, 0xc1, 0x6d, 0xaa, 0x2e, + 0x5a, 0xe7, 0xae, 0xb5, 0x51, 0x21, 0xc9, 0x81, + 0xfe, 0x50, 0xac, 0xbf, 0x11, 0xf6, 0x93, 0xa0, + 0xb0, 0xd7, 0x5b, 0x53, 0x18, 0xf9, 0x62, 0x63, + 0x2e, 0x5c, 0x54, 0xcb, 0xc8, 0x23, 0x47, 0x77, + 0xda, 0x6e, 0x6d, 0xa8, 0xa7, 0xd4, 0x22, 0x75, + 0x5e, 0x3d, 0x2a, 0x2f, 0x35, 0x90, 0x80, 0x06, + 0x01, 0xbb, 0x5c, 0xf7, 0x3e, 0x2a, 0xfe, 0x3f, + 0x29, 0x04, 0xb6, 0x0e, 0x42, 0x31, 0x00, 0xf5, + 0xd3, 0x5a, 0xe1, 0xa2, 0xc1, 0xc9, 0x8f, 0x6b, + 0x28, 0x03, 0xd2, 0xa2, 0x6e, 0x25, 0x1c, 0x7e, + 0x5c, 0x83, 0x68, 0xe8, 0x2d, 0xaf, 0xed, 0xa9, + 0xca, 0xb3, 0x13, 0x1e, 0x60, 0xc5, 0x26, 0x89, + 0xcd, 0x91, 0xc3, 0x7d, 0x0d, 0xea, 0x4a, 0xcd, + 0xcd, 0x8f, 0x95, 0x81, 0x28, 0x75, 0x27, 0x5e, + 0xe0, 0x5c, 0x69, 0xda, 0x98, 0xe1, 0xf2, 0xc2, + 0x56, 0x11, 0xca, 0xbb, 0x4d, 0xba, 0xf6, 0xa2, + 0x0c, 0xe8, 0xaf, 0x2b, 0xda, 0x02, 0x8a, 0x28, + 0xa0, 0x28, 0xa2, 0x8a, 0x02, 0x8a, 0x28, 0xa0, + 0x28, 0xa2, 0x8a, 0x0f, 0x29, 0x66, 0x6f, 0x2c, + 0xd1, 0xc9, 0xf0, 0xe3, 0x81, 0xbc, 0x1b, 0x33, + 0x30, 0xe9, 0xf4, 0xab, 0x79, 0x79, 0x6b, 0x0a, + 0x10, 0xa4, 0x19, 0x48, 0x3b, 0x56, 0xff, 0x00, + 0xbe, 0x92, 0xe2, 0xc2, 0x67, 0xc9, 0x0f, 0x6b, + 0xed, 0x3b, 0xa5, 0xdd, 0xd7, 0x5e, 0xb4, 0x1c, + 0xfc, 0x19, 0x59, 0xd2, 0x31, 0x90, 0x5d, 0xfb, + 0x49, 0xa8, 0xd2, 0x9b, 0x47, 0x2c, 0x38, 0xb1, + 0x88, 0x97, 0x57, 0x03, 0xdc, 0xd6, 0xef, 0x55, + 0xf3, 0x79, 0x14, 0x8d, 0x4a, 0x46, 0x02, 0xa8, + 0xd3, 0x75, 0xed, 0x48, 0xf3, 0x33, 0xa4, 0x8a, + 0x19, 0x64, 0x37, 0x07, 0xa0, 0xd6, 0xab, 0x6b, + 0xe1, 0xa3, 0x57, 0x5e, 0xd7, 0xf2, 0xbb, 0x99, + 0xcb, 0x92, 0xff, 0x00, 0x71, 0xbd, 0xfd, 0xb4, + 0xa3, 0x2f, 0x94, 0x95, 0x3d, 0xcd, 0xb8, 0x5e, + 0x96, 0x26, 0x71, 0x63, 0x2c, 0xac, 0x2f, 0xf1, + 0xad, 0xed, 0x7e, 0xf5, 0x51, 0xb3, 0xa5, 0xc8, + 0xc2, 0x99, 0xe4, 0x37, 0xda, 0x7d, 0xbe, 0x84, + 0xf6, 0xae, 0x16, 0xbe, 0x5e, 0x86, 0xbe, 0xac, + 0x47, 0xa5, 0xd7, 0xe5, 0xda, 0xfd, 0x4d, 0xaf, + 0xe2, 0xb8, 0x4e, 0x66, 0x65, 0x04, 0x07, 0x36, + 0xa5, 0xd8, 0xf8, 0x8f, 0x91, 0x0b, 0x4a, 0x24, + 0x00, 0xa8, 0x24, 0xad, 0xfc, 0x55, 0x2f, 0x92, + 0xc4, 0x82, 0x6f, 0xad, 0x57, 0xea, 0x5a, 0x23, + 0x4d, 0x63, 0xd3, 0x4d, 0x8b, 0xcb, 0x23, 0x21, + 0x8a, 0x56, 0x2b, 0x73, 0x70, 0xd5, 0x60, 0xf3, + 0x01, 0x9d, 0x62, 0x87, 0x71, 0x03, 0xbf, 0x9a, + 0xc9, 0xfc, 0x87, 0xc9, 0xbf, 0xd6, 0xa4, 0x8b, + 0x25, 0xe3, 0x70, 0xea, 0x7d, 0xc3, 0x51, 0xad, + 0x4f, 0xd4, 0x93, 0xd7, 0xac, 0xc7, 0x10, 0xdd, + 0x41, 0xca, 0x18, 0xe0, 0x05, 0xc9, 0x05, 0xda, + 0xda, 0xf8, 0xa6, 0xb8, 0x5c, 0x88, 0x29, 0xbc, + 0xb1, 0xb1, 0xd0, 0x56, 0x08, 0x73, 0x4d, 0x24, + 0x7b, 0x26, 0x5b, 0xb0, 0xe8, 0xc0, 0xda, 0x9a, + 0xe0, 0x66, 0xbc, 0xf8, 0xea, 0x23, 0x36, 0x65, + 0x6f, 0x75, 0xdb, 0xb5, 0x5a, 0xbb, 0x19, 0xb6, + 0xf4, 0xf8, 0xce, 0x1b, 0x94, 0x96, 0x2c, 0x88, + 0xf6, 0xc8, 0xb7, 0x56, 0xea, 0x0d, 0x2a, 0xe4, + 0xb8, 0xc1, 0x04, 0x7f, 0x24, 0x2c, 0x44, 0x40, + 0xea, 0x09, 0xbd, 0x89, 0x35, 0x52, 0x1e, 0x51, + 0x55, 0x96, 0x30, 0x6e, 0x10, 0x58, 0xeb, 0xde, + 0x9c, 0x45, 0x3a, 0x4f, 0x08, 0x49, 0x06, 0xe0, + 0xdd, 0x8f, 0x8a, 0xed, 0x5b, 0x44, 0xbc, 0xfd, + 0xba, 0x2d, 0x49, 0x79, 0xc7, 0x72, 0x2a, 0xe0, + 0x41, 0x39, 0x02, 0x45, 0x1e, 0xd6, 0x3d, 0x18, + 0x0a, 0x62, 0x18, 0x30, 0xb8, 0x37, 0x1e, 0x45, + 0x21, 0xca, 0xe3, 0xde, 0x2d, 0xcf, 0x12, 0x99, + 0x13, 0xaa, 0x91, 0xa9, 0x00, 0xd4, 0xfc, 0x3e, + 0x77, 0xb8, 0xe3, 0xc9, 0xa5, 0xc9, 0xf8, 0xfd, + 0x2d, 0xd4, 0x55, 0x9c, 0x0e, 0x28, 0xa2, 0x8a, + 0x02, 0x8a, 0x28, 0xa0, 0x28, 0xa2, 0x8a, 0x02, + 0xab, 0x67, 0xe5, 0x0c, 0x6c, 0x66, 0x92, 0xe3, + 0x77, 0x45, 0x07, 0xcd, 0x59, 0xac, 0xff, 0x00, + 0x23, 0x24, 0x93, 0x66, 0xb4, 0x68, 0x77, 0x6d, + 0xd1, 0x57, 0xb0, 0xbf, 0x7a, 0x0f, 0x70, 0xb0, + 0x9f, 0x2a, 0x52, 0xf3, 0x83, 0xb0, 0xea, 0xda, + 0xf5, 0xa9, 0x39, 0x0c, 0xb8, 0x60, 0x42, 0x91, + 0x58, 0x28, 0xd0, 0x9e, 0xe6, 0xac, 0x3b, 0xae, + 0x16, 0x22, 0xe3, 0x86, 0xf7, 0xed, 0xbb, 0x93, + 0xae, 0x86, 0xb3, 0x1c, 0x97, 0x24, 0x25, 0x8e, + 0x51, 0xd3, 0x60, 0xba, 0x9a, 0xa5, 0xed, 0x86, + 0x8e, 0xbe, 0x99, 0xbc, 0xe5, 0x47, 0x92, 0xe4, + 0xfb, 0x29, 0x1e, 0x82, 0xf4, 0xa2, 0x4e, 0x62, + 0x70, 0xa5, 0x2e, 0x1d, 0x4e, 0x96, 0x35, 0xc4, + 0x91, 0xe4, 0xe6, 0x6e, 0x68, 0xac, 0xc0, 0x1d, + 0x74, 0xb7, 0xed, 0xa5, 0x72, 0x12, 0xac, 0x54, + 0xfd, 0xc0, 0xd8, 0xfe, 0x15, 0x9e, 0xd6, 0xcb, + 0xd9, 0xd5, 0xaa, 0xb1, 0x06, 0x18, 0x73, 0x2c, + 0x8b, 0x34, 0x0e, 0xc1, 0x3e, 0x51, 0x70, 0x7b, + 0x57, 0x39, 0x72, 0x47, 0x14, 0x0b, 0x89, 0x13, + 0x6f, 0x7b, 0xde, 0x46, 0x1e, 0x7c, 0x52, 0xe2, + 0xd7, 0xb9, 0x27, 0x4a, 0x12, 0x52, 0x8e, 0x1c, + 0x75, 0x06, 0xf5, 0x57, 0x5c, 0x18, 0x62, 0x93, + 0x16, 0x1e, 0x44, 0xe6, 0xe0, 0xb0, 0xd8, 0xbf, + 0x53, 0xd6, 0xb9, 0xe3, 0xe1, 0x47, 0x67, 0x96, + 0x5d, 0x62, 0x84, 0x6e, 0x23, 0xc9, 0xf1, 0x5d, + 0xb7, 0x23, 0x8d, 0x91, 0x01, 0x8a, 0x64, 0xd8, + 0x46, 0xa0, 0xaf, 0x42, 0x6b, 0x9c, 0x50, 0xd2, + 0x71, 0xb3, 0x2c, 0x43, 0x73, 0x92, 0x2e, 0x07, + 0x52, 0x28, 0x89, 0x84, 0xb9, 0x5f, 0x04, 0xd8, + 0x9f, 0xa9, 0x89, 0x04, 0x65, 0x5b, 0x6b, 0x01, + 0xe0, 0xf4, 0xaa, 0x83, 0x1f, 0x20, 0xa7, 0xca, + 0x10, 0xec, 0x3d, 0x1a, 0xa6, 0xca, 0xbe, 0x36, + 0x0c, 0x50, 0x1d, 0x19, 0xce, 0xf7, 0x07, 0xa8, + 0xae, 0xf1, 0xb2, 0xe6, 0x4e, 0x32, 0x62, 0xe7, + 0xd9, 0xf6, 0xc7, 0xf5, 0xa2, 0xd5, 0xe1, 0x4b, + 0x7d, 0xb4, 0xed, 0xfc, 0xea, 0x58, 0x72, 0xa4, + 0x8c, 0xdd, 0x4e, 0xdb, 0xf5, 0xb5, 0x73, 0x85, + 0x8b, 0xfa, 0x97, 0x66, 0x76, 0xd9, 0x0a, 0x0b, + 0xc8, 0xfe, 0x2b, 0xac, 0xdc, 0x58, 0xf1, 0xd5, + 0x25, 0x85, 0xf7, 0xc5, 0x25, 0xec, 0x7d, 0x45, + 0x57, 0x97, 0x5f, 0xe6, 0x78, 0x9f, 0x26, 0xbc, + 0x77, 0x26, 0x21, 0x94, 0x3b, 0x80, 0xcb, 0xdc, + 0x5f, 0x5d, 0x6b, 0x53, 0x8b, 0xca, 0xe3, 0x48, + 0xaa, 0xf1, 0xb8, 0x1b, 0x6c, 0x36, 0x9e, 0xd5, + 0xf3, 0xa4, 0x98, 0xad, 0xad, 0xdf, 0xaf, 0xd2, + 0x9a, 0x61, 0x66, 0x95, 0x61, 0xee, 0xe9, 0xe9, + 0x57, 0xad, 0xe6, 0x19, 0xf7, 0xf5, 0x62, 0xf1, + 0x98, 0x7d, 0x4f, 0x0f, 0x28, 0x32, 0x27, 0x42, + 0xad, 0xde, 0xaa, 0xf2, 0x58, 0x46, 0x29, 0x53, + 0x2e, 0x12, 0x15, 0x41, 0xb9, 0x1e, 0xa7, 0xc5, + 0x26, 0xe2, 0x39, 0x72, 0x51, 0x54, 0x30, 0x23, + 0xcd, 0x68, 0xe2, 0x68, 0xf3, 0x20, 0x68, 0x24, + 0xd4, 0x30, 0xeb, 0x5a, 0xab, 0x6c, 0xc3, 0xc3, + 0xdf, 0xa6, 0x69, 0x3e, 0x12, 0xe1, 0x67, 0x45, + 0x93, 0x18, 0xb1, 0xb4, 0x80, 0x5d, 0x94, 0xf5, + 0xfa, 0xda, 0xad, 0x56, 0x73, 0x1b, 0x76, 0x26, + 0x78, 0x8e, 0xc5, 0x8a, 0xb1, 0x56, 0x23, 0xc0, + 0xd0, 0x9d, 0x6b, 0x44, 0x08, 0x3a, 0x8a, 0xb3, + 0x3b, 0xda, 0x28, 0xa2, 0x80, 0xa2, 0x8a, 0xf2, + 0x82, 0x9f, 0x23, 0x9d, 0xfa, 0x64, 0xd8, 0x82, + 0xf2, 0xbf, 0xdb, 0xe8, 0x3c, 0xd2, 0xee, 0x35, + 0x54, 0xcb, 0x26, 0x5c, 0xba, 0xa4, 0x4a, 0x08, + 0x1e, 0x5c, 0xd1, 0xce, 0x4e, 0xa6, 0x74, 0x45, + 0x36, 0x64, 0xb1, 0xd2, 0xf7, 0x35, 0x06, 0x63, + 0x8c, 0x6c, 0x25, 0x86, 0xfe, 0xe7, 0x1b, 0xdc, + 0x1d, 0x0e, 0xbd, 0x07, 0xe1, 0x51, 0x33, 0x88, + 0x5a, 0x95, 0x9b, 0x5a, 0x22, 0x3d, 0xab, 0x67, + 0xf2, 0x06, 0x57, 0x95, 0x4b, 0x10, 0xee, 0x0e, + 0xdd, 0x6b, 0x2d, 0xc9, 0xe4, 0x3e, 0x3e, 0x33, + 0x23, 0xb5, 0xe5, 0x90, 0xd8, 0x8f, 0x41, 0x5e, + 0x72, 0xb9, 0xa7, 0x79, 0xb1, 0xb1, 0xec, 0x6f, + 0x6a, 0x45, 0x3c, 0xec, 0xf2, 0x06, 0x63, 0xba, + 0xde, 0x4d, 0x66, 0xbd, 0xb3, 0x2f, 0x6f, 0xaf, + 0xa7, 0xe6, 0x21, 0x6f, 0x8f, 0x99, 0xd4, 0xcf, + 0x31, 0x62, 0x16, 0x35, 0xd4, 0x76, 0xb9, 0xaa, + 0x98, 0xb1, 0x7e, 0xab, 0x23, 0x69, 0xd0, 0x1b, + 0xb3, 0xb7, 0xa5, 0x5d, 0x4c, 0xac, 0x19, 0xb1, + 0x9e, 0x10, 0x3e, 0x16, 0x6e, 0xb6, 0xef, 0x6a, + 0xab, 0x82, 0x76, 0xc1, 0x94, 0x53, 0x56, 0x0b, + 0x60, 0x7b, 0xda, 0xa8, 0xd7, 0x8e, 0x12, 0xe4, + 0xc1, 0x87, 0x24, 0x0f, 0x2e, 0x2d, 0xf7, 0x45, + 0xa3, 0x5e, 0x97, 0x80, 0xc4, 0x5c, 0x0b, 0xd5, + 0xc8, 0xd4, 0xc1, 0xc5, 0xc8, 0x58, 0x59, 0xa6, + 0x60, 0x05, 0xfc, 0x0a, 0x9f, 0x8b, 0xca, 0x61, + 0x04, 0xa8, 0xe8, 0xa6, 0x34, 0x52, 0xc0, 0x91, + 0xad, 0xcd, 0x10, 0x59, 0xa8, 0x17, 0xa9, 0x20, + 0xc9, 0x9a, 0x06, 0x2d, 0x1b, 0x15, 0x26, 0xbc, + 0x86, 0x29, 0x32, 0x66, 0xdb, 0x18, 0xb9, 0x62, + 0x49, 0x07, 0x4b, 0x0a, 0x97, 0x33, 0x02, 0x5c, + 0x55, 0x0e, 0x58, 0x3a, 0x13, 0x6b, 0x8f, 0x34, + 0x1c, 0xac, 0xcb, 0x2e, 0x40, 0x93, 0x28, 0x96, + 0x52, 0x7d, 0xf4, 0xc3, 0x2d, 0x31, 0xe4, 0xe3, + 0xc0, 0xc5, 0x90, 0x6d, 0x88, 0x96, 0x65, 0x63, + 0x63, 0xaf, 0x8a, 0x4a, 0x4d, 0xe8, 0xdc, 0x47, + 0x43, 0x60, 0x7b, 0x54, 0x2f, 0x8c, 0xe0, 0xcb, + 0x77, 0xc5, 0xc4, 0x12, 0x07, 0xfe, 0x69, 0x2c, + 0xe7, 0xd0, 0x0d, 0x05, 0x19, 0xb6, 0x8b, 0x8e, + 0xc6, 0x81, 0xbe, 0xe2, 0x4c, 0x96, 0xf4, 0x35, + 0x0e, 0x0f, 0x24, 0xb8, 0xd1, 0x98, 0xe4, 0x8c, + 0x4b, 0x1d, 0xf7, 0x00, 0x7c, 0xd7, 0x85, 0xe4, + 0xe4, 0xb2, 0xfd, 0xcc, 0x23, 0x24, 0x59, 0x6f, + 0xd0, 0x0a, 0x7a, 0x4c, 0x47, 0x32, 0xbc, 0x66, + 0xc6, 0x7e, 0x1d, 0xa4, 0x30, 0x84, 0x75, 0xb4, + 0x61, 0xbc, 0xd5, 0x5e, 0x3e, 0x29, 0xf2, 0x1f, + 0x6c, 0x20, 0x9b, 0x6a, 0x4f, 0x6a, 0x97, 0x94, + 0x82, 0x5c, 0x5c, 0x2c, 0x78, 0x00, 0xba, 0x2f, + 0xb9, 0x9c, 0x74, 0xb9, 0xd2, 0xbc, 0x32, 0x1c, + 0x5e, 0x2a, 0x3d, 0xa7, 0x6b, 0xe5, 0x31, 0x25, + 0x97, 0xfc, 0xa2, 0xa0, 0x89, 0x9c, 0x49, 0xc6, + 0x1c, 0xd3, 0x62, 0xca, 0xb1, 0x49, 0xb8, 0x30, + 0xfe, 0xda, 0x56, 0xbb, 0x8a, 0xce, 0xdc, 0x16, + 0xc4, 0x93, 0xa5, 0x60, 0xe7, 0x9d, 0x84, 0x78, + 0x82, 0x42, 0x4b, 0x94, 0xf7, 0x1b, 0xeb, 0x63, + 0xd2, 0xb4, 0xdc, 0x7c, 0x90, 0x26, 0x3a, 0x4b, + 0x1b, 0x92, 0xac, 0x6d, 0x6b, 0xf7, 0xae, 0xda, + 0xed, 0x86, 0x1e, 0xde, 0xa8, 0xb4, 0x67, 0x0d, + 0x47, 0x21, 0x87, 0xfa, 0x80, 0x32, 0xa1, 0x21, + 0x5c, 0x0b, 0x48, 0x0f, 0x71, 0xfe, 0x15, 0xef, + 0x11, 0x99, 0x23, 0x31, 0xc6, 0x92, 0xe4, 0x75, + 0x8c, 0x9e, 0xb6, 0xf0, 0x6b, 0xae, 0x3e, 0x71, + 0x22, 0x6c, 0x3d, 0x1c, 0x74, 0xbd, 0xff, 0x00, + 0x75, 0x51, 0xc3, 0x95, 0xb1, 0x79, 0x0d, 0xac, + 0x34, 0x63, 0xb4, 0xdc, 0x1d, 0x3e, 0x95, 0xa2, + 0x27, 0x30, 0xf1, 0x2f, 0x5f, 0x99, 0xc3, 0x43, + 0x45, 0x79, 0x5e, 0xd4, 0xaa, 0x2a, 0xbe, 0x74, + 0xe6, 0x0c, 0x67, 0x90, 0x75, 0x03, 0x4a, 0xb1, + 0x4a, 0x79, 0xdc, 0xa8, 0xe3, 0x48, 0xe0, 0x63, + 0x6d, 0xed, 0xee, 0xb6, 0xba, 0x50, 0x53, 0xc0, + 0x46, 0xca, 0xc9, 0x49, 0x27, 0x6b, 0xac, 0x63, + 0x7b, 0x77, 0x06, 0xdd, 0x29, 0x57, 0x33, 0x94, + 0x67, 0x9c, 0xaa, 0xda, 0xee, 0x74, 0xfe, 0xc2, + 0x9b, 0x63, 0x27, 0xc7, 0x8d, 0x3c, 0xd7, 0xda, + 0x1f, 0xf2, 0xe3, 0xfd, 0x9a, 0xd6, 0x67, 0x2e, + 0x72, 0x25, 0x99, 0xaf, 0x73, 0x1a, 0x92, 0x2c, + 0x2f, 0xad, 0x73, 0xd9, 0x3c, 0x61, 0xb3, 0xa5, + 0xaf, 0x36, 0x9b, 0x13, 0x72, 0x98, 0xc8, 0x56, + 0x46, 0x8e, 0x40, 0xee, 0x9f, 0x70, 0x14, 0x85, + 0xcd, 0xcf, 0xaf, 0x6a, 0x69, 0x1b, 0x11, 0x8f, + 0x93, 0x3b, 0x13, 0xef, 0x1b, 0x47, 0xd6, 0xf5, + 0x17, 0x14, 0xd0, 0xb1, 0x31, 0x4b, 0x10, 0x71, + 0x62, 0xc5, 0x8f, 0x60, 0x2b, 0x3c, 0xbd, 0xaa, + 0x46, 0x20, 0xb0, 0xdf, 0xc6, 0x83, 0x4d, 0x2a, + 0x5c, 0x5c, 0xa9, 0x71, 0xdf, 0x7c, 0x7d, 0xc5, + 0x88, 0x35, 0xc4, 0xbf, 0x99, 0x33, 0x08, 0xc5, + 0xb7, 0x1b, 0x28, 0x1d, 0xea, 0x59, 0xb0, 0xb2, + 0x20, 0x40, 0xf2, 0x2d, 0x81, 0xa8, 0x5a, 0x5d, + 0x4d, 0x97, 0x26, 0x5c, 0xa9, 0xf2, 0x9d, 0xa8, + 0x0d, 0xac, 0x3a, 0x0a, 0xbe, 0xd8, 0x9f, 0x1e, + 0x04, 0xa3, 0x19, 0xc4, 0xac, 0xe4, 0x16, 0xf4, + 0x51, 0x49, 0x89, 0xbf, 0xf7, 0x57, 0x49, 0x34, + 0x91, 0xe8, 0x8c, 0x56, 0xfa, 0x1f, 0xa5, 0x10, + 0xbf, 0x82, 0xdf, 0x0e, 0x26, 0x4c, 0xe3, 0xee, + 0xb6, 0xc5, 0x3e, 0x2f, 0x5e, 0x5c, 0xaf, 0x10, + 0x4b, 0x92, 0x77, 0xbd, 0x97, 0xf9, 0xd4, 0x78, + 0x39, 0x50, 0x44, 0x92, 0x43, 0x90, 0xa5, 0xa3, + 0x93, 0xad, 0xa8, 0xcb, 0xc8, 0x19, 0x4f, 0x1e, + 0x36, 0x32, 0xed, 0x8d, 0x7d, 0xa8, 0x3c, 0xdf, + 0xb9, 0xa0, 0xb1, 0x8b, 0x8f, 0x81, 0x36, 0x0c, + 0x8e, 0xd7, 0x12, 0xc4, 0xb7, 0x63, 0xdb, 0xd2, + 0x95, 0xa8, 0x67, 0x60, 0xa8, 0x37, 0x13, 0xf6, + 0x81, 0x4c, 0x66, 0x8a, 0x4c, 0x3e, 0x31, 0x91, + 0xc5, 0x9e, 0x67, 0xf7, 0x7d, 0x05, 0x47, 0x82, + 0xe3, 0x17, 0x0e, 0x5c, 0xd2, 0x01, 0x96, 0xe1, + 0x23, 0xbf, 0x6b, 0xf7, 0xa2, 0xd5, 0x9c, 0x29, + 0x4b, 0x14, 0x91, 0x36, 0xc9, 0x54, 0xa1, 0x23, + 0xbd, 0x78, 0x09, 0x1a, 0x83, 0x6f, 0x5a, 0x61, + 0x9b, 0x2b, 0xe4, 0x71, 0xb0, 0x4f, 0x2d, 0xbe, + 0x4d, 0xe4, 0x6e, 0xf2, 0x2b, 0x83, 0xc4, 0xb0, + 0xc3, 0x39, 0x42, 0x55, 0x20, 0x0b, 0x95, 0x06, + 0xa1, 0x7f, 0xa8, 0x40, 0x73, 0x72, 0x4c, 0x26, + 0x16, 0x90, 0xb4, 0x67, 0xb1, 0xd6, 0xaf, 0x63, + 0xe4, 0x60, 0x4f, 0x8b, 0x14, 0x79, 0x44, 0xab, + 0x63, 0x5c, 0x8f, 0x0c, 0x3c, 0x52, 0x90, 0x68, + 0xbd, 0x8f, 0xf2, 0xa8, 0x4c, 0xe2, 0x7c, 0x18, + 0xcb, 0x2c, 0xb9, 0xd9, 0x4c, 0xd0, 0xad, 0xd5, + 0x40, 0x01, 0x47, 0x60, 0x29, 0xf4, 0x79, 0x03, + 0x1d, 0x31, 0xf1, 0xb4, 0x52, 0x8b, 0xb9, 0xaf, + 0xd6, 0xe6, 0xb2, 0xd8, 0xb9, 0x53, 0x63, 0x49, + 0xbe, 0x26, 0xd8, 0x7b, 0xfa, 0x8a, 0x6a, 0xbc, + 0xb1, 0xc9, 0x55, 0xf9, 0x50, 0x7c, 0xab, 0xae, + 0xfe, 0xf6, 0xab, 0x44, 0xf2, 0xe5, 0xb6, 0xb9, + 0x8c, 0x3e, 0x8d, 0xc4, 0xe4, 0x88, 0xe0, 0x88, + 0x9b, 0x6f, 0x6f, 0x76, 0xb5, 0x77, 0x93, 0xc4, + 0x43, 0x22, 0x66, 0x26, 0x9d, 0xcf, 0xa1, 0xf3, + 0x48, 0x78, 0x89, 0x84, 0xc9, 0x0c, 0x81, 0xfd, + 0xa1, 0x40, 0x61, 0xfe, 0x15, 0xa2, 0x9f, 0x21, + 0x5b, 0x01, 0x9a, 0xd7, 0x00, 0x8f, 0x4b, 0x0a, + 0xd3, 0xae, 0x78, 0x78, 0x3d, 0xba, 0x62, 0xd9, + 0x4f, 0xc6, 0x66, 0x9c, 0xa8, 0x8e, 0xe1, 0xee, + 0x4d, 0x2e, 0x3a, 0x1a, 0xbb, 0x4a, 0x38, 0x62, + 0xa2, 0x57, 0xdb, 0xd5, 0x96, 0xec, 0x3b, 0x75, + 0xb0, 0x34, 0xde, 0xba, 0x32, 0xbc, 0xa4, 0x3c, + 0xbc, 0xb1, 0x9c, 0x86, 0x56, 0x8c, 0xc8, 0xe8, + 0x2c, 0xa3, 0xeb, 0xde, 0x9f, 0x1a, 0x49, 0xcc, + 0xba, 0x0c, 0x80, 0x06, 0x8e, 0x40, 0x00, 0x81, + 0xd7, 0xf1, 0xa0, 0xad, 0xca, 0x17, 0xc6, 0xe3, + 0x71, 0xe0, 0x63, 0xf9, 0x9b, 0x4b, 0xb5, 0xbc, + 0x9e, 0xd5, 0x88, 0xcd, 0xcd, 0x68, 0x72, 0x19, + 0xc0, 0x2c, 0x08, 0x21, 0x94, 0x9d, 0x2d, 0x5b, + 0x0f, 0xfb, 0x33, 0xd9, 0xc2, 0x1d, 0x4a, 0x22, + 0xaf, 0xe3, 0x6a, 0xc1, 0x72, 0x71, 0x4c, 0x8c, + 0x5d, 0x90, 0x85, 0x6e, 0xf7, 0xb8, 0xae, 0x1b, + 0x67, 0x97, 0xad, 0xd0, 0xa7, 0xf1, 0x13, 0xfa, + 0xab, 0x9d, 0x9c, 0x72, 0x76, 0xc5, 0x1a, 0x08, + 0xa2, 0xbf, 0x41, 0xd0, 0x93, 0x53, 0xc7, 0x85, + 0x2e, 0x26, 0x24, 0xf2, 0x68, 0xec, 0xea, 0x15, + 0x76, 0xeb, 0xa1, 0xa5, 0x6e, 0x6b, 0xa8, 0xb3, + 0x32, 0x21, 0xfb, 0x1f, 0x4f, 0x15, 0xc5, 0xe9, + 0x63, 0x85, 0x8e, 0x2d, 0x42, 0xbc, 0xd3, 0xb6, + 0xa2, 0x15, 0xb8, 0x07, 0xb1, 0xa9, 0x22, 0x9a, + 0x49, 0x70, 0xb2, 0x5a, 0x66, 0xdc, 0xbd, 0xaf, + 0xe4, 0xf8, 0xa8, 0x70, 0x27, 0x85, 0x4c, 0xa9, + 0x39, 0x21, 0x66, 0x16, 0x36, 0xec, 0x6b, 0xac, + 0xb9, 0x60, 0x8f, 0x1c, 0x61, 0x62, 0x93, 0x20, + 0x2d, 0x77, 0x6f, 0x24, 0xf4, 0xa2, 0x1e, 0xe0, + 0x60, 0x63, 0xe5, 0x46, 0x77, 0x4b, 0xb6, 0x41, + 0x7f, 0x65, 0xbb, 0x0e, 0xf5, 0x45, 0x80, 0x0e, + 0x42, 0x9b, 0x80, 0x6c, 0x0f, 0x4b, 0xd5, 0xfc, + 0x35, 0x6c, 0x7c, 0x5c, 0x99, 0xe4, 0x05, 0x5a, + 0xdb, 0x16, 0xfe, 0xb5, 0x17, 0x1b, 0x14, 0x6e, + 0xf2, 0x4d, 0x35, 0x8c, 0x70, 0xae, 0xe6, 0xbf, + 0x9e, 0xd4, 0x15, 0x08, 0x61, 0xf7, 0x0b, 0x57, + 0x81, 0xd9, 0x08, 0x64, 0xb8, 0x61, 0xd0, 0xd3, + 0x29, 0xe6, 0x5c, 0xcc, 0x09, 0x26, 0x64, 0x08, + 0xf1, 0x30, 0xb1, 0x1e, 0x0d, 0x55, 0x8b, 0x8e, + 0xcb, 0x9a, 0x1f, 0x9e, 0x30, 0x0c, 0x7a, 0x9f, + 0x5d, 0x28, 0x3a, 0xff, 0x00, 0x95, 0xc9, 0x68, + 0x5a, 0x19, 0x6d, 0x22, 0x11, 0x6b, 0x9e, 0xa2, + 0xa6, 0xc3, 0x58, 0xf2, 0xf0, 0x3f, 0x4a, 0x65, + 0x11, 0x48, 0x8f, 0xb8, 0x13, 0xdc, 0x52, 0xbe, + 0x9a, 0x74, 0x23, 0xad, 0x17, 0x23, 0x51, 0xde, + 0x8b, 0x79, 0x5f, 0xe4, 0xa6, 0x8d, 0x8c, 0x78, + 0xb0, 0x5d, 0x92, 0x01, 0x6b, 0x8e, 0x84, 0xf7, + 0xae, 0xe4, 0x63, 0x07, 0x10, 0x88, 0x4f, 0xbb, + 0x21, 0xaf, 0xff, 0x00, 0xb5, 0x7a, 0x55, 0x2c, + 0x7c, 0x96, 0xc6, 0x94, 0x4a, 0xa0, 0x1b, 0x69, + 0x63, 0x57, 0x73, 0x79, 0x0c, 0x5c, 0xcc, 0x70, + 0x19, 0x0c, 0x73, 0x26, 0x89, 0xb7, 0xed, 0xa1, + 0x2f, 0x30, 0x52, 0x08, 0x31, 0x5b, 0x3a, 0x74, + 0x12, 0x6b, 0xb2, 0x28, 0xcf, 0x73, 0xdc, 0xd1, + 0xc9, 0x47, 0x11, 0x58, 0x32, 0x21, 0x5d, 0x82, + 0x75, 0xfb, 0x7d, 0x6f, 0x52, 0x36, 0x3c, 0xb9, + 0x5c, 0x6e, 0x2a, 0x40, 0x37, 0x00, 0xc4, 0x3f, + 0xa1, 0x3e, 0x6a, 0x1e, 0x5a, 0x45, 0x12, 0x45, + 0x8e, 0x8d, 0xa4, 0x0b, 0x6d, 0x3c, 0xf7, 0xa8, + 0xc2, 0x72, 0x86, 0x4c, 0x2c, 0xb8, 0x93, 0xe5, + 0x78, 0xc8, 0x5e, 0xa0, 0xd7, 0xb0, 0x48, 0x43, + 0x03, 0x57, 0x32, 0xf2, 0x25, 0x5e, 0x2a, 0x08, + 0xa4, 0x62, 0x5e, 0x66, 0xdf, 0x6f, 0xf4, 0x8e, + 0x95, 0xc7, 0x1d, 0x89, 0x01, 0x88, 0xe4, 0xe5, + 0xbe, 0xc8, 0x6f, 0x64, 0x03, 0xb9, 0xa6, 0x11, + 0x96, 0x83, 0x82, 0xc8, 0x61, 0x61, 0x76, 0x00, + 0x9e, 0x95, 0xbb, 0xe3, 0xc7, 0xea, 0x71, 0x9a, + 0x23, 0x7f, 0x7a, 0xe8, 0x4e, 0xa3, 0x4a, 0xf9, + 0xf6, 0x1c, 0x6b, 0x8f, 0x90, 0x15, 0x08, 0x64, + 0x20, 0x32, 0xb5, 0xf5, 0xb1, 0xad, 0xd7, 0x08, + 0xe4, 0x7c, 0x7e, 0x7a, 0x5e, 0xfe, 0x47, 0x8a, + 0xef, 0xae, 0x5e, 0x4f, 0x7a, 0xbe, 0x65, 0xd7, + 0x19, 0x93, 0xf0, 0xe5, 0xec, 0x90, 0x80, 0xac, + 0x76, 0x1f, 0xfd, 0x5e, 0x4d, 0x68, 0x2b, 0x31, + 0x91, 0x14, 0xb1, 0x66, 0x03, 0x28, 0xd8, 0x37, + 0x7d, 0xc7, 0x41, 0xd7, 0xbd, 0x69, 0x3f, 0xfa, + 0xfa, 0xf6, 0xeb, 0xf8, 0x57, 0x77, 0x98, 0xe8, + 0xd6, 0x77, 0x37, 0x23, 0x7e, 0x5c, 0xab, 0xb4, + 0x9b, 0x3e, 0xd3, 0xf4, 0x1a, 0x56, 0x88, 0xd2, + 0x18, 0xd0, 0x49, 0xc9, 0x3a, 0x69, 0x63, 0x23, + 0x5e, 0xdd, 0x4d, 0x8f, 0x7a, 0x05, 0xbc, 0xc6, + 0xd6, 0xcc, 0x6d, 0xc4, 0x6d, 0x8c, 0x5f, 0x5f, + 0x40, 0x2b, 0x23, 0x3e, 0x4b, 0xe4, 0x7e, 0xa9, + 0x5d, 0x81, 0x8c, 0x29, 0x20, 0x01, 0xa0, 0x3d, + 0xab, 0x59, 0xcd, 0xc8, 0x8b, 0x99, 0x32, 0xb1, + 0xb2, 0xb6, 0xe5, 0xb8, 0xed, 0x58, 0xde, 0x4d, + 0xe3, 0xc5, 0x81, 0xe1, 0x46, 0xde, 0xf2, 0x91, + 0xb8, 0xfa, 0x56, 0x6d, 0x9e, 0x65, 0xed, 0xf4, + 0xa3, 0xf8, 0x8f, 0xf2, 0x0b, 0xb0, 0xb0, 0x17, + 0x2c, 0x1f, 0xcd, 0x08, 0xc0, 0xdb, 0x69, 0xaa, + 0x52, 0xa7, 0xc7, 0x2b, 0x25, 0xf7, 0x6d, 0x24, + 0x5c, 0x55, 0xee, 0x39, 0x7e, 0x36, 0x9b, 0x21, + 0x85, 0xbe, 0x14, 0x3a, 0x9d, 0x35, 0x35, 0x5f, + 0x0e, 0x11, 0x93, 0x95, 0xef, 0xfb, 0x45, 0xdd, + 0xcd, 0x73, 0x6d, 0x57, 0xbe, 0x9a, 0x57, 0x8a, + 0xc4, 0x10, 0x41, 0xb5, 0xb5, 0x14, 0xd2, 0x46, + 0xc6, 0xcb, 0x82, 0x51, 0x1c, 0x7f, 0x19, 0x87, + 0x55, 0x3e, 0x45, 0x2f, 0x8b, 0x13, 0x22, 0x65, + 0x2f, 0x12, 0x16, 0x50, 0x6d, 0xa5, 0x15, 0x5c, + 0x4e, 0x58, 0xc9, 0x09, 0x87, 0x25, 0x03, 0xa9, + 0x1a, 0x69, 0xad, 0xe8, 0xe3, 0xd0, 0xcf, 0x8d, + 0x91, 0x04, 0x76, 0x12, 0x49, 0x62, 0x80, 0x9e, + 0xa0, 0x76, 0xa5, 0xc6, 0xea, 0x6c, 0x74, 0x20, + 0xd8, 0x8a, 0x03, 0xba, 0x36, 0xe4, 0x25, 0x58, + 0x74, 0x23, 0xf7, 0xd1, 0x26, 0x19, 0x9f, 0xed, + 0x70, 0x93, 0x10, 0xb0, 0xf9, 0x5c, 0xef, 0x90, + 0x0e, 0xde, 0x94, 0x61, 0x4c, 0xf1, 0x71, 0xd9, + 0x32, 0xee, 0x3b, 0x5a, 0xd1, 0xa0, 0xf5, 0x3d, + 0x6a, 0x82, 0x4b, 0xb6, 0x51, 0x24, 0x9e, 0xf1, + 0x7b, 0x90, 0x7a, 0x9a, 0x65, 0x3e, 0x4f, 0x1f, + 0x95, 0x84, 0x62, 0x8c, 0xfc, 0x05, 0x49, 0x7d, + 0xbe, 0x4d, 0x05, 0x4c, 0x0c, 0x54, 0x99, 0x9a, + 0x49, 0x4d, 0xa1, 0x84, 0x6e, 0x73, 0xde, 0xbb, + 0xce, 0xc7, 0xc5, 0xf8, 0x23, 0xca, 0xc4, 0xb8, + 0x47, 0x3b, 0x48, 0x35, 0xd4, 0x41, 0xbf, 0xe1, + 0xe4, 0x08, 0x09, 0x67, 0x70, 0x1a, 0xde, 0x28, + 0xcc, 0x1f, 0xa7, 0xe3, 0xe0, 0x80, 0xfd, 0xec, + 0x4c, 0x8e, 0x3b, 0x8a, 0x26, 0x25, 0x43, 0x63, + 0x81, 0x7d, 0xa6, 0xc3, 0xbd, 0xab, 0xcd, 0x29, + 0xba, 0x66, 0x49, 0xff, 0x00, 0x0d, 0x26, 0xf5, + 0x5b, 0x12, 0x12, 0x33, 0x6d, 0x4d, 0x50, 0xc2, + 0xc3, 0x93, 0x29, 0x8d, 0x8e, 0xc4, 0x41, 0x77, + 0x73, 0xd0, 0x50, 0xcb, 0x88, 0xb2, 0xa7, 0x81, + 0x48, 0x89, 0xca, 0x86, 0xea, 0x05, 0x49, 0x87, + 0x2e, 0x38, 0x94, 0x9c, 0xa0, 0x59, 0x4f, 0x56, + 0x1d, 0x75, 0xaf, 0x33, 0x70, 0xdf, 0x15, 0xd4, + 0x12, 0x1d, 0x1c, 0x5d, 0x18, 0x77, 0x15, 0x5b, + 0x4b, 0x79, 0xa1, 0x93, 0x6e, 0x5d, 0x60, 0x96, + 0x38, 0xe7, 0xc7, 0x98, 0x18, 0xd1, 0x42, 0x2c, + 0x7d, 0xc5, 0xab, 0xdc, 0xa0, 0xe6, 0x1c, 0x3c, + 0x78, 0xc1, 0x2a, 0x54, 0x1d, 0x35, 0xb9, 0x34, + 0xa4, 0x9b, 0x1f, 0xe3, 0x4c, 0x71, 0x39, 0x59, + 0xa1, 0x84, 0x43, 0xb4, 0x3e, 0xcf, 0xfc, 0x6c, + 0x45, 0xc8, 0xa1, 0x93, 0xb4, 0x95, 0x53, 0x32, + 0x34, 0x16, 0x3f, 0x0a, 0x2a, 0xd8, 0xf9, 0x15, + 0xbc, 0xe2, 0xe4, 0x5d, 0x90, 0x31, 0x01, 0x49, + 0x20, 0xf4, 0xaf, 0x9e, 0xf0, 0x91, 0x8c, 0x99, + 0x4b, 0x3c, 0x9b, 0x5c, 0x90, 0x7a, 0x75, 0xad, + 0xfe, 0x00, 0x61, 0x22, 0x0b, 0x9d, 0xa2, 0xc0, + 0x10, 0x2e, 0x2b, 0xae, 0xb7, 0x9d, 0xdd, 0xf1, + 0x29, 0x79, 0x97, 0x0f, 0x93, 0xec, 0xbb, 0x04, + 0xb6, 0xe0, 0x3a, 0x78, 0xe8, 0x7a, 0xd3, 0xbb, + 0xff, 0x00, 0xb7, 0xbf, 0xfa, 0x2f, 0x6f, 0xc2, + 0x92, 0x72, 0xd1, 0xfc, 0x19, 0x0c, 0xff, 0x00, + 0x78, 0x3e, 0xf0, 0x0f, 0x91, 0xda, 0x9d, 0x6e, + 0xff, 0x00, 0x6d, 0xbe, 0xdf, 0xd1, 0x7b, 0x7e, + 0x15, 0xa1, 0xe4, 0x25, 0xac, 0xf4, 0xa5, 0xcf, + 0x2b, 0xb5, 0x00, 0x56, 0x0f, 0x60, 0x47, 0x7d, + 0x6b, 0x42, 0x69, 0x1e, 0x51, 0x5c, 0x7e, 0x48, + 0xb8, 0x36, 0x2c, 0xc0, 0xb7, 0x9b, 0x1f, 0xe5, + 0x40, 0x87, 0xfe, 0xce, 0xbf, 0xee, 0x65, 0x1a, + 0xe8, 0x4f, 0xa5, 0x61, 0x73, 0x6e, 0xae, 0x4e, + 0xbd, 0x7a, 0x9d, 0x6b, 0xe8, 0xdf, 0xf6, 0x6c, + 0x78, 0xa6, 0x92, 0x52, 0xb6, 0x2c, 0x46, 0xe0, + 0x6f, 0xa1, 0xb8, 0xaf, 0x9d, 0xe6, 0xa3, 0x6f, + 0x60, 0xab, 0xdf, 0x5b, 0x6b, 0x59, 0xb6, 0x79, + 0x97, 0xb5, 0xd2, 0x9f, 0xe2, 0x3f, 0xc8, 0x76, + 0xbc, 0xac, 0x6f, 0x09, 0x83, 0x26, 0x31, 0xb1, + 0x85, 0x89, 0x5e, 0xba, 0x54, 0x1c, 0x70, 0xde, + 0x72, 0x12, 0x3f, 0xbd, 0xd0, 0x84, 0xf5, 0x15, + 0x49, 0x86, 0xd3, 0x63, 0xf4, 0xae, 0x52, 0x47, + 0x8d, 0xf7, 0x21, 0x20, 0x8e, 0x84, 0x57, 0x36, + 0xe3, 0x0d, 0x8f, 0x87, 0xc7, 0xb8, 0x94, 0x5a, + 0x59, 0xb4, 0x0b, 0xdc, 0x0a, 0x38, 0x79, 0xa5, + 0x87, 0xe5, 0x7d, 0xc4, 0x45, 0x1a, 0x16, 0x20, + 0x77, 0x3d, 0x2a, 0x8b, 0xcf, 0x24, 0xd2, 0x09, + 0x25, 0x62, 0xf6, 0x3a, 0xdc, 0xf6, 0xa6, 0x91, + 0x9c, 0x09, 0x31, 0x24, 0x8b, 0x19, 0xfe, 0x27, + 0x93, 0x53, 0xbb, 0xc0, 0xea, 0x28, 0x8f, 0x65, + 0xb0, 0x42, 0xd9, 0x79, 0x3b, 0x47, 0xf5, 0x12, + 0xcc, 0x4f, 0x61, 0x56, 0x72, 0xb0, 0xb1, 0x97, + 0x1d, 0xa5, 0xc6, 0x93, 0x7f, 0xc4, 0x6c, 0xf5, + 0xe6, 0x00, 0xf8, 0xf1, 0xf2, 0xdd, 0x45, 0xdd, + 0x56, 0xc2, 0xde, 0xb5, 0xe4, 0x60, 0xc7, 0xc5, + 0x48, 0xe7, 0xee, 0x9d, 0x82, 0xa8, 0xfa, 0x50, + 0x50, 0x37, 0xaf, 0x0d, 0xbf, 0x0a, 0x6d, 0xc5, + 0x4e, 0x9f, 0xa7, 0x99, 0x24, 0x89, 0x19, 0x62, + 0x52, 0xdb, 0xc8, 0x04, 0xdf, 0xb5, 0x2d, 0x86, + 0x19, 0x32, 0x66, 0x11, 0xc6, 0x3d, 0xcd, 0xa8, + 0xf0, 0x3c, 0xd0, 0x77, 0x89, 0x9f, 0x3e, 0x25, + 0xfe, 0x3d, 0x43, 0x75, 0x43, 0x5e, 0xac, 0xcb, + 0x93, 0x95, 0xbb, 0x2d, 0xc8, 0x56, 0xd0, 0xb0, + 0xe8, 0x28, 0xcc, 0xc0, 0x9b, 0x16, 0xc5, 0xc8, + 0x65, 0x3d, 0x18, 0x79, 0xaa, 0xda, 0x0e, 0xff, + 0x00, 0x85, 0x03, 0x9e, 0x47, 0x18, 0x2f, 0x1f, + 0x12, 0xe3, 0xb2, 0xc9, 0x14, 0x57, 0x2c, 0x41, + 0xb1, 0x24, 0xd5, 0x77, 0x6f, 0x8b, 0x88, 0x8d, + 0x17, 0xac, 0xee, 0x4b, 0x5b, 0xfd, 0x3d, 0xaa, + 0x86, 0xf7, 0x03, 0x6e, 0xe3, 0x63, 0xdb, 0xb5, + 0x5d, 0xc5, 0xcf, 0x81, 0x20, 0x10, 0x64, 0xc5, + 0xf2, 0x2a, 0x9d, 0xd1, 0x90, 0x7b, 0xd0, 0x75, + 0xc8, 0xfe, 0x5e, 0x2e, 0x24, 0x4d, 0xf7, 0x05, + 0x2c, 0xdf, 0x43, 0xd2, 0xa5, 0xc8, 0x4c, 0x06, + 0xe2, 0x86, 0x44, 0x71, 0x6c, 0x91, 0x98, 0x28, + 0x3f, 0x4e, 0xb5, 0x56, 0xd3, 0x72, 0x79, 0x6d, + 0xb6, 0xca, 0x6d, 0xa0, 0x3d, 0x2c, 0x3b, 0x0a, + 0x9f, 0x96, 0x89, 0xf1, 0xf1, 0xf1, 0xf1, 0x88, + 0xb2, 0xc6, 0xbb, 0x98, 0xf6, 0x24, 0xd0, 0xca, + 0x9c, 0x18, 0xd3, 0xe4, 0x31, 0x58, 0x53, 0x71, + 0xb7, 0xf6, 0xbd, 0x0d, 0x1c, 0x90, 0xc8, 0x52, + 0x45, 0x2a, 0xc3, 0xa8, 0xab, 0xa6, 0x57, 0xc2, + 0xe3, 0xa2, 0x10, 0x9d, 0xb2, 0xe4, 0x1d, 0xcc, + 0xc3, 0x43, 0x6e, 0xd5, 0xef, 0x24, 0x37, 0xc9, + 0x8c, 0x64, 0xd2, 0x47, 0x8d, 0x4c, 0x86, 0x87, + 0xa5, 0x9e, 0x2f, 0xee, 0x1d, 0x7f, 0x03, 0x5f, + 0x42, 0xe0, 0xd9, 0xd9, 0x10, 0x12, 0x48, 0x0c, + 0x07, 0x5a, 0xc5, 0xe2, 0x71, 0xf1, 0x43, 0x1a, + 0x4d, 0x1c, 0x81, 0x95, 0x88, 0x02, 0xb6, 0xdc, + 0x0a, 0x5c, 0xc6, 0x08, 0x1a, 0xb0, 0x3a, 0xff, + 0x00, 0x75, 0x76, 0xd6, 0xf3, 0xbb, 0xb3, 0x18, + 0x95, 0x9e, 0x53, 0x29, 0x5f, 0x25, 0xfd, 0xdb, + 0x44, 0x63, 0x40, 0x4f, 0x52, 0x29, 0xdd, 0xff, + 0x00, 0xda, 0x5f, 0xff, 0x00, 0xce, 0xff, 0x00, + 0xfc, 0x69, 0x1e, 0x42, 0xa4, 0x99, 0xf2, 0xc6, + 0x00, 0x1b, 0xdc, 0x16, 0x72, 0x2f, 0xa7, 0x4b, + 0x53, 0xfd, 0xa3, 0xe3, 0xdb, 0xda, 0xd6, 0xfd, + 0xd5, 0xdd, 0xe4, 0xba, 0xa5, 0x1c, 0xc4, 0x7f, + 0x98, 0x92, 0x00, 0x2f, 0x6e, 0xa6, 0xc6, 0x9b, + 0x9a, 0x59, 0xcc, 0xa8, 0xb4, 0x5b, 0xbe, 0xdb, + 0x90, 0x7f, 0x1a, 0x04, 0xfc, 0xaa, 0x32, 0xe2, + 0x2c, 0xc4, 0x01, 0xbe, 0x2d, 0xa3, 0xd4, 0x82, + 0x45, 0xeb, 0x17, 0x0c, 0x8e, 0x99, 0x2c, 0x9e, + 0xd3, 0x1e, 0xac, 0xf7, 0x5f, 0x02, 0xb7, 0x19, + 0xc4, 0x64, 0xf1, 0x2b, 0xa9, 0xdd, 0x03, 0x10, + 0xc3, 0xbd, 0x9b, 0xa1, 0xfd, 0xd5, 0x94, 0xcb, + 0xc3, 0x0b, 0x1c, 0xcd, 0x03, 0x97, 0x91, 0xd6, + 0xc1, 0x7a, 0x75, 0xae, 0x1b, 0x63, 0x97, 0xab, + 0xd0, 0xb6, 0x69, 0x11, 0xf9, 0xc3, 0x27, 0x28, + 0x6c, 0x8c, 0xa6, 0xd8, 0x35, 0x77, 0x3b, 0x40, + 0xe9, 0x52, 0x64, 0x71, 0xb2, 0x43, 0x09, 0x90, + 0x30, 0x6d, 0xbf, 0x78, 0x1d, 0xaa, 0x7c, 0x14, + 0xf8, 0xa5, 0x9a, 0x56, 0xbd, 0xe1, 0x56, 0xd3, + 0xd7, 0xa5, 0x47, 0x8b, 0xbb, 0xf4, 0x99, 0x73, + 0x39, 0xd1, 0x86, 0xdf, 0xa9, 0x35, 0xc5, 0xe9, + 0xc7, 0x82, 0xee, 0xba, 0x01, 0xd2, 0x86, 0x37, + 0x34, 0xc7, 0x8a, 0x8b, 0x0a, 0x5d, 0xd1, 0x4e, + 0x84, 0xbe, 0xad, 0xb8, 0x78, 0x15, 0x42, 0x40, + 0xad, 0x33, 0x08, 0xc6, 0x97, 0xb2, 0x8a, 0x23, + 0x09, 0x31, 0x32, 0xdf, 0x15, 0xcb, 0x28, 0x0c, + 0x1b, 0xee, 0x53, 0xde, 0xba, 0xc8, 0xcc, 0x7c, + 0xc9, 0x50, 0x48, 0x44, 0x71, 0x83, 0x60, 0xa3, + 0xa0, 0xf5, 0xa8, 0xe6, 0xc5, 0xc8, 0x85, 0x43, + 0x3a, 0x15, 0x53, 0xdc, 0xd4, 0x17, 0xb1, 0xfd, + 0xf4, 0x0e, 0x5f, 0x08, 0xc1, 0xc6, 0xc8, 0xb8, + 0xec, 0x25, 0xf9, 0x18, 0x16, 0x23, 0xfc, 0xa2, + 0xab, 0x61, 0x7e, 0x46, 0x0e, 0x4e, 0x4f, 0xf5, + 0x1b, 0x46, 0x87, 0xc5, 0xea, 0x9a, 0x4f, 0x32, + 0x02, 0xb1, 0xb9, 0x17, 0xea, 0x3b, 0x55, 0x8c, + 0x1c, 0x9c, 0x75, 0x8e, 0x48, 0x32, 0x81, 0xf8, + 0xdf, 0x5b, 0x8d, 0x75, 0x14, 0x46, 0x79, 0x48, + 0xfb, 0x87, 0x0e, 0x3e, 0x43, 0x72, 0xf2, 0x7b, + 0x6f, 0xd7, 0x4e, 0xb5, 0xde, 0x3e, 0x36, 0x04, + 0xb8, 0x0f, 0x29, 0xdd, 0xf2, 0xc4, 0xb7, 0x6f, + 0x17, 0x3d, 0x05, 0x41, 0x95, 0x30, 0xcc, 0x78, + 0xf1, 0xf1, 0xd4, 0x88, 0xd3, 0x44, 0x1d, 0xc9, + 0xf3, 0x53, 0xcf, 0x0c, 0x98, 0x7c, 0x5f, 0xc6, + 0xea, 0x56, 0x49, 0xa4, 0xf7, 0x7d, 0x07, 0x4a, + 0x24, 0xb5, 0x11, 0x9d, 0xb6, 0xa0, 0x2c, 0x6f, + 0xa0, 0x15, 0xec, 0x91, 0xbc, 0x6c, 0x44, 0x8a, + 0x55, 0xbb, 0x82, 0x2d, 0x57, 0xf0, 0xed, 0x8b, + 0x85, 0x2e, 0x65, 0xaf, 0x23, 0x1f, 0x8e, 0x2f, + 0x42, 0x75, 0x26, 0x8c, 0xf7, 0x33, 0xe0, 0xe3, + 0x4f, 0x2e, 0xb2, 0xb1, 0x23, 0x77, 0x90, 0x28, + 0x17, 0xab, 0x32, 0xb0, 0x65, 0x24, 0x11, 0xd0, + 0x8d, 0x2a, 0x79, 0x33, 0xf2, 0x66, 0x83, 0xe1, + 0x91, 0xb7, 0x25, 0xfb, 0xf5, 0xfd, 0xb5, 0x3b, + 0xf1, 0x4e, 0x98, 0x67, 0x29, 0x65, 0x52, 0xa0, + 0x02, 0x40, 0x3a, 0xeb, 0xda, 0xa8, 0x74, 0xa2, + 0x0d, 0xe2, 0x6c, 0x2c, 0xac, 0x78, 0x1f, 0x21, + 0xf6, 0x3e, 0x36, 0x85, 0x7f, 0xcd, 0x50, 0x4c, + 0xf2, 0x66, 0x64, 0xb3, 0xa0, 0x3b, 0x46, 0x8b, + 0xde, 0xc3, 0xa5, 0x50, 0xef, 0xd2, 0xfd, 0xaa, + 0xff, 0x00, 0x1b, 0x91, 0x36, 0x3c, 0xbb, 0xe2, + 0x3d, 0x7e, 0xe1, 0x6b, 0x83, 0x52, 0x4f, 0x86, + 0x8f, 0x1a, 0x30, 0x9f, 0xa7, 0xc6, 0x04, 0x7b, + 0x14, 0x6e, 0x16, 0xee, 0x7b, 0xd6, 0xf3, 0x82, + 0x88, 0x22, 0x46, 0x2e, 0x37, 0x10, 0x58, 0xfa, + 0x0a, 0xc6, 0x71, 0xd3, 0x0c, 0xa2, 0xae, 0x63, + 0x2b, 0x2d, 0xfd, 0xc7, 0xb1, 0xad, 0xc4, 0x12, + 0xfe, 0x97, 0x11, 0xa6, 0x00, 0x96, 0xda, 0x15, + 0x17, 0xd6, 0xbb, 0x6b, 0x87, 0x97, 0xdd, 0xb7, + 0x95, 0x78, 0x63, 0x69, 0x79, 0x0f, 0x84, 0x1b, + 0xa8, 0x20, 0xb1, 0xb6, 0xba, 0x1b, 0x9f, 0xe1, + 0x4f, 0xe9, 0x37, 0x15, 0x03, 0xcb, 0x90, 0x32, + 0x18, 0xfd, 0xb7, 0xb8, 0x1a, 0x75, 0xe9, 0x4e, + 0xab, 0xb3, 0xcd, 0x15, 0x5b, 0x3a, 0x04, 0x9e, + 0x07, 0x56, 0x00, 0x90, 0x09, 0x52, 0x7b, 0x11, + 0x56, 0x6b, 0xc3, 0xd0, 0xd0, 0x66, 0xb1, 0xa3, + 0x2e, 0x65, 0xc7, 0xea, 0x26, 0x8c, 0xec, 0xf3, + 0x74, 0xf7, 0x2d, 0xeb, 0x23, 0xcb, 0xc2, 0xe8, + 0xe4, 0xa5, 0xd4, 0xfa, 0x1a, 0xd8, 0xef, 0x18, + 0xf9, 0x42, 0x4b, 0x6d, 0x31, 0x39, 0x27, 0xe8, + 0x4f, 0x4a, 0x51, 0xff, 0x00, 0x62, 0xc5, 0x89, + 0xa4, 0x67, 0x88, 0x86, 0x89, 0xfd, 0xe9, 0xf8, + 0xf5, 0x15, 0xcf, 0x65, 0x73, 0x0d, 0x7d, 0x2d, + 0x9f, 0x37, 0x9a, 0xfe, 0xf2, 0xc2, 0x47, 0x3a, + 0xe3, 0x4e, 0xe5, 0x94, 0xb2, 0x38, 0x21, 0xef, + 0xea, 0x6a, 0x2c, 0xbc, 0x98, 0xa4, 0x41, 0x8d, + 0x8c, 0xa5, 0x22, 0x06, 0xe6, 0xfd, 0xd8, 0xd5, + 0x8e, 0x43, 0x1c, 0xa4, 0x97, 0x20, 0x0a, 0x5a, + 0xcb, 0xae, 0x9a, 0x5b, 0xa5, 0x66, 0x98, 0x7b, + 0x75, 0x9c, 0xc4, 0x18, 0x41, 0x89, 0x36, 0x16, + 0x34, 0xf3, 0x48, 0xbe, 0xf2, 0xbb, 0x52, 0xda, + 0xf5, 0xaa, 0xfc, 0x62, 0x28, 0x79, 0x67, 0x93, + 0xa4, 0x2b, 0x7d, 0x7c, 0xd7, 0x31, 0x72, 0x39, + 0x50, 0x8d, 0xbb, 0xb7, 0x21, 0x16, 0xda, 0x75, + 0xfe, 0x35, 0xd6, 0x04, 0xb1, 0xb1, 0x9a, 0x19, + 0x58, 0x20, 0x98, 0x68, 0x4f, 0x4b, 0xd1, 0x74, + 0x8b, 0x3c, 0xb9, 0x18, 0x39, 0x2d, 0x29, 0xdc, + 0x05, 0x8a, 0x9f, 0x15, 0x16, 0x17, 0x1a, 0x99, + 0x71, 0x16, 0xf9, 0x82, 0x30, 0x04, 0xec, 0xf4, + 0x15, 0xd6, 0x5b, 0xc3, 0x06, 0x30, 0xc3, 0x81, + 0x84, 0x8c, 0x4e, 0xe7, 0x23, 0xbd, 0x18, 0x68, + 0xd8, 0xf8, 0x99, 0x39, 0x04, 0x59, 0x88, 0xd8, + 0x01, 0xd3, 0xad, 0x10, 0x5c, 0xc0, 0x02, 0x47, + 0x5b, 0x1b, 0x5e, 0xbc, 0x20, 0x8a, 0xbb, 0xc7, + 0x40, 0x8c, 0xcf, 0x3c, 0xa2, 0xe9, 0x02, 0xee, + 0x20, 0xf7, 0x35, 0x2e, 0x54, 0x91, 0x65, 0xe0, + 0xb6, 0x40, 0x8c, 0x46, 0xf1, 0xb8, 0x1a, 0x77, + 0x06, 0x88, 0xc4, 0x17, 0x2b, 0x32, 0x90, 0xca, + 0x6c, 0xc3, 0xa1, 0xab, 0x87, 0x95, 0xc8, 0x7c, + 0x76, 0x82, 0x60, 0x24, 0x0d, 0xa6, 0xe3, 0xd4, + 0x57, 0x11, 0xf1, 0xb9, 0x72, 0x42, 0x67, 0x44, + 0xbc, 0x43, 0x5d, 0xdf, 0x4a, 0xaa, 0x47, 0xf1, + 0xa2, 0x0c, 0xf1, 0x52, 0x2c, 0xbc, 0x0f, 0xd3, + 0x99, 0x56, 0x37, 0x8d, 0xf7, 0x0b, 0xf7, 0x1d, + 0xea, 0x2e, 0x46, 0x58, 0xdd, 0xd3, 0x1e, 0x1d, + 0x52, 0x05, 0xda, 0x08, 0xee, 0x6a, 0x90, 0x24, + 0x74, 0xa9, 0x71, 0xb2, 0x0e, 0x34, 0xc2, 0x45, + 0x50, 0xc7, 0xb8, 0x34, 0x16, 0xe5, 0x26, 0x0e, + 0x26, 0x38, 0xb5, 0xdf, 0x3b, 0x96, 0x23, 0xfd, + 0x22, 0x8c, 0x28, 0xa0, 0x83, 0x15, 0xb3, 0x72, + 0x10, 0x38, 0xdd, 0xb6, 0x25, 0xf2, 0x7b, 0xd7, + 0xb9, 0xd9, 0xf8, 0x99, 0x98, 0xe3, 0xd8, 0x52, + 0x64, 0xd1, 0x40, 0xe9, 0x6a, 0xed, 0xe0, 0x97, + 0x2b, 0x03, 0x11, 0x60, 0x1b, 0x95, 0x4b, 0x07, + 0xf4, 0x27, 0xb9, 0xa2, 0x51, 0x72, 0x30, 0xc4, + 0x4c, 0x33, 0xc0, 0xa5, 0x04, 0xeb, 0x7d, 0x9e, + 0xa0, 0xd4, 0xf8, 0xbc, 0x7c, 0xe9, 0x66, 0x92, + 0x22, 0xa3, 0xc9, 0xef, 0x51, 0xf2, 0x2c, 0xbf, + 0x2c, 0x50, 0x21, 0xd2, 0x05, 0x0b, 0x71, 0xfe, + 0x6e, 0xb4, 0xff, 0x00, 0x18, 0x4c, 0xf8, 0x30, + 0x24, 0xa4, 0x3b, 0x48, 0x49, 0xd7, 0xae, 0xda, + 0xb4, 0x29, 0xb2, 0xd1, 0x11, 0x26, 0x7c, 0x0e, + 0x2e, 0x83, 0x4e, 0xbd, 0xaf, 0x5a, 0xec, 0xc5, + 0x48, 0x38, 0xf8, 0xd4, 0xe8, 0xec, 0x77, 0x6a, + 0x75, 0xa5, 0xdc, 0x0f, 0x1e, 0xa5, 0x50, 0xb0, + 0x16, 0x3d, 0xaa, 0xde, 0x72, 0x7e, 0xab, 0x38, + 0xc6, 0x3d, 0xc4, 0x15, 0x45, 0xb7, 0x65, 0x07, + 0x5a, 0xd1, 0x48, 0xe1, 0xe2, 0x76, 0xaf, 0xf5, + 0x65, 0xfe, 0x17, 0x58, 0x5c, 0xdc, 0x10, 0x5b, + 0xdb, 0x6d, 0x6d, 0xa5, 0x31, 0xa8, 0x71, 0xb1, + 0xd3, 0x1e, 0x21, 0x12, 0x74, 0x15, 0x35, 0x5d, + 0x98, 0x51, 0x45, 0x14, 0x0a, 0x39, 0x9c, 0x60, + 0xb1, 0x1c, 0x85, 0x6b, 0x6a, 0x03, 0x0e, 0xda, + 0xf7, 0xaa, 0x2b, 0x8e, 0xb9, 0x58, 0x6c, 0x8d, + 0xf7, 0xc1, 0xef, 0x20, 0x01, 0xaa, 0x9e, 0xb5, + 0xa0, 0xc9, 0x88, 0x4d, 0x03, 0xc4, 0x40, 0x3b, + 0x81, 0x16, 0x35, 0x9f, 0xc6, 0x33, 0x71, 0xb3, + 0x15, 0x74, 0xb0, 0xbf, 0xbc, 0x1e, 0xe0, 0xff, + 0x00, 0x2a, 0x4c, 0x65, 0x35, 0xb4, 0xd6, 0x62, + 0xd1, 0xe9, 0x95, 0xe5, 0x61, 0x12, 0xa4, 0xca, + 0xc8, 0x00, 0x41, 0x74, 0x21, 0x7c, 0x56, 0x64, + 0x71, 0x99, 0x33, 0x82, 0x62, 0x00, 0xd8, 0xdb, + 0xc5, 0xfc, 0xd7, 0xd0, 0x79, 0x6c, 0x68, 0xce, + 0x3c, 0x92, 0xc3, 0x7d, 0xb3, 0x1f, 0x6f, 0xa0, + 0xee, 0x3f, 0x0a, 0xca, 0x26, 0x3b, 0x43, 0x2c, + 0x92, 0x0d, 0xc1, 0x63, 0x53, 0xaf, 0x6b, 0xd6, + 0x5b, 0xd7, 0x0f, 0x77, 0xab, 0xba, 0x2f, 0x58, + 0x98, 0xf6, 0xcc, 0xc8, 0x8c, 0x8e, 0xca, 0x7a, + 0x83, 0x63, 0x51, 0x90, 0x45, 0xaa, 0xfc, 0x58, + 0xcd, 0x93, 0x92, 0x55, 0x89, 0x0a, 0x49, 0x67, + 0x3e, 0x9d, 0x6b, 0xb9, 0xf1, 0xf0, 0xe5, 0xc7, + 0x91, 0xb1, 0xae, 0xad, 0x09, 0xb1, 0xbf, 0x7a, + 0xa3, 0x5e, 0x0b, 0x51, 0x8a, 0xb0, 0x61, 0xd4, + 0x1b, 0xd3, 0x13, 0xcb, 0x24, 0xf8, 0xe6, 0x1c, + 0x98, 0x81, 0xef, 0x75, 0xd2, 0xe6, 0x97, 0x88, + 0xe4, 0x6d, 0x55, 0x49, 0x15, 0xc1, 0x3f, 0xdd, + 0x45, 0x70, 0x61, 0x83, 0x1b, 0xcd, 0x85, 0x91, + 0x04, 0x22, 0xf2, 0x31, 0x04, 0x2f, 0x72, 0x2b, + 0xcc, 0xc5, 0xfd, 0x2e, 0x0c, 0x78, 0x84, 0xde, + 0x46, 0x3b, 0xe4, 0x03, 0xb7, 0x81, 0x54, 0xa3, + 0x92, 0x48, 0x9b, 0x74, 0x6c, 0x51, 0xbc, 0x8a, + 0xf5, 0x25, 0x1f, 0x30, 0x92, 0x6b, 0xb8, 0x06, + 0xec, 0x0d, 0x05, 0xfc, 0x29, 0x9e, 0x1e, 0x37, + 0x22, 0x42, 0xc7, 0x6b, 0x5a, 0x34, 0x5b, 0xe9, + 0x73, 0x55, 0xb0, 0x31, 0x52, 0x72, 0xd2, 0x4c, + 0x76, 0xc3, 0x10, 0xbb, 0x9f, 0xe5, 0x57, 0x32, + 0x24, 0xc0, 0xc8, 0xc1, 0xd9, 0x03, 0x7c, 0x3b, + 0x09, 0x60, 0x9e, 0x6a, 0x18, 0xf7, 0x0e, 0x21, + 0xf6, 0x0b, 0xef, 0x90, 0x5e, 0xdf, 0xce, 0x89, + 0x71, 0x9f, 0x8d, 0x8e, 0x21, 0x8f, 0x27, 0x14, + 0x9f, 0x8d, 0xce, 0xdb, 0x1e, 0xa2, 0xa9, 0xed, + 0x70, 0x2f, 0xb4, 0xdb, 0xcd, 0xaa, 0xfe, 0x62, + 0xfc, 0x3c, 0x7e, 0x3c, 0x07, 0xef, 0x62, 0x64, + 0x6f, 0xc6, 0xa7, 0x5c, 0xa6, 0x6e, 0x1a, 0x43, + 0x22, 0x2f, 0x50, 0x88, 0x7b, 0xd1, 0x13, 0x04, + 0xe0, 0xff, 0x00, 0x8d, 0x58, 0x83, 0x2b, 0x22, + 0x15, 0x29, 0x13, 0x94, 0x56, 0xd4, 0x81, 0x5e, + 0xe1, 0x60, 0xc9, 0x96, 0xe4, 0x03, 0xb5, 0x53, + 0xee, 0x7a, 0x9a, 0x6e, 0x39, 0xf1, 0xe4, 0x0a, + 0x4d, 0xd5, 0xb5, 0x0c, 0x2a, 0x55, 0xc2, 0x7e, + 0x2d, 0x20, 0x33, 0x13, 0x93, 0xb8, 0xab, 0x69, + 0x70, 0x2f, 0xad, 0x6c, 0xf1, 0x70, 0xe3, 0x90, + 0xc5, 0x24, 0x4d, 0x74, 0x50, 0x14, 0x2d, 0xb5, + 0xac, 0xe7, 0x13, 0x82, 0xcd, 0x6b, 0x86, 0xd7, + 0x4d, 0x6b, 0x77, 0xc1, 0xf1, 0xa7, 0x72, 0x0b, + 0x30, 0x1d, 0x49, 0xed, 0x61, 0x5d, 0x29, 0x5c, + 0xcb, 0x1f, 0x67, 0x74, 0x44, 0x49, 0xc6, 0x38, + 0x8f, 0x13, 0x0f, 0xe4, 0x27, 0xdc, 0x16, 0xca, + 0x3a, 0x1d, 0x6a, 0x0e, 0x1c, 0x09, 0x72, 0xde, + 0x62, 0x09, 0xb0, 0xd1, 0x89, 0xef, 0x7a, 0xaf, + 0xc8, 0x48, 0xaf, 0x3b, 0x2c, 0x69, 0xb9, 0x81, + 0xd8, 0x87, 0xb0, 0xfe, 0x9e, 0x94, 0xef, 0x0b, + 0x18, 0x63, 0x40, 0xb1, 0xf5, 0x60, 0x3d, 0xc7, + 0xc9, 0xad, 0x11, 0x18, 0x78, 0xf6, 0xb6, 0x67, + 0x2b, 0x14, 0x51, 0x45, 0x10, 0x28, 0xa2, 0x8a, + 0x02, 0x97, 0x73, 0x10, 0x07, 0xc7, 0xf9, 0x15, + 0x77, 0x48, 0x9f, 0x6d, 0x31, 0xae, 0x5d, 0x03, + 0xa1, 0x53, 0xd0, 0xd0, 0x67, 0x70, 0xe2, 0x49, + 0x90, 0xe2, 0xca, 0xc0, 0x96, 0xd4, 0x1b, 0xf4, + 0x7b, 0x7f, 0x03, 0x49, 0xf9, 0x6c, 0x18, 0xd5, + 0x24, 0x82, 0x44, 0xf8, 0xdb, 0xa3, 0x11, 0xe9, + 0x4f, 0xb3, 0xf8, 0xe9, 0x71, 0xaf, 0x36, 0x3b, + 0x7b, 0x06, 0xbe, 0xaa, 0x7e, 0xb7, 0xae, 0x26, + 0x68, 0x39, 0x3c, 0x72, 0x1c, 0x08, 0xf2, 0xd0, + 0x5b, 0x71, 0xd4, 0x1f, 0xa9, 0xaa, 0x5e, 0x9f, + 0x50, 0xd1, 0xd6, 0xdf, 0x3a, 0xed, 0xff, 0x00, + 0x99, 0x7c, 0xe9, 0x71, 0x8c, 0x69, 0x94, 0x15, + 0x46, 0xf0, 0xb6, 0x52, 0x35, 0xd2, 0xa8, 0x7c, + 0x7f, 0xa7, 0xe3, 0xa4, 0x67, 0x1b, 0x5e, 0x73, + 0x65, 0x07, 0xc0, 0xad, 0x57, 0x21, 0xc7, 0xcd, + 0x8f, 0x21, 0x64, 0x50, 0xae, 0xba, 0x10, 0x47, + 0xf1, 0xac, 0xe7, 0x20, 0x92, 0xcf, 0x28, 0xf9, + 0x98, 0x05, 0xe9, 0x61, 0xa0, 0x15, 0x9a, 0xd5, + 0x98, 0x7b, 0x9a, 0xb6, 0xc5, 0xa2, 0x11, 0x71, + 0x19, 0x12, 0x45, 0x1c, 0xc0, 0xd8, 0x47, 0x1a, + 0x96, 0xd4, 0x77, 0xa5, 0xd0, 0xc0, 0xf9, 0x53, + 0xec, 0x4f, 0xea, 0x24, 0x9f, 0xa5, 0x3a, 0x6c, + 0x28, 0xd7, 0x06, 0x58, 0xf1, 0x65, 0x0e, 0xcf, + 0x62, 0x6f, 0xe0, 0x55, 0x0c, 0x2f, 0xc9, 0xc5, + 0xc9, 0x9a, 0xd6, 0x6b, 0x05, 0x5f, 0x4a, 0xab, + 0xb6, 0x10, 0xe5, 0xf1, 0xdf, 0x04, 0x5f, 0x2a, + 0x38, 0x91, 0x2f, 0x66, 0x23, 0xcd, 0x52, 0xb8, + 0xf3, 0xf8, 0x53, 0x15, 0x1b, 0x38, 0x99, 0x19, + 0x8d, 0x8c, 0x8f, 0xed, 0x1f, 0x4a, 0x93, 0x8f, + 0x5c, 0x29, 0x31, 0x65, 0xf9, 0x62, 0xf7, 0xc4, + 0x85, 0x8b, 0xff, 0x00, 0x0a, 0x94, 0x60, 0xaa, + 0xe3, 0xe9, 0x7a, 0xb3, 0x87, 0x9f, 0x36, 0x2d, + 0xc2, 0x58, 0xa9, 0xea, 0x0f, 0x4a, 0x85, 0x22, + 0x79, 0x5c, 0x22, 0x0b, 0xb3, 0x1d, 0x05, 0x49, + 0x91, 0x89, 0x3e, 0x39, 0x02, 0x54, 0xdb, 0xbb, + 0xa5, 0x0c, 0x3a, 0x12, 0x0c, 0xcc, 0xa0, 0xd9, + 0x32, 0x6c, 0x0d, 0xa6, 0xee, 0xc2, 0xaf, 0xf2, + 0x18, 0x9b, 0x38, 0xf8, 0x96, 0x16, 0x12, 0x43, + 0x1d, 0xd9, 0xdc, 0x1e, 0xac, 0x7a, 0x69, 0x4a, + 0x42, 0x9e, 0xc6, 0xac, 0x46, 0xb2, 0x15, 0xdb, + 0xbb, 0x43, 0xd4, 0x7d, 0x28, 0xac, 0xf0, 0xb6, + 0xa8, 0x63, 0xe2, 0x63, 0x0b, 0xa3, 0x64, 0x39, + 0xb9, 0x1e, 0x05, 0x34, 0x18, 0x44, 0xe3, 0x62, + 0x23, 0x0d, 0xcd, 0x6d, 0xcd, 0xae, 0xb6, 0x3d, + 0x2b, 0xce, 0x2a, 0x28, 0xcc, 0x2b, 0x04, 0xf1, + 0x89, 0x02, 0x35, 0xd2, 0xd5, 0xa6, 0xe3, 0xf8, + 0xe6, 0xc8, 0x98, 0x35, 0x80, 0x36, 0xd1, 0x6d, + 0xd8, 0x74, 0xab, 0xd6, 0xb9, 0x66, 0xdf, 0xba, + 0x2b, 0x0b, 0x1c, 0x5f, 0x17, 0x01, 0x81, 0x1a, + 0x38, 0xac, 0xe4, 0x80, 0x2e, 0x69, 0xe3, 0x64, + 0x2e, 0x10, 0xfd, 0x3c, 0x6a, 0x37, 0xb0, 0xf7, + 0xb5, 0xfa, 0x7a, 0x0a, 0x94, 0x44, 0x98, 0x18, + 0x9b, 0x98, 0x2f, 0xcb, 0x6f, 0xcb, 0x51, 0xe4, + 0xd5, 0x3e, 0x33, 0x19, 0x32, 0x27, 0x06, 0x42, + 0xc5, 0x80, 0xdc, 0xe7, 0xb9, 0x3e, 0x0d, 0x68, + 0xad, 0x70, 0xf1, 0xf7, 0xed, 0x9b, 0xcf, 0xfc, + 0x4d, 0x81, 0x82, 0xf3, 0xc9, 0xfa, 0x87, 0xba, + 0xa6, 0xeb, 0x80, 0x7b, 0xfa, 0x8a, 0x74, 0x28, + 0x00, 0x00, 0x00, 0xd0, 0x0e, 0x95, 0xed, 0x59, + 0xc4, 0x51, 0x45, 0x14, 0x05, 0x14, 0x51, 0x40, + 0x51, 0x45, 0x14, 0x1e, 0x10, 0x08, 0xb1, 0xd4, + 0x1a, 0x43, 0xcb, 0xe1, 0x1c, 0x6f, 0xcf, 0x85, + 0x7f, 0x2c, 0xe8, 0xe0, 0x0e, 0xc7, 0xb5, 0x3f, + 0xae, 0x24, 0x8d, 0x64, 0x42, 0x8c, 0x2e, 0x18, + 0x58, 0xd0, 0x25, 0x68, 0xb1, 0x79, 0x2c, 0x74, + 0x46, 0x61, 0x1e, 0x48, 0x16, 0x56, 0x36, 0x37, + 0xb7, 0x63, 0x59, 0xae, 0x5b, 0x84, 0x92, 0x27, + 0x64, 0x65, 0x23, 0xf0, 0xd3, 0xeb, 0x7a, 0xd1, + 0xe4, 0x60, 0x4b, 0x8c, 0xcc, 0xea, 0x3f, 0x29, + 0x41, 0x6b, 0xaf, 0x5d, 0x3a, 0x54, 0x71, 0x72, + 0x4f, 0x2a, 0x14, 0xca, 0x41, 0x3c, 0x1a, 0x82, + 0x06, 0x8e, 0xb6, 0xaa, 0xda, 0x91, 0x67, 0x7d, + 0x1d, 0x9b, 0x6a, 0x9f, 0xda, 0xfe, 0x3e, 0x77, + 0x93, 0xc7, 0xcb, 0x1d, 0xc8, 0x24, 0x5b, 0xad, + 0x87, 0x6a, 0xa7, 0x8e, 0x7f, 0x4d, 0xbd, 0x65, + 0x8c, 0xc9, 0x1c, 0x82, 0xce, 0x0e, 0x95, 0xf4, + 0x89, 0xb8, 0x4c, 0x6c, 0xe8, 0xcc, 0xd8, 0x2d, + 0xbe, 0xfd, 0x63, 0x6d, 0x18, 0x1f, 0xe7, 0x59, + 0xfc, 0xef, 0xfa, 0xf4, 0xb1, 0x12, 0xaf, 0x1b, + 0x29, 0x3e, 0x74, 0xac, 0xf6, 0xd5, 0x30, 0xf5, + 0xb4, 0xf7, 0x69, 0x68, 0xf2, 0xc8, 0xe5, 0x39, + 0xcb, 0x74, 0x82, 0x24, 0xf8, 0xa2, 0x4d, 0x11, + 0x4d, 0x58, 0x97, 0x06, 0x6c, 0x3e, 0x31, 0xd3, + 0x6d, 0xda, 0x56, 0xf7, 0x15, 0xd7, 0xda, 0x35, + 0xab, 0xf2, 0xf0, 0x8c, 0xa6, 0xd6, 0x23, 0xc1, + 0xd2, 0xf5, 0xea, 0xe2, 0x65, 0xa4, 0x65, 0x09, + 0x2c, 0x84, 0x5b, 0x69, 0xf5, 0xaa, 0xfc, 0xcb, + 0x4c, 0x6e, 0xac, 0xfb, 0x28, 0xc1, 0x5f, 0x83, + 0x0e, 0x7c, 0xa0, 0x3f, 0x33, 0x48, 0xd3, 0xf1, + 0xeb, 0x6a, 0xed, 0xd6, 0x69, 0x38, 0xb5, 0x69, + 0x6e, 0xcd, 0xf2, 0x59, 0x58, 0xf5, 0xb5, 0x39, + 0xc3, 0xe2, 0xd1, 0xe0, 0x7c, 0x69, 0xae, 0xa0, + 0xb6, 0xe5, 0x6a, 0xb2, 0xfc, 0x4f, 0xcc, 0x63, + 0x86, 0x15, 0x63, 0x1c, 0x5a, 0x0b, 0x77, 0x3e, + 0x69, 0x15, 0x94, 0x5b, 0x75, 0x60, 0x97, 0x1b, + 0x85, 0x82, 0x5c, 0x53, 0x90, 0x24, 0x3b, 0x94, + 0x5d, 0x96, 0xd5, 0x6b, 0x0b, 0x88, 0x77, 0x75, + 0xd0, 0xeb, 0xe9, 0x5a, 0x7c, 0x2e, 0x09, 0xd7, + 0x17, 0xe3, 0x08, 0xc5, 0xe5, 0x22, 0xe3, 0xae, + 0x82, 0x9e, 0xf1, 0xfc, 0x24, 0x78, 0xea, 0x65, + 0xc8, 0xfc, 0xbd, 0x3b, 0x91, 0x71, 0x6a, 0xe9, + 0x5d, 0x72, 0xc5, 0xbf, 0xb9, 0x58, 0x8f, 0x24, + 0x9c, 0x5f, 0x0a, 0xec, 0x47, 0xb4, 0x96, 0xec, + 0x2d, 0x5a, 0x15, 0x18, 0xdc, 0x54, 0x5b, 0xdc, + 0x87, 0x98, 0xe8, 0x2d, 0xd0, 0x54, 0x79, 0x99, + 0xaa, 0xad, 0xfa, 0x7c, 0x33, 0xb7, 0x68, 0x0d, + 0x23, 0x77, 0x37, 0xe8, 0x2f, 0x5d, 0x62, 0x71, + 0x72, 0x64, 0x01, 0x2e, 0x49, 0x2a, 0xa7, 0x50, + 0xbd, 0x0d, 0x76, 0xad, 0x70, 0xf3, 0x36, 0xee, + 0xb5, 0xe7, 0xf2, 0x10, 0x6c, 0xcb, 0xe4, 0xa7, + 0x2a, 0x1b, 0x45, 0x3b, 0x8b, 0x1e, 0x83, 0xfd, + 0x34, 0xeb, 0x17, 0x11, 0x31, 0x92, 0xcb, 0xab, + 0x1f, 0xb9, 0xbc, 0x9a, 0xee, 0x0c, 0x68, 0x60, + 0x5b, 0x44, 0xbb, 0x7c, 0x9e, 0xf5, 0x2d, 0x59, + 0xc8, 0x51, 0x45, 0x14, 0x05, 0x14, 0x51, 0x40, + 0x51, 0x45, 0x14, 0x05, 0x14, 0x51, 0x40, 0x51, + 0x45, 0x14, 0x1e, 0x10, 0x0e, 0x87, 0x5a, 0xaf, + 0x91, 0x81, 0x8d, 0x3d, 0xcb, 0x25, 0x9c, 0xff, + 0x00, 0x5a, 0xe8, 0x6a, 0xcd, 0x14, 0x19, 0xd9, + 0xb0, 0xb3, 0x30, 0x67, 0x0e, 0x97, 0x68, 0xb5, + 0xb3, 0xa8, 0xd4, 0x77, 0xd6, 0xb9, 0x6c, 0xec, + 0x90, 0x9f, 0x9e, 0x09, 0x7f, 0xbb, 0x63, 0x81, + 0x62, 0x3d, 0x2b, 0x47, 0x6a, 0x8e, 0x6c, 0x78, + 0x66, 0x52, 0xb2, 0x20, 0x61, 0xeb, 0x40, 0x93, + 0x6f, 0x0d, 0x3a, 0xde, 0x68, 0x7e, 0x36, 0xee, + 0x54, 0xd8, 0x51, 0x2f, 0x17, 0xc3, 0x6d, 0x2c, + 0xa5, 0xcd, 0xbb, 0x0d, 0x7a, 0xd5, 0xc6, 0xe0, + 0x60, 0x3a, 0x09, 0x19, 0x56, 0xf7, 0x20, 0x5b, + 0x5f, 0x4a, 0x8c, 0xf0, 0x2e, 0x5c, 0xb7, 0xea, + 0x5b, 0x69, 0xb5, 0x94, 0x2e, 0x80, 0x0e, 0xdd, + 0x6a, 0x31, 0x1f, 0x8b, 0xc6, 0xdb, 0xc7, 0x8b, + 0x4a, 0x8a, 0x62, 0x70, 0xe0, 0x82, 0xc1, 0xc0, + 0x22, 0xed, 0xa8, 0x16, 0xb1, 0xef, 0x56, 0xd1, + 0x78, 0x5c, 0x78, 0xfe, 0x48, 0xd7, 0x78, 0xd4, + 0xa9, 0x62, 0x6d, 0xa5, 0x4a, 0x38, 0x08, 0x2d, + 0x66, 0x72, 0x75, 0x3a, 0x81, 0x63, 0xaf, 0xad, + 0xea, 0x55, 0xe1, 0xb1, 0xbd, 0xa1, 0xcb, 0x32, + 0xa0, 0xb2, 0xad, 0xec, 0x3f, 0x1b, 0x53, 0x11, + 0xf8, 0x4e, 0xcb, 0xcf, 0x9b, 0x4a, 0x8c, 0x99, + 0xb3, 0x2d, 0x99, 0x3d, 0x9a, 0x68, 0xab, 0xd2, + 0xe7, 0xa5, 0xea, 0x0d, 0xd9, 0x79, 0xee, 0x07, + 0xb8, 0xb7, 0x91, 0xf6, 0xf8, 0x23, 0x5a, 0xd0, + 0x0c, 0x5c, 0x75, 0x5d, 0xa1, 0x05, 0xbf, 0xba, + 0xbb, 0x48, 0xd1, 0x05, 0x95, 0x40, 0xb7, 0x8a, + 0x95, 0x0b, 0xf0, 0xf8, 0x85, 0x8d, 0x84, 0xb2, + 0x7d, 0xfa, 0x12, 0x3b, 0x5c, 0x53, 0x2a, 0xf6, + 0x8a, 0x02, 0x8a, 0x28, 0xa0, 0x28, 0xa2, 0x8a, + 0x02, 0x8a, 0x28, 0xa0, 0x28, 0xa2, 0x8a, 0x02, + 0x8a, 0x28, 0xa0, 0x28, 0xa2, 0x8a, 0x02, 0x8a, + 0x28, 0xa0, 0x28, 0xa2, 0x8a, 0x02, 0x8a, 0x28, + 0xa0, 0x28, 0xa2, 0x8a, 0x02, 0x8a, 0x28, 0xa0, + 0x28, 0xa2, 0x8a, 0x02, 0x8a, 0x28, 0xa0, 0x28, + 0xa2, 0x8a, 0x02, 0x8a, 0x28, 0xa0, 0xff, 0xd9, + +}; + +static const uint8_t data_images_c_c_c_connect_small_jpg[] = +{ + /* /images/c-c-c-connect-small.jpg */ + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x63, 0x2d, 0x63, 0x2d, 0x63, 0x2d, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x2e, 0x6a, 0x70, 0x67, 0x00, + + 0xff, 0xd8, 0xff, 0xe1, 0x00, 0x18, 0x45, 0x78, + 0x69, 0x66, 0x00, 0x00, 0x49, 0x49, 0x2a, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x11, + 0x44, 0x75, 0x63, 0x6b, 0x79, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0xff, + 0xe1, 0x03, 0x29, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, + 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, + 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x00, + 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, + 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, + 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, + 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, + 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, + 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, + 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, + 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, + 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, + 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, + 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, + 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, + 0x65, 0x20, 0x35, 0x2e, 0x30, 0x2d, 0x63, 0x30, + 0x36, 0x30, 0x20, 0x36, 0x31, 0x2e, 0x31, 0x33, + 0x34, 0x37, 0x37, 0x37, 0x2c, 0x20, 0x32, 0x30, + 0x31, 0x30, 0x2f, 0x30, 0x32, 0x2f, 0x31, 0x32, + 0x2d, 0x31, 0x37, 0x3a, 0x33, 0x32, 0x3a, 0x30, + 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, + 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, + 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, + 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, + 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, + 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, + 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, + 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, + 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, + 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, + 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, + 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, + 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, + 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, + 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, + 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, + 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, + 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, + 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, + 0x20, 0x43, 0x53, 0x35, 0x20, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x73, 0x22, 0x20, 0x78, 0x6d, + 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, + 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, + 0x30, 0x45, 0x46, 0x41, 0x33, 0x30, 0x31, 0x45, + 0x32, 0x36, 0x44, 0x44, 0x31, 0x31, 0x45, 0x33, + 0x38, 0x44, 0x44, 0x43, 0x38, 0x35, 0x45, 0x30, + 0x32, 0x43, 0x35, 0x38, 0x32, 0x34, 0x41, 0x31, + 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, + 0x64, 0x69, 0x64, 0x3a, 0x30, 0x45, 0x46, 0x41, + 0x33, 0x30, 0x31, 0x46, 0x32, 0x36, 0x44, 0x44, + 0x31, 0x31, 0x45, 0x33, 0x38, 0x44, 0x44, 0x43, + 0x38, 0x35, 0x45, 0x30, 0x32, 0x43, 0x35, 0x38, + 0x32, 0x34, 0x41, 0x31, 0x22, 0x3e, 0x20, 0x3c, + 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, + 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, + 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, + 0x69, 0x69, 0x64, 0x3a, 0x30, 0x45, 0x46, 0x41, + 0x33, 0x30, 0x31, 0x43, 0x32, 0x36, 0x44, 0x44, + 0x31, 0x31, 0x45, 0x33, 0x38, 0x44, 0x44, 0x43, + 0x38, 0x35, 0x45, 0x30, 0x32, 0x43, 0x35, 0x38, + 0x32, 0x34, 0x41, 0x31, 0x22, 0x20, 0x73, 0x74, + 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, + 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, + 0x30, 0x45, 0x46, 0x41, 0x33, 0x30, 0x31, 0x44, + 0x32, 0x36, 0x44, 0x44, 0x31, 0x31, 0x45, 0x33, + 0x38, 0x44, 0x44, 0x43, 0x38, 0x35, 0x45, 0x30, + 0x32, 0x43, 0x35, 0x38, 0x32, 0x34, 0x41, 0x31, + 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, + 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, + 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, + 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, + 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, + 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, + 0x3f, 0x3e, 0xff, 0xee, 0x00, 0x0e, 0x41, 0x64, + 0x6f, 0x62, 0x65, 0x00, 0x64, 0xc0, 0x00, 0x00, + 0x00, 0x01, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x0c, + 0x08, 0x08, 0x08, 0x09, 0x08, 0x0c, 0x09, 0x09, + 0x0c, 0x11, 0x0b, 0x0a, 0x0b, 0x11, 0x15, 0x0f, + 0x0c, 0x0c, 0x0f, 0x15, 0x18, 0x13, 0x13, 0x15, + 0x13, 0x13, 0x18, 0x17, 0x12, 0x14, 0x14, 0x14, + 0x14, 0x12, 0x17, 0x17, 0x1b, 0x1c, 0x1e, 0x1c, + 0x1b, 0x17, 0x24, 0x24, 0x27, 0x27, 0x24, 0x24, + 0x35, 0x33, 0x33, 0x33, 0x35, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x01, + 0x0d, 0x0b, 0x0b, 0x0d, 0x0e, 0x0d, 0x10, 0x0e, + 0x0e, 0x10, 0x14, 0x0e, 0x0f, 0x0e, 0x14, 0x14, + 0x10, 0x11, 0x11, 0x10, 0x14, 0x1d, 0x14, 0x14, + 0x15, 0x14, 0x14, 0x1d, 0x25, 0x1a, 0x17, 0x17, + 0x17, 0x17, 0x1a, 0x25, 0x20, 0x23, 0x1e, 0x1e, + 0x1e, 0x23, 0x20, 0x28, 0x28, 0x25, 0x25, 0x28, + 0x28, 0x32, 0x32, 0x30, 0x32, 0x32, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0xff, 0xc0, 0x00, 0x11, 0x08, 0x00, 0xdf, 0x00, + 0xb5, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, + 0x03, 0x11, 0x01, 0xff, 0xc4, 0x00, 0x8e, 0x00, + 0x00, 0x02, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x03, 0x04, 0x06, 0x01, 0x02, 0x07, + 0x01, 0x01, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x10, + 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x04, + 0x04, 0x04, 0x06, 0x01, 0x05, 0x01, 0x00, 0x00, + 0x01, 0x02, 0x03, 0x00, 0x11, 0x04, 0x21, 0x12, + 0x05, 0x31, 0x41, 0x51, 0x61, 0x22, 0x13, 0x71, + 0x32, 0x14, 0x06, 0x81, 0x91, 0x42, 0x23, 0xa1, + 0xb1, 0xc1, 0x15, 0xf0, 0xd1, 0x62, 0x72, 0x33, + 0x24, 0x52, 0xe1, 0xb2, 0xc2, 0x43, 0x34, 0x07, + 0x11, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, + 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x11, 0x02, 0x21, 0x03, 0x31, + 0x12, 0x41, 0x04, 0x51, 0x61, 0x71, 0x22, 0x13, + 0x32, 0x72, 0x14, 0xff, 0xda, 0x00, 0x0c, 0x03, + 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, + 0x00, 0xfa, 0xad, 0x14, 0x51, 0x40, 0x14, 0x51, + 0x45, 0x00, 0x51, 0x45, 0x57, 0xcc, 0xca, 0x5c, + 0x68, 0x77, 0x9f, 0x98, 0xe8, 0xa3, 0xc6, 0x80, + 0x9e, 0xa1, 0x9f, 0x37, 0x1e, 0x0f, 0x9d, 0xc5, + 0xfc, 0x05, 0x25, 0xfe, 0xe3, 0x9f, 0x33, 0x6d, + 0x8c, 0xe8, 0xda, 0x32, 0x01, 0xfc, 0x74, 0xd6, + 0xa5, 0x1c, 0x44, 0xf3, 0x20, 0xf7, 0x3d, 0x22, + 0xf7, 0x3b, 0x8f, 0xa8, 0x8a, 0x03, 0x99, 0x3c, + 0xa6, 0x7c, 0x8c, 0xbf, 0x4e, 0xbb, 0x51, 0x8e, + 0x96, 0xd4, 0xdb, 0xf1, 0xa8, 0x1a, 0x4e, 0x42, + 0x62, 0x5a, 0x6d, 0xc1, 0x48, 0xb8, 0x06, 0xe0, + 0xdb, 0xca, 0xd4, 0xdf, 0x17, 0x1f, 0x1b, 0x0e, + 0x20, 0x8b, 0xea, 0xb1, 0x27, 0x73, 0x6a, 0x6f, + 0x52, 0x3e, 0x4c, 0x64, 0x74, 0x1f, 0x8e, 0xb4, + 0x02, 0x3c, 0x3c, 0x1c, 0xbc, 0x90, 0x77, 0x6e, + 0xdb, 0xf3, 0x00, 0xe4, 0xda, 0xf7, 0xb0, 0xd0, + 0xd4, 0xd2, 0xf1, 0x79, 0x31, 0x46, 0xac, 0x4d, + 0xf6, 0x8b, 0x10, 0xa0, 0x92, 0x49, 0x3e, 0x44, + 0x53, 0x13, 0x9a, 0x83, 0xa1, 0x02, 0x81, 0x9c, + 0xa4, 0xda, 0xe0, 0xf8, 0xd0, 0x98, 0x62, 0x58, + 0xfe, 0xa6, 0x17, 0xf7, 0x06, 0xe5, 0xf6, 0x8f, + 0x4e, 0x80, 0xdb, 0xc6, 0xaf, 0x2f, 0x39, 0x22, + 0x00, 0x24, 0x50, 0xc7, 0x5d, 0x7a, 0x5f, 0xca, + 0xaf, 0x7d, 0x44, 0x4f, 0x70, 0xc1, 0x58, 0x1d, + 0x2a, 0x39, 0x70, 0xb0, 0xa7, 0x4d, 0x85, 0x76, + 0xf7, 0xd2, 0x84, 0x12, 0xe3, 0xf2, 0x38, 0xf3, + 0x00, 0x09, 0xd8, 0xc4, 0x5f, 0x69, 0x3e, 0x3e, + 0x75, 0x64, 0x48, 0x8c, 0x6c, 0xac, 0x0f, 0xc0, + 0xd2, 0xb6, 0xe1, 0xdb, 0x4d, 0x8e, 0x36, 0x81, + 0x61, 0xe3, 0x6f, 0x88, 0xaa, 0x2e, 0x99, 0x5c, + 0x7c, 0xc1, 0xae, 0x45, 0xfb, 0x01, 0x71, 0x61, + 0xfc, 0x28, 0x0d, 0x25, 0x14, 0xbb, 0x0f, 0x96, + 0x8e, 0x76, 0x11, 0xba, 0x95, 0x6d, 0x3c, 0xc5, + 0x31, 0xa0, 0x0a, 0x28, 0xa2, 0x80, 0x28, 0xa2, + 0x8a, 0x00, 0xa2, 0x8a, 0x28, 0x02, 0x8a, 0x28, + 0xa0, 0x0a, 0x28, 0xa8, 0x32, 0xb2, 0x96, 0x08, + 0xcf, 0x43, 0x25, 0x89, 0x55, 0xef, 0x40, 0x54, + 0xcc, 0xe5, 0xbd, 0xa7, 0xf6, 0xa0, 0x01, 0xe4, + 0xbd, 0x8d, 0xfa, 0x0a, 0x58, 0xc9, 0x95, 0x9f, + 0x23, 0x17, 0x07, 0x78, 0x36, 0x0c, 0x09, 0x02, + 0xde, 0x42, 0xbd, 0x63, 0xc3, 0xf5, 0x39, 0x41, + 0xc0, 0xdd, 0xea, 0xdd, 0x2e, 0xba, 0x8b, 0xd3, + 0x99, 0x24, 0x8a, 0x11, 0x64, 0xb2, 0x81, 0xe5, + 0x40, 0x18, 0xf1, 0xc5, 0x8d, 0x12, 0x8b, 0x0d, + 0xf6, 0xf5, 0xb7, 0x9d, 0x41, 0x3e, 0x6a, 0xa8, + 0xd5, 0x85, 0x8d, 0x53, 0xcb, 0xe4, 0xd1, 0x49, + 0xf5, 0x0f, 0xca, 0xb3, 0xd9, 0xfc, 0xcd, 0x8b, + 0x0d, 0xc0, 0x81, 0xd2, 0xab, 0x6b, 0x1b, 0x6b, + 0xd2, 0xec, 0xc7, 0x79, 0x5c, 0xaa, 0xa0, 0xb5, + 0xc7, 0x9d, 0x2b, 0xc8, 0xe7, 0x95, 0x01, 0x5b, + 0x82, 0x4f, 0x85, 0x66, 0x72, 0x39, 0x66, 0x76, + 0x36, 0x7d, 0x3b, 0x52, 0xd9, 0xf9, 0x19, 0x84, + 0xbb, 0xee, 0x08, 0x6d, 0x3e, 0x17, 0xac, 0xdd, + 0xce, 0xb5, 0xeb, 0x42, 0xe0, 0xd4, 0x3f, 0xdc, + 0x2b, 0xb3, 0xd2, 0xc0, 0xdb, 0xad, 0x7a, 0x8b, + 0x9e, 0x52, 0x01, 0xdc, 0x3d, 0x5a, 0x5f, 0xc6, + 0xb1, 0x3f, 0x5b, 0x21, 0x95, 0xd1, 0x8f, 0xcd, + 0xd2, 0xe3, 0xc6, 0xb9, 0x0e, 0x6c, 0x80, 0xb2, + 0x1d, 0x08, 0xd4, 0x0f, 0x85, 0x5d, 0x16, 0x5a, + 0x17, 0x94, 0x6f, 0xa0, 0xfb, 0x81, 0x77, 0x2d, + 0xca, 0xf8, 0x1f, 0x2e, 0xd4, 0xdb, 0x1b, 0x99, + 0x46, 0xb6, 0xa3, 0x4f, 0x9a, 0xbe, 0x62, 0x99, + 0x72, 0x2b, 0x96, 0xdd, 0xa0, 0x1b, 0x85, 0xc7, + 0xf0, 0xa6, 0x18, 0xfc, 0xbb, 0x26, 0xd0, 0xcf, + 0x7b, 0xea, 0xde, 0x74, 0x4c, 0xca, 0xfe, 0xb4, + 0x2e, 0x0f, 0xac, 0x45, 0x92, 0x86, 0x30, 0xc1, + 0xb4, 0x35, 0x39, 0xf6, 0x72, 0x10, 0xa3, 0xd9, + 0x81, 0xff, 0x00, 0x1a, 0x56, 0x1f, 0x88, 0xe7, + 0x25, 0x9b, 0x19, 0x94, 0xb8, 0x0b, 0x18, 0xbe, + 0xbd, 0x6d, 0x4f, 0xb0, 0x79, 0x34, 0x7b, 0x1d, + 0xe0, 0xe9, 0xb8, 0xfc, 0x6a, 0xe7, 0x35, 0xf5, + 0xb4, 0xcf, 0x5c, 0x87, 0x1a, 0xf8, 0xc9, 0xee, + 0x44, 0xe7, 0xda, 0x1e, 0x27, 0x5f, 0xc6, 0xaf, + 0xf1, 0xdc, 0x80, 0x99, 0x44, 0x32, 0x9d, 0xb3, + 0x28, 0xea, 0x7f, 0x50, 0xf1, 0xa9, 0x37, 0x45, + 0x93, 0x0e, 0xc7, 0xf5, 0x29, 0xeb, 0x4a, 0xb2, + 0xf0, 0x24, 0xc7, 0x25, 0x94, 0x33, 0xa0, 0xf9, + 0x58, 0x76, 0x07, 0xe1, 0x43, 0x26, 0x68, 0x01, + 0x07, 0xa5, 0x76, 0x94, 0xf1, 0x19, 0xdb, 0x89, + 0xc7, 0x90, 0xd8, 0xdc, 0xfb, 0x77, 0xf2, 0xea, + 0x29, 0xb5, 0x00, 0x51, 0x45, 0x14, 0x01, 0x45, + 0x14, 0x50, 0x05, 0x14, 0x51, 0x40, 0x57, 0xcd, + 0xc8, 0x18, 0xf8, 0xcf, 0x2f, 0x71, 0xa0, 0x17, + 0xb6, 0xa6, 0x93, 0xe2, 0xe2, 0x4b, 0x99, 0x29, + 0x79, 0xb7, 0x6c, 0x6d, 0x5a, 0xff, 0x00, 0xd2, + 0xbb, 0xca, 0x4b, 0x24, 0xd9, 0x86, 0x25, 0x3b, + 0x82, 0xe8, 0xa9, 0xe6, 0x7b, 0xd3, 0x28, 0x54, + 0x62, 0x62, 0x2c, 0x64, 0xdd, 0xed, 0x76, 0x34, + 0x07, 0x1f, 0xd9, 0xc7, 0x1e, 0x81, 0x6e, 0xc4, + 0xf7, 0x34, 0xa3, 0x3f, 0x92, 0xda, 0x1a, 0xcd, + 0xf1, 0xd2, 0x8e, 0x53, 0x90, 0x09, 0x1b, 0x10, + 0xc4, 0x11, 0xf8, 0x56, 0x53, 0x91, 0xe4, 0x59, + 0xc9, 0x00, 0x9f, 0x13, 0xfe, 0x75, 0x5b, 0x3c, + 0x1d, 0x5a, 0x34, 0xcb, 0xca, 0x0e, 0x4b, 0x94, + 0x2d, 0x70, 0x1a, 0x91, 0xe4, 0x67, 0xbb, 0x5e, + 0xcc, 0x4d, 0xff, 0x00, 0xc5, 0xeb, 0xc6, 0x4c, + 0xe5, 0x87, 0xa8, 0x9e, 0xb6, 0xb9, 0xd2, 0xa9, + 0x48, 0xf6, 0x42, 0xcd, 0xdb, 0xad, 0x62, 0xe6, + 0x61, 0x9e, 0x8d, 0x35, 0xd6, 0xaa, 0x5e, 0x20, + 0x93, 0x7b, 0xb7, 0x4a, 0xf1, 0x22, 0x5d, 0x4a, + 0xb5, 0xcd, 0xfb, 0xd4, 0x31, 0x72, 0x58, 0xd6, + 0x2a, 0xd2, 0x6d, 0x6e, 0xda, 0x57, 0xb5, 0x74, + 0x91, 0xc1, 0x59, 0x03, 0xf9, 0x29, 0xf1, 0xad, + 0x55, 0x30, 0x66, 0xbd, 0xda, 0x76, 0x75, 0x7c, + 0x22, 0xbc, 0xa1, 0xb6, 0x90, 0x75, 0x78, 0xcd, + 0xaf, 0xe5, 0x41, 0x63, 0x64, 0x94, 0x75, 0xe8, + 0xd4, 0xd6, 0x3c, 0x2c, 0x39, 0x19, 0x15, 0x98, + 0xa4, 0x92, 0xfa, 0x5a, 0xfd, 0xaa, 0x33, 0xc2, + 0x4e, 0x21, 0x65, 0x42, 0x1f, 0x73, 0x6d, 0x4b, + 0x75, 0x24, 0x77, 0xa8, 0x1f, 0xbe, 0xad, 0xe1, + 0xa8, 0x2a, 0xdf, 0xf2, 0x1f, 0xc8, 0xd7, 0x94, + 0x24, 0xe8, 0x7a, 0xa9, 0xb5, 0xfc, 0x45, 0x58, + 0x97, 0x8d, 0xcc, 0x87, 0x76, 0xe4, 0x24, 0x27, + 0xa0, 0x91, 0xdc, 0xd5, 0x73, 0x1c, 0x8a, 0xe4, + 0xb2, 0x9b, 0x85, 0xf5, 0x7c, 0x69, 0x2b, 0xe5, + 0x17, 0xef, 0x56, 0xb9, 0x45, 0x94, 0xce, 0x95, + 0x65, 0xdb, 0xb8, 0xa8, 0x1a, 0x69, 0xe1, 0x5a, + 0x0c, 0x0e, 0x5c, 0xc5, 0xb5, 0x43, 0x5d, 0x98, + 0x6b, 0xda, 0xb2, 0xc5, 0x49, 0x65, 0x24, 0x58, + 0x81, 0x76, 0xfc, 0x2a, 0xce, 0x3c, 0xad, 0xbe, + 0xf7, 0xd4, 0x9e, 0x9e, 0x55, 0x1d, 0xdc, 0x4a, + 0x2a, 0xf5, 0x56, 0xc7, 0xd4, 0x38, 0xae, 0x5c, + 0xb2, 0x14, 0x2d, 0xd0, 0x75, 0x3f, 0xc8, 0xd3, + 0xbc, 0x5c, 0x91, 0x20, 0xb7, 0x50, 0x6b, 0xe7, + 0x1c, 0x6e, 0x73, 0x25, 0x89, 0x73, 0x73, 0xf3, + 0x5f, 0xa5, 0x6b, 0x38, 0xde, 0x47, 0x76, 0xd3, + 0x73, 0xea, 0xed, 0x57, 0x56, 0xac, 0x28, 0x38, + 0x77, 0x7a, 0xfd, 0x5b, 0x2f, 0x72, 0x18, 0x4d, + 0x04, 0xe9, 0x95, 0x05, 0x82, 0x02, 0x49, 0x1e, + 0x67, 0xc2, 0xde, 0x74, 0xc7, 0x0f, 0x32, 0x2c, + 0x98, 0xc3, 0x2b, 0x0d, 0xd6, 0xf5, 0x2f, 0x7f, + 0x8d, 0xab, 0xc6, 0xd4, 0xcb, 0x81, 0xa1, 0x7b, + 0xd9, 0x86, 0x87, 0xa1, 0x07, 0xc6, 0x94, 0x62, + 0x16, 0xc4, 0xcf, 0x54, 0x37, 0x66, 0x04, 0xab, + 0x5b, 0x5d, 0x07, 0xf4, 0xab, 0x1c, 0xa6, 0x8e, + 0x8a, 0xe0, 0x37, 0xd4, 0x57, 0x68, 0x02, 0x8a, + 0x28, 0xa0, 0x0a, 0xa7, 0xc8, 0x67, 0x0c, 0x64, + 0xda, 0xa2, 0xf2, 0xb8, 0xf4, 0x8f, 0xeb, 0x57, + 0x29, 0x17, 0x3b, 0x32, 0xfb, 0xc8, 0x8a, 0x40, + 0x75, 0xb1, 0x3e, 0x7e, 0x54, 0x01, 0xc5, 0xc3, + 0xef, 0x65, 0x36, 0x43, 0xea, 0x88, 0xa0, 0xfc, + 0x5c, 0xd4, 0xbc, 0x86, 0x56, 0xc4, 0x62, 0x6f, + 0xfe, 0x55, 0xea, 0x08, 0xfe, 0x9f, 0x08, 0x1f, + 0xd4, 0xfe, 0xa3, 0xdb, 0xe1, 0x48, 0xb9, 0x7c, + 0xcb, 0x5c, 0x0d, 0x1b, 0xe3, 0x7a, 0xab, 0x66, + 0xda, 0x75, 0xbb, 0x31, 0x37, 0x37, 0x9e, 0x77, + 0x90, 0xa4, 0xd9, 0x81, 0xe9, 0xe3, 0x59, 0xc7, + 0xca, 0x69, 0x57, 0xd2, 0xd6, 0x61, 0xdc, 0xd4, + 0x9c, 0xbe, 0x41, 0x32, 0x2b, 0x80, 0x40, 0x53, + 0x63, 0xaf, 0x8d, 0x2c, 0x8d, 0x8d, 0xe4, 0x56, + 0xec, 0x6f, 0x59, 0xd9, 0x4a, 0x3d, 0x3d, 0x3a, + 0xd5, 0x5a, 0x45, 0x89, 0x72, 0x1e, 0x46, 0x2a, + 0xda, 0x81, 0xa7, 0xc2, 0x95, 0x72, 0xb9, 0x1b, + 0x57, 0xd8, 0x4d, 0x6f, 0xf3, 0x1a, 0xb5, 0x95, + 0x38, 0xc7, 0x88, 0xb9, 0xd4, 0x9e, 0x82, 0x93, + 0xc6, 0xad, 0x93, 0x96, 0xaa, 0xed, 0xb7, 0xdc, + 0x60, 0x0b, 0x1e, 0xc0, 0xd5, 0x92, 0x76, 0x7d, + 0x99, 0x97, 0xbb, 0xbd, 0x56, 0xbd, 0x13, 0xcb, + 0x26, 0x9b, 0x86, 0xe4, 0xe1, 0x85, 0x67, 0x93, + 0x1a, 0x4f, 0x69, 0xc5, 0xd6, 0x4b, 0x5c, 0x11, + 0x54, 0xf5, 0x1d, 0x4d, 0x8f, 0xf1, 0xd3, 0xc6, + 0xb7, 0x70, 0x66, 0x2c, 0xf2, 0xae, 0x2c, 0x39, + 0x2d, 0xfd, 0xbb, 0x0c, 0x26, 0x2c, 0x11, 0xab, + 0x58, 0xcb, 0x2b, 0xe8, 0x5a, 0xa9, 0xe6, 0x7d, + 0x9d, 0x03, 0xe7, 0x4b, 0x1c, 0x53, 0x30, 0x63, + 0x25, 0xac, 0x3d, 0x56, 0xbf, 0x62, 0x7c, 0x4d, + 0x68, 0x79, 0x66, 0x5a, 0x2c, 0xcc, 0xb8, 0x7f, + 0xe3, 0x95, 0xd6, 0xde, 0x75, 0x6e, 0x1e, 0x7b, + 0x36, 0x22, 0xa6, 0xe2, 0xe0, 0xdc, 0x11, 0xa1, + 0xbf, 0xc6, 0xae, 0x9e, 0x0b, 0x0b, 0x1f, 0x3f, + 0x23, 0x8f, 0x9f, 0x21, 0x4c, 0x91, 0x39, 0x41, + 0x2a, 0xf4, 0xd0, 0x5e, 0xd6, 0xf8, 0xe9, 0x5e, + 0x23, 0xfb, 0x63, 0x22, 0x67, 0x3b, 0x26, 0x8d, + 0x61, 0x52, 0x13, 0xde, 0x73, 0x60, 0xce, 0x7b, + 0x2f, 0xc2, 0x98, 0xf2, 0x59, 0x36, 0xb8, 0x27, + 0xc5, 0xfb, 0xba, 0x48, 0xc0, 0x59, 0x56, 0xe8, + 0x1b, 0x75, 0x9b, 0xd4, 0x4b, 0x55, 0xf5, 0xfb, + 0x93, 0x8b, 0xc9, 0x64, 0x33, 0xc6, 0xaa, 0x77, + 0xef, 0x7b, 0x8e, 0xa3, 0xc2, 0xb3, 0x79, 0x3c, + 0x36, 0x7e, 0x3e, 0x7c, 0x98, 0x1e, 0xd9, 0x7c, + 0x88, 0xce, 0xaa, 0xba, 0xe9, 0xe3, 0x55, 0x67, + 0x82, 0x6c, 0x79, 0x0c, 0x53, 0xa3, 0x46, 0xe3, + 0x52, 0xac, 0x35, 0xaa, 0x3d, 0x69, 0xf0, 0x89, + 0x5b, 0x2c, 0x6d, 0x55, 0xb8, 0x6c, 0xc7, 0x76, + 0x0e, 0x11, 0xa5, 0x7b, 0xaa, 0xa9, 0xd0, 0x25, + 0x49, 0xfd, 0xab, 0x1c, 0x89, 0x65, 0x81, 0xc3, + 0x15, 0x70, 0x91, 0xa7, 0x72, 0x2b, 0x06, 0x18, + 0x8e, 0x84, 0x8b, 0xfe, 0x74, 0xc3, 0x8c, 0xfe, + 0xef, 0x93, 0x30, 0x8b, 0x12, 0x47, 0x02, 0xe3, + 0x71, 0xb9, 0xdb, 0xf8, 0xd5, 0x5e, 0x94, 0xf8, + 0x6d, 0x17, 0x5e, 0xc5, 0xeb, 0xe4, 0xd7, 0x45, + 0x8b, 0x97, 0x14, 0x84, 0x01, 0x74, 0x43, 0x67, + 0x23, 0xb5, 0x3c, 0xc3, 0x9f, 0x26, 0x39, 0x15, + 0x59, 0x59, 0x4a, 0x8b, 0xdb, 0xc0, 0x1a, 0xa3, + 0xc6, 0x63, 0x3c, 0x18, 0xe6, 0x3c, 0x87, 0xf7, + 0x1d, 0x88, 0x2e, 0x57, 0x4d, 0x47, 0xf3, 0xab, + 0xd9, 0x39, 0xc3, 0x1e, 0x07, 0x9c, 0x92, 0x77, + 0x59, 0x58, 0x37, 0x5b, 0x74, 0xd0, 0xd5, 0xff, + 0x00, 0x55, 0xe9, 0x5e, 0x30, 0x4f, 0xfa, 0x9d, + 0xb0, 0xd9, 0xa9, 0xe3, 0xb2, 0xf7, 0x04, 0xea, + 0x74, 0xf8, 0x8a, 0x9b, 0x92, 0xc2, 0x69, 0x48, + 0xca, 0x82, 0xc1, 0x88, 0xb4, 0x8a, 0x74, 0xb8, + 0xbf, 0x5b, 0xd2, 0x9e, 0x3f, 0x37, 0x0e, 0x68, + 0x52, 0x78, 0xbd, 0x0a, 0x00, 0x54, 0x50, 0x75, + 0xb8, 0xa7, 0xd8, 0x8f, 0xee, 0x46, 0xc8, 0xc3, + 0x47, 0x1d, 0xe8, 0x9e, 0x0a, 0x6c, 0x5e, 0x51, + 0x07, 0x13, 0x9c, 0xee, 0x4e, 0x3c, 0xa4, 0x92, + 0x35, 0x8d, 0x8f, 0x87, 0x81, 0xa6, 0xb5, 0x9f, + 0xc2, 0x97, 0xe9, 0xb9, 0x0d, 0xae, 0x2f, 0xb8, + 0xed, 0xb9, 0xed, 0xda, 0x9f, 0xd5, 0x8c, 0xce, + 0xd1, 0x45, 0x14, 0x04, 0x19, 0xb3, 0xfd, 0x3e, + 0x33, 0xca, 0x3a, 0x81, 0xa5, 0x24, 0xc1, 0x8e, + 0x4c, 0xdc, 0xb8, 0xde, 0x76, 0xba, 0xa0, 0xdc, + 0x7b, 0xde, 0xde, 0x75, 0x77, 0x9c, 0xc9, 0x89, + 0x22, 0x48, 0x1c, 0xdb, 0xdc, 0x61, 0xbb, 0xfd, + 0xb5, 0x17, 0x13, 0x01, 0x1e, 0xec, 0xc3, 0x45, + 0xd1, 0x13, 0xf2, 0xd6, 0x81, 0x1d, 0xe5, 0xa7, + 0x54, 0x43, 0x60, 0x2b, 0x11, 0x9f, 0x95, 0xef, + 0xca, 0xca, 0x6c, 0x81, 0x7a, 0xdc, 0xf6, 0xad, + 0x7f, 0x39, 0x8f, 0x20, 0xc4, 0x69, 0xd2, 0xc5, + 0x93, 0x5b, 0x79, 0x57, 0xcf, 0x39, 0x1c, 0x8c, + 0x71, 0x39, 0xb1, 0x1b, 0x18, 0x80, 0xe4, 0x75, + 0x04, 0xf5, 0xab, 0xeb, 0xa5, 0x2d, 0x64, 0xac, + 0xf1, 0x28, 0xec, 0xf5, 0xb0, 0xd0, 0xab, 0x94, + 0x95, 0x04, 0x8d, 0x1a, 0x7a, 0xfc, 0xfe, 0x15, + 0x59, 0x18, 0x09, 0x54, 0x9d, 0x03, 0xae, 0xbf, + 0x1a, 0x61, 0xcd, 0xc9, 0x0c, 0x2c, 0xb8, 0xd1, + 0x40, 0x02, 0xad, 0x8b, 0x48, 0x7e, 0x6b, 0x1e, + 0xf4, 0xaf, 0x36, 0x45, 0x8f, 0x17, 0x7e, 0xe1, + 0xbc, 0x36, 0xd5, 0x1d, 0xec, 0x6a, 0x77, 0xea, + 0xae, 0xbd, 0x8e, 0x3f, 0x8c, 0xe0, 0xec, 0xb6, + 0xd5, 0x44, 0xef, 0xf1, 0x82, 0x86, 0x76, 0x4f, + 0xbd, 0x2e, 0xd1, 0xa2, 0xae, 0x9a, 0xf8, 0xd3, + 0xce, 0x3f, 0x8c, 0xe0, 0x25, 0xc1, 0x8d, 0x24, + 0x95, 0x5f, 0x20, 0xc8, 0x3d, 0xd6, 0x27, 0x69, + 0x02, 0xd7, 0xda, 0x2b, 0x33, 0xd7, 0x53, 0xaf, + 0x8d, 0x17, 0x22, 0xc4, 0x12, 0x3c, 0x2d, 0x59, + 0x9e, 0x56, 0xcb, 0xbb, 0x5d, 0xd9, 0xb9, 0x93, + 0x65, 0x93, 0xf6, 0x9c, 0x31, 0xa2, 0xe5, 0x61, + 0x65, 0x98, 0x11, 0x5c, 0x9d, 0x5a, 0xe1, 0x76, + 0x81, 0x6b, 0x37, 0x89, 0x26, 0xab, 0x62, 0xe5, + 0x7d, 0xc3, 0x80, 0xf3, 0x47, 0x83, 0x2a, 0xe6, + 0x2c, 0x64, 0x4b, 0x23, 0x91, 0xbf, 0xf7, 0x1b, + 0x4d, 0x09, 0xef, 0x59, 0xc3, 0x9d, 0x98, 0x62, + 0x30, 0x99, 0x98, 0xc4, 0x7a, 0xa9, 0x34, 0xcb, + 0x87, 0xfb, 0x9b, 0x27, 0x8a, 0x89, 0xa1, 0x48, + 0x96, 0x45, 0x73, 0x76, 0x27, 0xa9, 0x3e, 0x74, + 0x28, 0x50, 0xca, 0xc6, 0xe4, 0x12, 0x59, 0x24, + 0xc9, 0x8d, 0xc4, 0x85, 0xbf, 0x70, 0x9b, 0xfc, + 0xc7, 0x5d, 0x6b, 0x41, 0x26, 0x77, 0x05, 0x99, + 0xc5, 0x60, 0x26, 0x44, 0xd2, 0x44, 0xd8, 0x48, + 0xca, 0xf8, 0xe8, 0x2c, 0x5e, 0x4e, 0xcd, 0x7a, + 0xf4, 0xbf, 0x70, 0x71, 0xf9, 0x99, 0x2d, 0x24, + 0xae, 0xd1, 0x34, 0x91, 0xfa, 0x96, 0x41, 0xfb, + 0x62, 0x40, 0x2d, 0x7e, 0xf5, 0x4f, 0x99, 0x87, + 0x87, 0xfe, 0xdd, 0x1e, 0x46, 0x2b, 0xde, 0x6d, + 0x14, 0x0e, 0x9b, 0x87, 0x76, 0x22, 0x80, 0x75, + 0xf6, 0xac, 0x6c, 0x62, 0x7c, 0xb9, 0xdf, 0xdf, + 0x8f, 0x90, 0xfd, 0xb9, 0xe4, 0xdf, 0x69, 0xa1, + 0x55, 0xf9, 0x5a, 0xf5, 0x63, 0x37, 0xed, 0xcc, + 0x5e, 0x46, 0x6f, 0xa8, 0xe4, 0x33, 0x3d, 0xd2, + 0xea, 0xc3, 0x1e, 0x54, 0x16, 0x02, 0x34, 0xd1, + 0x19, 0xfc, 0x49, 0xac, 0x1e, 0x38, 0xc9, 0x73, + 0xed, 0x40, 0x5b, 0xd7, 0xd5, 0x57, 0xbf, 0xc6, + 0xb5, 0xfc, 0x42, 0x67, 0x62, 0xe3, 0xc7, 0x1e, + 0x44, 0xc6, 0x45, 0x4b, 0x14, 0x84, 0xfc, 0xab, + 0x6d, 0x45, 0x4a, 0x4d, 0x90, 0xda, 0x0c, 0x4f, + 0xff, 0x00, 0x9d, 0xbb, 0xc9, 0x19, 0x97, 0x20, + 0x11, 0xb4, 0x49, 0x34, 0x4b, 0xf3, 0x6d, 0xeb, + 0x4f, 0x23, 0xe0, 0xff, 0x00, 0xb7, 0xc0, 0x4c, + 0x10, 0xfb, 0x70, 0x82, 0x06, 0xbd, 0x75, 0xe9, + 0xba, 0xbb, 0x07, 0x35, 0x34, 0x4d, 0x23, 0xb2, + 0x87, 0x79, 0x99, 0x4b, 0xb7, 0x4f, 0x48, 0x37, + 0xda, 0x05, 0x31, 0x1c, 0xec, 0x13, 0xe4, 0x01, + 0xb9, 0xa2, 0x8d, 0x8e, 0xf6, 0x2d, 0xe2, 0x3e, + 0x55, 0xb7, 0x85, 0x5d, 0x27, 0x5e, 0x11, 0x59, + 0x91, 0x73, 0x89, 0x63, 0xb7, 0xb8, 0x85, 0x6f, + 0xd2, 0xf5, 0x98, 0xfb, 0xa3, 0x95, 0x2d, 0x2a, + 0x60, 0xa1, 0xba, 0xa8, 0xdd, 0x20, 0xbf, 0x7a, + 0xd5, 0x7d, 0xc7, 0xcb, 0x63, 0x88, 0xb7, 0xc6, + 0xc1, 0x96, 0x25, 0x2f, 0x25, 0xbe, 0x5d, 0xc7, + 0xad, 0xab, 0xe6, 0xaa, 0x64, 0xe4, 0x33, 0x89, + 0x6b, 0xb1, 0x99, 0xb5, 0xb7, 0x85, 0x2f, 0xb2, + 0x2a, 0xc9, 0xd7, 0x59, 0x68, 0xd6, 0x7d, 0xab, + 0xc8, 0x3a, 0x38, 0x46, 0x36, 0x03, 0xb6, 0xed, + 0x3f, 0x2a, 0xfa, 0x57, 0x15, 0x94, 0x19, 0x14, + 0x8b, 0x1e, 0xfd, 0x6c, 0x6b, 0x09, 0x85, 0xc1, + 0xf1, 0x49, 0xc7, 0x9c, 0x88, 0x1c, 0xc5, 0x9b, + 0x11, 0xd6, 0x29, 0x34, 0xdc, 0x3f, 0xd3, 0x5a, + 0x0e, 0x03, 0x24, 0x94, 0x5b, 0x81, 0xbb, 0xf2, + 0xac, 0x55, 0x95, 0xa2, 0x0e, 0xae, 0xb1, 0x58, + 0x7c, 0x9a, 0x1e, 0x4f, 0x10, 0x7b, 0xb1, 0xe5, + 0xa1, 0xb0, 0xea, 0x45, 0xf4, 0x06, 0xae, 0xf1, + 0xb9, 0xbf, 0x55, 0x11, 0xb8, 0xb3, 0x26, 0x84, + 0xf6, 0x3e, 0x62, 0xa1, 0xc8, 0x95, 0x7f, 0xb7, + 0x92, 0x7d, 0x5a, 0x8e, 0x9e, 0x15, 0x17, 0x0c, + 0x54, 0x48, 0xfb, 0x4e, 0xae, 0xbb, 0x98, 0x76, + 0xd0, 0xd8, 0x1a, 0xb1, 0xce, 0x37, 0xa2, 0x8a, + 0x28, 0x04, 0x1c, 0xcc, 0xb1, 0x1c, 0x82, 0x19, + 0x0b, 0xba, 0x0b, 0x01, 0xf1, 0xef, 0x56, 0xe1, + 0xdd, 0x8b, 0x81, 0x02, 0xc8, 0x40, 0x6b, 0x6e, + 0x6f, 0x89, 0xaa, 0xfc, 0xd3, 0x22, 0xe4, 0x0b, + 0x1d, 0xb2, 0x30, 0x00, 0x1b, 0x75, 0x3d, 0xb5, + 0xa9, 0xb9, 0x27, 0xdb, 0x12, 0xa9, 0x6d, 0x55, + 0x40, 0x24, 0xeb, 0xad, 0x09, 0x5c, 0x8b, 0x3e, + 0xe2, 0xcb, 0x92, 0x38, 0xd6, 0x48, 0x9c, 0x6c, + 0x61, 0x66, 0x07, 0xa5, 0x7c, 0xcf, 0x98, 0xdc, + 0x99, 0x22, 0x55, 0x22, 0xcc, 0x49, 0x20, 0x74, + 0xb8, 0xd6, 0xb4, 0xff, 0x00, 0x71, 0x67, 0xe4, + 0x49, 0x01, 0x85, 0x18, 0xdc, 0x6a, 0x74, 0xbd, + 0x65, 0x1d, 0xa6, 0x78, 0x8a, 0x4a, 0xbe, 0xe0, + 0xbe, 0x97, 0xeb, 0x7a, 0xb7, 0x68, 0x58, 0xe4, + 0xed, 0xd1, 0x57, 0x3f, 0x62, 0x7c, 0xac, 0xc4, + 0xce, 0x49, 0xb2, 0x9d, 0x7f, 0x74, 0xc6, 0x15, + 0x6d, 0xa0, 0x01, 0x7a, 0xde, 0xb3, 0x39, 0x99, + 0x1f, 0x51, 0x36, 0xe0, 0x2c, 0xaa, 0x2c, 0xa3, + 0xe1, 0x4c, 0x39, 0x2c, 0x95, 0x83, 0x1f, 0xe9, + 0x23, 0x52, 0x92, 0xb9, 0xbb, 0xf9, 0x2f, 0x85, + 0x27, 0xa3, 0xbb, 0xb4, 0x36, 0x65, 0xec, 0xec, + 0x4d, 0xaa, 0xf8, 0x0f, 0xf0, 0x68, 0xa2, 0x8a, + 0xa9, 0xcc, 0x14, 0x51, 0x5d, 0x55, 0x2c, 0x6c, + 0xba, 0x9f, 0x0a, 0x03, 0x95, 0x73, 0x07, 0x8d, + 0x9b, 0x2d, 0x85, 0xbd, 0x31, 0xf7, 0x73, 0xd8, + 0x79, 0x55, 0xac, 0x0e, 0x27, 0xa3, 0xe4, 0x7c, + 0x42, 0x7f, 0x9d, 0x39, 0x4d, 0xaa, 0xa1, 0x50, + 0x59, 0x45, 0x59, 0x22, 0x24, 0x30, 0xb0, 0xf1, + 0xf0, 0xd0, 0x2c, 0x43, 0xd5, 0xfa, 0x9c, 0xf5, + 0xab, 0x7b, 0xea, 0xb6, 0xfa, 0xf4, 0x1e, 0xae, + 0x9c, 0x15, 0x2c, 0x87, 0xae, 0x87, 0x3d, 0xea, + 0xbe, 0xfa, 0xe3, 0xcc, 0x23, 0x8d, 0xa4, 0x26, + 0xc1, 0x45, 0xe8, 0x98, 0x81, 0x67, 0xdc, 0xf9, + 0xf6, 0x8d, 0x31, 0x11, 0xb5, 0x6f, 0x54, 0x9f, + 0x0f, 0x0a, 0xf1, 0xf6, 0xa6, 0x12, 0x64, 0x66, + 0x85, 0x69, 0x86, 0x3b, 0x49, 0x61, 0x1b, 0xb6, + 0xa3, 0x75, 0x28, 0xc9, 0x95, 0xb3, 0x73, 0x19, + 0xcf, 0xff, 0x00, 0x61, 0xb0, 0x27, 0xa0, 0x1d, + 0xab, 0x6b, 0xc2, 0xe3, 0x2f, 0x0f, 0xc6, 0x99, + 0xf9, 0x8c, 0x61, 0x2e, 0x0c, 0xeb, 0xb6, 0x3c, + 0x98, 0xf5, 0x28, 0xfd, 0x89, 0x35, 0xcf, 0xba, + 0xf3, 0x83, 0xa3, 0x4d, 0x63, 0x2c, 0x9f, 0x9f, + 0xcf, 0x98, 0xe5, 0x45, 0xc6, 0xe4, 0x22, 0x26, + 0x5e, 0x20, 0xb2, 0xce, 0x9d, 0x24, 0x1d, 0xab, + 0x43, 0xf6, 0xf4, 0x70, 0xcf, 0x04, 0x4c, 0x92, + 0xed, 0xc8, 0x61, 0xfb, 0xb1, 0x30, 0xb5, 0x8d, + 0x61, 0x61, 0x59, 0x73, 0x39, 0x25, 0xc6, 0xf7, + 0xec, 0xee, 0x77, 0xe3, 0x4e, 0xe7, 0x42, 0x06, + 0xa0, 0x13, 0x5b, 0xce, 0x1e, 0x79, 0x18, 0xac, + 0x7c, 0x9c, 0x2a, 0x92, 0x2d, 0x80, 0xc8, 0x8f, + 0xb9, 0x1d, 0x2f, 0x6a, 0xca, 0x8e, 0x20, 0xbd, + 0x9b, 0x6c, 0xd4, 0x2c, 0x0d, 0x2e, 0x33, 0xc0, + 0xd6, 0x0c, 0x41, 0xb0, 0xed, 0x71, 0x54, 0xb8, + 0xbc, 0x81, 0x0e, 0x5e, 0xc9, 0x08, 0x55, 0x6f, + 0x45, 0xfb, 0xee, 0x1e, 0x35, 0x7f, 0x1a, 0x60, + 0xcc, 0xaa, 0x8f, 0xbc, 0x01, 0xa1, 0xa5, 0x13, + 0xc7, 0x2c, 0x79, 0xa3, 0x7a, 0xec, 0x05, 0xb5, + 0x6e, 0x83, 0xf1, 0xae, 0x84, 0x61, 0x6e, 0x4d, + 0x35, 0x15, 0xcf, 0xd1, 0x6f, 0x2e, 0xbf, 0x85, + 0x14, 0x20, 0xcf, 0xe7, 0xe4, 0x87, 0xcb, 0x91, + 0x6c, 0x58, 0x07, 0xd8, 0x47, 0x5d, 0x06, 0x9f, + 0x85, 0x4f, 0xc9, 0x13, 0xed, 0x8b, 0x12, 0x00, + 0x5b, 0x7f, 0x0a, 0x8d, 0x10, 0x4b, 0xc8, 0xc8, + 0x96, 0x16, 0x32, 0x35, 0xec, 0x75, 0x36, 0x35, + 0x27, 0x29, 0xa6, 0xe0, 0x2f, 0xa7, 0x4b, 0x74, + 0xa8, 0x7c, 0x16, 0xa7, 0x26, 0x13, 0x97, 0x95, + 0xd6, 0x47, 0x0b, 0x7b, 0xb5, 0x67, 0x98, 0x24, + 0x66, 0x4c, 0xac, 0x89, 0x0a, 0x2a, 0x02, 0x54, + 0x81, 0xa6, 0xe0, 0x2e, 0x05, 0x68, 0x79, 0x82, + 0xe5, 0xc8, 0xd4, 0xea, 0x75, 0x1d, 0x2b, 0x19, + 0xcc, 0x65, 0xcd, 0x21, 0x38, 0x43, 0xe4, 0x0c, + 0x0e, 0xd1, 0xd0, 0xb7, 0x8d, 0x56, 0xab, 0x27, + 0x75, 0xee, 0xa9, 0xab, 0x1c, 0xb1, 0x6e, 0x44, + 0xf2, 0x64, 0x4a, 0xf2, 0xc8, 0x6e, 0xce, 0x6f, + 0x73, 0x51, 0x79, 0xf8, 0xf4, 0xad, 0x57, 0xda, + 0x9f, 0x67, 0x66, 0x72, 0x1c, 0xda, 0x45, 0xc8, + 0xc0, 0xf0, 0x61, 0xc2, 0x04, 0xb3, 0xbc, 0x80, + 0x85, 0x2b, 0xe1, 0xb8, 0xe9, 0xad, 0x7b, 0xfb, + 0xbf, 0xed, 0xd8, 0xe0, 0xc9, 0xca, 0xca, 0xe3, + 0xe1, 0x64, 0xc5, 0x89, 0x82, 0xae, 0xcf, 0x52, + 0xec, 0xb6, 0xae, 0x48, 0xab, 0x9e, 0x7b, 0x72, + 0xe4, 0xc9, 0xff, 0x00, 0x4a, 0xe5, 0x77, 0x6d, + 0xb5, 0xed, 0xdb, 0xce, 0xad, 0x63, 0x61, 0x34, + 0x96, 0x69, 0x34, 0x5e, 0xb6, 0xa0, 0x21, 0x87, + 0x1e, 0x59, 0x9a, 0xc8, 0x34, 0xee, 0x69, 0xbe, + 0x26, 0x1c, 0x58, 0xe0, 0x5c, 0x5d, 0xfc, 0x68, + 0x8c, 0x24, 0x60, 0x2a, 0x0b, 0x0a, 0x90, 0x3d, + 0x4a, 0x40, 0xb0, 0x1f, 0xc6, 0xbb, 0xbe, 0xa0, + 0x0d, 0x5e, 0x83, 0x55, 0xb8, 0x2a, 0x4f, 0xbb, + 0xce, 0xbd, 0x6f, 0xaa, 0xfb, 0xeb, 0xd6, 0xfa, + 0x48, 0x27, 0x0d, 0x4b, 0xb9, 0xcc, 0xcd, 0x90, + 0x08, 0x14, 0xfa, 0xa4, 0xeb, 0xe4, 0x2a, 0xde, + 0xfb, 0x29, 0x62, 0x6d, 0x6a, 0xcf, 0xe4, 0xca, + 0xf9, 0x79, 0x64, 0x8d, 0x4b, 0x1d, 0xaa, 0x2a, + 0x1b, 0xc1, 0x29, 0x65, 0x17, 0x38, 0x4c, 0x14, + 0x9a, 0x51, 0x2c, 0xb1, 0x34, 0xd0, 0x6e, 0xda, + 0xe1, 0x01, 0x2c, 0x3c, 0xeb, 0x4d, 0xf7, 0x26, + 0x5c, 0x7c, 0x7e, 0x14, 0x58, 0xdc, 0x66, 0x47, + 0xd4, 0x71, 0x99, 0x0a, 0x04, 0xb0, 0xb6, 0xa6, + 0x37, 0xa9, 0x7e, 0xcc, 0xe3, 0x32, 0xb0, 0xf1, + 0x65, 0xe4, 0xf0, 0xe6, 0x8e, 0x51, 0x08, 0x3e, + 0xfe, 0x33, 0x75, 0xe9, 0xa8, 0xa4, 0xd9, 0x07, + 0x13, 0x3f, 0x90, 0xc9, 0xcb, 0x04, 0x45, 0x8a, + 0xe7, 0xf7, 0x63, 0x1d, 0x01, 0x27, 0x5b, 0x57, + 0x25, 0xad, 0x36, 0x67, 0x52, 0xac, 0x54, 0xb9, + 0xc5, 0xc4, 0x98, 0xd8, 0x9e, 0xcf, 0x21, 0x86, + 0xf2, 0xc5, 0x3f, 0xaf, 0x13, 0x29, 0x35, 0xda, + 0x07, 0xc2, 0xb6, 0x1c, 0x00, 0x9b, 0x17, 0x0f, + 0x76, 0xff, 0x00, 0x7a, 0x09, 0x35, 0x0a, 0xe6, + 0xec, 0x2b, 0x3d, 0x85, 0x0e, 0x66, 0x24, 0x61, + 0x70, 0x72, 0x97, 0x37, 0x01, 0x0d, 0x92, 0x30, + 0x77, 0x30, 0x53, 0xe5, 0x4e, 0xb1, 0xa3, 0x8f, + 0x25, 0x8b, 0x61, 0xab, 0xc5, 0x18, 0x00, 0x30, + 0x63, 0xa5, 0xfb, 0xda, 0xad, 0x5a, 0xcb, 0xfb, + 0x32, 0x63, 0x10, 0x6a, 0xb8, 0xb6, 0x24, 0x2b, + 0x58, 0x8b, 0x9f, 0x0d, 0x3a, 0xd4, 0x5c, 0xcb, + 0x86, 0xc9, 0xf4, 0x12, 0xc1, 0x6c, 0x58, 0x0b, + 0x11, 0xff, 0x00, 0xad, 0x7a, 0xe2, 0x18, 0x88, + 0x55, 0x08, 0x3a, 0x1b, 0x5e, 0xbc, 0xf2, 0xb1, + 0xfb, 0x19, 0x0c, 0xe7, 0xd6, 0x0f, 0xad, 0x47, + 0x98, 0xed, 0x5b, 0x98, 0x5f, 0x91, 0xdd, 0xc7, + 0xd3, 0xee, 0xff, 0x00, 0x45, 0xed, 0xf8, 0x51, + 0x46, 0xff, 0x00, 0xfa, 0xdb, 0xed, 0xfa, 0x2f, + 0x6f, 0xc2, 0x8a, 0x14, 0x10, 0xca, 0x5f, 0xfb, + 0xb5, 0xa3, 0x1b, 0x58, 0x39, 0x00, 0x8e, 0xa4, + 0xde, 0xac, 0x72, 0xaa, 0x75, 0xd0, 0x9b, 0x77, + 0xaf, 0x39, 0x7b, 0x71, 0xf9, 0x32, 0xe0, 0xd8, + 0xb3, 0x06, 0x3e, 0x40, 0xd4, 0xfc, 0x9a, 0xac, + 0x82, 0xe3, 0xd5, 0x71, 0xa1, 0x07, 0xc6, 0x8c, + 0xb5, 0x1e, 0x4f, 0x9e, 0x73, 0x93, 0x1c, 0x72, + 0xf2, 0x08, 0xc9, 0x62, 0x19, 0x45, 0xf4, 0x1a, + 0x8f, 0x0a, 0xc1, 0xc8, 0xe1, 0x32, 0x44, 0x8d, + 0x72, 0x15, 0x83, 0x35, 0xba, 0xe8, 0x6f, 0x5b, + 0x5f, 0xba, 0x01, 0x33, 0xba, 0x9d, 0x42, 0x74, + 0xd6, 0xb1, 0x39, 0x40, 0xef, 0x23, 0xa0, 0xbf, + 0x63, 0x50, 0x94, 0x17, 0xd9, 0x7e, 0xce, 0x3e, + 0x0f, 0xad, 0x4b, 0xf7, 0x64, 0x7c, 0x8f, 0x01, + 0x8d, 0xed, 0x62, 0x4a, 0xd0, 0xe4, 0xb7, 0xd3, + 0xbb, 0x2d, 0xf4, 0x08, 0x00, 0xd4, 0x8f, 0x13, + 0x4b, 0xbe, 0xf5, 0xcc, 0xc1, 0xe3, 0x7e, 0xde, + 0x6e, 0x3f, 0x03, 0x20, 0x4d, 0x97, 0xc8, 0x3a, + 0x7b, 0xaa, 0x8c, 0x1b, 0x6a, 0x81, 0xf2, 0xe9, + 0xd0, 0x56, 0x3e, 0x2f, 0xbb, 0x33, 0x53, 0xed, + 0xa5, 0xe0, 0x60, 0xfd, 0x95, 0x12, 0x16, 0x69, + 0x53, 0xa9, 0x5f, 0x0a, 0xf1, 0xc0, 0x61, 0xa6, + 0x46, 0x43, 0x64, 0x4f, 0xea, 0x86, 0x01, 0x77, + 0x63, 0xdd, 0x8e, 0x8a, 0xb7, 0xa9, 0xf0, 0x64, + 0x38, 0xc4, 0xe2, 0xe0, 0x5e, 0x25, 0x61, 0xcb, + 0x8d, 0x0c, 0x90, 0xa7, 0xb8, 0xf2, 0x90, 0x01, + 0x52, 0xdf, 0x22, 0x0f, 0x1d, 0x35, 0x34, 0xb3, + 0x23, 0x8a, 0xca, 0xc7, 0x48, 0xe4, 0x51, 0xee, + 0x47, 0x2a, 0x87, 0x8c, 0x8e, 0xa4, 0x13, 0xa5, + 0xbc, 0x69, 0x8e, 0x56, 0x2f, 0x2d, 0x0b, 0x4b, + 0x15, 0x97, 0x23, 0x1c, 0x3e, 0xf0, 0x18, 0xdb, + 0x56, 0x1d, 0x77, 0x77, 0xf2, 0xaf, 0x70, 0xf3, + 0x50, 0xae, 0x4e, 0x19, 0xce, 0x85, 0xe1, 0x30, + 0x28, 0x45, 0x24, 0x7a, 0x40, 0x1f, 0xa9, 0x45, + 0x4a, 0x02, 0x16, 0xdc, 0xa4, 0x86, 0x04, 0x11, + 0xa1, 0xb8, 0xb1, 0x06, 0x8d, 0xd4, 0xe7, 0x97, + 0xca, 0xc4, 0xfe, 0xdf, 0xb6, 0x36, 0x47, 0x9d, + 0xe4, 0x6d, 0xc4, 0x00, 0x4b, 0x29, 0x25, 0x83, + 0xdf, 0xa8, 0xb7, 0x4a, 0x42, 0x18, 0x69, 0x52, + 0x41, 0x30, 0x7a, 0xf4, 0x1a, 0xa1, 0xdd, 0x5d, + 0x0d, 0x49, 0x04, 0xe1, 0xab, 0xbb, 0xea, 0x1d, + 0xd5, 0xe8, 0x3e, 0x97, 0xa2, 0x04, 0x5c, 0x96, + 0x46, 0xcc, 0x72, 0x80, 0xd9, 0xdf, 0x4a, 0x93, + 0xed, 0x6e, 0x36, 0x4c, 0xac, 0x96, 0x9a, 0x34, + 0xf7, 0x5a, 0x1b, 0x10, 0x9d, 0x89, 0xbf, 0x4a, + 0x55, 0x95, 0x29, 0x9a, 0x72, 0x7a, 0x81, 0xe9, + 0x1f, 0x9d, 0x6e, 0x7e, 0xd5, 0xe1, 0xdd, 0x31, + 0x99, 0x71, 0x32, 0x96, 0x0c, 0xf8, 0xc7, 0xbf, + 0xb2, 0xff, 0x00, 0x35, 0xba, 0x2d, 0x65, 0xba, + 0xd8, 0x8f, 0x93, 0x5d, 0x55, 0xf3, 0xf0, 0x4d, + 0xce, 0x64, 0x61, 0x61, 0xf1, 0xdb, 0x78, 0xe0, + 0x70, 0xf9, 0x24, 0xff, 0x00, 0xf4, 0xc1, 0x7b, + 0x6e, 0x1d, 0xf4, 0xac, 0xff, 0x00, 0x1a, 0xb9, + 0x51, 0xb3, 0xf2, 0xb0, 0x40, 0xb9, 0x18, 0x72, + 0x7a, 0x72, 0x60, 0x61, 0xf2, 0x93, 0xe5, 0x5e, + 0x7e, 0xe0, 0xe4, 0xe7, 0xe5, 0x73, 0x8e, 0x71, + 0x8f, 0x6e, 0x5e, 0x39, 0xd9, 0x34, 0x60, 0x7c, + 0xd6, 0xd0, 0x9a, 0x63, 0xc6, 0x62, 0xa4, 0xd0, + 0xfd, 0x6f, 0x15, 0x97, 0xb5, 0xd8, 0x01, 0x36, + 0x23, 0x74, 0x27, 0xc0, 0x0a, 0xc6, 0xab, 0xad, + 0x67, 0xc9, 0xab, 0x63, 0x0e, 0x1b, 0x17, 0x0d, + 0xef, 0x99, 0xc7, 0xb8, 0xc5, 0x91, 0x41, 0xf7, + 0x22, 0x6d, 0x2c, 0x2d, 0xe1, 0x57, 0xf8, 0x0c, + 0xe6, 0x93, 0x29, 0xd2, 0x4e, 0x87, 0xc3, 0xa5, + 0xc7, 0x95, 0x2f, 0xca, 0x48, 0x13, 0x0d, 0xa3, + 0x9b, 0x1d, 0xa1, 0xcf, 0x90, 0xda, 0xfd, 0xb4, + 0xeb, 0x5d, 0xe1, 0x20, 0x95, 0x25, 0x0e, 0x14, + 0x81, 0x7b, 0x06, 0xbd, 0x5e, 0x94, 0x7d, 0x7f, + 0xb3, 0x34, 0xeb, 0xf8, 0xc9, 0xf4, 0x4c, 0x44, + 0x5b, 0xab, 0x28, 0x22, 0xfa, 0xf5, 0xaa, 0xdc, + 0xae, 0x4a, 0xbe, 0x4b, 0xfa, 0xac, 0xb1, 0x0d, + 0x01, 0x3d, 0x48, 0xab, 0x5c, 0x74, 0x2c, 0x61, + 0x86, 0x46, 0xf9, 0x9a, 0xd7, 0xaa, 0x73, 0xa4, + 0x52, 0x67, 0xcb, 0x1d, 0x85, 0xdd, 0xc1, 0x67, + 0x3a, 0xe9, 0xd3, 0x4a, 0xd5, 0x28, 0x50, 0x72, + 0x5f, 0x91, 0xe5, 0xff, 0x00, 0xeb, 0x5f, 0xfd, + 0x1f, 0xfc, 0x68, 0xaf, 0x7b, 0x07, 0xb7, 0xb3, + 0xb5, 0xad, 0xfc, 0x2d, 0x45, 0x49, 0x51, 0x5f, + 0x35, 0x1f, 0xee, 0x47, 0x20, 0x00, 0x9b, 0x5a, + 0xf6, 0xe9, 0xfc, 0x68, 0x51, 0xff, 0x00, 0x56, + 0x27, 0x75, 0x06, 0xe3, 0x4f, 0x3b, 0x54, 0x9c, + 0xc8, 0x1b, 0x62, 0xdd, 0xf2, 0xdc, 0x83, 0xfd, + 0x2a, 0x3c, 0x39, 0x84, 0xd8, 0x3b, 0x7a, 0xb4, + 0x46, 0xc4, 0x1f, 0x03, 0x42, 0x57, 0x26, 0x07, + 0xee, 0xb8, 0x3f, 0x7d, 0xd8, 0x28, 0xb3, 0x5c, + 0xd8, 0xf4, 0xac, 0x0e, 0x52, 0xed, 0x90, 0x92, + 0x00, 0x07, 0xc2, 0xbe, 0xb3, 0xcc, 0x71, 0x2f, + 0x9f, 0x39, 0x44, 0xb5, 0x80, 0x24, 0xd7, 0xce, + 0xb9, 0x8e, 0x1f, 0x26, 0x12, 0xd2, 0x28, 0x05, + 0x19, 0xca, 0x25, 0x87, 0x53, 0x7e, 0xd5, 0x5e, + 0xc9, 0x3c, 0xb2, 0xfd, 0x1b, 0xe0, 0x44, 0x1f, + 0xc0, 0x8d, 0x3b, 0xd5, 0xbc, 0x5e, 0x4f, 0x2b, + 0x1e, 0x26, 0x86, 0x37, 0xb4, 0x6e, 0x6e, 0x56, + 0xdd, 0xed, 0x6b, 0xd5, 0x79, 0xf0, 0x72, 0x62, + 0x2c, 0xcf, 0x19, 0x16, 0xee, 0x05, 0x57, 0x1b, + 0x87, 0x98, 0xf0, 0xa9, 0x4d, 0x32, 0x9d, 0x5a, + 0xe5, 0x1a, 0xac, 0x6f, 0xba, 0x03, 0xc5, 0xed, + 0xe4, 0x5f, 0x7b, 0xc6, 0x31, 0xde, 0xff, 0x00, + 0x2e, 0xd1, 0xa2, 0xb7, 0xc4, 0x53, 0x6e, 0x3f, + 0x2b, 0x17, 0x30, 0x3a, 0x4a, 0xeb, 0x24, 0x4a, + 0x04, 0x38, 0xd1, 0xb0, 0x04, 0x90, 0xa2, 0xec, + 0xe7, 0xe3, 0x58, 0x11, 0x25, 0xb4, 0xfe, 0x75, + 0x2a, 0x4c, 0xe8, 0x77, 0x23, 0x14, 0x23, 0xa5, + 0x8d, 0xbf, 0x95, 0x58, 0x83, 0x55, 0x97, 0xc4, + 0x62, 0xcd, 0xc8, 0x0c, 0x6c, 0x7b, 0xc5, 0x60, + 0x0c, 0x97, 0xe8, 0x19, 0xcf, 0xa5, 0x35, 0xf0, + 0x15, 0x53, 0x23, 0x81, 0xe4, 0x22, 0x92, 0x65, + 0x44, 0x2e, 0x91, 0x48, 0x62, 0x0c, 0x3f, 0x51, + 0x02, 0xf7, 0x15, 0x4a, 0x1f, 0xb8, 0x33, 0xd1, + 0x95, 0xa4, 0x61, 0x21, 0x4b, 0x15, 0x66, 0x02, + 0xf7, 0x1e, 0x7d, 0xe9, 0xfc, 0x1f, 0x75, 0x63, + 0xe4, 0xc6, 0x4c, 0xa4, 0x2e, 0x46, 0xd2, 0x02, + 0xb5, 0xf6, 0x97, 0x6f, 0x99, 0xb4, 0xf2, 0xe9, + 0x4e, 0x08, 0x83, 0x3a, 0xeb, 0x2c, 0x4d, 0xb6, + 0x44, 0x28, 0xc3, 0xaa, 0xb6, 0x84, 0x57, 0x37, + 0x7f, 0x0a, 0xd2, 0x89, 0xf8, 0xd9, 0x78, 0xd9, + 0xd3, 0x20, 0x24, 0xb2, 0xe3, 0x32, 0x4a, 0x35, + 0xb9, 0x72, 0xfa, 0x04, 0x07, 0xad, 0x85, 0x43, + 0x2f, 0x07, 0x85, 0x90, 0xef, 0x0e, 0x29, 0x68, + 0xf2, 0x20, 0x8d, 0x64, 0x9d, 0x7a, 0x80, 0x4e, + 0xbb, 0x40, 0x1e, 0x14, 0x02, 0x2d, 0xe3, 0xe3, + 0x51, 0x65, 0x4d, 0xb2, 0x23, 0x63, 0xea, 0x6d, + 0x07, 0xc2, 0xbd, 0xcc, 0x9e, 0xd4, 0xaf, 0x1d, + 0xc3, 0x6c, 0x24, 0x5c, 0x79, 0x55, 0x1c, 0x99, + 0x0c, 0x92, 0x5b, 0xb2, 0xe9, 0xf8, 0xd2, 0x60, + 0x24, 0x4f, 0xc4, 0xe1, 0x49, 0x99, 0x9b, 0x1c, + 0x51, 0xa9, 0x76, 0xbe, 0xeb, 0x0e, 0xf6, 0xad, + 0xa6, 0x7c, 0xf8, 0x53, 0xf1, 0x9e, 0xda, 0xc6, + 0xdc, 0x7f, 0x3d, 0x8d, 0xf2, 0x81, 0x75, 0x2c, + 0xa2, 0x95, 0xfd, 0xa3, 0xc0, 0x64, 0x65, 0xcc, + 0x5b, 0x17, 0x2c, 0x63, 0x66, 0xa2, 0xfb, 0x89, + 0x19, 0x1a, 0x90, 0x35, 0xfe, 0x35, 0xcf, 0xb9, + 0x39, 0x5c, 0xae, 0x4f, 0x21, 0x4c, 0xf1, 0x88, + 0xb9, 0x1c, 0x11, 0xb5, 0xec, 0x2d, 0xbe, 0xda, + 0x76, 0xae, 0x7b, 0xe6, 0xdf, 0x63, 0xa6, 0xaa, + 0x2b, 0xf5, 0x2a, 0xf1, 0x6f, 0x9d, 0x3e, 0x40, + 0xce, 0xc3, 0x8d, 0x66, 0xca, 0xc6, 0x07, 0xea, + 0x21, 0x3f, 0xad, 0x7b, 0x9b, 0x77, 0xa7, 0x9c, + 0x0e, 0x2a, 0x64, 0x64, 0xb4, 0xeb, 0x6c, 0x3c, + 0x98, 0xc9, 0x92, 0xcc, 0x36, 0x8b, 0xdf, 0xa5, + 0x8d, 0x53, 0xc0, 0xc5, 0xc3, 0x78, 0xa0, 0xe4, + 0x78, 0xac, 0xaf, 0x67, 0x38, 0x03, 0xf5, 0x10, + 0xb7, 0x52, 0x69, 0xea, 0x4d, 0x8a, 0xb8, 0xbf, + 0xf7, 0xd0, 0x8c, 0xb6, 0xb9, 0x69, 0x17, 0x4b, + 0xf8, 0x55, 0x5b, 0x96, 0x91, 0x35, 0xac, 0xb2, + 0x87, 0x2b, 0x99, 0x95, 0x2e, 0x77, 0xb7, 0x92, + 0xca, 0xc5, 0x7f, 0x58, 0xf1, 0x34, 0xd7, 0x87, + 0xb3, 0x05, 0x1b, 0x76, 0xed, 0x01, 0x7c, 0xbe, + 0x35, 0x99, 0x86, 0x32, 0xd9, 0x2c, 0xae, 0xd7, + 0x0c, 0x7d, 0x05, 0xae, 0x6b, 0x5f, 0xf6, 0xfe, + 0x23, 0x30, 0x3b, 0x88, 0x01, 0x7b, 0xf6, 0xad, + 0x95, 0x9b, 0x84, 0xbc, 0x1d, 0x1b, 0x17, 0x5a, + 0x9b, 0x1e, 0x37, 0x71, 0x89, 0x46, 0x96, 0x51, + 0xd4, 0x55, 0x08, 0x63, 0x79, 0x79, 0x01, 0x0d, + 0xc1, 0x00, 0x82, 0xcd, 0x6b, 0x1d, 0x0d, 0xcf, + 0xf2, 0xab, 0x89, 0x2f, 0xd1, 0x61, 0xb3, 0xd8, + 0x31, 0xb5, 0x94, 0x01, 0xdc, 0xd4, 0x3c, 0x54, + 0x2f, 0x2e, 0x40, 0xc9, 0x27, 0xe5, 0xbd, 0xc0, + 0xd3, 0x53, 0xd2, 0xae, 0x79, 0xf6, 0xe4, 0x73, + 0x45, 0x76, 0x8a, 0x10, 0x57, 0xce, 0xc7, 0x49, + 0xf1, 0xd9, 0x58, 0x02, 0x40, 0x25, 0x49, 0xec, + 0x45, 0x27, 0xe2, 0xd8, 0xae, 0x53, 0x45, 0x7b, + 0xac, 0xaa, 0x76, 0x9f, 0xf6, 0xeb, 0xad, 0x3f, + 0x35, 0x9d, 0xde, 0x31, 0xb2, 0xc4, 0x96, 0xda, + 0x62, 0x72, 0x4f, 0x98, 0xbf, 0x4a, 0x02, 0x4c, + 0xa2, 0xd1, 0x3b, 0xb0, 0xb1, 0x2c, 0xa4, 0x74, + 0xb7, 0x5a, 0xcd, 0x49, 0x91, 0x82, 0xd9, 0x78, + 0x71, 0xe4, 0xa0, 0x11, 0xc4, 0xb2, 0x13, 0x71, + 0xd5, 0xfb, 0x56, 0xc9, 0xe3, 0x86, 0x7b, 0x49, + 0x1b, 0x6e, 0x8c, 0xfa, 0x89, 0x15, 0x96, 0xe5, + 0x78, 0xa3, 0xfb, 0x33, 0xa8, 0x37, 0x79, 0x8a, + 0xa8, 0xb7, 0xe9, 0x6a, 0xcb, 0x65, 0x65, 0xc9, + 0xb6, 0xbb, 0x89, 0x1b, 0x8d, 0x87, 0x33, 0x1b, + 0x09, 0x23, 0x65, 0x32, 0x66, 0xce, 0xe5, 0xff, + 0x00, 0xd2, 0x82, 0xf4, 0x8b, 0x37, 0xed, 0x68, + 0x99, 0x32, 0x72, 0x54, 0x6c, 0x8a, 0x29, 0xbe, + 0x9e, 0x3d, 0xbd, 0xd8, 0x9b, 0x5e, 0xac, 0x64, + 0xc3, 0xc8, 0xf1, 0xd9, 0x12, 0xcd, 0x0b, 0x37, + 0xb5, 0x81, 0x3e, 0xd3, 0xe0, 0x37, 0xe9, 0x5c, + 0x4e, 0x67, 0x27, 0x1f, 0x1b, 0xd8, 0x98, 0x6f, + 0x48, 0x32, 0xd6, 0x69, 0x01, 0xeb, 0xb5, 0x8d, + 0xc1, 0xac, 0xbf, 0x2a, 0xbc, 0x1b, 0x62, 0xdc, + 0x88, 0xb3, 0xfe, 0xdb, 0xcb, 0xc4, 0x92, 0x54, + 0x5f, 0xdc, 0x10, 0x80, 0x5f, 0xc4, 0x03, 0x4a, + 0x5e, 0x29, 0x23, 0x0a, 0x59, 0x4a, 0x86, 0xd5, + 0x4d, 0x7d, 0x09, 0xf9, 0x8c, 0x0c, 0xcc, 0x6e, + 0x5d, 0x98, 0x6c, 0x9f, 0x22, 0x48, 0xd5, 0x01, + 0xd3, 0xf6, 0xcd, 0xb5, 0xa9, 0xb2, 0xf8, 0x4e, + 0x2f, 0x27, 0x32, 0x48, 0x53, 0x69, 0x8b, 0x07, + 0x0d, 0x64, 0xbf, 0x6b, 0xb5, 0x5e, 0xbb, 0x23, + 0x93, 0x3b, 0x6a, 0x4f, 0x83, 0xe6, 0xdb, 0x88, + 0x15, 0xe8, 0x38, 0xed, 0xd6, 0xb4, 0xb9, 0x5f, + 0x6a, 0xc8, 0xf1, 0xe0, 0xac, 0x40, 0x7b, 0xf9, + 0xb7, 0x65, 0xb7, 0x4d, 0xa3, 0x5a, 0x59, 0x3f, + 0xdb, 0xbc, 0x8c, 0x6d, 0x21, 0x58, 0xcb, 0x45, + 0x11, 0xda, 0x5c, 0x78, 0x8a, 0xd5, 0x6d, 0xab, + 0x33, 0x7a, 0xac, 0xbe, 0xa5, 0x28, 0x72, 0x24, + 0x89, 0x83, 0xa3, 0x58, 0xa9, 0x04, 0x7c, 0x47, + 0x4a, 0x6d, 0x85, 0xf7, 0x16, 0x46, 0x33, 0xb4, + 0xcd, 0x1a, 0xcb, 0x90, 0xc4, 0xb7, 0xba, 0x49, + 0x06, 0xe4, 0x5b, 0x5b, 0x68, 0x69, 0x34, 0x98, + 0xf9, 0x10, 0x9b, 0x48, 0x8c, 0xbe, 0x64, 0x54, + 0x61, 0xfc, 0x7a, 0x8a, 0xb2, 0x69, 0xf9, 0x28, + 0xd3, 0x5c, 0xa2, 0xd4, 0xb3, 0x93, 0xb9, 0xcf, + 0x56, 0x24, 0xe9, 0xe2, 0x7b, 0xd7, 0x9e, 0x3f, + 0x14, 0xe5, 0x65, 0x47, 0x10, 0x04, 0x92, 0x6e, + 0x6d, 0x50, 0x5d, 0x9c, 0xd9, 0x45, 0xef, 0x56, + 0xb0, 0x79, 0x09, 0xb8, 0xd7, 0xf7, 0x51, 0x2d, + 0x2d, 0xc3, 0x29, 0x3e, 0x15, 0x5b, 0xb9, 0x4d, + 0x22, 0x68, 0x9c, 0xc9, 0xb5, 0xb7, 0x16, 0xfc, + 0x4c, 0x92, 0x40, 0x1b, 0x03, 0x9c, 0xc3, 0xff, + 0x00, 0x8c, 0x5c, 0x82, 0xea, 0x29, 0x0e, 0x12, + 0xf2, 0x39, 0xd9, 0x03, 0x92, 0x82, 0x3f, 0x7f, + 0x27, 0x18, 0xee, 0xc9, 0x8b, 0xff, 0x00, 0x25, + 0xef, 0x53, 0xf3, 0xbc, 0xec, 0x7c, 0xfa, 0xc1, + 0x9b, 0x02, 0x08, 0xb2, 0x60, 0x40, 0x26, 0x0b, + 0xa5, 0xed, 0x56, 0xb8, 0xbc, 0x3c, 0xb8, 0x23, + 0x87, 0x96, 0xe1, 0x72, 0x83, 0x4f, 0x2a, 0x91, + 0x91, 0x8c, 0x6d, 0x7b, 0x0e, 0xba, 0x56, 0x1c, + 0x1b, 0xcc, 0x97, 0x70, 0xa0, 0xe3, 0xb9, 0x5c, + 0xe5, 0x6c, 0x48, 0x0e, 0x16, 0x5b, 0x5d, 0xe4, + 0x46, 0xd1, 0x7d, 0x3d, 0xab, 0xbc, 0xde, 0x76, + 0x5a, 0x13, 0x8d, 0x99, 0x12, 0x83, 0xd9, 0xd7, + 0xc2, 0xa7, 0x83, 0x33, 0x17, 0x28, 0x7b, 0xb9, + 0xa8, 0x70, 0xf3, 0x56, 0xea, 0xce, 0xa2, 0xca, + 0x47, 0x9d, 0x2b, 0xc9, 0x90, 0xe4, 0x65, 0x6d, + 0x67, 0x32, 0xc6, 0x6e, 0xaa, 0x4f, 0x80, 0xab, + 0x6b, 0x53, 0x93, 0x7d, 0x35, 0xc9, 0x37, 0x1b, + 0x0e, 0xf6, 0x0a, 0x35, 0x07, 0x55, 0x36, 0xd6, + 0xb7, 0x3c, 0x3c, 0x04, 0x22, 0x37, 0x4d, 0xda, + 0x11, 0x6b, 0x8a, 0xcd, 0xf0, 0x98, 0x84, 0xa8, + 0x1a, 0xdd, 0x0f, 0x87, 0x6a, 0xdc, 0x71, 0xb8, + 0xdb, 0x42, 0x80, 0x74, 0x26, 0xf6, 0xb5, 0xaa, + 0xf5, 0x99, 0x94, 0x47, 0xb5, 0x7f, 0x04, 0x9c, + 0x9e, 0xd8, 0xf1, 0x10, 0x5f, 0xd4, 0x4d, 0xc7, + 0x8f, 0xe5, 0x52, 0x70, 0xd7, 0x30, 0xb9, 0xb8, + 0x20, 0xb6, 0x96, 0x37, 0xaa, 0x39, 0xe9, 0xf5, + 0x79, 0xcd, 0x1e, 0xa4, 0x82, 0xa8, 0x2d, 0xd9, + 0x41, 0xf5, 0x53, 0x9c, 0x6c, 0x68, 0xf1, 0xe2, + 0x11, 0x27, 0x41, 0xd6, 0xb4, 0x38, 0x09, 0xa8, + 0xa2, 0x8a, 0x00, 0xa5, 0x1c, 0xce, 0x28, 0x58, + 0x8e, 0x42, 0xb5, 0xae, 0x40, 0x61, 0x6d, 0x35, + 0xef, 0x4d, 0xea, 0x2c, 0x98, 0x84, 0xd0, 0x3c, + 0x44, 0x5f, 0x70, 0x22, 0xc6, 0x80, 0x5b, 0xc3, + 0xb8, 0x68, 0x5e, 0x16, 0x1a, 0xa8, 0xbd, 0x87, + 0x81, 0xa9, 0x32, 0xa2, 0x56, 0x28, 0x08, 0xb8, + 0x8c, 0x6e, 0x17, 0xe8, 0x0f, 0x8d, 0x2e, 0xc5, + 0x69, 0xb8, 0xc9, 0xc8, 0x74, 0xb0, 0xbf, 0xac, + 0x79, 0x1a, 0x65, 0xef, 0x47, 0x93, 0x06, 0xf4, + 0xbe, 0xd7, 0xfe, 0x9d, 0xaf, 0x55, 0xb2, 0x94, + 0x4d, 0x5c, 0x33, 0x29, 0xcb, 0x70, 0x32, 0x4d, + 0x88, 0xe5, 0x1f, 0xf6, 0xe4, 0x97, 0xdc, 0x9b, + 0x77, 0xea, 0x20, 0xe8, 0x05, 0x2b, 0xe5, 0x38, + 0x60, 0x31, 0x79, 0x3c, 0xe9, 0x94, 0x6e, 0x9a, + 0x05, 0x48, 0x54, 0x0e, 0x8d, 0xdb, 0xf1, 0xad, + 0x66, 0x70, 0x03, 0xa9, 0x2a, 0x91, 0x8d, 0x14, + 0xf4, 0x26, 0x97, 0xcd, 0x0a, 0x1c, 0x5c, 0x54, + 0x94, 0x93, 0x23, 0xcf, 0xbf, 0x69, 0xe9, 0xb7, + 0xcf, 0xe1, 0x5c, 0xf6, 0xad, 0x93, 0x93, 0xa5, + 0x39, 0x46, 0x1f, 0x2f, 0x80, 0x99, 0x73, 0xe3, + 0xc6, 0xf9, 0x5a, 0x7c, 0x11, 0x2c, 0xa4, 0xf6, + 0x65, 0xaa, 0x91, 0x49, 0x99, 0x1a, 0x63, 0xe4, + 0x5d, 0x91, 0x33, 0xa2, 0x6c, 0x6f, 0xf7, 0x14, + 0xe9, 0x5b, 0xcc, 0xec, 0x53, 0x29, 0xe4, 0xa6, + 0x5b, 0x49, 0x2f, 0xa6, 0x25, 0x91, 0x7f, 0x4c, + 0x64, 0x58, 0xda, 0x94, 0x9e, 0x18, 0x1e, 0x47, + 0x8d, 0xc7, 0xb6, 0xcc, 0x6e, 0x39, 0x0c, 0x8f, + 0xbb, 0xa3, 0x77, 0xb8, 0xa8, 0xec, 0xa7, 0x39, + 0x25, 0x60, 0x51, 0x85, 0xce, 0xe4, 0x43, 0x2f, + 0x1b, 0x3c, 0xd6, 0x73, 0x86, 0x1f, 0x1f, 0x60, + 0x1a, 0x86, 0x3e, 0x91, 0x56, 0x70, 0x79, 0x3c, + 0x4c, 0x8e, 0x2f, 0x1f, 0x1a, 0x73, 0xb2, 0x7f, + 0xae, 0x3e, 0xf9, 0xbd, 0xbd, 0x2c, 0xd7, 0xb5, + 0x55, 0xcc, 0xe3, 0xb6, 0x71, 0xd3, 0x4e, 0x8b, + 0x79, 0xb3, 0x33, 0x43, 0x63, 0x81, 0xd7, 0x6d, + 0xfa, 0xda, 0x8e, 0x43, 0x84, 0x23, 0x90, 0xe4, + 0xa1, 0x83, 0x4f, 0x62, 0x14, 0xc9, 0xf8, 0x3a, + 0x80, 0x4d, 0x59, 0x40, 0xec, 0xc6, 0x3c, 0xde, + 0x36, 0x3c, 0xcd, 0xc9, 0x1f, 0x41, 0xc7, 0xc3, + 0x55, 0x28, 0x00, 0xf5, 0x1b, 0x8a, 0xc6, 0xf2, + 0x5c, 0x76, 0x2e, 0x27, 0xb4, 0xcc, 0x4e, 0xd9, + 0x17, 0x78, 0x1d, 0xec, 0x7b, 0x53, 0x9b, 0xe7, + 0x16, 0x2d, 0x62, 0xbf, 0xdd, 0x31, 0xfe, 0x43, + 0xad, 0xd9, 0x69, 0x47, 0x2e, 0xad, 0x91, 0x87, + 0x8d, 0x29, 0x3e, 0xa5, 0xfd, 0xb9, 0x3c, 0x88, + 0xd2, 0xd5, 0x35, 0x79, 0x22, 0xf9, 0x52, 0x51, + 0x92, 0x4c, 0x7c, 0x66, 0x59, 0x21, 0x3b, 0xdb, + 0x50, 0x54, 0xf8, 0x55, 0x5c, 0x9c, 0xd9, 0x72, + 0x0a, 0xef, 0xb7, 0xa0, 0x58, 0x58, 0x57, 0x87, + 0x88, 0x05, 0xdf, 0x7b, 0xd1, 0x14, 0x46, 0x42, + 0x14, 0x75, 0x35, 0xba, 0xc6, 0x4c, 0x3f, 0x26, + 0xfa, 0xa5, 0xc9, 0x73, 0x8b, 0x94, 0xe3, 0xca, + 0x92, 0x68, 0xc8, 0x4f, 0xee, 0x2f, 0x88, 0xad, + 0xce, 0x37, 0x17, 0x83, 0x92, 0x46, 0x5f, 0x0a, + 0xcc, 0x92, 0x15, 0xdc, 0x60, 0xbf, 0x7f, 0xd5, + 0x58, 0x98, 0x78, 0xf2, 0x7c, 0x40, 0xf1, 0xa7, + 0x3c, 0x4c, 0xb9, 0xfc, 0x74, 0xde, 0xee, 0x24, + 0xc6, 0xea, 0x2d, 0x63, 0xe1, 0x59, 0x5d, 0x2b, + 0x1d, 0x74, 0xf5, 0xee, 0x96, 0x51, 0xa6, 0xcd, + 0xcb, 0xc6, 0x92, 0x3f, 0x6b, 0x2a, 0x03, 0x14, + 0xec, 0x36, 0x86, 0xed, 0x71, 0x54, 0x30, 0x70, + 0xcb, 0x3b, 0x20, 0xdd, 0xa1, 0xba, 0x90, 0x35, + 0xaf, 0x53, 0xe6, 0xe4, 0x72, 0xb1, 0x21, 0x95, + 0x3d, 0x48, 0xd7, 0xd2, 0xda, 0xe9, 0x4f, 0xb8, + 0x7e, 0x3e, 0xe6, 0x36, 0x20, 0x9b, 0x8b, 0x10, + 0x35, 0xa9, 0xaa, 0x85, 0x06, 0xb2, 0xa9, 0x59, + 0xf2, 0x33, 0xe2, 0x30, 0x76, 0x95, 0x36, 0x60, + 0x18, 0x75, 0xad, 0x2e, 0xf4, 0xc5, 0xc7, 0x67, + 0x26, 0xe4, 0x0b, 0x2f, 0x89, 0xaa, 0xf8, 0x18, + 0x81, 0x40, 0xb5, 0xc5, 0xb4, 0x3a, 0xd5, 0x1e, + 0x46, 0x51, 0x26, 0x43, 0x85, 0x52, 0xcc, 0x0e, + 0xc4, 0x37, 0xd0, 0x76, 0xe9, 0xf1, 0xad, 0x17, + 0x07, 0x06, 0xdb, 0xbb, 0x32, 0xc7, 0x0e, 0xa2, + 0x5c, 0xb9, 0x26, 0x20, 0x9b, 0x0b, 0xdc, 0x9b, + 0x8b, 0xde, 0x9d, 0xd5, 0x7c, 0x2c, 0x51, 0x8d, + 0x02, 0xc7, 0xd5, 0x80, 0xf5, 0x9f, 0x13, 0x56, + 0x2a, 0x4c, 0xc2, 0x8a, 0x28, 0xa0, 0x0a, 0x28, + 0xa2, 0x80, 0x5f, 0xcc, 0x42, 0x1f, 0x1b, 0xdc, + 0x0b, 0xba, 0x45, 0xf9, 0x6a, 0x8f, 0x10, 0xfb, + 0x5f, 0xd8, 0x76, 0x07, 0x7f, 0x5f, 0x26, 0xa7, + 0x6e, 0x81, 0xd4, 0xa9, 0xe8, 0x74, 0x34, 0x93, + 0x90, 0xe3, 0xa5, 0xc5, 0xfd, 0xfc, 0x76, 0xf4, + 0x0d, 0x6f, 0xdd, 0x48, 0xf3, 0xa0, 0x26, 0xce, + 0xc4, 0x0e, 0xac, 0x36, 0xf4, 0xd4, 0x6b, 0x59, + 0xcc, 0xf4, 0xc9, 0x8f, 0x76, 0xd0, 0x6e, 0xab, + 0xe9, 0xb9, 0xe9, 0x5a, 0x6c, 0x6e, 0x42, 0x2c, + 0x98, 0xf6, 0xca, 0x36, 0x4a, 0xa0, 0x06, 0xf0, + 0x3f, 0x8d, 0x45, 0x99, 0x82, 0xaf, 0x73, 0xb4, + 0x74, 0xb0, 0x35, 0x0d, 0x1a, 0xd2, 0xf1, 0xc9, + 0x91, 0x8b, 0x90, 0xf6, 0x71, 0x12, 0x13, 0x75, + 0x2e, 0xf7, 0x9e, 0xfa, 0xdc, 0x0a, 0xb2, 0x9c, + 0xc6, 0x3e, 0x4a, 0x64, 0x64, 0xcd, 0x62, 0x91, + 0xa1, 0x82, 0x18, 0xae, 0x01, 0x35, 0xce, 0x47, + 0x89, 0xb1, 0x1e, 0x80, 0x59, 0x6f, 0xf8, 0x0a, + 0xcf, 0x64, 0xe0, 0xc9, 0x19, 0xda, 0x16, 0xc0, + 0x9d, 0xe7, 0x5e, 0xd5, 0x9d, 0xb5, 0xd7, 0x93, + 0xa9, 0x25, 0x65, 0x2b, 0x91, 0xfe, 0x36, 0x1c, + 0x2c, 0x38, 0xd8, 0x0d, 0xdf, 0x28, 0x6e, 0x3b, + 0x6d, 0xa0, 0x06, 0xe7, 0xf9, 0xd5, 0x1c, 0x95, + 0xc8, 0x8b, 0x07, 0x92, 0xca, 0xdb, 0xff, 0x00, + 0x61, 0xa4, 0xf6, 0x65, 0x73, 0xff, 0x00, 0x8f, + 0x4a, 0xa5, 0xc6, 0x72, 0x99, 0xd8, 0xb9, 0x4d, + 0x98, 0xc2, 0xe1, 0x14, 0xa2, 0x13, 0xda, 0xac, + 0x9e, 0x7e, 0x39, 0x70, 0x13, 0x0f, 0x6f, 0xaf, + 0x26, 0x5d, 0xd3, 0x93, 0xd2, 0xd7, 0xb9, 0xaa, + 0x3d, 0x6f, 0xc0, 0x7a, 0xec, 0xbc, 0x11, 0x71, + 0xd1, 0x9c, 0x9e, 0x63, 0x10, 0x29, 0x06, 0x3e, + 0x3a, 0x32, 0xcc, 0x0f, 0x89, 0x1f, 0xca, 0xa9, + 0x66, 0x70, 0x8d, 0xfd, 0x8f, 0x37, 0x22, 0x4b, + 0x03, 0x26, 0x43, 0x49, 0x1a, 0xf8, 0x0b, 0xeb, + 0x6a, 0xd3, 0xe0, 0x4f, 0xc6, 0x4d, 0x95, 0x3c, + 0xa0, 0x20, 0x86, 0x08, 0xf6, 0x3e, 0xdd, 0x09, + 0xd3, 0xfc, 0xea, 0x97, 0x38, 0x12, 0x3e, 0x1a, + 0x19, 0x05, 0xd5, 0x4b, 0xb6, 0xd5, 0xf1, 0x07, + 0x51, 0x55, 0x4a, 0xea, 0xcb, 0x1e, 0x48, 0x54, + 0x6d, 0xc3, 0x3e, 0x6e, 0x70, 0xcc, 0xac, 0xaa, + 0xbf, 0x2a, 0x8b, 0x1f, 0x8d, 0x5c, 0xc7, 0xc1, + 0x58, 0x6c, 0xdb, 0x77, 0x5e, 0xae, 0xfd, 0x39, + 0x40, 0xcf, 0xb4, 0x01, 0x6f, 0xe3, 0x5d, 0x30, + 0x64, 0x04, 0x55, 0x81, 0x37, 0xbb, 0x10, 0x34, + 0xf1, 0x35, 0xac, 0xbe, 0xd9, 0xe0, 0xb5, 0xe8, + 0xb5, 0xa9, 0x8c, 0xbe, 0x0e, 0x08, 0xe4, 0x63, + 0x64, 0x16, 0x1e, 0x15, 0x77, 0x0f, 0x0d, 0x9a, + 0xca, 0x54, 0xde, 0xfd, 0x69, 0xaf, 0x05, 0xf6, + 0x7e, 0x77, 0xb2, 0xf9, 0x59, 0xa6, 0xd7, 0x04, + 0x84, 0xf8, 0x53, 0x5c, 0x0e, 0x1e, 0xf2, 0xea, + 0xa3, 0x4e, 0xf5, 0x31, 0x2e, 0x50, 0xa7, 0xb0, + 0xd7, 0x2c, 0xad, 0xc5, 0xf1, 0x56, 0x90, 0x8d, + 0xa6, 0xcd, 0xa8, 0x15, 0xad, 0xe3, 0x30, 0x04, + 0x68, 0x01, 0x4b, 0x5b, 0xa6, 0xb4, 0x60, 0xf1, + 0xe1, 0x4a, 0xb1, 0x51, 0x71, 0x4c, 0x66, 0x64, + 0xc3, 0xc6, 0x66, 0x00, 0x7b, 0x84, 0x1d, 0x8b, + 0xe7, 0x57, 0x48, 0xe7, 0xdd, 0xb6, 0x5b, 0x22, + 0xc9, 0xcf, 0x18, 0xed, 0xec, 0x46, 0xbe, 0xa2, + 0x3d, 0x4d, 0x7e, 0x9e, 0x55, 0x5f, 0x8f, 0xc1, + 0x79, 0xe4, 0xfa, 0x87, 0xdc, 0xa9, 0xba, 0xe0, + 0x1e, 0xfe, 0x62, 0xa1, 0xe3, 0x31, 0x93, 0x22, + 0x70, 0x64, 0x62, 0x58, 0x0d, 0xce, 0x7b, 0x93, + 0xe0, 0x6b, 0x42, 0x00, 0x02, 0xc3, 0x40, 0x3a, + 0x54, 0x9c, 0xe0, 0x2b, 0xb4, 0x51, 0x40, 0x14, + 0x51, 0x45, 0x00, 0x51, 0x45, 0x14, 0x01, 0x5c, + 0x20, 0x11, 0x63, 0xa8, 0xf0, 0xae, 0xd1, 0x40, + 0x20, 0xe5, 0xf0, 0xfe, 0x96, 0xd9, 0x10, 0xa0, + 0x11, 0x9d, 0x1c, 0x01, 0xd0, 0x1e, 0xd5, 0x77, + 0x0f, 0x2a, 0x0c, 0x88, 0x92, 0x37, 0x60, 0x24, + 0xb7, 0x7b, 0x12, 0x40, 0xab, 0xf2, 0xc6, 0xb2, + 0x21, 0x46, 0x17, 0x56, 0xd0, 0x8a, 0x47, 0x91, + 0xc7, 0xcb, 0x8a, 0xc5, 0xd0, 0x7e, 0xd0, 0x05, + 0xae, 0x3a, 0xf9, 0x50, 0x17, 0x32, 0x70, 0x95, + 0xaf, 0x70, 0x35, 0xd2, 0xe4, 0x52, 0x4c, 0xee, + 0x1d, 0x49, 0x3a, 0x0d, 0x45, 0xba, 0x55, 0xfc, + 0x6e, 0x6b, 0x20, 0x7f, 0xcc, 0xa2, 0x58, 0xba, + 0x1b, 0x68, 0xcb, 0xf1, 0xa6, 0x10, 0xbe, 0x36, + 0x6c, 0x45, 0xe1, 0x6d, 0xde, 0x2a, 0x6d, 0x71, + 0x51, 0x06, 0x94, 0xd8, 0xea, 0x60, 0xb2, 0xb8, + 0x76, 0x0a, 0x40, 0x00, 0x05, 0xbf, 0x6d, 0x3f, + 0x85, 0x2a, 0x9b, 0x89, 0x75, 0x99, 0x2c, 0xa3, + 0x6d, 0xb4, 0xbf, 0x89, 0xaf, 0xa6, 0xe4, 0x60, + 0x23, 0x2d, 0xac, 0x2d, 0xf0, 0xa5, 0xd3, 0x70, + 0xea, 0xcb, 0xad, 0x81, 0x1e, 0x55, 0x19, 0x47, + 0x4d, 0x7d, 0x9f, 0x93, 0xe7, 0x4b, 0x85, 0x93, + 0x12, 0xca, 0x8a, 0xd6, 0xf8, 0x1e, 0xa2, 0xa4, + 0xc8, 0xfa, 0xdc, 0x9c, 0x68, 0xa3, 0x91, 0xb7, + 0x2c, 0x47, 0x45, 0xd6, 0xb7, 0x0d, 0xc2, 0x29, + 0x90, 0xb1, 0x03, 0x5e, 0xba, 0x57, 0x95, 0xe0, + 0x52, 0xc1, 0x48, 0x1e, 0x93, 0xdc, 0x54, 0xc9, + 0x77, 0xbe, 0xb8, 0x66, 0x3d, 0x78, 0xd7, 0x91, + 0x35, 0x51, 0xdb, 0xc6, 0xb4, 0x7f, 0x6f, 0xe2, + 0xc7, 0x8c, 0xe4, 0xcd, 0x18, 0x60, 0x6c, 0x55, + 0x88, 0xe8, 0x45, 0x37, 0x8f, 0x87, 0x5d, 0xc0, + 0xe9, 0xf9, 0x55, 0xf8, 0x38, 0xd4, 0x43, 0xa0, + 0x1f, 0x95, 0x43, 0x53, 0xc9, 0x9e, 0xfd, 0xfd, + 0xcf, 0x2c, 0xfb, 0xd0, 0xa4, 0x60, 0x58, 0x8b, + 0x5e, 0xbd, 0xe2, 0x61, 0x04, 0x1d, 0x06, 0xbe, + 0x55, 0x6d, 0x60, 0x48, 0xd6, 0xee, 0x42, 0x2a, + 0xeb, 0xaf, 0x95, 0x50, 0xcf, 0xe4, 0x89, 0x7f, + 0x63, 0x11, 0xb6, 0x85, 0x00, 0xb9, 0x1d, 0xef, + 0xda, 0xa5, 0x28, 0x39, 0x5d, 0x8b, 0x79, 0x39, + 0x58, 0xf8, 0x31, 0xdd, 0xac, 0x5c, 0xe8, 0x00, + 0xf1, 0xa5, 0xbb, 0x72, 0xf9, 0x19, 0xca, 0x06, + 0xd1, 0x4e, 0xe2, 0xfd, 0x87, 0xfa, 0x7f, 0x0a, + 0x9b, 0x17, 0x8b, 0x93, 0x24, 0x09, 0x72, 0x49, + 0x55, 0x3a, 0x85, 0xe8, 0x69, 0xb4, 0x18, 0xb0, + 0x40, 0x2d, 0x12, 0xed, 0xf1, 0xa9, 0x2a, 0x78, + 0xc5, 0xc5, 0x4c, 0x74, 0xb0, 0xd5, 0x8f, 0xcc, + 0xde, 0x26, 0xac, 0x51, 0x45, 0x00, 0x51, 0x45, + 0x14, 0x01, 0x45, 0x14, 0x50, 0x05, 0x14, 0x51, + 0x40, 0x14, 0x51, 0x45, 0x00, 0x57, 0x08, 0x07, + 0xad, 0x76, 0x8a, 0x02, 0xb6, 0x46, 0x06, 0x34, + 0xf7, 0x2c, 0xb6, 0x73, 0xfa, 0xd7, 0x43, 0x49, + 0xa6, 0xc2, 0xcc, 0xc1, 0x9c, 0x32, 0x6e, 0x68, + 0xb5, 0xb3, 0xa0, 0xb9, 0x1f, 0x1a, 0xd1, 0x57, + 0x28, 0x0c, 0xef, 0xf7, 0x0c, 0xb8, 0xd7, 0x74, + 0x85, 0xbd, 0xc3, 0xae, 0xd6, 0x1a, 0x11, 0xe1, + 0xf9, 0x55, 0xf8, 0xb9, 0x4c, 0x67, 0x4f, 0xdc, + 0x05, 0x48, 0xeb, 0x6e, 0x95, 0x77, 0x25, 0x71, + 0x19, 0x36, 0xe4, 0x94, 0x00, 0xf4, 0x2e, 0x40, + 0xfc, 0x89, 0xa5, 0x8f, 0xc6, 0xf1, 0x6c, 0x34, + 0xcb, 0x55, 0x5b, 0xdc, 0xd9, 0x97, 0xa7, 0x85, + 0x01, 0x6d, 0xf2, 0x71, 0x15, 0x4b, 0x29, 0x2d, + 0x6b, 0x68, 0x05, 0xfa, 0xf4, 0xa8, 0x47, 0x23, + 0x88, 0x6c, 0x48, 0x60, 0x08, 0xb9, 0xf2, 0xf8, + 0xd4, 0x07, 0x8b, 0x80, 0xb9, 0x6f, 0xaf, 0x50, + 0xa6, 0xdb, 0x57, 0xd3, 0x60, 0x3b, 0x7e, 0xaa, + 0xe8, 0xe3, 0x78, 0xcb, 0x6d, 0x6c, 0xb4, 0x27, + 0x5d, 0x43, 0x00, 0x7f, 0xf7, 0x50, 0x99, 0x65, + 0xb6, 0xe4, 0x30, 0x92, 0x3f, 0x71, 0x4e, 0xe0, + 0x6f, 0x62, 0x7a, 0x69, 0x54, 0xa6, 0xcf, 0xc8, + 0xd1, 0xc1, 0xb1, 0xb6, 0x8a, 0x3a, 0x5c, 0xf4, + 0xa9, 0xc6, 0x07, 0x14, 0x02, 0x19, 0x27, 0x56, + 0x8d, 0x41, 0x0a, 0x0b, 0x80, 0x08, 0xbf, 0x7d, + 0x75, 0xab, 0xa1, 0x30, 0x76, 0x58, 0x18, 0xf6, + 0xe9, 0xdc, 0x50, 0x81, 0x16, 0xec, 0xbc, 0xf7, + 0xdb, 0xea, 0x2c, 0x3a, 0x9f, 0xd3, 0xe0, 0x46, + 0xb4, 0xcf, 0x13, 0x88, 0x58, 0xd8, 0x4b, 0x21, + 0xf5, 0xe8, 0x48, 0x1d, 0x2e, 0x2a, 0xfc, 0x62, + 0x00, 0x00, 0x8b, 0x6d, 0xbb, 0x6d, 0xb5, 0x49, + 0x40, 0x14, 0x51, 0x45, 0x00, 0x51, 0x45, 0x14, + 0x01, 0x45, 0x14, 0x50, 0x05, 0x14, 0x51, 0x40, + 0x7f, 0xff, 0xd9, +}; + +static const uint8_t data_images_c_c_c_control_small_jpg[] = +{ + /* /images/c-c-c-control-small.jpg */ + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x63, 0x2d, 0x63, 0x2d, 0x63, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x2e, 0x6a, 0x70, 0x67, 0x00, + + 0xff, 0xd8, 0xff, 0xe1, 0x00, 0x18, 0x45, 0x78, + 0x69, 0x66, 0x00, 0x00, 0x49, 0x49, 0x2a, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x11, + 0x44, 0x75, 0x63, 0x6b, 0x79, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0xff, + 0xe1, 0x03, 0x29, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, + 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, + 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x00, + 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, + 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, + 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, + 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, + 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, + 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, + 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, + 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, + 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, + 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, + 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, + 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, + 0x65, 0x20, 0x35, 0x2e, 0x30, 0x2d, 0x63, 0x30, + 0x36, 0x30, 0x20, 0x36, 0x31, 0x2e, 0x31, 0x33, + 0x34, 0x37, 0x37, 0x37, 0x2c, 0x20, 0x32, 0x30, + 0x31, 0x30, 0x2f, 0x30, 0x32, 0x2f, 0x31, 0x32, + 0x2d, 0x31, 0x37, 0x3a, 0x33, 0x32, 0x3a, 0x30, + 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, + 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, + 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, + 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, + 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, + 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, + 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, + 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, + 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, + 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, + 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, + 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, + 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, + 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, + 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, + 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, + 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, + 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, + 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, + 0x20, 0x43, 0x53, 0x35, 0x20, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x73, 0x22, 0x20, 0x78, 0x6d, + 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, + 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, + 0x35, 0x46, 0x35, 0x41, 0x42, 0x44, 0x32, 0x33, + 0x32, 0x36, 0x44, 0x44, 0x31, 0x31, 0x45, 0x33, + 0x38, 0x34, 0x41, 0x32, 0x46, 0x31, 0x42, 0x32, + 0x42, 0x37, 0x35, 0x32, 0x38, 0x37, 0x33, 0x46, + 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, + 0x64, 0x69, 0x64, 0x3a, 0x35, 0x46, 0x35, 0x41, + 0x42, 0x44, 0x32, 0x34, 0x32, 0x36, 0x44, 0x44, + 0x31, 0x31, 0x45, 0x33, 0x38, 0x34, 0x41, 0x32, + 0x46, 0x31, 0x42, 0x32, 0x42, 0x37, 0x35, 0x32, + 0x38, 0x37, 0x33, 0x46, 0x22, 0x3e, 0x20, 0x3c, + 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, + 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, + 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, + 0x69, 0x69, 0x64, 0x3a, 0x35, 0x46, 0x35, 0x41, + 0x42, 0x44, 0x32, 0x31, 0x32, 0x36, 0x44, 0x44, + 0x31, 0x31, 0x45, 0x33, 0x38, 0x34, 0x41, 0x32, + 0x46, 0x31, 0x42, 0x32, 0x42, 0x37, 0x35, 0x32, + 0x38, 0x37, 0x33, 0x46, 0x22, 0x20, 0x73, 0x74, + 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, + 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, + 0x35, 0x46, 0x35, 0x41, 0x42, 0x44, 0x32, 0x32, + 0x32, 0x36, 0x44, 0x44, 0x31, 0x31, 0x45, 0x33, + 0x38, 0x34, 0x41, 0x32, 0x46, 0x31, 0x42, 0x32, + 0x42, 0x37, 0x35, 0x32, 0x38, 0x37, 0x33, 0x46, + 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, + 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, + 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, + 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, + 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, + 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, + 0x3f, 0x3e, 0xff, 0xee, 0x00, 0x0e, 0x41, 0x64, + 0x6f, 0x62, 0x65, 0x00, 0x64, 0xc0, 0x00, 0x00, + 0x00, 0x01, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x0c, + 0x08, 0x08, 0x08, 0x09, 0x08, 0x0c, 0x09, 0x09, + 0x0c, 0x11, 0x0b, 0x0a, 0x0b, 0x11, 0x15, 0x0f, + 0x0c, 0x0c, 0x0f, 0x15, 0x18, 0x13, 0x13, 0x15, + 0x13, 0x13, 0x18, 0x17, 0x12, 0x14, 0x14, 0x14, + 0x14, 0x12, 0x17, 0x17, 0x1b, 0x1c, 0x1e, 0x1c, + 0x1b, 0x17, 0x24, 0x24, 0x27, 0x27, 0x24, 0x24, + 0x35, 0x33, 0x33, 0x33, 0x35, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x01, + 0x0d, 0x0b, 0x0b, 0x0d, 0x0e, 0x0d, 0x10, 0x0e, + 0x0e, 0x10, 0x14, 0x0e, 0x0f, 0x0e, 0x14, 0x14, + 0x10, 0x11, 0x11, 0x10, 0x14, 0x1d, 0x14, 0x14, + 0x15, 0x14, 0x14, 0x1d, 0x25, 0x1a, 0x17, 0x17, + 0x17, 0x17, 0x1a, 0x25, 0x20, 0x23, 0x1e, 0x1e, + 0x1e, 0x23, 0x20, 0x28, 0x28, 0x25, 0x25, 0x28, + 0x28, 0x32, 0x32, 0x30, 0x32, 0x32, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0xff, 0xc0, 0x00, 0x11, 0x08, 0x00, 0xf5, 0x00, + 0xbf, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, + 0x03, 0x11, 0x01, 0xff, 0xc4, 0x00, 0x96, 0x00, + 0x00, 0x02, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x03, 0x04, 0x06, 0x02, 0x07, 0x01, + 0x01, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x10, 0x00, 0x01, 0x03, 0x03, 0x03, 0x02, 0x05, + 0x02, 0x02, 0x09, 0x04, 0x03, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x03, 0x11, 0x21, 0x04, + 0x31, 0x12, 0x05, 0x41, 0x51, 0x61, 0x22, 0x32, + 0x13, 0x06, 0x71, 0x81, 0x91, 0x14, 0xa1, 0xb1, + 0x42, 0x52, 0x23, 0x33, 0x53, 0x15, 0x07, 0xf0, + 0xd1, 0x62, 0x24, 0xc1, 0x72, 0x16, 0x25, 0x11, + 0x00, 0x02, 0x02, 0x01, 0x04, 0x01, 0x03, 0x02, + 0x06, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x11, 0x02, 0x03, 0x21, 0x31, 0x12, + 0x04, 0x13, 0x41, 0x51, 0x61, 0x22, 0x32, 0x71, + 0x91, 0x42, 0x62, 0x23, 0x14, 0x81, 0xf0, 0xa1, + 0x43, 0x34, 0x05, 0xff, 0xda, 0x00, 0x0c, 0x03, + 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, + 0x00, 0xf5, 0x54, 0x21, 0x08, 0x01, 0x08, 0x42, + 0x00, 0x42, 0x10, 0x80, 0x10, 0x84, 0x20, 0x04, + 0x21, 0x70, 0xe9, 0xa2, 0x61, 0xa3, 0x9e, 0xd0, + 0x75, 0xa1, 0x21, 0x01, 0xda, 0x15, 0x39, 0x39, + 0x6c, 0x18, 0xfd, 0x4f, 0xb7, 0x7a, 0x1a, 0x28, + 0xcf, 0x37, 0x84, 0x08, 0x0d, 0xdc, 0xf0, 0x69, + 0x76, 0x8b, 0x54, 0xe8, 0x35, 0xd5, 0x00, 0xc1, + 0x0a, 0x87, 0xf7, 0xac, 0x31, 0xa8, 0x7d, 0x41, + 0xa5, 0x28, 0xa7, 0xc6, 0xce, 0xc7, 0xca, 0x24, + 0x44, 0xea, 0x96, 0xea, 0x0d, 0x90, 0x16, 0x10, + 0x84, 0x20, 0x04, 0x21, 0x08, 0x01, 0x08, 0x42, + 0x00, 0x42, 0x10, 0x80, 0x10, 0x84, 0x20, 0x04, + 0x21, 0x08, 0x01, 0x08, 0x42, 0x00, 0x42, 0x17, + 0xc7, 0x38, 0x34, 0x17, 0x38, 0xd0, 0x0d, 0x4a, + 0x00, 0x24, 0x01, 0x53, 0x60, 0xa1, 0x9b, 0x37, + 0x1e, 0x16, 0x6e, 0x73, 0x81, 0xae, 0x80, 0x75, + 0x4a, 0x33, 0xf9, 0x03, 0x95, 0x2f, 0xb5, 0x8c, + 0xe2, 0x03, 0x6c, 0x3a, 0x6e, 0x21, 0x77, 0x8b, + 0xc3, 0xcc, 0xef, 0x3c, 0xa7, 0xdb, 0x07, 0xf6, + 0x75, 0xfb, 0xd3, 0x44, 0x07, 0xcc, 0xbe, 0x69, + 0xce, 0x3e, 0xd3, 0x3f, 0x86, 0x0e, 0xae, 0x17, + 0x34, 0x51, 0xb7, 0x86, 0xca, 0x91, 0xce, 0x7e, + 0xf2, 0xd0, 0xee, 0xae, 0xbd, 0xb5, 0x4c, 0x99, + 0x87, 0x8b, 0x0b, 0xb7, 0x86, 0xef, 0x7d, 0x28, + 0x4b, 0xae, 0xa4, 0x7e, 0x4d, 0x2c, 0xa5, 0x55, + 0xb2, 0x1d, 0x92, 0x15, 0x3f, 0x84, 0xc8, 0xd8, + 0x18, 0xd7, 0x0b, 0x9b, 0xb8, 0x9a, 0xe8, 0xae, + 0x45, 0xc3, 0xe3, 0x88, 0x9a, 0xd9, 0x49, 0x73, + 0x81, 0x24, 0x10, 0x74, 0xec, 0xa4, 0x76, 0x50, + 0x5c, 0x7e, 0x68, 0x2b, 0x78, 0xd9, 0x5e, 0x68, + 0x8b, 0x27, 0x86, 0x06, 0xbf, 0x97, 0xda, 0x2b, + 0x73, 0xba, 0xe4, 0xba, 0xba, 0xaa, 0xcf, 0xe3, + 0xb2, 0xb1, 0xc0, 0x2c, 0x04, 0xd6, 0xc7, 0x6f, + 0xe3, 0x74, 0xc1, 0xb9, 0x00, 0xa9, 0x19, 0x90, + 0x8e, 0x8c, 0x9e, 0x68, 0x54, 0xdc, 0xbc, 0xe8, + 0x72, 0x1a, 0xc7, 0xb9, 0xcd, 0xa9, 0x07, 0xc0, + 0x83, 0xd0, 0xfd, 0x15, 0xe8, 0xf9, 0xa8, 0xc3, + 0x7f, 0x8e, 0xc2, 0xd7, 0x75, 0xa2, 0xb4, 0x44, + 0x52, 0xfa, 0xda, 0x0a, 0x8d, 0xfc, 0x66, 0x23, + 0xda, 0x43, 0x41, 0x69, 0x26, 0xa4, 0xd6, 0xbf, + 0xad, 0x55, 0xa8, 0x2d, 0x24, 0xb8, 0xd9, 0xb0, + 0xe4, 0xb4, 0x3a, 0x33, 0xaf, 0x43, 0xaa, 0xb0, + 0xb3, 0x73, 0x63, 0x64, 0xf1, 0xf2, 0xef, 0x69, + 0xda, 0xd3, 0x66, 0xb8, 0x57, 0x4e, 0x81, 0x31, + 0xe3, 0xb9, 0x23, 0x2b, 0x84, 0x13, 0x38, 0x7b, + 0xa7, 0x4a, 0x78, 0x28, 0x03, 0x34, 0x21, 0x08, + 0x01, 0x08, 0x42, 0x00, 0x42, 0x10, 0x80, 0x10, + 0x84, 0x20, 0x04, 0x21, 0x71, 0x2c, 0xd1, 0xc2, + 0xc2, 0xf9, 0x0e, 0xd6, 0x8d, 0x4a, 0x03, 0x8c, + 0xa9, 0xc4, 0x10, 0x3e, 0x5b, 0x79, 0x45, 0x6e, + 0x91, 0x17, 0xe5, 0x72, 0x12, 0x38, 0x07, 0x38, + 0x9f, 0xd9, 0x68, 0x24, 0x00, 0x55, 0x8c, 0xcc, + 0xd3, 0x96, 0x5a, 0xc8, 0x6b, 0x40, 0x49, 0x0d, + 0x23, 0x5a, 0x75, 0x53, 0xe0, 0x42, 0xec, 0x66, + 0x3a, 0x57, 0xd9, 0xf2, 0x0b, 0xb4, 0xf4, 0xfb, + 0xa0, 0x38, 0xc6, 0xc0, 0x10, 0x3d, 0x92, 0xe4, + 0x3b, 0x73, 0xd9, 0xa0, 0x37, 0xbf, 0x75, 0x24, + 0xf9, 0xe0, 0x56, 0xa6, 0x8a, 0xbe, 0x6e, 0x78, + 0x6f, 0xed, 0x57, 0xb2, 0x43, 0x9d, 0x9f, 0x5a, + 0xf9, 0xae, 0x80, 0x65, 0x93, 0xcc, 0x6c, 0x24, + 0x6e, 0xd3, 0x45, 0x4a, 0x4e, 0x74, 0x8b, 0xd7, + 0xc1, 0x25, 0x9b, 0x2d, 0xce, 0xa8, 0x2e, 0x55, + 0x1d, 0x29, 0x23, 0x55, 0x6a, 0xd9, 0xa2, 0xae, + 0xb2, 0x68, 0x47, 0x3e, 0xd3, 0xad, 0x54, 0x8c, + 0xe6, 0xe0, 0x76, 0xae, 0x20, 0xac, 0xb9, 0x71, + 0xea, 0xb9, 0x0f, 0x25, 0x5d, 0x64, 0x68, 0xab, + 0xc6, 0x8d, 0xb4, 0x19, 0xd0, 0xca, 0x40, 0x0f, + 0xfc, 0x4a, 0xb4, 0xd9, 0xb6, 0x9a, 0x6e, 0xaa, + 0xc1, 0xb6, 0x69, 0x1b, 0x76, 0x38, 0xd4, 0x68, + 0xa7, 0x8f, 0x90, 0xca, 0x69, 0x15, 0x90, 0xa9, + 0xf2, 0xcf, 0xa1, 0x1e, 0x3f, 0x93, 0x7d, 0x14, + 0xa5, 0xda, 0x54, 0xab, 0x51, 0x48, 0x49, 0xa6, + 0x8b, 0x0f, 0x89, 0xcf, 0xe5, 0xc2, 0x36, 0xee, + 0xaf, 0xd5, 0x31, 0x6f, 0x3b, 0x31, 0xa7, 0x98, + 0x02, 0x55, 0x5d, 0x93, 0xf4, 0x2c, 0x93, 0x5e, + 0xa6, 0xb9, 0xc6, 0x37, 0x37, 0x6b, 0xe8, 0x41, + 0xd4, 0x24, 0x7c, 0x86, 0x23, 0x31, 0xb2, 0x04, + 0x91, 0xd5, 0xad, 0x37, 0x0e, 0xec, 0x51, 0x8b, + 0xc8, 0x97, 0x9b, 0xb9, 0x32, 0x0f, 0x8f, 0x22, + 0x32, 0xc7, 0x80, 0xe0, 0x46, 0x8b, 0x32, 0xe4, + 0x78, 0x7c, 0xb3, 0x1c, 0xc0, 0xc9, 0xea, 0x24, + 0x07, 0x6e, 0xee, 0x87, 0xc5, 0x31, 0x06, 0xa9, + 0x16, 0x6f, 0x19, 0x3c, 0x4c, 0x32, 0x44, 0x43, + 0x98, 0x07, 0x4d, 0x7b, 0x2b, 0xbc, 0x4e, 0x67, + 0xbc, 0xc7, 0x40, 0xef, 0x54, 0x56, 0x07, 0xa9, + 0x08, 0x06, 0x28, 0x42, 0x10, 0x02, 0x10, 0x84, + 0x00, 0x84, 0x21, 0x01, 0xf0, 0x90, 0x2e, 0x52, + 0x5e, 0x53, 0x24, 0x4f, 0x3b, 0x20, 0x8d, 0xf4, + 0x63, 0x4d, 0x1c, 0x6d, 0x42, 0xee, 0xde, 0x29, + 0xa6, 0x64, 0xad, 0x8b, 0x1d, 0xee, 0x71, 0xa5, + 0x41, 0x03, 0xea, 0x52, 0x6e, 0x2f, 0x1c, 0x4d, + 0x2f, 0xbc, 0xff, 0x00, 0xe5, 0xc5, 0x72, 0x35, + 0xbf, 0x8a, 0x01, 0x8e, 0x26, 0x33, 0x31, 0x21, + 0xa9, 0x00, 0xc8, 0xeb, 0xe8, 0xa1, 0xc9, 0xc9, + 0xac, 0x6f, 0x16, 0xa8, 0xba, 0x8b, 0x90, 0xe5, + 0x31, 0xe2, 0xab, 0x9e, 0xea, 0x34, 0x2c, 0xde, + 0x67, 0xca, 0xb8, 0xd8, 0x9e, 0xed, 0xf2, 0x12, + 0x0e, 0xbd, 0x94, 0x37, 0xa9, 0x64, 0x94, 0x1d, + 0x72, 0x19, 0xae, 0x04, 0xd1, 0x23, 0x9b, 0x29, + 0xee, 0x71, 0xe8, 0xaa, 0x66, 0x7c, 0x9f, 0x89, + 0x73, 0xce, 0xd9, 0x69, 0x5e, 0xea, 0x83, 0xf9, + 0xfe, 0x30, 0xe9, 0x35, 0xd5, 0x8a, 0xc0, 0xd4, + 0x3e, 0xa3, 0xfd, 0x7d, 0x57, 0x20, 0xdf, 0x5b, + 0x25, 0x6c, 0xe7, 0xf8, 0xd1, 0xea, 0x98, 0x2f, + 0xa7, 0xe4, 0x1c, 0x5d, 0x2d, 0x30, 0x51, 0x28, + 0x6a, 0x32, 0x24, 0xf4, 0x5d, 0x8d, 0x12, 0xcf, + 0xfe, 0x87, 0x8b, 0xa7, 0xf3, 0x51, 0xff, 0x00, + 0xd0, 0x71, 0x46, 0xc6, 0x55, 0x3c, 0x90, 0x81, + 0x90, 0xa8, 0xb1, 0x08, 0xad, 0xd5, 0x37, 0xfc, + 0x93, 0x86, 0x73, 0x5a, 0x1b, 0x25, 0x08, 0x17, + 0xb2, 0x8c, 0x73, 0xfc, 0x5d, 0x7f, 0x9b, 0xfa, + 0x13, 0x92, 0x23, 0x8a, 0x1a, 0x35, 0xf4, 0x20, + 0x77, 0x56, 0x84, 0x84, 0x1a, 0x76, 0x48, 0x87, + 0xc8, 0x38, 0xa0, 0xf0, 0x4c, 0xb6, 0x0a, 0x43, + 0xf2, 0x5e, 0x28, 0x93, 0xfc, 0x5f, 0xd0, 0x92, + 0x87, 0x13, 0x53, 0x87, 0x96, 0xe0, 0x40, 0x34, + 0xa2, 0x79, 0x85, 0x98, 0x49, 0x0b, 0xcf, 0xe1, + 0xf9, 0x37, 0x16, 0xd3, 0xfc, 0xdb, 0xa6, 0xfc, + 0x6f, 0xc8, 0xf8, 0xd9, 0x64, 0x6b, 0x59, 0x25, + 0x0f, 0x7e, 0x89, 0x2b, 0xd0, 0x98, 0x3d, 0x0f, + 0x1e, 0x40, 0xf6, 0x9d, 0xd7, 0x69, 0xd7, 0xb2, + 0x59, 0x98, 0xc6, 0xf1, 0xd9, 0x82, 0x58, 0x6d, + 0xee, 0x1d, 0xd7, 0xd3, 0xb1, 0xa2, 0x8e, 0x2e, + 0x4a, 0x13, 0xb6, 0x28, 0x8e, 0xe2, 0x40, 0x24, + 0x8f, 0x14, 0xca, 0x78, 0xc6, 0x56, 0x1b, 0x9b, + 0x4a, 0xbd, 0x83, 0x73, 0x0e, 0x86, 0xa1, 0x40, + 0x82, 0x7c, 0x3c, 0xc8, 0xf2, 0xe2, 0xf7, 0x1a, + 0x0b, 0x48, 0xb1, 0x69, 0xe8, 0xac, 0x24, 0x5c, + 0x3e, 0x40, 0x8a, 0x57, 0x36, 0x47, 0x80, 0xd7, + 0xd8, 0x34, 0xea, 0x08, 0x3d, 0x7e, 0xe9, 0xea, + 0x00, 0x42, 0x10, 0x80, 0x10, 0x85, 0x1c, 0xb2, + 0xb6, 0x36, 0x17, 0x38, 0xd3, 0xb7, 0x89, 0x40, + 0x23, 0xe4, 0x32, 0xe5, 0x97, 0x20, 0xb4, 0xfa, + 0x62, 0x20, 0x35, 0x83, 0xa8, 0x3d, 0x4f, 0xe0, + 0xa5, 0x73, 0xe3, 0xc3, 0xe3, 0x99, 0x08, 0x77, + 0x99, 0xc0, 0xbe, 0x4e, 0xe4, 0x9b, 0xaa, 0xd0, + 0x46, 0xfc, 0xbe, 0x41, 0xce, 0x73, 0x6a, 0xd0, + 0x6a, 0xf3, 0x5a, 0x8a, 0x6a, 0xa6, 0xe4, 0x04, + 0x92, 0x31, 0xc5, 0xad, 0x0e, 0x68, 0xd6, 0x9d, + 0x14, 0xd5, 0x4b, 0x21, 0xb8, 0x31, 0xbc, 0xff, + 0x00, 0x24, 0x46, 0xe0, 0x1c, 0x69, 0x7b, 0x1b, + 0xfe, 0x85, 0x81, 0xe4, 0x72, 0x5c, 0xf7, 0xbb, + 0xcc, 0x48, 0xf1, 0xe8, 0xbd, 0x0f, 0x96, 0xe3, + 0x72, 0x89, 0x76, 0xe8, 0x85, 0xa8, 0x49, 0xa7, + 0x42, 0x68, 0x2a, 0xb3, 0xd3, 0x7c, 0x7f, 0x32, + 0x57, 0xca, 0x19, 0x8d, 0x53, 0x09, 0xa3, 0xf4, + 0x14, 0x3a, 0xfd, 0xd6, 0xeb, 0xad, 0x2b, 0xee, + 0x45, 0x3c, 0xb1, 0xa4, 0x33, 0x0e, 0xf7, 0x38, + 0x9b, 0xd7, 0xf4, 0xa8, 0xe8, 0xe5, 0xb3, 0x6f, + 0xc5, 0x39, 0x29, 0x1a, 0xd7, 0xb7, 0x0e, 0xad, + 0x78, 0x2e, 0x69, 0xb6, 0x81, 0x57, 0x87, 0x85, + 0x96, 0x56, 0xef, 0x8f, 0x1f, 0x7b, 0x6a, 0x5a, + 0x08, 0xee, 0xdd, 0x55, 0xd7, 0x52, 0x7f, 0x52, + 0x23, 0xcd, 0xf0, 0xcc, 0xa6, 0xd7, 0x23, 0x6b, + 0x96, 0xc4, 0xf0, 0x19, 0x51, 0xc2, 0xc9, 0x9d, + 0x89, 0xe4, 0x90, 0x80, 0xdd, 0x2b, 0x57, 0x58, + 0x7e, 0x2b, 0xb6, 0x7c, 0x7f, 0x2d, 0xd2, 0x7b, + 0x6d, 0xc3, 0x25, 0xe5, 0xe6, 0x3a, 0x53, 0xf6, + 0x80, 0xa9, 0x0a, 0x7f, 0xa7, 0xfb, 0xd1, 0x1e, + 0x6f, 0x83, 0x17, 0x47, 0x76, 0x45, 0x0f, 0x65, + 0xae, 0x67, 0x07, 0x91, 0x36, 0x53, 0xf1, 0x63, + 0xc6, 0x06, 0x58, 0xfd, 0x62, 0xd6, 0xfa, 0x95, + 0xd3, 0x3e, 0x39, 0x9a, 0xf1, 0x21, 0x6e, 0x2d, + 0x44, 0x44, 0x87, 0x9b, 0x74, 0xec, 0x9f, 0xd2, + 0xfd, 0xe8, 0x79, 0xbe, 0x0c, 0x75, 0x0a, 0x28, + 0x7b, 0x15, 0xb3, 0x87, 0xe3, 0x79, 0xb2, 0x3c, + 0x35, 0xb8, 0x9e, 0x62, 0xd0, 0xe0, 0x28, 0x34, + 0x71, 0xa0, 0x2a, 0x79, 0x3e, 0x33, 0x99, 0x04, + 0x7e, 0xe4, 0xb8, 0x94, 0x6e, 0xed, 0x95, 0xa0, + 0x37, 0xd2, 0x8a, 0xcb, 0xa2, 0x9f, 0xfc, 0x88, + 0x87, 0xd8, 0xfd, 0xac, 0xc2, 0xd0, 0xf6, 0x2b, + 0xed, 0x0f, 0x62, 0xb6, 0xf3, 0xfc, 0x7f, 0x23, + 0x1c, 0xd2, 0x5c, 0x50, 0x06, 0xd2, 0xfa, 0xdb, + 0x41, 0xaa, 0xa3, 0xf9, 0x6c, 0x6f, 0xe9, 0xb5, + 0x59, 0x7f, 0xe7, 0x37, 0xb5, 0xd3, 0x23, 0xfb, + 0x29, 0x7a, 0x33, 0x30, 0xdd, 0xda, 0x50, 0xfd, + 0x95, 0xdc, 0x49, 0xde, 0xc7, 0x0b, 0x91, 0x4b, + 0xda, 0xc9, 0xd0, 0xc5, 0xc7, 0xfe, 0x9b, 0x52, + 0xee, 0x59, 0xb1, 0xc4, 0xf8, 0xf6, 0x34, 0x36, + 0xa2, 0xe1, 0x53, 0x37, 0x49, 0xe3, 0xa3, 0xbf, + 0x2d, 0x99, 0x6c, 0x79, 0xd5, 0xed, 0x06, 0xeb, + 0xe2, 0x1c, 0x9f, 0xbc, 0x28, 0xf7, 0xee, 0x7b, + 0x29, 0x4a, 0xaf, 0x40, 0xc1, 0xc9, 0xad, 0x0e, + 0xea, 0x9f, 0x15, 0xe4, 0x3f, 0x0c, 0xc9, 0x22, + 0x47, 0x8d, 0xc3, 0x4a, 0xaf, 0x48, 0xe3, 0x32, + 0xb4, 0x15, 0x0b, 0xce, 0x76, 0xfa, 0xa0, 0xec, + 0x55, 0x9a, 0x48, 0xcb, 0x94, 0xc2, 0x89, 0x95, + 0xc9, 0x65, 0x84, 0x9e, 0xa1, 0xd2, 0xba, 0x93, + 0xfa, 0x15, 0xde, 0x26, 0x59, 0x25, 0xc5, 0x1e, + 0xe1, 0xdd, 0xb4, 0xed, 0x0e, 0xee, 0x02, 0xe2, + 0x76, 0xbb, 0x23, 0x05, 0xed, 0xd4, 0x81, 0xb8, + 0x7d, 0x95, 0x5e, 0x0f, 0x20, 0x89, 0x1f, 0x8e, + 0x4d, 0x85, 0xc0, 0xbd, 0x96, 0x86, 0x23, 0xa4, + 0x21, 0x08, 0x01, 0x25, 0xe7, 0x65, 0x77, 0xb9, + 0x14, 0x40, 0x90, 0xdd, 0x4d, 0x3f, 0x14, 0xe4, + 0xac, 0xd6, 0x5e, 0x4c, 0x93, 0x67, 0xca, 0x0b, + 0x28, 0x0f, 0x91, 0x8e, 0x3e, 0x08, 0x0b, 0xd8, + 0x2d, 0x8e, 0x2c, 0x17, 0x3d, 0xa3, 0xcd, 0x23, + 0xaf, 0xd2, 0xc3, 0x45, 0x46, 0x6e, 0x4e, 0x28, + 0x22, 0x92, 0x37, 0xf9, 0x5c, 0xe3, 0xa8, 0xbd, + 0x15, 0xec, 0xa6, 0xb7, 0x1b, 0x19, 0x90, 0xf4, + 0x63, 0x40, 0x3f, 0x55, 0x90, 0xe5, 0xa7, 0xf3, + 0x3b, 0x5f, 0xa2, 0xdf, 0x0d, 0x13, 0xdc, 0xca, + 0xf6, 0x82, 0xe6, 0x4f, 0xc8, 0x30, 0x61, 0x96, + 0x47, 0xb8, 0x17, 0x89, 0x28, 0x1c, 0x28, 0x06, + 0x82, 0xa3, 0xaf, 0x74, 0x9f, 0x2b, 0x9a, 0xe3, + 0xb2, 0xa7, 0x6c, 0xd2, 0x3e, 0x48, 0x8c, 0x2f, + 0x13, 0x80, 0xd1, 0xeb, 0x25, 0xa0, 0x16, 0xba, + 0xfd, 0xc2, 0x4f, 0x93, 0x2e, 0xea, 0xf4, 0x07, + 0xba, 0xaa, 0xe0, 0xc3, 0xa9, 0x0b, 0xb6, 0xb8, + 0xab, 0xee, 0x60, 0xed, 0x69, 0x1e, 0x63, 0x7c, + 0x83, 0x08, 0x02, 0x25, 0x2e, 0x63, 0x8c, 0x6f, + 0x69, 0xa0, 0xdd, 0x42, 0xe7, 0x6e, 0xb0, 0x55, + 0xb8, 0x8e, 0x7b, 0x1b, 0x07, 0x15, 0xd8, 0xef, + 0x1b, 0xf7, 0x3d, 0xee, 0x73, 0x8b, 0x41, 0x34, + 0x70, 0xa0, 0xa7, 0x64, 0x8e, 0x69, 0x22, 0x15, + 0xf3, 0x05, 0x59, 0xd9, 0x31, 0x7e, 0xf5, 0x55, + 0xb8, 0x63, 0x5b, 0xb1, 0x36, 0x35, 0x8c, 0xe6, + 0xb8, 0xd6, 0x49, 0xf9, 0xa2, 0xf9, 0x1d, 0x24, + 0xbe, 0xd8, 0x92, 0x22, 0x3c, 0xad, 0xf6, 0xe9, + 0x71, 0x7e, 0xe1, 0x5c, 0x1f, 0x2c, 0xe3, 0xa5, + 0x92, 0x37, 0x39, 0xae, 0x65, 0x1c, 0x5e, 0xf2, + 0x1a, 0x0f, 0x99, 0xc0, 0x82, 0x56, 0x20, 0x65, + 0x45, 0xf5, 0x5f, 0x46, 0x4c, 0x7a, 0x80, 0x9c, + 0x31, 0xfa, 0x39, 0x26, 0x59, 0xa0, 0xc6, 0xc8, + 0xc7, 0x96, 0x4c, 0xd8, 0xa4, 0x74, 0x8d, 0x83, + 0x29, 0xcd, 0x2d, 0x9d, 0x8d, 0xd0, 0xb4, 0xd7, + 0x4f, 0x15, 0x77, 0x12, 0x6c, 0x56, 0x36, 0x12, + 0xe7, 0x4c, 0x0e, 0x23, 0x9c, 0xe8, 0xfc, 0xbf, + 0xcc, 0x07, 0xf7, 0xae, 0xb3, 0xd8, 0xbc, 0xd4, + 0xd8, 0xd1, 0xfb, 0x51, 0x1d, 0xad, 0x37, 0x20, + 0x8a, 0xab, 0x27, 0xe4, 0xb9, 0x4e, 0xa5, 0x5d, + 0xa5, 0xb4, 0xee, 0xa7, 0x8d, 0x64, 0x89, 0x66, + 0x99, 0xfc, 0xd4, 0x2e, 0xc6, 0x2c, 0x92, 0x27, + 0xb1, 0xe3, 0xdb, 0xf6, 0xdd, 0x4b, 0xf9, 0x5d, + 0x57, 0x35, 0x70, 0xee, 0x7e, 0x16, 0x62, 0x88, + 0xbd, 0xb7, 0xd4, 0x4a, 0x64, 0x2e, 0xdb, 0xa8, + 0x71, 0x36, 0xfd, 0x2b, 0x3c, 0xff, 0x00, 0x92, + 0x65, 0xbd, 0xad, 0x04, 0xd9, 0xb7, 0x16, 0x5c, + 0x0f, 0x90, 0xe5, 0x8b, 0xee, 0xa7, 0xd9, 0x4f, + 0x8e, 0x84, 0x72, 0x63, 0xc8, 0xf3, 0x30, 0x63, + 0x8d, 0xd8, 0xa0, 0xcd, 0x24, 0x72, 0x89, 0x1c, + 0xe7, 0xb9, 0xb7, 0x69, 0x78, 0xb3, 0x40, 0x59, + 0xb7, 0x53, 0x71, 0x6b, 0x4d, 0x81, 0x37, 0x22, + 0x9a, 0x29, 0xc7, 0x3f, 0x93, 0x5a, 0xfb, 0x80, + 0x7d, 0x95, 0x5f, 0x7e, 0x39, 0x1c, 0x5d, 0xbc, + 0x54, 0x9a, 0x95, 0xb6, 0x24, 0xab, 0xea, 0x56, + 0xf3, 0x1b, 0x1d, 0x51, 0x28, 0xe7, 0x3d, 0x71, + 0x04, 0xdf, 0x7b, 0x0e, 0x8e, 0x09, 0x37, 0x3a, + 0x41, 0x7c, 0x74, 0x35, 0xa0, 0x59, 0xf7, 0x5a, + 0x78, 0x1c, 0x3f, 0x52, 0xdd, 0x7f, 0xbd, 0x68, + 0x38, 0xf8, 0x2c, 0x12, 0x64, 0xe4, 0xca, 0xc6, + 0x0b, 0xb5, 0xb5, 0x2b, 0xd0, 0x30, 0x8b, 0xa1, + 0x76, 0xc7, 0x6a, 0x35, 0xba, 0xc1, 0x7f, 0x8f, + 0xd9, 0x90, 0xec, 0xa9, 0x5d, 0x01, 0x35, 0xb0, + 0x75, 0x3b, 0x2d, 0x94, 0x6f, 0x2d, 0xc9, 0x78, + 0x71, 0x35, 0x05, 0x7c, 0xfd, 0xf4, 0xb4, 0x9e, + 0xb6, 0x27, 0xca, 0xae, 0xbe, 0xc6, 0xd3, 0x8f, + 0xc8, 0x2e, 0x8d, 0xad, 0x20, 0x53, 0x45, 0x53, + 0x90, 0x88, 0xe2, 0xce, 0x5f, 0x0f, 0x94, 0x9f, + 0x33, 0x68, 0x69, 0x45, 0x1f, 0x1b, 0x28, 0x2c, + 0x1a, 0xa9, 0xf9, 0x59, 0x1c, 0x64, 0x8b, 0xf7, + 0x48, 0xe9, 0xe0, 0xb4, 0xab, 0x93, 0x0b, 0xa8, + 0x63, 0x4c, 0x49, 0x4c, 0xd8, 0xd1, 0xca, 0x6e, + 0x5c, 0x2a, 0x68, 0xa6, 0x55, 0x38, 0xcb, 0xe2, + 0xb4, 0xd3, 0x6d, 0x49, 0xf2, 0xf6, 0xba, 0xb6, + 0xac, 0x54, 0xe6, 0x40, 0xe2, 0xc7, 0x06, 0xfa, + 0xa8, 0x68, 0xb3, 0xf8, 0xf1, 0xcb, 0x93, 0x9b, + 0x13, 0x25, 0x21, 0x8c, 0x6b, 0xb7, 0x96, 0x75, + 0x25, 0xab, 0x42, 0xe3, 0x46, 0x93, 0xd8, 0x24, + 0x58, 0x4e, 0x0e, 0xe4, 0x83, 0xdc, 0x03, 0x40, + 0x0e, 0x2c, 0x70, 0x35, 0x04, 0xa0, 0x39, 0xe5, + 0xf2, 0x29, 0xbc, 0x83, 0x7a, 0xe8, 0xb0, 0xdc, + 0xb4, 0xef, 0x25, 0xd4, 0x75, 0x07, 0x55, 0xb3, + 0xe6, 0x03, 0xfd, 0xb2, 0xe2, 0x00, 0x07, 0x42, + 0xb1, 0x1c, 0x99, 0x71, 0xa8, 0x00, 0x2d, 0x71, + 0xe5, 0xaa, 0xdd, 0xc1, 0x8e, 0x4b, 0x24, 0x67, + 0xe7, 0x74, 0x8e, 0x79, 0x05, 0xc5, 0x7c, 0x6c, + 0x20, 0x8a, 0x9a, 0x95, 0x2b, 0xd8, 0x4b, 0x8d, + 0x6d, 0xf5, 0x53, 0x35, 0x80, 0x35, 0x74, 0xe3, + 0xb2, 0xb2, 0x94, 0xe4, 0xcd, 0x34, 0xc5, 0xb9, + 0x11, 0x8b, 0xd9, 0x53, 0x2c, 0xf3, 0x68, 0x99, + 0xcf, 0x1d, 0x49, 0x55, 0xdb, 0x09, 0x73, 0xc3, + 0x5a, 0x2a, 0xe3, 0x60, 0xaf, 0x1f, 0xe6, 0x4b, + 0x4c, 0x29, 0xf6, 0x22, 0x86, 0x22, 0xe2, 0x05, + 0x80, 0xea, 0xa6, 0x2c, 0x63, 0x6b, 0xe5, 0xaf, + 0x8a, 0x65, 0x27, 0x0e, 0xe8, 0xf1, 0x43, 0xdb, + 0x79, 0x45, 0xc8, 0x4b, 0xde, 0x2b, 0xa8, 0xf3, + 0x2d, 0x38, 0x3a, 0xee, 0x8a, 0x2c, 0x8a, 0xdb, + 0x11, 0xf9, 0x0f, 0x41, 0x6e, 0xa2, 0xeb, 0x82, + 0xd2, 0xd7, 0x01, 0x62, 0x0e, 0x85, 0x7d, 0x35, + 0x02, 0xba, 0x1e, 0x8a, 0x30, 0x6a, 0x6a, 0x7a, + 0xa3, 0x89, 0x64, 0xa7, 0xfe, 0x4b, 0x31, 0xb4, + 0x10, 0xbb, 0x73, 0x5b, 0x4d, 0x17, 0x11, 0xb8, + 0x05, 0xd3, 0x9d, 0x55, 0x2b, 0x61, 0xaf, 0xb2, + 0x21, 0x2c, 0x15, 0x5d, 0x06, 0x0a, 0x54, 0x8d, + 0x17, 0x61, 0xbd, 0x57, 0x2e, 0x70, 0x08, 0x4e, + 0x87, 0x0f, 0x60, 0x4b, 0x39, 0x21, 0x47, 0xb2, + 0xfd, 0x13, 0x42, 0xe4, 0xaf, 0x94, 0xf5, 0x33, + 0xe8, 0x56, 0x5d, 0x87, 0xfc, 0x6d, 0x16, 0xc5, + 0xbf, 0xa1, 0xb1, 0xff, 0x00, 0x15, 0x9f, 0xfb, + 0x39, 0x67, 0xb3, 0x42, 0xd0, 0x3e, 0x50, 0x33, + 0x64, 0xad, 0xbc, 0xc5, 0x67, 0xff, 0x00, 0xc5, + 0x72, 0x41, 0x14, 0xb9, 0x6e, 0x99, 0xdb, 0x41, + 0x00, 0x0f, 0xaa, 0x79, 0x90, 0xd1, 0xf9, 0xd7, + 0x96, 0x10, 0xe0, 0x5d, 0x55, 0xe3, 0xe5, 0x7a, + 0x9e, 0x87, 0x5b, 0xf5, 0x3f, 0x73, 0x49, 0xc5, + 0xcb, 0x61, 0x7b, 0x69, 0x54, 0xd7, 0x3e, 0x21, + 0x26, 0x11, 0x90, 0x54, 0xbe, 0x2b, 0xb4, 0xf7, + 0xaa, 0x45, 0xc5, 0x3a, 0x94, 0xd1, 0x68, 0xcc, + 0x26, 0x7c, 0x57, 0x47, 0x5d, 0xb6, 0xad, 0x7e, + 0x8a, 0xf8, 0xf6, 0x29, 0x99, 0x6a, 0x56, 0xe0, + 0xf2, 0x7d, 0x58, 0xdd, 0x07, 0x99, 0xa4, 0x9b, + 0xf8, 0xd5, 0x38, 0x48, 0x78, 0x80, 0x22, 0xe4, + 0x1d, 0x19, 0x25, 0xc6, 0x86, 0x8e, 0x1a, 0x0f, + 0x02, 0x9f, 0x2d, 0x0c, 0x4a, 0xf9, 0xef, 0x73, + 0x30, 0xe6, 0x7b, 0x7d, 0x41, 0x86, 0x89, 0x2e, + 0x07, 0xbc, 0x67, 0xde, 0xe1, 0xe5, 0xd8, 0x6d, + 0xd5, 0x39, 0xe4, 0x01, 0x38, 0x53, 0x06, 0x82, + 0x4e, 0xdb, 0x00, 0x97, 0x71, 0x8e, 0x8c, 0xc3, + 0x38, 0xa9, 0xdf, 0x4a, 0x1a, 0xd8, 0xd1, 0x00, + 0xb7, 0x9d, 0xcc, 0x27, 0x1f, 0xdb, 0xa5, 0x00, + 0x58, 0x3c, 0xdc, 0xf7, 0xc2, 0xf7, 0x6c, 0x14, + 0x26, 0xba, 0xad, 0xb7, 0x3b, 0x10, 0x31, 0x38, + 0x82, 0x6b, 0xf8, 0x2c, 0x16, 0x76, 0x2c, 0xaf, + 0x71, 0xdb, 0x57, 0x5c, 0xad, 0xe9, 0xd3, 0x77, + 0xd6, 0x39, 0x18, 0x64, 0x55, 0xf5, 0x2a, 0xfb, + 0xe6, 0x59, 0x0b, 0x9f, 0xea, 0x2a, 0x76, 0xb8, + 0x51, 0x55, 0x38, 0xf2, 0x45, 0xe6, 0x75, 0xbf, + 0x5a, 0xe8, 0x4a, 0x7a, 0x68, 0x17, 0x45, 0x70, + 0x78, 0xbe, 0x98, 0xe2, 0xcc, 0xd7, 0x1f, 0x43, + 0xa9, 0xe8, 0x01, 0xa5, 0xcf, 0x45, 0x7b, 0x8b, + 0xc0, 0xf6, 0xff, 0x00, 0xec, 0x48, 0x3c, 0xe7, + 0xd2, 0x0f, 0x40, 0xa3, 0xe3, 0xf1, 0x0c, 0xcf, + 0x13, 0x48, 0x3c, 0x83, 0xd2, 0x3b, 0xa6, 0xc0, + 0x50, 0x51, 0x75, 0xe0, 0xc5, 0x2b, 0x93, 0xfc, + 0x8e, 0x6c, 0xf9, 0xbf, 0x4a, 0x7f, 0x88, 0x1a, + 0x10, 0x6a, 0xa8, 0x9e, 0x3d, 0xad, 0xcd, 0x64, + 0xad, 0x15, 0x61, 0xae, 0xe6, 0xfd, 0x95, 0xf0, + 0x8a, 0xae, 0x8b, 0x55, 0x36, 0xa5, 0x1c, 0xf5, + 0xbb, 0xac, 0xeb, 0xb8, 0x8f, 0x9e, 0x89, 0x8d, + 0x31, 0xed, 0x68, 0x6d, 0x7b, 0x24, 0xfb, 0x48, + 0x3e, 0x1a, 0x27, 0xfc, 0xdb, 0x09, 0xf6, 0xdc, + 0x05, 0x87, 0x54, 0x8d, 0xe2, 0x84, 0x1f, 0xba, + 0xe4, 0xcf, 0xa3, 0x6e, 0xbe, 0xc7, 0x76, 0x1b, + 0x7f, 0x1a, 0xd7, 0x54, 0x33, 0xc5, 0xc4, 0x84, + 0x46, 0xd0, 0x5b, 0xb9, 0xc5, 0x34, 0xc7, 0xe1, + 0x9a, 0x6a, 0x5d, 0x01, 0xa0, 0xd7, 0xee, 0xad, + 0x7c, 0x7f, 0x86, 0x87, 0x32, 0x16, 0x4f, 0x23, + 0xf6, 0xd3, 0x40, 0x13, 0x5c, 0xdc, 0xe8, 0xb1, + 0xf2, 0x5d, 0x14, 0x8c, 0x75, 0x63, 0x35, 0x69, + 0x16, 0x0e, 0x04, 0x0d, 0x57, 0xcc, 0x76, 0x32, + 0x66, 0x9b, 0x37, 0x92, 0xd5, 0x53, 0xa1, 0xcd, + 0xda, 0xeb, 0xe6, 0xc6, 0xb9, 0xdd, 0xda, 0xb5, + 0xb6, 0xd0, 0x22, 0xc9, 0xe2, 0xe1, 0x61, 0xd9, + 0xec, 0x90, 0x75, 0xb2, 0x5a, 0xee, 0x35, 0xe5, + 0xc6, 0x90, 0x1b, 0x1a, 0x2d, 0x1b, 0xf9, 0xa8, + 0x63, 0xcb, 0x64, 0xde, 0xdf, 0xb8, 0xd6, 0xb4, + 0x82, 0x09, 0xd6, 0xaa, 0x23, 0xce, 0xc2, 0xe9, + 0x7d, 0xd3, 0x09, 0x0e, 0x04, 0xf9, 0x41, 0xf2, + 0x9d, 0xc6, 0xb5, 0xfb, 0x2a, 0xd3, 0x25, 0xe1, + 0x4e, 0x5b, 0x7e, 0x66, 0x38, 0x62, 0x35, 0xc9, + 0x61, 0x27, 0xf6, 0xb6, 0x31, 0x85, 0xd2, 0x42, + 0x5a, 0x01, 0xa5, 0x4f, 0x74, 0x83, 0xe4, 0x91, + 0x45, 0x1c, 0x91, 0x08, 0xdb, 0x4a, 0x83, 0xfa, + 0xd6, 0xc7, 0x92, 0xe5, 0xe3, 0x9f, 0x17, 0xf2, + 0xec, 0x8c, 0xb5, 0xc1, 0xe5, 0xc0, 0x9d, 0x4e, + 0x9a, 0xac, 0x67, 0xc8, 0xdd, 0x59, 0x62, 0x3d, + 0x68, 0x7f, 0x5a, 0xd7, 0x0e, 0x4c, 0x96, 0xc8, + 0x93, 0xb3, 0x75, 0x83, 0xa7, 0xab, 0x3f, 0xd8, + 0x5f, 0x53, 0x6a, 0x0b, 0xdf, 0x0f, 0x15, 0x8e, + 0x7a, 0x57, 0xd4, 0x34, 0x5a, 0xac, 0x73, 0x47, + 0x01, 0x77, 0x55, 0x65, 0x3e, 0x23, 0xbb, 0xd9, + 0x9c, 0x0f, 0xde, 0x0b, 0x55, 0x8e, 0x4b, 0x5c, + 0x0b, 0x8e, 0xab, 0x4c, 0xdf, 0x79, 0xf4, 0x58, + 0x52, 0xf1, 0x26, 0x68, 0xf8, 0xa1, 0x5e, 0x9d, + 0x74, 0x5a, 0x68, 0x24, 0xf6, 0xe1, 0x73, 0xb6, + 0xe8, 0xdd, 0x16, 0x67, 0x8a, 0x70, 0x34, 0xba, + 0xd4, 0x62, 0xb5, 0x8f, 0x69, 0x69, 0xf3, 0x34, + 0xb6, 0x85, 0x69, 0x8f, 0x63, 0x0c, 0xe2, 0xce, + 0x30, 0x38, 0xf2, 0x4d, 0x78, 0xa7, 0x98, 0x1d, + 0xc0, 0x0a, 0x50, 0x5e, 0x94, 0x5a, 0x04, 0x87, + 0x05, 0xae, 0x8f, 0x93, 0x63, 0x18, 0x7c, 0x80, + 0xba, 0xb7, 0xe9, 0xb6, 0xdf, 0x82, 0x7c, 0xb5, + 0x30, 0x20, 0xce, 0xaf, 0xe5, 0x25, 0xda, 0x68, + 0x76, 0x1a, 0x14, 0x9f, 0x88, 0x8c, 0x9f, 0x76, + 0x57, 0x1a, 0xf9, 0x4d, 0x3c, 0x6b, 0xd5, 0x3d, + 0x91, 0x81, 0xec, 0x73, 0x0d, 0xc3, 0x81, 0x04, + 0x7d, 0x52, 0x3c, 0x09, 0x84, 0x59, 0x2f, 0x63, + 0x98, 0x40, 0x78, 0x2d, 0xfb, 0xff, 0x00, 0xb2, + 0x02, 0x87, 0x3f, 0x23, 0x3f, 0x2e, 0x06, 0xea, + 0x91, 0xaa, 0xc1, 0xe5, 0x72, 0x4f, 0x81, 0xce, + 0xd9, 0x4b, 0x9e, 0xab, 0x7d, 0xce, 0xe2, 0x3c, + 0xc2, 0xe7, 0x01, 0x41, 0x4a, 0x2f, 0x3e, 0xe4, + 0xb0, 0xa6, 0x73, 0xdd, 0xb5, 0xa3, 0xc6, 0x8b, + 0xd0, 0xc1, 0x7c, 0xc9, 0x2f, 0x19, 0x8d, 0xeb, + 0x57, 0xb9, 0x42, 0x7c, 0xe7, 0x64, 0x03, 0xb8, + 0x5c, 0xdd, 0x77, 0x85, 0x13, 0x66, 0x9d, 0xb1, + 0xbb, 0x4d, 0x4a, 0xab, 0x34, 0x12, 0x42, 0x2a, + 0xea, 0x7d, 0x15, 0x8e, 0x1e, 0x42, 0x73, 0x98, + 0x3c, 0x0a, 0xd2, 0xcf, 0x25, 0xb2, 0x55, 0x65, + 0xfb, 0x9b, 0x32, 0xb2, 0xaa, 0xa5, 0x9d, 0x7d, + 0x13, 0x63, 0xe3, 0x2c, 0x70, 0x06, 0x47, 0xa5, + 0x6c, 0x14, 0xb4, 0xbd, 0x0d, 0x95, 0xac, 0x4e, + 0x3d, 0x99, 0x51, 0x4b, 0x2b, 0xa8, 0x7d, 0xa1, + 0x50, 0xa4, 0xe2, 0x46, 0x2b, 0xa4, 0x2d, 0x9e, + 0x37, 0x4a, 0xf7, 0x90, 0x18, 0xc1, 0xfa, 0xd5, + 0xf0, 0xf7, 0x15, 0xf2, 0xf6, 0x71, 0xa5, 0xa7, + 0x5e, 0xd5, 0xae, 0x9f, 0x28, 0xe6, 0xcb, 0x86, + 0xbe, 0x2e, 0xbd, 0xd3, 0xfa, 0xaf, 0x59, 0xb1, + 0x40, 0x50, 0xaf, 0xb4, 0x3f, 0x4a, 0x27, 0xb1, + 0x62, 0x71, 0x9e, 0xe6, 0x46, 0x38, 0x61, 0x91, + 0xd1, 0xee, 0x71, 0x94, 0xd9, 0xad, 0xa6, 0x81, + 0x56, 0xc6, 0x18, 0x8f, 0x64, 0xd9, 0xf9, 0x0c, + 0xdf, 0x1c, 0x54, 0x63, 0x23, 0x16, 0xa9, 0x3d, + 0x56, 0xcb, 0xb1, 0xa3, 0x70, 0xf4, 0x32, 0x78, + 0xb6, 0x42, 0x79, 0xe1, 0x64, 0xd1, 0x98, 0xdc, + 0x2b, 0xfe, 0xeb, 0x2d, 0x92, 0xdf, 0x6d, 0xee, + 0x61, 0xd1, 0xa6, 0x8b, 0x6b, 0x9d, 0x26, 0x24, + 0x8f, 0x0e, 0xc5, 0x61, 0x8c, 0x11, 0xe6, 0x69, + 0xef, 0xe0, 0xb0, 0xf9, 0xce, 0xa6, 0x5c, 0xa0, + 0xfe, 0xf2, 0xa6, 0x7d, 0x68, 0x9c, 0x6e, 0x6f, + 0xd4, 0x71, 0x66, 0xb7, 0x83, 0x75, 0xf1, 0x8c, + 0x96, 0x47, 0x8f, 0x11, 0xd9, 0xbe, 0x83, 0x45, + 0x5b, 0xe6, 0x7e, 0xe8, 0xc8, 0x87, 0x26, 0x3a, + 0xc6, 0xd9, 0x5a, 0x5a, 0x40, 0xf0, 0x51, 0xfc, + 0x62, 0x70, 0xec, 0x76, 0x80, 0x68, 0x45, 0x93, + 0xfe, 0x69, 0xf8, 0x6c, 0xe3, 0x59, 0x3e, 0x5c, + 0x7b, 0xe2, 0x63, 0x80, 0xb0, 0xa9, 0x15, 0x0b, + 0xc4, 0xe9, 0xaa, 0xff, 0x00, 0x69, 0x53, 0x2d, + 0x79, 0xcd, 0x9c, 0x23, 0xda, 0xed, 0xd1, 0x5f, + 0x06, 0xbe, 0x89, 0x7c, 0x98, 0x1d, 0xf9, 0x4f, + 0xbe, 0xe7, 0x56, 0xcb, 0xaa, 0x4f, 0x4b, 0x3d, + 0xd4, 0xd4, 0x55, 0x68, 0x31, 0xf9, 0x3e, 0x19, + 0xb5, 0xf7, 0x28, 0xfd, 0xed, 0x21, 0x9e, 0x5f, + 0x4d, 0x48, 0xa0, 0x52, 0xbf, 0x93, 0xf8, 0xfb, + 0x8b, 0x5d, 0xb0, 0x82, 0xd0, 0xe2, 0xe0, 0x1b, + 0xd5, 0xc1, 0x7b, 0xff, 0x00, 0xd6, 0xeb, 0xcf, + 0xfd, 0x6f, 0xf6, 0x3c, 0x57, 0x54, 0xb6, 0x83, + 0x27, 0x31, 0x9b, 0xab, 0xcd, 0x7c, 0x12, 0x4e, + 0x60, 0xbc, 0xca, 0xcd, 0xc6, 0xb6, 0x3f, 0xad, + 0x69, 0xb9, 0xa9, 0x31, 0x1f, 0x95, 0xbf, 0x10, + 0xd6, 0x32, 0xd6, 0x8a, 0x69, 0x42, 0x05, 0x16, + 0x67, 0x96, 0xfe, 0x6b, 0x07, 0x81, 0x54, 0xee, + 0xf5, 0x30, 0xd7, 0xad, 0xe4, 0xad, 0x15, 0x2d, + 0xf4, 0xe9, 0xf8, 0x9b, 0xe0, 0x51, 0x75, 0xa2, + 0xd8, 0x6f, 0xf1, 0x13, 0x48, 0x27, 0xff, 0x00, + 0xd9, 0xab, 0x61, 0x81, 0x0c, 0x99, 0x0e, 0x6b, + 0x1b, 0xaf, 0x52, 0xb2, 0x1f, 0x11, 0x6e, 0xe8, + 0x27, 0x1f, 0xf2, 0x0b, 0x7d, 0x0c, 0xb1, 0xf1, + 0xb8, 0x4d, 0x70, 0x15, 0x9e, 0x5f, 0x4f, 0x7b, + 0xaf, 0x9b, 0xc8, 0xa6, 0xe7, 0xad, 0x4b, 0xc6, + 0x38, 0x1d, 0xf1, 0xdc, 0x71, 0x8c, 0x8d, 0xce, + 0x04, 0xa7, 0x40, 0xbe, 0x1c, 0x79, 0x1e, 0x35, + 0x6b, 0x49, 0x0b, 0x29, 0xc5, 0x4b, 0x94, 0x65, + 0x0f, 0x73, 0x8b, 0x89, 0xbd, 0x2a, 0xb5, 0x4f, + 0x93, 0xfe, 0x8b, 0xdc, 0xe1, 0x42, 0x5b, 0xb7, + 0xf1, 0x5b, 0x51, 0x18, 0x64, 0xb3, 0x62, 0xde, + 0x2d, 0xce, 0x76, 0x74, 0x27, 0x69, 0x1b, 0xb7, + 0x38, 0xb8, 0x8a, 0x02, 0x08, 0x34, 0x5a, 0x14, + 0x97, 0x87, 0x04, 0xe4, 0x56, 0x50, 0x7d, 0xcd, + 0x94, 0x17, 0xb0, 0x00, 0xa7, 0x4a, 0xe6, 0x60, + 0x90, 0x4e, 0xc0, 0xde, 0x43, 0x68, 0x34, 0xf3, + 0x82, 0x0d, 0xe8, 0x2e, 0x9f, 0xa4, 0x1c, 0x9e, + 0xf8, 0xf2, 0xdf, 0x6f, 0x53, 0x9a, 0xe6, 0x93, + 0xa7, 0xd8, 0xa0, 0x24, 0xe6, 0xdc, 0x3f, 0x2c, + 0xf8, 0x76, 0x9b, 0x1f, 0x57, 0xd1, 0x79, 0xdf, + 0x27, 0x92, 0xf8, 0x1e, 0xe2, 0xc6, 0xda, 0xb7, + 0x2b, 0xd1, 0x72, 0xc0, 0xca, 0xc4, 0x64, 0xc0, + 0x91, 0xbd, 0xb7, 0x1e, 0x22, 0xc5, 0x61, 0xf9, + 0x9e, 0x36, 0x47, 0x17, 0x10, 0x68, 0x3c, 0x02, + 0xea, 0xc1, 0x7c, 0x89, 0x7d, 0x1f, 0xe9, 0x99, + 0xdd, 0x2f, 0x53, 0x1f, 0x99, 0x96, 0xf9, 0x89, + 0xae, 0xb7, 0x52, 0x70, 0x87, 0xff, 0x00, 0xd0, + 0x65, 0x7c, 0x51, 0x9f, 0x84, 0xf8, 0x3c, 0xce, + 0x14, 0x1a, 0x0b, 0x23, 0x85, 0x15, 0xe4, 0x19, + 0x4b, 0x8a, 0x15, 0xd4, 0xed, 0x95, 0xe5, 0xa5, + 0xb2, 0x25, 0x3a, 0x7e, 0x46, 0x37, 0x4b, 0xc5, + 0x6e, 0x3e, 0xd0, 0x6f, 0x38, 0x99, 0x62, 0x66, + 0x2e, 0x4e, 0xfb, 0xb8, 0xb4, 0xd0, 0xfd, 0x94, + 0x5c, 0x57, 0x21, 0x06, 0x0b, 0xdf, 0x24, 0x91, + 0x7b, 0xae, 0x20, 0x86, 0xdf, 0x41, 0xd5, 0x50, + 0x6b, 0xdc, 0xd0, 0x40, 0x36, 0x3a, 0xaf, 0x9a, + 0x75, 0x51, 0xd6, 0xea, 0x3a, 0xf6, 0x3b, 0x77, + 0xbf, 0xd9, 0x9a, 0xf5, 0x6a, 0x3e, 0x13, 0x38, + 0x1e, 0x4b, 0x25, 0x5a, 0xa5, 0xf6, 0x28, 0xd4, + 0x6e, 0xce, 0x5f, 0x0a, 0x3c, 0x79, 0x60, 0x6e, + 0x39, 0xfe, 0x31, 0x24, 0xba, 0xb7, 0xba, 0xab, + 0x81, 0x9d, 0x1e, 0x3b, 0x65, 0x86, 0x68, 0xfd, + 0xc8, 0x25, 0xf5, 0x32, 0xba, 0x78, 0x85, 0x48, + 0x6b, 0x54, 0x1f, 0x12, 0xba, 0xd6, 0x1c, 0x4a, + 0xae, 0xba, 0xc6, 0xfb, 0x95, 0xf2, 0x64, 0x6d, + 0x3d, 0x0b, 0x19, 0xb3, 0xc1, 0x34, 0x80, 0xe3, + 0xc7, 0xed, 0x46, 0xd1, 0x40, 0x3b, 0xac, 0x2e, + 0x70, 0x27, 0x32, 0x5f, 0xfd, 0x8a, 0xd9, 0x1e, + 0xeb, 0x1f, 0x9b, 0x4f, 0xcd, 0xcb, 0xd7, 0xcc, + 0xb3, 0xec, 0x25, 0xc6, 0xa9, 0x49, 0xd1, 0xd6, + 0x99, 0xb3, 0x70, 0x3b, 0xf8, 0xac, 0xc5, 0xae, + 0x2d, 0x71, 0xb0, 0x2b, 0x6f, 0x3c, 0x31, 0xf2, + 0x5c, 0x4c, 0xf8, 0x7f, 0xb4, 0xf6, 0x92, 0xd3, + 0xe2, 0x2e, 0x17, 0x9f, 0xf0, 0xb2, 0x7b, 0x72, + 0x90, 0x35, 0x21, 0x6e, 0xb8, 0x59, 0x69, 0x13, + 0x1c, 0x6f, 0x53, 0xe6, 0x5e, 0x17, 0x66, 0x70, + 0x77, 0x25, 0x69, 0xc6, 0x2c, 0x7b, 0xf8, 0x92, + 0xcb, 0xd7, 0xd7, 0xd8, 0xf3, 0x92, 0x27, 0x8a, + 0x47, 0x46, 0xf1, 0x47, 0x30, 0xd0, 0x8f, 0x10, + 0xac, 0x40, 0xc9, 0xb2, 0x24, 0x6c, 0x43, 0xf6, + 0x8d, 0xd6, 0xab, 0x96, 0xe2, 0x78, 0xd8, 0xf9, + 0x19, 0x1f, 0x92, 0xdf, 0x6e, 0x37, 0x52, 0x40, + 0xe2, 0x7d, 0x44, 0xfa, 0x87, 0xd9, 0x51, 0xc3, + 0x8b, 0x05, 0xd9, 0xcd, 0x76, 0x20, 0xfe, 0x15, + 0x00, 0xaf, 0x8a, 0xf6, 0xfb, 0x5d, 0xfa, 0xe3, + 0xea, 0xd7, 0x25, 0x5d, 0xb9, 0x5d, 0x24, 0x9f, + 0xc9, 0xe7, 0x61, 0xea, 0xab, 0xe6, 0x86, 0xb4, + 0xae, 0xac, 0x65, 0x81, 0xf0, 0xec, 0x4c, 0x98, + 0x07, 0xba, 0x0e, 0xe3, 0xd5, 0x60, 0xbe, 0x6b, + 0xc4, 0xc9, 0xc4, 0xf2, 0xc7, 0x15, 0xd7, 0x8e, + 0x9b, 0xa2, 0x3f, 0xf1, 0x2b, 0xd9, 0xf8, 0xd0, + 0x0c, 0x62, 0x83, 0xb2, 0xc0, 0x7f, 0x96, 0xf0, + 0xa4, 0x97, 0x37, 0x12, 0x78, 0xa2, 0x73, 0x83, + 0x58, 0x44, 0x8f, 0x02, 0xa0, 0x5d, 0x78, 0xf5, + 0xee, 0x65, 0xc9, 0x57, 0x5c, 0x97, 0x93, 0xaf, + 0x2e, 0x2a, 0x4c, 0xd1, 0x43, 0x46, 0x6f, 0xe2, + 0xaf, 0x73, 0x62, 0x90, 0x81, 0x5f, 0x3b, 0x6b, + 0xf4, 0x5a, 0xfe, 0x4e, 0x56, 0xcf, 0x95, 0x0b, + 0x5b, 0x52, 0xd6, 0xb4, 0x58, 0x2c, 0xbf, 0xc3, + 0x9a, 0xd3, 0x0c, 0xd5, 0xa7, 0xa8, 0x54, 0x2d, + 0x56, 0x36, 0x37, 0xbb, 0x9c, 0xda, 0xd6, 0x96, + 0x58, 0x5a, 0x39, 0x32, 0xc9, 0x7d, 0x0b, 0xdc, + 0xd2, 0xf1, 0x38, 0xc0, 0x96, 0x9d, 0xa6, 0x94, + 0x4f, 0xf2, 0x5a, 0xd6, 0xe0, 0x3a, 0xa2, 0xba, + 0x10, 0x0f, 0x71, 0xf4, 0x50, 0x60, 0xc0, 0xd6, + 0x01, 0x4b, 0x58, 0x28, 0xb9, 0x69, 0x5e, 0x64, + 0x6c, 0x01, 0xd4, 0x8d, 0xb7, 0x70, 0xd0, 0x9a, + 0xad, 0x6a, 0x63, 0x72, 0x5e, 0x0a, 0x36, 0x86, + 0x48, 0xf2, 0x6a, 0xef, 0x4e, 0xb5, 0x34, 0xa9, + 0x29, 0xb2, 0xab, 0x81, 0x8e, 0xc8, 0x60, 0x1b, + 0x45, 0x0b, 0xfc, 0xc7, 0xee, 0xad, 0x2b, 0x15, + 0x04, 0xbb, 0x99, 0x88, 0x3f, 0x1c, 0x3e, 0x95, + 0x2d, 0x34, 0xfb, 0x3a, 0xc9, 0x8a, 0xaf, 0x9f, + 0x1b, 0xa4, 0xc5, 0x7b, 0x5b, 0xad, 0x2b, 0xf8, + 0x20, 0x16, 0x71, 0xfe, 0x7c, 0x39, 0x23, 0xfe, + 0x93, 0xed, 0x5d, 0x76, 0x94, 0x93, 0x98, 0x33, + 0xc6, 0x09, 0x61, 0xee, 0x6c, 0x9a, 0xe3, 0x65, + 0xbb, 0x1a, 0x7a, 0xb9, 0x9b, 0x84, 0x9e, 0x57, + 0x81, 0xaa, 0x8b, 0x98, 0xc7, 0x6b, 0xda, 0xe2, + 0x19, 0x5a, 0x8b, 0xf5, 0x5a, 0x63, 0xc8, 0xe8, + 0xf4, 0x21, 0xd6, 0x4f, 0x36, 0xe7, 0x32, 0x32, + 0x26, 0xb4, 0xae, 0x04, 0x0b, 0x84, 0x8e, 0x39, + 0x1f, 0x13, 0xf7, 0x34, 0xd1, 0xc3, 0xa8, 0x5a, + 0x3e, 0x77, 0x1d, 0xad, 0x73, 0xbc, 0xba, 0x56, + 0xab, 0x2d, 0x3c, 0xac, 0x8d, 0xe7, 0x5f, 0x1f, + 0xaa, 0xda, 0xd9, 0xdd, 0xdc, 0xb7, 0xac, 0x41, + 0x9f, 0x8d, 0x6c, 0x34, 0x87, 0x37, 0x27, 0xac, + 0xae, 0x57, 0x19, 0x9b, 0x20, 0x6d, 0x4b, 0xca, + 0xce, 0x0e, 0x46, 0x36, 0x53, 0x5a, 0xf5, 0x0b, + 0xbf, 0xee, 0xf1, 0xf8, 0xab, 0xf9, 0xdc, 0x6e, + 0x51, 0xe2, 0x5e, 0xc3, 0xb9, 0x79, 0x09, 0x74, + 0x0f, 0x2a, 0x0f, 0xcf, 0xe4, 0x7f, 0x54, 0xa4, + 0xce, 0xe4, 0xd8, 0x4f, 0x55, 0xd0, 0xce, 0x63, + 0x85, 0xaa, 0x9e, 0x77, 0xee, 0x3c, 0x35, 0xf6, + 0x19, 0x3f, 0x90, 0xc9, 0x3a, 0x4a, 0xe1, 0xf7, + 0x54, 0xe4, 0x90, 0xb9, 0xc5, 0xc4, 0xd4, 0x9d, + 0x4a, 0xaa, 0x73, 0x59, 0x52, 0xb8, 0x76, 0x5b, + 0x3c, 0x51, 0xe6, 0x9d, 0xdc, 0x92, 0xb1, 0xc6, + 0xcb, 0x71, 0xb7, 0x1d, 0x97, 0xb7, 0x2d, 0x80, + 0xda, 0xb6, 0x5e, 0x8b, 0xc3, 0x3c, 0x7b, 0x71, + 0xd3, 0xbd, 0xc2, 0xf2, 0x36, 0x65, 0xb5, 0x92, + 0x31, 0xe3, 0x50, 0x42, 0xf4, 0xdf, 0x8e, 0x65, + 0x89, 0x62, 0x63, 0xab, 0xa8, 0x04, 0x2f, 0x3f, + 0xbf, 0x7e, 0x59, 0x39, 0xbd, 0x65, 0x1e, 0x87, + 0x51, 0xff, 0x00, 0x1d, 0xab, 0xf3, 0xa1, 0x27, + 0xf9, 0x17, 0x0d, 0xdf, 0x91, 0xc7, 0xce, 0x60, + 0x27, 0xdb, 0xab, 0x1d, 0x4e, 0x81, 0xcb, 0x39, + 0xf1, 0x49, 0xc4, 0x85, 0xcc, 0xea, 0xc3, 0x5a, + 0xaf, 0x4c, 0xc9, 0xc5, 0x87, 0x91, 0xe3, 0x1f, + 0x8d, 0x38, 0x0e, 0x6b, 0xdb, 0xa7, 0x6b, 0x2c, + 0x5f, 0x1f, 0xc0, 0x7f, 0x6b, 0x9e, 0x48, 0xd9, + 0x76, 0xb8, 0xd6, 0xab, 0x3c, 0xb9, 0x6d, 0x7c, + 0x35, 0xc6, 0xdc, 0xaa, 0xec, 0x6b, 0x86, 0xaa, + 0xb7, 0xb5, 0xbd, 0x6d, 0xbb, 0x35, 0xbc, 0x3c, + 0xa4, 0x80, 0xd2, 0xbb, 0xe4, 0xc3, 0x25, 0x99, + 0xac, 0x7b, 0x43, 0x9a, 0x41, 0x04, 0x1b, 0x8a, + 0x2a, 0x5c, 0x6b, 0x8c, 0x73, 0xb0, 0x77, 0x57, + 0xb2, 0x1a, 0x4c, 0xdb, 0x8f, 0x45, 0x95, 0x5c, + 0x24, 0x4b, 0x4b, 0x97, 0xe2, 0x62, 0x73, 0xf8, + 0x1f, 0xec, 0xd9, 0xb2, 0xbb, 0x1e, 0x83, 0x1f, + 0x24, 0x87, 0xc7, 0xe1, 0xe0, 0x9d, 0x70, 0x50, + 0x3d, 0xd2, 0x87, 0xbe, 0x87, 0xc4, 0x26, 0x7c, + 0xce, 0x18, 0xc9, 0xc7, 0x86, 0xa2, 0xb4, 0x75, + 0x3e, 0x80, 0xa9, 0xf8, 0xbc, 0x16, 0x40, 0x40, + 0x02, 0xaa, 0xe9, 0xbb, 0x33, 0x9a, 0xcf, 0x8d, + 0xbe, 0x07, 0x98, 0xf1, 0xd2, 0x9d, 0xa9, 0xaa, + 0x51, 0x9f, 0x94, 0xcc, 0x8c, 0xda, 0x32, 0xae, + 0x17, 0x60, 0xa7, 0x5a, 0x5a, 0xa1, 0x36, 0x95, + 0xcd, 0x87, 0x0e, 0x47, 0x93, 0xb6, 0xad, 0xa0, + 0x54, 0xb8, 0x7c, 0x76, 0xca, 0xf3, 0x3b, 0x80, + 0x2d, 0x60, 0x0d, 0x68, 0xf1, 0xa9, 0x3f, 0xf9, + 0x5d, 0x09, 0x42, 0x32, 0x6e, 0x46, 0xb0, 0x37, + 0x6c, 0x2c, 0x6d, 0xec, 0xd0, 0x2f, 0xaa, 0x91, + 0x7c, 0x5f, 0x54, 0x90, 0x0b, 0xe1, 0x15, 0x14, + 0x5f, 0x50, 0x80, 0xcf, 0xf3, 0x50, 0xc7, 0x8f, + 0x92, 0xc9, 0x40, 0xd9, 0x1b, 0xc7, 0xa8, 0x77, + 0x1a, 0xe8, 0xac, 0xec, 0x19, 0x38, 0x0c, 0x90, + 0x83, 0xb8, 0x0a, 0x38, 0x0d, 0x6d, 0xa2, 0xb9, + 0xc8, 0x61, 0x0c, 0xc8, 0x76, 0x07, 0x6d, 0x70, + 0x35, 0x69, 0xe8, 0x93, 0x47, 0x93, 0x93, 0x81, + 0x23, 0xa3, 0x37, 0x15, 0x01, 0xed, 0xed, 0xd2, + 0xc5, 0x01, 0x9c, 0xe7, 0xb8, 0xad, 0xc1, 0xc0, + 0x35, 0xde, 0x24, 0x85, 0x80, 0xe4, 0xb8, 0xa9, + 0x58, 0xf3, 0x46, 0xb8, 0x9e, 0xe4, 0x1a, 0x2f, + 0x77, 0x91, 0xac, 0x96, 0x30, 0xe1, 0x42, 0xd7, + 0x0a, 0xa4, 0xf9, 0xb8, 0xd1, 0x54, 0xff, 0x00, + 0x0d, 0xbf, 0x80, 0x55, 0x76, 0x82, 0x52, 0x93, + 0xc1, 0xe4, 0xc4, 0x9d, 0xa4, 0x8f, 0x6d, 0xdf, + 0x81, 0x51, 0x9c, 0x49, 0xff, 0x00, 0x71, 0xc3, + 0xec, 0xbd, 0x83, 0x2b, 0x1a, 0x10, 0xe2, 0x76, + 0x33, 0xec, 0x02, 0x5f, 0x97, 0x1c, 0x2f, 0x8f, + 0x60, 0x63, 0x41, 0x07, 0xb2, 0xa7, 0x94, 0xd5, + 0x63, 0xd0, 0xf2, 0xf3, 0x89, 0x93, 0xfd, 0x37, + 0x7e, 0x0a, 0xff, 0x00, 0x15, 0xc1, 0x66, 0xe7, + 0xb8, 0xb5, 0xa0, 0xb1, 0x83, 0xd4, 0x4d, 0x96, + 0xea, 0x66, 0x44, 0xc8, 0xaa, 0xd8, 0xc1, 0xfb, + 0x2f, 0x98, 0x79, 0x90, 0xc3, 0xfc, 0x37, 0x37, + 0x61, 0x26, 0xb5, 0x1e, 0x28, 0xf2, 0x38, 0xd0, + 0x56, 0x8b, 0x92, 0xe5, 0xb0, 0x80, 0xfc, 0x14, + 0xec, 0xb4, 0xd5, 0x77, 0x64, 0x9f, 0x94, 0xf8, + 0xee, 0x5f, 0x1f, 0x57, 0x38, 0x6f, 0x67, 0x70, + 0xbd, 0x02, 0x69, 0xc8, 0x7b, 0x5c, 0xd7, 0x6e, + 0x6b, 0xae, 0x48, 0x50, 0xe7, 0x46, 0xcc, 0xb8, + 0x08, 0x37, 0xb7, 0x55, 0x9a, 0xcb, 0x65, 0xb9, + 0xd3, 0xe0, 0xc6, 0xd6, 0x9b, 0x9e, 0x65, 0xed, + 0x48, 0x74, 0x69, 0xfc, 0x16, 0xe7, 0xe2, 0x99, + 0x32, 0x37, 0x05, 0x84, 0xd4, 0x39, 0xb6, 0x35, + 0xf0, 0x54, 0xc4, 0x4c, 0x63, 0x8b, 0x4b, 0x06, + 0xe6, 0x78, 0x26, 0x3c, 0x69, 0x69, 0x8d, 0xd4, + 0x1b, 0x68, 0x74, 0x4c, 0x96, 0x56, 0xaa, 0xf8, + 0x33, 0xc3, 0x47, 0x4c, 0x9c, 0x5f, 0xb1, 0xbd, + 0xe2, 0x32, 0xfd, 0xe8, 0x6e, 0x54, 0x7c, 0x84, + 0x6d, 0x69, 0x2e, 0x02, 0xe7, 0xaa, 0xa3, 0xc0, + 0xcb, 0xe4, 0x0d, 0x1a, 0xa6, 0xf9, 0xb1, 0x07, + 0x46, 0x1c, 0x2e, 0xa8, 0xb5, 0x46, 0xaf, 0x46, + 0x2f, 0xc6, 0x6e, 0xc7, 0xb5, 0xd5, 0xad, 0xc2, + 0x6c, 0xf6, 0x6e, 0x15, 0x1e, 0x09, 0x6c, 0x30, + 0x1d, 0x8e, 0x77, 0x63, 0xa2, 0x73, 0x8c, 0xd2, + 0xf8, 0xda, 0x75, 0xb2, 0x9a, 0xa6, 0x46, 0x4b, + 0x2d, 0x19, 0xcb, 0x31, 0x84, 0xf0, 0x16, 0x1d, + 0x46, 0x8a, 0x5c, 0x4c, 0x7d, 0x9e, 0xaa, 0xdb, + 0x52, 0xac, 0xe3, 0xc3, 0xb4, 0x54, 0xaf, 0xb9, + 0x8f, 0x6c, 0x38, 0xd2, 0x3b, 0x47, 0x10, 0x43, + 0x57, 0x45, 0x2b, 0x07, 0x26, 0x47, 0x2c, 0x5d, + 0xc9, 0x67, 0xb6, 0x66, 0xb6, 0x1c, 0x73, 0x50, + 0x0d, 0x0d, 0xa9, 0x53, 0xd8, 0x26, 0x5c, 0x6c, + 0x2f, 0x87, 0x11, 0x8c, 0x78, 0xa3, 0xae, 0x48, + 0xfa, 0xa5, 0x3c, 0x74, 0x47, 0x27, 0x35, 0xae, + 0x94, 0x87, 0x47, 0x10, 0x2e, 0x03, 0xfe, 0x5a, + 0x0f, 0xaa, 0xd0, 0x2b, 0x99, 0x82, 0x10, 0x84, + 0x00, 0x84, 0x21, 0x00, 0x24, 0xbc, 0xe6, 0x3d, + 0x64, 0x64, 0xc7, 0xd0, 0x35, 0x03, 0xa9, 0xf1, + 0x4e, 0x97, 0x0f, 0x8d, 0x92, 0x0d, 0xaf, 0x01, + 0xc3, 0xb1, 0x40, 0x2d, 0xe2, 0xe6, 0x64, 0xb1, + 0x98, 0x09, 0xa3, 0xbd, 0x4d, 0x07, 0x5a, 0x75, + 0x0b, 0xee, 0x56, 0x31, 0x70, 0x36, 0x15, 0xea, + 0xab, 0x66, 0xf1, 0xf3, 0x62, 0x4a, 0xdc, 0x8c, + 0x52, 0xed, 0xa0, 0xda, 0x97, 0xa7, 0x85, 0xd5, + 0x9c, 0x5e, 0x41, 0xb9, 0x5b, 0x23, 0x94, 0x6d, + 0x91, 0xd5, 0x1f, 0x71, 0xd1, 0x1a, 0x92, 0x53, + 0x81, 0x16, 0x76, 0x19, 0xbd, 0xa9, 0xdd, 0x24, + 0xc8, 0x85, 0xcd, 0x24, 0x10, 0xb6, 0xd9, 0x58, + 0xa0, 0xd6, 0xd7, 0x48, 0xb3, 0xf0, 0x85, 0x6b, + 0xb0, 0xac, 0xad, 0x43, 0x5a, 0xdc, 0xcd, 0xb8, + 0x01, 0xd3, 0xec, 0xa1, 0x7c, 0x6c, 0x2e, 0xa9, + 0x6d, 0xd3, 0x19, 0xe1, 0x00, 0x9f, 0x21, 0xb2, + 0xa8, 0xe6, 0x53, 0xa5, 0x02, 0xa7, 0x16, 0x5e, + 0x53, 0x38, 0x8e, 0x8d, 0x14, 0x22, 0xad, 0x3d, + 0x17, 0x42, 0xad, 0x24, 0x1f, 0x4d, 0x2c, 0xa1, + 0x93, 0x22, 0x38, 0xe9, 0xb8, 0xae, 0xe0, 0x9e, + 0x29, 0x7c, 0x83, 0x53, 0xe9, 0x55, 0xb5, 0x19, + 0xa6, 0x3b, 0x25, 0xa0, 0xb7, 0x35, 0x82, 0x39, + 0x3d, 0xc0, 0x3c, 0x4a, 0xb5, 0x89, 0xed, 0x3d, + 0xa1, 0xd1, 0x68, 0xe1, 0x71, 0xe2, 0xba, 0xcb, + 0xc7, 0x26, 0xad, 0x23, 0xc1, 0x45, 0xc4, 0x62, + 0xc8, 0xc6, 0xbc, 0x10, 0x7d, 0x46, 0x8a, 0xab, + 0x4d, 0x19, 0xad, 0xa1, 0xb5, 0x64, 0x6a, 0x38, + 0x96, 0xfb, 0x6c, 0x0e, 0xf1, 0xba, 0x7c, 0x08, + 0x7c, 0x74, 0x1d, 0x6f, 0x44, 0x9b, 0x8a, 0x8c, + 0xec, 0xda, 0x41, 0xba, 0x75, 0x85, 0x13, 0x87, + 0x94, 0xff, 0x00, 0xa0, 0xad, 0x54, 0x67, 0x7b, + 0x1d, 0x41, 0x8d, 0xe4, 0x26, 0x9a, 0xea, 0xaf, + 0xe2, 0xc5, 0xb6, 0x20, 0x17, 0x51, 0x45, 0x4b, + 0x74, 0x53, 0xb1, 0xad, 0x63, 0x4d, 0x6c, 0x05, + 0xc9, 0x5b, 0x56, 0xa7, 0x3d, 0xef, 0x27, 0x13, + 0x4d, 0x1e, 0x3c, 0x26, 0x47, 0x9a, 0x01, 0xd7, + 0xc5, 0x26, 0x12, 0xe5, 0xe7, 0xb8, 0xb1, 0xae, + 0xa9, 0x71, 0xf2, 0x83, 0x60, 0x07, 0xd1, 0x49, + 0xca, 0xe5, 0x37, 0x22, 0x46, 0xc2, 0xcb, 0xb6, + 0x23, 0xb8, 0x8f, 0xde, 0xb5, 0xa8, 0xaf, 0xf1, + 0x70, 0x7b, 0x78, 0xfb, 0xdc, 0xc0, 0xd7, 0xbe, + 0xe4, 0xf5, 0x21, 0x68, 0x63, 0x24, 0xb8, 0x78, + 0x71, 0xe3, 0x32, 0x80, 0x79, 0x8e, 0xa7, 0xc5, + 0x59, 0x42, 0x10, 0x02, 0x10, 0x84, 0x00, 0x84, + 0x21, 0x00, 0x21, 0x08, 0x40, 0x7c, 0x73, 0x43, + 0x9a, 0x5a, 0x6e, 0x0d, 0x88, 0x59, 0xfc, 0xec, + 0x69, 0x70, 0xb3, 0x44, 0xf1, 0xd4, 0xc4, 0xfb, + 0xf7, 0xa1, 0x5a, 0x15, 0x1c, 0xf0, 0x32, 0x66, + 0x16, 0x3c, 0x54, 0x14, 0x05, 0x4c, 0x6c, 0xe8, + 0xb2, 0xc6, 0xc7, 0x8d, 0x8f, 0xe9, 0x5b, 0x54, + 0x2e, 0x72, 0x30, 0xda, 0xed, 0x6f, 0x55, 0x4f, + 0x2b, 0x8a, 0xca, 0x8c, 0x7f, 0xd6, 0x06, 0x40, + 0x49, 0x26, 0xf4, 0x20, 0x78, 0x28, 0x61, 0xe4, + 0x33, 0x30, 0xc6, 0xc7, 0x56, 0x48, 0xeb, 0xfc, + 0xb9, 0x2c, 0xe6, 0x8f, 0xa9, 0x40, 0x45, 0x99, + 0xc6, 0x34, 0xd6, 0x96, 0xee, 0x94, 0x65, 0x71, + 0x20, 0xd8, 0x56, 0xeb, 0x63, 0x1c, 0xd8, 0xb9, + 0x2c, 0xdc, 0xd7, 0x6c, 0x77, 0xed, 0x35, 0xdd, + 0x14, 0x6f, 0xc4, 0x63, 0xee, 0xd2, 0x1d, 0xf4, + 0x51, 0x08, 0x99, 0x3c, 0xfa, 0x7e, 0x1a, 0xa7, + 0x53, 0x55, 0xf6, 0x2e, 0x21, 0xed, 0xa1, 0x60, + 0x75, 0x7e, 0x8b, 0x74, 0xee, 0x35, 0xa4, 0xfa, + 0x41, 0xfb, 0x2e, 0xe3, 0xe3, 0x58, 0x2e, 0x40, + 0x50, 0xea, 0x5b, 0x99, 0x93, 0x7f, 0x16, 0xf9, + 0x22, 0x6b, 0x88, 0x21, 0xc3, 0x55, 0x2e, 0x27, + 0x12, 0x18, 0xd0, 0x68, 0x42, 0xd6, 0xfe, 0x42, + 0x3d, 0xb4, 0x14, 0x5f, 0x19, 0x86, 0x05, 0x80, + 0xd1, 0x53, 0xc6, 0x69, 0xe6, 0xd0, 0x5b, 0x85, + 0x85, 0xb0, 0x5d, 0x36, 0x8b, 0x1c, 0x34, 0xd4, + 0x2e, 0xa3, 0x11, 0x0a, 0x82, 0xe1, 0x56, 0xeb, + 0x75, 0x0c, 0xfc, 0xb6, 0x2c, 0x35, 0x6c, 0x67, + 0x7b, 0x86, 0xb4, 0xe9, 0x6a, 0xab, 0xaa, 0xc1, + 0x9d, 0xae, 0xd9, 0x66, 0x49, 0xa1, 0x80, 0x56, + 0x47, 0x00, 0x7b, 0x75, 0xfc, 0x12, 0x8c, 0xde, + 0x49, 0xf9, 0x12, 0x18, 0x58, 0xd2, 0x62, 0xa6, + 0x83, 0x53, 0xe0, 0x54, 0x38, 0xf0, 0xe4, 0x72, + 0x33, 0x7b, 0x8e, 0xb1, 0x7d, 0xe4, 0xae, 0x80, + 0x54, 0xd3, 0xf4, 0x27, 0x98, 0xd8, 0x38, 0xf8, + 0xed, 0x01, 0x8d, 0xab, 0x87, 0xed, 0x1d, 0x55, + 0x8a, 0x14, 0xb8, 0xee, 0x2d, 0xa0, 0x37, 0x22, + 0x7a, 0xba, 0x53, 0xd3, 0x41, 0xe0, 0x9a, 0x01, + 0x4d, 0x10, 0xbe, 0xa0, 0x04, 0x21, 0x08, 0x01, + 0x08, 0x42, 0x00, 0x42, 0x10, 0x80, 0x10, 0x84, + 0x20, 0x04, 0x21, 0x08, 0x01, 0x43, 0x91, 0x8b, + 0x0e, 0x43, 0x0b, 0x25, 0x6d, 0x6b, 0xa1, 0xea, + 0x14, 0xc8, 0x40, 0x20, 0x7f, 0x07, 0x97, 0x1b, + 0x9c, 0xd8, 0x9e, 0xd7, 0x30, 0x9a, 0x87, 0x1a, + 0x82, 0x3c, 0x0a, 0x89, 0xee, 0xcd, 0xc3, 0x98, + 0x39, 0xcd, 0x31, 0xd0, 0x50, 0xd2, 0xa4, 0x1e, + 0xab, 0x48, 0xb8, 0x92, 0x36, 0x48, 0xdd, 0xb2, + 0x34, 0x39, 0xa7, 0xa1, 0x40, 0x2a, 0x8b, 0x9c, + 0x25, 0xcd, 0x64, 0x8c, 0x04, 0xb8, 0x56, 0xdf, + 0x4a, 0xae, 0x66, 0xe6, 0x6c, 0xd7, 0x46, 0x19, + 0x4e, 0xa3, 0x53, 0xe2, 0x13, 0x07, 0x71, 0xb8, + 0x2e, 0xdd, 0x58, 0x5b, 0xe7, 0x14, 0x71, 0x16, + 0x24, 0x7d, 0x97, 0x2d, 0xe2, 0x38, 0xe6, 0x59, + 0xb0, 0x81, 0x6a, 0x6a, 0x7f, 0xdd, 0x00, 0xbe, + 0x3e, 0x75, 0xe1, 0xdb, 0x5c, 0xc0, 0xe2, 0xe3, + 0x40, 0x34, 0x3f, 0x55, 0xdc, 0xdc, 0x94, 0x93, + 0xcb, 0xf9, 0x78, 0xc1, 0x14, 0x27, 0x76, 0xdf, + 0x0e, 0x85, 0x32, 0xfc, 0x96, 0x2e, 0xbe, 0xd3, + 0x7e, 0xaa, 0x48, 0xe1, 0x8a, 0x3a, 0xfb, 0x6d, + 0x0d, 0xad, 0xcd, 0x06, 0xa5, 0x01, 0x9f, 0x97, + 0x17, 0x36, 0xa3, 0x6b, 0x1c, 0x2a, 0x77, 0x78, + 0x9a, 0xda, 0xea, 0xce, 0x1f, 0x0e, 0xf2, 0xe1, + 0x26, 0x49, 0xa3, 0x86, 0xa0, 0x75, 0xfa, 0xa7, + 0x34, 0x5f, 0x50, 0x11, 0x43, 0x04, 0x50, 0x8a, + 0x46, 0xd0, 0xde, 0x96, 0x52, 0xa1, 0x08, 0x01, + 0x08, 0x42, 0x00, 0x42, 0x10, 0x80, 0x10, 0x84, + 0x20, 0x04, 0x21, 0x08, 0x01, 0x08, 0x42, 0x00, + 0x42, 0x10, 0x80, 0x10, 0x84, 0x20, 0x04, 0x21, + 0x08, 0x01, 0x08, 0x42, 0x00, 0x42, 0x10, 0x80, + 0x10, 0x84, 0x20, 0x04, 0x21, 0x08, 0x01, 0x08, + 0x42, 0x00, 0x42, 0x10, 0x80, 0x10, 0x84, 0x20, + 0x3f, 0xff, 0xd9, +}; + +static const uint8_t data_images_cortex_jpg[] = +{ + /* /images/cortex.jpg */ + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x63, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2e, 0x6a, + 0x70, 0x67, 0x00, + 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, + 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, + 0x00, 0x48, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43, + 0x00, 0x05, 0x03, 0x04, 0x04, 0x04, 0x03, 0x05, + 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x07, + 0x0c, 0x08, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x0b, + 0x0b, 0x09, 0x0c, 0x11, 0x0f, 0x12, 0x12, 0x11, + 0x0f, 0x11, 0x11, 0x13, 0x16, 0x1c, 0x17, 0x13, + 0x14, 0x1a, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18, + 0x1a, 0x1d, 0x1d, 0x1f, 0x1f, 0x1f, 0x13, 0x17, + 0x22, 0x24, 0x22, 0x1e, 0x24, 0x1c, 0x1e, 0x1f, + 0x1e, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x05, 0x05, + 0x05, 0x07, 0x06, 0x07, 0x0e, 0x08, 0x08, 0x0e, + 0x1e, 0x14, 0x11, 0x14, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0xff, 0xc0, + 0x00, 0x11, 0x08, 0x00, 0x3e, 0x00, 0xc7, 0x03, + 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, + 0x01, 0xff, 0xc4, 0x00, 0x1f, 0x00, 0x00, 0x01, + 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0xff, 0xc4, 0x00, 0xb5, 0x10, 0x00, + 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, + 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, + 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, + 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, + 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, + 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, + 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, + 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, + 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, + 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, + 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, + 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, + 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, + 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, + 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, + 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, + 0xfa, 0xff, 0xc4, 0x00, 0x1f, 0x01, 0x00, 0x03, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0xff, 0xc4, 0x00, 0xb5, 0x11, 0x00, + 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, + 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, + 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, + 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, + 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, + 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, + 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, + 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, + 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, + 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, + 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, + 0xfa, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, + 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0xf7, + 0xaf, 0x8e, 0x5f, 0x15, 0x6e, 0x3e, 0x1b, 0xdd, + 0x69, 0x50, 0x41, 0xa2, 0xc5, 0xa8, 0x8b, 0xe4, + 0x91, 0xc9, 0x7b, 0x83, 0x1e, 0xcd, 0x85, 0x47, + 0x65, 0x39, 0xce, 0xea, 0xf3, 0x6f, 0xf8, 0x6a, + 0x1b, 0xff, 0x00, 0xfa, 0x13, 0xad, 0xbf, 0xf0, + 0x39, 0xbf, 0xf8, 0x8a, 0x3f, 0x6d, 0x7f, 0xf9, + 0x0a, 0x78, 0x63, 0xfe, 0xb8, 0xdc, 0x7f, 0xe8, + 0x51, 0xd7, 0xcf, 0x15, 0xec, 0x61, 0x70, 0xb4, + 0xa7, 0x49, 0x4a, 0x4b, 0x53, 0xe3, 0x73, 0x4c, + 0xd3, 0x15, 0x43, 0x15, 0x3a, 0x74, 0xe7, 0x64, + 0xad, 0xd1, 0x76, 0x5e, 0x47, 0xd0, 0xff, 0x00, + 0xf0, 0xd4, 0x37, 0xff, 0x00, 0xf4, 0x27, 0x5b, + 0x7f, 0xe0, 0x73, 0x7f, 0xf1, 0x14, 0x7f, 0xc3, + 0x50, 0xdf, 0xff, 0x00, 0xd0, 0x9d, 0x6d, 0xff, + 0x00, 0x81, 0xcd, 0xff, 0x00, 0xc4, 0x57, 0xcf, + 0x14, 0x57, 0x47, 0xd4, 0xa8, 0x7f, 0x2f, 0xe6, + 0x70, 0x7f, 0x6d, 0x63, 0x7f, 0xe7, 0xe7, 0xe0, + 0xbf, 0xc8, 0xfa, 0x1f, 0xfe, 0x1a, 0x86, 0xff, + 0x00, 0xfe, 0x84, 0xeb, 0x6f, 0xfc, 0x0e, 0x6f, + 0xfe, 0x22, 0x8f, 0xf8, 0x6a, 0x1b, 0xff, 0x00, + 0xfa, 0x13, 0xad, 0xbf, 0xf0, 0x39, 0xbf, 0xf8, + 0x8a, 0xf9, 0xe2, 0x8a, 0x3e, 0xa5, 0x43, 0xf9, + 0x7f, 0x30, 0xfe, 0xda, 0xc6, 0xff, 0x00, 0xcf, + 0xcf, 0xc1, 0x7f, 0x91, 0xf4, 0x3f, 0xfc, 0x35, + 0x0d, 0xff, 0x00, 0xfd, 0x09, 0xd6, 0xdf, 0xf8, + 0x1c, 0xdf, 0xfc, 0x45, 0x7a, 0x5f, 0x81, 0x7e, + 0x2b, 0xb7, 0x88, 0x3e, 0x1e, 0x4d, 0xe2, 0xbb, + 0x8d, 0x0a, 0x48, 0x9d, 0x35, 0x1f, 0xb0, 0xa5, + 0xad, 0xbc, 0x86, 0x42, 0xc7, 0x6a, 0x10, 0x73, + 0xb7, 0x3c, 0xee, 0xc6, 0x30, 0x72, 0x70, 0x07, + 0x26, 0xbe, 0x7e, 0xd1, 0x2d, 0xee, 0x8e, 0x91, + 0x64, 0x89, 0xa3, 0xea, 0x0f, 0x68, 0x61, 0x82, + 0x29, 0x22, 0x40, 0x9f, 0x66, 0x98, 0xcb, 0x1b, + 0x36, 0xf6, 0x26, 0x32, 0x4f, 0xdd, 0x3b, 0x9b, + 0x39, 0x53, 0x8c, 0x1e, 0x06, 0x3d, 0x9b, 0xf6, + 0x40, 0x8e, 0x39, 0x7e, 0x14, 0x5e, 0xc7, 0x2a, + 0x2b, 0xa3, 0x6a, 0xd3, 0x06, 0x56, 0x19, 0x04, + 0x79, 0x51, 0x75, 0x15, 0xc5, 0x89, 0xa3, 0x4a, + 0x34, 0xdb, 0x8a, 0xb3, 0x3d, 0xbc, 0xb3, 0x19, + 0x89, 0xa9, 0x88, 0x8c, 0x6a, 0xce, 0xe9, 0xa7, + 0xd1, 0x23, 0xd7, 0xb4, 0x4d, 0x42, 0x3d, 0x53, + 0x4a, 0xb7, 0xd4, 0x22, 0x42, 0x89, 0x3a, 0x6e, + 0x00, 0x90, 0x7f, 0x22, 0x38, 0x23, 0xd0, 0x8e, + 0x08, 0xc1, 0x1d, 0x6a, 0xe5, 0x00, 0x00, 0x30, + 0x06, 0x00, 0xaf, 0x2d, 0xf8, 0xd7, 0xf1, 0xc7, + 0xc2, 0x1f, 0x0c, 0x31, 0x63, 0x78, 0x65, 0xd5, + 0x75, 0xd7, 0x4d, 0xf1, 0xe9, 0x96, 0x84, 0x6f, + 0x55, 0x23, 0x86, 0x95, 0xcf, 0x11, 0xa9, 0xf7, + 0xcb, 0x1e, 0xa1, 0x48, 0x07, 0x1e, 0x61, 0xf4, + 0xc7, 0xa9, 0x51, 0x5f, 0x12, 0xea, 0xff, 0x00, + 0xb6, 0x07, 0x8f, 0x64, 0xba, 0x67, 0xd2, 0xfc, + 0x39, 0xe1, 0x8b, 0x1b, 0x62, 0x7e, 0x58, 0xae, + 0x96, 0x7b, 0x87, 0x1f, 0x57, 0x59, 0x23, 0x07, + 0xfe, 0xf9, 0x15, 0xe8, 0x1f, 0xb3, 0xc7, 0xed, + 0x13, 0xe2, 0xef, 0x88, 0x3f, 0x10, 0x6c, 0xfc, + 0x27, 0xac, 0xf8, 0x6b, 0x48, 0x64, 0xb8, 0x8a, + 0x59, 0x64, 0xbc, 0xb0, 0x79, 0x22, 0x16, 0xea, + 0x88, 0x5b, 0x71, 0x47, 0x2f, 0xb8, 0x16, 0xda, + 0xbf, 0x78, 0x63, 0x70, 0x3d, 0xb1, 0x40, 0x58, + 0xfa, 0x6a, 0x8a, 0x28, 0xa0, 0x02, 0x8a, 0xf9, + 0xcf, 0xe2, 0xfc, 0xff, 0x00, 0x13, 0xd3, 0xe2, + 0x66, 0xaa, 0xbe, 0x1f, 0x1e, 0x2e, 0xfe, 0xca, + 0x0d, 0x07, 0x91, 0xf6, 0x28, 0xa7, 0x30, 0x63, + 0xc9, 0x8f, 0x76, 0xd2, 0xa3, 0x6f, 0xde, 0xdd, + 0x9c, 0x77, 0xcd, 0x7d, 0x19, 0x5d, 0x15, 0xa8, + 0x7b, 0x38, 0xc6, 0x57, 0xbd, 0xff, 0x00, 0x03, + 0x83, 0x09, 0x8e, 0xfa, 0xcd, 0x5a, 0x94, 0xf9, + 0x1a, 0xe4, 0x76, 0xbb, 0xeb, 0xbe, 0xdf, 0x70, + 0x51, 0x5f, 0x1e, 0x7e, 0xd4, 0x37, 0x7f, 0x1b, + 0x62, 0xf8, 0xb7, 0xaa, 0xc7, 0xe0, 0x91, 0xf1, + 0x07, 0xfb, 0x1f, 0xec, 0xb0, 0x79, 0x1f, 0xd9, + 0x16, 0xf7, 0x6d, 0x6f, 0xbf, 0xca, 0x1b, 0xb6, + 0x98, 0xd4, 0xae, 0x77, 0x75, 0xc7, 0x7a, 0xfa, + 0x8b, 0x5b, 0xf1, 0x97, 0x86, 0x3c, 0x3b, 0x6e, + 0xa3, 0x5d, 0xd7, 0xac, 0xad, 0x27, 0x48, 0xd4, + 0xbc, 0x2f, 0x26, 0xe9, 0xb9, 0x19, 0xcf, 0x96, + 0x32, 0xe7, 0xf2, 0xac, 0x63, 0x19, 0x49, 0xda, + 0x2a, 0xe7, 0x65, 0x4a, 0x90, 0xa7, 0x1e, 0x69, + 0xb4, 0x97, 0x99, 0xd0, 0xd1, 0x5f, 0x3d, 0xfc, + 0x6a, 0xd4, 0xbc, 0x7d, 0x7b, 0xe2, 0x9b, 0x5b, + 0xef, 0x05, 0x37, 0x8a, 0x64, 0xd1, 0xee, 0x74, + 0xc8, 0x26, 0x89, 0xf4, 0xf8, 0x6e, 0x3c, 0xa6, + 0x2d, 0xb8, 0xe7, 0xe5, 0x1c, 0x36, 0x0a, 0xe4, + 0x1e, 0x7a, 0x66, 0xbd, 0xe3, 0x42, 0x33, 0x9d, + 0x0e, 0xc0, 0xdd, 0x79, 0x9e, 0x79, 0xb6, 0x8f, + 0xcd, 0xf3, 0x01, 0x0f, 0xbb, 0x68, 0xce, 0x73, + 0xce, 0x73, 0xd6, 0xb6, 0xab, 0x87, 0xf6, 0x70, + 0x8c, 0x9b, 0xdf, 0xf0, 0x38, 0xf0, 0xb8, 0xf5, + 0x88, 0xad, 0x3a, 0x4a, 0x2d, 0x72, 0xf5, 0xe8, + 0xfd, 0x0b, 0x94, 0x57, 0xca, 0xbf, 0xb5, 0xdd, + 0xd7, 0xc5, 0xf8, 0x3e, 0x26, 0xd8, 0xaf, 0x80, + 0x47, 0x8e, 0x0e, 0x94, 0x74, 0x58, 0x8c, 0x9f, + 0xd8, 0x90, 0x5c, 0xbc, 0x1e, 0x7f, 0x9d, 0x3e, + 0xec, 0x98, 0x94, 0xae, 0xfd, 0xbb, 0x33, 0xdf, + 0x1b, 0x7d, 0xab, 0xe8, 0xaf, 0x86, 0xad, 0xa9, + 0x3f, 0xc3, 0x9f, 0x0c, 0xbe, 0xb3, 0xf6, 0xbf, + 0xed, 0x36, 0xd2, 0x2d, 0x0d, 0xe7, 0xda, 0xc3, + 0x09, 0xbc, 0xef, 0x25, 0x77, 0xf9, 0x81, 0xb9, + 0x0f, 0xbb, 0x39, 0xcf, 0x39, 0xce, 0x6b, 0x9c, + 0xef, 0x3c, 0x2f, 0xf6, 0xc2, 0xf8, 0x9b, 0xe3, + 0xef, 0x01, 0xf8, 0x8f, 0xc3, 0xd6, 0x9e, 0x0e, + 0xd6, 0x1e, 0xc2, 0x0b, 0xbb, 0x39, 0xa4, 0xb8, + 0x55, 0xb2, 0x86, 0x6d, 0xcc, 0xae, 0xa0, 0x1c, + 0xc8, 0x8c, 0x47, 0x04, 0xf4, 0xc5, 0x64, 0xea, + 0x7f, 0x16, 0x3e, 0x23, 0xc3, 0xe1, 0xff, 0x00, + 0x0b, 0x5d, 0x45, 0xae, 0x3a, 0xcd, 0x7d, 0xa0, + 0x5b, 0x5d, 0xdd, 0x37, 0xd8, 0x60, 0x3b, 0xe6, + 0x72, 0xfb, 0x9b, 0x1e, 0x5f, 0x19, 0xc0, 0xe0, + 0x60, 0x7b, 0x57, 0xa0, 0xfe, 0xd1, 0x63, 0xc7, + 0x27, 0x58, 0xd2, 0x3f, 0xe1, 0x12, 0xff, 0x00, + 0x84, 0x8f, 0xc9, 0xfb, 0x3c, 0x9e, 0x7f, 0xf6, + 0x5f, 0x9d, 0xb7, 0x76, 0xe1, 0x8d, 0xde, 0x5f, + 0x19, 0xc6, 0x7a, 0xd7, 0x89, 0x7c, 0x6c, 0x5f, + 0x8e, 0x87, 0x57, 0xd1, 0x3f, 0xe1, 0x1c, 0xff, + 0x00, 0x85, 0x93, 0xe4, 0xff, 0x00, 0xc2, 0x3d, + 0x6b, 0xf6, 0x8f, 0xec, 0xf3, 0x7b, 0xb7, 0xed, + 0x39, 0x93, 0x7e, 0xfd, 0x9c, 0x79, 0x9f, 0x77, + 0x39, 0xe7, 0xa6, 0x6b, 0xba, 0x94, 0x63, 0x42, + 0x31, 0xad, 0x24, 0xa5, 0x7e, 0x87, 0x89, 0x8a, + 0xa9, 0x53, 0x1f, 0x52, 0x78, 0x3a, 0x6e, 0x54, + 0xdc, 0x6c, 0xf9, 0x97, 0x5f, 0x25, 0xaa, 0xef, + 0xdc, 0xfb, 0x2b, 0x42, 0x9e, 0x5b, 0x9d, 0x12, + 0xc2, 0xe2, 0x76, 0xdd, 0x2c, 0xb6, 0xd1, 0xbb, + 0xb6, 0x31, 0x96, 0x2a, 0x09, 0x38, 0x1e, 0xf4, + 0x54, 0x3e, 0x15, 0xfb, 0x57, 0xfc, 0x23, 0x1a, + 0x57, 0xdb, 0xbc, 0xef, 0xb5, 0x7d, 0x8a, 0x1f, + 0x3f, 0xce, 0xcf, 0x99, 0xbf, 0x60, 0xdd, 0xbb, + 0x3c, 0xee, 0xce, 0x73, 0x9e, 0x73, 0x45, 0x71, + 0x37, 0x76, 0x7b, 0x51, 0x56, 0x49, 0x33, 0xe7, + 0x7f, 0xdb, 0x5f, 0xfe, 0x42, 0x9e, 0x18, 0xff, + 0x00, 0xae, 0x37, 0x1f, 0xfa, 0x14, 0x75, 0xf3, + 0xc5, 0x7d, 0x0f, 0xfb, 0x6b, 0xff, 0x00, 0xc8, + 0x53, 0xc3, 0x1f, 0xf5, 0xc6, 0xe3, 0xff, 0x00, + 0x42, 0x8e, 0xbe, 0x78, 0xaf, 0x7f, 0x05, 0xfc, + 0x08, 0xff, 0x00, 0x5d, 0x4f, 0xcf, 0xf3, 0xaf, + 0xf7, 0xea, 0x9f, 0x2f, 0xc9, 0x05, 0x14, 0x51, + 0x5d, 0x47, 0x96, 0x14, 0x51, 0x45, 0x00, 0x7a, + 0x66, 0x9b, 0x73, 0x64, 0x3c, 0x39, 0x6f, 0xa7, + 0x45, 0x6d, 0x3c, 0x57, 0xa5, 0x2d, 0xa2, 0x8d, + 0xfe, 0xc1, 0x14, 0xaa, 0x1a, 0x68, 0xdd, 0xb0, + 0x59, 0xa6, 0x1b, 0xb7, 0x90, 0x18, 0x31, 0x5f, + 0x90, 0x2e, 0x3b, 0xd7, 0xb6, 0xfe, 0xc7, 0x7f, + 0xf2, 0x4b, 0x2e, 0xff, 0x00, 0xec, 0x2f, 0x2f, + 0xfe, 0x8a, 0x8a, 0xbc, 0x73, 0xc3, 0xd3, 0x5d, + 0x5d, 0x78, 0x11, 0x05, 0xbd, 0xf6, 0xad, 0x78, + 0x90, 0x5a, 0xb2, 0xc9, 0x15, 0x8c, 0xf3, 0xda, + 0x08, 0x06, 0x0f, 0x0d, 0x24, 0x92, 0x79, 0x4c, + 0x07, 0x70, 0xb1, 0x92, 0x7d, 0x6b, 0xd8, 0xff, + 0x00, 0x63, 0xbf, 0xf9, 0x25, 0x97, 0x7f, 0xf6, + 0x17, 0x97, 0xff, 0x00, 0x45, 0x45, 0x5e, 0x66, + 0x2f, 0xf8, 0x52, 0xf5, 0x3e, 0xa3, 0x29, 0x5f, + 0xed, 0x50, 0xff, 0x00, 0x0b, 0xfd, 0x0f, 0x48, + 0xf8, 0x91, 0xe2, 0x58, 0xfc, 0x1d, 0xe0, 0x1d, + 0x73, 0xc5, 0x12, 0x46, 0xb2, 0xff, 0x00, 0x66, + 0x58, 0xcb, 0x70, 0x91, 0xb1, 0xc0, 0x92, 0x40, + 0xa7, 0x62, 0x67, 0xb6, 0xe6, 0xda, 0x3f, 0x1a, + 0xfc, 0xec, 0xf0, 0x26, 0x81, 0xae, 0x7c, 0x58, + 0xf8, 0xaf, 0x6b, 0xa5, 0xdd, 0x6a, 0x0f, 0x26, + 0xa5, 0xad, 0xdd, 0xbc, 0xf7, 0xf7, 0xd2, 0x2e, + 0xe2, 0x8a, 0x01, 0x79, 0x64, 0xc7, 0x4e, 0x14, + 0x10, 0xab, 0xc0, 0xce, 0xd5, 0xe0, 0x57, 0xdc, + 0x1f, 0xb5, 0x9c, 0x33, 0x4f, 0xfb, 0x3d, 0x78, + 0xad, 0x20, 0x04, 0xb2, 0xc3, 0x04, 0x8d, 0x8f, + 0xee, 0x2d, 0xc4, 0x4c, 0xdf, 0xf8, 0xe8, 0x35, + 0xf2, 0xcf, 0xec, 0x4d, 0x7d, 0x6b, 0x67, 0xf1, + 0xee, 0xce, 0x1b, 0x92, 0x03, 0xde, 0xe9, 0xd7, + 0x56, 0xd6, 0xf9, 0xff, 0x00, 0x9e, 0x98, 0x59, + 0x3f, 0xf4, 0x18, 0xde, 0xbc, 0x83, 0xeb, 0x8f, + 0xaf, 0xfc, 0x19, 0xf0, 0x8b, 0xe1, 0xc7, 0x84, + 0xf4, 0xb8, 0xac, 0xb4, 0xbf, 0x09, 0x69, 0x52, + 0x3a, 0x2e, 0x1e, 0xee, 0xee, 0xd9, 0x27, 0xb9, + 0x94, 0xf7, 0x2f, 0x23, 0x82, 0x4e, 0x4f, 0x38, + 0x18, 0x51, 0x9e, 0x00, 0x1c, 0x56, 0xde, 0x8d, + 0xe0, 0xaf, 0x08, 0x68, 0xba, 0xf3, 0xeb, 0xba, + 0x37, 0x86, 0x74, 0x8d, 0x37, 0x53, 0x92, 0x06, + 0xb7, 0x92, 0xe6, 0xce, 0xd1, 0x21, 0x79, 0x23, + 0x66, 0x56, 0x2a, 0xdb, 0x40, 0xdd, 0xca, 0x29, + 0xe7, 0xd2, 0xb7, 0xeb, 0xcf, 0xff, 0x00, 0x68, + 0xdd, 0x7e, 0xf3, 0xc3, 0x1f, 0x04, 0x3c, 0x55, + 0xac, 0x69, 0xf2, 0xbc, 0x37, 0x69, 0x67, 0xe4, + 0x43, 0x2a, 0x12, 0x1a, 0x26, 0x99, 0xd6, 0x10, + 0xea, 0x47, 0x42, 0xbe, 0x66, 0x41, 0xf5, 0x14, + 0x08, 0xf3, 0x2f, 0x8b, 0x9f, 0xb5, 0x4e, 0x83, + 0xe1, 0x8d, 0x62, 0xe3, 0x43, 0xf0, 0x8e, 0x91, + 0xff, 0x00, 0x09, 0x15, 0xdd, 0xb3, 0xb4, 0x57, + 0x17, 0x92, 0x5c, 0x79, 0x56, 0xb1, 0xb8, 0xe0, + 0x84, 0x20, 0x16, 0x97, 0x04, 0x10, 0x71, 0xb5, + 0x7d, 0x18, 0xd7, 0x07, 0xa0, 0xfe, 0xd8, 0xda, + 0xf8, 0xbd, 0x07, 0x59, 0xf0, 0x7e, 0x93, 0x77, + 0x69, 0xbb, 0x0e, 0x2c, 0x6e, 0x9e, 0x29, 0x14, + 0x7a, 0x8d, 0xdb, 0x83, 0x1f, 0x6f, 0x97, 0x3e, + 0xa2, 0xbc, 0xef, 0xf6, 0x4a, 0xf0, 0x7e, 0x93, + 0xe3, 0x0f, 0x8c, 0xf6, 0x1a, 0x7e, 0xb3, 0x69, + 0x0d, 0xde, 0x9d, 0xa7, 0xda, 0x4b, 0x7f, 0x25, + 0xac, 0xab, 0x98, 0xe6, 0x31, 0xed, 0x44, 0x56, + 0x1d, 0xd4, 0x34, 0x8a, 0xd8, 0xe8, 0x76, 0xe0, + 0xe4, 0x12, 0x0f, 0xd1, 0xdf, 0xb6, 0xb7, 0x82, + 0xf4, 0x1b, 0xcf, 0x83, 0xb7, 0x5e, 0x26, 0x4d, + 0x3e, 0xde, 0x0d, 0x53, 0x44, 0x96, 0xdc, 0xc1, + 0x3c, 0x51, 0x2a, 0xb3, 0x45, 0x24, 0xc9, 0x13, + 0x44, 0x48, 0xea, 0x98, 0x93, 0x70, 0x1e, 0xaa, + 0x3d, 0xe9, 0x0c, 0xf5, 0x4f, 0x02, 0xf8, 0xfb, + 0x40, 0xf1, 0xcf, 0x81, 0xcf, 0x8a, 0xfc, 0x2f, + 0x39, 0xba, 0xb7, 0x08, 0xe1, 0xe1, 0x94, 0x6c, + 0x96, 0x19, 0x95, 0x72, 0x61, 0x90, 0x73, 0xb5, + 0x86, 0x47, 0xa8, 0x20, 0x82, 0x09, 0x04, 0x13, + 0xe1, 0x3f, 0x0f, 0xbf, 0x6b, 0x5b, 0x7d, 0x6f, + 0x56, 0x95, 0x3c, 0x45, 0xe1, 0x58, 0x34, 0x6d, + 0x36, 0x1b, 0x09, 0xae, 0xe4, 0xb9, 0x8b, 0x50, + 0x33, 0xb9, 0x28, 0xb9, 0x58, 0xd5, 0x0c, 0x6a, + 0x0b, 0x31, 0xc2, 0x81, 0x91, 0xc9, 0x15, 0xe7, + 0xbf, 0xb0, 0xd6, 0xb3, 0x77, 0x6b, 0xf1, 0x03, + 0xc4, 0x5a, 0x12, 0xc8, 0x7e, 0xc5, 0xa8, 0x68, + 0x52, 0xdc, 0x48, 0x9d, 0xbc, 0xd8, 0x5d, 0x02, + 0x37, 0xb7, 0xcb, 0x2c, 0x83, 0xdf, 0x8f, 0x4a, + 0xf1, 0x5f, 0x86, 0xde, 0x1f, 0xff, 0x00, 0x84, + 0xaf, 0xc6, 0x3e, 0x1d, 0xf0, 0xd1, 0x9c, 0xdb, + 0xae, 0xa7, 0x79, 0x05, 0xb3, 0xcc, 0xa0, 0x13, + 0x1a, 0x31, 0x01, 0x98, 0x03, 0xc6, 0x42, 0xe4, + 0x8c, 0xf7, 0xc5, 0x01, 0x63, 0xeb, 0x4f, 0x86, + 0x7f, 0xb4, 0xbe, 0xb3, 0xe3, 0x3f, 0x18, 0xea, + 0xf6, 0x5f, 0xf0, 0x8b, 0x58, 0x59, 0x69, 0x76, + 0x7a, 0x35, 0xde, 0xa3, 0x0a, 0x1b, 0x96, 0x79, + 0xd8, 0xc2, 0xa0, 0x85, 0x67, 0xc0, 0x51, 0xbb, + 0x3c, 0xe1, 0x78, 0xf5, 0x3d, 0xfc, 0xe7, 0xc7, + 0xfe, 0x22, 0x6f, 0x16, 0xf8, 0xbe, 0xff, 0x00, + 0xc4, 0x4f, 0x66, 0xb6, 0x6d, 0x79, 0xe5, 0xe6, + 0x15, 0x93, 0x78, 0x5d, 0x91, 0xaa, 0x7d, 0xec, + 0x0c, 0xe7, 0x6e, 0x7a, 0x77, 0xaf, 0xa7, 0xbc, + 0x11, 0xf0, 0x5f, 0xe1, 0xaf, 0x83, 0x6e, 0x56, + 0xef, 0x43, 0xf0, 0xdc, 0x69, 0x77, 0xf6, 0x67, + 0xb5, 0x92, 0x79, 0xe7, 0x96, 0x66, 0x9a, 0x37, + 0x00, 0x38, 0x70, 0xec, 0x54, 0x86, 0xc7, 0x23, + 0x18, 0xf4, 0x00, 0x71, 0x5f, 0x3d, 0x7c, 0x75, + 0xb3, 0xb3, 0xd3, 0xfe, 0x2b, 0x6b, 0x96, 0x76, + 0x16, 0xb0, 0x5a, 0x5b, 0x46, 0x60, 0xf2, 0xe1, + 0x82, 0x30, 0x88, 0xb9, 0xb7, 0x8c, 0x9c, 0x28, + 0xe0, 0x72, 0x49, 0xfa, 0x9a, 0xf6, 0x72, 0x77, + 0x1e, 0x79, 0x2b, 0x6b, 0x6d, 0xfc, 0xb4, 0x3e, + 0x3b, 0x8b, 0xe1, 0x57, 0xd8, 0x42, 0x4a, 0x5e, + 0xed, 0xf6, 0xf3, 0xb3, 0xd7, 0xee, 0x3d, 0x63, + 0xe0, 0xc7, 0xc5, 0x99, 0xb5, 0xad, 0x53, 0x46, + 0xf0, 0x6b, 0xe8, 0x71, 0x5b, 0xc7, 0x15, 0x9f, + 0x94, 0x6e, 0xbe, 0xd6, 0x58, 0x9f, 0x2a, 0x2e, + 0xbb, 0x76, 0x0e, 0xbb, 0x7d, 0x78, 0xcf, 0x7a, + 0x67, 0x8e, 0x3e, 0x3f, 0xd9, 0xd8, 0xdf, 0xcb, + 0x63, 0xe1, 0x6d, 0x32, 0x3d, 0x45, 0x63, 0x6d, + 0xa6, 0xf6, 0xe2, 0x42, 0xb1, 0x31, 0xff, 0x00, + 0x61, 0x47, 0x2c, 0xbf, 0xed, 0x64, 0x7b, 0x02, + 0x30, 0x69, 0xde, 0x3e, 0xb4, 0xd1, 0xf4, 0x1f, + 0x80, 0x36, 0x7a, 0x9e, 0x9d, 0xa3, 0xe9, 0xd6, + 0xba, 0x9d, 0xee, 0x9d, 0x6b, 0x6c, 0x6e, 0xe2, + 0xb5, 0x45, 0x97, 0x12, 0xa2, 0xf9, 0xb9, 0x60, + 0x33, 0xf3, 0x26, 0xf0, 0x79, 0xfe, 0x2a, 0xf2, + 0x6f, 0x84, 0xde, 0x31, 0xd3, 0x3c, 0x13, 0xac, + 0xdc, 0x6a, 0xd7, 0x9a, 0x0f, 0xf6, 0xad, 0xd9, + 0x8c, 0x47, 0x6a, 0xde, 0x70, 0x4f, 0x23, 0x39, + 0xde, 0x46, 0x54, 0xf2, 0x46, 0xd1, 0x91, 0x82, + 0x06, 0xe1, 0xdc, 0xd6, 0xb4, 0xf0, 0xd4, 0xab, + 0x73, 0x55, 0x8c, 0x2f, 0x6d, 0x2d, 0x7d, 0xdf, + 0x73, 0x96, 0xbe, 0x65, 0x8a, 0xc2, 0x7b, 0x3c, + 0x2d, 0x4a, 0xc9, 0x5d, 0x5d, 0xca, 0xdb, 0x2b, + 0x68, 0xad, 0x6f, 0x2f, 0xc5, 0x6a, 0x7a, 0x57, + 0x85, 0x3f, 0x68, 0x56, 0x7d, 0x41, 0x2d, 0xfc, + 0x51, 0xa2, 0xc3, 0x05, 0xbb, 0x3e, 0xd7, 0xb9, + 0xb3, 0x66, 0x26, 0x1f, 0x73, 0x1b, 0x64, 0xb0, + 0xf5, 0xc1, 0xce, 0x33, 0x80, 0x4f, 0x15, 0xd5, + 0x7c, 0x51, 0xf8, 0xa9, 0xa9, 0x78, 0x2f, 0x50, + 0xb4, 0x31, 0x78, 0x7a, 0xd7, 0x53, 0xd2, 0xaf, + 0xe1, 0x13, 0x59, 0x5f, 0x47, 0x7c, 0x42, 0xc8, + 0x30, 0x32, 0x38, 0x42, 0x33, 0xc8, 0x23, 0x04, + 0x82, 0x18, 0x11, 0xdc, 0x0f, 0x0f, 0xf8, 0xbb, + 0xe3, 0x7d, 0x3f, 0xc7, 0x5a, 0x95, 0x96, 0xa3, + 0x6d, 0xa0, 0xff, 0x00, 0x66, 0x5d, 0x43, 0x1b, + 0x47, 0x71, 0x21, 0x98, 0x48, 0x67, 0x5e, 0x36, + 0x67, 0x0a, 0x3e, 0xef, 0xcd, 0xff, 0x00, 0x7d, + 0x7b, 0x57, 0xaf, 0x7c, 0x34, 0xd0, 0xe0, 0xf1, + 0xff, 0x00, 0xec, 0xfb, 0x6f, 0xa1, 0x6a, 0x6c, + 0x43, 0xc3, 0x24, 0xb1, 0xda, 0xdc, 0x30, 0xdc, + 0xd0, 0xba, 0x3b, 0x18, 0xd8, 0x7b, 0x00, 0xdb, + 0x70, 0x31, 0x95, 0xc8, 0xef, 0x4a, 0xb6, 0x1a, + 0x8d, 0x25, 0x1a, 0xb3, 0x85, 0x93, 0xd1, 0xab, + 0xfe, 0x26, 0x98, 0x2c, 0xc7, 0x17, 0x89, 0x95, + 0x5c, 0x2d, 0x2a, 0xdc, 0xcd, 0x2b, 0xc6, 0x56, + 0xb5, 0xf6, 0xd1, 0xa6, 0xbc, 0xfe, 0x4f, 0xad, + 0x8e, 0xcf, 0xe1, 0x97, 0xc4, 0x0d, 0x3b, 0xc6, + 0x5e, 0x14, 0x9f, 0x59, 0x91, 0x62, 0xd3, 0xe5, + 0xb3, 0x66, 0x5b, 0xd8, 0x5a, 0x60, 0xc2, 0x00, + 0x06, 0x43, 0xee, 0x20, 0x7c, 0xa5, 0x79, 0xc9, + 0x03, 0x90, 0xc3, 0xb5, 0x79, 0xfd, 0x87, 0xc7, + 0x8d, 0x47, 0x58, 0xf1, 0x1c, 0x7a, 0x3e, 0x83, + 0xe0, 0xe1, 0x78, 0xf7, 0x37, 0x06, 0x2b, 0x4d, + 0xf7, 0xa5, 0x19, 0xd7, 0x27, 0x0c, 0xc0, 0x21, + 0xdb, 0xf2, 0xfc, 0xc7, 0x92, 0x14, 0x67, 0x9e, + 0x33, 0x5e, 0x1b, 0x1d, 0xf6, 0xb1, 0xe1, 0xe7, + 0xd6, 0xb4, 0x58, 0x6e, 0xcc, 0x3f, 0x69, 0x56, + 0xb1, 0xbe, 0x48, 0xa4, 0xdc, 0x92, 0x04, 0x93, + 0x90, 0x08, 0xe0, 0xf2, 0xa4, 0x67, 0xba, 0xb3, + 0x0e, 0x84, 0xd7, 0xbe, 0x7e, 0xcc, 0x1e, 0x0d, + 0xb4, 0xb3, 0xd0, 0x4f, 0x8c, 0x6e, 0x1a, 0x29, + 0xef, 0x6f, 0xb7, 0x45, 0x6d, 0xb5, 0xb7, 0x7d, + 0x9e, 0x25, 0x62, 0xac, 0x3d, 0x03, 0xb1, 0x5e, + 0x7d, 0x00, 0x03, 0x8c, 0xb0, 0xa5, 0x5b, 0x09, + 0x43, 0x0f, 0x19, 0x54, 0x92, 0xba, 0x7b, 0x20, + 0xc1, 0x66, 0xd8, 0xdc, 0xc6, 0xad, 0x3c, 0x3d, + 0x37, 0xca, 0xd5, 0xf9, 0xdd, 0x97, 0x47, 0xe9, + 0xfd, 0x37, 0xd8, 0xf5, 0x97, 0x9b, 0x57, 0x5d, + 0x52, 0xd6, 0x21, 0x63, 0x6d, 0x25, 0x93, 0xc7, + 0xfe, 0x91, 0x38, 0x9c, 0xab, 0xc4, 0xf8, 0x3d, + 0x13, 0x6f, 0xcc, 0x09, 0xc0, 0xea, 0x31, 0x9e, + 0xf4, 0x56, 0x85, 0x15, 0xe2, 0x1f, 0x6c, 0x7c, + 0xcb, 0xfb, 0x6b, 0xff, 0x00, 0xc8, 0x53, 0xc3, + 0x1f, 0xf5, 0xc6, 0xe3, 0xff, 0x00, 0x42, 0x8e, + 0xbe, 0x78, 0xaf, 0xa1, 0xff, 0x00, 0x6d, 0x7f, + 0xf9, 0x0a, 0x78, 0x63, 0xfe, 0xb8, 0xdc, 0x7f, + 0xe8, 0x51, 0xd2, 0xfc, 0x16, 0xf0, 0x1f, 0x83, + 0x4f, 0x81, 0x74, 0xc9, 0xbc, 0x65, 0x63, 0x14, + 0xda, 0x87, 0x8a, 0x6e, 0xa5, 0x87, 0x4e, 0x2f, + 0xc3, 0x44, 0x8b, 0x1b, 0x60, 0x8e, 0x78, 0xc9, + 0x42, 0x41, 0xf5, 0x64, 0xaf, 0x6e, 0x85, 0x55, + 0x4b, 0x0f, 0x16, 0xcf, 0x88, 0xc7, 0x61, 0x27, + 0x8a, 0xcc, 0x6a, 0x42, 0x2e, 0xdb, 0x6f, 0xe8, + 0xbf, 0x53, 0xe7, 0x7a, 0x2b, 0xd9, 0x3e, 0x03, + 0x78, 0x26, 0xc2, 0x5f, 0x8c, 0x7a, 0xc7, 0x85, + 0xbc, 0x55, 0xa6, 0xc3, 0x7c, 0xb6, 0x16, 0x93, + 0xab, 0x47, 0x2a, 0x9d, 0xbb, 0xd2, 0x58, 0xd4, + 0x38, 0xfa, 0x82, 0x48, 0xf6, 0x35, 0xd3, 0x78, + 0xcb, 0xc1, 0x9e, 0x1d, 0xb9, 0xf8, 0x5d, 0xe2, + 0x0d, 0x6f, 0x57, 0xf0, 0x2c, 0x7e, 0x09, 0xd4, + 0x74, 0xe7, 0xc5, 0x84, 0x89, 0x74, 0x4f, 0xda, + 0x4f, 0x61, 0xb4, 0xf0, 0x77, 0x1e, 0x3a, 0x67, + 0xd0, 0xf0, 0x6b, 0x69, 0x62, 0x63, 0x19, 0xf2, + 0xfa, 0x7e, 0x27, 0x1d, 0x3c, 0xb2, 0xa5, 0x4a, + 0x4e, 0xa5, 0xed, 0x6b, 0xe9, 0xaf, 0x4d, 0xfa, + 0x59, 0x7c, 0xcf, 0x9d, 0x68, 0xaf, 0xa3, 0xf4, + 0x5f, 0x85, 0x5e, 0x1b, 0xf1, 0x5f, 0xc0, 0xfd, + 0x0a, 0x5b, 0x38, 0xad, 0x74, 0xff, 0x00, 0x13, + 0x5d, 0x42, 0xd2, 0x5b, 0x5c, 0x16, 0xda, 0x6e, + 0x64, 0x52, 0xe4, 0xc6, 0xde, 0xa0, 0xa8, 0xed, + 0xc8, 0xc6, 0x7a, 0x02, 0x0c, 0x9a, 0x77, 0xc2, + 0x3d, 0x07, 0xc3, 0x7f, 0x07, 0xfc, 0x47, 0x71, + 0xaf, 0x5b, 0xda, 0xde, 0xf8, 0xa2, 0x2d, 0x2e, + 0x4b, 0xb9, 0x01, 0x7d, 0xc6, 0xc4, 0xf9, 0x6e, + 0x63, 0x55, 0xc1, 0xeb, 0x95, 0x24, 0x9e, 0xe4, + 0x1c, 0x70, 0x05, 0x4f, 0xd7, 0x29, 0xed, 0xd6, + 0xf6, 0x34, 0x59, 0x3d, 0x77, 0x67, 0xa5, 0x9a, + 0xbd, 0xfe, 0x57, 0xb7, 0xa9, 0xe7, 0x26, 0x6d, + 0x3a, 0xdf, 0xc1, 0x7a, 0x65, 0xd6, 0xac, 0x9b, + 0xec, 0x96, 0x24, 0x8f, 0xec, 0x8d, 0x63, 0x14, + 0xf2, 0xee, 0x2a, 0x7f, 0xe5, 0xb7, 0x9d, 0xe6, + 0x44, 0x1f, 0x0c, 0xca, 0x4a, 0xa8, 0x00, 0x1d, + 0xa1, 0xb6, 0xf3, 0xed, 0x9f, 0xb1, 0xdf, 0xfc, + 0x92, 0xcb, 0xbf, 0xfb, 0x0b, 0xcb, 0xff, 0x00, + 0xa2, 0xa2, 0xaf, 0x99, 0x61, 0xd7, 0x3c, 0x4e, + 0xba, 0x50, 0xb3, 0x46, 0x95, 0xac, 0xb6, 0x28, + 0xc1, 0xb4, 0x46, 0x05, 0x54, 0x10, 0xa7, 0x25, + 0x72, 0x70, 0x09, 0x00, 0xe7, 0x80, 0x4d, 0x7d, + 0x35, 0xfb, 0x1d, 0xff, 0x00, 0xc9, 0x2c, 0xbb, + 0xff, 0x00, 0xb0, 0xbc, 0xbf, 0xfa, 0x2a, 0x2a, + 0xc7, 0x19, 0x17, 0x1a, 0x2e, 0xfd, 0xce, 0xdc, + 0x9a, 0xa2, 0x9e, 0x2e, 0x36, 0xec, 0xcf, 0x5a, + 0xf1, 0x0e, 0x93, 0x65, 0xaf, 0x68, 0x1a, 0x86, + 0x87, 0xa9, 0x46, 0x65, 0xb2, 0xd4, 0x2d, 0xa4, + 0xb5, 0xb8, 0x40, 0x70, 0x5a, 0x39, 0x14, 0xab, + 0x0c, 0xf6, 0xe0, 0x9e, 0x6b, 0xf3, 0x7b, 0xe2, + 0x37, 0x82, 0xfc, 0x57, 0xf0, 0x8b, 0xc7, 0xd1, + 0xd9, 0xdd, 0xc9, 0x71, 0x6d, 0x71, 0x6b, 0x71, + 0xf6, 0x8d, 0x27, 0x55, 0x89, 0x76, 0xad, 0xca, + 0xa3, 0x02, 0x92, 0xa1, 0xe4, 0x6e, 0x1f, 0x2e, + 0xe4, 0xe7, 0x69, 0xe0, 0xe4, 0x10, 0x4f, 0xe9, + 0x7d, 0x67, 0x78, 0x8b, 0x42, 0xd1, 0x7c, 0x47, + 0xa5, 0xc9, 0xa5, 0xeb, 0xfa, 0x4d, 0x96, 0xa9, + 0x63, 0x21, 0x05, 0xad, 0xee, 0xe0, 0x59, 0x50, + 0x91, 0xd0, 0xe1, 0x81, 0xc1, 0x1d, 0x8f, 0x51, + 0x5e, 0x31, 0xf6, 0x47, 0xcb, 0x3e, 0x0d, 0xfd, + 0xb0, 0x64, 0x87, 0x4d, 0x8a, 0xdf, 0xc5, 0xde, + 0x10, 0x7b, 0x9b, 0xc8, 0xd4, 0x06, 0xba, 0xd3, + 0x6e, 0x15, 0x56, 0x63, 0xea, 0x62, 0x7f, 0xb9, + 0xf8, 0x31, 0x1f, 0x4e, 0x95, 0xb9, 0xa7, 0x7c, + 0x5d, 0xb1, 0xfd, 0xa0, 0xe3, 0xf1, 0x0f, 0xc2, + 0xcb, 0x6f, 0x0f, 0x36, 0x8a, 0xba, 0x86, 0x89, + 0x3c, 0xd6, 0x77, 0x97, 0x57, 0x81, 0xc9, 0xb9, + 0x8d, 0xa3, 0x31, 0x06, 0x45, 0x4e, 0x14, 0x13, + 0xb8, 0x90, 0xc4, 0xe1, 0x08, 0xc5, 0x77, 0x17, + 0xdf, 0xb3, 0x2f, 0xc1, 0xcb, 0x99, 0xcc, 0xa9, + 0xe1, 0xbb, 0xab, 0x5c, 0x9c, 0x95, 0x83, 0x53, + 0xb9, 0x0a, 0x7f, 0x02, 0xe4, 0x0f, 0xa0, 0xc5, + 0x74, 0xbe, 0x01, 0xf8, 0x39, 0xf0, 0xdf, 0xc0, + 0xba, 0xa2, 0xea, 0xbe, 0x1a, 0xf0, 0xd4, 0x56, + 0xda, 0x8a, 0xa9, 0x55, 0xba, 0x9a, 0xe2, 0x59, + 0xe4, 0x50, 0x46, 0x0e, 0xd3, 0x23, 0x36, 0xdc, + 0x8e, 0x0e, 0xdc, 0x50, 0x33, 0xe1, 0x6f, 0x85, + 0x5e, 0x2a, 0xd5, 0x7e, 0x0f, 0xfc, 0x5d, 0x83, + 0x53, 0xd5, 0x74, 0xab, 0x94, 0x9f, 0x4e, 0x92, + 0x4b, 0x3d, 0x57, 0x4f, 0x6c, 0x2c, 0xbe, 0x5b, + 0x0c, 0x3a, 0x8c, 0xf1, 0x90, 0x76, 0xba, 0xf3, + 0x86, 0xda, 0xbc, 0xe0, 0xe6, 0xbd, 0x5f, 0xf6, + 0x98, 0xfd, 0xa1, 0x74, 0x1f, 0x1e, 0xf8, 0x11, + 0x7c, 0x21, 0xe1, 0x2b, 0x2d, 0x45, 0x61, 0xbc, + 0x9a, 0x29, 0xb5, 0x0b, 0x8b, 0xd8, 0x96, 0x30, + 0x12, 0x36, 0x0e, 0xb1, 0xa2, 0x86, 0x24, 0xb6, + 0xf5, 0x52, 0x5b, 0x80, 0x02, 0xe0, 0x6e, 0xdd, + 0x95, 0xfa, 0x7f, 0xe2, 0x17, 0xc2, 0xff, 0x00, + 0x01, 0xf8, 0xf9, 0xa3, 0x93, 0xc5, 0x7e, 0x1c, + 0xb5, 0xbe, 0xb8, 0x8d, 0x76, 0x25, 0xd2, 0xb3, + 0xc3, 0x3a, 0xa8, 0xc9, 0x0b, 0xe6, 0xc6, 0x55, + 0xf6, 0xe4, 0x93, 0xb4, 0x9c, 0x72, 0x78, 0xae, + 0x5b, 0x41, 0xfd, 0x9c, 0x7e, 0x0f, 0xe9, 0x17, + 0xa9, 0x78, 0x9e, 0x14, 0x17, 0xd2, 0xa3, 0x65, + 0x56, 0xfe, 0xee, 0x6b, 0x88, 0xc7, 0xb1, 0x8d, + 0xd8, 0xa3, 0x0f, 0xf7, 0x94, 0xd2, 0x03, 0xc7, + 0x7f, 0x62, 0x0f, 0x02, 0x6a, 0x16, 0xf6, 0x5a, + 0xff, 0x00, 0xc4, 0x5b, 0xf8, 0x24, 0x82, 0xda, + 0xe3, 0x4f, 0x7b, 0x0d, 0x33, 0x78, 0xc7, 0x9e, + 0x84, 0x87, 0x96, 0x50, 0x0f, 0xf0, 0xe6, 0x38, + 0xd4, 0x1e, 0xe7, 0x7f, 0xa7, 0x3e, 0x17, 0xfb, + 0x3a, 0x7f, 0xc9, 0x67, 0xf0, 0x3f, 0xfd, 0x85, + 0x20, 0xaf, 0xd2, 0xc3, 0x6f, 0x0f, 0xd9, 0x7e, + 0xca, 0x23, 0x55, 0x83, 0x67, 0x97, 0xb1, 0x46, + 0x00, 0x5c, 0x63, 0x03, 0x1d, 0x06, 0x2b, 0xce, + 0x3c, 0x3b, 0xf0, 0x1f, 0xe1, 0x3f, 0x87, 0xb5, + 0xab, 0x1d, 0x67, 0x47, 0xf0, 0x9a, 0xda, 0xdf, + 0x58, 0x4a, 0xb2, 0xdb, 0x4b, 0xf6, 0xeb, 0x97, + 0xf2, 0xdd, 0x7a, 0x1c, 0x34, 0x84, 0x1f, 0xc4, + 0x1a, 0x61, 0x73, 0xd2, 0xeb, 0xe4, 0xaf, 0xda, + 0x46, 0xc6, 0x7b, 0x5f, 0x8b, 0x5a, 0x94, 0xf2, + 0xae, 0x12, 0xf6, 0x18, 0x27, 0x88, 0xfa, 0xa8, + 0x89, 0x63, 0x3f, 0xf8, 0xf4, 0x6d, 0x5f, 0x5a, + 0xd6, 0x27, 0x8b, 0xbc, 0x27, 0xe1, 0xef, 0x16, + 0x59, 0xc7, 0x6b, 0xaf, 0xe9, 0x91, 0x5e, 0x24, + 0x44, 0x98, 0x98, 0x92, 0x8f, 0x19, 0x38, 0xce, + 0xd7, 0x52, 0x18, 0x67, 0x03, 0x23, 0x38, 0x38, + 0x19, 0xe9, 0x5d, 0x78, 0x2c, 0x4a, 0xc3, 0xd5, + 0xe6, 0x6b, 0x4d, 0x8f, 0x1f, 0x3a, 0xcb, 0xa5, + 0x98, 0x61, 0xbd, 0x94, 0x1d, 0x9a, 0x77, 0x57, + 0xdb, 0xfa, 0xd4, 0xf0, 0xeb, 0x2f, 0x16, 0xc1, + 0xf1, 0x1b, 0xe1, 0xbc, 0x3f, 0x0e, 0x6d, 0x74, + 0xbb, 0x98, 0xf5, 0xcb, 0x7d, 0x3d, 0x1a, 0x09, + 0x4b, 0x21, 0x8a, 0x47, 0xb7, 0x0a, 0x40, 0x07, + 0x20, 0x82, 0xea, 0xa4, 0x72, 0x30, 0x0b, 0x75, + 0xc0, 0xcd, 0x79, 0xf7, 0xc3, 0x8f, 0x11, 0x69, + 0x3e, 0x15, 0xd7, 0x6e, 0x53, 0xc4, 0xde, 0x16, + 0xb4, 0xd6, 0x2d, 0x25, 0xc4, 0x53, 0xc3, 0x75, + 0x6a, 0x8d, 0x35, 0xbb, 0xa9, 0x3c, 0xa8, 0x90, + 0x70, 0x79, 0x20, 0xa9, 0xc6, 0x78, 0xc9, 0xe2, + 0xbe, 0x9c, 0xf0, 0x8f, 0xc3, 0x2f, 0x07, 0x78, + 0x5b, 0x55, 0x5d, 0x57, 0x48, 0xd3, 0xa5, 0x8e, + 0xf5, 0x55, 0x91, 0x65, 0x92, 0xe6, 0x47, 0xda, + 0x18, 0x60, 0x8c, 0x16, 0xc7, 0xe9, 0x56, 0x7c, + 0x57, 0xf0, 0xfb, 0xc1, 0xde, 0x28, 0xb9, 0xfb, + 0x56, 0xb5, 0xa1, 0xc1, 0x3d, 0xd1, 0xeb, 0x3c, + 0x6c, 0xd1, 0x48, 0xd8, 0x18, 0x1b, 0x99, 0x08, + 0x2d, 0x81, 0xd3, 0x39, 0xae, 0xd8, 0xe3, 0xa8, + 0x45, 0xca, 0x0a, 0x2f, 0x91, 0xfd, 0xf7, 0xfb, + 0xcf, 0x22, 0x79, 0x1e, 0x36, 0xa2, 0x85, 0x69, + 0x4e, 0x3e, 0xd6, 0x3a, 0x79, 0x35, 0xd2, 0xfa, + 0x6f, 0xbf, 0x43, 0xc9, 0x6e, 0x7e, 0x25, 0xfc, + 0x19, 0x48, 0x0b, 0x41, 0xf0, 0xe6, 0x29, 0x65, + 0xc7, 0xca, 0x8d, 0xa3, 0xda, 0x28, 0xcf, 0xa1, + 0x3b, 0x8e, 0x3f, 0x00, 0x6b, 0x7b, 0xe2, 0x97, + 0x8e, 0xf4, 0xaf, 0x0a, 0x7c, 0x36, 0xd3, 0xec, + 0xfc, 0x25, 0x6d, 0x6d, 0xa6, 0xdd, 0xeb, 0x96, + 0xab, 0x3d, 0xac, 0x56, 0x88, 0xb1, 0x7d, 0x96, + 0x19, 0x00, 0x66, 0x97, 0x0a, 0x06, 0x18, 0xe7, + 0x0a, 0x78, 0xe7, 0x27, 0xf8, 0x48, 0xae, 0x8a, + 0xd3, 0xe0, 0xbf, 0xc3, 0x9b, 0x79, 0x04, 0x87, + 0x42, 0x79, 0x98, 0x1c, 0x8f, 0x36, 0xf2, 0x66, + 0x1f, 0x96, 0xec, 0x1f, 0xc6, 0xb4, 0x35, 0x7f, + 0x85, 0xde, 0x04, 0xd5, 0xaf, 0x05, 0xd5, 0xfe, + 0x80, 0x92, 0x48, 0xb1, 0x24, 0x28, 0x16, 0xe6, + 0x68, 0xd1, 0x11, 0x14, 0x2a, 0xaa, 0xa2, 0xb8, + 0x55, 0x50, 0x07, 0x40, 0x00, 0xea, 0x7a, 0x93, + 0x59, 0x3a, 0xf8, 0x5e, 0x78, 0xbb, 0x49, 0xa5, + 0xdf, 0xfe, 0x1c, 0xea, 0x8e, 0x0b, 0x34, 0xf6, + 0x53, 0x8d, 0xe0, 0xa4, 0xd5, 0x95, 0x95, 0xad, + 0xdf, 0xa1, 0xf3, 0x97, 0x82, 0xbe, 0x1b, 0xea, + 0x3e, 0x24, 0xf0, 0x0e, 0xb9, 0xe2, 0x4b, 0x65, + 0x97, 0xcc, 0xb2, 0xc0, 0xb1, 0x85, 0x47, 0xfc, + 0x7c, 0x95, 0xf9, 0xa5, 0x18, 0xc6, 0x4e, 0x17, + 0x01, 0x71, 0xd5, 0xb2, 0x3b, 0x56, 0xe7, 0xec, + 0xdf, 0xe3, 0x91, 0xe1, 0xff, 0x00, 0x11, 0x1f, + 0x0f, 0x6a, 0x13, 0x05, 0xd2, 0xf5, 0x59, 0x00, + 0x8d, 0x8f, 0x48, 0x6e, 0x30, 0x02, 0x9f, 0xa3, + 0xf0, 0xa7, 0xdc, 0x29, 0xe0, 0x03, 0x5f, 0x4b, + 0x68, 0x5a, 0x4e, 0x9d, 0xa1, 0x69, 0x36, 0xfa, + 0x4e, 0x93, 0x6a, 0x96, 0xb6, 0x56, 0xea, 0x56, + 0x28, 0x94, 0x92, 0x14, 0x12, 0x49, 0xe4, 0xe4, + 0x92, 0x49, 0x24, 0x93, 0xc9, 0x26, 0xb9, 0x2b, + 0xaf, 0x84, 0x3f, 0x0e, 0xae, 0x6e, 0x26, 0x9e, + 0x5f, 0x0d, 0xc7, 0xbe, 0x67, 0x67, 0x7d, 0x97, + 0x33, 0x22, 0xe4, 0x9c, 0x9c, 0x28, 0x70, 0x00, + 0xe7, 0xa0, 0x00, 0x0e, 0xd5, 0xa4, 0xb3, 0x18, + 0x55, 0x53, 0x85, 0x54, 0xec, 0xf6, 0xf2, 0x39, + 0x69, 0xf0, 0xf5, 0x6c, 0x2c, 0xa8, 0xd5, 0xc2, + 0xc9, 0x73, 0xc7, 0xe2, 0xbd, 0xec, 0xff, 0x00, + 0x07, 0xe9, 0xe9, 0x6e, 0xa7, 0x75, 0x45, 0x36, + 0x18, 0xd6, 0x28, 0x52, 0x25, 0x2e, 0x55, 0x14, + 0x28, 0x2e, 0xe5, 0x9b, 0x03, 0xd4, 0x9c, 0x92, + 0x7d, 0xcf, 0x34, 0x57, 0x90, 0x7d, 0x71, 0xf3, + 0x77, 0xed, 0x8f, 0x1d, 0xbc, 0xbe, 0x22, 0xf0, + 0x84, 0x57, 0x73, 0xfd, 0x9e, 0xdd, 0xd6, 0x65, + 0x96, 0x6d, 0xa5, 0xbc, 0xb4, 0x2f, 0x1e, 0x5b, + 0x03, 0x93, 0x81, 0x93, 0x81, 0x59, 0x5e, 0x3c, + 0xf8, 0xd9, 0xa6, 0x59, 0xea, 0xda, 0x4d, 0x9f, + 0x83, 0x7c, 0x3f, 0xa0, 0x6a, 0x7a, 0x56, 0x91, + 0x6f, 0x1a, 0xd9, 0x4f, 0xa9, 0xd8, 0x3b, 0x4b, + 0x04, 0x83, 0x8f, 0xdd, 0x12, 0xca, 0x53, 0x01, + 0x53, 0x9c, 0x67, 0x23, 0x39, 0xe9, 0x5e, 0xf1, + 0xf1, 0x0f, 0xe1, 0xc7, 0x86, 0x7c, 0x79, 0x35, + 0x9c, 0xbe, 0x20, 0x8a, 0xe9, 0xda, 0xcd, 0x5d, + 0x62, 0xf2, 0x66, 0x29, 0x80, 0xc4, 0x13, 0x9f, + 0x5e, 0x82, 0xb9, 0x5f, 0xf8, 0x67, 0x9f, 0x87, + 0x1f, 0xf3, 0xed, 0xa9, 0x7f, 0xe0, 0x61, 0xff, + 0x00, 0x0a, 0xf4, 0x29, 0x57, 0xa2, 0xa1, 0x15, + 0x3b, 0xe9, 0x73, 0xe7, 0xb1, 0x58, 0x1c, 0x6b, + 0xaf, 0x52, 0x74, 0x1a, 0x4a, 0x56, 0xd7, 0xae, + 0x88, 0xe2, 0x6c, 0xfe, 0x25, 0xfc, 0x3a, 0xb7, + 0xf8, 0xce, 0x3c, 0x71, 0x0e, 0xa3, 0x3c, 0x30, + 0x5f, 0x68, 0xad, 0x6f, 0x7a, 0x9f, 0x64, 0x90, + 0xb2, 0x5c, 0x07, 0x8f, 0x6f, 0x41, 0xce, 0x51, + 0x71, 0x91, 0xc7, 0xc9, 0xee, 0x2b, 0x91, 0xf0, + 0xd7, 0xc4, 0x2d, 0x1f, 0x5b, 0xf0, 0x17, 0x89, + 0x3c, 0x21, 0xe3, 0xcd, 0x52, 0xe6, 0x54, 0x95, + 0xcc, 0xfa, 0x3d, 0xe4, 0xd1, 0xbc, 0xef, 0x14, + 0x9c, 0x90, 0x09, 0x19, 0x60, 0x01, 0x0a, 0x7e, + 0x8c, 0xc3, 0xda, 0xbd, 0x93, 0xfe, 0x19, 0xe7, + 0xe1, 0xc7, 0xfc, 0xfb, 0x6a, 0x5f, 0xf8, 0x18, + 0x7f, 0xc2, 0x8f, 0xf8, 0x67, 0x9f, 0x87, 0x1f, + 0xf3, 0xed, 0xa9, 0x7f, 0xe0, 0x61, 0xff, 0x00, + 0x0a, 0xa5, 0x5b, 0x0e, 0xbb, 0xf4, 0xfc, 0x0c, + 0xa5, 0x82, 0xcc, 0x64, 0xfe, 0xcd, 0xb5, 0xba, + 0xd6, 0xce, 0xfb, 0xdf, 0xf3, 0xf5, 0x3c, 0x47, + 0xc4, 0x9e, 0x3f, 0xd3, 0x7f, 0xe1, 0x4f, 0xf8, + 0x33, 0x47, 0xd0, 0xf5, 0x29, 0xe1, 0xd7, 0xf4, + 0x5b, 0xb1, 0x3c, 0x9b, 0x63, 0x65, 0xf2, 0x88, + 0x12, 0x60, 0x86, 0x23, 0x07, 0xef, 0x0a, 0x97, + 0xc1, 0x1f, 0x11, 0xec, 0x87, 0x83, 0xbe, 0x21, + 0x27, 0x8a, 0x75, 0x49, 0xe5, 0xd6, 0xbc, 0x41, + 0x6e, 0x56, 0x02, 0x62, 0x66, 0xf3, 0x1f, 0xca, + 0x91, 0x40, 0xc8, 0x18, 0x50, 0x37, 0x28, 0x03, + 0x80, 0x07, 0xd2, 0xbd, 0xa7, 0xfe, 0x19, 0xe7, + 0xe1, 0xc7, 0xfc, 0xfb, 0x6a, 0x5f, 0xf8, 0x18, + 0x7f, 0xc2, 0x8f, 0xf8, 0x67, 0x9f, 0x87, 0x1f, + 0xf3, 0xed, 0xa9, 0x7f, 0xe0, 0x61, 0xff, 0x00, + 0x0a, 0xbf, 0xac, 0xe1, 0xed, 0x6d, 0x7f, 0xa7, + 0x73, 0x35, 0x96, 0xe6, 0x2a, 0x6a, 0x57, 0x8e, + 0x8a, 0xd6, 0xbb, 0xb6, 0xd6, 0xfb, 0xec, 0x72, + 0xbe, 0x1c, 0xf8, 0xbf, 0xe0, 0x4b, 0x3f, 0x83, + 0xd6, 0xbe, 0x1c, 0xb8, 0xd4, 0xe7, 0x5d, 0x46, + 0x3d, 0x18, 0xda, 0x34, 0x62, 0xd6, 0x42, 0x04, + 0x9e, 0x51, 0x5c, 0x6e, 0xc6, 0x3a, 0xf7, 0xad, + 0xcf, 0xd8, 0xef, 0xfe, 0x49, 0x65, 0xdf, 0xfd, + 0x85, 0xe5, 0xff, 0x00, 0xd1, 0x51, 0x55, 0xef, + 0xf8, 0x67, 0x9f, 0x87, 0x1f, 0xf3, 0xed, 0xa9, + 0x7f, 0xe0, 0x61, 0xff, 0x00, 0x0a, 0xee, 0xbc, + 0x05, 0xe0, 0xfd, 0x17, 0xc1, 0x3a, 0x2c, 0x9a, + 0x46, 0x84, 0x93, 0xa5, 0xab, 0xce, 0xd3, 0xb0, + 0x96, 0x4d, 0xe7, 0x79, 0x0a, 0x0f, 0x3e, 0x98, + 0x51, 0x5c, 0xf5, 0x6a, 0xd1, 0xe4, 0x6a, 0x17, + 0xbb, 0x77, 0xd4, 0xf4, 0x30, 0x98, 0x6c, 0x5a, + 0xaf, 0x09, 0xd7, 0xb5, 0xa2, 0x9a, 0x56, 0xb9, + 0x1f, 0xc4, 0xbd, 0x46, 0xf7, 0x4a, 0xf0, 0x84, + 0xd7, 0xba, 0x75, 0xc9, 0xb6, 0xb9, 0x5b, 0xab, + 0x48, 0xc4, 0x81, 0x55, 0xb0, 0xaf, 0x73, 0x12, + 0x30, 0xc3, 0x02, 0x39, 0x56, 0x23, 0xf1, 0xae, + 0x32, 0xf7, 0xe2, 0xa6, 0xb6, 0x20, 0x93, 0xec, + 0x7e, 0x17, 0xd3, 0x8c, 0xd2, 0xde, 0x41, 0x05, + 0x88, 0x9f, 0x56, 0x65, 0x59, 0x51, 0xf5, 0x21, + 0x60, 0xc6, 0x42, 0xb0, 0x93, 0x19, 0xde, 0xc8, + 0xc0, 0x00, 0xf9, 0x56, 0x39, 0xe5, 0x76, 0xb7, + 0xa9, 0xdc, 0xc1, 0x05, 0xcc, 0x26, 0x1b, 0x98, + 0x63, 0x9a, 0x32, 0x43, 0x14, 0x91, 0x43, 0x2e, + 0x41, 0x04, 0x1c, 0x1f, 0x42, 0x01, 0xfa, 0x8a, + 0xa5, 0x77, 0xa0, 0xe8, 0x57, 0x96, 0x92, 0xd9, + 0xdd, 0xe8, 0xba, 0x6d, 0xc5, 0xb4, 0xd1, 0xb4, + 0x72, 0xc3, 0x2d, 0xaa, 0x32, 0x3a, 0x33, 0x6f, + 0x65, 0x2a, 0x46, 0x08, 0x2d, 0xf3, 0x10, 0x7a, + 0x9e, 0x7a, 0xd7, 0x11, 0xed, 0x1e, 0x69, 0xa9, + 0xfc, 0x4e, 0xd4, 0xef, 0xe5, 0x9a, 0xd7, 0x4e, + 0xd2, 0xa6, 0xd3, 0xe1, 0x87, 0x5f, 0xb5, 0xb0, + 0x4b, 0xe0, 0x59, 0xc3, 0x88, 0xf5, 0x8b, 0x6b, + 0x2b, 0x98, 0xdc, 0x3c, 0x41, 0x06, 0xf1, 0x23, + 0xec, 0x31, 0xb4, 0x87, 0x6e, 0x4b, 0x79, 0x4d, + 0xb5, 0x4e, 0x6f, 0x85, 0x3e, 0x2a, 0x6b, 0xe9, + 0xe0, 0x8d, 0x22, 0xe1, 0xf4, 0xc9, 0xbc, 0x43, + 0xac, 0x5d, 0xd9, 0x58, 0xf1, 0x24, 0x9e, 0x52, + 0x4d, 0x33, 0xe9, 0xd0, 0x5c, 0x38, 0x5f, 0x26, + 0x07, 0x21, 0xdc, 0xc8, 0xc4, 0x29, 0x5d, 0xbf, + 0x2b, 0x92, 0xc8, 0x00, 0x07, 0xd6, 0x93, 0xc3, + 0x9e, 0x1e, 0x4b, 0xf9, 0xb5, 0x04, 0xd0, 0xb4, + 0xb5, 0xbc, 0x9f, 0xca, 0xf3, 0x6e, 0x05, 0xa4, + 0x62, 0x49, 0x3c, 0xa2, 0xa6, 0x3d, 0xcd, 0x8c, + 0x9d, 0x85, 0x14, 0xae, 0x7a, 0x15, 0x18, 0xc6, + 0x05, 0x73, 0xbe, 0x36, 0xf8, 0x63, 0xe1, 0x9f, + 0x15, 0x45, 0x65, 0x14, 0xe9, 0x2e, 0x9c, 0x96, + 0x71, 0xbc, 0x71, 0x2d, 0x8c, 0x50, 0xa8, 0x50, + 0xc8, 0x88, 0x19, 0x43, 0xc6, 0xc1, 0x24, 0x55, + 0x8d, 0x55, 0x25, 0x4d, 0xb2, 0x20, 0xc8, 0x56, + 0x50, 0x4d, 0x00, 0x62, 0xc3, 0xf1, 0x52, 0xfe, + 0xea, 0x7b, 0x94, 0xb2, 0xf0, 0xa1, 0x78, 0xdb, + 0x53, 0x3a, 0x75, 0x84, 0xd3, 0x5d, 0xc9, 0x0c, + 0x73, 0x3a, 0xdd, 0x1b, 0x67, 0xf3, 0x19, 0xa1, + 0xc2, 0x10, 0xe3, 0x38, 0x8f, 0xcd, 0xe3, 0x21, + 0xb6, 0xb0, 0xda, 0x75, 0x7c, 0x03, 0xe3, 0x8d, + 0x4f, 0xc5, 0x1e, 0x20, 0x7b, 0x47, 0xd1, 0xac, + 0x2c, 0xac, 0x53, 0x49, 0xb6, 0xbd, 0x69, 0x06, + 0xa0, 0xd2, 0x4e, 0xb3, 0x4b, 0x24, 0xf1, 0x98, + 0xc2, 0x79, 0x41, 0x59, 0x03, 0x5b, 0x4b, 0x87, + 0xdc, 0x09, 0x01, 0x4e, 0xdf, 0x98, 0x84, 0xea, + 0x61, 0xf0, 0xfe, 0x83, 0x0e, 0xa1, 0x71, 0xa8, + 0xc5, 0xa2, 0xe9, 0xa9, 0x7b, 0x72, 0xe9, 0x25, + 0xc5, 0xca, 0xda, 0xa0, 0x96, 0x56, 0x4f, 0xb8, + 0xce, 0xf8, 0xcb, 0x15, 0xec, 0x49, 0xe2, 0x9f, + 0x0e, 0x8b, 0xa3, 0x43, 0x7f, 0x0e, 0xa1, 0x0e, + 0x93, 0x61, 0x1d, 0xe4, 0x11, 0x34, 0x11, 0x5c, + 0x25, 0xb2, 0x09, 0x23, 0x8d, 0x9b, 0x73, 0x22, + 0xb0, 0x19, 0x0a, 0x4f, 0x24, 0x0e, 0x09, 0xe6, + 0x80, 0x3c, 0x87, 0x43, 0xf1, 0x67, 0x8e, 0xec, + 0xaf, 0x35, 0x0f, 0x11, 0xdd, 0x9b, 0xed, 0x4f, + 0x44, 0x1a, 0xed, 0xe6, 0x8c, 0xb6, 0xd7, 0x72, + 0x5a, 0xc5, 0x0b, 0xcc, 0xfa, 0xda, 0xd8, 0xda, + 0x9b, 0x73, 0x12, 0x19, 0x55, 0x63, 0x8c, 0xbf, + 0x98, 0x65, 0xfb, 0xc4, 0x2e, 0xd0, 0x72, 0x58, + 0x6f, 0x5f, 0xfc, 0x55, 0xb9, 0xd2, 0x05, 0xd5, + 0xd6, 0xb7, 0xe1, 0xd8, 0x62, 0xb0, 0xb2, 0x96, + 0x7b, 0x3b, 0xa6, 0xb3, 0xd4, 0x7c, 0xfb, 0x91, + 0x77, 0x05, 0x93, 0xdd, 0xca, 0x89, 0x0b, 0x46, + 0x9b, 0xa2, 0xd9, 0x1b, 0x05, 0x72, 0xca, 0xed, + 0x95, 0x63, 0x1a, 0xa1, 0xdc, 0x3d, 0x1b, 0xfb, + 0x3f, 0x4f, 0xfb, 0x37, 0xd9, 0xbe, 0xc3, 0x6b, + 0xe4, 0x79, 0xff, 0x00, 0x68, 0xf2, 0xfc, 0xa5, + 0xdb, 0xe6, 0xf9, 0x9e, 0x6f, 0x99, 0x8c, 0x63, + 0x77, 0x99, 0xf3, 0xee, 0xeb, 0xbb, 0x9e, 0xbc, + 0xd4, 0x4b, 0xa3, 0xe9, 0x0b, 0xad, 0x36, 0xb6, + 0xba, 0x5d, 0x88, 0xd5, 0x1a, 0x2f, 0x25, 0xaf, + 0x45, 0xba, 0xf9, 0xe6, 0x3c, 0xe7, 0x61, 0x93, + 0x1b, 0xb6, 0xe7, 0xb6, 0x71, 0x40, 0x1c, 0x1d, + 0xef, 0xc4, 0x8d, 0x6b, 0x4f, 0xd4, 0x34, 0x8d, + 0x36, 0xf3, 0xc2, 0xd6, 0xb3, 0x5e, 0x5e, 0xc2, + 0x6f, 0x27, 0x5d, 0x3f, 0x51, 0x92, 0xea, 0x38, + 0xed, 0x43, 0xc6, 0xbb, 0xd1, 0xc5, 0xb8, 0x0e, + 0xe0, 0x4a, 0x18, 0x86, 0xd8, 0x80, 0x63, 0xf7, + 0x87, 0x72, 0xe5, 0x96, 0x9f, 0x14, 0x6f, 0x65, + 0x9e, 0xd2, 0x2b, 0xaf, 0x0f, 0xda, 0x59, 0xf9, + 0x9a, 0xd7, 0xf6, 0x6d, 0xd9, 0x97, 0x50, 0x90, + 0xfd, 0x89, 0x18, 0xc4, 0x21, 0x77, 0xc4, 0x07, + 0x2d, 0x2f, 0x9a, 0x36, 0x15, 0xcc, 0x07, 0x2a, + 0x3c, 0xfc, 0xba, 0x83, 0xd9, 0x45, 0xe1, 0x0f, + 0x09, 0x43, 0x05, 0xb5, 0xbc, 0x5e, 0x17, 0xd1, + 0x23, 0x86, 0xd6, 0xe4, 0xdd, 0x5b, 0xc6, 0xb6, + 0x11, 0x05, 0x86, 0x73, 0xd6, 0x54, 0x1b, 0x70, + 0xaf, 0xc0, 0xf9, 0x87, 0x34, 0xe8, 0x7c, 0x27, + 0xe1, 0x68, 0x5a, 0x16, 0x8b, 0xc3, 0x5a, 0x34, + 0x6d, 0x05, 0xd3, 0x5e, 0x42, 0x56, 0xc6, 0x20, + 0x63, 0xb8, 0x6c, 0x6e, 0x99, 0x7e, 0x5e, 0x24, + 0x38, 0x19, 0x61, 0xc9, 0xc7, 0x5a, 0x00, 0xe1, + 0x2d, 0x3e, 0x2d, 0xdc, 0xdc, 0x59, 0x58, 0xdd, + 0x2f, 0x86, 0xe0, 0xc6, 0xb1, 0x05, 0xa5, 0xd6, + 0x8e, 0x8b, 0xa9, 0xee, 0x66, 0x82, 0xe2, 0xf2, + 0x0b, 0x50, 0x6e, 0x87, 0x97, 0xfe, 0x8f, 0x20, + 0x6b, 0x94, 0x25, 0x07, 0x98, 0x0e, 0xd9, 0x00, + 0x62, 0x50, 0x8a, 0xe9, 0xbc, 0x29, 0xe2, 0xbd, + 0x4b, 0x53, 0xf1, 0x56, 0xa3, 0xe1, 0xed, 0x63, + 0x46, 0xb5, 0xd2, 0xae, 0x6d, 0x2d, 0xe2, 0x9a, + 0x3d, 0x97, 0xaf, 0x37, 0xda, 0x72, 0xaa, 0x25, + 0x68, 0xc9, 0x89, 0x15, 0xa3, 0x49, 0x09, 0x8f, + 0x70, 0x62, 0xd9, 0x03, 0x7a, 0x47, 0xb9, 0x41, + 0xdc, 0xb5, 0xd0, 0x34, 0x2b, 0x59, 0xae, 0xe6, + 0xb6, 0xd1, 0x74, 0xd8, 0x25, 0xbc, 0x9d, 0x6e, + 0x6e, 0x9e, 0x3b, 0x54, 0x56, 0x9e, 0x65, 0x6d, + 0xcb, 0x23, 0x90, 0x3e, 0x67, 0x0d, 0xc8, 0x63, + 0x92, 0x0f, 0x35, 0x35, 0xa6, 0x95, 0xa5, 0xda, + 0x6a, 0x37, 0x7a, 0x95, 0xa6, 0x9b, 0x67, 0x6f, + 0x7d, 0x7b, 0xb7, 0xed, 0x57, 0x31, 0x40, 0xab, + 0x2c, 0xfb, 0x46, 0x17, 0x7b, 0x01, 0x96, 0xc0, + 0xe0, 0x67, 0x38, 0xa0, 0x0f, 0x24, 0xd0, 0x3e, + 0x2e, 0x6a, 0x3a, 0x57, 0x87, 0x6d, 0xee, 0x7c, + 0x59, 0xa5, 0x0b, 0x98, 0x22, 0xb6, 0x4b, 0xcb, + 0x9b, 0xfb, 0x3b, 0x9f, 0x3e, 0x51, 0x6a, 0xf2, + 0x4b, 0x10, 0x95, 0xe0, 0x58, 0x94, 0xab, 0xf9, + 0xab, 0x1a, 0xec, 0x19, 0x05, 0x59, 0xdb, 0x77, + 0xee, 0xd9, 0x6b, 0xa6, 0xf8, 0x97, 0xe2, 0x6d, + 0x72, 0xc7, 0xc0, 0xba, 0x55, 0xbd, 0xa2, 0x4f, + 0xa3, 0x78, 0x9f, 0x5e, 0x78, 0x6d, 0x91, 0x2d, + 0xad, 0x8e, 0xa2, 0xfa, 0x7b, 0x15, 0xdf, 0x71, + 0x20, 0x44, 0x5c, 0xca, 0x22, 0x45, 0x93, 0x07, + 0x6e, 0x0b, 0x6c, 0x07, 0x01, 0xab, 0x7e, 0xf3, + 0xc1, 0x5e, 0x1c, 0x9a, 0x34, 0x8a, 0xdf, 0x4d, + 0xb7, 0xd3, 0xe1, 0x3a, 0x8c, 0x5a, 0x95, 0xd4, + 0x76, 0x50, 0x47, 0x08, 0xbc, 0x9a, 0x26, 0xde, + 0x86, 0x6c, 0x2e, 0x58, 0x09, 0x02, 0x3f, 0x50, + 0x49, 0x41, 0x92, 0x46, 0x41, 0xdd, 0x7b, 0x7b, + 0x77, 0xba, 0x8e, 0xed, 0xe0, 0x89, 0xae, 0x22, + 0x46, 0x8e, 0x39, 0x4a, 0x02, 0xe8, 0xac, 0x54, + 0xb2, 0x83, 0xd4, 0x02, 0x55, 0x72, 0x3b, 0xed, + 0x1e, 0x82, 0x80, 0x3c, 0x17, 0x5f, 0xf8, 0x95, + 0xe2, 0x9b, 0xe6, 0xd0, 0x75, 0x8d, 0x36, 0x6d, + 0x43, 0x4a, 0x85, 0x34, 0xd8, 0xae, 0x35, 0x9b, + 0x75, 0x8a, 0x13, 0x6d, 0x61, 0x34, 0x77, 0xab, + 0x05, 0xdf, 0xda, 0x84, 0xa8, 0x66, 0xf2, 0x63, + 0xdb, 0x2a, 0x93, 0x1e, 0x08, 0x0b, 0xb8, 0x94, + 0x19, 0x75, 0xb5, 0xe3, 0x5f, 0x14, 0x7c, 0x51, + 0xb5, 0xf0, 0xe7, 0xc4, 0x5b, 0xed, 0x16, 0xfa, + 0xc7, 0xfb, 0x3f, 0x4d, 0x6d, 0x42, 0x6b, 0x7d, + 0x46, 0x48, 0x93, 0xce, 0xd2, 0xc5, 0xac, 0x02, + 0x4f, 0x25, 0x63, 0xc6, 0x26, 0xf3, 0x0e, 0xdd, + 0xac, 0xc3, 0xe4, 0xcc, 0x85, 0x8b, 0xe1, 0x10, + 0xfb, 0x48, 0xd2, 0xf4, 0xc1, 0x2c, 0xf2, 0x8d, + 0x3a, 0xcc, 0x49, 0x70, 0xac, 0xb3, 0xbf, 0x90, + 0xb9, 0x94, 0x36, 0x37, 0x06, 0x38, 0xf9, 0x81, + 0xc0, 0xce, 0x7a, 0xe2, 0x85, 0xd2, 0xb4, 0xb5, + 0xd3, 0xe7, 0xd3, 0x97, 0x4d, 0xb3, 0x16, 0x57, + 0x08, 0x52, 0x6b, 0x71, 0x02, 0xf9, 0x72, 0x29, + 0x5d, 0xa4, 0x32, 0xe3, 0x04, 0x15, 0xe0, 0x83, + 0xdb, 0x8a, 0x00, 0x4d, 0x26, 0x0d, 0x42, 0x05, + 0xb9, 0xfe, 0xd0, 0xbd, 0x5b, 0xa2, 0xf7, 0x0e, + 0xf0, 0xed, 0x8c, 0x27, 0x97, 0x11, 0xfb, 0xa9, + 0xc7, 0x5c, 0x73, 0xc9, 0xe7, 0x9e, 0xfd, 0x68, + 0xab, 0xb4, 0x50, 0x07, 0xff, 0xd9, +}; + +static const uint8_t data_images_freertos_jpg[] = +{ + /* /images/freertos.jpg */ + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, + 0x2e, 0x6a, 0x70, 0x67, 0x00, + 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, + 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x60, + 0x00, 0x60, 0x00, 0x00, 0xff, 0xe1, 0x00, 0x16, + 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x49, 0x49, + 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43, + 0x00, 0x08, 0x06, 0x06, 0x07, 0x06, 0x05, 0x08, + 0x07, 0x07, 0x07, 0x09, 0x09, 0x08, 0x0a, 0x0c, + 0x14, 0x0d, 0x0c, 0x0b, 0x0b, 0x0c, 0x19, 0x12, + 0x13, 0x0f, 0x14, 0x1d, 0x1a, 0x1f, 0x1e, 0x1d, + 0x1a, 0x1c, 0x1c, 0x20, 0x24, 0x2e, 0x27, 0x20, + 0x22, 0x2c, 0x23, 0x1c, 0x1c, 0x28, 0x37, 0x29, + 0x2c, 0x30, 0x31, 0x34, 0x34, 0x34, 0x1f, 0x27, + 0x39, 0x3d, 0x38, 0x32, 0x3c, 0x2e, 0x33, 0x34, + 0x32, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x09, 0x09, + 0x09, 0x0c, 0x0b, 0x0c, 0x18, 0x0d, 0x0d, 0x18, + 0x32, 0x21, 0x1c, 0x21, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0xff, 0xc0, + 0x00, 0x11, 0x08, 0x00, 0x3e, 0x00, 0xc2, 0x03, + 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, + 0x01, 0xff, 0xc4, 0x00, 0x1f, 0x00, 0x00, 0x01, + 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0xff, 0xc4, 0x00, 0xb5, 0x10, 0x00, + 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, + 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, + 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, + 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, + 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, + 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, + 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, + 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, + 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, + 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, + 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, + 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, + 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, + 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, + 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, + 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, + 0xfa, 0xff, 0xc4, 0x00, 0x1f, 0x01, 0x00, 0x03, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0xff, 0xc4, 0x00, 0xb5, 0x11, 0x00, + 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, + 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, + 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, + 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, + 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, + 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, + 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, + 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, + 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, + 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, + 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, + 0xfa, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, + 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0xf7, + 0xea, 0xad, 0x7b, 0x77, 0x0d, 0x85, 0x9c, 0xb7, + 0x53, 0xb6, 0xd8, 0xe3, 0x19, 0x27, 0xfa, 0x55, + 0x9a, 0xe7, 0xb5, 0xe3, 0xf6, 0xfd, 0x53, 0x4f, + 0xd2, 0x01, 0xca, 0xbb, 0xf9, 0xf3, 0x8f, 0xf6, + 0x17, 0xa0, 0x3f, 0x53, 0xfc, 0xaa, 0x27, 0x2e, + 0x54, 0x44, 0xe5, 0xca, 0xae, 0x5d, 0x7b, 0x59, + 0xf5, 0x3b, 0x48, 0x9d, 0xee, 0xee, 0x2d, 0x37, + 0xae, 0xe3, 0x1c, 0x25, 0x46, 0x33, 0xd8, 0x9c, + 0x67, 0x35, 0x58, 0x78, 0x6d, 0xd7, 0xee, 0xeb, + 0x3a, 0x98, 0xfa, 0xcc, 0x0f, 0xf4, 0xad, 0xd0, + 0x31, 0xd2, 0xbc, 0x27, 0xe2, 0x9f, 0x8c, 0x36, + 0xf8, 0x83, 0x59, 0xd1, 0x75, 0x1d, 0x47, 0x52, + 0xd3, 0x12, 0xda, 0x08, 0x06, 0x9c, 0x96, 0xac, + 0xc8, 0x97, 0x0f, 0x27, 0xdf, 0x96, 0x46, 0x51, + 0x96, 0x54, 0x07, 0x85, 0xef, 0xb4, 0xf7, 0xa4, + 0xe9, 0xc5, 0xea, 0xc1, 0xc1, 0x3d, 0x59, 0xeb, + 0x5f, 0xd8, 0x17, 0x23, 0xa6, 0xb9, 0x7f, 0xf8, + 0xb2, 0x9f, 0xe9, 0x47, 0xf6, 0x25, 0xf7, 0x6d, + 0x76, 0xf3, 0xf1, 0x0b, 0xfe, 0x15, 0xcb, 0xf8, + 0x42, 0xfe, 0xf6, 0x48, 0x35, 0x5d, 0x6c, 0x35, + 0xdc, 0x5a, 0x0a, 0x5b, 0xc3, 0x6d, 0xa5, 0x41, + 0x74, 0x58, 0x34, 0x81, 0x17, 0x0d, 0x31, 0x56, + 0xe9, 0xb9, 0xb1, 0xf5, 0xc6, 0x69, 0xb6, 0x77, + 0x1a, 0xad, 0xed, 0xca, 0xdb, 0xc1, 0x79, 0x70, + 0x64, 0x6c, 0xe3, 0x33, 0x30, 0x15, 0xcd, 0x5a, + 0xac, 0x29, 0x49, 0x46, 0xcd, 0xb7, 0xe6, 0x67, + 0x35, 0x18, 0xbb, 0x5b, 0xf1, 0x3a, 0xaf, 0xec, + 0x6d, 0x53, 0xb6, 0xbf, 0x3f, 0xe3, 0x12, 0x9a, + 0x4f, 0xec, 0x8d, 0x64, 0x7d, 0xdf, 0x10, 0x49, + 0xf8, 0xdb, 0xa1, 0xac, 0x1b, 0xc1, 0xaf, 0x69, + 0xa8, 0x24, 0x9e, 0xe2, 0x61, 0x1e, 0x71, 0xb8, + 0x49, 0xb8, 0x66, 0xaf, 0xf8, 0x77, 0x5b, 0xbb, + 0xba, 0xbd, 0xfb, 0x2d, 0xcb, 0x79, 0xa1, 0x94, + 0x95, 0x6c, 0x72, 0x31, 0x51, 0x1a, 0xf0, 0x73, + 0x50, 0x92, 0x69, 0xfa, 0x92, 0xb9, 0x6f, 0xca, + 0xef, 0xf7, 0x97, 0xce, 0x97, 0xae, 0xf6, 0xf1, + 0x0f, 0xfe, 0x4a, 0x25, 0x1f, 0xd9, 0xbe, 0x20, + 0x1d, 0x35, 0xe4, 0x3f, 0x5b, 0x55, 0xaa, 0xba, + 0xb4, 0xda, 0xef, 0xf6, 0x84, 0x9f, 0x62, 0x59, + 0x56, 0xdd, 0x40, 0x0b, 0xb5, 0x41, 0xcf, 0xa9, + 0xac, 0x56, 0xf1, 0x0e, 0xb1, 0x1b, 0xb2, 0x35, + 0xd1, 0x0c, 0xa7, 0x04, 0x14, 0x5f, 0xf0, 0xa5, + 0x52, 0xbd, 0x3a, 0x6e, 0xcd, 0x48, 0x25, 0xc9, + 0x17, 0xad, 0xfe, 0xf3, 0xa4, 0x16, 0x3e, 0x22, + 0x1d, 0x35, 0x88, 0x0f, 0xd6, 0xd8, 0x7f, 0x8d, + 0x1f, 0x64, 0xf1, 0x18, 0xe9, 0xa9, 0x5a, 0x1f, + 0xac, 0x07, 0xfc, 0x6b, 0x15, 0x35, 0x6f, 0x11, + 0x15, 0x0c, 0x12, 0x66, 0x52, 0x32, 0x0f, 0xd9, + 0xf8, 0x23, 0xf2, 0xae, 0x93, 0xfb, 0x48, 0x58, + 0xe9, 0x30, 0xdc, 0x6a, 0x0f, 0x89, 0x59, 0x41, + 0x2b, 0x8c, 0x12, 0x7d, 0x00, 0xad, 0x29, 0xd5, + 0x84, 0xef, 0xba, 0xb7, 0x71, 0xc7, 0x95, 0xf7, + 0xfb, 0xca, 0xbe, 0x47, 0x89, 0x87, 0x4b, 0xcb, + 0x03, 0xf5, 0x89, 0xbf, 0xc6, 0x93, 0xcb, 0xf1, + 0x40, 0xe9, 0x3e, 0x9a, 0x7e, 0xa8, 0xf5, 0x97, + 0x71, 0xe3, 0x0b, 0xa7, 0x7c, 0x5b, 0x5b, 0xc6, + 0x8b, 0xdb, 0x7e, 0x58, 0xfe, 0x95, 0x13, 0x78, + 0x97, 0x58, 0x87, 0x0d, 0x2c, 0x6a, 0x01, 0xe9, + 0xbe, 0x22, 0x33, 0x50, 0xf1, 0x54, 0xba, 0x36, + 0x2e, 0x68, 0x77, 0x66, 0xc6, 0x3c, 0x54, 0x3f, + 0x8b, 0x4b, 0x3f, 0x83, 0xd2, 0x6e, 0xf1, 0x58, + 0xfe, 0x1d, 0x2c, 0xff, 0x00, 0xdf, 0x75, 0x16, + 0x9b, 0xe2, 0xc4, 0x9e, 0x45, 0x86, 0xee, 0x21, + 0x13, 0x37, 0x01, 0xd4, 0xfc, 0xb9, 0xf7, 0xf4, + 0xae, 0x8d, 0xdd, 0x23, 0x8d, 0x9d, 0xd8, 0x2a, + 0x81, 0x92, 0x4f, 0x40, 0x2b, 0x6a, 0x72, 0x85, + 0x45, 0x78, 0xc9, 0x97, 0x18, 0xa9, 0x6a, 0xa4, + 0xcc, 0x1f, 0x37, 0xc5, 0x23, 0xfe, 0x5d, 0xf4, + 0xe3, 0xf4, 0x76, 0xa5, 0xfb, 0x4f, 0x89, 0xc7, + 0x5b, 0x0b, 0x26, 0xfa, 0x4a, 0x45, 0x43, 0x77, + 0xe2, 0xfb, 0x78, 0x9c, 0xad, 0xb4, 0x0d, 0x36, + 0x3f, 0x89, 0x8e, 0xd1, 0x54, 0xff, 0x00, 0xe1, + 0x33, 0x9f, 0x3f, 0xf1, 0xe9, 0x1e, 0x3f, 0xdf, + 0x35, 0x9c, 0xb1, 0x14, 0xa2, 0xed, 0xce, 0xc9, + 0xbc, 0x57, 0xda, 0x66, 0x97, 0xdb, 0x7c, 0x4a, + 0x3a, 0xe9, 0x56, 0xcd, 0xf4, 0x9e, 0xa4, 0x87, + 0x50, 0xd7, 0x37, 0x8f, 0x3f, 0x45, 0x1b, 0x3b, + 0x98, 0xee, 0x14, 0x9f, 0xc8, 0xd3, 0x34, 0x8f, + 0x11, 0x9d, 0x4e, 0xef, 0xec, 0xe6, 0xd4, 0xa1, + 0xda, 0x5b, 0x70, 0x7c, 0x80, 0x3f, 0x2a, 0xde, + 0xed, 0x5b, 0x53, 0x6a, 0x6b, 0x9a, 0x32, 0x76, + 0x2e, 0x2a, 0xfa, 0xa9, 0x32, 0x0b, 0x5b, 0xa8, + 0xae, 0xd5, 0x9a, 0x26, 0xc9, 0x56, 0x2a, 0xea, + 0x7a, 0xab, 0x0e, 0xa0, 0xfb, 0xd5, 0x8a, 0xe1, + 0xfc, 0x2b, 0x77, 0x2c, 0x9e, 0x34, 0xd6, 0x61, + 0x0c, 0x4c, 0x2c, 0xa6, 0x46, 0x1f, 0xed, 0x07, + 0xc0, 0xfd, 0x09, 0xae, 0xe2, 0xb5, 0xa7, 0x2e, + 0x78, 0xdc, 0x74, 0xa7, 0xcf, 0x1b, 0x85, 0x14, + 0x51, 0x56, 0x68, 0x14, 0x51, 0x45, 0x00, 0x21, + 0x35, 0xcf, 0x68, 0x23, 0xfb, 0x43, 0x54, 0xd4, + 0x35, 0x66, 0xe5, 0x59, 0xfc, 0x88, 0x0f, 0xfb, + 0x0b, 0xd4, 0x8f, 0xa9, 0xab, 0x7e, 0x22, 0xbe, + 0x36, 0x1a, 0x2c, 0xef, 0x1e, 0x7c, 0xe9, 0x07, + 0x95, 0x18, 0x1d, 0x77, 0x37, 0x1f, 0xfd, 0x7f, + 0xc2, 0xac, 0xe9, 0x36, 0x4b, 0xa7, 0x69, 0x76, + 0xf6, 0x8b, 0xff, 0x00, 0x2c, 0xd0, 0x06, 0xf7, + 0x3d, 0xff, 0x00, 0x5a, 0xc9, 0xfb, 0xd3, 0x4b, + 0xb1, 0x93, 0xf7, 0xa6, 0x97, 0x62, 0x0f, 0x11, + 0xeb, 0x70, 0x78, 0x6f, 0xc3, 0xb7, 0xfa, 0xcd, + 0xca, 0x97, 0x8e, 0xd2, 0x23, 0x21, 0x45, 0xe0, + 0xb1, 0xec, 0xbf, 0x89, 0xc0, 0xaf, 0x2c, 0xb8, + 0xf1, 0x97, 0x88, 0x2d, 0xef, 0x35, 0x5b, 0xfd, + 0x52, 0xff, 0x00, 0x47, 0x9e, 0x2b, 0x3d, 0x2d, + 0x27, 0xb7, 0xb3, 0x82, 0xdc, 0x3a, 0x7d, 0xaa, + 0x6c, 0xf9, 0x31, 0x6e, 0x3f, 0x33, 0x90, 0x06, + 0x4e, 0xd2, 0x3a, 0x8a, 0xde, 0xf8, 0xad, 0xe3, + 0x0b, 0x3d, 0x0b, 0xfb, 0x2f, 0x4a, 0xbd, 0x6b, + 0x39, 0x2c, 0x75, 0x09, 0x42, 0x6a, 0x50, 0xcc, + 0x8c, 0xee, 0x2d, 0x89, 0xc1, 0x65, 0x55, 0x23, + 0xdf, 0x9e, 0xa3, 0x1d, 0x0d, 0x54, 0xf0, 0x2f, + 0x87, 0x7e, 0x15, 0xc9, 0xad, 0x8b, 0x9f, 0x0c, + 0x18, 0x6f, 0x6f, 0xe1, 0x53, 0x2a, 0x87, 0x92, + 0x49, 0x0c, 0x43, 0x23, 0xe6, 0x01, 0xf8, 0x1c, + 0x91, 0xcf, 0x5a, 0xd4, 0xd4, 0xe8, 0x75, 0xbb, + 0xeb, 0xc6, 0xd0, 0x74, 0xcb, 0x7b, 0xf1, 0x1a, + 0x5f, 0x4b, 0x0a, 0x49, 0x74, 0x91, 0x02, 0x15, + 0x5f, 0x03, 0x20, 0x03, 0xdb, 0x76, 0x7f, 0x2a, + 0xc8, 0xd3, 0x75, 0x09, 0x74, 0xc9, 0xcd, 0xc4, + 0x51, 0x23, 0x92, 0x36, 0xe5, 0xc1, 0xc0, 0xa9, + 0x35, 0xcb, 0xbf, 0xb6, 0x6a, 0xf3, 0xc8, 0x0e, + 0x55, 0x4e, 0xc5, 0xfa, 0x0a, 0xec, 0xb4, 0x7b, + 0x15, 0xb7, 0xd1, 0x21, 0x86, 0x44, 0x04, 0xba, + 0xee, 0x70, 0x47, 0x52, 0x7b, 0x7f, 0x4a, 0xf1, + 0xf9, 0x65, 0x88, 0xc4, 0x4a, 0x51, 0x76, 0xb1, + 0xcb, 0x67, 0x39, 0xb6, 0x8e, 0x4a, 0xf3, 0x58, + 0xbb, 0xd6, 0x9a, 0x3b, 0x69, 0x5a, 0x18, 0x90, + 0xb7, 0x18, 0xc8, 0x19, 0xf7, 0x3c, 0xd7, 0x4f, + 0xa1, 0xe8, 0x4b, 0xa5, 0x86, 0x96, 0x46, 0x12, + 0x4e, 0xe3, 0x04, 0x8e, 0x8a, 0x3d, 0x05, 0x70, + 0xb3, 0x27, 0x95, 0x3c, 0x91, 0xff, 0x00, 0x75, + 0x8a, 0xd7, 0xa7, 0xdb, 0x49, 0xe7, 0x5a, 0xc5, + 0x27, 0xf7, 0xd0, 0x37, 0xe6, 0x2a, 0xf0, 0x5f, + 0xbc, 0xa8, 0xe5, 0x3d, 0x5a, 0x1d, 0x2f, 0x79, + 0xb6, 0xf7, 0x19, 0x7d, 0x70, 0x2d, 0x2c, 0xa7, + 0xb8, 0x38, 0xf9, 0x10, 0xb0, 0xf7, 0x35, 0xe6, + 0xd6, 0xf1, 0x35, 0xd5, 0xe4, 0x51, 0x64, 0xee, + 0x95, 0xc2, 0x93, 0xf5, 0x35, 0xd9, 0x78, 0xb6, + 0xe7, 0xc9, 0xd2, 0xd6, 0x10, 0x79, 0x99, 0xc0, + 0xfc, 0x07, 0x3f, 0xe1, 0x58, 0x3e, 0x17, 0xb7, + 0xf3, 0xf5, 0xa4, 0x72, 0x38, 0x89, 0x4b, 0xff, + 0x00, 0x41, 0xfc, 0xe8, 0xc5, 0xbf, 0x69, 0x5e, + 0x34, 0xc2, 0xaf, 0xbd, 0x35, 0x13, 0xbb, 0x55, + 0x11, 0xa2, 0xaa, 0x8c, 0x05, 0x18, 0x02, 0xbc, + 0xf7, 0x5d, 0xbf, 0x6b, 0xfd, 0x52, 0x56, 0xcf, + 0xee, 0xe3, 0x25, 0x10, 0x7b, 0x0e, 0xff, 0x00, + 0x8d, 0x7a, 0x21, 0xe8, 0x6b, 0xca, 0xe6, 0x8d, + 0xa2, 0x9e, 0x48, 0xe4, 0xfb, 0xe8, 0xc4, 0x37, + 0xd6, 0xab, 0x31, 0x6d, 0x41, 0x45, 0x6c, 0x3a, + 0xee, 0xc9, 0x23, 0xb4, 0xf0, 0xc6, 0x97, 0x1d, + 0xbd, 0x92, 0x5d, 0xc8, 0xa0, 0xcf, 0x28, 0xc8, + 0x24, 0x7d, 0xd5, 0xed, 0x8a, 0xdb, 0x9e, 0x08, + 0xee, 0x21, 0x78, 0xa5, 0x40, 0xc8, 0xc3, 0x04, + 0x11, 0x54, 0x34, 0x2b, 0xb8, 0xae, 0x74, 0x9b, + 0x70, 0x8c, 0x0b, 0x46, 0x8a, 0x8c, 0xbd, 0xc1, + 0x03, 0x14, 0x6b, 0x5a, 0xb4, 0x5a, 0x75, 0xa3, + 0xe1, 0xc1, 0xb8, 0x61, 0x88, 0xd4, 0x1e, 0x73, + 0xeb, 0x5d, 0x34, 0xfd, 0x9c, 0x28, 0xa7, 0xd2, + 0xc6, 0x8b, 0x96, 0x30, 0x3c, 0xfa, 0x45, 0xd9, + 0x23, 0xa0, 0x39, 0x0a, 0x48, 0xcd, 0x75, 0xda, + 0x84, 0x93, 0xcd, 0xe0, 0xc8, 0x5c, 0x64, 0x92, + 0xa9, 0xe6, 0x1f, 0x6f, 0xf3, 0x8a, 0xe4, 0xed, + 0xe0, 0x92, 0xea, 0xe1, 0x20, 0x89, 0x77, 0x48, + 0xed, 0x80, 0x2b, 0xd3, 0x20, 0xb7, 0x8e, 0x0b, + 0x48, 0xed, 0xb8, 0x2a, 0xa8, 0x13, 0x07, 0xb8, + 0x03, 0x15, 0xc1, 0x82, 0xa6, 0xe6, 0xa7, 0xd1, + 0x3d, 0x0c, 0x69, 0x46, 0xf7, 0x3c, 0xd2, 0xdd, + 0xe3, 0x8e, 0xe6, 0x37, 0x96, 0x3f, 0x32, 0x35, + 0x60, 0x59, 0x3d, 0x47, 0xa5, 0x76, 0xb6, 0x9a, + 0xae, 0x85, 0x70, 0x81, 0x02, 0xc1, 0x11, 0xfe, + 0xe4, 0x91, 0x85, 0xff, 0x00, 0xeb, 0x51, 0x77, + 0xe1, 0x5b, 0x0b, 0x82, 0x5e, 0x2d, 0xd0, 0x31, + 0xfe, 0xe7, 0xdd, 0xfc, 0xab, 0x95, 0xd5, 0xb4, + 0x99, 0x74, 0xa9, 0x95, 0x1d, 0xd6, 0x44, 0x70, + 0x76, 0xb0, 0xe3, 0x38, 0xf6, 0xa1, 0x46, 0xae, + 0x11, 0x37, 0x64, 0xd0, 0xad, 0x2a, 0x67, 0x79, + 0x6f, 0x61, 0x65, 0x04, 0xdf, 0x68, 0xb7, 0x82, + 0x34, 0x66, 0x5d, 0xbb, 0x90, 0x63, 0x23, 0xf0, + 0xab, 0x4c, 0x70, 0x84, 0xfb, 0x57, 0x17, 0xe1, + 0x3b, 0xd9, 0x96, 0xff, 0x00, 0xec, 0x9b, 0x89, + 0x85, 0xd4, 0x9d, 0xa7, 0xf8, 0x48, 0xef, 0x5d, + 0x75, 0xeb, 0xf9, 0x76, 0x33, 0xbf, 0xa4, 0x6c, + 0x7f, 0x4a, 0xf4, 0x28, 0x55, 0x8d, 0x4a, 0x7c, + 0xd1, 0x56, 0x37, 0x8c, 0x93, 0x8d, 0xd1, 0xc3, + 0x78, 0x04, 0xf9, 0xde, 0x24, 0xd7, 0x25, 0xf4, + 0x48, 0xf9, 0xfa, 0xb3, 0xff, 0x00, 0x85, 0x7a, + 0x0d, 0x70, 0x5f, 0x0d, 0x93, 0x32, 0x6b, 0x13, + 0x77, 0x69, 0x23, 0x4f, 0xc8, 0x13, 0xff, 0x00, + 0xb3, 0x57, 0x7b, 0x57, 0x43, 0xf8, 0x68, 0xcf, + 0x0b, 0xfc, 0x24, 0x14, 0x51, 0x45, 0x6c, 0x74, + 0x05, 0x14, 0x51, 0x40, 0x1c, 0xdd, 0xf9, 0xfe, + 0xd2, 0xf1, 0x55, 0x9d, 0x90, 0xe6, 0x1b, 0x35, + 0xfb, 0x44, 0xbe, 0x9b, 0x8f, 0xdd, 0x1f, 0x5e, + 0xff, 0x00, 0x8d, 0x73, 0xdf, 0x17, 0x35, 0x2d, + 0x67, 0x4e, 0xd0, 0x34, 0xef, 0xec, 0x98, 0x35, + 0x17, 0x8d, 0xef, 0xa3, 0xfb, 0x63, 0xe9, 0xe5, + 0x84, 0xab, 0x0a, 0xf2, 0x40, 0x2b, 0xca, 0xe7, + 0x18, 0xcf, 0xf8, 0xd6, 0xc6, 0x85, 0x7f, 0x67, + 0x6d, 0x75, 0xa9, 0x4d, 0x7f, 0x77, 0x14, 0x77, + 0xb2, 0xdc, 0xb2, 0xb2, 0xbb, 0x00, 0x55, 0x57, + 0x85, 0x1c, 0xfb, 0x56, 0xff, 0x00, 0xf6, 0x8e, + 0x9f, 0x70, 0x8c, 0x82, 0xf2, 0xdd, 0x95, 0x86, + 0x08, 0x12, 0x8f, 0xf1, 0xac, 0x69, 0x49, 0x6a, + 0xdb, 0xd5, 0x98, 0x52, 0x92, 0x69, 0xca, 0xfb, + 0x9e, 0x1f, 0x1f, 0xc6, 0x5f, 0x0c, 0x6a, 0x97, + 0xd7, 0xb7, 0x1e, 0x26, 0xf0, 0xcb, 0x5c, 0x59, + 0x3b, 0xaa, 0xd8, 0xb3, 0x69, 0xf1, 0x4a, 0xcb, + 0x18, 0x07, 0x3b, 0xd9, 0x9b, 0x93, 0x9c, 0xf0, + 0x3a, 0x57, 0x7f, 0xa2, 0x78, 0x83, 0xc0, 0xfa, + 0x57, 0x83, 0xe6, 0xf1, 0x8e, 0x9d, 0xa5, 0xc5, + 0xa5, 0x69, 0x92, 0x1f, 0x2d, 0xe4, 0x8e, 0xcd, + 0x63, 0x79, 0x30, 0xfb, 0x7e, 0xea, 0x75, 0xf9, + 0x89, 0xfc, 0x8d, 0x75, 0xda, 0x65, 0x9e, 0x97, + 0xa5, 0xe9, 0xf1, 0xd8, 0x69, 0xb1, 0x5b, 0xc1, + 0x69, 0x1e, 0x76, 0x45, 0x16, 0x36, 0xae, 0x4e, + 0x4f, 0xea, 0x4d, 0x5a, 0x92, 0xde, 0xde, 0x78, + 0xbc, 0xa9, 0x22, 0x8a, 0x48, 0xba, 0xec, 0x65, + 0x04, 0x7e, 0x55, 0xad, 0xd1, 0xb5, 0xcf, 0x30, + 0x5f, 0x89, 0xff, 0x00, 0x0b, 0x24, 0x20, 0xb5, + 0xe9, 0x4f, 0xad, 0xa4, 0xff, 0x00, 0xd1, 0x6b, + 0xa2, 0xb7, 0xf8, 0xad, 0xe0, 0x5b, 0x85, 0x1e, + 0x5f, 0x88, 0xed, 0x14, 0x7f, 0xd3, 0x40, 0xc9, + 0xff, 0x00, 0xa1, 0x01, 0x5b, 0x57, 0x3e, 0x13, + 0xf0, 0xdd, 0xe7, 0xfc, 0x7c, 0xe8, 0x1a, 0x54, + 0xdf, 0xf5, 0xd2, 0xd2, 0x36, 0xfe, 0x95, 0x46, + 0x4f, 0x87, 0x5e, 0x0c, 0x93, 0xef, 0x78, 0x63, + 0x4a, 0x1f, 0xee, 0xdb, 0x2a, 0xff, 0x00, 0x2a, + 0x51, 0x8c, 0x63, 0xb2, 0x04, 0x92, 0xd8, 0xc7, + 0x7d, 0x6f, 0xe1, 0xe5, 0xd4, 0xad, 0x27, 0xfc, + 0x24, 0xda, 0x6a, 0xb3, 0x92, 0xc7, 0x37, 0xa8, + 0x39, 0xfc, 0x4d, 0x74, 0x9a, 0x7f, 0x88, 0xbc, + 0x3a, 0xf6, 0xb1, 0x43, 0x67, 0xaf, 0x69, 0xb3, + 0xa2, 0x28, 0x55, 0x29, 0x79, 0x1b, 0x1c, 0x0f, + 0xa1, 0xac, 0x3b, 0x9f, 0x84, 0x1e, 0x03, 0xba, + 0xfb, 0xfe, 0x1e, 0x85, 0x7f, 0xeb, 0x94, 0xb2, + 0x47, 0xff, 0x00, 0xa0, 0xb0, 0xaa, 0x2f, 0xf0, + 0x3b, 0xc0, 0x4f, 0xf7, 0x74, 0xa9, 0x93, 0xfd, + 0xdb, 0xb9, 0x7f, 0xab, 0x52, 0x8d, 0x38, 0x45, + 0xde, 0x2a, 0xc2, 0x51, 0x4b, 0x63, 0xa8, 0xd4, + 0xec, 0xec, 0x35, 0xb7, 0x89, 0xff, 0x00, 0xb4, + 0x63, 0x1b, 0x01, 0x00, 0x23, 0xa9, 0x1c, 0xff, + 0x00, 0xfa, 0xaa, 0x7d, 0x1b, 0x46, 0x8b, 0x4a, + 0xf3, 0x59, 0x26, 0xf3, 0x4c, 0x98, 0xe7, 0x1d, + 0x31, 0x5c, 0x15, 0xc7, 0xec, 0xff, 0x00, 0xe0, + 0xb9, 0x94, 0x88, 0xce, 0xa5, 0x6e, 0x7d, 0x63, + 0xb8, 0x07, 0xff, 0x00, 0x42, 0x53, 0x55, 0x13, + 0xf6, 0x7c, 0xd0, 0xad, 0xdb, 0x75, 0x9e, 0xbb, + 0xad, 0xc0, 0xde, 0xa2, 0x58, 0xf3, 0xfa, 0x28, + 0xa9, 0xf6, 0x30, 0xe7, 0xe7, 0xb6, 0xa1, 0xca, + 0xaf, 0x73, 0xd7, 0xab, 0x0f, 0x57, 0xf0, 0xe4, + 0x3a, 0x8c, 0x86, 0x78, 0xdf, 0xca, 0x9c, 0x8e, + 0x4e, 0x32, 0x1b, 0xeb, 0x5e, 0x7f, 0x27, 0xc1, + 0x4b, 0xf8, 0xd7, 0x16, 0x3e, 0x3f, 0xd7, 0x60, + 0x3d, 0xb7, 0x33, 0x37, 0xf2, 0x75, 0xa8, 0xe3, + 0xf8, 0x4f, 0xe3, 0x6b, 0x56, 0xdd, 0x6f, 0xf1, + 0x3f, 0x52, 0x27, 0xd1, 0xc4, 0xa4, 0x7e, 0x46, + 0x53, 0x55, 0x52, 0x9c, 0x6a, 0x2e, 0x59, 0x20, + 0x94, 0x54, 0x95, 0x99, 0xd3, 0x37, 0x85, 0xb5, + 0x48, 0x9b, 0xe4, 0xf2, 0xdb, 0xdd, 0x1f, 0x1f, + 0xce, 0x96, 0x2f, 0x09, 0xea, 0x32, 0x3e, 0x65, + 0x68, 0xa3, 0x1d, 0xc9, 0x6c, 0x9f, 0xd2, 0xb9, + 0xd6, 0xf0, 0x3f, 0xc5, 0x48, 0x07, 0xfa, 0x37, + 0xc4, 0x18, 0xa4, 0x3d, 0xbc, 0xe8, 0x7f, 0xfb, + 0x16, 0xa8, 0x17, 0x41, 0xf8, 0xdf, 0x6e, 0xd9, + 0x5f, 0x14, 0x69, 0x13, 0x81, 0xd8, 0xa2, 0xf3, + 0xf9, 0xc2, 0x2b, 0x97, 0xea, 0x14, 0xbc, 0xcc, + 0xfd, 0x8c, 0x4f, 0x4e, 0xd2, 0xb4, 0x3b, 0x6d, + 0x2d, 0x77, 0x2e, 0x64, 0x98, 0x8c, 0x19, 0x1b, + 0xfa, 0x7a, 0x56, 0x67, 0x89, 0xad, 0x75, 0x2b, + 0x8b, 0xa8, 0x64, 0xb5, 0x89, 0xcc, 0x71, 0x2f, + 0x0c, 0x8d, 0x83, 0xb8, 0xf5, 0xf7, 0xf4, 0xae, + 0x29, 0x9f, 0xe3, 0x7d, 0xb2, 0xf1, 0x1e, 0x85, + 0x76, 0x47, 0xa6, 0xd0, 0x4f, 0xea, 0xb5, 0x5f, + 0xfe, 0x12, 0x2f, 0x8d, 0xf0, 0x9f, 0x9f, 0xc2, + 0x7a, 0x54, 0x98, 0xf4, 0x2a, 0x7f, 0x94, 0xd5, + 0xb4, 0xa8, 0x45, 0xc3, 0xd9, 0xad, 0x11, 0x6e, + 0x09, 0xae, 0x53, 0xa6, 0x5b, 0xef, 0x10, 0x40, + 0x36, 0xe6, 0xec, 0x7f, 0xbf, 0x19, 0x3f, 0xcc, + 0x54, 0x12, 0x5a, 0xea, 0xfa, 0x9c, 0xe1, 0xa4, + 0x86, 0xe2, 0x57, 0xe8, 0x0b, 0xa9, 0x00, 0x7f, + 0x41, 0x58, 0xcb, 0xe3, 0xbf, 0x8a, 0x56, 0xeb, + 0xfe, 0x95, 0xf0, 0xf5, 0x25, 0x23, 0xaf, 0x90, + 0xe7, 0xff, 0x00, 0x8a, 0x6a, 0x85, 0xbe, 0x2e, + 0xf8, 0xca, 0xdd, 0x88, 0xb8, 0xf8, 0x63, 0xa9, + 0xe4, 0x75, 0xdb, 0xe6, 0x81, 0xff, 0x00, 0xa2, + 0x8d, 0x73, 0xbc, 0x0f, 0x36, 0x92, 0x9b, 0x68, + 0xcf, 0xd9, 0x5f, 0x76, 0x7a, 0x37, 0x87, 0xf4, + 0x26, 0xd3, 0x4b, 0x4f, 0x39, 0x06, 0x77, 0x1b, + 0x70, 0x3a, 0x28, 0xff, 0x00, 0x38, 0xab, 0xfa, + 0xe4, 0x9e, 0x56, 0x87, 0x78, 0xfe, 0x91, 0x37, + 0xf2, 0xae, 0x7f, 0xc0, 0xbe, 0x33, 0xbd, 0xf1, + 0x7c, 0x37, 0x8f, 0x7b, 0xe1, 0xdb, 0xbd, 0x1d, + 0xad, 0x8a, 0x28, 0x5b, 0x96, 0x27, 0xcc, 0xdd, + 0x9e, 0x99, 0x55, 0xe9, 0x8f, 0xd6, 0xb5, 0x7c, + 0x57, 0x27, 0x97, 0xe1, 0xab, 0xb3, 0xea, 0xa0, + 0x7e, 0xa2, 0xba, 0x3d, 0x9c, 0x69, 0x52, 0x6a, + 0x25, 0x4d, 0x28, 0x53, 0x76, 0x30, 0xbe, 0x19, + 0x29, 0xfe, 0xcb, 0xd4, 0xe4, 0x3f, 0xc5, 0x7c, + 0x40, 0xfa, 0x08, 0xd3, 0xfc, 0x4d, 0x77, 0x15, + 0xc9, 0x7c, 0x39, 0x4c, 0x78, 0x58, 0xc9, 0xff, + 0x00, 0x3d, 0x2e, 0x65, 0x6f, 0xc9, 0xb6, 0xff, + 0x00, 0x4a, 0xeb, 0x6a, 0xe9, 0x2b, 0x41, 0x13, + 0x86, 0x56, 0xa5, 0x1f, 0x40, 0xa2, 0x8a, 0x2b, + 0x43, 0x70, 0xa2, 0x8a, 0x28, 0x03, 0x9a, 0xd6, + 0xfc, 0x19, 0xa7, 0xeb, 0x57, 0x5f, 0x6b, 0x32, + 0x4d, 0x6d, 0x72, 0xc3, 0x0c, 0xf0, 0xb6, 0x37, + 0xfa, 0x64, 0x1a, 0xc5, 0x7f, 0x86, 0x8d, 0x9f, + 0xdd, 0x6b, 0x73, 0x01, 0xe8, 0xf0, 0xa9, 0xfe, + 0xb5, 0xdf, 0x51, 0x59, 0xca, 0x8c, 0x25, 0xab, + 0x46, 0x12, 0xc3, 0x52, 0x93, 0xbb, 0x89, 0xe7, + 0x4d, 0xf0, 0xeb, 0x53, 0x4f, 0xf5, 0x3a, 0xc4, + 0x4d, 0xfe, 0xf4, 0x24, 0x7f, 0x23, 0x51, 0x7f, + 0xc2, 0x15, 0xe2, 0x78, 0x7f, 0xd5, 0x6a, 0x36, + 0xad, 0xf4, 0x77, 0x5a, 0xf4, 0xac, 0xd1, 0x51, + 0xf5, 0x6a, 0x7d, 0x88, 0x78, 0x3a, 0x7f, 0xd3, + 0x3c, 0xd7, 0xfb, 0x07, 0xc6, 0xd0, 0x0f, 0xdd, + 0xce, 0xaf, 0xfe, 0xed, 0xd1, 0x1f, 0xce, 0x93, + 0xca, 0xf1, 0xec, 0x1f, 0xf2, 0xc6, 0x66, 0xff, + 0x00, 0x76, 0xe1, 0x5a, 0xbd, 0x2e, 0x8a, 0x9f, + 0xab, 0xc1, 0x6c, 0xd8, 0xbe, 0xa9, 0x1e, 0x92, + 0x6b, 0xe6, 0x79, 0x99, 0xd5, 0xbc, 0x6f, 0x6f, + 0xf7, 0xec, 0x6f, 0x1b, 0xe9, 0x12, 0x37, 0xf2, + 0xa3, 0xfe, 0x12, 0xff, 0x00, 0x14, 0x41, 0xfe, + 0xbb, 0x4e, 0xb9, 0x1f, 0xef, 0x5a, 0x1f, 0xe9, + 0x5e, 0x97, 0x9a, 0x5e, 0x29, 0xfb, 0x07, 0xd2, + 0x4c, 0x3e, 0xad, 0x2e, 0x93, 0x67, 0x99, 0x0f, + 0x88, 0xda, 0x8c, 0x47, 0x13, 0x5a, 0x28, 0x3f, + 0xed, 0x42, 0xe2, 0xa6, 0x4f, 0x89, 0xe4, 0x7f, + 0xac, 0xb5, 0x8b, 0xfe, 0xfa, 0x2b, 0xfd, 0x2b, + 0xd1, 0x88, 0x56, 0xea, 0x01, 0xfa, 0xd4, 0x32, + 0x59, 0x5a, 0xcb, 0xfe, 0xb2, 0xda, 0x16, 0xff, + 0x00, 0x79, 0x01, 0xa3, 0xd8, 0xd4, 0x5b, 0x48, + 0x3d, 0x8d, 0x6e, 0x95, 0x3f, 0x03, 0x89, 0x8f, + 0xe2, 0x6d, 0xa9, 0xfb, 0xd6, 0xab, 0xf8, 0x4c, + 0x3f, 0xc2, 0xad, 0x47, 0xf1, 0x1b, 0x4e, 0x7f, + 0xbd, 0x6f, 0x28, 0xff, 0x00, 0x75, 0x94, 0xd7, + 0x44, 0xfa, 0x06, 0x8f, 0x2f, 0xdf, 0xd2, 0xec, + 0xce, 0x7d, 0x61, 0x5f, 0xf0, 0xaa, 0x92, 0xf8, + 0x3b, 0xc3, 0xb2, 0xfd, 0xed, 0x26, 0xdb, 0xfe, + 0x02, 0xbb, 0x7f, 0x95, 0x2e, 0x4a, 0xdd, 0x24, + 0x1c, 0x98, 0x85, 0xb4, 0x97, 0xdc, 0x52, 0x4f, + 0x1e, 0xe9, 0x0d, 0xd5, 0x67, 0x5f, 0xf8, 0x08, + 0x3f, 0xd6, 0xac, 0xa7, 0x8d, 0x74, 0x57, 0xeb, + 0x3b, 0xaf, 0xd6, 0x33, 0x50, 0xbf, 0xc3, 0xff, + 0x00, 0x0d, 0xb7, 0x4b, 0x02, 0x9f, 0xee, 0x4a, + 0xc3, 0xfa, 0xd5, 0x59, 0x3e, 0x1c, 0x68, 0x4d, + 0xf7, 0x1a, 0xf2, 0x3f, 0xf7, 0x27, 0x3f, 0xd6, + 0x8b, 0x57, 0x5d, 0x50, 0x7f, 0xb5, 0x2e, 0xc6, + 0xba, 0x78, 0xaf, 0x45, 0x7e, 0x97, 0xc8, 0x3e, + 0xa0, 0x8a, 0xb0, 0x9a, 0xfe, 0x95, 0x27, 0xdd, + 0xbf, 0x80, 0xff, 0x00, 0xc0, 0xc0, 0xae, 0x62, + 0x4f, 0x86, 0x96, 0x1f, 0xf2, 0xcb, 0x51, 0xbe, + 0x4f, 0xab, 0x06, 0xfe, 0x95, 0x5d, 0xfe, 0x19, + 0xb7, 0x58, 0xb5, 0xc9, 0x80, 0xf4, 0x78, 0x41, + 0xfe, 0xb4, 0x73, 0x57, 0xec, 0x85, 0xcf, 0x89, + 0x5b, 0xc5, 0x7d, 0xe7, 0x6e, 0x9a, 0x95, 0x93, + 0xfd, 0xdb, 0xb8, 0x0f, 0xd2, 0x41, 0x53, 0x2c, + 0xd1, 0x37, 0x2b, 0x22, 0x1f, 0xa1, 0xaf, 0x39, + 0x93, 0xe1, 0xce, 0xa2, 0x99, 0xf2, 0xf5, 0x88, + 0x9b, 0xfd, 0xf8, 0x48, 0xfe, 0xb5, 0x59, 0xfc, + 0x13, 0xaf, 0xc1, 0x92, 0xb7, 0xf6, 0x4c, 0x07, + 0xfb, 0xe3, 0xfa, 0x52, 0xf6, 0xb5, 0x56, 0xf1, + 0xfc, 0x49, 0x78, 0x9a, 0x91, 0xf8, 0xa1, 0xf8, + 0x9e, 0xa3, 0x9c, 0xf7, 0xae, 0x6b, 0xc7, 0x77, + 0x09, 0x6f, 0xe1, 0x89, 0x59, 0x98, 0x00, 0x5d, + 0x41, 0x39, 0xfc, 0x6b, 0x83, 0xb8, 0xb1, 0xd7, + 0xec, 0x4e, 0x3e, 0xd7, 0x06, 0x7f, 0xd9, 0x99, + 0xc7, 0xf4, 0xad, 0xbd, 0x1f, 0xc1, 0x9a, 0x86, + 0xb0, 0xd1, 0x4f, 0xe2, 0x3d, 0x4f, 0xed, 0x36, + 0x68, 0x43, 0xad, 0x9c, 0x4c, 0xc5, 0x5c, 0xf6, + 0xdc, 0x4f, 0xf2, 0xa1, 0x54, 0x75, 0x53, 0x85, + 0xac, 0x4f, 0xd6, 0x5d, 0x6b, 0xd3, 0x51, 0xb3, + 0x67, 0x4b, 0xe0, 0x3b, 0x76, 0xb6, 0xf0, 0x66, + 0x9c, 0x18, 0x10, 0x64, 0x56, 0x9b, 0x9e, 0xb8, + 0x77, 0x2e, 0x3f, 0x46, 0x15, 0xd1, 0xd3, 0x51, + 0x42, 0x28, 0x55, 0x00, 0x00, 0x30, 0x00, 0xed, + 0x4e, 0xae, 0x94, 0xac, 0xac, 0x77, 0x42, 0x3c, + 0xb1, 0x51, 0xec, 0x14, 0x51, 0x45, 0x32, 0x82, + 0x8a, 0x28, 0xa0, 0x0f, 0xff, 0xd9, +}; + +static const uint8_t data_images_mcu_side_by_side_jpg[] = +{ + /* /images/mcu_side-by-side.jpg */ + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x6d, 0x63, 0x75, 0x5f, 0x73, 0x69, 0x64, 0x65, + 0x2d, 0x62, 0x79, 0x2d, 0x73, 0x69, 0x64, 0x65, + 0x2e, 0x6a, 0x70, 0x67, 0x00, + 0xff, 0xd8, 0xff, 0xe1, 0x00, 0x18, 0x45, 0x78, + 0x69, 0x66, 0x00, 0x00, 0x49, 0x49, 0x2a, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x11, + 0x44, 0x75, 0x63, 0x6b, 0x79, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0xff, + 0xe1, 0x03, 0xb4, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, + 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, + 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x00, + 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, + 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, + 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, + 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, + 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, + 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, + 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, + 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, + 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, + 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, + 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, + 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, + 0x65, 0x20, 0x35, 0x2e, 0x30, 0x2d, 0x63, 0x30, + 0x36, 0x30, 0x20, 0x36, 0x31, 0x2e, 0x31, 0x33, + 0x34, 0x37, 0x37, 0x37, 0x2c, 0x20, 0x32, 0x30, + 0x31, 0x30, 0x2f, 0x30, 0x32, 0x2f, 0x31, 0x32, + 0x2d, 0x31, 0x37, 0x3a, 0x33, 0x32, 0x3a, 0x30, + 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, + 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, + 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, + 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, + 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, + 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, + 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, + 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, + 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, + 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, + 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, + 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, + 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, + 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, + 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x64, 0x63, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x70, 0x75, 0x72, 0x6c, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x64, 0x63, 0x2f, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x31, 0x2e, 0x31, + 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, + 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, + 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, + 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, + 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, + 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x42, 0x45, + 0x43, 0x38, 0x43, 0x41, 0x39, 0x45, 0x32, 0x36, + 0x44, 0x43, 0x31, 0x31, 0x45, 0x33, 0x41, 0x39, + 0x46, 0x38, 0x45, 0x44, 0x36, 0x42, 0x43, 0x36, + 0x32, 0x38, 0x31, 0x30, 0x38, 0x41, 0x22, 0x20, + 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, + 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, + 0x64, 0x3a, 0x42, 0x45, 0x43, 0x38, 0x43, 0x41, + 0x39, 0x46, 0x32, 0x36, 0x44, 0x43, 0x31, 0x31, + 0x45, 0x33, 0x41, 0x39, 0x46, 0x38, 0x45, 0x44, + 0x36, 0x42, 0x43, 0x36, 0x32, 0x38, 0x31, 0x30, + 0x38, 0x41, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, + 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, + 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x53, 0x35, + 0x20, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, + 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, + 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, + 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, + 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, + 0x75, 0x75, 0x69, 0x64, 0x3a, 0x66, 0x61, 0x66, + 0x35, 0x62, 0x64, 0x64, 0x35, 0x2d, 0x62, 0x61, + 0x33, 0x64, 0x2d, 0x31, 0x31, 0x64, 0x61, 0x2d, + 0x61, 0x64, 0x33, 0x31, 0x2d, 0x64, 0x33, 0x33, + 0x64, 0x37, 0x35, 0x31, 0x38, 0x32, 0x66, 0x31, + 0x62, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, + 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, + 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x42, 0x45, 0x43, + 0x38, 0x43, 0x41, 0x39, 0x44, 0x32, 0x36, 0x44, + 0x43, 0x31, 0x31, 0x45, 0x33, 0x41, 0x39, 0x46, + 0x38, 0x45, 0x44, 0x36, 0x42, 0x43, 0x36, 0x32, + 0x38, 0x31, 0x30, 0x38, 0x41, 0x22, 0x2f, 0x3e, + 0x20, 0x3c, 0x64, 0x63, 0x3a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x6f, 0x72, 0x3e, 0x20, 0x3c, 0x72, + 0x64, 0x66, 0x3a, 0x53, 0x65, 0x71, 0x3e, 0x20, + 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, 0x3e, + 0x48, 0x61, 0x75, 0x67, 0x6c, 0x69, 0x65, 0x3c, + 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, 0x3e, + 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, + 0x3e, 0x4a, 0x6f, 0x65, 0x3c, 0x2f, 0x72, 0x64, + 0x66, 0x3a, 0x6c, 0x69, 0x3e, 0x20, 0x3c, 0x2f, + 0x72, 0x64, 0x66, 0x3a, 0x53, 0x65, 0x71, 0x3e, + 0x20, 0x3c, 0x2f, 0x64, 0x63, 0x3a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3e, 0x20, 0x3c, + 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, + 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, + 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, + 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, + 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xff, 0xed, 0x00, + 0x48, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, + 0x6f, 0x70, 0x20, 0x33, 0x2e, 0x30, 0x00, 0x38, + 0x42, 0x49, 0x4d, 0x04, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x1c, 0x01, 0x5a, 0x00, 0x03, + 0x1b, 0x25, 0x47, 0x1c, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xfc, + 0xe1, 0x1f, 0x89, 0xc8, 0xb7, 0xc9, 0x78, 0x2f, + 0x34, 0x62, 0x34, 0x07, 0x58, 0x77, 0xeb, 0xff, + 0xee, 0x00, 0x0e, 0x41, 0x64, 0x6f, 0x62, 0x65, + 0x00, 0x64, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, + 0xdb, 0x00, 0x84, 0x00, 0x0c, 0x08, 0x08, 0x08, + 0x09, 0x08, 0x0c, 0x09, 0x09, 0x0c, 0x11, 0x0b, + 0x0a, 0x0b, 0x11, 0x15, 0x0f, 0x0c, 0x0c, 0x0f, + 0x15, 0x18, 0x13, 0x13, 0x15, 0x13, 0x13, 0x18, + 0x17, 0x12, 0x14, 0x14, 0x14, 0x14, 0x12, 0x17, + 0x17, 0x1b, 0x1c, 0x1e, 0x1c, 0x1b, 0x17, 0x24, + 0x24, 0x27, 0x27, 0x24, 0x24, 0x35, 0x33, 0x33, + 0x33, 0x35, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x01, 0x0d, 0x0b, 0x0b, + 0x0d, 0x0e, 0x0d, 0x10, 0x0e, 0x0e, 0x10, 0x14, + 0x0e, 0x0f, 0x0e, 0x14, 0x14, 0x10, 0x11, 0x11, + 0x10, 0x14, 0x1d, 0x14, 0x14, 0x15, 0x14, 0x14, + 0x1d, 0x25, 0x1a, 0x17, 0x17, 0x17, 0x17, 0x1a, + 0x25, 0x20, 0x23, 0x1e, 0x1e, 0x1e, 0x23, 0x20, + 0x28, 0x28, 0x25, 0x25, 0x28, 0x28, 0x32, 0x32, + 0x30, 0x32, 0x32, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xff, 0xc0, 0x00, + 0x11, 0x08, 0x02, 0xb7, 0x05, 0x00, 0x03, 0x01, + 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, + 0xff, 0xc4, 0x00, 0xc5, 0x00, 0x01, 0x00, 0x02, + 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, + 0x03, 0x04, 0x07, 0x01, 0x02, 0x08, 0x01, 0x01, + 0x00, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x10, 0x00, + 0x01, 0x03, 0x03, 0x01, 0x03, 0x03, 0x0d, 0x0c, + 0x09, 0x04, 0x01, 0x03, 0x03, 0x02, 0x07, 0x01, + 0x00, 0x02, 0x03, 0x11, 0x04, 0x05, 0x06, 0x21, + 0x31, 0x12, 0x41, 0x71, 0x13, 0x51, 0x61, 0x91, + 0xb1, 0x22, 0x32, 0x72, 0xb2, 0x73, 0x14, 0x34, + 0x35, 0x07, 0x81, 0xa1, 0xc1, 0x42, 0x82, 0xc2, + 0xd2, 0x33, 0xb3, 0x54, 0x15, 0x16, 0x52, 0x62, + 0x92, 0xa2, 0x23, 0x83, 0x55, 0x36, 0x37, 0xd1, + 0x53, 0x93, 0x17, 0x74, 0x43, 0x63, 0x24, 0xe1, + 0xc3, 0x25, 0xa3, 0x75, 0x56, 0xf1, 0xe2, 0x64, + 0x84, 0x26, 0x44, 0x11, 0x01, 0x00, 0x01, 0x02, + 0x01, 0x08, 0x03, 0x0d, 0x08, 0x03, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, + 0x04, 0x11, 0x31, 0x71, 0xb1, 0x32, 0x72, 0x33, + 0x34, 0x21, 0x51, 0x61, 0x41, 0x81, 0x91, 0xa1, + 0x12, 0x82, 0x92, 0x73, 0x14, 0x24, 0x05, 0x15, + 0x25, 0xf0, 0xc1, 0x62, 0xa2, 0xb2, 0x13, 0x74, + 0x35, 0x52, 0x23, 0xa3, 0x22, 0x42, 0xf1, 0xff, + 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, + 0x03, 0x11, 0x00, 0x3f, 0x00, 0xea, 0xa8, 0x88, + 0x80, 0xb5, 0x72, 0x1b, 0x2c, 0xae, 0x7c, 0x9b, + 0xfc, 0x52, 0xb6, 0x96, 0xae, 0x43, 0xd0, 0xae, + 0x7c, 0x93, 0xfc, 0x52, 0xa6, 0x9c, 0xf0, 0xad, + 0xcd, 0x8a, 0xb4, 0x4e, 0xa5, 0x3f, 0x1b, 0x8c, + 0xba, 0xc8, 0xb1, 0xef, 0x8e, 0x70, 0xc1, 0x19, + 0x00, 0xf1, 0x17, 0x6d, 0xa8, 0xaf, 0x22, 0xdc, + 0xfc, 0xb3, 0x90, 0xfb, 0xd3, 0x7b, 0x2e, 0x59, + 0xf4, 0x9f, 0xa3, 0xdc, 0x78, 0x6d, 0xf1, 0x54, + 0xf2, 0xe9, 0xbb, 0x7e, 0xba, 0x6e, 0x4c, 0x44, + 0xc6, 0x48, 0xec, 0x79, 0xf8, 0x4c, 0x15, 0x9b, + 0x96, 0x28, 0xae, 0xa8, 0x99, 0xaa, 0x63, 0xa7, + 0xff, 0x00, 0x53, 0xd6, 0xad, 0x7e, 0x58, 0xc8, + 0x7d, 0xe5, 0xbd, 0x97, 0x27, 0xe5, 0x8c, 0x87, + 0xde, 0x5b, 0xd9, 0x72, 0xb2, 0xa2, 0xcf, 0xda, + 0x6e, 0x75, 0xc7, 0x81, 0xbf, 0xcb, 0xf0, 0xfd, + 0x55, 0x7a, 0x52, 0xad, 0x7e, 0x58, 0xc8, 0x7d, + 0xe5, 0xbd, 0x97, 0x27, 0xe5, 0x8c, 0x87, 0xde, + 0x5b, 0xd9, 0x72, 0xb2, 0xa2, 0x7b, 0x4d, 0xce, + 0xb8, 0xf0, 0x1f, 0x2f, 0xc3, 0xf5, 0x55, 0xe9, + 0x4a, 0xb5, 0xf9, 0x63, 0x21, 0xf7, 0x96, 0xf6, + 0x5c, 0x9f, 0x96, 0x32, 0x1f, 0x79, 0x6f, 0x65, + 0xca, 0xca, 0x89, 0xed, 0x37, 0x3a, 0xe3, 0xc0, + 0x7c, 0xbf, 0x0f, 0xd5, 0x57, 0xa5, 0x2a, 0xd7, + 0xe5, 0x8c, 0x87, 0xde, 0x5b, 0xd9, 0x72, 0x7e, + 0x58, 0xc8, 0x7d, 0xe5, 0xbd, 0x97, 0x2b, 0x2a, + 0x27, 0xb4, 0xdc, 0xeb, 0x8f, 0x01, 0xf2, 0xfc, + 0x3f, 0x55, 0x5e, 0x94, 0xab, 0x5f, 0x96, 0x32, + 0x1f, 0x79, 0x6f, 0x65, 0xc9, 0xf9, 0x63, 0x21, + 0xf7, 0x96, 0xf6, 0x5c, 0xac, 0xa8, 0x9e, 0xd3, + 0x73, 0xae, 0x3c, 0x07, 0xcb, 0xf0, 0xfd, 0x55, + 0x7a, 0x52, 0xad, 0x7e, 0x58, 0xc8, 0x7d, 0xe5, + 0xbd, 0x97, 0x27, 0xe5, 0x8c, 0x87, 0xde, 0x5b, + 0xd9, 0x72, 0xb2, 0xa2, 0x7b, 0x4d, 0xce, 0xb8, + 0xf0, 0x1f, 0x2f, 0xc3, 0xf5, 0x55, 0xe9, 0x4a, + 0xb5, 0xf9, 0x63, 0x21, 0xf7, 0x96, 0xf6, 0x5c, + 0x9f, 0x96, 0x32, 0x1f, 0x79, 0x6f, 0x65, 0xca, + 0xca, 0x89, 0xed, 0x37, 0x3a, 0xe3, 0xc0, 0x7c, + 0xbf, 0x0f, 0xd5, 0x57, 0xa5, 0x2a, 0xd7, 0xe5, + 0x8c, 0x87, 0xde, 0x5b, 0xd9, 0x72, 0x7e, 0x58, + 0xc8, 0x7d, 0xe5, 0xbd, 0x97, 0x2b, 0x2a, 0x27, + 0xb4, 0xdc, 0xeb, 0x8f, 0x01, 0xf2, 0xfc, 0x3f, + 0x55, 0x5e, 0x94, 0xab, 0x5f, 0x96, 0x32, 0x1f, + 0x79, 0x6f, 0x65, 0xc9, 0xf9, 0x63, 0x21, 0xf7, + 0x96, 0xf6, 0x5c, 0xac, 0xa8, 0x9e, 0xd3, 0x73, + 0xae, 0x3c, 0x07, 0xcb, 0xf0, 0xfd, 0x55, 0x7a, + 0x52, 0xad, 0x7e, 0x58, 0xc8, 0x7d, 0xe5, 0xbd, + 0x97, 0x27, 0xe5, 0x8c, 0x87, 0xde, 0x5b, 0xd9, + 0x72, 0xb2, 0xa2, 0x7b, 0x4d, 0xce, 0xb8, 0xf0, + 0x1f, 0x2f, 0xc3, 0xf5, 0x55, 0xe9, 0x4a, 0xb5, + 0xf9, 0x63, 0x21, 0xf7, 0x96, 0xf6, 0x5c, 0x9f, + 0x96, 0x32, 0x1f, 0x79, 0x6f, 0x65, 0xca, 0xca, + 0x89, 0xed, 0x37, 0x3a, 0xe3, 0xc0, 0x7c, 0xbf, + 0x0f, 0xd5, 0x57, 0xa5, 0x2a, 0xd7, 0xe5, 0x8c, + 0x87, 0xde, 0x5b, 0xd9, 0x72, 0x7e, 0x58, 0xc8, + 0x7d, 0xe5, 0xbd, 0x97, 0x2b, 0x2a, 0x27, 0xb4, + 0xdc, 0xeb, 0x8f, 0x01, 0xf2, 0xfc, 0x3f, 0x55, + 0x5e, 0x94, 0xab, 0x5f, 0x96, 0x32, 0x1f, 0x79, + 0x6f, 0x65, 0xc9, 0xf9, 0x63, 0x21, 0xf7, 0x96, + 0xf6, 0x5c, 0xac, 0xa8, 0x9e, 0xd3, 0x73, 0xae, + 0x3c, 0x07, 0xcb, 0xf0, 0xfd, 0x55, 0x7a, 0x52, + 0xad, 0x7e, 0x58, 0xc8, 0x7d, 0xe5, 0xbd, 0x97, + 0x27, 0xe5, 0x8c, 0x87, 0xde, 0x5b, 0xd9, 0x72, + 0xb2, 0xa2, 0x7b, 0x4d, 0xce, 0xb8, 0xf0, 0x1f, + 0x2f, 0xc3, 0xf5, 0x55, 0xe9, 0x4a, 0xb5, 0xf9, + 0x63, 0x21, 0xf7, 0x96, 0xf6, 0x5c, 0x9f, 0x96, + 0x32, 0x1f, 0x79, 0x6f, 0x65, 0xca, 0xca, 0x89, + 0xed, 0x37, 0x3a, 0xe3, 0xc0, 0x7c, 0xbf, 0x0f, + 0xd5, 0x57, 0xa5, 0x2a, 0xd7, 0xe5, 0x8c, 0x87, + 0xde, 0x5b, 0xd9, 0x72, 0x7e, 0x58, 0xc8, 0x7d, + 0xe5, 0xbd, 0x97, 0x2b, 0x2a, 0x27, 0xb4, 0xdc, + 0xeb, 0x8f, 0x01, 0xf2, 0xfc, 0x3f, 0x55, 0x5e, + 0x94, 0xab, 0x5f, 0x96, 0x32, 0x1f, 0x79, 0x6f, + 0x65, 0xcb, 0x0d, 0xee, 0x0e, 0xf6, 0xce, 0xd9, + 0xf7, 0x0f, 0xb8, 0x0e, 0x6b, 0x29, 0x50, 0xd2, + 0xea, 0xed, 0x34, 0xe5, 0x56, 0xb5, 0x1f, 0xa8, + 0x3d, 0x53, 0x3f, 0xc9, 0xf1, 0x82, 0xb5, 0x17, + 0xee, 0x4d, 0x51, 0x13, 0x31, 0xd3, 0x3d, 0x4c, + 0xef, 0x60, 0x6c, 0x53, 0x6a, 0xba, 0xa2, 0x2a, + 0xcb, 0x4d, 0x35, 0x4c, 0x7f, 0xea, 0x7b, 0x90, + 0xfa, 0xd2, 0xc4, 0x9c, 0x4b, 0x09, 0x24, 0x9e, + 0x37, 0xef, 0xe7, 0x52, 0xaf, 0xdc, 0xa2, 0x74, + 0xaf, 0xaa, 0x1b, 0xe1, 0xbf, 0xb6, 0xa5, 0x9f, + 0xb9, 0x67, 0x77, 0x8b, 0x5e, 0xf4, 0xba, 0x70, + 0xdc, 0x0b, 0x7b, 0x90, 0xe5, 0xba, 0x8e, 0xd6, + 0xe2, 0xff, 0x00, 0x5b, 0xdc, 0x58, 0x43, 0x29, + 0x8d, 0xf3, 0xbd, 0x8d, 0x69, 0x24, 0x86, 0x8f, + 0xe1, 0x34, 0xf2, 0x2d, 0xa1, 0xec, 0xf3, 0x39, + 0xf7, 0xf8, 0xbb, 0x32, 0x7f, 0xa2, 0xfa, 0xba, + 0xff, 0x00, 0x27, 0x8f, 0x2a, 0xcf, 0xb1, 0x0a, + 0xfe, 0xb8, 0x6d, 0xda, 0xa2, 0xb9, 0xae, 0x6a, + 0x8c, 0xbf, 0xfa, 0x98, 0xce, 0xfa, 0x3c, 0x66, + 0x3e, 0xfe, 0x1a, 0xde, 0x16, 0x8b, 0x33, 0x4d, + 0x34, 0xd5, 0x87, 0xb7, 0x54, 0xe5, 0xa6, 0x27, + 0xa7, 0x37, 0x75, 0xcf, 0xff, 0x00, 0xeb, 0xcc, + 0xdf, 0xdf, 0xe2, 0xec, 0xc9, 0xf4, 0x53, 0xfe, + 0xbc, 0xcd, 0xfd, 0xfe, 0x2e, 0xcc, 0x9f, 0x45, + 0x74, 0x04, 0x5a, 0x7b, 0x35, 0xae, 0xa9, 0xf0, + 0xb8, 0xfe, 0x73, 0x8d, 0xff, 0x00, 0x3a, 0x7d, + 0x0a, 0x5c, 0xff, 0x00, 0xfe, 0xbc, 0xcd, 0xfd, + 0xfe, 0x2e, 0xcc, 0x9f, 0x45, 0x3f, 0xeb, 0xcc, + 0xdf, 0xdf, 0xe2, 0xec, 0xc9, 0xf4, 0x57, 0x40, + 0x44, 0xf6, 0x6b, 0x5d, 0x53, 0xe1, 0x3e, 0x73, + 0x8d, 0xff, 0x00, 0x3a, 0x7d, 0x0a, 0x5c, 0xff, + 0x00, 0xfe, 0xbc, 0xcd, 0xfd, 0xfe, 0x2e, 0xcc, + 0x9f, 0x45, 0x3f, 0xeb, 0xcc, 0xdf, 0xdf, 0xe2, + 0xec, 0xc9, 0xf4, 0x57, 0x40, 0x44, 0xf6, 0x6b, + 0x5d, 0x53, 0xe1, 0x3e, 0x73, 0x8d, 0xff, 0x00, + 0x3a, 0x7d, 0x0a, 0x5c, 0xff, 0x00, 0xfe, 0xbc, + 0xcd, 0xfd, 0xfe, 0x2e, 0xcc, 0x9f, 0x45, 0x3f, + 0xeb, 0xcc, 0xdf, 0xdf, 0xe2, 0xec, 0xc9, 0xf4, + 0x57, 0x40, 0x44, 0xf6, 0x6b, 0x5d, 0x53, 0xe1, + 0x3e, 0x73, 0x8d, 0xff, 0x00, 0x3a, 0x7d, 0x0a, + 0x5c, 0xff, 0x00, 0xfe, 0xbc, 0xcd, 0xfd, 0xfe, + 0x2e, 0xcc, 0x9f, 0x45, 0x3f, 0xeb, 0xcc, 0xdf, + 0xdf, 0xe2, 0xec, 0xc9, 0xf4, 0x57, 0x40, 0x44, + 0xf6, 0x6b, 0x5d, 0x53, 0xe1, 0x3e, 0x73, 0x8d, + 0xff, 0x00, 0x3a, 0x7d, 0x0a, 0x5c, 0xff, 0x00, + 0xfe, 0xbc, 0xcd, 0xfd, 0xfe, 0x2e, 0xcc, 0x9f, + 0x45, 0x3f, 0xeb, 0xcc, 0xdf, 0xdf, 0xe2, 0xec, + 0xc9, 0xf4, 0x57, 0x40, 0x44, 0xf6, 0x6b, 0x5d, + 0x53, 0xe1, 0x3e, 0x73, 0x8d, 0xff, 0x00, 0x3a, + 0x7d, 0x0a, 0x5c, 0xff, 0x00, 0xfe, 0xbc, 0xcd, + 0xfd, 0xfe, 0x2e, 0xcc, 0x9f, 0x45, 0x3f, 0xeb, + 0xcc, 0xdf, 0xdf, 0xe2, 0xec, 0xc9, 0xf4, 0x57, + 0x40, 0x44, 0xf6, 0x6b, 0x5d, 0x53, 0xe1, 0x3e, + 0x73, 0x8d, 0xff, 0x00, 0x3a, 0x7d, 0x0a, 0x5c, + 0xff, 0x00, 0xfe, 0xbc, 0xcd, 0xfd, 0xfe, 0x2e, + 0xcc, 0x9f, 0x45, 0x3f, 0xeb, 0xcc, 0xdf, 0xdf, + 0xe2, 0xec, 0xc9, 0xf4, 0x57, 0x40, 0x44, 0xf6, + 0x6b, 0x5d, 0x53, 0xe1, 0x3e, 0x73, 0x8d, 0xff, + 0x00, 0x3a, 0x7d, 0x0a, 0x5c, 0xff, 0x00, 0xfe, + 0xbc, 0xcd, 0xfd, 0xfe, 0x2e, 0xcc, 0x9f, 0x45, + 0x3f, 0xeb, 0xcc, 0xdf, 0xdf, 0xe2, 0xec, 0xc9, + 0xf4, 0x57, 0x40, 0x44, 0xf6, 0x6b, 0x5d, 0x53, + 0xe1, 0x3e, 0x73, 0x8d, 0xff, 0x00, 0x3a, 0x7d, + 0x0a, 0x5c, 0xff, 0x00, 0xfe, 0xbc, 0xcd, 0xfd, + 0xfe, 0x2e, 0xcc, 0x9f, 0x45, 0x3f, 0xeb, 0xcc, + 0xdf, 0xdf, 0xe2, 0xec, 0xc9, 0xf4, 0x57, 0x40, + 0x44, 0xf6, 0x6b, 0x5d, 0x53, 0xe1, 0x3e, 0x73, + 0x8d, 0xff, 0x00, 0x3a, 0x7d, 0x0a, 0x5c, 0xff, + 0x00, 0xfe, 0xbc, 0xcd, 0xfd, 0xfe, 0x2e, 0xcc, + 0x9f, 0x45, 0x3f, 0xeb, 0xcc, 0xdf, 0xdf, 0xe2, + 0xec, 0xc9, 0xf4, 0x57, 0x40, 0x44, 0xf6, 0x6b, + 0x5d, 0x53, 0xe1, 0x3e, 0x73, 0x8d, 0xff, 0x00, + 0x3a, 0x7d, 0x0a, 0x5c, 0xff, 0x00, 0xfe, 0xbc, + 0xcd, 0xfd, 0xfe, 0x2e, 0xcc, 0x9f, 0x45, 0x3f, + 0xeb, 0xcc, 0xdf, 0xdf, 0xe2, 0xec, 0xc9, 0xf4, + 0x57, 0x40, 0x44, 0xf6, 0x6b, 0x5d, 0x53, 0xe1, + 0x3e, 0x73, 0x8d, 0xff, 0x00, 0x3a, 0x7d, 0x0a, + 0x5c, 0xff, 0x00, 0xfe, 0xbc, 0xcd, 0xfd, 0xfe, + 0x2e, 0xcc, 0x9f, 0x45, 0x3f, 0xeb, 0xcc, 0xdf, + 0xdf, 0xe2, 0xec, 0xc9, 0xf4, 0x57, 0x40, 0x44, + 0xf6, 0x6b, 0x5d, 0x53, 0xe1, 0x3e, 0x73, 0x8d, + 0xff, 0x00, 0x3a, 0x7d, 0x0a, 0x5c, 0xff, 0x00, + 0xfe, 0xbc, 0xcd, 0xfd, 0xfe, 0x2e, 0xcc, 0x9f, + 0x45, 0x3f, 0xeb, 0xcc, 0xdf, 0xdf, 0xe2, 0xec, + 0xc9, 0xf4, 0x57, 0x40, 0x44, 0xf6, 0x6b, 0x5d, + 0x53, 0xe1, 0x3e, 0x73, 0x8d, 0xff, 0x00, 0x3a, + 0x7d, 0x0a, 0x5c, 0xff, 0x00, 0xfe, 0xbc, 0xcd, + 0xfd, 0xfe, 0x2e, 0xcc, 0x9f, 0x45, 0x3f, 0xeb, + 0xcc, 0xdf, 0xdf, 0xe2, 0xec, 0xc9, 0xf4, 0x57, + 0x40, 0x44, 0xf6, 0x6b, 0x5d, 0x53, 0xe1, 0x3e, + 0x73, 0x8d, 0xff, 0x00, 0x3a, 0x7d, 0x0a, 0x5c, + 0xff, 0x00, 0xfe, 0xbc, 0xcd, 0xfd, 0xfe, 0x2e, + 0xcc, 0x9f, 0x45, 0x3f, 0xeb, 0xcc, 0xdf, 0xdf, + 0xe2, 0xec, 0xc9, 0xf4, 0x57, 0x40, 0x44, 0xf6, + 0x6b, 0x5d, 0x53, 0xe1, 0x3e, 0x73, 0x8d, 0xff, + 0x00, 0x3a, 0x7d, 0x0a, 0x5c, 0xff, 0x00, 0xfe, + 0xbc, 0xcd, 0xfd, 0xfe, 0x2e, 0xcc, 0x9f, 0x45, + 0x3f, 0xeb, 0xbc, 0xd9, 0xd9, 0xe7, 0xf1, 0x76, + 0x64, 0xff, 0x00, 0x45, 0xd0, 0x10, 0x6f, 0x09, + 0xec, 0xd6, 0xba, 0xa7, 0xc2, 0x7c, 0xe7, 0x1b, + 0xfe, 0x74, 0xfa, 0x14, 0xb9, 0xe6, 0x81, 0x64, + 0xb0, 0xea, 0xa9, 0xad, 0xe4, 0x79, 0x79, 0x86, + 0x39, 0x98, 0x4d, 0x49, 0x04, 0xb1, 0xcd, 0x6d, + 0x45, 0x57, 0x4c, 0x5c, 0xdf, 0x46, 0xff, 0x00, + 0x7c, 0x5f, 0x73, 0x5c, 0x7d, 0xa0, 0x5d, 0x21, + 0x30, 0xdb, 0x1e, 0x74, 0xad, 0xf1, 0xa9, 0xcb, + 0x8a, 0x89, 0xeb, 0xb5, 0x6e, 0x67, 0x27, 0x5e, + 0x44, 0x5e, 0x68, 0x91, 0x04, 0x74, 0x34, 0xee, + 0xcf, 0x68, 0xad, 0x48, 0xf1, 0xd7, 0x12, 0x46, + 0xd9, 0x04, 0x80, 0x07, 0x0a, 0x8d, 0xeb, 0x6f, + 0x37, 0xf5, 0x31, 0xf8, 0x7f, 0x01, 0x59, 0xad, + 0x3d, 0x1a, 0x2f, 0x04, 0x76, 0x97, 0x97, 0x5e, + 0x1a, 0xde, 0x27, 0xe2, 0x37, 0xa9, 0xbb, 0x96, + 0x62, 0x9b, 0x74, 0x4c, 0x64, 0x99, 0x8e, 0x9e, + 0xf3, 0x9a, 0x9b, 0xb5, 0x5b, 0xc3, 0xd1, 0x34, + 0xe4, 0xcb, 0x35, 0x4c, 0x74, 0xc6, 0x56, 0x87, + 0xe1, 0x57, 0x3f, 0xee, 0x8f, 0x7d, 0x3f, 0x0a, + 0xb9, 0xff, 0x00, 0x74, 0x7b, 0xea, 0x51, 0x17, + 0x47, 0xc9, 0xb0, 0x7d, 0x55, 0xfa, 0x72, 0xaf, + 0xb5, 0xdd, 0xec, 0xf4, 0x51, 0x7f, 0x85, 0x5c, + 0xff, 0x00, 0xba, 0x3d, 0xf4, 0xfc, 0x2a, 0xe7, + 0xfd, 0xd1, 0xef, 0xa9, 0x44, 0x4f, 0x93, 0x60, + 0xfa, 0xab, 0xf4, 0xe4, 0xf6, 0xbb, 0xbd, 0x9e, + 0x04, 0x5f, 0xe1, 0x57, 0x3f, 0xee, 0x8f, 0x7d, + 0x3f, 0x0a, 0xb9, 0xff, 0x00, 0x74, 0x7b, 0xea, + 0x51, 0x13, 0xe4, 0xd8, 0x3e, 0xaa, 0xfd, 0x39, + 0x3d, 0xae, 0xef, 0x67, 0x81, 0x17, 0xf8, 0x55, + 0xcf, 0xfb, 0xa3, 0xdf, 0x4f, 0xc2, 0xae, 0x7f, + 0xdd, 0x1e, 0xfa, 0x94, 0x44, 0xf9, 0x36, 0x0f, + 0xaa, 0xbf, 0x4e, 0x4f, 0x6b, 0xbb, 0xd9, 0xe0, + 0x45, 0xfe, 0x15, 0x73, 0xfe, 0xe8, 0xf7, 0xd3, + 0xf0, 0xab, 0x9f, 0xf7, 0x47, 0xbe, 0xa5, 0x11, + 0x3e, 0x4d, 0x83, 0xea, 0xaf, 0xd3, 0x93, 0xda, + 0xee, 0xf6, 0x78, 0x11, 0x7f, 0x85, 0x5c, 0xff, + 0x00, 0xba, 0x3d, 0xf4, 0xfc, 0x2a, 0xe7, 0xfd, + 0xd1, 0xef, 0xa9, 0x44, 0x4f, 0x93, 0x60, 0xfa, + 0xab, 0xf4, 0xe4, 0xf6, 0xbb, 0xbd, 0x9e, 0x04, + 0x5f, 0xe1, 0x57, 0x3f, 0xee, 0x8f, 0x7d, 0x3f, + 0x0a, 0xb9, 0xff, 0x00, 0x74, 0x7b, 0xea, 0x51, + 0x13, 0xe4, 0xd8, 0x3e, 0xaa, 0xfd, 0x39, 0x3d, + 0xae, 0xef, 0x67, 0x81, 0x17, 0xf8, 0x55, 0xcf, + 0xfb, 0xa3, 0xdf, 0x4f, 0xc2, 0xae, 0x7f, 0xdd, + 0x1e, 0xfa, 0x94, 0x44, 0xf9, 0x36, 0x0f, 0xaa, + 0xbf, 0x4e, 0x4f, 0x6b, 0xbb, 0xd9, 0xe0, 0x45, + 0xfe, 0x15, 0x73, 0xfe, 0xe8, 0xf7, 0xd3, 0xf0, + 0xab, 0x9f, 0xf7, 0x47, 0xbe, 0xa5, 0x11, 0x3e, + 0x4d, 0x83, 0xea, 0xaf, 0xd3, 0x93, 0xda, 0xee, + 0xf6, 0x78, 0x11, 0x7f, 0x85, 0x5c, 0xff, 0x00, + 0xba, 0x3d, 0xf4, 0xfc, 0x2a, 0xe7, 0xfd, 0xd1, + 0xef, 0xa9, 0x44, 0x4f, 0x93, 0x60, 0xfa, 0xab, + 0xf4, 0xe4, 0xf6, 0xbb, 0xbd, 0x9e, 0x04, 0x5f, + 0xe1, 0x57, 0x3f, 0xee, 0x8f, 0x7d, 0x3f, 0x0a, + 0xb9, 0xff, 0x00, 0x74, 0x7b, 0xea, 0x51, 0x13, + 0xe4, 0xd8, 0x3e, 0xaa, 0xfd, 0x39, 0x3d, 0xae, + 0xef, 0x67, 0x81, 0x17, 0xf8, 0x55, 0xcf, 0xfb, + 0xa3, 0xdf, 0x4f, 0xc2, 0xae, 0x7f, 0xdd, 0x1e, + 0xfa, 0x94, 0x44, 0xf9, 0x36, 0x0f, 0xaa, 0xbf, + 0x4e, 0x4f, 0x6b, 0xbb, 0xd9, 0xe0, 0x45, 0xfe, + 0x15, 0x73, 0xfe, 0xe8, 0xf7, 0xd3, 0xf0, 0xab, + 0x9f, 0xf7, 0x47, 0xbe, 0xa5, 0x11, 0x3e, 0x4d, + 0x83, 0xea, 0xaf, 0xd3, 0x93, 0xda, 0xee, 0xf6, + 0x78, 0x11, 0x7f, 0x85, 0x5c, 0xff, 0x00, 0xba, + 0x3d, 0xf4, 0xfc, 0x2a, 0xe7, 0xfd, 0xd1, 0xef, + 0xa9, 0x44, 0x4f, 0x93, 0x60, 0xfa, 0xab, 0xf4, + 0xe4, 0xf6, 0xbb, 0xbd, 0x9e, 0x04, 0x5f, 0xe1, + 0x57, 0x3f, 0xee, 0x8f, 0x7d, 0x3f, 0x0a, 0xb9, + 0xff, 0x00, 0x74, 0x7b, 0xea, 0x51, 0x13, 0xe4, + 0xd8, 0x3e, 0xaa, 0xfd, 0x39, 0x3d, 0xae, 0xef, + 0x67, 0x81, 0x17, 0xf8, 0x55, 0xcf, 0xfb, 0xa3, + 0xdf, 0x4f, 0xc2, 0xae, 0x7f, 0xdd, 0x1e, 0xfa, + 0x94, 0x44, 0xf9, 0x36, 0x0f, 0xaa, 0xbf, 0x4e, + 0x4f, 0x6b, 0xbb, 0xd9, 0xe0, 0x45, 0xfe, 0x15, + 0x73, 0xfe, 0xe8, 0xf7, 0xd3, 0xf0, 0xab, 0x9f, + 0xf7, 0x47, 0xbe, 0xa5, 0x11, 0x3e, 0x4d, 0x83, + 0xea, 0xaf, 0xd3, 0x93, 0xda, 0xee, 0xf6, 0x78, + 0x10, 0x97, 0x36, 0xf2, 0xdb, 0x3d, 0x8d, 0x73, + 0xea, 0x5d, 0xb7, 0x61, 0x2a, 0xc4, 0xce, 0xf4, + 0x73, 0x28, 0x5c, 0xb7, 0xd7, 0x43, 0xcc, 0x7b, + 0x6a, 0x6d, 0xbd, 0xe8, 0xe6, 0x54, 0xf8, 0x6d, + 0xaa, 0x6d, 0x62, 0xb1, 0x96, 0xe8, 0xcb, 0xe4, + 0xd1, 0xfb, 0x51, 0x19, 0x67, 0x2f, 0x72, 0x53, + 0x88, 0xaa, 0x6a, 0xb7, 0x6a, 0xa9, 0xcf, 0x3e, + 0x56, 0x56, 0x1b, 0xbf, 0x45, 0x9b, 0xc9, 0xbb, + 0xc5, 0x2b, 0x9d, 0xe1, 0xb0, 0xf7, 0xb9, 0x71, + 0x2f, 0x43, 0x70, 0x23, 0xe8, 0x78, 0x78, 0xb8, + 0xcb, 0xb6, 0xf1, 0x57, 0x75, 0x39, 0x97, 0x44, + 0xbc, 0xf4, 0x59, 0xbc, 0x9b, 0xfc, 0x52, 0xaa, + 0x5a, 0x13, 0x75, 0xe7, 0xf2, 0xbe, 0x7a, 0xf6, + 0x68, 0x9c, 0x94, 0xd5, 0x31, 0xd8, 0xf3, 0xae, + 0xd3, 0x15, 0x5c, 0xb7, 0x4c, 0xe6, 0x9c, 0xac, + 0x5f, 0x92, 0xf2, 0x9f, 0x7c, 0x67, 0xef, 0xa7, + 0xe4, 0xbc, 0xa7, 0xdf, 0x19, 0xfb, 0xea, 0xe0, + 0x8a, 0x3f, 0x76, 0xbe, 0xcf, 0x02, 0xde, 0xcd, + 0x6b, 0xaa, 0x7c, 0x2a, 0x7f, 0xe4, 0xbc, 0xa7, + 0xdf, 0x19, 0xfb, 0xe9, 0xf9, 0x2f, 0x29, 0xf7, + 0xc6, 0x7e, 0xfa, 0xb8, 0x22, 0x7e, 0xed, 0x7d, + 0x9e, 0x03, 0xd9, 0xad, 0x75, 0x4f, 0x85, 0x4f, + 0xfc, 0x97, 0x94, 0xfb, 0xe3, 0x3f, 0x7d, 0x3f, + 0x25, 0xe5, 0x3e, 0xf8, 0xcf, 0xdf, 0x57, 0x04, + 0x4f, 0xdd, 0xaf, 0xb3, 0xc0, 0x7b, 0x35, 0xae, + 0xa9, 0xf0, 0xa9, 0xff, 0x00, 0x92, 0xf2, 0x9f, + 0x7c, 0x67, 0xef, 0xa7, 0xe4, 0xbc, 0xa7, 0xdf, + 0x19, 0xfb, 0xea, 0xe0, 0x89, 0xfb, 0xb5, 0xf6, + 0x78, 0x0f, 0x66, 0xb5, 0xd5, 0x3e, 0x15, 0x3f, + 0xf2, 0x5e, 0x53, 0xef, 0x8c, 0xfd, 0xf4, 0xfc, + 0x97, 0x94, 0xfb, 0xe3, 0x3f, 0x7d, 0x5c, 0x11, + 0x3f, 0x76, 0xbe, 0xcf, 0x01, 0xec, 0xd6, 0xba, + 0xa7, 0xc2, 0xa7, 0xfe, 0x4b, 0xca, 0x7d, 0xf1, + 0x9f, 0xbe, 0x9f, 0x92, 0xf2, 0x9f, 0x7c, 0x67, + 0xef, 0xab, 0x82, 0x27, 0xee, 0xd7, 0xd9, 0xe0, + 0x3d, 0x9a, 0xd7, 0x54, 0xf8, 0x54, 0xff, 0x00, + 0xc9, 0x79, 0x4f, 0xbe, 0x33, 0xf7, 0xd3, 0xf2, + 0x5e, 0x53, 0xef, 0x8c, 0xfd, 0xf5, 0x70, 0x44, + 0xfd, 0xda, 0xfb, 0x3c, 0x07, 0xb3, 0x5a, 0xea, + 0x9f, 0x0a, 0x9f, 0xf9, 0x2f, 0x29, 0xf7, 0xc6, + 0x7e, 0xfa, 0x7e, 0x4b, 0xca, 0x7d, 0xf1, 0x9f, + 0xbe, 0xae, 0x08, 0x9f, 0xbb, 0x5f, 0x67, 0x80, + 0xf6, 0x6b, 0x5d, 0x53, 0xe1, 0x53, 0xff, 0x00, + 0x25, 0xe5, 0x3e, 0xf8, 0xcf, 0xdf, 0x4f, 0xc9, + 0x79, 0x4f, 0xbe, 0x33, 0xf7, 0xd5, 0xc1, 0x13, + 0xf7, 0x6b, 0xec, 0xf0, 0x1e, 0xcd, 0x6b, 0xaa, + 0x7c, 0x2a, 0x7f, 0xe4, 0xbc, 0xa7, 0xdf, 0x19, + 0xfb, 0xe9, 0xf9, 0x2f, 0x29, 0xf7, 0xc6, 0x7e, + 0xfa, 0xb8, 0x22, 0x7e, 0xed, 0x7d, 0x9e, 0x03, + 0xd9, 0xad, 0x75, 0x4f, 0x85, 0x4f, 0xfc, 0x97, + 0x94, 0xfb, 0xe3, 0x3f, 0x7d, 0x3f, 0x25, 0xe5, + 0x3e, 0xf8, 0xcf, 0xdf, 0x57, 0x04, 0x4f, 0xdd, + 0xaf, 0xb3, 0xc0, 0x7b, 0x35, 0xae, 0xa9, 0xf0, + 0xa9, 0xff, 0x00, 0x92, 0xf2, 0x9f, 0x7c, 0x67, + 0xef, 0xa7, 0xe4, 0xbc, 0xa7, 0xdf, 0x19, 0xfb, + 0xea, 0xe0, 0x89, 0xfb, 0xb5, 0xf6, 0x78, 0x0f, + 0x66, 0xb5, 0xd5, 0x3e, 0x15, 0x3f, 0xf2, 0x5e, + 0x53, 0xef, 0x8c, 0xfd, 0xf4, 0xfc, 0x97, 0x94, + 0xfb, 0xe3, 0x3f, 0x7d, 0x5c, 0x11, 0x3f, 0x76, + 0xbe, 0xcf, 0x01, 0xec, 0xd6, 0xba, 0xa7, 0xc2, + 0xa7, 0xfe, 0x4b, 0xca, 0x7d, 0xf1, 0x9f, 0xbe, + 0x9f, 0x92, 0xf2, 0x9f, 0x7c, 0x67, 0xef, 0xab, + 0x82, 0x27, 0xee, 0xd7, 0xd9, 0xe0, 0x3d, 0x9a, + 0xd7, 0x54, 0xf8, 0x54, 0xff, 0x00, 0xc9, 0x79, + 0x4f, 0xbe, 0x33, 0xf7, 0xd3, 0xf2, 0x5e, 0x53, + 0xef, 0x8c, 0xfd, 0xf5, 0x70, 0x44, 0xfd, 0xda, + 0xfb, 0x3c, 0x07, 0xb3, 0x5a, 0xea, 0x9f, 0x0a, + 0x9f, 0xf9, 0x2f, 0x29, 0xf7, 0xc6, 0x7e, 0xfa, + 0x7e, 0x4b, 0xca, 0x7d, 0xf1, 0x9f, 0xbe, 0xae, + 0x08, 0x9f, 0xbb, 0x5f, 0x67, 0x80, 0xf6, 0x6b, + 0x5d, 0x53, 0xe1, 0x53, 0xff, 0x00, 0x25, 0xe5, + 0x3e, 0xf8, 0xcf, 0xdf, 0x4f, 0xc9, 0x79, 0x4f, + 0xbe, 0x33, 0xf7, 0xd5, 0xc1, 0x13, 0xf7, 0x6b, + 0xec, 0xf0, 0x1e, 0xcd, 0x6b, 0xaa, 0x7c, 0x2a, + 0x45, 0xfe, 0x97, 0xc8, 0xd9, 0x59, 0xcb, 0x76, + 0xfb, 0xa6, 0xbd, 0x90, 0xb7, 0x88, 0xb5, 0xa5, + 0xf5, 0x3b, 0x69, 0xb2, 0xaa, 0x7f, 0x43, 0xb9, + 0xce, 0xc3, 0xb8, 0xb8, 0x92, 0x7a, 0x67, 0x8a, + 0x93, 0x5e, 0x46, 0xac, 0xfa, 0x8f, 0xd4, 0x77, + 0x9e, 0x4f, 0xe7, 0x35, 0x6b, 0xe8, 0x6f, 0x53, + 0x3b, 0xcb, 0xbf, 0xb4, 0xd5, 0x69, 0xaa, 0x6a, + 0xa2, 0x66, 0x7a, 0xd4, 0xa6, 0x8a, 0x68, 0xbf, + 0x11, 0x4e, 0x69, 0xa2, 0x56, 0x24, 0x44, 0x59, + 0x3a, 0x44, 0x44, 0x40, 0x44, 0x44, 0x05, 0xab, + 0x90, 0xf4, 0x2b, 0x9f, 0x24, 0xff, 0x00, 0x14, + 0xad, 0xa5, 0xab, 0x90, 0xf4, 0x2b, 0x9f, 0x24, + 0xff, 0x00, 0x14, 0xa9, 0xa7, 0x3c, 0x2b, 0x73, + 0x62, 0xad, 0x13, 0xa9, 0x05, 0xa4, 0xfd, 0x1e, + 0xe3, 0xc3, 0x6f, 0x8a, 0xa7, 0x94, 0x0e, 0x93, + 0xf4, 0x7b, 0x8f, 0x0d, 0xbe, 0x2a, 0x9e, 0x5a, + 0x62, 0x38, 0xb5, 0x69, 0xfb, 0x98, 0x60, 0x79, + 0x6b, 0x7a, 0x27, 0x58, 0x88, 0x8b, 0x27, 0x48, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x0a, 0x3f, 0x50, + 0x7a, 0xa6, 0x7f, 0x93, 0xe3, 0x05, 0x20, 0xa3, + 0xf5, 0x07, 0xaa, 0x67, 0xf9, 0x3e, 0x30, 0x57, + 0xb7, 0xb7, 0x4e, 0x98, 0x65, 0x89, 0xe0, 0x5d, + 0xdc, 0xaf, 0x53, 0xdd, 0x2b, 0xea, 0x86, 0xf8, + 0x6f, 0xed, 0xa9, 0x67, 0xee, 0x51, 0x3a, 0x57, + 0xd5, 0x0d, 0xf0, 0xdf, 0xdb, 0x52, 0xcf, 0xdc, + 0xa6, 0xef, 0x16, 0xbd, 0xe9, 0x46, 0x1b, 0x81, + 0x6f, 0x76, 0x1c, 0xe6, 0xeb, 0xfc, 0x9e, 0x3c, + 0xab, 0x3e, 0xc4, 0x2b, 0xfa, 0xa0, 0x5d, 0x7f, + 0x93, 0xc7, 0x95, 0x67, 0xd8, 0x85, 0x7f, 0x5c, + 0xb6, 0x73, 0xd7, 0xbf, 0x2f, 0x63, 0xe2, 0x99, + 0xb0, 0x7f, 0xc6, 0xb6, 0x22, 0x22, 0xd9, 0xe6, + 0x88, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x83, 0x78, + 0x44, 0x1b, 0xc2, 0x0a, 0x06, 0x8d, 0xfe, 0xf8, + 0xbe, 0xe6, 0xb8, 0xfb, 0x40, 0xba, 0x42, 0xe6, + 0xfa, 0x37, 0xfb, 0xe2, 0xfb, 0x9a, 0xe3, 0xed, + 0x02, 0xe9, 0x0b, 0x1c, 0x3e, 0xc7, 0x9d, 0x2f, + 0x4f, 0xe3, 0x3c, 0xcd, 0x3e, 0xaa, 0xde, 0xa4, + 0x5e, 0x6f, 0xea, 0x63, 0xf0, 0xfe, 0x02, 0xb3, + 0x5a, 0x7a, 0x34, 0x5e, 0x08, 0xed, 0x2c, 0x39, + 0xbf, 0xa9, 0x8f, 0xc3, 0xf8, 0x0a, 0xcd, 0x69, + 0xe8, 0xd1, 0x78, 0x23, 0xb4, 0xb8, 0xac, 0xff, + 0x00, 0x67, 0x88, 0xf5, 0x54, 0x38, 0xea, 0xe5, + 0xed, 0xef, 0xcb, 0x2a, 0x22, 0x2f, 0x4d, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, + 0x33, 0x2d, 0xf5, 0xd0, 0xf3, 0x1e, 0xda, 0x9b, + 0x6f, 0x7a, 0x39, 0x94, 0x26, 0x5b, 0xeb, 0xa1, + 0xe6, 0x3d, 0xb5, 0x36, 0xde, 0xf4, 0x73, 0x2f, + 0x3b, 0x07, 0xcf, 0x63, 0xb4, 0xda, 0xfd, 0x32, + 0xe8, 0xbb, 0xc1, 0xb3, 0xa2, 0xad, 0x6c, 0x37, + 0x9e, 0x8b, 0x37, 0x93, 0x7f, 0x8a, 0x55, 0x4b, + 0x42, 0x6e, 0xbc, 0xfe, 0x57, 0xcf, 0x56, 0xdb, + 0xcf, 0x45, 0x9b, 0xc9, 0xbf, 0xc5, 0x2a, 0xa5, + 0xa1, 0x37, 0x5e, 0x7f, 0x2b, 0xe7, 0xaf, 0x56, + 0x9d, 0x8a, 0xbb, 0xce, 0x1a, 0xf8, 0xd6, 0xbc, + 0xe5, 0xad, 0x11, 0x16, 0x6d, 0x84, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x11, 0xda, 0x8f, + 0xd4, 0x77, 0x9e, 0x4f, 0xe7, 0x35, 0x6b, 0xe8, + 0x6f, 0x53, 0x3b, 0xcb, 0xbf, 0xb4, 0xd5, 0xb1, + 0xa8, 0xfd, 0x47, 0x79, 0xe4, 0xfe, 0x73, 0x56, + 0xbe, 0x86, 0xf5, 0x33, 0xbc, 0xbb, 0xfb, 0x4d, + 0x57, 0x8e, 0x1c, 0xe9, 0x63, 0x3c, 0xc5, 0x3b, + 0x93, 0xad, 0x62, 0x44, 0x45, 0x46, 0xc2, 0x22, + 0x20, 0x22, 0x22, 0x02, 0xd5, 0xc8, 0x7a, 0x15, + 0xcf, 0x92, 0x7f, 0x8a, 0x56, 0xd2, 0xd5, 0xc8, + 0x7a, 0x15, 0xcf, 0x92, 0x7f, 0x8a, 0x54, 0xd3, + 0x9e, 0x15, 0xb9, 0xb1, 0x56, 0x89, 0xd4, 0x82, + 0xd2, 0x7e, 0x8f, 0x71, 0xe1, 0xb7, 0xc5, 0x53, + 0xca, 0x07, 0x49, 0xfa, 0x3d, 0xc7, 0x86, 0xdf, + 0x15, 0x4f, 0x2d, 0x31, 0x1c, 0x5a, 0xb4, 0xfd, + 0xcc, 0x30, 0x3c, 0xb5, 0xbd, 0x13, 0xac, 0x44, + 0x45, 0x93, 0xa4, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x45, 0xe1, 0x73, 0x46, 0xf2, 0x07, 0x3a, 0x0f, + 0x51, 0x61, 0x92, 0xf2, 0xda, 0x33, 0x47, 0x3c, + 0x6c, 0xdf, 0x4d, 0xab, 0x11, 0xca, 0x59, 0x06, + 0xf1, 0x35, 0xfc, 0x75, 0x34, 0x01, 0x82, 0xa6, + 0xa8, 0x36, 0xd1, 0x6a, 0x0c, 0xa5, 0xa1, 0x00, + 0xd5, 0xc2, 0xbb, 0xaa, 0x3a, 0x8b, 0xd6, 0x64, + 0xad, 0x1e, 0x40, 0x0e, 0x20, 0x9d, 0xd5, 0x14, + 0x41, 0xb4, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x0a, 0x3f, 0x50, 0x7a, 0xa6, + 0x7f, 0x93, 0xe3, 0x05, 0x20, 0xa3, 0xf5, 0x07, + 0xaa, 0x67, 0xf9, 0x3e, 0x30, 0x57, 0xb7, 0xb7, + 0x4e, 0x98, 0x65, 0x89, 0xe0, 0x5d, 0xdc, 0xaf, + 0x53, 0xdd, 0x2b, 0xea, 0x86, 0xf8, 0x6f, 0xed, + 0xa9, 0x67, 0xee, 0x51, 0x3a, 0x57, 0xd5, 0x0d, + 0xf0, 0xdf, 0xdb, 0x52, 0xcf, 0xdc, 0xa6, 0xef, + 0x16, 0xbd, 0xe9, 0x46, 0x1b, 0x81, 0x6f, 0x76, + 0x1c, 0xe6, 0xeb, 0xfc, 0x9e, 0x3c, 0xab, 0x3e, + 0xc4, 0x2b, 0xfa, 0xa0, 0x5d, 0x7f, 0x93, 0xc7, + 0x95, 0x67, 0xd8, 0x85, 0x7f, 0x5c, 0xb6, 0x73, + 0xd7, 0xbf, 0x2f, 0x63, 0xe2, 0x99, 0xb0, 0x7f, + 0xc6, 0xb6, 0x22, 0x22, 0xd9, 0xe6, 0x88, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x9b, 0x37, 0xa0, 0x22, + 0xc7, 0x24, 0xf0, 0xc6, 0x2a, 0xe7, 0x8d, 0xbb, + 0x85, 0x56, 0x2f, 0xc4, 0xac, 0xab, 0xc3, 0xd2, + 0x8e, 0x2e, 0xa2, 0x0d, 0x94, 0x5a, 0x6d, 0xca, + 0xda, 0xba, 0xb4, 0xe3, 0xa0, 0x15, 0xaf, 0x0f, + 0x26, 0xea, 0xaf, 0x7f, 0x14, 0xb3, 0xad, 0x38, + 0x8f, 0x3d, 0x36, 0x20, 0xdb, 0x45, 0xf1, 0x14, + 0xb1, 0xcc, 0xce, 0x38, 0xcf, 0x13, 0x4a, 0xfb, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x41, 0xbc, 0x22, 0x0d, 0xe1, 0x05, 0x03, 0x46, + 0xff, 0x00, 0x7c, 0x5f, 0x73, 0x5c, 0x7d, 0xa0, + 0x5d, 0x21, 0x73, 0x7d, 0x1b, 0xfd, 0xf1, 0x7d, + 0xcd, 0x71, 0xf6, 0x81, 0x74, 0x85, 0x8e, 0x1f, + 0x63, 0xce, 0x97, 0xa7, 0xf1, 0x9e, 0x66, 0x9f, + 0x55, 0x6f, 0x52, 0x2f, 0x37, 0xf5, 0x31, 0xf8, + 0x7f, 0x01, 0x59, 0xad, 0x3d, 0x1a, 0x2f, 0x04, + 0x76, 0x96, 0x1c, 0xdf, 0xd4, 0xc7, 0xe1, 0xfc, + 0x05, 0x66, 0xb4, 0xf4, 0x68, 0xbc, 0x11, 0xda, + 0x5c, 0x56, 0x7f, 0xb3, 0xc4, 0x7a, 0xaa, 0x1c, + 0x75, 0x72, 0xf6, 0xf7, 0xe5, 0x95, 0x11, 0x17, + 0xa6, 0xc0, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x45, 0xe1, 0x7b, 0x1b, 0x5a, 0xb8, 0x0a, + 0x6f, 0xa9, 0x5a, 0xee, 0xc8, 0x59, 0xb3, 0xbf, + 0x90, 0x01, 0xd5, 0xe4, 0x41, 0xb2, 0x8b, 0x51, + 0xd9, 0x5b, 0x36, 0x9a, 0x02, 0xe7, 0x6c, 0xad, + 0x5a, 0x2a, 0x07, 0x3a, 0x1c, 0x9d, 0xa0, 0xad, + 0x4b, 0x81, 0x1b, 0x08, 0xa6, 0xd4, 0x1b, 0x68, + 0xb0, 0x43, 0x79, 0x6f, 0x33, 0xb8, 0x58, 0xee, + 0xeb, 0x7d, 0x0a, 0xce, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x23, 0x32, + 0xdf, 0x5d, 0x0f, 0x31, 0xed, 0xa9, 0xb6, 0xf7, + 0xa3, 0x99, 0x42, 0x65, 0xbe, 0xba, 0x1e, 0x63, + 0xdb, 0x53, 0x6d, 0xef, 0x47, 0x32, 0xf3, 0xb0, + 0x7c, 0xf6, 0x3b, 0x4d, 0xaf, 0xd3, 0x2e, 0x8b, + 0xbc, 0x1b, 0x3a, 0x2a, 0xd6, 0xc3, 0x79, 0xe8, + 0xb3, 0x79, 0x37, 0xf8, 0xa5, 0x54, 0xb4, 0x26, + 0xeb, 0xcf, 0xe5, 0x7c, 0xf5, 0x6d, 0xbc, 0xf4, + 0x59, 0xbc, 0x9b, 0xfc, 0x52, 0xaa, 0x5a, 0x13, + 0x75, 0xe7, 0xf2, 0xbe, 0x7a, 0xf5, 0x69, 0xd8, + 0xab, 0xbc, 0xe1, 0xaf, 0x8d, 0x6b, 0xce, 0x5a, + 0xd1, 0x11, 0x66, 0xd8, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x45, 0xe1, 0x20, 0x6f, 0x20, + 0x73, 0xac, 0x52, 0x5d, 0xdb, 0x47, 0xb1, 0xcf, + 0x1b, 0x37, 0xd3, 0x6a, 0x0c, 0xc8, 0xb5, 0x0e, + 0x52, 0xc8, 0x37, 0x88, 0x3f, 0x8f, 0x6d, 0x28, + 0xd1, 0x53, 0x5e, 0x64, 0x19, 0x4b, 0x52, 0x01, + 0xab, 0x85, 0x6b, 0x4a, 0x8e, 0xa6, 0xc4, 0x1b, + 0x68, 0xb5, 0x5b, 0x93, 0xb4, 0x71, 0x03, 0x88, + 0x82, 0x77, 0x54, 0x51, 0x6d, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x08, + 0xed, 0x47, 0xea, 0x3b, 0xcf, 0x27, 0xf3, 0x9a, + 0xb5, 0xf4, 0x37, 0xa9, 0x9d, 0xe5, 0xdf, 0xda, + 0x6a, 0xd8, 0xd4, 0x7e, 0xa3, 0xbc, 0xf2, 0x7f, + 0x39, 0xab, 0x5f, 0x43, 0x7a, 0x99, 0xde, 0x5d, + 0xfd, 0xa6, 0xab, 0xc7, 0x0e, 0x74, 0xb1, 0x9e, + 0x62, 0x9d, 0xc9, 0xd6, 0xb1, 0x22, 0x22, 0xa3, + 0x61, 0x11, 0x10, 0x11, 0x11, 0x01, 0x6a, 0xe4, + 0x3d, 0x0a, 0xe7, 0xc9, 0x3f, 0xc5, 0x2b, 0x69, + 0x6a, 0xe4, 0x3d, 0x0a, 0xe7, 0xc9, 0x3f, 0xc5, + 0x2a, 0x69, 0xcf, 0x0a, 0xdc, 0xd8, 0xab, 0x44, + 0xea, 0x41, 0x69, 0x3f, 0x47, 0xb8, 0xf0, 0xdb, + 0xe2, 0xa9, 0xe5, 0x03, 0xa4, 0xfd, 0x1e, 0xe3, + 0xc3, 0x6f, 0x8a, 0xa7, 0x96, 0x98, 0x8e, 0x2d, + 0x5a, 0x7e, 0xe6, 0x18, 0x1e, 0x5a, 0xde, 0x89, + 0xd6, 0x22, 0x22, 0xc9, 0xd2, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x72, 0x73, + 0x20, 0x6c, 0x1b, 0xd7, 0xc4, 0x92, 0xc7, 0x13, + 0x78, 0x9e, 0x68, 0x14, 0x75, 0xf5, 0xeb, 0x9c, + 0xe2, 0xdb, 0x73, 0x50, 0xcd, 0xe4, 0x72, 0xaa, + 0xf6, 0x53, 0x52, 0xe3, 0xb1, 0x83, 0xf8, 0xf2, + 0x9b, 0x87, 0x3b, 0x6b, 0x2d, 0xd8, 0x43, 0x8e, + 0xce, 0x57, 0x1f, 0x8a, 0x91, 0x13, 0x22, 0xc9, + 0x73, 0x96, 0x6b, 0x47, 0x0c, 0x62, 0x84, 0xee, + 0x71, 0x50, 0x19, 0x1c, 0xde, 0x3e, 0xd2, 0x52, + 0xfb, 0x8b, 0xe6, 0x71, 0x80, 0x48, 0x60, 0xab, + 0x9d, 0x52, 0x29, 0xb9, 0xab, 0x4e, 0xd9, 0xda, + 0xa7, 0x3e, 0x1b, 0x25, 0xa5, 0xa3, 0x71, 0xf6, + 0x8e, 0x14, 0xe9, 0xee, 0x36, 0x54, 0x75, 0x5a, + 0x29, 0xc4, 0x7b, 0x0b, 0x7a, 0xcf, 0xd9, 0xae, + 0x1d, 0x8f, 0x33, 0xe4, 0x66, 0x96, 0xf6, 0x67, + 0x1e, 0x27, 0x80, 0x7a, 0x28, 0xea, 0x7a, 0xcd, + 0xee, 0xbd, 0xf5, 0x6c, 0x91, 0x1b, 0x53, 0xde, + 0x84, 0x65, 0x9e, 0xe3, 0x4e, 0x3d, 0x55, 0x84, + 0x11, 0x39, 0xfe, 0x72, 0x5d, 0xc8, 0x18, 0x45, + 0x3b, 0x1d, 0x45, 0xa3, 0x73, 0xad, 0x2d, 0xad, + 0xc3, 0x5b, 0x69, 0x03, 0xae, 0x9e, 0xf1, 0xdd, + 0x92, 0x4b, 0x69, 0xcc, 0x40, 0x25, 0x5d, 0xed, + 0x34, 0xee, 0x06, 0xcc, 0x0f, 0x36, 0xb0, 0x81, + 0x84, 0x7c, 0x62, 0xc0, 0xe3, 0xfb, 0x4f, 0xa9, + 0x5b, 0xed, 0x8e, 0x36, 0x6c, 0x63, 0x1a, 0xd1, + 0xd4, 0x00, 0x0e, 0xd2, 0x65, 0xa7, 0xaa, 0x7c, + 0x27, 0x4b, 0x9a, 0xdb, 0xeb, 0xa8, 0xcc, 0x8d, + 0x6d, 0xd5, 0x91, 0x89, 0x8d, 0x04, 0x35, 0xe1, + 0xee, 0xd9, 0xee, 0x51, 0x4a, 0xda, 0x6a, 0x2c, + 0x35, 0xd1, 0x73, 0x9b, 0x38, 0x67, 0xe8, 0x07, + 0x72, 0x72, 0xab, 0xb3, 0x98, 0xc7, 0x0a, 0x39, + 0xad, 0x70, 0xea, 0x10, 0x0a, 0xd2, 0xb9, 0xc1, + 0x61, 0x6e, 0xeb, 0xe7, 0x16, 0x30, 0x49, 0x5e, + 0x5e, 0x06, 0x83, 0xfb, 0x4d, 0xa1, 0x4c, 0xb4, + 0xcf, 0x73, 0x21, 0x92, 0x7a, 0xd1, 0x76, 0xf9, + 0x5e, 0x92, 0x32, 0xfb, 0x79, 0x84, 0xac, 0x14, + 0x2e, 0xe1, 0x3b, 0x68, 0xb7, 0xed, 0xb2, 0x6f, + 0xe1, 0x69, 0x97, 0xbb, 0x04, 0x90, 0x48, 0x1b, + 0x42, 0x8b, 0xba, 0xd0, 0x18, 0xb3, 0x57, 0xe3, + 0x66, 0x9b, 0x1f, 0x29, 0xdd, 0xc2, 0xe2, 0xf6, + 0x57, 0xc1, 0x7e, 0xdf, 0x7d, 0x44, 0x5f, 0xc1, + 0xad, 0x70, 0x90, 0x9e, 0x06, 0x33, 0x23, 0x6c, + 0xdd, 0xbd, 0x2c, 0x60, 0xb8, 0x80, 0x3f, 0x4a, + 0x3e, 0xfb, 0xb6, 0x9e, 0x4c, 0x4e, 0x69, 0x3a, + 0x57, 0x56, 0xe4, 0x6d, 0x5c, 0xe0, 0xd0, 0xed, + 0xa4, 0xd3, 0x6a, 0xd9, 0x04, 0x11, 0x50, 0xb9, + 0xee, 0x2b, 0x57, 0x58, 0x5f, 0xb9, 0xb1, 0x5c, + 0x8f, 0x34, 0xbb, 0xaf, 0x0b, 0x45, 0x7f, 0x86, + 0x4e, 0xed, 0xe7, 0xbd, 0x2a, 0xd1, 0x6d, 0x7d, + 0x71, 0x08, 0x11, 0xf0, 0xf1, 0x37, 0x75, 0x0e, + 0xd3, 0xd9, 0x51, 0x31, 0x31, 0x9d, 0x31, 0x39, + 0x53, 0x48, 0xb1, 0xc1, 0x33, 0x66, 0x67, 0x13, + 0x79, 0x36, 0x11, 0x5a, 0xd0, 0xac, 0x8a, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x47, 0xea, 0x0f, 0x54, 0xcf, 0xf2, + 0x7c, 0x60, 0xa4, 0x14, 0x7e, 0xa0, 0xf5, 0x4c, + 0xff, 0x00, 0x27, 0xc6, 0x0a, 0xf6, 0xf6, 0xe9, + 0xd3, 0x0c, 0xb1, 0x3c, 0x0b, 0xbb, 0x95, 0xea, + 0x7b, 0xa5, 0x7d, 0x50, 0xdf, 0x0d, 0xfd, 0xb5, + 0x2c, 0xfd, 0xca, 0x27, 0x4a, 0xfa, 0xa1, 0xbe, + 0x1b, 0xfb, 0x6a, 0x59, 0xfb, 0x94, 0xdd, 0xe2, + 0xd7, 0xbd, 0x28, 0xc3, 0x70, 0x2d, 0xee, 0xc3, + 0x9c, 0xdd, 0x7f, 0x93, 0xc7, 0x95, 0x67, 0xd8, + 0x85, 0x7f, 0x54, 0x0b, 0xaf, 0xf2, 0x78, 0xf2, + 0xac, 0xfb, 0x10, 0xaf, 0xeb, 0x96, 0xce, 0x7a, + 0xf7, 0xe5, 0xec, 0x7c, 0x53, 0x36, 0x0f, 0xf8, + 0xd6, 0xc4, 0x44, 0x5b, 0x3c, 0xd1, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x2a, 0x3b, 0x1b, 0xd6, 0xb5, 0xed, 0xd3, 0x20, + 0x67, 0x08, 0x3f, 0xc4, 0x76, 0xe0, 0xa0, 0x2f, + 0x32, 0xb1, 0x5b, 0x35, 0xd2, 0xdd, 0x5c, 0x88, + 0x7a, 0x3e, 0xf8, 0x93, 0xb4, 0x81, 0xd4, 0x6f, + 0x29, 0x41, 0x3b, 0x36, 0x4a, 0x08, 0x81, 0xa7, + 0x77, 0x4d, 0xf4, 0x50, 0x99, 0x5c, 0xd4, 0x0d, + 0x8f, 0xa4, 0xb8, 0xb8, 0x11, 0x03, 0xde, 0xb0, + 0x75, 0x37, 0x2d, 0x7b, 0x39, 0xb2, 0xd9, 0x86, + 0x7f, 0xf8, 0xfb, 0x23, 0x69, 0x66, 0xed, 0xad, + 0xbb, 0xbb, 0xee, 0x78, 0xba, 0xec, 0x88, 0x77, + 0x47, 0xb4, 0xb7, 0xdb, 0xa3, 0x31, 0x73, 0x3d, + 0x93, 0x65, 0x0b, 0xb2, 0x13, 0x37, 0x70, 0x7f, + 0x71, 0x10, 0x27, 0xa8, 0xc6, 0x7c, 0x25, 0x4e, + 0x48, 0x8c, 0xe2, 0x06, 0xdf, 0x54, 0xe2, 0xe5, + 0xb8, 0xe8, 0x8c, 0xee, 0x1c, 0x34, 0x6b, 0x4b, + 0x01, 0x35, 0x00, 0x75, 0x96, 0xd4, 0xb9, 0x29, + 0x5f, 0xd2, 0x49, 0x6d, 0x63, 0x75, 0x73, 0xc2, + 0xdf, 0xe1, 0xb5, 0xb0, 0xba, 0x8e, 0x3e, 0xe8, + 0x56, 0xcb, 0x5b, 0x0b, 0x2b, 0x36, 0x86, 0x5a, + 0x5b, 0xc5, 0x03, 0x46, 0xe1, 0x1b, 0x1a, 0xde, + 0xd0, 0x59, 0xea, 0x53, 0x2c, 0x77, 0x21, 0x1d, + 0x2e, 0x74, 0xec, 0xae, 0xae, 0xab, 0x9c, 0x70, + 0xb3, 0xf0, 0xbc, 0x50, 0xd2, 0x37, 0x1d, 0x83, + 0x72, 0xdd, 0x6e, 0x6e, 0x2e, 0x16, 0x36, 0xf2, + 0xda, 0x7b, 0x47, 0x9e, 0xff, 0x00, 0x8e, 0x39, + 0x03, 0x40, 0xea, 0x55, 0xca, 0xf0, 0x95, 0x24, + 0x50, 0xed, 0x1d, 0x44, 0xcb, 0x1d, 0x46, 0x4e, + 0xd5, 0x5a, 0xd7, 0x2f, 0x64, 0xe7, 0xf0, 0xda, + 0xdc, 0xb0, 0x9a, 0xd4, 0x36, 0xb4, 0xde, 0xa4, + 0x2d, 0xf2, 0x57, 0x1d, 0x21, 0x6b, 0x8d, 0x4b, + 0x41, 0xa8, 0x3b, 0x41, 0x23, 0xa9, 0xce, 0xb6, + 0x6f, 0x30, 0x18, 0x6b, 0xed, 0xb7, 0x36, 0x71, + 0xb9, 0xff, 0x00, 0xee, 0x34, 0x70, 0x3f, 0xf6, + 0x99, 0xc2, 0x54, 0x4c, 0xfa, 0x56, 0xfa, 0xce, + 0xb2, 0x61, 0x2f, 0x48, 0x3b, 0xc5, 0xbd, 0xd7, + 0x76, 0xd3, 0xd6, 0x12, 0x0d, 0xa3, 0xdd, 0x09, + 0xd0, 0x74, 0xa6, 0xd9, 0x93, 0xb7, 0x2d, 0x05, + 0xf5, 0x6b, 0xb9, 0x41, 0x0b, 0x62, 0x29, 0xa3, + 0x99, 0xa1, 0xcc, 0x35, 0x05, 0x73, 0xb9, 0xf5, + 0x1e, 0x67, 0x15, 0x76, 0x2d, 0xf3, 0xf6, 0x3d, + 0x0b, 0x1c, 0x76, 0x48, 0xc1, 0xb0, 0xf5, 0xda, + 0xf1, 0x50, 0xe5, 0x61, 0xc6, 0x64, 0x9b, 0x2c, + 0x4d, 0xb9, 0xb3, 0x77, 0x1c, 0x4f, 0xd8, 0xd2, + 0x76, 0xd2, 0x9c, 0x84, 0x0e, 0x54, 0x9a, 0x66, + 0x3a, 0x53, 0x95, 0x66, 0x45, 0xa9, 0x67, 0x7b, + 0xd3, 0x51, 0xaf, 0x1c, 0x2f, 0x3b, 0x85, 0x77, + 0xd1, 0x6d, 0xa8, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x1b, 0xc2, + 0x20, 0xde, 0x10, 0x50, 0x34, 0x6f, 0xf7, 0xc5, + 0xf7, 0x35, 0xc7, 0xda, 0x05, 0xd2, 0x17, 0x37, + 0xd1, 0xbf, 0xdf, 0x17, 0xdc, 0xd7, 0x1f, 0x68, + 0x17, 0x48, 0x58, 0xe1, 0xf6, 0x3c, 0xe9, 0x7a, + 0x7f, 0x19, 0xe6, 0x69, 0xf5, 0x56, 0xf5, 0x22, + 0xf3, 0x7f, 0x53, 0x1f, 0x87, 0xf0, 0x15, 0x9a, + 0xd3, 0xd1, 0xa2, 0xf0, 0x47, 0x69, 0x61, 0xcd, + 0xfd, 0x4c, 0x7e, 0x1f, 0xc0, 0x56, 0x6b, 0x4f, + 0x46, 0x8b, 0xc1, 0x1d, 0xa5, 0xc5, 0x67, 0xfb, + 0x3c, 0x47, 0xaa, 0xa1, 0xc7, 0x57, 0x2f, 0x6f, + 0x7e, 0x59, 0x51, 0x11, 0x7a, 0x6c, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0xa8, 0xff, 0x00, 0x45, 0xf3, 0x24, 0x8c, + 0x8d, 0x85, 0xef, 0x3c, 0x2d, 0x1c, 0xa5, 0x42, + 0x5e, 0x5f, 0xbc, 0x92, 0xf7, 0x3f, 0x82, 0x13, + 0xb8, 0x93, 0x4a, 0x75, 0xd0, 0x4c, 0x4d, 0x75, + 0x14, 0x3d, 0xf9, 0xdb, 0xc8, 0x02, 0x8d, 0xba, + 0xcb, 0x35, 0xd5, 0x67, 0x10, 0x85, 0x8d, 0xaf, + 0x1b, 0x9c, 0x69, 0x4e, 0x75, 0x5c, 0xb8, 0xd5, + 0x30, 0xb6, 0xe8, 0x59, 0x58, 0xc3, 0x26, 0x56, + 0xf8, 0x6c, 0xe1, 0x84, 0x71, 0x35, 0xbd, 0x6e, + 0x21, 0x5a, 0xf6, 0x96, 0xc3, 0x74, 0xd6, 0xa0, + 0xcb, 0x31, 0xc3, 0x25, 0x2c, 0x78, 0xfb, 0x69, + 0x37, 0xc1, 0x10, 0xe9, 0x25, 0xa1, 0xe4, 0x27, + 0x63, 0x42, 0x9c, 0x9d, 0x7d, 0x08, 0x99, 0x6b, + 0xdc, 0xea, 0x4c, 0x4d, 0xb3, 0x8b, 0x1f, 0x78, + 0x24, 0x73, 0x8d, 0x1d, 0xc0, 0x0b, 0xb7, 0x75, + 0xd7, 0x93, 0x6a, 0xac, 0x30, 0x89, 0xad, 0x65, + 0xc1, 0x91, 0xce, 0xa1, 0x3d, 0x51, 0xce, 0xa6, + 0x2c, 0x7d, 0x9f, 0xe9, 0x8b, 0x30, 0x38, 0xad, + 0xdd, 0x76, 0xf1, 0xf1, 0xe7, 0x71, 0x70, 0xfd, + 0x96, 0xf0, 0xb5, 0x4c, 0xc1, 0x8a, 0xc5, 0xdb, + 0x0e, 0x1b, 0x7b, 0x38, 0x22, 0x03, 0xf4, 0x23, + 0x68, 0xf8, 0x14, 0xff, 0x00, 0xe7, 0xb4, 0xe9, + 0xec, 0x73, 0xcb, 0x9d, 0x77, 0x0c, 0x72, 0x3a, + 0x2b, 0x7b, 0x33, 0x2c, 0x4c, 0x35, 0x6c, 0x8e, + 0x71, 0x61, 0x24, 0x6e, 0x34, 0x0d, 0x2b, 0x35, + 0xae, 0xba, 0xc6, 0xcd, 0xc7, 0xe7, 0x56, 0xee, + 0xb6, 0x71, 0x3c, 0x8f, 0x2f, 0x07, 0xdc, 0xa3, + 0x57, 0x45, 0x11, 0xc6, 0x36, 0x06, 0x36, 0x9d, + 0x4a, 0x05, 0x8a, 0x5b, 0x0b, 0x09, 0xc1, 0x13, + 0x5b, 0x43, 0x20, 0x3b, 0xf8, 0xe3, 0x69, 0xed, + 0x84, 0xcb, 0x4f, 0xf8, 0xf8, 0xcc, 0x93, 0xd6, + 0xaa, 0x5a, 0xe7, 0x31, 0x6f, 0x6b, 0x64, 0x6d, + 0xcb, 0x5a, 0xf2, 0x76, 0xd7, 0x61, 0xdb, 0xb2, + 0x8a, 0x51, 0x99, 0x39, 0xc3, 0x5a, 0xe6, 0x3f, + 0x89, 0x84, 0x77, 0x2e, 0x69, 0x04, 0x57, 0x96, + 0xab, 0xea, 0xf3, 0x44, 0xe9, 0xab, 0xb0, 0x6b, + 0x66, 0x20, 0x71, 0xf8, 0xf6, 0xe4, 0xc6, 0x7b, + 0x0d, 0xee, 0x7d, 0xe5, 0x09, 0x73, 0xa0, 0xf2, + 0x76, 0x47, 0xa5, 0xc2, 0x64, 0x0b, 0xc3, 0x76, + 0x8b, 0x7b, 0x8e, 0xe4, 0xf3, 0x09, 0x1b, 0xb3, + 0xb2, 0x13, 0x25, 0x33, 0xdd, 0xc9, 0xa4, 0xcb, + 0x2b, 0x4c, 0x59, 0x26, 0x83, 0xc3, 0x30, 0xdc, + 0x01, 0x0e, 0x03, 0x7d, 0x56, 0x78, 0xaf, 0x6d, + 0xe5, 0x77, 0x0b, 0x1d, 0x52, 0xb9, 0xd4, 0xda, + 0xa3, 0x3f, 0x87, 0xb9, 0x64, 0x19, 0xbb, 0x03, + 0xc0, 0x36, 0x6d, 0xee, 0x4b, 0x87, 0x55, 0x8f, + 0x15, 0x6b, 0x94, 0xf6, 0x3b, 0x2b, 0x8f, 0xc9, + 0x37, 0xa6, 0xc6, 0xca, 0x5e, 0xe0, 0x03, 0xa5, + 0x84, 0xd1, 0x92, 0x33, 0x9d, 0xbb, 0x76, 0x73, + 0x6c, 0x49, 0xa6, 0x60, 0x89, 0x5b, 0x91, 0x45, + 0xdb, 0x64, 0xa5, 0xa8, 0x6c, 0xad, 0x1c, 0x20, + 0x6d, 0x76, 0xe5, 0x26, 0xd7, 0x07, 0x34, 0x38, + 0x6d, 0x07, 0x68, 0x55, 0x4b, 0xd4, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x41, 0x19, 0x96, 0xfa, 0xe8, 0x79, 0x8f, + 0x6d, 0x4d, 0xb7, 0xbd, 0x1c, 0xca, 0x13, 0x2d, + 0xf5, 0xd0, 0xf3, 0x1e, 0xda, 0x9b, 0x6f, 0x7a, + 0x39, 0x97, 0x9d, 0x83, 0xe7, 0xb1, 0xda, 0x6d, + 0x7e, 0x99, 0x74, 0x5d, 0xe0, 0xd9, 0xd1, 0x56, + 0xb6, 0x1b, 0xcf, 0x45, 0x9b, 0xc9, 0xbf, 0xc5, + 0x2a, 0xa5, 0xa1, 0x37, 0x5e, 0x7f, 0x2b, 0xe7, + 0xab, 0x6d, 0xe7, 0xa2, 0xcd, 0xe4, 0xdf, 0xe2, + 0x95, 0x52, 0xd0, 0x9b, 0xaf, 0x3f, 0x95, 0xf3, + 0xd7, 0xab, 0x4e, 0xc5, 0x5d, 0xe7, 0x0d, 0x7c, + 0x6b, 0x5e, 0x72, 0xd6, 0x88, 0x8b, 0x36, 0xc2, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x6c, 0xe5, 0x45, 0x19, 0x7d, 0x7c, + 0xe2, 0xfe, 0x0b, 0x77, 0x57, 0x83, 0x79, 0x1d, + 0x54, 0x12, 0x32, 0x4a, 0xc8, 0xdb, 0xc4, 0xf3, + 0x40, 0xb4, 0x2e, 0x72, 0xcc, 0x60, 0xa4, 0x63, + 0x69, 0xef, 0x5c, 0x55, 0x77, 0x29, 0xa8, 0xf1, + 0xf8, 0xc6, 0xd6, 0xe6, 0x63, 0x33, 0x9d, 0xde, + 0xdb, 0xb0, 0x87, 0x3a, 0xa3, 0xf4, 0xbf, 0x44, + 0x05, 0xa3, 0x6f, 0x79, 0xa9, 0xb5, 0x05, 0x1f, + 0x8d, 0xb1, 0x16, 0xb6, 0xc7, 0x67, 0x9c, 0x4f, + 0xdc, 0xb6, 0x9d, 0x50, 0x48, 0xab, 0xbd, 0xc0, + 0xa6, 0x29, 0x99, 0xe9, 0xcd, 0xa5, 0x13, 0x29, + 0x6c, 0x8e, 0x56, 0xca, 0xda, 0x41, 0x2d, 0xd5, + 0xf4, 0x6c, 0x34, 0xe2, 0x0d, 0x71, 0xab, 0xab, + 0x4a, 0x77, 0xad, 0xda, 0xb4, 0x63, 0xd5, 0x18, + 0x30, 0xc7, 0x38, 0x5d, 0x97, 0x91, 0xf1, 0x78, + 0x48, 0xaf, 0x35, 0x56, 0x4b, 0x4f, 0x66, 0x56, + 0x6e, 0x90, 0xdc, 0x65, 0xaf, 0x24, 0xb8, 0x95, + 0xe6, 0xaf, 0x64, 0x23, 0xa3, 0x6d, 0x7c, 0x27, + 0x71, 0x38, 0xfb, 0xca, 0x72, 0xd7, 0x46, 0xe9, + 0x8b, 0x50, 0x3a, 0x3c, 0x7c, 0x4f, 0x70, 0xf8, + 0xd2, 0xd6, 0x43, 0xfb, 0xe4, 0xa9, 0xff, 0x00, + 0xc4, 0x75, 0xc9, 0xd2, 0xa8, 0xcd, 0xad, 0xf1, + 0x96, 0x81, 0xbd, 0x1c, 0x4e, 0xb9, 0x7b, 0x81, + 0xe2, 0xa3, 0x83, 0x29, 0xee, 0x9a, 0xaf, 0x98, + 0x35, 0xfe, 0x31, 0xee, 0x64, 0x72, 0x59, 0xc9, + 0x13, 0x5b, 0x50, 0xd7, 0xf4, 0xa1, 0xc0, 0x7b, + 0x81, 0xa0, 0xae, 0x81, 0x1e, 0x2f, 0x19, 0x18, + 0xa4, 0x76, 0x76, 0xed, 0x03, 0x75, 0x22, 0x67, + 0xfa, 0x2f, 0x24, 0xc5, 0x62, 0xa5, 0x14, 0x92, + 0xca, 0xdd, 0xe3, 0xa8, 0x62, 0x67, 0xd1, 0x4c, + 0xb4, 0x75, 0x49, 0x92, 0x7a, 0xd5, 0x2b, 0x5d, + 0x43, 0x87, 0xbb, 0x71, 0x22, 0x6e, 0x01, 0xf1, + 0x03, 0xc1, 0xde, 0x7b, 0x2a, 0x56, 0xdb, 0x29, + 0xd2, 0x46, 0x5f, 0x6d, 0x30, 0x99, 0xa2, 0x85, + 0xdc, 0x27, 0x6f, 0x22, 0xd8, 0xb9, 0xd1, 0xba, + 0x62, 0xe4, 0x1e, 0x2b, 0x08, 0xe3, 0x27, 0xe3, + 0x43, 0x58, 0xcf, 0xee, 0x10, 0x14, 0x2d, 0xdf, + 0xb3, 0x86, 0xc4, 0x4c, 0x98, 0x7c, 0x84, 0x96, + 0xef, 0xe4, 0x8e, 0x7e, 0xed, 0xbf, 0xb6, 0xca, + 0x1f, 0x79, 0x32, 0x53, 0x3d, 0xd9, 0x8d, 0x27, + 0x4a, 0xc1, 0x6f, 0x94, 0x93, 0x84, 0x19, 0x7b, + 0xb6, 0x92, 0x41, 0x20, 0x6d, 0x0b, 0x6c, 0x64, + 0x6d, 0x0b, 0x83, 0x78, 0xf6, 0x93, 0x4d, 0xcb, + 0x9e, 0xde, 0xde, 0xeb, 0x1d, 0x3b, 0x1f, 0x0d, + 0xf5, 0xb0, 0x9e, 0xdc, 0x50, 0x74, 0xe2, 0xaf, + 0x8c, 0xd3, 0xf5, 0xdb, 0xb5, 0xbe, 0xea, 0x92, + 0xc5, 0x6a, 0x7c, 0x4e, 0x58, 0x35, 0x81, 0xc6, + 0xd2, 0xf7, 0x67, 0x0c, 0x12, 0x11, 0xc2, 0xe3, + 0xfa, 0x92, 0x6c, 0x69, 0xe6, 0xd8, 0x52, 0x69, + 0x98, 0xe9, 0xcf, 0xa0, 0xcb, 0x0b, 0xc0, 0x20, + 0x8a, 0x8d, 0xcb, 0xd5, 0x09, 0x6f, 0x7b, 0x71, + 0x07, 0xf0, 0xcb, 0x4b, 0x80, 0x34, 0xa1, 0xda, + 0xee, 0xca, 0x97, 0x82, 0x66, 0xcc, 0xce, 0x20, + 0x76, 0x8d, 0x84, 0x75, 0xd5, 0x52, 0xc8, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x23, 0xb5, 0x1f, 0xa8, 0xef, + 0x3c, 0x9f, 0xce, 0x6a, 0xd7, 0xd0, 0xde, 0xa6, + 0x77, 0x97, 0x7f, 0x69, 0xab, 0x63, 0x51, 0xfa, + 0x8e, 0xf3, 0xc9, 0xfc, 0xe6, 0xad, 0x7d, 0x0d, + 0xea, 0x67, 0x79, 0x77, 0xf6, 0x9a, 0xaf, 0x1c, + 0x39, 0xd2, 0xc6, 0x79, 0x8a, 0x77, 0x27, 0x5a, + 0xc4, 0x88, 0x8a, 0x8d, 0x84, 0x44, 0x40, 0x44, + 0x44, 0x05, 0xab, 0x90, 0xf4, 0x2b, 0x9f, 0x24, + 0xff, 0x00, 0x14, 0xad, 0xa5, 0xab, 0x90, 0xf4, + 0x2b, 0x9f, 0x24, 0xff, 0x00, 0x14, 0xa9, 0xa7, + 0x3c, 0x2b, 0x73, 0x62, 0xad, 0x13, 0xa9, 0x05, + 0xa4, 0xfd, 0x1e, 0xe3, 0xc3, 0x6f, 0x8a, 0xa7, + 0x94, 0x0e, 0x93, 0xf4, 0x7b, 0x8f, 0x0d, 0xbe, + 0x2a, 0x9e, 0x5a, 0x62, 0x38, 0xb5, 0x69, 0xfb, + 0x98, 0x60, 0x79, 0x6b, 0x7a, 0x27, 0x58, 0x88, + 0x8b, 0x27, 0x48, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x84, 0x80, 0x2a, 0x4d, 0x00, 0xde, 0x50, + 0x62, 0xb8, 0x9d, 0xb0, 0x44, 0x64, 0x70, 0x26, + 0x9d, 0x45, 0x11, 0x73, 0x90, 0xb8, 0x92, 0x37, + 0xbb, 0x8d, 0xac, 0x8c, 0x1d, 0x8d, 0x34, 0x00, + 0xf3, 0x92, 0xb3, 0xe4, 0xae, 0x5b, 0x27, 0x08, + 0x27, 0xf8, 0x3b, 0xc1, 0xdc, 0x09, 0xeb, 0xaa, + 0x9d, 0xe6, 0x2e, 0xf7, 0x52, 0xe4, 0x9b, 0x61, + 0x67, 0x29, 0x8f, 0x1b, 0x6f, 0xe9, 0x73, 0x8e, + 0xf6, 0xbb, 0xc0, 0x6f, 0xe9, 0x38, 0x8e, 0x4e, + 0xca, 0x98, 0x8c, 0xb3, 0xd2, 0x89, 0x96, 0x6c, + 0x8c, 0xf7, 0x59, 0x19, 0x1d, 0x8b, 0xc1, 0xb0, + 0x49, 0x74, 0xf1, 0x49, 0xa7, 0x61, 0xe1, 0x8e, + 0x36, 0x93, 0xb4, 0xb9, 0xdb, 0x94, 0xb6, 0x9f, + 0xd0, 0xb8, 0xbc, 0x4f, 0x0d, 0xc5, 0xcd, 0x2f, + 0xaf, 0xf7, 0x99, 0xa4, 0x15, 0x63, 0x4f, 0xea, + 0x30, 0xd7, 0xb2, 0x76, 0xa9, 0xac, 0x66, 0x2e, + 0xcb, 0x15, 0x68, 0xdb, 0x4b, 0x28, 0xc4, 0x71, + 0x37, 0x79, 0xde, 0xe7, 0x1f, 0xd2, 0x7b, 0xb9, + 0x4a, 0xdb, 0x53, 0x35, 0x77, 0x23, 0x31, 0x93, + 0xac, 0x44, 0x45, 0x54, 0x88, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x82, 0x03, 0x50, 0x68, 0xbc, + 0x4e, 0x6c, 0x3a, 0x52, 0xdf, 0x35, 0xbd, 0x3b, + 0xae, 0x62, 0x03, 0x69, 0xff, 0x00, 0xdc, 0x6e, + 0xc0, 0xee, 0xda, 0xa6, 0x9b, 0xac, 0xfe, 0x96, + 0xbd, 0x6d, 0x96, 0x59, 0x8e, 0xb9, 0xb5, 0x93, + 0xb9, 0x8e, 0x61, 0x57, 0x02, 0xdf, 0xfd, 0xb7, + 0xf5, 0x7f, 0x54, 0xae, 0xa2, 0xb0, 0x5f, 0x58, + 0xda, 0x64, 0x2d, 0x5f, 0x69, 0x79, 0x18, 0x96, + 0x19, 0x37, 0xb4, 0xf2, 0x1e, 0xa8, 0x3b, 0xc1, + 0x1d, 0x50, 0xad, 0x15, 0x75, 0xf4, 0xc2, 0x26, + 0x3a, 0xba, 0x10, 0xf8, 0xeb, 0xce, 0x80, 0x74, + 0xac, 0x3c, 0x50, 0xc9, 0xb5, 0xc3, 0x94, 0x05, + 0x39, 0x1c, 0xd1, 0x49, 0x4e, 0x07, 0x03, 0x5d, + 0xa2, 0x8a, 0x8f, 0x35, 0xb5, 0xe6, 0x97, 0xbc, + 0x64, 0x53, 0xb9, 0xd7, 0x18, 0x99, 0x9d, 0xc3, + 0x0d, 0xc1, 0xde, 0xc2, 0x7e, 0x24, 0x9d, 0x43, + 0xdb, 0x52, 0xf6, 0x77, 0xf1, 0x3c, 0xb2, 0x7b, + 0x47, 0xb6, 0x48, 0x9c, 0xed, 0x8f, 0x69, 0xa8, + 0xa0, 0x1b, 0x42, 0x89, 0x8c, 0x89, 0x59, 0x11, + 0x7c, 0x43, 0x2b, 0x26, 0x8d, 0xb2, 0x30, 0xd5, + 0xae, 0x5f, 0x6a, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x14, 0x7e, 0xa0, 0xf5, 0x4c, + 0xff, 0x00, 0x27, 0xc6, 0x0a, 0x41, 0x47, 0xea, + 0x0f, 0x54, 0xcf, 0xf2, 0x7c, 0x60, 0xaf, 0x6f, + 0x6e, 0x9d, 0x30, 0xcb, 0x13, 0xc0, 0xbb, 0xb9, + 0x5e, 0xa7, 0xba, 0x57, 0xd5, 0x0d, 0xf0, 0xdf, + 0xdb, 0x52, 0xcf, 0xdc, 0xa2, 0x74, 0xaf, 0xaa, + 0x1b, 0xe1, 0xbf, 0xb6, 0xa5, 0x9f, 0xb9, 0x4d, + 0xde, 0x2d, 0x7b, 0xd2, 0x8c, 0x37, 0x02, 0xde, + 0xec, 0x39, 0xcd, 0xd7, 0xf9, 0x3c, 0x79, 0x56, + 0x7d, 0x88, 0x57, 0xf5, 0x40, 0xba, 0xff, 0x00, + 0x27, 0x8f, 0x2a, 0xcf, 0xb1, 0x0a, 0xfe, 0xb9, + 0x6c, 0xe7, 0xaf, 0x7e, 0x5e, 0xc7, 0xc5, 0x33, + 0x60, 0xff, 0x00, 0x8d, 0x6c, 0x44, 0x45, 0xb3, + 0xcd, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x45, 0xdc, 0xe4, 0xe4, 0x2f, 0xe8, 0xe0, + 0x3c, 0x14, 0x24, 0x39, 0xc7, 0x7f, 0xb8, 0xb6, + 0xef, 0x2e, 0x7a, 0x38, 0xdc, 0xd6, 0x1e, 0xee, + 0x9b, 0x69, 0xbc, 0x05, 0x5d, 0xbd, 0x82, 0x6b, + 0xd6, 0x9b, 0x3c, 0x7b, 0x83, 0x6e, 0x64, 0x1f, + 0x58, 0x6a, 0x44, 0x60, 0xef, 0x7b, 0xfe, 0x04, + 0x1f, 0x72, 0xdc, 0x19, 0x9e, 0x62, 0x63, 0x45, + 0xcd, 0xd3, 0xaa, 0x18, 0xc6, 0x11, 0xc4, 0x7a, + 0xee, 0x3f, 0x14, 0x0e, 0xba, 0xcf, 0x8b, 0xd2, + 0x36, 0x91, 0x5c, 0x9c, 0x8e, 0x4e, 0x97, 0xb7, + 0xce, 0x3c, 0x4c, 0x0f, 0xdb, 0x14, 0x5d, 0x41, + 0x1b, 0x0e, 0xfa, 0x7e, 0x91, 0x52, 0x18, 0x4c, + 0x1d, 0x96, 0x1a, 0xd7, 0xa0, 0xb6, 0x05, 0xf2, + 0x3b, 0xba, 0x9e, 0xe1, 0xfb, 0x64, 0x91, 0xdc, + 0xa5, 0xc7, 0xb4, 0x14, 0x8a, 0x9c, 0xb9, 0x33, + 0x02, 0x22, 0x28, 0x04, 0x44, 0x40, 0x44, 0xda, + 0xbd, 0x0d, 0x71, 0xe4, 0x41, 0xe2, 0x2f, 0xae, + 0x8c, 0xf2, 0xaf, 0x43, 0x02, 0x0d, 0x6b, 0xbb, + 0x4b, 0x5b, 0xd8, 0x1d, 0x6d, 0x77, 0x13, 0x27, + 0x85, 0xfd, 0xf4, 0x6f, 0x15, 0x05, 0x51, 0xb3, + 0x1a, 0x3b, 0x29, 0x84, 0x2f, 0xbf, 0xd3, 0x72, + 0x3e, 0x5b, 0x60, 0x78, 0xe5, 0xb1, 0x27, 0x89, + 0xc0, 0x0d, 0xb5, 0x67, 0xe9, 0x8f, 0x7f, 0x9d, + 0x74, 0x17, 0x3e, 0x18, 0xc5, 0x5e, 0xe6, 0xb4, + 0x75, 0x49, 0x01, 0x69, 0xcd, 0x9e, 0xc5, 0x41, + 0xb1, 0xd3, 0x87, 0x11, 0xf1, 0x63, 0xab, 0xcf, + 0x61, 0xaa, 0x62, 0xa9, 0x84, 0x4c, 0x2a, 0x7a, + 0x7f, 0x30, 0xec, 0x9c, 0x42, 0xe6, 0x86, 0x29, + 0xe3, 0x34, 0x70, 0xdc, 0x09, 0x1d, 0x45, 0x6c, + 0xb5, 0xbe, 0x8e, 0x66, 0x77, 0x64, 0x36, 0x46, + 0xf7, 0xcd, 0x2a, 0x03, 0x2b, 0x88, 0x82, 0xfb, + 0x8b, 0x37, 0xa7, 0x1e, 0x0d, 0xd3, 0x4d, 0x6e, + 0x6d, 0x9b, 0xb0, 0x4b, 0xd5, 0xee, 0x4d, 0x38, + 0x64, 0xed, 0xac, 0x38, 0xec, 0xbd, 0xa5, 0xeb, + 0x18, 0x1a, 0x43, 0x6e, 0x80, 0xfe, 0x2c, 0x0e, + 0x34, 0x78, 0xa6, 0xc3, 0x50, 0x76, 0xa4, 0xf5, + 0xc6, 0x62, 0x16, 0xf4, 0x5a, 0x58, 0xcb, 0xbe, + 0x96, 0x21, 0x13, 0xcf, 0xf1, 0x1a, 0xd0, 0x7d, + 0xc2, 0xb7, 0x54, 0x24, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x1b, 0xc2, 0x20, 0xde, + 0x10, 0x50, 0x34, 0x6f, 0xf7, 0xc5, 0xf7, 0x35, + 0xc7, 0xda, 0x05, 0xd2, 0x17, 0x37, 0xd1, 0xbf, + 0xdf, 0x17, 0xdc, 0xd7, 0x1f, 0x68, 0x17, 0x48, + 0x58, 0xe1, 0xf6, 0x3c, 0xe9, 0x7a, 0x7f, 0x19, + 0xe6, 0x69, 0xf5, 0x56, 0xf5, 0x22, 0xf3, 0x7f, + 0x53, 0x1f, 0x87, 0xf0, 0x15, 0x9a, 0xd3, 0xd1, + 0xa2, 0xf0, 0x47, 0x69, 0x61, 0xcd, 0xfd, 0x4c, + 0x7e, 0x1f, 0xc0, 0x56, 0x6b, 0x4f, 0x46, 0x8b, + 0xc1, 0x1d, 0xa5, 0xc5, 0x67, 0xfb, 0x3c, 0x47, + 0xaa, 0xa1, 0xc7, 0x57, 0x2f, 0x6f, 0x7e, 0x59, + 0x51, 0x11, 0x7a, 0x6c, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x5a, 0xb7, 0xb7, 0xa2, + 0xdc, 0x70, 0x81, 0x57, 0x91, 0xb2, 0xbb, 0x96, + 0xc4, 0x92, 0x32, 0x36, 0xf1, 0x38, 0x80, 0x39, + 0x3a, 0xe5, 0x41, 0x64, 0x2e, 0x62, 0xe2, 0x7c, + 0xb7, 0x04, 0x37, 0x87, 0x70, 0x71, 0xd9, 0x4e, + 0x40, 0x29, 0xca, 0x83, 0xe2, 0xee, 0xfd, 0xd4, + 0x0e, 0xba, 0x95, 0x9d, 0x1d, 0x09, 0x70, 0x7d, + 0x00, 0x00, 0x0d, 0xe0, 0x28, 0xc7, 0xe0, 0x2e, + 0xf5, 0x24, 0x8c, 0xe3, 0x73, 0xac, 0x71, 0x0c, + 0x25, 0xc4, 0x8d, 0x92, 0x4d, 0xc9, 0xdc, 0xb4, + 0xee, 0x6f, 0x5c, 0xad, 0x8c, 0x36, 0x94, 0x37, + 0x57, 0xc7, 0x31, 0x99, 0xac, 0x80, 0x3a, 0xb6, + 0x56, 0x6f, 0xdc, 0xc6, 0xf2, 0x3a, 0x41, 0xfa, + 0x5d, 0x65, 0x6d, 0x56, 0xcd, 0x99, 0x0d, 0x3c, + 0x5e, 0x1f, 0x1b, 0x88, 0x83, 0xcd, 0xf1, 0xf0, + 0x36, 0x16, 0x7c, 0x67, 0x01, 0x57, 0xbb, 0xae, + 0xe7, 0x9d, 0xa5, 0x6e, 0x22, 0x2a, 0xa4, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x18, 0x6e, + 0xad, 0x2d, 0x6f, 0x20, 0x75, 0xbd, 0xdc, 0x4c, + 0x9e, 0x17, 0xec, 0x73, 0x24, 0x1c, 0x43, 0xdf, + 0x54, 0x3c, 0xf7, 0xb3, 0xfb, 0xab, 0x09, 0x0e, + 0x4b, 0x4d, 0xc8, 0xfa, 0xc7, 0x57, 0x1b, 0x6e, + 0x2f, 0xe2, 0x37, 0xc9, 0x3f, 0xe3, 0x78, 0x27, + 0xdf, 0x5d, 0x09, 0x14, 0xc5, 0x53, 0x08, 0x98, + 0xca, 0xe7, 0x5a, 0x7f, 0x53, 0x0c, 0x87, 0xff, + 0x00, 0x8f, 0xc8, 0x30, 0xc3, 0x7a, 0xca, 0xd2, + 0x46, 0x8e, 0x16, 0xbc, 0x8d, 0xe1, 0xed, 0xf8, + 0xae, 0xf7, 0x95, 0xc7, 0x1f, 0x7b, 0xd1, 0x06, + 0xc1, 0x33, 0xaa, 0xc3, 0xde, 0x3f, 0xe0, 0x51, + 0xfa, 0xa3, 0x46, 0xc7, 0x95, 0x06, 0xfa, 0xc2, + 0x96, 0xf9, 0x46, 0x6d, 0xe3, 0xdc, 0xd9, 0x69, + 0xf1, 0x64, 0xeb, 0xf5, 0x1c, 0xa0, 0x70, 0xb9, + 0xe2, 0xc7, 0xbf, 0x1f, 0x97, 0xff, 0x00, 0xe3, + 0xdd, 0x40, 0x43, 0x0f, 0x4b, 0xdc, 0xd1, 0xe3, + 0x67, 0x09, 0xaf, 0x2f, 0x51, 0x4c, 0xc4, 0x4f, + 0x4c, 0x78, 0x11, 0x97, 0x27, 0x44, 0xba, 0x0b, + 0x5c, 0xd7, 0x77, 0xa4, 0x10, 0x3a, 0x8b, 0xd5, + 0x0d, 0x63, 0x76, 0x60, 0x98, 0xb6, 0x41, 0xc2, + 0xca, 0x00, 0x47, 0x5c, 0xd6, 0x85, 0x4c, 0xaa, + 0xac, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x8c, 0xcb, 0x7d, 0x74, 0x3c, + 0xc7, 0xb6, 0xa6, 0xdb, 0xde, 0x8e, 0x65, 0x09, + 0x96, 0xfa, 0xe8, 0x79, 0x8f, 0x6d, 0x4d, 0xb7, + 0xbd, 0x1c, 0xcb, 0xce, 0xc1, 0xf3, 0xd8, 0xed, + 0x36, 0xbf, 0x4c, 0xba, 0x2e, 0xf0, 0x6c, 0xe8, + 0xab, 0x5b, 0x0d, 0xe7, 0xa2, 0xcd, 0xe4, 0xdf, + 0xe2, 0x95, 0x52, 0xd0, 0x9b, 0xaf, 0x3f, 0x95, + 0xf3, 0xd5, 0xb6, 0xf3, 0xd1, 0x66, 0xf2, 0x6f, + 0xf1, 0x4a, 0xa9, 0x68, 0x4d, 0xd7, 0x9f, 0xca, + 0xf9, 0xeb, 0xd5, 0xa7, 0x62, 0xae, 0xf3, 0x86, + 0xbe, 0x35, 0xaf, 0x39, 0x6b, 0x44, 0x45, 0x9b, + 0x61, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x16, 0x3b, 0x89, 0x9b, 0x04, 0x66, 0x47, 0x56, + 0x83, 0xa8, 0xb2, 0x6e, 0xdb, 0xd4, 0x51, 0x79, + 0x2b, 0x96, 0x3c, 0x35, 0x9b, 0xe1, 0xdf, 0x5e, + 0x42, 0x42, 0x0c, 0x17, 0x39, 0x0b, 0x89, 0x18, + 0xf7, 0x07, 0xb5, 0x91, 0x8e, 0x43, 0x4a, 0x1e, + 0x72, 0x77, 0x28, 0x0c, 0x8d, 0xd5, 0xcd, 0xeb, + 0xce, 0x33, 0x0a, 0xce, 0x96, 0xf6, 0x56, 0xd1, + 0xf2, 0x46, 0x68, 0xc8, 0xc1, 0xd8, 0x4b, 0x9d, + 0xb8, 0x2c, 0x59, 0x0c, 0x75, 0xe6, 0xa3, 0xc8, + 0x33, 0x1f, 0x63, 0x2f, 0x47, 0x63, 0x09, 0xad, + 0xe4, 0xe0, 0x77, 0x02, 0xbb, 0x83, 0x7f, 0x49, + 0xc7, 0xa8, 0xae, 0x78, 0xac, 0x45, 0x86, 0x22, + 0xd1, 0xb6, 0x96, 0x31, 0xf0, 0x30, 0x77, 0xce, + 0x3b, 0x5e, 0xf3, 0xfa, 0x4f, 0x77, 0x29, 0x56, + 0xe8, 0x8e, 0x9e, 0xea, 0x33, 0xa0, 0xb0, 0x1a, + 0x03, 0x19, 0x8d, 0xe1, 0xb9, 0xbf, 0xa5, 0xfd, + 0xf6, 0xf2, 0xe7, 0x8a, 0xc4, 0xd3, 0xfa, 0xac, + 0x3b, 0xf9, 0xdc, 0xad, 0x3b, 0x85, 0x06, 0xe1, + 0xb8, 0x22, 0x28, 0x99, 0x99, 0xce, 0x98, 0x8c, + 0x82, 0x22, 0x28, 0x04, 0x44, 0x40, 0x45, 0xe8, + 0x04, 0xf2, 0x2f, 0x44, 0x6e, 0xea, 0x20, 0xf8, + 0x20, 0x10, 0x5a, 0x40, 0x20, 0xec, 0x20, 0xed, + 0x04, 0x75, 0xd5, 0x4b, 0x50, 0xfb, 0x3c, 0xc7, + 0x64, 0x03, 0xae, 0x31, 0x9c, 0x36, 0x37, 0x7b, + 0xcb, 0x07, 0xd4, 0xbc, 0xf5, 0xda, 0x3b, 0xc3, + 0xd7, 0x1d, 0x85, 0x71, 0xe8, 0xfa, 0xa5, 0x7d, + 0x70, 0x34, 0x6d, 0xdf, 0xd7, 0x2a, 0x62, 0x66, + 0x33, 0x19, 0x32, 0xb9, 0x3d, 0x8e, 0x77, 0x2b, + 0x82, 0xbc, 0xfc, 0x2b, 0x3f, 0x0c, 0x8e, 0x68, + 0x01, 0xad, 0x90, 0xed, 0x95, 0x8d, 0xdd, 0xc4, + 0xc7, 0x7f, 0xea, 0x31, 0x5d, 0x6c, 0x2e, 0x84, + 0x04, 0xcb, 0x13, 0xba, 0x48, 0x5f, 0xb4, 0xd3, + 0xf4, 0x77, 0xd5, 0x48, 0x66, 0xb1, 0x38, 0x7c, + 0xe4, 0x06, 0xc6, 0xec, 0xb0, 0xc8, 0x36, 0xc4, + 0xf6, 0x91, 0xd2, 0xc6, 0xef, 0xd2, 0x67, 0x2a, + 0xa2, 0x34, 0xe4, 0xb4, 0xa6, 0x49, 0xb8, 0xec, + 0x91, 0x32, 0xd9, 0xca, 0x6b, 0x05, 0xc0, 0xd8, + 0xd7, 0x37, 0xab, 0xd6, 0x23, 0x94, 0x2b, 0x74, + 0x55, 0x9b, 0x3e, 0xb4, 0x66, 0x74, 0x68, 0xe7, + 0x8a, 0x56, 0x87, 0x31, 0xc0, 0xf1, 0x6d, 0x1d, + 0x55, 0xf6, 0xab, 0x76, 0x97, 0x91, 0xbc, 0x47, + 0x71, 0x68, 0xe6, 0xbe, 0x27, 0xb8, 0x70, 0x48, + 0xd3, 0x56, 0x9a, 0x56, 0xa3, 0x62, 0xb0, 0xc1, + 0x33, 0x27, 0x89, 0xb2, 0x33, 0x71, 0x54, 0x4b, + 0xed, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x04, 0x76, 0xa3, 0xf5, 0x1d, 0xe7, + 0x93, 0xf9, 0xcd, 0x5a, 0xfa, 0x1b, 0xd4, 0xce, + 0xf2, 0xef, 0xed, 0x35, 0x6c, 0x6a, 0x3f, 0x51, + 0xde, 0x79, 0x3f, 0x9c, 0xd5, 0xaf, 0xa1, 0xbd, + 0x4c, 0xef, 0x2e, 0xfe, 0xd3, 0x55, 0xe3, 0x87, + 0x3a, 0x58, 0xcf, 0x31, 0x4e, 0xe4, 0xeb, 0x58, + 0x91, 0x11, 0x51, 0xb0, 0x88, 0x88, 0x08, 0x88, + 0x80, 0xb5, 0x72, 0x1e, 0x85, 0x73, 0xe4, 0x9f, + 0xe2, 0x95, 0xb4, 0xb5, 0x72, 0x1e, 0x85, 0x73, + 0xe4, 0x9f, 0xe2, 0x95, 0x34, 0xe7, 0x85, 0x6e, + 0x6c, 0x55, 0xa2, 0x75, 0x20, 0xb4, 0x9f, 0xa3, + 0xdc, 0x78, 0x6d, 0xf1, 0x54, 0xf2, 0x81, 0xd2, + 0x7e, 0x8f, 0x71, 0xe1, 0xb7, 0xc5, 0x53, 0xcb, + 0x4c, 0x47, 0x16, 0xad, 0x3f, 0x73, 0x0c, 0x0f, + 0x2d, 0x6f, 0x44, 0xeb, 0x11, 0x11, 0x64, 0xe9, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x14, 0x3e, 0x46, + 0xe9, 0xf2, 0x4a, 0xe8, 0xc5, 0x44, 0x71, 0x6d, + 0x71, 0x07, 0x67, 0xba, 0xb7, 0xb2, 0x13, 0x3e, + 0x2b, 0x7a, 0xb0, 0xd1, 0xc7, 0x67, 0xb9, 0xd5, + 0x54, 0xbd, 0x4f, 0x7d, 0x75, 0x1c, 0x10, 0xd8, + 0xd9, 0x02, 0x6e, 0xf2, 0x0f, 0x31, 0x46, 0xc1, + 0xb4, 0xba, 0xb4, 0xee, 0xbb, 0x25, 0x4c, 0x46, + 0x59, 0xc8, 0x4b, 0x5e, 0x3b, 0xcc, 0x9e, 0xa0, + 0xce, 0xbb, 0x1f, 0x8a, 0x79, 0x8a, 0xd5, 0x8d, + 0x2d, 0xbb, 0x9e, 0x80, 0x80, 0xca, 0xed, 0x3c, + 0xe7, 0x70, 0x57, 0xeb, 0x0b, 0x0b, 0x5c, 0x75, + 0xa4, 0x76, 0x96, 0xac, 0xe0, 0x8a, 0x31, 0xb3, + 0xaa, 0x49, 0xde, 0xe7, 0x1e, 0x52, 0x79, 0x56, + 0x96, 0x9a, 0xc0, 0x41, 0x82, 0xc6, 0x32, 0xd5, + 0x94, 0x7c, 0xef, 0xee, 0xee, 0x66, 0x1f, 0x1e, + 0x43, 0xbf, 0xdc, 0x1b, 0x82, 0x95, 0x4a, 0xa7, + 0x2f, 0x44, 0x66, 0x84, 0x44, 0x75, 0x88, 0x88, + 0xa1, 0x22, 0x22, 0x20, 0x22, 0x22, 0x02, 0x2f, + 0x43, 0x5c, 0x79, 0x17, 0xa2, 0x37, 0x73, 0x20, + 0xf9, 0x45, 0x90, 0x46, 0x39, 0x4a, 0x1e, 0x89, + 0x82, 0xae, 0x20, 0x0e, 0xa9, 0x34, 0x41, 0x8c, + 0x0a, 0xaf, 0x43, 0x1c, 0x79, 0x16, 0xbc, 0xf9, + 0xac, 0x5d, 0xbe, 0xc9, 0x2e, 0x19, 0x5e, 0xa3, + 0x4d, 0x4f, 0xbc, 0xb0, 0x45, 0xa9, 0xf1, 0x32, + 0x4c, 0x22, 0x2f, 0x7c, 0x5c, 0x44, 0x06, 0xbe, + 0x46, 0x16, 0xb0, 0x93, 0xb8, 0x71, 0x1d, 0x89, + 0x90, 0xca, 0xdb, 0xba, 0xb1, 0x82, 0xf2, 0xda, + 0x4b, 0x5b, 0xa6, 0x36, 0x58, 0x65, 0x69, 0x6b, + 0xe3, 0x76, 0xe2, 0x0a, 0xe6, 0x57, 0x36, 0xf7, + 0x9a, 0x27, 0x34, 0x22, 0x71, 0x74, 0xd8, 0x9b, + 0xa2, 0x4c, 0x4f, 0x3d, 0x4e, 0x50, 0x7a, 0x8f, + 0x6a, 0xea, 0xc0, 0x82, 0x2a, 0x37, 0x15, 0x17, + 0x9d, 0xc3, 0x5a, 0xe6, 0xb1, 0xf3, 0x58, 0x5c, + 0x8a, 0x07, 0xed, 0x8e, 0x4e, 0x56, 0x3c, 0x77, + 0xaf, 0x1c, 0xca, 0xd4, 0xce, 0x4e, 0x89, 0xcd, + 0x28, 0x98, 0xcb, 0x99, 0xab, 0x89, 0xbb, 0x11, + 0x47, 0x1b, 0x1e, 0xe0, 0x59, 0x20, 0xe2, 0x63, + 0x86, 0xd1, 0x43, 0xcb, 0xd8, 0x53, 0x00, 0x83, + 0xb4, 0x6d, 0x0b, 0x9d, 0x69, 0xab, 0x9b, 0xbb, + 0x6b, 0x89, 0xf4, 0xfe, 0x46, 0xad, 0xb8, 0xb1, + 0xa8, 0x65, 0x4f, 0x7c, 0xc1, 0xd4, 0xae, 0xf1, + 0xca, 0x3a, 0xca, 0xf1, 0x8a, 0x98, 0x49, 0x01, + 0x65, 0x76, 0xc6, 0x69, 0xb5, 0x45, 0x51, 0x92, + 0x53, 0x0d, 0xd4, 0x44, 0x50, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x0a, 0x3f, 0x50, 0x7a, 0xa6, 0x7f, + 0x93, 0xe3, 0x05, 0x20, 0xa3, 0xf5, 0x07, 0xaa, + 0x67, 0xf9, 0x3e, 0x30, 0x57, 0xb7, 0xb7, 0x4e, + 0x98, 0x65, 0x89, 0xe0, 0x5d, 0xdc, 0xaf, 0x53, + 0xdd, 0x2b, 0xea, 0x86, 0xf8, 0x6f, 0xed, 0xa9, + 0x67, 0xee, 0x51, 0x3a, 0x57, 0xd5, 0x0d, 0xf0, + 0xdf, 0xdb, 0x52, 0xcf, 0xdc, 0xa6, 0xef, 0x16, + 0xbd, 0xe9, 0x46, 0x1b, 0x81, 0x6f, 0x76, 0x1c, + 0xe6, 0xeb, 0xfc, 0x9e, 0x3c, 0xab, 0x3e, 0xc4, + 0x2b, 0xfa, 0xa0, 0x5d, 0x7f, 0x93, 0xc7, 0x95, + 0x67, 0xd8, 0x85, 0x7f, 0x5c, 0xb6, 0x73, 0xd7, + 0xbf, 0x2f, 0x63, 0xe2, 0x99, 0xb0, 0x7f, 0xc6, + 0xb6, 0x22, 0x22, 0xd9, 0xe6, 0x88, 0x88, 0x80, + 0x88, 0x88, 0x0b, 0x53, 0x23, 0x72, 0xe8, 0x22, + 0x01, 0x9b, 0x5e, 0xf3, 0x41, 0x43, 0xb5, 0x6d, + 0x13, 0x40, 0x4e, 0xea, 0x0d, 0xea, 0xb9, 0x92, + 0xbc, 0x2c, 0x8e, 0x7b, 0x99, 0x8d, 0x04, 0x4c, + 0x73, 0xb8, 0xb6, 0x77, 0x21, 0xa0, 0xf2, 0x20, + 0x89, 0xcc, 0x5e, 0x5d, 0xcb, 0x3c, 0x58, 0xab, + 0x00, 0xe7, 0xdf, 0x5c, 0xba, 0x8c, 0xaf, 0xc5, + 0xa7, 0x7c, 0xf7, 0x9e, 0x46, 0xb7, 0x95, 0x5b, + 0xf1, 0xb8, 0xf6, 0xd8, 0xc0, 0x1a, 0xe7, 0xf4, + 0xd7, 0x0f, 0x00, 0xcf, 0x39, 0x14, 0x2f, 0x77, + 0x57, 0xac, 0x3a, 0x81, 0x45, 0xe9, 0x2c, 0x24, + 0xd6, 0xf0, 0xbf, 0x2b, 0x7e, 0xda, 0x64, 0x6f, + 0x80, 0x71, 0x07, 0x7c, 0x51, 0x6f, 0x64, 0x7d, + 0x63, 0xca, 0xe5, 0x62, 0x11, 0x8e, 0x52, 0xa6, + 0x7a, 0xa1, 0x10, 0xf8, 0x45, 0x90, 0x31, 0xbc, + 0xeb, 0x1c, 0xd7, 0x16, 0xd6, 0xed, 0x2e, 0x9a, + 0x46, 0x44, 0x06, 0xf2, 0xe2, 0x07, 0x6d, 0x42, + 0x5e, 0x80, 0x4f, 0x22, 0xf4, 0x30, 0xa8, 0xdb, + 0x9d, 0x53, 0x85, 0x80, 0x13, 0xd3, 0xf4, 0xb4, + 0xff, 0x00, 0x6c, 0x17, 0x0e, 0xce, 0xe5, 0x05, + 0x7f, 0xed, 0x37, 0x11, 0x6f, 0x5e, 0x8c, 0x36, + 0xa3, 0xfd, 0xc7, 0x8a, 0xfe, 0xcb, 0x38, 0x90, + 0x5c, 0x44, 0x63, 0x95, 0x0b, 0x58, 0xd1, 0xfe, + 0xab, 0x95, 0xdf, 0xfb, 0x5b, 0x95, 0xc0, 0x8b, + 0x6a, 0x8f, 0x26, 0xc0, 0x3f, 0x7a, 0x42, 0x7b, + 0x4a, 0xb9, 0x7d, 0xed, 0x0b, 0x33, 0x75, 0x51, + 0x57, 0x50, 0xee, 0x32, 0x3c, 0x9f, 0xdd, 0x6f, + 0x08, 0x41, 0xdb, 0xae, 0x32, 0x98, 0xeb, 0x51, + 0xfc, 0x7b, 0x88, 0xe3, 0xa7, 0x21, 0x70, 0xaf, + 0x61, 0x45, 0x5d, 0xeb, 0x6c, 0x2d, 0xb0, 0x24, + 0x3d, 0xd2, 0x53, 0x94, 0x0e, 0x11, 0xd9, 0x7d, + 0x17, 0x0d, 0x9b, 0x3f, 0x97, 0x98, 0x9e, 0x2b, + 0x82, 0xc0, 0x77, 0x88, 0xc0, 0x6f, 0x69, 0x68, + 0xc9, 0x24, 0x92, 0x1e, 0x29, 0x1e, 0xe7, 0x93, + 0xca, 0xe2, 0x4f, 0x6d, 0x4a, 0x1d, 0x7e, 0xff, + 0x00, 0xda, 0xbd, 0x8c, 0x55, 0x6c, 0x1d, 0x18, + 0x3c, 0xe6, 0x43, 0xfb, 0x82, 0x9e, 0xfa, 0xae, + 0x5f, 0xfb, 0x56, 0xc8, 0x4d, 0x56, 0xc3, 0xc7, + 0x4e, 0x42, 0x38, 0x63, 0x1f, 0x38, 0xaa, 0x0a, + 0xcb, 0x6b, 0x6d, 0x25, 0xd5, 0xcc, 0x76, 0xf1, + 0xf7, 0xd2, 0xb8, 0x37, 0xfd, 0x4a, 0x41, 0x2e, + 0x83, 0x80, 0xcb, 0x64, 0x32, 0x56, 0xcf, 0xbe, + 0xbd, 0x01, 0xcd, 0x7b, 0xb8, 0x61, 0x6b, 0x8b, + 0x9f, 0xbb, 0x7b, 0xbb, 0xa3, 0x45, 0x28, 0x6e, + 0x64, 0xa5, 0x03, 0x8b, 0x40, 0xe4, 0x6f, 0x72, + 0x3d, 0xe5, 0xa5, 0x6d, 0x14, 0x76, 0xb6, 0xf1, + 0xdb, 0xc4, 0x28, 0xc8, 0x9a, 0x1a, 0x3d, 0xc5, + 0xf6, 0x5e, 0xba, 0x29, 0x88, 0x88, 0x86, 0x13, + 0x33, 0x33, 0x95, 0x2f, 0x80, 0xbd, 0x7c, 0x39, + 0xbb, 0x6a, 0x9e, 0xe6, 0xe7, 0x8a, 0x19, 0x3a, + 0xe6, 0x84, 0xb2, 0xbc, 0xcb, 0xef, 0x5d, 0x69, + 0x79, 0x78, 0x8e, 0xa2, 0xc4, 0x37, 0x82, 0xf2, + 0x0e, 0xea, 0xea, 0x36, 0x7c, 0x76, 0x8f, 0xfd, + 0x41, 0xfa, 0xc0, 0x6f, 0xea, 0x85, 0x0a, 0xdb, + 0x87, 0x41, 0x24, 0x57, 0x0d, 0xdf, 0x6f, 0x23, + 0x25, 0x1f, 0x24, 0xed, 0xf7, 0x97, 0x4f, 0x0e, + 0x6c, 0x91, 0x87, 0x0d, 0xad, 0x70, 0xa8, 0xe6, + 0x2b, 0x2a, 0xff, 0x00, 0xf3, 0x56, 0x58, 0xee, + 0xb4, 0xa3, 0xa6, 0x26, 0x14, 0x9d, 0x31, 0x9b, + 0x39, 0x0b, 0x71, 0x7a, 0x28, 0x24, 0x84, 0x06, + 0x4e, 0xd1, 0xd5, 0x1b, 0x6b, 0x4e, 0xa1, 0x0a, + 0xdf, 0x0c, 0xcc, 0x99, 0x81, 0xec, 0x35, 0x07, + 0x93, 0x94, 0x2e, 0x7d, 0x9d, 0xb0, 0x7e, 0x93, + 0xcf, 0x36, 0xfe, 0xd4, 0x53, 0x13, 0x91, 0x77, + 0x0c, 0xac, 0x1b, 0xa3, 0x79, 0xda, 0xe6, 0xfc, + 0x2d, 0xec, 0x2b, 0x56, 0x36, 0x76, 0x47, 0x70, + 0xda, 0x1a, 0xb6, 0x51, 0xbc, 0x6e, 0x3d, 0x7d, + 0x8a, 0xb5, 0x47, 0x76, 0x33, 0x4a, 0xf1, 0xd4, + 0x9b, 0x44, 0x45, 0x54, 0x88, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x37, 0x84, 0x41, 0xbc, 0x20, 0xa0, + 0x68, 0xdf, 0xef, 0x8b, 0xee, 0x6b, 0x8f, 0xb4, + 0x0b, 0xa4, 0x2e, 0x6f, 0xa3, 0x7f, 0xbe, 0x2f, + 0xb9, 0xae, 0x3e, 0xd0, 0x2e, 0x90, 0xb1, 0xc3, + 0xec, 0x79, 0xd2, 0xf4, 0xfe, 0x33, 0xcc, 0xd3, + 0xea, 0xad, 0xea, 0x45, 0xe6, 0xfe, 0xa6, 0x3f, + 0x0f, 0xe0, 0x2b, 0x35, 0xa7, 0xa3, 0x45, 0xe0, + 0x8e, 0xd2, 0xc3, 0x9b, 0xfa, 0x98, 0xfc, 0x3f, + 0x80, 0xac, 0xd6, 0x9e, 0x8d, 0x17, 0x82, 0x3b, + 0x4b, 0x8a, 0xcf, 0xf6, 0x78, 0x8f, 0x55, 0x43, + 0x8e, 0xae, 0x5e, 0xde, 0xfc, 0xb2, 0xa2, 0x22, + 0xf4, 0xd8, 0x08, 0x88, 0x80, 0x88, 0x88, 0x0b, + 0xe5, 0xee, 0x0c, 0x61, 0x79, 0xf8, 0xa2, 0xab, + 0xe9, 0x46, 0x65, 0xa7, 0x78, 0x70, 0x88, 0x1e, + 0xe3, 0x7b, 0x86, 0xea, 0xf5, 0x90, 0x45, 0xe5, + 0x72, 0x7d, 0x0c, 0x2f, 0xbc, 0x98, 0x96, 0xb1, + 0xa0, 0xf0, 0xd7, 0x68, 0xd9, 0xd4, 0x58, 0xb4, + 0x9e, 0x36, 0xf2, 0xf6, 0x2f, 0xc5, 0x32, 0x75, + 0xf3, 0x77, 0xbf, 0xa5, 0xb1, 0xb5, 0x78, 0xda, + 0x2b, 0xba, 0x57, 0xf3, 0xfc, 0x51, 0xee, 0xad, + 0x68, 0xb1, 0xb2, 0x67, 0xb3, 0x6e, 0xb7, 0x9a, + 0xbf, 0x85, 0xe3, 0x8b, 0x1d, 0x70, 0xde, 0x47, + 0xca, 0x40, 0x73, 0x61, 0xe6, 0x1b, 0xdc, 0xae, + 0xa0, 0x00, 0x28, 0x36, 0x01, 0xb0, 0x05, 0x6c, + 0xdd, 0x1d, 0xd4, 0x77, 0x44, 0x44, 0x55, 0x48, + 0x89, 0x43, 0xd4, 0x5f, 0x5c, 0x0e, 0xea, 0x20, + 0xf9, 0x45, 0xf6, 0x23, 0xea, 0x95, 0xe3, 0xdd, + 0x0c, 0x42, 0xb2, 0x38, 0x34, 0x7e, 0xb1, 0x01, + 0x07, 0xca, 0xf4, 0x34, 0x9d, 0xc1, 0x68, 0xdc, + 0x6a, 0x3c, 0x25, 0xad, 0x43, 0xee, 0x58, 0x48, + 0xf8, 0xac, 0xee, 0x8f, 0xbc, 0xa1, 0xaf, 0xbd, + 0xa3, 0x61, 0xed, 0x41, 0xe0, 0x05, 0xdd, 0x42, + 0xf7, 0x06, 0x0f, 0x7f, 0x6a, 0x0b, 0x40, 0x8d, + 0xdc, 0xcb, 0xd1, 0x18, 0xe5, 0x2b, 0x9a, 0x5f, + 0xfb, 0x5b, 0x02, 0xa2, 0xdb, 0x81, 0xbd, 0x4e, + 0x06, 0x97, 0x9e, 0xc9, 0xa0, 0x55, 0xcb, 0xef, + 0x69, 0x59, 0x7b, 0x9a, 0x86, 0xba, 0x4a, 0x75, + 0xdd, 0xc0, 0x3b, 0x0c, 0x41, 0xda, 0xa5, 0xba, + 0xb2, 0xb7, 0x15, 0x9a, 0x66, 0x33, 0xc2, 0x70, + 0x5a, 0x32, 0x6a, 0x4c, 0x53, 0x2a, 0x22, 0x73, + 0xa7, 0x3d, 0x48, 0x9a, 0x4f, 0xbe, 0xb8, 0x9d, + 0x8e, 0x5f, 0x31, 0x97, 0xc8, 0xc5, 0x6f, 0xd2, + 0x06, 0xb5, 0xce, 0xab, 0xc8, 0x15, 0x21, 0xa3, + 0x69, 0xda, 0xea, 0xab, 0xb9, 0x99, 0xe4, 0x06, + 0x97, 0x1a, 0x01, 0x40, 0x2b, 0xc8, 0x16, 0x94, + 0x5b, 0xf2, 0xba, 0x72, 0xa9, 0x5d, 0x7e, 0x4a, + 0xd8, 0xdd, 0x5b, 0x6c, 0xd9, 0x29, 0x3d, 0xb4, + 0xb1, 0xc3, 0xcb, 0x2f, 0x72, 0x68, 0x3a, 0xae, + 0x68, 0x3c, 0x4b, 0x47, 0x59, 0xe9, 0x5b, 0x7d, + 0x43, 0x64, 0x32, 0x18, 0xfe, 0x13, 0x7f, 0x1b, + 0x38, 0xa2, 0x7b, 0x77, 0x4c, 0xcd, 0xe1, 0x84, + 0xf5, 0x7f, 0x44, 0xaa, 0xf8, 0x78, 0x05, 0x5b, + 0xb4, 0x6c, 0xfd, 0x26, 0x28, 0xc2, 0x77, 0xdb, + 0x4a, 0xe8, 0xe9, 0xd4, 0x1b, 0xc2, 0x57, 0x47, + 0x91, 0x92, 0x62, 0x51, 0x4d, 0x5e, 0x57, 0x44, + 0xaa, 0x5a, 0x53, 0x3b, 0x2d, 0xf4, 0x67, 0x0f, + 0x78, 0x78, 0x6f, 0xe0, 0x14, 0x81, 0xf2, 0x6c, + 0x2f, 0x6c, 0x7b, 0xd8, 0xef, 0xd7, 0x60, 0x0a, + 0xf3, 0x61, 0x76, 0xd7, 0xb7, 0xa2, 0x79, 0xfe, + 0x23, 0x36, 0x6d, 0xe5, 0x54, 0xcf, 0x68, 0x7a, + 0x76, 0x4b, 0x59, 0xdb, 0xa9, 0x31, 0xb5, 0x8d, + 0xed, 0x73, 0x4d, 0xd0, 0x66, 0xca, 0x3a, 0xbd, + 0xcc, 0xdf, 0x03, 0x96, 0xe6, 0x0f, 0x2a, 0xcc, + 0x95, 0x83, 0x2f, 0x2b, 0x49, 0x1a, 0x69, 0x33, + 0x45, 0x09, 0x6b, 0xdb, 0xbf, 0xb3, 0xc8, 0xab, + 0x54, 0x65, 0xff, 0x00, 0xd4, 0x77, 0x57, 0x8e, + 0xa5, 0xcd, 0x16, 0x3b, 0x79, 0x04, 0xb0, 0xb1, + 0xe3, 0xe3, 0x0f, 0x7d, 0x64, 0x55, 0x48, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x23, 0x32, + 0xdf, 0x5d, 0x0f, 0x31, 0xed, 0xa9, 0xb6, 0xf7, + 0xa3, 0x99, 0x42, 0x65, 0xbe, 0xba, 0x1e, 0x63, + 0xdb, 0x53, 0x6d, 0xef, 0x47, 0x32, 0xf3, 0xb0, + 0x7c, 0xf6, 0x3b, 0x4d, 0xaf, 0xd3, 0x2e, 0x8b, + 0xbc, 0x1b, 0x3a, 0x2a, 0xd6, 0xc3, 0x79, 0xe8, + 0xb3, 0x79, 0x37, 0xf8, 0xa5, 0x54, 0xb4, 0x26, + 0xeb, 0xcf, 0xe5, 0x7c, 0xf5, 0x6d, 0xbc, 0xf4, + 0x59, 0xbc, 0x9b, 0xfc, 0x52, 0xaa, 0x5a, 0x13, + 0x75, 0xe7, 0xf2, 0xbe, 0x7a, 0xf5, 0x69, 0xd8, + 0xab, 0xbc, 0xe1, 0xaf, 0x8d, 0x6b, 0xce, 0x5a, + 0xd1, 0x11, 0x66, 0xd8, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x5a, 0xf7, 0xf2, 0xba, 0x2b, 0x72, + 0xe6, 0x1a, 0x3b, 0x75, 0x7a, 0x9d, 0x74, 0x1a, + 0x39, 0x2b, 0xa7, 0x3a, 0x47, 0x44, 0x2a, 0x19, + 0x18, 0xab, 0x88, 0x3d, 0xbe, 0xa0, 0x55, 0x16, + 0x5d, 0x64, 0xf3, 0xb9, 0xdf, 0xc3, 0xf1, 0x52, + 0x18, 0xad, 0xe2, 0x69, 0x6d, 0xdd, 0xc5, 0x07, + 0x0b, 0x58, 0x77, 0x9f, 0x08, 0xee, 0x0b, 0x6b, + 0x51, 0xde, 0x5d, 0xc7, 0x04, 0x36, 0xb6, 0x40, + 0xba, 0xf2, 0xfe, 0x4e, 0x8a, 0x26, 0xb7, 0x6f, + 0x11, 0x23, 0x6b, 0xbd, 0xc5, 0x67, 0xd3, 0x7a, + 0x7e, 0x2c, 0x1e, 0x35, 0x96, 0x91, 0x8e, 0x39, + 0xdd, 0xdd, 0xdc, 0xcd, 0xca, 0xf9, 0x0e, 0xff, + 0x00, 0x70, 0x6e, 0x0a, 0xd1, 0xd1, 0x19, 0x7b, + 0xbd, 0xc8, 0x46, 0x79, 0x6d, 0xd8, 0x58, 0x5a, + 0xe3, 0xed, 0x19, 0x69, 0x6a, 0xce, 0x08, 0xa3, + 0xec, 0x92, 0x77, 0xb9, 0xc7, 0x94, 0x95, 0xb0, + 0xbe, 0xc4, 0x67, 0x97, 0x62, 0xf4, 0x46, 0x39, + 0x76, 0xaa, 0xa5, 0x8d, 0x00, 0x27, 0x72, 0xfb, + 0x73, 0xa1, 0x88, 0x71, 0x3d, 0xc1, 0x83, 0xaa, + 0xe2, 0x07, 0x6d, 0x69, 0x4f, 0xa8, 0x70, 0xf6, + 0xf5, 0x0f, 0xb9, 0x61, 0x23, 0x91, 0x9d, 0xd1, + 0xf7, 0x90, 0x6e, 0x06, 0x38, 0xf2, 0x2f, 0x44, + 0x67, 0x94, 0xd1, 0x56, 0x6f, 0xfd, 0xa1, 0xe1, + 0xed, 0x47, 0x72, 0x0b, 0x8f, 0x55, 0xe4, 0x30, + 0x7b, 0xea, 0xbd, 0x7f, 0xed, 0x6e, 0x16, 0x82, + 0x2d, 0xb8, 0x01, 0xfd, 0x50, 0x5e, 0x7f, 0xd1, + 0x07, 0x48, 0x11, 0xb7, 0x97, 0x6a, 0xf9, 0x96, + 0x7b, 0x68, 0x07, 0x14, 0x8f, 0x64, 0x60, 0x72, + 0xb8, 0x80, 0xb8, 0xbd, 0xef, 0xb5, 0x0c, 0xb4, + 0xf5, 0x11, 0x99, 0x0e, 0xfa, 0x55, 0xc1, 0x83, + 0xb0, 0xda, 0xa8, 0x1b, 0x9d, 0x57, 0x98, 0xb8, + 0x35, 0x32, 0x06, 0x75, 0x29, 0x57, 0x1e, 0xcb, + 0xaa, 0x88, 0x77, 0x6b, 0x9d, 0x4f, 0x85, 0xb7, + 0xd8, 0xeb, 0x80, 0xf3, 0xd4, 0x60, 0x2e, 0xed, + 0x28, 0x5b, 0xef, 0x69, 0x38, 0x8b, 0x6d, 0x8d, + 0x03, 0x9d, 0xef, 0x6b, 0x7d, 0xe1, 0x52, 0xb8, + 0x9c, 0xd9, 0x0b, 0xe9, 0xf6, 0x4d, 0x71, 0x23, + 0xc1, 0xe4, 0xe2, 0x20, 0x76, 0x02, 0xd7, 0xa0, + 0x53, 0xd0, 0x74, 0xba, 0x95, 0xef, 0xb5, 0xc2, + 0xe3, 0xc1, 0x6a, 0xd1, 0xc4, 0x4d, 0x07, 0x46, + 0xc2, 0xed, 0xa7, 0xae, 0xfe, 0x15, 0x20, 0x72, + 0xd7, 0xb3, 0x44, 0xc7, 0x5c, 0x4b, 0x2b, 0xa4, + 0x20, 0x17, 0xb4, 0xbf, 0x85, 0xb5, 0x3c, 0x94, + 0x60, 0x1d, 0xb5, 0xcd, 0xb4, 0xae, 0x3c, 0x5d, + 0x64, 0x84, 0xf2, 0x0a, 0xc5, 0x6b, 0xfc, 0x47, + 0x57, 0x71, 0x77, 0xc5, 0x0a, 0xf4, 0x5f, 0x5d, + 0xab, 0x4b, 0x74, 0xc6, 0x49, 0x99, 0x85, 0x2e, + 0x55, 0x39, 0x72, 0x44, 0xb3, 0x71, 0x44, 0x5e, + 0x1f, 0xd1, 0xb5, 0xae, 0x1b, 0x9e, 0xda, 0x87, + 0x8e, 0x67, 0xd6, 0xaa, 0xcb, 0x61, 0x0c, 0x1a, + 0x9f, 0x4f, 0xcb, 0x65, 0x94, 0x1d, 0x2b, 0xa3, + 0x7b, 0xa2, 0x32, 0xee, 0x70, 0x73, 0x7b, 0xc9, + 0x1a, 0x79, 0x1c, 0xaa, 0x45, 0xea, 0xc5, 0xa2, + 0x2e, 0x29, 0x79, 0x7b, 0x6c, 0x4f, 0xd6, 0x35, + 0x93, 0x34, 0x73, 0x77, 0x25, 0x4d, 0xca, 0x62, + 0x23, 0x2c, 0x46, 0x49, 0x8e, 0xa4, 0x5b, 0x99, + 0xcb, 0x92, 0x65, 0x53, 0xb4, 0x9a, 0xfb, 0x46, + 0xe6, 0x9f, 0x8b, 0xc9, 0x12, 0xfb, 0x09, 0x5d, + 0xc5, 0xc6, 0x06, 0xca, 0x1d, 0x8d, 0x9e, 0x3e, + 0xd3, 0x82, 0xbf, 0x63, 0x6e, 0x3c, 0xda, 0x91, + 0xc8, 0xe6, 0xba, 0x39, 0x7b, 0xa6, 0x39, 0xa6, + 0xad, 0x20, 0xed, 0x04, 0x1e, 0x62, 0x9a, 0xbb, + 0x4e, 0x43, 0x9e, 0xc6, 0x98, 0x68, 0x1b, 0x77, + 0x10, 0x2e, 0xb5, 0x94, 0xf2, 0x3f, 0xf4, 0x4f, + 0xea, 0xbb, 0x71, 0x54, 0xad, 0x21, 0x94, 0x9f, + 0x89, 0xf8, 0x5b, 0xde, 0x26, 0x4d, 0x6d, 0xc4, + 0x22, 0x6b, 0xb7, 0x80, 0xd3, 0x47, 0x47, 0xb7, + 0x95, 0xaa, 0x93, 0xff, 0x00, 0xa8, 0xcb, 0xdd, + 0x8c, 0xed, 0x23, 0xa2, 0x72, 0x3a, 0x58, 0x20, + 0x8a, 0x83, 0x50, 0x77, 0x10, 0xbd, 0x5a, 0x18, + 0x99, 0x83, 0xe1, 0x74, 0x7b, 0x7b, 0x82, 0xb7, + 0xd5, 0x12, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x08, 0xed, 0x47, 0xea, 0x3b, 0xcf, 0x27, + 0xf3, 0x9a, 0xb5, 0xf4, 0x37, 0xa9, 0x9d, 0xe5, + 0xdf, 0xda, 0x6a, 0xd8, 0xd4, 0x7e, 0xa3, 0xbc, + 0xf2, 0x7f, 0x39, 0xab, 0x5f, 0x43, 0x7a, 0x99, + 0xde, 0x5d, 0xfd, 0xa6, 0xab, 0xc7, 0x0e, 0x74, + 0xb1, 0x9e, 0x62, 0x9d, 0xc9, 0xd6, 0xb1, 0x22, + 0x22, 0xa3, 0x61, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x6a, 0xe4, 0x3d, 0x0a, 0xe7, 0xc9, 0x3f, 0xc5, + 0x2b, 0x69, 0x6a, 0xe4, 0x3d, 0x0a, 0xe7, 0xc9, + 0x3f, 0xc5, 0x2a, 0x69, 0xcf, 0x0a, 0xdc, 0xd8, + 0xab, 0x44, 0xea, 0x41, 0x69, 0x3f, 0x47, 0xb8, + 0xf0, 0xdb, 0xe2, 0xa9, 0xe5, 0x03, 0xa4, 0xfd, + 0x1e, 0xe3, 0xc3, 0x6f, 0x8a, 0xa7, 0x96, 0x98, + 0x8e, 0x2d, 0x5a, 0x7e, 0xe6, 0x18, 0x1e, 0x5a, + 0xde, 0x89, 0xd6, 0x22, 0x22, 0xc9, 0xd2, 0x22, + 0x22, 0x02, 0xf1, 0xce, 0x6b, 0x41, 0x73, 0x8d, + 0x00, 0xde, 0x57, 0xab, 0x05, 0xf1, 0x68, 0xb6, + 0x78, 0x76, 0xe3, 0xb2, 0x9d, 0x54, 0x11, 0x79, + 0x2b, 0xc6, 0xcc, 0xd7, 0xbb, 0x68, 0x8a, 0x21, + 0x5e, 0xb6, 0xcd, 0xee, 0xf7, 0x14, 0x4e, 0x8f, + 0xb6, 0x97, 0x2d, 0x7f, 0x2e, 0xa6, 0xbb, 0x6d, + 0x18, 0xde, 0x2b, 0x7c, 0x6c, 0x67, 0xe2, 0xb0, + 0x6c, 0x7c, 0x9c, 0xe7, 0x77, 0x65, 0x79, 0x92, + 0x7c, 0x93, 0xc5, 0x1e, 0x3e, 0x31, 0xff, 0x00, + 0xc8, 0xbe, 0x77, 0x40, 0xd1, 0xd4, 0x07, 0xbe, + 0x75, 0x3a, 0x81, 0xaa, 0xdd, 0x65, 0x63, 0x1d, + 0x9d, 0xa4, 0x36, 0x96, 0xed, 0xe1, 0x86, 0x06, + 0x08, 0xd8, 0x3a, 0xcd, 0x0a, 0x72, 0xe4, 0x89, + 0xed, 0x47, 0x75, 0x91, 0x17, 0xd8, 0x8c, 0xf2, + 0x9a, 0x2f, 0x44, 0x6d, 0xe7, 0x50, 0x96, 0x34, + 0x00, 0x9d, 0xc1, 0x7d, 0x49, 0x3d, 0xac, 0x22, + 0xb2, 0xbd, 0x91, 0x8e, 0xab, 0x88, 0x0a, 0x36, + 0xe7, 0x55, 0x61, 0x2d, 0xea, 0x0d, 0xc0, 0x7b, + 0x87, 0x24, 0x63, 0x8b, 0xb4, 0x82, 0x48, 0x46, + 0xe3, 0xd6, 0x5f, 0x5d, 0x17, 0x54, 0xaa, 0x85, + 0xff, 0x00, 0xb4, 0xbc, 0x55, 0xb5, 0x43, 0x19, + 0xb4, 0x72, 0xc8, 0xe0, 0xdf, 0x7b, 0x7a, 0xae, + 0x5f, 0xfb, 0x5b, 0x90, 0xd4, 0x40, 0x40, 0xea, + 0x74, 0x6c, 0x27, 0xf7, 0x9f, 0x44, 0x1d, 0x4f, + 0x81, 0x83, 0x69, 0xda, 0xb0, 0x4f, 0x91, 0xc7, + 0xdb, 0x0a, 0xcd, 0x3c, 0x71, 0xd3, 0xaa, 0xe0, + 0xb8, 0x8d, 0xf7, 0xb4, 0x5c, 0xc5, 0xd5, 0x47, + 0x13, 0xc8, 0x3f, 0xa4, 0xf2, 0x07, 0x61, 0x94, + 0x50, 0xb7, 0x1a, 0x83, 0x2b, 0x39, 0x24, 0xcd, + 0xc1, 0x5f, 0xd1, 0x1b, 0x7b, 0x26, 0xa5, 0x4e, + 0x44, 0x65, 0x77, 0x3b, 0xad, 0x69, 0x83, 0x80, + 0x1a, 0x48, 0xe9, 0x48, 0xfd, 0x01, 0xb3, 0xb2, + 0x54, 0x05, 0xff, 0x00, 0xb5, 0x4c, 0x7c, 0x35, + 0x10, 0xb5, 0x80, 0xfe, 0xb3, 0xf8, 0x8f, 0xec, + 0xb2, 0xab, 0x8e, 0xcb, 0x71, 0x71, 0x31, 0xac, + 0xd2, 0xbe, 0x43, 0xfa, 0xce, 0x25, 0x63, 0x50, + 0x97, 0x44, 0xbf, 0xf6, 0xb1, 0x7b, 0x25, 0x44, + 0x0e, 0x70, 0x1f, 0xfb, 0x6d, 0x0d, 0x1f, 0xb4, + 0xed, 0xaa, 0x22, 0xdf, 0x55, 0x66, 0xb3, 0x59, + 0x08, 0xed, 0x81, 0x3c, 0x2f, 0x35, 0x79, 0x7b, + 0x9c, 0xea, 0x34, 0x6f, 0xd9, 0xb0, 0x2a, 0x92, + 0xb7, 0x68, 0xeb, 0x11, 0x1c, 0x0f, 0xbe, 0x78, + 0xee, 0xa5, 0x3c, 0x11, 0xf8, 0x23, 0x7a, 0xb5, + 0x11, 0x96, 0xa8, 0x56, 0xa9, 0xc9, 0x0b, 0x67, + 0x4e, 0xe6, 0x8a, 0x32, 0x8c, 0x1f, 0xaa, 0x00, + 0x5f, 0x0e, 0x90, 0xb8, 0x16, 0xb8, 0x92, 0x1c, + 0x28, 0xe0, 0x76, 0xd4, 0x1e, 0xaa, 0xc2, 0x5e, + 0xbc, 0x2f, 0x5d, 0x1d, 0x0c, 0x7b, 0xeb, 0xde, + 0x94, 0xbb, 0x37, 0x38, 0x58, 0x78, 0xdc, 0x5c, + 0xf8, 0x78, 0xa2, 0x71, 0x3b, 0x4f, 0x70, 0x68, + 0x3d, 0xe5, 0x27, 0x20, 0xee, 0xb9, 0xd5, 0x63, + 0x42, 0xdc, 0x7a, 0x6d, 0xa9, 0x3b, 0x9e, 0xd9, + 0x5a, 0x3a, 0xcf, 0x14, 0x3e, 0xfa, 0xb4, 0x49, + 0xc8, 0x57, 0x35, 0x51, 0x92, 0x66, 0x1b, 0xc6, + 0x68, 0x53, 0xf5, 0xc6, 0x35, 0xd0, 0x98, 0x35, + 0x25, 0xa3, 0x6b, 0x71, 0x63, 0x46, 0xdd, 0x34, + 0x7c, 0x78, 0x4e, 0xca, 0xfc, 0x8a, 0xf6, 0x16, + 0x5c, 0x2e, 0x69, 0x97, 0x56, 0xcc, 0xba, 0xb4, + 0x25, 0xd1, 0x8a, 0x35, 0xd1, 0x9e, 0x43, 0xca, + 0xde, 0x75, 0x66, 0x96, 0x38, 0xe5, 0x89, 0xf1, + 0x4a, 0xd0, 0xf8, 0xe4, 0x69, 0x6b, 0xda, 0x77, + 0x16, 0xb8, 0x50, 0x83, 0xee, 0x2e, 0x77, 0x80, + 0xb4, 0x9b, 0x0d, 0x9d, 0xc9, 0x61, 0x1e, 0x4f, + 0x03, 0x07, 0x49, 0x6e, 0x4f, 0xc6, 0x69, 0x3d, + 0xcb, 0x87, 0xc9, 0x2a, 0x63, 0xa6, 0x9e, 0xd8, + 0x3b, 0xae, 0x87, 0x14, 0xac, 0x9a, 0x31, 0x23, + 0x3b, 0xd7, 0x0a, 0xaf, 0xb5, 0xa7, 0x8b, 0x91, + 0x8e, 0xb7, 0xa3, 0x45, 0x1c, 0x36, 0xbc, 0x75, + 0xca, 0xdc, 0x55, 0x48, 0x88, 0x88, 0x08, 0x88, + 0x80, 0xa3, 0xf5, 0x07, 0xaa, 0x67, 0xf9, 0x3e, + 0x30, 0x52, 0x0a, 0x3f, 0x50, 0x7a, 0xa6, 0x7f, + 0x93, 0xe3, 0x05, 0x7b, 0x7b, 0x74, 0xe9, 0x86, + 0x58, 0x9e, 0x05, 0xdd, 0xca, 0xf5, 0x3d, 0xd2, + 0xbe, 0xa8, 0x6f, 0x86, 0xfe, 0xda, 0x96, 0x7e, + 0xe5, 0x13, 0xa5, 0x7d, 0x50, 0xdf, 0x0d, 0xfd, + 0xb5, 0x2c, 0xfd, 0xca, 0x6e, 0xf1, 0x6b, 0xde, + 0x94, 0x61, 0xb8, 0x16, 0xf7, 0x61, 0xce, 0x6e, + 0xbf, 0xc9, 0xe3, 0xca, 0xb3, 0xec, 0x42, 0xbf, + 0xaa, 0x05, 0xd7, 0xf9, 0x3c, 0x79, 0x56, 0x7d, + 0x88, 0x57, 0xf5, 0xcb, 0x67, 0x3d, 0x7b, 0xf2, + 0xf6, 0x3e, 0x29, 0x9b, 0x07, 0xfc, 0x6b, 0x62, + 0x22, 0x2d, 0x9e, 0x68, 0x88, 0x88, 0x08, 0x88, + 0x83, 0x4a, 0xfe, 0xf5, 0xac, 0x1d, 0x0c, 0x67, + 0xbb, 0x76, 0xf2, 0x39, 0x02, 0x83, 0xb4, 0xb7, + 0x7e, 0x4f, 0x2f, 0xe6, 0x2e, 0x6f, 0xff, 0x00, + 0x06, 0xcc, 0xb6, 0xe2, 0xee, 0xa3, 0xbf, 0x7d, + 0x6b, 0x0c, 0x5e, 0xf7, 0x1b, 0x96, 0xc5, 0xfc, + 0xcc, 0x8e, 0x79, 0x5e, 0x7e, 0xae, 0x85, 0xce, + 0x3d, 0x70, 0x6a, 0xa4, 0xb1, 0xf6, 0x4f, 0xb6, + 0xc5, 0x48, 0x40, 0xe1, 0xb9, 0xb9, 0x6b, 0xa5, + 0x90, 0xf2, 0xf1, 0xb9, 0xb4, 0x02, 0xbf, 0xaa, + 0x00, 0x0a, 0x60, 0x69, 0x65, 0xb5, 0xb6, 0x27, + 0x1a, 0xf7, 0x46, 0x4f, 0x4a, 0xe6, 0x1e, 0x12, + 0xee, 0x20, 0xd6, 0x54, 0x72, 0x54, 0xef, 0xf7, + 0x02, 0xac, 0x5f, 0xfb, 0x5b, 0x81, 0xb5, 0x6d, + 0xbf, 0x00, 0x3f, 0xaa, 0xd7, 0x48, 0x7b, 0x27, + 0x84, 0x2e, 0x63, 0x95, 0xb8, 0xb8, 0x9e, 0xfa, + 0x53, 0x39, 0x25, 0xd1, 0xb8, 0xb0, 0x34, 0xf2, + 0x70, 0x9a, 0x2d, 0x45, 0x02, 0xed, 0x7f, 0xed, + 0x43, 0x2b, 0x70, 0x08, 0x8c, 0xc9, 0xee, 0xbb, + 0x80, 0x7e, 0xcc, 0x60, 0x28, 0x0b, 0xad, 0x53, + 0x98, 0xb8, 0x35, 0x32, 0x06, 0x75, 0xda, 0x2a, + 0x7f, 0x69, 0xd5, 0x2a, 0x21, 0x14, 0xe5, 0x46, + 0x46, 0x69, 0xef, 0x2e, 0xee, 0x0d, 0x66, 0x9d, + 0xf2, 0x73, 0xb8, 0xd1, 0x61, 0xa0, 0x52, 0x38, + 0xcd, 0x3b, 0x9b, 0xcb, 0x46, 0xf9, 0x71, 0xd6, + 0x72, 0x5c, 0x46, 0xcd, 0x8e, 0x7b, 0x46, 0xca, + 0xf5, 0x2a, 0x56, 0xf6, 0x13, 0x49, 0xcb, 0x90, + 0x6d, 0xe4, 0xf9, 0x09, 0xc6, 0x32, 0xcf, 0x1c, + 0x43, 0x6e, 0xa6, 0x95, 0xa6, 0xa1, 0xc7, 0xe2, + 0x86, 0xf5, 0x54, 0x25, 0x00, 0xbd, 0x00, 0x93, + 0x40, 0x09, 0x27, 0x70, 0x1b, 0xd5, 0xeb, 0x1b, + 0xec, 0xfe, 0xde, 0x2c, 0xbf, 0x1d, 0xe4, 0xa3, + 0x21, 0x88, 0x16, 0xaf, 0xbc, 0x86, 0x58, 0x4f, + 0x0f, 0x4c, 0xd6, 0x8e, 0xf7, 0xad, 0xd7, 0x58, + 0xa7, 0x8b, 0x17, 0x71, 0x80, 0x3a, 0xa3, 0x4d, + 0x5b, 0x9c, 0x65, 0xee, 0x36, 0x6e, 0x8e, 0xe6, + 0x1a, 0xf4, 0x8d, 0xe1, 0x70, 0xd8, 0xf1, 0xc4, + 0x82, 0xb1, 0x6d, 0x81, 0xcc, 0xdd, 0x57, 0xa0, + 0xb2, 0x99, 0xf4, 0x61, 0x90, 0xf7, 0x24, 0x77, + 0x2d, 0xde, 0x45, 0x56, 0x69, 0x34, 0xde, 0x46, + 0x2c, 0x03, 0x33, 0xef, 0xe1, 0x16, 0x92, 0x49, + 0xd1, 0x06, 0xd7, 0xbb, 0x04, 0x1a, 0x54, 0x85, + 0x6d, 0x93, 0x58, 0xc1, 0x0e, 0x7a, 0xcb, 0x28, + 0xeb, 0xd2, 0x63, 0xba, 0xc6, 0xf4, 0x57, 0x0d, + 0x6e, 0xde, 0x8a, 0x6e, 0x1a, 0x6d, 0x6f, 0x85, + 0xb5, 0x45, 0x66, 0x35, 0xad, 0xad, 0xf6, 0x3a, + 0x6c, 0x7c, 0x36, 0xa6, 0x38, 0x6e, 0x21, 0x01, + 0xcc, 0x04, 0x06, 0xb6, 0xe3, 0x8c, 0xbd, 0xd2, + 0xb4, 0x75, 0x0a, 0x0a, 0x96, 0xca, 0x0e, 0xaf, + 0x2a, 0xb1, 0xe9, 0x0b, 0x3f, 0xe2, 0x4b, 0x7c, + 0xf1, 0xde, 0xf7, 0x11, 0xd7, 0xaa, 0x7b, 0xe2, + 0xab, 0xad, 0x69, 0x73, 0x83, 0x5b, 0xb5, 0xce, + 0x34, 0x03, 0xae, 0x55, 0xf3, 0x1d, 0x6c, 0x2c, + 0xec, 0xa2, 0xb7, 0x1b, 0xd8, 0xde, 0xeb, 0xc2, + 0x3b, 0x4a, 0xbd, 0xb8, 0xe9, 0xcb, 0x3d, 0xc5, + 0x2b, 0x9e, 0x8c, 0x91, 0xdd, 0x6f, 0x71, 0x2f, + 0x38, 0x96, 0x2e, 0x35, 0xe7, 0x1a, 0xd7, 0x2b, + 0x3c, 0x8c, 0x8e, 0x3c, 0x6d, 0x2c, 0x3b, 0x9c, + 0x08, 0x5d, 0x1f, 0x4e, 0xdd, 0x79, 0xde, 0x12, + 0xce, 0x67, 0x6d, 0x77, 0x44, 0x18, 0xff, 0x00, + 0x09, 0x9d, 0xc1, 0xed, 0x2e, 0x67, 0xc6, 0xae, + 0xda, 0x06, 0xeb, 0xa4, 0xc6, 0xcf, 0x6a, 0x77, + 0xdb, 0xcc, 0x48, 0x1f, 0xab, 0x20, 0xe2, 0x1e, + 0xfd, 0x55, 0x2e, 0x66, 0x85, 0xed, 0xf7, 0x52, + 0xd9, 0xac, 0x54, 0x19, 0x7c, 0x6c, 0xf8, 0xf9, + 0xf6, 0x36, 0x51, 0xdc, 0x3b, 0x95, 0xaf, 0x1b, + 0x58, 0xf1, 0xcc, 0x55, 0x33, 0x4d, 0xe5, 0xa4, + 0x8e, 0x53, 0x86, 0xbb, 0xac, 0x59, 0x1b, 0x52, + 0x61, 0x23, 0xf4, 0x83, 0x3a, 0x85, 0x74, 0x17, + 0x0d, 0xaa, 0x81, 0xaf, 0x71, 0xee, 0xc7, 0xe6, + 0x2c, 0x75, 0x05, 0xb0, 0xe1, 0x12, 0xbd, 0xb1, + 0x5c, 0x91, 0xfa, 0x6d, 0xef, 0x5d, 0xf2, 0x9b, + 0xb3, 0xdc, 0x54, 0xa7, 0xa7, 0xa3, 0xc0, 0xbc, + 0xf5, 0xae, 0x58, 0xfb, 0xde, 0x9d, 0x9d, 0x1b, + 0xfe, 0xb1, 0xbc, 0xbc, 0x84, 0x75, 0x56, 0xe2, + 0x86, 0xc6, 0xcb, 0x18, 0xba, 0xee, 0xb7, 0x38, + 0x7f, 0x0c, 0x8d, 0xdb, 0x7f, 0xfa, 0x29, 0x95, + 0x54, 0x88, 0x88, 0x80, 0x88, 0x88, 0x08, 0x37, + 0x84, 0x41, 0xbc, 0x20, 0xa0, 0x68, 0xdf, 0xef, + 0x8b, 0xee, 0x6b, 0x8f, 0xb4, 0x0b, 0xa4, 0x2e, + 0x6f, 0xa3, 0x7f, 0xbe, 0x2f, 0xb9, 0xae, 0x3e, + 0xd0, 0x2e, 0x90, 0xb1, 0xc3, 0xec, 0x79, 0xd2, + 0xf4, 0xfe, 0x33, 0xcc, 0xd3, 0xea, 0xad, 0xea, + 0x45, 0xe6, 0xfe, 0xa6, 0x3f, 0x0f, 0xe0, 0x2b, + 0x35, 0xa7, 0xa3, 0x45, 0xe0, 0x8e, 0xd2, 0xc3, + 0x9b, 0xfa, 0x98, 0xfc, 0x3f, 0x80, 0xac, 0xd6, + 0x9e, 0x8d, 0x17, 0x82, 0x3b, 0x4b, 0x8a, 0xcf, + 0xf6, 0x78, 0x8f, 0x55, 0x43, 0x8e, 0xae, 0x5e, + 0xde, 0xfc, 0xb2, 0xa2, 0x22, 0xf4, 0xd8, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x31, 0xcf, 0x3c, 0x70, + 0x46, 0x5e, 0xf3, 0xcc, 0x3a, 0xaa, 0xb7, 0x96, + 0xbd, 0xb8, 0x60, 0x6c, 0xb0, 0x33, 0xa5, 0xba, + 0x99, 0xc2, 0x1b, 0x78, 0xce, 0xee, 0x91, 0xe7, + 0x85, 0xa0, 0xf5, 0x86, 0xf2, 0xa5, 0xb3, 0x2e, + 0xa3, 0x19, 0x41, 0x57, 0xb7, 0x68, 0x14, 0xaa, + 0xc3, 0x86, 0xb6, 0x6d, 0xcd, 0xe9, 0xba, 0x70, + 0xab, 0x2d, 0x49, 0x11, 0x9f, 0xfd, 0xc7, 0x8e, + 0xe8, 0xfb, 0x8d, 0x34, 0xf7, 0x50, 0x6f, 0xe2, + 0xb1, 0xa3, 0x1d, 0x65, 0x1d, 0xab, 0x4f, 0x1b, + 0x85, 0x5f, 0x34, 0xa7, 0x7b, 0xe4, 0x76, 0xd7, + 0xbc, 0xf3, 0x95, 0xb9, 0xd1, 0xf5, 0x48, 0x55, + 0x4d, 0x43, 0xed, 0x0b, 0x1f, 0x89, 0x9d, 0xd6, + 0xf1, 0xf0, 0xbd, 0xcc, 0x25, 0xae, 0x7b, 0xcd, + 0x1b, 0xc4, 0x37, 0x86, 0x81, 0x52, 0x68, 0xaa, + 0x37, 0xfe, 0xd6, 0x6f, 0x1e, 0x48, 0xb7, 0x25, + 0xa3, 0xa9, 0x1b, 0x38, 0x7f, 0x79, 0xff, 0x00, + 0xe8, 0x88, 0x75, 0x92, 0xd6, 0x34, 0x55, 0xc7, + 0xb3, 0xb1, 0x6a, 0xdc, 0x65, 0xf1, 0x36, 0xa3, + 0xf8, 0xd7, 0x31, 0xb4, 0x8e, 0x4a, 0xd4, 0xfb, + 0xcb, 0x87, 0x5e, 0xeb, 0xbc, 0xc5, 0xd1, 0x35, + 0x71, 0xa1, 0xfd, 0x37, 0xb9, 0xde, 0xf3, 0x78, + 0x42, 0x89, 0x9b, 0x35, 0x94, 0x9a, 0xa5, 0xd3, + 0x96, 0x03, 0xbc, 0x30, 0x06, 0xfb, 0xe3, 0x6a, + 0x91, 0xdc, 0x6f, 0x35, 0xde, 0x12, 0xd8, 0x12, + 0xd2, 0xe9, 0x3a, 0xe0, 0x06, 0xb7, 0xb2, 0xea, + 0x2a, 0xf5, 0xff, 0x00, 0xb5, 0x8b, 0x58, 0xea, + 0x20, 0x6c, 0x60, 0xf2, 0x6d, 0x32, 0x1f, 0xdd, + 0xd8, 0xb9, 0x1b, 0xe4, 0x7c, 0x86, 0xb2, 0x38, + 0xbc, 0xf5, 0x5c, 0x49, 0x3e, 0xfa, 0xf9, 0x50, + 0x95, 0xf2, 0xff, 0x00, 0xda, 0xa6, 0x4e, 0x7a, + 0x88, 0x9d, 0x20, 0x1c, 0x9c, 0x34, 0x8c, 0x7c, + 0xe2, 0xab, 0xf7, 0x9a, 0xc3, 0x31, 0x74, 0x49, + 0x2e, 0x02, 0xbc, 0xae, 0x25, 0xe7, 0xf7, 0x8d, + 0x3d, 0xe5, 0x19, 0x0e, 0x36, 0xf6, 0x7b, 0x19, + 0xf2, 0x11, 0x47, 0xc5, 0x6b, 0x6a, 0x5a, 0xd9, + 0x9e, 0x08, 0xee, 0x4b, 0xbb, 0xdd, 0x9b, 0xd7, + 0xc1, 0xb1, 0xbe, 0x16, 0xec, 0xb9, 0xf3, 0x79, + 0x3a, 0x09, 0x0d, 0x19, 0x2f, 0x09, 0xe1, 0x24, + 0xf2, 0x07, 0x6e, 0x53, 0x95, 0x19, 0x19, 0x26, + 0xc9, 0xe4, 0x26, 0xfa, 0xcb, 0x87, 0x90, 0x79, + 0x01, 0xe1, 0x1f, 0xbb, 0x45, 0xab, 0xbf, 0x69, + 0xdb, 0xd7, 0xde, 0xa7, 0x4e, 0x9d, 0xc9, 0xe1, + 0xba, 0x2c, 0x95, 0xfc, 0x30, 0xbe, 0x18, 0x1c, + 0xc7, 0x5c, 0x5a, 0xb9, 0xed, 0x74, 0x81, 0xaf, + 0x3b, 0x9f, 0x1d, 0x6b, 0xb4, 0x2f, 0x72, 0x7a, + 0x97, 0x1f, 0x73, 0x8e, 0x92, 0xc6, 0xdb, 0x1f, + 0x1c, 0x6e, 0x92, 0x9c, 0x57, 0x1b, 0x1a, 0xe3, + 0xc0, 0x4f, 0x01, 0xe1, 0x1d, 0x62, 0xa1, 0x28, + 0x1a, 0xa6, 0xf5, 0x8a, 0xa4, 0xad, 0x8b, 0x5b, + 0x67, 0xdc, 0x4d, 0x1d, 0xbb, 0x3b, 0xe9, 0x1c, + 0x1b, 0xd9, 0x41, 0x6b, 0xd1, 0xd6, 0x22, 0x2b, + 0x67, 0xdf, 0x3c, 0x77, 0x73, 0x1e, 0x18, 0xfc, + 0x11, 0xbd, 0x58, 0x8b, 0xd6, 0xb5, 0xbc, 0x6c, + 0xb7, 0x82, 0x38, 0x19, 0xb1, 0xb1, 0x34, 0x34, + 0x7b, 0x8b, 0xec, 0xb9, 0x74, 0xd3, 0x19, 0x23, + 0x23, 0x09, 0x9c, 0xb3, 0x95, 0x97, 0x8d, 0x58, + 0xb4, 0x45, 0xc0, 0x6d, 0xed, 0xe5, 0xbd, 0x7e, + 0xb1, 0xad, 0x95, 0xa3, 0xae, 0x3b, 0x92, 0xaa, + 0xe5, 0xca, 0x4b, 0x4c, 0xdc, 0xf4, 0x19, 0xfb, + 0x47, 0x13, 0x46, 0xcd, 0xc5, 0x0b, 0xbe, 0x50, + 0xa8, 0x54, 0xb9, 0xd3, 0x12, 0xb5, 0x19, 0xdd, + 0x06, 0xea, 0x18, 0xa7, 0x89, 0xf0, 0xcc, 0xd1, + 0x24, 0x52, 0xb4, 0xb2, 0x46, 0x1d, 0xc5, 0xa4, + 0x50, 0x85, 0xcb, 0x21, 0x0e, 0xd2, 0x5a, 0x8e, + 0x7c, 0x65, 0xc5, 0x4d, 0x9c, 0xce, 0x6b, 0xa1, + 0x90, 0xf2, 0xb0, 0x9f, 0xe1, 0xbc, 0xf3, 0x6e, + 0x2b, 0xab, 0xbc, 0x77, 0x2a, 0x9d, 0xed, 0x1f, + 0x08, 0x2f, 0xb0, 0xe3, 0x21, 0x13, 0x6b, 0x3e, + 0x3e, 0xae, 0x75, 0x37, 0x98, 0x5d, 0xdf, 0x8f, + 0x93, 0xdf, 0x76, 0x56, 0x74, 0xcf, 0x72, 0x73, + 0x4b, 0x49, 0xeb, 0xea, 0x4b, 0x59, 0xdf, 0x49, + 0x0c, 0x8d, 0x64, 0xd5, 0x2c, 0x7e, 0xc2, 0x4e, + 0xf0, 0x79, 0x0a, 0x97, 0x06, 0xa2, 0xa3, 0x71, + 0x54, 0x8d, 0x35, 0x93, 0x7d, 0xfe, 0x22, 0xde, + 0x49, 0x8f, 0x14, 0x90, 0xff, 0x00, 0x06, 0x67, + 0x72, 0x90, 0xca, 0x06, 0x9f, 0xd9, 0x57, 0x48, + 0x5c, 0xd7, 0xc4, 0xd7, 0x33, 0xbd, 0xa6, 0xc5, + 0x59, 0x8c, 0x93, 0x92, 0x53, 0x0f, 0xb4, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x41, 0x19, 0x96, + 0xfa, 0xe8, 0x79, 0x8f, 0x6d, 0x4d, 0xb7, 0xbd, + 0x1c, 0xca, 0x13, 0x2d, 0xf5, 0xd0, 0xf3, 0x1e, + 0xda, 0x9b, 0x6f, 0x7a, 0x39, 0x97, 0x9d, 0x83, + 0xe7, 0xb1, 0xda, 0x6d, 0x7e, 0x99, 0x74, 0x5d, + 0xe0, 0xd9, 0xd1, 0x56, 0xb6, 0x1b, 0xcf, 0x45, + 0x9b, 0xc9, 0xbf, 0xc5, 0x2a, 0xa5, 0xa1, 0x37, + 0x5e, 0x7f, 0x2b, 0xe7, 0xab, 0x6d, 0xe7, 0xa2, + 0xcd, 0xe4, 0xdf, 0xe2, 0x95, 0x52, 0xd0, 0x9b, + 0xaf, 0x3f, 0x95, 0xf3, 0xd7, 0xab, 0x4e, 0xc5, + 0x5d, 0xe7, 0x0d, 0x7c, 0x6b, 0x5e, 0x72, 0xd6, + 0x88, 0x8b, 0x36, 0xc2, 0x22, 0x20, 0x22, 0x22, + 0x0f, 0x09, 0x0d, 0x04, 0x9d, 0x80, 0x6f, 0x2a, + 0x23, 0x27, 0x79, 0x1c, 0xe1, 0xc1, 0x95, 0xe8, + 0xe3, 0x15, 0xdb, 0xb8, 0x9e, 0x53, 0xee, 0x29, + 0x2b, 0xb2, 0xd1, 0x6e, 0xfe, 0x2d, 0xc4, 0x2a, + 0xcd, 0xc8, 0x92, 0xe0, 0x47, 0x63, 0x18, 0xa4, + 0xf7, 0x4e, 0xe8, 0x1a, 0x77, 0x51, 0xa7, 0x6b, + 0x9f, 0xee, 0x35, 0x07, 0xce, 0x9a, 0x31, 0x5c, + 0x4d, 0x2e, 0xaa, 0xc9, 0xb8, 0x45, 0x6e, 0xce, + 0x2b, 0x7c, 0x63, 0x5d, 0xc9, 0x18, 0x34, 0x7c, + 0x80, 0x72, 0xb9, 0xe7, 0x62, 0x92, 0xbc, 0xd7, + 0x78, 0x5b, 0x66, 0x92, 0x0b, 0x9e, 0x47, 0x56, + 0x8c, 0x1f, 0xbc, 0x55, 0x3f, 0xda, 0x95, 0xe5, + 0xce, 0x21, 0xb6, 0x18, 0xeb, 0x21, 0xd0, 0xda, + 0x32, 0x1e, 0x08, 0x38, 0x79, 0x38, 0x7b, 0x92, + 0x79, 0xe8, 0xb9, 0x8b, 0xde, 0xf9, 0x0f, 0x14, + 0x8e, 0x2f, 0x27, 0x95, 0xc4, 0x9e, 0xda, 0x99, + 0x9c, 0xb2, 0x43, 0xaf, 0x5f, 0xfb, 0x58, 0xb4, + 0x8e, 0xa2, 0x0e, 0x8c, 0x73, 0x56, 0x43, 0xef, + 0x50, 0x2a, 0xe5, 0xf7, 0xb5, 0x5c, 0x8c, 0xc4, + 0xf4, 0x46, 0x4a, 0x6d, 0x14, 0x14, 0x8c, 0x7b, + 0xdb, 0x55, 0x09, 0x14, 0x23, 0x22, 0x7a, 0xef, + 0x59, 0xe6, 0x6e, 0x4d, 0x78, 0xc3, 0x79, 0xc9, + 0x79, 0xec, 0x95, 0x17, 0x36, 0x57, 0x23, 0x3f, + 0xd6, 0xdc, 0x3c, 0xf5, 0x81, 0xe1, 0x1e, 0xf2, + 0xd5, 0x59, 0x62, 0xb4, 0xba, 0x9a, 0x19, 0x67, + 0x8a, 0x27, 0xc9, 0x0c, 0x02, 0xb3, 0x48, 0xd1, + 0x56, 0xb4, 0x1f, 0xd2, 0x2a, 0x72, 0x99, 0x18, + 0x8f, 0x74, 0x6a, 0xe2, 0x49, 0xea, 0x9d, 0xa5, + 0x15, 0x87, 0x0b, 0xa3, 0x6e, 0xb2, 0x56, 0x03, + 0x25, 0x75, 0x75, 0x06, 0x32, 0xc5, 0xee, 0xe0, + 0x8a, 0x6b, 0x87, 0x53, 0xa4, 0x70, 0xfd, 0x10, + 0xb4, 0xb5, 0x06, 0x9f, 0xbc, 0xc0, 0xde, 0x36, + 0xda, 0xe5, 0xd1, 0xca, 0xc9, 0x5a, 0x1f, 0x04, + 0xf1, 0x38, 0x39, 0x8f, 0x61, 0xe5, 0x0a, 0x12, + 0x8b, 0x5f, 0x51, 0xc5, 0x2c, 0xae, 0xe1, 0x89, + 0x8e, 0x91, 0xdd, 0x46, 0x34, 0xb8, 0xfb, 0xca, + 0xed, 0xa2, 0xb0, 0x7a, 0x76, 0xe7, 0x05, 0x75, + 0x7d, 0x9c, 0x65, 0x7a, 0x7b, 0x86, 0xd9, 0xda, + 0xcd, 0xb7, 0xf8, 0x6e, 0x78, 0xd8, 0xed, 0xfd, + 0x55, 0x23, 0xa2, 0x31, 0xd9, 0x0c, 0x55, 0xf6, + 0x7f, 0x4f, 0x17, 0xb6, 0xde, 0xfd, 0xb1, 0x74, + 0x96, 0xd7, 0x44, 0x0a, 0x0a, 0x6c, 0x0f, 0x06, + 0x87, 0x61, 0x08, 0x28, 0x7f, 0x82, 0xe5, 0x84, + 0xd0, 0x43, 0x25, 0xac, 0x90, 0xbe, 0xe9, 0xc1, + 0x90, 0x99, 0x5a, 0x58, 0x1c, 0x4e, 0xed, 0xae, + 0xa2, 0xdc, 0xca, 0xe9, 0x2c, 0xc6, 0x1f, 0x21, + 0x6b, 0x61, 0x91, 0x60, 0x8a, 0x4b, 0xc2, 0xd1, + 0x1b, 0xda, 0x78, 0xdb, 0xdd, 0x1e, 0x1d, 0xe3, + 0x94, 0x2b, 0xb5, 0xcc, 0xd7, 0x93, 0xe8, 0xfb, + 0xb6, 0x33, 0x29, 0x16, 0x76, 0xf2, 0xc6, 0xe1, + 0x97, 0x13, 0x3c, 0x6c, 0x30, 0x31, 0xa6, 0xa7, + 0x80, 0x9d, 0xfb, 0x94, 0xec, 0xe6, 0xdf, 0x3d, + 0x95, 0xb3, 0xb0, 0xbf, 0x77, 0x08, 0x7c, 0x50, + 0x64, 0xb1, 0xd3, 0x80, 0x2a, 0x0b, 0x29, 0xd2, + 0xc7, 0x5e, 0xba, 0x0d, 0x5c, 0x66, 0x90, 0xb3, + 0xd3, 0x26, 0x3b, 0x77, 0x4b, 0xe7, 0x32, 0x4e, + 0x38, 0xf8, 0xdc, 0x03, 0x6a, 0xe1, 0xbf, 0x84, + 0x75, 0x86, 0xe0, 0xb0, 0xe6, 0x4c, 0x02, 0x48, + 0xdd, 0x18, 0x6b, 0x64, 0x70, 0x25, 0xc1, 0xbb, + 0x0f, 0x0f, 0xc4, 0x2e, 0x03, 0x73, 0x96, 0xe6, + 0x6e, 0xf2, 0x2b, 0xdc, 0x5c, 0x8e, 0x74, 0x83, + 0xa7, 0xb7, 0xbc, 0x78, 0x63, 0x49, 0xee, 0xb8, + 0x0e, 0xcd, 0x8a, 0xba, 0x5f, 0xff, 0x00, 0xf3, + 0x5b, 0x53, 0xd1, 0x0c, 0xaa, 0xe9, 0x96, 0x5e, + 0x25, 0x27, 0xa6, 0x2e, 0xba, 0x0d, 0x41, 0x6b, + 0xb6, 0x8d, 0x9c, 0x3e, 0x17, 0x7b, 0xa2, 0xa1, + 0x43, 0x17, 0xaf, 0xa8, 0x2e, 0x4d, 0xbd, 0xc4, + 0x37, 0x0d, 0x34, 0x30, 0x4a, 0xc7, 0xfb, 0x95, + 0xa1, 0xed, 0xa9, 0xab, 0x34, 0xa2, 0x9c, 0xf0, + 0xeb, 0x32, 0x0d, 0x9c, 0xcb, 0x9f, 0x6b, 0xdc, + 0x53, 0xf1, 0xd9, 0x0b, 0x7d, 0x4f, 0x64, 0xdd, + 0x9c, 0x6d, 0x65, 0xe3, 0x47, 0xe9, 0x6e, 0x6b, + 0xcf, 0x84, 0x3b, 0x92, 0xba, 0x08, 0x70, 0x7b, + 0x03, 0x86, 0xd0, 0xe1, 0x51, 0xee, 0xed, 0x5a, + 0x97, 0xf6, 0x30, 0x64, 0x2c, 0xa6, 0xb2, 0xb8, + 0x15, 0x86, 0xe1, 0x85, 0x8e, 0xeb, 0x57, 0x71, + 0x1c, 0xdb, 0xd6, 0x34, 0xce, 0x49, 0x6b, 0x31, + 0x96, 0x15, 0xec, 0x36, 0x5f, 0xce, 0xac, 0xe3, + 0xbc, 0xb5, 0xa9, 0x88, 0xf7, 0x25, 0xa7, 0xf4, + 0x87, 0x7c, 0xde, 0x75, 0x64, 0x82, 0x66, 0x4f, + 0x18, 0x91, 0x9b, 0x8a, 0xe6, 0x9a, 0x49, 0xd7, + 0x58, 0xdc, 0xa5, 0xfe, 0x0a, 0xe3, 0x63, 0xa3, + 0x25, 0xc0, 0x72, 0x74, 0x8c, 0xee, 0x78, 0x87, + 0x84, 0xd5, 0xd0, 0xb1, 0x52, 0x31, 0xd0, 0x16, + 0x8a, 0x87, 0x83, 0x57, 0x8e, 0xba, 0x55, 0x19, + 0x27, 0x21, 0x13, 0x95, 0xba, 0x88, 0x8a, 0x12, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x8e, 0xd4, 0x7e, + 0xa3, 0xbc, 0xf2, 0x7f, 0x39, 0xab, 0x5f, 0x43, + 0x7a, 0x99, 0xde, 0x5d, 0xfd, 0xa6, 0xad, 0x8d, + 0x47, 0xea, 0x3b, 0xcf, 0x27, 0xf3, 0x9a, 0xb5, + 0xf4, 0x37, 0xa9, 0x9d, 0xe5, 0xdf, 0xda, 0x6a, + 0xbc, 0x70, 0xe7, 0x4b, 0x19, 0xe6, 0x29, 0xdc, + 0x9d, 0x6b, 0x12, 0x22, 0x2a, 0x36, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x16, 0xae, 0x43, 0xd0, 0xae, + 0x7c, 0x93, 0xfc, 0x52, 0xb6, 0x96, 0xae, 0x43, + 0xd0, 0xae, 0x7c, 0x93, 0xfc, 0x52, 0xa6, 0x9c, + 0xf0, 0xad, 0xcd, 0x8a, 0xb4, 0x4e, 0xa4, 0x16, + 0x93, 0xf4, 0x7b, 0x8f, 0x0d, 0xbe, 0x2a, 0x9e, + 0x50, 0x3a, 0x4f, 0xd1, 0xee, 0x3c, 0x36, 0xf8, + 0xaa, 0x79, 0x69, 0x88, 0xe2, 0xd5, 0xa7, 0xee, + 0x61, 0x81, 0xe5, 0xad, 0xe8, 0x9d, 0x62, 0x22, + 0x2c, 0x9d, 0x22, 0x22, 0x20, 0x28, 0x8c, 0x8d, + 0xeb, 0x65, 0x2f, 0x80, 0x6d, 0x0d, 0xa6, 0xd0, + 0x68, 0x7a, 0xea, 0x56, 0x47, 0x06, 0xb1, 0xce, + 0x3b, 0x28, 0x2b, 0x55, 0x59, 0xbe, 0x95, 0xb0, + 0xdb, 0x4f, 0x3c, 0xa7, 0x86, 0x37, 0x35, 0xce, + 0x27, 0xf4, 0x47, 0x09, 0x41, 0xf1, 0xa4, 0x78, + 0x72, 0x59, 0x7b, 0xac, 0x97, 0x05, 0x2d, 0xec, + 0x07, 0x9a, 0xdb, 0xb8, 0xfc, 0x69, 0x1d, 0xb6, + 0x47, 0xf6, 0x36, 0x7b, 0xaa, 0x47, 0x31, 0xad, + 0xb1, 0x38, 0xb9, 0x5d, 0x09, 0x3d, 0x2c, 0x8c, + 0x34, 0x7d, 0x08, 0x0d, 0x0e, 0x1c, 0x9c, 0x4e, + 0xe5, 0x59, 0x74, 0x96, 0x2c, 0xe3, 0xb4, 0xd5, + 0xb4, 0x03, 0x64, 0xd2, 0xb1, 0xd3, 0x48, 0x79, + 0x78, 0xe5, 0xee, 0xfd, 0xe1, 0x45, 0xc1, 0xb3, + 0x33, 0xdc, 0x4b, 0x91, 0x9d, 0x97, 0x04, 0x97, + 0xc5, 0x23, 0x98, 0x41, 0xe4, 0x21, 0xc7, 0x8b, + 0xb2, 0x54, 0xd5, 0x9c, 0x74, 0xbb, 0xff, 0x00, + 0x6b, 0x71, 0x36, 0xa2, 0xdc, 0x46, 0xd3, 0xd6, + 0xac, 0x87, 0xde, 0xd9, 0xef, 0xaa, 0xe5, 0xff, + 0x00, 0xb4, 0xfc, 0xad, 0xc5, 0x44, 0x6f, 0x92, + 0x87, 0x66, 0xf1, 0x18, 0xfd, 0xda, 0x95, 0x4f, + 0x82, 0xca, 0xf2, 0xe5, 0xaf, 0x75, 0xb4, 0x12, + 0x4c, 0xd8, 0x87, 0x14, 0x85, 0x8d, 0x2e, 0x0d, + 0x1d, 0x57, 0x10, 0x36, 0x2d, 0xec, 0x7e, 0x9a, + 0xcb, 0x64, 0x71, 0x77, 0x59, 0x6b, 0x58, 0xda, + 0xeb, 0x3b, 0x30, 0x4c, 0xcf, 0x2e, 0x00, 0xec, + 0x15, 0xa3, 0x5b, 0xbc, 0xa8, 0x46, 0x46, 0x4b, + 0xad, 0x55, 0x97, 0xb9, 0x24, 0x97, 0x86, 0xd7, + 0x97, 0x6b, 0xcf, 0x65, 0xe4, 0xa8, 0xe9, 0xaf, + 0xef, 0x66, 0xd9, 0x2c, 0xef, 0x70, 0xea, 0x71, + 0x10, 0x3b, 0x02, 0x81, 0x59, 0xbf, 0x24, 0x58, + 0x5b, 0xdb, 0xc2, 0xdc, 0x9e, 0x59, 0xb6, 0x97, + 0xb7, 0x50, 0x79, 0xc4, 0x51, 0x98, 0x9c, 0xe8, + 0x83, 0x48, 0xe2, 0x6b, 0x5f, 0x28, 0xd8, 0x0a, + 0x94, 0xc5, 0x69, 0xbc, 0x1b, 0x71, 0x18, 0xbb, + 0xd8, 0xf1, 0x33, 0x66, 0x65, 0xbe, 0x7b, 0xa3, + 0xb9, 0x70, 0x94, 0xb5, 0x91, 0x16, 0x3b, 0x84, + 0x9a, 0x34, 0x0d, 0x9c, 0xbb, 0x51, 0x2e, 0x7d, + 0x4d, 0xbd, 0x52, 0x56, 0xe5, 0x8e, 0x1f, 0x2b, + 0x91, 0x64, 0x8f, 0xb1, 0xb4, 0x96, 0xe5, 0x91, + 0x7d, 0x63, 0xa3, 0x69, 0x70, 0x1c, 0xeb, 0xa1, + 0x69, 0xcd, 0x2f, 0x67, 0x8e, 0xd4, 0xd7, 0xd7, + 0x96, 0xb0, 0x1c, 0x85, 0x94, 0x13, 0xb6, 0xd2, + 0x06, 0x6c, 0x7f, 0x01, 0x94, 0x56, 0x57, 0x38, + 0xee, 0xa4, 0x61, 0x60, 0x86, 0xdb, 0x50, 0xe0, + 0xef, 0xc5, 0xab, 0xad, 0x25, 0xb8, 0xc4, 0xe3, + 0xef, 0x5d, 0x2f, 0x05, 0x8b, 0xc0, 0x95, 0xcf, + 0x90, 0xd5, 0x9d, 0x2f, 0x09, 0xa9, 0x6d, 0x39, + 0x0a, 0x0a, 0xb6, 0x27, 0x46, 0x65, 0xb2, 0x96, + 0xc2, 0xe5, 0x8f, 0x86, 0xd9, 0xaf, 0x7b, 0xa2, + 0xb7, 0x65, 0xc3, 0xf8, 0x1f, 0x2c, 0x8d, 0xde, + 0xc8, 0xc1, 0x1b, 0x4a, 0xd8, 0xb4, 0xc6, 0x69, + 0x7b, 0x76, 0x34, 0x66, 0x26, 0x9a, 0x1b, 0x98, + 0xea, 0x27, 0x86, 0xa0, 0x90, 0xf8, 0xdd, 0x47, + 0x33, 0x85, 0xbb, 0x68, 0xe1, 0xb8, 0xab, 0x6e, + 0x7a, 0xd2, 0x1b, 0xd9, 0x63, 0xc7, 0x41, 0x7f, + 0x0c, 0x57, 0xf8, 0xab, 0xff, 0x00, 0x3c, 0x71, + 0x9d, 0xcd, 0x8a, 0x91, 0x4f, 0x49, 0x1d, 0xd6, + 0xe2, 0x61, 0xde, 0x15, 0x0f, 0x5b, 0x5e, 0x5a, + 0x5e, 0xea, 0x8b, 0xfb, 0x9b, 0x37, 0x09, 0x20, + 0x92, 0x4d, 0x92, 0x37, 0xbd, 0x71, 0x00, 0x02, + 0xe1, 0xce, 0x50, 0x45, 0xde, 0xba, 0x01, 0x79, + 0x30, 0xb4, 0x71, 0x75, 0xb7, 0x1b, 0xba, 0x12, + 0x76, 0x1e, 0x0a, 0xf7, 0x3e, 0xf2, 0xc1, 0xc4, + 0x4a, 0xf1, 0x7a, 0xd1, 0x52, 0x83, 0x3d, 0xad, + 0xbb, 0xe7, 0x9a, 0x38, 0x18, 0x3b, 0xa9, 0x1c, + 0x1b, 0xd9, 0x5d, 0x16, 0xde, 0x26, 0x5b, 0xc1, + 0x1c, 0x0c, 0xd8, 0xd8, 0x9a, 0x1a, 0x3d, 0xc5, + 0x57, 0xd2, 0x96, 0x5c, 0x53, 0x3e, 0xf5, 0xe3, + 0xb9, 0x8f, 0xb9, 0x8f, 0x9c, 0xef, 0x3e, 0xe2, + 0xb3, 0x71, 0x2d, 0x6d, 0xc6, 0x48, 0xcb, 0xd6, + 0xce, 0xb9, 0xe9, 0xc8, 0xca, 0x5c, 0xbc, 0x2f, + 0x58, 0xb8, 0x97, 0x9c, 0x4a, 0xf9, 0x54, 0xc8, + 0x9d, 0xd2, 0x17, 0x5d, 0x0e, 0x79, 0x8c, 0x26, + 0x8d, 0xb9, 0x89, 0xd1, 0xfc, 0xa6, 0xf7, 0x41, + 0x74, 0x07, 0x8a, 0xb7, 0x99, 0x72, 0x9c, 0x7d, + 0xdf, 0x9a, 0xe4, 0x6d, 0x2e, 0x2b, 0x41, 0x14, + 0xcd, 0x24, 0xf5, 0x9c, 0x78, 0x4a, 0xea, 0xd5, + 0x04, 0x6c, 0xdc, 0x56, 0x35, 0xe7, 0xd2, 0xd6, + 0x8c, 0xcc, 0x4a, 0xa3, 0xae, 0x22, 0xf3, 0x0b, + 0xac, 0x7e, 0xa1, 0x6b, 0x49, 0x6c, 0x0f, 0xf3, + 0x6b, 0xba, 0x0d, 0xa6, 0x27, 0xed, 0x69, 0xf7, + 0x0d, 0x7b, 0x2a, 0xdc, 0xb4, 0x33, 0xf8, 0xe1, + 0x93, 0xc3, 0x5e, 0x58, 0x91, 0x57, 0x4d, 0x13, + 0xb8, 0x3a, 0xcf, 0x6f, 0x74, 0xcf, 0xde, 0x0a, + 0x29, 0x9c, 0x93, 0x19, 0x56, 0x9c, 0xcd, 0x1c, + 0x45, 0xdc, 0x4d, 0x68, 0x9d, 0xae, 0x0f, 0x82, + 0x6a, 0x16, 0x3d, 0xa3, 0x90, 0xa9, 0xd0, 0x41, + 0x00, 0x8d, 0xa0, 0xee, 0x2b, 0x9e, 0x68, 0x9b, + 0x97, 0xdc, 0x62, 0x5f, 0x6c, 0xfa, 0xb4, 0xc0, + 0xfa, 0x0a, 0xf5, 0xf9, 0x3d, 0xc5, 0x7c, 0xb3, + 0x2e, 0x36, 0xcc, 0x0e, 0x14, 0x73, 0x45, 0x0a, + 0x55, 0x19, 0x26, 0x60, 0x86, 0x74, 0x44, 0x50, + 0x08, 0x88, 0x80, 0xa3, 0xf5, 0x07, 0xaa, 0x67, + 0xf9, 0x3e, 0x30, 0x52, 0x0a, 0x3f, 0x50, 0x7a, + 0xa6, 0x7f, 0x93, 0xe3, 0x05, 0x7b, 0x7b, 0x74, + 0xe9, 0x86, 0x58, 0x9e, 0x05, 0xdd, 0xca, 0xf5, + 0x3d, 0xd2, 0xbe, 0xa8, 0x6f, 0x86, 0xfe, 0xda, + 0x96, 0x7e, 0xe5, 0x13, 0xa5, 0x7d, 0x50, 0xdf, + 0x0d, 0xfd, 0xb5, 0x2c, 0xfd, 0xca, 0x6e, 0xf1, + 0x6b, 0xde, 0x94, 0x61, 0xb8, 0x16, 0xf7, 0x61, + 0xce, 0x6e, 0xbf, 0xc9, 0xe3, 0xca, 0xb3, 0xec, + 0x42, 0xbf, 0xaa, 0x05, 0xd7, 0xf9, 0x3c, 0x79, + 0x56, 0x7d, 0x88, 0x57, 0xf5, 0xcb, 0x67, 0x3d, + 0x7b, 0xf2, 0xf6, 0x3e, 0x29, 0x9b, 0x07, 0xfc, + 0x6b, 0x62, 0x22, 0x2d, 0x9e, 0x68, 0x88, 0x88, + 0x0b, 0x56, 0xfe, 0xf1, 0xb6, 0xcc, 0x00, 0xf7, + 0xce, 0x34, 0xf7, 0x16, 0xd2, 0x89, 0xc9, 0x93, + 0x25, 0xc8, 0x0d, 0x3b, 0x22, 0xef, 0xbd, 0xde, + 0x44, 0x11, 0x71, 0x86, 0xdd, 0x66, 0x60, 0xb2, + 0xe0, 0x27, 0x8e, 0xb7, 0x13, 0xd4, 0xd4, 0x36, + 0x38, 0xce, 0xcf, 0xda, 0x71, 0x01, 0x5b, 0x9a, + 0x6a, 0xcd, 0xbb, 0x94, 0x06, 0x9f, 0xb5, 0x8c, + 0xdd, 0x5e, 0x64, 0x45, 0x4b, 0xa5, 0xe0, 0xb7, + 0x04, 0xf2, 0x08, 0xc7, 0x13, 0x80, 0xf9, 0x4e, + 0x53, 0xac, 0xe5, 0x53, 0x23, 0xf3, 0xee, 0xb7, + 0xb1, 0x36, 0x3a, 0xa3, 0x21, 0x05, 0x28, 0xd3, + 0x29, 0x91, 0xbc, 0xcf, 0xee, 0x97, 0x9a, 0x53, + 0x4d, 0xfe, 0x3d, 0x79, 0x28, 0x9a, 0x61, 0x6d, + 0x65, 0x67, 0x19, 0x9a, 0xee, 0x73, 0xb7, 0x85, + 0x83, 0x90, 0x75, 0xca, 0xb2, 0x7b, 0x61, 0xb1, + 0xe8, 0x73, 0x76, 0xf7, 0x80, 0x50, 0x5c, 0xc5, + 0x47, 0x1f, 0xd6, 0x61, 0xff, 0x00, 0xea, 0xa3, + 0xbd, 0x9e, 0xe5, 0x2c, 0x20, 0xb8, 0xbf, 0xc4, + 0xe4, 0x25, 0x16, 0xf0, 0x65, 0xa0, 0x30, 0xb6, + 0x63, 0xb9, 0xaf, 0xe4, 0xa9, 0xf7, 0x54, 0x0f, + 0x32, 0x58, 0xcd, 0x07, 0x71, 0x8d, 0xb8, 0x9f, + 0x0f, 0x7f, 0x2c, 0x17, 0x96, 0xa2, 0xa2, 0x2b, + 0x91, 0xb2, 0x61, 0xbb, 0xb8, 0xa2, 0xb0, 0xe1, + 0x2f, 0x71, 0x32, 0x64, 0x2c, 0x70, 0x38, 0x8b, + 0x1b, 0x6b, 0xcc, 0x61, 0xb7, 0x0f, 0xca, 0xdc, + 0xbd, 0x95, 0x70, 0x24, 0x55, 0xee, 0x74, 0x87, + 0x77, 0x0a, 0x8e, 0xc6, 0xe8, 0x9b, 0x1c, 0x1c, + 0xd7, 0x37, 0xfa, 0x96, 0x7b, 0x69, 0xf1, 0xf6, + 0xf1, 0x3b, 0xa0, 0x8e, 0x39, 0x38, 0x9d, 0x2b, + 0xfe, 0x25, 0x1a, 0xd5, 0xf1, 0x87, 0xd4, 0x5a, + 0x36, 0xc3, 0x4c, 0xbe, 0xc6, 0xe1, 0x97, 0x1e, + 0x73, 0x79, 0x23, 0x9f, 0x77, 0x1d, 0xb7, 0x72, + 0xe2, 0xca, 0xf7, 0x11, 0x99, 0x0f, 0xc5, 0xa2, + 0x0d, 0xac, 0xf5, 0xc8, 0xb6, 0xd1, 0x96, 0x57, + 0x3a, 0x7a, 0x57, 0xc5, 0x6d, 0x61, 0x7f, 0x2b, + 0x5f, 0xd1, 0x9a, 0x54, 0xf1, 0x12, 0xc7, 0x3a, + 0x9b, 0xc2, 0x9d, 0xc9, 0xb1, 0x99, 0x9b, 0x3b, + 0xac, 0x73, 0x78, 0x23, 0xbd, 0xce, 0x63, 0xe2, + 0xbd, 0x89, 0x86, 0x8d, 0xe3, 0x9a, 0x30, 0x01, + 0x1c, 0xe6, 0x8a, 0x8f, 0x16, 0xb3, 0x18, 0xfb, + 0xa9, 0x19, 0xa7, 0xec, 0x19, 0x16, 0x3a, 0x66, + 0x01, 0x2d, 0x85, 0xc7, 0xf1, 0xda, 0xe7, 0x37, + 0xff, 0x00, 0x52, 0x9d, 0x55, 0x1d, 0x95, 0xc8, + 0x6a, 0x0c, 0xc6, 0x4d, 0xb7, 0x93, 0xb2, 0x43, + 0x74, 0xd6, 0x37, 0xa1, 0x6c, 0x0d, 0x2d, 0x0c, + 0x67, 0xc4, 0xe0, 0x0d, 0xdc, 0x10, 0x5e, 0x2d, + 0x72, 0x6e, 0xd2, 0x98, 0x1c, 0x1c, 0x79, 0xa8, + 0xcb, 0x27, 0x12, 0xcd, 0x14, 0xd6, 0xf5, 0x05, + 0xe2, 0xde, 0x40, 0x5a, 0x4d, 0x14, 0x45, 0xe5, + 0xee, 0x9b, 0xc0, 0xe0, 0xf2, 0xb6, 0x78, 0xab, + 0xff, 0x00, 0xc4, 0x64, 0xcc, 0x11, 0xd1, 0x46, + 0x1a, 0x40, 0x8a, 0x3d, 0xfd, 0xdd, 0x7e, 0x37, + 0x22, 0x82, 0x66, 0x9c, 0xd4, 0xf9, 0x3b, 0x87, + 0x89, 0xe2, 0x94, 0xcd, 0x1b, 0x5a, 0x4b, 0xae, + 0x5c, 0x6a, 0x43, 0xbb, 0xc0, 0xd2, 0xea, 0xef, + 0x50, 0xb2, 0x46, 0xf8, 0xa4, 0x7c, 0x52, 0x0e, + 0x17, 0xc6, 0x4b, 0x5c, 0xd3, 0xc8, 0x41, 0xa1, + 0x08, 0x3e, 0x42, 0x22, 0x20, 0x93, 0xd3, 0xf6, + 0x82, 0xe2, 0xfc, 0x3d, 0xc2, 0xac, 0x80, 0x71, + 0x9e, 0x7e, 0x45, 0x6e, 0x2f, 0x51, 0x18, 0x1b, + 0x7f, 0x36, 0xb1, 0x0f, 0x70, 0xa3, 0xe6, 0xee, + 0x8f, 0x37, 0xc5, 0x52, 0x3c, 0x6b, 0x5a, 0x63, + 0x24, 0x33, 0xab, 0x3b, 0x21, 0x7a, 0xf3, 0x8d, + 0x63, 0xe3, 0x5f, 0x3c, 0x4a, 0x72, 0xa1, 0x90, + 0xb9, 0x59, 0xb4, 0x0d, 0xd0, 0x66, 0x5a, 0xe2, + 0xdc, 0x9a, 0x0b, 0x98, 0x43, 0x80, 0xfd, 0x68, + 0xcf, 0xfa, 0x39, 0x55, 0x38, 0x94, 0x8e, 0x9b, + 0xbc, 0xf3, 0x5c, 0xf5, 0x94, 0xc7, 0x60, 0x32, + 0x74, 0x4e, 0x3d, 0x69, 0x07, 0x0a, 0x8a, 0xba, + 0x62, 0x56, 0x8e, 0x89, 0x75, 0x67, 0x8d, 0xc5, + 0x45, 0xea, 0x2c, 0x58, 0xcb, 0x61, 0x6e, 0xac, + 0x69, 0xfc, 0x47, 0xb3, 0x8a, 0x13, 0xd4, 0x91, + 0x9d, 0xd3, 0x3d, 0xf0, 0xa5, 0x1d, 0xb4, 0x2f, + 0x95, 0x97, 0x6f, 0x52, 0xea, 0x36, 0x96, 0xc9, + 0xb6, 0xfe, 0xd2, 0x11, 0x50, 0x2e, 0x6d, 0x68, + 0xcb, 0x86, 0x38, 0x77, 0x5b, 0x37, 0x15, 0x74, + 0xb7, 0x9d, 0x93, 0xc7, 0xc4, 0xdd, 0xe3, 0xbe, + 0x1b, 0x88, 0x5c, 0xe9, 0xb1, 0x7e, 0x0b, 0xaf, + 0xee, 0x2d, 0x58, 0x29, 0x05, 0xe3, 0x8b, 0x98, + 0x36, 0xd0, 0x36, 0x61, 0xc6, 0x37, 0x75, 0x1d, + 0x55, 0x77, 0xc5, 0x34, 0xb2, 0x47, 0x8d, 0xed, + 0x76, 0xe7, 0x72, 0xd4, 0x75, 0x55, 0xaa, 0x8c, + 0x93, 0xd1, 0x9a, 0x7a, 0x51, 0x09, 0x34, 0x44, + 0x55, 0x48, 0x88, 0x88, 0x08, 0x37, 0x84, 0x41, + 0xbc, 0x20, 0xa0, 0x68, 0xdf, 0xef, 0x8b, 0xee, + 0x6b, 0x8f, 0xb4, 0x0b, 0xa4, 0x2e, 0x6f, 0xa3, + 0x7f, 0xbe, 0x2f, 0xb9, 0xae, 0x3e, 0xd0, 0x2e, + 0x90, 0xb1, 0xc3, 0xec, 0x79, 0xd2, 0xf4, 0xfe, + 0x33, 0xcc, 0xd3, 0xea, 0xad, 0xea, 0x45, 0xe6, + 0xfe, 0xa6, 0x3f, 0x0f, 0xe0, 0x2b, 0x35, 0xa7, + 0xa3, 0x45, 0xe0, 0x8e, 0xd2, 0xc3, 0x9b, 0xfa, + 0x98, 0xfc, 0x3f, 0x80, 0xac, 0xd6, 0x9e, 0x8d, + 0x17, 0x82, 0x3b, 0x4b, 0x8a, 0xcf, 0xf6, 0x78, + 0x8f, 0x55, 0x43, 0x8e, 0xae, 0x5e, 0xde, 0xfc, + 0xb2, 0xa2, 0x22, 0xf4, 0xd8, 0x08, 0x88, 0x80, + 0xbe, 0x64, 0x7b, 0x63, 0x61, 0x7b, 0xb6, 0x06, + 0xef, 0x5f, 0x4b, 0x57, 0x22, 0xfe, 0x1b, 0x62, + 0xde, 0x57, 0x9e, 0x10, 0x39, 0xd0, 0x41, 0xe5, + 0xf2, 0x2c, 0x74, 0x26, 0xe9, 0xcd, 0x24, 0x47, + 0xb9, 0xad, 0x3b, 0xdd, 0x5a, 0x35, 0xbe, 0xea, + 0xb0, 0xe3, 0x6d, 0x0d, 0xad, 0x84, 0x70, 0x38, + 0x01, 0x27, 0x0f, 0x14, 0x94, 0xfd, 0x37, 0x6d, + 0x77, 0xbe, 0x54, 0x0c, 0x76, 0x8d, 0xb9, 0xbc, + 0xb5, 0xb6, 0x97, 0xba, 0x11, 0x3d, 0xb3, 0xb8, + 0x72, 0x11, 0x17, 0x75, 0xe3, 0x51, 0x59, 0xda, + 0x6a, 0xd0, 0xa7, 0xb8, 0x3f, 0x38, 0xea, 0x36, + 0xcf, 0x1e, 0x6e, 0xf2, 0x09, 0xc9, 0x2f, 0x82, + 0x67, 0xc7, 0xb7, 0xa8, 0x1c, 0x56, 0xb5, 0xb6, + 0x3a, 0xfa, 0xea, 0x0b, 0x8b, 0x9b, 0x78, 0x5d, + 0x24, 0x36, 0x8d, 0x0f, 0xb8, 0x78, 0xdc, 0xc0, + 0x77, 0x55, 0x59, 0x7d, 0xa9, 0x58, 0x0b, 0x4d, + 0x5f, 0x70, 0xf6, 0x8a, 0x32, 0xe9, 0x8c, 0x98, + 0x73, 0x91, 0xc2, 0xef, 0x7d, 0xab, 0xeb, 0xd9, + 0xa4, 0xd0, 0x9c, 0xa5, 0xf6, 0x3e, 0x78, 0xc4, + 0xd1, 0x5e, 0xd9, 0xc8, 0x3a, 0x12, 0x68, 0x1e, + 0x59, 0xdd, 0x86, 0xd4, 0x28, 0x15, 0xf9, 0x30, + 0x77, 0x8c, 0xc2, 0xc1, 0x99, 0x05, 0xaf, 0xb7, + 0xb9, 0x94, 0xc0, 0xc6, 0x36, 0xa5, 0xe1, 0xe3, + 0xf4, 0x85, 0x39, 0x79, 0x16, 0xc7, 0xe5, 0x0d, + 0x42, 0xd9, 0x2d, 0x99, 0x35, 0xa9, 0x81, 0xb7, + 0x6f, 0x6c, 0x4c, 0x91, 0xe4, 0x70, 0xb5, 0xcf, + 0xef, 0x43, 0xe9, 0xde, 0xd7, 0xae, 0xad, 0x56, + 0x3a, 0x9b, 0x15, 0x3e, 0x0a, 0xe6, 0x27, 0x59, + 0xdb, 0x63, 0x86, 0x26, 0xea, 0x2b, 0x98, 0x2d, + 0x18, 0xee, 0xea, 0x4e, 0x17, 0x77, 0x60, 0x71, + 0xef, 0x76, 0xc4, 0xcd, 0xeb, 0x1c, 0x47, 0x41, + 0x75, 0x36, 0x3e, 0xed, 0xa7, 0xcf, 0x24, 0x8e, + 0x76, 0x5a, 0x43, 0x09, 0x6b, 0xc3, 0xd8, 0xe0, + 0xfa, 0xcf, 0x24, 0x95, 0xa9, 0x1c, 0x9c, 0x28, + 0x22, 0x1b, 0xa1, 0x99, 0x6b, 0x2d, 0xc9, 0xca, + 0xdf, 0x30, 0x45, 0x8e, 0x87, 0xa5, 0xbf, 0x65, + 0xb7, 0x76, 0xf6, 0x38, 0xbb, 0x85, 0x91, 0xf2, + 0x0a, 0x9a, 0xaf, 0xab, 0x7d, 0x2f, 0x83, 0xbc, + 0xb0, 0xca, 0x49, 0x8c, 0x96, 0x7b, 0xb9, 0x20, + 0xb7, 0x65, 0xcd, 0x9b, 0xde, 0xc3, 0x19, 0xdf, + 0x49, 0x58, 0x5b, 0xf1, 0xa9, 0xd6, 0x5a, 0xd7, + 0x3a, 0xd4, 0xb7, 0x50, 0x5f, 0x65, 0x2c, 0x6d, + 0x9a, 0xeb, 0x4c, 0x8b, 0x78, 0x2e, 0x6c, 0xee, + 0x7b, 0xa6, 0x3c, 0x53, 0x6f, 0x17, 0x0f, 0x5f, + 0x6a, 0xc4, 0xdd, 0x4f, 0xa9, 0x2f, 0xf2, 0x50, + 0xc9, 0x88, 0x67, 0x9a, 0xc9, 0x6d, 0x0b, 0xa3, + 0x82, 0xda, 0xd1, 0xbd, 0xcb, 0x22, 0xde, 0xfe, + 0xe4, 0xd6, 0xbe, 0xea, 0x0b, 0x8c, 0x38, 0xbb, + 0x48, 0xec, 0xbc, 0xda, 0x28, 0x05, 0xb4, 0x19, + 0x8c, 0x40, 0x99, 0xd1, 0x1d, 0x9f, 0xc7, 0xb6, + 0x75, 0x5e, 0x4f, 0x17, 0x29, 0x0b, 0xeb, 0x2b, + 0x9e, 0xc5, 0x3b, 0x1f, 0x3d, 0xc5, 0xa5, 0xcd, + 0xb3, 0x6c, 0xa7, 0xb4, 0x6b, 0x04, 0x4f, 0x95, + 0xcf, 0x78, 0x91, 0xad, 0x00, 0x47, 0x1d, 0xb0, + 0x00, 0x35, 0xc1, 0xdf, 0x19, 0x51, 0x5f, 0x69, + 0xa8, 0xf2, 0xd6, 0xcd, 0xc9, 0xdd, 0x4f, 0x24, + 0x90, 0xbe, 0x49, 0x22, 0x64, 0x92, 0x3c, 0x9e, + 0xec, 0x0e, 0x27, 0x35, 0xad, 0x1b, 0xaa, 0xb1, + 0x5a, 0xe9, 0x5c, 0xb4, 0xe6, 0x2e, 0x26, 0xb2, + 0x06, 0xcc, 0xd2, 0xf6, 0xba, 0x57, 0x86, 0xd1, + 0xa1, 0xbc, 0x75, 0x73, 0x77, 0x8e, 0xe4, 0x57, + 0x72, 0x0b, 0x35, 0xde, 0xb4, 0xc4, 0xdc, 0x61, + 0xe7, 0x8a, 0xf2, 0x47, 0xe4, 0xae, 0x6e, 0x2d, + 0xc4, 0x4d, 0x8e, 0x6b, 0x78, 0xda, 0xe8, 0xe5, + 0x02, 0x9c, 0x66, 0x76, 0xed, 0x34, 0xe4, 0x54, + 0x15, 0x67, 0xb4, 0xd1, 0x62, 0x79, 0x19, 0x11, + 0xbd, 0x61, 0x93, 0x85, 0x93, 0x4a, 0xd6, 0xb4, + 0xf0, 0x88, 0x64, 0x77, 0x08, 0x73, 0x5e, 0x68, + 0xd2, 0x76, 0xee, 0x5b, 0xb6, 0xba, 0x7b, 0x15, + 0x19, 0x7b, 0x9f, 0x6b, 0x21, 0x94, 0xf0, 0x86, + 0x5a, 0xde, 0xc8, 0xd8, 0x89, 0x60, 0x71, 0x6c, + 0xb2, 0xb4, 0xb6, 0x9b, 0xb9, 0x10, 0x53, 0xed, + 0xe0, 0x96, 0xe2, 0x66, 0x43, 0x0b, 0x0b, 0xe5, + 0x79, 0xa3, 0x18, 0x37, 0x93, 0xd4, 0x0a, 0xd1, + 0xa4, 0xb0, 0x77, 0xb2, 0x5c, 0x49, 0x74, 0x6d, + 0xdf, 0x58, 0x89, 0x8d, 0x95, 0x69, 0x03, 0x8b, + 0xe3, 0x6f, 0xea, 0x2d, 0xc3, 0x94, 0xc2, 0x63, + 0xe4, 0x8e, 0x1c, 0x77, 0x47, 0xfc, 0x38, 0xcf, + 0x47, 0x23, 0x18, 0x0c, 0x9e, 0x71, 0x14, 0xb5, + 0x8d, 0xdc, 0x7b, 0xfb, 0xb6, 0x6c, 0x56, 0x1f, + 0xc6, 0x21, 0x8a, 0x26, 0x45, 0x18, 0x7c, 0xd1, + 0xbb, 0xa5, 0xe9, 0x9b, 0x21, 0xa5, 0x44, 0xe7, + 0x89, 0xc3, 0x67, 0x2b, 0x4a, 0xb5, 0x11, 0x39, + 0x72, 0xa2, 0xa9, 0xc8, 0xcb, 0x1e, 0x16, 0x67, + 0x5b, 0xb9, 0xce, 0x25, 0xb3, 0x8a, 0x81, 0x11, + 0x1c, 0xa0, 0xb7, 0x97, 0x99, 0xd5, 0x59, 0x1d, + 0x84, 0x64, 0x0c, 0x96, 0x59, 0xa6, 0x2e, 0x6c, + 0x2d, 0x24, 0xb1, 0x83, 0xba, 0xe2, 0x6d, 0x2a, + 0x36, 0xf2, 0x2d, 0x39, 0x33, 0xd7, 0x24, 0x70, + 0x44, 0x04, 0x71, 0xb4, 0x06, 0xb1, 0xbd, 0xf1, + 0x0d, 0x0d, 0xe0, 0xdf, 0xcc, 0xb5, 0x26, 0xc9, + 0x5e, 0x4e, 0x00, 0x96, 0x67, 0x38, 0x01, 0x4d, + 0x9b, 0x2a, 0x3a, 0xf4, 0xde, 0xb4, 0xe9, 0x67, + 0xd0, 0x90, 0xcb, 0xd9, 0x5b, 0x5b, 0xc1, 0x0c, + 0xd6, 0xf5, 0x0d, 0x79, 0xe1, 0x21, 0xe7, 0xba, + 0x3b, 0x2b, 0x5a, 0x6e, 0xec, 0x28, 0xe8, 0xae, + 0x4c, 0x13, 0x45, 0x70, 0x37, 0xc3, 0x23, 0x1f, + 0xee, 0x03, 0xb5, 0x60, 0x2f, 0x27, 0x79, 0x27, + 0x9f, 0x6a, 0xf8, 0x26, 0xad, 0x2d, 0xea, 0x82, + 0x13, 0xb8, 0x77, 0x72, 0xbb, 0x23, 0x1e, 0x24, + 0x8c, 0x3d, 0xbb, 0x5a, 0xf0, 0x1c, 0x3d, 0xd1, + 0x55, 0x8a, 0x48, 0xe3, 0x96, 0x37, 0x45, 0x2b, + 0x78, 0xa3, 0x91, 0xa5, 0x8f, 0x69, 0xe5, 0x6b, + 0x85, 0x08, 0x5a, 0x7a, 0x6e, 0xec, 0x5d, 0xe0, + 0xec, 0xe6, 0xad, 0x49, 0x8c, 0x34, 0xf3, 0xb7, + 0xb9, 0x5b, 0xc7, 0x7d, 0x16, 0x39, 0x9a, 0xb9, + 0x86, 0x0a, 0xb8, 0x5d, 0x41, 0x7b, 0xa7, 0xe7, + 0x3b, 0x1c, 0xf2, 0xdb, 0x77, 0x11, 0x50, 0x48, + 0xee, 0x99, 0xfb, 0x4d, 0x2a, 0xff, 0x00, 0x8c, + 0x9d, 0xad, 0x63, 0x60, 0x93, 0x63, 0xf7, 0x82, + 0x37, 0x15, 0x49, 0xf6, 0x95, 0x6a, 0xfb, 0x2c, + 0xbd, 0x86, 0x6a, 0x01, 0x47, 0x3c, 0x06, 0xb8, + 0x8f, 0xf7, 0x21, 0x21, 0xcd, 0xec, 0xb4, 0xfb, + 0xca, 0xcf, 0x04, 0x8d, 0xb9, 0x30, 0x5d, 0xc3, + 0xb5, 0xb2, 0x35, 0xb2, 0x35, 0xb5, 0xf8, 0xae, + 0xdb, 0xf0, 0xab, 0x55, 0xd3, 0x92, 0xae, 0xb4, + 0x47, 0x76, 0x3a, 0x93, 0xe8, 0x80, 0xd4, 0x57, + 0xaa, 0x8a, 0xa9, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x46, 0x65, 0xbe, 0xba, 0x1e, 0x63, 0xdb, 0x53, + 0x6d, 0xef, 0x47, 0x32, 0x84, 0xcb, 0x7d, 0x74, + 0x3c, 0xc7, 0xb6, 0xa6, 0xdb, 0xde, 0x8e, 0x65, + 0xe7, 0x60, 0xf9, 0xec, 0x76, 0x9b, 0x5f, 0xa6, + 0x5d, 0x17, 0x78, 0x36, 0x74, 0x55, 0xad, 0x86, + 0xf3, 0xd1, 0x66, 0xf2, 0x6f, 0xf1, 0x4a, 0xa9, + 0x68, 0x4d, 0xd7, 0x9f, 0xca, 0xf9, 0xea, 0xdb, + 0x79, 0xe8, 0xb3, 0x79, 0x37, 0xf8, 0xa5, 0x54, + 0xb4, 0x26, 0xeb, 0xcf, 0xe5, 0x7c, 0xf5, 0xea, + 0xd3, 0xb1, 0x57, 0x79, 0xc3, 0x5f, 0x1a, 0xd7, + 0x9c, 0xb5, 0xa2, 0x22, 0xcd, 0xb0, 0x88, 0x88, + 0x08, 0x8b, 0xc7, 0x10, 0xd6, 0x92, 0x79, 0x02, + 0x08, 0xac, 0x8d, 0xeb, 0x64, 0x73, 0xed, 0xda, + 0x2b, 0x4a, 0x6e, 0x34, 0x3d, 0x75, 0xa5, 0xa5, + 0x03, 0x6f, 0x6f, 0xee, 0xaf, 0xc3, 0x7f, 0x85, + 0x68, 0x7c, 0xd6, 0xdd, 0xe7, 0x7b, 0x9f, 0xb0, + 0xcc, 0xfe, 0xd0, 0x5f, 0x17, 0x72, 0xb6, 0x28, + 0xe6, 0xb9, 0x90, 0xd2, 0x37, 0x02, 0xe3, 0xd5, + 0x02, 0x87, 0x6a, 0x96, 0xd3, 0x38, 0xf1, 0x8d, + 0xc3, 0xda, 0xda, 0xfc, 0x7e, 0x02, 0xf9, 0x49, + 0xde, 0x5f, 0x21, 0xe3, 0x71, 0x3d, 0x95, 0x3d, + 0xc9, 0x47, 0x75, 0x55, 0xf6, 0xc7, 0x61, 0xd3, + 0x61, 0x2d, 0xaf, 0x40, 0xa9, 0xb6, 0x96, 0x84, + 0xf5, 0x9e, 0xb9, 0x04, 0x11, 0x89, 0x66, 0x8e, + 0x22, 0xf6, 0xc6, 0x24, 0x70, 0x69, 0x7b, 0xbb, + 0xd6, 0xd4, 0xd2, 0xae, 0xeb, 0x2f, 0xd0, 0x5a, + 0xe6, 0xc3, 0xcf, 0xf4, 0xb5, 0xfc, 0x20, 0x71, + 0x39, 0xb1, 0x99, 0x18, 0x3a, 0xed, 0xda, 0xbf, + 0x3d, 0x28, 0x4a, 0xf1, 0x0e, 0x83, 0xc0, 0x41, + 0x8d, 0x9b, 0x2b, 0x90, 0xcd, 0x89, 0xed, 0x6d, + 0x9c, 0x19, 0x37, 0x99, 0x33, 0x8e, 0x8e, 0x76, + 0xe1, 0x52, 0xb6, 0xf1, 0x7a, 0x27, 0x4f, 0x65, + 0xf4, 0x93, 0xee, 0xec, 0x5c, 0xf1, 0x93, 0x92, + 0x49, 0x19, 0x6a, 0xf9, 0x1d, 0xdf, 0x96, 0x1a, + 0x86, 0x70, 0xee, 0x04, 0xb5, 0x46, 0xe8, 0x89, + 0xad, 0xe7, 0xc1, 0xe7, 0xf1, 0x37, 0x12, 0x32, + 0x36, 0xcd, 0x6f, 0xd3, 0x45, 0xc6, 0x43, 0x47, + 0x1b, 0x37, 0x52, 0xab, 0x0e, 0x03, 0x51, 0xdb, + 0x58, 0x69, 0x6b, 0xdb, 0x27, 0xcc, 0x62, 0xbe, + 0x86, 0xe2, 0x3b, 0x9b, 0x0a, 0x54, 0xd5, 0xed, + 0x3d, 0xd0, 0xaf, 0x22, 0x0b, 0x2e, 0x1b, 0x17, + 0x8f, 0x3a, 0x06, 0x4c, 0x74, 0xd0, 0x35, 0xb9, + 0x2b, 0xb8, 0x2e, 0x26, 0x0f, 0x2d, 0x1c, 0x7f, + 0xc2, 0x77, 0x7b, 0xc5, 0xbf, 0x91, 0x6c, 0xe9, + 0x9d, 0x3b, 0x7b, 0x0e, 0x00, 0xe1, 0x7a, 0x06, + 0xf4, 0x19, 0x4b, 0x27, 0xcf, 0x71, 0x74, 0xe2, + 0x00, 0x33, 0x3c, 0x7f, 0x09, 0x83, 0x6d, 0x68, + 0xd1, 0xbd, 0x41, 0x64, 0xbd, 0xa4, 0xdb, 0xcb, + 0x96, 0xb1, 0xc8, 0x5a, 0x59, 0xf7, 0x10, 0x5b, + 0x49, 0x14, 0xf6, 0xee, 0xa3, 0x5a, 0xe7, 0xcb, + 0xdf, 0xd2, 0x9c, 0x8a, 0xab, 0x69, 0xa8, 0x72, + 0xb6, 0x37, 0xed, 0xbe, 0xb5, 0x9d, 0xed, 0x7c, + 0x45, 0xdd, 0x13, 0x1e, 0xe2, 0xf6, 0xb5, 0xae, + 0xd9, 0xc2, 0x1a, 0x76, 0x52, 0x88, 0x2d, 0xf9, + 0x8c, 0x25, 0xf6, 0x6b, 0x4a, 0xe3, 0x6d, 0x71, + 0x7c, 0x37, 0x57, 0x58, 0x47, 0x3e, 0xda, 0xf6, + 0xd6, 0x27, 0x03, 0xdd, 0x57, 0xbf, 0x6f, 0x54, + 0x28, 0x0d, 0x4b, 0xa7, 0xa1, 0xc2, 0x63, 0x71, + 0xcc, 0xb9, 0x9d, 0xee, 0xcc, 0x4e, 0xd2, 0xeb, + 0x8b, 0x62, 0xe0, 0xe6, 0xc4, 0xcf, 0x8a, 0x3a, + 0xcb, 0x06, 0x33, 0x15, 0xa8, 0xae, 0x00, 0xbe, + 0xc7, 0x3c, 0xc6, 0xeb, 0xa3, 0x23, 0x9a, 0x63, + 0x93, 0x81, 0xcf, 0x2c, 0x1c, 0x6f, 0x01, 0xa0, + 0xac, 0x59, 0x0c, 0x2e, 0x46, 0xdf, 0x29, 0x1c, + 0x19, 0x07, 0x3e, 0x57, 0xcc, 0xd8, 0xe4, 0x96, + 0x61, 0x57, 0x96, 0xb2, 0x4a, 0x77, 0xd5, 0xe5, + 0x6f, 0x2a, 0x09, 0xdb, 0x1d, 0x57, 0x69, 0x85, + 0xd1, 0xb6, 0xb6, 0x56, 0x42, 0x1b, 0x9c, 0x8c, + 0x97, 0x0f, 0x9a, 0x68, 0xe6, 0x67, 0x18, 0x88, + 0x7c, 0x53, 0xb7, 0x65, 0x57, 0xd3, 0xfd, 0xa4, + 0x3a, 0x59, 0xed, 0x32, 0x52, 0xd9, 0x35, 0xf9, + 0x58, 0x22, 0x7d, 0xbd, 0xc4, 0xa0, 0xf0, 0xc7, + 0x2c, 0x6f, 0x1b, 0x01, 0x03, 0xa8, 0xb6, 0xc7, + 0xb3, 0xec, 0x6d, 0xbd, 0xce, 0x42, 0x39, 0x25, + 0x75, 0xc5, 0xb9, 0x84, 0x0c, 0x64, 0xe0, 0xd2, + 0xb3, 0xb8, 0x57, 0x81, 0xc1, 0xbc, 0xa1, 0x45, + 0xea, 0x0c, 0x05, 0x85, 0xa6, 0x9a, 0xb3, 0xba, + 0xb5, 0x74, 0x26, 0x7b, 0x77, 0x88, 0xee, 0x9e, + 0xc7, 0x87, 0x3e, 0x57, 0x4a, 0xde, 0x3d, 0xa0, + 0x6e, 0xe1, 0xdc, 0x82, 0x0e, 0xc7, 0x3b, 0x7f, + 0x8d, 0x96, 0xee, 0x4b, 0x07, 0x08, 0x5b, 0x7a, + 0xd7, 0x32, 0x56, 0x11, 0xc4, 0x38, 0x1c, 0x6b, + 0xc3, 0xb5, 0x58, 0xb0, 0x32, 0x5e, 0x1b, 0x08, + 0xa6, 0xba, 0x99, 0xef, 0x75, 0x38, 0x20, 0x04, + 0xf7, 0x91, 0x0e, 0x46, 0xf5, 0x2a, 0xaa, 0x76, + 0x56, 0xce, 0xba, 0xba, 0x8e, 0x06, 0xfc, 0x73, + 0xdd, 0x1e, 0xa0, 0xe5, 0x57, 0x56, 0x86, 0x31, + 0x8d, 0x63, 0x36, 0x35, 0xa0, 0x35, 0xa3, 0xac, + 0x15, 0xe8, 0x8e, 0x9c, 0xaa, 0xd5, 0x3d, 0xc6, + 0x62, 0xed, 0xb5, 0x3b, 0xfa, 0xab, 0xc2, 0xf5, + 0x88, 0xb9, 0x78, 0x5c, 0xb4, 0x51, 0x94, 0xbd, + 0x7c, 0xbc, 0xd5, 0xae, 0x1d, 0x50, 0x42, 0xc7, + 0xc4, 0xbc, 0xe3, 0xdb, 0x55, 0x03, 0xac, 0x69, + 0xdb, 0xbf, 0x3c, 0xc2, 0x59, 0xcf, 0x5a, 0x93, + 0x10, 0x6b, 0xa9, 0xd5, 0x6f, 0x72, 0x56, 0xe9, + 0xde, 0x42, 0xad, 0xfb, 0x3d, 0xba, 0xe9, 0x30, + 0xd2, 0x5b, 0x13, 0x53, 0x6d, 0x33, 0x80, 0xe6, + 0x77, 0x74, 0x15, 0x95, 0xfd, 0xf2, 0xc5, 0xac, + 0x66, 0x73, 0xfd, 0x75, 0x01, 0xc5, 0x67, 0x6c, + 0x75, 0x04, 0x4d, 0xfe, 0x1c, 0xbf, 0xc1, 0xb9, + 0x03, 0x94, 0xb0, 0x6c, 0xec, 0xb3, 0xb4, 0xac, + 0x38, 0x8b, 0xa8, 0xda, 0x05, 0xcb, 0x48, 0x75, + 0xbc, 0xc0, 0x18, 0xdc, 0xd1, 0xf1, 0x4f, 0x2a, + 0xfa, 0xd6, 0x78, 0xdf, 0xc4, 0x74, 0xe5, 0xe4, + 0x40, 0x56, 0x48, 0x5b, 0xd3, 0xc5, 0xd5, 0xe2, + 0x8b, 0xba, 0xf7, 0xdb, 0x50, 0xab, 0x5a, 0x26, + 0xef, 0xce, 0xf0, 0x66, 0xd9, 0xc6, 0x86, 0xd6, + 0x4e, 0x11, 0xbf, 0x6b, 0x5f, 0xdd, 0x37, 0xb0, + 0x6a, 0xad, 0x3d, 0x34, 0xe5, 0xea, 0xe8, 0x44, + 0x67, 0xc8, 0xbf, 0x82, 0x1c, 0x01, 0x1b, 0x41, + 0xda, 0x0a, 0xf5, 0x6b, 0xd8, 0xf1, 0x79, 0xb3, + 0x1a, 0xe1, 0x47, 0x37, 0x61, 0x0b, 0x61, 0x55, + 0x22, 0x22, 0x20, 0x22, 0x22, 0x08, 0xed, 0x47, + 0xea, 0x3b, 0xcf, 0x27, 0xf3, 0x9a, 0xb5, 0xf4, + 0x37, 0xa9, 0x9d, 0xe5, 0xdf, 0xda, 0x6a, 0xd8, + 0xd4, 0x7e, 0xa3, 0xbc, 0xf2, 0x7f, 0x39, 0xab, + 0x5f, 0x43, 0x7a, 0x99, 0xde, 0x5d, 0xfd, 0xa6, + 0xab, 0xc7, 0x0e, 0x74, 0xb1, 0x9e, 0x62, 0x9d, + 0xc9, 0xd6, 0xb1, 0x22, 0x22, 0xa3, 0x61, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x6a, 0xe4, 0x3d, 0x0a, + 0xe7, 0xc9, 0x3f, 0xc5, 0x2b, 0x69, 0x6a, 0xe4, + 0x3d, 0x0a, 0xe7, 0xc9, 0x3f, 0xc5, 0x2a, 0x69, + 0xcf, 0x0a, 0xdc, 0xd8, 0xab, 0x44, 0xea, 0x41, + 0x69, 0x3f, 0x47, 0xb8, 0xf0, 0xdb, 0xe2, 0xa9, + 0xe5, 0x03, 0xa4, 0xfd, 0x1e, 0xe3, 0xc3, 0x6f, + 0x8a, 0xa7, 0x96, 0x98, 0x8e, 0x2d, 0x5a, 0x7e, + 0xe6, 0x18, 0x1e, 0x5a, 0xde, 0x89, 0xd6, 0x22, + 0x22, 0xc9, 0xd2, 0x22, 0x22, 0x0d, 0x4c, 0x9f, + 0x48, 0x6d, 0x9c, 0xc8, 0xcd, 0x0b, 0xb6, 0x2a, + 0x86, 0x79, 0x92, 0x48, 0xcb, 0x5c, 0x40, 0x77, + 0x13, 0xef, 0x6e, 0x62, 0x84, 0x90, 0x6b, 0xdc, + 0x13, 0x57, 0xfb, 0xc1, 0x5b, 0x32, 0x91, 0x17, + 0x46, 0xc7, 0x87, 0x70, 0xd0, 0xd1, 0xd4, 0xea, + 0x15, 0x55, 0xb4, 0x8a, 0x49, 0xf5, 0xb5, 0x8c, + 0x4e, 0x1f, 0xc2, 0xb5, 0x8a, 0x5b, 0x96, 0xf2, + 0x9a, 0xd3, 0xa3, 0x04, 0xfb, 0xa5, 0x4d, 0x39, + 0xd1, 0x2b, 0xeb, 0x28, 0x18, 0x03, 0x45, 0x1a, + 0x05, 0x00, 0xea, 0x01, 0xb1, 0x70, 0x0f, 0x68, + 0x36, 0x1e, 0x63, 0xab, 0xf2, 0x11, 0x81, 0x46, + 0x4a, 0xf1, 0x33, 0x39, 0xa4, 0x1c, 0x5d, 0xb5, + 0xdf, 0xa3, 0xef, 0x69, 0xd4, 0x5c, 0x8f, 0xdb, + 0x35, 0x87, 0x45, 0x96, 0xb2, 0xbf, 0x03, 0x65, + 0xc4, 0x46, 0x37, 0x1f, 0xd6, 0x8c, 0xd7, 0xb4, + 0xe5, 0x09, 0x6a, 0x7b, 0x2f, 0xca, 0x9b, 0x27, + 0x66, 0x21, 0xe1, 0x12, 0x83, 0x6d, 0xd3, 0xf4, + 0x27, 0xe3, 0x08, 0xcf, 0x76, 0x3f, 0x64, 0xab, + 0x35, 0xa3, 0x71, 0x78, 0xcb, 0x6b, 0x5c, 0x75, + 0xac, 0xad, 0xfc, 0x33, 0x51, 0xba, 0xea, 0x46, + 0x17, 0x10, 0x1a, 0xd6, 0xbe, 0x2a, 0xb1, 0x8f, + 0x27, 0x95, 0xae, 0xd8, 0xb9, 0x76, 0x17, 0xf1, + 0x47, 0x64, 0xe2, 0xb7, 0xc4, 0xca, 0x62, 0xbb, + 0xba, 0xac, 0x0d, 0x20, 0xf0, 0xd4, 0x3c, 0x50, + 0xb4, 0x93, 0xd5, 0x52, 0x36, 0xba, 0x53, 0x2b, + 0x75, 0x6f, 0x72, 0x6e, 0xe6, 0x31, 0x8c, 0x74, + 0xec, 0xb7, 0x7d, 0xbb, 0x89, 0x2e, 0xac, 0x86, + 0x84, 0xc6, 0x1c, 0x69, 0x4a, 0xd1, 0x05, 0xa7, + 0x0f, 0x9e, 0x8e, 0xda, 0xd6, 0xcc, 0x49, 0xa8, + 0xe3, 0xf3, 0x7b, 0x5f, 0xe1, 0xde, 0x59, 0x5d, + 0x42, 0x24, 0x78, 0x0c, 0x3d, 0xe4, 0x45, 0xa0, + 0xf1, 0x03, 0xc8, 0x54, 0x2e, 0x5f, 0x5a, 0xda, + 0x4d, 0x89, 0xbf, 0xc6, 0x63, 0x5b, 0x35, 0xb0, + 0x9a, 0xf9, 0xd7, 0x36, 0xce, 0x8c, 0xf0, 0x34, + 0x44, 0xe1, 0x47, 0x35, 0xd4, 0x35, 0xdb, 0xd4, + 0x51, 0x71, 0xe9, 0x39, 0x4c, 0xd0, 0xc3, 0x73, + 0x75, 0x15, 0xbc, 0xb3, 0xbc, 0x06, 0x42, 0xee, + 0x23, 0x27, 0x46, 0x5d, 0xc1, 0xd2, 0x1a, 0x0a, + 0x7b, 0xea, 0x42, 0x0d, 0x25, 0x8b, 0x73, 0x0f, + 0x14, 0xb3, 0xbd, 0x80, 0x4a, 0x5d, 0x76, 0x03, + 0x5b, 0x14, 0x66, 0x07, 0x06, 0xb9, 0x92, 0x37, + 0x78, 0x2e, 0xe7, 0x41, 0x59, 0xb6, 0xc9, 0xe4, + 0x2d, 0x76, 0x5b, 0xdc, 0x49, 0x1b, 0x78, 0xc4, + 0x85, 0xad, 0x71, 0x00, 0xb8, 0x72, 0x90, 0x37, + 0xa9, 0x16, 0xe7, 0x35, 0x2d, 0xee, 0x42, 0x6b, + 0xe8, 0x27, 0x99, 0x97, 0x37, 0x44, 0x36, 0x69, + 0x20, 0x05, 0x8d, 0x35, 0xee, 0x47, 0x17, 0x06, + 0xc5, 0x39, 0x25, 0xbe, 0x13, 0x1f, 0x33, 0x9e, + 0xd1, 0x69, 0x6a, 0xe7, 0x31, 0xec, 0xb0, 0x98, + 0xb8, 0xdc, 0x03, 0xb9, 0xcd, 0x96, 0x56, 0xf7, + 0x54, 0xea, 0x6e, 0xf7, 0x17, 0x97, 0x7a, 0xb3, + 0x19, 0x6d, 0xc1, 0x6d, 0x64, 0xd7, 0x18, 0x58, + 0xe9, 0x5b, 0x3b, 0x62, 0x1c, 0x11, 0xc8, 0x25, + 0x60, 0xab, 0x87, 0x33, 0xf6, 0x84, 0x10, 0xf3, + 0x69, 0x2d, 0x44, 0xeb, 0xc9, 0x59, 0x71, 0x1f, + 0xf1, 0x1b, 0x27, 0x47, 0x24, 0xd2, 0x3c, 0x50, + 0xbe, 0x9c, 0x5d, 0xf1, 0x24, 0x9e, 0xe7, 0x6a, + 0x93, 0xc6, 0x68, 0xfb, 0x77, 0x5a, 0x97, 0xdc, + 0x39, 0xb7, 0x0e, 0x96, 0xbd, 0x04, 0xd0, 0xb8, + 0x98, 0xdc, 0x1e, 0xc7, 0x06, 0x38, 0x6c, 0x06, + 0xad, 0x92, 0x95, 0x51, 0xf7, 0x5a, 0xba, 0xe1, + 0xfd, 0x1b, 0xed, 0xa3, 0xe8, 0xa6, 0x64, 0x91, + 0xcc, 0xe9, 0x1c, 0x78, 0xab, 0x23, 0x19, 0xd1, + 0x38, 0xf0, 0xee, 0xa3, 0xdb, 0xbc, 0x2d, 0x69, + 0xb5, 0x2e, 0x52, 0x7a, 0x08, 0x9e, 0x2d, 0x62, + 0x63, 0x43, 0x59, 0x0c, 0x03, 0x81, 0x8d, 0x00, + 0xf1, 0xec, 0x03, 0xf5, 0xb6, 0xa0, 0xb1, 0xc5, + 0xa4, 0x70, 0x96, 0x82, 0x19, 0x2e, 0x9e, 0xf9, + 0x8f, 0x05, 0x5c, 0xc7, 0x1e, 0x18, 0xe4, 0x73, + 0xa3, 0xe9, 0x1b, 0x47, 0xd0, 0x52, 0x84, 0x52, + 0x95, 0x5a, 0x39, 0x66, 0xe0, 0xe7, 0xc1, 0x40, + 0xfb, 0x28, 0xe1, 0xb6, 0xba, 0xab, 0x43, 0x61, + 0x8c, 0x87, 0xbd, 0xcf, 0x24, 0x87, 0x87, 0x3b, + 0x63, 0x87, 0x57, 0x6a, 0xae, 0x3e, 0xe2, 0x79, + 0x1a, 0xd6, 0xc9, 0x23, 0xde, 0xd6, 0x54, 0xb5, + 0xa4, 0x92, 0x01, 0x3d, 0x45, 0xbf, 0xa7, 0xed, + 0x04, 0xf7, 0x9d, 0x2b, 0x85, 0x59, 0x00, 0xe2, + 0x3e, 0x17, 0x22, 0x98, 0x8c, 0xb2, 0x4a, 0xcd, + 0x8e, 0xb7, 0x6d, 0x9d, 0x9c, 0x50, 0x0d, 0xed, + 0x15, 0x77, 0x5d, 0xc7, 0x7a, 0xd8, 0x2f, 0x58, + 0xb8, 0xd7, 0x9c, 0x6b, 0x56, 0x4c, 0x85, 0xeb, + 0xce, 0x25, 0x8c, 0xb9, 0x7c, 0x97, 0x26, 0x51, + 0x91, 0xee, 0x25, 0xae, 0xa6, 0xfa, 0x54, 0x7b, + 0x9b, 0x57, 0x5b, 0xc4, 0xdc, 0x8b, 0xbc, 0x6d, + 0xad, 0xc0, 0x35, 0xe9, 0x22, 0x69, 0x27, 0xaf, + 0x4a, 0x15, 0xc7, 0xf8, 0x97, 0x47, 0xd0, 0x57, + 0x5d, 0x36, 0x05, 0x91, 0x13, 0x53, 0x6d, 0x23, + 0xa3, 0xf7, 0x37, 0x85, 0x4a, 0xfb, 0x92, 0xbd, + 0x29, 0xf7, 0x0a, 0x12, 0xbc, 0x1b, 0x0d, 0x57, + 0xd3, 0xc6, 0xda, 0xaf, 0x95, 0x45, 0x94, 0xbc, + 0x73, 0x1b, 0x65, 0x95, 0xc9, 0x63, 0xc5, 0x18, + 0xd8, 0xa7, 0x74, 0x8c, 0x1f, 0xab, 0x27, 0x76, + 0x2b, 0xd6, 0xda, 0xad, 0x58, 0xe7, 0x87, 0xda, + 0x82, 0x0f, 0x16, 0xd3, 0x57, 0x75, 0x4a, 0xab, + 0x66, 0x6d, 0x9f, 0x16, 0xb8, 0x8e, 0x76, 0x1e, + 0x16, 0x5d, 0x59, 0x1e, 0x92, 0xbb, 0x89, 0x61, + 0x2c, 0xff, 0x00, 0x45, 0x39, 0x88, 0x99, 0xfd, + 0x33, 0xa3, 0xf8, 0xae, 0x1b, 0x47, 0x25, 0x47, + 0x51, 0x4d, 0x5d, 0xce, 0xd8, 0xca, 0x88, 0x4b, + 0xa2, 0x22, 0x84, 0x88, 0x88, 0x80, 0xa3, 0xf5, + 0x07, 0xaa, 0x67, 0xf9, 0x3e, 0x30, 0x52, 0x0a, + 0x3f, 0x50, 0x7a, 0xa6, 0x7f, 0x93, 0xe3, 0x05, + 0x7b, 0x7b, 0x74, 0xe9, 0x86, 0x58, 0x9e, 0x05, + 0xdd, 0xca, 0xf5, 0x3d, 0xd2, 0xbe, 0xa8, 0x6f, + 0x86, 0xfe, 0xda, 0x96, 0x7e, 0xe5, 0x13, 0xa5, + 0x7d, 0x50, 0xdf, 0x0d, 0xfd, 0xb5, 0x2c, 0xfd, + 0xca, 0x6e, 0xf1, 0x6b, 0xde, 0x94, 0x61, 0xb8, + 0x16, 0xf7, 0x61, 0xce, 0x6e, 0xbf, 0xc9, 0xe3, + 0xca, 0xb3, 0xec, 0x42, 0xbf, 0xaa, 0x05, 0xd7, + 0xf9, 0x3c, 0x79, 0x56, 0x7d, 0x88, 0x57, 0xf5, + 0xcb, 0x67, 0x3d, 0x7b, 0xf2, 0xf6, 0x3e, 0x29, + 0x9b, 0x07, 0xfc, 0x6b, 0x62, 0x22, 0x2d, 0x9e, + 0x68, 0x88, 0x88, 0x3c, 0x71, 0xa3, 0x49, 0x55, + 0xcb, 0xb2, 0xf8, 0x1f, 0x2d, 0xd4, 0xcf, 0xee, + 0x09, 0x35, 0x15, 0xdb, 0x41, 0xd6, 0x56, 0x29, + 0x19, 0xc7, 0x1b, 0x9b, 0xba, 0xa3, 0x7a, 0xa6, + 0xea, 0x18, 0xe7, 0xf3, 0x33, 0x1b, 0x0f, 0x14, + 0x92, 0xb9, 0xb0, 0xb8, 0x92, 0x76, 0x09, 0x1c, + 0x23, 0xd8, 0x3e, 0x52, 0x98, 0xce, 0x2c, 0x7a, + 0x7a, 0x17, 0x45, 0x86, 0xb4, 0xe3, 0xfa, 0xc9, + 0x59, 0xd3, 0x49, 0xe1, 0x4a, 0x7a, 0x43, 0xe3, + 0x29, 0x26, 0xef, 0x5f, 0x2d, 0x63, 0x63, 0x68, + 0x8d, 0xbd, 0xeb, 0x00, 0x68, 0xe6, 0x1b, 0x17, + 0xa3, 0x7a, 0x8e, 0xe8, 0xa2, 0xfb, 0x61, 0xb0, + 0xe9, 0xb0, 0x70, 0x5e, 0x01, 0xdd, 0x5b, 0x4d, + 0x42, 0x7f, 0x55, 0xe2, 0x8b, 0x91, 0xd9, 0xda, + 0xba, 0xf2, 0xf2, 0x1b, 0x46, 0x38, 0x31, 0xd3, + 0xbd, 0xb1, 0xb5, 0xce, 0xef, 0x41, 0x71, 0xa5, + 0x4a, 0xef, 0xda, 0xd6, 0xc3, 0xf1, 0x0d, 0x31, + 0x7f, 0x00, 0x15, 0x77, 0x44, 0x5e, 0xce, 0x76, + 0x77, 0x41, 0x7e, 0x7d, 0x8e, 0x47, 0x45, 0x23, + 0x25, 0x61, 0xa3, 0xa3, 0x70, 0x70, 0x3d, 0x42, + 0x0d, 0x50, 0x5a, 0x2e, 0x74, 0x1d, 0xf0, 0x92, + 0x08, 0x61, 0xba, 0x13, 0x3d, 0xf2, 0xbe, 0x07, + 0x87, 0xb1, 0xec, 0x0c, 0x31, 0x8e, 0x27, 0x39, + 0xbc, 0x5d, 0xf3, 0x69, 0xd4, 0x59, 0xf1, 0xba, + 0x1e, 0x33, 0x34, 0xa2, 0xe2, 0xe7, 0xa4, 0x74, + 0x44, 0x18, 0x5d, 0x18, 0xac, 0x4e, 0x3c, 0x3d, + 0x23, 0x43, 0x89, 0xea, 0xd2, 0x94, 0x5a, 0x92, + 0x6a, 0x7d, 0x4d, 0x93, 0xc8, 0x38, 0xd9, 0x35, + 0xec, 0x93, 0x20, 0xf6, 0x3e, 0x08, 0xc0, 0x2e, + 0xa3, 0xe3, 0x6f, 0x0d, 0x62, 0x2e, 0xdd, 0x5e, + 0x55, 0xab, 0x34, 0x1a, 0xaa, 0xf2, 0xe9, 0xd1, + 0x56, 0x57, 0xcd, 0x33, 0x2b, 0x24, 0x51, 0xbb, + 0x84, 0x06, 0xb0, 0xf0, 0xd1, 0xc0, 0x51, 0xa2, + 0x85, 0x04, 0xac, 0x97, 0x58, 0x3c, 0x3e, 0xa4, + 0x6d, 0xfb, 0x36, 0xf4, 0x8f, 0x6b, 0x8c, 0x0c, + 0x60, 0x74, 0x2c, 0x86, 0x56, 0x52, 0x41, 0xbf, + 0x78, 0xae, 0xe5, 0x92, 0xe3, 0x57, 0x63, 0xb1, + 0xec, 0xe8, 0xb1, 0xaf, 0x7c, 0xb2, 0xb0, 0xc6, + 0x7a, 0x68, 0xdb, 0xd1, 0xb5, 0xdd, 0x13, 0xf6, + 0x03, 0xcb, 0x43, 0x19, 0xa1, 0x51, 0x16, 0x9a, + 0x3f, 0x21, 0x2b, 0x1b, 0x3d, 0xe4, 0x91, 0xda, + 0x41, 0xd1, 0xba, 0x67, 0x97, 0x1e, 0x39, 0x04, + 0x6c, 0x3c, 0x25, 0xfd, 0x1b, 0x2a, 0x4e, 0xdd, + 0x8a, 0x47, 0xf2, 0x4c, 0x36, 0xf6, 0xe4, 0xdc, + 0x49, 0x25, 0xc4, 0x85, 0xc6, 0xb2, 0x40, 0x5a, + 0xd6, 0x45, 0x10, 0x68, 0x94, 0x3e, 0x50, 0xfd, + 0xa3, 0x89, 0xa7, 0x72, 0x0d, 0x37, 0x6b, 0x8c, + 0x93, 0x18, 0x21, 0xb7, 0x63, 0x19, 0x08, 0x2e, + 0xa3, 0x64, 0xee, 0xc9, 0x05, 0xfd, 0x23, 0x01, + 0xaf, 0x2b, 0x39, 0x14, 0x60, 0xc4, 0xe6, 0xaf, + 0x78, 0x2f, 0x19, 0x6b, 0x2c, 0xc2, 0xf5, 0xcf, + 0x31, 0xc8, 0xd6, 0xd4, 0x3d, 0xc0, 0xf7, 0x7b, + 0xba, 0x8a, 0xd9, 0x23, 0xf4, 0xa6, 0x33, 0x8e, + 0x58, 0x44, 0x0d, 0x7b, 0x99, 0x24, 0x76, 0x92, + 0xb0, 0xf4, 0xc5, 0xcd, 0x0c, 0xe2, 0x8e, 0x59, + 0x1a, 0x7b, 0xd7, 0x71, 0xec, 0x5a, 0xb2, 0x6b, + 0xab, 0x66, 0x37, 0x86, 0x1b, 0x79, 0x0f, 0x0f, + 0x77, 0x1b, 0x5a, 0xe1, 0x1c, 0x6d, 0x74, 0x91, + 0x74, 0x53, 0xb3, 0x84, 0x72, 0x13, 0xb4, 0x51, + 0x04, 0x76, 0x2b, 0x47, 0xde, 0x5c, 0x4f, 0x17, + 0x9f, 0xb7, 0xa1, 0x81, 0xe0, 0xf1, 0x35, 0xae, + 0x69, 0x95, 0xb5, 0xa8, 0x8c, 0xb9, 0x9c, 0x8d, + 0x73, 0xb6, 0x55, 0x4d, 0x43, 0xa0, 0x31, 0xf3, + 0xca, 0x65, 0x13, 0xc9, 0x15, 0xbb, 0x84, 0x6e, + 0x8d, 0xa2, 0x8e, 0x20, 0x16, 0x92, 0xe7, 0x3a, + 0xbc, 0x9c, 0x4d, 0xa2, 0xae, 0x9d, 0x57, 0x94, + 0xf3, 0x46, 0xdb, 0x47, 0xc1, 0x1b, 0xd8, 0x1a, + 0xcf, 0x39, 0x03, 0xf8, 0xc5, 0x91, 0xbb, 0x8e, + 0x36, 0x17, 0x57, 0x73, 0x4a, 0xd8, 0xc4, 0x5d, + 0x5f, 0x4e, 0x64, 0xbb, 0xb8, 0x9e, 0x47, 0xb8, + 0x8e, 0x8d, 0xb5, 0x24, 0x0e, 0x1a, 0xd4, 0x8d, + 0x8a, 0x63, 0x3a, 0x25, 0x79, 0x85, 0xba, 0x7e, + 0xd6, 0x77, 0x5b, 0xf0, 0xc4, 0x21, 0xe8, 0x63, + 0x2c, 0x99, 0xce, 0xe3, 0x24, 0x38, 0x77, 0x54, + 0x14, 0xa5, 0x42, 0xad, 0xc8, 0xe6, 0x09, 0x1c, + 0x23, 0x24, 0xb2, 0xa7, 0x84, 0x9d, 0x84, 0x8e, + 0x45, 0x87, 0x89, 0x79, 0xc4, 0xaf, 0x1d, 0x0a, + 0xb2, 0x17, 0x2f, 0x38, 0xd6, 0x3e, 0x25, 0xf3, + 0xc4, 0xa7, 0x28, 0xca, 0x5e, 0x8d, 0x95, 0xd1, + 0xb9, 0xb2, 0xb7, 0xbe, 0x8d, 0xc1, 0xed, 0xe7, + 0x69, 0xe2, 0x58, 0x78, 0x97, 0x9c, 0x7c, 0x8a, + 0xb2, 0x3b, 0x85, 0xa4, 0xed, 0xb9, 0xb4, 0x8a, + 0x76, 0x9a, 0x89, 0x58, 0xd7, 0x83, 0xe1, 0x0a, + 0xaf, 0xa5, 0x0b, 0xa2, 0x2f, 0x3c, 0xeb, 0x4d, + 0xda, 0x54, 0xd5, 0xd0, 0x83, 0x0b, 0xb9, 0xd8, + 0x68, 0x3d, 0xe5, 0x36, 0x77, 0xaa, 0x2e, 0xa8, + 0x6a, 0xe8, 0xdb, 0x6b, 0x9e, 0xc5, 0xe4, 0x68, + 0x07, 0x4a, 0xd7, 0xdb, 0x39, 0xc7, 0xf5, 0x4f, + 0x13, 0x7c, 0x62, 0xa6, 0x31, 0x92, 0x37, 0xce, + 0x03, 0x78, 0xaa, 0x78, 0x76, 0x37, 0xb6, 0x4a, + 0x8b, 0xf6, 0x93, 0x6c, 0x65, 0xd3, 0xa2, 0x66, + 0x77, 0xf6, 0xd7, 0x11, 0xbc, 0x1e, 0xa7, 0x15, + 0x63, 0xf8, 0x57, 0xdd, 0x9c, 0xb2, 0xc6, 0xc8, + 0x1f, 0xc5, 0x57, 0xf0, 0xb0, 0x92, 0x37, 0xd7, + 0x84, 0x56, 0xb5, 0x56, 0x9c, 0xd1, 0x3d, 0xe4, + 0x77, 0x65, 0x67, 0x45, 0xe3, 0x1c, 0x5c, 0xd0, + 0x4f, 0x28, 0x05, 0x7a, 0xaa, 0x91, 0x11, 0x10, + 0x10, 0x6f, 0x08, 0x83, 0x78, 0x41, 0x40, 0xd1, + 0xbf, 0xdf, 0x17, 0xdc, 0xd7, 0x1f, 0x68, 0x17, + 0x48, 0x5c, 0xdf, 0x46, 0xff, 0x00, 0x7c, 0x5f, + 0x73, 0x5c, 0x7d, 0xa0, 0x5d, 0x21, 0x63, 0x87, + 0xd8, 0xf3, 0xa5, 0xe9, 0xfc, 0x67, 0x99, 0xa7, + 0xd5, 0x5b, 0xd4, 0x8b, 0xcd, 0xfd, 0x4c, 0x7e, + 0x1f, 0xc0, 0x56, 0x6b, 0x4f, 0x46, 0x8b, 0xc1, + 0x1d, 0xa5, 0x87, 0x37, 0xf5, 0x31, 0xf8, 0x7f, + 0x01, 0x59, 0xad, 0x3d, 0x1a, 0x2f, 0x04, 0x76, + 0x97, 0x15, 0x9f, 0xec, 0xf1, 0x1e, 0xaa, 0x87, + 0x1d, 0x5c, 0xbd, 0xbd, 0xf9, 0x65, 0x44, 0x45, + 0xe9, 0xb0, 0x11, 0x11, 0x01, 0x45, 0x65, 0xe3, + 0x96, 0x69, 0x18, 0xd6, 0x3f, 0x85, 0xad, 0xa9, + 0x3b, 0x69, 0xb4, 0x29, 0x55, 0x0d, 0x96, 0x89, + 0xc2, 0x57, 0x10, 0xee, 0xe5, 0xcd, 0x04, 0x36, + 0xb4, 0xda, 0x81, 0x82, 0x1d, 0x2d, 0xd5, 0xcd, + 0xc5, 0x6b, 0xd1, 0x35, 0x90, 0x83, 0xfa, 0xc6, + 0xaf, 0x7f, 0xcd, 0x53, 0x91, 0x9e, 0x45, 0x0d, + 0xa6, 0x19, 0x20, 0xc5, 0xf4, 0xb2, 0x80, 0x1f, + 0x3c, 0xd2, 0xbc, 0xd3, 0x75, 0x03, 0xba, 0x36, + 0xd3, 0xdc, 0x6a, 0x98, 0x66, 0xf4, 0x91, 0xcc, + 0x3d, 0xb4, 0xe3, 0xe8, 0x71, 0xd9, 0x16, 0x8d, + 0xfc, 0x70, 0x3c, 0xfe, 0xfb, 0x7e, 0x15, 0xcd, + 0x6d, 0x99, 0x70, 0xfb, 0xa8, 0xa3, 0xb5, 0x71, + 0x64, 0xf2, 0xb8, 0x46, 0xc7, 0x34, 0xf0, 0x9a, + 0xbc, 0xf0, 0xef, 0xf7, 0x57, 0x6d, 0xf6, 0xa9, + 0x8f, 0xf3, 0xbd, 0x25, 0x34, 0xa0, 0x55, 0xd6, + 0x8f, 0x64, 0xc3, 0x98, 0x1e, 0x17, 0x7b, 0xc5, + 0x70, 0xda, 0xf0, 0x90, 0xea, 0x57, 0x84, 0x83, + 0x4e, 0x64, 0x13, 0x77, 0xda, 0x46, 0xea, 0xde, + 0xea, 0x2b, 0x56, 0xdc, 0x47, 0x2c, 0xf2, 0x3d, + 0xcc, 0x90, 0x38, 0x39, 0x9c, 0x0e, 0x68, 0xab, + 0x89, 0x2f, 0x02, 0xa3, 0xae, 0x16, 0xfd, 0xbe, + 0x89, 0x69, 0x89, 0x96, 0xd7, 0x12, 0x86, 0xdf, + 0x1b, 0x80, 0xc7, 0xf0, 0x92, 0xe0, 0x22, 0x31, + 0x99, 0x5a, 0x5b, 0xb2, 0x84, 0xb8, 0x02, 0xb0, + 0x4b, 0xad, 0xdc, 0xd8, 0xd8, 0xdb, 0x5b, 0x62, + 0x3b, 0xb1, 0x23, 0xdb, 0x71, 0x23, 0xa6, 0x68, + 0xa3, 0x4b, 0x38, 0x63, 0x0e, 0xda, 0xd0, 0x6a, + 0xa3, 0x72, 0x1a, 0x9f, 0x2b, 0x7e, 0xe6, 0x97, + 0xc8, 0x22, 0x6b, 0x38, 0x38, 0x1b, 0x10, 0xe1, + 0xa7, 0x47, 0x5e, 0x0d, 0xbb, 0xea, 0x2a, 0x82, + 0xc6, 0xfd, 0x3b, 0x80, 0xb3, 0xc7, 0x39, 0xb3, + 0xb1, 0xf7, 0x05, 0x92, 0xc7, 0x24, 0x97, 0x00, + 0xf4, 0x72, 0x32, 0x09, 0x43, 0x99, 0x5e, 0x1f, + 0x8d, 0xc0, 0xe6, 0xed, 0x5a, 0xad, 0x9e, 0xcf, + 0x4b, 0x6a, 0xeb, 0x61, 0x0b, 0xf8, 0x63, 0xb6, + 0x85, 0xac, 0xb8, 0x95, 0xbb, 0x43, 0x9c, 0xf6, + 0x54, 0xba, 0x9e, 0xe8, 0x55, 0x79, 0x6f, 0xef, + 0x27, 0x9f, 0xce, 0x26, 0x99, 0xf2, 0x4b, 0xb3, + 0xbb, 0x71, 0xa9, 0xd9, 0xb9, 0x7c, 0x5c, 0xdc, + 0xcf, 0x75, 0x3b, 0xee, 0x2e, 0x1e, 0x64, 0x9a, + 0x43, 0x57, 0xbd, 0xdb, 0xc9, 0x41, 0x6d, 0x9f, + 0x59, 0xd8, 0x47, 0x1c, 0x71, 0xd9, 0xdb, 0xbc, + 0x31, 0xae, 0x13, 0xb9, 0x9b, 0x03, 0x7a, 0x72, + 0xf2, 0x64, 0x2d, 0xfd, 0x57, 0x35, 0x46, 0x5c, + 0x6a, 0xb9, 0x1e, 0xf1, 0x3c, 0x36, 0xb1, 0x47, + 0x79, 0xb1, 0xaf, 0xb9, 0x3d, 0xd3, 0x9c, 0xc6, + 0x82, 0xc6, 0xb7, 0x84, 0xec, 0x1d, 0xc9, 0xa1, + 0xea, 0xa8, 0x14, 0x41, 0x21, 0xf8, 0xd6, 0x52, + 0x4b, 0x3f, 0x31, 0x75, 0xc3, 0xbc, 0xd8, 0x52, + 0x8c, 0x14, 0x1b, 0x01, 0xa8, 0x15, 0xdf, 0x41, + 0xd4, 0x5a, 0xf3, 0x4d, 0x34, 0xef, 0xe3, 0x9e, + 0x47, 0x4a, 0xea, 0x53, 0x89, 0xe4, 0xb8, 0xd0, + 0x72, 0x6d, 0x58, 0x99, 0xb9, 0x7d, 0x20, 0x94, + 0xd3, 0xf6, 0x82, 0x6b, 0xce, 0x99, 0xc2, 0xac, + 0x80, 0x57, 0xad, 0xc4, 0x77, 0x2b, 0x41, 0x7a, + 0x8c, 0xc4, 0x5b, 0xf9, 0xad, 0x93, 0x41, 0xd8, + 0xf9, 0x3b, 0xb7, 0xf3, 0x9d, 0xcb, 0x74, 0xb9, + 0x6b, 0x4f, 0x44, 0x29, 0x57, 0x4c, 0xb2, 0x71, + 0xaf, 0x0b, 0xd6, 0x2e, 0x25, 0xe7, 0x12, 0x94, + 0x64, 0x65, 0x2f, 0x5f, 0x3c, 0x6b, 0x1f, 0x12, + 0xf9, 0xe2, 0x51, 0x94, 0x74, 0x6f, 0x67, 0x97, + 0x5d, 0x26, 0x2a, 0x6b, 0x62, 0x76, 0xdb, 0xcc, + 0x69, 0xe0, 0xbf, 0x6a, 0xb3, 0xbc, 0x6d, 0x5c, + 0xff, 0x00, 0xd9, 0xcd, 0xe7, 0x06, 0x52, 0xe2, + 0xd4, 0x9a, 0x09, 0xe2, 0x0f, 0x03, 0xf5, 0x98, + 0x7f, 0xd1, 0x74, 0x17, 0x6e, 0x59, 0xce, 0x75, + 0xe3, 0x32, 0xb1, 0xed, 0x06, 0xcc, 0x5c, 0xe9, + 0xb9, 0x66, 0xa5, 0x5d, 0x67, 0x23, 0x27, 0x1c, + 0xc0, 0xf0, 0x3b, 0xde, 0x72, 0xd5, 0xc1, 0xdd, + 0xb6, 0x6c, 0x6c, 0x12, 0x71, 0x86, 0x8e, 0x10, + 0xc3, 0x4e, 0x4a, 0x6c, 0xa0, 0x56, 0x4c, 0xb5, + 0xa8, 0xbc, 0xc5, 0x5e, 0x5a, 0x91, 0x5e, 0x9a, + 0x09, 0x18, 0x07, 0x5c, 0xb4, 0xd3, 0xdf, 0x54, + 0x1d, 0x0a, 0xe9, 0x3f, 0x0c, 0x9b, 0x89, 0xc0, + 0xb5, 0xb3, 0x02, 0xd6, 0x9e, 0xbb, 0x76, 0xa9, + 0xff, 0x00, 0xe6, 0x7b, 0x24, 0xee, 0xba, 0x43, + 0x08, 0x2c, 0x69, 0x1b, 0x88, 0x14, 0x5e, 0xad, + 0x2c, 0x54, 0xaf, 0x92, 0xda, 0x8e, 0x24, 0xf0, + 0x6c, 0x04, 0xd2, 0xb4, 0x5b, 0xaa, 0xa9, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x46, 0x65, 0xbe, 0xba, + 0x1e, 0x63, 0xdb, 0x53, 0x6d, 0xef, 0x47, 0x32, + 0x84, 0xcb, 0x7d, 0x74, 0x3c, 0xc7, 0xb6, 0xa6, + 0xdb, 0xde, 0x8e, 0x65, 0xe7, 0x60, 0xf9, 0xec, + 0x76, 0x9b, 0x5f, 0xa6, 0x5d, 0x17, 0x78, 0x36, + 0x74, 0x55, 0xad, 0x86, 0xf3, 0xd1, 0x66, 0xf2, + 0x6f, 0xf1, 0x4a, 0xa9, 0x68, 0x4d, 0xd7, 0x9f, + 0xca, 0xf9, 0xea, 0xdb, 0x79, 0xe8, 0xb3, 0x79, + 0x37, 0xf8, 0xa5, 0x54, 0xb4, 0x26, 0xeb, 0xcf, + 0xe5, 0x7c, 0xf5, 0xea, 0xd3, 0xb1, 0x57, 0x79, + 0xc3, 0x5f, 0x1a, 0xd7, 0x9c, 0xb5, 0xa2, 0x22, + 0xcd, 0xb0, 0x88, 0x88, 0x0b, 0x57, 0x23, 0xc6, + 0x6d, 0x5c, 0xd6, 0x1a, 0x39, 0xdb, 0x01, 0x5b, + 0x4b, 0x4b, 0x29, 0x1b, 0x9d, 0x0b, 0x5c, 0xd7, + 0x70, 0xf0, 0xbb, 0x6f, 0x31, 0x41, 0x5c, 0xbf, + 0x89, 0xef, 0x75, 0xae, 0x2d, 0xce, 0xe3, 0x75, + 0xd5, 0xc4, 0x71, 0xb8, 0x83, 0x5f, 0xe1, 0x83, + 0xd2, 0x49, 0xfb, 0xad, 0x57, 0x10, 0x47, 0x15, + 0x46, 0xc5, 0x51, 0xc6, 0xc5, 0x24, 0xda, 0xae, + 0x00, 0xe0, 0x3a, 0x2b, 0x6b, 0x79, 0x67, 0x6e, + 0xda, 0x92, 0xe7, 0x11, 0x08, 0x27, 0xb2, 0x55, + 0xb5, 0x4c, 0xf7, 0x07, 0xd5, 0xcc, 0x4d, 0x9e, + 0xde, 0x58, 0x5c, 0x2a, 0xd9, 0x18, 0xe6, 0x11, + 0xd6, 0x22, 0x8b, 0xf3, 0x56, 0x46, 0xd8, 0xda, + 0x5f, 0xdc, 0x5b, 0x38, 0x50, 0xc3, 0x2b, 0xd9, + 0x4e, 0x62, 0xbf, 0x4c, 0x03, 0xb0, 0x15, 0xc1, + 0x7d, 0xa4, 0x58, 0x79, 0x96, 0xad, 0xbc, 0x00, + 0x51, 0x93, 0x91, 0x2b, 0x7e, 0x50, 0xda, 0xa0, + 0x47, 0x62, 0x70, 0xb6, 0xf7, 0x56, 0x53, 0x64, + 0x72, 0x17, 0x5e, 0x65, 0x63, 0x13, 0xdb, 0x0f, + 0x48, 0x1a, 0x64, 0x73, 0xa4, 0x70, 0xa8, 0x1c, + 0x23, 0x92, 0x83, 0x6a, 0xd9, 0xb7, 0xd2, 0x52, + 0xdc, 0xb4, 0xba, 0x2b, 0xc8, 0x8b, 0x66, 0x95, + 0xf1, 0x58, 0x92, 0x1c, 0x3a, 0x73, 0x18, 0xe2, + 0x77, 0x0e, 0xce, 0xe7, 0x66, 0xea, 0xad, 0x4c, + 0x46, 0x6e, 0x4b, 0x18, 0x26, 0xb2, 0x96, 0xd9, + 0x97, 0xf6, 0x57, 0x0e, 0x12, 0x3e, 0xda, 0x4a, + 0xd3, 0x8d, 0xbb, 0x9e, 0xd2, 0xdd, 0xa0, 0xad, + 0xf6, 0x67, 0x75, 0x55, 0xd9, 0x9a, 0xe2, 0xd5, + 0x9c, 0x16, 0xf7, 0x2e, 0xe1, 0x69, 0x6b, 0x1a, + 0x23, 0x8c, 0xb5, 0xb4, 0xe1, 0x89, 0xce, 0xef, + 0x4f, 0x0f, 0x51, 0x04, 0xa4, 0x3a, 0x63, 0x05, + 0x14, 0x37, 0x78, 0xd7, 0xf4, 0x97, 0x39, 0x13, + 0x6d, 0x1d, 0xdc, 0x72, 0x9a, 0x46, 0x1a, 0xd2, + 0x47, 0x18, 0x8f, 0x6e, 0xda, 0x0a, 0xd5, 0x6c, + 0x5c, 0x5a, 0xe9, 0x1c, 0x55, 0xf5, 0xb4, 0x8e, + 0x8e, 0x19, 0x2c, 0xcf, 0x17, 0x48, 0x4b, 0xb8, + 0xcc, 0xb1, 0x35, 0xa1, 0xcd, 0x7b, 0x5a, 0x37, + 0x3c, 0xbb, 0x62, 0xa7, 0x32, 0xd3, 0x37, 0x7c, + 0x62, 0x95, 0x91, 0x5c, 0x4f, 0xc5, 0xfc, 0x08, + 0x64, 0xa3, 0xa8, 0x69, 0xf1, 0x1a, 0xe5, 0xb8, + 0xcd, 0x1f, 0x9a, 0x74, 0x4f, 0x79, 0x64, 0x71, + 0xc8, 0xde, 0x2e, 0x08, 0x1c, 0xf1, 0xd2, 0x3f, + 0x83, 0x6b, 0xf8, 0x00, 0xdf, 0xc3, 0xca, 0x83, + 0xe6, 0xfb, 0x35, 0x3c, 0x17, 0x93, 0x7e, 0x19, + 0x75, 0x5b, 0x69, 0x25, 0x37, 0x11, 0xb9, 0xac, + 0xe0, 0x2d, 0x74, 0x82, 0x85, 0xb4, 0xe4, 0xa0, + 0xd9, 0xb1, 0x69, 0x0c, 0xbe, 0x51, 0xa2, 0x5a, + 0x5d, 0xc9, 0xfc, 0x70, 0x1b, 0x29, 0x2e, 0xda, + 0xe0, 0x36, 0xd0, 0x9e, 0xa2, 0x9f, 0x83, 0x45, + 0xc0, 0x2f, 0xd9, 0x69, 0x71, 0x76, 0xe9, 0x1f, + 0x1b, 0x4b, 0xae, 0xa2, 0x8d, 0x85, 0xbd, 0xd7, + 0x07, 0x48, 0xd8, 0xa3, 0x91, 0xdd, 0xc9, 0x73, + 0xb7, 0x2d, 0xd6, 0xe1, 0xf4, 0xd6, 0x31, 0x9d, + 0x25, 0xd4, 0x1d, 0x21, 0x91, 0xf0, 0x19, 0x20, + 0xba, 0x79, 0x6c, 0xb0, 0xc3, 0x3d, 0x5a, 0xea, + 0xb5, 0xb4, 0xab, 0x98, 0x76, 0xa0, 0xaf, 0x5c, + 0x6a, 0x2c, 0xfc, 0xa4, 0x35, 0xd3, 0x3e, 0x2e, + 0x22, 0xc9, 0x5a, 0xc6, 0x37, 0x87, 0xba, 0x63, + 0x38, 0x1a, 0xf1, 0xf2, 0x57, 0x98, 0xec, 0x0e, + 0x4b, 0x21, 0x37, 0x46, 0xf0, 0xfb, 0x76, 0xc9, + 0x1b, 0xee, 0x18, 0xf9, 0x5a, 0xe0, 0xd9, 0x03, + 0x3b, 0xa7, 0x70, 0xf2, 0x13, 0x4d, 0xca, 0xcb, + 0x7d, 0xa9, 0xb1, 0xb1, 0xd9, 0x3d, 0xb0, 0xce, + 0xc3, 0x73, 0x1d, 0xb3, 0xac, 0xe3, 0x0c, 0x8c, + 0x12, 0xd3, 0x13, 0xeb, 0x1c, 0x8d, 0x71, 0x1b, + 0x9c, 0xcd, 0x8b, 0x59, 0xfa, 0xd9, 0xb2, 0xba, + 0x3f, 0x35, 0xb6, 0x91, 0xd3, 0xcf, 0x23, 0x0c, + 0xd1, 0x4a, 0xfa, 0xc4, 0xde, 0x16, 0x18, 0xcb, + 0x61, 0x03, 0xbd, 0x0e, 0xaa, 0x0d, 0x8c, 0x3e, + 0x8b, 0xbb, 0xb7, 0x9e, 0xee, 0x66, 0xc8, 0xc7, + 0x47, 0x19, 0x11, 0xdb, 0xc8, 0xfe, 0xe4, 0xc8, + 0x0b, 0x04, 0xa4, 0xb7, 0x90, 0x6c, 0x2a, 0x72, + 0xdf, 0x03, 0x64, 0x6e, 0x5d, 0x6b, 0x34, 0xef, + 0x92, 0x66, 0xc7, 0x1c, 0x9c, 0x2c, 0x69, 0x6b, + 0x7f, 0x89, 0xbb, 0xba, 0xa1, 0xdd, 0xca, 0xa2, + 0xff, 0x00, 0x1f, 0xc8, 0x88, 0xc4, 0x4d, 0x73, + 0x5a, 0xc0, 0xc6, 0xb0, 0x0e, 0x1e, 0x2a, 0x70, + 0x8e, 0x1e, 0x21, 0x5f, 0x8d, 0x45, 0xa6, 0xeb, + 0xcb, 0x97, 0xbc, 0x3d, 0xd2, 0xbc, 0xbc, 0x34, + 0x30, 0x3a, 0xa4, 0x1e, 0x11, 0xb8, 0x2b, 0xc6, + 0x58, 0x8c, 0x8a, 0x4e, 0x49, 0x96, 0x4b, 0x86, + 0x18, 0x27, 0x92, 0x17, 0x10, 0x5d, 0x13, 0xcb, + 0x09, 0x06, 0xa3, 0x61, 0xea, 0xac, 0x5c, 0x4b, + 0x1f, 0x1a, 0xf0, 0xb9, 0x5b, 0x2a, 0x19, 0x0b, + 0x97, 0x85, 0xcb, 0x1f, 0x12, 0xf9, 0xe2, 0x4c, + 0xa9, 0x5c, 0xfd, 0x9c, 0x5e, 0x70, 0xe4, 0xae, + 0xad, 0x09, 0xfa, 0xe8, 0x9b, 0x23, 0x47, 0x5d, + 0x86, 0x86, 0x8b, 0xa0, 0x3f, 0x91, 0x72, 0x4d, + 0x21, 0x79, 0xe6, 0xba, 0x8e, 0xc9, 0xe4, 0xd1, + 0xb2, 0x38, 0xc4, 0xee, 0x67, 0x85, 0xd7, 0x1d, + 0xb9, 0x67, 0x56, 0x75, 0xa3, 0x33, 0x19, 0x6b, + 0x5c, 0x0b, 0x5c, 0x2a, 0xd7, 0x0a, 0x38, 0x75, + 0x8e, 0xc2, 0xb9, 0xf6, 0x98, 0x68, 0xb1, 0xbb, + 0xbe, 0xc5, 0x9a, 0x34, 0xdb, 0x4e, 0xf6, 0xd3, + 0xaa, 0x1a, 0x48, 0x15, 0xf7, 0x17, 0x41, 0x5c, + 0xfb, 0x21, 0x6d, 0x25, 0xbf, 0xb4, 0x59, 0x0c, + 0x67, 0x81, 0x97, 0x30, 0x89, 0x5f, 0xd4, 0x3c, + 0x4c, 0xe1, 0x3f, 0xbc, 0xd5, 0x34, 0xf4, 0xc4, + 0xc7, 0x66, 0x5f, 0x01, 0x3d, 0xc5, 0xdb, 0x18, + 0xf6, 0xbe, 0xda, 0xa1, 0xc5, 0xdd, 0xd1, 0xab, + 0xba, 0xeb, 0x6d, 0x43, 0xe2, 0x66, 0x78, 0x9c, + 0xc7, 0x5e, 0xe5, 0xc0, 0x54, 0x72, 0x6c, 0x1b, + 0xc2, 0x98, 0x55, 0x48, 0x88, 0x88, 0x08, 0x88, + 0x82, 0x3b, 0x51, 0xfa, 0x8e, 0xf3, 0xc9, 0xfc, + 0xe6, 0xad, 0x7d, 0x0d, 0xea, 0x67, 0x79, 0x77, + 0xf6, 0x9a, 0xb6, 0x35, 0x1f, 0xa8, 0xef, 0x3c, + 0x9f, 0xce, 0x6a, 0xd7, 0xd0, 0xde, 0xa6, 0x77, + 0x97, 0x7f, 0x69, 0xaa, 0xf1, 0xc3, 0x9d, 0x2c, + 0x67, 0x98, 0xa7, 0x72, 0x75, 0xac, 0x48, 0x88, + 0xa8, 0xd8, 0x44, 0x44, 0x04, 0x44, 0x40, 0x5a, + 0xb9, 0x0f, 0x42, 0xb9, 0xf2, 0x4f, 0xf1, 0x4a, + 0xda, 0x5a, 0xb9, 0x0f, 0x42, 0xb9, 0xf2, 0x4f, + 0xf1, 0x4a, 0x9a, 0x73, 0xc2, 0xb7, 0x36, 0x2a, + 0xd1, 0x3a, 0x90, 0x5a, 0x4f, 0xd1, 0xee, 0x3c, + 0x36, 0xf8, 0xaa, 0x79, 0x40, 0xe9, 0x3f, 0x47, + 0xb8, 0xf0, 0xdb, 0xe2, 0xa9, 0xe5, 0xa6, 0x23, + 0x8b, 0x56, 0x9f, 0xb9, 0x86, 0x07, 0x96, 0xb7, + 0xa2, 0x75, 0x88, 0x88, 0xb2, 0x74, 0x88, 0x88, + 0x83, 0x4f, 0x26, 0xe7, 0x74, 0x6d, 0x63, 0x49, + 0x05, 0xc7, 0x61, 0x02, 0xbb, 0x94, 0x16, 0x0e, + 0xd6, 0x4f, 0xcd, 0x77, 0x97, 0x2f, 0xda, 0x05, + 0x9c, 0x6c, 0x69, 0xdd, 0xb5, 0xcf, 0xa9, 0xf1, + 0x54, 0xa6, 0x5c, 0x48, 0x67, 0x8c, 0x0d, 0x8d, + 0xe1, 0x35, 0x3c, 0x83, 0x69, 0x5a, 0x7a, 0x69, + 0xf1, 0xc9, 0x93, 0xc9, 0xf0, 0x48, 0x25, 0xe8, + 0x84, 0x31, 0x97, 0x0d, 0xbb, 0x68, 0xe3, 0xc8, + 0xa6, 0x3b, 0xa8, 0x95, 0x92, 0x33, 0xb6, 0x8a, + 0x8f, 0xed, 0x86, 0xc0, 0xcf, 0xa7, 0x22, 0xbb, + 0x68, 0xdb, 0x69, 0x3b, 0x49, 0xf0, 0x5e, 0x38, + 0x0a, 0xbb, 0x34, 0xd1, 0xc1, 0x46, 0x6b, 0x0b, + 0x11, 0x7f, 0xa6, 0x72, 0x36, 0xb4, 0xa9, 0x74, + 0x0e, 0x73, 0x7c, 0x26, 0x0e, 0x31, 0xda, 0x50, + 0x97, 0xe7, 0xcb, 0x0b, 0xb7, 0x58, 0xdf, 0x5b, + 0x5e, 0xb7, 0x69, 0xb7, 0x95, 0x92, 0x53, 0xab, + 0xc2, 0x41, 0xa2, 0x9c, 0xbf, 0xd7, 0x13, 0x4c, + 0xe7, 0x79, 0xbd, 0xb8, 0x67, 0x11, 0x93, 0x89, + 0xee, 0x35, 0x73, 0xda, 0xee, 0x1e, 0x8c, 0xbe, + 0x9f, 0x19, 0x9c, 0x21, 0x57, 0x0e, 0xd0, 0xb1, + 0x20, 0x99, 0xb8, 0xd5, 0x79, 0x79, 0xd8, 0xf6, + 0x17, 0xb5, 0x9c, 0x64, 0x9e, 0x26, 0xb4, 0x07, + 0xb4, 0x12, 0x1c, 0x5a, 0xd7, 0xef, 0x0d, 0xa8, + 0xdc, 0xa3, 0x5f, 0x7b, 0x77, 0x20, 0x90, 0x3a, + 0x67, 0x91, 0x33, 0x8b, 0xe5, 0x6f, 0x11, 0xa3, + 0x9c, 0x76, 0xd4, 0x85, 0x81, 0x10, 0x11, 0x11, + 0x01, 0x7d, 0xb3, 0x72, 0xf8, 0x59, 0x1b, 0xde, + 0x84, 0x1e, 0xab, 0x56, 0x1e, 0xdb, 0xcd, 0xac, + 0x9a, 0x0f, 0x7f, 0x27, 0x76, 0xff, 0x00, 0x77, + 0x72, 0xaf, 0xe3, 0x6d, 0xbc, 0xe6, 0xed, 0x8c, + 0x3d, 0xe3, 0x7b, 0xa7, 0xf3, 0x05, 0x68, 0xe2, + 0x56, 0xa5, 0x5a, 0x99, 0x38, 0x97, 0x85, 0xeb, + 0x19, 0x72, 0xf9, 0x2e, 0x57, 0xca, 0xab, 0x29, + 0x7a, 0xf0, 0xb9, 0x62, 0x2e, 0x5e, 0x71, 0x28, + 0x4b, 0x21, 0x72, 0xba, 0x7b, 0x36, 0xbc, 0xfe, + 0x35, 0xed, 0x99, 0x3d, 0xf0, 0x6c, 0xcd, 0x1f, + 0xba, 0x55, 0x18, 0xb9, 0x4f, 0xe8, 0x6b, 0xc1, + 0x6f, 0xa8, 0xed, 0xda, 0x4d, 0x05, 0xc3, 0x5d, + 0x11, 0xe7, 0x22, 0xa1, 0x44, 0xe6, 0x23, 0x3b, + 0xaa, 0x3f, 0x68, 0xaa, 0xf8, 0x59, 0x1d, 0xb9, + 0x63, 0x54, 0x5d, 0x4e, 0xd7, 0xb7, 0x72, 0xe3, + 0xef, 0x71, 0x17, 0xd1, 0x35, 0xae, 0xab, 0xa4, + 0x86, 0x40, 0xed, 0xa0, 0xb4, 0xf0, 0x1a, 0x76, + 0xd4, 0xae, 0x2d, 0xd1, 0x8b, 0xd6, 0xf4, 0x42, + 0xac, 0x7b, 0x78, 0xaa, 0xed, 0xe2, 0xa2, 0xa2, + 0x8b, 0x47, 0x5f, 0x59, 0x32, 0xf2, 0x0c, 0x64, + 0x6e, 0x77, 0x00, 0xf3, 0xba, 0x71, 0x73, 0xb0, + 0xff, 0x00, 0xa2, 0xdf, 0xc6, 0xc4, 0x5b, 0x77, + 0x18, 0x6b, 0x8d, 0x18, 0xda, 0x3a, 0xbb, 0x6a, + 0x00, 0xa0, 0x56, 0x9d, 0x98, 0xef, 0xa3, 0xbb, + 0x29, 0xb4, 0x44, 0x55, 0x48, 0x88, 0x88, 0x0a, + 0x3f, 0x50, 0x7a, 0xa6, 0x7f, 0x93, 0xe3, 0x05, + 0x20, 0xa3, 0xf5, 0x07, 0xaa, 0x67, 0xf9, 0x3e, + 0x30, 0x57, 0xb7, 0xb7, 0x4e, 0x98, 0x65, 0x89, + 0xe0, 0x5d, 0xdc, 0xaf, 0x53, 0xdd, 0x2b, 0xea, + 0x86, 0xf8, 0x6f, 0xed, 0xa9, 0x67, 0xee, 0x51, + 0x3a, 0x57, 0xd5, 0x0d, 0xf0, 0xdf, 0xdb, 0x52, + 0xcf, 0xdc, 0xa6, 0xef, 0x16, 0xbd, 0xe9, 0x46, + 0x1b, 0x81, 0x6f, 0x76, 0x1c, 0xe6, 0xeb, 0xfc, + 0x9e, 0x3c, 0xab, 0x3e, 0xc4, 0x2b, 0xfa, 0xa0, + 0x5d, 0x7f, 0x93, 0xc7, 0x95, 0x67, 0xd8, 0x85, + 0x7f, 0x5c, 0xb6, 0x73, 0xd7, 0xbf, 0x2f, 0x63, + 0xe2, 0x99, 0xb0, 0x7f, 0xc6, 0xb6, 0x22, 0x22, + 0xd9, 0xe6, 0x88, 0x88, 0x83, 0xe6, 0x47, 0x70, + 0xc6, 0xe7, 0x75, 0x01, 0x55, 0xab, 0xbb, 0x79, + 0x2e, 0x2e, 0x6c, 0xda, 0xe3, 0x56, 0x79, 0xdc, + 0x2f, 0x20, 0x8a, 0x10, 0x1a, 0xee, 0x2d, 0xbd, + 0x85, 0x3f, 0x90, 0xe2, 0xf3, 0x39, 0x78, 0x6b, + 0x5a, 0x0d, 0xdc, 0xe1, 0x41, 0xc2, 0xe0, 0xdc, + 0x9d, 0x8c, 0x6e, 0x90, 0x74, 0x8f, 0x90, 0xd2, + 0x2e, 0x5e, 0xe5, 0x8e, 0x72, 0x40, 0xb2, 0x22, + 0x22, 0x04, 0xb1, 0xb6, 0x68, 0x1f, 0x13, 0xb6, + 0xb6, 0x46, 0x96, 0x91, 0xce, 0x28, 0xbf, 0x36, + 0xe5, 0x6d, 0x1d, 0x67, 0x92, 0xba, 0xb5, 0x70, + 0xa1, 0x86, 0x57, 0xb3, 0xdc, 0x07, 0x62, 0xfd, + 0x28, 0xd3, 0xb3, 0x99, 0x70, 0xcf, 0x69, 0x76, + 0x1e, 0x67, 0xaa, 0xee, 0x8b, 0x45, 0x19, 0x70, + 0x1b, 0x28, 0xf9, 0x42, 0x87, 0xdf, 0x41, 0x21, + 0x84, 0xd5, 0xb8, 0x7b, 0x2c, 0x1e, 0x39, 0x97, + 0x63, 0x8a, 0xf7, 0x1f, 0xd3, 0x1b, 0x77, 0x30, + 0x77, 0x6c, 0x93, 0xe2, 0x13, 0xfa, 0xae, 0xaa, + 0xd3, 0xbd, 0xd6, 0xf6, 0x92, 0x97, 0xc6, 0xcb, + 0x2e, 0x9a, 0x09, 0x4b, 0xfa, 0x56, 0xbd, 0xdc, + 0x04, 0xb5, 0xfc, 0x2f, 0xe1, 0x05, 0xbb, 0x45, + 0x1e, 0xda, 0xaa, 0x82, 0x20, 0x97, 0xb8, 0xd5, + 0x19, 0x49, 0x26, 0x8a, 0x58, 0x0b, 0x6d, 0x0d, + 0xb9, 0x7f, 0x42, 0x21, 0x14, 0xe1, 0x64, 0x87, + 0x6b, 0x09, 0x3b, 0xc2, 0x8f, 0x9e, 0xfa, 0xf2, + 0xe2, 0x59, 0x25, 0x9a, 0x67, 0xbd, 0xf3, 0x7d, + 0x69, 0x2e, 0x3d, 0xd7, 0x3a, 0xc0, 0x88, 0x08, + 0x88, 0x83, 0xea, 0x38, 0xdd, 0x2c, 0x8d, 0x8d, + 0x82, 0xae, 0x71, 0xa0, 0x56, 0x6b, 0x76, 0x36, + 0x08, 0x19, 0x13, 0x77, 0x34, 0x51, 0x45, 0x61, + 0xa1, 0x15, 0x7d, 0xc3, 0xb9, 0x3b, 0x86, 0x7c, + 0x2a, 0x4f, 0x89, 0x5a, 0x3a, 0x15, 0x96, 0x52, + 0xe5, 0xe1, 0x72, 0xc4, 0x5c, 0xbc, 0x2e, 0x53, + 0x95, 0x0c, 0x85, 0xcb, 0xce, 0x25, 0x8c, 0xb9, + 0x78, 0x5c, 0x89, 0x64, 0xe2, 0x5e, 0x17, 0x2c, + 0x45, 0xcb, 0xc2, 0xe4, 0x1d, 0x1f, 0xd9, 0x7d, + 0xe7, 0x15, 0xb5, 0xed, 0x91, 0x3f, 0x57, 0x20, + 0x95, 0xa3, 0xac, 0xf1, 0x43, 0xef, 0x85, 0x77, + 0x3b, 0xd7, 0x2a, 0xf6, 0x71, 0x7a, 0x20, 0xd4, + 0x5d, 0x09, 0x34, 0x6d, 0xd4, 0x4e, 0x67, 0xba, + 0xde, 0xe8, 0x2e, 0xaa, 0x55, 0x65, 0x68, 0x42, + 0x6b, 0x28, 0xfa, 0x4d, 0x31, 0x90, 0xa6, 0xf6, + 0x44, 0x24, 0x1c, 0xec, 0x73, 0x5d, 0xf0, 0x28, + 0x0d, 0x39, 0x7d, 0xe7, 0xd8, 0x68, 0x6e, 0x26, + 0x00, 0x5c, 0x46, 0xf3, 0x11, 0xa0, 0x3c, 0x26, + 0x9b, 0x89, 0x56, 0x9d, 0x42, 0xce, 0x3c, 0x0e, + 0x45, 0x9d, 0x5b, 0x69, 0x7c, 0x42, 0x55, 0x53, + 0x4b, 0x5a, 0x36, 0xdf, 0x09, 0x18, 0x6c, 0x8e, + 0x7f, 0x4a, 0xe3, 0x26, 0xca, 0x6c, 0x27, 0x67, + 0xc0, 0xa7, 0xff, 0x00, 0x89, 0xd2, 0x8e, 0xea, + 0xf1, 0x09, 0xe2, 0x85, 0x86, 0x94, 0xab, 0x46, + 0xc1, 0xbb, 0x72, 0xfb, 0x58, 0xed, 0xc1, 0x6c, + 0x11, 0x87, 0x1a, 0x90, 0xd0, 0x09, 0xea, 0xec, + 0x59, 0x15, 0x52, 0x22, 0x22, 0x02, 0x0d, 0xe1, + 0x10, 0x6f, 0x08, 0x28, 0x1a, 0x37, 0xfb, 0xe2, + 0xfb, 0x9a, 0xe3, 0xed, 0x02, 0xe9, 0x0b, 0x9b, + 0xe8, 0xdf, 0xef, 0x8b, 0xee, 0x6b, 0x8f, 0xb4, + 0x0b, 0xa4, 0x2c, 0x70, 0xfb, 0x1e, 0x74, 0xbd, + 0x3f, 0x8c, 0xf3, 0x34, 0xfa, 0xab, 0x7a, 0x91, + 0x79, 0xbf, 0xa9, 0x8f, 0xc3, 0xf8, 0x0a, 0xcd, + 0x69, 0xe8, 0xd1, 0x78, 0x23, 0xb4, 0xb0, 0xe6, + 0xfe, 0xa6, 0x3f, 0x0f, 0xe0, 0x2b, 0x35, 0xa7, + 0xa3, 0x45, 0xe0, 0x8e, 0xd2, 0xe2, 0xb3, 0xfd, + 0x9e, 0x23, 0xd5, 0x50, 0xe3, 0xab, 0x97, 0xb7, + 0xbf, 0x2c, 0xa8, 0x88, 0xbd, 0x36, 0x02, 0x22, + 0x20, 0x28, 0x9c, 0x9b, 0x9e, 0xf9, 0xc8, 0x69, + 0xa0, 0x68, 0xa1, 0xa8, 0xa8, 0x2a, 0x59, 0x57, + 0xaf, 0xc9, 0x13, 0x5c, 0x3e, 0x49, 0x04, 0x4d, + 0x0e, 0x71, 0x0e, 0x71, 0xe4, 0x15, 0xea, 0xa0, + 0x96, 0xc4, 0xc5, 0xd0, 0xe3, 0x2d, 0xa2, 0xfd, + 0x18, 0xc5, 0x79, 0xce, 0xd3, 0xef, 0x95, 0xb8, + 0x37, 0xac, 0x36, 0x80, 0x8b, 0x58, 0xab, 0xfa, + 0x0d, 0xed, 0x2c, 0xa8, 0x35, 0xb3, 0x96, 0x62, + 0xfb, 0x0f, 0x7b, 0x66, 0x45, 0x7a, 0x78, 0x1e, + 0xca, 0x75, 0xcb, 0x4d, 0x3d, 0xf5, 0xf9, 0xb5, + 0xed, 0x2d, 0x25, 0xa7, 0x78, 0x24, 0x1e, 0x70, + 0xbf, 0x4f, 0x8d, 0xa3, 0x6a, 0xfc, 0xe9, 0xaa, + 0xec, 0xbc, 0xc3, 0x51, 0xe4, 0x6d, 0x40, 0xa3, + 0x59, 0x3b, 0xcb, 0x7c, 0x17, 0x1e, 0x31, 0xdb, + 0x41, 0x0a, 0x88, 0x76, 0x14, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x41, 0x91, 0xbb, 0x82, 0xdb, 0xc6, + 0x5b, 0x0b, 0x8b, 0xb6, 0x35, 0xdb, 0x58, 0xde, + 0xe9, 0xfc, 0xc1, 0x6a, 0x37, 0x72, 0x9e, 0xc3, + 0xc1, 0xd1, 0x5b, 0x99, 0x08, 0xee, 0xe5, 0xdb, + 0xee, 0x05, 0x30, 0x89, 0x4a, 0x71, 0x2f, 0x0b, + 0x96, 0x3e, 0x25, 0xe1, 0x72, 0xba, 0xac, 0x85, + 0xcb, 0xce, 0x25, 0x88, 0xb9, 0x38, 0x90, 0x64, + 0xe2, 0x5e, 0x71, 0x2c, 0x7c, 0x4b, 0xe7, 0x89, + 0x46, 0x51, 0x39, 0xa4, 0xef, 0x45, 0xa6, 0xa1, + 0xb2, 0x90, 0x9a, 0x35, 0xef, 0x31, 0x38, 0xf5, + 0x9e, 0x28, 0xba, 0xe3, 0xb7, 0x2e, 0x13, 0x0c, + 0xe6, 0x29, 0x99, 0x28, 0x34, 0x31, 0xbd, 0xaf, + 0x07, 0xc1, 0x35, 0x5d, 0xca, 0xda, 0x51, 0x71, + 0x6d, 0x1c, 0xc3, 0x68, 0x95, 0x8d, 0x70, 0xf7, + 0x45, 0x55, 0x6a, 0x5a, 0x1f, 0x60, 0x6d, 0xa1, + 0xe5, 0xd8, 0xb9, 0x96, 0x90, 0x94, 0xc7, 0x98, + 0xc8, 0xe2, 0xa6, 0xfa, 0xa8, 0xfa, 0x57, 0x36, + 0x83, 0x68, 0x73, 0x24, 0xe1, 0xf8, 0x57, 0x4c, + 0x1b, 0xd7, 0x37, 0xc4, 0xdb, 0x70, 0x6b, 0x2c, + 0xb4, 0xad, 0x7f, 0x09, 0x64, 0x93, 0x37, 0x80, + 0x72, 0x87, 0xba, 0xaa, 0x69, 0xcd, 0x54, 0x76, + 0x65, 0x27, 0x3c, 0x2e, 0xf8, 0x47, 0x03, 0x0c, + 0x80, 0x01, 0x46, 0x9d, 0x87, 0x96, 0x9d, 0x75, + 0x22, 0xa3, 0xb0, 0xcd, 0x2d, 0x64, 0xb4, 0x24, + 0xb4, 0xbb, 0xb9, 0x07, 0x7a, 0x91, 0x55, 0x48, + 0x88, 0x88, 0x08, 0x88, 0x82, 0x33, 0x2d, 0xf5, + 0xd0, 0xf3, 0x1e, 0xda, 0x9b, 0x6f, 0x7a, 0x39, + 0x94, 0x26, 0x5b, 0xeb, 0xa1, 0xe6, 0x3d, 0xb5, + 0x36, 0xde, 0xf4, 0x73, 0x2f, 0x3b, 0x07, 0xcf, + 0x63, 0xb4, 0xda, 0xfd, 0x32, 0xe8, 0xbb, 0xc1, + 0xb3, 0xa2, 0xad, 0x6c, 0x37, 0x9e, 0x8b, 0x37, + 0x93, 0x7f, 0x8a, 0x55, 0x4b, 0x42, 0x6e, 0xbc, + 0xfe, 0x57, 0xcf, 0x56, 0xdb, 0xcf, 0x45, 0x9b, + 0xc9, 0xbf, 0xc5, 0x2a, 0xa5, 0xa1, 0x37, 0x5e, + 0x7f, 0x2b, 0xe7, 0xaf, 0x56, 0x9d, 0x8a, 0xbb, + 0xce, 0x1a, 0xf8, 0xd6, 0xbc, 0xe5, 0xad, 0x11, + 0x16, 0x6d, 0x84, 0x44, 0x40, 0x5a, 0x99, 0x27, + 0x3b, 0xa1, 0x0d, 0x69, 0x21, 0xce, 0x3b, 0x08, + 0x15, 0xa2, 0xdb, 0x51, 0x99, 0x8e, 0x3e, 0x38, + 0xb8, 0x76, 0x0a, 0x1a, 0x9e, 0x41, 0xb5, 0x06, + 0xa6, 0x0e, 0xd9, 0xe3, 0x31, 0x79, 0x72, 0xf3, + 0x5a, 0xc1, 0x14, 0x6d, 0x3b, 0xb7, 0xba, 0x47, + 0x1a, 0x7b, 0xca, 0x79, 0x43, 0xe9, 0xf7, 0x31, + 0xd2, 0xde, 0x96, 0xc8, 0x24, 0xe0, 0x7b, 0x18, + 0x5c, 0x36, 0xed, 0xe0, 0xad, 0x36, 0x73, 0xa9, + 0x85, 0x33, 0x9c, 0x64, 0x8c, 0x8e, 0x1e, 0x65, + 0xca, 0x3d, 0xb3, 0x58, 0x06, 0x5f, 0x58, 0xdf, + 0x81, 0xb2, 0x56, 0x18, 0x9f, 0xce, 0xd3, 0x50, + 0xba, 0xab, 0x37, 0xd1, 0x53, 0x3d, 0xad, 0xd8, + 0xf9, 0xc6, 0x99, 0x17, 0x00, 0x55, 0xd6, 0xb2, + 0xb5, 0xde, 0xe3, 0xbb, 0x92, 0xa0, 0x73, 0x1d, + 0x13, 0x7d, 0x15, 0x86, 0xa4, 0xb5, 0x9a, 0x6e, + 0x0e, 0x8d, 0xdc, 0x4c, 0x71, 0x96, 0x9c, 0x1d, + 0xd0, 0xa6, 0xda, 0xab, 0x2c, 0x9a, 0x97, 0x4e, + 0x5a, 0x58, 0x32, 0xc6, 0xdd, 0xc3, 0xa2, 0x32, + 0x8b, 0xd3, 0x10, 0x1c, 0x5c, 0x12, 0x99, 0x29, + 0x24, 0x43, 0xad, 0xc1, 0x5a, 0x2e, 0x7a, 0x88, + 0x2d, 0xd2, 0xeb, 0x0c, 0x7c, 0x66, 0x29, 0xad, + 0x22, 0x9c, 0xcd, 0x68, 0xe6, 0xb6, 0xde, 0x2e, + 0x3e, 0x0b, 0x7e, 0x16, 0x3c, 0xbd, 0xb2, 0x16, + 0x0d, 0xbc, 0x54, 0x34, 0x51, 0xbf, 0x9b, 0xf2, + 0x4d, 0x6c, 0xac, 0x8d, 0x91, 0x80, 0xe7, 0xca, + 0xf8, 0x1e, 0xe6, 0xf1, 0x49, 0x08, 0x9f, 0xeb, + 0x04, 0x6e, 0x3d, 0x55, 0x06, 0x88, 0x37, 0x6e, + 0x33, 0x59, 0x6b, 0xa8, 0x22, 0xb7, 0xb8, 0xba, + 0x92, 0x48, 0xa0, 0x35, 0x8c, 0x13, 0xb8, 0x8d, + 0x80, 0xd4, 0x6d, 0x34, 0x5a, 0x92, 0x49, 0x24, + 0xaf, 0x2f, 0x95, 0xc5, 0xef, 0x76, 0xd2, 0xe7, + 0x1a, 0x93, 0xce, 0xbe, 0x51, 0x01, 0x49, 0x61, + 0x20, 0xe2, 0x99, 0xd7, 0x0e, 0x1b, 0x23, 0xd8, + 0xcf, 0x08, 0xa8, 0xde, 0xb0, 0xde, 0x76, 0x05, + 0x62, 0xb4, 0x88, 0x5b, 0xdb, 0x32, 0x21, 0xbc, + 0x0a, 0xbb, 0x9c, 0xa9, 0x84, 0x4b, 0x6f, 0x89, + 0x79, 0xc4, 0xb1, 0x71, 0x2f, 0x38, 0x95, 0xb2, + 0xaa, 0xc9, 0xc4, 0xbc, 0x2e, 0x58, 0xf8, 0x97, + 0x85, 0xc9, 0x94, 0x64, 0x2f, 0x5e, 0x71, 0x2c, + 0x65, 0xc1, 0x79, 0xc4, 0x89, 0x6c, 0x5b, 0xdc, + 0x3a, 0x0b, 0x88, 0xa7, 0x6e, 0xc3, 0x13, 0xda, + 0xfd, 0x9d, 0x62, 0xbb, 0x9c, 0x32, 0x36, 0x68, + 0x23, 0x95, 0xbb, 0xa4, 0x60, 0x70, 0xf9, 0x42, + 0xab, 0x81, 0x13, 0x5d, 0x9d, 0x55, 0xd9, 0xf4, + 0x75, 0xe7, 0x9e, 0x69, 0xbb, 0x29, 0x6b, 0x57, + 0x35, 0x9d, 0x1b, 0xb9, 0xd9, 0xb1, 0x56, 0x53, + 0x09, 0x55, 0x41, 0xd7, 0xf7, 0x32, 0x63, 0xb5, + 0x06, 0x32, 0xfa, 0x20, 0x0f, 0x49, 0x11, 0x63, + 0xc3, 0x85, 0x41, 0x0d, 0x93, 0x6f, 0xbc, 0xf5, + 0x7f, 0x70, 0xa1, 0x54, 0x8f, 0x68, 0xd6, 0x6d, + 0xba, 0xb8, 0xc3, 0xb5, 0xce, 0xe0, 0xe2, 0x92, + 0x56, 0x71, 0x7e, 0xc1, 0x53, 0x46, 0x7d, 0x3d, + 0x05, 0x59, 0x93, 0x76, 0x06, 0x36, 0x64, 0x40, + 0x88, 0x55, 0xae, 0xda, 0x78, 0xab, 0xcb, 0xfa, + 0x2a, 0x6d, 0x41, 0xd8, 0x46, 0xef, 0x3c, 0x88, + 0x87, 0x13, 0xc2, 0x3b, 0xa2, 0x77, 0x10, 0x05, + 0x02, 0x9c, 0x55, 0x48, 0x88, 0x88, 0x08, 0x88, + 0x82, 0x3b, 0x51, 0xfa, 0x8e, 0xf3, 0xc9, 0xfc, + 0xe6, 0xad, 0x7d, 0x0d, 0xea, 0x67, 0x79, 0x77, + 0xf6, 0x9a, 0xb6, 0x35, 0x1f, 0xa8, 0xef, 0x3c, + 0x9f, 0xce, 0x6a, 0xd7, 0xd0, 0xde, 0xa6, 0x77, + 0x97, 0x7f, 0x69, 0xaa, 0xf1, 0xc3, 0x9d, 0x2c, + 0x67, 0x98, 0xa7, 0x72, 0x75, 0xac, 0x48, 0x88, + 0xa8, 0xd8, 0x44, 0x44, 0x04, 0x44, 0x40, 0x5a, + 0xb9, 0x0f, 0x42, 0xb9, 0xf2, 0x4f, 0xf1, 0x4a, + 0xda, 0x5a, 0xb9, 0x0f, 0x42, 0xb9, 0xf2, 0x4f, + 0xf1, 0x4a, 0x9a, 0x73, 0xc2, 0xb7, 0x36, 0x2a, + 0xd1, 0x3a, 0x90, 0x5a, 0x4f, 0xd1, 0xee, 0x3c, + 0x36, 0xf8, 0xaa, 0x79, 0x40, 0xe9, 0x3f, 0x47, + 0xb8, 0xf0, 0xdb, 0xe2, 0xa9, 0xe5, 0xa6, 0x23, + 0x8b, 0x56, 0x9f, 0xb9, 0x86, 0x07, 0x96, 0xb7, + 0xa2, 0x75, 0x88, 0x88, 0xb2, 0x74, 0x88, 0x88, + 0x82, 0x27, 0x34, 0x08, 0x7b, 0x5d, 0xc2, 0x48, + 0x0c, 0x22, 0xa0, 0xf2, 0x9a, 0xa8, 0x6d, 0x03, + 0x04, 0xb0, 0x5c, 0xe6, 0x99, 0x2b, 0x0b, 0x1c, + 0x66, 0x89, 0xc0, 0x1e, 0x50, 0x5a, 0xfa, 0x15, + 0x33, 0x9a, 0xe3, 0x32, 0x44, 0x1a, 0x4e, 0xd1, + 0xb8, 0x72, 0x90, 0x54, 0x4e, 0x8f, 0xbc, 0x7d, + 0xc6, 0x6b, 0x32, 0xd7, 0xec, 0xe0, 0x10, 0x70, + 0x81, 0xc8, 0x00, 0x78, 0x56, 0x8c, 0xd2, 0x89, + 0xcf, 0x0b, 0x62, 0xc8, 0xe6, 0xb6, 0x46, 0x16, + 0x3b, 0x6b, 0x5e, 0x08, 0x3c, 0xc5, 0x63, 0x59, + 0x1a, 0x76, 0x2a, 0xa5, 0xf9, 0xaf, 0x31, 0x66, + 0x6c, 0x72, 0xb7, 0x96, 0x67, 0xff, 0x00, 0x42, + 0x67, 0xb0, 0x73, 0x07, 0x1a, 0x28, 0xe3, 0xbd, + 0x5c, 0x7d, 0xa7, 0xe3, 0xfc, 0xcf, 0x57, 0x5c, + 0xbc, 0x0a, 0x32, 0xe9, 0xac, 0x9d, 0xbe, 0xe8, + 0xe1, 0x77, 0xbe, 0xd5, 0x4f, 0x7e, 0xf4, 0x1e, + 0x22, 0x22, 0x02, 0x25, 0x0a, 0xf7, 0x84, 0xf5, + 0x10, 0x78, 0xb2, 0x34, 0xec, 0x5f, 0x3c, 0x05, + 0x67, 0xb6, 0x84, 0xcd, 0x33, 0x22, 0x1f, 0x18, + 0xed, 0xe6, 0x1b, 0xd0, 0x4c, 0xe1, 0x60, 0xe8, + 0xad, 0xcc, 0xae, 0x1d, 0xd4, 0xbe, 0x28, 0x52, + 0x05, 0xcb, 0x0b, 0x68, 0xd6, 0x86, 0x8d, 0xc0, + 0x50, 0x27, 0x12, 0xbc, 0x2b, 0x2c, 0x85, 0xcb, + 0xc2, 0xe5, 0x8c, 0xb9, 0x78, 0x5c, 0x99, 0x50, + 0xc8, 0x5c, 0xbc, 0xe2, 0x58, 0xcb, 0x97, 0x9c, + 0x48, 0x32, 0x17, 0x2c, 0xf8, 0xfb, 0xa3, 0x6d, + 0x7f, 0x6d, 0x70, 0x0d, 0x0c, 0x52, 0xb1, 0xd5, + 0xe6, 0x3b, 0x56, 0x99, 0x72, 0xf3, 0x8b, 0x7d, + 0x37, 0xd1, 0x42, 0x61, 0xdf, 0x9a, 0xe0, 0xf6, + 0x07, 0x0d, 0xce, 0x00, 0x8e, 0x63, 0xb5, 0x7c, + 0x2d, 0x0d, 0x33, 0x79, 0xe7, 0xb8, 0x1b, 0x2b, + 0x8a, 0xd4, 0xba, 0x20, 0x1d, 0xce, 0xde, 0xe4, + 0xf6, 0x94, 0x83, 0x85, 0x0a, 0xaa, 0xca, 0x77, + 0xb4, 0xe7, 0xb9, 0x98, 0x8b, 0x37, 0x34, 0x96, + 0xb8, 0x5d, 0xb4, 0xb4, 0x8d, 0x94, 0x21, 0xae, + 0x5b, 0xf8, 0x57, 0x49, 0x23, 0xad, 0x24, 0x2f, + 0x0e, 0x25, 0xa0, 0xbc, 0xf5, 0x6a, 0xc5, 0xad, + 0xae, 0xe3, 0x86, 0x71, 0x89, 0xb6, 0x9b, 0xbc, + 0x7d, 0xd1, 0x71, 0x6f, 0x57, 0x85, 0x87, 0xfd, + 0x56, 0xf6, 0x3b, 0x65, 0xd5, 0xbb, 0x5b, 0x19, + 0x63, 0x36, 0x90, 0x77, 0x0e, 0x1a, 0x1a, 0x2b, + 0x4e, 0xcd, 0x28, 0xee, 0xca, 0x71, 0x11, 0x15, + 0x52, 0x22, 0x22, 0x02, 0x8f, 0xd4, 0x1e, 0xa9, + 0x9f, 0xe4, 0xf8, 0xc1, 0x48, 0x28, 0xfd, 0x41, + 0xea, 0x99, 0xfe, 0x4f, 0x8c, 0x15, 0xed, 0xed, + 0xd3, 0xa6, 0x19, 0x62, 0x78, 0x17, 0x77, 0x2b, + 0xd4, 0xf7, 0x4a, 0xfa, 0xa1, 0xbe, 0x1b, 0xfb, + 0x6a, 0x59, 0xfb, 0x94, 0x4e, 0x95, 0xf5, 0x43, + 0x7c, 0x37, 0xf6, 0xd4, 0xb3, 0xf7, 0x29, 0xbb, + 0xc5, 0xaf, 0x7a, 0x51, 0x86, 0xe0, 0x5b, 0xdd, + 0x87, 0x39, 0xba, 0xff, 0x00, 0x27, 0x8f, 0x2a, + 0xcf, 0xb1, 0x0a, 0xfe, 0xa8, 0x17, 0x5f, 0xe4, + 0xf1, 0xe5, 0x59, 0xf6, 0x21, 0x5f, 0xd7, 0x2d, + 0x9c, 0xf5, 0xef, 0xcb, 0xd8, 0xf8, 0xa6, 0x6c, + 0x1f, 0xf1, 0xad, 0x88, 0x88, 0xb6, 0x79, 0xa2, + 0x22, 0x20, 0xd7, 0xbf, 0x05, 0xd6, 0x92, 0x35, + 0xa2, 0xa4, 0xd2, 0x83, 0xdd, 0x0a, 0xa9, 0x14, + 0x12, 0x9d, 0x5b, 0x8d, 0x9c, 0x31, 0xdd, 0x13, + 0x4c, 0xac, 0x2e, 0x3b, 0x76, 0x98, 0x9d, 0x4a, + 0xab, 0x65, 0xf5, 0x7c, 0xd2, 0x5e, 0x1d, 0x86, + 0x9b, 0x0f, 0xba, 0xaa, 0xa6, 0xf2, 0x48, 0x73, + 0x58, 0xa8, 0x37, 0x32, 0x6b, 0x9a, 0x17, 0x1e, + 0x5a, 0xb1, 0xe0, 0x53, 0xb2, 0xa6, 0x11, 0x2b, + 0x8a, 0x22, 0x28, 0x4b, 0xd6, 0xae, 0x5f, 0xed, + 0x9a, 0xc2, 0x93, 0x58, 0x64, 0x1a, 0x3b, 0xe6, + 0xba, 0x17, 0x9e, 0x6e, 0xe8, 0x2e, 0xa0, 0x37, + 0xaa, 0x8f, 0xb5, 0x3b, 0x1f, 0x3a, 0xd2, 0xb2, + 0x4a, 0x05, 0x5d, 0x6b, 0x23, 0x65, 0x1c, 0xdd, + 0xe9, 0xed, 0xa0, 0xe2, 0x05, 0x17, 0xa5, 0x78, + 0x80, 0x88, 0x88, 0x0b, 0xd0, 0x0b, 0x88, 0x68, + 0xde, 0x76, 0x0f, 0x75, 0x78, 0xb6, 0xb1, 0xd1, + 0x71, 0xcd, 0xd2, 0x1e, 0xf6, 0x3d, 0xbe, 0xea, + 0x40, 0x95, 0x86, 0x31, 0x0c, 0x2d, 0x88, 0x7c, + 0x51, 0xb7, 0x9f, 0x95, 0x7d, 0x71, 0x2c, 0x65, + 0xcb, 0xce, 0x25, 0x65, 0x59, 0x0b, 0x97, 0x9c, + 0x4b, 0x19, 0x76, 0xc5, 0xe7, 0x12, 0x65, 0x4b, + 0x21, 0x72, 0xf0, 0xb9, 0x62, 0xe2, 0x5e, 0x71, + 0xa0, 0xca, 0x5c, 0xbe, 0x4b, 0x96, 0x3e, 0x35, + 0xe1, 0x72, 0x81, 0x29, 0x81, 0xbd, 0xf3, 0x2c, + 0xd5, 0x95, 0xcd, 0x68, 0x23, 0x99, 0x95, 0xe6, + 0x71, 0xe1, 0x3d, 0xb5, 0xdd, 0x2b, 0x50, 0x0f, + 0x57, 0x68, 0xf7, 0x57, 0xe7, 0x7e, 0x32, 0x0d, + 0x41, 0xa1, 0x1b, 0x97, 0x7b, 0xc2, 0x5d, 0x8b, + 0xec, 0x45, 0x9d, 0xd0, 0x35, 0xe9, 0x62, 0x6b, + 0x8f, 0x3d, 0x12, 0x48, 0x7c, 0xe7, 0x48, 0x18, + 0x3c, 0x81, 0x3b, 0xbc, 0xda, 0x6f, 0x11, 0xca, + 0x8f, 0xa1, 0x5c, 0xe7, 0x62, 0x25, 0x05, 0xfd, + 0xec, 0xbc, 0x2c, 0x69, 0x3b, 0x81, 0x6a, 0xb9, + 0x6a, 0x99, 0x04, 0x7a, 0x6f, 0x26, 0xf3, 0xb3, + 0xff, 0x00, 0x8e, 0xf1, 0xfb, 0x43, 0x87, 0xe1, + 0x55, 0xad, 0x2f, 0x0c, 0x56, 0xf8, 0x68, 0x84, + 0x2c, 0x2e, 0xe2, 0x69, 0x7b, 0xdc, 0x39, 0x5c, + 0xee, 0x55, 0x3f, 0xfc, 0xce, 0x98, 0x3b, 0xab, + 0xa5, 0xa7, 0x17, 0x9a, 0xc5, 0xc4, 0x6a, 0xee, + 0x06, 0xd4, 0xf5, 0xe8, 0xb2, 0xac, 0x56, 0x95, + 0xf3, 0x58, 0x6b, 0xb0, 0xf0, 0x36, 0xa3, 0xdc, + 0x59, 0x55, 0x52, 0x22, 0x22, 0x02, 0x0d, 0xe1, + 0x10, 0x6f, 0x08, 0x28, 0x1a, 0x37, 0xfb, 0xe2, + 0xfb, 0x9a, 0xe3, 0xed, 0x02, 0xe9, 0x0b, 0x9b, + 0xe8, 0xdf, 0xef, 0x8b, 0xee, 0x6b, 0x8f, 0xb4, + 0x0b, 0xa4, 0x2c, 0x70, 0xfb, 0x1e, 0x74, 0xbd, + 0x3f, 0x8c, 0xf3, 0x34, 0xfa, 0xab, 0x7a, 0x91, + 0x79, 0xbf, 0xa9, 0x8f, 0xc3, 0xf8, 0x0a, 0xcd, + 0x69, 0xe8, 0xd1, 0x78, 0x23, 0xb4, 0xb0, 0xe6, + 0xfe, 0xa6, 0x3f, 0x0f, 0xe0, 0x2b, 0x35, 0xa7, + 0xa3, 0x45, 0xe0, 0x8e, 0xd2, 0xe2, 0xb3, 0xfd, + 0x9e, 0x23, 0xd5, 0x50, 0xe3, 0xab, 0x97, 0xb7, + 0xbf, 0x2c, 0xa8, 0x88, 0xbd, 0x36, 0x02, 0x22, + 0x20, 0x2a, 0x96, 0xa5, 0x82, 0x59, 0x60, 0xb9, + 0x89, 0x91, 0xb8, 0xbe, 0x42, 0xee, 0x10, 0x0e, + 0xce, 0x5a, 0x2b, 0x6a, 0xac, 0xe6, 0x66, 0x92, + 0x09, 0x2e, 0x26, 0x6f, 0x74, 0x63, 0x0e, 0x20, + 0x13, 0x40, 0x39, 0x45, 0x52, 0x33, 0x8b, 0x1c, + 0x3f, 0x51, 0x1f, 0x80, 0xde, 0xd0, 0x5f, 0x6b, + 0x0d, 0x94, 0x82, 0x4b, 0x3b, 0x79, 0x06, 0xe7, + 0xc4, 0xc7, 0x76, 0x5a, 0x0a, 0xcc, 0x83, 0xed, + 0xbb, 0x97, 0x17, 0xf6, 0xb9, 0x61, 0xe6, 0xda, + 0x99, 0xb7, 0x4d, 0x14, 0x6d, 0xe4, 0x2d, 0x75, + 0x7f, 0x59, 0x84, 0xb0, 0xfc, 0x0b, 0xb3, 0xb0, + 0xef, 0x0b, 0x9d, 0x7b, 0x67, 0xb1, 0xe9, 0x31, + 0xd6, 0x17, 0xed, 0x1b, 0x61, 0x95, 0xd1, 0x38, + 0xf5, 0x9e, 0x2a, 0x3d, 0xf6, 0xa0, 0xe4, 0x4f, + 0x1b, 0x57, 0x8b, 0x21, 0x68, 0x3b, 0xd3, 0x84, + 0x20, 0xc6, 0x9c, 0x27, 0xa8, 0xb2, 0xd1, 0x10, + 0x7c, 0x70, 0x15, 0xef, 0x07, 0x54, 0xaf, 0xa4, + 0x41, 0x92, 0xda, 0x13, 0x34, 0xec, 0x88, 0x72, + 0x9d, 0xbc, 0xca, 0xc6, 0x08, 0x6b, 0x43, 0x5b, + 0xb8, 0x6c, 0x0a, 0x2b, 0x13, 0x0d, 0x03, 0xa7, + 0x76, 0xf3, 0xb1, 0xbc, 0xdc, 0xaa, 0x44, 0xb9, + 0x5a, 0x15, 0x96, 0x4e, 0x25, 0xe1, 0x72, 0xc7, + 0xc4, 0xbc, 0xe2, 0x52, 0x3e, 0xcb, 0x97, 0x85, + 0xcb, 0x19, 0x72, 0xf0, 0xb9, 0x0c, 0x8c, 0x9c, + 0x4b, 0xce, 0x25, 0xf1, 0xc4, 0xbe, 0x78, 0x94, + 0x0c, 0x9c, 0x55, 0xd9, 0xd5, 0xd8, 0xbb, 0x1e, + 0x8a, 0xbc, 0x37, 0x7a, 0x6e, 0xcd, 0xe4, 0xd5, + 0xd1, 0xb4, 0xc6, 0x79, 0xda, 0x68, 0xb8, 0xb9, + 0x72, 0xe9, 0x7e, 0xca, 0xef, 0x7a, 0x4c, 0x7d, + 0xdd, 0x91, 0x3b, 0x61, 0x90, 0x3d, 0xa3, 0xac, + 0xf0, 0xa2, 0x53, 0x0b, 0xb1, 0xde, 0xb9, 0x95, + 0x91, 0xaf, 0xb4, 0x5c, 0x83, 0x78, 0xb8, 0x5a, + 0xe9, 0x2e, 0x2b, 0xb6, 0x83, 0x63, 0x76, 0x7b, + 0xeb, 0xa7, 0x1d, 0xe1, 0x73, 0x4c, 0x43, 0x63, + 0x97, 0x56, 0xe5, 0xee, 0xb6, 0x99, 0x04, 0xd2, + 0xb1, 0x94, 0xe4, 0xe2, 0x7f, 0x05, 0x7d, 0xe5, + 0x34, 0xe6, 0xab, 0x41, 0x39, 0xe1, 0x78, 0xc3, + 0x87, 0x7f, 0x18, 0x93, 0x50, 0x78, 0x68, 0x3a, + 0x94, 0x05, 0x49, 0x28, 0xec, 0x41, 0x25, 0xd3, + 0xd5, 0xa5, 0x80, 0x16, 0x80, 0x0f, 0x58, 0x15, + 0x22, 0xaa, 0x91, 0x11, 0x10, 0x11, 0x11, 0x04, + 0x66, 0x5b, 0xeb, 0xa1, 0xe6, 0x3d, 0xb5, 0x36, + 0xde, 0xf4, 0x73, 0x28, 0x4c, 0xb7, 0xd7, 0x43, + 0xcc, 0x7b, 0x6a, 0x6d, 0xbd, 0xe8, 0xe6, 0x5e, + 0x76, 0x0f, 0x9e, 0xc7, 0x69, 0xb5, 0xfa, 0x65, + 0xd1, 0x77, 0x83, 0x67, 0x45, 0x5a, 0xd8, 0x6f, + 0x3d, 0x16, 0x6f, 0x26, 0xff, 0x00, 0x14, 0xaa, + 0x96, 0x84, 0xdd, 0x79, 0xfc, 0xaf, 0x9e, 0xad, + 0xb7, 0x9e, 0x8b, 0x37, 0x93, 0x7f, 0x8a, 0x55, + 0x4b, 0x42, 0x6e, 0xbc, 0xfe, 0x57, 0xcf, 0x5e, + 0xad, 0x3b, 0x15, 0x77, 0x9c, 0x35, 0xf1, 0xad, + 0x79, 0xcb, 0x5a, 0x22, 0x2c, 0xdb, 0x08, 0x88, + 0x80, 0xa2, 0xf3, 0x40, 0x8e, 0x07, 0x50, 0x90, + 0x1a, 0x40, 0x23, 0x7d, 0x49, 0x52, 0x8a, 0x2f, + 0x37, 0xc5, 0x48, 0xc0, 0x3b, 0x0d, 0x76, 0x75, + 0x4a, 0x08, 0xfd, 0x13, 0x04, 0x90, 0x45, 0x92, + 0x6c, 0x8c, 0x2c, 0x2e, 0xba, 0xe3, 0x00, 0xf5, + 0x1d, 0x1b, 0x48, 0x56, 0x45, 0x01, 0xa5, 0xae, + 0xdf, 0x71, 0x3e, 0x4d, 0x8f, 0xd9, 0xd0, 0xcb, + 0x18, 0x6b, 0x6b, 0x5a, 0x02, 0xcf, 0xf5, 0x0a, + 0x7d, 0x4c, 0xe7, 0x44, 0x66, 0x7a, 0xde, 0xf9, + 0x47, 0x6a, 0x9b, 0x2f, 0x3f, 0xd3, 0xd7, 0xf6, + 0xb4, 0xa9, 0x7c, 0x2e, 0x2d, 0x1d, 0x76, 0x8a, + 0x85, 0x20, 0x16, 0x47, 0xb4, 0x3d, 0x85, 0x87, + 0xbd, 0x70, 0x20, 0xfb, 0xbb, 0x14, 0x25, 0xf9, + 0x7c, 0x82, 0x09, 0x07, 0x93, 0x61, 0x45, 0x21, + 0x9f, 0xb3, 0x36, 0x39, 0xab, 0xdb, 0x53, 0xff, + 0x00, 0xa5, 0x33, 0xc0, 0xe6, 0xad, 0x54, 0x7a, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x0d, 0xac, 0x6c, + 0x3d, 0x25, 0xc8, 0x73, 0xb6, 0xb6, 0x3e, 0xe8, + 0xf3, 0xf2, 0x29, 0x92, 0xe5, 0xa7, 0x61, 0x1f, + 0x43, 0x6e, 0x3f, 0x49, 0xfd, 0xd3, 0x96, 0x7e, + 0x25, 0x68, 0x44, 0xb2, 0x17, 0x2f, 0x38, 0x96, + 0x3e, 0x25, 0xe1, 0x72, 0x21, 0x93, 0x89, 0x79, + 0xc4, 0xb1, 0xf1, 0x2f, 0x0b, 0x93, 0x2a, 0x59, + 0x0b, 0x97, 0xc9, 0x72, 0xf8, 0xe2, 0x5e, 0x17, + 0x26, 0x51, 0x93, 0x89, 0x74, 0xef, 0x65, 0x97, + 0xbd, 0x2e, 0x2a, 0xe6, 0xd1, 0xc7, 0x6d, 0xbc, + 0xdc, 0x43, 0x99, 0xe2, 0xab, 0x95, 0x97, 0x2b, + 0xaf, 0xb2, 0xcb, 0xe1, 0x1e, 0x6a, 0x7b, 0x52, + 0x68, 0x2e, 0x61, 0xa8, 0x1f, 0xac, 0xc3, 0x55, + 0x03, 0xa9, 0xbf, 0x7a, 0xa1, 0xfb, 0x55, 0x71, + 0x6d, 0xae, 0x31, 0xcd, 0x34, 0x70, 0x9a, 0x42, + 0x08, 0xd8, 0x47, 0x72, 0xd5, 0x7c, 0x7e, 0xea, + 0xaa, 0x47, 0xb4, 0x38, 0xe2, 0xb8, 0xbc, 0xc2, + 0xda, 0xca, 0x7b, 0x87, 0xc9, 0x23, 0x9c, 0x3a, + 0xbd, 0xe0, 0xa2, 0x9a, 0x36, 0xa0, 0xab, 0x32, + 0x57, 0x17, 0xc6, 0xe7, 0xd9, 0xb8, 0x38, 0x1a, + 0xb5, 0x8e, 0x71, 0xae, 0xfa, 0xb0, 0x54, 0x2b, + 0x02, 0x82, 0xb0, 0x24, 0x5c, 0x5b, 0x86, 0xb0, + 0xb5, 0xbc, 0x55, 0x07, 0x70, 0xe1, 0xa6, 0xc5, + 0x3a, 0xaa, 0x91, 0x11, 0x10, 0x11, 0x11, 0x04, + 0x76, 0xa3, 0xf5, 0x1d, 0xe7, 0x93, 0xf9, 0xcd, + 0x5a, 0xfa, 0x1b, 0xd4, 0xce, 0xf2, 0xef, 0xed, + 0x35, 0x6c, 0x6a, 0x3f, 0x51, 0xde, 0x79, 0x3f, + 0x9c, 0xd5, 0xaf, 0xa1, 0xbd, 0x4c, 0xef, 0x2e, + 0xfe, 0xd3, 0x55, 0xe3, 0x87, 0x3a, 0x58, 0xcf, + 0x31, 0x4e, 0xe4, 0xeb, 0x58, 0x91, 0x11, 0x51, + 0xb0, 0x88, 0x88, 0x08, 0x88, 0x80, 0xb5, 0x72, + 0x1e, 0x85, 0x73, 0xe4, 0x9f, 0xe2, 0x95, 0xb4, + 0xb5, 0x72, 0x1e, 0x85, 0x73, 0xe4, 0x9f, 0xe2, + 0x95, 0x34, 0xe7, 0x85, 0x6e, 0x6c, 0x55, 0xa2, + 0x75, 0x20, 0xb4, 0x9f, 0xa3, 0xdc, 0x78, 0x6d, + 0xf1, 0x54, 0xf2, 0x81, 0xd2, 0x7e, 0x8f, 0x71, + 0xe1, 0xb7, 0xc5, 0x53, 0xcb, 0x4c, 0x47, 0x16, + 0xad, 0x3f, 0x73, 0x0c, 0x0f, 0x2d, 0x6f, 0x44, + 0xeb, 0x11, 0x11, 0x64, 0xe9, 0x11, 0x11, 0x06, + 0x8e, 0x59, 0xad, 0xe8, 0x9a, 0xf2, 0x2b, 0x43, + 0x42, 0x47, 0x27, 0x2a, 0xad, 0xe9, 0x6b, 0x3b, + 0x8b, 0x1d, 0x51, 0x78, 0x64, 0xa7, 0x45, 0x7b, + 0x6f, 0xc7, 0x19, 0x04, 0x6f, 0x63, 0xc6, 0xc2, + 0x39, 0x8a, 0xb5, 0x5f, 0x33, 0x8a, 0xd9, 0xdc, + 0x84, 0x6d, 0x05, 0x56, 0xdf, 0x76, 0x2d, 0x75, + 0x06, 0x24, 0x97, 0x13, 0xe7, 0x2f, 0x92, 0x02, + 0x6b, 0xfa, 0x4c, 0xd9, 0xb7, 0x9e, 0x8a, 0x63, + 0xab, 0xad, 0x13, 0xdc, 0x5b, 0x17, 0xd3, 0x39, + 0x57, 0xca, 0xfa, 0x61, 0xda, 0xa1, 0x2e, 0x5f, + 0xed, 0xa6, 0xc7, 0xbb, 0xc7, 0x64, 0x00, 0xd8, + 0x43, 0xe0, 0x71, 0xfd, 0xf6, 0xfc, 0x2b, 0x98, + 0x16, 0x55, 0x77, 0x2f, 0x6a, 0x96, 0x22, 0xef, + 0x49, 0x4d, 0x28, 0x15, 0x7d, 0xa4, 0x8c, 0x98, + 0x1e, 0xb5, 0x78, 0x5d, 0xef, 0x15, 0xc3, 0x90, + 0x7c, 0xf0, 0x05, 0xed, 0x02, 0xf5, 0x10, 0x11, + 0x11, 0x01, 0x49, 0x62, 0x62, 0x00, 0x3a, 0x77, + 0x6f, 0x3d, 0xcb, 0x7e, 0x15, 0x1c, 0xd6, 0x97, + 0xb8, 0x34, 0x6f, 0x71, 0xa2, 0x9c, 0x8d, 0x8d, + 0x8a, 0x36, 0xb0, 0x7c, 0x51, 0x45, 0x30, 0x89, + 0x66, 0xe2, 0x5e, 0x71, 0x2c, 0x7c, 0x4b, 0xce, + 0x25, 0x28, 0x64, 0x2e, 0x5e, 0x17, 0x2c, 0x7c, + 0x4b, 0xc2, 0xf4, 0x19, 0x0b, 0x97, 0x9c, 0x4b, + 0x19, 0x72, 0xf0, 0xb9, 0x06, 0x42, 0xe5, 0xe7, + 0x12, 0xc6, 0x5c, 0xbe, 0x78, 0x90, 0x75, 0xaf, + 0x66, 0x37, 0xbd, 0x3e, 0x05, 0xf6, 0xe4, 0xd5, + 0xd6, 0xb2, 0xb9, 0xbf, 0x25, 0xdb, 0x42, 0xb7, + 0x3f, 0x7a, 0xe6, 0x7e, 0xca, 0x2f, 0x43, 0x72, + 0x17, 0x96, 0x64, 0xfd, 0x6c, 0x61, 0xed, 0x1d, + 0x76, 0x95, 0xd3, 0x1d, 0xb9, 0x56, 0x56, 0x85, + 0x3f, 0x57, 0x09, 0x2e, 0x35, 0x0e, 0x0e, 0xd6, + 0x3a, 0x7f, 0x0c, 0xcb, 0x71, 0x25, 0x77, 0x70, + 0x8e, 0x11, 0xf0, 0x29, 0xac, 0x65, 0x5d, 0x30, + 0x7c, 0xb5, 0x12, 0x70, 0xee, 0xe4, 0xd8, 0xaa, + 0xf9, 0x9b, 0xf9, 0x5f, 0xed, 0x06, 0x38, 0xa2, + 0x01, 0xcd, 0xb7, 0x81, 0xb1, 0x3a, 0xbc, 0x9c, + 0x55, 0x90, 0x9f, 0xde, 0x56, 0xbc, 0x44, 0x67, + 0x85, 0xd2, 0xb8, 0x92, 0xee, 0xf7, 0x6f, 0x5c, + 0xf1, 0x15, 0x69, 0xcd, 0x4e, 0x84, 0x47, 0x75, + 0x22, 0x88, 0x8a, 0xa9, 0x11, 0x11, 0x01, 0x47, + 0xea, 0x0f, 0x54, 0xcf, 0xf2, 0x7c, 0x60, 0xa4, + 0x14, 0x7e, 0xa0, 0xf5, 0x4c, 0xff, 0x00, 0x27, + 0xc6, 0x0a, 0xf6, 0xf6, 0xe9, 0xd3, 0x0c, 0xb1, + 0x3c, 0x0b, 0xbb, 0x95, 0xea, 0x7b, 0xa5, 0x7d, + 0x50, 0xdf, 0x0d, 0xfd, 0xb5, 0x2c, 0xfd, 0xca, + 0x27, 0x4a, 0xfa, 0xa1, 0xbe, 0x1b, 0xfb, 0x6a, + 0x59, 0xfb, 0x94, 0xdd, 0xe2, 0xd7, 0xbd, 0x28, + 0xc3, 0x70, 0x2d, 0xee, 0xc3, 0x9c, 0xdd, 0x7f, + 0x93, 0xc7, 0x95, 0x67, 0xd8, 0x85, 0x7f, 0x54, + 0x0b, 0xaf, 0xf2, 0x78, 0xf2, 0xac, 0xfb, 0x10, + 0xaf, 0xeb, 0x96, 0xce, 0x7a, 0xf7, 0xe5, 0xec, + 0x7c, 0x53, 0x36, 0x0f, 0xf8, 0xd6, 0xc4, 0x44, + 0x5b, 0x3c, 0xd1, 0x11, 0x10, 0x7c, 0xca, 0xd0, + 0xf8, 0x9e, 0xc2, 0x2a, 0x08, 0x22, 0x8a, 0x97, + 0x96, 0xb4, 0x99, 0xd7, 0xf6, 0x57, 0xf0, 0xd0, + 0x0b, 0x3b, 0x88, 0xe4, 0x94, 0x3b, 0x63, 0x80, + 0xe2, 0x1c, 0x54, 0xf7, 0x15, 0xd9, 0x56, 0xf3, + 0x23, 0xa3, 0xb7, 0xbb, 0xee, 0xbb, 0xc6, 0x3d, + 0xc0, 0x0d, 0xbb, 0x85, 0x77, 0x29, 0x8c, 0xe8, + 0x95, 0x90, 0xef, 0x45, 0xaf, 0x8e, 0xb9, 0x6d, + 0xde, 0x3e, 0xda, 0xe9, 0xa6, 0xad, 0x9e, 0x26, + 0x48, 0x3e, 0x53, 0x41, 0x5b, 0x0a, 0x25, 0x22, + 0xd3, 0xce, 0xd9, 0x8b, 0xec, 0x35, 0xed, 0xa1, + 0x15, 0x12, 0xc2, 0xf1, 0x4e, 0xbd, 0x2a, 0x3d, + 0xf5, 0xb8, 0xbd, 0xd8, 0x45, 0x0e, 0xed, 0xc8, + 0x3f, 0x32, 0x3d, 0xa5, 0xae, 0x73, 0x5d, 0xdf, + 0x34, 0x90, 0x47, 0x5c, 0x2f, 0x90, 0x09, 0x20, + 0x01, 0x52, 0x76, 0x00, 0x14, 0xb6, 0xa9, 0xb1, + 0xf3, 0x0d, 0x43, 0x7f, 0x6b, 0x4a, 0x35, 0x93, + 0x3b, 0x87, 0x98, 0x9a, 0x85, 0x17, 0x18, 0x93, + 0x8d, 0xa6, 0x20, 0xe7, 0x3c, 0x10, 0x5a, 0x1a, + 0x09, 0x35, 0x1c, 0xc8, 0x37, 0xae, 0x74, 0xfe, + 0x6a, 0xd2, 0xde, 0x3b, 0xab, 0xab, 0x29, 0x61, + 0x86, 0x67, 0x88, 0xe3, 0x7b, 0xdb, 0x4e, 0x27, + 0x1d, 0xc0, 0x2d, 0x5b, 0xbb, 0x3b, 0xab, 0x2b, + 0x87, 0xdb, 0x5d, 0x44, 0xe8, 0xa7, 0x8e, 0x9c, + 0x71, 0xbb, 0x78, 0xa8, 0xae, 0xda, 0x2e, 0xd7, + 0xa8, 0xe6, 0xb5, 0xbe, 0xd0, 0xd6, 0xb7, 0x57, + 0xd6, 0xf2, 0x4a, 0xe9, 0x1b, 0x0b, 0x98, 0xd6, + 0x82, 0x1c, 0xc9, 0x4d, 0x07, 0x1b, 0xb9, 0x40, + 0x1c, 0xab, 0xe7, 0x0d, 0x84, 0xb4, 0xba, 0xb9, + 0xcc, 0xd8, 0xba, 0xc6, 0x31, 0x03, 0xc0, 0x63, + 0x2f, 0x9d, 0xdd, 0xbc, 0xba, 0x48, 0xdb, 0x56, + 0x82, 0xea, 0x9d, 0x9b, 0xd0, 0x71, 0xdc, 0x6e, + 0x17, 0x2b, 0x95, 0x71, 0x6e, 0x3e, 0xd9, 0xf3, + 0x96, 0x90, 0x09, 0x6e, 0xea, 0x9d, 0xc2, 0xa5, + 0x4b, 0x37, 0x4f, 0xe5, 0x6d, 0x1a, 0xd8, 0x04, + 0x1d, 0x34, 0x86, 0xa5, 0xfd, 0x01, 0x12, 0x06, + 0xb8, 0x6f, 0x6b, 0xc8, 0xdc, 0x47, 0x51, 0x6b, + 0x8b, 0x7b, 0xed, 0x3f, 0xa8, 0xc5, 0x93, 0xe4, + 0x27, 0xcc, 0x2e, 0x5a, 0xf7, 0x06, 0x92, 0x1a, + 0xea, 0x38, 0x50, 0xd3, 0xae, 0x15, 0xba, 0xe2, + 0xeb, 0x1f, 0x6c, 0xfc, 0xc5, 0x93, 0xe6, 0xb7, + 0x11, 0x9b, 0xb6, 0x5d, 0xd9, 0x74, 0xcf, 0x77, + 0x46, 0x44, 0x8d, 0xac, 0x83, 0xf8, 0x7b, 0xe9, + 0xd4, 0x41, 0x5d, 0x76, 0x17, 0x23, 0x1c, 0x3e, + 0x71, 0x3b, 0x04, 0x10, 0x98, 0x9d, 0x3b, 0x65, + 0x79, 0xab, 0x4b, 0x1a, 0x68, 0x40, 0x2d, 0xf8, + 0xd5, 0xe4, 0x5b, 0x0c, 0xd3, 0xee, 0x16, 0xd6, + 0x17, 0xb7, 0x17, 0x0d, 0x65, 0xa5, 0xd3, 0xda, + 0xdb, 0xa7, 0x0e, 0xfa, 0xdc, 0x3f, 0x6b, 0x3a, + 0x4f, 0x0a, 0x9b, 0xd6, 0x48, 0x33, 0x58, 0xdb, + 0x4b, 0x19, 0x71, 0x3d, 0xde, 0x52, 0xce, 0xe9, + 0xef, 0x7d, 0xcb, 0x03, 0x5c, 0xde, 0x1f, 0xd0, + 0x30, 0xf2, 0x8a, 0x1d, 0xab, 0x34, 0x79, 0x4d, + 0x49, 0x2b, 0x5f, 0x2d, 0x95, 0x8b, 0x86, 0x35, + 0xd0, 0xb2, 0x16, 0x45, 0x70, 0xd6, 0xf4, 0x7c, + 0x2c, 0xef, 0x5f, 0xc4, 0x69, 0xc4, 0xe5, 0x28, + 0x6a, 0x67, 0xb1, 0x0d, 0xb0, 0x8e, 0x2b, 0x9b, + 0x66, 0xb7, 0xcd, 0x1e, 0xe3, 0x19, 0x91, 0x93, + 0xb6, 0x71, 0xc7, 0xbc, 0x54, 0xb7, 0xbd, 0x24, + 0x72, 0x28, 0x6e, 0x25, 0x62, 0xb9, 0xc3, 0xe7, + 0x6f, 0x0b, 0x2d, 0xef, 0x67, 0xb5, 0x82, 0x28, + 0xa5, 0x8c, 0x4f, 0x0c, 0x00, 0x0e, 0x89, 0xd3, + 0xec, 0x64, 0x8f, 0x63, 0x29, 0xc5, 0x5a, 0xad, + 0x4c, 0x5e, 0x1a, 0xc6, 0x4b, 0xcb, 0x88, 0x2f, + 0xdd, 0x23, 0xbc, 0xce, 0xed, 0xb6, 0xf3, 0xb2, + 0x32, 0x1b, 0x58, 0xdc, 0x4b, 0x78, 0xc7, 0x5e, + 0xa1, 0x32, 0x99, 0x10, 0xc5, 0xe0, 0x6f, 0x5e, + 0xc6, 0xc9, 0xa6, 0x21, 0xb0, 0xc6, 0xf9, 0x49, + 0xda, 0x03, 0x1a, 0x4e, 0xc0, 0xad, 0xd1, 0xe9, + 0xfc, 0x75, 0x95, 0xa5, 0xf9, 0x8c, 0x0b, 0xa9, + 0xa5, 0x6b, 0xae, 0xb1, 0x73, 0x3b, 0x69, 0x10, + 0xc0, 0xe1, 0xd2, 0x31, 0xcd, 0xfd, 0x2d, 0xe0, + 0xad, 0xac, 0x8d, 0xe0, 0xb4, 0xcb, 0x5b, 0xde, + 0xc5, 0x38, 0xb6, 0xb4, 0x69, 0x6c, 0xad, 0x79, + 0x95, 0x81, 0x8d, 0x12, 0xc7, 0xc2, 0x59, 0x14, + 0x2c, 0x15, 0xee, 0x49, 0xa9, 0xaa, 0x65, 0x32, + 0x2a, 0x96, 0x18, 0x3c, 0x9e, 0x43, 0xa3, 0x74, + 0x2c, 0x63, 0x23, 0x99, 0xc5, 0x91, 0xc9, 0x2b, + 0xc3, 0x1a, 0x5c, 0x0d, 0x38, 0x45, 0x76, 0xd6, + 0xbc, 0x8b, 0x7e, 0xd3, 0x49, 0xcb, 0x3f, 0x9c, + 0x13, 0x72, 0x27, 0xf3, 0x77, 0x88, 0x9e, 0xcb, + 0x46, 0xf4, 0x8f, 0x0f, 0xe5, 0xe2, 0x6b, 0x8b, + 0x68, 0x02, 0xc3, 0x92, 0xd4, 0xb6, 0xd7, 0x76, + 0xf0, 0x0e, 0x88, 0x45, 0x7f, 0x67, 0x79, 0xd3, + 0x9b, 0x88, 0x45, 0x23, 0x98, 0x02, 0x3b, 0xbe, + 0x1f, 0x8a, 0xe3, 0xc2, 0x39, 0xd6, 0xac, 0xfa, + 0x82, 0xd7, 0xf1, 0x6b, 0xcb, 0xf8, 0x2c, 0xc3, + 0x99, 0x74, 0xf1, 0x2b, 0x59, 0x23, 0xdc, 0xd7, + 0x31, 0xdb, 0xce, 0xd8, 0xc8, 0xa8, 0x27, 0x91, + 0x40, 0xd0, 0x99, 0xaf, 0x82, 0x69, 0x21, 0x95, + 0xa5, 0x8f, 0x8d, 0xc5, 0xae, 0x6b, 0x85, 0x08, + 0x23, 0xaa, 0x0a, 0xec, 0x1e, 0xcc, 0x6f, 0x85, + 0xd6, 0x99, 0x64, 0x55, 0xab, 0xad, 0x64, 0x74, + 0x67, 0x9a, 0xbc, 0x43, 0xb6, 0xb8, 0xe5, 0xfe, + 0x42, 0xe3, 0x21, 0x79, 0x2d, 0xed, 0xc9, 0x06, + 0x69, 0xdd, 0xc4, 0xfa, 0x6c, 0x1d, 0x4a, 0x0e, + 0x60, 0xba, 0x27, 0xb1, 0xcb, 0x89, 0x48, 0xc8, + 0xdb, 0xd2, 0xb1, 0x02, 0xc7, 0xd7, 0x90, 0x38, + 0xec, 0xa2, 0x91, 0x69, 0xd7, 0xf3, 0xf4, 0x3a, + 0x56, 0xf0, 0x72, 0xcc, 0x63, 0x88, 0x75, 0xf8, + 0x9e, 0x2b, 0xef, 0x05, 0xa5, 0xa7, 0xed, 0xe6, + 0xb7, 0xc4, 0x5a, 0x5b, 0xcd, 0xb8, 0x46, 0xc7, + 0x38, 0x8d, 0x9b, 0x49, 0xe2, 0xa7, 0x61, 0x6b, + 0xfb, 0x53, 0xbb, 0xe8, 0xf1, 0xb6, 0x56, 0x8d, + 0x3d, 0xd4, 0xd3, 0x19, 0x08, 0xeb, 0x46, 0xdf, + 0xf5, 0x7a, 0x94, 0xc5, 0xc7, 0x24, 0x8c, 0xb4, + 0x8e, 0x5e, 0xe7, 0xf8, 0x51, 0x87, 0x81, 0xba, + 0xb4, 0x0e, 0x2a, 0x67, 0x62, 0x3b, 0x64, 0xee, + 0xca, 0xc2, 0xc0, 0x03, 0x40, 0x1b, 0x80, 0x14, + 0xaa, 0xf5, 0x11, 0x55, 0x22, 0x22, 0x20, 0x20, + 0xde, 0x11, 0x06, 0xf0, 0x82, 0x81, 0xa3, 0x7f, + 0xbe, 0x2f, 0xb9, 0xae, 0x3e, 0xd0, 0x2e, 0x90, + 0xb9, 0xbe, 0x8d, 0xfe, 0xf8, 0xbe, 0xe6, 0xb8, + 0xfb, 0x40, 0xba, 0x42, 0xc7, 0x0f, 0xb1, 0xe7, + 0x4b, 0xd3, 0xf8, 0xcf, 0x33, 0x4f, 0xaa, 0xb7, + 0xa9, 0x17, 0x9b, 0xfa, 0x98, 0xfc, 0x3f, 0x80, + 0xac, 0xd6, 0x9e, 0x8d, 0x17, 0x82, 0x3b, 0x4b, + 0x0e, 0x6f, 0xea, 0x63, 0xf0, 0xfe, 0x02, 0xb3, + 0x5a, 0x7a, 0x34, 0x5e, 0x08, 0xed, 0x2e, 0x2b, + 0x3f, 0xd9, 0xe2, 0x3d, 0x55, 0x0e, 0x3a, 0xb9, + 0x7b, 0x7b, 0xf2, 0xca, 0x88, 0x8b, 0xd3, 0x60, + 0x22, 0x22, 0x02, 0x80, 0xd4, 0x16, 0xc2, 0x61, + 0x24, 0x2d, 0x14, 0x74, 0xad, 0xee, 0x49, 0xdc, + 0x49, 0xd8, 0x6a, 0xa7, 0xd4, 0x76, 0x59, 0xb4, + 0x0c, 0x78, 0x34, 0x3b, 0x8e, 0xda, 0x55, 0x20, + 0x7d, 0xe0, 0xf8, 0xdb, 0x88, 0xb4, 0x8e, 0x4f, + 0xac, 0x8a, 0x26, 0xc6, 0xfa, 0x7e, 0x93, 0x07, + 0x09, 0xed, 0x2d, 0xe5, 0x1f, 0x85, 0x94, 0x3e, + 0x19, 0x98, 0x0d, 0x4c, 0x32, 0x96, 0x91, 0xce, + 0x03, 0xfe, 0x72, 0x90, 0x49, 0x1e, 0xb7, 0x7a, + 0xae, 0xfb, 0x44, 0xb2, 0xf3, 0xdd, 0x21, 0x7c, + 0xc0, 0x38, 0x9f, 0x0b, 0x44, 0xcd, 0xe7, 0x8c, + 0xd7, 0xb4, 0xac, 0x21, 0x7c, 0x5e, 0xdb, 0xb6, + 0xea, 0xce, 0x7b, 0x57, 0x8a, 0xb6, 0x78, 0xdd, + 0x19, 0x1e, 0x10, 0x21, 0x07, 0xe6, 0x64, 0x59, + 0x2e, 0x20, 0x75, 0xbc, 0xf2, 0xc0, 0xfd, 0x8e, + 0x89, 0xee, 0x63, 0x87, 0x5d, 0xa6, 0x8b, 0x1a, + 0x02, 0x27, 0x32, 0x20, 0x2f, 0x5a, 0xd2, 0xf7, + 0x06, 0x8d, 0xee, 0x34, 0x0b, 0xc5, 0xbb, 0x61, + 0x6d, 0x26, 0xdb, 0x97, 0x31, 0xc2, 0x36, 0x6c, + 0xe3, 0xa1, 0xe1, 0xa9, 0xeb, 0xee, 0x41, 0xbf, + 0x18, 0x11, 0xc6, 0xd8, 0xc6, 0xe6, 0x8a, 0x2f, + 0x4b, 0x97, 0xc7, 0x11, 0x77, 0x7a, 0x09, 0xe6, + 0xda, 0xb6, 0x61, 0xc6, 0xe4, 0x67, 0x13, 0xf4, + 0x56, 0xef, 0x71, 0xb5, 0x67, 0x49, 0x38, 0xa6, + 0xd6, 0x37, 0xaa, 0x42, 0xb2, 0x18, 0x0b, 0x97, + 0x9c, 0x4b, 0x78, 0xe1, 0xae, 0x1b, 0x8f, 0x65, + 0xf4, 0x8f, 0x0c, 0x12, 0xb0, 0xcb, 0x14, 0x7c, + 0x2e, 0x25, 0xcc, 0x06, 0x95, 0xe2, 0x68, 0x2d, + 0x1e, 0xea, 0x8c, 0xe2, 0xd8, 0x83, 0x27, 0x12, + 0xf0, 0xb9, 0x63, 0xe2, 0x5e, 0x71, 0xa0, 0xc8, + 0x5c, 0xbc, 0x2e, 0x58, 0xcb, 0x96, 0x48, 0xed, + 0x6f, 0x26, 0x69, 0x7c, 0x30, 0x49, 0x23, 0x5a, + 0x2a, 0x5c, 0xd6, 0x92, 0x29, 0xcf, 0x45, 0x03, + 0xce, 0x25, 0x71, 0xf6, 0x5d, 0x7a, 0x22, 0xcf, + 0x49, 0x6c, 0x4e, 0xcb, 0x98, 0x48, 0x03, 0xaa, + 0x58, 0x6a, 0xaa, 0x77, 0x98, 0xdb, 0xeb, 0x28, + 0xda, 0xfb, 0xa6, 0x08, 0xf8, 0x8d, 0x38, 0x78, + 0x9a, 0x5c, 0x09, 0x15, 0xa3, 0x9a, 0x0d, 0x5b, + 0xee, 0xad, 0xbd, 0x29, 0x7d, 0xe6, 0x7a, 0x8a, + 0xc2, 0x7a, 0xd0, 0x09, 0x9a, 0xd7, 0x73, 0x3b, + 0x62, 0x0e, 0xee, 0x48, 0x6f, 0x74, 0x77, 0x37, + 0x69, 0xf7, 0x36, 0xae, 0x63, 0xa2, 0x9b, 0x3c, + 0xb7, 0xd9, 0x1c, 0x8b, 0x36, 0x89, 0x1f, 0x46, + 0xf5, 0x49, 0x73, 0xcb, 0xcf, 0xbc, 0xba, 0x06, + 0x7a, 0xec, 0x59, 0xe1, 0x2f, 0xee, 0x6b, 0x4e, + 0x8a, 0x09, 0x0b, 0x4f, 0x5c, 0xb7, 0x85, 0xbe, + 0xf9, 0x54, 0x5d, 0x06, 0xc9, 0x06, 0x1e, 0xe5, + 0xc6, 0xb4, 0x7c, 0xc1, 0x8c, 0x23, 0x7e, 0xc0, + 0x0b, 0xbb, 0x6a, 0x63, 0x66, 0xa9, 0xd0, 0x4e, + 0x78, 0x5e, 0xf1, 0xa1, 0xa2, 0x17, 0x52, 0xa4, + 0x97, 0x1a, 0xd5, 0x6e, 0x2c, 0x16, 0x4c, 0x0c, + 0xb7, 0x6f, 0x29, 0x7d, 0x5c, 0x4f, 0x5c, 0xac, + 0xea, 0xa9, 0x11, 0x11, 0x01, 0x11, 0x10, 0x46, + 0x65, 0xbe, 0xba, 0x1e, 0x63, 0xdb, 0x53, 0x6d, + 0xef, 0x47, 0x32, 0x84, 0xcb, 0x7d, 0x74, 0x3c, + 0xc7, 0xb6, 0xa6, 0xdb, 0xde, 0x8e, 0x65, 0xe7, + 0x60, 0xf9, 0xec, 0x76, 0x9b, 0x5f, 0xa6, 0x5d, + 0x17, 0x78, 0x36, 0x74, 0x55, 0xad, 0x86, 0xf3, + 0xd1, 0x66, 0xf2, 0x6f, 0xf1, 0x4a, 0xa9, 0x68, + 0x4d, 0xd7, 0x9f, 0xca, 0xf9, 0xea, 0xdb, 0x79, + 0xe8, 0xb3, 0x79, 0x37, 0xf8, 0xa5, 0x54, 0xb4, + 0x26, 0xeb, 0xcf, 0xe5, 0x7c, 0xf5, 0xea, 0xd3, + 0xb1, 0x57, 0x79, 0xc3, 0x5f, 0x1a, 0xd7, 0x9c, + 0xb5, 0xa2, 0x22, 0xcd, 0xb0, 0x88, 0x88, 0x0b, + 0x4b, 0x2a, 0xd6, 0xf4, 0x01, 0xe4, 0x1d, 0x86, + 0x84, 0x8d, 0xe0, 0x15, 0xba, 0xb0, 0xde, 0x37, + 0x8a, 0xd9, 0xfb, 0x69, 0x4d, 0xa0, 0xa0, 0xaf, + 0x69, 0x6b, 0x59, 0xad, 0x32, 0xb9, 0x1e, 0x3a, + 0x74, 0x77, 0x6d, 0x8e, 0x58, 0x88, 0xfd, 0x42, + 0xe6, 0x9a, 0x8f, 0x94, 0xac, 0xea, 0xbf, 0x69, + 0x3b, 0x61, 0xcb, 0xda, 0x31, 0xce, 0xa9, 0xb8, + 0x12, 0xc6, 0x39, 0x76, 0xb5, 0xbd, 0x26, 0xff, + 0x00, 0x92, 0xac, 0x0a, 0x64, 0x16, 0x40, 0x76, + 0x05, 0x8d, 0x7d, 0xc7, 0xb9, 0x40, 0xe2, 0x3e, + 0xd5, 0x2c, 0x3c, 0xd7, 0x55, 0xcb, 0x28, 0x14, + 0x65, 0xd3, 0x1b, 0x28, 0xe7, 0xdc, 0x55, 0x39, + 0x75, 0x2f, 0x6c, 0xf6, 0x15, 0x6e, 0x3f, 0x20, + 0xd1, 0xb8, 0xba, 0x17, 0x1f, 0x7c, 0x2e, 0x5a, + 0x80, 0x9b, 0x17, 0x48, 0xf6, 0x3d, 0x06, 0x32, + 0xed, 0xf7, 0xd0, 0x5d, 0xdb, 0x45, 0x3d, 0xc4, + 0x7c, 0x32, 0x46, 0xe7, 0xb4, 0x38, 0x86, 0x9d, + 0x84, 0x0a, 0xa5, 0xfe, 0x9d, 0xc5, 0x5a, 0xbb, + 0x2b, 0x04, 0xd7, 0x2d, 0x76, 0x3f, 0xcf, 0xe1, + 0x13, 0xba, 0x28, 0xc1, 0x91, 0x9d, 0x25, 0x4f, + 0x46, 0x1d, 0xc9, 0x44, 0x1c, 0xdd, 0x66, 0xb5, + 0x81, 0xd3, 0xca, 0x00, 0x69, 0x73, 0x1b, 0xb5, + 0xf4, 0x04, 0x8a, 0x05, 0x6c, 0xd7, 0xba, 0x4a, + 0xdf, 0x4d, 0x5e, 0x59, 0x5d, 0xe3, 0xe2, 0x74, + 0x98, 0xf9, 0x5a, 0x0f, 0x14, 0xa7, 0x88, 0x19, + 0x06, 0xde, 0x17, 0x73, 0x85, 0xb9, 0x8d, 0xcb, + 0xcb, 0x75, 0xa7, 0xa1, 0xbb, 0x7b, 0x63, 0x8c, + 0x43, 0x90, 0x6c, 0x57, 0x91, 0xc4, 0xc6, 0xc6, + 0xd7, 0xc1, 0x30, 0xa3, 0x5a, 0xee, 0x0a, 0x6c, + 0x09, 0x02, 0xb5, 0xd2, 0x37, 0xaa, 0xb3, 0x41, + 0x67, 0x79, 0x73, 0x2b, 0x61, 0xb7, 0x81, 0xf2, + 0xca, 0xf0, 0x5c, 0xc6, 0x01, 0xb5, 0xcd, 0x6e, + 0xd2, 0xe1, 0xd5, 0x0a, 0xd5, 0x71, 0x05, 0xcd, + 0x96, 0x6c, 0x43, 0x65, 0x03, 0x3c, 0xde, 0x29, + 0x5d, 0x0d, 0xc7, 0x49, 0x03, 0x62, 0x87, 0xa0, + 0x70, 0xaf, 0x0f, 0x48, 0x7b, 0xf3, 0xc3, 0xca, + 0xb0, 0x4b, 0x91, 0xc4, 0xda, 0xdd, 0x4b, 0x9a, + 0xb5, 0xbb, 0xab, 0x3c, 0xd8, 0x41, 0x65, 0x62, + 0x1c, 0x59, 0x3c, 0x45, 0xae, 0x03, 0x82, 0xbb, + 0x47, 0x0e, 0xca, 0xd5, 0x59, 0x08, 0x3b, 0x7c, + 0x45, 0xdc, 0xf6, 0x9e, 0x7a, 0xe7, 0x32, 0x08, + 0x0b, 0xdd, 0x1b, 0x0c, 0xbc, 0x55, 0x73, 0xd9, + 0xdf, 0x34, 0x70, 0x83, 0x4a, 0x75, 0xd4, 0x7f, + 0x1a, 0xb4, 0x37, 0x54, 0xe3, 0xdb, 0x76, 0x6e, + 0xb1, 0xad, 0xbd, 0x63, 0xee, 0x0b, 0x66, 0xb9, + 0xb3, 0x82, 0x86, 0x13, 0x2d, 0x3b, 0xb1, 0x42, + 0x1d, 0xb1, 0xc7, 0x7d, 0x15, 0x76, 0xe5, 0x97, + 0x77, 0x32, 0xbe, 0xf9, 0xd0, 0x74, 0x10, 0xdd, + 0x4e, 0x5a, 0xd3, 0x4e, 0x18, 0xda, 0xf7, 0x1e, + 0xf0, 0x73, 0x28, 0x18, 0x38, 0x97, 0x85, 0xca, + 0x4e, 0x6d, 0x31, 0x96, 0x8a, 0xcd, 0xf7, 0x94, + 0x63, 0xd9, 0x14, 0xfe, 0x6f, 0x2b, 0x18, 0xee, + 0x27, 0x31, 0xd5, 0x02, 0xae, 0x1f, 0xa3, 0xb5, + 0x4b, 0xfe, 0x52, 0xc7, 0xda, 0xcd, 0x79, 0x15, + 0xc4, 0xc6, 0xe9, 0xf6, 0xb0, 0xc5, 0x3b, 0x0f, + 0x18, 0x86, 0x27, 0xb2, 0x4d, 0x8e, 0x25, 0xd4, + 0xd9, 0xc2, 0x53, 0x28, 0xaa, 0x17, 0x05, 0xeb, + 0x44, 0x8f, 0x04, 0xc6, 0xc7, 0xbc, 0x34, 0x55, + 0xc5, 0xad, 0x24, 0x01, 0xd7, 0x20, 0x2b, 0x35, + 0x9d, 0xa6, 0x9b, 0x10, 0x5b, 0x4b, 0x38, 0xf3, + 0x49, 0x05, 0xdb, 0xa3, 0x6d, 0xe5, 0x4c, 0xb0, + 0x10, 0xd2, 0x08, 0x64, 0xa0, 0x8e, 0xf5, 0xc3, + 0x73, 0x97, 0xb7, 0x79, 0x2b, 0x96, 0xd8, 0x66, + 0x6c, 0x9b, 0x70, 0xc8, 0x24, 0xb0, 0xb9, 0x8e, + 0x4b, 0x31, 0x19, 0x6b, 0x43, 0xa2, 0xad, 0x0b, + 0x19, 0x4e, 0xf8, 0x53, 0x6a, 0x65, 0x32, 0x2b, + 0xd7, 0x16, 0x17, 0xf6, 0xb0, 0xb2, 0x7b, 0x98, + 0x1d, 0x14, 0x52, 0x6c, 0x63, 0x9d, 0x4d, 0xb5, + 0xdb, 0xba, 0xaa, 0x43, 0x47, 0x5f, 0xf9, 0x96, + 0xa5, 0xb0, 0x96, 0xb4, 0x6b, 0xa4, 0xe8, 0xdc, + 0x7a, 0xcf, 0xd8, 0xb3, 0xe5, 0xf3, 0x78, 0xab, + 0xdc, 0x64, 0xc6, 0xe5, 0xd6, 0xf7, 0x59, 0x09, + 0x9a, 0xc7, 0x45, 0x2c, 0x11, 0x3a, 0x29, 0x5a, + 0xff, 0x00, 0x8c, 0x66, 0xf8, 0xbb, 0xb6, 0x2a, + 0xd5, 0xbd, 0xc1, 0x86, 0x78, 0xe6, 0x6e, 0xf8, + 0xde, 0xd7, 0x8f, 0x92, 0x6a, 0x83, 0xf4, 0x9b, + 0xb6, 0x82, 0xa8, 0x7a, 0xcd, 0xaf, 0xba, 0xd5, + 0xd8, 0x6b, 0x48, 0xcf, 0xd4, 0xb3, 0xa5, 0x79, + 0x3b, 0x80, 0x2f, 0xa9, 0xf7, 0x98, 0xae, 0x98, + 0xfb, 0x96, 0xdd, 0xd8, 0x5b, 0xdc, 0xb7, 0x68, + 0x9a, 0x36, 0xbb, 0xb2, 0x15, 0x07, 0x23, 0x78, + 0xf9, 0xfd, 0xa4, 0x16, 0xc6, 0x03, 0x9b, 0x03, + 0x5b, 0x0b, 0xab, 0xba, 0x8d, 0x67, 0x13, 0xbd, + 0xf7, 0x29, 0xa3, 0x3f, 0x7a, 0x49, 0x5b, 0x71, + 0xbc, 0x4e, 0xb8, 0x6b, 0xe5, 0xa8, 0x7f, 0x09, + 0x00, 0x6e, 0x1b, 0x0a, 0x96, 0x51, 0x98, 0x88, + 0xeb, 0xc7, 0x2b, 0x89, 0x2e, 0x15, 0x02, 0xbb, + 0xfb, 0xa3, 0x5a, 0xfb, 0xca, 0x4d, 0x55, 0x22, + 0x22, 0x20, 0x22, 0x22, 0x08, 0xed, 0x47, 0xea, + 0x3b, 0xcf, 0x27, 0xf3, 0x9a, 0xb5, 0xf4, 0x37, + 0xa9, 0x9d, 0xe5, 0xdf, 0xda, 0x6a, 0xd8, 0xd4, + 0x7e, 0xa3, 0xbc, 0xf2, 0x7f, 0x39, 0xab, 0x5f, + 0x43, 0x7a, 0x99, 0xde, 0x5d, 0xfd, 0xa6, 0xab, + 0xc7, 0x0e, 0x74, 0xb1, 0x9e, 0x62, 0x9d, 0xc9, + 0xd6, 0xb1, 0x22, 0x22, 0xa3, 0x61, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x6a, 0xe4, 0x3d, 0x0a, 0xe7, + 0xc9, 0x3f, 0xc5, 0x2b, 0x69, 0x6a, 0xe4, 0x3d, + 0x0a, 0xe7, 0xc9, 0x3f, 0xc5, 0x2a, 0x69, 0xcf, + 0x0a, 0xdc, 0xd8, 0xab, 0x44, 0xea, 0x41, 0x69, + 0x3f, 0x47, 0xb8, 0xf0, 0xdb, 0xe2, 0xa9, 0xe5, + 0x03, 0xa4, 0xfd, 0x1e, 0xe3, 0xc3, 0x6f, 0x8a, + 0xa7, 0x96, 0x98, 0x8e, 0x2d, 0x5a, 0x7e, 0xe6, + 0x18, 0x1e, 0x5a, 0xde, 0x89, 0xd6, 0x22, 0x22, + 0xc9, 0xd2, 0x22, 0x22, 0x0c, 0x57, 0x60, 0x9b, + 0x69, 0x00, 0x34, 0xd9, 0xbd, 0x52, 0xf5, 0x43, + 0x5c, 0x2d, 0x22, 0xbe, 0x80, 0x7f, 0x17, 0x1f, + 0x2c, 0x77, 0x2d, 0xa7, 0xea, 0x9e, 0xec, 0x2b, + 0xc9, 0x00, 0x8a, 0x1d, 0xa1, 0x57, 0xf2, 0x96, + 0x6c, 0x26, 0x68, 0x3e, 0x23, 0x9a, 0x43, 0x9b, + 0xb0, 0x0e, 0x12, 0x36, 0x01, 0xd7, 0x53, 0x13, + 0xd2, 0x4a, 0x7a, 0x29, 0x59, 0x34, 0x4c, 0x9a, + 0x33, 0x56, 0x4a, 0xd0, 0xf6, 0x9e, 0xb3, 0x85, + 0x42, 0xfa, 0x1b, 0xd4, 0x0e, 0x8a, 0xbd, 0xf3, + 0x8c, 0x13, 0x2d, 0xde, 0x6b, 0x36, 0x3d, 0xef, + 0xb4, 0x92, 0xbb, 0xff, 0x00, 0x86, 0x7b, 0x82, + 0x7e, 0x49, 0x0a, 0x79, 0x27, 0xa3, 0xa0, 0x6a, + 0xe7, 0x6c, 0x45, 0xfe, 0x1a, 0xf6, 0xc8, 0x8a, + 0xf4, 0xf0, 0x3d, 0x80, 0x75, 0xcb, 0x4d, 0x3d, + 0xf5, 0xf9, 0xb9, 0xcd, 0x73, 0x5c, 0x5a, 0xed, + 0xed, 0x34, 0x23, 0xae, 0x36, 0x2f, 0xd3, 0xe3, + 0x68, 0x5f, 0x9d, 0x35, 0x4d, 0x89, 0xc7, 0xea, + 0x2c, 0x85, 0xa5, 0x28, 0x23, 0x9d, 0xe5, 0xa3, + 0xf5, 0x5c, 0x78, 0x9b, 0xef, 0x15, 0x02, 0x29, + 0x11, 0x75, 0xbc, 0x6e, 0x89, 0xd3, 0xf9, 0x4d, + 0x0e, 0xdb, 0xab, 0x1b, 0x66, 0x47, 0x7f, 0x73, + 0x6e, 0x1c, 0x2e, 0x1e, 0x49, 0x2d, 0x90, 0x77, + 0xdc, 0xdb, 0x90, 0x72, 0x44, 0x5d, 0x16, 0xd3, + 0x41, 0xd8, 0x65, 0xae, 0xac, 0x6d, 0xa7, 0x9e, + 0x2c, 0x7b, 0x9d, 0x68, 0xd7, 0xb5, 0xb0, 0x77, + 0x4e, 0x98, 0x82, 0x43, 0x9f, 0xdd, 0xf2, 0xaa, + 0x7d, 0xdd, 0xb3, 0x30, 0x19, 0xab, 0xbb, 0x5b, + 0xab, 0x51, 0x75, 0xe6, 0xee, 0x73, 0x22, 0x64, + 0xd5, 0x0d, 0x3b, 0x7b, 0x97, 0x90, 0x37, 0xec, + 0x41, 0xa9, 0x8f, 0x8c, 0x3a, 0x43, 0x21, 0xf8, + 0x9b, 0xb9, 0xca, 0x90, 0x2f, 0x1d, 0x5d, 0xaa, + 0xea, 0x6d, 0x2c, 0x2e, 0xee, 0x2d, 0xac, 0xdb, + 0x6f, 0x0c, 0x56, 0x77, 0x98, 0xff, 0x00, 0x3c, + 0x82, 0x26, 0x0e, 0x01, 0xd3, 0xc4, 0x2a, 0xf0, + 0xe7, 0x81, 0xc5, 0x45, 0xa3, 0x8a, 0xfc, 0x2d, + 0xd7, 0x53, 0x47, 0x75, 0x6d, 0x10, 0xc7, 0x32, + 0x36, 0xcd, 0xe7, 0xd0, 0xb5, 0xd4, 0x8e, 0x46, + 0x91, 0xb0, 0x17, 0xed, 0x20, 0xbb, 0x78, 0x53, + 0x08, 0x56, 0x9a, 0xc9, 0x5c, 0xc7, 0xbd, 0xac, + 0x71, 0x6c, 0x62, 0xaf, 0x20, 0x1a, 0x34, 0x75, + 0x4f, 0x51, 0x67, 0x7e, 0x36, 0xf1, 0x96, 0x82, + 0xee, 0x40, 0xc6, 0x46, 0xe6, 0x87, 0xb1, 0xae, + 0x70, 0x0f, 0x2c, 0x26, 0x9c, 0x41, 0x87, 0x6d, + 0x15, 0x9a, 0x0b, 0x98, 0xb0, 0x2e, 0xba, 0x39, + 0x49, 0x5b, 0x33, 0x72, 0x17, 0x1c, 0x13, 0x32, + 0x02, 0xd7, 0x35, 0xf6, 0xee, 0x6e, 0xc2, 0x46, + 0xce, 0x10, 0x2b, 0xef, 0x2d, 0x69, 0x33, 0xf8, + 0xab, 0x38, 0x9f, 0x67, 0xe7, 0x5f, 0x89, 0x5a, + 0x32, 0x37, 0xc5, 0x0c, 0x4f, 0xb7, 0x6f, 0x17, + 0x09, 0xaf, 0x47, 0x49, 0x8f, 0x74, 0x38, 0x54, + 0x8a, 0xb7, 0x12, 0xf3, 0x89, 0x7b, 0x0d, 0xb5, + 0xcc, 0xf2, 0xb2, 0x28, 0xa2, 0x73, 0xa4, 0x97, + 0xea, 0xdb, 0x4e, 0xfa, 0x9f, 0xa3, 0x5d, 0xeb, + 0x75, 0xba, 0x7b, 0x2c, 0x64, 0xb2, 0x6c, 0x91, + 0x74, 0x6c, 0xc8, 0xbb, 0x82, 0xde, 0x52, 0x41, + 0x61, 0xea, 0xd4, 0x8d, 0xd4, 0x50, 0x34, 0x0b, + 0xd7, 0xc9, 0x7a, 0xb2, 0x33, 0x48, 0xb6, 0x38, + 0xee, 0x5d, 0x3c, 0x8f, 0x9a, 0x4b, 0x5b, 0x81, + 0x6d, 0x24, 0x70, 0xf0, 0xb0, 0x0a, 0xb7, 0x89, + 0xb2, 0x17, 0xc8, 0x69, 0xc2, 0xb3, 0xe2, 0xf0, + 0xb8, 0x0b, 0xa7, 0x63, 0x9d, 0x1c, 0x82, 0x3b, + 0xa9, 0x83, 0xba, 0x4b, 0x7b, 0xa3, 0xfc, 0x29, + 0x83, 0x5c, 0x58, 0x43, 0x1e, 0x37, 0x3c, 0x75, + 0x10, 0x55, 0x38, 0x89, 0xdd, 0xb5, 0x64, 0xb8, + 0xb5, 0xbc, 0xb6, 0x63, 0x5f, 0x71, 0x0c, 0x90, + 0xb6, 0x4e, 0xf0, 0xbd, 0xa5, 0xb5, 0xe6, 0xaa, + 0xb1, 0x9c, 0x9d, 0xdb, 0x34, 0xfc, 0xb2, 0xc2, + 0xc8, 0xa0, 0x9b, 0x1d, 0x7c, 0x23, 0x95, 0xad, + 0x63, 0x40, 0x74, 0x5f, 0x14, 0x38, 0x6f, 0x70, + 0x04, 0x2c, 0x3a, 0x86, 0xff, 0x00, 0x15, 0x75, + 0x8f, 0x9a, 0x59, 0x44, 0x03, 0x20, 0xf7, 0xb1, + 0xf0, 0x1b, 0x59, 0x5e, 0xf0, 0xee, 0x2f, 0xac, + 0x32, 0x31, 0xdd, 0xcb, 0x76, 0x20, 0xf8, 0xd0, + 0x77, 0xde, 0x69, 0xaa, 0x2c, 0x9c, 0x4d, 0x1b, + 0x2b, 0x8c, 0x4e, 0xe6, 0x70, 0x5d, 0xb8, 0xd0, + 0x03, 0x5d, 0xdc, 0xab, 0xf3, 0x85, 0x8d, 0xdb, + 0xad, 0xaf, 0x20, 0xb8, 0x69, 0xa1, 0x8a, 0x46, + 0xbc, 0x1e, 0x62, 0x17, 0x73, 0xd4, 0xb9, 0x96, + 0xd9, 0xe9, 0x6b, 0x8c, 0x83, 0x1d, 0x47, 0xcf, + 0x08, 0x64, 0x27, 0xf5, 0xe6, 0x1c, 0x22, 0x9c, + 0xd5, 0x25, 0x33, 0x8a, 0xd6, 0x16, 0xd5, 0xf7, + 0x99, 0x6b, 0xdc, 0xf3, 0xc9, 0xad, 0xd4, 0xef, + 0x10, 0x72, 0xd1, 0x80, 0xf0, 0xb7, 0xde, 0x57, + 0x5b, 0x08, 0x04, 0x31, 0x1a, 0x7c, 0x73, 0xc5, + 0xee, 0x72, 0x2a, 0x8e, 0x98, 0xb7, 0xb8, 0xb7, + 0xc4, 0xc0, 0xcb, 0x97, 0xf7, 0x52, 0x0e, 0x26, + 0x07, 0x6e, 0x68, 0x3d, 0xea, 0xba, 0x43, 0xf5, + 0x4c, 0xad, 0x0d, 0x00, 0xdd, 0xb9, 0x2a, 0xce, + 0x44, 0x3e, 0xd1, 0x11, 0x42, 0x44, 0x44, 0x40, + 0x51, 0xfa, 0x83, 0xd5, 0x33, 0xfc, 0x9f, 0x18, + 0x29, 0x05, 0x1f, 0xa8, 0x3d, 0x53, 0x3f, 0xc9, + 0xf1, 0x82, 0xbd, 0xbd, 0xba, 0x74, 0xc3, 0x2c, + 0x4f, 0x02, 0xee, 0xe5, 0x7a, 0x9e, 0xe9, 0x5f, + 0x54, 0x37, 0xc3, 0x7f, 0x6d, 0x4b, 0x3f, 0x72, + 0x89, 0xd2, 0xbe, 0xa8, 0x6f, 0x86, 0xfe, 0xda, + 0x96, 0x7e, 0xe5, 0x37, 0x78, 0xb5, 0xef, 0x4a, + 0x30, 0xdc, 0x0b, 0x7b, 0xb0, 0xe7, 0x37, 0x5f, + 0xe4, 0xf1, 0xe5, 0x59, 0xf6, 0x21, 0x5f, 0xd5, + 0x02, 0xeb, 0xfc, 0x9e, 0x3c, 0xab, 0x3e, 0xc4, + 0x2b, 0xfa, 0xe5, 0xb3, 0x9e, 0xbd, 0xf9, 0x7b, + 0x1f, 0x14, 0xcd, 0x83, 0xfe, 0x35, 0xb1, 0x11, + 0x16, 0xcf, 0x34, 0x44, 0x44, 0x05, 0x07, 0x91, + 0x6b, 0x1d, 0x2c, 0xd1, 0xbc, 0x71, 0x71, 0x1a, + 0x10, 0x37, 0xf0, 0x91, 0x47, 0x05, 0x38, 0xa3, + 0xf2, 0xb0, 0x34, 0xb1, 0xb2, 0x8d, 0x8e, 0xad, + 0x2a, 0x06, 0xd2, 0x7e, 0x2f, 0xbe, 0x83, 0x4b, + 0x46, 0x48, 0xe1, 0x85, 0xf3, 0x29, 0x0d, 0x64, + 0xc7, 0x4b, 0x25, 0xb1, 0xf0, 0x41, 0xe3, 0x8f, + 0xf7, 0x5c, 0xa7, 0x55, 0x5b, 0x0d, 0x70, 0x2c, + 0xf5, 0x2c, 0xb6, 0x8e, 0x34, 0x6e, 0x46, 0x1e, + 0x91, 0xb4, 0xef, 0x4c, 0xb0, 0x6f, 0xa7, 0x3b, + 0x1d, 0xef, 0x2b, 0x4a, 0x99, 0xce, 0x88, 0x17, + 0xa1, 0x78, 0xbd, 0x0a, 0x12, 0xe3, 0x3e, 0xd6, + 0xec, 0x3c, 0xdf, 0x52, 0x36, 0xe4, 0x0a, 0x36, + 0xee, 0x16, 0xba, 0xbd, 0x76, 0xf7, 0x27, 0xb4, + 0xa2, 0x34, 0x7e, 0xac, 0x97, 0x4e, 0x5f, 0x71, + 0xba, 0x18, 0xe7, 0xb4, 0x99, 0xc3, 0xa7, 0x6b, + 0x9a, 0x0b, 0x80, 0xfd, 0x26, 0x3b, 0x90, 0xab, + 0xd7, 0xb6, 0x3b, 0x1e, 0x93, 0x1b, 0x65, 0x7e, + 0x06, 0xd8, 0x64, 0x31, 0xb8, 0xf5, 0x9c, 0x2b, + 0xf0, 0x2e, 0x4c, 0x50, 0x76, 0xab, 0xfd, 0x7f, + 0xa7, 0xf2, 0xef, 0x7e, 0x06, 0xca, 0x5e, 0xee, + 0xf6, 0x1e, 0x18, 0x6e, 0x5d, 0xb2, 0x21, 0x2b, + 0x87, 0x73, 0x1b, 0xba, 0x8b, 0x46, 0xe3, 0x25, + 0xaa, 0x34, 0x7e, 0x2e, 0xfb, 0x27, 0x97, 0x74, + 0x0f, 0x9a, 0xf1, 0xcd, 0x65, 0xa5, 0xbc, 0x5b, + 0x5a, 0xd9, 0x69, 0xc3, 0xc6, 0xe3, 0xe0, 0x85, + 0xc8, 0x81, 0x2d, 0x20, 0xb7, 0x61, 0x1b, 0x41, + 0x1c, 0x85, 0x4d, 0xdf, 0x6b, 0x0c, 0xf6, 0x4f, + 0x14, 0xcc, 0x45, 0xf4, 0xcd, 0x9e, 0xda, 0x32, + 0x0b, 0x5c, 0xf6, 0x83, 0x27, 0x73, 0xbb, 0xbb, + 0x41, 0xad, 0x73, 0x7f, 0x79, 0x90, 0xb8, 0x96, + 0xfe, 0xf6, 0x43, 0x2d, 0xd5, 0xc1, 0xe2, 0x7c, + 0x87, 0xad, 0xb9, 0x5b, 0xfc, 0xdb, 0x11, 0x7d, + 0x05, 0x95, 0xf5, 0xed, 0xb1, 0x96, 0x2b, 0x8c, + 0x6b, 0x89, 0x10, 0x77, 0x0e, 0x6c, 0xb6, 0xee, + 0xe1, 0x91, 0xcd, 0xa6, 0xca, 0xd3, 0x6e, 0xd5, + 0x46, 0xe3, 0xea, 0x2d, 0x91, 0x99, 0xc9, 0x32, + 0xda, 0x2b, 0x48, 0xee, 0x1d, 0x1c, 0x10, 0x71, + 0x74, 0x4d, 0x6d, 0x05, 0x3a, 0x4e, 0xff, 0x00, + 0x6e, 0xfd, 0xaa, 0x50, 0xbb, 0xc0, 0xfc, 0x75, + 0xb5, 0xbc, 0x22, 0xc4, 0xc7, 0x79, 0x05, 0xc4, + 0x2d, 0x26, 0xe6, 0x09, 0x19, 0x6b, 0x30, 0xe8, + 0xdc, 0x45, 0x1d, 0xc7, 0xca, 0x45, 0x38, 0x82, + 0x87, 0xca, 0xe4, 0x31, 0xe2, 0xd7, 0x31, 0x8d, + 0x6d, 0xfb, 0xe7, 0x69, 0x96, 0x29, 0xac, 0x64, + 0x75, 0x5c, 0x78, 0xda, 0x3b, 0xb6, 0x02, 0xde, + 0xe6, 0x82, 0xbb, 0xd5, 0x4c, 0xb8, 0x1d, 0xfb, + 0x50, 0x17, 0x13, 0x40, 0x09, 0xe6, 0x50, 0x95, + 0xb2, 0xf7, 0x5a, 0x32, 0x70, 0xc8, 0x8d, 0xb9, + 0x9a, 0x17, 0x41, 0x13, 0x65, 0x6b, 0xa9, 0x1b, + 0xc5, 0xc4, 0x23, 0xb9, 0x99, 0x8f, 0x6d, 0x49, + 0xf7, 0x54, 0x65, 0xde, 0xa8, 0xbd, 0x9c, 0xc8, + 0xf8, 0xe2, 0x86, 0xda, 0x79, 0xde, 0xd9, 0x2e, + 0x67, 0x89, 0xa7, 0x8e, 0x47, 0xb0, 0xd5, 0xa5, + 0xd5, 0x34, 0x1b, 0x76, 0xec, 0x51, 0xf0, 0xe3, + 0x72, 0x37, 0x1f, 0x55, 0x03, 0xdc, 0x0f, 0x2d, + 0x28, 0xa4, 0xed, 0x74, 0x6e, 0x66, 0xe3, 0xbe, + 0x68, 0x8c, 0x75, 0xf6, 0xa0, 0x8b, 0x97, 0x23, + 0x7b, 0x2b, 0xdd, 0x24, 0x93, 0xbc, 0xb9, 0xe5, + 0xc4, 0xd0, 0xf0, 0x8e, 0xec, 0xd5, 0xd4, 0x03, + 0xaa, 0xb5, 0x8b, 0x81, 0x35, 0x3b, 0x4f, 0x54, + 0xed, 0x57, 0x8b, 0x2f, 0x67, 0x0e, 0x75, 0x0d, + 0xc4, 0x8e, 0x3d, 0x50, 0x05, 0x15, 0x86, 0xc3, + 0xd9, 0xfe, 0x32, 0x1a, 0x13, 0x00, 0x7b, 0xb7, + 0xd5, 0xdb, 0x7b, 0x68, 0x39, 0x4c, 0x50, 0xdc, + 0x4c, 0x69, 0x0c, 0x6e, 0x90, 0x9d, 0xdc, 0x20, + 0x95, 0x29, 0x69, 0xa4, 0xb5, 0x05, 0xdd, 0x0b, + 0x2d, 0x8b, 0x01, 0xe5, 0x79, 0xe1, 0x5d, 0x7e, + 0xd7, 0x03, 0x6f, 0x08, 0x02, 0x28, 0xda, 0xd1, + 0xbb, 0xb9, 0x00, 0x76, 0x96, 0xf3, 0x2c, 0x1a, + 0xd0, 0xea, 0x0d, 0xad, 0xdc, 0x3a, 0xa8, 0x39, + 0x7d, 0x9f, 0xb3, 0x3b, 0xe9, 0x28, 0x6e, 0xae, + 0x9b, 0x18, 0xe5, 0x6b, 0x07, 0x11, 0x5d, 0x0b, + 0x4a, 0x62, 0xad, 0x30, 0x36, 0xc2, 0xc6, 0xd9, + 0x95, 0x12, 0x1a, 0xc9, 0x31, 0xef, 0xdc, 0xee, + 0xa9, 0x52, 0x7d, 0x04, 0x61, 0x9b, 0x00, 0xae, + 0xcd, 0xcb, 0xe4, 0xf0, 0x40, 0xc7, 0x4f, 0x21, + 0xe1, 0x8e, 0x20, 0x5e, 0xf3, 0xd4, 0x6b, 0x45, + 0x4a, 0x0a, 0x86, 0xab, 0x85, 0xd9, 0xbd, 0x61, + 0x0d, 0x8b, 0x4f, 0xf0, 0x31, 0xf1, 0x37, 0xa4, + 0xa7, 0xe9, 0x3b, 0xf8, 0xae, 0x1e, 0x28, 0x56, + 0xcc, 0x74, 0x1c, 0x72, 0x36, 0x57, 0x1a, 0xf0, + 0x72, 0x75, 0x39, 0x00, 0x0a, 0x8d, 0xa5, 0x66, + 0xba, 0xc8, 0xe6, 0x32, 0x59, 0x79, 0x1e, 0x5b, + 0x1c, 0x8e, 0x2e, 0x2d, 0xea, 0xb9, 0xe6, 0xad, + 0x1f, 0x25, 0xaa, 0xff, 0x00, 0x89, 0xef, 0x1e, + 0x41, 0x04, 0x13, 0xb0, 0x0e, 0x45, 0x6a, 0xf3, + 0xc4, 0x75, 0x42, 0x23, 0xad, 0xbe, 0x88, 0x8a, + 0xa9, 0x11, 0x11, 0x01, 0x06, 0xf0, 0x88, 0x37, + 0x84, 0x14, 0x0d, 0x1b, 0xfd, 0xf1, 0x7d, 0xcd, + 0x71, 0xf6, 0x81, 0x74, 0x85, 0xcd, 0xf4, 0x6f, + 0xf7, 0xc5, 0xf7, 0x35, 0xc7, 0xda, 0x05, 0xd2, + 0x16, 0x38, 0x7d, 0x8f, 0x3a, 0x5e, 0x9f, 0xc6, + 0x79, 0x9a, 0x7d, 0x55, 0xbd, 0x48, 0xbc, 0xdf, + 0xd4, 0xc7, 0xe1, 0xfc, 0x05, 0x66, 0xb4, 0xf4, + 0x68, 0xbc, 0x11, 0xda, 0x58, 0x73, 0x7f, 0x53, + 0x1f, 0x87, 0xf0, 0x15, 0x9a, 0xd3, 0xd1, 0xa2, + 0xf0, 0x47, 0x69, 0x71, 0x59, 0xfe, 0xcf, 0x11, + 0xea, 0xa8, 0x71, 0xd5, 0xcb, 0xdb, 0xdf, 0x96, + 0x54, 0x44, 0x5e, 0x9b, 0x01, 0x11, 0x10, 0x16, + 0x8e, 0x53, 0x63, 0x23, 0x26, 0x9c, 0x21, 0xdb, + 0x41, 0xe5, 0xaa, 0xde, 0x58, 0xe7, 0x89, 0xb2, + 0xc4, 0xe6, 0x38, 0x56, 0xa3, 0x66, 0xca, 0xed, + 0x41, 0x11, 0x85, 0x77, 0x47, 0x91, 0xb8, 0x8f, + 0x73, 0x6e, 0x23, 0x6b, 0xc0, 0xfd, 0x68, 0x8f, + 0x01, 0xa7, 0xc9, 0x73, 0x54, 0xda, 0xae, 0x74, + 0xad, 0xb3, 0xb9, 0x86, 0xe4, 0x9f, 0xe1, 0xc7, + 0x20, 0x6b, 0x8f, 0x51, 0xaf, 0xee, 0x1f, 0x5e, + 0xb6, 0xd5, 0x63, 0xa5, 0x10, 0x17, 0xd8, 0xdc, + 0xbe, 0x17, 0xd3, 0x50, 0x70, 0x0d, 0x79, 0x61, + 0xe6, 0x1a, 0xb3, 0x21, 0x10, 0x14, 0x6c, 0x92, + 0x74, 0xcc, 0xe6, 0x90, 0x07, 0x28, 0x05, 0xd0, + 0x7d, 0xb1, 0xd8, 0xf4, 0x59, 0xab, 0x4b, 0xe0, + 0x36, 0x5c, 0x43, 0xc0, 0xe3, 0xfa, 0xd1, 0x9f, + 0xf4, 0x2a, 0xa1, 0xa7, 0x9d, 0x82, 0x19, 0x26, + 0x0c, 0xf3, 0x24, 0x7d, 0x93, 0x85, 0x09, 0x88, + 0xd0, 0xb4, 0xd7, 0xbe, 0x3d, 0x50, 0x83, 0xa9, + 0xe9, 0x4c, 0x46, 0x17, 0x2d, 0xa0, 0x01, 0x30, + 0xc3, 0x6f, 0x2c, 0xb0, 0xbe, 0x29, 0xee, 0x78, + 0x45, 0x43, 0x98, 0x48, 0x2e, 0x25, 0x43, 0xd8, + 0xe9, 0x7c, 0x1e, 0x42, 0x6c, 0x35, 0x9e, 0x56, + 0x62, 0xe6, 0x4b, 0x6e, 0xe1, 0x69, 0xd0, 0x37, + 0xa3, 0xe9, 0x0b, 0x5f, 0xb4, 0xbd, 0xcd, 0xdf, + 0xb1, 0x5e, 0xb1, 0xf6, 0x7a, 0x63, 0x1d, 0x87, + 0x8b, 0x1f, 0x6a, 0xe8, 0xe3, 0xc7, 0xe4, 0x01, + 0x10, 0xb1, 0xcf, 0xfa, 0xde, 0x31, 0xb7, 0x84, + 0x9e, 0xaa, 0xac, 0x69, 0xfc, 0xd5, 0x95, 0xbe, + 0x6a, 0xdb, 0x1b, 0xe6, 0x53, 0x35, 0x96, 0x2c, + 0x9a, 0xdd, 0xf3, 0xbd, 0x94, 0x8a, 0x1e, 0x17, + 0x39, 0xf5, 0x0e, 0x23, 0x75, 0x02, 0x0a, 0x06, + 0x7f, 0x1f, 0x73, 0xa5, 0x35, 0x25, 0xc4, 0x31, + 0x40, 0x38, 0x01, 0x71, 0xb3, 0x32, 0x8e, 0x30, + 0x63, 0x77, 0x7a, 0xe1, 0x5d, 0xe5, 0x5c, 0xa0, + 0x9f, 0xf1, 0x19, 0xb0, 0xc2, 0x7e, 0x17, 0x5b, + 0xe4, 0xac, 0xa4, 0x6b, 0xa2, 0xe1, 0xfe, 0x18, + 0xb9, 0x88, 0x12, 0x1c, 0x58, 0xda, 0x54, 0xd4, + 0x2a, 0xf6, 0xbe, 0xd5, 0x16, 0x3a, 0x97, 0x2f, + 0x0b, 0xac, 0xe2, 0x22, 0x1b, 0x10, 0xe8, 0xc4, + 0xe7, 0xff, 0x00, 0x50, 0x57, 0x78, 0x1c, 0x81, + 0x64, 0xc7, 0x45, 0x2d, 0xee, 0x9d, 0x85, 0xf1, + 0xdd, 0xc9, 0x04, 0x96, 0x77, 0x8c, 0x81, 0xa7, + 0x67, 0x04, 0x6d, 0x9f, 0xe3, 0x8e, 0x11, 0xc5, + 0xb4, 0xf5, 0xd4, 0xc2, 0x25, 0x21, 0x63, 0x70, + 0xeb, 0x6b, 0xb9, 0x5f, 0x7b, 0x07, 0x49, 0x88, + 0x11, 0x17, 0x5c, 0xb5, 0xf1, 0x36, 0x17, 0x39, + 0xf1, 0x9d, 0x9d, 0x13, 0x77, 0xd6, 0xbb, 0x96, + 0x31, 0x97, 0xb0, 0xc2, 0x4f, 0x71, 0x79, 0x0d, + 0xdb, 0x72, 0x53, 0x5d, 0xce, 0xc9, 0x38, 0x5a, + 0xe2, 0xd3, 0xd0, 0x90, 0x78, 0x9b, 0x28, 0xa1, + 0x1b, 0x2b, 0x4a, 0x2c, 0x0e, 0xd2, 0xce, 0x8e, + 0x69, 0x26, 0xcc, 0xdd, 0xba, 0x4b, 0x58, 0xe4, + 0x60, 0x17, 0x8c, 0x79, 0x7c, 0x4e, 0x6b, 0x89, + 0x06, 0xae, 0x35, 0x2d, 0x70, 0x70, 0xa1, 0x59, + 0xac, 0xec, 0x2c, 0x2d, 0x2f, 0xec, 0x24, 0x6d, + 0xad, 0xa5, 0xcd, 0x95, 0xed, 0xc7, 0x9b, 0x3a, + 0x68, 0xe4, 0x37, 0x01, 0xaf, 0xa1, 0xa0, 0x1c, + 0x5b, 0x41, 0xea, 0xa0, 0xc7, 0x1e, 0xa5, 0xb5, + 0xb6, 0x95, 0xed, 0xc3, 0x47, 0x7b, 0x2d, 0xbf, + 0x76, 0x59, 0x6a, 0xe7, 0x56, 0x0e, 0xec, 0x6e, + 0x73, 0x00, 0x26, 0x82, 0xaa, 0xbc, 0xcc, 0x75, + 0xf4, 0x8f, 0xb6, 0x06, 0x2e, 0x8c, 0x5f, 0x3b, + 0x86, 0xdd, 0xcf, 0xee, 0x5a, 0xe3, 0x5a, 0x6c, + 0x27, 0xae, 0xad, 0x58, 0xdc, 0xb3, 0x6d, 0x6c, + 0xef, 0xbf, 0x11, 0x26, 0x39, 0xb1, 0x57, 0xec, + 0x77, 0x05, 0xb9, 0x6c, 0x2e, 0x7b, 0x3b, 0xc3, + 0xdc, 0xfc, 0x60, 0x38, 0x6a, 0x42, 0xd3, 0xcb, + 0xe5, 0x70, 0xf7, 0x22, 0x28, 0xe5, 0xc8, 0x55, + 0xf6, 0xd7, 0x6f, 0xbb, 0xb7, 0x9a, 0x08, 0xcb, + 0x81, 0x8e, 0x43, 0xc6, 0x63, 0xe1, 0xee, 0x78, + 0x5c, 0xd2, 0x83, 0x43, 0xf2, 0xa6, 0x4b, 0xa1, + 0xb4, 0xb8, 0xe2, 0x63, 0xa0, 0xba, 0x9b, 0xa0, + 0x73, 0xd8, 0x6a, 0x62, 0x70, 0x3c, 0x27, 0x8c, + 0x7b, 0x8a, 0x51, 0xfa, 0x5f, 0x19, 0x66, 0xdb, + 0xf3, 0x2b, 0xc4, 0xce, 0xb0, 0x96, 0x21, 0xc7, + 0x34, 0x9d, 0x14, 0x46, 0x29, 0x86, 0xc9, 0x3b, + 0x8d, 0xbb, 0xf7, 0x28, 0xb9, 0x35, 0x94, 0xb1, + 0x74, 0xc2, 0xcd, 0x8e, 0x60, 0x99, 0xd3, 0x82, + 0xd7, 0x11, 0xc3, 0xd1, 0xcd, 0xde, 0xf7, 0x3c, + 0x8e, 0x69, 0xda, 0xb5, 0x66, 0xd6, 0x19, 0x57, + 0xd4, 0x30, 0x45, 0x1f, 0x1c, 0x51, 0xc1, 0x27, + 0x70, 0x1d, 0xc6, 0xc8, 0xbb, 0xce, 0x2e, 0x3a, + 0xed, 0x08, 0x27, 0xb1, 0xcd, 0xd3, 0xa2, 0x2c, + 0x74, 0x97, 0x31, 0xf9, 0x8c, 0xc6, 0x67, 0xb1, + 0xb7, 0x80, 0x17, 0xc2, 0xf2, 0xd7, 0x77, 0x93, + 0x35, 0xdc, 0x8e, 0x69, 0xd8, 0xe5, 0xaf, 0x75, + 0x95, 0xb8, 0xfc, 0x23, 0x25, 0x6a, 0xfb, 0xc0, + 0xcb, 0x8b, 0x1b, 0xd6, 0xc9, 0x6b, 0xc2, 0xf0, + 0xde, 0x26, 0x0a, 0x8e, 0x18, 0xc0, 0xde, 0x06, + 0xc2, 0xaa, 0xb7, 0x59, 0x3b, 0xdb, 0xb2, 0x7c, + 0xe6, 0x67, 0x4b, 0x53, 0xc5, 0x42, 0x76, 0x56, + 0x94, 0xd8, 0x37, 0x6e, 0x5a, 0xc5, 0xfe, 0xea, + 0x0b, 0x6e, 0x5f, 0x50, 0xe3, 0xef, 0x31, 0xb3, + 0xc7, 0x3b, 0xa2, 0xbc, 0xbc, 0x98, 0x30, 0xc5, + 0x2b, 0x2d, 0xfa, 0x19, 0x18, 0xf1, 0xdf, 0x3a, + 0x49, 0x2b, 0xdd, 0x6c, 0x55, 0x98, 0xa7, 0x74, + 0x72, 0x36, 0x46, 0x9a, 0x39, 0x84, 0x38, 0x1e, + 0xb8, 0x35, 0x58, 0x58, 0x24, 0x79, 0xa3, 0x1a, + 0x5c, 0x7a, 0xc2, 0xaa, 0x4b, 0x19, 0xa7, 0xb2, + 0x17, 0xd7, 0x31, 0xc7, 0x23, 0x0d, 0xbc, 0x0e, + 0x70, 0xe9, 0x26, 0x78, 0xa0, 0x6b, 0x79, 0x4d, + 0x10, 0x75, 0x2d, 0x67, 0x94, 0xe9, 0xb4, 0x75, + 0xa3, 0x62, 0x35, 0x93, 0x28, 0x62, 0x68, 0x1d, + 0x56, 0xb4, 0x74, 0x8f, 0xf7, 0xda, 0x16, 0x4d, + 0x37, 0x8d, 0x7d, 0x9e, 0x32, 0x0b, 0x27, 0x13, + 0x52, 0x0b, 0xdf, 0xb3, 0x7b, 0xdf, 0xb7, 0xde, + 0x55, 0xfd, 0x52, 0xf6, 0x5c, 0xe6, 0xb1, 0x38, + 0x2c, 0x6c, 0x95, 0x86, 0xc6, 0x38, 0xe3, 0x64, + 0x83, 0x77, 0x13, 0xe8, 0x5c, 0xef, 0x71, 0x80, + 0x2b, 0x9d, 0x9d, 0x3c, 0xe5, 0x8d, 0x6b, 0x85, + 0x58, 0x79, 0x79, 0x40, 0x53, 0x3d, 0x14, 0xc4, + 0x75, 0xf4, 0x91, 0x9d, 0x33, 0x14, 0x62, 0x38, + 0x9b, 0x18, 0xdc, 0xd0, 0x02, 0xfb, 0x44, 0x55, + 0x48, 0x88, 0x88, 0x08, 0x88, 0x82, 0x33, 0x2d, + 0xf5, 0xd0, 0xf3, 0x1e, 0xda, 0x9b, 0x6f, 0x7a, + 0x39, 0x94, 0x26, 0x5b, 0xeb, 0xa1, 0xe6, 0x3d, + 0xb5, 0x36, 0xde, 0xf4, 0x73, 0x2f, 0x3b, 0x07, + 0xcf, 0x63, 0xb4, 0xda, 0xfd, 0x32, 0xe8, 0xbb, + 0xc1, 0xb3, 0xa2, 0xad, 0x6c, 0x37, 0x9e, 0x8b, + 0x37, 0x93, 0x7f, 0x8a, 0x55, 0x4b, 0x42, 0x6e, + 0xbc, 0xfe, 0x57, 0xcf, 0x56, 0xdb, 0xcf, 0x45, + 0x9b, 0xc9, 0xbf, 0xc5, 0x2a, 0xa5, 0xa1, 0x37, + 0x5e, 0x7f, 0x2b, 0xe7, 0xaf, 0x56, 0x9d, 0x8a, + 0xbb, 0xce, 0x1a, 0xf8, 0xd6, 0xbc, 0xe5, 0xad, + 0x11, 0x16, 0x6d, 0x84, 0x44, 0x40, 0x58, 0xee, + 0x41, 0x36, 0xf2, 0x00, 0x68, 0x4b, 0x4e, 0xd5, + 0x91, 0x0e, 0xee, 0xaa, 0x0a, 0x9e, 0x45, 0xdd, + 0x1b, 0xad, 0xaf, 0x58, 0x36, 0xd9, 0xcd, 0x1c, + 0xc6, 0x9b, 0xb8, 0x41, 0xe0, 0x94, 0x7e, 0xc3, + 0x95, 0xb3, 0xdf, 0xeb, 0xa8, 0x1c, 0x9d, 0xab, + 0x3a, 0x49, 0x62, 0x1d, 0xe3, 0xc1, 0xe2, 0x6e, + 0xc0, 0x38, 0x4f, 0x20, 0x5b, 0xd8, 0x1b, 0xbf, + 0x3b, 0xc5, 0x42, 0xf2, 0x6b, 0x24, 0x40, 0xc1, + 0x2d, 0x77, 0xf1, 0xc4, 0x78, 0x0d, 0x7b, 0x15, + 0x53, 0xdc, 0x12, 0x0b, 0xe9, 0x9b, 0xd7, 0xca, + 0xf4, 0x6f, 0x50, 0x2a, 0xfe, 0xd3, 0xac, 0x4d, + 0xe6, 0x93, 0xb8, 0x70, 0x15, 0x7d, 0xb3, 0x9b, + 0x2b, 0x7d, 0xc3, 0xb5, 0x70, 0xd8, 0x4c, 0x4d, + 0x99, 0x8e, 0x99, 0x86, 0x48, 0x83, 0x81, 0x7b, + 0x01, 0xa1, 0x73, 0x79, 0x40, 0x3c, 0x8b, 0xf4, + 0x8e, 0x66, 0xd1, 0xb7, 0xb8, 0x9b, 0xbb, 0x57, + 0x0a, 0x89, 0x62, 0x7b, 0x69, 0xee, 0x2f, 0xcd, + 0xd2, 0xb0, 0xc7, 0x23, 0xa3, 0x70, 0xa1, 0x63, + 0x8b, 0x4f, 0xb8, 0x68, 0x83, 0xb5, 0xe8, 0x83, + 0xa1, 0xed, 0xf1, 0x72, 0x66, 0xb1, 0x2d, 0x16, + 0x61, 0x8d, 0xe0, 0xbb, 0x74, 0xcf, 0x25, 0xec, + 0xa7, 0x23, 0xaa, 0xa2, 0xb3, 0x97, 0xb0, 0x58, + 0x65, 0xa4, 0x6e, 0x3b, 0x1f, 0x2d, 0xec, 0x17, + 0xf3, 0x5b, 0xde, 0xc6, 0xe8, 0x1b, 0xc5, 0x13, + 0xcb, 0x6b, 0xc4, 0x4b, 0xba, 0xb5, 0x5c, 0xa1, + 0xb2, 0xca, 0xd6, 0x3a, 0x36, 0xbd, 0xcd, 0x63, + 0xe9, 0xc6, 0xc0, 0x48, 0x0e, 0xa6, 0xea, 0x8e, + 0x55, 0x71, 0xd1, 0x5e, 0xd1, 0x67, 0xd3, 0xb0, + 0x1b, 0x0b, 0xc8, 0x9d, 0x77, 0x63, 0x52, 0x62, + 0xa1, 0xa3, 0xe3, 0x27, 0x78, 0x6d, 0x79, 0x10, + 0x4d, 0x7b, 0x4e, 0xd6, 0x16, 0x37, 0xf1, 0x7e, + 0x5e, 0xb7, 0x8b, 0xa4, 0x95, 0x8e, 0x6b, 0xe7, + 0x94, 0x9d, 0x91, 0xb8, 0x0a, 0xf0, 0x37, 0xaa, + 0x76, 0xed, 0x55, 0xdd, 0x3a, 0x0d, 0xc5, 0xa6, + 0x52, 0xc0, 0x48, 0xf6, 0x70, 0xdb, 0x9b, 0xa8, + 0xe3, 0x61, 0x01, 0xaf, 0x74, 0x5f, 0xa5, 0xca, + 0x68, 0x36, 0xa8, 0x2b, 0xdb, 0x98, 0x2e, 0x72, + 0x37, 0x57, 0x90, 0x35, 0xcd, 0x8a, 0xe2, 0x57, + 0x3d, 0x8d, 0x90, 0xd5, 0xc0, 0x38, 0xd7, 0x69, + 0x0b, 0x6b, 0x09, 0x97, 0x18, 0xac, 0x83, 0x6f, + 0x1d, 0x19, 0x99, 0x82, 0x39, 0x23, 0x7c, 0x40, + 0xd3, 0x88, 0x48, 0xde, 0x1a, 0x55, 0x10, 0xb0, + 0xbb, 0x4c, 0x5d, 0x5c, 0x8e, 0x9e, 0xe2, 0xfe, + 0x4c, 0x85, 0xb1, 0xb7, 0x13, 0x74, 0x91, 0xb8, + 0xf1, 0xc4, 0xe2, 0xd0, 0xfa, 0x4b, 0x1b, 0xb7, + 0x0a, 0x6e, 0x21, 0x7b, 0x35, 0x86, 0x26, 0xce, + 0x3f, 0xc4, 0x71, 0xd0, 0x5a, 0xe4, 0x2d, 0x6d, + 0xdc, 0xc6, 0xcc, 0x5f, 0x23, 0x9e, 0xf0, 0xc7, + 0x90, 0x38, 0xe4, 0x89, 0xe0, 0x50, 0xf3, 0x15, + 0x5f, 0x7e, 0xa3, 0xbc, 0x6c, 0xd0, 0x4d, 0x69, + 0xff, 0x00, 0xc5, 0x7c, 0x10, 0xf9, 0xb9, 0x2d, + 0x35, 0xe9, 0x23, 0xdb, 0x41, 0x20, 0xdc, 0x76, + 0x6c, 0x5a, 0xf7, 0x79, 0xcc, 0x9d, 0xdc, 0x22, + 0xde, 0x79, 0xcb, 0xa1, 0x6d, 0x0f, 0x03, 0x40, + 0x68, 0x3c, 0x3d, 0xef, 0x17, 0x0e, 0xfa, 0x21, + 0xd0, 0xbc, 0x79, 0xe3, 0x2d, 0x72, 0xd9, 0xcc, + 0x74, 0xfc, 0x30, 0x5b, 0xb2, 0x16, 0xcd, 0x66, + 0x60, 0xe1, 0x85, 0xe5, 0xa0, 0x87, 0x86, 0x31, + 0xfd, 0x52, 0x0d, 0x14, 0x76, 0x67, 0x2f, 0x84, + 0xc9, 0x5b, 0x5c, 0x43, 0x2d, 0xe9, 0x6c, 0x77, + 0xb2, 0x47, 0x75, 0x6e, 0xf6, 0xc6, 0x4b, 0xe1, + 0x7b, 0x1a, 0x18, 0xf8, 0xe5, 0x68, 0xe5, 0x34, + 0xef, 0x86, 0xf5, 0x4c, 0x92, 0x57, 0xc8, 0x78, + 0xa4, 0x71, 0x79, 0xea, 0xb8, 0x92, 0x7d, 0xf5, + 0xf2, 0xd2, 0xe7, 0x1a, 0x34, 0x17, 0x1e, 0xa0, + 0x15, 0x44, 0xe4, 0x5a, 0xdd, 0xac, 0xbc, 0xda, + 0xe6, 0x49, 0xac, 0xa3, 0x71, 0x77, 0x48, 0x0b, + 0x7a, 0x4a, 0x70, 0xbe, 0x3e, 0x8f, 0xa3, 0x7f, + 0x1b, 0x7f, 0x58, 0xf7, 0x4b, 0x40, 0x6a, 0xec, + 0xa4, 0x6d, 0x8f, 0xa2, 0x11, 0xb4, 0xc7, 0x01, + 0xb6, 0x2e, 0x73, 0x78, 0xcb, 0xe3, 0x2e, 0xe3, + 0xee, 0xc3, 0xba, 0x85, 0x47, 0xdb, 0xe1, 0xb2, + 0xd7, 0x47, 0xf8, 0x36, 0xb2, 0x38, 0x1e, 0x52, + 0x28, 0x3d, 0xf5, 0x2d, 0x69, 0xa0, 0xf3, 0x77, + 0x06, 0xb2, 0x70, 0xc2, 0x3a, 0xe6, 0xa7, 0xde, + 0x41, 0x11, 0x79, 0x95, 0xbf, 0xbd, 0x04, 0x5c, + 0xcc, 0x5e, 0xd2, 0x41, 0xe0, 0x00, 0x06, 0x54, + 0x6c, 0x14, 0x68, 0xd8, 0xb5, 0x0b, 0xc1, 0xdf, + 0xef, 0xab, 0xed, 0x9f, 0xb3, 0x16, 0x1a, 0x1b, + 0xab, 0x87, 0xbb, 0xaa, 0x1a, 0x28, 0xa7, 0x6c, + 0x74, 0x06, 0x12, 0xde, 0x84, 0xc1, 0xd2, 0xb8, + 0x72, 0xbf, 0x6a, 0x0e, 0x4f, 0x1b, 0x26, 0x94, + 0xd2, 0x36, 0x39, 0xe7, 0xa8, 0xd0, 0x4a, 0x99, + 0xc4, 0x69, 0x2c, 0xce, 0x46, 0xe6, 0x36, 0x3e, + 0x07, 0x5b, 0xc0, 0x48, 0xe9, 0x26, 0x90, 0x50, + 0x06, 0xf2, 0xae, 0xb9, 0x6b, 0x82, 0xb4, 0xb7, + 0xee, 0x62, 0x85, 0x91, 0x90, 0x39, 0x1a, 0x02, + 0xdc, 0xf3, 0x4e, 0x07, 0x70, 0xec, 0x34, 0xea, + 0x20, 0xdf, 0xb1, 0x65, 0xbd, 0xa5, 0x84, 0x51, + 0xc4, 0xea, 0xc1, 0x6f, 0x18, 0x68, 0x77, 0x59, + 0x83, 0x95, 0x73, 0xfd, 0x33, 0x6b, 0x2d, 0xde, + 0x46, 0xf3, 0x3f, 0x21, 0x21, 0xd7, 0x52, 0xc9, + 0xd1, 0x1e, 0xa0, 0x79, 0x26, 0xbd, 0x85, 0x62, + 0xd5, 0x59, 0x11, 0x8b, 0xd2, 0xf7, 0xa5, 0xa7, + 0x86, 0x49, 0xc0, 0xb7, 0x8b, 0x9e, 0x5e, 0xe4, + 0xf6, 0x1b, 0x55, 0x15, 0xa5, 0x60, 0x9a, 0xdf, + 0x0f, 0x00, 0x9d, 0xfb, 0x65, 0x05, 0xcc, 0x69, + 0xdc, 0xd6, 0x9e, 0xf7, 0xfd, 0x55, 0xa3, 0xa2, + 0x99, 0x9e, 0xb4, 0x67, 0x95, 0xbf, 0x1f, 0x6e, + 0xd8, 0x63, 0x2e, 0x1b, 0x7a, 0x43, 0x5f, 0x71, + 0x6d, 0x2c, 0x76, 0xf5, 0xe8, 0x58, 0x09, 0xa9, + 0x00, 0x02, 0x42, 0xc8, 0xaa, 0x91, 0x11, 0x10, + 0x11, 0x11, 0x04, 0x76, 0xa3, 0xf5, 0x1d, 0xe7, + 0x93, 0xf9, 0xcd, 0x5a, 0xfa, 0x1b, 0xd4, 0xce, + 0xf2, 0xef, 0xed, 0x35, 0x6c, 0x6a, 0x3f, 0x51, + 0xde, 0x79, 0x3f, 0x9c, 0xd5, 0xaf, 0xa1, 0xbd, + 0x4c, 0xef, 0x2e, 0xfe, 0xd3, 0x55, 0xe3, 0x87, + 0x3a, 0x58, 0xcf, 0x31, 0x4e, 0xe4, 0xeb, 0x58, + 0x91, 0x11, 0x51, 0xb0, 0x88, 0x88, 0x08, 0x88, + 0x80, 0xb5, 0x72, 0x1e, 0x85, 0x73, 0xe4, 0x9f, + 0xe2, 0x95, 0xb4, 0xb5, 0x72, 0x1e, 0x85, 0x73, + 0xe4, 0x9f, 0xe2, 0x95, 0x34, 0xe7, 0x85, 0x6e, + 0x6c, 0x55, 0xa2, 0x75, 0x20, 0xb4, 0x9f, 0xa3, + 0xdc, 0x78, 0x6d, 0xf1, 0x54, 0xf2, 0x81, 0xd2, + 0x7e, 0x8f, 0x71, 0xe1, 0xb7, 0xc5, 0x53, 0xcb, + 0x4c, 0x47, 0x16, 0xad, 0x3f, 0x73, 0x0c, 0x0f, + 0x2d, 0x6f, 0x44, 0xeb, 0x11, 0x11, 0x64, 0xe9, + 0x11, 0x11, 0x01, 0x45, 0xe5, 0x03, 0x7a, 0x5a, + 0x96, 0xd6, 0xad, 0xa0, 0xe7, 0x0a, 0x51, 0x60, + 0xba, 0xb7, 0xe9, 0xd9, 0x40, 0x68, 0xe1, 0xde, + 0x9a, 0x55, 0x05, 0x53, 0x05, 0xd2, 0xe2, 0x75, + 0x4d, 0xc4, 0x0e, 0xf4, 0x2c, 0xb0, 0xe2, 0x8d, + 0xc0, 0xec, 0x13, 0xb2, 0xa6, 0x9e, 0xe8, 0xaa, + 0xb9, 0x2a, 0x96, 0x42, 0x17, 0xc9, 0x6f, 0x2b, + 0xc5, 0x1b, 0x34, 0x1f, 0xc5, 0x8a, 0x4e, 0xa3, + 0xe3, 0xda, 0x3b, 0x4a, 0xc1, 0x86, 0xc9, 0xc3, + 0x96, 0xc6, 0x41, 0x90, 0x86, 0x9c, 0x33, 0x37, + 0xba, 0x6f, 0xe8, 0xbc, 0x6c, 0x7b, 0x7d, 0xc2, + 0xa6, 0x7a, 0x63, 0x28, 0x90, 0x69, 0xd8, 0xb8, + 0xb7, 0xb5, 0xab, 0x1f, 0x37, 0xd5, 0x02, 0xe0, + 0x0a, 0x36, 0xee, 0x16, 0xba, 0xbf, 0xac, 0xce, + 0xe0, 0xfc, 0x0b, 0xb4, 0x35, 0x73, 0xaf, 0x6c, + 0xd6, 0x21, 0xf8, 0xfb, 0x0c, 0x83, 0x46, 0xd8, + 0x65, 0x74, 0x4e, 0x3f, 0xaa, 0xf1, 0x51, 0xef, + 0xb5, 0x40, 0xe7, 0x9a, 0x66, 0xc3, 0x0b, 0x90, + 0xc8, 0x8b, 0x6c, 0xc5, 0xe3, 0xac, 0x61, 0x7d, + 0x04, 0x72, 0x34, 0x54, 0x17, 0x7e, 0x8b, 0x8f, + 0x22, 0xee, 0x36, 0x5a, 0x6f, 0x1d, 0x61, 0xa7, + 0x4e, 0x06, 0x19, 0x9e, 0xfb, 0x69, 0x18, 0xf0, + 0xd7, 0x97, 0x0e, 0x32, 0x1f, 0xdd, 0x77, 0x24, + 0x2f, 0xcf, 0x0a, 0x4c, 0xea, 0x6c, 0xeb, 0x8d, + 0x9b, 0x9d, 0x79, 0x21, 0x38, 0xff, 0x00, 0x45, + 0xa9, 0xef, 0x7f, 0xd5, 0x07, 0x4e, 0xd2, 0xf9, + 0x6d, 0x3b, 0x26, 0x6a, 0xc6, 0xd3, 0x8f, 0xa4, + 0xbc, 0xb2, 0xb3, 0x74, 0x11, 0xb9, 0xc0, 0xff, + 0x00, 0x08, 0xc6, 0xe7, 0x17, 0x87, 0x3b, 0x77, + 0x7a, 0xaa, 0x5e, 0xd1, 0x33, 0x38, 0x9c, 0xe6, + 0xa1, 0x8e, 0x6c, 0x6d, 0x5e, 0x2d, 0x98, 0x62, + 0x9a, 0x52, 0x28, 0xd7, 0xb8, 0x13, 0x4e, 0x1e, + 0xaa, 0x9b, 0x97, 0x5b, 0xe9, 0x9c, 0x8e, 0x95, + 0xbc, 0x8e, 0x91, 0xe3, 0x33, 0x33, 0x42, 0xe6, + 0x3f, 0x86, 0x3a, 0x17, 0xbc, 0xef, 0x2d, 0x73, + 0x07, 0xc6, 0x5c, 0xe2, 0x1e, 0xe5, 0x9d, 0x73, + 0xbd, 0x05, 0xce, 0xc8, 0xe5, 0x2e, 0x30, 0xf8, + 0xbb, 0xab, 0x1b, 0x86, 0x32, 0xe2, 0xde, 0x77, + 0x58, 0xc1, 0xc4, 0xde, 0x1e, 0x0e, 0x90, 0x17, + 0x77, 0x4f, 0x24, 0xd7, 0x8b, 0x99, 0x7c, 0xfe, + 0x09, 0x9b, 0xba, 0xb9, 0x75, 0xbe, 0x62, 0xed, + 0xf6, 0xe5, 0x92, 0x08, 0xdf, 0x19, 0xa0, 0x6b, + 0x9a, 0xe0, 0x5c, 0xd2, 0xc7, 0x0a, 0x30, 0xf1, + 0x11, 0x40, 0xa3, 0x30, 0xd9, 0xcb, 0x5b, 0x3c, + 0x45, 0xdd, 0x9d, 0xcb, 0x9c, 0x24, 0x74, 0xf0, + 0xdc, 0x5a, 0xf0, 0xb6, 0xbd, 0xdc, 0x46, 0xae, + 0xaf, 0x52, 0xa1, 0x27, 0xd5, 0xb7, 0x3d, 0x1d, + 0xcd, 0x9b, 0x1b, 0xe7, 0x18, 0xf9, 0x65, 0x13, + 0x43, 0x15, 0xcd, 0x1c, 0xe8, 0xc8, 0x35, 0xa0, + 0x23, 0x90, 0xf5, 0x14, 0xa1, 0x2f, 0x69, 0x80, + 0xb0, 0xb6, 0xc9, 0xda, 0xda, 0xdf, 0x59, 0x4c, + 0x45, 0xf7, 0x13, 0x61, 0x92, 0x69, 0x1a, 0x58, + 0x1e, 0xd6, 0x92, 0x1b, 0x58, 0x4d, 0x1d, 0xb5, + 0x6c, 0xe0, 0xae, 0x71, 0xa3, 0x1b, 0xe7, 0x97, + 0x10, 0xc5, 0x62, 0x2c, 0xef, 0xba, 0x0b, 0xc6, + 0xb6, 0x21, 0x28, 0x73, 0x1e, 0x28, 0x1a, 0xf2, + 0xfd, 0xad, 0x6d, 0x55, 0x4a, 0x6d, 0x47, 0x7e, + 0xef, 0x36, 0x6d, 0xbf, 0x05, 0x9c, 0x76, 0x6e, + 0x32, 0x5b, 0xc7, 0x00, 0xa0, 0x6b, 0xdd, 0xbd, + 0xd5, 0x75, 0x4d, 0x56, 0x84, 0xb7, 0x97, 0x12, + 0x39, 0xee, 0x7c, 0x8e, 0x26, 0x53, 0xc5, 0x26, + 0xde, 0xf9, 0xdd, 0x52, 0x10, 0x5d, 0xb2, 0x72, + 0xdb, 0x19, 0x31, 0xce, 0x7d, 0xdd, 0xb5, 0xb4, + 0xf8, 0xb9, 0xde, 0x4b, 0x43, 0xf8, 0x98, 0xeb, + 0x77, 0x3f, 0xa4, 0x61, 0x88, 0xb2, 0xbc, 0x5d, + 0xce, 0xca, 0x2d, 0x23, 0xac, 0x63, 0x82, 0xd5, + 0xf6, 0xf6, 0xe1, 0xd2, 0xb1, 0xdd, 0x33, 0x63, + 0x6b, 0x87, 0xd5, 0x97, 0x38, 0x98, 0xa5, 0x61, + 0x3c, 0xb4, 0x71, 0xaa, 0xa8, 0x17, 0x85, 0xeb, + 0x1b, 0x2c, 0x86, 0x8c, 0x6b, 0x9c, 0x7a, 0xc2, + 0xaa, 0x05, 0x92, 0xfb, 0x59, 0x3a, 0xe3, 0xce, + 0x1a, 0x2c, 0xa2, 0x74, 0x77, 0x62, 0x1e, 0x99, + 0x92, 0x92, 0xf0, 0x5f, 0x00, 0xe1, 0x0f, 0xd9, + 0x4d, 0xa7, 0x95, 0x43, 0xde, 0x65, 0xef, 0x2f, + 0x03, 0x1b, 0x29, 0x6b, 0x63, 0x89, 0xc5, 0xf1, + 0x47, 0x1b, 0x43, 0x03, 0x09, 0xa5, 0x78, 0x78, + 0x79, 0x97, 0x90, 0x61, 0xb2, 0x73, 0x9e, 0xe6, + 0x12, 0x01, 0xe5, 0x76, 0xc5, 0x23, 0x6d, 0xa3, + 0xef, 0xa5, 0xfa, 0xd7, 0x86, 0x75, 0x80, 0xaa, + 0x08, 0x47, 0xcc, 0xf7, 0x12, 0x5c, 0xe2, 0x49, + 0x35, 0x71, 0x27, 0x79, 0xea, 0x95, 0xf1, 0xc6, + 0x2a, 0xae, 0x96, 0xba, 0x1e, 0xd8, 0x6d, 0x94, + 0xba, 0x43, 0xcb, 0x53, 0x40, 0xa6, 0x6d, 0x34, + 0xc5, 0x84, 0x14, 0xe8, 0xe0, 0x68, 0x3d, 0x52, + 0x2a, 0x51, 0x39, 0x14, 0x1c, 0x4e, 0x22, 0xf7, + 0x2b, 0x7b, 0x15, 0xac, 0x2c, 0x2c, 0x6c, 0x8e, + 0x01, 0xd2, 0xbf, 0xb9, 0x63, 0x47, 0x29, 0x24, + 0xae, 0x9d, 0xa9, 0x5f, 0x05, 0xc6, 0x5b, 0x0d, + 0xa5, 0xd8, 0xf0, 0xfb, 0x7b, 0x46, 0xb6, 0x6b, + 0x93, 0x5d, 0x8e, 0x21, 0xbd, 0xc0, 0x3e, 0xe7, + 0x6d, 0x79, 0x2d, 0xb4, 0x16, 0x56, 0xb2, 0x4f, + 0x20, 0x0d, 0x8a, 0x26, 0x97, 0x3a, 0x9b, 0x37, + 0x72, 0x7b, 0xaa, 0x33, 0x49, 0x5a, 0xc9, 0x75, + 0x77, 0x71, 0x97, 0xba, 0xaf, 0x13, 0xc9, 0x0c, + 0xe5, 0xdf, 0xb3, 0x97, 0xf4, 0x42, 0xb5, 0x39, + 0xa6, 0xae, 0xa8, 0x44, 0xf5, 0x2e, 0xf6, 0x16, + 0x31, 0x4b, 0x37, 0x15, 0x29, 0x1c, 0x6d, 0x6d, + 0x36, 0x72, 0xf2, 0xef, 0xeb, 0xa9, 0x9e, 0xb2, + 0xd6, 0xc7, 0x30, 0x32, 0xd1, 0x87, 0x6d, 0x5d, + 0xb4, 0xd5, 0x6c, 0xaa, 0xa4, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x51, 0xfa, 0x83, 0xd5, 0x33, 0xfc, + 0x9f, 0x18, 0x29, 0x05, 0x1f, 0xa8, 0x3d, 0x53, + 0x3f, 0xc9, 0xf1, 0x82, 0xbd, 0xbd, 0xba, 0x74, + 0xc3, 0x2c, 0x4f, 0x02, 0xee, 0xe5, 0x7a, 0x9e, + 0xe9, 0x5f, 0x54, 0x37, 0xc3, 0x7f, 0x6d, 0x4b, + 0x3f, 0x72, 0x89, 0xd2, 0xbe, 0xa8, 0x6f, 0x86, + 0xfe, 0xda, 0x96, 0x7e, 0xe5, 0x37, 0x78, 0xb5, + 0xef, 0x4a, 0x30, 0xdc, 0x0b, 0x7b, 0xb0, 0xe7, + 0x37, 0x5f, 0xe4, 0xf1, 0xe5, 0x59, 0xf6, 0x21, + 0x5f, 0xd5, 0x02, 0xeb, 0xfc, 0x9e, 0x3c, 0xab, + 0x3e, 0xc4, 0x2b, 0xfa, 0xe5, 0xb3, 0x9e, 0xbd, + 0xf9, 0x7b, 0x1f, 0x14, 0xcd, 0x83, 0xfe, 0x35, + 0xb1, 0x11, 0x16, 0xcf, 0x34, 0x44, 0x44, 0x05, + 0xaf, 0x7e, 0x2b, 0x6c, 0xe1, 0x4a, 0xee, 0x3d, + 0x8d, 0xab, 0x61, 0x78, 0xe6, 0xf1, 0x34, 0xb4, + 0xf2, 0xa0, 0xa5, 0x67, 0xa0, 0x9d, 0x8e, 0xb5, + 0xca, 0x58, 0xb6, 0xb7, 0x18, 0xf9, 0x44, 0xcd, + 0x8c, 0x6c, 0x2e, 0x65, 0x07, 0x1b, 0x7d, 0xd6, + 0xab, 0x94, 0x13, 0xc5, 0x73, 0x04, 0x77, 0x10, + 0x9e, 0x28, 0xe5, 0x68, 0x7b, 0x0f, 0x58, 0x8a, + 0xa8, 0x6c, 0x84, 0x0e, 0x86, 0x61, 0x1e, 0xc7, + 0xb1, 0xc2, 0xa1, 0xb4, 0xa6, 0xcd, 0xcb, 0x1e, + 0x9b, 0xbf, 0x8e, 0x2b, 0xbb, 0x9c, 0x1b, 0x9d, + 0xdd, 0xdb, 0xff, 0x00, 0x1e, 0xdc, 0x75, 0x62, + 0x7e, 0xd7, 0x37, 0xe4, 0x3b, 0xb6, 0xa7, 0x3c, + 0x68, 0x16, 0x14, 0x44, 0x50, 0x2b, 0xfa, 0xfb, + 0x1c, 0x72, 0x1a, 0x56, 0xf6, 0x26, 0xb7, 0x89, + 0xf1, 0xb4, 0x4a, 0xc0, 0x37, 0xd5, 0x86, 0xbb, + 0x3d, 0xc5, 0xc1, 0x28, 0xbf, 0x4d, 0x38, 0x54, + 0x10, 0x76, 0x83, 0xb0, 0x85, 0x45, 0xca, 0xe8, + 0x1d, 0x3f, 0x73, 0x90, 0x7c, 0xed, 0xb7, 0x30, + 0xd4, 0xd5, 0xec, 0x63, 0x88, 0x69, 0x3c, 0xa6, + 0x9c, 0x88, 0x38, 0xf0, 0xdb, 0xb9, 0x6c, 0x5b, + 0xd8, 0xdf, 0x4e, 0x69, 0x04, 0x12, 0x49, 0x5e, + 0xa3, 0x4a, 0xec, 0x16, 0xba, 0x43, 0x0b, 0x6d, + 0x4e, 0x8a, 0xd6, 0x30, 0x47, 0x29, 0x15, 0x3e, + 0xfa, 0x94, 0x87, 0x15, 0x0b, 0x48, 0x64, 0x6c, + 0x03, 0xac, 0x05, 0x10, 0x72, 0x0b, 0x6d, 0x1f, + 0x9e, 0xb8, 0xa1, 0xe8, 0x7a, 0x20, 0x7f, 0x48, + 0xd3, 0xde, 0x52, 0xd6, 0xbe, 0xce, 0x6f, 0x1f, + 0x43, 0x3c, 0xd4, 0xea, 0x86, 0x8f, 0x84, 0xae, + 0xa6, 0x6c, 0x44, 0x4e, 0xe1, 0x2d, 0x1c, 0xeb, + 0x2c, 0x51, 0x35, 0xae, 0x69, 0xa6, 0xca, 0xa0, + 0xa0, 0x59, 0xfb, 0x37, 0xb2, 0x69, 0x1d, 0x20, + 0x32, 0x1f, 0xd6, 0x3f, 0xe8, 0xa7, 0x6d, 0x34, + 0x5e, 0x3e, 0xdd, 0xbc, 0x4d, 0x85, 0xa0, 0x0d, + 0xfb, 0x02, 0xb4, 0x86, 0x10, 0x7b, 0x96, 0xed, + 0x04, 0xed, 0xeb, 0x15, 0xef, 0x01, 0x22, 0x9b, + 0x00, 0xeb, 0x20, 0x8b, 0x83, 0x05, 0x6b, 0x1b, + 0xb8, 0x43, 0x40, 0x34, 0xa8, 0x34, 0xd8, 0xb6, + 0xdb, 0x67, 0x04, 0x60, 0xd0, 0x02, 0x40, 0xa8, + 0xe7, 0x5b, 0x41, 0x82, 0x95, 0x24, 0x9e, 0xb2, + 0xf4, 0xb1, 0xb4, 0xa0, 0x1e, 0xea, 0x0c, 0x2d, + 0x63, 0x1a, 0x36, 0x37, 0x6e, 0xf1, 0xce, 0xbe, + 0x85, 0x40, 0x14, 0x14, 0xa0, 0xe1, 0x59, 0x38, + 0x17, 0xd7, 0x02, 0x0c, 0x21, 0xa7, 0x68, 0x06, + 0x80, 0xef, 0x5f, 0x41, 0x9d, 0x55, 0x94, 0x35, + 0x7a, 0x1a, 0x83, 0x10, 0x60, 0x55, 0x8f, 0x68, + 0x59, 0x41, 0x61, 0x83, 0x36, 0x8c, 0x34, 0x9a, + 0xfc, 0xf4, 0x62, 0x9b, 0xfa, 0x36, 0xf7, 0x52, + 0x1e, 0xd0, 0xf7, 0x55, 0xb2, 0x94, 0xeb, 0x53, + 0x79, 0x5c, 0xc2, 0xfa, 0x63, 0xab, 0x35, 0x7d, + 0x45, 0x4e, 0x36, 0xd3, 0x63, 0x5d, 0xc9, 0xd0, + 0xc6, 0x7b, 0xa3, 0xfc, 0xc7, 0x2b, 0x51, 0x1d, + 0x39, 0x67, 0xb8, 0x89, 0xcc, 0x9f, 0xd3, 0x78, + 0xb8, 0xed, 0xf1, 0x16, 0xb0, 0x06, 0xff, 0x00, + 0x16, 0x60, 0xd9, 0x24, 0xea, 0xf7, 0x7d, 0xd3, + 0xbd, 0xea, 0x2b, 0x75, 0xbc, 0x0c, 0xb7, 0x88, + 0x46, 0xdf, 0x77, 0x9d, 0x47, 0x62, 0x98, 0xd7, + 0xdc, 0x39, 0xe2, 0xbd, 0xc8, 0xdd, 0xc9, 0xd4, + 0x52, 0xca, 0xb3, 0x39, 0x53, 0x93, 0x20, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x83, 0x78, 0x44, 0x1b, + 0xc2, 0x0a, 0x06, 0x8d, 0xfe, 0xf8, 0xbe, 0xe6, + 0xb8, 0xfb, 0x40, 0xba, 0x42, 0xe6, 0xfa, 0x37, + 0xfb, 0xe2, 0xfb, 0x9a, 0xe3, 0xed, 0x02, 0xe9, + 0x0b, 0x1c, 0x3e, 0xc7, 0x9d, 0x2f, 0x4f, 0xe3, + 0x3c, 0xcd, 0x3e, 0xaa, 0xde, 0xa4, 0x5e, 0x6f, + 0xea, 0x63, 0xf0, 0xfe, 0x02, 0xb3, 0x5a, 0x7a, + 0x34, 0x5e, 0x08, 0xed, 0x2c, 0x39, 0xbf, 0xa9, + 0x8f, 0xc3, 0xf8, 0x0a, 0xcd, 0x69, 0xe8, 0xd1, + 0x78, 0x23, 0xb4, 0xb8, 0xac, 0xff, 0x00, 0x67, + 0x88, 0xf5, 0x54, 0x38, 0xea, 0xe5, 0xed, 0xef, + 0xcb, 0x2a, 0x22, 0x2f, 0x4d, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x82, 0xbf, 0x91, 0xb7, 0x8e, 0x76, + 0xcf, 0x03, 0x87, 0x0f, 0x49, 0xc4, 0x09, 0xea, + 0x07, 0x02, 0xa4, 0xb0, 0xb7, 0x32, 0x5c, 0x63, + 0xa1, 0x13, 0xfa, 0x4c, 0x43, 0xa2, 0x98, 0x56, + 0xbd, 0xd3, 0x36, 0x71, 0x7c, 0xa1, 0xdd, 0x2f, + 0x9c, 0x95, 0xb9, 0xe8, 0xdd, 0x3b, 0x48, 0x04, + 0x77, 0xdb, 0x37, 0x85, 0xa5, 0x8e, 0xb9, 0x8e, + 0xd6, 0xea, 0x36, 0xca, 0x43, 0x05, 0xd3, 0x84, + 0x43, 0xa8, 0x5e, 0x2b, 0xc3, 0xd9, 0xdc, 0x82, + 0x75, 0x7a, 0xd5, 0xe2, 0x04, 0x14, 0x6f, 0x6b, + 0xf6, 0x1d, 0x3e, 0x9e, 0x82, 0xf0, 0x0e, 0xea, + 0xd2, 0x71, 0x53, 0xfa, 0xb2, 0x0e, 0x13, 0xef, + 0xd1, 0x71, 0xc2, 0xbf, 0x42, 0x6b, 0x2b, 0x0f, + 0xc4, 0x34, 0xc6, 0x46, 0xda, 0x95, 0x77, 0x42, + 0xe7, 0xb3, 0xc2, 0x67, 0x76, 0x3b, 0x4b, 0xf3, + 0xda, 0x0c, 0xa6, 0xee, 0xe8, 0xb2, 0x26, 0x3a, + 0x67, 0x96, 0xdb, 0x9a, 0xc2, 0x0b, 0x8d, 0x18, + 0x6b, 0x5e, 0xe7, 0xa8, 0xba, 0x0d, 0xbf, 0xb4, + 0xfb, 0x5b, 0xcd, 0x35, 0x73, 0x8a, 0xcc, 0x45, + 0x28, 0xbc, 0x92, 0x07, 0x42, 0x2e, 0x61, 0x00, + 0xf1, 0xd4, 0x50, 0x17, 0x75, 0x3a, 0xeb, 0x9c, + 0xa0, 0xde, 0x83, 0x3c, 0x5d, 0xc3, 0x39, 0xd4, + 0xbe, 0x27, 0x39, 0x15, 0x85, 0x85, 0xfd, 0x9c, + 0xb1, 0xba, 0x51, 0x78, 0xd8, 0xcb, 0x38, 0x48, + 0x1c, 0x12, 0x46, 0xee, 0x26, 0xb9, 0x42, 0x71, + 0xd1, 0x7d, 0xb2, 0x1b, 0x89, 0x7e, 0xae, 0x37, + 0x3b, 0x98, 0x14, 0x42, 0x5e, 0x4d, 0x4d, 0x90, + 0x6c, 0xb7, 0x46, 0xd5, 0xdd, 0x05, 0xbd, 0xe3, + 0x83, 0xe4, 0xb7, 0x27, 0x8d, 0x9c, 0x62, 0x87, + 0x88, 0x71, 0x6e, 0x35, 0x0b, 0x52, 0xef, 0x35, + 0x91, 0xbb, 0x11, 0x89, 0x66, 0xa3, 0x62, 0x3c, + 0x51, 0xb5, 0x80, 0x31, 0xa1, 0xc7, 0x7b, 0x80, + 0x65, 0x36, 0xa4, 0x38, 0x1c, 0xa4, 0xd4, 0xa4, + 0x5c, 0x03, 0xaa, 0xe5, 0x23, 0x6f, 0xa3, 0xae, + 0x9f, 0x4e, 0x95, 0xf4, 0xeb, 0x34, 0x22, 0x72, + 0x20, 0x5f, 0x2b, 0x9e, 0xe2, 0xe7, 0xb8, 0xb9, + 0xc4, 0xd4, 0xb8, 0x9a, 0x92, 0x57, 0xcf, 0x11, + 0xae, 0xcd, 0xbc, 0xca, 0xe9, 0x6d, 0xa2, 0x6d, + 0xc5, 0x0b, 0xc3, 0x9f, 0xe1, 0x15, 0x2f, 0x6d, + 0xa5, 0xed, 0x22, 0x23, 0x86, 0x26, 0x8f, 0x71, + 0x0c, 0x8e, 0x75, 0x15, 0x95, 0xec, 0xdb, 0x23, + 0x85, 0xce, 0xf7, 0x28, 0xb7, 0xa0, 0xd3, 0x39, + 0x39, 0xbb, 0xe6, 0x88, 0xc1, 0xea, 0xed, 0x5d, + 0x26, 0x1c, 0x34, 0x4d, 0xd9, 0xc2, 0xb7, 0x61, + 0xc5, 0x54, 0xd1, 0x8c, 0xa9, 0xdf, 0xb9, 0x0c, + 0x8e, 0x7b, 0x6d, 0xa2, 0x5c, 0xea, 0x19, 0xa4, + 0x71, 0xea, 0x86, 0x8a, 0x29, 0x7b, 0x4d, 0x1d, + 0x61, 0x15, 0x0b, 0xa2, 0xe3, 0x23, 0x95, 0xdb, + 0x55, 0xd9, 0xb8, 0xb2, 0xd0, 0xde, 0x2e, 0x16, + 0xd4, 0x54, 0x54, 0xed, 0xa2, 0xcc, 0xdc, 0x6d, + 0x1a, 0xf7, 0x1f, 0x88, 0x69, 0xce, 0x82, 0xb7, + 0x6d, 0x85, 0x82, 0x10, 0x04, 0x71, 0xb5, 0xbc, + 0xc0, 0x2d, 0xa9, 0x2d, 0xe2, 0xb6, 0x82, 0x49, + 0xe5, 0xd9, 0x1c, 0x2d, 0x2f, 0x71, 0xeb, 0x34, + 0x55, 0x58, 0xd9, 0x63, 0x1b, 0x64, 0x6f, 0x03, + 0x6a, 0x1c, 0xda, 0x8e, 0x2e, 0xaf, 0x55, 0x55, + 0x3d, 0xa2, 0x64, 0x19, 0x04, 0x10, 0xe2, 0x6d, + 0xc7, 0xf1, 0xee, 0x00, 0x7c, 0xfc, 0x23, 0xe2, + 0x03, 0xdc, 0x8a, 0x7e, 0xb3, 0xbb, 0x4a, 0x69, + 0x8c, 0xb3, 0x10, 0x4a, 0x37, 0x45, 0xdb, 0x36, + 0xf7, 0x21, 0x77, 0x94, 0xb9, 0x1b, 0x1a, 0x40, + 0x6f, 0x3c, 0x86, 0xae, 0xa7, 0x33, 0x45, 0x17, + 0x41, 0xc5, 0xd9, 0xb5, 0x8d, 0xe9, 0xdc, 0x3b, + 0xb7, 0x56, 0x83, 0xa8, 0xab, 0xd8, 0x0c, 0x63, + 0x71, 0xd8, 0xfb, 0x7b, 0x43, 0x5e, 0x98, 0xd1, + 0xf3, 0x53, 0xfd, 0xc7, 0x77, 0xc3, 0xdc, 0x1b, + 0x15, 0xc5, 0xad, 0x0d, 0x68, 0x68, 0xdc, 0x05, + 0x12, 0xa9, 0xcb, 0x28, 0x88, 0xe8, 0x7a, 0x88, + 0x8a, 0x12, 0x22, 0x22, 0x02, 0x22, 0x20, 0x8c, + 0xcb, 0x7d, 0x74, 0x3c, 0xc7, 0xb6, 0xa6, 0xdb, + 0xde, 0x8e, 0x65, 0x09, 0x96, 0xfa, 0xe8, 0x79, + 0x8f, 0x6d, 0x4d, 0xb7, 0xbd, 0x1c, 0xcb, 0xce, + 0xc1, 0xf3, 0xd8, 0xed, 0x36, 0xbf, 0x4c, 0xba, + 0x2e, 0xf0, 0x6c, 0xe8, 0xab, 0x5b, 0x0d, 0xe7, + 0xa2, 0xcd, 0xe4, 0xdf, 0xe2, 0x95, 0x52, 0xd0, + 0x9b, 0xaf, 0x3f, 0x95, 0xf3, 0xd5, 0xb6, 0xf3, + 0xd1, 0x66, 0xf2, 0x6f, 0xf1, 0x4a, 0xa9, 0x68, + 0x4d, 0xd7, 0x9f, 0xca, 0xf9, 0xeb, 0xd5, 0xa7, + 0x62, 0xae, 0xf3, 0x86, 0xbe, 0x35, 0xaf, 0x39, + 0x6b, 0x44, 0x45, 0x9b, 0x61, 0x11, 0x10, 0x11, + 0x11, 0x04, 0x6e, 0x51, 0xad, 0xe9, 0x1a, 0xe7, + 0x0a, 0xd5, 0xa5, 0xb5, 0xeb, 0xa8, 0xec, 0x01, + 0x7d, 0x96, 0x56, 0xf2, 0xd5, 0xc6, 0xb6, 0xf7, + 0x94, 0xb8, 0x85, 0xd5, 0xdd, 0x28, 0x01, 0xb2, + 0xb2, 0x9d, 0x71, 0x43, 0xee, 0x29, 0xdb, 0x9b, + 0x71, 0x3b, 0x38, 0x77, 0x11, 0xb8, 0xef, 0x50, + 0x12, 0xf1, 0xb1, 0xee, 0x94, 0x50, 0xc9, 0x6e, + 0x78, 0xda, 0xee, 0xbb, 0x77, 0x8f, 0x77, 0x72, + 0x0b, 0x2a, 0x2c, 0x36, 0x97, 0x50, 0xde, 0x5a, + 0xc5, 0x75, 0x6e, 0xee, 0x38, 0x66, 0x60, 0x7b, + 0x1c, 0x3a, 0x85, 0x66, 0x41, 0x90, 0x11, 0xee, + 0x15, 0xf9, 0xdf, 0x57, 0xd8, 0xf9, 0x86, 0xa4, + 0xbf, 0xb6, 0xa5, 0x03, 0x66, 0x73, 0x9b, 0xc9, + 0xb1, 0xdd, 0xd0, 0x5f, 0xa1, 0x86, 0xe5, 0x49, + 0xd7, 0x7a, 0x06, 0xdb, 0x37, 0x27, 0xe2, 0x50, + 0x4e, 0x2d, 0xaf, 0x29, 0xc2, 0xf0, 0xe1, 0x56, + 0xc8, 0x06, 0xef, 0x75, 0x07, 0x17, 0x45, 0x7b, + 0xb4, 0xf6, 0x5f, 0x31, 0xa1, 0xbb, 0xba, 0x00, + 0x7e, 0x8c, 0x6d, 0xdb, 0xd9, 0x2a, 0x62, 0xd3, + 0xd9, 0xbe, 0x1a, 0x2a, 0x74, 0x81, 0xf3, 0x11, + 0xbf, 0x8d, 0xdf, 0x00, 0xa2, 0x0e, 0x5e, 0xd3, + 0xb9, 0xa3, 0x6f, 0x58, 0x2d, 0x98, 0x31, 0xb9, + 0x2b, 0x9a, 0x74, 0x16, 0xd2, 0x3e, 0xbc, 0xa1, + 0xbf, 0xea, 0xbb, 0x05, 0xae, 0x96, 0xc5, 0x5b, + 0xd3, 0xa2, 0xb6, 0x8d, 0xb4, 0xe5, 0xe1, 0x15, + 0x52, 0x51, 0x63, 0x60, 0x67, 0x7a, 0xd0, 0x39, + 0x90, 0x72, 0x2b, 0x6d, 0x15, 0x9d, 0xb8, 0xa7, + 0x14, 0x6d, 0x84, 0x1e, 0x57, 0x1d, 0xbd, 0x80, + 0xa6, 0x2d, 0x3d, 0x9a, 0x4c, 0xea, 0x1b, 0x9b, + 0x83, 0xd7, 0x0c, 0x14, 0xed, 0xae, 0xa3, 0x1d, + 0x8c, 0x7c, 0x2d, 0x23, 0x67, 0x10, 0x3e, 0xe1, + 0x0b, 0x33, 0x60, 0x89, 0xb4, 0xa6, 0xd3, 0xca, + 0x50, 0x50, 0xec, 0xfd, 0x9d, 0x62, 0xa2, 0xa1, + 0x7b, 0x0c, 0xa7, 0x94, 0xbc, 0xd5, 0x4e, 0xda, + 0x69, 0x5b, 0x0b, 0x71, 0x48, 0xad, 0xda, 0xda, + 0x0a, 0xd7, 0x84, 0x05, 0x62, 0xe8, 0xc5, 0x1d, + 0xdc, 0xec, 0x7d, 0x36, 0x0d, 0xcb, 0x27, 0x03, + 0x88, 0xe1, 0xd8, 0x28, 0x29, 0xd5, 0x41, 0x17, + 0x1e, 0x2a, 0x26, 0x1a, 0x50, 0x02, 0xdd, 0xe3, + 0xac, 0x56, 0xd3, 0x2c, 0xa2, 0x61, 0xa1, 0xd8, + 0x68, 0x76, 0x76, 0x96, 0x7e, 0x02, 0x4d, 0x4f, + 0x65, 0x7d, 0x06, 0x20, 0xc4, 0x23, 0x8c, 0x01, + 0x40, 0x37, 0x0a, 0xf3, 0xaf, 0xae, 0x16, 0xd0, + 0xb4, 0x37, 0xb9, 0xad, 0x7d, 0xd5, 0x90, 0x31, + 0x7d, 0x06, 0xa0, 0xc5, 0x42, 0x4d, 0x77, 0x1d, + 0xc5, 0x3a, 0x3e, 0xae, 0xf5, 0x98, 0x34, 0x2d, + 0x7c, 0x95, 0xf4, 0x18, 0xdb, 0x09, 0xef, 0xee, + 0x0f, 0xf0, 0xad, 0xd8, 0x5e, 0x47, 0x54, 0xfc, + 0x56, 0x8e, 0xb9, 0x3b, 0x10, 0x52, 0x35, 0x8d, + 0xc3, 0x32, 0x7a, 0x97, 0x1d, 0x82, 0x06, 0xb0, + 0xc0, 0xe1, 0x25, 0xcf, 0x53, 0x89, 0xfb, 0x68, + 0x79, 0x98, 0x3d, 0xf5, 0x66, 0xb0, 0xb1, 0x8a, + 0x59, 0x45, 0x05, 0x23, 0x89, 0xa0, 0x6e, 0xd9, + 0x5e, 0x55, 0x4c, 0xd2, 0x96, 0xf3, 0x5f, 0x5f, + 0xdd, 0xe7, 0x6f, 0x6b, 0xd2, 0x4a, 0xe7, 0x06, + 0x9f, 0xd6, 0x79, 0xee, 0xbf, 0x64, 0x6c, 0x5d, + 0x17, 0x17, 0x18, 0x6d, 0xa3, 0x4e, 0xda, 0xbf, + 0x69, 0xaa, 0xb5, 0x7d, 0x19, 0x23, 0xa9, 0x11, + 0xdd, 0x96, 0xc8, 0x14, 0x14, 0x1b, 0x91, 0x11, + 0x55, 0x22, 0x22, 0x20, 0x22, 0x22, 0x08, 0xed, + 0x47, 0xea, 0x3b, 0xcf, 0x27, 0xf3, 0x9a, 0xb5, + 0xf4, 0x37, 0xa9, 0x9d, 0xe5, 0xdf, 0xda, 0x6a, + 0xd8, 0xd4, 0x7e, 0xa3, 0xbc, 0xf2, 0x7f, 0x39, + 0xab, 0x5f, 0x43, 0x7a, 0x99, 0xde, 0x5d, 0xfd, + 0xa6, 0xab, 0xc7, 0x0e, 0x74, 0xb1, 0x9e, 0x62, + 0x9d, 0xc9, 0xd6, 0xb1, 0x22, 0x22, 0xa3, 0x61, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x6a, 0xe4, 0x3d, + 0x0a, 0xe7, 0xc9, 0x3f, 0xc5, 0x2b, 0x69, 0x6a, + 0xe4, 0x3d, 0x0a, 0xe7, 0xc9, 0x3f, 0xc5, 0x2a, + 0x69, 0xcf, 0x0a, 0xdc, 0xd8, 0xab, 0x44, 0xea, + 0x41, 0x69, 0x3f, 0x47, 0xb8, 0xf0, 0xdb, 0xe2, + 0xa9, 0xe5, 0x03, 0xa4, 0xfd, 0x1e, 0xe3, 0xc3, + 0x6f, 0x8a, 0xa7, 0x96, 0x98, 0x8e, 0x2d, 0x5a, + 0x7e, 0xe6, 0x18, 0x1e, 0x5a, 0xde, 0x89, 0xd6, + 0x22, 0x22, 0xc9, 0xd2, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x81, 0xc9, 0xda, 0x01, 0x74, 0xe0, 0x41, + 0x11, 0x4b, 0xdf, 0x0f, 0x8a, 0x49, 0x50, 0xba, + 0x59, 0xf7, 0x38, 0x1c, 0xa4, 0xb6, 0x37, 0x3d, + 0xce, 0x33, 0x20, 0xfa, 0xdb, 0x3c, 0x9e, 0xf2, + 0x6d, 0xc1, 0xb4, 0xe4, 0x0e, 0xdd, 0xd8, 0x57, + 0x59, 0xa2, 0x64, 0xb1, 0x96, 0x3c, 0x54, 0x1e, + 0xda, 0xac, 0xe4, 0x2c, 0x5b, 0x74, 0xe9, 0x2d, + 0x5f, 0xb4, 0x7f, 0xb9, 0xd4, 0x77, 0x54, 0x73, + 0x29, 0x89, 0xf1, 0x8b, 0x50, 0xde, 0xab, 0x9e, + 0xd1, 0x6c, 0x3c, 0xfb, 0x48, 0xdf, 0x34, 0x0a, + 0xbe, 0x00, 0x27, 0x6f, 0x3c, 0x66, 0xa7, 0xde, + 0x5f, 0x7a, 0x53, 0x50, 0x7e, 0x25, 0x14, 0xb6, + 0x17, 0x4e, 0xa6, 0x4a, 0xc0, 0x98, 0xe6, 0x07, + 0x7b, 0xd8, 0x0f, 0x0b, 0x65, 0x1c, 0xfc, 0xaa, + 0x72, 0xee, 0xda, 0x3b, 0xbb, 0x59, 0xad, 0x65, + 0xfa, 0xb9, 0xe3, 0x74, 0x6f, 0xe6, 0x70, 0xe1, + 0xf8, 0x54, 0x4c, 0x64, 0xce, 0x43, 0xf3, 0x32, + 0x2b, 0x16, 0x7b, 0x43, 0xe6, 0xf0, 0xf7, 0x8e, + 0x80, 0xc3, 0xd3, 0xc2, 0x49, 0xe8, 0x66, 0x61, + 0x07, 0x89, 0xbd, 0x71, 0xc8, 0x56, 0xac, 0x3a, + 0x57, 0x2d, 0x2d, 0x38, 0x98, 0x23, 0x1f, 0xac, + 0x76, 0xa0, 0x87, 0x1b, 0xf6, 0xee, 0x59, 0x38, + 0xd5, 0x96, 0xdf, 0x44, 0x4a, 0x68, 0x66, 0x97, + 0xdc, 0x68, 0xff, 0x00, 0x55, 0x2b, 0x6b, 0xa2, + 0x6c, 0xdb, 0xb5, 0xcc, 0x2f, 0xeb, 0xb9, 0x05, + 0x16, 0xae, 0x71, 0xee, 0x41, 0x3c, 0xcb, 0x3c, + 0x38, 0xfb, 0xf9, 0xbe, 0xae, 0x17, 0x1a, 0xf2, + 0xd2, 0x8b, 0xa4, 0x5b, 0x69, 0xab, 0x58, 0xa8, + 0x19, 0x1b, 0x47, 0x30, 0x0a, 0x42, 0x2c, 0x44, + 0x4d, 0xdc, 0xd4, 0x1c, 0xda, 0x0d, 0x2f, 0x92, + 0x98, 0x8e, 0x2a, 0x30, 0x76, 0x4a, 0x92, 0xb6, + 0xd1, 0x25, 0xc4, 0x74, 0xaf, 0x73, 0xba, 0xc3, + 0x62, 0xe8, 0x90, 0x62, 0x4b, 0xbb, 0xd6, 0x7b, + 0xbb, 0x96, 0xcb, 0x71, 0x85, 0xac, 0x2f, 0x20, + 0x0e, 0x13, 0x47, 0x0e, 0x50, 0x50, 0x52, 0x6d, + 0x74, 0x6d, 0x9c, 0x74, 0x3d, 0x10, 0x71, 0x1c, + 0xa7, 0x6a, 0x96, 0xb7, 0xc0, 0x41, 0x18, 0x1c, + 0x2c, 0x02, 0x9d, 0x40, 0xad, 0x6d, 0xc5, 0x31, + 0xb5, 0x26, 0xa4, 0x00, 0x08, 0xa7, 0x29, 0x2b, + 0x30, 0xb4, 0x85, 0xaf, 0x2d, 0x0c, 0xef, 0x28, + 0x41, 0xdf, 0x54, 0x15, 0xc8, 0xb1, 0x51, 0x8d, + 0xcc, 0xaa, 0xdd, 0x8b, 0x12, 0xf1, 0x43, 0xc1, + 0xc3, 0x5d, 0xd5, 0xd8, 0xa7, 0x99, 0x04, 0x51, + 0x9e, 0x1a, 0x01, 0x56, 0x9a, 0x91, 0xd7, 0x43, + 0x13, 0x5c, 0x1b, 0x5a, 0x71, 0x01, 0x4a, 0xf2, + 0xec, 0x41, 0x10, 0xcc, 0x71, 0x0d, 0x73, 0xe9, + 0xb1, 0x87, 0x84, 0xad, 0x91, 0x8f, 0x8d, 0xb2, + 0xf0, 0xd3, 0x8c, 0x16, 0xd5, 0xbc, 0x9d, 0x95, + 0x20, 0x40, 0x3b, 0x29, 0xdc, 0xd3, 0x68, 0xeb, + 0xf5, 0x54, 0x56, 0xa2, 0xcd, 0x7e, 0x15, 0x6a, + 0xd6, 0x41, 0x47, 0x5f, 0xdc, 0x7f, 0x0e, 0xd2, + 0x3d, 0xfb, 0x77, 0x17, 0xbb, 0xf5, 0x5a, 0x82, + 0x07, 0x39, 0x71, 0x6b, 0x7b, 0x9f, 0xb7, 0xc0, + 0x42, 0x6b, 0x14, 0x7f, 0xc5, 0xbc, 0x2d, 0x3b, + 0x38, 0xda, 0x38, 0x83, 0x3d, 0xce, 0x5e, 0xba, + 0x9b, 0xc7, 0x59, 0xc0, 0xeb, 0x86, 0xc1, 0x03, + 0x69, 0x0b, 0x7b, 0xb7, 0x54, 0x53, 0xde, 0x50, + 0x1a, 0x6b, 0x03, 0x35, 0x90, 0x92, 0xf6, 0xf9, + 0xdc, 0x57, 0xd7, 0x0f, 0x3b, 0x4e, 0xd3, 0xb4, + 0xd4, 0x9a, 0xf5, 0x4a, 0xb8, 0xe3, 0x6d, 0x9f, + 0x15, 0x5f, 0x20, 0xa3, 0x9d, 0x4a, 0xab, 0x55, + 0x31, 0x9a, 0x33, 0x22, 0x3a, 0xdb, 0xf4, 0x01, + 0xb4, 0x02, 0x80, 0x6e, 0x0b, 0xc5, 0xf4, 0xbe, + 0x55, 0x52, 0x22, 0x22, 0x02, 0x22, 0x20, 0x28, + 0xfd, 0x41, 0xea, 0x99, 0xfe, 0x4f, 0x8c, 0x14, + 0x82, 0x8f, 0xd4, 0x1e, 0xa9, 0x9f, 0xe4, 0xf8, + 0xc1, 0x5e, 0xde, 0xdd, 0x3a, 0x61, 0x96, 0x27, + 0x81, 0x77, 0x72, 0xbd, 0x4f, 0x74, 0xaf, 0xaa, + 0x1b, 0xe1, 0xbf, 0xb6, 0xa5, 0x9f, 0xb9, 0x44, + 0xe9, 0x5f, 0x54, 0x37, 0xc3, 0x7f, 0x6d, 0x4b, + 0x3f, 0x72, 0x9b, 0xbc, 0x5a, 0xf7, 0xa5, 0x18, + 0x6e, 0x05, 0xbd, 0xd8, 0x73, 0x9b, 0xaf, 0xf2, + 0x78, 0xf2, 0xac, 0xfb, 0x10, 0xaf, 0xea, 0x81, + 0x75, 0xfe, 0x4f, 0x1e, 0x55, 0x9f, 0x62, 0x15, + 0xfd, 0x72, 0xd9, 0xcf, 0x5e, 0xfc, 0xbd, 0x8f, + 0x8a, 0x66, 0xc1, 0xff, 0x00, 0x1a, 0xd8, 0x88, + 0x8b, 0x67, 0x9a, 0x22, 0x22, 0x02, 0x22, 0x20, + 0xd0, 0xcc, 0x5b, 0x99, 0x60, 0x6b, 0xd8, 0x0f, + 0x1b, 0x0e, 0xc2, 0xdd, 0xe2, 0xaa, 0x9f, 0x94, + 0xb2, 0xbf, 0xb7, 0xc8, 0xda, 0x66, 0x71, 0x6d, + 0xe2, 0xb9, 0xb5, 0xdb, 0x2b, 0x49, 0xd8, 0xf6, + 0x6e, 0x73, 0x4f, 0x38, 0x57, 0xf5, 0x0d, 0x96, + 0x81, 0xb1, 0x10, 0xe6, 0x0d, 0x92, 0x1d, 0x8c, + 0x1d, 0x5d, 0xc5, 0x4c, 0x4e, 0x41, 0x25, 0x63, + 0x7d, 0x05, 0xfd, 0xa4, 0x57, 0x76, 0xe6, 0xb1, + 0xcc, 0x2a, 0x3a, 0xa0, 0xee, 0x2d, 0x3d, 0x70, + 0x76, 0x2c, 0xea, 0x97, 0x6b, 0x95, 0x66, 0x9c, + 0xcb, 0xc5, 0x6d, 0x72, 0x78, 0x71, 0xb9, 0x2d, + 0xbc, 0x47, 0x63, 0x61, 0x9b, 0x75, 0x7c, 0x17, + 0x72, 0xab, 0xa2, 0x4c, 0x78, 0xc1, 0x69, 0xdc, + 0x45, 0xfc, 0x52, 0xee, 0xaa, 0xdc, 0x5f, 0x12, + 0x36, 0xb4, 0x2a, 0x06, 0xa3, 0x20, 0xe2, 0x20, + 0x6e, 0xeb, 0xad, 0x96, 0xc2, 0xd6, 0x02, 0x5a, + 0x6a, 0x79, 0x10, 0x34, 0x2f, 0xa6, 0x8a, 0x6c, + 0x41, 0xe3, 0x40, 0x1b, 0xf6, 0xd7, 0xaa, 0xbe, + 0x4b, 0x41, 0x75, 0x77, 0x05, 0xf7, 0xc2, 0xbd, + 0xe1, 0x41, 0xf1, 0x4f, 0x7d, 0x28, 0xb2, 0x51, + 0x00, 0x41, 0xf1, 0xc2, 0xbd, 0xe1, 0x5f, 0x69, + 0x44, 0x1f, 0x3c, 0x2b, 0xda, 0x2f, 0x51, 0x07, + 0x80, 0x2f, 0x51, 0x68, 0xe6, 0x72, 0xf6, 0xb8, + 0x7c, 0x7c, 0x97, 0xd7, 0x47, 0xb9, 0x66, 0xc6, + 0x30, 0x77, 0xcf, 0x79, 0xef, 0x58, 0xde, 0x74, + 0x8e, 0x9e, 0x81, 0x01, 0xed, 0x0b, 0x51, 0x0c, + 0x6e, 0x3b, 0xf0, 0xeb, 0x77, 0x52, 0xf2, 0xf5, + 0xa4, 0x3a, 0x9b, 0xd9, 0x0e, 0xe7, 0x3b, 0x9d, + 0xdb, 0x87, 0xba, 0xb0, 0xe1, 0x6c, 0x20, 0xb0, + 0xc6, 0xc2, 0xd8, 0xda, 0x5b, 0x71, 0x2b, 0x5a, + 0x5c, 0xda, 0x72, 0xbb, 0x70, 0x25, 0x42, 0xe1, + 0x71, 0x97, 0x79, 0xcc, 0xd1, 0xcf, 0x65, 0xc8, + 0x7c, 0x64, 0xf4, 0xac, 0x8f, 0x78, 0x2e, 0x1f, + 0x56, 0xca, 0x7e, 0x83, 0x15, 0xd2, 0xc6, 0xde, + 0x49, 0x64, 0x6c, 0xbb, 0x0b, 0x01, 0xa8, 0x77, + 0x5c, 0x75, 0x95, 0xaa, 0x9c, 0x91, 0x11, 0x1d, + 0xf4, 0x47, 0x4f, 0x4f, 0x81, 0x25, 0x67, 0x6c, + 0x2d, 0xe1, 0x6b, 0x69, 0x47, 0xd2, 0xae, 0xe7, + 0x2b, 0x3a, 0x22, 0xaa, 0x44, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x1b, 0xc2, 0x20, 0xde, 0x10, 0x50, + 0x34, 0x6f, 0xf7, 0xc5, 0xf7, 0x35, 0xc7, 0xda, + 0x05, 0xd2, 0x17, 0x37, 0xd1, 0xbf, 0xdf, 0x17, + 0xdc, 0xd7, 0x1f, 0x68, 0x17, 0x48, 0x58, 0xe1, + 0xf6, 0x3c, 0xe9, 0x7a, 0x7f, 0x19, 0xe6, 0x69, + 0xf5, 0x56, 0xf5, 0x22, 0xf3, 0x7f, 0x53, 0x1f, + 0x87, 0xf0, 0x15, 0x9a, 0xd3, 0xd1, 0xa2, 0xf0, + 0x47, 0x69, 0x61, 0xcd, 0xfd, 0x4c, 0x7e, 0x1f, + 0xc0, 0x56, 0x6b, 0x4f, 0x46, 0x8b, 0xc1, 0x1d, + 0xa5, 0xc5, 0x67, 0xfb, 0x3c, 0x47, 0xaa, 0xa1, + 0xc7, 0x57, 0x2f, 0x6f, 0x7e, 0x59, 0x51, 0x11, + 0x7a, 0x6c, 0x04, 0x44, 0x40, 0x44, 0x44, 0x1f, + 0x32, 0x31, 0xb2, 0x46, 0xe6, 0x38, 0x54, 0x38, + 0x10, 0x42, 0xa9, 0x65, 0x31, 0xf2, 0x4d, 0x6f, + 0x2c, 0x15, 0x73, 0x64, 0x69, 0x0e, 0x84, 0xf2, + 0xb1, 0xcd, 0x35, 0x6b, 0x87, 0x31, 0x56, 0xf5, + 0xad, 0x7f, 0x03, 0x65, 0x88, 0xbf, 0x73, 0x98, + 0x09, 0xe2, 0xe5, 0xa2, 0x0c, 0x38, 0x6b, 0xf9, + 0x6f, 0x2c, 0xd9, 0xe7, 0x4d, 0x11, 0xde, 0xc6, + 0x03, 0x6e, 0x63, 0x04, 0x11, 0xc6, 0x3e, 0x33, + 0x69, 0xc8, 0xed, 0xe1, 0x6f, 0xaa, 0xbb, 0x6e, + 0x9d, 0x8f, 0x2f, 0xc8, 0x86, 0x9e, 0x8e, 0x21, + 0x49, 0x98, 0x37, 0xba, 0x30, 0x77, 0xf3, 0x8d, + 0xe1, 0x59, 0x61, 0x9a, 0x29, 0xe1, 0x64, 0xf0, + 0xbc, 0x49, 0x14, 0xad, 0x0f, 0x8d, 0xed, 0xda, + 0x0b, 0x4e, 0xd0, 0x42, 0x0f, 0xb9, 0x18, 0xd9, + 0x23, 0x73, 0x1e, 0x2a, 0xd7, 0x82, 0xd7, 0x0e, + 0xa8, 0x3b, 0x0a, 0xe2, 0xda, 0xa3, 0xd9, 0xe5, + 0xde, 0x36, 0xfc, 0xf9, 0x8c, 0x8c, 0x9a, 0xda, + 0x62, 0x5d, 0x13, 0x09, 0xa3, 0xda, 0x3a, 0x8e, + 0x0b, 0xb4, 0xaa, 0xde, 0x6e, 0xcc, 0xc9, 0x91, + 0x73, 0xdd, 0xb4, 0x16, 0x8e, 0x1e, 0x64, 0x1c, + 0xa6, 0x0d, 0x17, 0x7e, 0xff, 0x00, 0xae, 0x7b, + 0x58, 0x3a, 0x83, 0x69, 0x52, 0x56, 0xfa, 0x22, + 0x01, 0x4e, 0x95, 0xcf, 0x93, 0xaa, 0x37, 0x05, + 0x7a, 0x65, 0x8f, 0x59, 0x67, 0x65, 0x90, 0xea, + 0x20, 0xaa, 0x5b, 0x69, 0x2b, 0x18, 0xa9, 0x48, + 0x5b, 0x51, 0xca, 0x76, 0xa9, 0x28, 0x70, 0x90, + 0xb3, 0x73, 0x40, 0x0a, 0xc4, 0xdc, 0x7b, 0xda, + 0xc0, 0xf2, 0xda, 0x35, 0xdb, 0xba, 0xab, 0x2b, + 0x6d, 0x02, 0x08, 0x58, 0xb1, 0x4d, 0x02, 0xa1, + 0x9b, 0xb9, 0x68, 0xb7, 0x21, 0xc5, 0x92, 0x2b, + 0x40, 0xd0, 0x79, 0x4e, 0xc5, 0x36, 0xd8, 0x9a, + 0x58, 0xc0, 0xed, 0x80, 0xb4, 0xb5, 0xde, 0xe2, + 0xfa, 0xee, 0x2a, 0x08, 0x6e, 0xd0, 0x28, 0xde, + 0xb0, 0x41, 0x14, 0x31, 0x61, 0xad, 0x79, 0x77, + 0x7d, 0x1d, 0x3b, 0x9e, 0xad, 0x56, 0xd3, 0x31, + 0xd0, 0xb4, 0x71, 0x01, 0xc5, 0x56, 0x02, 0xd0, + 0x4f, 0x2f, 0x2a, 0xdb, 0x0d, 0xef, 0xb6, 0x57, + 0x8b, 0x7d, 0x57, 0xd8, 0x63, 0xe8, 0x06, 0xc0, + 0x39, 0x39, 0x90, 0x6b, 0x79, 0xb3, 0x03, 0xcb, + 0x03, 0x40, 0x6d, 0x01, 0x69, 0x03, 0x6d, 0x47, + 0x5d, 0x67, 0x0d, 0x8d, 0xae, 0x6e, 0xcd, 0x9b, + 0x49, 0x3c, 0xeb, 0xeb, 0x83, 0xab, 0xb5, 0x7a, + 0x18, 0x83, 0x17, 0x0b, 0x78, 0x43, 0x7a, 0x82, + 0x8b, 0xeb, 0xba, 0x34, 0xd9, 0xb2, 0x94, 0xa2, + 0xcb, 0xc0, 0xbd, 0x0d, 0x41, 0xa7, 0x7d, 0x79, + 0x0d, 0x85, 0x94, 0xb7, 0x97, 0x4e, 0xe0, 0x82, + 0xdd, 0xa5, 0xce, 0xa7, 0xbc, 0xd1, 0xd7, 0x27, + 0x62, 0xa2, 0x69, 0xb7, 0x7e, 0x35, 0x91, 0xbd, + 0xcd, 0x5f, 0x83, 0xc6, 0x5e, 0x03, 0x29, 0xb6, + 0x9f, 0xa2, 0xc6, 0xd7, 0xf4, 0x45, 0x16, 0x4d, + 0x59, 0x91, 0xb8, 0xd4, 0x97, 0xff, 0x00, 0x83, + 0xe2, 0x9c, 0x0d, 0xa5, 0xab, 0xab, 0x2c, 0x95, + 0xee, 0x64, 0x94, 0x6c, 0xad, 0x47, 0xc5, 0x67, + 0x22, 0xb0, 0x63, 0xf1, 0x91, 0x58, 0xdb, 0xc3, + 0x61, 0x66, 0x2a, 0x23, 0x6d, 0x5c, 0x48, 0xa3, + 0x9c, 0xe2, 0x7b, 0xa7, 0x93, 0xd7, 0x2a, 0xfb, + 0x34, 0xf6, 0xca, 0x33, 0xcf, 0x62, 0x43, 0x15, + 0x0f, 0x48, 0xe7, 0x5c, 0x16, 0xf7, 0x00, 0xf0, + 0xc7, 0x5d, 0xfb, 0x14, 0xb2, 0xc3, 0x6b, 0x17, + 0x45, 0x03, 0x63, 0xea, 0x2c, 0xca, 0x89, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x04, 0x66, + 0x5b, 0xeb, 0xa1, 0xe6, 0x3d, 0xb5, 0x36, 0xde, + 0xf4, 0x73, 0x28, 0x4c, 0xb7, 0xd7, 0x43, 0xcc, + 0x7b, 0x6a, 0x6d, 0xbd, 0xe8, 0xe6, 0x5e, 0x76, + 0x0f, 0x9e, 0xc7, 0x69, 0xb5, 0xfa, 0x65, 0xd1, + 0x77, 0x83, 0x67, 0x45, 0x5a, 0xd8, 0x6f, 0x3d, + 0x16, 0x6f, 0x26, 0xff, 0x00, 0x14, 0xaa, 0x96, + 0x84, 0xdd, 0x79, 0xfc, 0xaf, 0x9e, 0xad, 0xb7, + 0x9e, 0x8b, 0x37, 0x93, 0x7f, 0x8a, 0x55, 0x4b, + 0x42, 0x6e, 0xbc, 0xfe, 0x57, 0xcf, 0x5e, 0xad, + 0x3b, 0x15, 0x77, 0x9c, 0x35, 0xf1, 0xad, 0x79, + 0xcb, 0x5a, 0x22, 0x2c, 0xdb, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x0a, 0x0b, 0x29, 0x6b, 0xc3, 0x74, + 0x5c, 0x01, 0x11, 0xcb, 0xb5, 0xc3, 0xe2, 0x92, + 0x54, 0xea, 0xf9, 0x92, 0x36, 0x4a, 0xc2, 0xc7, + 0x8a, 0x82, 0x82, 0xb3, 0xa5, 0x64, 0xb8, 0xc7, + 0x4d, 0x36, 0x2e, 0xe0, 0x52, 0xd2, 0x49, 0x0c, + 0x96, 0x0f, 0x27, 0x71, 0x3b, 0x64, 0x88, 0x8e, + 0x7d, 0xa1, 0x5a, 0x15, 0x6e, 0xee, 0xd8, 0x9b, + 0x83, 0x00, 0x24, 0x3d, 0x87, 0x89, 0xb2, 0x0f, + 0x8a, 0xe1, 0xb8, 0xb7, 0x99, 0x49, 0xe1, 0x32, + 0xd1, 0xe4, 0xa0, 0x90, 0x1a, 0x36, 0xea, 0xd5, + 0xe6, 0x2b, 0xa8, 0xfa, 0x8e, 0x1b, 0x9c, 0x3f, + 0x55, 0xc3, 0x68, 0x53, 0x3d, 0x22, 0x4d, 0xbd, + 0x75, 0xab, 0x90, 0x8f, 0xa4, 0x63, 0x4f, 0x50, + 0xad, 0x96, 0xef, 0x5e, 0x48, 0xd0, 0xe6, 0x10, + 0x54, 0x08, 0xc1, 0x0d, 0x02, 0xca, 0xcb, 0x57, + 0x38, 0x02, 0x06, 0xc3, 0xca, 0xb6, 0x3a, 0x30, + 0xb2, 0x35, 0xc4, 0x10, 0x39, 0x10, 0x7c, 0x74, + 0x2c, 0xe1, 0xe8, 0xf8, 0x76, 0x72, 0xbb, 0x95, + 0x7c, 0xbe, 0xdd, 0xac, 0x00, 0x83, 0x55, 0x99, + 0xd4, 0xae, 0xce, 0x54, 0x20, 0x9d, 0xe8, 0x31, + 0xb5, 0x9d, 0xc5, 0x0f, 0x56, 0xab, 0xde, 0x1a, + 0x1d, 0x81, 0x64, 0xe1, 0x5e, 0xf0, 0xa0, 0xc7, + 0x4d, 0xab, 0xda, 0x15, 0xf7, 0x4a, 0x20, 0x08, + 0x3e, 0x43, 0x57, 0xbc, 0x2b, 0xeb, 0x62, 0xf2, + 0xa1, 0x00, 0x35, 0x28, 0x9c, 0x49, 0x52, 0x81, + 0x45, 0x47, 0xd5, 0x99, 0x68, 0xf2, 0x99, 0xeb, + 0x5d, 0x37, 0x13, 0xab, 0x04, 0x4f, 0x12, 0x5e, + 0x10, 0x77, 0xc8, 0x05, 0x5a, 0xcf, 0x90, 0x3d, + 0xf5, 0x3d, 0xa9, 0xf3, 0xdf, 0x84, 0x59, 0x06, + 0x41, 0x47, 0x64, 0x2e, 0xab, 0x1d, 0xa4, 0x7b, + 0xe8, 0x79, 0x64, 0x70, 0xea, 0x37, 0xb6, 0xab, + 0x1a, 0x6b, 0x01, 0x25, 0x90, 0x96, 0xfe, 0xfd, + 0xdc, 0x57, 0xb3, 0xbe, 0x8d, 0x2e, 0xee, 0xb6, + 0x38, 0xd4, 0xba, 0xbd, 0x57, 0x15, 0x68, 0x8c, + 0x91, 0x96, 0x7b, 0xc8, 0x9e, 0xa4, 0xfd, 0x8d, + 0x9c, 0x0e, 0x99, 0x96, 0xd6, 0xed, 0x22, 0x06, + 0xf7, 0x6f, 0xa8, 0xa0, 0xea, 0x6c, 0x56, 0x11, + 0x46, 0xb4, 0x35, 0xa2, 0x80, 0x72, 0x2d, 0x1c, + 0x6d, 0xbb, 0xe2, 0xe2, 0x7b, 0xc5, 0x1c, 0xe0, + 0x01, 0xe6, 0x0b, 0x79, 0x55, 0x22, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x8e, 0xd4, 0x7e, + 0xa3, 0xbc, 0xf2, 0x7f, 0x39, 0xab, 0x5f, 0x43, + 0x7a, 0x99, 0xde, 0x5d, 0xfd, 0xa6, 0xad, 0x8d, + 0x47, 0xea, 0x3b, 0xcf, 0x27, 0xf3, 0x9a, 0xb5, + 0xf4, 0x37, 0xa9, 0x9d, 0xe5, 0xdf, 0xda, 0x6a, + 0xbc, 0x70, 0xe7, 0x4b, 0x19, 0xe6, 0x29, 0xdc, + 0x9d, 0x6b, 0x12, 0x22, 0x2a, 0x36, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x16, 0xae, 0x43, 0xd0, 0xae, + 0x7c, 0x93, 0xfc, 0x52, 0xb6, 0x96, 0xae, 0x43, + 0xd0, 0xae, 0x7c, 0x93, 0xfc, 0x52, 0xa6, 0x9c, + 0xf0, 0xad, 0xcd, 0x8a, 0xb4, 0x4e, 0xa4, 0x16, + 0x93, 0xf4, 0x7b, 0x8f, 0x0d, 0xbe, 0x2a, 0x9e, + 0x50, 0x3a, 0x4f, 0xd1, 0xee, 0x3c, 0x36, 0xf8, + 0xaa, 0x79, 0x69, 0x88, 0xe2, 0xd5, 0xa7, 0xee, + 0x61, 0x81, 0xe5, 0xad, 0xe8, 0x9d, 0x62, 0x22, + 0x2c, 0x9d, 0x22, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x8d, 0xbf, 0xb2, 0x95, 0xc4, 0xc9, 0x15, 0x48, + 0x1b, 0x4b, 0x46, 0xf2, 0xa4, 0x91, 0x07, 0x3c, + 0xcf, 0x59, 0xde, 0xdb, 0x5f, 0x47, 0x9b, 0xc5, + 0x55, 0x97, 0xb6, 0xfd, 0xf8, 0xa1, 0x3d, 0x23, + 0x79, 0x43, 0x80, 0xde, 0x08, 0xde, 0xae, 0x1a, + 0x77, 0x50, 0x5a, 0xe7, 0xac, 0x45, 0xc4, 0x43, + 0xa3, 0x9d, 0x94, 0x6d, 0xc5, 0xb9, 0xef, 0x98, + 0xef, 0xa2, 0x79, 0x0a, 0xc9, 0x7d, 0x8e, 0x6c, + 0x95, 0x96, 0x32, 0x5a, 0xee, 0x50, 0xde, 0xda, + 0xab, 0x65, 0x62, 0xba, 0xb6, 0x71, 0xcb, 0xe2, + 0xbf, 0x87, 0x91, 0xb5, 0x14, 0x91, 0x80, 0x77, + 0x33, 0x30, 0x1e, 0xe9, 0xaf, 0x6f, 0x2d, 0x42, + 0xb4, 0x4e, 0x58, 0xc9, 0x3d, 0xe9, 0x46, 0x6e, + 0x94, 0x86, 0x6a, 0xd5, 0xf3, 0x64, 0xa4, 0x73, + 0xf6, 0x81, 0x40, 0xce, 0x6a, 0x2d, 0x66, 0x58, + 0x0e, 0xa2, 0xd9, 0xc5, 0x6a, 0x0b, 0x0d, 0x44, + 0x03, 0xe3, 0x1d, 0x05, 0xeb, 0x1b, 0x49, 0xed, + 0x5d, 0xdf, 0x02, 0x39, 0x5b, 0xfa, 0x4d, 0x52, + 0x8c, 0xb5, 0x1d, 0x45, 0x59, 0x8c, 0x89, 0x89, + 0xca, 0x89, 0x65, 0x95, 0x39, 0x16, 0xcb, 0x2c, + 0x5c, 0x1a, 0x1c, 0x5b, 0xdc, 0x9d, 0xc5, 0x49, + 0xc7, 0x6a, 0x2a, 0x36, 0x6f, 0x2b, 0x69, 0xed, + 0x64, 0x80, 0x32, 0x94, 0xa1, 0xd8, 0x82, 0x21, + 0xb6, 0x7d, 0x65, 0xbc, 0xdb, 0x66, 0x39, 0xad, + 0x14, 0x0d, 0x0e, 0x6e, 0xde, 0x70, 0x56, 0x6e, + 0x83, 0x87, 0xae, 0x17, 0xd8, 0x65, 0x5a, 0x01, + 0xdc, 0x10, 0x62, 0xe0, 0x88, 0x90, 0x68, 0x36, + 0x0a, 0x34, 0x72, 0x6c, 0xe5, 0x4e, 0x06, 0xf7, + 0x55, 0xab, 0x8b, 0xb7, 0xac, 0xdc, 0x0d, 0xea, + 0x2f, 0xae, 0x1a, 0x6e, 0x08, 0x31, 0x70, 0x9e, + 0x41, 0x4d, 0x94, 0xaf, 0x59, 0x79, 0xc0, 0x6b, + 0x53, 0xbf, 0x72, 0xcd, 0x45, 0xed, 0x02, 0x0c, + 0x42, 0x35, 0xf4, 0x18, 0xbe, 0xc3, 0x54, 0x56, + 0xa0, 0xd4, 0x98, 0xec, 0x05, 0xb7, 0x4b, 0x74, + 0xee, 0x29, 0xdc, 0x3f, 0x81, 0x6c, 0xd2, 0x38, + 0xde, 0x7e, 0x01, 0xd7, 0x28, 0x3e, 0xf3, 0x59, + 0x8b, 0x1c, 0x25, 0x8b, 0xef, 0x2f, 0x1d, 0xb0, + 0x6c, 0x8e, 0x31, 0xdf, 0x48, 0xff, 0x00, 0xd1, + 0x68, 0xed, 0xf5, 0x15, 0x47, 0x04, 0xeb, 0xac, + 0xc5, 0xc4, 0xb9, 0xcb, 0xed, 0x93, 0xc9, 0x56, + 0xc2, 0xdd, 0xe2, 0x38, 0xc1, 0xa0, 0x6b, 0x01, + 0x5a, 0xac, 0xc6, 0x65, 0x75, 0x1d, 0xf4, 0x79, + 0x7c, 0xf9, 0xe8, 0x6d, 0x08, 0xac, 0x36, 0xe3, + 0x67, 0x0c, 0x7b, 0xda, 0x03, 0x79, 0x2b, 0xd7, + 0xda, 0x55, 0xb2, 0xc2, 0xcb, 0xa5, 0x6b, 0x58, + 0xd8, 0xfa, 0x26, 0x47, 0xdc, 0xf2, 0x8e, 0xe4, + 0x7c, 0x55, 0x79, 0xc9, 0x11, 0x92, 0x3a, 0x66, + 0x51, 0x1d, 0x2d, 0xfb, 0x0b, 0x1e, 0x16, 0x89, + 0x26, 0x68, 0x2e, 0xde, 0xde, 0x55, 0xbe, 0x05, + 0x17, 0x8c, 0x01, 0xac, 0x0d, 0x1b, 0x9a, 0x28, + 0x17, 0xaa, 0x89, 0x7a, 0xbc, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x51, 0xfa, 0x83, 0xd5, + 0x33, 0xfc, 0x9f, 0x18, 0x29, 0x05, 0x1f, 0xa8, + 0x3d, 0x53, 0x3f, 0xc9, 0xf1, 0x82, 0xbd, 0xbd, + 0xba, 0x74, 0xc3, 0x2c, 0x4f, 0x02, 0xee, 0xe5, + 0x7a, 0x9e, 0xe9, 0x5f, 0x54, 0x37, 0xc3, 0x7f, + 0x6d, 0x4b, 0x3f, 0x72, 0x89, 0xd2, 0xbe, 0xa8, + 0x6f, 0x86, 0xfe, 0xda, 0x96, 0x7e, 0xe5, 0x37, + 0x78, 0xb5, 0xef, 0x4a, 0x30, 0xdc, 0x0b, 0x7b, + 0xb0, 0xe7, 0x37, 0x5f, 0xe4, 0xf1, 0xe5, 0x59, + 0xf6, 0x21, 0x5f, 0xd5, 0x02, 0xeb, 0xfc, 0x9e, + 0x3c, 0xab, 0x3e, 0xc4, 0x2b, 0xfa, 0xe5, 0xb3, + 0x9e, 0xbd, 0xf9, 0x7b, 0x1f, 0x14, 0xcd, 0x83, + 0xfe, 0x35, 0xb1, 0x11, 0x16, 0xcf, 0x34, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x5a, 0xf7, 0x76, 0xe6, + 0x68, 0xe8, 0xdd, 0x8f, 0xe4, 0x3d, 0x45, 0xb0, + 0x88, 0x2a, 0x39, 0xdc, 0x48, 0xbb, 0xb3, 0x92, + 0xca, 0xe5, 0xa6, 0xa4, 0xd5, 0x8e, 0x3b, 0x43, + 0x4f, 0x23, 0x85, 0x0a, 0xd4, 0xd2, 0x3a, 0x96, + 0x7b, 0x19, 0x9b, 0xa7, 0xf3, 0x64, 0xb4, 0xb0, + 0xf0, 0x59, 0xdd, 0x3e, 0xa0, 0x11, 0xb8, 0x46, + 0xe7, 0x1f, 0xdd, 0x3e, 0xe2, 0xb9, 0xdc, 0xda, + 0xc7, 0x72, 0xce, 0x17, 0x6c, 0x3f, 0x15, 0xdc, + 0xa1, 0x57, 0x72, 0xb8, 0xcb, 0x79, 0xa3, 0x7d, + 0x95, 0xdb, 0x78, 0x99, 0x2f, 0x78, 0xe2, 0x3b, + 0xa6, 0x91, 0xca, 0x15, 0xa2, 0x7a, 0x32, 0x4e, + 0x64, 0x4c, 0x2d, 0x08, 0x55, 0x0f, 0x09, 0xac, + 0x27, 0xc3, 0x5e, 0x1c, 0x2e, 0xa0, 0x24, 0xc0, + 0xc7, 0x70, 0xdb, 0x5f, 0x1a, 0x92, 0x1b, 0xf1, + 0x44, 0x9d, 0x56, 0xd3, 0xe3, 0x72, 0x2b, 0xd3, + 0x1e, 0xc9, 0x18, 0xd9, 0x23, 0x70, 0x7c, 0x6f, + 0x1c, 0x4c, 0x7b, 0x4d, 0x41, 0x07, 0x94, 0x10, + 0xa2, 0x69, 0x98, 0x22, 0x72, 0xbd, 0x01, 0x7b, + 0x44, 0x45, 0x09, 0x28, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x8b, 0x43, 0x33, 0x9c, + 0xc7, 0x61, 0x6d, 0x4d, 0xcd, 0xf4, 0x81, 0x80, + 0xd7, 0xa3, 0x88, 0x6d, 0x91, 0xe4, 0x72, 0x31, + 0xa9, 0x9c, 0x67, 0xbf, 0xbf, 0xb5, 0xc7, 0x5a, + 0x49, 0x79, 0x79, 0x20, 0x8a, 0x08, 0x85, 0x5c, + 0xe3, 0xda, 0x03, 0x94, 0x9e, 0x40, 0xb9, 0xac, + 0x99, 0x0b, 0xdd, 0x63, 0x9b, 0xe9, 0x9e, 0xc7, + 0x33, 0x1d, 0x69, 0xf5, 0x71, 0x7c, 0x56, 0x83, + 0xbb, 0x88, 0xee, 0x2f, 0x7a, 0xf8, 0x9e, 0x7c, + 0xde, 0xb9, 0xc8, 0x71, 0x3b, 0xff, 0x00, 0x8d, + 0x8c, 0xb7, 0x76, 0xc6, 0xef, 0x64, 0x75, 0xf1, + 0xe4, 0x2a, 0xdb, 0x63, 0x61, 0x6d, 0x69, 0x04, + 0x58, 0xfb, 0x28, 0xa9, 0x6e, 0xd1, 0xdd, 0x0d, + 0xe4, 0xc9, 0xf1, 0x9c, 0xf2, 0x39, 0x55, 0xfa, + 0x29, 0x8f, 0xc4, 0x8c, 0xed, 0xdc, 0x7d, 0x89, + 0x71, 0x0c, 0x6f, 0x08, 0x85, 0x94, 0x04, 0x6e, + 0x00, 0x75, 0x00, 0x0a, 0x69, 0x8c, 0x6c, 0x6d, + 0x0d, 0x60, 0xa3, 0x46, 0xe0, 0x16, 0xbd, 0x95, + 0xaf, 0x9b, 0xb3, 0x69, 0xab, 0x9d, 0xb5, 0xc5, + 0x6c, 0xaa, 0x24, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x1b, 0xc2, 0x20, 0xde, 0x10, + 0x50, 0x34, 0x6f, 0xf7, 0xc5, 0xf7, 0x35, 0xc7, + 0xda, 0x05, 0xd2, 0x17, 0x37, 0xd1, 0xbf, 0xdf, + 0x17, 0xdc, 0xd7, 0x1f, 0x68, 0x17, 0x48, 0x58, + 0xe1, 0xf6, 0x3c, 0xe9, 0x7a, 0x7f, 0x19, 0xe6, + 0x69, 0xf5, 0x56, 0xf5, 0x22, 0xf3, 0x7f, 0x53, + 0x1f, 0x87, 0xf0, 0x15, 0x9a, 0xd3, 0xd1, 0xa2, + 0xf0, 0x47, 0x69, 0x61, 0xcd, 0xfd, 0x4c, 0x7e, + 0x1f, 0xc0, 0x56, 0x6b, 0x4f, 0x46, 0x8b, 0xc1, + 0x1d, 0xa5, 0xc5, 0x67, 0xfb, 0x3c, 0x47, 0xaa, + 0xa1, 0xc7, 0x57, 0x2f, 0x6f, 0x7e, 0x59, 0x51, + 0x11, 0x7a, 0x6c, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x05, 0xe3, 0xda, 0x1c, 0xd2, 0xd3, 0xb8, 0xaf, + 0x51, 0x04, 0x2d, 0xe5, 0x9c, 0xd1, 0x38, 0xc8, + 0x41, 0x74, 0x66, 0xa3, 0x67, 0x20, 0xea, 0x15, + 0x09, 0x89, 0xca, 0x3b, 0x4f, 0x5e, 0x1b, 0x4b, + 0x90, 0x7f, 0x07, 0xb9, 0x79, 0x31, 0xbe, 0x87, + 0xff, 0x00, 0x8d, 0x23, 0xb9, 0x0f, 0x51, 0x8e, + 0x3d, 0x85, 0x74, 0x73, 0x43, 0x81, 0x6b, 0x85, + 0x41, 0xde, 0x0a, 0x88, 0xbf, 0xb0, 0x10, 0x56, + 0x56, 0x55, 0xcc, 0xda, 0x4b, 0x08, 0x05, 0xa4, + 0x72, 0x82, 0xa7, 0x29, 0x29, 0x80, 0x41, 0x00, + 0x82, 0x08, 0x3b, 0x41, 0x1b, 0x41, 0x5a, 0x77, + 0xf6, 0xe1, 0xee, 0x6b, 0xe9, 0xc9, 0x45, 0x5f, + 0x66, 0x77, 0xf0, 0x19, 0x23, 0x6c, 0xed, 0x74, + 0x98, 0x89, 0x89, 0xee, 0xdb, 0xdd, 0x3a, 0xd8, + 0x9d, 0xdb, 0x37, 0x98, 0xfb, 0x4a, 0xce, 0xc9, + 0x61, 0xba, 0xb7, 0x64, 0xf0, 0x3d, 0xb2, 0xc5, + 0x20, 0x0e, 0x64, 0x8c, 0x35, 0x69, 0x07, 0x94, + 0x10, 0x93, 0x13, 0x9c, 0x68, 0xb6, 0xdc, 0x75, + 0x16, 0x56, 0x5b, 0x1a, 0x83, 0x4d, 0x8b, 0x63, + 0xa3, 0x0b, 0x28, 0xd8, 0x00, 0x50, 0x3e, 0x1c, + 0x38, 0xfb, 0x82, 0x3b, 0x91, 0xb2, 0xab, 0xe0, + 0xc0, 0x1b, 0xb4, 0x6d, 0x0b, 0x2d, 0x12, 0x95, + 0x41, 0xf0, 0x18, 0x29, 0x45, 0xf5, 0xc3, 0xd4, + 0x0b, 0xea, 0x89, 0x44, 0x1f, 0x34, 0x5e, 0xd1, + 0x7d, 0x51, 0x10, 0x79, 0x45, 0xed, 0x11, 0x10, + 0x28, 0xa8, 0xfa, 0xe7, 0x57, 0x18, 0xb8, 0xb0, + 0x78, 0x97, 0x17, 0xdd, 0x4b, 0xfc, 0x3b, 0x99, + 0x63, 0xda, 0x58, 0x0e, 0xce, 0x89, 0x94, 0xf8, + 0xe7, 0x97, 0xa8, 0x9a, 0xa7, 0x5c, 0x3d, 0xf2, + 0x9c, 0x3e, 0x9d, 0x26, 0x7b, 0xa9, 0x4f, 0x46, + 0xfb, 0x98, 0xf6, 0xd0, 0x9d, 0x9c, 0x31, 0x75, + 0x4f, 0xeb, 0x72, 0x2d, 0x7d, 0x3d, 0xa6, 0x9b, + 0x89, 0x06, 0xf2, 0xee, 0x92, 0xe4, 0x9d, 0xf5, + 0x74, 0x35, 0x0c, 0xaf, 0x7d, 0x43, 0xca, 0xee, + 0xa9, 0x57, 0x88, 0x88, 0xe9, 0xab, 0xbd, 0x08, + 0xec, 0x6f, 0x69, 0xfc, 0x3f, 0x99, 0x5a, 0x47, + 0x0b, 0x00, 0x13, 0x3e, 0x9d, 0x26, 0xea, 0x93, + 0xd4, 0xaf, 0x50, 0x2b, 0x5d, 0xad, 0xab, 0x60, + 0x65, 0x48, 0x1d, 0x21, 0xef, 0x88, 0x5a, 0x56, + 0x16, 0x44, 0xb8, 0x4c, 0xe1, 0xc0, 0x37, 0x86, + 0xed, 0x1b, 0x7a, 0xaa, 0x51, 0x56, 0x67, 0x2c, + 0xe5, 0x48, 0x88, 0x8a, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x46, 0x65, 0xbe, 0xba, + 0x1e, 0x63, 0xdb, 0x53, 0x6d, 0xef, 0x47, 0x32, + 0x84, 0xcb, 0x7d, 0x74, 0x3c, 0xc7, 0xb6, 0xa6, + 0xdb, 0xde, 0x8e, 0x65, 0xe7, 0x60, 0xf9, 0xec, + 0x76, 0x9b, 0x5f, 0xa6, 0x5d, 0x17, 0x78, 0x36, + 0x74, 0x55, 0xad, 0x86, 0xf3, 0xd1, 0x66, 0xf2, + 0x6f, 0xf1, 0x4a, 0xa9, 0x68, 0x4d, 0xd7, 0x9f, + 0xca, 0xf9, 0xea, 0xdb, 0x79, 0xe8, 0xb3, 0x79, + 0x37, 0xf8, 0xa5, 0x54, 0xb4, 0x26, 0xeb, 0xcf, + 0xe5, 0x7c, 0xf5, 0xea, 0xd3, 0xb1, 0x57, 0x79, + 0xc3, 0x5f, 0x1a, 0xd7, 0x9c, 0xb5, 0xa2, 0x22, + 0xcd, 0xb0, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x23, 0xb2, 0x16, 0x32, 0xc9, 0x59, 0x22, + 0xda, 0x37, 0x96, 0x83, 0xb4, 0xaa, 0xc5, 0xf9, + 0xbd, 0xc7, 0xe4, 0x19, 0x98, 0xc7, 0xb0, 0x99, + 0xe3, 0x6f, 0x0d, 0xcc, 0x26, 0xbf, 0xc6, 0x8b, + 0x95, 0xa6, 0x9c, 0xa3, 0x90, 0xf2, 0x2b, 0xc2, + 0xd1, 0xbe, 0xc7, 0xb2, 0x5a, 0xcb, 0x19, 0x2c, + 0x7f, 0x28, 0x68, 0xdf, 0xcc, 0xa6, 0x27, 0x20, + 0xc9, 0x8b, 0xc9, 0xda, 0x65, 0x2c, 0xd9, 0x79, + 0x68, 0xea, 0xc6, 0xfd, 0x85, 0xae, 0xd8, 0xe6, + 0x38, 0x77, 0xcc, 0x78, 0xe4, 0x21, 0x6e, 0xaa, + 0x85, 0xc4, 0xf7, 0x38, 0xf7, 0xbe, 0xfe, 0xc5, + 0xa1, 0xd7, 0x10, 0x8a, 0x4f, 0x6f, 0xb9, 0xb3, + 0xb1, 0xa7, 0xc6, 0x03, 0x71, 0x53, 0xf8, 0x6c, + 0xe6, 0x3f, 0x33, 0x6b, 0xe7, 0x16, 0x6f, 0xee, + 0x9b, 0xb2, 0x68, 0x5d, 0xb2, 0x48, 0xdd, 0xfa, + 0x2f, 0x6a, 0x8c, 0x9d, 0x19, 0x60, 0x6f, 0x70, + 0xa7, 0x0a, 0xf6, 0xab, 0xca, 0xa0, 0x51, 0x7b, + 0xb1, 0x7c, 0xd4, 0xa2, 0x0f, 0x6a, 0x10, 0xb9, + 0x78, 0x88, 0x3d, 0xa9, 0x5e, 0x55, 0x11, 0x01, + 0x11, 0x10, 0x16, 0x86, 0x6b, 0x35, 0x65, 0x84, + 0xb1, 0x7d, 0xed, 0xe3, 0xa8, 0xd1, 0xb2, 0x38, + 0xc7, 0x7d, 0x23, 0xf9, 0x18, 0xd0, 0xb1, 0xe7, + 0xb5, 0x0e, 0x3b, 0x05, 0x69, 0xd3, 0xde, 0x3e, + 0xb2, 0x38, 0x1e, 0x86, 0xdd, 0xbd, 0xfc, 0x87, + 0xac, 0x39, 0x07, 0x54, 0xaa, 0x33, 0x71, 0xd9, + 0x6d, 0x51, 0x7d, 0x1e, 0x5b, 0x36, 0x7a, 0x0b, + 0x13, 0xb6, 0x28, 0x07, 0xc5, 0x8b, 0xa8, 0xd6, + 0xf2, 0x57, 0xaa, 0x77, 0xab, 0x45, 0x3d, 0xd9, + 0xe8, 0x84, 0x4c, 0xb6, 0x70, 0x4e, 0xba, 0xcd, + 0xde, 0x4b, 0x9d, 0xbf, 0xfa, 0xd7, 0x92, 0xd8, + 0x1b, 0xbd, 0xb1, 0xb1, 0xbb, 0x9a, 0xc0, 0x79, + 0xfe, 0x15, 0x73, 0xc7, 0xd8, 0xd1, 0xa2, 0x59, + 0x9a, 0x09, 0xde, 0xce, 0x5f, 0x75, 0x47, 0xe3, + 0xec, 0xba, 0x46, 0xb6, 0x26, 0x47, 0xd1, 0x47, + 0x18, 0xe1, 0x6e, 0xf0, 0x38, 0x47, 0x22, 0x9e, + 0x8d, 0x82, 0x38, 0xda, 0xc1, 0xb9, 0xa2, 0x8a, + 0x2a, 0x9c, 0xb3, 0xd8, 0x44, 0x3e, 0x91, 0x11, + 0x42, 0x44, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x41, 0x1d, 0xa8, 0xfd, 0x47, 0x79, 0xe4, 0xfe, + 0x73, 0x56, 0xbe, 0x86, 0xf5, 0x33, 0xbc, 0xbb, + 0xfb, 0x4d, 0x5b, 0x1a, 0x8f, 0xd4, 0x77, 0x9e, + 0x4f, 0xe7, 0x35, 0x6b, 0xe8, 0x6f, 0x53, 0x3b, + 0xcb, 0xbf, 0xb4, 0xd5, 0x78, 0xe1, 0xce, 0x96, + 0x33, 0xcc, 0x53, 0xb9, 0x3a, 0xd6, 0x24, 0x44, + 0x54, 0x6c, 0x22, 0x22, 0x02, 0x22, 0x20, 0x2d, + 0x5c, 0x87, 0xa1, 0x5c, 0xf9, 0x27, 0xf8, 0xa5, + 0x6d, 0x2d, 0x5c, 0x87, 0xa1, 0x5c, 0xf9, 0x27, + 0xf8, 0xa5, 0x4d, 0x39, 0xe1, 0x5b, 0x9b, 0x15, + 0x68, 0x9d, 0x48, 0x2d, 0x27, 0xe8, 0xf7, 0x1e, + 0x1b, 0x7c, 0x55, 0x3c, 0xa0, 0x74, 0x9f, 0xa3, + 0xdc, 0x78, 0x6d, 0xf1, 0x54, 0xf2, 0xd3, 0x11, + 0xc5, 0xab, 0x4f, 0xdc, 0xc3, 0x03, 0xcb, 0x5b, + 0xd1, 0x3a, 0xc4, 0x44, 0x59, 0x3a, 0x44, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x51, 0x39, + 0x0b, 0x1e, 0x09, 0x8d, 0xcc, 0x20, 0x0e, 0x2e, + 0xf8, 0x52, 0xa3, 0xb0, 0xa5, 0x97, 0x84, 0x03, + 0xbc, 0x55, 0x07, 0x3e, 0xcb, 0x69, 0x76, 0x4b, + 0x27, 0xe2, 0x18, 0xd9, 0x4d, 0xad, 0xdb, 0x0f, + 0x13, 0x5e, 0xd3, 0xc2, 0x38, 0x87, 0x52, 0x9b, + 0x96, 0xc6, 0x2b, 0x5a, 0xdc, 0xd9, 0xb9, 0xb6, + 0x7a, 0x9a, 0x07, 0x44, 0x46, 0xc6, 0xdf, 0x46, + 0xda, 0xb4, 0xf5, 0xe4, 0x0d, 0xed, 0xb7, 0xb0, + 0xad, 0xb7, 0x38, 0xa6, 0x4d, 0x4e, 0x8d, 0xe6, + 0x22, 0xda, 0x91, 0x41, 0xb2, 0xa7, 0xaa, 0xa3, + 0x6f, 0xb1, 0x92, 0x36, 0x27, 0x09, 0x98, 0x1e, + 0xc7, 0x53, 0x8c, 0x80, 0x1c, 0xd3, 0xce, 0x0a, + 0xb7, 0x95, 0xd1, 0x92, 0x7a, 0x51, 0x93, 0xa9, + 0x35, 0x69, 0x75, 0x6b, 0x75, 0x03, 0x67, 0xb4, + 0x95, 0x93, 0xc2, 0xee, 0xf6, 0x48, 0xc8, 0x73, + 0x4f, 0x61, 0x65, 0xa2, 0xe6, 0xae, 0xd3, 0xb9, + 0x3b, 0x2b, 0xc7, 0x5d, 0xe9, 0xeb, 0xc3, 0x68, + 0xd7, 0x1a, 0xb9, 0x9c, 0x45, 0xa0, 0x75, 0x6a, + 0x36, 0x82, 0x14, 0xdd, 0xbe, 0xa1, 0xd5, 0x56, + 0x2d, 0x6b, 0x72, 0x36, 0x31, 0xdf, 0x36, 0x9f, + 0x5b, 0x01, 0xe0, 0x79, 0xa7, 0x5b, 0x6b, 0x4f, + 0x61, 0x3c, 0x9e, 0xa9, 0xca, 0x65, 0xec, 0x5b, + 0xce, 0xd4, 0x01, 0x55, 0x6d, 0xbd, 0xa5, 0x69, + 0xc9, 0x76, 0x5c, 0x09, 0xed, 0x1e, 0x36, 0x11, + 0x24, 0x7c, 0x40, 0x1e, 0x78, 0xcb, 0x94, 0x84, + 0x7a, 0xd7, 0x4b, 0xcb, 0xde, 0xe4, 0x62, 0x15, + 0xe4, 0x70, 0x7b, 0x4f, 0xef, 0x35, 0x47, 0x93, + 0x3d, 0x46, 0x58, 0x4d, 0xd1, 0x36, 0x0d, 0xea, + 0x16, 0x4d, 0x63, 0xa6, 0x23, 0x69, 0x73, 0xb2, + 0x11, 0xd0, 0x75, 0x03, 0xcf, 0x69, 0xa5, 0x47, + 0xdd, 0x7b, 0x49, 0xd3, 0x30, 0x83, 0xd1, 0x3e, + 0x6b, 0x97, 0x0e, 0x48, 0xe3, 0x20, 0x76, 0x64, + 0xe1, 0x4f, 0x26, 0x7a, 0xa4, 0xcb, 0x0b, 0x55, + 0x57, 0xc4, 0xd3, 0xc3, 0x6f, 0x13, 0xa6, 0x9e, + 0x46, 0xc3, 0x13, 0x05, 0x5d, 0x23, 0xc8, 0x6b, + 0x47, 0x39, 0x2a, 0xa4, 0x35, 0x4e, 0xa2, 0xc9, + 0xc2, 0xd7, 0xe2, 0x6c, 0x19, 0x6b, 0x14, 0xdf, + 0x57, 0x35, 0xc1, 0xe3, 0x77, 0x58, 0xf0, 0x8e, + 0x11, 0xdb, 0x50, 0x12, 0x60, 0x35, 0x16, 0x62, + 0x7e, 0x9b, 0x39, 0x78, 0xe7, 0xc6, 0xc3, 0xf5, + 0x6d, 0x70, 0x76, 0xe3, 0xf1, 0x18, 0xde, 0xe4, + 0x29, 0x8a, 0x7a, 0xe7, 0x21, 0x97, 0xa9, 0x39, + 0x95, 0xd7, 0xdd, 0x3c, 0xff, 0x00, 0x87, 0xe9, + 0xb8, 0xfc, 0xee, 0xe5, 0xd5, 0x06, 0xe9, 0xc3, + 0xf8, 0x6d, 0xeb, 0xb5, 0xa7, 0xbe, 0xe7, 0x3b, + 0x16, 0x9d, 0x96, 0x98, 0x85, 0xd7, 0x03, 0x21, + 0x95, 0x95, 0xf9, 0x1c, 0x83, 0xcf, 0x11, 0xe9, + 0x2b, 0xc0, 0x0f, 0x27, 0x61, 0x6f, 0xe3, 0x30, + 0x96, 0x96, 0x6d, 0x63, 0x6c, 0x21, 0xe1, 0xee, + 0x89, 0x92, 0x4d, 0xef, 0x34, 0xf8, 0xae, 0x56, + 0x3b, 0x2b, 0x28, 0xe1, 0x6f, 0x48, 0x45, 0x64, + 0x76, 0xfe, 0xa0, 0x49, 0x98, 0xcd, 0x04, 0x47, + 0x5b, 0x4e, 0xdb, 0x19, 0x3b, 0xc0, 0x33, 0x6c, + 0x6d, 0x78, 0x8b, 0x5d, 0xcb, 0xd4, 0xf7, 0x02, + 0x97, 0x6b, 0x43, 0x40, 0x00, 0x52, 0x9b, 0x36, + 0x2f, 0x51, 0x55, 0x22, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x8f, 0xd4, + 0x1e, 0xa9, 0x9f, 0xe4, 0xf8, 0xc1, 0x48, 0x28, + 0xfd, 0x41, 0xea, 0x99, 0xfe, 0x4f, 0x8c, 0x15, + 0xed, 0xed, 0xd3, 0xa6, 0x19, 0x62, 0x78, 0x17, + 0x77, 0x2b, 0xd4, 0xf7, 0x4a, 0xfa, 0xa1, 0xbe, + 0x1b, 0xfb, 0x6a, 0x59, 0xfb, 0x94, 0x4e, 0x95, + 0xf5, 0x43, 0x7c, 0x37, 0xf6, 0xd4, 0xb3, 0xf7, + 0x29, 0xbb, 0xc5, 0xaf, 0x7a, 0x51, 0x86, 0xe0, + 0x5b, 0xdd, 0x87, 0x39, 0xba, 0xff, 0x00, 0x27, + 0x8f, 0x2a, 0xcf, 0xb1, 0x0a, 0xfe, 0xa8, 0x17, + 0x5f, 0xe4, 0xf1, 0xe5, 0x59, 0xf6, 0x21, 0x5f, + 0xd7, 0x2d, 0x9c, 0xf5, 0xef, 0xcb, 0xd8, 0xf8, + 0xa6, 0x6c, 0x1f, 0xf1, 0xad, 0x88, 0x88, 0xb6, + 0x79, 0xa2, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x2d, 0x5c, 0x85, 0x9b, 0x2e, 0xa1, 0xa1, + 0xd8, 0xf6, 0xed, 0x6b, 0x96, 0xd2, 0x20, 0xa8, + 0xe5, 0x30, 0xd6, 0xb9, 0x38, 0x85, 0xbd, 0xe0, + 0xfe, 0x23, 0x41, 0xe8, 0xde, 0xd0, 0x03, 0x9b, + 0xfe, 0xaa, 0xbd, 0x6b, 0x71, 0xa9, 0x74, 0x8c, + 0xc5, 0xb6, 0xa7, 0xcf, 0xf1, 0xb5, 0xa9, 0x87, + 0x6b, 0x9a, 0x39, 0xa9, 0xb5, 0x87, 0x99, 0x74, + 0x89, 0xed, 0x22, 0x98, 0x1f, 0x8a, 0xe2, 0x29, + 0xc4, 0x37, 0x8a, 0xa8, 0xf9, 0x31, 0x32, 0xc7, + 0xde, 0x3b, 0xa6, 0x68, 0x35, 0x6d, 0x76, 0x3c, + 0x7f, 0xaa, 0xb4, 0x55, 0x92, 0x32, 0x67, 0x84, + 0x4c, 0x30, 0x61, 0x35, 0xae, 0x13, 0x2e, 0x1b, + 0x18, 0x97, 0xcd, 0x6e, 0xce, 0xc7, 0x5b, 0x4e, + 0x43, 0x4d, 0x7f, 0x55, 0xdd, 0xeb, 0x94, 0xf2, + 0xa0, 0x66, 0xb4, 0xc5, 0x9e, 0x44, 0xd4, 0x9f, + 0x37, 0xbc, 0x07, 0xeb, 0x38, 0x76, 0x3b, 0xc2, + 0x68, 0xeb, 0xac, 0x16, 0x36, 0x9a, 0xdf, 0x0e, + 0xd2, 0xdb, 0x3b, 0xc1, 0x71, 0x0c, 0x7f, 0xfa, + 0x2e, 0x3d, 0x23, 0x29, 0xd6, 0x12, 0x6d, 0x1e, + 0xe1, 0x4c, 0x94, 0xce, 0x69, 0xc9, 0xd9, 0x26, + 0x5c, 0x8e, 0x8c, 0x8a, 0x86, 0xef, 0x68, 0xd9, + 0x0c, 0x7c, 0x8d, 0x87, 0x2f, 0x8c, 0x01, 0xc4, + 0x02, 0x1f, 0x13, 0xcb, 0x2a, 0x3a, 0xbc, 0x2f, + 0xe2, 0x1e, 0xfa, 0xdc, 0x87, 0xda, 0x86, 0x01, + 0xe3, 0xf8, 0x90, 0xdc, 0xc4, 0x7a, 0x9c, 0x2d, + 0x70, 0xf7, 0x9e, 0x9e, 0x45, 0x5d, 0x47, 0x95, + 0x0b, 0x82, 0x2a, 0xb1, 0xf6, 0x8f, 0xa7, 0x29, + 0x56, 0x8b, 0x97, 0x73, 0x45, 0xff, 0x00, 0xf5, + 0x2d, 0x3b, 0x8f, 0x6a, 0x98, 0x98, 0xea, 0x20, + 0xb3, 0x9e, 0x47, 0x0d, 0xdc, 0x65, 0x91, 0x8e, + 0xdb, 0x93, 0xc8, 0xab, 0xa8, 0xcb, 0x0b, 0xaa, + 0xf8, 0x9e, 0x78, 0x2d, 0xa2, 0x33, 0x5c, 0x48, + 0xd8, 0x62, 0x6e, 0xd7, 0x49, 0x23, 0x83, 0x5a, + 0x3d, 0xd2, 0xb9, 0xfc, 0x7a, 0xe7, 0x53, 0xe6, + 0x9e, 0xf8, 0xb1, 0x16, 0x91, 0xdb, 0x34, 0x0a, + 0x99, 0x28, 0x65, 0x20, 0x73, 0xbe, 0x8d, 0xf7, + 0x96, 0xa4, 0xda, 0x57, 0x3f, 0x95, 0xb8, 0x6c, + 0xb9, 0x9c, 0x8d, 0x5a, 0x47, 0x10, 0x0f, 0x26, + 0x47, 0x0e, 0xb3, 0x23, 0xd8, 0xd0, 0x9e, 0x46, + 0x4c, 0xf3, 0x90, 0xcb, 0xd4, 0x98, 0xce, 0xfb, + 0x4a, 0xb4, 0x83, 0x8a, 0xdf, 0x08, 0xcf, 0x3b, + 0x9c, 0x9e, 0x11, 0x70, 0xf0, 0x44, 0x40, 0xfe, + 0xa3, 0x7b, 0xe7, 0x95, 0x0d, 0x65, 0xa7, 0x2f, + 0xb3, 0x17, 0x1f, 0x88, 0xea, 0x29, 0xa5, 0x2e, + 0x75, 0x0f, 0x44, 0x7b, 0xf2, 0x37, 0x81, 0xfa, + 0x83, 0xac, 0x14, 0xe6, 0x2b, 0x07, 0x8c, 0xc5, + 0x1f, 0xfe, 0x1c, 0x1c, 0x57, 0x6d, 0x04, 0x0b, + 0x89, 0xbb, 0xa7, 0x93, 0x4d, 0x85, 0x9c, 0x8d, + 0xf7, 0x14, 0xe5, 0x86, 0x3c, 0xbf, 0x84, 0xdc, + 0x54, 0xf0, 0x00, 0x76, 0xef, 0x27, 0x7e, 0xd4, + 0xf2, 0xa2, 0x3a, 0x29, 0xe8, 0xed, 0x46, 0x4c, + 0xb9, 0xda, 0xd6, 0x78, 0xe2, 0x1b, 0x1c, 0x56, + 0x71, 0x08, 0x2d, 0xa2, 0x14, 0x63, 0x1b, 0xb1, + 0xa3, 0xae, 0x7a, 0xea, 0x62, 0xce, 0xd5, 0xb6, + 0xd1, 0xf0, 0x6c, 0x2e, 0x3b, 0x5c, 0x7a, 0xeb, + 0x38, 0x01, 0xa2, 0x80, 0x50, 0x0e, 0x40, 0xbd, + 0x55, 0x58, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x41, 0xbc, 0x22, 0x0d, + 0xe1, 0x05, 0x03, 0x46, 0xff, 0x00, 0x7c, 0x5f, + 0x73, 0x5c, 0x7d, 0xa0, 0x5d, 0x21, 0x73, 0x7d, + 0x1b, 0xfd, 0xf1, 0x7d, 0xcd, 0x71, 0xf6, 0x81, + 0x74, 0x85, 0x8e, 0x1f, 0x63, 0xce, 0x97, 0xa7, + 0xf1, 0x9e, 0x66, 0x9f, 0x55, 0x6f, 0x52, 0x2f, + 0x37, 0xf5, 0x31, 0xf8, 0x7f, 0x01, 0x59, 0xad, + 0x3d, 0x1a, 0x2f, 0x04, 0x76, 0x96, 0x1c, 0xdf, + 0xd4, 0xc7, 0xe1, 0xfc, 0x05, 0x66, 0xb4, 0xf4, + 0x68, 0xbc, 0x11, 0xda, 0x5c, 0x56, 0x7f, 0xb3, + 0xc4, 0x7a, 0xaa, 0x1c, 0x75, 0x72, 0xf6, 0xf7, + 0xe5, 0x95, 0x11, 0x17, 0xa6, 0xc0, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, 0xe3, 0x9a, + 0xd7, 0xb4, 0xb5, 0xc2, 0xad, 0x3b, 0x08, 0x5e, + 0xa2, 0x0a, 0xed, 0xf6, 0x35, 0x8c, 0x12, 0x42, + 0xfa, 0x18, 0x1f, 0x5d, 0xe2, 0xbe, 0xe5, 0x54, + 0x1c, 0x36, 0xd9, 0x9d, 0x39, 0x29, 0x97, 0x0e, + 0xf1, 0x3d, 0xa3, 0xcf, 0x14, 0x98, 0xf9, 0x4f, + 0x72, 0x6b, 0xca, 0xcf, 0xd1, 0x77, 0x32, 0xbd, + 0xc9, 0x14, 0x72, 0x34, 0xb5, 0xe2, 0xa0, 0xad, + 0x09, 0xf1, 0x25, 0xcf, 0x32, 0xc5, 0x26, 0xd3, + 0xbe, 0x37, 0x77, 0xb4, 0xea, 0x29, 0x89, 0xc8, + 0x64, 0x6b, 0xe1, 0xf5, 0x56, 0x2f, 0x26, 0xe1, + 0x01, 0x2e, 0xb3, 0xbd, 0xf8, 0xd6, 0x97, 0x1d, + 0xc3, 0xeb, 0xfa, 0x84, 0xec, 0x7f, 0xb8, 0xa6, + 0xa9, 0x4d, 0xea, 0xab, 0x96, 0xc4, 0x43, 0x3c, + 0x7d, 0x0d, 0xec, 0x7f, 0xc3, 0xa7, 0x72, 0x77, + 0xd0, 0xfe, 0x93, 0x5d, 0xbc, 0x28, 0xcc, 0x67, + 0xe7, 0x2c, 0x63, 0x84, 0x76, 0xf7, 0x71, 0xdd, + 0xda, 0x0d, 0x8c, 0x8a, 0xea, 0xae, 0x34, 0xea, + 0x35, 0xdd, 0xf7, 0xbe, 0xa7, 0x24, 0x4f, 0x77, + 0x22, 0x3a, 0x57, 0xd4, 0x55, 0xa7, 0x6b, 0x19, + 0x6c, 0xa3, 0x73, 0xb2, 0xf8, 0xe9, 0x60, 0x6c, + 0x74, 0x0f, 0x96, 0x02, 0x25, 0x60, 0xaf, 0x2e, + 0xde, 0x12, 0xb3, 0x5b, 0xeb, 0xcd, 0x29, 0x38, + 0x07, 0xcf, 0x84, 0x44, 0xf2, 0x4a, 0xc7, 0xb4, + 0xf8, 0xb4, 0x51, 0xe4, 0xcf, 0x56, 0x53, 0x2a, + 0x7d, 0x14, 0x53, 0x75, 0x5e, 0x9a, 0x70, 0xab, + 0x72, 0x56, 0xe7, 0xe5, 0x2c, 0x13, 0xeb, 0x6d, + 0x2f, 0x07, 0x7f, 0x7e, 0xc7, 0x1e, 0xa3, 0x1a, + 0xf7, 0x1f, 0x79, 0xa9, 0x92, 0x7a, 0xa5, 0x39, + 0x53, 0x88, 0xa9, 0xd7, 0x5e, 0xd3, 0x71, 0x01, + 0xc2, 0x3b, 0x0b, 0x69, 0xee, 0xe5, 0x71, 0xe1, + 0x65, 0x40, 0x8d, 0xa4, 0x9d, 0xdb, 0xea, 0xef, + 0x79, 0x6b, 0x64, 0x72, 0x3a, 0xe7, 0x21, 0x04, + 0x9e, 0x6e, 0x23, 0xc7, 0x46, 0x00, 0x3c, 0x2c, + 0x34, 0x79, 0x07, 0xff, 0x00, 0x71, 0xff, 0x00, + 0x05, 0x14, 0xf9, 0x33, 0xdd, 0xe8, 0x47, 0x94, + 0xb4, 0xe6, 0x35, 0x06, 0x27, 0x0d, 0x17, 0x1d, + 0xfc, 0xe1, 0x8f, 0x22, 0xad, 0x81, 0xbd, 0xd4, + 0xae, 0xe6, 0x60, 0xdb, 0xee, 0xee, 0x54, 0x7b, + 0xcc, 0xf6, 0x73, 0x57, 0xc8, 0xfb, 0x4b, 0x20, + 0x6c, 0x31, 0x40, 0xf0, 0xc8, 0x46, 0xd7, 0x38, + 0x1e, 0x49, 0x1c, 0x3c, 0x50, 0xbe, 0x2c, 0x74, + 0x5b, 0x04, 0x9e, 0x73, 0x98, 0x95, 0xd7, 0x52, + 0x3e, 0xa4, 0xb5, 0x84, 0x91, 0xc5, 0xfa, 0xf2, + 0x1e, 0xe8, 0xab, 0x55, 0x9e, 0x3c, 0x34, 0x88, + 0xe0, 0x89, 0xb1, 0x5b, 0x00, 0xd6, 0xb1, 0x8c, + 0x1d, 0xc8, 0x1b, 0xeb, 0xce, 0x54, 0xf4, 0x53, + 0x9b, 0xa6, 0x7c, 0x47, 0x4c, 0xa3, 0x70, 0xfa, + 0x6e, 0xc7, 0x1a, 0x08, 0xb3, 0x63, 0xa5, 0xb9, + 0x70, 0xa3, 0xae, 0x1f, 0xdf, 0x01, 0xd4, 0x67, + 0x51, 0x59, 0x2c, 0xf1, 0xce, 0x8d, 0xed, 0x96, + 0x6a, 0x12, 0xd1, 0x46, 0x83, 0xc8, 0xb6, 0xed, + 0xed, 0xa3, 0xb7, 0x60, 0x63, 0x06, 0xed, 0xe4, + 0xef, 0x59, 0x55, 0x26, 0x72, 0xf4, 0xca, 0x44, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x41, 0x19, 0x96, 0xfa, 0xe8, + 0x79, 0x8f, 0x6d, 0x4d, 0xb7, 0xbd, 0x1c, 0xca, + 0x13, 0x2d, 0xf5, 0xd0, 0xf3, 0x1e, 0xda, 0x9b, + 0x6f, 0x7a, 0x39, 0x97, 0x9d, 0x83, 0xe7, 0xb1, + 0xda, 0x6d, 0x7e, 0x99, 0x74, 0x5d, 0xe0, 0xd9, + 0xd1, 0x56, 0xb6, 0x1b, 0xcf, 0x45, 0x9b, 0xc9, + 0xbf, 0xc5, 0x2a, 0xa5, 0xa1, 0x37, 0x5e, 0x7f, + 0x2b, 0xe7, 0xab, 0x6d, 0xe7, 0xa2, 0xcd, 0xe4, + 0xdf, 0xe2, 0x95, 0x52, 0xd0, 0x9b, 0xaf, 0x3f, + 0x95, 0xf3, 0xd7, 0xab, 0x4e, 0xc5, 0x5d, 0xe7, + 0x0d, 0x7c, 0x6b, 0x5e, 0x72, 0xd6, 0x88, 0x8b, + 0x36, 0xc2, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x08, 0x9c, 0x95, 0x80, 0x12, + 0xf9, 0xcc, 0x40, 0x54, 0xf7, 0xe2, 0x95, 0x1d, + 0x85, 0x5a, 0xba, 0xc2, 0xcd, 0x0d, 0xcf, 0xe2, + 0x78, 0x8b, 0x8f, 0x34, 0xbc, 0x6d, 0x41, 0x78, + 0xa0, 0x6b, 0xba, 0xad, 0x73, 0x77, 0x11, 0xce, + 0xaf, 0x44, 0x07, 0x0a, 0x1d, 0xa1, 0x69, 0xdc, + 0xe2, 0xe3, 0x98, 0x00, 0xc7, 0x98, 0xa9, 0x53, + 0xb3, 0x94, 0xf5, 0xd4, 0xc4, 0xe4, 0x10, 0xd8, + 0xbd, 0x66, 0xc2, 0xe6, 0xda, 0xe7, 0x61, 0x38, + 0xfb, 0xae, 0xf4, 0x4f, 0x42, 0x6d, 0xde, 0x7a, + 0xcf, 0xf8, 0x84, 0xf5, 0x0a, 0xb2, 0xb4, 0xb5, + 0xcd, 0x0e, 0x69, 0x0e, 0x6b, 0x85, 0x5a, 0xe1, + 0xb4, 0x11, 0xd5, 0x05, 0x40, 0xde, 0x63, 0x65, + 0x6c, 0x4e, 0x6c, 0xac, 0x0f, 0x6b, 0x87, 0x76, + 0x46, 0xd6, 0x90, 0x3a, 0xad, 0x3d, 0x55, 0x5e, + 0x8e, 0xcb, 0x39, 0x8d, 0xba, 0x73, 0xf0, 0x17, + 0x7d, 0x15, 0xb1, 0xda, 0xeb, 0x59, 0x4f, 0x14, + 0x20, 0xf2, 0xf7, 0x2e, 0xdc, 0x39, 0x93, 0xa2, + 0x7b, 0x11, 0xd2, 0xe8, 0x08, 0xab, 0xb0, 0x6a, + 0x2c, 0xac, 0x01, 0xad, 0xc9, 0x63, 0xf8, 0xeb, + 0xff, 0x00, 0xab, 0x68, 0xee, 0x20, 0x69, 0xfa, + 0x8f, 0xa1, 0xf7, 0xd6, 0x48, 0x35, 0xce, 0x97, + 0x98, 0xf0, 0xba, 0xf3, 0xcd, 0xde, 0x36, 0x16, + 0x4e, 0xc7, 0x46, 0x41, 0xf7, 0x45, 0x3d, 0xf4, + 0xf2, 0x67, 0xff, 0x00, 0xc3, 0x2a, 0x79, 0x14, + 0x7c, 0x7a, 0x83, 0x03, 0x28, 0x05, 0x99, 0x1b, + 0x67, 0x57, 0x77, 0xf1, 0x5b, 0xf0, 0x95, 0xec, + 0x99, 0xfc, 0x1c, 0x43, 0x8a, 0x4c, 0x85, 0xbb, + 0x40, 0xe5, 0xe9, 0x1b, 0xf0, 0x14, 0xc9, 0x3d, + 0x52, 0x9c, 0xad, 0xf4, 0x55, 0xfb, 0xad, 0x7b, + 0xa5, 0x6d, 0x81, 0xff, 0x00, 0xe6, 0x74, 0xee, + 0xfd, 0x18, 0x58, 0xe7, 0xd7, 0xdd, 0xa0, 0x1e, + 0xfa, 0xd6, 0x1a, 0xb3, 0x29, 0x91, 0x85, 0xb2, + 0x61, 0xb1, 0xe5, 0xb1, 0xca, 0x68, 0xcb, 0x8b, + 0xa3, 0x41, 0xcf, 0xc0, 0xcf, 0xf5, 0x4f, 0x26, + 0x51, 0x95, 0x68, 0x7b, 0xd9, 0x1b, 0x1d, 0x24, + 0x8e, 0x0c, 0x63, 0x45, 0x5c, 0xf7, 0x10, 0x00, + 0x1d, 0x72, 0x55, 0x4b, 0x2d, 0xaf, 0x22, 0x74, + 0xdf, 0x87, 0x69, 0xe6, 0x79, 0xfd, 0xeb, 0xaa, + 0x3a, 0x6a, 0x7f, 0x05, 0x9d, 0x71, 0xfa, 0x74, + 0xec, 0x28, 0x1b, 0xac, 0x4e, 0xaa, 0xcd, 0xcc, + 0x4e, 0x66, 0xec, 0xf4, 0x0c, 0x27, 0xf8, 0x31, + 0x91, 0xc1, 0xb3, 0xf4, 0x63, 0x6e, 0xce, 0xca, + 0x9b, 0xc5, 0xe0, 0xac, 0xec, 0x83, 0x7c, 0xc6, + 0x2e, 0xeb, 0x8a, 0xaf, 0x90, 0xed, 0x7d, 0x07, + 0x21, 0xea, 0x2b, 0x64, 0xa6, 0x3b, 0xb9, 0x64, + 0xe9, 0x96, 0x8d, 0xa6, 0x9a, 0x64, 0xf7, 0x23, + 0x23, 0x99, 0x99, 0xf9, 0x0b, 0xf9, 0x08, 0x25, + 0xae, 0xef, 0x01, 0xe4, 0x1c, 0xc3, 0xa8, 0xac, + 0xd6, 0xd8, 0xc9, 0xe4, 0x1f, 0xc5, 0xee, 0x63, + 0x24, 0x12, 0xd3, 0xd4, 0x1c, 0x83, 0xac, 0xb7, + 0x2c, 0x6c, 0x59, 0x13, 0x44, 0xaf, 0x15, 0x91, + 0xdb, 0xc7, 0x20, 0x5b, 0xaa, 0xb3, 0x33, 0x39, + 0xd2, 0xf1, 0x8d, 0x0c, 0x68, 0x68, 0xd8, 0x07, + 0x51, 0x7a, 0x88, 0xa0, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x47, 0x6a, + 0x3f, 0x51, 0xde, 0x79, 0x3f, 0x9c, 0xd5, 0xaf, + 0xa1, 0xbd, 0x4c, 0xef, 0x2e, 0xfe, 0xd3, 0x56, + 0xc6, 0xa3, 0xf5, 0x1d, 0xe7, 0x93, 0xf9, 0xcd, + 0x5a, 0xfa, 0x1b, 0xd4, 0xce, 0xf2, 0xef, 0xed, + 0x35, 0x5e, 0x38, 0x73, 0xa5, 0x8c, 0xf3, 0x14, + 0xee, 0x4e, 0xb5, 0x89, 0x11, 0x15, 0x1b, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x0b, 0x57, 0x21, 0xe8, + 0x57, 0x3e, 0x49, 0xfe, 0x29, 0x5b, 0x4b, 0x57, + 0x21, 0xe8, 0x57, 0x3e, 0x49, 0xfe, 0x29, 0x53, + 0x4e, 0x78, 0x56, 0xe6, 0xc5, 0x5a, 0x27, 0x52, + 0x0b, 0x49, 0xfa, 0x3d, 0xc7, 0x86, 0xdf, 0x15, + 0x4f, 0x28, 0x1d, 0x27, 0xe8, 0xf7, 0x1e, 0x1b, + 0x7c, 0x55, 0x3c, 0xb4, 0xc4, 0x71, 0x6a, 0xd3, + 0xf7, 0x30, 0xc0, 0xf2, 0xd6, 0xf4, 0x4e, 0xb1, + 0x11, 0x16, 0x4e, 0x91, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x02, 0xa5, 0x0e, + 0xd1, 0x43, 0xb4, 0x1d, 0xe0, 0xa2, 0x20, 0xd1, + 0x97, 0x11, 0x6e, 0xf7, 0x39, 0xcc, 0x26, 0x30, + 0xfe, 0xf9, 0xa3, 0x71, 0xa1, 0xaa, 0xd5, 0xb9, + 0xc6, 0x5c, 0x30, 0x71, 0x31, 0xdd, 0x23, 0x19, + 0xb4, 0x0e, 0x5d, 0x8a, 0x61, 0x10, 0x53, 0xef, + 0x30, 0x78, 0xeb, 0xa7, 0x0e, 0x9e, 0xcc, 0x3a, + 0x69, 0x0f, 0x7c, 0x01, 0x07, 0x9e, 0xa2, 0x83, + 0xb2, 0xb5, 0xe2, 0xd3, 0xba, 0x6e, 0x3b, 0x8e, + 0x92, 0x3b, 0x62, 0x64, 0x8d, 0xc2, 0x83, 0x88, + 0x96, 0xd7, 0xa9, 0x43, 0xbd, 0x5e, 0x17, 0x9c, + 0x2d, 0xea, 0x0e, 0xc2, 0x9f, 0x2a, 0x7a, 0xc5, + 0x53, 0xf0, 0xbb, 0x57, 0x47, 0x4f, 0x33, 0x63, + 0xda, 0x41, 0x69, 0x1c, 0x20, 0x95, 0xf1, 0x6f, + 0xa6, 0xb1, 0x71, 0x46, 0xc3, 0x1e, 0x3d, 0x8f, + 0x99, 0xe4, 0x9a, 0x10, 0x48, 0x1d, 0x4a, 0x82, + 0x55, 0xbe, 0x83, 0xa8, 0x89, 0x96, 0x7a, 0xc4, + 0x5c, 0x78, 0xe9, 0xba, 0x06, 0x32, 0x82, 0x3e, + 0x16, 0xec, 0x68, 0xe4, 0x3d, 0x60, 0x17, 0xcc, + 0x58, 0x77, 0x71, 0xf1, 0x3d, 0xf4, 0x68, 0x35, + 0x0d, 0x1e, 0xfa, 0x96, 0x45, 0x03, 0x1c, 0x50, + 0x47, 0x10, 0xa3, 0x05, 0x16, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x51, 0xfa, 0x83, 0xd5, + 0x33, 0xfc, 0x9f, 0x18, 0x29, 0x05, 0x1f, 0xa8, + 0x3d, 0x53, 0x3f, 0xc9, 0xf1, 0x82, 0xbd, 0xbd, + 0xba, 0x74, 0xc3, 0x2c, 0x4f, 0x02, 0xee, 0xe5, + 0x7a, 0x9e, 0xe9, 0x5f, 0x54, 0x37, 0xc3, 0x7f, + 0x6d, 0x4b, 0x3f, 0x72, 0x89, 0xd2, 0xbe, 0xa8, + 0x6f, 0x86, 0xfe, 0xda, 0x96, 0x7e, 0xe5, 0x37, + 0x78, 0xb5, 0xef, 0x4a, 0x30, 0xdc, 0x0b, 0x7b, + 0xb0, 0xe7, 0x37, 0x5f, 0xe4, 0xf1, 0xe5, 0x59, + 0xf6, 0x21, 0x5f, 0xd5, 0x02, 0xeb, 0xfc, 0x9e, + 0x3c, 0xab, 0x3e, 0xc4, 0x2b, 0xfa, 0xe5, 0xb3, + 0x9e, 0xbd, 0xf9, 0x7b, 0x1f, 0x14, 0xcd, 0x83, + 0xfe, 0x35, 0xb1, 0x11, 0x16, 0xcf, 0x34, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x1a, 0xf7, 0x56, 0x30, 0x5c, + 0xd1, 0xcf, 0x1c, 0x2f, 0x1b, 0x9c, 0xdd, 0x85, + 0x6a, 0x3f, 0x12, 0xf6, 0x82, 0x61, 0x94, 0x97, + 0x9d, 0xa7, 0x8b, 0x71, 0x2a, 0x4d, 0x10, 0x57, + 0x66, 0xb4, 0x21, 0xa6, 0x2b, 0x98, 0x5b, 0x2c, + 0x6c, 0xae, 0xc7, 0xb7, 0x8c, 0x7b, 0xe0, 0xfb, + 0xcb, 0x41, 0xf8, 0x6d, 0x3e, 0x5a, 0xd3, 0x73, + 0x8d, 0x88, 0x3a, 0x42, 0x48, 0x0d, 0x61, 0x6b, + 0x88, 0xf9, 0x24, 0x2b, 0x8a, 0xf0, 0x80, 0x77, + 0x80, 0x99, 0x64, 0x54, 0xe1, 0xc5, 0x63, 0x98, + 0xc1, 0x1d, 0xb5, 0x9b, 0x3a, 0x30, 0xda, 0x34, + 0x38, 0x57, 0x71, 0xea, 0x95, 0x96, 0xdf, 0x15, + 0x64, 0xd9, 0xdd, 0x21, 0xc7, 0xc2, 0x0b, 0x5b, + 0x5e, 0x27, 0x44, 0xd2, 0x49, 0xa7, 0x21, 0x20, + 0xab, 0x3d, 0x07, 0x50, 0x2f, 0x54, 0xe5, 0x9e, + 0xb1, 0x11, 0x6d, 0x6b, 0x73, 0x25, 0x49, 0x8c, + 0x44, 0xca, 0x51, 0x82, 0x81, 0xb4, 0xf7, 0x02, + 0xf6, 0x4c, 0x4c, 0xaf, 0x7f, 0x7e, 0x07, 0x5f, + 0xad, 0x4d, 0xaa, 0x59, 0x14, 0x0d, 0x5b, 0x6c, + 0x7c, 0x50, 0x01, 0x5e, 0xe9, 0xc3, 0x94, 0xad, + 0xa4, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x41, + 0xbc, 0x22, 0x0d, 0xe1, 0x05, 0x03, 0x46, 0xff, + 0x00, 0x7c, 0x5f, 0x73, 0x5c, 0x7d, 0xa0, 0x5d, + 0x21, 0x73, 0x7d, 0x1b, 0xfd, 0xf1, 0x7d, 0xcd, + 0x71, 0xf6, 0x81, 0x74, 0x85, 0x8e, 0x1f, 0x63, + 0xce, 0x97, 0xa7, 0xf1, 0x9e, 0x66, 0x9f, 0x55, + 0x6f, 0x52, 0x2f, 0x37, 0xf5, 0x31, 0xf8, 0x7f, + 0x01, 0x59, 0xad, 0x3d, 0x1a, 0x2f, 0x04, 0x76, + 0x96, 0x1c, 0xdf, 0xd4, 0xc7, 0xe1, 0xfc, 0x05, + 0x66, 0xb4, 0xf4, 0x68, 0xbc, 0x11, 0xda, 0x5c, + 0x56, 0x7f, 0xb3, 0xc4, 0x7a, 0xaa, 0x1c, 0x75, + 0x72, 0xf6, 0xf7, 0xe5, 0x95, 0x11, 0x17, 0xa6, + 0xc0, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x1f, 0x12, 0xc4, + 0xc9, 0x58, 0x59, 0x20, 0xe2, 0x69, 0xe4, 0x2b, + 0x44, 0xe1, 0xa2, 0x1d, 0xe4, 0x8e, 0x6f, 0x0d, + 0x4b, 0x07, 0x50, 0x95, 0x22, 0x88, 0x20, 0xae, + 0xf1, 0xf7, 0x0c, 0xaf, 0x1b, 0x44, 0xac, 0x70, + 0xe1, 0xd9, 0x52, 0x08, 0xdf, 0xb4, 0x28, 0x69, + 0x74, 0xce, 0x16, 0x49, 0x5c, 0xe9, 0x2d, 0x78, + 0x5a, 0xc0, 0x7a, 0x47, 0x0a, 0x80, 0x2b, 0xcf, + 0xca, 0xae, 0xc9, 0x40, 0xa6, 0x26, 0x63, 0x34, + 0x8a, 0x4d, 0x9e, 0x0b, 0x07, 0x6e, 0x1c, 0xfb, + 0x5b, 0x62, 0x5e, 0xf0, 0x2a, 0x5f, 0xdd, 0x6e, + 0x3c, 0x80, 0xac, 0xf7, 0x58, 0x4b, 0x3b, 0x88, + 0xfa, 0x39, 0x2c, 0x58, 0xe0, 0x48, 0x20, 0x86, + 0xee, 0xec, 0x51, 0x5b, 0xb8, 0x5b, 0xd4, 0x1d, + 0x85, 0xee, 0xe4, 0xf2, 0xa7, 0xac, 0x56, 0x6d, + 0xf0, 0x36, 0x50, 0x4c, 0x1b, 0x65, 0x62, 0xc6, + 0x96, 0x70, 0x93, 0x29, 0x6d, 0x4f, 0xb8, 0xe7, + 0x72, 0xa9, 0x39, 0x71, 0xb3, 0x3c, 0x12, 0x48, + 0xdb, 0xbc, 0x75, 0x94, 0x9a, 0x28, 0x11, 0xb6, + 0xb8, 0x90, 0xc3, 0xc5, 0x2b, 0xb8, 0xc9, 0xe4, + 0xe4, 0x52, 0x0c, 0x63, 0x58, 0x28, 0xd1, 0x40, + 0x17, 0xd2, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x8c, 0xcb, 0x7d, 0x74, 0x3c, 0xc7, + 0xb6, 0xa6, 0xdb, 0xde, 0x8e, 0x65, 0x09, 0x96, + 0xfa, 0xe8, 0x79, 0x8f, 0x6d, 0x4d, 0xb7, 0xbd, + 0x1c, 0xcb, 0xce, 0xc1, 0xf3, 0xd8, 0xed, 0x36, + 0xbf, 0x4c, 0xba, 0x2e, 0xf0, 0x6c, 0xe8, 0xab, + 0x5b, 0x0d, 0xe7, 0xa2, 0xcd, 0xe4, 0xdf, 0xe2, + 0x95, 0x52, 0xd0, 0x9b, 0xaf, 0x3f, 0x95, 0xf3, + 0xd5, 0xb6, 0xf3, 0xd1, 0x66, 0xf2, 0x6f, 0xf1, + 0x4a, 0xa9, 0x68, 0x4d, 0xd7, 0x9f, 0xca, 0xf9, + 0xeb, 0xd5, 0xa7, 0x62, 0xae, 0xf3, 0x86, 0xbe, + 0x35, 0xaf, 0x39, 0x6b, 0x44, 0x45, 0x9b, 0x61, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x08, 0xa8, 0xa1, 0xdc, + 0x56, 0x8c, 0xd8, 0x9b, 0x79, 0x1e, 0x5c, 0xc2, + 0x63, 0xe2, 0xd8, 0xe0, 0x37, 0x11, 0x55, 0xbc, + 0x88, 0x22, 0x2e, 0x31, 0x77, 0x0c, 0x6f, 0xf0, + 0xdf, 0xc6, 0xc6, 0xed, 0x00, 0x9d, 0xa2, 0x8a, + 0x12, 0xfb, 0x03, 0x61, 0x76, 0xee, 0x29, 0xed, + 0xab, 0x34, 0x8e, 0xa7, 0x13, 0x41, 0xa9, 0xf7, + 0xbb, 0x6a, 0xe4, 0x89, 0x13, 0x31, 0x98, 0xc8, + 0xa2, 0xc7, 0xa6, 0xb4, 0xec, 0x57, 0x3c, 0x62, + 0xdc, 0xba, 0x48, 0xdc, 0x08, 0x15, 0x3c, 0x21, + 0xc3, 0x90, 0xf5, 0x56, 0xf0, 0xc5, 0xda, 0x16, + 0x50, 0x59, 0x31, 0xcd, 0xda, 0xda, 0x70, 0x82, + 0x55, 0xaf, 0x85, 0xbd, 0x41, 0xd8, 0x5e, 0xd0, + 0x75, 0x14, 0xf9, 0x52, 0x64, 0x53, 0x6d, 0xf4, + 0xbe, 0x2e, 0x38, 0xda, 0xf6, 0xd8, 0xf1, 0xca, + 0xf7, 0x1a, 0x30, 0x83, 0x41, 0xd4, 0xd8, 0xa7, + 0x60, 0xc6, 0xcc, 0xdb, 0x76, 0x46, 0x1a, 0xd8, + 0x43, 0x05, 0x03, 0x47, 0x27, 0x58, 0x29, 0x54, + 0x49, 0x99, 0x91, 0x13, 0x1e, 0x1d, 0xfc, 0x75, + 0x7b, 0xa8, 0x06, 0xda, 0x0e, 0x53, 0xca, 0xa4, + 0xa2, 0xb7, 0x8a, 0x11, 0x46, 0x36, 0x8b, 0x22, + 0x28, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x11, 0xda, 0x8f, 0xd4, 0x77, 0x9e, 0x4f, 0xe7, + 0x35, 0x6b, 0xe8, 0x6f, 0x53, 0x3b, 0xcb, 0xbf, + 0xb4, 0xd5, 0xb1, 0xa8, 0xfd, 0x47, 0x79, 0xe4, + 0xfe, 0x73, 0x56, 0xbe, 0x86, 0xf5, 0x33, 0xbc, + 0xbb, 0xfb, 0x4d, 0x57, 0x8e, 0x1c, 0xe9, 0x63, + 0x3c, 0xc5, 0x3b, 0x93, 0xad, 0x62, 0x44, 0x45, + 0x46, 0xc2, 0x22, 0x20, 0x22, 0x22, 0x02, 0xd5, + 0xc8, 0x7a, 0x15, 0xcf, 0x92, 0x7f, 0x8a, 0x56, + 0xd2, 0xd5, 0xc8, 0x7a, 0x15, 0xcf, 0x92, 0x7f, + 0x8a, 0x54, 0xd3, 0x9e, 0x15, 0xb9, 0xb1, 0x56, + 0x89, 0xd4, 0x82, 0xd2, 0x7e, 0x8f, 0x71, 0xe1, + 0xb7, 0xc5, 0x53, 0xca, 0x07, 0x49, 0xfa, 0x3d, + 0xc7, 0x86, 0xdf, 0x15, 0x4f, 0x2d, 0x31, 0x1c, + 0x5a, 0xb4, 0xfd, 0xcc, 0x30, 0x3c, 0xb5, 0xbd, + 0x13, 0xac, 0x44, 0x45, 0x93, 0xa4, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x05, 0x1f, 0xa8, 0x3d, 0x53, + 0x3f, 0xc9, 0xf1, 0x82, 0x90, 0x51, 0xfa, 0x83, + 0xd5, 0x33, 0xfc, 0x9f, 0x18, 0x2b, 0xdb, 0xdb, + 0xa7, 0x4c, 0x32, 0xc4, 0xf0, 0x2e, 0xee, 0x57, + 0xa9, 0xee, 0x95, 0xf5, 0x43, 0x7c, 0x37, 0xf6, + 0xd4, 0xb3, 0xf7, 0x28, 0x9d, 0x2b, 0xea, 0x86, + 0xf8, 0x6f, 0xed, 0xa9, 0x67, 0xee, 0x53, 0x77, + 0x8b, 0x5e, 0xf4, 0xa3, 0x0d, 0xc0, 0xb7, 0xbb, + 0x0e, 0x73, 0x75, 0xfe, 0x4f, 0x1e, 0x55, 0x9f, + 0x62, 0x15, 0xfd, 0x50, 0x2e, 0xbf, 0xc9, 0xe3, + 0xca, 0xb3, 0xec, 0x42, 0xbf, 0xae, 0x5b, 0x39, + 0xeb, 0xdf, 0x97, 0xb1, 0xf1, 0x4c, 0xd8, 0x3f, + 0xe3, 0x5b, 0x11, 0x11, 0x6c, 0xf3, 0x44, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x41, 0xbc, 0x22, 0x0d, + 0xe1, 0x05, 0x03, 0x46, 0xff, 0x00, 0x7c, 0x5f, + 0x73, 0x5c, 0x7d, 0xa0, 0x5d, 0x21, 0x73, 0x7d, + 0x1b, 0xfd, 0xf1, 0x7d, 0xcd, 0x71, 0xf6, 0x81, + 0x74, 0x85, 0x8e, 0x1f, 0x63, 0xce, 0x97, 0xa7, + 0xf1, 0x9e, 0x66, 0x9f, 0x55, 0x6f, 0x52, 0x2f, + 0x37, 0xf5, 0x31, 0xf8, 0x7f, 0x01, 0x59, 0xad, + 0x3d, 0x1a, 0x2f, 0x04, 0x76, 0x96, 0x1c, 0xdf, + 0xd4, 0xc7, 0xe1, 0xfc, 0x05, 0x66, 0xb4, 0xf4, + 0x68, 0xbc, 0x11, 0xda, 0x5c, 0x56, 0x7f, 0xb3, + 0xc4, 0x7a, 0xaa, 0x1c, 0x75, 0x72, 0xf6, 0xf7, + 0xe5, 0x95, 0x11, 0x17, 0xa6, 0xc0, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x41, 0x19, 0x96, + 0xfa, 0xe8, 0x79, 0x8f, 0x6d, 0x4d, 0xb7, 0xbd, + 0x1c, 0xca, 0x13, 0x2d, 0xf5, 0xd0, 0xf3, 0x1e, + 0xda, 0x9b, 0x6f, 0x7a, 0x39, 0x97, 0x9d, 0x83, + 0xe7, 0xb1, 0xda, 0x6d, 0x7e, 0x99, 0x74, 0x5d, + 0xe0, 0xd9, 0xd1, 0x56, 0xb6, 0x1b, 0xcf, 0x45, + 0x9b, 0xc9, 0xbf, 0xc5, 0x2a, 0xa5, 0xa1, 0x37, + 0x5e, 0x7f, 0x2b, 0xe7, 0xab, 0x6d, 0xe7, 0xa2, + 0xcd, 0xe4, 0xdf, 0xe2, 0x95, 0x52, 0xd0, 0x9b, + 0xaf, 0x3f, 0x95, 0xf3, 0xd7, 0xab, 0x4e, 0xc5, + 0x5d, 0xe7, 0x0d, 0x7c, 0x6b, 0x5e, 0x72, 0xd6, + 0x88, 0x8b, 0x36, 0xc2, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x08, 0xed, 0x47, 0xea, 0x3b, + 0xcf, 0x27, 0xf3, 0x9a, 0xb5, 0xf4, 0x37, 0xa9, + 0x9d, 0xe5, 0xdf, 0xda, 0x6a, 0xd8, 0xd4, 0x7e, + 0xa3, 0xbc, 0xf2, 0x7f, 0x39, 0xab, 0x5f, 0x43, + 0x7a, 0x99, 0xde, 0x5d, 0xfd, 0xa6, 0xab, 0xc7, + 0x0e, 0x74, 0xb1, 0x9e, 0x62, 0x9d, 0xc9, 0xd6, + 0xb1, 0x22, 0x22, 0xa3, 0x61, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x6a, 0xe4, 0x3d, 0x0a, 0xe7, 0xc9, + 0x3f, 0xc5, 0x2b, 0x69, 0x6a, 0xe4, 0x3d, 0x0a, + 0xe7, 0xc9, 0x3f, 0xc5, 0x2a, 0x69, 0xcf, 0x0a, + 0xdc, 0xd8, 0xab, 0x44, 0xea, 0x41, 0x69, 0x3f, + 0x47, 0xb8, 0xf0, 0xdb, 0xe2, 0xa9, 0xe5, 0x03, + 0xa4, 0xfd, 0x1e, 0xe3, 0xc3, 0x6f, 0x8a, 0xa7, + 0x96, 0x98, 0x8e, 0x2d, 0x5a, 0x7e, 0xe6, 0x18, + 0x1e, 0x5a, 0xde, 0x89, 0xd6, 0x22, 0x22, 0xc9, + 0xd2, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x8f, + 0xd4, 0x1e, 0xa9, 0x9f, 0xe4, 0xf8, 0xc1, 0x48, + 0x28, 0xfd, 0x41, 0xea, 0x99, 0xfe, 0x4f, 0x8c, + 0x15, 0xed, 0xed, 0xd3, 0xa6, 0x19, 0x62, 0x78, + 0x17, 0x77, 0x2b, 0xd4, 0xf7, 0x4a, 0xfa, 0xa1, + 0xbe, 0x1b, 0xfb, 0x6a, 0x59, 0xfb, 0x94, 0x4e, + 0x95, 0xf5, 0x43, 0x7c, 0x37, 0xf6, 0xd4, 0xb3, + 0xf7, 0x29, 0xbb, 0xc5, 0xaf, 0x7a, 0x51, 0x86, + 0xe0, 0x5b, 0xdd, 0x87, 0x39, 0xba, 0xff, 0x00, + 0x27, 0x8f, 0x2a, 0xcf, 0xb1, 0x0a, 0xfe, 0xa8, + 0x17, 0x5f, 0xe4, 0xf1, 0xe5, 0x59, 0xf6, 0x21, + 0x5f, 0xd7, 0x2d, 0x9c, 0xf5, 0xef, 0xcb, 0xd8, + 0xf8, 0xa6, 0x6c, 0x1f, 0xf1, 0xad, 0x88, 0x88, + 0xb6, 0x79, 0xa2, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x20, 0xde, 0x11, 0x06, 0xf0, 0x82, 0x81, 0xa3, + 0x7f, 0xbe, 0x2f, 0xb9, 0xae, 0x3e, 0xd0, 0x2e, + 0x90, 0xb9, 0xbe, 0x8d, 0xfe, 0xf8, 0xbe, 0xe6, + 0xb8, 0xfb, 0x40, 0xba, 0x42, 0xc7, 0x0f, 0xb1, + 0xe7, 0x4b, 0xd3, 0xf8, 0xcf, 0x33, 0x4f, 0xaa, + 0xb7, 0xa9, 0x17, 0x9b, 0xfa, 0x98, 0xfc, 0x3f, + 0x80, 0xac, 0xd6, 0x9e, 0x8d, 0x17, 0x82, 0x3b, + 0x4b, 0x0e, 0x6f, 0xea, 0x63, 0xf0, 0xfe, 0x02, + 0xb3, 0x5a, 0x7a, 0x34, 0x5e, 0x08, 0xed, 0x2e, + 0x2b, 0x3f, 0xd9, 0xe2, 0x3d, 0x55, 0x0e, 0x3a, + 0xb9, 0x7b, 0x7b, 0xf2, 0xca, 0x88, 0x8b, 0xd3, + 0x60, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x8c, 0xcb, 0x7d, 0x74, 0x3c, 0xc7, 0xb6, + 0xa6, 0xdb, 0xde, 0x8e, 0x65, 0x09, 0x96, 0xfa, + 0xe8, 0x79, 0x8f, 0x6d, 0x4d, 0xb7, 0xbd, 0x1c, + 0xcb, 0xce, 0xc1, 0xf3, 0xd8, 0xed, 0x36, 0xbf, + 0x4c, 0xba, 0x2e, 0xf0, 0x6c, 0xe8, 0xab, 0x5b, + 0x0d, 0xe7, 0xa2, 0xcd, 0xe4, 0xdf, 0xe2, 0x95, + 0x52, 0xd0, 0x9b, 0xaf, 0x3f, 0x95, 0xf3, 0xd5, + 0xb6, 0xf3, 0xd1, 0x66, 0xf2, 0x6f, 0xf1, 0x4a, + 0xa9, 0x68, 0x4d, 0xd7, 0x9f, 0xca, 0xf9, 0xeb, + 0xd5, 0xa7, 0x62, 0xae, 0xf3, 0x86, 0xbe, 0x35, + 0xaf, 0x39, 0x6b, 0x44, 0x45, 0x9b, 0x61, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x04, 0x76, + 0xa3, 0xf5, 0x1d, 0xe7, 0x93, 0xf9, 0xcd, 0x5a, + 0xfa, 0x1b, 0xd4, 0xce, 0xf2, 0xef, 0xed, 0x35, + 0x6c, 0x6a, 0x3f, 0x51, 0xde, 0x79, 0x3f, 0x9c, + 0xd5, 0xaf, 0xa1, 0xbd, 0x4c, 0xef, 0x2e, 0xfe, + 0xd3, 0x55, 0xe3, 0x87, 0x3a, 0x58, 0xcf, 0x31, + 0x4e, 0xe4, 0xeb, 0x58, 0x91, 0x11, 0x51, 0xb0, + 0x88, 0x88, 0x08, 0x88, 0x80, 0xb5, 0x72, 0x1e, + 0x85, 0x73, 0xe4, 0x9f, 0xe2, 0x95, 0xb4, 0xb5, + 0x72, 0x1e, 0x85, 0x73, 0xe4, 0x9f, 0xe2, 0x95, + 0x34, 0xe7, 0x85, 0x6e, 0x6c, 0x55, 0xa2, 0x75, + 0x20, 0xb4, 0x9f, 0xa3, 0xdc, 0x78, 0x6d, 0xf1, + 0x54, 0xf2, 0x81, 0xd2, 0x7e, 0x8f, 0x71, 0xe1, + 0xb7, 0xc5, 0x53, 0xcb, 0x4c, 0x47, 0x16, 0xad, + 0x3f, 0x73, 0x0c, 0x0f, 0x2d, 0x6f, 0x44, 0xeb, + 0x11, 0x11, 0x64, 0xe9, 0x11, 0x11, 0x01, 0x17, + 0x8e, 0x73, 0x5a, 0xd2, 0xe7, 0x1a, 0x35, 0xa0, + 0x97, 0x13, 0xc8, 0x06, 0xd2, 0x54, 0x67, 0xe6, + 0x9d, 0x37, 0x4f, 0x59, 0xdb, 0x7f, 0xc8, 0x10, + 0x4a, 0x22, 0xf1, 0xae, 0x6b, 0xda, 0x1c, 0xd2, + 0x1c, 0xd7, 0x00, 0x5a, 0x46, 0xe2, 0x0e, 0xe2, + 0xb4, 0xae, 0xf3, 0x98, 0x6b, 0x29, 0x8d, 0xbd, + 0xe5, 0xec, 0x36, 0xf3, 0x00, 0x09, 0x8e, 0x47, + 0x86, 0xb8, 0x03, 0xb8, 0xd1, 0x06, 0xf2, 0x2d, + 0x7b, 0x2c, 0x85, 0x85, 0xfb, 0x1d, 0x25, 0x8d, + 0xc4, 0x77, 0x31, 0xb0, 0xf0, 0xb9, 0xd1, 0xbb, + 0x88, 0x03, 0xbe, 0x86, 0x8b, 0xdb, 0xcb, 0xeb, + 0x2b, 0x18, 0xba, 0x6b, 0xc9, 0xe3, 0xb7, 0x8b, + 0x77, 0x1c, 0x8e, 0x0d, 0x15, 0xeb, 0x57, 0x7a, + 0x0c, 0xe8, 0xa1, 0x99, 0xac, 0xb4, 0xbb, 0xdf, + 0xc0, 0x32, 0x50, 0xd7, 0x75, 0x4f, 0x10, 0x1d, + 0x92, 0xda, 0x29, 0x68, 0xa6, 0x86, 0x78, 0xdb, + 0x2c, 0x2f, 0x6c, 0xb1, 0x3f, 0x6b, 0x5e, 0xc2, + 0x1c, 0xd2, 0x3a, 0xc4, 0x20, 0xfb, 0x45, 0xab, + 0x7b, 0x95, 0xc6, 0x63, 0xcb, 0x05, 0xf5, 0xd4, + 0x56, 0xc6, 0x4a, 0x96, 0x09, 0x5c, 0x1b, 0xc5, + 0x4d, 0xf4, 0xaa, 0xd6, 0xfc, 0xd1, 0xa6, 0xff, + 0x00, 0xa9, 0xdb, 0x7f, 0xc8, 0x10, 0x49, 0xa2, + 0xd5, 0xb4, 0xca, 0x63, 0x6f, 0x49, 0x6d, 0x9d, + 0xd4, 0x37, 0x0e, 0x1b, 0x78, 0x63, 0x7b, 0x5c, + 0xee, 0xc0, 0x35, 0x5b, 0x48, 0x08, 0x8b, 0x46, + 0xd7, 0x39, 0x86, 0xbc, 0xb9, 0x36, 0xb6, 0x97, + 0xb0, 0xcf, 0x70, 0x2a, 0x4c, 0x4c, 0x75, 0x5d, + 0xdc, 0xf7, 0xdd, 0x84, 0x1b, 0xc8, 0x8a, 0x3a, + 0x4d, 0x47, 0xa7, 0xe2, 0x97, 0xa1, 0x93, 0x23, + 0x6c, 0xd9, 0x2b, 0x42, 0xde, 0x91, 0xbb, 0xfa, + 0x9d, 0x44, 0x12, 0x28, 0xbc, 0x63, 0xd8, 0xf6, + 0x07, 0xb1, 0xc1, 0xec, 0x70, 0xab, 0x5c, 0xd3, + 0x50, 0x47, 0x54, 0x10, 0x8f, 0x7b, 0x58, 0xc2, + 0xf7, 0xb8, 0x31, 0xad, 0x15, 0x73, 0x9c, 0x40, + 0x00, 0x75, 0x49, 0x28, 0x3d, 0x58, 0xee, 0x6e, + 0x22, 0xb5, 0xb7, 0x96, 0xe6, 0x73, 0xc3, 0x14, + 0x2c, 0x32, 0x48, 0xea, 0x56, 0x8d, 0x68, 0xa9, + 0x34, 0x0b, 0x4e, 0x2d, 0x45, 0x81, 0x9a, 0x61, + 0x04, 0x59, 0x0b, 0x77, 0xca, 0x4d, 0x03, 0x04, + 0x8d, 0xa9, 0x3d, 0x6e, 0x45, 0xbe, 0xe6, 0xb5, + 0xcd, 0x2d, 0x70, 0x05, 0xa7, 0x61, 0x69, 0x15, + 0x04, 0x75, 0xc2, 0x0a, 0xe8, 0xf6, 0x83, 0xa5, + 0x08, 0xa8, 0xbb, 0x75, 0x3c, 0x93, 0xfe, 0x8a, + 0xda, 0x8b, 0x58, 0x69, 0xf9, 0x71, 0xf3, 0x64, + 0x99, 0x70, 0x4d, 0xad, 0xbb, 0xdb, 0x1c, 0xaf, + 0xe0, 0x75, 0x43, 0x9f, 0xde, 0x8e, 0x1a, 0x55, + 0x41, 0x6a, 0xcb, 0x6b, 0x66, 0x6a, 0xcd, 0x3a, + 0xc6, 0x44, 0xc6, 0xb1, 0xf2, 0x77, 0x6d, 0x0d, + 0x00, 0x3b, 0xf8, 0x8d, 0xde, 0x00, 0xda, 0xb7, + 0xbd, 0xa0, 0x43, 0x0c, 0x3a, 0x4e, 0xe4, 0x43, + 0x1b, 0x23, 0x06, 0x58, 0x49, 0x0c, 0x68, 0x6d, + 0x7b, 0xbe, 0xb2, 0x09, 0xcc, 0x6e, 0x63, 0x1f, + 0x94, 0xb3, 0x75, 0xed, 0x94, 0x9c, 0x76, 0xed, + 0x2e, 0x6b, 0x9e, 0x41, 0x6d, 0x0b, 0x45, 0x5d, + 0x50, 0xea, 0x72, 0x2d, 0x6c, 0x4e, 0xa7, 0xc3, + 0x66, 0x67, 0x7d, 0xbe, 0x3e, 0x63, 0x2c, 0xb1, + 0xb7, 0x8d, 0xc0, 0xb1, 0xcd, 0xee, 0x6b, 0x4a, + 0xd5, 0xc3, 0xae, 0xa8, 0xf6, 0x59, 0x03, 0x81, + 0xc6, 0x6a, 0x0c, 0x77, 0x17, 0x09, 0x92, 0x08, + 0xa6, 0xb5, 0xff, 0x00, 0xfc, 0x86, 0xb5, 0x86, + 0x9e, 0xe3, 0xc2, 0xdc, 0xd0, 0x96, 0x27, 0x1f, + 0xa9, 0xae, 0xed, 0x0e, 0xc7, 0x32, 0xca, 0x22, + 0xff, 0x00, 0x09, 0xe2, 0x27, 0xbb, 0xdf, 0x72, + 0x0e, 0x82, 0x88, 0x88, 0x08, 0x88, 0x80, 0xa3, + 0xf5, 0x07, 0xaa, 0x67, 0xf9, 0x3e, 0x30, 0x52, + 0x0a, 0x3f, 0x50, 0x7a, 0xa6, 0x7f, 0x93, 0xe3, + 0x05, 0x7b, 0x7b, 0x74, 0xe9, 0x86, 0x58, 0x9e, + 0x05, 0xdd, 0xca, 0xf5, 0x3d, 0xd2, 0xbe, 0xa8, + 0x6f, 0x86, 0xfe, 0xda, 0x96, 0x7e, 0xe5, 0x13, + 0xa5, 0x7d, 0x50, 0xdf, 0x0d, 0xfd, 0xb5, 0x2c, + 0xfd, 0xca, 0x6e, 0xf1, 0x6b, 0xde, 0x94, 0x61, + 0xb8, 0x16, 0xf7, 0x61, 0xce, 0x6e, 0xbf, 0xc9, + 0xe3, 0xca, 0xb3, 0xec, 0x42, 0xbf, 0xaa, 0x05, + 0xd7, 0xf9, 0x3c, 0x79, 0x56, 0x7d, 0x88, 0x57, + 0xf5, 0xcb, 0x67, 0x3d, 0x7b, 0xf2, 0xf6, 0x3e, + 0x29, 0x9b, 0x07, 0xfc, 0x6b, 0x62, 0x22, 0x2d, + 0x9e, 0x68, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0xb4, 0x72, 0x19, 0xdc, 0x3e, 0x35, + 0xdc, 0x17, 0xf7, 0x91, 0x40, 0xff, 0x00, 0xd0, + 0x73, 0xbb, 0xaf, 0xd9, 0x6d, 0x4a, 0xc7, 0x65, + 0xa9, 0x30, 0x37, 0xf2, 0x08, 0xad, 0x2f, 0xa1, + 0x96, 0x53, 0xba, 0x3a, 0xf0, 0xb8, 0xf3, 0x07, + 0x81, 0x54, 0x12, 0x48, 0x8b, 0x0d, 0xd5, 0xed, + 0x9d, 0x94, 0x7d, 0x2d, 0xe4, 0xf1, 0xdb, 0xc7, + 0xc8, 0xe9, 0x1c, 0x1a, 0x3d, 0xca, 0xa0, 0xcc, + 0x8b, 0x46, 0xd3, 0x39, 0x86, 0xbe, 0x93, 0xa2, + 0xb3, 0xbe, 0x82, 0x79, 0x0e, 0xe6, 0x31, 0xe0, + 0xb8, 0xf3, 0x05, 0xbc, 0x80, 0x8b, 0x56, 0xf7, + 0x2b, 0x8c, 0xc7, 0x80, 0x6f, 0xae, 0xa2, 0xb6, + 0xe2, 0xef, 0x44, 0x8f, 0x0d, 0x27, 0x98, 0x6f, + 0x5f, 0x76, 0x77, 0xf6, 0x37, 0xf1, 0x99, 0x6c, + 0xae, 0x23, 0xb9, 0x60, 0xde, 0xe8, 0x9c, 0x1d, + 0x4e, 0x7a, 0x6e, 0x41, 0x9d, 0x11, 0x68, 0xdd, + 0xe7, 0x70, 0xb6, 0x52, 0xf4, 0x17, 0x77, 0xd0, + 0x43, 0x30, 0xdf, 0x1b, 0x9e, 0x38, 0x87, 0x38, + 0xe4, 0x41, 0xbc, 0x8b, 0xe2, 0x19, 0xe1, 0x9e, + 0x36, 0xcd, 0x04, 0x8d, 0x96, 0x27, 0xf7, 0xb2, + 0x30, 0x87, 0x34, 0xf3, 0x16, 0xaf, 0xb2, 0x68, + 0x2b, 0xc8, 0x37, 0xa0, 0x2f, 0x1c, 0x43, 0x41, + 0x71, 0xdc, 0x05, 0x4f, 0xb8, 0xa3, 0xce, 0xa3, + 0xc0, 0x09, 0xba, 0x03, 0x91, 0xb6, 0xe9, 0x6b, + 0x4e, 0x1e, 0x91, 0xbb, 0xfa, 0x95, 0xdc, 0xa4, + 0x36, 0x11, 0x51, 0xb4, 0x1f, 0x74, 0x10, 0x50, + 0x57, 0x7f, 0xec, 0x1d, 0x29, 0xf7, 0xb7, 0x6c, + 0xff, 0x00, 0xda, 0x7f, 0xfa, 0x2d, 0xab, 0x4d, + 0x61, 0xa7, 0xef, 0x20, 0xba, 0xb8, 0xb7, 0xb8, + 0x2f, 0x8e, 0xc9, 0x82, 0x5b, 0x83, 0xc0, 0xe1, + 0xc2, 0xc2, 0x68, 0x0e, 0xd1, 0xb5, 0x40, 0xfb, + 0x46, 0xb6, 0xb6, 0x8a, 0x0c, 0x5f, 0x45, 0x0c, + 0x71, 0xf1, 0x5d, 0x51, 0xdc, 0x0d, 0x0d, 0xa8, + 0xa0, 0xdf, 0x40, 0xa7, 0x75, 0x55, 0xb5, 0xbc, + 0x3a, 0x67, 0x28, 0x61, 0x89, 0x91, 0x93, 0x6e, + 0x41, 0x2c, 0x68, 0x6d, 0x76, 0x8d, 0xf4, 0x08, + 0x36, 0xf1, 0x19, 0xdc, 0x66, 0x69, 0x92, 0x3f, + 0x1d, 0x29, 0x94, 0x42, 0xe0, 0xd9, 0x2a, 0xd2, + 0xd2, 0x0b, 0x85, 0x47, 0x7d, 0x45, 0x82, 0xcf, + 0x54, 0xe1, 0x2f, 0xb2, 0x27, 0x1b, 0x6b, 0x39, + 0x92, 0xed, 0xa5, 0xe0, 0xb3, 0x81, 0xc0, 0x56, + 0x3a, 0xf1, 0x77, 0x44, 0x53, 0x91, 0x52, 0x34, + 0xc5, 0xf8, 0xd3, 0xf2, 0xcd, 0x23, 0xcd, 0x22, + 0xbe, 0xc5, 0xf9, 0xdc, 0x75, 0xe5, 0x96, 0x3e, + 0x2a, 0x01, 0xee, 0x82, 0xbc, 0xd1, 0xb6, 0x6e, + 0xb5, 0xd4, 0xf8, 0xb7, 0x3f, 0xeb, 0x2e, 0xac, + 0xe4, 0xb9, 0x7d, 0x7f, 0xf7, 0x3a, 0x4a, 0x7e, + 0xe8, 0x08, 0x3a, 0x72, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x20, 0xde, 0x11, 0x06, 0xf0, + 0x82, 0x81, 0xa3, 0x7f, 0xbe, 0x2f, 0xb9, 0xae, + 0x3e, 0xd0, 0x2e, 0x90, 0xb9, 0xbe, 0x8d, 0xfe, + 0xf8, 0xbe, 0xe6, 0xb8, 0xfb, 0x40, 0xba, 0x42, + 0xc7, 0x0f, 0xb1, 0xe7, 0x4b, 0xd3, 0xf8, 0xcf, + 0x33, 0x4f, 0xaa, 0xb7, 0xa9, 0x17, 0x9b, 0xfa, + 0x98, 0xfc, 0x3f, 0x80, 0xac, 0xd6, 0x9e, 0x8d, + 0x17, 0x82, 0x3b, 0x4b, 0x0e, 0x6f, 0xea, 0x63, + 0xf0, 0xfe, 0x02, 0xb3, 0x5a, 0x7a, 0x34, 0x5e, + 0x08, 0xed, 0x2e, 0x2b, 0x3f, 0xd9, 0xe2, 0x3d, + 0x55, 0x0e, 0x3a, 0xb9, 0x7b, 0x7b, 0xf2, 0xca, + 0x88, 0x8b, 0xd3, 0x60, 0x22, 0x22, 0x02, 0x2c, + 0x37, 0x57, 0x76, 0xb6, 0x70, 0x99, 0xee, 0xe5, + 0x64, 0x10, 0x82, 0x01, 0x92, 0x42, 0x1a, 0xda, + 0x9d, 0xc2, 0xa5, 0x79, 0x67, 0x7f, 0x63, 0x7c, + 0xc7, 0x49, 0x65, 0x71, 0x1d, 0xcb, 0x18, 0x78, + 0x5c, 0xe8, 0xdc, 0x1c, 0x01, 0xdf, 0x43, 0x44, + 0x19, 0xd1, 0x7c, 0x4d, 0x34, 0x50, 0x44, 0xf9, + 0xa7, 0x78, 0x8e, 0x28, 0xc7, 0x13, 0xde, 0xe3, + 0x46, 0xb4, 0x0e, 0x52, 0x56, 0x0b, 0x3c, 0xae, + 0x32, 0xf9, 0xce, 0x65, 0x95, 0xd4, 0x57, 0x2e, + 0x60, 0xab, 0xc4, 0x4e, 0x0e, 0x20, 0x1e, 0x53, + 0x44, 0x1b, 0x48, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x8b, + 0xe6, 0x49, 0x23, 0x8a, 0x37, 0x4b, 0x2b, 0x83, + 0x23, 0x60, 0x2e, 0x7b, 0xdd, 0xb0, 0x00, 0x36, + 0x92, 0x56, 0xbd, 0x9e, 0x57, 0x19, 0x7c, 0xe7, + 0x32, 0xca, 0xea, 0x2b, 0x97, 0x30, 0x71, 0x3d, + 0xb1, 0x3c, 0x38, 0x81, 0xba, 0xa6, 0x88, 0x36, + 0x91, 0x11, 0x01, 0x11, 0x10, 0x16, 0x86, 0x5b, + 0x3b, 0x8b, 0xc3, 0x32, 0x37, 0xe4, 0xa6, 0xe8, + 0x1b, 0x31, 0x2d, 0x8c, 0xf0, 0xb9, 0xd5, 0x2d, + 0x15, 0x3d, 0xe8, 0x2b, 0x7d, 0x63, 0x96, 0xda, + 0xde, 0xe3, 0x84, 0x4f, 0x13, 0x26, 0x0d, 0x35, + 0x68, 0x91, 0xa1, 0xd4, 0xfd, 0xa0, 0x82, 0x08, + 0xeb, 0xed, 0x28, 0x05, 0x4d, 0xed, 0x07, 0x93, + 0x93, 0xe8, 0xad, 0xab, 0xdd, 0x59, 0x80, 0xb0, + 0x74, 0x2d, 0xba, 0xba, 0xe8, 0xcd, 0xcc, 0x4d, + 0x9e, 0x2e, 0xe1, 0xe6, 0xb1, 0xbf, 0xbd, 0x76, + 0xc6, 0xf2, 0xaa, 0xf6, 0x8e, 0xb3, 0xb4, 0x97, + 0x50, 0xea, 0x16, 0x4b, 0x04, 0x72, 0x32, 0x39, + 0xa8, 0xc6, 0xb9, 0x8d, 0x70, 0x6f, 0x77, 0x20, + 0xee, 0x41, 0x1b, 0x16, 0x9e, 0xba, 0xc7, 0x8b, + 0xdd, 0x49, 0x0d, 0xa3, 0x05, 0x0f, 0xe1, 0xcf, + 0x74, 0x6d, 0x6e, 0xc0, 0x0c, 0x62, 0x57, 0xb4, + 0x01, 0xee, 0x51, 0x05, 0xe3, 0x25, 0x96, 0xc7, + 0xe2, 0xad, 0x45, 0xdd, 0xfc, 0xbd, 0x14, 0x0e, + 0x70, 0x63, 0x5d, 0x42, 0xea, 0xb9, 0xc0, 0x90, + 0x28, 0xd0, 0x4f, 0x22, 0xfb, 0xc7, 0xe4, 0x6c, + 0xf2, 0x56, 0x8d, 0xbc, 0xb2, 0x7f, 0x4b, 0x6e, + 0xf2, 0x43, 0x5f, 0x42, 0xda, 0x96, 0x9a, 0x1d, + 0x8e, 0xa1, 0xde, 0xb9, 0xe6, 0x4b, 0x20, 0x73, + 0xf8, 0xec, 0x15, 0x80, 0x77, 0x17, 0x47, 0x6b, + 0x35, 0xcd, 0xd6, 0xdd, 0xb5, 0x81, 0x8e, 0x60, + 0xaf, 0xfc, 0x7e, 0xfa, 0xb4, 0xfb, 0x3d, 0xa9, + 0xd2, 0x96, 0x84, 0xfe, 0x94, 0xbe, 0x39, 0x41, + 0x63, 0x44, 0x44, 0x04, 0x44, 0x41, 0x19, 0x96, + 0xfa, 0xe8, 0x79, 0x8f, 0x6d, 0x4d, 0xb7, 0xbd, + 0x1c, 0xca, 0x13, 0x2d, 0xf5, 0xd0, 0xf3, 0x1e, + 0xda, 0x9b, 0x6f, 0x7a, 0x39, 0x97, 0x9d, 0x83, + 0xe7, 0xb1, 0xda, 0x6d, 0x7e, 0x99, 0x74, 0x5d, + 0xe0, 0xd9, 0xd1, 0x56, 0xb6, 0x1b, 0xcf, 0x45, + 0x9b, 0xc9, 0xbf, 0xc5, 0x2a, 0xa5, 0xa1, 0x37, + 0x5e, 0x7f, 0x2b, 0xe7, 0xab, 0x6d, 0xe7, 0xa2, + 0xcd, 0xe4, 0xdf, 0xe2, 0x95, 0x52, 0xd0, 0x9b, + 0xaf, 0x3f, 0x95, 0xf3, 0xd7, 0xab, 0x4e, 0xc5, + 0x5d, 0xe7, 0x0d, 0x7c, 0x6b, 0x5e, 0x72, 0xd6, + 0x88, 0x8b, 0x36, 0xc2, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x2d, 0x5b, + 0xdc, 0xae, 0x33, 0x1e, 0x58, 0xdb, 0xeb, 0xa8, + 0xad, 0x8c, 0x80, 0x96, 0x09, 0x5c, 0x1b, 0xc4, + 0x06, 0xfa, 0x55, 0x6b, 0x7e, 0x68, 0xd3, 0x7f, + 0xd4, 0xed, 0xbf, 0xe4, 0x08, 0x24, 0xd1, 0x46, + 0x7e, 0x68, 0xd3, 0x7f, 0xd4, 0xed, 0xbf, 0xe4, + 0x0b, 0x3f, 0xe3, 0x38, 0x9f, 0x33, 0xf3, 0xff, + 0x00, 0x3c, 0x87, 0xcc, 0xc3, 0xb8, 0x0d, 0xc7, + 0x18, 0xe0, 0xe2, 0xdd, 0xc3, 0xc5, 0xd5, 0x41, + 0xb8, 0x8b, 0x05, 0x9d, 0xfd, 0x8d, 0xfc, 0x66, + 0x5b, 0x29, 0xe3, 0xb9, 0x8d, 0xa7, 0x85, 0xcf, + 0x8d, 0xdc, 0x40, 0x3b, 0x7d, 0x36, 0x2c, 0xe8, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x22, 0x72, 0xba, + 0xab, 0x07, 0x87, 0xb9, 0x16, 0xb9, 0x09, 0xcc, + 0x53, 0x39, 0x82, 0x40, 0xd0, 0xc7, 0x3b, 0xb9, + 0x24, 0x80, 0x6a, 0xd1, 0xd6, 0x5a, 0xb1, 0x6b, + 0xcd, 0x2f, 0x34, 0xcc, 0x85, 0x97, 0x4e, 0x32, + 0x48, 0xe0, 0xc6, 0x03, 0x1b, 0xc5, 0x5c, 0xe3, + 0x41, 0xc8, 0xa5, 0x72, 0x36, 0xb6, 0xd2, 0xda, + 0x5c, 0x3e, 0x48, 0x63, 0x7b, 0xc4, 0x32, 0x51, + 0xce, 0x68, 0x71, 0xd8, 0xd3, 0xca, 0x42, 0xad, + 0x7b, 0x35, 0xb6, 0xb6, 0x93, 0x4e, 0x09, 0x24, + 0x89, 0x8f, 0x90, 0x5c, 0x49, 0x47, 0xb9, 0xa0, + 0xbb, 0x60, 0x65, 0x36, 0x90, 0x82, 0x6c, 0xea, + 0x8c, 0x23, 0x72, 0xbf, 0x83, 0x99, 0xc8, 0xbe, + 0xe9, 0x3a, 0x2e, 0x8f, 0x81, 0xd4, 0xe3, 0x22, + 0xb4, 0xe2, 0xa5, 0x17, 0xde, 0x5f, 0x51, 0xe2, + 0x30, 0xae, 0x8d, 0x99, 0x19, 0x8c, 0x4e, 0x98, + 0x17, 0x46, 0x03, 0x5c, 0xea, 0x86, 0x9a, 0x13, + 0xdc, 0x8d, 0x8b, 0x9d, 0xe7, 0xe2, 0x91, 0xba, + 0x8b, 0x37, 0x92, 0x8a, 0xbd, 0x2e, 0x36, 0xe2, + 0x09, 0xc7, 0x31, 0x73, 0x5a, 0x7d, 0xfa, 0x2c, + 0x9a, 0xc6, 0xe1, 0x99, 0x9b, 0xfc, 0x85, 0xf4, + 0x67, 0x8a, 0xdf, 0x1d, 0x6b, 0x6e, 0xc8, 0xc8, + 0xdd, 0xc7, 0x33, 0x9a, 0xe3, 0xe3, 0x14, 0x1d, + 0x3e, 0x19, 0xa3, 0x9e, 0x18, 0xe7, 0x88, 0xd6, + 0x39, 0x5a, 0x1e, 0xc3, 0xba, 0xad, 0x70, 0xe2, + 0x1e, 0xf1, 0x5f, 0x6b, 0x57, 0x13, 0xea, 0xab, + 0x2f, 0xfc, 0x78, 0xbc, 0x46, 0xad, 0xa4, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x11, 0xda, 0x8f, 0xd4, 0x77, 0x9e, 0x4f, + 0xe7, 0x35, 0x6b, 0xe8, 0x6f, 0x53, 0x3b, 0xcb, + 0xbf, 0xb4, 0xd5, 0xb1, 0xa8, 0xfd, 0x47, 0x79, + 0xe4, 0xfe, 0x73, 0x56, 0xbe, 0x86, 0xf5, 0x33, + 0xbc, 0xbb, 0xfb, 0x4d, 0x57, 0x8e, 0x1c, 0xe9, + 0x63, 0x3c, 0xc5, 0x3b, 0x93, 0xad, 0x62, 0x44, + 0x45, 0x46, 0xc2, 0x22, 0x20, 0x22, 0x22, 0x02, + 0xd5, 0xc8, 0x7a, 0x15, 0xcf, 0x92, 0x7f, 0x8a, + 0x56, 0xd2, 0xd5, 0xc8, 0x7a, 0x15, 0xcf, 0x92, + 0x7f, 0x8a, 0x54, 0xd3, 0x9e, 0x15, 0xb9, 0xb1, + 0x56, 0x89, 0xd4, 0x82, 0xd2, 0x7e, 0x8f, 0x71, + 0xe1, 0xb7, 0xc5, 0x53, 0xca, 0x07, 0x49, 0xfa, + 0x3d, 0xc7, 0x86, 0xdf, 0x15, 0x4f, 0x2d, 0x31, + 0x1c, 0x5a, 0xb4, 0xfd, 0xcc, 0x30, 0x3c, 0xb5, + 0xbd, 0x13, 0xac, 0x44, 0x45, 0x93, 0xa4, 0x44, + 0x44, 0x18, 0x6f, 0x7d, 0x0a, 0xe7, 0xc8, 0xc9, + 0xe2, 0x95, 0xc2, 0x59, 0x13, 0xdf, 0x13, 0xde, + 0xd1, 0x56, 0xc6, 0x01, 0x7f, 0x58, 0x38, 0xf0, + 0x8f, 0x7d, 0x77, 0x6b, 0xdf, 0x42, 0xb9, 0xf2, + 0x32, 0x78, 0xa5, 0x72, 0x3d, 0x2b, 0x63, 0xe7, + 0xf1, 0xe5, 0xad, 0x80, 0xab, 0x8d, 0x83, 0xde, + 0xcf, 0x0a, 0x37, 0xb2, 0x46, 0xf6, 0x90, 0x74, + 0x9d, 0x1b, 0x7d, 0xe7, 0xfa, 0x72, 0xc6, 0x52, + 0x6a, 0xf8, 0xd9, 0xd0, 0x3c, 0xf5, 0xe2, 0x3c, + 0x1d, 0xaa, 0x2e, 0x5f, 0xa8, 0xae, 0x9d, 0x93, + 0xce, 0xe4, 0x6e, 0xd9, 0xdd, 0x46, 0xd7, 0xba, + 0x87, 0xa9, 0x1b, 0x08, 0x89, 0xbf, 0x02, 0xb0, + 0x68, 0x8c, 0xe8, 0xb0, 0xd3, 0xf9, 0xa8, 0xdc, + 0x68, 0xeb, 0x68, 0xfc, 0xe6, 0x11, 0xd7, 0x78, + 0xe8, 0xb6, 0x7c, 0xae, 0x15, 0x0d, 0x8b, 0xb2, + 0xae, 0x97, 0xcd, 0x64, 0x1f, 0xb4, 0x8e, 0x82, + 0x06, 0x3b, 0xae, 0x64, 0x6c, 0x8f, 0xed, 0x04, + 0x16, 0xef, 0x65, 0x82, 0xb8, 0x9b, 0xc1, 0xff, + 0x00, 0xf7, 0x23, 0xc4, 0x6a, 0xab, 0xe4, 0xa4, + 0x9f, 0x52, 0xea, 0xf3, 0x6b, 0x75, 0x38, 0x82, + 0x37, 0xce, 0xeb, 0x78, 0x4b, 0xfb, 0xd8, 0xd8, + 0xc2, 0x45, 0x00, 0x34, 0xda, 0x78, 0x7b, 0x2a, + 0xd1, 0xec, 0xb7, 0xd5, 0x17, 0xbf, 0xf9, 0x23, + 0xc4, 0x0b, 0x53, 0x56, 0xe8, 0x2b, 0xcb, 0x8b, + 0xd9, 0x72, 0x58, 0x70, 0x24, 0xe9, 0xc9, 0x7c, + 0xd6, 0xc4, 0x86, 0xb8, 0x3c, 0xef, 0x74, 0x64, + 0xd0, 0x1a, 0xf5, 0x10, 0x6c, 0x5d, 0xfb, 0x2d, + 0xb1, 0x16, 0xcf, 0xf3, 0x4b, 0xb9, 0x85, 0xc8, + 0x69, 0x2c, 0x32, 0x06, 0x96, 0x39, 0xc3, 0x90, + 0x86, 0x80, 0x45, 0x56, 0x87, 0xb3, 0xef, 0xc7, + 0x71, 0xf9, 0x53, 0x67, 0x3d, 0xad, 0xc3, 0x2c, + 0x2e, 0x5a, 0xee, 0x3e, 0x36, 0x38, 0x31, 0x92, + 0x34, 0x55, 0xae, 0x04, 0x8a, 0x0a, 0xd2, 0x8a, + 0x1d, 0x99, 0x9d, 0x67, 0x80, 0x22, 0x39, 0x24, + 0xb9, 0x81, 0x8d, 0xd8, 0x23, 0xb9, 0x69, 0x7c, + 0x7b, 0x3a, 0x9d, 0x20, 0x23, 0xb0, 0x55, 0xc3, + 0x49, 0xeb, 0xbf, 0xc6, 0x2e, 0x06, 0x3a, 0xfe, + 0x36, 0xc3, 0x78, 0xe0, 0x4c, 0x52, 0x32, 0xbc, + 0x12, 0x10, 0x2a, 0x5b, 0x43, 0xde, 0xba, 0x88, + 0x22, 0xfd, 0xab, 0x7d, 0x7e, 0x37, 0xc0, 0x97, + 0xb6, 0xc5, 0x8b, 0x09, 0xec, 0xee, 0xd7, 0x29, + 0x88, 0xb5, 0xc8, 0x3e, 0xfa, 0x48, 0x9f, 0x72, + 0xce, 0x33, 0x18, 0x63, 0x48, 0x1b, 0x48, 0xde, + 0x4f, 0x59, 0x65, 0xf6, 0xad, 0xf5, 0xf8, 0xdf, + 0x02, 0x5e, 0xdb, 0x56, 0x8e, 0x23, 0xda, 0x2c, + 0xd8, 0xbc, 0x65, 0xbe, 0x3d, 0xb6, 0x51, 0xcb, + 0xe6, 0xcc, 0xe0, 0x0f, 0x74, 0x84, 0x13, 0xb4, + 0x9d, 0xa3, 0x87, 0xae, 0x82, 0x37, 0x51, 0x69, + 0xfb, 0xcd, 0x2d, 0x91, 0x80, 0xc5, 0x70, 0x5f, + 0xc6, 0x3a, 0x4b, 0x6b, 0x96, 0x77, 0x0f, 0x05, + 0xa7, 0x68, 0x23, 0x6d, 0x08, 0x5d, 0x4f, 0x01, + 0x90, 0x7e, 0x4f, 0x0d, 0x67, 0x7d, 0x20, 0x02, + 0x49, 0xe3, 0x06, 0x4a, 0x6e, 0xe2, 0x1d, 0xcb, + 0xa9, 0xee, 0x85, 0xcb, 0x32, 0x59, 0x3c, 0xce, + 0xb0, 0xc9, 0xc4, 0xd6, 0x40, 0x1d, 0x23, 0x47, + 0x47, 0x0c, 0x10, 0x82, 0x5a, 0xc0, 0x4d, 0x5c, + 0x5c, 0xe3, 0xef, 0x92, 0xba, 0x4f, 0x4b, 0x6b, + 0xa4, 0xf4, 0xcc, 0x42, 0xe1, 0xdc, 0x6d, 0xb2, + 0x88, 0x30, 0x01, 0xff, 0x00, 0xa9, 0x29, 0xf8, + 0xad, 0xe7, 0x71, 0xec, 0x20, 0x8c, 0xd7, 0xda, + 0x90, 0xe3, 0x6c, 0xff, 0x00, 0x0c, 0xb4, 0x77, + 0xff, 0x00, 0x3a, 0xf1, 0xb4, 0x71, 0x6e, 0xf6, + 0x44, 0x76, 0x13, 0xce, 0xed, 0xc1, 0x55, 0xbd, + 0x9b, 0x8a, 0x6a, 0x76, 0x83, 0xc9, 0x04, 0xbb, + 0x3b, 0x0a, 0x4b, 0x46, 0xe2, 0x6e, 0xb3, 0xd9, + 0x69, 0xb5, 0x36, 0x50, 0x74, 0x8c, 0x63, 0xc9, + 0x84, 0x11, 0xdc, 0xba, 0x50, 0x36, 0x53, 0xf5, + 0x63, 0x1e, 0xfa, 0x8f, 0xf6, 0x79, 0x5f, 0xcd, + 0x8e, 0xf2, 0x53, 0xf6, 0xc2, 0x0b, 0x6e, 0xbd, + 0x6e, 0x76, 0x6c, 0x63, 0x2d, 0x31, 0x10, 0x4b, + 0x2b, 0x66, 0x71, 0x37, 0x4e, 0x87, 0xbe, 0x0c, + 0x6e, 0xe6, 0x6f, 0xaf, 0x74, 0x77, 0xd1, 0x57, + 0xed, 0x3d, 0x9b, 0x35, 0xf8, 0x3f, 0x3c, 0xb9, + 0xb9, 0x7c, 0x17, 0xee, 0x88, 0xca, 0x21, 0xe1, + 0x01, 0x8c, 0xa0, 0xe2, 0x0c, 0x7d, 0x76, 0xee, + 0xde, 0xba, 0x32, 0xa5, 0xeb, 0x86, 0xea, 0xdb, + 0x89, 0xa4, 0x83, 0x17, 0x1c, 0xae, 0xc5, 0xf4, + 0x03, 0xa7, 0xe8, 0xb8, 0x6a, 0xf2, 0x6a, 0x5e, + 0x3f, 0x4c, 0xec, 0xde, 0x02, 0x08, 0xef, 0x65, + 0xf9, 0x4b, 0x9f, 0x3c, 0x9f, 0x16, 0xe7, 0x17, + 0x5b, 0x18, 0x8c, 0xec, 0x69, 0x35, 0x0c, 0x73, + 0x4b, 0x5a, 0x78, 0x7a, 0x81, 0xdc, 0x49, 0xed, + 0x37, 0x33, 0x33, 0xae, 0xe2, 0xc3, 0x44, 0xe2, + 0x21, 0x63, 0x04, 0xb3, 0xb4, 0x1e, 0xfd, 0xef, + 0xef, 0x1a, 0x7a, 0xc0, 0x2d, 0x8f, 0x66, 0x97, + 0x58, 0x46, 0x74, 0xb6, 0xb1, 0x87, 0xb3, 0x2b, + 0x2b, 0x6a, 0xf7, 0x49, 0x4a, 0x3d, 0x8d, 0xf8, + 0xb1, 0x53, 0x75, 0x37, 0x90, 0x76, 0xa8, 0x1d, + 0x68, 0x78, 0xf5, 0x9d, 0xc0, 0x76, 0xe1, 0x24, + 0x0d, 0xf7, 0x38, 0x63, 0x41, 0xbd, 0x9a, 0xf6, + 0x7e, 0x31, 0xba, 0x7f, 0xf1, 0x26, 0xdc, 0x3a, + 0x4b, 0x98, 0x5a, 0xd7, 0xdc, 0x42, 0x40, 0x0c, + 0xa3, 0xa8, 0x1c, 0x19, 0xcb, 0xdc, 0xd7, 0x95, + 0x58, 0x7d, 0x9d, 0x66, 0xa6, 0xc8, 0x62, 0xa4, + 0xb4, 0xb9, 0x79, 0x92, 0x6b, 0x17, 0x06, 0xb5, + 0xce, 0xda, 0x4c, 0x6f, 0x07, 0x86, 0xbc, 0xd4, + 0x21, 0x4c, 0x6a, 0xa0, 0x0e, 0x9b, 0xc9, 0x8e, + 0x4f, 0x36, 0x93, 0xde, 0x0a, 0x9b, 0xec, 0xa9, + 0xc7, 0xcf, 0xb2, 0x0d, 0xe4, 0x30, 0xb0, 0x9e, + 0x70, 0xff, 0x00, 0xfe, 0xa8, 0x2c, 0x9a, 0x83, + 0x07, 0x90, 0xbf, 0xd4, 0x18, 0x6b, 0xfb, 0x66, + 0xb4, 0xdb, 0xd8, 0x3f, 0x8a, 0xe0, 0xb9, 0xc1, + 0xa4, 0x0e, 0x30, 0xed, 0x83, 0x97, 0x60, 0x5b, + 0x1a, 0xc3, 0x15, 0x79, 0x97, 0xc0, 0xcd, 0x63, + 0x64, 0x1a, 0xe9, 0xe4, 0x7c, 0x6e, 0x68, 0x7b, + 0x83, 0x45, 0x1a, 0xea, 0x9d, 0xa5, 0x4d, 0x22, + 0x0a, 0x46, 0x77, 0x45, 0x5f, 0x64, 0x72, 0x58, + 0xb9, 0xe2, 0x0c, 0xe8, 0x63, 0x86, 0x08, 0x6f, + 0xea, 0xe0, 0x0f, 0xf0, 0x88, 0x07, 0x84, 0x7c, + 0x6e, 0xe5, 0x4b, 0xd8, 0x61, 0x6f, 0xad, 0xf5, + 0x7e, 0x4b, 0x2d, 0x23, 0x5a, 0x2c, 0xee, 0xa2, + 0x6b, 0x21, 0x21, 0xc0, 0xba, 0xa0, 0x47, 0xbd, + 0xbc, 0x9d, 0xe9, 0x56, 0x04, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x51, 0xfa, 0x83, 0xd5, 0x33, + 0xfc, 0x9f, 0x18, 0x29, 0x05, 0x1f, 0xa8, 0x3d, + 0x53, 0x3f, 0xc9, 0xf1, 0x82, 0xbd, 0xbd, 0xba, + 0x74, 0xc3, 0x2c, 0x4f, 0x02, 0xee, 0xe5, 0x7a, + 0x9e, 0xe9, 0x5f, 0x54, 0x37, 0xc3, 0x7f, 0x6d, + 0x4b, 0x3f, 0x72, 0x89, 0xd2, 0xbe, 0xa8, 0x6f, + 0x86, 0xfe, 0xda, 0x96, 0x7e, 0xe5, 0x37, 0x78, + 0xb5, 0xef, 0x4a, 0x30, 0xdc, 0x0b, 0x7b, 0xb0, + 0xe7, 0x37, 0x5f, 0xe4, 0xf1, 0xe5, 0x59, 0xf6, + 0x21, 0x5f, 0xd5, 0x02, 0xeb, 0xfc, 0x9e, 0x3c, + 0xab, 0x3e, 0xc4, 0x2b, 0xfa, 0xe5, 0xb3, 0x9e, + 0xbd, 0xf9, 0x7b, 0x1f, 0x14, 0xcd, 0x83, 0xfe, + 0x35, 0xb1, 0x11, 0x16, 0xcf, 0x34, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x55, 0xcd, 0x6f, 0xa8, 0xa5, + 0xc2, 0x63, 0x1a, 0xdb, 0x53, 0xc3, 0x7b, 0x76, + 0x4b, 0x21, 0x76, 0xfe, 0x06, 0xb4, 0x77, 0x72, + 0x73, 0x8a, 0x80, 0x15, 0x8d, 0x73, 0x6f, 0x6a, + 0x4f, 0x71, 0xca, 0xd9, 0x33, 0xe2, 0xb6, 0xdc, + 0x90, 0x3a, 0xe5, 0xe6, 0xbd, 0xa4, 0x1a, 0xda, + 0x63, 0x44, 0xcf, 0x9f, 0x89, 0xd9, 0x3b, 0xeb, + 0x87, 0x43, 0x6f, 0x23, 0x88, 0x6b, 0x80, 0xe2, + 0x96, 0x52, 0x3b, 0xe7, 0x55, 0xdc, 0x95, 0xe5, + 0x5f, 0x5a, 0xa3, 0x41, 0x3f, 0x0f, 0x6b, 0xf8, + 0x85, 0x8c, 0xcf, 0xb9, 0x82, 0x32, 0x04, 0xac, + 0x78, 0xa4, 0x8d, 0xa9, 0xa0, 0x73, 0x4b, 0x77, + 0x8a, 0xab, 0xe6, 0x95, 0x63, 0x59, 0xa6, 0xb1, + 0x81, 0xbb, 0xbc, 0xd9, 0x87, 0xdd, 0x70, 0xa9, + 0xf7, 0xd4, 0xa2, 0x0a, 0xde, 0x85, 0xc8, 0xe5, + 0x2e, 0xf1, 0x26, 0x3c, 0xa4, 0x52, 0xb6, 0x4b, + 0x67, 0x06, 0xc5, 0x3c, 0xad, 0x70, 0x32, 0x46, + 0x46, 0xcd, 0xae, 0xef, 0x8b, 0x77, 0x2a, 0x61, + 0xb0, 0xcb, 0x6a, 0xbd, 0x50, 0x59, 0x7c, 0x25, + 0xb6, 0x8e, 0x47, 0x3d, 0xc1, 0xd2, 0x31, 0xc0, + 0x45, 0x0b, 0x37, 0x35, 0x81, 0xc0, 0x0a, 0xd3, + 0xdf, 0x5d, 0x5e, 0xb5, 0x5f, 0x32, 0xcd, 0x1c, + 0x51, 0x3e, 0x59, 0x9e, 0x23, 0x8a, 0x30, 0x5c, + 0xf7, 0xb8, 0xd1, 0xad, 0x03, 0x79, 0x25, 0x07, + 0x2e, 0xd5, 0xda, 0x36, 0x2d, 0x3d, 0x05, 0xbd, + 0xf5, 0x9d, 0xcb, 0xe5, 0x8d, 0xf2, 0x74, 0x6e, + 0x0f, 0xa0, 0x7b, 0x5f, 0x42, 0xf6, 0xb9, 0xa5, + 0xb4, 0xfd, 0x15, 0x70, 0xd3, 0xba, 0x82, 0x59, + 0xb4, 0x87, 0xe2, 0xd7, 0xa7, 0x8e, 0x5b, 0x48, + 0xe5, 0x12, 0xb8, 0xfc, 0x73, 0x0d, 0x68, 0x4f, + 0x5d, 0xdb, 0x15, 0x3b, 0x55, 0x6a, 0x19, 0xf5, + 0x4e, 0x4a, 0x0c, 0x76, 0x32, 0x37, 0x3e, 0xda, + 0x37, 0xf0, 0xdb, 0xb4, 0x0e, 0xea, 0x59, 0x0e, + 0xce, 0x90, 0x8e, 0x41, 0x4d, 0xdd, 0x6d, 0xaa, + 0xd3, 0x96, 0xc6, 0x0c, 0x2f, 0xb3, 0xfb, 0x8c, + 0x7b, 0x4f, 0x13, 0xa3, 0x84, 0x09, 0x5c, 0x37, + 0x17, 0xbd, 0xed, 0x32, 0x1e, 0x6a, 0x94, 0x15, + 0x0d, 0x3d, 0x88, 0xb8, 0xd6, 0x19, 0x8b, 0x99, + 0xef, 0xee, 0x1e, 0xd0, 0xd6, 0xf4, 0xb3, 0xc8, + 0x28, 0x5d, 0x57, 0x1a, 0x35, 0x8d, 0xae, 0xc0, + 0x17, 0xcd, 0xc4, 0x77, 0x3a, 0x2b, 0x54, 0xb4, + 0x43, 0x2b, 0xa4, 0x89, 0x9c, 0x0f, 0x24, 0xec, + 0xe9, 0x20, 0x7f, 0x7c, 0xd7, 0x81, 0xb3, 0xab, + 0xee, 0x85, 0x39, 0xec, 0xa8, 0x0a, 0xe4, 0xdd, + 0xcb, 0xfc, 0x11, 0xee, 0x77, 0x6b, 0x43, 0xda, + 0x88, 0x1f, 0x8e, 0x40, 0x79, 0x4d, 0xab, 0x6b, + 0xee, 0x3d, 0xe8, 0x2e, 0x5a, 0xcb, 0x34, 0xfc, + 0x5e, 0x9e, 0x92, 0xe6, 0xd5, 0xd4, 0x9e, 0xe3, + 0x86, 0x2b, 0x77, 0x8d, 0xe0, 0xc8, 0x09, 0xe2, + 0x1d, 0x70, 0xd0, 0x55, 0x2b, 0x4a, 0x68, 0x96, + 0x67, 0xec, 0x66, 0xc8, 0x5d, 0x5c, 0xbe, 0x10, + 0x64, 0x74, 0x70, 0xf0, 0x80, 0xe2, 0x5c, 0x05, + 0x5c, 0xf7, 0x97, 0x6f, 0xda, 0x54, 0x8e, 0xbc, + 0x91, 0xee, 0xd2, 0xb8, 0x3a, 0xfc, 0x60, 0xc2, + 0x79, 0xc4, 0x21, 0x4e, 0x7b, 0x3b, 0x00, 0x69, + 0x5b, 0x72, 0x39, 0x65, 0x98, 0x9f, 0xdb, 0x28, + 0x2a, 0x9a, 0x23, 0x21, 0x75, 0x87, 0xd4, 0x8e, + 0xc3, 0x4c, 0xe3, 0xd0, 0xcf, 0x23, 0xed, 0xe5, + 0x8f, 0xe2, 0x89, 0x59, 0x50, 0xd7, 0xb7, 0x9e, + 0x94, 0x53, 0x3e, 0xd3, 0x33, 0x33, 0x5a, 0xdb, + 0x5b, 0xe2, 0xe0, 0x79, 0x67, 0x9d, 0x07, 0x49, + 0x70, 0x46, 0xc2, 0x63, 0x69, 0xe1, 0x0d, 0xe6, + 0x26, 0xb5, 0xe6, 0x55, 0xcb, 0xc2, 0x63, 0xf6, + 0x82, 0xe2, 0xdd, 0xff, 0x00, 0x88, 0xb7, 0xdf, + 0x7b, 0x6a, 0xb6, 0x7d, 0xa8, 0x38, 0x9d, 0x40, + 0xc6, 0xf2, 0x36, 0xd5, 0x94, 0xf7, 0x5c, 0xf4, + 0x19, 0x23, 0xf6, 0x7d, 0xc7, 0xa6, 0x3f, 0x14, + 0xe9, 0xdc, 0x2f, 0x1d, 0x0f, 0x9c, 0xb6, 0x0e, + 0x11, 0xc1, 0xc1, 0x4e, 0x2e, 0x0e, 0xad, 0x78, + 0x54, 0x97, 0xb3, 0x2c, 0xd4, 0xd3, 0xc7, 0x3e, + 0x22, 0x67, 0x17, 0xb6, 0x06, 0x89, 0xad, 0x89, + 0xda, 0x43, 0x09, 0xe1, 0x7b, 0x39, 0x81, 0x20, + 0x85, 0x6d, 0xb7, 0x6b, 0x46, 0x0a, 0x36, 0xfc, + 0x5f, 0x33, 0x68, 0xf7, 0x3a, 0x25, 0xce, 0x3d, + 0x99, 0xb8, 0x8d, 0x48, 0x1a, 0x37, 0x3a, 0xda, + 0x5a, 0xfb, 0x9c, 0x25, 0x05, 0xcb, 0x59, 0xe0, + 0xf2, 0x19, 0x88, 0xac, 0x1b, 0x62, 0xd6, 0xb8, + 0xdb, 0xcf, 0xd2, 0xc9, 0xc6, 0xe0, 0xce, 0xe6, + 0x83, 0x75, 0x54, 0xa6, 0xa0, 0xb3, 0x9e, 0xff, + 0x00, 0x0b, 0x7b, 0x65, 0x6c, 0x01, 0x9e, 0xe2, + 0x22, 0xc8, 0xc3, 0x8d, 0x05, 0x4d, 0x37, 0x95, + 0xbe, 0x88, 0x28, 0x59, 0x9d, 0x11, 0x96, 0xbd, + 0xc3, 0x61, 0xa0, 0x81, 0xb1, 0xf9, 0xdd, 0x94, + 0x4e, 0x82, 0xea, 0xaf, 0x00, 0x06, 0xb8, 0xf1, + 0x0e, 0x17, 0x72, 0xd3, 0x6a, 0x98, 0x66, 0x9e, + 0xbc, 0x87, 0x56, 0x59, 0xe4, 0x62, 0x6b, 0x7f, + 0x0f, 0xb5, 0xb3, 0x16, 0xdc, 0x5c, 0x40, 0x3b, + 0x89, 0xad, 0x73, 0x7b, 0xcd, 0xfc, 0xaa, 0xca, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x83, 0x78, 0x44, 0x1b, 0xc2, 0x0a, 0x06, + 0x8d, 0xfe, 0xf8, 0xbe, 0xe6, 0xb8, 0xfb, 0x40, + 0xba, 0x42, 0xe6, 0xfa, 0x37, 0xfb, 0xe2, 0xfb, + 0x9a, 0xe3, 0xed, 0x02, 0xe9, 0x0b, 0x1c, 0x3e, + 0xc7, 0x9d, 0x2f, 0x4f, 0xe3, 0x3c, 0xcd, 0x3e, + 0xaa, 0xde, 0xa4, 0x5e, 0x6f, 0xea, 0x63, 0xf0, + 0xfe, 0x02, 0xb3, 0x5a, 0x7a, 0x34, 0x5e, 0x08, + 0xed, 0x2c, 0x39, 0xbf, 0xa9, 0x8f, 0xc3, 0xf8, + 0x0a, 0xcd, 0x69, 0xe8, 0xd1, 0x78, 0x23, 0xb4, + 0xb8, 0xac, 0xff, 0x00, 0x67, 0x88, 0xf5, 0x54, + 0x38, 0xea, 0xe5, 0xed, 0xef, 0xcb, 0x2a, 0x22, + 0x2f, 0x4d, 0x80, 0x88, 0x88, 0x2b, 0x3e, 0xd1, + 0xbf, 0xb5, 0xe5, 0xf2, 0xd1, 0x78, 0xcb, 0x43, + 0xd9, 0x67, 0xaa, 0xaf, 0x7f, 0xf2, 0x07, 0x88, + 0x16, 0xff, 0x00, 0xb4, 0x6f, 0xed, 0x79, 0x7c, + 0xb4, 0x5e, 0x32, 0xa2, 0x69, 0xec, 0x96, 0xaa, + 0xb3, 0xb7, 0x95, 0x98, 0x36, 0x48, 0xf8, 0x5e, + 0xfa, 0xcb, 0xd1, 0xc2, 0x25, 0x1c, 0x74, 0xa6, + 0xf2, 0xd3, 0x4d, 0x88, 0x3a, 0x6e, 0xa9, 0xfe, + 0xdb, 0xc9, 0xff, 0x00, 0xe3, 0xbf, 0xb4, 0xa9, + 0x9e, 0xca, 0xfd, 0x61, 0x7f, 0xe4, 0x59, 0xe3, + 0xad, 0x1c, 0x86, 0x6b, 0x5e, 0xcd, 0x63, 0x3c, + 0x57, 0xd1, 0x4c, 0xdb, 0x47, 0xb0, 0x89, 0xcb, + 0xad, 0xc3, 0x47, 0x01, 0xdf, 0x57, 0x70, 0xec, + 0x5b, 0xde, 0xca, 0xbd, 0x61, 0x7f, 0xe4, 0x59, + 0xe3, 0xa0, 0xe8, 0x57, 0x37, 0x56, 0xd6, 0x90, + 0xba, 0x7b, 0xa9, 0x59, 0x04, 0x2d, 0xdf, 0x24, + 0x8e, 0x0d, 0x6f, 0x64, 0xa8, 0xfb, 0x7d, 0x57, + 0xa7, 0x2e, 0x65, 0x10, 0xc3, 0x90, 0x85, 0xd2, + 0x38, 0xd1, 0xad, 0x24, 0xb6, 0xa7, 0xac, 0x5e, + 0x00, 0x5c, 0xff, 0x00, 0x54, 0x5f, 0x4d, 0x9f, + 0xd5, 0x63, 0x1a, 0xe9, 0x84, 0x36, 0x90, 0xcc, + 0x2d, 0xa2, 0x2f, 0x34, 0x63, 0x28, 0x69, 0x24, + 0xa7, 0x92, 0xb5, 0xaa, 0xdf, 0xd4, 0x1a, 0x43, + 0x4d, 0x5b, 0x61, 0xe5, 0xb8, 0xc6, 0xdf, 0x35, + 0xd7, 0x56, 0xcd, 0xe3, 0x2d, 0x74, 0xcc, 0x7f, + 0x4a, 0x07, 0x7c, 0x38, 0x46, 0xe3, 0xcc, 0x83, + 0xa3, 0x2d, 0x18, 0x73, 0xb8, 0x59, 0xe6, 0x74, + 0x10, 0xdf, 0x41, 0x24, 0xcc, 0x0e, 0x2f, 0x8d, + 0xaf, 0x15, 0x01, 0x9d, 0xf9, 0x3d, 0x4e, 0x1e, + 0x55, 0x01, 0xec, 0xdb, 0x31, 0x3d, 0xfe, 0x36, + 0x4b, 0x3b, 0x87, 0x19, 0x24, 0xb1, 0x7b, 0x5b, + 0x1b, 0x9c, 0x6a, 0x7a, 0x27, 0x83, 0xc2, 0x0f, + 0x82, 0x41, 0x54, 0x2b, 0x5b, 0x29, 0xf2, 0x1a, + 0x85, 0xf8, 0xe8, 0x1e, 0x62, 0x75, 0xe5, 0xc4, + 0x90, 0xb9, 0xc3, 0x77, 0x01, 0x73, 0x8b, 0xeb, + 0xd5, 0x14, 0x1b, 0x90, 0x75, 0x9b, 0x1d, 0x43, + 0x84, 0xc8, 0x5c, 0x1b, 0x6b, 0x2b, 0xd8, 0xa7, + 0x9c, 0x54, 0xf4, 0x6d, 0x26, 0xa6, 0x9b, 0xe9, + 0x50, 0x2b, 0xee, 0x2c, 0xf7, 0xf9, 0x4c, 0x6e, + 0x35, 0x81, 0xf7, 0xf7, 0x31, 0xdb, 0x35, 0xdd, + 0xef, 0x48, 0xea, 0x13, 0xcc, 0xdd, 0xe5, 0x41, + 0x61, 0xf4, 0x7e, 0x3b, 0x4d, 0x5c, 0x4f, 0x95, + 0x64, 0xf2, 0x5c, 0x08, 0xad, 0xdf, 0xdc, 0xc8, + 0x1a, 0x0b, 0x69, 0xdd, 0xbd, 0xc0, 0xb7, 0xaa, + 0x05, 0x15, 0x2f, 0x0b, 0x65, 0x71, 0xac, 0xf5, + 0x14, 0x8f, 0xbf, 0x99, 0xc1, 0xa5, 0xae, 0x9a, + 0x67, 0x37, 0x78, 0x60, 0x34, 0x6c, 0x71, 0xd6, + 0xa0, 0x6f, 0x41, 0xd2, 0x2c, 0xb5, 0x2e, 0x02, + 0xfe, 0x51, 0x05, 0xa5, 0xf4, 0x32, 0x4c, 0xed, + 0x8d, 0x8e, 0xbc, 0x2e, 0x3c, 0xc1, 0xf4, 0xaa, + 0xdf, 0xb8, 0x9e, 0x0b, 0x68, 0x5f, 0x3d, 0xc4, + 0x8d, 0x8a, 0x18, 0xc5, 0x5f, 0x23, 0xcd, 0x1a, + 0x07, 0x54, 0x95, 0x43, 0xcf, 0x7b, 0x35, 0xe1, + 0xe8, 0x5f, 0x81, 0x2e, 0x73, 0xb8, 0xa9, 0x2c, + 0x73, 0xc8, 0x07, 0x08, 0x1b, 0x43, 0xda, 0xfa, + 0x05, 0x37, 0x96, 0x87, 0x23, 0x06, 0x83, 0xba, + 0x87, 0x28, 0xf6, 0x49, 0x79, 0x15, 0xb9, 0x64, + 0x92, 0x30, 0x97, 0x07, 0x51, 0xc0, 0x34, 0x92, + 0x40, 0xdb, 0x4d, 0xe8, 0x26, 0xec, 0xb2, 0x98, + 0xdc, 0x87, 0x1f, 0x98, 0xdc, 0xc7, 0x73, 0xd1, + 0xd3, 0x8f, 0xa2, 0x70, 0x77, 0x0d, 0x77, 0x56, + 0x89, 0x7b, 0x95, 0xc6, 0x63, 0xf8, 0x3c, 0xfa, + 0xea, 0x2b, 0x63, 0x25, 0x7a, 0x3e, 0x95, 0xc1, + 0xbc, 0x54, 0xdf, 0x4a, 0xaa, 0x57, 0xb2, 0xad, + 0xd9, 0x3f, 0xe4, 0xfc, 0xf5, 0xf3, 0xed, 0x56, + 0x9d, 0x2e, 0x37, 0xc1, 0x97, 0xb6, 0xc4, 0x16, + 0xfc, 0xbc, 0xf0, 0xdc, 0x69, 0xeb, 0xd9, 0xe0, + 0x7b, 0x65, 0x86, 0x4b, 0x59, 0x5c, 0xc9, 0x1a, + 0x6a, 0xd7, 0x02, 0xc3, 0xb4, 0x15, 0x49, 0xf6, + 0x57, 0xeb, 0x1b, 0xef, 0xfc, 0x76, 0xf8, 0xe1, + 0x59, 0x2c, 0x7f, 0xc7, 0xcc, 0xff, 0x00, 0xf6, + 0xe7, 0xf8, 0x8e, 0x55, 0xbf, 0x65, 0x5e, 0xb2, + 0xbe, 0xff, 0x00, 0xc7, 0x6f, 0x8e, 0x10, 0x74, + 0x2b, 0xab, 0xcb, 0x4b, 0x28, 0x4c, 0xf7, 0x73, + 0x32, 0xde, 0x16, 0xec, 0x32, 0x48, 0x43, 0x45, + 0x7a, 0x9b, 0x56, 0x85, 0xae, 0xa9, 0xd3, 0xb7, + 0x73, 0x08, 0x60, 0xc8, 0x42, 0xe9, 0x5c, 0x68, + 0xd6, 0x92, 0x5b, 0x53, 0xd6, 0xe3, 0x02, 0xab, + 0x9e, 0xea, 0x0b, 0xc9, 0x75, 0x1e, 0xad, 0xf3, + 0x19, 0x67, 0x10, 0x59, 0xc7, 0x31, 0xb7, 0x89, + 0xcf, 0x34, 0x64, 0x6d, 0x61, 0xa3, 0xe4, 0xdb, + 0x41, 0x53, 0x42, 0xb7, 0xf5, 0x26, 0x92, 0xd3, + 0x76, 0x98, 0x99, 0x2e, 0xb1, 0x77, 0xad, 0x75, + 0xcd, 0xb8, 0x0e, 0x74, 0x6e, 0x99, 0x92, 0x74, + 0x8d, 0xa8, 0x06, 0x8d, 0x1b, 0x8f, 0x2e, 0xc4, + 0x1d, 0x21, 0x68, 0x5f, 0xe7, 0xf0, 0xb8, 0xd7, + 0xf4, 0x77, 0xd7, 0xb1, 0x41, 0x27, 0xfb, 0x64, + 0xd5, 0xff, 0x00, 0xb2, 0xda, 0x95, 0x5f, 0xd0, + 0xb9, 0xab, 0xcb, 0xdd, 0x3b, 0x75, 0x13, 0x9c, + 0x65, 0xbb, 0xc7, 0x87, 0x36, 0x17, 0x3b, 0x69, + 0x70, 0x2c, 0x2e, 0x88, 0x1e, 0xad, 0x08, 0xa2, + 0xa3, 0x60, 0xe6, 0xc1, 0xcb, 0x90, 0x96, 0x5d, + 0x4a, 0x67, 0x7b, 0x24, 0x04, 0xf1, 0xb0, 0x92, + 0x7a, 0x42, 0x7b, 0xa3, 0x25, 0x3b, 0xae, 0xc2, + 0x0e, 0xaf, 0x63, 0xa8, 0xb0, 0x79, 0x09, 0x04, + 0x36, 0x57, 0xd1, 0x4d, 0x29, 0xdd, 0x18, 0x34, + 0x71, 0xe6, 0x6b, 0xa8, 0x4a, 0x91, 0xe5, 0x5c, + 0xe4, 0xe9, 0x0d, 0x3d, 0x96, 0xbb, 0x8a, 0x4d, + 0x39, 0x96, 0x8e, 0x06, 0x81, 0x57, 0x44, 0xe7, + 0x17, 0xca, 0xd7, 0x03, 0x56, 0xba, 0x30, 0x78, + 0x5c, 0xba, 0x15, 0xbb, 0x25, 0x8e, 0x08, 0xe3, + 0x9a, 0x4e, 0x9a, 0x56, 0x34, 0x36, 0x49, 0x69, + 0xc3, 0xc4, 0xe0, 0x28, 0x5d, 0x4e, 0x4a, 0xa0, + 0x80, 0xd3, 0x58, 0x4c, 0x86, 0x3b, 0x33, 0x99, + 0xbb, 0xba, 0x63, 0x5b, 0x0d, 0xf4, 0xbc, 0x76, + 0xe5, 0xae, 0x0e, 0x24, 0x71, 0xbd, 0xdb, 0x40, + 0xdd, 0xb1, 0xcb, 0xea, 0xf7, 0x0b, 0x7d, 0x3e, + 0xb2, 0xb1, 0xcb, 0x35, 0x8d, 0x75, 0x8c, 0x16, + 0xee, 0x8a, 0x67, 0x17, 0x0e, 0x2a, 0x9e, 0x93, + 0x67, 0x0e, 0xf3, 0xdf, 0x2b, 0x0a, 0x20, 0xa3, + 0x60, 0x74, 0x5e, 0x43, 0x1d, 0x77, 0x95, 0x96, + 0x56, 0xb3, 0x82, 0x5b, 0x79, 0xad, 0xec, 0x28, + 0xf0, 0x6b, 0xd2, 0xd4, 0x0e, 0x2f, 0xd1, 0xd9, + 0x45, 0x60, 0xd2, 0x18, 0xcb, 0xcc, 0x56, 0x02, + 0xde, 0xc6, 0xf5, 0xa1, 0x97, 0x11, 0x97, 0x97, + 0x06, 0xb8, 0x38, 0x77, 0x4e, 0x24, 0x6d, 0x0a, + 0x65, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x46, + 0x65, 0xbe, 0xba, 0x1e, 0x63, 0xdb, 0x53, 0x6d, + 0xef, 0x47, 0x32, 0x84, 0xcb, 0x7d, 0x74, 0x3c, + 0xc7, 0xb6, 0xa6, 0xdb, 0xde, 0x8e, 0x65, 0xe7, + 0x60, 0xf9, 0xec, 0x76, 0x9b, 0x5f, 0xa6, 0x5d, + 0x17, 0x78, 0x36, 0x74, 0x55, 0xad, 0x86, 0xf3, + 0xd1, 0x66, 0xf2, 0x6f, 0xf1, 0x4a, 0xa9, 0x68, + 0x4d, 0xd7, 0x9f, 0xca, 0xf9, 0xea, 0xdb, 0x79, + 0xe8, 0xb3, 0x79, 0x37, 0xf8, 0xa5, 0x54, 0xb4, + 0x26, 0xeb, 0xcf, 0xe5, 0x7c, 0xf5, 0xea, 0xd3, + 0xb1, 0x57, 0x79, 0xc3, 0x5f, 0x1a, 0xd7, 0x9c, + 0xb5, 0xa2, 0x22, 0xcd, 0xb0, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, 0x07, + 0x53, 0xe9, 0x28, 0x35, 0x14, 0x96, 0xef, 0x96, + 0xe5, 0xf6, 0xfe, 0x6c, 0xd7, 0x34, 0x06, 0x34, + 0x3a, 0xbc, 0x44, 0x1e, 0x53, 0xd6, 0x54, 0x4d, + 0x5f, 0xa4, 0xa0, 0xd3, 0xb1, 0x5a, 0xc9, 0x15, + 0xcb, 0xee, 0x0d, 0xc3, 0x9e, 0xd2, 0x1e, 0xd0, + 0xda, 0x70, 0x80, 0x79, 0x0f, 0x5d, 0x75, 0x95, + 0x44, 0xf6, 0xab, 0xe8, 0xd8, 0xdf, 0x29, 0x2f, + 0x8a, 0xd4, 0x11, 0xfa, 0x77, 0x40, 0x5b, 0x66, + 0x71, 0x10, 0xe4, 0x64, 0xbc, 0x92, 0x17, 0x4c, + 0x5c, 0x0c, 0x6d, 0x63, 0x48, 0x1c, 0x2e, 0x2d, + 0xde, 0x4f, 0x59, 0x4f, 0xde, 0xe9, 0x6c, 0x75, + 0x86, 0x93, 0x76, 0x1e, 0xe7, 0x22, 0x2d, 0xed, + 0xba, 0x71, 0x29, 0xbc, 0x95, 0xa0, 0x51, 0xc4, + 0xd4, 0x36, 0x95, 0xa6, 0xd5, 0xb7, 0xa0, 0x7f, + 0xb5, 0x2c, 0xf9, 0xe4, 0xfb, 0x47, 0x2c, 0x3e, + 0xd1, 0xbf, 0xb5, 0xa5, 0xf2, 0xd0, 0xf8, 0xc5, + 0x07, 0xde, 0x94, 0xb7, 0xc3, 0xe1, 0x30, 0xd7, + 0x0f, 0x87, 0x27, 0x1d, 0xdd, 0x9b, 0x65, 0x2f, + 0x96, 0xe8, 0x51, 0xac, 0x61, 0x21, 0xad, 0xe1, + 0x34, 0x25, 0x4c, 0xd8, 0xe5, 0xb1, 0x99, 0x1e, + 0x3f, 0x30, 0xba, 0x8a, 0xe7, 0xa2, 0xa7, 0x49, + 0xd1, 0xbb, 0x8b, 0x86, 0xbb, 0xab, 0xcf, 0x45, + 0x55, 0xf6, 0x75, 0x6d, 0x15, 0xde, 0x98, 0xbd, + 0xb5, 0x98, 0x71, 0x45, 0x3c, 0xd2, 0x46, 0xf1, + 0xd6, 0x74, 0x6c, 0x0a, 0x03, 0x48, 0x4f, 0x2e, + 0x03, 0x57, 0x3b, 0x1b, 0x72, 0x78, 0x5b, 0x2b, + 0x9d, 0x67, 0x2d, 0x76, 0x0e, 0x2a, 0xd6, 0x27, + 0x7b, 0xa6, 0x9d, 0x94, 0x1d, 0x3a, 0xee, 0xf2, + 0xd2, 0xca, 0x03, 0x71, 0x79, 0x33, 0x2d, 0xe0, + 0x69, 0x01, 0xd2, 0x48, 0x68, 0xd0, 0x49, 0xa0, + 0xdb, 0xd7, 0x5f, 0x16, 0x39, 0x2b, 0x0c, 0x8b, + 0x1d, 0x25, 0x85, 0xc4, 0x77, 0x2c, 0x61, 0xe1, + 0x73, 0xa3, 0x3c, 0x40, 0x12, 0x2b, 0x45, 0x48, + 0xf6, 0xa3, 0x94, 0xf4, 0x5c, 0x4b, 0x0e, 0xef, + 0xfe, 0x44, 0xe3, 0xb2, 0xd8, 0xc7, 0x6c, 0xab, + 0x06, 0x13, 0x05, 0x73, 0x65, 0xa4, 0x9b, 0x8e, + 0xb6, 0x90, 0x5a, 0xdf, 0x5c, 0x44, 0x5e, 0xf9, + 0xc8, 0xaf, 0x04, 0x92, 0xed, 0x27, 0x67, 0x2b, + 0x5b, 0xb1, 0x06, 0xe5, 0xee, 0xa8, 0xd3, 0xf6, + 0x12, 0x98, 0x6e, 0xaf, 0xe2, 0x8e, 0x56, 0xec, + 0x73, 0x01, 0x2f, 0x20, 0xf5, 0xf8, 0x03, 0xa8, + 0xb2, 0xe3, 0xf3, 0xd8, 0x6c, 0x9b, 0x8b, 0x2c, + 0x2f, 0x22, 0x9e, 0x40, 0x2a, 0x63, 0x69, 0xa3, + 0xa9, 0xd5, 0xe1, 0x75, 0x0a, 0xa6, 0xd9, 0x68, + 0x2c, 0x3e, 0x38, 0xca, 0xfd, 0x49, 0x7f, 0x11, + 0xdb, 0xfc, 0x20, 0xc9, 0x7a, 0x2d, 0x9c, 0xae, + 0x77, 0x15, 0x1c, 0x4d, 0x55, 0x66, 0xff, 0x00, + 0xf0, 0xfc, 0x76, 0xa1, 0x63, 0xf0, 0x57, 0x0e, + 0x9a, 0xda, 0x19, 0x23, 0x7c, 0x33, 0x57, 0x68, + 0x35, 0x1c, 0x4d, 0xe2, 0xa0, 0xa8, 0xe4, 0x41, + 0xd8, 0xee, 0x63, 0x74, 0x96, 0xd3, 0x44, 0xce, + 0xfa, 0x48, 0xde, 0xc6, 0xd7, 0x66, 0xd7, 0x34, + 0x80, 0xa1, 0x74, 0x56, 0x1e, 0xfb, 0x0d, 0x85, + 0xf3, 0x2b, 0xf6, 0xb5, 0xb3, 0xf4, 0xcf, 0x7d, + 0x18, 0xe0, 0xe1, 0x47, 0x06, 0xd3, 0x68, 0xe6, + 0x53, 0xd5, 0xae, 0xde, 0xaa, 0x20, 0xa9, 0xfe, + 0x57, 0xbe, 0x9b, 0x27, 0xa8, 0xa5, 0x9d, 0xac, + 0x16, 0xd9, 0x58, 0x78, 0x2d, 0x9d, 0xc4, 0x09, + 0xe2, 0x1b, 0x5b, 0xc4, 0xde, 0x4d, 0xa1, 0x46, + 0xda, 0xe8, 0x9c, 0xbc, 0x3a, 0x4e, 0xfe, 0xc1, + 0xcc, 0x8f, 0xf1, 0x1b, 0xc9, 0xa3, 0x70, 0x6f, + 0x18, 0xe1, 0xe8, 0xe2, 0x22, 0x9d, 0xde, 0xee, + 0x52, 0xaf, 0xc8, 0x83, 0x05, 0x84, 0x2f, 0x82, + 0xc2, 0xda, 0x09, 0x36, 0x49, 0x14, 0x31, 0xb1, + 0xe0, 0x6d, 0x1c, 0x4d, 0x68, 0x69, 0x59, 0xd1, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x47, 0x6a, 0x3f, 0x51, 0xde, + 0x79, 0x3f, 0x9c, 0xd5, 0xaf, 0xa1, 0xbd, 0x4c, + 0xef, 0x2e, 0xfe, 0xd3, 0x56, 0xc6, 0xa3, 0xf5, + 0x1d, 0xe7, 0x93, 0xf9, 0xcd, 0x5a, 0xfa, 0x1b, + 0xd4, 0xce, 0xf2, 0xef, 0xed, 0x35, 0x5e, 0x38, + 0x73, 0xa5, 0x8c, 0xf3, 0x14, 0xee, 0x4e, 0xb5, + 0x89, 0x11, 0x15, 0x1b, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x0b, 0x57, 0x21, 0xe8, 0x57, 0x3e, 0x49, + 0xfe, 0x29, 0x5b, 0x4b, 0x57, 0x21, 0xe8, 0x57, + 0x3e, 0x49, 0xfe, 0x29, 0x53, 0x4e, 0x78, 0x56, + 0xe6, 0xc5, 0x5a, 0x27, 0x52, 0x0b, 0x49, 0xfa, + 0x3d, 0xc7, 0x86, 0xdf, 0x15, 0x4f, 0x28, 0x1d, + 0x27, 0xe8, 0xf7, 0x1e, 0x1b, 0x7c, 0x55, 0x3c, + 0xb4, 0xc4, 0x71, 0x6a, 0xd3, 0xf7, 0x30, 0xc0, + 0xf2, 0xd6, 0xf4, 0x4e, 0xb1, 0x11, 0x16, 0x4e, + 0x91, 0x11, 0x10, 0x61, 0xbd, 0xf4, 0x2b, 0x9f, + 0x23, 0x27, 0x8a, 0x57, 0x36, 0xf6, 0x5e, 0x01, + 0xce, 0x4e, 0x0e, 0xd0, 0x6d, 0x48, 0x23, 0xad, + 0xc6, 0xc5, 0xd3, 0x26, 0x8c, 0x4b, 0x0c, 0x91, + 0x13, 0x41, 0x23, 0x5c, 0xc2, 0x47, 0x20, 0x70, + 0xa2, 0x80, 0xd3, 0x9a, 0x2e, 0xd3, 0x4f, 0xde, + 0x3e, 0xee, 0x1b, 0xa9, 0x67, 0x73, 0xe3, 0x31, + 0x16, 0xc8, 0xd6, 0x81, 0x42, 0x41, 0xaf, 0x73, + 0xcc, 0x83, 0x99, 0x65, 0x60, 0x97, 0x19, 0x93, + 0xbf, 0xb0, 0x69, 0x2d, 0x6b, 0x64, 0x74, 0x4e, + 0x1f, 0xa4, 0xc0, 0xfe, 0x36, 0x76, 0x81, 0x56, + 0xd7, 0x58, 0xf9, 0xa7, 0xb2, 0xe7, 0x12, 0x28, + 0xfb, 0xa7, 0x32, 0xe1, 0xdf, 0x2e, 0x56, 0x86, + 0xfe, 0xe8, 0x0a, 0x6b, 0x39, 0xa0, 0x6c, 0x33, + 0x39, 0x19, 0x72, 0x12, 0x5d, 0x4b, 0x6e, 0xf9, + 0x83, 0x43, 0xd8, 0xc6, 0xb4, 0x82, 0x5a, 0x38, + 0x78, 0xaa, 0xee, 0xa8, 0x52, 0xb9, 0x2c, 0x15, + 0xbe, 0x43, 0x09, 0xf8, 0x31, 0x91, 0xd0, 0xc0, + 0x1b, 0x1b, 0x1a, 0xf6, 0x00, 0x5c, 0x04, 0x5c, + 0x34, 0xd8, 0x76, 0x7c, 0x54, 0x15, 0xdf, 0x65, + 0xe0, 0x9c, 0x35, 0xf0, 0x69, 0xe1, 0x71, 0xb8, + 0xa0, 0x3d, 0x43, 0xd1, 0x8d, 0xaa, 0x1f, 0x1b, + 0xad, 0xb3, 0x76, 0x19, 0xfe, 0x83, 0x3d, 0x70, + 0xf9, 0x2d, 0xa2, 0x7b, 0xe1, 0xb9, 0x8f, 0x81, + 0xa3, 0x80, 0xee, 0x0f, 0xa3, 0x5a, 0x0e, 0xcd, + 0xfc, 0xca, 0xed, 0xa6, 0xf4, 0xe4, 0x1a, 0x7e, + 0xd6, 0x6b, 0x68, 0x26, 0x7c, 0xed, 0x9a, 0x4e, + 0x90, 0xba, 0x40, 0x1a, 0x41, 0xe1, 0xe1, 0xa7, + 0x72, 0xb0, 0x6a, 0x0d, 0x1b, 0x89, 0xce, 0x49, + 0xe7, 0x12, 0xf1, 0x5b, 0xdd, 0xd0, 0x03, 0x3c, + 0x54, 0xab, 0x80, 0xdd, 0xc6, 0xd3, 0xb1, 0xd4, + 0x41, 0xb5, 0x36, 0xa4, 0xd3, 0x66, 0xd5, 0xd2, + 0x4d, 0x7f, 0x6d, 0x24, 0x04, 0x6d, 0x69, 0x70, + 0x7d, 0x47, 0x53, 0x83, 0x69, 0x3c, 0xd4, 0x5c, + 0xcb, 0x00, 0xc6, 0xdd, 0xeb, 0x3b, 0x67, 0xe3, + 0xa3, 0x31, 0xc0, 0x6e, 0xcc, 0xd1, 0xc7, 0xfa, + 0x10, 0xb5, 0xc5, 0xfb, 0x7a, 0x94, 0x6a, 0xb2, + 0x37, 0xd9, 0x4c, 0x5c, 0x75, 0x39, 0x27, 0x70, + 0x75, 0xa1, 0x15, 0xec, 0xf1, 0xab, 0x36, 0x03, + 0x4b, 0x62, 0xf0, 0x2d, 0x71, 0xb4, 0x6b, 0xa4, + 0xb8, 0x90, 0x70, 0xc9, 0x71, 0x25, 0x0b, 0xc8, + 0xea, 0x0a, 0x6c, 0x68, 0xe6, 0x41, 0x54, 0xf6, + 0xad, 0xf5, 0xf8, 0xdf, 0x02, 0x5e, 0xdb, 0x55, + 0x87, 0x48, 0x63, 0xec, 0x24, 0xd3, 0x58, 0xe9, + 0x24, 0xb6, 0x85, 0xef, 0x74, 0x55, 0x73, 0xdd, + 0x1b, 0x49, 0x27, 0x89, 0xdb, 0xc9, 0x0b, 0x26, + 0xa5, 0xd2, 0x76, 0xda, 0x89, 0xf6, 0xef, 0x9e, + 0xe2, 0x4b, 0x7f, 0x36, 0x0e, 0x6b, 0x44, 0x6d, + 0x6b, 0xab, 0xc4, 0x41, 0xdb, 0xc5, 0xcc, 0xa4, + 0xb1, 0x38, 0xe6, 0x62, 0xf1, 0xd6, 0xf8, 0xf8, + 0xde, 0xe9, 0x59, 0x6c, 0xce, 0x06, 0xbd, 0xc0, + 0x02, 0x76, 0x93, 0xb4, 0x0e, 0x74, 0x1b, 0x11, + 0x43, 0x0c, 0x23, 0x86, 0x18, 0xdb, 0x18, 0x3b, + 0xc3, 0x1a, 0x1a, 0x3d, 0xe5, 0x5a, 0xd7, 0x98, + 0x1c, 0xa6, 0x6a, 0xda, 0xce, 0x2c, 0x73, 0x1b, + 0x21, 0x86, 0x47, 0xbe, 0x40, 0xe7, 0x86, 0x0a, + 0x16, 0xd0, 0x77, 0xdb, 0xd5, 0xa1, 0x10, 0x72, + 0xf8, 0xb4, 0x96, 0xbe, 0x82, 0x21, 0x14, 0x32, + 0x3e, 0x28, 0x98, 0x3b, 0x96, 0x32, 0xeb, 0x85, + 0xa0, 0x75, 0x80, 0x72, 0x81, 0xc2, 0xd9, 0x65, + 0xef, 0x72, 0x26, 0xdf, 0x12, 0xe7, 0x32, 0xf3, + 0x85, 0xe6, 0xad, 0x93, 0xa2, 0x3c, 0x23, 0xbf, + 0xee, 0xea, 0x17, 0x6e, 0x3b, 0x95, 0x6f, 0x05, + 0xa1, 0xed, 0x30, 0x99, 0x3f, 0xc4, 0x62, 0xbb, + 0x96, 0x67, 0x96, 0xbd, 0xbd, 0x1b, 0xda, 0xd0, + 0x3b, 0xbe, 0xbb, 0x7a, 0x88, 0x35, 0xb3, 0x9a, + 0x8f, 0x2b, 0xa6, 0x31, 0x98, 0xd8, 0xdf, 0x6a, + 0xcb, 0x99, 0x24, 0x84, 0x32, 0x69, 0xa4, 0x7b, + 0x8d, 0x26, 0x63, 0x5b, 0xc4, 0x09, 0x6d, 0x6b, + 0x5d, 0xf5, 0xaa, 0x94, 0xc5, 0xea, 0xbc, 0x45, + 0xe6, 0x2a, 0x3c, 0x84, 0xd7, 0x50, 0xc0, 0xe0, + 0xc0, 0x6e, 0x22, 0x73, 0xc0, 0x73, 0x1e, 0x07, + 0x74, 0xde, 0x13, 0xdd, 0x1e, 0xb7, 0x55, 0x6f, + 0xe4, 0xf1, 0x96, 0x59, 0x4b, 0x47, 0xd9, 0xdf, + 0x47, 0xd2, 0xc2, 0xfd, 0xb4, 0xdc, 0x5a, 0xe1, + 0xb9, 0xcd, 0x3c, 0x84, 0x2a, 0x74, 0x9e, 0xca, + 0xad, 0x4c, 0xb5, 0x8b, 0x22, 0xf6, 0xc7, 0xfa, + 0x2e, 0x8d, 0xae, 0x70, 0xf9, 0x5c, 0x40, 0x7b, + 0xc8, 0x20, 0x34, 0xa0, 0x75, 0xf6, 0xb6, 0x8a, + 0xe2, 0xd5, 0xa5, 0x91, 0xf4, 0xf2, 0xdc, 0x10, + 0x3e, 0x2c, 0x47, 0x88, 0xed, 0xec, 0xd1, 0x66, + 0xf6, 0x8b, 0x6b, 0x25, 0xae, 0xa5, 0x17, 0x60, + 0x77, 0x17, 0x31, 0xc7, 0x23, 0x0f, 0x55, 0xd1, + 0xf7, 0x0e, 0x1e, 0xf0, 0x57, 0xfc, 0x0e, 0x9b, + 0xc6, 0xe0, 0x61, 0x73, 0x2c, 0xda, 0x5d, 0x2c, + 0x9f, 0x5b, 0x3c, 0x9b, 0x5e, 0xea, 0x72, 0x6c, + 0xdc, 0x3a, 0xcb, 0x26, 0x6f, 0x03, 0x8f, 0xce, + 0x5a, 0x79, 0xb5, 0xeb, 0x4f, 0x72, 0x78, 0xa2, + 0x95, 0x9b, 0x1e, 0xc7, 0x6e, 0xab, 0x4f, 0xc0, + 0x82, 0x17, 0x54, 0x6a, 0x4c, 0x5c, 0xda, 0x4a, + 0x69, 0x60, 0xb8, 0x8e, 0x49, 0x2f, 0xe2, 0x11, + 0xc7, 0x13, 0x5c, 0x0b, 0xea, 0xfa, 0x71, 0xd5, + 0xbb, 0xc7, 0x08, 0xad, 0x54, 0x7f, 0xb2, 0xcb, + 0x27, 0xb6, 0x0b, 0xeb, 0xf7, 0x0a, 0x36, 0x47, + 0x32, 0x18, 0xcf, 0x57, 0x82, 0xae, 0x77, 0x8c, + 0x17, 0xb1, 0x7b, 0x2b, 0xb4, 0x13, 0x07, 0x4b, + 0x90, 0x91, 0xd1, 0x57, 0xbd, 0x6c, 0x6d, 0x6b, + 0x88, 0xea, 0x71, 0x54, 0xf6, 0x95, 0xce, 0xc6, + 0xc6, 0xd7, 0x1f, 0x69, 0x1d, 0x9d, 0xa4, 0x62, + 0x28, 0x21, 0x14, 0x63, 0x07, 0x6c, 0xf5, 0x49, + 0x41, 0x9d, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x47, 0xea, 0x0f, 0x54, + 0xcf, 0xf2, 0x7c, 0x60, 0xa4, 0x14, 0x7e, 0xa0, + 0xf5, 0x4c, 0xff, 0x00, 0x27, 0xc6, 0x0a, 0xf6, + 0xf6, 0xe9, 0xd3, 0x0c, 0xb1, 0x3c, 0x0b, 0xbb, + 0x95, 0xea, 0x7b, 0xa5, 0x7d, 0x50, 0xdf, 0x0d, + 0xfd, 0xb5, 0x2c, 0xfd, 0xca, 0x27, 0x4a, 0xfa, + 0xa1, 0xbe, 0x1b, 0xfb, 0x6a, 0x59, 0xfb, 0x94, + 0xdd, 0xe2, 0xd7, 0xbd, 0x28, 0xc3, 0x70, 0x2d, + 0xee, 0xc3, 0x9c, 0xdd, 0x7f, 0x93, 0xc7, 0x95, + 0x67, 0xd8, 0x85, 0x7f, 0x54, 0x0b, 0xaf, 0xf2, + 0x78, 0xf2, 0xac, 0xfb, 0x10, 0xaf, 0xeb, 0x96, + 0xce, 0x7a, 0xf7, 0xe5, 0xec, 0x7c, 0x53, 0x36, + 0x0f, 0xf8, 0xd6, 0xc4, 0x44, 0x5b, 0x3c, 0xd1, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x52, 0x7d, 0xa6, + 0xe2, 0x65, 0xb8, 0xb3, 0xb7, 0xca, 0x44, 0xd2, + 0xef, 0x34, 0xe2, 0x8e, 0x7a, 0x72, 0x46, 0xfd, + 0xa1, 0xde, 0xe3, 0xbb, 0x6a, 0xec, 0xbc, 0x7b, + 0x18, 0xf6, 0x39, 0x8f, 0x68, 0x73, 0x1c, 0x08, + 0x73, 0x48, 0xa8, 0x20, 0xef, 0x04, 0x20, 0xa4, + 0xe8, 0x7d, 0x5f, 0x8c, 0x66, 0x2e, 0x3c, 0x5e, + 0x42, 0x76, 0xdb, 0x4f, 0x6b, 0x56, 0xc4, 0xf9, + 0x0d, 0x18, 0xf6, 0x13, 0x56, 0xf7, 0x5b, 0xaa, + 0x16, 0x4d, 0x65, 0xad, 0x2c, 0xa1, 0xb0, 0x75, + 0x9e, 0x26, 0xe8, 0x49, 0x79, 0x31, 0x00, 0xcd, + 0x03, 0xaa, 0x23, 0x60, 0x35, 0x27, 0x8c, 0x7c, + 0x63, 0x4a, 0x6c, 0x5f, 0x59, 0x2f, 0x66, 0x78, + 0x9b, 0x99, 0x5d, 0x2d, 0x94, 0xef, 0xb2, 0xe2, + 0x35, 0x31, 0x00, 0x24, 0x8c, 0x78, 0x20, 0x90, + 0x47, 0x65, 0x7c, 0x58, 0x7b, 0x2f, 0xc6, 0x43, + 0x28, 0x7d, 0xed, 0xd4, 0x97, 0x6d, 0x69, 0xfa, + 0xa6, 0xb4, 0x44, 0xd3, 0xe1, 0x10, 0x5c, 0xe4, + 0x1b, 0xda, 0x0e, 0xfb, 0x39, 0x91, 0xc6, 0x49, + 0x75, 0x94, 0x97, 0xa6, 0x8d, 0xcf, 0xe0, 0xb5, + 0x73, 0x9a, 0x03, 0x88, 0x6f, 0x7e, 0xe2, 0x45, + 0x2a, 0x2b, 0xb1, 0x54, 0xf5, 0xc6, 0xab, 0x93, + 0x29, 0x76, 0xfc, 0x65, 0xa3, 0xf8, 0x71, 0xf6, + 0xef, 0xe1, 0x71, 0x06, 0x9d, 0x2b, 0xda, 0x68, + 0x5c, 0x7f, 0x54, 0x1d, 0xdd, 0x95, 0xd3, 0x7c, + 0xda, 0x36, 0xda, 0x9b, 0x58, 0x29, 0x03, 0x04, + 0x66, 0x38, 0xf8, 0x05, 0x38, 0x05, 0x38, 0x47, + 0x08, 0xeb, 0x2a, 0x6f, 0xfd, 0x57, 0x8e, 0xfe, + 0xa1, 0x3f, 0xec, 0x31, 0x07, 0xce, 0x94, 0x9f, + 0x46, 0xe0, 0x6d, 0xc4, 0x8f, 0xc8, 0xc3, 0x36, + 0x46, 0x56, 0xff, 0x00, 0x1a, 0x6a, 0x3a, 0x8d, + 0x07, 0xff, 0x00, 0x4e, 0x3e, 0xe7, 0x77, 0x57, + 0xaa, 0xac, 0x39, 0x39, 0x2d, 0x73, 0xfa, 0x6a, + 0xf9, 0xb8, 0xe9, 0x45, 0xc3, 0x26, 0x89, 0xed, + 0x8d, 0xed, 0xae, 0xd7, 0xb3, 0x6d, 0x36, 0xd3, + 0x94, 0x28, 0x0f, 0xfa, 0xaf, 0x1d, 0xfd, 0x42, + 0x7f, 0xd8, 0x62, 0xb3, 0x60, 0x30, 0xb1, 0x60, + 0xf1, 0xc2, 0xc2, 0x19, 0x5d, 0x33, 0x1a, 0xf7, + 0x3c, 0x48, 0xf0, 0x01, 0xab, 0xcd, 0x7e, 0x2a, + 0x0a, 0x1f, 0xb3, 0x4c, 0xad, 0xad, 0x95, 0xfd, + 0xd5, 0xad, 0xd4, 0x8d, 0x84, 0x5c, 0xb1, 0xa6, + 0x37, 0x3c, 0x86, 0x8e, 0x38, 0xc9, 0xee, 0x49, + 0x34, 0xe4, 0x72, 0xd4, 0xd7, 0x17, 0x91, 0x66, + 0x75, 0x38, 0x82, 0xc1, 0xc2, 0x70, 0xd6, 0xc7, + 0x6c, 0xc7, 0x30, 0xd4, 0x39, 0xe4, 0x9a, 0xd0, + 0x8d, 0xfb, 0x5d, 0x45, 0x6b, 0xcd, 0xfb, 0x3a, + 0xc6, 0x64, 0xae, 0x9f, 0x77, 0x6d, 0x33, 0xac, + 0x65, 0x94, 0x97, 0x48, 0xc6, 0xb4, 0x3e, 0x32, + 0xe3, 0xbd, 0xc1, 0xb5, 0x6f, 0x0d, 0x7a, 0xc5, + 0x6c, 0x69, 0xed, 0x09, 0x8d, 0xc2, 0x5c, 0x0b, + 0xc7, 0x48, 0xeb, 0xbb, 0xa6, 0x7d, 0x5b, 0xde, + 0x03, 0x5a, 0xca, 0xf2, 0xb5, 0x82, 0xbb, 0x7a, + 0xe4, 0xa0, 0xd4, 0xf6, 0x83, 0x8d, 0x77, 0xe5, + 0x78, 0x04, 0x63, 0x8b, 0xf0, 0xe7, 0xc5, 0xc5, + 0x4f, 0xd0, 0xe1, 0xe8, 0x89, 0xed, 0x2c, 0x5e, + 0xcf, 0x33, 0x78, 0xe8, 0x70, 0x52, 0x5a, 0x5d, + 0x5c, 0x47, 0x04, 0x96, 0xb2, 0xbd, 0xe4, 0x48, + 0xe0, 0xda, 0xc6, 0xfa, 0x3b, 0x88, 0x57, 0x7e, + 0xda, 0xab, 0x94, 0xb0, 0xc5, 0x34, 0x4f, 0x86, + 0x66, 0x87, 0xc5, 0x23, 0x4b, 0x1e, 0xc7, 0x0a, + 0x82, 0xd3, 0xb0, 0x82, 0x15, 0x2e, 0xf7, 0xd9, + 0x6e, 0x3e, 0x59, 0xcb, 0xec, 0xef, 0x1f, 0x6f, + 0x11, 0x35, 0x11, 0x3d, 0x82, 0x4e, 0x1e, 0xb3, + 0x5d, 0xc4, 0xd3, 0xd9, 0x41, 0x5d, 0xc2, 0xb4, + 0xe6, 0xb5, 0xdb, 0x6e, 0x62, 0x04, 0xc4, 0xfb, + 0xa7, 0xdd, 0x13, 0xd4, 0x8d, 0x84, 0xbc, 0x1e, + 0xd2, 0x93, 0xf6, 0xa7, 0x64, 0xe1, 0x7d, 0x67, + 0x7d, 0x4f, 0xe1, 0xcb, 0x13, 0xa1, 0x71, 0xfd, + 0x66, 0x3b, 0x88, 0x0e, 0xc3, 0x95, 0xbb, 0x4f, + 0x69, 0x7c, 0x76, 0x02, 0x27, 0x8b, 0x6e, 0x29, + 0x6e, 0x25, 0x00, 0x4b, 0x71, 0x25, 0x38, 0x88, + 0x1f, 0x14, 0x01, 0xde, 0x85, 0xbb, 0x94, 0xc5, + 0xd9, 0x65, 0xac, 0x9f, 0x65, 0x7c, 0xce, 0x92, + 0x17, 0xed, 0xd9, 0xb1, 0xcd, 0x70, 0xdc, 0xe6, + 0x9e, 0x42, 0x10, 0x41, 0x41, 0xaa, 0x31, 0x63, + 0x47, 0x0b, 0x97, 0x5c, 0x46, 0x27, 0x65, 0xaf, + 0x42, 0x60, 0xe2, 0x1d, 0x27, 0x4a, 0x19, 0xd1, + 0xf0, 0xf0, 0x6f, 0xde, 0xab, 0xbe, 0xcb, 0xac, + 0x5e, 0xfc, 0x95, 0xd5, 0xe9, 0x07, 0xa3, 0x82, + 0x1e, 0x88, 0x1f, 0xd7, 0x90, 0x8d, 0x9d, 0x86, + 0xad, 0xf3, 0xec, 0xaa, 0xd7, 0xa7, 0xe2, 0x19, + 0x19, 0x04, 0x35, 0xef, 0x7a, 0x36, 0xf1, 0xd3, + 0xa9, 0xc5, 0xc5, 0x4f, 0x79, 0x5b, 0xf1, 0x38, + 0x8b, 0x1c, 0x3d, 0x93, 0x6c, 0xac, 0x99, 0xc1, + 0x13, 0x4d, 0x5c, 0x4e, 0xd7, 0x39, 0xc7, 0x7b, + 0x9c, 0x79, 0x4a, 0x0d, 0xc4, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x41, 0xbc, 0x22, 0x0d, 0xe1, 0x05, 0x03, + 0x46, 0xff, 0x00, 0x7c, 0x5f, 0x73, 0x5c, 0x7d, + 0xa0, 0x5d, 0x21, 0x73, 0x7d, 0x1b, 0xfd, 0xf1, + 0x7d, 0xcd, 0x71, 0xf6, 0x81, 0x74, 0x85, 0x8e, + 0x1f, 0x63, 0xce, 0x97, 0xa7, 0xf1, 0x9e, 0x66, + 0x9f, 0x55, 0x6f, 0x52, 0x2f, 0x37, 0xf5, 0x31, + 0xf8, 0x7f, 0x01, 0x59, 0xad, 0x3d, 0x1a, 0x2f, + 0x04, 0x76, 0x96, 0x1c, 0xdf, 0xd4, 0xc7, 0xe1, + 0xfc, 0x05, 0x66, 0xb4, 0xf4, 0x68, 0xbc, 0x11, + 0xda, 0x5c, 0x56, 0x7f, 0xb3, 0xc4, 0x7a, 0xaa, + 0x1c, 0x75, 0x72, 0xf6, 0xf7, 0xe5, 0x95, 0x11, + 0x17, 0xa6, 0xc0, 0x44, 0x44, 0x15, 0x9f, 0x68, + 0xdf, 0xda, 0xf2, 0xf9, 0x68, 0xbc, 0x65, 0xa1, + 0xec, 0xb3, 0xd5, 0x57, 0xbf, 0xf9, 0x03, 0xc4, + 0x0a, 0xc9, 0x9f, 0xc2, 0xc5, 0x9b, 0xc6, 0xbb, + 0x1f, 0x34, 0xae, 0x85, 0x8e, 0x7b, 0x5f, 0xc6, + 0xc0, 0x09, 0xab, 0x0d, 0x7e, 0x32, 0xc3, 0xa6, + 0xf4, 0xe4, 0x1a, 0x7a, 0xda, 0x6b, 0x78, 0x27, + 0x7d, 0xc0, 0x99, 0xfd, 0x21, 0x74, 0x80, 0x34, + 0x82, 0x1b, 0xc3, 0x4e, 0xe5, 0x07, 0xde, 0xa9, + 0xfe, 0xdb, 0xc9, 0x7f, 0xe3, 0xbf, 0xb4, 0xa9, + 0x9e, 0xca, 0xbd, 0x63, 0x7f, 0xe4, 0x59, 0xe3, + 0xab, 0xf6, 0x4a, 0xc9, 0xb9, 0x0c, 0x7d, 0xc5, + 0x8b, 0xde, 0x63, 0x65, 0xcc, 0x66, 0x37, 0x3d, + 0xb4, 0x24, 0x07, 0x72, 0x8a, 0xa8, 0x9d, 0x35, + 0xa4, 0x2d, 0xb4, 0xf4, 0xf3, 0xcd, 0x05, 0xcc, + 0x97, 0x06, 0x76, 0x06, 0x11, 0x23, 0x5a, 0xd0, + 0x00, 0x3c, 0x55, 0x1c, 0x28, 0x39, 0xe6, 0x5e, + 0xca, 0xde, 0xd7, 0x58, 0x5c, 0x5b, 0xe5, 0x38, + 0x9b, 0x66, 0xfb, 0xa2, 0xe9, 0x9c, 0xdd, 0x87, + 0xa2, 0x94, 0xf1, 0x07, 0x03, 0xcc, 0xe5, 0x65, + 0xca, 0x69, 0x3d, 0x0b, 0x8b, 0xb0, 0xfc, 0x42, + 0x69, 0xa6, 0x92, 0x23, 0x4e, 0x8c, 0x45, 0x33, + 0x1c, 0xe7, 0xf1, 0x7e, 0x80, 0xa6, 0xd5, 0x64, + 0xd4, 0x3a, 0x57, 0x19, 0x9f, 0x6b, 0x5d, 0x73, + 0xc5, 0x15, 0xcc, 0x63, 0x86, 0x3b, 0x88, 0xe9, + 0xc4, 0x07, 0xe8, 0xb8, 0x1d, 0x8e, 0x0a, 0xbd, + 0x0f, 0xb2, 0xab, 0x51, 0x28, 0x33, 0x64, 0x24, + 0x7c, 0x40, 0xf7, 0xac, 0x8d, 0xad, 0x71, 0x1e, + 0x11, 0x73, 0xbb, 0x48, 0x24, 0xf4, 0x25, 0xbe, + 0x9d, 0x0d, 0xb9, 0xb9, 0xc1, 0x79, 0xc7, 0x0b, + 0xdc, 0xc8, 0xe7, 0xf3, 0x8e, 0xab, 0x6a, 0xe0, + 0x1b, 0xb2, 0x9c, 0xbb, 0x55, 0x3b, 0x49, 0x0a, + 0xeb, 0x98, 0xeb, 0xc9, 0x35, 0xc1, 0xf7, 0xa4, + 0x5d, 0x3f, 0x1b, 0x8e, 0xb3, 0xc5, 0xda, 0x47, + 0x67, 0x65, 0x18, 0x8e, 0x18, 0xbb, 0xd6, 0xef, + 0x24, 0xf2, 0xb9, 0xc7, 0x94, 0x95, 0x05, 0x8b, + 0xd0, 0xb6, 0x98, 0xdc, 0xc8, 0xcb, 0x32, 0xee, + 0x59, 0x24, 0x0e, 0x91, 0xfd, 0x13, 0x9a, 0xd0, + 0xdf, 0xe2, 0x71, 0x54, 0x54, 0x6d, 0xd9, 0xc4, + 0x82, 0x7b, 0x21, 0x6e, 0xeb, 0xac, 0x7d, 0xd5, + 0xb3, 0x7b, 0xe9, 0xa1, 0x92, 0x36, 0xf3, 0xb9, + 0xa4, 0x05, 0xcc, 0x34, 0x06, 0x4a, 0xdf, 0x13, + 0x9e, 0x7c, 0x77, 0xee, 0x16, 0xed, 0x9e, 0x37, + 0x40, 0xe7, 0x3f, 0x60, 0x6c, 0x81, 0xc0, 0x80, + 0xe3, 0xc9, 0xb5, 0xb4, 0x5d, 0x5d, 0x56, 0xb3, + 0xfa, 0x0f, 0x15, 0x98, 0xb8, 0x75, 0xdb, 0x1e, + 0xeb, 0x3b, 0xa9, 0x3e, 0xb1, 0xf1, 0x80, 0xe6, + 0xbc, 0xf5, 0x5c, 0xc3, 0xcb, 0xd7, 0x08, 0x3e, + 0xb5, 0x36, 0xb3, 0xb2, 0xc2, 0xc7, 0x0f, 0x9b, + 0x98, 0xef, 0xae, 0x25, 0x76, 0xd8, 0x59, 0x20, + 0xee, 0x58, 0x06, 0xd7, 0x17, 0x37, 0x8a, 0x9b, + 0x77, 0x2c, 0x77, 0xf9, 0x39, 0x33, 0x7a, 0x16, + 0xf6, 0xff, 0x00, 0xcd, 0xdd, 0x6e, 0x26, 0x85, + 0xe5, 0xb1, 0x93, 0xc4, 0x4b, 0x58, 0xee, 0xf8, + 0x10, 0x06, 0xcd, 0x8b, 0x42, 0xc7, 0xd9, 0x76, + 0x3a, 0x19, 0x9a, 0xfb, 0xdb, 0xb9, 0x2e, 0x58, + 0xd3, 0x5e, 0x89, 0x8d, 0x11, 0xb5, 0xde, 0x11, + 0xab, 0x8a, 0xb9, 0x0b, 0x78, 0x04, 0x1e, 0x6c, + 0x23, 0x68, 0x83, 0x83, 0xa3, 0xe8, 0x80, 0xee, + 0x78, 0x29, 0xc3, 0xc3, 0x4e, 0xa5, 0x10, 0x73, + 0xef, 0x65, 0xd7, 0x96, 0xd0, 0xdc, 0x5f, 0xdb, + 0x4b, 0x23, 0x63, 0x92, 0x66, 0xc6, 0xe8, 0xda, + 0xe2, 0x07, 0x17, 0x07, 0x10, 0x75, 0x2b, 0xd4, + 0xaa, 0xc1, 0xed, 0x2f, 0x25, 0x69, 0x77, 0x90, + 0xb4, 0xb6, 0xb6, 0x95, 0xb2, 0xba, 0xd5, 0x8f, + 0xe9, 0x8b, 0x0d, 0x40, 0x73, 0xc8, 0xee, 0x6a, + 0x39, 0x68, 0x36, 0xa9, 0x5b, 0xbf, 0x65, 0xb8, + 0xf9, 0x67, 0x2e, 0xb5, 0xbc, 0x92, 0x08, 0x5c, + 0x6b, 0xd1, 0x39, 0x82, 0x4e, 0x1e, 0xb3, 0x5d, + 0x56, 0xfb, 0xeb, 0x6a, 0x7f, 0x66, 0xd8, 0x67, + 0xd9, 0xc3, 0x6b, 0x0c, 0xd2, 0xc2, 0xe8, 0xdc, + 0x5f, 0x24, 0xe0, 0x35, 0xcf, 0x90, 0x91, 0x4e, + 0xea, 0xbb, 0x00, 0x1c, 0x80, 0x20, 0xd9, 0xb1, + 0xff, 0x00, 0x1f, 0x33, 0xff, 0x00, 0xdb, 0x9f, + 0xe2, 0x39, 0x56, 0xfd, 0x95, 0x6c, 0xc9, 0x5f, + 0x79, 0x06, 0x78, 0xe1, 0x5e, 0x21, 0xc3, 0xc5, + 0x16, 0x0c, 0x61, 0x44, 0x8e, 0x31, 0x08, 0x0d, + 0xbf, 0x4a, 0x40, 0xe2, 0xa1, 0x04, 0x71, 0x53, + 0x75, 0x76, 0xa8, 0xfd, 0x35, 0xa3, 0xed, 0x74, + 0xf4, 0xf3, 0x4f, 0x05, 0xcc, 0x97, 0x06, 0x76, + 0x08, 0xcb, 0x64, 0x6b, 0x40, 0x00, 0x1e, 0x2a, + 0x8e, 0x14, 0x1c, 0xee, 0xf2, 0xc6, 0xd2, 0xdf, + 0x56, 0x4d, 0x67, 0x96, 0xe2, 0x65, 0x99, 0xba, + 0x77, 0x4c, 0xe6, 0x9a, 0x11, 0x1c, 0x84, 0xb9, + 0x8f, 0x06, 0x9b, 0xbb, 0xa0, 0x55, 0x9b, 0x2d, + 0xa5, 0x74, 0x2e, 0x26, 0xc8, 0x5e, 0xcf, 0x2c, + 0xd2, 0x46, 0xe2, 0x04, 0x6d, 0x86, 0x66, 0xbd, + 0xef, 0xe2, 0xe5, 0x60, 0xa0, 0xad, 0x06, 0xd5, + 0x63, 0xd4, 0x3a, 0x4b, 0x19, 0x9e, 0xe1, 0x92, + 0x7e, 0x28, 0x6e, 0x98, 0x38, 0x5b, 0x71, 0x1d, + 0x38, 0xb8, 0x7f, 0x45, 0xc0, 0xec, 0x70, 0x50, + 0x10, 0xfb, 0x2b, 0xb4, 0x6c, 0x80, 0xcd, 0x90, + 0x91, 0xf1, 0x7e, 0x83, 0x23, 0x0c, 0x24, 0x75, + 0x38, 0x8b, 0x9d, 0xda, 0x41, 0x21, 0xa4, 0xbf, + 0x2d, 0xd9, 0x63, 0x6f, 0xb2, 0x78, 0x71, 0x74, + 0xeb, 0x76, 0x01, 0xe7, 0x22, 0x56, 0x92, 0xea, + 0xc6, 0x0b, 0xe8, 0xc0, 0x37, 0xec, 0x3b, 0x68, + 0xa2, 0x63, 0x83, 0x43, 0xea, 0xdc, 0x84, 0xcc, + 0xb7, 0x6c, 0xb8, 0xfb, 0xb7, 0x0e, 0x90, 0x49, + 0x56, 0xc6, 0x25, 0x24, 0xf7, 0x44, 0x46, 0x4b, + 0x9a, 0x4f, 0x29, 0xdc, 0xaf, 0x16, 0x16, 0x16, + 0x98, 0xeb, 0x48, 0xec, 0xac, 0xe3, 0x11, 0x5b, + 0xc4, 0x28, 0xd6, 0x6f, 0xdf, 0xbc, 0xba, 0xbb, + 0xc9, 0xe5, 0x55, 0x8c, 0xaf, 0xb3, 0x5c, 0x4d, + 0xe4, 0xee, 0x9e, 0xce, 0x67, 0xd8, 0x97, 0x9e, + 0x27, 0x46, 0xd0, 0x1f, 0x18, 0x24, 0xfc, 0x50, + 0x68, 0x47, 0x65, 0x05, 0x3f, 0x54, 0xe9, 0x88, + 0xf4, 0xf4, 0xb0, 0x18, 0x2f, 0x9b, 0x72, 0x65, + 0x24, 0xb5, 0xa0, 0x70, 0xca, 0xce, 0x1a, 0x77, + 0x47, 0x85, 0xc7, 0xb2, 0xba, 0x4e, 0x94, 0xbb, + 0xba, 0xbd, 0xd3, 0xb6, 0x37, 0x37, 0x84, 0xba, + 0x77, 0xc7, 0xdd, 0x3d, 0xdb, 0xdc, 0x03, 0x8b, + 0x5a, 0xe3, 0xce, 0x02, 0x81, 0xb1, 0xf6, 0x5f, + 0x8d, 0x86, 0x61, 0x2d, 0xed, 0xdc, 0x97, 0x6d, + 0x06, 0xa6, 0x20, 0xd1, 0x1b, 0x5d, 0x4e, 0x47, + 0x1a, 0xb9, 0xd4, 0x57, 0x28, 0xe3, 0x64, 0x6c, + 0x6c, 0x71, 0xb4, 0x31, 0x8c, 0x01, 0xad, 0x6b, + 0x76, 0x00, 0x06, 0xc0, 0x02, 0x0f, 0xa4, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x11, 0x99, 0x6f, 0xae, 0x87, 0x98, 0xf6, 0xd4, + 0xdb, 0x7b, 0xd1, 0xcc, 0xa1, 0x32, 0xdf, 0x5d, + 0x0f, 0x31, 0xed, 0xa9, 0xb6, 0xf7, 0xa3, 0x99, + 0x79, 0xd8, 0x3e, 0x7b, 0x1d, 0xa6, 0xd7, 0xe9, + 0x97, 0x45, 0xde, 0x0d, 0x9d, 0x15, 0x6b, 0x61, + 0xbc, 0xf4, 0x59, 0xbc, 0x9b, 0xfc, 0x52, 0xaa, + 0x5a, 0x13, 0x75, 0xe7, 0xf2, 0xbe, 0x7a, 0xb6, + 0xde, 0x7a, 0x2c, 0xde, 0x4d, 0xfe, 0x29, 0x55, + 0x2d, 0x09, 0xba, 0xf3, 0xf9, 0x5f, 0x3d, 0x7a, + 0xb4, 0xec, 0x55, 0xde, 0x70, 0xd7, 0xc6, 0xb5, + 0xe7, 0x2d, 0x68, 0x88, 0xb3, 0x6c, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x2a, 0x27, 0xb5, 0x5f, 0x46, 0xc6, 0xf9, 0x49, + 0x7c, 0x56, 0xab, 0xda, 0x85, 0xd4, 0xba, 0x62, + 0xdf, 0x50, 0xc7, 0x6f, 0x1c, 0xf3, 0xbe, 0xdc, + 0x5b, 0xb9, 0xce, 0x69, 0x8d, 0xa1, 0xd5, 0xe2, + 0x00, 0x6d, 0xe2, 0xe6, 0x41, 0x83, 0x40, 0xff, + 0x00, 0x6a, 0x59, 0xf3, 0xc9, 0xf6, 0x8e, 0x58, + 0x7d, 0xa3, 0xff, 0x00, 0x6b, 0x4b, 0xe5, 0xa1, + 0xf1, 0x8a, 0x98, 0xc2, 0x62, 0x63, 0xc3, 0xe3, + 0x22, 0xc7, 0x45, 0x23, 0xa6, 0x64, 0x25, 0xc4, + 0x3d, 0xe0, 0x07, 0x1e, 0x27, 0x17, 0x72, 0x6c, + 0xe5, 0x5f, 0x39, 0xfc, 0x2c, 0x59, 0xcc, 0x6b, + 0xb1, 0xf3, 0x4a, 0xe8, 0x58, 0xe7, 0xb5, 0xe5, + 0xec, 0x00, 0x9a, 0xb0, 0xd7, 0xe3, 0x20, 0x80, + 0xf6, 0x5f, 0xea, 0x1b, 0x8f, 0xfc, 0x97, 0x78, + 0x8c, 0x51, 0x1e, 0xd2, 0xb1, 0x8e, 0xb5, 0xc9, + 0x5b, 0x66, 0x20, 0x1c, 0x3e, 0x70, 0x03, 0x24, + 0x70, 0xe4, 0x96, 0x2d, 0xad, 0x77, 0xba, 0xde, + 0xd2, 0xb9, 0x69, 0xcd, 0x3f, 0x0e, 0x02, 0xca, + 0x4b, 0x38, 0x66, 0x7c, 0xed, 0x92, 0x43, 0x29, + 0x73, 0xc0, 0x04, 0x12, 0x03, 0x69, 0xdc, 0xf3, + 0x2c, 0xb9, 0xdc, 0x2d, 0xb6, 0x6f, 0x1a, 0xfb, + 0x0b, 0x87, 0x18, 0xda, 0xe7, 0x35, 0xcd, 0x91, + 0xa0, 0x17, 0x35, 0xcd, 0x35, 0x04, 0x57, 0xb0, + 0x83, 0x9c, 0x62, 0x44, 0xba, 0xb3, 0x59, 0x36, + 0xea, 0xe1, 0xbf, 0xc2, 0xe2, 0x13, 0xcc, 0xdd, + 0xe1, 0xb1, 0xc4, 0x1a, 0x1a, 0xdf, 0x74, 0xd1, + 0x5f, 0x35, 0x9e, 0x4e, 0xeb, 0x19, 0xa7, 0xae, + 0x6e, 0x6d, 0x09, 0x64, 0xe4, 0xb2, 0x36, 0xc8, + 0x37, 0xb3, 0x8c, 0xf0, 0x97, 0x0e, 0xbf, 0x51, + 0x79, 0xa6, 0xb4, 0x9d, 0x9e, 0x9e, 0x33, 0xba, + 0x09, 0x9f, 0x71, 0x25, 0xc7, 0x08, 0x73, 0xe4, + 0x01, 0xa4, 0x35, 0xbf, 0x14, 0x70, 0xf5, 0xcd, + 0x54, 0xad, 0xf5, 0x95, 0xb5, 0xfd, 0xa4, 0xb6, + 0x77, 0x4c, 0xe9, 0x20, 0x99, 0xbc, 0x2f, 0x67, + 0x5b, 0xac, 0x79, 0x08, 0xde, 0x83, 0x9b, 0xe8, + 0xad, 0x37, 0x89, 0xcf, 0xb6, 0xe6, 0xef, 0x2b, + 0x3b, 0xe5, 0x9a, 0x27, 0x80, 0x61, 0xe9, 0x38, + 0x49, 0x14, 0xaf, 0x48, 0xf7, 0x1e, 0xe8, 0xd5, + 0x45, 0x6a, 0x58, 0xf1, 0x30, 0x6a, 0x17, 0x41, + 0x89, 0x0d, 0x16, 0x70, 0x98, 0xd9, 0x56, 0x12, + 0xe6, 0x97, 0x8a, 0x71, 0x9e, 0x22, 0x4d, 0x76, + 0xab, 0x5b, 0xbd, 0x96, 0x5a, 0x74, 0xf5, 0x8f, + 0x23, 0x2b, 0x60, 0x3f, 0x14, 0xb0, 0x17, 0xd3, + 0xa9, 0xc5, 0xc4, 0x07, 0xbc, 0xb6, 0xae, 0xfd, + 0x99, 0xe1, 0xa6, 0x6c, 0x2d, 0xb6, 0x9a, 0x5b, + 0x51, 0x13, 0x38, 0x5c, 0x5b, 0xc2, 0xf3, 0x23, + 0xab, 0x5e, 0x37, 0x17, 0x72, 0xf3, 0x20, 0xb7, + 0x8d, 0xc3, 0x99, 0x17, 0xc4, 0x2c, 0x74, 0x70, + 0xc7, 0x1b, 0xde, 0x64, 0x73, 0x1a, 0x1a, 0xe7, + 0x91, 0x42, 0xe2, 0x05, 0x38, 0x8f, 0x3a, 0xfb, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x41, + 0x1d, 0xa8, 0xfd, 0x47, 0x79, 0xe4, 0xfe, 0x73, + 0x56, 0xbe, 0x86, 0xf5, 0x33, 0xbc, 0xbb, 0xfb, + 0x4d, 0x5b, 0x1a, 0x8f, 0xd4, 0x77, 0x9e, 0x4f, + 0xe7, 0x35, 0x6b, 0xe8, 0x6f, 0x53, 0x3b, 0xcb, + 0xbf, 0xb4, 0xd5, 0x78, 0xe1, 0xce, 0x96, 0x33, + 0xcc, 0x53, 0xb9, 0x3a, 0xd6, 0x24, 0x44, 0x54, + 0x6c, 0x22, 0x22, 0x02, 0x22, 0x20, 0x2d, 0x5c, + 0x87, 0xa1, 0x5c, 0xf9, 0x27, 0xf8, 0xa5, 0x6d, + 0x2d, 0x5c, 0x87, 0xa1, 0x5c, 0xf9, 0x27, 0xf8, + 0xa5, 0x4d, 0x39, 0xe1, 0x5b, 0x9b, 0x15, 0x68, + 0x9d, 0x48, 0x2d, 0x27, 0xe8, 0xf7, 0x1e, 0x1b, + 0x7c, 0x55, 0x3c, 0xa0, 0x74, 0x9f, 0xa3, 0xdc, + 0x78, 0x6d, 0xf1, 0x54, 0xf2, 0xd3, 0x11, 0xc5, + 0xab, 0x4f, 0xdc, 0xc3, 0x03, 0xcb, 0x5b, 0xd1, + 0x3a, 0xc4, 0x44, 0x59, 0x3a, 0x44, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x51, 0x7a, 0x97, 0x2f, 0x26, + 0x17, 0x0f, 0x2e, 0x46, 0x28, 0xdb, 0x33, 0xe2, + 0x73, 0x1a, 0x23, 0x79, 0x20, 0x1e, 0x37, 0x06, + 0xef, 0x1c, 0xeb, 0x36, 0x0f, 0x20, 0xfc, 0x9e, + 0x22, 0xd7, 0x21, 0x23, 0x04, 0x4f, 0xb9, 0x67, + 0x1b, 0x98, 0xd2, 0x48, 0x1b, 0x48, 0xd8, 0x4f, + 0x32, 0x0d, 0xe4, 0x40, 0x2a, 0x40, 0x55, 0xdd, + 0x33, 0xaa, 0x2e, 0x33, 0x79, 0x0b, 0xfb, 0x49, + 0x6d, 0xd9, 0x0b, 0x6c, 0x8d, 0x1a, 0xe6, 0x38, + 0x92, 0xee, 0xed, 0xcc, 0xdb, 0xc5, 0xcc, 0x82, + 0xc4, 0x8a, 0x01, 0xba, 0x96, 0x77, 0x6a, 0xf7, + 0x69, 0xee, 0x81, 0x9d, 0x0b, 0x63, 0xe3, 0xe9, + 0xea, 0x78, 0xab, 0xd1, 0x89, 0x29, 0x4d, 0xcb, + 0x6f, 0x33, 0xa8, 0x6c, 0x70, 0xf2, 0xda, 0xc1, + 0x38, 0x73, 0xe7, 0xbd, 0x90, 0x47, 0x04, 0x6d, + 0x1d, 0x57, 0x06, 0x17, 0x17, 0x6e, 0x00, 0x55, + 0x04, 0xa2, 0x21, 0xdf, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x45, 0x82, 0xfa, 0xe1, 0xd6, + 0xb6, 0x57, 0x17, 0x4d, 0x68, 0x71, 0x82, 0x27, + 0xc8, 0x1a, 0x77, 0x12, 0xc6, 0x97, 0x53, 0xde, + 0x51, 0xda, 0x53, 0x3b, 0x2e, 0x7b, 0x15, 0xe7, + 0xf3, 0x42, 0xd8, 0x1d, 0xd2, 0x3a, 0x3e, 0x06, + 0x12, 0x45, 0x1b, 0x4d, 0xbd, 0xd7, 0x3a, 0x09, + 0x84, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, + 0x1f, 0xa8, 0x3d, 0x53, 0x3f, 0xc9, 0xf1, 0x82, + 0x90, 0x51, 0xfa, 0x83, 0xd5, 0x33, 0xfc, 0x9f, + 0x18, 0x2b, 0xdb, 0xdb, 0xa7, 0x4c, 0x32, 0xc4, + 0xf0, 0x2e, 0xee, 0x57, 0xa9, 0xee, 0x95, 0xf5, + 0x43, 0x7c, 0x37, 0xf6, 0xd4, 0xb3, 0xf7, 0x28, + 0x9d, 0x2b, 0xea, 0x86, 0xf8, 0x6f, 0xed, 0xa9, + 0x67, 0xee, 0x53, 0x77, 0x8b, 0x5e, 0xf4, 0xa3, + 0x0d, 0xc0, 0xb7, 0xbb, 0x0e, 0x73, 0x75, 0xfe, + 0x4f, 0x1e, 0x55, 0x9f, 0x62, 0x15, 0xfd, 0x50, + 0x2e, 0xbf, 0xc9, 0xe3, 0xca, 0xb3, 0xec, 0x42, + 0xbf, 0xae, 0x5b, 0x39, 0xeb, 0xdf, 0x97, 0xb1, + 0xf1, 0x4c, 0xd8, 0x3f, 0xe3, 0x5b, 0x11, 0x11, + 0x6c, 0xf3, 0x44, 0x44, 0x40, 0x44, 0x55, 0xbd, + 0x5d, 0xaa, 0xae, 0xb4, 0xfb, 0xec, 0xd9, 0x6f, + 0x6c, 0xcb, 0x93, 0x77, 0xc7, 0x5e, 0x37, 0x39, + 0xb4, 0x2d, 0x2d, 0x02, 0x9c, 0x3d, 0x5e, 0x24, + 0x16, 0x44, 0x54, 0xdf, 0xcd, 0x5a, 0xd7, 0xff, + 0x00, 0xe1, 0xb7, 0x7f, 0xfa, 0x8b, 0x1c, 0x9a, + 0xff, 0x00, 0x2f, 0x61, 0x23, 0x3f, 0x19, 0xc2, + 0x49, 0x6b, 0x13, 0xcd, 0x38, 0xda, 0x5c, 0x3b, + 0x1c, 0x6d, 0xa1, 0x3d, 0x6a, 0xa0, 0xbb, 0x22, + 0xc1, 0x63, 0x7b, 0x6d, 0x7f, 0x69, 0x15, 0xe5, + 0xa3, 0xfa, 0x48, 0x26, 0x68, 0x73, 0x1d, 0xbb, + 0xdc, 0x23, 0xaa, 0x39, 0x56, 0x74, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x50, 0x7a, 0xbb, 0x50, + 0xcd, 0xa7, 0xec, 0x22, 0xbb, 0x86, 0x16, 0x5c, + 0x3a, 0x59, 0x7a, 0x22, 0xd7, 0x92, 0xd0, 0x07, + 0x0b, 0x9d, 0x5e, 0xe7, 0x99, 0x4c, 0xc3, 0x21, + 0x92, 0x18, 0xe4, 0x22, 0x85, 0xec, 0x6b, 0x88, + 0xea, 0x71, 0x0a, 0xa0, 0xfb, 0x44, 0x55, 0x3c, + 0xa6, 0xa8, 0xd4, 0xf6, 0x99, 0x1b, 0x8b, 0x6b, + 0x5c, 0x23, 0xae, 0x6d, 0xe2, 0x79, 0x6c, 0x53, + 0x81, 0x25, 0x1e, 0xdf, 0xd2, 0xee, 0x45, 0x10, + 0x5b, 0x11, 0x50, 0x65, 0xf6, 0x85, 0xa8, 0x21, + 0xb9, 0x65, 0xa4, 0xb8, 0x66, 0xc7, 0x73, 0x2d, + 0x3a, 0x38, 0x5c, 0x64, 0x0f, 0x75, 0x77, 0x51, + 0xb4, 0xeb, 0x2d, 0x8f, 0xce, 0x5a, 0xbf, 0xff, + 0x00, 0xe1, 0xd7, 0x76, 0x25, 0xff, 0x00, 0x44, + 0x17, 0x64, 0x50, 0x31, 0xea, 0x1b, 0xe7, 0x6a, + 0x81, 0x84, 0x36, 0x80, 0x5b, 0x18, 0x84, 0x86, + 0xeb, 0xba, 0xad, 0x4c, 0x62, 0x4e, 0x1d, 0xdc, + 0x3b, 0xcd, 0x14, 0xf2, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x20, 0xde, 0x11, 0x06, 0xf0, 0x82, 0x81, + 0xa3, 0x7f, 0xbe, 0x2f, 0xb9, 0xae, 0x3e, 0xd0, + 0x2e, 0x90, 0xb9, 0xbe, 0x8d, 0xfe, 0xf8, 0xbe, + 0xe6, 0xb8, 0xfb, 0x40, 0xba, 0x42, 0xc7, 0x0f, + 0xb1, 0xe7, 0x4b, 0xd3, 0xf8, 0xcf, 0x33, 0x4f, + 0xaa, 0xb7, 0xa9, 0x17, 0x9b, 0xfa, 0x98, 0xfc, + 0x3f, 0x80, 0xac, 0xd6, 0x9e, 0x8d, 0x17, 0x82, + 0x3b, 0x4b, 0x0e, 0x6f, 0xea, 0x63, 0xf0, 0xfe, + 0x02, 0xb3, 0x5a, 0x7a, 0x34, 0x5e, 0x08, 0xed, + 0x2e, 0x2b, 0x3f, 0xd9, 0xe2, 0x3d, 0x55, 0x0e, + 0x3a, 0xb9, 0x7b, 0x7b, 0xf2, 0xca, 0x88, 0x8b, + 0xd3, 0x60, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0xad, 0x6a, 0x3d, + 0x60, 0xec, 0x65, 0xe3, 0x31, 0x58, 0xdb, 0x63, + 0x7d, 0x93, 0x90, 0x0f, 0xe1, 0x8a, 0xf0, 0xb7, + 0x8b, 0xbd, 0x04, 0x37, 0x69, 0x3c, 0xb4, 0x51, + 0xe7, 0x27, 0xed, 0x31, 0x83, 0xa6, 0x38, 0xe8, + 0x5c, 0xc1, 0xb4, 0xc4, 0x1a, 0xd2, 0xea, 0x73, + 0x09, 0x78, 0x90, 0x5d, 0x51, 0x57, 0x74, 0xc6, + 0xaf, 0x87, 0x37, 0x24, 0x96, 0x77, 0x10, 0x9b, + 0x3c, 0x8c, 0x00, 0x97, 0xc0, 0x49, 0xa3, 0x80, + 0x34, 0x71, 0x6f, 0x16, 0xda, 0x8e, 0x50, 0x55, + 0x89, 0x01, 0x11, 0x10, 0x11, 0x56, 0x75, 0x66, + 0xa9, 0xbe, 0xc5, 0x5d, 0x5a, 0xe3, 0x31, 0x50, + 0x36, 0x7b, 0xfb, 0xca, 0x16, 0xf1, 0x8a, 0x80, + 0x0b, 0xb8, 0x1a, 0x03, 0x41, 0x15, 0x24, 0xf5, + 0xd6, 0xf6, 0x9d, 0x97, 0x53, 0x48, 0xc9, 0xff, + 0x00, 0x30, 0x45, 0x14, 0x4f, 0x05, 0xbd, 0x00, + 0x8a, 0x9b, 0x41, 0xaf, 0x15, 0x78, 0x5c, 0xe1, + 0xb3, 0x62, 0x09, 0x84, 0x44, 0x40, 0x45, 0x13, + 0xa8, 0xb5, 0x1d, 0xb6, 0x06, 0x18, 0x5f, 0x34, + 0x6e, 0x9a, 0x5b, 0x97, 0xf0, 0x43, 0x1b, 0x76, + 0x02, 0x45, 0x2a, 0x5c, 0xee, 0x40, 0x2a, 0xa5, + 0x90, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x46, 0x65, 0xbe, 0xba, 0x1e, 0x63, 0xdb, 0x53, + 0x6d, 0xef, 0x47, 0x32, 0x84, 0xcb, 0x7d, 0x74, + 0x3c, 0xc7, 0xb6, 0xa6, 0xdb, 0xde, 0x8e, 0x65, + 0xe7, 0x60, 0xf9, 0xec, 0x76, 0x9b, 0x5f, 0xa6, + 0x5d, 0x17, 0x78, 0x36, 0x74, 0x55, 0xad, 0x86, + 0xf3, 0xd1, 0x66, 0xf2, 0x6f, 0xf1, 0x4a, 0xa9, + 0x68, 0x4d, 0xd7, 0x9f, 0xca, 0xf9, 0xea, 0xdb, + 0x79, 0xe8, 0xb3, 0x79, 0x37, 0xf8, 0xa5, 0x54, + 0xb4, 0x26, 0xeb, 0xcf, 0xe5, 0x7c, 0xf5, 0xea, + 0xd3, 0xb1, 0x57, 0x79, 0xc3, 0x5f, 0x1a, 0xd7, + 0x9c, 0xb5, 0xa2, 0x22, 0xcd, 0xb0, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x8b, 0x1d, 0xc4, + 0xf1, 0xdb, 0xdb, 0xcb, 0x71, 0x29, 0xa4, 0x70, + 0xb1, 0xd2, 0x3c, 0xfe, 0xab, 0x47, 0x11, 0x41, + 0x92, 0x84, 0xa6, 0xed, 0xea, 0x9f, 0x23, 0x2e, + 0x6f, 0x6e, 0x2d, 0x4e, 0x46, 0x01, 0x7d, 0x71, + 0x7d, 0x03, 0xae, 0xd9, 0x6d, 0x25, 0xc3, 0xad, + 0xed, 0xe0, 0x8c, 0x16, 0x86, 0xc6, 0xd6, 0xb5, + 0xa7, 0x89, 0xf4, 0x70, 0xab, 0x8a, 0xcf, 0x8d, + 0xba, 0x16, 0x90, 0x5a, 0xe4, 0x6c, 0xfa, 0x48, + 0xf1, 0x97, 0x13, 0xf9, 0xa5, 0xdd, 0x94, 0xb2, + 0x19, 0x9b, 0x0c, 0x85, 0xe6, 0x26, 0xcb, 0x04, + 0x84, 0x93, 0xc3, 0xc7, 0xb0, 0xed, 0xa1, 0x05, + 0x05, 0xa5, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x47, 0x6a, + 0x3f, 0x51, 0xde, 0x79, 0x3f, 0x9c, 0xd5, 0xaf, + 0xa1, 0xbd, 0x4c, 0xef, 0x2e, 0xfe, 0xd3, 0x56, + 0xc6, 0xa3, 0xf5, 0x1d, 0xe7, 0x93, 0xf9, 0xcd, + 0x5a, 0xfa, 0x1b, 0xd4, 0xce, 0xf2, 0xef, 0xed, + 0x35, 0x5e, 0x38, 0x73, 0xa5, 0x8c, 0xf3, 0x14, + 0xee, 0x4e, 0xb5, 0x89, 0x11, 0x15, 0x1b, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x0b, 0x57, 0x21, 0xe8, + 0x57, 0x3e, 0x49, 0xfe, 0x29, 0x5b, 0x4b, 0x57, + 0x21, 0xe8, 0x57, 0x3e, 0x49, 0xfe, 0x29, 0x53, + 0x4e, 0x78, 0x56, 0xe6, 0xc5, 0x5a, 0x27, 0x52, + 0x0b, 0x49, 0xfa, 0x3d, 0xc7, 0x86, 0xdf, 0x15, + 0x4f, 0x28, 0x1d, 0x27, 0xe8, 0xf7, 0x1e, 0x1b, + 0x7c, 0x55, 0x3c, 0xb4, 0xc4, 0x71, 0x6a, 0xd3, + 0xf7, 0x30, 0xc0, 0xf2, 0xd6, 0xf4, 0x4e, 0xb1, + 0x11, 0x16, 0x4e, 0x91, 0x11, 0x10, 0x11, 0x11, + 0x05, 0x73, 0xda, 0x17, 0xf6, 0xa5, 0xd7, 0x87, + 0x0f, 0xda, 0x35, 0x6d, 0x68, 0xef, 0xed, 0x6c, + 0x67, 0x91, 0xf9, 0xce, 0x5a, 0xde, 0xd0, 0x01, + 0x3a, 0x52, 0xea, 0x9c, 0x8f, 0x84, 0xff, 0x00, + 0xfa, 0x8d, 0x5b, 0x3a, 0x34, 0x83, 0xa5, 0xb1, + 0xb4, 0xe4, 0x86, 0x87, 0x9c, 0x39, 0xc8, 0x26, + 0x9b, 0xdf, 0x0e, 0x75, 0x42, 0xf6, 0x77, 0xeb, + 0xcc, 0xdf, 0x85, 0xff, 0x00, 0xdd, 0x7a, 0xbe, + 0xb7, 0xbe, 0x1c, 0xea, 0x83, 0xec, 0xe4, 0xf1, + 0x66, 0x73, 0x6f, 0x1d, 0xe9, 0x70, 0xdb, 0xcf, + 0x2b, 0xca, 0x0c, 0xb1, 0x7f, 0x94, 0xe4, 0xf2, + 0x07, 0xec, 0x02, 0x8d, 0xd6, 0xf7, 0x79, 0x97, + 0xe7, 0xac, 0x7a, 0x7b, 0x36, 0xc6, 0x2d, 0xe6, + 0x23, 0x1f, 0x47, 0x57, 0xa7, 0x02, 0x46, 0x16, + 0xd7, 0x6f, 0x73, 0x53, 0x45, 0x25, 0x17, 0xf9, + 0x4e, 0x4f, 0x20, 0x7e, 0xc0, 0x27, 0xb4, 0x0f, + 0x5e, 0xe0, 0x3c, 0xaf, 0xff, 0x00, 0x76, 0x34, + 0x13, 0x33, 0x67, 0x33, 0x36, 0x9a, 0x72, 0xef, + 0x2b, 0x91, 0xb1, 0x65, 0xb5, 0xe5, 0xb1, 0xee, + 0x2d, 0xb8, 0xb8, 0x9a, 0xe6, 0x97, 0x35, 0xa1, + 0xc5, 0xcd, 0x27, 0xf4, 0x94, 0x21, 0xd7, 0x79, + 0xeb, 0xe8, 0xa3, 0x7e, 0x17, 0x17, 0xe7, 0x3d, + 0x14, 0x6d, 0x75, 0xe3, 0xc3, 0x5e, 0xf6, 0xb6, + 0x43, 0xb4, 0xb1, 0xb4, 0x23, 0x70, 0x53, 0xfa, + 0xe7, 0xfb, 0x5b, 0x25, 0xe0, 0x37, 0xed, 0x18, + 0xb1, 0xe8, 0x38, 0x59, 0x0e, 0x95, 0xb2, 0x2c, + 0x14, 0x32, 0xf1, 0xc8, 0xf3, 0xd5, 0x73, 0x9e, + 0x76, 0xf6, 0x02, 0x0f, 0x9c, 0xc6, 0xad, 0x18, + 0x7c, 0x65, 0x9c, 0xd7, 0x56, 0xc5, 0xd9, 0x2b, + 0xd6, 0x02, 0xcb, 0x16, 0x13, 0xb1, 0xc4, 0x0a, + 0xd5, 0xd4, 0xad, 0x01, 0x34, 0xdd, 0x5a, 0xad, + 0x07, 0xe6, 0xbd, 0xa1, 0xf4, 0x66, 0xe0, 0x61, + 0xa1, 0x11, 0x01, 0xc5, 0xd1, 0x56, 0xb2, 0x53, + 0x9b, 0xa4, 0xaf, 0xbc, 0xb7, 0xf5, 0x3d, 0xf6, + 0x99, 0xc6, 0xcf, 0x6d, 0x7f, 0x96, 0x84, 0x4f, + 0x7f, 0x16, 0xdb, 0x46, 0xb4, 0x17, 0x49, 0xdc, + 0x9a, 0xd7, 0x78, 0x00, 0x02, 0x79, 0x56, 0x8b, + 0x35, 0xae, 0x6e, 0xf6, 0x9f, 0x85, 0xe9, 0xfb, + 0x89, 0x38, 0xbb, 0xd7, 0xca, 0x4b, 0x5b, 0xe2, + 0x81, 0xef, 0xa0, 0x93, 0xd2, 0xba, 0xa2, 0x2d, + 0x41, 0x6f, 0x2d, 0x61, 0x36, 0xf7, 0x56, 0xc4, + 0x09, 0xe1, 0xad, 0x47, 0x75, 0xb9, 0xcd, 0x27, + 0x93, 0x61, 0xde, 0xa7, 0x15, 0x0b, 0xd9, 0xe3, + 0xa7, 0x76, 0xa0, 0xcd, 0x1b, 0x86, 0x08, 0xa7, + 0x76, 0xd9, 0x63, 0x6e, 0xd0, 0xd7, 0xf4, 0xae, + 0xe2, 0x68, 0xe6, 0x2b, 0x3c, 0xfe, 0xd1, 0xa7, + 0x86, 0x79, 0x22, 0xfc, 0x1e, 0x57, 0x74, 0x6f, + 0x73, 0x38, 0x83, 0xdd, 0x43, 0xc2, 0x69, 0x5f, + 0xab, 0xe5, 0x41, 0x6a, 0xcc, 0xfa, 0x9e, 0xff, + 0x00, 0xff, 0x00, 0x1a, 0x6f, 0x11, 0xca, 0x03, + 0xd9, 0x9f, 0xf6, 0xd7, 0xff, 0x00, 0xe4, 0x49, + 0xda, 0x6a, 0xcf, 0x67, 0xa8, 0x1f, 0x9d, 0xd3, + 0xd9, 0x59, 0xdf, 0x68, 0xeb, 0x33, 0x0c, 0x32, + 0xc6, 0x18, 0xf2, 0x49, 0x35, 0x89, 0xce, 0xae, + 0xd6, 0xb5, 0x45, 0x68, 0xf9, 0xa4, 0xb7, 0xd0, + 0x17, 0xf3, 0xc7, 0xb1, 0xf1, 0xf9, 0xcb, 0x9a, + 0x46, 0xf0, 0x78, 0x05, 0x10, 0x6d, 0xde, 0xeb, + 0x4b, 0xeb, 0x9c, 0x8c, 0x98, 0xcd, 0x35, 0x62, + 0x32, 0x12, 0xc3, 0x51, 0x2d, 0xc3, 0xcf, 0xf0, + 0xc1, 0x06, 0x84, 0x8a, 0x16, 0xec, 0x07, 0x94, + 0x95, 0x88, 0xeb, 0x2c, 0xee, 0x22, 0xe6, 0x38, + 0xf5, 0x36, 0x35, 0xb0, 0x5b, 0xcc, 0x68, 0xdb, + 0x98, 0x0d, 0x40, 0xfd, 0xe7, 0x03, 0x4e, 0xa5, + 0x6a, 0xb3, 0x7b, 0x32, 0xb6, 0x8a, 0x3d, 0x3c, + 0xf9, 0xda, 0x07, 0x49, 0x3c, 0xef, 0xe9, 0x1d, + 0xcb, 0x46, 0x51, 0xad, 0x0a, 0x4f, 0x59, 0x5b, + 0x45, 0x71, 0xa6, 0x32, 0x02, 0x50, 0x0f, 0x47, + 0x11, 0x95, 0x9d, 0x67, 0x30, 0x87, 0x34, 0x8e, + 0xd2, 0x0c, 0x3a, 0xa7, 0x52, 0xdc, 0x61, 0x6c, + 0x2d, 0x72, 0x16, 0x90, 0xc7, 0x77, 0x6d, 0x3b, + 0xc3, 0x5e, 0xf2, 0x48, 0xa3, 0x5c, 0x38, 0x9a, + 0xe6, 0xf0, 0xf5, 0x40, 0x2a, 0x70, 0x5c, 0x42, + 0x6d, 0xc5, 0xcf, 0x17, 0xf0, 0x4b, 0x3a, 0x5e, + 0x2f, 0xd4, 0xa7, 0x1d, 0x7b, 0x0a, 0x99, 0x8d, + 0xb4, 0x93, 0x31, 0xec, 0xd5, 0xd6, 0xce, 0xee, + 0xe4, 0x89, 0xb2, 0x18, 0x2b, 0xb4, 0xd6, 0x17, + 0x97, 0xb7, 0xde, 0xd8, 0xb1, 0x33, 0x3f, 0x4f, + 0x66, 0x6e, 0x97, 0x8b, 0xf8, 0xed, 0x69, 0xb0, + 0x1d, 0x5a, 0x93, 0xc2, 0x3f, 0xfd, 0x32, 0x82, + 0x4b, 0x49, 0xeb, 0x49, 0x73, 0xf7, 0xd7, 0x16, + 0x93, 0x40, 0xc8, 0x3a, 0x36, 0x74, 0x90, 0x96, + 0x12, 0x4b, 0x9a, 0x1d, 0x43, 0x5e, 0x2e, 0xb1, + 0x0b, 0x73, 0x55, 0x6a, 0x49, 0xb0, 0x82, 0xce, + 0x2b, 0x48, 0x19, 0x73, 0x75, 0x7b, 0x2f, 0x46, + 0xc8, 0x9e, 0x48, 0x14, 0xd8, 0x2b, 0xdc, 0xed, + 0xef, 0x9c, 0x02, 0xab, 0xdb, 0x58, 0xfe, 0x5b, + 0xd4, 0x1a, 0x76, 0x72, 0x38, 0x19, 0x7b, 0x6e, + 0xd8, 0x6e, 0x3a, 0x9c, 0x6f, 0xa8, 0x75, 0x7f, + 0x6d, 0xaa, 0x4a, 0x71, 0xf8, 0xc7, 0xb4, 0x68, + 0xe2, 0xef, 0xa0, 0xc3, 0x44, 0x1c, 0xee, 0xa7, + 0x48, 0x3b, 0xaf, 0x1d, 0xe3, 0xb0, 0x82, 0xe6, + 0x03, 0x80, 0x01, 0xd4, 0xe2, 0xa0, 0xe2, 0xa6, + 0xea, 0xf5, 0x97, 0xa8, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x0a, 0x3f, 0x50, 0x7a, 0xa6, 0x7f, + 0x93, 0xe3, 0x05, 0x20, 0xa3, 0xf5, 0x07, 0xaa, + 0x67, 0xf9, 0x3e, 0x30, 0x57, 0xb7, 0xb7, 0x4e, + 0x98, 0x65, 0x89, 0xe0, 0x5d, 0xdc, 0xaf, 0x53, + 0xdd, 0x2b, 0xea, 0x86, 0xf8, 0x6f, 0xed, 0xa9, + 0x67, 0xee, 0x51, 0x3a, 0x57, 0xd5, 0x0d, 0xf0, + 0xdf, 0xdb, 0x52, 0xcf, 0xdc, 0xa6, 0xef, 0x16, + 0xbd, 0xe9, 0x46, 0x1b, 0x81, 0x6f, 0x76, 0x1c, + 0xe6, 0xeb, 0xfc, 0x9e, 0x3c, 0xab, 0x3e, 0xc4, + 0x2b, 0xfa, 0xa0, 0x5d, 0x7f, 0x93, 0xc7, 0x95, + 0x67, 0xd8, 0x85, 0x7f, 0x5c, 0xb6, 0x73, 0xd7, + 0xbf, 0x2f, 0x63, 0xe2, 0x99, 0xb0, 0x7f, 0xc6, + 0xb6, 0x22, 0x22, 0xd9, 0xe6, 0x88, 0x88, 0x80, + 0xa8, 0x5e, 0xd3, 0x3d, 0x33, 0x0d, 0xe1, 0x3f, + 0xc7, 0x89, 0x5f, 0x55, 0x07, 0xda, 0x83, 0x38, + 0xee, 0x31, 0x2c, 0xad, 0x38, 0xcc, 0x8d, 0xa8, + 0xe4, 0xab, 0xa3, 0x08, 0x3a, 0x03, 0x81, 0xe2, + 0x3c, 0xea, 0x03, 0x5a, 0x5e, 0x63, 0xe0, 0xd3, + 0xd7, 0x91, 0x5e, 0x39, 0x9c, 0x53, 0x46, 0x59, + 0x04, 0x44, 0x8e, 0x27, 0x48, 0x7b, 0xd2, 0xd1, + 0xbf, 0x66, 0xf5, 0x0d, 0x27, 0xb3, 0x08, 0x43, + 0x5c, 0x23, 0xca, 0xdc, 0x07, 0x8a, 0xf0, 0x97, + 0x00, 0x45, 0x7a, 0xf4, 0x70, 0x55, 0xfc, 0x56, + 0x27, 0x17, 0x61, 0xa8, 0x4e, 0x2f, 0x54, 0xc4, + 0xf7, 0xcb, 0xc4, 0x04, 0x13, 0x74, 0x87, 0xa1, + 0x75, 0x7b, 0xce, 0x2e, 0x5e, 0x17, 0x75, 0x6b, + 0xce, 0x82, 0xdf, 0xec, 0xe6, 0x29, 0xe3, 0xd3, + 0x11, 0x99, 0x41, 0x0d, 0x96, 0x69, 0x1f, 0x08, + 0x3f, 0xa0, 0x48, 0x02, 0x9c, 0xe4, 0x15, 0xf1, + 0x92, 0xd6, 0x57, 0x72, 0x64, 0x9f, 0x88, 0xd3, + 0x96, 0x7f, 0x88, 0x5d, 0x44, 0x48, 0x96, 0x57, + 0x1f, 0xe1, 0xb4, 0xb7, 0x61, 0xdc, 0x46, 0xed, + 0xd5, 0x25, 0x58, 0x2f, 0xdf, 0xe6, 0x78, 0xbb, + 0x97, 0xc0, 0xd1, 0x1f, 0x9b, 0xdb, 0xc8, 0x63, + 0x6b, 0x45, 0x00, 0xe0, 0x61, 0xe1, 0x00, 0x0e, + 0x65, 0xce, 0xb4, 0x56, 0x5b, 0x2d, 0x8d, 0xb1, + 0x9d, 0xd6, 0x18, 0x69, 0x32, 0x3e, 0x71, 0x25, + 0x64, 0xb9, 0x61, 0x3b, 0xda, 0x3b, 0xcd, 0x8d, + 0x3b, 0xab, 0x5f, 0x75, 0x04, 0xf3, 0xb5, 0x86, + 0x7f, 0x11, 0x3c, 0x6d, 0xd4, 0xd8, 0xd6, 0xc3, + 0x6b, 0x29, 0xe1, 0x17, 0x36, 0xe6, 0xa1, 0xa7, + 0x9b, 0x89, 0xc0, 0xf3, 0x56, 0xaa, 0xd5, 0x2d, + 0xed, 0xac, 0x36, 0x4e, 0xbe, 0x7c, 0x83, 0xcd, + 0x59, 0x1f, 0x4c, 0x65, 0x1b, 0x47, 0x05, 0x38, + 0xaa, 0x15, 0x2f, 0x37, 0x98, 0xd4, 0x79, 0x8c, + 0x5c, 0xf8, 0xe9, 0x74, 0xe4, 0xec, 0x13, 0x01, + 0xc2, 0xfe, 0xe9, 0xdc, 0x2e, 0x69, 0x0e, 0x6b, + 0x80, 0xe0, 0x1b, 0xa8, 0xa5, 0xf0, 0x10, 0x36, + 0x3d, 0x18, 0xcb, 0x7d, 0x43, 0x17, 0x45, 0x0c, + 0x0d, 0x91, 0xb3, 0xc7, 0x70, 0x08, 0xa4, 0x4d, + 0x79, 0x2d, 0xe2, 0x1b, 0xfa, 0x94, 0x41, 0xa3, + 0x0e, 0xac, 0xd5, 0x19, 0x8e, 0x39, 0x74, 0xfe, + 0x29, 0x86, 0xd1, 0x8e, 0x2d, 0x6c, 0xd7, 0x0e, + 0xef, 0x88, 0xf9, 0x4c, 0x1d, 0x8a, 0xaf, 0xab, + 0x0d, 0x67, 0x94, 0x83, 0x2d, 0x16, 0x2b, 0x51, + 0x58, 0x0b, 0x39, 0x2e, 0x08, 0x6c, 0x53, 0x30, + 0x9e, 0x1a, 0xbb, 0x63, 0x49, 0x04, 0xb8, 0x16, + 0x93, 0xb2, 0xa0, 0xac, 0x56, 0x9a, 0xde, 0xc6, + 0x18, 0x85, 0x8e, 0x9d, 0xc3, 0xdc, 0xdd, 0x5b, + 0xc1, 0x56, 0xc7, 0xc0, 0x0b, 0x59, 0xb4, 0xd4, + 0xee, 0x0f, 0x76, 0xf3, 0xca, 0xa1, 0x75, 0x2e, + 0x43, 0x35, 0x7f, 0x93, 0xc4, 0xcd, 0x94, 0xc7, + 0x8c, 0x73, 0x44, 0xb4, 0xb7, 0x69, 0x35, 0x7b, + 0x87, 0x1c, 0x7c, 0x5c, 0x5c, 0xdb, 0x39, 0x10, + 0x4e, 0xfb, 0x52, 0xf5, 0x1d, 0xb7, 0xfe, 0x4f, + 0xcc, 0x7a, 0xb6, 0xda, 0x7a, 0x24, 0x1e, 0x49, + 0x9e, 0x28, 0x55, 0x3f, 0x6a, 0x9e, 0xa5, 0xb6, + 0xff, 0x00, 0xca, 0xf9, 0x8f, 0x52, 0x79, 0xbd, + 0x42, 0xfc, 0x0e, 0x36, 0xc6, 0x56, 0x5a, 0x3e, + 0xf7, 0xa7, 0x68, 0x61, 0x6b, 0x09, 0x1c, 0x3c, + 0x2c, 0x69, 0xa9, 0xa3, 0x5c, 0x82, 0x79, 0x2a, + 0x55, 0x2e, 0xd7, 0xda, 0x2c, 0xf7, 0x17, 0x50, + 0xdb, 0x9c, 0x44, 0xb1, 0x89, 0xa4, 0x6c, 0x7c, + 0x65, 0xc6, 0x83, 0x88, 0x86, 0xd7, 0xea, 0xf9, + 0x15, 0xd1, 0x05, 0x0f, 0x52, 0xff, 0x00, 0x91, + 0x30, 0xfc, 0xd0, 0xf8, 0xef, 0x57, 0xca, 0x95, + 0x43, 0xd4, 0xbf, 0xe4, 0x4c, 0x3f, 0x34, 0x3e, + 0x3b, 0xd5, 0xf0, 0xa0, 0xaf, 0x8d, 0x4d, 0x73, + 0xf9, 0xbc, 0xe9, 0xde, 0x85, 0x9d, 0x00, 0x8f, + 0x8f, 0xa6, 0xa9, 0xe3, 0xaf, 0x46, 0x24, 0xef, + 0x77, 0x2c, 0x3a, 0x87, 0x58, 0xfe, 0x05, 0x98, + 0x82, 0xca, 0x68, 0x5a, 0xfb, 0x49, 0x21, 0x32, + 0xc9, 0x28, 0x27, 0xa4, 0x07, 0xba, 0x01, 0xad, + 0x6e, 0xed, 0xe0, 0x6f, 0x51, 0xad, 0xff, 0x00, + 0x2a, 0x3b, 0xc8, 0x7f, 0xf6, 0x02, 0xf8, 0xd5, + 0x70, 0xb2, 0x7d, 0x7b, 0x85, 0x8a, 0x41, 0xc4, + 0xc7, 0x08, 0xaa, 0x0e, 0xe3, 0x49, 0x1e, 0xef, + 0x81, 0x06, 0x5b, 0xbd, 0x55, 0xad, 0x61, 0x80, + 0xe4, 0x8e, 0x15, 0x91, 0x63, 0xda, 0x38, 0xc8, + 0x90, 0x92, 0xf0, 0xcf, 0xd2, 0x75, 0x1c, 0x08, + 0xfd, 0x95, 0xb0, 0x35, 0xc5, 0xce, 0x46, 0x18, + 0x62, 0xd3, 0xf8, 0xf7, 0x5d, 0xdf, 0xc8, 0xce, + 0x3b, 0x86, 0x3c, 0xd2, 0x38, 0x36, 0xd2, 0x8e, + 0x77, 0x72, 0x0d, 0x79, 0x36, 0x85, 0x65, 0xc9, + 0x80, 0xec, 0x6d, 0xd8, 0x76, 0xd0, 0x60, 0x96, + 0xbf, 0xb0, 0xe5, 0x56, 0xf6, 0x5d, 0x13, 0x06, + 0x0a, 0x79, 0x40, 0xee, 0xe4, 0xb8, 0x21, 0xc7, + 0xaa, 0x1a, 0xc6, 0xd3, 0xb6, 0x83, 0xeb, 0x19, + 0xac, 0x72, 0xd1, 0xe6, 0x62, 0xc3, 0xea, 0x1b, + 0x16, 0xda, 0x4d, 0x70, 0x40, 0x8a, 0x46, 0x54, + 0x0a, 0xbb, 0xbd, 0xae, 0xd7, 0x02, 0x09, 0xd9, + 0x50, 0x55, 0x87, 0x37, 0x9a, 0xb3, 0xc2, 0x58, + 0xba, 0xf6, 0xf0, 0x92, 0xd0, 0x78, 0x63, 0x8d, + 0xbd, 0xf3, 0xde, 0x77, 0x35, 0xaa, 0xad, 0xaf, + 0x28, 0x35, 0x0e, 0x9f, 0x70, 0xde, 0x64, 0xa5, + 0x79, 0xa5, 0x8d, 0x60, 0xf6, 0x93, 0x2c, 0xaf, + 0xcd, 0x62, 0xad, 0x44, 0x66, 0xe1, 0x80, 0x19, + 0x1b, 0x6e, 0x3f, 0xf5, 0x1c, 0xe9, 0x38, 0x78, + 0x3d, 0xd0, 0xda, 0x20, 0xdd, 0x87, 0x51, 0x6b, + 0xab, 0xe8, 0xbc, 0xf6, 0xcb, 0x0f, 0x10, 0xb4, + 0x70, 0xe2, 0x8d, 0xb2, 0x13, 0xd2, 0x39, 0xbd, + 0x51, 0x57, 0xb4, 0x9e, 0xc2, 0x95, 0xd3, 0x5a, + 0xaa, 0x0c, 0xe7, 0x4b, 0x6d, 0x24, 0x46, 0xd3, + 0x23, 0x6d, 0xf5, 0xf6, 0xcf, 0xea, 0x03, 0x42, + 0x5b, 0x5a, 0x1d, 0x87, 0x78, 0x3b, 0x94, 0x77, + 0xe6, 0xcd, 0x50, 0x36, 0x0d, 0x33, 0x30, 0x1c, + 0x80, 0x39, 0xdf, 0x41, 0x46, 0x58, 0x33, 0x3d, + 0x75, 0xad, 0xad, 0xb3, 0x12, 0x62, 0x67, 0xb0, + 0x8e, 0x5f, 0xe1, 0xdc, 0xd4, 0x12, 0xda, 0x70, + 0x16, 0x97, 0x39, 0xd4, 0x1d, 0x64, 0x1d, 0x05, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x06, 0xf0, 0x88, + 0x37, 0x84, 0x14, 0x0d, 0x1b, 0xfd, 0xf1, 0x7d, + 0xcd, 0x71, 0xf6, 0x81, 0x74, 0x85, 0xcd, 0xf4, + 0x6f, 0xf7, 0xc5, 0xf7, 0x35, 0xc7, 0xda, 0x05, + 0xd2, 0x16, 0x38, 0x7d, 0x8f, 0x3a, 0x5e, 0x9f, + 0xc6, 0x79, 0x9a, 0x7d, 0x55, 0xbd, 0x48, 0xbc, + 0xdf, 0xd4, 0xc7, 0xe1, 0xfc, 0x05, 0x66, 0xb4, + 0xf4, 0x68, 0xbc, 0x11, 0xda, 0x58, 0x73, 0x7f, + 0x53, 0x1f, 0x87, 0xf0, 0x15, 0x9a, 0xd3, 0xd1, + 0xa2, 0xf0, 0x47, 0x69, 0x71, 0x59, 0xfe, 0xcf, + 0x11, 0xea, 0xa8, 0x71, 0xd5, 0xcb, 0xdb, 0xdf, + 0x96, 0x54, 0x44, 0x5e, 0x9b, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x07, + 0x3c, 0xbc, 0xbc, 0x1a, 0x6b, 0x5e, 0xdc, 0x64, + 0x72, 0x31, 0x39, 0xf6, 0xb7, 0xad, 0x77, 0x45, + 0x33, 0x45, 0x48, 0x6b, 0xc3, 0x45, 0x5b, 0xd5, + 0xe1, 0x2d, 0xa1, 0x0a, 0xe3, 0x63, 0xa9, 0x30, + 0x39, 0x0a, 0x0b, 0x5b, 0xe8, 0x5c, 0xe7, 0x6e, + 0x8d, 0xce, 0xe0, 0x7f, 0xec, 0xbf, 0x84, 0xaf, + 0x19, 0x75, 0x80, 0xd4, 0x0d, 0x9e, 0xcd, 0xae, + 0x86, 0xfd, 0x90, 0x1a, 0x4d, 0x19, 0x15, 0xe1, + 0x26, 0xa3, 0xe3, 0x0d, 0xfb, 0x0e, 0xe5, 0x0d, + 0x7d, 0xec, 0xd7, 0x4f, 0xdc, 0xd5, 0xd6, 0xc6, + 0x5b, 0x37, 0x9f, 0xd0, 0x77, 0x1b, 0x3f, 0x66, + 0x4a, 0x9f, 0x7d, 0x04, 0x9b, 0xb4, 0xb5, 0x99, + 0xd4, 0x6d, 0xd4, 0x2c, 0x96, 0x48, 0xe7, 0x03, + 0x6c, 0x4d, 0xe1, 0x11, 0xbb, 0xb9, 0x2c, 0x24, + 0xf2, 0xed, 0x0b, 0xe7, 0x54, 0x6a, 0x78, 0xb0, + 0x10, 0x44, 0x1b, 0x17, 0x9c, 0xde, 0x5d, 0x38, + 0xb6, 0xde, 0x0a, 0xd2, 0xb4, 0xa0, 0xe2, 0x75, + 0x36, 0xd2, 0xa4, 0x6e, 0xde, 0xab, 0x18, 0xe9, + 0xb3, 0x1a, 0x43, 0x50, 0xdb, 0x61, 0xee, 0xee, + 0x0d, 0xd6, 0x36, 0xf4, 0x80, 0xc2, 0x49, 0x20, + 0x07, 0x1e, 0x10, 0xf6, 0x87, 0x54, 0xb4, 0x87, + 0x6f, 0x0a, 0xc5, 0xaa, 0x72, 0xf8, 0x0c, 0x4b, + 0xad, 0xe7, 0xc8, 0xdb, 0x36, 0xee, 0xf8, 0x1a, + 0xda, 0x46, 0x1a, 0x0c, 0x83, 0x84, 0xf7, 0xc1, + 0xc7, 0xbd, 0x1c, 0x48, 0x23, 0xcd, 0xc7, 0xb4, + 0xd7, 0xc7, 0xd3, 0xb6, 0xda, 0xd1, 0x80, 0x8a, + 0xf9, 0xbf, 0x72, 0x5f, 0xcd, 0xb5, 0xdb, 0xfd, + 0xd5, 0xbd, 0xa5, 0x35, 0x4c, 0xb9, 0xc6, 0xdc, + 0xdb, 0x5d, 0x40, 0x2d, 0xf2, 0x16, 0x7f, 0x58, + 0xc1, 0x5e, 0x17, 0x6d, 0xe1, 0xad, 0x1d, 0xb5, + 0xa4, 0x3b, 0x61, 0x0b, 0x4d, 0x9a, 0x9f, 0x58, + 0xde, 0xd3, 0xcc, 0x30, 0x06, 0x36, 0xbb, 0xbd, + 0x92, 0xe1, 0xc4, 0x0e, 0x73, 0xc5, 0xd1, 0xa8, + 0xed, 0x0d, 0xe7, 0x67, 0x56, 0xe6, 0x3c, 0xf4, + 0x34, 0x5d, 0x16, 0x38, 0xce, 0x23, 0xef, 0x43, + 0xfa, 0x56, 0xf1, 0x70, 0xfb, 0xa8, 0x23, 0xf2, + 0xd3, 0xea, 0x87, 0x6a, 0xec, 0x73, 0xee, 0xed, + 0xad, 0xd9, 0x95, 0x6b, 0x5b, 0xe6, 0xb0, 0xb1, + 0xdf, 0xc3, 0x70, 0xe2, 0x7d, 0x38, 0x8f, 0x11, + 0xe5, 0xaf, 0x2a, 0xba, 0xb3, 0x33, 0x79, 0x8c, + 0xc1, 0xc9, 0x91, 0xd4, 0x91, 0xc7, 0x04, 0xf1, + 0xb9, 0xc3, 0xa2, 0x80, 0xd4, 0x38, 0x1d, 0x91, + 0xb5, 0xbd, 0xd3, 0xbb, 0xa3, 0xce, 0xa0, 0x75, + 0x07, 0xf9, 0x17, 0x0b, 0xe0, 0x33, 0xc6, 0x95, + 0x79, 0xed, 0x4e, 0x47, 0xf9, 0xa6, 0x3a, 0x06, + 0xf7, 0x92, 0x4b, 0x23, 0x9c, 0x3a, 0xa5, 0xad, + 0x68, 0x6f, 0x8c, 0x50, 0x65, 0xb5, 0xcc, 0xeb, + 0xec, 0xc4, 0x7e, 0x7b, 0x8d, 0xb4, 0xb6, 0xb5, + 0xb3, 0x7d, 0x4c, 0x22, 0x63, 0xdd, 0x3c, 0x73, + 0xb8, 0xd4, 0xf3, 0xd0, 0x2d, 0xed, 0x3f, 0xaa, + 0xee, 0x6e, 0xb2, 0x0f, 0xc2, 0xe6, 0xad, 0xc5, + 0x96, 0x52, 0x31, 0x56, 0x81, 0xde, 0x48, 0x00, + 0xae, 0xcd, 0xf4, 0x34, 0xda, 0x36, 0xd0, 0xad, + 0x58, 0xb3, 0x1a, 0xf2, 0x28, 0x99, 0x14, 0x78, + 0x08, 0x83, 0x23, 0x68, 0x63, 0x00, 0x7e, 0xc0, + 0x1a, 0x28, 0x3e, 0x3a, 0x8d, 0xbb, 0xb4, 0xd6, + 0x19, 0x3c, 0xfe, 0x3b, 0x29, 0x71, 0x89, 0xf3, + 0x57, 0x5a, 0x3d, 0x81, 0xcf, 0x8d, 0xcd, 0x35, + 0x60, 0x7d, 0x49, 0x75, 0x5f, 0xc8, 0x09, 0x41, + 0x8b, 0xda, 0x24, 0x99, 0xa3, 0x7b, 0x6c, 0xcb, + 0x88, 0xa2, 0x6d, 0x9b, 0x26, 0x3e, 0x61, 0x23, + 0x4f, 0x76, 0xf3, 0x46, 0x57, 0xa4, 0xee, 0x8d, + 0x36, 0xa9, 0xeb, 0xec, 0xbe, 0xaf, 0xc7, 0xe0, + 0x2e, 0x32, 0x37, 0x96, 0xd6, 0xac, 0xba, 0xb7, + 0x95, 0xbf, 0xc3, 0x6d, 0x5e, 0xc3, 0x01, 0xee, + 0x4b, 0xbb, 0x97, 0xef, 0x0e, 0x3d, 0x85, 0xa3, + 0xed, 0x3a, 0x9f, 0xfe, 0x22, 0x9f, 0xef, 0xbf, + 0xff, 0x00, 0xb6, 0xae, 0x77, 0x56, 0xd1, 0x5d, + 0xdb, 0xcd, 0x6b, 0x38, 0xac, 0x53, 0xb1, 0xd1, + 0xbc, 0x7e, 0xab, 0x85, 0x0a, 0x0d, 0x5c, 0x26, + 0x4d, 0xb9, 0x6c, 0x4d, 0xad, 0xfb, 0x68, 0x0c, + 0xec, 0x05, 0xed, 0x1b, 0x9a, 0xf1, 0xb1, 0xed, + 0xf7, 0x08, 0x51, 0x79, 0xcd, 0x47, 0x7d, 0x6d, + 0xa8, 0x31, 0xf8, 0x4c, 0x6b, 0x23, 0x92, 0x6b, + 0xaa, 0x3a, 0xe1, 0xd2, 0x02, 0x78, 0x18, 0x4e, + 0xf1, 0xc2, 0xe1, 0xf1, 0x41, 0x2a, 0x33, 0xd9, + 0xf5, 0xcc, 0x96, 0x32, 0xe4, 0xf4, 0xfd, 0xe3, + 0xb8, 0x5f, 0x65, 0x23, 0xa5, 0x6d, 0x76, 0x77, + 0x35, 0xe1, 0x93, 0xe0, 0x77, 0xba, 0xbc, 0xd1, + 0xcd, 0x39, 0x9d, 0x45, 0x94, 0xd4, 0x92, 0x0a, + 0xc6, 0x1c, 0x60, 0xb5, 0x27, 0x90, 0x1e, 0xa7, + 0x34, 0x60, 0x76, 0x50, 0x5d, 0x91, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x04, 0x66, 0x5b, 0xeb, 0xa1, 0xe6, 0x3d, + 0xb5, 0x36, 0xde, 0xf4, 0x73, 0x28, 0x4c, 0xb7, + 0xd7, 0x43, 0xcc, 0x7b, 0x6a, 0x6d, 0xbd, 0xe8, + 0xe6, 0x5e, 0x76, 0x0f, 0x9e, 0xc7, 0x69, 0xb5, + 0xfa, 0x65, 0xd1, 0x77, 0x83, 0x67, 0x45, 0x5a, + 0xd8, 0x6f, 0x3d, 0x16, 0x6f, 0x26, 0xff, 0x00, + 0x14, 0xaa, 0x96, 0x84, 0xdd, 0x79, 0xfc, 0xaf, + 0x9e, 0xad, 0xb7, 0x9e, 0x8b, 0x37, 0x93, 0x7f, + 0x8a, 0x55, 0x4b, 0x42, 0x6e, 0xbc, 0xfe, 0x57, + 0xcf, 0x5e, 0xad, 0x3b, 0x15, 0x77, 0x9c, 0x35, + 0xf1, 0xad, 0x79, 0xcb, 0x5a, 0x22, 0x2c, 0xdb, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x0b, 0x0d, 0xed, 0xdc, 0x56, 0x56, + 0x73, 0x5e, 0x4c, 0x69, 0x15, 0xbb, 0x1d, 0x23, + 0xb9, 0x9a, 0x2b, 0x45, 0x99, 0x54, 0x3d, 0xa3, + 0xe4, 0x1f, 0x1e, 0x3a, 0xdf, 0x13, 0x6f, 0xb6, + 0xe3, 0x23, 0x20, 0x1c, 0x23, 0x79, 0x63, 0x48, + 0xd9, 0xf2, 0x9e, 0x42, 0x08, 0x4c, 0x0e, 0xa7, + 0xce, 0xc5, 0x96, 0xb0, 0xbc, 0xca, 0xdc, 0xc8, + 0xfc, 0x76, 0x51, 0xf2, 0x31, 0xac, 0x79, 0xee, + 0x1b, 0xdd, 0x70, 0x54, 0x75, 0x38, 0x5c, 0x47, + 0xb8, 0xba, 0x57, 0x59, 0x53, 0xb5, 0x6e, 0x9b, + 0x64, 0x7a, 0x36, 0x08, 0x20, 0x1f, 0xc5, 0xc4, + 0x35, 0xaf, 0x0e, 0x1b, 0xc8, 0xa5, 0x26, 0x3d, + 0x93, 0xc4, 0xa6, 0xf4, 0xb6, 0x5b, 0xf1, 0x7c, + 0x1d, 0xb5, 0xdb, 0x8d, 0x66, 0x0d, 0xe8, 0xa7, + 0xf2, 0x8c, 0xee, 0x5d, 0xd9, 0xde, 0x82, 0x07, + 0xda, 0x1e, 0x53, 0x2b, 0x63, 0x3e, 0x36, 0x2c, + 0x7d, 0xd4, 0x96, 0xbe, 0x71, 0xd2, 0x35, 0xfd, + 0x19, 0xa0, 0x27, 0x8a, 0x30, 0xd2, 0x79, 0xaa, + 0xbe, 0xbf, 0x2c, 0x6b, 0x9a, 0xff, 0x00, 0x71, + 0x1f, 0xdf, 0xff, 0x00, 0x45, 0xa7, 0xed, 0x39, + 0xc1, 0xb7, 0x78, 0x77, 0x38, 0xd1, 0xad, 0x32, + 0x12, 0x7a, 0xc1, 0xd1, 0x12, 0xac, 0x07, 0x5d, + 0xe9, 0x42, 0x49, 0x17, 0xe3, 0xfe, 0x39, 0x3e, + 0x82, 0x08, 0x0c, 0x94, 0x3a, 0xff, 0x00, 0x4f, + 0xdb, 0x9c, 0x87, 0xe2, 0x42, 0xfe, 0xde, 0x2d, + 0xb3, 0x34, 0x8e, 0x2a, 0x37, 0xaa, 0xe6, 0xbd, + 0xb5, 0xe1, 0xea, 0xd0, 0xab, 0x66, 0x9d, 0xcc, + 0x45, 0x9b, 0xc5, 0xc1, 0x7e, 0xc6, 0xf0, 0x39, + 0xf5, 0x6c, 0xb1, 0xfe, 0x8b, 0xda, 0x68, 0xe1, + 0xcd, 0xd4, 0x55, 0xad, 0x4b, 0xae, 0xb0, 0xf7, + 0x18, 0xc9, 0xf1, 0xf8, 0xb7, 0x3a, 0xee, 0xe6, + 0xf1, 0xa6, 0x21, 0x46, 0x38, 0x34, 0x07, 0x6c, + 0x27, 0xba, 0x00, 0x93, 0xd4, 0x00, 0x29, 0x9d, + 0x0f, 0x89, 0xb9, 0xc4, 0xe0, 0x61, 0x82, 0xe8, + 0x70, 0x4f, 0x2b, 0xdd, 0x3b, 0xe3, 0x3b, 0xd9, + 0xc7, 0x4a, 0x34, 0xf5, 0xe8, 0x36, 0xa0, 0xa2, + 0xfe, 0x6b, 0xcf, 0xda, 0xe6, 0xa4, 0x9a, 0x4b, + 0xc9, 0xa4, 0xb1, 0xb6, 0xbb, 0x2d, 0x96, 0x22, + 0x6a, 0xce, 0x8f, 0xa4, 0x70, 0xe1, 0xfd, 0x90, + 0x69, 0xcc, 0xba, 0xb3, 0x5c, 0xd7, 0x34, 0x39, + 0xa6, 0xad, 0x70, 0x05, 0xa7, 0xaa, 0x0e, 0xd0, + 0x57, 0x2d, 0xc6, 0xe3, 0x3f, 0x13, 0x6e, 0xaa, + 0xb7, 0x6b, 0x78, 0xa4, 0x61, 0x33, 0x44, 0x3f, + 0x5e, 0x39, 0x64, 0x77, 0xbe, 0x2a, 0x15, 0xd7, + 0x43, 0xe4, 0xbf, 0x11, 0xd3, 0x96, 0xcf, 0x73, + 0xb8, 0xa5, 0xb6, 0xad, 0xbc, 0x95, 0xdf, 0x58, + 0xfb, 0xd2, 0x79, 0xdb, 0x44, 0x1f, 0x5a, 0xcf, + 0x2d, 0x2e, 0x2b, 0x03, 0x2c, 0xb6, 0xef, 0x2c, + 0xba, 0x99, 0xcd, 0x86, 0xdd, 0xcd, 0xef, 0x83, + 0x9d, 0xbc, 0x8e, 0x66, 0x82, 0xa0, 0xf4, 0x2d, + 0xee, 0x47, 0x35, 0x06, 0x5a, 0xcf, 0x2b, 0x73, + 0x2d, 0xc3, 0x78, 0x1b, 0x15, 0x24, 0x35, 0x2d, + 0xe3, 0x12, 0x31, 0xd4, 0x5b, 0x19, 0xcf, 0xff, + 0x00, 0x33, 0xad, 0x71, 0x98, 0x71, 0xdd, 0x5b, + 0xe3, 0x87, 0x9d, 0xdd, 0x0e, 0x4e, 0x2e, 0xf8, + 0x03, 0xfb, 0xa3, 0xdd, 0x5a, 0xbe, 0xcd, 0x8d, + 0x6f, 0x73, 0x67, 0xff, 0x00, 0x75, 0xbe, 0x3c, + 0x88, 0x36, 0x4b, 0x31, 0xd3, 0x5d, 0xdb, 0x5a, + 0xea, 0x6e, 0x86, 0x17, 0xd9, 0x5a, 0xbe, 0xd1, + 0xec, 0xb8, 0xee, 0x5b, 0x2d, 0x4b, 0x38, 0x27, + 0x82, 0x43, 0xdc, 0xed, 0x6b, 0x7a, 0xb5, 0x05, + 0x67, 0xb1, 0x73, 0xf2, 0x36, 0xf6, 0x98, 0x7b, + 0x79, 0x1b, 0x77, 0x69, 0x67, 0x33, 0x64, 0xb8, + 0xc8, 0x44, 0xd2, 0xd8, 0x8c, 0x50, 0x3b, 0x8e, + 0x18, 0x81, 0xa0, 0x0e, 0x91, 0xc4, 0x0e, 0x2e, + 0x1d, 0x8a, 0xd0, 0xf6, 0x32, 0x46, 0xf0, 0xc8, + 0xd0, 0xf6, 0xf5, 0x1c, 0x01, 0x1e, 0xfa, 0xf4, + 0x00, 0x00, 0x68, 0x00, 0x01, 0xb8, 0x0d, 0x80, + 0x20, 0xf5, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x47, 0x6a, + 0x3f, 0x51, 0xde, 0x79, 0x3f, 0x9c, 0xd5, 0xaf, + 0xa1, 0xbd, 0x4c, 0xef, 0x2e, 0xfe, 0xd3, 0x56, + 0xc6, 0xa3, 0xf5, 0x1d, 0xe7, 0x93, 0xf9, 0xcd, + 0x5a, 0xfa, 0x1b, 0xd4, 0xce, 0xf2, 0xef, 0xed, + 0x35, 0x5e, 0x38, 0x73, 0xa5, 0x8c, 0xf3, 0x14, + 0xee, 0x4e, 0xb5, 0x89, 0x11, 0x15, 0x1b, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x0b, 0x57, 0x21, 0xe8, + 0x57, 0x3e, 0x49, 0xfe, 0x29, 0x5b, 0x4b, 0x57, + 0x21, 0xe8, 0x57, 0x3e, 0x49, 0xfe, 0x29, 0x53, + 0x4e, 0x78, 0x56, 0xe6, 0xc5, 0x5a, 0x27, 0x52, + 0x0b, 0x49, 0xfa, 0x3d, 0xc7, 0x86, 0xdf, 0x15, + 0x4f, 0x28, 0x1d, 0x27, 0xe8, 0xf7, 0x1e, 0x1b, + 0x7c, 0x55, 0x3c, 0xb4, 0xc4, 0x71, 0x6a, 0xd3, + 0xf7, 0x30, 0xc0, 0xf2, 0xd6, 0xf4, 0x4e, 0xb1, + 0x11, 0x16, 0x4e, 0x91, 0x11, 0x10, 0x11, 0x11, + 0x06, 0x96, 0x6b, 0x1a, 0xdc, 0xa6, 0x26, 0xeb, + 0x1e, 0xe3, 0xc2, 0x6e, 0x23, 0x2d, 0x6b, 0xba, + 0x8e, 0x1b, 0x5a, 0x7b, 0x21, 0x51, 0xf0, 0x1a, + 0xaa, 0xe3, 0x4b, 0x46, 0xec, 0x26, 0x7a, 0xd6, + 0x56, 0x32, 0x17, 0x38, 0xc3, 0x23, 0x00, 0x24, + 0x02, 0x6a, 0x40, 0xe2, 0x20, 0x39, 0xb5, 0xda, + 0x08, 0x2b, 0xa2, 0xaf, 0x89, 0xa0, 0x82, 0x76, + 0xf0, 0x4f, 0x1b, 0x25, 0x6f, 0xe8, 0xbd, 0xa1, + 0xc3, 0xf7, 0xaa, 0x82, 0x99, 0x92, 0xf6, 0x95, + 0x63, 0x24, 0x0f, 0x83, 0x0f, 0x04, 0xd3, 0x5e, + 0x4a, 0x0b, 0x22, 0x2f, 0x6d, 0x03, 0x49, 0x14, + 0xaf, 0x0b, 0x4b, 0x9c, 0xe2, 0x3a, 0x8a, 0x43, + 0x41, 0xe0, 0x2e, 0x70, 0xf8, 0xd9, 0x65, 0xbd, + 0x6f, 0x05, 0xdd, 0xeb, 0x83, 0xdf, 0x19, 0xde, + 0xd6, 0x37, 0xbd, 0x0e, 0xeb, 0xed, 0x24, 0xab, + 0x04, 0x16, 0x56, 0x76, 0xe7, 0x8a, 0xde, 0xde, + 0x28, 0x5d, 0xd5, 0x8d, 0x8d, 0x61, 0xec, 0xb4, + 0x05, 0x99, 0x05, 0x1e, 0x22, 0x3f, 0xed, 0x49, + 0x36, 0xff, 0x00, 0xe8, 0x1f, 0xb0, 0x09, 0xed, + 0x20, 0x49, 0x05, 0xde, 0x1f, 0x25, 0xd1, 0xb9, + 0xd0, 0x5b, 0x4a, 0x7a, 0x42, 0x37, 0x02, 0x1c, + 0xc7, 0x81, 0x5f, 0xd6, 0x03, 0x62, 0xbb, 0xf0, + 0x33, 0x8b, 0x8f, 0x85, 0xbc, 0x7f, 0xa5, 0x41, + 0x5e, 0xca, 0x39, 0x8c, 0x7b, 0x4b, 0x1e, 0xd0, + 0xf6, 0x9d, 0xed, 0x70, 0xa8, 0x3e, 0xe1, 0x41, + 0x53, 0xce, 0x67, 0xec, 0x33, 0xba, 0x2f, 0x29, + 0x77, 0x65, 0xc6, 0x23, 0x8f, 0x86, 0x37, 0x09, + 0x00, 0x6b, 0x83, 0xb8, 0xe3, 0x77, 0x21, 0x3d, + 0x55, 0x23, 0xa2, 0x4f, 0xff, 0x00, 0xea, 0xb8, + 0xff, 0x00, 0x01, 0xde, 0x3b, 0x94, 0xcb, 0x20, + 0x82, 0x36, 0x16, 0x32, 0x26, 0x31, 0x87, 0x7b, + 0x1a, 0xd0, 0x1a, 0x79, 0xc0, 0x14, 0x5f, 0x41, + 0xad, 0x68, 0xa3, 0x40, 0x68, 0x1b, 0x80, 0x14, + 0x08, 0x28, 0x1a, 0xc0, 0x3b, 0x19, 0xac, 0x6c, + 0x73, 0x77, 0xb0, 0xba, 0x7c, 0x6b, 0x43, 0x06, + 0xc1, 0x50, 0x0b, 0x38, 0x81, 0x1d, 0x4a, 0x82, + 0x78, 0x80, 0xe5, 0x53, 0x53, 0xfb, 0x43, 0xc2, + 0x18, 0xc3, 0x71, 0xdd, 0x2e, 0x42, 0xf1, 0xfb, + 0x21, 0xb6, 0x8e, 0x37, 0x02, 0x5d, 0xc9, 0xc5, + 0x51, 0xb3, 0xae, 0xac, 0xaf, 0x63, 0x24, 0x61, + 0x64, 0x8d, 0x0f, 0x63, 0xb7, 0xb5, 0xc0, 0x10, + 0x79, 0xc1, 0x58, 0xe0, 0xb4, 0xb4, 0xb7, 0x24, + 0xdb, 0xc1, 0x14, 0x24, 0xef, 0x31, 0xb1, 0xac, + 0xf1, 0x40, 0x41, 0x43, 0xf6, 0x7e, 0xeb, 0x88, + 0x75, 0x2e, 0x56, 0xda, 0xfc, 0x08, 0xef, 0x5f, + 0x1f, 0x1c, 0xb1, 0x92, 0x2b, 0xc5, 0xc6, 0x1c, + 0xef, 0x19, 0x74, 0x2e, 0x27, 0x75, 0x4a, 0xf8, + 0xe0, 0x8c, 0x3b, 0x8c, 0x35, 0xa1, 0xdf, 0xa5, + 0x41, 0x5e, 0xca, 0xfa, 0x41, 0xa7, 0x9a, 0xa9, + 0xc3, 0xdf, 0xd7, 0xee, 0xd3, 0x78, 0x8e, 0x55, + 0xbf, 0x67, 0x70, 0xc5, 0x73, 0xa4, 0x65, 0xb7, + 0x93, 0x6c, 0x73, 0xcb, 0x34, 0x6f, 0xa7, 0x51, + 0xcd, 0x0d, 0x2a, 0xe0, 0x40, 0x22, 0x87, 0x68, + 0xea, 0x2f, 0x1a, 0xd6, 0x34, 0x51, 0x8d, 0x0d, + 0x1d, 0x46, 0x80, 0x07, 0xbc, 0x83, 0x9f, 0x60, + 0x72, 0xf2, 0xe8, 0xbb, 0x99, 0xf0, 0xd9, 0xc8, + 0x9e, 0x2d, 0x1e, 0xf3, 0x25, 0xbd, 0xd3, 0x1a, + 0x5c, 0xd3, 0xc9, 0x51, 0xd5, 0x0e, 0x03, 0x93, + 0x68, 0x2b, 0x36, 0xa3, 0xd5, 0xb1, 0x67, 0xed, + 0xbf, 0x03, 0xd3, 0xd1, 0x4b, 0x77, 0x2d, 0xd9, + 0x0d, 0x96, 0x4e, 0x12, 0xd0, 0x18, 0x0d, 0x48, + 0x15, 0xea, 0xf2, 0x93, 0xb2, 0x8a, 0xf3, 0x2c, + 0x30, 0xcc, 0xce, 0x8e, 0x68, 0xdb, 0x2b, 0x0f, + 0xc5, 0x7b, 0x43, 0x87, 0x61, 0xcb, 0xc8, 0x2d, + 0xad, 0xad, 0xc1, 0x6d, 0xbc, 0x4c, 0x84, 0x1d, + 0xe2, 0x36, 0x86, 0x57, 0xf6, 0x40, 0x41, 0xa7, + 0x80, 0xc5, 0x8c, 0x46, 0x1e, 0xdb, 0x1e, 0x48, + 0x7b, 0xa1, 0x67, 0xf1, 0x48, 0xdc, 0x5e, 0xe2, + 0x5c, 0xff, 0x00, 0x72, 0xa5, 0x73, 0x67, 0xe3, + 0xe7, 0x66, 0xa3, 0x3a, 0x53, 0xff, 0x00, 0xf9, + 0x5f, 0x91, 0x6c, 0xe1, 0xbf, 0xa9, 0x4a, 0xd7, + 0x9b, 0xa3, 0x2b, 0xac, 0xaf, 0x9e, 0x8e, 0x3e, + 0x2e, 0x3e, 0x06, 0xf1, 0xfe, 0x95, 0x05, 0x7b, + 0x28, 0x2a, 0xde, 0xd1, 0xed, 0x0c, 0x98, 0x48, + 0xaf, 0x63, 0x14, 0x93, 0x1f, 0x3b, 0x24, 0x69, + 0x1c, 0x8d, 0x77, 0x73, 0xdb, 0xe1, 0x58, 0xfd, + 0x9d, 0x41, 0x2c, 0xd6, 0xd7, 0xd9, 0xbb, 0x8e, + 0xea, 0x7c, 0x8c, 0xe7, 0xba, 0xea, 0xb5, 0x84, + 0x93, 0x4e, 0xb7, 0x13, 0x8a, 0xb7, 0x10, 0xd7, + 0x0a, 0x38, 0x07, 0x03, 0xbc, 0x11, 0x50, 0x8d, + 0x6b, 0x5a, 0x28, 0xd0, 0x1a, 0x3a, 0x80, 0x50, + 0x7b, 0xc8, 0x3d, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x05, 0x1f, 0xa8, 0x3d, 0x53, 0x3f, + 0xc9, 0xf1, 0x82, 0x90, 0x51, 0xfa, 0x83, 0xd5, + 0x33, 0xfc, 0x9f, 0x18, 0x2b, 0xdb, 0xdb, 0xa7, + 0x4c, 0x32, 0xc4, 0xf0, 0x2e, 0xee, 0x57, 0xa9, + 0xee, 0x95, 0xf5, 0x43, 0x7c, 0x37, 0xf6, 0xd4, + 0xb3, 0xf7, 0x28, 0x9d, 0x2b, 0xea, 0x86, 0xf8, + 0x6f, 0xed, 0xa9, 0x67, 0xee, 0x53, 0x77, 0x8b, + 0x5e, 0xf4, 0xa3, 0x0d, 0xc0, 0xb7, 0xbb, 0x0e, + 0x73, 0x75, 0xfe, 0x4f, 0x1e, 0x55, 0x9f, 0x62, + 0x15, 0xfd, 0x50, 0x2e, 0xbf, 0xc9, 0xe3, 0xca, + 0xb3, 0xec, 0x42, 0xbf, 0xae, 0x5b, 0x39, 0xeb, + 0xdf, 0x97, 0xb1, 0xf1, 0x4c, 0xd8, 0x3f, 0xe3, + 0x5b, 0x11, 0x11, 0x6c, 0xf3, 0x44, 0x44, 0x40, + 0x54, 0x2f, 0x69, 0xa4, 0x0b, 0xcc, 0x35, 0x7f, + 0x49, 0xfe, 0x3c, 0x4a, 0xfa, 0xbe, 0x5d, 0x1c, + 0x6e, 0xa7, 0x1b, 0x1a, 0xea, 0x6e, 0xe2, 0x00, + 0xd3, 0xb2, 0x83, 0xed, 0xdd, 0xf1, 0xe7, 0x55, + 0xad, 0x73, 0xa7, 0x06, 0x67, 0x19, 0xd3, 0xdb, + 0xb6, 0xb7, 0xd6, 0x60, 0xbe, 0x2a, 0x6f, 0x7b, + 0x37, 0xbe, 0x3f, 0x84, 0x75, 0xd5, 0x91, 0x10, + 0x55, 0x74, 0x46, 0x7e, 0x3c, 0xee, 0x21, 0xf8, + 0xeb, 0xc7, 0x71, 0x5e, 0x5b, 0x33, 0xa2, 0x98, + 0x1d, 0xf2, 0x44, 0x47, 0x00, 0x7f, 0x3f, 0x21, + 0x50, 0xd8, 0x6c, 0x8c, 0xda, 0x1e, 0xfa, 0xe7, + 0x17, 0x97, 0x89, 0xe7, 0x1f, 0x33, 0xfa, 0x4b, + 0x7b, 0x96, 0x36, 0xa3, 0xa8, 0x1c, 0x3a, 0xb5, + 0x6d, 0x2a, 0x37, 0x82, 0xba, 0x0b, 0x62, 0x89, + 0xa6, 0xac, 0x63, 0x5a, 0x7a, 0xa0, 0x00, 0x7d, + 0xe4, 0x92, 0x28, 0xa5, 0x61, 0x64, 0xac, 0x6c, + 0x8c, 0x3b, 0xda, 0xf0, 0x1c, 0x3b, 0x05, 0x05, + 0x2b, 0x37, 0xaf, 0x23, 0xbc, 0x84, 0x58, 0x69, + 0x8e, 0x96, 0xe2, 0xfe, 0xe0, 0x80, 0x25, 0x6b, + 0x08, 0xe0, 0x15, 0xdb, 0xc2, 0x1d, 0xbc, 0x9e, + 0x6a, 0x05, 0xbb, 0xa8, 0xb1, 0x99, 0xab, 0x8d, + 0x14, 0x6d, 0xa6, 0x90, 0xdd, 0xe4, 0x58, 0x19, + 0x2d, 0xcf, 0x08, 0x15, 0x7f, 0x0b, 0xb8, 0xdc, + 0xc6, 0x86, 0x80, 0x0f, 0x0f, 0xc0, 0xac, 0xb0, + 0x5a, 0x5a, 0x5b, 0x57, 0xcd, 0xe0, 0x8e, 0x1a, + 0xef, 0xe8, 0xd8, 0xd6, 0x57, 0xf6, 0x40, 0x59, + 0x6a, 0x82, 0x93, 0xa6, 0x75, 0xbe, 0x9c, 0xb0, + 0xc1, 0xdb, 0xd9, 0x5c, 0xbd, 0xd6, 0x93, 0xdb, + 0x33, 0x82, 0x58, 0xc3, 0x1c, 0x78, 0x9c, 0x37, + 0xbc, 0x16, 0x8f, 0x8d, 0xd7, 0x50, 0x7a, 0xb3, + 0x33, 0x73, 0x94, 0xbf, 0xc7, 0xe5, 0x4d, 0xb4, + 0x96, 0xd8, 0xa8, 0x65, 0x11, 0xda, 0xc9, 0x30, + 0xe1, 0x32, 0x10, 0xe1, 0x23, 0xdf, 0x4e, 0xa5, + 0x02, 0xe9, 0x6e, 0xb1, 0xb1, 0x7c, 0x9d, 0x2b, + 0xad, 0xa1, 0x74, 0xbb, 0xf8, 0xcc, 0x6d, 0x2e, + 0xaf, 0x3d, 0x16, 0x67, 0x31, 0x8f, 0x00, 0x3d, + 0xad, 0x70, 0x1b, 0x83, 0x80, 0x23, 0xdf, 0x41, + 0x4d, 0xf6, 0xa4, 0xe6, 0xbb, 0x07, 0x6a, 0xe0, + 0x45, 0x1d, 0x73, 0x50, 0x7a, 0xa0, 0xb1, 0xea, + 0xdd, 0x68, 0x4f, 0x9a, 0x41, 0x4f, 0xf6, 0x99, + 0xe2, 0x85, 0xf6, 0xe6, 0x46, 0xe1, 0x47, 0x35, + 0xae, 0x03, 0x70, 0x20, 0x11, 0xef, 0xaf, 0xa4, + 0x1e, 0xf1, 0x3b, 0xaa, 0x57, 0x88, 0x88, 0x28, + 0x7a, 0x94, 0x8f, 0xfb, 0x13, 0x0f, 0xcd, 0x0f, + 0x8e, 0xf5, 0x7c, 0x5f, 0x25, 0x91, 0x97, 0x07, + 0x16, 0xb4, 0xb8, 0x6e, 0x71, 0x00, 0x91, 0xee, + 0xaf, 0xa4, 0x14, 0x76, 0x91, 0xff, 0x00, 0x6a, + 0xb8, 0x7f, 0xec, 0x7f, 0xf6, 0x42, 0x6a, 0x42, + 0x3f, 0xec, 0x3c, 0x25, 0x7f, 0x46, 0x3f, 0x1a, + 0x45, 0x77, 0xe0, 0x67, 0x17, 0x1f, 0x0b, 0x78, + 0xff, 0x00, 0x4a, 0x82, 0xbd, 0x94, 0x2c, 0x61, + 0x70, 0x71, 0x6b, 0x4b, 0x86, 0xe7, 0x10, 0x2a, + 0x39, 0x8a, 0x0c, 0x19, 0x1d, 0x98, 0xeb, 0xbf, + 0x21, 0x2f, 0x88, 0xe5, 0x57, 0xf6, 0x5e, 0x7f, + 0xff, 0x00, 0x5e, 0x96, 0x9b, 0x7f, 0xf9, 0x2f, + 0xf1, 0x58, 0xae, 0x04, 0x02, 0x28, 0x76, 0x83, + 0xbd, 0x78, 0xd6, 0x31, 0x82, 0x8c, 0x68, 0x68, + 0xea, 0x34, 0x00, 0x3d, 0xe4, 0x14, 0x8d, 0x7c, + 0x47, 0xe6, 0x0d, 0x3f, 0xb7, 0xff, 0x00, 0x53, + 0xff, 0x00, 0xbb, 0x1a, 0xdd, 0xd7, 0xd8, 0x4b, + 0xdb, 0xc8, 0xad, 0xb2, 0xb8, 0xe6, 0x97, 0xdd, + 0xe3, 0x9c, 0x5d, 0xc0, 0xd1, 0x57, 0x16, 0x54, + 0x3e, 0xad, 0x1c, 0xa5, 0xae, 0x1b, 0x95, 0xa5, + 0xcc, 0x63, 0x88, 0x2e, 0x6b, 0x5c, 0x46, 0xe2, + 0x40, 0x24, 0x73, 0x55, 0x7d, 0x20, 0xa9, 0xd9, + 0xfb, 0x49, 0xc0, 0xbe, 0xd8, 0x3e, 0xf8, 0xc9, + 0x6d, 0x74, 0xd1, 0xfc, 0x58, 0x78, 0x0b, 0xbb, + 0xa1, 0xbf, 0x84, 0x8f, 0x85, 0x7c, 0x69, 0xcc, + 0xae, 0xa0, 0xcf, 0x67, 0x25, 0xc8, 0x34, 0xc9, + 0x6b, 0x81, 0x60, 0xa4, 0x70, 0xb8, 0x0a, 0x3c, + 0x81, 0x46, 0x80, 0x48, 0xda, 0x6b, 0xdd, 0x3a, + 0x87, 0xac, 0xad, 0x12, 0x58, 0x58, 0xcb, 0x27, + 0x49, 0x2d, 0xb4, 0x32, 0x49, 0xfa, 0x6e, 0x8d, + 0xae, 0x77, 0x64, 0x85, 0x9c, 0x00, 0x00, 0x00, + 0x50, 0x0d, 0x80, 0x0d, 0x81, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x06, 0xf0, 0x88, 0x37, 0x84, + 0x14, 0x0d, 0x1b, 0xfd, 0xf1, 0x7d, 0xcd, 0x71, + 0xf6, 0x81, 0x74, 0x85, 0xcd, 0xf4, 0x6f, 0xf7, + 0xc5, 0xf7, 0x35, 0xc7, 0xda, 0x05, 0xd2, 0x16, + 0x38, 0x7d, 0x8f, 0x3a, 0x5e, 0x9f, 0xc6, 0x79, + 0x9a, 0x7d, 0x55, 0xbd, 0x48, 0xbc, 0xdf, 0xd4, + 0xc7, 0xe1, 0xfc, 0x05, 0x66, 0xb4, 0xf4, 0x68, + 0xbc, 0x11, 0xda, 0x58, 0x73, 0x7f, 0x53, 0x1f, + 0x87, 0xf0, 0x15, 0x9a, 0xd3, 0xd1, 0xa2, 0xf0, + 0x47, 0x69, 0x71, 0x59, 0xfe, 0xcf, 0x11, 0xea, + 0xa8, 0x71, 0xd5, 0xcb, 0xdb, 0xdf, 0x96, 0x54, + 0x44, 0x5e, 0x9b, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x13, 0x76, 0xd4, 0x44, 0x14, + 0x0c, 0x96, 0x3b, 0x35, 0xa5, 0x33, 0xb3, 0xe6, + 0xb1, 0x30, 0x1b, 0xac, 0x7d, 0xd5, 0x4c, 0xf1, + 0x34, 0x13, 0xc2, 0x1c, 0x78, 0x9c, 0xd7, 0x06, + 0xed, 0x14, 0x3b, 0x5a, 0xe5, 0xb4, 0xdf, 0x6a, + 0x38, 0xfe, 0x0a, 0x3a, 0xc2, 0xe0, 0x4f, 0xfe, + 0xd8, 0x2d, 0x22, 0xbc, 0xfb, 0xfd, 0xe5, 0x75, + 0x5f, 0x3d, 0x1c, 0x75, 0xe2, 0xe0, 0x6f, 0x17, + 0x56, 0x82, 0xa8, 0x28, 0xb8, 0xcb, 0x4c, 0xc6, + 0xaa, 0xd4, 0x16, 0xf9, 0xcc, 0x8d, 0xb1, 0xb3, + 0xc7, 0x59, 0x50, 0xdb, 0xc4, 0xea, 0x82, 0xe2, + 0xd3, 0xc4, 0xd0, 0x38, 0xa8, 0x5d, 0xdd, 0x6d, + 0x73, 0xa9, 0xd6, 0x5f, 0x5a, 0xda, 0xde, 0xee, + 0xc7, 0x51, 0xe3, 0xf5, 0x17, 0x9b, 0xba, 0xee, + 0xce, 0xdc, 0x30, 0x4a, 0xd6, 0x8a, 0xf0, 0xb9, + 0x8e, 0x26, 0x87, 0x7d, 0x2a, 0x0d, 0x41, 0xea, + 0xab, 0xd5, 0x4a, 0x20, 0xaa, 0x1f, 0x68, 0x76, + 0x17, 0x0d, 0xe0, 0xc4, 0xd9, 0xdd, 0x5e, 0xde, + 0xbf, 0x64, 0x70, 0x74, 0x74, 0x1c, 0x5f, 0xae, + 0xea, 0x9d, 0x8a, 0x27, 0x44, 0xc7, 0x7f, 0x67, + 0xab, 0xf2, 0x10, 0xe4, 0xd8, 0x59, 0x77, 0x3c, + 0x4e, 0x73, 0xf6, 0x77, 0x25, 0xe5, 0xcd, 0x94, + 0x80, 0xed, 0xdb, 0x8a, 0xe8, 0x0d, 0x6b, 0x5b, + 0x5e, 0x10, 0x1b, 0x5d, 0xf4, 0x00, 0x76, 0x97, + 0xbc, 0x94, 0xe4, 0x41, 0x49, 0xd4, 0x0c, 0x79, + 0xf6, 0x87, 0x85, 0x78, 0x69, 0x2c, 0x0c, 0x65, + 0x5c, 0x01, 0xa0, 0xee, 0xa5, 0xde, 0x54, 0xbe, + 0xb4, 0xc0, 0x49, 0x9c, 0xc4, 0x74, 0x76, 0xf4, + 0xf3, 0xbb, 0x77, 0x74, 0xb0, 0x03, 0xb3, 0x8b, + 0x65, 0x1c, 0xca, 0xf2, 0x54, 0x6e, 0x53, 0xf5, + 0x44, 0x14, 0x9c, 0x77, 0xb4, 0x18, 0xec, 0xad, + 0x99, 0x69, 0x9e, 0xb5, 0xb8, 0x82, 0xfa, 0xdd, + 0xa2, 0x37, 0x90, 0xce, 0xff, 0x00, 0x87, 0x65, + 0x48, 0x71, 0x6d, 0x0a, 0xf7, 0x15, 0x7f, 0xa8, + 0x35, 0x26, 0xa0, 0x8f, 0x21, 0x0f, 0x4f, 0x8e, + 0xc2, 0x5b, 0xd2, 0xac, 0x24, 0xb4, 0x4a, 0x1b, + 0xb7, 0x84, 0x8f, 0x8c, 0x5c, 0x77, 0xd3, 0x70, + 0x57, 0x47, 0x35, 0x8e, 0xef, 0x9a, 0x1d, 0x4d, + 0xd5, 0x00, 0xf6, 0xd7, 0xa8, 0x29, 0xbe, 0xd2, + 0xed, 0x2e, 0xa5, 0xb2, 0xb1, 0xbb, 0x82, 0x37, + 0x4a, 0xdb, 0x49, 0x9c, 0xe9, 0x78, 0x45, 0x68, + 0x1c, 0x05, 0x09, 0xa7, 0x25, 0x5a, 0xa6, 0xf4, + 0xee, 0xa4, 0x83, 0x50, 0x41, 0x34, 0xd0, 0xc1, + 0x25, 0xb9, 0x81, 0xcd, 0x6b, 0xdb, 0x25, 0x37, + 0xb8, 0x56, 0xad, 0xa7, 0x22, 0x97, 0x5a, 0x99, + 0x5b, 0xf6, 0x63, 0x31, 0xd3, 0xdf, 0x3a, 0x27, + 0x4a, 0xcb, 0x76, 0xf1, 0xba, 0x38, 0xe8, 0x1c, + 0x45, 0x40, 0x34, 0xec, 0xa0, 0xa3, 0x6b, 0xf8, + 0x6e, 0x31, 0x19, 0x86, 0xe5, 0xed, 0x3b, 0x91, + 0x91, 0xb7, 0x92, 0xda, 0x62, 0x3f, 0x4b, 0x87, + 0xa3, 0x3e, 0xe9, 0x61, 0x1d, 0x85, 0x6e, 0xd2, + 0xb8, 0xaf, 0xc2, 0x70, 0x36, 0x96, 0x8e, 0x14, + 0x94, 0xb7, 0xa4, 0x9b, 0xc3, 0x93, 0xba, 0x3d, + 0x8d, 0xca, 0xad, 0x1d, 0xd4, 0xfa, 0xe3, 0x3f, + 0x66, 0xf6, 0xdb, 0x3e, 0x0c, 0x46, 0x34, 0xf4, + 0xb2, 0x74, 0x9f, 0x19, 0xd5, 0xad, 0x0d, 0x36, + 0x55, 0xdc, 0x20, 0x53, 0xa9, 0x55, 0x7f, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x11, 0x99, 0x6f, 0xae, + 0x87, 0x98, 0xf6, 0xd4, 0xdb, 0x7b, 0xd1, 0xcc, + 0xa1, 0x32, 0xdf, 0x5d, 0x0f, 0x31, 0xed, 0xa9, + 0xb6, 0xf7, 0xa3, 0x99, 0x79, 0xd8, 0x3e, 0x7b, + 0x1d, 0xa6, 0xd7, 0xe9, 0x97, 0x45, 0xde, 0x0d, + 0x9d, 0x15, 0x6b, 0x61, 0xbc, 0xf4, 0x59, 0xbc, + 0x9b, 0xfc, 0x52, 0xaa, 0x5a, 0x13, 0x75, 0xe7, + 0xf2, 0xbe, 0x7a, 0xb6, 0xde, 0x7a, 0x2c, 0xde, + 0x4d, 0xfe, 0x29, 0x55, 0x2d, 0x09, 0xba, 0xf3, + 0xf9, 0x5f, 0x3d, 0x7a, 0xb4, 0xec, 0x55, 0xde, + 0x70, 0xd7, 0xc6, 0xb5, 0xe7, 0x2d, 0x68, 0x88, + 0xb3, 0x6c, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x0d, 0xa6, 0x8b, 0x9a, + 0xde, 0xbb, 0x2f, 0xa8, 0xb5, 0x8d, 0xc5, 0xce, + 0x18, 0x46, 0xe7, 0x62, 0xe8, 0xd8, 0x5d, 0x29, + 0x1c, 0x00, 0x46, 0x78, 0x6b, 0xb7, 0x61, 0xab, + 0xc9, 0x21, 0x5f, 0xf2, 0xcf, 0xbd, 0x66, 0x32, + 0xe4, 0xe3, 0xe3, 0x33, 0x5e, 0x18, 0xdc, 0x20, + 0x60, 0x20, 0x77, 0x6e, 0xee, 0x41, 0xab, 0x88, + 0x1b, 0x2b, 0x55, 0x0b, 0xa1, 0x30, 0x17, 0x38, + 0x6c, 0x64, 0xa6, 0xf9, 0x9d, 0x1d, 0xed, 0xd4, + 0x85, 0xd2, 0x34, 0x90, 0xe2, 0x1a, 0xde, 0xe5, + 0x82, 0xad, 0x24, 0x75, 0x4a, 0x0d, 0x19, 0x6d, + 0xbd, 0xa6, 0xcb, 0x1b, 0xe2, 0x92, 0x4b, 0x37, + 0x32, 0x46, 0x96, 0xbd, 0xa4, 0x47, 0xb5, 0xae, + 0x14, 0x23, 0xbd, 0x5a, 0x1a, 0x06, 0x7b, 0x9c, + 0x36, 0x72, 0xf3, 0x4e, 0x5f, 0x51, 0x8f, 0x93, + 0xba, 0x63, 0x6b, 0x51, 0xd2, 0x30, 0x57, 0xb9, + 0x3d, 0x47, 0x30, 0xfb, 0xcb, 0xa1, 0x2a, 0x6e, + 0xae, 0xd3, 0xf9, 0x69, 0x33, 0x96, 0x59, 0xcc, + 0x24, 0x26, 0x6b, 0x88, 0xb8, 0x7a, 0x66, 0x87, + 0x35, 0xbb, 0x63, 0x35, 0x61, 0xee, 0xcb, 0x6b, + 0x56, 0x9e, 0x14, 0x1a, 0x7e, 0xd3, 0x80, 0x75, + 0xe6, 0x1d, 0xae, 0x15, 0x05, 0xd2, 0x02, 0x0f, + 0x28, 0x2f, 0x8a, 0xaa, 0xcf, 0x2e, 0x90, 0xd3, + 0x0f, 0x6b, 0x98, 0x71, 0xb0, 0x00, 0x6a, 0x2a, + 0xd6, 0xf0, 0x91, 0xcc, 0x41, 0x50, 0xda, 0xe3, + 0x0b, 0x96, 0xcb, 0xcf, 0x8a, 0x9a, 0xc6, 0xd8, + 0xc8, 0x20, 0x2e, 0x74, 0xed, 0xe2, 0x60, 0x2c, + 0xe2, 0x74, 0x6e, 0xa1, 0xe2, 0x70, 0xae, 0xe3, + 0xb9, 0x5c, 0x0e, 0xf2, 0x83, 0x9c, 0x38, 0x4d, + 0xa0, 0xf3, 0xed, 0xac, 0x62, 0xe3, 0x11, 0x76, + 0x6a, 0xc9, 0x1c, 0xd6, 0x99, 0x1a, 0xdf, 0x8d, + 0xc2, 0xfa, 0x57, 0x89, 0x9d, 0x4e, 0x50, 0xba, + 0x34, 0x32, 0xc7, 0x33, 0x23, 0x9a, 0x27, 0x07, + 0xc7, 0x20, 0x0f, 0x63, 0xc6, 0xe2, 0xd7, 0x6d, + 0x04, 0x28, 0xdd, 0x45, 0x85, 0x87, 0x37, 0x8a, + 0x96, 0xc9, 0xf4, 0x6c, 0x9d, 0xfd, 0xbc, 0x87, + 0xe2, 0x48, 0x3b, 0xd3, 0xcd, 0xc8, 0x54, 0x66, + 0x86, 0x83, 0x50, 0x63, 0xed, 0x1d, 0x8d, 0xcb, + 0xdb, 0x3a, 0x28, 0x61, 0x3c, 0x56, 0xb3, 0x17, + 0x31, 0xc3, 0x84, 0x9e, 0xea, 0x3e, 0xe5, 0xc4, + 0xec, 0x3b, 0x42, 0x08, 0xaf, 0x67, 0xfe, 0xbf, + 0xcf, 0x79, 0x43, 0xf6, 0xd2, 0x2c, 0x9a, 0x61, + 0xed, 0xc0, 0xea, 0x8c, 0xbe, 0x16, 0x53, 0xc1, + 0x6d, 0x20, 0x37, 0x50, 0x13, 0xbb, 0x85, 0xa3, + 0x8f, 0xc4, 0x77, 0xbc, 0xb6, 0xb4, 0x6e, 0x13, + 0x29, 0x8e, 0xcb, 0xe5, 0xee, 0x6f, 0x60, 0x30, + 0xc3, 0x74, 0xf2, 0x60, 0x79, 0x73, 0x4f, 0x10, + 0xe9, 0x1e, 0xef, 0x8a, 0x49, 0xdc, 0x79, 0x56, + 0x1d, 0x77, 0xa7, 0x32, 0xb7, 0xf7, 0x76, 0xd7, + 0xf8, 0x78, 0x8c, 0x93, 0xf4, 0x6f, 0x82, 0x7e, + 0x17, 0x35, 0xa7, 0x84, 0xf7, 0xbb, 0x5c, 0x46, + 0xf0, 0xe7, 0x35, 0x06, 0x6d, 0x07, 0x1b, 0xef, + 0xa7, 0xc9, 0xea, 0x39, 0x87, 0x77, 0x90, 0x9c, + 0xb2, 0x1a, 0xf2, 0x46, 0xc3, 0xb8, 0x7b, 0xc3, + 0xdc, 0x5a, 0x5e, 0xcd, 0x7d, 0x37, 0x35, 0xe5, + 0x1b, 0xe3, 0x48, 0xad, 0xb8, 0x4c, 0x73, 0x71, + 0x78, 0xab, 0x4b, 0x06, 0xff, 0x00, 0xe8, 0x46, + 0xd0, 0xf3, 0xd5, 0x79, 0xda, 0xf3, 0xfb, 0x44, + 0xa8, 0x0d, 0x0d, 0x84, 0xca, 0x62, 0xee, 0x72, + 0x92, 0x5f, 0xc0, 0x60, 0x65, 0xcb, 0xda, 0x61, + 0x25, 0xcd, 0x77, 0x10, 0x0e, 0x79, 0xf8, 0xae, + 0x3f, 0xa4, 0x82, 0xd8, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x82, 0x3b, 0x51, 0xfa, 0x8e, 0xf3, + 0xc9, 0xfc, 0xe6, 0xad, 0x7d, 0x0d, 0xea, 0x67, + 0x79, 0x77, 0xf6, 0x9a, 0xb6, 0x35, 0x1f, 0xa8, + 0xef, 0x3c, 0x9f, 0xce, 0x6a, 0xd7, 0xd0, 0xde, + 0xa6, 0x77, 0x97, 0x7f, 0x69, 0xaa, 0xf1, 0xc3, + 0x9d, 0x2c, 0x67, 0x98, 0xa7, 0x72, 0x75, 0xac, + 0x48, 0x88, 0xa8, 0xd8, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x5a, 0xb9, 0x0f, 0x42, 0xb9, 0xf2, 0x4f, + 0xf1, 0x4a, 0xda, 0x5a, 0xb9, 0x0f, 0x42, 0xb9, + 0xf2, 0x4f, 0xf1, 0x4a, 0x9a, 0x73, 0xc2, 0xb7, + 0x36, 0x2a, 0xd1, 0x3a, 0x90, 0x5a, 0x4f, 0xd1, + 0xee, 0x3c, 0x36, 0xf8, 0xaa, 0x79, 0x40, 0xe9, + 0x3f, 0x47, 0xb8, 0xf0, 0xdb, 0xe2, 0xa9, 0xe5, + 0xa6, 0x23, 0x8b, 0x56, 0x9f, 0xb9, 0x86, 0x07, + 0x96, 0xb7, 0xa2, 0x75, 0x88, 0x88, 0xb2, 0x74, + 0x88, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x94, 0x28, 0xa8, 0x7e, 0xd3, 0xdd, 0x27, 0x4b, + 0x8a, 0x63, 0x1e, 0xe6, 0x71, 0xba, 0x46, 0x92, + 0xd2, 0x46, 0xf2, 0xc1, 0xc9, 0xce, 0x82, 0xfb, + 0xc2, 0xee, 0xa1, 0x42, 0x08, 0xde, 0x28, 0xa9, + 0x1f, 0xf5, 0x9b, 0x7f, 0xab, 0xdc, 0x7e, 0xcf, + 0xff, 0x00, 0xd6, 0xa3, 0xf2, 0xf8, 0x5c, 0xfe, + 0x91, 0x89, 0xb9, 0x4c, 0x76, 0x4e, 0x4b, 0x8b, + 0x76, 0x3d, 0xad, 0x96, 0x39, 0x2b, 0x41, 0xc4, + 0x68, 0x38, 0x98, 0x5c, 0xe6, 0xb9, 0xa7, 0x72, + 0x0e, 0x8c, 0x8b, 0x53, 0x11, 0x91, 0x66, 0x53, + 0x17, 0x6d, 0x90, 0x60, 0xe1, 0x17, 0x11, 0x87, + 0x96, 0xf5, 0x1d, 0xb9, 0xc3, 0xdc, 0x2b, 0x69, + 0xcf, 0x63, 0x05, 0x5e, 0xe0, 0xc0, 0x77, 0x17, + 0x10, 0x3b, 0x68, 0x3d, 0x44, 0x1b, 0x45, 0x46, + 0xd0, 0x77, 0x14, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x45, 0xf2, 0xd7, 0xb1, 0xfd, 0xe3, 0x9a, + 0xea, 0x6f, 0xe1, 0x20, 0xf6, 0x97, 0xd2, 0x02, + 0x23, 0x88, 0x68, 0xab, 0x88, 0x68, 0x1b, 0xc9, + 0x34, 0x08, 0x08, 0x22, 0xa0, 0xd4, 0x1d, 0xc4, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x28, 0xfd, 0x41, 0xea, 0x99, + 0xfe, 0x4f, 0x8c, 0x14, 0x82, 0x8f, 0xd4, 0x1e, + 0xa9, 0x9f, 0xe4, 0xf8, 0xc1, 0x5e, 0xde, 0xdd, + 0x3a, 0x61, 0x96, 0x27, 0x81, 0x77, 0x72, 0xbd, + 0x4f, 0x74, 0xaf, 0xaa, 0x1b, 0xe1, 0xbf, 0xb6, + 0xa5, 0x9f, 0xb9, 0x44, 0xe9, 0x5f, 0x54, 0x37, + 0xc3, 0x7f, 0x6d, 0x4b, 0x3f, 0x72, 0x9b, 0xbc, + 0x5a, 0xf7, 0xa5, 0x18, 0x6e, 0x05, 0xbd, 0xd8, + 0x73, 0x9b, 0xaf, 0xf2, 0x78, 0xf2, 0xac, 0xfb, + 0x10, 0xaf, 0xea, 0x81, 0x75, 0xfe, 0x4f, 0x1e, + 0x55, 0x9f, 0x62, 0x15, 0xfd, 0x72, 0xd9, 0xcf, + 0x5e, 0xfc, 0xbd, 0x8f, 0x8a, 0x66, 0xc1, 0xff, + 0x00, 0x1a, 0xd8, 0x88, 0x8b, 0x67, 0x9a, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x50, + 0x9d, 0xcb, 0xe2, 0x59, 0x63, 0x86, 0x27, 0xcd, + 0x2b, 0x83, 0x23, 0x8d, 0xa5, 0xef, 0x71, 0xdc, + 0x1a, 0xd1, 0x52, 0x55, 0x0a, 0x3b, 0x9c, 0xee, + 0xb8, 0xbd, 0x9d, 0x96, 0xb7, 0x0e, 0xc7, 0x61, + 0x20, 0x77, 0x09, 0x2d, 0xef, 0x9d, 0xd4, 0xad, + 0x08, 0xe2, 0x71, 0x1b, 0x69, 0x5a, 0x04, 0x17, + 0xf0, 0xf6, 0x13, 0xc2, 0x1c, 0xd2, 0xef, 0xd1, + 0x04, 0x57, 0xb0, 0xbd, 0x54, 0xb9, 0x3d, 0x98, + 0x63, 0x84, 0x75, 0xb7, 0xbf, 0xb9, 0x8e, 0xe0, + 0x77, 0xb2, 0xbb, 0x84, 0x8a, 0xf5, 0xc3, 0x78, + 0x4f, 0xbe, 0xbe, 0x74, 0xc6, 0x77, 0x2b, 0x8f, + 0xcd, 0x3b, 0x4b, 0xe7, 0x64, 0x32, 0xc8, 0x36, + 0x5a, 0xce, 0xe3, 0x52, 0x4d, 0x38, 0x9a, 0x38, + 0x8e, 0xd7, 0x35, 0xcd, 0xef, 0x6a, 0x82, 0xec, + 0x88, 0xbe, 0x78, 0xe3, 0xe2, 0xe0, 0xe2, 0x6f, + 0x1f, 0xe8, 0xd4, 0x57, 0xb0, 0x83, 0xe9, 0x11, + 0x28, 0x80, 0x8b, 0xc0, 0xf6, 0x17, 0x70, 0x07, + 0x02, 0xef, 0xd1, 0x04, 0x57, 0xb0, 0xbe, 0x9a, + 0x2a, 0x47, 0x3a, 0x0f, 0x11, 0x55, 0x74, 0x86, + 0x6b, 0x23, 0x95, 0xcc, 0x66, 0x5b, 0x77, 0x27, + 0x14, 0x76, 0xcf, 0x11, 0xc1, 0x13, 0x45, 0x18, + 0xc0, 0x1f, 0x23, 0x76, 0x0e, 0xa9, 0x03, 0x69, + 0x2a, 0xd4, 0x80, 0x8b, 0xc0, 0xe6, 0x92, 0x5a, + 0x1c, 0x0b, 0x9b, 0xbc, 0x02, 0x09, 0x1c, 0xeb, + 0xd2, 0x40, 0x1c, 0x44, 0xd0, 0x0d, 0xe4, 0xec, + 0x08, 0x08, 0xbc, 0x6b, 0x9a, 0xf1, 0x56, 0x38, + 0x38, 0x75, 0x5a, 0x41, 0x1e, 0xf2, 0x8c, 0xd5, + 0x04, 0x8d, 0x39, 0x92, 0x73, 0x49, 0x04, 0x5b, + 0xbc, 0x82, 0x36, 0x14, 0x12, 0x9d, 0x64, 0x55, + 0xdf, 0x67, 0xee, 0x73, 0xf4, 0xb5, 0xab, 0x9e, + 0xe2, 0xe7, 0x17, 0xcd, 0x52, 0x4d, 0x4f, 0xd6, + 0x3b, 0x94, 0xab, 0x12, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x20, 0xde, 0x11, 0x06, + 0xf0, 0x82, 0x81, 0xa3, 0x7f, 0xbe, 0x2f, 0xb9, + 0xae, 0x3e, 0xd0, 0x2e, 0x90, 0xb9, 0xbe, 0x8d, + 0xfe, 0xf8, 0xbe, 0xe6, 0xb8, 0xfb, 0x40, 0xba, + 0x42, 0xc7, 0x0f, 0xb1, 0xe7, 0x4b, 0xd3, 0xf8, + 0xcf, 0x33, 0x4f, 0xaa, 0xb7, 0xa9, 0x17, 0x9b, + 0xfa, 0x98, 0xfc, 0x3f, 0x80, 0xac, 0xd6, 0x9e, + 0x8d, 0x17, 0x82, 0x3b, 0x4b, 0x0e, 0x6f, 0xea, + 0x63, 0xf0, 0xfe, 0x02, 0xb3, 0x5a, 0x7a, 0x34, + 0x5e, 0x08, 0xed, 0x2e, 0x2b, 0x3f, 0xd9, 0xe2, + 0x3d, 0x55, 0x0e, 0x3a, 0xb9, 0x7b, 0x7b, 0xf2, + 0xca, 0x88, 0x8b, 0xd3, 0x60, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x2d, 0x5c, 0x86, 0x4e, 0xc7, 0x19, 0x07, 0x9c, + 0xdf, 0xcc, 0xd8, 0x21, 0x2e, 0x0c, 0x0f, 0x75, + 0x7b, 0xe3, 0xb8, 0x6c, 0x07, 0xa8, 0x83, 0x69, + 0x16, 0x0b, 0x2b, 0xdb, 0x5b, 0xfb, 0x66, 0x5d, + 0xd9, 0xc8, 0x26, 0x82, 0x4a, 0xf0, 0x48, 0xda, + 0xd0, 0xd0, 0xd0, 0xef, 0xeb, 0xac, 0xfb, 0xf6, + 0x20, 0x22, 0x85, 0x7e, 0xb3, 0xd2, 0xf1, 0xbd, + 0xd1, 0xbf, 0x21, 0x18, 0x7b, 0x09, 0x6b, 0x85, + 0x1f, 0xb0, 0x83, 0x43, 0xf1, 0x57, 0x83, 0x5b, + 0x69, 0x5f, 0xea, 0x31, 0xf6, 0x1f, 0xf4, 0x10, + 0x4d, 0xa2, 0xd5, 0xb1, 0xca, 0x63, 0xb2, 0x2c, + 0x2f, 0xb0, 0xb9, 0x8e, 0xe5, 0xad, 0xef, 0xba, + 0x37, 0x02, 0x47, 0x38, 0xde, 0x17, 0xb9, 0x0c, + 0x95, 0x8e, 0x32, 0xdc, 0x5c, 0xdf, 0xcc, 0x20, + 0x84, 0xb8, 0x30, 0x3d, 0xd5, 0x23, 0x88, 0xd6, + 0x83, 0xb9, 0x07, 0xa8, 0x83, 0x65, 0x16, 0xa6, + 0x37, 0x2d, 0x8e, 0xca, 0x44, 0xf9, 0xb1, 0xf3, + 0xb6, 0xe2, 0x38, 0xdd, 0xc0, 0xf7, 0x36, 0xa2, + 0x8e, 0xa5, 0x69, 0xdd, 0x01, 0xc8, 0x56, 0xda, + 0x02, 0xc5, 0x77, 0x75, 0x6d, 0x67, 0x6e, 0xfb, + 0x9b, 0xa9, 0x1b, 0x14, 0x11, 0x8a, 0xbd, 0xef, + 0xd8, 0x07, 0x27, 0xbf, 0xd4, 0x5a, 0x79, 0x2d, + 0x43, 0x86, 0xc5, 0x4a, 0xd8, 0x72, 0x17, 0x4c, + 0xb7, 0x91, 0xed, 0xe3, 0x6b, 0x5c, 0x1c, 0x49, + 0x6d, 0x69, 0x5e, 0xe4, 0x15, 0xaf, 0x76, 0x62, + 0xbd, 0xce, 0xe2, 0xa3, 0x79, 0x0f, 0xb5, 0xe8, + 0x66, 0xbc, 0x88, 0x1e, 0xf5, 0xf2, 0xb7, 0xa3, + 0x6c, 0x6e, 0xdb, 0xfa, 0x2d, 0x79, 0x70, 0x41, + 0xf4, 0x35, 0x14, 0x0c, 0x67, 0x48, 0xeb, 0x1b, + 0xd8, 0xed, 0x37, 0xf9, 0xc1, 0xb7, 0x21, 0x94, + 0xfd, 0x22, 0xd1, 0xdd, 0x81, 0xf2, 0x54, 0x9c, + 0x13, 0xc1, 0x73, 0x0b, 0x27, 0xb7, 0x7b, 0x65, + 0x86, 0x41, 0xc4, 0xc9, 0x18, 0x6a, 0xd2, 0x0f, + 0x28, 0x2a, 0x99, 0x85, 0x9a, 0xf9, 0xf2, 0x62, + 0x48, 0x75, 0xd4, 0x33, 0xdc, 0x48, 0xf7, 0xc9, + 0x75, 0x3d, 0xc1, 0x7c, 0x13, 0xc7, 0x19, 0x77, + 0x49, 0x1b, 0x22, 0xe2, 0x77, 0x74, 0x46, 0xe1, + 0x41, 0xd5, 0x56, 0x0c, 0x3b, 0x1b, 0x6f, 0x94, + 0xcb, 0xd9, 0xc2, 0x29, 0x6d, 0x1c, 0xb1, 0x4c, + 0xc6, 0x0e, 0xf5, 0x92, 0x4c, 0xce, 0x39, 0x5a, + 0xde, 0xa6, 0xd1, 0xc5, 0xee, 0xa0, 0x97, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x11, 0x99, 0x6f, 0xae, 0x87, + 0x98, 0xf6, 0xd4, 0xdb, 0x7b, 0xd1, 0xcc, 0xa1, + 0x32, 0xdf, 0x5d, 0x0f, 0x31, 0xed, 0xa9, 0xb6, + 0xf7, 0xa3, 0x99, 0x79, 0xd8, 0x3e, 0x7b, 0x1d, + 0xa6, 0xd7, 0xe9, 0x97, 0x45, 0xde, 0x0d, 0x9d, + 0x15, 0x6b, 0x61, 0xbc, 0xf4, 0x59, 0xbc, 0x9b, + 0xfc, 0x52, 0xaa, 0x5a, 0x13, 0x75, 0xe7, 0xf2, + 0xbe, 0x7a, 0xb6, 0xde, 0x7a, 0x2c, 0xde, 0x4d, + 0xfe, 0x29, 0x55, 0x2d, 0x09, 0xba, 0xf3, 0xf9, + 0x5f, 0x3d, 0x7a, 0xb4, 0xec, 0x55, 0xde, 0x70, + 0xd7, 0xc6, 0xb5, 0xe7, 0x2d, 0x68, 0x88, 0xb3, + 0x6c, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x72, + 0x54, 0xee, 0x1b, 0xcf, 0x22, 0xf1, 0xae, 0x6b, + 0xfb, 0xc7, 0x07, 0x53, 0x7f, 0x09, 0x07, 0xb4, + 0x83, 0xd4, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x55, 0xac, 0xae, 0x47, 0x56, 0x63, 0x9d, + 0x6e, 0x5c, 0x6c, 0x1e, 0xcb, 0xbb, 0x96, 0xdb, + 0x44, 0x03, 0x65, 0xa8, 0x32, 0x57, 0x84, 0xbb, + 0xba, 0xeb, 0x2c, 0x99, 0x5c, 0x9e, 0xa3, 0xc4, + 0xe1, 0xe5, 0xbb, 0xb8, 0x16, 0x93, 0x5d, 0x74, + 0xb1, 0x45, 0x6e, 0xc8, 0x9a, 0xf0, 0xc3, 0xd2, + 0x3b, 0x84, 0xf1, 0x71, 0x3a, 0xb5, 0xae, 0xea, + 0x20, 0xb0, 0xa2, 0xd0, 0xc7, 0x65, 0xa2, 0xbb, + 0xc2, 0xc5, 0x95, 0x92, 0x91, 0xb0, 0xc4, 0x64, + 0x98, 0x7e, 0x89, 0x60, 0x3d, 0x23, 0x7d, 0xc2, + 0xd2, 0xb4, 0xf4, 0xa6, 0x6e, 0xf7, 0x33, 0x69, + 0x73, 0x35, 0xe4, 0x4c, 0x85, 0xf0, 0xcd, 0xd1, + 0xb5, 0x8c, 0x04, 0x77, 0x25, 0xad, 0x7b, 0x78, + 0xaa, 0x4e, 0xda, 0x39, 0x04, 0xda, 0x22, 0x00, + 0x4e, 0xe4, 0x04, 0x4a, 0x22, 0x02, 0x20, 0x04, + 0xee, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x11, + 0xda, 0x8f, 0xd4, 0x77, 0x9e, 0x4f, 0xe7, 0x35, + 0x6b, 0xe8, 0x6f, 0x53, 0x3b, 0xcb, 0xbf, 0xb4, + 0xd5, 0xb1, 0xa8, 0xfd, 0x47, 0x79, 0xe4, 0xfe, + 0x73, 0x56, 0xbe, 0x86, 0xf5, 0x33, 0xbc, 0xbb, + 0xfb, 0x4d, 0x57, 0x8e, 0x1c, 0xe9, 0x63, 0x3c, + 0xc5, 0x3b, 0x93, 0xad, 0x62, 0x44, 0x45, 0x46, + 0xc2, 0x22, 0x20, 0x22, 0x22, 0x02, 0xd5, 0xc8, + 0x7a, 0x15, 0xcf, 0x92, 0x7f, 0x8a, 0x56, 0xd2, + 0xd5, 0xc8, 0x7a, 0x15, 0xcf, 0x92, 0x7f, 0x8a, + 0x54, 0xd3, 0x9e, 0x15, 0xb9, 0xb1, 0x56, 0x89, + 0xd4, 0x82, 0xd2, 0x7e, 0x8f, 0x71, 0xe1, 0xb7, + 0xc5, 0x53, 0xca, 0x07, 0x49, 0xfa, 0x3d, 0xc7, + 0x86, 0xdf, 0x15, 0x4f, 0x2d, 0x31, 0x1c, 0x5a, + 0xb4, 0xfd, 0xcc, 0x30, 0x3c, 0xb5, 0xbd, 0x13, + 0xac, 0x44, 0x45, 0x93, 0xa4, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x05, 0x42, 0xf6, 0xa0, + 0xe0, 0xd9, 0xb1, 0x2e, 0x71, 0xa0, 0x6b, 0xa4, + 0x24, 0xf5, 0x81, 0x8c, 0xab, 0xea, 0xa1, 0x7b, + 0x4f, 0x01, 0xd3, 0xe2, 0x1a, 0x76, 0x82, 0xf9, + 0x01, 0x1d, 0x6a, 0xc6, 0x82, 0x77, 0xf3, 0xf6, + 0x94, 0xfb, 0xef, 0xff, 0x00, 0xa7, 0x27, 0xd1, + 0x55, 0xed, 0x5d, 0xac, 0x2c, 0xb3, 0x36, 0x43, + 0x0d, 0x86, 0x6c, 0x97, 0x32, 0xdd, 0x3d, 0x81, + 0xce, 0xe0, 0x22, 0xa1, 0xa7, 0x88, 0x35, 0x8d, + 0x3b, 0x49, 0x25, 0x5b, 0x0e, 0x94, 0xd3, 0x3f, + 0xd3, 0x2d, 0xbf, 0x60, 0x2d, 0xbb, 0x3c, 0x56, + 0x2e, 0xc0, 0xd6, 0xca, 0xd2, 0x1b, 0x72, 0x76, + 0x17, 0x46, 0xc6, 0xb4, 0xf6, 0x69, 0x54, 0x10, + 0x73, 0x5c, 0x3f, 0x48, 0x68, 0xc8, 0xb8, 0xa8, + 0xfb, 0xa8, 0x23, 0x6c, 0x6c, 0x1b, 0xdb, 0xd3, + 0x4a, 0x4b, 0xbb, 0x0d, 0x24, 0xf6, 0x14, 0x56, + 0x1b, 0x45, 0x1c, 0xdd, 0xab, 0x32, 0xda, 0x8a, + 0xea, 0x79, 0xee, 0x2e, 0xc0, 0x91, 0x91, 0xb5, + 0xdc, 0x3c, 0x2c, 0x76, 0xd6, 0xd6, 0xa0, 0xef, + 0xea, 0x0d, 0xcb, 0x7b, 0xda, 0x6c, 0x52, 0x3f, + 0x4e, 0xb1, 0xed, 0x04, 0x88, 0xee, 0x18, 0x5f, + 0xcc, 0x5a, 0xe6, 0x83, 0xd9, 0x2a, 0xc1, 0x85, + 0x9a, 0x29, 0xf0, 0xf6, 0x33, 0x42, 0x41, 0x8d, + 0xd6, 0xf1, 0xd2, 0x9d, 0x66, 0x81, 0x4f, 0x79, + 0x05, 0x2e, 0xe5, 0x97, 0xba, 0x13, 0x2b, 0x6c, + 0xe8, 0x6e, 0x24, 0xb9, 0xc2, 0x5e, 0x3b, 0x85, + 0xf1, 0x48, 0x6a, 0x5b, 0x4a, 0x71, 0x75, 0xb8, + 0x80, 0x35, 0x04, 0x6f, 0x5b, 0x5a, 0x99, 0xc7, + 0x13, 0xac, 0xb1, 0x39, 0x86, 0xbc, 0x8b, 0x6b, + 0xba, 0x45, 0x35, 0x09, 0xe1, 0x34, 0xee, 0x0e, + 0xcd, 0xdd, 0xe3, 0xc1, 0x4f, 0x6a, 0x72, 0x30, + 0xe3, 0xec, 0x6d, 0x86, 0xd9, 0xa5, 0x9d, 0xce, + 0x63, 0x79, 0x68, 0x1b, 0xc3, 0xdb, 0x70, 0x5b, + 0xda, 0xeb, 0x18, 0xeb, 0x9d, 0x28, 0x1d, 0x4f, + 0xe3, 0xe3, 0xc4, 0x73, 0x03, 0xca, 0x38, 0x40, + 0x64, 0x9e, 0xf1, 0xaa, 0x0c, 0xbe, 0xd0, 0x2f, + 0x5f, 0x6b, 0xa7, 0xdd, 0x6f, 0x11, 0x22, 0x6b, + 0xe9, 0x59, 0x6e, 0xca, 0x6f, 0xa1, 0x3c, 0x4e, + 0xa7, 0xb8, 0xd5, 0xa9, 0xec, 0xe2, 0xe6, 0x5f, + 0x30, 0xbd, 0xc6, 0x5c, 0x13, 0xd3, 0xd8, 0x5c, + 0x10, 0x43, 0x8d, 0x48, 0x0f, 0xde, 0x3d, 0xc7, + 0x34, 0xa8, 0xf9, 0x2f, 0xc6, 0xa4, 0xcd, 0xe9, + 0x9b, 0x6a, 0xf1, 0x32, 0x38, 0x45, 0xdd, 0xc8, + 0xfd, 0x76, 0xf7, 0xd5, 0xf7, 0x63, 0xf7, 0xd6, + 0x47, 0x5e, 0x33, 0x4e, 0x6b, 0x8c, 0x9c, 0xb2, + 0x77, 0x36, 0xf7, 0xb6, 0xaf, 0xb9, 0x6d, 0x77, + 0x17, 0x86, 0xf4, 0xa0, 0x7b, 0xae, 0x6b, 0x82, + 0x0c, 0xf6, 0x4e, 0x7e, 0x63, 0xda, 0x1d, 0xcc, + 0xe1, 0xc4, 0xda, 0xe2, 0x23, 0xe8, 0xda, 0x01, + 0x3c, 0x25, 0xe0, 0x70, 0x6e, 0xf0, 0x9c, 0xee, + 0xc2, 0xc1, 0x79, 0x26, 0x43, 0x58, 0xea, 0x2b, + 0x8c, 0x4c, 0x17, 0x0f, 0xb6, 0xc4, 0x63, 0xc9, + 0x13, 0x98, 0xce, 0xd7, 0x96, 0x9e, 0x1d, 0xbd, + 0x52, 0xe7, 0x6e, 0xaf, 0x22, 0x90, 0xf6, 0x6f, + 0x66, 0xf8, 0xf1, 0x32, 0xe4, 0xa6, 0xfa, 0xec, + 0x8c, 0xee, 0x91, 0xce, 0x3b, 0xcb, 0x5a, 0x68, + 0x3f, 0x7b, 0x88, 0xaa, 0xc6, 0x9b, 0xc0, 0x7e, + 0x27, 0x98, 0xca, 0x59, 0xcb, 0x7d, 0x3d, 0x85, + 0xc5, 0xbb, 0xdc, 0xea, 0x42, 0x68, 0x5e, 0x03, + 0xdc, 0xd7, 0x71, 0x6d, 0x1d, 0xee, 0xce, 0xca, + 0x09, 0xdc, 0x97, 0xb3, 0xe8, 0x71, 0xf6, 0xaf, + 0xbe, 0xc0, 0xdc, 0xdc, 0x5b, 0xdf, 0x5b, 0x34, + 0xc8, 0xda, 0xbe, 0xbc, 0x7c, 0x22, 0xa4, 0x54, + 0x06, 0xd0, 0xf5, 0x14, 0xc6, 0x96, 0xce, 0xbf, + 0x39, 0x80, 0x37, 0x53, 0x50, 0x5c, 0xc4, 0x1f, + 0x15, 0xc5, 0x36, 0x02, 0xe0, 0xda, 0x87, 0x01, + 0xfa, 0xc0, 0xd5, 0x45, 0xc9, 0xa0, 0x44, 0x71, + 0xbe, 0x49, 0x73, 0xb7, 0xad, 0x8d, 0x8d, 0x2e, + 0x7b, 0x8b, 0xb6, 0x06, 0x81, 0x57, 0x13, 0xdd, + 0x75, 0x16, 0xee, 0x91, 0xc7, 0x62, 0x6c, 0x31, + 0x97, 0x83, 0x15, 0x7f, 0xf8, 0x8c, 0x12, 0xb8, + 0xb9, 0xf2, 0x50, 0x0e, 0x17, 0x06, 0x53, 0x87, + 0x67, 0x59, 0x05, 0x3f, 0x49, 0xe0, 0xef, 0x35, + 0x2d, 0xa4, 0x96, 0x73, 0xdd, 0xbe, 0x0c, 0x6d, + 0xa3, 0xfa, 0x47, 0x06, 0xf7, 0x4e, 0x7c, 0xb2, + 0x34, 0x0a, 0x77, 0x5b, 0x36, 0x35, 0xbc, 0xab, + 0xa1, 0x69, 0xfc, 0x23, 0x30, 0x78, 0xe1, 0x62, + 0xc9, 0x9d, 0x70, 0x03, 0xdc, 0xfe, 0x91, 0xfb, + 0x0f, 0x75, 0xb8, 0x52, 0xa6, 0x94, 0x0a, 0xb9, + 0xec, 0xb0, 0x7f, 0xf8, 0x8b, 0xc3, 0xff, 0x00, + 0xf7, 0x03, 0xc4, 0x0a, 0xea, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0xa3, 0xf5, 0x07, 0xaa, 0x67, 0xf9, 0x3e, 0x30, + 0x52, 0x0a, 0x3f, 0x50, 0x7a, 0xa6, 0x7f, 0x93, + 0xe3, 0x05, 0x7b, 0x7b, 0x74, 0xe9, 0x86, 0x58, + 0x9e, 0x05, 0xdd, 0xca, 0xf5, 0x3d, 0xd2, 0xbe, + 0xa8, 0x6f, 0x86, 0xfe, 0xda, 0x96, 0x7e, 0xe5, + 0x13, 0xa5, 0x7d, 0x50, 0xdf, 0x0d, 0xfd, 0xb5, + 0x2c, 0xfd, 0xca, 0x6e, 0xf1, 0x6b, 0xde, 0x94, + 0x61, 0xb8, 0x16, 0xf7, 0x61, 0xce, 0x6e, 0xbf, + 0xc9, 0xe3, 0xca, 0xb3, 0xec, 0x42, 0xbf, 0xaa, + 0x05, 0xd7, 0xf9, 0x3c, 0x79, 0x56, 0x7d, 0x88, + 0x57, 0xf5, 0xcb, 0x67, 0x3d, 0x7b, 0xf2, 0xf6, + 0x3e, 0x29, 0x9b, 0x07, 0xfc, 0x6b, 0x62, 0x22, + 0x2d, 0x9e, 0x68, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x20, 0x75, 0xd4, 0xcf, 0x87, 0x4a, + 0xdf, 0x16, 0x1a, 0x19, 0x03, 0x23, 0x27, 0xac, + 0xf7, 0xb4, 0x1f, 0x79, 0x7c, 0x68, 0x2b, 0x76, + 0x41, 0xa5, 0xac, 0xdc, 0xd1, 0xb6, 0x72, 0xf9, + 0x5e, 0x7a, 0xa4, 0xbd, 0xcd, 0xed, 0x34, 0x2d, + 0xdd, 0x4f, 0x8f, 0x7e, 0x47, 0x01, 0x7b, 0x69, + 0x18, 0xac, 0xaf, 0x8f, 0x8a, 0x31, 0xd5, 0x7b, + 0x08, 0x7b, 0x47, 0xbb, 0xc2, 0xa2, 0x3d, 0x9b, + 0xe4, 0xe2, 0xb9, 0xc1, 0x0b, 0x1a, 0xd2, 0x7b, + 0x17, 0xb9, 0xae, 0x61, 0xdf, 0xc0, 0xf3, 0xc4, + 0xd7, 0x76, 0x49, 0x08, 0x2d, 0x6b, 0x11, 0xb5, + 0xb5, 0x33, 0xf9, 0xc1, 0x86, 0x33, 0x3d, 0x03, + 0x44, 0xa5, 0xa3, 0x8e, 0x83, 0x70, 0xe2, 0xa5, + 0x56, 0x55, 0x59, 0xba, 0xd5, 0xb3, 0x8d, 0x57, + 0x0e, 0x06, 0xc6, 0x08, 0xee, 0x63, 0x77, 0x0b, + 0x6e, 0x24, 0x24, 0x82, 0xc7, 0x6d, 0x73, 0xe8, + 0x46, 0xce, 0xe1, 0xbb, 0xd0, 0x6a, 0x6b, 0x0c, + 0xb6, 0x4a, 0xe7, 0x2d, 0x6b, 0xa6, 0x31, 0x12, + 0x18, 0x25, 0xb9, 0x01, 0xd7, 0x33, 0x34, 0xd1, + 0xc1, 0xae, 0xa9, 0x0d, 0xa8, 0xda, 0x00, 0x68, + 0xe2, 0x34, 0x43, 0xec, 0xcf, 0x13, 0xd0, 0x51, + 0x97, 0x77, 0x0d, 0xbc, 0x02, 0xa2, 0xe8, 0xb8, + 0x53, 0x8b, 0xab, 0xc1, 0x4d, 0xde, 0xea, 0xd6, + 0x9c, 0x8b, 0x6f, 0x6a, 0x51, 0x3a, 0x73, 0x46, + 0xdc, 0x44, 0xd1, 0x13, 0x8f, 0x55, 0xd1, 0x70, + 0x0a, 0x7c, 0xa1, 0x45, 0x7a, 0x41, 0x50, 0xd1, + 0x79, 0x9c, 0x88, 0xbe, 0xbb, 0xd3, 0x99, 0x77, + 0x99, 0x6e, 0xac, 0xaa, 0x62, 0x95, 0xc6, 0xae, + 0x2d, 0x69, 0xa1, 0x69, 0x3c, 0xbb, 0xc1, 0x1d, + 0x65, 0x0f, 0x71, 0x16, 0x52, 0xf3, 0x5e, 0xe4, + 0xf1, 0xd6, 0x17, 0x2e, 0xb5, 0xf3, 0xae, 0xe2, + 0x79, 0x81, 0x24, 0xb2, 0x26, 0xb1, 0x8f, 0x7f, + 0x06, 0xdd, 0x84, 0xd2, 0x8b, 0x77, 0x14, 0xe1, + 0x73, 0xed, 0x36, 0xfe, 0x68, 0x3b, 0xa8, 0xe2, + 0x8e, 0x46, 0xbc, 0x8d, 0xd5, 0x0d, 0x64, 0x67, + 0xf7, 0x97, 0xd6, 0x27, 0xfc, 0x9b, 0x94, 0xf2, + 0x6e, 0xf1, 0x62, 0x41, 0x8f, 0x35, 0xec, 0xfa, + 0xce, 0xc7, 0x19, 0x36, 0x43, 0x1d, 0x75, 0x70, + 0xdb, 0xcb, 0x46, 0x19, 0x8b, 0x9e, 0xe0, 0x78, + 0xb8, 0x07, 0x11, 0xda, 0xd0, 0xd2, 0xd2, 0xa5, + 0xb4, 0xfb, 0x9d, 0xaa, 0x74, 0x8b, 0x20, 0xc8, + 0x49, 0x27, 0x14, 0x84, 0xc3, 0x34, 0xd1, 0x9e, + 0x17, 0x9e, 0x89, 0xc0, 0x87, 0x56, 0x9b, 0xc8, + 0xa5, 0x54, 0xbe, 0x7b, 0xd4, 0x79, 0x1f, 0xfc, + 0x59, 0xbe, 0xcd, 0xca, 0x1b, 0xd9, 0xa7, 0xf6, + 0xd3, 0x3f, 0xf2, 0x25, 0xf9, 0xa8, 0x2b, 0x1a, + 0x47, 0x4d, 0x59, 0x64, 0xf2, 0x79, 0x28, 0xa7, + 0x96, 0x76, 0x0c, 0x7c, 0xa0, 0x44, 0x63, 0x78, + 0x69, 0x77, 0x0c, 0x8f, 0x1d, 0xde, 0xc3, 0x5e, + 0xf5, 0x6f, 0xeb, 0x89, 0xef, 0xe3, 0xd5, 0xd8, + 0xe6, 0xe3, 0xde, 0x59, 0x75, 0x2c, 0x22, 0x38, + 0x4d, 0x4d, 0x03, 0xa4, 0x73, 0xe3, 0xe2, 0xa7, + 0x5b, 0x89, 0x6c, 0x7b, 0x3e, 0xf5, 0xc6, 0x7f, + 0xcb, 0x7f, 0xf7, 0x65, 0x4d, 0x48, 0x2b, 0xed, + 0x07, 0x07, 0x5e, 0xa4, 0x7e, 0x3b, 0xd0, 0x6e, + 0xe1, 0xf4, 0x35, 0xbe, 0x12, 0xfd, 0x99, 0x59, + 0x2f, 0xe5, 0x9d, 0xf0, 0xb1, 0xee, 0x9c, 0x38, + 0x51, 0xae, 0x3c, 0x26, 0xae, 0xa8, 0x35, 0x20, + 0x6d, 0x3b, 0x54, 0x46, 0x3a, 0xd6, 0xfb, 0x5d, + 0xdf, 0x5c, 0xde, 0x5f, 0xdc, 0x49, 0x6f, 0x88, + 0xb7, 0x7f, 0x04, 0x36, 0xf1, 0x1a, 0x56, 0xbb, + 0x40, 0xea, 0x57, 0x86, 0x9c, 0x4e, 0x2a, 0xf3, + 0x93, 0x8d, 0xf2, 0xe3, 0x6e, 0xe2, 0x8f, 0xbf, + 0x7c, 0x12, 0x35, 0xbc, 0xe5, 0x84, 0x05, 0x57, + 0xf6, 0x5f, 0x34, 0x6e, 0xc1, 0x4f, 0x00, 0x3f, + 0xc4, 0x8a, 0xe0, 0x97, 0x8e, 0x5a, 0x3d, 0xad, + 0xe1, 0xed, 0x14, 0x1a, 0x79, 0xbd, 0x25, 0x26, + 0x9c, 0xb6, 0x76, 0x67, 0x4e, 0xdd, 0xcd, 0x13, + 0xad, 0x68, 0xe9, 0xe1, 0x7b, 0xb8, 0x83, 0x99, + 0x5d, 0xa7, 0x70, 0xaf, 0x5c, 0x15, 0x31, 0x75, + 0x96, 0x6e, 0x67, 0x42, 0x5d, 0x64, 0x00, 0x0c, + 0x74, 0xb6, 0xaf, 0x12, 0xb0, 0x6e, 0x6b, 0xdb, + 0xdc, 0xbc, 0x0e, 0xb5, 0x77, 0x29, 0x1d, 0x51, + 0x34, 0x50, 0x69, 0xdc, 0x8c, 0x92, 0x90, 0x1a, + 0x6d, 0xde, 0xc1, 0x5e, 0x57, 0x3c, 0x70, 0x34, + 0x76, 0x4a, 0xac, 0x60, 0xe3, 0x7c, 0x7e, 0xcc, + 0xef, 0x8b, 0xbf, 0xf5, 0x1b, 0x70, 0xf6, 0xf3, + 0x54, 0x37, 0xe0, 0x41, 0x31, 0xec, 0xf7, 0xfb, + 0x52, 0xd7, 0xc3, 0x9b, 0xed, 0x1c, 0xac, 0x6a, + 0xb9, 0xec, 0xf7, 0xfb, 0x52, 0xd7, 0xc3, 0x9b, + 0xed, 0x1c, 0xac, 0x68, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x83, 0x78, 0x44, 0x1b, + 0xc2, 0x0a, 0x06, 0x8d, 0xfe, 0xf8, 0xbe, 0xe6, + 0xb8, 0xfb, 0x40, 0xba, 0x42, 0xe6, 0xfa, 0x37, + 0xfb, 0xe2, 0xfb, 0x9a, 0xe3, 0xed, 0x02, 0xe9, + 0x0b, 0x1c, 0x3e, 0xc7, 0x9d, 0x2f, 0x4f, 0xe3, + 0x3c, 0xcd, 0x3e, 0xaa, 0xde, 0xa4, 0x5e, 0x6f, + 0xea, 0x63, 0xf0, 0xfe, 0x02, 0xb3, 0x5a, 0x7a, + 0x34, 0x5e, 0x08, 0xed, 0x2c, 0x39, 0xbf, 0xa9, + 0x8f, 0xc3, 0xf8, 0x0a, 0xcd, 0x69, 0xe8, 0xd1, + 0x78, 0x23, 0xb4, 0xb8, 0xac, 0xff, 0x00, 0x67, + 0x88, 0xf5, 0x54, 0x38, 0xea, 0xe5, 0xed, 0xef, + 0xcb, 0x2a, 0x22, 0x2f, 0x4d, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0xa8, 0xfa, 0xb1, 0xdf, 0x8d, 0xea, 0xbc, 0x66, + 0x9d, 0x6f, 0x75, 0x04, 0x27, 0xa6, 0xbb, 0x03, + 0xae, 0x38, 0x9d, 0xd8, 0x60, 0xf7, 0xd5, 0xd2, + 0xe2, 0x78, 0xad, 0xa0, 0x92, 0xe6, 0x63, 0xc3, + 0x14, 0x2c, 0x74, 0x8f, 0x3f, 0xaa, 0xd1, 0x52, + 0xa8, 0x7a, 0x1e, 0xf2, 0xca, 0x6c, 0x9e, 0x4b, + 0x50, 0x64, 0xae, 0x61, 0x86, 0xe2, 0xe1, 0xe5, + 0x90, 0xb2, 0x59, 0x1a, 0xd7, 0x06, 0xb8, 0xf1, + 0x38, 0x80, 0xe2, 0x36, 0x53, 0x85, 0xa8, 0x36, + 0xb4, 0x15, 0xcc, 0x98, 0xfc, 0x8e, 0x4b, 0x4d, + 0x5c, 0x9e, 0xee, 0xde, 0x47, 0x49, 0x05, 0x79, + 0x40, 0x3c, 0x2f, 0xa7, 0x38, 0xe1, 0x72, 0xbb, + 0xb7, 0xbe, 0x1c, 0xeb, 0x9d, 0x6a, 0xbb, 0xeb, + 0x3c, 0x76, 0xa7, 0xc7, 0xea, 0x0c, 0x75, 0xc4, + 0x53, 0x83, 0x46, 0xdd, 0x36, 0x17, 0xb5, 0xe7, + 0xb8, 0xee, 0x4d, 0x43, 0x49, 0xef, 0xa3, 0x34, + 0xf7, 0x17, 0x43, 0x86, 0x48, 0xe5, 0x11, 0xcb, + 0x19, 0xe2, 0x8e, 0x40, 0xd7, 0x31, 0xc3, 0x94, + 0x1d, 0xa0, 0xa0, 0xe7, 0x1a, 0x1f, 0x15, 0x8d, + 0xc9, 0x65, 0xb3, 0x0d, 0xbf, 0xb7, 0x65, 0xcb, + 0x62, 0x7d, 0x63, 0x12, 0x0a, 0xf0, 0x93, 0x23, + 0xc1, 0xa2, 0xb8, 0x9d, 0x23, 0xa6, 0x08, 0x23, + 0xf0, 0xc8, 0x36, 0xf5, 0x1a, 0x47, 0x68, 0xaa, + 0x0e, 0x9b, 0xba, 0xd4, 0x76, 0xd9, 0x4c, 0xa1, + 0xc0, 0xda, 0xb2, 0xe9, 0xee, 0x90, 0x89, 0xc4, + 0x94, 0xee, 0x40, 0x91, 0xfc, 0x34, 0xab, 0xd9, + 0xbf, 0x6a, 0x93, 0xc9, 0xea, 0xed, 0x75, 0x8b, + 0x63, 0x5d, 0x7f, 0x63, 0x0d, 0xb3, 0x24, 0x3c, + 0x2d, 0x94, 0xc6, 0x5c, 0xda, 0xf5, 0x38, 0x84, + 0x8e, 0x1d, 0x94, 0x18, 0x32, 0xb6, 0x11, 0x69, + 0x5d, 0x61, 0x8e, 0x93, 0x14, 0x4b, 0x21, 0xbb, + 0x2d, 0xe3, 0x82, 0xa4, 0xd1, 0xae, 0x7f, 0x44, + 0xf6, 0x6d, 0xdb, 0xc2, 0x77, 0x8a, 0xa9, 0xef, + 0x69, 0xbb, 0x34, 0xe0, 0xeb, 0x5d, 0x47, 0xda, + 0x7a, 0xd5, 0xd3, 0xfa, 0x6a, 0xfb, 0x25, 0x91, + 0x87, 0x52, 0xe6, 0xef, 0x23, 0xbb, 0x76, 0xc7, + 0xdb, 0x47, 0x09, 0x0e, 0x65, 0x47, 0x7b, 0x52, + 0x28, 0x00, 0x6f, 0xe8, 0x8e, 0x55, 0xb3, 0xed, + 0x33, 0xfb, 0x6d, 0xbf, 0xf9, 0x31, 0xf8, 0xaf, + 0x41, 0x11, 0xa1, 0x24, 0x7e, 0x27, 0x3d, 0x26, + 0x2a, 0x52, 0x7a, 0x3c, 0x8d, 0xb4, 0x57, 0x10, + 0x93, 0xca, 0xee, 0x01, 0x28, 0xf7, 0x9c, 0xe1, + 0xee, 0x2e, 0x86, 0xb9, 0xee, 0xa2, 0x89, 0xf6, + 0x16, 0x3a, 0x6f, 0x51, 0xc0, 0x3b, 0xab, 0x48, + 0xe0, 0x8a, 0x6a, 0x72, 0xb7, 0x80, 0x3d, 0xb5, + 0xfd, 0xe0, 0xad, 0xba, 0x87, 0x2f, 0x1d, 0x86, + 0x9d, 0xb9, 0xc9, 0x44, 0xe0, 0x78, 0xa2, 0x1e, + 0x6e, 0x7a, 0xae, 0x94, 0x51, 0x9d, 0xba, 0xa0, + 0xe6, 0xda, 0xb6, 0x59, 0x32, 0xb7, 0xb9, 0x1c, + 0xb8, 0x35, 0xb6, 0x82, 0x76, 0x59, 0x41, 0xd4, + 0x3c, 0x2d, 0x7e, 0xef, 0xd9, 0xaf, 0xba, 0xba, + 0x47, 0xe1, 0xa2, 0xfb, 0x13, 0x8f, 0x74, 0x72, + 0x9b, 0x7b, 0xbb, 0x68, 0xe2, 0x96, 0xd6, 0xe5, + 0xa0, 0x12, 0xc7, 0x74, 0x61, 0xa4, 0x16, 0x9e, + 0xf9, 0xae, 0x06, 0x8e, 0x0a, 0x91, 0x9d, 0xc6, + 0x1c, 0x6f, 0xb3, 0xec, 0x74, 0x6f, 0x14, 0x9a, + 0xe2, 0xe0, 0x5c, 0x4d, 0x5d, 0xfc, 0x52, 0x31, + 0xe4, 0x57, 0x99, 0xb4, 0x5d, 0x13, 0x19, 0xea, + 0xdb, 0x4f, 0x21, 0x17, 0x88, 0xd4, 0x11, 0x07, + 0x1d, 0x9c, 0x36, 0xb0, 0xd8, 0x0b, 0x4c, 0x7c, + 0x71, 0xdb, 0xbc, 0x49, 0x0d, 0xc0, 0x7c, 0xa5, + 0xac, 0x7b, 0x49, 0x70, 0x91, 0x90, 0xf0, 0x83, + 0xc5, 0x52, 0x76, 0x71, 0xa9, 0x5c, 0x66, 0x39, + 0x98, 0xfb, 0x77, 0x47, 0xd2, 0x3a, 0x79, 0xa5, + 0x79, 0x96, 0xe2, 0xe1, 0xfd, 0xf4, 0x92, 0x3b, + 0x7b, 0x8d, 0x37, 0x75, 0x00, 0xe4, 0x0b, 0x6d, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x04, 0x66, 0x5b, + 0xeb, 0xa1, 0xe6, 0x3d, 0xb5, 0x36, 0xde, 0xf4, + 0x73, 0x28, 0x4c, 0xb7, 0xd7, 0x43, 0xcc, 0x7b, + 0x6a, 0x6d, 0xbd, 0xe8, 0xe6, 0x5e, 0x76, 0x0f, + 0x9e, 0xc7, 0x69, 0xb5, 0xfa, 0x65, 0xd1, 0x77, + 0x83, 0x67, 0x45, 0x5a, 0xd8, 0x6f, 0x3d, 0x16, + 0x6f, 0x26, 0xff, 0x00, 0x14, 0xaa, 0x96, 0x84, + 0xdd, 0x79, 0xfc, 0xaf, 0x9e, 0xad, 0xb7, 0x9e, + 0x8b, 0x37, 0x93, 0x7f, 0x8a, 0x55, 0x4b, 0x42, + 0x6e, 0xbc, 0xfe, 0x57, 0xcf, 0x5e, 0xad, 0x3b, + 0x15, 0x77, 0x9c, 0x35, 0xf1, 0xad, 0x79, 0xcb, + 0x5a, 0x22, 0x2c, 0xdb, 0x08, 0x88, 0x80, 0xa3, + 0xf3, 0xf9, 0x98, 0x30, 0x98, 0xb9, 0x6f, 0xe6, + 0x1c, 0x65, 0xb4, 0x6c, 0x51, 0xd6, 0x85, 0xf2, + 0x3b, 0xbd, 0x6a, 0x90, 0x54, 0x3f, 0x6a, 0x32, + 0x3d, 0xff, 0x00, 0x85, 0xda, 0x56, 0x8c, 0x91, + 0xf2, 0x38, 0xf3, 0xf7, 0x0c, 0x1e, 0x31, 0x41, + 0xf1, 0x8f, 0xc0, 0x67, 0x35, 0x6c, 0x63, 0x27, + 0x9c, 0xbe, 0x92, 0xde, 0xd2, 0x5e, 0xea, 0xde, + 0xda, 0x2d, 0x95, 0x6f, 0x54, 0x34, 0xf7, 0x2d, + 0x6f, 0x52, 0xb5, 0x25, 0x67, 0xbc, 0xf6, 0x77, + 0x25, 0x94, 0x66, 0xeb, 0x01, 0x7f, 0x3c, 0x77, + 0x91, 0x0e, 0x26, 0x31, 0xce, 0x03, 0x88, 0x8e, + 0x40, 0xe6, 0x70, 0xd0, 0xf3, 0x85, 0x75, 0x8a, + 0x26, 0x41, 0x0c, 0x70, 0x46, 0x28, 0xc8, 0x9a, + 0xd6, 0x34, 0x0d, 0xc0, 0x34, 0x50, 0x2f, 0xb4, + 0x15, 0xad, 0x13, 0xa9, 0xa5, 0xcd, 0xda, 0x4b, + 0x6f, 0x79, 0x41, 0x90, 0xb3, 0x21, 0xb3, 0x50, + 0x53, 0x8d, 0xa7, 0x60, 0x77, 0x0f, 0x21, 0xa8, + 0xa1, 0x56, 0x5f, 0x81, 0x62, 0x82, 0xd2, 0xda, + 0x07, 0x38, 0xc1, 0x14, 0x71, 0x17, 0x92, 0x5e, + 0x58, 0xd0, 0xd2, 0xe2, 0x4d, 0x49, 0x71, 0x1b, + 0xd5, 0x16, 0x57, 0xdf, 0xeb, 0x5c, 0xf5, 0xcd, + 0x83, 0x2e, 0x5f, 0x6b, 0x85, 0xb0, 0x24, 0x3f, + 0xa3, 0xd8, 0x5f, 0x43, 0xc3, 0x5e, 0xb9, 0x71, + 0x06, 0x95, 0xdc, 0x10, 0x5f, 0x9a, 0xf6, 0x3e, + 0xbc, 0x0e, 0x6b, 0xa9, 0xbf, 0x84, 0x83, 0xda, + 0x5e, 0xaa, 0x46, 0x53, 0x40, 0xc7, 0x8f, 0xb5, + 0x7d, 0xfe, 0x9f, 0xba, 0xb8, 0x82, 0xf6, 0xd9, + 0xa6, 0x40, 0xd2, 0xfa, 0xf1, 0x86, 0xed, 0x20, + 0x10, 0x1b, 0x43, 0xef, 0x29, 0x7d, 0x2f, 0x9e, + 0x7e, 0x77, 0x4f, 0xc9, 0x71, 0x35, 0x05, 0xd4, + 0x2d, 0x7c, 0x53, 0xf0, 0xec, 0x05, 0xc1, 0xb5, + 0x0f, 0x03, 0x93, 0x88, 0x14, 0x16, 0x07, 0x10, + 0xd1, 0x57, 0x10, 0xd0, 0x37, 0x93, 0xb0, 0x28, + 0x6d, 0x5d, 0x94, 0xbb, 0xc5, 0xe0, 0x27, 0xbd, + 0xb2, 0x73, 0x5b, 0x30, 0x2c, 0x6b, 0x1e, 0x40, + 0x70, 0x01, 0xee, 0xe1, 0x24, 0x72, 0x2a, 0x26, + 0x93, 0xc1, 0x5e, 0x6a, 0x5b, 0x27, 0xda, 0x5c, + 0x5d, 0xbe, 0x0c, 0x6d, 0xa3, 0xf8, 0xc8, 0x6f, + 0x74, 0xe7, 0xcd, 0x20, 0x1b, 0xf8, 0xb6, 0x77, + 0x21, 0xaa, 0x43, 0x53, 0xe8, 0xdb, 0x3c, 0x46, + 0x9c, 0xf3, 0x91, 0x73, 0x34, 0xf3, 0x5b, 0x39, + 0xac, 0x6f, 0x11, 0xa3, 0x0b, 0x64, 0x93, 0x95, + 0x9b, 0x77, 0x0e, 0xa1, 0x41, 0x74, 0xd3, 0xb3, + 0x4d, 0x3e, 0x03, 0x1f, 0x71, 0x3b, 0xcc, 0x92, + 0xcb, 0x6f, 0x1b, 0xe4, 0x91, 0xdb, 0x4b, 0x9c, + 0x45, 0x49, 0x2a, 0x40, 0x90, 0x05, 0x49, 0xa0, + 0x1b, 0xc9, 0xd8, 0x15, 0x5b, 0x46, 0xe0, 0xec, + 0x71, 0xb8, 0xc8, 0x73, 0x22, 0x69, 0x8c, 0x97, + 0x36, 0x8d, 0x7c, 0xcd, 0x7b, 0x81, 0x8d, 0xa2, + 0x9d, 0x23, 0xb8, 0x1b, 0x41, 0x4d, 0xca, 0x1f, + 0x1b, 0x67, 0x7b, 0xae, 0xef, 0x2e, 0x2f, 0xaf, + 0xee, 0x25, 0x83, 0x11, 0x03, 0xfa, 0x38, 0x2d, + 0x62, 0x34, 0xa9, 0xdf, 0x4e, 0xa6, 0xee, 0xf8, + 0xa0, 0xe8, 0x0d, 0x73, 0x5e, 0x2a, 0xc7, 0x07, + 0x0e, 0xab, 0x48, 0x23, 0xde, 0x5e, 0xaa, 0x1e, + 0x6f, 0x4b, 0xcd, 0xa5, 0xad, 0xff, 0x00, 0x1b, + 0xd3, 0xf7, 0x33, 0x47, 0xe6, 0xc4, 0x1b, 0x88, + 0x24, 0x3c, 0x4d, 0x73, 0x09, 0x02, 0xbb, 0x85, + 0x47, 0x54, 0x15, 0x61, 0x92, 0x2b, 0x6d, 0x5b, + 0xa6, 0xa3, 0x79, 0x26, 0x1f, 0x3b, 0x8c, 0x49, + 0x1b, 0x9a, 0x4d, 0x63, 0x95, 0xb5, 0x1b, 0x29, + 0xd4, 0x70, 0xa7, 0x32, 0x09, 0xb4, 0xa1, 0xde, + 0xa8, 0x9a, 0x67, 0x53, 0x9c, 0x25, 0xbd, 0xe6, + 0x1b, 0x3e, 0xe2, 0xc9, 0xb1, 0x81, 0xce, 0x84, + 0x93, 0x57, 0x3d, 0xa3, 0xff, 0x00, 0x49, 0xa4, + 0xef, 0xdf, 0x56, 0xf5, 0x8f, 0x59, 0x65, 0xd2, + 0x56, 0x17, 0xb9, 0xcc, 0x94, 0x9a, 0xab, 0x2a, + 0x5c, 0x18, 0xe7, 0x11, 0x63, 0x05, 0x4f, 0x0e, + 0xcd, 0x81, 0xc0, 0x75, 0x19, 0xb8, 0x75, 0xf6, + 0xa0, 0x98, 0xd5, 0x9b, 0xb1, 0x1f, 0xfe, 0xe7, + 0x6f, 0xf3, 0x97, 0xba, 0xcf, 0xd4, 0xcc, 0xff, + 0x00, 0xcc, 0xb5, 0xfb, 0x50, 0xa6, 0x27, 0xb6, + 0xb7, 0xb8, 0xe8, 0xfa, 0x78, 0xdb, 0x2f, 0x44, + 0xf1, 0x24, 0x7c, 0x42, 0xbc, 0x2f, 0x6f, 0x7a, + 0xe1, 0xd7, 0x09, 0x71, 0x6d, 0x6f, 0x75, 0x1f, + 0x45, 0x71, 0x1b, 0x65, 0x8c, 0x38, 0x3c, 0x35, + 0xe2, 0xa3, 0x89, 0xa6, 0xad, 0x77, 0x38, 0x28, + 0x2a, 0x77, 0x41, 0xf0, 0xde, 0x5e, 0xe9, 0x46, + 0xd4, 0x0c, 0x8d, 0xe3, 0x26, 0x86, 0x9c, 0x96, + 0xb3, 0xd6, 0x5b, 0x9a, 0x73, 0x18, 0xdc, 0x3d, + 0xd5, 0x29, 0xa6, 0x00, 0x17, 0x59, 0xc0, 0x05, + 0x00, 0xc8, 0xbc, 0x00, 0x39, 0x00, 0x63, 0x28, + 0xa6, 0x1d, 0x69, 0x6c, 0xeb, 0x96, 0xde, 0x3a, + 0x26, 0xba, 0xe6, 0x36, 0x96, 0x32, 0x62, 0x07, + 0x18, 0x6b, 0x8d, 0x4b, 0x43, 0xba, 0x8b, 0xd8, + 0x6d, 0xad, 0xe0, 0x74, 0xae, 0x82, 0x36, 0xc6, + 0xe9, 0xde, 0x64, 0x94, 0xb4, 0x50, 0xbd, 0xe4, + 0x53, 0x89, 0xdd, 0x74, 0x19, 0x15, 0x53, 0xda, + 0x53, 0xde, 0xcd, 0x3a, 0xc7, 0x31, 0xc5, 0xa7, + 0xce, 0x23, 0xda, 0xd2, 0x41, 0xdc, 0xee, 0xa2, + 0xb6, 0x50, 0xf5, 0x15, 0x4b, 0xda, 0x6f, 0xf6, + 0xe3, 0x7f, 0xf2, 0x63, 0xed, 0x3d, 0x04, 0x7f, + 0xb3, 0x8b, 0xeb, 0x88, 0x2e, 0xef, 0x30, 0xf7, + 0x6e, 0x71, 0x7b, 0x98, 0xcb, 0x98, 0x78, 0x89, + 0x3b, 0x08, 0x1c, 0x54, 0xaf, 0x55, 0xae, 0x69, + 0x57, 0xc5, 0xcf, 0x32, 0x1f, 0xfe, 0x1b, 0x27, + 0xa6, 0xf3, 0xcd, 0xd9, 0x0c, 0xf6, 0xf0, 0xc1, + 0x72, 0x47, 0x59, 0x81, 0x86, 0xbf, 0x21, 0xde, + 0xf2, 0xbc, 0xe5, 0x6f, 0xe3, 0xc7, 0x63, 0x6e, + 0x6f, 0x9e, 0x47, 0x0d, 0xbc, 0x6e, 0x78, 0xeb, + 0x91, 0xde, 0x8f, 0x74, 0xd1, 0x07, 0x32, 0xd7, + 0x99, 0x2b, 0x9b, 0xdc, 0xd5, 0xd3, 0xa0, 0x7b, + 0x85, 0xad, 0x87, 0x0d, 0xad, 0x5a, 0xe2, 0x07, + 0x19, 0x0e, 0x73, 0xb7, 0x75, 0xc1, 0xec, 0x2e, + 0x9f, 0x8d, 0xdb, 0x8d, 0xb4, 0x27, 0x79, 0x82, + 0x2a, 0xfe, 0xc3, 0x57, 0x30, 0xc9, 0x58, 0x3e, + 0xdf, 0x42, 0x41, 0x7b, 0x3e, 0xdb, 0x8c, 0x95, + 0xe9, 0xb8, 0x91, 0xc7, 0x79, 0x05, 0x92, 0x06, + 0x7c, 0x27, 0xdd, 0x5d, 0x3b, 0x1b, 0xea, 0xdb, + 0x3f, 0xfc, 0x78, 0xbc, 0x46, 0xa0, 0xd9, 0x44, + 0x44, 0x04, 0x44, 0x41, 0x1d, 0xa8, 0xfd, 0x47, + 0x79, 0xe4, 0xfe, 0x73, 0x56, 0xbe, 0x86, 0xf5, + 0x33, 0xbc, 0xbb, 0xfb, 0x4d, 0x5b, 0x1a, 0x8f, + 0xd4, 0x77, 0x9e, 0x4f, 0xe7, 0x35, 0x6b, 0xe8, + 0x6f, 0x53, 0x3b, 0xcb, 0xbf, 0xb4, 0xd5, 0x78, + 0xe1, 0xce, 0x96, 0x33, 0xcc, 0x53, 0xb9, 0x3a, + 0xd6, 0x24, 0x44, 0x54, 0x6c, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x2d, 0x5c, 0x87, 0xa1, 0x5c, 0xf9, + 0x27, 0xf8, 0xa5, 0x6d, 0x2d, 0x5c, 0x87, 0xa1, + 0x5c, 0xf9, 0x27, 0xf8, 0xa5, 0x4d, 0x39, 0xe1, + 0x5b, 0x9b, 0x15, 0x68, 0x9d, 0x48, 0x2d, 0x27, + 0xe8, 0xf7, 0x1e, 0x1b, 0x7c, 0x55, 0x3c, 0xa0, + 0x74, 0x9f, 0xa3, 0xdc, 0x78, 0x6d, 0xf1, 0x54, + 0xf2, 0xd3, 0x11, 0xc5, 0xab, 0x4f, 0xdc, 0xc3, + 0x03, 0xcb, 0x5b, 0xd1, 0x3a, 0xc4, 0x44, 0x59, + 0x3a, 0x44, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x55, 0x9d, 0x63, 0xa6, 0xaf, 0xf3, 0xb2, + 0xd8, 0x3e, 0xd1, 0xf1, 0x30, 0x5a, 0x39, 0xc6, + 0x4e, 0x94, 0x91, 0x5e, 0x22, 0xc3, 0xdc, 0xf0, + 0xb5, 0xdf, 0xa2, 0xac, 0xc8, 0x80, 0x88, 0x88, + 0x30, 0x5f, 0x59, 0x5b, 0x64, 0x2d, 0x25, 0xb2, + 0xba, 0x6f, 0x1c, 0x13, 0xb4, 0xb5, 0xed, 0xf8, + 0x47, 0x5c, 0x6f, 0x0a, 0xa3, 0x6d, 0xa7, 0xb5, + 0xa6, 0x07, 0x8e, 0xdf, 0x09, 0x79, 0x0d, 0xcd, + 0x8b, 0x89, 0x74, 0x71, 0xdc, 0x50, 0x16, 0xd7, + 0x7e, 0xc7, 0x0d, 0x9e, 0xe1, 0xf7, 0x15, 0xd5, + 0x10, 0x54, 0xb1, 0xba, 0x43, 0x23, 0x71, 0x95, + 0x66, 0x67, 0x52, 0xdd, 0x36, 0xee, 0xe2, 0x22, + 0x0c, 0x36, 0xf1, 0xfd, 0x5b, 0x4b, 0x76, 0xb6, + 0xbb, 0x00, 0xa0, 0xdf, 0x40, 0x15, 0xa6, 0xe2, + 0x08, 0xee, 0x6d, 0xe5, 0xb7, 0x94, 0x71, 0x47, + 0x33, 0x1c, 0xc7, 0x8e, 0xb3, 0x81, 0x05, 0x64, + 0x44, 0x15, 0x0d, 0x1b, 0xa3, 0x6f, 0x30, 0x59, + 0x09, 0xee, 0xef, 0x64, 0x8a, 0x5e, 0x28, 0xfa, + 0x28, 0x3a, 0x32, 0x49, 0x00, 0xbb, 0x89, 0xc4, + 0xf1, 0x34, 0x53, 0x70, 0x59, 0x75, 0xae, 0x92, + 0xbb, 0xcf, 0xcb, 0x6b, 0x3d, 0x8b, 0xe2, 0x8e, + 0x68, 0x5a, 0xe8, 0xe4, 0x32, 0x97, 0x0a, 0xb4, + 0x90, 0xe6, 0xd3, 0x85, 0xae, 0xdc, 0x6a, 0xad, + 0x48, 0x83, 0x5f, 0x1d, 0x66, 0xcb, 0x0b, 0x0b, + 0x7b, 0x28, 0xfb, 0xcb, 0x78, 0xdb, 0x18, 0x3d, + 0x5a, 0x0d, 0xa7, 0xdd, 0x3b, 0x55, 0x7b, 0x3d, + 0xa4, 0x2e, 0xa7, 0xc9, 0x0c, 0xde, 0x0e, 0xe4, + 0x59, 0x64, 0x87, 0xd6, 0x03, 0x50, 0xc7, 0x9a, + 0x52, 0xbb, 0x2b, 0x4a, 0x8d, 0xe0, 0x8a, 0x15, + 0x69, 0x44, 0x14, 0xab, 0xbc, 0x3f, 0xb4, 0x0c, + 0xbc, 0x3e, 0x63, 0x90, 0xba, 0xb6, 0xb6, 0xb4, + 0x7e, 0xc9, 0x9d, 0x15, 0x2a, 0xe6, 0xf3, 0x34, + 0x54, 0xf3, 0x54, 0x2b, 0x36, 0x27, 0x0d, 0x6d, + 0x88, 0xc5, 0x8c, 0x75, 0xa5, 0x4b, 0x43, 0x5d, + 0x57, 0xbb, 0xbe, 0x73, 0xdc, 0x3b, 0xa7, 0xba, + 0x9d, 0x55, 0xbe, 0x88, 0x2b, 0xda, 0x2f, 0x4f, + 0xde, 0xe0, 0x2c, 0x27, 0xb6, 0xbc, 0x7c, 0x6f, + 0x7c, 0xb2, 0x89, 0x1a, 0x62, 0x24, 0x8a, 0x06, + 0x86, 0xed, 0xe2, 0x6b, 0x55, 0x85, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x47, 0xea, 0x0f, 0x54, 0xcf, 0xf2, + 0x7c, 0x60, 0xa4, 0x14, 0x7e, 0xa0, 0xf5, 0x4c, + 0xff, 0x00, 0x27, 0xc6, 0x0a, 0xf6, 0xf6, 0xe9, + 0xd3, 0x0c, 0xb1, 0x3c, 0x0b, 0xbb, 0x95, 0xea, + 0x7b, 0xa5, 0x7d, 0x50, 0xdf, 0x0d, 0xfd, 0xb5, + 0x2c, 0xfd, 0xca, 0x27, 0x4a, 0xfa, 0xa1, 0xbe, + 0x1b, 0xfb, 0x6a, 0x59, 0xfb, 0x94, 0xdd, 0xe2, + 0xd7, 0xbd, 0x28, 0xc3, 0x70, 0x2d, 0xee, 0xc3, + 0x9c, 0xdd, 0x7f, 0x93, 0xc7, 0x95, 0x67, 0xd8, + 0x85, 0x7f, 0x54, 0x0b, 0xaf, 0xf2, 0x78, 0xf2, + 0xac, 0xfb, 0x10, 0xaf, 0xeb, 0x96, 0xce, 0x7a, + 0xf7, 0xe5, 0xec, 0x7c, 0x53, 0x36, 0x0f, 0xf8, + 0xd6, 0xc4, 0x44, 0x5b, 0x3c, 0xd1, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x15, 0x43, 0x33, + 0xa1, 0xe7, 0x39, 0x03, 0x96, 0xd3, 0xd7, 0x5f, + 0x87, 0xde, 0x38, 0x97, 0x3e, 0x3a, 0x96, 0xb0, + 0xb8, 0xf7, 0xc5, 0xa5, 0xbb, 0xab, 0xca, 0x08, + 0xa2, 0xb7, 0xa2, 0x0a, 0x4b, 0xf1, 0xfe, 0xd3, + 0x6e, 0x19, 0xe6, 0xf2, 0xde, 0xc1, 0x0c, 0x67, + 0x63, 0xa6, 0x63, 0x98, 0xd7, 0x53, 0x9d, 0x8c, + 0xe2, 0xec, 0x29, 0x7d, 0x31, 0xa4, 0x6d, 0x70, + 0x2d, 0x7c, 0xef, 0x93, 0xce, 0xaf, 0xe6, 0x14, + 0x92, 0xe0, 0x8a, 0x00, 0x0e, 0xd2, 0xd6, 0x03, + 0x53, 0xb7, 0x94, 0xef, 0x2a, 0x7d, 0x10, 0x41, + 0x6a, 0x8d, 0x2d, 0x16, 0x7a, 0x28, 0xa4, 0x8e, + 0x4f, 0x36, 0xbf, 0xb6, 0xdb, 0x05, 0xc0, 0xad, + 0x29, 0xbf, 0x85, 0xd4, 0xdb, 0x4a, 0xed, 0x04, + 0x6e, 0x51, 0x46, 0xcb, 0xda, 0x5b, 0xe1, 0xf3, + 0x33, 0x77, 0x6a, 0x18, 0x47, 0x09, 0xbb, 0x04, + 0x74, 0x94, 0xea, 0xd7, 0x86, 0xb5, 0xf7, 0x15, + 0xc9, 0x10, 0x42, 0x69, 0x8d, 0x31, 0x6d, 0xa7, + 0xed, 0xde, 0x03, 0xcd, 0xc5, 0xe5, 0xc5, 0x0d, + 0xc5, 0xc1, 0x14, 0xad, 0x3e, 0x2b, 0x41, 0xe4, + 0x1e, 0xfa, 0xd7, 0xb1, 0xd3, 0x97, 0xd6, 0xfa, + 0xc6, 0xf3, 0x3a, 0xf7, 0xc6, 0x6d, 0x6e, 0x58, + 0x5a, 0xc6, 0x02, 0x7a, 0x40, 0x48, 0x60, 0xda, + 0x38, 0x69, 0xf1, 0x7a, 0xaa, 0xc6, 0x88, 0x35, + 0xb2, 0x76, 0xd2, 0x5d, 0xe3, 0x6e, 0xed, 0x63, + 0x20, 0x49, 0x3c, 0x32, 0x44, 0xc2, 0xed, 0x80, + 0x17, 0xb4, 0xb4, 0x57, 0xb2, 0xa3, 0xb4, 0x86, + 0x1a, 0xeb, 0x07, 0x87, 0x16, 0x37, 0x4e, 0x8d, + 0xf2, 0x89, 0x5f, 0x25, 0x63, 0x24, 0xb6, 0x8e, + 0xa5, 0x37, 0x81, 0xd4, 0x53, 0x48, 0x82, 0x90, + 0xfd, 0x27, 0xaa, 0x31, 0xb9, 0x8b, 0xab, 0xdc, + 0x05, 0xdc, 0x4c, 0x82, 0xf1, 0xe5, 0xef, 0x6b, + 0xcd, 0x0d, 0x0b, 0x8b, 0xf8, 0x5c, 0x0b, 0x1c, + 0x0d, 0x09, 0x3b, 0x42, 0x94, 0xca, 0xe9, 0xdb, + 0xeb, 0xed, 0x51, 0x8d, 0xcc, 0x46, 0xf8, 0x9b, + 0x6f, 0x64, 0x1a, 0x25, 0x6b, 0x89, 0xe3, 0x25, + 0xa5, 0xc4, 0xf0, 0x80, 0xda, 0x72, 0xf5, 0x55, + 0x8d, 0x10, 0x15, 0x42, 0xf7, 0x48, 0x65, 0xac, + 0x32, 0x92, 0x65, 0x34, 0xbd, 0xcb, 0x2d, 0xdd, + 0x3d, 0x4c, 0xd6, 0xb2, 0xf7, 0x84, 0x93, 0x52, + 0x06, 0xc2, 0x08, 0xae, 0xda, 0x1d, 0xca, 0xde, + 0x88, 0x29, 0x57, 0x1a, 0x6b, 0x57, 0x67, 0xdf, + 0x1c, 0x5a, 0x82, 0xf2, 0x28, 0x2c, 0x63, 0x70, + 0x71, 0x82, 0xda, 0x84, 0xb8, 0x8e, 0xb0, 0x14, + 0xaf, 0x5c, 0x95, 0x63, 0xc8, 0x62, 0x5a, 0xfd, + 0x3f, 0x3e, 0x1e, 0xc1, 0xad, 0x89, 0xae, 0x80, + 0xc1, 0x03, 0x5d, 0xb1, 0xad, 0xd9, 0xb2, 0xa7, + 0x69, 0x52, 0x48, 0x82, 0x27, 0x4b, 0x62, 0x6e, + 0x70, 0xf8, 0x48, 0x71, 0xf7, 0x4e, 0x63, 0xe6, + 0x89, 0xd2, 0x39, 0xc6, 0x32, 0x4b, 0x68, 0xf7, + 0x17, 0x0a, 0x17, 0x01, 0xd5, 0x52, 0xc8, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x83, 0x78, 0x44, 0x1b, 0xc2, 0x0a, 0x06, 0x8d, + 0xfe, 0xf8, 0xbe, 0xe6, 0xb8, 0xfb, 0x40, 0xba, + 0x42, 0xe6, 0xfa, 0x37, 0xfb, 0xe2, 0xfb, 0x9a, + 0xe3, 0xed, 0x02, 0xe9, 0x0b, 0x1c, 0x3e, 0xc7, + 0x9d, 0x2f, 0x4f, 0xe3, 0x3c, 0xcd, 0x3e, 0xaa, + 0xde, 0xa4, 0x5e, 0x6f, 0xea, 0x63, 0xf0, 0xfe, + 0x02, 0xb3, 0x5a, 0x7a, 0x34, 0x5e, 0x08, 0xed, + 0x2c, 0x39, 0xbf, 0xa9, 0x8f, 0xc3, 0xf8, 0x0a, + 0xcd, 0x69, 0xe8, 0xd1, 0x78, 0x23, 0xb4, 0xb8, + 0xac, 0xff, 0x00, 0x67, 0x88, 0xf5, 0x54, 0x38, + 0xea, 0xe5, 0xed, 0xef, 0xcb, 0x2a, 0x22, 0x2f, + 0x4d, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x82, 0xa7, 0xed, 0x1f, 0x28, + 0x6d, 0x30, 0xad, 0xb1, 0x88, 0xff, 0x00, 0x1b, + 0x20, 0xf0, 0xca, 0x0d, 0xfd, 0x1b, 0x28, 0xe7, + 0x76, 0x4d, 0x02, 0xf7, 0x1f, 0xec, 0xef, 0x4f, + 0x8b, 0x1b, 0x71, 0x7d, 0x03, 0xe4, 0xbb, 0xe8, + 0xda, 0x67, 0x77, 0x48, 0xe1, 0xdd, 0x91, 0x57, + 0x6c, 0x07, 0x91, 0x49, 0xe4, 0xb4, 0xbe, 0x3f, + 0x29, 0x93, 0xb7, 0xc9, 0x5d, 0xbe, 0x57, 0x49, + 0x69, 0xc3, 0xd1, 0x44, 0x1c, 0x04, 0x5d, 0xcb, + 0xb8, 0xf6, 0xb7, 0x86, 0xbb, 0x4e, 0xfd, 0xaa, + 0x61, 0x05, 0x3f, 0x35, 0xec, 0xfb, 0x06, 0xcc, + 0x55, 0xd4, 0x98, 0xd8, 0x1c, 0xcb, 0xc8, 0xe3, + 0x2f, 0x84, 0xf4, 0x8e, 0x75, 0x4b, 0x7b, 0xae, + 0x1a, 0x13, 0x4d, 0xa0, 0x51, 0x6c, 0x7b, 0x39, + 0xcb, 0xf9, 0xfe, 0x11, 0xb6, 0xaf, 0x35, 0x9b, + 0x1e, 0xe1, 0x11, 0xae, 0xfe, 0x8c, 0xf7, 0x51, + 0x9f, 0x83, 0xdc, 0x56, 0x85, 0x0f, 0x87, 0xd2, + 0xd8, 0xec, 0x35, 0xfc, 0xf7, 0xd6, 0x4f, 0x99, + 0xae, 0xb9, 0x04, 0x49, 0x13, 0x9c, 0x0c, 0x7b, + 0x5d, 0xc7, 0xb1, 0xa1, 0xa0, 0xec, 0x3b, 0xb6, + 0xa0, 0xad, 0x7b, 0x38, 0xf5, 0xc6, 0x6f, 0xc2, + 0x1f, 0x69, 0x22, 0xbb, 0x5f, 0x59, 0x5b, 0x5f, + 0xda, 0x4b, 0x67, 0x74, 0xce, 0x92, 0x09, 0x9a, + 0x5a, 0xf6, 0xfc, 0x23, 0xa8, 0x46, 0xf0, 0xb4, + 0x30, 0xda, 0x6b, 0x1f, 0x85, 0xb9, 0xba, 0xb9, + 0xb4, 0x74, 0xae, 0x7d, 0xe1, 0xac, 0xa2, 0x47, + 0x02, 0x07, 0x74, 0x5d, 0xdc, 0xd1, 0xa3, 0xf4, + 0x94, 0xb2, 0x0e, 0x75, 0xa7, 0xaf, 0x6e, 0x74, + 0x8e, 0xa2, 0x97, 0x01, 0x90, 0x79, 0xf3, 0x1b, + 0x87, 0x8e, 0x8a, 0x47, 0x6c, 0x68, 0x2e, 0xfa, + 0xb9, 0x47, 0x50, 0x3b, 0xbd, 0x77, 0x5d, 0x4c, + 0xfb, 0x4c, 0xfe, 0xdb, 0x6f, 0xfe, 0x4c, 0x7e, + 0x2b, 0xd4, 0xae, 0x7f, 0x4b, 0xe3, 0x33, 0xe2, + 0x2f, 0x3d, 0xe3, 0x63, 0xe0, 0xaf, 0x04, 0x91, + 0x10, 0xd7, 0x51, 0xdb, 0xda, 0x49, 0x0e, 0xa8, + 0xe5, 0x5f, 0x59, 0x2d, 0x3b, 0x69, 0x93, 0xc4, + 0xc5, 0x8a, 0xbc, 0x96, 0x67, 0xc3, 0x09, 0x61, + 0x12, 0xf1, 0x0e, 0x95, 0xc5, 0x80, 0xb5, 0xbc, + 0x4e, 0xe1, 0xa1, 0xd8, 0x7a, 0x88, 0x35, 0x27, + 0xc6, 0x8c, 0xa6, 0x88, 0x8a, 0xc8, 0x0a, 0xbd, + 0xf6, 0x51, 0x3a, 0x2f, 0x28, 0xc6, 0x35, 0xec, + 0xf7, 0xc2, 0xa7, 0x59, 0xe4, 0x24, 0xd4, 0x36, + 0x58, 0x1d, 0x35, 0x52, 0x4c, 0x53, 0x3b, 0xcf, + 0x2b, 0xfe, 0xdc, 0x5d, 0xe5, 0x79, 0x99, 0x55, + 0xd3, 0x2d, 0x2d, 0xd9, 0x69, 0x6d, 0x0d, 0xb4, + 0x44, 0x96, 0x5b, 0xb1, 0xb1, 0xb0, 0xbb, 0x69, + 0xa3, 0x00, 0x68, 0xaf, 0x61, 0x45, 0x62, 0xf4, + 0x9e, 0x2b, 0x17, 0x93, 0x9b, 0x27, 0x6b, 0xd2, + 0x74, 0xf3, 0xf1, 0x8e, 0x17, 0x10, 0x58, 0xd1, + 0x21, 0xe2, 0x77, 0x00, 0xe1, 0x14, 0xec, 0xa0, + 0x88, 0xf6, 0xa2, 0x00, 0xd3, 0xf6, 0xe0, 0x0a, + 0x01, 0x70, 0xd0, 0x07, 0x50, 0x70, 0x3d, 0x5a, + 0x31, 0x9e, 0xad, 0xb4, 0xf2, 0x11, 0x78, 0x8d, + 0x5a, 0xd9, 0xdc, 0x0d, 0x96, 0x7a, 0xd1, 0x96, + 0x97, 0xae, 0x91, 0xb1, 0xb1, 0xe2, 0x40, 0x62, + 0x21, 0xa6, 0xa0, 0x16, 0xfc, 0x66, 0xbb, 0xaa, + 0xb7, 0xe0, 0x89, 0xb0, 0x43, 0x1c, 0x0c, 0x24, + 0xb6, 0x26, 0xb5, 0x8d, 0x27, 0x7d, 0x1a, 0x28, + 0x2a, 0x83, 0xed, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x04, 0x66, 0x5b, 0xeb, 0xa1, 0xe6, 0x3d, + 0xb5, 0x36, 0xde, 0xf4, 0x73, 0x28, 0x4c, 0xb7, + 0xd7, 0x43, 0xcc, 0x7b, 0x6a, 0x6d, 0xbd, 0xe8, + 0xe6, 0x5e, 0x76, 0x0f, 0x9e, 0xc7, 0x69, 0xb5, + 0xfa, 0x65, 0xd1, 0x77, 0x83, 0x67, 0x45, 0x5a, + 0xd8, 0x6f, 0x3d, 0x16, 0x6f, 0x26, 0xff, 0x00, + 0x14, 0xaa, 0x96, 0x84, 0xdd, 0x79, 0xfc, 0xaf, + 0x9e, 0xad, 0xb7, 0x9e, 0x8b, 0x37, 0x93, 0x7f, + 0x8a, 0x55, 0x4b, 0x42, 0x6e, 0xbc, 0xfe, 0x57, + 0xcf, 0x5e, 0xad, 0x3b, 0x15, 0x77, 0x9c, 0x35, + 0xf1, 0xad, 0x79, 0xcb, 0x5a, 0x22, 0x2c, 0xdb, + 0x08, 0x88, 0x80, 0xa9, 0x9e, 0xd3, 0xac, 0x64, + 0x97, 0x17, 0x6d, 0x90, 0x88, 0x54, 0xd9, 0x4a, + 0x43, 0xfa, 0xcd, 0x92, 0x94, 0x3f, 0xb4, 0xd0, + 0xae, 0x6b, 0x1d, 0xc5, 0xbc, 0x37, 0x30, 0x49, + 0x6f, 0x70, 0xc1, 0x24, 0x32, 0xb4, 0xb2, 0x46, + 0x3b, 0x71, 0x69, 0xde, 0x10, 0x6b, 0x61, 0xb2, + 0x50, 0x65, 0x31, 0x96, 0xf7, 0xd0, 0x3b, 0x89, + 0xb2, 0xb0, 0x71, 0x8e, 0x56, 0xbc, 0x0a, 0x3d, + 0xa7, 0xae, 0x0a, 0xdc, 0x73, 0xd8, 0xc6, 0xb9, + 0xef, 0x70, 0x63, 0x1a, 0x0b, 0x9c, 0xe3, 0xb0, + 0x00, 0x37, 0x92, 0xa9, 0x27, 0x46, 0x6a, 0x2c, + 0x35, 0xcb, 0xe6, 0xd3, 0x19, 0x10, 0xd8, 0x24, + 0x35, 0x36, 0xf3, 0x1a, 0x7b, 0x86, 0xa1, 0xcc, + 0x75, 0x3a, 0xbb, 0xd7, 0xcd, 0xce, 0x9d, 0xd7, + 0x99, 0x91, 0xe6, 0xd9, 0x6b, 0xf8, 0xa0, 0xb4, + 0x3f, 0x58, 0xc8, 0x88, 0xee, 0x87, 0x81, 0x1b, + 0x5b, 0xc5, 0xee, 0x94, 0x12, 0x9a, 0x5f, 0x55, + 0x5d, 0x67, 0xf2, 0x37, 0xb0, 0xb6, 0xdd, 0x8d, + 0xb1, 0xb6, 0x24, 0xc5, 0x72, 0xd2, 0x43, 0x88, + 0x73, 0xb8, 0x63, 0x04, 0x1d, 0x95, 0x23, 0x6a, + 0x8a, 0xf6, 0x6a, 0xe1, 0x15, 0xde, 0x62, 0xca, + 0x4d, 0x97, 0x0d, 0x91, 0xae, 0x73, 0x4e, 0xfa, + 0x35, 0xcf, 0x63, 0xbb, 0x05, 0x5a, 0xf0, 0xb8, + 0x5b, 0x2c, 0x2d, 0x8b, 0x6c, 0xac, 0xc1, 0xe1, + 0x07, 0x8a, 0x49, 0x1d, 0xdf, 0x3d, 0xe7, 0x7b, + 0x9c, 0xa1, 0x33, 0x7a, 0x46, 0xf1, 0xd9, 0x4f, + 0xc6, 0xf4, 0xfd, 0xcb, 0x6c, 0xf2, 0x07, 0x6c, + 0xac, 0x76, 0xc6, 0x3c, 0xee, 0x27, 0x71, 0xdf, + 0xca, 0x08, 0xa2, 0x0b, 0x2d, 0xdc, 0xd1, 0xc1, + 0x6b, 0x34, 0xd2, 0x90, 0xd8, 0xe3, 0x8d, 0xce, + 0x79, 0x3c, 0x80, 0x02, 0x4a, 0xa5, 0xfb, 0x34, + 0x8d, 0xe3, 0x09, 0x94, 0x98, 0x8a, 0x32, 0x49, + 0x08, 0x67, 0xc9, 0x8f, 0x6f, 0x6d, 0x65, 0xba, + 0xc1, 0xeb, 0xac, 0xdc, 0x62, 0xcf, 0x2d, 0x77, + 0x6f, 0x6b, 0x64, 0x4f, 0xf1, 0x7a, 0x01, 0x52, + 0xf0, 0x3a, 0xa1, 0xbb, 0xf9, 0x89, 0xa2, 0xb3, + 0xe3, 0xf1, 0x36, 0xb8, 0xcc, 0x58, 0xc7, 0x59, + 0x8e, 0x18, 0xd8, 0xc7, 0x34, 0x17, 0x6f, 0x73, + 0x9c, 0x36, 0xb9, 0xc7, 0xaa, 0x4a, 0x0a, 0xc7, + 0xb2, 0xcf, 0x53, 0x5d, 0xff, 0x00, 0xe4, 0x7c, + 0xc6, 0xa9, 0x0f, 0x68, 0x5f, 0xda, 0xd7, 0x1e, + 0x52, 0x2f, 0x1c, 0x2c, 0x9a, 0x2f, 0x4f, 0x5e, + 0xe0, 0x31, 0xf3, 0xdb, 0x5e, 0x3e, 0x37, 0xbe, + 0x59, 0x7a, 0x46, 0x98, 0x89, 0x22, 0x9c, 0x21, + 0xbb, 0x78, 0x9a, 0xde, 0xa2, 0xdf, 0xd4, 0x18, + 0x91, 0x99, 0xc4, 0x4f, 0x8e, 0xe3, 0x11, 0x3a, + 0x50, 0x0b, 0x24, 0x22, 0xa0, 0x39, 0xa4, 0x39, + 0xb5, 0x1d, 0x4d, 0x88, 0x34, 0x71, 0xd1, 0x3e, + 0x5d, 0x0b, 0x0c, 0x51, 0xed, 0x7b, 0xf1, 0xa5, + 0xad, 0x03, 0xaa, 0x62, 0x34, 0x55, 0x0d, 0x19, + 0xa6, 0x99, 0x99, 0xc6, 0xcb, 0x2b, 0x32, 0x77, + 0x36, 0x6f, 0x86, 0x5e, 0x17, 0xc1, 0x09, 0xa3, + 0x76, 0xb4, 0x16, 0xb8, 0x8a, 0x8d, 0xfb, 0x7b, + 0x0a, 0xd1, 0xa5, 0x31, 0x5a, 0xa7, 0x17, 0x20, + 0xb6, 0xc9, 0xdc, 0x45, 0x2e, 0x36, 0x18, 0x8c, + 0x70, 0x46, 0xc3, 0x52, 0x1d, 0x51, 0xc3, 0x4e, + 0xe0, 0x1a, 0x52, 0xbb, 0xca, 0xd4, 0xbb, 0xd2, + 0x19, 0x6c, 0x76, 0x4e, 0x4c, 0x9e, 0x97, 0xba, + 0x65, 0xb9, 0x9c, 0x93, 0x2d, 0xa4, 0xbd, 0xe6, + 0xd3, 0x52, 0x06, 0xc2, 0x08, 0xae, 0xe0, 0x77, + 0x20, 0xc5, 0x7f, 0xa1, 0xad, 0x2d, 0xad, 0x24, + 0x9b, 0x21, 0x9e, 0xbb, 0x65, 0xab, 0x40, 0x12, + 0xba, 0x53, 0x56, 0xd0, 0x9a, 0x50, 0x8a, 0x9e, + 0x55, 0x62, 0xd3, 0x36, 0x76, 0x56, 0x58, 0x58, + 0x2d, 0xec, 0x2e, 0x7c, 0xf2, 0xd5, 0xa5, 0xee, + 0x8e, 0xe3, 0x60, 0x0e, 0xe2, 0x71, 0x27, 0x76, + 0xcd, 0x8a, 0xbb, 0x73, 0xa6, 0xb5, 0x86, 0x7d, + 0xf1, 0xc5, 0x9f, 0xbc, 0x86, 0xde, 0xc6, 0x37, + 0x07, 0x3a, 0x1b, 0x7d, 0xa5, 0xc4, 0x72, 0xd0, + 0x0a, 0x57, 0xae, 0x4e, 0xc5, 0x3b, 0x99, 0xc5, + 0x64, 0x1d, 0x83, 0x18, 0x9c, 0x09, 0x8a, 0xd9, + 0xa5, 0xa2, 0x12, 0xf9, 0x1c, 0x5b, 0xc3, 0x10, + 0x14, 0x21, 0xbc, 0x2d, 0x3b, 0x5d, 0xd5, 0x41, + 0x48, 0xd4, 0xfd, 0x2e, 0xaa, 0xcc, 0xdd, 0x49, + 0x88, 0x80, 0x4b, 0x0e, 0x2e, 0x02, 0x25, 0x9d, + 0xbb, 0xe5, 0xe0, 0x3c, 0x9d, 0x5e, 0x50, 0xd1, + 0xd4, 0x57, 0x6d, 0x23, 0x9c, 0xb5, 0xcc, 0x61, + 0xa1, 0x7c, 0x2d, 0x6c, 0x52, 0x5b, 0x35, 0xb0, + 0xcd, 0x03, 0x76, 0x06, 0x16, 0x8d, 0x9c, 0x23, + 0xf4, 0x5c, 0x36, 0x85, 0x97, 0x4d, 0x60, 0x61, + 0xc0, 0xe2, 0xe3, 0xb3, 0x65, 0x1f, 0x33, 0xbb, + 0xbb, 0x99, 0x47, 0xc6, 0x90, 0xf5, 0x3a, 0xc3, + 0x70, 0x51, 0x50, 0xe9, 0x6c, 0x8e, 0x33, 0x53, + 0x3b, 0x29, 0x87, 0x92, 0x26, 0xd8, 0x5c, 0xfa, + 0x55, 0xa4, 0x8e, 0x73, 0x4d, 0x1c, 0x7b, 0xb0, + 0xce, 0x16, 0xb8, 0x6f, 0xee, 0x9b, 0xd8, 0x41, + 0x6a, 0x44, 0x44, 0x05, 0xa5, 0x9a, 0xb2, 0xb9, + 0xbf, 0xc6, 0x4f, 0x69, 0x6b, 0x39, 0xb5, 0x9e, + 0x50, 0x03, 0x27, 0x15, 0x05, 0xb4, 0x70, 0x3f, + 0x16, 0x85, 0x6e, 0xa2, 0x0a, 0x37, 0xe4, 0x5d, + 0x51, 0xff, 0x00, 0xf1, 0x03, 0xff, 0x00, 0x6a, + 0x6f, 0xa6, 0xb3, 0x6b, 0xf8, 0x25, 0xb6, 0xd1, + 0xd6, 0xd6, 0xf3, 0x49, 0xd3, 0x4b, 0x0c, 0x90, + 0xb1, 0xf2, 0x9a, 0xd5, 0xce, 0x6b, 0x1c, 0x0b, + 0xb6, 0xed, 0xda, 0xae, 0x6a, 0x0f, 0x58, 0x60, + 0xee, 0xf3, 0x98, 0x91, 0x65, 0x68, 0xe8, 0xd9, + 0x20, 0x95, 0xb2, 0x56, 0x52, 0x43, 0x68, 0xd0, + 0xe1, 0xf1, 0x43, 0xba, 0xa8, 0x34, 0x33, 0x98, + 0xcf, 0xc4, 0x74, 0x14, 0x2d, 0x68, 0xac, 0xb6, + 0xf6, 0xd1, 0x5c, 0x45, 0xd5, 0xab, 0x18, 0x38, + 0x87, 0xba, 0xda, 0xa8, 0x6c, 0x96, 0x66, 0x4c, + 0xde, 0x99, 0xc2, 0x62, 0x61, 0x7d, 0x6e, 0xb2, + 0x32, 0xb6, 0x1b, 0x8a, 0x6f, 0x02, 0x02, 0x1a, + 0x49, 0xe7, 0xd8, 0xe5, 0x7b, 0xb0, 0xb5, 0x75, + 0xbe, 0x3a, 0xda, 0xce, 0x6a, 0x39, 0xd1, 0x42, + 0xc8, 0xa4, 0xa6, 0xd6, 0x9a, 0x34, 0x35, 0xd4, + 0xeb, 0x2a, 0xb6, 0x9b, 0xd0, 0xd7, 0x18, 0x9c, + 0xf3, 0xb2, 0x13, 0xc9, 0x1c, 0x96, 0xd0, 0xf4, + 0x9e, 0x66, 0xc6, 0x97, 0x17, 0x02, 0xf3, 0x40, + 0x5c, 0x0b, 0x40, 0x14, 0x6f, 0x51, 0x07, 0xcf, + 0xb4, 0xb8, 0x63, 0xb7, 0xd3, 0x56, 0x76, 0xf1, + 0x0a, 0x47, 0x0c, 0xec, 0x8d, 0x83, 0xf5, 0x5b, + 0x13, 0xda, 0x15, 0xaf, 0x1b, 0xea, 0xdb, 0x3f, + 0xfc, 0x78, 0xbc, 0x46, 0xa8, 0x9d, 0x69, 0x81, + 0xbc, 0xcf, 0x63, 0x22, 0xb3, 0xb3, 0x7c, 0x6c, + 0x91, 0x93, 0x09, 0x09, 0x94, 0x90, 0x29, 0xc2, + 0xe6, 0xfc, 0x56, 0xbb, 0xf4, 0x94, 0xd5, 0xa4, + 0x4e, 0x82, 0xd2, 0x08, 0x1e, 0x41, 0x74, 0x51, + 0x32, 0x37, 0x11, 0xba, 0xad, 0x68, 0x69, 0xa7, + 0x61, 0x06, 0x54, 0x44, 0x40, 0x44, 0x44, 0x11, + 0xda, 0x8f, 0xd4, 0x77, 0x9e, 0x4f, 0xe7, 0x35, + 0x6b, 0xe8, 0x6f, 0x53, 0x3b, 0xcb, 0xbf, 0xb4, + 0xd5, 0xb1, 0xa8, 0xfd, 0x47, 0x79, 0xe4, 0xfe, + 0x73, 0x56, 0xbe, 0x86, 0xf5, 0x33, 0xbc, 0xbb, + 0xfb, 0x4d, 0x57, 0x8e, 0x1c, 0xe9, 0x63, 0x3c, + 0xc5, 0x3b, 0x93, 0xad, 0x62, 0x44, 0x45, 0x46, + 0xc2, 0x22, 0x20, 0x22, 0x22, 0x02, 0xd5, 0xc8, + 0x7a, 0x15, 0xcf, 0x92, 0x7f, 0x8a, 0x56, 0xd2, + 0xd5, 0xc8, 0x7a, 0x15, 0xcf, 0x92, 0x7f, 0x8a, + 0x54, 0xd3, 0x9e, 0x15, 0xb9, 0xb1, 0x56, 0x89, + 0xd4, 0x82, 0xd2, 0x7e, 0x8f, 0x71, 0xe1, 0xb7, + 0xc5, 0x53, 0xca, 0x07, 0x49, 0xfa, 0x3d, 0xc7, + 0x86, 0xdf, 0x15, 0x4f, 0x2d, 0x31, 0x1c, 0x5a, + 0xb4, 0xfd, 0xcc, 0x30, 0x3c, 0xb5, 0xbd, 0x13, + 0xac, 0x44, 0x45, 0x93, 0xa4, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x05, 0x1f, 0xa8, 0x3d, 0x53, 0x3f, + 0xc9, 0xf1, 0x82, 0x90, 0x51, 0xfa, 0x83, 0xd5, + 0x33, 0xfc, 0x9f, 0x18, 0x2b, 0xdb, 0xdb, 0xa7, + 0x4c, 0x32, 0xc4, 0xf0, 0x2e, 0xee, 0x57, 0xa9, + 0xee, 0x95, 0xf5, 0x43, 0x7c, 0x37, 0xf6, 0xd4, + 0xb3, 0xf7, 0x28, 0x9d, 0x2b, 0xea, 0x86, 0xf8, + 0x6f, 0xed, 0xa9, 0x67, 0xee, 0x53, 0x77, 0x8b, + 0x5e, 0xf4, 0xa3, 0x0d, 0xc0, 0xb7, 0xbb, 0x0e, + 0x73, 0x75, 0xfe, 0x4f, 0x1e, 0x55, 0x9f, 0x62, + 0x15, 0xfd, 0x50, 0x2e, 0xbf, 0xc9, 0xe3, 0xca, + 0xb3, 0xec, 0x42, 0xbf, 0xae, 0x5b, 0x39, 0xeb, + 0xdf, 0x97, 0xb1, 0xf1, 0x4c, 0xd8, 0x3f, 0xe3, + 0x5b, 0x11, 0x11, 0x6c, 0xf3, 0x44, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x41, 0xbc, 0x22, 0x0d, 0xe1, + 0x05, 0x03, 0x46, 0xff, 0x00, 0x7c, 0x5f, 0x73, + 0x5c, 0x7d, 0xa0, 0x5d, 0x21, 0x73, 0x7d, 0x1b, + 0xfd, 0xf1, 0x7d, 0xcd, 0x71, 0xf6, 0x81, 0x74, + 0x85, 0x8e, 0x1f, 0x63, 0xce, 0x97, 0xa7, 0xf1, + 0x9e, 0x66, 0x9f, 0x55, 0x6f, 0x52, 0x2f, 0x37, + 0xf5, 0x31, 0xf8, 0x7f, 0x01, 0x59, 0xad, 0x3d, + 0x1a, 0x2f, 0x04, 0x76, 0x96, 0x1c, 0xdf, 0xd4, + 0xc7, 0xe1, 0xfc, 0x05, 0x66, 0xb4, 0xf4, 0x68, + 0xbc, 0x11, 0xda, 0x5c, 0x56, 0x7f, 0xb3, 0xc4, + 0x7a, 0xaa, 0x1c, 0x75, 0x72, 0xf6, 0xf7, 0xe5, + 0x95, 0x11, 0x17, 0xa6, 0xc0, 0x44, 0x44, 0x04, + 0x45, 0xf3, 0x24, 0x91, 0xc4, 0xc7, 0x49, 0x23, + 0x83, 0x23, 0x60, 0x2e, 0x7b, 0xdc, 0x68, 0x00, + 0x1b, 0xc9, 0x25, 0x07, 0xd2, 0x2a, 0x95, 0xe7, + 0xb4, 0x7c, 0x63, 0x27, 0x30, 0x63, 0x6d, 0x66, + 0xc8, 0xb9, 0xbb, 0xdd, 0x18, 0xe1, 0x6f, 0xb9, + 0xb0, 0xb8, 0x8f, 0x71, 0x79, 0x69, 0xed, 0x1f, + 0x1c, 0xeb, 0x81, 0x6f, 0x92, 0xb4, 0x9b, 0x1c, + 0xe7, 0x7c, 0x79, 0x07, 0x13, 0x47, 0x85, 0xb0, + 0x38, 0x0e, 0xbd, 0x10, 0x5b, 0x91, 0x78, 0xc7, + 0xb2, 0x46, 0x36, 0x48, 0xdc, 0x1e, 0xc7, 0x80, + 0xe6, 0xb9, 0xa6, 0xa0, 0x83, 0xb4, 0x10, 0x57, + 0xa8, 0x08, 0x88, 0x80, 0x88, 0xb5, 0x32, 0x79, + 0x5b, 0x0c, 0x55, 0xb7, 0x9c, 0xdf, 0xcc, 0x21, + 0x8e, 0xbc, 0x2d, 0xae, 0xd7, 0x39, 0xdf, 0xa2, + 0xd6, 0x8d, 0xa4, 0xa0, 0xdb, 0x45, 0xe0, 0x3c, + 0x4d, 0x0e, 0x1b, 0x88, 0xa8, 0xf7, 0x57, 0xa8, + 0x08, 0x88, 0x80, 0xbc, 0x73, 0x9a, 0xd6, 0x97, + 0x38, 0x86, 0xb5, 0xa2, 0xa5, 0xc7, 0x60, 0x00, + 0x72, 0x95, 0xea, 0xf9, 0x92, 0x36, 0x48, 0xc7, + 0x47, 0x23, 0x43, 0xd8, 0xf0, 0x5a, 0xf6, 0x9d, + 0xa0, 0x83, 0xb0, 0x82, 0x83, 0x07, 0xe2, 0x78, + 0xcd, 0xfe, 0x79, 0x07, 0xfc, 0xac, 0xfa, 0x4b, + 0xec, 0x5e, 0xd9, 0x96, 0xb5, 0xe2, 0xe2, 0x22, + 0xc9, 0x0f, 0x0b, 0x1d, 0xc6, 0xda, 0x39, 0xdf, + 0xa2, 0xd3, 0x5d, 0xa5, 0x56, 0xaf, 0xf0, 0x78, + 0x66, 0x6a, 0x9c, 0x45, 0xbb, 0x2c, 0x6d, 0xdb, + 0x0c, 0xb0, 0xdc, 0x99, 0x23, 0x11, 0xb7, 0x85, + 0xc5, 0xad, 0x05, 0xbc, 0x42, 0x9c, 0x8b, 0x16, + 0xaf, 0xc2, 0xdb, 0x4b, 0xf8, 0x46, 0x32, 0xca, + 0x26, 0x5b, 0x36, 0x49, 0xae, 0x0c, 0x2c, 0x88, + 0x06, 0x81, 0x20, 0x85, 0xcf, 0x61, 0xa0, 0xfd, + 0x66, 0x84, 0x16, 0xf2, 0xe6, 0xb4, 0x17, 0x38, + 0xf0, 0xb5, 0xa2, 0xa4, 0x9d, 0x80, 0x00, 0xbc, + 0x8e, 0x58, 0xe5, 0x60, 0x92, 0x27, 0xb6, 0x46, + 0x1d, 0xcf, 0x69, 0x0e, 0x07, 0x98, 0x8d, 0x8a, + 0xbd, 0x79, 0x92, 0x7e, 0x57, 0x4d, 0xd9, 0x47, + 0x11, 0xe1, 0xb8, 0xcd, 0x18, 0xed, 0x9c, 0x06, + 0xf6, 0xef, 0xf3, 0x9f, 0xd9, 0x6b, 0x1c, 0xb3, + 0x68, 0x86, 0xb5, 0xba, 0x62, 0xcd, 0xad, 0x14, + 0x6b, 0x4c, 0xa0, 0x0e, 0xb0, 0x96, 0x44, 0x13, + 0xa8, 0x8a, 0x17, 0x52, 0x6a, 0x8b, 0x5d, 0x3c, + 0xdb, 0x77, 0x5c, 0x41, 0x24, 0xe2, 0xe4, 0xb8, + 0x37, 0xa3, 0x20, 0x53, 0x82, 0x9b, 0xf8, 0xb9, + 0xd0, 0x4d, 0x22, 0xa6, 0xff, 0x00, 0xd9, 0x96, + 0x3f, 0xd3, 0x6e, 0xff, 0x00, 0x75, 0x7d, 0xc3, + 0xed, 0x33, 0x0a, 0xe9, 0x03, 0x2e, 0x6d, 0xae, + 0x6d, 0x41, 0xf8, 0xce, 0x68, 0x70, 0x1d, 0x72, + 0x01, 0xaf, 0xbc, 0x82, 0xde, 0x8b, 0x1d, 0xbc, + 0xf0, 0xdc, 0xc0, 0xcb, 0x8b, 0x77, 0xb6, 0x58, + 0x65, 0x68, 0x74, 0x72, 0x34, 0xd4, 0x16, 0x9d, + 0xc4, 0x2c, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x23, 0x32, 0xdf, 0x5d, 0x0f, 0x31, 0xed, 0xa9, + 0xb6, 0xf7, 0xa3, 0x99, 0x42, 0x65, 0xbe, 0xba, + 0x1e, 0x63, 0xdb, 0x53, 0x6d, 0xef, 0x47, 0x32, + 0xf3, 0xb0, 0x7c, 0xf6, 0x3b, 0x4d, 0xaf, 0xd3, + 0x2e, 0x8b, 0xbc, 0x1b, 0x3a, 0x2a, 0xd6, 0xc3, + 0x79, 0xe8, 0xb3, 0x79, 0x37, 0xf8, 0xa5, 0x54, + 0xb4, 0x26, 0xeb, 0xcf, 0xe5, 0x7c, 0xf5, 0x6d, + 0xbc, 0xf4, 0x59, 0xbc, 0x9b, 0xfc, 0x52, 0xaa, + 0x5a, 0x13, 0x75, 0xe7, 0xf2, 0xbe, 0x7a, 0xf5, + 0x69, 0xd8, 0xab, 0xbc, 0xe1, 0xaf, 0x8d, 0x6b, + 0xce, 0x5a, 0xd1, 0x11, 0x66, 0xd8, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x41, 0x1d, 0xa8, + 0xfd, 0x47, 0x79, 0xe4, 0xfe, 0x73, 0x56, 0xbe, + 0x86, 0xf5, 0x33, 0xbc, 0xbb, 0xfb, 0x4d, 0x5b, + 0x1a, 0x8f, 0xd4, 0x77, 0x9e, 0x4f, 0xe7, 0x35, + 0x6b, 0xe8, 0x6f, 0x53, 0x3b, 0xcb, 0xbf, 0xb4, + 0xd5, 0x78, 0xe1, 0xce, 0x96, 0x33, 0xcc, 0x53, + 0xb9, 0x3a, 0xd6, 0x24, 0x44, 0x54, 0x6c, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x2d, 0x5c, 0x87, 0xa1, + 0x5c, 0xf9, 0x27, 0xf8, 0xa5, 0x6d, 0x2d, 0x5c, + 0x87, 0xa1, 0x5c, 0xf9, 0x27, 0xf8, 0xa5, 0x4d, + 0x39, 0xe1, 0x5b, 0x9b, 0x15, 0x68, 0x9d, 0x48, + 0x2d, 0x27, 0xe8, 0xf7, 0x1e, 0x1b, 0x7c, 0x55, + 0x3c, 0xa0, 0x74, 0x9f, 0xa3, 0xdc, 0x78, 0x6d, + 0xf1, 0x54, 0xf2, 0xd3, 0x11, 0xc5, 0xab, 0x4f, + 0xdc, 0xc3, 0x03, 0xcb, 0x5b, 0xd1, 0x3a, 0xc4, + 0x44, 0x59, 0x3a, 0x44, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x51, 0xfa, 0x83, 0xd5, 0x33, 0xfc, 0x9f, + 0x18, 0x29, 0x05, 0x1f, 0xa8, 0x3d, 0x53, 0x3f, + 0xc9, 0xf1, 0x82, 0xbd, 0xbd, 0xba, 0x74, 0xc3, + 0x2c, 0x4f, 0x02, 0xee, 0xe5, 0x7a, 0x9e, 0xe9, + 0x5f, 0x54, 0x37, 0xc3, 0x7f, 0x6d, 0x4b, 0x3f, + 0x72, 0x89, 0xd2, 0xbe, 0xa8, 0x6f, 0x86, 0xfe, + 0xda, 0x96, 0x7e, 0xe5, 0x37, 0x78, 0xb5, 0xef, + 0x4a, 0x30, 0xdc, 0x0b, 0x7b, 0xb0, 0xe7, 0x37, + 0x5f, 0xe4, 0xf1, 0xe5, 0x59, 0xf6, 0x21, 0x5f, + 0xd5, 0x02, 0xeb, 0xfc, 0x9e, 0x3c, 0xab, 0x3e, + 0xc4, 0x2b, 0xfa, 0xe5, 0xb3, 0x9e, 0xbd, 0xf9, + 0x7b, 0x1f, 0x14, 0xcd, 0x83, 0xfe, 0x35, 0xb1, + 0x11, 0x16, 0xcf, 0x34, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x1b, 0xc2, 0x20, 0xde, 0x10, 0x50, + 0x34, 0x6f, 0xf7, 0xc5, 0xf7, 0x35, 0xc7, 0xda, + 0x05, 0xd2, 0x17, 0x37, 0xd1, 0xbf, 0xdf, 0x17, + 0xdc, 0xd7, 0x1f, 0x68, 0x17, 0x48, 0x58, 0xe1, + 0xf6, 0x3c, 0xe9, 0x7a, 0x7f, 0x19, 0xe6, 0x69, + 0xf5, 0x56, 0xf5, 0x22, 0xf3, 0x7f, 0x53, 0x1f, + 0x87, 0xf0, 0x15, 0x9a, 0xd3, 0xd1, 0xa2, 0xf0, + 0x47, 0x69, 0x61, 0xcd, 0xfd, 0x4c, 0x7e, 0x1f, + 0xc0, 0x56, 0x6b, 0x4f, 0x46, 0x8b, 0xc1, 0x1d, + 0xa5, 0xc5, 0x67, 0xfb, 0x3c, 0x47, 0xaa, 0xa1, + 0xc7, 0x57, 0x2f, 0x6f, 0x7e, 0x59, 0x51, 0x11, + 0x7a, 0x6c, 0x04, 0x44, 0x40, 0x54, 0x7f, 0x68, + 0xb7, 0xf7, 0x33, 0xcf, 0x63, 0xa7, 0xad, 0x5d, + 0x43, 0x7a, 0xe6, 0xbe, 0x5a, 0x72, 0xd5, 0xdc, + 0x11, 0xb4, 0xf5, 0xab, 0x52, 0x55, 0xe1, 0x50, + 0x75, 0x3f, 0xf0, 0xbd, 0xa1, 0xe2, 0x65, 0x93, + 0x64, 0x6e, 0xe8, 0x28, 0x79, 0x3b, 0xf7, 0x37, + 0xb6, 0x82, 0xe3, 0x88, 0xc3, 0xd9, 0x61, 0xec, + 0xd9, 0x69, 0x67, 0x18, 0x60, 0x68, 0xa3, 0xe4, + 0xf8, 0xcf, 0x77, 0x2b, 0x9c, 0x79, 0x6a, 0xb1, + 0xe7, 0xf0, 0xb6, 0xd9, 0xac, 0x74, 0xb6, 0x93, + 0xb4, 0x19, 0x0b, 0x49, 0x82, 0x52, 0x3b, 0xa6, + 0x48, 0x07, 0x72, 0xe0, 0x79, 0xf7, 0xa9, 0x14, + 0x41, 0x0b, 0xa4, 0x71, 0x59, 0x3c, 0x46, 0x24, + 0x58, 0xe4, 0x65, 0x8e, 0x52, 0xc7, 0x13, 0x08, + 0x8c, 0x93, 0xc0, 0xc3, 0xb7, 0x80, 0x97, 0x01, + 0xb8, 0xd6, 0x8b, 0x57, 0x31, 0xae, 0x2c, 0x6c, + 0x2f, 0x0e, 0x3a, 0xce, 0x09, 0x72, 0x57, 0xc0, + 0xd1, 0xd1, 0x41, 0xb9, 0xa7, 0xf4, 0x4b, 0xa8, + 0x6a, 0x7a, 0xa0, 0x05, 0x31, 0x90, 0xbe, 0x64, + 0x58, 0xbb, 0xbb, 0xcb, 0x77, 0xb6, 0x43, 0x0c, + 0x32, 0x48, 0xc7, 0x30, 0x87, 0x0e, 0x26, 0xb4, + 0xd3, 0x68, 0xeb, 0xaa, 0xcf, 0xb3, 0x2b, 0x28, + 0x86, 0x2a, 0x7c, 0x9b, 0x80, 0x75, 0xd5, 0xcc, + 0xce, 0x63, 0xa4, 0x3b, 0x5d, 0xc2, 0xc0, 0x0d, + 0x2b, 0xd7, 0x71, 0x24, 0xa0, 0xcf, 0x6b, 0xed, + 0x02, 0xdc, 0x5d, 0x32, 0xd7, 0x31, 0x63, 0x3e, + 0x29, 0xd2, 0x77, 0xb2, 0x4b, 0xb5, 0x9b, 0x7a, + 0xb5, 0x6b, 0x48, 0x1d, 0x75, 0x61, 0xc9, 0xe4, + 0x23, 0xc7, 0x63, 0xa7, 0xc8, 0x3d, 0xa6, 0x58, + 0xed, 0xe3, 0xe9, 0x0b, 0x58, 0x45, 0x5c, 0x3a, + 0xc7, 0x77, 0x2a, 0x8d, 0xd6, 0xb6, 0x10, 0x5f, + 0x69, 0xbb, 0xc3, 0x2b, 0x43, 0x9f, 0x6d, 0x19, + 0x9e, 0x17, 0x1d, 0xed, 0x73, 0x36, 0xec, 0x3d, + 0x71, 0xb1, 0x42, 0x58, 0xdd, 0xcb, 0x75, 0xec, + 0xc6, 0xe1, 0xd2, 0x9e, 0x27, 0x43, 0x0c, 0x90, + 0x82, 0x77, 0xf0, 0xb1, 0xfd, 0xcf, 0x60, 0x6c, + 0x41, 0x96, 0xeb, 0xda, 0x55, 0x8c, 0x70, 0xc0, + 0xeb, 0x5b, 0x39, 0x2e, 0x25, 0x95, 0x9d, 0x24, + 0xb1, 0x87, 0x01, 0xd1, 0x02, 0x48, 0xe1, 0x73, + 0x80, 0x35, 0x3b, 0x2a, 0xa1, 0x35, 0xc6, 0xa1, + 0x39, 0x6b, 0x4b, 0x26, 0x0b, 0x19, 0xed, 0x98, + 0xd7, 0x36, 0x76, 0x4b, 0x28, 0xee, 0x5e, 0x24, + 0x60, 0x3c, 0x2d, 0x23, 0x97, 0x6a, 0xb2, 0xfb, + 0x3a, 0xb3, 0x86, 0x0d, 0x37, 0x1d, 0xc3, 0x5a, + 0x3a, 0x5b, 0xa9, 0x24, 0x74, 0x8f, 0xa6, 0xd2, + 0x1a, 0xe2, 0xc6, 0x8e, 0x61, 0x45, 0xa3, 0xed, + 0x44, 0x01, 0x8e, 0xc7, 0x81, 0xb0, 0x0b, 0x83, + 0x41, 0xc9, 0xde, 0x20, 0xb0, 0xe9, 0xfc, 0xdb, + 0xb2, 0xf0, 0x48, 0xe7, 0x59, 0xcf, 0x63, 0xd0, + 0x16, 0xb2, 0x97, 0x02, 0x85, 0xf5, 0x6d, 0x78, + 0x9b, 0xb0, 0x6c, 0x14, 0x51, 0x77, 0xda, 0xf6, + 0xd5, 0xb7, 0x6f, 0xb2, 0xc4, 0x59, 0xcd, 0x95, + 0x9a, 0x3a, 0x87, 0xba, 0x1e, 0xf0, 0x53, 0x7d, + 0x08, 0x0e, 0x27, 0x9e, 0x94, 0x5b, 0xda, 0xba, + 0xf2, 0x5b, 0x3d, 0x2b, 0x77, 0x34, 0x4e, 0x2d, + 0x90, 0xc4, 0xd8, 0xda, 0xe1, 0xbc, 0x74, 0x85, + 0xac, 0x34, 0xf7, 0x09, 0x55, 0x3d, 0x29, 0xab, + 0x31, 0x18, 0x3c, 0x4b, 0x2d, 0xbc, 0xca, 0xe5, + 0xf7, 0x0f, 0x25, 0xf3, 0xcd, 0x13, 0x1a, 0x5a, + 0xf3, 0x5e, 0xe6, 0x87, 0x8b, 0x70, 0x1b, 0x10, + 0x59, 0x31, 0x1a, 0xde, 0xca, 0xf6, 0xf4, 0x63, + 0x6f, 0xad, 0xa5, 0xc6, 0x5e, 0xbb, 0x63, 0x23, + 0x9f, 0x73, 0x8f, 0x50, 0x12, 0x1a, 0x41, 0x3d, + 0x70, 0xb7, 0x35, 0x16, 0x7f, 0xf0, 0x0b, 0x66, + 0x5d, 0xc9, 0x69, 0x25, 0xcc, 0x0e, 0x77, 0x03, + 0xdf, 0x1b, 0x9a, 0x38, 0x09, 0xef, 0x78, 0xb8, + 0xb9, 0x0a, 0xa4, 0x6b, 0x1d, 0x49, 0x8f, 0xce, + 0xda, 0xc0, 0x6d, 0x2c, 0xee, 0x61, 0xbe, 0xb6, + 0x90, 0x39, 0x93, 0xbd, 0x80, 0x77, 0x14, 0x35, + 0x6d, 0x5a, 0x49, 0xdf, 0x42, 0x17, 0x40, 0xb6, + 0x6c, 0x79, 0x6c, 0x1c, 0x2d, 0xbd, 0x67, 0x1b, + 0x2f, 0x2d, 0xd8, 0x67, 0x61, 0xea, 0xb9, 0xa0, + 0x9f, 0x76, 0xa8, 0x33, 0x59, 0x5f, 0xda, 0xdf, + 0x58, 0xc7, 0x7f, 0x6e, 0xf0, 0x6d, 0xe5, 0x67, + 0x18, 0x79, 0xd9, 0x41, 0xcb, 0xc5, 0xd4, 0xe1, + 0xe5, 0x51, 0x78, 0x4d, 0x55, 0x06, 0x6e, 0xfa, + 0xe2, 0xde, 0xca, 0xda, 0x43, 0x6d, 0x6d, 0x5e, + 0x2b, 0xc7, 0x10, 0x23, 0x3f, 0xa3, 0xc2, 0xdd, + 0xfd, 0xd7, 0x69, 0x50, 0xaf, 0x1f, 0x96, 0xc3, + 0x4d, 0x77, 0xa3, 0xa0, 0xb9, 0x61, 0xb7, 0xba, + 0x99, 0x81, 0xb2, 0xb9, 0xd4, 0xe1, 0x6c, 0x94, + 0xd8, 0xe3, 0xf1, 0x78, 0x81, 0x1c, 0x63, 0xfd, + 0x57, 0x4a, 0xc2, 0x61, 0xad, 0x70, 0xb8, 0xe8, + 0xac, 0x2d, 0xc5, 0x43, 0x36, 0xc9, 0x27, 0x2b, + 0xde, 0x7b, 0xe7, 0x94, 0x18, 0xaf, 0x71, 0xf7, + 0x53, 0x6a, 0x1c, 0x6e, 0x41, 0x80, 0x1b, 0x7b, + 0x48, 0xee, 0x19, 0x31, 0x26, 0x8e, 0x06, 0x56, + 0x80, 0xca, 0x0e, 0x54, 0xca, 0x63, 0xee, 0xae, + 0x72, 0x98, 0x8b, 0xa8, 0x40, 0x31, 0x58, 0xcf, + 0x24, 0x93, 0xd4, 0xd0, 0x86, 0xba, 0x37, 0x30, + 0x70, 0x8e, 0x5d, 0xa5, 0x4a, 0x22, 0x0a, 0xfe, + 0x33, 0x03, 0x77, 0x6b, 0x9c, 0xb8, 0xb8, 0x90, + 0xb4, 0xe3, 0xa2, 0x32, 0xc9, 0x8f, 0x60, 0x3b, + 0x5b, 0x25, 0xd7, 0x09, 0x9a, 0xa3, 0x92, 0x9c, + 0x26, 0x9c, 0xeb, 0x73, 0x4d, 0x58, 0x5c, 0xe3, + 0x70, 0xb0, 0x59, 0x5d, 0x06, 0xb6, 0x68, 0xcc, + 0x85, 0xc1, 0xa7, 0x88, 0x77, 0x52, 0x39, 0xe3, + 0x6f, 0x31, 0x52, 0x8a, 0x37, 0x3b, 0x9e, 0xb1, + 0xc0, 0xda, 0xb2, 0xea, 0xf4, 0x3d, 0xd1, 0xc8, + 0xfe, 0x89, 0xa2, 0x30, 0x09, 0xe2, 0x20, 0xbb, + 0x94, 0x8e, 0xa2, 0x09, 0x25, 0x44, 0xf6, 0xa5, + 0xde, 0xe2, 0xbc, 0xa4, 0xbf, 0xfd, 0xb5, 0xbc, + 0xdf, 0x69, 0xba, 0x75, 0xee, 0x6b, 0x1a, 0xcb, + 0x8a, 0xb8, 0x86, 0x8e, 0xe1, 0xbb, 0xce, 0xcf, + 0xd3, 0x5a, 0x1e, 0xd4, 0xc1, 0xe0, 0xc5, 0x81, + 0xbf, 0xa4, 0x94, 0x03, 0xd7, 0xfe, 0x1a, 0x0b, + 0xdb, 0x4f, 0x72, 0x39, 0x82, 0x87, 0xd5, 0xf6, + 0xd8, 0xf9, 0xb4, 0xfd, 0xeb, 0xaf, 0x9a, 0xde, + 0x18, 0xe2, 0x73, 0xa2, 0x90, 0x81, 0xc4, 0xd9, + 0x00, 0xee, 0x38, 0x0e, 0xfa, 0xf1, 0x28, 0x27, + 0x69, 0x6d, 0x70, 0x19, 0x56, 0x6a, 0x17, 0x38, + 0xd3, 0x63, 0x4b, 0xa4, 0x6d, 0x7a, 0xd5, 0xda, + 0xa0, 0x2c, 0xac, 0xa6, 0xc9, 0x66, 0xff, 0x00, + 0x07, 0xd5, 0x79, 0x0b, 0xa8, 0xa7, 0x8d, 0xe0, + 0x47, 0x13, 0xdd, 0xc4, 0xc7, 0xb8, 0xee, 0x02, + 0x47, 0x1a, 0x37, 0x8b, 0x90, 0xd3, 0x6a, 0x0b, + 0x57, 0xb3, 0x47, 0xce, 0xed, 0x38, 0xe1, 0x25, + 0x78, 0x1b, 0x70, 0xf1, 0x0d, 0x7f, 0x46, 0x8d, + 0x26, 0x9f, 0x28, 0x95, 0x6b, 0x58, 0x6c, 0xec, + 0xad, 0xac, 0x2d, 0x63, 0xb3, 0xb4, 0x8c, 0x45, + 0x04, 0x23, 0x85, 0x8c, 0x1c, 0x9f, 0xfd, 0x4a, + 0xcc, 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, 0x33, + 0x2d, 0xf5, 0xd0, 0xf3, 0x1e, 0xda, 0x9b, 0x6f, + 0x7a, 0x39, 0x94, 0x26, 0x5b, 0xeb, 0xa1, 0xe6, + 0x3d, 0xb5, 0x36, 0xde, 0xf4, 0x73, 0x2f, 0x3b, + 0x07, 0xcf, 0x63, 0xb4, 0xda, 0xfd, 0x32, 0xe8, + 0xbb, 0xc1, 0xb3, 0xa2, 0xad, 0x6c, 0x37, 0x9e, + 0x8b, 0x37, 0x93, 0x7f, 0x8a, 0x55, 0x4b, 0x42, + 0x6e, 0xbc, 0xfe, 0x57, 0xcf, 0x56, 0xdb, 0xcf, + 0x45, 0x9b, 0xc9, 0xbf, 0xc5, 0x2a, 0xa5, 0xa1, + 0x37, 0x5e, 0x7f, 0x2b, 0xe7, 0xaf, 0x56, 0x9d, + 0x8a, 0xbb, 0xce, 0x1a, 0xf8, 0xd6, 0xbc, 0xe5, + 0xad, 0x11, 0x16, 0x6d, 0x84, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x11, 0xda, 0x8f, 0xd4, + 0x77, 0x9e, 0x4f, 0xe7, 0x35, 0x6b, 0xe8, 0x6f, + 0x53, 0x3b, 0xcb, 0xbf, 0xb4, 0xd5, 0xb1, 0xa8, + 0xfd, 0x47, 0x79, 0xe4, 0xfe, 0x73, 0x56, 0xbe, + 0x86, 0xf5, 0x33, 0xbc, 0xbb, 0xfb, 0x4d, 0x57, + 0x8e, 0x1c, 0xe9, 0x63, 0x3c, 0xc5, 0x3b, 0x93, + 0xad, 0x62, 0x44, 0x45, 0x46, 0xc2, 0x22, 0x20, + 0x22, 0x22, 0x02, 0xd5, 0xc8, 0x7a, 0x15, 0xcf, + 0x92, 0x7f, 0x8a, 0x56, 0xd2, 0xd5, 0xc8, 0x7a, + 0x15, 0xcf, 0x92, 0x7f, 0x8a, 0x54, 0xd3, 0x9e, + 0x15, 0xb9, 0xb1, 0x56, 0x89, 0xd4, 0x82, 0xd2, + 0x7e, 0x8f, 0x71, 0xe1, 0xb7, 0xc5, 0x53, 0xca, + 0x07, 0x49, 0xfa, 0x3d, 0xc7, 0x86, 0xdf, 0x15, + 0x4f, 0x2d, 0x31, 0x1c, 0x5a, 0xb4, 0xfd, 0xcc, + 0x30, 0x3c, 0xb5, 0xbd, 0x13, 0xac, 0x44, 0x45, + 0x93, 0xa4, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, + 0x1f, 0xa8, 0x3d, 0x53, 0x3f, 0xc9, 0xf1, 0x82, + 0x90, 0x51, 0xfa, 0x83, 0xd5, 0x33, 0xfc, 0x9f, + 0x18, 0x2b, 0xdb, 0xdb, 0xa7, 0x4c, 0x32, 0xc4, + 0xf0, 0x2e, 0xee, 0x57, 0xa9, 0xee, 0x95, 0xf5, + 0x43, 0x7c, 0x37, 0xf6, 0xd4, 0xb3, 0xf7, 0x28, + 0x9d, 0x2b, 0xea, 0x86, 0xf8, 0x6f, 0xed, 0xa9, + 0x67, 0xee, 0x53, 0x77, 0x8b, 0x5e, 0xf4, 0xa3, + 0x0d, 0xc0, 0xb7, 0xbb, 0x0e, 0x73, 0x75, 0xfe, + 0x4f, 0x1e, 0x55, 0x9f, 0x62, 0x15, 0xfd, 0x50, + 0x2e, 0xbf, 0xc9, 0xe3, 0xca, 0xb3, 0xec, 0x42, + 0xbf, 0xae, 0x5b, 0x39, 0xeb, 0xdf, 0x97, 0xb1, + 0xf1, 0x4c, 0xd8, 0x3f, 0xe3, 0x5b, 0x11, 0x11, + 0x6c, 0xf3, 0x44, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x41, 0xbc, 0x22, 0x0d, 0xe1, 0x05, 0x03, 0x46, + 0xff, 0x00, 0x7c, 0x5f, 0x73, 0x5c, 0x7d, 0xa0, + 0x5d, 0x21, 0x73, 0x7d, 0x1b, 0xfd, 0xf1, 0x7d, + 0xcd, 0x71, 0xf6, 0x81, 0x74, 0x85, 0x8e, 0x1f, + 0x63, 0xce, 0x97, 0xa7, 0xf1, 0x9e, 0x66, 0x9f, + 0x55, 0x6f, 0x52, 0x2f, 0x37, 0xf5, 0x31, 0xf8, + 0x7f, 0x01, 0x59, 0xad, 0x3d, 0x1a, 0x2f, 0x04, + 0x76, 0x96, 0x1c, 0xdf, 0xd4, 0xc7, 0xe1, 0xfc, + 0x05, 0x66, 0xb4, 0xf4, 0x68, 0xbc, 0x11, 0xda, + 0x5c, 0x56, 0x7f, 0xb3, 0xc4, 0x7a, 0xaa, 0x1c, + 0x75, 0x72, 0xf6, 0xf7, 0xe5, 0x95, 0x11, 0x17, + 0xa6, 0xc0, 0x44, 0x44, 0x05, 0x56, 0xd7, 0xb8, + 0x0b, 0x8c, 0x9d, 0x8c, 0x57, 0xb6, 0x2d, 0x2e, + 0xbe, 0xb0, 0x25, 0xed, 0x6b, 0x7b, 0xe7, 0x30, + 0xd0, 0x90, 0xde, 0xbb, 0x48, 0xe2, 0x0a, 0xd2, + 0x88, 0x2a, 0x98, 0x4f, 0x68, 0x38, 0x8b, 0xab, + 0x76, 0xc7, 0x94, 0x93, 0xcc, 0xaf, 0x58, 0x38, + 0x65, 0xe3, 0x07, 0x81, 0xce, 0x1b, 0x0b, 0x83, + 0x80, 0x34, 0xe6, 0x2b, 0x16, 0xa2, 0xd7, 0xd8, + 0xc8, 0xed, 0x24, 0xb5, 0xc3, 0xc9, 0xe7, 0x97, + 0xd3, 0x83, 0x1c, 0x6e, 0x8c, 0x1e, 0x16, 0x71, + 0x6c, 0xe2, 0xa9, 0x1d, 0xd3, 0xba, 0x80, 0x29, + 0xfb, 0xed, 0x3b, 0x82, 0xc8, 0x48, 0x65, 0xbc, + 0xb1, 0x86, 0x59, 0x0e, 0xf9, 0x38, 0x78, 0x5c, + 0x79, 0xdc, 0xda, 0x12, 0xbd, 0xb0, 0xd3, 0xf8, + 0x4c, 0x6b, 0xfa, 0x4b, 0x2b, 0x28, 0xa1, 0x90, + 0x6e, 0x90, 0x0a, 0xb8, 0x73, 0x39, 0xd5, 0x28, + 0x21, 0xb4, 0x7e, 0x97, 0x7d, 0x86, 0x02, 0xe2, + 0x0b, 0xd6, 0xf0, 0x5c, 0xe4, 0xda, 0xee, 0x99, + 0x87, 0x7b, 0x18, 0x5a, 0x5a, 0xd6, 0x9e, 0xbe, + 0xda, 0x95, 0x13, 0xa3, 0xb3, 0x50, 0xe9, 0xc9, + 0x6e, 0xb4, 0xf6, 0x70, 0xf9, 0xa3, 0xd9, 0x29, + 0x7c, 0x52, 0xbc, 0x1e, 0x03, 0x50, 0x01, 0xdb, + 0xd4, 0x75, 0x2a, 0x0a, 0xbf, 0xad, 0x4c, 0x86, + 0x27, 0x19, 0x92, 0x68, 0x6d, 0xfd, 0xac, 0x77, + 0x21, 0xbd, 0xe9, 0x7b, 0x6a, 0xe1, 0xcc, 0xed, + 0xe1, 0x05, 0x5f, 0x58, 0x6a, 0xdc, 0x74, 0xb8, + 0xc9, 0x31, 0x58, 0xc9, 0x45, 0xed, 0xdd, 0xf0, + 0x11, 0x52, 0x1e, 0xe8, 0x35, 0xa4, 0xed, 0xda, + 0x37, 0x93, 0xb8, 0x05, 0x9e, 0x4c, 0x5c, 0x98, + 0x9f, 0x67, 0x77, 0x16, 0x53, 0x0a, 0x4c, 0xdb, + 0x77, 0xbe, 0x60, 0x39, 0x1e, 0xf7, 0x71, 0x11, + 0xee, 0x56, 0x8a, 0x73, 0x1f, 0xa7, 0xf0, 0x98, + 0xd7, 0xf4, 0x96, 0x36, 0x51, 0x41, 0x26, 0xee, + 0x90, 0x0a, 0xbb, 0xdc, 0x73, 0xaa, 0x42, 0xdc, + 0x9e, 0xde, 0x0b, 0x98, 0x1f, 0x6f, 0x70, 0xc6, + 0xcb, 0x0c, 0x83, 0x85, 0xf1, 0xbc, 0x55, 0xae, + 0x1d, 0x42, 0x10, 0x41, 0x68, 0x1f, 0xed, 0x4b, + 0x3e, 0x79, 0x7e, 0xd1, 0xea, 0x33, 0xda, 0x93, + 0x1d, 0xf8, 0x55, 0x8c, 0x80, 0x55, 0xac, 0xb9, + 0x3c, 0x47, 0xa9, 0x56, 0x1a, 0x76, 0x95, 0xbe, + 0xd6, 0xd2, 0xda, 0xce, 0x06, 0xdb, 0xda, 0x44, + 0xd8, 0x20, 0x65, 0x78, 0x63, 0x60, 0xa3, 0x45, + 0x4d, 0x4d, 0x07, 0x3a, 0x5c, 0xda, 0xdb, 0x5d, + 0xc2, 0xeb, 0x7b, 0xa8, 0x99, 0x3c, 0x2f, 0xef, + 0xa3, 0x90, 0x07, 0x34, 0xfb, 0x85, 0x04, 0x1d, + 0xd5, 0xce, 0x3b, 0x55, 0xe9, 0xdb, 0xcb, 0x3c, + 0x64, 0xed, 0x9a, 0x4e, 0x89, 0xa2, 0x94, 0x2d, + 0xe1, 0x90, 0x0e, 0x36, 0x35, 0xdc, 0x40, 0x6f, + 0x2d, 0xa2, 0x8a, 0xd1, 0x9a, 0xaa, 0xc6, 0xcf, + 0x1e, 0x30, 0xb9, 0x79, 0x05, 0x8d, 0xdd, 0x93, + 0x9c, 0xc6, 0xf4, 0xdd, 0xcb, 0x4b, 0x6a, 0x4f, + 0x0d, 0x79, 0x1c, 0xdd, 0xdb, 0x55, 0xae, 0xc3, + 0x11, 0x8c, 0xc6, 0xf1, 0xfe, 0x1f, 0x6d, 0x1d, + 0xb7, 0x4b, 0x4e, 0x93, 0xa3, 0x14, 0xe2, 0xa6, + 0xea, 0xd5, 0x63, 0xc8, 0x60, 0x70, 0xd9, 0x37, + 0x71, 0xdf, 0x59, 0xc5, 0x3c, 0x9b, 0xba, 0x47, + 0x0a, 0x3a, 0x9e, 0x13, 0x68, 0x50, 0x57, 0xf3, + 0xba, 0xe1, 0xde, 0x73, 0x6d, 0x8f, 0xd3, 0x46, + 0x3b, 0xeb, 0xd9, 0x9f, 0x47, 0xb8, 0x34, 0xbe, + 0x30, 0x3f, 0x44, 0x11, 0x4a, 0xf5, 0xcf, 0x20, + 0x52, 0xba, 0x93, 0x50, 0x0c, 0x06, 0x1f, 0xce, + 0x66, 0x2c, 0x7d, 0xf4, 0x8d, 0x0c, 0x85, 0x8d, + 0xef, 0x5d, 0x2d, 0x3b, 0xa7, 0x53, 0xf4, 0x5b, + 0xbd, 0x6e, 0xe3, 0xf0, 0x98, 0x8c, 0x65, 0x4d, + 0x85, 0xa4, 0x56, 0xee, 0x70, 0xa3, 0x9e, 0xc1, + 0xdd, 0x11, 0xe1, 0x1a, 0x95, 0xf5, 0x77, 0x89, + 0xc6, 0x5f, 0x4a, 0xc9, 0xaf, 0x2d, 0x62, 0xb8, + 0x92, 0x2d, 0x91, 0xbe, 0x46, 0x87, 0x16, 0xed, + 0xae, 0xca, 0xf5, 0xd0, 0x52, 0xf1, 0xfa, 0x12, + 0x4c, 0x86, 0x9f, 0xb8, 0xbb, 0xbf, 0x24, 0xe6, + 0x6f, 0xcf, 0x9c, 0x42, 0xf7, 0xef, 0x67, 0xc6, + 0x6b, 0x5d, 0xe5, 0x2b, 0xdd, 0x7b, 0x9d, 0x45, + 0x2d, 0xa1, 0xf5, 0x14, 0xb7, 0xf6, 0xee, 0xc5, + 0x64, 0x09, 0x6e, 0x4e, 0xc3, 0xb8, 0x70, 0x7f, + 0x7c, 0xf6, 0x34, 0xf0, 0xd4, 0xfe, 0xb3, 0x77, + 0x3b, 0xb2, 0xad, 0x2b, 0x50, 0x62, 0x71, 0x82, + 0xf7, 0xf1, 0x01, 0x6b, 0x10, 0xbd, 0x26, 0xa6, + 0xe4, 0x34, 0x09, 0x2a, 0x47, 0x09, 0xee, 0xb9, + 0x90, 0x6d, 0xa2, 0x22, 0x02, 0xc7, 0x35, 0xbd, + 0xbd, 0xc3, 0x43, 0x2e, 0x22, 0x64, 0xcd, 0x06, + 0xa1, 0xb2, 0x34, 0x3c, 0x03, 0xd5, 0xa3, 0x81, + 0x59, 0x11, 0x06, 0xaf, 0xe1, 0x78, 0xb0, 0x6a, + 0x2c, 0xed, 0xc1, 0xf2, 0x4c, 0xfa, 0x2a, 0x9d, + 0xed, 0x4b, 0xbd, 0xc5, 0x79, 0x49, 0x7f, 0xfb, + 0x6a, 0xf6, 0xb5, 0xaf, 0x71, 0x98, 0xec, 0x87, + 0x07, 0x9f, 0x5b, 0x47, 0x73, 0xd1, 0x12, 0x63, + 0xe9, 0x5a, 0x1d, 0xc2, 0x4d, 0x2b, 0x4a, 0xf3, + 0x20, 0xd8, 0x1d, 0xe8, 0xe6, 0x0a, 0xab, 0xaf, + 0xb4, 0xe9, 0xc9, 0xd8, 0x0c, 0x85, 0xab, 0x7f, + 0xf9, 0xd6, 0x23, 0x8b, 0xb9, 0xef, 0x9f, 0x10, + 0xda, 0x5b, 0xce, 0xdd, 0xe1, 0x5a, 0xd1, 0x05, + 0x7b, 0x45, 0x6a, 0x21, 0x9b, 0xc5, 0x86, 0xcc, + 0xea, 0xdf, 0x5a, 0x80, 0xcb, 0x8e, 0xab, 0x87, + 0xc5, 0x93, 0xe5, 0x72, 0xf5, 0xd5, 0x85, 0x69, + 0xda, 0x61, 0xf1, 0x36, 0x53, 0x3a, 0xe2, 0xce, + 0xce, 0x1b, 0x79, 0x9e, 0x08, 0x74, 0x91, 0xb4, + 0x34, 0x90, 0x4d, 0x48, 0x34, 0x5b, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x23, 0x32, 0xdf, 0x5d, + 0x0f, 0x31, 0xed, 0xa9, 0xb6, 0xf7, 0xa3, 0x99, + 0x42, 0x65, 0xbe, 0xba, 0x1e, 0x63, 0xdb, 0x53, + 0x6d, 0xef, 0x47, 0x32, 0xf3, 0xb0, 0x7c, 0xf6, + 0x3b, 0x4d, 0xaf, 0xd3, 0x2e, 0x8b, 0xbc, 0x1b, + 0x3a, 0x2a, 0xd6, 0xc3, 0x79, 0xe8, 0xb3, 0x79, + 0x37, 0xf8, 0xa5, 0x54, 0xb4, 0x26, 0xeb, 0xcf, + 0xe5, 0x7c, 0xf5, 0x6d, 0xbc, 0xf4, 0x59, 0xbc, + 0x9b, 0xfc, 0x52, 0xaa, 0x5a, 0x13, 0x75, 0xe7, + 0xf2, 0xbe, 0x7a, 0xf5, 0x69, 0xd8, 0xab, 0xbc, + 0xe1, 0xaf, 0x8d, 0x6b, 0xce, 0x5a, 0xd1, 0x11, + 0x66, 0xd8, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x41, 0x1d, 0xa8, 0xfd, 0x47, 0x79, 0xe4, + 0xfe, 0x73, 0x56, 0xbe, 0x86, 0xf5, 0x33, 0xbc, + 0xbb, 0xfb, 0x4d, 0x5b, 0x1a, 0x8f, 0xd4, 0x77, + 0x9e, 0x4f, 0xe7, 0x35, 0x6b, 0xe8, 0x6f, 0x53, + 0x3b, 0xcb, 0xbf, 0xb4, 0xd5, 0x78, 0xe1, 0xce, + 0x96, 0x33, 0xcc, 0x53, 0xb9, 0x3a, 0xd6, 0x24, + 0x44, 0x54, 0x6c, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x2d, 0x5c, 0x87, 0xa1, 0x5c, 0xf9, 0x27, 0xf8, + 0xa5, 0x6d, 0x2d, 0x5c, 0x87, 0xa1, 0x5c, 0xf9, + 0x27, 0xf8, 0xa5, 0x4d, 0x39, 0xe1, 0x5b, 0x9b, + 0x15, 0x68, 0x9d, 0x48, 0x2d, 0x27, 0xe8, 0xf7, + 0x1e, 0x1b, 0x7c, 0x55, 0x3c, 0xa0, 0x74, 0x9f, + 0xa3, 0xdc, 0x78, 0x6d, 0xf1, 0x54, 0xf2, 0xd3, + 0x11, 0xc5, 0xab, 0x4f, 0xdc, 0xc3, 0x03, 0xcb, + 0x5b, 0xd1, 0x3a, 0xc4, 0x44, 0x59, 0x3a, 0x44, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x51, 0xfa, 0x83, + 0xd5, 0x33, 0xfc, 0x9f, 0x18, 0x29, 0x05, 0x1f, + 0xa8, 0x3d, 0x53, 0x3f, 0xc9, 0xf1, 0x82, 0xbd, + 0xbd, 0xba, 0x74, 0xc3, 0x2c, 0x4f, 0x02, 0xee, + 0xe5, 0x7a, 0x9e, 0xe9, 0x5f, 0x54, 0x37, 0xc3, + 0x7f, 0x6d, 0x4b, 0x3f, 0x72, 0x89, 0xd2, 0xbe, + 0xa8, 0x6f, 0x86, 0xfe, 0xda, 0x96, 0x7e, 0xe5, + 0x37, 0x78, 0xb5, 0xef, 0x4a, 0x30, 0xdc, 0x0b, + 0x7b, 0xb0, 0xe7, 0x37, 0x5f, 0xe4, 0xf1, 0xe5, + 0x59, 0xf6, 0x21, 0x5f, 0xd5, 0x02, 0xeb, 0xfc, + 0x9e, 0x3c, 0xab, 0x3e, 0xc4, 0x2b, 0xfa, 0xe5, + 0xb3, 0x9e, 0xbd, 0xf9, 0x7b, 0x1f, 0x14, 0xcd, + 0x83, 0xfe, 0x35, 0xb1, 0x11, 0x16, 0xcf, 0x34, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x1b, 0xc2, + 0x20, 0xde, 0x10, 0x50, 0x34, 0x6f, 0xf7, 0xc5, + 0xf7, 0x35, 0xc7, 0xda, 0x05, 0xd2, 0x17, 0x37, + 0xd1, 0xbf, 0xdf, 0x17, 0xdc, 0xd7, 0x1f, 0x68, + 0x17, 0x48, 0x58, 0xe1, 0xf6, 0x3c, 0xe9, 0x7a, + 0x7f, 0x19, 0xe6, 0x69, 0xf5, 0x56, 0xf5, 0x22, + 0xf3, 0x7f, 0x53, 0x1f, 0x87, 0xf0, 0x15, 0x9a, + 0xd3, 0xd1, 0xa2, 0xf0, 0x47, 0x69, 0x61, 0xcd, + 0xfd, 0x4c, 0x7e, 0x1f, 0xc0, 0x56, 0x6b, 0x4f, + 0x46, 0x8b, 0xc1, 0x1d, 0xa5, 0xc5, 0x67, 0xfb, + 0x3c, 0x47, 0xaa, 0xa1, 0xc7, 0x57, 0x2f, 0x6f, + 0x7e, 0x59, 0x51, 0x11, 0x7a, 0x6c, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x11, 0x99, + 0x6f, 0xae, 0x87, 0x98, 0xf6, 0xd4, 0xdb, 0x7b, + 0xd1, 0xcc, 0xa1, 0x32, 0xdf, 0x5d, 0x0f, 0x31, + 0xed, 0xa9, 0xb6, 0xf7, 0xa3, 0x99, 0x79, 0xd8, + 0x3e, 0x7b, 0x1d, 0xa6, 0xd7, 0xe9, 0x97, 0x45, + 0xde, 0x0d, 0x9d, 0x15, 0x6b, 0x61, 0xbc, 0xf4, + 0x59, 0xbc, 0x9b, 0xfc, 0x52, 0xaa, 0x5a, 0x13, + 0x75, 0xe7, 0xf2, 0xbe, 0x7a, 0xb6, 0xde, 0x7a, + 0x2c, 0xde, 0x4d, 0xfe, 0x29, 0x55, 0x2d, 0x09, + 0xba, 0xf3, 0xf9, 0x5f, 0x3d, 0x7a, 0xb4, 0xec, + 0x55, 0xde, 0x70, 0xd7, 0xc6, 0xb5, 0xe7, 0x2d, + 0x68, 0x88, 0xb3, 0x6c, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x8e, 0xd4, 0x7e, 0xa3, + 0xbc, 0xf2, 0x7f, 0x39, 0xab, 0x5f, 0x43, 0x7a, + 0x99, 0xde, 0x5d, 0xfd, 0xa6, 0xad, 0x8d, 0x47, + 0xea, 0x3b, 0xcf, 0x27, 0xf3, 0x9a, 0xb5, 0xf4, + 0x37, 0xa9, 0x9d, 0xe5, 0xdf, 0xda, 0x6a, 0xbc, + 0x70, 0xe7, 0x4b, 0x19, 0xe6, 0x29, 0xdc, 0x9d, + 0x6b, 0x12, 0x22, 0x2a, 0x36, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x16, 0xae, 0x43, 0xd0, 0xae, 0x7c, + 0x93, 0xfc, 0x52, 0xb6, 0x96, 0xae, 0x43, 0xd0, + 0xae, 0x7c, 0x93, 0xfc, 0x52, 0xa6, 0x9c, 0xf0, + 0xad, 0xcd, 0x8a, 0xb4, 0x4e, 0xa4, 0x16, 0x93, + 0xf4, 0x7b, 0x8f, 0x0d, 0xbe, 0x2a, 0x9e, 0x50, + 0x3a, 0x4f, 0xd1, 0xee, 0x3c, 0x36, 0xf8, 0xaa, + 0x79, 0x69, 0x88, 0xe2, 0xd5, 0xa7, 0xee, 0x61, + 0x81, 0xe5, 0xad, 0xe8, 0x9d, 0x62, 0x22, 0x2c, + 0x9d, 0x22, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x28, + 0xfd, 0x41, 0xea, 0x99, 0xfe, 0x4f, 0x8c, 0x14, + 0x82, 0x8f, 0xd4, 0x1e, 0xa9, 0x9f, 0xe4, 0xf8, + 0xc1, 0x5e, 0xde, 0xdd, 0x3a, 0x61, 0x96, 0x27, + 0x81, 0x77, 0x72, 0xbd, 0x4f, 0x74, 0xaf, 0xaa, + 0x1b, 0xe1, 0xbf, 0xb6, 0xa5, 0x9f, 0xb9, 0x44, + 0xe9, 0x5f, 0x54, 0x37, 0xc3, 0x7f, 0x6d, 0x4b, + 0x3f, 0x72, 0x9b, 0xbc, 0x5a, 0xf7, 0xa5, 0x18, + 0x6e, 0x05, 0xbd, 0xd8, 0x73, 0x9b, 0xaf, 0xf2, + 0x78, 0xf2, 0xac, 0xfb, 0x10, 0xaf, 0xea, 0x81, + 0x75, 0xfe, 0x4f, 0x1e, 0x55, 0x9f, 0x62, 0x15, + 0xfd, 0x72, 0xd9, 0xcf, 0x5e, 0xfc, 0xbd, 0x8f, + 0x8a, 0x66, 0xc1, 0xff, 0x00, 0x1a, 0xd8, 0x88, + 0x8b, 0x67, 0x9a, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x0d, 0xe1, 0x10, 0x6f, 0x08, 0x28, 0x1a, + 0x37, 0xfb, 0xe2, 0xfb, 0x9a, 0xe3, 0xed, 0x02, + 0xe9, 0x0b, 0x9b, 0xe8, 0xdf, 0xef, 0x8b, 0xee, + 0x6b, 0x8f, 0xb4, 0x0b, 0xa4, 0x2c, 0x70, 0xfb, + 0x1e, 0x74, 0xbd, 0x3f, 0x8c, 0xf3, 0x34, 0xfa, + 0xab, 0x7a, 0x91, 0x79, 0xbf, 0xa9, 0x8f, 0xc3, + 0xf8, 0x0a, 0xcd, 0x69, 0xe8, 0xd1, 0x78, 0x23, + 0xb4, 0xb0, 0xe6, 0xfe, 0xa6, 0x3f, 0x0f, 0xe0, + 0x2b, 0x35, 0xa7, 0xa3, 0x45, 0xe0, 0x8e, 0xd2, + 0xe2, 0xb3, 0xfd, 0x9e, 0x23, 0xd5, 0x50, 0xe3, + 0xab, 0x97, 0xb7, 0xbf, 0x2c, 0xa8, 0x88, 0xbd, + 0x36, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x08, 0xcc, 0xb7, 0xd7, 0x43, 0xcc, 0x7b, + 0x6a, 0x6d, 0xbd, 0xe8, 0xe6, 0x50, 0x99, 0x6f, + 0xae, 0x87, 0x98, 0xf6, 0xd4, 0xdb, 0x7b, 0xd1, + 0xcc, 0xbc, 0xec, 0x1f, 0x3d, 0x8e, 0xd3, 0x6b, + 0xf4, 0xcb, 0xa2, 0xef, 0x06, 0xce, 0x8a, 0xb5, + 0xb0, 0xde, 0x7a, 0x2c, 0xde, 0x4d, 0xfe, 0x29, + 0x55, 0x2d, 0x09, 0xba, 0xf3, 0xf9, 0x5f, 0x3d, + 0x5b, 0x6f, 0x3d, 0x16, 0x6f, 0x26, 0xff, 0x00, + 0x14, 0xaa, 0x96, 0x84, 0xdd, 0x79, 0xfc, 0xaf, + 0x9e, 0xbd, 0x5a, 0x76, 0x2a, 0xef, 0x38, 0x6b, + 0xe3, 0x5a, 0xf3, 0x96, 0xb4, 0x44, 0x59, 0xb6, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x47, 0x6a, 0x3f, 0x51, 0xde, 0x79, 0x3f, 0x9c, + 0xd5, 0xaf, 0xa1, 0xbd, 0x4c, 0xef, 0x2e, 0xfe, + 0xd3, 0x56, 0xc6, 0xa3, 0xf5, 0x1d, 0xe7, 0x93, + 0xf9, 0xcd, 0x5a, 0xfa, 0x1b, 0xd4, 0xce, 0xf2, + 0xef, 0xed, 0x35, 0x5e, 0x38, 0x73, 0xa5, 0x8c, + 0xf3, 0x14, 0xee, 0x4e, 0xb5, 0x89, 0x11, 0x15, + 0x1b, 0x08, 0x88, 0x80, 0x88, 0x88, 0x0b, 0x57, + 0x21, 0xe8, 0x57, 0x3e, 0x49, 0xfe, 0x29, 0x5b, + 0x4b, 0x57, 0x21, 0xe8, 0x57, 0x3e, 0x49, 0xfe, + 0x29, 0x53, 0x4e, 0x78, 0x56, 0xe6, 0xc5, 0x5a, + 0x27, 0x52, 0x0b, 0x49, 0xfa, 0x3d, 0xc7, 0x86, + 0xdf, 0x15, 0x4f, 0x28, 0x1d, 0x27, 0xe8, 0xf7, + 0x1e, 0x1b, 0x7c, 0x55, 0x3c, 0xb4, 0xc4, 0x71, + 0x6a, 0xd3, 0xf7, 0x30, 0xc0, 0xf2, 0xd6, 0xf4, + 0x4e, 0xb1, 0x11, 0x16, 0x4e, 0x91, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x14, 0x7e, 0xa0, 0xf5, 0x4c, + 0xff, 0x00, 0x27, 0xc6, 0x0a, 0x41, 0x47, 0xea, + 0x0f, 0x54, 0xcf, 0xf2, 0x7c, 0x60, 0xaf, 0x6f, + 0x6e, 0x9d, 0x30, 0xcb, 0x13, 0xc0, 0xbb, 0xb9, + 0x5e, 0xa7, 0xba, 0x57, 0xd5, 0x0d, 0xf0, 0xdf, + 0xdb, 0x52, 0xcf, 0xdc, 0xa2, 0x74, 0xaf, 0xaa, + 0x1b, 0xe1, 0xbf, 0xb6, 0xa5, 0x9f, 0xb9, 0x4d, + 0xde, 0x2d, 0x7b, 0xd2, 0x8c, 0x37, 0x02, 0xde, + 0xec, 0x39, 0xcd, 0xd7, 0xf9, 0x3c, 0x79, 0x56, + 0x7d, 0x88, 0x57, 0xf5, 0x40, 0xba, 0xff, 0x00, + 0x27, 0x8f, 0x2a, 0xcf, 0xb1, 0x0a, 0xfe, 0xb9, + 0x6c, 0xe7, 0xaf, 0x7e, 0x5e, 0xc7, 0xc5, 0x33, + 0x60, 0xff, 0x00, 0x8d, 0x6c, 0x44, 0x45, 0xb3, + 0xcd, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x06, + 0xf0, 0x88, 0x37, 0x84, 0x14, 0x0d, 0x1b, 0xfd, + 0xf1, 0x7d, 0xcd, 0x71, 0xf6, 0x81, 0x74, 0x85, + 0xcd, 0xf4, 0x6f, 0xf7, 0xc5, 0xf7, 0x35, 0xc7, + 0xda, 0x05, 0xd2, 0x16, 0x38, 0x7d, 0x8f, 0x3a, + 0x5e, 0x9f, 0xc6, 0x79, 0x9a, 0x7d, 0x55, 0xbd, + 0x48, 0xbc, 0xdf, 0xd4, 0xc7, 0xe1, 0xfc, 0x05, + 0x66, 0xb4, 0xf4, 0x68, 0xbc, 0x11, 0xda, 0x58, + 0x73, 0x7f, 0x53, 0x1f, 0x87, 0xf0, 0x15, 0x9a, + 0xd3, 0xd1, 0xa2, 0xf0, 0x47, 0x69, 0x71, 0x59, + 0xfe, 0xcf, 0x11, 0xea, 0xa8, 0x71, 0xd5, 0xcb, + 0xdb, 0xdf, 0x96, 0x54, 0x44, 0x5e, 0x9b, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x04, + 0x66, 0x5b, 0xeb, 0xa1, 0xe6, 0x3d, 0xb5, 0x36, + 0xde, 0xf4, 0x73, 0x28, 0x4c, 0xb7, 0xd7, 0x43, + 0xcc, 0x7b, 0x6a, 0x6d, 0xbd, 0xe8, 0xe6, 0x5e, + 0x76, 0x0f, 0x9e, 0xc7, 0x69, 0xb5, 0xfa, 0x65, + 0xd1, 0x77, 0x83, 0x67, 0x45, 0x5a, 0xd8, 0x6f, + 0x3d, 0x16, 0x6f, 0x26, 0xff, 0x00, 0x14, 0xaa, + 0x96, 0x84, 0xdd, 0x79, 0xfc, 0xaf, 0x9e, 0xad, + 0xb7, 0x9e, 0x8b, 0x37, 0x93, 0x7f, 0x8a, 0x55, + 0x4b, 0x42, 0x6e, 0xbc, 0xfe, 0x57, 0xcf, 0x5e, + 0xad, 0x3b, 0x15, 0x77, 0x9c, 0x35, 0xf1, 0xad, + 0x79, 0xcb, 0x5a, 0x22, 0x2c, 0xdb, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x23, 0xb5, + 0x1f, 0xa8, 0xef, 0x3c, 0x9f, 0xce, 0x6a, 0xd7, + 0xd0, 0xde, 0xa6, 0x77, 0x97, 0x7f, 0x69, 0xab, + 0x63, 0x51, 0xfa, 0x8e, 0xf3, 0xc9, 0xfc, 0xe6, + 0xad, 0x7d, 0x0d, 0xea, 0x67, 0x79, 0x77, 0xf6, + 0x9a, 0xaf, 0x1c, 0x39, 0xd2, 0xc6, 0x79, 0x8a, + 0x77, 0x27, 0x5a, 0xc4, 0x88, 0x8a, 0x8d, 0x84, + 0x44, 0x40, 0x44, 0x44, 0x05, 0xab, 0x90, 0xf4, + 0x2b, 0x9f, 0x24, 0xff, 0x00, 0x14, 0xad, 0xa5, + 0xab, 0x90, 0xf4, 0x2b, 0x9f, 0x24, 0xff, 0x00, + 0x14, 0xa9, 0xa7, 0x3c, 0x2b, 0x73, 0x62, 0xad, + 0x13, 0xa9, 0x05, 0xa4, 0xfd, 0x1e, 0xe3, 0xc3, + 0x6f, 0x8a, 0xa7, 0x94, 0x0e, 0x93, 0xf4, 0x7b, + 0x8f, 0x0d, 0xbe, 0x2a, 0x9e, 0x5a, 0x62, 0x38, + 0xb5, 0x69, 0xfb, 0x98, 0x60, 0x79, 0x6b, 0x7a, + 0x27, 0x58, 0x88, 0x8b, 0x27, 0x48, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x0a, 0x3f, 0x50, 0x7a, 0xa6, + 0x7f, 0x93, 0xe3, 0x05, 0x20, 0xa3, 0xf5, 0x07, + 0xaa, 0x67, 0xf9, 0x3e, 0x30, 0x57, 0xb7, 0xb7, + 0x4e, 0x98, 0x65, 0x89, 0xe0, 0x5d, 0xdc, 0xaf, + 0x53, 0xdd, 0x2b, 0xea, 0x86, 0xf8, 0x6f, 0xed, + 0xa9, 0x67, 0xee, 0x51, 0x3a, 0x57, 0xd5, 0x0d, + 0xf0, 0xdf, 0xdb, 0x52, 0xcf, 0xdc, 0xa6, 0xef, + 0x16, 0xbd, 0xe9, 0x46, 0x1b, 0x81, 0x6f, 0x76, + 0x1c, 0xe6, 0xeb, 0xfc, 0x9e, 0x3c, 0xab, 0x3e, + 0xc4, 0x2b, 0xfa, 0xa0, 0x5d, 0x7f, 0x93, 0xc7, + 0x95, 0x67, 0xd8, 0x85, 0x7f, 0x5c, 0xb6, 0x73, + 0xd7, 0xbf, 0x2f, 0x63, 0xe2, 0x99, 0xb0, 0x7f, + 0xc6, 0xb6, 0x22, 0x22, 0xd9, 0xe6, 0x88, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x83, 0x78, 0x44, 0x1b, + 0xc2, 0x0a, 0x06, 0x8d, 0xfe, 0xf8, 0xbe, 0xe6, + 0xb8, 0xfb, 0x40, 0xba, 0x42, 0xe6, 0xfa, 0x37, + 0xfb, 0xe2, 0xfb, 0x9a, 0xe3, 0xed, 0x02, 0xe9, + 0x0b, 0x1c, 0x3e, 0xc7, 0x9d, 0x2f, 0x4f, 0xe3, + 0x3c, 0xcd, 0x3e, 0xaa, 0xde, 0xa4, 0x5e, 0x6f, + 0xea, 0x63, 0xf0, 0xfe, 0x02, 0xb3, 0x5a, 0x7a, + 0x34, 0x5e, 0x08, 0xed, 0x2c, 0x39, 0xbf, 0xa9, + 0x8f, 0xc3, 0xf8, 0x0a, 0xcd, 0x69, 0xe8, 0xd1, + 0x78, 0x23, 0xb4, 0xb8, 0xac, 0xff, 0x00, 0x67, + 0x88, 0xf5, 0x54, 0x38, 0xea, 0xe5, 0xed, 0xef, + 0xcb, 0x2a, 0x22, 0x2f, 0x4d, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, 0x33, 0x2d, + 0xf5, 0xd0, 0xf3, 0x1e, 0xda, 0x9b, 0x6f, 0x7a, + 0x39, 0x94, 0x26, 0x5b, 0xeb, 0xa1, 0xe6, 0x3d, + 0xb5, 0x36, 0xde, 0xf4, 0x73, 0x2f, 0x3b, 0x07, + 0xcf, 0x63, 0xb4, 0xda, 0xfd, 0x32, 0xe8, 0xbb, + 0xc1, 0xb3, 0xa2, 0xad, 0x6c, 0x37, 0x9e, 0x8b, + 0x37, 0x93, 0x7f, 0x8a, 0x55, 0x4b, 0x42, 0x6e, + 0xbc, 0xfe, 0x57, 0xcf, 0x56, 0xdb, 0xcf, 0x45, + 0x9b, 0xc9, 0xbf, 0xc5, 0x2a, 0xa5, 0xa1, 0x37, + 0x5e, 0x7f, 0x2b, 0xe7, 0xaf, 0x56, 0x9d, 0x8a, + 0xbb, 0xce, 0x1a, 0xf8, 0xd6, 0xbc, 0xe5, 0xad, + 0x11, 0x16, 0x6d, 0x84, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x11, 0xda, 0x8f, 0xd4, 0x77, + 0x9e, 0x4f, 0xe7, 0x35, 0x6b, 0xe8, 0x6f, 0x53, + 0x3b, 0xcb, 0xbf, 0xb4, 0xd5, 0xb1, 0xa8, 0xfd, + 0x47, 0x79, 0xe4, 0xfe, 0x73, 0x56, 0xbe, 0x86, + 0xf5, 0x33, 0xbc, 0xbb, 0xfb, 0x4d, 0x57, 0x8e, + 0x1c, 0xe9, 0x63, 0x3c, 0xc5, 0x3b, 0x93, 0xad, + 0x62, 0x44, 0x45, 0x46, 0xc2, 0x22, 0x20, 0x22, + 0x22, 0x02, 0xd5, 0xc8, 0x7a, 0x15, 0xcf, 0x92, + 0x7f, 0x8a, 0x56, 0xd2, 0xd5, 0xc8, 0x7a, 0x15, + 0xcf, 0x92, 0x7f, 0x8a, 0x54, 0xd3, 0x9e, 0x15, + 0xb9, 0xb1, 0x56, 0x89, 0xd4, 0x82, 0xd2, 0x7e, + 0x8f, 0x71, 0xe1, 0xb7, 0xc5, 0x53, 0xca, 0x07, + 0x49, 0xfa, 0x3d, 0xc7, 0x86, 0xdf, 0x15, 0x4f, + 0x2d, 0x31, 0x1c, 0x5a, 0xb4, 0xfd, 0xcc, 0x30, + 0x3c, 0xb5, 0xbd, 0x13, 0xac, 0x44, 0x45, 0x93, + 0xa4, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, 0x1f, + 0xa8, 0x3d, 0x53, 0x3f, 0xc9, 0xf1, 0x82, 0x90, + 0x51, 0xfa, 0x83, 0xd5, 0x33, 0xfc, 0x9f, 0x18, + 0x2b, 0xdb, 0xdb, 0xa7, 0x4c, 0x32, 0xc4, 0xf0, + 0x2e, 0xee, 0x57, 0xa9, 0xee, 0x95, 0xf5, 0x43, + 0x7c, 0x37, 0xf6, 0xd4, 0xb3, 0xf7, 0x28, 0x9d, + 0x2b, 0xea, 0x86, 0xf8, 0x6f, 0xed, 0xa9, 0x67, + 0xee, 0x53, 0x77, 0x8b, 0x5e, 0xf4, 0xa3, 0x0d, + 0xc0, 0xb7, 0xbb, 0x0e, 0x73, 0x75, 0xfe, 0x4f, + 0x1e, 0x55, 0x9f, 0x62, 0x15, 0xfd, 0x50, 0x2e, + 0xbf, 0xc9, 0xe3, 0xca, 0xb3, 0xec, 0x42, 0xbf, + 0xae, 0x5b, 0x39, 0xeb, 0xdf, 0x97, 0xb1, 0xf1, + 0x4c, 0xd8, 0x3f, 0xe3, 0x5b, 0x11, 0x11, 0x6c, + 0xf3, 0x44, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x41, + 0xbc, 0x22, 0x0d, 0xe1, 0x05, 0x03, 0x46, 0xff, + 0x00, 0x7c, 0x5f, 0x73, 0x5c, 0x7d, 0xa0, 0x5d, + 0x21, 0x73, 0x7d, 0x1b, 0xfd, 0xf1, 0x7d, 0xcd, + 0x71, 0xf6, 0x81, 0x74, 0x85, 0x8e, 0x1f, 0x63, + 0xce, 0x97, 0xa7, 0xf1, 0x9e, 0x66, 0x9f, 0x55, + 0x6f, 0x52, 0x2f, 0x37, 0xf5, 0x31, 0xf8, 0x7f, + 0x01, 0x59, 0xad, 0x3d, 0x1a, 0x2f, 0x04, 0x76, + 0x96, 0x1c, 0xdf, 0xd4, 0xc7, 0xe1, 0xfc, 0x05, + 0x66, 0xb4, 0xf4, 0x68, 0xbc, 0x11, 0xda, 0x5c, + 0x56, 0x7f, 0xb3, 0xc4, 0x7a, 0xaa, 0x1c, 0x75, + 0x72, 0xf6, 0xf7, 0xe5, 0x95, 0x11, 0x17, 0xa6, + 0xc0, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x41, 0x19, 0x96, 0xfa, 0xe8, 0x79, 0x8f, 0x6d, + 0x4d, 0xb7, 0xbd, 0x1c, 0xca, 0x13, 0x2d, 0xf5, + 0xd0, 0xf3, 0x1e, 0xda, 0x9b, 0x6f, 0x7a, 0x39, + 0x97, 0x9d, 0x83, 0xe7, 0xb1, 0xda, 0x6d, 0x7e, + 0x99, 0x74, 0x5d, 0xe0, 0xd9, 0xd1, 0x56, 0xb6, + 0x1b, 0xcf, 0x45, 0x9b, 0xc9, 0xbf, 0xc5, 0x2a, + 0xa5, 0xa1, 0x37, 0x5e, 0x7f, 0x2b, 0xe7, 0xab, + 0x6d, 0xe7, 0xa2, 0xcd, 0xe4, 0xdf, 0xe2, 0x95, + 0x52, 0xd0, 0x9b, 0xaf, 0x3f, 0x95, 0xf3, 0xd7, + 0xab, 0x4e, 0xc5, 0x5d, 0xe7, 0x0d, 0x7c, 0x6b, + 0x5e, 0x72, 0xd6, 0x88, 0x8b, 0x36, 0xc2, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x08, 0xed, + 0x47, 0xea, 0x3b, 0xcf, 0x27, 0xf3, 0x9a, 0xb5, + 0xf4, 0x37, 0xa9, 0x9d, 0xe5, 0xdf, 0xda, 0x6a, + 0xd8, 0xd4, 0x7e, 0xa3, 0xbc, 0xf2, 0x7f, 0x39, + 0xab, 0x5f, 0x43, 0x7a, 0x99, 0xde, 0x5d, 0xfd, + 0xa6, 0xab, 0xc7, 0x0e, 0x74, 0xb1, 0x9e, 0x62, + 0x9d, 0xc9, 0xd6, 0xb1, 0x22, 0x22, 0xa3, 0x61, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x6a, 0xe4, 0x3d, + 0x0a, 0xe7, 0xc9, 0x3f, 0xc5, 0x2b, 0x69, 0x6a, + 0xe4, 0x3d, 0x0a, 0xe7, 0xc9, 0x3f, 0xc5, 0x2a, + 0x69, 0xcf, 0x0a, 0xdc, 0xd8, 0xab, 0x44, 0xea, + 0x41, 0x69, 0x3f, 0x47, 0xb8, 0xf0, 0xdb, 0xe2, + 0xa9, 0xe5, 0x03, 0xa4, 0xfd, 0x1e, 0xe3, 0xc3, + 0x6f, 0x8a, 0xa7, 0x96, 0x98, 0x8e, 0x2d, 0x5a, + 0x7e, 0xe6, 0x18, 0x1e, 0x5a, 0xde, 0x89, 0xd6, + 0x22, 0x22, 0xc9, 0xd2, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x8f, 0xd4, 0x1e, 0xa9, 0x9f, 0xe4, + 0xf8, 0xc1, 0x48, 0x28, 0xfd, 0x41, 0xea, 0x99, + 0xfe, 0x4f, 0x8c, 0x15, 0xed, 0xed, 0xd3, 0xa6, + 0x19, 0x62, 0x78, 0x17, 0x77, 0x2b, 0xd4, 0xf7, + 0x4a, 0xfa, 0xa1, 0xbe, 0x1b, 0xfb, 0x6a, 0x59, + 0xfb, 0x94, 0x4e, 0x95, 0xf5, 0x43, 0x7c, 0x37, + 0xf6, 0xd4, 0xb3, 0xf7, 0x29, 0xbb, 0xc5, 0xaf, + 0x7a, 0x51, 0x86, 0xe0, 0x5b, 0xdd, 0x87, 0x39, + 0xba, 0xff, 0x00, 0x27, 0x8f, 0x2a, 0xcf, 0xb1, + 0x0a, 0xfe, 0xa8, 0x17, 0x5f, 0xe4, 0xf1, 0xe5, + 0x59, 0xf6, 0x21, 0x5f, 0xd7, 0x2d, 0x9c, 0xf5, + 0xef, 0xcb, 0xd8, 0xf8, 0xa6, 0x6c, 0x1f, 0xf1, + 0xad, 0x88, 0x88, 0xb6, 0x79, 0xa2, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x20, 0xde, 0x11, 0x06, 0xf0, + 0x82, 0x81, 0xa3, 0x7f, 0xbe, 0x2f, 0xb9, 0xae, + 0x3e, 0xd0, 0x2e, 0x90, 0xb9, 0xbe, 0x8d, 0xfe, + 0xf8, 0xbe, 0xe6, 0xb8, 0xfb, 0x40, 0xba, 0x42, + 0xc7, 0x0f, 0xb1, 0xe7, 0x4b, 0xd3, 0xf8, 0xcf, + 0x33, 0x4f, 0xaa, 0xb7, 0xa9, 0x17, 0x9b, 0xfa, + 0x98, 0xfc, 0x3f, 0x80, 0xac, 0xd6, 0x9e, 0x8d, + 0x17, 0x82, 0x3b, 0x4b, 0x0e, 0x6f, 0xea, 0x63, + 0xf0, 0xfe, 0x02, 0xb3, 0x5a, 0x7a, 0x34, 0x5e, + 0x08, 0xed, 0x2e, 0x2b, 0x3f, 0xd9, 0xe2, 0x3d, + 0x55, 0x0e, 0x3a, 0xb9, 0x7b, 0x7b, 0xf2, 0xca, + 0x88, 0x8b, 0xd3, 0x60, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x8c, 0xcb, 0x7d, 0x74, + 0x3c, 0xc7, 0xb6, 0xa6, 0xdb, 0xde, 0x8e, 0x65, + 0x09, 0x96, 0xfa, 0xe8, 0x79, 0x8f, 0x6d, 0x4d, + 0xb7, 0xbd, 0x1c, 0xcb, 0xce, 0xc1, 0xf3, 0xd8, + 0xed, 0x36, 0xbf, 0x4c, 0xba, 0x2e, 0xf0, 0x6c, + 0xe8, 0xab, 0x5b, 0x0d, 0xe7, 0xa2, 0xcd, 0xe4, + 0xdf, 0xe2, 0x95, 0x52, 0xd0, 0x9b, 0xaf, 0x3f, + 0x95, 0xf3, 0xd5, 0xb6, 0xf3, 0xd1, 0x66, 0xf2, + 0x6f, 0xf1, 0x4a, 0xa9, 0x68, 0x4d, 0xd7, 0x9f, + 0xca, 0xf9, 0xeb, 0xd5, 0xa7, 0x62, 0xae, 0xf3, + 0x86, 0xbe, 0x35, 0xaf, 0x39, 0x6b, 0x44, 0x45, + 0x9b, 0x61, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x04, 0x76, 0xa3, 0xf5, 0x1d, 0xe7, 0x93, + 0xf9, 0xcd, 0x5a, 0xfa, 0x1b, 0xd4, 0xce, 0xf2, + 0xef, 0xed, 0x35, 0x6c, 0x6a, 0x3f, 0x51, 0xde, + 0x79, 0x3f, 0x9c, 0xd5, 0xaf, 0xa1, 0xbd, 0x4c, + 0xef, 0x2e, 0xfe, 0xd3, 0x55, 0xe3, 0x87, 0x3a, + 0x58, 0xcf, 0x31, 0x4e, 0xe4, 0xeb, 0x58, 0x91, + 0x11, 0x51, 0xb0, 0x88, 0x88, 0x08, 0x88, 0x80, + 0xb5, 0x72, 0x1e, 0x85, 0x73, 0xe4, 0x9f, 0xe2, + 0x95, 0xb4, 0xb5, 0x72, 0x1e, 0x85, 0x73, 0xe4, + 0x9f, 0xe2, 0x95, 0x34, 0xe7, 0x85, 0x6e, 0x6c, + 0x55, 0xa2, 0x75, 0x20, 0xb4, 0x9f, 0xa3, 0xdc, + 0x78, 0x6d, 0xf1, 0x54, 0xf2, 0x81, 0xd2, 0x7e, + 0x8f, 0x71, 0xe1, 0xb7, 0xc5, 0x53, 0xcb, 0x4c, + 0x47, 0x16, 0xad, 0x3f, 0x73, 0x0c, 0x0f, 0x2d, + 0x6f, 0x44, 0xeb, 0x11, 0x11, 0x64, 0xe9, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x47, 0xea, 0x0f, + 0x54, 0xcf, 0xf2, 0x7c, 0x60, 0xa4, 0x14, 0x7e, + 0xa0, 0xf5, 0x4c, 0xff, 0x00, 0x27, 0xc6, 0x0a, + 0xf6, 0xf6, 0xe9, 0xd3, 0x0c, 0xb1, 0x3c, 0x0b, + 0xbb, 0x95, 0xea, 0x7b, 0xa5, 0x7d, 0x50, 0xdf, + 0x0d, 0xfd, 0xb5, 0x2c, 0xfd, 0xca, 0x27, 0x4a, + 0xfa, 0xa1, 0xbe, 0x1b, 0xfb, 0x6a, 0x59, 0xfb, + 0x94, 0xdd, 0xe2, 0xd7, 0xbd, 0x28, 0xc3, 0x70, + 0x2d, 0xee, 0xc3, 0x9c, 0xdd, 0x7f, 0x93, 0xc7, + 0x95, 0x67, 0xd8, 0x85, 0x7f, 0x54, 0x0b, 0xaf, + 0xf2, 0x78, 0xf2, 0xac, 0xfb, 0x10, 0xaf, 0xeb, + 0x96, 0xce, 0x7a, 0xf7, 0xe5, 0xec, 0x7c, 0x53, + 0x36, 0x0f, 0xf8, 0xd6, 0xc4, 0x44, 0x5b, 0x3c, + 0xd1, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x10, 0x6f, + 0x08, 0x83, 0x78, 0x41, 0x40, 0xd1, 0xbf, 0xdf, + 0x17, 0xdc, 0xd7, 0x1f, 0x68, 0x17, 0x48, 0x5c, + 0xdf, 0x46, 0xff, 0x00, 0x7c, 0x5f, 0x73, 0x5c, + 0x7d, 0xa0, 0x5d, 0x21, 0x63, 0x87, 0xd8, 0xf3, + 0xa5, 0xe9, 0xfc, 0x67, 0x99, 0xa7, 0xd5, 0x5b, + 0xd4, 0x8b, 0xcd, 0xfd, 0x4c, 0x7e, 0x1f, 0xc0, + 0x56, 0x6b, 0x4f, 0x46, 0x8b, 0xc1, 0x1d, 0xa5, + 0x87, 0x37, 0xf5, 0x31, 0xf8, 0x7f, 0x01, 0x59, + 0xad, 0x3d, 0x1a, 0x2f, 0x04, 0x76, 0x97, 0x15, + 0x9f, 0xec, 0xf1, 0x1e, 0xaa, 0x87, 0x1d, 0x5c, + 0xbd, 0xbd, 0xf9, 0x65, 0x44, 0x45, 0xe9, 0xb0, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x46, 0x65, 0xbe, 0xba, 0x1e, 0x63, 0xdb, 0x53, + 0x6d, 0xef, 0x47, 0x32, 0x84, 0xcb, 0x7d, 0x74, + 0x3c, 0xc7, 0xb6, 0xa6, 0xdb, 0xde, 0x8e, 0x65, + 0xe7, 0x60, 0xf9, 0xec, 0x76, 0x9b, 0x5f, 0xa6, + 0x5d, 0x17, 0x78, 0x36, 0x74, 0x55, 0xad, 0x86, + 0xf3, 0xd1, 0x66, 0xf2, 0x6f, 0xf1, 0x4a, 0xa9, + 0x68, 0x4d, 0xd7, 0x9f, 0xca, 0xf9, 0xea, 0xdb, + 0x79, 0xe8, 0xb3, 0x79, 0x37, 0xf8, 0xa5, 0x54, + 0xb4, 0x26, 0xeb, 0xcf, 0xe5, 0x7c, 0xf5, 0xea, + 0xd3, 0xb1, 0x57, 0x79, 0xc3, 0x5f, 0x1a, 0xd7, + 0x9c, 0xb5, 0xa2, 0x22, 0xcd, 0xb0, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x82, 0x3b, 0x51, + 0xfa, 0x8e, 0xf3, 0xc9, 0xfc, 0xe6, 0xad, 0x7d, + 0x0d, 0xea, 0x67, 0x79, 0x77, 0xf6, 0x9a, 0xb6, + 0x35, 0x1f, 0xa8, 0xef, 0x3c, 0x9f, 0xce, 0x6a, + 0xd7, 0xd0, 0xde, 0xa6, 0x77, 0x97, 0x7f, 0x69, + 0xaa, 0xf1, 0xc3, 0x9d, 0x2c, 0x67, 0x98, 0xa7, + 0x72, 0x75, 0xac, 0x48, 0x88, 0xa8, 0xd8, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x5a, 0xb9, 0x0f, 0x42, + 0xb9, 0xf2, 0x4f, 0xf1, 0x4a, 0xda, 0x5a, 0xb9, + 0x0f, 0x42, 0xb9, 0xf2, 0x4f, 0xf1, 0x4a, 0x9a, + 0x73, 0xc2, 0xb7, 0x36, 0x2a, 0xd1, 0x3a, 0x90, + 0x5a, 0x4f, 0xd1, 0xee, 0x3c, 0x36, 0xf8, 0xaa, + 0x79, 0x40, 0xe9, 0x3f, 0x47, 0xb8, 0xf0, 0xdb, + 0xe2, 0xa9, 0xe5, 0xa6, 0x23, 0x8b, 0x56, 0x9f, + 0xb9, 0x86, 0x07, 0x96, 0xb7, 0xa2, 0x75, 0x88, + 0x88, 0xb2, 0x74, 0x88, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0xa3, 0xf5, 0x07, 0xaa, 0x67, 0xf9, 0x3e, + 0x30, 0x52, 0x0a, 0x3f, 0x50, 0x7a, 0xa6, 0x7f, + 0x93, 0xe3, 0x05, 0x7b, 0x7b, 0x74, 0xe9, 0x86, + 0x58, 0x9e, 0x05, 0xdd, 0xca, 0xf5, 0x3d, 0xd2, + 0xbe, 0xa8, 0x6f, 0x86, 0xfe, 0xda, 0x96, 0x7e, + 0xe5, 0x13, 0xa5, 0x7d, 0x50, 0xdf, 0x0d, 0xfd, + 0xb5, 0x2c, 0xfd, 0xca, 0x6e, 0xf1, 0x6b, 0xde, + 0x94, 0x61, 0xb8, 0x16, 0xf7, 0x61, 0xce, 0x6e, + 0xbf, 0xc9, 0xe3, 0xca, 0xb3, 0xec, 0x42, 0xbf, + 0xaa, 0x05, 0xd7, 0xf9, 0x3c, 0x79, 0x56, 0x7d, + 0x88, 0x57, 0xf5, 0xcb, 0x67, 0x3d, 0x7b, 0xf2, + 0xf6, 0x3e, 0x29, 0x9b, 0x07, 0xfc, 0x6b, 0x62, + 0x22, 0x2d, 0x9e, 0x68, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x37, 0x84, 0x41, 0xbc, 0x20, 0xa0, + 0x68, 0xdf, 0xef, 0x8b, 0xee, 0x6b, 0x8f, 0xb4, + 0x0b, 0xa4, 0x2e, 0x6f, 0xa3, 0x7f, 0xbe, 0x2f, + 0xb9, 0xae, 0x3e, 0xd0, 0x2e, 0x90, 0xb1, 0xc3, + 0xec, 0x79, 0xd2, 0xf4, 0xfe, 0x33, 0xcc, 0xd3, + 0xea, 0xad, 0xea, 0x45, 0xe6, 0xfe, 0xa6, 0x3f, + 0x0f, 0xe0, 0x2b, 0x35, 0xa7, 0xa3, 0x45, 0xe0, + 0x8e, 0xd2, 0xc3, 0x9b, 0xfa, 0x98, 0xfc, 0x3f, + 0x80, 0xac, 0xd6, 0x9e, 0x8d, 0x17, 0x82, 0x3b, + 0x4b, 0x8a, 0xcf, 0xf6, 0x78, 0x8f, 0x55, 0x43, + 0x8e, 0xae, 0x5e, 0xde, 0xfc, 0xb2, 0xa2, 0x22, + 0xf4, 0xd8, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x23, 0x32, 0xdf, 0x5d, 0x0f, 0x31, + 0xed, 0xa9, 0xb6, 0xf7, 0xa3, 0x99, 0x42, 0x65, + 0xbe, 0xba, 0x1e, 0x63, 0xdb, 0x53, 0x6d, 0xef, + 0x47, 0x32, 0xf3, 0xb0, 0x7c, 0xf6, 0x3b, 0x4d, + 0xaf, 0xd3, 0x2e, 0x8b, 0xbc, 0x1b, 0x3a, 0x2a, + 0xd6, 0xc3, 0x79, 0xe8, 0xb3, 0x79, 0x37, 0xf8, + 0xa5, 0x54, 0xb4, 0x26, 0xeb, 0xcf, 0xe5, 0x7c, + 0xf5, 0x6d, 0xbc, 0xf4, 0x59, 0xbc, 0x9b, 0xfc, + 0x52, 0xaa, 0x5a, 0x13, 0x75, 0xe7, 0xf2, 0xbe, + 0x7a, 0xf5, 0x69, 0xd8, 0xab, 0xbc, 0xe1, 0xaf, + 0x8d, 0x6b, 0xce, 0x5a, 0xd1, 0x11, 0x66, 0xd8, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x41, + 0x1d, 0xa8, 0xfd, 0x47, 0x79, 0xe4, 0xfe, 0x73, + 0x56, 0xbe, 0x86, 0xf5, 0x33, 0xbc, 0xbb, 0xfb, + 0x4d, 0x5b, 0x1a, 0x8f, 0xd4, 0x77, 0x9e, 0x4f, + 0xe7, 0x35, 0x6b, 0xe8, 0x6f, 0x53, 0x3b, 0xcb, + 0xbf, 0xb4, 0xd5, 0x78, 0xe1, 0xce, 0x96, 0x33, + 0xcc, 0x53, 0xb9, 0x3a, 0xd6, 0x24, 0x44, 0x54, + 0x6c, 0x22, 0x22, 0x02, 0x22, 0x20, 0x2d, 0x5c, + 0x87, 0xa1, 0x5c, 0xf9, 0x27, 0xf8, 0xa5, 0x6d, + 0x2d, 0x5c, 0x87, 0xa1, 0x5c, 0xf9, 0x27, 0xf8, + 0xa5, 0x4d, 0x39, 0xe1, 0x5b, 0x9b, 0x15, 0x68, + 0x9d, 0x48, 0x2d, 0x27, 0xe8, 0xf7, 0x1e, 0x1b, + 0x7c, 0x55, 0x3c, 0xa0, 0x74, 0x9f, 0xa3, 0xdc, + 0x78, 0x6d, 0xf1, 0x54, 0xf2, 0xd3, 0x11, 0xc5, + 0xab, 0x4f, 0xdc, 0xc3, 0x03, 0xcb, 0x5b, 0xd1, + 0x3a, 0xc4, 0x44, 0x59, 0x3a, 0x44, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x51, 0xfa, 0x83, 0xd5, 0x33, + 0xfc, 0x9f, 0x18, 0x29, 0x05, 0x1f, 0xa8, 0x3d, + 0x53, 0x3f, 0xc9, 0xf1, 0x82, 0xbd, 0xbd, 0xba, + 0x74, 0xc3, 0x2c, 0x4f, 0x02, 0xee, 0xe5, 0x7a, + 0x9e, 0xe9, 0x5f, 0x54, 0x37, 0xc3, 0x7f, 0x6d, + 0x4b, 0x3f, 0x72, 0x89, 0xd2, 0xbe, 0xa8, 0x6f, + 0x86, 0xfe, 0xda, 0x96, 0x7e, 0xe5, 0x37, 0x78, + 0xb5, 0xef, 0x4a, 0x30, 0xdc, 0x0b, 0x7b, 0xb0, + 0xe7, 0x37, 0x5f, 0xe4, 0xf1, 0xe5, 0x59, 0xf6, + 0x21, 0x5f, 0xd5, 0x02, 0xeb, 0xfc, 0x9e, 0x3c, + 0xab, 0x3e, 0xc4, 0x2b, 0xfa, 0xe5, 0xb3, 0x9e, + 0xbd, 0xf9, 0x7b, 0x1f, 0x14, 0xcd, 0x83, 0xfe, + 0x35, 0xb1, 0x11, 0x16, 0xcf, 0x34, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x1b, 0xc2, 0x20, 0xde, + 0x10, 0x50, 0x34, 0x6f, 0xf7, 0xc5, 0xf7, 0x35, + 0xc7, 0xda, 0x05, 0xd2, 0x17, 0x37, 0xd1, 0xbf, + 0xdf, 0x17, 0xdc, 0xd7, 0x1f, 0x68, 0x17, 0x48, + 0x58, 0xe1, 0xf6, 0x3c, 0xe9, 0x7a, 0x7f, 0x19, + 0xe6, 0x69, 0xf5, 0x56, 0xf5, 0x22, 0xf3, 0x7f, + 0x53, 0x1f, 0x87, 0xf0, 0x15, 0x9a, 0xd3, 0xd1, + 0xa2, 0xf0, 0x47, 0x69, 0x61, 0xcd, 0xfd, 0x4c, + 0x7e, 0x1f, 0xc0, 0x56, 0x6b, 0x4f, 0x46, 0x8b, + 0xc1, 0x1d, 0xa5, 0xc5, 0x67, 0xfb, 0x3c, 0x47, + 0xaa, 0xa1, 0xc7, 0x57, 0x2f, 0x6f, 0x7e, 0x59, + 0x51, 0x11, 0x7a, 0x6c, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x11, 0x99, 0x6f, 0xae, + 0x87, 0x98, 0xf6, 0xd4, 0xdb, 0x7b, 0xd1, 0xcc, + 0xa1, 0x32, 0xdf, 0x5d, 0x0f, 0x31, 0xed, 0xa9, + 0xb6, 0xf7, 0xa3, 0x99, 0x79, 0xd8, 0x3e, 0x7b, + 0x1d, 0xa6, 0xd7, 0xe9, 0x97, 0x45, 0xde, 0x0d, + 0x9d, 0x15, 0x6b, 0x61, 0xbc, 0xf4, 0x59, 0xbc, + 0x9b, 0xfc, 0x52, 0xaa, 0x5a, 0x13, 0x75, 0xe7, + 0xf2, 0xbe, 0x7a, 0xb6, 0xde, 0x7a, 0x2c, 0xde, + 0x4d, 0xfe, 0x29, 0x55, 0x2d, 0x09, 0xba, 0xf3, + 0xf9, 0x5f, 0x3d, 0x7a, 0xb4, 0xec, 0x55, 0xde, + 0x70, 0xd7, 0xc6, 0xb5, 0xe7, 0x2d, 0x68, 0x88, + 0xb3, 0x6c, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x8e, 0xd4, 0x7e, 0xa3, 0xbc, 0xf2, + 0x7f, 0x39, 0xab, 0x5f, 0x43, 0x7a, 0x99, 0xde, + 0x5d, 0xfd, 0xa6, 0xad, 0x8d, 0x47, 0xea, 0x3b, + 0xcf, 0x27, 0xf3, 0x9a, 0xb5, 0xf4, 0x37, 0xa9, + 0x9d, 0xe5, 0xdf, 0xda, 0x6a, 0xbc, 0x70, 0xe7, + 0x4b, 0x19, 0xe6, 0x29, 0xdc, 0x9d, 0x6b, 0x12, + 0x22, 0x2a, 0x36, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x16, 0xae, 0x43, 0xd0, 0xae, 0x7c, 0x93, 0xfc, + 0x52, 0xb6, 0x96, 0xae, 0x43, 0xd0, 0xae, 0x7c, + 0x93, 0xfc, 0x52, 0xa6, 0x9c, 0xf0, 0xad, 0xcd, + 0x8a, 0xb4, 0x4e, 0xa4, 0x16, 0x93, 0xf4, 0x7b, + 0x8f, 0x0d, 0xbe, 0x2a, 0x9e, 0x50, 0x3a, 0x4f, + 0xd1, 0xee, 0x3c, 0x36, 0xf8, 0xaa, 0x79, 0x69, + 0x88, 0xe2, 0xd5, 0xa7, 0xee, 0x61, 0x81, 0xe5, + 0xad, 0xe8, 0x9d, 0x62, 0x22, 0x2c, 0x9d, 0x22, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x28, 0xfd, 0x41, + 0xea, 0x99, 0xfe, 0x4f, 0x8c, 0x14, 0x82, 0x8f, + 0xd4, 0x1e, 0xa9, 0x9f, 0xe4, 0xf8, 0xc1, 0x5e, + 0xde, 0xdd, 0x3a, 0x61, 0x96, 0x27, 0x81, 0x77, + 0x72, 0xbd, 0x4f, 0x74, 0xaf, 0xaa, 0x1b, 0xe1, + 0xbf, 0xb6, 0xa5, 0x9f, 0xb9, 0x44, 0xe9, 0x5f, + 0x54, 0x37, 0xc3, 0x7f, 0x6d, 0x4b, 0x3f, 0x72, + 0x9b, 0xbc, 0x5a, 0xf7, 0xa5, 0x18, 0x6e, 0x05, + 0xbd, 0xd8, 0x73, 0x9b, 0xaf, 0xf2, 0x78, 0xf2, + 0xac, 0xfb, 0x10, 0xaf, 0xea, 0x81, 0x75, 0xfe, + 0x4f, 0x1e, 0x55, 0x9f, 0x62, 0x15, 0xfd, 0x72, + 0xd9, 0xcf, 0x5e, 0xfc, 0xbd, 0x8f, 0x8a, 0x66, + 0xc1, 0xff, 0x00, 0x1a, 0xd8, 0x88, 0x8b, 0x67, + 0x9a, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x0d, + 0xe1, 0x10, 0x6f, 0x08, 0x28, 0x1a, 0x37, 0xfb, + 0xe2, 0xfb, 0x9a, 0xe3, 0xed, 0x02, 0xe9, 0x0b, + 0x9b, 0xe8, 0xdf, 0xef, 0x8b, 0xee, 0x6b, 0x8f, + 0xb4, 0x0b, 0xa4, 0x2c, 0x70, 0xfb, 0x1e, 0x74, + 0xbd, 0x3f, 0x8c, 0xf3, 0x34, 0xfa, 0xab, 0x7a, + 0x91, 0x79, 0xbf, 0xa9, 0x8f, 0xc3, 0xf8, 0x0a, + 0xcd, 0x69, 0xe8, 0xd1, 0x78, 0x23, 0xb4, 0xb0, + 0xe6, 0xfe, 0xa6, 0x3f, 0x0f, 0xe0, 0x2b, 0x35, + 0xa7, 0xa3, 0x45, 0xe0, 0x8e, 0xd2, 0xe2, 0xb3, + 0xfd, 0x9e, 0x23, 0xd5, 0x50, 0xe3, 0xab, 0x97, + 0xb7, 0xbf, 0x2c, 0xa8, 0x88, 0xbd, 0x36, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x08, + 0xcc, 0xb7, 0xd7, 0x43, 0xcc, 0x7b, 0x6a, 0x6d, + 0xbd, 0xe8, 0xe6, 0x50, 0x99, 0x6f, 0xae, 0x87, + 0x98, 0xf6, 0xd4, 0xdb, 0x7b, 0xd1, 0xcc, 0xbc, + 0xec, 0x1f, 0x3d, 0x8e, 0xd3, 0x6b, 0xf4, 0xcb, + 0xa2, 0xef, 0x06, 0xce, 0x8a, 0xb5, 0xb0, 0xde, + 0x7a, 0x2c, 0xde, 0x4d, 0xfe, 0x29, 0x55, 0x2d, + 0x09, 0xba, 0xf3, 0xf9, 0x5f, 0x3d, 0x5b, 0x6f, + 0x3d, 0x16, 0x6f, 0x26, 0xff, 0x00, 0x14, 0xaa, + 0x96, 0x84, 0xdd, 0x79, 0xfc, 0xaf, 0x9e, 0xbd, + 0x5a, 0x76, 0x2a, 0xef, 0x38, 0x6b, 0xe3, 0x5a, + 0xf3, 0x96, 0xb4, 0x44, 0x59, 0xb6, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x47, 0x6a, + 0x3f, 0x51, 0xde, 0x79, 0x3f, 0x9c, 0xd5, 0xaf, + 0xa1, 0xbd, 0x4c, 0xef, 0x2e, 0xfe, 0xd3, 0x56, + 0xc6, 0xa3, 0xf5, 0x1d, 0xe7, 0x93, 0xf9, 0xcd, + 0x5a, 0xfa, 0x1b, 0xd4, 0xce, 0xf2, 0xef, 0xed, + 0x35, 0x5e, 0x38, 0x73, 0xa5, 0x8c, 0xf3, 0x14, + 0xee, 0x4e, 0xb5, 0x89, 0x11, 0x15, 0x1b, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x0b, 0x57, 0x21, 0xe8, + 0x57, 0x3e, 0x49, 0xfe, 0x29, 0x5b, 0x4b, 0x57, + 0x21, 0xe8, 0x57, 0x3e, 0x49, 0xfe, 0x29, 0x53, + 0x4e, 0x78, 0x56, 0xe6, 0xc5, 0x5a, 0x27, 0x52, + 0x0b, 0x49, 0xfa, 0x3d, 0xc7, 0x86, 0xdf, 0x15, + 0x4f, 0x28, 0x1d, 0x27, 0xe8, 0xf7, 0x1e, 0x1b, + 0x7c, 0x55, 0x3c, 0xb4, 0xc4, 0x71, 0x6a, 0xd3, + 0xf7, 0x30, 0xc0, 0xf2, 0xd6, 0xf4, 0x4e, 0xb1, + 0x11, 0x16, 0x4e, 0x91, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x14, 0x7e, 0xa0, 0xf5, 0x4c, 0xff, 0x00, + 0x27, 0xc6, 0x0a, 0x41, 0x47, 0xea, 0x0f, 0x54, + 0xcf, 0xf2, 0x7c, 0x60, 0xaf, 0x6f, 0x6e, 0x9d, + 0x30, 0xcb, 0x13, 0xc0, 0xbb, 0xb9, 0x5e, 0xa7, + 0xba, 0x57, 0xd5, 0x0d, 0xf0, 0xdf, 0xdb, 0x52, + 0xcf, 0xdc, 0xa2, 0x74, 0xaf, 0xaa, 0x1b, 0xe1, + 0xbf, 0xb6, 0xa5, 0x9f, 0xb9, 0x4d, 0xde, 0x2d, + 0x7b, 0xd2, 0x8c, 0x37, 0x02, 0xde, 0xec, 0x39, + 0xcd, 0xd7, 0xf9, 0x3c, 0x79, 0x56, 0x7d, 0x88, + 0x57, 0xf5, 0x40, 0xba, 0xff, 0x00, 0x27, 0x8f, + 0x2a, 0xcf, 0xb1, 0x0a, 0xfe, 0xb9, 0x6c, 0xe7, + 0xaf, 0x7e, 0x5e, 0xc7, 0xc5, 0x33, 0x60, 0xff, + 0x00, 0x8d, 0x6c, 0x44, 0x45, 0xb3, 0xcd, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x06, 0xf0, 0x88, + 0x37, 0x84, 0x14, 0x0d, 0x1b, 0xfd, 0xf1, 0x7d, + 0xcd, 0x71, 0xf6, 0x81, 0x74, 0x85, 0xcd, 0xf4, + 0x6f, 0xf7, 0xc5, 0xf7, 0x35, 0xc7, 0xda, 0x05, + 0xd2, 0x16, 0x38, 0x7d, 0x8f, 0x3a, 0x5e, 0x9f, + 0xc6, 0x79, 0x9a, 0x7d, 0x55, 0xbd, 0x48, 0xbc, + 0xdf, 0xd4, 0xc7, 0xe1, 0xfc, 0x05, 0x66, 0xb4, + 0xf4, 0x68, 0xbc, 0x11, 0xda, 0x58, 0x73, 0x7f, + 0x53, 0x1f, 0x87, 0xf0, 0x15, 0x9a, 0xd3, 0xd1, + 0xa2, 0xf0, 0x47, 0x69, 0x71, 0x59, 0xfe, 0xcf, + 0x11, 0xea, 0xa8, 0x71, 0xd5, 0xcb, 0xdb, 0xdf, + 0x96, 0x54, 0x44, 0x5e, 0x9b, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x04, 0x66, 0x5b, + 0xeb, 0xa1, 0xe6, 0x3d, 0xb5, 0x36, 0xde, 0xf4, + 0x73, 0x28, 0x4c, 0xb7, 0xd7, 0x43, 0xcc, 0x7b, + 0x6a, 0x6d, 0xbd, 0xe8, 0xe6, 0x5e, 0x76, 0x0f, + 0x9e, 0xc7, 0x69, 0xb5, 0xfa, 0x65, 0xd1, 0x77, + 0x83, 0x67, 0x45, 0x5a, 0xd8, 0x6f, 0x3d, 0x16, + 0x6f, 0x26, 0xff, 0x00, 0x14, 0xaa, 0x96, 0x84, + 0xdd, 0x79, 0xfc, 0xaf, 0x9e, 0xad, 0xb7, 0x9e, + 0x8b, 0x37, 0x93, 0x7f, 0x8a, 0x55, 0x4b, 0x42, + 0x6e, 0xbc, 0xfe, 0x57, 0xcf, 0x5e, 0xad, 0x3b, + 0x15, 0x77, 0x9c, 0x35, 0xf1, 0xad, 0x79, 0xcb, + 0x5a, 0x22, 0x2c, 0xdb, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x23, 0xb5, 0x1f, 0xa8, + 0xef, 0x3c, 0x9f, 0xce, 0x6a, 0xd7, 0xd0, 0xde, + 0xa6, 0x77, 0x97, 0x7f, 0x69, 0xab, 0x63, 0x51, + 0xfa, 0x8e, 0xf3, 0xc9, 0xfc, 0xe6, 0xad, 0x7d, + 0x0d, 0xea, 0x67, 0x79, 0x77, 0xf6, 0x9a, 0xaf, + 0x1c, 0x39, 0xd2, 0xc6, 0x79, 0x8a, 0x77, 0x27, + 0x5a, 0xc4, 0x88, 0x8a, 0x8d, 0x84, 0x44, 0x40, + 0x44, 0x44, 0x05, 0xab, 0x91, 0xa7, 0x98, 0xdc, + 0xf9, 0x27, 0xf8, 0xa5, 0x11, 0x4d, 0x39, 0xe3, + 0x4a, 0xb5, 0xec, 0x55, 0xa2, 0x55, 0x3c, 0x35, + 0xfd, 0xed, 0xa4, 0x72, 0x36, 0xda, 0xd5, 0xd7, + 0x21, 0xe4, 0x17, 0x10, 0x1c, 0x68, 0x40, 0xdd, + 0xdc, 0x82, 0xa4, 0x7f, 0x1a, 0xcb, 0xff, 0x00, + 0x4d, 0x7f, 0xec, 0xc9, 0xf4, 0x51, 0x17, 0x75, + 0x7e, 0xcf, 0xe5, 0x4f, 0x95, 0xb5, 0xdd, 0xce, + 0xf1, 0xec, 0x7b, 0x77, 0xed, 0xd3, 0xfb, 0x59, + 0x7f, 0x6f, 0xff, 0x00, 0x9d, 0x8c, 0xc7, 0xe3, + 0x59, 0x7f, 0xe9, 0xaf, 0xfd, 0x99, 0x3e, 0x8a, + 0x7e, 0x35, 0x97, 0xfe, 0x9a, 0xff, 0x00, 0xd9, + 0x93, 0xe8, 0xa2, 0x2a, 0x7b, 0xaf, 0xdb, 0x2b, + 0x4f, 0xa9, 0x76, 0xfe, 0x43, 0xf1, 0xac, 0xbf, + 0xf4, 0xd7, 0xfe, 0xcc, 0x9f, 0x45, 0x3f, 0x1a, + 0xcb, 0xff, 0x00, 0x4d, 0x7f, 0xec, 0xc9, 0xf4, + 0x51, 0x13, 0xdd, 0x7e, 0xd9, 0x4f, 0xa9, 0x76, + 0xfe, 0x43, 0xf1, 0xac, 0xbf, 0xf4, 0xd7, 0xfe, + 0xcc, 0x9f, 0x45, 0x3f, 0x1a, 0xcb, 0xff, 0x00, + 0x4d, 0x7f, 0xec, 0xc9, 0xf4, 0x51, 0x13, 0xdd, + 0x7e, 0xd9, 0x4f, 0xa9, 0x76, 0xfe, 0x43, 0xf1, + 0xac, 0xbf, 0xf4, 0xd7, 0xfe, 0xcc, 0x9f, 0x45, + 0x3f, 0x1a, 0xcb, 0xff, 0x00, 0x4d, 0x7f, 0xec, + 0xc9, 0xf4, 0x51, 0x13, 0xdd, 0x7e, 0xd9, 0x4f, + 0xa9, 0x76, 0xfe, 0x43, 0xf1, 0xac, 0xbf, 0xf4, + 0xd7, 0xfe, 0xcc, 0x9f, 0x45, 0x3f, 0x1a, 0xcb, + 0xff, 0x00, 0x4d, 0x7f, 0xec, 0xc9, 0xf4, 0x51, + 0x13, 0xdd, 0x7e, 0xd9, 0x4f, 0xa9, 0x76, 0xfe, + 0x43, 0xf1, 0xac, 0xbf, 0xf4, 0xd7, 0xfe, 0xcc, + 0x9f, 0x45, 0x3f, 0x1a, 0xcb, 0xff, 0x00, 0x4d, + 0x7f, 0xec, 0xc9, 0xf4, 0x51, 0x13, 0xdd, 0x7e, + 0xd9, 0x4f, 0xa9, 0x76, 0xfe, 0x43, 0xf1, 0xac, + 0xbf, 0xf4, 0xd7, 0xfe, 0xcc, 0x9f, 0x45, 0x3f, + 0x1a, 0xcb, 0xff, 0x00, 0x4d, 0x7f, 0xec, 0xc9, + 0xf4, 0x51, 0x13, 0xdd, 0x7e, 0xd9, 0x4f, 0xa9, + 0x76, 0xfe, 0x43, 0xf1, 0xac, 0xbf, 0xf4, 0xd7, + 0xfe, 0xcc, 0x9f, 0x45, 0x3f, 0x1a, 0xcb, 0xff, + 0x00, 0x4d, 0x7f, 0xec, 0xc9, 0xf4, 0x51, 0x13, + 0xdd, 0x7e, 0xd9, 0x4f, 0xa9, 0x76, 0xfe, 0x43, + 0xf1, 0xac, 0xbf, 0xf4, 0xd7, 0xfe, 0xcc, 0x9f, + 0x45, 0x3f, 0x1a, 0xcb, 0xff, 0x00, 0x4d, 0x7f, + 0xec, 0xc9, 0xf4, 0x51, 0x13, 0xdd, 0x7e, 0xd9, + 0x4f, 0xa9, 0x76, 0xfe, 0x43, 0xf1, 0xac, 0xbf, + 0xf4, 0xd7, 0xfe, 0xcc, 0x9f, 0x45, 0x3f, 0x1a, + 0xcb, 0xff, 0x00, 0x4d, 0x7f, 0xec, 0xc9, 0xf4, + 0x51, 0x13, 0xdd, 0x7e, 0xd9, 0x4f, 0xa9, 0x76, + 0xfe, 0x43, 0xf1, 0xac, 0xbf, 0xf4, 0xd7, 0xfe, + 0xcc, 0x9f, 0x45, 0x3f, 0x1a, 0xcb, 0xff, 0x00, + 0x4d, 0x7f, 0xec, 0xc9, 0xf4, 0x51, 0x13, 0xdd, + 0x7e, 0xd9, 0x4f, 0xa9, 0x76, 0xfe, 0x43, 0xf1, + 0xac, 0xbf, 0xf4, 0xd7, 0xfe, 0xcc, 0x9f, 0x45, + 0x3f, 0x1a, 0xcb, 0xff, 0x00, 0x4d, 0x7f, 0xec, + 0xc9, 0xf4, 0x51, 0x13, 0xdd, 0x7e, 0xd9, 0x4f, + 0xa9, 0x76, 0xfe, 0x43, 0xf1, 0xac, 0xbf, 0xf4, + 0xd7, 0xfe, 0xcc, 0x9f, 0x45, 0x3f, 0x1a, 0xcb, + 0xff, 0x00, 0x4d, 0x7f, 0xec, 0xc9, 0xf4, 0x51, + 0x13, 0xdd, 0x7e, 0xd9, 0x4f, 0xa9, 0x76, 0xfe, + 0x43, 0xf1, 0xac, 0xbf, 0xf4, 0xd7, 0xfe, 0xcc, + 0x9f, 0x45, 0x3f, 0x1a, 0xcb, 0xff, 0x00, 0x4d, + 0x7f, 0xec, 0xc9, 0xf4, 0x51, 0x13, 0xdd, 0x7e, + 0xd9, 0x4f, 0xa9, 0x76, 0xfe, 0x43, 0xf1, 0xac, + 0xbf, 0xf4, 0xd7, 0xfe, 0xcc, 0x9f, 0x45, 0x3f, + 0x1a, 0xcb, 0xff, 0x00, 0x4d, 0x7f, 0xec, 0xc9, + 0xf4, 0x51, 0x13, 0xdd, 0x7e, 0xd9, 0x4f, 0xa9, + 0x76, 0xfe, 0x43, 0xf1, 0xac, 0xbf, 0xf4, 0xd7, + 0xfe, 0xcc, 0x9f, 0x45, 0x3f, 0x1a, 0xcb, 0xff, + 0x00, 0x4d, 0x7f, 0xec, 0xc9, 0xf4, 0x51, 0x13, + 0xdd, 0x7e, 0xd9, 0x4f, 0xa9, 0x76, 0xfe, 0x43, + 0xf1, 0xac, 0xbf, 0xf4, 0xd7, 0xfe, 0xcc, 0x9f, + 0x45, 0x6b, 0x64, 0xb2, 0x99, 0x1b, 0x8b, 0x29, + 0x22, 0x9e, 0xc9, 0xd0, 0xc6, 0xea, 0x71, 0x48, + 0x43, 0xc5, 0x28, 0x41, 0xf8, 0xc2, 0x88, 0x8a, + 0xd4, 0xfb, 0x37, 0x95, 0x19, 0x33, 0xe5, 0xe8, + 0xce, 0xa5, 0xdf, 0x98, 0x79, 0x15, 0x79, 0x59, + 0x7c, 0x9c, 0x93, 0xe5, 0x6c, 0xe6, 0xee, 0xe6, + 0x4b, 0x69, 0x5f, 0x54, 0xb7, 0xc3, 0x7f, 0x6d, + 0x4b, 0x39, 0x11, 0x72, 0xde, 0xe2, 0x57, 0xbd, + 0x2f, 0x4f, 0x0d, 0xc0, 0xb7, 0xbb, 0x0e, 0x5f, + 0x9d, 0xba, 0xb8, 0xb4, 0xd7, 0xd2, 0xdc, 0xdb, + 0x42, 0x6e, 0x6e, 0x23, 0x91, 0x85, 0x90, 0x34, + 0x12, 0x5c, 0x7a, 0x26, 0x8a, 0x00, 0xdd, 0xaa, + 0x5f, 0xf3, 0x7e, 0xa9, 0xfe, 0x81, 0x2f, 0xfc, + 0x73, 0x7d, 0x04, 0x45, 0xe6, 0xff, 0x00, 0xbb, + 0xca, 0xaf, 0xf6, 0xf3, 0x79, 0x53, 0xd5, 0x9d, + 0xf5, 0xd5, 0x7c, 0xb7, 0xf6, 0x70, 0xde, 0xd9, + 0x93, 0xf7, 0x3f, 0x62, 0xdf, 0x93, 0x97, 0xcb, + 0xd9, 0xc9, 0xd8, 0x7e, 0x6f, 0xd5, 0x3f, 0xd0, + 0x25, 0xff, 0x00, 0x8e, 0x6f, 0xa0, 0x9f, 0x9b, + 0xf5, 0x4f, 0xf4, 0x09, 0x7f, 0xe3, 0x9b, 0xe8, + 0x22, 0x29, 0xf7, 0xae, 0xdf, 0x13, 0x3f, 0xa1, + 0x7e, 0x1f, 0xfa, 0x1f, 0x9b, 0xf5, 0x4f, 0xf4, + 0x09, 0x7f, 0xe3, 0x9b, 0xe8, 0x27, 0xe6, 0xfd, + 0x53, 0xfd, 0x02, 0x5f, 0xf8, 0xe6, 0xfa, 0x08, + 0x89, 0xef, 0x5d, 0xbe, 0x23, 0xe8, 0x5f, 0x87, + 0xfe, 0x87, 0xe6, 0xfd, 0x53, 0xfd, 0x02, 0x5f, + 0xf8, 0xe6, 0xfa, 0x09, 0xf9, 0xbf, 0x54, 0xff, + 0x00, 0x40, 0x97, 0xfe, 0x39, 0xbe, 0x82, 0x22, + 0x7b, 0xd7, 0x6f, 0x88, 0xfa, 0x17, 0xe1, 0xff, + 0x00, 0xa1, 0xf9, 0xbf, 0x54, 0xff, 0x00, 0x40, + 0x97, 0xfe, 0x39, 0xbe, 0x82, 0x7e, 0x6f, 0xd5, + 0x3f, 0xd0, 0x25, 0xff, 0x00, 0x8e, 0x6f, 0xa0, + 0x88, 0x9e, 0xf5, 0xdb, 0xe2, 0x3e, 0x85, 0xf8, + 0x7f, 0xe8, 0x7e, 0x6f, 0xd5, 0x3f, 0xd0, 0x25, + 0xff, 0x00, 0x8e, 0x6f, 0xa0, 0x9f, 0x9b, 0xf5, + 0x4f, 0xf4, 0x09, 0x7f, 0xe3, 0x9b, 0xe8, 0x22, + 0x27, 0xbd, 0x76, 0xf8, 0x8f, 0xa1, 0x7e, 0x1f, + 0xfa, 0x1f, 0x9b, 0xf5, 0x4f, 0xf4, 0x09, 0x7f, + 0xe3, 0x9b, 0xe8, 0x27, 0xe6, 0xfd, 0x53, 0xfd, + 0x02, 0x5f, 0xf8, 0xe6, 0xfa, 0x08, 0x89, 0xef, + 0x5d, 0xbe, 0x23, 0xe8, 0x5f, 0x87, 0xfe, 0x87, + 0xe6, 0xfd, 0x53, 0xfd, 0x02, 0x5f, 0xf8, 0xe6, + 0xfa, 0x09, 0xf9, 0xbf, 0x54, 0xff, 0x00, 0x40, + 0x97, 0xfe, 0x39, 0xbe, 0x82, 0x22, 0x7b, 0xd7, + 0x6f, 0x88, 0xfa, 0x17, 0xe1, 0xff, 0x00, 0xa1, + 0xf9, 0xbf, 0x54, 0xff, 0x00, 0x40, 0x97, 0xfe, + 0x39, 0xbe, 0x82, 0x7e, 0x6f, 0xd5, 0x3f, 0xd0, + 0x25, 0xff, 0x00, 0x8e, 0x6f, 0xa0, 0x88, 0x9e, + 0xf5, 0xdb, 0xe2, 0x3e, 0x85, 0xf8, 0x7f, 0xe8, + 0x7e, 0x6f, 0xd5, 0x3f, 0xd0, 0x25, 0xff, 0x00, + 0x8e, 0x6f, 0xa0, 0x9f, 0x9b, 0xf5, 0x4f, 0xf4, + 0x09, 0x7f, 0xe3, 0x9b, 0xe8, 0x22, 0x27, 0xbd, + 0x76, 0xf8, 0x8f, 0xa1, 0x7e, 0x1f, 0xfa, 0x1f, + 0x9b, 0xf5, 0x4f, 0xf4, 0x09, 0x7f, 0xe3, 0x9b, + 0xe8, 0x27, 0xe6, 0xfd, 0x53, 0xfd, 0x02, 0x5f, + 0xf8, 0xe6, 0xfa, 0x08, 0x89, 0xef, 0x5d, 0xbe, + 0x23, 0xe8, 0x5f, 0x87, 0xfe, 0x87, 0xe6, 0xfd, + 0x53, 0xfd, 0x02, 0x5f, 0xf8, 0xe6, 0xfa, 0x09, + 0xf9, 0xbf, 0x54, 0xff, 0x00, 0x40, 0x97, 0xfe, + 0x39, 0xbe, 0x82, 0x22, 0x7b, 0xd7, 0x6f, 0x88, + 0xfa, 0x17, 0xe1, 0xff, 0x00, 0xa1, 0xf9, 0xbf, + 0x54, 0xff, 0x00, 0x40, 0x97, 0xfe, 0x39, 0xbe, + 0x82, 0x7e, 0x6f, 0xd5, 0x3f, 0xd0, 0x25, 0xff, + 0x00, 0x8e, 0x6f, 0xa0, 0x88, 0x9e, 0xf5, 0xdb, + 0xe2, 0x3e, 0x85, 0xf8, 0x7f, 0xe8, 0x7e, 0x6f, + 0xd5, 0x3f, 0xd0, 0x25, 0xff, 0x00, 0x8e, 0x6f, + 0xa0, 0x9f, 0x9b, 0xf5, 0x4f, 0xf4, 0x09, 0x7f, + 0xe3, 0x9b, 0xe8, 0x22, 0x27, 0xbd, 0x76, 0xf8, + 0x8f, 0xa1, 0x7e, 0x1f, 0xfa, 0x1f, 0x9b, 0xf5, + 0x4f, 0xf4, 0x09, 0x7f, 0xe3, 0x9b, 0xe8, 0x27, + 0xe6, 0xfd, 0x53, 0xfd, 0x02, 0x5f, 0xf8, 0xe6, + 0xfa, 0x08, 0x89, 0xef, 0x5d, 0xbe, 0x23, 0xe8, + 0x5f, 0x87, 0xfe, 0x87, 0xe6, 0xfd, 0x53, 0xfd, + 0x02, 0x5f, 0xf8, 0xe6, 0xfa, 0x09, 0xf9, 0xbf, + 0x54, 0xff, 0x00, 0x40, 0x97, 0xfe, 0x39, 0xbe, + 0x82, 0x22, 0x7b, 0xd7, 0x6f, 0x88, 0xfa, 0x17, + 0xe1, 0xff, 0x00, 0xa1, 0xf9, 0xbf, 0x54, 0xff, + 0x00, 0x40, 0x97, 0xfe, 0x39, 0xbe, 0x82, 0x7e, + 0x6f, 0xd5, 0x3f, 0xd0, 0x25, 0xff, 0x00, 0x8e, + 0x6f, 0xa0, 0x88, 0x9e, 0xf5, 0xdb, 0xe2, 0x3e, + 0x85, 0xf8, 0x7f, 0xe8, 0x7e, 0x6f, 0xd5, 0x3f, + 0xd0, 0x25, 0xff, 0x00, 0x8e, 0x6f, 0xa0, 0x9f, + 0x9b, 0xf5, 0x57, 0x26, 0x02, 0x5a, 0xf2, 0x7f, + 0x0e, 0x6f, 0xa0, 0x88, 0x9e, 0xf5, 0xdb, 0xe2, + 0x3e, 0x83, 0xf8, 0x7f, 0xe8, 0x8d, 0xd0, 0x92, + 0x49, 0x2e, 0xae, 0xb8, 0x96, 0x56, 0x18, 0xe4, + 0x92, 0x39, 0x9c, 0xf8, 0xcf, 0xc5, 0x25, 0xed, + 0x25, 0xbb, 0x7a, 0x8b, 0xa6, 0xa2, 0x2d, 0xb0, + 0xd9, 0x7f, 0x6f, 0xa7, 0xae, 0x5e, 0x7f, 0xc7, + 0x3c, 0x9f, 0x6b, 0x8f, 0x27, 0x2f, 0x93, 0xfb, + 0x76, 0xfc, 0x9c, 0xbd, 0x59, 0x11, 0x79, 0xba, + 0x74, 0x11, 0xf8, 0x7f, 0x01, 0x58, 0x21, 0xbc, + 0xba, 0x6c, 0x4c, 0x6b, 0x2d, 0xdc, 0xe6, 0x80, + 0x00, 0x75, 0x1d, 0xb7, 0xde, 0x44, 0x5e, 0x2e, + 0x2f, 0xdb, 0x3d, 0xbe, 0xef, 0xb2, 0x65, 0xf2, + 0xbc, 0x8a, 0x3c, 0xac, 0x9e, 0x4e, 0x6c, 0x9f, + 0x89, 0x8d, 0x9f, 0xda, 0xfd, 0x9a, 0x7f, 0x77, + 0x37, 0x95, 0x39, 0x1f, 0x7e, 0x7d, 0x79, 0xf7, + 0x67, 0x76, 0x1d, 0xfe, 0x89, 0xe7, 0xd7, 0x9f, + 0x75, 0x77, 0x61, 0xdf, 0xe8, 0x88, 0xab, 0xf5, + 0xcf, 0xc5, 0xf9, 0x16, 0xf7, 0x3e, 0xcf, 0x19, + 0xe7, 0xd7, 0x9f, 0x75, 0x77, 0x61, 0xdf, 0xe8, + 0x9e, 0x7d, 0x79, 0xf7, 0x57, 0x76, 0x1d, 0xfe, + 0x88, 0x89, 0xf5, 0xcf, 0xc5, 0xf9, 0x0f, 0x73, + 0xec, 0xf1, 0x9e, 0x7d, 0x79, 0xf7, 0x57, 0x76, + 0x1d, 0xfe, 0x89, 0xe7, 0xd7, 0x9f, 0x75, 0x77, + 0x61, 0xdf, 0xe8, 0x88, 0x9f, 0x5c, 0xfc, 0x5f, + 0x90, 0xf7, 0x3e, 0xcf, 0x19, 0xe7, 0xd7, 0x9f, + 0x75, 0x77, 0x61, 0xdf, 0xe8, 0x9e, 0x7d, 0x79, + 0xf7, 0x57, 0x76, 0x1d, 0xfe, 0x88, 0x89, 0xf5, + 0xcf, 0xc5, 0xf9, 0x0f, 0x73, 0xec, 0xf1, 0x9e, + 0x7d, 0x79, 0xf7, 0x57, 0x76, 0x1d, 0xfe, 0x89, + 0xe7, 0xd7, 0x9f, 0x75, 0x77, 0x61, 0xdf, 0xe8, + 0x88, 0x9f, 0x5c, 0xfc, 0x5f, 0x90, 0xf7, 0x3e, + 0xcf, 0x19, 0xe7, 0xd7, 0x9f, 0x75, 0x77, 0x61, + 0xdf, 0xe8, 0x9e, 0x7d, 0x79, 0xf7, 0x57, 0x76, + 0x1d, 0xfe, 0x88, 0x89, 0xf5, 0xcf, 0xc5, 0xf9, + 0x0f, 0x73, 0xec, 0xf1, 0x9e, 0x7d, 0x79, 0xf7, + 0x57, 0x76, 0x1d, 0xfe, 0x89, 0xe7, 0xd7, 0x9f, + 0x75, 0x77, 0x61, 0xdf, 0xe8, 0x88, 0x9f, 0x5c, + 0xfc, 0x5f, 0x90, 0xf7, 0x3e, 0xcf, 0x19, 0xe7, + 0xd7, 0x9f, 0x75, 0x77, 0x61, 0xdf, 0xe8, 0x9e, + 0x7d, 0x79, 0xf7, 0x57, 0x76, 0x1d, 0xfe, 0x88, + 0x89, 0xf5, 0xcf, 0xc5, 0xf9, 0x0f, 0x73, 0xec, + 0xf1, 0x9e, 0x7d, 0x79, 0xf7, 0x57, 0x76, 0x1d, + 0xfe, 0x89, 0xe7, 0xd7, 0x9f, 0x75, 0x77, 0x61, + 0xdf, 0xe8, 0x88, 0x9f, 0x5c, 0xfc, 0x5f, 0x90, + 0xf7, 0x3e, 0xcf, 0x19, 0xe7, 0xd7, 0x9f, 0x75, + 0x77, 0x61, 0xdf, 0xe8, 0x9e, 0x7d, 0x79, 0xf7, + 0x57, 0x76, 0x1d, 0xfe, 0x88, 0x89, 0xf5, 0xcf, + 0xc5, 0xf9, 0x0f, 0x73, 0xec, 0xf1, 0x9e, 0x7d, + 0x79, 0xf7, 0x57, 0x76, 0x1d, 0xfe, 0x89, 0xe7, + 0xd7, 0x9f, 0x75, 0x77, 0x61, 0xdf, 0xe8, 0x88, + 0x9f, 0x5c, 0xfc, 0x5f, 0x90, 0xf7, 0x3e, 0xcf, + 0x19, 0xe7, 0xd7, 0x9f, 0x75, 0x77, 0x61, 0xdf, + 0xe8, 0x9e, 0x7d, 0x79, 0xf7, 0x57, 0x76, 0x1d, + 0xfe, 0x88, 0x89, 0xf5, 0xcf, 0xc5, 0xf9, 0x0f, + 0x73, 0xec, 0xf1, 0x9e, 0x7d, 0x79, 0xf7, 0x57, + 0x76, 0x1d, 0xfe, 0x89, 0xe7, 0xd7, 0x9f, 0x75, + 0x77, 0x61, 0xdf, 0xe8, 0x88, 0x9f, 0x5c, 0xfc, + 0x5f, 0x90, 0xf7, 0x3e, 0xcf, 0x19, 0xe7, 0xd7, + 0x9f, 0x75, 0x77, 0x61, 0xdf, 0xe8, 0x9e, 0x7d, + 0x79, 0xf7, 0x57, 0x76, 0x1d, 0xfe, 0x88, 0x89, + 0xf5, 0xcf, 0xc5, 0xf9, 0x0f, 0x73, 0xec, 0xf1, + 0x9e, 0x7d, 0x79, 0xf7, 0x57, 0x76, 0x1d, 0xfe, + 0x89, 0xe7, 0xd7, 0x9f, 0x75, 0x77, 0x61, 0xdf, + 0xe8, 0x88, 0x9f, 0x5c, 0xfc, 0x5f, 0x90, 0xf7, + 0x3e, 0xcf, 0x19, 0xe7, 0xd7, 0x9f, 0x75, 0x77, + 0x61, 0xdf, 0xe8, 0x9e, 0x7d, 0x79, 0xf7, 0x57, + 0x76, 0x1d, 0xfe, 0x88, 0x89, 0xf5, 0xcf, 0xc5, + 0xf9, 0x0f, 0x73, 0xec, 0xf1, 0x9e, 0x7d, 0x79, + 0xf7, 0x57, 0x76, 0x1d, 0xfe, 0x89, 0xe7, 0xd7, + 0x9f, 0x75, 0x77, 0x61, 0xdf, 0xe8, 0x88, 0x9f, + 0x5c, 0xfc, 0x5f, 0x90, 0xf7, 0x3e, 0xcf, 0x1b, + 0x52, 0xf2, 0x69, 0xa6, 0x91, 0x86, 0x58, 0xcc, + 0x64, 0x6c, 0x00, 0xd4, 0x57, 0x6f, 0x5d, 0x58, + 0x59, 0xde, 0x8e, 0x64, 0x45, 0xd3, 0xf0, 0x7f, + 0xdf, 0xfd, 0xec, 0x57, 0xb4, 0x71, 0x7f, 0xd7, + 0xe5, 0xf5, 0xe6, 0x9c, 0x99, 0xba, 0x19, 0x62, + 0xbc, 0x8f, 0x22, 0xdf, 0x91, 0xb3, 0xff, 0x00, + 0xac, 0x8c, 0x77, 0x9e, 0x8b, 0x37, 0x93, 0x77, + 0x8a, 0x57, 0x3e, 0xd3, 0xb9, 0x2b, 0xfb, 0x11, + 0x3f, 0x99, 0xd9, 0xba, 0xf3, 0xa4, 0x0c, 0xe3, + 0xe1, 0x0e, 0x3c, 0x34, 0xad, 0x3b, 0xc0, 0x77, + 0xd5, 0x11, 0x7b, 0xf6, 0xb2, 0x64, 0xab, 0xca, + 0xd9, 0x79, 0x78, 0x8f, 0x2f, 0xcb, 0xa3, 0xc8, + 0xda, 0xe9, 0xc8, 0x99, 0xfc, 0xc7, 0x9f, 0xfe, + 0x8f, 0x27, 0xec, 0xcb, 0xf4, 0x53, 0xf3, 0x1e, + 0x7f, 0xfa, 0x3c, 0x9f, 0xb3, 0x2f, 0xd1, 0x44, + 0x57, 0xff, 0x00, 0x47, 0xdb, 0x2b, 0x3f, 0x7a, + 0xed, 0xf1, 0x1f, 0x98, 0xf3, 0xff, 0x00, 0xd1, + 0xe4, 0xfd, 0x99, 0x7e, 0x8a, 0x7e, 0x63, 0xcf, + 0xff, 0x00, 0x47, 0x93, 0xf6, 0x65, 0xfa, 0x28, + 0x89, 0xfe, 0x8f, 0xb6, 0x53, 0xde, 0xbb, 0x7c, + 0x47, 0xe6, 0x3c, 0xff, 0x00, 0xf4, 0x79, 0x3f, + 0x66, 0x5f, 0xa2, 0x9f, 0x98, 0xf3, 0xff, 0x00, + 0xd1, 0xe4, 0xfd, 0x99, 0x7e, 0x8a, 0x22, 0x7f, + 0xa3, 0xed, 0x94, 0xf7, 0xae, 0xdf, 0x11, 0xf9, + 0x8f, 0x3f, 0xfd, 0x1e, 0x4f, 0xd9, 0x97, 0xe8, + 0xa7, 0xe6, 0x3c, 0xff, 0x00, 0xf4, 0x79, 0x3f, + 0x66, 0x5f, 0xa2, 0x88, 0x9f, 0xe8, 0xfb, 0x65, + 0x3d, 0xeb, 0xb7, 0xc4, 0x7e, 0x63, 0xcf, 0xff, + 0x00, 0x47, 0x93, 0xf6, 0x65, 0xfa, 0x29, 0xf9, + 0x8f, 0x3f, 0xfd, 0x1e, 0x4f, 0xd9, 0x97, 0xe8, + 0xa2, 0x27, 0xfa, 0x3e, 0xd9, 0x4f, 0x7a, 0xed, + 0xf1, 0x1f, 0x98, 0xf3, 0xff, 0x00, 0xd1, 0xe4, + 0xfd, 0x99, 0x7e, 0x8a, 0x7e, 0x63, 0xcf, 0xff, + 0x00, 0x47, 0x93, 0xf6, 0x65, 0xfa, 0x28, 0x89, + 0xfe, 0x8f, 0xb6, 0x53, 0xde, 0xbb, 0x7c, 0x47, + 0xe6, 0x3c, 0xff, 0x00, 0xf4, 0x79, 0x3f, 0x66, + 0x5f, 0xa2, 0x9f, 0x98, 0xf3, 0xff, 0x00, 0xd1, + 0xe4, 0xfd, 0x99, 0x7e, 0x8a, 0x22, 0x7f, 0xa3, + 0xed, 0x94, 0xf7, 0xae, 0xdf, 0x11, 0xf9, 0x8f, + 0x3f, 0xfd, 0x1e, 0x4f, 0xd9, 0x97, 0xe8, 0xa7, + 0xe6, 0x3c, 0xff, 0x00, 0xf4, 0x79, 0x3f, 0x66, + 0x5f, 0xa2, 0x88, 0x9f, 0xe8, 0xfb, 0x65, 0x3d, + 0xeb, 0xb7, 0xc4, 0x7e, 0x63, 0xcf, 0xff, 0x00, + 0x47, 0x93, 0xf6, 0x65, 0xfa, 0x29, 0xf9, 0x8f, + 0x3f, 0xfd, 0x1e, 0x4f, 0xd9, 0x97, 0xe8, 0xa2, + 0x27, 0xfa, 0x3e, 0xd9, 0x4f, 0x7a, 0xed, 0xf1, + 0x1f, 0x98, 0xf3, 0xff, 0x00, 0xd1, 0xe4, 0xfd, + 0x99, 0x7e, 0x8a, 0x7e, 0x63, 0xcf, 0xff, 0x00, + 0x47, 0x93, 0xf6, 0x65, 0xfa, 0x28, 0x89, 0xfe, + 0x8f, 0xb6, 0x53, 0xde, 0xbb, 0x7c, 0x47, 0xe6, + 0x3c, 0xff, 0x00, 0xf4, 0x79, 0x3f, 0x66, 0x5f, + 0xa2, 0x9f, 0x98, 0xf3, 0xff, 0x00, 0xd1, 0xe4, + 0xfd, 0x99, 0x7e, 0x8a, 0x22, 0x7f, 0xa3, 0xed, + 0x94, 0xf7, 0xae, 0xdf, 0x11, 0xf9, 0x8f, 0x3f, + 0xfd, 0x1e, 0x4f, 0xd9, 0x97, 0xe8, 0xa7, 0xe6, + 0x3c, 0xff, 0x00, 0xf4, 0x79, 0x3f, 0x66, 0x5f, + 0xa2, 0x88, 0x9f, 0xe8, 0xfb, 0x65, 0x3d, 0xeb, + 0xb7, 0xc4, 0x7e, 0x63, 0xcf, 0xff, 0x00, 0x47, + 0x93, 0xf6, 0x65, 0xfa, 0x29, 0xf9, 0x8f, 0x3f, + 0xfd, 0x1e, 0x4f, 0xd9, 0x97, 0xe8, 0xa2, 0x27, + 0xfa, 0x3e, 0xd9, 0x4f, 0x7a, 0xed, 0xf1, 0x1f, + 0x98, 0xf3, 0xff, 0x00, 0xd1, 0xe4, 0xfd, 0x99, + 0x7e, 0x8a, 0x7e, 0x63, 0xcf, 0xff, 0x00, 0x47, + 0x93, 0xf6, 0x65, 0xfa, 0x28, 0x89, 0xfe, 0x8f, + 0xb6, 0x53, 0xde, 0xbb, 0x7c, 0x47, 0xe6, 0x3c, + 0xff, 0x00, 0xf4, 0x79, 0x3f, 0x66, 0x5f, 0xa2, + 0x9f, 0x98, 0xf3, 0xff, 0x00, 0xd1, 0xe4, 0xfd, + 0x99, 0x7e, 0x8a, 0x22, 0x7f, 0xa3, 0xed, 0x94, + 0xf7, 0xae, 0xdf, 0x11, 0xf9, 0x8f, 0x3f, 0xfd, + 0x1e, 0x4f, 0xd9, 0x97, 0xe8, 0xa7, 0xe6, 0x3c, + 0xff, 0x00, 0xf4, 0x79, 0x3f, 0x66, 0x5f, 0xa2, + 0x88, 0x9f, 0xe8, 0xfb, 0x65, 0x3d, 0xeb, 0xb7, + 0xc4, 0x7e, 0x63, 0xcf, 0xff, 0x00, 0x47, 0x93, + 0xf6, 0x65, 0xfa, 0x29, 0xf9, 0x8f, 0x3f, 0xfd, + 0x1e, 0x4f, 0xd9, 0x97, 0xe8, 0xa2, 0x27, 0xfa, + 0x3e, 0xd9, 0x4f, 0x7a, 0xed, 0xf1, 0x35, 0x72, + 0x99, 0xcc, 0xc5, 0xc6, 0x3e, 0x78, 0x27, 0xc6, + 0x3e, 0x08, 0xa4, 0x6d, 0x1f, 0x29, 0x6c, 0x80, + 0x34, 0x54, 0x6d, 0xee, 0x9b, 0x45, 0x2d, 0xa1, + 0xbd, 0x4c, 0xef, 0x2e, 0xfe, 0xd3, 0x51, 0x15, + 0x6b, 0xf2, 0x7c, 0x89, 0xf2, 0x33, 0x65, 0x4d, + 0xaf, 0xdc, 0xfd, 0xe8, 0xfd, 0xcc, 0xfe, 0x4c, + 0xe4, 0xd0, 0xb1, 0x22, 0x22, 0xc5, 0xd8, 0x22, + 0x22, 0x0f, 0xff, 0xd9, +}; + +static const uint8_t data_images_ti_gif[] = +{ + /* /images/ti.gif */ + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x74, 0x69, 0x2e, 0x67, 0x69, 0x66, 0x00, + 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x50, 0x00, + 0x4c, 0x00, 0xb3, 0x00, 0x00, 0xf2, 0x54, 0x5a, + 0x25, 0x25, 0x25, 0xa3, 0xa3, 0xa3, 0xf5, 0x87, + 0x8b, 0x62, 0x62, 0x62, 0x83, 0x83, 0x83, 0x48, + 0x48, 0x48, 0xfa, 0xf7, 0xf8, 0xd4, 0xd4, 0xd4, + 0xbf, 0xbf, 0xbf, 0xea, 0xe7, 0xe7, 0xf9, 0xaf, + 0xb2, 0xfb, 0xce, 0xd0, 0xed, 0x1c, 0x24, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, + 0x00, 0x00, 0x50, 0x00, 0x4c, 0x00, 0x00, 0x04, + 0xfe, 0xf0, 0xc9, 0x49, 0xab, 0x5d, 0x2d, 0xeb, + 0xcd, 0x33, 0xb0, 0x60, 0x28, 0x8e, 0xe4, 0x88, + 0x75, 0xa8, 0xf6, 0x95, 0x6c, 0xeb, 0x5e, 0x69, + 0xbc, 0xbe, 0x74, 0x1d, 0x9e, 0x71, 0x37, 0xdb, + 0xbc, 0x8d, 0xe7, 0x9b, 0x5d, 0xe5, 0x00, 0x28, + 0x1a, 0x1b, 0x8b, 0x9e, 0xf2, 0x07, 0xf4, 0x88, + 0x18, 0x28, 0x86, 0xb2, 0xc7, 0x6c, 0x0a, 0x29, + 0xd5, 0xc6, 0x94, 0xda, 0xe4, 0x5c, 0x27, 0x03, + 0xdd, 0x96, 0x97, 0xcd, 0x7d, 0x25, 0x80, 0xce, + 0x60, 0xec, 0xeb, 0x06, 0x43, 0x0a, 0x54, 0x92, + 0x4d, 0x2b, 0xcb, 0x42, 0xd0, 0x8e, 0x94, 0xfe, + 0xb2, 0xa7, 0xce, 0x0a, 0x0b, 0x82, 0x83, 0x0b, + 0x07, 0x7c, 0x7d, 0x6e, 0x2a, 0x87, 0x8b, 0x12, + 0x7e, 0x28, 0x67, 0x8c, 0x4b, 0x89, 0x2a, 0x46, + 0x6b, 0x0f, 0x07, 0x03, 0x46, 0x46, 0x7b, 0x0b, + 0x9a, 0x9e, 0x9e, 0x96, 0x63, 0x8e, 0x40, 0x96, + 0x79, 0x1c, 0x7b, 0x69, 0x5d, 0x90, 0x35, 0xa3, + 0x39, 0x73, 0x59, 0x86, 0x0f, 0xa9, 0x56, 0x74, + 0xad, 0x31, 0x0a, 0x12, 0x61, 0x5e, 0x12, 0x71, + 0x6e, 0xab, 0x75, 0x93, 0xbb, 0x68, 0x6a, 0x8d, + 0x89, 0xbf, 0x88, 0xc1, 0x8a, 0x97, 0x72, 0xb9, + 0xc6, 0xb5, 0xc9, 0x1a, 0xa5, 0x51, 0xc3, 0xbe, + 0xcf, 0xd0, 0x48, 0xc5, 0x1d, 0xb1, 0xb3, 0xb4, + 0x6c, 0xb6, 0xd3, 0x0f, 0xba, 0x6f, 0x0f, 0xa6, + 0xaa, 0xd6, 0xbe, 0x9a, 0xdb, 0xc4, 0xe4, 0x0d, + 0x9a, 0x40, 0xc7, 0x2e, 0xdf, 0xa1, 0x14, 0xbd, + 0x1c, 0x73, 0xb1, 0xbc, 0xef, 0xe7, 0x4d, 0x7b, + 0x15, 0xe5, 0x1a, 0xfd, 0x28, 0xfc, 0x13, 0xe3, + 0x2d, 0x11, 0x2e, 0x18, 0xda, 0x40, 0x88, 0xbb, + 0x55, 0xd0, 0x9c, 0x42, 0x82, 0x16, 0xb8, 0xa5, + 0x98, 0x33, 0xe1, 0x80, 0xc5, 0x8b, 0x18, 0x33, + 0x66, 0x7c, 0x60, 0xeb, 0x8c, 0xc4, 0x06, 0xfe, + 0xf3, 0x28, 0x7c, 0x84, 0x48, 0xed, 0x5a, 0x97, + 0x90, 0x12, 0x0e, 0x30, 0xb3, 0xa0, 0xb2, 0x0b, + 0x45, 0x59, 0x26, 0xdd, 0xbc, 0x9c, 0x30, 0xb0, + 0x41, 0xc0, 0x09, 0xdf, 0xf0, 0x2d, 0x8c, 0x19, + 0x03, 0x1f, 0x16, 0x14, 0x3e, 0xc1, 0x18, 0x3b, + 0x58, 0x93, 0xa7, 0xbd, 0x01, 0x48, 0x07, 0xc4, + 0xda, 0xd9, 0x2e, 0x65, 0xd2, 0x01, 0x9d, 0x82, + 0x2d, 0x35, 0x5a, 0xad, 0x64, 0x34, 0x09, 0x45, + 0x13, 0xc5, 0x6a, 0x49, 0x55, 0xdf, 0xb2, 0x0e, + 0x73, 0x98, 0x4a, 0xa5, 0xd9, 0x95, 0x14, 0x56, + 0x70, 0x23, 0x27, 0xf9, 0xcc, 0x5a, 0xf6, 0x15, + 0x0a, 0x5c, 0x5c, 0x4d, 0x06, 0x65, 0x4b, 0xf5, + 0x20, 0xd3, 0x15, 0x74, 0xbb, 0x04, 0x7d, 0x50, + 0xaf, 0xac, 0x32, 0x98, 0x1c, 0x2c, 0x7d, 0xeb, + 0x09, 0x82, 0x88, 0x5f, 0x65, 0x71, 0x35, 0x84, + 0x35, 0xba, 0x37, 0xe5, 0xe1, 0x0c, 0xd2, 0xf4, + 0x58, 0xbd, 0xd6, 0xf8, 0xec, 0x61, 0xb7, 0x09, + 0x01, 0xc7, 0xac, 0xdc, 0xcc, 0xef, 0x9e, 0xbb, + 0x96, 0x79, 0x72, 0xe6, 0x7b, 0x78, 0xc2, 0x47, + 0xc1, 0x54, 0x47, 0x6b, 0x36, 0xba, 0x22, 0x71, + 0x06, 0xcc, 0xa2, 0x49, 0x0c, 0x36, 0xcb, 0x4e, + 0x32, 0x69, 0xc6, 0x25, 0xd2, 0x26, 0xbb, 0xc7, + 0xa0, 0xb7, 0x6f, 0x06, 0xf8, 0x0e, 0xf4, 0xc6, + 0x44, 0xb9, 0x84, 0x58, 0x68, 0x37, 0x59, 0x1c, + 0x37, 0x83, 0xb2, 0xb0, 0x95, 0xa4, 0x77, 0x6a, + 0xe8, 0xd6, 0x51, 0xe8, 0xc5, 0x72, 0x9b, 0x14, + 0x0c, 0x93, 0x6c, 0xd1, 0x57, 0x46, 0x75, 0x1b, + 0x69, 0x0f, 0x66, 0x3f, 0xcd, 0xea, 0x5d, 0x72, + 0x1a, 0xdd, 0x33, 0x9c, 0xaf, 0x3d, 0xce, 0xba, + 0x8c, 0xf5, 0x35, 0xb4, 0xab, 0x1f, 0xc1, 0x54, + 0x7c, 0x8b, 0xb4, 0xcd, 0xa7, 0x04, 0x02, 0x4e, + 0xc2, 0x35, 0x3c, 0x91, 0x3a, 0xd8, 0x82, 0x17, + 0x09, 0x09, 0x77, 0xf1, 0x57, 0x42, 0x7a, 0xf9, + 0x0d, 0x18, 0x82, 0x6b, 0x94, 0x00, 0xf0, 0xd4, + 0x83, 0x99, 0x04, 0xa6, 0x20, 0x0d, 0xd7, 0x4d, + 0x32, 0xd3, 0x84, 0x07, 0x52, 0x95, 0x20, 0x86, + 0x22, 0x54, 0xd8, 0x0d, 0x87, 0x2f, 0xe4, 0x05, + 0x84, 0x6a, 0x20, 0x82, 0x30, 0x1d, 0x10, 0x17, + 0x96, 0x58, 0x82, 0x88, 0x8f, 0xa8, 0x08, 0x1e, + 0x34, 0x29, 0xba, 0x48, 0x02, 0x8b, 0x1c, 0x90, + 0x28, 0x63, 0x44, 0xc1, 0xfc, 0x77, 0x23, 0x3d, + 0xc1, 0x6c, 0xb8, 0x63, 0x08, 0x1e, 0x6e, 0xe0, + 0xe3, 0x8f, 0x26, 0x26, 0x32, 0x24, 0x91, 0xfe, + 0x18, 0x89, 0x24, 0x0d, 0x2c, 0x1e, 0xb9, 0xe4, + 0x4f, 0x1f, 0x3e, 0xd9, 0x82, 0x88, 0x02, 0x4a, + 0x49, 0x82, 0x02, 0x27, 0xc6, 0x68, 0xa5, 0x08, + 0x7e, 0xe8, 0xb8, 0xa5, 0x53, 0x23, 0x39, 0xf9, + 0xe5, 0x10, 0x0c, 0x0c, 0x52, 0xa5, 0x0d, 0x11, + 0x00, 0x00, 0x3b, +}; + +static const uint8_t data_images_tiva_jpg[] = +{ + /* /images/tiva.jpg */ + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x74, 0x69, 0x76, 0x61, 0x2e, 0x6a, 0x70, 0x67, + 0x00, + 0xff, 0xd8, 0xff, 0xe1, 0x00, 0x18, 0x45, 0x78, + 0x69, 0x66, 0x00, 0x00, 0x49, 0x49, 0x2a, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x11, + 0x44, 0x75, 0x63, 0x6b, 0x79, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0xff, + 0xe1, 0x03, 0xb4, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, + 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, + 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x00, + 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, + 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, + 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, + 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, + 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, + 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, + 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, + 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, + 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, + 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, + 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, + 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, + 0x65, 0x20, 0x35, 0x2e, 0x30, 0x2d, 0x63, 0x30, + 0x36, 0x30, 0x20, 0x36, 0x31, 0x2e, 0x31, 0x33, + 0x34, 0x37, 0x37, 0x37, 0x2c, 0x20, 0x32, 0x30, + 0x31, 0x30, 0x2f, 0x30, 0x32, 0x2f, 0x31, 0x32, + 0x2d, 0x31, 0x37, 0x3a, 0x33, 0x32, 0x3a, 0x30, + 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, + 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, + 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, + 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, + 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, + 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, + 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, + 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, + 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, + 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, + 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, + 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, + 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, + 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, + 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x64, 0x63, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x70, 0x75, 0x72, 0x6c, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x64, 0x63, 0x2f, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x31, 0x2e, 0x31, + 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, + 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, + 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, + 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, + 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, + 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x38, 0x33, + 0x46, 0x43, 0x44, 0x30, 0x31, 0x31, 0x32, 0x36, + 0x44, 0x44, 0x31, 0x31, 0x45, 0x33, 0x42, 0x36, + 0x37, 0x30, 0x45, 0x30, 0x37, 0x37, 0x32, 0x32, + 0x37, 0x34, 0x33, 0x30, 0x42, 0x36, 0x22, 0x20, + 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, + 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, + 0x64, 0x3a, 0x38, 0x33, 0x46, 0x43, 0x44, 0x30, + 0x31, 0x32, 0x32, 0x36, 0x44, 0x44, 0x31, 0x31, + 0x45, 0x33, 0x42, 0x36, 0x37, 0x30, 0x45, 0x30, + 0x37, 0x37, 0x32, 0x32, 0x37, 0x34, 0x33, 0x30, + 0x42, 0x36, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, + 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, + 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x53, 0x35, + 0x20, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, + 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, + 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, + 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, + 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, + 0x75, 0x75, 0x69, 0x64, 0x3a, 0x66, 0x61, 0x66, + 0x35, 0x62, 0x64, 0x64, 0x35, 0x2d, 0x62, 0x61, + 0x33, 0x64, 0x2d, 0x31, 0x31, 0x64, 0x61, 0x2d, + 0x61, 0x64, 0x33, 0x31, 0x2d, 0x64, 0x33, 0x33, + 0x64, 0x37, 0x35, 0x31, 0x38, 0x32, 0x66, 0x31, + 0x62, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, + 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, + 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x38, 0x33, 0x46, + 0x43, 0x44, 0x30, 0x31, 0x30, 0x32, 0x36, 0x44, + 0x44, 0x31, 0x31, 0x45, 0x33, 0x42, 0x36, 0x37, + 0x30, 0x45, 0x30, 0x37, 0x37, 0x32, 0x32, 0x37, + 0x34, 0x33, 0x30, 0x42, 0x36, 0x22, 0x2f, 0x3e, + 0x20, 0x3c, 0x64, 0x63, 0x3a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x6f, 0x72, 0x3e, 0x20, 0x3c, 0x72, + 0x64, 0x66, 0x3a, 0x53, 0x65, 0x71, 0x3e, 0x20, + 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, 0x3e, + 0x48, 0x61, 0x75, 0x67, 0x6c, 0x69, 0x65, 0x3c, + 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, 0x3e, + 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, + 0x3e, 0x4a, 0x6f, 0x65, 0x3c, 0x2f, 0x72, 0x64, + 0x66, 0x3a, 0x6c, 0x69, 0x3e, 0x20, 0x3c, 0x2f, + 0x72, 0x64, 0x66, 0x3a, 0x53, 0x65, 0x71, 0x3e, + 0x20, 0x3c, 0x2f, 0x64, 0x63, 0x3a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3e, 0x20, 0x3c, + 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, + 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, + 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, + 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, + 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xff, 0xed, 0x00, + 0x48, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, + 0x6f, 0x70, 0x20, 0x33, 0x2e, 0x30, 0x00, 0x38, + 0x42, 0x49, 0x4d, 0x04, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x1c, 0x01, 0x5a, 0x00, 0x03, + 0x1b, 0x25, 0x47, 0x1c, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xfc, + 0xe1, 0x1f, 0x89, 0xc8, 0xb7, 0xc9, 0x78, 0x2f, + 0x34, 0x62, 0x34, 0x07, 0x58, 0x77, 0xeb, 0xff, + 0xee, 0x00, 0x0e, 0x41, 0x64, 0x6f, 0x62, 0x65, + 0x00, 0x64, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, + 0xdb, 0x00, 0x84, 0x00, 0x0c, 0x08, 0x08, 0x08, + 0x09, 0x08, 0x0c, 0x09, 0x09, 0x0c, 0x11, 0x0b, + 0x0a, 0x0b, 0x11, 0x15, 0x0f, 0x0c, 0x0c, 0x0f, + 0x15, 0x18, 0x13, 0x13, 0x15, 0x13, 0x13, 0x18, + 0x17, 0x12, 0x14, 0x14, 0x14, 0x14, 0x12, 0x17, + 0x17, 0x1b, 0x1c, 0x1e, 0x1c, 0x1b, 0x17, 0x24, + 0x24, 0x27, 0x27, 0x24, 0x24, 0x35, 0x33, 0x33, + 0x33, 0x35, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x01, 0x0d, 0x0b, 0x0b, + 0x0d, 0x0e, 0x0d, 0x10, 0x0e, 0x0e, 0x10, 0x14, + 0x0e, 0x0f, 0x0e, 0x14, 0x14, 0x10, 0x11, 0x11, + 0x10, 0x14, 0x1d, 0x14, 0x14, 0x15, 0x14, 0x14, + 0x1d, 0x25, 0x1a, 0x17, 0x17, 0x17, 0x17, 0x1a, + 0x25, 0x20, 0x23, 0x1e, 0x1e, 0x1e, 0x23, 0x20, + 0x28, 0x28, 0x25, 0x25, 0x28, 0x28, 0x32, 0x32, + 0x30, 0x32, 0x32, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xff, 0xc0, 0x00, + 0x11, 0x08, 0x04, 0x95, 0x05, 0x00, 0x03, 0x01, + 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, + 0xff, 0xc4, 0x00, 0xce, 0x00, 0x01, 0x00, 0x02, + 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, + 0x01, 0x03, 0x04, 0x02, 0x07, 0x08, 0x01, 0x01, + 0x00, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x04, 0x03, 0x05, 0x06, 0x10, 0x00, + 0x01, 0x03, 0x02, 0x02, 0x03, 0x08, 0x0d, 0x07, + 0x08, 0x08, 0x06, 0x02, 0x01, 0x02, 0x07, 0x01, + 0x00, 0x02, 0x03, 0x11, 0x04, 0x12, 0x05, 0x21, + 0x31, 0x06, 0x41, 0x51, 0x91, 0xd1, 0x92, 0x13, + 0x54, 0x15, 0x61, 0x71, 0x81, 0xa1, 0xb1, 0x22, + 0x32, 0x72, 0xd2, 0x53, 0x14, 0x34, 0x16, 0xc1, + 0x52, 0xa2, 0xb2, 0x73, 0x55, 0x07, 0xf0, 0x42, + 0xe2, 0x23, 0x33, 0x93, 0xd3, 0x35, 0xe1, 0x62, + 0x82, 0xc2, 0x63, 0x25, 0x36, 0x17, 0x43, 0xa3, + 0xb3, 0x24, 0x74, 0x94, 0xf1, 0x26, 0x83, 0x37, + 0x44, 0x64, 0xf2, 0xc3, 0xe3, 0x84, 0x45, 0x27, + 0x11, 0x01, 0x00, 0x02, 0x01, 0x02, 0x04, 0x03, + 0x06, 0x02, 0x08, 0x06, 0x01, 0x02, 0x06, 0x03, + 0x00, 0x00, 0x01, 0x02, 0x03, 0x11, 0x12, 0x21, + 0x51, 0x52, 0x13, 0x31, 0x04, 0x14, 0x41, 0x61, + 0x71, 0x91, 0x22, 0x32, 0x81, 0x53, 0xb1, 0x42, + 0x72, 0xa2, 0x33, 0x05, 0x15, 0x06, 0xa1, 0xc1, + 0x62, 0x23, 0x93, 0x16, 0xd1, 0xe1, 0x92, 0xf1, + 0xb2, 0xc2, 0x43, 0x83, 0x24, 0x82, 0x63, 0x44, + 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, + 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0xb7, 0xda, + 0xdb, 0x5c, 0xde, 0xdc, 0xdc, 0xb5, 0xb7, 0x2f, + 0x8c, 0x44, 0xf2, 0x35, 0x9f, 0x9c, 0x7b, 0x2b, + 0xab, 0xa9, 0xae, 0xba, 0x6b, 0xfb, 0xfc, 0x6b, + 0x19, 0x2f, 0xbd, 0x5e, 0xf9, 0xe7, 0xeb, 0x15, + 0x2e, 0x82, 0x27, 0xa9, 0xae, 0xba, 0x6b, 0xfb, + 0xfc, 0x69, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, + 0x35, 0x2c, 0x88, 0x22, 0x7a, 0x9a, 0xeb, 0xa6, + 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, 0x75, 0xd3, 0x5f, + 0xdf, 0xe3, 0x52, 0xc8, 0x82, 0x27, 0xa9, 0xae, + 0xba, 0x6b, 0xfb, 0xfc, 0x69, 0xd4, 0xd7, 0x5d, + 0x35, 0xfd, 0xfe, 0x35, 0x2c, 0x88, 0x22, 0x7a, + 0x9a, 0xeb, 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, + 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x52, 0xc8, 0x82, + 0x27, 0xa9, 0xae, 0xba, 0x6b, 0xfb, 0xfc, 0x69, + 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, 0x35, 0x2c, + 0x88, 0x22, 0x7a, 0x9a, 0xeb, 0xa6, 0xbf, 0xbf, + 0xc6, 0x9d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, + 0x52, 0xc8, 0x82, 0x27, 0xa9, 0xae, 0xba, 0x6b, + 0xfb, 0xfc, 0x69, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, + 0xfe, 0x35, 0x2c, 0x88, 0x22, 0x7a, 0x9a, 0xeb, + 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, 0x75, 0xd3, + 0x5f, 0xdf, 0xe3, 0x52, 0xc8, 0x82, 0x27, 0xa9, + 0xae, 0xba, 0x6b, 0xfb, 0xfc, 0x69, 0xd4, 0xd7, + 0x5d, 0x35, 0xfd, 0xfe, 0x35, 0x2c, 0x88, 0x22, + 0x7a, 0x9a, 0xeb, 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, + 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x52, 0xc8, + 0x82, 0x27, 0xa9, 0xae, 0xba, 0x6b, 0xfb, 0xfc, + 0x69, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, 0x35, + 0x2c, 0x88, 0x22, 0x7a, 0x9a, 0xeb, 0xa6, 0xbf, + 0xbf, 0xc6, 0x9d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, + 0xe3, 0x52, 0xc8, 0x82, 0x27, 0xa9, 0xae, 0xba, + 0x6b, 0xfb, 0xfc, 0x69, 0xd4, 0xd7, 0x5d, 0x35, + 0xfd, 0xfe, 0x35, 0x2c, 0x88, 0x22, 0x7a, 0x9a, + 0xeb, 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, 0x75, + 0xd3, 0x5f, 0xdf, 0xe3, 0x52, 0xc8, 0x82, 0x27, + 0xa9, 0xae, 0xba, 0x6b, 0xfb, 0xfc, 0x69, 0xd4, + 0xd7, 0x5d, 0x35, 0xfd, 0xfe, 0x35, 0x2c, 0x88, + 0x22, 0x7a, 0x9a, 0xeb, 0xa6, 0xbf, 0xbf, 0xc6, + 0x9d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x52, + 0xc8, 0x82, 0x27, 0xa9, 0xae, 0xba, 0x6b, 0xfb, + 0xfc, 0x69, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, + 0x35, 0x2c, 0x88, 0x22, 0x7a, 0x9a, 0xeb, 0xa6, + 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, 0x75, 0xd3, 0x5f, + 0xdf, 0xe3, 0x52, 0xc8, 0x82, 0x27, 0xa9, 0xae, + 0xba, 0x6b, 0xfb, 0xfc, 0x69, 0xd4, 0xd7, 0x5d, + 0x35, 0xfd, 0xfe, 0x35, 0x2c, 0x88, 0x22, 0x7a, + 0x9a, 0xeb, 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, + 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x52, 0xc8, 0x82, + 0x27, 0xa9, 0xae, 0xba, 0x6b, 0xfb, 0xfc, 0x69, + 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, 0x35, 0x2c, + 0x88, 0x22, 0x7a, 0x9a, 0xeb, 0xa6, 0xbf, 0xbf, + 0xc6, 0x9d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, + 0x52, 0xc8, 0x82, 0x27, 0xa9, 0xae, 0xba, 0x6b, + 0xfb, 0xfc, 0x69, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, + 0xfe, 0x35, 0x2c, 0x88, 0x22, 0x7a, 0x9a, 0xeb, + 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, 0x75, 0xd3, + 0x5f, 0xdf, 0xe3, 0x52, 0xc8, 0x82, 0x27, 0xa9, + 0xae, 0xba, 0x6b, 0xfb, 0xfc, 0x69, 0xd4, 0xd7, + 0x5d, 0x35, 0xfd, 0xfe, 0x35, 0x2c, 0x88, 0x22, + 0x7a, 0x9a, 0xeb, 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, + 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x52, 0xc8, + 0x82, 0x27, 0xa9, 0xae, 0xba, 0x6b, 0xfb, 0xfc, + 0x69, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, 0x35, + 0x2c, 0x88, 0x22, 0x7a, 0x9a, 0xeb, 0xa6, 0xbf, + 0xbf, 0xc6, 0x9d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, + 0xe3, 0x52, 0xc8, 0x82, 0x27, 0xa9, 0xae, 0xba, + 0x6b, 0xfb, 0xfc, 0x69, 0xd4, 0xd7, 0x5d, 0x35, + 0xfd, 0xfe, 0x35, 0x2c, 0x88, 0x22, 0x7a, 0x9a, + 0xeb, 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, 0x75, + 0xd3, 0x5f, 0xdf, 0xe3, 0x52, 0xc8, 0x82, 0x27, + 0xa9, 0xae, 0xba, 0x6b, 0xfb, 0xfc, 0x69, 0xd4, + 0xd7, 0x5d, 0x35, 0xfd, 0xfe, 0x35, 0x2c, 0x88, + 0x22, 0x7a, 0x9a, 0xeb, 0xa6, 0xbf, 0xbf, 0xc6, + 0x9d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x52, + 0xc8, 0x82, 0x27, 0xa9, 0xae, 0xba, 0x6b, 0xfb, + 0xfc, 0x69, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, + 0x35, 0x2c, 0x88, 0x22, 0x7a, 0x9a, 0xeb, 0xa6, + 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, 0x75, 0xd3, 0x5f, + 0xdf, 0xe3, 0x52, 0xc8, 0x82, 0x27, 0xa9, 0xae, + 0xba, 0x6b, 0xfb, 0xfc, 0x69, 0xd4, 0xd7, 0x5d, + 0x35, 0xfd, 0xfe, 0x35, 0x2c, 0x88, 0x22, 0x7a, + 0x9a, 0xeb, 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, + 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x52, 0xc8, 0x82, + 0x27, 0xa9, 0xae, 0xba, 0x6b, 0xfb, 0xfc, 0x69, + 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, 0x35, 0x2c, + 0x88, 0x22, 0x7a, 0x9a, 0xeb, 0xa6, 0xbf, 0xbf, + 0xc6, 0x9d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, + 0x52, 0xc8, 0x82, 0x27, 0xa9, 0xae, 0xba, 0x6b, + 0xfb, 0xfc, 0x69, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, + 0xfe, 0x35, 0x2c, 0x88, 0x22, 0x7a, 0x9a, 0xeb, + 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, 0x75, 0xd3, + 0x5f, 0xdf, 0xe3, 0x52, 0xc8, 0x82, 0x27, 0xa9, + 0xae, 0xba, 0x6b, 0xfb, 0xfc, 0x69, 0xd4, 0xd7, + 0x5d, 0x35, 0xfd, 0xfe, 0x35, 0x2c, 0x88, 0x22, + 0x7a, 0x9a, 0xeb, 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, + 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x52, 0xc8, + 0x82, 0x27, 0xa9, 0xae, 0xba, 0x6b, 0xfb, 0xfc, + 0x69, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, 0x35, + 0x2c, 0x88, 0x22, 0x7a, 0x9a, 0xeb, 0xa6, 0xbf, + 0xbf, 0xc6, 0x9d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, + 0xe3, 0x52, 0xc8, 0x82, 0x27, 0xa9, 0xae, 0xba, + 0x6b, 0xfb, 0xfc, 0x69, 0xd4, 0xd7, 0x5d, 0x35, + 0xfd, 0xfe, 0x35, 0x2c, 0x88, 0x22, 0x7a, 0x9a, + 0xeb, 0xa6, 0xbf, 0xbf, 0xc6, 0x9d, 0x4d, 0x75, + 0xd3, 0x5f, 0xdf, 0xe3, 0x52, 0xc8, 0x82, 0x27, + 0xa9, 0xae, 0xba, 0x6b, 0xfb, 0xfc, 0x69, 0xd4, + 0xd7, 0x5d, 0x35, 0xfd, 0xfe, 0x35, 0x2b, 0x54, + 0x41, 0x15, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, + 0x34, 0xea, 0x6b, 0xae, 0x9a, 0xfe, 0xff, 0x00, + 0x1a, 0x95, 0x44, 0x11, 0x5d, 0x4d, 0x75, 0xd3, + 0x5f, 0xdf, 0xe3, 0x4e, 0xa6, 0xba, 0xe9, 0xaf, + 0xef, 0xf1, 0xa9, 0x54, 0x41, 0x15, 0xd4, 0xd7, + 0x5d, 0x35, 0xfd, 0xfe, 0x34, 0xea, 0x6b, 0xae, + 0x9a, 0xfe, 0xff, 0x00, 0x1a, 0x95, 0x44, 0x11, + 0x5d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x4e, + 0xa6, 0xba, 0xe9, 0xaf, 0xef, 0xf1, 0xa9, 0x54, + 0x41, 0x15, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, + 0x34, 0xea, 0x6b, 0xae, 0x9a, 0xfe, 0xff, 0x00, + 0x1a, 0x95, 0x44, 0x11, 0x5d, 0x4d, 0x75, 0xd3, + 0x5f, 0xdf, 0xe3, 0x4e, 0xa6, 0xba, 0xe9, 0xaf, + 0xef, 0xf1, 0xa9, 0x54, 0x41, 0x15, 0xd4, 0xd7, + 0x5d, 0x35, 0xfd, 0xfe, 0x34, 0xea, 0x6b, 0xae, + 0x9a, 0xfe, 0xff, 0x00, 0x1a, 0x95, 0x44, 0x11, + 0x5d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x4e, + 0xa6, 0xba, 0xe9, 0xaf, 0xef, 0xf1, 0xa9, 0x54, + 0x41, 0x15, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, + 0x34, 0xea, 0x6b, 0xae, 0x9a, 0xfe, 0xff, 0x00, + 0x1a, 0x95, 0x44, 0x11, 0x5d, 0x4d, 0x75, 0xd3, + 0x5f, 0xdf, 0xe3, 0x4e, 0xa6, 0xba, 0xe9, 0xaf, + 0xef, 0xf1, 0xa9, 0x54, 0x41, 0x15, 0xd4, 0xd7, + 0x5d, 0x35, 0xfd, 0xfe, 0x34, 0xea, 0x6b, 0xae, + 0x9a, 0xfe, 0xff, 0x00, 0x1a, 0x95, 0x44, 0x11, + 0x5d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x4e, + 0xa6, 0xba, 0xe9, 0xaf, 0xef, 0xf1, 0xa9, 0x54, + 0x41, 0x15, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, + 0x34, 0xea, 0x6b, 0xae, 0x9a, 0xfe, 0xff, 0x00, + 0x1a, 0x95, 0x44, 0x11, 0x5d, 0x4d, 0x75, 0xd3, + 0x5f, 0xdf, 0xe3, 0x4e, 0xa6, 0xba, 0xe9, 0xaf, + 0xef, 0xf1, 0xa9, 0x54, 0x41, 0x15, 0xd4, 0xd7, + 0x5d, 0x35, 0xfd, 0xfe, 0x34, 0xea, 0x6b, 0xae, + 0x9a, 0xfe, 0xff, 0x00, 0x1a, 0x95, 0x44, 0x11, + 0x5d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x4e, + 0xa6, 0xba, 0xe9, 0xaf, 0xef, 0xf1, 0xa9, 0x54, + 0x41, 0x15, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, + 0x34, 0xea, 0x6b, 0xae, 0x9a, 0xfe, 0xff, 0x00, + 0x1a, 0x95, 0x44, 0x11, 0x5d, 0x4d, 0x75, 0xd3, + 0x5f, 0xdf, 0xe3, 0x4e, 0xa6, 0xba, 0xe9, 0xaf, + 0xef, 0xf1, 0xa9, 0x54, 0x41, 0x15, 0xd4, 0xd7, + 0x5d, 0x35, 0xfd, 0xfe, 0x34, 0xea, 0x6b, 0xae, + 0x9a, 0xfe, 0xff, 0x00, 0x1a, 0x95, 0x44, 0x11, + 0x5d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x4e, + 0xa6, 0xba, 0xe9, 0xaf, 0xef, 0xf1, 0xa9, 0x54, + 0x41, 0x15, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, + 0x34, 0xea, 0x6b, 0xae, 0x9a, 0xfe, 0xff, 0x00, + 0x1a, 0x95, 0x44, 0x11, 0x5d, 0x4d, 0x75, 0xd3, + 0x5f, 0xdf, 0xe3, 0x4e, 0xa6, 0xba, 0xe9, 0xaf, + 0xef, 0xf1, 0xa9, 0x54, 0x41, 0x15, 0xd4, 0xd7, + 0x5d, 0x35, 0xfd, 0xfe, 0x34, 0xea, 0x6b, 0xae, + 0x9a, 0xfe, 0xff, 0x00, 0x1a, 0x95, 0x44, 0x11, + 0x5d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x4e, + 0xa6, 0xba, 0xe9, 0xaf, 0xef, 0xf1, 0xa9, 0x54, + 0x41, 0x15, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, + 0x34, 0xea, 0x6b, 0xae, 0x9a, 0xfe, 0xff, 0x00, + 0x1a, 0x95, 0x44, 0x11, 0x5d, 0x4d, 0x75, 0xd3, + 0x5f, 0xdf, 0xe3, 0x4e, 0xa6, 0xba, 0xe9, 0xaf, + 0xef, 0xf1, 0xa9, 0x54, 0x41, 0x15, 0xd4, 0xd7, + 0x5d, 0x35, 0xfd, 0xfe, 0x34, 0xea, 0x6b, 0xae, + 0x9a, 0xfe, 0xff, 0x00, 0x1a, 0x95, 0x44, 0x11, + 0x5d, 0x4d, 0x75, 0xd3, 0x5f, 0xdf, 0xe3, 0x4e, + 0xa6, 0xba, 0xe9, 0xaf, 0xef, 0xf1, 0xa9, 0x54, + 0x41, 0x15, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, + 0x34, 0xea, 0x6b, 0xae, 0x9a, 0xfe, 0xff, 0x00, + 0x1a, 0x95, 0x44, 0x11, 0x5d, 0x4d, 0x75, 0xd3, + 0x5f, 0xdf, 0xe3, 0x4e, 0xa6, 0xba, 0xe9, 0xaf, + 0xef, 0xf1, 0xa9, 0x54, 0x41, 0x15, 0xd4, 0xd7, + 0x5d, 0x35, 0xfd, 0xfe, 0x34, 0xea, 0x6b, 0xae, + 0x9a, 0xfe, 0xff, 0x00, 0x1a, 0x95, 0x59, 0x41, + 0x13, 0xd4, 0xd7, 0x5d, 0x35, 0xfd, 0xfe, 0x35, + 0xcd, 0x71, 0x6f, 0x75, 0x65, 0x71, 0x6c, 0x0d, + 0xcb, 0xe5, 0x12, 0xbc, 0x6b, 0x24, 0x01, 0x42, + 0x3b, 0x2a, 0x7d, 0x44, 0xe7, 0x3e, 0xf3, 0x65, + 0xe7, 0xfc, 0xa1, 0x06, 0x32, 0x5f, 0x7a, 0xbd, + 0xf3, 0xcf, 0xd6, 0x2a, 0x5d, 0x44, 0x64, 0xbe, + 0xf5, 0x7b, 0xe7, 0x9f, 0xac, 0x54, 0xba, 0x02, + 0x22, 0x20, 0xe7, 0xbc, 0xbf, 0xb1, 0xb0, 0x8c, + 0x4b, 0x7b, 0x71, 0x15, 0xac, 0x6e, 0x38, 0x5a, + 0xf9, 0x9e, 0xd8, 0xda, 0x4e, 0xba, 0x55, 0xe4, + 0x2e, 0x4f, 0x89, 0xf6, 0x6b, 0xef, 0x6b, 0x1f, + 0xfd, 0x98, 0xbd, 0x35, 0x59, 0xfc, 0x5c, 0xb4, + 0xba, 0xba, 0xd9, 0xfb, 0x58, 0xed, 0x61, 0x92, + 0x77, 0x8b, 0xa0, 0x4b, 0x63, 0x69, 0x79, 0x03, + 0x03, 0x86, 0xa6, 0x82, 0xbe, 0x46, 0x72, 0x3c, + 0xe8, 0xea, 0xcb, 0xee, 0x7f, 0x73, 0x27, 0xa2, + 0x83, 0xf4, 0x17, 0xc4, 0xfb, 0x35, 0xf7, 0xb5, + 0x8f, 0xfe, 0xcc, 0x5e, 0x9a, 0x7c, 0x4f, 0xb3, + 0x5f, 0x7b, 0x58, 0xff, 0x00, 0xec, 0xc5, 0xe9, + 0xaf, 0xce, 0x97, 0x16, 0x97, 0x56, 0xaf, 0x0c, + 0xba, 0x85, 0xf0, 0x3c, 0x8a, 0x86, 0x48, 0xd2, + 0xc3, 0x4e, 0xd3, 0xa8, 0x96, 0xf6, 0x97, 0x57, + 0x4e, 0x2d, 0xb5, 0x85, 0xf3, 0xb8, 0x0a, 0x96, + 0xc6, 0xd7, 0x3c, 0x81, 0xda, 0x6d, 0x50, 0x7e, + 0x8b, 0xf8, 0x9f, 0x66, 0xbe, 0xf6, 0xb1, 0xff, + 0x00, 0xd9, 0x8b, 0xd3, 0x5d, 0x96, 0x77, 0xd6, + 0x57, 0xf1, 0x73, 0xd6, 0x37, 0x11, 0x5d, 0x44, + 0x0e, 0x12, 0xf8, 0x5e, 0xd9, 0x1a, 0x0e, 0xf5, + 0x58, 0x48, 0x5f, 0x9c, 0x3a, 0x8f, 0x3b, 0xfb, + 0xbe, 0xe7, 0xf7, 0x32, 0x7a, 0x2b, 0xec, 0x3f, + 0x84, 0xb6, 0x97, 0x36, 0xdb, 0x37, 0x2b, 0x2e, + 0x22, 0x7c, 0x0f, 0x37, 0x2f, 0x21, 0xb2, 0x34, + 0xb4, 0xea, 0x68, 0x1a, 0x1c, 0x2a, 0x82, 0xc9, + 0x2e, 0xd1, 0x6c, 0xfc, 0x32, 0x3a, 0x29, 0x73, + 0x3b, 0x38, 0xe4, 0x61, 0x2d, 0x7b, 0x1f, 0x71, + 0x13, 0x5c, 0xd2, 0x35, 0x82, 0xd7, 0x38, 0x15, + 0x86, 0xed, 0x2e, 0xce, 0x39, 0xc1, 0xad, 0xcd, + 0x6c, 0x9c, 0xe3, 0xa0, 0x01, 0x71, 0x11, 0x24, + 0xf2, 0xd7, 0xc0, 0xb6, 0x9f, 0xfd, 0x47, 0x9a, + 0x7f, 0xe5, 0xcc, 0x6b, 0xd8, 0xe7, 0x1c, 0xa3, + 0x5a, 0x5c, 0xd2, 0x1c, 0xd3, 0x47, 0x03, 0x50, + 0x46, 0xe1, 0x1a, 0x50, 0x7e, 0xa1, 0x58, 0x24, + 0x0d, 0x27, 0x40, 0xdd, 0x27, 0x42, 0xe1, 0xc8, + 0x73, 0x01, 0x99, 0xe4, 0xb6, 0x59, 0x80, 0x38, + 0x8d, 0xcc, 0x0c, 0x7b, 0x8f, 0xf5, 0xb0, 0x80, + 0xff, 0x00, 0xa4, 0x0a, 0x67, 0xb9, 0x80, 0xcb, + 0x32, 0x6b, 0xdc, 0xc1, 0xda, 0xad, 0xa0, 0x7c, + 0x83, 0xb2, 0xe0, 0xd3, 0x84, 0x77, 0x4e, 0x84, + 0x1e, 0x1f, 0xb4, 0xbb, 0x3a, 0xc7, 0x16, 0x3f, + 0x35, 0xb3, 0x6b, 0xda, 0x48, 0x73, 0x5d, 0x71, + 0x10, 0x20, 0x8d, 0x60, 0x82, 0xf5, 0x96, 0x6d, + 0x1e, 0xcf, 0x48, 0xf6, 0xc7, 0x1e, 0x69, 0x67, + 0x24, 0x8f, 0x34, 0x63, 0x1b, 0x71, 0x11, 0x24, + 0x9d, 0x00, 0x00, 0x1e, 0xbf, 0x37, 0x3d, 0xce, + 0x7b, 0x9c, 0xf7, 0x1a, 0xb9, 0xc6, 0xae, 0x27, + 0x74, 0x9d, 0x6a, 0x4b, 0x66, 0x08, 0xf8, 0x93, + 0x2a, 0xdf, 0xf6, 0xb8, 0x3f, 0xea, 0x35, 0x07, + 0xe9, 0x04, 0x45, 0x82, 0x68, 0x2b, 0xbc, 0x83, + 0x2a, 0x32, 0xe3, 0x69, 0xf6, 0x76, 0xda, 0x69, + 0x20, 0xb8, 0xcc, 0xad, 0xa2, 0x96, 0x23, 0x49, + 0x23, 0x74, 0xac, 0x0e, 0x07, 0x5d, 0x28, 0x4a, + 0x8e, 0xdb, 0xad, 0xaa, 0x66, 0xce, 0x64, 0xce, + 0x92, 0x32, 0x0d, 0xfd, 0xcd, 0x62, 0xb4, 0x66, + 0xb3, 0x8b, 0x75, 0xe4, 0x6f, 0x37, 0xc2, 0xbe, + 0x07, 0x2c, 0xd2, 0x4b, 0x23, 0xa4, 0x94, 0x97, + 0xc8, 0xf2, 0x5c, 0xf7, 0x9d, 0x24, 0x92, 0x74, + 0x92, 0x50, 0x7e, 0x9b, 0xb7, 0xb9, 0x82, 0xea, + 0x06, 0x5c, 0x5b, 0x48, 0xd9, 0xa0, 0x90, 0x62, + 0x8e, 0x46, 0x10, 0x5a, 0xe1, 0xbe, 0x08, 0x5b, + 0x54, 0x0e, 0xc2, 0x7f, 0xa3, 0xb2, 0x9f, 0xfc, + 0x71, 0xe1, 0x72, 0x9d, 0xae, 0xfe, 0x8e, 0xca, + 0x05, 0x54, 0x76, 0x61, 0xb4, 0x99, 0x0e, 0x58, + 0xec, 0x17, 0xf7, 0xf0, 0x41, 0x20, 0xd7, 0x1b, + 0x9e, 0x0b, 0xc7, 0xf6, 0x1b, 0x57, 0x77, 0x97, + 0xcd, 0xf6, 0xfb, 0xf1, 0x22, 0xe6, 0x6b, 0x89, + 0x32, 0x9c, 0x8a, 0x53, 0x0d, 0xb4, 0x64, 0xb2, + 0x7b, 0xb6, 0x1a, 0x3a, 0x47, 0x0f, 0x29, 0xb1, + 0xbb, 0x71, 0xa3, 0xbe, 0xbe, 0x7d, 0x6d, 0x67, + 0x7d, 0x7f, 0x36, 0x0b, 0x58, 0xa4, 0xba, 0x9d, + 0xda, 0x4b, 0x23, 0x6b, 0x9e, 0xf3, 0xd9, 0xd0, + 0x0a, 0x0f, 0xbd, 0xc5, 0xb7, 0xfb, 0x1b, 0x2b, + 0xf0, 0x33, 0x35, 0x87, 0x11, 0xf9, 0xc1, 0xed, + 0x1c, 0x2e, 0x60, 0x0a, 0x6a, 0xd6, 0xf2, 0xd2, + 0xf2, 0x21, 0x35, 0xa4, 0xd1, 0xdc, 0x42, 0x75, + 0x4b, 0x13, 0x83, 0xdb, 0xc2, 0xd2, 0x57, 0xe7, + 0x5b, 0xcd, 0x99, 0xda, 0x1b, 0x18, 0x79, 0xfb, + 0xcc, 0xba, 0xe2, 0x18, 0x86, 0xb9, 0x1f, 0x1b, + 0xb0, 0x8e, 0xd9, 0xa6, 0x85, 0xe7, 0x27, 0xcf, + 0xf3, 0x4c, 0x92, 0xed, 0xb7, 0x79, 0x74, 0xee, + 0x85, 0xe0, 0xd5, 0xcc, 0x1a, 0x58, 0xe1, 0xbc, + 0xf6, 0xea, 0x21, 0x07, 0xe9, 0x24, 0x50, 0x7b, + 0x21, 0xb5, 0x16, 0xdb, 0x4b, 0x94, 0xb6, 0xf2, + 0x36, 0xf3, 0x57, 0x11, 0x9c, 0x17, 0x50, 0x56, + 0xb8, 0x1f, 0x4a, 0xe8, 0xaf, 0xe6, 0xbb, 0x71, + 0x4d, 0xd5, 0x01, 0x71, 0xdf, 0xe7, 0x59, 0x46, + 0x5a, 0xf6, 0xb3, 0x30, 0xbc, 0x86, 0xd1, 0xef, + 0x05, 0xcc, 0x6c, 0xaf, 0x0d, 0x24, 0x0d, 0x64, + 0x57, 0x71, 0x63, 0x37, 0xce, 0x72, 0xdc, 0x9a, + 0xc9, 0xf7, 0xb9, 0x8c, 0xc2, 0x18, 0x1a, 0x34, + 0x57, 0x5b, 0xcf, 0xcd, 0x60, 0xfc, 0xe2, 0x57, + 0xc1, 0x36, 0xb7, 0x69, 0x6e, 0x76, 0x8f, 0x39, + 0x96, 0xfe, 0x50, 0x59, 0x17, 0x91, 0x6d, 0x09, + 0xfc, 0xc8, 0xc6, 0xa1, 0xdb, 0x3a, 0xca, 0x0f, + 0xbf, 0x58, 0x66, 0xb9, 0x6e, 0x65, 0x1b, 0xa4, + 0xcb, 0xee, 0x63, 0xba, 0x63, 0x0e, 0x17, 0x3a, + 0x27, 0x07, 0x80, 0xed, 0x74, 0xf1, 0x7b, 0x6b, + 0xad, 0x7c, 0xef, 0xf0, 0x5f, 0x4e, 0x47, 0x7e, + 0x7f, 0xfe, 0x2e, 0xbf, 0xf2, 0xd8, 0x3e, 0x55, + 0xf4, 0x34, 0x0a, 0x85, 0xcb, 0x79, 0x9b, 0x65, + 0x56, 0x04, 0x0b, 0xeb, 0xc8, 0x2d, 0x49, 0xd4, + 0xd9, 0xa4, 0x6c, 0x64, 0xf6, 0x83, 0x88, 0x2a, + 0x8d, 0xf8, 0x99, 0xb7, 0x17, 0x59, 0x53, 0xc6, + 0x4b, 0x95, 0x49, 0xcd, 0xdd, 0xc8, 0xc0, 0xfb, + 0x99, 0xda, 0x68, 0xe8, 0xda, 0xef, 0x25, 0xac, + 0xde, 0x2e, 0x1a, 0x49, 0x5f, 0x2c, 0xb6, 0xb2, + 0xcd, 0x33, 0x6b, 0x97, 0x36, 0xda, 0x29, 0x6f, + 0xae, 0x9f, 0xe3, 0x3f, 0x00, 0x74, 0x8f, 0x3f, + 0xd6, 0x71, 0xd2, 0x83, 0xf4, 0x3d, 0xae, 0xd0, + 0x64, 0x57, 0x8f, 0x11, 0xda, 0x66, 0x16, 0xd3, + 0xbc, 0xea, 0x63, 0x25, 0x61, 0x27, 0xb9, 0x89, + 0x77, 0xd4, 0x70, 0xf8, 0x37, 0xd7, 0xe6, 0xab, + 0xfc, 0x9f, 0x35, 0xca, 0x9e, 0xd1, 0x98, 0x5a, + 0x4b, 0x6a, 0xe7, 0x79, 0x06, 0x56, 0x39, 0x80, + 0xf9, 0xa6, 0x94, 0x3d, 0xc5, 0x7a, 0xfc, 0x37, + 0xdb, 0xcb, 0xd6, 0x5f, 0xc3, 0x91, 0x66, 0x92, + 0xba, 0x6b, 0x6b, 0x82, 0x23, 0xb4, 0x99, 0xe4, + 0x97, 0xc7, 0x27, 0xe6, 0xb4, 0xbb, 0x75, 0xae, + 0xd5, 0xd8, 0x41, 0xf5, 0xba, 0xa3, 0x9c, 0xd6, + 0x34, 0xb9, 0xe4, 0x35, 0xa3, 0x5b, 0x9c, 0x68, + 0x3b, 0xeb, 0x5d, 0xcd, 0xc4, 0x36, 0xb6, 0xf2, + 0xdc, 0xdc, 0x3f, 0x9b, 0x86, 0x16, 0xba, 0x49, + 0x5e, 0x77, 0x1a, 0xdf, 0x19, 0xdd, 0xe0, 0xbe, + 0x0f, 0xb5, 0xfb, 0x73, 0x99, 0x6d, 0x1d, 0xdb, + 0xd8, 0x1e, 0xe8, 0x32, 0xd6, 0x9a, 0x43, 0x6a, + 0xd2, 0x43, 0x4b, 0x46, 0xa7, 0x49, 0x4f, 0x29, + 0xc5, 0x07, 0xda, 0x5d, 0xb5, 0x1b, 0x36, 0xc9, + 0x39, 0xb7, 0x66, 0xb6, 0x8d, 0x7e, 0xaa, 0x19, + 0xe3, 0xf4, 0x94, 0x84, 0x33, 0xc3, 0x3c, 0x62, + 0x58, 0x1e, 0xd9, 0x63, 0x70, 0xab, 0x5f, 0x1b, + 0x83, 0x9a, 0x47, 0x60, 0xb4, 0x95, 0xf9, 0xc9, + 0x9b, 0x39, 0x9f, 0xc9, 0x67, 0xed, 0xf1, 0xe5, + 0xf7, 0x0e, 0xb4, 0x22, 0xbc, 0xf0, 0x89, 0xc5, + 0xb4, 0xf9, 0xda, 0xb5, 0x76, 0x56, 0xed, 0x9d, + 0xda, 0x9c, 0xdf, 0x67, 0x6e, 0xc4, 0xf6, 0x32, + 0x9e, 0x6c, 0xba, 0xb3, 0x5b, 0x38, 0x93, 0x1c, + 0x80, 0x7c, 0xe6, 0xef, 0xf6, 0x75, 0xa0, 0xfd, + 0x17, 0xd8, 0xdd, 0x45, 0x1f, 0x90, 0xe7, 0x36, + 0x99, 0xe6, 0x55, 0x06, 0x67, 0x69, 0xa2, 0x39, + 0xc5, 0x4b, 0x09, 0xd2, 0xc7, 0x8d, 0x0f, 0x69, + 0xed, 0x15, 0x20, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x0b, 0x9b, 0x31, 0x95, 0xf0, 0xd8, + 0x5c, 0xcb, 0x19, 0xc2, 0xf8, 0xe2, 0x7b, 0xd8, + 0xed, 0xd0, 0x43, 0x49, 0xaf, 0x79, 0x74, 0xae, + 0x3c, 0xdf, 0xf9, 0x5d, 0xef, 0xd8, 0x49, 0xf5, + 0x1c, 0x83, 0xe7, 0x99, 0x3d, 0xe7, 0xe2, 0x1e, + 0x73, 0x6c, 0xeb, 0x9b, 0x2c, 0xc2, 0xb1, 0xb1, + 0xd8, 0x1d, 0x8f, 0x9b, 0x69, 0xa8, 0x15, 0xf5, + 0x45, 0x77, 0xfb, 0x17, 0xe2, 0x87, 0xde, 0x0c, + 0xe5, 0x47, 0xfc, 0x15, 0xd1, 0xf8, 0x6a, 0x3f, + 0xc8, 0xe7, 0xfb, 0x73, 0xf5, 0x55, 0xb7, 0xb8, + 0x10, 0x52, 0xbd, 0x8b, 0xf1, 0x43, 0xef, 0x06, + 0x72, 0xa3, 0xfe, 0x0a, 0x7b, 0x17, 0xe2, 0x87, + 0xde, 0x0c, 0xe5, 0x47, 0xfc, 0x15, 0x75, 0xee, + 0x04, 0xee, 0x04, 0x14, 0xaf, 0x62, 0xfc, 0x50, + 0xfb, 0xc1, 0x9c, 0xa8, 0xff, 0x00, 0x82, 0x9e, + 0xc5, 0xf8, 0xa1, 0xf7, 0x83, 0x39, 0x51, 0xff, + 0x00, 0x05, 0x5d, 0x7b, 0x81, 0x38, 0x10, 0x52, + 0xbd, 0x8b, 0xf1, 0x43, 0xef, 0x06, 0x72, 0xa3, + 0xfe, 0x0a, 0x7b, 0x17, 0xe2, 0x87, 0xde, 0x0c, + 0xe5, 0x47, 0xfc, 0x15, 0x70, 0xf6, 0x9b, 0x6a, + 0xfe, 0xd6, 0x3e, 0x50, 0xe3, 0x4f, 0x69, 0xb6, + 0xd5, 0xce, 0xc7, 0x53, 0xb9, 0x88, 0x6f, 0x76, + 0xd0, 0x53, 0xfd, 0x8b, 0xf1, 0x43, 0xef, 0x06, + 0x72, 0xa3, 0xfe, 0x0a, 0x7b, 0x17, 0xe2, 0x87, + 0xde, 0x0c, 0xe5, 0x47, 0xfc, 0x15, 0x75, 0xa7, + 0x60, 0x27, 0x70, 0x20, 0xa5, 0x7b, 0x17, 0xe2, + 0x87, 0xde, 0x0c, 0xe5, 0x47, 0xfc, 0x14, 0xf6, + 0x2f, 0xc5, 0x0f, 0xbc, 0x19, 0xca, 0x8f, 0xf8, + 0x2a, 0xeb, 0xdc, 0x09, 0xdc, 0x08, 0x29, 0x5e, + 0xc5, 0xf8, 0xa1, 0xf7, 0x83, 0x39, 0x51, 0xff, + 0x00, 0x05, 0x3d, 0x8b, 0xf1, 0x43, 0xef, 0x06, + 0x72, 0xa3, 0xfe, 0x0a, 0xba, 0xf7, 0x02, 0x77, + 0x02, 0x0a, 0x57, 0xb1, 0x7e, 0x28, 0x7d, 0xe0, + 0xce, 0x54, 0x7f, 0xc1, 0x4f, 0x62, 0xfc, 0x50, + 0xfb, 0xc1, 0x9c, 0xa8, 0xff, 0x00, 0x82, 0xae, + 0xbd, 0xc0, 0x9d, 0xc0, 0x82, 0x95, 0xec, 0x5f, + 0x8a, 0x1f, 0x78, 0x33, 0x95, 0x1f, 0xf0, 0x53, + 0xd8, 0xbf, 0x14, 0x3e, 0xf0, 0x67, 0x2a, 0x3f, + 0xe0, 0xab, 0xaf, 0x70, 0x27, 0x70, 0x20, 0xa5, + 0x7b, 0x17, 0xe2, 0x87, 0xde, 0x0c, 0xe5, 0x47, + 0xfc, 0x14, 0xf6, 0x2f, 0xc5, 0x0f, 0xbc, 0x19, + 0xca, 0x8f, 0xf8, 0x2a, 0xeb, 0xdc, 0x09, 0xdc, + 0x08, 0x29, 0x5e, 0xc5, 0xf8, 0xa1, 0xf7, 0x83, + 0x39, 0x51, 0xff, 0x00, 0x05, 0x3d, 0x8b, 0xf1, + 0x43, 0xef, 0x06, 0x72, 0xa3, 0xfe, 0x0a, 0xba, + 0xf0, 0x25, 0x3b, 0x01, 0x05, 0x2b, 0xd8, 0xbf, + 0x14, 0x3e, 0xf0, 0x67, 0x2a, 0x3f, 0xe0, 0xa7, + 0xb1, 0x7e, 0x28, 0x7d, 0xe0, 0xce, 0x54, 0x7f, + 0xc1, 0x57, 0x5e, 0xe0, 0x4e, 0xe0, 0x41, 0x4a, + 0xf6, 0x2f, 0xc5, 0x0f, 0xbc, 0x19, 0xca, 0x8f, + 0xf8, 0x29, 0xec, 0x5f, 0x8a, 0x1f, 0x78, 0x33, + 0x95, 0x1f, 0xf0, 0x55, 0xd7, 0xb8, 0x13, 0xb8, + 0x10, 0x52, 0xbd, 0x8b, 0xf1, 0x43, 0xef, 0x06, + 0x72, 0xa3, 0xfe, 0x0a, 0x7b, 0x17, 0xe2, 0x87, + 0xde, 0x0c, 0xe5, 0x47, 0xfc, 0x15, 0x75, 0xee, + 0x04, 0xee, 0x04, 0x14, 0xaf, 0x62, 0xfc, 0x50, + 0xfb, 0xc1, 0x9c, 0xa8, 0xff, 0x00, 0x82, 0x9e, + 0xc5, 0xf8, 0xa1, 0xf7, 0x83, 0x39, 0x51, 0xff, + 0x00, 0x05, 0x5d, 0x7b, 0x81, 0x3b, 0x81, 0x05, + 0x2b, 0xd8, 0xbf, 0x14, 0x3e, 0xf0, 0x67, 0x2a, + 0x3f, 0xe0, 0xa7, 0xb1, 0x7e, 0x28, 0x7d, 0xe0, + 0xce, 0x54, 0x7f, 0xc1, 0x57, 0x5e, 0xe0, 0x4e, + 0xe0, 0x41, 0x4a, 0xf6, 0x2f, 0xc5, 0x0f, 0xbc, + 0x19, 0xca, 0x8f, 0xf8, 0x29, 0xec, 0x5f, 0x8a, + 0x1f, 0x78, 0x33, 0x95, 0x1f, 0xf0, 0x55, 0xd7, + 0xb8, 0x13, 0xb8, 0x10, 0x7c, 0xe0, 0xe6, 0x5b, + 0x7e, 0x33, 0xb1, 0x91, 0xf5, 0x8f, 0xfd, 0xf3, + 0x80, 0x20, 0x7e, 0xaf, 0x06, 0x96, 0xe3, 0xf2, + 0xb9, 0xad, 0xe3, 0xbc, 0xa5, 0x3a, 0xb7, 0xf1, + 0x4f, 0xef, 0x08, 0xf9, 0x51, 0xff, 0x00, 0x05, + 0x78, 0x77, 0xff, 0x00, 0xaa, 0x31, 0x79, 0xad, + 0xff, 0x00, 0xa2, 0xd5, 0x7e, 0xe0, 0xdc, 0xf0, + 0x20, 0xa2, 0x75, 0x6f, 0xe2, 0x9f, 0xde, 0x11, + 0xf2, 0xa3, 0xfe, 0x0a, 0x75, 0x6f, 0xe2, 0x9f, + 0xde, 0x11, 0xf2, 0xa3, 0xfe, 0x0a, 0xbd, 0xf7, + 0x02, 0x77, 0x02, 0x0a, 0x27, 0x56, 0xfe, 0x29, + 0xfd, 0xe1, 0x1f, 0x2a, 0x3f, 0xe0, 0xa7, 0x56, + 0xfe, 0x29, 0xfd, 0xe1, 0x1f, 0x2a, 0x3f, 0xe0, + 0xab, 0xdd, 0x3b, 0x01, 0x29, 0xda, 0x41, 0x44, + 0xea, 0xdf, 0xc5, 0x3f, 0xbc, 0x23, 0xe5, 0x47, + 0xfc, 0x14, 0xea, 0xdf, 0xc5, 0x3f, 0xbc, 0x23, + 0xe5, 0x47, 0xfc, 0x15, 0x7b, 0xa1, 0xd1, 0xa0, + 0x25, 0x3b, 0x5c, 0x08, 0x28, 0x9d, 0x5b, 0xf8, + 0xa7, 0xf7, 0x84, 0x7c, 0xa8, 0xff, 0x00, 0x82, + 0x9d, 0x5b, 0xf8, 0xa7, 0xf7, 0x84, 0x7c, 0xa8, + 0xff, 0x00, 0x82, 0xaf, 0x74, 0xd3, 0x4a, 0x77, + 0x68, 0x56, 0x3b, 0x81, 0x05, 0x17, 0xab, 0x7f, + 0x14, 0xfe, 0xf0, 0x8f, 0x95, 0x1f, 0xf0, 0x53, + 0xab, 0x7f, 0x14, 0xfe, 0xf0, 0x8f, 0x95, 0x1f, + 0xf0, 0x55, 0xeb, 0x46, 0xed, 0x07, 0x6d, 0x66, + 0x9d, 0x80, 0x82, 0x89, 0xd5, 0xbf, 0x8a, 0x7f, + 0x78, 0x47, 0xca, 0x8f, 0xf8, 0x29, 0xd5, 0xbf, + 0x8a, 0x7f, 0x78, 0x47, 0xca, 0x8f, 0xf8, 0x2a, + 0xf7, 0xdc, 0x09, 0xdc, 0x08, 0x3e, 0x6f, 0x9b, + 0xcb, 0xf8, 0x8d, 0x93, 0xd9, 0x9b, 0xdb, 0xdc, + 0xc0, 0x08, 0x43, 0x9a, 0xcf, 0x10, 0xc6, 0xe3, + 0x57, 0x6a, 0xd1, 0xcd, 0x05, 0xd1, 0x67, 0x6f, + 0xf8, 0x9b, 0x79, 0x6b, 0x0d, 0xdc, 0x19, 0x83, + 0x79, 0xab, 0x86, 0x36, 0x58, 0xf1, 0x3a, 0x30, + 0x70, 0xbc, 0x62, 0x15, 0x1c, 0xca, 0x96, 0xfc, + 0x49, 0xff, 0x00, 0x4c, 0x11, 0xff, 0x00, 0xf1, + 0x10, 0xf8, 0x4a, 0x99, 0xd9, 0xc1, 0xff, 0x00, + 0xd7, 0xb2, 0xcf, 0xfc, 0x48, 0x7e, 0xa0, 0xe3, + 0x41, 0x55, 0xea, 0xdf, 0xc5, 0x3f, 0xbc, 0x23, + 0xe5, 0x47, 0xfc, 0x14, 0xea, 0xdf, 0xc5, 0x3f, + 0xbc, 0x23, 0xe5, 0x47, 0xfc, 0x15, 0x7b, 0xee, + 0x04, 0xa7, 0x60, 0x70, 0x20, 0xa2, 0x75, 0x6f, + 0xe2, 0x9f, 0xde, 0x11, 0xf2, 0xa3, 0xfe, 0x0a, + 0x75, 0x6f, 0xe2, 0x9f, 0xde, 0x11, 0xf2, 0xa3, + 0xfe, 0x0a, 0xbd, 0xd3, 0xb0, 0x12, 0x9d, 0x8e, + 0xf2, 0x0a, 0x27, 0x56, 0xfe, 0x29, 0xfd, 0xe1, + 0x1f, 0x2a, 0x3f, 0xe0, 0xa7, 0x56, 0xfe, 0x29, + 0xfd, 0xe1, 0x1f, 0x2a, 0x3f, 0xe0, 0xab, 0xd7, + 0x70, 0x76, 0x53, 0x80, 0xf6, 0x90, 0x51, 0x7a, + 0xb7, 0xf1, 0x4f, 0xef, 0x08, 0xf9, 0x51, 0xff, + 0x00, 0x05, 0x3a, 0xb7, 0xf1, 0x4f, 0xef, 0x08, + 0xf9, 0x51, 0xff, 0x00, 0x05, 0x5e, 0xe9, 0xda, + 0x4a, 0x76, 0x07, 0x02, 0x0a, 0x27, 0x56, 0xfe, + 0x29, 0xfd, 0xe1, 0x1f, 0x2a, 0x3f, 0xe0, 0xa7, + 0x56, 0xfe, 0x29, 0xfd, 0xe1, 0x1f, 0x2a, 0x3f, + 0xe0, 0xab, 0xdd, 0x3b, 0x14, 0xed, 0xac, 0x77, + 0x02, 0x0a, 0x2f, 0x56, 0xfe, 0x29, 0xfd, 0xe1, + 0x1f, 0x2a, 0x3f, 0xe0, 0xa7, 0x56, 0xfe, 0x29, + 0xfd, 0xe1, 0x1f, 0x2a, 0x3f, 0xe0, 0xab, 0xd8, + 0x15, 0xdc, 0x1d, 0xc4, 0xe0, 0x41, 0x44, 0xea, + 0xdf, 0xc5, 0x2f, 0xbc, 0x23, 0xe5, 0x47, 0xfc, + 0x15, 0xd9, 0xf8, 0x7b, 0x9c, 0x66, 0xf9, 0x9f, + 0x58, 0x37, 0x33, 0xb8, 0x75, 0xc3, 0xa0, 0x2c, + 0x0c, 0xc4, 0x1a, 0x30, 0xd6, 0xb5, 0xf2, 0x1a, + 0xd5, 0x6f, 0x03, 0x4f, 0xe5, 0xbe, 0xa8, 0xdf, + 0x86, 0x3f, 0xb5, 0xcd, 0xfe, 0xd1, 0x9e, 0x17, + 0x20, 0xbe, 0x28, 0x9c, 0xe7, 0xde, 0x6c, 0xbc, + 0xff, 0x00, 0x94, 0x29, 0x65, 0x13, 0x9c, 0xfb, + 0xcd, 0x97, 0x9f, 0xf2, 0x84, 0x18, 0xc9, 0x7d, + 0xea, 0xf7, 0xcf, 0x3f, 0x58, 0xa9, 0x75, 0x11, + 0x92, 0xfb, 0xd5, 0xef, 0x9e, 0x7e, 0xb1, 0x52, + 0xe8, 0x08, 0x88, 0x83, 0x09, 0x4a, 0x0a, 0x2c, + 0xa2, 0x0f, 0x8e, 0x7e, 0x33, 0x7f, 0xa8, 0x6d, + 0x7f, 0xf1, 0x47, 0xd6, 0x72, 0xf5, 0xf8, 0x30, + 0x7f, 0xcf, 0x2f, 0x69, 0xd1, 0x7f, 0xbe, 0x17, + 0x9f, 0xc6, 0x7f, 0xf5, 0x0d, 0xa7, 0xfe, 0x28, + 0xfa, 0xce, 0x59, 0xfc, 0x17, 0xfe, 0x79, 0x7b, + 0xff, 0x00, 0x8b, 0xfd, 0xf0, 0x83, 0xec, 0x2b, + 0x22, 0xb5, 0xee, 0xa2, 0x0d, 0x61, 0x07, 0xe6, + 0xfd, 0xa6, 0xff, 0x00, 0x52, 0xe6, 0x7f, 0xf9, + 0x73, 0x7d, 0x72, 0xb5, 0xe6, 0x59, 0x71, 0xb5, + 0xb5, 0xcb, 0xee, 0x47, 0x91, 0x7b, 0x6f, 0xce, + 0x8f, 0x39, 0xaf, 0x74, 0x6e, 0xf0, 0x2d, 0x9b, + 0x4f, 0xfe, 0xa4, 0xcd, 0x3f, 0xf2, 0xe6, 0xfa, + 0xe5, 0x58, 0xf3, 0xec, 0xbb, 0x9c, 0xfc, 0x38, + 0xd9, 0xfc, 0xc8, 0x0f, 0x77, 0x92, 0x58, 0x64, + 0x3b, 0xb8, 0x64, 0x73, 0x9c, 0xde, 0xfb, 0x0a, + 0x0b, 0xaf, 0xe1, 0x16, 0x65, 0xed, 0x5b, 0x32, + 0xeb, 0x37, 0x12, 0x5f, 0x61, 0x3b, 0x99, 0xa7, + 0xe6, 0xc9, 0xe3, 0xb6, 0x9d, 0x8d, 0x69, 0xf8, + 0xb9, 0x99, 0x8b, 0x5d, 0x96, 0x6d, 0xab, 0x0d, + 0x1f, 0x98, 0x4c, 0xd6, 0x53, 0x7d, 0x8c, 0xfd, + 0x63, 0xbb, 0xe1, 0xaa, 0xa9, 0xf8, 0x37, 0x98, + 0xf3, 0x19, 0xed, 0xce, 0x5e, 0xe3, 0x46, 0xde, + 0x43, 0x89, 0xba, 0x74, 0x63, 0x88, 0xd7, 0xc0, + 0x4a, 0xf5, 0xf8, 0xc9, 0x98, 0x89, 0xb3, 0xbb, + 0x4c, 0xb8, 0x1f, 0x16, 0xce, 0x0c, 0x4e, 0x1b, + 0x98, 0xa5, 0x35, 0xfa, 0xa0, 0x20, 0xa5, 0xe5, + 0xf9, 0x71, 0xba, 0xb6, 0xbf, 0xb9, 0xa1, 0xc1, + 0x63, 0x00, 0x98, 0x9d, 0xca, 0xba, 0x48, 0xe2, + 0x03, 0xe9, 0x93, 0xdc, 0x5b, 0x36, 0x63, 0xfd, + 0x49, 0x95, 0x7f, 0xe5, 0xc1, 0xff, 0x00, 0x51, + 0xaa, 0xc7, 0x90, 0x65, 0xdc, 0xd7, 0xe1, 0xc6, + 0xd0, 0xe6, 0x4e, 0x14, 0x33, 0xbe, 0xde, 0x16, + 0x79, 0xb1, 0xcd, 0x19, 0x77, 0xd6, 0x55, 0xcd, + 0x98, 0xff, 0x00, 0x52, 0x65, 0x5f, 0xf9, 0x70, + 0x7f, 0xd4, 0x6a, 0x0f, 0xd2, 0x3b, 0xab, 0x4d, + 0xdd, 0xdd, 0xbd, 0x9d, 0xac, 0xb7, 0x57, 0x2f, + 0xe6, 0xe0, 0x85, 0xa5, 0xef, 0x79, 0xd1, 0x46, + 0x81, 0x55, 0xb8, 0xee, 0xaf, 0x93, 0x7e, 0x2b, + 0xed, 0x77, 0xb4, 0x4c, 0x36, 0x76, 0xc9, 0xff, + 0x00, 0xa9, 0x84, 0x87, 0x5f, 0x3d, 0xa7, 0x43, + 0xa4, 0x1e, 0x4c, 0x5f, 0xd9, 0xd6, 0xee, 0xcf, + 0x69, 0x05, 0x4f, 0x69, 0xb3, 0xcb, 0xdd, 0xac, + 0xcf, 0xcc, 0xed, 0x6b, 0x9c, 0x25, 0x70, 0x86, + 0xc6, 0xdc, 0x69, 0xc2, 0xca, 0xd1, 0x83, 0xb6, + 0xed, 0xd5, 0x0d, 0x75, 0x04, 0x96, 0xd3, 0xcb, + 0x6f, 0x28, 0xa4, 0x90, 0xb9, 0xd1, 0xbc, 0x6f, + 0x39, 0xa7, 0x0b, 0x87, 0x08, 0x5f, 0x4c, 0xfc, + 0x25, 0xd9, 0x20, 0xe2, 0x36, 0x92, 0xf5, 0x95, + 0x00, 0x96, 0x58, 0x31, 0xc3, 0x74, 0x79, 0x73, + 0x7c, 0x81, 0x7c, 0xeb, 0x3a, 0x24, 0xe6, 0xf7, + 0xe3, 0x7a, 0xe6, 0x6a, 0x7e, 0xf1, 0xc8, 0x3e, + 0xf3, 0xb0, 0x7f, 0xe8, 0xec, 0xa7, 0xff, 0x00, + 0x1c, 0x7d, 0x67, 0x2e, 0x7f, 0xc4, 0x5c, 0xea, + 0x4c, 0x9f, 0x65, 0xee, 0x65, 0x85, 0xd8, 0x6e, + 0x2e, 0x48, 0xb6, 0x80, 0xee, 0x83, 0x27, 0x96, + 0x79, 0x00, 0xae, 0x8d, 0x83, 0xff, 0x00, 0x47, + 0x65, 0x3f, 0xf8, 0xe3, 0xeb, 0x39, 0x54, 0xbf, + 0x1b, 0x26, 0x73, 0x6c, 0xb2, 0xa8, 0x41, 0xf1, + 0x5f, 0x2c, 0xcf, 0x70, 0xec, 0xb5, 0xb1, 0xb4, + 0x7d, 0x62, 0x83, 0xe5, 0xd6, 0x56, 0x93, 0x5f, + 0x5e, 0x41, 0x67, 0x08, 0xac, 0xb7, 0x32, 0x36, + 0x26, 0x57, 0xe7, 0x3c, 0xe1, 0x0b, 0xf4, 0x3e, + 0xcf, 0x6c, 0xe6, 0x5f, 0xb3, 0xd9, 0x74, 0x76, + 0x36, 0x4c, 0x00, 0x80, 0x0c, 0xf3, 0x7e, 0x7c, + 0x92, 0x53, 0x4b, 0x9c, 0xe1, 0xde, 0x0b, 0xe2, + 0xdf, 0x87, 0x11, 0x09, 0xb6, 0xd3, 0x2d, 0x63, + 0x80, 0x34, 0x7b, 0xe4, 0x1d, 0xb6, 0x46, 0xf7, + 0x8e, 0xf8, 0x5f, 0x7e, 0xed, 0x20, 0xc1, 0x68, + 0x70, 0x2d, 0x70, 0x04, 0x3b, 0x58, 0x3a, 0x8f, + 0x6e, 0xab, 0xe4, 0x7b, 0x71, 0xf8, 0x75, 0x7c, + 0x73, 0xb6, 0x4b, 0xb3, 0xb6, 0x4e, 0x96, 0xd6, + 0xf1, 0xb8, 0xdf, 0x1b, 0x08, 0x6b, 0x23, 0x78, + 0x3e, 0x30, 0xab, 0x88, 0x00, 0x15, 0xf5, 0xd5, + 0x8a, 0x0a, 0xd5, 0x05, 0x03, 0xf0, 0xe7, 0x63, + 0x36, 0x8b, 0x67, 0x6f, 0x67, 0xb8, 0xbf, 0x7c, + 0x2d, 0xb6, 0xb9, 0x88, 0x31, 0xf0, 0x31, 0xe5, + 0xee, 0xc4, 0xd2, 0x0b, 0x5c, 0x48, 0x18, 0x74, + 0x0a, 0x8d, 0x7b, 0xaa, 0xd3, 0xb5, 0x59, 0xa5, + 0xc6, 0x51, 0xb3, 0xd7, 0xb9, 0x95, 0xb0, 0x69, + 0x9e, 0xde, 0x30, 0xe8, 0xc3, 0xc5, 0x5b, 0x52, + 0xe0, 0xdd, 0x3c, 0x2a, 0x5a, 0x9d, 0xd5, 0xc3, + 0x9e, 0xe5, 0x31, 0x67, 0x59, 0x55, 0xc6, 0x57, + 0x34, 0x8e, 0x8a, 0x3b, 0x96, 0xe1, 0x74, 0x8d, + 0xa1, 0x70, 0x00, 0x83, 0xa2, 0xba, 0x37, 0x10, + 0x7c, 0x03, 0x30, 0xcd, 0x73, 0xcd, 0xa5, 0xbf, + 0x6b, 0xee, 0xe5, 0x96, 0xf6, 0xee, 0x53, 0x86, + 0x18, 0x9a, 0x34, 0x0a, 0xee, 0x32, 0x31, 0xa0, + 0x77, 0x17, 0x3e, 0x75, 0x93, 0xde, 0x64, 0xb7, + 0xc6, 0xc2, 0xf9, 0xa1, 0x97, 0x0d, 0x63, 0x1e, + 0xf6, 0x03, 0x5c, 0x38, 0xda, 0x1f, 0x84, 0x9d, + 0xf1, 0x5d, 0x2b, 0xef, 0x9b, 0x3f, 0xb2, 0x39, + 0x16, 0xcf, 0x47, 0x4c, 0xbe, 0xdc, 0x09, 0x8e, + 0x87, 0xdc, 0x48, 0x43, 0xe5, 0x3a, 0x37, 0x5d, + 0xb9, 0x5e, 0xc2, 0xf9, 0x17, 0xe2, 0xa7, 0xfa, + 0xd6, 0xf0, 0x7f, 0x52, 0x1f, 0xfa, 0x6d, 0x41, + 0x73, 0xfc, 0x16, 0xfe, 0x45, 0x7f, 0xff, 0x00, + 0x95, 0xfd, 0xc8, 0xd7, 0xd1, 0x02, 0xf9, 0xdf, + 0xe0, 0xb7, 0xf2, 0x2b, 0xff, 0x00, 0xfc, 0xaf, + 0xee, 0x46, 0xbe, 0x88, 0x83, 0xe3, 0xfb, 0x55, + 0xf8, 0x7d, 0xb6, 0x19, 0x96, 0x79, 0x7d, 0x99, + 0x32, 0x08, 0xe6, 0x8a, 0xe2, 0x57, 0x3e, 0x3c, + 0x32, 0xb6, 0xb8, 0x7f, 0x34, 0x78, 0xd4, 0xdc, + 0x0a, 0xe9, 0xf8, 0x73, 0xb3, 0x93, 0xe4, 0x79, + 0x16, 0x1b, 0xd8, 0x3d, 0x9f, 0x31, 0x9e, 0x47, + 0x3e, 0xe0, 0x12, 0xd7, 0x3b, 0x08, 0x38, 0x62, + 0x15, 0x61, 0x70, 0xa5, 0x3b, 0x2a, 0xd7, 0x44, + 0x41, 0x5d, 0xfc, 0x40, 0xb4, 0xb5, 0xb8, 0xd8, + 0xfc, 0xcb, 0xda, 0x40, 0x3c, 0xcc, 0x46, 0x58, + 0x9c, 0xed, 0x34, 0x91, 0xbe, 0x4d, 0x3b, 0x7a, + 0x97, 0xc1, 0xec, 0x5c, 0xf6, 0xdf, 0x5b, 0xbe, + 0x32, 0x44, 0x8d, 0x95, 0x85, 0xa7, 0xb3, 0x88, + 0x2f, 0xa1, 0xfe, 0x29, 0x6d, 0xb4, 0x37, 0x6d, + 0x76, 0xcf, 0x65, 0xaf, 0x12, 0x46, 0xc7, 0x03, + 0x7d, 0x3b, 0x75, 0x17, 0x33, 0x54, 0x4d, 0xdf, + 0xa1, 0xd6, 0xab, 0x9f, 0x87, 0x7b, 0x3d, 0x26, + 0x73, 0xb4, 0x70, 0x39, 0xec, 0x26, 0xd2, 0xc5, + 0xc2, 0x7b, 0x87, 0x53, 0x47, 0x8a, 0x6a, 0xc6, + 0x76, 0xdc, 0xe4, 0x1f, 0x4d, 0xfc, 0x52, 0xbb, + 0x96, 0xdf, 0x63, 0xae, 0x43, 0x4e, 0x17, 0x5c, + 0xbe, 0x28, 0x9d, 0x4d, 0xe2, 0xe0, 0xe7, 0x8e, + 0xed, 0x28, 0xbe, 0x45, 0xb2, 0x56, 0x11, 0x66, + 0x5b, 0x4b, 0x96, 0xd9, 0xce, 0xdc, 0x51, 0x4d, + 0x3b, 0x39, 0xc1, 0xbe, 0xd1, 0xe3, 0x11, 0xdd, + 0xa2, 0xfb, 0x1f, 0xe2, 0x4e, 0x5f, 0x2d, 0xfe, + 0xc8, 0x5e, 0xb6, 0x31, 0x8a, 0x58, 0x30, 0x5c, + 0x01, 0xbe, 0x23, 0x75, 0x5d, 0xf4, 0x4a, 0xf8, + 0xbe, 0xce, 0xe6, 0x4c, 0xca, 0x73, 0xdb, 0x0c, + 0xc5, 0xe2, 0xb1, 0xdb, 0x4e, 0xc7, 0xbc, 0x0d, + 0x65, 0xb5, 0xa3, 0xbb, 0xc8, 0x3f, 0x47, 0x86, + 0xb4, 0x00, 0xd0, 0x00, 0x68, 0x18, 0x43, 0x77, + 0x00, 0xde, 0xa2, 0xf8, 0x4f, 0xe2, 0x66, 0x4f, + 0x6f, 0x94, 0xed, 0x44, 0xad, 0xb6, 0x60, 0x8e, + 0x0b, 0xb8, 0xdb, 0x72, 0xc6, 0x0d, 0x40, 0xb8, + 0x96, 0xba, 0x9d, 0x8c, 0x4d, 0x2b, 0xee, 0x16, + 0xf7, 0x96, 0xb7, 0x36, 0xed, 0xba, 0xb7, 0x95, + 0x92, 0xdb, 0xc8, 0x31, 0x32, 0x50, 0xe1, 0x84, + 0xb4, 0xee, 0xd5, 0x7c, 0x3b, 0xf1, 0x2f, 0x3a, + 0xb6, 0xcd, 0xf6, 0xa2, 0x47, 0xda, 0x3c, 0x4b, + 0x05, 0xac, 0x6d, 0xb7, 0x64, 0x83, 0x53, 0x8b, + 0x6a, 0xe7, 0x11, 0xfd, 0xa7, 0x14, 0x16, 0x8f, + 0xc1, 0x7c, 0xcd, 0xc5, 0xb9, 0x8e, 0x56, 0xe2, + 0x4e, 0x12, 0xcb, 0x98, 0xdb, 0xbd, 0x5a, 0xc7, + 0x25, 0x3e, 0x82, 0x9e, 0xda, 0x5f, 0xc4, 0x88, + 0x76, 0x73, 0x32, 0x75, 0x85, 0xe6, 0x59, 0x33, + 0xc1, 0x68, 0x7c, 0x33, 0xb2, 0x46, 0x60, 0x91, + 0xa7, 0xf3, 0x9b, 0xa3, 0x7f, 0x42, 0xa4, 0xfe, + 0x0e, 0x48, 0x59, 0xb5, 0x13, 0x30, 0x6a, 0x92, + 0xd2, 0x40, 0x7b, 0x8e, 0x63, 0xbe, 0x45, 0xf4, + 0x5d, 0xb6, 0xd9, 0x48, 0xb6, 0x97, 0x28, 0x74, + 0x0d, 0xa3, 0x6f, 0xad, 0xeb, 0x25, 0x9c, 0xa7, + 0xe7, 0x53, 0x4b, 0x0f, 0x61, 0xfe, 0x14, 0x1c, + 0x1b, 0x33, 0xf8, 0x9b, 0x95, 0x6d, 0x06, 0x68, + 0xcc, 0xb1, 0xb6, 0xf2, 0x59, 0xcb, 0x2b, 0x49, + 0x89, 0xd2, 0xb9, 0xa4, 0x39, 0xc3, 0x4e, 0x01, + 0x4a, 0x69, 0x23, 0x52, 0xb7, 0x4d, 0x3c, 0x50, + 0x42, 0xf9, 0xe7, 0x78, 0x8e, 0x28, 0xda, 0x5e, + 0xf7, 0x9d, 0x41, 0xad, 0x15, 0x27, 0xbc, 0xbf, + 0x34, 0x34, 0xdd, 0x58, 0x5d, 0xb5, 0xcd, 0x2e, + 0x82, 0xee, 0xda, 0x4a, 0xe9, 0xd0, 0xe6, 0x3d, + 0x87, 0xc2, 0x08, 0x57, 0x5d, 0xaf, 0xfc, 0x47, + 0x76, 0x77, 0x90, 0x5a, 0x65, 0xd6, 0xc0, 0xc5, + 0x2d, 0xc3, 0x03, 0xb3, 0x42, 0x34, 0x02, 0xf6, + 0xf8, 0xb8, 0x1b, 0xd8, 0x71, 0x18, 0x90, 0x58, + 0xa5, 0xfc, 0x68, 0xca, 0x5b, 0x23, 0x9b, 0x1e, + 0x5d, 0x3c, 0x8d, 0x04, 0x86, 0x3f, 0x1b, 0x46, + 0x20, 0x35, 0x1a, 0x53, 0x45, 0x42, 0xb6, 0xec, + 0xce, 0x7e, 0xed, 0xa0, 0xcb, 0x86, 0x62, 0x2c, + 0xe4, 0xb2, 0x86, 0x47, 0x11, 0x08, 0x95, 0xc1, + 0xc6, 0x46, 0x8d, 0x6f, 0x18, 0x75, 0x0a, 0xaf, + 0x8a, 0x6c, 0x46, 0xca, 0xcd, 0xb4, 0xb9, 0xbb, + 0x60, 0x20, 0xb6, 0xca, 0xde, 0x92, 0x5e, 0x49, + 0xbc, 0xca, 0xf9, 0x03, 0xfa, 0xce, 0xd4, 0x17, + 0xdf, 0xa0, 0x82, 0x1b, 0x78, 0x59, 0x04, 0x0c, + 0x11, 0xc5, 0x13, 0x43, 0x18, 0xc0, 0x28, 0x03, + 0x40, 0xa0, 0x68, 0xec, 0x20, 0xd8, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x0b, + 0x8f, 0x37, 0xfe, 0x57, 0x7b, 0xf6, 0x12, 0x7d, + 0x47, 0x2e, 0xc5, 0xc7, 0x9b, 0xff, 0x00, 0x2b, + 0xbd, 0xfb, 0x09, 0x3e, 0xa3, 0x90, 0x55, 0x3f, + 0x0d, 0x7f, 0x91, 0xcf, 0xf6, 0xe7, 0xea, 0xab, + 0x62, 0xa9, 0xfe, 0x1a, 0xff, 0x00, 0x23, 0x9f, + 0xed, 0xcf, 0xd5, 0x56, 0xc4, 0x04, 0x44, 0x40, + 0x42, 0x2a, 0x0f, 0x67, 0x46, 0xff, 0x00, 0x79, + 0x11, 0x07, 0xcd, 0x76, 0x9b, 0x62, 0xa3, 0xca, + 0x2c, 0x24, 0xcc, 0x5b, 0x76, 0xe9, 0x89, 0x94, + 0x0c, 0x0e, 0x65, 0x07, 0x8e, 0x4e, 0xef, 0x61, + 0x7a, 0xd9, 0x9d, 0x8a, 0x66, 0x6b, 0x97, 0x43, + 0x9a, 0x1b, 0xb7, 0x42, 0x79, 0xd7, 0x7e, 0xaf, + 0x03, 0x48, 0xfd, 0x5b, 0xb4, 0x69, 0x3b, 0x86, + 0x8a, 0xc7, 0xf8, 0x85, 0xfe, 0x9c, 0x7d, 0x34, + 0x7e, 0xb6, 0x3f, 0x0a, 0x8c, 0xca, 0x2e, 0x24, + 0xb7, 0xfc, 0x36, 0xb8, 0x99, 0x86, 0x8e, 0xfd, + 0x73, 0x6a, 0x3f, 0xac, 0xf0, 0xdf, 0x95, 0x04, + 0xc5, 0xde, 0xdd, 0xec, 0xe5, 0xbd, 0xc1, 0x87, + 0x9e, 0x7c, 0x94, 0x24, 0x17, 0xc6, 0xca, 0xb0, + 0x69, 0xdf, 0xa8, 0xd5, 0xd8, 0x52, 0x4d, 0xce, + 0xf2, 0xc7, 0xe5, 0xa7, 0x35, 0x64, 0xc1, 0xf6, + 0x6d, 0x18, 0x8c, 0x8d, 0xd3, 0x4a, 0x10, 0x08, + 0x23, 0x7f, 0x4a, 0xf9, 0xce, 0xcf, 0x66, 0x7b, + 0x3b, 0x67, 0x94, 0xdd, 0x5b, 0xe6, 0x56, 0xcf, + 0x9e, 0xea, 0xe0, 0x90, 0xd9, 0x04, 0x6d, 0x7e, + 0x11, 0x4a, 0x34, 0x35, 0xee, 0x70, 0xc3, 0xd9, + 0xa2, 0xf7, 0x90, 0x4c, 0xff, 0x00, 0x85, 0xb3, + 0xfb, 0x67, 0x57, 0x03, 0x19, 0x1b, 0xc0, 0xdc, + 0xab, 0xcd, 0x1d, 0x4e, 0x4a, 0x0b, 0x9c, 0x9b, + 0x6f, 0xb3, 0x91, 0xdb, 0x36, 0xe3, 0xda, 0x1c, + 0xf6, 0xbd, 0xc5, 0xad, 0x63, 0x18, 0xe2, 0xf2, + 0x5b, 0xe5, 0x78, 0xa6, 0x9a, 0x17, 0xb3, 0xb6, + 0x3b, 0x3e, 0x2c, 0x05, 0xff, 0x00, 0xb4, 0x56, + 0x27, 0x38, 0xc6, 0xd6, 0x61, 0x3c, 0xe1, 0x70, + 0xd3, 0x87, 0x07, 0x69, 0x55, 0xb6, 0x47, 0x26, + 0xcb, 0x6e, 0xb6, 0x6f, 0x34, 0xba, 0xba, 0xb7, + 0x6c, 0xb3, 0xb7, 0x1b, 0x19, 0x23, 0x86, 0x96, + 0x86, 0xb3, 0x10, 0xc3, 0xbd, 0xa5, 0x78, 0xfc, + 0x3c, 0xca, 0xac, 0x33, 0x07, 0x5f, 0xba, 0xf6, + 0x06, 0xce, 0x23, 0x63, 0x1a, 0xc0, 0xfd, 0x20, + 0x63, 0xc5, 0x88, 0xd3, 0x7f, 0xc5, 0x08, 0x2e, + 0xd9, 0x4e, 0xd0, 0x65, 0x59, 0xc4, 0x52, 0xcb, + 0x63, 0x23, 0x8f, 0x31, 0xa6, 0x56, 0x3d, 0xb8, + 0x5e, 0xd1, 0xbe, 0x5b, 0xa5, 0x71, 0x0d, 0xb8, + 0xd9, 0xa3, 0x04, 0x97, 0x0d, 0xba, 0x25, 0x91, + 0x61, 0xc4, 0xdc, 0x04, 0x3c, 0x97, 0xd7, 0x08, + 0x68, 0x3a, 0xf5, 0x2a, 0xa6, 0xc0, 0x8e, 0x6f, + 0x39, 0xcc, 0xa2, 0x66, 0x86, 0x0b, 0x69, 0x80, + 0x1d, 0x86, 0xc8, 0xda, 0x2d, 0x7f, 0x87, 0x99, + 0x65, 0x96, 0x61, 0x7b, 0x3b, 0xef, 0x22, 0x6c, + 0xcc, 0xb7, 0x88, 0x16, 0x31, 0xfa, 0x5a, 0x1c, + 0xf3, 0xae, 0x9d, 0xa6, 0xa0, 0xbe, 0x65, 0x1b, + 0x41, 0x95, 0xe7, 0x2d, 0x90, 0xd8, 0xc8, 0x4b, + 0xe2, 0xfd, 0xa4, 0x4f, 0x18, 0x5e, 0xda, 0xea, + 0x34, 0xd3, 0xa1, 0x73, 0xe6, 0xbb, 0x5d, 0x91, + 0xe5, 0x53, 0x9b, 0x6b, 0x99, 0x9c, 0xe9, 0xdb, + 0x4c, 0x71, 0xc4, 0xdc, 0x65, 0x84, 0xea, 0xc4, + 0x6a, 0x07, 0x73, 0x5a, 0xa7, 0xec, 0xf3, 0x5b, + 0x95, 0xed, 0xcd, 0xcd, 0xa4, 0x1e, 0x2c, 0x2c, + 0xf6, 0x88, 0xda, 0xd1, 0xab, 0x0b, 0x58, 0xe9, + 0x40, 0xfa, 0x2b, 0x87, 0x66, 0xb3, 0x7c, 0xa2, + 0xdb, 0x33, 0xb9, 0xbf, 0xce, 0x60, 0x75, 0xdf, + 0x3b, 0x53, 0x18, 0xe6, 0xc4, 0xa0, 0x39, 0xee, + 0x35, 0x25, 0xae, 0xa0, 0xae, 0xf1, 0x41, 0xf4, + 0x8c, 0xaf, 0x3c, 0xcb, 0x33, 0x68, 0x5f, 0x35, + 0x8c, 0xb8, 0xdb, 0x1f, 0x96, 0xc7, 0x02, 0xd7, + 0xb6, 0xba, 0x45, 0x5a, 0xb8, 0xdb, 0xb6, 0x7b, + 0x3a, 0xe8, 0x66, 0x9c, 0x5c, 0x9c, 0x10, 0x53, + 0x1d, 0x58, 0xe0, 0x6a, 0xea, 0x80, 0xd6, 0x82, + 0x34, 0x9a, 0xaa, 0x86, 0xc8, 0x5c, 0xc4, 0xdd, + 0xa8, 0xba, 0xf6, 0x56, 0xba, 0x3b, 0x2b, 0xa8, + 0xe7, 0x0d, 0x8d, 0xe3, 0x0f, 0x89, 0x87, 0x1b, + 0x41, 0xd3, 0xb8, 0xb9, 0xb6, 0x2b, 0x23, 0xb2, + 0xce, 0x33, 0x39, 0xd9, 0x7b, 0x57, 0xc5, 0x03, + 0x31, 0x96, 0x37, 0x45, 0x49, 0x76, 0x16, 0x82, + 0x77, 0x82, 0x0b, 0xfc, 0xdb, 0x4d, 0x93, 0x5b, + 0xe5, 0xb0, 0x66, 0x73, 0xca, 0xe8, 0xa0, 0xba, + 0x05, 0xd0, 0x30, 0xb7, 0xf5, 0x8e, 0xa6, 0xe6, + 0x15, 0xcd, 0x97, 0xed, 0xae, 0xcf, 0xdf, 0xdc, + 0x36, 0xda, 0x39, 0x9f, 0x1c, 0x8f, 0x38, 0x59, + 0xce, 0xb0, 0xb4, 0x38, 0xef, 0x02, 0x31, 0x6e, + 0xa8, 0xcd, 0xa4, 0xc8, 0x36, 0x76, 0xdd, 0xd6, + 0x32, 0x5f, 0xde, 0xfb, 0x15, 0xa5, 0x9c, 0x6d, + 0x86, 0x1b, 0x3a, 0x63, 0xc6, 0xd6, 0xbb, 0x16, + 0xad, 0x2e, 0xd2, 0xab, 0x1b, 0x4f, 0x99, 0xe5, + 0x59, 0x8e, 0x65, 0x6f, 0x3e, 0x53, 0x6d, 0xec, + 0xd0, 0x30, 0x35, 0xa5, 0xd8, 0x04, 0x61, 0xee, + 0x6b, 0xab, 0x50, 0xd6, 0xe8, 0xd1, 0x5e, 0xda, + 0x09, 0x8f, 0xc4, 0x5c, 0xde, 0x37, 0xcf, 0x05, + 0x95, 0xa4, 0xef, 0x6d, 0xc5, 0xa3, 0xa4, 0x17, + 0x0d, 0x61, 0x73, 0x28, 0x5c, 0x19, 0x87, 0x7a, + 0xaa, 0x7b, 0x2d, 0xda, 0xbc, 0x92, 0x3c, 0x96, + 0x09, 0xe5, 0xb8, 0x38, 0x61, 0xe6, 0xed, 0xe6, + 0x71, 0x6b, 0x89, 0xe7, 0x70, 0xd4, 0x83, 0xaf, + 0x79, 0x40, 0x7e, 0x24, 0xdb, 0x5b, 0xc7, 0x1d, + 0x85, 0xcc, 0x71, 0xb5, 0x93, 0xcf, 0x8c, 0xcd, + 0x2b, 0x45, 0x1c, 0xfa, 0x36, 0x2a, 0x62, 0x3d, + 0x8a, 0xaf, 0x7b, 0x57, 0x67, 0x69, 0x6f, 0xb1, + 0xd9, 0x7b, 0xa0, 0x89, 0xb1, 0x3a, 0x59, 0x21, + 0x74, 0x85, 0xa3, 0x4b, 0x9d, 0xcd, 0x3f, 0x49, + 0xec, 0xa0, 0xb7, 0x9c, 0xeb, 0x2e, 0x19, 0x58, + 0xcd, 0x8c, 0x84, 0x59, 0x16, 0x87, 0x07, 0xe1, + 0x35, 0xa1, 0x34, 0xf2, 0x75, 0xad, 0x2c, 0xda, + 0x6c, 0x99, 0xf9, 0x6b, 0xf3, 0x56, 0xcc, 0x7d, + 0x8a, 0x37, 0xf3, 0x6e, 0x93, 0x09, 0xd0, 0xe3, + 0x4d, 0xce, 0xea, 0xaf, 0x49, 0xff, 0x00, 0xe9, + 0x93, 0x7e, 0xc5, 0xbf, 0xf5, 0x3f, 0xa5, 0x44, + 0x5b, 0x7f, 0xfa, 0x71, 0x79, 0xff, 0x00, 0x96, + 0xce, 0xf3, 0xe3, 0x1f, 0x22, 0x0b, 0x91, 0xdb, + 0x1c, 0x83, 0x05, 0xb3, 0x99, 0x3b, 0xa5, 0x37, + 0x67, 0x0c, 0x4d, 0x63, 0x0d, 0x47, 0x8d, 0x82, + 0xaf, 0xaf, 0x92, 0x2a, 0xbd, 0xe6, 0xfb, 0x57, + 0x92, 0x64, 0xf3, 0x9b, 0x6b, 0xc9, 0x89, 0xb8, + 0x1a, 0x5d, 0x14, 0x63, 0x13, 0x85, 0x75, 0x62, + 0xd4, 0x3b, 0xea, 0xb9, 0xb0, 0xfb, 0x35, 0x95, + 0x5e, 0x65, 0xd1, 0xe6, 0x97, 0x8c, 0x74, 0xd7, + 0x02, 0x57, 0x18, 0x85, 0x48, 0x0c, 0xc0, 0x46, + 0x9a, 0x6f, 0xd4, 0x15, 0x07, 0x93, 0x66, 0xf9, + 0x74, 0x3b, 0x41, 0x77, 0x98, 0x67, 0x31, 0x3a, + 0xe5, 0xaf, 0x74, 0x98, 0x18, 0x18, 0x24, 0xf1, + 0xf1, 0xf8, 0xa5, 0xcc, 0x73, 0x86, 0xa0, 0x29, + 0xa9, 0x07, 0xd1, 0xb2, 0x8c, 0xff, 0x00, 0x2b, + 0xce, 0x5a, 0xe3, 0x61, 0x36, 0x27, 0x47, 0xfb, + 0x48, 0x9e, 0x0b, 0x64, 0x6f, 0x6d, 0xbc, 0x4b, + 0x8b, 0x30, 0xdb, 0x5d, 0x9f, 0xcb, 0xee, 0x1d, + 0x6d, 0x2c, 0xce, 0x96, 0x56, 0x1a, 0x48, 0x21, + 0x6e, 0x30, 0xd2, 0x35, 0x8a, 0xd4, 0x05, 0x50, + 0xd9, 0xcb, 0x98, 0x5f, 0xb6, 0x6f, 0x76, 0x56, + 0xd7, 0x41, 0x6b, 0x77, 0xcf, 0x36, 0x26, 0x38, + 0x61, 0x2d, 0x0e, 0x61, 0x2d, 0x14, 0xa9, 0xd4, + 0xed, 0x2b, 0x9b, 0x23, 0xbc, 0xb0, 0xc8, 0xb3, + 0x3b, 0xa8, 0x36, 0x82, 0xc4, 0xcd, 0x8c, 0x16, + 0x3b, 0x1b, 0x5a, 0xe2, 0xc3, 0xac, 0xb8, 0x07, + 0xe8, 0x38, 0xb7, 0xc2, 0x0f, 0xa4, 0x65, 0x79, + 0xc6, 0x5f, 0x9b, 0x42, 0x67, 0xb0, 0x97, 0x9d, + 0x6b, 0x0e, 0x19, 0x1b, 0x4a, 0x3d, 0xa4, 0xee, + 0x39, 0xab, 0xb5, 0x55, 0xf6, 0x37, 0x2b, 0xc9, + 0xed, 0xdd, 0x71, 0x7b, 0x94, 0xdf, 0xba, 0xea, + 0x39, 0x80, 0x6b, 0xe1, 0x70, 0x0c, 0xc1, 0xa7, + 0x13, 0x6a, 0x06, 0x91, 0x4d, 0x41, 0x5a, 0x0e, + 0xb3, 0xdb, 0xaf, 0x0e, 0x94, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x14, 0x97, 0x7f, 0xfa, 0xa3, 0x17, + 0x9a, 0xdf, 0xfa, 0x2d, 0x57, 0xef, 0xe8, 0xf0, + 0x2a, 0x0b, 0xbf, 0xfd, 0x51, 0x8b, 0xcd, 0x6f, + 0xfd, 0x16, 0xab, 0xf7, 0xf4, 0x78, 0x10, 0x13, + 0x4e, 0xe6, 0xee, 0x81, 0xdb, 0x44, 0x1a, 0xc1, + 0xd6, 0x41, 0xa8, 0x41, 0x54, 0x7e, 0xd0, 0xed, + 0x06, 0x6b, 0x99, 0xdd, 0x59, 0xec, 0xfc, 0x56, + 0xed, 0xb7, 0xb0, 0x76, 0x09, 0x6e, 0x6e, 0x74, + 0x87, 0x3f, 0x4f, 0x8a, 0xd1, 0xb9, 0xa9, 0x76, + 0xec, 0xe6, 0xd0, 0xdd, 0x66, 0x33, 0xde, 0x65, + 0xb9, 0x9c, 0x0d, 0x83, 0x32, 0xb0, 0x20, 0x4a, + 0xd6, 0x1a, 0xb1, 0xcd, 0x3a, 0x31, 0x35, 0x41, + 0x58, 0xe6, 0x51, 0xec, 0x96, 0x77, 0x99, 0x58, + 0xca, 0xc7, 0x5e, 0xc3, 0x74, 0xee, 0x7e, 0x37, + 0x5a, 0xd2, 0x49, 0x19, 0xaf, 0xc4, 0x91, 0xb5, + 0xf1, 0x75, 0xae, 0xdd, 0x8d, 0x8f, 0xac, 0x73, + 0x5c, 0xcb, 0x68, 0x8b, 0x9a, 0xc1, 0x76, 0x79, + 0x98, 0xad, 0xc3, 0x81, 0x7c, 0x6d, 0x04, 0x1a, + 0xc9, 0xbc, 0x4e, 0x00, 0x83, 0xd5, 0xce, 0xd1, + 0x6d, 0x34, 0xd9, 0xbd, 0xf5, 0x86, 0x4f, 0x63, + 0x05, 0xcc, 0x36, 0x2f, 0x6b, 0x24, 0x7b, 0xdc, + 0x5a, 0x74, 0x8a, 0xee, 0x9d, 0xf5, 0x27, 0x91, + 0xdd, 0xed, 0x3d, 0xc5, 0xc4, 0x8c, 0xce, 0x6c, + 0xa1, 0xb4, 0x88, 0x36, 0xb1, 0x3e, 0x37, 0x07, + 0x12, 0xec, 0x54, 0xa7, 0x94, 0x77, 0x15, 0x73, + 0x25, 0xcc, 0x33, 0x91, 0x98, 0xe7, 0x6f, 0xca, + 0x2c, 0x1b, 0x79, 0x2c, 0xf7, 0x6e, 0x73, 0xe5, + 0x99, 0xfc, 0xdc, 0x6d, 0x6b, 0x4b, 0xb0, 0x8d, + 0xf2, 0x74, 0x9d, 0x0a, 0x7f, 0x67, 0x76, 0x96, + 0x4c, 0xce, 0xe2, 0xe2, 0xc6, 0xf6, 0xdf, 0xd8, + 0xb3, 0x3b, 0x33, 0x59, 0xa0, 0x06, 0xad, 0x2d, + 0x24, 0xb6, 0xad, 0x27, 0xb2, 0x50, 0x70, 0x47, + 0x9c, 0xed, 0x6e, 0x77, 0x25, 0xcd, 0xd6, 0x40, + 0xcb, 0x48, 0xb2, 0xfb, 0x59, 0x5f, 0x0c, 0x1e, + 0xd4, 0x1c, 0xf9, 0x2e, 0x1d, 0x11, 0xc2, 0xfa, + 0x16, 0x9f, 0x10, 0x13, 0xa0, 0x29, 0x4c, 0xa3, + 0x69, 0x61, 0xbe, 0xc8, 0x0e, 0x73, 0x73, 0x1f, + 0xb3, 0x73, 0x02, 0x41, 0x77, 0x15, 0x71, 0x16, + 0x3e, 0x12, 0x5b, 0x23, 0x41, 0xde, 0xa8, 0xd0, + 0xa2, 0xdb, 0x91, 0xed, 0x66, 0x4f, 0x2d, 0xcd, + 0xbe, 0xcf, 0xdc, 0x5a, 0x1c, 0xba, 0xea, 0x57, + 0xcb, 0x1b, 0x6e, 0xc3, 0x84, 0x96, 0xcf, 0x90, + 0xd5, 0xf8, 0x03, 0x74, 0x38, 0x6f, 0x02, 0xb9, + 0xf3, 0xfc, 0xac, 0x64, 0x1b, 0x03, 0x71, 0x62, + 0xc9, 0x4c, 0xd2, 0x3d, 0xc0, 0xdc, 0xce, 0x74, + 0x19, 0x24, 0x96, 0x4c, 0x4f, 0x75, 0x10, 0x7a, + 0xb1, 0xba, 0xdb, 0x7c, 0xfe, 0xdc, 0xe6, 0x76, + 0x57, 0x10, 0x65, 0xd6, 0xaf, 0x24, 0xda, 0xc2, + 0xe6, 0x62, 0x2e, 0x03, 0x40, 0x2f, 0x3b, 0xc4, + 0xa9, 0x2d, 0x94, 0xda, 0x0b, 0xac, 0xcc, 0x5d, + 0x58, 0xe6, 0x51, 0xb6, 0x1c, 0xc6, 0xc1, 0xf8, + 0x26, 0x0c, 0xa8, 0x6b, 0x85, 0x70, 0xe2, 0x68, + 0xed, 0x8f, 0x02, 0x91, 0xc8, 0x22, 0x6c, 0x59, + 0x1e, 0x5e, 0xc6, 0xea, 0x6d, 0xbc, 0x43, 0xe8, + 0x85, 0xb2, 0xdf, 0x29, 0xcb, 0xad, 0xaf, 0x66, + 0xbf, 0x82, 0x06, 0xb2, 0xee, 0xe7, 0x44, 0xf3, + 0x02, 0x6a, 0xfd, 0x38, 0xb4, 0xd4, 0xd3, 0x58, + 0x41, 0xd6, 0x88, 0x88, 0x2a, 0xbf, 0x89, 0x3f, + 0xe9, 0xae, 0xdd, 0xc4, 0x5f, 0x2a, 0x99, 0xd9, + 0xcf, 0xf4, 0xfe, 0x58, 0x3f, 0xfe, 0x12, 0x1f, + 0xa8, 0x38, 0x94, 0x2f, 0xe2, 0x51, 0x23, 0x66, + 0xbf, 0xff, 0x00, 0x22, 0x2f, 0x95, 0x4d, 0xec, + 0xf6, 0x8c, 0x87, 0x2e, 0xec, 0x5a, 0xc2, 0x3e, + 0x80, 0x41, 0x21, 0xe1, 0x5c, 0x19, 0x9e, 0x7d, + 0x94, 0x65, 0x58, 0x7a, 0xc2, 0xe9, 0x90, 0x38, + 0x8c, 0x41, 0xa7, 0x16, 0x22, 0x3b, 0x0d, 0x68, + 0x25, 0x77, 0xad, 0x13, 0xe5, 0xf6, 0x17, 0x4f, + 0x6b, 0xae, 0xad, 0xa2, 0x9d, 0xcc, 0x18, 0x58, + 0xe9, 0x58, 0xd7, 0x96, 0x83, 0xb8, 0xdc, 0x40, + 0xd1, 0x04, 0x46, 0xc9, 0xed, 0x04, 0xd9, 0xeb, + 0x6f, 0xe6, 0x70, 0x68, 0x82, 0x19, 0xf0, 0x5b, + 0x50, 0x50, 0xf3, 0x64, 0x13, 0x57, 0x69, 0x2b, + 0xd6, 0xd2, 0x6d, 0x04, 0xd9, 0x63, 0xad, 0x6c, + 0x6c, 0x61, 0x17, 0x39, 0x95, 0xfb, 0xb0, 0xdb, + 0xc4, 0xe2, 0x43, 0x40, 0x1a, 0xdc, 0xe2, 0x14, + 0x6f, 0xe1, 0xe3, 0x1a, 0xd6, 0x66, 0xed, 0x60, + 0x0d, 0x68, 0xbc, 0x34, 0x68, 0x14, 0x03, 0x43, + 0xb5, 0x05, 0xe6, 0xec, 0xf3, 0xdf, 0x89, 0x76, + 0x8c, 0x76, 0x91, 0x0d, 0x99, 0x73, 0x3b, 0x0e, + 0xf1, 0xf4, 0xa0, 0xd8, 0x76, 0x87, 0x68, 0xb2, + 0x7b, 0xeb, 0x58, 0xb6, 0x86, 0x1b, 0x77, 0xd9, + 0xde, 0xbb, 0x9b, 0x8e, 0xe6, 0xdb, 0x47, 0x36, + 0xf3, 0xe4, 0x87, 0x70, 0xa9, 0x0d, 0xab, 0xcf, + 0x6f, 0xb2, 0x88, 0xec, 0x99, 0x97, 0xc4, 0xcb, + 0x8b, 0xab, 0xc9, 0xf9, 0x96, 0x47, 0x25, 0x68, + 0x6a, 0x2b, 0x5d, 0x0b, 0x83, 0xf1, 0x31, 0x80, + 0xec, 0xd7, 0x38, 0x75, 0xc7, 0x71, 0x19, 0x69, + 0xec, 0x9a, 0x85, 0xcd, 0xb5, 0x37, 0x92, 0x8c, + 0xd7, 0x66, 0xdc, 0xd8, 0x5f, 0x76, 0xf1, 0x8e, + 0x71, 0x6f, 0x1e, 0x82, 0xe7, 0x61, 0x01, 0xa2, + 0xbb, 0x9a, 0x4a, 0x0e, 0xb8, 0xf3, 0x1d, 0xbf, + 0x32, 0xb0, 0x49, 0x95, 0x5b, 0xb6, 0x3c, 0x43, + 0x1b, 0x84, 0x82, 0xa1, 0xb5, 0xd2, 0x7c, 0xad, + 0xe5, 0xdb, 0xb4, 0x19, 0xd6, 0x67, 0x6d, 0x77, + 0x65, 0x94, 0x64, 0xf0, 0xb2, 0x5c, 0xce, 0xfd, + 0xae, 0x7e, 0x39, 0xea, 0x22, 0x8a, 0x28, 0xe9, + 0x8e, 0x47, 0xd3, 0x5e, 0x93, 0xa0, 0x2e, 0x09, + 0x36, 0xb3, 0x3a, 0xcb, 0x2f, 0x20, 0x6e, 0x7f, + 0x96, 0xb2, 0xda, 0xca, 0xe5, 0xc1, 0xac, 0xb9, + 0x85, 0xe6, 0x40, 0xd2, 0x7e, 0x7d, 0x7b, 0x1a, + 0x4a, 0xee, 0xda, 0x0c, 0x93, 0x30, 0xbc, 0xba, + 0xb2, 0xcd, 0xb2, 0x7b, 0x86, 0x5b, 0xe6, 0x76, + 0x01, 0xcc, 0x67, 0x3c, 0x0b, 0xa2, 0x96, 0x39, + 0x00, 0x2f, 0x8e, 0x4a, 0x6a, 0xd4, 0x28, 0x83, + 0x4e, 0x55, 0x9b, 0xe7, 0x96, 0xf9, 0xcb, 0x72, + 0x3c, 0xfd, 0x90, 0x3a, 0x5b, 0x98, 0x9d, 0x3d, + 0x95, 0xe5, 0xa8, 0x2d, 0x64, 0x81, 0x94, 0xc6, + 0xd7, 0xb1, 0xda, 0x5a, 0x45, 0x56, 0xbc, 0xeb, + 0x3d, 0xcd, 0xee, 0x33, 0xa6, 0xe4, 0x1b, 0x3f, + 0x81, 0xb7, 0x0c, 0x6f, 0x39, 0x75, 0x77, 0x20, + 0xc4, 0x23, 0x04, 0x56, 0x80, 0x6f, 0xd1, 0x6d, + 0xca, 0xb2, 0x4c, 0xea, 0x6c, 0xe5, 0xb9, 0xee, + 0xd0, 0x4b, 0x09, 0xb8, 0x82, 0x27, 0x41, 0x67, + 0x69, 0x6b, 0x88, 0xc7, 0x10, 0x93, 0xcb, 0x71, + 0x7b, 0xf4, 0xb9, 0xc5, 0x47, 0xec, 0x77, 0xeb, + 0x76, 0xa3, 0x68, 0xae, 0x1f, 0xa5, 0xe2, 0x63, + 0x1d, 0x4e, 0xf0, 0x7b, 0x87, 0x81, 0xa1, 0x02, + 0x4c, 0xe7, 0x69, 0xb6, 0x77, 0x31, 0xb5, 0x8f, + 0x3c, 0x9a, 0x2b, 0xfc, 0xba, 0xf1, 0xe2, 0x2e, + 0x7e, 0x36, 0x16, 0x18, 0xdc, 0x75, 0x93, 0xbb, + 0xa2, 0xb5, 0xed, 0x2b, 0x90, 0x24, 0xeb, 0x5c, + 0x99, 0x8e, 0x53, 0x97, 0x66, 0x91, 0x32, 0x1c, + 0xc2, 0x06, 0xdc, 0x47, 0x19, 0xc4, 0xc6, 0xb8, + 0x91, 0x47, 0x52, 0x95, 0xab, 0x48, 0x3a, 0x97, + 0x5a, 0x00, 0xd7, 0xf9, 0x6f, 0xaa, 0x37, 0xe1, + 0x8f, 0xed, 0x73, 0x7f, 0xb4, 0x67, 0x85, 0xca, + 0xf2, 0x35, 0xfe, 0x5b, 0xea, 0x8d, 0xf8, 0x63, + 0xfb, 0x5c, 0xdf, 0xed, 0x19, 0xe1, 0x72, 0x0b, + 0xe2, 0x89, 0xce, 0x7d, 0xe6, 0xcb, 0xcf, 0xf9, + 0x42, 0x96, 0x51, 0x39, 0xcf, 0xbc, 0xd9, 0x79, + 0xff, 0x00, 0x28, 0x41, 0x8c, 0x97, 0xde, 0xaf, + 0x7c, 0xf3, 0xf5, 0x8a, 0x97, 0x51, 0x19, 0x37, + 0xbd, 0x5e, 0xf9, 0xe7, 0xeb, 0x15, 0x2c, 0x83, + 0x28, 0xb0, 0x88, 0x32, 0x8b, 0x08, 0x83, 0xe3, + 0xbf, 0x8c, 0xff, 0x00, 0xea, 0x1b, 0x4f, 0xfc, + 0x51, 0xf5, 0x9c, 0xb3, 0xf8, 0x2f, 0xfc, 0xf2, + 0xf7, 0xff, 0x00, 0x17, 0xfb, 0xe1, 0x79, 0xfc, + 0x66, 0xff, 0x00, 0x50, 0xda, 0x7f, 0xe2, 0x8f, + 0xac, 0xe5, 0xeb, 0xf0, 0x5f, 0xf9, 0xe5, 0xef, + 0xfe, 0x2f, 0xf7, 0xc2, 0x0f, 0xb1, 0x20, 0xd6, + 0x16, 0x10, 0x6b, 0x08, 0x3f, 0x38, 0x6d, 0x3f, + 0xfa, 0x93, 0x34, 0xff, 0x00, 0xcb, 0x9b, 0xeb, + 0x95, 0xf4, 0xbb, 0x0c, 0xbb, 0xac, 0x7f, 0x07, + 0xb9, 0x80, 0x2a, 0xf6, 0x43, 0x24, 0xf1, 0x8d, + 0xdc, 0x50, 0xc8, 0xe9, 0x28, 0x3b, 0x60, 0x51, + 0x7c, 0xd3, 0x69, 0xff, 0x00, 0xd4, 0x79, 0x9f, + 0xfe, 0x5c, 0xdf, 0x5c, 0xaf, 0xb3, 0xfe, 0x1d, + 0x31, 0xb2, 0x6c, 0x45, 0x84, 0x6f, 0xd2, 0xd7, + 0xb6, 0x46, 0x90, 0x77, 0x8b, 0xdc, 0x10, 0x7c, + 0x73, 0x64, 0xf3, 0x21, 0x95, 0xed, 0x26, 0x5d, + 0x7c, 0x5d, 0x85, 0x91, 0x4e, 0xc1, 0x29, 0x3f, + 0x31, 0xff, 0x00, 0xab, 0x79, 0xee, 0x35, 0xc5, + 0x7a, 0xdb, 0x0c, 0xcb, 0xac, 0xf6, 0x9b, 0x31, + 0xbc, 0x06, 0xac, 0x74, 0xce, 0x63, 0x0e, 0xb1, + 0x85, 0x9e, 0x23, 0x69, 0xc9, 0xaa, 0xe1, 0xcd, + 0xec, 0x9d, 0x97, 0x66, 0x97, 0x76, 0x2e, 0xa8, + 0x36, 0xd3, 0x3e, 0x2d, 0x3b, 0xcd, 0x71, 0x03, + 0xbc, 0x99, 0x4d, 0x94, 0x99, 0x86, 0x65, 0x6b, + 0x64, 0xcd, 0x2e, 0xb9, 0x99, 0x91, 0x8f, 0xed, + 0x3a, 0x85, 0x07, 0xd4, 0xaf, 0x32, 0xde, 0xad, + 0xfc, 0x1c, 0x7c, 0x0e, 0x18, 0x5f, 0x24, 0x31, + 0xcf, 0x20, 0xfe, 0xb4, 0xb3, 0x46, 0xff, 0x00, + 0x01, 0x0b, 0xe6, 0x9b, 0x33, 0xfe, 0xa4, 0xca, + 0xbf, 0xf3, 0x20, 0xff, 0x00, 0xa8, 0xd5, 0xf6, + 0x7f, 0xc4, 0x58, 0xd9, 0x16, 0xc2, 0xe6, 0x11, + 0xc6, 0x30, 0xb2, 0x38, 0xe1, 0x63, 0x06, 0xf3, + 0x5b, 0x2c, 0x60, 0x0e, 0x00, 0xbe, 0x31, 0xb3, + 0x3f, 0xea, 0x3c, 0xab, 0xff, 0x00, 0x2e, 0x0f, + 0xfa, 0x8d, 0x41, 0xf7, 0x0d, 0xbb, 0xda, 0x29, + 0x36, 0x77, 0x67, 0xe5, 0xbd, 0x85, 0xb8, 0xae, + 0x25, 0x78, 0x82, 0xdc, 0xee, 0x35, 0xef, 0x0e, + 0x38, 0x88, 0xfe, 0xa8, 0x07, 0xba, 0xbe, 0x17, + 0x96, 0x8b, 0x3b, 0xbc, 0xd6, 0x2e, 0xb6, 0xb8, + 0x30, 0xda, 0x4b, 0x26, 0x3b, 0xa9, 0xe8, 0xe7, + 0x38, 0xb4, 0x9c, 0x4e, 0xa0, 0x6d, 0x4e, 0x27, + 0x6a, 0x5f, 0x67, 0xfc, 0x4b, 0xc9, 0x33, 0x5c, + 0xef, 0x22, 0x8a, 0xd3, 0x2c, 0x83, 0xda, 0x27, + 0x6d, 0xcb, 0x64, 0x73, 0x43, 0x9a, 0xd3, 0x81, + 0xac, 0x78, 0x26, 0xaf, 0x2d, 0x1e, 0x53, 0x97, + 0xcc, 0x7f, 0xdb, 0x4d, 0xb6, 0xfb, 0xb4, 0xfe, + 0xf6, 0x2f, 0xe2, 0x20, 0xfa, 0x65, 0xb7, 0xe2, + 0x4e, 0xc3, 0x5a, 0x41, 0x15, 0xbc, 0x17, 0x4e, + 0x8e, 0x18, 0x5a, 0x23, 0x8e, 0x31, 0x14, 0x94, + 0x0d, 0x68, 0xa0, 0x1e, 0x4a, 0xf8, 0xae, 0x67, + 0x34, 0x77, 0x19, 0x8d, 0xdd, 0xc4, 0x46, 0xb1, + 0xcd, 0x34, 0x8f, 0x61, 0xdf, 0x6b, 0x9e, 0x48, + 0xf0, 0xa9, 0xef, 0xf6, 0xd3, 0x6d, 0xbe, 0xed, + 0x77, 0x63, 0xf5, 0xb0, 0xff, 0x00, 0x11, 0x57, + 0x26, 0x86, 0x48, 0x26, 0x92, 0x09, 0x9b, 0x86, + 0x58, 0x9e, 0x58, 0xf6, 0xe8, 0x34, 0x73, 0x4d, + 0x1c, 0x34, 0x20, 0xfb, 0x06, 0xc6, 0xed, 0xe6, + 0xcd, 0x5a, 0xe4, 0x59, 0x5e, 0x55, 0x3d, 0xcb, + 0x9b, 0x78, 0xc8, 0xdb, 0x09, 0x8c, 0x31, 0xc4, + 0x63, 0x2e, 0x22, 0x98, 0x86, 0x8d, 0xd5, 0xc9, + 0xf8, 0xd7, 0x6e, 0xf7, 0x65, 0xf9, 0x5d, 0xc0, + 0xd2, 0xd8, 0xa5, 0x96, 0x37, 0x9e, 0xcb, 0xda, + 0xd2, 0x3e, 0xa1, 0x55, 0x0d, 0x9f, 0xd8, 0x8d, + 0xa8, 0xb9, 0x9b, 0x2f, 0xcd, 0x2d, 0xec, 0x8b, + 0xec, 0x9f, 0x24, 0x72, 0xb6, 0x6e, 0x72, 0x30, + 0x30, 0x07, 0x8a, 0x9c, 0x25, 0xf8, 0xb7, 0x17, + 0xd5, 0xf6, 0xef, 0x23, 0x76, 0x7d, 0xb3, 0x57, + 0x56, 0xb0, 0xb7, 0x15, 0xc4, 0x7f, 0xaf, 0xb6, + 0x03, 0x59, 0x91, 0x80, 0xf8, 0xbf, 0xda, 0x6e, + 0x20, 0x83, 0xe3, 0xff, 0x00, 0x87, 0xd7, 0x2d, + 0xb6, 0xdb, 0x2c, 0xae, 0x47, 0x9a, 0x34, 0xcc, + 0x63, 0xaf, 0xda, 0xb5, 0xd1, 0xff, 0x00, 0x79, + 0x7e, 0x81, 0x1a, 0x05, 0x17, 0xe6, 0x28, 0xa6, + 0x96, 0xda, 0xe1, 0x93, 0xc4, 0x4b, 0x26, 0x85, + 0xe1, 0xcc, 0x3a, 0x8b, 0x5c, 0xc3, 0x51, 0xe0, + 0x5f, 0x7a, 0xd9, 0x3d, 0xb6, 0xcb, 0x36, 0x8a, + 0xcd, 0x94, 0x95, 0x90, 0xe6, 0x0d, 0x68, 0x13, + 0xda, 0xbc, 0x80, 0xec, 0x40, 0x79, 0x4c, 0xdf, + 0x69, 0xef, 0x20, 0xb2, 0x77, 0xd4, 0x7e, 0x65, + 0x9f, 0x65, 0x19, 0x4c, 0xb0, 0x47, 0x99, 0x5d, + 0xc7, 0x6a, 0x6e, 0xab, 0xcc, 0xf3, 0x86, 0x80, + 0xe1, 0xa5, 0x6a, 0x75, 0x37, 0x58, 0xd6, 0xb7, + 0x5e, 0xe6, 0x36, 0x36, 0x16, 0xef, 0xb9, 0xbd, + 0x9e, 0x38, 0x20, 0x67, 0x94, 0xf9, 0x1d, 0x41, + 0xda, 0xec, 0xaf, 0x85, 0x6d, 0xde, 0xd3, 0x7c, + 0x49, 0x9d, 0x3a, 0xe6, 0x20, 0x45, 0x9d, 0xb8, + 0xe6, 0x6d, 0x5a, 0xed, 0x04, 0xb4, 0x1a, 0x97, + 0x11, 0xbe, 0xe2, 0x6a, 0x83, 0xef, 0x70, 0xcf, + 0x14, 0xf1, 0x89, 0x61, 0x7b, 0x65, 0x8d, 0xc2, + 0xad, 0x7b, 0x08, 0x73, 0x48, 0xec, 0x38, 0x1a, + 0x15, 0xb1, 0x7c, 0x9b, 0xf0, 0x6b, 0x2d, 0xbb, + 0x7d, 0xdd, 0xe6, 0x64, 0x5e, 0xf6, 0xda, 0x42, + 0xce, 0x69, 0x8c, 0x04, 0x86, 0x3e, 0x57, 0x78, + 0xc4, 0x96, 0xee, 0xe1, 0x6b, 0x7b, 0xeb, 0xea, + 0xe0, 0x9e, 0x24, 0x1e, 0xbf, 0x2e, 0xf1, 0x5f, + 0x09, 0xfc, 0x55, 0xff, 0x00, 0x5a, 0xde, 0x79, + 0x90, 0xff, 0x00, 0xd3, 0x6a, 0xfb, 0xa6, 0xff, + 0x00, 0xe5, 0xb8, 0x57, 0xc2, 0xbf, 0x15, 0x3f, + 0xd6, 0xb7, 0x9e, 0x64, 0x3f, 0xf4, 0xda, 0x82, + 0xe7, 0xf8, 0x2d, 0xfc, 0x8a, 0xff, 0x00, 0xff, + 0x00, 0x2b, 0xfb, 0x91, 0xaf, 0xa2, 0x2f, 0x9d, + 0xfe, 0x0b, 0x7f, 0x22, 0xbf, 0xff, 0x00, 0xca, + 0xfe, 0xe4, 0x6b, 0xe8, 0x68, 0x32, 0xbe, 0x5d, + 0xf8, 0x89, 0xf8, 0x8a, 0x5a, 0x65, 0xc8, 0xf2, + 0x39, 0x7c, 0x6d, 0x2c, 0xbc, 0xbc, 0x66, 0xe1, + 0xdd, 0x8e, 0x22, 0x38, 0x09, 0xe0, 0x52, 0x1f, + 0x89, 0xfb, 0x65, 0x2e, 0x55, 0x6e, 0x72, 0x4c, + 0xbe, 0x52, 0xdb, 0xeb, 0xa6, 0x62, 0xb8, 0x91, + 0xa7, 0x4c, 0x51, 0x3b, 0x71, 0xa7, 0xe7, 0x3f, + 0xbc, 0x3b, 0x6b, 0xe4, 0xf9, 0x6d, 0x93, 0xb3, + 0x0b, 0xf8, 0x6c, 0xc4, 0x91, 0xc3, 0xcf, 0x3e, + 0x86, 0x69, 0x9c, 0x18, 0xc6, 0x8f, 0xce, 0x73, + 0x9c, 0xea, 0x68, 0x01, 0x07, 0x4e, 0x41, 0x90, + 0xe6, 0x19, 0xfe, 0x60, 0xcb, 0x1b, 0x08, 0xf1, + 0xbd, 0xda, 0x64, 0x90, 0xf9, 0x11, 0xb3, 0x75, + 0xef, 0x3d, 0x85, 0xf7, 0x9d, 0x98, 0xd9, 0xcb, + 0x0d, 0x9d, 0xcb, 0x1b, 0x63, 0x66, 0x0b, 0x9d, + 0x5c, 0x53, 0xce, 0xef, 0x2a, 0x49, 0x29, 0x42, + 0xe3, 0xbc, 0x37, 0x82, 0x8d, 0xd9, 0xa6, 0xec, + 0x76, 0xce, 0x65, 0xed, 0xb3, 0xb2, 0xcc, 0x6c, + 0xcb, 0x8f, 0x8d, 0x3d, 0xc3, 0xa6, 0x8f, 0x1c, + 0xaf, 0xf9, 0xce, 0xf1, 0xb7, 0x37, 0x06, 0xe2, + 0x97, 0x1b, 0x45, 0x90, 0x12, 0x03, 0x73, 0x2b, + 0x42, 0x49, 0xa0, 0x02, 0x78, 0xeb, 0x53, 0xb8, + 0x06, 0x24, 0x12, 0x0e, 0x6b, 0x1c, 0x0b, 0x1e, + 0x31, 0x35, 0xf5, 0x0e, 0x69, 0xd4, 0x41, 0xd6, + 0x0f, 0x6e, 0xab, 0xe4, 0x1b, 0x61, 0xf8, 0x5f, + 0x98, 0x5a, 0x5d, 0x49, 0x7b, 0x90, 0xc6, 0x6e, + 0xac, 0xa4, 0x25, 0xc6, 0xd9, 0x9a, 0x65, 0x8e, + 0xba, 0xc3, 0x5a, 0x7c, 0xa6, 0xaf, 0xa9, 0xe7, + 0x19, 0x9f, 0x55, 0xe5, 0x57, 0x39, 0x97, 0x34, + 0x6e, 0x1b, 0x6d, 0x19, 0x97, 0x9a, 0x61, 0x00, + 0xb9, 0xa0, 0x54, 0xe9, 0x21, 0x7c, 0xff, 0x00, + 0xfd, 0xe8, 0x8d, 0xf3, 0x46, 0xd6, 0x65, 0x9c, + 0xdc, 0x2e, 0x73, 0x43, 0xdf, 0x24, 0xb5, 0x21, + 0xa4, 0x80, 0x4f, 0x8a, 0xd1, 0xb8, 0x82, 0x85, + 0x06, 0x4d, 0xb5, 0x2f, 0x26, 0xca, 0xde, 0xca, + 0xf8, 0x07, 0x9a, 0x3a, 0x16, 0xb2, 0x56, 0x8f, + 0xed, 0x36, 0x80, 0x70, 0xad, 0x9b, 0x47, 0xb2, + 0xf7, 0x9b, 0x3b, 0x1d, 0x9b, 0x6f, 0xdc, 0x05, + 0xd5, 0xdb, 0x1d, 0x23, 0xad, 0xdb, 0xa7, 0x9b, + 0x60, 0x20, 0x34, 0x39, 0xdf, 0x38, 0x9a, 0xaf, + 0xd0, 0x6c, 0x95, 0x92, 0xc6, 0x26, 0x89, 0xe1, + 0xd0, 0xbd, 0xa1, 0xed, 0x90, 0x6a, 0x20, 0xe9, + 0x05, 0x7c, 0x33, 0xf1, 0x33, 0x3b, 0x87, 0x38, + 0xda, 0x79, 0x1d, 0x6c, 0xf1, 0x25, 0xbd, 0x9c, + 0x6d, 0xb6, 0x8e, 0x41, 0xa8, 0x96, 0x92, 0xe7, + 0x9e, 0x53, 0x8a, 0x09, 0x0f, 0xc1, 0xb8, 0x9c, + 0xfd, 0xa7, 0x9e, 0x41, 0xe4, 0xc7, 0x68, 0xf2, + 0x7f, 0xb4, 0xe6, 0x00, 0xbe, 0xcd, 0xa8, 0x57, + 0x7b, 0x71, 0x7c, 0xd7, 0xf0, 0x67, 0x2b, 0x74, + 0x56, 0x97, 0xd9, 0xac, 0x8d, 0xa0, 0xb8, 0x73, + 0x60, 0x84, 0x9d, 0xd6, 0xb3, 0x4b, 0xfe, 0x93, + 0x87, 0x02, 0xfa, 0x1d, 0xed, 0xed, 0xbd, 0x8d, + 0xa4, 0xd7, 0x97, 0x52, 0x08, 0xad, 0xe0, 0x61, + 0x7c, 0xaf, 0x3b, 0x8d, 0x08, 0x3e, 0x59, 0xf8, + 0xc3, 0x91, 0xd8, 0xda, 0xdd, 0x5b, 0xe7, 0x30, + 0x39, 0xb1, 0x5d, 0x5e, 0x38, 0xc7, 0x3c, 0x02, + 0x95, 0x79, 0x68, 0xaf, 0x3c, 0x07, 0x78, 0xaf, + 0x9b, 0x82, 0x77, 0xd4, 0xd6, 0xd5, 0x6d, 0x1d, + 0xc6, 0xd1, 0xe7, 0x32, 0xdf, 0xcb, 0xe2, 0xc5, + 0xe4, 0x5b, 0xc4, 0x4d, 0x43, 0x23, 0xdc, 0x1d, + 0xb3, 0xac, 0xf6, 0x57, 0x2e, 0x63, 0x91, 0xe6, + 0x59, 0x6d, 0xad, 0x95, 0xe5, 0xdc, 0x06, 0x38, + 0x6f, 0xe3, 0x32, 0x40, 0xe3, 0xba, 0x01, 0xa5, + 0x1d, 0xbc, 0x77, 0x7b, 0x44, 0x20, 0xfb, 0x9e, + 0xc3, 0x64, 0xf9, 0x66, 0x55, 0xb3, 0xb6, 0x83, + 0x2f, 0x7b, 0x67, 0x17, 0x0d, 0x13, 0xcb, 0x74, + 0xdd, 0x1c, 0xe3, 0xdc, 0x34, 0x9e, 0xc0, 0x1a, + 0x80, 0xdc, 0x53, 0xf4, 0xa6, 0x85, 0xf2, 0x1f, + 0xc2, 0x9d, 0xaf, 0xf6, 0x1b, 0xae, 0xa0, 0xbe, + 0x7d, 0x2d, 0x6e, 0x5d, 0x5b, 0x57, 0x9d, 0x38, + 0x25, 0x3a, 0xd9, 0xda, 0x7f, 0x87, 0xb6, 0xbe, + 0xba, 0x10, 0x7a, 0x45, 0xe5, 0x65, 0x06, 0x51, + 0x61, 0x10, 0x65, 0x16, 0x11, 0x06, 0x51, 0x61, + 0x10, 0x65, 0x16, 0x11, 0x06, 0x51, 0x61, 0x10, + 0x65, 0x16, 0x11, 0x06, 0x51, 0x61, 0x10, 0x65, + 0x16, 0x11, 0x06, 0x51, 0x61, 0x10, 0x65, 0x16, + 0x11, 0x06, 0x51, 0x61, 0x10, 0x65, 0x16, 0x11, + 0x06, 0x51, 0x61, 0x10, 0x65, 0x16, 0x11, 0x06, + 0x51, 0x61, 0x10, 0x65, 0x16, 0x11, 0x06, 0x51, + 0x61, 0x10, 0x65, 0x16, 0x11, 0x06, 0x51, 0x61, + 0x10, 0x65, 0x16, 0x11, 0x06, 0x51, 0x61, 0x10, + 0x65, 0x16, 0x11, 0x06, 0x57, 0x1e, 0x6f, 0xfc, + 0xae, 0xf7, 0xec, 0x24, 0xfa, 0x8e, 0x5d, 0x6b, + 0x93, 0x36, 0xfe, 0x55, 0x7b, 0xf6, 0x12, 0x7d, + 0x47, 0x20, 0xaa, 0x7e, 0x1a, 0xff, 0x00, 0x23, + 0x9f, 0xed, 0xcf, 0xd5, 0x56, 0xc5, 0x53, 0xfc, + 0x35, 0xfe, 0x47, 0x3f, 0xdb, 0x9f, 0xaa, 0xad, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x2b, 0x5f, + 0x88, 0x5f, 0xe9, 0xc7, 0xfd, 0xac, 0x7e, 0x15, + 0xc1, 0x90, 0xd9, 0xc9, 0x7d, 0xf8, 0x77, 0x35, + 0xb4, 0x3a, 0x64, 0x7f, 0x3f, 0x84, 0x6f, 0x96, + 0xbb, 0x18, 0x1d, 0xe5, 0x71, 0x9a, 0x08, 0x2e, + 0x19, 0xcd, 0xcf, 0x13, 0x26, 0x66, 0xbc, 0x12, + 0x34, 0x3d, 0xb5, 0x1d, 0x87, 0x02, 0x12, 0x18, + 0x21, 0xb7, 0x67, 0x37, 0x04, 0x6c, 0x86, 0x31, + 0xa4, 0x32, 0x36, 0x86, 0x36, 0xa7, 0xb0, 0xda, + 0x04, 0x1f, 0x3b, 0xd9, 0x5d, 0xa8, 0xcb, 0xf2, + 0x7c, 0xa2, 0xf2, 0xd6, 0xec, 0x16, 0x5d, 0xb5, + 0xee, 0x7d, 0xbb, 0x0b, 0x6b, 0x89, 0xc5, 0xb4, + 0xc2, 0x77, 0xa8, 0x42, 0xed, 0x8b, 0x33, 0xcd, + 0xf3, 0x5d, 0x8c, 0xcd, 0x6f, 0x73, 0x2c, 0x18, + 0x5c, 0xd0, 0xd8, 0x0b, 0x18, 0x19, 0x88, 0x37, + 0x09, 0x2e, 0xd1, 0x5d, 0x1a, 0x55, 0xba, 0x6c, + 0x97, 0x28, 0xb8, 0x94, 0xcd, 0x3d, 0x94, 0x32, + 0x4a, 0x75, 0xb8, 0xb0, 0x12, 0x7b, 0x74, 0xd6, + 0xba, 0x5d, 0x04, 0x0e, 0x87, 0x98, 0x74, 0x4c, + 0x74, 0x34, 0xa7, 0x34, 0x5a, 0x0b, 0x29, 0xbd, + 0x86, 0x94, 0x41, 0x4b, 0xd8, 0x83, 0x5d, 0x92, + 0xcc, 0xf7, 0x7c, 0x79, 0x7f, 0xe9, 0xad, 0x5f, + 0x85, 0xc6, 0xad, 0xcc, 0x7b, 0x51, 0x78, 0x1e, + 0xae, 0xf1, 0x5a, 0x5a, 0xc3, 0x1b, 0xa2, 0x86, + 0x08, 0xe2, 0x8d, 0xfe, 0x54, 0x6c, 0x63, 0x5a, + 0xd3, 0x5d, 0x1a, 0x5a, 0xd0, 0x01, 0x48, 0x2c, + 0xed, 0x2d, 0xb1, 0x7b, 0x34, 0x11, 0x41, 0x8b, + 0xca, 0xe6, 0x98, 0xd6, 0x56, 0x9b, 0xf8, 0x40, + 0x41, 0xf3, 0xcd, 0x84, 0x23, 0xaf, 0x73, 0x2f, + 0xfc, 0x79, 0xff, 0x00, 0xea, 0x35, 0x71, 0x6c, + 0x46, 0x7b, 0x6b, 0x92, 0x5d, 0x4d, 0x35, 0xd8, + 0x7f, 0x31, 0x34, 0x61, 0x8e, 0x7b, 0x1b, 0x8b, + 0x0b, 0x81, 0xab, 0x6a, 0x3b, 0x3a, 0x57, 0xd3, + 0x3d, 0x86, 0xca, 0x16, 0x4c, 0xfb, 0x7b, 0x78, + 0xa1, 0x91, 0xf1, 0xbd, 0xa5, 0xd1, 0xc6, 0xd6, + 0xb9, 0xd5, 0x15, 0xa7, 0x8a, 0x01, 0x35, 0x2a, + 0x95, 0xb0, 0x39, 0x2d, 0xc3, 0x64, 0xbd, 0x8f, + 0x34, 0xb1, 0x7b, 0x61, 0x96, 0x26, 0x00, 0xcb, + 0x88, 0xdc, 0x1a, 0xe3, 0x52, 0x7c, 0x5c, 0x43, + 0x7b, 0x75, 0x07, 0x36, 0xc9, 0x35, 0xf9, 0xc6, + 0xd7, 0xdc, 0xe6, 0x2d, 0x61, 0x6c, 0x47, 0x9e, + 0x90, 0x9d, 0xc1, 0xce, 0xb4, 0xc6, 0xd1, 0xdb, + 0xc2, 0xe5, 0xa7, 0x65, 0x73, 0x0b, 0x5d, 0x9c, + 0xce, 0xaf, 0x6d, 0xb3, 0x60, 0x62, 0x69, 0x06, + 0x30, 0xec, 0x18, 0x88, 0x2c, 0x35, 0x65, 0x06, + 0xbd, 0x21, 0x7d, 0x1e, 0xd6, 0xca, 0xce, 0xce, + 0x3e, 0x6e, 0xd2, 0x06, 0x41, 0x19, 0xd2, 0x5a, + 0xc6, 0x81, 0x5d, 0xea, 0xd3, 0x5a, 0xd7, 0x77, + 0x95, 0xe5, 0xb7, 0xce, 0x0e, 0xbc, 0xb6, 0x8a, + 0x77, 0x0d, 0x4e, 0x7b, 0x41, 0x76, 0x8d, 0xcc, + 0x5a, 0xd0, 0x56, 0x76, 0x67, 0x68, 0x73, 0x6c, + 0xef, 0x32, 0xbe, 0x7e, 0x16, 0x33, 0x2c, 0x8a, + 0x39, 0x0c, 0x64, 0x33, 0x0b, 0xaa, 0xe3, 0xfa, + 0xb6, 0x99, 0x3c, 0x2a, 0x33, 0xf0, 0xd2, 0x9d, + 0x67, 0x7d, 0x4f, 0x54, 0x3e, 0xba, 0xbf, 0xc1, + 0x6d, 0x6d, 0x6d, 0x17, 0x33, 0x6f, 0x13, 0x61, + 0x8b, 0x5e, 0x06, 0x34, 0x35, 0xb5, 0xed, 0x05, + 0xe6, 0x0b, 0x2b, 0x2b, 0x67, 0x17, 0x5b, 0xdb, + 0xc5, 0x03, 0x9d, 0xa1, 0xce, 0x8e, 0x36, 0xb0, + 0x91, 0xd9, 0xc2, 0x02, 0x0f, 0x9f, 0xed, 0xc1, + 0x10, 0xed, 0x65, 0xac, 0xb7, 0xc0, 0xbe, 0xc0, + 0x36, 0x2d, 0x06, 0xb4, 0x2c, 0x04, 0x63, 0xef, + 0xd6, 0xab, 0x93, 0x6c, 0xb3, 0x8c, 0xbb, 0x34, + 0xbe, 0xb3, 0x7e, 0x5c, 0xdf, 0xfb, 0x48, 0x1b, + 0x80, 0x49, 0x87, 0x03, 0x0b, 0x8b, 0x83, 0x8b, + 0x5a, 0x3b, 0x0b, 0xe9, 0x57, 0x96, 0x16, 0x37, + 0xad, 0x0c, 0xbc, 0x81, 0x93, 0x86, 0x69, 0x6e, + 0x36, 0x83, 0x4a, 0xef, 0x6f, 0x2f, 0x27, 0x2c, + 0xcb, 0x0c, 0x4c, 0x88, 0xda, 0x40, 0x63, 0x8a, + 0xb8, 0x23, 0x74, 0x6c, 0x70, 0x6d, 0x75, 0xd3, + 0x13, 0x74, 0x55, 0x05, 0x3b, 0xf1, 0x2d, 0xae, + 0x75, 0x96, 0x58, 0xf0, 0x2a, 0xcf, 0x1c, 0x12, + 0x35, 0x55, 0xcd, 0x8f, 0x0e, 0x9f, 0xec, 0xae, + 0x6c, 0xf3, 0x33, 0xb7, 0xcd, 0xb6, 0x2e, 0x0f, + 0x64, 0x0f, 0xad, 0x84, 0x90, 0xb6, 0xe7, 0x13, + 0x7c, 0x9f, 0xd5, 0xb9, 0xba, 0x29, 0xdb, 0x57, + 0xf9, 0xad, 0xad, 0xae, 0x22, 0xe6, 0x27, 0x89, + 0x92, 0xc3, 0xa3, 0xf5, 0x6f, 0x68, 0x73, 0x74, + 0x6a, 0xd0, 0x45, 0x16, 0xb8, 0xec, 0x32, 0xf8, + 0x61, 0x7c, 0x11, 0x5a, 0xc5, 0x1c, 0x32, 0x7e, + 0xd2, 0x36, 0xb0, 0x06, 0x3b, 0xce, 0x00, 0x69, + 0x41, 0xf3, 0xc7, 0x6d, 0x2d, 0x9c, 0x9b, 0x16, + 0x32, 0x58, 0xe3, 0x91, 0xd7, 0xac, 0x66, 0x17, + 0xd0, 0x7e, 0xad, 0xac, 0x6b, 0xc3, 0xcb, 0xcb, + 0xbb, 0x4b, 0x16, 0xe4, 0x7f, 0xb7, 0x17, 0x9f, + 0xf9, 0x6d, 0xfa, 0xec, 0x5f, 0x40, 0x83, 0x27, + 0xca, 0xa0, 0x6c, 0x8c, 0x86, 0xce, 0x08, 0xdb, + 0x28, 0xa4, 0x80, 0x31, 0xa6, 0xa0, 0xee, 0x69, + 0x1a, 0x96, 0xd1, 0x63, 0x62, 0x21, 0x36, 0xe2, + 0xda, 0x11, 0x03, 0x8d, 0x5d, 0x0f, 0x36, 0xcc, + 0x04, 0xef, 0x96, 0x52, 0x88, 0x20, 0xff, 0x00, + 0x0f, 0x29, 0xf0, 0xd4, 0x23, 0x73, 0x9d, 0x97, + 0xeb, 0x95, 0x57, 0xc8, 0xee, 0xa0, 0xd9, 0x9d, + 0xa9, 0xbc, 0x8b, 0x35, 0x0e, 0x64, 0x4e, 0x12, + 0x46, 0x5c, 0x5b, 0x5a, 0x02, 0xe6, 0xca, 0xd7, + 0xd3, 0x74, 0x1a, 0x2f, 0xa4, 0x43, 0x04, 0x16, + 0xf1, 0xf3, 0x70, 0x46, 0xc8, 0x63, 0x1a, 0x43, + 0x23, 0x68, 0x63, 0x74, 0xf6, 0x1a, 0x00, 0x5a, + 0x6e, 0xf2, 0xdc, 0xba, 0xfb, 0x0f, 0xb6, 0x5b, + 0x47, 0x70, 0x5a, 0x3c, 0x52, 0xf6, 0xd5, 0xc0, + 0x6f, 0x62, 0x41, 0x58, 0xc8, 0x76, 0x93, 0x38, + 0xce, 0x73, 0xcb, 0xb6, 0x5a, 0x35, 0x83, 0x2d, + 0x89, 0x92, 0xbe, 0x2a, 0xc6, 0x01, 0xf2, 0x70, + 0xc3, 0x89, 0xd5, 0xf9, 0xd4, 0x24, 0x6f, 0x28, + 0xfb, 0x0d, 0xac, 0xb1, 0xbe, 0xf6, 0x9b, 0x6d, + 0xaf, 0x86, 0x27, 0x3a, 0x2a, 0x08, 0x9c, 0xc8, + 0x48, 0x70, 0x2d, 0xc5, 0x8d, 0xb8, 0x9a, 0x6a, + 0x1d, 0x4a, 0x51, 0x5e, 0xed, 0xad, 0x2d, 0xad, + 0x23, 0x31, 0x5a, 0xc2, 0xc8, 0x23, 0x3a, 0x70, + 0x46, 0xd0, 0xd1, 0x5d, 0xf2, 0xb4, 0x5d, 0x64, + 0xf9, 0x55, 0xdc, 0x9c, 0xed, 0xd5, 0xa4, 0x33, + 0x4a, 0x7c, 0xa9, 0x1c, 0xd0, 0x5c, 0x4f, 0x64, + 0xeb, 0x28, 0x29, 0x3f, 0x86, 0xf0, 0xca, 0x73, + 0x4b, 0xd9, 0xe1, 0x0e, 0x16, 0x62, 0x32, 0xcf, + 0x18, 0xd6, 0xa5, 0xcf, 0x0e, 0x60, 0xec, 0xbb, + 0x0a, 0xfa, 0x16, 0x9e, 0x2e, 0xea, 0xf1, 0x0c, + 0x30, 0xdb, 0xc6, 0xd8, 0x60, 0x8d, 0x90, 0xc6, + 0xdf, 0x26, 0x38, 0xc0, 0x6b, 0x47, 0x71, 0xab, + 0xda, 0x02, 0x22, 0x20, 0x22, 0x22, 0x0a, 0x4b, + 0xbf, 0xfd, 0x51, 0x8b, 0xcd, 0x6f, 0xfd, 0x16, + 0xab, 0xf7, 0xf4, 0x78, 0x15, 0x05, 0xdf, 0xfe, + 0xa8, 0xc5, 0xe6, 0xb7, 0xfe, 0x8b, 0x55, 0xfb, + 0xfa, 0x3c, 0x08, 0x0b, 0xcc, 0x85, 0xc2, 0x37, + 0x96, 0xe9, 0x70, 0x69, 0xc2, 0x3b, 0x34, 0xd0, + 0xbd, 0x27, 0x67, 0x55, 0x34, 0xd5, 0x05, 0x47, + 0xf0, 0xe0, 0x31, 0xf9, 0x7d, 0xed, 0xcb, 0xe8, + 0xeb, 0xc9, 0x2e, 0xde, 0x27, 0x71, 0xf2, 0xc6, + 0x86, 0x96, 0xf7, 0x2b, 0x55, 0xe6, 0xd6, 0x90, + 0xfe, 0x23, 0xdc, 0xc7, 0x68, 0x29, 0x14, 0xf6, + 0xd8, 0xee, 0xda, 0xdd, 0xd7, 0x81, 0x88, 0x38, + 0xf6, 0x6a, 0xbb, 0x2e, 0x76, 0x39, 0xec, 0xbd, + 0x9a, 0xf7, 0x25, 0xcc, 0x66, 0xca, 0xdf, 0x71, + 0xa6, 0x78, 0xa3, 0x0d, 0x7c, 0x6e, 0x3b, 0xa4, + 0x03, 0xc4, 0xbb, 0x72, 0x2d, 0x9b, 0xb6, 0xc9, + 0x9f, 0x35, 0xc7, 0x3d, 0x25, 0xdd, 0xed, 0xc9, + 0x06, 0x7b, 0xb9, 0xa9, 0x88, 0xf6, 0x34, 0x6a, + 0x08, 0x36, 0xe4, 0x99, 0xed, 0x96, 0x77, 0x0c, + 0xd3, 0x5a, 0x07, 0xb7, 0x98, 0x94, 0xc3, 0x23, + 0x64, 0x14, 0x21, 0xc3, 0x76, 0x9d, 0xd5, 0x03, + 0x6f, 0x49, 0x3f, 0x12, 0xe6, 0x30, 0x9a, 0xb6, + 0x2b, 0x4c, 0x37, 0x07, 0xfa, 0xd8, 0x45, 0x01, + 0xec, 0x8d, 0x01, 0x76, 0x5d, 0x6c, 0x73, 0x9b, + 0x7f, 0x35, 0xf6, 0x4d, 0x98, 0xcd, 0x95, 0xc9, + 0x73, 0xfb, 0x78, 0xe3, 0x0d, 0x74, 0x6e, 0xec, + 0xf8, 0xcb, 0xbb, 0x21, 0xd9, 0xdb, 0x5c, 0x99, + 0xb2, 0xc8, 0xd9, 0x1f, 0x73, 0x77, 0x72, 0x71, + 0x5c, 0x5d, 0x4b, 0xa5, 0xee, 0x3b, 0xc8, 0x25, + 0x94, 0x16, 0xdc, 0x5b, 0x3e, 0xe7, 0x65, 0xaf, + 0x9a, 0xc1, 0x88, 0xc6, 0xd6, 0xcb, 0x41, 0xa4, + 0x9c, 0x0e, 0x05, 0x4e, 0xac, 0x3d, 0x8d, 0x7b, + 0x1c, 0xc7, 0x80, 0xe6, 0x38, 0x16, 0xbd, 0xa7, + 0x51, 0x04, 0x50, 0x84, 0x11, 0x9b, 0x2f, 0x74, + 0xcb, 0xbd, 0x9e, 0xcb, 0xe6, 0x61, 0x0e, 0xfd, + 0x4b, 0x18, 0xfa, 0x7c, 0xf6, 0x8c, 0x0e, 0x1d, + 0x8d, 0x21, 0x72, 0x64, 0xb9, 0xed, 0xe6, 0x67, + 0xb4, 0x19, 0x9d, 0x88, 0x0c, 0x36, 0x16, 0x14, + 0x6b, 0x24, 0x68, 0xf1, 0x8b, 0xea, 0x34, 0x17, + 0x6a, 0xdf, 0x5c, 0x8e, 0xd8, 0x59, 0x6d, 0xdf, + 0x23, 0x72, 0x9c, 0xda, 0xe6, 0xc2, 0xd6, 0x62, + 0x5c, 0xeb, 0x76, 0xd0, 0xb5, 0xb5, 0xd7, 0x80, + 0xee, 0x29, 0xac, 0x8f, 0x23, 0xb2, 0xc8, 0xed, + 0x3d, 0x96, 0xd6, 0xae, 0xc4, 0x71, 0xc9, 0x23, + 0xf4, 0xb9, 0xef, 0x3f, 0x9c, 0x4a, 0x09, 0x01, + 0xa9, 0x13, 0xb6, 0x88, 0x2a, 0x7f, 0x89, 0x9f, + 0xe9, 0xaf, 0xff, 0x00, 0x3c, 0x6a, 0x77, 0x67, + 0xff, 0x00, 0x90, 0xe5, 0xdf, 0xf8, 0xd1, 0x7d, + 0x40, 0xa0, 0xff, 0x00, 0x12, 0xff, 0x00, 0xd3, + 0x7f, 0xfe, 0x78, 0xfe, 0x55, 0x39, 0x90, 0x7f, + 0x23, 0xcb, 0xff, 0x00, 0xf1, 0xa2, 0xfa, 0x81, + 0x07, 0x7a, 0xc8, 0xd6, 0xb0, 0x81, 0x05, 0x4b, + 0xf0, 0xfb, 0x4b, 0x73, 0x7f, 0xfc, 0xd3, 0xe0, + 0x2b, 0xc6, 0x61, 0xff, 0x00, 0x6b, 0xf8, 0x93, + 0x61, 0x33, 0xce, 0x18, 0xee, 0xad, 0x4c, 0x4c, + 0x71, 0xf9, 0xde, 0x3a, 0x9d, 0xc8, 0xf2, 0x18, + 0x72, 0x61, 0x75, 0xcc, 0xcc, 0xf9, 0xbd, 0xb2, + 0x5e, 0x79, 0xc5, 0xe0, 0x0a, 0x1d, 0x3a, 0x06, + 0x1e, 0xda, 0xc6, 0x7d, 0xb3, 0xd6, 0x99, 0xdc, + 0x31, 0x09, 0x1e, 0xfb, 0x7b, 0x9b, 0x77, 0x62, + 0xb7, 0xb9, 0x8b, 0x43, 0xd8, 0x50, 0x43, 0xfe, + 0x25, 0x3c, 0x9c, 0x86, 0x2b, 0x5f, 0xf8, 0xd7, + 0x37, 0x31, 0xb6, 0x36, 0x6b, 0x24, 0x8a, 0xea, + 0xee, 0xa9, 0x67, 0x67, 0x56, 0x36, 0x59, 0x95, + 0x9e, 0x47, 0x30, 0x78, 0xb8, 0x9e, 0x21, 0xcc, + 0xc9, 0x41, 0xcd, 0x9a, 0x02, 0x29, 0x8a, 0xba, + 0x0e, 0x85, 0xc7, 0x67, 0xb2, 0x0f, 0xf6, 0xf8, + 0x6f, 0xf3, 0x7c, 0xc2, 0x6c, 0xd6, 0x5b, 0x4d, + 0x36, 0xd1, 0xc8, 0x03, 0x58, 0xd3, 0xf3, 0xa8, + 0xdd, 0x65, 0x76, 0xe7, 0xfb, 0x3b, 0x69, 0x9d, + 0xb2, 0x27, 0x4b, 0x23, 0xed, 0xee, 0xad, 0x9c, + 0x5d, 0x6d, 0x75, 0x11, 0xa3, 0xd8, 0x4e, 0xba, + 0x55, 0x04, 0x57, 0xe2, 0x4b, 0xa1, 0x1b, 0x35, + 0x81, 0xc0, 0x19, 0x1f, 0x3c, 0x7c, 0xd3, 0x74, + 0x54, 0x9d, 0x38, 0xa9, 0xdc, 0x56, 0x4b, 0x21, + 0x23, 0x6c, 0xe0, 0x6c, 0x84, 0x97, 0x88, 0x98, + 0x1e, 0x7f, 0xac, 0x1a, 0x2b, 0x5e, 0xca, 0x80, + 0x83, 0x63, 0x5f, 0x25, 0xec, 0x37, 0x79, 0xce, + 0x63, 0x36, 0x68, 0x6d, 0x4d, 0x60, 0x85, 0xe0, + 0x35, 0x8d, 0x70, 0xfc, 0xe2, 0x1b, 0xa0, 0xab, + 0x2a, 0x00, 0xdc, 0x07, 0x52, 0xa6, 0xec, 0xb9, + 0xf6, 0x3d, 0xb2, 0xcf, 0x6c, 0x65, 0xf1, 0x64, + 0xb8, 0x3c, 0xfc, 0x60, 0xfe, 0x76, 0x23, 0x8f, + 0xc5, 0xe5, 0x2b, 0x90, 0x50, 0xb9, 0xee, 0xca, + 0xdb, 0x66, 0xf3, 0xc7, 0x7d, 0x14, 0xf2, 0x58, + 0xe6, 0x10, 0x8c, 0x31, 0xdd, 0xc0, 0x74, 0x96, + 0xef, 0x39, 0x06, 0xbd, 0xaf, 0xcf, 0x6f, 0x32, + 0x6b, 0x6b, 0x61, 0x62, 0xd6, 0x3e, 0xf2, 0xee, + 0x61, 0x14, 0x71, 0xc8, 0x2a, 0x08, 0x23, 0x78, + 0x76, 0x54, 0xe8, 0xae, 0x11, 0x5d, 0x74, 0x15, + 0x55, 0xec, 0xbb, 0x63, 0xdb, 0x06, 0x60, 0xcc, + 0xcb, 0x33, 0xbd, 0x97, 0x34, 0xba, 0x87, 0xf6, + 0x1c, 0xf5, 0x03, 0x18, 0x7e, 0x75, 0x15, 0x88, + 0xe8, 0xd0, 0x80, 0x35, 0xfe, 0x5b, 0xea, 0x8d, + 0xf8, 0x63, 0xfb, 0x5c, 0xdf, 0xed, 0x19, 0xe1, + 0x72, 0xbc, 0x8d, 0x7f, 0x96, 0xfa, 0xa2, 0xfe, + 0x18, 0xfe, 0xd7, 0x36, 0xfb, 0x46, 0x78, 0x5c, + 0x82, 0xfa, 0xa2, 0x73, 0x9f, 0x79, 0xb2, 0xf3, + 0xfe, 0x50, 0xa5, 0x54, 0x56, 0x73, 0xef, 0x36, + 0x5e, 0x7f, 0xca, 0x10, 0x63, 0x26, 0xf7, 0xab, + 0xdf, 0x3c, 0xfd, 0x62, 0xa5, 0x54, 0x56, 0x4d, + 0xef, 0x57, 0xbe, 0x79, 0xfa, 0xc5, 0x4a, 0xa0, + 0x22, 0x22, 0x02, 0x22, 0x20, 0xf8, 0xf7, 0xe3, + 0x23, 0x1e, 0xed, 0xa0, 0xb5, 0xc2, 0xd2, 0x7f, + 0xed, 0x46, 0xa1, 0x5f, 0xce, 0x72, 0xf7, 0xf8, + 0x34, 0xc7, 0xb7, 0x3b, 0xbd, 0x2e, 0x69, 0x03, + 0xd9, 0xb7, 0x45, 0x3f, 0x3c, 0x2f, 0xaf, 0x69, + 0xd2, 0x01, 0xd7, 0xad, 0x2a, 0x4e, 0x9d, 0x35, + 0x02, 0x9a, 0x7b, 0x28, 0x0b, 0x23, 0x58, 0x58, + 0x43, 0xab, 0xfa, 0x68, 0x83, 0xf3, 0x96, 0xd3, + 0x47, 0x23, 0xb6, 0x8b, 0x33, 0x21, 0xa4, 0x83, + 0x75, 0x31, 0x04, 0x03, 0xf3, 0xca, 0xfb, 0x47, + 0xe1, 0xc0, 0x3f, 0x06, 0x65, 0xed, 0x20, 0xd6, + 0x8f, 0xa8, 0xdd, 0xf2, 0xdd, 0xf2, 0x2b, 0x2f, + 0x8d, 0xb8, 0x68, 0x7f, 0x2e, 0xca, 0x6b, 0xd3, + 0xab, 0x7b, 0xb0, 0x83, 0xe2, 0x1f, 0x8a, 0xd9, + 0x63, 0xed, 0xb6, 0xb6, 0x59, 0xd8, 0xc2, 0x59, + 0x7b, 0x1b, 0x26, 0x04, 0x54, 0xf8, 0xd4, 0xc0, + 0xef, 0xaa, 0xb1, 0xf8, 0x59, 0x95, 0xbe, 0xeb, + 0x6b, 0x21, 0x99, 0xec, 0x3c, 0xdd, 0x9c, 0x6f, + 0x9c, 0xd4, 0x1a, 0x54, 0x0c, 0x0d, 0x1d, 0xba, + 0xba, 0xbd, 0xc5, 0xf7, 0x01, 0x51, 0xa8, 0xf0, + 0x26, 0x93, 0xac, 0x93, 0xf9, 0x6a, 0x41, 0x59, + 0xfc, 0x47, 0x05, 0xdb, 0x17, 0x99, 0x80, 0x2a, + 0x4b, 0x63, 0xa0, 0x1f, 0x6a, 0xc2, 0xbe, 0x31, + 0xb3, 0x51, 0x4b, 0xf1, 0x16, 0x56, 0x70, 0x3a, + 0x82, 0xee, 0x12, 0x4d, 0x0e, 0xe4, 0x8d, 0x25, + 0x7e, 0x8d, 0xd3, 0xc5, 0xbb, 0xc4, 0x9a, 0x69, + 0x4a, 0xf0, 0x9f, 0x0a, 0x0c, 0x9d, 0x6b, 0x08, + 0x88, 0x32, 0x35, 0x85, 0xf9, 0xaf, 0x39, 0x8a, + 0x5e, 0xb8, 0xbf, 0x38, 0x1d, 0xef, 0x13, 0x6e, + 0x1f, 0x9e, 0xe5, 0xfa, 0x4d, 0x2a, 0x46, 0xad, + 0x1d, 0xe4, 0x10, 0x7b, 0x0a, 0x08, 0xd8, 0xfc, + 0xa4, 0x11, 0x42, 0x20, 0x00, 0x83, 0xbf, 0x57, + 0x29, 0xce, 0xf1, 0xd5, 0xa3, 0x72, 0x9a, 0x6a, + 0x88, 0x83, 0xe7, 0x3b, 0x77, 0xf8, 0x68, 0xfb, + 0xe9, 0xe4, 0xcd, 0xf2, 0x16, 0xb5, 0xb7, 0x0f, + 0x25, 0xd7, 0x16, 0x55, 0x0d, 0xc6, 0xef, 0x9f, + 0x11, 0xd5, 0x88, 0xee, 0xb4, 0xaf, 0x95, 0xde, + 0x58, 0xdf, 0x58, 0x5c, 0x3a, 0x1b, 0xc8, 0x24, + 0xb7, 0x99, 0x87, 0x4b, 0x24, 0x69, 0x61, 0xe0, + 0x20, 0x2f, 0xd3, 0x4b, 0x5c, 0xd6, 0xd0, 0x5c, + 0x33, 0x9b, 0xb8, 0x8d, 0x93, 0x33, 0xe6, 0x48, + 0xd6, 0xb8, 0x77, 0x71, 0x02, 0x83, 0xf3, 0x2b, + 0xe5, 0x96, 0x62, 0x31, 0xbd, 0xd2, 0x11, 0xa0, + 0x62, 0x25, 0xd4, 0xed, 0x55, 0x58, 0xb6, 0x67, + 0x60, 0xb3, 0xdc, 0xfa, 0x66, 0x38, 0x42, 0xeb, + 0x5b, 0x1a, 0x8e, 0x72, 0xee, 0x56, 0x96, 0x8c, + 0x3f, 0xd4, 0x07, 0xcb, 0x3d, 0xa5, 0xf7, 0x28, + 0xb2, 0xac, 0xae, 0x07, 0x07, 0x43, 0x67, 0x6f, + 0x13, 0xc6, 0xa7, 0xb2, 0x26, 0x35, 0xdc, 0x2d, + 0x01, 0x75, 0x69, 0xdd, 0xd3, 0x4e, 0x0e, 0xe2, + 0x0e, 0x2c, 0x9f, 0x29, 0xb3, 0xc9, 0xb2, 0xf8, + 0x72, 0xeb, 0x16, 0x60, 0x82, 0x01, 0x41, 0xbe, + 0xe7, 0x1f, 0x29, 0xce, 0x3b, 0xa4, 0xee, 0xae, + 0xd4, 0x44, 0x0f, 0xcb, 0xc2, 0xbe, 0x19, 0xf8, + 0xa4, 0xc7, 0xbb, 0x6d, 0x2f, 0x0b, 0x5a, 0x48, + 0x2c, 0x87, 0x48, 0x15, 0xff, 0x00, 0x86, 0xd5, + 0xf7, 0x3f, 0x0e, 0xe2, 0x02, 0x46, 0xad, 0x1d, + 0xa4, 0x1f, 0x3e, 0xfc, 0x18, 0x6b, 0x9b, 0x91, + 0x5f, 0x87, 0x02, 0x09, 0xb9, 0xa8, 0x07, 0x46, + 0x8c, 0x0c, 0x0b, 0xe8, 0x25, 0xcd, 0x63, 0x4b, + 0x9d, 0xe4, 0xb4, 0x12, 0xee, 0xd0, 0xd2, 0x50, + 0x92, 0x75, 0xe9, 0x44, 0x1f, 0x9c, 0x36, 0x82, + 0xf6, 0xeb, 0x35, 0xce, 0x6f, 0x33, 0x09, 0x5a, + 0xe7, 0x3a, 0xe2, 0x57, 0x38, 0x68, 0x3a, 0x1b, + 0x5a, 0x34, 0x72, 0x42, 0x8e, 0xe6, 0xa5, 0xf9, + 0x8e, 0xe0, 0x2b, 0xf5, 0x0d, 0x5d, 0xbf, 0xa3, + 0xb6, 0x98, 0x9d, 0xbe, 0x78, 0x50, 0x7e, 0x5e, + 0xe6, 0xa5, 0xf9, 0x8e, 0xe0, 0x2b, 0x6d, 0xac, + 0x32, 0xfb, 0x4c, 0x5e, 0x23, 0xbc, 0xb6, 0xee, + 0x1d, 0xf5, 0xfa, 0x73, 0x13, 0xb7, 0xcf, 0x0a, + 0xc1, 0x2e, 0xdf, 0x3b, 0xdb, 0xe8, 0x35, 0xba, + 0x38, 0xe6, 0xb7, 0xe6, 0x64, 0x68, 0x7c, 0x72, + 0x47, 0x85, 0xcd, 0x3a, 0x88, 0x22, 0x84, 0x77, + 0x41, 0x5f, 0x07, 0xdb, 0x0d, 0x89, 0xcc, 0xb6, + 0x7a, 0xf6, 0x57, 0x36, 0x27, 0xcb, 0x96, 0xb9, + 0xc4, 0xdb, 0xdc, 0xb4, 0x54, 0x06, 0x9d, 0x4d, + 0x92, 0x9e, 0x49, 0xed, 0xaf, 0xbe, 0x0a, 0xee, + 0xac, 0x16, 0x83, 0x50, 0x74, 0x82, 0x35, 0x7c, + 0x88, 0x3f, 0x35, 0xb3, 0x37, 0xcd, 0x23, 0xb6, + 0xf6, 0x36, 0x5e, 0x4e, 0xcb, 0x6a, 0x53, 0x98, + 0x12, 0x3c, 0x32, 0x87, 0x58, 0xc1, 0x5a, 0x69, + 0x52, 0xfb, 0x2f, 0xb1, 0x19, 0xc6, 0xd1, 0x5c, + 0x34, 0xc5, 0x13, 0xad, 0xec, 0x6b, 0xfa, 0xcb, + 0xb9, 0x01, 0x0d, 0x0d, 0xfe, 0xa5, 0x7c, 0xa7, + 0x76, 0x97, 0xdc, 0x86, 0x4f, 0x94, 0x35, 0xfc, + 0xe0, 0xb0, 0xb5, 0x0f, 0xf9, 0xe2, 0x18, 0xf1, + 0x70, 0xe1, 0x0b, 0xac, 0x0a, 0x0a, 0x0d, 0x5b, + 0xdc, 0x48, 0x39, 0x72, 0xcc, 0xb6, 0xd7, 0x2a, + 0xb0, 0x83, 0x2e, 0xb3, 0x66, 0x1b, 0x7b, 0x76, + 0xe0, 0x63, 0x4e, 0xb3, 0xba, 0x5c, 0xe3, 0xbe, + 0x4a, 0xf9, 0x7f, 0xe2, 0xa6, 0xd5, 0x3e, 0xf6, + 0xe3, 0xa8, 0x6c, 0x6a, 0x6d, 0xad, 0x9c, 0x1d, + 0x76, 0xf6, 0xd6, 0x92, 0x48, 0x34, 0xb5, 0x9a, + 0x35, 0x86, 0x77, 0xcf, 0x69, 0x7d, 0x6d, 0x3c, + 0x6a, 0xeb, 0xee, 0x1d, 0x35, 0x28, 0x3e, 0x13, + 0xf8, 0x7f, 0xb2, 0x2f, 0xcf, 0xf3, 0x96, 0xba, + 0xea, 0x33, 0xd5, 0xd6, 0x74, 0x92, 0xe4, 0x91, + 0x40, 0xf2, 0x34, 0xb6, 0x2e, 0xef, 0x81, 0x7d, + 0x7b, 0x6a, 0x36, 0x72, 0xdb, 0x68, 0x32, 0x59, + 0xb2, 0xd7, 0x80, 0xc7, 0xd0, 0x3e, 0xd6, 0x4a, + 0x7e, 0xce, 0x46, 0x8f, 0x10, 0x8e, 0xc7, 0xe6, + 0x9e, 0xc2, 0x98, 0xd7, 0xaf, 0x73, 0xb3, 0x54, + 0x41, 0xf9, 0x9e, 0xe2, 0xca, 0xf2, 0xca, 0xee, + 0x4b, 0x79, 0xa3, 0x7c, 0x73, 0xdb, 0xbc, 0xb5, + 0xc2, 0x86, 0xa1, 0xcd, 0x3a, 0xc1, 0x5f, 0x6d, + 0xfc, 0x3e, 0xda, 0xb7, 0x67, 0xf9, 0x48, 0x86, + 0xea, 0xa3, 0x30, 0xb3, 0x01, 0x93, 0xd7, 0x41, + 0x7b, 0x47, 0x93, 0x28, 0xee, 0x6b, 0x1b, 0xea, + 0xd9, 0x57, 0x6f, 0x9e, 0x15, 0x8a, 0x9a, 0xef, + 0xf6, 0xf7, 0x7b, 0x08, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x12, 0xa8, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0xb9, + 0x73, 0x6f, 0xe5, 0x77, 0x9f, 0x61, 0x27, 0xd4, + 0x72, 0xea, 0x5a, 0x2f, 0xe1, 0x7c, 0xf6, 0x37, + 0x10, 0x47, 0x4c, 0x73, 0x44, 0xf6, 0x36, 0xba, + 0x05, 0x5c, 0xd2, 0x05, 0x78, 0x50, 0x54, 0x7f, + 0x0d, 0x48, 0xea, 0x39, 0xfe, 0xdc, 0xfd, 0x50, + 0xad, 0x8a, 0x85, 0x61, 0xb2, 0x7b, 0x7d, 0x96, + 0xc2, 0xe8, 0x2c, 0x2f, 0x22, 0xb7, 0x89, 0xce, + 0xc6, 0xe6, 0x32, 0x41, 0x42, 0x48, 0xa7, 0xe7, + 0x46, 0xe5, 0xd3, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0xbf, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0b, 0xa2, 0x2a, + 0x5f, 0x52, 0xfe, 0x26, 0xfd, 0xe6, 0xcf, 0xde, + 0x37, 0xf8, 0x29, 0xd4, 0xbf, 0x89, 0x9f, 0x79, + 0xb3, 0xf7, 0x8d, 0xfe, 0x0a, 0x0f, 0x2e, 0xff, + 0x00, 0xf5, 0x46, 0x3e, 0xc3, 0x5b, 0xff, 0x00, + 0x45, 0xaa, 0xfd, 0xfd, 0x0b, 0xe6, 0xff, 0x00, + 0x07, 0xed, 0xd7, 0x59, 0x0c, 0xc8, 0xdc, 0xc2, + 0x6f, 0x86, 0x83, 0x73, 0xce, 0x0a, 0xd0, 0x0c, + 0x1e, 0xae, 0x9a, 0x86, 0xf2, 0xed, 0xea, 0x8f, + 0xc5, 0x0f, 0xbd, 0x19, 0xab, 0xd6, 0x37, 0xf8, + 0x28, 0x2f, 0x68, 0xa8, 0x9d, 0x51, 0xf8, 0xa1, + 0xf7, 0x9b, 0x3f, 0x78, 0xdf, 0xe0, 0xa7, 0x54, + 0x7e, 0x28, 0x7d, 0xe6, 0xcf, 0xde, 0x37, 0xf8, + 0x28, 0x2f, 0x68, 0xa8, 0x9d, 0x51, 0xf8, 0xa1, + 0xf7, 0x9b, 0x3f, 0x78, 0xdf, 0xe0, 0xa7, 0x54, + 0x7e, 0x28, 0x7d, 0xe6, 0xcf, 0xde, 0x37, 0xf8, + 0x28, 0x2f, 0x68, 0xa8, 0x9d, 0x51, 0xf8, 0xa1, + 0xf7, 0x9b, 0x3f, 0x78, 0xdf, 0xe0, 0xa7, 0x54, + 0x7e, 0x28, 0x7d, 0xe6, 0xcf, 0xde, 0x37, 0xf8, + 0x28, 0x2f, 0x68, 0xa8, 0x9d, 0x51, 0xf8, 0xa1, + 0xf7, 0x9b, 0x3f, 0x78, 0xdf, 0xe0, 0xa7, 0x54, + 0x7e, 0x28, 0x7d, 0xe6, 0xcf, 0xde, 0x37, 0xf8, + 0x28, 0x2f, 0x68, 0xa8, 0x9d, 0x51, 0xf8, 0xa1, + 0xf7, 0x9b, 0x3f, 0x78, 0xdf, 0xe0, 0xa7, 0x54, + 0x7e, 0x28, 0x7d, 0xe6, 0xcf, 0xde, 0x37, 0xf8, + 0x28, 0x2f, 0x68, 0xa8, 0x9d, 0x51, 0xf8, 0xa1, + 0xf7, 0x9b, 0x3f, 0x78, 0xdf, 0xe0, 0xac, 0xf5, + 0x47, 0xe2, 0x87, 0xde, 0x6c, 0xfd, 0xe3, 0x7f, + 0x82, 0x83, 0xbb, 0xf1, 0x33, 0xfd, 0x3a, 0xde, + 0xc5, 0xc3, 0x2b, 0xdf, 0x53, 0xb9, 0x0f, 0xf2, + 0x4c, 0xbf, 0xff, 0x00, 0x1a, 0x2f, 0xa8, 0x15, + 0x2e, 0xff, 0x00, 0x65, 0x76, 0xff, 0x00, 0x32, + 0x80, 0x5b, 0xe6, 0x17, 0xb1, 0x5c, 0x42, 0x1c, + 0x1d, 0xcd, 0xbe, 0x41, 0x4a, 0x8d, 0x03, 0xc9, + 0x89, 0xab, 0x74, 0x39, 0x17, 0xe2, 0x5c, 0x10, + 0xb2, 0x18, 0xb3, 0x18, 0xd9, 0x1c, 0x4d, 0x6b, + 0x23, 0x60, 0x78, 0x00, 0x06, 0xf8, 0xa0, 0x7e, + 0xcb, 0x78, 0x20, 0xbe, 0xa2, 0xa2, 0x75, 0x47, + 0xe2, 0x87, 0xde, 0x6c, 0xfd, 0xe3, 0x7f, 0x82, + 0x9d, 0x51, 0xf8, 0xa1, 0xf7, 0x9b, 0x3f, 0x78, + 0xdf, 0xe0, 0xa0, 0xbd, 0xa2, 0xa2, 0x75, 0x47, + 0xe2, 0x87, 0xde, 0x6c, 0xfd, 0xe3, 0x7f, 0x82, + 0x9d, 0x51, 0xf8, 0xa1, 0xf7, 0x9b, 0x3f, 0x78, + 0xdf, 0xe0, 0xa0, 0xbd, 0xa2, 0xa2, 0x75, 0x47, + 0xe2, 0x87, 0xde, 0x6c, 0xfd, 0xe3, 0x7f, 0x82, + 0x9d, 0x51, 0xf8, 0xa1, 0xf7, 0x9b, 0x3f, 0x78, + 0xdf, 0xe0, 0xa0, 0xbd, 0xa2, 0xa2, 0x75, 0x47, + 0xe2, 0x87, 0xde, 0x6c, 0xfd, 0xe3, 0x7f, 0x82, + 0x9d, 0x51, 0xf8, 0xa1, 0xf7, 0x9b, 0x3f, 0x78, + 0xdf, 0xe0, 0xa0, 0xbd, 0xa2, 0xa2, 0x75, 0x47, + 0xe2, 0x87, 0xde, 0x6c, 0xfd, 0xe3, 0x7f, 0x82, + 0x9d, 0x51, 0xf8, 0x9f, 0xf7, 0x9b, 0x3f, 0x78, + 0xdf, 0xe0, 0xa0, 0xbd, 0xa2, 0xa2, 0x75, 0x47, + 0xe2, 0x7f, 0xde, 0x6c, 0xfd, 0xe3, 0x7f, 0x82, + 0x9d, 0x51, 0xf8, 0xa1, 0xf7, 0x9b, 0x3f, 0x78, + 0xdf, 0xe0, 0xa0, 0xbd, 0x8d, 0x7f, 0x96, 0xfa, + 0xa2, 0xfe, 0x18, 0xfe, 0xd7, 0x36, 0xfb, 0x46, + 0x78, 0x5c, 0x9d, 0x4f, 0xf8, 0x9f, 0xf7, 0x9b, + 0x0e, 0xf8, 0xe7, 0x1b, 0xdb, 0xf5, 0x2a, 0x4b, + 0x62, 0x36, 0x73, 0x33, 0xc9, 0x3d, 0xb0, 0xe6, + 0x1c, 0xd9, 0x75, 0xc1, 0x69, 0x69, 0x8d, 0xd8, + 0xb4, 0x8a, 0xd4, 0x9f, 0x15, 0xa8, 0x2d, 0x2a, + 0x2b, 0x38, 0xf7, 0xab, 0x2f, 0x3f, 0xe5, 0x0a, + 0x55, 0x45, 0x67, 0x1e, 0xf5, 0x65, 0xe7, 0xfc, + 0xa1, 0x03, 0x26, 0xf7, 0xab, 0xdf, 0x3c, 0xfd, + 0x62, 0xa5, 0x54, 0x56, 0x4d, 0xef, 0x57, 0xbe, + 0x79, 0xfa, 0xc5, 0x4a, 0xa0, 0x22, 0x22, 0x02, + 0x22, 0xd7, 0x73, 0x75, 0x6d, 0x67, 0x04, 0x97, + 0x37, 0x4f, 0x11, 0xc3, 0x13, 0x71, 0x39, 0xc7, + 0x70, 0x21, 0x11, 0x33, 0x31, 0x11, 0x1a, 0xcd, + 0xa7, 0x48, 0x88, 0xf1, 0xd5, 0xb6, 0x83, 0x4e, + 0x2d, 0x41, 0x72, 0x5c, 0xe7, 0x39, 0x25, 0xa1, + 0x2d, 0xb8, 0xbd, 0x86, 0x37, 0x0d, 0x6d, 0x73, + 0xdb, 0x8b, 0x82, 0xb5, 0x5f, 0x3d, 0xda, 0x0d, + 0xbb, 0xcc, 0x73, 0x12, 0xf8, 0x2c, 0xab, 0x67, + 0x6a, 0x49, 0xd2, 0xd3, 0xfa, 0xd7, 0x0f, 0xeb, + 0x38, 0x6a, 0xee, 0x2a, 0xb9, 0xad, 0x4b, 0x8e, + 0x92, 0xed, 0x24, 0x9d, 0x75, 0x59, 0x6f, 0xe6, + 0xe2, 0x27, 0x4a, 0xc6, 0xaf, 0x77, 0xca, 0xff, + 0x00, 0x6f, 0xe5, 0xbd, 0x77, 0x79, 0x8b, 0x4e, + 0x3d, 0x7f, 0x52, 0xba, 0x4c, 0xfe, 0x2f, 0xb0, + 0xfc, 0x57, 0xb3, 0x1d, 0x3a, 0x3e, 0x13, 0xc4, + 0xb3, 0xf1, 0x56, 0xcc, 0xf4, 0xe8, 0xfb, 0xfc, + 0x4b, 0xe3, 0x9a, 0x53, 0xba, 0xa9, 0xea, 0xed, + 0xd2, 0xd5, 0xff, 0x00, 0x5d, 0xc1, 0xf9, 0xb9, + 0x3f, 0x1d, 0xaf, 0xb1, 0xfc, 0x55, 0xb3, 0x3d, + 0x3a, 0x3e, 0xff, 0x00, 0x12, 0x7c, 0x55, 0xb3, + 0x3d, 0x3a, 0x3e, 0xff, 0x00, 0x12, 0xf8, 0xe7, + 0x75, 0x3b, 0xa9, 0xea, 0xef, 0xd3, 0x07, 0xfd, + 0x77, 0x07, 0xe6, 0xdf, 0xf7, 0x5f, 0x63, 0xf8, + 0xab, 0x66, 0x7a, 0x74, 0x7d, 0xfe, 0x24, 0xf8, + 0xab, 0x66, 0x7a, 0x74, 0x7d, 0xfe, 0x25, 0xf1, + 0xce, 0xea, 0x77, 0x53, 0xd5, 0xdf, 0xa6, 0x0f, + 0xfa, 0xee, 0x0f, 0xcd, 0xbf, 0xee, 0xbe, 0xc7, + 0xf1, 0x56, 0xcc, 0xf4, 0xe8, 0xfb, 0xfc, 0x49, + 0xf1, 0x56, 0xcc, 0xf4, 0xe8, 0xfb, 0xfc, 0x4b, + 0xe3, 0x9d, 0xd4, 0xee, 0xa7, 0xab, 0xbf, 0x4c, + 0x1f, 0xf5, 0xdc, 0x1f, 0x9b, 0x7f, 0xdd, 0x7d, + 0x8f, 0xe2, 0xad, 0x99, 0xe9, 0xd1, 0xf7, 0xf8, + 0x93, 0xe2, 0xad, 0x99, 0xe9, 0xd1, 0xf7, 0xf8, + 0x97, 0xc7, 0x3b, 0xa9, 0xdd, 0x4f, 0x57, 0x7e, + 0x98, 0x3f, 0xeb, 0xb8, 0x3f, 0x36, 0xff, 0x00, + 0xba, 0xfb, 0x1f, 0xc5, 0x5b, 0x33, 0xd3, 0xa3, + 0xef, 0xf1, 0x27, 0xc5, 0x5b, 0x33, 0xd3, 0xa3, + 0xef, 0xf1, 0x2f, 0x8e, 0x77, 0x53, 0xba, 0x9e, + 0xae, 0xfd, 0x30, 0x7f, 0xd7, 0x70, 0x7e, 0x6d, + 0xff, 0x00, 0x75, 0xf6, 0x3f, 0x8a, 0xb6, 0x67, + 0xa7, 0x47, 0xdf, 0xe2, 0x4f, 0x8a, 0xb6, 0x67, + 0xa7, 0x47, 0xdf, 0xe2, 0x5f, 0x1c, 0xee, 0xa7, + 0x75, 0x3d, 0x5d, 0xfa, 0x60, 0xff, 0x00, 0xae, + 0xe0, 0xfc, 0xdb, 0xfe, 0xeb, 0xec, 0x7f, 0x15, + 0x6c, 0xcf, 0x4e, 0x8f, 0xbf, 0xc4, 0x9f, 0x15, + 0x6c, 0xcf, 0x4e, 0x8f, 0xbf, 0xc4, 0xbe, 0x39, + 0xdd, 0x4e, 0xea, 0x7a, 0xbb, 0xf4, 0xc1, 0xff, + 0x00, 0x5d, 0xc1, 0xf9, 0xb7, 0xfd, 0xd7, 0xd8, + 0xfe, 0x2a, 0xd9, 0x9e, 0x9d, 0x1f, 0x7f, 0x89, + 0x3e, 0x2a, 0xd9, 0x9e, 0x9d, 0x1f, 0x7f, 0x89, + 0x7c, 0x73, 0xba, 0x9d, 0xd4, 0xf5, 0x77, 0xe9, + 0x83, 0xfe, 0xbb, 0x83, 0xf3, 0x6f, 0xfb, 0xaf, + 0xb1, 0xfc, 0x55, 0xb3, 0x3d, 0x3a, 0x3e, 0xff, + 0x00, 0x12, 0x7c, 0x55, 0xb3, 0x3d, 0x3a, 0x3e, + 0xff, 0x00, 0x12, 0xf8, 0xe7, 0x75, 0x3b, 0xa9, + 0xea, 0xef, 0xd3, 0x07, 0xfd, 0x77, 0x07, 0xe6, + 0xdf, 0xf7, 0x5f, 0x63, 0xf8, 0xab, 0x66, 0x7a, + 0x74, 0x7d, 0xfe, 0x24, 0xf8, 0xab, 0x66, 0x7a, + 0x74, 0x7d, 0xfe, 0x25, 0xf1, 0xce, 0xea, 0x77, + 0x53, 0xd5, 0xdf, 0xa6, 0x0f, 0xfa, 0xee, 0x0f, + 0xcd, 0xbf, 0xee, 0xbe, 0xc7, 0xf1, 0x56, 0xcc, + 0xf4, 0xe8, 0xfb, 0xfc, 0x49, 0xf1, 0x56, 0xcc, + 0xf4, 0xe8, 0xfb, 0xfc, 0x4b, 0xe3, 0x9d, 0xd4, + 0xee, 0xa7, 0xab, 0xbf, 0x4c, 0x1f, 0xf5, 0xdc, + 0x1f, 0x9b, 0x7f, 0xdd, 0x7d, 0x8f, 0xe2, 0xad, + 0x99, 0xe9, 0xd1, 0xf7, 0xf8, 0x93, 0xe2, 0xad, + 0x99, 0xe9, 0xd1, 0xf7, 0xf8, 0x97, 0xc7, 0x3b, + 0xa9, 0xdd, 0x4f, 0x57, 0x7e, 0x98, 0x3f, 0xeb, + 0xb8, 0x3f, 0x36, 0xff, 0x00, 0xba, 0xfb, 0x1f, + 0xc5, 0x5b, 0x33, 0xd3, 0xa3, 0xef, 0xf1, 0x27, + 0xc5, 0x5b, 0x33, 0xd3, 0xa3, 0xef, 0xf1, 0x2f, + 0x8e, 0x77, 0x53, 0xba, 0x9e, 0xae, 0xfd, 0x30, + 0x7f, 0xd7, 0x70, 0x7e, 0x6d, 0xff, 0x00, 0x75, + 0xf6, 0x3f, 0x8a, 0xb6, 0x67, 0xa7, 0x47, 0xdf, + 0xe2, 0x4f, 0x8a, 0xb6, 0x67, 0xa7, 0x47, 0xdf, + 0xe2, 0x5f, 0x1c, 0xee, 0xa7, 0x75, 0x3d, 0x5d, + 0xfa, 0x60, 0xff, 0x00, 0xae, 0xe0, 0xfc, 0xdb, + 0xfe, 0xeb, 0xec, 0x7f, 0x15, 0x6c, 0xcf, 0x4e, + 0x8f, 0xbf, 0xc4, 0x9f, 0x15, 0x6c, 0xcf, 0x4e, + 0x8f, 0xbf, 0xc4, 0xbe, 0x39, 0xdd, 0x4e, 0xea, + 0x7a, 0xbb, 0xf4, 0xc1, 0xff, 0x00, 0x5d, 0xc1, + 0xf9, 0xb7, 0xfd, 0xd7, 0xd8, 0xfe, 0x2a, 0xd9, + 0x9e, 0x9d, 0x1f, 0x7f, 0x89, 0x3e, 0x2a, 0xd9, + 0x9e, 0x9d, 0x1f, 0x7f, 0x89, 0x7c, 0x73, 0xba, + 0x9d, 0xd4, 0xf5, 0x77, 0xe9, 0x83, 0xfe, 0xbb, + 0x83, 0xf3, 0x6f, 0xfb, 0xaf, 0xb1, 0xfc, 0x55, + 0xb3, 0x3d, 0x3a, 0x3e, 0xff, 0x00, 0x12, 0x7c, + 0x55, 0xb3, 0x3d, 0x3a, 0x3e, 0xff, 0x00, 0x12, + 0xf8, 0xe7, 0x75, 0x3b, 0xa9, 0xea, 0xef, 0xd3, + 0x07, 0xfd, 0x77, 0x07, 0xe6, 0xdf, 0xf7, 0x5f, + 0x63, 0xf8, 0xab, 0x66, 0x7a, 0x74, 0x7d, 0xfe, + 0x24, 0xf8, 0xab, 0x66, 0x7a, 0x74, 0x7d, 0xfe, + 0x25, 0xf1, 0xce, 0xea, 0x77, 0x53, 0xd5, 0xdf, + 0xa6, 0x0f, 0xfa, 0xee, 0x0f, 0xcd, 0xbf, 0xee, + 0xbe, 0xc7, 0xf1, 0x56, 0xcc, 0xf4, 0xe8, 0xfb, + 0xfc, 0x49, 0xf1, 0x56, 0xcc, 0xf4, 0xe8, 0xfb, + 0xfc, 0x4b, 0xe3, 0x9d, 0xd4, 0xee, 0xa7, 0xab, + 0xbf, 0x4c, 0x1f, 0xf5, 0xdc, 0x1f, 0x9b, 0x7f, + 0xdd, 0x7d, 0x8f, 0xe2, 0xad, 0x99, 0xe9, 0xd1, + 0xf7, 0xf8, 0x96, 0x0e, 0xd5, 0xec, 0xc0, 0x15, + 0x37, 0xd1, 0xf0, 0x9e, 0x25, 0xf1, 0xde, 0xea, + 0x0e, 0xdd, 0x53, 0xd5, 0xdf, 0xa6, 0x0f, 0xfa, + 0xee, 0x0f, 0xcd, 0xbf, 0xee, 0xbe, 0xd1, 0x6f, + 0x9f, 0x64, 0x17, 0x4e, 0x0d, 0x82, 0xf6, 0x17, + 0x39, 0xda, 0x9b, 0xce, 0x36, 0xbc, 0x15, 0x5d, + 0xa2, 0x87, 0x4b, 0x4d, 0x47, 0x61, 0x7c, 0x2e, + 0xb5, 0xd6, 0x2a, 0xa7, 0x36, 0x7f, 0x6b, 0xb3, + 0x4c, 0xa2, 0x46, 0xc6, 0xe7, 0x9b, 0x8b, 0x2a, + 0x80, 0xf8, 0x1e, 0x6a, 0x43, 0x7f, 0xa8, 0x77, + 0x15, 0xe9, 0xe6, 0xe3, 0x5f, 0xaa, 0xba, 0x7b, + 0xd9, 0xfc, 0xcf, 0xf6, 0xf5, 0xeb, 0x5d, 0x70, + 0x5e, 0x6f, 0x31, 0x1f, 0x6d, 0xa3, 0x4d, 0x7f, + 0x17, 0xd6, 0x2a, 0x10, 0x2e, 0x6c, 0xbb, 0x32, + 0xb3, 0xcd, 0x2c, 0x99, 0x79, 0x66, 0xec, 0x71, + 0xbf, 0xb8, 0x41, 0xf9, 0xa7, 0xb2, 0xba, 0x46, + 0xa5, 0xa6, 0x27, 0xf1, 0x78, 0x36, 0xac, 0xd6, + 0xd3, 0x5b, 0x46, 0xdb, 0x57, 0x85, 0xab, 0x3c, + 0xc4, 0x45, 0x87, 0xbd, 0xac, 0x61, 0x73, 0xcd, + 0x1a, 0x06, 0x95, 0x28, 0x1c, 0xf6, 0xb5, 0xb8, + 0x9c, 0x40, 0x68, 0xd6, 0x4a, 0xe1, 0x9b, 0x35, + 0x63, 0x49, 0x6c, 0x2d, 0xc4, 0x77, 0xdd, 0xa9, + 0x71, 0xdd, 0x5d, 0xbe, 0xe1, 0xfa, 0xe9, 0x1b, + 0x4d, 0x1a, 0x38, 0xd6, 0x80, 0x1c, 0xe3, 0x84, + 0x0c, 0x44, 0xea, 0x03, 0x5a, 0x68, 0x78, 0xf0, + 0x74, 0x3b, 0x30, 0xbb, 0x71, 0xfd, 0xa1, 0x68, + 0xdc, 0x01, 0x78, 0xf6, 0xab, 0xad, 0xd9, 0x5c, + 0xba, 0x63, 0xcb, 0x5a, 0xc6, 0x73, 0xb7, 0x92, + 0x08, 0x99, 0xac, 0xb7, 0x8c, 0xaf, 0x26, 0xf3, + 0x22, 0x8f, 0x43, 0x58, 0x65, 0x1f, 0x38, 0x54, + 0x8f, 0x08, 0x53, 0x15, 0xb4, 0xf8, 0x42, 0x96, + 0xc9, 0x4a, 0xfd, 0xd7, 0x88, 0xf7, 0x34, 0x7b, + 0x55, 0xcf, 0xad, 0x77, 0x0a, 0x7b, 0x55, 0xcf, + 0xad, 0x77, 0x0a, 0xdf, 0xd6, 0x19, 0x27, 0xa8, + 0x77, 0x07, 0xe9, 0x27, 0x58, 0x64, 0x9e, 0xa1, + 0xdc, 0x1f, 0xa4, 0xad, 0xdb, 0xc9, 0xd3, 0x2a, + 0xfa, 0x8c, 0x3d, 0x70, 0xd1, 0xed, 0x57, 0x3e, + 0xb5, 0xdc, 0x29, 0xed, 0x57, 0x3e, 0xb5, 0xdc, + 0x2b, 0x7f, 0x58, 0x64, 0x9e, 0xa1, 0xdc, 0x1f, + 0xa4, 0x9d, 0x61, 0x92, 0x7a, 0x87, 0x70, 0x7e, + 0x92, 0x76, 0xf2, 0x74, 0x49, 0xea, 0x30, 0xf5, + 0xc3, 0x47, 0xb5, 0x5c, 0xfa, 0xd7, 0x70, 0xa7, + 0xb5, 0x5c, 0xfa, 0xd7, 0x70, 0xad, 0xfd, 0x61, + 0x92, 0x7a, 0x87, 0x70, 0x7e, 0x92, 0x75, 0x86, + 0x49, 0xea, 0x1d, 0xc1, 0xfa, 0x49, 0xdb, 0xc9, + 0xd1, 0x27, 0xa8, 0xc3, 0xd7, 0x0d, 0x1e, 0xd5, + 0x73, 0xeb, 0x5d, 0xc2, 0x9e, 0xd5, 0x73, 0xeb, + 0x5d, 0xc2, 0xb7, 0xf5, 0x86, 0x49, 0xea, 0x1d, + 0xc1, 0xfa, 0x49, 0xd6, 0x19, 0x27, 0xa8, 0x77, + 0x07, 0xe9, 0x27, 0x6f, 0x27, 0x44, 0x9e, 0xa3, + 0x0f, 0x5c, 0x34, 0x7b, 0x55, 0xcf, 0xad, 0x77, + 0x0a, 0x7b, 0x55, 0xcf, 0xad, 0x77, 0x0a, 0xdf, + 0xd6, 0x19, 0x27, 0xa8, 0x77, 0x07, 0xe9, 0x27, + 0x58, 0x64, 0x9e, 0xa1, 0xdc, 0x1f, 0xa4, 0x9d, + 0xbc, 0x9d, 0x12, 0x7a, 0x8c, 0x3d, 0x70, 0xd1, + 0xed, 0x57, 0x3e, 0xb5, 0xdc, 0x29, 0xed, 0x57, + 0x3e, 0xb5, 0xdc, 0x2b, 0x7f, 0x58, 0x64, 0x9e, + 0xa1, 0xdc, 0x1f, 0xa4, 0x9d, 0x61, 0x92, 0x7a, + 0x87, 0x70, 0x7e, 0x92, 0x76, 0xf2, 0x74, 0x49, + 0xea, 0x30, 0xf5, 0xc3, 0x47, 0xb5, 0x5c, 0xfa, + 0xd7, 0x70, 0xa7, 0xb5, 0x5c, 0xfa, 0xd7, 0x70, + 0xad, 0xfd, 0x61, 0x92, 0x7a, 0x87, 0x70, 0x7e, + 0x92, 0x75, 0x86, 0x49, 0xea, 0x1d, 0xc1, 0xfa, + 0x49, 0xdb, 0xc9, 0xd1, 0x27, 0xa8, 0xc3, 0xd7, + 0x0d, 0x1e, 0xd5, 0x73, 0xeb, 0x5d, 0xc2, 0x9e, + 0xd5, 0x73, 0xeb, 0x5d, 0xc2, 0xb7, 0xf5, 0x86, + 0x49, 0xea, 0x1d, 0xc1, 0xfa, 0x49, 0xd6, 0x19, + 0x27, 0xa8, 0x77, 0x07, 0xe9, 0x27, 0x6f, 0x27, + 0x44, 0x9e, 0xa3, 0x0f, 0x5c, 0x34, 0x7b, 0x55, + 0xcf, 0xad, 0x77, 0x0a, 0x7b, 0x55, 0xcf, 0xad, + 0x77, 0x0a, 0xdf, 0xd6, 0x19, 0x27, 0xa8, 0x77, + 0x07, 0xe9, 0x27, 0x58, 0x64, 0x9e, 0xa1, 0xdc, + 0x1f, 0xa4, 0x9d, 0xbc, 0x9d, 0x12, 0x7a, 0x8c, + 0x3d, 0x70, 0xd1, 0xed, 0x57, 0x3e, 0xb5, 0xdc, + 0x29, 0xed, 0x57, 0x3e, 0xb5, 0xdc, 0x2b, 0x7f, + 0x58, 0x64, 0x9e, 0xa1, 0xdc, 0x1f, 0xa4, 0x9d, + 0x61, 0x92, 0x7a, 0x87, 0x70, 0x7e, 0x92, 0x76, + 0xf2, 0x74, 0x49, 0xea, 0x30, 0xf5, 0xc3, 0x47, + 0xb5, 0x5c, 0xfa, 0xd7, 0x70, 0xa7, 0xb5, 0x5c, + 0xfa, 0xd7, 0x70, 0xad, 0xfd, 0x61, 0x92, 0x7a, + 0x87, 0x70, 0x7e, 0x92, 0x75, 0x86, 0x49, 0xea, + 0x1d, 0xc1, 0xfa, 0x49, 0xdb, 0xc9, 0xd1, 0x27, + 0xa8, 0xc3, 0xd7, 0x0d, 0x1e, 0xd5, 0x73, 0xeb, + 0x5d, 0xc2, 0x9e, 0xd5, 0x73, 0xeb, 0x5d, 0xc2, + 0xb7, 0xf5, 0x86, 0x49, 0xea, 0x1d, 0xc1, 0xfa, + 0x49, 0xd6, 0x19, 0x27, 0xa8, 0x77, 0x07, 0xe9, + 0x27, 0x6f, 0x27, 0x44, 0x9e, 0xa3, 0x0f, 0x5c, + 0x34, 0x7b, 0x55, 0xcf, 0xad, 0x77, 0x0a, 0x7b, + 0x55, 0xcf, 0xad, 0x77, 0x0a, 0xdf, 0xd6, 0x19, + 0x27, 0xa8, 0x77, 0x07, 0xe9, 0x27, 0x58, 0x64, + 0x9e, 0xa1, 0xdc, 0x1f, 0xa4, 0x9d, 0xbc, 0x9d, + 0x12, 0x7a, 0x8c, 0x3d, 0x70, 0xd1, 0xed, 0x57, + 0x3e, 0xb5, 0xdc, 0x29, 0xed, 0x57, 0x3e, 0xb5, + 0xdc, 0x2b, 0x7f, 0x58, 0x64, 0x9e, 0xa1, 0xdc, + 0x1f, 0xa4, 0x9d, 0x61, 0x92, 0x7a, 0x87, 0x70, + 0x7e, 0x92, 0x76, 0xf2, 0x74, 0x49, 0xea, 0x30, + 0xf5, 0xc3, 0x47, 0xb5, 0x5c, 0xfa, 0xd7, 0x70, + 0xa7, 0xb5, 0x5c, 0xfa, 0xd7, 0x70, 0xad, 0xfd, + 0x61, 0x92, 0x7a, 0x87, 0x70, 0x7e, 0x92, 0x75, + 0x86, 0x49, 0xea, 0x1d, 0xc1, 0xfa, 0x49, 0xdb, + 0xc9, 0xd1, 0x27, 0xa8, 0xc3, 0xd7, 0x0d, 0x1e, + 0xd5, 0x73, 0xeb, 0x5d, 0xc2, 0x9e, 0xd5, 0x73, + 0xeb, 0x5d, 0xc2, 0xb7, 0xf5, 0x86, 0x49, 0xea, + 0x1d, 0xc1, 0xfa, 0x49, 0xd6, 0x19, 0x27, 0xa8, + 0x77, 0x07, 0xe9, 0x27, 0x6f, 0x27, 0x44, 0x9e, + 0xa3, 0x0f, 0x5c, 0x34, 0x7b, 0x55, 0xcf, 0xad, + 0x77, 0x0a, 0x7b, 0x55, 0xcf, 0xad, 0x77, 0x0a, + 0xdf, 0xd6, 0x19, 0x27, 0xa8, 0x77, 0x07, 0xe9, + 0x27, 0x58, 0x64, 0x9e, 0xa1, 0xdc, 0x1f, 0xa4, + 0x9d, 0xbc, 0x9d, 0x12, 0x7a, 0x8c, 0x3d, 0x70, + 0xd1, 0xed, 0x57, 0x3e, 0xb5, 0xdc, 0x29, 0xed, + 0x57, 0x3e, 0xb5, 0xdc, 0x2b, 0x7f, 0x58, 0x64, + 0x9e, 0xa1, 0xdc, 0x1f, 0xa4, 0x9d, 0x61, 0x92, + 0x7a, 0x87, 0x70, 0x7e, 0x92, 0x76, 0xf2, 0x74, + 0x49, 0xea, 0x30, 0xf5, 0xc3, 0x47, 0xb5, 0x5c, + 0xfa, 0xd7, 0x70, 0xa7, 0xb5, 0x5c, 0xfa, 0xd7, + 0x70, 0xad, 0xfd, 0x61, 0x92, 0x7a, 0x87, 0x70, + 0x7e, 0x92, 0x75, 0x86, 0x49, 0xea, 0x1d, 0xc1, + 0xfa, 0x49, 0xdb, 0xc9, 0xd1, 0x27, 0xa8, 0xc3, + 0xd7, 0x0d, 0x1e, 0xd5, 0x73, 0xeb, 0x5d, 0xc2, + 0x9e, 0xd5, 0x73, 0xeb, 0x5d, 0xc2, 0xb7, 0xf5, + 0x86, 0x49, 0xea, 0x1d, 0xc1, 0xfa, 0x49, 0xd6, + 0x19, 0x27, 0xa8, 0x77, 0x07, 0xe9, 0x27, 0x6f, + 0x27, 0x44, 0x9e, 0xa3, 0x0f, 0x5c, 0x34, 0x7b, + 0x55, 0xcf, 0xad, 0x77, 0x0a, 0x7b, 0x55, 0xcf, + 0xad, 0x77, 0x0a, 0xdf, 0xd6, 0x19, 0x27, 0xa8, + 0x77, 0x07, 0xe9, 0x27, 0x58, 0x64, 0x9e, 0xa1, + 0xdc, 0x1f, 0xa4, 0x9d, 0xbc, 0x9d, 0x12, 0x7a, + 0x8c, 0x3d, 0x70, 0xe7, 0xf6, 0xab, 0x9f, 0x58, + 0xee, 0x14, 0xf6, 0xab, 0x9f, 0x58, 0xee, 0x15, + 0xd3, 0xed, 0xd9, 0x13, 0xcd, 0x1d, 0x19, 0x67, + 0x64, 0x82, 0x17, 0xb3, 0x97, 0xdb, 0x4e, 0xce, + 0x72, 0xc6, 0x50, 0xf1, 0xb8, 0xd2, 0x74, 0x28, + 0x9a, 0x5a, 0x3c, 0x6b, 0x30, 0xb5, 0x72, 0xe3, + 0xb7, 0xdb, 0x78, 0x97, 0x1f, 0xb5, 0x5c, 0xfa, + 0xc7, 0x70, 0xa7, 0xb5, 0x5c, 0xfa, 0xc7, 0x70, + 0xaf, 0x0f, 0x63, 0xe3, 0x71, 0x63, 0xc5, 0x1c, + 0x35, 0x8d, 0xe5, 0x85, 0x55, 0xdb, 0x3d, 0xaa, + 0xe7, 0xd6, 0x3b, 0x85, 0x3d, 0xaa, 0xe7, 0xd6, + 0x3b, 0x85, 0x6b, 0x4d, 0x24, 0x80, 0x01, 0x24, + 0xea, 0xa2, 0x0d, 0x9e, 0xd5, 0x73, 0xeb, 0x1c, + 0xb3, 0xed, 0x57, 0x3e, 0xb1, 0xdc, 0x2b, 0xa6, + 0x1c, 0xb0, 0x06, 0x73, 0xb7, 0x6f, 0x11, 0x33, + 0x5d, 0x2b, 0x4e, 0x12, 0xb0, 0x6e, 0xf2, 0x38, + 0xfc, 0x50, 0xd3, 0x29, 0x1b, 0xa0, 0x13, 0xc4, + 0xa6, 0x2b, 0x33, 0xe1, 0x0a, 0x5b, 0x25, 0x29, + 0xf7, 0xda, 0x2a, 0xe7, 0xf6, 0xab, 0x9f, 0x5a, + 0xee, 0x14, 0xf6, 0xab, 0x9f, 0x5a, 0xee, 0x15, + 0xbf, 0xac, 0x32, 0x4f, 0x50, 0xee, 0x0f, 0xd2, + 0x4e, 0xb0, 0xc9, 0x3d, 0x43, 0xb8, 0x3f, 0x49, + 0x5b, 0xb7, 0x93, 0xa2, 0x55, 0xf5, 0x18, 0x7a, + 0xe1, 0xa3, 0xda, 0xae, 0x7d, 0x6b, 0xb8, 0x53, + 0xda, 0xae, 0x7d, 0x6b, 0xb8, 0x56, 0xfe, 0xb0, + 0xc9, 0x3d, 0x43, 0xb8, 0x3f, 0x49, 0x3a, 0xc3, + 0x24, 0xf5, 0x0e, 0xe0, 0xfd, 0x24, 0xed, 0xe4, + 0xe8, 0x93, 0xd4, 0x61, 0xeb, 0x86, 0x8f, 0x6a, + 0xb9, 0xf5, 0xae, 0xe1, 0x4f, 0x6a, 0xb9, 0xf5, + 0xae, 0xe1, 0x5b, 0xfa, 0xc3, 0x24, 0xf5, 0x0e, + 0xe0, 0xfd, 0x24, 0xeb, 0x0c, 0x93, 0xd4, 0x3b, + 0x83, 0xf4, 0x93, 0xb7, 0x93, 0xa2, 0x4f, 0x51, + 0x87, 0xae, 0x1a, 0x3d, 0xaa, 0xe7, 0xd6, 0xbb, + 0x85, 0x3d, 0xaa, 0xe7, 0xd6, 0xbb, 0x85, 0x6f, + 0xeb, 0x0c, 0x93, 0xd4, 0x3b, 0x83, 0xf4, 0x93, + 0xac, 0x32, 0x4f, 0x50, 0xee, 0x0f, 0xd2, 0x4e, + 0xde, 0x4e, 0x89, 0x3d, 0x46, 0x1e, 0xb8, 0x68, + 0xf6, 0xab, 0x9f, 0x5a, 0xee, 0x14, 0xf6, 0xab, + 0x9f, 0x5a, 0xee, 0x15, 0xbf, 0xac, 0x32, 0x4f, + 0x50, 0xee, 0x0f, 0xd2, 0x4e, 0xb0, 0xc9, 0x3d, + 0x43, 0xb8, 0x3f, 0x49, 0x3b, 0x79, 0x3a, 0x24, + 0xf5, 0x18, 0x7a, 0xe1, 0xa3, 0xda, 0xae, 0x7d, + 0x6b, 0xb8, 0x53, 0xda, 0xae, 0x7d, 0x6b, 0xb8, + 0x56, 0xfe, 0xb0, 0xc9, 0x3d, 0x43, 0xb8, 0x3f, + 0x49, 0x3a, 0xc3, 0x24, 0xf5, 0x0e, 0xe0, 0xfd, + 0x24, 0xed, 0xe4, 0xe8, 0x93, 0xd4, 0x61, 0xeb, + 0x86, 0x8f, 0x6a, 0xb9, 0xf5, 0xae, 0xe1, 0x4f, + 0x6a, 0xb9, 0xf5, 0xae, 0xe1, 0x5b, 0xfa, 0xc3, + 0x24, 0xf5, 0x0e, 0xe0, 0xfd, 0x24, 0xeb, 0x0c, + 0x93, 0xd4, 0x3b, 0x83, 0xf4, 0x93, 0xb7, 0x93, + 0xa2, 0x4f, 0x51, 0x87, 0xae, 0x1a, 0x3d, 0xaa, + 0xe7, 0xd6, 0xbb, 0x85, 0x3d, 0xaa, 0xe7, 0xd6, + 0xbb, 0x85, 0x6f, 0xeb, 0x0c, 0x93, 0xd4, 0x3b, + 0x83, 0xf4, 0x93, 0xac, 0x32, 0x4f, 0x50, 0xee, + 0x0f, 0xd2, 0x4e, 0xde, 0x4e, 0x89, 0x3d, 0x46, + 0x1e, 0xb8, 0x68, 0xf6, 0xab, 0x9f, 0x5a, 0xee, + 0x14, 0xf6, 0xab, 0x9f, 0x5a, 0xee, 0x15, 0xbf, + 0xac, 0x32, 0x4f, 0x50, 0xee, 0x0f, 0xd2, 0x4e, + 0xb0, 0xc9, 0x3d, 0x43, 0xb8, 0x3f, 0x49, 0x3b, + 0x79, 0x3a, 0x24, 0xf5, 0x18, 0x7a, 0xe1, 0xa3, + 0xda, 0xae, 0x7d, 0x6b, 0xb8, 0x53, 0xda, 0xae, + 0x7d, 0x6b, 0xb8, 0x56, 0xfe, 0xb0, 0xc9, 0x3d, + 0x43, 0xb8, 0x3f, 0x49, 0x3a, 0xc3, 0x24, 0xf5, + 0x0e, 0xe0, 0xfd, 0x24, 0xed, 0xe4, 0xe8, 0x93, + 0xd4, 0x61, 0xeb, 0x86, 0x8f, 0x6a, 0xb9, 0xf5, + 0xae, 0xe1, 0x4f, 0x6a, 0xb9, 0xf5, 0xae, 0xe1, + 0x5b, 0xfa, 0xc3, 0x24, 0xf5, 0x0e, 0xe0, 0xfd, + 0x24, 0xeb, 0x0c, 0x93, 0xd4, 0x3b, 0x83, 0xf4, + 0x93, 0xb7, 0x93, 0xa2, 0x4f, 0x51, 0x87, 0xae, + 0x1a, 0x3d, 0xaa, 0xe7, 0xd6, 0xbb, 0x85, 0x3d, + 0xaa, 0xe7, 0xd6, 0xbb, 0x85, 0x6f, 0xeb, 0x0c, + 0x93, 0xd4, 0x3b, 0x83, 0xf4, 0x93, 0xac, 0x32, + 0x4f, 0x50, 0xee, 0x0f, 0xd2, 0x4e, 0xde, 0x4e, + 0x89, 0x3d, 0x46, 0x1e, 0xb8, 0x68, 0xf6, 0xab, + 0x9f, 0x5a, 0xee, 0x14, 0xf6, 0xab, 0x9f, 0x5a, + 0xee, 0x15, 0xbf, 0xac, 0x32, 0x4f, 0x50, 0xee, + 0x0f, 0xd2, 0x4e, 0xb0, 0xc9, 0x3d, 0x43, 0xb8, + 0x3f, 0x49, 0x3b, 0x79, 0x3a, 0x24, 0xf5, 0x18, + 0x7a, 0xe1, 0xa3, 0xda, 0xae, 0x7d, 0x6b, 0xb8, + 0x53, 0xda, 0xae, 0x7d, 0x6b, 0xb8, 0x56, 0xfe, + 0xb0, 0xc9, 0x3d, 0x43, 0xb8, 0x3f, 0x49, 0x3a, + 0xc3, 0x24, 0xf5, 0x0e, 0xe0, 0xfd, 0x24, 0xed, + 0xe4, 0xe8, 0x93, 0xd4, 0x61, 0xeb, 0x86, 0x8f, + 0x6a, 0xb9, 0xf5, 0xae, 0xe1, 0x4f, 0x6a, 0xb9, + 0xf5, 0xae, 0xe1, 0x5b, 0xfa, 0xc3, 0x24, 0xf5, + 0x0e, 0xe0, 0xfd, 0x24, 0xeb, 0x0c, 0x93, 0xd4, + 0x3b, 0x83, 0xf4, 0x93, 0xb7, 0x93, 0xa2, 0x4f, + 0x51, 0x87, 0xae, 0x1a, 0x3d, 0xaa, 0xe7, 0xd6, + 0xbb, 0x85, 0x3d, 0xaa, 0xe7, 0xd6, 0xbb, 0x85, + 0x6f, 0xeb, 0x0c, 0x93, 0xd4, 0x3b, 0x83, 0xf4, + 0x93, 0xac, 0x32, 0x4f, 0x50, 0xee, 0x0f, 0xd2, + 0x4e, 0xde, 0x4e, 0x89, 0x3d, 0x46, 0x1e, 0xb8, + 0x68, 0xf6, 0xab, 0x9f, 0x5a, 0xee, 0x14, 0xf6, + 0xab, 0x9f, 0x5a, 0xee, 0x15, 0xbf, 0xac, 0x32, + 0x4f, 0x50, 0xee, 0x0f, 0xd2, 0x4e, 0xb0, 0xc9, + 0x3d, 0x43, 0xb8, 0x3f, 0x49, 0x3b, 0x79, 0x3a, + 0x24, 0xf5, 0x18, 0x7a, 0xe1, 0xa3, 0xda, 0xae, + 0x7d, 0x6b, 0xb8, 0x53, 0xda, 0xae, 0x7d, 0x6b, + 0xb8, 0x56, 0xfe, 0xb0, 0xc9, 0x3d, 0x43, 0xb8, + 0x3f, 0x49, 0x3a, 0xc3, 0x24, 0xf5, 0x0e, 0xe0, + 0xfd, 0x24, 0xed, 0xe4, 0xe8, 0x93, 0xd4, 0x61, + 0xeb, 0x86, 0x8f, 0x6a, 0xb9, 0xf5, 0xae, 0xe1, + 0x4f, 0x6a, 0xb9, 0xf5, 0xae, 0xe1, 0x5b, 0xfa, + 0xc3, 0x24, 0xf5, 0x0e, 0xe0, 0xfd, 0x24, 0xeb, + 0x0c, 0x93, 0xd4, 0x3b, 0x83, 0xf4, 0x93, 0xb7, + 0x93, 0xa2, 0x4f, 0x51, 0x87, 0xae, 0x1a, 0x3d, + 0xaa, 0xe7, 0xd6, 0xbb, 0x85, 0x3d, 0xaa, 0xe7, + 0xd6, 0xbb, 0x85, 0x6f, 0xeb, 0x0c, 0x93, 0xd4, + 0x3b, 0x83, 0xf4, 0x93, 0xac, 0x32, 0x4f, 0x50, + 0xee, 0x0f, 0xd2, 0x4e, 0xde, 0x4e, 0x89, 0x3d, + 0x46, 0x1e, 0xb8, 0x68, 0xf6, 0xab, 0x9f, 0x5a, + 0xee, 0x14, 0xf6, 0xab, 0x9f, 0x5a, 0xee, 0x15, + 0xbf, 0xac, 0x32, 0x4f, 0x50, 0xee, 0x0f, 0xd2, + 0x4e, 0xb0, 0xc9, 0x3d, 0x43, 0xb8, 0x3f, 0x49, + 0x3b, 0x79, 0x3a, 0x24, 0xf5, 0x18, 0x7a, 0xe1, + 0xa3, 0xda, 0xae, 0x7d, 0x6b, 0x97, 0xb6, 0x66, + 0x17, 0x4c, 0x35, 0xc7, 0x8b, 0xb0, 0x56, 0xc1, + 0x7d, 0x91, 0xb8, 0xd0, 0xc4, 0xe6, 0x8d, 0xd2, + 0x41, 0xf4, 0x96, 0xcf, 0x61, 0xb4, 0xb9, 0x66, + 0x3b, 0x19, 0x83, 0xbf, 0xaa, 0x74, 0x8e, 0x30, + 0xa2, 0x69, 0x68, 0xf1, 0x8d, 0x16, 0xae, 0x5c, + 0x76, 0x9e, 0x17, 0x89, 0x6d, 0x83, 0x33, 0x8e, + 0x4d, 0x12, 0x8c, 0x0e, 0x3b, 0xbb, 0x85, 0x76, + 0x02, 0x08, 0x04, 0x69, 0xae, 0xae, 0xca, 0x80, + 0x92, 0x29, 0x22, 0x79, 0x8e, 0x56, 0xe1, 0x70, + 0xdc, 0x3f, 0x22, 0xe9, 0xb2, 0xbe, 0x74, 0x0e, + 0xc3, 0x21, 0xac, 0x67, 0x5e, 0xf8, 0x55, 0x5d, + 0x2e, 0x88, 0x08, 0x20, 0x16, 0xe9, 0x07, 0x51, + 0x44, 0x05, 0x15, 0x9c, 0x7b, 0xd5, 0x97, 0x9f, + 0xf2, 0x85, 0x2a, 0xa2, 0xb3, 0x8f, 0x7a, 0xb2, + 0xf3, 0xfe, 0x50, 0x81, 0x93, 0x7b, 0xd5, 0xef, + 0x9e, 0x7e, 0xb1, 0x52, 0xaa, 0x2b, 0x26, 0xf7, + 0xab, 0xdf, 0x3c, 0xfd, 0x62, 0xa5, 0x50, 0x11, + 0x11, 0x00, 0x54, 0x91, 0xa3, 0xb8, 0xbe, 0x75, + 0xf8, 0x87, 0x9e, 0xbe, 0xe6, 0xfc, 0x65, 0x51, + 0x3a, 0x90, 0x5a, 0x90, 0x65, 0x03, 0x53, 0xa4, + 0xa5, 0x40, 0x3e, 0x6d, 0x57, 0xd1, 0xdb, 0xae, + 0xbb, 0xcb, 0xe2, 0x79, 0xbc, 0xce, 0x9b, 0x35, + 0xbc, 0x98, 0x9a, 0x99, 0x26, 0x91, 0xd5, 0xec, + 0x17, 0x1a, 0x77, 0x96, 0x7f, 0x35, 0x79, 0x8a, + 0x56, 0xb1, 0xe3, 0x6f, 0x17, 0xb1, 0xfd, 0xbf, + 0xe5, 0xab, 0x93, 0x3d, 0xaf, 0x7f, 0xab, 0xb5, + 0x48, 0xd3, 0xf6, 0xa6, 0x7c, 0x5c, 0x84, 0xf0, + 0xac, 0x22, 0x2c, 0x2f, 0xac, 0x12, 0xa5, 0x11, + 0x02, 0xa5, 0x2a, 0x51, 0x10, 0x2a, 0x52, 0xa5, + 0x11, 0x02, 0xa5, 0x2a, 0x51, 0x10, 0x2a, 0x52, + 0xa5, 0x11, 0x02, 0xa5, 0x2a, 0x51, 0x10, 0x2a, + 0x52, 0xa5, 0x11, 0x02, 0xa5, 0x2a, 0x51, 0x10, + 0x2a, 0x52, 0xa5, 0x11, 0x02, 0xa5, 0x2a, 0x51, + 0x10, 0x2a, 0x52, 0xa5, 0x11, 0x02, 0xa5, 0x2a, + 0x51, 0x10, 0x2a, 0x52, 0xa5, 0x11, 0x02, 0xa5, + 0x2a, 0x51, 0x10, 0x2a, 0x52, 0xa5, 0x11, 0x02, + 0xa5, 0x2a, 0x51, 0x10, 0x2a, 0x52, 0xa5, 0x11, + 0x02, 0xa5, 0x2a, 0x51, 0x10, 0x2a, 0x52, 0xa5, + 0x11, 0x02, 0xa5, 0x2a, 0x51, 0x10, 0x2a, 0x52, + 0xa5, 0x11, 0x06, 0x6a, 0x56, 0x5a, 0x6a, 0x57, + 0x95, 0x90, 0x68, 0x54, 0x1c, 0xb8, 0xfb, 0x61, + 0x65, 0xd8, 0x6c, 0xee, 0x5c, 0xbf, 0x37, 0x65, + 0xb3, 0xdf, 0x4b, 0x5b, 0xc7, 0x08, 0xde, 0xd2, + 0x74, 0x07, 0x9f, 0x25, 0xe3, 0x7b, 0x79, 0x7d, + 0x45, 0xc2, 0x9d, 0xd5, 0xf0, 0xc8, 0xe4, 0x74, + 0x52, 0x09, 0x1a, 0x2a, 0x63, 0x21, 0xe3, 0xb6, + 0xd2, 0x0f, 0xc8, 0xbe, 0xe5, 0x1c, 0x82, 0x5b, + 0x68, 0xa5, 0x06, 0xb8, 0xd8, 0xd7, 0x54, 0x76, + 0x45, 0x56, 0xef, 0x29, 0x6d, 0x6b, 0x6a, 0xf2, + 0x97, 0xcb, 0xff, 0x00, 0x70, 0xf9, 0x78, 0xa6, + 0x6c, 0x79, 0x63, 0xff, 0x00, 0xb9, 0x16, 0x8b, + 0x7b, 0xed, 0x5f, 0x68, 0xa3, 0x73, 0x49, 0xea, + 0x44, 0x0d, 0xd1, 0xf9, 0xce, 0xed, 0xa9, 0x25, + 0x03, 0x72, 0xe2, 0xf9, 0xe4, 0x71, 0xf9, 0xda, + 0x16, 0x97, 0x86, 0xd7, 0x5d, 0xd2, 0xa4, 0x20, + 0xe6, 0x6c, 0x6d, 0x0d, 0xec, 0xc3, 0xc6, 0x77, + 0x90, 0x37, 0x74, 0xea, 0x5c, 0x30, 0xb3, 0x9c, + 0x99, 0x8c, 0xf9, 0xce, 0x00, 0xf0, 0xa6, 0xd3, + 0x4e, 0x7d, 0xa2, 0x3b, 0x60, 0x68, 0xd6, 0x37, + 0x15, 0x06, 0xf9, 0xfe, 0x85, 0x7c, 0x75, 0xdd, + 0x78, 0x87, 0x1f, 0x31, 0x97, 0xb7, 0x8e, 0x6d, + 0x1e, 0x3e, 0x0e, 0x1b, 0xbb, 0xe9, 0xef, 0x25, + 0xe7, 0x25, 0x76, 0x8d, 0x6d, 0x60, 0xd4, 0xd5, + 0xa3, 0x12, 0xd7, 0x89, 0x31, 0x2d, 0xd1, 0x11, + 0x1c, 0x21, 0xe2, 0xda, 0x66, 0xd3, 0x33, 0x6e, + 0x33, 0x2d, 0x98, 0x93, 0x12, 0xd7, 0x89, 0x31, + 0x29, 0x46, 0x90, 0xd9, 0x89, 0x31, 0x2d, 0x78, + 0x93, 0x12, 0x1a, 0x43, 0x66, 0x24, 0xc4, 0xb5, + 0xe2, 0x4c, 0x48, 0x69, 0x0d, 0x98, 0x93, 0x12, + 0xd7, 0x89, 0x31, 0x21, 0xa4, 0x36, 0x62, 0x4c, + 0x4b, 0x5e, 0x24, 0xc4, 0x86, 0x90, 0xd9, 0x89, + 0x31, 0x2d, 0x78, 0x93, 0x12, 0x1a, 0x43, 0x66, + 0x24, 0xc4, 0xb5, 0xe2, 0x52, 0x8c, 0xd9, 0xfc, + 0xc1, 0xec, 0x0f, 0x6e, 0x0f, 0x1b, 0x48, 0xab, + 0xb7, 0x08, 0x55, 0xb5, 0xe2, 0xbe, 0x32, 0xb5, + 0x31, 0x5a, 0xff, 0x00, 0x65, 0x77, 0x7b, 0x91, + 0xf8, 0x93, 0x12, 0x5c, 0x43, 0x25, 0xbc, 0xce, + 0x86, 0x5a, 0x62, 0x61, 0xa3, 0xa8, 0xbb, 0x6d, + 0xf2, 0x4b, 0xfb, 0x88, 0x59, 0x33, 0x30, 0x61, + 0x90, 0x54, 0x54, 0xd0, 0xa4, 0xde, 0xb1, 0xa4, + 0xcc, 0xf0, 0x94, 0xd7, 0x0d, 0xed, 0x33, 0x58, + 0x8d, 0x66, 0x3c, 0x5c, 0x58, 0x93, 0x12, 0xf7, + 0x79, 0x6b, 0x35, 0x9c, 0xdc, 0xcc, 0xd4, 0xc7, + 0x40, 0xef, 0x14, 0xd4, 0x50, 0xad, 0x18, 0x94, + 0xeb, 0xaf, 0x84, 0xea, 0xac, 0xd3, 0x6c, 0xcc, + 0x4c, 0x69, 0x31, 0xe2, 0xd9, 0x89, 0x31, 0x2d, + 0x78, 0x93, 0x12, 0x94, 0x69, 0x0d, 0x98, 0x93, + 0x12, 0xd7, 0x89, 0x31, 0x21, 0xa4, 0x36, 0x62, + 0x4c, 0x4b, 0x5e, 0x24, 0xc4, 0x86, 0x90, 0xd9, + 0x89, 0x31, 0x2d, 0x78, 0x93, 0x12, 0x1a, 0x43, + 0x66, 0x24, 0xc4, 0xb5, 0xe2, 0x4c, 0x48, 0x69, + 0x0d, 0x98, 0x93, 0x12, 0xd7, 0x89, 0x31, 0x21, + 0xa4, 0x36, 0x62, 0x4c, 0x4b, 0x5e, 0x24, 0xc4, + 0x86, 0x90, 0xd9, 0x89, 0x31, 0x2d, 0x78, 0x93, + 0x12, 0x1a, 0x43, 0x66, 0x24, 0xc4, 0xb5, 0xe2, + 0x4c, 0x48, 0x69, 0x0d, 0x98, 0x93, 0x12, 0xd7, + 0x89, 0x31, 0x21, 0xa4, 0x36, 0x62, 0x4c, 0x4b, + 0x5e, 0x24, 0xc4, 0x86, 0x90, 0xd9, 0x89, 0x31, + 0x2d, 0x78, 0x93, 0x12, 0x1a, 0x43, 0x66, 0x22, + 0x35, 0x2d, 0x90, 0xdc, 0xcd, 0x04, 0x82, 0x48, + 0x5c, 0x58, 0xfd, 0xd3, 0xbf, 0xdb, 0x5c, 0xf8, + 0x93, 0x12, 0x8f, 0x1f, 0x1e, 0x30, 0x98, 0xd6, + 0xbc, 0x6b, 0xc2, 0x61, 0x68, 0x64, 0x90, 0xe6, + 0xd6, 0x46, 0x56, 0x0c, 0x37, 0x11, 0x79, 0x43, + 0x76, 0xa3, 0xe4, 0x51, 0xde, 0x1d, 0xd5, 0xab, + 0x20, 0xb9, 0x31, 0x66, 0x4c, 0x65, 0x7c, 0x59, + 0x46, 0x03, 0xc1, 0xa3, 0xbe, 0xbb, 0x73, 0x08, + 0xc4, 0x77, 0x92, 0x34, 0x0a, 0x02, 0x71, 0x01, + 0xd8, 0x21, 0x61, 0xcb, 0x4d, 0xb6, 0x98, 0xe7, + 0xc5, 0xec, 0xf9, 0x6c, 0xbd, 0xcc, 0x71, 0x33, + 0xec, 0xfa, 0x5c, 0xde, 0x0d, 0xd5, 0x23, 0x66, + 0xc8, 0xad, 0x2d, 0xdd, 0x7f, 0x70, 0x34, 0x01, + 0xe2, 0x8f, 0x02, 0xe0, 0x63, 0x71, 0x3d, 0xad, + 0xf9, 0xc4, 0x05, 0xb7, 0x69, 0x67, 0x31, 0x98, + 0x2d, 0x1b, 0xa1, 0xad, 0x18, 0xdc, 0x3b, 0xca, + 0x29, 0x5d, 0xd6, 0x88, 0x5b, 0x3e, 0x58, 0xc7, + 0x49, 0xbf, 0x2e, 0x1f, 0x8a, 0x3e, 0xfb, 0x30, + 0x9e, 0xf2, 0x52, 0xf9, 0x4f, 0x8b, 0xf9, 0xb1, + 0xee, 0x0e, 0xe2, 0xe6, 0x2e, 0xae, 0xbd, 0x3d, + 0xb5, 0xaf, 0x12, 0x62, 0x5b, 0xeb, 0x1b, 0x78, + 0x47, 0x0d, 0x1e, 0x25, 0xa6, 0xd6, 0x9d, 0xd7, + 0x9d, 0x6d, 0xef, 0x6c, 0xc4, 0x98, 0x96, 0xbc, + 0x49, 0x89, 0x4a, 0x34, 0x86, 0xcc, 0x49, 0x89, + 0x6b, 0xc4, 0xb7, 0xd9, 0xda, 0x4f, 0x7b, 0x29, + 0x8a, 0x1a, 0x63, 0x03, 0x17, 0x8c, 0x69, 0xa0, + 0x28, 0x99, 0xd3, 0x8c, 0xca, 0x62, 0x9a, 0xce, + 0x91, 0x1a, 0xcc, 0xbc, 0x62, 0x4c, 0x4a, 0x43, + 0xe1, 0xdc, 0xcb, 0xfc, 0x3e, 0x57, 0xf4, 0x2e, + 0x5b, 0xcc, 0xba, 0xee, 0xc8, 0x07, 0x4e, 0xcc, + 0x2c, 0xf9, 0xc0, 0x82, 0x38, 0x42, 0x8e, 0xed, + 0x3d, 0x93, 0xaa, 0xf3, 0x83, 0x2c, 0x46, 0xb3, + 0x4d, 0x1a, 0x71, 0x26, 0x25, 0xaf, 0x12, 0x62, + 0x56, 0x73, 0x88, 0xf6, 0xb6, 0x62, 0x4c, 0x4b, + 0x5e, 0x24, 0xc4, 0x86, 0x90, 0xd9, 0x89, 0x31, + 0x2d, 0x78, 0x93, 0x12, 0x1a, 0x43, 0x66, 0x24, + 0xc4, 0xb5, 0xe2, 0x4c, 0x48, 0x69, 0x0d, 0x98, + 0x93, 0x12, 0xd7, 0x89, 0x31, 0x21, 0xa4, 0x36, + 0x62, 0x29, 0x88, 0xad, 0x78, 0x96, 0x5b, 0x57, + 0xb8, 0x35, 0x80, 0x97, 0x38, 0xd1, 0xad, 0x1a, + 0x49, 0x4d, 0x4d, 0xaf, 0x78, 0x93, 0x12, 0xee, + 0x6e, 0x43, 0x99, 0x39, 0x98, 0xf0, 0x35, 0xba, + 0x2a, 0x1a, 0xe7, 0x69, 0x5c, 0x37, 0x10, 0xcb, + 0x6f, 0x21, 0x8a, 0x66, 0x16, 0x3c, 0x6e, 0x1f, + 0x91, 0x44, 0x5e, 0xb3, 0x3a, 0x44, 0xf1, 0x5a, + 0xd8, 0x6f, 0x5e, 0x36, 0xac, 0xc4, 0x18, 0x93, + 0x12, 0xd7, 0x89, 0x31, 0x57, 0x47, 0xff, 0x00, + 0x2a, 0x75, 0x57, 0x46, 0xcc, 0x49, 0x89, 0x77, + 0xdb, 0x64, 0x17, 0xf3, 0x46, 0x24, 0x38, 0x63, + 0x0e, 0x15, 0x01, 0xc7, 0x4f, 0x02, 0xd7, 0x79, + 0x93, 0xde, 0xd9, 0xc7, 0xce, 0x3c, 0x07, 0xc6, + 0x35, 0xb9, 0x9a, 0x68, 0x3b, 0x2a, 0x9d, 0xda, + 0x6b, 0xa6, 0xbc, 0x5d, 0x27, 0xcb, 0x65, 0x88, + 0xd6, 0x6b, 0xc3, 0x9b, 0x93, 0x12, 0x62, 0x5b, + 0xac, 0xb2, 0xfb, 0x8b, 0xec, 0x7e, 0xcf, 0x84, + 0xf3, 0x74, 0xae, 0x23, 0x4a, 0xd5, 0x6a, 0xb9, + 0x85, 0xf6, 0xd3, 0x3e, 0x09, 0x29, 0x8d, 0x87, + 0x4d, 0x34, 0x8d, 0x4a, 0xd1, 0x78, 0x99, 0xdb, + 0x13, 0xc5, 0x49, 0xc7, 0x68, 0x8d, 0xdb, 0x7e, + 0x9e, 0x6c, 0x62, 0x4c, 0x4b, 0x5e, 0x24, 0xc4, + 0xa5, 0x1a, 0x43, 0x66, 0x24, 0xc4, 0xb5, 0xe2, + 0x4c, 0x48, 0x69, 0x0d, 0x98, 0x93, 0x12, 0xdb, + 0x63, 0x63, 0x71, 0x7c, 0xe7, 0xb6, 0x0c, 0x35, + 0x8c, 0x02, 0xec, 0x46, 0x9a, 0xca, 0xd7, 0x73, + 0x04, 0xb6, 0xd3, 0xba, 0xde, 0x5a, 0x63, 0x66, + 0xbc, 0x3a, 0x6b, 0x5a, 0x1f, 0x02, 0x88, 0xb4, + 0x4d, 0xb6, 0xeb, 0xc5, 0x6e, 0xd5, 0xb4, 0x8b, + 0xcc, 0x7d, 0x36, 0x9d, 0xb0, 0xc6, 0x24, 0xc4, + 0xb5, 0xe2, 0xa6, 0x95, 0x21, 0x26, 0x4d, 0x77, + 0x15, 0xa1, 0xbb, 0x71, 0x61, 0x89, 0xad, 0x0f, + 0x22, 0xa6, 0xb4, 0x3f, 0xd9, 0x49, 0xb4, 0x44, + 0xe9, 0x33, 0xa6, 0xa5, 0x71, 0x5a, 0xda, 0xed, + 0x8d, 0x76, 0xc6, 0xb2, 0xe3, 0xc4, 0x98, 0x96, + 0xb2, 0x53, 0x12, 0x95, 0x74, 0x86, 0xcc, 0x49, + 0x89, 0x6b, 0xc4, 0x98, 0x90, 0xd2, 0x1b, 0x31, + 0x26, 0x25, 0xaf, 0x12, 0x62, 0x43, 0x48, 0x6c, + 0xc4, 0x98, 0x96, 0xbc, 0x49, 0x89, 0x0d, 0x21, + 0xb3, 0x11, 0x5e, 0xe2, 0xb8, 0x92, 0x29, 0x04, + 0x91, 0xb8, 0xb1, 0xe3, 0x53, 0x86, 0xb5, 0xa3, + 0x12, 0x62, 0x51, 0x31, 0xac, 0x69, 0x29, 0xaf, + 0x0b, 0x6e, 0x8e, 0x0b, 0x3d, 0xbc, 0xf1, 0xe7, + 0x16, 0x8e, 0x04, 0x06, 0xdc, 0xc4, 0x3b, 0xfc, + 0x45, 0x47, 0x90, 0x41, 0xd3, 0xac, 0x68, 0xa6, + 0xf5, 0x17, 0x36, 0x4b, 0x72, 0xe8, 0x73, 0x18, + 0x8d, 0x68, 0x24, 0x38, 0x1c, 0x37, 0xeb, 0xab, + 0xbe, 0xa4, 0xf3, 0x38, 0xc4, 0x77, 0x8f, 0xa6, + 0xa7, 0x51, 0xdc, 0x2b, 0x16, 0x6a, 0xc5, 0x6d, + 0xc3, 0xc2, 0x7c, 0x1e, 0xc7, 0x95, 0xcb, 0x39, + 0x31, 0xf1, 0x9d, 0x6d, 0x13, 0xa4, 0xba, 0x72, + 0xb9, 0xcb, 0xa3, 0x74, 0x07, 0x49, 0x6e, 0x96, + 0xd7, 0x79, 0x77, 0xa8, 0x5c, 0xbd, 0xf8, 0x2e, + 0xd9, 0xfd, 0x6d, 0x05, 0x4d, 0x2e, 0x6d, 0x02, + 0x8a, 0xce, 0x3d, 0xea, 0xcb, 0xcf, 0xf9, 0x42, + 0x95, 0x51, 0x59, 0xc7, 0xbd, 0x59, 0x79, 0xff, + 0x00, 0x28, 0x40, 0xc9, 0xbd, 0xea, 0xf7, 0xcf, + 0x3f, 0x58, 0xa9, 0x55, 0x15, 0x93, 0x7b, 0xd5, + 0xef, 0x9e, 0x7e, 0xb1, 0x52, 0xa8, 0x08, 0x88, + 0x83, 0x23, 0x51, 0x5f, 0x0e, 0xbd, 0xf7, 0xc9, + 0xfe, 0xd1, 0xff, 0x00, 0x58, 0xaf, 0xb8, 0x8d, + 0x45, 0x7c, 0x3a, 0xf7, 0xdf, 0x2e, 0x3e, 0xd5, + 0xff, 0x00, 0x58, 0xac, 0x9e, 0x6f, 0xc2, 0x8f, + 0xa0, 0xfe, 0xdb, 0xfb, 0xfc, 0xc7, 0xc3, 0x1f, + 0xf9, 0xb4, 0xa2, 0x22, 0xc8, 0xfa, 0x41, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x16, 0x42, 0xc2, 0xc8, 0x41, + 0x90, 0x4d, 0x42, 0xfb, 0x5e, 0x51, 0xa3, 0x24, + 0xb1, 0xa7, 0xa8, 0x8f, 0xea, 0x85, 0xf1, 0x31, + 0xe5, 0x35, 0x7d, 0xb3, 0x29, 0xfe, 0x49, 0x65, + 0xf6, 0x11, 0xfd, 0x50, 0xb4, 0xf9, 0x4f, 0xba, + 0xdf, 0x07, 0xcf, 0xff, 0x00, 0x71, 0xff, 0x00, + 0x0f, 0x07, 0xed, 0x5f, 0xf4, 0x43, 0xa8, 0x6b, + 0x0a, 0xba, 0xe3, 0x57, 0x1e, 0xd9, 0x56, 0x21, + 0xad, 0x57, 0x1d, 0xe5, 0x1e, 0xd9, 0x5b, 0x5f, + 0x36, 0xdd, 0x65, 0xef, 0x90, 0xf9, 0xcb, 0x8b, + 0x68, 0xcf, 0xf9, 0xa3, 0xfb, 0x0d, 0x6f, 0x80, + 0xae, 0xdb, 0x2f, 0x7b, 0x87, 0xce, 0x0a, 0x3f, + 0x69, 0x4d, 0x33, 0x69, 0x3c, 0xd6, 0x78, 0x0a, + 0xed, 0xe5, 0xfe, 0xf6, 0x4f, 0x3f, 0xfc, 0x28, + 0xfd, 0xa4, 0x75, 0x52, 0xab, 0x5e, 0x24, 0xc4, + 0xb5, 0x3c, 0xc6, 0xca, 0xa5, 0x56, 0xbc, 0x49, + 0x89, 0x06, 0xca, 0xa5, 0x56, 0xbc, 0x49, 0x89, + 0x06, 0xca, 0xa5, 0x56, 0xbc, 0x49, 0x89, 0x06, + 0xca, 0xa5, 0x56, 0xbc, 0x49, 0x89, 0x06, 0xca, + 0xa5, 0x56, 0xbc, 0x49, 0x89, 0x06, 0xca, 0xa5, + 0x56, 0xbc, 0x49, 0x89, 0x06, 0xca, 0xab, 0xdb, + 0x24, 0x6c, 0x76, 0xf0, 0x97, 0x6a, 0x70, 0x63, + 0x6b, 0xd9, 0x23, 0x42, 0xa0, 0x62, 0x57, 0x1c, + 0xd2, 0x43, 0x16, 0x4c, 0xd9, 0x5b, 0xe5, 0x46, + 0x22, 0x70, 0xed, 0x82, 0xd2, 0xb8, 0x67, 0xe3, + 0xb6, 0x3d, 0xed, 0x9e, 0x4a, 0xdb, 0x7b, 0x96, + 0xe9, 0x8a, 0xca, 0x1f, 0x68, 0xe1, 0x74, 0x79, + 0x9d, 0x40, 0xfd, 0xab, 0x1b, 0x43, 0xbe, 0xea, + 0xe1, 0x2a, 0xcb, 0x0d, 0x21, 0x6c, 0x16, 0xe3, + 0x41, 0xc1, 0xab, 0xb4, 0x02, 0x8e, 0xcd, 0xad, + 0x9b, 0x75, 0x77, 0x96, 0x4c, 0xdf, 0x18, 0x3e, + 0x4a, 0x1f, 0x36, 0x9c, 0xe7, 0xf7, 0x56, 0xe7, + 0x4e, 0x1d, 0xb4, 0x0d, 0x80, 0x7f, 0xc3, 0xb7, + 0x24, 0xff, 0x00, 0x68, 0x8e, 0x25, 0xce, 0xd3, + 0xad, 0x6b, 0x1d, 0x31, 0x2d, 0x18, 0xeb, 0x18, + 0xf2, 0x64, 0x9e, 0xbc, 0x95, 0xd3, 0xf1, 0x84, + 0x2e, 0xd1, 0xe2, 0x76, 0x6d, 0x81, 0xa3, 0x13, + 0x8b, 0x1a, 0x00, 0x1b, 0xa4, 0xd6, 0x8b, 0x74, + 0x3b, 0x31, 0x72, 0xf8, 0xc3, 0xe6, 0x95, 0xb0, + 0xb8, 0xfe, 0x65, 0x0b, 0xbb, 0x85, 0x74, 0x5c, + 0x31, 0xb2, 0x6d, 0x5c, 0x41, 0xda, 0x99, 0x1b, + 0x5c, 0x07, 0x64, 0x07, 0x2d, 0xd9, 0xed, 0x8e, + 0x65, 0x7a, 0xf8, 0x45, 0xa3, 0xa8, 0xc6, 0x02, + 0x5c, 0x31, 0x61, 0xd2, 0x75, 0x1e, 0xe2, 0xbf, + 0x72, 0xda, 0x52, 0xb1, 0x31, 0x4e, 0x1e, 0x32, + 0xe3, 0xd8, 0xad, 0xa7, 0x2e, 0x5b, 0x44, 0xde, + 0x77, 0xda, 0xb1, 0x58, 0x42, 0xe6, 0x59, 0x4d, + 0xc6, 0x5e, 0x03, 0xe4, 0xa3, 0xe2, 0x71, 0xa0, + 0x91, 0xbb, 0x87, 0x70, 0x10, 0xb6, 0xc3, 0x90, + 0x5d, 0xcd, 0x68, 0xdb, 0xa8, 0xde, 0xc7, 0x07, + 0xb7, 0x10, 0x66, 0x90, 0x4f, 0x61, 0x4d, 0x66, + 0xb1, 0x3c, 0xe4, 0x4f, 0x6c, 0xd4, 0x32, 0xb2, + 0x36, 0x97, 0x1d, 0x7e, 0x30, 0xa5, 0x4a, 0xcd, + 0x94, 0xae, 0x8f, 0x20, 0x64, 0xac, 0x3e, 0x33, + 0x2d, 0xdc, 0xe0, 0x7b, 0x20, 0x12, 0x13, 0xbb, + 0x6d, 0xbe, 0x3e, 0xdd, 0x0f, 0x49, 0x4e, 0xe5, + 0xa2, 0x6b, 0x3b, 0x3b, 0x5a, 0xfe, 0x28, 0xc6, + 0xec, 0xb5, 0xc9, 0x8c, 0x38, 0xcc, 0xd6, 0xbe, + 0x95, 0xc1, 0x84, 0x91, 0xda, 0x2e, 0x5a, 0xad, + 0x36, 0x72, 0xf2, 0x7c, 0x46, 0x52, 0x20, 0x0c, + 0x71, 0x1a, 0x46, 0x22, 0x69, 0xf2, 0x2e, 0x9d, + 0x95, 0xba, 0x9e, 0x69, 0x2e, 0x44, 0xb2, 0x3a, + 0x40, 0x03, 0x5e, 0x03, 0x89, 0x34, 0x24, 0x9a, + 0xd2, 0xab, 0x4e, 0x63, 0x7d, 0x74, 0x36, 0x89, + 0x91, 0x09, 0x5c, 0x18, 0xc9, 0x23, 0x60, 0x60, + 0x24, 0x0a, 0x3a, 0x84, 0xd4, 0x77, 0x54, 0xef, + 0xc9, 0x13, 0x6a, 0xeb, 0x1c, 0x21, 0x1d, 0xbf, + 0x2f, 0xb2, 0xb9, 0x36, 0xcc, 0xeb, 0xf4, 0x68, + 0xe2, 0xcc, 0xf2, 0xc9, 0xf2, 0xe7, 0x34, 0x4a, + 0xe6, 0xbd, 0x8f, 0xf2, 0x64, 0x15, 0x1d, 0xb1, + 0x45, 0xbe, 0xc3, 0x21, 0xba, 0xbd, 0x88, 0x4c, + 0x5c, 0xd8, 0x63, 0x77, 0x93, 0x8a, 0xa4, 0x91, + 0xbe, 0xa4, 0xb6, 0xa9, 0xa1, 0xf6, 0x90, 0x8d, + 0xf9, 0x30, 0xf0, 0x85, 0xb7, 0x3e, 0x90, 0xdb, + 0xe4, 0xee, 0x64, 0x47, 0x05, 0x4b, 0x63, 0x04, + 0x68, 0x34, 0xee, 0x76, 0x93, 0xbb, 0x69, 0xad, + 0x62, 0x38, 0x5a, 0x64, 0xb7, 0x95, 0xc7, 0x17, + 0xc9, 0x33, 0x13, 0xb7, 0x1d, 0x77, 0x6d, 0xd7, + 0x8a, 0x2e, 0xef, 0x67, 0x2e, 0xe0, 0x88, 0xcb, + 0x1c, 0x8d, 0x98, 0x34, 0x55, 0xcd, 0x03, 0x09, + 0xa0, 0xde, 0x5c, 0xb9, 0x6e, 0x59, 0x36, 0x62, + 0x64, 0x11, 0x3d, 0xac, 0xe6, 0xf0, 0xd7, 0x15, + 0x77, 0x54, 0xd6, 0xcb, 0xce, 0xf9, 0xac, 0xa5, + 0x64, 0x87, 0x10, 0x8e, 0x4a, 0x0a, 0xe9, 0xd0, + 0xe1, 0x8a, 0x8b, 0xc6, 0xcf, 0x33, 0x9b, 0xbf, + 0xcc, 0x23, 0x1a, 0x9a, 0xfa, 0x0e, 0xd5, 0x4d, + 0x13, 0xb9, 0x78, 0x8c, 0x91, 0x36, 0x8d, 0x63, + 0x8a, 0x3d, 0x3e, 0x2b, 0x4e, 0x2b, 0x44, 0x4e, + 0xdc, 0x91, 0xf6, 0xb8, 0xa2, 0xd9, 0xbb, 0xb7, + 0x99, 0x79, 0xc9, 0x04, 0x6d, 0x8c, 0x90, 0xd7, + 0x52, 0xb8, 0xb4, 0x69, 0xa6, 0xf2, 0xd6, 0xdc, + 0x8a, 0xe1, 0xf6, 0x5e, 0xd8, 0xc9, 0x58, 0xe8, + 0xf0, 0x73, 0x81, 0xa2, 0xb5, 0x20, 0x0a, 0x90, + 0xb7, 0x67, 0x99, 0xd5, 0xf4, 0x57, 0xf2, 0xdb, + 0x41, 0x27, 0x37, 0x1c, 0x54, 0x69, 0xa5, 0x2a, + 0x49, 0x6e, 0x2d, 0xd5, 0xdf, 0xb3, 0x33, 0x8b, + 0x8c, 0xb1, 0xf0, 0x38, 0xd5, 0xd1, 0x38, 0xb7, + 0xfb, 0x2e, 0xd2, 0x12, 0x6f, 0x96, 0x29, 0x17, + 0x9d, 0x34, 0xe1, 0xe0, 0x9a, 0xe2, 0xc1, 0x6c, + 0x93, 0x8a, 0x22, 0x75, 0x88, 0xb4, 0xfc, 0x90, + 0x59, 0x76, 0x5f, 0x36, 0x63, 0x23, 0xd9, 0x13, + 0x9a, 0xdc, 0x0d, 0x0e, 0x24, 0x8d, 0x0b, 0xc5, + 0xed, 0xb3, 0xac, 0xee, 0x0d, 0xbb, 0xdc, 0xd7, + 0xb9, 0x80, 0x12, 0x5b, 0xd9, 0xdc, 0x53, 0xbb, + 0x31, 0x6f, 0xcc, 0x7b, 0x63, 0x9d, 0xa0, 0xb6, + 0x43, 0x17, 0x71, 0xaa, 0xbb, 0x7d, 0x70, 0x6e, + 0x2f, 0x27, 0x9f, 0xd6, 0x3c, 0x91, 0xe6, 0x8d, + 0x01, 0x5a, 0xb9, 0x2d, 0x37, 0x9d, 0x3c, 0x1c, + 0x72, 0xe2, 0xa5, 0x30, 0xd2, 0xda, 0x69, 0x36, + 0xb3, 0xc5, 0x52, 0xab, 0x5e, 0x24, 0xc4, 0xba, + 0xea, 0xe1, 0xa3, 0x65, 0x52, 0xab, 0x5e, 0x24, + 0xc4, 0x83, 0x65, 0x52, 0xab, 0x5e, 0x24, 0xc4, + 0x83, 0x65, 0x52, 0xab, 0x5e, 0x24, 0xc4, 0x83, + 0x65, 0x52, 0xab, 0x5e, 0x24, 0xc4, 0x83, 0x65, + 0x52, 0xab, 0x5e, 0x24, 0xc4, 0x83, 0x65, 0x53, + 0x12, 0xd7, 0x89, 0x31, 0x20, 0xef, 0xca, 0x9d, + 0xfe, 0x65, 0x6d, 0xf6, 0x8d, 0xf0, 0xa9, 0xbc, + 0xdb, 0xdf, 0x5d, 0xe6, 0xb7, 0xc0, 0xa0, 0x32, + 0x93, 0xfe, 0x67, 0x6b, 0xf6, 0xad, 0xf0, 0xa9, + 0xfc, 0xd7, 0xdf, 0x1d, 0xda, 0x6f, 0x81, 0x65, + 0xf3, 0x1f, 0x74, 0x7c, 0x1e, 0x97, 0x90, 0xfe, + 0x1d, 0xfe, 0x2d, 0x16, 0xde, 0xf1, 0x10, 0xfe, + 0xb8, 0xf0, 0xad, 0x1b, 0x50, 0x69, 0x98, 0x34, + 0x7f, 0x86, 0x3c, 0x25, 0x6f, 0xb6, 0xf7, 0x88, + 0xbc, 0xf6, 0xf8, 0x57, 0x2e, 0xd5, 0x9a, 0x66, + 0x4d, 0xfb, 0x31, 0xe1, 0x29, 0x83, 0xf8, 0x91, + 0xf0, 0x5f, 0xcf, 0x7f, 0x03, 0xf1, 0x84, 0x55, + 0x52, 0xab, 0x5e, 0x24, 0xc4, 0xb5, 0x3c, 0xa6, + 0xca, 0xa5, 0x56, 0xbc, 0x49, 0x89, 0x06, 0xca, + 0xa9, 0x7d, 0x97, 0x35, 0xcc, 0x8f, 0xd9, 0xbb, + 0xc2, 0x14, 0x26, 0x25, 0x31, 0xb2, 0xc6, 0xb9, + 0x99, 0xfb, 0x37, 0x78, 0x42, 0xa6, 0x4f, 0xb2, + 0xdf, 0x07, 0x5f, 0x2f, 0xfc, 0x6a, 0x7b, 0x38, + 0xa4, 0x36, 0x83, 0x33, 0xbd, 0xb3, 0xbb, 0x8a, + 0x3b, 0x79, 0x30, 0xb4, 0xc6, 0x1c, 0x5a, 0x45, + 0x41, 0x38, 0x8a, 0xed, 0x6b, 0xfa, 0xc3, 0x26, + 0xe7, 0x65, 0xd7, 0x34, 0x55, 0x3a, 0x35, 0x1a, + 0x71, 0xaf, 0x39, 0x9e, 0x5b, 0x97, 0x5d, 0xce, + 0xd9, 0x6e, 0xe4, 0xc0, 0xe6, 0xb6, 0x80, 0x62, + 0xc3, 0x50, 0x09, 0x5c, 0xb9, 0xae, 0x71, 0x65, + 0x67, 0x64, 0xeb, 0x5b, 0x37, 0xb5, 0xf2, 0x60, + 0xc0, 0xd6, 0xb0, 0xd4, 0x34, 0x53, 0x59, 0x59, + 0xe2, 0x62, 0xd1, 0x48, 0xac, 0x7d, 0x51, 0x3e, + 0x2d, 0xf3, 0x16, 0xa5, 0xf3, 0x5e, 0xf7, 0x8d, + 0x96, 0x8e, 0x11, 0x3e, 0xc4, 0x56, 0x5b, 0x93, + 0x5d, 0x66, 0x0c, 0xe7, 0x5a, 0x44, 0x70, 0xd6, + 0x8d, 0x7b, 0xab, 0xa7, 0xb4, 0x02, 0xea, 0x9f, + 0x66, 0x2e, 0x99, 0x19, 0x92, 0x29, 0x59, 0x31, + 0x02, 0xb8, 0x70, 0x96, 0x93, 0x4d, 0xea, 0x55, + 0x49, 0x4c, 0x7d, 0x8b, 0x67, 0x7f, 0x52, 0x68, + 0x5b, 0x00, 0x0d, 0x23, 0x46, 0x97, 0x53, 0x4a, + 0xe3, 0xd9, 0x2b, 0x87, 0xbd, 0xb7, 0x30, 0xbd, + 0xc5, 0xcd, 0x61, 0x69, 0x6d, 0x49, 0x3a, 0x5d, + 0x8b, 0x12, 0xbc, 0xde, 0xfa, 0x4d, 0xa3, 0xc2, + 0x27, 0x4d, 0x1c, 0x63, 0x06, 0x08, 0xb5, 0x31, + 0xcc, 0x4c, 0xdb, 0x2d, 0x66, 0xd1, 0x28, 0xec, + 0xbb, 0x29, 0x9b, 0x30, 0x12, 0x18, 0xe4, 0x6c, + 0x6e, 0x88, 0x86, 0xb9, 0xae, 0xad, 0x6a, 0xb5, + 0x45, 0x61, 0x3c, 0x99, 0x81, 0xb0, 0x05, 0xa2, + 0x56, 0xb8, 0xb4, 0xb8, 0xea, 0xd1, 0x53, 0x5e, + 0xf2, 0x9a, 0xcb, 0x8b, 0x60, 0xda, 0x1b, 0xdb, + 0x61, 0xa1, 0xb2, 0x8c, 0x63, 0xce, 0xf2, 0xbe, + 0x52, 0xbd, 0xdb, 0xdb, 0xff, 0x00, 0xf6, 0x69, + 0xdf, 0x4a, 0x34, 0x44, 0x1f, 0xdd, 0x78, 0x03, + 0x8d, 0x4f, 0x76, 0xda, 0xcc, 0xcf, 0x4f, 0x05, + 0x23, 0xcb, 0x52, 0x6b, 0x8e, 0x63, 0x58, 0x9e, + 0xee, 0xdb, 0x22, 0x33, 0x0c, 0xa2, 0xe2, 0xc2, + 0x26, 0xc9, 0x23, 0xda, 0xf0, 0xe7, 0x61, 0x18, + 0x6b, 0xbd, 0x55, 0xea, 0x0c, 0x96, 0xe2, 0x5b, + 0x3f, 0x6c, 0x12, 0x31, 0xb1, 0x96, 0x97, 0x50, + 0xd6, 0xba, 0x14, 0xbe, 0x76, 0xf6, 0x5d, 0xe4, + 0xb3, 0xcd, 0x1e, 0x9e, 0x69, 0xf5, 0x1f, 0xfe, + 0x37, 0x61, 0x2b, 0x19, 0x8b, 0xfd, 0x8b, 0x66, + 0xc4, 0x60, 0xd0, 0x98, 0xd9, 0x18, 0xed, 0xba, + 0x8a, 0x23, 0x2d, 0xa6, 0xb5, 0xf8, 0xad, 0x6f, + 0x2d, 0x8e, 0x2d, 0x7d, 0x7e, 0xca, 0xd2, 0x2d, + 0xf8, 0xcc, 0xcf, 0xfe, 0x10, 0xd9, 0x6e, 0x4f, + 0x75, 0x98, 0x34, 0xc8, 0xc2, 0x23, 0x87, 0xd6, + 0x38, 0x6b, 0xed, 0x05, 0xd5, 0x3e, 0xcd, 0x5d, + 0x47, 0x13, 0x9f, 0x0c, 0xad, 0x98, 0x8d, 0x6d, + 0xa1, 0x69, 0xee, 0x69, 0x52, 0xf0, 0x41, 0x23, + 0x72, 0x36, 0x41, 0x6d, 0x46, 0xcc, 0xf8, 0x46, + 0x03, 0xab, 0xc6, 0x70, 0xaa, 0xd7, 0x90, 0xd8, + 0xdf, 0x59, 0x09, 0x59, 0x76, 0xec, 0x41, 0xf8, + 0x4b, 0x34, 0x97, 0x69, 0xa1, 0xc4, 0xa2, 0x72, + 0xdb, 0x8c, 0xee, 0xf0, 0x9f, 0x04, 0xc7, 0x94, + 0xc7, 0xf4, 0xd2, 0x69, 0x6b, 0x4d, 0xa3, 0x76, + 0xf8, 0x9e, 0x10, 0xaf, 0xe5, 0xd9, 0x74, 0xb7, + 0xf2, 0x49, 0x14, 0x6e, 0x6b, 0x1d, 0x10, 0x05, + 0xd8, 0xab, 0xae, 0xb4, 0x5d, 0xb0, 0xec, 0xd5, + 0xdb, 0xe5, 0x91, 0x8f, 0x91, 0xac, 0x63, 0x0e, + 0x89, 0x29, 0x5c, 0x5a, 0x34, 0x80, 0x3b, 0x0b, + 0xb7, 0x28, 0x60, 0x66, 0x79, 0x7e, 0xd6, 0x8a, + 0x37, 0x58, 0x1d, 0x82, 0x6a, 0xb9, 0xb3, 0xfc, + 0xe6, 0xf6, 0xde, 0xfd, 0xd6, 0xd6, 0xef, 0xe6, + 0x99, 0x18, 0x6d, 0x48, 0xa5, 0x49, 0x23, 0x16, + 0xea, 0xbc, 0xe4, 0xbd, 0xaf, 0xa5, 0x66, 0x38, + 0xd7, 0x55, 0x63, 0x0e, 0x0a, 0xe3, 0x9b, 0xdf, + 0x59, 0xdb, 0x69, 0x8d, 0x63, 0xda, 0x83, 0x3e, + 0x2b, 0x8b, 0x75, 0xd0, 0xd3, 0x81, 0x48, 0x6c, + 0xf3, 0x99, 0xd6, 0x71, 0x63, 0x3a, 0xc3, 0x83, + 0x6b, 0xf3, 0xa9, 0xa1, 0x45, 0x17, 0x92, 0x6a, + 0x75, 0x9d, 0x25, 0x49, 0x64, 0xb9, 0x6c, 0xf7, + 0xd7, 0x01, 0xed, 0x71, 0x8a, 0x38, 0x48, 0x73, + 0xa5, 0x6e, 0xba, 0xeb, 0x00, 0x2e, 0x99, 0x3f, + 0x87, 0x3a, 0xf0, 0xe0, 0xcf, 0x82, 0x27, 0xbb, + 0x8f, 0x48, 0xd7, 0x8a, 0x6e, 0xfb, 0xad, 0x7a, + 0xe2, 0x06, 0xdb, 0xb9, 0xdc, 0xc3, 0xa8, 0x48, + 0x1e, 0x48, 0x03, 0xca, 0xc4, 0xb9, 0x36, 0xa9, + 0xd1, 0xe3, 0xb7, 0x03, 0xf6, 0x80, 0x3a, 0xbe, + 0x6d, 0x45, 0x14, 0xf8, 0x9a, 0x37, 0x99, 0x22, + 0x89, 0xed, 0x33, 0x46, 0x28, 0x45, 0x75, 0x13, + 0xaa, 0xaa, 0xa6, 0x32, 0xcc, 0xcf, 0x30, 0xbf, + 0xb9, 0x64, 0xaf, 0x02, 0x78, 0xc8, 0xc6, 0xe7, + 0x54, 0x0a, 0x1f, 0x27, 0x0d, 0x16, 0x7c, 0x53, + 0x13, 0x68, 0x99, 0xe1, 0xb2, 0x38, 0xb7, 0x79, + 0x88, 0xb6, 0xcd, 0xb5, 0xd6, 0xd3, 0x96, 0x74, + 0xe3, 0xc7, 0x4f, 0x82, 0x3a, 0xab, 0xbb, 0x25, + 0x85, 0xb7, 0x19, 0x9c, 0x31, 0xbb, 0x4b, 0x41, + 0x2f, 0x20, 0xee, 0xe1, 0x15, 0x5c, 0x57, 0x50, + 0xba, 0xda, 0xe1, 0xf6, 0xef, 0x70, 0x73, 0xa3, + 0x34, 0x24, 0x57, 0xe5, 0x52, 0x1b, 0x32, 0x6b, + 0x9b, 0x33, 0xcc, 0x7f, 0x81, 0x68, 0xbc, 0xfd, + 0x16, 0x98, 0xe4, 0xc1, 0x86, 0x9a, 0xe6, 0xa4, + 0x4f, 0xb2, 0xd0, 0x96, 0xda, 0x3b, 0xfb, 0x9b, + 0x56, 0xc3, 0x14, 0x0f, 0x31, 0x97, 0xe2, 0x2e, + 0x73, 0x75, 0xd1, 0xb4, 0x5b, 0xf2, 0xbb, 0xc6, + 0x5d, 0xe5, 0xed, 0xf6, 0xa7, 0xb7, 0x1e, 0x96, + 0x3e, 0xa4, 0x0a, 0x8d, 0x55, 0x2a, 0x2f, 0x6b, + 0x8d, 0x2e, 0xe0, 0x1f, 0xd4, 0x3e, 0x15, 0x04, + 0x01, 0x3a, 0x43, 0x49, 0xec, 0x80, 0xb9, 0x57, + 0x1e, 0xec, 0x75, 0x98, 0xe1, 0x3c, 0xda, 0xf2, + 0x67, 0x9a, 0x67, 0xbf, 0xeb, 0x57, 0xc3, 0x6c, + 0xf8, 0x7c, 0x96, 0x4d, 0x97, 0xd0, 0xfb, 0xb0, + 0x35, 0x02, 0xd0, 0x29, 0xbd, 0x57, 0x28, 0xec, + 0xdd, 0x92, 0x4b, 0x9b, 0xcd, 0x1c, 0x4d, 0xc4, + 0xf7, 0xb9, 0xa1, 0xad, 0x1b, 0xa4, 0x85, 0xdf, + 0xb2, 0x07, 0xde, 0xab, 0xfd, 0x4f, 0xef, 0x2f, + 0x76, 0xd1, 0x36, 0x4d, 0xa9, 0xb8, 0x71, 0xff, + 0x00, 0x84, 0x0b, 0x80, 0xee, 0x35, 0xaa, 0x37, + 0x6d, 0xc9, 0x79, 0xe5, 0x08, 0x8a, 0x6e, 0xf2, + 0xf8, 0xe9, 0x3f, 0xad, 0x6d, 0x3e, 0x6d, 0x31, + 0xec, 0xb5, 0xc9, 0x6d, 0x64, 0x9d, 0x91, 0xb8, + 0xfe, 0x68, 0x05, 0xdd, 0xf3, 0x45, 0xc1, 0x98, + 0xe5, 0x77, 0x39, 0x7b, 0x9a, 0x65, 0xa3, 0xd8, + 0xfd, 0x02, 0x46, 0xd7, 0x0d, 0x77, 0x8d, 0x57, + 0x56, 0xd3, 0x5d, 0xca, 0xcc, 0xc2, 0x30, 0xc7, + 0x96, 0x88, 0x98, 0xd7, 0x36, 0x84, 0x8d, 0x3a, + 0x54, 0xa6, 0x78, 0x04, 0xd9, 0x13, 0xe4, 0x76, + 0x97, 0x06, 0xb5, 0xfd, 0xdd, 0x0a, 0x6b, 0x7b, + 0xc4, 0xd6, 0x6d, 0xe1, 0x28, 0xb6, 0x0c, 0x33, + 0x19, 0x6b, 0x5a, 0xcd, 0x27, 0x0f, 0xb6, 0x65, + 0x09, 0x97, 0x64, 0xd7, 0x77, 0xed, 0x32, 0x34, + 0xb6, 0x38, 0x81, 0xa0, 0x7b, 0xaa, 0x6b, 0xda, + 0x01, 0x74, 0xdc, 0xec, 0xd5, 0xdc, 0x31, 0x19, + 0x23, 0x90, 0x4d, 0x41, 0x52, 0xd0, 0x30, 0x9e, + 0xe2, 0x94, 0xba, 0xc5, 0x65, 0x90, 0x9e, 0x60, + 0xe1, 0x7b, 0x22, 0x68, 0x69, 0xec, 0x9a, 0x55, + 0x44, 0x64, 0xf9, 0xfb, 0x6c, 0xa2, 0x92, 0x3b, + 0xa3, 0x24, 0xa1, 0xce, 0x0e, 0x61, 0x1e, 0x31, + 0xd5, 0xa7, 0xca, 0x29, 0xbb, 0x24, 0xeb, 0x35, + 0xf0, 0x89, 0x27, 0x0e, 0x0a, 0x69, 0x4b, 0xeb, + 0xba, 0xf5, 0xdd, 0xbf, 0xd8, 0xe8, 0xd9, 0x32, + 0x4c, 0xd7, 0x00, 0xee, 0x35, 0xa2, 0x9d, 0xa2, + 0x57, 0x36, 0x6f, 0x04, 0xb7, 0x19, 0xec, 0xb6, + 0xf0, 0x8a, 0xbd, 0xe5, 0xbd, 0xc1, 0x80, 0x54, + 0xae, 0xcd, 0x9b, 0x92, 0x39, 0x73, 0x0b, 0xe9, + 0x22, 0x05, 0xac, 0x79, 0xc4, 0xd6, 0x9d, 0xc0, + 0x5c, 0x74, 0x29, 0x58, 0xec, 0x63, 0x8e, 0xfa, + 0xe2, 0xf5, 0xc3, 0x14, 0x92, 0xe1, 0x03, 0xb0, + 0xd0, 0x06, 0x8e, 0xe9, 0x55, 0xb5, 0xf6, 0xe4, + 0xb5, 0xa7, 0x93, 0xa5, 0x30, 0xc6, 0x4c, 0x14, + 0xa4, 0x4e, 0xb1, 0xbe, 0x74, 0x95, 0x63, 0x31, + 0xca, 0x64, 0xcb, 0xe2, 0x12, 0x4d, 0x33, 0x1d, + 0x88, 0xd1, 0x8c, 0x15, 0xa9, 0x52, 0x17, 0x50, + 0x67, 0x03, 0x2a, 0x73, 0xe5, 0xb8, 0x63, 0xad, + 0xc4, 0x60, 0x98, 0xc3, 0x74, 0xe1, 0xd1, 0x41, + 0x55, 0x0f, 0x9a, 0xdf, 0xcb, 0x79, 0x76, 0xf7, + 0xc9, 0xe2, 0x86, 0xd5, 0x8c, 0x8f, 0xe6, 0x81, + 0xb9, 0xdb, 0x56, 0x6b, 0xff, 0x00, 0xf4, 0xe3, + 0xfe, 0xc1, 0xbf, 0x22, 0xb5, 0xad, 0x3a, 0x53, + 0x77, 0xb6, 0x63, 0x8b, 0x96, 0x3a, 0x63, 0xb7, + 0x7a, 0x69, 0xba, 0x29, 0x58, 0x9e, 0x3a, 0xfb, + 0x90, 0x96, 0x59, 0x25, 0xcd, 0xe5, 0xb7, 0xb4, + 0x47, 0x23, 0x69, 0xa6, 0x8d, 0x35, 0xa9, 0xa6, + 0xe2, 0xe9, 0x8b, 0x66, 0x2e, 0x9f, 0x18, 0x7c, + 0x92, 0xb6, 0x27, 0x1d, 0x4c, 0xa5, 0x78, 0x54, + 0x96, 0xcd, 0x1f, 0xf2, 0xa6, 0x79, 0xce, 0xf0, + 0xa8, 0xbd, 0x9f, 0xbe, 0xb9, 0x9b, 0x36, 0x73, + 0x66, 0x95, 0xcf, 0x6b, 0xda, 0xec, 0x4d, 0x24, + 0x90, 0x08, 0xd5, 0x40, 0xa2, 0x72, 0x5e, 0x66, + 0xda, 0x4f, 0x0a, 0xaf, 0x5c, 0x38, 0x22, 0x31, + 0xee, 0xac, 0xce, 0xfe, 0x1b, 0xbd, 0x88, 0xdb, + 0xab, 0x59, 0xad, 0x27, 0x75, 0xbc, 0xa2, 0xaf, + 0x14, 0xa1, 0x1f, 0x9d, 0x5d, 0x54, 0x52, 0x71, + 0x6c, 0xc5, 0xd3, 0xe1, 0x0f, 0x74, 0xad, 0x63, + 0xce, 0x90, 0xc2, 0xd2, 0x78, 0x56, 0xfc, 0xd9, + 0xac, 0x76, 0xd1, 0xd9, 0xb0, 0xea, 0x70, 0x69, + 0x23, 0xb4, 0x5c, 0x7e, 0x45, 0xef, 0x6a, 0xae, + 0xa6, 0x86, 0x28, 0x23, 0x89, 0xee, 0x8f, 0x1b, + 0x9c, 0xe7, 0x16, 0x92, 0x09, 0xc2, 0x34, 0x0a, + 0x85, 0x33, 0x92, 0xd3, 0xb2, 0x23, 0x84, 0xab, + 0xe9, 0xf1, 0xd3, 0xbb, 0x6c, 0x9e, 0x18, 0xfc, + 0x34, 0xf7, 0xb8, 0x4e, 0xce, 0xde, 0x36, 0x07, + 0xcc, 0xf7, 0xb5, 0xb8, 0x03, 0x9c, 0x59, 0xa6, + 0xbe, 0x2d, 0x78, 0x94, 0x4e, 0x20, 0xad, 0xf6, + 0x93, 0xbe, 0xe3, 0x20, 0x12, 0xbc, 0xd5, 0xe6, + 0x07, 0x87, 0x1e, 0xcb, 0x43, 0x9b, 0xf2, 0x2a, + 0x60, 0x76, 0x85, 0x6c, 0x57, 0xb4, 0xcd, 0xa2, + 0xd3, 0xe1, 0x2e, 0x7e, 0x67, 0x16, 0x3a, 0x6c, + 0x9a, 0x44, 0xfd, 0x75, 0xdc, 0xd9, 0x54, 0xaa, + 0xd7, 0x89, 0x31, 0x2e, 0xac, 0xed, 0x95, 0x4a, + 0xad, 0x78, 0x93, 0x12, 0x0e, 0xab, 0x22, 0x7d, + 0xba, 0xde, 0x9e, 0xb5, 0x9f, 0x58, 0x2b, 0x1e, + 0x72, 0x07, 0xb5, 0x8f, 0x30, 0x7c, 0xaa, 0xb3, + 0x62, 0xef, 0xfb, 0xeb, 0x6f, 0xb5, 0x67, 0xd6, + 0x0a, 0xcd, 0x9c, 0xfb, 0xd0, 0xf3, 0x38, 0xd6, + 0x5f, 0x33, 0xe3, 0x57, 0xa1, 0xfc, 0xbf, 0xec, + 0xbf, 0xc5, 0xcb, 0x6d, 0xef, 0x11, 0x79, 0xcd, + 0xef, 0x95, 0x3c, 0xa0, 0x6d, 0xff, 0x00, 0x6f, + 0x17, 0x9e, 0xdf, 0x0a, 0x9e, 0x5c, 0x5b, 0x85, + 0x15, 0x9c, 0x7b, 0xd5, 0x97, 0x9f, 0xf2, 0x85, + 0x2a, 0xa2, 0xb3, 0x8f, 0x7a, 0xb2, 0xf3, 0xfe, + 0x50, 0x81, 0x93, 0x7b, 0xd5, 0xef, 0x9e, 0x7e, + 0xb1, 0x52, 0xaa, 0x2b, 0x26, 0xf7, 0xab, 0xdf, + 0x3c, 0xfd, 0x62, 0xa5, 0x50, 0x11, 0x11, 0x06, + 0x46, 0xa2, 0xbe, 0x1d, 0x7b, 0xef, 0x97, 0x1f, + 0x6a, 0xff, 0x00, 0xac, 0x57, 0xdc, 0x46, 0xa2, + 0xbe, 0x1d, 0x7b, 0xef, 0x97, 0x1f, 0x6a, 0xff, + 0x00, 0xac, 0x56, 0x4f, 0x37, 0xe1, 0x47, 0xd0, + 0x7f, 0x6d, 0xfd, 0xfe, 0x63, 0xe1, 0x8f, 0xfc, + 0xda, 0x51, 0x11, 0x64, 0x7d, 0x20, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x94, 0x28, + 0x0a, 0xf5, 0xb0, 0xbb, 0x37, 0x97, 0xdf, 0x65, + 0xf3, 0x5f, 0x66, 0x16, 0xed, 0x9f, 0x9c, 0x7f, + 0x37, 0x00, 0x75, 0x74, 0x35, 0x9e, 0x51, 0x14, + 0xa6, 0xb2, 0xa8, 0xcd, 0x6b, 0x9c, 0x68, 0xd1, + 0x52, 0x4d, 0x38, 0x57, 0xd4, 0x6f, 0xae, 0x1d, + 0xb2, 0xbb, 0x23, 0x03, 0x23, 0xf1, 0x67, 0x67, + 0x36, 0xc0, 0x4e, 0xeb, 0xdc, 0x71, 0xc9, 0xab, + 0xb1, 0x55, 0xdf, 0xcb, 0x56, 0x26, 0xd3, 0x6b, + 0x7d, 0xb5, 0xf1, 0x79, 0x3f, 0xce, 0xb3, 0x5e, + 0x31, 0xe2, 0xc1, 0x8a, 0xda, 0x64, 0xf3, 0x19, + 0x22, 0xb1, 0xb6, 0x74, 0x9d, 0x23, 0xdb, 0xaf, + 0xb3, 0x8a, 0xa3, 0xb6, 0xf9, 0x3d, 0xbe, 0x55, + 0x9a, 0xb7, 0xd9, 0x63, 0x11, 0x5a, 0x5c, 0x46, + 0x1f, 0x13, 0x1b, 0xa9, 0xa4, 0x78, 0xae, 0x1f, + 0x2a, 0x87, 0xc9, 0xa2, 0x8e, 0x7c, 0xda, 0xce, + 0xde, 0x56, 0x87, 0xc5, 0x34, 0xf1, 0xb1, 0xed, + 0x3a, 0x8b, 0x5c, 0xe0, 0x0a, 0xbf, 0x6d, 0xed, + 0xa4, 0x79, 0x8e, 0xcf, 0x43, 0x9a, 0x40, 0x2b, + 0xcc, 0x96, 0xc8, 0xd3, 0xbb, 0xcd, 0xcb, 0x40, + 0xe1, 0xdc, 0x24, 0x15, 0x46, 0xc8, 0x29, 0xd7, + 0x59, 0x79, 0xff, 0x00, 0xf8, 0x98, 0xfe, 0xb0, + 0x51, 0x92, 0x91, 0x19, 0x63, 0x48, 0xfa, 0x6f, + 0x6d, 0x61, 0x6f, 0x21, 0xe6, 0x2d, 0x97, 0xf9, + 0x7d, 0xa6, 0x66, 0x7b, 0x98, 0x69, 0x7a, 0x5a, + 0x7f, 0x5b, 0x5a, 0xc7, 0x0f, 0xf0, 0x7d, 0x1e, + 0xef, 0x67, 0xb6, 0x2e, 0xc7, 0x09, 0xbb, 0xb6, + 0xb6, 0xb6, 0x0f, 0xa8, 0x67, 0x3a, 0xec, 0x18, + 0xa9, 0x4a, 0xd2, 0xae, 0x0b, 0x54, 0x59, 0x0e, + 0xc3, 0xde, 0x93, 0x15, 0xb4, 0x76, 0xcf, 0x92, + 0x95, 0xa4, 0x12, 0x55, 0xdd, 0xe7, 0x15, 0xc7, + 0xf8, 0x93, 0x67, 0x79, 0x75, 0x0d, 0x8f, 0xb3, + 0x40, 0xf9, 0xb0, 0x3a, 0x4c, 0x61, 0x8d, 0x2e, + 0xc3, 0x50, 0xca, 0x56, 0x8a, 0xb9, 0xb3, 0x19, + 0x0e, 0x76, 0x33, 0xcb, 0x49, 0xbd, 0x96, 0x58, + 0x23, 0x86, 0x46, 0xc9, 0x24, 0x8f, 0x69, 0x60, + 0xc0, 0xd3, 0x88, 0x8a, 0xba, 0x9e, 0x56, 0xa5, + 0xde, 0xf3, 0x11, 0x92, 0x29, 0x18, 0xf5, 0xd7, + 0xdb, 0xa3, 0xc8, 0xf2, 0xd8, 0x26, 0xde, 0x4f, + 0xd4, 0x4f, 0x9d, 0xbd, 0x32, 0x46, 0xe9, 0x8c, + 0x7d, 0xcd, 0x3c, 0x3f, 0x16, 0x9d, 0xad, 0xd9, + 0xd3, 0x91, 0xdf, 0x06, 0x42, 0xf2, 0xfb, 0x5b, + 0x86, 0x97, 0xc0, 0x5d, 0xa5, 0xc0, 0x8d, 0x6d, + 0x27, 0x42, 0xba, 0x64, 0x3b, 0x2f, 0xb3, 0xf7, + 0x39, 0x35, 0x95, 0xc4, 0xf6, 0x31, 0xbe, 0x69, + 0x62, 0x6b, 0x9e, 0xf3, 0x5a, 0xd4, 0xff, 0x00, + 0x69, 0x45, 0x7e, 0x27, 0x4d, 0x11, 0x36, 0x10, + 0x57, 0xf5, 0xa3, 0x9c, 0x79, 0x1b, 0xa1, 0xae, + 0xc2, 0xd1, 0xdf, 0x05, 0x4f, 0x65, 0xd7, 0x9e, + 0xc5, 0xb2, 0x96, 0x17, 0x24, 0xf8, 0xac, 0x65, + 0xb8, 0x77, 0x9a, 0xe7, 0xb5, 0xa7, 0x86, 0xa9, + 0x8a, 0x95, 0x8c, 0xd7, 0x8d, 0x23, 0x48, 0x8f, + 0x05, 0xfc, 0xd7, 0x98, 0xf3, 0x19, 0x3f, 0x97, + 0xf9, 0x4b, 0x6e, 0xbd, 0x72, 0x5f, 0x25, 0xa9, + 0x33, 0x16, 0xd2, 0x6d, 0x11, 0xe1, 0x2f, 0x9d, + 0xed, 0x46, 0x5f, 0x1e, 0x5b, 0x9f, 0x5d, 0x5b, + 0x44, 0xd0, 0xc8, 0x9a, 0xe0, 0xe8, 0xd8, 0x35, + 0x06, 0x3c, 0x02, 0x02, 0xb9, 0xec, 0xbe, 0xca, + 0xe4, 0xd7, 0x19, 0x0d, 0xad, 0xcd, 0xed, 0xa3, + 0x26, 0xb9, 0x98, 0x19, 0x0c, 0x8e, 0xad, 0x68, + 0xe3, 0xe2, 0x8d, 0x63, 0x50, 0x51, 0x5f, 0x89, + 0x76, 0x24, 0xe6, 0xd6, 0x73, 0xb0, 0x53, 0xda, + 0x63, 0xe6, 0xea, 0x37, 0x5c, 0xd7, 0x53, 0xc0, + 0xe0, 0xae, 0x4c, 0x73, 0x6c, 0x65, 0xcb, 0x32, + 0xc6, 0x68, 0xf1, 0x1c, 0x0f, 0x64, 0x44, 0xc0, + 0x3c, 0x25, 0x57, 0x0e, 0x3a, 0xc6, 0x4b, 0xcd, + 0xa3, 0x87, 0xb3, 0xf1, 0x5b, 0xcf, 0xf9, 0xcc, + 0x97, 0xf2, 0x3e, 0x52, 0x29, 0x79, 0xae, 0x4b, + 0xc4, 0xde, 0xd6, 0xac, 0xf1, 0xff, 0x00, 0x6e, + 0xba, 0x4e, 0xb2, 0xf9, 0xae, 0xd7, 0xd8, 0x5b, + 0xd9, 0x67, 0xf2, 0x5a, 0xda, 0x44, 0x23, 0x66, + 0x18, 0xcb, 0x63, 0x65, 0x69, 0x57, 0x34, 0x56, + 0x9d, 0xd2, 0xa5, 0xa1, 0xc9, 0xb2, 0x0d, 0x9b, + 0xb6, 0x8a, 0xe7, 0x68, 0x01, 0xba, 0xbd, 0x9c, + 0x62, 0x8e, 0xc9, 0xba, 0x9a, 0x3b, 0x22, 0xa3, + 0x84, 0xa9, 0x29, 0xac, 0xa3, 0xba, 0xfc, 0x43, + 0x92, 0x59, 0x45, 0x62, 0xb3, 0x81, 0x97, 0x2e, + 0xec, 0xe0, 0x63, 0x5a, 0xdd, 0x1d, 0x82, 0x6a, + 0xb8, 0xf6, 0x72, 0xfe, 0x3c, 0xce, 0xef, 0x3c, + 0xcd, 0x6f, 0x20, 0x65, 0xd1, 0x8d, 0x8d, 0x96, + 0x26, 0x48, 0xd0, 0xe0, 0x1b, 0xfa, 0xcc, 0x2d, + 0x15, 0xd5, 0xa0, 0x05, 0x59, 0xa4, 0x77, 0x2d, + 0x3a, 0x7d, 0xd6, 0x9d, 0x38, 0x6b, 0xe1, 0xe3, + 0xc3, 0xda, 0xeb, 0x3e, 0x63, 0x25, 0xfc, 0xae, + 0x28, 0xd6, 0xd3, 0x5c, 0x38, 0x71, 0x5f, 0x2c, + 0xd2, 0x76, 0xe4, 0xc9, 0x39, 0x3e, 0x9a, 0x57, + 0x7f, 0xf8, 0xcc, 0xb4, 0xb7, 0x68, 0xf6, 0x3e, + 0xec, 0x9b, 0x7b, 0xcc, 0x99, 0xb0, 0x42, 0xed, + 0x02, 0x48, 0xe8, 0xe7, 0x0a, 0xee, 0xf8, 0xb8, + 0x4a, 0x8b, 0xda, 0x3d, 0x9e, 0x66, 0x5a, 0xc8, + 0xaf, 0xac, 0x25, 0xf6, 0x9c, 0xae, 0xe7, 0x4c, + 0x52, 0x03, 0x57, 0x34, 0x9f, 0xcd, 0x71, 0xdd, + 0x56, 0x0c, 0xa6, 0xef, 0x2a, 0xda, 0x78, 0x6e, + 0xec, 0xe6, 0xcb, 0x21, 0xb5, 0x74, 0x51, 0x19, + 0x19, 0x3c, 0x4d, 0x1a, 0x08, 0xd5, 0xe3, 0x50, + 0x69, 0x51, 0x7b, 0x2d, 0x2b, 0x6f, 0xf2, 0xfc, + 0xcb, 0x20, 0xb8, 0x38, 0x98, 0xf8, 0x8c, 0xd6, + 0xa7, 0x58, 0x6b, 0xd9, 0xf3, 0x7b, 0x7a, 0x0a, + 0x9b, 0x44, 0x5b, 0x48, 0x9d, 0x2d, 0xba, 0x3e, + 0x89, 0xac, 0x6d, 0xf0, 0xf7, 0x2f, 0x8f, 0x24, + 0xe0, 0xb6, 0x4c, 0x94, 0x8c, 0x98, 0xbd, 0x3d, + 0xab, 0x5c, 0xf8, 0x72, 0x5f, 0xbb, 0x13, 0x8e, + 0xfe, 0x16, 0x8b, 0x47, 0x84, 0xc7, 0x8c, 0xfb, + 0x95, 0x52, 0x29, 0xaf, 0x5a, 0xc2, 0xf4, 0xea, + 0xee, 0x8a, 0x1a, 0x69, 0x0b, 0x07, 0xb0, 0xb2, + 0x3d, 0xee, 0x1f, 0x26, 0x11, 0x11, 0x48, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0xc8, 0x58, 0x59, 0x0a, + 0x06, 0x46, 0xb0, 0xbe, 0xd7, 0x94, 0xff, 0x00, + 0x25, 0xb2, 0xfb, 0x08, 0xfe, 0xa8, 0x5f, 0x14, + 0x1e, 0x53, 0x7b, 0x8b, 0xed, 0x99, 0x57, 0xf2, + 0x5b, 0x2f, 0xb1, 0x8f, 0xea, 0x85, 0xab, 0xca, + 0x7d, 0xd7, 0xf8, 0x3e, 0x7f, 0xfb, 0x8f, 0xf8, + 0x78, 0x3f, 0x6a, 0xff, 0x00, 0xa2, 0x1d, 0x23, + 0x5a, 0xae, 0x3b, 0xca, 0x3d, 0xb2, 0xac, 0x63, + 0x5a, 0xae, 0x3b, 0xca, 0x3d, 0xb2, 0xb6, 0xbe, + 0x6d, 0xba, 0xcb, 0xdf, 0x21, 0xf3, 0x82, 0x8c, + 0xda, 0x83, 0x4c, 0xde, 0x4f, 0x35, 0x9e, 0x02, + 0xa4, 0xec, 0xbd, 0xee, 0x1f, 0x38, 0x28, 0x9d, + 0xab, 0x34, 0xce, 0x1f, 0xe6, 0xb3, 0xc0, 0x57, + 0x5c, 0x1f, 0x7b, 0x2f, 0x9d, 0xfe, 0x14, 0x7e, + 0xd2, 0x33, 0x12, 0x62, 0x5a, 0xaa, 0x52, 0xa5, + 0x69, 0x79, 0xb1, 0x0d, 0xb8, 0x93, 0x12, 0xd5, + 0x52, 0x95, 0x28, 0x9d, 0x1b, 0x71, 0x26, 0x25, + 0xaa, 0xa5, 0x2a, 0x50, 0xd1, 0xb7, 0x12, 0x62, + 0x5a, 0xaa, 0x52, 0xa5, 0x0d, 0x1b, 0x71, 0x26, + 0x25, 0xaa, 0xa5, 0x2a, 0x50, 0xd1, 0xb7, 0x12, + 0x62, 0x5a, 0xaa, 0x52, 0xa5, 0x0d, 0x1b, 0x71, + 0x26, 0x25, 0xaa, 0xa5, 0x2a, 0x50, 0xd1, 0xb7, + 0x12, 0xb9, 0x67, 0x7a, 0x36, 0x79, 0xce, 0xfe, + 0xa4, 0x7f, 0x22, 0xa4, 0xd4, 0xa9, 0x5b, 0xcd, + 0xa3, 0xba, 0xbb, 0xb0, 0x36, 0x4f, 0x8a, 0x36, + 0xb0, 0x86, 0xb7, 0x13, 0x6b, 0x5a, 0x36, 0x9b, + 0xea, 0x97, 0xac, 0xcc, 0xd7, 0x4e, 0x6e, 0xd8, + 0xad, 0x5a, 0xd3, 0x2c, 0x4c, 0xcc, 0x6f, 0xae, + 0xd5, 0xa3, 0x25, 0x7c, 0x77, 0x19, 0x65, 0xb4, + 0x8e, 0xd2, 0x63, 0x18, 0x47, 0x60, 0xb2, 0xac, + 0xf0, 0x28, 0xdc, 0xb2, 0x7e, 0x7f, 0x69, 0x6e, + 0xdf, 0xf9, 0xad, 0x6b, 0x98, 0x06, 0xf0, 0x66, + 0x16, 0xa8, 0x8c, 0xb7, 0x68, 0xae, 0xb2, 0xeb, + 0x73, 0x04, 0x71, 0xb2, 0x46, 0x17, 0x17, 0xf8, + 0xd5, 0xae, 0x9d, 0xcd, 0x0b, 0x9f, 0x2e, 0xcd, + 0x66, 0xcb, 0xee, 0x5f, 0x72, 0xc6, 0xb6, 0x59, + 0x24, 0x69, 0x6b, 0x83, 0xab, 0x4d, 0x26, 0xb5, + 0xd6, 0xa9, 0x18, 0xed, 0xad, 0x9d, 0xbb, 0xf5, + 0x9e, 0xc4, 0x44, 0xcc, 0x6c, 0x98, 0xdd, 0xf0, + 0x88, 0x58, 0xae, 0x26, 0x6c, 0x7b, 0x5b, 0x15, + 0x75, 0x3a, 0x20, 0xda, 0xf6, 0x48, 0x72, 0xd7, + 0xb5, 0x2f, 0xbe, 0x8a, 0x68, 0x1f, 0x6c, 0xe9, + 0x1a, 0xc7, 0x02, 0xd2, 0x18, 0x48, 0xab, 0x81, + 0x14, 0xd4, 0xa0, 0x2f, 0xf3, 0x39, 0xef, 0xaf, + 0x05, 0xe3, 0x80, 0x8a, 0x46, 0x86, 0x81, 0x82, + 0xb4, 0xf1, 0x77, 0x74, 0xf6, 0xd4, 0xac, 0x1b, + 0x65, 0x74, 0xc8, 0xc3, 0x26, 0x81, 0xb2, 0xb8, + 0x7e, 0x78, 0x25, 0xb5, 0xed, 0xe8, 0x4d, 0x96, + 0x8d, 0xb3, 0x11, 0x13, 0xa4, 0x22, 0x32, 0x52, + 0xd1, 0x7a, 0x4c, 0xcd, 0x2b, 0x6b, 0xcd, 0xe2, + 0x63, 0xde, 0xd9, 0x98, 0x65, 0x97, 0x56, 0xd9, + 0x61, 0xb8, 0x9e, 0xf6, 0x57, 0x92, 0xd6, 0x87, + 0x42, 0xe3, 0xa0, 0xb8, 0xd0, 0x96, 0xeb, 0x52, + 0x96, 0xc4, 0x0d, 0x99, 0x15, 0xe8, 0xcf, 0xfa, + 0xae, 0x55, 0x7c, 0xd7, 0x3c, 0xba, 0xcc, 0xf0, + 0xb6, 0x40, 0x22, 0x85, 0xa6, 0xa2, 0x36, 0xee, + 0x9d, 0xf7, 0x2d, 0xcc, 0xda, 0x4b, 0xa6, 0x65, + 0xfe, 0xc0, 0x22, 0x8c, 0xc7, 0xcd, 0x98, 0xb1, + 0x1c, 0x58, 0xa8, 0xe1, 0x86, 0xba, 0xd2, 0x69, + 0x69, 0xac, 0x7c, 0x75, 0x4d, 0x73, 0x63, 0x8b, + 0xdf, 0x49, 0xb6, 0xd9, 0xae, 0x91, 0xc3, 0xda, + 0xef, 0xd8, 0xe3, 0x59, 0xae, 0x8e, 0xf3, 0x18, + 0xb9, 0xf3, 0x2a, 0x7c, 0x50, 0x3e, 0xde, 0x1f, + 0x0b, 0x17, 0x06, 0x55, 0x9c, 0x4f, 0x96, 0x3e, + 0x47, 0xc3, 0x1b, 0x5e, 0x65, 0xa0, 0x38, 0xeb, + 0xa2, 0x84, 0xea, 0xa2, 0xf1, 0x3e, 0x65, 0x24, + 0xf9, 0x88, 0xcc, 0x1e, 0xc6, 0xb6, 0x4c, 0x4c, + 0x79, 0x68, 0xad, 0x2a, 0xca, 0x68, 0xd7, 0xd8, + 0x57, 0xdb, 0x6e, 0xe5, 0xa7, 0x9d, 0x5c, 0xfb, + 0x95, 0x9c, 0x34, 0xaf, 0xb6, 0xb6, 0x8d, 0xdf, + 0x05, 0x9f, 0x6b, 0x5c, 0x19, 0x67, 0x03, 0xb5, + 0xd2, 0x5a, 0xd3, 0xb8, 0xb6, 0xed, 0x04, 0x7e, + 0xd3, 0x92, 0xb9, 0xf1, 0x78, 0xf4, 0x2c, 0x90, + 0x61, 0xd3, 0x51, 0xab, 0x73, 0xb0, 0x55, 0x6b, + 0x33, 0xcf, 0xae, 0x73, 0x28, 0x5b, 0x0c, 0xb1, + 0xb1, 0x81, 0x8e, 0xc6, 0x0b, 0x2b, 0xae, 0x9a, + 0xb4, 0xad, 0xd9, 0x6e, 0xd3, 0xdd, 0xd8, 0xc0, + 0x2d, 0xdc, 0xc1, 0x3c, 0x4c, 0xd0, 0xc2, 0x4d, + 0x1c, 0x06, 0xf2, 0xe7, 0xdb, 0xb6, 0xda, 0xcf, + 0xb6, 0x27, 0xc1, 0xd6, 0x73, 0xe3, 0xb5, 0xef, + 0x13, 0xac, 0x46, 0x4a, 0xed, 0xd5, 0x33, 0xb2, + 0x90, 0xba, 0x2b, 0x19, 0x64, 0x90, 0x16, 0x89, + 0x1f, 0x89, 0xa0, 0x8a, 0x78, 0xad, 0x68, 0x0b, + 0xc6, 0xce, 0x4a, 0x26, 0xbf, 0xcc, 0xa4, 0x06, + 0xb8, 0xa4, 0xa8, 0x3d, 0x8c, 0x4e, 0xa2, 0x8c, + 0xbf, 0xda, 0xab, 0xbb, 0xa8, 0x5d, 0x0c, 0x51, + 0xb6, 0x06, 0xbc, 0x51, 0xce, 0x04, 0x97, 0x53, + 0xb1, 0xa9, 0x71, 0xe5, 0x59, 0xd4, 0xf9, 0x59, + 0x90, 0xc5, 0x1b, 0x24, 0xe7, 0x69, 0x5c, 0x75, + 0xd1, 0x4e, 0xd1, 0x4e, 0xdd, 0xa6, 0x2f, 0x33, + 0x11, 0x1a, 0x91, 0x97, 0x1d, 0x6d, 0x86, 0x91, + 0x33, 0x35, 0xc7, 0xed, 0xf6, 0x36, 0xe7, 0xee, + 0xff, 0x00, 0x39, 0xba, 0x1f, 0xd6, 0x03, 0xe8, + 0xb5, 0x75, 0xec, 0x9d, 0xd0, 0x65, 0xfb, 0xe0, + 0x27, 0x44, 0xcc, 0x21, 0xb5, 0xf9, 0xcc, 0x35, + 0x3e, 0x15, 0x0d, 0x7b, 0x76, 0xfb, 0xdb, 0xa9, + 0x2e, 0xa4, 0x01, 0xae, 0x94, 0x82, 0x58, 0xdd, + 0x5b, 0x83, 0xc0, 0x14, 0x86, 0x41, 0x61, 0x7f, + 0x25, 0xed, 0xbd, 0xdc, 0x4c, 0x3c, 0xc3, 0x1f, + 0xe3, 0x4a, 0x69, 0x4c, 0x23, 0xca, 0x1d, 0xd5, + 0xd2, 0xfc, 0x31, 0xe9, 0x33, 0xe1, 0x0e, 0x14, + 0x9b, 0x4e, 0x79, 0xb5, 0x62, 0x67, 0x5b, 0x7b, + 0x39, 0x4f, 0xb5, 0x68, 0xcc, 0x39, 0xbb, 0x0c, + 0xb6, 0xf2, 0x56, 0x1a, 0x19, 0x0b, 0x9c, 0x3c, + 0xf9, 0x28, 0xdf, 0x0a, 0xa2, 0xe2, 0x14, 0xd7, + 0xa5, 0x59, 0xf6, 0xc2, 0xec, 0x32, 0xd6, 0x1b, + 0x50, 0x7c, 0x69, 0x5d, 0x8d, 0xdd, 0xa6, 0x8d, + 0x1c, 0x35, 0x55, 0x4a, 0xaa, 0xe1, 0x8d, 0x2b, + 0x3f, 0x15, 0xfc, 0xec, 0xc4, 0xdf, 0x6c, 0x78, + 0x56, 0x1b, 0x31, 0x26, 0x25, 0xaa, 0xa5, 0x2a, + 0x57, 0x56, 0x6d, 0x1b, 0x71, 0x26, 0x25, 0xaa, + 0xa5, 0x2a, 0x50, 0xd1, 0xb7, 0x12, 0x62, 0x5a, + 0xaa, 0x52, 0xa5, 0x0d, 0x1b, 0x71, 0x26, 0x25, + 0xaa, 0xa5, 0x2a, 0x50, 0xd1, 0xb7, 0x12, 0x62, + 0x5a, 0xaa, 0x52, 0xa5, 0x0d, 0x1b, 0x71, 0x26, + 0x25, 0xaa, 0xa5, 0x2a, 0x50, 0xd1, 0xb7, 0x12, + 0x62, 0x5a, 0xaa, 0x52, 0xa8, 0x68, 0x90, 0xca, + 0x0f, 0xf9, 0xa5, 0xa7, 0xda, 0xb7, 0xc2, 0xac, + 0x79, 0xb7, 0xbe, 0xbb, 0xcd, 0x6f, 0x81, 0x56, + 0x32, 0x63, 0x5c, 0xda, 0xd3, 0xed, 0x5b, 0xe1, + 0x56, 0x7c, 0xd7, 0xdf, 0x5d, 0xe6, 0xb7, 0xc0, + 0xb3, 0xf9, 0x8f, 0xba, 0x3e, 0x0f, 0x43, 0xc8, + 0xfd, 0x96, 0xf8, 0xb4, 0x5b, 0x7b, 0xc4, 0x5e, + 0x70, 0xf0, 0xae, 0x2d, 0xad, 0x34, 0xcd, 0x1b, + 0xf6, 0x63, 0xc2, 0x57, 0x6d, 0xb7, 0xbc, 0x45, + 0xe7, 0x0f, 0x0a, 0xe0, 0xdb, 0x03, 0xfe, 0x68, + 0xd3, 0xfe, 0x18, 0xf0, 0x95, 0x18, 0x3f, 0x89, + 0x1f, 0x05, 0xfc, 0xef, 0xf0, 0x7f, 0x18, 0x43, + 0xe2, 0x4c, 0x4b, 0x55, 0x52, 0xa5, 0x69, 0x79, + 0x8d, 0xb8, 0x93, 0x12, 0xd5, 0x52, 0x95, 0x28, + 0x68, 0xdb, 0x89, 0x4c, 0xec, 0x99, 0xff, 0x00, + 0x34, 0x3f, 0x64, 0xef, 0x08, 0x50, 0x35, 0x2b, + 0xaf, 0x2c, 0xcc, 0xa5, 0xcb, 0xae, 0x0c, 0xf1, + 0xb1, 0xaf, 0x71, 0x69, 0x65, 0x1d, 0x5a, 0x50, + 0x91, 0xa7, 0x42, 0x8b, 0xc4, 0xcd, 0x66, 0x23, + 0xdb, 0x0b, 0xe1, 0x9d, 0xb9, 0x2b, 0x69, 0xf0, + 0x89, 0x4b, 0x6d, 0x85, 0x3a, 0xc2, 0x1f, 0xb1, + 0x1f, 0x59, 0xca, 0x08, 0x91, 0x42, 0x0e, 0xad, + 0xde, 0x02, 0x3e, 0x55, 0xd1, 0x9a, 0x66, 0x93, + 0x66, 0x53, 0x32, 0x69, 0x58, 0xd6, 0x39, 0x8c, + 0xc1, 0x46, 0x56, 0x9a, 0xc9, 0xdd, 0xed, 0xae, + 0x40, 0xea, 0x69, 0xdd, 0x1a, 0x92, 0x91, 0x31, + 0x4a, 0xc4, 0xf8, 0xea, 0x66, 0x9d, 0xd9, 0x6d, + 0x68, 0x8e, 0x52, 0xbc, 0x5c, 0x87, 0xde, 0x6c, + 0xe9, 0x30, 0x8c, 0x4e, 0x7c, 0x00, 0x80, 0x34, + 0x9a, 0x80, 0x34, 0x77, 0x97, 0x16, 0xc7, 0xc2, + 0xfc, 0x37, 0x33, 0x39, 0xa4, 0x31, 0xc5, 0x8d, + 0x6d, 0x45, 0x34, 0xb7, 0x15, 0x7c, 0x2a, 0x27, + 0x2a, 0xda, 0x1b, 0xbc, 0xba, 0x3e, 0x62, 0x82, + 0x68, 0x2b, 0x50, 0xd7, 0x12, 0x0b, 0x77, 0xe8, + 0x42, 0xe9, 0xba, 0xda, 0xfb, 0xc9, 0x62, 0x2c, + 0x82, 0x26, 0xc2, 0x5d, 0x50, 0x5e, 0x49, 0x2e, + 0x00, 0xfc, 0xdd, 0x0b, 0x8c, 0xd2, 0xf1, 0x16, + 0xac, 0x78, 0x4c, 0xb5, 0x46, 0x5c, 0x53, 0x7a, + 0x65, 0x9b, 0x5b, 0x75, 0x2b, 0xa6, 0xd6, 0x7d, + 0xb9, 0xa3, 0x6a, 0x8c, 0xc0, 0xf8, 0xbc, 0xef, + 0x36, 0x4e, 0xe5, 0x29, 0x85, 0x59, 0xdd, 0x1b, + 0x62, 0x96, 0x6b, 0xc3, 0xaf, 0x9a, 0x03, 0x90, + 0x5c, 0xef, 0x95, 0x7c, 0xe9, 0xb2, 0x39, 0xb2, + 0x09, 0x2a, 0x4b, 0x83, 0x83, 0xea, 0x75, 0x92, + 0x0d, 0x74, 0xa9, 0xab, 0x8d, 0xac, 0xbe, 0x9e, + 0x09, 0x20, 0x31, 0x46, 0xd1, 0x2b, 0x4b, 0x0b, + 0x86, 0x2a, 0x8a, 0xee, 0x85, 0x39, 0x31, 0x4c, + 0xcd, 0x74, 0xf6, 0x78, 0xa3, 0x06, 0x7a, 0x56, + 0x2d, 0xba, 0x67, 0x8d, 0xb7, 0x47, 0x0e, 0x69, + 0x3d, 0x9d, 0x73, 0x2f, 0xb2, 0xbb, 0x9b, 0x77, + 0x9d, 0x06, 0x47, 0x13, 0xda, 0x7f, 0x8e, 0xb5, + 0xed, 0x7c, 0xc1, 0x96, 0xf6, 0xd6, 0xc3, 0x46, + 0x22, 0x5e, 0x47, 0x61, 0x82, 0x9f, 0x2a, 0x85, + 0xca, 0xb3, 0xa9, 0xf2, 0xc1, 0x27, 0x34, 0xc6, + 0xc8, 0x25, 0xa5, 0x43, 0xeb, 0xa3, 0x0e, 0xad, + 0x4b, 0x5e, 0x67, 0x9a, 0xcf, 0x99, 0x4c, 0xd9, + 0x66, 0x6b, 0x5b, 0x81, 0xb8, 0x5a, 0xd6, 0xd6, + 0x9a, 0xeb, 0x5d, 0x2a, 0x7b, 0x73, 0xdc, 0xd7, + 0xf5, 0x75, 0x52, 0x73, 0x57, 0xd3, 0xed, 0x8d, + 0x77, 0xda, 0x34, 0x9d, 0x79, 0x6a, 0xb6, 0x87, + 0x4d, 0x71, 0xb3, 0xa1, 0xd6, 0xd5, 0xe7, 0x5d, + 0x6e, 0x30, 0x61, 0xd7, 0x88, 0x0d, 0xc5, 0x0f, + 0x93, 0xd9, 0xe6, 0x59, 0x8c, 0x52, 0x48, 0xfb, + 0xa9, 0xa2, 0x6b, 0x48, 0x0d, 0x20, 0x9d, 0x27, + 0x4e, 0x2d, 0x7b, 0xcb, 0x87, 0x2b, 0xda, 0x0b, + 0xbc, 0xb9, 0x86, 0x26, 0x81, 0x2c, 0x24, 0xd7, + 0x0b, 0xb7, 0x09, 0xd7, 0x84, 0xae, 0xbb, 0xad, + 0xaf, 0xbb, 0x96, 0x37, 0x47, 0x04, 0x2d, 0x84, + 0xb8, 0x53, 0x9c, 0x27, 0x11, 0x03, 0x77, 0x71, + 0x46, 0xdb, 0xc6, 0xb1, 0x11, 0x13, 0xac, 0xba, + 0x77, 0x71, 0x5e, 0x2b, 0x33, 0x6b, 0x56, 0x6b, + 0x5d, 0x34, 0x76, 0x6c, 0xd8, 0x2d, 0xcd, 0xaf, + 0x98, 0x64, 0x33, 0x16, 0x0c, 0x3c, 0xe3, 0xb5, + 0x9a, 0x3a, 0x9a, 0x54, 0x66, 0xd3, 0xbb, 0xfc, + 0xe6, 0x71, 0xd8, 0x8f, 0xea, 0xae, 0x6c, 0xaf, + 0x38, 0x9f, 0x2c, 0x96, 0x49, 0x22, 0x63, 0x65, + 0x32, 0x0a, 0x1c, 0x75, 0xdf, 0xae, 0xe1, 0x5a, + 0x73, 0x0b, 0xe9, 0x2f, 0xee, 0x9f, 0x75, 0x23, + 0x43, 0x1c, 0xf0, 0x01, 0x63, 0x6b, 0x4d, 0x02, + 0x9b, 0xaa, 0xf1, 0x5b, 0x46, 0x49, 0xb7, 0x28, + 0x72, 0xbe, 0x5a, 0xdb, 0x05, 0x6b, 0x1a, 0xeb, + 0x37, 0xd7, 0x8f, 0x8f, 0xc6, 0x5a, 0xf1, 0x2b, + 0x7e, 0xca, 0x3e, 0x33, 0x97, 0x39, 0xad, 0xa6, + 0x26, 0xc8, 0x71, 0xf7, 0x75, 0x2a, 0x65, 0x57, + 0x5e, 0x5b, 0x9a, 0xdd, 0x65, 0xb2, 0x99, 0x20, + 0x20, 0x87, 0x68, 0x7b, 0x1d, 0xa8, 0xa6, 0x4a, + 0xee, 0xae, 0x8a, 0x79, 0x7c, 0x91, 0x8e, 0xf1, + 0x6b, 0x44, 0xf8, 0x68, 0x94, 0xb5, 0x87, 0x38, + 0xb2, 0xce, 0x4c, 0x82, 0x19, 0x24, 0x2f, 0x79, + 0x12, 0x10, 0x0e, 0x07, 0xb0, 0x9f, 0x9d, 0xa9, + 0x5a, 0x65, 0x22, 0x18, 0xe4, 0x9c, 0x33, 0x13, + 0x9a, 0xca, 0xd1, 0xa3, 0x49, 0xc3, 0xa8, 0x76, + 0x55, 0x69, 0xdb, 0x69, 0x71, 0x82, 0x8d, 0xb6, + 0x68, 0x7d, 0x35, 0x97, 0x1a, 0x57, 0xb4, 0xb9, + 0xad, 0xf6, 0xb3, 0x32, 0x8d, 0xd2, 0x19, 0x43, + 0x26, 0xe7, 0x0d, 0x40, 0x75, 0x40, 0x6f, 0x61, + 0xb4, 0xdc, 0x5c, 0xad, 0x4b, 0xce, 0x9a, 0xd6, + 0x38, 0x34, 0xe3, 0xcb, 0x86, 0x9a, 0xd6, 0xb6, + 0xb7, 0xd5, 0x33, 0x6f, 0x0e, 0x08, 0xb9, 0xa7, + 0x7c, 0xd3, 0x3e, 0x59, 0x3f, 0x69, 0x23, 0x8b, + 0x9f, 0xdb, 0x2b, 0xbb, 0x20, 0xb8, 0x64, 0x39, + 0xb4, 0x0e, 0x79, 0x00, 0x3e, 0xb1, 0xd4, 0xff, + 0x00, 0x58, 0x28, 0xfb, 0x9b, 0x8f, 0x68, 0x9d, + 0xf3, 0x08, 0xdb, 0x16, 0x33, 0x88, 0xb1, 0x95, + 0xc3, 0x53, 0xac, 0x8a, 0xef, 0xad, 0x61, 0xc4, + 0x1a, 0x8d, 0x04, 0x69, 0x04, 0x6b, 0x05, 0x77, + 0xd3, 0x5a, 0xed, 0xf7, 0x31, 0xd6, 0xdb, 0x6f, + 0x16, 0xe3, 0x6d, 0x2d, 0xbb, 0x8a, 0xd9, 0xb5, + 0x96, 0x73, 0xca, 0x20, 0x9e, 0x26, 0x39, 0xe1, + 0x98, 0x98, 0xec, 0x20, 0x93, 0x43, 0x4d, 0xe5, + 0xdb, 0xb3, 0xf0, 0x3a, 0xd7, 0x2a, 0x06, 0x71, + 0x80, 0x97, 0x3a, 0x52, 0xd3, 0xb8, 0x3f, 0xf8, + 0x0a, 0x12, 0xd3, 0x6b, 0xef, 0x21, 0x89, 0xb1, + 0xcf, 0x13, 0x66, 0x2d, 0x14, 0x0f, 0xa9, 0x07, + 0xba, 0xb4, 0xe6, 0x3b, 0x4f, 0x79, 0x7b, 0x13, + 0xa0, 0x63, 0x44, 0x11, 0x3f, 0xcb, 0xa1, 0xc4, + 0xe2, 0x3e, 0x6e, 0x9d, 0xc2, 0xb8, 0xed, 0xbc, + 0xd7, 0x67, 0xb2, 0x27, 0x56, 0xb8, 0xcb, 0x86, + 0xb7, 0xb6, 0x58, 0x9b, 0x4d, 0xed, 0x1e, 0x1a, + 0x78, 0x4a, 0x53, 0x65, 0x65, 0xe7, 0x67, 0xbe, + 0x93, 0xe7, 0x3d, 0xa7, 0xbe, 0xe5, 0x9b, 0x39, + 0x9a, 0xdd, 0xab, 0xb9, 0x61, 0xd7, 0x23, 0x70, + 0x8e, 0xe0, 0x6b, 0x94, 0x16, 0x55, 0x9c, 0xcd, + 0x95, 0x89, 0x04, 0x31, 0xb1, 0xe2, 0x5c, 0x35, + 0xc7, 0x88, 0x52, 0x9d, 0xa2, 0x56, 0x89, 0xb3, + 0x2b, 0x89, 0x6f, 0xcd, 0xf8, 0xa4, 0x53, 0x17, + 0x07, 0x8c, 0x3a, 0x43, 0x48, 0xd1, 0xba, 0xad, + 0x38, 0xe6, 0x6d, 0x6f, 0x83, 0x9d, 0x72, 0xd6, + 0x31, 0xe3, 0xd6, 0x66, 0x66, 0xb6, 0xdd, 0x29, + 0x8d, 0xaa, 0xb6, 0x99, 0xd9, 0x94, 0x45, 0x8d, + 0x2e, 0x13, 0x31, 0xac, 0x65, 0x01, 0x3e, 0x35, + 0x5d, 0xa1, 0x4a, 0xe7, 0xee, 0x10, 0x64, 0x2f, + 0x8d, 0xde, 0x53, 0x9a, 0xd8, 0xe9, 0xba, 0x4e, + 0x85, 0x17, 0x1e, 0xd9, 0xce, 0x18, 0x04, 0xd6, + 0xcd, 0x73, 0xf7, 0xda, 0xe2, 0x07, 0x01, 0x0a, + 0x2f, 0x34, 0xce, 0x6e, 0xb3, 0x37, 0x37, 0x9d, + 0xa4, 0x71, 0xb3, 0xc8, 0x8d, 0xb5, 0x2d, 0x15, + 0xdd, 0x35, 0xdd, 0x51, 0x15, 0xb5, 0xb6, 0xc4, + 0xf0, 0x88, 0x5e, 0xd9, 0x30, 0xc4, 0x65, 0xb5, + 0x66, 0xd3, 0x6c, 0xde, 0x31, 0xa7, 0x05, 0xaa, + 0xf8, 0x1b, 0xcd, 0x9f, 0x2e, 0x8b, 0xc6, 0x73, + 0xe2, 0x6b, 0x85, 0x34, 0x9d, 0x14, 0x25, 0x43, + 0xe4, 0x19, 0x2c, 0x37, 0xf0, 0x4b, 0x2d, 0xd3, + 0x5e, 0x1a, 0x0b, 0x5b, 0x1d, 0x09, 0x6e, 0xa1, + 0xe3, 0x6e, 0x2e, 0x4c, 0xaf, 0x68, 0xee, 0xb2, + 0xf8, 0xcc, 0x38, 0x04, 0xd0, 0xd4, 0x96, 0xb1, + 0xc4, 0x87, 0x36, 0xbb, 0x80, 0xef, 0x2e, 0x8b, + 0xcd, 0xad, 0xba, 0x9a, 0x23, 0x14, 0x11, 0x36, + 0x0c, 0x42, 0x85, 0xf5, 0xa9, 0x03, 0x76, 0x8a, + 0x36, 0xde, 0x35, 0x88, 0xf0, 0x99, 0x44, 0xdf, + 0x0d, 0xb6, 0xde, 0xfa, 0xcd, 0xa9, 0x5d, 0xbb, + 0x7d, 0x8e, 0xfd, 0x9a, 0x64, 0x31, 0xe6, 0x59, + 0x84, 0x50, 0x9a, 0xc7, 0x19, 0xc2, 0xd2, 0x4d, + 0x74, 0x07, 0x10, 0xba, 0xdd, 0x9d, 0x60, 0xcf, + 0x5d, 0x97, 0x48, 0x03, 0x62, 0xc2, 0x00, 0x77, + 0xf5, 0xdd, 0xe3, 0x0e, 0xf2, 0xab, 0x65, 0x59, + 0xcc, 0xf9, 0x5b, 0xe4, 0x7c, 0x4c, 0x6c, 0x9c, + 0xe8, 0x00, 0xe3, 0xae, 0x8d, 0x35, 0xdc, 0x2b, + 0x55, 0xee, 0x61, 0x2d, 0xe5, 0xeb, 0xaf, 0x5c, + 0x04, 0x72, 0x9a, 0x10, 0x1b, 0xb8, 0x5a, 0x00, + 0x04, 0x76, 0x55, 0xa7, 0x16, 0xb7, 0x9d, 0xdc, + 0x63, 0x4f, 0x12, 0x3c, 0xc5, 0x69, 0x8e, 0xb1, + 0x4d, 0x63, 0x4b, 0x4f, 0x0d, 0x3c, 0x21, 0x2d, + 0xb5, 0x36, 0x1c, 0xc5, 0xc7, 0xb6, 0x46, 0x29, + 0x1d, 0xc7, 0xed, 0x3b, 0x0f, 0x1a, 0xcf, 0x75, + 0x4c, 0xe6, 0x1a, 0x36, 0x69, 0xff, 0x00, 0x60, + 0xdf, 0xee, 0xaa, 0xed, 0xee, 0xd2, 0x5c, 0x5f, + 0x5a, 0xba, 0xd6, 0x78, 0x22, 0x2c, 0x78, 0x1e, + 0x30, 0xc5, 0x50, 0x46, 0xee, 0xb4, 0x9b, 0x69, + 0x6e, 0xa6, 0xb1, 0x75, 0x8b, 0xa2, 0x60, 0x8d, + 0xcc, 0x0c, 0xc4, 0x31, 0x62, 0xa0, 0xa6, 0x9d, + 0x7d, 0x85, 0x1b, 0x2f, 0x31, 0x58, 0x9f, 0xd5, + 0x98, 0x93, 0x7e, 0x38, 0xb6, 0x59, 0xac, 0xce, + 0x99, 0x62, 0x7e, 0x6b, 0x16, 0xcc, 0x9f, 0xf2, + 0x76, 0x79, 0xcf, 0xf0, 0xa8, 0x3d, 0x96, 0x35, + 0xce, 0x47, 0x99, 0x22, 0xd1, 0x97, 0xed, 0x25, + 0xd5, 0x85, 0xab, 0x6d, 0x59, 0x13, 0x1e, 0xd6, + 0x92, 0x71, 0x12, 0x6b, 0xa4, 0xae, 0x4c, 0xbb, + 0x32, 0x9a, 0xc2, 0xeb, 0xda, 0xa3, 0x68, 0x7b, + 0xf0, 0x91, 0x47, 0x13, 0x4f, 0x1a, 0x95, 0xd4, + 0xa6, 0x29, 0x6f, 0xaf, 0xfd, 0x48, 0xb6, 0x6a, + 0xff, 0x00, 0xb3, 0xff, 0x00, 0xf5, 0xcf, 0xd4, + 0xb0, 0xe7, 0x32, 0xb6, 0x2d, 0xa3, 0xb2, 0x7b, + 0xf4, 0x34, 0x06, 0x8d, 0x3d, 0x92, 0xe6, 0xfc, + 0xab, 0x76, 0xd3, 0xe5, 0xd7, 0x37, 0x91, 0xc3, + 0x25, 0xb3, 0x4c, 0x8e, 0x61, 0x21, 0xcc, 0x07, + 0x71, 0xdb, 0xaa, 0xbd, 0x75, 0x7d, 0x3e, 0x73, + 0x7f, 0x0e, 0x30, 0xc8, 0x64, 0x70, 0x11, 0xb0, + 0x82, 0x43, 0x41, 0xd7, 0x5d, 0x35, 0x53, 0x77, + 0x33, 0xed, 0x36, 0x5d, 0x6a, 0xd6, 0x96, 0xc7, + 0x74, 0x7c, 0x91, 0x24, 0x6d, 0x73, 0x9c, 0x3c, + 0xe1, 0x45, 0x5d, 0xb3, 0x5d, 0x9c, 0x62, 0x27, + 0xde, 0xbc, 0x5a, 0x2f, 0x39, 0x63, 0x49, 0x9a, + 0x4e, 0x9a, 0x6d, 0x8d, 0x78, 0xa4, 0x60, 0xb6, + 0x7d, 0xa6, 0x42, 0xe8, 0x1f, 0xe5, 0xb6, 0x07, + 0xe2, 0xed, 0xb8, 0x39, 0xc7, 0xc2, 0xa8, 0xc1, + 0xda, 0x02, 0xbb, 0x36, 0x49, 0xed, 0xf6, 0x7e, + 0x47, 0xdf, 0x13, 0xcf, 0xf3, 0x52, 0x17, 0x97, + 0x6b, 0xab, 0xcb, 0x88, 0x1d, 0xf5, 0x45, 0xaa, + 0xb6, 0x1f, 0xd6, 0xf8, 0xa9, 0xe6, 0xf4, 0xff, + 0x00, 0x6e, 0x23, 0x5e, 0x15, 0xf0, 0x9f, 0x63, + 0x6e, 0x24, 0xc4, 0xb5, 0x54, 0xa5, 0x4a, 0xea, + 0xcb, 0xa3, 0x6e, 0x24, 0xc4, 0xb5, 0x54, 0xa5, + 0x50, 0x76, 0x65, 0xe4, 0x7b, 0x7d, 0xb7, 0xdb, + 0x47, 0xf5, 0x82, 0xb5, 0xe7, 0x3e, 0xf4, 0x3c, + 0xc1, 0xf2, 0xaa, 0x86, 0x5c, 0x7f, 0xcc, 0x2d, + 0xab, 0xeb, 0xa3, 0xfa, 0xc1, 0x5b, 0xb3, 0x93, + 0xff, 0x00, 0x76, 0x3c, 0xc1, 0xf2, 0xac, 0xfe, + 0x63, 0xc6, 0xad, 0xfe, 0x47, 0xec, 0xbf, 0xc5, + 0xcb, 0x6f, 0xfb, 0x78, 0xbc, 0xf6, 0xf8, 0x54, + 0xf2, 0x81, 0xb7, 0xfd, 0xbc, 0x7e, 0x7b, 0x7c, + 0x2a, 0x79, 0x71, 0x96, 0xc1, 0x45, 0x67, 0x1e, + 0xf5, 0x65, 0xe7, 0xfc, 0xa1, 0x4a, 0xa8, 0xac, + 0xe3, 0xde, 0xac, 0xbc, 0xff, 0x00, 0x94, 0x20, + 0x64, 0xde, 0xf5, 0x7b, 0xe7, 0x9f, 0xac, 0x54, + 0xaa, 0x8a, 0xc9, 0xbd, 0xea, 0xf7, 0xcf, 0x3f, + 0x58, 0xa9, 0x54, 0x04, 0x44, 0x41, 0x91, 0xa8, + 0xaf, 0x87, 0x5e, 0xfb, 0xe5, 0xc7, 0xda, 0xbf, + 0xeb, 0x15, 0xf7, 0x11, 0xa8, 0xaf, 0x87, 0x5e, + 0xfb, 0xe5, 0xc7, 0xda, 0xbf, 0xeb, 0x15, 0x93, + 0xcd, 0xf8, 0x51, 0xf4, 0x1f, 0xdb, 0x7f, 0x7f, + 0x98, 0xf8, 0x63, 0xff, 0x00, 0x36, 0x94, 0x44, + 0x59, 0x1f, 0x48, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x2c, 0xea, 0x00, 0xac, 0x2c, 0x8d, + 0x3a, 0x10, 0xf8, 0x78, 0xcf, 0x87, 0xc5, 0x33, + 0xb2, 0x39, 0x79, 0xbf, 0xcf, 0xed, 0x23, 0x22, + 0xb1, 0xc6, 0x4c, 0xf2, 0xf9, 0xb1, 0xf8, 0xda, + 0x7b, 0x66, 0x81, 0x5e, 0xf6, 0xc7, 0x20, 0xcc, + 0x73, 0xd1, 0x6d, 0x1d, 0xac, 0xb1, 0x47, 0x0c, + 0x25, 0xce, 0x78, 0x90, 0x91, 0x57, 0x1a, 0x00, + 0x74, 0x34, 0xea, 0x15, 0x51, 0x3f, 0x86, 0x76, + 0x00, 0x47, 0x77, 0x98, 0xb8, 0x53, 0x11, 0x10, + 0x46, 0x4e, 0xe8, 0x1e, 0x3b, 0xe9, 0xdd, 0x51, + 0xb9, 0x9e, 0xde, 0x67, 0x8c, 0xcc, 0x6e, 0x59, + 0x69, 0x2b, 0x1b, 0x6e, 0xd9, 0x5c, 0xc8, 0xaa, + 0xc6, 0xbb, 0x40, 0xd1, 0xac, 0x8e, 0xc2, 0xd5, + 0x4d, 0x94, 0xc3, 0xf5, 0xc7, 0xdf, 0x3e, 0xc7, + 0xcf, 0x79, 0x9f, 0x51, 0xe6, 0x3f, 0x99, 0x4c, + 0xf9, 0x59, 0xa7, 0xff, 0x00, 0xa9, 0x11, 0x11, + 0x39, 0x3e, 0xdd, 0xd6, 0xf1, 0xff, 0x00, 0x15, + 0xd3, 0x2e, 0xca, 0x2e, 0x63, 0xd9, 0xc1, 0x94, + 0x5f, 0xbd, 0x92, 0x3f, 0x9a, 0x7c, 0x38, 0x98, + 0x49, 0x05, 0xa6, 0xa1, 0xbe, 0x50, 0x0b, 0xe6, + 0x59, 0x3c, 0x32, 0x5b, 0xed, 0x05, 0xa4, 0x12, + 0x0a, 0x49, 0x0d, 0xdb, 0x23, 0x70, 0x3b, 0xed, + 0x78, 0x0a, 0xdd, 0xb1, 0xbb, 0x5b, 0x98, 0xe6, + 0x39, 0xab, 0xac, 0x73, 0x19, 0x5a, 0xf1, 0x24, + 0x65, 0xd0, 0xd1, 0xa1, 0xbe, 0x33, 0x74, 0x91, + 0xa3, 0xb1, 0xa5, 0x70, 0xe7, 0xf9, 0x78, 0xb2, + 0xdb, 0x9b, 0x49, 0x9a, 0x3f, 0x57, 0x79, 0x34, + 0x33, 0xb6, 0x80, 0xf9, 0x58, 0xc3, 0x5f, 0xdf, + 0x0a, 0x6f, 0xb6, 0xd5, 0xc7, 0x6a, 0x7e, 0xad, + 0xa3, 0xe4, 0xaf, 0x93, 0xee, 0xf9, 0x6f, 0x33, + 0xe6, 0xbc, 0xb6, 0x79, 0xae, 0xec, 0xd8, 0xaf, + 0x93, 0xe9, 0xfb, 0x66, 0xfa, 0x71, 0xd1, 0x6a, + 0xda, 0x7d, 0xa4, 0x6e, 0xcf, 0x8b, 0x77, 0xba, + 0x03, 0x70, 0x2e, 0x4b, 0xc7, 0x8a, 0xec, 0x25, + 0xb8, 0x69, 0xa7, 0x51, 0xae, 0xb5, 0xba, 0x0c, + 0xd1, 0xd9, 0xbe, 0x50, 0x6f, 0x32, 0x77, 0x37, + 0x9d, 0x7b, 0x7f, 0x56, 0xd9, 0x86, 0x80, 0xf1, + 0xf9, 0xae, 0xc2, 0x55, 0x6f, 0xf1, 0x44, 0x8e, + 0x67, 0x2e, 0xdd, 0x18, 0xe5, 0x07, 0x81, 0x8a, + 0x2b, 0x60, 0x73, 0xd7, 0x58, 0xe6, 0x26, 0xc2, + 0x63, 0xff, 0x00, 0x6d, 0x7b, 0x40, 0xda, 0xea, + 0x6c, 0xa3, 0x51, 0xec, 0x62, 0x0a, 0xf3, 0x9b, + 0x4c, 0xdb, 0x67, 0xed, 0xb4, 0x70, 0xe7, 0xc5, + 0x93, 0x1f, 0xf2, 0xea, 0x64, 0xfe, 0x5b, 0x5f, + 0x35, 0x8e, 0x35, 0xcd, 0x49, 0x99, 0xb4, 0x6b, + 0xc2, 0x6b, 0x59, 0xe4, 0x81, 0xcd, 0x6e, 0xaf, + 0xee, 0xaf, 0xe5, 0x93, 0x30, 0x7b, 0x9d, 0x75, + 0x8b, 0x0c, 0xb8, 0x85, 0x28, 0x41, 0xa6, 0x10, + 0x37, 0x00, 0xec, 0x2b, 0xf6, 0x62, 0x4b, 0x7f, + 0x0d, 0xd8, 0xf6, 0xe8, 0x2d, 0xb7, 0x85, 0xc3, + 0xb6, 0xd7, 0xb4, 0x85, 0x17, 0xf8, 0x8b, 0x92, + 0xf3, 0x53, 0xc5, 0x9c, 0xc6, 0x28, 0xd9, 0x69, + 0x1c, 0xf4, 0xf9, 0xc0, 0x78, 0xae, 0x3d, 0xb1, + 0xa1, 0x49, 0x66, 0x67, 0xff, 0x00, 0xf9, 0xcb, + 0x1b, 0xb9, 0xec, 0xf0, 0xe9, 0xfe, 0xdb, 0x4a, + 0xa6, 0x3a, 0x4d, 0x2f, 0x96, 0x3c, 0x74, 0xae, + 0xb1, 0xf0, 0x6d, 0xcf, 0x9b, 0x1f, 0x98, 0xc5, + 0xfc, 0xba, 0xf5, 0x8a, 0xd2, 0x2d, 0x9e, 0xb5, + 0x9a, 0xd7, 0x84, 0x57, 0x4f, 0x18, 0x48, 0xde, + 0xd8, 0x75, 0xe5, 0xae, 0x49, 0x78, 0x00, 0x78, + 0x8a, 0x58, 0xa7, 0x79, 0xfe, 0xae, 0x03, 0x8b, + 0xbf, 0x45, 0xaa, 0xe6, 0xef, 0x9c, 0xdb, 0xdb, + 0x4b, 0x5a, 0xd5, 0xb6, 0xf6, 0x92, 0x12, 0x3f, + 0xac, 0xff, 0x00, 0x1b, 0xc0, 0x16, 0xcd, 0x84, + 0xbd, 0x37, 0x3b, 0x39, 0x6e, 0xd1, 0xa4, 0xc0, + 0x5d, 0x09, 0x1b, 0xb4, 0x69, 0xf1, 0x7b, 0xca, + 0x0b, 0x28, 0xbc, 0x17, 0x9f, 0x88, 0x77, 0x33, + 0x56, 0xa0, 0x09, 0x58, 0xc3, 0xfd, 0x56, 0x34, + 0x30, 0x2b, 0xeb, 0xc3, 0x1c, 0xfe, 0x65, 0xab, + 0xfe, 0x0c, 0x18, 0xf1, 0x4e, 0xff, 0x00, 0x37, + 0x4b, 0x6b, 0xb7, 0xca, 0x62, 0xcd, 0xb3, 0xe3, + 0x79, 0xe1, 0xf3, 0x48, 0x87, 0x34, 0xed, 0xde, + 0x63, 0x6f, 0x5f, 0x1a, 0xe6, 0xc0, 0x46, 0xcf, + 0x3b, 0x0b, 0x1d, 0xe0, 0x0a, 0x1b, 0x61, 0x0b, + 0xec, 0xa2, 0xce, 0x9c, 0xf6, 0x87, 0x3e, 0xde, + 0x16, 0xe2, 0x63, 0xbc, 0x92, 0x63, 0xe7, 0x2a, + 0x1d, 0xd8, 0xaa, 0xd5, 0xb5, 0x77, 0xf3, 0x65, + 0xbb, 0x6b, 0xed, 0xd0, 0x8a, 0xc9, 0x03, 0x61, + 0x7d, 0x35, 0x02, 0x30, 0x00, 0x41, 0xed, 0x8d, + 0x0a, 0x4a, 0xe6, 0xda, 0xee, 0xee, 0x2b, 0x9c, + 0xe7, 0x65, 0x5d, 0x1c, 0xb1, 0x66, 0x6c, 0xc3, + 0x7b, 0x6a, 0x40, 0xc6, 0x1c, 0x2b, 0x8b, 0x0d, + 0x69, 0xa7, 0xc6, 0xd2, 0x15, 0x35, 0xff, 0x00, + 0x73, 0xdf, 0x8e, 0xd7, 0x9d, 0x3f, 0xd3, 0x2d, + 0x5b, 0x27, 0xd2, 0x56, 0xb7, 0xd2, 0xb8, 0xfc, + 0xe6, 0x2c, 0x35, 0x8b, 0xde, 0x74, 0xac, 0x5b, + 0x15, 0xb8, 0xc5, 0xa7, 0xd9, 0x16, 0xa9, 0xd6, + 0xb7, 0x59, 0xde, 0xca, 0xdd, 0xbb, 0x2c, 0x63, + 0x2c, 0xae, 0xed, 0xfd, 0xee, 0xda, 0x16, 0x80, + 0x1f, 0x19, 0x06, 0xb8, 0x0f, 0x64, 0x78, 0x14, + 0x3e, 0xc1, 0xc7, 0x4b, 0xfb, 0xab, 0xc7, 0x7e, + 0xca, 0xda, 0xd5, 0xee, 0x7b, 0xf7, 0x2a, 0xea, + 0x06, 0x8e, 0xed, 0x0a, 0xd7, 0x90, 0x58, 0xed, + 0x6d, 0x8d, 0xd3, 0xc6, 0x5d, 0x69, 0x24, 0x6e, + 0x99, 0xbc, 0xdc, 0xa6, 0xe1, 0x84, 0x46, 0x5a, + 0x0d, 0x74, 0xe3, 0xa0, 0xd0, 0xbb, 0x73, 0x89, + 0xad, 0x76, 0x7b, 0x26, 0x93, 0x23, 0xb6, 0x91, + 0xb2, 0xe6, 0x37, 0xc7, 0x1d, 0xfc, 0x8c, 0xd0, + 0xd6, 0xb4, 0xfe, 0x60, 0xde, 0x1b, 0x81, 0x56, + 0x35, 0xd2, 0x97, 0xb7, 0x0d, 0x91, 0x3a, 0xfe, + 0x2d, 0x13, 0x4a, 0xd3, 0xbd, 0xe4, 0xf0, 0x4d, + 0x32, 0x57, 0xcd, 0x5e, 0xbb, 0x3b, 0x73, 0xba, + 0x69, 0x4f, 0xd7, 0x9b, 0xcf, 0x28, 0x8f, 0x05, + 0x3d, 0xce, 0xc4, 0xe7, 0x3b, 0xe7, 0x57, 0xbe, + 0xbc, 0xac, 0xd4, 0x56, 0xbb, 0x8b, 0x0b, 0x37, + 0x37, 0xbd, 0x11, 0xa0, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0xb2, 0x16, 0x16, 0x42, 0x00, + 0xf2, 0x9b, 0xdc, 0x5f, 0x6d, 0xca, 0xff, 0x00, + 0x93, 0x59, 0x7d, 0x8c, 0x7f, 0x54, 0x2f, 0x89, + 0x01, 0xa5, 0xab, 0xed, 0xb9, 0x60, 0xa6, 0x4f, + 0x66, 0x3f, 0xc1, 0x8f, 0xea, 0x85, 0xa7, 0xca, + 0x7d, 0xd6, 0xf8, 0x3e, 0x7f, 0xfb, 0x8f, 0xf8, + 0x78, 0x3f, 0x6a, 0xff, 0x00, 0xa2, 0xae, 0x91, + 0xad, 0x57, 0x1d, 0xe5, 0x1e, 0xd9, 0x56, 0x31, + 0xad, 0x57, 0x1d, 0xe5, 0x1e, 0xd9, 0x5b, 0x5f, + 0x36, 0xf5, 0x13, 0xf9, 0xb9, 0x58, 0xff, 0x00, + 0x9a, 0xe0, 0x7b, 0xeb, 0x93, 0x6c, 0xed, 0xcb, + 0x2e, 0xe2, 0xbc, 0x03, 0xc4, 0x99, 0x98, 0x0b, + 0xb7, 0x31, 0x37, 0x4f, 0x81, 0x74, 0xae, 0xc6, + 0xc5, 0x06, 0x69, 0x62, 0x72, 0xeb, 0x93, 0xe3, + 0x34, 0x7e, 0xad, 0xdb, 0xa2, 0x9e, 0x49, 0xee, + 0x2b, 0x52, 0xdb, 0x6d, 0xab, 0x96, 0x7a, 0x6f, + 0xa4, 0xd6, 0x14, 0x8c, 0x5c, 0x3b, 0xc9, 0x89, + 0x6e, 0xcc, 0x72, 0xeb, 0xbc, 0xb6, 0x63, 0x0d, + 0xcb, 0x48, 0x1f, 0x99, 0x20, 0xd2, 0xd7, 0x0f, + 0xea, 0x9f, 0x91, 0x72, 0x62, 0xa6, 0x82, 0xb5, + 0xc4, 0xc4, 0xc6, 0xaf, 0x32, 0x6b, 0x31, 0x3a, + 0x4f, 0x0d, 0x1b, 0x71, 0x26, 0x25, 0xab, 0x1a, + 0xce, 0x2f, 0xcb, 0x42, 0x94, 0x36, 0x62, 0x4c, + 0x4b, 0x5e, 0x2f, 0xcb, 0x42, 0x62, 0xfc, 0xb4, + 0x21, 0xab, 0x66, 0x24, 0xc4, 0xb5, 0xe2, 0xfc, + 0xb4, 0x26, 0x2f, 0xcb, 0x42, 0x1a, 0xb6, 0x62, + 0x4c, 0x4b, 0x5e, 0x2f, 0xcb, 0x42, 0x62, 0xfc, + 0xb4, 0x21, 0xab, 0x66, 0x24, 0xc4, 0xb5, 0xe2, + 0xfc, 0xb4, 0x26, 0x2f, 0xcb, 0x42, 0x1a, 0xb6, + 0x62, 0x4c, 0x4b, 0x5e, 0x2f, 0xcb, 0x42, 0x62, + 0xfc, 0xb4, 0x21, 0xab, 0x66, 0x24, 0xc4, 0xb5, + 0xe2, 0xfc, 0xb4, 0x26, 0x2f, 0xcb, 0x42, 0x1a, + 0xb6, 0x62, 0x4c, 0x4b, 0x5e, 0x2f, 0xcb, 0x42, + 0x62, 0xfc, 0xb4, 0x21, 0xab, 0x66, 0x24, 0xc4, + 0xb5, 0xe2, 0xfc, 0xb4, 0x26, 0x2f, 0xcb, 0x42, + 0x1a, 0xb6, 0x62, 0x4c, 0x4b, 0x5e, 0x2f, 0xcb, + 0x42, 0x62, 0xfc, 0xb4, 0x21, 0xab, 0x66, 0x24, + 0xc4, 0xb5, 0xe2, 0xfc, 0xb4, 0x26, 0x2f, 0xcb, + 0x42, 0x1a, 0xb6, 0x62, 0x4c, 0x4b, 0x5e, 0x2f, + 0xcb, 0x42, 0x62, 0xfc, 0xb4, 0x21, 0xab, 0x66, + 0x24, 0xc4, 0xb5, 0xe2, 0xfc, 0xb4, 0x26, 0x2f, + 0xcb, 0x42, 0x1a, 0xb6, 0x62, 0x52, 0x36, 0x3b, + 0x43, 0x98, 0x58, 0x5b, 0xfb, 0x3d, 0xb9, 0x60, + 0x65, 0x4b, 0xaa, 0xe6, 0xd4, 0xd5, 0xca, 0x2b, + 0x17, 0xe5, 0xa1, 0x63, 0x17, 0xe5, 0xa1, 0x44, + 0xc4, 0x4c, 0x69, 0x29, 0xad, 0xa6, 0xb3, 0xad, + 0x67, 0x47, 0x5d, 0xdd, 0xf5, 0xcd, 0xe4, 0xe6, + 0x7b, 0x97, 0xe3, 0x91, 0xda, 0x09, 0xdc, 0x1d, + 0x80, 0x16, 0x9c, 0x4b, 0x5e, 0x2f, 0xcb, 0x42, + 0x62, 0xfc, 0xb4, 0x29, 0x8d, 0x23, 0x84, 0x22, + 0x66, 0x66, 0x66, 0x66, 0x75, 0x99, 0x6c, 0xc4, + 0x98, 0x96, 0xbc, 0x5f, 0x96, 0x84, 0xc5, 0xf9, + 0x68, 0x43, 0x56, 0xcc, 0x49, 0x89, 0x6b, 0xc5, + 0xf9, 0x68, 0x4c, 0x5f, 0x96, 0x84, 0x35, 0x6c, + 0xc4, 0x98, 0x96, 0xbc, 0x5f, 0x96, 0x84, 0xc5, + 0xf9, 0x68, 0x43, 0x56, 0xcc, 0x49, 0x89, 0x6b, + 0xc5, 0xf9, 0x68, 0x4c, 0x5f, 0x96, 0x84, 0x35, + 0x6c, 0xc4, 0x98, 0x96, 0xbc, 0x5f, 0x96, 0x84, + 0xc5, 0xf9, 0x68, 0x43, 0x56, 0xcc, 0x49, 0x89, + 0x6b, 0xc5, 0xf9, 0x68, 0x4c, 0x5f, 0x96, 0x84, + 0x35, 0x6c, 0xc4, 0x98, 0x96, 0xac, 0x6b, 0x75, + 0xa5, 0xb5, 0xcd, 0xe4, 0xc2, 0x0b, 0x58, 0xcc, + 0x92, 0x1d, 0xc1, 0xa8, 0x76, 0x49, 0xdc, 0x09, + 0xae, 0x9e, 0x3e, 0x06, 0x93, 0x6e, 0x11, 0xe2, + 0x96, 0xd9, 0x5b, 0x67, 0x5c, 0x66, 0xd1, 0xbc, + 0x8f, 0x16, 0x00, 0x64, 0x27, 0xb8, 0x43, 0x7b, + 0xea, 0x73, 0x30, 0x90, 0x4b, 0x79, 0x23, 0x86, + 0x90, 0x0d, 0x07, 0x71, 0x7b, 0xb3, 0xb3, 0x8b, + 0x23, 0xcb, 0xf9, 0xa0, 0x43, 0xae, 0xe6, 0xd3, + 0x23, 0x87, 0xe5, 0xa8, 0x2e, 0x4a, 0x9d, 0xd5, + 0x93, 0x25, 0xb7, 0x5b, 0x57, 0xa7, 0xe5, 0xf1, + 0xf6, 0xe9, 0xa7, 0x39, 0xd5, 0x96, 0x3b, 0x0b, + 0xda, 0xef, 0x9a, 0x41, 0x5a, 0x76, 0xca, 0xdd, + 0xce, 0x36, 0xb7, 0xcd, 0xd3, 0x1b, 0x87, 0x36, + 0xe2, 0x35, 0x69, 0xd2, 0x38, 0x56, 0xd5, 0xdd, + 0x6e, 0x2d, 0xef, 0xec, 0xdf, 0x96, 0xdd, 0x79, + 0x2e, 0x14, 0x61, 0xe2, 0xec, 0x85, 0x15, 0x9d, + 0xb6, 0x89, 0xf9, 0xad, 0x96, 0x9b, 0xe9, 0x31, + 0xf2, 0x51, 0x83, 0xb4, 0x26, 0x25, 0xd3, 0x9a, + 0xe5, 0x77, 0x99, 0x64, 0xe6, 0x3b, 0x86, 0x92, + 0xd2, 0x7c, 0x49, 0x40, 0xf1, 0x5c, 0x3b, 0x1b, + 0xcb, 0x8b, 0x17, 0xe4, 0x56, 0xc8, 0x98, 0x9e, + 0x30, 0xf2, 0xed, 0x59, 0xac, 0xe9, 0x31, 0xa6, + 0x9c, 0x1b, 0x31, 0x26, 0x25, 0xaf, 0x17, 0xe5, + 0xa1, 0x31, 0x7e, 0x5a, 0x11, 0x1a, 0xb6, 0x62, + 0x4c, 0x4b, 0x5e, 0x2f, 0xcb, 0x42, 0x62, 0xfc, + 0xb4, 0x21, 0xab, 0x66, 0x24, 0xc4, 0xb5, 0xe2, + 0xfc, 0xb4, 0x26, 0x2f, 0xcb, 0x42, 0x1a, 0xb6, + 0x62, 0x4c, 0x4b, 0x5e, 0x2f, 0xcb, 0x42, 0x62, + 0xfc, 0xb4, 0x21, 0xab, 0x66, 0x24, 0xc4, 0xb5, + 0xe2, 0xfc, 0xb4, 0x26, 0x2f, 0xcb, 0x42, 0x1a, + 0xb6, 0x62, 0x4c, 0x4b, 0x5e, 0x2f, 0xcb, 0x42, + 0x62, 0xfc, 0xb4, 0x21, 0xab, 0x66, 0x24, 0xc4, + 0xb5, 0xe2, 0xfc, 0xb4, 0x26, 0x2f, 0xcb, 0x42, + 0x1a, 0xb6, 0x62, 0x4c, 0x4b, 0x5e, 0x2f, 0xcb, + 0x42, 0x62, 0xfc, 0xb4, 0x21, 0xab, 0x66, 0x24, + 0xc4, 0xb5, 0xe2, 0xfc, 0xb4, 0x26, 0x2f, 0xcb, + 0x42, 0x1a, 0xb6, 0x62, 0x4c, 0x4b, 0x5e, 0x2f, + 0xcb, 0x42, 0x62, 0xfc, 0xb4, 0x21, 0xab, 0x66, + 0x24, 0xc4, 0xb5, 0xe2, 0xfc, 0xb4, 0x26, 0x2f, + 0xcb, 0x42, 0x1a, 0xb6, 0x62, 0x4c, 0x4b, 0x5e, + 0x2f, 0xcb, 0x42, 0x62, 0xfc, 0xb4, 0x21, 0xab, + 0x66, 0x24, 0xc4, 0xb5, 0xe2, 0xfc, 0xb4, 0x26, + 0x2f, 0xcb, 0x42, 0x1a, 0xb6, 0x62, 0x4c, 0x4b, + 0x5e, 0x2f, 0xcb, 0x42, 0x62, 0xfc, 0xb4, 0x21, + 0xab, 0x66, 0x24, 0xc4, 0xb5, 0xe2, 0xfc, 0xb4, + 0x26, 0x2f, 0xcb, 0x42, 0x1a, 0xb6, 0x62, 0x4c, + 0x4b, 0x5e, 0x2f, 0xcb, 0x42, 0x62, 0xfc, 0xb4, + 0x21, 0xab, 0x66, 0x24, 0xc4, 0xb5, 0xe2, 0xfc, + 0xb4, 0x26, 0x2f, 0xcb, 0x42, 0x1a, 0xb6, 0x62, + 0x4c, 0x4b, 0x5e, 0x2f, 0xcb, 0x42, 0x62, 0xfc, + 0xb4, 0x20, 0xd8, 0x1e, 0x41, 0xa8, 0x34, 0x53, + 0x36, 0xfb, 0x5d, 0x9a, 0xc3, 0x18, 0x63, 0xb0, + 0x4b, 0x41, 0x40, 0xe7, 0x0d, 0x34, 0xec, 0xd0, + 0xe9, 0x50, 0x38, 0xbf, 0x2d, 0x0b, 0x38, 0xbf, + 0x2d, 0x0a, 0xb3, 0x58, 0x9f, 0x1e, 0x2b, 0x52, + 0xf6, 0xa7, 0xdb, 0x64, 0x96, 0x61, 0x9e, 0xe6, + 0x19, 0x88, 0x0d, 0xb8, 0x78, 0xe6, 0x86, 0x9e, + 0x69, 0xa3, 0x08, 0x27, 0xb2, 0xb8, 0x71, 0x2d, + 0x78, 0xbf, 0x2d, 0x09, 0x8b, 0xf2, 0xd0, 0xa6, + 0x22, 0x23, 0xc2, 0x34, 0x45, 0xad, 0x36, 0x9d, + 0xd3, 0x3a, 0xcb, 0x66, 0x24, 0xc4, 0xb5, 0xe2, + 0xfc, 0xb4, 0x26, 0x25, 0x28, 0xd5, 0xb3, 0x12, + 0x62, 0x5a, 0xf1, 0x2f, 0x76, 0xf0, 0x4f, 0x75, + 0x28, 0x86, 0xde, 0x33, 0x2c, 0xa4, 0xe8, 0x0d, + 0xf9, 0x6b, 0x4a, 0x28, 0x9e, 0x69, 0x88, 0xd6, + 0x74, 0x84, 0x9e, 0xce, 0xdb, 0x3a, 0xeb, 0x37, + 0x85, 0xa0, 0x55, 0xb1, 0x1e, 0x75, 0xfd, 0x80, + 0xdd, 0x5d, 0xf5, 0x63, 0xcc, 0xe4, 0xe7, 0x2f, + 0x1f, 0x4f, 0xcd, 0xa3, 0x78, 0x13, 0x2d, 0xb1, + 0x66, 0x45, 0x60, 0xe2, 0xe2, 0x1f, 0x79, 0x37, + 0x94, 0x75, 0xd0, 0xef, 0x0e, 0xc0, 0x5c, 0xa4, + 0x92, 0x49, 0x3a, 0x49, 0x3a, 0x56, 0x6c, 0xb6, + 0xdd, 0x3f, 0x0f, 0x07, 0xa3, 0xe5, 0xb1, 0x6c, + 0xc7, 0xc7, 0x85, 0xad, 0x3a, 0xb6, 0x5b, 0xfe, + 0xde, 0x3f, 0x3d, 0xbe, 0x15, 0x3c, 0xa0, 0x6d, + 0xff, 0x00, 0x6f, 0x1f, 0x9e, 0xdf, 0x0a, 0x9e, + 0x5c, 0xdd, 0xc5, 0x15, 0x9c, 0x7b, 0xd5, 0x97, + 0x9f, 0xf2, 0x85, 0x2a, 0xa2, 0xb3, 0x8f, 0x7a, + 0xb2, 0xf3, 0xfe, 0x50, 0x81, 0x93, 0x7b, 0xcd, + 0xef, 0xda, 0x1f, 0xac, 0x54, 0xad, 0x54, 0x56, + 0x51, 0xef, 0x37, 0xbf, 0x68, 0x7e, 0xb1, 0x52, + 0x94, 0x41, 0x9a, 0xa5, 0x56, 0x28, 0x94, 0x41, + 0xe8, 0x6a, 0x2b, 0xe1, 0xd7, 0xbe, 0xf9, 0x71, + 0xf6, 0xaf, 0xfa, 0xc5, 0x7d, 0xc5, 0xbe, 0x49, + 0x5f, 0x0e, 0xbd, 0xf7, 0xcb, 0x8f, 0xb5, 0x7f, + 0xd6, 0x2b, 0x27, 0x9b, 0xf0, 0xa3, 0xe8, 0x3f, + 0xb6, 0xfe, 0xff, 0x00, 0x31, 0xf0, 0xc7, 0xfe, + 0x6d, 0x28, 0x88, 0xb2, 0x3e, 0x90, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x45, 0x9d, 0x47, 0x4a, 0x68, 0xde, 0x43, 0x58, + 0x8f, 0x19, 0xd1, 0x84, 0x4a, 0x8d, 0xe4, 0x43, + 0x58, 0xf6, 0x71, 0x16, 0x69, 0xa2, 0xab, 0x08, + 0xa0, 0xfc, 0x35, 0x77, 0xda, 0x67, 0x99, 0xcd, + 0x9c, 0x02, 0xda, 0xd6, 0xf2, 0x48, 0x2d, 0xc5, + 0x69, 0x1b, 0x48, 0x03, 0xc6, 0xd7, 0xb8, 0xb8, + 0x49, 0xa9, 0x25, 0x62, 0xa9, 0x55, 0x33, 0x33, + 0x3e, 0xd5, 0x2b, 0x87, 0x1d, 0x26, 0x76, 0xd2, + 0x2b, 0xbf, 0x8d, 0xad, 0x1e, 0x33, 0x2d, 0xd6, + 0xd7, 0x57, 0x16, 0xb3, 0xb2, 0xe2, 0xda, 0x43, + 0x0c, 0xd1, 0x9a, 0xb1, 0xed, 0xd6, 0x2a, 0x29, + 0xa1, 0x74, 0xdc, 0xe7, 0x99, 0xad, 0xdc, 0xb1, + 0x4d, 0x73, 0x75, 0x24, 0xd2, 0xdb, 0xb8, 0xbe, + 0x07, 0xba, 0x84, 0xb1, 0xc6, 0x86, 0xad, 0xd1, + 0xd8, 0x0b, 0x81, 0x67, 0x4a, 0x6e, 0xb6, 0x9a, + 0x6b, 0xc0, 0x9c, 0x54, 0xb5, 0xa2, 0xf6, 0xa5, + 0x66, 0xd1, 0xc3, 0x74, 0xc6, 0xb3, 0xa4, 0xba, + 0xef, 0xb3, 0x7c, 0xcf, 0x31, 0x6b, 0x05, 0xfd, + 0xcb, 0xee, 0x79, 0xb2, 0x4b, 0x39, 0xca, 0x1c, + 0x35, 0xd7, 0x4a, 0x0e, 0xc2, 0xe5, 0x0e, 0xa1, + 0x04, 0x68, 0x20, 0xd4, 0x1d, 0xda, 0x8d, 0x2b, + 0x07, 0x4a, 0xc2, 0x4c, 0xcc, 0xf1, 0x99, 0x4d, + 0x31, 0xd6, 0x95, 0xd9, 0x5a, 0xd6, 0x29, 0xe1, + 0xb6, 0x23, 0x48, 0x48, 0xdc, 0x6d, 0x06, 0x75, + 0x75, 0x0b, 0xad, 0xee, 0xef, 0x65, 0x9e, 0x07, + 0xd3, 0x14, 0x6f, 0x20, 0xb7, 0x41, 0xa8, 0xdc, + 0x5e, 0x5f, 0x9d, 0xe6, 0x92, 0x59, 0xfb, 0x04, + 0x97, 0x52, 0x3a, 0xcc, 0x00, 0xd1, 0x01, 0xa6, + 0x10, 0x06, 0xa1, 0xa9, 0x70, 0x57, 0x71, 0x66, + 0xa6, 0x94, 0x53, 0xbe, 0xde, 0x3a, 0xce, 0xb3, + 0xc3, 0xf0, 0x73, 0xaf, 0x96, 0xc3, 0x5d, 0x22, + 0x31, 0xd3, 0x6d, 0x67, 0x7d, 0x7e, 0x9f, 0x0b, + 0x73, 0x76, 0xd9, 0x67, 0x59, 0xb6, 0x5f, 0x19, + 0x8a, 0xc2, 0xee, 0x4b, 0x66, 0x38, 0xe2, 0x73, + 0x59, 0x40, 0x0b, 0xb5, 0x57, 0x52, 0xd5, 0x6f, + 0x98, 0x5e, 0xda, 0x5c, 0x1b, 0xab, 0x59, 0xdd, + 0x0d, 0xc9, 0xc5, 0x8a, 0x56, 0xd2, 0xa7, 0x17, + 0x94, 0xb9, 0xc0, 0xd0, 0x49, 0xd5, 0xbf, 0xb8, + 0x9e, 0x2e, 0xba, 0x8e, 0x14, 0xdd, 0x6d, 0x3c, + 0x67, 0x4a, 0x78, 0x27, 0xb5, 0x8b, 0xeb, 0xfa, + 0x2b, 0xae, 0x5a, 0xe9, 0x7e, 0x1a, 0x6b, 0x10, + 0xdf, 0x75, 0x7b, 0x79, 0x7f, 0x39, 0xb8, 0xbb, + 0x99, 0xd3, 0xcc, 0x40, 0x05, 0xef, 0xd7, 0x41, + 0xab, 0x52, 0xf7, 0x61, 0x99, 0xdf, 0x65, 0xb2, + 0x99, 0x6c, 0xa7, 0x7c, 0x12, 0x1d, 0x04, 0xb4, + 0xe8, 0x23, 0xfa, 0xc3, 0x75, 0x73, 0x55, 0xa6, + 0x9a, 0x40, 0x25, 0x60, 0x16, 0xe9, 0xae, 0xb0, + 0x91, 0x36, 0x89, 0xdd, 0xac, 0xea, 0x4e, 0x3c, + 0x53, 0x58, 0xa6, 0xda, 0xcd, 0x74, 0xd2, 0x22, + 0x78, 0xd7, 0x4d, 0x3a, 0x7d, 0x89, 0xdb, 0x8d, + 0xb4, 0xda, 0x5b, 0x88, 0x8c, 0x46, 0xf3, 0x08, + 0x3a, 0xcc, 0x6c, 0x6b, 0x1d, 0xca, 0x02, 0xaa, + 0x09, 0xce, 0x2e, 0x24, 0xb8, 0x92, 0xe2, 0x6a, + 0xe2, 0x74, 0xd4, 0xa1, 0x26, 0xa9, 0xe0, 0x09, + 0x37, 0xb5, 0xbe, 0xe9, 0x9b, 0x23, 0x0f, 0x97, + 0xc3, 0x8b, 0xf8, 0x58, 0xeb, 0x8f, 0x5f, 0x1d, + 0xb1, 0xe2, 0xc2, 0x2c, 0xd4, 0x6f, 0x27, 0x6d, + 0x47, 0x1e, 0x4e, 0xd1, 0x31, 0x3e, 0x13, 0x12, + 0xc2, 0x2c, 0xd4, 0x6f, 0x2c, 0x1a, 0x6e, 0x21, + 0xac, 0x7b, 0x27, 0xc0, 0x44, 0x0b, 0x3a, 0x37, + 0x42, 0x1a, 0xc7, 0x3d, 0x18, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x59, + 0x1a, 0xd6, 0x16, 0x46, 0xb4, 0x19, 0x1a, 0xc2, + 0xfb, 0x6e, 0x5c, 0x29, 0x94, 0x5a, 0x7d, 0x8c, + 0x7f, 0x54, 0x2f, 0x89, 0x0d, 0x61, 0x7d, 0xb7, + 0x2f, 0xd1, 0x94, 0xda, 0x7d, 0x8c, 0x7f, 0x54, + 0x2d, 0x3e, 0x4f, 0xee, 0xb3, 0xe7, 0xff, 0x00, + 0xb8, 0xfe, 0xcc, 0x1f, 0xb5, 0x7f, 0xd1, 0x56, + 0xf0, 0x74, 0xaa, 0xf3, 0xbc, 0xa3, 0xdb, 0x2a, + 0xc1, 0x4d, 0x2a, 0xbe, 0xef, 0x28, 0xf6, 0xca, + 0xda, 0xf9, 0xb6, 0x17, 0xa8, 0x49, 0x13, 0xc6, + 0x6b, 0xa9, 0xcd, 0xec, 0x6e, 0xaf, 0x2b, 0xd4, + 0x5f, 0xb5, 0x67, 0x9c, 0xdf, 0x08, 0x43, 0xde, + 0xec, 0xce, 0x73, 0x6b, 0x3b, 0x6b, 0x96, 0xd9, + 0x5f, 0x5b, 0xf3, 0xf0, 0x48, 0xcc, 0x44, 0x80, + 0x1d, 0x4a, 0x92, 0x34, 0xb4, 0xf6, 0x94, 0x51, + 0xb1, 0xd8, 0xab, 0x8f, 0x19, 0xb2, 0x98, 0x2b, + 0xf9, 0x81, 0xce, 0x6d, 0x3f, 0xb2, 0x42, 0xf3, + 0xb6, 0x3f, 0xcc, 0xe2, 0xfb, 0x21, 0xf5, 0x9c, + 0xa0, 0x54, 0xee, 0x95, 0x6d, 0x4a, 0xdb, 0xc6, + 0xb1, 0x2b, 0x07, 0x54, 0x6c, 0x87, 0x4c, 0x77, + 0x2c, 0xfa, 0x29, 0xd5, 0x1b, 0x21, 0xd2, 0xdd, + 0xcb, 0xfd, 0x15, 0x5f, 0x45, 0x3b, 0xed, 0xcd, + 0x5e, 0xc6, 0x3e, 0x88, 0x58, 0x3a, 0xa3, 0x64, + 0x3a, 0x5b, 0xb9, 0x7f, 0xa2, 0x9d, 0x51, 0xb2, + 0x1d, 0x2d, 0xdc, 0xbf, 0xd1, 0x55, 0xf4, 0x4d, + 0xf6, 0xe6, 0x76, 0x71, 0xf4, 0x42, 0xc1, 0xd5, + 0x1b, 0x21, 0xd2, 0xdd, 0xcb, 0xfd, 0x14, 0xea, + 0x8d, 0x90, 0xe9, 0x6e, 0xe5, 0xfe, 0x8a, 0xaf, + 0xa2, 0x6f, 0xb7, 0x33, 0xb3, 0x8f, 0xa2, 0x16, + 0x0e, 0xa8, 0xd9, 0x0e, 0x96, 0xee, 0x5f, 0xe8, + 0xa7, 0x54, 0x6c, 0x87, 0x4b, 0x77, 0x2f, 0xf4, + 0x55, 0x7d, 0x37, 0xf7, 0xd3, 0x7d, 0xb9, 0x9d, + 0x9c, 0x7d, 0x10, 0xb0, 0x75, 0x46, 0xc8, 0x74, + 0xb7, 0x72, 0xff, 0x00, 0x45, 0x3a, 0xa3, 0x64, + 0x3a, 0x5b, 0xb9, 0x7f, 0xa2, 0xa0, 0x9d, 0x0c, + 0xcd, 0x8d, 0xb2, 0xb9, 0x8e, 0x11, 0x38, 0xd1, + 0xaf, 0x20, 0xd0, 0xf7, 0x56, 0x21, 0x86, 0x79, + 0x8e, 0x18, 0x98, 0xe9, 0x1d, 0x4a, 0x90, 0xd1, + 0x5d, 0x1a, 0xea, 0x9b, 0xed, 0xcc, 0xec, 0xe3, + 0xe8, 0x84, 0xf7, 0x54, 0x6c, 0x87, 0x4b, 0x77, + 0x2f, 0xf4, 0x53, 0xaa, 0x36, 0x43, 0xa5, 0xbb, + 0x97, 0xfa, 0x2a, 0xbf, 0xc3, 0xdd, 0x44, 0xdf, + 0x6e, 0x67, 0x67, 0x1f, 0x44, 0x2c, 0x1d, 0x51, + 0xb2, 0x1d, 0x2d, 0xdc, 0xbf, 0xd1, 0x4e, 0xa8, + 0xd9, 0x0e, 0x96, 0xee, 0x5f, 0xe8, 0xaa, 0xfa, + 0xcb, 0x5a, 0xe2, 0x09, 0xa1, 0x20, 0x6b, 0x23, + 0x50, 0xed, 0xa6, 0xfb, 0x73, 0x3b, 0x38, 0xfa, + 0x21, 0x3f, 0xd5, 0x1b, 0x21, 0xd2, 0xdd, 0xcb, + 0xfd, 0x14, 0xea, 0x8d, 0x90, 0xe9, 0x6e, 0xe5, + 0xfe, 0x8a, 0xaf, 0xfe, 0x5d, 0xa4, 0x4d, 0xf6, + 0xe6, 0x76, 0x71, 0xf4, 0x42, 0xc1, 0xd5, 0x1b, + 0x21, 0xd2, 0xdd, 0xcb, 0xfd, 0x14, 0xea, 0x8d, + 0x90, 0xe9, 0x6e, 0xe5, 0xfe, 0x8a, 0xaf, 0xa6, + 0xfe, 0x9d, 0x49, 0xbe, 0xdc, 0xce, 0xce, 0x3e, + 0x88, 0x58, 0x3a, 0xa3, 0x64, 0x3a, 0x5b, 0xb9, + 0x7f, 0xa2, 0x9d, 0x51, 0xb2, 0x1d, 0x2d, 0xdc, + 0xbf, 0xd1, 0x50, 0x0f, 0x64, 0x8c, 0x34, 0x70, + 0x2d, 0x34, 0xaf, 0x8c, 0x08, 0xd1, 0xbf, 0xa5, + 0x61, 0x37, 0xdb, 0x99, 0xd9, 0xc7, 0xd1, 0x0b, + 0x07, 0x54, 0x6c, 0x87, 0x4b, 0x77, 0x2f, 0xf4, + 0x53, 0xaa, 0x36, 0x43, 0xa5, 0xbb, 0x97, 0xfa, + 0x2a, 0x11, 0x96, 0xb7, 0x52, 0x47, 0xce, 0x47, + 0x13, 0xdd, 0x1e, 0xb2, 0xf0, 0x09, 0x1a, 0x3b, + 0x2b, 0x51, 0xd1, 0xbb, 0xd9, 0xec, 0xa6, 0xfb, + 0x73, 0x3b, 0x38, 0xfa, 0x21, 0x60, 0xea, 0x8d, + 0x90, 0xe9, 0x6e, 0xe5, 0xfe, 0x8a, 0x75, 0x46, + 0xc8, 0x74, 0xb7, 0x72, 0xff, 0x00, 0x45, 0x42, + 0x3a, 0xd2, 0xe9, 0xb1, 0x73, 0xa6, 0x27, 0x88, + 0xe8, 0x1c, 0x5e, 0x5a, 0x69, 0x43, 0xab, 0x4a, + 0xcb, 0x2c, 0xaf, 0x24, 0x60, 0x7c, 0x70, 0xc8, + 0xf6, 0x3b, 0x4b, 0x5c, 0xd6, 0x92, 0x0e, 0xe2, + 0x6f, 0xb7, 0x33, 0xb3, 0x8f, 0xa2, 0x13, 0x5d, + 0x51, 0xb2, 0x1d, 0x2d, 0xdc, 0xbf, 0xd1, 0x4e, + 0xa8, 0xd9, 0x0e, 0x96, 0xee, 0x5f, 0xe8, 0xa8, + 0x39, 0x6d, 0xee, 0x21, 0xfd, 0xb4, 0x6e, 0x8e, + 0xba, 0xb1, 0x82, 0xd1, 0xc2, 0xb5, 0xa6, 0xfb, + 0x73, 0x3b, 0x38, 0xfa, 0x21, 0x60, 0xea, 0x8d, + 0x90, 0xe9, 0x6e, 0xe5, 0xfe, 0x8a, 0x75, 0x46, + 0xc8, 0x74, 0xb7, 0x72, 0xff, 0x00, 0x45, 0x41, + 0xc5, 0x6b, 0x75, 0x30, 0x2e, 0x8a, 0x27, 0xc8, + 0xd0, 0x68, 0x4b, 0x5a, 0x4e, 0x9e, 0xe2, 0xf6, + 0x72, 0xfb, 0xf0, 0x2a, 0x6d, 0xe5, 0x00, 0x6b, + 0x25, 0xa5, 0x37, 0xdb, 0x99, 0xd9, 0xc7, 0xd1, + 0x09, 0x9e, 0xa8, 0xd9, 0x0e, 0x96, 0xee, 0x5f, + 0xe8, 0xa7, 0x54, 0x6c, 0x87, 0x4b, 0x77, 0x2f, + 0xf4, 0x54, 0x11, 0x86, 0x66, 0xc4, 0xd9, 0x5c, + 0xc7, 0x08, 0xdf, 0xa1, 0xaf, 0x23, 0x41, 0x3b, + 0xab, 0xc2, 0x6f, 0xb7, 0x33, 0xb3, 0x8f, 0xa2, + 0x16, 0x0e, 0xa8, 0xd9, 0x0e, 0x96, 0xee, 0x5f, + 0xe8, 0xa7, 0x54, 0x6c, 0x87, 0x4b, 0x77, 0x2f, + 0xf4, 0x55, 0x7d, 0x13, 0x7d, 0xb9, 0x9d, 0x9c, + 0x7d, 0x10, 0xb0, 0x75, 0x46, 0xc8, 0x74, 0xb7, + 0x72, 0xff, 0x00, 0x45, 0x3a, 0xa3, 0x64, 0x3a, + 0x5b, 0xb9, 0x7f, 0xa2, 0xa0, 0xa2, 0x86, 0x69, + 0x89, 0x6c, 0x4c, 0x74, 0x84, 0x0a, 0x90, 0xd1, + 0x5a, 0x0e, 0xcf, 0x0a, 0xf0, 0x9b, 0xed, 0xcc, + 0xec, 0xe3, 0xe8, 0x85, 0x83, 0xaa, 0x36, 0x43, + 0xa5, 0xbb, 0x97, 0xfa, 0x29, 0xd5, 0x1b, 0x21, + 0xd2, 0xdd, 0xcb, 0xfd, 0x15, 0x5f, 0x44, 0xdf, + 0x6e, 0x67, 0x67, 0x1f, 0x44, 0x2c, 0x1d, 0x51, + 0xb2, 0x1d, 0x2d, 0xdc, 0xbf, 0xd1, 0x4e, 0xa8, + 0xd9, 0x0e, 0x96, 0xee, 0x5f, 0xe8, 0xaa, 0xfa, + 0x26, 0xfb, 0x73, 0x3b, 0x38, 0xfa, 0x21, 0x60, + 0xea, 0x8d, 0x90, 0xe9, 0x6e, 0xe5, 0xfe, 0x8a, + 0x75, 0x46, 0xc8, 0x74, 0xb7, 0x72, 0xff, 0x00, + 0x45, 0x57, 0xd1, 0x37, 0xdb, 0x99, 0xd9, 0xc7, + 0xd1, 0x0b, 0x07, 0x54, 0x6c, 0x87, 0x4b, 0x77, + 0x2f, 0xf4, 0x53, 0xaa, 0x36, 0x43, 0xa5, 0xbb, + 0x97, 0xfa, 0x2a, 0xbe, 0x89, 0xbe, 0xdc, 0xce, + 0xce, 0x3e, 0x88, 0x58, 0x46, 0x5d, 0xb1, 0xb1, + 0xf8, 0xcf, 0xb8, 0x74, 0x83, 0x7b, 0x1b, 0x8f, + 0xd5, 0x0b, 0xbb, 0x2b, 0xce, 0x32, 0xb1, 0x7b, + 0x16, 0x5f, 0x96, 0x5b, 0x73, 0x71, 0xc8, 0x4e, + 0x27, 0xd0, 0x37, 0x53, 0x49, 0xae, 0xf9, 0x55, + 0x05, 0x29, 0xb3, 0x5f, 0xce, 0xed, 0xbf, 0xb5, + 0xf5, 0x0a, 0x89, 0x99, 0x9f, 0x6c, 0xa6, 0xb8, + 0xeb, 0x5f, 0xb6, 0xb1, 0x09, 0xbc, 0xc6, 0xa6, + 0xf6, 0x5a, 0x9a, 0xd0, 0xd0, 0x76, 0xa8, 0x34, + 0x2e, 0x75, 0xd1, 0x98, 0x7b, 0xec, 0xbe, 0x77, + 0xc8, 0x17, 0x3a, 0x85, 0xc5, 0x96, 0x12, 0x1e, + 0x08, 0x34, 0x20, 0x82, 0x38, 0x56, 0x11, 0xbe, + 0x50, 0xfc, 0xb7, 0x50, 0x48, 0x67, 0x59, 0xb5, + 0xad, 0x9c, 0xb1, 0xdb, 0x5e, 0x41, 0xcf, 0xc1, + 0x3b, 0x31, 0x3b, 0x51, 0xa5, 0x0d, 0x35, 0x15, + 0x10, 0x6c, 0xf6, 0x2e, 0xe4, 0x97, 0x36, 0x57, + 0x40, 0x75, 0x96, 0xe2, 0x73, 0x69, 0xd8, 0xd3, + 0x50, 0xbd, 0x6d, 0x9f, 0xbc, 0x5b, 0x7d, 0x91, + 0xf0, 0xaa, 0xea, 0x98, 0x99, 0x8f, 0x6a, 0xb6, + 0xa5, 0x6d, 0xe3, 0x10, 0xb0, 0x75, 0x46, 0xc8, + 0x74, 0xb7, 0x72, 0xff, 0x00, 0x45, 0x3a, 0xa3, + 0x64, 0x3a, 0x5b, 0xb9, 0x7f, 0xa2, 0xab, 0xe8, + 0xa7, 0x7d, 0xb9, 0xab, 0xd9, 0xc7, 0xd1, 0x0b, + 0x07, 0x54, 0x6c, 0x87, 0x4b, 0x77, 0x2f, 0xf4, + 0x53, 0xaa, 0x36, 0x43, 0xa5, 0xbb, 0x97, 0xfa, + 0x2a, 0xbe, 0x89, 0xbe, 0xdc, 0xce, 0xce, 0x3e, + 0x88, 0x58, 0x3a, 0xa3, 0x64, 0x3a, 0x5b, 0xb9, + 0x7f, 0xa2, 0x9d, 0x51, 0xb2, 0x1d, 0x2d, 0xdc, + 0xbf, 0xd1, 0x55, 0xf4, 0x4d, 0xf6, 0xe6, 0x76, + 0x71, 0xf4, 0x42, 0xc1, 0xd5, 0x1b, 0x21, 0xd2, + 0xdd, 0xcb, 0xfd, 0x14, 0xea, 0x8d, 0x90, 0xe9, + 0x6e, 0xe5, 0xfe, 0x8a, 0xaf, 0xa2, 0x6f, 0xb7, + 0x33, 0xb3, 0x8f, 0xa2, 0x16, 0x0e, 0xa8, 0xd9, + 0x0e, 0x96, 0xee, 0x5f, 0xe8, 0xa7, 0x54, 0x6c, + 0x87, 0x4b, 0x77, 0x2f, 0xf4, 0x55, 0x7d, 0x13, + 0x7d, 0xb9, 0x9d, 0x9c, 0x7d, 0x10, 0xb0, 0x75, + 0x46, 0xc8, 0x74, 0xb7, 0x72, 0xff, 0x00, 0x45, + 0x3a, 0xa3, 0x64, 0x3a, 0x5b, 0xb9, 0x7f, 0xa2, + 0xab, 0xe8, 0x9b, 0xed, 0xcc, 0xec, 0xe3, 0xe8, + 0x85, 0x83, 0xaa, 0x36, 0x43, 0xa5, 0xbb, 0x97, + 0xfa, 0x29, 0xd5, 0x1b, 0x21, 0xd2, 0xdd, 0xcb, + 0xfd, 0x15, 0x5f, 0x44, 0xdf, 0x6e, 0x67, 0x67, + 0x1f, 0x44, 0x2c, 0x1d, 0x51, 0xb2, 0x1d, 0x2d, + 0xdc, 0xbf, 0xd1, 0x4e, 0xa8, 0xd9, 0x0e, 0x96, + 0xee, 0x5f, 0xe8, 0xaa, 0xfa, 0x26, 0xfb, 0x73, + 0x3b, 0x38, 0xfa, 0x21, 0x60, 0xea, 0x8d, 0x90, + 0xe9, 0x6e, 0xe5, 0xfe, 0x8a, 0x75, 0x46, 0xc8, + 0x74, 0xb7, 0x72, 0xff, 0x00, 0x45, 0x57, 0xd1, + 0x37, 0xdb, 0x99, 0xd9, 0xc7, 0xd1, 0x0b, 0x07, + 0x54, 0x6c, 0x87, 0x4b, 0x77, 0x2f, 0xf4, 0x53, + 0xaa, 0x36, 0x43, 0xa5, 0xbb, 0x97, 0xfa, 0x2a, + 0xbe, 0x89, 0xbe, 0xdc, 0xce, 0xce, 0x3e, 0x88, + 0x58, 0x3a, 0xa3, 0x64, 0x3a, 0x5b, 0xb9, 0x7f, + 0xa2, 0x9d, 0x51, 0xb2, 0x1d, 0x2d, 0xdc, 0xbf, + 0xd1, 0x55, 0xf4, 0x4d, 0xf6, 0xe6, 0x76, 0x71, + 0xf4, 0x42, 0xc1, 0xd5, 0x1b, 0x21, 0xd2, 0xdd, + 0xcb, 0xfd, 0x14, 0xea, 0x8d, 0x90, 0xe9, 0x6e, + 0xe5, 0xfe, 0x8a, 0xaf, 0xa2, 0x6f, 0xb7, 0x33, + 0xb3, 0x8f, 0xa2, 0x16, 0x0e, 0xa8, 0xd9, 0x0e, + 0x96, 0xee, 0x5f, 0xe8, 0xa7, 0x54, 0x6c, 0x87, + 0x4b, 0x77, 0x2f, 0xf4, 0x55, 0x7d, 0x13, 0x7d, + 0xb9, 0x9d, 0x9c, 0x7d, 0x10, 0xb0, 0x75, 0x46, + 0xc8, 0x74, 0xb7, 0x72, 0xff, 0x00, 0x45, 0x3a, + 0xa3, 0x64, 0x3a, 0x5b, 0xb9, 0x7f, 0xa2, 0xab, + 0xe8, 0x9b, 0xed, 0xcc, 0xec, 0xe3, 0xe8, 0x85, + 0x83, 0xaa, 0x36, 0x43, 0xa5, 0xbb, 0x97, 0xfa, + 0x29, 0xd5, 0x1b, 0x21, 0xd2, 0xdd, 0xcb, 0xfd, + 0x15, 0x5f, 0x44, 0xdf, 0x6e, 0x67, 0x67, 0x1f, + 0x44, 0x2c, 0x1d, 0x51, 0xb2, 0x1d, 0x2d, 0xdc, + 0xbf, 0xd1, 0x4e, 0xa8, 0xd9, 0x0e, 0x96, 0xee, + 0x5f, 0xe8, 0xaa, 0xfa, 0x26, 0xfb, 0x73, 0x3b, + 0x38, 0xfa, 0x21, 0x60, 0xea, 0x8d, 0x90, 0xe9, + 0x6e, 0xe5, 0xfe, 0x8a, 0x75, 0x46, 0xc8, 0x74, + 0xb7, 0x72, 0xff, 0x00, 0x45, 0x57, 0xd1, 0x37, + 0xdb, 0x99, 0xd9, 0xc7, 0xd1, 0x0b, 0x07, 0x54, + 0x6c, 0x87, 0x4b, 0x77, 0x2f, 0xf4, 0x53, 0xaa, + 0x36, 0x43, 0xa5, 0xbb, 0x97, 0xfa, 0x2a, 0xbe, + 0x89, 0xbe, 0xdc, 0xce, 0xce, 0x3e, 0x88, 0x58, + 0x3a, 0xa3, 0x64, 0x3a, 0x5b, 0xb9, 0x7f, 0xa2, + 0x9d, 0x51, 0xb2, 0x1d, 0x2d, 0xdc, 0xbf, 0xd1, + 0x55, 0xf4, 0x4d, 0xf6, 0xe6, 0x76, 0x71, 0xf4, + 0x42, 0xc1, 0xd5, 0x1b, 0x21, 0xd2, 0xdd, 0xcb, + 0xfd, 0x14, 0xea, 0x8d, 0x90, 0xe9, 0x6e, 0xe5, + 0xfe, 0x8a, 0xaf, 0xa2, 0x6f, 0xb7, 0x33, 0xb3, + 0x8f, 0xa2, 0x16, 0x0e, 0xa8, 0xd9, 0x0e, 0x96, + 0xee, 0x5f, 0xe8, 0xa1, 0xca, 0x36, 0x42, 0x9e, + 0xf6, 0xee, 0x5f, 0xe8, 0xaa, 0xfa, 0x26, 0xfb, + 0x73, 0x3b, 0x38, 0xfa, 0x21, 0x60, 0x19, 0x66, + 0xc6, 0xc7, 0xe3, 0x3a, 0xe5, 0xcf, 0x03, 0x58, + 0xc6, 0xe3, 0x5e, 0x48, 0x5d, 0x99, 0x7e, 0x71, + 0x93, 0xc5, 0x75, 0x0d, 0x8e, 0x57, 0x6d, 0x85, + 0xb2, 0xbb, 0x0b, 0xa5, 0x20, 0x34, 0x53, 0xeb, + 0x15, 0x53, 0x5d, 0xd9, 0x19, 0x3d, 0x71, 0x69, + 0xa7, 0xfe, 0x27, 0xc8, 0x54, 0x4d, 0xa6, 0x7c, + 0x65, 0x35, 0xc7, 0x4a, 0xcf, 0x0a, 0xc4, 0x2c, + 0x99, 0xa5, 0x4d, 0xeb, 0xeb, 0xb8, 0x00, 0x1d, + 0xa5, 0xc8, 0xba, 0xb3, 0x3f, 0x7d, 0x93, 0xb9, + 0xe0, 0x5c, 0xaa, 0x17, 0x6c, 0xb7, 0xfd, 0xbc, + 0x7e, 0x7b, 0x7c, 0x2a, 0x7a, 0xaa, 0x02, 0xdc, + 0xff, 0x00, 0xdc, 0x47, 0xe7, 0x37, 0xc2, 0xa7, + 0xa8, 0x83, 0x35, 0x51, 0x59, 0xc7, 0xbd, 0x59, + 0x79, 0xff, 0x00, 0x28, 0x52, 0x94, 0x51, 0x79, + 0xbf, 0xbc, 0xd9, 0x79, 0xff, 0x00, 0x28, 0x40, + 0xca, 0x3d, 0xe6, 0xf7, 0xed, 0x0f, 0xd6, 0x2a, + 0x51, 0x45, 0xe5, 0x1e, 0xf3, 0x7b, 0xf6, 0x87, + 0xeb, 0x15, 0x28, 0x80, 0x88, 0x88, 0x3d, 0x37, + 0xc9, 0x2b, 0xe1, 0xd7, 0xbe, 0xf9, 0x71, 0xf6, + 0xaf, 0xfa, 0xc5, 0x7d, 0xc5, 0xbe, 0x49, 0x5f, + 0x0e, 0xbd, 0xf7, 0xcb, 0x8f, 0xb5, 0x7f, 0xd6, + 0x2b, 0x27, 0x9b, 0xf0, 0xa3, 0xe8, 0x3f, 0xb6, + 0xfe, 0xff, 0x00, 0x31, 0xf0, 0xc7, 0xfe, 0x6d, + 0x28, 0x88, 0xb2, 0x3e, 0x90, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x41, 0x91, + 0x52, 0xa5, 0x72, 0xad, 0x9a, 0xce, 0x73, 0x58, + 0xf9, 0xdb, 0x4b, 0x73, 0xcc, 0x9d, 0x53, 0x3f, + 0xc5, 0x61, 0xed, 0x13, 0xad, 0x63, 0x66, 0xf2, + 0xbe, 0xb6, 0xce, 0x21, 0xb3, 0x70, 0xfd, 0x55, + 0x71, 0xcd, 0xf6, 0x6d, 0xd7, 0xca, 0x3a, 0x15, + 0xeb, 0x6a, 0x36, 0xa1, 0xbb, 0x3a, 0x21, 0xb1, + 0xb0, 0x89, 0x8f, 0xb8, 0x2d, 0xa8, 0x63, 0xbc, + 0x88, 0xd9, 0xa8, 0x54, 0x05, 0xdb, 0x16, 0x2a, + 0xcd, 0x66, 0xf9, 0x27, 0x4a, 0xc3, 0xcc, 0xf3, + 0xde, 0x7f, 0x35, 0x33, 0x63, 0xf2, 0xfe, 0x56, + 0x91, 0x93, 0x3d, 0xe2, 0x6d, 0x69, 0x9f, 0xd5, + 0x88, 0x52, 0xf3, 0x2d, 0x8f, 0xcf, 0xf2, 0xe8, + 0x5d, 0x71, 0x35, 0xb0, 0x92, 0x16, 0x0a, 0xb9, + 0xf1, 0x1c, 0x74, 0x1d, 0x91, 0xad, 0x42, 0x9d, + 0x41, 0x7d, 0x2f, 0x65, 0xb6, 0xd1, 0xd9, 0xbd, + 0xc3, 0xac, 0xf3, 0x06, 0x32, 0x39, 0xc3, 0x4b, + 0xe3, 0x7b, 0x74, 0x31, 0xc0, 0x79, 0x40, 0xe2, + 0x3a, 0xd5, 0x37, 0x6b, 0x6d, 0x2c, 0xad, 0x73, + 0xc9, 0xdb, 0x62, 0xf6, 0x3a, 0x09, 0x4f, 0x38, + 0x04, 0x64, 0x10, 0xd7, 0x3b, 0xcb, 0x6e, 0x8e, + 0xca, 0x64, 0xc7, 0x8f, 0x64, 0x5e, 0x93, 0xf4, + 0xfb, 0xd1, 0xe4, 0xbc, 0xef, 0x99, 0xb7, 0x98, + 0xbf, 0x96, 0xf3, 0x74, 0x8a, 0xe4, 0xad, 0x77, + 0x44, 0xd7, 0xed, 0x94, 0x2a, 0x2e, 0xdb, 0x0c, + 0xa7, 0x33, 0xcc, 0x4b, 0x85, 0x8d, 0xb4, 0x97, + 0x18, 0x7c, 0xa7, 0x35, 0xbe, 0x28, 0xfe, 0xd1, + 0xd0, 0xbd, 0x5f, 0xe4, 0x99, 0xa6, 0x5a, 0xd0, + 0x6f, 0x6d, 0x9f, 0x0b, 0x4e, 0x80, 0xf2, 0x01, + 0x6f, 0x29, 0xab, 0x94, 0x52, 0xd3, 0x1a, 0xe9, + 0x3a, 0x37, 0xfa, 0x8c, 0x3d, 0xce, 0xd7, 0x72, + 0xbd, 0xce, 0x9d, 0xdc, 0x75, 0xe4, 0xe0, 0x45, + 0xbe, 0xda, 0xd6, 0xe6, 0xea, 0x61, 0x05, 0xb4, + 0x4e, 0x9a, 0x53, 0x52, 0xd8, 0xd8, 0x0b, 0x9d, + 0xa3, 0x59, 0xd0, 0xba, 0xe0, 0xd9, 0xfc, 0xe2, + 0xe2, 0xe1, 0xf6, 0xf1, 0x59, 0xca, 0x67, 0x88, + 0x03, 0x23, 0x1c, 0x30, 0x96, 0x82, 0x2a, 0xda, + 0xe2, 0xd5, 0x54, 0x8a, 0x5a, 0x7c, 0x22, 0x67, + 0x54, 0xdf, 0x3e, 0x3a, 0x6b, 0xba, 0xf5, 0xac, + 0xd6, 0x35, 0x98, 0xb5, 0xb4, 0x98, 0x8e, 0x68, + 0xe0, 0x09, 0x20, 0x01, 0x52, 0x75, 0x01, 0xa4, + 0xaf, 0x72, 0x47, 0x24, 0x52, 0x3a, 0x29, 0x1a, + 0x5a, 0xf6, 0x1a, 0x38, 0x1d, 0x60, 0x85, 0x78, + 0xd8, 0x0c, 0x86, 0x58, 0xaf, 0x2e, 0x2e, 0x33, + 0x0b, 0x27, 0x31, 0xd0, 0x86, 0x88, 0x1d, 0x33, + 0x08, 0xa3, 0xea, 0x71, 0x16, 0xe2, 0xdd, 0x0a, + 0xbf, 0xb5, 0xb9, 0x7d, 0xec, 0x19, 0xcd, 0xed, + 0xd4, 0xd0, 0x3e, 0x38, 0x25, 0x9d, 0xdc, 0xd4, + 0xae, 0x69, 0x0d, 0x77, 0x9a, 0x55, 0xe7, 0x14, + 0xc5, 0x37, 0x4e, 0xbf, 0x0d, 0x3c, 0x19, 0x71, + 0xff, 0x00, 0x31, 0xa5, 0xfc, 0xe5, 0xbc, 0xbd, + 0x26, 0xb3, 0xb2, 0xb1, 0x3b, 0xb7, 0x70, 0xb5, + 0xa7, 0xd9, 0x54, 0x1a, 0x2e, 0xeb, 0x0c, 0x9b, + 0x34, 0xcc, 0xc1, 0x75, 0x8d, 0xb3, 0xe6, 0x6b, + 0x74, 0x17, 0x80, 0x03, 0x6b, 0xdb, 0x3a, 0xd7, + 0x9b, 0xec, 0xaf, 0x31, 0xcb, 0xde, 0x23, 0xbe, + 0xb7, 0x7d, 0xb9, 0x76, 0x96, 0xe3, 0x6d, 0x1a, + 0x7b, 0x4e, 0xd4, 0xa9, 0xb6, 0xda, 0x6e, 0xd2, + 0x74, 0x6a, 0xef, 0xe2, 0x9c, 0x9d, 0xa8, 0xc9, + 0x59, 0xc9, 0xec, 0xae, 0xee, 0x2e, 0x34, 0x5d, + 0xb6, 0x99, 0x3e, 0x6b, 0x78, 0xce, 0x7a, 0xd2, + 0xd2, 0x5b, 0x88, 0xab, 0x4c, 0x71, 0xb7, 0x10, + 0xa8, 0xed, 0x6a, 0x5a, 0x05, 0xb4, 0xef, 0x9f, + 0xd9, 0xc4, 0x6e, 0xe7, 0xf1, 0x60, 0xe6, 0xa8, + 0x71, 0x62, 0xde, 0xc2, 0x34, 0xa4, 0xc6, 0x91, + 0x13, 0xc7, 0x8f, 0x87, 0x04, 0xd7, 0x2d, 0x26, + 0x6d, 0x58, 0xb5, 0x77, 0x53, 0xee, 0xae, 0xbc, + 0x63, 0xe3, 0xc9, 0xef, 0x2f, 0xbb, 0x75, 0x95, + 0xe4, 0x57, 0x42, 0x36, 0xca, 0x62, 0x76, 0x31, + 0x1c, 0x82, 0xac, 0x75, 0x37, 0x08, 0x0a, 0xef, + 0x3e, 0xd1, 0xbe, 0x2d, 0x99, 0xb6, 0xce, 0x4e, + 0x5f, 0x66, 0x67, 0x9e, 0xe1, 0xd0, 0xb9, 0x9c, + 0xdf, 0x8a, 0x00, 0xc7, 0xa4, 0x7e, 0x77, 0xe6, + 0xaa, 0x65, 0xde, 0x55, 0x99, 0x59, 0x47, 0x8e, + 0xee, 0xd6, 0x5b, 0x78, 0xcf, 0x8a, 0x1d, 0x23, + 0x4b, 0x41, 0x3f, 0xda, 0x53, 0x77, 0x9a, 0x36, + 0x02, 0xc0, 0xef, 0xde, 0x38, 0x53, 0xb9, 0x2a, + 0xeb, 0x8e, 0xd6, 0xa4, 0x5e, 0x3c, 0x38, 0x7b, + 0x5e, 0x6f, 0x9e, 0xc5, 0x83, 0x3d, 0xbc, 0xbd, + 0xe7, 0x4c, 0x91, 0x39, 0xa3, 0x14, 0xda, 0x27, + 0x58, 0xd9, 0x31, 0x69, 0x98, 0xe1, 0xef, 0x4d, + 0x64, 0x30, 0x5a, 0x66, 0x3b, 0x27, 0x3e, 0x38, + 0x62, 0x17, 0x17, 0x8f, 0xb9, 0x0c, 0x21, 0xa3, + 0x10, 0x7d, 0x1f, 0x20, 0xc2, 0x69, 0x5d, 0x01, + 0xab, 0xc6, 0x43, 0x67, 0x6b, 0x1e, 0xc7, 0x4a, + 0xe9, 0xa1, 0x61, 0xb9, 0xb9, 0x86, 0x7b, 0x86, + 0xb9, 0xcd, 0x05, 0xc1, 0xac, 0xa3, 0x45, 0x09, + 0xd3, 0xba, 0xb4, 0x64, 0x17, 0x62, 0xd7, 0x20, + 0xc9, 0xe7, 0x22, 0x83, 0xad, 0x1c, 0xc7, 0x9f, + 0xea, 0xc8, 0xd9, 0x5a, 0xef, 0x0a, 0x93, 0xbc, + 0x74, 0x71, 0x5e, 0x66, 0x56, 0x11, 0x0c, 0x30, + 0xda, 0x65, 0x8e, 0x6b, 0x19, 0xbc, 0x5e, 0xec, + 0x7f, 0x2a, 0xef, 0x58, 0xae, 0xda, 0xda, 0x7d, + 0x95, 0xdb, 0xa7, 0xbe, 0x5e, 0x5e, 0x59, 0xcb, + 0x5c, 0x99, 0x71, 0x57, 0x5d, 0x96, 0xcd, 0xde, + 0xf8, 0x76, 0xed, 0x14, 0xd3, 0xe1, 0xf5, 0x43, + 0xe6, 0x8d, 0x1e, 0x20, 0x2b, 0x64, 0x10, 0x4b, + 0x71, 0x2c, 0x70, 0xc2, 0xdc, 0x52, 0x4a, 0xe0, + 0xc6, 0xb7, 0x55, 0x49, 0x5a, 0xda, 0x7f, 0x56, + 0xd5, 0xdf, 0x91, 0xff, 0x00, 0x37, 0xb1, 0xfb, + 0x78, 0xfe, 0xb0, 0x58, 0xe2, 0x22, 0x6d, 0xa7, + 0x39, 0x7d, 0x35, 0xed, 0x35, 0xa4, 0xda, 0x3f, + 0x57, 0x1e, 0xef, 0xc6, 0x1d, 0xb3, 0x6c, 0x6e, + 0xd1, 0xc1, 0x13, 0xe6, 0x92, 0xcb, 0x0b, 0x23, + 0x05, 0xce, 0x77, 0x39, 0x19, 0xd0, 0x3b, 0x0d, + 0x79, 0x2a, 0x12, 0x84, 0xd2, 0x9a, 0x4b, 0xa9, + 0x41, 0xbf, 0x5d, 0x0b, 0xee, 0xb2, 0xf3, 0x6f, + 0x2e, 0xb7, 0x7f, 0xfc, 0x56, 0xba, 0xa3, 0xfa, + 0xbe, 0x49, 0xf0, 0xaf, 0x8f, 0x65, 0xd9, 0x6b, + 0x9f, 0xb4, 0x51, 0x65, 0xae, 0x1e, 0x4d, 0xc8, + 0x8c, 0x8f, 0xea, 0xb1, 0xff, 0x00, 0xd0, 0xbb, + 0x66, 0xc1, 0x15, 0xb4, 0x45, 0x75, 0xe3, 0xc1, + 0xe4, 0xff, 0x00, 0x2c, 0xfe, 0x6b, 0x97, 0xcc, + 0x53, 0x34, 0xe6, 0x8a, 0xd6, 0x71, 0xd7, 0x7c, + 0x6d, 0x8d, 0x23, 0x4e, 0x3f, 0xf8, 0x74, 0xb3, + 0x62, 0x36, 0x99, 0xcd, 0x0e, 0x6d, 0x95, 0x5a, + 0x45, 0x41, 0xe7, 0x23, 0x1e, 0x17, 0x85, 0x06, + 0xf6, 0x39, 0x8f, 0x73, 0x1c, 0x28, 0xe6, 0x92, + 0x08, 0xec, 0x85, 0xf7, 0x66, 0xc8, 0xc2, 0xf7, + 0x46, 0xd3, 0xa5, 0xa2, 0xae, 0x1d, 0xb5, 0xf0, + 0xeb, 0xa1, 0xff, 0x00, 0x75, 0x33, 0x7f, 0xc4, + 0x77, 0x84, 0xa6, 0x6c, 0x35, 0xa4, 0x57, 0x49, + 0xf1, 0xd7, 0xfc, 0x17, 0xfe, 0x51, 0xfc, 0xc3, + 0x37, 0x9b, 0xb6, 0x58, 0xcb, 0x15, 0x88, 0xc7, + 0x15, 0xdb, 0xb6, 0x34, 0xfb, 0xb5, 0xf1, 0xf9, + 0x33, 0x65, 0x65, 0x73, 0x7f, 0x77, 0x1d, 0xa5, + 0xa3, 0x39, 0xc9, 0xa4, 0x24, 0x35, 0xb5, 0x00, + 0x68, 0xd2, 0x49, 0x27, 0x40, 0x0b, 0x76, 0x69, + 0x94, 0xdf, 0x65, 0x53, 0x8b, 0x7b, 0xe8, 0xc4, + 0x52, 0xbd, 0xa1, 0xed, 0x68, 0x70, 0x77, 0x8a, + 0x49, 0x15, 0xab, 0x4f, 0xf5, 0x55, 0xe3, 0xf0, + 0xeb, 0x23, 0x16, 0xf6, 0xae, 0xcd, 0xee, 0x1a, + 0x04, 0xb7, 0x3e, 0x25, 0xbd, 0x75, 0x88, 0xc1, + 0xd6, 0x3c, 0xe5, 0x11, 0xf8, 0x95, 0xfc, 0xf2, + 0x2f, 0xfc, 0x66, 0x7d, 0x79, 0x14, 0x4e, 0x18, + 0x8c, 0x3b, 0xe7, 0xee, 0x99, 0x4e, 0x3f, 0xe6, + 0x36, 0xc9, 0xfc, 0xc7, 0xd2, 0xd3, 0x49, 0xc5, + 0x5a, 0xdb, 0x59, 0xf6, 0xcd, 0xab, 0xc6, 0x74, + 0xfd, 0x0a, 0x86, 0x91, 0xa1, 0x11, 0x17, 0x17, + 0xab, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x2c, 0x8d, 0x6b, 0x0b, 0x23, 0x5a, 0x0c, + 0x8d, 0xce, 0xe2, 0xfb, 0x75, 0x8f, 0xf2, 0xab, + 0x4f, 0xb2, 0x8f, 0xea, 0x85, 0xf1, 0x11, 0xb9, + 0xdc, 0x5f, 0x6e, 0xb1, 0xfe, 0x55, 0x69, 0xf6, + 0x51, 0xfd, 0x50, 0xb4, 0xf9, 0x3f, 0x1b, 0x3e, + 0x7f, 0xfb, 0x8f, 0xec, 0xc1, 0xfb, 0x57, 0xfd, + 0x15, 0x6d, 0x1a, 0xd5, 0x7d, 0xde, 0x51, 0xed, + 0x95, 0x60, 0x1a, 0xd5, 0x7d, 0xde, 0x51, 0xed, + 0x95, 0xb5, 0xf3, 0x6c, 0x2f, 0x51, 0x7e, 0xd5, + 0x9e, 0x73, 0x7c, 0x21, 0x79, 0x5e, 0xa2, 0xfd, + 0xab, 0x3c, 0xe6, 0xf8, 0x42, 0x0e, 0x4d, 0xb2, + 0xfe, 0x67, 0x1f, 0xd8, 0x8f, 0xac, 0xe5, 0x02, + 0xa7, 0xb6, 0xcb, 0xf9, 0x9c, 0x7f, 0x62, 0x3e, + 0xb3, 0x94, 0x0a, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x20, 0xd6, 0x11, 0x06, 0xb0, + 0x82, 0x76, 0xff, 0x00, 0xfd, 0x2b, 0x97, 0x79, + 0xee, 0xf0, 0xbd, 0x63, 0x64, 0x7f, 0x98, 0x4a, + 0x37, 0x39, 0x92, 0xb3, 0x7f, 0xfe, 0x95, 0xcb, + 0xbe, 0xd1, 0xde, 0x17, 0xac, 0x6c, 0x8f, 0xf3, + 0x09, 0x7e, 0xc4, 0xa0, 0xe2, 0xb3, 0xc9, 0xef, + 0x6f, 0xa2, 0x7c, 0xd6, 0xe1, 0xae, 0x6b, 0x1f, + 0x84, 0x82, 0x68, 0x74, 0xee, 0xef, 0x50, 0x2d, + 0x97, 0x9b, 0x3f, 0x77, 0x6d, 0x6c, 0x6e, 0x5a, + 0xf8, 0xee, 0x23, 0x67, 0x97, 0xcc, 0xbb, 0x11, + 0x6f, 0x6f, 0xc5, 0x5d, 0x56, 0x12, 0xba, 0x3d, + 0x9b, 0xcc, 0x5c, 0xdf, 0x14, 0x97, 0x86, 0x83, + 0xdb, 0xa2, 0x6c, 0xa7, 0x8f, 0x2d, 0xdd, 0xb9, + 0xfd, 0x9c, 0x90, 0x92, 0xe1, 0xd9, 0xd4, 0x82, + 0x09, 0x59, 0xb2, 0xac, 0xae, 0x6e, 0xa2, 0xbc, + 0x61, 0x7c, 0x58, 0xae, 0x9a, 0xd7, 0x46, 0x71, + 0x0a, 0x34, 0x11, 0x8b, 0xc7, 0x3b, 0x8a, 0xb2, + 0x74, 0x1e, 0x11, 0xdc, 0x0a, 0x6f, 0x28, 0x03, + 0xe1, 0xfc, 0xd4, 0x79, 0x88, 0x38, 0xed, 0xf2, + 0x5b, 0xcb, 0x8b, 0xb9, 0x6d, 0xa3, 0x2c, 0xfd, + 0x47, 0xed, 0x65, 0x27, 0xf5, 0x63, 0x45, 0x47, + 0x8c, 0x01, 0xdc, 0x5e, 0xaf, 0x32, 0x4b, 0x9b, + 0x5b, 0x7f, 0x6a, 0x6b, 0xe3, 0x9e, 0x01, 0xa1, + 0xcf, 0x85, 0xd8, 0x83, 0x7b, 0x75, 0x01, 0x76, + 0x42, 0x79, 0x8d, 0x91, 0x95, 0xcc, 0xd0, 0xe9, + 0xe6, 0xc2, 0x4f, 0x60, 0xd3, 0x89, 0x63, 0x66, + 0x4f, 0x39, 0x06, 0x63, 0x6c, 0xed, 0x31, 0xba, + 0x02, 0xfc, 0x3d, 0x9d, 0x28, 0x20, 0xce, 0xb5, + 0x25, 0x96, 0x33, 0x24, 0x21, 0x8e, 0xbf, 0x7c, + 0xa6, 0x6c, 0x7a, 0x18, 0xd0, 0x30, 0x53, 0x46, + 0x1e, 0xfa, 0x8d, 0xa5, 0x34, 0x6b, 0xa6, 0x8a, + 0xaf, 0x70, 0x7e, 0xde, 0x3f, 0x3c, 0x78, 0x42, + 0x09, 0x6d, 0xab, 0x00, 0x66, 0xf4, 0x02, 0x80, + 0x44, 0xc0, 0x06, 0xe6, 0xea, 0x86, 0x53, 0x3b, + 0x5b, 0xfc, 0xe0, 0xfd, 0x93, 0x3e, 0x55, 0x0c, + 0x82, 0xe3, 0xb3, 0xf3, 0xb6, 0x1c, 0x9e, 0xdd, + 0xaf, 0x03, 0x0c, 0xd3, 0x18, 0xa8, 0x75, 0x78, + 0xc0, 0xd3, 0xc0, 0xab, 0x13, 0xda, 0x3d, 0x99, + 0x93, 0xec, 0x9a, 0x2a, 0xee, 0x74, 0xc6, 0xda, + 0xee, 0xd4, 0xd1, 0xaa, 0x59, 0x92, 0x98, 0x76, + 0x5a, 0xde, 0x61, 0xae, 0x2b, 0xa6, 0xbc, 0x7f, + 0x65, 0xc4, 0xae, 0xb7, 0xd9, 0xb6, 0x4d, 0xaa, + 0x82, 0xe4, 0x0f, 0xd4, 0xc9, 0x10, 0xb9, 0xaf, + 0x64, 0x0c, 0x3f, 0x28, 0x41, 0xd3, 0x9c, 0xc8, + 0xce, 0xa6, 0xbe, 0xb6, 0x8f, 0xc8, 0xb5, 0x11, + 0xc4, 0x3b, 0x85, 0x87, 0xc0, 0xa3, 0xa7, 0xbd, + 0xba, 0xb3, 0xd9, 0x9b, 0x07, 0xda, 0xc8, 0x62, + 0x73, 0x8b, 0x9a, 0x4b, 0x77, 0xaa, 0xe5, 0x91, + 0x39, 0xb9, 0xc8, 0x73, 0x5b, 0x83, 0xff, 0x00, + 0x16, 0x7c, 0x5d, 0xc2, 0xe6, 0xd3, 0xbc, 0xbd, + 0x3a, 0xe2, 0xd6, 0xdf, 0x66, 0xac, 0x1d, 0x75, + 0x6c, 0x2e, 0x98, 0x5c, 0x40, 0x61, 0x38, 0x68, + 0x71, 0x3b, 0x4e, 0x80, 0x50, 0x63, 0x2d, 0xbd, + 0x9f, 0x35, 0xcb, 0x2f, 0xe1, 0xcc, 0x08, 0x95, + 0xb0, 0xc7, 0x89, 0xb2, 0x91, 0x42, 0x0d, 0x09, + 0xf9, 0x15, 0x69, 0x59, 0xad, 0xe4, 0xb6, 0xcd, + 0xf2, 0xe9, 0xec, 0x2c, 0x18, 0x6c, 0x24, 0x68, + 0x2f, 0x74, 0x4d, 0xd2, 0xd9, 0x06, 0xaf, 0x19, + 0xd4, 0xaa, 0xac, 0xe9, 0xdd, 0xd0, 0x77, 0x90, + 0x58, 0xb2, 0xab, 0x99, 0xad, 0xb6, 0x6a, 0xf6, + 0x78, 0x5d, 0x82, 0x56, 0x48, 0x30, 0xbb, 0x7b, + 0x4b, 0x07, 0xca, 0xa3, 0x9d, 0xb4, 0x39, 0xc3, + 0x9a, 0x5a, 0xeb, 0x87, 0x16, 0xb8, 0x50, 0x8a, + 0x37, 0x51, 0x52, 0x59, 0x34, 0xb0, 0xc3, 0xb3, + 0x97, 0x92, 0x4f, 0x17, 0x3d, 0x1b, 0x64, 0x18, + 0xa2, 0x3a, 0x03, 0xb4, 0xb5, 0x71, 0xcf, 0x9a, + 0x64, 0xaf, 0x82, 0x46, 0x47, 0x95, 0xb6, 0x39, + 0x1c, 0xd2, 0x19, 0x20, 0x77, 0x92, 0x48, 0xd0, + 0xed, 0x5b, 0x88, 0x36, 0xde, 0xff, 0x00, 0xa5, + 0xac, 0x4f, 0xf8, 0xae, 0x34, 0xee, 0xb9, 0x73, + 0xc1, 0xb3, 0xd7, 0x4f, 0x85, 0x93, 0x4d, 0x34, + 0x36, 0xcd, 0x97, 0x4c, 0x62, 0x57, 0x10, 0x4a, + 0xe8, 0xbe, 0xff, 0x00, 0x4b, 0xd8, 0x7d, 0xa3, + 0xbc, 0x2e, 0x4b, 0xab, 0x2c, 0xc7, 0x32, 0x64, + 0x57, 0x59, 0x8c, 0x91, 0x59, 0x40, 0xd8, 0xc3, + 0x58, 0x5c, 0x69, 0xe2, 0xd2, 0xba, 0x19, 0xbe, + 0x82, 0x36, 0xf3, 0x2c, 0xbb, 0xb3, 0xb8, 0x6d, + 0xbc, 0xcd, 0xab, 0xe4, 0xa1, 0x8c, 0xb0, 0xd4, + 0x3a, 0xbb, 0xc5, 0x76, 0x8d, 0x99, 0xbd, 0xd0, + 0xc7, 0xcd, 0x03, 0x27, 0x70, 0xa8, 0xb7, 0x73, + 0xbc, 0x72, 0xbb, 0x73, 0x99, 0xa2, 0xb5, 0x9b, + 0x27, 0x98, 0x1e, 0x72, 0x38, 0x98, 0xd3, 0x5a, + 0x50, 0xb9, 0xa0, 0xb7, 0x4d, 0x12, 0xe7, 0x2f, + 0xeb, 0x0b, 0xe3, 0x9a, 0xe5, 0x37, 0x31, 0xcd, + 0x29, 0x73, 0x64, 0xe6, 0x5c, 0x68, 0xe0, 0x5b, + 0x4d, 0x1d, 0xe4, 0x1a, 0xb6, 0x5e, 0x19, 0x20, + 0xcd, 0x2e, 0x61, 0x95, 0xa5, 0xb2, 0xc7, 0x0b, + 0x9a, 0xe6, 0x8e, 0xd8, 0x5c, 0xf1, 0x6c, 0xc5, + 0xfb, 0xe2, 0x2e, 0x12, 0x45, 0xcf, 0x00, 0x5c, + 0x6d, 0xf1, 0x78, 0xf4, 0x3a, 0x68, 0x40, 0x05, + 0x77, 0x64, 0x52, 0xdd, 0x49, 0x9f, 0x5d, 0xbe, + 0xed, 0x82, 0x39, 0xcc, 0x4e, 0xe7, 0x1a, 0x05, + 0x05, 0x5a, 0x5a, 0x14, 0x76, 0xcd, 0x3d, 0xc7, + 0x3c, 0xb7, 0x73, 0x8d, 0x5c, 0xfc, 0x78, 0x9d, + 0xbf, 0xe2, 0x39, 0x04, 0x63, 0x9a, 0xe6, 0xb8, + 0xb5, 0xc2, 0x8e, 0x69, 0xa3, 0x86, 0xf1, 0x1a, + 0xd6, 0x17, 0x46, 0x63, 0xfc, 0xc2, 0xeb, 0xed, + 0x5f, 0xf5, 0x8a, 0xe7, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x05, 0x29, 0xb3, 0x5f, + 0xce, 0xed, 0xbf, 0xb5, 0xf5, 0x0a, 0x8b, 0x52, + 0x9b, 0x35, 0xfc, 0xee, 0xdb, 0xfb, 0x5f, 0x50, + 0xa0, 0x9b, 0xcc, 0x3d, 0xf6, 0x6f, 0x3b, 0xe4, + 0x0b, 0x9d, 0x74, 0x66, 0x1e, 0xfb, 0x37, 0x9d, + 0xf2, 0x05, 0xce, 0x80, 0x8d, 0xf2, 0x87, 0xe5, + 0xba, 0x88, 0xdf, 0x28, 0x7e, 0x5b, 0xa8, 0x35, + 0x6d, 0x9f, 0xbc, 0x5b, 0x7d, 0x91, 0xf0, 0xaa, + 0xea, 0xb1, 0x6d, 0x9f, 0xbc, 0x5b, 0x7d, 0x91, + 0xf0, 0xaa, 0xea, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0xec, 0xca, 0x2c, 0xa3, 0xbe, + 0xcc, 0x22, 0xb5, 0x95, 0xc5, 0xac, 0x93, 0x15, + 0x4b, 0x69, 0x5d, 0x0d, 0x27, 0x75, 0x48, 0xbb, + 0x2d, 0xd9, 0xb6, 0xce, 0xeb, 0x53, 0x79, 0x3b, + 0x26, 0x6b, 0xb0, 0x12, 0xe0, 0x30, 0x87, 0x72, + 0x57, 0x3e, 0xcc, 0xff, 0x00, 0x3a, 0xb7, 0xfe, + 0xdf, 0xd5, 0x72, 0x5e, 0xe5, 0x19, 0x8d, 0xce, + 0x67, 0x3b, 0x63, 0x82, 0x4c, 0x2f, 0x94, 0xd2, + 0x4c, 0x24, 0x30, 0x0a, 0xf9, 0x55, 0x41, 0xcd, + 0x9a, 0x65, 0xb2, 0x65, 0xd7, 0x5c, 0xc3, 0xdd, + 0x8d, 0xae, 0x18, 0xe3, 0x78, 0x14, 0xab, 0x57, + 0x1a, 0xb6, 0xdd, 0xb6, 0xda, 0xe3, 0x3e, 0xb0, + 0xb1, 0x90, 0x36, 0x61, 0x0c, 0x4e, 0x6c, 0xa0, + 0x8a, 0x8a, 0xe1, 0x3e, 0x2a, 0x8c, 0xcc, 0x67, + 0xcb, 0xe1, 0xe7, 0xb2, 0xbb, 0x3b, 0x66, 0x97, + 0xb9, 0xf8, 0x4d, 0xc1, 0xd0, 0xec, 0x75, 0xfc, + 0xde, 0xc6, 0xe2, 0x08, 0x5a, 0xa2, 0xb0, 0xdf, + 0x4f, 0x63, 0x92, 0x3e, 0x3b, 0x28, 0xed, 0x22, + 0x9d, 0xed, 0x68, 0x74, 0xf2, 0x4c, 0x2a, 0x49, + 0x3b, 0xcb, 0x56, 0x61, 0x93, 0xc1, 0x26, 0x67, + 0x68, 0xcb, 0x51, 0xcd, 0xc1, 0x7e, 0x03, 0xc3, + 0x7e, 0x6f, 0xce, 0xa2, 0x08, 0x3a, 0x85, 0xd7, + 0x96, 0xc3, 0x63, 0x3d, 0xc3, 0x99, 0x7d, 0x37, + 0x31, 0x10, 0x61, 0x21, 0xe0, 0x81, 0xe3, 0x0d, + 0x42, 0xae, 0xaa, 0x97, 0x9a, 0xff, 0x00, 0x2c, + 0xb5, 0xcc, 0x3a, 0xb4, 0x59, 0x44, 0x6d, 0x58, + 0xe1, 0x14, 0x92, 0x38, 0x78, 0xf5, 0xd4, 0x5d, + 0x5e, 0xc2, 0xf3, 0x97, 0x65, 0xf6, 0x1d, 0x79, + 0x71, 0x6e, 0x03, 0x6e, 0x2d, 0x9b, 0x1b, 0x9d, + 0x1d, 0x4e, 0x20, 0x35, 0x14, 0x15, 0xf3, 0x4a, + 0x9a, 0x69, 0x1b, 0x87, 0xb0, 0x8a, 0x6b, 0x29, + 0xb6, 0xb5, 0x8b, 0x2f, 0xbc, 0xcc, 0xe6, 0x80, + 0x5c, 0xba, 0xdd, 0xd8, 0x22, 0x85, 0xda, 0x5a, + 0x35, 0x6e, 0x77, 0x52, 0x7b, 0x9c, 0xbb, 0x31, + 0xca, 0xe6, 0x99, 0xf1, 0xc3, 0x6b, 0x7b, 0x0b, + 0x87, 0x36, 0xd8, 0xc8, 0x6e, 0x21, 0xbb, 0xe2, + 0xee, 0xa0, 0xe0, 0xb9, 0x86, 0xc6, 0x3b, 0x1b, + 0x79, 0x60, 0x98, 0xbe, 0xe5, 0xf5, 0xe7, 0xe3, + 0x24, 0x51, 0xbd, 0xa5, 0xc9, 0x55, 0x2f, 0x7f, + 0x69, 0x03, 0x32, 0x6c, 0xb6, 0x58, 0xa3, 0x0c, + 0x9a, 0x73, 0x47, 0x3c, 0x79, 0x44, 0x91, 0x40, + 0xba, 0xaf, 0x65, 0xb2, 0xc9, 0x0c, 0x36, 0x71, + 0xda, 0x45, 0x3c, 0xb8, 0x03, 0xa7, 0x7c, 0xba, + 0x4d, 0x5d, 0xb8, 0x10, 0x57, 0x91, 0x4e, 0xdf, + 0xe5, 0xf6, 0x8c, 0xbe, 0xcb, 0xee, 0x6d, 0xd9, + 0x4b, 0x5b, 0xe2, 0xc7, 0x73, 0x7b, 0x80, 0xd6, + 0xa4, 0x76, 0xb4, 0xad, 0xd7, 0xf7, 0x79, 0x66, + 0x55, 0x98, 0xc9, 0x6f, 0x0d, 0x8c, 0x72, 0x0a, + 0x83, 0x33, 0x9f, 0xa6, 0x95, 0x00, 0xd1, 0x83, + 0x71, 0x05, 0x71, 0x65, 0xa0, 0xb8, 0x86, 0xb4, + 0x55, 0xce, 0x21, 0xa0, 0x76, 0x4e, 0xa5, 0x29, + 0xb4, 0x96, 0x50, 0x5a, 0x66, 0x00, 0x5b, 0xb4, + 0x32, 0x39, 0x63, 0x6c, 0x81, 0xa3, 0x70, 0x9a, + 0x8f, 0x91, 0x73, 0xe4, 0x8c, 0x0f, 0xcd, 0xed, + 0x1a, 0x75, 0x73, 0x80, 0x9e, 0xe0, 0x28, 0x24, + 0x25, 0xcb, 0x32, 0x5c, 0xb9, 0xac, 0x8f, 0x32, + 0x96, 0x57, 0xdc, 0xbc, 0x02, 0xe6, 0xc5, 0xa9, + 0x95, 0xdf, 0x5c, 0x99, 0xb6, 0x55, 0x15, 0x9b, + 0x21, 0xba, 0xb5, 0x90, 0xcd, 0x67, 0x70, 0x3c, + 0x47, 0x9d, 0x60, 0xf6, 0x56, 0x36, 0x81, 0xe5, + 0xf9, 0xcd, 0xd1, 0x3b, 0x8e, 0xc3, 0xdc, 0x68, + 0x01, 0x76, 0xb4, 0xf3, 0x9b, 0x1d, 0x21, 0x3f, + 0xf0, 0x26, 0xd1, 0xc2, 0x3d, 0x24, 0x10, 0x28, + 0xac, 0x57, 0x66, 0xd3, 0x24, 0xb6, 0xb5, 0x63, + 0x2d, 0x23, 0xb9, 0x7c, 0xec, 0x0f, 0x96, 0x59, + 0x74, 0xd7, 0xb4, 0xb9, 0xaf, 0x2c, 0xf2, 0xfb, + 0xdc, 0xc2, 0xc9, 0xb6, 0x0e, 0x6b, 0x1b, 0x78, + 0x07, 0x3d, 0x1c, 0x64, 0x1c, 0x07, 0x59, 0xa8, + 0xdc, 0xd6, 0x82, 0x1a, 0xa1, 0x75, 0xe5, 0x90, + 0xd8, 0xcf, 0x70, 0x59, 0x7d, 0x37, 0x31, 0x16, + 0x12, 0x43, 0xea, 0x07, 0x8d, 0xbd, 0xa5, 0x4b, + 0xcf, 0x7f, 0x96, 0x5a, 0x5f, 0xf5, 0x68, 0xb2, + 0x88, 0xda, 0xb5, 0xc2, 0x29, 0x24, 0x77, 0x97, + 0x53, 0xa0, 0x9c, 0x47, 0x79, 0x79, 0xcb, 0x72, + 0xfc, 0xb8, 0xe7, 0xd3, 0xdb, 0x34, 0x36, 0xe6, + 0xd8, 0x30, 0xba, 0x22, 0x68, 0xe1, 0xa8, 0x1d, + 0x63, 0x7a, 0xb4, 0x41, 0xc3, 0x96, 0xe5, 0xb0, + 0x5d, 0xda, 0x5f, 0x4e, 0xf7, 0xb8, 0x1b, 0x66, + 0x87, 0x30, 0x36, 0x94, 0x35, 0x04, 0xe9, 0xaf, + 0x69, 0x79, 0x8f, 0x2e, 0x89, 0xd9, 0x1c, 0x99, + 0x91, 0x71, 0xe7, 0x59, 0x28, 0x8c, 0x34, 0x11, + 0x86, 0x9e, 0x2f, 0x1a, 0xed, 0xc8, 0xb4, 0x65, + 0xf9, 0xbf, 0x99, 0xa3, 0xb5, 0x47, 0x2c, 0x43, + 0xfe, 0x91, 0x98, 0xef, 0x5c, 0x0f, 0x03, 0x10, + 0x41, 0xd4, 0x6f, 0xa2, 0x9c, 0xf6, 0x8c, 0xbb, + 0x2b, 0xcb, 0xad, 0x9d, 0x0c, 0x31, 0x5e, 0x5d, + 0x4c, 0x31, 0x4a, 0xe9, 0x3c, 0x6c, 0x3a, 0x35, + 0x53, 0x71, 0x33, 0x46, 0x59, 0xfb, 0x25, 0x86, + 0x6c, 0xcb, 0x66, 0x46, 0x65, 0x79, 0x13, 0x40, + 0x2b, 0x81, 0xc0, 0x57, 0x89, 0x07, 0x0d, 0xe6, + 0x58, 0x2d, 0xb2, 0xfb, 0x4b, 0xce, 0x70, 0xb8, + 0xdd, 0x56, 0xac, 0xa5, 0x29, 0x4e, 0xca, 0xe1, + 0x56, 0x9c, 0xd2, 0xfe, 0xdd, 0xb9, 0x35, 0x94, + 0x86, 0xce, 0x37, 0x36, 0x60, 0xe1, 0x1c, 0x67, + 0x54, 0x66, 0x87, 0x4b, 0x57, 0x2b, 0xfd, 0x97, + 0x25, 0xb0, 0xb6, 0x79, 0xb7, 0x8e, 0xe2, 0xee, + 0xec, 0x19, 0x1c, 0x65, 0x15, 0x6b, 0x5b, 0xd8, + 0x1d, 0xd0, 0x82, 0x01, 0x14, 0xce, 0x6d, 0x6d, + 0x6b, 0x3e, 0x5b, 0x06, 0x6d, 0x6b, 0x18, 0xb7, + 0xe7, 0x0f, 0x37, 0x33, 0x1b, 0xe4, 0x87, 0x6e, + 0x10, 0x17, 0x7e, 0x66, 0xec, 0xa7, 0x28, 0x9a, + 0x27, 0xb2, 0xd1, 0xb2, 0xcd, 0x2c, 0x60, 0x08, + 0xce, 0x86, 0xb5, 0xa3, 0x5b, 0x88, 0x3b, 0xa6, + 0xa8, 0x2a, 0xe8, 0xb2, 0xe3, 0x57, 0x12, 0x06, + 0x10, 0xe2, 0x48, 0x6e, 0xf0, 0x25, 0x61, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x77, 0x64, 0x7f, + 0xce, 0x2d, 0x3e, 0xd3, 0xe4, 0x2b, 0x85, 0x77, + 0x64, 0x7f, 0xce, 0x2d, 0x3e, 0xd3, 0xe4, 0x28, + 0x2c, 0x79, 0xa7, 0xbe, 0xc9, 0xdc, 0xf0, 0x2e, + 0x55, 0xd5, 0x9a, 0x7b, 0xec, 0x9d, 0xcf, 0x02, + 0xe5, 0x41, 0xee, 0xdf, 0xde, 0x23, 0xf3, 0x9b, + 0xe1, 0x53, 0xca, 0x06, 0xdf, 0xde, 0x23, 0xf3, + 0x9b, 0xe1, 0x53, 0xc8, 0x0a, 0x2f, 0x37, 0xf7, + 0x9b, 0x2f, 0x3f, 0xe5, 0x0a, 0x51, 0x45, 0xe6, + 0xfe, 0xf3, 0x65, 0xe7, 0xfc, 0xa1, 0x03, 0x28, + 0xf7, 0x9b, 0xdf, 0xb4, 0x3f, 0x58, 0xa9, 0x45, + 0x17, 0x94, 0x7b, 0xcd, 0xef, 0xda, 0x1f, 0xac, + 0x54, 0xa2, 0x02, 0x22, 0x20, 0xf4, 0xdf, 0x24, + 0xaf, 0x87, 0x5e, 0xfb, 0xe5, 0xc7, 0xda, 0xbf, + 0xeb, 0x15, 0xf7, 0x16, 0xf9, 0x25, 0x7c, 0x3a, + 0xf7, 0xdf, 0x2e, 0x3e, 0xd5, 0xff, 0x00, 0x58, + 0xac, 0x9e, 0x6f, 0xc2, 0x8f, 0xa0, 0xfe, 0xdb, + 0xfb, 0xfc, 0xc7, 0xc3, 0x1f, 0xf9, 0xb4, 0xa2, + 0x22, 0xc8, 0xfa, 0x41, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x05, 0xcf, 0xf0, + 0xca, 0x36, 0x9c, 0xd2, 0xf2, 0x53, 0xe5, 0x32, + 0x00, 0x07, 0x63, 0x13, 0xbf, 0x45, 0x46, 0x6d, + 0xc4, 0xae, 0x7e, 0xd3, 0x5d, 0xd7, 0xf3, 0x03, + 0x18, 0x3b, 0x4d, 0x68, 0x5d, 0x5f, 0x87, 0x97, + 0xac, 0xb7, 0xcf, 0x4c, 0x2f, 0x21, 0xa2, 0xea, + 0x27, 0x30, 0x57, 0x75, 0xcd, 0x21, 0xcd, 0xef, + 0x55, 0x6c, 0xfc, 0x44, 0xcb, 0x65, 0xb7, 0xcd, + 0xfa, 0xc0, 0x34, 0x9b, 0x7b, 0xa6, 0x37, 0xc7, + 0xa6, 0x86, 0xbd, 0x9e, 0x29, 0x07, 0xb6, 0xb4, + 0x6b, 0xaf, 0x96, 0xe1, 0xc6, 0x62, 0xdc, 0x5e, + 0x2c, 0x4c, 0x53, 0xf9, 0xd5, 0xe6, 0xd3, 0x11, + 0xdd, 0xc3, 0xfe, 0xdc, 0xfe, 0x95, 0x4c, 0x54, + 0x1a, 0x83, 0x53, 0xbc, 0x16, 0xeb, 0x1b, 0x37, + 0x5e, 0xdd, 0xc1, 0x67, 0x10, 0xa3, 0xa7, 0x7b, + 0x63, 0x6f, 0xf6, 0x8d, 0x2a, 0xa6, 0x76, 0x3f, + 0x20, 0x6e, 0x77, 0x98, 0x3d, 0xb7, 0x0c, 0x26, + 0xca, 0x16, 0x38, 0xc8, 0xe6, 0x9a, 0x78, 0xe4, + 0x51, 0xad, 0x04, 0x6e, 0xe9, 0xaa, 0xe9, 0x76, + 0x5b, 0x67, 0x91, 0x6d, 0x9d, 0x95, 0xbc, 0x53, + 0xba, 0x58, 0x9b, 0x2c, 0x6e, 0x79, 0x90, 0x00, + 0x5a, 0x5e, 0x68, 0x05, 0x46, 0xb5, 0xca, 0xb8, + 0xe7, 0x6d, 0x6d, 0x3e, 0x13, 0x6d, 0x1b, 0x33, + 0x79, 0xcc, 0x71, 0x7c, 0xde, 0x5f, 0x1e, 0xb3, + 0x9b, 0x1e, 0x2b, 0xdf, 0x85, 0x78, 0x78, 0x75, + 0x2d, 0x59, 0xce, 0x6f, 0x69, 0xb2, 0x19, 0x5d, + 0xbd, 0xad, 0x94, 0x2d, 0x73, 0xdc, 0x30, 0xc3, + 0x1b, 0xb4, 0x03, 0x84, 0x78, 0xcf, 0x92, 0x84, + 0x6b, 0x58, 0xd9, 0xfc, 0xfa, 0x0d, 0xaa, 0xb3, + 0xba, 0xb4, 0xbf, 0x81, 0xad, 0x91, 0xad, 0x02, + 0x48, 0xdb, 0xa5, 0x8e, 0x6b, 0xb5, 0x39, 0xb8, + 0xb7, 0x54, 0x47, 0xe2, 0x75, 0xbc, 0x85, 0xd6, + 0x57, 0x3a, 0x79, 0xa0, 0x1d, 0x13, 0x8e, 0xe0, + 0x71, 0xd2, 0x2b, 0xdb, 0x5a, 0x7f, 0x0c, 0xa0, + 0x91, 0xd7, 0xd7, 0x97, 0x3a, 0x79, 0xa6, 0x46, + 0x23, 0x27, 0x70, 0xb9, 0xce, 0xa8, 0x1d, 0xb1, + 0x45, 0xaa, 0x72, 0x5b, 0xbf, 0x14, 0xfd, 0x48, + 0xfd, 0x0f, 0x0e, 0xbe, 0x57, 0x0c, 0xff, 0x00, + 0x2a, 0x9f, 0x37, 0x36, 0xff, 0x00, 0xf6, 0x3e, + 0xfe, 0xe4, 0x4f, 0xd5, 0x17, 0xdd, 0xa6, 0x8d, + 0x1b, 0x2f, 0x62, 0xfc, 0xbf, 0x6e, 0x1d, 0x62, + 0x74, 0x98, 0x0c, 0xac, 0x69, 0xdf, 0x6e, 0x12, + 0x5a, 0x78, 0x0a, 0xb2, 0xed, 0x36, 0xd4, 0x41, + 0x90, 0x5c, 0xc7, 0x14, 0x76, 0xe2, 0x79, 0xee, + 0x00, 0x96, 0x63, 0x8b, 0x0f, 0x8a, 0x0e, 0x01, + 0xa4, 0x03, 0x53, 0xa1, 0x44, 0xd8, 0xcf, 0x1c, + 0xdf, 0x89, 0x53, 0xba, 0x3a, 0x10, 0xd2, 0xf6, + 0x12, 0x37, 0xdb, 0x1e, 0x95, 0x1b, 0xf8, 0x8e, + 0x49, 0xcf, 0xc0, 0x3a, 0x9b, 0x03, 0x29, 0xdd, + 0x24, 0xaa, 0x45, 0xe7, 0x1e, 0x2b, 0xcd, 0x38, + 0x7d, 0x7a, 0x43, 0xbc, 0xe0, 0xaf, 0x9b, 0xf3, + 0xfe, 0x5e, 0x33, 0xfd, 0x51, 0x7f, 0x29, 0x5b, + 0xe4, 0x8d, 0x74, 0xdd, 0xf1, 0x59, 0x36, 0x33, + 0x69, 0x27, 0xce, 0x26, 0xbc, 0x86, 0x58, 0xc3, + 0x5b, 0x19, 0xe7, 0x5a, 0xfa, 0x92, 0xe2, 0x24, + 0x73, 0xa8, 0x0e, 0xe6, 0x80, 0x14, 0x06, 0xd7, + 0x67, 0x33, 0xe7, 0x39, 0x9b, 0x72, 0x16, 0xc2, + 0xd6, 0x08, 0x2e, 0x84, 0x6c, 0x90, 0x12, 0x5c, + 0xea, 0xf8, 0x9a, 0xbb, 0xab, 0xa3, 0xf0, 0xbf, + 0xde, 0xef, 0xfe, 0xce, 0x2f, 0xac, 0xf5, 0x15, + 0x71, 0x24, 0x71, 0x6d, 0xe3, 0xdf, 0x21, 0x00, + 0x32, 0xfd, 0x85, 0xd5, 0xdc, 0x18, 0x9a, 0x93, + 0x7b, 0x4e, 0x1a, 0x6b, 0x3f, 0x75, 0xb4, 0x9f, + 0x86, 0xab, 0x62, 0xf2, 0xd8, 0xb1, 0xff, 0x00, + 0x32, 0xf3, 0x11, 0x4a, 0xff, 0x00, 0x03, 0x0f, + 0x73, 0x1c, 0x6b, 0xfa, 0xdb, 0x56, 0xec, 0xff, + 0x00, 0x36, 0x66, 0xc8, 0xe5, 0x36, 0x96, 0x99, + 0x74, 0x4d, 0x74, 0x8f, 0xab, 0x22, 0x0f, 0xf2, + 0x40, 0x60, 0x18, 0xde, 0xec, 0x3b, 0xa6, 0xab, + 0xc5, 0x9d, 0xe4, 0x5b, 0x65, 0xb3, 0x77, 0x0c, + 0xba, 0x8d, 0xb1, 0xdc, 0xc7, 0x89, 0x87, 0x0e, + 0x90, 0xd9, 0x00, 0xc4, 0xc7, 0xb6, 0xba, 0x74, + 0xae, 0xad, 0xab, 0xcf, 0x9b, 0x92, 0x7b, 0x34, + 0xb2, 0xd8, 0x8b, 0xc6, 0x4d, 0x8d, 0x98, 0x9c, + 0xe0, 0xd0, 0xc2, 0xda, 0x68, 0xd2, 0xc7, 0x6b, + 0xaf, 0x79, 0x44, 0xdb, 0xed, 0xcd, 0xd4, 0x96, + 0xe6, 0x7b, 0x3c, 0x89, 0xee, 0x8a, 0xa4, 0x3d, + 0xf1, 0x3e, 0xad, 0xa8, 0xf3, 0x62, 0x5d, 0x6d, + 0x68, 0x8b, 0xcd, 0x66, 0xf1, 0x11, 0xa7, 0xdb, + 0xb7, 0xfc, 0x58, 0x30, 0xe1, 0xcd, 0x93, 0xcb, + 0x57, 0x36, 0x3c, 0x13, 0xdd, 0xdf, 0x37, 0xf5, + 0x36, 0xcb, 0x5a, 0xc6, 0xba, 0xf8, 0x69, 0x28, + 0x4d, 0x86, 0xcf, 0x5d, 0x95, 0xe6, 0x5e, 0xc9, + 0x71, 0xe2, 0xdb, 0x5e, 0x10, 0xc7, 0x57, 0xf3, + 0x25, 0x15, 0x00, 0xf7, 0x7c, 0x92, 0xae, 0xad, + 0xd9, 0xab, 0x46, 0x6d, 0x13, 0xf3, 0xca, 0xd2, + 0xac, 0xfd, 0x95, 0x34, 0x09, 0x75, 0x3a, 0x4e, + 0x05, 0xf3, 0x2b, 0x1b, 0x19, 0xf3, 0x7c, 0xd1, + 0x96, 0xd0, 0x0c, 0x2f, 0xb8, 0x91, 0xce, 0xae, + 0xe3, 0x1a, 0x49, 0x73, 0x89, 0x34, 0x1e, 0x4a, + 0xfa, 0xec, 0xd0, 0x45, 0x35, 0xab, 0xb2, 0xf3, + 0x31, 0xc4, 0x61, 0xe6, 0xdc, 0x6b, 0x57, 0xe1, + 0x23, 0x06, 0x33, 0xc0, 0xab, 0xe5, 0xf5, 0xb5, + 0x6d, 0x13, 0x11, 0x31, 0x59, 0xd6, 0x93, 0x3c, + 0xda, 0x7f, 0x9d, 0x69, 0x87, 0x35, 0x72, 0x63, + 0xb4, 0xd2, 0xf9, 0xf1, 0x45, 0x73, 0xd6, 0x3a, + 0x7c, 0x26, 0x67, 0xdd, 0xff, 0x00, 0x87, 0xcc, + 0x76, 0xbf, 0x3b, 0xeb, 0x6c, 0xd0, 0xb6, 0x27, + 0xd6, 0xd2, 0xd6, 0xb1, 0xc3, 0xa7, 0xca, 0x3f, + 0x9c, 0xfe, 0xee, 0xa5, 0x09, 0xce, 0x49, 0x80, + 0x31, 0xce, 0x76, 0x00, 0x6a, 0xd6, 0x12, 0x70, + 0x83, 0xbe, 0x1b, 0x5a, 0x0d, 0xd5, 0xbb, 0x32, + 0xcb, 0xe7, 0xcb, 0xef, 0xa6, 0xb2, 0x9c, 0x52, + 0x58, 0x1c, 0x41, 0xec, 0x8d, 0xc7, 0x0e, 0xda, + 0xe6, 0xd7, 0xa1, 0x64, 0xbc, 0xda, 0x6f, 0x6d, + 0x7c, 0x67, 0xc5, 0xef, 0xf9, 0x6c, 0x38, 0x71, + 0x61, 0xc7, 0x4c, 0x5a, 0x4d, 0x2b, 0x11, 0xb2, + 0x7c, 0x75, 0xf7, 0xbd, 0xf3, 0xd2, 0x53, 0x00, + 0x7b, 0xb9, 0xb0, 0x6a, 0xd6, 0xd4, 0xe1, 0x07, + 0x7f, 0x0d, 0x69, 0xdd, 0x59, 0xe7, 0xe7, 0x2e, + 0x73, 0xb9, 0xe7, 0x97, 0x3c, 0x61, 0x73, 0x8b, + 0xcd, 0x5c, 0x37, 0x89, 0xaa, 0xd4, 0x80, 0x57, + 0x42, 0xae, 0xb3, 0xcd, 0xdb, 0xb7, 0x5f, 0x1d, + 0xb1, 0x33, 0xac, 0xcf, 0xcd, 0xd5, 0x1e, 0x59, + 0x99, 0x4a, 0xc1, 0x24, 0x56, 0xb2, 0xba, 0x27, + 0x53, 0x0b, 0xda, 0xc7, 0x16, 0x9e, 0xd1, 0xa2, + 0xe9, 0xca, 0xed, 0xae, 0x2d, 0x73, 0xbb, 0x06, + 0xdc, 0xc6, 0xe8, 0x49, 0x9e, 0x32, 0x03, 0xc1, + 0x6e, 0x8c, 0x5a, 0xf4, 0xab, 0x76, 0x43, 0xb7, + 0x39, 0x36, 0x5d, 0x93, 0xda, 0xd9, 0x4f, 0xce, + 0x99, 0x6d, 0xe3, 0x0c, 0x7d, 0x1b, 0x51, 0x5a, + 0xee, 0x15, 0x19, 0x9d, 0xe7, 0xb6, 0x59, 0xde, + 0xd2, 0x65, 0x53, 0xd9, 0xe2, 0xc1, 0x1b, 0x98, + 0xc7, 0x63, 0x14, 0x35, 0xe7, 0x2a, 0xbb, 0xf6, + 0xb1, 0xc4, 0x56, 0xd1, 0x7d, 0x66, 0x66, 0xbc, + 0x1e, 0x5c, 0x79, 0xbf, 0x37, 0x7c, 0x99, 0x70, + 0xe4, 0xf2, 0xd3, 0x4c, 0x5a, 0x64, 0x8e, 0xef, + 0xba, 0x3c, 0x17, 0x4c, 0xc2, 0xf0, 0x41, 0xb4, + 0xb9, 0x5c, 0x75, 0xa3, 0x6e, 0x22, 0xb9, 0x8c, + 0xf6, 0xc7, 0x36, 0xf1, 0xf5, 0x54, 0x1d, 0x9e, + 0x54, 0x23, 0xfc, 0x45, 0xb9, 0x9a, 0x9e, 0x23, + 0x22, 0x75, 0xc8, 0xd1, 0xa0, 0x99, 0x03, 0x59, + 0xe1, 0x25, 0x6c, 0xdb, 0x5b, 0x9f, 0x62, 0xce, + 0xb2, 0x2b, 0xa3, 0xaa, 0x39, 0x64, 0x27, 0xb5, + 0x8a, 0x20, 0x7c, 0x2a, 0xd0, 0xf8, 0x2d, 0xe2, + 0xb9, 0x97, 0x30, 0x23, 0xc6, 0xe6, 0x83, 0x5c, + 0xef, 0xea, 0xc7, 0x8d, 0xdf, 0xde, 0x5a, 0xb8, + 0x5a, 0xf3, 0x13, 0xfa, 0x96, 0x89, 0xff, 0x00, + 0x07, 0x81, 0x5b, 0xdb, 0x0f, 0x97, 0xa5, 0xa3, + 0xff, 0x00, 0xf5, 0xe0, 0xbe, 0x2f, 0x85, 0xa2, + 0xe8, 0xec, 0x9a, 0xef, 0xda, 0x73, 0x3c, 0xe0, + 0xd7, 0xc4, 0x8a, 0xe1, 0xb0, 0xb6, 0xbf, 0xd4, + 0x8d, 0xa0, 0xf7, 0xd7, 0xcd, 0xf2, 0x7c, 0x9d, + 0xf9, 0xce, 0x7c, 0x6d, 0x05, 0x79, 0xbe, 0x75, + 0xce, 0x9d, 0xc3, 0x72, 0x30, 0xe3, 0x5e, 0x56, + 0xa5, 0x71, 0xfc, 0x3e, 0x99, 0xd7, 0x56, 0xd9, + 0x84, 0xee, 0x35, 0x32, 0xdd, 0x39, 0xe4, 0xf9, + 0xc2, 0xab, 0x9f, 0x60, 0x24, 0xb2, 0x87, 0xac, + 0xa5, 0x96, 0x46, 0x47, 0x29, 0x9f, 0x08, 0x2e, + 0x70, 0x69, 0x2d, 0x15, 0x3a, 0x2b, 0xd9, 0x5c, + 0xad, 0x11, 0x7e, 0xd6, 0xe9, 0xd3, 0x74, 0xda, + 0xdf, 0xfa, 0x37, 0x62, 0xbd, 0xbc, 0xa7, 0xae, + 0x8a, 0x7d, 0xf5, 0xae, 0x0c, 0x75, 0x8f, 0xf5, + 0x5a, 0xbe, 0x3f, 0x83, 0xb2, 0xf7, 0x37, 0x67, + 0xc5, 0x59, 0x5e, 0x47, 0x67, 0xa2, 0xde, 0xd0, + 0xd6, 0x56, 0xb7, 0x56, 0x3c, 0x34, 0x6b, 0x7f, + 0xb0, 0xd5, 0x01, 0xf8, 0x97, 0xfc, 0xf2, 0x2f, + 0xfc, 0x66, 0x7d, 0x79, 0x15, 0xbe, 0xcf, 0x24, + 0xd9, 0x98, 0xf3, 0x26, 0xdf, 0x5b, 0x96, 0xba, + 0xf8, 0xb9, 0xcf, 0x0f, 0xe7, 0x4b, 0x9c, 0x5c, + 0xed, 0x27, 0x46, 0x25, 0x1f, 0xb7, 0x99, 0x76, + 0x55, 0x35, 0x84, 0xf7, 0xd3, 0x06, 0xfb, 0x7c, + 0x71, 0xb5, 0xb0, 0x92, 0xfa, 0x3a, 0x81, 0xdb, + 0x8c, 0xee, 0x95, 0x39, 0x6b, 0x33, 0x8e, 0xfc, + 0x63, 0xc7, 0x58, 0xd3, 0xdc, 0xe7, 0xe4, 0xbc, + 0xc6, 0x1c, 0x7e, 0x73, 0xcb, 0xec, 0xad, 0xfe, + 0xc9, 0xc5, 0x33, 0x68, 0xe3, 0x6c, 0x99, 0x35, + 0xe3, 0xf0, 0x7c, 0xcb, 0x71, 0x61, 0x64, 0xd6, + 0xab, 0x0b, 0x0b, 0xea, 0xe3, 0xc0, 0x44, 0x45, + 0x20, 0x88, 0x88, 0x08, 0x88, 0x80, 0xb2, 0x35, + 0xac, 0x2c, 0x8d, 0x68, 0x03, 0x58, 0x5f, 0x6f, + 0xb1, 0xfe, 0x57, 0x6b, 0xf6, 0x51, 0xfd, 0x50, + 0xbe, 0x20, 0x35, 0x8e, 0xd2, 0xfb, 0x85, 0x9f, + 0xf2, 0xcb, 0x5f, 0xb2, 0x67, 0xd5, 0x0b, 0x4f, + 0x93, 0xfb, 0xac, 0xf9, 0xff, 0x00, 0xee, 0x3f, + 0xb3, 0x07, 0xed, 0x5f, 0xf4, 0x55, 0xb0, 0x6b, + 0x55, 0xf7, 0x79, 0x47, 0xb6, 0x55, 0x80, 0x6b, + 0x55, 0xf7, 0x79, 0x47, 0xb6, 0x56, 0xd7, 0xcd, + 0xb0, 0xbd, 0x45, 0xfb, 0x56, 0x79, 0xcd, 0xf0, + 0x85, 0xe5, 0x7a, 0x8b, 0xf6, 0xac, 0xf3, 0x9b, + 0xe1, 0x08, 0x39, 0x36, 0xcb, 0xf9, 0x9c, 0x7f, + 0x62, 0x3e, 0xb3, 0x94, 0x0a, 0x9e, 0xdb, 0x23, + 0xfe, 0x67, 0x1f, 0xd8, 0x8f, 0xac, 0xe5, 0x02, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x82, 0x7e, 0xd5, 0x91, 0xe6, 0xd9, + 0x13, 0x32, 0xf8, 0xa4, 0x6b, 0x2e, 0xad, 0x5e, + 0x5c, 0xc6, 0xb8, 0xd3, 0x10, 0x24, 0x9a, 0x8e, + 0x15, 0xb3, 0x2e, 0xb4, 0x39, 0x0c, 0x73, 0xde, + 0x5f, 0x3d, 0x82, 0x47, 0x46, 0x59, 0x0c, 0x4d, + 0x70, 0x71, 0x24, 0x9a, 0xee, 0x2a, 0xe7, 0xe5, + 0xf9, 0x51, 0x64, 0x9a, 0xeb, 0xa9, 0xed, 0xeb, + 0x41, 0x61, 0xc9, 0x62, 0x8e, 0x7c, 0x86, 0xfa, + 0x29, 0x1e, 0x23, 0x12, 0x48, 0x06, 0x33, 0xa9, + 0xae, 0x20, 0x53, 0xb8, 0x96, 0x76, 0x8f, 0xc8, + 0xad, 0x6e, 0xee, 0xae, 0xde, 0xc1, 0x2c, 0xac, + 0xe6, 0xa0, 0x63, 0x5d, 0x88, 0x92, 0x7f, 0x39, + 0x70, 0xda, 0x5f, 0x5a, 0xc5, 0x91, 0xde, 0x59, + 0x3c, 0x9e, 0x7e, 0x77, 0x03, 0x1b, 0x68, 0x48, + 0xd1, 0x4d, 0xde, 0xe2, 0x8b, 0x24, 0xd0, 0x56, + 0xa6, 0x9b, 0xfa, 0x50, 0x37, 0x09, 0x3b, 0xba, + 0x4f, 0x6c, 0xa9, 0xed, 0x9f, 0x8c, 0x5c, 0xe5, + 0x99, 0x8d, 0x9b, 0x5e, 0xd6, 0x4f, 0x2e, 0x0c, + 0x01, 0xc6, 0x9a, 0x86, 0xb5, 0x02, 0x94, 0xd1, + 0xbd, 0xa7, 0x47, 0x69, 0x05, 0x86, 0xc6, 0x01, + 0x2e, 0x5f, 0x75, 0x90, 0xc8, 0xf6, 0x32, 0xe6, + 0x27, 0x89, 0x21, 0xd2, 0x30, 0xb8, 0x80, 0x34, + 0x03, 0xdc, 0x59, 0xb6, 0xb7, 0x76, 0x47, 0x96, + 0xde, 0x4f, 0x78, 0xe6, 0x8b, 0x9b, 0x96, 0xf3, + 0x51, 0x46, 0x1c, 0x1c, 0xed, 0x35, 0x15, 0xd1, + 0xd9, 0x2a, 0xba, 0x40, 0xdc, 0xae, 0x8d, 0xdd, + 0xd5, 0x92, 0x5c, 0xe3, 0x52, 0x6b, 0xdb, 0xa9, + 0x41, 0x8d, 0x5a, 0x0e, 0xb0, 0xbd, 0xc1, 0xfb, + 0x68, 0xfc, 0xf1, 0xe1, 0x0b, 0xc2, 0x50, 0x1d, + 0x7b, 0xba, 0xf7, 0x74, 0x20, 0x98, 0xda, 0xb7, + 0x35, 0xd9, 0xb9, 0x2d, 0x21, 0xc3, 0x9b, 0x66, + 0x90, 0x6b, 0xbe, 0xa1, 0xd0, 0x00, 0x3e, 0x4a, + 0x0a, 0x70, 0xa6, 0xbd, 0x08, 0x27, 0x24, 0x73, + 0x4e, 0xc8, 0xc6, 0xc0, 0x46, 0x3e, 0x7f, 0x55, + 0x74, 0xeb, 0x3a, 0x54, 0x85, 0xbd, 0xf4, 0x3f, + 0x0d, 0x1b, 0xa2, 0x41, 0xb8, 0x8a, 0x27, 0x5b, + 0x82, 0x48, 0xad, 0x0b, 0xb0, 0x81, 0xc0, 0xaa, + 0x54, 0xdd, 0x23, 0x8d, 0x66, 0x83, 0x7a, 0xb4, + 0xd5, 0xdd, 0x41, 0x3b, 0x64, 0xe0, 0x36, 0x5a, + 0xf9, 0xa4, 0x80, 0xf2, 0xf6, 0x9a, 0x57, 0x49, + 0xd2, 0xde, 0x25, 0xd3, 0xec, 0x32, 0x66, 0x1b, + 0x3b, 0x63, 0x0c, 0x32, 0x46, 0xd9, 0x23, 0x2e, + 0x71, 0x0f, 0x75, 0x37, 0x5c, 0xab, 0x34, 0xd3, + 0x5a, 0x69, 0xdf, 0x58, 0x2d, 0x07, 0x70, 0x20, + 0xb3, 0x58, 0x5b, 0x41, 0x90, 0x36, 0x6b, 0xbb, + 0xa9, 0xe3, 0x7c, 0xee, 0x66, 0x08, 0xa2, 0x8c, + 0xd4, 0xaa, 0xd9, 0x35, 0x24, 0xef, 0x9a, 0xaf, + 0x20, 0x0d, 0x1a, 0x29, 0x4d, 0x5a, 0x16, 0x50, + 0x4e, 0xd9, 0x39, 0xa3, 0x65, 0x6f, 0x9b, 0x88, + 0x62, 0x32, 0x02, 0x1b, 0x5d, 0x3a, 0xd8, 0xa0, + 0x96, 0x29, 0xa6, 0xbb, 0xbb, 0xff, 0x00, 0x90, + 0x59, 0x41, 0x3b, 0x76, 0xf6, 0x7c, 0x35, 0x60, + 0x2a, 0x09, 0x6c, 0xa4, 0x90, 0x0e, 0x9a, 0x55, + 0xc5, 0x74, 0x67, 0xb9, 0x74, 0xd9, 0xac, 0xf1, + 0x5d, 0xda, 0xc8, 0xc3, 0x68, 0x63, 0x00, 0xbc, + 0xbc, 0x37, 0x00, 0x15, 0x27, 0x42, 0xac, 0xd0, + 0x6f, 0x0e, 0xd8, 0x14, 0x5e, 0x81, 0x20, 0x52, + 0xa6, 0x9b, 0xdb, 0x88, 0x2c, 0xf9, 0xa3, 0x6d, + 0x30, 0x65, 0x97, 0x2f, 0x2c, 0xb8, 0xb0, 0x81, + 0xa2, 0x29, 0x5c, 0x0e, 0x82, 0x34, 0x37, 0x10, + 0x6e, 0xbd, 0xc5, 0xa1, 0xd9, 0x05, 0xc3, 0x73, + 0x46, 0xdd, 0x59, 0x3e, 0x36, 0x59, 0xe3, 0x0f, + 0x64, 0xad, 0x78, 0x18, 0x5b, 0xac, 0x8a, 0x6b, + 0x2a, 0xbb, 0xf9, 0x01, 0xbd, 0xd8, 0x5e, 0x81, + 0x70, 0x18, 0x41, 0x34, 0x3a, 0x69, 0x53, 0x44, + 0x16, 0xbb, 0x3b, 0xcb, 0x6b, 0x8d, 0xa4, 0xbc, + 0x9a, 0x37, 0x8e, 0x6c, 0x41, 0x83, 0x15, 0x40, + 0x04, 0xb6, 0x95, 0x50, 0xbb, 0x36, 0x43, 0x73, + 0x9b, 0x52, 0xe2, 0x00, 0x18, 0xaa, 0x4f, 0x98, + 0xe1, 0xe1, 0x51, 0xa7, 0x4e, 0xb1, 0xa3, 0x56, + 0xe5, 0x53, 0xb9, 0xa7, 0xf2, 0xed, 0x20, 0xdf, + 0x98, 0x90, 0x73, 0x0b, 0x92, 0x34, 0x83, 0x2b, + 0xe8, 0x7f, 0xb4, 0x56, 0x84, 0xa5, 0x34, 0x04, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x05, 0x29, 0xb3, 0x5f, 0xce, 0xed, 0xbf, 0xb5, + 0xf5, 0x0a, 0x8b, 0x52, 0x9b, 0x35, 0xfc, 0xee, + 0xdb, 0xfb, 0x5f, 0x50, 0xa0, 0x9b, 0xcc, 0x3d, + 0xf6, 0x6f, 0x3b, 0xe4, 0x0b, 0x9d, 0x74, 0x66, + 0x1e, 0xfb, 0x37, 0x9d, 0xf2, 0x05, 0xce, 0x80, + 0x8d, 0xf2, 0x87, 0xe5, 0xba, 0x88, 0xdf, 0x28, + 0x7e, 0x5b, 0xa8, 0x35, 0x6d, 0x9f, 0xbc, 0x5b, + 0x7d, 0x91, 0xf0, 0xaa, 0xea, 0xb1, 0x6d, 0x9f, + 0xbc, 0x5b, 0x7d, 0x91, 0xf0, 0xaa, 0xea, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x94, + 0xd9, 0x9f, 0xe7, 0x56, 0xff, 0x00, 0xda, 0xfa, + 0xa5, 0x67, 0x32, 0xce, 0x33, 0x56, 0x5f, 0x5c, + 0xc4, 0xdb, 0x99, 0x1a, 0xc6, 0xc8, 0xe6, 0xb5, + 0xad, 0x34, 0x00, 0x03, 0xd8, 0x5c, 0x99, 0x65, + 0xf0, 0xb0, 0xbd, 0x8e, 0xeb, 0x07, 0x39, 0xcd, + 0xe2, 0xab, 0x2b, 0x86, 0xb5, 0x04, 0x6b, 0xd2, + 0xb5, 0x5d, 0x4f, 0xed, 0x17, 0x32, 0xcf, 0x4c, + 0x3c, 0xeb, 0x8b, 0xb0, 0xd6, 0xb4, 0xaf, 0x67, + 0x42, 0x09, 0x0d, 0x9a, 0x2e, 0x76, 0x79, 0x0b, + 0x9e, 0x49, 0x73, 0x8b, 0xdc, 0x5c, 0x4d, 0x49, + 0x38, 0x5d, 0xad, 0x73, 0xca, 0xe0, 0xcc, 0xe9, + 0xce, 0x76, 0xa1, 0x71, 0xa7, 0x96, 0xbc, 0x65, + 0x77, 0xde, 0xc1, 0x7c, 0xcb, 0xb2, 0xce, 0x73, + 0x9b, 0xc5, 0x46, 0xd6, 0x9a, 0xc5, 0x16, 0x9b, + 0x99, 0x8c, 0xf7, 0x12, 0xce, 0x06, 0x01, 0x23, + 0xcb, 0xc3, 0x6b, 0xa4, 0x55, 0x05, 0x8f, 0x3f, + 0xce, 0x5f, 0x65, 0x99, 0x3e, 0x2f, 0x65, 0x82, + 0x56, 0x86, 0xb5, 0xc2, 0x49, 0x1b, 0x89, 0xda, + 0x96, 0x6d, 0xee, 0x6f, 0xe6, 0xce, 0x72, 0xd7, + 0x5f, 0x43, 0x1c, 0x0d, 0x2d, 0x79, 0x84, 0x46, + 0x75, 0xb5, 0xcd, 0x14, 0xd1, 0x53, 0x45, 0xc2, + 0x73, 0xab, 0x0b, 0xa6, 0x44, 0x73, 0x2b, 0x43, + 0x3c, 0xf0, 0x80, 0x1b, 0x2b, 0x5d, 0x84, 0x38, + 0x0d, 0x58, 0x82, 0xe2, 0xbd, 0xcd, 0xae, 0x6e, + 0xaf, 0x99, 0x7a, 0x29, 0x1b, 0xa1, 0xa7, 0x32, + 0xc6, 0xea, 0x68, 0x1b, 0x88, 0x31, 0x98, 0xc5, + 0x23, 0xf3, 0x7b, 0x88, 0x40, 0xac, 0x8f, 0x99, + 0xc1, 0xa3, 0x56, 0x92, 0x74, 0x29, 0x5d, 0x9f, + 0xb3, 0x9a, 0xcb, 0x39, 0x9e, 0xde, 0x6a, 0x07, + 0xb2, 0x17, 0x57, 0x09, 0xa8, 0xd3, 0x42, 0xb5, + 0x3b, 0x3e, 0xcb, 0x5f, 0x38, 0xbf, 0x7d, 0x85, + 0x6f, 0xc0, 0xf2, 0xb1, 0xf8, 0x85, 0xc3, 0x76, + 0x8b, 0x96, 0xcb, 0x3a, 0x92, 0xdf, 0x30, 0x9a, + 0xfe, 0x66, 0x73, 0xd2, 0x4c, 0xd7, 0x34, 0x80, + 0x70, 0x8f, 0x1a, 0x9a, 0xb4, 0x1d, 0x48, 0x3d, + 0xe5, 0xf7, 0x19, 0xa6, 0x5f, 0x04, 0xd7, 0xb0, + 0x31, 0xae, 0xb3, 0x2f, 0x2c, 0x94, 0x3c, 0x82, + 0xd2, 0xea, 0xd3, 0xc9, 0x1e, 0x32, 0xeb, 0x92, + 0x3c, 0xb7, 0x37, 0xcb, 0xae, 0x6e, 0xe1, 0xb7, + 0x16, 0x97, 0x36, 0xa0, 0x3d, 0xe1, 0xa7, 0xc5, + 0x35, 0xd3, 0xfd, 0xd5, 0xc1, 0x96, 0xe6, 0xcd, + 0xb5, 0x8e, 0x6b, 0x5b, 0x88, 0x45, 0xc5, 0xa5, + 0xc1, 0xab, 0xe3, 0xad, 0x08, 0x3b, 0xe0, 0xad, + 0xb7, 0x19, 0xc5, 0xab, 0x2c, 0xa4, 0xb2, 0xcb, + 0x6d, 0xbd, 0x9e, 0x39, 0xc8, 0xe7, 0x5e, 0xf7, + 0x62, 0x71, 0x1b, 0xc8, 0x3a, 0xee, 0xdc, 0x06, + 0x4d, 0x92, 0x12, 0x74, 0x09, 0x1a, 0x78, 0x17, + 0x3e, 0xd6, 0x02, 0x33, 0x87, 0xbb, 0x71, 0xcc, + 0x65, 0x38, 0x17, 0x25, 0xde, 0x65, 0xed, 0x19, + 0x75, 0xad, 0x90, 0x8c, 0xb0, 0xda, 0xd7, 0xf5, + 0x95, 0xd7, 0xa3, 0xb4, 0xba, 0xfa, 0xe6, 0xc2, + 0xe6, 0x28, 0x9b, 0x99, 0x5a, 0x19, 0xe5, 0x80, + 0x06, 0xb6, 0x46, 0xbb, 0x0e, 0x20, 0x3e, 0x72, + 0x0e, 0xdb, 0x8f, 0x12, 0xcf, 0x21, 0x63, 0xbc, + 0xac, 0x4c, 0x24, 0x6f, 0x68, 0x51, 0x9b, 0x4b, + 0xfc, 0xea, 0xe7, 0xb6, 0xdf, 0xa8, 0xd5, 0xe6, + 0xf3, 0x38, 0x7d, 0xd6, 0x61, 0x0d, 0xd3, 0x98, + 0x1b, 0x15, 0xb9, 0x6f, 0x37, 0x08, 0x3f, 0x9a, + 0xd3, 0xbe, 0xb4, 0x66, 0x77, 0xbe, 0xdf, 0x7b, + 0x25, 0xd0, 0x67, 0x36, 0x24, 0xa7, 0x88, 0x4d, + 0x69, 0x40, 0x06, 0xf2, 0x09, 0x2d, 0xac, 0xf7, + 0xdb, 0x7f, 0xfc, 0x76, 0x78, 0x5c, 0xa3, 0xf2, + 0x69, 0x5b, 0x16, 0x6d, 0x68, 0xf7, 0x1a, 0x0e, + 0x74, 0x02, 0x4f, 0x64, 0x10, 0xbd, 0x66, 0xf9, + 0x90, 0xcc, 0xa7, 0x8e, 0x61, 0x19, 0x8b, 0x9b, + 0x8c, 0x47, 0x84, 0x9c, 0x55, 0xc2, 0x49, 0xae, + 0xae, 0xca, 0xe1, 0xd2, 0x08, 0x20, 0xd0, 0x82, + 0x08, 0xed, 0xa0, 0x92, 0xda, 0x28, 0x9d, 0x1e, + 0x73, 0x72, 0x0f, 0xe7, 0x3b, 0x18, 0xed, 0x10, + 0x0a, 0xec, 0xd1, 0x0e, 0xc8, 0x10, 0xed, 0x77, + 0x13, 0x78, 0xa3, 0xba, 0x34, 0xfd, 0x15, 0xaf, + 0xaf, 0x2c, 0x2e, 0xa3, 0x60, 0xcc, 0xec, 0xf9, + 0xf9, 0x63, 0x14, 0x12, 0xb4, 0xd0, 0x9a, 0x7c, + 0xe5, 0xc9, 0x9a, 0xe6, 0xae, 0xcc, 0x0b, 0x23, + 0x6c, 0x62, 0x1b, 0x68, 0x45, 0x23, 0x88, 0x6a, + 0x08, 0x3b, 0xfa, 0xce, 0xfb, 0x2d, 0x64, 0x76, + 0x59, 0xad, 0xb3, 0x2e, 0x21, 0x2d, 0xc4, 0xd6, + 0xb8, 0x82, 0xe0, 0xdf, 0x38, 0x55, 0x75, 0xc1, + 0x67, 0x63, 0x06, 0x6b, 0x96, 0xdf, 0x5a, 0x02, + 0xc8, 0x6f, 0x31, 0x52, 0x33, 0xb8, 0x70, 0xee, + 0x28, 0xee, 0xb9, 0xb1, 0xba, 0xb7, 0x8a, 0x2c, + 0xd2, 0xd4, 0xcf, 0x24, 0x0d, 0xc2, 0xc9, 0x5a, + 0xe2, 0xd2, 0x47, 0x65, 0x68, 0xbf, 0xce, 0x65, + 0xb8, 0xb9, 0x82, 0x48, 0x1a, 0x2d, 0xe3, 0xb4, + 0xa7, 0xb3, 0xb0, 0x69, 0xa5, 0x37, 0xd0, 0x6b, + 0xcc, 0xe3, 0x91, 0xf9, 0xc5, 0xc4, 0x6d, 0x15, + 0x7c, 0x93, 0xb8, 0x30, 0x1d, 0xf7, 0x3b, 0x42, + 0x94, 0xd9, 0xfb, 0x39, 0xac, 0xb3, 0xb9, 0x6d, + 0xa7, 0x00, 0x48, 0xd8, 0x49, 0x20, 0x1a, 0x8d, + 0x20, 0x15, 0xa9, 0xd9, 0xee, 0x5a, 0xf9, 0xc5, + 0xf4, 0x96, 0x15, 0xbe, 0x1a, 0x71, 0x07, 0x78, + 0x85, 0xc3, 0x51, 0x2d, 0x5c, 0xd6, 0x59, 0xdc, + 0x96, 0xf9, 0x8c, 0xb7, 0xf3, 0x33, 0x9d, 0x7c, + 0xc1, 0xc1, 0xcd, 0x07, 0x0e, 0xbd, 0x5b, 0xfa, + 0x82, 0x0e, 0xbc, 0x8f, 0xf9, 0x7e, 0x6f, 0xe6, + 0x7c, 0x8e, 0x5e, 0x21, 0xff, 0x00, 0x48, 0x4e, + 0x45, 0x3d, 0xe0, 0x52, 0xbd, 0xa6, 0x2e, 0x3b, + 0x1c, 0xcc, 0x5a, 0x5b, 0xde, 0x40, 0x63, 0xc7, + 0xed, 0x6d, 0xc3, 0x8b, 0x15, 0x30, 0xeb, 0xfe, + 0xae, 0x9d, 0x6b, 0x0c, 0xcc, 0x43, 0x72, 0x79, + 0x32, 0xce, 0x6e, 0xa6, 0x49, 0x04, 0x9c, 0xed, + 0x69, 0x4d, 0x00, 0x53, 0x0d, 0x3b, 0x08, 0x24, + 0x27, 0x8e, 0xc3, 0x25, 0xb4, 0xb6, 0x7f, 0xb3, + 0xb6, 0xea, 0xee, 0xe1, 0xbc, 0xe1, 0x74, 0xb5, + 0x2d, 0x02, 0x9b, 0x81, 0x7a, 0xce, 0xae, 0x24, + 0xb9, 0xc8, 0x2c, 0x26, 0x93, 0x08, 0x7c, 0x92, + 0x38, 0x90, 0xd1, 0x41, 0x4a, 0x3e, 0x80, 0x2e, + 0x71, 0x9d, 0x59, 0x5c, 0x59, 0xc3, 0x0e, 0x65, + 0x69, 0xcf, 0xcb, 0x6e, 0x30, 0xc6, 0xf6, 0xbb, + 0x0e, 0x80, 0x37, 0x68, 0xbc, 0xde, 0xe7, 0x91, + 0x5e, 0xe5, 0xfe, 0xcb, 0x2d, 0xa8, 0x6b, 0xa3, + 0x24, 0xdb, 0x96, 0x1a, 0x35, 0x9b, 0x80, 0x61, + 0xa6, 0x9a, 0x35, 0x06, 0xec, 0xe0, 0xff, 0x00, + 0xf5, 0xfc, 0xaf, 0xb4, 0xed, 0x1d, 0xc2, 0xb3, + 0xb5, 0x3e, 0x33, 0x72, 0xf7, 0x83, 0xe2, 0x98, + 0x0d, 0x0f, 0x25, 0x69, 0x8f, 0x3a, 0xb6, 0x76, + 0x5a, 0xcb, 0x1b, 0xbb, 0x41, 0x39, 0x84, 0x11, + 0x14, 0x98, 0xb5, 0x54, 0x68, 0x34, 0xc2, 0xbc, + 0xdb, 0xe6, 0xf6, 0xcf, 0xb2, 0x65, 0x96, 0x65, + 0x6e, 0x6e, 0x23, 0x84, 0xd6, 0x27, 0xb5, 0xd8, + 0x5c, 0x3b, 0x08, 0x37, 0xc8, 0x43, 0x76, 0x3d, + 0xa0, 0xe8, 0x32, 0x4f, 0x56, 0x8e, 0xef, 0xf4, + 0x26, 0xd7, 0x7f, 0x30, 0x87, 0xec, 0x1b, 0xe1, + 0x72, 0xe3, 0xcd, 0x73, 0x5f, 0x6d, 0x64, 0x76, + 0xf0, 0x47, 0xec, 0xf6, 0xb0, 0x68, 0x8e, 0x30, + 0x74, 0xf6, 0xc9, 0x5e, 0x73, 0x7c, 0xcc, 0x66, + 0x53, 0xb2, 0x61, 0x19, 0x8b, 0x03, 0x03, 0x08, + 0x26, 0xb5, 0xa6, 0xee, 0xa4, 0x1c, 0x28, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0xbb, 0xb2, + 0x3f, 0xe7, 0x16, 0x9f, 0x69, 0xf2, 0x15, 0xc2, + 0xbb, 0xb2, 0x3f, 0xe7, 0x16, 0x9f, 0x69, 0xf2, + 0x14, 0x16, 0x3c, 0xd3, 0xdf, 0x64, 0xee, 0x78, + 0x17, 0x2a, 0xea, 0xcd, 0x3d, 0xf5, 0xfd, 0xcf, + 0x02, 0xe5, 0x41, 0xee, 0xdf, 0xde, 0x23, 0xf3, + 0x9b, 0xe1, 0x53, 0xca, 0x06, 0xdf, 0xde, 0x23, + 0xf3, 0x9b, 0xe1, 0x53, 0xc8, 0x0a, 0x2f, 0x37, + 0xf7, 0x9b, 0x2f, 0x3f, 0xe5, 0x0a, 0x51, 0x45, + 0xe6, 0xfe, 0xf3, 0x65, 0xe7, 0xfc, 0xa1, 0x03, + 0x28, 0xf7, 0x9b, 0xdf, 0xb4, 0x3f, 0x58, 0xa9, + 0x45, 0x17, 0x94, 0x7b, 0xcd, 0xef, 0xda, 0x1f, + 0xac, 0x54, 0xa2, 0x02, 0x22, 0x20, 0xf4, 0xdf, + 0x24, 0xaf, 0x87, 0x5e, 0xfb, 0xe5, 0xc7, 0xda, + 0xbf, 0xeb, 0x15, 0xf7, 0x16, 0xf9, 0x25, 0x7c, + 0x3a, 0xf7, 0xdf, 0x2e, 0x3e, 0xd5, 0xff, 0x00, + 0x58, 0xac, 0x9e, 0x6f, 0xc2, 0x8f, 0xa0, 0xfe, + 0xdb, 0xfb, 0xfc, 0xc7, 0xc3, 0x1f, 0xf9, 0xb4, + 0xa2, 0x22, 0xc8, 0xfa, 0x41, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x06, 0xc8, + 0x67, 0x92, 0x09, 0x99, 0x3c, 0x2e, 0x2c, 0x92, + 0x37, 0x07, 0xb1, 0xc3, 0x5b, 0x48, 0xd4, 0x57, + 0xd1, 0x72, 0xcd, 0xbc, 0xc9, 0x2f, 0xed, 0x5b, + 0x06, 0x72, 0xd1, 0x04, 0xd4, 0xa4, 0x82, 0x46, + 0xe3, 0x89, 0xd4, 0xdd, 0x04, 0xd6, 0x95, 0x5f, + 0x36, 0x5e, 0x85, 0x06, 0x95, 0x7c, 0x79, 0x6d, + 0x8f, 0x5d, 0x3d, 0xbe, 0x2c, 0x7e, 0x77, 0xf9, + 0x7e, 0x2f, 0x35, 0x15, 0xdf, 0xf4, 0xda, 0x9a, + 0xcc, 0x5e, 0xbc, 0x26, 0x35, 0x7d, 0x32, 0xf3, + 0x6e, 0x36, 0x73, 0x2d, 0xb6, 0x2c, 0xcb, 0x1a, + 0x26, 0x92, 0x9e, 0x24, 0x51, 0x33, 0x04, 0x7d, + 0xb7, 0x3b, 0x42, 0xf9, 0xcd, 0xdd, 0xed, 0xc5, + 0xe5, 0xdc, 0x97, 0xb3, 0x3c, 0x99, 0xe6, 0x79, + 0x7b, 0x8e, 0xf1, 0x3a, 0xa9, 0xd8, 0x0b, 0x41, + 0x20, 0xe8, 0xa2, 0xc5, 0x0a, 0x9c, 0x99, 0xad, + 0x7d, 0x3d, 0x91, 0x1e, 0xc8, 0x57, 0xc9, 0xff, + 0x00, 0x2d, 0xc3, 0xe5, 0x77, 0x4d, 0x35, 0xc9, + 0x6b, 0xf8, 0xde, 0xd3, 0xc5, 0xf4, 0x3c, 0xab, + 0x6d, 0xf2, 0x5b, 0xfc, 0xbf, 0xd8, 0xb3, 0xe0, + 0x1b, 0x25, 0x30, 0xc8, 0x64, 0x6e, 0x28, 0xe4, + 0x03, 0x53, 0xbb, 0x0e, 0x59, 0xcc, 0x36, 0xcf, + 0x21, 0xca, 0xec, 0x1d, 0x6b, 0x90, 0xb5, 0xaf, + 0x94, 0xf9, 0x02, 0x26, 0xe1, 0x8d, 0xa4, 0xfe, + 0x73, 0xbb, 0x8b, 0xe7, 0x80, 0x8d, 0x44, 0x55, + 0x0b, 0x95, 0xbd, 0x4d, 0xf4, 0xd3, 0x48, 0xd7, + 0xc3, 0x57, 0x0f, 0xe8, 0xbe, 0x5b, 0xb9, 0xbb, + 0x7d, 0xa2, 0x9b, 0xbb, 0x93, 0x87, 0x5f, 0xa3, + 0x5f, 0x82, 0x6b, 0x65, 0xb3, 0x5b, 0x6c, 0xbb, + 0x3d, 0x66, 0x61, 0x7d, 0x23, 0x84, 0x74, 0x90, + 0xbd, 0xf4, 0x2e, 0x25, 0xcf, 0x07, 0x71, 0xb5, + 0xd6, 0x4a, 0xf7, 0xb6, 0x59, 0xbd, 0x8e, 0x6f, + 0x9b, 0xfb, 0x55, 0x8b, 0x9c, 0xf8, 0xb9, 0xa6, + 0xb2, 0xae, 0x69, 0x69, 0xa8, 0xae, 0xe3, 0xbb, + 0x6a, 0x08, 0x3b, 0x7f, 0x4a, 0x03, 0xa6, 0xab, + 0x9f, 0x72, 0x76, 0x6c, 0xf6, 0x6b, 0xab, 0x64, + 0x79, 0x4c, 0x7e, 0xa6, 0x3c, 0xcd, 0x66, 0x62, + 0xd1, 0x4e, 0xd6, 0x9e, 0xc8, 0xaf, 0xc1, 0x62, + 0xd8, 0x9c, 0xfe, 0xd3, 0x25, 0xcc, 0x24, 0x75, + 0xe1, 0x2d, 0x82, 0xe2, 0x30, 0xc2, 0xf0, 0x2b, + 0x85, 0xcd, 0x75, 0x5a, 0x4d, 0x37, 0x17, 0x76, + 0xdb, 0x66, 0x9b, 0x3b, 0x79, 0x0b, 0x24, 0xcb, + 0x5c, 0xc3, 0x7c, 0x66, 0x12, 0x4b, 0x24, 0x6d, + 0xa1, 0x70, 0x00, 0xe9, 0x2e, 0xdd, 0xd3, 0x45, + 0x4f, 0x3a, 0xd0, 0x10, 0x05, 0x06, 0xad, 0xe5, + 0x68, 0xcd, 0x31, 0x4d, 0x9a, 0x70, 0x73, 0xbf, + 0xf2, 0xea, 0x5b, 0xcd, 0xc7, 0x9a, 0xdd, 0x35, + 0xb4, 0x46, 0x93, 0x11, 0x3c, 0x27, 0x4e, 0x1c, + 0x5f, 0x42, 0xcb, 0xf6, 0xc7, 0x20, 0xcd, 0xb2, + 0xc6, 0x59, 0x6d, 0x0b, 0x43, 0x65, 0x68, 0x02, + 0x4e, 0x70, 0x12, 0xc7, 0x16, 0xea, 0x7b, 0x5c, + 0x35, 0x15, 0xaf, 0x36, 0xda, 0xfc, 0x93, 0x2f, + 0xcb, 0x5d, 0x97, 0x6c, 0xff, 0x00, 0x94, 0xe6, + 0x96, 0x34, 0xc6, 0x29, 0x1c, 0x61, 0xde, 0x53, + 0x83, 0xb7, 0x4a, 0xa0, 0xd5, 0x09, 0x14, 0xa5, + 0x15, 0xbd, 0x4d, 0xf4, 0xd3, 0x48, 0xd7, 0xc3, + 0x77, 0xb5, 0x9a, 0x3f, 0x92, 0xf9, 0x6e, 0xe4, + 0x5a, 0x6f, 0x6b, 0x52, 0x2d, 0xbe, 0x31, 0x4c, + 0xfd, 0x1b, 0xbe, 0x0b, 0x76, 0xc6, 0x67, 0x1b, + 0x3d, 0x93, 0x32, 0x5b, 0x9b, 0xf9, 0x5c, 0x2f, + 0x65, 0xf1, 0x1a, 0xd1, 0x1b, 0x9d, 0x86, 0x31, + 0xa7, 0x58, 0x14, 0xab, 0x8a, 0xe6, 0x83, 0x6c, + 0x25, 0x6e, 0xd4, 0xbb, 0x37, 0x7d, 0x45, 0xac, + 0x87, 0x9a, 0x7b, 0x06, 0x9f, 0xd4, 0x7e, 0x6e, + 0x8d, 0xf1, 0xad, 0x56, 0xb5, 0x2c, 0x97, 0x76, + 0x15, 0x3b, 0xd6, 0xdb, 0x15, 0xe5, 0x3a, 0xb4, + 0x4f, 0xf2, 0xdc, 0x36, 0xc9, 0x9b, 0x2e, 0x49, + 0x9b, 0x5b, 0x3d, 0x76, 0x4e, 0xbf, 0xab, 0x5e, + 0x55, 0xf9, 0x2d, 0x3b, 0x67, 0x9b, 0x6c, 0xfe, + 0x70, 0x61, 0xbc, 0xb0, 0x95, 0xc6, 0xf2, 0x21, + 0xcd, 0xc8, 0xd3, 0x1b, 0xd9, 0x89, 0x87, 0x51, + 0xab, 0x9b, 0xa4, 0x85, 0x55, 0x3a, 0xd2, 0xab, + 0x05, 0x45, 0xef, 0x37, 0xb6, 0xe9, 0xe1, 0xf0, + 0x76, 0xf2, 0xbe, 0x5a, 0x3c, 0xbe, 0x18, 0xc5, + 0x59, 0x9b, 0x56, 0xb3, 0xad, 0x77, 0x71, 0x91, + 0x11, 0x15, 0x1a, 0x19, 0xa8, 0xae, 0xea, 0xea, + 0xca, 0xe7, 0x8e, 0xdf, 0x32, 0xb4, 0x9e, 0x53, + 0x48, 0xe2, 0x99, 0x8f, 0x79, 0xa5, 0x74, 0x03, + 0x53, 0xa1, 0x72, 0x2c, 0x83, 0x45, 0x31, 0x3a, + 0x4c, 0x4f, 0x25, 0x6f, 0x58, 0xb5, 0x6d, 0x5f, + 0x08, 0xb4, 0x4c, 0x4f, 0xff, 0x00, 0xc9, 0x6b, + 0xdb, 0x9d, 0xa2, 0xcb, 0x33, 0x9f, 0x63, 0x39, + 0x74, 0x8e, 0x7f, 0x31, 0xce, 0x63, 0x2e, 0x63, + 0x9b, 0x42, 0xec, 0x18, 0x69, 0x88, 0x7f, 0x54, + 0xa9, 0x8b, 0xdd, 0xba, 0xca, 0x26, 0xd9, 0xe9, + 0x6d, 0xa2, 0x95, 0xe2, 0xfd, 0xf6, 0xdc, 0xd8, + 0x61, 0x63, 0x85, 0x1e, 0x5b, 0x84, 0xf8, 0xd4, + 0xa2, 0xf9, 0xe5, 0x7b, 0x09, 0x8b, 0x42, 0xeb, + 0x19, 0xed, 0x13, 0x6b, 0x75, 0x78, 0xbc, 0xf9, + 0xfe, 0x51, 0x82, 0x71, 0xe1, 0xc7, 0x36, 0xb6, + 0xdc, 0x16, 0x9b, 0x57, 0x9f, 0x19, 0xd6, 0x75, + 0x5c, 0xb6, 0x1f, 0x69, 0x72, 0x7c, 0x96, 0xc6, + 0xe6, 0x1b, 0xf9, 0x5d, 0x1b, 0xe4, 0x93, 0x1b, + 0x28, 0xc7, 0x38, 0x53, 0x08, 0x6e, 0xb6, 0x83, + 0xbc, 0xaa, 0x33, 0xc8, 0xd7, 0xcd, 0x23, 0xc6, + 0x9c, 0x4f, 0x71, 0x69, 0xec, 0x13, 0x51, 0xad, + 0x6b, 0x05, 0x61, 0x52, 0xd9, 0x26, 0xd5, 0xad, + 0x7d, 0x94, 0xf0, 0xfc, 0x5a, 0x70, 0xf9, 0x5a, + 0x63, 0xcd, 0x9b, 0x35, 0x6d, 0x33, 0x39, 0xf4, + 0xdd, 0x1f, 0xb3, 0xc9, 0x29, 0xb3, 0x57, 0xb6, + 0xb6, 0x19, 0xdd, 0xad, 0xe5, 0xd1, 0x2d, 0x86, + 0x12, 0x4b, 0xdc, 0x01, 0x71, 0xd5, 0x4d, 0x41, + 0x76, 0x6d, 0xae, 0x6f, 0x97, 0xe7, 0x19, 0xac, + 0x57, 0x76, 0x0e, 0x32, 0x31, 0x90, 0x08, 0xf1, + 0x16, 0x96, 0x90, 0xec, 0x4e, 0x27, 0xca, 0x15, + 0xdd, 0x50, 0x15, 0x42, 0xa6, 0x32, 0x4c, 0x52, + 0x69, 0xec, 0x9e, 0x25, 0xbc, 0x9d, 0x2d, 0xe6, + 0x6b, 0xe6, 0x66, 0x67, 0x75, 0x2b, 0xb2, 0x39, + 0x7c, 0x7e, 0x21, 0x20, 0xac, 0x22, 0x2e, 0x6d, + 0x22, 0x22, 0x29, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x05, 0x91, 0xad, 0x61, 0x64, 0x6b, 0x41, 0x91, + 0xb9, 0xda, 0x5f, 0x6f, 0xb3, 0xfe, 0x5b, 0x6d, + 0xf6, 0x4c, 0xfa, 0xa1, 0x7c, 0x3c, 0x6e, 0x77, + 0x17, 0xdc, 0x2d, 0x3f, 0x96, 0xda, 0xfd, 0x93, + 0x3e, 0xa8, 0x5a, 0x7c, 0x9f, 0xdd, 0x77, 0xcf, + 0xff, 0x00, 0x71, 0xfd, 0x98, 0x3f, 0x6a, 0xff, + 0x00, 0xa2, 0xad, 0x83, 0x5a, 0xaf, 0xbb, 0xca, + 0x3d, 0xb2, 0xac, 0x03, 0x5a, 0xaf, 0xbb, 0xca, + 0x3d, 0xb2, 0xb6, 0xbe, 0x6d, 0x85, 0xea, 0x2f, + 0xdb, 0x47, 0xe7, 0xb7, 0xc2, 0x17, 0x95, 0xea, + 0x2f, 0xda, 0xb3, 0xce, 0x6f, 0x84, 0x20, 0xec, + 0xce, 0x72, 0xcc, 0xae, 0xf2, 0xed, 0xb2, 0x5e, + 0xdd, 0x1b, 0x79, 0x03, 0x00, 0x6b, 0x71, 0x34, + 0x68, 0xa9, 0xf9, 0xc0, 0xae, 0x0f, 0x87, 0xf6, + 0x77, 0xef, 0x13, 0xcb, 0x8f, 0xd1, 0x5a, 0x76, + 0xc3, 0xf9, 0x94, 0x7f, 0x64, 0x3e, 0xb3, 0x94, + 0x12, 0x0b, 0x1f, 0xc3, 0xfb, 0x3b, 0xf7, 0x89, + 0xe5, 0xc7, 0xe8, 0xa7, 0xc3, 0xfb, 0x3b, 0xf7, + 0x89, 0xe5, 0xc7, 0xe8, 0xaa, 0xe2, 0x20, 0xb1, + 0xfc, 0x3f, 0xb3, 0xbf, 0x78, 0x9e, 0x5c, 0x7e, + 0x8a, 0x7c, 0x3f, 0xb3, 0xbf, 0x78, 0x9e, 0x5c, + 0x7e, 0x8a, 0xae, 0x22, 0x0b, 0x1f, 0xc3, 0xfb, + 0x3b, 0xf7, 0x89, 0xe5, 0xc7, 0xe8, 0xa7, 0xc3, + 0xfb, 0x3b, 0xf7, 0x89, 0xe5, 0xc7, 0xe8, 0xaa, + 0xe2, 0x68, 0xd6, 0x50, 0x58, 0xfe, 0x1f, 0xd9, + 0xdf, 0xbc, 0x4f, 0x2e, 0x3f, 0x45, 0x3e, 0x1f, + 0xd9, 0xdf, 0xbc, 0x4f, 0x2e, 0x3f, 0x45, 0x42, + 0x5d, 0x65, 0xf7, 0x36, 0x91, 0x43, 0x2c, 0xcd, + 0x01, 0xb7, 0x0d, 0xc5, 0x1d, 0x0d, 0x74, 0x50, + 0x1f, 0x95, 0x66, 0xd7, 0x2f, 0xb9, 0xbb, 0x8e, + 0x69, 0x20, 0x68, 0x2d, 0x81, 0xb8, 0xa4, 0xa9, + 0xa6, 0x8a, 0x13, 0xf2, 0x20, 0x9a, 0xf8, 0x7f, + 0x67, 0x7e, 0xf1, 0x3c, 0xb8, 0xfd, 0x14, 0xf8, + 0x7f, 0x67, 0x7e, 0xf1, 0x3c, 0xb8, 0xfd, 0x15, + 0x5c, 0xd0, 0x74, 0x8d, 0x48, 0x82, 0xc7, 0xf0, + 0xfe, 0xce, 0xfd, 0xe2, 0x79, 0x71, 0xfa, 0x29, + 0xf0, 0xfe, 0xce, 0xfd, 0xe2, 0x79, 0x71, 0xfa, + 0x2a, 0xb8, 0xb6, 0x8b, 0x4b, 0x83, 0x6c, 0x6e, + 0xf9, 0xb3, 0xcc, 0x07, 0x60, 0x32, 0x68, 0xa5, + 0x50, 0x4f, 0x7c, 0x3f, 0xb3, 0xbf, 0x78, 0x9e, + 0x5c, 0x7e, 0x8a, 0x7c, 0x3f, 0xb3, 0xbf, 0x78, + 0x9e, 0x5c, 0x7e, 0x8a, 0xae, 0x22, 0x0b, 0x1f, + 0xc3, 0xfb, 0x3b, 0xf7, 0x89, 0xe5, 0xc7, 0xe8, + 0xa7, 0xc3, 0xfb, 0x3b, 0xf7, 0x89, 0xe5, 0xc7, + 0xe8, 0xaa, 0xe2, 0xea, 0xb3, 0xca, 0xef, 0xef, + 0x81, 0x36, 0xb0, 0x99, 0x1a, 0x34, 0x17, 0x68, + 0x02, 0xbd, 0xb7, 0x51, 0x04, 0xcf, 0xc3, 0xfb, + 0x3b, 0xf7, 0x89, 0xe5, 0xc7, 0xe8, 0xa7, 0xc3, + 0xfb, 0x3b, 0xf7, 0x89, 0xe5, 0xc7, 0xe8, 0xa8, + 0x4b, 0xcc, 0xba, 0xf2, 0xc5, 0xc1, 0xb7, 0x51, + 0x16, 0x57, 0x40, 0x76, 0x82, 0xde, 0x10, 0xbd, + 0x5b, 0x65, 0x77, 0xf7, 0x51, 0x73, 0xb6, 0xf0, + 0x3a, 0x46, 0x02, 0x45, 0x45, 0x35, 0x84, 0x13, + 0x3f, 0x0f, 0xec, 0xef, 0xde, 0x27, 0x97, 0x1f, + 0xa2, 0x9f, 0x0f, 0xec, 0xef, 0xde, 0x27, 0x97, + 0x1f, 0xa2, 0xa1, 0xee, 0x72, 0xac, 0xc2, 0xd2, + 0x2e, 0x7a, 0xe2, 0x03, 0x1c, 0x75, 0x03, 0x11, + 0xa6, 0xb2, 0xbc, 0xd9, 0xe5, 0xd7, 0x97, 0xd5, + 0xf6, 0x58, 0x8c, 0x81, 0xba, 0x1c, 0xed, 0x40, + 0x1e, 0xc9, 0x28, 0x26, 0xbe, 0x1f, 0xd9, 0xdf, + 0xbc, 0x4f, 0x2e, 0x3f, 0x45, 0x3e, 0x1f, 0xd9, + 0xdf, 0xbc, 0x4f, 0x2e, 0x3f, 0x45, 0x42, 0x5e, + 0x65, 0xd7, 0x96, 0x24, 0x0b, 0x98, 0x8c, 0x61, + 0xda, 0x9d, 0xa0, 0xb4, 0xf6, 0x88, 0x5c, 0xfa, + 0x37, 0x50, 0x58, 0xfe, 0x1f, 0xd9, 0xdf, 0xbc, + 0x4f, 0x2e, 0x3f, 0x45, 0x3e, 0x1f, 0xd9, 0xdf, + 0xbc, 0x4f, 0x2e, 0x3f, 0x45, 0x42, 0x4f, 0x97, + 0xdc, 0xdb, 0xdb, 0x43, 0x75, 0x2b, 0x40, 0x8a, + 0xe3, 0xf6, 0x66, 0xb5, 0x26, 0x9d, 0x85, 0x9b, + 0x5c, 0xba, 0xea, 0xed, 0x92, 0x49, 0x0b, 0x47, + 0x37, 0x08, 0xac, 0x8f, 0x71, 0x0d, 0x68, 0xee, + 0x94, 0x13, 0x5f, 0x0f, 0xec, 0xef, 0xde, 0x27, + 0x97, 0x1f, 0xa2, 0x9f, 0x0f, 0xec, 0xef, 0xde, + 0x27, 0x97, 0x1f, 0xa2, 0xa2, 0xed, 0x72, 0x2c, + 0xc2, 0xee, 0xdd, 0xb7, 0x10, 0xb1, 0xa6, 0x37, + 0xd6, 0x84, 0xbd, 0xa3, 0x57, 0x75, 0x62, 0xef, + 0x24, 0xcc, 0xad, 0x23, 0xe7, 0x66, 0x8a, 0xb1, + 0x8d, 0x6e, 0x61, 0x0e, 0xa7, 0x6e, 0x88, 0x25, + 0x7e, 0x1f, 0xd9, 0xdf, 0xbc, 0x4f, 0x2e, 0x3f, + 0x45, 0x3e, 0x1f, 0xd9, 0xdf, 0xbc, 0x4f, 0x2e, + 0x3f, 0x45, 0x57, 0x34, 0x2e, 0x8b, 0x2c, 0xbe, + 0xea, 0xfa, 0x43, 0x1d, 0xb3, 0x31, 0x11, 0xa5, + 0xce, 0x3a, 0x1a, 0x3b, 0x65, 0x04, 0xdf, 0xc3, + 0xfb, 0x3b, 0xf7, 0x89, 0xe5, 0xc7, 0xe8, 0xa7, + 0xc3, 0xfb, 0x3b, 0xf7, 0x89, 0xe5, 0xc7, 0xe8, + 0xa8, 0xfb, 0x8d, 0x9d, 0xcc, 0x21, 0x89, 0xd2, + 0xb4, 0x32, 0x66, 0xb3, 0xca, 0x11, 0xb8, 0x38, + 0x8e, 0xe2, 0xe6, 0xb1, 0xcb, 0x2e, 0xf3, 0x02, + 0xff, 0x00, 0x66, 0x68, 0x70, 0x8a, 0x98, 0xf1, + 0x10, 0xda, 0x57, 0xb6, 0x82, 0x67, 0xe1, 0xfd, + 0x9d, 0xfb, 0xc4, 0xf2, 0xe3, 0xf4, 0x53, 0xe1, + 0xfd, 0x9d, 0xfb, 0xc4, 0xf2, 0xe3, 0xf4, 0x54, + 0x7b, 0xb6, 0x6f, 0x36, 0x6b, 0x4b, 0xb9, 0xa6, + 0xba, 0x9a, 0xc3, 0x5c, 0xd2, 0x7b, 0xca, 0x35, + 0xcd, 0x2d, 0x34, 0x20, 0x87, 0x02, 0x41, 0x69, + 0x14, 0x35, 0x08, 0x2c, 0x5f, 0x0f, 0xec, 0xef, + 0xde, 0x27, 0x97, 0x1f, 0xa2, 0x9f, 0x0f, 0xec, + 0xef, 0xde, 0x27, 0x97, 0x1f, 0xa2, 0xa2, 0x46, + 0x4f, 0x7c, 0x6c, 0x7d, 0xbc, 0x30, 0x7b, 0x3e, + 0x1c, 0x58, 0xaa, 0x2b, 0x86, 0xb4, 0x26, 0x8b, + 0x9e, 0xd6, 0xda, 0x5b, 0xb9, 0xd9, 0x6f, 0x0b, + 0x6b, 0x23, 0xea, 0x1a, 0x0d, 0x00, 0xa8, 0x05, + 0xc7, 0xc0, 0x82, 0x7b, 0xe1, 0xfd, 0x9d, 0xfb, + 0xc4, 0xf2, 0xe3, 0xf4, 0x53, 0xe1, 0xfd, 0x9d, + 0xfb, 0xc4, 0xf2, 0xe3, 0xf4, 0x54, 0x35, 0xfe, + 0x5b, 0x75, 0x97, 0xc8, 0xd8, 0xee, 0x5a, 0x03, + 0x9e, 0x09, 0x6e, 0x12, 0x0e, 0x80, 0xb1, 0x61, + 0x97, 0x5d, 0xe6, 0x0f, 0x73, 0x2d, 0x98, 0x1c, + 0x58, 0x01, 0x75, 0x4d, 0x35, 0x9a, 0x20, 0x9a, + 0xf8, 0x7f, 0x67, 0x7e, 0xf1, 0x3c, 0xb8, 0xfd, + 0x14, 0xf8, 0x7f, 0x67, 0x7e, 0xf1, 0x3c, 0xb8, + 0xfd, 0x15, 0x03, 0x75, 0x6b, 0x2d, 0xa4, 0xef, + 0xb7, 0x98, 0x01, 0x23, 0x35, 0x81, 0xa7, 0x58, + 0xaa, 0xd4, 0x82, 0xc7, 0xf0, 0xfe, 0xce, 0xfd, + 0xe2, 0x79, 0x71, 0xfa, 0x29, 0xf0, 0xfe, 0xce, + 0xfd, 0xe2, 0x79, 0x71, 0xfa, 0x2a, 0xb8, 0x88, + 0x2c, 0x7f, 0x0f, 0xec, 0xef, 0xde, 0x27, 0x97, + 0x1f, 0xa2, 0x9f, 0x0f, 0xec, 0xef, 0xde, 0x27, + 0x97, 0x1f, 0xa2, 0xab, 0x88, 0x82, 0xc7, 0xf0, + 0xfe, 0xce, 0xfd, 0xe2, 0x79, 0x71, 0xfa, 0x2b, + 0xa7, 0x2b, 0xca, 0x32, 0x6b, 0x6b, 0xe8, 0xa6, + 0xb5, 0xbd, 0x33, 0x4a, 0xd2, 0x70, 0x30, 0xb9, + 0x86, 0xb5, 0x69, 0x07, 0x40, 0x6d, 0x55, 0x4d, + 0x49, 0x6c, 0xd8, 0x1d, 0x73, 0x6f, 0xa3, 0x4f, + 0x8d, 0xf5, 0x4a, 0x09, 0xac, 0xc3, 0xdf, 0x66, + 0xf3, 0xbe, 0x40, 0xb9, 0xd7, 0x46, 0x61, 0xef, + 0xb3, 0x79, 0xdf, 0x20, 0x5c, 0xe8, 0x08, 0x3c, + 0xa1, 0xdb, 0x1e, 0x14, 0x4f, 0x08, 0xd4, 0x81, + 0xb5, 0xb6, 0x97, 0x57, 0x17, 0x16, 0xe6, 0x08, + 0x5f, 0x20, 0x6c, 0x47, 0x11, 0x68, 0x24, 0x0a, + 0x95, 0x05, 0xd5, 0x79, 0x99, 0xff, 0x00, 0xf6, + 0x93, 0x72, 0x0a, 0xb5, 0x67, 0xb9, 0xad, 0xdd, + 0x85, 0xa5, 0xac, 0xb6, 0xe5, 0xa1, 0xf2, 0xd7, + 0x19, 0x70, 0xae, 0xa6, 0xa8, 0x43, 0xb5, 0x99, + 0xbf, 0xce, 0x67, 0x24, 0x27, 0xe0, 0x89, 0xe5, + 0xc7, 0xe3, 0x11, 0xab, 0x83, 0xaa, 0xb3, 0x3e, + 0x89, 0x37, 0x20, 0xa7, 0x55, 0x66, 0x7d, 0x12, + 0x6e, 0x41, 0x5d, 0xff, 0x00, 0x16, 0xe6, 0xff, + 0x00, 0x39, 0x9c, 0x90, 0x9f, 0x16, 0xe6, 0xff, + 0x00, 0x39, 0x9c, 0x90, 0x89, 0xd2, 0x7a, 0x6d, + 0xf2, 0x70, 0x75, 0x5e, 0x67, 0xd1, 0x66, 0xe4, + 0x14, 0xea, 0xac, 0xcf, 0xa2, 0x4d, 0xc8, 0x2b, + 0xbb, 0xe2, 0xcc, 0xdf, 0xe7, 0x47, 0xc9, 0x0b, + 0x23, 0x6b, 0x33, 0x7a, 0x57, 0x14, 0x7c, 0x80, + 0xa4, 0xe2, 0xe0, 0xea, 0xac, 0xcf, 0xa2, 0x4d, + 0xc8, 0x29, 0xd5, 0x59, 0x9f, 0x44, 0x9b, 0x90, + 0x57, 0x7f, 0xc5, 0x99, 0xc7, 0xce, 0x8f, 0x92, + 0x13, 0xe2, 0xcc, 0xe3, 0xe7, 0xc7, 0xc8, 0x50, + 0x38, 0x3a, 0xab, 0x33, 0xe8, 0x93, 0x72, 0x0a, + 0x75, 0x56, 0x67, 0xd1, 0x26, 0xe4, 0x15, 0xdf, + 0xf1, 0x66, 0x71, 0xf3, 0x99, 0xc8, 0x09, 0xf1, + 0x6e, 0x71, 0xf3, 0x99, 0xc8, 0x08, 0x38, 0x3a, + 0xab, 0x33, 0xe8, 0x93, 0x72, 0x0a, 0x75, 0x56, + 0x67, 0xd1, 0x26, 0xe4, 0x15, 0xdf, 0xf1, 0x66, + 0x71, 0xf3, 0x99, 0xc8, 0x09, 0xf1, 0x66, 0x71, + 0xf3, 0x99, 0xc8, 0x41, 0xc1, 0xd5, 0x59, 0x9f, + 0x44, 0x9b, 0x90, 0x53, 0xaa, 0xb3, 0x3e, 0x89, + 0x37, 0x20, 0xae, 0xff, 0x00, 0x8b, 0x73, 0x8f, + 0x9c, 0xce, 0x40, 0x4f, 0x8b, 0x73, 0x8f, 0x9c, + 0xce, 0x40, 0x41, 0xc1, 0xd5, 0x59, 0x9f, 0x44, + 0x9b, 0x90, 0x53, 0xaa, 0xb3, 0x3e, 0x89, 0x37, + 0x20, 0xae, 0xff, 0x00, 0x8b, 0x73, 0x8f, 0x9c, + 0xce, 0x40, 0x4f, 0x8b, 0x73, 0x8f, 0x9c, 0xce, + 0x40, 0x41, 0xc1, 0xd5, 0x59, 0x9f, 0x44, 0x9b, + 0x90, 0x53, 0xaa, 0xb3, 0x3e, 0x89, 0x37, 0x20, + 0xae, 0xff, 0x00, 0x8b, 0x73, 0x8f, 0x9c, 0xce, + 0x40, 0x4f, 0x8b, 0x73, 0x8f, 0x9c, 0xce, 0x40, + 0x41, 0xc1, 0xd5, 0x59, 0x9f, 0x44, 0x9b, 0x90, + 0x53, 0xaa, 0xb3, 0x3e, 0x89, 0x37, 0x20, 0xae, + 0xf3, 0xb5, 0x99, 0xc0, 0xd3, 0x89, 0x9c, 0x80, + 0x9f, 0x16, 0xe7, 0x1f, 0x39, 0x9c, 0x90, 0x83, + 0x83, 0xaa, 0xb3, 0x3e, 0x89, 0x37, 0x20, 0xa7, + 0x55, 0x66, 0x7d, 0x12, 0x6e, 0x41, 0x5d, 0xff, + 0x00, 0x16, 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0x9f, + 0x16, 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0x83, 0x83, + 0xaa, 0xb3, 0x3e, 0x89, 0x37, 0x20, 0xa7, 0x55, + 0x66, 0x7d, 0x12, 0x6e, 0x41, 0x5d, 0xff, 0x00, + 0x16, 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0x9f, 0x16, + 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0x83, 0x83, 0xaa, + 0xb3, 0x3e, 0x89, 0x37, 0x20, 0xa7, 0x55, 0x66, + 0x7d, 0x12, 0x6e, 0x41, 0x5d, 0xff, 0x00, 0x16, + 0xe6, 0xfb, 0xaf, 0x67, 0x71, 0x81, 0x3e, 0x2d, + 0xce, 0x3e, 0x74, 0x7c, 0x80, 0x83, 0x83, 0xaa, + 0xb3, 0x3e, 0x89, 0x37, 0x20, 0xa7, 0x55, 0x66, + 0x7d, 0x12, 0x6e, 0x41, 0x5d, 0xff, 0x00, 0x16, + 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0x9f, 0x16, 0xe7, + 0x1f, 0x39, 0x9c, 0x80, 0x83, 0x83, 0xaa, 0xb3, + 0x3e, 0x89, 0x37, 0x20, 0xa7, 0x55, 0x66, 0x7d, + 0x12, 0x6e, 0x41, 0x5d, 0xff, 0x00, 0x16, 0xe7, + 0x1f, 0x3a, 0x3e, 0x40, 0x4f, 0x8b, 0x33, 0x8d, + 0x1e, 0x34, 0x7a, 0x7f, 0xaa, 0x10, 0x70, 0x75, + 0x56, 0x67, 0xd1, 0x26, 0xe4, 0x14, 0xea, 0xac, + 0xcf, 0xa2, 0x4d, 0xc8, 0x2b, 0xbf, 0xe2, 0xdc, + 0xe3, 0xe7, 0x33, 0x90, 0x13, 0xe2, 0xdc, 0xe2, + 0xb4, 0xc4, 0xca, 0xef, 0x60, 0x08, 0x38, 0x3a, + 0xab, 0x33, 0xe8, 0x93, 0x72, 0x0a, 0x75, 0x56, + 0x67, 0xd1, 0x26, 0xe4, 0x15, 0xdf, 0xf1, 0x6e, + 0x71, 0xba, 0xe8, 0xe9, 0xe6, 0x84, 0xf8, 0xb7, + 0x37, 0xf9, 0xcc, 0xae, 0xef, 0x88, 0x28, 0x83, + 0x83, 0xaa, 0xb3, 0x3e, 0x89, 0x37, 0x20, 0xa7, + 0x55, 0x66, 0x7d, 0x12, 0x6e, 0x41, 0x5d, 0xff, + 0x00, 0x16, 0xe6, 0xff, 0x00, 0x3d, 0x9c, 0x80, + 0x9f, 0x16, 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0x83, + 0x83, 0xaa, 0xb3, 0x3e, 0x89, 0x37, 0x20, 0xa7, + 0x55, 0x66, 0x7d, 0x12, 0x6e, 0x41, 0x5d, 0xff, + 0x00, 0x16, 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0x9f, + 0x16, 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0x83, 0x83, + 0xaa, 0xb3, 0x3e, 0x89, 0x37, 0x20, 0xa7, 0x55, + 0x66, 0x7d, 0x12, 0x6e, 0x41, 0x5d, 0xff, 0x00, + 0x16, 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0x9f, 0x16, + 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0x83, 0x83, 0xaa, + 0xb3, 0x3e, 0x89, 0x37, 0x20, 0xa7, 0x55, 0x66, + 0x7d, 0x12, 0x6e, 0x41, 0x5d, 0xff, 0x00, 0x16, + 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0x9f, 0x16, 0xe7, + 0x1f, 0x39, 0x9c, 0x80, 0x83, 0x83, 0xaa, 0xb3, + 0x3e, 0x89, 0x37, 0x20, 0xa7, 0x55, 0x66, 0x7d, + 0x12, 0x6e, 0x41, 0x5d, 0xff, 0x00, 0x16, 0xe7, + 0x1f, 0x39, 0x9c, 0x80, 0x9f, 0x16, 0x67, 0x1f, + 0x39, 0x94, 0xf3, 0x10, 0x70, 0x75, 0x56, 0x67, + 0xd1, 0x26, 0xe4, 0x15, 0xdb, 0x93, 0x65, 0xd9, + 0x84, 0x59, 0xad, 0xb4, 0x92, 0x5b, 0x4a, 0xc6, + 0x35, 0xf5, 0x73, 0x8b, 0x48, 0x00, 0x50, 0xaf, + 0x5f, 0x16, 0xe7, 0x1f, 0x39, 0x9c, 0x80, 0xb6, + 0x41, 0xb5, 0x39, 0xb4, 0x93, 0xc5, 0x1b, 0x9c, + 0xcc, 0x2f, 0x7b, 0x5a, 0xea, 0x34, 0x6a, 0x26, + 0x85, 0x04, 0xb6, 0x6e, 0xdc, 0x37, 0x84, 0xfc, + 0xe6, 0x82, 0xb8, 0xd7, 0x7e, 0x72, 0x29, 0x74, + 0xdf, 0x30, 0x78, 0x57, 0x02, 0x0f, 0x76, 0xfe, + 0xf1, 0x1f, 0x9c, 0xdf, 0x0a, 0x9e, 0x50, 0x36, + 0xfe, 0xf1, 0x1f, 0x9c, 0xdf, 0x0a, 0x9e, 0x40, + 0x51, 0x79, 0xbf, 0xbc, 0xd9, 0x79, 0xff, 0x00, + 0x28, 0x52, 0x8a, 0x2f, 0x37, 0xf7, 0x9b, 0x2f, + 0x3f, 0xe5, 0x08, 0x19, 0x47, 0xbc, 0xde, 0xfd, + 0xa1, 0xfa, 0xc5, 0x4a, 0x28, 0xbc, 0xa3, 0xde, + 0x6f, 0x7e, 0xd0, 0xfd, 0x62, 0xa4, 0xea, 0x83, + 0x28, 0xb1, 0x54, 0xaa, 0x0f, 0x6d, 0xf2, 0x4a, + 0xf8, 0x75, 0xef, 0xbe, 0x5c, 0x7d, 0xab, 0xfe, + 0xb1, 0x5f, 0x70, 0x6f, 0x92, 0x57, 0xc3, 0xef, + 0x7d, 0xf2, 0xe3, 0xed, 0x5f, 0xf5, 0x8a, 0xc9, + 0xe6, 0xfc, 0x28, 0xfa, 0x0f, 0xed, 0xbf, 0xbf, + 0xcc, 0x7c, 0x31, 0xff, 0x00, 0x9b, 0x4a, 0x22, + 0x2c, 0x8f, 0xa4, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x6c, 0x64, 0x12, 0x3c, 0x62, + 0x8d, 0x8e, 0x78, 0x6e, 0x97, 0xe1, 0x05, 0xd4, + 0x1d, 0x9a, 0x56, 0x8b, 0xc0, 0xdd, 0xed, 0x2b, + 0x86, 0xc1, 0x1a, 0xda, 0x67, 0x75, 0xe8, 0xcd, + 0xf0, 0x48, 0xad, 0x8e, 0x9b, 0xaf, 0x15, 0x99, + 0xd1, 0x9b, 0xce, 0x67, 0x9c, 0x18, 0x2f, 0x96, + 0x23, 0x59, 0xae, 0xdf, 0xa7, 0xe3, 0x68, 0x85, + 0x3c, 0x8d, 0x15, 0x5e, 0xdb, 0x0c, 0x8f, 0x69, + 0x74, 0x6c, 0x73, 0xda, 0xdd, 0x2f, 0x21, 0xa5, + 0xc0, 0x0e, 0xc9, 0x02, 0x8b, 0xc0, 0x24, 0x00, + 0x15, 0xc7, 0x63, 0x87, 0xf9, 0x06, 0x7f, 0xf6, + 0x06, 0x9c, 0x87, 0xa5, 0x2b, 0xba, 0xda, 0x7b, + 0xa6, 0x4f, 0x39, 0x9e, 0x70, 0x61, 0x9c, 0xb1, + 0x1b, 0xa6, 0x26, 0x95, 0x98, 0xfd, 0xa9, 0xd2, + 0x54, 0xfc, 0x3f, 0xd0, 0xb1, 0xb9, 0x5d, 0xf5, + 0xec, 0x45, 0x21, 0x05, 0xcd, 0x69, 0x73, 0x1a, + 0x06, 0x27, 0x00, 0x68, 0x3b, 0x67, 0x50, 0x5b, + 0x1d, 0x63, 0x76, 0xd8, 0x79, 0xf7, 0x5b, 0xca, + 0x21, 0xf5, 0x85, 0x8e, 0xc3, 0xca, 0xa2, 0xae, + 0xd9, 0xe3, 0xc3, 0x57, 0x69, 0xc9, 0x58, 0x9e, + 0x36, 0xad, 0x34, 0x99, 0xaf, 0xd5, 0x6f, 0x6f, + 0x8b, 0x47, 0x8a, 0xb2, 0x05, 0x4e, 0x9d, 0x1d, + 0x85, 0x82, 0x06, 0xb6, 0xea, 0x5e, 0xe3, 0x8d, + 0xd2, 0x1c, 0x21, 0xa5, 0xee, 0x3a, 0x9a, 0xd0, + 0x49, 0xee, 0x00, 0x9a, 0x7b, 0x16, 0xd7, 0x4d, + 0x26, 0x62, 0x38, 0x71, 0xf7, 0x69, 0xcd, 0xe6, + 0x80, 0xef, 0x77, 0x16, 0x08, 0xa6, 0xb5, 0x67, + 0xdb, 0x4c, 0xb6, 0x2b, 0x47, 0xe5, 0xec, 0xb5, + 0x80, 0xc7, 0x10, 0xb3, 0x05, 0xe5, 0xad, 0x34, + 0xc4, 0x5c, 0x4b, 0xb1, 0x1d, 0xfe, 0xda, 0xae, + 0x41, 0x6d, 0x34, 0xf2, 0x73, 0x70, 0xc6, 0xf9, + 0x5f, 0xf3, 0x58, 0xd2, 0x4f, 0x7a, 0xaa, 0xd6, + 0xa4, 0xd6, 0xdb, 0x7d, 0xbe, 0xe7, 0x0f, 0x2f, + 0xe6, 0x6b, 0x9f, 0x0d, 0x73, 0x69, 0x15, 0x8b, + 0x6b, 0xf7, 0x5b, 0x84, 0x69, 0x3e, 0x16, 0x6b, + 0xa6, 0xe8, 0x58, 0x5b, 0x67, 0xb6, 0x9a, 0xdd, + 0xc5, 0x93, 0xc6, 0xf8, 0x5f, 0xb8, 0xd9, 0x1a, + 0x58, 0x7b, 0x98, 0xb5, 0xad, 0x4a, 0xba, 0x69, + 0x2e, 0xf5, 0x98, 0x98, 0xd6, 0x34, 0x98, 0x9f, + 0x6c, 0x4e, 0xb1, 0xf8, 0x32, 0x29, 0xbc, 0xbd, + 0x32, 0x27, 0xc9, 0x5c, 0x0d, 0x2e, 0xc2, 0x31, + 0x10, 0xd1, 0x5a, 0x01, 0xba, 0x56, 0xcb, 0x2b, + 0x4b, 0x8b, 0xcb, 0x98, 0xed, 0xad, 0x9a, 0x5f, + 0x34, 0xa7, 0x0b, 0x1a, 0x37, 0x4f, 0x75, 0x7d, + 0x07, 0x2e, 0xc8, 0x6d, 0x72, 0x5c, 0x93, 0x32, + 0x85, 0xd2, 0x32, 0x6c, 0xc8, 0xda, 0x97, 0xdc, + 0xe1, 0xd3, 0x81, 0xae, 0x0e, 0xc0, 0xd1, 0xdd, + 0x07, 0xb6, 0xaf, 0x8f, 0x1c, 0xdf, 0x59, 0xf6, + 0x43, 0x1f, 0x9d, 0xf3, 0xd8, 0xfc, 0xb4, 0x56, + 0xb3, 0x13, 0x6b, 0xde, 0x62, 0x2b, 0x5a, 0xf8, + 0xe9, 0x33, 0xa4, 0xda, 0x67, 0xd9, 0x10, 0xf9, + 0xc6, 0x8d, 0x46, 0xb5, 0x5b, 0x23, 0xb7, 0x9a, + 0x5a, 0xf3, 0x4c, 0x74, 0x94, 0xd7, 0x85, 0xa5, + 0xde, 0x05, 0xee, 0xce, 0xdc, 0xdd, 0xdd, 0xc3, + 0x6a, 0x0e, 0x17, 0x4f, 0x23, 0x62, 0xc5, 0xbd, + 0x88, 0xd1, 0x5c, 0x73, 0xdd, 0xa6, 0x97, 0x67, + 0xee, 0x5b, 0x93, 0xe4, 0x6c, 0x8e, 0x18, 0x6d, + 0x9a, 0xde, 0x72, 0x5c, 0x21, 0xe5, 0xc4, 0x8a, + 0xff, 0x00, 0xf3, 0x54, 0xa5, 0x22, 0x75, 0x99, + 0x9d, 0x22, 0x0f, 0x31, 0xe6, 0xb2, 0x53, 0x25, + 0x30, 0x62, 0xa4, 0x65, 0xcd, 0x68, 0x9b, 0x7d, + 0x53, 0xb6, 0x91, 0x58, 0xe7, 0x3c, 0xd4, 0x87, + 0xb0, 0xb4, 0x90, 0xf0, 0x5a, 0x5a, 0x68, 0xe0, + 0x41, 0x04, 0x70, 0xd1, 0x03, 0x1c, 0xe7, 0x06, + 0x30, 0x17, 0x39, 0xda, 0x9a, 0x34, 0x93, 0xda, + 0x03, 0x5a, 0xb9, 0x67, 0x32, 0xc1, 0xb4, 0x3b, + 0x2e, 0xdc, 0xf5, 0xd1, 0x36, 0x2b, 0xfb, 0x39, + 0x44, 0x53, 0x96, 0x8a, 0x63, 0x04, 0xe1, 0x3a, + 0xfc, 0xe0, 0x57, 0x8c, 0xa5, 0xf0, 0xec, 0xfe, + 0xcc, 0x0c, 0xe8, 0xc4, 0xd7, 0xe6, 0x17, 0xef, + 0x2c, 0xb5, 0xc6, 0x2b, 0x81, 0x83, 0x74, 0x77, + 0x01, 0x2a, 0x7b, 0x5f, 0x54, 0x46, 0xbf, 0x4c, + 0xf1, 0xdc, 0xe7, 0x1f, 0xcc, 0x27, 0xb7, 0xaf, + 0x6f, 0xfd, 0xfe, 0xe4, 0x60, 0xed, 0x6b, 0xc3, + 0x7f, 0x8c, 0xce, 0xee, 0x9d, 0x15, 0x29, 0x21, + 0x92, 0x27, 0x61, 0x95, 0x8f, 0x8d, 0xdb, 0x8d, + 0x7b, 0x4b, 0x49, 0xe5, 0x51, 0x78, 0xa2, 0xbc, + 0xe5, 0x79, 0x9b, 0xf6, 0xba, 0xca, 0xef, 0x29, + 0xcc, 0xda, 0xc3, 0x77, 0x1c, 0x46, 0x7b, 0x49, + 0xda, 0xda, 0x10, 0x5b, 0xa2, 0x94, 0xec, 0x1a, + 0x76, 0xd5, 0x1d, 0xc1, 0xc0, 0xd1, 0xc2, 0x8e, + 0x06, 0x84, 0x6f, 0x53, 0x5a, 0x8b, 0xd2, 0x23, + 0x49, 0x89, 0xd6, 0xb2, 0xed, 0xe5, 0x7c, 0xcd, + 0xf2, 0x5b, 0x26, 0x3c, 0xd5, 0xd9, 0x9b, 0x16, + 0xdd, 0xd1, 0x5e, 0x34, 0x9a, 0xdb, 0xc2, 0xd1, + 0x3e, 0xf1, 0xb1, 0xb9, 0xf4, 0x0c, 0x6b, 0x9e, + 0xe3, 0xf9, 0xad, 0x15, 0x27, 0xb4, 0x02, 0xcc, + 0x91, 0x49, 0x11, 0xa4, 0x8c, 0x73, 0x1d, 0xba, + 0x1c, 0x0b, 0x4f, 0x7d, 0x4d, 0xec, 0x5f, 0x8b, + 0xb4, 0xd6, 0x64, 0x6e, 0x39, 0xff, 0x00, 0x51, + 0xca, 0x77, 0xf1, 0x1a, 0x06, 0x5c, 0x5b, 0xda, + 0xe6, 0x30, 0x8a, 0xe0, 0x7c, 0x96, 0xd2, 0x9d, + 0xe2, 0xd3, 0x56, 0xf7, 0xc1, 0x53, 0x5c, 0x5a, + 0xe2, 0x9b, 0xeb, 0xc6, 0x27, 0xc1, 0xcf, 0x2f, + 0x9e, 0x9a, 0x79, 0xcc, 0x7e, 0x5b, 0x6f, 0xd3, + 0x92, 0x9a, 0xc5, 0xbf, 0xd7, 0xc7, 0x4f, 0x9e, + 0xd5, 0x1b, 0x47, 0x71, 0x7b, 0x7d, 0xbc, 0xf1, + 0xb4, 0x39, 0xf1, 0x3d, 0x8d, 0x3a, 0x9c, 0xf6, + 0x96, 0x8d, 0x3a, 0x74, 0x13, 0xda, 0x5b, 0xb2, + 0xdb, 0x47, 0x5e, 0xe6, 0x16, 0xd6, 0x8d, 0xd2, + 0x67, 0x95, 0xb1, 0xf7, 0x09, 0xd2, 0xaf, 0x7f, + 0x88, 0x12, 0x42, 0xfd, 0x9f, 0xb7, 0xe6, 0x7f, + 0x67, 0x15, 0xd0, 0x88, 0x7f, 0xf8, 0xd9, 0x23, + 0x7e, 0x45, 0x14, 0xc5, 0xad, 0x2d, 0x7d, 0x7e, + 0xd5, 0xbc, 0xcf, 0x9e, 0xed, 0xf9, 0x8f, 0x2f, + 0x82, 0x23, 0x5e, 0xfd, 0xb4, 0x99, 0xe9, 0x89, + 0xf0, 0xff, 0x00, 0x37, 0xcf, 0x4c, 0x32, 0xf3, + 0x7c, 0xee, 0x07, 0x08, 0xce, 0x81, 0x25, 0x0e, + 0x12, 0x77, 0xb1, 0x6a, 0xdc, 0x5e, 0x29, 0xa0, + 0x15, 0x6e, 0xbd, 0x27, 0xfd, 0xbb, 0xb1, 0x3b, + 0xd7, 0x07, 0x86, 0xb2, 0x2a, 0x8e, 0xbd, 0x0a, + 0x32, 0x53, 0x66, 0xd8, 0xea, 0x88, 0xb7, 0xcd, + 0xd3, 0xcb, 0x67, 0xb6, 0x7a, 0xe5, 0xb6, 0x9a, + 0x4d, 0x2f, 0x7c, 0x51, 0x1f, 0xb3, 0x3a, 0x44, + 0xbd, 0x3a, 0x19, 0x1a, 0xc0, 0xf2, 0xc7, 0x06, + 0x3b, 0xc9, 0x79, 0x04, 0x34, 0x9e, 0xc1, 0xd4, + 0x57, 0x8a, 0x15, 0x71, 0xce, 0xdb, 0xff, 0x00, + 0xd0, 0x72, 0x6e, 0xcc, 0xad, 0xaf, 0x22, 0x55, + 0x54, 0xf6, 0x4b, 0xaa, 0x55, 0xb0, 0xc8, 0xe0, + 0x69, 0x42, 0x18, 0xe2, 0x3b, 0xc1, 0x4d, 0xe9, + 0x15, 0x9d, 0x23, 0x8f, 0x0d, 0x51, 0xe5, 0xbc, + 0xcf, 0x7a, 0x96, 0xbd, 0xa3, 0x6c, 0x57, 0x25, + 0xe9, 0x1c, 0x63, 0xf5, 0x67, 0xde, 0xd5, 0x43, + 0xbc, 0xb0, 0xb7, 0x3e, 0xda, 0xe9, 0xad, 0x2e, + 0x74, 0x12, 0x80, 0x35, 0xd5, 0x8e, 0x1f, 0xdd, + 0x5a, 0x8d, 0x15, 0x34, 0x98, 0xf1, 0x86, 0x98, + 0xb5, 0x6d, 0xc2, 0xb3, 0xae, 0x8c, 0x22, 0x22, + 0x24, 0x44, 0x44, 0x04, 0x44, 0x40, 0x59, 0x1a, + 0xd6, 0x16, 0x46, 0xb4, 0x19, 0x1b, 0x8b, 0xee, + 0x16, 0xa2, 0x99, 0x7d, 0xb0, 0xff, 0x00, 0x09, + 0x9f, 0x54, 0x2f, 0x87, 0x8d, 0x61, 0x7d, 0xc2, + 0xdb, 0xf9, 0x7d, 0xb7, 0xd9, 0xb3, 0xea, 0x85, + 0xa7, 0xc9, 0xfd, 0xd6, 0x7c, 0xff, 0x00, 0xf7, + 0x1f, 0xd9, 0x83, 0xf6, 0xaf, 0xfa, 0x2a, 0xf6, + 0x35, 0xaa, 0xfb, 0xbc, 0xa3, 0xdb, 0x2a, 0xc1, + 0xba, 0xab, 0xee, 0xf2, 0x8f, 0x6c, 0xad, 0xaf, + 0x9b, 0x61, 0x7a, 0x8b, 0xf6, 0xac, 0xf3, 0x9b, + 0xe1, 0x0b, 0xca, 0xf5, 0x17, 0xed, 0x59, 0xe7, + 0x37, 0xc2, 0x10, 0x73, 0x6d, 0x87, 0xf3, 0x28, + 0xfe, 0xc4, 0x7d, 0x67, 0x28, 0x25, 0x3b, 0xb6, + 0x1f, 0xcc, 0xa3, 0xfb, 0x11, 0xf5, 0x9c, 0xa0, + 0x90, 0x11, 0x11, 0x01, 0x11, 0x10, 0x16, 0x0e, + 0xa5, 0x94, 0x41, 0x39, 0xb4, 0x3e, 0xe1, 0x95, + 0x7d, 0x8f, 0xf7, 0x58, 0xb3, 0xb3, 0x9e, 0xe5, + 0x99, 0xfd, 0x89, 0xfa, 0xae, 0x5e, 0x73, 0xfd, + 0x39, 0x76, 0x52, 0x7f, 0xc0, 0x1a, 0x7f, 0xb2, + 0xc5, 0x9d, 0x9c, 0xf7, 0x3c, 0xcc, 0xee, 0x73, + 0x27, 0xc0, 0xe4, 0x1a, 0x2c, 0xb2, 0x6b, 0x79, + 0xf2, 0xc6, 0xdf, 0xcd, 0x71, 0xcc, 0x30, 0x38, + 0x89, 0x6a, 0xda, 0x80, 0x07, 0xcd, 0xa6, 0xe9, + 0x4b, 0xbc, 0xa6, 0xd0, 0xd8, 0x9b, 0xfc, 0xb6, + 0x67, 0x4f, 0x14, 0x64, 0x09, 0x58, 0xf0, 0x03, + 0x85, 0x77, 0x74, 0x00, 0xb6, 0x3c, 0x9f, 0x84, + 0xa2, 0xa0, 0xff, 0x00, 0x8f, 0xa4, 0xaf, 0x79, + 0x10, 0x07, 0x2c, 0xcd, 0x03, 0xbc, 0x8c, 0x1d, + 0xfa, 0x14, 0x10, 0x6a, 0xce, 0xcb, 0x7c, 0xaf, + 0xe1, 0xe7, 0xc6, 0x2e, 0xdd, 0xec, 0xa6, 0x6a, + 0xba, 0x6c, 0x06, 0xa1, 0xda, 0x3c, 0x5c, 0x2a, + 0xae, 0x35, 0x29, 0xa6, 0x68, 0xd9, 0x29, 0x0f, + 0xff, 0x00, 0xc4, 0xe8, 0xfa, 0x28, 0x35, 0x5a, + 0x65, 0x56, 0xcf, 0xb7, 0x96, 0xfa, 0xea, 0x77, + 0x45, 0x64, 0xc7, 0x96, 0x46, 0xf6, 0x8f, 0x19, + 0xfb, 0xd4, 0x0b, 0x17, 0xb9, 0x5d, 0xb3, 0x6c, + 0x86, 0x61, 0x97, 0xcc, 0x67, 0xb6, 0x07, 0x0c, + 0xa1, 0xe2, 0x8e, 0x69, 0xe0, 0x0b, 0xa3, 0x31, + 0x14, 0xd9, 0x9b, 0x00, 0xdd, 0x4e, 0x7b, 0xcb, + 0xbb, 0x3a, 0x5e, 0xb3, 0x94, 0xf8, 0xd9, 0x06, + 0x68, 0xd7, 0x79, 0x22, 0x94, 0xe0, 0x41, 0x05, + 0xa7, 0x48, 0xdd, 0xa7, 0x7d, 0x4b, 0xdf, 0x66, + 0x91, 0x1c, 0xb6, 0xd6, 0xca, 0xcc, 0xb9, 0x82, + 0x31, 0x59, 0x80, 0xab, 0x71, 0x3b, 0x7a, 0xaa, + 0x27, 0x8e, 0xaa, 0x43, 0x29, 0xca, 0xdb, 0x74, + 0xd7, 0xdc, 0xdc, 0xbb, 0x99, 0xb2, 0x87, 0x4c, + 0x92, 0x13, 0x42, 0x4f, 0xcd, 0x6a, 0x0e, 0xe8, + 0xe4, 0x7c, 0xfb, 0x29, 0x31, 0xb9, 0x26, 0x4e, + 0x6e, 0x40, 0x20, 0x7b, 0xb5, 0x9d, 0x2d, 0xdf, + 0xde, 0xaa, 0xf4, 0xc6, 0x5f, 0xf5, 0x15, 0x94, + 0x56, 0x01, 0xe6, 0x59, 0x9e, 0xf7, 0xbc, 0xc7, + 0xbc, 0x09, 0x15, 0x3a, 0xb4, 0x2e, 0x1c, 0xdb, + 0x35, 0x6d, 0xd3, 0x63, 0xb5, 0xb5, 0x6f, 0x33, + 0x67, 0x0f, 0xec, 0xda, 0x75, 0xbb, 0xfa, 0xc5, + 0x6a, 0x9b, 0x33, 0xbf, 0x75, 0xa4, 0x36, 0x78, + 0x9d, 0x0c, 0x0c, 0xf2, 0x30, 0x82, 0xc2, 0xe1, + 0xaf, 0xca, 0x41, 0x8b, 0xf1, 0x9b, 0xc3, 0x48, + 0xaf, 0xdd, 0x20, 0x0e, 0x35, 0x68, 0x79, 0xab, + 0x49, 0x0a, 0x52, 0xfe, 0x2b, 0xa8, 0xf2, 0xcc, + 0xbf, 0x2f, 0xb3, 0x63, 0xdc, 0xe9, 0xd9, 0xcf, + 0x4c, 0x19, 0x5a, 0x9a, 0xd0, 0xe9, 0x23, 0xb6, + 0xbc, 0xc3, 0x2c, 0x97, 0xbb, 0x31, 0x72, 0x6e, + 0x09, 0x7b, 0xed, 0x5e, 0x0c, 0x6f, 0x76, 0x93, + 0xa4, 0x8d, 0x15, 0xee, 0xae, 0x9c, 0xf6, 0xfa, + 0x7b, 0x6c, 0xb2, 0xc4, 0x5b, 0x38, 0xc6, 0xe9, + 0xa3, 0x68, 0x74, 0x8d, 0xd0, 0x70, 0x86, 0xb5, + 0xd4, 0xaa, 0x08, 0xbb, 0x9b, 0xab, 0xf8, 0x32, + 0xee, 0xad, 0xbd, 0x81, 0xc2, 0xae, 0xc5, 0x1c, + 0xb2, 0x56, 0xa3, 0xb0, 0xda, 0xa8, 0xc5, 0x3f, + 0x04, 0xd2, 0x66, 0x1b, 0x3b, 0x77, 0xed, 0x6e, + 0x32, 0xc9, 0x68, 0xe1, 0xcd, 0xc8, 0xed, 0x62, + 0xa4, 0x6e, 0xaa, 0xf8, 0xd5, 0x5e, 0xd2, 0x0b, + 0x0d, 0xed, 0xb4, 0xd7, 0x79, 0x4e, 0x51, 0x6f, + 0x08, 0xc5, 0x24, 0x98, 0xa9, 0xd8, 0xd1, 0xaf, + 0xb8, 0xb9, 0xf3, 0x8b, 0xa8, 0x6d, 0xa0, 0x6e, + 0x4d, 0x64, 0x7f, 0x57, 0x17, 0xbc, 0x38, 0x7e, + 0x7b, 0xf7, 0x41, 0x52, 0x4f, 0xcd, 0x0e, 0x5d, + 0x90, 0xd8, 0x3e, 0x36, 0x07, 0x4d, 0x23, 0x70, + 0xb0, 0x9f, 0xcd, 0x03, 0xca, 0x2a, 0x3b, 0x68, + 0x2d, 0x62, 0x90, 0x43, 0x9b, 0x5b, 0x0a, 0xc1, + 0x74, 0x01, 0x7d, 0x35, 0x35, 0xc3, 0x8d, 0x06, + 0xc9, 0xcb, 0xc6, 0xc9, 0xdb, 0x61, 0xad, 0x79, + 0xdd, 0x25, 0xb5, 0xad, 0x06, 0x2d, 0xee, 0xd2, + 0xf7, 0xb3, 0xf2, 0x4e, 0xdb, 0x4b, 0xf7, 0xdc, + 0x97, 0x7b, 0x27, 0x36, 0x68, 0x64, 0xae, 0x1c, + 0x5a, 0x74, 0x0c, 0x4b, 0xdb, 0x2f, 0x27, 0xb2, + 0xd9, 0x8b, 0x69, 0x60, 0x20, 0x48, 0x65, 0xc2, + 0x49, 0x01, 0xc2, 0x87, 0x16, 0xe3, 0x93, 0x2b, + 0xbe, 0x76, 0x77, 0xce, 0x65, 0xd9, 0x83, 0x5a, + 0xff, 0x00, 0x10, 0xbd, 0x8f, 0x68, 0xc3, 0x42, + 0x08, 0xa6, 0xad, 0x08, 0x2b, 0x7a, 0x37, 0x35, + 0x6e, 0x2b, 0x0e, 0x52, 0xc7, 0xc9, 0xb3, 0xf7, + 0xb1, 0xda, 0x57, 0xda, 0xb1, 0x55, 0xcd, 0x6f, + 0x94, 0x46, 0x8f, 0xe9, 0x50, 0x0f, 0x61, 0x63, + 0xdc, 0xc2, 0x6a, 0x5a, 0x4b, 0x49, 0xdf, 0xa1, + 0xa2, 0xeb, 0xb4, 0x19, 0x8d, 0x9c, 0x3d, 0x63, + 0x6f, 0x58, 0xe2, 0x2e, 0xc1, 0x8c, 0x11, 0x84, + 0x91, 0xb8, 0x42, 0x0c, 0xe5, 0x99, 0x84, 0xb9, + 0x5d, 0xdb, 0xa4, 0x2c, 0x2e, 0x18, 0x4b, 0x64, + 0x89, 0xc7, 0x0e, 0x9f, 0xeb, 0x55, 0x48, 0xe4, + 0x2f, 0x06, 0xd3, 0x37, 0x7b, 0x3c, 0x56, 0x98, + 0xdc, 0x5a, 0x06, 0xe6, 0x87, 0xee, 0xad, 0xb9, + 0x7e, 0x67, 0x06, 0x71, 0x28, 0xb1, 0xcc, 0x60, + 0x63, 0xa4, 0x90, 0x1e, 0x6e, 0x66, 0x8d, 0x35, + 0x00, 0x9e, 0xe6, 0xa5, 0x9c, 0x96, 0x33, 0x64, + 0x73, 0x76, 0x68, 0x93, 0xd9, 0xda, 0x70, 0xe2, + 0xd2, 0x08, 0x01, 0xc4, 0x02, 0x10, 0x45, 0xe4, + 0x53, 0x5d, 0x1c, 0xd2, 0x06, 0xc2, 0xf7, 0x3a, + 0xaf, 0x1c, 0xe0, 0xc4, 0x4f, 0x8b, 0x50, 0x1d, + 0x51, 0xda, 0x59, 0xcf, 0x18, 0xc9, 0x33, 0xb9, + 0xe3, 0x84, 0x02, 0x5e, 0xf6, 0xb4, 0x53, 0xe7, + 0x10, 0xa4, 0xb2, 0xbd, 0xa1, 0x92, 0xe2, 0xf1, + 0x96, 0xb2, 0x5b, 0xc5, 0x13, 0x27, 0x38, 0x31, + 0xc2, 0x0b, 0x1c, 0x2a, 0x0e, 0xea, 0xd1, 0x97, + 0xe5, 0xb8, 0x36, 0x95, 0xd6, 0xf5, 0x2f, 0x65, + 0xb3, 0xcc, 0xa5, 0xce, 0xd6, 0x46, 0x82, 0x2a, + 0x7b, 0x64, 0x20, 0x97, 0x6c, 0xd1, 0x8b, 0xd1, + 0x92, 0x68, 0x11, 0x7b, 0x26, 0x12, 0x3f, 0xaf, + 0xff, 0x00, 0xf2, 0xe9, 0x55, 0xfc, 0x82, 0x37, + 0x47, 0x9f, 0x43, 0x1b, 0xfc, 0xa6, 0x3d, 0xed, + 0x77, 0x6c, 0x35, 0xc0, 0xa9, 0x46, 0xd9, 0x7f, + 0x9c, 0xf5, 0x91, 0xbd, 0xb7, 0xa7, 0x39, 0x88, + 0xb3, 0x16, 0x9c, 0x1e, 0x4d, 0x39, 0x2b, 0xc1, + 0xb7, 0xf6, 0x7d, 0xb0, 0x65, 0x35, 0x4a, 0x4c, + 0x8d, 0xfe, 0xd3, 0x1d, 0x5e, 0xf8, 0x40, 0xda, + 0x1a, 0x5d, 0x65, 0xe2, 0x7a, 0x0c, 0x56, 0x97, + 0x0f, 0x85, 0xdd, 0xaa, 0xee, 0xa6, 0xce, 0x81, + 0x6d, 0x61, 0xed, 0x07, 0xca, 0xba, 0xb9, 0x8e, + 0x16, 0x1e, 0xc0, 0x70, 0xc5, 0xf2, 0xac, 0x43, + 0xff, 0x00, 0x72, 0xec, 0xf2, 0xc3, 0x5b, 0x9c, + 0x4c, 0xd1, 0x8e, 0xcb, 0x7f, 0xa4, 0x05, 0x99, + 0x3f, 0xed, 0x8e, 0x47, 0x60, 0x34, 0x10, 0xf6, + 0x4b, 0x20, 0xec, 0xb9, 0xda, 0x2a, 0x82, 0x33, + 0x68, 0xbf, 0x9c, 0xdc, 0x76, 0xc7, 0xd5, 0x0a, + 0x39, 0x48, 0xed, 0x17, 0xf3, 0x9b, 0x8e, 0xd8, + 0xf0, 0x05, 0x1c, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0xa4, 0xb6, 0x6f, 0xf9, 0xcd, 0xbf, 0x6d, + 0xdf, 0x50, 0xa8, 0xd5, 0x25, 0xb3, 0x7f, 0xce, + 0x6d, 0xfb, 0x6e, 0xfa, 0x85, 0x04, 0xd6, 0x61, + 0xef, 0xb3, 0x79, 0xdf, 0x20, 0x5c, 0xeb, 0xa3, + 0x30, 0xf7, 0xd9, 0xbc, 0xef, 0x90, 0x2e, 0x74, + 0x04, 0x44, 0x41, 0xaf, 0x6c, 0xdc, 0xe6, 0xe5, + 0xb6, 0x64, 0x76, 0x7b, 0xe1, 0xa1, 0x55, 0xec, + 0xf2, 0x7c, 0xd2, 0xf6, 0xdf, 0xda, 0xa1, 0x0c, + 0xe6, 0xb1, 0x16, 0x62, 0x7c, 0x8d, 0x67, 0x8d, + 0xbd, 0xe3, 0x90, 0xac, 0xfb, 0x6b, 0xfc, 0xae, + 0xcf, 0xbb, 0xfd, 0xd5, 0x13, 0x6b, 0x62, 0xfb, + 0xcd, 0x97, 0x64, 0x6c, 0x7c, 0x6c, 0x73, 0x6e, + 0xcb, 0xeb, 0x2b, 0x83, 0x5b, 0x40, 0xc3, 0xba, + 0x56, 0x7c, 0xbc, 0x6f, 0xa7, 0xb3, 0x47, 0xb5, + 0xfc, 0xba, 0xdd, 0xbf, 0x29, 0x37, 0xd6, 0x95, + 0x9b, 0xe7, 0x8c, 0x7b, 0xad, 0x5d, 0xfc, 0x36, + 0xc7, 0xb1, 0xc0, 0xec, 0x8b, 0x38, 0x6d, 0xc0, + 0xb6, 0x74, 0x61, 0xb2, 0xb9, 0x9c, 0xe3, 0x71, + 0x3d, 0xa1, 0x85, 0x82, 0x95, 0x21, 0xe4, 0x86, + 0x9d, 0x7b, 0xeb, 0x6c, 0x9b, 0x37, 0x9c, 0xc4, + 0xcc, 0x72, 0x31, 0xad, 0x6d, 0x31, 0x54, 0xcb, + 0x1e, 0xa1, 0xbd, 0xe3, 0xe9, 0x5b, 0x76, 0x82, + 0x27, 0x5b, 0x65, 0xb9, 0x76, 0x5d, 0x21, 0xe7, + 0x4c, 0x4c, 0x7c, 0x9c, 0xf0, 0xf1, 0x98, 0x43, + 0xe9, 0x46, 0xb0, 0xee, 0x81, 0x45, 0xe3, 0x68, + 0x7d, 0xdb, 0x2a, 0x34, 0xd2, 0x2c, 0x9b, 0x4e, + 0xeb, 0x9d, 0xc4, 0xa9, 0x35, 0xa4, 0x6e, 0xfb, + 0xb5, 0xf6, 0x36, 0xe3, 0xbe, 0x6c, 0x93, 0x87, + 0x4b, 0xe2, 0xd3, 0x2d, 0xb2, 0x47, 0xf0, 0xfd, + 0x91, 0x33, 0xa4, 0xfd, 0xde, 0xdd, 0x38, 0x47, + 0xb1, 0xcd, 0x65, 0x94, 0x66, 0x17, 0x90, 0x7b, + 0x43, 0x30, 0xc7, 0x11, 0x25, 0xac, 0x7c, 0xaf, + 0x0c, 0x0e, 0x3a, 0xa8, 0x2b, 0xad, 0x78, 0x10, + 0x5c, 0xda, 0x5d, 0x9b, 0x6b, 0x96, 0x96, 0x48, + 0xdd, 0x0e, 0x63, 0xbb, 0x3a, 0x88, 0xd3, 0xa4, + 0x15, 0xdb, 0xb4, 0x83, 0x04, 0x19, 0x65, 0xab, + 0x45, 0x23, 0x6d, 0xa3, 0x5c, 0x06, 0xe5, 0x5c, + 0x4d, 0x4f, 0x6d, 0x72, 0x4d, 0x98, 0x4f, 0x7d, + 0x77, 0x0b, 0xe7, 0xc3, 0x8a, 0x26, 0x08, 0x81, + 0x02, 0x84, 0x80, 0x34, 0x62, 0x51, 0x1a, 0x45, + 0xa2, 0x22, 0x78, 0xc4, 0xa2, 0xfd, 0xcc, 0xbe, + 0x5f, 0x2e, 0x4b, 0x57, 0x1f, 0x6e, 0xf4, 0xcb, + 0x3a, 0x45, 0x78, 0xd7, 0x67, 0x0a, 0xe9, 0x3e, + 0xfd, 0x16, 0x7e, 0x6f, 0x29, 0xb2, 0xc9, 0xec, + 0xae, 0xae, 0x2c, 0xc5, 0xc3, 0xee, 0x05, 0x1c, + 0x71, 0x61, 0x35, 0xa5, 0x57, 0x97, 0x59, 0xe5, + 0x59, 0x96, 0x5b, 0x71, 0x73, 0x61, 0x11, 0xb4, + 0xb8, 0xb5, 0x18, 0x9f, 0x19, 0x35, 0x04, 0x6b, + 0xd2, 0xb7, 0xcd, 0x6d, 0x05, 0xce, 0xcf, 0x65, + 0xcd, 0x9e, 0xe5, 0x96, 0xad, 0x6b, 0x6b, 0x8a, + 0x41, 0x50, 0x74, 0x1e, 0xc8, 0x58, 0x16, 0xad, + 0xcb, 0xf2, 0x4b, 0xa7, 0x65, 0xef, 0x17, 0xc6, + 0x71, 0x49, 0xa5, 0x69, 0x00, 0x31, 0xb4, 0xde, + 0xa9, 0xdf, 0x5b, 0x39, 0xbe, 0x65, 0x5b, 0x63, + 0x24, 0x90, 0xd2, 0x36, 0x97, 0x9f, 0x9a, 0xd0, + 0x49, 0x59, 0x7c, 0x72, 0x46, 0xec, 0x2f, 0x69, + 0x6b, 0xb7, 0x88, 0x20, 0x9e, 0x15, 0x2b, 0x65, + 0x9a, 0xc7, 0x65, 0x95, 0x3a, 0x2b, 0x3a, 0xf5, + 0x84, 0xae, 0xd2, 0xfc, 0x35, 0xf1, 0x77, 0x29, + 0xaf, 0x71, 0x76, 0xdd, 0x7b, 0x6c, 0xfb, 0x37, + 0x24, 0xd9, 0x8b, 0x0f, 0x3f, 0x1c, 0xad, 0x30, + 0x3d, 0xe2, 0x8e, 0x2d, 0x25, 0xb4, 0xde, 0xdf, + 0x28, 0x23, 0xdb, 0x96, 0x42, 0x72, 0x07, 0x5e, + 0x96, 0x3f, 0xda, 0x44, 0xb8, 0x00, 0xd3, 0xe4, + 0xd6, 0x9e, 0x42, 0x59, 0xe5, 0x91, 0x4b, 0x93, + 0x5d, 0xde, 0x48, 0xc7, 0x73, 0xf0, 0xb8, 0x08, + 0xf5, 0xea, 0x34, 0xdc, 0xdd, 0xd6, 0xa5, 0x22, + 0xcd, 0xef, 0xfe, 0x1b, 0x75, 0xe7, 0x38, 0x39, + 0xf6, 0xcc, 0x18, 0xd7, 0x61, 0x6d, 0x30, 0xd5, + 0xa3, 0x55, 0x28, 0xb3, 0x63, 0x9c, 0x66, 0x12, + 0xe4, 0x77, 0x97, 0x6f, 0x90, 0x19, 0xe1, 0x73, + 0x44, 0x6e, 0xc2, 0xda, 0x0f, 0x27, 0x72, 0x94, + 0x41, 0x57, 0x6b, 0x5e, 0x5d, 0x84, 0x34, 0x97, + 0xea, 0xc2, 0x01, 0xad, 0x7b, 0x4b, 0x2f, 0x8a, + 0x58, 0xc8, 0x6c, 0x8c, 0x74, 0x6e, 0x3a, 0x83, + 0x81, 0x04, 0xf0, 0xab, 0x0e, 0x5a, 0xeb, 0xa6, + 0xe5, 0x97, 0x99, 0xc3, 0x19, 0xcf, 0x5f, 0xcd, + 0x26, 0x18, 0xdc, 0x1b, 0x52, 0x37, 0x1c, 0x40, + 0xee, 0xaf, 0x4c, 0x17, 0xf7, 0xf9, 0x35, 0xeb, + 0x33, 0x38, 0xdc, 0x65, 0xb7, 0x02, 0x4b, 0x79, + 0x24, 0x6e, 0x17, 0x6e, 0x9e, 0xf5, 0x10, 0x56, + 0xc3, 0x1e, 0x68, 0x5a, 0xd2, 0x71, 0x1a, 0x36, + 0x80, 0xe9, 0x2b, 0x2e, 0x8a, 0x46, 0x92, 0x1e, + 0xc7, 0x37, 0x0f, 0x95, 0x50, 0x45, 0x2b, 0xaa, + 0xb5, 0x56, 0x46, 0xdf, 0x7b, 0x06, 0xcd, 0x59, + 0xce, 0xc6, 0x07, 0xcd, 0x8c, 0xb6, 0x22, 0xef, + 0xcd, 0x35, 0x75, 0x5d, 0xc0, 0x16, 0xbc, 0xae, + 0xf2, 0x6c, 0xd6, 0xdb, 0x32, 0xb6, 0xb8, 0x21, + 0xf2, 0xca, 0xce, 0x75, 0xa6, 0x80, 0x54, 0xb4, + 0x61, 0xd4, 0x3b, 0x41, 0x05, 0x78, 0x35, 0xce, + 0x34, 0x68, 0x2e, 0x3a, 0xe8, 0x05, 0x74, 0x2c, + 0x29, 0xcc, 0x8c, 0x8b, 0x5c, 0xa7, 0x31, 0xbe, + 0x3a, 0xf0, 0x88, 0xa3, 0xa8, 0xfc, 0xe3, 0xff, + 0x00, 0xc8, 0x51, 0x31, 0xd8, 0xde, 0xc8, 0xc0, + 0xf8, 0xe0, 0x91, 0xec, 0x76, 0xa7, 0x06, 0x92, + 0x38, 0x50, 0x75, 0xec, 0xf5, 0xb4, 0x17, 0x79, + 0xac, 0x70, 0x5c, 0x33, 0x9c, 0x8d, 0xcd, 0x71, + 0x2d, 0x3d, 0x81, 0x55, 0xd8, 0xeb, 0xcd, 0x9e, + 0x6d, 0xcb, 0xad, 0xe5, 0xcb, 0xf0, 0x35, 0xae, + 0x2c, 0x74, 0x81, 0xf5, 0xa5, 0x0d, 0x31, 0x51, + 0x6a, 0xd9, 0xa8, 0xe4, 0x8b, 0x3d, 0x89, 0x92, + 0xb0, 0xc6, 0xf0, 0xc7, 0xd5, 0xae, 0x04, 0x1d, + 0x2d, 0x27, 0x75, 0x74, 0x1c, 0x9b, 0x2c, 0x97, + 0x31, 0x76, 0x3c, 0xca, 0x32, 0x5d, 0x29, 0x2e, + 0x85, 0xb4, 0x0e, 0x24, 0x9a, 0xe0, 0xa9, 0x28, + 0x38, 0x33, 0xcc, 0xb2, 0x3c, 0xba, 0xf0, 0x47, + 0x09, 0x26, 0x09, 0x1a, 0x24, 0x8c, 0x9d, 0x26, + 0x87, 0xb3, 0xd8, 0x5c, 0x22, 0x09, 0xcb, 0x71, + 0x88, 0x9e, 0x59, 0xf3, 0xb0, 0x9a, 0x29, 0x9c, + 0xe2, 0x67, 0x1c, 0xf6, 0x17, 0x66, 0x11, 0x18, + 0xad, 0xa2, 0xc2, 0x1a, 0xcf, 0x2a, 0xb1, 0xb4, + 0x93, 0x5d, 0x1b, 0xf5, 0x5b, 0xe2, 0xce, 0x33, + 0x5b, 0xdc, 0xd1, 0xbd, 0x5e, 0x1c, 0x6c, 0xb1, + 0x86, 0xb6, 0x3c, 0x14, 0x6f, 0x37, 0xa0, 0x1c, + 0x5a, 0x3b, 0xa8, 0x2b, 0x95, 0xa6, 0xbe, 0xe9, + 0xdc, 0xaa, 0xf6, 0x61, 0x99, 0xac, 0xc6, 0xe8, + 0xde, 0x19, 0xf3, 0x8b, 0x48, 0x1c, 0x34, 0x56, + 0x36, 0xe5, 0xf6, 0xf2, 0x6d, 0x64, 0xcc, 0x2d, + 0x1c, 0xcc, 0x43, 0x9d, 0x2c, 0xdc, 0xae, 0x10, + 0x75, 0x79, 0xc5, 0x73, 0x41, 0xb4, 0xb3, 0x9c, + 0xc1, 0xfe, 0xd8, 0xec, 0x56, 0x0f, 0x2e, 0x6b, + 0xe1, 0xc2, 0x08, 0x6b, 0x7f, 0x36, 0x88, 0x34, + 0x65, 0x36, 0x76, 0xd3, 0xe5, 0xb9, 0x94, 0xd2, + 0xb0, 0x3a, 0x48, 0x18, 0xd3, 0x13, 0x8e, 0xb1, + 0x5c, 0x5c, 0x4a, 0x28, 0x07, 0x38, 0xd0, 0x02, + 0x4e, 0xbd, 0x02, 0xba, 0x3b, 0x41, 0x4f, 0xe5, + 0x42, 0x37, 0xd8, 0x67, 0x42, 0xde, 0xa6, 0x37, + 0x86, 0xf3, 0x62, 0x9a, 0x68, 0x71, 0xd1, 0x79, + 0x9b, 0xfc, 0x87, 0x2f, 0x10, 0xb4, 0x53, 0x32, + 0xbc, 0x6e, 0x29, 0x24, 0xf9, 0x8c, 0xde, 0x07, + 0x7c, 0x20, 0x82, 0x6b, 0x1e, 0xe7, 0x06, 0xb4, + 0x12, 0xe3, 0xa9, 0xa0, 0x12, 0x78, 0x02, 0xcb, + 0xe3, 0x92, 0x33, 0x86, 0x46, 0x39, 0x87, 0x79, + 0xc0, 0x8f, 0x0a, 0x9f, 0xcb, 0x59, 0x71, 0x67, + 0x90, 0xc9, 0x7b, 0x65, 0x19, 0x92, 0xf2, 0xe6, + 0x42, 0xd6, 0x48, 0x1b, 0x88, 0x86, 0x83, 0x86, + 0xbd, 0xe2, 0xbd, 0xca, 0x2e, 0xef, 0xb2, 0x0b, + 0x97, 0xe6, 0x2c, 0x70, 0xb8, 0xb4, 0x21, 0xf1, + 0xc8, 0xe6, 0xe1, 0x71, 0x08, 0x2b, 0xb1, 0xc7, + 0x2c, 0x95, 0xe6, 0xd8, 0xe7, 0x90, 0x34, 0xe1, + 0x04, 0xd3, 0xb7, 0x45, 0x28, 0x6c, 0xad, 0x86, + 0xcd, 0xfb, 0x5f, 0x37, 0x4b, 0x83, 0x30, 0x66, + 0x3d, 0x35, 0x02, 0xbb, 0xdb, 0x8b, 0xb6, 0xe2, + 0xee, 0x5c, 0x9f, 0x27, 0xb1, 0x8e, 0xca, 0x91, + 0x4d, 0x74, 0xd3, 0x2c, 0x8f, 0xa0, 0x26, 0x94, + 0x06, 0x9a, 0x7c, 0xe5, 0x9b, 0xeb, 0xb3, 0x79, + 0xb2, 0xe2, 0x77, 0x34, 0x36, 0x57, 0x4e, 0xd1, + 0x29, 0x00, 0x0a, 0xbc, 0x1d, 0x27, 0x42, 0x0a, + 0xd9, 0xdd, 0x3b, 0xfa, 0x54, 0xbe, 0x75, 0x67, + 0x6d, 0x6d, 0x65, 0x97, 0x4b, 0x0b, 0x03, 0x1f, + 0x34, 0x58, 0xa4, 0x23, 0x74, 0x90, 0xde, 0x35, + 0x11, 0xb9, 0xdc, 0xf9, 0x15, 0xab, 0x30, 0xb5, + 0xb0, 0xb8, 0xcb, 0x72, 0xef, 0x6c, 0xbb, 0x16, + 0xb8, 0x61, 0x6e, 0x0a, 0x8a, 0xe2, 0xab, 0x5b, + 0x5d, 0xde, 0xc2, 0x08, 0xcc, 0x86, 0xca, 0xd6, + 0xe6, 0x0b, 0xf7, 0xcf, 0x18, 0x7b, 0xa1, 0x87, + 0x14, 0x75, 0xdc, 0x34, 0x27, 0xe4, 0x5c, 0x71, + 0xcb, 0x65, 0xd5, 0x72, 0x31, 0xf0, 0xb9, 0xd7, + 0x85, 0xf5, 0x6c, 0xd4, 0x38, 0x43, 0x45, 0x34, + 0x55, 0x58, 0x72, 0xcb, 0x3b, 0x0b, 0x6b, 0x4c, + 0xc3, 0xd9, 0x2e, 0xc5, 0xd1, 0x74, 0x2e, 0x0e, + 0x00, 0x53, 0x0d, 0x1a, 0xe5, 0x1d, 0x6c, 0x07, + 0xc2, 0x37, 0x14, 0xe9, 0x03, 0x4f, 0x62, 0x8c, + 0x41, 0xab, 0x30, 0xb2, 0x81, 0x99, 0x46, 0x5d, + 0x34, 0x31, 0xd2, 0x79, 0xc9, 0x0f, 0x22, 0xb8, + 0x9c, 0x40, 0xae, 0xad, 0xd5, 0x16, 0xf8, 0xe4, + 0x8d, 0xd8, 0x64, 0x63, 0x98, 0x77, 0x9c, 0x08, + 0x2a, 0xcb, 0x71, 0x98, 0x49, 0x63, 0xb3, 0xd9, + 0x7b, 0xe0, 0xa0, 0x9d, 0xe0, 0xb5, 0x92, 0x10, + 0x09, 0x68, 0x15, 0xa9, 0x15, 0xec, 0x2d, 0x17, + 0x73, 0xbb, 0x34, 0xd9, 0xb7, 0x5e, 0x5c, 0x00, + 0x6e, 0xad, 0x24, 0xa1, 0x92, 0x94, 0x24, 0x68, + 0xde, 0xf3, 0x90, 0x40, 0xb2, 0x39, 0x64, 0x38, + 0x63, 0x61, 0x90, 0x8d, 0x78, 0x41, 0x34, 0x3d, + 0xc0, 0xb0, 0x5a, 0xe6, 0xbb, 0x0b, 0x85, 0x08, + 0xd6, 0x0e, 0x82, 0xac, 0xb7, 0x63, 0x30, 0xcb, + 0x6c, 0x2c, 0xed, 0x72, 0xc8, 0xde, 0x1c, 0xf6, + 0x73, 0x97, 0x12, 0xb1, 0x98, 0x8d, 0x69, 0xab, + 0x85, 0x6a, 0xce, 0x58, 0xf9, 0xac, 0x72, 0xec, + 0xc2, 0x78, 0xf9, 0xbb, 0xa7, 0xbc, 0x32, 0x60, + 0x45, 0x2b, 0x43, 0xac, 0x8e, 0xe2, 0x08, 0x16, + 0xc5, 0x2b, 0x9d, 0x85, 0xac, 0x71, 0x20, 0x54, + 0xb4, 0x03, 0x5a, 0x76, 0x46, 0xe2, 0xf3, 0x81, + 0xf5, 0x68, 0xc2, 0x49, 0x71, 0xa0, 0x00, 0x12, + 0x49, 0xec, 0x6f, 0xab, 0x3e, 0xd0, 0xe6, 0xf3, + 0x58, 0x5e, 0x73, 0x16, 0x8d, 0x64, 0x6f, 0x92, + 0x36, 0x99, 0xa6, 0x2d, 0x04, 0x90, 0x71, 0x06, + 0xb7, 0x4a, 0xf1, 0x71, 0x7f, 0x35, 0x96, 0x41, + 0x97, 0xcb, 0x00, 0x6b, 0x67, 0x93, 0x13, 0x44, + 0xa4, 0x02, 0x58, 0x2a, 0x49, 0x22, 0xa8, 0x2b, + 0x92, 0x47, 0x24, 0x67, 0x0c, 0x8c, 0x73, 0x1c, + 0x75, 0x07, 0x0a, 0x78, 0x56, 0x63, 0x8a, 0x59, + 0x05, 0x63, 0x63, 0x9f, 0xd9, 0x68, 0x24, 0x77, + 0x94, 0xf5, 0xed, 0xcb, 0xf3, 0x0d, 0x99, 0x6d, + 0xd5, 0xc5, 0x1f, 0x3c, 0x53, 0x06, 0x09, 0x00, + 0x00, 0xd3, 0x7d, 0x6a, 0x93, 0x39, 0x95, 0xb6, + 0xf6, 0xd6, 0x79, 0x28, 0x7b, 0x0b, 0x1b, 0xfa, + 0xf2, 0xd6, 0x78, 0xce, 0x7d, 0x37, 0xf4, 0xeb, + 0x41, 0x06, 0xe6, 0xbc, 0x3b, 0x01, 0x69, 0x0f, + 0xf9, 0xb4, 0x38, 0xb8, 0x14, 0xa6, 0x6f, 0x96, + 0xc3, 0x6b, 0x6b, 0x63, 0x34, 0x0c, 0x76, 0x39, + 0xe2, 0xc7, 0x36, 0xb2, 0x01, 0xa0, 0x3a, 0xb7, + 0x35, 0xae, 0xfc, 0xf6, 0x5b, 0xab, 0x76, 0x65, + 0xb7, 0xef, 0x68, 0x8e, 0xff, 0x00, 0x0b, 0xb9, + 0xc3, 0x41, 0xae, 0x9b, 0xa0, 0xe8, 0x5e, 0xf3, + 0xdc, 0xd2, 0xf6, 0x2c, 0xba, 0xc7, 0x0b, 0xc0, + 0xf6, 0xab, 0x7c, 0x53, 0x78, 0xa3, 0x49, 0x2d, + 0x6d, 0x69, 0xa3, 0x46, 0xbd, 0xc4, 0x15, 0xb8, + 0xe3, 0x92, 0x5a, 0xf3, 0x4c, 0x74, 0x94, 0xf9, + 0xa0, 0x9f, 0x02, 0xd9, 0x6a, 0x0b, 0x6f, 0x21, + 0x69, 0x14, 0x70, 0x95, 0x95, 0x07, 0x41, 0xf2, + 0x95, 0x86, 0xf8, 0x66, 0x39, 0x6d, 0x9d, 0x9d, + 0x9e, 0x57, 0x1b, 0xc7, 0x88, 0x1f, 0x3c, 0xac, + 0x6e, 0x22, 0x5d, 0x4d, 0x55, 0xed, 0xad, 0x79, + 0xac, 0x66, 0x56, 0x65, 0x59, 0x84, 0xb1, 0xf3, + 0x77, 0x32, 0x48, 0xd6, 0x4e, 0x08, 0xa1, 0x34, + 0x3a, 0xcf, 0x02, 0x09, 0x3c, 0xeb, 0xde, 0x9b, + 0xe6, 0x0f, 0x09, 0x5c, 0x0b, 0xbf, 0x39, 0xf7, + 0xa6, 0xf9, 0x83, 0xc2, 0x57, 0x02, 0x0f, 0x76, + 0xfe, 0xf1, 0x1f, 0x9c, 0xdf, 0x0a, 0x9e, 0x50, + 0x36, 0xfe, 0xf1, 0x1f, 0x9c, 0xdf, 0x0a, 0x9d, + 0xaa, 0x0c, 0xa8, 0xbc, 0xdf, 0xde, 0x6c, 0xbc, + 0xff, 0x00, 0x94, 0x29, 0x3a, 0xa8, 0xcc, 0xdf, + 0xde, 0x6c, 0xbc, 0xff, 0x00, 0x94, 0x20, 0xc6, + 0x51, 0xef, 0x37, 0xbf, 0x68, 0x7e, 0xb1, 0x52, + 0x8a, 0x2b, 0x28, 0xf7, 0x9b, 0xdf, 0xb4, 0x3f, + 0x58, 0xa9, 0x54, 0x04, 0x44, 0x41, 0xe9, 0x9e, + 0x49, 0x5f, 0x0f, 0xbd, 0xf7, 0xdb, 0x8f, 0xb5, + 0x7f, 0xd6, 0x2b, 0xee, 0x0c, 0xd4, 0x57, 0xc4, + 0x2f, 0x7d, 0xf6, 0xe3, 0xed, 0x5f, 0xf5, 0x8a, + 0xc9, 0xe6, 0xfc, 0x28, 0xfa, 0x0f, 0xed, 0xbf, + 0xbf, 0xcc, 0x7c, 0x31, 0xff, 0x00, 0x9b, 0x42, + 0x22, 0x2c, 0x8f, 0xa4, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x06, 0x46, 0xa5, 0x70, 0xd8, + 0x11, 0xff, 0x00, 0x67, 0x9d, 0xff, 0x00, 0xe3, + 0xb7, 0xc1, 0x22, 0xa7, 0x8d, 0x4a, 0xe1, 0xf8, + 0x7a, 0xe6, 0xbf, 0xad, 0x2d, 0x09, 0xf1, 0xe7, + 0xb6, 0xf1, 0x3b, 0x98, 0x9b, 0xfd, 0xe5, 0xd3, + 0x07, 0xf1, 0x21, 0x87, 0xf9, 0xaf, 0x0f, 0x27, + 0x92, 0x7f, 0x63, 0xff, 0x00, 0x9e, 0xaa, 0x79, + 0xae, 0x85, 0x71, 0xd8, 0xef, 0xf4, 0xfe, 0xd0, + 0x7d, 0x81, 0xfa, 0x8f, 0x55, 0x07, 0xb6, 0x48, + 0xdc, 0x58, 0xf6, 0x96, 0xbd, 0x84, 0xb5, 0xc0, + 0xeb, 0x04, 0x6b, 0x0a, 0xdf, 0xb3, 0x00, 0xdb, + 0xec, 0x96, 0x7b, 0x76, 0xfd, 0x0c, 0x95, 0x86, + 0x36, 0x1d, 0xf2, 0x18, 0x5b, 0xe1, 0x72, 0x9f, + 0x2f, 0xf7, 0xfe, 0x12, 0x8f, 0xe6, 0xb3, 0x5f, + 0x4b, 0x31, 0x1c, 0x77, 0xe4, 0xc3, 0x11, 0xef, + 0xfa, 0xa1, 0xeb, 0x61, 0x9f, 0x6e, 0xcc, 0xb3, + 0x38, 0x7d, 0xd3, 0x44, 0x90, 0x46, 0xd6, 0xc9, + 0x23, 0x0e, 0x90, 0x43, 0x01, 0x75, 0x0f, 0x02, + 0xd1, 0x97, 0x6d, 0xd6, 0x65, 0x26, 0x67, 0x18, + 0xbe, 0x11, 0xbf, 0x2e, 0x99, 0xc2, 0x37, 0x5b, + 0x61, 0x14, 0x63, 0x0f, 0x8a, 0x29, 0xbf, 0x4a, + 0xac, 0x6c, 0xac, 0x32, 0x4d, 0xb3, 0x9b, 0x41, + 0x1c, 0x63, 0xc6, 0x30, 0x8a, 0x76, 0x48, 0x69, + 0x27, 0xc0, 0xab, 0x56, 0x8d, 0x92, 0x6b, 0xa8, + 0x62, 0x60, 0xc4, 0xe9, 0x24, 0x6b, 0x5a, 0x3b, + 0x2e, 0x34, 0x57, 0xdf, 0x6a, 0xd7, 0x16, 0xdf, + 0x6c, 0x4e, 0xbe, 0xfe, 0x2c, 0xf1, 0xe5, 0xb0, + 0x66, 0xf3, 0x3e, 0x7a, 0xd9, 0x63, 0xf5, 0xab, + 0x58, 0xd7, 0xf5, 0x7e, 0x9e, 0x33, 0x1c, 0xa5, + 0x27, 0xb5, 0x99, 0x54, 0x79, 0x4e, 0x79, 0x3d, + 0xb4, 0x03, 0x0d, 0xbb, 0x88, 0x92, 0x36, 0xef, + 0x07, 0xe9, 0xa7, 0x70, 0xa8, 0xfc, 0xbe, 0xf6, + 0xe7, 0x2f, 0xbb, 0x8a, 0xf2, 0xd8, 0x86, 0x4f, + 0x19, 0x38, 0x09, 0x15, 0x1a, 0x46, 0xf2, 0xb0, + 0xfe, 0x23, 0x4c, 0xc9, 0x33, 0xee, 0x6d, 0x86, + 0xa6, 0x28, 0x98, 0xd7, 0x76, 0x09, 0xab, 0xbe, + 0x55, 0x57, 0xd2, 0x4b, 0x48, 0x5c, 0xb2, 0x46, + 0x99, 0x2d, 0xf1, 0x6a, 0xf2, 0x53, 0x39, 0x7c, + 0x9e, 0x18, 0xc9, 0x1b, 0xe2, 0xd8, 0xe9, 0xae, + 0xbc, 0x75, 0xe3, 0xed, 0xf9, 0x2f, 0x1b, 0x77, + 0x9c, 0xe6, 0x11, 0xb2, 0xd6, 0xc6, 0x37, 0x8e, + 0x62, 0xf6, 0xd9, 0xb2, 0x4c, 0xca, 0x0d, 0x2e, + 0x2e, 0xdf, 0xdc, 0xd4, 0xb1, 0x98, 0x5f, 0x1d, + 0x91, 0xca, 0xec, 0xf2, 0xec, 0xb5, 0x8d, 0x6d, + 0xfd, 0xcc, 0x62, 0x6b, 0x99, 0xdc, 0xd0, 0xe7, + 0x69, 0xdc, 0xe1, 0xaa, 0xe3, 0xdb, 0xe2, 0x05, + 0xe6, 0x54, 0xed, 0xc6, 0xd9, 0xc6, 0x4f, 0x68, + 0x38, 0xa7, 0xe2, 0x2b, 0x1c, 0xec, 0xc2, 0xd2, + 0xe0, 0x0f, 0xd5, 0x4d, 0x6c, 0xdc, 0x27, 0x73, + 0x59, 0x3e, 0x02, 0xbb, 0xde, 0xd3, 0x13, 0x96, + 0x63, 0xc6, 0x36, 0xe9, 0xee, 0x79, 0x9e, 0x5b, + 0x06, 0x3b, 0x63, 0xf2, 0x58, 0xa6, 0xbf, 0xed, + 0xe4, 0x8c, 0xd7, 0xbd, 0x7c, 0x22, 0xf7, 0xaf, + 0xdb, 0xb9, 0xdb, 0x96, 0xdf, 0x1d, 0xaf, 0xcb, + 0x6f, 0x32, 0xec, 0xd1, 0xac, 0x75, 0xfd, 0xb4, + 0x66, 0x5b, 0x5b, 0x96, 0x80, 0xd2, 0x69, 0xd8, + 0xdc, 0xa1, 0xa0, 0x3b, 0xea, 0x8c, 0xe0, 0x01, + 0x02, 0x9a, 0x77, 0x7b, 0x7a, 0x15, 0xaf, 0xf0, + 0xf1, 0x84, 0x66, 0x77, 0x73, 0x91, 0xfa, 0xa8, + 0x2d, 0x1e, 0x1e, 0x77, 0xb1, 0x39, 0xa5, 0xa3, + 0xe8, 0x15, 0x56, 0x91, 0xd8, 0xe4, 0x73, 0xc6, + 0x80, 0xf7, 0x17, 0x0e, 0xed, 0x4a, 0xe3, 0x92, + 0x66, 0x69, 0x59, 0x9f, 0x19, 0xd5, 0xbf, 0xc9, + 0xd2, 0x31, 0x79, 0x8f, 0x33, 0x87, 0x1f, 0x0c, + 0x75, 0xec, 0xda, 0x2b, 0xec, 0xa4, 0xdb, 0xee, + 0x88, 0x7b, 0xb5, 0xba, 0xb8, 0xb3, 0xb8, 0x17, + 0x16, 0xcf, 0xe6, 0xe6, 0x8e, 0xb8, 0x1c, 0x37, + 0x15, 0xa7, 0x63, 0xe6, 0x96, 0x6c, 0xaf, 0x68, + 0x65, 0x95, 0xee, 0x91, 0xef, 0xb7, 0x0e, 0x73, + 0xdc, 0x6a, 0x49, 0x22, 0x5d, 0x25, 0x54, 0x0e, + 0xb2, 0xad, 0xbb, 0x15, 0xfc, 0xa3, 0x3f, 0xff, + 0x00, 0xc6, 0x6f, 0x82, 0x55, 0x38, 0x66, 0x77, + 0x44, 0x6b, 0xc3, 0xea, 0xff, 0x00, 0xe5, 0x4f, + 0xf3, 0x4a, 0xd7, 0xd3, 0xe4, 0xb6, 0x91, 0xbb, + 0x5c, 0x75, 0xd7, 0xdb, 0xa7, 0x76, 0xbc, 0x15, + 0x30, 0x74, 0x83, 0x5a, 0x1d, 0x75, 0xdd, 0x5e, + 0xe2, 0x8e, 0x7b, 0x99, 0x99, 0x0c, 0x2d, 0x32, + 0x4a, 0xf2, 0x1a, 0xd6, 0x8d, 0x25, 0xc4, 0xaf, + 0x03, 0x70, 0x69, 0x3b, 0x94, 0x1a, 0xf4, 0xef, + 0x2b, 0xad, 0xa5, 0xbd, 0xa6, 0xc7, 0xe5, 0xcd, + 0xcc, 0x2f, 0x18, 0xd9, 0x73, 0xab, 0xa6, 0xfe, + 0xa2, 0x03, 0xa4, 0x46, 0x08, 0xd7, 0xd8, 0xec, + 0xf0, 0x2a, 0xd2, 0x9b, 0xb8, 0xfe, 0xac, 0x7d, + 0xce, 0xde, 0x6f, 0xcd, 0x76, 0x62, 0x2b, 0x48, + 0xee, 0x66, 0xc9, 0x3b, 0x71, 0xe3, 0x8f, 0xba, + 0x7d, 0xff, 0x00, 0xb3, 0x1e, 0xd6, 0xac, 0xfb, + 0x9a, 0xc8, 0xb6, 0x6e, 0xdf, 0x20, 0xa8, 0x75, + 0xed, 0xcb, 0xc4, 0xf7, 0x54, 0xd3, 0x84, 0x02, + 0x1d, 0xdf, 0x34, 0x03, 0xb4, 0xb5, 0x6d, 0x4b, + 0x44, 0x7b, 0x2d, 0xb3, 0xec, 0x6e, 0xa3, 0x1b, + 0x8f, 0xd1, 0x6f, 0x1a, 0xad, 0x5e, 0x5d, 0xdc, + 0x5e, 0xdd, 0x49, 0x73, 0x74, 0xf3, 0x24, 0xd2, + 0xbb, 0x13, 0x9e, 0x77, 0x55, 0x9b, 0x3e, 0xff, + 0x00, 0xb9, 0xd8, 0xcc, 0x92, 0xe5, 0xa7, 0x10, + 0x80, 0xba, 0x17, 0x9d, 0xe7, 0x53, 0xf4, 0x17, + 0x5d, 0xd1, 0x68, 0xc9, 0xa7, 0x84, 0x56, 0x22, + 0xbf, 0x06, 0x19, 0xf2, 0xf3, 0x82, 0xfe, 0x57, + 0x7c, 0xc5, 0xaf, 0x93, 0x3e, 0x4b, 0x64, 0x9f, + 0x67, 0x73, 0x25, 0x27, 0xfc, 0x1c, 0xff, 0x00, + 0x87, 0xcf, 0x70, 0xda, 0x58, 0x06, 0xe1, 0x64, + 0x80, 0xf2, 0x4a, 0x83, 0xcc, 0xc6, 0x1c, 0xca, + 0xed, 0xbb, 0x82, 0x79, 0x00, 0x1f, 0xdb, 0x2a, + 0x7f, 0xf0, 0xf2, 0x3a, 0xe7, 0xdc, 0xfb, 0xb4, + 0x32, 0xda, 0x07, 0xc8, 0xf3, 0xbd, 0x51, 0x87, + 0xfb, 0xca, 0xbb, 0x79, 0x20, 0x9e, 0xe6, 0x79, + 0xc6, 0x91, 0x2c, 0x8f, 0x70, 0xee, 0xba, 0xbe, + 0x02, 0xa9, 0x6f, 0xe1, 0xd3, 0xf6, 0xac, 0xd3, + 0x8f, 0x8f, 0x9f, 0xcf, 0xa7, 0xe5, 0x61, 0xff, + 0x00, 0xea, 0x4a, 0xec, 0x61, 0xff, 0x00, 0xec, + 0xd6, 0x5d, 0x97, 0x3b, 0x87, 0x0b, 0x95, 0x86, + 0x4c, 0x59, 0x85, 0x86, 0xd3, 0x65, 0xc3, 0xc6, + 0x92, 0xd6, 0xe5, 0xd7, 0x30, 0xb7, 0x76, 0x95, + 0xc4, 0x70, 0xf2, 0x4f, 0x0a, 0xaf, 0x6c, 0x5f, + 0xfa, 0x9e, 0xc7, 0xce, 0x77, 0xd4, 0x72, 0x98, + 0xc9, 0xae, 0xdb, 0x06, 0xdf, 0x5e, 0xdb, 0xc8, + 0x7f, 0x55, 0x79, 0x24, 0xd6, 0xef, 0x1b, 0xf8, + 0xb4, 0xb7, 0xbe, 0x15, 0xf1, 0xff, 0x00, 0x0e, + 0xb1, 0xd5, 0x33, 0x5f, 0xfd, 0xd1, 0xa3, 0x27, + 0x9f, 0xac, 0xcf, 0x9a, 0xc9, 0x7a, 0x7d, 0xf8, + 0x30, 0xe3, 0xcd, 0x5f, 0xff, 0x00, 0x1e, 0x4d, + 0xd3, 0xfe, 0x08, 0xfd, 0x88, 0x89, 0xac, 0xcc, + 0x6e, 0x73, 0x29, 0x07, 0xea, 0x72, 0xd8, 0x5f, + 0x31, 0x27, 0x56, 0x22, 0x30, 0xb4, 0x78, 0x57, + 0x66, 0x6d, 0x2b, 0xe7, 0xd8, 0x3c, 0xbe, 0x69, + 0x09, 0x2f, 0x96, 0xed, 0xef, 0x71, 0xec, 0x9e, + 0x78, 0xfc, 0xab, 0x17, 0x16, 0xae, 0xc8, 0xf6, + 0x63, 0x31, 0x85, 0xc3, 0x0c, 0xf7, 0xd7, 0xa6, + 0xdc, 0x7d, 0x94, 0x46, 0xbc, 0x7c, 0x2b, 0x19, + 0x95, 0x3f, 0xdb, 0xdc, 0xb3, 0xff, 0x00, 0x24, + 0xd7, 0x82, 0x55, 0x31, 0x13, 0x5a, 0x5a, 0x9f, + 0xe8, 0x9b, 0x4f, 0xe3, 0xa2, 0xb6, 0xb5, 0x72, + 0xf9, 0x8c, 0x5e, 0x63, 0x84, 0xd6, 0xde, 0x6b, + 0x1e, 0x3c, 0x7a, 0xcf, 0xea, 0x52, 0xb6, 0x9f, + 0xd3, 0x64, 0x8e, 0x5d, 0x97, 0xd9, 0xe6, 0x3b, + 0x15, 0x67, 0x6d, 0x7b, 0x72, 0x2d, 0x21, 0xe7, + 0x5c, 0xf1, 0x29, 0x20, 0x78, 0xc1, 0xcf, 0x01, + 0xbe, 0x32, 0xe5, 0x3b, 0x1f, 0xb3, 0x34, 0xa8, + 0xcf, 0x19, 0x5d, 0xea, 0xb3, 0x8d, 0x68, 0xbe, + 0xa1, 0xfc, 0x3a, 0xb2, 0xec, 0xdc, 0x9a, 0x70, + 0xc8, 0xaa, 0x74, 0xd2, 0x34, 0x0a, 0x77, 0x14, + 0x65, 0xbc, 0x46, 0xd8, 0x9a, 0xeb, 0xfe, 0xdc, + 0x2f, 0xe5, 0x7c, 0xbe, 0x6c, 0x93, 0x9a, 0xf4, + 0xf3, 0x37, 0xc5, 0x5f, 0x51, 0x93, 0xe9, 0xad, + 0x62, 0x63, 0xee, 0x5e, 0xb6, 0xc2, 0xd6, 0xde, + 0xd3, 0x63, 0xf2, 0xdb, 0x6b, 0x79, 0x7d, 0xa2, + 0x06, 0x4e, 0x03, 0x25, 0xa8, 0xf1, 0x86, 0x09, + 0x0e, 0xe7, 0x65, 0x43, 0xda, 0xed, 0xd6, 0xd0, + 0x43, 0x14, 0x56, 0xf0, 0x3d, 0x85, 0x91, 0xb4, + 0x46, 0xc1, 0xcd, 0x82, 0x74, 0x68, 0x03, 0xb2, + 0x57, 0x6e, 0x78, 0x70, 0xec, 0x0e, 0x4c, 0x7f, + 0xc5, 0x14, 0x03, 0xcd, 0x95, 0x6a, 0xd9, 0x4c, + 0xb2, 0xda, 0xca, 0xd6, 0x4d, 0xa5, 0xcc, 0xc5, + 0x2d, 0xad, 0x74, 0xdb, 0x30, 0xfe, 0x7c, 0x9b, + 0x84, 0x77, 0x74, 0x05, 0x36, 0xdd, 0x39, 0x34, + 0xaf, 0xd3, 0x1b, 0x62, 0x67, 0xe4, 0xe7, 0x86, + 0x30, 0x53, 0xc9, 0xda, 0xd9, 0xeb, 0x5c, 0xfb, + 0x33, 0x65, 0xa5, 0x62, 0x63, 0xeb, 0xb5, 0xed, + 0x6e, 0x15, 0xae, 0x9c, 0xd3, 0x1b, 0x43, 0x9f, + 0xe6, 0x16, 0x1b, 0x3a, 0xcb, 0x6c, 0xc1, 0xec, + 0x93, 0x36, 0xbf, 0x04, 0xf3, 0x60, 0x50, 0x45, + 0x19, 0xd7, 0x88, 0x0d, 0xe1, 0xa3, 0xb6, 0xbe, + 0x79, 0x4a, 0x00, 0x07, 0x6a, 0xab, 0xb3, 0x36, + 0xcc, 0xee, 0x33, 0x3b, 0xe9, 0x6f, 0x6e, 0x4d, + 0x5f, 0x21, 0xd4, 0x35, 0x35, 0xa3, 0x43, 0x58, + 0xde, 0xc0, 0x5c, 0x6e, 0x1b, 0xab, 0x96, 0x5c, + 0x9b, 0xe7, 0xfc, 0x1b, 0xff, 0x00, 0x97, 0xf9, + 0x3f, 0x4f, 0x8a, 0x7e, 0xde, 0xe5, 0xa7, 0x75, + 0xe2, 0xbf, 0x6d, 0x75, 0xf6, 0x47, 0xc1, 0x82, + 0x11, 0x64, 0x9a, 0xac, 0x2e, 0x4d, 0xdf, 0x01, + 0x11, 0x14, 0x82, 0x22, 0x20, 0x2c, 0x8d, 0x6b, + 0x0b, 0x23, 0x5a, 0x06, 0xeb, 0x57, 0xdc, 0x6d, + 0xff, 0x00, 0x97, 0xdb, 0x7d, 0x9b, 0x3e, 0xa8, + 0x5f, 0x0e, 0xdd, 0x6f, 0x69, 0x7d, 0xca, 0x0f, + 0x70, 0xb6, 0xf3, 0x19, 0xf5, 0x42, 0xd5, 0xe4, + 0xfc, 0x6c, 0xf9, 0xef, 0xee, 0x3f, 0xb7, 0x07, + 0xed, 0x5f, 0xf4, 0x55, 0x91, 0xad, 0x57, 0xdd, + 0xe5, 0x1e, 0xd9, 0x56, 0x01, 0xad, 0x57, 0xdd, + 0xe5, 0x1e, 0xd9, 0x5b, 0x1f, 0x38, 0x2f, 0x51, + 0x7e, 0xd5, 0x9e, 0x73, 0x7c, 0x21, 0x79, 0x5e, + 0xa2, 0xfd, 0xab, 0x3c, 0xe6, 0xf8, 0x42, 0x0e, + 0x6d, 0xb0, 0xfe, 0x65, 0x1f, 0xd8, 0x8f, 0xac, + 0xe5, 0x04, 0xa7, 0x76, 0xc3, 0xf9, 0x94, 0x7f, + 0x62, 0x3e, 0xb3, 0x94, 0x12, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0xc6, 0x8d, 0xdd, 0x4b, 0x28, + 0x82, 0x6a, 0x3b, 0xcc, 0xb3, 0x30, 0xcb, 0xa0, + 0xb3, 0xbf, 0x94, 0xdb, 0x4d, 0x6c, 0x29, 0x1c, + 0xa0, 0x54, 0x61, 0xd5, 0x43, 0xdc, 0x58, 0x96, + 0xf7, 0x2e, 0xcb, 0xac, 0x27, 0xb4, 0xcb, 0xe5, + 0x75, 0xc4, 0xd7, 0x3a, 0x24, 0x98, 0x8c, 0x2d, + 0x0d, 0xec, 0x70, 0xa8, 0x65, 0x8a, 0xee, 0x57, + 0xb8, 0x82, 0xc7, 0x68, 0x6c, 0xc6, 0xcc, 0xb6, + 0x3b, 0xc2, 0x44, 0x32, 0x4c, 0x58, 0x5e, 0xdd, + 0x25, 0x84, 0xea, 0x75, 0x37, 0x75, 0x2e, 0x59, + 0xee, 0xb2, 0xfb, 0x1c, 0xb6, 0x5b, 0x1b, 0x09, + 0x5d, 0x71, 0x25, 0xc9, 0x06, 0x69, 0x48, 0xc2, + 0x30, 0x8d, 0xe5, 0xc6, 0xec, 0xc8, 0x9c, 0xa9, + 0xb9, 0x6e, 0x00, 0x00, 0x90, 0x49, 0xce, 0x57, + 0x4f, 0x02, 0xe2, 0xdc, 0x41, 0x95, 0x33, 0x97, + 0x5d, 0xe5, 0xaf, 0xca, 0x5f, 0x96, 0xde, 0xca, + 0xe8, 0x6b, 0x2f, 0x38, 0x1e, 0xd1, 0x5a, 0xea, + 0xe2, 0x50, 0xc8, 0x82, 0x66, 0xda, 0xef, 0x2e, + 0xb8, 0xb0, 0x76, 0x57, 0x77, 0x29, 0x8d, 0x91, + 0x3c, 0xba, 0xda, 0xe2, 0x95, 0x14, 0x27, 0x74, + 0x77, 0x56, 0x2e, 0x6f, 0x2c, 0x2d, 0x32, 0xc7, + 0xe5, 0xb6, 0x12, 0x9b, 0x87, 0xcc, 0x6b, 0x3c, + 0xe4, 0x61, 0x04, 0x6f, 0x00, 0xa1, 0xd1, 0x06, + 0x34, 0x6e, 0x77, 0x35, 0xd7, 0xbc, 0xac, 0x3e, + 0xd5, 0x90, 0xcf, 0x95, 0xdb, 0x59, 0x4f, 0x71, + 0x2c, 0x42, 0x20, 0x1d, 0x23, 0x23, 0x61, 0xd2, + 0xf3, 0xaf, 0x17, 0x8a, 0xea, 0xd0, 0xaa, 0xfa, + 0x20, 0x93, 0xbb, 0x87, 0x67, 0x9b, 0x6d, 0x2b, + 0xad, 0x6e, 0x67, 0x92, 0xe2, 0x9e, 0x23, 0x5c, + 0xda, 0x34, 0x92, 0x40, 0x3f, 0x98, 0x37, 0x16, + 0xff, 0x00, 0x6c, 0xcb, 0xb3, 0x2b, 0x08, 0x2d, + 0xaf, 0xa6, 0x36, 0x97, 0x16, 0xd4, 0x0c, 0x94, + 0x37, 0x10, 0x73, 0x47, 0x69, 0x42, 0xa2, 0x09, + 0x7b, 0xdb, 0xeb, 0x1b, 0x7c, 0xb7, 0xab, 0x32, + 0xf7, 0x99, 0x83, 0xce, 0x39, 0xa6, 0x22, 0x80, + 0xd3, 0x70, 0x05, 0xea, 0x2b, 0xdc, 0xbf, 0x30, + 0xcb, 0xa2, 0xb1, 0xbf, 0x94, 0xdb, 0xcd, 0x6d, + 0xa2, 0x29, 0xa9, 0x88, 0x61, 0xa5, 0x28, 0x54, + 0x32, 0x20, 0x97, 0xbb, 0xbd, 0xb0, 0xb5, 0xcb, + 0x5d, 0x96, 0xe5, 0xf2, 0x19, 0xcc, 0xae, 0x0e, + 0x9e, 0x72, 0x30, 0x83, 0x4d, 0xc1, 0xc0, 0xa1, + 0xff, 0x00, 0x2f, 0xca, 0x8b, 0x28, 0x82, 0x4f, + 0x31, 0xbf, 0xb4, 0xb8, 0xca, 0xac, 0x2d, 0xa2, + 0x79, 0x32, 0xdb, 0xd7, 0x9c, 0x14, 0x22, 0x95, + 0x14, 0xdd, 0x5e, 0xf2, 0x9c, 0xc6, 0xd5, 0xb6, + 0x77, 0x19, 0x75, 0xf9, 0x22, 0xda, 0x51, 0x56, + 0x3c, 0x02, 0xec, 0x2f, 0xed, 0x00, 0x7b, 0x6a, + 0x25, 0x61, 0x04, 0xf4, 0x17, 0x79, 0x3c, 0xd9, + 0x3c, 0x59, 0x7d, 0xdd, 0xc3, 0xe3, 0x74, 0x6f, + 0x2e, 0xf1, 0x18, 0xe3, 0xba, 0x69, 0xf9, 0xa9, + 0x05, 0xf6, 0x4d, 0x95, 0xb6, 0x57, 0xd8, 0x19, + 0x6e, 0x2e, 0x9e, 0xd2, 0xc6, 0xb9, 0xe3, 0x08, + 0x68, 0x3d, 0xba, 0x28, 0x24, 0x40, 0x24, 0x92, + 0x4b, 0xb5, 0x93, 0x53, 0xdb, 0x52, 0xb9, 0x65, + 0xfd, 0x97, 0xb1, 0x4d, 0x96, 0xe6, 0x05, 0xcc, + 0x86, 0x47, 0x63, 0x63, 0xdb, 0xa4, 0xb5, 0xca, + 0x29, 0x10, 0x4e, 0xda, 0x3f, 0x22, 0xca, 0xa5, + 0x37, 0x51, 0xdc, 0xba, 0xf6, 0x66, 0x02, 0x22, + 0x63, 0x5b, 0x84, 0x0a, 0xef, 0xad, 0x19, 0x7e, + 0x6b, 0x03, 0x23, 0xcc, 0x8d, 0xd3, 0xcb, 0x66, + 0xbc, 0x61, 0x0d, 0x00, 0x13, 0xe3, 0x10, 0xed, + 0x1d, 0xf5, 0x12, 0x95, 0x41, 0xba, 0xc6, 0x51, + 0x05, 0xec, 0x13, 0xba, 0xb8, 0x63, 0x91, 0x8f, + 0x75, 0x2a, 0x74, 0x07, 0x02, 0x75, 0x76, 0x94, + 0xeb, 0xf3, 0x8c, 0xb1, 0x93, 0x66, 0x17, 0x70, + 0x4c, 0x4c, 0xd7, 0x31, 0xb5, 0xb0, 0x0c, 0x0f, + 0x14, 0xd1, 0x84, 0xeb, 0x03, 0x75, 0x56, 0xd6, + 0x50, 0x60, 0x8d, 0x1a, 0xa8, 0x77, 0x3b, 0xa1, + 0x58, 0xce, 0x71, 0x97, 0xc9, 0x79, 0x96, 0xde, + 0x3e, 0x42, 0x24, 0x81, 0xae, 0x6d, 0xc0, 0xc2, + 0xe3, 0x4f, 0x12, 0x83, 0x73, 0x4d, 0x49, 0x55, + 0xd5, 0x84, 0x12, 0xf6, 0x79, 0xa5, 0xbc, 0x19, + 0xe3, 0xef, 0x4b, 0xcf, 0xb3, 0x48, 0xe7, 0x55, + 0xd4, 0xd3, 0x85, 0xda, 0x89, 0x1d, 0xb0, 0x97, + 0x79, 0x9d, 0xbd, 0xc6, 0x7d, 0x15, 0xeb, 0x5c, + 0x7d, 0x9a, 0x17, 0xc7, 0x85, 0xd4, 0x3e, 0x4b, + 0x48, 0x71, 0xf1, 0x54, 0x4a, 0x20, 0xec, 0xce, + 0x6e, 0x61, 0xbb, 0xcc, 0xa6, 0xb8, 0x80, 0xe2, + 0x89, 0xe4, 0x51, 0xc4, 0x11, 0xb8, 0x37, 0xd7, + 0x1a, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x92, 0xd9, 0xbf, 0xe7, 0x36, 0xfd, 0xb7, 0x7d, + 0x42, 0xa3, 0x54, 0x96, 0xcd, 0xff, 0x00, 0x39, + 0xb7, 0xed, 0xbb, 0xea, 0x14, 0x13, 0x59, 0x87, + 0xbe, 0xcd, 0xe7, 0x7c, 0x81, 0x73, 0xae, 0x8c, + 0xc3, 0xdf, 0x66, 0xf3, 0xbe, 0x40, 0xb9, 0xd0, + 0x13, 0x71, 0x11, 0x06, 0xad, 0xb5, 0x1f, 0xe5, + 0x16, 0x8e, 0xde, 0x34, 0xe1, 0x01, 0x57, 0x5f, + 0x71, 0x6e, 0x76, 0x6e, 0x3b, 0x73, 0x23, 0x4c, + 0x82, 0xe8, 0xbc, 0xc5, 0x51, 0x5c, 0x38, 0x1c, + 0x2b, 0x4a, 0x2b, 0x85, 0xed, 0x9b, 0x73, 0x9c, + 0x95, 0xf6, 0x80, 0xd2, 0xe6, 0x2a, 0x73, 0x7e, + 0x73, 0x75, 0x70, 0x8d, 0x0a, 0x87, 0x25, 0x85, + 0xc4, 0x6f, 0x31, 0xbd, 0x98, 0x1e, 0xc3, 0x47, + 0x36, 0xba, 0xa9, 0xb8, 0xb3, 0xe6, 0xad, 0xf7, + 0x4e, 0xda, 0xeb, 0xf4, 0xbd, 0xaf, 0xe5, 0x79, + 0xb0, 0x46, 0x0d, 0x99, 0x32, 0xf6, 0xad, 0x5c, + 0xdd, 0xca, 0xff, 0x00, 0xed, 0x76, 0x5f, 0xcf, + 0x04, 0xd9, 0x06, 0x5d, 0x0f, 0x3a, 0x0c, 0xd6, + 0xee, 0x95, 0xae, 0x8a, 0xbe, 0x38, 0x69, 0x77, + 0x8a, 0x69, 0xbd, 0xa1, 0x33, 0xbb, 0x88, 0x26, + 0xb7, 0xcb, 0x83, 0x24, 0x6b, 0xcc, 0x56, 0x8d, + 0x6b, 0xc3, 0x4d, 0x4b, 0x5d, 0x88, 0x9a, 0x70, + 0x2e, 0x2f, 0x65, 0x9a, 0x9f, 0xd2, 0x9e, 0xcb, + 0x37, 0xe4, 0x57, 0x3d, 0x32, 0x74, 0x4b, 0xd0, + 0xa7, 0x98, 0xf2, 0x95, 0xb5, 0x27, 0xd4, 0xe3, + 0x9e, 0xdd, 0xf2, 0xe4, 0xd2, 0x2f, 0x1f, 0xfd, + 0xde, 0x3a, 0x7e, 0xf2, 0x5a, 0x76, 0x5b, 0xe7, + 0x56, 0x36, 0x4e, 0x6d, 0xdc, 0x56, 0xf7, 0x56, + 0x91, 0x73, 0x13, 0xb2, 0x62, 0x45, 0x43, 0x74, + 0x87, 0x34, 0xee, 0xeb, 0x5c, 0xf9, 0x9c, 0xf6, + 0x32, 0x66, 0x31, 0x47, 0x63, 0x84, 0xc3, 0x6e, + 0xc1, 0x10, 0x91, 0xa0, 0x0c, 0x6e, 0x68, 0xf1, + 0x9e, 0x7b, 0xab, 0x84, 0xda, 0x4a, 0x77, 0x01, + 0xa6, 0xaa, 0x95, 0xb2, 0x1b, 0x77, 0xb1, 0xd8, + 0x9c, 0x46, 0x8d, 0x42, 0xbb, 0xea, 0x6b, 0x5b, + 0x6e, 0x8d, 0x69, 0xa7, 0xbd, 0x9f, 0x26, 0x4f, + 0x29, 0x4c, 0x56, 0x8a, 0xf9, 0x98, 0xc9, 0x58, + 0xa6, 0x48, 0xc7, 0x8e, 0x2d, 0x1f, 0xad, 0xe3, + 0xaf, 0x3d, 0x16, 0x7c, 0xc9, 0xae, 0x76, 0xcd, + 0xe5, 0x61, 0xad, 0x2e, 0x3b, 0xc0, 0x13, 0xb8, + 0x77, 0x82, 0xf7, 0xb3, 0x10, 0xcb, 0x0b, 0x2f, + 0x6e, 0x26, 0x69, 0x8e, 0xdb, 0x9a, 0x20, 0x97, + 0xe8, 0x04, 0xeb, 0xd4, 0x54, 0x7d, 0xbe, 0xd0, + 0x66, 0x96, 0xd0, 0x32, 0xde, 0x19, 0x5a, 0xd8, + 0xa2, 0x18, 0x58, 0x0b, 0x18, 0x74, 0x0e, 0x15, + 0xae, 0xf3, 0x39, 0xcc, 0xaf, 0x59, 0xcd, 0x5c, + 0x4e, 0x5d, 0x1e, 0xeb, 0x1b, 0x46, 0x83, 0xdb, + 0x0d, 0x02, 0xab, 0x67, 0x28, 0x7c, 0xdd, 0x7d, + 0x93, 0x1e, 0xda, 0xc2, 0x4e, 0x09, 0x4e, 0x5b, + 0xb3, 0xb1, 0xdf, 0x59, 0xb5, 0xa2, 0xe2, 0x79, + 0x0b, 0x64, 0x99, 0xc3, 0x11, 0x68, 0x24, 0x8e, + 0xe5, 0x28, 0xbd, 0x07, 0x5d, 0x4b, 0xb2, 0xf7, + 0x73, 0xdd, 0x39, 0xef, 0x32, 0xcc, 0xd7, 0x34, + 0xbf, 0x49, 0x2d, 0x06, 0x36, 0xd4, 0x76, 0x34, + 0x28, 0xbb, 0x1c, 0xe2, 0xf6, 0xc6, 0x27, 0x41, + 0x13, 0x9a, 0xe8, 0x5c, 0x71, 0x73, 0x4f, 0x68, + 0x70, 0xee, 0x55, 0x7b, 0x19, 0xfe, 0x69, 0xfa, + 0xe0, 0x64, 0x0e, 0x13, 0x0a, 0x39, 0xa5, 0xad, + 0x2d, 0x14, 0x14, 0x14, 0x1f, 0x9b, 0xa1, 0x42, + 0xce, 0xc8, 0x5a, 0xe7, 0x6c, 0x94, 0x8d, 0x68, + 0x24, 0xfb, 0x40, 0xd0, 0x2b, 0x5d, 0x6d, 0xde, + 0x58, 0xcb, 0x1a, 0xe7, 0x6c, 0xd6, 0x60, 0x03, + 0x49, 0x38, 0xc5, 0x40, 0x15, 0x3a, 0x30, 0xee, + 0x05, 0x1f, 0x61, 0x9c, 0x5f, 0x65, 0xd1, 0x98, + 0xad, 0x9e, 0x04, 0x6e, 0x35, 0x2d, 0x73, 0x43, + 0x86, 0x2e, 0xc2, 0xcd, 0x9e, 0x73, 0x7f, 0x65, + 0x24, 0xb2, 0x40, 0xf0, 0x0c, 0xee, 0xc5, 0x23, + 0x4b, 0x41, 0x04, 0xf9, 0xbb, 0x88, 0x25, 0x6c, + 0xa7, 0xb9, 0x6e, 0xcc, 0x4e, 0x2d, 0x1c, 0xe6, + 0x4f, 0x04, 0xd5, 0x7e, 0x0a, 0x87, 0x06, 0xb8, + 0x87, 0x1e, 0xf2, 0xe5, 0xb7, 0x97, 0x35, 0xbc, + 0xcb, 0x6e, 0xee, 0xa6, 0xbe, 0x91, 0xb0, 0x40, + 0x28, 0x41, 0x26, 0x8f, 0x2e, 0x1e, 0x4f, 0xc8, + 0xb9, 0x20, 0xcd, 0xef, 0xe0, 0xb9, 0x96, 0xea, + 0x39, 0x29, 0x24, 0xe6, 0xb2, 0x82, 0xd0, 0x5a, + 0xef, 0xec, 0xac, 0xde, 0xe7, 0x17, 0xb7, 0xb1, + 0x88, 0xa5, 0x73, 0x5b, 0x08, 0x35, 0xe6, 0xa3, + 0x18, 0x5b, 0x5d, 0xff, 0x00, 0x15, 0x07, 0x6d, + 0xe8, 0xff, 0x00, 0xea, 0xb6, 0x1f, 0x6a, 0xee, + 0xf8, 0x7d, 0x57, 0x26, 0x43, 0x75, 0xec, 0xd9, + 0xb4, 0x0f, 0x3e, 0x43, 0xc9, 0x8d, 0xdd, 0xa7, + 0xe8, 0x5c, 0xf2, 0x5f, 0xdd, 0x49, 0x69, 0x1d, + 0x9b, 0xde, 0x0c, 0x31, 0x3b, 0x13, 0x1b, 0x40, + 0x34, 0xd0, 0xee, 0xad, 0xd9, 0x6e, 0x57, 0x77, + 0x7e, 0xf0, 0xeb, 0x70, 0x30, 0x46, 0xe6, 0xe3, + 0x79, 0x20, 0x61, 0xae, 0x9d, 0xde, 0xd2, 0x09, + 0x3c, 0xf2, 0x21, 0x97, 0x65, 0x6d, 0xb1, 0x1a, + 0xe6, 0xb8, 0x92, 0x57, 0x76, 0x58, 0xd3, 0xe2, + 0xfc, 0x8a, 0x32, 0xdf, 0x3b, 0xcc, 0xed, 0xa2, + 0x10, 0xc1, 0x39, 0x6c, 0x6d, 0xd0, 0x05, 0x05, + 0x02, 0xe9, 0xda, 0x6b, 0xc6, 0x5c, 0xe6, 0x45, + 0xac, 0x70, 0x7b, 0x20, 0x68, 0x8f, 0x10, 0xd4, + 0x49, 0xd2, 0xee, 0xfa, 0x88, 0xaa, 0x09, 0xbd, + 0x9e, 0xb9, 0x96, 0xeb, 0x68, 0x63, 0x9e, 0xe1, + 0xc5, 0xf2, 0xb9, 0xaf, 0xab, 0x8f, 0x61, 0x94, + 0x51, 0xb7, 0x96, 0xf7, 0x12, 0xdf, 0x4c, 0xc8, + 0xe1, 0x7b, 0x9c, 0xf9, 0x1d, 0x86, 0x80, 0xe9, + 0xa9, 0xd7, 0xa9, 0x78, 0xb4, 0xbb, 0x9e, 0xce, + 0x76, 0xdc, 0x5b, 0xb8, 0x36, 0x56, 0x82, 0x01, + 0x23, 0x16, 0xb5, 0xde, 0x76, 0x9b, 0x3a, 0x20, + 0x8e, 0x7c, 0x69, 0xde, 0x63, 0x41, 0xe1, 0xa2, + 0x09, 0x7c, 0xc2, 0xde, 0x19, 0xef, 0xf2, 0x8b, + 0x3b, 0xba, 0x3e, 0x46, 0xb0, 0x99, 0x9a, 0x77, + 0x74, 0x36, 0x8d, 0x3d, 0xb2, 0xd5, 0xc9, 0x71, + 0x7f, 0x99, 0x4d, 0x9e, 0x75, 0x7c, 0x44, 0xb2, + 0x18, 0xe6, 0x0d, 0x10, 0xc6, 0x30, 0x82, 0xc6, + 0x9f, 0xce, 0xa7, 0x61, 0x41, 0xba, 0xee, 0xe9, + 0xf7, 0x02, 0xe5, 0xf2, 0xb9, 0xd3, 0x34, 0x82, + 0xd9, 0x2b, 0xa6, 0xa1, 0x77, 0x4f, 0xb4, 0x59, + 0x9c, 0xf1, 0xe0, 0x2f, 0x63, 0x1c, 0x69, 0x59, + 0x18, 0xd0, 0x1e, 0x69, 0xd9, 0x41, 0x37, 0x1b, + 0xda, 0x36, 0xb6, 0xea, 0x23, 0xa0, 0xcd, 0x08, + 0x68, 0xec, 0xf8, 0x8d, 0x3f, 0x22, 0xaf, 0xd9, + 0x65, 0x92, 0xdd, 0x66, 0x9e, 0xc2, 0xec, 0x51, + 0xb8, 0x39, 0xdc, 0xe1, 0xa5, 0x70, 0x86, 0xee, + 0xaf, 0x37, 0x39, 0xb5, 0xed, 0xcc, 0xd1, 0x5c, + 0x48, 0xf0, 0x26, 0x87, 0xf6, 0x6f, 0x63, 0x43, + 0x4e, 0xe6, 0xba, 0x6b, 0xd4, 0xba, 0x26, 0xda, + 0x3c, 0xd2, 0x48, 0x8c, 0x78, 0x98, 0xc2, 0xe1, + 0x47, 0xc8, 0xc6, 0x00, 0xf2, 0x3b, 0x68, 0x24, + 0x32, 0x27, 0x8b, 0x0b, 0x7c, 0xdd, 0xd1, 0x1e, + 0x74, 0x5b, 0x91, 0x81, 0xc7, 0x40, 0x75, 0x31, + 0x00, 0x4d, 0x17, 0x96, 0xb9, 0xd9, 0xfe, 0x50, + 0xf6, 0xc8, 0x43, 0xb3, 0x1b, 0x23, 0x8c, 0x1f, + 0x9c, 0xc3, 0xb8, 0x3b, 0x9a, 0x3b, 0x6a, 0x12, + 0xde, 0xfa, 0xe6, 0xde, 0x09, 0xa0, 0x89, 0xc1, + 0xb1, 0xdc, 0x0a, 0x4d, 0x50, 0x1d, 0x50, 0x3c, + 0x1a, 0xd2, 0xce, 0xf6, 0xe2, 0xc6, 0x61, 0x3d, + 0xb3, 0x83, 0x24, 0xa1, 0x6e, 0x90, 0x1c, 0x28, + 0x7c, 0xed, 0x08, 0x26, 0xe2, 0xb9, 0xb9, 0x66, + 0xca, 0xc7, 0x25, 0x9c, 0x8e, 0x8e, 0x5b, 0x79, + 0x48, 0x90, 0xb3, 0x58, 0x05, 0xc5, 0xd4, 0x23, + 0xfb, 0x4b, 0x90, 0x3b, 0x35, 0xba, 0xca, 0x2e, + 0x2e, 0xe7, 0xbd, 0x93, 0x98, 0x6f, 0xea, 0xc4, + 0x4f, 0xd5, 0x25, 0x75, 0xe9, 0x5c, 0xb6, 0xb9, + 0xbd, 0xed, 0xa4, 0xd2, 0x4b, 0x13, 0x9a, 0x39, + 0xed, 0x32, 0xb0, 0xb5, 0xa5, 0x8e, 0xfe, 0xc2, + 0xc5, 0xf6, 0x6d, 0x79, 0x7c, 0xd0, 0xc9, 0x9c, + 0x04, 0x6d, 0xd2, 0xd8, 0x98, 0x03, 0x5b, 0x5d, + 0xfa, 0x20, 0x92, 0xcf, 0x43, 0xa7, 0xca, 0xb2, + 0xbb, 0xa6, 0x0a, 0xc6, 0x23, 0xc0, 0xf3, 0x4a, + 0xe1, 0x71, 0x0d, 0xd7, 0x4f, 0x34, 0xa4, 0xb0, + 0x49, 0x0e, 0xc8, 0xb7, 0x9c, 0x05, 0xa6, 0x49, + 0xc3, 0xe8, 0x46, 0x9d, 0x2e, 0x51, 0xf6, 0x19, + 0xd5, 0xfd, 0x8c, 0x66, 0x28, 0x9c, 0x1d, 0x19, + 0xd3, 0x81, 0xe0, 0x10, 0x2b, 0xbd, 0x55, 0xe6, + 0xeb, 0x39, 0xcc, 0x2e, 0xe0, 0x7d, 0xbc, 0xf2, + 0xe2, 0x89, 0xee, 0x0e, 0x23, 0x08, 0x06, 0xa3, + 0x55, 0x28, 0x83, 0x8f, 0x8b, 0xe4, 0x53, 0xbb, + 0x43, 0xfc, 0xbb, 0x2a, 0xfb, 0x0f, 0xee, 0xb1, + 0x41, 0x6b, 0xad, 0x78, 0x34, 0x7c, 0xab, 0xa2, + 0xe7, 0x30, 0xba, 0xba, 0x8e, 0x28, 0xa6, 0x70, + 0x73, 0x6d, 0xc5, 0x22, 0xa0, 0x02, 0x83, 0xb8, + 0x82, 0x5b, 0x66, 0x40, 0xf6, 0x5c, 0xcf, 0xec, + 0x0f, 0xd5, 0x72, 0xf1, 0x6d, 0xfe, 0x91, 0xb8, + 0xff, 0x00, 0xc8, 0x1e, 0x06, 0x28, 0xcb, 0x5c, + 0xc2, 0xee, 0xd1, 0x92, 0xb2, 0xd9, 0xc1, 0xa2, + 0x76, 0xe1, 0x78, 0x20, 0x1a, 0x8e, 0xee, 0xa5, + 0x86, 0x5f, 0x5c, 0x36, 0xc9, 0xd6, 0x2d, 0x70, + 0x16, 0xcf, 0x76, 0x37, 0x36, 0x80, 0x9c, 0x5b, + 0x9e, 0x37, 0x71, 0x04, 0xbe, 0x67, 0x03, 0xdf, + 0xb3, 0x99, 0x7c, 0xad, 0x69, 0x7b, 0x62, 0xa8, + 0x90, 0x01, 0x5a, 0x03, 0x51, 0x52, 0xb1, 0x1e, + 0x2b, 0x7d, 0x93, 0x9f, 0x9d, 0xa8, 0x37, 0x52, + 0xd1, 0x95, 0xd6, 0xe1, 0x46, 0xf8, 0xda, 0x7b, + 0x45, 0x70, 0xc1, 0x9e, 0xe6, 0x56, 0xf1, 0xc5, + 0x13, 0x24, 0x06, 0x28, 0x45, 0x1b, 0x19, 0x6b, + 0x48, 0x23, 0xb3, 0xf3, 0x96, 0xab, 0xfc, 0xce, + 0xef, 0x30, 0x73, 0x4d, 0xc3, 0x86, 0x18, 0xf4, + 0x35, 0x80, 0x61, 0x68, 0xae, 0xf0, 0x41, 0x37, + 0x9f, 0x5f, 0xdf, 0x47, 0x05, 0x8d, 0xcd, 0xa4, + 0xcf, 0x86, 0x09, 0xa2, 0xf1, 0xf9, 0xb3, 0xe2, + 0xe3, 0xd0, 0x78, 0x57, 0x0d, 0xf3, 0x33, 0x0f, + 0x64, 0xb2, 0x9e, 0xf6, 0xe9, 0xf2, 0x9b, 0x87, + 0x87, 0x0b, 0x77, 0xfe, 0x6d, 0x0e, 0x87, 0x2e, + 0x7b, 0x2c, 0xee, 0xfe, 0xca, 0x1e, 0x62, 0x32, + 0xd7, 0xc2, 0x34, 0xb5, 0x92, 0xb4, 0x3a, 0x9d, + 0xa5, 0xa2, 0xee, 0xfe, 0xea, 0xf2, 0x71, 0x71, + 0x70, 0xfc, 0x4f, 0x6d, 0x30, 0x50, 0x00, 0xd0, + 0x2b, 0xa8, 0x04, 0x12, 0x3b, 0x59, 0xfc, 0xdb, + 0xff, 0x00, 0xc4, 0xcf, 0x95, 0x7b, 0xcd, 0x7f, + 0xd3, 0xb9, 0x5f, 0x6d, 0xdf, 0x2a, 0x8a, 0xbc, + 0xbc, 0xb8, 0xbd, 0x9f, 0x9f, 0xb8, 0x70, 0x73, + 0xc0, 0x0d, 0xa8, 0x00, 0x54, 0x0e, 0xd2, 0xcc, + 0xb7, 0xf7, 0x53, 0xda, 0xc5, 0x6b, 0x2b, 0x81, + 0x8a, 0x0f, 0xd9, 0xb4, 0x0d, 0x5f, 0xda, 0x41, + 0x26, 0xc1, 0xff, 0x00, 0xd4, 0x1f, 0x4d, 0x35, + 0xb9, 0x1f, 0xdd, 0x0b, 0xa3, 0x39, 0xb9, 0x9f, + 0x2a, 0x86, 0xd6, 0xcf, 0x2e, 0xfd, 0x4c, 0x72, + 0xc6, 0x09, 0x95, 0x8d, 0xf1, 0x9e, 0xef, 0x3b, + 0x7d, 0x41, 0x8b, 0xeb, 0x91, 0x66, 0x6c, 0x71, + 0x0f, 0x67, 0x73, 0xb1, 0xe1, 0xa0, 0xae, 0x2f, + 0x39, 0x75, 0xc3, 0xb4, 0x39, 0x9c, 0x36, 0xed, + 0x81, 0xae, 0x6b, 0x83, 0x05, 0x23, 0x7b, 0xda, + 0xd2, 0x5a, 0x37, 0x28, 0x83, 0xb7, 0x68, 0x5b, + 0x33, 0x72, 0xac, 0xb0, 0x4c, 0x0f, 0x3a, 0x1a, + 0x71, 0x62, 0xd7, 0x5a, 0x0d, 0x6b, 0xce, 0xd0, + 0x46, 0xf3, 0x97, 0x65, 0x64, 0x34, 0x90, 0x2d, + 0xc0, 0x24, 0x02, 0x69, 0x56, 0xb5, 0x47, 0xcd, + 0x9b, 0xdf, 0xdc, 0x5a, 0xfb, 0x24, 0xf2, 0x73, + 0x91, 0xd7, 0x15, 0x5c, 0x1a, 0x5e, 0x34, 0x93, + 0xe5, 0xf7, 0x57, 0xa8, 0xf3, 0xcc, 0xca, 0x3b, + 0x31, 0x67, 0xce, 0x35, 0xd0, 0xe1, 0x2c, 0x01, + 0xcd, 0x0e, 0x20, 0x1e, 0xca, 0x09, 0x6d, 0xa1, + 0xcc, 0x2f, 0xe3, 0x6d, 0x9d, 0xcd, 0x9c, 0xef, + 0x8a, 0x09, 0xe2, 0xad, 0x58, 0x74, 0x62, 0x3a, + 0x78, 0x57, 0x2d, 0xc4, 0x59, 0x85, 0x32, 0xd9, + 0x2f, 0x2e, 0x9d, 0x33, 0xee, 0x65, 0x63, 0x84, + 0x0f, 0xd6, 0xcd, 0x23, 0x4f, 0x75, 0x71, 0xd9, + 0xe7, 0x77, 0xf6, 0x56, 0xfe, 0xcf, 0x19, 0x6c, + 0x90, 0x33, 0xc9, 0x6c, 0xad, 0x0f, 0xc3, 0xda, + 0x52, 0x79, 0x1d, 0xbd, 0xe6, 0x6b, 0x98, 0x8c, + 0xce, 0xf1, 0xd8, 0xa1, 0x83, 0xc8, 0x27, 0x40, + 0x24, 0x6a, 0x00, 0x76, 0x10, 0x49, 0xe7, 0x3e, + 0xf2, 0xdd, 0xfc, 0x02, 0xab, 0x85, 0x6f, 0xbd, + 0xb8, 0xf6, 0x8b, 0x97, 0x48, 0x3c, 0x9d, 0x4d, + 0xed, 0x05, 0xa1, 0x07, 0xbb, 0x7f, 0xdb, 0xc7, + 0xe7, 0x37, 0xc2, 0xa7, 0x14, 0x1d, 0xbf, 0xed, + 0xe3, 0xf3, 0x9b, 0xe1, 0x53, 0x81, 0x06, 0x54, + 0x5e, 0x6f, 0xef, 0x56, 0x5e, 0x7f, 0xca, 0x14, + 0xa2, 0x8b, 0xcd, 0xfd, 0xea, 0xcb, 0xcf, 0xf9, + 0x42, 0x0c, 0x65, 0x1e, 0xf3, 0x7b, 0xf6, 0x87, + 0xeb, 0x15, 0x2a, 0xa2, 0xb2, 0x8f, 0x79, 0xbd, + 0xfb, 0x43, 0xf5, 0x8a, 0x95, 0x40, 0x44, 0x44, + 0x1e, 0x99, 0xa8, 0xaf, 0x88, 0x5e, 0xfb, 0xed, + 0xc7, 0xda, 0xbf, 0xeb, 0x15, 0xf6, 0xf6, 0x6a, + 0x2b, 0xe2, 0x17, 0xbe, 0xfb, 0x71, 0xf6, 0xaf, + 0xfa, 0xc5, 0x64, 0xf3, 0x7e, 0x14, 0x7d, 0x07, + 0xf6, 0xdf, 0xdf, 0xe6, 0x3e, 0x18, 0xff, 0x00, + 0xcd, 0xa1, 0x11, 0x16, 0x47, 0xd2, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x83, 0x27, 0x71, + 0x76, 0xe5, 0x39, 0xa5, 0xd6, 0x55, 0x7d, 0x15, + 0xf5, 0xb6, 0x97, 0xc6, 0x68, 0xe6, 0x1d, 0x4e, + 0x69, 0xd6, 0xd2, 0xb8, 0x74, 0x25, 0x69, 0xa9, + 0x22, 0x66, 0x26, 0x26, 0x3d, 0x8a, 0x5e, 0x95, + 0xc9, 0x5b, 0x52, 0xf1, 0xad, 0x2f, 0x1b, 0x66, + 0x17, 0x87, 0x6d, 0x26, 0xc4, 0xdf, 0xbb, 0xda, + 0xaf, 0xb2, 0xd7, 0xb6, 0xe0, 0xe9, 0x92, 0x8d, + 0x06, 0xae, 0xdd, 0x24, 0xb1, 0xc3, 0x17, 0x6c, + 0xa8, 0xcd, 0xa2, 0xda, 0xb8, 0xf3, 0x0b, 0x46, + 0xe5, 0xb9, 0x6c, 0x1e, 0xc7, 0x97, 0x47, 0x43, + 0xcd, 0xe8, 0x69, 0x71, 0x1a, 0xaa, 0x19, 0x51, + 0x41, 0xfd, 0x2a, 0xb7, 0xbb, 0xa3, 0x52, 0x57, + 0x78, 0x2e, 0x93, 0x96, 0xd3, 0x13, 0x1a, 0x44, + 0x6b, 0xe2, 0xc7, 0x8f, 0xf9, 0x66, 0x0c, 0x76, + 0xad, 0xf5, 0xbd, 0xa7, 0x1f, 0xd9, 0x17, 0xb5, + 0xaf, 0x58, 0x9e, 0x75, 0x85, 0xcf, 0x62, 0x2e, + 0xcd, 0x9e, 0x4f, 0x9c, 0xdc, 0xb5, 0xa2, 0x47, + 0x43, 0x18, 0x93, 0x01, 0xd4, 0x70, 0xb5, 0xe6, + 0x87, 0xb6, 0xbc, 0x47, 0x9f, 0xec, 0x8d, 0x8b, + 0xba, 0xc6, 0xc3, 0x2f, 0x95, 0xb9, 0x81, 0x04, + 0xb1, 0x8f, 0x27, 0x03, 0x1c, 0x75, 0xe1, 0xf1, + 0x88, 0x1d, 0xc0, 0xa2, 0xf2, 0x5c, 0xf6, 0xd6, + 0xc3, 0x29, 0xcd, 0x2c, 0x65, 0x6b, 0xcc, 0x97, + 0xd1, 0x16, 0x46, 0xe6, 0xd3, 0x08, 0x38, 0x5c, + 0x34, 0xf0, 0xa8, 0x32, 0x74, 0x52, 0xb5, 0x0a, + 0xdd, 0xd9, 0xad, 0x71, 0xe9, 0xec, 0xac, 0xfe, + 0x97, 0x29, 0xfe, 0x5f, 0x5c, 0xde, 0x63, 0xcc, + 0xdf, 0x2c, 0x5e, 0xb5, 0xbd, 0xe9, 0xb7, 0x6d, + 0xb4, 0xad, 0xe2, 0x2b, 0x1e, 0x31, 0xed, 0xe2, + 0xdd, 0x79, 0x77, 0x71, 0x7b, 0x75, 0x2d, 0xdc, + 0xee, 0xc5, 0x2c, 0xce, 0x2e, 0x71, 0xdc, 0xed, + 0x05, 0xab, 0x09, 0x20, 0x86, 0x9a, 0x57, 0xc2, + 0xb1, 0x5a, 0x68, 0x09, 0x41, 0x4d, 0x6b, 0x8e, + 0xb3, 0x33, 0xac, 0xbd, 0x18, 0xac, 0x56, 0x22, + 0xb5, 0xaf, 0x08, 0x8d, 0x26, 0x22, 0x74, 0x88, + 0xfd, 0x95, 0xab, 0x33, 0xda, 0x3c, 0x93, 0x33, + 0xc9, 0x63, 0x86, 0xe6, 0xcd, 0xe3, 0x33, 0x82, + 0x01, 0x14, 0x33, 0x00, 0x08, 0x69, 0x6d, 0x35, + 0x1c, 0x40, 0xd0, 0x9e, 0xc2, 0xc6, 0x5b, 0xb4, + 0x99, 0x6c, 0xf9, 0x6c, 0x79, 0x56, 0xd0, 0x5b, + 0xbe, 0xe6, 0x18, 0x34, 0x41, 0x3c, 0x7e, 0x5b, + 0x5b, 0xe1, 0x04, 0x76, 0x35, 0xaa, 0xb5, 0x7b, + 0x28, 0x3b, 0x26, 0x8b, 0xa7, 0x7a, 0xda, 0xeb, + 0xf3, 0xf7, 0xb2, 0x7f, 0x4c, 0xf2, 0xf1, 0x49, + 0xa4, 0x6f, 0xf1, 0x9b, 0xd6, 0x77, 0xf1, 0xa4, + 0xcf, 0x8e, 0xd9, 0xf6, 0x2d, 0x19, 0x8e, 0xd2, + 0xe5, 0x96, 0xd9, 0x6c, 0x99, 0x56, 0xcf, 0x5b, + 0x3e, 0xde, 0x19, 0xea, 0x27, 0x9e, 0x5f, 0x2d, + 0xc0, 0xe8, 0x3a, 0x49, 0x73, 0x8d, 0x47, 0xce, + 0x55, 0x75, 0x83, 0xc2, 0x8a, 0xb7, 0xbc, 0xdb, + 0x8c, 0xfe, 0x0e, 0xfe, 0x5b, 0xcb, 0x63, 0xc1, + 0x59, 0xad, 0x22, 0x75, 0xb4, 0xeb, 0x69, 0xb4, + 0xee, 0xb5, 0xa7, 0x9c, 0xcb, 0x20, 0xd2, 0xaa, + 0x6f, 0x20, 0xcf, 0x2d, 0xb2, 0xab, 0x3c, 0xca, + 0x09, 0x98, 0xf7, 0xba, 0xfe, 0x21, 0x1c, 0x65, + 0x80, 0x51, 0xa4, 0x07, 0xf9, 0x55, 0x23, 0xe7, + 0x28, 0x31, 0x4d, 0xd4, 0x51, 0x59, 0xdb, 0x3a, + 0xad, 0x9f, 0x0d, 0x73, 0x52, 0x69, 0x7f, 0xb6, + 0xdb, 0x7f, 0x76, 0x77, 0x3b, 0x72, 0xab, 0xab, + 0x6b, 0x4c, 0xca, 0x0b, 0xab, 0xb6, 0x3a, 0x58, + 0x60, 0x90, 0x3d, 0xf1, 0xb6, 0x84, 0x9c, 0x3e, + 0x73, 0x80, 0x56, 0xfb, 0xad, 0xb1, 0xd9, 0x0b, + 0xe9, 0x79, 0xfb, 0xdc, 0xaa, 0x49, 0xe5, 0xa6, + 0x1c, 0x6f, 0x64, 0x64, 0xd3, 0x7b, 0xf6, 0x8a, + 0x88, 0x0e, 0xf8, 0xaa, 0x57, 0xb8, 0xad, 0x5c, + 0xb3, 0x58, 0x98, 0x88, 0x8e, 0x3c, 0xdc, 0x3c, + 0xc7, 0x90, 0xc5, 0x9f, 0x24, 0x65, 0xbc, 0xda, + 0x2d, 0x58, 0xdb, 0x5d, 0x96, 0x9a, 0xce, 0x9f, + 0x82, 0xd1, 0x9c, 0xe7, 0x7b, 0x27, 0x77, 0x97, + 0xcb, 0x05, 0x86, 0x56, 0xeb, 0x6b, 0xa7, 0x53, + 0x9b, 0x9c, 0xb2, 0x36, 0xe1, 0xa1, 0x04, 0xe9, + 0x6b, 0xc9, 0xd5, 0xd8, 0x5c, 0xd9, 0x06, 0xd0, + 0x5b, 0x59, 0xda, 0xcd, 0x95, 0xe6, 0x50, 0xfb, + 0x56, 0x5b, 0x39, 0xae, 0x11, 0xe5, 0x31, 0xdb, + 0xed, 0xf0, 0xf6, 0xd4, 0x05, 0x45, 0x08, 0x4d, + 0x14, 0xec, 0xa8, 0xee, 0x5b, 0x76, 0xb1, 0xc0, + 0x8f, 0x21, 0x87, 0xb5, 0x38, 0xa7, 0x75, 0xeb, + 0x33, 0xbf, 0x5b, 0x5e, 0xdb, 0xf7, 0x47, 0x86, + 0x96, 0x5a, 0xaf, 0x76, 0x87, 0x26, 0xb3, 0xcb, + 0x26, 0xcb, 0xf6, 0x76, 0xda, 0x48, 0x4d, 0xde, + 0x89, 0xee, 0x66, 0x27, 0x16, 0x1a, 0x52, 0x80, + 0x92, 0xe7, 0x13, 0xdb, 0xd0, 0x15, 0x5a, 0xb8, + 0x7c, 0x51, 0xab, 0x89, 0x63, 0x5e, 0xb2, 0x95, + 0xd1, 0x44, 0xb5, 0xe6, 0xd3, 0x1a, 0xba, 0x79, + 0x7f, 0x2d, 0x4c, 0x11, 0x68, 0xa4, 0x5b, 0x5b, + 0xce, 0xe9, 0xbd, 0xed, 0xba, 0xd6, 0x9f, 0x7a, + 0x47, 0x67, 0xf3, 0x28, 0xb2, 0xac, 0xd6, 0xde, + 0xfe, 0x66, 0xb9, 0xf1, 0xc2, 0xe2, 0x5c, 0xd6, + 0x53, 0x11, 0xa8, 0x23, 0x45, 0x48, 0xdf, 0x4b, + 0xbc, 0xd0, 0x3f, 0x3b, 0x93, 0x35, 0xb7, 0x0e, + 0x8f, 0x15, 0xc7, 0xb4, 0x30, 0x1a, 0x62, 0x1e, + 0x30, 0x75, 0x34, 0x3a, 0x8a, 0x35, 0x67, 0xc0, + 0xa2, 0x2d, 0x31, 0x11, 0x11, 0xec, 0x9d, 0xc9, + 0x9f, 0x2f, 0x49, 0xc9, 0x39, 0x27, 0xc6, 0x71, + 0x76, 0x3f, 0x09, 0x95, 0x87, 0x6b, 0xb6, 0x9a, + 0x2c, 0xfe, 0x5b, 0x73, 0x6f, 0x1b, 0xe2, 0x86, + 0x06, 0xb8, 0xe1, 0x92, 0x95, 0x2f, 0x71, 0xd2, + 0x7c, 0x52, 0x74, 0x50, 0x05, 0xa2, 0xeb, 0x3d, + 0xb6, 0x9b, 0x66, 0x6d, 0x32, 0x76, 0xc7, 0x20, + 0x9e, 0xda, 0x53, 0x23, 0xa4, 0x20, 0x60, 0x23, + 0xc7, 0xd4, 0x71, 0x57, 0xf3, 0xb7, 0x94, 0x29, + 0x3b, 0xda, 0x93, 0x45, 0x7b, 0x0a, 0xd3, 0x92, + 0xd3, 0x36, 0xb7, 0x5c, 0x69, 0x2a, 0xd3, 0xc8, + 0xe1, 0xa5, 0x30, 0xe3, 0xaf, 0x0a, 0xf9, 0x7b, + 0x6f, 0xa7, 0xed, 0x71, 0xe3, 0xfe, 0x29, 0xbb, + 0x8c, 0xfa, 0xde, 0x4d, 0x97, 0xb6, 0xc9, 0x5a, + 0xc7, 0x89, 0xe1, 0x97, 0x9d, 0x2f, 0x20, 0x60, + 0xd6, 0xe3, 0xf3, 0xab, 0xf9, 0xca, 0x10, 0x79, + 0x49, 0xa2, 0xbd, 0x85, 0x9a, 0x8a, 0xd7, 0x71, + 0x56, 0xd7, 0x9b, 0x4c, 0x4c, 0xfb, 0x23, 0x4f, + 0x93, 0xa6, 0x1c, 0x14, 0xc5, 0x16, 0x8a, 0x78, + 0x5e, 0xf3, 0x7b, 0x7c, 0x67, 0x8c, 0xca, 0x77, + 0x30, 0xda, 0x0b, 0x5b, 0xcd, 0x9b, 0xb1, 0xca, + 0x19, 0x1b, 0xdb, 0x35, 0xa3, 0xc3, 0x9f, 0x23, + 0xa8, 0x1a, 0x40, 0x0f, 0x69, 0xa1, 0x0e, 0xaf, + 0xe7, 0x29, 0xab, 0x8d, 0xaf, 0xd9, 0x3b, 0xbb, + 0x3b, 0x7b, 0x4b, 0xbb, 0x09, 0xe4, 0x8a, 0xd9, + 0xa0, 0x31, 0x80, 0x30, 0x34, 0x10, 0x30, 0xea, + 0x12, 0x05, 0x47, 0xd1, 0x4a, 0x6e, 0xac, 0x92, + 0x34, 0x51, 0x5e, 0xb9, 0xad, 0x59, 0xe1, 0x11, + 0xcb, 0x8b, 0x2d, 0xff, 0x00, 0x96, 0xe1, 0xb4, + 0x44, 0x4c, 0xda, 0xbb, 0x2d, 0x6c, 0xb1, 0x35, + 0x99, 0x8f, 0xab, 0x27, 0x8f, 0x82, 0xd3, 0x3e, + 0x71, 0xb0, 0x8e, 0x89, 0xcd, 0x87, 0x2a, 0x9d, + 0xaf, 0x20, 0xe1, 0x24, 0x36, 0x80, 0x91, 0x40, + 0x7f, 0x6a, 0xaa, 0xba, 0x68, 0x01, 0x42, 0xed, + 0xe4, 0x26, 0xaa, 0x97, 0xbc, 0xdb, 0xc6, 0x22, + 0x3e, 0x0e, 0xfe, 0x5f, 0xcb, 0x53, 0x06, 0xfd, + 0xb7, 0xc9, 0x7d, 0x74, 0xfb, 0xe6, 0x67, 0xe5, + 0xab, 0x08, 0x88, 0xa1, 0xa0, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x59, 0x1a, 0xd6, 0x16, 0x42, 0x06, + 0xf2, 0xfb, 0x94, 0x1e, 0xe1, 0x6f, 0xe6, 0x33, + 0xea, 0x85, 0xf0, 0xd1, 0xb8, 0xbe, 0xe5, 0x0f, + 0xb8, 0xdb, 0xf9, 0x8c, 0xfa, 0xa1, 0x6a, 0xf2, + 0x7e, 0x37, 0x7c, 0xf7, 0xf7, 0x1f, 0xdb, 0x83, + 0xe3, 0x7f, 0xd1, 0x56, 0x46, 0xb5, 0x5f, 0x77, + 0x94, 0x7b, 0x65, 0x58, 0x06, 0xb5, 0x5f, 0x77, + 0x94, 0x7b, 0x65, 0x6c, 0x7c, 0xe0, 0xb3, 0x19, + 0x02, 0x46, 0x17, 0x1a, 0x00, 0xe0, 0x49, 0xed, + 0x1a, 0xac, 0x22, 0x09, 0x0c, 0xe7, 0x2d, 0xca, + 0xae, 0xa7, 0x8e, 0x7b, 0xdb, 0x93, 0x03, 0x8b, + 0x30, 0xb0, 0x62, 0x6b, 0x41, 0x00, 0xd7, 0xf3, + 0x81, 0xdf, 0x51, 0xfd, 0x49, 0xb3, 0x7d, 0x3c, + 0xf2, 0xd9, 0xe8, 0xac, 0x6d, 0x8e, 0xab, 0x2f, + 0x35, 0xff, 0x00, 0xdc, 0x55, 0xba, 0x0d, 0xe4, + 0x16, 0x5e, 0xa4, 0xd9, 0xbe, 0x9e, 0x79, 0x6c, + 0xf4, 0x53, 0xa9, 0x36, 0x6f, 0xa7, 0x9e, 0x5b, + 0x3d, 0x15, 0x5a, 0xa0, 0xde, 0x4a, 0x0d, 0xe4, + 0x16, 0x5e, 0xa4, 0xd9, 0xbe, 0x9e, 0x79, 0x6c, + 0xf4, 0x53, 0xa9, 0x36, 0x6f, 0xa7, 0x9e, 0x5b, + 0x3d, 0x15, 0x5a, 0xa0, 0xde, 0x4a, 0x0d, 0xe4, + 0x16, 0x5e, 0xa4, 0xd9, 0xbe, 0x9e, 0x79, 0x6c, + 0xf4, 0x53, 0xa9, 0x36, 0x6f, 0xa7, 0x9e, 0x5b, + 0x3d, 0x15, 0x5a, 0xa0, 0xde, 0x4a, 0x0d, 0xe4, + 0x16, 0x5e, 0xa4, 0xd9, 0xbe, 0x9e, 0x79, 0x6c, + 0xf4, 0x53, 0xa9, 0x36, 0x6f, 0xa7, 0x9e, 0x5b, + 0x3d, 0x15, 0x5a, 0xa0, 0xde, 0x4a, 0x0d, 0xe4, + 0x16, 0x5e, 0xa4, 0xd9, 0xbe, 0x9e, 0x79, 0x6c, + 0xf4, 0x53, 0xa9, 0x36, 0x6f, 0xa7, 0x9e, 0x5b, + 0x3d, 0x15, 0x5a, 0xa0, 0xde, 0x4a, 0x0d, 0xe4, + 0x16, 0x5e, 0xa4, 0xd9, 0xbe, 0x9e, 0x79, 0x6c, + 0xf4, 0x53, 0xa9, 0x36, 0x6f, 0xa7, 0x9e, 0x5b, + 0x3d, 0x15, 0x5a, 0xa0, 0xec, 0x2f, 0x5c, 0xdb, + 0xf0, 0x63, 0x0c, 0x25, 0x9f, 0x3b, 0x09, 0xa7, + 0x0a, 0x0b, 0x1f, 0x52, 0x6c, 0xdf, 0x4f, 0x3c, + 0xb6, 0x7a, 0x29, 0xd4, 0x9b, 0x37, 0xd3, 0xcf, + 0x2d, 0x9e, 0x8a, 0xad, 0x0a, 0x1d, 0x54, 0x2b, + 0x2d, 0x63, 0x9e, 0x70, 0xb1, 0xa5, 0xce, 0xde, + 0x02, 0xa5, 0x05, 0x93, 0xa9, 0x36, 0x6f, 0xa7, + 0x9e, 0x5b, 0x3d, 0x14, 0xea, 0x4d, 0x9b, 0xe9, + 0xe7, 0x96, 0xcf, 0x45, 0x56, 0xcb, 0x70, 0x92, + 0x08, 0xa1, 0x04, 0x82, 0x29, 0xa8, 0x8d, 0x0b, + 0xd7, 0x31, 0x37, 0x8b, 0xfa, 0xa7, 0x78, 0xfe, + 0x47, 0x8a, 0x7c, 0x6f, 0x37, 0x7d, 0x05, 0x8b, + 0xa9, 0x36, 0x6f, 0xa7, 0x9e, 0x5b, 0x3d, 0x14, + 0xea, 0x4d, 0x9b, 0xe9, 0xe7, 0x96, 0xcf, 0x45, + 0x57, 0xfd, 0x92, 0xe7, 0xd4, 0x49, 0xc8, 0x72, + 0xd4, 0x45, 0x0d, 0x08, 0xa1, 0x1a, 0xea, 0x28, + 0x82, 0xcb, 0xd4, 0x9b, 0x37, 0xd3, 0xcf, 0x2d, + 0x9e, 0x8a, 0x75, 0x26, 0xcd, 0xf4, 0xf3, 0xcb, + 0x67, 0xa2, 0xab, 0x54, 0x1b, 0xcb, 0x77, 0xb1, + 0xdd, 0x68, 0xfd, 0x43, 0xf4, 0xea, 0xf1, 0x0a, + 0x09, 0xfe, 0xa4, 0xd9, 0xbe, 0x9e, 0x79, 0x6c, + 0xf4, 0x53, 0xa9, 0x36, 0x6f, 0xa7, 0x9e, 0x5b, + 0x3d, 0x15, 0x5d, 0x7c, 0x12, 0xc7, 0x43, 0x24, + 0x6e, 0x60, 0x71, 0xa0, 0xc4, 0xd2, 0x2a, 0x77, + 0x97, 0xaf, 0x63, 0xba, 0xd5, 0xcc, 0x49, 0xa7, + 0xfa, 0x8e, 0x41, 0x60, 0xea, 0x4d, 0x9b, 0xe9, + 0xe7, 0x96, 0xcf, 0x45, 0x3a, 0x93, 0x66, 0xfa, + 0x79, 0xe5, 0xb3, 0xd1, 0x55, 0xd7, 0x41, 0x33, + 0x4b, 0x43, 0xa2, 0x73, 0x4b, 0x8d, 0x1a, 0x0b, + 0x48, 0x24, 0xf6, 0x17, 0xaf, 0x64, 0xba, 0xa5, + 0x79, 0x89, 0x39, 0x05, 0x05, 0x83, 0xa9, 0x36, + 0x6f, 0xa7, 0x9e, 0x5b, 0x3d, 0x14, 0xea, 0x4d, + 0x9b, 0xe9, 0xe7, 0x96, 0xcf, 0x45, 0x56, 0xc3, + 0x09, 0x38, 0x43, 0x7c, 0x6a, 0xd2, 0x94, 0xd3, + 0x5d, 0xe5, 0xb3, 0xd9, 0x2e, 0xbd, 0x43, 0xf9, + 0x0e, 0x41, 0x60, 0xea, 0x4d, 0x9b, 0xe9, 0xe7, + 0x96, 0xcf, 0x45, 0x3a, 0x93, 0x66, 0xfa, 0x79, + 0xe5, 0xb3, 0xd1, 0x55, 0xb2, 0xd2, 0xd3, 0x47, + 0x37, 0x09, 0xde, 0x22, 0x85, 0x7a, 0x86, 0x09, + 0x67, 0x76, 0x08, 0x63, 0x74, 0xae, 0x1a, 0xc3, + 0x45, 0x50, 0x58, 0xba, 0x93, 0x66, 0xfa, 0x79, + 0xe5, 0xb3, 0xd1, 0x4e, 0xa4, 0xd9, 0xbe, 0x9e, + 0x79, 0x6c, 0xf4, 0x55, 0x7a, 0x6b, 0x79, 0xa0, + 0x76, 0x19, 0xa3, 0x74, 0x6e, 0x3a, 0x83, 0x81, + 0x0b, 0x0c, 0x86, 0x59, 0x01, 0x74, 0x71, 0xb9, + 0xe0, 0x6b, 0x2d, 0x69, 0x34, 0xe0, 0x41, 0x62, + 0xea, 0x4d, 0x9b, 0xe9, 0xe7, 0x96, 0xcf, 0x45, + 0x3a, 0x93, 0x66, 0xfa, 0x79, 0xe5, 0xb3, 0xd1, + 0x55, 0xb2, 0x28, 0x68, 0x45, 0x08, 0x34, 0x3a, + 0x37, 0x57, 0xb1, 0x6f, 0x33, 0x99, 0x8d, 0xb1, + 0x39, 0xcc, 0xa5, 0x71, 0x06, 0x92, 0x28, 0x82, + 0xc3, 0xd4, 0x9b, 0x37, 0xd3, 0xcf, 0x2d, 0x9e, + 0x8a, 0x75, 0x26, 0xcd, 0xf4, 0xf3, 0xcb, 0x67, + 0xa2, 0xab, 0x54, 0x1b, 0xc9, 0x41, 0xbc, 0x82, + 0xcb, 0xd4, 0x9b, 0x37, 0xd3, 0xcf, 0x2d, 0x9e, + 0x8a, 0x75, 0x26, 0xcd, 0xf4, 0xf3, 0xcb, 0x67, + 0xa2, 0xab, 0x54, 0x1b, 0xc9, 0x41, 0xbc, 0x82, + 0xcb, 0xd4, 0x9b, 0x37, 0xd3, 0xcf, 0x2d, 0x9e, + 0x8a, 0x75, 0x26, 0xcd, 0xf4, 0xf3, 0xcb, 0x67, + 0xa2, 0xab, 0x54, 0x1b, 0xc9, 0x41, 0xbc, 0x82, + 0xcb, 0xd4, 0x9b, 0x37, 0xd3, 0xcf, 0x2d, 0x9e, + 0x8a, 0x75, 0x26, 0xcd, 0xf4, 0xf3, 0xcb, 0x67, + 0xa2, 0xab, 0x54, 0x1b, 0xc9, 0x41, 0xbc, 0x82, + 0xcb, 0xd4, 0x9b, 0x37, 0xd3, 0xcf, 0x2d, 0x9e, + 0x8a, 0x75, 0x26, 0xcd, 0xf4, 0xf3, 0xcb, 0x67, + 0xa2, 0xab, 0x54, 0x1b, 0xc9, 0x41, 0xbc, 0x82, + 0xcb, 0xd4, 0x9b, 0x37, 0xd3, 0xcf, 0x2d, 0x9e, + 0x8a, 0xe8, 0xcb, 0xf2, 0xec, 0x8e, 0xd6, 0xf6, + 0x29, 0xed, 0xef, 0x0b, 0xe6, 0x69, 0xa3, 0x18, + 0x5e, 0xc2, 0x09, 0x70, 0xc3, 0xa8, 0x35, 0x54, + 0xa8, 0x37, 0x97, 0x56, 0x54, 0x07, 0x59, 0xda, + 0x68, 0xff, 0x00, 0x8c, 0xcf, 0xac, 0x10, 0x59, + 0x73, 0x46, 0x06, 0xde, 0xbe, 0x9f, 0x9c, 0x03, + 0x8a, 0xe5, 0x5d, 0x99, 0xb7, 0xbe, 0xbb, 0xcd, + 0x0b, 0x8d, 0x01, 0x11, 0x10, 0x7b, 0x82, 0x79, + 0x20, 0x90, 0x49, 0x19, 0xa3, 0x86, 0xe6, 0xe1, + 0xed, 0xae, 0xa9, 0xc6, 0x4d, 0x99, 0x50, 0xdf, + 0x43, 0x86, 0x5a, 0x7e, 0xd0, 0x68, 0xfa, 0x4d, + 0xf9, 0x57, 0x12, 0x20, 0xf7, 0xd4, 0x1b, 0x3f, + 0xeb, 0xdf, 0xca, 0x1e, 0x8a, 0x75, 0x06, 0xcf, + 0xf4, 0x87, 0xf2, 0x87, 0xa0, 0xbc, 0x22, 0x0f, + 0x7d, 0x41, 0xb3, 0xfd, 0x21, 0xfc, 0xa1, 0xe8, + 0x27, 0x50, 0x6c, 0xff, 0x00, 0x48, 0x7f, 0x28, + 0x7a, 0x0b, 0xc2, 0x20, 0xf7, 0xd4, 0x1b, 0x3f, + 0xd2, 0x1f, 0xca, 0x1e, 0x82, 0x75, 0x06, 0xcf, + 0xf4, 0x87, 0xf2, 0x87, 0xa0, 0xbc, 0x22, 0x0f, + 0x7d, 0x41, 0xb3, 0xfd, 0x21, 0xfc, 0xa1, 0xe8, + 0x27, 0x50, 0x6c, 0xff, 0x00, 0x48, 0x7f, 0x28, + 0x7a, 0x0b, 0xc2, 0x20, 0xf7, 0xd4, 0x1b, 0x3f, + 0xd2, 0x1f, 0xca, 0x1e, 0x82, 0x75, 0x06, 0xcf, + 0xf4, 0x87, 0xf2, 0x87, 0xa0, 0xbc, 0x22, 0x0f, + 0x7d, 0x41, 0xb3, 0xfd, 0x21, 0xfc, 0xa1, 0xe8, + 0x27, 0x50, 0x6c, 0xff, 0x00, 0x48, 0x7f, 0x28, + 0x7a, 0x0b, 0xc2, 0x20, 0xf7, 0xd4, 0x1b, 0x3f, + 0xd2, 0x1f, 0xca, 0x1e, 0x82, 0xf4, 0x32, 0x2c, + 0x85, 0xa0, 0x86, 0xdd, 0x4a, 0xd0, 0x75, 0x86, + 0xbe, 0x95, 0x1c, 0x95, 0xa9, 0x10, 0x7b, 0xf8, + 0x7f, 0x67, 0x87, 0xfc, 0x77, 0xf2, 0x87, 0xa2, + 0x9d, 0x41, 0xb3, 0xfd, 0x21, 0xfc, 0xa1, 0xe8, + 0x2f, 0x08, 0x83, 0xdf, 0x50, 0x6c, 0xff, 0x00, + 0x48, 0x7f, 0x28, 0x7a, 0x09, 0xd4, 0x1b, 0x3f, + 0xd2, 0x1f, 0xca, 0x1e, 0x82, 0xf0, 0x88, 0x3d, + 0xf5, 0x06, 0xcf, 0xf4, 0x87, 0xf2, 0x87, 0xa0, + 0x9d, 0x41, 0xb3, 0xfd, 0x21, 0xfc, 0xa1, 0xe8, + 0x2f, 0x08, 0x83, 0xdf, 0x50, 0x6c, 0xff, 0x00, + 0x48, 0x7f, 0x28, 0x7a, 0x09, 0xd4, 0x1b, 0x3f, + 0xd2, 0x1f, 0xca, 0x1e, 0x82, 0xf0, 0x88, 0x3d, + 0xf5, 0x06, 0xcf, 0xf4, 0x87, 0xf2, 0x87, 0xa0, + 0x9d, 0x41, 0xb3, 0xfd, 0x21, 0xfc, 0xa1, 0xe8, + 0x2f, 0x08, 0x83, 0xdf, 0x50, 0x6c, 0xff, 0x00, + 0x48, 0x7f, 0x28, 0x7a, 0x09, 0xd4, 0x1b, 0x3f, + 0xd2, 0x1f, 0xca, 0x1e, 0x82, 0xf0, 0x88, 0x3d, + 0xf5, 0x06, 0xcf, 0xf4, 0x87, 0xf2, 0x87, 0xa0, + 0x9d, 0x41, 0xb3, 0xfd, 0x21, 0xfc, 0xa1, 0xe8, + 0x2f, 0x08, 0x83, 0xdf, 0x50, 0x6c, 0xff, 0x00, + 0x48, 0x7f, 0x28, 0x7a, 0x09, 0xd4, 0x1b, 0x3f, + 0xd2, 0x1f, 0xca, 0x1e, 0x82, 0xf0, 0x88, 0x3d, + 0xf5, 0x06, 0xcf, 0xf4, 0x87, 0xf2, 0x87, 0xa0, + 0x9d, 0x41, 0xb3, 0xfd, 0x21, 0xfc, 0xa1, 0xe8, + 0x2f, 0x08, 0x83, 0xdf, 0x50, 0x6c, 0xff, 0x00, + 0x48, 0x7f, 0x28, 0x7a, 0x09, 0xd4, 0x1b, 0x3f, + 0xd2, 0x1f, 0xca, 0x1e, 0x82, 0xf0, 0x88, 0x3d, + 0xf5, 0x06, 0xcf, 0xf4, 0x87, 0xf2, 0x87, 0xa0, + 0x9d, 0x41, 0xb3, 0xfd, 0x21, 0xfc, 0xa1, 0xe8, + 0x2f, 0x08, 0x83, 0xdf, 0x50, 0x6c, 0xff, 0x00, + 0x48, 0x7f, 0x28, 0x7a, 0x09, 0xd4, 0x1b, 0x3f, + 0xd2, 0x1f, 0xca, 0x1e, 0x82, 0xf0, 0x88, 0x3d, + 0xf5, 0x06, 0xcf, 0xf4, 0x87, 0xf2, 0x87, 0xa0, + 0x9d, 0x41, 0xb3, 0xfd, 0x21, 0xfc, 0xa1, 0xe8, + 0x2f, 0x08, 0x83, 0xdf, 0x50, 0x6c, 0xff, 0x00, + 0x48, 0x7f, 0x28, 0x7a, 0x09, 0xd4, 0x1b, 0x3f, + 0xd2, 0x1f, 0xca, 0x1e, 0x8a, 0xf0, 0x88, 0x37, + 0xc7, 0x93, 0xec, 0xdc, 0x04, 0x39, 0xc5, 0xd3, + 0x10, 0x6a, 0x03, 0x9c, 0x5d, 0xde, 0x0b, 0x6d, + 0xde, 0x63, 0xce, 0x30, 0x43, 0x6e, 0xde, 0x6a, + 0x11, 0xa2, 0x80, 0x50, 0xd3, 0xb5, 0xbc, 0xb8, + 0xd1, 0x01, 0x11, 0x10, 0x7b, 0xb7, 0xfd, 0xbc, + 0x7e, 0x73, 0x7c, 0x2a, 0x70, 0x28, 0x3b, 0x7f, + 0xdb, 0xc7, 0xe7, 0x37, 0xc2, 0xa7, 0x02, 0x0c, + 0xa8, 0xbc, 0xdf, 0xde, 0xac, 0xbc, 0xff, 0x00, + 0x94, 0x29, 0x45, 0x17, 0x9b, 0xfb, 0xd5, 0x97, + 0x9f, 0xf2, 0x84, 0x18, 0xca, 0x3d, 0xe6, 0xf7, + 0xed, 0x0f, 0xd6, 0x2a, 0x55, 0x45, 0x65, 0x1e, + 0xf3, 0x7b, 0xf6, 0x87, 0xeb, 0x15, 0x2a, 0x80, + 0x88, 0x88, 0x3d, 0x33, 0x51, 0x5f, 0x10, 0xbd, + 0xf7, 0xdb, 0x8f, 0xb5, 0x7f, 0xd6, 0x2b, 0xed, + 0xec, 0xd4, 0x57, 0xc4, 0x2f, 0x7d, 0xf6, 0xe3, + 0xed, 0x5f, 0xf5, 0x8a, 0xc9, 0xe6, 0xfc, 0x28, + 0xfa, 0x0f, 0xed, 0xbf, 0xbf, 0xcc, 0x7c, 0x31, + 0xff, 0x00, 0x9b, 0x42, 0x22, 0x2c, 0x8f, 0xa4, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x02, 0x20, 0x41, + 0x9d, 0xe5, 0xf7, 0x28, 0x7d, 0xc6, 0xdf, 0xcc, + 0x67, 0xd5, 0x5f, 0x0d, 0xde, 0x5f, 0x72, 0x87, + 0xdc, 0x6d, 0xfc, 0xc6, 0x7d, 0x55, 0xab, 0xc9, + 0xf8, 0xdd, 0xf3, 0xdf, 0xdc, 0x9f, 0x6f, 0x96, + 0xff, 0x00, 0xf2, 0x7f, 0xf4, 0xb2, 0x35, 0xaa, + 0xfb, 0xbc, 0xa3, 0xdb, 0x2a, 0xc0, 0x35, 0xaa, + 0xfb, 0xbc, 0xa3, 0xdb, 0x2b, 0x63, 0xe7, 0x04, + 0x44, 0x41, 0x8d, 0xb0, 0xd5, 0x65, 0xe6, 0xbf, + 0xfb, 0x8a, 0xb8, 0xac, 0x7b, 0x61, 0xaa, 0xcb, + 0xcd, 0x7f, 0xf7, 0x15, 0x71, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x48, 0x64, 0x56, 0x6c, 0xbd, 0xcc, + 0xa2, 0x8a, 0x51, 0x58, 0xd8, 0x0c, 0x8f, 0x1b, + 0x84, 0x37, 0x70, 0xae, 0xc3, 0xb4, 0xf7, 0x0d, + 0xbe, 0xa1, 0xc0, 0x2c, 0x43, 0xf0, 0x98, 0x30, + 0x0a, 0x60, 0xdf, 0xdf, 0xaa, 0x6c, 0x8b, 0x71, + 0x5f, 0xcf, 0x5d, 0xd8, 0x88, 0x1d, 0xd2, 0x17, + 0xa8, 0xb3, 0x8b, 0x18, 0xae, 0x85, 0xa3, 0x2c, + 0xe2, 0x36, 0x41, 0xdc, 0xde, 0x22, 0x2a, 0xfa, + 0x13, 0x87, 0x15, 0x4a, 0x08, 0xac, 0xc5, 0xf6, + 0x8f, 0xbd, 0x96, 0x4b, 0x3a, 0xf3, 0x0f, 0x35, + 0x60, 0x23, 0x0e, 0xbf, 0x2b, 0x47, 0x6d, 0x76, + 0x6c, 0xc1, 0xa6, 0x73, 0x17, 0x9a, 0xef, 0x02, + 0xd3, 0x9d, 0xd8, 0xc7, 0x63, 0x98, 0x3e, 0x18, + 0xb4, 0x46, 0x40, 0x7b, 0x37, 0xe8, 0xed, 0xce, + 0xd2, 0xdb, 0xb3, 0x3f, 0xce, 0x22, 0xa6, 0xbc, + 0x2f, 0xf0, 0x20, 0xd9, 0x6b, 0x97, 0x0b, 0xdc, + 0xde, 0xee, 0x69, 0xbc, 0x5b, 0x5b, 0x79, 0x64, + 0x74, 0xef, 0x3a, 0xb4, 0x38, 0xe8, 0x5e, 0xe3, + 0xcc, 0x9d, 0x7f, 0xb4, 0x16, 0xb2, 0x37, 0xc5, + 0x86, 0x37, 0xe1, 0x81, 0x9b, 0x8d, 0x6d, 0x35, + 0x8e, 0xc9, 0x52, 0x97, 0x0c, 0xb1, 0xba, 0x82, + 0xf7, 0x28, 0xb2, 0x76, 0x19, 0xe3, 0x26, 0x67, + 0x53, 0xf3, 0x9c, 0x49, 0x71, 0x1d, 0x9d, 0x3a, + 0x15, 0x77, 0x25, 0x0e, 0x6e, 0x6f, 0x6a, 0x08, + 0xc2, 0x79, 0xcd, 0x23, 0xb2, 0x01, 0x04, 0x20, + 0x91, 0xcd, 0xb3, 0xec, 0xd2, 0xd7, 0x33, 0xb8, + 0x8a, 0x29, 0x69, 0x1c, 0x4f, 0xf1, 0x5a, 0x40, + 0x3f, 0x9a, 0x0d, 0x35, 0x2f, 0x3b, 0x4c, 0xc8, + 0x9f, 0x1d, 0x95, 0xf0, 0x6e, 0x09, 0x2e, 0x59, + 0x59, 0x1b, 0x4a, 0x57, 0x46, 0x2e, 0x15, 0xbb, + 0x32, 0xbb, 0xc8, 0xa3, 0xcd, 0x27, 0xf6, 0x9b, + 0x39, 0x24, 0x95, 0x8e, 0x1c, 0xe4, 0x81, 0xda, + 0x2b, 0x41, 0xf9, 0xb8, 0x82, 0xd1, 0xb4, 0x71, + 0xc9, 0x29, 0xb7, 0xbf, 0x8e, 0x5e, 0x72, 0xce, + 0x50, 0x1b, 0x0b, 0x69, 0x40, 0xca, 0x7e, 0x6a, + 0x08, 0x41, 0xb8, 0xad, 0x3b, 0x43, 0x9c, 0x66, + 0x16, 0x57, 0x91, 0xc5, 0x6b, 0x20, 0x63, 0x1d, + 0x1e, 0x22, 0x30, 0x87, 0x1a, 0xf7, 0x55, 0x54, + 0x6e, 0x2b, 0x6e, 0x7d, 0x73, 0x93, 0xc5, 0x77, + 0x1b, 0x6f, 0xad, 0x5f, 0x71, 0x2e, 0x00, 0x58, + 0xe6, 0xba, 0x82, 0x9c, 0xa0, 0x82, 0x0a, 0x6c, + 0xda, 0xfe, 0xfe, 0x58, 0x63, 0xba, 0x94, 0x3d, + 0xac, 0x91, 0xae, 0x67, 0x8a, 0x1b, 0x43, 0x5e, + 0xc0, 0x52, 0xfb, 0x41, 0x9c, 0xe6, 0x76, 0x59, + 0x8f, 0x31, 0x6d, 0x28, 0x64, 0x58, 0x1a, 0xe2, + 0x0b, 0x5a, 0x74, 0x9a, 0xee, 0x90, 0x54, 0x4d, + 0xcc, 0xf9, 0x5c, 0xb7, 0x16, 0xc2, 0xc2, 0x07, + 0x5b, 0xd2, 0x46, 0xf3, 0x98, 0xcd, 0x6b, 0x52, + 0x35, 0x78, 0xc5, 0x4c, 0xe7, 0xb7, 0x39, 0x2c, + 0x77, 0xe5, 0xb7, 0xb6, 0x8f, 0x9a, 0x72, 0xc6, + 0xf8, 0xed, 0x34, 0x18, 0x6a, 0x48, 0x1a, 0xc2, + 0x08, 0x88, 0xf3, 0x5b, 0xdb, 0xfc, 0xc2, 0xc8, + 0x5d, 0xca, 0x1e, 0x23, 0x9e, 0x32, 0xdd, 0x01, + 0xb4, 0x25, 0xc3, 0xe6, 0x80, 0xa4, 0x33, 0xbc, + 0xef, 0x33, 0xb4, 0xcd, 0x25, 0x86, 0x09, 0xb0, + 0xc6, 0xdc, 0x24, 0x36, 0x80, 0xe9, 0x23, 0x4e, + 0xb0, 0x74, 0x2e, 0x0e, 0x7b, 0x2e, 0x9b, 0x34, + 0xb1, 0x36, 0x10, 0x3a, 0x06, 0x89, 0x59, 0x8c, + 0x38, 0xd6, 0xa4, 0xbc, 0x76, 0x4e, 0xa5, 0x25, + 0x9c, 0xc3, 0x91, 0x3b, 0x32, 0x91, 0xd7, 0x97, + 0x13, 0x36, 0x6d, 0x18, 0xe3, 0x60, 0x34, 0xd5, + 0xa3, 0x4d, 0x10, 0x62, 0xfd, 0xb1, 0xdd, 0x33, + 0x2a, 0xcc, 0xf0, 0x86, 0x4d, 0x3c, 0xac, 0x6c, + 0x94, 0x14, 0xaf, 0x8d, 0x5a, 0x9a, 0x53, 0x79, + 0x63, 0x3d, 0xce, 0xb3, 0x3b, 0x4c, 0xd1, 0xf0, + 0xdb, 0xcb, 0x86, 0x36, 0xb5, 0xae, 0x0d, 0xc2, + 0x0e, 0xb1, 0x55, 0xcb, 0x75, 0x9a, 0x45, 0x79, + 0x79, 0x63, 0x6f, 0x6a, 0xc3, 0x1d, 0xa5, 0xbc, + 0xac, 0x0c, 0x07, 0x59, 0x25, 0xc0, 0x55, 0x76, + 0xe7, 0x47, 0x21, 0x19, 0x93, 0xfd, 0xb8, 0x4c, + 0x66, 0xc2, 0xda, 0x86, 0x79, 0x34, 0xa2, 0x0d, + 0x39, 0xbb, 0x9b, 0x7d, 0x91, 0x5b, 0xe6, 0x32, + 0x31, 0xad, 0xb8, 0xc7, 0x81, 0xee, 0x02, 0x98, + 0xb5, 0xf1, 0x25, 0xdc, 0xd2, 0x64, 0xd9, 0x4d, + 0xac, 0x36, 0xa4, 0x32, 0x7b, 0xa6, 0xf3, 0x92, + 0xca, 0x3c, 0xaa, 0x11, 0x5a, 0x2c, 0x6d, 0x15, + 0x7d, 0x8a, 0xcc, 0xda, 0xe1, 0xea, 0xd3, 0xfb, + 0x30, 0xdd, 0x61, 0xdd, 0x95, 0xe3, 0x6a, 0xeb, + 0x8e, 0xc6, 0x9e, 0x4f, 0x31, 0xa3, 0xbc, 0x83, + 0x6e, 0x5f, 0x71, 0x2e, 0x73, 0x97, 0xdd, 0xd9, + 0xde, 0x3b, 0x9d, 0x9a, 0x16, 0x99, 0x21, 0x94, + 0xf9, 0x42, 0x9a, 0xbb, 0xe1, 0x6d, 0xd9, 0x5b, + 0x81, 0x6f, 0x97, 0x5c, 0xcc, 0xed, 0x0d, 0x6c, + 0xcc, 0xc5, 0x5d, 0xc0, 0xe0, 0xd0, 0x7c, 0x2b, + 0x9b, 0x64, 0x69, 0xed, 0xb3, 0xef, 0x73, 0x46, + 0xa7, 0xfb, 0x4b, 0x19, 0x51, 0x23, 0x67, 0x73, + 0x33, 0xbc, 0x45, 0x38, 0x02, 0x0e, 0x1c, 0xf6, + 0xdf, 0xd9, 0xb3, 0x5b, 0x96, 0x6e, 0x39, 0xdc, + 0xe3, 0x7b, 0x4e, 0x18, 0xbc, 0x35, 0x56, 0x8b, + 0x70, 0x2d, 0xf2, 0xc3, 0x64, 0xd1, 0x47, 0x47, + 0x69, 0xce, 0x3b, 0xb6, 0xf0, 0x74, 0x77, 0x94, + 0x5e, 0x63, 0x6f, 0xd6, 0x17, 0x59, 0x4d, 0xc8, + 0x18, 0x85, 0xd3, 0x5a, 0xc9, 0x0e, 0xf9, 0x61, + 0xab, 0xbb, 0xd5, 0x5d, 0x71, 0x5c, 0x73, 0xf7, + 0xf9, 0xd1, 0x1a, 0x5b, 0x1c, 0x2d, 0x8d, 0xbd, + 0xa6, 0x87, 0xfc, 0xa8, 0x2a, 0x23, 0x52, 0xca, + 0xc0, 0x59, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x5d, 0x59, 0x57, + 0xf3, 0x3b, 0x4f, 0xb6, 0x67, 0xd6, 0x0b, 0x95, + 0x75, 0x65, 0x5f, 0xcc, 0xed, 0x3e, 0xd9, 0x9f, + 0x58, 0x20, 0xb3, 0x66, 0xde, 0xfa, 0xef, 0x34, + 0x2e, 0x35, 0xd9, 0x9b, 0x7b, 0xeb, 0xbc, 0xd0, + 0xb8, 0xd0, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x07, 0xbb, 0x7f, 0xdb, 0xc7, 0xe7, 0x37, 0xc2, + 0xa7, 0x02, 0x83, 0xb7, 0xfd, 0xbc, 0x7e, 0x73, + 0x7c, 0x2a, 0x70, 0x20, 0xca, 0x8b, 0xcd, 0xfd, + 0xea, 0xcb, 0xcf, 0xf9, 0x42, 0x94, 0x51, 0x79, + 0xbf, 0xbd, 0x59, 0x79, 0xff, 0x00, 0x28, 0x41, + 0x8c, 0xa3, 0xde, 0x6f, 0x7e, 0xd0, 0xfd, 0x62, + 0xa5, 0x54, 0x56, 0x51, 0xef, 0x37, 0xbf, 0x68, + 0x7e, 0xb1, 0x52, 0xa8, 0x08, 0x88, 0x83, 0xd3, + 0x35, 0x15, 0xf1, 0x0b, 0xdf, 0x7d, 0xb8, 0xfb, + 0x57, 0xfd, 0x62, 0xbe, 0xde, 0xcd, 0x45, 0x7c, + 0x42, 0xf7, 0xdf, 0x6e, 0x3e, 0xd5, 0xff, 0x00, + 0x58, 0xac, 0x9e, 0x6f, 0xc2, 0x8f, 0xa0, 0xfe, + 0xdb, 0xfb, 0xfc, 0xc7, 0xc3, 0x1f, 0xf9, 0xb4, + 0x22, 0x22, 0xc8, 0xfa, 0x41, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x10, 0x22, 0x04, 0x19, 0xdd, 0x0b, 0xee, + 0x50, 0xfb, 0x8d, 0xbf, 0x98, 0xcf, 0xaa, 0xbe, + 0x1a, 0x37, 0x17, 0xdc, 0xa1, 0xf7, 0x1b, 0x7f, + 0x31, 0x9f, 0x55, 0x6a, 0xf2, 0x7e, 0x37, 0x7c, + 0xf7, 0xf7, 0x27, 0xdb, 0xe5, 0xbf, 0xfc, 0x9f, + 0xfd, 0x2c, 0x8d, 0x6a, 0xbe, 0xef, 0x28, 0xf6, + 0xca, 0xb0, 0x0d, 0x6a, 0xbe, 0xef, 0x28, 0xf6, + 0xca, 0xd8, 0xf9, 0xc1, 0x11, 0x10, 0x63, 0x6c, + 0x35, 0x59, 0x79, 0xaf, 0xfe, 0xe2, 0xae, 0x2b, + 0x1e, 0xd8, 0x6a, 0xb2, 0xf3, 0x5f, 0xfd, 0xc5, + 0x5c, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x12, 0x7b, + 0x39, 0x79, 0x1d, 0xa6, 0x68, 0xc7, 0x48, 0x68, + 0xc9, 0x1a, 0x63, 0x24, 0xe8, 0x00, 0x9d, 0x20, + 0x95, 0xbb, 0xe1, 0xdb, 0xe1, 0x99, 0x61, 0xc1, + 0xff, 0x00, 0x6f, 0xce, 0x62, 0xe7, 0xc9, 0xf1, + 0x70, 0x57, 0x15, 0x54, 0x32, 0xd9, 0xed, 0x57, + 0x3c, 0xdf, 0x35, 0xce, 0xbf, 0x9b, 0x1a, 0x30, + 0xe2, 0x34, 0x41, 0xdd, 0xb4, 0x37, 0x71, 0xdd, + 0x66, 0x92, 0x3a, 0x2a, 0x3a, 0x38, 0xda, 0xd8, + 0xda, 0xe1, 0xa8, 0xd2, 0xbc, 0x6b, 0xd6, 0xcc, + 0x7f, 0x38, 0x8b, 0x77, 0xc5, 0x77, 0x81, 0x45, + 0x00, 0x06, 0xa5, 0x90, 0x48, 0x35, 0x69, 0x20, + 0xef, 0x8d, 0x05, 0x07, 0x7f, 0xb6, 0x3e, 0xc7, + 0x3a, 0x92, 0x78, 0xf4, 0x73, 0x53, 0x3f, 0x10, + 0x1b, 0xad, 0xc4, 0x6a, 0x14, 0xac, 0xf6, 0x6c, + 0x66, 0x79, 0x63, 0x7f, 0x6e, 0x2b, 0x6d, 0x76, + 0xf0, 0xe1, 0x4d, 0xc7, 0x91, 0xab, 0xe5, 0x55, + 0xb2, 0x49, 0xad, 0x4e, 0xbd, 0x27, 0xbb, 0xa5, + 0x67, 0x9c, 0x92, 0x80, 0x07, 0x38, 0x06, 0xe9, + 0x68, 0x04, 0xe8, 0x3d, 0x84, 0x13, 0xf9, 0xa6, + 0xcf, 0xe6, 0x97, 0x59, 0x94, 0xf3, 0xc3, 0x1b, + 0x79, 0xa7, 0xba, 0xac, 0x71, 0x78, 0x1b, 0x83, + 0xba, 0xbc, 0x67, 0x8f, 0x8a, 0xdb, 0x2b, 0xb5, + 0xca, 0x83, 0xc4, 0xb2, 0xc5, 0xe3, 0x4b, 0x84, + 0xd6, 0x9a, 0x49, 0xf9, 0x54, 0x27, 0x3b, 0x2f, + 0xac, 0x7f, 0x28, 0xf1, 0xaf, 0x3f, 0xfc, 0xa0, + 0x6e, 0xe9, 0x56, 0xad, 0xa1, 0xc9, 0x73, 0x0b, + 0xfb, 0xa8, 0xe5, 0xb6, 0x6b, 0x5c, 0xc6, 0x30, + 0x34, 0xd5, 0xc0, 0x69, 0xee, 0xaa, 0xaa, 0xf5, + 0xcf, 0x4d, 0xeb, 0x1f, 0xca, 0x3c, 0x68, 0x24, + 0x25, 0xc9, 0x73, 0x0b, 0x07, 0x45, 0x35, 0xc3, + 0x43, 0x58, 0x64, 0x6b, 0x46, 0x17, 0x62, 0xa9, + 0x27, 0x46, 0x85, 0x2b, 0x9f, 0xe4, 0x59, 0x85, + 0xf6, 0x60, 0x67, 0xb7, 0x8d, 0xa6, 0x32, 0xc6, + 0xb7, 0x4b, 0x80, 0x35, 0x6d, 0x55, 0x65, 0xd2, + 0x48, 0xe0, 0x03, 0x9e, 0xe7, 0x01, 0xa4, 0x02, + 0x49, 0xd2, 0xb3, 0xcf, 0x4d, 0xeb, 0x1f, 0xca, + 0x3c, 0x68, 0x24, 0xd9, 0x94, 0x5f, 0x58, 0x5f, + 0x59, 0xc9, 0x74, 0xc0, 0xd6, 0xc9, 0x3c, 0x6d, + 0x6e, 0x17, 0x62, 0xd4, 0xe0, 0x77, 0x17, 0x9d, + 0xa5, 0xaf, 0x5c, 0xcd, 0x5d, 0xe6, 0xf8, 0x14, + 0x69, 0x92, 0x43, 0x4a, 0xbd, 0xc6, 0x9a, 0x45, + 0x49, 0x34, 0x3d, 0x85, 0x87, 0x39, 0xce, 0x35, + 0x71, 0x2e, 0x3b, 0xe4, 0xd4, 0xa0, 0xdf, 0x61, + 0xef, 0xd6, 0xe0, 0x7a, 0xd6, 0x7d, 0x60, 0xbb, + 0xb6, 0xa0, 0x9e, 0xb8, 0x97, 0xcc, 0x68, 0xef, + 0x28, 0xaa, 0x9a, 0x83, 0xbd, 0xab, 0xc2, 0x84, + 0xb9, 0xc6, 0xae, 0x25, 0xc7, 0x7c, 0x9a, 0xa0, + 0x9e, 0x9e, 0xb2, 0xec, 0x8c, 0x05, 0x9a, 0x44, + 0x52, 0xe9, 0x23, 0x70, 0x02, 0xef, 0x94, 0xaf, + 0x73, 0xc2, 0xfc, 0xeb, 0x29, 0xb5, 0x92, 0xd6, + 0x8f, 0xb9, 0xb4, 0x1c, 0xdc, 0x91, 0x56, 0x8e, + 0xa0, 0x14, 0xaa, 0xaf, 0xe3, 0x7d, 0x29, 0x88, + 0xd3, 0x7a, 0xa6, 0x9a, 0xea, 0xb3, 0x1c, 0xb2, + 0xc4, 0xec, 0x51, 0x3d, 0xcc, 0x76, 0xe9, 0x69, + 0xa1, 0xef, 0x20, 0x9f, 0xb2, 0xb7, 0x93, 0x23, + 0xcb, 0xee, 0xae, 0x6e, 0xc0, 0x64, 0xf3, 0xb7, + 0x9b, 0x86, 0x2a, 0x82, 0xe3, 0xbc, 0x74, 0x76, + 0xd6, 0xac, 0xa8, 0x1f, 0x87, 0x73, 0x2a, 0x69, + 0xf1, 0x9a, 0x07, 0x70, 0x34, 0x28, 0x59, 0x25, + 0x96, 0x57, 0x62, 0x95, 0xee, 0x7b, 0xb7, 0xdc, + 0x49, 0x58, 0xc4, 0xe0, 0xd2, 0xd0, 0xe2, 0x1a, + 0x75, 0x80, 0x48, 0x07, 0xb6, 0x82, 0xd5, 0xb3, + 0x73, 0xc4, 0xfc, 0xaf, 0x1c, 0x82, 0xae, 0xb0, + 0x7b, 0xdc, 0xd2, 0x75, 0x86, 0xb9, 0xa4, 0x8e, + 0xf1, 0x5c, 0x3b, 0x3a, 0xf7, 0xc9, 0x16, 0x6b, + 0x23, 0xb4, 0xb9, 0xf0, 0xe2, 0x71, 0xec, 0x9c, + 0x65, 0x41, 0x87, 0x38, 0x02, 0x01, 0x20, 0x3b, + 0xca, 0x00, 0xd0, 0x1d, 0xc4, 0x6b, 0x9e, 0xda, + 0xe1, 0x71, 0x6e, 0x2d, 0x74, 0x34, 0xa8, 0xd3, + 0xa3, 0xbe, 0x83, 0xc8, 0xd4, 0xb2, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0xba, 0xb2, 0xaf, 0xe6, 0x76, 0x9f, + 0x6c, 0xcf, 0xac, 0x17, 0x2a, 0xea, 0xca, 0xbf, + 0x99, 0xda, 0x7d, 0xb3, 0x3e, 0xb0, 0x41, 0x66, + 0xcd, 0xbd, 0xf5, 0xde, 0x68, 0x5c, 0x6b, 0xb3, + 0x36, 0xf7, 0xd7, 0x79, 0xa1, 0x71, 0xa0, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x0f, 0x76, 0xff, + 0x00, 0xb7, 0x8f, 0xce, 0x6f, 0x85, 0x4e, 0x05, + 0x07, 0x6f, 0xfb, 0x78, 0xfc, 0xe6, 0xf8, 0x54, + 0xe0, 0x41, 0x95, 0x17, 0x9b, 0xfb, 0xd5, 0x97, + 0x9f, 0xf2, 0x85, 0x28, 0xa2, 0xf3, 0x7f, 0x7a, + 0xb2, 0xf3, 0xfe, 0x50, 0x83, 0x19, 0x47, 0xbc, + 0xde, 0xfd, 0xa1, 0xfa, 0xc5, 0x4a, 0xa8, 0xac, + 0xa3, 0xde, 0x6f, 0x7e, 0xd0, 0xfd, 0x62, 0xa5, + 0x50, 0x11, 0x11, 0x07, 0xa6, 0x6a, 0x2b, 0xe2, + 0x17, 0xbe, 0xfb, 0x71, 0xf6, 0xaf, 0xfa, 0xc5, + 0x7d, 0xbd, 0xa2, 0xa1, 0xc3, 0x7c, 0x51, 0x7c, + 0xa6, 0xe7, 0x63, 0xb6, 0x8e, 0x4b, 0x99, 0x9e, + 0xdb, 0x37, 0x96, 0xba, 0x47, 0x96, 0x9a, 0xb7, + 0x48, 0x24, 0xf6, 0x56, 0x6f, 0x37, 0x59, 0x98, + 0xae, 0x91, 0xae, 0x9c, 0x9e, 0xdf, 0xf2, 0x0c, + 0xf8, 0xb1, 0xdf, 0x3f, 0x72, 0xf5, 0xa6, 0xed, + 0x91, 0x1b, 0xe7, 0x6f, 0xdb, 0xf1, 0x57, 0xd1, + 0x4e, 0x7c, 0x17, 0xb4, 0xbd, 0x09, 0xfc, 0x2d, + 0xe3, 0x4f, 0x82, 0xf6, 0x97, 0xa1, 0x3f, 0x85, + 0xbc, 0x6b, 0x26, 0xcb, 0x74, 0xcf, 0xc9, 0xf4, + 0x3e, 0xbb, 0xca, 0xfe, 0x7e, 0x2f, 0xf9, 0x2a, + 0x83, 0x45, 0x39, 0xf0, 0x5e, 0xd2, 0xf4, 0x27, + 0xf0, 0xb7, 0x8d, 0x3e, 0x0b, 0xda, 0x5e, 0x84, + 0xfe, 0x16, 0xf1, 0xa6, 0xcb, 0x74, 0xcf, 0xc8, + 0xf5, 0xde, 0x57, 0xf3, 0xf1, 0x7f, 0xc9, 0x54, + 0x1a, 0x29, 0xcf, 0x82, 0xf6, 0x97, 0xa1, 0x3f, + 0x85, 0xbc, 0x69, 0xf0, 0x5e, 0xd2, 0xf4, 0x27, + 0xf0, 0xb7, 0x8d, 0x36, 0x5b, 0xa6, 0x7e, 0x47, + 0xae, 0xf2, 0xbf, 0x9f, 0x8b, 0xfe, 0x4a, 0xa0, + 0xd1, 0x4e, 0x7c, 0x17, 0xb4, 0xbd, 0x09, 0xfc, + 0x2d, 0xe3, 0x4f, 0x82, 0xf6, 0x97, 0xa1, 0x3f, + 0x85, 0xbc, 0x69, 0xb2, 0xdd, 0x33, 0xf2, 0x3d, + 0x77, 0x95, 0xfc, 0xfc, 0x5f, 0xf2, 0x55, 0x06, + 0x8a, 0x73, 0xe0, 0xbd, 0xa5, 0xe8, 0x4f, 0xe1, + 0x6f, 0x1a, 0x7c, 0x17, 0xb4, 0xbd, 0x09, 0xfc, + 0x2d, 0xe3, 0x4d, 0x96, 0xe9, 0x9f, 0x91, 0xeb, + 0xbc, 0xaf, 0xe7, 0xe2, 0xff, 0x00, 0x92, 0xa8, + 0x34, 0x53, 0x9f, 0x05, 0xed, 0x2f, 0x42, 0x7f, + 0x0b, 0x78, 0xd3, 0xe0, 0xbd, 0xa5, 0xe8, 0x4f, + 0xe1, 0x6f, 0x1a, 0x6c, 0xb7, 0x4c, 0xfc, 0x8f, + 0x5d, 0xe5, 0x7f, 0x3f, 0x17, 0xfc, 0x95, 0x41, + 0xa2, 0x9c, 0xf8, 0x2f, 0x69, 0x7a, 0x13, 0xf8, + 0x5b, 0xc6, 0x9f, 0x05, 0xed, 0x2f, 0x42, 0x7f, + 0x0b, 0x78, 0xd3, 0x65, 0xba, 0x67, 0xe4, 0x7a, + 0xef, 0x2b, 0xf9, 0xf8, 0xbf, 0xe4, 0xaa, 0x0d, + 0x14, 0xe7, 0xc1, 0x7b, 0x4b, 0xd0, 0x9f, 0xc2, + 0xde, 0x34, 0xf8, 0x2f, 0x69, 0x7a, 0x13, 0xf8, + 0x5b, 0xc6, 0x9b, 0x2d, 0xd3, 0x3f, 0x23, 0xd7, + 0x79, 0x5f, 0xcf, 0xc5, 0xff, 0x00, 0x25, 0x50, + 0x68, 0xa7, 0x3e, 0x0b, 0xda, 0x5e, 0x84, 0xfe, + 0x16, 0xf1, 0xa7, 0xc1, 0x7b, 0x4b, 0xd0, 0x9f, + 0xc2, 0xde, 0x34, 0xd9, 0x6e, 0x99, 0xf9, 0x1e, + 0xbb, 0xca, 0xfe, 0x7e, 0x2f, 0xf9, 0x2a, 0x83, + 0x45, 0x39, 0xf0, 0x5e, 0xd2, 0xf4, 0x27, 0xf0, + 0xb7, 0x8d, 0x3e, 0x0b, 0xda, 0x5e, 0x84, 0xfe, + 0x16, 0xf1, 0xa6, 0xcb, 0x74, 0xcf, 0xc8, 0xf5, + 0xde, 0x57, 0xf3, 0xf1, 0x7f, 0xc9, 0x54, 0x1a, + 0x29, 0xcf, 0x82, 0xf6, 0x97, 0xa1, 0x3f, 0x85, + 0xbc, 0x69, 0xf0, 0x5e, 0xd2, 0xf4, 0x27, 0xf0, + 0xb7, 0x8d, 0x36, 0x5b, 0xa6, 0x7e, 0x47, 0xae, + 0xf2, 0xbf, 0x9f, 0x8b, 0xfe, 0x4a, 0xa0, 0xd1, + 0x4e, 0x7c, 0x17, 0xb4, 0xbd, 0x09, 0xfc, 0x2d, + 0xe3, 0x4f, 0x82, 0xf6, 0x97, 0xa1, 0x3f, 0x85, + 0xbc, 0x69, 0xb2, 0xdd, 0x33, 0xf2, 0x3d, 0x77, + 0x95, 0xfc, 0xfc, 0x5f, 0xf2, 0x55, 0x06, 0x8a, + 0x73, 0xe0, 0xbd, 0xa5, 0xe8, 0x4f, 0xe1, 0x6f, + 0x1a, 0x7c, 0x17, 0xb4, 0xbd, 0x09, 0xfc, 0x2d, + 0xe3, 0x4d, 0x96, 0xe9, 0x9f, 0x91, 0xeb, 0xbc, + 0xaf, 0xe7, 0xe2, 0xff, 0x00, 0x92, 0xa8, 0x34, + 0x53, 0x83, 0x62, 0xb6, 0x92, 0x95, 0x16, 0x4f, + 0xd1, 0xd9, 0x6f, 0x1a, 0x7c, 0x17, 0xb4, 0xbd, + 0x09, 0xfc, 0x2d, 0xe3, 0x4d, 0x96, 0xe9, 0x9f, + 0x91, 0xeb, 0xbc, 0xaf, 0xe7, 0xe2, 0xff, 0x00, + 0x92, 0xa8, 0x34, 0x53, 0x9f, 0x05, 0xed, 0x2f, + 0x42, 0x7f, 0x0b, 0x78, 0xd3, 0xe0, 0xbd, 0xa5, + 0xe8, 0x4f, 0xe1, 0x6f, 0x1a, 0x6c, 0xb7, 0x4c, + 0xfc, 0x8f, 0x5d, 0xe5, 0x7f, 0x3f, 0x17, 0xfc, + 0x95, 0x41, 0xa2, 0x9c, 0xf8, 0x2f, 0x69, 0x7a, + 0x13, 0xf8, 0x5b, 0xc6, 0x9f, 0x05, 0xed, 0x2f, + 0x42, 0x7f, 0x0b, 0x78, 0xd3, 0x65, 0xba, 0x67, + 0xe4, 0x7a, 0xef, 0x2b, 0xf9, 0xf8, 0xbf, 0xe4, + 0xaa, 0x0d, 0x14, 0xe7, 0xc1, 0x7b, 0x4b, 0xd0, + 0x9f, 0xc2, 0xde, 0x34, 0xf8, 0x2f, 0x69, 0x7a, + 0x13, 0xf8, 0x5b, 0xc6, 0x9b, 0x2d, 0xd3, 0x3f, + 0x23, 0xd7, 0x79, 0x5f, 0xcf, 0xc5, 0xff, 0x00, + 0x25, 0x50, 0x68, 0xa7, 0x3e, 0x0b, 0xda, 0x5e, + 0x84, 0xfe, 0x16, 0xf1, 0xa7, 0xc1, 0x7b, 0x4b, + 0xd0, 0x9f, 0xc2, 0xde, 0x34, 0xd9, 0x6e, 0x99, + 0xf9, 0x1e, 0xbb, 0xca, 0xfe, 0x7e, 0x2f, 0xf9, + 0x2a, 0x83, 0x45, 0x39, 0xf0, 0x5e, 0xd2, 0xf4, + 0x27, 0xf0, 0xb7, 0x8d, 0x3e, 0x0b, 0xda, 0x5e, + 0x84, 0xfe, 0x16, 0xf1, 0xa6, 0xcb, 0x74, 0xcf, + 0xc8, 0xf5, 0xde, 0x57, 0xf3, 0xf1, 0x7f, 0xc9, + 0x54, 0x1a, 0x29, 0xcf, 0x82, 0xf6, 0x97, 0xa1, + 0x3f, 0x85, 0xbc, 0x69, 0xf0, 0x5e, 0xd2, 0xf4, + 0x27, 0xf0, 0xb7, 0x8d, 0x36, 0x5b, 0xa6, 0x7e, + 0x47, 0xae, 0xf2, 0xbf, 0x9f, 0x8b, 0xfe, 0x4a, + 0xa0, 0xd1, 0x4e, 0x7c, 0x17, 0xb4, 0xbd, 0x09, + 0xfc, 0x2d, 0xe3, 0x4f, 0x82, 0xf6, 0x97, 0xa1, + 0x3f, 0x85, 0xbc, 0x69, 0xb2, 0xdd, 0x33, 0xf2, + 0x3d, 0x77, 0x95, 0xfc, 0xfc, 0x5f, 0xf2, 0x55, + 0x06, 0x8a, 0x73, 0xe0, 0xbd, 0xa5, 0xe8, 0x4f, + 0xe1, 0x6f, 0x1a, 0x7c, 0x17, 0xb4, 0xbd, 0x09, + 0xfc, 0x2d, 0xe3, 0x4d, 0x96, 0xe9, 0x9f, 0x91, + 0xeb, 0xbc, 0xaf, 0xe7, 0xe2, 0xff, 0x00, 0x92, + 0xa8, 0x34, 0x0a, 0x73, 0xe0, 0xbd, 0xa5, 0xe8, + 0x4f, 0xe1, 0x6f, 0x1a, 0x7c, 0x19, 0xb4, 0xb4, + 0x23, 0xd8, 0x9f, 0xc2, 0xde, 0x34, 0xed, 0xdb, + 0xa6, 0x7e, 0x47, 0xae, 0xf2, 0xbf, 0x9f, 0x8b, + 0xfe, 0x4a, 0xff, 0x00, 0xe5, 0x0a, 0x37, 0x17, + 0xdc, 0xa3, 0xf7, 0x28, 0x3c, 0xd6, 0x7d, 0x55, + 0xf2, 0x67, 0x6c, 0x66, 0xd2, 0xe0, 0x23, 0xd8, + 0x5f, 0xc2, 0xde, 0x35, 0xf5, 0x88, 0x9a, 0xf6, + 0xd9, 0xc2, 0xd7, 0x8a, 0x39, 0xad, 0x68, 0x70, + 0xde, 0x20, 0x51, 0x6a, 0xf2, 0x95, 0x98, 0xdd, + 0xac, 0x4c, 0x6b, 0xcd, 0xe0, 0xff, 0x00, 0x3f, + 0xcf, 0x8b, 0x2d, 0x70, 0x46, 0x3c, 0x94, 0xc9, + 0xb7, 0x74, 0xce, 0xcb, 0x45, 0xb4, 0xd7, 0x4e, + 0x5f, 0x06, 0x46, 0xb5, 0x5f, 0x77, 0x94, 0x7b, + 0x65, 0x58, 0x06, 0xb5, 0x5f, 0x77, 0x94, 0x7b, + 0x65, 0x6a, 0x78, 0x22, 0xc2, 0xca, 0xc1, 0xd4, + 0x82, 0x4b, 0x39, 0xb6, 0xca, 0x67, 0x6d, 0xb9, + 0xcc, 0xa7, 0xe6, 0x0b, 0x5a, 0x79, 0xb1, 0x88, + 0x36, 0xb5, 0xc3, 0x5d, 0x60, 0xa8, 0xde, 0xae, + 0xd9, 0x3e, 0x9d, 0xff, 0x00, 0x30, 0x7a, 0x2b, + 0x1b, 0x65, 0xaa, 0xc7, 0xcd, 0x7f, 0xf7, 0x15, + 0x69, 0x05, 0x9b, 0xab, 0xb6, 0x4f, 0xa7, 0x7f, + 0xcc, 0x1e, 0x8a, 0x75, 0x76, 0xc9, 0xf4, 0xef, + 0xf9, 0x83, 0xd1, 0x55, 0x94, 0x41, 0x66, 0xea, + 0xed, 0x93, 0xe9, 0xdf, 0xf3, 0x07, 0xa2, 0x9d, + 0x5d, 0xb2, 0x7d, 0x3b, 0xfe, 0x60, 0xf4, 0x55, + 0x65, 0x10, 0x59, 0xba, 0xbb, 0x64, 0xfa, 0x77, + 0xfc, 0xc1, 0xe8, 0xa7, 0x57, 0x6c, 0x9f, 0x4e, + 0xff, 0x00, 0x98, 0x3d, 0x15, 0x59, 0x44, 0x16, + 0x6e, 0xae, 0xd9, 0x3e, 0x9d, 0xff, 0x00, 0x30, + 0x7a, 0x29, 0xd5, 0xdb, 0x27, 0xd3, 0xbf, 0xe6, + 0x0f, 0x45, 0x56, 0x51, 0x05, 0x9b, 0xab, 0xb6, + 0x4f, 0xa7, 0x7f, 0xcc, 0x1e, 0x8a, 0x75, 0x76, + 0xc9, 0xf4, 0xef, 0xf9, 0x83, 0xd1, 0x55, 0x94, + 0x41, 0x66, 0xea, 0xed, 0x93, 0xe9, 0xdf, 0xf3, + 0x07, 0xa2, 0x9d, 0x5d, 0xb2, 0x7d, 0x3b, 0xfe, + 0x60, 0xf4, 0x55, 0x65, 0x10, 0x59, 0xba, 0xbb, + 0x64, 0xfa, 0x77, 0xfc, 0xc1, 0xe8, 0xa7, 0x57, + 0x6c, 0x9f, 0x4e, 0xff, 0x00, 0x98, 0x3d, 0x15, + 0x59, 0x44, 0x16, 0x6e, 0xae, 0xd9, 0x3e, 0x9d, + 0xff, 0x00, 0x30, 0x7a, 0x29, 0xd5, 0xdb, 0x27, + 0xd3, 0xbf, 0xe6, 0x0f, 0x45, 0x56, 0x51, 0x05, + 0x9b, 0xab, 0xb6, 0x4f, 0xa7, 0x7f, 0xcc, 0x1e, + 0x8a, 0x75, 0x76, 0xc9, 0xf4, 0xef, 0xf9, 0x83, + 0xd1, 0x55, 0x94, 0xa7, 0x7f, 0x52, 0x0b, 0x37, + 0x57, 0x6c, 0x9f, 0x4e, 0xff, 0x00, 0x98, 0x3d, + 0x14, 0xea, 0xed, 0x93, 0xe9, 0xdf, 0xf3, 0x07, + 0xa2, 0xab, 0x58, 0x4e, 0xf1, 0xe0, 0x58, 0x41, + 0x66, 0xea, 0xed, 0x93, 0xe9, 0xdf, 0xf3, 0x07, + 0xa2, 0x9d, 0x5d, 0xb2, 0x7d, 0x3b, 0xfe, 0x60, + 0xf4, 0x55, 0x69, 0xac, 0x73, 0xcd, 0x18, 0xd2, + 0xe2, 0x37, 0x1a, 0x09, 0xf0, 0x2c, 0x16, 0x96, + 0x9a, 0x38, 0x10, 0x46, 0xb0, 0x45, 0x0a, 0x0b, + 0x37, 0x57, 0x6c, 0x9f, 0x4e, 0xff, 0x00, 0x98, + 0x3d, 0x14, 0xea, 0xed, 0x93, 0xe9, 0xdf, 0xf3, + 0x07, 0xa2, 0xab, 0x21, 0xa4, 0xea, 0x04, 0xf7, + 0x13, 0x42, 0x0b, 0x37, 0x57, 0x6c, 0x9f, 0x4e, + 0xff, 0x00, 0x98, 0x3d, 0x14, 0xea, 0xed, 0x93, + 0xe9, 0xdf, 0xf3, 0x07, 0xa2, 0xab, 0x34, 0x34, + 0xad, 0x34, 0x6f, 0xa2, 0x0b, 0x37, 0x57, 0x6c, + 0x9f, 0x4e, 0xff, 0x00, 0x98, 0x3d, 0x14, 0xea, + 0xed, 0x93, 0xe9, 0xdf, 0xf3, 0x07, 0xa2, 0xab, + 0x28, 0x82, 0xcd, 0xd5, 0xdb, 0x27, 0xd3, 0xbf, + 0xe6, 0x0f, 0x45, 0x3a, 0xbb, 0x64, 0xfa, 0x77, + 0xfc, 0xc1, 0xe8, 0xaa, 0xca, 0x20, 0xb3, 0x75, + 0x76, 0xc9, 0xf4, 0xef, 0xf9, 0x83, 0xd1, 0x4e, + 0xae, 0xd9, 0x3e, 0x9d, 0xff, 0x00, 0x30, 0x7a, + 0x2a, 0xb2, 0x88, 0x2c, 0xdd, 0x5d, 0xb2, 0x7d, + 0x3b, 0xfe, 0x60, 0xf4, 0x53, 0xab, 0xb6, 0x4f, + 0xa7, 0x7f, 0xcc, 0x1e, 0x8a, 0xac, 0xa2, 0x0b, + 0x37, 0x57, 0x6c, 0x9f, 0x4e, 0xff, 0x00, 0x98, + 0x3d, 0x14, 0xea, 0xed, 0x93, 0xe9, 0xdf, 0xf3, + 0x07, 0xa2, 0xab, 0x28, 0x82, 0xcd, 0xd5, 0xdb, + 0x27, 0xd3, 0xbf, 0xe6, 0x0f, 0x45, 0x3a, 0xbb, + 0x64, 0xfa, 0x77, 0xfc, 0xc1, 0xe8, 0xaa, 0xca, + 0x20, 0xb3, 0x75, 0x76, 0xc9, 0xf4, 0xef, 0xf9, + 0x83, 0xd1, 0x4e, 0xae, 0xd9, 0x3e, 0x9d, 0xff, + 0x00, 0x30, 0x7a, 0x2a, 0xb2, 0x88, 0x2c, 0xdd, + 0x5d, 0xb2, 0x7d, 0x3b, 0xfe, 0x60, 0xf4, 0x53, + 0xab, 0xb6, 0x4f, 0xa7, 0x7f, 0xcc, 0x1e, 0x8a, + 0xac, 0xa2, 0x0b, 0x37, 0x57, 0x6c, 0x9f, 0x4e, + 0xff, 0x00, 0x98, 0x3d, 0x15, 0xb6, 0xd2, 0xc7, + 0x66, 0x59, 0x75, 0x0b, 0xa0, 0xbc, 0xc7, 0x33, + 0x5e, 0xd3, 0x1b, 0x71, 0x83, 0x57, 0x03, 0xa0, + 0x53, 0x0a, 0xaa, 0x2e, 0xac, 0xa7, 0xf9, 0xa5, + 0xa7, 0xdb, 0x33, 0xeb, 0x04, 0x16, 0x9c, 0xdb, + 0xdf, 0x1d, 0xe6, 0x8f, 0x02, 0xe3, 0x5d, 0x99, + 0xb7, 0xbe, 0xbb, 0xcd, 0x1e, 0x05, 0xc6, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x3d, 0xdb, + 0xfe, 0xde, 0x3f, 0x39, 0xbe, 0x15, 0x38, 0x14, + 0x1d, 0xbf, 0xed, 0xe3, 0xf3, 0x9b, 0xe1, 0x53, + 0x81, 0x06, 0x54, 0x5e, 0x6f, 0xef, 0x56, 0x5e, + 0x7f, 0xca, 0x14, 0xa2, 0x8b, 0xcd, 0xfd, 0xea, + 0xcb, 0xcf, 0xf9, 0x42, 0x0c, 0x65, 0x1e, 0xf3, + 0x7b, 0xf6, 0x87, 0xeb, 0x15, 0x28, 0xa2, 0xf2, + 0x9f, 0x79, 0xbc, 0xf3, 0xcf, 0xd6, 0x2a, 0x4d, + 0x06, 0x51, 0x61, 0x10, 0x6d, 0x88, 0xe8, 0x34, + 0xd2, 0xbe, 0x63, 0x73, 0xf8, 0x81, 0xb4, 0x51, + 0xdc, 0xcd, 0x1b, 0x24, 0x8b, 0x0b, 0x1e, 0xe6, + 0x81, 0xcd, 0x8d, 0x40, 0x90, 0xbe, 0x9d, 0x0e, + 0xa7, 0x2f, 0x86, 0xde, 0xfb, 0xed, 0xc7, 0xda, + 0xbf, 0xeb, 0x14, 0x16, 0x0f, 0xf7, 0x13, 0x69, + 0x7d, 0x64, 0x5f, 0xbb, 0x09, 0xfe, 0xe2, 0x6d, + 0x2f, 0xac, 0x8b, 0xf7, 0x61, 0x56, 0x11, 0x35, + 0x91, 0x67, 0xff, 0x00, 0x71, 0x36, 0x97, 0xd6, + 0x45, 0xfb, 0xb0, 0x9f, 0xee, 0x26, 0xd2, 0xfa, + 0xc8, 0xbf, 0x76, 0x15, 0x61, 0x13, 0x59, 0x16, + 0x7f, 0xf7, 0x13, 0x69, 0x7d, 0x64, 0x5f, 0xbb, + 0x09, 0xfe, 0xe2, 0x6d, 0x2f, 0xac, 0x8b, 0xf7, + 0x61, 0x56, 0x11, 0x35, 0x91, 0x67, 0xff, 0x00, + 0x71, 0x36, 0x97, 0xd6, 0x45, 0xfb, 0xb0, 0x9f, + 0xee, 0x26, 0xd2, 0xfa, 0xc8, 0xbf, 0x76, 0x15, + 0x61, 0x13, 0x59, 0x16, 0x7f, 0xf7, 0x13, 0x69, + 0x7d, 0x64, 0x5f, 0xbb, 0x09, 0xfe, 0xe2, 0x6d, + 0x2f, 0xac, 0x8b, 0xf7, 0x61, 0x56, 0x14, 0xed, + 0x8e, 0xc5, 0x6d, 0x15, 0xfd, 0xa4, 0x57, 0x96, + 0xb0, 0xc6, 0xe8, 0x26, 0x6e, 0x28, 0xc9, 0x91, + 0xa0, 0x91, 0xda, 0x29, 0xac, 0x8e, 0xaf, 0xf7, + 0x13, 0x69, 0x7d, 0x64, 0x5f, 0xbb, 0x09, 0xfe, + 0xe2, 0x6d, 0x2f, 0xac, 0x8b, 0xf7, 0x61, 0x78, + 0x3f, 0x87, 0xbb, 0x54, 0x05, 0x4d, 0xbc, 0x74, + 0x1f, 0xe2, 0xb1, 0x47, 0x65, 0x3b, 0x39, 0x9b, + 0x67, 0x26, 0x61, 0x61, 0x1b, 0x64, 0xf6, 0x72, + 0x04, 0xb8, 0x9e, 0x19, 0x42, 0x6b, 0xf3, 0xbb, + 0x49, 0xac, 0x89, 0x4f, 0xf7, 0x13, 0x69, 0x7d, + 0x64, 0x5f, 0xbb, 0x09, 0xfe, 0xe2, 0x6d, 0x2f, + 0xac, 0x8b, 0xf7, 0x61, 0x6b, 0x77, 0xe1, 0xf6, + 0xd4, 0xb4, 0x54, 0xdb, 0xc7, 0xdc, 0x95, 0x9c, + 0x6a, 0x0a, 0xea, 0xd2, 0xea, 0xce, 0xe1, 0xd6, + 0xd7, 0x71, 0x3a, 0x19, 0xd8, 0x40, 0x74, 0x6f, + 0xd0, 0x45, 0x74, 0x84, 0xd6, 0x45, 0x87, 0xfd, + 0xc4, 0xda, 0x5f, 0x59, 0x17, 0xee, 0xc2, 0x7f, + 0xb8, 0x9b, 0x4b, 0xeb, 0x22, 0xfd, 0xd8, 0x50, + 0xb9, 0xa6, 0x4f, 0x7f, 0x94, 0xc9, 0x14, 0x57, + 0xcc, 0x6b, 0x1f, 0x3c, 0x62, 0x58, 0xc3, 0x5c, + 0x1d, 0x56, 0x1d, 0x15, 0xd0, 0xb4, 0xd8, 0xd9, + 0x5c, 0x5f, 0xdd, 0xc5, 0x67, 0x6a, 0xd0, 0xe9, + 0xe6, 0x38, 0x58, 0xd2, 0x68, 0x2b, 0xdb, 0x29, + 0xac, 0x8b, 0x07, 0xfb, 0x89, 0xb4, 0xbe, 0xb2, + 0x2f, 0xdd, 0x84, 0xff, 0x00, 0x71, 0x36, 0x97, + 0xd6, 0x45, 0xfb, 0xb0, 0xab, 0xd7, 0x76, 0xb3, + 0xd9, 0x5d, 0x4b, 0x69, 0x70, 0x03, 0x66, 0x81, + 0xc5, 0x92, 0x34, 0x1a, 0x80, 0x47, 0x64, 0x2d, + 0x29, 0xac, 0x8b, 0x3f, 0xfb, 0x89, 0xb4, 0xbe, + 0xb2, 0x2f, 0xdd, 0x84, 0xff, 0x00, 0x71, 0x36, + 0x97, 0xd6, 0x45, 0xfb, 0xb0, 0xab, 0x08, 0x9a, + 0xc8, 0xb3, 0xff, 0x00, 0xb8, 0x9b, 0x4b, 0xeb, + 0x22, 0xfd, 0xd8, 0x4f, 0xf7, 0x13, 0x69, 0x7d, + 0x64, 0x5f, 0xbb, 0x0a, 0xb0, 0x89, 0xac, 0x8b, + 0x3f, 0xfb, 0x89, 0xb4, 0xbe, 0xb2, 0x2f, 0xdd, + 0x84, 0xff, 0x00, 0x71, 0x36, 0x97, 0xd6, 0x45, + 0xfb, 0xb0, 0xab, 0x08, 0x9a, 0xc8, 0xb3, 0xff, + 0x00, 0xb8, 0x9b, 0x4b, 0xeb, 0x22, 0xfd, 0xd8, + 0x4f, 0xf7, 0x13, 0x69, 0x7d, 0x64, 0x5f, 0xbb, + 0x0a, 0xb0, 0x89, 0xac, 0x8f, 0xaa, 0xe5, 0xb9, + 0xf6, 0x63, 0x73, 0xb1, 0x57, 0x19, 0xd4, 0x8e, + 0x6f, 0xb6, 0x44, 0xc9, 0xdc, 0xc2, 0x1b, 0xe2, + 0xd6, 0x22, 0xe0, 0xdd, 0x1d, 0xc5, 0x51, 0xff, + 0x00, 0x71, 0x36, 0x97, 0xd6, 0x45, 0xfb, 0xb0, + 0xa7, 0x72, 0x4f, 0xff, 0x00, 0x4c, 0x2e, 0xfe, + 0xca, 0xef, 0xeb, 0x3d, 0x7c, 0xed, 0x35, 0x91, + 0x67, 0xff, 0x00, 0x71, 0x36, 0x97, 0xd6, 0x45, + 0xfb, 0xb0, 0x9f, 0xee, 0x26, 0xd2, 0xfa, 0xc8, + 0xbf, 0x76, 0x15, 0x61, 0x13, 0x59, 0x16, 0x7f, + 0xf7, 0x13, 0x69, 0x7d, 0x64, 0x5f, 0xbb, 0x09, + 0xfe, 0xe2, 0x6d, 0x2f, 0xac, 0x8b, 0xf7, 0x61, + 0x56, 0x11, 0x35, 0x91, 0x67, 0xff, 0x00, 0x71, + 0x36, 0x97, 0xd6, 0x45, 0xfb, 0xb0, 0x9f, 0xee, + 0x26, 0xd2, 0xfa, 0xc8, 0xbf, 0x76, 0x15, 0x64, + 0x0a, 0x90, 0x06, 0xb3, 0xa0, 0x29, 0x3c, 0xd7, + 0x66, 0xb3, 0x8c, 0xa2, 0xde, 0x3b, 0x9b, 0xf8, + 0x9a, 0xc8, 0x66, 0x76, 0x16, 0x39, 0xaf, 0x0e, + 0xd2, 0x46, 0x2d, 0x34, 0xd5, 0xa0, 0x26, 0xb2, + 0x24, 0xff, 0x00, 0xdc, 0x4d, 0xa5, 0xf5, 0x91, + 0x7e, 0xec, 0x27, 0xfb, 0x89, 0xb4, 0xbe, 0xb2, + 0x2f, 0xdd, 0x85, 0x58, 0x26, 0x82, 0xaa, 0x4f, + 0x32, 0xd9, 0xdc, 0xdb, 0x2b, 0xb4, 0x86, 0xf6, + 0xf6, 0x26, 0xc7, 0x05, 0xc1, 0x02, 0x22, 0x1e, + 0x1c, 0x49, 0x73, 0x71, 0x8a, 0xb4, 0x6a, 0xd0, + 0x13, 0x59, 0x12, 0x9f, 0xee, 0x26, 0xd2, 0xfa, + 0xc8, 0xbf, 0x76, 0x13, 0xfd, 0xc4, 0xda, 0x5f, + 0x59, 0x17, 0xee, 0xc2, 0xe4, 0xb0, 0xd8, 0xbd, + 0xa1, 0xcc, 0x2d, 0x23, 0xbc, 0xb4, 0x85, 0x8f, + 0x82, 0x61, 0x56, 0x38, 0xc8, 0xd6, 0x92, 0x2b, + 0x4d, 0x45, 0x7b, 0xb9, 0xd8, 0x5d, 0xa7, 0xb6, + 0x88, 0xca, 0xfb, 0x40, 0xf6, 0xb7, 0x49, 0x11, + 0x3d, 0xaf, 0x76, 0x8e, 0xc0, 0x4d, 0x64, 0x74, + 0x7f, 0xb8, 0x9b, 0x4b, 0xeb, 0x22, 0xfd, 0xd8, + 0x4f, 0xf7, 0x13, 0x69, 0x7d, 0x64, 0x5f, 0xbb, + 0x0a, 0x06, 0xc3, 0x2f, 0xba, 0xcc, 0x2f, 0x23, + 0xb2, 0xb5, 0x68, 0x74, 0xf2, 0x92, 0x18, 0xd7, + 0x1c, 0x22, 0xad, 0xad, 0x6a, 0x4f, 0x69, 0x6b, + 0xba, 0xb6, 0x96, 0xd6, 0xe6, 0x5b, 0x59, 0xc0, + 0x12, 0xc0, 0xf3, 0x1c, 0x80, 0x1a, 0x80, 0xe6, + 0x9a, 0x1d, 0x29, 0xac, 0x8b, 0x17, 0xfb, 0x89, + 0xb4, 0xbe, 0xb2, 0x2f, 0xdd, 0x84, 0xff, 0x00, + 0x71, 0x36, 0x97, 0xd6, 0x45, 0xfb, 0xb0, 0xa1, + 0x72, 0xec, 0x9e, 0xff, 0x00, 0x33, 0x65, 0xc3, + 0xed, 0x18, 0xd7, 0x36, 0xd1, 0x9c, 0xec, 0xd8, + 0x9c, 0x1b, 0x46, 0xe9, 0xd5, 0x5d, 0x7a, 0x97, + 0x10, 0x35, 0x15, 0xdf, 0x4d, 0x64, 0x59, 0xff, + 0x00, 0xdc, 0x4d, 0xa5, 0xf5, 0x91, 0x7e, 0xec, + 0x27, 0xfb, 0x89, 0xb4, 0xbe, 0xb2, 0x2f, 0xdd, + 0x85, 0x58, 0x44, 0xd6, 0x45, 0x9f, 0xfd, 0xc4, + 0xda, 0x5f, 0x59, 0x17, 0xee, 0xc2, 0x7f, 0xb8, + 0x9b, 0x49, 0xeb, 0x22, 0xfd, 0xd8, 0x55, 0x84, + 0x53, 0xac, 0x8b, 0x31, 0xfc, 0x44, 0xda, 0x50, + 0x0f, 0x8f, 0x16, 0xff, 0x00, 0xec, 0xc2, 0xfa, + 0x5d, 0x8c, 0xf2, 0x5c, 0x65, 0x56, 0xb7, 0x12, + 0x53, 0x9c, 0x96, 0x26, 0x3d, 0xf4, 0xd0, 0x2a, + 0xe0, 0x09, 0x5f, 0x0e, 0x3a, 0x8f, 0x69, 0x7d, + 0xbb, 0x2a, 0xfe, 0x47, 0x63, 0xf6, 0x11, 0xfd, + 0x50, 0xa3, 0x51, 0xd0, 0x35, 0xaa, 0xfb, 0xbc, + 0xa3, 0xdb, 0x2a, 0x7c, 0x6b, 0x50, 0x0e, 0xf2, + 0x8f, 0x6c, 0xa0, 0x2c, 0x1d, 0x4b, 0x2b, 0x07, + 0x52, 0x0c, 0x6d, 0x96, 0xab, 0x1f, 0x35, 0xff, + 0x00, 0xdc, 0x55, 0xa5, 0x65, 0xdb, 0x2d, 0x56, + 0x3e, 0x6b, 0xff, 0x00, 0xb8, 0xab, 0x48, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x0b, 0xbf, 0x22, 0xd3, 0x9c, + 0x5a, 0x8a, 0x68, 0x2f, 0xed, 0xfe, 0x6b, 0xb7, + 0xd7, 0x02, 0xef, 0xc8, 0x7f, 0x9c, 0xda, 0x79, + 0xe7, 0xea, 0xb9, 0x04, 0x9e, 0x65, 0xb4, 0x37, + 0xf6, 0xb9, 0x94, 0xf0, 0x46, 0xd8, 0x8c, 0x51, + 0x3a, 0x80, 0x16, 0x02, 0x75, 0x6e, 0xe9, 0x5a, + 0xb6, 0x86, 0x0b, 0x69, 0x2d, 0xac, 0xf3, 0x18, + 0x63, 0x11, 0x49, 0x74, 0x28, 0xe6, 0x0d, 0x03, + 0x50, 0xa6, 0x85, 0xbf, 0x31, 0x8f, 0x66, 0xce, + 0x67, 0x37, 0xb5, 0xcb, 0x38, 0x9b, 0x1f, 0xeb, + 0x1a, 0xd1, 0xe2, 0x57, 0x46, 0xf3, 0x16, 0xbd, + 0xa0, 0x13, 0x0b, 0xbb, 0x18, 0xe8, 0xd1, 0x62, + 0x30, 0xfb, 0x30, 0x66, 0xa2, 0x2a, 0x2b, 0x8a, + 0xbd, 0x8a, 0x20, 0xf7, 0x98, 0x5d, 0xbf, 0x22, + 0x82, 0xde, 0xca, 0xc4, 0x35, 0x93, 0xb9, 0x81, + 0xf3, 0x4a, 0x5a, 0x0b, 0x89, 0x3b, 0x9a, 0x57, + 0x87, 0xbc, 0x67, 0x79, 0x34, 0xf7, 0x12, 0xb5, + 0xa2, 0xf6, 0xc8, 0xd4, 0xc8, 0xd1, 0x4c, 0x4d, + 0xdd, 0xad, 0x3b, 0x0b, 0x4e, 0xd7, 0x13, 0xd6, + 0xfd, 0x8e, 0x65, 0x94, 0xe1, 0x72, 0xdb, 0xb3, + 0xa4, 0x75, 0x6e, 0x6c, 0x4f, 0x93, 0xcc, 0x92, + 0x79, 0x0e, 0x28, 0x24, 0x36, 0x65, 0xf1, 0x33, + 0x27, 0x8f, 0x9c, 0x68, 0x22, 0x49, 0xdd, 0x1e, + 0x9a, 0x1d, 0x7a, 0x95, 0x62, 0xee, 0xdd, 0xd0, + 0x5f, 0x4d, 0x6d, 0x4f, 0x19, 0xb2, 0x16, 0x34, + 0x0e, 0xc9, 0xd1, 0xf2, 0x29, 0x8b, 0x69, 0x1d, + 0x0e, 0xcb, 0x36, 0x56, 0x9a, 0x3e, 0x3b, 0xb0, + 0xe0, 0x7b, 0x2d, 0x70, 0x5b, 0xee, 0x6c, 0x9b, + 0x71, 0xb4, 0xf6, 0x93, 0xb0, 0x7e, 0xa6, 0xe5, + 0x8d, 0xb8, 0x3d, 0xa6, 0x0a, 0xfc, 0x81, 0x07, + 0x76, 0x62, 0xd8, 0xa2, 0xc9, 0xae, 0xad, 0x5a, + 0xd1, 0x8a, 0xd6, 0x18, 0xda, 0xe7, 0x01, 0xba, + 0x69, 0xa7, 0xbc, 0xa9, 0x4a, 0xd1, 0xed, 0x1e, + 0xd3, 0x97, 0x67, 0xb3, 0x6b, 0x0e, 0x96, 0x8d, + 0xed, 0x36, 0x8d, 0x1e, 0x05, 0x57, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x5d, 0x59, 0x57, 0xf3, 0x4b, + 0x4f, 0xb6, 0x67, 0xd6, 0x0b, 0x95, 0x75, 0x65, + 0x5f, 0xcd, 0x2d, 0x3e, 0xd9, 0x9f, 0x58, 0x20, + 0xb4, 0xe6, 0xde, 0xfa, 0xef, 0x34, 0x2e, 0x35, + 0xd9, 0x9b, 0x7b, 0xeb, 0xbc, 0xd0, 0xb8, 0xd0, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x07, 0xbb, + 0x7f, 0xdb, 0xc7, 0xe7, 0x37, 0xc2, 0xa7, 0x14, + 0x1d, 0xbf, 0xed, 0xe3, 0xf3, 0x9b, 0xe1, 0x53, + 0x68, 0x32, 0xa3, 0x33, 0x7f, 0x7a, 0xb2, 0xf3, + 0xfe, 0x50, 0xa4, 0x94, 0x66, 0x6c, 0x7f, 0xee, + 0x6c, 0xfc, 0xff, 0x00, 0x94, 0x20, 0x65, 0x3e, + 0xf5, 0x79, 0xe7, 0x9f, 0xac, 0x54, 0x9a, 0x8c, + 0xca, 0x7d, 0xea, 0xf3, 0xcf, 0x3f, 0x58, 0xa9, + 0x34, 0x04, 0x44, 0x41, 0xb6, 0x1d, 0x4e, 0x5f, + 0x0d, 0xbd, 0xf7, 0xdb, 0x8f, 0xb5, 0x7f, 0xd6, + 0x2b, 0xee, 0x50, 0x6e, 0xaf, 0x86, 0x5e, 0xfb, + 0xed, 0xc7, 0xda, 0xbf, 0xeb, 0x14, 0x1a, 0x51, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x15, 0xcb, 0x3a, 0xbf, 0xbe, 0xb3, 0xd9, + 0x0d, 0x9e, 0x75, 0xa5, 0xc4, 0x96, 0xe5, 0xed, + 0x78, 0x71, 0x8d, 0xc5, 0xb5, 0xa5, 0x28, 0x0d, + 0x15, 0x35, 0x7d, 0x0d, 0xf9, 0x96, 0x49, 0x63, + 0xb2, 0x59, 0x23, 0xb3, 0x7b, 0x13, 0x7e, 0xc9, + 0x18, 0xe1, 0x0b, 0x45, 0x3c, 0x57, 0x0d, 0x7e, + 0x59, 0x6e, 0xb4, 0x14, 0xc3, 0x9f, 0xe7, 0xb4, + 0xfe, 0x61, 0x70, 0x7f, 0xfc, 0xae, 0x23, 0x79, + 0x4f, 0xec, 0x74, 0xb2, 0x45, 0x90, 0xed, 0x14, + 0xd1, 0x3c, 0xb2, 0x56, 0x40, 0x5c, 0xd7, 0x83, + 0x42, 0x1c, 0x1a, 0xf2, 0x1d, 0x89, 0x69, 0xcc, + 0xf3, 0xed, 0x90, 0xb8, 0xb0, 0x9a, 0x0b, 0x2c, + 0x95, 0xd6, 0xf7, 0x2f, 0x6d, 0x22, 0x94, 0x86, + 0x00, 0xd3, 0xbf, 0xa1, 0xe7, 0x52, 0xeb, 0xd8, + 0x36, 0x5a, 0xbf, 0x29, 0xcf, 0x59, 0x78, 0xe2, + 0xcb, 0x57, 0x46, 0x04, 0xcf, 0x6e, 0xb0, 0xc2, + 0xd7, 0x62, 0x23, 0x5e, 0xe2, 0x0a, 0xe3, 0x36, + 0x8b, 0x3f, 0x61, 0x0e, 0x6e, 0x61, 0x73, 0x51, + 0xaf, 0xf5, 0x8e, 0xee, 0x57, 0x4a, 0xb0, 0x6d, + 0xb3, 0xfd, 0xbb, 0x27, 0xc8, 0xf3, 0x69, 0x5a, + 0x1b, 0x77, 0x73, 0x19, 0x6c, 0x84, 0x0a, 0x54, + 0x0c, 0x2e, 0x1d, 0xf3, 0x55, 0x91, 0x6d, 0xf8, + 0x67, 0x19, 0xc6, 0x6e, 0xae, 0x25, 0x00, 0x57, + 0x01, 0xc4, 0xea, 0x83, 0xd8, 0x6b, 0x02, 0x8a, + 0xda, 0xad, 0xa1, 0x8f, 0x3a, 0xba, 0x82, 0x3b, + 0x48, 0xcc, 0x36, 0x16, 0x4d, 0xe6, 0xad, 0xd8, + 0xed, 0x67, 0x57, 0x8d, 0x41, 0xab, 0x50, 0x08, + 0x3b, 0xff, 0x00, 0x11, 0x7d, 0xff, 0x00, 0x2e, + 0xff, 0x00, 0xc2, 0x67, 0x84, 0xa8, 0xdd, 0x8e, + 0xff, 0x00, 0x53, 0x65, 0xff, 0x00, 0x6b, 0xf2, + 0x29, 0x3f, 0xc4, 0x41, 0x5b, 0xec, 0xb4, 0xd7, + 0xff, 0x00, 0xd9, 0x33, 0xeb, 0x15, 0x19, 0xb1, + 0xb5, 0x3b, 0x4f, 0x97, 0xd3, 0xd6, 0xff, 0x00, + 0x74, 0x94, 0x1a, 0x76, 0xa7, 0xfd, 0x49, 0x99, + 0x7f, 0xe4, 0x3b, 0xe4, 0x51, 0x6a, 0x53, 0x6a, + 0x3f, 0xd4, 0x79, 0x97, 0xdb, 0xbb, 0xe4, 0x51, + 0x68, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x3e, 0x89, 0x92, 0x7f, 0xfa, + 0x61, 0x77, 0xf6, 0x57, 0x7f, 0x59, 0xeb, 0xe7, + 0x6b, 0xe8, 0x99, 0x27, 0xff, 0x00, 0xa6, 0x17, + 0x7f, 0x65, 0x77, 0xf5, 0x9e, 0xbe, 0x76, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x83, 0xd3, 0x3c, 0xb6, + 0x79, 0xc3, 0xc2, 0x17, 0xd4, 0x36, 0xb5, 0xa3, + 0x30, 0xc9, 0x6f, 0xac, 0x40, 0x06, 0x6b, 0x28, + 0x60, 0xbc, 0x8f, 0x7e, 0x9a, 0x43, 0xa9, 0xdc, + 0x69, 0x5f, 0x2e, 0x67, 0x96, 0xcf, 0x38, 0x78, + 0x42, 0xfa, 0x5d, 0xcd, 0xcc, 0x71, 0xed, 0xad, + 0xbd, 0x9c, 0xbf, 0xb2, 0xcc, 0x72, 0xf1, 0x6e, + 0xf1, 0xb9, 0xe3, 0x62, 0x2d, 0xef, 0xb6, 0x88, + 0x28, 0x19, 0x2d, 0x91, 0xcc, 0x33, 0x6b, 0x3b, + 0x31, 0xff, 0x00, 0x1a, 0x56, 0x87, 0x79, 0xa0, + 0xe2, 0x77, 0x78, 0x2b, 0xa6, 0xdf, 0xde, 0x47, + 0x79, 0xb3, 0xf6, 0xb2, 0xc7, 0x41, 0x13, 0x6f, + 0x5f, 0x13, 0x29, 0xa8, 0xb6, 0x36, 0xc8, 0xcf, + 0xee, 0xa8, 0x7d, 0x97, 0xb5, 0x39, 0x5e, 0x63, + 0x9b, 0x5f, 0x4c, 0x0b, 0x46, 0x4b, 0x04, 0xad, + 0x07, 0x7a, 0x47, 0x13, 0x1b, 0x78, 0x40, 0x25, + 0x7b, 0xcd, 0x5c, 0xe3, 0xf8, 0x7d, 0x94, 0x3d, + 0xe6, 0xae, 0x75, 0xd4, 0x8e, 0x71, 0xdf, 0x27, + 0x9e, 0x25, 0x07, 0x46, 0x65, 0x7d, 0x7b, 0x67, + 0xb0, 0xd9, 0x24, 0x96, 0x93, 0x3e, 0xdd, 0xcf, + 0x71, 0x05, 0xd1, 0x38, 0xb4, 0x91, 0x47, 0x9a, + 0x68, 0x51, 0x79, 0x06, 0xd2, 0xe7, 0x91, 0xe7, + 0x16, 0x81, 0xd7, 0x73, 0x5c, 0x47, 0x24, 0xad, + 0x64, 0x91, 0x48, 0xf2, 0xf0, 0xe6, 0xb8, 0xd3, + 0x51, 0xdd, 0x56, 0x38, 0xe1, 0xd9, 0xf9, 0x36, + 0x33, 0x27, 0x19, 0xec, 0xcf, 0x86, 0x01, 0x5e, + 0x65, 0xd1, 0xeb, 0x2e, 0xa3, 0xb4, 0x79, 0x2e, + 0xdc, 0x5c, 0x96, 0xd7, 0x7f, 0x87, 0xb9, 0x34, + 0xcd, 0xbe, 0xb4, 0x74, 0xf7, 0xb7, 0x31, 0x69, + 0x85, 0x8e, 0xa9, 0x01, 0xdb, 0xfe, 0x4b, 0x40, + 0x41, 0xec, 0x5b, 0xc5, 0x6d, 0xf8, 0xa1, 0xcd, + 0xc4, 0x30, 0xb1, 0xce, 0x12, 0x11, 0xfd, 0x67, + 0xc5, 0x8d, 0xdd, 0xf2, 0xaa, 0xbb, 0x45, 0xfc, + 0xff, 0x00, 0x31, 0xff, 0x00, 0xc9, 0x93, 0xeb, + 0x29, 0x6d, 0x9b, 0xcc, 0x66, 0xcc, 0xf6, 0xe2, + 0x1b, 0xf9, 0xc5, 0x1f, 0x3c, 0x8f, 0x76, 0x11, + 0xa4, 0x34, 0x61, 0x38, 0x5b, 0xc0, 0xa2, 0x76, + 0x8b, 0xf9, 0xfe, 0x63, 0xff, 0x00, 0x93, 0x27, + 0xd6, 0x41, 0x3d, 0xb0, 0x75, 0xf6, 0x3c, 0xf3, + 0xff, 0x00, 0x13, 0xe4, 0x7a, 0xa7, 0xb7, 0xc9, + 0x1d, 0xa5, 0x6f, 0xd8, 0x43, 0x4b, 0x2c, 0xf4, + 0xee, 0x0b, 0x4d, 0x3c, 0x0f, 0x55, 0x06, 0xf9, + 0x23, 0xb4, 0x83, 0x28, 0x88, 0x80, 0x88, 0x88, + 0x07, 0x51, 0xed, 0x2f, 0xb6, 0xe5, 0x5f, 0xc8, + 0xac, 0x7e, 0xc2, 0x3f, 0xaa, 0x17, 0xc4, 0x8e, + 0xa3, 0xda, 0x5f, 0x6d, 0xca, 0xbf, 0x91, 0x58, + 0xfd, 0x84, 0x7f, 0x54, 0x20, 0xde, 0x37, 0x14, + 0x0b, 0xbc, 0xa3, 0xdb, 0x2a, 0x78, 0x6e, 0x28, + 0x17, 0x79, 0x47, 0xb6, 0x50, 0x16, 0x0e, 0xa5, + 0x95, 0x83, 0xa9, 0x06, 0x36, 0xcb, 0x55, 0x8f, + 0x9a, 0xff, 0x00, 0xee, 0x2a, 0xd2, 0xb2, 0xed, + 0x96, 0xab, 0x1f, 0x35, 0xff, 0x00, 0xdc, 0x55, + 0xa4, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, 0xdf, 0x90, + 0xff, 0x00, 0x38, 0xb4, 0xf3, 0xcf, 0xd5, 0x21, + 0x70, 0x20, 0x24, 0x38, 0x38, 0x12, 0x08, 0xd4, + 0x46, 0x8a, 0x70, 0x20, 0xee, 0xcf, 0x6b, 0xd6, + 0xf7, 0x43, 0x7e, 0x45, 0x23, 0x9d, 0x17, 0xbf, + 0x20, 0xcb, 0x26, 0x6e, 0x9e, 0x6c, 0x50, 0x1e, + 0xd0, 0xc2, 0x3c, 0x0a, 0x00, 0xd4, 0x92, 0x49, + 0x24, 0x9d, 0x64, 0xe9, 0x3a, 0xa8, 0xb3, 0x88, + 0xd0, 0x36, 0xa7, 0x08, 0xd4, 0x37, 0x10, 0x58, + 0xb3, 0x5b, 0x49, 0x73, 0xa8, 0x6d, 0xf3, 0x1b, + 0x00, 0x25, 0x70, 0x68, 0x64, 0xd1, 0x82, 0x31, + 0x02, 0x0f, 0x65, 0x78, 0xe6, 0x8e, 0x4b, 0x91, + 0xdc, 0x45, 0x72, 0x43, 0x6f, 0x2f, 0x8d, 0x04, + 0x40, 0xd4, 0x86, 0xd2, 0x87, 0xbc, 0xa0, 0xa3, + 0x96, 0x58, 0x89, 0x31, 0x3d, 0xd1, 0x93, 0xf3, + 0x49, 0x0b, 0xcb, 0xde, 0xf9, 0x1c, 0x5e, 0xf7, + 0x17, 0x38, 0xeb, 0x24, 0xd7, 0xc2, 0x82, 0x71, + 0xa3, 0xff, 0x00, 0xa8, 0x3c, 0x1e, 0x92, 0x47, + 0xd2, 0x52, 0x59, 0x7d, 0xdc, 0x7d, 0x40, 0xdc, + 0xc0, 0x8a, 0xcf, 0x69, 0x14, 0x90, 0xb5, 0xdd, + 0x9a, 0xd0, 0x7c, 0x8a, 0xa3, 0x8d, 0xf4, 0xc3, + 0x88, 0xe1, 0xf9, 0xb5, 0x34, 0xe0, 0x4c, 0x4e, + 0xa1, 0x68, 0x24, 0x03, 0xac, 0x54, 0xd3, 0x82, + 0xb4, 0x41, 0x39, 0x95, 0x57, 0xe1, 0xcc, 0xd3, + 0x41, 0xd2, 0x47, 0x7e, 0x8a, 0x09, 0x64, 0x12, + 0x01, 0x00, 0x90, 0x1d, 0xe5, 0x00, 0x74, 0x1a, + 0x76, 0x16, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x17, + 0x56, 0x55, 0xfc, 0xd2, 0xd3, 0xed, 0x99, 0xf5, + 0x82, 0xe5, 0x5d, 0x59, 0x57, 0xf3, 0x4b, 0x4f, + 0xb6, 0x67, 0xd6, 0x08, 0x2d, 0x39, 0xb7, 0xbe, + 0xbb, 0xcd, 0x0b, 0x8d, 0x76, 0x66, 0xde, 0xfa, + 0xef, 0x34, 0x2e, 0x34, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x41, 0xee, 0xdf, 0xf6, 0xf1, 0xf9, + 0xcd, 0xf0, 0xa9, 0xb5, 0x09, 0x6f, 0xfb, 0x78, + 0xfc, 0xe6, 0xf8, 0x54, 0xda, 0x02, 0x8c, 0xcd, + 0x7d, 0xea, 0xcb, 0xcf, 0xf9, 0x42, 0x93, 0x51, + 0x99, 0xaf, 0xbd, 0x59, 0x79, 0xff, 0x00, 0x28, + 0x40, 0xca, 0x7d, 0xea, 0xf3, 0xcf, 0x3f, 0x58, + 0xa9, 0x35, 0x19, 0x94, 0xfb, 0xd5, 0xe7, 0x9e, + 0x7e, 0xb1, 0x52, 0x68, 0x08, 0x88, 0x83, 0x6c, + 0x1b, 0xab, 0xe1, 0x97, 0xbe, 0xfb, 0x71, 0xf6, + 0xaf, 0xfa, 0xc5, 0x7d, 0xce, 0x0d, 0xd5, 0xf0, + 0xcb, 0xdf, 0x7d, 0xb8, 0xfb, 0x57, 0xfd, 0x62, + 0x83, 0x4a, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0xb6, 0x6d, 0x21, 0xff, + 0x00, 0xe9, 0xdb, 0x3b, 0xa6, 0x9a, 0x1f, 0xa6, + 0xb4, 0x1a, 0x95, 0x4d, 0x6f, 0x96, 0xf6, 0xf2, + 0x68, 0x22, 0xb7, 0x96, 0x79, 0x24, 0x82, 0x0f, + 0xd8, 0xc4, 0xe7, 0x12, 0xd6, 0x57, 0x47, 0x8a, + 0x0e, 0xa4, 0x1a, 0x35, 0x0a, 0x6e, 0x6b, 0xa2, + 0xb6, 0x6c, 0x8d, 0x7e, 0x1d, 0xda, 0x41, 0xbf, + 0x6c, 0x4f, 0xd0, 0x7a, 0xa9, 0xad, 0xd0, 0xde, + 0xde, 0x5b, 0xc5, 0x2c, 0x10, 0x4f, 0x24, 0x51, + 0x5c, 0x0c, 0x33, 0x46, 0xc7, 0x16, 0xb5, 0xe2, + 0x84, 0x78, 0xc0, 0x6b, 0xd6, 0x83, 0x4f, 0x63, + 0x57, 0x6b, 0x52, 0x1a, 0xd3, 0x46, 0xee, 0x8e, + 0xee, 0xbd, 0x43, 0xb4, 0x87, 0x49, 0xae, 0xee, + 0xbe, 0x14, 0x41, 0x7a, 0xcd, 0xb2, 0x99, 0xf6, + 0xab, 0x23, 0xcb, 0x33, 0x4c, 0xac, 0x36, 0x6b, + 0x8b, 0x58, 0x9b, 0x05, 0xc4, 0x38, 0x80, 0x77, + 0x8b, 0xae, 0x95, 0xdd, 0xae, 0x9d, 0x2b, 0xc6, + 0xc9, 0x6c, 0xbe, 0x61, 0x95, 0xdf, 0x75, 0xd6, + 0x72, 0xc1, 0x69, 0x6f, 0x64, 0xc7, 0xbc, 0x07, + 0x91, 0x52, 0x4b, 0x4b, 0x75, 0x02, 0x68, 0x02, + 0xa8, 0xd9, 0x66, 0x57, 0xf9, 0x7b, 0xcc, 0x96, + 0x37, 0x12, 0x5b, 0xb9, 0xde, 0x51, 0x8d, 0xc5, + 0xb5, 0xed, 0x8d, 0xd5, 0xb6, 0xff, 0x00, 0x3c, + 0xcd, 0xf3, 0x16, 0x86, 0x5f, 0x5d, 0xcb, 0x3c, + 0x62, 0x87, 0x9b, 0x73, 0xbc, 0x4a, 0x8d, 0xdc, + 0x23, 0x42, 0x0d, 0x39, 0x85, 0xd7, 0xb6, 0xdf, + 0xdc, 0x5e, 0x74, 0x89, 0x1d, 0x20, 0xae, 0xf3, + 0x8d, 0x47, 0x79, 0x73, 0xa2, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0xfa, 0x26, 0x49, 0xff, 0x00, 0xe9, 0x85, 0xdf, + 0xd9, 0x5d, 0xfd, 0x67, 0xaf, 0x9d, 0xaf, 0xa2, + 0x64, 0x9f, 0xfe, 0x98, 0x5d, 0xfd, 0x95, 0xdf, + 0xd6, 0x7a, 0xf9, 0xda, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x0c, 0xb3, 0xf6, 0x8d, 0xf3, 0x80, 0x00, + 0x76, 0xc2, 0xb7, 0x6d, 0xbd, 0xd3, 0xec, 0xb6, + 0x9a, 0xc2, 0xf1, 0x84, 0x83, 0x04, 0x10, 0xca, + 0x29, 0xbc, 0xd2, 0x4d, 0x15, 0x43, 0x51, 0xa8, + 0xd0, 0x56, 0xeb, 0xab, 0xcb, 0xab, 0xc7, 0x89, + 0x2e, 0xe6, 0x7c, 0xef, 0x68, 0x0d, 0x6b, 0xa4, + 0x71, 0x71, 0x0d, 0x15, 0xa0, 0xa9, 0xed, 0xa0, + 0xbd, 0x6d, 0xb0, 0xb7, 0xb0, 0xca, 0x6e, 0x24, + 0xb7, 0x77, 0x8f, 0x9f, 0x5c, 0x47, 0x3e, 0x8a, + 0x57, 0x9b, 0x8d, 0x8d, 0x73, 0xb7, 0xbf, 0x3b, + 0xc2, 0xa2, 0xb3, 0x4f, 0xff, 0x00, 0x4f, 0x72, + 0x80, 0x37, 0x2e, 0x9f, 0xe0, 0x9b, 0x5a, 0xad, + 0xdc, 0x5e, 0xde, 0x5d, 0x32, 0x28, 0xee, 0x67, + 0x92, 0x66, 0x40, 0x30, 0xc2, 0xd7, 0xb8, 0xb8, + 0x30, 0x68, 0x14, 0x6d, 0x75, 0x6a, 0x58, 0x7d, + 0xe5, 0xdc, 0x96, 0xcc, 0xb4, 0x92, 0x67, 0xba, + 0xda, 0x23, 0x8a, 0x38, 0x0b, 0x89, 0x63, 0x49, + 0xae, 0x96, 0xb7, 0x50, 0xf2, 0x8a, 0x0b, 0x3e, + 0x7a, 0x7f, 0xfa, 0x2e, 0x44, 0x29, 0xf9, 0xee, + 0xa7, 0x03, 0xd5, 0x49, 0x6f, 0x92, 0xfa, 0xf6, + 0x5b, 0x78, 0xed, 0x65, 0x9e, 0x49, 0x2d, 0xe1, + 0x35, 0x8a, 0x17, 0x38, 0x96, 0x34, 0xff, 0x00, + 0x55, 0xa7, 0x40, 0x5a, 0x10, 0x77, 0xe4, 0x77, + 0xed, 0xcb, 0xb3, 0x9b, 0x3b, 0xd7, 0xe8, 0x8e, + 0x09, 0x41, 0x93, 0xcc, 0x3a, 0x1c, 0xac, 0x9b, + 0x51, 0xb1, 0xd9, 0xa5, 0xce, 0x69, 0x36, 0x63, + 0x95, 0xc6, 0x2f, 0x2d, 0xaf, 0x5d, 0xcf, 0x34, + 0xb0, 0x8a, 0x82, 0xed, 0x26, 0xb5, 0xec, 0xaa, + 0x62, 0x90, 0xb2, 0xcf, 0xf3, 0xab, 0x08, 0xf9, + 0x9b, 0x3b, 0xc9, 0x62, 0x88, 0x6a, 0x8c, 0x3a, + 0xad, 0x15, 0xde, 0x69, 0xa8, 0x08, 0x2d, 0x36, + 0xf6, 0x12, 0xec, 0xae, 0xca, 0x66, 0x52, 0x66, + 0x0e, 0x6b, 0x2f, 0x73, 0x20, 0x22, 0x86, 0x10, + 0x43, 0x88, 0x14, 0x20, 0x6a, 0xf3, 0x8d, 0x55, + 0x18, 0x68, 0x0b, 0xa2, 0xf2, 0xfe, 0xf6, 0xfa, + 0x5e, 0x7a, 0xf2, 0x77, 0xdc, 0x48, 0x05, 0x03, + 0xa4, 0x71, 0x71, 0x03, 0x78, 0x57, 0x52, 0xe7, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x3a, 0x8f, + 0x69, 0x7d, 0xb7, 0x2a, 0xfe, 0x45, 0x63, 0xf6, + 0x11, 0xfd, 0x50, 0xbe, 0x24, 0x75, 0x1e, 0xd2, + 0xfb, 0x76, 0x55, 0xfc, 0x8a, 0xc7, 0xec, 0x23, + 0xfa, 0xa1, 0x06, 0xe1, 0xb8, 0xa0, 0x5d, 0xe5, + 0x1e, 0xd9, 0x53, 0xe3, 0x5a, 0x80, 0x77, 0x94, + 0x7b, 0x65, 0x01, 0x11, 0x60, 0xea, 0x41, 0x23, + 0x9d, 0x5b, 0x65, 0x13, 0xb6, 0xdf, 0xac, 0xae, + 0x0c, 0x18, 0x5a, 0x79, 0xaa, 0x10, 0x2b, 0x50, + 0xda, 0xeb, 0x6b, 0x94, 0x5f, 0x56, 0xec, 0x97, + 0x4f, 0x77, 0x2d, 0xbf, 0xc3, 0x5e, 0xb6, 0xcb, + 0x55, 0x8f, 0x9a, 0xff, 0x00, 0xee, 0x2a, 0xd2, + 0x0b, 0x1f, 0x56, 0xec, 0x97, 0x4f, 0x77, 0x2d, + 0xbf, 0xc3, 0x4e, 0xad, 0xd9, 0x2e, 0x9e, 0xee, + 0x5b, 0x7f, 0x86, 0xab, 0x88, 0x82, 0xc7, 0xd5, + 0xbb, 0x25, 0xd3, 0xdd, 0xcb, 0x6f, 0xf0, 0xd3, + 0xab, 0x76, 0x4b, 0xa7, 0xbb, 0x96, 0xdf, 0xe1, + 0xaa, 0xe2, 0x20, 0xb1, 0xf5, 0x6e, 0xc9, 0x74, + 0xf7, 0x72, 0xdb, 0xfc, 0x34, 0xea, 0xdd, 0x92, + 0xe9, 0xee, 0xe5, 0xb7, 0xf8, 0x6a, 0xb8, 0x88, + 0x2c, 0x7d, 0x5b, 0xb2, 0x5d, 0x3d, 0xdc, 0xb6, + 0xff, 0x00, 0x0d, 0x3a, 0xb7, 0x64, 0xba, 0x7b, + 0xb9, 0x6d, 0xfe, 0x1a, 0xae, 0x22, 0x0b, 0x1f, + 0x56, 0xec, 0x97, 0x4f, 0x77, 0x2d, 0xbf, 0xc3, + 0x4e, 0xad, 0xd9, 0x2e, 0x9e, 0xee, 0x5b, 0x7f, + 0x86, 0xab, 0x88, 0x82, 0xc7, 0xd5, 0xbb, 0x25, + 0xd3, 0xdd, 0xcb, 0x6f, 0xf0, 0xd3, 0xab, 0x76, + 0x4b, 0xa7, 0xbb, 0x96, 0xdf, 0xe1, 0xaa, 0xe2, + 0x01, 0x52, 0x00, 0x15, 0x27, 0x70, 0x20, 0xb1, + 0xf5, 0x6e, 0xc9, 0x74, 0xf7, 0x72, 0xdb, 0xfc, + 0x34, 0xea, 0xdd, 0x92, 0xe9, 0xee, 0xe5, 0xb7, + 0xf8, 0x6a, 0x0c, 0xd8, 0xde, 0xf4, 0x79, 0x69, + 0xe6, 0x39, 0x69, 0x73, 0x5c, 0xd7, 0x61, 0x70, + 0x2d, 0x76, 0xf1, 0xd0, 0x7b, 0xfa, 0x50, 0x58, + 0xba, 0xb7, 0x64, 0xba, 0x7b, 0xb9, 0x6d, 0xfe, + 0x1a, 0x75, 0x6e, 0xc9, 0x74, 0xf7, 0x72, 0xdb, + 0xfc, 0x35, 0x00, 0xdb, 0x6b, 0x97, 0xc7, 0xce, + 0xb6, 0x17, 0xb9, 0x9a, 0x4e, 0x20, 0xd7, 0x11, + 0x41, 0xd9, 0xa2, 0xd5, 0xbb, 0xbe, 0x82, 0xc9, + 0xd5, 0xbb, 0x25, 0xd3, 0xdd, 0xcb, 0x6f, 0xf0, + 0xd3, 0xab, 0x76, 0x4b, 0xa7, 0xbb, 0x96, 0xdf, + 0xe1, 0xa8, 0x03, 0x6d, 0x72, 0xd6, 0x73, 0xaf, + 0x85, 0xed, 0x8e, 0x9e, 0x59, 0x6b, 0x80, 0xd3, + 0xab, 0x4d, 0x29, 0xdf, 0x5e, 0x18, 0xc7, 0x48, + 0xe0, 0xd8, 0xda, 0x5e, 0xf3, 0xa9, 0xad, 0x04, + 0x93, 0xc0, 0x10, 0x58, 0xba, 0xb7, 0x64, 0xba, + 0x7b, 0xb9, 0x6d, 0xfe, 0x1a, 0x75, 0x6e, 0xc9, + 0x74, 0xf7, 0x72, 0xdb, 0xfc, 0x35, 0x5e, 0x92, + 0x29, 0x22, 0x7e, 0x09, 0x18, 0xe6, 0x38, 0x69, + 0xc2, 0xe0, 0x5a, 0x69, 0xdd, 0x5e, 0x50, 0x58, + 0xfa, 0xb7, 0x64, 0xba, 0x7b, 0xb9, 0x6d, 0xfe, + 0x1a, 0x75, 0x6e, 0xc9, 0x74, 0xf7, 0x72, 0xdb, + 0xfc, 0x35, 0x5d, 0x63, 0x1c, 0xf7, 0x61, 0x8d, + 0xa5, 0xce, 0x3a, 0x00, 0x02, 0xa5, 0x03, 0x5c, + 0xe7, 0x60, 0x0d, 0x38, 0xbe, 0x6e, 0xb3, 0xbd, + 0xa8, 0x20, 0xb1, 0x75, 0x6e, 0xc9, 0x74, 0xf7, + 0x72, 0xdb, 0xfc, 0x34, 0xea, 0xdd, 0x92, 0xe9, + 0xee, 0xe5, 0xb7, 0xf8, 0x6a, 0xbc, 0xf8, 0xe4, + 0x61, 0xc2, 0xf6, 0x39, 0x84, 0x6b, 0x0e, 0x05, + 0xa7, 0x80, 0xac, 0x35, 0xa5, 0xc7, 0x0b, 0x41, + 0x73, 0x8e, 0xa6, 0x81, 0x52, 0x82, 0xc5, 0xd5, + 0xbb, 0x25, 0xd3, 0xdd, 0xcb, 0x6f, 0xf0, 0xd3, + 0xab, 0x76, 0x4b, 0xa7, 0xbb, 0x96, 0xdf, 0xe1, + 0xaa, 0xf3, 0xe2, 0x92, 0x32, 0x04, 0x8d, 0x73, + 0x2b, 0xf3, 0xc1, 0x1e, 0x10, 0xbc, 0xa0, 0xb1, + 0xf5, 0x6e, 0xc9, 0x74, 0xf7, 0x72, 0xdb, 0xfc, + 0x34, 0xea, 0xdd, 0x92, 0xe9, 0xee, 0xe5, 0xb7, + 0xf8, 0x6a, 0xb8, 0x88, 0x2c, 0x7d, 0x5b, 0xb2, + 0x5d, 0x3d, 0xdc, 0xb6, 0xff, 0x00, 0x0d, 0x3a, + 0xb7, 0x64, 0xba, 0x7b, 0xb9, 0x6d, 0xfe, 0x1a, + 0xaf, 0x3e, 0x29, 0x58, 0x1a, 0x64, 0x63, 0x98, + 0x1d, 0xe4, 0x97, 0x02, 0x03, 0x86, 0xf8, 0x24, + 0x69, 0x58, 0x0d, 0x2e, 0x20, 0x34, 0x54, 0x9d, + 0x00, 0x0d, 0xd2, 0x74, 0x51, 0x05, 0x8b, 0xab, + 0x76, 0x4b, 0xa7, 0xbb, 0x96, 0xdf, 0xe1, 0xa7, + 0x56, 0xec, 0x97, 0x4f, 0x77, 0x2d, 0xbf, 0xc3, + 0x55, 0xd2, 0xd2, 0xd3, 0x85, 0xc0, 0x87, 0x0d, + 0x0e, 0x04, 0x52, 0x84, 0x2c, 0x20, 0xb1, 0xf5, + 0x6e, 0xc9, 0x74, 0xf7, 0x72, 0xdb, 0xfc, 0x34, + 0xea, 0xdd, 0x92, 0xe9, 0xee, 0xe5, 0xb7, 0xf8, + 0x6a, 0xb8, 0x88, 0x2c, 0x7d, 0x5b, 0xb2, 0x5d, + 0x3d, 0xdc, 0xb6, 0xff, 0x00, 0x0d, 0x3a, 0xb7, + 0x64, 0xba, 0x7b, 0xb9, 0x6d, 0xfe, 0x1a, 0xae, + 0x22, 0x0b, 0x1f, 0x56, 0xec, 0x97, 0x4f, 0x77, + 0x2d, 0xbf, 0xc3, 0x4e, 0xad, 0xd9, 0x2e, 0x9e, + 0xee, 0x5b, 0x7f, 0x86, 0xab, 0x88, 0x82, 0xc7, + 0xd5, 0xbb, 0x25, 0xd3, 0xdd, 0xcb, 0x6f, 0xf0, + 0xd3, 0xab, 0x76, 0x4b, 0xa7, 0xbb, 0x96, 0xdf, + 0xe1, 0xaa, 0xe2, 0x20, 0xb1, 0xf5, 0x6e, 0xc9, + 0x74, 0xf7, 0x72, 0xdb, 0xfc, 0x34, 0xea, 0xdd, + 0x92, 0xe9, 0xee, 0xe5, 0xb7, 0xf8, 0x6a, 0xb8, + 0x88, 0x2c, 0x7d, 0x5b, 0xb2, 0x5d, 0x3d, 0xdc, + 0xb6, 0xff, 0x00, 0x0d, 0x6e, 0xb3, 0xcb, 0xf6, + 0x61, 0x97, 0x70, 0xba, 0xde, 0xf5, 0xcf, 0x99, + 0xaf, 0x69, 0x8d, 0x98, 0x81, 0xab, 0x81, 0xd0, + 0x3c, 0x80, 0xaa, 0xcb, 0xab, 0x29, 0xfe, 0x69, + 0x69, 0xf6, 0xcc, 0xfa, 0xc1, 0x05, 0xa7, 0x36, + 0xf7, 0xd7, 0x79, 0xa3, 0xc0, 0xb8, 0xd7, 0x66, + 0x6d, 0xef, 0xae, 0xf3, 0x47, 0x81, 0x71, 0xa0, + 0x22, 0x20, 0x04, 0xe8, 0x00, 0x92, 0x75, 0x53, + 0x7d, 0x01, 0x17, 0x7c, 0x59, 0x60, 0x63, 0x39, + 0xdb, 0xc7, 0x88, 0xdb, 0xac, 0x81, 0xa3, 0x84, + 0x95, 0xe4, 0xdf, 0xe4, 0x71, 0x1a, 0x35, 0x86, + 0x4e, 0xc8, 0x04, 0xf8, 0x55, 0xa2, 0xb6, 0x9f, + 0xb6, 0x35, 0x52, 0xf9, 0x69, 0x49, 0xd2, 0xd6, + 0x88, 0xd5, 0xc5, 0xa3, 0x7d, 0x34, 0x6f, 0xae, + 0xde, 0xb4, 0xc9, 0xfd, 0x43, 0xb9, 0x29, 0xd6, + 0xb9, 0x3f, 0xa8, 0x77, 0x25, 0x4f, 0x6b, 0x27, + 0x4a, 0xbe, 0xa7, 0x0f, 0x5d, 0x5c, 0x5a, 0x37, + 0xd3, 0x46, 0xfa, 0xed, 0xeb, 0x5c, 0x9f, 0xd4, + 0x3b, 0x92, 0x9d, 0x6b, 0x93, 0xfa, 0x87, 0x72, + 0x53, 0xb5, 0x93, 0xa4, 0xf5, 0x38, 0x7a, 0xea, + 0xe2, 0xd1, 0xbe, 0x9a, 0x37, 0xd7, 0x6f, 0x5a, + 0xe4, 0xfe, 0xa1, 0xdc, 0x94, 0xeb, 0x5c, 0x9f, + 0xd4, 0x3b, 0x92, 0x9d, 0xac, 0x9d, 0x27, 0xa9, + 0xc3, 0xd7, 0x57, 0x16, 0x8d, 0xf4, 0xd1, 0xbe, + 0xbb, 0x7a, 0xd7, 0x27, 0xf5, 0x0e, 0xe4, 0xa7, + 0x5a, 0xe4, 0xfe, 0xa1, 0xdc, 0x94, 0xed, 0x64, + 0xe9, 0x3d, 0x4e, 0x1e, 0xba, 0xb8, 0xb4, 0x6f, + 0xa6, 0x8d, 0xf5, 0xdb, 0xd6, 0xb9, 0x3f, 0xa8, + 0x77, 0x25, 0x3a, 0xd7, 0x27, 0xf5, 0x0e, 0xe4, + 0xa7, 0x6b, 0x27, 0x49, 0xea, 0x70, 0xf5, 0xd5, + 0xc5, 0xa3, 0x7d, 0x34, 0x6f, 0xae, 0xde, 0xb5, + 0xc9, 0xfd, 0x43, 0xb9, 0x29, 0xd6, 0xb9, 0x3f, + 0xa8, 0x77, 0x25, 0x3b, 0x59, 0x3a, 0x4f, 0x53, + 0x87, 0xae, 0xae, 0x2d, 0x1b, 0xe9, 0xa3, 0x7d, + 0x76, 0xf5, 0xae, 0x4f, 0xea, 0x1d, 0xc9, 0x4e, + 0xb5, 0xc9, 0xfd, 0x43, 0xb9, 0x29, 0xda, 0xc9, + 0xd2, 0x7a, 0x9c, 0x3d, 0x75, 0x71, 0x68, 0xdf, + 0x4d, 0x1b, 0xeb, 0xb7, 0xad, 0x72, 0x7f, 0x50, + 0xee, 0x4a, 0x75, 0xae, 0x4f, 0xea, 0x1d, 0xc9, + 0x4e, 0xd6, 0x4e, 0x93, 0xd4, 0xe1, 0xeb, 0xab, + 0x8b, 0x46, 0xfa, 0x68, 0xdf, 0x5d, 0xbd, 0x6b, + 0x93, 0xfa, 0x87, 0x72, 0x53, 0xad, 0x72, 0x7f, + 0x50, 0xee, 0x4a, 0x76, 0xb2, 0x74, 0x9e, 0xa7, + 0x0f, 0x5d, 0x5c, 0x5a, 0x37, 0xd3, 0x46, 0xfa, + 0xed, 0xeb, 0x5c, 0x9f, 0xd4, 0x3b, 0x92, 0x9d, + 0x6b, 0x93, 0xfa, 0x87, 0x72, 0x53, 0xb5, 0x93, + 0xa4, 0xf5, 0x38, 0x7a, 0xea, 0xe2, 0xd1, 0xbe, + 0x9a, 0x37, 0xd7, 0x6f, 0x5a, 0xe4, 0xfe, 0xa1, + 0xdc, 0x94, 0xeb, 0x5c, 0x9f, 0xd4, 0x3b, 0x92, + 0x9d, 0xac, 0x9d, 0x27, 0xa9, 0xc3, 0xd7, 0x57, + 0x16, 0x8d, 0xf4, 0xd1, 0xbe, 0xbb, 0x7a, 0xd7, + 0x27, 0xf5, 0x0e, 0xe4, 0xa7, 0x5a, 0xe4, 0xfe, + 0xa1, 0xdc, 0x94, 0xed, 0x64, 0xe9, 0x3d, 0x4e, + 0x1e, 0xba, 0xb8, 0xb4, 0x6f, 0xa6, 0x8d, 0xf5, + 0xdb, 0xd6, 0xb9, 0x3f, 0xa8, 0x77, 0x25, 0x3a, + 0xd7, 0x27, 0xf5, 0x0e, 0xe4, 0xa7, 0x6b, 0x27, + 0x49, 0xea, 0x70, 0xf5, 0xd5, 0xc5, 0xa3, 0x7d, + 0x34, 0x6f, 0xae, 0xde, 0xb5, 0xc9, 0xfd, 0x43, + 0xb9, 0x29, 0xd6, 0xb9, 0x3f, 0xa8, 0x77, 0x25, + 0x3b, 0x59, 0x3a, 0x4f, 0x53, 0x87, 0xae, 0xae, + 0x2d, 0x1b, 0xe9, 0xa3, 0x7d, 0x76, 0xf5, 0xae, + 0x4f, 0xea, 0x1d, 0xc9, 0x4e, 0xb5, 0xc9, 0xfd, + 0x43, 0xb9, 0x29, 0xda, 0xc9, 0xd2, 0x7a, 0x9c, + 0x3d, 0x75, 0x71, 0x68, 0xdf, 0x4d, 0x1b, 0xeb, + 0xb7, 0xad, 0x72, 0x7f, 0x50, 0xee, 0x4a, 0x75, + 0xae, 0x4f, 0xea, 0x1d, 0xc9, 0x4e, 0xd6, 0x4e, + 0x93, 0xd4, 0xe1, 0xeb, 0xab, 0x8b, 0x46, 0xfa, + 0x68, 0xdf, 0x5d, 0xbd, 0x6b, 0x93, 0xfa, 0x87, + 0x72, 0x53, 0xad, 0x72, 0x7f, 0x50, 0xee, 0x4a, + 0x76, 0xb2, 0x74, 0x9e, 0xa7, 0x0f, 0x5d, 0x5c, + 0x5a, 0x37, 0xd3, 0x46, 0xfa, 0xed, 0xeb, 0x5c, + 0x9f, 0xd4, 0x3b, 0x92, 0x9d, 0x6b, 0x93, 0xfa, + 0x87, 0x72, 0x53, 0xb5, 0x93, 0xa4, 0xf5, 0x38, + 0x7a, 0xea, 0xe2, 0xd1, 0xbe, 0x9a, 0x37, 0xd7, + 0x6f, 0x5a, 0xe4, 0xfe, 0xa1, 0xdc, 0x94, 0xeb, + 0x5c, 0x9f, 0xd4, 0x3b, 0x92, 0x9d, 0xac, 0x9d, + 0x27, 0xa9, 0xc3, 0xd7, 0x57, 0x16, 0x8d, 0xf4, + 0xd1, 0xbe, 0xbb, 0x7a, 0xd7, 0x27, 0xf5, 0x0e, + 0xe4, 0xa7, 0x5a, 0xe4, 0xfe, 0xa1, 0xdc, 0x94, + 0xed, 0x64, 0xe9, 0x3d, 0x4e, 0x1e, 0xba, 0xb8, + 0xb4, 0x6f, 0xa6, 0x8d, 0xf5, 0xdb, 0xd6, 0xb9, + 0x3f, 0xa8, 0x77, 0x25, 0x3a, 0xd7, 0x27, 0xf5, + 0x07, 0x92, 0x9d, 0xac, 0x9d, 0x27, 0xa9, 0xc3, + 0xd7, 0x57, 0x16, 0x8d, 0xf5, 0x81, 0xa7, 0xb4, + 0xbb, 0xba, 0xcf, 0x25, 0x76, 0x83, 0x09, 0x68, + 0xdd, 0x38, 0x4f, 0xc8, 0xb6, 0x0b, 0x2b, 0x2b, + 0xa6, 0x17, 0xd8, 0xca, 0x2b, 0xac, 0x34, 0xe9, + 0x1c, 0x6a, 0x26, 0x97, 0x8f, 0x18, 0xd1, 0x6a, + 0xe6, 0xc7, 0x6e, 0x15, 0xbd, 0x66, 0x51, 0xc8, + 0xbd, 0x4b, 0x14, 0x91, 0x3c, 0xb2, 0x41, 0x85, + 0xc3, 0x71, 0x79, 0x55, 0x5f, 0x8f, 0xb5, 0xee, + 0xdf, 0xf6, 0xf1, 0xf9, 0xcd, 0xf0, 0xa9, 0xb5, + 0x09, 0x6f, 0xfb, 0x78, 0xfc, 0xe6, 0xf8, 0x54, + 0xda, 0x02, 0x8c, 0xcd, 0x7d, 0xea, 0xcb, 0xcf, + 0xf9, 0x42, 0x93, 0x51, 0x99, 0xaf, 0xbd, 0x59, + 0x79, 0xff, 0x00, 0x28, 0x40, 0xca, 0x7d, 0xea, + 0xf3, 0xcf, 0x3f, 0x58, 0xa9, 0x35, 0x19, 0x94, + 0xfb, 0xd5, 0xe7, 0x9e, 0x7e, 0xb1, 0x52, 0x68, + 0x08, 0x88, 0x83, 0x6c, 0x3f, 0x9c, 0xa9, 0xf3, + 0x6c, 0x56, 0xc6, 0x49, 0x34, 0x8f, 0x93, 0x31, + 0x7b, 0x5e, 0xe7, 0x12, 0xe6, 0xfb, 0x44, 0x22, + 0x84, 0x9a, 0x9f, 0xcc, 0x57, 0x08, 0x77, 0x57, + 0xc3, 0x2f, 0x5a, 0xdf, 0x6d, 0xb8, 0xd0, 0x3f, + 0x6a, 0xff, 0x00, 0xac, 0x50, 0x7d, 0x03, 0xe0, + 0x7d, 0x89, 0xfb, 0xcd, 0xff, 0x00, 0xfb, 0x10, + 0xfa, 0x09, 0xf0, 0x3e, 0xc4, 0xfd, 0xe6, 0xff, + 0x00, 0xfd, 0x88, 0x7d, 0x05, 0xf3, 0x8c, 0x2d, + 0xde, 0x09, 0x85, 0xbb, 0xc1, 0x07, 0xd1, 0xfe, + 0x07, 0xd8, 0x9f, 0xbc, 0xdf, 0xff, 0x00, 0xb1, + 0x0f, 0xa0, 0x9f, 0x03, 0xec, 0x4f, 0xde, 0x6f, + 0xff, 0x00, 0xd8, 0x87, 0xd0, 0x5f, 0x38, 0xc2, + 0xdd, 0xe0, 0xb3, 0x84, 0x6f, 0x77, 0x90, 0x7d, + 0x1b, 0xe0, 0x7d, 0x89, 0xfb, 0xcd, 0xff, 0x00, + 0xfb, 0x10, 0xfa, 0x09, 0xf0, 0x3e, 0xc4, 0xfd, + 0xe6, 0xff, 0x00, 0xfd, 0x88, 0x7d, 0x05, 0xf3, + 0x9c, 0x2d, 0xde, 0x0b, 0x18, 0x5b, 0xae, 0x82, + 0x88, 0x3e, 0x8f, 0xf0, 0x3e, 0xc4, 0xfd, 0xe6, + 0xff, 0x00, 0xfd, 0x88, 0x7d, 0x04, 0xf8, 0x1f, + 0x62, 0x7e, 0xf3, 0x7f, 0xfe, 0xc4, 0x3e, 0x82, + 0xf9, 0xc6, 0x16, 0xef, 0x04, 0xc2, 0xdd, 0xe0, + 0x83, 0xe8, 0xff, 0x00, 0x03, 0xec, 0x4f, 0xde, + 0x6f, 0xff, 0x00, 0xd8, 0x87, 0xd0, 0x4f, 0x81, + 0xf6, 0x27, 0xef, 0x37, 0xff, 0x00, 0xec, 0x43, + 0xe8, 0x2f, 0x9c, 0x61, 0x6e, 0xf0, 0x4c, 0x2d, + 0xde, 0x08, 0x3e, 0x8f, 0xf0, 0x3e, 0xc4, 0xfd, + 0xe6, 0xff, 0x00, 0xfd, 0x88, 0x7d, 0x04, 0xf8, + 0x1f, 0x62, 0x7e, 0xf3, 0x7f, 0xfe, 0xc4, 0x3e, + 0x82, 0xf9, 0xce, 0x10, 0x74, 0x81, 0xa3, 0xb4, + 0xb1, 0x85, 0xbb, 0xc1, 0x07, 0xd1, 0xfe, 0x07, + 0xd8, 0x9f, 0xbc, 0xdf, 0xff, 0x00, 0xb1, 0x0f, + 0xa0, 0x9f, 0x04, 0x6c, 0x4f, 0xde, 0x4e, 0x3f, + 0xff, 0x00, 0x93, 0x0f, 0xa0, 0xbe, 0x71, 0x85, + 0xbb, 0xc1, 0x30, 0xb7, 0x78, 0x7e, 0x54, 0x41, + 0xf4, 0xc6, 0xfe, 0x1e, 0x6c, 0xab, 0xa1, 0xf6, + 0x86, 0xdd, 0xce, 0x60, 0x1a, 0xe5, 0x13, 0x44, + 0x59, 0xca, 0xe6, 0xe8, 0xb5, 0x7c, 0x11, 0xb1, + 0x3f, 0x79, 0x3b, 0xff, 0x00, 0x62, 0x1f, 0x41, + 0x6b, 0xcb, 0xc0, 0xff, 0x00, 0x6c, 0x27, 0xf3, + 0x24, 0xff, 0x00, 0xa8, 0xbe, 0x7b, 0x85, 0xbb, + 0xc1, 0x07, 0xd1, 0xbe, 0x07, 0xd8, 0x9f, 0xbc, + 0xdf, 0xff, 0x00, 0xb1, 0x0f, 0xa0, 0x9f, 0x03, + 0xec, 0x4f, 0xde, 0x6f, 0xff, 0x00, 0xd8, 0x87, + 0xd0, 0x5f, 0x38, 0xc2, 0xdd, 0xe0, 0x98, 0x5b, + 0xbc, 0x10, 0x7d, 0x1f, 0xe0, 0x7d, 0x89, 0xfb, + 0xcd, 0xff, 0x00, 0xfb, 0x10, 0xfa, 0x09, 0xf0, + 0x3e, 0xc4, 0xfd, 0xe4, 0xff, 0x00, 0xfd, 0x88, + 0x7d, 0x05, 0xf3, 0x9c, 0x23, 0x79, 0x74, 0x59, + 0xe5, 0x97, 0xb7, 0xc1, 0xc6, 0xca, 0xd9, 0xf7, + 0x18, 0x3c, 0xbe, 0x6d, 0xb5, 0xa5, 0x77, 0xd0, + 0x5f, 0xbe, 0x07, 0xd8, 0x9f, 0xbc, 0xdf, 0xff, + 0x00, 0xb1, 0x0f, 0xa0, 0x9f, 0x03, 0xec, 0x4f, + 0xde, 0x6f, 0xff, 0x00, 0xd8, 0x87, 0xd0, 0x54, + 0x93, 0xb3, 0x79, 0xe8, 0x15, 0x39, 0x74, 0xf4, + 0xf3, 0x0a, 0xd3, 0x2e, 0x4f, 0x99, 0x41, 0x3c, + 0x76, 0xd3, 0xda, 0xc9, 0x1c, 0xf3, 0x7e, 0xca, + 0x27, 0x30, 0x82, 0xef, 0x37, 0x7d, 0x05, 0xf3, + 0xe0, 0x7d, 0x89, 0xfb, 0xcd, 0xff, 0x00, 0xfb, + 0x10, 0xfa, 0x09, 0xf0, 0x3e, 0xc4, 0xfd, 0xe6, + 0xff, 0x00, 0xfd, 0x88, 0x7d, 0x05, 0x49, 0xf8, + 0x6f, 0x3e, 0xfb, 0xba, 0x7e, 0x42, 0x3b, 0x67, + 0x33, 0xd6, 0x82, 0x4e, 0x5d, 0x38, 0x00, 0x12, + 0x4e, 0x02, 0x28, 0x06, 0xba, 0xa0, 0xbb, 0x7c, + 0x0f, 0xb1, 0x3f, 0x79, 0xbf, 0xff, 0x00, 0x62, + 0x1f, 0x41, 0x3e, 0x07, 0xd8, 0x9f, 0xbc, 0xdf, + 0xff, 0x00, 0xb1, 0x0f, 0xa0, 0xa8, 0x56, 0xf9, + 0x4d, 0xfd, 0xcd, 0xbb, 0xae, 0x6d, 0xed, 0x64, + 0x96, 0x06, 0x57, 0x14, 0xac, 0x69, 0x2d, 0x18, + 0x75, 0xe9, 0x5c, 0xb4, 0x69, 0xd3, 0x40, 0x83, + 0xeb, 0xf6, 0xb6, 0x3b, 0x39, 0x6d, 0x91, 0xc9, + 0x91, 0xc7, 0x7e, 0xcf, 0x64, 0x95, 0xb2, 0x30, + 0xb8, 0xcd, 0x1e, 0x3a, 0x4b, 0x52, 0xea, 0x1d, + 0x5b, 0xbb, 0xca, 0x1f, 0xe0, 0x7d, 0x89, 0xfb, + 0xcd, 0xff, 0x00, 0xfb, 0x10, 0xfa, 0x0a, 0x83, + 0x6f, 0x96, 0x5f, 0x5d, 0x42, 0xf9, 0xed, 0xad, + 0x5f, 0x34, 0x31, 0x12, 0x24, 0x7b, 0x5b, 0x56, + 0x82, 0x05, 0x4d, 0x4a, 0xe6, 0x0d, 0x1a, 0xe8, + 0x3b, 0x28, 0x3e, 0x8f, 0xf0, 0x3e, 0xc4, 0xfd, + 0xe6, 0xff, 0x00, 0xfd, 0x88, 0x7d, 0x04, 0xf8, + 0x1f, 0x62, 0x7e, 0xf3, 0x7f, 0xfe, 0xc4, 0x3e, + 0x82, 0xf9, 0xc6, 0x16, 0xef, 0x04, 0xc2, 0xdd, + 0xe0, 0x83, 0xe8, 0xff, 0x00, 0x03, 0xec, 0x4f, + 0xde, 0x6f, 0xff, 0x00, 0xd8, 0x87, 0xd0, 0x5e, + 0xe2, 0xd8, 0x2d, 0x8f, 0x9a, 0x41, 0x1c, 0x17, + 0xf2, 0xcb, 0x21, 0xd2, 0x18, 0xc9, 0xe1, 0x73, + 0xa9, 0xe6, 0x86, 0x15, 0xf3, 0x5c, 0x2d, 0xde, + 0x0a, 0xc5, 0xf8, 0x7c, 0x00, 0xda, 0xcb, 0x4a, + 0x0f, 0xcd, 0x9b, 0xfe, 0x9b, 0x90, 0x59, 0xe5, + 0xd8, 0x3d, 0x8f, 0x81, 0xe6, 0x39, 0xef, 0xe4, + 0x8a, 0x40, 0x34, 0xb1, 0xf3, 0xc4, 0xd7, 0x00, + 0x77, 0x68, 0xe6, 0x6e, 0xaf, 0x3f, 0x03, 0xec, + 0x4f, 0xde, 0x6f, 0xff, 0x00, 0xd8, 0x87, 0xd0, + 0x55, 0xcf, 0xc4, 0x10, 0x0e, 0xd5, 0x5d, 0x54, + 0x7e, 0x64, 0x3f, 0xf4, 0xda, 0xab, 0x78, 0x5b, + 0xbc, 0x10, 0x7d, 0x1f, 0xe0, 0x7d, 0x89, 0xfb, + 0xcd, 0xff, 0x00, 0xfb, 0x10, 0xfa, 0x09, 0xf0, + 0x3e, 0xc4, 0xfd, 0xe6, 0xff, 0x00, 0xfd, 0x88, + 0x7d, 0x05, 0xf3, 0x9c, 0x23, 0x7b, 0xbc, 0xb1, + 0x85, 0xbb, 0xc1, 0x07, 0xd1, 0xfe, 0x07, 0xd8, + 0x9f, 0xbc, 0xdf, 0xff, 0x00, 0xb1, 0x0f, 0xa0, + 0x9f, 0x03, 0xec, 0x4f, 0xde, 0x6f, 0xff, 0x00, + 0xd8, 0x87, 0xd0, 0x5f, 0x38, 0xc2, 0xdd, 0xe0, + 0xb3, 0x85, 0xb5, 0xa5, 0x05, 0x77, 0x90, 0x7d, + 0x1b, 0xe0, 0x7d, 0x89, 0xfb, 0xcd, 0xff, 0x00, + 0xfb, 0x10, 0xfa, 0x09, 0xf0, 0x3e, 0xc4, 0xfd, + 0xe6, 0xff, 0x00, 0xfd, 0x88, 0x7d, 0x05, 0xf3, + 0x8c, 0x2d, 0xde, 0x09, 0x85, 0xa7, 0x50, 0x08, + 0x3e, 0x8f, 0xf0, 0x3e, 0xc4, 0xfd, 0xe6, 0xff, + 0x00, 0xfd, 0x88, 0x7d, 0x04, 0xf8, 0x1f, 0x62, + 0x7e, 0xf3, 0x7f, 0xfe, 0xc4, 0x3e, 0x82, 0xf9, + 0xce, 0x16, 0xeb, 0xa0, 0xa2, 0xc6, 0x16, 0xef, + 0x04, 0x1f, 0x47, 0xf8, 0x1f, 0x62, 0x7e, 0xf3, + 0x7f, 0xfe, 0xc4, 0x3e, 0x82, 0x7c, 0x0f, 0xb1, + 0x3f, 0x79, 0xbf, 0xff, 0x00, 0x62, 0x1f, 0x41, + 0x7c, 0xe3, 0x0b, 0x77, 0x82, 0x61, 0x6e, 0xf0, + 0x41, 0xf4, 0x7f, 0x81, 0xf6, 0x27, 0xef, 0x37, + 0xff, 0x00, 0xec, 0x43, 0xe8, 0x27, 0xc0, 0xfb, + 0x13, 0xf7, 0x9b, 0xff, 0x00, 0xf6, 0x21, 0xf4, + 0x17, 0xce, 0x70, 0xb7, 0x78, 0x2c, 0x61, 0x6e, + 0xf0, 0x41, 0xf4, 0x63, 0xb1, 0x1b, 0x13, 0xf7, + 0x93, 0xb4, 0xe8, 0xf7, 0x88, 0x7d, 0x05, 0x6f, + 0xb5, 0x8e, 0xde, 0x3c, 0xba, 0x28, 0xad, 0x9e, + 0x25, 0x82, 0x26, 0x06, 0x46, 0xf0, 0xe0, 0xea, + 0x86, 0xf8, 0xbe, 0x53, 0x74, 0x15, 0xf0, 0xac, + 0x2d, 0xde, 0x0b, 0xec, 0x3b, 0x1b, 0xfe, 0x93, + 0xb1, 0xf3, 0x0f, 0xd7, 0x72, 0x09, 0x41, 0xb8, + 0xa0, 0x5d, 0xe5, 0x1e, 0xd9, 0x53, 0xe1, 0x40, + 0x3b, 0xca, 0x3d, 0xb2, 0x80, 0xb0, 0x75, 0x2c, + 0xac, 0x1d, 0x48, 0x31, 0xb6, 0x5a, 0xac, 0x7c, + 0xd7, 0xff, 0x00, 0x71, 0x56, 0x95, 0x97, 0x6c, + 0xb5, 0x58, 0xf9, 0xaf, 0xfe, 0xe2, 0xad, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0xf7, 0x07, 0xed, + 0xe3, 0xf3, 0xdb, 0xe1, 0x5e, 0x17, 0xb8, 0x7f, + 0x6d, 0x1f, 0x9e, 0xdf, 0x0a, 0x0b, 0x1e, 0xd1, + 0x66, 0xf9, 0x8d, 0x8e, 0x62, 0x21, 0xb6, 0x9c, + 0xc7, 0x1f, 0x34, 0xd7, 0x61, 0xa3, 0x48, 0xad, + 0x5d, 0xbe, 0x17, 0x8b, 0xb7, 0xb3, 0x38, 0xc8, + 0x9d, 0x7d, 0x23, 0x1a, 0xdb, 0xbb, 0x47, 0x0c, + 0x6f, 0x6d, 0x05, 0x46, 0x8a, 0xea, 0xdf, 0x5c, + 0xdb, 0x5f, 0xfc, 0xd8, 0x7d, 0x83, 0x3c, 0x2f, + 0x5b, 0x32, 0x7a, 0x7c, 0x3d, 0x9a, 0x93, 0xab, + 0xfa, 0x10, 0x4a, 0xe4, 0x52, 0xb1, 0x99, 0x35, + 0x9c, 0x4f, 0x15, 0x6d, 0xc3, 0x9d, 0x11, 0xaf, + 0x67, 0x11, 0x0a, 0xa9, 0xec, 0x72, 0x7b, 0x77, + 0xb0, 0x9f, 0x2c, 0x4a, 0x22, 0x3c, 0x38, 0x6a, + 0xa6, 0xc4, 0xe6, 0xdf, 0x67, 0x2c, 0x27, 0x1f, + 0xf0, 0xae, 0x43, 0xa9, 0xbf, 0x47, 0x3a, 0xa3, + 0x81, 0x6f, 0xf6, 0x11, 0xf1, 0x60, 0x98, 0xd3, + 0x99, 0x0c, 0xf6, 0xac, 0x5b, 0x9e, 0x4e, 0x0f, + 0x0e, 0x94, 0x1d, 0x79, 0xec, 0x8c, 0x76, 0x4f, + 0x79, 0x14, 0x62, 0x8d, 0xb7, 0x73, 0x23, 0xfa, + 0xa7, 0xfb, 0xca, 0x13, 0x65, 0xe2, 0x68, 0xbc, + 0x9a, 0xf6, 0x41, 0xe2, 0x5a, 0x44, 0x5f, 0xdd, + 0x3f, 0xd0, 0xba, 0x4c, 0xee, 0xb8, 0xd9, 0xcc, + 0xc6, 0x77, 0x6b, 0x92, 0xe0, 0xbb, 0x85, 0xcd, + 0x5e, 0x6c, 0xad, 0xae, 0x23, 0xd9, 0x89, 0x9d, + 0x04, 0x6e, 0x92, 0x6b, 0xd7, 0xe1, 0xa3, 0x45, + 0x7c, 0x46, 0xeb, 0xf0, 0x10, 0x83, 0x5e, 0xd3, + 0x52, 0xe2, 0x3b, 0x2c, 0xc9, 0x83, 0xde, 0x23, + 0xc2, 0xee, 0xd8, 0x15, 0x2a, 0x09, 0x58, 0x9d, + 0x6b, 0x72, 0xfd, 0x97, 0x7c, 0x57, 0x11, 0xb9, + 0x92, 0x59, 0xc9, 0x8d, 0xa1, 0xc3, 0x4e, 0x03, + 0xff, 0x00, 0xf3, 0x2a, 0xea, 0x09, 0x4c, 0xaa, + 0x3f, 0x66, 0xcb, 0xee, 0xf3, 0x37, 0x68, 0x92, + 0x30, 0x21, 0xb7, 0x77, 0xf8, 0x8f, 0xf2, 0x9c, + 0x3b, 0x21, 0x6e, 0xb1, 0xbe, 0xb7, 0xcb, 0xb2, + 0x79, 0x25, 0xb6, 0x73, 0x0e, 0x63, 0x34, 0x94, + 0xd3, 0xa5, 0xcd, 0x6d, 0x75, 0xea, 0x59, 0xb9, + 0x6f, 0x35, 0xb2, 0x96, 0xad, 0x6e, 0xa9, 0xa6, + 0x2f, 0x3d, 0xc2, 0xe0, 0xa1, 0xe0, 0x74, 0x2c, + 0x99, 0x8e, 0x9d, 0xa5, 0xf1, 0x03, 0xe3, 0xb4, + 0x1a, 0x12, 0x37, 0x82, 0x09, 0xf8, 0x6e, 0x65, + 0xcd, 0xf2, 0x3b, 0xd3, 0x7b, 0x49, 0x25, 0xb4, + 0xa3, 0xa2, 0x96, 0x80, 0x3b, 0x48, 0xc5, 0xb8, + 0xb5, 0xe5, 0xf7, 0x10, 0xe5, 0x99, 0x23, 0xef, + 0x21, 0x2c, 0x75, 0xec, 0xf2, 0x61, 0x1a, 0x5a, + 0xe7, 0x35, 0xbb, 0x84, 0x35, 0x6e, 0x26, 0xde, + 0xfb, 0x26, 0x9e, 0x0c, 0x9c, 0x7b, 0x28, 0x84, + 0xe3, 0x9e, 0xdd, 0xc2, 0xae, 0x73, 0x77, 0xf1, + 0x54, 0xaa, 0xfd, 0xb5, 0xb4, 0xf7, 0x52, 0xb6, + 0x0b, 0x76, 0x17, 0x48, 0xff, 0x00, 0x24, 0x76, + 0x0a, 0x0b, 0x05, 0x85, 0xe4, 0x99, 0xd6, 0x5f, + 0x7b, 0x6f, 0x7d, 0x86, 0x47, 0xc3, 0x1f, 0x39, + 0x14, 0xc0, 0x00, 0x46, 0x83, 0xbc, 0x06, 0xf2, + 0xad, 0xa9, 0xfb, 0x97, 0xdb, 0xe4, 0xb6, 0x12, + 0x58, 0x40, 0xe1, 0x2d, 0xf5, 0xc8, 0xa4, 0xef, + 0x6e, 0x90, 0xc6, 0xef, 0x28, 0x01, 0xa9, 0x07, + 0x65, 0x86, 0x57, 0x77, 0x98, 0x62, 0x30, 0x80, + 0xd8, 0xe3, 0xf2, 0xe5, 0x79, 0x0d, 0x68, 0xee, + 0xaf, 0x57, 0xf9, 0x3d, 0xdd, 0x8c, 0x6d, 0x96, + 0x42, 0xc9, 0x20, 0x7e, 0x81, 0x34, 0x47, 0x13, + 0x6a, 0xbb, 0xe7, 0xfd, 0x46, 0xc9, 0x40, 0x19, + 0xa3, 0xda, 0x66, 0xab, 0xce, 0xfd, 0x09, 0xd1, + 0xf4, 0x54, 0x6b, 0x33, 0x29, 0xe3, 0xcb, 0xa5, + 0xcb, 0xf0, 0xb5, 0xf0, 0xc8, 0x43, 0xea, 0x75, + 0x82, 0x29, 0xe4, 0xa0, 0x9b, 0xcc, 0xf2, 0xeb, + 0xab, 0xfb, 0x6c, 0xb5, 0xb0, 0xb5, 0xad, 0x6b, + 0x2d, 0xda, 0x64, 0x91, 0xee, 0xa3, 0x1b, 0x50, + 0xdd, 0xdd, 0xf2, 0xa1, 0xef, 0xf2, 0xdb, 0xdc, + 0xaa, 0x48, 0xe5, 0x79, 0x06, 0xa7, 0x14, 0x32, + 0xb0, 0xd4, 0x54, 0x76, 0x54, 0x8e, 0xd1, 0x49, + 0x27, 0x57, 0xe5, 0x91, 0x57, 0xc4, 0x30, 0xb5, + 0xc5, 0xbb, 0xee, 0xc2, 0x17, 0x9b, 0xe2, 0xe7, + 0xec, 0xad, 0x91, 0x26, 0xa4, 0x4a, 0x45, 0x79, + 0x48, 0x39, 0xf3, 0xe8, 0x58, 0xe7, 0x5b, 0xe6, + 0x31, 0x8a, 0x32, 0xf6, 0x3c, 0x4f, 0x03, 0x50, + 0x91, 0xba, 0x1f, 0x45, 0x14, 0xa6, 0xe7, 0xa4, + 0xbb, 0x29, 0x6c, 0xf3, 0xe5, 0x41, 0x70, 0x58, + 0xde, 0xe9, 0x77, 0x1a, 0x84, 0xd1, 0xb9, 0xa9, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x17, 0x56, 0x55, + 0xfc, 0xd2, 0xd3, 0xed, 0x99, 0xf5, 0x82, 0xe5, + 0x5d, 0x59, 0x57, 0xf3, 0x4b, 0x4f, 0xb6, 0x67, + 0xd6, 0x08, 0x2d, 0x39, 0xb7, 0xbe, 0xbb, 0xcd, + 0x0b, 0x8d, 0x76, 0x66, 0xde, 0xfa, 0xef, 0x34, + 0x78, 0x17, 0x1a, 0x02, 0x90, 0xb4, 0x6c, 0x56, + 0x76, 0xae, 0xbf, 0xb8, 0xdc, 0x15, 0x67, 0xf4, + 0x2e, 0x06, 0x33, 0x1b, 0xda, 0xcf, 0x9c, 0x69, + 0xc2, 0xb6, 0x6d, 0x2c, 0xe5, 0x86, 0x0b, 0x56, + 0xea, 0x6b, 0x43, 0x8f, 0xd5, 0x56, 0xa5, 0x77, + 0x5a, 0x23, 0xd8, 0xe5, 0x9f, 0x2f, 0x6f, 0x1d, + 0xaf, 0x1e, 0xce, 0x1f, 0x34, 0x7d, 0xe6, 0x61, + 0x3d, 0xe4, 0x98, 0xe5, 0xd0, 0x2b, 0x50, 0xca, + 0xd4, 0x05, 0xcf, 0x89, 0x6b, 0xad, 0x34, 0x26, + 0x25, 0xbe, 0x22, 0x23, 0x84, 0x7b, 0x1e, 0x2d, + 0xa6, 0x6d, 0x3a, 0xdb, 0x8c, 0xb6, 0x55, 0x2a, + 0xb5, 0xe2, 0x4c, 0x4a, 0x55, 0xd2, 0x39, 0x36, + 0x55, 0x2a, 0xb5, 0xe2, 0x4c, 0x4a, 0x35, 0x26, + 0x23, 0x93, 0x65, 0x52, 0xab, 0xc0, 0x2e, 0x24, + 0x06, 0x8a, 0xb8, 0x9a, 0x01, 0xbe, 0xa4, 0xa1, + 0xd9, 0xec, 0xc2, 0x56, 0x62, 0x38, 0x63, 0xae, + 0x9a, 0x38, 0x9a, 0xa8, 0xb6, 0x48, 0x8f, 0xb9, + 0x6a, 0x61, 0xb5, 0xfe, 0xca, 0xea, 0xe0, 0xaa, + 0x55, 0x6f, 0xbd, 0xcb, 0x2f, 0x2c, 0x9b, 0x8e, + 0x66, 0x82, 0xcf, 0x9c, 0xd3, 0x51, 0xdd, 0x5c, + 0x95, 0x53, 0x16, 0xdd, 0xe0, 0x8b, 0x52, 0x6b, + 0x3a, 0x5a, 0xbb, 0x65, 0xb2, 0xa9, 0x55, 0xae, + 0xa9, 0x89, 0x4a, 0x34, 0x8e, 0x4d, 0x95, 0x4a, + 0xad, 0x78, 0x93, 0x17, 0xf4, 0xa8, 0xd7, 0x43, + 0x6c, 0x4b, 0x65, 0x52, 0xab, 0x64, 0x96, 0x37, + 0xd1, 0xc4, 0x66, 0x7c, 0x2f, 0x63, 0x00, 0xae, + 0x2d, 0x14, 0xa2, 0xe7, 0xc5, 0xdf, 0x48, 0x9d, + 0x7c, 0x24, 0x9c, 0x7a, 0x78, 0xc3, 0x65, 0x52, + 0xab, 0x5e, 0x2d, 0xf4, 0xaa, 0x93, 0x48, 0x6c, + 0xaa, 0x55, 0x6b, 0xaa, 0x62, 0x08, 0x69, 0x1c, + 0x9b, 0x2a, 0x95, 0x5a, 0xf1, 0x26, 0x24, 0x34, + 0x8e, 0x4d, 0x95, 0x4a, 0xaf, 0x0c, 0x0e, 0x91, + 0xed, 0x8d, 0xbe, 0x53, 0xc8, 0x02, 0xb4, 0xd6, + 0x54, 0x8f, 0xc3, 0xf9, 0xa5, 0x3c, 0x96, 0x1a, + 0x6a, 0xf1, 0xfe, 0x4a, 0x2a, 0xce, 0x48, 0xaf, + 0x09, 0x95, 0xeb, 0x8a, 0xf7, 0x8d, 0x6b, 0x5d, + 0x74, 0x70, 0xd5, 0x2a, 0xbc, 0x12, 0x5a, 0xe2, + 0xc2, 0x34, 0x83, 0x42, 0x37, 0xf4, 0xd3, 0xc2, + 0xa4, 0x46, 0xcf, 0xe6, 0x84, 0x03, 0x85, 0x9a, + 0x74, 0x8f, 0x19, 0x2d, 0x7a, 0x47, 0x19, 0x9f, + 0x14, 0x53, 0x0d, 0xef, 0xae, 0xda, 0x71, 0x8f, + 0x17, 0x0d, 0x52, 0xab, 0x13, 0x46, 0xf8, 0x25, + 0x7c, 0x2f, 0xa0, 0x7c, 0x67, 0x0b, 0x80, 0xd5, + 0x5d, 0xd5, 0xe3, 0x12, 0x98, 0x44, 0xd3, 0x49, + 0xd2, 0x6b, 0xa3, 0x65, 0x52, 0xab, 0x5e, 0x2d, + 0xc4, 0xaa, 0x94, 0x69, 0x1c, 0x9b, 0x2a, 0x95, + 0x5b, 0xac, 0xac, 0x2e, 0xaf, 0x43, 0xcd, 0xb8, + 0x6b, 0x84, 0x64, 0x07, 0x54, 0xd3, 0x5f, 0xff, + 0x00, 0x0b, 0x44, 0xf1, 0xbe, 0x09, 0x9f, 0x0c, + 0x94, 0x0f, 0x8c, 0xe1, 0x75, 0x0d, 0x74, 0xa8, + 0x8b, 0x57, 0x5d, 0x3d, 0xa9, 0xed, 0xce, 0xd8, + 0xb6, 0xcf, 0xa6, 0x7c, 0x25, 0x9a, 0xa5, 0x56, + 0xba, 0xa6, 0x25, 0x28, 0xd2, 0x39, 0x36, 0x55, + 0x2a, 0xba, 0x63, 0xca, 0xaf, 0xa5, 0xb6, 0xf6, + 0xa6, 0x35, 0xbc, 0xd1, 0x69, 0x75, 0x71, 0x69, + 0xa0, 0xd6, 0xb8, 0xb1, 0x28, 0x8b, 0x56, 0xde, + 0x13, 0xe0, 0x9b, 0x63, 0x9a, 0xe9, 0xba, 0x9a, + 0x6b, 0xe0, 0xd9, 0x54, 0xaa, 0xd7, 0x89, 0x31, + 0x29, 0x46, 0x91, 0xc9, 0xb2, 0xa9, 0x55, 0xaf, + 0x12, 0x62, 0x43, 0x48, 0xe4, 0xd9, 0x54, 0xaa, + 0xd7, 0x89, 0x31, 0x21, 0xa4, 0x72, 0x6c, 0xaa, + 0x55, 0x6b, 0xc4, 0x98, 0x90, 0xd2, 0x39, 0x36, + 0xe2, 0x5e, 0xa3, 0x9e, 0x48, 0x9e, 0x25, 0x8d, + 0xc5, 0xaf, 0x6e, 0xa7, 0x05, 0xa3, 0x12, 0x62, + 0x4e, 0x1c, 0x75, 0x23, 0x58, 0x98, 0x9a, 0xf0, + 0x98, 0x59, 0xad, 0xae, 0x23, 0xcd, 0xed, 0x08, + 0x78, 0x0d, 0xba, 0x88, 0x7e, 0x5d, 0xc5, 0xc0, + 0x41, 0x06, 0x84, 0x10, 0x46, 0x82, 0x0e, 0xb5, + 0xcb, 0x93, 0x5c, 0x98, 0x33, 0x18, 0x8d, 0x7c, + 0x57, 0x9c, 0x0e, 0x1e, 0x76, 0x81, 0xdf, 0x52, + 0x99, 0x9c, 0x61, 0x97, 0x8f, 0xa6, 0xa7, 0xd1, + 0xdf, 0x27, 0xc8, 0xb0, 0xe6, 0xa4, 0x52, 0xdc, + 0x3c, 0x25, 0xec, 0xf9, 0x4c, 0xb3, 0x93, 0x17, + 0x1f, 0x18, 0x96, 0x8b, 0x7f, 0xdb, 0xc7, 0xe7, + 0x37, 0xc2, 0xa6, 0xd4, 0x25, 0xbf, 0xed, 0xe3, + 0xf3, 0x9b, 0xe1, 0x53, 0x6b, 0x9b, 0x40, 0xa3, + 0x33, 0x5f, 0x7a, 0xb2, 0xf3, 0xfe, 0x50, 0xa4, + 0xd4, 0x66, 0x6b, 0xef, 0x56, 0x5e, 0x7f, 0xca, + 0x10, 0x32, 0x9f, 0x7a, 0xbc, 0xf3, 0xcf, 0xd6, + 0x2a, 0x4d, 0x46, 0x65, 0x3e, 0xf5, 0x79, 0xe7, + 0x9f, 0xac, 0x54, 0x9a, 0x02, 0x22, 0x20, 0xdb, + 0x06, 0xea, 0xf8, 0x65, 0xef, 0xbe, 0xdc, 0x7d, + 0xab, 0xfe, 0xb1, 0x5f, 0x73, 0x83, 0x75, 0x7c, + 0x32, 0xf7, 0xdf, 0x6e, 0x3e, 0xd5, 0xff, 0x00, + 0x58, 0xa0, 0xd2, 0x88, 0x88, 0x27, 0x76, 0x2a, + 0xc6, 0xd2, 0xff, 0x00, 0x68, 0x21, 0xb6, 0xbc, + 0x88, 0x4d, 0x09, 0x64, 0x84, 0xc6, 0xed, 0x55, + 0x03, 0x5d, 0x42, 0xc6, 0xd8, 0x64, 0x63, 0x25, + 0xcd, 0xdf, 0x1c, 0x2d, 0xc3, 0x67, 0x70, 0x39, + 0xeb, 0x7a, 0x6a, 0xa1, 0x3e, 0x33, 0x6b, 0xfd, + 0x52, 0xba, 0x7f, 0x0f, 0x7f, 0xd4, 0xf0, 0xfd, + 0x9c, 0xbe, 0x05, 0x28, 0xcf, 0xfe, 0xcf, 0x90, + 0xde, 0xe5, 0x6f, 0x38, 0xb3, 0x3c, 0xa6, 0x69, + 0x24, 0xb5, 0x27, 0x5b, 0xe3, 0xc4, 0xed, 0x03, + 0xb1, 0x4d, 0x1c, 0x08, 0x22, 0x32, 0x1c, 0xbe, + 0xce, 0xe7, 0x67, 0xb3, 0xcb, 0x99, 0xe2, 0x6c, + 0x93, 0xda, 0xb0, 0x18, 0x24, 0x3a, 0xd9, 0x5d, + 0xe5, 0xb1, 0xd9, 0x75, 0x85, 0xde, 0xc4, 0x0c, + 0xc6, 0xda, 0x16, 0xb2, 0xf6, 0xc2, 0x6e, 0x6e, + 0xe9, 0xe3, 0xca, 0x73, 0x0b, 0xa9, 0xa7, 0xb6, + 0x1c, 0x28, 0xb6, 0xec, 0xc1, 0xff, 0x00, 0xea, + 0xdb, 0x43, 0x4d, 0x07, 0x03, 0x4d, 0x37, 0x89, + 0xaa, 0x6c, 0x24, 0x8d, 0xb9, 0x19, 0x9e, 0x45, + 0x21, 0xfd, 0x5e, 0x61, 0x6e, 0xe7, 0x47, 0x5d, + 0xc7, 0xb4, 0x11, 0x5e, 0x02, 0x0f, 0x71, 0x05, + 0x52, 0x9a, 0x37, 0xf7, 0x07, 0x73, 0x75, 0x59, + 0x36, 0x93, 0x2f, 0xb0, 0xca, 0xf2, 0x7c, 0xa2, + 0xd1, 0xb0, 0xb5, 0xb7, 0xd7, 0x11, 0xf3, 0xf7, + 0x52, 0xfe, 0x71, 0x69, 0xa5, 0x1a, 0x78, 0x54, + 0x5e, 0x49, 0x96, 0xbe, 0xff, 0x00, 0x3b, 0xb5, + 0xcb, 0x9e, 0x08, 0xc5, 0x28, 0x64, 0xad, 0xdd, + 0x0d, 0x61, 0xfd, 0x67, 0x79, 0xa5, 0x75, 0xed, + 0x96, 0x61, 0xed, 0xfb, 0x49, 0x72, 0xf6, 0x9a, + 0xc5, 0x0b, 0x84, 0x0c, 0xa6, 0xa0, 0x23, 0xd0, + 0x78, 0x5c, 0x83, 0xa3, 0x6d, 0xf2, 0xeb, 0x2c, + 0xba, 0xf2, 0xc9, 0x96, 0x70, 0xb6, 0x16, 0x4b, + 0x6a, 0xd7, 0xbd, 0xad, 0x07, 0xc6, 0x71, 0x24, + 0x57, 0x4a, 0xed, 0xb3, 0xca, 0x32, 0x3c, 0x83, + 0x2a, 0x87, 0x35, 0xda, 0x18, 0xdd, 0x75, 0x77, + 0x79, 0xe3, 0xdb, 0x58, 0xb7, 0x48, 0xc3, 0x4a, + 0x82, 0x46, 0xa7, 0x68, 0xd3, 0xe3, 0x6a, 0x5e, + 0xb6, 0xda, 0x21, 0x3e, 0x77, 0x93, 0x42, 0xe3, + 0x41, 0x2d, 0xbc, 0x2c, 0x27, 0xce, 0x7d, 0x17, + 0x2f, 0xe2, 0x34, 0xcf, 0x7e, 0xd2, 0x18, 0x75, + 0x47, 0x6f, 0x0c, 0x6c, 0x8d, 0xa3, 0x73, 0x10, + 0x24, 0x91, 0xe0, 0x41, 0x21, 0x67, 0x26, 0xc8, + 0xed, 0x4b, 0xdd, 0x97, 0x36, 0xc0, 0x65, 0x57, + 0xce, 0x69, 0xf6, 0x69, 0x63, 0xc2, 0x01, 0x20, + 0x56, 0x9e, 0x2e, 0x8e, 0xe2, 0xa6, 0xde, 0x5a, + 0x4d, 0x65, 0x77, 0x35, 0xac, 0xe3, 0x0c, 0xd0, + 0x3c, 0xb2, 0x4e, 0xd8, 0xd5, 0xa3, 0xb4, 0xbc, + 0xdb, 0xdc, 0x4f, 0x6d, 0x3b, 0x2e, 0x2d, 0xde, + 0x59, 0x34, 0x4e, 0x0f, 0x8d, 0xe3, 0x58, 0x70, + 0xd4, 0x56, 0x6e, 0x2e, 0x67, 0xba, 0x9d, 0xf7, + 0x37, 0x12, 0x3a, 0x59, 0xa5, 0x27, 0x14, 0x8e, + 0x35, 0x2e, 0x41, 0xa9, 0x3f, 0x2f, 0x02, 0x27, + 0xe5, 0xe0, 0x41, 0xf4, 0x3c, 0xbf, 0xff, 0x00, + 0xd3, 0x09, 0xfc, 0xc9, 0x3f, 0xea, 0x2f, 0x9e, + 0x95, 0xf4, 0x2c, 0xbf, 0xff, 0x00, 0xd3, 0x09, + 0xfc, 0xc9, 0x3f, 0xea, 0x2f, 0x9e, 0x94, 0x18, + 0x44, 0x44, 0x05, 0x72, 0xd8, 0x9b, 0xa9, 0xac, + 0xf2, 0x3c, 0xfe, 0xee, 0x07, 0x60, 0x9a, 0x08, + 0x44, 0x91, 0xba, 0x80, 0xd1, 0xcd, 0x6b, 0xc8, + 0xd0, 0x74, 0x2a, 0x6a, 0xba, 0x6c, 0x21, 0xb3, + 0x19, 0x3e, 0x78, 0x6f, 0xb1, 0x7b, 0x20, 0x8d, + 0xbc, 0xfe, 0x1a, 0xe2, 0xc1, 0x85, 0xf8, 0xa9, + 0x4e, 0xc2, 0x08, 0xcf, 0x8f, 0xb6, 0xab, 0x76, + 0xf0, 0x1d, 0xff, 0x00, 0xd5, 0x47, 0xa3, 0xe8, + 0xae, 0x2b, 0xbd, 0xa5, 0xce, 0x6e, 0xef, 0xad, + 0xef, 0xee, 0x27, 0xc7, 0x73, 0x69, 0xfb, 0x19, + 0x03, 0x18, 0x00, 0xd3, 0x8b, 0xc9, 0x0d, 0xa1, + 0xd6, 0xa7, 0x79, 0xcf, 0xc3, 0x21, 0x4f, 0x12, + 0xeb, 0x46, 0xad, 0x0f, 0x55, 0xfc, 0xf5, 0xd9, + 0x2b, 0xaf, 0x41, 0xc9, 0x04, 0x82, 0xcf, 0x00, + 0xd1, 0x25, 0x41, 0xc7, 0xbb, 0xa1, 0xc8, 0x2d, + 0x5b, 0x1d, 0xb5, 0x79, 0xf6, 0x67, 0x9f, 0x43, + 0x67, 0x7b, 0x72, 0x25, 0x81, 0xed, 0x79, 0x2c, + 0xe6, 0xd8, 0xdd, 0x2d, 0x61, 0xa1, 0xab, 0x5b, + 0x55, 0x13, 0x7d, 0xb7, 0x1b, 0x4c, 0xdb, 0xab, + 0xab, 0x71, 0x74, 0x39, 0xa6, 0xc9, 0x24, 0x61, + 0xbc, 0xdb, 0x2b, 0x84, 0x38, 0xb6, 0x95, 0xc3, + 0xbc, 0xb1, 0xf8, 0x7b, 0xfe, 0xa9, 0xb7, 0xf3, + 0x25, 0xfa, 0x85, 0x41, 0xe6, 0x1f, 0xcc, 0x6e, + 0xff, 0x00, 0xf2, 0x25, 0xfa, 0xee, 0x41, 0xf4, + 0x1d, 0x82, 0x9e, 0x38, 0x76, 0x65, 0x91, 0x4d, + 0xa6, 0x3b, 0x8b, 0xb7, 0x5b, 0x9f, 0xff, 0x00, + 0x20, 0xc2, 0x17, 0xcf, 0xaf, 0xed, 0x1d, 0x65, + 0x7f, 0x71, 0x66, 0xfd, 0x76, 0xf2, 0xba, 0x3e, + 0xe0, 0x3a, 0x15, 0xa2, 0xca, 0xe1, 0xf6, 0xbb, + 0x01, 0xed, 0x2c, 0xf2, 0xa0, 0xcc, 0x19, 0x23, + 0x69, 0xae, 0xad, 0x70, 0x77, 0xc8, 0xb4, 0x6d, + 0x8e, 0x5f, 0xed, 0x5b, 0x47, 0x6f, 0x25, 0xbb, + 0x6a, 0xdc, 0xe2, 0x38, 0x64, 0x60, 0x1b, 0xef, + 0xf1, 0x1d, 0xdd, 0xd0, 0x10, 0x59, 0x36, 0x5e, + 0x38, 0xec, 0x76, 0x4c, 0xda, 0x9f, 0x78, 0xbb, + 0xb5, 0x9e, 0xf2, 0x4e, 0xd3, 0xbc, 0x46, 0x57, + 0xb6, 0x17, 0xcc, 0x5b, 0xe4, 0x8e, 0xd0, 0xf9, + 0x57, 0xd3, 0x2d, 0xee, 0x59, 0x2e, 0x79, 0x9d, + 0xdb, 0x44, 0x6b, 0x0d, 0x86, 0x5c, 0x2d, 0x59, + 0xff, 0x00, 0xe3, 0x1a, 0x7e, 0x91, 0x2b, 0xe6, + 0x6d, 0xf2, 0x47, 0x68, 0x7c, 0xa8, 0x32, 0x88, + 0x88, 0x0a, 0xc5, 0xf8, 0x7f, 0xfe, 0xab, 0xb4, + 0xf3, 0x66, 0xff, 0x00, 0xa6, 0xe5, 0x5d, 0x56, + 0x2f, 0xc3, 0xff, 0x00, 0xf5, 0x5d, 0xa7, 0x9b, + 0x37, 0xfd, 0x37, 0x20, 0xcf, 0xe2, 0x0f, 0xfa, + 0xaa, 0xeb, 0xcc, 0x8b, 0xfe, 0x9b, 0x57, 0x8d, + 0x95, 0xc9, 0x6c, 0x6f, 0x05, 0xde, 0x67, 0x9a, + 0x93, 0xd5, 0xf9, 0x6b, 0x44, 0x92, 0xb1, 0xbf, + 0x9e, 0xe2, 0x2a, 0x1b, 0xda, 0xd0, 0xbd, 0xfe, + 0x20, 0xff, 0x00, 0xaa, 0xae, 0xbc, 0xc8, 0xbf, + 0xe9, 0xb5, 0x7b, 0xd8, 0xfc, 0xcb, 0x2d, 0x6c, + 0x17, 0xb9, 0x26, 0x6a, 0xfe, 0x66, 0xd7, 0x32, + 0x68, 0x0d, 0x97, 0x50, 0x6b, 0xc5, 0x45, 0x09, + 0xed, 0x51, 0x07, 0x7c, 0x7b, 0x41, 0xb0, 0xf7, + 0x52, 0x8b, 0x49, 0xb2, 0x51, 0x6b, 0x0c, 0x84, + 0x30, 0x5c, 0x80, 0xc6, 0xbc, 0x57, 0x45, 0x5c, + 0x5b, 0xe3, 0x77, 0xca, 0x8f, 0xb8, 0xc9, 0x2d, + 0x32, 0x6d, 0xaf, 0xb5, 0xb2, 0xb9, 0x68, 0xb8, + 0xb0, 0x9d, 0xec, 0x73, 0x31, 0xfe, 0x74, 0x52, + 0x1c, 0x22, 0xbe, 0x69, 0x5d, 0x77, 0xff, 0x00, + 0x86, 0xf9, 0x8b, 0x23, 0x33, 0x65, 0x77, 0x31, + 0x5e, 0xc2, 0xed, 0x2c, 0x15, 0xc0, 0xe2, 0x3b, + 0x04, 0x55, 0xa5, 0x56, 0xf3, 0x1b, 0xbc, 0xd7, + 0xdb, 0x00, 0xcc, 0x5d, 0x29, 0xbb, 0xb3, 0xc2, + 0xd6, 0xb6, 0x53, 0xa5, 0x81, 0x87, 0x13, 0x5b, + 0xda, 0x41, 0xd1, 0xb4, 0xf9, 0x7b, 0x32, 0xec, + 0xfe, 0xf2, 0xd2, 0x26, 0x88, 0xe1, 0x6b, 0xf1, + 0x44, 0xd1, 0xa8, 0x31, 0xc3, 0x10, 0xf0, 0xab, + 0x37, 0xc3, 0x99, 0x67, 0xc1, 0x58, 0xcc, 0x2d, + 0xeb, 0x5f, 0x65, 0xf6, 0xcc, 0x74, 0x38, 0xf0, + 0xe2, 0xc4, 0x06, 0xbd, 0xed, 0x0b, 0x83, 0x6d, + 0xed, 0xfd, 0xb7, 0x38, 0xb0, 0xba, 0x86, 0xa4, + 0x66, 0x90, 0x42, 0x41, 0x1b, 0xae, 0x27, 0x06, + 0x8e, 0xe2, 0x9c, 0x6d, 0xec, 0x7f, 0x1d, 0x3b, + 0x29, 0xa8, 0xf6, 0x6f, 0x62, 0xf6, 0x0e, 0xc6, + 0x86, 0x73, 0x9a, 0xb7, 0xeb, 0xa1, 0x05, 0x3b, + 0x65, 0xb2, 0xf8, 0xf3, 0x1c, 0xfa, 0xce, 0xd2, + 0x56, 0xe3, 0x85, 0xcf, 0xc5, 0x2b, 0x4e, 0xa2, + 0xd6, 0x02, 0xe7, 0x70, 0xd1, 0x4f, 0x64, 0x39, + 0x7e, 0x49, 0x7b, 0xb4, 0x79, 0xc8, 0x92, 0xd5, + 0x92, 0x58, 0xda, 0xc6, 0xf7, 0x41, 0x0d, 0x0d, + 0x00, 0x8d, 0xf4, 0xab, 0x7c, 0x6d, 0xd0, 0xb9, + 0xf6, 0x2e, 0xdc, 0xe5, 0xf9, 0x96, 0x69, 0x77, + 0x28, 0x2d, 0xea, 0xbb, 0x79, 0x43, 0x49, 0xdc, + 0x79, 0x38, 0x45, 0x7b, 0x80, 0xac, 0xfe, 0x1f, + 0x39, 0xcf, 0xb9, 0xcd, 0x9e, 0xef, 0x29, 0xd6, + 0x72, 0x13, 0xdb, 0x24, 0x14, 0x1b, 0x59, 0x9e, + 0xfe, 0x1f, 0x49, 0x40, 0xfc, 0x9a, 0x46, 0x35, + 0xda, 0xdc, 0x06, 0x91, 0xc9, 0x7d, 0x78, 0x17, + 0x0e, 0xd3, 0xec, 0xed, 0x95, 0x9d, 0xbd, 0xbe, + 0x6f, 0x93, 0xbc, 0xcb, 0x95, 0xdd, 0x1a, 0x34, + 0x6b, 0x2c, 0x71, 0xdc, 0xd3, 0xb9, 0xdb, 0x55, + 0xa6, 0xf9, 0x23, 0xb4, 0xae, 0x19, 0x31, 0x37, + 0x3b, 0x03, 0x9c, 0x5b, 0xc9, 0xa4, 0x5a, 0xbc, + 0x4b, 0x17, 0xf5, 0x4e, 0x87, 0x78, 0x45, 0x50, + 0x45, 0x6c, 0x85, 0x9c, 0x37, 0x79, 0xe4, 0x3e, + 0xd2, 0xc1, 0x25, 0xb4, 0x0c, 0x7c, 0xf3, 0x31, + 0xc0, 0x39, 0xa5, 0xb1, 0xb4, 0xba, 0x8e, 0x07, + 0x72, 0xaa, 0x42, 0xc7, 0x3d, 0xd8, 0xb8, 0xed, + 0x1a, 0xdb, 0xcc, 0xa1, 0xd2, 0xcf, 0xe3, 0x17, + 0xbd, 0x80, 0x06, 0x9f, 0x18, 0x91, 0x4a, 0x38, + 0x6e, 0x11, 0xb8, 0xb9, 0xf6, 0x78, 0xfb, 0x26, + 0x47, 0x9d, 0xe6, 0x40, 0xe1, 0x71, 0x85, 0x96, + 0xb1, 0x1f, 0xeb, 0x4c, 0xef, 0x1b, 0xbc, 0xd0, + 0xab, 0x8e, 0xd4, 0x69, 0xbd, 0x44, 0x1f, 0x45, + 0xce, 0x1f, 0xb1, 0x59, 0x44, 0x76, 0x8f, 0x9f, + 0x28, 0xe7, 0x05, 0xec, 0x7c, 0xf4, 0x78, 0x37, + 0x1b, 0xa3, 0x43, 0xaa, 0xfe, 0xca, 0xa6, 0x67, + 0xb7, 0x79, 0x4d, 0xdd, 0xe8, 0x97, 0x29, 0xb5, + 0x36, 0x76, 0xc2, 0x36, 0xb4, 0xc6, 0xea, 0x57, + 0x10, 0xad, 0x4e, 0x82, 0x77, 0xd4, 0xee, 0xde, + 0x7b, 0xae, 0x45, 0xff, 0x00, 0x88, 0x7f, 0xfe, + 0x9a, 0xa8, 0xa0, 0x2f, 0xb0, 0x6c, 0x6f, 0xfa, + 0x4e, 0xc7, 0xcc, 0x3f, 0x5d, 0xcb, 0xe3, 0xeb, + 0xec, 0x1b, 0x1b, 0xfe, 0x93, 0xb1, 0xf3, 0x0f, + 0xd7, 0x72, 0x09, 0x50, 0xa0, 0x1d, 0xe5, 0x1e, + 0xd9, 0x53, 0xe1, 0x40, 0x3b, 0xca, 0x3d, 0xb2, + 0x80, 0xb0, 0x4d, 0x01, 0x3b, 0xda, 0x56, 0x51, + 0x06, 0x76, 0xc2, 0x32, 0xfb, 0x6b, 0x3b, 0x86, + 0x8a, 0xb0, 0x55, 0xa4, 0x8d, 0x43, 0x10, 0x04, + 0x78, 0x15, 0x5d, 0x5d, 0x6d, 0xfd, 0x9e, 0xfa, + 0xcd, 0xf9, 0x6d, 0xd7, 0x92, 0xe1, 0xe2, 0x3b, + 0xbf, 0xde, 0x55, 0xbc, 0xc3, 0x21, 0xcc, 0x6c, + 0xa4, 0x23, 0x9b, 0x74, 0xf1, 0x0f, 0x26, 0x56, + 0x0a, 0xd4, 0x76, 0x68, 0x82, 0x39, 0x17, 0xb3, + 0x04, 0xe0, 0xd0, 0xc6, 0xf0, 0x7c, 0xd3, 0xc4, + 0x9c, 0xd4, 0xde, 0xad, 0xfc, 0x93, 0xc4, 0x83, + 0xc2, 0x2f, 0x7c, 0xd4, 0xde, 0xad, 0xfc, 0x93, + 0xc4, 0x9c, 0xd4, 0xde, 0xad, 0xfc, 0x93, 0xc4, + 0x83, 0xc2, 0x2f, 0x7c, 0xd4, 0xde, 0xad, 0xfc, + 0x93, 0xc4, 0x9c, 0xd4, 0xde, 0xad, 0xfc, 0x93, + 0xc4, 0x83, 0xc2, 0x2f, 0x7c, 0xd4, 0xde, 0xad, + 0xfc, 0x93, 0xc4, 0x9c, 0xd4, 0xde, 0xad, 0xfc, + 0x93, 0xc4, 0x83, 0xc2, 0x2f, 0x7c, 0xd4, 0xde, + 0xad, 0xfc, 0x93, 0xc4, 0x9c, 0xd4, 0xde, 0xad, + 0xfc, 0x93, 0xc4, 0x83, 0xc2, 0xf7, 0x00, 0xac, + 0xf1, 0x01, 0xac, 0xbd, 0xbe, 0x10, 0x9c, 0xd4, + 0xde, 0xad, 0xfc, 0x93, 0xc4, 0x9c, 0xd4, 0xbe, + 0xad, 0xfc, 0x93, 0xc4, 0x82, 0xcd, 0x9f, 0xe4, + 0x59, 0x95, 0xfe, 0x60, 0x27, 0xb6, 0x63, 0x4c, + 0x7c, 0xdb, 0x5b, 0x57, 0x38, 0x37, 0x48, 0x27, + 0xb0, 0xb9, 0xb3, 0x07, 0x5b, 0xe5, 0x79, 0x38, + 0xca, 0x99, 0x28, 0x96, 0xe6, 0xe1, 0xd8, 0xa7, + 0x2d, 0x20, 0xe1, 0x1a, 0x09, 0xf0, 0x28, 0x3c, + 0x17, 0x3f, 0x36, 0x4d, 0xfd, 0x4e, 0x1e, 0x05, + 0x8e, 0x6e, 0x6a, 0xd7, 0x9b, 0x79, 0x3d, 0xa3, + 0xc4, 0x82, 0x6e, 0xe7, 0xfd, 0x23, 0x6d, 0xb9, + 0xfa, 0xe0, 0x4e, 0xfe, 0xb7, 0x71, 0xa9, 0x11, + 0x77, 0x1f, 0xc3, 0x7e, 0xdf, 0xff, 0x00, 0x1d, + 0xb6, 0xfe, 0xcc, 0x4e, 0xee, 0x83, 0x86, 0x9f, + 0x2a, 0xa9, 0xf3, 0x73, 0xd2, 0x98, 0x1f, 0x41, + 0xa8, 0x61, 0x75, 0x16, 0x4b, 0x27, 0xc2, 0x5b, + 0x82, 0x4c, 0x3b, 0xd4, 0x75, 0x38, 0x10, 0x4d, + 0x59, 0x35, 0xc7, 0x65, 0x2e, 0x98, 0xd1, 0x52, + 0x66, 0x0d, 0x68, 0xd6, 0x49, 0xab, 0x16, 0xcc, + 0xfa, 0xf6, 0xe7, 0x2d, 0x65, 0x9d, 0x85, 0xa4, + 0xae, 0x88, 0xc3, 0x0d, 0x65, 0xc0, 0x69, 0x53, + 0xab, 0xc2, 0xa0, 0x39, 0xb9, 0xe8, 0x68, 0xc7, + 0xd0, 0xee, 0x50, 0xd2, 0xbb, 0xfa, 0x90, 0xc7, + 0x3b, 0x8d, 0x5c, 0xc7, 0x9a, 0x6f, 0x82, 0x7e, + 0x44, 0x16, 0x0d, 0x9e, 0xbf, 0xb9, 0xbe, 0x9a, + 0xe2, 0xc6, 0xf2, 0x57, 0x4c, 0xc9, 0xe2, 0x70, + 0x69, 0x76, 0x9a, 0x53, 0x41, 0xf0, 0xaa, 0xec, + 0x8c, 0x74, 0x72, 0x3e, 0x37, 0x79, 0x4c, 0x38, + 0x4d, 0x37, 0xd7, 0xa1, 0x14, 0xc0, 0xd7, 0x03, + 0xeb, 0xd8, 0x6b, 0xbf, 0xa1, 0x60, 0xc5, 0x31, + 0xd3, 0xcd, 0xbe, 0xba, 0xc9, 0xc2, 0x74, 0x94, + 0x13, 0x0f, 0x77, 0xb4, 0x6c, 0xa4, 0x74, 0xf2, + 0xad, 0xa7, 0xa3, 0x86, 0xf0, 0x75, 0x74, 0xf7, + 0xd6, 0x6d, 0x2c, 0x20, 0xcc, 0xf2, 0x4c, 0x16, + 0x8c, 0x68, 0xcc, 0x2d, 0xdd, 0xe3, 0x8d, 0x4e, + 0x73, 0x7f, 0xa5, 0x68, 0xca, 0x66, 0xc1, 0xed, + 0x16, 0x57, 0x2d, 0x73, 0x6d, 0xae, 0xd8, 0x41, + 0x25, 0xa6, 0x8d, 0x7b, 0x74, 0xb0, 0xea, 0xec, + 0x2e, 0x01, 0x1d, 0xc4, 0x4f, 0x25, 0x8d, 0x7e, + 0x26, 0x9a, 0x63, 0x68, 0x70, 0xd4, 0x82, 0x7b, + 0x2e, 0xb6, 0x97, 0x26, 0xb0, 0xbc, 0xbb, 0xbf, + 0x02, 0x17, 0x4d, 0x1f, 0x37, 0x1c, 0x4e, 0x22, + 0xa4, 0xe9, 0xd5, 0xc2, 0xbd, 0xe4, 0x96, 0x17, + 0x6d, 0xc9, 0xe6, 0xba, 0xb1, 0x6b, 0x4d, 0xf5, + 0xc1, 0x2c, 0x8d, 0xee, 0x38, 0x70, 0x30, 0x7c, + 0xd2, 0x41, 0x55, 0xe9, 0x3d, 0xae, 0x57, 0x62, + 0x90, 0x48, 0xf3, 0xfd, 0x60, 0xe3, 0xc6, 0xbc, + 0x88, 0xe7, 0x02, 0x81, 0xb2, 0x01, 0xbd, 0x47, + 0x51, 0x04, 0xac, 0xbb, 0x2f, 0x9c, 0x80, 0xf9, + 0xa5, 0x11, 0xbb, 0x5b, 0x9e, 0x4b, 0xea, 0x7b, + 0x27, 0x52, 0x87, 0x22, 0x86, 0x9b, 0xcb, 0xde, + 0x0b, 0x8f, 0x9b, 0x26, 0xf6, 0xa7, 0x71, 0x2c, + 0x73, 0x53, 0x7a, 0xb7, 0xf2, 0x4f, 0x12, 0x09, + 0xdb, 0x68, 0xdf, 0x9a, 0x6c, 0xe8, 0xb3, 0x80, + 0x87, 0x5c, 0xda, 0xc9, 0x88, 0x46, 0x75, 0x96, + 0xeb, 0xd1, 0xc2, 0xb4, 0xdc, 0x65, 0xd1, 0x65, + 0xf9, 0x23, 0xcd, 0xf4, 0x6d, 0x17, 0xf3, 0xbf, + 0xf5, 0x2d, 0x26, 0xae, 0x63, 0x46, 0xee, 0x85, + 0x16, 0xc6, 0xdc, 0xb1, 0xd8, 0x98, 0xd9, 0x18, + 0xe1, 0xa9, 0xcd, 0x0e, 0x07, 0xbc, 0x8f, 0x6d, + 0xcc, 0x8e, 0x2e, 0x90, 0x48, 0xf7, 0x1d, 0xd7, + 0x07, 0x38, 0xf6, 0x75, 0xa0, 0x97, 0xda, 0x3f, + 0x73, 0xca, 0xfe, 0xc3, 0xe4, 0x6a, 0x5d, 0x9f, + 0xfe, 0xa9, 0x67, 0xd9, 0x94, 0xf8, 0x1c, 0xa1, + 0x8c, 0x73, 0x9a, 0x02, 0xc7, 0x9d, 0xed, 0x0e, + 0x34, 0xec, 0x69, 0x5e, 0xa3, 0xb7, 0x9a, 0x57, + 0xb2, 0x22, 0x1c, 0xd6, 0xb8, 0xd0, 0x92, 0x1c, + 0x00, 0x07, 0x59, 0xe0, 0x41, 0x2b, 0x78, 0xe1, + 0x0e, 0xcc, 0xd9, 0x40, 0x74, 0x3a, 0xe2, 0x57, + 0x4a, 0x7b, 0x42, 0xba, 0x54, 0x2f, 0xf4, 0x29, + 0x1c, 0xe2, 0x67, 0x5c, 0xdc, 0xb6, 0x38, 0x18, + 0xf3, 0x6d, 0x6a, 0xc1, 0x0c, 0x27, 0x09, 0xd2, + 0x1b, 0xf9, 0xda, 0xb7, 0x57, 0x0f, 0x35, 0x37, + 0xab, 0x7f, 0x24, 0xf1, 0x20, 0xf0, 0x8b, 0xdf, + 0x35, 0x37, 0xab, 0x7f, 0x24, 0xf1, 0x27, 0x35, + 0x37, 0xab, 0x7f, 0x24, 0xf1, 0x20, 0xf0, 0x8b, + 0xdf, 0x35, 0x37, 0xab, 0x7f, 0x24, 0xf1, 0x27, + 0x35, 0x37, 0xab, 0x7f, 0x24, 0xf1, 0x20, 0xf0, + 0x8b, 0xdf, 0x35, 0x37, 0xab, 0x7f, 0x24, 0xf1, + 0x27, 0x35, 0x37, 0xab, 0x7f, 0x24, 0xf1, 0x20, + 0xf0, 0x8b, 0xdf, 0x35, 0x37, 0xab, 0x7f, 0x24, + 0xf1, 0x27, 0x35, 0x37, 0xab, 0x7f, 0x24, 0xf1, + 0x20, 0xf0, 0x8b, 0xdf, 0x35, 0x37, 0xab, 0x7f, + 0x24, 0xf1, 0x27, 0x35, 0x37, 0xab, 0x7f, 0x24, + 0xf1, 0x20, 0xf0, 0xbb, 0xb2, 0x28, 0x5d, 0x36, + 0x6f, 0x6a, 0x1b, 0xa7, 0x0c, 0x81, 0xe7, 0xb4, + 0xc3, 0x55, 0xa6, 0xdf, 0x2e, 0xbf, 0xb9, 0x70, + 0x6c, 0x36, 0xf2, 0x38, 0x9d, 0xdc, 0x24, 0x0e, + 0xeb, 0x8e, 0x85, 0x69, 0xca, 0xf2, 0xb8, 0xf2, + 0x5b, 0x73, 0x71, 0x72, 0x43, 0xef, 0x1e, 0x28, + 0xd0, 0x35, 0x37, 0xb0, 0xdf, 0x94, 0xa0, 0xce, + 0x6a, 0x41, 0xbd, 0x75, 0x37, 0x00, 0x1d, 0xda, + 0x2e, 0x45, 0x97, 0xb9, 0xcf, 0x7b, 0x9e, 0xe3, + 0x52, 0xe3, 0x52, 0xb0, 0x83, 0x65, 0xb7, 0xbc, + 0x45, 0xe7, 0xb7, 0xc2, 0xb4, 0x6d, 0x41, 0xa6, + 0x62, 0xdf, 0xb3, 0x1e, 0x12, 0xb7, 0xdb, 0x7b, + 0xc4, 0x5e, 0x7b, 0x7c, 0x2b, 0x97, 0x6a, 0xcd, + 0x33, 0x26, 0xfd, 0x98, 0xf0, 0x95, 0xdb, 0xcb, + 0xff, 0x00, 0x12, 0x3e, 0x12, 0xcd, 0xe7, 0xbf, + 0x81, 0xf8, 0xa2, 0xaa, 0x95, 0x5a, 0xf1, 0x26, + 0x25, 0xa9, 0xe5, 0x36, 0x55, 0x2a, 0xb5, 0xe2, + 0x4c, 0x48, 0x36, 0x55, 0x2a, 0xb5, 0xe2, 0x4c, + 0x48, 0x68, 0x96, 0xd9, 0xe8, 0xdb, 0x2e, 0x66, + 0xcc, 0x62, 0xa1, 0x8d, 0x2e, 0x1d, 0xb1, 0xa9, + 0x49, 0x6d, 0x1e, 0x61, 0x7b, 0x6b, 0x24, 0x4d, + 0x81, 0xe6, 0x26, 0x38, 0x13, 0x88, 0x6e, 0xbb, + 0xe6, 0xaa, 0xf5, 0x95, 0xec, 0x96, 0x57, 0x4c, + 0xb8, 0x60, 0xc4, 0x59, 0x5a, 0xb7, 0x7c, 0x6e, + 0xab, 0x64, 0x39, 0x96, 0x55, 0x99, 0xc7, 0xcd, + 0x38, 0xb4, 0x93, 0xe5, 0x43, 0x26, 0x83, 0x5d, + 0xdf, 0xc8, 0x2e, 0x19, 0x22, 0x62, 0xf1, 0x69, + 0x8d, 0xd5, 0x6c, 0xf2, 0xf3, 0x59, 0xc3, 0x6c, + 0x51, 0x7d, 0x97, 0x99, 0xf1, 0x72, 0x0c, 0xf2, + 0xc2, 0x7c, 0xb8, 0xc5, 0x74, 0xff, 0x00, 0xd7, + 0xc8, 0xc2, 0xd7, 0xb6, 0x95, 0xa9, 0xa2, 0x8d, + 0xb6, 0xc8, 0xee, 0xee, 0x6d, 0x05, 0xcc, 0x6f, + 0x66, 0x02, 0xd2, 0xe0, 0x34, 0xd7, 0x46, 0xe2, + 0xed, 0xcc, 0xb6, 0x69, 0xac, 0x89, 0xd3, 0xd8, + 0x92, 0x30, 0x82, 0x4c, 0x2e, 0xd2, 0x08, 0x1f, + 0x34, 0xeb, 0x5b, 0x76, 0x52, 0xe4, 0x3e, 0xd6, + 0x5b, 0x72, 0x6a, 0x62, 0x76, 0x20, 0x0f, 0xcd, + 0x77, 0xf4, 0xa4, 0x5b, 0x6d, 0x2d, 0x6c, 0x73, + 0xe1, 0x65, 0xbb, 0x76, 0xbe, 0x5a, 0xd3, 0x34, + 0x44, 0xe9, 0x5d, 0x2b, 0x7e, 0x68, 0x4b, 0x1b, + 0x39, 0xaf, 0xa6, 0x30, 0x42, 0x40, 0x70, 0x18, + 0xaa, 0x75, 0x51, 0x6c, 0x9b, 0x29, 0xbc, 0x8a, + 0xf5, 0x96, 0x6d, 0x2d, 0x7c, 0xce, 0x6e, 0x2f, + 0x17, 0x50, 0x1b, 0xee, 0x52, 0xd9, 0x05, 0xaf, + 0x31, 0x98, 0xdf, 0xd7, 0xfe, 0x1b, 0xb9, 0xb6, + 0xf6, 0x8b, 0x8b, 0x96, 0x32, 0xcb, 0xc8, 0xe7, + 0xcf, 0xee, 0xdc, 0xe2, 0x2a, 0x41, 0x6c, 0x75, + 0xdd, 0x0d, 0x20, 0x29, 0x9c, 0x93, 0x16, 0xb6, + 0x9c, 0x74, 0xaf, 0x8f, 0xc5, 0x4a, 0x79, 0x7a, + 0x6c, 0xac, 0x4f, 0x0b, 0x5a, 0xd3, 0x11, 0xf0, + 0x69, 0x1b, 0x2d, 0x75, 0x86, 0xa6, 0x76, 0x03, + 0xbd, 0x47, 0x15, 0xc2, 0xec, 0x9e, 0xf3, 0xdb, + 0x45, 0x8b, 0xe8, 0xd9, 0x1c, 0xd2, 0xe6, 0x38, + 0x9a, 0xb4, 0x80, 0x35, 0xa9, 0x7c, 0xca, 0xd3, + 0x36, 0x66, 0x62, 0x33, 0x0b, 0x5a, 0xcd, 0x1b, + 0x4b, 0x7f, 0x53, 0x88, 0xb4, 0xd0, 0x6b, 0x6d, + 0x3b, 0x2a, 0x27, 0x35, 0xce, 0xae, 0x6e, 0x25, + 0x65, 0x62, 0x75, 0xa4, 0xd0, 0x07, 0x0a, 0xe2, + 0x38, 0xa8, 0xee, 0xe7, 0x61, 0x45, 0x2f, 0x92, + 0x7d, 0xb1, 0x3a, 0xc2, 0x72, 0xe2, 0xc1, 0x48, + 0x9d, 0x69, 0x6a, 0xed, 0x9d, 0x35, 0xe7, 0xef, + 0x59, 0xaf, 0x2d, 0x65, 0xb8, 0xcb, 0x9d, 0x6a, + 0xc2, 0x04, 0x85, 0x81, 0xb5, 0x3a, 0xaa, 0x28, + 0xaa, 0xd1, 0xe5, 0x77, 0x6f, 0xbd, 0x7d, 0x9c, + 0x63, 0x13, 0xe3, 0x34, 0x7b, 0xeb, 0x46, 0x8e, + 0xca, 0xb1, 0xe6, 0x52, 0xc9, 0x1e, 0x48, 0xf9, + 0x58, 0xe2, 0xd9, 0x04, 0x6d, 0x38, 0x81, 0xd3, + 0x5d, 0x1b, 0xab, 0x46, 0xcc, 0x02, 0xeb, 0x27, + 0xdc, 0x3c, 0xe2, 0x92, 0x69, 0x2a, 0xf7, 0x1d, + 0x66, 0x83, 0x42, 0xa5, 0x2f, 0x34, 0xa5, 0xb8, + 0xf8, 0xcb, 0xae, 0x7c, 0x74, 0xcb, 0x97, 0x1d, + 0x3e, 0xa8, 0xb4, 0xd7, 0x7e, 0xbf, 0xe9, 0x8f, + 0x63, 0x89, 0xdb, 0x2d, 0x76, 0x19, 0x89, 0x93, + 0x46, 0x5c, 0x37, 0x28, 0xe0, 0xa3, 0x23, 0xb2, + 0xb8, 0x92, 0xf3, 0xd8, 0xe9, 0x82, 0x6a, 0xe1, + 0x21, 0xc7, 0xb1, 0x55, 0x3b, 0x96, 0xda, 0x67, + 0x31, 0x66, 0xae, 0xb8, 0xb8, 0x3f, 0xa8, 0x90, + 0xbf, 0x10, 0xc7, 0x5d, 0x07, 0xc8, 0xf1, 0x52, + 0xf5, 0x81, 0xbb, 0x4b, 0x66, 0xf0, 0x3c, 0xb6, + 0xe9, 0xed, 0x8a, 0xfc, 0x8a, 0xd1, 0x96, 0xdf, + 0x54, 0x4c, 0xee, 0xd6, 0xaa, 0x5b, 0x06, 0x3b, + 0x45, 0x6f, 0x5a, 0x4e, 0x38, 0x9b, 0x6c, 0x9a, + 0xdb, 0x84, 0xe9, 0xec, 0x70, 0x7c, 0x37, 0x98, + 0x73, 0xad, 0x8f, 0x13, 0x28, 0x45, 0x5c, 0xfd, + 0x34, 0x0b, 0x17, 0x9b, 0x3f, 0x7b, 0x6c, 0xd6, + 0xbd, 0x8e, 0x13, 0xb4, 0x90, 0xda, 0x36, 0xa0, + 0xd4, 0xe8, 0x5d, 0xdb, 0x55, 0x79, 0x73, 0x6e, + 0xcb, 0x76, 0x41, 0x23, 0xa3, 0xc7, 0x8d, 0xc4, + 0xb4, 0xd0, 0x92, 0x30, 0xd0, 0x77, 0xd7, 0x79, + 0xba, 0x94, 0x64, 0x7e, 0xd7, 0x5f, 0xd6, 0x08, + 0x31, 0xe2, 0xec, 0xd3, 0x5a, 0x77, 0x32, 0x69, + 0x59, 0xd7, 0xee, 0x9d, 0x13, 0x3e, 0x5f, 0x04, + 0xce, 0x4a, 0x69, 0x6d, 0x6b, 0xf5, 0x4c, 0xa2, + 0x0e, 0xcc, 0x5e, 0xf3, 0x65, 0xdc, 0xeb, 0x0b, + 0xe9, 0xe4, 0x50, 0xf8, 0x54, 0x34, 0x8d, 0x7c, + 0x6f, 0x74, 0x6f, 0x14, 0x73, 0x09, 0x6b, 0x87, + 0x64, 0x2b, 0x16, 0xca, 0xdd, 0xdc, 0x5c, 0x32, + 0xe1, 0xb3, 0xc8, 0xe9, 0x43, 0x0b, 0x0b, 0x4b, + 0x8d, 0x48, 0xc5, 0x8a, 0xbe, 0x05, 0x09, 0x9c, + 0x90, 0xdc, 0xd6, 0xe5, 0xa3, 0x45, 0x1e, 0x7b, + 0xfa, 0x55, 0xb1, 0xde, 0xd3, 0x6b, 0x56, 0xce, + 0x39, 0xf1, 0x63, 0x8c, 0x74, 0xcb, 0x4d, 0x63, + 0x5f, 0xa5, 0xae, 0xd0, 0xd6, 0xea, 0x1f, 0x3d, + 0xbe, 0x10, 0xaf, 0x4f, 0x7b, 0x5b, 0x2b, 0x1a, + 0x75, 0xbe, 0xb8, 0x7b, 0x60, 0x55, 0x50, 0x6d, + 0x1d, 0xff, 0x00, 0x79, 0x07, 0xda, 0x37, 0xc2, + 0x15, 0xc3, 0x35, 0xb8, 0xf6, 0x7b, 0x8b, 0x07, + 0x93, 0x46, 0x99, 0xf0, 0xbb, 0xb4, 0xe6, 0xb9, + 0xbe, 0x12, 0xab, 0xe6, 0x3e, 0xe8, 0xf8, 0x3a, + 0xf9, 0x29, 0xdb, 0x4b, 0xcc, 0xfb, 0x2d, 0x0a, + 0xf4, 0xd6, 0xa7, 0xaf, 0x7d, 0x96, 0x94, 0xc5, + 0x30, 0xe4, 0xf9, 0x7e, 0x05, 0x6e, 0x12, 0x34, + 0xca, 0xe8, 0xc6, 0xb6, 0x06, 0x9e, 0xe3, 0xab, + 0x4f, 0x02, 0x8a, 0x92, 0xd0, 0xbb, 0x69, 0xe3, + 0x97, 0x0f, 0x8b, 0xcd, 0x73, 0x84, 0xf6, 0x45, + 0x58, 0xba, 0x32, 0xf9, 0x8c, 0xd9, 0x96, 0x63, + 0x43, 0x51, 0x1b, 0xa3, 0x8c, 0x7f, 0x64, 0x3a, + 0xbd, 0xfa, 0xaa, 0x64, 0xb6, 0xf8, 0x89, 0xe9, + 0xac, 0x6a, 0xed, 0xe5, 0xe9, 0x18, 0xed, 0x68, + 0xd3, 0xee, 0xbc, 0xc7, 0xe1, 0x5f, 0x05, 0x6e, + 0xfe, 0x39, 0x26, 0xcd, 0xae, 0x22, 0x89, 0xb8, + 0x9e, 0xf9, 0x9e, 0x1a, 0xde, 0xea, 0xee, 0x8f, + 0x65, 0xef, 0x1c, 0xda, 0xbe, 0x66, 0x35, 0xc7, + 0x49, 0x14, 0x2e, 0x5b, 0xb2, 0xa8, 0xc4, 0x99, + 0xfd, 0xfc, 0x94, 0xa9, 0x63, 0x9d, 0x4e, 0xeb, + 0xa8, 0xb9, 0x33, 0xdb, 0xfb, 0x88, 0xb3, 0x90, + 0x18, 0xf2, 0xd1, 0x06, 0x0c, 0x2d, 0x04, 0x81, + 0xb8, 0xe2, 0xba, 0x6f, 0xbc, 0xcc, 0x52, 0xb3, + 0xa4, 0xe8, 0xcd, 0x18, 0xf1, 0xc5, 0x6d, 0x97, + 0x24, 0x4c, 0xef, 0xcb, 0x6a, 0xe9, 0x1c, 0x9c, + 0x77, 0xf6, 0x17, 0x39, 0x7c, 0x81, 0x93, 0x81, + 0x85, 0xde, 0x4b, 0xdb, 0xa8, 0xae, 0x9b, 0x0c, + 0x8a, 0xee, 0xf6, 0x21, 0x36, 0x26, 0xc5, 0x19, + 0xa8, 0x15, 0xa9, 0x26, 0x9a, 0x37, 0x14, 0xb6, + 0xd3, 0xb1, 0xae, 0xca, 0xb9, 0xda, 0x78, 0xcc, + 0x73, 0x1c, 0xde, 0xee, 0x82, 0xb7, 0x66, 0x32, + 0x3a, 0xc7, 0x23, 0x3c, 0xc9, 0xc2, 0xe6, 0x46, + 0xd6, 0x35, 0xc3, 0x58, 0xad, 0x05, 0x54, 0x77, + 0x6d, 0xb6, 0x34, 0xf1, 0xd7, 0x45, 0xbd, 0x36, + 0x3a, 0xe5, 0xb4, 0xcc, 0xce, 0xcc, 0x75, 0x8b, + 0xc7, 0xe2, 0xf1, 0x92, 0x65, 0xf7, 0x16, 0x0e, + 0xb8, 0x8e, 0x62, 0x1c, 0x1c, 0x58, 0x58, 0xf1, + 0x5a, 0x11, 0xe3, 0x6f, 0xa8, 0x7b, 0x9b, 0x29, + 0x6f, 0xf3, 0xab, 0xa8, 0x21, 0x2d, 0x0e, 0x0e, + 0x2e, 0x25, 0xdd, 0x85, 0x27, 0xb3, 0x37, 0x93, + 0x5c, 0xdb, 0xcc, 0xd9, 0x9e, 0x5e, 0x63, 0x70, + 0xa1, 0x76, 0x93, 0x47, 0x7f, 0xf0, 0xb5, 0x65, + 0xc4, 0x1d, 0xa7, 0xbc, 0x1e, 0x77, 0xc8, 0xa2, + 0x26, 0xd1, 0x6b, 0xcc, 0xf8, 0xc4, 0x2f, 0x35, + 0xa5, 0xb1, 0xe0, 0xac, 0x47, 0xd1, 0x39, 0x27, + 0x4d, 0x50, 0xb7, 0xf6, 0x73, 0x58, 0x4d, 0xcc, + 0x4a, 0x5a, 0x5c, 0x5a, 0x1d, 0xa0, 0xe8, 0xd2, + 0x68, 0xba, 0x6f, 0x32, 0x4b, 0xab, 0x4b, 0x53, + 0x72, 0xf7, 0xb0, 0xc6, 0x29, 0xa0, 0x6b, 0xd2, + 0xbd, 0x6d, 0x59, 0xa6, 0x66, 0x3e, 0xc9, 0xbe, + 0x17, 0x29, 0x9d, 0xa0, 0xd1, 0x92, 0xbc, 0x9d, + 0x5e, 0x27, 0xc8, 0xaf, 0xdc, 0xb6, 0x98, 0xf8, + 0xfd, 0xdc, 0x5c, 0xa3, 0x05, 0x35, 0xcf, 0x1a, + 0x7f, 0x0e, 0x3e, 0x97, 0xac, 0xbb, 0xf9, 0x0b, + 0x4f, 0xf8, 0x2f, 0xf0, 0x39, 0x56, 0x6c, 0x6c, + 0x6e, 0x6f, 0xa5, 0xe6, 0xa0, 0x15, 0xa0, 0xc4, + 0xf7, 0x9d, 0x00, 0x03, 0xda, 0x56, 0x5c, 0xb8, + 0xd7, 0x67, 0x5a, 0x47, 0xa9, 0x93, 0xbd, 0x89, + 0x69, 0xd9, 0x68, 0xc3, 0x72, 0xf7, 0x48, 0x3c, + 0xa9, 0x1e, 0x6a, 0x7b, 0x03, 0x50, 0x54, 0x8b, + 0xed, 0xae, 0x59, 0x8f, 0x1d, 0xd0, 0xeb, 0x7c, + 0x31, 0x92, 0x7c, 0xbd, 0x67, 0xc2, 0x2b, 0x32, + 0xe3, 0x7e, 0xcb, 0xdd, 0xe1, 0xa8, 0x9a, 0x37, + 0x3c, 0x7e, 0x6d, 0x08, 0xef, 0xa8, 0x93, 0x6d, + 0x71, 0xed, 0x26, 0xd7, 0x01, 0xe7, 0xc3, 0xb0, + 0xf3, 0x7d, 0x9e, 0xda, 0x9f, 0xcb, 0x2c, 0xf3, + 0xa8, 0xb3, 0x37, 0x5c, 0x5c, 0xfe, 0xc6, 0x4c, + 0x58, 0xdb, 0x8f, 0x10, 0xec, 0x1a, 0x2f, 0x77, + 0x06, 0x18, 0x76, 0x96, 0xde, 0x47, 0xd0, 0x73, + 0xb1, 0x10, 0x09, 0xf9, 0xc3, 0x52, 0xb4, 0x64, + 0xb4, 0x4c, 0xc6, 0xbb, 0xbe, 0x9d, 0xd1, 0xa7, + 0x35, 0x2d, 0xe5, 0xf1, 0xcd, 0x6b, 0x68, 0x8b, + 0x63, 0xfa, 0xb6, 0xce, 0xbc, 0x35, 0x87, 0x1b, + 0x36, 0x5e, 0xf0, 0xb6, 0xaf, 0x99, 0x8d, 0x71, + 0xd6, 0xda, 0x13, 0xdf, 0x51, 0xf7, 0xf9, 0x7d, + 0xcd, 0x84, 0x81, 0xb3, 0x50, 0xb4, 0xf9, 0x2f, + 0x6e, 0x90, 0x54, 0xee, 0x77, 0x63, 0x99, 0xcd, + 0x71, 0x1d, 0xc5, 0x9b, 0xc9, 0x6c, 0x40, 0x7e, + 0xaf, 0x16, 0x1a, 0x10, 0x6b, 0x51, 0xbf, 0x55, + 0x13, 0x9c, 0x66, 0xd7, 0x17, 0x4c, 0x6d, 0xbd, + 0xc5, 0xb7, 0xb3, 0xc8, 0xc7, 0x62, 0xf1, 0x89, + 0x24, 0xd3, 0x46, 0xf0, 0x4a, 0x5e, 0xf3, 0xb6, + 0x75, 0xd6, 0x39, 0x23, 0x2e, 0x0c, 0x54, 0x8b, + 0x44, 0x44, 0xc4, 0xd7, 0x4d, 0x2d, 0x3e, 0x12, + 0x8d, 0x2e, 0xae, 0x94, 0xaa, 0xd6, 0x0e, 0x80, + 0x13, 0x12, 0xd1, 0x2c, 0x4d, 0x95, 0x4a, 0xad, + 0x78, 0x93, 0x12, 0x84, 0xb6, 0x55, 0x2a, 0xb5, + 0xe2, 0x4c, 0x48, 0x3a, 0xec, 0x4f, 0xfd, 0xed, + 0xbf, 0xda, 0xb3, 0xeb, 0x05, 0x62, 0xce, 0x3d, + 0xec, 0x79, 0xa3, 0xe5, 0x55, 0x9b, 0x17, 0x7f, + 0xdf, 0x5b, 0x7d, 0xab, 0x3e, 0xb0, 0x56, 0x7c, + 0xe7, 0xde, 0x9b, 0xe6, 0x71, 0xac, 0xbe, 0x67, + 0xc6, 0xaf, 0x43, 0xf9, 0x7f, 0xd9, 0x7f, 0x8b, + 0x8e, 0x0f, 0xdb, 0xc7, 0xe7, 0x37, 0xc2, 0xa6, + 0xd4, 0x25, 0xbf, 0xed, 0xe3, 0xf3, 0x9b, 0xe1, + 0x53, 0x6b, 0x8b, 0x70, 0xa3, 0x33, 0x5f, 0x7a, + 0xb2, 0xf3, 0xfe, 0x50, 0xa4, 0xd4, 0x66, 0x6b, + 0xef, 0x56, 0x5e, 0x7f, 0xca, 0x10, 0x32, 0x9f, + 0x7a, 0xbc, 0xf3, 0xcf, 0xd6, 0x2a, 0x4d, 0x46, + 0x65, 0x3e, 0xf5, 0x79, 0xe7, 0x9f, 0xac, 0x54, + 0x9a, 0x02, 0x22, 0x20, 0xdb, 0x09, 0xf2, 0x97, + 0xc3, 0x6f, 0x7d, 0xf6, 0xe3, 0xed, 0x5f, 0xf5, + 0x8a, 0xfb, 0x8c, 0x26, 0x8e, 0xa6, 0xfe, 0xa5, + 0xf2, 0x5d, 0xb2, 0xc8, 0xa7, 0xca, 0x33, 0x69, + 0x5f, 0x84, 0x9b, 0x4b, 0xa7, 0x19, 0x60, 0x93, + 0x73, 0xc6, 0x35, 0x73, 0x2b, 0xbe, 0x10, 0x40, + 0xa2, 0xcd, 0x16, 0x34, 0xa0, 0xb2, 0xfe, 0x1e, + 0xff, 0x00, 0xa9, 0xe1, 0xfb, 0x39, 0x7c, 0x0b, + 0x8b, 0x2d, 0xcd, 0xe4, 0xc9, 0xb6, 0x8d, 0xd7, + 0xcd, 0xd2, 0xd6, 0x4e, 0xf6, 0x4c, 0xd1, 0xf9, + 0xd1, 0xb9, 0xee, 0xc6, 0xdf, 0x94, 0x2f, 0x1b, + 0x33, 0x9c, 0x45, 0x92, 0xe6, 0xf1, 0xdf, 0xcd, + 0x1b, 0xa5, 0x63, 0x5a, 0xf6, 0x16, 0x32, 0x80, + 0xd5, 0xc3, 0xfa, 0xd4, 0x0a, 0x3a, 0xe2, 0x51, + 0x2d, 0xc4, 0xb3, 0x34, 0x16, 0xf3, 0x8f, 0x73, + 0xc0, 0x3a, 0xc5, 0x49, 0x76, 0x9e, 0x14, 0x1f, + 0x48, 0xbe, 0xca, 0x62, 0xb1, 0xca, 0x73, 0xfb, + 0xcb, 0x42, 0x1d, 0x65, 0x98, 0xc4, 0xcb, 0x88, + 0x08, 0xd4, 0x0b, 0xb4, 0xb8, 0x0e, 0xc6, 0x9a, + 0x85, 0x42, 0xc8, 0xaf, 0xce, 0x5b, 0x9c, 0x59, + 0xde, 0xd6, 0x8d, 0x86, 0x56, 0xf3, 0x9e, 0x63, + 0x86, 0x17, 0x0e, 0xe8, 0x2a, 0x5a, 0xcf, 0x6c, + 0x04, 0x3b, 0x2d, 0x3e, 0x45, 0x71, 0x13, 0xe5, + 0x73, 0x9a, 0x59, 0x6f, 0x2b, 0x48, 0x01, 0xac, + 0x26, 0xa1, 0xae, 0x0e, 0xd3, 0xa1, 0x56, 0xb7, + 0x10, 0x7d, 0x06, 0x2b, 0x06, 0x64, 0xbb, 0x43, + 0x9f, 0xe7, 0x2e, 0x68, 0xe6, 0x6d, 0x61, 0x33, + 0x5b, 0x9d, 0xc2, 0xfb, 0x91, 0x5d, 0x07, 0xce, + 0xf0, 0xaf, 0x9f, 0x97, 0x39, 0xcf, 0xc4, 0xe3, + 0x57, 0x39, 0xc0, 0x92, 0x77, 0xce, 0x95, 0x65, + 0xcd, 0x76, 0xc1, 0xb7, 0xdb, 0x3d, 0x06, 0x52, + 0xd8, 0x1c, 0xcb, 0x96, 0xf3, 0x42, 0xe6, 0x72, + 0x46, 0x17, 0xb6, 0x11, 0xe2, 0xea, 0xd3, 0xa7, + 0x42, 0xac, 0xd6, 0x86, 0xa7, 0xb7, 0xdb, 0xa2, + 0x0b, 0x7e, 0xdd, 0xcb, 0xcc, 0xe6, 0xb9, 0x4c, + 0xba, 0x8c, 0x76, 0xb1, 0xbe, 0xbd, 0xa7, 0x55, + 0x6b, 0xfc, 0x43, 0xb7, 0x73, 0xf3, 0x38, 0x33, + 0x58, 0xc5, 0x6d, 0xaf, 0xe0, 0x61, 0x8d, 0xe3, + 0x55, 0x5a, 0x3c, 0x92, 0x77, 0xf4, 0xa8, 0xdd, + 0xa7, 0xcf, 0x20, 0xce, 0xe7, 0xb5, 0x96, 0x18, + 0x9f, 0x0b, 0x6d, 0xed, 0xc4, 0x04, 0x3e, 0x86, + 0xa7, 0x7c, 0x61, 0xaa, 0xec, 0xc9, 0x76, 0xb2, + 0x08, 0x32, 0xfe, 0xa8, 0xce, 0xad, 0x05, 0xfe, + 0x5e, 0xd3, 0x58, 0xa9, 0x42, 0xe8, 0xff, 0x00, + 0xaa, 0x2b, 0xb8, 0x82, 0x23, 0x26, 0xcb, 0x64, + 0xcd, 0x33, 0x4b, 0x6b, 0x06, 0x87, 0x7e, 0xbd, + 0xe0, 0x3c, 0x81, 0xa5, 0xac, 0x1e, 0x5b, 0xf4, + 0xee, 0x00, 0xb3, 0x9e, 0x58, 0x5b, 0xe5, 0xd9, + 0xb5, 0xc5, 0x8d, 0xbc, 0xc6, 0x78, 0xed, 0xdc, + 0x19, 0xce, 0x1a, 0x03, 0x5a, 0x69, 0x6e, 0x8d, + 0xe2, 0xac, 0x67, 0x6b, 0xb2, 0x1c, 0xae, 0xde, + 0x46, 0xec, 0xde, 0x5a, 0x60, 0xb9, 0x98, 0x50, + 0xdc, 0x4a, 0x74, 0x8e, 0xce, 0x92, 0xe7, 0x2a, + 0x7b, 0xde, 0xf9, 0x1e, 0xe9, 0x1e, 0x71, 0x3d, + 0xe4, 0xb9, 0xee, 0x3a, 0xc9, 0x71, 0xa9, 0x3c, + 0x28, 0x3c, 0xa7, 0xe5, 0xe0, 0x4d, 0x29, 0x43, + 0x54, 0x1f, 0x43, 0xcb, 0xff, 0x00, 0xfd, 0x30, + 0x9f, 0xcc, 0x93, 0xfe, 0xa2, 0xf9, 0xe9, 0x5f, + 0x42, 0xcb, 0xff, 0x00, 0xfd, 0x2f, 0x9f, 0xcc, + 0x93, 0xfe, 0xa2, 0xf9, 0xe9, 0x41, 0x84, 0x4d, + 0x29, 0xa5, 0x01, 0x5b, 0xf6, 0x3a, 0x19, 0x27, + 0xd9, 0xfd, 0xa1, 0x82, 0x16, 0x99, 0x25, 0x92, + 0x00, 0xd6, 0x31, 0xba, 0x49, 0x2e, 0x63, 0xe8, + 0x02, 0xa8, 0x69, 0x5d, 0xf9, 0x56, 0x7b, 0x9b, + 0x64, 0xe2, 0x41, 0x97, 0x4f, 0xcc, 0x09, 0x88, + 0x32, 0x78, 0xac, 0x75, 0x69, 0x5a, 0x79, 0x6d, + 0x3b, 0xe8, 0x36, 0x0d, 0x97, 0xda, 0x3f, 0xbb, + 0xa7, 0xe4, 0xff, 0x00, 0x4a, 0xe6, 0xbd, 0xca, + 0xf3, 0x2c, 0xbf, 0x07, 0xb7, 0x5b, 0x49, 0x6d, + 0xce, 0x57, 0x07, 0x38, 0x29, 0x5a, 0x6b, 0xa7, + 0x0a, 0x94, 0xf8, 0xeb, 0x6b, 0x3a, 0x79, 0xfd, + 0xdc, 0x5f, 0xc3, 0x5c, 0x19, 0xa6, 0x7b, 0x9b, + 0xe6, 0xfc, 0xd7, 0x59, 0x5c, 0x7b, 0x47, 0x33, + 0x5e, 0x6f, 0xc5, 0x63, 0x69, 0x8a, 0x95, 0xf2, + 0x1a, 0xdd, 0xe4, 0x12, 0xbf, 0x87, 0xbf, 0xea, + 0x9b, 0x6f, 0x32, 0x51, 0xf4, 0x1c, 0xa0, 0xf3, + 0x0f, 0xe6, 0x17, 0x7f, 0x6f, 0x2f, 0xd7, 0x72, + 0xce, 0x5f, 0x98, 0xde, 0xe5, 0x97, 0x4d, 0xbc, + 0xb2, 0x93, 0x9a, 0x9d, 0x80, 0x86, 0xbe, 0x8d, + 0x76, 0x82, 0x28, 0x74, 0x3d, 0xae, 0x1a, 0x96, + 0x89, 0x1e, 0xf9, 0x24, 0x7c, 0xaf, 0x35, 0x7c, + 0x8e, 0x2f, 0x79, 0xd5, 0x57, 0x38, 0xd4, 0x9d, + 0x08, 0x2d, 0x31, 0x7f, 0xfa, 0x6f, 0x26, 0xed, + 0x6f, 0x75, 0x77, 0x54, 0xd6, 0xcf, 0x36, 0xdf, + 0x30, 0xc9, 0x72, 0xac, 0xd2, 0x77, 0x0a, 0xe4, + 0x06, 0x66, 0xcd, 0x5d, 0x06, 0x8d, 0x69, 0x73, + 0x3c, 0x0d, 0x2a, 0x8a, 0x33, 0x4c, 0xc0, 0x65, + 0xa7, 0x2b, 0x12, 0xff, 0x00, 0xd9, 0x17, 0xf3, + 0x86, 0x1c, 0x2d, 0x20, 0xba, 0xb5, 0xad, 0x4b, + 0x49, 0xef, 0xac, 0xdb, 0x66, 0xd9, 0x8d, 0xad, + 0x94, 0xf6, 0x16, 0xf2, 0xe0, 0xb5, 0xba, 0xfd, + 0xbc, 0x40, 0x0a, 0x3a, 0xa0, 0x34, 0xee, 0x57, + 0x48, 0x14, 0x41, 0x63, 0xd8, 0x99, 0xdf, 0x73, + 0x71, 0x9d, 0xdc, 0xc9, 0xa1, 0xf3, 0xda, 0xc9, + 0x23, 0xbf, 0xb4, 0xe2, 0x55, 0x3d, 0x9e, 0x48, + 0xec, 0x80, 0x7b, 0x94, 0x5d, 0x96, 0x19, 0xae, + 0x61, 0x97, 0x73, 0xde, 0xc7, 0x2f, 0x35, 0xed, + 0x0c, 0x31, 0xcb, 0xa0, 0x1a, 0xb0, 0xee, 0x69, + 0x15, 0x5c, 0x9a, 0xb4, 0x00, 0x80, 0x89, 0xa5, + 0x34, 0xa0, 0x2b, 0x17, 0xe1, 0xff, 0x00, 0xfa, + 0xae, 0xd3, 0xcd, 0x9b, 0xfe, 0x9b, 0x95, 0x77, + 0x4a, 0xb1, 0x7e, 0x1f, 0x8f, 0xfe, 0xd7, 0x69, + 0xe6, 0xcd, 0xff, 0x00, 0x4d, 0xc8, 0x33, 0xf8, + 0x83, 0xfe, 0xaa, 0xba, 0xf3, 0x22, 0xff, 0x00, + 0xa6, 0xd5, 0xcb, 0x6b, 0xb3, 0xde, 0xd5, 0xb3, + 0x77, 0x59, 0xcc, 0x52, 0xb9, 0xd2, 0xda, 0xc8, + 0x23, 0x92, 0xd9, 0xad, 0x14, 0xc1, 0xe2, 0x92, + 0xfc, 0x55, 0xae, 0x80, 0xea, 0xae, 0xaf, 0xc4, + 0x1f, 0xf5, 0x55, 0xd5, 0x3e, 0x64, 0x47, 0xfe, + 0x5b, 0x57, 0x26, 0xce, 0x6d, 0x25, 0xce, 0x45, + 0x3b, 0xdc, 0xd6, 0x0b, 0x8b, 0x49, 0xc6, 0x1b, + 0x8b, 0x72, 0x74, 0x10, 0x35, 0x53, 0x41, 0x41, + 0xc5, 0x63, 0x9b, 0x66, 0x59, 0x63, 0xf9, 0xeb, + 0x1b, 0x87, 0xc0, 0x5b, 0xac, 0x02, 0x4b, 0x4d, + 0x37, 0x1c, 0xdd, 0x45, 0x58, 0xf6, 0xfc, 0x89, + 0xd9, 0x94, 0x5f, 0x48, 0xc1, 0x1d, 0xdd, 0xdd, + 0xb6, 0x29, 0xd9, 0xda, 0xc2, 0x47, 0xd7, 0x2b, + 0x79, 0xda, 0x3d, 0x85, 0x63, 0xbd, 0xae, 0x3c, + 0x99, 0xe6, 0xe6, 0xb8, 0x83, 0x08, 0xa3, 0x43, + 0xbb, 0x58, 0xb0, 0x70, 0x05, 0x5a, 0xcf, 0x73, + 0xab, 0xac, 0xea, 0xf9, 0xd7, 0x97, 0x00, 0x30, + 0xd0, 0x32, 0x18, 0x5b, 0xa4, 0x46, 0xc1, 0x5c, + 0x2d, 0x1c, 0x28, 0x2e, 0x59, 0x15, 0xbb, 0x73, + 0x5b, 0x0d, 0x9a, 0xbb, 0x7e, 0xac, 0xb6, 0x59, + 0xa3, 0x90, 0xee, 0x06, 0xb1, 0xae, 0x7b, 0x71, + 0x77, 0x18, 0x15, 0x4d, 0x99, 0xb3, 0xbe, 0x29, + 0x19, 0xb1, 0x3a, 0xef, 0x39, 0xde, 0xc6, 0x12, + 0xfa, 0x78, 0x17, 0x6e, 0x41, 0xb5, 0x8d, 0xc9, + 0xf2, 0x7b, 0xec, 0xb8, 0xc4, 0xf9, 0x1f, 0x72, + 0x5c, 0x60, 0x91, 0xa5, 0xb8, 0x58, 0x5c, 0xce, + 0x6c, 0xd6, 0xbb, 0xd4, 0x55, 0xca, 0x3b, 0x0e, + 0xad, 0x1a, 0xaa, 0x83, 0xe8, 0x1b, 0x47, 0x00, + 0xca, 0xf2, 0xcd, 0xa1, 0x98, 0x1a, 0x3b, 0x34, + 0xba, 0x8a, 0x36, 0x1d, 0xf6, 0x39, 0x8d, 0x90, + 0xd3, 0xb8, 0xe7, 0x28, 0xcf, 0xc3, 0xe3, 0xff, + 0x00, 0x71, 0x9a, 0xd3, 0x76, 0xca, 0x4f, 0x0b, + 0x57, 0x1e, 0xd1, 0xed, 0x53, 0x73, 0xac, 0xba, + 0xc6, 0xcd, 0xb1, 0x3e, 0x23, 0x69, 0xa6, 0xe1, + 0xef, 0x2d, 0x21, 0xce, 0xc0, 0x23, 0x6b, 0x85, + 0x3b, 0xab, 0x56, 0xca, 0x6d, 0x05, 0xb6, 0x45, + 0x75, 0x71, 0x35, 0xcc, 0x0f, 0xb9, 0x65, 0xc4, + 0x46, 0x1c, 0x11, 0xe1, 0x03, 0x49, 0x04, 0xd7, + 0x19, 0x1b, 0xc8, 0x20, 0x9b, 0xe4, 0xb7, 0xb2, + 0x35, 0xab, 0x8d, 0xa3, 0x1d, 0x96, 0x7e, 0x1f, + 0x5e, 0xcb, 0x38, 0xc1, 0x26, 0x69, 0x28, 0x64, + 0x2d, 0x3a, 0x09, 0x60, 0xa3, 0x75, 0x1e, 0xd3, + 0x8f, 0x69, 0x7a, 0x6e, 0xd5, 0x6c, 0x64, 0x67, + 0x1c, 0x7b, 0x3e, 0x31, 0x8d, 0x23, 0x10, 0x88, + 0x8a, 0xf0, 0x95, 0x07, 0xb4, 0x3b, 0x49, 0x75, + 0x9e, 0xca, 0xc7, 0x4a, 0xc1, 0x05, 0xbc, 0x22, + 0x96, 0xf6, 0xcc, 0xf2, 0x5b, 0x51, 0x4a, 0xee, + 0x54, 0xd3, 0x42, 0x0e, 0xcb, 0xdf, 0xfb, 0x3d, + 0x8a, 0xb0, 0xb7, 0xd4, 0xfc, 0xc6, 0xe6, 0x4b, + 0x97, 0xef, 0x96, 0xc6, 0x39, 0xb6, 0xfc, 0x85, + 0x57, 0x1d, 0xa8, 0xa9, 0x7c, 0xfb, 0x35, 0xb6, + 0xbf, 0x6d, 0x84, 0x36, 0x81, 0xcd, 0x82, 0xc6, + 0xd9, 0x90, 0x00, 0xf1, 0x42, 0x5f, 0xad, 0xe6, + 0x8a, 0x24, 0x82, 0x41, 0x08, 0x2d, 0xdb, 0x79, + 0xee, 0xb9, 0x17, 0xfe, 0x21, 0xff, 0x00, 0xfa, + 0x6a, 0xa2, 0xa6, 0xb6, 0x8b, 0x3e, 0x87, 0x38, + 0x87, 0x2f, 0x8e, 0x28, 0x5f, 0x11, 0xb1, 0x87, + 0x99, 0x71, 0x79, 0x07, 0x11, 0xf1, 0x74, 0xb7, + 0x0f, 0x9b, 0xba, 0xa1, 0x7f, 0x20, 0x83, 0x34, + 0xae, 0x8d, 0xff, 0x00, 0x0d, 0x42, 0xfa, 0xfe, + 0xc7, 0x02, 0x36, 0x4e, 0xc6, 0xbf, 0x30, 0xfd, + 0x67, 0x2f, 0x95, 0x65, 0x79, 0x5d, 0xe6, 0x6b, + 0x7b, 0x1d, 0x8d, 0x9b, 0x4b, 0xa5, 0x90, 0xf8, + 0xce, 0xdc, 0x63, 0x3f, 0x39, 0xce, 0x3b, 0x94, + 0x5f, 0x67, 0xb6, 0xb7, 0x8a, 0xcb, 0x2f, 0xb7, + 0xb3, 0x87, 0x44, 0x70, 0x46, 0xd8, 0xda, 0x3b, + 0x0d, 0x14, 0xdd, 0x41, 0xe8, 0x6e, 0x28, 0x17, + 0x79, 0x47, 0xb6, 0x54, 0xf8, 0xd6, 0xa0, 0x1d, + 0xe5, 0x1e, 0xd9, 0x40, 0x44, 0x44, 0x01, 0xf9, + 0x15, 0xd7, 0x0e, 0x69, 0x75, 0x10, 0xa1, 0x21, + 0xed, 0xde, 0x77, 0x1a, 0xe4, 0x44, 0x12, 0x1d, + 0x73, 0x37, 0xab, 0x62, 0x75, 0xcc, 0xde, 0xad, + 0xaa, 0x3d, 0x10, 0x48, 0x75, 0xcc, 0xde, 0xad, + 0xa9, 0xd7, 0x33, 0x7a, 0xb6, 0xa8, 0xf4, 0x41, + 0x21, 0xd7, 0x33, 0x7a, 0xb6, 0xa7, 0x5c, 0xcd, + 0xea, 0xda, 0xa3, 0xd1, 0x04, 0x87, 0x5c, 0xcd, + 0xea, 0xda, 0x9d, 0x73, 0x37, 0xab, 0x6a, 0x8f, + 0x44, 0x12, 0x1d, 0x73, 0x37, 0xab, 0x6a, 0x75, + 0xcc, 0xde, 0xad, 0xaa, 0x3d, 0x10, 0x48, 0x75, + 0xcc, 0xde, 0xad, 0xa9, 0xd7, 0x33, 0x7a, 0xb6, + 0xa8, 0xf4, 0x41, 0x21, 0xd7, 0x33, 0x7a, 0xb6, + 0xa7, 0x5c, 0xcd, 0xea, 0xda, 0xa3, 0xd1, 0x04, + 0x87, 0x5c, 0xcd, 0xea, 0xda, 0x9d, 0x73, 0x37, + 0xab, 0x6a, 0x8f, 0x44, 0x12, 0x1d, 0x73, 0x37, + 0xab, 0x6a, 0x75, 0xcc, 0xde, 0xad, 0xaa, 0x3d, + 0x10, 0x48, 0x75, 0xcc, 0xde, 0xad, 0xa9, 0xd7, + 0x33, 0x7a, 0xb6, 0xa8, 0xf4, 0x41, 0x21, 0xd7, + 0x32, 0xfa, 0xa6, 0xfe, 0x5d, 0xc4, 0xeb, 0x99, + 0x7d, 0x53, 0x14, 0x7a, 0x20, 0x90, 0xeb, 0x99, + 0xbd, 0x5b, 0x53, 0xae, 0x66, 0xf5, 0x6d, 0x51, + 0xe8, 0x82, 0x43, 0xae, 0x66, 0xf5, 0x6d, 0x4e, + 0xb9, 0x9b, 0xd5, 0xb5, 0x47, 0xa2, 0x09, 0x0e, + 0xb9, 0x9b, 0xd5, 0xb5, 0x3a, 0xe6, 0x6f, 0x56, + 0xd5, 0x1e, 0x88, 0x24, 0x3a, 0xe6, 0x6f, 0x56, + 0xd4, 0xeb, 0x99, 0x77, 0x62, 0x6a, 0x8f, 0x44, + 0x12, 0x1d, 0x73, 0x2f, 0xab, 0x6a, 0x75, 0xcc, + 0xde, 0xad, 0xaa, 0x3d, 0x10, 0x48, 0x75, 0xcc, + 0xde, 0xad, 0xa9, 0xd7, 0x33, 0x7a, 0xb6, 0xa8, + 0xf4, 0x41, 0x21, 0xd7, 0x33, 0x7a, 0xb6, 0xa7, + 0x5c, 0xcd, 0xea, 0xda, 0xa3, 0xd1, 0x04, 0x87, + 0x5c, 0xcd, 0xea, 0xda, 0x9d, 0x73, 0x37, 0xab, + 0x6a, 0x8f, 0x44, 0x12, 0x1d, 0x73, 0x37, 0xab, + 0x6a, 0x75, 0xcc, 0xde, 0xad, 0xaa, 0x3d, 0x10, + 0x48, 0x75, 0xcc, 0xde, 0xad, 0xa9, 0xd7, 0x33, + 0x7a, 0xb6, 0xa8, 0xf4, 0xa2, 0x0e, 0xe7, 0x67, + 0x17, 0x44, 0x51, 0x81, 0xac, 0xee, 0x54, 0xae, + 0x39, 0x25, 0x7c, 0xaf, 0x2f, 0x91, 0xc5, 0xce, + 0x3b, 0xab, 0xc6, 0x95, 0x94, 0x04, 0x44, 0x41, + 0xb2, 0xdb, 0xde, 0x22, 0xf3, 0xdb, 0xe1, 0x5c, + 0x5b, 0x5a, 0x69, 0x99, 0xb7, 0xec, 0xc7, 0x84, + 0xae, 0xdb, 0x6f, 0x78, 0x8f, 0xce, 0x1e, 0x15, + 0xc1, 0xb6, 0x06, 0x99, 0xa3, 0x3e, 0xc8, 0x78, + 0x4a, 0xeb, 0x83, 0xef, 0x8f, 0x74, 0x33, 0x79, + 0xdf, 0xe0, 0xfe, 0x28, 0x7c, 0x49, 0x89, 0x6a, + 0xc4, 0x98, 0x96, 0xad, 0x5e, 0x64, 0xb6, 0xe2, + 0x4c, 0x4b, 0x56, 0x24, 0xc4, 0x9a, 0xa3, 0x46, + 0xdc, 0x49, 0x89, 0x6a, 0xc4, 0x98, 0x93, 0x54, + 0xe8, 0x97, 0xc8, 0x2d, 0x2d, 0x6f, 0x6f, 0x1d, + 0x05, 0xc8, 0x2e, 0x69, 0x8c, 0x96, 0x80, 0x69, + 0xa4, 0x11, 0xf2, 0x2d, 0xbb, 0x41, 0x95, 0x36, + 0xca, 0xe2, 0x33, 0x69, 0x13, 0xb9, 0x97, 0xb7, + 0x58, 0xab, 0xa8, 0xed, 0x3b, 0xaa, 0x22, 0xde, + 0xe6, 0x5b, 0x69, 0x99, 0x3c, 0x2e, 0xc3, 0x23, + 0x0d, 0x5a, 0x55, 0x86, 0x3d, 0xb4, 0xa3, 0x69, + 0x3d, 0xb5, 0x5d, 0xbe, 0xc7, 0x68, 0x3d, 0xc2, + 0x17, 0x3b, 0x45, 0xa2, 0xf1, 0x68, 0xfa, 0xa3, + 0x93, 0x4d, 0x27, 0x15, 0xb1, 0xcd, 0x2d, 0x3b, + 0x2d, 0xaf, 0xdd, 0x11, 0xaa, 0x67, 0x26, 0x75, + 0xc0, 0xca, 0xa2, 0x37, 0x75, 0x0f, 0x0d, 0x24, + 0xe2, 0xd7, 0x84, 0x13, 0x43, 0xa7, 0xb0, 0xab, + 0xbb, 0x3b, 0x76, 0xd8, 0xf3, 0x97, 0x34, 0x10, + 0x19, 0x39, 0x7b, 0x07, 0x77, 0xc6, 0x1d, 0xf0, + 0xbc, 0x66, 0x5b, 0x55, 0x75, 0x7b, 0x11, 0x82, + 0x26, 0x0b, 0x78, 0xdc, 0x28, 0xf2, 0x1d, 0x89, + 0xc4, 0x6f, 0x57, 0x71, 0x72, 0x65, 0x36, 0x97, + 0xd3, 0xdd, 0x43, 0x2d, 0xac, 0x64, 0xb5, 0x92, + 0x36, 0xb2, 0x0f, 0x25, 0xa4, 0x1d, 0x35, 0xee, + 0x2a, 0x56, 0x9a, 0x56, 0xfb, 0xb8, 0x6e, 0x74, + 0xbe, 0x5d, 0xd7, 0xc5, 0x18, 0xfe, 0xad, 0xbe, + 0xd5, 0xd2, 0x71, 0x15, 0x8c, 0x37, 0x97, 0x62, + 0x83, 0x1d, 0x65, 0x77, 0x6c, 0x30, 0x34, 0x77, + 0xc2, 0xa8, 0xe4, 0xf9, 0x74, 0xb9, 0x9c, 0xcf, + 0x73, 0x26, 0xe6, 0x65, 0x88, 0x07, 0xe3, 0xa6, + 0x9a, 0xb8, 0xe9, 0xd2, 0xa7, 0xf6, 0xb2, 0xec, + 0x43, 0x96, 0x98, 0x41, 0xa3, 0xa7, 0x70, 0x68, + 0x1f, 0xd5, 0x69, 0xab, 0x95, 0x57, 0x2f, 0xcc, + 0xae, 0x32, 0xfb, 0x81, 0x71, 0x05, 0x09, 0xa5, + 0x1c, 0xd3, 0xa9, 0xc3, 0x79, 0x31, 0x44, 0xf6, + 0xe6, 0x7f, 0x5a, 0x67, 0xfc, 0x20, 0xf3, 0x36, + 0xac, 0xe4, 0xad, 0x6d, 0x1f, 0x45, 0x78, 0xce, + 0x9c, 0x27, 0x59, 0x4f, 0xdb, 0xe6, 0xd9, 0xa5, + 0xae, 0x66, 0x32, 0xdb, 0x83, 0xed, 0x2d, 0xc6, + 0x1a, 0x1d, 0x84, 0x87, 0x16, 0x9f, 0xce, 0x05, + 0x67, 0x6c, 0xa2, 0x89, 0xb1, 0xc1, 0x30, 0xfd, + 0xa9, 0xc4, 0xde, 0xd8, 0xa5, 0x57, 0x81, 0xb6, + 0x71, 0xd0, 0x38, 0xda, 0x7e, 0xb4, 0x6e, 0x87, + 0x03, 0xf2, 0x55, 0x42, 0x66, 0x99, 0xad, 0xc6, + 0x65, 0x3f, 0x39, 0x3d, 0x1a, 0xd6, 0xe8, 0x8e, + 0x36, 0xea, 0x03, 0x5e, 0xbd, 0xd4, 0xad, 0x2d, + 0xba, 0x26, 0x63, 0x6c, 0x7b, 0x4c, 0x99, 0x71, + 0xc6, 0x3b, 0xc4, 0x4e, 0xfd, 0x7e, 0xd8, 0x98, + 0xf0, 0x85, 0xbf, 0x34, 0x6b, 0x9f, 0x90, 0x3c, + 0x31, 0xa5, 0xce, 0xe6, 0x9a, 0x70, 0x8d, 0x24, + 0xd0, 0x05, 0xa7, 0x65, 0x1f, 0x5c, 0xb5, 0xd1, + 0x9d, 0x0f, 0x8e, 0x47, 0x02, 0x0e, 0x82, 0x0d, + 0x01, 0xd4, 0xa2, 0x6c, 0xf6, 0xba, 0x78, 0x20, + 0x64, 0x12, 0xc0, 0x25, 0x2c, 0x18, 0x43, 0xc3, + 0xb0, 0xd4, 0x0d, 0xf1, 0x45, 0xc9, 0x6f, 0xb4, + 0x17, 0x16, 0xf9, 0x84, 0xd7, 0x71, 0xb0, 0x61, + 0xb8, 0x35, 0x92, 0x12, 0x74, 0x77, 0x0a, 0x8e, + 0xdd, 0xb6, 0xda, 0xba, 0x7b, 0x75, 0x84, 0xf7, + 0xb1, 0xc5, 0xe9, 0x78, 0x9d, 0x67, 0x6e, 0xd9, + 0xe1, 0xe0, 0xeb, 0xb4, 0x76, 0x71, 0x77, 0x99, + 0xc9, 0x65, 0xed, 0x32, 0xc5, 0x81, 0xcf, 0xa9, + 0xd3, 0xa0, 0x03, 0xa1, 0x6f, 0x10, 0xcd, 0x6f, + 0xb4, 0x76, 0x90, 0xcf, 0x70, 0x6e, 0x9e, 0x34, + 0xe3, 0x76, 0xb1, 0x50, 0x74, 0x23, 0xb6, 0xc9, + 0x81, 0xb8, 0x99, 0x69, 0x49, 0x0e, 0xb2, 0x5c, + 0x29, 0xde, 0x15, 0x50, 0xd1, 0x66, 0xd7, 0x0d, + 0xcc, 0x86, 0x63, 0x30, 0x13, 0x4a, 0x1d, 0x88, + 0x8f, 0x24, 0x1d, 0x60, 0x6f, 0xd2, 0x80, 0xa9, + 0xdb, 0x69, 0xd7, 0x86, 0x9c, 0x34, 0x52, 0xd6, + 0xc5, 0x11, 0x1b, 0x6d, 0x36, 0xff, 0x00, 0x72, + 0xb6, 0xf6, 0xf8, 0x42, 0x73, 0x6c, 0x8e, 0x9b, + 0x4e, 0xd4, 0x9f, 0xdd, 0x5d, 0xef, 0xff, 0x00, + 0x4b, 0x93, 0xff, 0x00, 0xf0, 0xbf, 0xdd, 0x0a, + 0xb1, 0x9c, 0x67, 0x6f, 0xcd, 0x4c, 0x45, 0xd1, + 0x08, 0x79, 0xac, 0x40, 0x51, 0xc5, 0xd5, 0xc5, + 0x4d, 0xf0, 0x37, 0x97, 0x43, 0xb6, 0x9a, 0x43, + 0x96, 0x75, 0x77, 0xb3, 0xb7, 0x09, 0x8b, 0x9a, + 0xe7, 0x31, 0x9a, 0xea, 0xa5, 0x69, 0x85, 0x36, + 0x5b, 0x6d, 0x23, 0x4f, 0xb6, 0x78, 0xa7, 0xbd, + 0x8f, 0xb9, 0x96, 0xda, 0xf0, 0xbd, 0x74, 0x8e, + 0x09, 0x1d, 0x8d, 0x35, 0x6d, 0xdf, 0x6e, 0x3f, + 0xef, 0x28, 0x8c, 0xf1, 0xdf, 0xe6, 0xf7, 0x5e, + 0x7f, 0xc8, 0xb1, 0x93, 0xe7, 0x8f, 0xca, 0x84, + 0xa1, 0x90, 0x89, 0xb9, 0xec, 0x35, 0xab, 0x8b, + 0x69, 0x86, 0xbb, 0xc0, 0xef, 0xae, 0x4b, 0xeb, + 0xc3, 0x79, 0x77, 0x2d, 0xc9, 0x68, 0x61, 0x94, + 0xe2, 0x2d, 0x06, 0xb4, 0xee, 0xab, 0xd6, 0xb3, + 0x19, 0x2d, 0x6f, 0x64, 0xc3, 0x96, 0x4c, 0x95, + 0x9f, 0x2f, 0x4a, 0x44, 0xfd, 0x55, 0xb6, 0xb3, + 0x0d, 0x96, 0x4e, 0xff, 0x00, 0xbc, 0x83, 0xed, + 0x19, 0xe1, 0x0a, 0xcd, 0xb5, 0xee, 0x2c, 0xb5, + 0xb6, 0x70, 0x34, 0xc3, 0x30, 0x70, 0xed, 0x80, + 0x48, 0x55, 0x18, 0x66, 0x31, 0x4c, 0xc9, 0x40, + 0xa9, 0x8d, 0xc1, 0xd4, 0xdf, 0xa1, 0xaa, 0x92, + 0xce, 0x36, 0x82, 0x4c, 0xd2, 0x16, 0x44, 0xe8, + 0x5b, 0x08, 0x63, 0xb1, 0x82, 0x1c, 0x5d, 0xb8, + 0x46, 0xe8, 0x1b, 0xe9, 0x92, 0xb3, 0x37, 0x89, + 0x8f, 0x08, 0x29, 0x92, 0x2b, 0x87, 0x2d, 0x7f, + 0x5a, 0xda, 0x6d, 0x85, 0xca, 0x39, 0x23, 0x7c, + 0x51, 0xde, 0xd2, 0xbf, 0xaa, 0xc5, 0x8b, 0xfa, + 0xa4, 0x07, 0x7c, 0x8a, 0x1b, 0x64, 0xa5, 0xe7, + 0x5f, 0x7d, 0x21, 0xd2, 0x5f, 0x23, 0x5c, 0x4f, + 0x6f, 0x12, 0x89, 0x8f, 0x69, 0xa7, 0x66, 0x5b, + 0xd5, 0xe2, 0x16, 0xd3, 0x9b, 0x31, 0x09, 0x71, + 0x1a, 0x81, 0xda, 0xa6, 0xe0, 0x5a, 0x72, 0x7c, + 0xf5, 0xf9, 0x53, 0x65, 0x6b, 0x21, 0x12, 0xf3, + 0xa5, 0xa7, 0x4b, 0x8b, 0x69, 0x86, 0xbb, 0xc0, + 0xef, 0xae, 0x7d, 0xab, 0x6d, 0xbc, 0x69, 0xe3, + 0x31, 0xa3, 0x44, 0xf9, 0x9c, 0x73, 0x96, 0x93, + 0xaf, 0xd3, 0x1b, 0xa6, 0xdc, 0x27, 0xc6, 0x61, + 0x37, 0x93, 0x4a, 0xd1, 0xb4, 0x39, 0x8c, 0x64, + 0xe9, 0x71, 0x75, 0x3b, 0x61, 0xcb, 0x83, 0x68, + 0x6d, 0xe5, 0x76, 0x77, 0x40, 0xd3, 0xfa, 0xfc, + 0x18, 0x28, 0x35, 0xe8, 0x0d, 0x51, 0x7d, 0x67, + 0x3b, 0x73, 0x17, 0x66, 0x30, 0xd2, 0x39, 0x5c, + 0xf7, 0x3c, 0x37, 0x58, 0xf1, 0x8d, 0x48, 0xec, + 0xa9, 0xc6, 0xed, 0x9b, 0x0b, 0x43, 0xa4, 0xb4, + 0xac, 0xa3, 0x74, 0x38, 0x10, 0x0f, 0x74, 0x55, + 0x5a, 0x6b, 0x6a, 0xdb, 0x5a, 0xc7, 0x8d, 0x74, + 0x73, 0xdf, 0x8e, 0xf4, 0xd9, 0x69, 0xdb, 0xa5, + 0xf7, 0x47, 0x0f, 0x63, 0xbf, 0x6a, 0xa5, 0x6c, + 0x59, 0x3f, 0x36, 0x4f, 0x8c, 0xf7, 0x31, 0xad, + 0x1d, 0xad, 0x25, 0x6d, 0xcd, 0x9a, 0xeb, 0xbc, + 0x85, 0xe6, 0x11, 0x88, 0xf3, 0x6d, 0x90, 0x01, + 0xa4, 0x9a, 0x50, 0xd1, 0x55, 0x33, 0x5c, 0xe2, + 0xe3, 0x32, 0x95, 0xae, 0x90, 0x06, 0x46, 0xcf, + 0xd9, 0xc6, 0x34, 0xd2, 0xbb, 0xfb, 0xeb, 0xb3, + 0x2a, 0xda, 0x99, 0x2c, 0x6d, 0xc5, 0xb4, 0xf1, + 0x73, 0xd1, 0xb0, 0x51, 0x8e, 0x06, 0x8e, 0x03, + 0x78, 0xef, 0xaa, 0xc6, 0x3b, 0x45, 0x6b, 0x31, + 0xc6, 0x62, 0x75, 0x98, 0x5f, 0xbf, 0x49, 0xc9, + 0x78, 0xb7, 0x0a, 0x5a, 0xbb, 0x75, 0xf8, 0x25, + 0x36, 0x4a, 0x09, 0x23, 0xb6, 0x9e, 0x47, 0xb4, + 0xb7, 0x1b, 0x9a, 0x00, 0x70, 0xa1, 0xf1, 0x6b, + 0xc6, 0xbc, 0x65, 0x8e, 0x1f, 0x14, 0x5e, 0xf6, + 0x9f, 0x4e, 0xe1, 0x0b, 0x93, 0xe3, 0x2b, 0x81, + 0x2b, 0xde, 0x2d, 0xda, 0x63, 0x70, 0x01, 0x8c, + 0x2e, 0x22, 0x94, 0xdd, 0xad, 0x34, 0xd5, 0x46, + 0xc7, 0x9c, 0xcf, 0x1e, 0x68, 0xec, 0xca, 0x36, + 0x06, 0xbd, 0xce, 0x2e, 0x74, 0x75, 0xa8, 0x21, + 0xda, 0xdb, 0x55, 0x3b, 0x2f, 0x33, 0x69, 0x98, + 0xd3, 0x72, 0x3b, 0xb8, 0xe2, 0x31, 0x56, 0x27, + 0x5e, 0xdd, 0xf5, 0x9e, 0x1e, 0xc4, 0x9e, 0xd4, + 0xdb, 0xcf, 0x26, 0x6a, 0xc1, 0x1c, 0x6e, 0x70, + 0x92, 0x36, 0xb5, 0xa4, 0x02, 0x41, 0x35, 0x72, + 0x97, 0xda, 0x3f, 0x17, 0x24, 0x90, 0x1d, 0x63, + 0x07, 0xc8, 0xa2, 0xae, 0x76, 0xc9, 0xef, 0x84, + 0xb6, 0x0b, 0x7c, 0x12, 0x91, 0xa1, 0xee, 0x35, + 0x0d, 0x3b, 0xe0, 0x6e, 0xae, 0x4c, 0xc3, 0x69, + 0xe5, 0xbe, 0xb2, 0x75, 0xa3, 0xe0, 0x6b, 0x03, + 0xa9, 0x57, 0x87, 0x12, 0x74, 0x76, 0x30, 0xa8, + 0x8a, 0x5f, 0x5a, 0x6b, 0x1f, 0x69, 0x39, 0x31, + 0x47, 0x76, 0x62, 0xda, 0xce, 0x48, 0xe1, 0xc2, + 0x7c, 0x53, 0xf9, 0x61, 0xae, 0xcd, 0x8a, 0x7a, + 0x99, 0x7f, 0xbc, 0xb5, 0xec, 0xa4, 0x8d, 0x76, + 0x57, 0x84, 0x69, 0x2c, 0x91, 0xc1, 0xdf, 0x22, + 0x84, 0xb6, 0xda, 0x69, 0x2d, 0xf2, 0xe1, 0x60, + 0x2d, 0xda, 0xe6, 0x86, 0x39, 0x9c, 0xe1, 0x71, + 0x07, 0xc6, 0xae, 0x9a, 0x61, 0xec, 0xae, 0x4c, + 0xab, 0x38, 0xb8, 0xcb, 0x24, 0x2e, 0x88, 0x07, + 0xc6, 0xf0, 0x03, 0xe3, 0x76, 0x80, 0x69, 0xbc, + 0x77, 0x12, 0x71, 0xdb, 0x4b, 0xf0, 0xf1, 0x9d, + 0x61, 0x31, 0xe6, 0x29, 0x16, 0xc5, 0xed, 0x8a, + 0xd6, 0x6b, 0x6e, 0x1e, 0x09, 0x1b, 0x07, 0x67, + 0x17, 0x79, 0x8c, 0x96, 0x7e, 0xd7, 0x2c, 0x66, + 0x32, 0xe2, 0xf7, 0x54, 0xe8, 0xa5, 0x7b, 0x3b, + 0xab, 0xd5, 0xc6, 0x55, 0x73, 0x71, 0x9b, 0x36, + 0xc6, 0x5b, 0xc7, 0x49, 0x23, 0x23, 0xe7, 0x04, + 0x8f, 0xad, 0x46, 0x9d, 0x4b, 0x6b, 0xf6, 0xcd, + 0xb8, 0x4f, 0x35, 0x6b, 0x49, 0x1d, 0xad, 0xce, + 0x70, 0xa7, 0x78, 0x28, 0x4e, 0xb5, 0xbc, 0x17, + 0xe6, 0xfc, 0x3f, 0xf5, 0xe5, 0xd5, 0xae, 0xe5, + 0x3e, 0x6f, 0x69, 0x5a, 0x22, 0xda, 0xeb, 0x11, + 0x15, 0xe1, 0xa3, 0x9d, 0xa7, 0x14, 0x44, 0x44, + 0x4c, 0xdf, 0x5b, 0xeb, 0x3e, 0xe8, 0x4d, 0x49, + 0x99, 0x66, 0xd9, 0x45, 0xe3, 0x2d, 0x25, 0x7f, + 0xb5, 0xc6, 0xec, 0x25, 0xb5, 0x69, 0xa9, 0x0e, + 0x34, 0xf1, 0x5c, 0x37, 0x97, 0x76, 0xd5, 0xc7, + 0x1b, 0xb2, 0xc1, 0x31, 0x14, 0x91, 0x8f, 0x68, + 0x69, 0xdd, 0xa1, 0xd6, 0x17, 0x10, 0xdb, 0x28, + 0xcb, 0x41, 0x96, 0xd3, 0xf5, 0x83, 0x51, 0x0e, + 0x14, 0xaf, 0x74, 0x28, 0xac, 0xd7, 0x3d, 0xb9, + 0xcc, 0xdc, 0xdc, 0x60, 0x47, 0x13, 0x0e, 0x26, + 0xc6, 0x0d, 0x78, 0x4a, 0xac, 0x52, 0xd3, 0x35, + 0x99, 0xae, 0xd9, 0x8f, 0x19, 0x89, 0xf1, 0x5e, + 0xd9, 0x69, 0x14, 0xbc, 0x6e, 0xdf, 0xbb, 0xc2, + 0x26, 0x27, 0x87, 0xe2, 0xe3, 0xa8, 0x06, 0x83, + 0x56, 0xe2, 0x62, 0x5a, 0xb1, 0x26, 0x25, 0xa1, + 0x8b, 0x4d, 0x22, 0x23, 0xc7, 0xde, 0xdb, 0x89, + 0x31, 0x2d, 0x58, 0x93, 0x12, 0x6a, 0x8d, 0x1b, + 0x71, 0x26, 0x25, 0xab, 0x12, 0x62, 0x4d, 0x4d, + 0x1d, 0x96, 0x0e, 0xff, 0x00, 0xbf, 0xb6, 0xfb, + 0x66, 0x7d, 0x60, 0xad, 0x79, 0xcf, 0xbd, 0x37, + 0xcc, 0xe3, 0x55, 0x0c, 0xbc, 0xd7, 0x30, 0xb5, + 0xfb, 0x66, 0x7d, 0x60, 0xad, 0xd9, 0xc9, 0xff, + 0x00, 0xba, 0x1d, 0x86, 0x0f, 0x95, 0x66, 0xf3, + 0x3c, 0x66, 0x1e, 0x87, 0x90, 0xfb, 0x2f, 0xf1, + 0x72, 0x5b, 0xfe, 0xde, 0x3f, 0x39, 0xbe, 0x15, + 0x36, 0xa1, 0x2d, 0xff, 0x00, 0x6f, 0x1f, 0x9c, + 0xdf, 0x0a, 0x9b, 0x5c, 0x5b, 0x45, 0x19, 0x9a, + 0xfb, 0xd5, 0x97, 0x9f, 0xf2, 0x85, 0x26, 0xa3, + 0x33, 0x5f, 0x7a, 0xb2, 0xf3, 0xfe, 0x50, 0x81, + 0x94, 0xfb, 0xd5, 0xe7, 0x9e, 0x7e, 0xb1, 0x52, + 0x75, 0x51, 0x79, 0x57, 0xbd, 0x5e, 0x79, 0xe7, + 0xeb, 0x15, 0x27, 0x44, 0x19, 0xaa, 0x55, 0x62, + 0x89, 0x44, 0x19, 0xa8, 0x59, 0x95, 0xb6, 0xd7, + 0x51, 0x3a, 0x0b, 0xb8, 0x9b, 0x34, 0x4f, 0xf2, + 0x9a, 0xf0, 0x1c, 0xd3, 0xdb, 0x06, 0xab, 0xcd, + 0x12, 0x88, 0x21, 0xa7, 0xd8, 0x2d, 0x95, 0x9a, + 0x4c, 0x6d, 0x85, 0xd0, 0xd7, 0x5b, 0x63, 0x91, + 0xc1, 0xa4, 0x9e, 0xc3, 0xaa, 0xb5, 0x7f, 0xb7, + 0x9b, 0x2d, 0xbd, 0x2f, 0xef, 0x3f, 0xa1, 0x4f, + 0x50, 0x25, 0x02, 0x08, 0x1f, 0xf6, 0xf3, 0x65, + 0xbe, 0x6c, 0xbf, 0xbc, 0xfe, 0x84, 0x3f, 0x87, + 0x9b, 0x2c, 0x77, 0x25, 0xa6, 0xba, 0x73, 0x9a, + 0x3b, 0xe1, 0x4f, 0x50, 0x25, 0x02, 0x08, 0x1f, + 0xf6, 0xf3, 0x65, 0xbe, 0x6c, 0xbd, 0x9f, 0xd6, + 0x7f, 0x42, 0x7f, 0xb7, 0x7b, 0x2d, 0xbd, 0x2f, + 0xef, 0x3f, 0xa1, 0x4f, 0x50, 0x25, 0x02, 0x08, + 0x1f, 0xf6, 0xef, 0x65, 0xbe, 0x6c, 0xbf, 0xbc, + 0x3c, 0x4b, 0x3f, 0xed, 0xe6, 0xcb, 0x6e, 0xb6, + 0x5d, 0x3a, 0xff, 0x00, 0x59, 0xfd, 0x0a, 0x76, + 0x81, 0x28, 0x10, 0x40, 0xff, 0x00, 0xb7, 0x9b, + 0x2f, 0xbd, 0x2f, 0xef, 0x29, 0xe0, 0x0b, 0x3f, + 0xed, 0xe6, 0xcb, 0x6f, 0x4b, 0xfb, 0xcf, 0xe8, + 0x53, 0xb4, 0x09, 0x40, 0x82, 0x07, 0xfd, 0xbc, + 0xd9, 0x6d, 0xe9, 0x7f, 0x79, 0xfd, 0x0b, 0x3f, + 0xed, 0xe6, 0xcb, 0x6f, 0x4b, 0xfb, 0xcf, 0xe8, + 0x53, 0xb4, 0x09, 0x40, 0x82, 0x0b, 0xfd, 0xbc, + 0xd9, 0x6d, 0xe9, 0x7f, 0x79, 0xfd, 0x09, 0xfe, + 0xde, 0x6c, 0xb6, 0xf4, 0xbf, 0xbc, 0xfe, 0x85, + 0x3b, 0x40, 0x94, 0x08, 0x39, 0xa2, 0xc8, 0x72, + 0xa8, 0xb2, 0x67, 0x64, 0xac, 0x2e, 0xf6, 0x37, + 0x82, 0x08, 0x2e, 0xab, 0xa8, 0x4e, 0x2d, 0x74, + 0x51, 0x5f, 0xed, 0xe6, 0xcb, 0x7c, 0xd9, 0x7f, + 0x79, 0xfd, 0x0a, 0x7a, 0x81, 0x28, 0x10, 0x41, + 0x7f, 0xb7, 0x9b, 0x2d, 0xbd, 0x2f, 0xef, 0x3f, + 0xa1, 0x3f, 0xdb, 0xcd, 0x96, 0xde, 0x97, 0xf7, + 0x9f, 0xd0, 0xa7, 0x68, 0x12, 0x81, 0x04, 0x17, + 0xfb, 0x79, 0xb2, 0xdb, 0xd2, 0xfe, 0xf3, 0xfa, + 0x13, 0xfd, 0xbc, 0xd9, 0x6d, 0xe9, 0x7f, 0x79, + 0xfd, 0x0a, 0x76, 0x81, 0x28, 0x10, 0x41, 0x7f, + 0xb7, 0x9b, 0x2d, 0xbd, 0x2f, 0xef, 0x3f, 0xa1, + 0x3f, 0xdb, 0xcd, 0x96, 0xde, 0x97, 0xf7, 0x9f, + 0xd0, 0xa7, 0x68, 0x12, 0x81, 0x04, 0x17, 0xfb, + 0x79, 0xb2, 0xdb, 0xd2, 0xfe, 0xf3, 0xfa, 0x13, + 0xfd, 0xbc, 0xd9, 0x6d, 0xe9, 0x7f, 0x79, 0xfd, + 0x0a, 0x76, 0x81, 0x28, 0x10, 0x41, 0x7f, 0xb7, + 0x9b, 0x2d, 0xbd, 0x2f, 0xef, 0x3f, 0xa1, 0x3f, + 0xdb, 0xcd, 0x96, 0xde, 0x97, 0xf7, 0x9f, 0xd0, + 0xa7, 0x68, 0x12, 0x81, 0x04, 0x17, 0xfb, 0x79, + 0xb2, 0xdb, 0xd2, 0xfe, 0xf3, 0xfa, 0x13, 0xfd, + 0xbc, 0xd9, 0x6d, 0xe9, 0x7f, 0x79, 0xfd, 0x0a, + 0x76, 0x81, 0x28, 0x10, 0x41, 0x7f, 0xb7, 0x9b, + 0x2d, 0xbd, 0x2f, 0xef, 0x3f, 0xa1, 0x3f, 0xdb, + 0xcd, 0x96, 0xde, 0x97, 0xf7, 0x9f, 0xd0, 0xa7, + 0x68, 0x12, 0x81, 0x04, 0x17, 0xfb, 0x79, 0xb2, + 0xdb, 0xd2, 0xfe, 0xf3, 0xfa, 0x17, 0x56, 0x57, + 0xb1, 0xf9, 0x0e, 0x55, 0x7a, 0xcb, 0xeb, 0x40, + 0xf1, 0x34, 0x61, 0xc1, 0xa5, 0xcf, 0xa8, 0xf1, + 0x81, 0x69, 0xdc, 0xde, 0x2a, 0x4e, 0x81, 0x28, + 0x10, 0x46, 0x66, 0xbb, 0x1f, 0x90, 0xe6, 0xd7, + 0xaf, 0xbd, 0xbc, 0xe7, 0x0c, 0xd2, 0x06, 0x87, + 0x16, 0xbe, 0x82, 0x8d, 0x01, 0xa2, 0x82, 0x9d, + 0x85, 0xcb, 0xfe, 0xde, 0xec, 0xbe, 0xf4, 0xbf, + 0xbc, 0xfe, 0x85, 0x3b, 0x40, 0x94, 0x08, 0x20, + 0x7f, 0xdb, 0xcd, 0x96, 0xde, 0x97, 0xf7, 0x9f, + 0xd0, 0x9f, 0xed, 0xee, 0xcb, 0x6f, 0x4b, 0xfb, + 0xcd, 0x5d, 0xe5, 0x3c, 0x88, 0x20, 0x7f, 0xdb, + 0xcd, 0x96, 0xde, 0x97, 0xf7, 0x9f, 0xd0, 0x9f, + 0xed, 0xee, 0xcb, 0x03, 0x5c, 0x32, 0xf2, 0xf4, + 0xf0, 0xe1, 0xaa, 0x9e, 0x44, 0x10, 0x3f, 0xed, + 0xee, 0xcb, 0x68, 0xd1, 0x2e, 0x8d, 0x5f, 0xac, + 0xfe, 0x84, 0xff, 0x00, 0x6f, 0x76, 0x5b, 0x55, + 0x25, 0xfd, 0xe1, 0xe2, 0x53, 0xc8, 0x82, 0x04, + 0xfe, 0x1f, 0x6c, 0xb1, 0xdc, 0x9b, 0xf7, 0xa5, + 0x3f, 0xdb, 0xdd, 0x96, 0xde, 0x97, 0xf7, 0x87, + 0x89, 0x4f, 0x22, 0x08, 0x1f, 0xf6, 0xfb, 0x65, + 0xb7, 0x44, 0xbf, 0xbc, 0x3c, 0x49, 0xfe, 0xdf, + 0x6c, 0xae, 0xf4, 0xbf, 0xbc, 0x3c, 0x4a, 0x79, + 0x10, 0x40, 0xff, 0x00, 0xb7, 0xdb, 0x2d, 0xba, + 0x25, 0xfd, 0xe1, 0xe2, 0x59, 0x67, 0xe1, 0xfe, + 0xca, 0xb5, 0xc1, 0xd8, 0x64, 0x75, 0x37, 0x0c, + 0x8e, 0xa1, 0xec, 0x68, 0xa2, 0x9d, 0x44, 0x1a, + 0xec, 0x72, 0xec, 0xa7, 0x2c, 0x87, 0x99, 0xcb, + 0xed, 0xe3, 0x81, 0x84, 0x00, 0x70, 0x0d, 0x26, + 0x9a, 0xb1, 0x38, 0xe9, 0x3d, 0xd5, 0xb5, 0xce, + 0xc4, 0x6a, 0x4a, 0xc2, 0x51, 0x06, 0x41, 0x15, + 0x50, 0x2e, 0xf2, 0x8f, 0x6c, 0xa9, 0xd0, 0x34, + 0xa8, 0x27, 0x79, 0x47, 0xb6, 0x50, 0x13, 0xf2, + 0x08, 0xbb, 0xec, 0xe2, 0x86, 0x08, 0x1d, 0x7d, + 0x73, 0xa1, 0x8c, 0xd2, 0xda, 0xee, 0xf6, 0x68, + 0x87, 0x08, 0x89, 0x99, 0x9d, 0x34, 0x78, 0x83, + 0x2c, 0x96, 0x50, 0x1f, 0x21, 0xe6, 0xa3, 0x3b, + 0xae, 0xd7, 0xc0, 0xb6, 0x18, 0x72, 0x78, 0x8e, + 0x19, 0x6e, 0x2a, 0xee, 0xc1, 0xe2, 0x05, 0x44, + 0xdf, 0x66, 0xd7, 0x17, 0x8e, 0xd2, 0xe2, 0xd8, + 0xbf, 0x35, 0x83, 0x7b, 0xb2, 0xb8, 0xaa, 0x06, + 0xad, 0x0b, 0x4d, 0x7c, 0xb7, 0xb6, 0xd6, 0xf9, + 0x3c, 0xfc, 0x9f, 0xcc, 0x66, 0x26, 0x62, 0x95, + 0x89, 0x88, 0xf6, 0xca, 0xc3, 0xfe, 0x43, 0xeb, + 0xcf, 0x09, 0xf4, 0x53, 0xfc, 0x87, 0xd7, 0x9e, + 0x13, 0xe8, 0xaa, 0xfe, 0x24, 0xc4, 0xaf, 0xe9, + 0xab, 0xd5, 0x2e, 0x7f, 0xd4, 0x72, 0xf4, 0x55, + 0x60, 0xff, 0x00, 0x21, 0xf5, 0xe7, 0x84, 0xfa, + 0x29, 0xfe, 0x43, 0xeb, 0xcf, 0x09, 0xf4, 0x55, + 0x7f, 0x12, 0x62, 0x51, 0xe9, 0xeb, 0xd5, 0x27, + 0xf5, 0x0c, 0xbd, 0x35, 0x58, 0x3f, 0xc8, 0x7d, + 0x79, 0xe1, 0x3e, 0x8a, 0x7f, 0x90, 0xfa, 0xf3, + 0xc2, 0x7d, 0x15, 0x5f, 0xc4, 0x98, 0x93, 0xd3, + 0xd7, 0xaa, 0x4f, 0xea, 0x19, 0x7a, 0x6a, 0xb0, + 0x7f, 0x90, 0xfa, 0xf3, 0xc2, 0x7d, 0x14, 0xff, + 0x00, 0x21, 0xf5, 0xe7, 0x84, 0xfa, 0x2a, 0xbf, + 0x89, 0x31, 0x27, 0xa7, 0xaf, 0x54, 0x9f, 0xd4, + 0x72, 0xf4, 0x55, 0x60, 0xff, 0x00, 0x21, 0xf5, + 0xe7, 0x84, 0xfa, 0x29, 0xfe, 0x43, 0xeb, 0xcf, + 0x09, 0xf4, 0x55, 0x7f, 0x12, 0x62, 0x4f, 0x4f, + 0x5e, 0xa9, 0x3f, 0xa8, 0xe4, 0xe8, 0xaa, 0xc1, + 0xfe, 0x43, 0xeb, 0xcf, 0x09, 0xf4, 0x53, 0xfc, + 0x87, 0xd7, 0x9e, 0x13, 0xe8, 0xaa, 0xfe, 0x24, + 0xc4, 0x9e, 0x9e, 0xbd, 0x52, 0x7f, 0x50, 0xcb, + 0xd3, 0x55, 0x83, 0xfc, 0x87, 0xd7, 0x9e, 0x13, + 0xe8, 0xa7, 0xf9, 0x0f, 0xaf, 0x3c, 0x27, 0xd1, + 0x55, 0xfc, 0x49, 0x89, 0x3d, 0x3d, 0x7a, 0xa4, + 0xfe, 0xa1, 0x97, 0xa6, 0xab, 0x07, 0xf9, 0x0f, + 0xaf, 0x3c, 0x27, 0xd1, 0x4f, 0xf2, 0x1f, 0x5e, + 0x78, 0x4f, 0xa2, 0xab, 0xf8, 0x93, 0x12, 0x7a, + 0x7a, 0xf5, 0x49, 0xfd, 0x47, 0x27, 0x45, 0x56, + 0x0f, 0xf2, 0x1f, 0x5e, 0x78, 0x4f, 0xa2, 0x9f, + 0xe4, 0x3e, 0xbc, 0xf0, 0x9f, 0x45, 0x57, 0xf1, + 0x26, 0x24, 0xf4, 0xd5, 0xea, 0x93, 0xfa, 0x86, + 0x5e, 0x8a, 0xac, 0x1f, 0xe4, 0x3e, 0xbc, 0xf0, + 0x9f, 0x45, 0x3f, 0xc8, 0x7d, 0x79, 0xe1, 0x3e, + 0x8a, 0xaf, 0xe2, 0x4c, 0x49, 0xe9, 0xab, 0xd5, + 0x27, 0xf5, 0x0c, 0xbd, 0x15, 0x58, 0x3f, 0xc8, + 0x7d, 0x79, 0xe1, 0x3e, 0x8a, 0x7f, 0x90, 0xfa, + 0xf3, 0xc2, 0x7d, 0x15, 0x5f, 0xc4, 0x98, 0x93, + 0xd3, 0xd7, 0xaa, 0x4f, 0xea, 0x19, 0x7a, 0x6a, + 0xb0, 0x7f, 0x90, 0xfa, 0xf3, 0xc2, 0x7d, 0x14, + 0xff, 0x00, 0x21, 0xf5, 0xe7, 0x84, 0xfa, 0x2a, + 0xbf, 0x89, 0x31, 0x27, 0xa7, 0xaf, 0x54, 0x9f, + 0xd4, 0x32, 0xf4, 0xd5, 0x60, 0xff, 0x00, 0x21, + 0xf5, 0xe7, 0x84, 0xfa, 0x29, 0xfe, 0x43, 0xeb, + 0xcf, 0x09, 0xf4, 0x55, 0x7f, 0x12, 0x62, 0x4f, + 0x4f, 0x5e, 0xa9, 0x3f, 0xa8, 0x65, 0xe9, 0xaa, + 0xc1, 0xfe, 0x43, 0xeb, 0xcf, 0x09, 0xf4, 0x53, + 0xfc, 0x87, 0xd7, 0x9e, 0x13, 0xe8, 0xaa, 0xfe, + 0x24, 0xc4, 0x9e, 0x9e, 0xbd, 0x52, 0x7f, 0x50, + 0xcb, 0xd3, 0x55, 0x83, 0xfc, 0x87, 0xd7, 0x9e, + 0x13, 0xe8, 0xa7, 0xf9, 0x0f, 0xaf, 0x3c, 0x27, + 0xd1, 0x55, 0xfc, 0x49, 0x89, 0x3d, 0x3d, 0x7a, + 0xa4, 0xfe, 0xa1, 0x97, 0xa6, 0xab, 0x07, 0xf9, + 0x0f, 0xaf, 0x3c, 0x27, 0xd1, 0x4f, 0xf2, 0x1f, + 0x5e, 0x78, 0x4f, 0xa2, 0xab, 0xf8, 0x93, 0x12, + 0x7a, 0x7a, 0xf5, 0x49, 0xfd, 0x43, 0x2f, 0x4d, + 0x56, 0x0f, 0xf2, 0x1f, 0x5e, 0x78, 0x4f, 0xa2, + 0x9f, 0xe4, 0x3e, 0xbc, 0xf0, 0x9f, 0x45, 0x57, + 0xf1, 0x26, 0x24, 0xf4, 0xf5, 0xea, 0x93, 0xfa, + 0x86, 0x5e, 0x9a, 0xac, 0x1f, 0xe4, 0x3e, 0xbc, + 0xf0, 0x9f, 0x45, 0x3f, 0xc8, 0x7d, 0x79, 0xe1, + 0x3e, 0x8a, 0xaf, 0xe2, 0x4c, 0x49, 0xe9, 0xeb, + 0xd5, 0x27, 0xf5, 0x0c, 0xbd, 0x35, 0x58, 0x3f, + 0xc8, 0x7d, 0x79, 0xe1, 0x3e, 0x8a, 0x7f, 0x90, + 0xfa, 0xf3, 0xc2, 0x7d, 0x15, 0x5f, 0xc4, 0x98, + 0x93, 0xd3, 0xd7, 0xaa, 0x4f, 0xea, 0x19, 0x7a, + 0x6a, 0xb0, 0x7f, 0x90, 0xfa, 0xf3, 0xc2, 0x7d, + 0x14, 0xff, 0x00, 0x21, 0xf5, 0xe7, 0x84, 0xfa, + 0x2a, 0xbf, 0x89, 0x31, 0x27, 0xa7, 0xaf, 0x54, + 0x9f, 0xd4, 0x32, 0xf4, 0xd5, 0x60, 0xff, 0x00, + 0x21, 0xf5, 0xe7, 0x84, 0xfa, 0x29, 0xfe, 0x43, + 0xeb, 0xcf, 0x09, 0xf4, 0x55, 0x7f, 0x12, 0x62, + 0x4f, 0x4d, 0x5e, 0xa9, 0x3f, 0xa8, 0xe4, 0x8f, + 0xd4, 0xaa, 0xc2, 0x19, 0x92, 0xc9, 0xa1, 0x97, + 0x1a, 0x7c, 0xee, 0x30, 0xb1, 0x2e, 0x57, 0x20, + 0x6e, 0x38, 0x1c, 0x25, 0x6e, 0xba, 0x6e, 0xf7, + 0x37, 0xd5, 0x78, 0x9a, 0xeb, 0xd2, 0xba, 0x2c, + 0xf3, 0x1b, 0x8b, 0x37, 0x62, 0x89, 0xc7, 0x07, + 0xe7, 0x30, 0x9d, 0x07, 0xb8, 0xab, 0x6f, 0x2d, + 0x1a, 0x6b, 0x13, 0xaf, 0xc5, 0x7c, 0x7f, 0xcc, + 0x67, 0x5f, 0xae, 0xba, 0x47, 0xfa, 0x5d, 0x64, + 0x10, 0x48, 0xa5, 0x08, 0xd0, 0xe0, 0x75, 0x84, + 0x52, 0x32, 0x08, 0x73, 0x2b, 0x5f, 0x6b, 0x80, + 0x52, 0x56, 0xfe, 0xd1, 0x9b, 0xa2, 0x9a, 0xc1, + 0xec, 0xa8, 0xed, 0xc0, 0xb3, 0x4c, 0x4c, 0x4e, + 0x92, 0xf4, 0x2b, 0x31, 0x68, 0xdd, 0x13, 0xc2, + 0x78, 0xb2, 0xd7, 0x60, 0x70, 0x78, 0xfc, 0xd2, + 0x1d, 0xdc, 0x05, 0x69, 0xdb, 0x3b, 0x72, 0xff, + 0x00, 0x65, 0xbe, 0x67, 0x90, 0xe6, 0xf3, 0x6e, + 0x3b, 0x83, 0xf3, 0x9a, 0x7b, 0xeb, 0x6d, 0x57, + 0x6d, 0xbf, 0x31, 0x7d, 0x68, 0xec, 0xba, 0xec, + 0x68, 0x70, 0xf1, 0x0f, 0x6b, 0x7b, 0xb4, 0xa6, + 0x96, 0xd2, 0xca, 0x65, 0xa6, 0xfc, 0x76, 0xaa, + 0x8d, 0x55, 0x9a, 0xae, 0x9c, 0xd3, 0x28, 0xbb, + 0xca, 0xe5, 0xc1, 0x30, 0xc5, 0x11, 0x34, 0x8a, + 0x60, 0x3c, 0x57, 0x0e, 0x35, 0xc4, 0x5d, 0x42, + 0xb6, 0x45, 0xa2, 0x7c, 0x1e, 0x5d, 0xab, 0xb6, + 0x74, 0x9e, 0x0d, 0x95, 0x4a, 0xad, 0x58, 0x93, + 0x12, 0x9d, 0x51, 0xa3, 0x6d, 0x52, 0xab, 0x56, + 0x24, 0xc4, 0x9a, 0x9a, 0x36, 0xe2, 0x4c, 0x54, + 0x5a, 0xb1, 0x26, 0x25, 0x06, 0x8d, 0x95, 0x0a, + 0x4f, 0x2b, 0xcf, 0xee, 0xb2, 0xc8, 0x5f, 0x14, + 0x0c, 0x63, 0xc3, 0xdd, 0x8e, 0xae, 0xae, 0x83, + 0x40, 0xdd, 0xca, 0x6f, 0x28, 0x8c, 0x49, 0x89, + 0x44, 0xc4, 0x4f, 0x09, 0x5a, 0x26, 0xd5, 0x9d, + 0x6b, 0x3a, 0x4b, 0xbf, 0x30, 0xcd, 0x2e, 0xb3, + 0x19, 0x84, 0xd7, 0x2e, 0x04, 0xb4, 0x51, 0xad, + 0x6e, 0x86, 0x81, 0xd8, 0x0b, 0x96, 0xab, 0x5e, + 0x25, 0x8c, 0x4a, 0x63, 0x87, 0x04, 0x4e, 0xb3, + 0x3a, 0xcc, 0xeb, 0x2d, 0xb5, 0x58, 0xaa, 0xd7, + 0x89, 0x31, 0x29, 0xd5, 0x1a, 0x36, 0xe2, 0x4c, + 0x4b, 0x56, 0x24, 0xc4, 0x9a, 0x9a, 0x36, 0xd7, + 0x75, 0x2a, 0xb5, 0x62, 0x4c, 0x49, 0xa9, 0xa3, + 0x6d, 0x52, 0xab, 0x56, 0x24, 0xc4, 0x9a, 0x9a, + 0x36, 0xd5, 0x2a, 0xb5, 0x62, 0x4c, 0x49, 0xa9, + 0xa3, 0x6d, 0x52, 0xab, 0x56, 0x24, 0xc4, 0x9a, + 0x9a, 0x36, 0xd5, 0x2a, 0xb5, 0x62, 0x4c, 0x49, + 0xa9, 0xa3, 0x6d, 0x56, 0x2a, 0xb5, 0xe2, 0x4c, + 0x4a, 0x13, 0xa3, 0x65, 0x42, 0x55, 0x6b, 0xc4, + 0x98, 0x91, 0x1a, 0x36, 0xd5, 0x62, 0xa1, 0x6b, + 0xc4, 0x98, 0x94, 0xea, 0x68, 0xd9, 0x50, 0x95, + 0x5a, 0xf1, 0x26, 0x24, 0xd4, 0xd1, 0xb6, 0xa9, + 0x55, 0xab, 0x12, 0x62, 0x4d, 0x4d, 0x1b, 0x4b, + 0xab, 0xac, 0xac, 0x55, 0x6b, 0xc4, 0x98, 0x94, + 0x25, 0xb2, 0xbb, 0xda, 0x16, 0x6a, 0xb5, 0x62, + 0x4c, 0x48, 0x68, 0xdb, 0x54, 0xaa, 0xd5, 0x89, + 0x31, 0x29, 0xd5, 0x1a, 0x36, 0xd5, 0x2a, 0xb5, + 0x62, 0x4c, 0x49, 0xa9, 0xa4, 0x73, 0x6d, 0xaa, + 0x55, 0x6a, 0xc4, 0xb6, 0xdb, 0x41, 0x71, 0x77, + 0x33, 0x60, 0xb6, 0x8c, 0xcb, 0x2b, 0xb5, 0x34, + 0x69, 0xe5, 0x1d, 0xc0, 0xa2, 0x66, 0x22, 0x35, + 0x4c, 0x57, 0x5d, 0x34, 0xe3, 0xaf, 0x24, 0x96, + 0xce, 0x5a, 0xba, 0xeb, 0x37, 0x80, 0x0f, 0x26, + 0x13, 0xce, 0xbf, 0xb4, 0xdd, 0x5d, 0xf5, 0x62, + 0xcc, 0xa4, 0x12, 0x5d, 0xbc, 0x8d, 0x21, 0xbe, + 0x2f, 0x02, 0xf5, 0x97, 0x58, 0xc5, 0x90, 0xd8, + 0x90, 0xe2, 0x1f, 0x79, 0x35, 0x0b, 0xdc, 0x37, + 0xf7, 0x87, 0x60, 0x2e, 0x43, 0xaf, 0x4e, 0x93, + 0xba, 0xb2, 0xe4, 0xb6, 0xeb, 0x70, 0xf0, 0x7a, + 0x3e, 0x5f, 0x14, 0xd2, 0x9a, 0x4f, 0x8c, 0xf1, + 0x7b, 0x83, 0xf6, 0xf1, 0xf9, 0xcd, 0xf0, 0xa9, + 0xba, 0xa8, 0x48, 0x3f, 0x6f, 0x1f, 0x9c, 0xdf, + 0x0a, 0x9a, 0xa2, 0xa3, 0xbb, 0x35, 0x51, 0x99, + 0xb7, 0xbd, 0x59, 0xfd, 0xa7, 0xca, 0x14, 0x95, + 0x14, 0x6e, 0x6d, 0xef, 0x56, 0x7f, 0x69, 0xf2, + 0x84, 0x18, 0xca, 0xbd, 0xea, 0xf3, 0xcf, 0x3f, + 0x58, 0xa9, 0x35, 0x19, 0x95, 0x7b, 0xd5, 0xe7, + 0x9e, 0x7e, 0xb1, 0x52, 0x68, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x03, 0x5a, + 0x82, 0x77, 0x94, 0x7b, 0x65, 0x4e, 0x8d, 0x6a, + 0x09, 0xde, 0x51, 0xed, 0x94, 0x19, 0x63, 0x31, + 0xbd, 0xac, 0xf9, 0xe4, 0x37, 0x87, 0x42, 0xd9, + 0xb4, 0x97, 0x18, 0x1f, 0x15, 0x9c, 0x66, 0x8c, + 0x63, 0x71, 0xb8, 0x0e, 0x06, 0xac, 0xd9, 0x7b, + 0xdc, 0x5e, 0x72, 0xe3, 0xda, 0x37, 0x7f, 0x9a, + 0x3c, 0x6f, 0x35, 0xbe, 0x02, 0xba, 0xe0, 0x88, + 0x9b, 0xc6, 0xac, 0xbe, 0x76, 0xd3, 0x18, 0x78, + 0x7b, 0x67, 0x44, 0x76, 0x24, 0xc4, 0xbc, 0x62, + 0x59, 0x07, 0x13, 0x83, 0x7e, 0x71, 0x0d, 0xe1, + 0x2b, 0x67, 0xb5, 0xe4, 0xc4, 0x71, 0xd2, 0x39, + 0xba, 0xad, 0xac, 0xee, 0xee, 0xbf, 0x61, 0x19, + 0x78, 0x07, 0x49, 0xd4, 0x3b, 0x55, 0x5b, 0x27, + 0xcb, 0x33, 0x0b, 0x76, 0xe3, 0x92, 0x12, 0x1b, + 0xba, 0x41, 0x0e, 0xf0, 0x2b, 0x15, 0xec, 0xbd, + 0x59, 0x95, 0xe2, 0xb7, 0x60, 0xfd, 0x5b, 0x43, + 0x5a, 0x35, 0x8d, 0x3b, 0xa5, 0x72, 0xe4, 0xf9, + 0xe8, 0xb8, 0x63, 0xd9, 0x7c, 0xf8, 0xd8, 0xe6, + 0x91, 0x84, 0xf9, 0x35, 0x05, 0x70, 0xee, 0xde, + 0x62, 0x6d, 0x58, 0xfa, 0x61, 0xb6, 0x7c, 0xb6, + 0x08, 0x98, 0xc7, 0x6b, 0x4c, 0x5e, 0xd1, 0xae, + 0xbe, 0xc5, 0x6f, 0x12, 0x62, 0x5d, 0xd3, 0xe5, + 0xef, 0xb9, 0xbf, 0xb8, 0x19, 0x78, 0x6c, 0xb1, + 0x31, 0xd8, 0x85, 0x1c, 0x29, 0xe3, 0x0d, 0xc5, + 0xc7, 0x35, 0xbc, 0xd0, 0x4f, 0xec, 0xf3, 0x36, + 0x92, 0x02, 0x01, 0x6d, 0x6b, 0x5a, 0xea, 0x5d, + 0x62, 0xf1, 0x3a, 0x44, 0x78, 0xe8, 0xcb, 0x6c, + 0x56, 0xaf, 0xb3, 0x5a, 0xf8, 0x6a, 0xf3, 0x89, + 0x31, 0x2e, 0x8b, 0x9c, 0xb6, 0xfa, 0xd2, 0x2e, + 0x76, 0xe1, 0x98, 0x1a, 0x48, 0x6d, 0x6a, 0x35, + 0x9d, 0x5a, 0x96, 0xcb, 0x7c, 0x8f, 0x33, 0x9e, + 0x30, 0xf6, 0xc7, 0x81, 0xa7, 0x4b, 0x71, 0x90, + 0xd3, 0xc1, 0x42, 0x9d, 0xca, 0x73, 0x4f, 0x67, + 0x26, 0xba, 0x6d, 0x9f, 0x0d, 0x7f, 0xf4, 0x72, + 0x03, 0x52, 0xbd, 0x35, 0x92, 0xbc, 0x62, 0x64, + 0x6e, 0x70, 0xdf, 0x68, 0x24, 0x77, 0x96, 0xcb, + 0xcc, 0xba, 0xfa, 0xc4, 0x03, 0x3b, 0x28, 0xd7, + 0x68, 0x0f, 0x06, 0xa3, 0x16, 0xf5, 0x55, 0x97, + 0x20, 0xb5, 0x9e, 0xda, 0xc9, 0xd1, 0xdc, 0x37, + 0x0b, 0xdc, 0xf2, 0xea, 0x03, 0x5d, 0x04, 0x05, + 0x5b, 0xe5, 0x8a, 0xd6, 0x2d, 0x1a, 0x4e, 0xbe, + 0xf5, 0xf1, 0x79, 0x6b, 0xde, 0xf3, 0x4b, 0x6b, + 0x4d, 0x3d, 0xba, 0x6a, 0xaa, 0x12, 0x41, 0xa1, + 0xd0, 0x77, 0x96, 0x31, 0x2e, 0x8c, 0xc6, 0xce, + 0xea, 0xda, 0xe0, 0xf3, 0xad, 0xa1, 0x99, 0xee, + 0xe6, 0xe9, 0x42, 0x48, 0xae, 0xa5, 0xbe, 0x3c, + 0x87, 0x34, 0x7c, 0x61, 0xfc, 0xdb, 0x59, 0x51, + 0x50, 0xd7, 0x3b, 0x4f, 0x75, 0x5b, 0xb9, 0x5d, + 0x22, 0x66, 0x7c, 0x54, 0xec, 0xe4, 0xdd, 0x6a, + 0xed, 0xfb, 0x67, 0xfc, 0x39, 0xb8, 0x31, 0x26, + 0x25, 0xea, 0xea, 0xd6, 0xe2, 0xce, 0x5e, 0x6e, + 0xe1, 0x98, 0x1d, 0x4a, 0x83, 0xac, 0x11, 0xd8, + 0x5b, 0xdd, 0x94, 0x66, 0x4d, 0x8c, 0x4a, 0x61, + 0x25, 0xa6, 0x98, 0x43, 0x48, 0x24, 0xe2, 0xd4, + 0x9b, 0xeb, 0xce, 0x38, 0xf8, 0x2b, 0xdb, 0xbc, + 0xcc, 0xc4, 0x56, 0x75, 0x8f, 0x17, 0x36, 0x24, + 0xc4, 0xbb, 0x9d, 0x90, 0xe6, 0xad, 0x8f, 0x9c, + 0xe6, 0xda, 0x74, 0x54, 0xb0, 0x3a, 0xae, 0xe0, + 0xa5, 0x38, 0x17, 0x8b, 0x5c, 0x9f, 0x31, 0xbb, + 0x8f, 0x9d, 0x8e, 0x30, 0x18, 0xed, 0x45, 0xe4, + 0x36, 0xbe, 0x6e, 0x82, 0x9b, 0xeb, 0xa4, 0xce, + 0xb1, 0xc3, 0xde, 0xb7, 0x63, 0x2e, 0xba, 0x6c, + 0x9e, 0x70, 0xe4, 0xc4, 0xb3, 0x89, 0x66, 0xe6, + 0xde, 0x6b, 0x59, 0x8c, 0x33, 0xb3, 0x03, 0xc6, + 0x9a, 0x6b, 0xa8, 0xdf, 0xaa, 0xd5, 0x89, 0x4e, + 0xbc, 0x35, 0x8e, 0x4a, 0x69, 0xa7, 0x8f, 0x3d, + 0x1d, 0x91, 0xd8, 0x5f, 0xcb, 0x18, 0x92, 0x38, + 0x1c, 0xe6, 0x3b, 0x48, 0x22, 0x9a, 0xb8, 0x56, + 0xa9, 0xa2, 0x9a, 0x07, 0x98, 0xe6, 0x61, 0x8d, + 0xe0, 0x56, 0x87, 0x79, 0x5b, 0x32, 0x97, 0xb5, + 0x99, 0x4d, 0xbb, 0xdd, 0xa1, 0xa1, 0x95, 0x3d, + 0xaa, 0x95, 0x0d, 0xb5, 0x31, 0x06, 0xdc, 0xc1, + 0x2f, 0xac, 0x61, 0x69, 0xfe, 0xcf, 0xff, 0x00, + 0x2b, 0x95, 0x33, 0x4c, 0xdf, 0x6c, 0xf8, 0x6a, + 0xd3, 0x9b, 0xca, 0x56, 0x98, 0x7b, 0x91, 0x33, + 0x33, 0x1b, 0x75, 0x8f, 0xda, 0x70, 0x43, 0x65, + 0x79, 0x3b, 0x31, 0xc3, 0x13, 0xa4, 0x65, 0x68, + 0x1c, 0x29, 0xb9, 0xdd, 0x5e, 0x27, 0x82, 0xe2, + 0xdc, 0xb4, 0x4e, 0xc3, 0x19, 0x7e, 0x96, 0x87, + 0x2b, 0x4e, 0x4e, 0xd6, 0xc3, 0x96, 0x5b, 0x31, + 0xda, 0x1d, 0x26, 0x9e, 0xeb, 0xaa, 0xe1, 0xde, + 0x51, 0x3b, 0x56, 0x69, 0x75, 0x05, 0x75, 0x60, + 0x71, 0x3c, 0x21, 0x2b, 0x9a, 0x6d, 0x7d, 0xbe, + 0x11, 0xcd, 0x6c, 0x9e, 0x56, 0xb4, 0xc1, 0xbf, + 0x59, 0x99, 0x43, 0xe2, 0x4c, 0x4b, 0xb2, 0xdb, + 0x24, 0xcc, 0xae, 0x63, 0xe7, 0x59, 0x1e, 0x16, + 0x9d, 0x5c, 0xe1, 0xc3, 0x51, 0xd8, 0xd0, 0x7b, + 0xeb, 0x5d, 0xde, 0x57, 0x7f, 0x66, 0xce, 0x72, + 0x66, 0x7e, 0xaf, 0x75, 0xed, 0x38, 0x80, 0x3d, + 0xe5, 0xd3, 0xb9, 0x5d, 0x74, 0xd6, 0x19, 0xa7, + 0x0e, 0x48, 0x8d, 0x66, 0xb3, 0xa6, 0x9a, 0xea, + 0xe7, 0xc4, 0x98, 0x96, 0xeb, 0x4c, 0xba, 0xf6, + 0xf2, 0x33, 0x2d, 0xbb, 0x31, 0xb0, 0x1a, 0x12, + 0x48, 0xdc, 0xd6, 0xb7, 0x5b, 0x64, 0x79, 0x9c, + 0xec, 0xe7, 0x1a, 0xc0, 0xd0, 0x09, 0xa6, 0x33, + 0x42, 0x7b, 0x3a, 0x92, 0x72, 0x52, 0x26, 0x62, + 0x67, 0xc0, 0xae, 0x1c, 0x96, 0xfb, 0x6b, 0x33, + 0xcb, 0xde, 0xe3, 0xc4, 0x98, 0x96, 0x6e, 0x20, + 0x9e, 0xd6, 0x53, 0x04, 0xed, 0xc3, 0x23, 0x74, + 0xd3, 0x7c, 0x6f, 0xae, 0xab, 0x6c, 0x97, 0x32, + 0xb9, 0x60, 0x96, 0x38, 0xc3, 0x58, 0xe1, 0xe2, + 0x97, 0x9c, 0x35, 0x1d, 0xd0, 0x52, 0x6f, 0x58, + 0x8a, 0xcc, 0xcf, 0x0b, 0x22, 0xb8, 0xef, 0x69, + 0xd2, 0xb1, 0x33, 0x31, 0xe3, 0xee, 0x72, 0x62, + 0x4c, 0x4b, 0xa2, 0xf3, 0x2a, 0xbf, 0xb3, 0x68, + 0x7c, 0xec, 0xa3, 0x35, 0x63, 0x69, 0xc4, 0xd1, + 0xdb, 0xdd, 0x5a, 0xad, 0x6d, 0x6e, 0xaf, 0x25, + 0xe6, 0xad, 0xd9, 0x8d, 0xc3, 0x49, 0x3a, 0x9a, + 0x07, 0x64, 0xa4, 0x5e, 0xb3, 0x1a, 0xeb, 0xc0, + 0x9c, 0x76, 0x89, 0xdb, 0x35, 0x9d, 0xfa, 0xf8, + 0x68, 0xf1, 0x89, 0x31, 0x2e, 0xc9, 0x72, 0x3c, + 0xce, 0x37, 0xb1, 0x86, 0x30, 0xe2, 0xfd, 0x00, + 0xb0, 0x82, 0x35, 0x56, 0x87, 0x52, 0xe6, 0xbb, + 0xb3, 0xb8, 0xb3, 0x73, 0x59, 0x70, 0xcc, 0x05, + 0xe2, 0xa0, 0x54, 0x1d, 0x09, 0x17, 0xac, 0xf8, + 0x4a, 0x6d, 0x86, 0xf5, 0xd7, 0x5a, 0xce, 0x91, + 0x3a, 0x6a, 0xf1, 0x89, 0x31, 0x2e, 0xbb, 0x6c, + 0x97, 0x31, 0xb9, 0x8c, 0x49, 0x1b, 0x03, 0x5a, + 0xed, 0x46, 0x43, 0x86, 0xa3, 0xb4, 0xb5, 0xde, + 0x65, 0xb7, 0xb6, 0x54, 0x37, 0x0c, 0xa3, 0x0e, + 0x8c, 0x6d, 0x35, 0x09, 0xdc, 0xae, 0xba, 0x6b, + 0xc4, 0x9c, 0x37, 0x8a, 0xee, 0xdb, 0x3b, 0x7e, + 0x0d, 0x18, 0x93, 0x12, 0xdf, 0x0e, 0x59, 0x7f, + 0x71, 0x07, 0xb4, 0x44, 0xcc, 0x51, 0x50, 0x9a, + 0xd4, 0x6e, 0x2d, 0xf0, 0xe4, 0x39, 0x9c, 0xb1, + 0x09, 0x04, 0x61, 0xba, 0x2a, 0x1a, 0xe7, 0x51, + 0xdc, 0x14, 0xf0, 0xa4, 0xde, 0xb1, 0xe3, 0x30, + 0x57, 0x0d, 0xed, 0xa4, 0xd6, 0xb3, 0x3a, 0xf1, + 0x8e, 0x0e, 0x1c, 0x49, 0x89, 0x74, 0xdb, 0xe5, + 0x59, 0x85, 0xc4, 0x8f, 0x89, 0x91, 0x96, 0xba, + 0x33, 0x85, 0xf8, 0xce, 0x1a, 0x1e, 0xe2, 0xd7, + 0x7b, 0x97, 0xde, 0x58, 0xb9, 0xa2, 0xe1, 0x94, + 0x0e, 0xf2, 0x5e, 0x3c, 0x66, 0x9e, 0x1d, 0xd4, + 0xdf, 0x5d, 0x74, 0xd7, 0xe0, 0x4e, 0x2b, 0xc4, + 0x6e, 0x9a, 0xcc, 0x57, 0xdb, 0x2d, 0x58, 0x93, + 0x12, 0xdd, 0x69, 0x97, 0xde, 0x5e, 0xd4, 0xdb, + 0xb2, 0xac, 0x1f, 0x9e, 0xef, 0x15, 0xb5, 0xed, + 0xad, 0xb7, 0x39, 0x36, 0x65, 0x6b, 0x19, 0x95, + 0xf1, 0x87, 0x35, 0xba, 0x49, 0x61, 0xd4, 0x13, + 0x7d, 0x75, 0xd3, 0x5f, 0xfe, 0x24, 0x62, 0xbc, + 0xd7, 0x74, 0x56, 0x7e, 0x5e, 0xc7, 0x26, 0x24, + 0xc4, 0xb6, 0xda, 0x58, 0xdd, 0x5e, 0xe2, 0xf6, + 0x66, 0x73, 0x81, 0x9a, 0x0e, 0x90, 0x35, 0xad, + 0xf0, 0x64, 0xb9, 0x94, 0xe5, 0xc0, 0x46, 0x1b, + 0x80, 0xe1, 0x25, 0xe7, 0x08, 0xa8, 0xde, 0xa0, + 0x4b, 0x5e, 0xb1, 0x33, 0x13, 0x3e, 0x05, 0x71, + 0x64, 0xb6, 0x93, 0x5a, 0xcc, 0xea, 0xe3, 0xc4, + 0xb6, 0x08, 0xe6, 0x2d, 0xc4, 0x18, 0xe2, 0xda, + 0x54, 0x3b, 0x09, 0xa7, 0x0d, 0x17, 0xa9, 0xb2, + 0xfb, 0xd8, 0x2e, 0x19, 0x6d, 0x24, 0x74, 0x96, + 0x4d, 0x11, 0x8a, 0x8a, 0x3b, 0xba, 0xad, 0x56, + 0xb6, 0xd2, 0xb3, 0x26, 0x6d, 0xb3, 0x9b, 0xfa, + 0xd1, 0x11, 0x69, 0x6d, 0x77, 0x74, 0xee, 0xaa, + 0x5f, 0x35, 0x62, 0x2b, 0x31, 0xc7, 0x57, 0x5c, + 0x3e, 0x5a, 0xd9, 0x2d, 0x68, 0x9f, 0xa7, 0x6c, + 0x7b, 0x63, 0xda, 0xa7, 0xe2, 0x4c, 0x4b, 0x37, + 0x16, 0xf3, 0xda, 0xc8, 0x61, 0x9d, 0xb8, 0x5e, + 0xd0, 0x09, 0x15, 0xa8, 0xa2, 0xd7, 0x89, 0x75, + 0xac, 0xeb, 0x1a, 0xb3, 0xcd, 0x27, 0x59, 0x89, + 0xe1, 0x31, 0x29, 0x8d, 0x9e, 0xba, 0xe6, 0xef, + 0xc4, 0x27, 0x4b, 0x26, 0x14, 0xee, 0x80, 0x4a, + 0xe8, 0xbc, 0x87, 0x99, 0xb9, 0x91, 0x83, 0x55, + 0x6a, 0x3b, 0x47, 0x52, 0x89, 0xca, 0x9d, 0xfe, + 0x65, 0x6d, 0xf6, 0x8d, 0xf0, 0xa9, 0xcc, 0xdb, + 0xdf, 0x5d, 0xe6, 0xb7, 0xc0, 0xb2, 0x79, 0x88, + 0x88, 0xb7, 0x0e, 0x4f, 0x57, 0xc8, 0x4c, 0xce, + 0x2b, 0x44, 0xfb, 0x25, 0xc6, 0xb2, 0xdf, 0x28, + 0x76, 0xc7, 0x85, 0x61, 0x1b, 0xe5, 0x0f, 0xcb, + 0x75, 0x71, 0x6b, 0xf0, 0xf0, 0x77, 0xe7, 0x59, + 0xc4, 0x36, 0x13, 0xc5, 0x05, 0xc4, 0x02, 0x78, + 0x27, 0x65, 0x5f, 0xa8, 0x9a, 0xd6, 0x9e, 0x4b, + 0x85, 0x0a, 0x8b, 0x30, 0x6c, 0x55, 0xd7, 0x8d, + 0x57, 0x5b, 0x9d, 0x64, 0x0c, 0x6c, 0xef, 0x69, + 0x09, 0xb6, 0x7e, 0xf1, 0x6d, 0xf6, 0x47, 0xc2, + 0xab, 0xa5, 0x4c, 0x4c, 0xc7, 0x84, 0xab, 0x6a, + 0x45, 0xbc, 0x62, 0x3e, 0x4b, 0x07, 0x57, 0x6c, + 0x5f, 0x4b, 0x77, 0x29, 0xde, 0x82, 0xc7, 0x57, + 0x6c, 0x5f, 0x4b, 0x77, 0x29, 0xde, 0x82, 0x80, + 0x59, 0x6b, 0x1e, 0xf7, 0x61, 0x63, 0x4b, 0x9c, + 0x75, 0x35, 0xa0, 0x93, 0xc0, 0x14, 0xef, 0xb7, + 0x34, 0x76, 0x71, 0xf4, 0xa7, 0xba, 0xbb, 0x62, + 0xfa, 0x5b, 0xb9, 0x4e, 0xf4, 0x13, 0xab, 0xb6, + 0x2f, 0xa5, 0xbb, 0x94, 0xef, 0x41, 0x41, 0x49, + 0x14, 0xb1, 0x1a, 0x48, 0xc7, 0x30, 0x9d, 0x41, + 0xc0, 0xb4, 0xf7, 0xd7, 0x94, 0xdf, 0x6e, 0x67, + 0x67, 0x1f, 0x4a, 0x7f, 0xab, 0xb6, 0x2f, 0xa5, + 0xbb, 0x94, 0xef, 0x41, 0x3a, 0xbb, 0x62, 0xfa, + 0x5b, 0xb9, 0x4e, 0xf4, 0x14, 0x06, 0x84, 0x4d, + 0xf6, 0xe6, 0x76, 0x71, 0xf4, 0xa7, 0xfa, 0xbb, + 0x62, 0xfa, 0x5b, 0xb9, 0x4e, 0xf4, 0x13, 0xab, + 0xb6, 0x2f, 0xa5, 0xbb, 0x94, 0xef, 0x41, 0x41, + 0xc7, 0x04, 0xd2, 0xe9, 0x8a, 0x37, 0xc8, 0x3f, + 0xa8, 0xd2, 0xef, 0x02, 0xf0, 0x41, 0x04, 0x82, + 0x28, 0x46, 0xb0, 0x74, 0x10, 0x9b, 0xed, 0xcc, + 0xec, 0xe3, 0xe9, 0x4f, 0xf5, 0x76, 0xc5, 0xf4, + 0xb7, 0x72, 0x9d, 0xe8, 0x27, 0x57, 0x6c, 0x5f, + 0x4b, 0x77, 0x29, 0xde, 0x82, 0x83, 0x8e, 0x19, + 0xa5, 0xaf, 0x35, 0x1b, 0xa4, 0xa6, 0xbc, 0x2d, + 0x2e, 0xf0, 0x2f, 0x2e, 0x6b, 0x9a, 0xe2, 0xd7, + 0x02, 0xd7, 0x0d, 0x60, 0x8a, 0x10, 0x9b, 0xed, + 0xcc, 0xec, 0xe3, 0xe9, 0x4f, 0x75, 0x76, 0xc5, + 0xf4, 0xb7, 0x72, 0x9d, 0xe8, 0x27, 0x57, 0x6c, + 0x5f, 0x4b, 0x77, 0x29, 0xde, 0x82, 0x80, 0x5e, + 0xd9, 0x0c, 0xb2, 0x35, 0xcf, 0x63, 0x1c, 0xe6, + 0x46, 0x2a, 0xf7, 0x00, 0x48, 0x68, 0xfe, 0xb1, + 0x1a, 0x93, 0x7d, 0xb9, 0x9d, 0x9c, 0x7d, 0x29, + 0xce, 0xae, 0xd8, 0xbe, 0x96, 0xee, 0x53, 0xbd, + 0x04, 0xea, 0xed, 0x8b, 0xe9, 0x6e, 0xe5, 0x3b, + 0xd0, 0x50, 0x1a, 0x02, 0xf6, 0xd8, 0x26, 0x7c, + 0x6e, 0x95, 0x8c, 0x2e, 0x8d, 0x9e, 0x5b, 0x80, + 0x24, 0x0e, 0xd9, 0xdc, 0x4d, 0xf6, 0xe6, 0x76, + 0x71, 0xf4, 0xa7, 0x3a, 0xbb, 0x62, 0xfa, 0x5b, + 0xb9, 0x4e, 0xf4, 0x13, 0xab, 0xb6, 0x2f, 0xa5, + 0xbb, 0x94, 0xef, 0x41, 0x40, 0x61, 0x76, 0x1c, + 0x54, 0x34, 0xdf, 0xdc, 0x4a, 0x26, 0xfb, 0x73, + 0x3b, 0x38, 0xfa, 0x53, 0xfd, 0x5d, 0xb1, 0x7d, + 0x2d, 0xdc, 0xa7, 0x7a, 0x09, 0xd5, 0xdb, 0x17, + 0xd2, 0xdd, 0xca, 0x77, 0xa0, 0xa2, 0x7a, 0xb7, + 0x31, 0xe8, 0xd3, 0x7e, 0xed, 0xdc, 0x4b, 0x0e, + 0xcb, 0xf3, 0x06, 0xb4, 0xb9, 0xd6, 0xd2, 0x80, + 0xd1, 0x52, 0x4b, 0x08, 0x00, 0x0e, 0xe2, 0x6f, + 0xb7, 0x33, 0xb3, 0x8f, 0xa5, 0x2f, 0xd5, 0xdb, + 0x17, 0xd2, 0xdd, 0xca, 0x77, 0xa0, 0x9d, 0x5d, + 0xb1, 0x7d, 0x2d, 0xdc, 0xa7, 0x7a, 0x0a, 0x0e, + 0x58, 0x26, 0x88, 0x34, 0xc8, 0xc7, 0x30, 0x3c, + 0x55, 0xa5, 0xc0, 0x8a, 0x8e, 0xc5, 0x75, 0xaf, + 0x09, 0xbe, 0xdc, 0xce, 0xce, 0x3e, 0x94, 0xff, + 0x00, 0x57, 0x6c, 0x5f, 0x4b, 0x77, 0x29, 0xde, + 0x82, 0x75, 0x76, 0xc5, 0xf4, 0xb7, 0x72, 0x9d, + 0xe8, 0x28, 0x04, 0x4d, 0xf6, 0xe6, 0x76, 0x71, + 0xf4, 0xa7, 0xfa, 0xbb, 0x62, 0xfa, 0x5b, 0xb9, + 0x4e, 0xf4, 0x13, 0xab, 0xb6, 0x2f, 0xa5, 0xbb, + 0x94, 0xef, 0x41, 0x40, 0x22, 0x6f, 0xb7, 0x33, + 0xb3, 0x8f, 0xa5, 0x3f, 0xd5, 0xdb, 0x17, 0xd2, + 0xdd, 0xca, 0x77, 0xa0, 0x9d, 0x5d, 0xb1, 0x7d, + 0x2d, 0xdc, 0xa7, 0x7a, 0x0a, 0x01, 0x6c, 0x86, + 0xde, 0x6b, 0x87, 0xf3, 0x70, 0x37, 0x9c, 0x7d, + 0x0b, 0xa8, 0xdd, 0xc0, 0x34, 0xa6, 0xfb, 0x73, + 0x3b, 0x38, 0xfa, 0x53, 0x7d, 0x5d, 0xb1, 0x7d, + 0x2d, 0xdc, 0xa7, 0x7a, 0x09, 0xd5, 0xdb, 0x17, + 0xd2, 0xdd, 0xca, 0x77, 0xa0, 0xa2, 0x23, 0xb0, + 0xbe, 0x91, 0x81, 0xec, 0xb7, 0x91, 0xed, 0x3a, + 0x88, 0x61, 0x23, 0xb8, 0x40, 0x5a, 0xa5, 0x82, + 0x78, 0x4e, 0x19, 0x63, 0x74, 0x64, 0xee, 0x3d, + 0xa5, 0xbe, 0x14, 0xdf, 0x6e, 0x67, 0x67, 0x1f, + 0x4a, 0x73, 0xab, 0xb6, 0x2f, 0xa5, 0xbb, 0x94, + 0xef, 0x41, 0x3a, 0xbb, 0x62, 0xfa, 0x5b, 0xb9, + 0x4e, 0xf4, 0x14, 0x1c, 0xb0, 0x4d, 0x01, 0x02, + 0x68, 0xdd, 0x19, 0x22, 0xa0, 0x3c, 0x16, 0x9a, + 0x77, 0x56, 0x7d, 0x9a, 0xe3, 0x99, 0xe7, 0xf9, + 0xa7, 0x73, 0x3a, 0xb9, 0xdc, 0x27, 0x0e, 0xf7, + 0x95, 0xa9, 0x37, 0xdb, 0x99, 0xd9, 0xc7, 0xd2, + 0x9b, 0xea, 0xed, 0x8b, 0xe9, 0x6e, 0xe5, 0x3b, + 0xd0, 0x4e, 0xae, 0xd8, 0xbe, 0x96, 0xee, 0x53, + 0xbd, 0x05, 0x05, 0x14, 0x13, 0x4d, 0x8b, 0x9a, + 0x8d, 0xd2, 0x60, 0x15, 0x76, 0x10, 0x4d, 0x06, + 0xf9, 0xa2, 0xd8, 0xdb, 0x3b, 0xc7, 0x45, 0xcf, + 0x36, 0x09, 0x0c, 0x60, 0x13, 0x8c, 0x34, 0xe1, + 0xa0, 0xd7, 0xa6, 0x94, 0x4d, 0xf6, 0xe6, 0x76, + 0x71, 0xf4, 0xa6, 0x7a, 0xbb, 0x62, 0xfa, 0x5b, + 0xb9, 0x4e, 0xf4, 0x13, 0xab, 0xb6, 0x2f, 0xa5, + 0xbb, 0x94, 0xef, 0x41, 0x40, 0x76, 0x56, 0xe9, + 0x2d, 0x2e, 0xe2, 0x8f, 0x9c, 0x92, 0x09, 0x18, + 0xc3, 0x4f, 0x19, 0xcd, 0x20, 0x69, 0xd5, 0xa4, + 0x84, 0xdf, 0x6e, 0x67, 0x67, 0x1f, 0x4a, 0x67, + 0xab, 0xb6, 0x2f, 0xa5, 0xbb, 0x94, 0xef, 0x41, + 0x3a, 0xbb, 0x62, 0xfa, 0x5b, 0xb9, 0x4e, 0xf4, + 0x14, 0x14, 0x51, 0xc9, 0x2c, 0x8d, 0x8a, 0x26, + 0x97, 0xbd, 0xe7, 0x0b, 0x5a, 0x35, 0x92, 0xbd, + 0x73, 0x13, 0x73, 0xc6, 0x06, 0xb0, 0x99, 0x41, + 0xc3, 0x81, 0xa2, 0xa6, 0xa3, 0x70, 0x51, 0x37, + 0xdb, 0x99, 0xd9, 0xc7, 0xd2, 0x9b, 0xea, 0xed, + 0x8b, 0xe9, 0x6e, 0xe5, 0x3b, 0xd0, 0x4e, 0xae, + 0xd8, 0xbe, 0x96, 0xee, 0x53, 0xbd, 0x05, 0x13, + 0x3e, 0x5b, 0x7f, 0x6e, 0xce, 0x72, 0x6b, 0x79, + 0x18, 0xcd, 0xd7, 0x53, 0x57, 0x6e, 0x8b, 0x9c, + 0x34, 0x92, 0x00, 0x18, 0x8e, 0xa6, 0x81, 0xba, + 0x4a, 0x6f, 0xb7, 0x33, 0xb3, 0x8f, 0xa5, 0x3d, + 0xd5, 0xdb, 0x17, 0xd2, 0xdd, 0xca, 0x77, 0xa0, + 0x9d, 0x5d, 0xb1, 0x7d, 0x2d, 0xdc, 0xa7, 0x7a, + 0x0a, 0x2c, 0xe5, 0x59, 0x93, 0x63, 0xe7, 0x4d, + 0xac, 0x98, 0x77, 0x0e, 0x13, 0xab, 0xc2, 0xb9, + 0xa1, 0x86, 0x69, 0xdf, 0x82, 0x16, 0x19, 0x1f, + 0xaf, 0x0b, 0x41, 0x71, 0xa0, 0xed, 0x26, 0xfb, + 0x73, 0x3b, 0x38, 0xfa, 0x53, 0xdd, 0x5d, 0xb1, + 0x7d, 0x2d, 0xdc, 0xa7, 0x7a, 0x09, 0xd5, 0xdb, + 0x15, 0xd2, 0x9f, 0xca, 0x77, 0xa0, 0xa1, 0xdf, + 0x61, 0x7c, 0xc0, 0x5c, 0xfb, 0x69, 0x43, 0x46, + 0xb7, 0x16, 0x3a, 0x83, 0xbc, 0xb9, 0xd3, 0x7d, + 0xb9, 0x9d, 0xac, 0x7d, 0x30, 0xb0, 0x8b, 0x1d, + 0x8b, 0x88, 0xe2, 0xe7, 0x9f, 0x2d, 0x34, 0xe0, + 0xab, 0x8d, 0x78, 0x1a, 0x17, 0x56, 0x5f, 0x9c, + 0xe5, 0x8c, 0xbb, 0x82, 0xc7, 0x2b, 0xb6, 0xe6, + 0xe3, 0x95, 0xd4, 0x74, 0x84, 0x06, 0xf1, 0x92, + 0x7b, 0x6a, 0xa8, 0xbb, 0xb2, 0x3f, 0xe7, 0x16, + 0x9f, 0x69, 0xf2, 0x15, 0x13, 0x6b, 0x4f, 0x8c, + 0xa6, 0x31, 0xd6, 0x3c, 0x22, 0x16, 0x3c, 0xd3, + 0xdf, 0x5f, 0xd8, 0xa5, 0x38, 0x17, 0x2a, 0xea, + 0xcd, 0x3d, 0xf6, 0x4e, 0xe7, 0x81, 0x72, 0xa8, + 0x59, 0xee, 0x0f, 0xdb, 0x47, 0xe7, 0x37, 0xc2, + 0xa6, 0x94, 0x2c, 0x1f, 0xb6, 0x8f, 0xce, 0x6f, + 0x85, 0x4d, 0x20, 0x28, 0xdc, 0xdb, 0xde, 0xac, + 0xfe, 0xd3, 0xe5, 0x0a, 0x49, 0x46, 0xe6, 0xde, + 0xf5, 0x67, 0xf6, 0x9f, 0x28, 0x41, 0x8c, 0xab, + 0xde, 0xaf, 0x3c, 0xf3, 0xf5, 0x8a, 0x93, 0x51, + 0x99, 0x57, 0xbd, 0x5e, 0x79, 0xe7, 0xeb, 0x15, + 0x26, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x35, 0xa8, 0x27, 0x79, 0x47, + 0xb6, 0x54, 0xe8, 0xd6, 0xa0, 0x9d, 0xe5, 0x1e, + 0xd9, 0x41, 0xba, 0xcb, 0xde, 0xe2, 0xf3, 0x94, + 0x7e, 0xd2, 0xba, 0x99, 0xb3, 0xc7, 0xf5, 0x59, + 0xe0, 0x2a, 0x42, 0xcb, 0xde, 0xe1, 0xf3, 0x82, + 0x8d, 0xda, 0x83, 0x4c, 0xda, 0x4f, 0x35, 0x9e, + 0x02, 0xba, 0xe0, 0xfb, 0xd9, 0x7c, 0xf7, 0x1c, + 0x51, 0xfb, 0x48, 0xdc, 0x48, 0x1e, 0x41, 0xa8, + 0xd7, 0xb8, 0x77, 0x88, 0xd3, 0x55, 0xab, 0x12, + 0xf7, 0x08, 0x6b, 0xe6, 0x8d, 0x8e, 0x34, 0x6b, + 0x9e, 0xd6, 0x93, 0xd8, 0x27, 0x4f, 0x79, 0x6a, + 0xdd, 0xa6, 0xb3, 0x2f, 0x32, 0x23, 0x5e, 0x11, + 0xc2, 0x75, 0x5c, 0x72, 0xec, 0xda, 0xc7, 0x31, + 0xb7, 0x11, 0x4e, 0xe6, 0x89, 0x0b, 0x70, 0xc9, + 0x13, 0xf7, 0x7b, 0x21, 0x73, 0x5f, 0xec, 0xbc, + 0x2f, 0x18, 0xac, 0x9f, 0xcd, 0xbb, 0x58, 0x89, + 0xda, 0x58, 0x7b, 0x47, 0x71, 0x72, 0x67, 0x3b, + 0x3f, 0x05, 0x8d, 0x93, 0xae, 0x6d, 0xdf, 0x24, + 0x8f, 0x69, 0x1a, 0x0e, 0x9a, 0x02, 0x7b, 0x0b, + 0x7e, 0xc9, 0xdd, 0xdd, 0xcd, 0xcf, 0xc5, 0x23, + 0x8b, 0xe1, 0x60, 0xab, 0x4b, 0xb4, 0xd1, 0xdf, + 0x34, 0x15, 0x9e, 0x78, 0x44, 0xda, 0x93, 0xc2, + 0x3c, 0x62, 0x5e, 0x86, 0xbb, 0xaf, 0x5c, 0x39, + 0xa9, 0xac, 0xcd, 0x7e, 0x9b, 0x55, 0xcb, 0x90, + 0x3e, 0x5b, 0x2c, 0xe0, 0xda, 0xce, 0x30, 0xba, + 0x40, 0x58, 0xe0, 0x74, 0xd1, 0xc3, 0x48, 0xe1, + 0x5d, 0x79, 0xb5, 0xa6, 0x3d, 0xa1, 0xb4, 0xa0, + 0xd1, 0x36, 0x12, 0x7b, 0x71, 0x9a, 0x93, 0xe0, + 0x5c, 0x59, 0xfc, 0xe2, 0xdf, 0x3d, 0x64, 0xf1, + 0xf9, 0x51, 0x08, 0xdc, 0xf1, 0xbf, 0x42, 0x7e, + 0x45, 0x66, 0x7d, 0xbb, 0x27, 0xb9, 0xb6, 0xbb, + 0x14, 0x3c, 0xd0, 0x71, 0x1d, 0xa7, 0x0d, 0x09, + 0x6b, 0x69, 0x35, 0xbf, 0x86, 0xe8, 0x31, 0x63, + 0x89, 0xad, 0xb1, 0x6b, 0xae, 0xcb, 0xf0, 0xe7, + 0xb5, 0x17, 0x9f, 0x5c, 0xc6, 0x6f, 0x6c, 0x6d, + 0xa4, 0xfd, 0x9f, 0x38, 0x24, 0x93, 0x87, 0x45, + 0x7b, 0x6b, 0xab, 0x3d, 0x19, 0x99, 0xb7, 0x61, + 0xcb, 0xaa, 0xd7, 0x35, 0xd5, 0x78, 0x6d, 0x31, + 0x11, 0x4d, 0x14, 0xaa, 0xaf, 0xe7, 0x2e, 0x75, + 0xfe, 0x7a, 0xfb, 0x78, 0xc8, 0x04, 0x11, 0x0c, + 0x64, 0xea, 0xa8, 0xfe, 0x95, 0xd9, 0x26, 0x65, + 0x9b, 0xe4, 0x7c, 0xd3, 0x2f, 0x0b, 0x2e, 0x23, + 0x70, 0x38, 0x74, 0x90, 0x40, 0x6e, 0xbf, 0x19, + 0x36, 0x70, 0xa6, 0x9a, 0x4c, 0xf8, 0xe9, 0x28, + 0x8c, 0xd3, 0xae, 0x68, 0xb6, 0xb5, 0xae, 0xed, + 0x37, 0x47, 0xb1, 0x8b, 0xfc, 0xf0, 0x4d, 0x60, + 0xeb, 0x3b, 0x98, 0x24, 0x6d, 0xc1, 0x68, 0x15, + 0x78, 0x00, 0x62, 0x07, 0xca, 0x52, 0x7b, 0x3d, + 0x79, 0x3d, 0xdd, 0x89, 0x92, 0xe1, 0xdc, 0xe3, + 0xf9, 0xc2, 0x01, 0xa0, 0x14, 0x00, 0x0d, 0x1a, + 0x16, 0x33, 0x26, 0xdb, 0xe6, 0x39, 0x31, 0xba, + 0x73, 0x30, 0xbb, 0x9b, 0xe7, 0x18, 0x4f, 0x94, + 0xda, 0x69, 0x5a, 0x76, 0x46, 0x87, 0x2c, 0x75, + 0x35, 0xf3, 0xae, 0xaf, 0x6f, 0x0b, 0x6a, 0xab, + 0x3b, 0x67, 0x1f, 0x08, 0xd2, 0x62, 0x78, 0xff, + 0x00, 0xe8, 0xbd, 0x37, 0xd7, 0x37, 0x1b, 0x6f, + 0xad, 0xab, 0xc3, 0xff, 0x00, 0x57, 0x36, 0x59, + 0x34, 0xf7, 0xf9, 0xd1, 0x37, 0x2f, 0xe7, 0x1b, + 0x6d, 0x8f, 0x9b, 0x69, 0x00, 0x50, 0x93, 0x45, + 0xd1, 0x9c, 0xcd, 0x9d, 0x8b, 0xe6, 0x0b, 0x26, + 0x3f, 0x99, 0x63, 0x41, 0xf1, 0x00, 0x2d, 0x73, + 0x8d, 0x6a, 0x1c, 0xb8, 0xb6, 0x79, 0xe1, 0x99, + 0xe5, 0xc3, 0x1d, 0xa0, 0xb8, 0x3c, 0x01, 0xda, + 0x75, 0x56, 0xdc, 0xff, 0x00, 0x35, 0xcc, 0x6c, + 0xf3, 0x06, 0xc3, 0x6e, 0xfc, 0x2c, 0x7b, 0x1a, + 0x5a, 0xd2, 0xd0, 0x6a, 0x4d, 0x46, 0x8a, 0x85, + 0x33, 0x13, 0x6b, 0xe9, 0x11, 0x1e, 0x0a, 0xd7, + 0xe9, 0xc5, 0x69, 0xb4, 0xdb, 0x74, 0xdf, 0x49, + 0xdb, 0xe3, 0xff, 0x00, 0xc1, 0xd7, 0xb5, 0x11, + 0x07, 0xe5, 0x82, 0x62, 0x28, 0xf8, 0xde, 0xd2, + 0x0e, 0xee, 0x9d, 0x61, 0x75, 0xdd, 0x5c, 0xbe, + 0xd7, 0x27, 0x37, 0x0c, 0xf2, 0xe3, 0x89, 0xb8, + 0x49, 0xd5, 0x53, 0x46, 0xd7, 0xbe, 0xa0, 0xf3, + 0xa6, 0xe7, 0x51, 0x58, 0x56, 0xf6, 0xe1, 0x8f, + 0x85, 0xce, 0x68, 0x2d, 0x6b, 0x68, 0x6a, 0x4e, + 0x85, 0x2d, 0x9b, 0x1f, 0xfe, 0xb9, 0x27, 0xd9, + 0x33, 0xc2, 0xd4, 0xd3, 0x85, 0x35, 0xe3, 0xf5, + 0x4a, 0xf1, 0x6f, 0xaf, 0x2d, 0xa2, 0x26, 0x3e, + 0x88, 0xf1, 0xfc, 0x58, 0xd9, 0xeb, 0xeb, 0x9b, + 0xdb, 0x59, 0x1d, 0x70, 0xec, 0x6f, 0x63, 0xe8, + 0x1d, 0x4a, 0x68, 0x21, 0x72, 0x5b, 0x66, 0xf7, + 0x6f, 0xcf, 0xfd, 0x8c, 0x10, 0x2d, 0x83, 0xdd, + 0x18, 0x8c, 0x01, 0xa9, 0xa0, 0x81, 0x43, 0xdc, + 0x5e, 0xb6, 0x3c, 0xd6, 0xce, 0x7f, 0xb4, 0x1e, + 0x05, 0x1d, 0x62, 0x7f, 0xfb, 0x51, 0xfb, 0x79, + 0x7f, 0xbe, 0x9b, 0x2b, 0xbb, 0x27, 0x0f, 0x08, + 0x53, 0x7d, 0xfb, 0x7e, 0x5f, 0xea, 0x9f, 0xaa, + 0xdc, 0x5d, 0x5b, 0x5c, 0x1a, 0xd9, 0xad, 0xdc, + 0x06, 0x92, 0xd7, 0x02, 0x7b, 0x00, 0x85, 0x01, + 0x89, 0x4f, 0x6d, 0x91, 0xa4, 0xb6, 0xbe, 0x6b, + 0xfc, 0x21, 0x57, 0x31, 0x2e, 0xd8, 0x7f, 0x86, + 0xcb, 0xe6, 0xa3, 0xfd, 0xeb, 0x7c, 0x61, 0x72, + 0x81, 0xc4, 0x6c, 0xe0, 0x70, 0xd4, 0x2d, 0xdc, + 0x6b, 0xdc, 0x72, 0xd1, 0x9e, 0x87, 0x5d, 0xe5, + 0x36, 0x97, 0x0d, 0xd2, 0xf2, 0xe6, 0x70, 0xbc, + 0x50, 0x8e, 0x15, 0xbe, 0xd8, 0xff, 0x00, 0xf5, + 0x7e, 0xd5, 0xbb, 0xfc, 0x0e, 0x5e, 0x72, 0x07, + 0x32, 0xf3, 0x26, 0x64, 0x72, 0x78, 0xdc, 0xcc, + 0x94, 0xe4, 0xbb, 0x18, 0xf0, 0xae, 0x1a, 0xe9, + 0x33, 0x68, 0xf6, 0x5b, 0x46, 0xd9, 0x8d, 0xda, + 0x53, 0xaf, 0x1c, 0x4f, 0xfe, 0xd9, 0x74, 0x5c, + 0xc8, 0x22, 0xbd, 0xcb, 0xad, 0x19, 0xa3, 0xca, + 0x24, 0x76, 0x1a, 0xdc, 0x21, 0x46, 0x6d, 0x53, + 0xda, 0xdb, 0xeb, 0x42, 0xf1, 0x89, 0x81, 0x87, + 0x10, 0x1a, 0xc8, 0xc4, 0x2a, 0x16, 0xdb, 0x8b, + 0x8e, 0x73, 0x6a, 0xed, 0xe3, 0xae, 0x88, 0x5a, + 0x5b, 0x4e, 0xcb, 0x9a, 0x5c, 0x56, 0xbd, 0xa2, + 0x85, 0xb7, 0x19, 0xbd, 0x84, 0x2f, 0xf2, 0x24, + 0x04, 0x3b, 0xb5, 0x88, 0x55, 0x4d, 0x23, 0x4b, + 0x57, 0x5e, 0x5a, 0xab, 0x96, 0x77, 0x63, 0xc9, + 0x11, 0xd7, 0x14, 0xf9, 0x31, 0x77, 0x9e, 0xdc, + 0xde, 0xc4, 0xc8, 0x72, 0xa8, 0xa5, 0x63, 0x81, + 0xf1, 0x9c, 0x1a, 0x29, 0x41, 0xa8, 0x55, 0x49, + 0xca, 0xd9, 0xdd, 0x92, 0x3d, 0xb7, 0x82, 0xb3, + 0x88, 0x1c, 0x64, 0xf3, 0x9a, 0x31, 0x7c, 0x8b, + 0x9b, 0x3d, 0xbf, 0x7e, 0x51, 0x6d, 0x0c, 0x76, + 0x8d, 0x6c, 0x7c, 0xe1, 0xc2, 0x09, 0x1a, 0x00, + 0x1b, 0xc3, 0x7d, 0x6e, 0x86, 0x59, 0xa7, 0xd9, + 0xd7, 0xcb, 0x3e, 0x99, 0x5f, 0x6f, 0x21, 0x71, + 0x3a, 0x35, 0x87, 0x2a, 0xce, 0x9a, 0x56, 0xd1, + 0x1a, 0x46, 0xbc, 0x39, 0xaf, 0x5d, 0x77, 0xde, + 0xb6, 0xb4, 0xcd, 0xb6, 0x78, 0x7e, 0xaf, 0xe0, + 0xd3, 0xb2, 0x87, 0xfc, 0xb9, 0xff, 0x00, 0x6a, + 0x7c, 0x00, 0xae, 0x7b, 0x1c, 0xe6, 0xf2, 0x6c, + 0xf0, 0xdb, 0x39, 0xc3, 0x98, 0x2f, 0x7c, 0x62, + 0x30, 0x35, 0x06, 0x56, 0x86, 0xbd, 0xc5, 0xbf, + 0x64, 0x8d, 0x72, 0xe7, 0xfd, 0xab, 0xbc, 0x0a, + 0x27, 0x29, 0x3f, 0xfd, 0x94, 0x0f, 0xf1, 0xa5, + 0xfe, 0xfa, 0xbe, 0xd8, 0x99, 0xcb, 0xee, 0x8d, + 0x5c, 0xb7, 0xda, 0x29, 0xe5, 0xf4, 0x9d, 0x37, + 0x4f, 0x1d, 0x3e, 0x2e, 0xdd, 0xa9, 0x31, 0xb2, + 0xf6, 0xd1, 0xef, 0x15, 0x18, 0x6a, 0xfd, 0xfc, + 0x21, 0xc0, 0xa5, 0xde, 0x79, 0x71, 0x7b, 0x0c, + 0x71, 0x65, 0x51, 0xca, 0xd2, 0x08, 0xc6, 0x5a, + 0xdd, 0xca, 0x68, 0x00, 0xea, 0x0b, 0x66, 0xd1, + 0x42, 0xdb, 0x8c, 0xd7, 0x2f, 0x81, 0xde, 0x4c, + 0x9a, 0x1d, 0xda, 0xc4, 0x16, 0xdc, 0xf7, 0x30, + 0x93, 0x29, 0xb6, 0x8a, 0x3b, 0x36, 0x36, 0x3c, + 0x44, 0xb4, 0x38, 0x8d, 0x0d, 0x00, 0x6f, 0x28, + 0x89, 0x8d, 0x31, 0xfb, 0x67, 0x49, 0xf1, 0xf0, + 0x32, 0x45, 0xab, 0x39, 0xef, 0xac, 0xd6, 0x91, + 0xa6, 0xbb, 0x7e, 0xef, 0xc1, 0xd7, 0x2b, 0x67, + 0x76, 0x45, 0x20, 0xbd, 0xd3, 0x38, 0x81, 0xc6, + 0x41, 0xfd, 0x60, 0x09, 0xae, 0x85, 0xcb, 0xb2, + 0xd1, 0x35, 0xb6, 0x0f, 0x9b, 0xf3, 0xa4, 0x79, + 0x1d, 0xc6, 0xff, 0x00, 0xf2, 0xb7, 0x47, 0x2c, + 0xf2, 0xec, 0xe3, 0xa4, 0x9c, 0x93, 0x2c, 0x96, + 0xef, 0x73, 0x9c, 0x45, 0x0e, 0x90, 0xed, 0xce, + 0xd2, 0xd5, 0xb2, 0x6f, 0x0f, 0xca, 0x8b, 0x35, + 0xb9, 0xb2, 0x3a, 0xbd, 0x8a, 0xaa, 0xc6, 0xbb, + 0x2d, 0xfb, 0x4e, 0xbc, 0x3b, 0xd8, 0xe7, 0x8c, + 0xff, 0x00, 0xb7, 0x3c, 0x7e, 0x3a, 0x69, 0xab, + 0x9f, 0x2b, 0xce, 0xae, 0xee, 0x73, 0x77, 0x41, + 0x33, 0x81, 0x85, 0xe5, 0xe2, 0x36, 0x53, 0xc9, + 0xa6, 0xad, 0x3d, 0xc5, 0x9c, 0xfa, 0x21, 0x3e, + 0x75, 0x63, 0x0b, 0x86, 0x87, 0x8a, 0x11, 0xd8, + 0x0e, 0xaa, 0xe2, 0xc9, 0x2c, 0xee, 0x19, 0x9f, + 0x51, 0xcc, 0x73, 0x5b, 0x01, 0x91, 0xce, 0x71, + 0x04, 0x0d, 0x35, 0x03, 0x4f, 0x75, 0x77, 0xe7, + 0x0f, 0x6b, 0x36, 0x83, 0x2d, 0x2e, 0xd0, 0x29, + 0x4e, 0x17, 0x51, 0x5f, 0x84, 0x5e, 0x36, 0xf4, + 0xb9, 0x6b, 0x92, 0x70, 0xda, 0x6f, 0xac, 0x4f, + 0x73, 0xdb, 0xc9, 0xd5, 0x9e, 0x3b, 0x32, 0x64, + 0x11, 0x47, 0x97, 0x35, 0xc0, 0x92, 0x71, 0xba, + 0x30, 0x2a, 0xd0, 0x06, 0x85, 0x99, 0x19, 0x35, + 0xd6, 0x44, 0x45, 0xdb, 0x08, 0x9f, 0x9a, 0x24, + 0x87, 0x6b, 0xc4, 0xd0, 0x68, 0x56, 0x9d, 0xa5, + 0xbf, 0xbc, 0xb1, 0x8a, 0x09, 0x2d, 0x9d, 0x80, + 0x39, 0xce, 0x12, 0x1a, 0x03, 0xb9, 0x56, 0xeb, + 0xd4, 0xb8, 0x8c, 0x99, 0xfc, 0xb9, 0x61, 0xbc, + 0x7d, 0xc3, 0x1b, 0x03, 0xe3, 0x2f, 0x73, 0x4b, + 0x40, 0x76, 0x1a, 0x76, 0x15, 0x6b, 0x13, 0xa5, + 0x67, 0x87, 0x8c, 0xfc, 0x5d, 0x2f, 0x68, 0x8b, + 0xe4, 0xaf, 0xd7, 0x3c, 0x23, 0x87, 0x0d, 0xbe, + 0x1e, 0xc4, 0x96, 0xcf, 0x1f, 0xf2, 0x78, 0xdd, + 0x4a, 0x8f, 0x18, 0xd3, 0xba, 0xb8, 0xf2, 0x1c, + 0xe2, 0xf2, 0xf6, 0xf6, 0x58, 0xe6, 0x70, 0x74, + 0x65, 0xa5, 0xec, 0x68, 0x00, 0x61, 0xa1, 0x14, + 0x1c, 0x05, 0x76, 0x6c, 0xef, 0xf2, 0x46, 0x7f, + 0x6a, 0x8a, 0x17, 0x64, 0x48, 0x39, 0x83, 0xbe, + 0xc4, 0xf8, 0x5a, 0xa6, 0x62, 0x27, 0xb9, 0x33, + 0x1e, 0xf5, 0x62, 0xd6, 0x8f, 0x4f, 0x11, 0x3a, + 0x6e, 0x88, 0x77, 0x67, 0x79, 0xb5, 0xd5, 0x9e, + 0x65, 0x1c, 0x36, 0xee, 0x0c, 0x60, 0x0d, 0x74, + 0x82, 0x95, 0xc4, 0x5c, 0x69, 0xa4, 0xae, 0x9d, + 0xa8, 0x00, 0xe5, 0xa0, 0xd3, 0x4b, 0x64, 0x6d, + 0x3b, 0xb5, 0x0a, 0x1b, 0x6a, 0x0d, 0x33, 0x91, + 0xe6, 0xc7, 0xe1, 0x53, 0x3b, 0x52, 0x69, 0x95, + 0x1f, 0xb4, 0x6f, 0xca, 0x91, 0xc2, 0x70, 0xcc, + 0x13, 0x69, 0x98, 0xf3, 0x11, 0x33, 0xc2, 0x26, + 0x34, 0x86, 0xf7, 0xc7, 0x3d, 0xae, 0x4a, 0x23, + 0xb2, 0x66, 0x29, 0x84, 0x6d, 0x0c, 0x03, 0x5d, + 0x4d, 0x01, 0x77, 0x72, 0xab, 0x5e, 0x4a, 0xec, + 0xc2, 0x4b, 0x59, 0x23, 0xcc, 0x58, 0xfa, 0xe3, + 0xa3, 0x4c, 0x80, 0x0a, 0xb4, 0x8d, 0x5a, 0x17, + 0xbc, 0xc6, 0xe6, 0x68, 0x72, 0x37, 0x5c, 0xda, + 0x9f, 0x1d, 0xb1, 0xb1, 0xcd, 0x34, 0xae, 0x8a, + 0xb6, 0xba, 0x3b, 0x4a, 0x2b, 0x2c, 0xb9, 0xda, + 0x0c, 0xc2, 0x27, 0x4b, 0x0d, 0xc3, 0x1a, 0xd6, + 0xbb, 0x0d, 0x5c, 0xd0, 0x6b, 0xda, 0xa0, 0x55, + 0x8d, 0x66, 0xb6, 0xf0, 0xfb, 0xb5, 0xd7, 0xda, + 0xbc, 0xda, 0x2b, 0x93, 0x1c, 0x7d, 0x53, 0xad, + 0x3e, 0xda, 0xf8, 0x4b, 0xa7, 0x67, 0x23, 0xe6, + 0xee, 0xb3, 0x08, 0x86, 0x80, 0xc9, 0x28, 0x06, + 0xf0, 0xab, 0xa8, 0x16, 0xa9, 0xf3, 0x9b, 0xb6, + 0xe7, 0xc2, 0xd1, 0x8e, 0x02, 0xdf, 0x9c, 0x64, + 0x4e, 0x65, 0x06, 0x9a, 0xd2, 0xa6, 0xbd, 0xd5, + 0xef, 0x65, 0x9c, 0xf7, 0x4f, 0x7e, 0xe7, 0xb8, + 0x39, 0xe5, 0xfe, 0x3b, 0x86, 0xa2, 0x41, 0x20, + 0xa8, 0xcb, 0x83, 0xff, 0x00, 0xda, 0x4d, 0x3a, + 0x53, 0x3c, 0x2d, 0x57, 0xd3, 0xeb, 0xbc, 0x4f, + 0x1d, 0x2a, 0xe3, 0xba, 0xd5, 0xc3, 0x86, 0x62, + 0x66, 0xba, 0xdf, 0xdb, 0xe2, 0x97, 0xda, 0x99, + 0x1f, 0x04, 0x56, 0xd3, 0xc7, 0xe2, 0xca, 0xc9, + 0x0e, 0x07, 0x6f, 0x68, 0xfe, 0x85, 0xd9, 0x69, + 0x73, 0x34, 0x99, 0x23, 0x2e, 0x9c, 0xea, 0xcc, + 0x61, 0x2e, 0x2f, 0xa6, 0xe8, 0xae, 0x9a, 0x2e, + 0x0d, 0xb1, 0x34, 0xb5, 0x83, 0xed, 0x3e, 0x45, + 0xd3, 0x97, 0xd4, 0xec, 0xd4, 0x74, 0xd7, 0xec, + 0xee, 0xf0, 0x15, 0x5e, 0x1d, 0xba, 0xcf, 0xfa, + 0x9d, 0xb5, 0x9e, 0xfe, 0x4e, 0x3c, 0x36, 0x78, + 0x2a, 0x93, 0xdd, 0xcf, 0x75, 0x27, 0x3d, 0x70, + 0xec, 0x72, 0x90, 0x01, 0x75, 0x29, 0xa0, 0x54, + 0x6a, 0xee, 0xad, 0x78, 0x96, 0xac, 0x5a, 0x13, + 0x12, 0xd5, 0x59, 0xe1, 0x1a, 0x3c, 0xb9, 0xd6, + 0x75, 0x99, 0xe7, 0x3e, 0x3e, 0x2e, 0xfc, 0xa5, + 0xdf, 0xe6, 0x76, 0xbf, 0x6a, 0xdf, 0x0a, 0x9f, + 0xcd, 0x7d, 0xf1, 0xde, 0x6b, 0x7c, 0x0a, 0xbb, + 0x94, 0x1f, 0xf3, 0x4b, 0x5f, 0xb5, 0x6f, 0x85, + 0x58, 0xb3, 0x6f, 0x7d, 0x77, 0x9a, 0xdf, 0x02, + 0xcd, 0xe6, 0x7e, 0xe8, 0xf8, 0x3d, 0x1f, 0x21, + 0xfc, 0x3b, 0xfc, 0x5c, 0x88, 0xdf, 0x28, 0x7e, + 0x5b, 0xa8, 0x8d, 0xf2, 0x87, 0xe5, 0xba, 0xb8, + 0xb6, 0x35, 0x6d, 0x9f, 0xbc, 0x5b, 0x7d, 0x91, + 0xf0, 0xaa, 0xea, 0xb1, 0x6d, 0x9f, 0xbc, 0x5b, + 0x7d, 0x91, 0xf0, 0xaa, 0xea, 0x02, 0x9f, 0xcb, + 0x9f, 0xec, 0x1b, 0x3f, 0x3d, 0xf5, 0xb8, 0x1e, + 0xd4, 0xf9, 0x30, 0x73, 0x94, 0xa9, 0x68, 0xa8, + 0x1c, 0x6a, 0x01, 0x4f, 0x65, 0x4e, 0x16, 0x19, + 0x44, 0xb7, 0xb7, 0x95, 0x96, 0xd6, 0xe1, 0xdc, + 0xdb, 0x2d, 0x34, 0x51, 0xee, 0xf9, 0xd5, 0x3a, + 0xb5, 0x20, 0xd9, 0x05, 0xcc, 0x99, 0xa6, 0x43, + 0x7c, 0x6f, 0xcf, 0x3a, 0xfb, 0x5f, 0x1a, 0x29, + 0x4b, 0x40, 0x3a, 0x05, 0x69, 0x50, 0xa1, 0xe4, + 0xcb, 0xae, 0x62, 0xb1, 0x8e, 0xf8, 0xe0, 0x74, + 0x12, 0x1c, 0x2d, 0x73, 0x49, 0x25, 0xa4, 0x6e, + 0x38, 0x70, 0xa9, 0x9c, 0x71, 0x66, 0x99, 0x3c, + 0xf0, 0x65, 0xb1, 0xfb, 0x17, 0xb3, 0xfe, 0xb2, + 0x5b, 0x60, 0x01, 0x12, 0x0a, 0x7c, 0xed, 0x6b, + 0x46, 0xce, 0x39, 0xb7, 0x6c, 0xb8, 0xca, 0x26, + 0x05, 0xd0, 0xce, 0xde, 0x71, 0x8e, 0x1a, 0x70, + 0xb8, 0x53, 0xf2, 0xed, 0xa0, 0x8e, 0x76, 0x5d, + 0x72, 0xdc, 0xbd, 0xb9, 0x83, 0xc8, 0x64, 0x2f, + 0x34, 0x60, 0x2e, 0xf1, 0xdc, 0x75, 0x68, 0x14, + 0x5c, 0x80, 0x02, 0x68, 0x77, 0x75, 0x91, 0xdc, + 0xd2, 0xa5, 0xf6, 0x92, 0xe6, 0xb7, 0x8c, 0xb1, + 0x8d, 0xa5, 0x90, 0x59, 0x34, 0x31, 0x8d, 0xd5, + 0xa6, 0x83, 0x4a, 0x88, 0xfc, 0xaa, 0x82, 0x7b, + 0x32, 0xce, 0x7d, 0x91, 0xb0, 0x5a, 0x64, 0xf3, + 0x06, 0x41, 0x1b, 0x06, 0x37, 0xb0, 0x0d, 0x2e, + 0xec, 0xd4, 0x2c, 0x67, 0xed, 0x6d, 0xcd, 0xa6, + 0x5d, 0x7c, 0xe6, 0x88, 0xe7, 0xb9, 0x6e, 0x19, + 0x5c, 0x34, 0x6e, 0x0d, 0x3c, 0x2a, 0x3b, 0x2d, + 0x9f, 0x2e, 0x85, 0xee, 0x75, 0xf5, 0xbb, 0xae, + 0x41, 0x23, 0x06, 0x13, 0x40, 0x3b, 0x7a, 0x74, + 0xa9, 0x0d, 0xa1, 0x8d, 0xf7, 0x10, 0xdb, 0xe6, + 0x10, 0xc9, 0x8e, 0xca, 0x46, 0xe0, 0x89, 0x84, + 0x61, 0xe6, 0xfb, 0x14, 0xdd, 0xd4, 0x83, 0x76, + 0x6b, 0x9a, 0xbb, 0x2e, 0x30, 0xd8, 0xe5, 0x52, + 0x31, 0x91, 0x35, 0x80, 0xbe, 0x48, 0xf0, 0xb8, + 0xb9, 0xdd, 0x92, 0xb5, 0xe7, 0x65, 0xb7, 0x99, + 0x35, 0x96, 0x66, 0xf6, 0x86, 0xdc, 0x3d, 0xdc, + 0xdc, 0x84, 0x0a, 0x62, 0xd0, 0xe3, 0x5f, 0xa2, + 0xb8, 0x32, 0xac, 0xa6, 0x5c, 0xc1, 0xee, 0x75, + 0x44, 0x56, 0xcc, 0xd3, 0x2c, 0xc6, 0x81, 0xa0, + 0x6f, 0x0e, 0xca, 0xdd, 0x9d, 0x66, 0x10, 0x5c, + 0x73, 0x36, 0x36, 0x5a, 0x2d, 0x2d, 0x7c, 0x58, + 0xc9, 0xfc, 0xe3, 0xab, 0x12, 0x08, 0xa5, 0x3b, + 0x90, 0x46, 0xf9, 0x72, 0xac, 0xda, 0x28, 0xdb, + 0x8d, 0xef, 0x63, 0x1a, 0xd6, 0x8d, 0xd2, 0x43, + 0xd7, 0x86, 0xec, 0xbc, 0xae, 0x0d, 0x22, 0xfa, + 0xde, 0x84, 0x03, 0x42, 0xea, 0x9e, 0xd6, 0xb5, + 0xb3, 0x22, 0x91, 0xd6, 0xb9, 0x66, 0x6e, 0xf6, + 0x9f, 0x1a, 0x26, 0xe8, 0x2d, 0xd1, 0xa5, 0xa1, + 0xe2, 0xa1, 0x07, 0x3c, 0xfb, 0x3b, 0x7d, 0x15, + 0xbb, 0xe7, 0x0f, 0x8a, 0x6e, 0x6e, 0xa6, 0x48, + 0xe3, 0x75, 0x4b, 0x40, 0xe2, 0x5a, 0xac, 0xc6, + 0x63, 0xd5, 0x57, 0x86, 0x02, 0xcf, 0x64, 0x14, + 0xf6, 0x80, 0xef, 0x28, 0xef, 0x51, 0x74, 0xec, + 0x9c, 0x8e, 0x19, 0xa1, 0x88, 0x92, 0x5b, 0x34, + 0x6e, 0x12, 0x0d, 0xc3, 0x4d, 0x35, 0x5b, 0x6c, + 0x5a, 0x19, 0x91, 0x67, 0x2c, 0x6e, 0x90, 0xd7, + 0x16, 0x8f, 0x02, 0x0e, 0x9b, 0x5c, 0x9e, 0xe0, + 0x6c, 0xf4, 0xd6, 0xb8, 0xe2, 0xe7, 0x25, 0x91, + 0xb2, 0x35, 0xc1, 0xde, 0x20, 0x1e, 0x26, 0x82, + 0xea, 0x68, 0x55, 0xa9, 0xa3, 0x74, 0x33, 0x3e, + 0x22, 0x41, 0x74, 0x6e, 0xa5, 0x41, 0xa8, 0xab, + 0x77, 0x8a, 0x99, 0xb6, 0xd3, 0xb2, 0x97, 0x66, + 0xa7, 0x4d, 0xc3, 0x6b, 0xda, 0xf1, 0x35, 0x28, + 0x34, 0x13, 0xf9, 0x1e, 0x75, 0x9a, 0x5c, 0xe6, + 0x50, 0x5b, 0xcf, 0x39, 0x7c, 0x4e, 0xa8, 0x2c, + 0xc2, 0xd0, 0x34, 0x0d, 0xfc, 0x35, 0x5a, 0x33, + 0x5c, 0xeb, 0x34, 0x6d, 0xdd, 0xdd, 0xa8, 0xb8, + 0x22, 0x1c, 0x6f, 0x66, 0x0c, 0x2d, 0x3e, 0x2e, + 0xaa, 0x57, 0x0d, 0x56, 0xad, 0x9c, 0xfe, 0x73, + 0x6d, 0xfd, 0xaf, 0x02, 0xe7, 0xce, 0x3f, 0x9a, + 0x5d, 0xfd, 0xab, 0xfc, 0x25, 0x07, 0x46, 0x6a, + 0xcc, 0xc9, 0xc6, 0xc9, 0x97, 0x98, 0x0e, 0x38, + 0xc3, 0x6d, 0xf0, 0x6b, 0xc0, 0xea, 0x0a, 0x3b, + 0x46, 0xba, 0xaf, 0x6d, 0xd9, 0x7c, 0xc0, 0x4a, + 0x63, 0x95, 0xf0, 0xc3, 0x4a, 0x0c, 0x4e, 0x7e, + 0x87, 0x13, 0xab, 0x0e, 0xea, 0xea, 0xcf, 0xff, + 0x00, 0x6d, 0x94, 0xd3, 0x41, 0xe6, 0xd9, 0xa7, + 0xfb, 0x4d, 0x5a, 0x76, 0xb6, 0x49, 0x3a, 0xdc, + 0x8c, 0x46, 0x91, 0xb1, 0xa5, 0x83, 0x78, 0xd2, + 0xa8, 0x35, 0x37, 0x67, 0x33, 0x0e, 0x75, 0xf1, + 0xca, 0x59, 0x0b, 0x63, 0x34, 0xe7, 0x64, 0x75, + 0x1a, 0xe2, 0x75, 0x06, 0xae, 0x3c, 0xc7, 0x2e, + 0xb8, 0xcb, 0xa7, 0xe6, 0x6e, 0x00, 0xa9, 0x15, + 0x6b, 0x9a, 0x6a, 0xd2, 0x0e, 0xea, 0x94, 0xda, + 0xf9, 0x1e, 0xeb, 0x9b, 0x66, 0x13, 0x56, 0x88, + 0x03, 0xc0, 0x3a, 0xaa, 0x49, 0xa9, 0xa6, 0xfe, + 0x85, 0xbf, 0x33, 0x8c, 0x4f, 0x26, 0x46, 0xd9, + 0x0d, 0x44, 0x8d, 0x18, 0xab, 0xac, 0x8a, 0xb3, + 0x5a, 0x0e, 0x18, 0x76, 0x6e, 0xf1, 0xf1, 0xb5, + 0xf2, 0x4b, 0x0c, 0x0f, 0x90, 0x56, 0x38, 0xe4, + 0x77, 0x8c, 0xe0, 0x75, 0x68, 0xdc, 0x5c, 0x63, + 0x2c, 0xbc, 0xf6, 0xf1, 0x97, 0xb9, 0xa1, 0xb7, + 0x04, 0xd0, 0xb4, 0x9f, 0x14, 0xd7, 0xfa, 0xdd, + 0xc5, 0x39, 0x9e, 0x65, 0x46, 0xeb, 0x31, 0x7c, + 0xe6, 0xfe, 0xde, 0x07, 0x30, 0x0c, 0x11, 0xc8, + 0xea, 0x39, 0x94, 0x68, 0xec, 0x8d, 0xd5, 0xb6, + 0xe6, 0x4b, 0x79, 0x36, 0x93, 0x2e, 0x92, 0x29, + 0x19, 0x2b, 0xb0, 0x00, 0xe7, 0x30, 0xe2, 0x15, + 0x18, 0xb7, 0x42, 0x08, 0x79, 0x72, 0x0b, 0xd8, + 0x2d, 0x67, 0xb8, 0x98, 0xb2, 0x36, 0xc2, 0x5c, + 0x03, 0x49, 0xa9, 0x76, 0x03, 0x86, 0xad, 0x5e, + 0xb2, 0xa3, 0xec, 0xb9, 0x75, 0xf6, 0x63, 0xa8, + 0xe1, 0x10, 0x43, 0xe7, 0x49, 0xaf, 0x80, 0x2d, + 0x39, 0xec, 0xf2, 0xcb, 0x9a, 0xdc, 0xf3, 0xae, + 0x24, 0x47, 0x23, 0x98, 0xd1, 0x53, 0x40, 0xd6, + 0x9d, 0x00, 0x70, 0x2d, 0xf9, 0x97, 0xfd, 0xae, + 0x53, 0x61, 0x65, 0xa9, 0xd2, 0x07, 0x5d, 0x4c, + 0x3b, 0x2e, 0xf2, 0x50, 0x77, 0x5d, 0x5e, 0xdd, + 0x59, 0xec, 0xf6, 0x58, 0xeb, 0x69, 0x5d, 0x11, + 0x75, 0x5a, 0xf2, 0x37, 0x40, 0x05, 0x66, 0xc2, + 0xea, 0x5c, 0xe3, 0x28, 0xbe, 0x86, 0xfe, 0x92, + 0x3a, 0x06, 0x62, 0x8e, 0x4a, 0x0a, 0x8f, 0x17, + 0x17, 0x0e, 0x85, 0xea, 0x66, 0xe5, 0xa7, 0x67, + 0xf2, 0xee, 0xb0, 0x74, 0x8d, 0x60, 0xfd, 0x99, + 0x8b, 0x49, 0xc5, 0x43, 0x5a, 0xae, 0x19, 0xf3, + 0x5c, 0xbe, 0xda, 0xc2, 0x4b, 0x0c, 0xa5, 0x92, + 0x01, 0x71, 0xfb, 0x59, 0xa4, 0xd7, 0xdc, 0x08, + 0x3d, 0xed, 0x11, 0x37, 0x16, 0x39, 0x65, 0xf6, + 0xb3, 0x2c, 0x38, 0x1e, 0x7b, 0x24, 0x03, 0xc6, + 0xa4, 0xdc, 0xc6, 0xfc, 0x37, 0xec, 0x23, 0x4c, + 0x82, 0xd7, 0xda, 0x0f, 0x62, 0xa7, 0x1f, 0xca, + 0xa3, 0x43, 0x0d, 0xde, 0xcb, 0xc4, 0xc1, 0xe5, + 0x5b, 0xdc, 0x88, 0xf4, 0x6f, 0x3d, 0xdf, 0xa6, + 0xa4, 0xb9, 0xd6, 0xbb, 0x69, 0x24, 0xb2, 0xd4, + 0xc3, 0x6b, 0xec, 0xff, 0x00, 0x47, 0x1f, 0xca, + 0x82, 0x37, 0x20, 0x22, 0xdf, 0x2c, 0xcc, 0xef, + 0x0f, 0xe6, 0xc6, 0x23, 0x1d, 0x9a, 0x82, 0xa5, + 0xf2, 0x69, 0x18, 0x32, 0x6b, 0x1b, 0x79, 0x3c, + 0x9b, 0xae, 0x72, 0x22, 0x7b, 0x3e, 0x3f, 0x12, + 0x87, 0x93, 0xfe, 0xd3, 0x65, 0xf0, 0x1d, 0x0f, + 0xba, 0xb8, 0x76, 0xbd, 0xe6, 0x9a, 0x7f, 0x75, + 0x74, 0x1b, 0x83, 0x6d, 0x91, 0xe5, 0x33, 0xd6, + 0x9c, 0xd5, 0xc5, 0x49, 0xec, 0x55, 0xf5, 0xef, + 0x20, 0x84, 0x86, 0xd1, 0xcf, 0xcc, 0x59, 0x66, + 0x47, 0x8c, 0x66, 0xe6, 0xdc, 0x3b, 0x00, 0xd0, + 0xf8, 0x15, 0xa3, 0x68, 0xa6, 0x6c, 0xb9, 0x35, + 0xc3, 0x58, 0x3c, 0x58, 0x67, 0x6c, 0x43, 0xfb, + 0x38, 0x6b, 0xdf, 0x5a, 0x19, 0x64, 0x23, 0xda, + 0x99, 0xae, 0x48, 0xfd, 0x4c, 0x71, 0x1b, 0xaa, + 0xee, 0x78, 0xc2, 0x9e, 0x1a, 0xae, 0x59, 0x65, + 0x74, 0xfb, 0x2f, 0x71, 0x31, 0x35, 0x74, 0x97, + 0x65, 0xc4, 0xf6, 0x4b, 0x82, 0x0e, 0x4d, 0x9e, + 0x6b, 0x62, 0x9e, 0x6b, 0xf9, 0x07, 0x89, 0x65, + 0x0b, 0x9e, 0x2b, 0xba, 0xe3, 0xe4, 0xae, 0xbc, + 0xad, 0xe6, 0xcb, 0x26, 0xbb, 0xcd, 0xb4, 0x1b, + 0x99, 0x1e, 0x63, 0x8d, 0xe7, 0x4d, 0x09, 0x3a, + 0x48, 0xee, 0x95, 0xca, 0xef, 0xfb, 0x5d, 0x9e, + 0x03, 0x53, 0xf3, 0x19, 0x89, 0x27, 0x77, 0x9b, + 0x8f, 0xfa, 0x57, 0x43, 0xff, 0x00, 0xd1, 0xec, + 0x03, 0x5f, 0x3e, 0x31, 0x76, 0xf1, 0x20, 0xf1, + 0x93, 0xe7, 0xd3, 0xb6, 0xef, 0x06, 0x61, 0x39, + 0x92, 0xd2, 0x56, 0x91, 0x27, 0x3b, 0xe3, 0x00, + 0x69, 0x50, 0x45, 0x02, 0xdb, 0x91, 0xdb, 0xda, + 0xb2, 0xef, 0x30, 0xbf, 0x65, 0x24, 0x82, 0xc8, + 0x38, 0xc3, 0xbc, 0x75, 0xe0, 0x3a, 0x7f, 0xaa, + 0x14, 0x03, 0x18, 0xf7, 0x38, 0x35, 0x8d, 0x2e, + 0x73, 0xb5, 0x34, 0x69, 0x25, 0x4f, 0x64, 0xa1, + 0xcd, 0xc9, 0x73, 0x66, 0x16, 0x96, 0xbc, 0x34, + 0x02, 0xd2, 0x34, 0x8f, 0x14, 0xe8, 0x41, 0xcb, + 0x6b, 0xb4, 0x39, 0x90, 0xbe, 0x64, 0xd3, 0x5c, + 0x38, 0xc6, 0xe7, 0x8e, 0x71, 0x87, 0xc8, 0x0d, + 0x27, 0x4d, 0x02, 0x93, 0xca, 0xcd, 0x9b, 0xf6, + 0xa6, 0x59, 0x2c, 0x9c, 0x1f, 0x0c, 0x91, 0x17, + 0x02, 0xd0, 0x40, 0x04, 0xd3, 0x10, 0xd3, 0x4d, + 0xd5, 0x58, 0x02, 0xa6, 0x83, 0x74, 0xd0, 0x77, + 0x4d, 0x14, 0xde, 0xca, 0x32, 0x48, 0xf3, 0x9c, + 0x32, 0x31, 0xcc, 0x77, 0x32, 0xed, 0x0e, 0x14, + 0xde, 0x41, 0xaa, 0x2d, 0xa1, 0xcd, 0x63, 0xbc, + 0x68, 0x74, 0xc6, 0x48, 0xcb, 0xf0, 0x98, 0xdc, + 0x01, 0xab, 0x49, 0xa5, 0x3b, 0x6b, 0x1b, 0x51, + 0x6f, 0x14, 0x19, 0xa9, 0xe6, 0x86, 0x16, 0xcc, + 0xc6, 0xc9, 0x41, 0xbf, 0xa6, 0xba, 0x37, 0x16, + 0xf6, 0xc9, 0xb3, 0x16, 0xd7, 0x26, 0xe0, 0x73, + 0xf3, 0x4a, 0xc7, 0x17, 0x06, 0x38, 0x68, 0x2e, + 0x51, 0x99, 0x95, 0xfc, 0x99, 0x85, 0xe3, 0xee, + 0xa4, 0x18, 0x71, 0x68, 0x6b, 0x46, 0xe3, 0x46, + 0xa0, 0x83, 0x95, 0x77, 0x64, 0x7f, 0xce, 0x2d, + 0x3e, 0xd3, 0xe4, 0x2b, 0x85, 0x77, 0x64, 0x7f, + 0xce, 0x2d, 0x3e, 0xd3, 0xe4, 0x28, 0x2c, 0x79, + 0xa7, 0xbe, 0xc9, 0xdc, 0xf0, 0x2e, 0x55, 0xd5, + 0x9a, 0x7b, 0xec, 0x9d, 0xcf, 0x02, 0xe5, 0x41, + 0xee, 0x0f, 0xdb, 0x47, 0xe7, 0x37, 0xc2, 0xa6, + 0x94, 0x2c, 0x1f, 0xb6, 0x8f, 0xce, 0x6f, 0x85, + 0x4d, 0x20, 0x28, 0xdc, 0xdb, 0xde, 0xac, 0xfe, + 0xd3, 0xe5, 0x0a, 0x49, 0x46, 0xe6, 0xde, 0xf5, + 0x67, 0xf6, 0x9f, 0x28, 0x41, 0x8c, 0xab, 0xde, + 0xaf, 0x3c, 0xf3, 0xf5, 0x8a, 0x93, 0x51, 0x99, + 0x57, 0xbd, 0x5e, 0x79, 0xe7, 0xeb, 0x15, 0x26, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x35, 0xa8, 0x27, 0x79, 0x47, 0xb6, + 0x54, 0xe8, 0xd6, 0xa0, 0x9d, 0xe5, 0x1e, 0xd9, + 0x41, 0xba, 0xcb, 0xdf, 0x21, 0xf3, 0x82, 0x8a, + 0xda, 0xa3, 0x4c, 0xe1, 0xe3, 0xfa, 0x8c, 0x3d, + 0xe2, 0xa4, 0xa0, 0x93, 0x9b, 0x9a, 0x39, 0x0e, + 0xa6, 0xb8, 0x12, 0xb8, 0x36, 0xca, 0x17, 0x33, + 0x30, 0x8e, 0xe3, 0xf3, 0x26, 0x8c, 0x00, 0x7b, + 0x2d, 0xfe, 0x82, 0xba, 0x61, 0x9d, 0x2e, 0xcd, + 0xe7, 0x2b, 0x33, 0x8b, 0x87, 0xb2, 0x75, 0x42, + 0x55, 0x31, 0x6f, 0x1a, 0x1d, 0xf1, 0xad, 0x6b, + 0xc4, 0x98, 0x96, 0xa9, 0x79, 0xba, 0x70, 0xff, + 0x00, 0x15, 0xa2, 0xc3, 0x6b, 0x98, 0xd8, 0x44, + 0x37, 0xd0, 0x97, 0x10, 0x30, 0x99, 0x19, 0xa4, + 0x38, 0x0d, 0x1a, 0x41, 0xdd, 0x5b, 0x65, 0xda, + 0xeb, 0x28, 0xa2, 0x2d, 0xb2, 0xb6, 0x76, 0x2d, + 0xc0, 0x40, 0x63, 0x41, 0xec, 0x80, 0xaa, 0x55, + 0xff, 0x00, 0xe1, 0x31, 0x6f, 0xaa, 0x76, 0xa9, + 0xc9, 0xa2, 0x3c, 0xc6, 0x4d, 0x3c, 0x7d, 0x9a, + 0x78, 0x3a, 0xa6, 0x9e, 0x7b, 0xcb, 0x87, 0xcc, + 0xfa, 0xbe, 0x59, 0x09, 0x71, 0x0d, 0xd3, 0xa3, + 0x7b, 0xb4, 0xae, 0xd9, 0x64, 0xb2, 0x43, 0x92, + 0xc3, 0x35, 0xc8, 0x2d, 0x31, 0x45, 0x57, 0x03, + 0xa0, 0xd1, 0xa0, 0xd2, 0xbd, 0xc5, 0x4b, 0xca, + 0xb3, 0x2e, 0xae, 0xbd, 0x6d, 0xce, 0x0e, 0x72, + 0x8d, 0x2d, 0xc1, 0x5a, 0x0d, 0x2b, 0xb3, 0x34, + 0xda, 0x8b, 0xac, 0xc2, 0x07, 0x5b, 0x08, 0xc4, + 0x11, 0x3f, 0xcb, 0x20, 0x92, 0x5c, 0x37, 0x95, + 0x72, 0x56, 0x66, 0x62, 0xba, 0x70, 0x84, 0xe0, + 0xc9, 0x4c, 0x71, 0x6c, 0x93, 0x69, 0x9b, 0x4c, + 0x6d, 0xd1, 0x1f, 0xed, 0x52, 0x0b, 0x8f, 0x6a, + 0x6b, 0x87, 0x3b, 0x8f, 0x9c, 0x0e, 0x3b, 0xe0, + 0xd5, 0x59, 0x06, 0xd5, 0x65, 0xd7, 0x30, 0xb5, + 0xb7, 0xd6, 0xc4, 0xb8, 0x50, 0xd3, 0x08, 0x7b, + 0x6a, 0x37, 0xaa, 0xaa, 0x78, 0x93, 0x12, 0xbc, + 0xd2, 0xb3, 0x31, 0x33, 0xec, 0x72, 0xa6, 0x5b, + 0xd2, 0x2d, 0x11, 0x3f, 0x74, 0xeb, 0x3a, 0xf1, + 0xfd, 0x29, 0xfc, 0xdf, 0x69, 0x45, 0xe5, 0xb7, + 0xb2, 0x5a, 0xc6, 0x61, 0x89, 0xda, 0x1e, 0xe3, + 0xa0, 0x90, 0x37, 0x00, 0x1a, 0x82, 0xf1, 0x91, + 0xed, 0x03, 0x72, 0xc8, 0xdf, 0x0c, 0xb1, 0x19, + 0x23, 0x7b, 0xb1, 0xb4, 0xb0, 0xd2, 0x86, 0x9a, + 0x75, 0xa8, 0x3c, 0x49, 0x89, 0x36, 0x57, 0x6e, + 0xdd, 0x38, 0x27, 0xbd, 0x7d, 0xf1, 0x7d, 0x78, + 0xc7, 0xbb, 0xfc, 0x93, 0xb7, 0xfb, 0x41, 0x1c, + 0xb7, 0xb6, 0xf7, 0x76, 0x51, 0x18, 0x9f, 0x05, + 0x71, 0x62, 0x03, 0xc6, 0xc5, 0xae, 0xb4, 0x52, + 0x1f, 0x15, 0x65, 0x53, 0x06, 0xbe, 0xea, 0xd5, + 0xc6, 0x66, 0x69, 0x6f, 0x8a, 0x1d, 0x43, 0xfd, + 0x53, 0xb8, 0xaa, 0x58, 0x93, 0x12, 0x8e, 0xdd, + 0x7e, 0x5e, 0xf4, 0xc6, 0x7c, 0x91, 0x36, 0x9d, + 0x7e, 0xee, 0x33, 0xc1, 0x2f, 0x9d, 0xe7, 0x6f, + 0xcd, 0x1e, 0xd6, 0xb5, 0xa6, 0x28, 0x23, 0xf2, + 0x5a, 0x4d, 0x49, 0x27, 0x75, 0xcb, 0xb2, 0xf7, + 0x69, 0xa0, 0xb9, 0xca, 0xdd, 0x62, 0xd8, 0x1e, + 0xd7, 0x39, 0x8d, 0x60, 0x79, 0x22, 0x95, 0x6d, + 0x34, 0xf7, 0x95, 0x73, 0x12, 0x62, 0x53, 0xdb, + 0xae, 0x91, 0x1c, 0xb8, 0xc2, 0x3b, 0xd7, 0xd6, + 0xd3, 0xaf, 0xdd, 0x1a, 0x4a, 0x77, 0x23, 0xcf, + 0xe2, 0xca, 0xe0, 0x92, 0x29, 0x22, 0x74, 0xa6, + 0x47, 0x07, 0x55, 0xa4, 0x0a, 0x50, 0x53, 0x75, + 0x72, 0xdb, 0xe6, 0x8c, 0x87, 0x38, 0xeb, 0x12, + 0xc2, 0x59, 0xce, 0x3e, 0x4e, 0x6c, 0x11, 0x5f, + 0x1e, 0xba, 0x2b, 0xdd, 0x51, 0x98, 0x93, 0x12, + 0x6c, 0x8d, 0x66, 0x7a, 0xbc, 0x51, 0xdc, 0xb6, + 0x95, 0x8d, 0x78, 0x52, 0x75, 0xaa, 0x63, 0x3d, + 0xce, 0xa2, 0xcd, 0x5d, 0x0b, 0xa3, 0x89, 0xd1, + 0x73, 0x40, 0x83, 0x88, 0x83, 0x5a, 0xf6, 0x94, + 0x5d, 0x56, 0xbc, 0x49, 0x89, 0x5a, 0xb1, 0x15, + 0x8d, 0x23, 0xc1, 0x5b, 0xda, 0x6f, 0x33, 0x6b, + 0x71, 0x99, 0x58, 0x62, 0xda, 0x48, 0x19, 0x94, + 0x75, 0x79, 0x81, 0xe5, 0xfc, 0xd3, 0xa3, 0xe7, + 0x2a, 0x29, 0x52, 0x0e, 0x9e, 0xfa, 0xd3, 0x91, + 0xe7, 0xac, 0xca, 0xe3, 0x96, 0x39, 0x23, 0x74, + 0xad, 0x91, 0xc1, 0xc0, 0x34, 0x81, 0x43, 0xbb, + 0xad, 0x42, 0x62, 0x4c, 0x4a, 0xbd, 0xba, 0xe9, + 0x31, 0xa7, 0x8c, 0xea, 0xe9, 0xde, 0xbe, 0xb1, + 0x6d, 0x78, 0xd6, 0x36, 0xc7, 0x0f, 0x62, 0x56, + 0x1c, 0xd9, 0xac, 0xce, 0x8e, 0x66, 0xf6, 0x17, + 0x02, 0xf2, 0xec, 0x00, 0x8a, 0xd2, 0x98, 0x5a, + 0x3b, 0x8b, 0x66, 0x6d, 0x9e, 0x0b, 0xdb, 0xbb, + 0x7b, 0xa8, 0x23, 0x31, 0x3a, 0xd8, 0x68, 0x0f, + 0x20, 0xd4, 0xe2, 0x0e, 0xfc, 0xde, 0xd2, 0x86, + 0xc4, 0x98, 0x94, 0xed, 0x8d, 0x62, 0x79, 0x70, + 0x57, 0xb9, 0x6d, 0x2d, 0x1a, 0xf0, 0xb5, 0xb7, + 0xcf, 0xc5, 0x6d, 0x7e, 0xd5, 0xe5, 0x77, 0x10, + 0x37, 0xda, 0x6d, 0x9d, 0x24, 0x80, 0xd7, 0x01, + 0x00, 0x8a, 0xef, 0xd4, 0xad, 0x1f, 0x17, 0x45, + 0x25, 0x9c, 0x96, 0xf3, 0x5b, 0xbb, 0x1b, 0xda, + 0xe6, 0x55, 0x84, 0x06, 0x80, 0xe0, 0x40, 0xd0, + 0x55, 0x67, 0x17, 0xff, 0x00, 0x29, 0x89, 0x57, + 0xb5, 0x4e, 0x5f, 0xe2, 0xbf, 0xa9, 0xc9, 0xce, + 0x3c, 0x34, 0xf0, 0x84, 0xfe, 0x4b, 0xb4, 0x30, + 0xe5, 0x96, 0x86, 0xdd, 0xf0, 0xbe, 0x52, 0x5e, + 0x5c, 0x1c, 0xd2, 0x00, 0xa1, 0x1a, 0xb4, 0xae, + 0x2b, 0x2c, 0xc9, 0x96, 0xd9, 0xaf, 0xb7, 0xb9, + 0x85, 0xcc, 0xc6, 0xf7, 0xe0, 0x04, 0x57, 0xc7, + 0xc5, 0xa3, 0xbe, 0xa3, 0x71, 0x26, 0x25, 0x6d, + 0xb1, 0xf5, 0x7f, 0xaa, 0x34, 0x95, 0x3b, 0x96, + 0xd2, 0x91, 0xaf, 0xf0, 0xfe, 0xd4, 0xd6, 0x6d, + 0x9f, 0x0b, 0xeb, 0xab, 0x6b, 0x98, 0x23, 0x74, + 0x4e, 0xb6, 0xd2, 0x03, 0x88, 0x35, 0x35, 0xae, + 0xe2, 0x93, 0x7e, 0xd5, 0xe5, 0x73, 0xc2, 0xdf, + 0x68, 0xb5, 0x2f, 0x95, 0xba, 0x70, 0x10, 0x08, + 0xc5, 0xd8, 0x25, 0x54, 0xb1, 0x26, 0x2e, 0x05, + 0x5e, 0xdd, 0x78, 0x70, 0xf0, 0xf0, 0x5a, 0x33, + 0xe4, 0x89, 0xb4, 0xeb, 0xf7, 0x78, 0xf0, 0x59, + 0xce, 0xd6, 0xc5, 0x2d, 0x93, 0xed, 0xe7, 0xb7, + 0x76, 0x39, 0x18, 0xe6, 0x12, 0xc2, 0x03, 0x40, + 0x75, 0x40, 0xa5, 0x77, 0x82, 0xe6, 0xd9, 0xf9, + 0x33, 0x78, 0x03, 0xa6, 0xb3, 0x83, 0x9f, 0xb7, + 0x79, 0xc2, 0xf6, 0x54, 0x0a, 0x16, 0xeb, 0xa6, + 0x9d, 0x6a, 0x07, 0x12, 0x91, 0xca, 0x33, 0xcb, + 0x8c, 0xac, 0xb8, 0x31, 0xa2, 0x58, 0x5e, 0x6a, + 0xe8, 0xdd, 0xa3, 0x4e, 0xf8, 0x2a, 0x27, 0x1e, + 0x94, 0x98, 0xac, 0x6b, 0xaf, 0x1f, 0x15, 0xab, + 0x9a, 0x6d, 0x7a, 0xcd, 0xed, 0xa6, 0xdf, 0x0d, + 0x21, 0x62, 0xb2, 0xcf, 0xee, 0x6f, 0xf3, 0x68, + 0xad, 0x63, 0x83, 0x99, 0x8d, 0x85, 0xc6, 0x70, + 0x74, 0xbb, 0x40, 0x20, 0x03, 0xb8, 0x34, 0xae, + 0x0d, 0xb0, 0x94, 0xb6, 0xfe, 0xdf, 0x01, 0xa3, + 0xe3, 0x8e, 0xbd, 0xa3, 0x8a, 0xa1, 0x7a, 0x7e, + 0xda, 0x34, 0x34, 0x98, 0x6c, 0xc0, 0x91, 0xda, + 0xc9, 0x70, 0xa5, 0x7b, 0x83, 0x4a, 0xaf, 0xdd, + 0xde, 0xcf, 0x79, 0x3b, 0xae, 0x27, 0x76, 0x29, + 0x1e, 0x75, 0xea, 0x00, 0x6e, 0x34, 0x2a, 0xd2, + 0x9f, 0x54, 0x4c, 0xc6, 0xd8, 0xd1, 0x7c, 0xd9, + 0x62, 0x69, 0x35, 0xdd, 0xbe, 0x6d, 0x3b, 0x96, + 0x48, 0x76, 0xae, 0xce, 0x68, 0x44, 0x79, 0x95, + 0xb9, 0x79, 0xdd, 0x20, 0x07, 0x34, 0x91, 0xd8, + 0x2b, 0x97, 0x37, 0xda, 0x56, 0xdd, 0xdb, 0xfb, + 0x25, 0x9c, 0x46, 0x18, 0x74, 0x07, 0x39, 0xd4, + 0x04, 0x81, 0xa8, 0x34, 0x0d, 0xc5, 0x5f, 0xc4, + 0x98, 0x95, 0xfb, 0x75, 0xe4, 0xe5, 0x3e, 0x63, + 0x2c, 0xc4, 0xc4, 0xcf, 0x8f, 0x8f, 0x05, 0x8b, + 0x2b, 0xda, 0x58, 0x2c, 0x72, 0xf6, 0xda, 0x3e, + 0x07, 0xbd, 0xc3, 0x15, 0x5c, 0xd2, 0x00, 0xf1, + 0x8d, 0x77, 0x57, 0x0e, 0x49, 0x9a, 0x33, 0x2c, + 0xba, 0x74, 0xf2, 0x30, 0xca, 0x0b, 0x0b, 0x30, + 0xb4, 0x80, 0x74, 0xd3, 0x7f, 0xb4, 0xa2, 0xf1, + 0x26, 0x25, 0x3b, 0x2b, 0xc7, 0xfd, 0x5e, 0x2a, + 0xf7, 0x6f, 0xf4, 0x71, 0xfe, 0x1f, 0xda, 0x93, + 0xcd, 0xf3, 0x36, 0x66, 0x17, 0xfe, 0xd4, 0xc6, + 0x18, 0xdb, 0x46, 0x8c, 0x2e, 0x20, 0x9f, 0x14, + 0xf6, 0x17, 0x76, 0x71, 0xb4, 0x90, 0x66, 0x36, + 0x66, 0xdd, 0x90, 0x3e, 0x32, 0x5c, 0x1d, 0x89, + 0xc4, 0x11, 0xa3, 0xb4, 0xab, 0xd8, 0x93, 0x12, + 0x6c, 0xaf, 0xd3, 0xfe, 0x9f, 0x04, 0xf7, 0x6f, + 0xf5, 0xf1, 0xfe, 0x27, 0xdc, 0xb1, 0x65, 0x5b, + 0x4e, 0xdb, 0x6b, 0x56, 0xda, 0x5e, 0x44, 0x65, + 0x89, 0xa3, 0x0b, 0x5c, 0xdd, 0x27, 0x0e, 0x9d, + 0x0e, 0x07, 0x5a, 0xdd, 0x73, 0xb5, 0x36, 0x91, + 0xdb, 0xba, 0x0c, 0xb6, 0xdf, 0x9b, 0x2e, 0x1a, + 0x1c, 0x40, 0x6b, 0x45, 0x75, 0x9a, 0x0d, 0xd5, + 0x57, 0xc4, 0x98, 0x94, 0x76, 0xab, 0xcb, 0xde, + 0x98, 0xf3, 0x19, 0x22, 0x34, 0xd7, 0xc2, 0x36, + 0xf8, 0x71, 0xd3, 0xe2, 0x9a, 0xc8, 0xf3, 0xc8, + 0xf2, 0xce, 0x78, 0xcb, 0x13, 0xa6, 0x33, 0x61, + 0xd2, 0xd2, 0x07, 0x93, 0xbf, 0x55, 0xcf, 0x2e, + 0x62, 0xc7, 0xe7, 0x1d, 0x62, 0x18, 0x43, 0x0c, + 0xcd, 0x97, 0x9b, 0xa8, 0xad, 0x1b, 0x4d, 0x1b, + 0xdb, 0x8a, 0x37, 0x12, 0x62, 0x56, 0xdb, 0x1a, + 0xcc, 0xfb, 0x67, 0x84, 0xab, 0xdc, 0xb6, 0xda, + 0xd7, 0x5e, 0x15, 0x9d, 0x63, 0xe2, 0x9d, 0xcf, + 0x33, 0xf8, 0x73, 0x48, 0x63, 0x8e, 0x38, 0x5d, + 0x11, 0x8d, 0xd8, 0x89, 0x71, 0x06, 0xba, 0x3b, + 0x0b, 0x7e, 0x53, 0xb4, 0xf1, 0xd9, 0xd9, 0x32, + 0xd6, 0x78, 0x5c, 0xfe, 0x6f, 0x43, 0x5c, 0xca, + 0x79, 0x3b, 0xc4, 0x15, 0x5b, 0xc4, 0x98, 0x82, + 0x8e, 0xdd, 0x74, 0xdb, 0xa7, 0x0f, 0x15, 0xbb, + 0xf9, 0x37, 0xef, 0xd7, 0xea, 0xd3, 0x4f, 0x04, + 0x86, 0x6b, 0x7d, 0x0d, 0xf5, 0xeb, 0xae, 0x21, + 0x8f, 0x9a, 0x8c, 0x86, 0x80, 0xcd, 0x1b, 0x80, + 0x82, 0x74, 0x6f, 0xae, 0x3a, 0xad, 0x78, 0x93, + 0x12, 0xb4, 0x69, 0x58, 0xd1, 0xce, 0xd3, 0xac, + 0xcd, 0xa7, 0xda, 0x90, 0xc9, 0x8f, 0xf9, 0xad, + 0xa7, 0xda, 0xb7, 0xc2, 0xac, 0xd9, 0xaf, 0xbe, + 0xbb, 0xb4, 0xdf, 0x02, 0xaf, 0x6c, 0xcc, 0x0e, + 0xb8, 0xce, 0x20, 0xa6, 0xa8, 0xab, 0x23, 0xe9, + 0xb9, 0x84, 0x1f, 0x95, 0x4f, 0xe6, 0x2f, 0x0f, + 0xbc, 0x79, 0x1a, 0x85, 0x1b, 0xc0, 0x16, 0x6c, + 0xf3, 0xad, 0xa3, 0xe0, 0xdf, 0xe4, 0xe2, 0x62, + 0x93, 0xef, 0x97, 0x32, 0x37, 0xca, 0x1f, 0x96, + 0xea, 0x23, 0x7c, 0xa1, 0xf9, 0x6e, 0xae, 0x4d, + 0x4d, 0x5b, 0x67, 0xef, 0x16, 0xdf, 0x64, 0x7c, + 0x2a, 0xba, 0xac, 0x5b, 0x67, 0xef, 0x16, 0xdf, + 0x64, 0x7c, 0x2a, 0xba, 0x80, 0xac, 0x16, 0xf1, + 0x9c, 0xd7, 0x67, 0xa3, 0xb3, 0xb7, 0x23, 0xda, + 0xad, 0x24, 0xc5, 0xcd, 0x13, 0x42, 0x47, 0x8d, + 0xaa, 0xbe, 0x72, 0xaf, 0xac, 0xb5, 0xee, 0x69, + 0xc4, 0xd2, 0x5a, 0xed, 0xf0, 0x68, 0x7b, 0xc8, + 0x2c, 0x59, 0x7d, 0xac, 0xb9, 0x2d, 0x95, 0xe5, + 0xd5, 0xfd, 0x22, 0x96, 0x66, 0x18, 0xa1, 0x8a, + 0xb5, 0x71, 0xad, 0x77, 0x07, 0x65, 0x69, 0xb6, + 0x0f, 0xca, 0x32, 0x17, 0x5c, 0x0f, 0x16, 0xf2, + 0xfe, 0x8d, 0x84, 0x6e, 0xb5, 0x9b, 0xea, 0x11, + 0xf2, 0x3e, 0x43, 0x8a, 0x47, 0x17, 0x91, 0xf3, + 0x8d, 0x7c, 0x2b, 0xce, 0xe0, 0x07, 0x50, 0xd4, + 0x37, 0x90, 0x4e, 0xe7, 0x6d, 0x6e, 0x61, 0x61, + 0x6f, 0x9c, 0x44, 0x06, 0x3a, 0x08, 0xee, 0x5a, + 0x35, 0xe2, 0x0a, 0x0d, 0x8e, 0x6b, 0x5c, 0x1c, + 0xe0, 0x1c, 0xd6, 0xb9, 0xa5, 0xc3, 0x7c, 0x03, + 0xa5, 0x60, 0x13, 0x4a, 0x57, 0x46, 0xf6, 0xe7, + 0x6e, 0x88, 0x3c, 0x08, 0x2c, 0x19, 0x9e, 0x4a, + 0xeb, 0xe7, 0x47, 0x77, 0x93, 0xc6, 0xd7, 0xc1, + 0x23, 0x00, 0x7c, 0x6d, 0x20, 0x61, 0x72, 0xf3, + 0x9b, 0x86, 0xda, 0x65, 0x36, 0x79, 0x46, 0x20, + 0xeb, 0x80, 0xfc, 0x72, 0x61, 0x35, 0x0d, 0x24, + 0xea, 0xfa, 0x4a, 0x0d, 0x92, 0xcb, 0x1f, 0xec, + 0xde, 0xe6, 0x6e, 0xf8, 0xa4, 0x85, 0xe4, 0x92, + 0x4d, 0x4e, 0x92, 0x4d, 0x6b, 0xba, 0x82, 0xdb, + 0x99, 0x64, 0xb9, 0x8b, 0xed, 0x20, 0xb0, 0xb0, + 0x2c, 0x65, 0xab, 0x1b, 0x59, 0x2a, 0xec, 0x25, + 0xef, 0xec, 0xd0, 0x6a, 0x50, 0x57, 0xf9, 0x15, + 0xf6, 0x5f, 0x08, 0x9a, 0x7e, 0x6f, 0x05, 0x70, + 0x8c, 0x2e, 0xc4, 0x6a, 0x7b, 0x14, 0x5c, 0x15, + 0x75, 0x75, 0x9d, 0x75, 0xd6, 0x6a, 0x84, 0x93, + 0xd9, 0xed, 0xe9, 0x41, 0x8e, 0xde, 0xee, 0xe9, + 0xdf, 0x56, 0x0d, 0x9b, 0x64, 0x52, 0xe5, 0xd9, + 0x94, 0x52, 0xb8, 0x46, 0xc9, 0x58, 0xc6, 0x17, + 0x3b, 0x43, 0x41, 0x21, 0xc3, 0xe5, 0x55, 0xf4, + 0x04, 0x8d, 0x5a, 0x3b, 0x5a, 0x10, 0x59, 0x32, + 0x9c, 0xb6, 0x7c, 0x99, 0xd3, 0x66, 0x17, 0xe5, + 0x91, 0xb2, 0x16, 0x16, 0xc5, 0xe3, 0x03, 0x88, + 0x9d, 0x00, 0x8a, 0x2d, 0x19, 0x6b, 0xab, 0x90, + 0x66, 0xa4, 0xeb, 0x7b, 0x81, 0xa7, 0x6f, 0x4a, + 0x84, 0x74, 0x92, 0x39, 0xa1, 0xae, 0x71, 0x73, + 0x47, 0x92, 0xd2, 0x49, 0x03, 0xb8, 0xbc, 0xd4, + 0xef, 0xf6, 0xfb, 0x28, 0x2c, 0x19, 0x45, 0xb4, + 0x97, 0xbb, 0x3d, 0x75, 0x67, 0x6f, 0x43, 0x31, + 0x94, 0x38, 0x02, 0x69, 0xa2, 0x8d, 0x3f, 0x22, + 0x82, 0x9a, 0x27, 0xc3, 0x2b, 0xe1, 0x90, 0x51, + 0xf1, 0x92, 0xd7, 0x01, 0xa7, 0x48, 0x5e, 0x5a, + 0x4b, 0x4e, 0x26, 0x92, 0x0e, 0xf8, 0xd0, 0xb0, + 0x82, 0x4f, 0x67, 0x0f, 0xf9, 0xcd, 0xb6, 0xf7, + 0x8d, 0xa7, 0xb8, 0xb9, 0xb3, 0x82, 0x3a, 0xce, + 0xf0, 0xff, 0x00, 0x8a, 0xff, 0x00, 0x0f, 0xf4, + 0xae, 0x5e, 0xce, 0xee, 0xfe, 0xea, 0x12, 0x4d, + 0x7b, 0x35, 0xef, 0xa0, 0xb0, 0x67, 0xc4, 0x73, + 0xd9, 0x49, 0xfe, 0xa3, 0x07, 0xd2, 0x6a, 0xe7, + 0xda, 0xcd, 0x39, 0xc3, 0xfb, 0x2c, 0x65, 0x38, + 0x14, 0x3d, 0x4e, 0xff, 0x00, 0x85, 0x0d, 0x4e, + 0xbd, 0xdd, 0x68, 0x26, 0xf6, 0xb4, 0xd6, 0xea, + 0xdc, 0x8d, 0x3f, 0xf6, 0xcd, 0xf0, 0xb9, 0x6e, + 0xce, 0x26, 0x16, 0xec, 0xc9, 0x66, 0xf5, 0x4c, + 0x04, 0xd3, 0x4e, 0x86, 0xe0, 0x27, 0xc0, 0xab, + 0xf5, 0x35, 0xa9, 0xd3, 0xdb, 0xde, 0xfc, 0x8a, + 0x54, 0x91, 0x43, 0x53, 0xab, 0x74, 0xea, 0xde, + 0x41, 0x61, 0xce, 0x32, 0x5b, 0xac, 0xca, 0xfc, + 0x5e, 0x58, 0x86, 0xcd, 0x6f, 0x72, 0x1a, 0x71, + 0xe2, 0x14, 0x69, 0x00, 0x03, 0x5d, 0x3b, 0xc1, + 0x79, 0x89, 0x99, 0x7c, 0x3b, 0x4b, 0x6b, 0x0d, + 0x8b, 0x5a, 0xd8, 0xe2, 0xf1, 0x64, 0x73, 0x4d, + 0x43, 0x9f, 0x42, 0x4e, 0xbe, 0xda, 0x82, 0x6c, + 0xb2, 0xb5, 0xa5, 0x8d, 0x7b, 0x9a, 0xd7, 0x6b, + 0x00, 0x90, 0x17, 0x81, 0xa3, 0x48, 0xd7, 0xbe, + 0x34, 0x20, 0x92, 0xb9, 0xb7, 0x75, 0xde, 0xd0, + 0xcb, 0x6e, 0xd1, 0x51, 0x25, 0xc9, 0x04, 0xee, + 0x53, 0x11, 0xaf, 0x79, 0x78, 0xcf, 0x2e, 0x1b, + 0x73, 0x9a, 0x4c, 0x59, 0xa6, 0x36, 0x11, 0x13, + 0x37, 0xa8, 0xcd, 0x02, 0x8b, 0x85, 0xaf, 0x7b, + 0x1d, 0x8d, 0x8e, 0x2d, 0x76, 0xe3, 0x81, 0xd2, + 0xb1, 0xfd, 0x3d, 0xf4, 0x13, 0xb9, 0xb0, 0x3f, + 0x0d, 0xe5, 0x9e, 0x71, 0xaf, 0x24, 0xa8, 0x21, + 0xa3, 0xe5, 0x4f, 0x00, 0xd5, 0xd8, 0xed, 0x22, + 0x0b, 0x26, 0xc8, 0x96, 0x4c, 0xcb, 0xab, 0x39, + 0x34, 0x83, 0x82, 0x50, 0x3b, 0x2d, 0x3a, 0xfc, + 0x0b, 0x8e, 0x3b, 0xba, 0xed, 0x47, 0xb4, 0x57, + 0x41, 0xb8, 0x2d, 0xee, 0x69, 0x67, 0x81, 0x43, + 0xa7, 0xc9, 0xa4, 0x7e, 0x41, 0x05, 0x87, 0x6b, + 0x9c, 0xc8, 0xdd, 0x6b, 0x69, 0x1e, 0x86, 0x30, + 0x3e, 0x4a, 0x6e, 0x55, 0xc6, 0xab, 0x5d, 0xf8, + 0x3f, 0x0b, 0x65, 0xe2, 0x95, 0xac, 0x8e, 0xaf, + 0x0b, 0xd4, 0x11, 0xa9, 0x35, 0x3a, 0x7b, 0x7a, + 0x4a, 0x6e, 0x53, 0x73, 0x8d, 0x05, 0xb6, 0xe2, + 0xf2, 0x33, 0xb3, 0x5e, 0xd8, 0x3f, 0x6f, 0x2c, + 0x2d, 0xb7, 0x2e, 0xee, 0xe1, 0x3f, 0x2a, 0xe0, + 0x85, 0x8f, 0x7e, 0xc9, 0xbe, 0x36, 0x0f, 0x18, + 0xdc, 0x86, 0xb4, 0x0d, 0xf2, 0x5a, 0x02, 0x81, + 0xd3, 0xaa, 0xba, 0x37, 0x96, 0x43, 0x88, 0x20, + 0xb7, 0x41, 0x04, 0x38, 0x53, 0x45, 0x08, 0xdd, + 0x41, 0x27, 0xb4, 0x2f, 0x6b, 0x2e, 0x59, 0x65, + 0x1f, 0xec, 0xec, 0xa2, 0x6c, 0x42, 0x9b, 0xe4, + 0x55, 0xe5, 0x75, 0x64, 0xef, 0x8a, 0xf7, 0x2b, + 0xb9, 0xc9, 0xde, 0xf0, 0xc9, 0x9e, 0xee, 0x72, + 0x0c, 0x5a, 0x01, 0xd4, 0x7e, 0x45, 0x04, 0xe7, + 0x39, 0xce, 0x2e, 0x71, 0x2e, 0x71, 0xd6, 0x4e, + 0x92, 0x77, 0x56, 0x01, 0x20, 0xd4, 0x12, 0x0e, + 0xff, 0x00, 0x12, 0x0b, 0x0e, 0x53, 0x93, 0x5c, + 0xe5, 0xd7, 0x7e, 0xdf, 0x98, 0xe1, 0x86, 0x1b, + 0x76, 0xb8, 0x8a, 0xb8, 0x1c, 0x44, 0x82, 0x05, + 0x28, 0xbc, 0x64, 0xf9, 0x9c, 0x52, 0xdf, 0xde, + 0xc7, 0x70, 0xe0, 0xc8, 0xb3, 0x1c, 0x58, 0x5c, + 0x75, 0x02, 0x4b, 0xa9, 0xde, 0x2a, 0x0d, 0xf2, + 0xcb, 0x20, 0xa3, 0xde, 0xe7, 0x0d, 0xe2, 0x49, + 0x0b, 0xcf, 0x6d, 0x04, 0xe5, 0xae, 0xcc, 0xde, + 0xc5, 0x7a, 0xc7, 0xdc, 0x61, 0x65, 0xac, 0x4f, + 0x0f, 0x74, 0xd8, 0x85, 0x0b, 0x5a, 0x71, 0x05, + 0xdd, 0x97, 0x5f, 0xb2, 0xfb, 0x6a, 0x64, 0x9e, + 0x33, 0x58, 0x9b, 0x13, 0xa3, 0x69, 0xae, 0x82, + 0x1a, 0x45, 0x0f, 0x76, 0xaa, 0xb0, 0x66, 0x95, + 0xcd, 0xc0, 0xe7, 0xb8, 0xb3, 0xe6, 0xe2, 0x2b, + 0xc0, 0xd0, 0x6b, 0xbb, 0x4a, 0x68, 0xd1, 0xe0, + 0x41, 0xee, 0x6a, 0x19, 0x9f, 0xe7, 0x15, 0xe1, + 0x35, 0xe9, 0x44, 0x05, 0xdd, 0x91, 0xff, 0x00, + 0x38, 0xb4, 0xfb, 0x4f, 0x90, 0xae, 0x15, 0xdd, + 0x91, 0xff, 0x00, 0x38, 0xb4, 0xfb, 0x4f, 0x90, + 0xa0, 0xb1, 0xe6, 0x9e, 0xfb, 0x27, 0x73, 0xc0, + 0xb9, 0x57, 0x56, 0x69, 0xef, 0xb2, 0x77, 0x3c, + 0x0b, 0x95, 0x07, 0xb8, 0x3f, 0x6d, 0x1f, 0x9c, + 0xdf, 0x0a, 0x9a, 0x50, 0xb0, 0x7e, 0xda, 0x3f, + 0x39, 0xbe, 0x15, 0x34, 0x80, 0xa3, 0x73, 0x6f, + 0x7a, 0xb3, 0xfb, 0x4f, 0x94, 0x29, 0x25, 0x1b, + 0x9b, 0x7b, 0xd5, 0x9f, 0xda, 0x7c, 0xa1, 0x06, + 0x32, 0xaf, 0x7a, 0xbc, 0xf3, 0xcf, 0xd6, 0x2a, + 0x4d, 0x46, 0x65, 0x5e, 0xf5, 0x79, 0xe7, 0x9f, + 0xac, 0x54, 0x9a, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x00, 0xd6, 0xa0, 0x9d, + 0xe5, 0x1e, 0xd9, 0x53, 0xa3, 0x5a, 0x82, 0x77, + 0x94, 0x7b, 0x65, 0x01, 0x76, 0x4f, 0x6b, 0x1e, + 0x73, 0x96, 0x1b, 0x57, 0x3b, 0x0d, 0xc4, 0x34, + 0x31, 0xbc, 0xef, 0x8d, 0x55, 0xec, 0x6f, 0xae, + 0x35, 0xee, 0x07, 0xb9, 0xb3, 0xb1, 0xcd, 0x38, + 0x4e, 0x20, 0x2a, 0x3b, 0x26, 0x89, 0x13, 0x31, + 0x3a, 0xc2, 0x26, 0xb1, 0x68, 0x98, 0x9f, 0x05, + 0x4a, 0xe6, 0xde, 0xe2, 0xd2, 0x67, 0x41, 0x70, + 0xde, 0x6e, 0x56, 0x1a, 0x10, 0x7c, 0x20, 0xee, + 0xd5, 0x6a, 0xc4, 0xaf, 0xb9, 0xdc, 0xd9, 0x23, + 0xa6, 0x6d, 0x8e, 0x68, 0xca, 0x17, 0x33, 0x13, + 0x25, 0xa6, 0xa0, 0x4d, 0x35, 0xb7, 0x4a, 0x89, + 0x3b, 0x2b, 0x93, 0x4e, 0x71, 0xdb, 0x66, 0x41, + 0xad, 0x3a, 0x9a, 0x4b, 0x1c, 0x47, 0x09, 0x05, + 0x68, 0xae, 0x68, 0xd3, 0x8b, 0x0d, 0xfc, 0xa5, + 0xa2, 0x67, 0x6c, 0xea, 0xac, 0x62, 0x4c, 0x4a, + 0xcf, 0xf0, 0x6d, 0x91, 0xff, 0x00, 0xfd, 0x8b, + 0x78, 0x1b, 0xe9, 0x27, 0xc1, 0x96, 0x7f, 0x78, + 0x8e, 0x06, 0xf1, 0xa9, 0xef, 0x57, 0x9a, 0x9e, + 0x97, 0x2f, 0x25, 0x63, 0x12, 0x55, 0x59, 0xfe, + 0x0c, 0xb3, 0xfb, 0xc4, 0x70, 0x37, 0x8d, 0x3e, + 0x0c, 0xb3, 0xfb, 0xc4, 0x70, 0x37, 0x8d, 0x3b, + 0xd5, 0xe6, 0x7a, 0x6c, 0xbc, 0x95, 0x8c, 0x49, + 0x89, 0x59, 0xfe, 0x0c, 0xb3, 0xfb, 0xc4, 0x70, + 0x37, 0x8d, 0x3e, 0x0c, 0xb3, 0xfb, 0xc4, 0x70, + 0x37, 0x8d, 0x3b, 0xd5, 0xe6, 0x7a, 0x5c, 0x9c, + 0x95, 0x8c, 0x49, 0x89, 0x59, 0xfe, 0x0c, 0xb3, + 0xfb, 0xc4, 0x70, 0x37, 0x8d, 0x3e, 0x0c, 0xb3, + 0xfb, 0xc4, 0x70, 0x37, 0x8d, 0x3b, 0xd5, 0xe6, + 0x7a, 0x5c, 0x9c, 0x95, 0x8c, 0x49, 0x89, 0x59, + 0xfe, 0x0c, 0xb3, 0xfb, 0xc4, 0x70, 0x37, 0x8d, + 0x3e, 0x0c, 0xb3, 0xfb, 0xc4, 0x70, 0x37, 0x8d, + 0x3b, 0xd5, 0xe6, 0x7a, 0x5c, 0x9c, 0x95, 0x8c, + 0x49, 0x89, 0x59, 0xfe, 0x0c, 0xb3, 0xfb, 0xc4, + 0x70, 0x37, 0x8d, 0x3e, 0x0c, 0xb3, 0xfb, 0xc4, + 0x70, 0x37, 0x8d, 0x3b, 0xd5, 0xe6, 0x7a, 0x5c, + 0x9c, 0x95, 0x8c, 0x49, 0x89, 0x59, 0xfe, 0x0c, + 0xb3, 0xfb, 0xc4, 0x70, 0x37, 0x8d, 0x3e, 0x0c, + 0xb3, 0xfb, 0xc4, 0x70, 0x37, 0x8d, 0x3b, 0xd5, + 0xe6, 0x7a, 0x5c, 0x9c, 0x95, 0x8c, 0x49, 0x89, + 0x59, 0xfe, 0x0c, 0xb3, 0xfb, 0xc4, 0x70, 0x37, + 0x8d, 0x3e, 0x0c, 0xb3, 0xfb, 0xc4, 0x70, 0x37, + 0x8d, 0x3b, 0xd5, 0xe6, 0x7a, 0x5c, 0x9c, 0x95, + 0x8c, 0x49, 0x89, 0x59, 0xfe, 0x0c, 0xb3, 0xfb, + 0xc4, 0x70, 0x37, 0x8d, 0x3e, 0x0c, 0xb3, 0xfb, + 0xc4, 0x70, 0x37, 0x8d, 0x3b, 0xd5, 0xe6, 0x7a, + 0x5c, 0x9c, 0x95, 0x8c, 0x49, 0x89, 0x59, 0xfe, + 0x0c, 0xb3, 0xfb, 0xc4, 0x70, 0x37, 0x8d, 0x3e, + 0x0c, 0xb3, 0xfb, 0xc4, 0x70, 0x37, 0x8d, 0x3b, + 0xd5, 0xe6, 0x7a, 0x5c, 0x9c, 0x95, 0x8c, 0x49, + 0x89, 0x59, 0xfe, 0x0c, 0xb3, 0xfb, 0xc4, 0x70, + 0x37, 0x8d, 0x3e, 0x0c, 0xb3, 0xfb, 0xc4, 0x70, + 0x37, 0x8d, 0x3b, 0xd5, 0xe6, 0x7a, 0x5c, 0x9c, + 0x95, 0x8c, 0x49, 0x89, 0x59, 0xfe, 0x0c, 0xb3, + 0xfb, 0xc4, 0x70, 0x37, 0x8d, 0x3e, 0x0c, 0xb3, + 0xfb, 0xc4, 0x70, 0x37, 0x8d, 0x3b, 0xd5, 0xe6, + 0x7a, 0x5c, 0x9c, 0x95, 0x8c, 0x49, 0x89, 0x59, + 0xfe, 0x0c, 0xb3, 0xfb, 0xc4, 0x70, 0x37, 0x8d, + 0x3e, 0x0c, 0xb3, 0xfb, 0xc4, 0x70, 0x37, 0x8d, + 0x3b, 0xd5, 0xe6, 0x7a, 0x5c, 0x9c, 0x95, 0x8c, + 0x49, 0x89, 0x59, 0xfe, 0x0c, 0xb3, 0xfb, 0xc4, + 0x70, 0x37, 0x8d, 0x3e, 0x0c, 0xb3, 0xfb, 0xc4, + 0x70, 0x37, 0x8d, 0x3b, 0xb5, 0x3d, 0x2e, 0x4e, + 0x4a, 0xc6, 0x24, 0xc4, 0xac, 0xff, 0x00, 0x06, + 0x59, 0xfd, 0xe2, 0x38, 0x1b, 0xc6, 0x9f, 0x06, + 0x59, 0xfd, 0xe2, 0x38, 0x1b, 0xc6, 0x9d, 0xea, + 0x9e, 0x97, 0x2f, 0x25, 0x63, 0x12, 0x62, 0x56, + 0x7f, 0x83, 0x2c, 0xfe, 0xf1, 0x1c, 0x0d, 0xe3, + 0x4f, 0x83, 0x2c, 0xfe, 0xf1, 0x1c, 0x0d, 0xe3, + 0x4e, 0xf5, 0x79, 0x9e, 0x97, 0x2f, 0x25, 0x63, + 0x12, 0x62, 0x56, 0x7f, 0x83, 0x2c, 0xfe, 0xf1, + 0x1c, 0x0d, 0xe3, 0x4f, 0x83, 0x2c, 0xfe, 0xf1, + 0x1c, 0x0d, 0xe3, 0x4e, 0xf5, 0x79, 0x9e, 0x97, + 0x27, 0x25, 0x63, 0x12, 0x62, 0x56, 0x7f, 0x83, + 0x2c, 0xfe, 0xf1, 0x1c, 0x0d, 0xe3, 0x4f, 0x83, + 0x2c, 0xfe, 0xf1, 0x1c, 0x0d, 0xe3, 0x4e, 0xf5, + 0x79, 0x9e, 0x97, 0x27, 0x25, 0x63, 0x12, 0x62, + 0x56, 0x7f, 0x83, 0x2c, 0xfe, 0xf1, 0x1c, 0x0d, + 0xe3, 0x4f, 0x83, 0x2c, 0xfe, 0xf1, 0x1c, 0x0d, + 0xe3, 0x4e, 0xf5, 0x79, 0x9e, 0x97, 0x27, 0x25, + 0x63, 0x12, 0x62, 0x56, 0x7f, 0x83, 0x2c, 0xfe, + 0xf1, 0x1c, 0x0d, 0xe3, 0x4f, 0x83, 0x2c, 0xfe, + 0xf1, 0x1c, 0x0d, 0xe3, 0x4e, 0xf5, 0x79, 0x9e, + 0x97, 0x27, 0x25, 0x63, 0x12, 0x62, 0x56, 0x7f, + 0x83, 0x2c, 0xfe, 0xf1, 0x1c, 0x0d, 0xe3, 0x4f, + 0x83, 0x2c, 0xfe, 0xf1, 0x1c, 0x0d, 0xe3, 0x4e, + 0xf5, 0x79, 0x9e, 0x97, 0x27, 0x25, 0x63, 0x12, + 0xf7, 0x1b, 0x5f, 0x2c, 0x8d, 0x8a, 0x36, 0x97, + 0xbd, 0xda, 0x1a, 0xc6, 0x8a, 0xb8, 0x93, 0xd8, + 0xde, 0x56, 0x41, 0xb2, 0x39, 0x5c, 0x7e, 0x34, + 0xd9, 0x90, 0xc3, 0xbd, 0xe2, 0x0f, 0x95, 0x48, + 0x65, 0x0f, 0xd9, 0xeb, 0x5b, 0xa6, 0x59, 0xe5, + 0xe3, 0x9d, 0x9e, 0x4a, 0xd6, 0x7f, 0x28, 0xe8, + 0x05, 0xde, 0x59, 0xf9, 0x14, 0x5b, 0x35, 0x74, + 0xe0, 0xb5, 0x7c, 0xa5, 0xa6, 0x74, 0xb7, 0xd3, + 0x06, 0x51, 0x97, 0x8c, 0x92, 0xc1, 0xd2, 0xcd, + 0x43, 0x7b, 0x38, 0xf1, 0x9a, 0x34, 0xd3, 0x79, + 0xa0, 0xae, 0x72, 0x49, 0x71, 0x27, 0x5e, 0xb3, + 0xdb, 0x2b, 0xa7, 0x31, 0x7b, 0xdd, 0x77, 0x20, + 0x71, 0x24, 0x34, 0xd1, 0xa3, 0x78, 0x2e, 0x65, + 0xc2, 0x67, 0x59, 0xd5, 0xba, 0xb4, 0x8a, 0xc6, + 0xd8, 0xf0, 0x81, 0x65, 0xbe, 0x50, 0xed, 0xac, + 0x2c, 0xb7, 0xca, 0x1d, 0xbf, 0x95, 0x42, 0xce, + 0xfc, 0xeb, 0x2b, 0xb1, 0xbf, 0x96, 0x27, 0x5d, + 0x5c, 0xfb, 0x3b, 0x98, 0xcc, 0x2d, 0x6d, 0x5a, + 0x2a, 0x09, 0xd7, 0xe3, 0x28, 0xef, 0x86, 0x72, + 0x7f, 0xbc, 0x47, 0x2a, 0x3e, 0x35, 0xe3, 0x6c, + 0x7d, 0xe6, 0xd7, 0xec, 0xcf, 0x85, 0x57, 0xa8, + 0x10, 0x59, 0x3e, 0x19, 0xc9, 0xfe, 0xf1, 0x1c, + 0xa8, 0xf8, 0xd3, 0xe1, 0x9c, 0x9f, 0xef, 0x11, + 0xca, 0x8f, 0x8d, 0x56, 0xe8, 0x12, 0x81, 0x05, + 0x93, 0xe1, 0x9c, 0x9f, 0xef, 0x11, 0xca, 0x8f, + 0x8d, 0x3e, 0x19, 0xc9, 0xfe, 0xf1, 0x1c, 0xa8, + 0xf8, 0xd5, 0x6e, 0x81, 0x28, 0x10, 0x59, 0x3e, + 0x19, 0xc9, 0xfe, 0xf1, 0x1c, 0xa8, 0xf8, 0xd3, + 0xe1, 0x9c, 0x9f, 0xef, 0x11, 0xca, 0x8f, 0x8d, + 0x56, 0xe8, 0x12, 0x81, 0x05, 0x93, 0xe1, 0x9c, + 0x9f, 0xef, 0x11, 0xca, 0x8f, 0x8d, 0x3e, 0x19, + 0xc9, 0xfe, 0xf1, 0x1c, 0xa8, 0xf8, 0xd5, 0x6e, + 0x81, 0x28, 0x10, 0x59, 0x3e, 0x19, 0xc9, 0xfe, + 0xf1, 0x1c, 0xa8, 0xf8, 0xd3, 0xe1, 0x9c, 0x9f, + 0xef, 0x11, 0xca, 0x8f, 0x8d, 0x56, 0xe8, 0x12, + 0x81, 0x05, 0x93, 0xe1, 0x9c, 0x9f, 0xef, 0x11, + 0xca, 0x8f, 0x8d, 0x3e, 0x19, 0xc9, 0xfe, 0xf1, + 0x1c, 0xa8, 0xf8, 0xd5, 0x6e, 0x81, 0x28, 0x10, + 0x59, 0x3e, 0x19, 0xc9, 0xfe, 0xf1, 0x1c, 0xa8, + 0xf8, 0xd3, 0xe1, 0x9c, 0x9f, 0xef, 0x11, 0xca, + 0x8f, 0x8d, 0x56, 0xe8, 0x12, 0x81, 0x05, 0x93, + 0xe1, 0x9c, 0x9f, 0xef, 0x11, 0xca, 0x8f, 0x8d, + 0x3e, 0x19, 0xc9, 0xfe, 0xf1, 0x1c, 0xa8, 0xf8, + 0xd5, 0x6e, 0x81, 0x28, 0x10, 0x59, 0x3e, 0x19, + 0xc9, 0xfe, 0xf1, 0x1c, 0xa8, 0xf8, 0xd3, 0xe1, + 0x9c, 0x9f, 0xef, 0x11, 0xca, 0x8f, 0x8d, 0x56, + 0xe8, 0x12, 0x81, 0x05, 0x93, 0xe1, 0x9c, 0x9f, + 0xef, 0x11, 0xca, 0x8f, 0x8d, 0x3e, 0x19, 0xc9, + 0xfe, 0xf1, 0x1c, 0xa8, 0xf8, 0xd5, 0x6e, 0x8b, + 0x34, 0x41, 0x63, 0xf8, 0x67, 0x27, 0xfb, 0xc4, + 0x72, 0xa3, 0xe3, 0x4f, 0x86, 0x72, 0x7f, 0xbc, + 0x47, 0x2a, 0x3e, 0x35, 0x5c, 0xa2, 0xc5, 0x29, + 0xb9, 0xdd, 0x41, 0x64, 0xf8, 0x67, 0x27, 0xfb, + 0xc4, 0x72, 0xa3, 0xe3, 0x4f, 0x86, 0x72, 0x7f, + 0xbc, 0x47, 0x2a, 0x3e, 0x35, 0x5b, 0xd0, 0xb3, + 0x40, 0x82, 0xc7, 0xf0, 0xce, 0x4f, 0xf7, 0x88, + 0xe5, 0x47, 0xc6, 0x9f, 0x0c, 0xe4, 0xff, 0x00, + 0x78, 0x8e, 0x54, 0x7c, 0x6a, 0xb7, 0x40, 0x94, + 0x08, 0x2c, 0x9f, 0x0c, 0xe4, 0xff, 0x00, 0x78, + 0x8e, 0x54, 0x7c, 0x69, 0xf0, 0xce, 0x4f, 0xf7, + 0x88, 0xe5, 0x47, 0xc6, 0xab, 0x74, 0x09, 0x40, + 0x82, 0xc9, 0xf0, 0xce, 0x4f, 0xf7, 0x88, 0xe5, + 0x47, 0xc6, 0x9f, 0x0c, 0xe4, 0xff, 0x00, 0x78, + 0x8e, 0x54, 0x7c, 0x6a, 0xb7, 0x40, 0x94, 0x08, + 0x2c, 0x9f, 0x0c, 0xe4, 0xff, 0x00, 0x78, 0x8e, + 0x54, 0x7c, 0x69, 0xf0, 0xce, 0x4f, 0xf7, 0x88, + 0xe5, 0x47, 0xc6, 0xab, 0x74, 0x09, 0x40, 0x82, + 0xc9, 0xf0, 0xce, 0x4f, 0xf7, 0x88, 0xe5, 0x47, + 0xc6, 0x9f, 0x0c, 0xe4, 0xff, 0x00, 0x78, 0x8e, + 0x54, 0x7c, 0x6a, 0xb7, 0x40, 0x94, 0x08, 0x2c, + 0x9f, 0x0c, 0xe4, 0xff, 0x00, 0x78, 0x8e, 0x54, + 0x7c, 0x69, 0xf0, 0xce, 0x4f, 0xf7, 0x88, 0xe5, + 0x47, 0xc6, 0xab, 0x74, 0x09, 0x40, 0x82, 0xc9, + 0xf0, 0xce, 0x4f, 0xf7, 0x88, 0xe5, 0x47, 0xc6, + 0x9f, 0x0c, 0xe4, 0xff, 0x00, 0x78, 0x8e, 0x54, + 0x7c, 0x6a, 0xb7, 0x40, 0x94, 0x08, 0x2c, 0x9f, + 0x0c, 0xe4, 0xff, 0x00, 0x78, 0x8e, 0x54, 0x7c, + 0x69, 0xf0, 0xce, 0x4f, 0xf7, 0x88, 0xe5, 0x47, + 0xc6, 0xab, 0x74, 0x09, 0x40, 0x82, 0xc9, 0xf0, + 0xce, 0x4f, 0xf7, 0x88, 0xe5, 0x47, 0xc6, 0x9f, + 0x0c, 0xe4, 0xff, 0x00, 0x78, 0x8e, 0x54, 0x7c, + 0x6a, 0xb7, 0x40, 0x94, 0x08, 0x2c, 0x9f, 0x0c, + 0xe4, 0xff, 0x00, 0x78, 0x8e, 0x54, 0x7c, 0x6b, + 0x7d, 0x8e, 0x43, 0x95, 0xdb, 0x5e, 0x45, 0x3c, + 0x57, 0xc2, 0x49, 0x23, 0x75, 0x5a, 0xcc, 0x4c, + 0xd2, 0x7b, 0x85, 0x55, 0x28, 0x17, 0x76, 0x47, + 0xfc, 0xde, 0xd6, 0x9f, 0x3f, 0xe4, 0x28, 0x2c, + 0x39, 0xa7, 0xbe, 0xc9, 0xdc, 0xf0, 0x2e, 0x55, + 0xd5, 0x9a, 0x7b, 0xec, 0x9d, 0xcf, 0x02, 0xe5, + 0x41, 0xee, 0x0f, 0xdb, 0x47, 0xe7, 0x37, 0xc2, + 0xa6, 0x94, 0x2c, 0x1f, 0xb6, 0x8f, 0xce, 0x6f, + 0x85, 0x4d, 0x20, 0x28, 0xdc, 0xdb, 0xde, 0xac, + 0xfe, 0xd3, 0xe5, 0x0a, 0x49, 0x46, 0xe6, 0xde, + 0xf5, 0x67, 0xf6, 0x9f, 0x28, 0x41, 0x8c, 0xab, + 0xde, 0xaf, 0x3c, 0xf3, 0xf5, 0x8a, 0x93, 0x51, + 0x99, 0x57, 0xbd, 0x5e, 0x79, 0xe7, 0xeb, 0x15, + 0x26, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x35, 0xa8, 0x27, 0x79, 0x47, + 0xb6, 0x54, 0xe8, 0xd6, 0xa0, 0x9d, 0xe5, 0x1e, + 0xd9, 0x40, 0x5e, 0xa2, 0xfd, 0xab, 0x3c, 0xe6, + 0xf8, 0x42, 0xf2, 0xbd, 0x45, 0xfb, 0x56, 0x79, + 0xcd, 0xf0, 0x84, 0x1c, 0x9b, 0x65, 0xfc, 0xca, + 0x3f, 0xb1, 0x1f, 0x59, 0xca, 0x05, 0x4f, 0x6d, + 0x97, 0xf3, 0x38, 0xfe, 0xc4, 0x7d, 0x67, 0x28, + 0x14, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x4e, + 0xd6, 0xb4, 0x0a, 0x13, 0xa0, 0x6b, 0xec, 0x2c, + 0xb8, 0x39, 0xa4, 0xb5, 0xc2, 0x8e, 0x1a, 0xc1, + 0x14, 0x21, 0x4d, 0xe4, 0x70, 0x64, 0x4e, 0xb8, + 0xb7, 0x32, 0x49, 0x24, 0x97, 0x25, 0xc3, 0x0c, + 0x45, 0xb4, 0x60, 0x7e, 0xbd, 0x24, 0x6b, 0x5c, + 0x39, 0xe7, 0xf3, 0x7b, 0xaa, 0xe8, 0x3c, 0xe1, + 0xe1, 0x41, 0xc2, 0xbd, 0x36, 0x29, 0x5c, 0xd2, + 0xf6, 0xb1, 0xc5, 0x8d, 0xd0, 0xe7, 0x01, 0x50, + 0x3b, 0x65, 0x79, 0x53, 0xbb, 0x37, 0x49, 0xad, + 0xb3, 0x1b, 0x23, 0xff, 0x00, 0x16, 0x1c, 0x6d, + 0xed, 0x80, 0x42, 0x08, 0x48, 0xe3, 0x92, 0x47, + 0x61, 0x89, 0x8e, 0x7b, 0xfe, 0x6b, 0x7c, 0x62, + 0x7b, 0x8b, 0xcb, 0x9a, 0xf6, 0xb8, 0xb5, 0xc0, + 0x87, 0x03, 0x4c, 0x27, 0x41, 0x53, 0x9b, 0x29, + 0x86, 0x1b, 0x8b, 0xab, 0xc9, 0x34, 0x36, 0x08, + 0xb4, 0x9f, 0x38, 0xea, 0xef, 0x2d, 0x79, 0xc5, + 0xa6, 0x2d, 0xa2, 0x30, 0x81, 0xa2, 0xe2, 0x48, + 0xc8, 0xed, 0x3a, 0x80, 0xa0, 0x8c, 0xf6, 0x6b, + 0x9c, 0x41, 0x9c, 0xd3, 0xf1, 0x38, 0x62, 0x6b, + 0x70, 0x9c, 0x45, 0xbb, 0xa4, 0x68, 0x5a, 0x95, + 0xa2, 0xf2, 0x7b, 0xf9, 0x76, 0x99, 0xec, 0xcb, + 0xb0, 0x19, 0xa1, 0x87, 0x9b, 0xfd, 0x6f, 0x92, + 0x07, 0x94, 0xea, 0x70, 0x85, 0x05, 0x6d, 0x96, + 0xde, 0x5e, 0xb2, 0x79, 0x20, 0x6b, 0x5d, 0xcc, + 0xe9, 0x90, 0x03, 0x42, 0x49, 0xdc, 0x6a, 0x0e, + 0x44, 0x5d, 0xf7, 0xb9, 0x2d, 0xed, 0x91, 0x80, + 0x48, 0x1a, 0xe9, 0x2e, 0x49, 0x0c, 0x63, 0x09, + 0x2e, 0xa9, 0xa6, 0x83, 0x5f, 0x91, 0x6f, 0x3b, + 0x31, 0x98, 0x80, 0x46, 0x38, 0x9d, 0x30, 0x15, + 0x30, 0x35, 0xe3, 0x18, 0x1d, 0xa4, 0x11, 0x28, + 0xb2, 0xe6, 0xb9, 0xae, 0x73, 0x5c, 0x28, 0xe6, + 0x9c, 0x24, 0x1d, 0x60, 0x85, 0xd7, 0x94, 0x59, + 0x7b, 0x76, 0x61, 0x15, 0xbb, 0xbf, 0x67, 0xe5, + 0x4b, 0xe6, 0x37, 0x49, 0xe1, 0x41, 0xca, 0xe8, + 0xe4, 0x69, 0x68, 0x2c, 0x70, 0x2f, 0xd2, 0xd0, + 0x41, 0x15, 0xae, 0xf6, 0xea, 0xdc, 0xec, 0xbb, + 0x30, 0x63, 0x39, 0xc7, 0x5b, 0x4a, 0xd6, 0x6b, + 0x2e, 0x2c, 0x34, 0xee, 0xe8, 0x53, 0xb9, 0x2b, + 0xd9, 0x7d, 0x9b, 0xdf, 0x5f, 0x3d, 0xb8, 0x8c, + 0x2c, 0xad, 0xbb, 0x35, 0x80, 0x05, 0x5a, 0xda, + 0x72, 0x57, 0x0d, 0xae, 0xd1, 0xe6, 0x6c, 0xbc, + 0x64, 0xb7, 0x13, 0x93, 0x0e, 0x30, 0x25, 0x8c, + 0x81, 0x40, 0xd2, 0x74, 0xee, 0x68, 0xa2, 0x08, + 0xa6, 0x47, 0x24, 0x81, 0xce, 0x63, 0x1c, 0xf6, + 0xb3, 0x4b, 0xcb, 0x41, 0x34, 0xe0, 0x46, 0xb1, + 0xf2, 0x38, 0x35, 0x8d, 0x2e, 0x7b, 0xbc, 0x96, + 0x34, 0x54, 0x9a, 0x6e, 0xab, 0x2e, 0x53, 0x35, + 0x9c, 0xd9, 0xcd, 0xec, 0x36, 0xa7, 0xfe, 0xda, + 0xf2, 0x22, 0x40, 0xa5, 0x34, 0xea, 0x77, 0x85, + 0x70, 0xec, 0xc4, 0x58, 0x33, 0x57, 0x49, 0x26, + 0x86, 0xdb, 0x47, 0x23, 0x9e, 0x77, 0x88, 0xf1, + 0x50, 0x43, 0xbd, 0x8e, 0x61, 0x2d, 0x78, 0x2d, + 0x70, 0xdc, 0x22, 0x84, 0x77, 0x17, 0xb7, 0x5b, + 0xce, 0xd6, 0x73, 0x8e, 0x89, 0xe1, 0x94, 0x07, + 0x11, 0x69, 0xa5, 0x0f, 0x64, 0xe8, 0x52, 0x9b, + 0x4b, 0x10, 0x7e, 0x6a, 0xc9, 0x58, 0xdf, 0x16, + 0xea, 0x38, 0xde, 0x37, 0xce, 0x2d, 0x0a, 0x52, + 0xf6, 0xe2, 0x36, 0x67, 0x76, 0xd9, 0x63, 0xc8, + 0x75, 0xbb, 0xe0, 0x16, 0xf2, 0x37, 0x73, 0xc7, + 0xf2, 0x4f, 0x6e, 0xa0, 0x20, 0xa9, 0xe9, 0xe2, + 0x28, 0xb6, 0xdd, 0x5b, 0xbe, 0xda, 0xe6, 0x5b, + 0x77, 0xf9, 0x51, 0x38, 0xb6, 0xbb, 0xfd, 0x95, + 0xa9, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x3b, 0x0a, + 0x53, 0x66, 0xff, 0x00, 0x9d, 0xdb, 0x7f, 0x6f, + 0xea, 0x15, 0x16, 0xa5, 0x36, 0x6b, 0xf9, 0xdd, + 0xb7, 0xf6, 0xbe, 0xa1, 0x41, 0x37, 0x98, 0x7b, + 0xec, 0xbe, 0x77, 0xc8, 0x17, 0x3a, 0xe8, 0xcc, + 0x3d, 0xf6, 0x6f, 0x3b, 0xe4, 0x0b, 0x9d, 0x01, + 0x1b, 0xe5, 0x0f, 0xcb, 0x75, 0x11, 0xbe, 0x50, + 0xfc, 0xb7, 0x50, 0x6b, 0xdb, 0x1f, 0x79, 0xb5, + 0xfb, 0x33, 0xe1, 0x55, 0xf5, 0x60, 0xdb, 0x1f, + 0x79, 0xb5, 0xfb, 0x33, 0xe1, 0x55, 0xf4, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x41, 0x83, 0xa8, + 0xd3, 0x5a, 0xb5, 0x66, 0x57, 0xd0, 0xe5, 0x90, + 0xda, 0x06, 0x59, 0xc1, 0x2f, 0x3d, 0x1e, 0x27, + 0x17, 0xb4, 0x03, 0x50, 0x06, 0xf0, 0x55, 0x57, + 0x6a, 0x2a, 0xd9, 0x9b, 0x5b, 0xe5, 0x72, 0xc3, + 0x65, 0xed, 0xf7, 0x0e, 0x80, 0xb6, 0x2a, 0x30, + 0x34, 0x13, 0x50, 0x43, 0x7b, 0x05, 0x04, 0x26, + 0x63, 0x9c, 0xb6, 0xf2, 0xd8, 0xc2, 0x2c, 0xe2, + 0x80, 0xeb, 0xc7, 0x10, 0xa3, 0xb4, 0x77, 0x02, + 0x98, 0xcd, 0xef, 0xa2, 0xcb, 0x45, 0xb4, 0x71, + 0xd9, 0xc1, 0x20, 0x92, 0x2c, 0x4e, 0x2e, 0x60, + 0xad, 0x69, 0xda, 0x50, 0xb9, 0x95, 0xbe, 0x51, + 0x0c, 0x01, 0xd6, 0x17, 0x2f, 0x9e, 0x42, 0x68, + 0xe6, 0xb9, 0xa4, 0x51, 0xb4, 0x35, 0x3a, 0x82, + 0x9d, 0xce, 0xf2, 0xc6, 0x5e, 0x7b, 0x2b, 0x9d, + 0x75, 0x0d, 0xb6, 0x18, 0xa9, 0x86, 0x53, 0x42, + 0xed, 0x1b, 0x9a, 0x42, 0x0e, 0x2b, 0xc8, 0xad, + 0x33, 0x1c, 0x9a, 0x4c, 0xce, 0x08, 0x1b, 0x6f, + 0x71, 0x6e, 0xea, 0x48, 0xd6, 0x68, 0x69, 0xa6, + 0xbd, 0x03, 0xce, 0x5a, 0xf6, 0x82, 0x28, 0xa3, + 0xb4, 0xcb, 0x4c, 0x6c, 0x6b, 0x31, 0xc4, 0x4b, + 0x8b, 0x40, 0x15, 0xd0, 0xcd, 0x74, 0x5e, 0xef, + 0xae, 0x2c, 0xac, 0x32, 0x77, 0x65, 0x76, 0xb3, + 0x36, 0xe2, 0x69, 0x9d, 0x8a, 0x59, 0x1b, 0xe4, + 0xef, 0x9d, 0x3a, 0x77, 0x05, 0x13, 0x68, 0xfd, + 0xd3, 0x2b, 0xfb, 0x27, 0x78, 0x18, 0x82, 0x09, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x17, 0x6e, + 0x47, 0xfc, 0xde, 0xd3, 0xed, 0x3e, 0x42, 0xb8, + 0x97, 0x6e, 0x47, 0xfc, 0xde, 0xd3, 0xed, 0x3e, + 0x42, 0x82, 0xc3, 0x9a, 0x7b, 0xeb, 0xfb, 0x9e, + 0x05, 0xca, 0xba, 0xb3, 0x4f, 0x7d, 0x7f, 0x73, + 0xc0, 0xb9, 0x50, 0x7b, 0x83, 0xf6, 0xd1, 0xf9, + 0xcd, 0xf0, 0xa9, 0xa5, 0x0b, 0x07, 0xed, 0xa3, + 0xf3, 0x9b, 0xe1, 0x53, 0x48, 0x0a, 0x37, 0x36, + 0xf7, 0xab, 0x3f, 0xb4, 0xf9, 0x42, 0x92, 0x51, + 0xb9, 0xb7, 0xbd, 0x59, 0xfd, 0xa7, 0xca, 0x10, + 0x63, 0x2a, 0xf7, 0xab, 0xcf, 0x3c, 0xfd, 0x62, + 0xa4, 0xd4, 0x66, 0x55, 0xef, 0x57, 0x9e, 0x79, + 0xfa, 0xc5, 0x49, 0xd5, 0x01, 0x12, 0xa9, 0x54, + 0x04, 0x4a, 0xa5, 0x50, 0x11, 0x2a, 0x95, 0x40, + 0x44, 0xaa, 0x55, 0x01, 0x12, 0xa9, 0x54, 0x04, + 0x4a, 0xa5, 0x50, 0x11, 0x2a, 0x95, 0x40, 0x44, + 0xaa, 0x55, 0x01, 0x12, 0xa9, 0x54, 0x04, 0x4a, + 0xa5, 0x50, 0x11, 0x2a, 0x95, 0x40, 0x44, 0xaa, + 0x55, 0x01, 0x12, 0xa9, 0x54, 0x04, 0x4a, 0xa5, + 0x50, 0x11, 0x2a, 0x95, 0x40, 0x44, 0xaa, 0x55, + 0x01, 0x12, 0xa9, 0x54, 0x04, 0x4a, 0xa5, 0x50, + 0x11, 0x2a, 0x95, 0x40, 0x44, 0xaa, 0x55, 0x01, + 0x12, 0xa9, 0x54, 0x04, 0x4a, 0xa5, 0x50, 0x11, + 0x2a, 0x95, 0x40, 0x44, 0xaa, 0x55, 0x01, 0x12, + 0xa9, 0x54, 0x04, 0x4a, 0xa5, 0x50, 0x06, 0xb5, + 0x04, 0xef, 0x28, 0xf6, 0xca, 0x9d, 0x07, 0x4a, + 0x82, 0x77, 0x94, 0x7b, 0x65, 0x01, 0x7a, 0x8b, + 0xf6, 0xac, 0xf3, 0x9b, 0xe1, 0x0b, 0xca, 0xf5, + 0x19, 0xc3, 0x23, 0x1c, 0x75, 0x07, 0x34, 0x9e, + 0xd0, 0x21, 0x07, 0x26, 0xd9, 0x7f, 0x32, 0x8b, + 0xec, 0x47, 0xd6, 0x72, 0x81, 0x56, 0x1d, 0xb3, + 0x8d, 0xc2, 0xf6, 0x09, 0x69, 0xe2, 0xbe, 0x3c, + 0x20, 0xf6, 0x5a, 0x49, 0xf9, 0x55, 0x79, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x07, 0x76, + 0x49, 0xfc, 0xde, 0xd3, 0xed, 0x07, 0x80, 0xa6, + 0x7c, 0x69, 0x9b, 0xde, 0x13, 0xb8, 0xf2, 0xb1, + 0x92, 0x1a, 0x66, 0xf6, 0x84, 0xfa, 0xc1, 0xe0, + 0x2b, 0xd6, 0x7b, 0xfc, 0xde, 0xe8, 0x8d, 0x45, + 0xe6, 0x87, 0x71, 0x06, 0xfb, 0x7d, 0x9c, 0x96, + 0x68, 0xa3, 0x98, 0x5d, 0xc0, 0x39, 0xc1, 0x5c, + 0x2e, 0x3a, 0x40, 0x2b, 0x66, 0x42, 0x3d, 0x8b, + 0x3f, 0x6c, 0x0e, 0x70, 0x7e, 0x20, 0xe8, 0x9c, + 0x5b, 0xe4, 0x9a, 0x8a, 0x8f, 0x02, 0x85, 0xd5, + 0xda, 0x5b, 0xac, 0xe6, 0xe6, 0x2f, 0x20, 0x9f, + 0xd5, 0xc8, 0xc2, 0x4f, 0x77, 0x4a, 0x09, 0x87, + 0x42, 0x6c, 0x72, 0x6c, 0xd2, 0xba, 0x39, 0xcb, + 0x8e, 0x65, 0xa7, 0xb0, 0xd3, 0x5e, 0xfa, 0xef, + 0x30, 0xfb, 0x56, 0x75, 0x95, 0xde, 0x6b, 0x0f, + 0xb7, 0x2f, 0x79, 0xec, 0xb0, 0x7e, 0x92, 0xd5, + 0xb5, 0xb2, 0x45, 0x1d, 0xb4, 0x30, 0xc4, 0x45, + 0x27, 0x95, 0xd2, 0xbe, 0x9a, 0x74, 0xe1, 0xd6, + 0xb7, 0xe5, 0xb3, 0xb0, 0x6c, 0xe0, 0xba, 0x3f, + 0xb5, 0xb5, 0x8a, 0x58, 0xda, 0x77, 0x74, 0xea, + 0xf9, 0x10, 0x70, 0xe4, 0x13, 0xfb, 0x46, 0xd2, + 0xdc, 0x4d, 0xb9, 0x20, 0x94, 0x8e, 0xd6, 0x26, + 0xd1, 0x63, 0x67, 0xa5, 0x7c, 0x56, 0x59, 0xac, + 0xb1, 0xe8, 0x7b, 0x1b, 0x56, 0x9d, 0xe3, 0x47, + 0x50, 0xad, 0x3b, 0x25, 0xa3, 0x37, 0xa9, 0xd0, + 0x39, 0x97, 0xeb, 0xed, 0x8e, 0x25, 0xef, 0x25, + 0xa7, 0x56, 0xe6, 0xd5, 0xd1, 0x56, 0x1a, 0x70, + 0x14, 0x1a, 0xb6, 0x5d, 0xbc, 0xf6, 0x74, 0xd9, + 0x25, 0x25, 0xce, 0x6b, 0x1d, 0x26, 0x22, 0x7f, + 0x3b, 0x40, 0xd3, 0xc2, 0xba, 0xe0, 0xcb, 0xc4, + 0x39, 0xa8, 0xbf, 0x93, 0x31, 0xb6, 0xc4, 0x25, + 0x2f, 0x78, 0xe7, 0x05, 0x4b, 0x49, 0xf2, 0x75, + 0xa8, 0xed, 0x9e, 0xbc, 0x8e, 0xd3, 0x34, 0x8e, + 0x49, 0x4e, 0x18, 0xde, 0xd7, 0x46, 0xf7, 0x6f, + 0x07, 0x52, 0x9d, 0xf0, 0xbb, 0x5b, 0xb3, 0x93, + 0x8c, 0xcd, 0xd2, 0x5c, 0x35, 0x9d, 0x5f, 0x8c, + 0xc8, 0xe9, 0xb1, 0x0c, 0x25, 0x87, 0x4d, 0x34, + 0x69, 0x41, 0x1b, 0x9d, 0xba, 0x17, 0x66, 0xd7, + 0x26, 0x07, 0x35, 0xec, 0x2f, 0xa8, 0x73, 0x48, + 0x23, 0x48, 0x1b, 0xdd, 0x95, 0xdd, 0xb3, 0x00, + 0x34, 0xdf, 0xcf, 0xf9, 0xd0, 0xdb, 0x92, 0xd3, + 0xdb, 0xc5, 0xc4, 0xa2, 0xef, 0x5d, 0x6e, 0xeb, + 0xb9, 0x5d, 0x6a, 0xdc, 0x16, 0xe5, 0xc7, 0x9a, + 0x68, 0xae, 0x80, 0x3b, 0x67, 0xba, 0xa4, 0xf6, + 0x5d, 0xe0, 0xdc, 0xdc, 0xdb, 0x1f, 0xff, 0x00, + 0x73, 0x03, 0x9a, 0x3b, 0x24, 0x57, 0x8d, 0x04, + 0x76, 0x5f, 0x7f, 0x73, 0x97, 0xdc, 0x7b, 0x44, + 0x1a, 0x4b, 0x45, 0x1e, 0xd3, 0xa8, 0x8d, 0xda, + 0xd1, 0x4c, 0x47, 0x36, 0xcf, 0xe7, 0x12, 0xf3, + 0x73, 0xc2, 0xeb, 0x3b, 0xb9, 0x0d, 0x1b, 0x23, + 0x0f, 0x8a, 0x5c, 0x7b, 0x4b, 0x46, 0xce, 0xbe, + 0xdf, 0x9c, 0xbb, 0xb1, 0xba, 0x22, 0x33, 0x73, + 0x19, 0x8d, 0x8f, 0x75, 0x34, 0x3b, 0x48, 0x3a, + 0xfb, 0x6b, 0x30, 0x6c, 0xc6, 0x62, 0xdb, 0xa6, + 0x1b, 0x8c, 0x11, 0xc1, 0x1b, 0x83, 0x9d, 0x36, + 0x21, 0x4a, 0x0d, 0x3a, 0x10, 0x79, 0xb4, 0xb6, + 0x93, 0x28, 0xda, 0x28, 0x21, 0x90, 0x82, 0x03, + 0x83, 0x43, 0xc6, 0x8c, 0x4d, 0x90, 0x50, 0x77, + 0xd7, 0x63, 0xa1, 0xf6, 0x21, 0x9f, 0x4c, 0x05, + 0x3f, 0xe1, 0xb3, 0xff, 0x00, 0xcb, 0xa7, 0xfb, + 0xeb, 0x83, 0x3f, 0xcc, 0x23, 0xb9, 0xcd, 0xf9, + 0xeb, 0x77, 0x55, 0xb0, 0xe1, 0x6b, 0x5e, 0x37, + 0x48, 0xde, 0x53, 0x1b, 0x4f, 0x24, 0x43, 0x2a, + 0x0f, 0x87, 0xca, 0xbd, 0x91, 0x8e, 0x77, 0x64, + 0x06, 0xd7, 0x89, 0x07, 0x3f, 0x31, 0xed, 0xaf, + 0xc8, 0xa6, 0xd6, 0x0d, 0x58, 0xee, 0xd4, 0x47, + 0x17, 0xf7, 0x54, 0x5e, 0x65, 0x74, 0xe7, 0xe7, + 0xd2, 0x5c, 0x37, 0x5b, 0x26, 0x01, 0xbd, 0x8c, + 0x04, 0x0f, 0x08, 0x53, 0x9b, 0x37, 0x34, 0x47, + 0x28, 0x32, 0x4a, 0x7c, 0x7b, 0x47, 0xc8, 0x5b, + 0x5d, 0xc0, 0x42, 0xac, 0x5a, 0x35, 0xf7, 0x37, + 0xd0, 0xb5, 0xda, 0x5d, 0x3c, 0xad, 0x2e, 0xfe, + 0xd3, 0xb4, 0xa0, 0x90, 0xda, 0xa8, 0xda, 0xcc, + 0xe6, 0x4c, 0x3a, 0x31, 0xb1, 0x8e, 0x3d, 0xba, + 0x53, 0xe4, 0x51, 0x0a, 0x4f, 0x69, 0x67, 0x13, + 0x67, 0x33, 0x91, 0xa4, 0x46, 0x04, 0x7c, 0x91, + 0xfd, 0x2a, 0x31, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x14, 0xa6, 0xcd, 0x7f, 0x3b, 0xb6, 0xfe, 0xd7, + 0xd4, 0x2a, 0x2d, 0x4b, 0x6c, 0xb4, 0x4e, 0x7e, + 0x75, 0x13, 0xa9, 0xa2, 0x36, 0xb9, 0xc7, 0xb4, + 0x5a, 0x42, 0x09, 0x9c, 0xc3, 0xdf, 0x66, 0xf3, + 0xbe, 0x40, 0xb9, 0xd6, 0xfb, 0xe7, 0x07, 0x5e, + 0x4c, 0x46, 0xac, 0x5f, 0x20, 0x5a, 0x10, 0x11, + 0xbe, 0x50, 0xfc, 0xb7, 0x51, 0x1b, 0xe5, 0x0f, + 0xcb, 0x75, 0x06, 0xbd, 0xb1, 0xf7, 0x9b, 0x5f, + 0xb3, 0x3e, 0x15, 0x5f, 0x56, 0x0d, 0xb2, 0xf7, + 0x9b, 0x63, 0xbd, 0x19, 0xf0, 0xaa, 0xfd, 0x0a, + 0x02, 0x25, 0x0a, 0x50, 0xa0, 0x22, 0x50, 0xa5, + 0x0a, 0x02, 0x25, 0x0a, 0x50, 0xa0, 0x22, 0x50, + 0xa5, 0x0a, 0x02, 0x25, 0x0a, 0x50, 0xa0, 0x22, + 0x50, 0xa5, 0x0a, 0x02, 0x25, 0x0a, 0x50, 0xa0, + 0x22, 0x50, 0xa5, 0x0a, 0x02, 0x25, 0x0a, 0x50, + 0xa0, 0xc1, 0xd4, 0x55, 0x8f, 0x68, 0x6d, 0x6e, + 0x6e, 0x22, 0xb0, 0x30, 0x44, 0xf9, 0x70, 0xc3, + 0xe3, 0x60, 0x69, 0x75, 0x2b, 0x87, 0x79, 0x57, + 0x74, 0xae, 0xe6, 0xe7, 0xb9, 0xc3, 0x1a, 0xd6, + 0x36, 0xe9, 0xc1, 0xad, 0x14, 0x00, 0x35, 0xb4, + 0x00, 0x7f, 0x65, 0x07, 0x3c, 0xd6, 0x37, 0xb0, + 0xc6, 0xe9, 0x26, 0x82, 0x48, 0xd8, 0x06, 0x97, + 0x3d, 0x8e, 0x68, 0xe1, 0x21, 0x4b, 0xed, 0x59, + 0xf1, 0xec, 0x7e, 0xc7, 0x89, 0x46, 0xdc, 0xe6, + 0xd9, 0x9d, 0xd4, 0x26, 0x1b, 0x89, 0xdd, 0x24, + 0x6e, 0xa5, 0x5a, 0x43, 0x46, 0xae, 0xd3, 0x56, + 0xab, 0x9b, 0xcb, 0xab, 0xbc, 0x26, 0xe6, 0x43, + 0x21, 0x63, 0x70, 0xb0, 0x10, 0x05, 0x07, 0x70, + 0x04, 0x1a, 0x0e, 0xad, 0x3b, 0xdc, 0x6a, 0x77, + 0x68, 0xcf, 0xfd, 0xa6, 0x57, 0xf6, 0x2e, 0xf0, + 0x31, 0x41, 0x90, 0x6a, 0x56, 0xe9, 0xef, 0x2e, + 0xae, 0x59, 0x1b, 0x27, 0x90, 0xc8, 0xd8, 0x45, + 0x23, 0x69, 0x00, 0x00, 0x34, 0x68, 0xef, 0x20, + 0xd2, 0x89, 0x44, 0xa1, 0x40, 0x44, 0xa1, 0x4a, + 0x14, 0x04, 0x4a, 0x14, 0xa1, 0x40, 0x44, 0xa1, + 0x4a, 0x14, 0x04, 0x4a, 0x14, 0xa1, 0x40, 0x44, + 0xa1, 0x4a, 0x14, 0x04, 0x4a, 0x14, 0xa1, 0x40, + 0x44, 0xa1, 0x4a, 0x14, 0x04, 0x4a, 0x14, 0xa1, + 0x40, 0x5d, 0xb9, 0x1f, 0xf3, 0x7b, 0x4f, 0xb4, + 0xf9, 0x0a, 0xe2, 0xa1, 0x5d, 0xd9, 0x1f, 0xf3, + 0x7b, 0x4f, 0x3f, 0xe4, 0x28, 0x2c, 0x19, 0xa7, + 0xbe, 0xbf, 0xb9, 0xe0, 0x5c, 0xab, 0xab, 0x34, + 0x3f, 0xf7, 0xb2, 0x77, 0x3c, 0x0b, 0x95, 0x07, + 0xb8, 0x3f, 0x6d, 0x1f, 0x9c, 0xdf, 0x0a, 0x9a, + 0x50, 0xb0, 0x7e, 0xda, 0x3f, 0x39, 0xbe, 0x15, + 0x35, 0x54, 0x05, 0x1b, 0x9b, 0x7b, 0xd5, 0x9f, + 0xda, 0x7c, 0xa1, 0x49, 0x28, 0xdc, 0xdb, 0xde, + 0xac, 0xfe, 0xd3, 0xe5, 0x08, 0x31, 0x95, 0x68, + 0xba, 0xbc, 0xf3, 0xcf, 0xd6, 0x2a, 0x4e, 0xa1, + 0x46, 0x65, 0x7e, 0xf5, 0x79, 0xe7, 0x9f, 0xac, + 0x54, 0x92, 0x0c, 0xd4, 0x25, 0x42, 0xc2, 0x20, + 0xcd, 0x42, 0x54, 0x2c, 0x22, 0x0c, 0xd4, 0x25, + 0x42, 0xc2, 0x20, 0xcd, 0x42, 0x54, 0x2c, 0x22, + 0x0c, 0xd4, 0x25, 0x42, 0xc2, 0x20, 0xcd, 0x42, + 0x54, 0x2c, 0x22, 0x0c, 0xd4, 0x25, 0x42, 0xc2, + 0x20, 0xcd, 0x42, 0x54, 0x2c, 0x22, 0x0c, 0xd4, + 0x25, 0x42, 0xc2, 0x20, 0xcd, 0x42, 0x54, 0x2c, + 0x22, 0x0c, 0xd4, 0x25, 0x42, 0xc2, 0x20, 0xcd, + 0x42, 0x54, 0x2c, 0x22, 0x0c, 0xd4, 0x25, 0x42, + 0xc2, 0x20, 0xcd, 0x42, 0x54, 0x2c, 0x22, 0x0c, + 0xd4, 0x25, 0x42, 0xc2, 0x20, 0xcd, 0x42, 0x54, + 0x2c, 0x22, 0x0c, 0xd4, 0x25, 0x42, 0xc2, 0x20, + 0xcd, 0x42, 0x54, 0x2c, 0x22, 0x0c, 0xd4, 0x25, + 0x42, 0xc2, 0x20, 0xcd, 0x42, 0x54, 0x2c, 0x22, + 0x0c, 0xd4, 0x25, 0x42, 0xc2, 0x20, 0xcd, 0x42, + 0x54, 0x2c, 0x22, 0x0c, 0xd4, 0x25, 0x42, 0xc2, + 0x20, 0xcd, 0x42, 0x54, 0x2c, 0x22, 0x0c, 0xd4, + 0x25, 0x42, 0xc2, 0x20, 0xcd, 0x42, 0x54, 0x2c, + 0x22, 0x0c, 0x82, 0x2a, 0xa0, 0x9d, 0xe5, 0x1e, + 0xd9, 0x53, 0x83, 0x5a, 0x83, 0x77, 0x94, 0x7b, + 0x65, 0x01, 0x3b, 0x07, 0x56, 0xea, 0x22, 0x0e, + 0xe9, 0x6d, 0xe0, 0xce, 0xb2, 0xef, 0x64, 0x95, + 0xd8, 0x67, 0x8b, 0x4b, 0x1f, 0xbc, 0xe1, 0xa8, + 0xf6, 0x95, 0x52, 0xf3, 0x2d, 0xbd, 0xb2, 0x91, + 0xcc, 0xb8, 0x88, 0xb7, 0x49, 0x21, 0xc3, 0x4b, + 0x4f, 0x65, 0xa5, 0x4f, 0x35, 0xce, 0x6b, 0x83, + 0x9a, 0x4b, 0x5c, 0x35, 0x11, 0xa0, 0xae, 0xe8, + 0xb3, 0x8b, 0x86, 0xb7, 0x0c, 0x8d, 0x12, 0x76, + 0x75, 0x14, 0x14, 0xac, 0x27, 0x70, 0x13, 0xdc, + 0x29, 0x85, 0xdb, 0xc7, 0x80, 0xf1, 0x2b, 0xb1, + 0xcd, 0x9b, 0xd1, 0xd8, 0x7b, 0x6b, 0x1d, 0x6e, + 0xde, 0x8c, 0xce, 0xf2, 0x0a, 0x56, 0x17, 0x6f, + 0x1e, 0x03, 0xc4, 0x98, 0x5d, 0xbc, 0x78, 0x0f, + 0x12, 0xba, 0xf5, 0xbb, 0x7a, 0x33, 0x3b, 0xc9, + 0xd6, 0xed, 0xe8, 0xcc, 0xef, 0x20, 0xa5, 0x61, + 0x76, 0xf1, 0xe0, 0x3c, 0x49, 0x85, 0xdb, 0xc7, + 0x80, 0xf1, 0x2b, 0xaf, 0x5b, 0xb7, 0xa3, 0x33, + 0xbc, 0x9d, 0x6e, 0xde, 0x8c, 0xce, 0xf2, 0x0a, + 0x56, 0x17, 0x6f, 0x1e, 0x03, 0xc4, 0x98, 0x5d, + 0xbc, 0x78, 0x0f, 0x12, 0xba, 0xf5, 0xbb, 0x7a, + 0x33, 0x3b, 0xc9, 0xd6, 0xed, 0xe8, 0xcc, 0xef, + 0x20, 0xa5, 0x61, 0x76, 0xf1, 0xe0, 0x3c, 0x49, + 0x85, 0xdb, 0xc7, 0x80, 0xf1, 0x2b, 0xaf, 0x5b, + 0xb7, 0xa3, 0x33, 0xbc, 0x9d, 0x6e, 0xde, 0x8c, + 0xce, 0xf2, 0x0a, 0x56, 0x17, 0x6f, 0x1e, 0x03, + 0xc4, 0x98, 0x5d, 0xbc, 0x78, 0x0f, 0x12, 0xba, + 0xf5, 0xbb, 0x7a, 0x33, 0x3b, 0xc9, 0xd6, 0xed, + 0xe8, 0xcc, 0xef, 0x20, 0xa5, 0x61, 0x3b, 0xc7, + 0x80, 0xa6, 0x13, 0xbc, 0x6b, 0xbb, 0xa0, 0xeb, + 0x57, 0x5e, 0xb7, 0x6f, 0x46, 0x67, 0x79, 0x3a, + 0xdd, 0xbd, 0x19, 0x9d, 0xe4, 0x14, 0xac, 0x2e, + 0xde, 0x3c, 0x07, 0x89, 0x30, 0x9d, 0xe3, 0xc0, + 0x78, 0x95, 0xd7, 0xad, 0xdb, 0xd1, 0x99, 0xde, + 0x4e, 0xb7, 0x6f, 0x46, 0x67, 0x79, 0x05, 0x2c, + 0x87, 0x9d, 0x60, 0xf6, 0xf4, 0x9f, 0x0a, 0xc6, + 0x13, 0xaa, 0x9a, 0x37, 0xa8, 0x69, 0xe0, 0x57, + 0x5e, 0xb7, 0x6f, 0x46, 0x67, 0x79, 0x3a, 0xdd, + 0xbd, 0x19, 0x9d, 0xe4, 0x14, 0xa0, 0xd7, 0x03, + 0x5a, 0x1d, 0x22, 0x84, 0x00, 0x47, 0x81, 0x03, + 0x08, 0xd4, 0x0e, 0x9d, 0x7a, 0x08, 0x57, 0x5e, + 0xb7, 0x6f, 0x46, 0x67, 0x79, 0x3a, 0xdd, 0xbd, + 0x19, 0x9d, 0xe4, 0x14, 0xac, 0x2e, 0xde, 0x3c, + 0x07, 0x89, 0x7a, 0x2e, 0x98, 0xb3, 0x05, 0x5f, + 0x83, 0xe6, 0xf8, 0xd4, 0x57, 0x3e, 0xb7, 0x6f, + 0x46, 0x67, 0x79, 0x3a, 0xdd, 0xbd, 0x19, 0x9d, + 0xe4, 0x14, 0xac, 0x2e, 0xde, 0x35, 0xdd, 0xd0, + 0x78, 0x96, 0xdb, 0x49, 0xe5, 0xb4, 0xb9, 0x8e, + 0xe6, 0x30, 0x71, 0x44, 0xe0, 0xed, 0x47, 0x56, + 0xe8, 0xd5, 0xbc, 0xae, 0x1d, 0x6e, 0xde, 0x8c, + 0xce, 0xf2, 0xcf, 0x5b, 0xb7, 0xa3, 0x33, 0xbc, + 0x82, 0xa7, 0x9a, 0x7b, 0x3c, 0x97, 0xb2, 0x4b, + 0x6a, 0x71, 0x45, 0x35, 0x24, 0x1a, 0x0f, 0x8a, + 0xe7, 0x69, 0x73, 0x75, 0x6f, 0xae, 0x72, 0xf9, + 0xdc, 0xdc, 0x25, 0xcf, 0x2d, 0xdc, 0x15, 0x75, + 0x15, 0xd3, 0xad, 0xdb, 0xd1, 0xd9, 0xde, 0x4e, + 0xb7, 0x6f, 0x46, 0x67, 0x79, 0x05, 0x27, 0x0b, + 0xb7, 0x8f, 0x6a, 0x86, 0x9e, 0x04, 0xc0, 0x4e, + 0xb1, 0x5e, 0xd8, 0x3a, 0x3b, 0x5a, 0x15, 0xd7, + 0xad, 0xdb, 0xd1, 0x99, 0xde, 0x4e, 0xb7, 0x6f, + 0x46, 0x67, 0x79, 0x05, 0x2e, 0x8e, 0x1b, 0x86, + 0x9b, 0xc0, 0x11, 0xe0, 0x5d, 0xb9, 0x44, 0xf0, + 0x5a, 0x5c, 0x3e, 0xee, 0x52, 0x31, 0x5b, 0xb0, + 0x98, 0x23, 0xa1, 0xab, 0x9e, 0x46, 0x16, 0xee, + 0x6e, 0x55, 0x59, 0xfa, 0xd9, 0xbd, 0x19, 0x9d, + 0xe4, 0xeb, 0x66, 0x74, 0x66, 0x77, 0x90, 0x52, + 0xde, 0x64, 0x7c, 0x8e, 0x7b, 0xc1, 0x2f, 0x79, + 0x2e, 0x79, 0xa1, 0xd2, 0x49, 0xa9, 0xdc, 0x58, + 0xc2, 0xed, 0xe3, 0xc0, 0x78, 0x95, 0xd7, 0xad, + 0x9b, 0xd1, 0x99, 0xde, 0x4e, 0xb7, 0x6f, 0x46, + 0x67, 0x79, 0x05, 0x2b, 0x0b, 0xb7, 0x8f, 0x01, + 0xe2, 0x4c, 0x2e, 0xde, 0x3c, 0x07, 0x89, 0x5d, + 0x7a, 0xdd, 0xbd, 0x19, 0x9d, 0xe4, 0xeb, 0x76, + 0xf4, 0x66, 0x77, 0x90, 0x52, 0xb0, 0xbb, 0x78, + 0xf0, 0x1e, 0x24, 0xc2, 0xed, 0xe3, 0xc0, 0x78, + 0x95, 0xd7, 0xad, 0xdb, 0xd1, 0x99, 0xde, 0x4e, + 0xb7, 0x6f, 0x46, 0x67, 0x79, 0x05, 0x2b, 0x0b, + 0xb7, 0x8f, 0x01, 0xe2, 0x4c, 0x2e, 0xde, 0x3c, + 0x07, 0x89, 0x5d, 0x7a, 0xdd, 0xbd, 0x19, 0x9d, + 0xe4, 0xeb, 0x76, 0xf4, 0x66, 0x77, 0x90, 0x52, + 0xb0, 0xbb, 0x78, 0xf0, 0x1e, 0x24, 0xc2, 0xed, + 0xe3, 0xc0, 0x78, 0x95, 0xd7, 0xad, 0xdb, 0xd1, + 0x99, 0xde, 0x4e, 0xb7, 0x6f, 0x46, 0x67, 0x79, + 0x05, 0x2b, 0x0b, 0xb7, 0x8f, 0x01, 0xe2, 0x4c, + 0x2e, 0xde, 0x3c, 0x07, 0x89, 0x5d, 0x7a, 0xdd, + 0xbd, 0x19, 0x9d, 0xe4, 0xeb, 0x76, 0xf4, 0x66, + 0x77, 0x90, 0x54, 0x2d, 0xac, 0x6e, 0xee, 0x9e, + 0x19, 0x04, 0x2f, 0x79, 0x3b, 0xa0, 0x1a, 0x0e, + 0xe9, 0x56, 0xcc, 0xba, 0xc6, 0x2c, 0x92, 0xc9, + 0xcf, 0x90, 0x87, 0xde, 0x4c, 0x3c, 0x6a, 0x1a, + 0xd2, 0xba, 0x80, 0xec, 0x05, 0xed, 0xf9, 0xd4, + 0xb8, 0x69, 0x14, 0x6d, 0x67, 0x67, 0x5a, 0xe2, + 0x92, 0x47, 0xca, 0xe2, 0xf9, 0x1c, 0x5e, 0xe3, + 0xba, 0x7e, 0x44, 0x1e, 0x49, 0x24, 0x92, 0x4d, + 0x49, 0x35, 0x3d, 0xb4, 0x44, 0x40, 0x46, 0xeb, + 0x07, 0x78, 0x8a, 0xf0, 0xa2, 0x20, 0x90, 0xce, + 0x72, 0xcb, 0x1b, 0xe7, 0x43, 0x35, 0xcd, 0xcf, + 0xb3, 0x86, 0xb6, 0x8c, 0x35, 0x60, 0x0e, 0xdd, + 0xfc, 0xf5, 0x1d, 0xf0, 0xe6, 0x4b, 0xf7, 0x90, + 0xe5, 0x46, 0xbd, 0xed, 0x50, 0x1e, 0xc1, 0x62, + 0x29, 0x5d, 0x7d, 0xe6, 0x85, 0x59, 0x3a, 0xd0, + 0x58, 0xfe, 0x1c, 0xc9, 0x7e, 0xf2, 0x1c, 0xa8, + 0xd3, 0xe1, 0xcc, 0x97, 0xef, 0x21, 0xca, 0x8d, + 0x57, 0x11, 0x05, 0x8f, 0xe1, 0xcc, 0x97, 0xef, + 0x21, 0xca, 0x8d, 0x3e, 0x1c, 0xc9, 0x7e, 0xf2, + 0x1c, 0xa8, 0xd5, 0x71, 0x10, 0x58, 0xfe, 0x1c, + 0xc9, 0x7e, 0xf2, 0x1c, 0xa8, 0xd3, 0xe1, 0xcc, + 0x97, 0xef, 0x21, 0xca, 0x8d, 0x57, 0x11, 0x05, + 0x8f, 0xe1, 0xcc, 0x97, 0xef, 0x21, 0xca, 0x8d, + 0x3e, 0x1c, 0xc9, 0x7e, 0xf2, 0x1c, 0xa8, 0xd5, + 0x71, 0x10, 0x58, 0xfe, 0x1c, 0xc9, 0x7e, 0xf2, + 0x1c, 0xa8, 0xd3, 0xe1, 0xcc, 0x97, 0xef, 0x21, + 0xca, 0x8d, 0x57, 0x11, 0x05, 0x8f, 0xe1, 0xcc, + 0x97, 0xef, 0x21, 0xca, 0x8d, 0x3e, 0x1c, 0xc9, + 0x7e, 0xf2, 0x1c, 0xa8, 0xd5, 0x71, 0x10, 0x58, + 0xfe, 0x1c, 0xc9, 0x7e, 0xf2, 0x1c, 0xa8, 0xd3, + 0xe1, 0xcc, 0x97, 0xef, 0x21, 0xca, 0x8d, 0x57, + 0x11, 0x05, 0x8f, 0xe1, 0xcc, 0x97, 0xef, 0x21, + 0xca, 0x8d, 0x3e, 0x1c, 0xc9, 0x7e, 0xf2, 0x1c, + 0xa8, 0xd5, 0x71, 0x10, 0x58, 0xfe, 0x1c, 0xc9, + 0x7e, 0xf2, 0x1c, 0xa8, 0xd3, 0xe1, 0xcc, 0x97, + 0xef, 0x21, 0xca, 0x8d, 0x57, 0x13, 0x85, 0x05, + 0x8f, 0xe1, 0xcc, 0x97, 0xef, 0x21, 0xca, 0x8d, + 0x3e, 0x1c, 0xc9, 0x7e, 0xf2, 0x1c, 0xa8, 0xd5, + 0x73, 0x0b, 0x8b, 0x4b, 0x80, 0x24, 0x37, 0x59, + 0xa1, 0xa0, 0xee, 0xa7, 0x1d, 0x10, 0x58, 0xfe, + 0x1c, 0xc9, 0x7e, 0xf2, 0x1c, 0xa8, 0xd3, 0xe1, + 0xcc, 0x97, 0xef, 0x21, 0xca, 0x8d, 0x57, 0x1a, + 0x0b, 0x8e, 0x16, 0x82, 0x49, 0xd4, 0x06, 0x92, + 0xbd, 0xc9, 0x04, 0xf1, 0x80, 0x64, 0x63, 0xd8, + 0x0e, 0xe9, 0x04, 0x04, 0x16, 0x0f, 0x87, 0x32, + 0x5f, 0xbc, 0x87, 0x2a, 0x34, 0xf8, 0x73, 0x25, + 0xfb, 0xc8, 0x72, 0xa3, 0x55, 0xc6, 0x82, 0xea, + 0xe1, 0xa9, 0xa1, 0x00, 0xd3, 0xb2, 0xb2, 0x58, + 0xf0, 0x2a, 0x43, 0x87, 0x6e, 0xa0, 0x70, 0xa0, + 0xb1, 0x7c, 0x39, 0x92, 0xfd, 0xe4, 0x39, 0x51, + 0xa7, 0xc3, 0x99, 0x2f, 0xde, 0x43, 0x95, 0x1a, + 0xae, 0x77, 0x75, 0xea, 0x44, 0x16, 0x3f, 0x87, + 0x32, 0x5f, 0xbc, 0x87, 0x2a, 0x34, 0xf8, 0x73, + 0x25, 0xfb, 0xc8, 0x72, 0xa3, 0x55, 0xc4, 0x41, + 0x63, 0xf8, 0x73, 0x25, 0xfb, 0xc8, 0x72, 0xa3, + 0x4f, 0x87, 0x32, 0x5f, 0xbc, 0x87, 0x2a, 0x35, + 0x5c, 0x44, 0x16, 0x3f, 0x87, 0x32, 0x5f, 0xbc, + 0x87, 0x2a, 0x34, 0xf8, 0x73, 0x25, 0xfb, 0xc8, + 0x72, 0xa3, 0x55, 0xc4, 0x41, 0x63, 0xf8, 0x73, + 0x25, 0xfb, 0xc8, 0x72, 0xa3, 0x4f, 0x87, 0x32, + 0x5f, 0xbc, 0x87, 0x2a, 0x35, 0x5c, 0x44, 0x16, + 0x3f, 0x87, 0x32, 0x5f, 0xbc, 0x87, 0x2a, 0x34, + 0xf8, 0x73, 0x25, 0xfb, 0xc8, 0x72, 0xa3, 0x55, + 0xc4, 0x41, 0x63, 0xf8, 0x73, 0x25, 0xfb, 0xc8, + 0x72, 0xa3, 0x4f, 0x87, 0x32, 0x5f, 0xbc, 0x87, + 0x2a, 0x35, 0x5c, 0x44, 0x16, 0x3f, 0x87, 0x32, + 0x5f, 0xbc, 0x87, 0x2a, 0x34, 0xf8, 0x73, 0x25, + 0xfb, 0xc8, 0x72, 0xa3, 0x55, 0xc4, 0x41, 0x63, + 0xf8, 0x73, 0x25, 0xfb, 0xc8, 0x72, 0xa3, 0x4f, + 0x87, 0x32, 0x5f, 0xbc, 0x87, 0x2a, 0x35, 0x5c, + 0x44, 0x16, 0x3f, 0x87, 0x32, 0x5f, 0xbc, 0x87, + 0x2a, 0x35, 0xbe, 0xcb, 0x24, 0xca, 0x2d, 0xae, + 0xe2, 0x9e, 0x3b, 0xf1, 0x23, 0xd8, 0xe0, 0x5a, + 0xcc, 0x4c, 0x35, 0x3a, 0xb7, 0x15, 0x55, 0x6d, + 0xb4, 0xf7, 0xb8, 0x37, 0x7f, 0x58, 0xcd, 0x7d, + 0xb4, 0x16, 0xbc, 0xdd, 0x98, 0x6f, 0x0b, 0xab, + 0x5c, 0x6d, 0x06, 0x9b, 0xdb, 0x8b, 0x8d, 0x77, + 0xe7, 0x3e, 0xf4, 0xdf, 0x30, 0x78, 0x4a, 0xe0, + 0x41, 0xee, 0x03, 0xfa, 0xe8, 0xfc, 0xe6, 0xf8, + 0x54, 0xd5, 0x42, 0x84, 0x83, 0xf6, 0xcc, 0xf3, + 0x9b, 0xe1, 0x53, 0x48, 0x15, 0x0a, 0x37, 0x35, + 0x35, 0xba, 0xb3, 0xfb, 0x4f, 0x94, 0x29, 0x12, + 0xa3, 0xb3, 0x4f, 0x7a, 0xb3, 0xfb, 0x4f, 0x94, + 0x20, 0x65, 0x7e, 0xf5, 0x79, 0xe7, 0x9f, 0xac, + 0x54, 0x92, 0x8d, 0xca, 0xfd, 0xea, 0xf3, 0xcf, + 0x3f, 0x58, 0xa9, 0x24, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x01, 0xad, 0x41, + 0xbb, 0xca, 0x3d, 0xb2, 0xa7, 0x06, 0xb5, 0x06, + 0xef, 0x28, 0xf6, 0xca, 0x02, 0x22, 0x20, 0x2c, + 0x2e, 0xdb, 0x7c, 0xb2, 0x57, 0xb4, 0x49, 0x31, + 0xe6, 0x99, 0xd9, 0xd6, 0x42, 0xf6, 0xe6, 0x64, + 0x91, 0x1c, 0x12, 0x4e, 0x4b, 0x86, 0xba, 0x1a, + 0xf8, 0x02, 0x98, 0x89, 0x9f, 0x08, 0xd5, 0x16, + 0xb5, 0x6b, 0xe3, 0x68, 0x87, 0x02, 0x2e, 0xec, + 0x79, 0x07, 0xad, 0x3c, 0x27, 0x89, 0x31, 0xe4, + 0x1e, 0xb4, 0xf0, 0x9e, 0x25, 0x3b, 0x2d, 0xd3, + 0x2a, 0x77, 0xb1, 0x75, 0xc3, 0x85, 0x17, 0x76, + 0x3c, 0x83, 0xd6, 0x9e, 0x13, 0xc4, 0x98, 0xf2, + 0x0f, 0x5a, 0x78, 0x4f, 0x12, 0x6c, 0xb7, 0x4c, + 0x9d, 0xec, 0x5d, 0x70, 0xe1, 0x45, 0xdd, 0x8f, + 0x20, 0xf5, 0xa7, 0x84, 0xf1, 0x26, 0x3c, 0x83, + 0xd6, 0x9e, 0x13, 0xc4, 0x9b, 0x2d, 0xd3, 0x27, + 0x7b, 0x17, 0x5c, 0x38, 0x51, 0x77, 0x63, 0xc8, + 0x3d, 0x69, 0xe1, 0x3c, 0x49, 0x8f, 0x20, 0xf5, + 0xa7, 0x84, 0xf1, 0x26, 0xcb, 0x74, 0xc9, 0xde, + 0xc5, 0xd7, 0x0e, 0x14, 0x5d, 0xd8, 0xf2, 0x0f, + 0x5a, 0x78, 0x4f, 0x12, 0x63, 0xc8, 0x3d, 0x69, + 0xe1, 0x3c, 0x49, 0xb2, 0xdd, 0x32, 0x77, 0xb1, + 0x75, 0xc3, 0x85, 0x17, 0x76, 0x3c, 0x83, 0xd6, + 0x9e, 0x13, 0xc4, 0x98, 0xf2, 0x0f, 0x5a, 0x78, + 0x4f, 0x12, 0x6c, 0xb7, 0x4c, 0x9d, 0xec, 0x5d, + 0x70, 0xe1, 0x45, 0xdd, 0x8f, 0x20, 0xf5, 0xa7, + 0x84, 0xf1, 0x26, 0x3c, 0x83, 0xd6, 0x9e, 0x13, + 0xc4, 0x9b, 0x2d, 0xd3, 0x27, 0x7b, 0x17, 0x5c, + 0x38, 0x51, 0x77, 0x63, 0xc8, 0x3d, 0x69, 0xe1, + 0x3c, 0x49, 0x8f, 0x20, 0xf5, 0xa7, 0x84, 0xf1, + 0x26, 0xcb, 0x74, 0xc9, 0xde, 0xc5, 0xd7, 0x0e, + 0x14, 0x5d, 0xd8, 0xf2, 0x0f, 0x5a, 0x78, 0x4f, + 0x12, 0x63, 0xc8, 0x3d, 0x69, 0xe1, 0x3c, 0x49, + 0xb2, 0xdd, 0x32, 0x77, 0xb1, 0x75, 0xc3, 0x85, + 0x17, 0x76, 0x3c, 0x83, 0xd6, 0x9e, 0x13, 0xc4, + 0x98, 0xf2, 0x0f, 0x5a, 0x78, 0x4f, 0x12, 0x6c, + 0xb7, 0x4c, 0x9d, 0xec, 0x5d, 0x70, 0xe1, 0x45, + 0xdd, 0x8f, 0x20, 0xf5, 0xa7, 0x84, 0xf1, 0x26, + 0x3c, 0x83, 0xd6, 0x9e, 0x13, 0xc4, 0x9b, 0x2d, + 0xd3, 0x27, 0x7b, 0x17, 0x5c, 0x38, 0x51, 0x77, + 0x63, 0xc8, 0x3d, 0x69, 0xe1, 0x3c, 0x49, 0x8f, + 0x20, 0xf5, 0xa7, 0x84, 0xf1, 0x26, 0xcb, 0x74, + 0xc9, 0xde, 0xc5, 0xd7, 0x0e, 0x14, 0x5d, 0xd8, + 0xf2, 0x0f, 0x5a, 0x78, 0x4f, 0x12, 0x63, 0xc8, + 0x3d, 0x69, 0xe1, 0x3c, 0x49, 0xb2, 0xdd, 0x32, + 0x77, 0xb1, 0x75, 0xc3, 0x85, 0x17, 0x76, 0x3c, + 0x83, 0xd6, 0x9e, 0x13, 0xc4, 0x98, 0xf2, 0x0f, + 0x5a, 0x78, 0x4f, 0x12, 0x6c, 0xb7, 0x4c, 0x9d, + 0xec, 0x5d, 0x70, 0xe1, 0x45, 0xdd, 0x8f, 0x20, + 0xf5, 0xa7, 0x84, 0xf1, 0x26, 0x3c, 0x83, 0xd6, + 0x9e, 0x13, 0xc4, 0x9b, 0x2d, 0xd3, 0x27, 0x7b, + 0x17, 0x5c, 0x38, 0x51, 0x77, 0x63, 0xc8, 0x3d, + 0x69, 0xe1, 0x3c, 0x49, 0x8f, 0x20, 0xf5, 0xa7, + 0x84, 0xf1, 0x26, 0xcb, 0x74, 0xc9, 0xde, 0xc5, + 0xd7, 0x0e, 0x14, 0x5d, 0xd8, 0xf2, 0x0f, 0x5a, + 0x78, 0x4f, 0x12, 0x63, 0xc8, 0x3d, 0x69, 0xe1, + 0x3c, 0x49, 0xb2, 0xdd, 0x32, 0x77, 0xb1, 0x75, + 0xc3, 0x85, 0x17, 0x76, 0x3c, 0x83, 0xd6, 0x9e, + 0x13, 0xc4, 0x98, 0xf2, 0x0f, 0x5a, 0x78, 0x4f, + 0x12, 0x6c, 0xb7, 0x4c, 0x9d, 0xec, 0x5d, 0x70, + 0xe1, 0x45, 0xdd, 0x8f, 0x20, 0xf5, 0xa7, 0x84, + 0xf1, 0x26, 0x3c, 0x83, 0xd6, 0x9e, 0x13, 0xc4, + 0x9b, 0x2d, 0xd3, 0x27, 0x7b, 0x17, 0x5c, 0x38, + 0x51, 0x77, 0x63, 0xc8, 0x3d, 0x69, 0xe1, 0x3c, + 0x49, 0x8f, 0x20, 0xf5, 0xa7, 0x84, 0xf1, 0x26, + 0xcb, 0x74, 0xc9, 0xde, 0xc5, 0xd7, 0x0e, 0x14, + 0x5d, 0xd8, 0xf2, 0x0f, 0x5a, 0x78, 0x4f, 0x12, + 0x63, 0xc8, 0x3d, 0x69, 0xe1, 0x3c, 0x49, 0xb2, + 0xdd, 0x32, 0x77, 0xb1, 0xf5, 0xc3, 0x85, 0x17, + 0x73, 0x46, 0x49, 0x26, 0x86, 0xcc, 0x43, 0xb7, + 0x2a, 0x48, 0xfa, 0xc1, 0x25, 0xca, 0xdd, 0x84, + 0xc9, 0x6e, 0xf1, 0x2b, 0x77, 0xb7, 0x54, 0x4c, + 0x5a, 0x3c, 0x62, 0x56, 0xad, 0xe9, 0x6e, 0x15, + 0xb4, 0x4c, 0xf2, 0x87, 0x0a, 0x21, 0x05, 0xa4, + 0xb4, 0x8a, 0x11, 0xbf, 0xad, 0x14, 0x2c, 0x22, + 0x22, 0x0f, 0x5b, 0x55, 0xee, 0x36, 0x3f, 0xda, + 0xfa, 0xa1, 0x56, 0x4a, 0xb3, 0x6d, 0x57, 0xb8, + 0xd8, 0xff, 0x00, 0x6b, 0xea, 0x85, 0x59, 0x28, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x35, 0x84, + 0x13, 0xb9, 0x77, 0xfa, 0x67, 0x30, 0x3b, 0xce, + 0xd1, 0xc0, 0xd3, 0xf2, 0xa8, 0x21, 0xb9, 0xe1, + 0x53, 0xb9, 0x77, 0xfa, 0x63, 0x30, 0xf3, 0xfe, + 0x46, 0xa8, 0x2d, 0xee, 0xe7, 0xca, 0x82, 0x77, + 0x2c, 0x2c, 0xcb, 0xb2, 0x59, 0xb3, 0x50, 0xd0, + 0xfb, 0x97, 0xbb, 0x04, 0x04, 0x8f, 0x26, 0x9a, + 0x3c, 0x35, 0x5e, 0xf2, 0xac, 0xea, 0x4b, 0xc9, + 0xdd, 0x67, 0x9a, 0x3d, 0xb2, 0x5b, 0xcc, 0xc3, + 0xe3, 0x3e, 0x8d, 0x0d, 0x20, 0x57, 0x5a, 0xf1, + 0x77, 0xfe, 0x93, 0xb4, 0xec, 0xca, 0x6b, 0xca, + 0x7a, 0x82, 0xa6, 0x9d, 0x55, 0x3b, 0xd4, 0xaf, + 0x00, 0x41, 0x64, 0xc8, 0x09, 0xb6, 0x6e, 0x6a, + 0x62, 0x70, 0x77, 0x30, 0x09, 0x8d, 0xda, 0xc6, + 0x8c, 0x54, 0x3d, 0xe5, 0xcf, 0x65, 0xb4, 0xb7, + 0x52, 0xdc, 0x32, 0x1b, 0xf6, 0xc7, 0x3d, 0xbc, + 0xa4, 0x31, 0xc3, 0x08, 0x14, 0x2e, 0x3a, 0xd7, + 0xad, 0x9d, 0xd1, 0x63, 0x99, 0xfd, 0x90, 0xf0, + 0x3d, 0x41, 0x46, 0x3c, 0x66, 0x53, 0x5d, 0x5b, + 0x41, 0xd9, 0xaa, 0x0e, 0xfc, 0xf2, 0xc6, 0x3b, + 0x0c, 0xc6, 0x48, 0xa2, 0xd1, 0x13, 0xc0, 0x7b, + 0x07, 0x60, 0xff, 0x00, 0x4d, 0x54, 0x7a, 0x9c, + 0xda, 0xea, 0x7b, 0x7c, 0x1f, 0x3b, 0x98, 0x6e, + 0x9e, 0xeb, 0x94, 0x1a, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0xdb, 0x69, 0xef, 0x76, 0xff, 0x00, 0x6a, + 0xcf, 0x0a, 0xd4, 0xb6, 0xda, 0x7b, 0xdd, 0xbf, + 0xda, 0xb3, 0xc2, 0x82, 0xdd, 0x9c, 0xfb, 0xd3, + 0x7c, 0xcf, 0x94, 0xae, 0x05, 0xdf, 0x9c, 0xfb, + 0xd3, 0x7c, 0xcf, 0x94, 0xae, 0x04, 0x1e, 0xa0, + 0xfd, 0xb3, 0x3c, 0xe6, 0xf8, 0x54, 0xd2, 0x85, + 0x83, 0xf6, 0xcc, 0xf3, 0x9b, 0xe1, 0x53, 0x48, + 0x30, 0x54, 0x76, 0x69, 0xef, 0x56, 0x7f, 0x69, + 0xf2, 0x85, 0x22, 0x54, 0x76, 0x69, 0xef, 0x56, + 0x7f, 0x69, 0xf2, 0x84, 0x0c, 0xaf, 0xde, 0xaf, + 0x3c, 0xf3, 0xf5, 0x8a, 0x92, 0x51, 0xb9, 0x5f, + 0xbd, 0x5e, 0x79, 0xe7, 0xeb, 0x15, 0x24, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x35, 0xa8, 0x37, 0x79, 0x47, 0xb6, 0x54, + 0xe0, 0xd6, 0xa0, 0xdd, 0xe5, 0x1e, 0xd9, 0x40, + 0x5d, 0xf6, 0x91, 0x45, 0x6f, 0x03, 0xaf, 0xae, + 0x7c, 0x91, 0xa6, 0x36, 0xeb, 0x3d, 0xcd, 0xf2, + 0xb8, 0xa3, 0x61, 0x92, 0x46, 0xb0, 0x6b, 0x71, + 0x03, 0x85, 0x7a, 0xda, 0x4b, 0x80, 0xd7, 0xc3, + 0x68, 0xcd, 0x0c, 0x63, 0x71, 0x38, 0x77, 0x9a, + 0x15, 0xb1, 0xd7, 0x7d, 0xa2, 0xae, 0x79, 0xf2, + 0x76, 0xf1, 0xcd, 0xbd, 0xae, 0x4b, 0xfc, 0xd2, + 0xe2, 0xf1, 0xe7, 0x11, 0xc1, 0x10, 0xf2, 0x63, + 0x1f, 0x2a, 0xe3, 0x0e, 0xa6, 0xad, 0x0b, 0xc6, + 0x24, 0xc4, 0xb7, 0xd6, 0x22, 0xbc, 0x22, 0x34, + 0x78, 0x96, 0xb5, 0xef, 0x33, 0x36, 0xb6, 0xba, + 0xbd, 0xe2, 0x4c, 0x4b, 0xc6, 0x24, 0xc4, 0xa5, + 0x5d, 0xb1, 0xef, 0x7b, 0xc4, 0x98, 0x97, 0x8c, + 0x49, 0x89, 0x0d, 0xb1, 0xef, 0x7b, 0xc4, 0x98, + 0x97, 0x8c, 0x49, 0x89, 0x0d, 0xb1, 0xef, 0x7b, + 0xc4, 0x98, 0x97, 0x8c, 0x49, 0x89, 0x0d, 0xb1, + 0xef, 0x7b, 0xc4, 0x98, 0x97, 0x8c, 0x49, 0x89, + 0x0d, 0xb1, 0xef, 0x7b, 0xc4, 0x98, 0x97, 0x8c, + 0x49, 0x89, 0x0d, 0xb1, 0xef, 0x7b, 0xc4, 0x98, + 0x97, 0x8c, 0x49, 0x89, 0x0d, 0xb1, 0xef, 0x7b, + 0xc4, 0x98, 0x96, 0x23, 0x63, 0xe5, 0x91, 0xb1, + 0x46, 0x2a, 0xf7, 0x9a, 0x34, 0x56, 0x9a, 0x57, + 0x6f, 0x51, 0x66, 0xa3, 0xfe, 0x0d, 0x7f, 0xb4, + 0xde, 0x35, 0x59, 0xb5, 0x62, 0x62, 0x26, 0x62, + 0x35, 0x5a, 0xb8, 0x6d, 0x6f, 0xb6, 0x26, 0x79, + 0xb8, 0xf1, 0x26, 0x25, 0xbe, 0xe3, 0x2c, 0xcc, + 0x2d, 0x99, 0x8e, 0x58, 0x48, 0x68, 0xd6, 0x5b, + 0x47, 0x53, 0xb7, 0x4a, 0xae, 0x50, 0xe1, 0xb8, + 0x91, 0x78, 0x9f, 0x0e, 0x28, 0xbe, 0x3b, 0x52, + 0x74, 0xb4, 0x4c, 0x7e, 0x2f, 0x78, 0x93, 0x12, + 0xf1, 0x89, 0x31, 0x68, 0x52, 0x8d, 0xb1, 0xec, + 0xd5, 0xef, 0x12, 0x62, 0x5d, 0x0e, 0xca, 0xef, + 0x9b, 0x07, 0xb4, 0x16, 0x0e, 0x68, 0x37, 0x1e, + 0x3a, 0x8d, 0x4b, 0x8c, 0x3b, 0x45, 0x6b, 0xdb, + 0x48, 0x98, 0x9d, 0x74, 0xe3, 0xa4, 0xe8, 0x9b, + 0x63, 0x9a, 0xe9, 0xbb, 0x58, 0xd7, 0xf4, 0x36, + 0x62, 0x4c, 0x4b, 0xc6, 0x2e, 0xfa, 0x62, 0x52, + 0xae, 0x91, 0xef, 0x7b, 0xc4, 0x98, 0x97, 0x8c, + 0x49, 0x89, 0x0d, 0xbf, 0x17, 0xbc, 0x49, 0x89, + 0x78, 0xc4, 0x98, 0x94, 0x1b, 0x7e, 0x2f, 0x78, + 0x93, 0x12, 0xf1, 0x89, 0x31, 0x29, 0x4e, 0xdf, + 0x8b, 0xde, 0x24, 0xc4, 0xbc, 0x62, 0x4c, 0x48, + 0x6d, 0x8f, 0x7b, 0xde, 0x24, 0xc4, 0xbc, 0x62, + 0x4c, 0x48, 0x6d, 0x8f, 0x7b, 0xde, 0x24, 0xc4, + 0xbc, 0x62, 0x4c, 0x48, 0x6d, 0x8f, 0x7b, 0xde, + 0x24, 0xc4, 0xbc, 0x62, 0x4c, 0x48, 0x6d, 0x8f, + 0x7b, 0xde, 0x24, 0xc4, 0xbc, 0x62, 0x4c, 0x48, + 0x6d, 0x8f, 0x7b, 0xde, 0x24, 0xc4, 0xbc, 0x62, + 0x4c, 0x48, 0x6d, 0x8f, 0x7b, 0xde, 0x25, 0xbe, + 0xd2, 0xfe, 0xe6, 0xd1, 0xf8, 0xe1, 0x75, 0x07, + 0xe7, 0x30, 0xf9, 0x25, 0x72, 0xe2, 0x4c, 0x4a, + 0x26, 0x22, 0x62, 0x62, 0x56, 0x8b, 0x5a, 0x93, + 0xba, 0x93, 0xa4, 0xc2, 0xce, 0xf1, 0x06, 0x67, + 0x6b, 0xed, 0x70, 0x0c, 0x33, 0x37, 0xcb, 0x6e, + 0xee, 0x8d, 0xc2, 0xa3, 0xb7, 0x57, 0x8d, 0x9e, + 0xba, 0x31, 0x5f, 0x88, 0xcd, 0x03, 0x27, 0x18, + 0x48, 0xec, 0x81, 0x56, 0xf1, 0x2e, 0x9b, 0xd8, + 0x84, 0x57, 0x32, 0x30, 0x6a, 0x06, 0xa3, 0xb4, + 0x56, 0x1c, 0xb4, 0xd9, 0x6d, 0x39, 0xf1, 0x7b, + 0x3e, 0x5b, 0x2f, 0x76, 0x9a, 0xcf, 0x8f, 0x84, + 0xb4, 0xa2, 0x22, 0xa3, 0xb3, 0xd6, 0xd5, 0x7b, + 0x8d, 0x8f, 0xf6, 0xbe, 0xa8, 0x55, 0x92, 0xac, + 0xdb, 0x55, 0xee, 0x36, 0x23, 0xce, 0xfa, 0xa1, + 0x56, 0x50, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x10, 0x6b, + 0x08, 0x88, 0x2c, 0x39, 0x34, 0x13, 0x5c, 0x6c, + 0xf5, 0xec, 0x10, 0xb7, 0x14, 0x8f, 0x92, 0x8d, + 0x15, 0x03, 0x71, 0xbb, 0xeb, 0x80, 0xec, 0xe6, + 0x75, 0xd1, 0xf4, 0x8d, 0xdc, 0x4c, 0xf4, 0x97, + 0x04, 0x77, 0x37, 0x31, 0x0a, 0x45, 0x33, 0xe2, + 0x69, 0xd2, 0x43, 0x1c, 0x5a, 0x2b, 0xda, 0x0b, + 0xdf, 0xb7, 0x5f, 0x74, 0xa9, 0xbf, 0x78, 0xfe, + 0x34, 0x13, 0x36, 0x2c, 0x39, 0x8e, 0x43, 0x36, + 0x5a, 0xc3, 0x4b, 0xab, 0x57, 0x97, 0xc4, 0xc3, + 0xba, 0x01, 0xae, 0x8e, 0xfa, 0xc6, 0x47, 0x95, + 0xdc, 0x5a, 0xdd, 0x3a, 0xf6, 0xfa, 0x3e, 0x62, + 0xde, 0x06, 0x39, 0xc4, 0x3f, 0x74, 0xee, 0x0a, + 0x15, 0x07, 0x1c, 0x92, 0x46, 0xfe, 0x72, 0x37, + 0x96, 0x49, 0xaf, 0x10, 0x24, 0x1e, 0x1a, 0xad, + 0x93, 0xde, 0xde, 0x5c, 0x37, 0x04, 0xf3, 0x3e, + 0x46, 0x8f, 0xcd, 0x73, 0x89, 0x08, 0x27, 0xb2, + 0x17, 0x3a, 0xea, 0x3c, 0xd9, 0xcc, 0x1e, 0x3c, + 0xc3, 0xc5, 0x68, 0xa5, 0x34, 0x87, 0xae, 0x4c, + 0xbf, 0x67, 0x6f, 0x85, 0xc4, 0x72, 0x5e, 0x30, + 0x5b, 0xc1, 0x11, 0x0e, 0x73, 0x9c, 0xe6, 0xe9, + 0xc3, 0xe3, 0x51, 0x44, 0xc7, 0x3c, 0xf1, 0x57, + 0x99, 0x91, 0xf1, 0xd7, 0x59, 0x63, 0x8b, 0x35, + 0x76, 0x8a, 0xcc, 0x97, 0x57, 0x52, 0x8a, 0x4b, + 0x34, 0x92, 0x34, 0xfe, 0x6b, 0x9e, 0xe7, 0x0f, + 0xa4, 0x50, 0x76, 0x67, 0xb7, 0xad, 0xbe, 0xcc, + 0x5f, 0x2c, 0x66, 0xb1, 0x30, 0x73, 0x71, 0x9d, + 0xf0, 0xdf, 0xe9, 0x2a, 0x3d, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x6d, 0xb4, 0xf7, 0xbb, 0x7f, + 0xb5, 0x67, 0x85, 0x6a, 0x5b, 0x6d, 0x3d, 0xee, + 0xdf, 0xed, 0x59, 0xe1, 0x41, 0x6e, 0xce, 0x7d, + 0xe9, 0xbe, 0x67, 0xca, 0x57, 0x02, 0xef, 0xce, + 0x7d, 0xe9, 0xbe, 0x6f, 0xca, 0xb8, 0x10, 0x7a, + 0x83, 0xf6, 0xcc, 0xf3, 0x9b, 0xe1, 0x53, 0x4a, + 0x16, 0x0f, 0xdb, 0x33, 0xce, 0x6f, 0x85, 0x4d, + 0x20, 0xc1, 0x51, 0xd9, 0xa7, 0xbd, 0x59, 0xfd, + 0xa7, 0xca, 0x14, 0x89, 0x51, 0xd9, 0xa7, 0xbd, + 0x59, 0xfd, 0xa7, 0xca, 0x10, 0x32, 0xbf, 0x7a, + 0xbc, 0xf3, 0xcf, 0xd6, 0x2a, 0x49, 0x46, 0xe5, + 0x7e, 0xf5, 0x79, 0xe7, 0x9f, 0xac, 0x54, 0x92, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x00, 0xd6, 0xa0, 0xdd, 0xe5, 0x1e, 0xd9, + 0x53, 0x83, 0x5a, 0x83, 0x77, 0x94, 0x7b, 0x65, + 0x06, 0xeb, 0x2f, 0x7b, 0x87, 0xce, 0x0b, 0x8f, + 0x69, 0x1d, 0xfe, 0x68, 0xef, 0x35, 0xbf, 0x2a, + 0xec, 0xb2, 0xf7, 0xb8, 0x7c, 0xe5, 0x1d, 0xb4, + 0xce, 0xa6, 0x6c, 0xf1, 0xfd, 0x56, 0x78, 0x0a, + 0xed, 0xe5, 0xfe, 0xf6, 0x4f, 0x3f, 0xfc, 0x18, + 0xf7, 0xd9, 0x1f, 0x89, 0x31, 0x2d, 0x78, 0x93, + 0x12, 0xd7, 0xab, 0xcc, 0x98, 0x6c, 0xc4, 0x98, + 0x96, 0xbc, 0x49, 0x89, 0x35, 0x46, 0x8d, 0x98, + 0x93, 0x12, 0xd7, 0x89, 0x31, 0x26, 0xa6, 0x8d, + 0x98, 0x93, 0x12, 0xd7, 0x89, 0x31, 0x26, 0xa6, + 0x8d, 0x98, 0x93, 0x12, 0xd7, 0x89, 0x31, 0x26, + 0xa6, 0x8d, 0x98, 0x93, 0x12, 0xd7, 0x89, 0x31, + 0x26, 0xa6, 0x8d, 0x98, 0x93, 0x12, 0xd7, 0x89, + 0x31, 0x26, 0xa6, 0x8d, 0x98, 0x93, 0x12, 0xd7, + 0x89, 0x31, 0x26, 0xa6, 0x8e, 0xdc, 0xb5, 0xdf, + 0xe6, 0x16, 0xdf, 0x68, 0xd5, 0x66, 0xcf, 0xaf, + 0xae, 0x2c, 0x6d, 0xa3, 0x7c, 0x04, 0x07, 0x39, + 0xf4, 0x25, 0xc3, 0x10, 0xa5, 0x37, 0x95, 0x5b, + 0x2b, 0x75, 0x73, 0x2b, 0x6f, 0xb4, 0x6a, 0xb0, + 0x6d, 0x69, 0xa5, 0x94, 0x3f, 0x69, 0xf2, 0x2c, + 0xf9, 0x62, 0x27, 0x25, 0x35, 0x86, 0xdf, 0x2f, + 0x33, 0x1e, 0x5f, 0x34, 0xc4, 0xe9, 0xa6, 0x8d, + 0xf9, 0x36, 0x68, 0xec, 0xc6, 0x07, 0xb2, 0x76, + 0x8e, 0x76, 0x3a, 0x62, 0xa0, 0xd0, 0x5a, 0x55, + 0x77, 0x31, 0xb6, 0xe6, 0x33, 0x09, 0x6d, 0xd8, + 0x09, 0x01, 0xde, 0x28, 0xdd, 0xd2, 0x31, 0x7c, + 0xaa, 0x43, 0x64, 0x8d, 0x66, 0xb9, 0xec, 0x31, + 0xbe, 0x15, 0xd3, 0xcc, 0xb6, 0x4d, 0xab, 0x71, + 0x22, 0xb8, 0x23, 0xc6, 0x07, 0x64, 0x0a, 0x7c, + 0xaa, 0x22, 0x62, 0x99, 0x2f, 0x11, 0xe1, 0x11, + 0xb9, 0x6b, 0x56, 0x73, 0x61, 0xc7, 0x33, 0xf7, + 0x4d, 0xa2, 0xb3, 0x3f, 0x8e, 0x8e, 0x28, 0xb6, + 0x6f, 0x30, 0x73, 0x31, 0x38, 0xb1, 0x84, 0xfe, + 0x69, 0x24, 0x9e, 0xf2, 0xe2, 0xbf, 0xb0, 0xba, + 0xb1, 0x78, 0x65, 0xc0, 0xa6, 0x2f, 0x21, 0xe0, + 0xd4, 0x15, 0x39, 0x9e, 0x47, 0x9c, 0x49, 0x75, + 0x17, 0xb0, 0xe2, 0xe6, 0x98, 0xda, 0xd5, 0xae, + 0x0d, 0xf1, 0xab, 0xbb, 0x53, 0xa5, 0x6d, 0xda, + 0x18, 0xcc, 0x99, 0x33, 0xa4, 0x90, 0x51, 0xf1, + 0xe0, 0x79, 0x1b, 0xc4, 0xd0, 0x11, 0xdf, 0x48, + 0xcb, 0x3a, 0xd7, 0x59, 0x8d, 0x2d, 0xc8, 0xbf, + 0x96, 0xa4, 0xc5, 0xf6, 0xc4, 0xc4, 0xd3, 0xfc, + 0x5b, 0x9c, 0xc7, 0xc9, 0x90, 0x86, 0x46, 0xdc, + 0x4e, 0x7d, 0xbb, 0x43, 0x40, 0xdd, 0x24, 0x05, + 0x08, 0xed, 0x9b, 0xcc, 0x5b, 0x1f, 0x38, 0x0b, + 0x0b, 0x86, 0x9c, 0x15, 0x20, 0xf6, 0xaa, 0xa7, + 0x63, 0x9c, 0xc1, 0x91, 0xb2, 0x71, 0xae, 0x3b, + 0x76, 0xb8, 0x76, 0xc3, 0x74, 0x28, 0xfd, 0x99, + 0xcc, 0x6e, 0xee, 0x9f, 0x34, 0x57, 0x12, 0x19, + 0x70, 0x00, 0xe6, 0xb9, 0xd4, 0xa8, 0xd2, 0x41, + 0xd4, 0xab, 0x5b, 0x5e, 0xb1, 0x6b, 0x46, 0x9a, + 0x44, 0xf1, 0x74, 0xc9, 0x4c, 0x77, 0xb6, 0x3a, + 0xdb, 0x5d, 0x66, 0x9a, 0x46, 0x88, 0x3b, 0x4b, + 0x49, 0xee, 0xee, 0x3d, 0x9e, 0x31, 0x49, 0x68, + 0x49, 0x0e, 0x34, 0xf2, 0x75, 0xd5, 0x7a, 0xbe, + 0xb2, 0xb8, 0xb0, 0x91, 0xb1, 0x4f, 0x87, 0x13, + 0x86, 0x21, 0x84, 0xd4, 0x51, 0x4c, 0xdb, 0xc6, + 0x23, 0xda, 0xb9, 0x5a, 0x34, 0x07, 0x46, 0xe7, + 0x70, 0x80, 0xb9, 0x76, 0xb0, 0xd2, 0xf6, 0x1f, + 0xb3, 0xf9, 0x4a, 0xeb, 0x19, 0x26, 0x6d, 0x11, + 0xec, 0x98, 0xd5, 0x9a, 0xde, 0x5e, 0xb1, 0x8e, + 0xd6, 0xe3, 0xad, 0x72, 0x6c, 0xfc, 0x1c, 0xf3, + 0x64, 0xb7, 0xd0, 0xda, 0x9b, 0xc9, 0x30, 0xf3, + 0x61, 0xa1, 0xda, 0x1c, 0x49, 0xa1, 0xd5, 0xa1, + 0x6b, 0xb0, 0xcb, 0x6e, 0xaf, 0xcb, 0xb9, 0x90, + 0x03, 0x59, 0xe5, 0x48, 0xed, 0x5d, 0xaa, 0x2b, + 0x16, 0x64, 0x7f, 0xfa, 0xeb, 0x8f, 0xf8, 0x51, + 0xf8, 0x5a, 0xb1, 0x93, 0x61, 0xb7, 0xc8, 0xd9, + 0x30, 0x1a, 0x70, 0x3e, 0x57, 0x76, 0x48, 0xaf, + 0x12, 0xa7, 0x76, 0xdb, 0x66, 0x7d, 0xbb, 0xb4, + 0x75, 0x8f, 0x2b, 0x4e, 0xe5, 0x6b, 0xac, 0xed, + 0xd9, 0xbe, 0x79, 0xfe, 0x08, 0x67, 0x6c, 0xf6, + 0x62, 0xd9, 0x84, 0x4d, 0x0d, 0x38, 0x9a, 0x48, + 0x7d, 0x7c, 0x5a, 0x8d, 0xfd, 0x15, 0x5c, 0x77, + 0x96, 0x93, 0x59, 0x4f, 0xcc, 0xcd, 0x4e, 0x70, + 0x00, 0x4d, 0x0d, 0x74, 0x15, 0x2f, 0xb3, 0x79, + 0xa5, 0xdd, 0xd5, 0xe4, 0xb0, 0xdc, 0x48, 0x64, + 0x0e, 0x66, 0x36, 0xd7, 0x70, 0x83, 0x42, 0x02, + 0xe3, 0xda, 0x83, 0x4c, 0xd8, 0xfd, 0x9b, 0x7e, + 0x55, 0x7a, 0x5e, 0xdb, 0xf6, 0xce, 0x9e, 0x1a, + 0xb9, 0x64, 0xc5, 0x8b, 0xb3, 0xdd, 0xa6, 0xbf, + 0x76, 0x9c, 0x51, 0xb8, 0x96, 0x31, 0x2d, 0x78, + 0x93, 0x12, 0xeb, 0xab, 0x34, 0xc3, 0x66, 0x24, + 0xc4, 0xb5, 0xe2, 0x4c, 0x4a, 0x75, 0x46, 0x8d, + 0x98, 0x93, 0x12, 0xd7, 0x89, 0x31, 0x26, 0xa6, + 0x8d, 0x98, 0x93, 0x12, 0xd7, 0x89, 0x31, 0x26, + 0xa6, 0x8d, 0x98, 0x93, 0x12, 0xd7, 0x89, 0x31, + 0x26, 0xa6, 0x8d, 0x98, 0x93, 0x12, 0xd7, 0x89, + 0x31, 0x26, 0xa6, 0x8d, 0x98, 0x93, 0x12, 0xd7, + 0x89, 0x31, 0x26, 0xa6, 0x8d, 0x98, 0x93, 0x12, + 0xd7, 0x89, 0x31, 0x28, 0x34, 0x77, 0xe5, 0x4e, + 0xff, 0x00, 0x32, 0xb6, 0xfb, 0x46, 0xf8, 0x54, + 0xde, 0x6b, 0xef, 0xae, 0xf3, 0x5b, 0xe0, 0x50, + 0x19, 0x4b, 0xbf, 0xcc, 0xed, 0x7e, 0xd5, 0xbe, + 0x15, 0x3f, 0x9a, 0xfb, 0xe3, 0xbc, 0xd6, 0xf8, + 0x16, 0x6f, 0x33, 0xf7, 0x47, 0xc1, 0xe9, 0x79, + 0x0f, 0xb2, 0xde, 0xe9, 0x72, 0x2c, 0x1a, 0xd0, + 0x8e, 0xc2, 0xca, 0x2e, 0x0d, 0xa9, 0x1c, 0xda, + 0xe7, 0x2a, 0x82, 0xd2, 0xd8, 0xe6, 0x30, 0x99, + 0xd8, 0xe1, 0xfa, 0xb0, 0x05, 0x68, 0x43, 0x74, + 0xfe, 0x73, 0x54, 0x5f, 0x59, 0x6c, 0x96, 0xed, + 0x93, 0xc9, 0xdf, 0xc0, 0x3d, 0x35, 0xef, 0x6b, + 0x3d, 0xc2, 0xc7, 0xfb, 0x5f, 0x54, 0x2a, 0xc2, + 0x0b, 0x27, 0x59, 0x6c, 0x8f, 0x41, 0x7f, 0x20, + 0x7a, 0x69, 0xd6, 0x5b, 0x23, 0xd0, 0x5f, 0xc8, + 0x1e, 0x9a, 0xad, 0xa2, 0x0b, 0x27, 0x59, 0x6c, + 0x8f, 0x41, 0x7f, 0x20, 0x7a, 0x69, 0xd6, 0x5b, + 0x23, 0xd0, 0x5f, 0xc8, 0x1e, 0x9a, 0xad, 0xa2, + 0x0b, 0x27, 0x59, 0x6c, 0x8f, 0x41, 0x7f, 0x20, + 0x7a, 0x69, 0xd6, 0x5b, 0x23, 0xd0, 0x5f, 0xc8, + 0x1e, 0x9a, 0xad, 0xa2, 0x0b, 0x27, 0x59, 0x6c, + 0x8f, 0x41, 0x7f, 0x20, 0x7a, 0x69, 0xd6, 0x5b, + 0x23, 0xd0, 0x5f, 0xc8, 0x1e, 0x9a, 0xad, 0xa2, + 0x0b, 0x27, 0x59, 0x6c, 0x8f, 0x41, 0x7f, 0x20, + 0x7a, 0x69, 0xd6, 0x5b, 0x23, 0xd0, 0x5f, 0xc8, + 0x1e, 0x9a, 0xad, 0xa2, 0x0b, 0x27, 0x59, 0x6c, + 0x8f, 0x41, 0x7f, 0x20, 0x7a, 0x69, 0xd6, 0x5b, + 0x23, 0xd0, 0x5f, 0xc8, 0x1e, 0x9a, 0xad, 0xae, + 0xcb, 0x1c, 0xa6, 0xfe, 0xfd, 0xa5, 0xf6, 0xd1, + 0xe2, 0x60, 0xd6, 0xf2, 0x43, 0x5b, 0xc2, 0x50, + 0x4c, 0x75, 0x96, 0xc8, 0xf4, 0x17, 0xf2, 0x07, + 0xa6, 0x9d, 0x65, 0xb2, 0x3d, 0x05, 0xfc, 0x81, + 0xe9, 0xa8, 0x7b, 0xdc, 0xa3, 0x30, 0xb0, 0x68, + 0x75, 0xcc, 0x58, 0x58, 0xed, 0x01, 0xe0, 0x87, + 0x36, 0xbb, 0xd5, 0x0b, 0x8d, 0x05, 0x93, 0xac, + 0xb6, 0x47, 0xa0, 0xbf, 0x90, 0x3d, 0x34, 0xeb, + 0x2d, 0x91, 0xe8, 0x2f, 0xe4, 0x0f, 0x4d, 0x56, + 0xd1, 0x05, 0x93, 0xac, 0xb6, 0x47, 0xa0, 0xbf, + 0x90, 0x3d, 0x34, 0xeb, 0x2d, 0x91, 0xe8, 0x2f, + 0xe4, 0x0f, 0x4d, 0x57, 0x63, 0x8a, 0x49, 0x9e, + 0x23, 0x89, 0xa6, 0x49, 0x1d, 0xe4, 0xb1, 0xba, + 0x49, 0x5b, 0x22, 0xb4, 0xb9, 0x9a, 0xe4, 0x5a, + 0xc7, 0x19, 0x33, 0x92, 0x5b, 0x80, 0xd0, 0x1a, + 0x8e, 0xdd, 0x10, 0x4f, 0x75, 0x96, 0xc8, 0xf4, + 0x17, 0xf2, 0x07, 0xa6, 0x9d, 0x65, 0xb2, 0x3d, + 0x05, 0xfc, 0x81, 0xe9, 0xaa, 0xf4, 0xb1, 0x3e, + 0x29, 0x1f, 0x14, 0x82, 0x8f, 0x8c, 0x96, 0xb8, + 0x6b, 0xa1, 0x1d, 0x90, 0xbc, 0x77, 0xd0, 0x59, + 0x3a, 0xcb, 0x64, 0x7a, 0x0b, 0xf9, 0x03, 0xd3, + 0x4e, 0xb2, 0xd9, 0x1e, 0x82, 0xfe, 0x40, 0xf4, + 0xd4, 0x13, 0x2c, 0xae, 0x9f, 0x6a, 0xfb, 0xb6, + 0xb2, 0xb0, 0x46, 0x70, 0xbd, 0xf5, 0x1a, 0x09, + 0xa7, 0x1a, 0xd0, 0x82, 0xc9, 0xd6, 0x5b, 0x23, + 0xd0, 0x5f, 0xc8, 0x1e, 0x9a, 0x75, 0x96, 0xc8, + 0xf4, 0x17, 0xf2, 0x07, 0xa6, 0xab, 0xac, 0x63, + 0xa4, 0x91, 0xb1, 0xb0, 0x62, 0x7b, 0xc8, 0x6b, + 0x46, 0xf9, 0x2a, 0x43, 0xe1, 0xbc, 0xef, 0xa3, + 0x11, 0xdb, 0x73, 0x3d, 0x24, 0x12, 0x5d, 0x65, + 0xb2, 0x3d, 0x05, 0xfc, 0x81, 0xe9, 0xa7, 0x59, + 0x6c, 0x8f, 0x41, 0x7f, 0x20, 0x7a, 0x6a, 0x2a, + 0x7c, 0x87, 0x36, 0x82, 0x27, 0x4d, 0x35, 0xb9, + 0x64, 0x6c, 0xd2, 0xe7, 0x17, 0x33, 0x7e, 0x9f, + 0x39, 0x73, 0x5d, 0x59, 0xdc, 0x5a, 0x4a, 0x22, + 0xb8, 0x66, 0x09, 0x08, 0x0e, 0xc3, 0x50, 0x74, + 0x1d, 0xdf, 0x14, 0x94, 0x13, 0xdd, 0x65, 0xb2, + 0x3d, 0x05, 0xfc, 0x81, 0xe9, 0xa7, 0x59, 0x6c, + 0x8f, 0x41, 0x7f, 0x20, 0x7a, 0x6a, 0xb6, 0x88, + 0x2c, 0x9d, 0x65, 0xb2, 0x3d, 0x05, 0xfc, 0x81, + 0xe9, 0xa7, 0x59, 0x6c, 0x8f, 0x41, 0x7f, 0x20, + 0x7a, 0x6a, 0xb6, 0x88, 0x2c, 0x9d, 0x65, 0xb2, + 0x3d, 0x05, 0xfc, 0x81, 0xe9, 0xa7, 0x59, 0x6c, + 0x8f, 0x41, 0x7f, 0x20, 0x7a, 0x6a, 0xb6, 0x88, + 0x2c, 0x9d, 0x65, 0xb2, 0x3d, 0x05, 0xfc, 0x81, + 0xe9, 0xa7, 0x59, 0x6c, 0x8f, 0x41, 0x7f, 0x20, + 0x7a, 0x6a, 0xb6, 0x88, 0x2c, 0x9d, 0x65, 0xb2, + 0x3d, 0x05, 0xfc, 0x81, 0xe9, 0xa7, 0x59, 0x6c, + 0x8f, 0x41, 0x7f, 0x20, 0x7a, 0x6a, 0xb6, 0x88, + 0x2c, 0x9d, 0x65, 0xb2, 0x3d, 0x05, 0xfc, 0x81, + 0xe9, 0xa7, 0x59, 0x6c, 0x8f, 0x41, 0x7f, 0x20, + 0x7a, 0x6a, 0xb6, 0x88, 0x2c, 0x9d, 0x65, 0xb2, + 0x3d, 0x05, 0xfc, 0x81, 0xe9, 0xa7, 0x59, 0x6c, + 0x8f, 0x41, 0x7f, 0x20, 0x7a, 0x6a, 0xb6, 0x88, + 0x2c, 0x9d, 0x65, 0xb2, 0x3d, 0x05, 0xfc, 0x81, + 0xe9, 0xa7, 0x59, 0x6c, 0x8f, 0x41, 0x7f, 0x20, + 0x7a, 0x6a, 0xb6, 0x88, 0x2c, 0x9d, 0x65, 0xb2, + 0x3d, 0x05, 0xfc, 0x81, 0xe9, 0xaf, 0x70, 0xe6, + 0x1b, 0x2a, 0xe9, 0xa3, 0x11, 0xd9, 0xb9, 0xaf, + 0x2e, 0x68, 0x69, 0xc0, 0x3c, 0xa2, 0x74, 0x7e, + 0x7a, 0xac, 0x2d, 0xd6, 0x9e, 0xf7, 0x07, 0xda, + 0xb3, 0xeb, 0x20, 0xb8, 0x67, 0x3e, 0xf2, 0xcd, + 0xfc, 0x03, 0xc2, 0xb8, 0x17, 0x7e, 0x75, 0xef, + 0x4d, 0xf3, 0x07, 0x84, 0xae, 0x04, 0x1e, 0xa0, + 0xfd, 0xb3, 0x3c, 0xe6, 0xf8, 0x54, 0xd2, 0x85, + 0x83, 0xf6, 0xcc, 0xf3, 0x9b, 0xe1, 0x53, 0x48, + 0x30, 0x54, 0x76, 0x69, 0xef, 0x56, 0x7f, 0x69, + 0xf2, 0x85, 0x22, 0x54, 0x76, 0x69, 0xef, 0x56, + 0x7f, 0x69, 0xf2, 0x84, 0x0c, 0xaf, 0xde, 0xaf, + 0x3c, 0xf3, 0xf5, 0x8a, 0x92, 0x51, 0x99, 0x59, + 0xff, 0x00, 0xba, 0xbc, 0xf3, 0xcf, 0xd6, 0x2a, + 0x4a, 0xa8, 0x32, 0x8b, 0x15, 0x4a, 0xa0, 0xca, + 0x2c, 0x55, 0x2a, 0x83, 0x28, 0xb1, 0x54, 0xaa, + 0x0c, 0xa2, 0xc5, 0x52, 0xa8, 0x32, 0x8b, 0x15, + 0x4a, 0xa0, 0xca, 0x2c, 0x55, 0x2a, 0x83, 0x28, + 0xb1, 0x54, 0xaa, 0x0c, 0xa2, 0xc5, 0x52, 0xa8, + 0x32, 0x8b, 0x15, 0x4a, 0xa0, 0xca, 0x2c, 0x55, + 0x2a, 0x83, 0x28, 0xb1, 0x54, 0xaa, 0x0c, 0xa2, + 0xc5, 0x52, 0xa8, 0x32, 0x8b, 0x15, 0x4a, 0xa0, + 0xca, 0x2c, 0x55, 0x2a, 0x83, 0x28, 0xb1, 0x54, + 0xaa, 0x0c, 0xa2, 0xc5, 0x52, 0xa8, 0x32, 0x8b, + 0x15, 0x4a, 0xa0, 0xca, 0x2c, 0x55, 0x2a, 0x83, + 0x28, 0xb1, 0x54, 0xaa, 0x0c, 0xa2, 0xc5, 0x52, + 0xa8, 0x32, 0x8b, 0x15, 0x4a, 0xa0, 0xca, 0x2c, + 0x55, 0x2a, 0x83, 0x28, 0xb1, 0x54, 0xaa, 0x0c, + 0xa2, 0xc5, 0x52, 0xa8, 0x32, 0x8b, 0x15, 0x4a, + 0xa0, 0xca, 0x2c, 0x55, 0x2a, 0x83, 0x23, 0x5a, + 0x83, 0x77, 0x94, 0x7b, 0x65, 0x4d, 0x83, 0xa5, + 0x42, 0x3b, 0xca, 0x3d, 0xb2, 0x83, 0x75, 0x97, + 0xbd, 0xc3, 0xe7, 0x05, 0x19, 0xb5, 0x07, 0xfc, + 0xde, 0x4f, 0x35, 0x9e, 0x02, 0xa4, 0xec, 0xbd, + 0xee, 0x1f, 0x39, 0x44, 0xed, 0x51, 0xa6, 0x72, + 0xff, 0x00, 0x31, 0x9e, 0x02, 0xba, 0xe0, 0xfb, + 0xd9, 0x7c, 0xef, 0xf0, 0xa3, 0xf6, 0x91, 0x95, + 0x4a, 0xad, 0x78, 0x93, 0x12, 0xd5, 0xab, 0xcd, + 0xd1, 0xb2, 0xa9, 0x55, 0xaf, 0x12, 0x62, 0x4d, + 0x4d, 0xad, 0x95, 0x4a, 0xad, 0x78, 0x93, 0x12, + 0x6a, 0x6d, 0x6c, 0xaa, 0x55, 0x6b, 0xc4, 0x98, + 0x93, 0x53, 0x6b, 0x65, 0x52, 0xab, 0x5e, 0x24, + 0xc4, 0x9a, 0x9b, 0x5b, 0x2a, 0x95, 0x5a, 0xf1, + 0x26, 0x24, 0xd4, 0xda, 0xd9, 0x54, 0xaa, 0xd7, + 0x89, 0x31, 0x26, 0xa6, 0xd6, 0xca, 0xa5, 0x56, + 0xbc, 0x49, 0x89, 0x35, 0x36, 0xbb, 0xb2, 0xa3, + 0xfe, 0x67, 0x6b, 0xf6, 0xad, 0xf0, 0xab, 0x1e, + 0xd6, 0xe2, 0x75, 0x8c, 0x38, 0x41, 0x34, 0x97, + 0x4d, 0x34, 0xee, 0x2a, 0xa5, 0xa5, 0xc8, 0xb6, + 0xba, 0x8a, 0xe0, 0x8c, 0x5c, 0xd3, 0x83, 0xb0, + 0xd6, 0x95, 0xa2, 0xb0, 0xfc, 0x6b, 0x0f, 0x44, + 0x77, 0xef, 0x07, 0x12, 0xe3, 0x92, 0x2d, 0xba, + 0xb6, 0x88, 0xd7, 0x46, 0x9c, 0x13, 0x4e, 0xd6, + 0x4c, 0x76, 0xb6, 0xd9, 0xbf, 0x83, 0x76, 0xca, + 0x5a, 0x4d, 0x1c, 0x53, 0x5c, 0x48, 0xd2, 0xd1, + 0x25, 0x1a, 0xc0, 0xed, 0x04, 0xd3, 0x4d, 0x57, + 0x9b, 0x2b, 0xb6, 0xcb, 0xb5, 0x77, 0x04, 0x1a, + 0xb5, 0xcd, 0x73, 0x18, 0x7b, 0x2c, 0x0d, 0x05, + 0x71, 0xde, 0x6d, 0x84, 0xf2, 0xb3, 0x0d, 0xac, + 0x22, 0x02, 0xed, 0x05, 0xee, 0x76, 0x22, 0x07, + 0x61, 0x42, 0xdb, 0x5d, 0x4b, 0x6d, 0x3b, 0x2e, + 0x22, 0x77, 0xeb, 0x18, 0x71, 0x57, 0x7f, 0x7f, + 0x85, 0x46, 0xcb, 0x5a, 0x6d, 0x33, 0x1a, 0x4d, + 0xa3, 0x45, 0xad, 0x96, 0x94, 0x8c, 0x74, 0xa7, + 0x18, 0xa5, 0xa2, 0xd6, 0x9e, 0x7a, 0x2c, 0x7b, + 0x4b, 0x98, 0x66, 0x16, 0x97, 0xb1, 0x36, 0x09, + 0x4c, 0x71, 0x48, 0xc1, 0x84, 0x00, 0x0d, 0x5c, + 0x0e, 0x90, 0x16, 0xbc, 0xde, 0xdf, 0x38, 0x83, + 0x2e, 0x74, 0xb7, 0x77, 0xa2, 0x48, 0x9d, 0x85, + 0xae, 0x86, 0x80, 0x69, 0x34, 0x3d, 0xe5, 0xed, + 0x9b, 0x5d, 0x65, 0x23, 0x5a, 0x6e, 0xad, 0x49, + 0x91, 0x9a, 0x45, 0x28, 0xe1, 0x5d, 0xf6, 0xd7, + 0x52, 0x8b, 0xce, 0xb3, 0xd9, 0x73, 0x3a, 0x31, + 0x8d, 0xe6, 0xa0, 0x8c, 0xd5, 0xad, 0x26, 0xa5, + 0xce, 0xa5, 0x2a, 0xea, 0x25, 0x2b, 0x7f, 0xa2, + 0x36, 0x44, 0x2d, 0x96, 0xd8, 0xf4, 0xc9, 0x7d, + 0xf3, 0x6d, 0xfa, 0x6d, 0xac, 0x70, 0xd1, 0x68, + 0x31, 0xba, 0x5d, 0x9e, 0x11, 0xb4, 0x55, 0xce, + 0xb5, 0x6d, 0x06, 0xff, 0x00, 0x88, 0x14, 0x56, + 0xc7, 0xc6, 0xfe, 0x7a, 0xe6, 0x52, 0xd2, 0x1a, + 0x1a, 0x19, 0x52, 0x29, 0xa6, 0xa4, 0x90, 0xb5, + 0x47, 0xb5, 0xdc, 0xd5, 0x9c, 0x50, 0x47, 0x6e, + 0x71, 0xc6, 0xc6, 0xb0, 0x3c, 0xbc, 0x50, 0xe1, + 0xa5, 0x74, 0x53, 0x74, 0x05, 0xbf, 0xe3, 0x1b, + 0x66, 0xc2, 0x79, 0xbb, 0x72, 0x25, 0xde, 0x24, + 0x06, 0xd5, 0x57, 0x65, 0xf4, 0xb4, 0x6d, 0xe1, + 0x32, 0xb6, 0xfc, 0x33, 0x7c, 0x77, 0xdd, 0xf6, + 0x57, 0xc3, 0xde, 0xdd, 0x0c, 0x8d, 0x76, 0xd6, + 0xc9, 0x4d, 0x38, 0x62, 0x2d, 0x3d, 0xba, 0x35, + 0x72, 0x6d, 0x73, 0x1f, 0xed, 0xb0, 0x50, 0x13, + 0x8a, 0x32, 0x05, 0x05, 0x6b, 0xa7, 0xfa, 0x54, + 0x3d, 0xae, 0x69, 0x71, 0x0e, 0x62, 0x33, 0x0f, + 0xda, 0x48, 0x5c, 0xe7, 0x3c, 0x1d, 0x01, 0xd8, + 0xbf, 0x37, 0xb8, 0xa7, 0x67, 0xdb, 0x1b, 0x67, + 0x45, 0x58, 0xed, 0x9c, 0x65, 0x03, 0x46, 0x3a, + 0x51, 0xa7, 0xb2, 0xad, 0x35, 0xb5, 0x6d, 0x59, + 0x88, 0xd7, 0x86, 0x8a, 0x57, 0x26, 0x3b, 0xe3, + 0xb4, 0x4d, 0xb4, 0xdd, 0x7d, 0xe9, 0x2c, 0xd5, + 0xae, 0x66, 0xcf, 0x48, 0xd7, 0x0a, 0x39, 0xb1, + 0x30, 0x1e, 0xd8, 0x2d, 0x5e, 0x72, 0x7f, 0xfb, + 0x8d, 0x9f, 0x6c, 0x6d, 0xd2, 0xe3, 0x1b, 0xe3, + 0xee, 0x9c, 0x5c, 0x6a, 0x16, 0xf3, 0x6a, 0x45, + 0xde, 0x5c, 0xfb, 0x47, 0x40, 0x43, 0xe4, 0x68, + 0x06, 0x5c, 0x42, 0x95, 0x04, 0x1a, 0xd0, 0x0e, + 0xc2, 0xf5, 0x90, 0xbf, 0x3a, 0xb4, 0xb6, 0x33, + 0x41, 0x6e, 0x2e, 0x6c, 0xe4, 0xab, 0x83, 0x4b, + 0xc0, 0x35, 0x1a, 0x09, 0x6e, 0x9a, 0xee, 0x6f, + 0x2a, 0xec, 0xb6, 0xc9, 0xd6, 0x22, 0x3e, 0xad, + 0x7c, 0x5d, 0x3b, 0xb4, 0xee, 0x56, 0x6b, 0x33, + 0x68, 0xed, 0xcc, 0x4f, 0xba, 0x1b, 0xb6, 0x5e, + 0xca, 0xe2, 0x3b, 0xf9, 0xa5, 0x96, 0x37, 0x46, + 0x23, 0x66, 0x0f, 0x18, 0x52, 0xa4, 0x9d, 0xce, + 0x05, 0xcb, 0xb5, 0x47, 0xfc, 0xd8, 0xfd, 0x93, + 0x3e, 0x55, 0x29, 0x94, 0x67, 0x37, 0x79, 0xad, + 0xfb, 0x81, 0x8b, 0x9a, 0xb6, 0x89, 0x84, 0x91, + 0xba, 0x5c, 0x48, 0xa5, 0x6a, 0xa1, 0xb6, 0xaa, + 0x46, 0xbb, 0x38, 0x78, 0x06, 0xa5, 0xb1, 0xb0, + 0x1a, 0x6e, 0x11, 0xbe, 0xaf, 0x59, 0xb7, 0x77, + 0x59, 0xe9, 0x73, 0xcb, 0x15, 0x8f, 0x2d, 0x31, + 0x4d, 0x74, 0x9b, 0x70, 0xd5, 0x19, 0x54, 0xaa, + 0xd7, 0x89, 0x31, 0x2e, 0xb1, 0x3c, 0x21, 0x8e, + 0x6a, 0xd9, 0x54, 0xaa, 0xd7, 0x89, 0x31, 0x29, + 0xd4, 0xda, 0xd9, 0x54, 0xaa, 0xd7, 0x89, 0x31, + 0x26, 0xa6, 0xd6, 0xca, 0xa5, 0x56, 0xbc, 0x49, + 0x89, 0x35, 0x36, 0xb6, 0x55, 0x2a, 0xb5, 0xe2, + 0x4c, 0x49, 0xa9, 0xb5, 0xb2, 0xa9, 0x55, 0xaf, + 0x12, 0x62, 0x4d, 0x4d, 0xad, 0x95, 0x4a, 0xad, + 0x78, 0x93, 0x12, 0x6a, 0x6d, 0x6c, 0xaa, 0x55, + 0x6b, 0xc4, 0x98, 0x93, 0x53, 0x6a, 0x43, 0x27, + 0x3f, 0xe6, 0x96, 0xbf, 0x6a, 0xdf, 0x0a, 0xb1, + 0x66, 0xde, 0xfa, 0xef, 0x35, 0xbe, 0x05, 0x5a, + 0xc9, 0x9d, 0xfe, 0x6b, 0x69, 0xf6, 0xad, 0xf0, + 0xab, 0x36, 0x6d, 0xef, 0xae, 0xed, 0x0f, 0x02, + 0xcd, 0xe6, 0x3c, 0x63, 0xe0, 0xf4, 0x3c, 0x8c, + 0x69, 0x8e, 0xff, 0x00, 0x17, 0x1a, 0x22, 0x2e, + 0x2d, 0x86, 0xd6, 0x7b, 0x85, 0x8f, 0xf6, 0xbe, + 0xa8, 0x55, 0x85, 0x67, 0xda, 0xcf, 0x70, 0xb1, + 0xfe, 0xd7, 0xd5, 0x0a, 0xb0, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x07, 0x51, 0xed, 0x69, 0x56, 0x2c, + 0xdb, 0x9e, 0x8b, 0x22, 0xcb, 0xc5, 0xae, 0x26, + 0xdb, 0x96, 0xd6, 0x5c, 0x1a, 0x2a, 0x69, 0xf9, + 0xd4, 0x55, 0xd5, 0x29, 0x67, 0x9b, 0x66, 0x59, + 0x54, 0x62, 0x27, 0xc7, 0x8a, 0xdd, 0xfa, 0x44, + 0x53, 0x0d, 0x04, 0x1a, 0x69, 0x05, 0x07, 0x9b, + 0x5c, 0xdd, 0xac, 0xca, 0xae, 0x2c, 0x6e, 0x1a, + 0xe9, 0x9b, 0x2e, 0x98, 0x9d, 0x5a, 0xe1, 0x3b, + 0xfa, 0x56, 0xab, 0xdc, 0xad, 0xf6, 0x96, 0x96, + 0xd7, 0x7c, 0xe0, 0x95, 0x97, 0x4d, 0xae, 0x81, + 0x4c, 0x24, 0x01, 0xa0, 0xe9, 0x2a, 0x55, 0xd6, + 0xb9, 0x5e, 0x77, 0x65, 0x35, 0xcd, 0x9c, 0x3e, + 0xcb, 0x79, 0x6e, 0x31, 0x39, 0x80, 0xe8, 0x23, + 0x4e, 0xf6, 0x8d, 0x34, 0x2b, 0x9e, 0x33, 0xed, + 0x7b, 0x2b, 0x23, 0x06, 0x97, 0xd8, 0xca, 0x1e, + 0xd1, 0xfd, 0x47, 0x1a, 0xfc, 0xa5, 0x07, 0x21, + 0xca, 0x5e, 0x32, 0xd8, 0xef, 0xf9, 0xc0, 0x4c, + 0xd2, 0x73, 0x51, 0xc3, 0x4d, 0x24, 0xd4, 0x8a, + 0xe2, 0xaf, 0x63, 0x79, 0x76, 0x1d, 0x9f, 0xb4, + 0x8a, 0x46, 0x5b, 0x5d, 0x5f, 0xb2, 0x1b, 0xb7, + 0xd3, 0xf5, 0x40, 0x54, 0x02, 0x77, 0x09, 0x5e, + 0xf3, 0x99, 0xbd, 0x86, 0x3c, 0xae, 0xd5, 0xba, + 0xed, 0x58, 0xd9, 0x5e, 0x37, 0xcd, 0x45, 0x6a, + 0xb7, 0x4f, 0x0e, 0x57, 0x9d, 0xdd, 0x0b, 0xbb, + 0x3b, 0xbf, 0x67, 0xbc, 0x76, 0x12, 0x61, 0x90, + 0x68, 0x2e, 0x6f, 0x93, 0x42, 0x83, 0x5e, 0x4b, + 0x96, 0x7b, 0x26, 0x75, 0x82, 0xe2, 0xe1, 0x91, + 0xcf, 0x03, 0xe8, 0xd8, 0xa8, 0x6b, 0x20, 0x73, + 0x6a, 0x0b, 0x4a, 0xf3, 0x73, 0x60, 0x4e, 0x7a, + 0x05, 0xa5, 0xf3, 0x45, 0xc4, 0xf3, 0x49, 0xe4, + 0xb6, 0xae, 0x8b, 0x5b, 0x8d, 0x74, 0xe9, 0x58, + 0xb3, 0x6d, 0xfb, 0x36, 0x9e, 0x16, 0xe6, 0x07, + 0x1d, 0xc0, 0x3a, 0x5f, 0xa2, 0x84, 0x61, 0xa0, + 0x2d, 0xa2, 0x59, 0x80, 0x36, 0xb5, 0xd4, 0xf5, + 0xf2, 0x7c, 0xa8, 0x38, 0x9b, 0x96, 0x5d, 0x5e, + 0x66, 0xd2, 0xd9, 0x89, 0x03, 0xe5, 0x6b, 0xdf, + 0xce, 0xcc, 0x74, 0x0a, 0x03, 0x42, 0xff, 0x00, + 0xe8, 0x5d, 0x27, 0x21, 0xb6, 0x99, 0x92, 0xb6, + 0xc6, 0xf9, 0x97, 0x13, 0xc0, 0xd2, 0x5d, 0x10, + 0x14, 0xad, 0x35, 0xd1, 0x48, 0x65, 0xfe, 0x25, + 0xe6, 0x79, 0x28, 0xf2, 0x9a, 0x1f, 0x4e, 0x17, + 0x15, 0x5c, 0xb4, 0xbc, 0xb8, 0xb3, 0x94, 0x4d, + 0x6c, 0xfc, 0x12, 0x00, 0x5a, 0x0e, 0xba, 0xd7, + 0xb0, 0x82, 0x5a, 0xd2, 0x9f, 0x0a, 0xde, 0xe8, + 0xa1, 0xe7, 0x86, 0xad, 0xcf, 0x21, 0x70, 0xc1, + 0x94, 0xbd, 0xf9, 0x7c, 0x97, 0xf3, 0x4a, 0x20, + 0x85, 0x9a, 0x23, 0xc4, 0x09, 0x32, 0x1f, 0xea, + 0xe9, 0x0a, 0x5f, 0x24, 0xb7, 0x8e, 0xef, 0x23, + 0xba, 0x8e, 0x67, 0x86, 0x46, 0xe9, 0xf1, 0x4a, + 0xfd, 0xe0, 0xd0, 0xd7, 0x1f, 0x02, 0xd1, 0xb5, + 0x01, 0xff, 0x00, 0xf6, 0x8f, 0x81, 0xc0, 0xe5, + 0xe5, 0x80, 0x5b, 0xe1, 0xd4, 0x0e, 0xed, 0x50, + 0x41, 0x02, 0xe6, 0x9a, 0xb4, 0x96, 0x91, 0x43, + 0xdd, 0x0a, 0x7f, 0x65, 0x6e, 0xae, 0x65, 0xcd, + 0x30, 0x4b, 0x34, 0x92, 0x37, 0x9b, 0x77, 0x8a, + 0xe7, 0x12, 0x37, 0x37, 0x0a, 0xaf, 0xee, 0x29, + 0xbd, 0x91, 0xfe, 0x6d, 0xff, 0x00, 0xe3, 0x77, + 0xc8, 0x82, 0x36, 0x5b, 0xcb, 0xc9, 0x24, 0x74, + 0x6e, 0x9e, 0x42, 0xd7, 0x3c, 0x8c, 0x25, 0xee, + 0x23, 0x4b, 0xb4, 0x68, 0xae, 0xe2, 0xec, 0xcc, + 0x72, 0xfb, 0xa3, 0x9b, 0xc3, 0x67, 0x75, 0x73, + 0xed, 0x12, 0xcc, 0x1a, 0x04, 0xce, 0x6d, 0x28, + 0x0d, 0x68, 0x29, 0x5d, 0xca, 0x28, 0xef, 0xff, + 0x00, 0x73, 0xff, 0x00, 0xe4, 0xfe, 0xf2, 0xb0, + 0xe6, 0x9f, 0xea, 0xab, 0x2e, 0xd4, 0x7f, 0xde, + 0x41, 0xcd, 0xf0, 0xe4, 0x11, 0x5c, 0x7b, 0x35, + 0xd5, 0xfb, 0x23, 0x99, 0xc6, 0x91, 0x30, 0x0d, + 0x2e, 0x1b, 0x84, 0x8a, 0xe8, 0xaa, 0xf0, 0x36, + 0x7e, 0x38, 0x26, 0x31, 0xe6, 0x17, 0x91, 0xdb, + 0x97, 0x38, 0xb6, 0x16, 0xd2, 0xa5, 0xe2, 0xb4, + 0x0e, 0xec, 0x2d, 0x79, 0xb6, 0x9d, 0xa3, 0x7f, + 0xdb, 0xc6, 0x3b, 0xe1, 0x7a, 0xda, 0xb2, 0x7a, + 0xe6, 0x41, 0x5d, 0x4c, 0x65, 0x3b, 0x1a, 0x2a, + 0x83, 0x93, 0x30, 0xca, 0xee, 0x2c, 0xaf, 0x7d, + 0x8c, 0xfe, 0xb1, 0xee, 0xa7, 0x36, 0xe1, 0xa3, + 0x10, 0x76, 0xa5, 0xde, 0x36, 0x76, 0xd9, 0xb2, + 0x0b, 0x49, 0xef, 0xd9, 0x1d, 0xeb, 0xc0, 0xa4, + 0x38, 0x49, 0x02, 0xbb, 0x95, 0x52, 0x37, 0xac, + 0x0f, 0xda, 0x9c, 0xbe, 0xba, 0x7f, 0x52, 0xd3, + 0xdb, 0xa1, 0x7a, 0xe4, 0xbd, 0xb7, 0xc9, 0x0e, + 0x67, 0x2c, 0xf3, 0x5f, 0xbd, 0x93, 0x36, 0x62, + 0xe7, 0x30, 0x46, 0x48, 0x05, 0xa7, 0xc9, 0xad, + 0x10, 0x47, 0x5a, 0xe4, 0xd3, 0x4d, 0x9a, 0x3b, + 0x2c, 0x91, 0xe2, 0x19, 0x18, 0x09, 0x2e, 0xa6, + 0x21, 0x46, 0x8a, 0xea, 0xa8, 0xd6, 0xbd, 0x5e, + 0xe4, 0xec, 0xb1, 0xb4, 0x32, 0x4f, 0x72, 0xcf, + 0x6a, 0xd1, 0x4b, 0x56, 0xeb, 0xa1, 0x34, 0xa9, + 0x52, 0xf6, 0x97, 0x76, 0xb7, 0x9b, 0x56, 0xc9, + 0xed, 0x5e, 0x24, 0x8d, 0xd0, 0x38, 0x17, 0x50, + 0x8d, 0x20, 0x53, 0x75, 0x56, 0xee, 0x9e, 0xe7, + 0xdd, 0x4a, 0xf7, 0x1c, 0x4e, 0x73, 0xdc, 0x49, + 0x3a, 0x4e, 0xb4, 0x1a, 0x91, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x6e, 0xb4, 0xf7, 0xb8, 0x3e, 0xd5, 0x9f, + 0x59, 0x69, 0x5b, 0xad, 0x3d, 0xee, 0x0f, 0xb5, + 0x67, 0xd6, 0x41, 0x70, 0xce, 0xbd, 0xe9, 0xbe, + 0x60, 0xf0, 0x95, 0xc0, 0xbb, 0xf3, 0xaf, 0x7a, + 0x6f, 0x98, 0x3c, 0x25, 0x70, 0x20, 0xf5, 0x07, + 0xed, 0x99, 0xe7, 0x37, 0xc2, 0xa6, 0x94, 0x34, + 0x3f, 0xb6, 0x67, 0x9c, 0xdf, 0x0a, 0x98, 0xaa, + 0x01, 0x51, 0xd9, 0xa7, 0xbd, 0x59, 0xfd, 0xa7, + 0xca, 0x14, 0x8d, 0x54, 0x6e, 0x68, 0x7f, 0xee, + 0xad, 0x3e, 0xd3, 0xe5, 0x08, 0x19, 0x67, 0xbd, + 0x5d, 0xf9, 0xe7, 0xeb, 0x15, 0x22, 0xa3, 0xb2, + 0xcf, 0x7a, 0xbb, 0xf3, 0xcf, 0xd6, 0x2a, 0x45, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x06, 0x46, 0xb5, 0x08, 0x75, 0x9e, 0xd9, + 0x53, 0x63, 0x5a, 0x84, 0x3a, 0xcf, 0x6c, 0xa0, + 0xf7, 0x03, 0xc4, 0x73, 0x46, 0xf3, 0xa9, 0xae, + 0x04, 0xae, 0x1d, 0xb2, 0x80, 0xb2, 0xfe, 0x2b, + 0x81, 0xe4, 0x4d, 0x1d, 0x01, 0xdc, 0xc4, 0xd3, + 0xc4, 0x57, 0x5a, 0xed, 0x96, 0xda, 0x2c, 0xe7, + 0x2d, 0x36, 0x92, 0x10, 0xdb, 0x88, 0xb4, 0xc4, + 0xee, 0xc8, 0xd4, 0x7b, 0x5b, 0xea, 0xd8, 0xed, + 0xb6, 0xd1, 0x2e, 0x59, 0xf1, 0xef, 0xc7, 0x35, + 0x8f, 0x1f, 0x15, 0x1f, 0x12, 0x62, 0x59, 0xba, + 0xb6, 0xb8, 0xb3, 0x9d, 0xd6, 0xf7, 0x2c, 0x2c, + 0x91, 0xba, 0xc1, 0xd4, 0x7b, 0x20, 0xee, 0x85, + 0xaa, 0xab, 0x5e, 0xba, 0xbc, 0xbd, 0x26, 0x38, + 0x4c, 0x69, 0x2d, 0x98, 0x93, 0x12, 0xd7, 0x54, + 0xaa, 0x0d, 0x98, 0x93, 0x12, 0xd7, 0x54, 0xaa, + 0x0d, 0x98, 0x93, 0x12, 0xd7, 0x54, 0xaa, 0x0d, + 0x98, 0x93, 0x12, 0xd7, 0x54, 0xaa, 0x0d, 0x98, + 0x93, 0x12, 0xd7, 0x54, 0xaa, 0x0d, 0x98, 0x93, + 0x12, 0xd7, 0x54, 0xaa, 0x0d, 0x98, 0x93, 0x12, + 0xd7, 0x54, 0xaa, 0x0d, 0x98, 0x8a, 0x62, 0x3b, + 0xfa, 0x96, 0xba, 0xa5, 0x50, 0x6c, 0xc4, 0x98, + 0x96, 0xba, 0xa5, 0x53, 0x53, 0x46, 0xcc, 0x45, + 0x31, 0x2d, 0x75, 0x4a, 0xa1, 0x1c, 0x3c, 0x1b, + 0x31, 0x26, 0x22, 0xb5, 0xd5, 0x2a, 0x86, 0x8d, + 0x98, 0x8f, 0x1a, 0x62, 0xd2, 0x0e, 0xf6, 0xa5, + 0xae, 0xa9, 0x54, 0x1b, 0x31, 0x1e, 0x1d, 0x6a, + 0x53, 0x29, 0xda, 0x1b, 0x9c, 0xb5, 0x9c, 0xce, + 0x16, 0xcd, 0x01, 0x38, 0xb0, 0x38, 0x90, 0x41, + 0xfe, 0xa9, 0x0a, 0x1e, 0xa9, 0x55, 0x13, 0x58, + 0xb7, 0x09, 0x5a, 0x96, 0xb5, 0x26, 0x26, 0xb3, + 0xa6, 0x8b, 0x3c, 0xbb, 0x69, 0x26, 0x02, 0x2d, + 0xad, 0x5b, 0x1b, 0xce, 0xb7, 0x38, 0xe2, 0xa1, + 0xdf, 0x38, 0x68, 0xab, 0xf3, 0x5c, 0x4b, 0x34, + 0xaf, 0x9a, 0x57, 0x63, 0x92, 0x43, 0x89, 0xce, + 0x3b, 0xfa, 0x96, 0x82, 0x41, 0xd7, 0xa5, 0x2a, + 0x91, 0x4a, 0xd6, 0x75, 0x84, 0xdf, 0x25, 0xef, + 0xf7, 0x4e, 0xb1, 0xc9, 0xb3, 0x12, 0x62, 0x5a, + 0xea, 0x95, 0x52, 0xa3, 0x66, 0x24, 0xc4, 0xb5, + 0xd5, 0x2a, 0x83, 0x66, 0x24, 0xc4, 0xb5, 0xd5, + 0x2a, 0x83, 0x66, 0x24, 0xc4, 0xb5, 0xd5, 0x2a, + 0x83, 0x66, 0x24, 0xc4, 0xb5, 0xd5, 0x2a, 0x83, + 0x66, 0x24, 0xc4, 0xb5, 0xd5, 0x2a, 0x83, 0x66, + 0x24, 0xc4, 0xb5, 0xd5, 0x2a, 0x83, 0x66, 0x24, + 0xc4, 0xb5, 0xd5, 0x7a, 0x8d, 0xb2, 0x4b, 0x23, + 0x62, 0x8d, 0xa5, 0xef, 0x79, 0xa3, 0x40, 0xd6, + 0x7b, 0x40, 0x26, 0xba, 0x1a, 0x4c, 0xf0, 0x84, + 0xbe, 0xcc, 0x5b, 0xba, 0xe7, 0x38, 0x80, 0x81, + 0xe2, 0xc5, 0x59, 0x5c, 0x7b, 0x0d, 0xd5, 0xc2, + 0x54, 0xf6, 0x63, 0x20, 0x7d, 0xec, 0x84, 0x6a, + 0x07, 0x08, 0xfe, 0xc8, 0x4c, 0xa7, 0x2f, 0x6e, + 0x47, 0x60, 0xe9, 0x26, 0xa1, 0xbc, 0x9f, 0x4b, + 0x80, 0xd3, 0x4d, 0xe6, 0x8e, 0xd2, 0xe7, 0xa9, + 0x3a, 0x49, 0xa9, 0x3a, 0x4a, 0xcb, 0x92, 0xdb, + 0xac, 0xf4, 0xfc, 0xbe, 0x39, 0xa5, 0x34, 0x9f, + 0x6f, 0x11, 0x11, 0x15, 0x1d, 0x8d, 0xac, 0xf7, + 0x0b, 0x1f, 0xed, 0x7d, 0x50, 0xab, 0x0a, 0xcf, + 0xb5, 0x9e, 0xe1, 0x63, 0xfd, 0xaf, 0xaa, 0x15, + 0x61, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x29, 0x5e, + 0xc2, 0xb1, 0x3c, 0x5a, 0xe7, 0x76, 0x16, 0xa0, + 0x5c, 0xb2, 0xde, 0xee, 0xd9, 0xb8, 0x1c, 0xd9, + 0x0d, 0x01, 0x1d, 0xbe, 0xe2, 0xae, 0xa6, 0x8a, + 0xd7, 0x75, 0x05, 0x8a, 0x37, 0x5a, 0x64, 0x56, + 0x37, 0x0d, 0x17, 0x0c, 0xb9, 0xbc, 0xb9, 0x6e, + 0x10, 0xd8, 0xcd, 0x5a, 0x35, 0xe9, 0xef, 0xae, + 0x6d, 0x95, 0x7b, 0x1d, 0x78, 0xfb, 0x29, 0x01, + 0x31, 0xdc, 0xc4, 0x41, 0x1d, 0x96, 0xd1, 0xda, + 0x7b, 0x80, 0xa8, 0x63, 0xa8, 0xd3, 0x41, 0xa5, + 0x01, 0x52, 0xf9, 0x7e, 0x67, 0x96, 0x65, 0xf0, + 0xf3, 0xf0, 0x43, 0x23, 0xf3, 0x02, 0xc2, 0xdc, + 0x4e, 0x3e, 0x20, 0x27, 0x59, 0x6a, 0x0f, 0x19, + 0x9d, 0xf4, 0x6e, 0xda, 0x07, 0x5c, 0x3d, 0xa1, + 0xf0, 0xc5, 0x20, 0x6e, 0x13, 0xa4, 0x16, 0x33, + 0xc5, 0xd4, 0x7b, 0x4b, 0xb6, 0xeb, 0x2b, 0xb3, + 0xbb, 0xbd, 0x6d, 0xf5, 0xa5, 0xe5, 0xbc, 0x56, + 0xae, 0x2d, 0x7b, 0x81, 0x70, 0x69, 0x61, 0x1a, + 0xc0, 0x6d, 0x28, 0x3b, 0xca, 0xbc, 0x49, 0x24, + 0x93, 0xa4, 0x9d, 0x24, 0xf6, 0x4a, 0x50, 0x20, + 0x9f, 0x9b, 0x35, 0xb5, 0x93, 0x69, 0x60, 0xb9, + 0x6b, 0x87, 0xb3, 0xc5, 0x48, 0xf9, 0xd3, 0xba, + 0x29, 0xa5, 0xdc, 0x2b, 0xdf, 0x37, 0x6b, 0x6b, + 0xb4, 0x31, 0x5e, 0x7b, 0x5c, 0x32, 0x45, 0x3c, + 0xaf, 0x79, 0x0d, 0x70, 0xf1, 0x01, 0x1f, 0x9d, + 0xa7, 0x7d, 0x57, 0x53, 0xb1, 0xbf, 0xad, 0x04, + 0xf5, 0x8e, 0x63, 0x6b, 0x16, 0x73, 0x7f, 0x1c, + 0xcf, 0xa5, 0xad, 0xe9, 0x7b, 0x39, 0xdd, 0xc0, + 0x49, 0xf1, 0x4f, 0x7c, 0xad, 0x96, 0x96, 0x76, + 0x99, 0x3c, 0xb2, 0xde, 0xdc, 0xdc, 0xc3, 0x33, + 0x43, 0x5c, 0xdb, 0x78, 0xd8, 0x43, 0x8b, 0x8b, + 0xb5, 0x12, 0x15, 0x75, 0x00, 0x03, 0x56, 0xe6, + 0xa4, 0x13, 0x36, 0xd7, 0x50, 0x8d, 0x9c, 0xbd, + 0x84, 0xc8, 0xd6, 0xcd, 0x2c, 0xd8, 0x9b, 0x1d, + 0x7c, 0x62, 0x3c, 0x4d, 0xce, 0xe2, 0xce, 0x59, + 0x77, 0x6d, 0x77, 0x96, 0xcf, 0x95, 0x5e, 0xc8, + 0xd8, 0x83, 0x6a, 0xfb, 0x79, 0x24, 0x70, 0x01, + 0xa4, 0x7e, 0x6e, 0x95, 0x0b, 0xa3, 0x81, 0x35, + 0x8a, 0x6e, 0x6b, 0x40, 0x35, 0x04, 0x83, 0xa6, + 0x87, 0x58, 0xd2, 0x3b, 0x94, 0x52, 0xfb, 0x2f, + 0x3c, 0x10, 0x66, 0x78, 0xe6, 0x91, 0xb1, 0xb7, + 0x9b, 0x3a, 0x5e, 0xe0, 0x34, 0x95, 0x10, 0x9d, + 0x84, 0x1e, 0xea, 0x3d, 0xa2, 0xb5, 0x14, 0xe7, + 0x2b, 0x5d, 0xca, 0x62, 0xd6, 0xa7, 0x73, 0x1b, + 0xab, 0x69, 0x36, 0x92, 0xce, 0x76, 0x4c, 0xc3, + 0x13, 0x44, 0x78, 0x9e, 0x1c, 0x30, 0x8a, 0x62, + 0xad, 0x4a, 0xaf, 0xa7, 0x61, 0x04, 0x96, 0x65, + 0x34, 0x4f, 0xcf, 0xdd, 0x2b, 0x24, 0x6b, 0xa3, + 0x33, 0x31, 0xd8, 0xc1, 0x14, 0xa5, 0x42, 0xce, + 0xd2, 0x4f, 0x0c, 0xf9, 0xb4, 0x92, 0x42, 0xf6, + 0xca, 0xc2, 0xd6, 0x00, 0xe6, 0x38, 0x11, 0xa0, + 0x51, 0x46, 0x55, 0x2b, 0xa2, 0x9b, 0x88, 0x2c, + 0x19, 0xb6, 0x67, 0x04, 0x79, 0xdd, 0x9d, 0xdc, + 0x2f, 0x6c, 0xcc, 0x86, 0x36, 0xe3, 0xc0, 0x43, + 0xb5, 0x17, 0x62, 0xd5, 0xdb, 0x5e, 0xae, 0x32, + 0xbb, 0x2b, 0xac, 0xc0, 0xe6, 0x0d, 0xbc, 0x84, + 0x59, 0xc8, 0xf1, 0x34, 0x81, 0xc7, 0xc7, 0x1b, + 0xa5, 0xb8, 0x7b, 0x2a, 0xba, 0x9a, 0x10, 0x58, + 0x32, 0xfc, 0xc6, 0xc9, 0xfb, 0x4a, 0xeb, 0x96, + 0x16, 0x5b, 0xdb, 0x06, 0x39, 0xac, 0x24, 0x86, + 0xb4, 0xd0, 0x01, 0xc2, 0x54, 0x14, 0xc4, 0x19, + 0xa4, 0x2d, 0xd2, 0x0b, 0x89, 0x14, 0xed, 0xaf, + 0x1a, 0xfc, 0x28, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x0b, 0x75, 0xa7, 0xbd, 0xc1, 0xf6, 0xac, 0xfa, + 0xcb, 0x4a, 0xdd, 0x69, 0xef, 0x70, 0x7d, 0xab, + 0x3e, 0xb2, 0x0b, 0x86, 0x75, 0xef, 0x4d, 0xf3, + 0x07, 0x84, 0xae, 0x05, 0xdf, 0x9d, 0x7b, 0xd3, + 0x7c, 0xc1, 0xe1, 0x2b, 0x81, 0x07, 0xb8, 0x7f, + 0x6c, 0xcf, 0x39, 0xbe, 0x15, 0x2e, 0xa2, 0x21, + 0xfd, 0xb3, 0x3c, 0xe6, 0xf8, 0x54, 0xba, 0x02, + 0x8e, 0xcc, 0xfd, 0xea, 0xd3, 0xed, 0x3e, 0x50, + 0xa4, 0x54, 0x76, 0x67, 0xef, 0x56, 0x9f, 0x69, + 0xf2, 0x84, 0x0c, 0xb3, 0xde, 0xae, 0xfc, 0xf3, + 0xf5, 0x8a, 0x91, 0x51, 0xd9, 0x67, 0xbd, 0x5d, + 0xf9, 0xe7, 0xeb, 0x15, 0x22, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x83, 0x23, + 0x5a, 0x84, 0x3a, 0xcf, 0x6c, 0xa9, 0xb1, 0xad, + 0x42, 0x1d, 0x67, 0xb6, 0x50, 0x17, 0xb8, 0x1c, + 0xe6, 0x4d, 0x19, 0x69, 0x20, 0xe2, 0x02, 0xa3, + 0xb2, 0x68, 0xbc, 0x2f, 0x51, 0x7e, 0xd5, 0x9e, + 0x73, 0x7c, 0x21, 0x07, 0x66, 0x77, 0x71, 0x92, + 0x99, 0xdb, 0x65, 0x9a, 0x47, 0x5c, 0x4c, 0xc4, + 0xd9, 0x68, 0x74, 0x54, 0x91, 0xe5, 0x37, 0x48, + 0xd4, 0xa2, 0x8e, 0xcc, 0x64, 0x53, 0x9c, 0x76, + 0xd9, 0x86, 0x16, 0x9f, 0xcd, 0x2e, 0x63, 0xa9, + 0xc3, 0x43, 0xc2, 0xbc, 0xed, 0x97, 0xf3, 0x38, + 0xfe, 0xc8, 0x7d, 0x67, 0x28, 0x1a, 0x05, 0x68, + 0xb5, 0xa3, 0xc2, 0x54, 0xb6, 0x2a, 0x5b, 0xc6, + 0xba, 0xac, 0x1f, 0x08, 0x65, 0xbf, 0x79, 0x7d, + 0x4e, 0x34, 0xf8, 0x43, 0x2d, 0xfb, 0xcb, 0xea, + 0x71, 0xaa, 0xf5, 0x06, 0xf2, 0xcd, 0x06, 0xf2, + 0x9d, 0xf7, 0xe6, 0xa7, 0xa6, 0xc5, 0xd0, 0xb0, + 0x7c, 0x21, 0x96, 0xfd, 0xe5, 0xf5, 0x38, 0xd3, + 0xe1, 0x0c, 0xb7, 0xef, 0x2f, 0xa9, 0xc6, 0xab, + 0xf4, 0x1b, 0xc9, 0x41, 0xbc, 0x9b, 0xf2, 0x73, + 0x3d, 0x36, 0x1e, 0x85, 0x83, 0xe1, 0x0c, 0xb7, + 0xef, 0x2f, 0xa9, 0xc6, 0x9f, 0x08, 0x65, 0xbf, + 0x79, 0x7d, 0x4e, 0x35, 0x5f, 0xa0, 0xde, 0x4a, + 0x0d, 0xe4, 0xdf, 0x93, 0x99, 0xe9, 0xb0, 0xf4, + 0x2c, 0x1f, 0x08, 0x65, 0xbf, 0x79, 0x7d, 0x4e, + 0x34, 0xf8, 0x43, 0x2d, 0xfb, 0xcb, 0xea, 0x71, + 0xaa, 0xfd, 0x06, 0xf2, 0x50, 0x6f, 0x26, 0xfc, + 0x9c, 0xcf, 0x4d, 0x87, 0xa1, 0x60, 0xf8, 0x43, + 0x2d, 0xfb, 0xcb, 0xea, 0x71, 0xa7, 0xc2, 0x19, + 0x6f, 0xde, 0x5f, 0x53, 0x8d, 0x57, 0xe8, 0x37, + 0x97, 0x54, 0x79, 0x4e, 0x65, 0x2b, 0x1b, 0x24, + 0x76, 0xb2, 0xb9, 0x8e, 0x15, 0x6b, 0x83, 0x4d, + 0x08, 0x3b, 0xa3, 0x42, 0x6f, 0xc9, 0xcc, 0xf4, + 0xd8, 0x7a, 0x12, 0xdf, 0x08, 0x65, 0xbf, 0x79, + 0x7d, 0x4e, 0x34, 0xf8, 0x43, 0x2d, 0xfb, 0xcb, + 0xea, 0x71, 0xa8, 0x5b, 0x8b, 0x2b, 0xab, 0x6a, + 0x7b, 0x44, 0x0f, 0x8a, 0xba, 0x8b, 0xda, 0x45, + 0x78, 0x56, 0x8a, 0x04, 0xee, 0x64, 0xe6, 0x7a, + 0x6c, 0x3d, 0x0b, 0x0f, 0xc2, 0x19, 0x6f, 0xde, + 0x5f, 0x53, 0x8d, 0x3e, 0x10, 0xcb, 0x7e, 0xf2, + 0xfa, 0x9c, 0x6a, 0xbf, 0x41, 0xbc, 0xb1, 0x40, + 0x9b, 0xf2, 0x73, 0x3d, 0x36, 0x1e, 0x85, 0x87, + 0xe1, 0x0c, 0xb7, 0xef, 0x2f, 0xa9, 0xc6, 0x9f, + 0x08, 0x65, 0xbf, 0x79, 0x7d, 0x4e, 0x35, 0x5e, + 0xa0, 0xde, 0x0b, 0x6c, 0xf6, 0xb3, 0xdb, 0x96, + 0xb6, 0x78, 0xcc, 0x65, 0xe3, 0x13, 0x43, 0x85, + 0x2a, 0x37, 0xf4, 0xa6, 0xfc, 0x9c, 0xcf, 0x4d, + 0x87, 0xa1, 0x39, 0xf0, 0x86, 0x5b, 0xf7, 0x97, + 0xd4, 0xe3, 0x4f, 0x84, 0x32, 0xdf, 0xbc, 0xbe, + 0xa7, 0x1a, 0xaf, 0x50, 0x2e, 0xb8, 0xf2, 0x8c, + 0xca, 0x46, 0x35, 0xf1, 0xda, 0xca, 0xe6, 0xb8, + 0x55, 0xa4, 0x34, 0xd0, 0x83, 0xbb, 0xa9, 0x37, + 0xe4, 0xe6, 0x7a, 0x6c, 0x3d, 0x09, 0x6f, 0x84, + 0x32, 0xdf, 0xbc, 0xbe, 0xa7, 0x1a, 0x7c, 0x21, + 0x96, 0xfd, 0xe5, 0xf5, 0x38, 0xd4, 0x5f, 0x52, + 0x66, 0xbd, 0x12, 0x5e, 0x41, 0xe2, 0x5c, 0xef, + 0xb4, 0xb8, 0x8e, 0x26, 0x4d, 0x24, 0x45, 0xb1, + 0x48, 0x68, 0xc7, 0x11, 0x40, 0x48, 0xd7, 0x42, + 0x9b, 0xf2, 0x73, 0x3d, 0x36, 0x1e, 0x84, 0xe7, + 0xc2, 0x19, 0x6f, 0xde, 0x5f, 0x53, 0x8d, 0x3e, + 0x10, 0xcb, 0x7e, 0xf2, 0xfa, 0x9c, 0x6a, 0xbd, + 0x40, 0xb3, 0x41, 0xbc, 0x9b, 0xf2, 0x73, 0x3d, + 0x36, 0x1e, 0x85, 0x83, 0xe1, 0x0c, 0xb7, 0xef, + 0x2f, 0xa9, 0xc6, 0x9f, 0x08, 0x65, 0xbf, 0x79, + 0x7d, 0x4e, 0x35, 0x5f, 0xc2, 0x37, 0x93, 0x08, + 0x3b, 0x89, 0xdc, 0xc9, 0xcc, 0xf4, 0xd8, 0x7a, + 0x16, 0x0f, 0x84, 0x32, 0xdf, 0xbc, 0xbe, 0xa7, + 0x1a, 0x7c, 0x21, 0x96, 0xfd, 0xe5, 0xf5, 0x38, + 0xd5, 0x7e, 0x81, 0x28, 0x37, 0x93, 0x7e, 0x4e, + 0x67, 0xa6, 0xc3, 0xd0, 0xb0, 0x7c, 0x21, 0x96, + 0xfd, 0xe5, 0xf5, 0x38, 0xd3, 0xe1, 0x0c, 0xb7, + 0xef, 0x2f, 0xa9, 0xc6, 0xa0, 0x19, 0x19, 0x7b, + 0xda, 0xc6, 0x37, 0x13, 0xdc, 0x43, 0x5a, 0xd0, + 0x2a, 0x49, 0x3a, 0x80, 0x5d, 0x0d, 0xcb, 0x2f, + 0xdf, 0x2b, 0xe2, 0x65, 0xb4, 0x8e, 0x7c, 0x74, + 0xc6, 0xd0, 0xd2, 0x4b, 0x6b, 0xaa, 0xa9, 0xbf, + 0x27, 0x33, 0xd3, 0x61, 0xe8, 0x4b, 0xfc, 0x21, + 0x96, 0xfd, 0xe5, 0xf5, 0x38, 0xd3, 0xe1, 0x0c, + 0xb7, 0xef, 0x2f, 0xa9, 0xc6, 0xa2, 0xc6, 0x4b, + 0x9a, 0xf4, 0x49, 0x79, 0x07, 0x89, 0x68, 0xb8, + 0xb4, 0xb8, 0xb6, 0x78, 0x65, 0xc4, 0x2e, 0x89, + 0xce, 0xd2, 0x03, 0xc5, 0x09, 0x1d, 0xd4, 0xdf, + 0x93, 0x99, 0xe9, 0xb0, 0xf4, 0x26, 0xfe, 0x10, + 0xcb, 0x7e, 0xf2, 0xfa, 0x9c, 0x69, 0xf0, 0x86, + 0x5b, 0xf7, 0x97, 0xd4, 0xe3, 0x50, 0xb7, 0x16, + 0x37, 0x56, 0xad, 0x6b, 0xae, 0x21, 0x7c, 0x41, + 0xd5, 0x0d, 0xc6, 0x08, 0xad, 0x3b, 0x6b, 0x48, + 0x6d, 0x48, 0x68, 0x15, 0x71, 0x3a, 0x00, 0xd7, + 0x54, 0xdf, 0x93, 0x99, 0xe9, 0xb0, 0xf4, 0x2c, + 0x1f, 0x08, 0x65, 0xbf, 0x79, 0x7d, 0x4e, 0x34, + 0xf8, 0x43, 0x2d, 0xfb, 0xcb, 0xea, 0x71, 0xa8, + 0xc3, 0x91, 0x66, 0xcd, 0x67, 0x3a, 0x6d, 0x5e, + 0x00, 0xd3, 0xaa, 0xa7, 0x93, 0xad, 0x71, 0x61, + 0xdc, 0xa6, 0x9d, 0xdd, 0x09, 0xbe, 0xdc, 0xcf, + 0x4d, 0x87, 0xa1, 0x60, 0xf8, 0x43, 0x2d, 0xfb, + 0xcb, 0xea, 0x71, 0xa7, 0xc2, 0x19, 0x6f, 0xde, + 0x5f, 0x53, 0x8d, 0x57, 0xe8, 0x37, 0x92, 0x83, + 0x79, 0x37, 0xdf, 0x99, 0xe9, 0xb0, 0xf4, 0x2c, + 0x1f, 0x08, 0x65, 0xbf, 0x79, 0x7d, 0x4e, 0x34, + 0xf8, 0x43, 0x2d, 0xfb, 0xcb, 0xea, 0x71, 0xaa, + 0xfd, 0x06, 0xf2, 0x50, 0x6f, 0x26, 0xfc, 0x9c, + 0xcf, 0x4d, 0x87, 0xa1, 0x60, 0xf8, 0x43, 0x2d, + 0xfb, 0xcb, 0xea, 0x71, 0xa7, 0xc2, 0x19, 0x6f, + 0xde, 0x5f, 0x53, 0x8d, 0x57, 0xe8, 0x37, 0x92, + 0x83, 0x79, 0x37, 0xe4, 0xe6, 0x7a, 0x6c, 0x3d, + 0x0b, 0x07, 0xc2, 0x19, 0x6f, 0xde, 0x5f, 0x53, + 0x8d, 0x3e, 0x10, 0xcb, 0x7e, 0xf2, 0xfa, 0x9c, + 0x6a, 0xbf, 0x41, 0xbc, 0xb1, 0x41, 0xbc, 0x9d, + 0xcb, 0xfb, 0x67, 0x43, 0xd3, 0xe1, 0xe8, 0x58, + 0x46, 0xca, 0xe4, 0xb1, 0x78, 0xd3, 0x66, 0x5a, + 0x3c, 0xe6, 0x05, 0xdf, 0x94, 0xcb, 0xb3, 0xd6, + 0xb7, 0x71, 0xd9, 0x65, 0xcc, 0xc7, 0x2c, 0x95, + 0x0e, 0x9a, 0x95, 0xd4, 0x0b, 0xb4, 0xbd, 0xdf, + 0x22, 0xa8, 0x50, 0x29, 0x4d, 0x9a, 0xfe, 0x77, + 0x6d, 0xfd, 0xaf, 0xa8, 0x54, 0x4d, 0xa6, 0x7c, + 0x67, 0x55, 0xab, 0x8b, 0x1d, 0x7e, 0xda, 0xe8, + 0x9b, 0xcc, 0x1c, 0xf7, 0x5e, 0x48, 0x1c, 0x6a, + 0x1a, 0x68, 0xd1, 0xbc, 0xb9, 0xd7, 0x46, 0x61, + 0xef, 0xb2, 0xf9, 0xdf, 0x20, 0x5c, 0xea, 0xae, + 0x9c, 0x7d, 0xa2, 0xc7, 0xe5, 0xde, 0x2b, 0x28, + 0x82, 0x43, 0x35, 0xb9, 0xcb, 0x20, 0xb4, 0xb5, + 0xeb, 0x08, 0x0d, 0xc3, 0x5c, 0x06, 0x00, 0x00, + 0x34, 0x38, 0x74, 0xeb, 0x21, 0x45, 0xf5, 0x9e, + 0xca, 0x74, 0x07, 0x72, 0x07, 0xa4, 0xb6, 0x6d, + 0x67, 0xb8, 0x58, 0xff, 0x00, 0x6b, 0xea, 0x85, + 0x58, 0x41, 0x63, 0xeb, 0x3d, 0x94, 0xfb, 0xbd, + 0xdc, 0x81, 0xe9, 0x27, 0x59, 0xec, 0xa7, 0xdd, + 0xee, 0xe4, 0x0f, 0x49, 0x57, 0x11, 0x05, 0x8f, + 0xac, 0xf6, 0x53, 0xee, 0xf7, 0x72, 0x07, 0xa4, + 0x9d, 0x67, 0xb2, 0x9f, 0x77, 0xbb, 0x90, 0x3d, + 0x25, 0x5c, 0x44, 0x16, 0x3e, 0xb3, 0xd9, 0x4f, + 0xbb, 0xdd, 0xc8, 0x1e, 0x92, 0x75, 0x9e, 0xca, + 0x7d, 0xde, 0xee, 0x40, 0xf4, 0x95, 0x71, 0x10, + 0x58, 0xfa, 0xcf, 0x65, 0x3e, 0xef, 0x77, 0x20, + 0x7a, 0x49, 0xd6, 0x7b, 0x29, 0xf7, 0x7b, 0xb9, + 0x03, 0xd2, 0x55, 0xc5, 0x9a, 0x3b, 0x0e, 0x2a, + 0x1c, 0x3a, 0xeb, 0x4d, 0x08, 0x2c, 0x5d, 0x67, + 0xb2, 0x9f, 0x77, 0xbb, 0x90, 0x3d, 0x24, 0xeb, + 0x3d, 0x94, 0xfb, 0xbd, 0xdc, 0x81, 0xe9, 0x2a, + 0xe6, 0xbd, 0x5b, 0xa8, 0x82, 0xc7, 0xd6, 0x7b, + 0x29, 0xf7, 0x7b, 0xb9, 0x03, 0xd2, 0x4e, 0xb3, + 0xd9, 0x4f, 0xbb, 0xdd, 0xc8, 0x1e, 0x92, 0xae, + 0x2c, 0x96, 0xb9, 0xb4, 0xc4, 0x08, 0xae, 0xaa, + 0x8a, 0x55, 0x05, 0x8b, 0xac, 0xf6, 0x53, 0xee, + 0xf7, 0x72, 0x07, 0xa4, 0x9d, 0x67, 0xb2, 0x9f, + 0x77, 0xbb, 0x90, 0x3d, 0x25, 0x5d, 0x0d, 0x71, + 0x69, 0x70, 0x04, 0xb5, 0xbe, 0x53, 0xa9, 0xa0, + 0x76, 0xd0, 0x35, 0xc4, 0xe1, 0x00, 0x93, 0xbc, + 0x05, 0x4a, 0x0b, 0x17, 0x59, 0xec, 0xa7, 0xdd, + 0xee, 0xe4, 0x0f, 0x49, 0x3a, 0xcf, 0x65, 0x3e, + 0xef, 0x77, 0x20, 0x7a, 0x4a, 0xb9, 0x42, 0x88, + 0x2c, 0x7d, 0x67, 0xb2, 0x9f, 0x77, 0xbb, 0x90, + 0x3d, 0x24, 0xeb, 0x3d, 0x94, 0xfb, 0xbd, 0xdc, + 0x81, 0xe9, 0x2a, 0xe2, 0x20, 0xb1, 0xf5, 0x9e, + 0xca, 0x7d, 0xde, 0xee, 0x40, 0xf4, 0x93, 0xac, + 0xf6, 0x53, 0xee, 0xf7, 0x72, 0x07, 0xa4, 0xab, + 0x8b, 0x2e, 0x6b, 0x9a, 0x68, 0xe0, 0x5a, 0x77, + 0x8e, 0x84, 0x16, 0x2e, 0xb3, 0xd9, 0x4f, 0xbb, + 0xdd, 0xc8, 0x1e, 0x92, 0x75, 0x9e, 0xca, 0x7d, + 0xde, 0xee, 0x40, 0xf4, 0x95, 0x71, 0x10, 0x58, + 0xfa, 0xcf, 0x65, 0x3e, 0xef, 0x77, 0x20, 0x7a, + 0x49, 0xd6, 0x7b, 0x29, 0xf7, 0x7b, 0xb9, 0x03, + 0xd2, 0x55, 0xd2, 0xd7, 0x0a, 0x54, 0x11, 0x5d, + 0x22, 0xba, 0x2a, 0xb0, 0x82, 0xc7, 0xd6, 0x7b, + 0x29, 0xf7, 0x7b, 0xb9, 0x03, 0xd2, 0x4e, 0xb3, + 0xd9, 0x4f, 0xbb, 0xdd, 0xc8, 0x1e, 0x92, 0xae, + 0x22, 0x0b, 0x1f, 0x59, 0xec, 0xa7, 0xdd, 0xee, + 0xe4, 0x0f, 0x49, 0x3a, 0xcf, 0x65, 0x3e, 0xef, + 0x77, 0x20, 0x7a, 0x4a, 0xb8, 0xbd, 0x08, 0xe4, + 0x76, 0x96, 0xb5, 0xc4, 0x76, 0x01, 0x28, 0x2c, + 0x3d, 0x67, 0xb2, 0x9f, 0x77, 0xbb, 0x90, 0x3d, + 0x24, 0xeb, 0x3d, 0x94, 0xfb, 0xbd, 0xdc, 0x81, + 0xe9, 0x2a, 0xff, 0x00, 0x33, 0x36, 0xbe, 0x6d, + 0xdc, 0x92, 0xb0, 0x58, 0xf1, 0x5a, 0xb4, 0x8c, + 0x3a, 0xf4, 0x1d, 0x1d, 0xb4, 0x16, 0x1e, 0xb3, + 0xd9, 0x4f, 0xbb, 0xdd, 0xc8, 0x1e, 0x92, 0x75, + 0x9e, 0xca, 0x7d, 0xde, 0xee, 0x40, 0xf4, 0x95, + 0x71, 0x10, 0x58, 0xfa, 0xcf, 0x65, 0x3e, 0xef, + 0x77, 0x20, 0x7a, 0x49, 0xd6, 0x7b, 0x29, 0xf7, + 0x7b, 0xb9, 0x03, 0xd2, 0x55, 0xc4, 0x41, 0x63, + 0xeb, 0x3d, 0x94, 0xfb, 0xbd, 0xdc, 0x81, 0xe9, + 0x27, 0x59, 0xec, 0xa7, 0xdd, 0xee, 0xe4, 0x0f, + 0x49, 0x57, 0x11, 0x05, 0x8f, 0xac, 0xf6, 0x53, + 0xee, 0xf7, 0x72, 0x07, 0xa4, 0x9d, 0x67, 0xb2, + 0x9f, 0x77, 0xbb, 0x90, 0x3d, 0x25, 0x5c, 0x44, + 0x16, 0x3e, 0xb3, 0xd9, 0x4f, 0xbb, 0xdd, 0xc8, + 0x1e, 0x92, 0x75, 0x9e, 0xca, 0x7d, 0xde, 0xee, + 0x40, 0xf4, 0x95, 0x71, 0x10, 0x58, 0xfa, 0xcf, + 0x65, 0x3e, 0xef, 0x77, 0x20, 0x7a, 0x49, 0xd6, + 0x7b, 0x29, 0xf7, 0x7b, 0xb9, 0x03, 0xd2, 0x55, + 0xc4, 0x41, 0x63, 0xeb, 0x3d, 0x94, 0xfb, 0xbd, + 0xdc, 0x81, 0xe9, 0x2f, 0x70, 0xe6, 0x5b, 0x2e, + 0xe9, 0xa3, 0x6c, 0x76, 0x0e, 0x0f, 0x2f, 0x68, + 0x69, 0xc2, 0x05, 0x1c, 0x4e, 0x8f, 0xce, 0x55, + 0x95, 0xba, 0xd3, 0xde, 0xe0, 0xfb, 0x56, 0x7d, + 0x64, 0x16, 0xfc, 0xe7, 0xde, 0x5b, 0xe6, 0x0f, + 0x09, 0x5c, 0x2b, 0xbf, 0x3a, 0xf7, 0xa6, 0xf9, + 0x83, 0xc2, 0x57, 0x02, 0x0f, 0x70, 0xfe, 0xd9, + 0x9e, 0x73, 0x7c, 0x2a, 0x5d, 0x44, 0x43, 0xfb, + 0x66, 0x79, 0xcd, 0xf0, 0xa9, 0x74, 0x05, 0x1d, + 0x99, 0xfb, 0xd5, 0xa7, 0xda, 0x7c, 0xa1, 0x48, + 0xa8, 0xec, 0xcf, 0xde, 0xad, 0x3e, 0xd3, 0xe5, + 0x08, 0x19, 0x67, 0xbd, 0x5d, 0xf9, 0xe7, 0xeb, + 0x15, 0x22, 0xa3, 0xb2, 0xcf, 0x7a, 0xbb, 0xf3, + 0xcf, 0xd6, 0x2a, 0x45, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x06, 0x46, 0xb5, + 0x08, 0x75, 0x9e, 0xd9, 0x53, 0x63, 0x5a, 0x84, + 0x3a, 0xcf, 0x6c, 0xa0, 0x2f, 0x51, 0x7e, 0xd5, + 0x9e, 0x73, 0x7c, 0x21, 0x79, 0x5e, 0xa1, 0xfd, + 0xac, 0x7e, 0x73, 0x7c, 0x21, 0x07, 0x26, 0xd9, + 0x7f, 0x33, 0x8f, 0xec, 0x47, 0xd6, 0x72, 0x81, + 0x53, 0xdb, 0x65, 0xfc, 0xce, 0x3f, 0xb1, 0x1f, + 0x59, 0xca, 0x05, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x58, 0xf3, + 0x5b, 0xbb, 0xbb, 0x6c, 0x9b, 0x2b, 0x36, 0xd2, + 0xba, 0x22, 0xf8, 0xc0, 0x71, 0x6e, 0x83, 0xe4, + 0x85, 0x5c, 0x56, 0x9b, 0xd9, 0xb2, 0xe8, 0xb2, + 0x8c, 0xb7, 0xdb, 0xe0, 0x75, 0xc0, 0x31, 0x8c, + 0x01, 0xae, 0xc3, 0x43, 0x84, 0x20, 0xd7, 0x95, + 0xdd, 0xcf, 0x99, 0x64, 0xf9, 0x84, 0x57, 0xae, + 0xe7, 0x44, 0x2c, 0x25, 0x8f, 0x75, 0x2b, 0x5c, + 0x25, 0xc3, 0x4a, 0x87, 0xcb, 0xb2, 0x99, 0xef, + 0xa3, 0x7c, 0xc1, 0xec, 0x86, 0x08, 0xbc, 0xb9, + 0xe4, 0x34, 0x01, 0x4d, 0x49, 0x25, 0xbd, 0xde, + 0x41, 0x70, 0x32, 0x86, 0xfb, 0x34, 0x71, 0x1a, + 0xdc, 0x42, 0x45, 0x5c, 0xe1, 0xbb, 0xe3, 0x57, + 0x78, 0x2c, 0x45, 0x69, 0x04, 0xdb, 0x31, 0x6d, + 0x13, 0xee, 0x19, 0x68, 0xd9, 0xa4, 0x2f, 0x7b, + 0xdf, 0xa8, 0x90, 0xe7, 0x0a, 0x6e, 0x6f, 0x20, + 0x88, 0xcc, 0x32, 0x79, 0xac, 0xa1, 0x6d, 0xcb, + 0x65, 0x65, 0xc5, 0xb3, 0xf4, 0x73, 0xb1, 0x1a, + 0x8a, 0xf6, 0x56, 0xcb, 0x5c, 0x8a, 0x59, 0x6d, + 0x59, 0x77, 0x71, 0x3c, 0x56, 0x90, 0xc9, 0xe4, + 0x19, 0x1d, 0x4c, 0x4b, 0xb9, 0xcc, 0xb0, 0xb4, + 0xc8, 0xaf, 0x2d, 0x3d, 0xb6, 0x1b, 0x99, 0x24, + 0x21, 0xf1, 0xb5, 0x87, 0x74, 0x11, 0xd9, 0x2b, + 0x4b, 0xad, 0x33, 0x2c, 0xc6, 0xd2, 0xda, 0x5b, + 0xc9, 0x22, 0xb4, 0xb5, 0x81, 0xb8, 0x62, 0x92, + 0x4f, 0x17, 0xc5, 0xd5, 0x50, 0xd1, 0xac, 0xe8, + 0x41, 0xc3, 0x99, 0x65, 0x53, 0xe5, 0xc5, 0x85, + 0xee, 0x6c, 0x91, 0x4b, 0xa6, 0x29, 0x63, 0xd2, + 0xd2, 0x17, 0x7e, 0xd6, 0x7b, 0xd5, 0xaf, 0xd8, + 0x37, 0xc2, 0xbd, 0xe7, 0xb1, 0xc3, 0x1e, 0x49, + 0x96, 0xb2, 0x09, 0x39, 0xe8, 0x9a, 0xe7, 0x06, + 0xc8, 0x7f, 0x3b, 0x41, 0xd2, 0x9b, 0x4b, 0x1f, + 0x3b, 0x98, 0x59, 0x44, 0x5e, 0x23, 0x0f, 0x85, + 0xa0, 0xbd, 0xd5, 0xa0, 0x15, 0x41, 0x01, 0xf2, + 0x6f, 0x6f, 0x9d, 0x0a, 0x4b, 0x2d, 0xcd, 0x33, + 0x21, 0x75, 0x6b, 0x6e, 0xdb, 0xa7, 0xf3, 0x3c, + 0xe3, 0x23, 0xc1, 0xa2, 0x98, 0x71, 0x06, 0xd1, + 0x6f, 0x9b, 0x67, 0xe1, 0x8e, 0x37, 0xc8, 0xdc, + 0xc6, 0x07, 0xe0, 0x69, 0x76, 0x16, 0xe8, 0x26, + 0x9b, 0x9e, 0x52, 0x8e, 0xcb, 0x4d, 0x73, 0x0b, + 0x43, 0xfe, 0x3c, 0x5f, 0x5d, 0xa8, 0x26, 0x36, + 0x83, 0x35, 0xcc, 0xad, 0xb3, 0x59, 0x61, 0xb7, + 0xb8, 0x7c, 0x71, 0xb4, 0x36, 0x8c, 0x14, 0xa6, + 0x91, 0x53, 0xb8, 0xb8, 0x6f, 0x19, 0x7f, 0xd4, + 0xf6, 0x92, 0x4d, 0x2b, 0x5d, 0x68, 0xe7, 0x3b, + 0x99, 0x60, 0xd0, 0xf6, 0xba, 0xae, 0xc4, 0x49, + 0xa2, 0xf7, 0xb5, 0x1f, 0xce, 0xa6, 0xed, 0x37, + 0xea, 0xad, 0xd9, 0x8f, 0xfa, 0x67, 0x2d, 0xf3, + 0xdf, 0xe1, 0x72, 0x0d, 0x5f, 0x0e, 0x5d, 0x00, + 0xc9, 0x26, 0x9e, 0x18, 0xa1, 0x91, 0x81, 0xe2, + 0x57, 0x3a, 0x8d, 0x07, 0xe6, 0x8d, 0x1a, 0x4a, + 0xf4, 0xfd, 0x9a, 0xbb, 0x8e, 0x70, 0xd9, 0x25, + 0x8d, 0xb6, 0xf8, 0x71, 0x1b, 0x97, 0x1a, 0x33, + 0x4e, 0xe7, 0x6d, 0x6c, 0xda, 0x67, 0x38, 0xc7, + 0x96, 0x30, 0xf9, 0x1c, 0xc0, 0x71, 0x6e, 0xe5, + 0x7c, 0x5d, 0xc5, 0x9c, 0xed, 0xef, 0x39, 0x16, + 0x54, 0x1c, 0x6a, 0x0b, 0x49, 0x70, 0x3a, 0x8d, + 0x1b, 0x4d, 0x28, 0x38, 0x73, 0x3c, 0xa2, 0x7c, + 0xb8, 0x46, 0xf7, 0xbd, 0x92, 0xc3, 0x35, 0x43, + 0x25, 0x8f, 0x51, 0x23, 0x71, 0x6d, 0xb5, 0xc8, + 0xa4, 0x96, 0xd9, 0x97, 0x57, 0x13, 0xc5, 0x69, + 0x1c, 0xbf, 0xb2, 0x12, 0x1a, 0x17, 0x76, 0x97, + 0x45, 0xee, 0x9d, 0x95, 0xb2, 0xae, 0x9a, 0x48, + 0x5a, 0x3b, 0x5a, 0x57, 0x7e, 0x7f, 0x96, 0xdb, + 0x4f, 0x71, 0x03, 0x25, 0xbe, 0x8a, 0xd4, 0x43, + 0x18, 0x6b, 0x22, 0x90, 0x57, 0x46, 0xeb, 0xa9, + 0x50, 0x82, 0xbd, 0x98, 0xe5, 0xd3, 0xe5, 0xd3, + 0x88, 0x66, 0xa1, 0x04, 0x62, 0x63, 0xdb, 0xe4, + 0xb8, 0x6f, 0x85, 0xca, 0xa6, 0xf3, 0xf9, 0x2d, + 0x7a, 0xb6, 0xc6, 0x08, 0xae, 0x19, 0x73, 0x25, + 0xbe, 0x26, 0x3d, 0xec, 0x35, 0xd1, 0x4d, 0x1b, + 0xea, 0x13, 0x77, 0xb6, 0x7c, 0x28, 0x3a, 0x72, + 0xbf, 0xe6, 0x76, 0x9f, 0x6f, 0x1f, 0xd6, 0x0a, + 0x4b, 0x3c, 0xbe, 0xbc, 0xb4, 0xce, 0xae, 0x8d, + 0xac, 0xce, 0x8b, 0x16, 0x0c, 0x58, 0x75, 0x1a, + 0x35, 0x46, 0xe5, 0x9f, 0xcc, 0xec, 0xfe, 0xde, + 0x3f, 0xae, 0x17, 0x5e, 0xd3, 0x7f, 0x3a, 0xb8, + 0xed, 0x37, 0xea, 0x84, 0x12, 0x53, 0xe6, 0x37, + 0xcc, 0xd9, 0x98, 0x2e, 0xc5, 0xc3, 0xc4, 0xe6, + 0x6c, 0x2e, 0x97, 0x46, 0x22, 0x2a, 0xed, 0x07, + 0x81, 0x45, 0xe5, 0xef, 0xb9, 0xcd, 0x73, 0x6b, + 0x56, 0x5d, 0x48, 0xe9, 0xf0, 0x9a, 0xb8, 0xbe, + 0x84, 0xe1, 0x6f, 0x8c, 0xe1, 0xa3, 0x7d, 0x76, + 0x5c, 0xff, 0x00, 0xa4, 0x6d, 0xbe, 0xdf, 0x4f, + 0x0b, 0xd6, 0x76, 0x4e, 0xde, 0x4a, 0xdd, 0xde, + 0x31, 0x98, 0x9f, 0x14, 0x5c, 0xdc, 0x4d, 0xdd, + 0x2f, 0x3e, 0x31, 0xf0, 0x04, 0x1d, 0x99, 0xcc, + 0xec, 0xcc, 0xb2, 0xab, 0xa9, 0x1a, 0x3c, 0x6b, + 0x0b, 0x8a, 0x0a, 0x6f, 0x34, 0xe1, 0x3c, 0x2a, + 0x3f, 0x66, 0x21, 0x60, 0x96, 0xea, 0xf9, 0xe2, + 0xbe, 0xc7, 0x11, 0x2d, 0xae, 0xac, 0x54, 0x27, + 0xe4, 0x5d, 0xb9, 0x06, 0x5b, 0x98, 0x46, 0xcb, + 0xdb, 0x6b, 0xc8, 0x5d, 0x1c, 0x57, 0x71, 0x9a, + 0xb8, 0xd3, 0x43, 0x8f, 0x8a, 0x78, 0x41, 0x5c, + 0xd9, 0x10, 0x2d, 0xcb, 0x33, 0x76, 0x11, 0x47, + 0xb6, 0x37, 0x02, 0x37, 0x6a, 0x1a, 0xee, 0x24, + 0x1c, 0x36, 0xf9, 0xde, 0x62, 0xdb, 0xe6, 0xdd, + 0x3e, 0x77, 0x96, 0x97, 0x0c, 0x6c, 0xad, 0x5b, + 0x84, 0xe9, 0x20, 0x37, 0xb0, 0xbc, 0xe7, 0x73, + 0x59, 0xdc, 0x66, 0x0f, 0x9e, 0xce, 0xbc, 0xd4, + 0x80, 0x39, 0xda, 0x08, 0xf1, 0xf7, 0x75, 0xa6, + 0x5c, 0x32, 0x6e, 0x6d, 0xc3, 0x30, 0x13, 0x19, + 0x71, 0x78, 0xbc, 0xd9, 0x14, 0xa5, 0x3b, 0x24, + 0x2f, 0x59, 0xfe, 0x5f, 0x6f, 0x97, 0x5f, 0x08, + 0x2d, 0xf1, 0x73, 0x7c, 0xd8, 0x71, 0xc4, 0x6a, + 0x6a, 0x50, 0x47, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x29, 0x4d, 0x9a, + 0xfe, 0x77, 0x6d, 0xfd, 0xaf, 0xa8, 0x54, 0x5a, + 0x94, 0xd9, 0xa3, 0xfe, 0x77, 0x6d, 0xfd, 0xaf, + 0xa8, 0x50, 0x4d, 0xe6, 0x1e, 0xfb, 0x37, 0x9d, + 0xf2, 0x05, 0xce, 0xba, 0x33, 0x0f, 0x7d, 0x9b, + 0xce, 0xf9, 0x02, 0xe7, 0x40, 0x44, 0x44, 0x0d, + 0xac, 0xf7, 0x0b, 0x1f, 0xed, 0x7d, 0x50, 0xab, + 0x0a, 0xcf, 0xb5, 0x9e, 0xe1, 0x63, 0xfd, 0xaf, + 0xaa, 0x15, 0x61, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x77, 0x64, 0x76, 0x91, 0x5d, + 0xe6, 0x71, 0x45, 0x36, 0x88, 0x85, 0x5c, 0xfa, + 0x9a, 0x56, 0x9a, 0x69, 0xde, 0x52, 0x6f, 0xda, + 0x49, 0x59, 0x98, 0x73, 0x0c, 0x8a, 0x31, 0x64, + 0x24, 0x11, 0xf3, 0x58, 0x45, 0x4b, 0x6b, 0x82, + 0xb5, 0x55, 0xd3, 0xe0, 0xd2, 0xa6, 0x72, 0x7c, + 0xa9, 0xa1, 0xa3, 0x32, 0xbe, 0x3c, 0xcd, 0x94, + 0x3e, 0x33, 0x6b, 0xad, 0xe4, 0x69, 0xd1, 0xdd, + 0x41, 0xeb, 0x37, 0xc9, 0x1e, 0x73, 0x87, 0xdb, + 0x58, 0x46, 0x0e, 0x36, 0x73, 0xa2, 0x3a, 0x86, + 0xd3, 0xb5, 0x88, 0x85, 0x19, 0x6f, 0x65, 0x75, + 0x73, 0x71, 0xec, 0xd0, 0x46, 0x5d, 0x35, 0x5c, + 0x30, 0x68, 0x14, 0xc3, 0xe5, 0x56, 0xba, 0xa8, + 0xba, 0xae, 0xb3, 0x99, 0xa5, 0xcd, 0xfa, 0xca, + 0x31, 0x87, 0x09, 0x6f, 0x36, 0xdf, 0xea, 0x37, + 0x73, 0xba, 0xa7, 0x6f, 0x4d, 0xae, 0x5f, 0x6f, + 0x71, 0x9c, 0x5b, 0x03, 0xcf, 0x66, 0x0d, 0x63, + 0x62, 0x14, 0xa6, 0x12, 0xf1, 0x57, 0x1e, 0xee, + 0xb2, 0x82, 0xa7, 0x34, 0x6f, 0x86, 0x47, 0xc3, + 0x26, 0x87, 0xb0, 0xe1, 0x75, 0x0d, 0x40, 0x3d, + 0xb6, 0x95, 0x35, 0x99, 0x9f, 0x68, 0xd9, 0xdc, + 0xbe, 0xe4, 0x54, 0x98, 0x8b, 0xa1, 0x77, 0x01, + 0x1f, 0xdd, 0x50, 0x9a, 0xeb, 0x5d, 0x75, 0x38, + 0xbb, 0x67, 0x75, 0x4d, 0x59, 0x93, 0x3e, 0xcb, + 0x5e, 0xc5, 0xad, 0xd6, 0xcf, 0x12, 0xb4, 0x6f, + 0x0d, 0x7f, 0x21, 0x41, 0x29, 0x93, 0x42, 0xd1, + 0xb3, 0xc2, 0xd9, 0xda, 0x5f, 0x74, 0xc9, 0x9e, + 0xd1, 0xbe, 0x06, 0x81, 0xf2, 0x28, 0xbd, 0x93, + 0x66, 0x1b, 0xb9, 0xee, 0x4d, 0x40, 0xb7, 0x85, + 0xce, 0xec, 0x57, 0x55, 0x14, 0x8b, 0x25, 0x16, + 0xb9, 0xa6, 0x4f, 0x67, 0x5f, 0x15, 0x96, 0xf8, + 0x48, 0xec, 0xc8, 0xda, 0x7f, 0x75, 0x72, 0x43, + 0x11, 0xb1, 0xca, 0xb3, 0x87, 0x1a, 0x82, 0xe9, + 0x79, 0x86, 0xf6, 0x28, 0x77, 0x39, 0x48, 0x23, + 0x6c, 0xf2, 0x9b, 0xfc, 0xcc, 0x3e, 0xea, 0x26, + 0x80, 0xc7, 0x38, 0x93, 0x23, 0xc8, 0x68, 0xa9, + 0xd3, 0x4d, 0x6b, 0xcd, 0xee, 0x51, 0x7f, 0x67, + 0x24, 0x6c, 0x99, 0x9a, 0x26, 0x76, 0x18, 0xdc, + 0xd2, 0x0b, 0x49, 0xed, 0xf1, 0xae, 0xb8, 0x86, + 0x65, 0x9a, 0x65, 0xb0, 0x59, 0x5b, 0xdb, 0xe1, + 0xb5, 0x80, 0x9c, 0x52, 0xd7, 0x0b, 0x4e, 0x8a, + 0xe9, 0x24, 0x85, 0xd5, 0x99, 0xdb, 0xba, 0xdb, + 0x66, 0xa0, 0x89, 0xf2, 0x09, 0x9f, 0x1c, 0xd4, + 0xc6, 0xd3, 0x50, 0x2b, 0x8b, 0x40, 0x3d, 0x84, + 0x1b, 0x6e, 0xb2, 0x4b, 0xd3, 0x91, 0x5a, 0xdb, + 0xb2, 0x16, 0xfb, 0x4c, 0x52, 0x17, 0x48, 0x31, + 0x30, 0x1c, 0x3e, 0x37, 0xe7, 0x6a, 0x3b, 0x8a, + 0x16, 0xcb, 0x28, 0xbe, 0xbe, 0x0e, 0x74, 0x2c, + 0x02, 0x36, 0x1a, 0x3a, 0x57, 0x9c, 0x2d, 0xaf, + 0x6d, 0x48, 0x5e, 0x3e, 0x4f, 0x85, 0xac, 0x9d, + 0x8d, 0xc0, 0x99, 0x9c, 0x0b, 0xaa, 0x6a, 0x7c, + 0xbd, 0xde, 0xe2, 0x66, 0xd5, 0xb7, 0xc8, 0x72, + 0xdb, 0x68, 0xce, 0x16, 0xcc, 0xde, 0x72, 0x4a, + 0x6e, 0x9a, 0x57, 0x4f, 0x29, 0x04, 0x65, 0xee, + 0x5b, 0x7b, 0x61, 0x23, 0x1b, 0x72, 0xc0, 0xdc, + 0x54, 0x2c, 0x73, 0x7c, 0x60, 0x74, 0xee, 0x15, + 0x3b, 0x9f, 0x65, 0x57, 0xb9, 0x86, 0x61, 0x17, + 0x30, 0xc1, 0x81, 0x90, 0x30, 0x3a, 0x47, 0x10, + 0x1b, 0xa4, 0xbb, 0x74, 0xd2, 0xa7, 0x42, 0x85, + 0x93, 0x32, 0x92, 0x5c, 0xba, 0x2c, 0xbd, 0xec, + 0x0e, 0x6c, 0x2f, 0xc4, 0xc9, 0x49, 0x38, 0xbb, + 0x5b, 0xca, 0x4b, 0x6b, 0x67, 0x9b, 0xda, 0xad, + 0xe1, 0x0f, 0x21, 0x8d, 0x85, 0x8f, 0x0d, 0x04, + 0x81, 0x88, 0x97, 0x0a, 0xf7, 0x28, 0x82, 0x22, + 0xfa, 0xc2, 0xee, 0xc2, 0x51, 0x0d, 0xd3, 0x30, + 0xb8, 0x8a, 0xb6, 0x86, 0xad, 0x23, 0x56, 0x85, + 0xd5, 0x1e, 0xce, 0xe6, 0xb2, 0xdb, 0x8b, 0x86, + 0xc6, 0x00, 0x23, 0x13, 0x5a, 0xe7, 0x00, 0xe2, + 0x3b, 0x02, 0xaa, 0x47, 0x31, 0x61, 0xb9, 0x83, + 0x22, 0xe7, 0x4e, 0x27, 0x48, 0x1a, 0x1c, 0xe3, + 0xac, 0xd4, 0x30, 0x9a, 0xae, 0x5d, 0xa6, 0xba, + 0x98, 0x67, 0x2f, 0xc0, 0xf7, 0x33, 0xd9, 0xc3, + 0x44, 0x74, 0x24, 0x01, 0x40, 0x1c, 0x50, 0x6c, + 0xda, 0x60, 0x43, 0x32, 0xe0, 0x41, 0xc4, 0x21, + 0xd2, 0x0e, 0xba, 0xf8, 0xa3, 0x52, 0xe6, 0x8b, + 0x66, 0xb3, 0x59, 0x22, 0x6c, 0x81, 0x81, 0xa5, + 0xc2, 0xac, 0x63, 0x9c, 0x03, 0xc8, 0xed, 0x57, + 0x42, 0x97, 0xbf, 0x6f, 0xb6, 0x66, 0x99, 0x33, + 0xa5, 0x18, 0x84, 0x8c, 0xc6, 0xf1, 0xc9, 0x77, + 0x85, 0x43, 0x67, 0x77, 0x73, 0x75, 0xdc, 0xd3, + 0xb4, 0x90, 0xeb, 0x79, 0x28, 0xc3, 0xbc, 0x23, + 0x3b, 0x88, 0x38, 0x5d, 0x04, 0xcd, 0x98, 0xc0, + 0xe6, 0x11, 0x30, 0x76, 0x0e, 0x6f, 0xf3, 0xb1, + 0x6f, 0x2e, 0xf9, 0x76, 0x73, 0x36, 0x8a, 0x21, + 0x21, 0x88, 0x1d, 0x55, 0x6b, 0x5c, 0x31, 0x0a, + 0xe8, 0x18, 0x85, 0x54, 0xfb, 0xed, 0x98, 0xfd, + 0xa7, 0xb6, 0x9c, 0x81, 0xe3, 0x5b, 0xf3, 0x84, + 0x53, 0x5b, 0x85, 0x46, 0x2e, 0xf8, 0xe0, 0x50, + 0x16, 0xb9, 0x85, 0xcf, 0x5e, 0xb6, 0xe7, 0x19, + 0xc5, 0x24, 0xc5, 0xaf, 0x15, 0x34, 0x2d, 0x2e, + 0xc3, 0x4a, 0x20, 0xe1, 0xb9, 0xb6, 0x9e, 0xd2, + 0x77, 0x5b, 0xce, 0xdc, 0x12, 0xb2, 0x98, 0x9b, + 0x50, 0x69, 0x51, 0x5d, 0x62, 0xab, 0xaa, 0xcb, + 0x3d, 0xcc, 0xac, 0x20, 0xe6, 0x2d, 0x9e, 0xd6, + 0xb2, 0xa4, 0xd1, 0xcd, 0x0e, 0xd2, 0x56, 0xcd, + 0xa6, 0xd1, 0x9d, 0xdc, 0x0f, 0x34, 0x7d, 0x06, + 0x95, 0x18, 0x75, 0x20, 0xb6, 0x67, 0x79, 0xde, + 0x63, 0x67, 0x0d, 0x93, 0xe0, 0x7b, 0x41, 0x9e, + 0x22, 0xf9, 0x2a, 0xd0, 0x6a, 0x68, 0xda, 0x53, + 0x7b, 0x5a, 0x8b, 0xf6, 0xec, 0xda, 0xeb, 0x2e, + 0xbd, 0x94, 0xb1, 0x8f, 0x82, 0x57, 0x34, 0xdc, + 0x48, 0x3c, 0x52, 0x08, 0x00, 0x51, 0xad, 0xaf, + 0xc8, 0xb7, 0x6d, 0x37, 0xbb, 0xe5, 0x7f, 0x60, + 0x7c, 0x0c, 0x5e, 0x72, 0xff, 0x00, 0xf4, 0xce, + 0x61, 0xe7, 0xb7, 0xe4, 0x41, 0xc1, 0x6f, 0x93, + 0xe6, 0x37, 0x30, 0xc7, 0x34, 0x10, 0xf3, 0x8c, + 0x94, 0x96, 0xb0, 0xe2, 0x14, 0xd1, 0xbf, 0xbd, + 0x4e, 0xca, 0xd9, 0x71, 0xb3, 0xf9, 0xa4, 0x2f, + 0x89, 0xa6, 0x2e, 0x73, 0x9e, 0x38, 0x58, 0x63, + 0x38, 0x85, 0x7b, 0x3b, 0xcb, 0xb5, 0xf2, 0xc9, + 0x1e, 0xc8, 0xc5, 0x81, 0xc5, 0xb8, 0xe5, 0x2d, + 0x75, 0x0d, 0x09, 0x15, 0x3a, 0x2a, 0x17, 0xab, + 0x5b, 0x99, 0xd9, 0xb2, 0x77, 0x2e, 0x6c, 0x84, + 0x38, 0x4b, 0x81, 0xa4, 0x1d, 0x21, 0xae, 0x0c, + 0xa8, 0x07, 0x73, 0x75, 0x04, 0x7d, 0xee, 0x47, + 0x98, 0x58, 0xc3, 0xcf, 0xce, 0xc6, 0x98, 0xab, + 0x47, 0x39, 0x87, 0x15, 0x0a, 0xd5, 0x61, 0x95, + 0xde, 0xdf, 0x97, 0x7b, 0x3b, 0x3c, 0x56, 0x79, + 0x4f, 0x71, 0x0d, 0x68, 0xaf, 0x65, 0x49, 0x65, + 0x4f, 0x7b, 0xf6, 0x7b, 0x34, 0x63, 0x9c, 0x4b, + 0x58, 0x1a, 0x5b, 0x53, 0x5a, 0x13, 0xaf, 0x5f, + 0x64, 0x2e, 0xa6, 0xd8, 0x4f, 0x3e, 0xcd, 0xdb, + 0x41, 0x6a, 0xe6, 0x46, 0x65, 0x79, 0x7c, 0xb8, + 0xdd, 0x84, 0x38, 0x54, 0x9a, 0x20, 0x83, 0xbf, + 0xca, 0xaf, 0x72, 0xf2, 0xd3, 0x70, 0xca, 0x31, + 0xe6, 0x8c, 0x7b, 0x4e, 0x20, 0x4f, 0x6c, 0x2d, + 0xb0, 0x64, 0x59, 0x9c, 0xce, 0x84, 0x36, 0x2f, + 0x16, 0x76, 0x73, 0x8c, 0x75, 0x45, 0x30, 0x68, + 0xd2, 0xea, 0x1d, 0x1a, 0xf7, 0x54, 0xac, 0xf6, + 0x52, 0x5b, 0xec, 0xdc, 0xf6, 0xf7, 0x32, 0x47, + 0x23, 0xe3, 0x78, 0x7c, 0x21, 0x8e, 0x06, 0x82, + 0xa1, 0x6b, 0xce, 0xae, 0xe7, 0x87, 0x27, 0xcb, + 0x21, 0x89, 0xe6, 0x36, 0xcb, 0x03, 0x71, 0x96, + 0x9a, 0x12, 0x03, 0x1b, 0xa2, 0xbd, 0xd4, 0x10, + 0x53, 0xc3, 0x24, 0x13, 0x49, 0x04, 0x94, 0xc7, + 0x13, 0x8b, 0x0d, 0x34, 0x8a, 0x8d, 0xe5, 0xad, + 0x09, 0x24, 0x92, 0xe3, 0x52, 0x74, 0x92, 0x75, + 0x92, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x0b, + 0x75, 0xa7, 0xbd, 0xc1, 0xf6, 0xac, 0xfa, 0xcb, + 0x4a, 0xdb, 0x69, 0xef, 0x70, 0x7d, 0xab, 0x3e, + 0xb2, 0x0b, 0x8e, 0x75, 0xef, 0x4d, 0xf3, 0x07, + 0x84, 0xae, 0x05, 0xdf, 0x9c, 0xfb, 0xd3, 0x7c, + 0xc1, 0xe1, 0x2b, 0x81, 0x07, 0xb8, 0x7f, 0x6c, + 0xcf, 0x39, 0xbe, 0x15, 0x2e, 0xa2, 0x21, 0xfd, + 0xb3, 0x3c, 0xe6, 0xf8, 0x54, 0xba, 0x02, 0x8e, + 0xcc, 0xfd, 0xea, 0xd3, 0xed, 0x3e, 0x50, 0xa4, + 0x54, 0x76, 0x67, 0xef, 0x56, 0x9f, 0x69, 0xf2, + 0x84, 0x0c, 0xb3, 0xde, 0xae, 0xfc, 0xf3, 0xf5, + 0x8a, 0x91, 0x51, 0xd9, 0x67, 0xbd, 0x5d, 0xf9, + 0xe7, 0xeb, 0x15, 0x22, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x83, 0x23, 0x5a, + 0x84, 0x3a, 0xcf, 0x6c, 0xa9, 0xb1, 0xad, 0x42, + 0x1d, 0x67, 0xb6, 0x50, 0x17, 0xa8, 0xc8, 0x12, + 0x30, 0x9d, 0xc7, 0x34, 0xf0, 0x15, 0xe5, 0x60, + 0xa0, 0xd5, 0xb6, 0x71, 0xbb, 0xdb, 0x2d, 0xe6, + 0xa7, 0x88, 0xf8, 0xcb, 0x41, 0xec, 0x83, 0x5f, + 0x95, 0x57, 0x95, 0xd5, 0xf0, 0x45, 0x9c, 0xd8, + 0x7b, 0x1c, 0xce, 0xc1, 0x3c, 0x7a, 0x63, 0x7e, + 0xe8, 0xa6, 0xea, 0xaa, 0xde, 0x65, 0x57, 0xf6, + 0x52, 0x16, 0x4f, 0x13, 0xbb, 0x0f, 0x68, 0xc4, + 0xd2, 0x37, 0xc1, 0x08, 0x39, 0x11, 0x67, 0x0b, + 0xbe, 0x69, 0xe0, 0x29, 0x85, 0xff, 0x00, 0x34, + 0xf0, 0x14, 0x18, 0x45, 0x9c, 0x2f, 0xf9, 0xa7, + 0x80, 0xa6, 0x17, 0xfc, 0xd3, 0xc0, 0x50, 0x61, + 0x16, 0x70, 0xbf, 0xe6, 0x9e, 0x02, 0x98, 0x5f, + 0xf3, 0x4f, 0x01, 0x41, 0x84, 0x59, 0xc2, 0xff, + 0x00, 0x9a, 0x78, 0x0a, 0x61, 0x7f, 0xcd, 0x3c, + 0x05, 0x06, 0x3f, 0x2e, 0xf2, 0x9d, 0xcf, 0x1c, + 0xd3, 0x93, 0xe5, 0x61, 0xae, 0x04, 0xb5, 0x9e, + 0x30, 0x07, 0x57, 0x8a, 0x14, 0x1e, 0x17, 0xfc, + 0xd3, 0xc0, 0x53, 0x03, 0xbe, 0x69, 0xdd, 0xdc, + 0x3b, 0xa8, 0x27, 0x76, 0x68, 0xb4, 0xd9, 0x66, + 0x56, 0xe4, 0x8c, 0x4f, 0x8b, 0xc5, 0xae, 0x8a, + 0x9a, 0x3c, 0x53, 0x4a, 0xcd, 0xa4, 0x63, 0x34, + 0xc8, 0x06, 0x5d, 0x19, 0x6b, 0x6e, 0xad, 0x64, + 0x2e, 0x64, 0x6e, 0x20, 0x62, 0x69, 0x24, 0xe8, + 0xaf, 0x6d, 0x40, 0x96, 0x38, 0xfe, 0x69, 0xe0, + 0x3c, 0x48, 0x1b, 0x20, 0x35, 0x01, 0xc0, 0x8d, + 0x44, 0x02, 0x0a, 0x09, 0x7b, 0xab, 0x0b, 0x6c, + 0xb7, 0x29, 0x7c, 0x77, 0x6c, 0x63, 0xb3, 0x19, + 0xdd, 0xfa, 0xb6, 0x83, 0x88, 0xb1, 0xa3, 0x77, + 0x42, 0xee, 0xcd, 0x6c, 0x66, 0xcd, 0xed, 0xec, + 0xa6, 0xb1, 0x73, 0x1f, 0x13, 0x23, 0xc2, 0xf6, + 0x97, 0x00, 0x1a, 0x74, 0x6b, 0xaf, 0x69, 0x56, + 0x8b, 0x5e, 0x4d, 0x48, 0x75, 0x77, 0xe8, 0x6a, + 0xb2, 0x04, 0x82, 0xa0, 0x07, 0x00, 0xed, 0x60, + 0x02, 0x2a, 0x82, 0xc1, 0x9b, 0xdb, 0xb1, 0xd9, + 0x05, 0x9b, 0x6d, 0xa4, 0x6c, 0xec, 0xb4, 0x71, + 0x12, 0x39, 0xa7, 0x7f, 0xc5, 0xd0, 0x3b, 0x65, + 0x68, 0xda, 0xa7, 0x35, 0xf7, 0x36, 0xd4, 0x20, + 0x8e, 0x61, 0xa3, 0x41, 0xaa, 0x85, 0xc0, 0xea, + 0x53, 0x09, 0xa6, 0xf6, 0x13, 0xc4, 0x98, 0x1d, + 0xf3, 0x4f, 0x01, 0x41, 0xe4, 0x01, 0xdc, 0xed, + 0x05, 0xd3, 0x97, 0x90, 0x2f, 0xed, 0x49, 0xdc, + 0x9a, 0x32, 0x7b, 0x8f, 0x05, 0x68, 0xc2, 0xff, + 0x00, 0x9a, 0x78, 0x0a, 0x60, 0x75, 0x6b, 0x84, + 0xf0, 0x14, 0x12, 0x7b, 0x4e, 0xe0, 0xec, 0xe6, + 0x67, 0x34, 0x82, 0x30, 0xb4, 0xd4, 0x1a, 0x8d, + 0x54, 0xdc, 0x5b, 0xb3, 0x17, 0x37, 0xe1, 0xac, + 0xb5, 0xb5, 0x04, 0x87, 0xba, 0xa0, 0x6b, 0x15, + 0x2e, 0xdc, 0x50, 0xc1, 0x8e, 0x1a, 0x9a, 0x78, + 0x0a, 0x60, 0x7d, 0x6a, 0x1a, 0x6b, 0xbf, 0x42, + 0x82, 0x6b, 0x69, 0x5c, 0xd7, 0x33, 0x2d, 0xa1, + 0x06, 0x96, 0xe0, 0x1a, 0x1a, 0xe9, 0xf1, 0x53, + 0x39, 0x73, 0x4e, 0x4b, 0x95, 0x80, 0x41, 0x21, + 0xae, 0xad, 0x08, 0xd1, 0x50, 0xa1, 0x43, 0x1c, + 0x0d, 0x43, 0x4f, 0x01, 0x58, 0x0c, 0x70, 0xfc, + 0xd3, 0xc0, 0x50, 0x4d, 0xdd, 0x3d, 0xbf, 0x0c, + 0x59, 0x36, 0xa2, 0xa2, 0x52, 0x4b, 0x6b, 0xa7, + 0x59, 0x2b, 0xa3, 0x32, 0xb2, 0x97, 0x3d, 0x8a, + 0xd6, 0xfa, 0xc5, 0xcc, 0x91, 0xfc, 0xd8, 0x8e, + 0x66, 0x97, 0x00, 0x43, 0x86, 0xb2, 0x6a, 0xab, + 0xb8, 0x5d, 0xf3, 0x4f, 0x01, 0x59, 0x1c, 0xe8, + 0xad, 0x03, 0x9b, 0x5d, 0x74, 0x04, 0x78, 0x10, + 0x49, 0x67, 0x70, 0xd8, 0xdb, 0x36, 0xda, 0xd2, + 0xdc, 0x30, 0xcf, 0x13, 0x4f, 0xb4, 0xca, 0xcd, + 0xd7, 0x11, 0x40, 0xd5, 0xcd, 0x95, 0x4d, 0x14, + 0x19, 0x8d, 0xbc, 0xb3, 0x00, 0x62, 0x6b, 0xbc, + 0x7a, 0xe9, 0x00, 0x1d, 0xf5, 0xcb, 0x85, 0xdf, + 0x34, 0xf0, 0x14, 0xc2, 0xff, 0x00, 0x9a, 0x7b, + 0x3a, 0x0e, 0x94, 0x16, 0x5e, 0xa2, 0x97, 0xae, + 0x45, 0xf3, 0x5f, 0x10, 0xb2, 0x12, 0xb6, 0x60, + 0xf0, 0xe0, 0x34, 0x0f, 0x1a, 0x94, 0x50, 0xd9, + 0xd5, 0xcc, 0x77, 0x79, 0x9d, 0xcc, 0xf1, 0x1a, + 0xb1, 0xce, 0x01, 0xa7, 0x7c, 0x34, 0x01, 0x55, + 0xc9, 0xfa, 0xdc, 0x38, 0x7c, 0x6c, 0x3b, 0xd4, + 0x34, 0x58, 0xc2, 0xff, 0x00, 0x9a, 0x78, 0x0a, + 0x09, 0xcb, 0x92, 0xd3, 0xb2, 0x50, 0x32, 0xb5, + 0x3c, 0xf9, 0xa8, 0x1a, 0xe9, 0xe3, 0xaf, 0x46, + 0x57, 0x65, 0xfb, 0x33, 0x18, 0x89, 0xf8, 0x6e, + 0x2e, 0xe4, 0xc4, 0x4b, 0x4d, 0x1c, 0x07, 0xe4, + 0x14, 0x0e, 0x03, 0xf3, 0x0f, 0x01, 0xe2, 0x58, + 0xc0, 0xea, 0xd7, 0x09, 0xaf, 0x68, 0xf1, 0x20, + 0x93, 0xca, 0x73, 0x4b, 0xb8, 0xf3, 0x3b, 0x77, + 0xcb, 0x3b, 0xdf, 0x16, 0x30, 0xd7, 0x87, 0x38, + 0x91, 0x47, 0x78, 0xb5, 0x3d, 0xa5, 0x27, 0x0c, + 0xb6, 0xd6, 0x39, 0xfd, 0xed, 0xb4, 0xce, 0x02, + 0xda, 0xf8, 0x68, 0x76, 0x8a, 0x55, 0xf5, 0x3b, + 0x9d, 0xb5, 0x5a, 0xc0, 0xef, 0x9a, 0x78, 0x0f, + 0x12, 0xc6, 0x07, 0x6e, 0x34, 0xf0, 0x14, 0x13, + 0x6c, 0xd9, 0xd9, 0x6d, 0xa7, 0x13, 0x5d, 0xcb, + 0x10, 0xb2, 0x89, 0xd8, 0xcc, 0x98, 0x81, 0x2e, + 0x0d, 0x38, 0x80, 0x03, 0x7c, 0xaf, 0x1b, 0x53, + 0x23, 0x66, 0xcc, 0x59, 0x23, 0x0d, 0x5a, 0xf8, + 0x58, 0x46, 0xad, 0xda, 0xa8, 0x93, 0xce, 0x91, + 0x43, 0x88, 0x8d, 0xc0, 0x71, 0x51, 0x60, 0x31, + 0xc0, 0xd7, 0x09, 0xd7, 0x5d, 0x45, 0x06, 0x11, + 0x67, 0x0b, 0xfe, 0x69, 0xe0, 0x29, 0x85, 0xff, + 0x00, 0x34, 0xf0, 0x14, 0x18, 0x45, 0x9c, 0x2f, + 0xf9, 0xa7, 0x80, 0xa6, 0x17, 0xfc, 0xd3, 0xc0, + 0x50, 0x61, 0x16, 0x70, 0xbf, 0xe6, 0x9e, 0x02, + 0x98, 0x5f, 0xf3, 0x4f, 0x01, 0x41, 0x84, 0x59, + 0xc2, 0xff, 0x00, 0x9a, 0x78, 0x0a, 0x61, 0x7f, + 0xcd, 0x3c, 0x05, 0x06, 0x14, 0xbe, 0xca, 0xc6, + 0xe9, 0x33, 0x98, 0x9c, 0x05, 0x79, 0xb6, 0xb9, + 0xce, 0x3b, 0xc2, 0x85, 0xbe, 0x15, 0xc1, 0x6d, + 0x97, 0xde, 0xdd, 0x3c, 0x32, 0x08, 0x5e, 0xf2, + 0xed, 0xda, 0x50, 0x0e, 0xe9, 0x56, 0xbb, 0x0b, + 0x18, 0xb2, 0x3b, 0x37, 0x17, 0x91, 0x25, 0xec, + 0xda, 0x09, 0x1d, 0x8d, 0x43, 0xb4, 0x10, 0x6a, + 0xbf, 0x70, 0x75, 0xe4, 0xc4, 0x6a, 0xc5, 0xf2, + 0x2d, 0x09, 0x52, 0x74, 0x93, 0x53, 0xba, 0x51, + 0x01, 0x60, 0xea, 0xaa, 0xca, 0x20, 0xf7, 0xb5, + 0x0c, 0x2f, 0xca, 0x6d, 0x26, 0x6e, 0x96, 0x46, + 0xea, 0x3b, 0xb1, 0x88, 0x50, 0x2a, 0xaa, 0xba, + 0xda, 0x3a, 0xde, 0xea, 0xd5, 0xf9, 0x6d, 0xd7, + 0x91, 0x20, 0xc2, 0xd3, 0xf9, 0x6e, 0xd5, 0x56, + 0xf3, 0x2c, 0x8a, 0xfa, 0xc2, 0x42, 0x39, 0xb7, + 0x4b, 0x0f, 0xe6, 0xca, 0xc1, 0x88, 0x53, 0xb3, + 0xbc, 0x50, 0x47, 0x22, 0xce, 0x07, 0xfc, 0xd7, + 0x70, 0x1e, 0x24, 0xc2, 0xff, 0x00, 0x9a, 0x78, + 0x0a, 0x0c, 0x22, 0xce, 0x17, 0xfc, 0xd3, 0xc0, + 0x53, 0x0b, 0xfe, 0x69, 0xe0, 0x28, 0x30, 0x8b, + 0x38, 0x5f, 0xf3, 0x4f, 0x01, 0x4c, 0x2f, 0xf9, + 0xa7, 0x80, 0xa0, 0xed, 0xc9, 0x6c, 0x9b, 0x7d, + 0x99, 0x43, 0x6e, 0xff, 0x00, 0xd9, 0xd7, 0x14, + 0x9d, 0xa6, 0x8a, 0xd3, 0xbc, 0xa5, 0xf3, 0x8c, + 0xaf, 0x3e, 0xbf, 0xb8, 0x21, 0x90, 0x86, 0xda, + 0xc7, 0xe2, 0xc1, 0x18, 0x7b, 0x40, 0xa0, 0xd4, + 0x69, 0x55, 0x5d, 0x61, 0x9a, 0x33, 0x58, 0xcb, + 0xd8, 0xef, 0x9c, 0xdc, 0x40, 0xd0, 0x8a, 0x6e, + 0x2f, 0x7e, 0xd1, 0x7b, 0xeb, 0xa6, 0xe5, 0x3f, + 0x8d, 0x07, 0x7d, 0xa6, 0x43, 0x76, 0xec, 0xce, + 0x3b, 0x3b, 0xb6, 0x60, 0x04, 0x73, 0xd2, 0xe9, + 0x06, 0x8c, 0x1e, 0x69, 0x2a, 0x52, 0x3c, 0xc2, + 0x1c, 0xde, 0xea, 0xf3, 0x2b, 0x79, 0x02, 0x09, + 0x1b, 0x4b, 0x43, 0xbc, 0x63, 0x1b, 0x9d, 0xba, + 0x55, 0x56, 0xf9, 0xeb, 0xba, 0x97, 0x73, 0x92, + 0xe2, 0x22, 0x84, 0xe2, 0x7d, 0x48, 0xde, 0xaa, + 0xf0, 0xde, 0x75, 0x8e, 0x0e, 0x66, 0x26, 0x38, + 0x6a, 0x2d, 0xa8, 0x23, 0xb4, 0x42, 0x04, 0xb1, + 0x49, 0x0c, 0x8f, 0x8a, 0x56, 0x96, 0xbd, 0x84, + 0xb5, 0xe3, 0x4a, 0x9b, 0xd9, 0x42, 0xd9, 0x6e, + 0x2e, 0x6c, 0xdf, 0xe4, 0x5c, 0x45, 0xe3, 0x0d, + 0xf2, 0xd3, 0xc4, 0x54, 0x23, 0x84, 0x8f, 0x71, + 0x7b, 0x83, 0x9c, 0xe3, 0xad, 0xc4, 0x12, 0x4f, + 0x74, 0xac, 0xb0, 0xcd, 0x1b, 0xb1, 0x33, 0x1b, + 0x1c, 0x37, 0x5b, 0x88, 0x1e, 0xf2, 0x09, 0x7c, + 0xda, 0xeb, 0x0e, 0xd1, 0x87, 0xb3, 0x55, 0xbb, + 0xe3, 0x68, 0x1a, 0x75, 0x37, 0x08, 0x2a, 0x43, + 0x6b, 0x30, 0xdb, 0xd9, 0x32, 0x16, 0x1f, 0x79, + 0x99, 0xd3, 0x3f, 0xb2, 0x00, 0xfe, 0x90, 0xaa, + 0xc4, 0x48, 0xe2, 0x4b, 0xb1, 0x38, 0x9d, 0x64, + 0xe2, 0x24, 0x9e, 0xda, 0xf4, 0xf7, 0xdc, 0x49, + 0x4e, 0x71, 0xcf, 0x7e, 0x1d, 0x58, 0xb1, 0x1a, + 0x70, 0xf6, 0x90, 0x58, 0x6f, 0x6d, 0xef, 0x2e, + 0xf2, 0x2c, 0xbd, 0x99, 0x7b, 0x4b, 0xe3, 0x0d, + 0xa4, 0xcc, 0x8f, 0xe7, 0x52, 0x86, 0xbd, 0xd4, + 0xbc, 0xb0, 0xb8, 0x8b, 0x66, 0x23, 0xb7, 0xc3, + 0x8a, 0x48, 0x25, 0x2f, 0x95, 0xac, 0xd3, 0x80, + 0x69, 0x24, 0x3a, 0x9b, 0xd5, 0x50, 0x30, 0xdc, + 0x5e, 0x40, 0xd2, 0xd8, 0x64, 0x92, 0x30, 0x7c, + 0xa0, 0xc2, 0xe1, 0x5e, 0xdd, 0x17, 0x96, 0xc9, + 0x72, 0xd6, 0xbd, 0xa1, 0xd2, 0x61, 0x93, 0xcb, + 0x6f, 0x8d, 0x42, 0x7b, 0x3b, 0xe8, 0x27, 0x4d, + 0xa5, 0xc5, 0xf6, 0xcb, 0xda, 0x47, 0x6a, 0xce, + 0x71, 0xf1, 0xc8, 0xe7, 0x3d, 0xb5, 0x02, 0x83, + 0xc7, 0xe3, 0x4b, 0xbb, 0x79, 0x73, 0x4c, 0x8e, + 0xc9, 0xd6, 0x8d, 0x32, 0xcb, 0x67, 0x58, 0xa5, + 0x8d, 0xbe, 0x50, 0xa7, 0x8b, 0xab, 0xb8, 0xa0, + 0xe3, 0x9a, 0xee, 0x21, 0x86, 0x37, 0xc8, 0xc0, + 0x75, 0x86, 0x97, 0x01, 0xde, 0x48, 0x66, 0xba, + 0xb7, 0x71, 0x74, 0x0f, 0x92, 0x37, 0x1d, 0x65, + 0xb8, 0x82, 0x09, 0x1b, 0xec, 0xba, 0x1b, 0x1c, + 0xb2, 0xdf, 0x9f, 0x8f, 0x0e, 0x63, 0x33, 0xea, + 0xe1, 0x52, 0x48, 0x6f, 0x68, 0x2d, 0xdb, 0x5a, + 0x0f, 0x58, 0x42, 0x0e, 0x8f, 0xfb, 0x76, 0x69, + 0xfe, 0xd3, 0x94, 0x34, 0x8e, 0x9a, 0x57, 0x99, + 0x24, 0x2f, 0x7b, 0x8e, 0xb2, 0xec, 0x44, 0xa3, + 0xcc, 0xd2, 0x10, 0x64, 0x2f, 0x79, 0x1a, 0x01, + 0x76, 0x23, 0xa2, 0xb5, 0xa2, 0x09, 0xdc, 0xca, + 0x6e, 0x62, 0xc7, 0x22, 0x99, 0xda, 0xa3, 0x6b, + 0x4b, 0xa9, 0xfd, 0x85, 0xeb, 0x3d, 0xc9, 0xef, + 0x2f, 0xb3, 0x0f, 0x6a, 0xb3, 0x67, 0x3b, 0x05, + 0xcb, 0x5a, 0x79, 0xc0, 0x74, 0x36, 0x80, 0x03, + 0x8b, 0x81, 0x40, 0x13, 0x33, 0x9a, 0xd6, 0xb8, + 0xbd, 0xcd, 0x60, 0xa3, 0x5a, 0x71, 0x10, 0x07, + 0x61, 0x7b, 0x6d, 0xcd, 0xeb, 0x22, 0xe6, 0x59, + 0x24, 0xad, 0x8c, 0xfe, 0x68, 0x2e, 0x01, 0x05, + 0x8f, 0x36, 0x99, 0x96, 0x39, 0x86, 0x50, 0xf7, + 0x1a, 0xc7, 0x0b, 0x28, 0xe2, 0x35, 0x53, 0xc5, + 0x6d, 0x57, 0x26, 0x69, 0x91, 0x5e, 0xdc, 0x66, + 0xef, 0x7c, 0x11, 0x97, 0xdb, 0xdc, 0xbb, 0x18, + 0x95, 0xba, 0x5a, 0x03, 0xb4, 0xba, 0xa5, 0x42, + 0x38, 0xcc, 0xfa, 0x62, 0x2f, 0x70, 0x6e, 0x86, + 0x07, 0x62, 0x20, 0x0d, 0xe1, 0x55, 0xb1, 0x97, + 0x77, 0xf1, 0xc5, 0xcc, 0xc7, 0x34, 0xac, 0x8f, + 0x56, 0x00, 0x5c, 0x02, 0x0b, 0x1c, 0xd9, 0xa4, + 0x11, 0x6d, 0x3c, 0x00, 0x38, 0x18, 0x62, 0x8c, + 0x5b, 0xbc, 0x8d, 0x58, 0x9d, 0x53, 0x55, 0xcf, + 0x1e, 0xce, 0xdd, 0x43, 0x9b, 0x36, 0x79, 0x70, + 0x36, 0xd1, 0xb2, 0x09, 0x04, 0xb8, 0x86, 0x9d, + 0x35, 0x0d, 0x03, 0x5d, 0x4a, 0x85, 0xb1, 0x16, + 0xc2, 0xed, 0x9e, 0xda, 0xc7, 0xba, 0xdc, 0x92, + 0x24, 0x03, 0x10, 0x34, 0x3b, 0xba, 0x37, 0x94, + 0xcb, 0x32, 0xfb, 0x18, 0xae, 0xa3, 0xba, 0x76, + 0x64, 0xd9, 0x2c, 0xa2, 0x70, 0x92, 0x38, 0xaa, + 0xe7, 0x3f, 0x46, 0x90, 0xda, 0x1a, 0xa0, 0xe1, + 0xda, 0x6d, 0x39, 0xdd, 0xce, 0xff, 0x00, 0x89, + 0xf5, 0x1a, 0xa3, 0x08, 0xaa, 0xea, 0xcc, 0xee, + 0x1d, 0x7b, 0x7f, 0x35, 0xd0, 0x69, 0x0d, 0x91, + 0xd5, 0x60, 0x20, 0xd7, 0x0d, 0x00, 0x1e, 0x05, + 0xcd, 0x81, 0xdf, 0x34, 0xf0, 0x14, 0x13, 0xbb, + 0x4d, 0x5f, 0x67, 0xcb, 0x2b, 0xb9, 0x01, 0xfe, + 0xe2, 0xf3, 0x97, 0x03, 0xf0, 0xce, 0x63, 0x41, + 0xf9, 0xed, 0xf9, 0x14, 0x33, 0x9d, 0x3b, 0xc0, + 0x0f, 0x2f, 0x78, 0x68, 0xa3, 0x71, 0x62, 0x34, + 0x1d, 0x8a, 0xa0, 0x33, 0x06, 0x96, 0x02, 0xf0, + 0xc7, 0x79, 0x4d, 0x18, 0x80, 0x3d, 0xc4, 0x13, + 0x33, 0x83, 0xf0, 0x8d, 0xbe, 0x8f, 0xf8, 0xc4, + 0xd7, 0x4e, 0xaa, 0x9e, 0xc2, 0x5b, 0x83, 0xf0, + 0x8d, 0xc9, 0xa7, 0xfc, 0x71, 0xbf, 0xfd, 0x4e, + 0xc2, 0x86, 0xac, 0xc5, 0x9c, 0xd9, 0x2f, 0x31, + 0xee, 0x33, 0xc6, 0xc3, 0x5e, 0xd2, 0x56, 0x6c, + 0x06, 0x3a, 0xbf, 0x9b, 0x26, 0xa5, 0x9e, 0x36, + 0x1a, 0xef, 0xd1, 0x04, 0xc6, 0x51, 0x5e, 0xa1, + 0xcd, 0xb7, 0x74, 0x37, 0x7f, 0xb3, 0xd8, 0x5b, + 0x39, 0x99, 0x33, 0x5d, 0x9c, 0xb7, 0x8a, 0xd8, + 0x73, 0x93, 0x59, 0xc8, 0x71, 0xc4, 0x3c, 0xa2, + 0xd3, 0x5d, 0x43, 0xba, 0xa0, 0xc1, 0x98, 0x35, + 0xcc, 0x69, 0x7b, 0x58, 0xef, 0x29, 0xa3, 0x10, + 0x07, 0x45, 0x34, 0x8d, 0xd5, 0x98, 0xa5, 0xb9, + 0x81, 0xd8, 0xe1, 0x73, 0xe3, 0x76, 0xaa, 0xb6, + 0xa3, 0x47, 0x71, 0x04, 0x8d, 0xce, 0x55, 0x05, + 0x8e, 0x51, 0xcf, 0xde, 0x30, 0xc7, 0x7d, 0x2b, + 0xa9, 0x13, 0x2a, 0x74, 0x30, 0x1f, 0xce, 0x68, + 0xaa, 0xdf, 0xb4, 0x1f, 0xcb, 0xb2, 0x9d, 0x14, + 0xa4, 0x00, 0x76, 0x3c, 0x96, 0x28, 0x79, 0xa4, + 0xb8, 0x9d, 0xd8, 0xe6, 0x73, 0xe4, 0x76, 0xaa, + 0xbb, 0x11, 0xd1, 0xbc, 0xb0, 0xe3, 0x33, 0x83, + 0x43, 0xcb, 0xdc, 0x1b, 0xa1, 0xa0, 0xe2, 0x20, + 0x0d, 0xe1, 0x5d, 0x48, 0x3c, 0x22, 0xce, 0x17, + 0xfc, 0xd3, 0xc0, 0x53, 0x0b, 0xfe, 0x69, 0xe0, + 0x28, 0x30, 0x8b, 0x38, 0x5f, 0xf3, 0x4f, 0x01, + 0x4c, 0x2f, 0xf9, 0xa7, 0x80, 0xa0, 0xc2, 0x2c, + 0xe1, 0x7f, 0xcd, 0x3c, 0x05, 0x30, 0x3f, 0xe6, + 0x9e, 0x02, 0x83, 0x0b, 0xa3, 0x2d, 0x8d, 0xd2, + 0xe6, 0x36, 0xd1, 0xb4, 0x54, 0x99, 0x5b, 0xc0, + 0x0d, 0x4a, 0xd7, 0x15, 0xb5, 0xcc, 0xee, 0x0c, + 0x86, 0x27, 0xc8, 0xe3, 0xa0, 0x06, 0xb5, 0x5a, + 0xb2, 0x6c, 0x9d, 0xb9, 0x54, 0x66, 0xf6, 0xf4, + 0x8e, 0x7e, 0x94, 0x63, 0x06, 0x9c, 0x35, 0xec, + 0xef, 0xa0, 0xdf, 0x9c, 0x38, 0x1b, 0xb0, 0x06, + 0xb6, 0xb4, 0x57, 0xbe, 0xb8, 0x57, 0xa9, 0xa5, + 0x74, 0xd2, 0xba, 0x57, 0x6b, 0x71, 0xad, 0x17, + 0x94, 0x1e, 0xe1, 0xfd, 0xb3, 0x3c, 0xe6, 0xf8, + 0x54, 0xba, 0x88, 0x87, 0xf6, 0xcc, 0xf3, 0x9b, + 0xe1, 0x52, 0xe8, 0x0a, 0x3b, 0x33, 0xf7, 0xab, + 0x4f, 0xb4, 0xf9, 0x42, 0x91, 0x51, 0xd9, 0x9f, + 0xbd, 0x5a, 0x7d, 0xa7, 0xca, 0x10, 0x32, 0xcf, + 0x7a, 0xbb, 0xf3, 0xcf, 0xd6, 0x2a, 0x45, 0x47, + 0x65, 0x9e, 0xf5, 0x77, 0xe7, 0x9f, 0xac, 0x54, + 0x8a, 0x02, 0x22, 0x20, 0x21, 0x2b, 0xcc, 0x8f, + 0x6c, 0x6d, 0xc4, 0xe3, 0x85, 0xbd, 0xf5, 0xc5, + 0x2e, 0x60, 0xe3, 0xa2, 0x21, 0x41, 0xbe, 0x50, + 0x77, 0xa5, 0x0a, 0x88, 0x33, 0xcc, 0xed, 0x25, + 0xe4, 0xaf, 0x38, 0xdf, 0xf3, 0x8f, 0x0a, 0x09, + 0x9a, 0x25, 0x14, 0x36, 0x37, 0xfc, 0xe3, 0xc2, + 0x53, 0x1b, 0xfe, 0x71, 0xe1, 0x28, 0x26, 0x68, + 0x94, 0x50, 0xd8, 0xdf, 0xf3, 0x8f, 0x09, 0x4c, + 0x6f, 0xf9, 0xc7, 0x84, 0xa0, 0x99, 0xa2, 0x51, + 0x43, 0x63, 0x7f, 0xce, 0x3c, 0x25, 0x31, 0xbf, + 0xe7, 0x1e, 0x12, 0x82, 0x66, 0x89, 0x45, 0x0d, + 0x8d, 0xff, 0x00, 0x38, 0xf0, 0x94, 0xc6, 0xff, + 0x00, 0x9c, 0x78, 0x4a, 0x09, 0x9a, 0x25, 0x14, + 0x36, 0x37, 0xfc, 0xe3, 0xc2, 0x53, 0x1b, 0xfe, + 0x71, 0xe1, 0x28, 0x26, 0x68, 0x94, 0x50, 0xd8, + 0xdf, 0xf3, 0x8f, 0x09, 0x4c, 0x6f, 0xf9, 0xc7, + 0x84, 0xa0, 0x99, 0xa2, 0x51, 0x43, 0x63, 0x7f, + 0xce, 0x3c, 0x25, 0x31, 0xbf, 0xe7, 0x1e, 0x12, + 0x82, 0x66, 0x89, 0x45, 0x0d, 0x8d, 0xff, 0x00, + 0x38, 0xf0, 0x94, 0xc6, 0xff, 0x00, 0x9c, 0x78, + 0x4a, 0x09, 0x9a, 0x25, 0x14, 0x36, 0x37, 0xfc, + 0xe3, 0xc2, 0x53, 0x1b, 0xfe, 0x71, 0xe1, 0x28, + 0x26, 0x68, 0x94, 0x50, 0xd8, 0xdf, 0xf3, 0x8f, + 0x09, 0x4c, 0x6f, 0xf9, 0xc7, 0x84, 0xa0, 0x99, + 0xa2, 0x51, 0x43, 0x63, 0x7f, 0xce, 0x3c, 0x25, + 0x31, 0xbf, 0xe7, 0x1e, 0x12, 0x82, 0x66, 0x89, + 0x45, 0x0d, 0x8d, 0xff, 0x00, 0x38, 0xf0, 0x94, + 0xc6, 0xff, 0x00, 0x9c, 0x78, 0x4a, 0x09, 0x9a, + 0x25, 0x14, 0x36, 0x37, 0xfc, 0xe3, 0xc2, 0x53, + 0x1b, 0xfe, 0x71, 0xe1, 0x28, 0x26, 0x68, 0x94, + 0x50, 0xd8, 0xdf, 0xf3, 0x8f, 0x09, 0x4c, 0x6f, + 0xf9, 0xc7, 0x84, 0xa0, 0x99, 0xa2, 0x51, 0x43, + 0x63, 0x7f, 0xce, 0x3c, 0x25, 0x31, 0xbf, 0xe7, + 0x1e, 0x12, 0x82, 0x66, 0x89, 0x45, 0x0d, 0x8d, + 0xff, 0x00, 0x38, 0xf0, 0x94, 0xc6, 0xff, 0x00, + 0x9c, 0x78, 0x4a, 0x09, 0x9a, 0x25, 0x14, 0x36, + 0x37, 0xfc, 0xe3, 0xc2, 0x53, 0x1b, 0xfe, 0x71, + 0xe1, 0x28, 0x26, 0x68, 0x94, 0x50, 0xd8, 0xdf, + 0xf3, 0x8f, 0x09, 0x4c, 0x6f, 0xf9, 0xc7, 0x84, + 0xa0, 0x99, 0xa2, 0x51, 0x43, 0x63, 0x7f, 0xce, + 0x3c, 0x25, 0x31, 0xbf, 0xe7, 0x1e, 0x12, 0x82, + 0x66, 0x89, 0x45, 0x0d, 0x8d, 0xff, 0x00, 0x38, + 0xf0, 0x94, 0xc6, 0xff, 0x00, 0x9c, 0x78, 0x4a, + 0x09, 0x9a, 0x25, 0x14, 0x36, 0x37, 0xfc, 0xe3, + 0xc2, 0x53, 0x1b, 0xfe, 0x71, 0xe1, 0x28, 0x26, + 0x68, 0x94, 0x50, 0xd8, 0xdf, 0xf3, 0x8f, 0x09, + 0x4c, 0x6f, 0xf9, 0xc7, 0x84, 0xa0, 0x99, 0xa2, + 0x51, 0x43, 0x63, 0x7f, 0xce, 0x3c, 0x25, 0x31, + 0xbf, 0xe7, 0x1e, 0x12, 0x82, 0x68, 0x03, 0x55, + 0x08, 0x7c, 0xa3, 0xdb, 0x2b, 0x38, 0xdf, 0xf3, + 0x8f, 0x09, 0x58, 0x40, 0x44, 0x44, 0x00, 0x4b, + 0x48, 0x73, 0x4d, 0x1c, 0xdf, 0x25, 0xc3, 0x58, + 0x5d, 0xd0, 0xe6, 0xf7, 0x0c, 0x00, 0x3c, 0x09, + 0x37, 0xc9, 0xd0, 0x7b, 0xcb, 0x81, 0x10, 0x49, + 0x75, 0xb9, 0x3a, 0xe0, 0x61, 0x58, 0xeb, 0x7f, + 0xf0, 0x18, 0xa3, 0xd1, 0x04, 0x87, 0x5b, 0xff, + 0x00, 0x80, 0xc4, 0xeb, 0x7f, 0xf0, 0x18, 0xa3, + 0xd1, 0x04, 0x87, 0x5b, 0xff, 0x00, 0x80, 0xc4, + 0xeb, 0x7f, 0xf0, 0x18, 0xa3, 0xd1, 0x04, 0x87, + 0x5b, 0xff, 0x00, 0x80, 0xc4, 0xeb, 0x7f, 0xf0, + 0x18, 0xa3, 0xd1, 0x04, 0x87, 0x5b, 0xff, 0x00, + 0x80, 0xc4, 0xeb, 0x7f, 0xf0, 0x18, 0xa3, 0xd1, + 0x04, 0x87, 0x5b, 0xff, 0x00, 0x80, 0xc4, 0xeb, + 0x7f, 0xf0, 0x18, 0xa3, 0xd1, 0x04, 0x87, 0x5b, + 0xff, 0x00, 0x80, 0xc4, 0xeb, 0x7f, 0xf0, 0x18, + 0xa3, 0xd1, 0x04, 0x87, 0x5b, 0xff, 0x00, 0x80, + 0xc4, 0xeb, 0x7f, 0xf0, 0x18, 0xa3, 0xd1, 0x04, + 0x87, 0x5b, 0xff, 0x00, 0x80, 0xc4, 0xeb, 0x7f, + 0xf0, 0x18, 0xa3, 0xd1, 0x04, 0x87, 0x5b, 0xff, + 0x00, 0x80, 0xc4, 0xeb, 0x7f, 0xf0, 0x18, 0xa3, + 0xd1, 0x04, 0x87, 0x5b, 0xff, 0x00, 0x80, 0xc4, + 0xeb, 0x7f, 0xf0, 0x18, 0xa3, 0xd1, 0x04, 0x87, + 0x5b, 0xff, 0x00, 0x80, 0xc4, 0xeb, 0x7f, 0xf0, + 0x18, 0xa3, 0xd1, 0x04, 0x87, 0x5b, 0xff, 0x00, + 0x80, 0xc4, 0xeb, 0x7f, 0xf0, 0x18, 0xa3, 0xd1, + 0x04, 0x87, 0x5b, 0xff, 0x00, 0x80, 0xc4, 0xeb, + 0x7f, 0xf0, 0x18, 0xa3, 0xd1, 0x04, 0x87, 0x5b, + 0xff, 0x00, 0x80, 0xc4, 0xeb, 0x7f, 0xf0, 0x18, + 0xa3, 0xd1, 0x04, 0x87, 0x5b, 0xff, 0x00, 0x80, + 0xc4, 0xeb, 0x7f, 0xf0, 0x18, 0xa3, 0xd1, 0x04, + 0x87, 0x5b, 0xff, 0x00, 0x80, 0xc4, 0xeb, 0x7f, + 0xf0, 0x18, 0xa3, 0xd1, 0x04, 0x87, 0x5b, 0xff, + 0x00, 0x80, 0xc4, 0xeb, 0x7f, 0xf0, 0x18, 0xa3, + 0xd1, 0x04, 0x87, 0x5b, 0xff, 0x00, 0x80, 0xc4, + 0xeb, 0x7f, 0xf0, 0x18, 0xa3, 0xd1, 0x04, 0x87, + 0x5b, 0xff, 0x00, 0x80, 0xc4, 0xeb, 0x7f, 0xf0, + 0x18, 0xa3, 0xd1, 0x04, 0x87, 0x5b, 0xff, 0x00, + 0x80, 0xc4, 0xeb, 0x7f, 0xf0, 0x18, 0xa3, 0xd1, + 0x07, 0x7b, 0xf3, 0x8b, 0x8a, 0x61, 0x8d, 0x8c, + 0x60, 0xdf, 0xfe, 0x85, 0xc5, 0x24, 0x8f, 0x91, + 0xc5, 0xf2, 0x38, 0xb9, 0xc7, 0x59, 0x2b, 0xc2, + 0xca, 0x02, 0x22, 0x20, 0x22, 0x22, 0x06, 0xad, + 0x23, 0x42, 0xeb, 0x83, 0x34, 0xba, 0x88, 0x61, + 0x24, 0x48, 0xdd, 0xe7, 0x6b, 0xe1, 0x5c, 0x88, + 0x82, 0x47, 0xad, 0xcf, 0xa8, 0x62, 0xc7, 0x5b, + 0xff, 0x00, 0x80, 0xc5, 0x1e, 0x88, 0x24, 0x3a, + 0xdf, 0xfc, 0x06, 0x27, 0x5b, 0xff, 0x00, 0x80, + 0xc5, 0x1e, 0x88, 0x24, 0x3a, 0xdf, 0xfc, 0x06, + 0x27, 0x5b, 0xff, 0x00, 0x80, 0xc5, 0x1e, 0x88, + 0x24, 0x3a, 0xdf, 0xfc, 0x06, 0x27, 0x5b, 0xff, + 0x00, 0x80, 0xc5, 0x1e, 0x88, 0x24, 0x3a, 0xdf, + 0xfc, 0x06, 0x27, 0x5b, 0xff, 0x00, 0x80, 0xc5, + 0x1e, 0x88, 0x24, 0x3a, 0xdf, 0xfc, 0x06, 0x27, + 0x5b, 0xff, 0x00, 0x80, 0xc5, 0x1e, 0x88, 0x24, + 0x3a, 0xdf, 0xfc, 0x06, 0x27, 0x5b, 0xff, 0x00, + 0x80, 0xc5, 0x1e, 0x88, 0x24, 0x3a, 0xdf, 0xfc, + 0x06, 0x27, 0x5b, 0xff, 0x00, 0x80, 0xc5, 0x1e, + 0x88, 0x24, 0x3a, 0xdf, 0xfc, 0x06, 0x27, 0x5b, + 0xff, 0x00, 0x80, 0xc5, 0x1e, 0x88, 0x24, 0x3a, + 0xdf, 0xfc, 0x06, 0x27, 0x5b, 0xff, 0x00, 0x80, + 0xc5, 0x1e, 0x88, 0x24, 0x3a, 0xdf, 0xfc, 0x06, + 0x27, 0x5b, 0xff, 0x00, 0x80, 0xc5, 0x1e, 0x88, + 0x24, 0x3a, 0xdf, 0xfc, 0x06, 0x27, 0x5b, 0xff, + 0x00, 0x80, 0xc5, 0x1e, 0x88, 0x24, 0x7a, 0xdc, + 0xfa, 0x86, 0x27, 0x5b, 0x9f, 0x50, 0xc5, 0x1c, + 0x88, 0x24, 0x3a, 0xdf, 0xfc, 0x06, 0x27, 0x5b, + 0xff, 0x00, 0x80, 0xc5, 0x1e, 0x88, 0x24, 0x3a, + 0xdf, 0xfc, 0x06, 0x27, 0x5b, 0xff, 0x00, 0x80, + 0xc5, 0x1e, 0x88, 0x24, 0x3a, 0xdf, 0xfc, 0x06, + 0x27, 0x5b, 0xff, 0x00, 0x80, 0xc5, 0x1e, 0x88, + 0x24, 0x3a, 0xdf, 0xfc, 0x06, 0x27, 0x5b, 0xff, + 0x00, 0x80, 0xc5, 0x1e, 0x88, 0x24, 0x3a, 0xdf, + 0xfc, 0x06, 0x27, 0x5b, 0xff, 0x00, 0x80, 0xc5, + 0x1e, 0x88, 0x24, 0x3a, 0xdf, 0xfc, 0x06, 0x27, + 0x5b, 0xff, 0x00, 0x80, 0xc5, 0x1e, 0x88, 0x24, + 0x3a, 0xdf, 0xfc, 0x06, 0x27, 0x5b, 0xff, 0x00, + 0x80, 0xc5, 0x1e, 0x88, 0x24, 0x3a, 0xdf, 0xfc, + 0x06, 0x27, 0x5b, 0xff, 0x00, 0x80, 0xc5, 0x1e, + 0x88, 0x24, 0x0e, 0x73, 0x35, 0x28, 0xd8, 0xda, + 0xde, 0xca, 0xe2, 0x9a, 0x79, 0x67, 0x76, 0x29, + 0x5d, 0x8c, 0xee, 0x6f, 0x05, 0xe1, 0x10, 0x11, + 0x11, 0x07, 0xb8, 0x7f, 0x6c, 0xcf, 0x39, 0xbe, + 0x15, 0x2e, 0xa2, 0x21, 0xfd, 0xb3, 0x3c, 0xe6, + 0xf8, 0x54, 0xba, 0x02, 0x8e, 0xcc, 0xfd, 0xea, + 0xd3, 0xed, 0x3e, 0x50, 0xa4, 0x54, 0x76, 0x67, + 0xef, 0x56, 0x9f, 0x69, 0xf2, 0x84, 0x0c, 0xb3, + 0xde, 0xae, 0xfc, 0xf3, 0xf5, 0x8a, 0x92, 0x51, + 0x99, 0x67, 0xbd, 0x5e, 0x79, 0xe7, 0xc2, 0x54, + 0x8d, 0x4e, 0xf9, 0x41, 0x95, 0xe6, 0x47, 0xb6, + 0x36, 0x17, 0xbc, 0xd0, 0x05, 0x9a, 0x9d, 0xf2, + 0xb8, 0x6f, 0xe6, 0x2e, 0x77, 0x34, 0x0e, 0x86, + 0xe9, 0x77, 0x6d, 0x07, 0x3c, 0xd3, 0x3e, 0x67, + 0x62, 0x76, 0xad, 0xc6, 0xef, 0x05, 0xe1, 0x0a, + 0x20, 0x22, 0xd9, 0x05, 0xbc, 0xd3, 0xba, 0x91, + 0x37, 0x16, 0xf9, 0xdc, 0x1d, 0xd5, 0xda, 0x32, + 0xc8, 0x63, 0x6d, 0x6e, 0x6e, 0x03, 0x3b, 0x02, + 0x83, 0xc2, 0x9e, 0x3e, 0x1a, 0xc9, 0x3a, 0x47, + 0x8c, 0xc4, 0x23, 0x91, 0x77, 0xfb, 0x3e, 0x51, + 0xd2, 0x87, 0x29, 0xbc, 0x49, 0xec, 0xf9, 0x47, + 0x4a, 0x1c, 0xa6, 0xf1, 0x29, 0xdb, 0x6e, 0x52, + 0xaf, 0x72, 0x9d, 0x51, 0xf3, 0x70, 0x22, 0xef, + 0xf6, 0x7c, 0xa3, 0xa5, 0x0e, 0x53, 0x78, 0x93, + 0xd9, 0xf2, 0x8e, 0x94, 0x39, 0x4d, 0xe2, 0x4d, + 0xb6, 0xe5, 0x3f, 0x23, 0xb9, 0x4e, 0xa8, 0xf9, + 0xb8, 0x11, 0x77, 0xfb, 0x3e, 0x51, 0xd2, 0x87, + 0x29, 0xbc, 0x49, 0xec, 0xf9, 0x47, 0x4a, 0x1c, + 0xa6, 0xf1, 0x26, 0xdb, 0x72, 0x9f, 0x91, 0xdc, + 0xa7, 0x54, 0x7c, 0xdc, 0x08, 0xbb, 0xfd, 0x9f, + 0x28, 0xe9, 0x43, 0x94, 0xde, 0x24, 0xf6, 0x7c, + 0xa3, 0xa5, 0x0e, 0x53, 0x78, 0x93, 0x6d, 0xb9, + 0x4f, 0xc8, 0xee, 0x53, 0xaa, 0x3e, 0x6e, 0x04, + 0x5d, 0xfe, 0xcf, 0x94, 0x74, 0xa1, 0xca, 0x6f, + 0x12, 0x7b, 0x3e, 0x51, 0xd2, 0x87, 0x29, 0xbc, + 0x49, 0xb6, 0xdc, 0xa7, 0xe4, 0x77, 0x29, 0xd5, + 0x1f, 0x37, 0x02, 0x2e, 0xff, 0x00, 0x67, 0xca, + 0x3a, 0x50, 0xe5, 0x37, 0x89, 0x3d, 0x9f, 0x28, + 0xe9, 0x43, 0x94, 0xde, 0x24, 0xdb, 0x6e, 0x53, + 0xf2, 0x3b, 0x94, 0xea, 0x8f, 0x9b, 0x81, 0x17, + 0x7f, 0xb3, 0xe5, 0x1d, 0x28, 0x72, 0x9b, 0xc4, + 0x9e, 0xcf, 0x94, 0x74, 0xa1, 0xca, 0x6f, 0x12, + 0x6d, 0xb7, 0x29, 0xf9, 0x1d, 0xca, 0x75, 0x47, + 0xcd, 0xc0, 0x8b, 0xbf, 0xd9, 0xf2, 0x8e, 0x94, + 0x39, 0x4d, 0xe2, 0x4f, 0x67, 0xca, 0x3a, 0x50, + 0xe5, 0x37, 0x89, 0x36, 0xdb, 0x94, 0xfc, 0x8e, + 0xe5, 0x3a, 0xa3, 0xe6, 0xe0, 0x45, 0xdf, 0xec, + 0xf9, 0x47, 0x4a, 0x1c, 0xa6, 0xf1, 0x27, 0xb3, + 0xe5, 0x1d, 0x28, 0x72, 0x9b, 0xc4, 0x9b, 0x6d, + 0xca, 0x7e, 0x47, 0x72, 0x9d, 0x51, 0xf3, 0x70, + 0x22, 0xef, 0xf6, 0x7c, 0xa3, 0xa5, 0x0e, 0x53, + 0x78, 0x93, 0xd9, 0xf2, 0x8e, 0x94, 0x39, 0x4d, + 0xe2, 0x4d, 0xb6, 0xe5, 0x3f, 0x23, 0xb9, 0x4e, + 0xa8, 0xf9, 0xb8, 0x11, 0x77, 0xfb, 0x3e, 0x51, + 0xd2, 0x87, 0x29, 0xbc, 0x49, 0xec, 0xf9, 0x47, + 0x4a, 0x1c, 0xa6, 0xf1, 0x26, 0xdb, 0x72, 0x9f, + 0x91, 0xdc, 0xa7, 0x54, 0x7c, 0xdc, 0x08, 0xbb, + 0xfd, 0x9f, 0x28, 0xe9, 0x43, 0x94, 0xde, 0x24, + 0xf6, 0x7c, 0xa3, 0xa5, 0x0e, 0x53, 0x78, 0x93, + 0x6d, 0xb9, 0x4f, 0xc8, 0xee, 0x53, 0xaa, 0x3e, + 0x6e, 0x04, 0x5d, 0xfe, 0xcf, 0x94, 0x74, 0xa1, + 0xca, 0x6f, 0x12, 0x7b, 0x3e, 0x51, 0xd2, 0x87, + 0x29, 0xbc, 0x49, 0xb6, 0xdc, 0xa7, 0xe4, 0x77, + 0x29, 0xd5, 0x1f, 0x37, 0x02, 0x2e, 0xff, 0x00, + 0x67, 0xca, 0x3a, 0x50, 0xe5, 0x37, 0x89, 0x3d, + 0x9f, 0x28, 0xe9, 0x43, 0x94, 0xde, 0x24, 0xdb, + 0x6e, 0x53, 0xf2, 0x3b, 0x94, 0xea, 0x8f, 0x9b, + 0x81, 0x17, 0x7f, 0xb3, 0xe5, 0x1d, 0x28, 0x72, + 0x9b, 0xc4, 0x9e, 0xcf, 0x94, 0x74, 0xa1, 0xca, + 0x6f, 0x12, 0x6d, 0xb7, 0x29, 0xf9, 0x1d, 0xca, + 0x75, 0x47, 0xcd, 0xc0, 0x8b, 0xbf, 0xd9, 0xf2, + 0x8e, 0x94, 0x39, 0x4d, 0xe2, 0x4f, 0x67, 0xca, + 0x3a, 0x50, 0xe5, 0x37, 0x89, 0x36, 0xdb, 0x94, + 0xfc, 0x8e, 0xe5, 0x3a, 0xa3, 0xe6, 0xe0, 0x45, + 0xdf, 0xec, 0xf9, 0x47, 0x4a, 0x1c, 0xa6, 0xf1, + 0x27, 0xb3, 0xe5, 0x1d, 0x28, 0x72, 0x9b, 0xc4, + 0x9b, 0x6d, 0xca, 0x7e, 0x47, 0x72, 0x9d, 0x51, + 0xf3, 0x70, 0x22, 0xef, 0xf6, 0x7c, 0xa3, 0xa5, + 0x0e, 0x53, 0x78, 0x93, 0xd9, 0xf2, 0x8e, 0x94, + 0x39, 0x4d, 0xe2, 0x4d, 0xb6, 0xe5, 0x3f, 0x23, + 0xb9, 0x4e, 0xa8, 0xf9, 0xb8, 0x11, 0x77, 0xfb, + 0x3e, 0x51, 0xd2, 0x87, 0x29, 0xbc, 0x49, 0xec, + 0xf9, 0x47, 0x4a, 0x1c, 0xa6, 0xf1, 0x26, 0xdb, + 0x72, 0x9f, 0x91, 0xdc, 0xa7, 0x54, 0x7c, 0xdc, + 0x08, 0xbb, 0xfd, 0x9f, 0x28, 0xe9, 0x43, 0x94, + 0xde, 0x24, 0xf6, 0x7c, 0xa3, 0xa5, 0x0e, 0x53, + 0x78, 0x93, 0x6d, 0xb9, 0x4f, 0xc8, 0xee, 0x53, + 0xaa, 0x3e, 0x6e, 0x04, 0x5d, 0xfe, 0xcf, 0x94, + 0x74, 0xa1, 0xca, 0x6f, 0x12, 0x7b, 0x3e, 0x51, + 0xd2, 0xc7, 0x29, 0xbc, 0x49, 0xb6, 0xdc, 0xa7, + 0xe4, 0x77, 0x29, 0xd5, 0x1f, 0x37, 0x02, 0x2e, + 0xff, 0x00, 0x66, 0xca, 0x77, 0x2e, 0xf4, 0xf9, + 0xcd, 0xe2, 0x59, 0x76, 0x54, 0x1c, 0xd2, 0xeb, + 0x79, 0x83, 0xfb, 0x06, 0x9a, 0x7b, 0xa9, 0xa4, + 0xc7, 0x8c, 0x4a, 0x62, 0xf4, 0x9e, 0x11, 0x68, + 0x94, 0x7a, 0x2f, 0x52, 0x45, 0x24, 0x4f, 0xc1, + 0x23, 0x4b, 0x5d, 0xbc, 0x57, 0x95, 0x09, 0x11, + 0x11, 0x01, 0x11, 0x3b, 0x08, 0x08, 0xba, 0xad, + 0xf2, 0xe9, 0xe6, 0x01, 0xd4, 0x0c, 0x66, 0xe3, + 0x9d, 0xc4, 0xb7, 0xba, 0xc7, 0x2f, 0x8f, 0x44, + 0xd7, 0x34, 0x77, 0x6d, 0xa3, 0xbc, 0x9e, 0x3e, + 0x11, 0x33, 0xf8, 0x22, 0x6d, 0x11, 0xe3, 0x31, + 0x08, 0xe4, 0x5d, 0xfe, 0xcf, 0x94, 0x74, 0xa1, + 0xca, 0x6f, 0x12, 0x7b, 0x3e, 0x51, 0xd2, 0x87, + 0x29, 0xbc, 0x4a, 0x76, 0xdb, 0x94, 0xfc, 0x91, + 0xdc, 0xa7, 0x54, 0x7c, 0xdc, 0x08, 0xbb, 0xfd, + 0x9f, 0x28, 0xe9, 0x43, 0x94, 0xde, 0x24, 0xf6, + 0x7c, 0xa3, 0xa5, 0x0e, 0x53, 0x78, 0x93, 0x6d, + 0xb9, 0x4f, 0xc8, 0xee, 0x53, 0xaa, 0x3e, 0x6e, + 0x04, 0x5d, 0xfe, 0xcf, 0x94, 0x74, 0xa1, 0xca, + 0x6f, 0x12, 0x7b, 0x3e, 0x51, 0xd2, 0x87, 0x29, + 0xbc, 0x49, 0xb6, 0xdc, 0xa7, 0xe4, 0x77, 0x29, + 0xd5, 0x1f, 0x37, 0x02, 0x2e, 0xff, 0x00, 0x67, + 0xca, 0x3a, 0x50, 0xe5, 0x37, 0x89, 0x3d, 0x9f, + 0x28, 0xe9, 0x43, 0x94, 0xde, 0x24, 0xdb, 0x6e, + 0x53, 0xf2, 0x3b, 0x94, 0xea, 0x8f, 0x9b, 0x81, + 0x17, 0x7f, 0xb3, 0xe5, 0x1d, 0x28, 0x72, 0x9b, + 0xc4, 0x9e, 0xcf, 0x94, 0x74, 0xa1, 0xca, 0x6f, + 0x12, 0x6d, 0xb7, 0x29, 0xf9, 0x1d, 0xca, 0x75, + 0x47, 0xcd, 0xc0, 0x8b, 0xbf, 0xd9, 0xf2, 0x8e, + 0x94, 0x39, 0x4d, 0xe2, 0x4f, 0x67, 0xca, 0x3a, + 0x50, 0xe5, 0x37, 0x89, 0x36, 0xdb, 0x94, 0xfc, + 0x8e, 0xe5, 0x3a, 0xa3, 0xe6, 0xe0, 0x45, 0xdf, + 0xec, 0xf9, 0x47, 0x4a, 0x1c, 0xa6, 0xf1, 0x27, + 0xb3, 0xe5, 0x1d, 0x28, 0x72, 0x9b, 0xc4, 0x9b, + 0x6d, 0xca, 0x7e, 0x47, 0x72, 0x9d, 0x51, 0xf3, + 0x70, 0x22, 0xef, 0xf6, 0x7c, 0xa3, 0xa5, 0x0e, + 0x53, 0x78, 0x93, 0xd9, 0xf2, 0x8e, 0x94, 0x39, + 0x4d, 0xe2, 0x4d, 0xb6, 0xe5, 0x3f, 0x23, 0xb9, + 0x4e, 0xa8, 0xf9, 0xb8, 0x11, 0x77, 0xfb, 0x3e, + 0x51, 0xd2, 0x87, 0x29, 0xbc, 0x49, 0xec, 0xf9, + 0x47, 0x4a, 0x1c, 0xa6, 0xf1, 0x26, 0xdb, 0x72, + 0x9f, 0x91, 0xdc, 0xa7, 0x54, 0x7c, 0xdc, 0x08, + 0xbb, 0xfd, 0x9f, 0x28, 0xe9, 0x43, 0x94, 0xde, + 0x24, 0xf6, 0x7c, 0xa3, 0xa5, 0x0e, 0x53, 0x78, + 0x93, 0x6d, 0xb9, 0x4f, 0xc8, 0xee, 0x53, 0xaa, + 0x3e, 0x6e, 0x04, 0x5d, 0xfe, 0xcf, 0x94, 0x74, + 0xa1, 0xca, 0x6f, 0x12, 0x7b, 0x3e, 0x51, 0xd2, + 0x87, 0x29, 0xbc, 0x49, 0xb6, 0xdc, 0xa7, 0xe4, + 0x77, 0x29, 0xd5, 0x1f, 0x37, 0x02, 0x2e, 0xff, + 0x00, 0x67, 0xca, 0x3a, 0x50, 0xe5, 0x37, 0x89, + 0x3d, 0x9f, 0x28, 0xe9, 0x43, 0x94, 0xde, 0x24, + 0xdb, 0x6e, 0x53, 0xf2, 0x3b, 0x94, 0xea, 0x8f, + 0x9b, 0x81, 0x17, 0x7f, 0xb3, 0xe5, 0x1d, 0x28, + 0x72, 0x9b, 0xc4, 0x9e, 0xcf, 0x94, 0x74, 0xa1, + 0xca, 0x6f, 0x12, 0x6d, 0xb7, 0x29, 0xf9, 0x1d, + 0xca, 0x75, 0x47, 0xcd, 0xc0, 0x8b, 0xbf, 0xd9, + 0xf2, 0x8e, 0x94, 0x39, 0x4d, 0xe2, 0x4f, 0x67, + 0xca, 0x3a, 0x50, 0xe5, 0x37, 0x89, 0x36, 0xdb, + 0x94, 0xfc, 0x8e, 0xe5, 0x3a, 0xa3, 0xe6, 0xe0, + 0x45, 0xdf, 0xec, 0xf9, 0x47, 0x4a, 0x1c, 0xa6, + 0xf1, 0x27, 0xb3, 0xe5, 0x1d, 0x28, 0x72, 0x9b, + 0xc4, 0x9b, 0x6d, 0xca, 0x7e, 0x47, 0x72, 0x9d, + 0x51, 0xf3, 0x70, 0x22, 0xef, 0xf6, 0x7c, 0xa3, + 0xa5, 0x0e, 0x53, 0x78, 0x93, 0xd9, 0xf2, 0x8e, + 0x94, 0x39, 0x4d, 0xe2, 0x4d, 0xb6, 0xe5, 0x3f, + 0x23, 0xb9, 0x4e, 0xa8, 0xf9, 0xb8, 0x11, 0x77, + 0xfb, 0x3e, 0x51, 0xd2, 0x87, 0x29, 0xbc, 0x49, + 0xec, 0xf9, 0x47, 0x4a, 0x1c, 0xa6, 0xf1, 0x26, + 0xdb, 0x72, 0x9f, 0x91, 0xdc, 0xa7, 0x54, 0x7c, + 0xdc, 0x08, 0xbb, 0xfd, 0x9f, 0x28, 0xe9, 0x43, + 0x94, 0xde, 0x24, 0xf6, 0x7c, 0xa3, 0xa5, 0x0e, + 0x53, 0x78, 0x93, 0x6d, 0xb9, 0x4f, 0xc8, 0xee, + 0x53, 0xaa, 0x3e, 0x6e, 0x04, 0x5d, 0xfe, 0xcf, + 0x94, 0x74, 0xa1, 0xca, 0x6f, 0x12, 0x7b, 0x3e, + 0x51, 0xd2, 0x87, 0x29, 0xbc, 0x49, 0xb6, 0xdc, + 0xa7, 0xe4, 0x77, 0x29, 0xd5, 0x1f, 0x37, 0x02, + 0x2e, 0xff, 0x00, 0x67, 0xca, 0x3a, 0x50, 0xe5, + 0x37, 0x89, 0x3d, 0x9f, 0x28, 0xe9, 0x43, 0x94, + 0xde, 0x24, 0xdb, 0x6e, 0x53, 0xf2, 0x3b, 0x94, + 0xea, 0x8f, 0x9b, 0x81, 0x17, 0x7f, 0xb3, 0xe5, + 0x1d, 0x28, 0x72, 0x9b, 0xc4, 0x9e, 0xcf, 0x94, + 0x74, 0xa1, 0xca, 0x6f, 0x12, 0x6d, 0xb7, 0x29, + 0xf9, 0x1d, 0xca, 0x75, 0x47, 0xcd, 0xc0, 0x8a, + 0x44, 0x59, 0xe5, 0xcf, 0x34, 0x8e, 0xeb, 0x4e, + 0xf5, 0x5a, 0x56, 0xa9, 0xb2, 0xab, 0x88, 0xc6, + 0x28, 0xc8, 0x95, 0xbf, 0xd5, 0xd0, 0x78, 0x12, + 0x62, 0x63, 0xc6, 0x26, 0x13, 0x16, 0xac, 0xf8, + 0x4c, 0x4b, 0x8d, 0x16, 0x16, 0x54, 0x24, 0x44, + 0x58, 0x41, 0x94, 0x5d, 0x36, 0xd9, 0x7d, 0xc5, + 0xc0, 0x0e, 0x1e, 0x24, 0x67, 0xf3, 0x9d, 0xba, + 0x3b, 0x0b, 0xa1, 0xd6, 0x16, 0x51, 0x00, 0x25, + 0xb9, 0x0d, 0x3b, 0xd5, 0x01, 0x34, 0x99, 0xf0, + 0xe2, 0x89, 0x98, 0x8f, 0x19, 0x88, 0xf8, 0xf0, + 0x47, 0x22, 0xef, 0xf6, 0x7c, 0xa7, 0xa5, 0x0e, + 0x53, 0x78, 0x93, 0xd9, 0xf2, 0x8e, 0x94, 0x39, + 0x4d, 0xe2, 0x53, 0xb6, 0xdc, 0xa5, 0x1d, 0xca, + 0x75, 0x47, 0xcd, 0xc0, 0x8b, 0xbf, 0xd9, 0xf2, + 0x8e, 0x94, 0x39, 0x4d, 0xe2, 0x4f, 0x67, 0xca, + 0x3a, 0x50, 0xe5, 0x37, 0x89, 0x36, 0xdb, 0x94, + 0xfc, 0x8e, 0xe5, 0x3a, 0xa3, 0xe6, 0xe0, 0x45, + 0xdf, 0xec, 0xf9, 0x47, 0x4a, 0x1c, 0xa6, 0xf1, + 0x27, 0xb3, 0xe5, 0x1d, 0x28, 0x72, 0x9b, 0xc4, + 0x9b, 0x6d, 0xca, 0x7e, 0x47, 0x72, 0x9d, 0x51, + 0xf3, 0x70, 0x22, 0xef, 0xf6, 0x7c, 0xa3, 0xa5, + 0x0e, 0x53, 0x78, 0x93, 0xd9, 0xf2, 0x8e, 0x94, + 0x39, 0x4d, 0xe2, 0x4d, 0xb6, 0xe5, 0x3f, 0x23, + 0xb9, 0x4e, 0xa8, 0xf9, 0xb8, 0x11, 0x77, 0xfb, + 0x3e, 0x51, 0xd2, 0x87, 0x29, 0xbc, 0x49, 0xec, + 0xf9, 0x47, 0x4a, 0x1c, 0xa6, 0xf1, 0x26, 0xdb, + 0x72, 0x9f, 0x91, 0xdc, 0xa7, 0x54, 0x7c, 0xdc, + 0x08, 0xbb, 0xfd, 0x9f, 0x28, 0xe9, 0x43, 0x94, + 0xde, 0x24, 0xf6, 0x7c, 0xa3, 0xa5, 0x0e, 0x53, + 0x78, 0x93, 0x6d, 0xb9, 0x4f, 0xc8, 0xee, 0x53, + 0xaa, 0x3e, 0x6e, 0x04, 0x5d, 0xfe, 0xcf, 0x94, + 0x74, 0xa1, 0xca, 0x6f, 0x12, 0x7b, 0x3e, 0x51, + 0xd2, 0x87, 0x29, 0xbc, 0x49, 0xb6, 0xdc, 0xa7, + 0xe4, 0x77, 0x29, 0xd5, 0x1f, 0x37, 0x02, 0x2e, + 0xff, 0x00, 0x67, 0xca, 0x3a, 0x50, 0xe5, 0x37, + 0x89, 0x3d, 0x9f, 0x28, 0xe9, 0x43, 0x94, 0xde, + 0x24, 0xdb, 0x6e, 0x53, 0xf2, 0x3b, 0x94, 0xea, + 0x8f, 0x9b, 0x81, 0x17, 0x7f, 0xb3, 0xe5, 0x1d, + 0x28, 0x72, 0x9b, 0xc4, 0x9e, 0xcf, 0x94, 0x74, + 0xa1, 0xca, 0x6f, 0x12, 0x6d, 0xb7, 0x29, 0xf9, + 0x1d, 0xca, 0x75, 0x47, 0xcd, 0xc0, 0x8b, 0xbf, + 0xd9, 0xf2, 0x8e, 0x94, 0x39, 0x4d, 0xe2, 0x4f, + 0x67, 0xca, 0x3a, 0x50, 0xe5, 0x37, 0x89, 0x36, + 0xdb, 0x94, 0xfc, 0x8e, 0xe5, 0x3a, 0xa3, 0xe6, + 0xe0, 0x45, 0xdf, 0xec, 0xf9, 0x47, 0x4a, 0x1c, + 0xa6, 0xf1, 0x27, 0xb3, 0xe5, 0x1d, 0x28, 0x72, + 0x9b, 0xc4, 0x9b, 0x6d, 0xca, 0x7e, 0x47, 0x72, + 0x9d, 0x51, 0xf3, 0x70, 0x22, 0xef, 0xf6, 0x7c, + 0xa3, 0xa5, 0x0e, 0x53, 0x78, 0x93, 0xd9, 0xf2, + 0x8e, 0x94, 0x39, 0x4d, 0xe2, 0x4d, 0xb6, 0xe5, + 0x3f, 0x23, 0xb9, 0x4e, 0xa8, 0xf9, 0xb8, 0x11, + 0x77, 0xfb, 0x3e, 0x51, 0xd2, 0x87, 0x29, 0xbc, + 0x49, 0xec, 0xf9, 0x47, 0x4a, 0x1c, 0xa6, 0xf1, + 0x26, 0xdb, 0x72, 0x9f, 0x91, 0xdc, 0xa7, 0x54, + 0x7c, 0xdc, 0x08, 0xbb, 0xfd, 0x9f, 0x28, 0xe9, + 0x43, 0x94, 0xde, 0x24, 0xf6, 0x7c, 0xa3, 0xa5, + 0x0e, 0x53, 0x78, 0x93, 0x6d, 0xb9, 0x4f, 0xc8, + 0xee, 0x53, 0xaa, 0x3e, 0x6e, 0x04, 0x5d, 0xfe, + 0xcf, 0x94, 0x74, 0xa1, 0xca, 0x6f, 0x12, 0x7b, + 0x3e, 0x51, 0xd2, 0x87, 0x29, 0xbc, 0x49, 0xb6, + 0xdc, 0xa7, 0xe4, 0x77, 0x29, 0xd5, 0x1f, 0x37, + 0x02, 0x2e, 0xff, 0x00, 0x67, 0xca, 0x3a, 0x50, + 0xe5, 0x37, 0x89, 0x3d, 0x9f, 0x28, 0xe9, 0x43, + 0x94, 0xde, 0x24, 0xdb, 0x6e, 0x53, 0xf2, 0x3b, + 0x94, 0xea, 0x8f, 0x9b, 0x81, 0x17, 0x7f, 0xb3, + 0xe5, 0x1d, 0x28, 0x72, 0x9b, 0xc4, 0x9e, 0xcf, + 0x94, 0x74, 0xa1, 0xca, 0x6f, 0x12, 0x6d, 0xb7, + 0x29, 0xf9, 0x1d, 0xca, 0x75, 0x47, 0xcd, 0xc0, + 0x8b, 0xbf, 0xd9, 0xf2, 0x8e, 0x94, 0x39, 0x4d, + 0xe2, 0x4f, 0x67, 0xca, 0x3a, 0x50, 0xe5, 0x37, + 0x89, 0x36, 0xdb, 0x94, 0xfc, 0x8e, 0xe5, 0x3a, + 0xa3, 0xe6, 0xe0, 0x45, 0xdf, 0xec, 0xf9, 0x47, + 0x4a, 0x1c, 0xa6, 0xf1, 0x27, 0xb3, 0xe5, 0x1d, + 0x28, 0x72, 0x9b, 0xc4, 0x9b, 0x6d, 0xca, 0x7e, + 0x47, 0x72, 0x9d, 0x51, 0xf3, 0x70, 0x22, 0xef, + 0xf6, 0x7c, 0xa3, 0xa5, 0x0e, 0x53, 0x78, 0x93, + 0xd9, 0xf2, 0x8e, 0x94, 0x39, 0x4d, 0xe2, 0x4d, + 0xb6, 0xe5, 0x3f, 0x23, 0xb9, 0x4e, 0xa8, 0xf9, + 0xb8, 0x11, 0x77, 0xfb, 0x3e, 0x51, 0xd2, 0x87, + 0x29, 0xbc, 0x49, 0xec, 0xd9, 0x4f, 0x4a, 0x1c, + 0xa6, 0xf1, 0x26, 0xdb, 0x72, 0x9f, 0x91, 0xdc, + 0xa7, 0x54, 0x7c, 0xdc, 0x08, 0xa4, 0x05, 0x9e, + 0x58, 0xf3, 0x85, 0x97, 0x55, 0x71, 0xd5, 0xe3, + 0x37, 0x89, 0x78, 0x9f, 0x2a, 0x99, 0xa3, 0x14, + 0x4e, 0x12, 0xb7, 0xfa, 0xba, 0x0a, 0x89, 0x89, + 0x8f, 0x62, 0x62, 0xd1, 0x3f, 0x6c, 0xc4, 0xfe, + 0x2e, 0x24, 0x4d, 0x3b, 0xbd, 0xad, 0x3a, 0xd1, + 0x12, 0xf7, 0x0f, 0xed, 0x99, 0xe7, 0x37, 0xc2, + 0xa5, 0xd4, 0x3c, 0x3f, 0xb6, 0x67, 0x9c, 0xd5, + 0x2f, 0x53, 0xbe, 0x50, 0x65, 0x47, 0x66, 0x7e, + 0xf5, 0x69, 0xf6, 0x9f, 0x28, 0x52, 0x15, 0x3b, + 0xe5, 0x47, 0xe6, 0x44, 0xfb, 0x4d, 0xa7, 0xda, + 0x7c, 0xa1, 0x06, 0x32, 0xcf, 0x7a, 0xbc, 0xf3, + 0xcf, 0x84, 0xa9, 0x15, 0x1d, 0x96, 0x7b, 0xd5, + 0xe7, 0x9e, 0x7c, 0x25, 0x48, 0xa0, 0x15, 0x0e, + 0xf7, 0x17, 0x3d, 0xce, 0x3b, 0xa5, 0x4b, 0xbb, + 0x51, 0x50, 0xe7, 0x59, 0x40, 0x5b, 0xad, 0x2d, + 0x9d, 0x73, 0x30, 0x60, 0xd0, 0xdd, 0x6f, 0x3d, + 0x85, 0xa6, 0x8b, 0xbe, 0x39, 0x0d, 0x96, 0x53, + 0x25, 0xcb, 0x74, 0x3e, 0x4f, 0x24, 0xf6, 0x49, + 0xc2, 0xd4, 0x88, 0x99, 0x9d, 0x23, 0xda, 0x8b, + 0x5a, 0x2b, 0x13, 0x69, 0xf0, 0x86, 0xac, 0xcb, + 0x36, 0x65, 0xb7, 0xfd, 0x9d, 0x8e, 0x8c, 0x1a, + 0x1e, 0xfd, 0xe3, 0xfd, 0x5e, 0xcf, 0x65, 0x42, + 0x49, 0x23, 0xe4, 0x76, 0x37, 0x92, 0xe7, 0x6f, + 0x9d, 0x27, 0xbe, 0xb5, 0x63, 0x27, 0x49, 0xd6, + 0x74, 0x94, 0xc4, 0xb7, 0x63, 0xa4, 0x52, 0x34, + 0x87, 0x87, 0x97, 0x3d, 0xf2, 0xda, 0x66, 0x67, + 0x86, 0xbc, 0x34, 0xe4, 0xd9, 0x54, 0xaa, 0xd7, + 0x89, 0x31, 0x2e, 0x9a, 0xb9, 0xe8, 0xd9, 0x54, + 0xaa, 0xd6, 0x09, 0x26, 0x80, 0x54, 0x9d, 0x40, + 0x6e, 0xae, 0x8f, 0x61, 0xbe, 0x2d, 0xc5, 0xcc, + 0x3f, 0x0d, 0x2b, 0x5c, 0x25, 0x46, 0xe8, 0xe6, + 0x9a, 0xd2, 0xd3, 0xec, 0x99, 0x6b, 0xaa, 0x55, + 0x78, 0x35, 0x04, 0x82, 0x28, 0x46, 0xb0, 0x74, + 0x15, 0x8c, 0x4a, 0x75, 0x46, 0x93, 0xed, 0x6c, + 0xaa, 0x55, 0x6b, 0xc4, 0x98, 0x93, 0x59, 0x1b, + 0x2a, 0x95, 0x5a, 0xf1, 0x26, 0x24, 0xd6, 0x4d, + 0x1b, 0x2a, 0x95, 0x5a, 0xeb, 0xc6, 0x95, 0x4d, + 0x7d, 0xe9, 0xd2, 0x7d, 0xf0, 0xd9, 0x54, 0xaa, + 0xd7, 0x89, 0x31, 0x26, 0xb2, 0x86, 0xca, 0xa5, + 0x56, 0xbc, 0x4b, 0x2d, 0xc4, 0xf7, 0x61, 0x60, + 0x2e, 0x71, 0xad, 0x00, 0xd2, 0x4d, 0x01, 0x3f, + 0x22, 0x6a, 0x4e, 0xba, 0x70, 0x7b, 0xaa, 0x55, + 0x79, 0x7b, 0x24, 0x8e, 0x9c, 0xe3, 0x4b, 0x09, + 0xd2, 0x03, 0x81, 0x15, 0x5e, 0x71, 0x28, 0xdc, + 0x5a, 0xb3, 0x13, 0xc5, 0xb2, 0xa9, 0x54, 0x6c, + 0x33, 0xb8, 0x55, 0xb1, 0xb8, 0xb4, 0xea, 0x21, + 0xa6, 0x85, 0x1d, 0x0c, 0xec, 0x18, 0x9d, 0x1b, + 0xc3, 0x77, 0xf0, 0x94, 0xdd, 0xef, 0x84, 0xec, + 0xbf, 0x29, 0x2a, 0x95, 0x5a, 0xf1, 0x04, 0xc4, + 0xa7, 0x59, 0x47, 0xcd, 0xb2, 0xa9, 0x55, 0xaf, + 0x12, 0x62, 0x4d, 0x64, 0xd1, 0xb2, 0xa9, 0x55, + 0xe5, 0x81, 0xf2, 0x3c, 0x32, 0x36, 0x97, 0xb8, + 0xea, 0x03, 0x49, 0x5e, 0xa5, 0x8a, 0x68, 0x69, + 0xce, 0xb1, 0xd1, 0xe2, 0xad, 0x31, 0x0a, 0x6a, + 0xff, 0x00, 0xe5, 0x46, 0xee, 0x3a, 0x6b, 0xc5, + 0x3b, 0x67, 0x4d, 0x78, 0xe9, 0x1c, 0x27, 0xe2, + 0x55, 0x2a, 0xb5, 0xe2, 0x4c, 0x4a, 0x75, 0x94, + 0x36, 0x55, 0x2a, 0xbc, 0xb1, 0x92, 0x49, 0x5c, + 0x0d, 0x73, 0xe9, 0xaf, 0x08, 0x27, 0xc0, 0xb0, + 0xe0, 0xe6, 0x38, 0xb5, 0xe0, 0xb5, 0xc3, 0x58, + 0x3a, 0x0a, 0x8d, 0x7d, 0xe9, 0xdb, 0x3e, 0x33, + 0xae, 0x8f, 0x75, 0x4a, 0xad, 0x78, 0x93, 0x12, + 0x9d, 0x65, 0x0d, 0x95, 0x4a, 0xad, 0x78, 0x93, + 0x12, 0x6b, 0x23, 0x65, 0x52, 0xab, 0x5e, 0x24, + 0xc4, 0x9a, 0xc8, 0xd9, 0x54, 0xaa, 0xd7, 0x89, + 0x7a, 0x63, 0x5f, 0x21, 0x22, 0x36, 0x97, 0x10, + 0x2a, 0x40, 0x04, 0xee, 0x81, 0xf2, 0xa4, 0x4f, + 0xbd, 0x31, 0x13, 0x3c, 0x23, 0x59, 0x7a, 0xaa, + 0x55, 0x79, 0x7b, 0x5e, 0xc7, 0x61, 0x7b, 0x4b, + 0x5d, 0xbc, 0x45, 0x0a, 0xf3, 0x89, 0x35, 0x26, + 0x26, 0x27, 0x49, 0xf1, 0x6c, 0xaa, 0x55, 0x6b, + 0xc4, 0x98, 0x93, 0x59, 0x43, 0x65, 0x42, 0xd9, + 0x15, 0xc4, 0xb0, 0x38, 0x3a, 0x17, 0x98, 0xc8, + 0xdd, 0x05, 0x73, 0xe2, 0x4c, 0x4a, 0x27, 0x8c, + 0x69, 0x3c, 0x53, 0x13, 0x31, 0x31, 0x31, 0x33, + 0x1f, 0x05, 0x96, 0xca, 0xfa, 0x2c, 0xd6, 0x2f, + 0x67, 0xb8, 0x01, 0xb7, 0x0d, 0x15, 0x69, 0x1e, + 0x10, 0xb8, 0xa5, 0x89, 0xf0, 0xc8, 0xe8, 0xde, + 0x28, 0xe6, 0x9a, 0x7f, 0x4a, 0x8a, 0x86, 0x77, + 0xc1, 0x2b, 0x26, 0x8c, 0xd1, 0xec, 0x20, 0x83, + 0xdd, 0xd5, 0xdd, 0x56, 0x3c, 0xcc, 0x36, 0x68, + 0x60, 0xbb, 0x6e, 0x8e, 0x75, 0xb4, 0xee, 0x1d, + 0x2b, 0x1e, 0x6c, 0x71, 0x5b, 0x6b, 0x1e, 0x12, + 0xf5, 0x7c, 0x9e, 0x79, 0xc9, 0x13, 0x16, 0xf1, + 0xaf, 0xe8, 0x47, 0xa2, 0x22, 0xe4, 0xd6, 0x2e, + 0xeb, 0x2b, 0x68, 0x59, 0x13, 0xaf, 0x2e, 0x74, + 0x47, 0x1d, 0x4b, 0x01, 0xec, 0x6e, 0xae, 0x26, + 0x34, 0xbd, 0xed, 0x60, 0xfc, 0xe2, 0x07, 0x0e, + 0x85, 0xb7, 0x68, 0xee, 0x0b, 0x1b, 0x15, 0x8b, + 0x34, 0x30, 0x0c, 0x4e, 0x1d, 0xaf, 0x14, 0x05, + 0x6a, 0x57, 0x75, 0xa2, 0x1c, 0xb3, 0x64, 0x8c, + 0x74, 0xb5, 0xbd, 0xba, 0x70, 0xf8, 0xb9, 0xaf, + 0xf3, 0x8b, 0x8b, 0x97, 0x61, 0x8c, 0x98, 0xe2, + 0x1a, 0x9a, 0xdd, 0x04, 0xd7, 0xe7, 0x2e, 0x0c, + 0x45, 0x6b, 0xc5, 0xbe, 0x98, 0x96, 0xf8, 0x88, + 0xac, 0x69, 0x10, 0xf1, 0x6f, 0x7b, 0x5e, 0x77, + 0x5a, 0x67, 0x8b, 0x61, 0x21, 0x2a, 0xb5, 0xe2, + 0x4a, 0xff, 0x00, 0x4a, 0x9d, 0x79, 0xab, 0xe1, + 0xcd, 0xb2, 0xa9, 0x55, 0x98, 0xad, 0xae, 0xa6, + 0x18, 0xa2, 0x89, 0xef, 0x1b, 0xe1, 0xa5, 0x79, + 0x96, 0x39, 0xa1, 0x21, 0xb2, 0xb1, 0xcc, 0x27, + 0xe7, 0x0a, 0x28, 0xdf, 0x1c, 0xd3, 0xb2, 0xd1, + 0x1a, 0xcc, 0x4b, 0x35, 0x4a, 0xad, 0x78, 0x93, + 0x12, 0x9d, 0x65, 0x0d, 0x95, 0x4a, 0xad, 0x78, + 0x93, 0x12, 0x6b, 0x23, 0x65, 0x52, 0xab, 0x5e, + 0x24, 0xc4, 0x9a, 0xc8, 0xd9, 0x54, 0xaa, 0xd7, + 0x89, 0x31, 0x26, 0xb2, 0x36, 0x55, 0x2a, 0xb5, + 0xe2, 0x4c, 0x49, 0xac, 0x8d, 0x95, 0x4a, 0xad, + 0x78, 0x93, 0x12, 0x6b, 0x23, 0x65, 0x52, 0xab, + 0x5e, 0x24, 0xc4, 0x9a, 0xc8, 0xd9, 0x54, 0xaa, + 0x08, 0x2e, 0x1c, 0x01, 0x6c, 0x4f, 0x20, 0xe9, + 0x04, 0x34, 0xd1, 0x61, 0xd1, 0x4c, 0xc1, 0x89, + 0xf1, 0xbd, 0xa3, 0x7c, 0xb4, 0xa8, 0xdd, 0x1c, + 0xe1, 0x6d, 0x97, 0xe5, 0x2c, 0xd5, 0x2a, 0xb5, + 0xe2, 0xef, 0xa6, 0x25, 0x3a, 0xf2, 0x57, 0xe6, + 0xd9, 0x54, 0xaa, 0xd7, 0x89, 0x31, 0x26, 0xa6, + 0x8d, 0x95, 0x4a, 0xaf, 0x31, 0xb2, 0x49, 0x5d, + 0x82, 0x36, 0x97, 0xb8, 0xfe, 0x68, 0xd2, 0x56, + 0x65, 0x8a, 0x68, 0x48, 0x12, 0xb1, 0xcc, 0x27, + 0x48, 0x04, 0x76, 0x68, 0x9b, 0xa3, 0x5d, 0x35, + 0x4e, 0xd9, 0xd3, 0x5e, 0x3a, 0x33, 0x54, 0xaa, + 0xd7, 0x89, 0x31, 0x26, 0xb2, 0x8f, 0x7b, 0x65, + 0x52, 0xab, 0x0c, 0x8e, 0x59, 0x2a, 0x63, 0x63, + 0x9e, 0x06, 0xbc, 0x20, 0x9d, 0x6b, 0xcb, 0x89, + 0x6b, 0x8b, 0x5d, 0xa1, 0xc3, 0x58, 0x22, 0x94, + 0x51, 0x16, 0xd6, 0x74, 0x8f, 0x14, 0xcc, 0x4c, + 0x46, 0xb3, 0x12, 0xf7, 0x54, 0xaa, 0xd7, 0x89, + 0x31, 0x29, 0xd5, 0x1a, 0x36, 0x55, 0x2a, 0xb5, + 0xe2, 0x4c, 0x49, 0xac, 0x8d, 0x95, 0x4a, 0xad, + 0x78, 0x93, 0x12, 0x6b, 0x23, 0x65, 0x52, 0xab, + 0x5e, 0x25, 0xed, 0x8c, 0x92, 0x42, 0xe1, 0x1b, + 0x5c, 0xf2, 0xdd, 0x78, 0x41, 0x29, 0xaf, 0xbd, + 0x31, 0x59, 0x9d, 0x34, 0xe2, 0xcd, 0x52, 0xab, + 0xc3, 0x83, 0x98, 0xe2, 0xd7, 0x82, 0xd7, 0x0d, + 0x60, 0x8a, 0x15, 0x8c, 0x49, 0xaa, 0x34, 0xf8, + 0xb6, 0x55, 0x2a, 0xb5, 0xe2, 0x4c, 0x49, 0xac, + 0x8d, 0x95, 0xe1, 0xdf, 0x5d, 0x76, 0x59, 0x9d, + 0xcd, 0xa3, 0x86, 0x17, 0x17, 0xc7, 0xf9, 0xd1, + 0xb8, 0xe8, 0xee, 0x2e, 0x0c, 0x49, 0x89, 0x44, + 0xc4, 0x5b, 0x84, 0xc6, 0xab, 0x56, 0xd6, 0xa4, + 0xee, 0xac, 0xcf, 0x05, 0x9a, 0x78, 0xe0, 0xbe, + 0xb6, 0x17, 0xb6, 0xbe, 0x55, 0x2b, 0x23, 0x77, + 0xe9, 0xae, 0xbd, 0x90, 0xa3, 0xd6, 0x36, 0x72, + 0xe8, 0xc7, 0x7b, 0xcc, 0x1f, 0x22, 0x71, 0xa4, + 0x6e, 0x62, 0x68, 0x3a, 0x7b, 0xa1, 0x6e, 0xbb, + 0x8b, 0x99, 0xb9, 0x92, 0x31, 0xa8, 0x3a, 0xa3, + 0xbb, 0xa5, 0x61, 0xc9, 0x5d, 0xb6, 0xd1, 0xec, + 0xf9, 0x7c, 0xdd, 0xdc, 0x71, 0x3e, 0xd8, 0xe0, + 0xd4, 0xbb, 0x6c, 0x2d, 0x58, 0x5a, 0x6e, 0xae, + 0x34, 0x43, 0x1e, 0x91, 0xd9, 0x21, 0x71, 0x34, + 0x17, 0x38, 0x34, 0x7e, 0x71, 0xa2, 0xe8, 0xda, + 0x09, 0xfd, 0x9e, 0xde, 0x0b, 0x28, 0xcd, 0x03, + 0x86, 0x27, 0xf6, 0x40, 0xd5, 0xdf, 0x55, 0xad, + 0x77, 0x5a, 0x21, 0x7c, 0xd9, 0x23, 0x1e, 0x39, + 0xb4, 0xfb, 0x3f, 0x4b, 0x9f, 0x30, 0xce, 0xa6, + 0xb9, 0x71, 0x8e, 0x02, 0x62, 0x80, 0x68, 0xf1, + 0x75, 0xb8, 0x28, 0xdc, 0x5a, 0x7b, 0x3b, 0xfa, + 0xd6, 0xb0, 0x68, 0x28, 0x98, 0x96, 0xfa, 0xd2, + 0xb5, 0xe1, 0x10, 0xf1, 0x32, 0x64, 0xb6, 0x49, + 0xd6, 0xf3, 0xaf, 0xbb, 0xd8, 0xd9, 0x54, 0xaa, + 0xd7, 0x89, 0x31, 0x2b, 0x6b, 0x2a, 0x68, 0xd9, + 0x54, 0xaa, 0xd7, 0x89, 0x31, 0x26, 0xb2, 0x36, + 0x55, 0x2a, 0xb5, 0xe2, 0x4c, 0x49, 0xac, 0x8d, + 0x95, 0x4a, 0xad, 0x78, 0x93, 0x12, 0x6b, 0x23, + 0x65, 0x52, 0xab, 0x5e, 0x24, 0xc4, 0x9a, 0xc8, + 0xd9, 0x54, 0xaa, 0xd7, 0x89, 0x31, 0x26, 0xb2, + 0x36, 0x55, 0x2a, 0xb5, 0xe2, 0x4c, 0x49, 0xac, + 0x8d, 0x95, 0x4a, 0xad, 0x65, 0xd4, 0xd2, 0x57, + 0x63, 0x32, 0xac, 0xc5, 0xec, 0x6b, 0xdb, 0x09, + 0x2d, 0x70, 0xa8, 0x3a, 0x35, 0x15, 0x13, 0x6d, + 0x3c, 0x65, 0x6a, 0xe3, 0xb5, 0xbe, 0xd8, 0x99, + 0x73, 0xd5, 0x2a, 0xbc, 0x3b, 0x13, 0x1c, 0x5a, + 0xe1, 0x42, 0xd2, 0x41, 0x1d, 0x90, 0xb1, 0x89, + 0x4e, 0xaa, 0xe9, 0x31, 0x3a, 0x4f, 0x8b, 0x65, + 0x52, 0xab, 0x5e, 0x24, 0xc4, 0x9a, 0xc8, 0xd9, + 0x54, 0xaa, 0xd7, 0x89, 0x31, 0x26, 0xb2, 0x36, + 0x55, 0x2a, 0xb6, 0xc1, 0x97, 0xde, 0xdc, 0x45, + 0xce, 0xc3, 0x11, 0x74, 0x7a, 0xb1, 0x68, 0xdc, + 0x5c, 0xc4, 0xd0, 0xd0, 0xeb, 0x0a, 0x22, 0xf1, + 0x3c, 0x22, 0x53, 0x35, 0xb4, 0x69, 0xae, 0xbc, + 0x78, 0xc7, 0xc1, 0xb2, 0xa9, 0x55, 0xaf, 0x12, + 0x62, 0x53, 0xac, 0xa1, 0xb2, 0xa9, 0x55, 0xaf, + 0x12, 0x62, 0x4d, 0x64, 0x6c, 0xaa, 0x55, 0x6b, + 0xc4, 0x98, 0x93, 0x59, 0x1b, 0x2a, 0x95, 0x5a, + 0xf1, 0x26, 0x24, 0xd6, 0x46, 0xca, 0xa5, 0x56, + 0xbc, 0x49, 0x89, 0x35, 0x91, 0xb2, 0xa9, 0x55, + 0xaf, 0x12, 0x62, 0x4d, 0x64, 0x6c, 0xaa, 0x55, + 0x6b, 0xc4, 0x98, 0x93, 0x59, 0x1b, 0x2a, 0x95, + 0x5a, 0xf1, 0x26, 0x24, 0xd6, 0x46, 0xca, 0xa5, + 0x56, 0xbc, 0x49, 0x89, 0x35, 0x91, 0xb0, 0x90, + 0x45, 0x0a, 0xea, 0xb4, 0xcc, 0xae, 0x6c, 0xdc, + 0x0c, 0x6f, 0x25, 0xa3, 0x5c, 0x6e, 0x24, 0xb4, + 0xae, 0x1c, 0x49, 0x5a, 0xa8, 0x98, 0x89, 0x8d, + 0x26, 0x35, 0x5a, 0xb6, 0xb5, 0x66, 0x26, 0xb3, + 0x31, 0x31, 0xc9, 0x67, 0x90, 0x41, 0x99, 0x5b, + 0x7b, 0x5d, 0xbf, 0x8b, 0x2b, 0x7c, 0xb6, 0xee, + 0xe8, 0xd6, 0x14, 0x77, 0x7b, 0xb0, 0xb5, 0xe4, + 0x37, 0x66, 0x1b, 0xe6, 0xc7, 0xf9, 0xb3, 0xf8, + 0xae, 0x1b, 0x95, 0x1a, 0x42, 0xeb, 0xbf, 0x88, + 0x43, 0x72, 0xf6, 0x8d, 0x47, 0xc6, 0x1d, 0xd5, + 0x8b, 0x2d, 0x36, 0xda, 0x63, 0xe4, 0xf6, 0x3c, + 0xb6, 0x69, 0xcb, 0x8f, 0x59, 0xfb, 0xa3, 0x84, + 0xb5, 0x43, 0xfb, 0x66, 0x79, 0xcd, 0xf0, 0xa9, + 0x75, 0x13, 0x0f, 0xed, 0xa3, 0xf3, 0x9b, 0xe1, + 0x52, 0xcb, 0x9b, 0xb8, 0xa3, 0xf3, 0x2f, 0x7a, + 0xb4, 0xfb, 0x4f, 0x94, 0x29, 0x05, 0x1f, 0x99, + 0x7b, 0xd5, 0xa7, 0xda, 0x7c, 0xa1, 0x06, 0x32, + 0xcf, 0x7a, 0xbc, 0xf3, 0xcf, 0x84, 0xa9, 0x15, + 0x1d, 0x96, 0x7b, 0xd5, 0xe7, 0x9e, 0x7c, 0x25, + 0x48, 0xa0, 0xc3, 0xb5, 0x15, 0x0e, 0x75, 0x95, + 0x30, 0xed, 0x45, 0x43, 0x9d, 0x65, 0x00, 0x6b, + 0x5d, 0x39, 0xc1, 0xa6, 0x43, 0x07, 0x65, 0xed, + 0xaf, 0xd2, 0x5c, 0xdb, 0xab, 0x7e, 0x78, 0x69, + 0x90, 0xdb, 0xf9, 0xed, 0xfe, 0xf2, 0xbe, 0x3f, + 0xbe, 0xbf, 0x17, 0x2f, 0x31, 0xfc, 0x2b, 0xfc, + 0x15, 0xec, 0x49, 0x89, 0x6b, 0xaa, 0x55, 0x6d, + 0xf6, 0xcb, 0xc5, 0xd3, 0x84, 0x7c, 0x1b, 0x31, + 0x26, 0x25, 0xae, 0xa8, 0x4a, 0x72, 0x34, 0xe4, + 0xb3, 0x6c, 0xc5, 0x9c, 0x66, 0x37, 0xde, 0x38, + 0x55, 0xc4, 0xe0, 0x65, 0x77, 0x00, 0x5e, 0xdb, + 0xb4, 0x64, 0xe6, 0x5e, 0xcc, 0x63, 0x6f, 0x32, + 0x5f, 0xcd, 0x87, 0x83, 0xe3, 0x57, 0x55, 0x74, + 0xae, 0x8d, 0x9b, 0x1f, 0xe5, 0x2c, 0x77, 0xf5, + 0x9f, 0xe1, 0x55, 0x17, 0x48, 0xe6, 0xcc, 0xe7, + 0xb5, 0xd4, 0x73, 0x5e, 0x48, 0x3d, 0x9a, 0xeb, + 0x5c, 0x2b, 0x58, 0xbe, 0x4b, 0xc5, 0xbd, 0x9e, + 0x0d, 0xf7, 0xc9, 0x38, 0x71, 0xe2, 0xd9, 0xc3, + 0x77, 0xdd, 0xc3, 0x5d, 0x56, 0x3d, 0xa8, 0xb5, + 0x8c, 0x32, 0x2b, 0xa6, 0x00, 0xd7, 0xe3, 0xc0, + 0xe2, 0x37, 0x41, 0xdf, 0x50, 0x96, 0xb6, 0x57, + 0x77, 0x7a, 0x6d, 0xe2, 0x73, 0xdb, 0xab, 0x16, + 0xa0, 0x0f, 0x64, 0x95, 0xae, 0x5b, 0xfb, 0xcb, + 0x96, 0x88, 0xe6, 0x99, 0xf2, 0x36, 0xa0, 0xe1, + 0x71, 0xef, 0xab, 0x55, 0xdc, 0x9d, 0x53, 0x92, + 0x8e, 0x60, 0x06, 0xbd, 0x8d, 0x6b, 0x5b, 0xa3, + 0xf3, 0x9d, 0x4a, 0x9e, 0xda, 0x9d, 0xd6, 0xc7, + 0x48, 0xaf, 0x0b, 0x4e, 0xbc, 0x14, 0x8a, 0x53, + 0x3e, 0x4b, 0xe4, 0xe3, 0x5a, 0xd2, 0x35, 0xb4, + 0x73, 0x56, 0xee, 0x32, 0xeb, 0xeb, 0x56, 0xe3, + 0x9e, 0x17, 0x35, 0x9b, 0xaf, 0x14, 0x20, 0x76, + 0xe8, 0xb5, 0xc1, 0x6f, 0x73, 0x70, 0x48, 0xb7, + 0x89, 0xd2, 0xe1, 0xa6, 0x2c, 0x3b, 0x95, 0xaa, + 0xb3, 0x64, 0x37, 0xb2, 0x66, 0x56, 0x52, 0x36, + 0xea, 0x8f, 0x73, 0x4e, 0x07, 0x1a, 0x01, 0x5a, + 0x8a, 0xfc, 0xab, 0x97, 0x66, 0xe3, 0x11, 0x5e, + 0x5f, 0xc4, 0x35, 0x31, 0xc1, 0xa3, 0xb4, 0x0b, + 0xa8, 0x9d, 0xeb, 0x44, 0x5e, 0x26, 0x3e, 0xa8, + 0x44, 0x79, 0x6c, 0x76, 0x9c, 0x76, 0xad, 0xa6, + 0x2b, 0x93, 0xd8, 0x87, 0x8b, 0x2d, 0xcc, 0x26, + 0x73, 0x99, 0x1c, 0x0e, 0xab, 0x0d, 0x1d, 0x5d, + 0x1a, 0x7b, 0xab, 0xc4, 0xb6, 0x97, 0x50, 0xcc, + 0xd8, 0x24, 0x89, 0xcd, 0x91, 0xe6, 0x8c, 0x6e, + 0xfd, 0x74, 0x68, 0x53, 0x97, 0x59, 0xcd, 0xc4, + 0x39, 0xc8, 0xb4, 0x8d, 0xad, 0x10, 0xf3, 0x8d, + 0x6b, 0xc5, 0x34, 0x9c, 0x44, 0x54, 0xd7, 0xb1, + 0x55, 0xb7, 0x69, 0xdd, 0xcd, 0x43, 0x6d, 0x70, + 0xca, 0x73, 0x91, 0x4a, 0x0b, 0x49, 0xec, 0x69, + 0x48, 0xcb, 0x7d, 0x6b, 0xad, 0x63, 0xea, 0x8e, + 0x05, 0xbc, 0xb6, 0x2d, 0x97, 0x98, 0xb4, 0xeb, + 0x8a, 0x74, 0xb3, 0xa2, 0xc6, 0xd9, 0xcd, 0xc9, + 0xd9, 0x1c, 0x91, 0x52, 0x71, 0x19, 0x05, 0xa4, + 0x0a, 0xd7, 0x4a, 0xac, 0x7b, 0x05, 0xf9, 0x7b, + 0xa2, 0xe6, 0x1e, 0x64, 0x68, 0xc4, 0x5b, 0x4d, + 0x34, 0x3a, 0xb5, 0x2b, 0x55, 0x8d, 0xd4, 0x93, + 0xe5, 0x2c, 0xbc, 0x92, 0x9c, 0xf1, 0x8d, 0xce, + 0xa8, 0x1a, 0x2a, 0x2b, 0xb8, 0xa3, 0x76, 0x76, + 0xfa, 0x6b, 0xdb, 0xf9, 0xe5, 0x9e, 0x85, 0xfc, + 0xd3, 0x46, 0x81, 0x4d, 0x00, 0x95, 0x4a, 0x5e, + 0xf5, 0xdf, 0x6d, 0x23, 0x83, 0xb6, 0x6c, 0x58, + 0xaf, 0xd9, 0xa6, 0xb3, 0x1a, 0xc7, 0x0f, 0x92, + 0x22, 0x3c, 0xba, 0xfe, 0x59, 0x1f, 0x1b, 0x21, + 0x76, 0x26, 0x79, 0x55, 0x14, 0x03, 0xba, 0x56, + 0xb8, 0x6d, 0xee, 0x27, 0x90, 0xc5, 0x0c, 0x6e, + 0x92, 0x46, 0xeb, 0x6b, 0x77, 0x15, 0x8b, 0x36, + 0xcf, 0x99, 0x97, 0xdc, 0x1b, 0x68, 0xa1, 0x0f, + 0x79, 0x01, 0xd2, 0x3a, 0xb4, 0x1a, 0x7b, 0x1d, + 0xa5, 0xef, 0x25, 0x64, 0x76, 0xd9, 0x41, 0xbc, + 0x2d, 0x01, 0xf2, 0x87, 0x4a, 0xfe, 0xfe, 0x11, + 0xda, 0x57, 0xef, 0x5e, 0x2b, 0xac, 0xd6, 0x38, + 0xf8, 0x39, 0x7a, 0x5c, 0x7b, 0xe2, 0x91, 0x79, + 0x9d, 0x91, 0x33, 0x79, 0xff, 0x00, 0x24, 0x14, + 0xb9, 0x46, 0x65, 0x13, 0x0b, 0x9d, 0x03, 0x88, + 0x1a, 0x7c, 0x5a, 0x15, 0xb3, 0x20, 0x20, 0xe6, + 0xb0, 0x03, 0xfd, 0x7d, 0x1d, 0xa6, 0xbb, 0x5a, + 0x91, 0xc8, 0x33, 0x9b, 0xab, 0xdb, 0x89, 0x62, + 0xb8, 0x70, 0x71, 0xc2, 0x5e, 0xca, 0x0a, 0x53, + 0x4d, 0x29, 0xdf, 0x5e, 0x04, 0x0d, 0xb7, 0xda, + 0xb6, 0x35, 0x83, 0x0b, 0x1e, 0x0b, 0xe8, 0x37, + 0xdc, 0xc7, 0x55, 0x44, 0xe4, 0xb4, 0xc5, 0xab, + 0x78, 0xd2, 0x74, 0xd4, 0x8c, 0x14, 0x89, 0xc7, + 0x93, 0x1c, 0xeb, 0x1d, 0xc8, 0xac, 0xfc, 0x1e, + 0x36, 0xa9, 0xdf, 0xae, 0xb7, 0xf3, 0x5d, 0xe1, + 0x50, 0x78, 0x94, 0xd6, 0xd6, 0x1a, 0x4d, 0x6c, + 0x3f, 0xaa, 0xef, 0x0a, 0x81, 0xaa, 0xe9, 0x86, + 0x7e, 0x88, 0xf8, 0x4b, 0x97, 0x9a, 0xfe, 0x35, + 0xfe, 0x2b, 0xae, 0x56, 0xee, 0x6f, 0x25, 0x86, + 0x53, 0xa4, 0xb6, 0x2c, 0x54, 0xed, 0x54, 0xae, + 0x7c, 0xb3, 0x3f, 0x65, 0xfc, 0xe2, 0xdd, 0xf1, + 0x73, 0x6e, 0x78, 0x25, 0xb4, 0x38, 0x81, 0xa6, + 0x92, 0x35, 0x2d, 0xf9, 0x5b, 0x0c, 0x99, 0x1c, + 0x0c, 0x1a, 0xdf, 0x16, 0x11, 0x5e, 0xcd, 0x57, + 0x26, 0x4f, 0x90, 0x3e, 0xc6, 0xe4, 0x5c, 0xcd, + 0x28, 0x79, 0x63, 0x48, 0x0d, 0x68, 0x34, 0xd3, + 0xba, 0x49, 0x59, 0xbe, 0x9d, 0x2f, 0x33, 0xae, + 0xef, 0x63, 0x74, 0xf7, 0x35, 0xc3, 0x14, 0xd2, + 0x2b, 0x68, 0xfa, 0xf8, 0x23, 0xf6, 0x8a, 0xcd, + 0x96, 0xd7, 0x8c, 0x7c, 0x4d, 0xc2, 0xd9, 0xc5, + 0x70, 0x8d, 0x58, 0x86, 0xf7, 0x6d, 0x73, 0xc7, + 0x93, 0xe6, 0x92, 0x33, 0x1b, 0x60, 0x75, 0x0e, + 0xaa, 0x90, 0x0a, 0x9c, 0x32, 0xdb, 0xdf, 0x67, + 0xad, 0x63, 0x48, 0x91, 0x96, 0x71, 0x97, 0x13, + 0xac, 0x63, 0x26, 0x8b, 0x5e, 0x6d, 0x99, 0x66, + 0x90, 0x66, 0x2d, 0x86, 0xd6, 0x37, 0x18, 0x59, + 0x80, 0xba, 0x8d, 0xa8, 0x76, 0x23, 0xa7, 0x4d, + 0x37, 0x02, 0xeb, 0x19, 0x2d, 0x11, 0x5a, 0xc6, + 0x9f, 0x6f, 0xb5, 0xc2, 0xfe, 0x5f, 0x1c, 0xda, + 0xf9, 0x2d, 0x33, 0xb6, 0x6d, 0xa4, 0x6d, 0xe6, + 0xae, 0xcd, 0x14, 0xd0, 0x48, 0x63, 0x99, 0x86, + 0x37, 0x8d, 0x6d, 0x76, 0x85, 0xb1, 0xf6, 0x37, + 0xac, 0x60, 0x7b, 0xa0, 0x78, 0x63, 0x88, 0x01, + 0xd8, 0x4d, 0x09, 0x71, 0xa3, 0x78, 0x54, 0xee, + 0xd4, 0x42, 0xd7, 0xd9, 0xc7, 0x73, 0x4f, 0x1d, + 0x8e, 0x00, 0x9e, 0xc3, 0xb7, 0x14, 0x94, 0xf7, + 0x11, 0x5b, 0x65, 0xc2, 0xe2, 0x56, 0xe3, 0x6c, + 0x6c, 0x61, 0xc3, 0xd9, 0xd1, 0x4e, 0xfa, 0x99, + 0xcd, 0x3b, 0x6b, 0xa7, 0x8c, 0xf8, 0xab, 0x1e, + 0x4e, 0xbb, 0xb2, 0x6b, 0x79, 0x88, 0xac, 0x44, + 0xc2, 0xb3, 0x6b, 0x0d, 0xf6, 0x5f, 0x79, 0x04, + 0xaf, 0xb7, 0x2e, 0x7b, 0xcb, 0xb0, 0x45, 0x5d, + 0x27, 0x47, 0x75, 0x6c, 0xce, 0xee, 0xee, 0xee, + 0x9d, 0x00, 0x9e, 0xd5, 0xd6, 0xce, 0x01, 0xc1, + 0xa0, 0xd4, 0xe2, 0x24, 0x8e, 0xc2, 0xdf, 0x69, + 0x9b, 0xbf, 0x32, 0xce, 0x2d, 0x0b, 0xa3, 0x11, + 0xf3, 0x65, 0xfa, 0x8d, 0x75, 0x85, 0xb3, 0x6a, + 0x8d, 0x2e, 0x2c, 0xf4, 0x6e, 0x93, 0xa7, 0xb6, + 0xd4, 0xd6, 0x7b, 0x91, 0xad, 0x63, 0x76, 0x9a, + 0xcf, 0x14, 0xcd, 0x2b, 0x18, 0x72, 0x6c, 0xbc, + 0xec, 0x9b, 0xf1, 0xe1, 0x08, 0x97, 0xe5, 0xf7, + 0xec, 0x2d, 0x0e, 0x81, 0xe3, 0x19, 0xc2, 0xda, + 0x83, 0xa4, 0xf6, 0x38, 0x16, 0x67, 0xcb, 0x6f, + 0xed, 0xe3, 0xe7, 0x66, 0x84, 0xb5, 0x9b, 0xa7, + 0x41, 0xa7, 0x6e, 0x8a, 0xd3, 0x9b, 0xde, 0xba, + 0xca, 0xc1, 0xf7, 0x0c, 0x00, 0xbd, 0xa4, 0x06, + 0x57, 0x7d, 0xda, 0x16, 0xac, 0x96, 0xf5, 0xf9, + 0x9d, 0x8b, 0xcd, 0xcb, 0x5a, 0x5c, 0xd7, 0x18, + 0x9e, 0x00, 0xd0, 0x45, 0x06, 0xe2, 0x8e, 0xfd, + 0xf4, 0xdd, 0xa4, 0x69, 0xaa, 0xde, 0x8f, 0x16, + 0xee, 0xde, 0xe9, 0xdd, 0xa6, 0xe4, 0x7e, 0xca, + 0x1a, 0xba, 0xe7, 0x7a, 0x8c, 0xfe, 0xf2, 0xe7, + 0xcc, 0xac, 0x6f, 0x2e, 0xb3, 0x4b, 0x83, 0x6f, + 0x13, 0x9e, 0xd0, 0x45, 0x5d, 0xa8, 0x6a, 0xec, + 0xae, 0xbd, 0x99, 0x67, 0x35, 0x73, 0x7d, 0x1f, + 0xcc, 0x70, 0x68, 0xed, 0x02, 0xfa, 0x2f, 0x57, + 0x59, 0xe5, 0xc4, 0x19, 0xc3, 0x6c, 0xe3, 0x0d, + 0xe6, 0x03, 0xda, 0xd7, 0xe8, 0xd2, 0x4b, 0xb5, + 0xe9, 0x51, 0xba, 0x63, 0x25, 0xad, 0x58, 0xf6, + 0x11, 0x4a, 0x4f, 0x97, 0xc7, 0x19, 0x2d, 0xa6, + 0xb7, 0x98, 0xd6, 0x23, 0xc6, 0x63, 0x5d, 0x10, + 0x37, 0x16, 0xd7, 0x16, 0xcf, 0xe6, 0xe7, 0x61, + 0x8d, 0xda, 0xc0, 0x3b, 0xa3, 0xb0, 0xbd, 0x5b, + 0x59, 0x5e, 0x5d, 0xd7, 0xd9, 0xe2, 0x73, 0xc0, + 0xd0, 0x5d, 0xa9, 0xa0, 0xf6, 0xca, 0x9d, 0xda, + 0xb8, 0xeb, 0x6f, 0x03, 0x9b, 0xe5, 0x99, 0x30, + 0x03, 0xe7, 0x03, 0xc4, 0xba, 0xaf, 0x0c, 0xb9, + 0x76, 0x52, 0x19, 0x63, 0x1f, 0xeb, 0x1a, 0x03, + 0x5a, 0xd0, 0x31, 0x69, 0x3a, 0xca, 0xb7, 0x7a, + 0xdb, 0x6b, 0x31, 0x11, 0xc7, 0x57, 0x39, 0xf2, + 0x95, 0x8b, 0xde, 0x6d, 0x69, 0x8c, 0x74, 0x88, + 0x9e, 0x1c, 0x67, 0x8a, 0xb5, 0x73, 0x97, 0xde, + 0xda, 0x37, 0x14, 0xf1, 0x39, 0xad, 0xd5, 0x88, + 0x50, 0x8d, 0x3a, 0xb4, 0xaf, 0x10, 0xda, 0x5d, + 0xdc, 0x02, 0x60, 0x89, 0xd2, 0x86, 0x9a, 0x12, + 0xdd, 0x20, 0x1e, 0xca, 0xb4, 0x65, 0x72, 0x5c, + 0x66, 0x19, 0x6b, 0x99, 0x7c, 0xcf, 0x1c, 0x97, + 0x46, 0xe0, 0xe6, 0xe1, 0xa8, 0xa6, 0x83, 0x45, + 0xcb, 0xb2, 0xec, 0xc3, 0x6f, 0x72, 0xcd, 0xd6, + 0xcd, 0x87, 0x80, 0x51, 0x3b, 0xd3, 0xa4, 0xeb, + 0xa6, 0xb0, 0x98, 0xf2, 0x95, 0x9c, 0x98, 0xf4, + 0x99, 0xed, 0xe4, 0x8b, 0x78, 0xf8, 0xf0, 0x41, + 0xb2, 0xc2, 0xf5, 0xf1, 0xbe, 0x56, 0xc4, 0xec, + 0x11, 0xd7, 0x13, 0x8e, 0x8d, 0x5a, 0xf5, 0xac, + 0x5a, 0xd9, 0xdd, 0xdd, 0xd7, 0xd9, 0xe3, 0x32, + 0x53, 0x5b, 0x86, 0xae, 0x12, 0xa5, 0x73, 0x6c, + 0xfd, 0x8c, 0x7c, 0xf6, 0x30, 0xc2, 0x28, 0xdc, + 0x51, 0xb9, 0xd5, 0xdd, 0x23, 0x70, 0x24, 0x39, + 0xed, 0xad, 0xb6, 0x56, 0xcb, 0x6b, 0x3a, 0xfb, + 0x4b, 0x58, 0x03, 0x46, 0x02, 0x7c, 0x6d, 0xd2, + 0x53, 0xb9, 0x93, 0x4d, 0x74, 0x56, 0x3c, 0xbe, + 0x19, 0xb4, 0x57, 0xb9, 0x33, 0xb6, 0x38, 0xf0, + 0xe3, 0x32, 0x8e, 0x9f, 0x2c, 0xcc, 0x2d, 0xdb, + 0x8a, 0x58, 0x5c, 0x1a, 0x35, 0x91, 0x43, 0x4e, + 0x05, 0xdf, 0xb2, 0xa7, 0x15, 0xf4, 0xbb, 0xdc, + 0xd5, 0x7e, 0x93, 0x54, 0xae, 0x4b, 0x2d, 0xed, + 0xcd, 0x9b, 0x9d, 0x7e, 0xd3, 0x8c, 0xb8, 0xb4, + 0x62, 0x01, 0xa4, 0xb2, 0x9b, 0xa0, 0x76, 0x54, + 0x66, 0xcd, 0x00, 0xdc, 0xda, 0xe9, 0xad, 0xd0, + 0xd6, 0xb5, 0xc0, 0x72, 0xc2, 0xad, 0xb2, 0x4d, + 0xa9, 0x78, 0x9f, 0x67, 0x27, 0x4c, 0x78, 0x6b, + 0x5b, 0xe1, 0xbd, 0x35, 0xd2, 0xf3, 0x6f, 0xbb, + 0xc7, 0x48, 0x73, 0xed, 0x19, 0x23, 0x34, 0x70, + 0x15, 0x27, 0x0b, 0x28, 0x3b, 0x61, 0x68, 0x8f, + 0x28, 0xcc, 0xe4, 0x68, 0x73, 0x60, 0x70, 0x07, + 0xe7, 0x50, 0x1e, 0x05, 0x2b, 0x3b, 0x63, 0x76, + 0xd5, 0x46, 0xd9, 0x28, 0x46, 0x00, 0xe6, 0x83, + 0xab, 0x10, 0x69, 0x5b, 0xb3, 0xbb, 0xbc, 0xd2, + 0xd6, 0x58, 0x9f, 0x6a, 0xd2, 0x60, 0x02, 0xb2, + 0x90, 0xdc, 0x47, 0x5e, 0xa2, 0x14, 0xd7, 0x25, + 0xb4, 0xa5, 0x2b, 0x11, 0x33, 0x31, 0xf7, 0x58, + 0xb6, 0x0a, 0x4d, 0xaf, 0x92, 0xf3, 0x3c, 0x2f, + 0xa4, 0x45, 0x79, 0x2b, 0x73, 0xc3, 0x3d, 0xbb, + 0xf9, 0xb9, 0xd8, 0x63, 0x7e, 0xe0, 0x76, 0xe8, + 0xec, 0x2d, 0x78, 0x94, 0xb6, 0x77, 0x9b, 0xd8, + 0xdf, 0xdb, 0x32, 0x38, 0xc3, 0x84, 0xcc, 0x20, + 0xd4, 0xb6, 0x94, 0xdf, 0x0a, 0x16, 0xab, 0xae, + 0x3b, 0x4d, 0xab, 0xac, 0xf0, 0x65, 0xcb, 0x8e, + 0xb5, 0xbc, 0xc5, 0x2d, 0xba, 0x3d, 0xed, 0x98, + 0x93, 0x12, 0xd7, 0x54, 0xaa, 0xbb, 0x9e, 0x90, + 0xd9, 0x5a, 0xab, 0x39, 0xd3, 0x90, 0xda, 0x93, + 0xac, 0x06, 0xaa, 0xa6, 0x25, 0x6b, 0x6f, 0xfa, + 0x7a, 0xd7, 0xb4, 0xd5, 0x9f, 0xcc, 0x7d, 0xb1, + 0xf1, 0x6d, 0xf2, 0x1f, 0xc4, 0xb7, 0xc2, 0x5c, + 0x48, 0x88, 0xb3, 0x3d, 0x26, 0xeb, 0x31, 0x5b, + 0xb8, 0x87, 0xf5, 0x82, 0xe2, 0xda, 0x37, 0x1e, + 0xb4, 0x7e, 0xf0, 0x6b, 0x40, 0xe0, 0x2b, 0xb6, + 0xcb, 0xde, 0xe1, 0xf3, 0x82, 0xe0, 0xda, 0x53, + 0xfe, 0x6a, 0xf1, 0xfd, 0x56, 0x78, 0x0a, 0xed, + 0xe5, 0xfe, 0xf6, 0x4f, 0x3f, 0xfc, 0x28, 0xfd, + 0xa4, 0x76, 0x24, 0xc4, 0xb5, 0xd5, 0x2a, 0xb5, + 0x3c, 0xc9, 0x86, 0xcc, 0x4b, 0xab, 0x2a, 0xb6, + 0x17, 0x97, 0xd1, 0x40, 0xe1, 0xe2, 0x12, 0x5c, + 0xfe, 0xd3, 0x74, 0xae, 0x1a, 0xa9, 0x7d, 0x97, + 0xd3, 0x99, 0x9e, 0xc4, 0x6e, 0x2a, 0xb9, 0x26, + 0x62, 0x93, 0x2b, 0xe1, 0xae, 0xb9, 0x69, 0x13, + 0xed, 0x9d, 0x13, 0x19, 0xc6, 0x6b, 0xd5, 0x8c, + 0x8a, 0x28, 0x63, 0x6b, 0x9c, 0xfd, 0x41, 0xd5, + 0xa0, 0x68, 0xd1, 0xb9, 0x45, 0xb5, 0xa6, 0x1c, + 0xdf, 0x2b, 0xc4, 0xe6, 0x01, 0xce, 0x34, 0xd0, + 0x6b, 0xa3, 0xc6, 0x8f, 0x0a, 0x86, 0xda, 0xb7, + 0x11, 0x7d, 0x10, 0xdc, 0xe6, 0xf5, 0x76, 0xc9, + 0x51, 0x71, 0x66, 0x37, 0xd0, 0xc7, 0xcd, 0xc3, + 0x3b, 0xd8, 0xc1, 0x5a, 0x30, 0x1d, 0x02, 0xa6, + 0xbb, 0xcb, 0x8c, 0x62, 0xd6, 0x95, 0x98, 0x9d, + 0x2d, 0x32, 0xd7, 0x93, 0xcc, 0x6d, 0xcb, 0x7a, + 0x5a, 0xbb, 0xa9, 0x11, 0xc2, 0x34, 0x61, 0x91, + 0xcb, 0x23, 0xc4, 0x71, 0xb4, 0xc8, 0xf2, 0x68, + 0x1a, 0xd1, 0x52, 0x48, 0xd6, 0xbb, 0x0e, 0x4b, + 0x9a, 0x06, 0xe2, 0xe6, 0x0e, 0xfd, 0x2a, 0x2a, + 0xa4, 0xf6, 0x52, 0x06, 0x18, 0x66, 0xbb, 0x70, + 0xab, 0xcb, 0xb0, 0x35, 0xc7, 0x4d, 0x00, 0x15, + 0x34, 0xed, 0xd5, 0x62, 0xcf, 0x3d, 0xba, 0x9b, + 0x39, 0xf6, 0x77, 0x11, 0xec, 0xef, 0x7b, 0xa3, + 0x63, 0x68, 0x34, 0x52, 0xb4, 0x35, 0xee, 0x2b, + 0x5b, 0x2d, 0xf5, 0x98, 0x88, 0x8f, 0xa7, 0xc5, + 0xca, 0xbe, 0x5b, 0x1c, 0x56, 0xb3, 0x92, 0xd3, + 0x13, 0x96, 0x63, 0x6c, 0x47, 0xb3, 0x54, 0x10, + 0x8e, 0x43, 0x28, 0x8b, 0x09, 0x12, 0x12, 0x1b, + 0x82, 0x9a, 0x6a, 0x7b, 0x0b, 0x69, 0xb0, 0xbf, + 0x6b, 0x9a, 0xc7, 0x40, 0xf0, 0xf9, 0x0d, 0x18, + 0x08, 0xd6, 0x69, 0x55, 0x2f, 0x9e, 0x42, 0xd8, + 0xf3, 0x6b, 0x19, 0xd8, 0x05, 0x64, 0x7b, 0x43, + 0xfb, 0x24, 0x39, 0xaa, 0x43, 0x3e, 0xbf, 0x92, + 0xc2, 0xd9, 0x92, 0x42, 0x01, 0x95, 0xef, 0xc2, + 0xc2, 0xe1, 0x5a, 0x6f, 0x94, 0xef, 0x5b, 0x5a, + 0xc4, 0x47, 0x8a, 0x63, 0xca, 0xd3, 0xfd, 0xdd, + 0xd6, 0x98, 0xed, 0x5f, 0xf7, 0x65, 0x5a, 0xb8, + 0xcb, 0x6f, 0xad, 0xa3, 0xe7, 0x66, 0x89, 0xcd, + 0x66, 0xeb, 0x85, 0x0d, 0x3b, 0x6b, 0xd4, 0x79, + 0x4e, 0x65, 0x24, 0x7c, 0xeb, 0x60, 0x76, 0x1a, + 0x54, 0x56, 0x80, 0x91, 0xd8, 0x0a, 0xcf, 0x61, + 0x76, 0x6e, 0xf2, 0xa6, 0x5d, 0x4c, 0xd0, 0xe2, + 0xe6, 0x97, 0x3d, 0xb4, 0xd0, 0x4b, 0x6a, 0x35, + 0x77, 0x17, 0x1e, 0x45, 0x9c, 0x4f, 0x7f, 0x71, + 0x34, 0x72, 0x86, 0x86, 0x31, 0xb8, 0x98, 0x00, + 0xa1, 0x1a, 0x69, 0x45, 0x1d, 0xdc, 0x9a, 0x4f, + 0xd3, 0x1a, 0xd2, 0x74, 0x95, 0xbd, 0x2e, 0x1d, + 0xd5, 0x88, 0xb4, 0xff, 0x00, 0xb9, 0x1f, 0x4a, + 0xb6, 0xc8, 0xa6, 0x92, 0x5e, 0x65, 0x8c, 0x73, + 0xa5, 0xd2, 0x0b, 0x37, 0x41, 0x1b, 0x8b, 0x70, + 0xcb, 0xb3, 0x03, 0x28, 0x87, 0x98, 0x78, 0x91, + 0xc3, 0x10, 0x04, 0x68, 0xa7, 0x64, 0xa9, 0x67, + 0x35, 0xac, 0xda, 0xc6, 0xe1, 0x14, 0xc4, 0x2a, + 0x7b, 0x65, 0xab, 0xa7, 0x3f, 0xcd, 0xa6, 0xcb, + 0xdd, 0x0b, 0x60, 0x0d, 0xc7, 0x28, 0x71, 0x2e, + 0x22, 0xba, 0x1a, 0xad, 0x39, 0x6d, 0x33, 0x11, + 0x15, 0x8e, 0x31, 0xaa, 0xb1, 0xe5, 0xb1, 0xc5, + 0x6d, 0x6b, 0x5a, 0x7e, 0x8b, 0x6d, 0x95, 0x7e, + 0xe6, 0xc2, 0xf6, 0xd7, 0x0f, 0x3f, 0x13, 0x9a, + 0x1c, 0x68, 0xd3, 0xac, 0x13, 0xbd, 0xa1, 0x6c, + 0x76, 0x53, 0x99, 0xb6, 0x2e, 0x74, 0xdb, 0xbb, + 0x0d, 0x2a, 0x46, 0x8a, 0xf0, 0x2b, 0x44, 0xf7, + 0x61, 0xb9, 0x57, 0xb7, 0x39, 0x81, 0xce, 0x6c, + 0x6d, 0x94, 0x37, 0x73, 0x11, 0x03, 0x8d, 0x73, + 0xe4, 0x19, 0xa4, 0xf9, 0x8c, 0x33, 0x1b, 0x80, + 0x31, 0x46, 0xe0, 0x2a, 0xd1, 0x4a, 0x82, 0x15, + 0x63, 0x35, 0xf6, 0xeb, 0xa4, 0x70, 0x9d, 0x25, + 0x7f, 0x49, 0x87, 0x7c, 0x57, 0x74, 0xeb, 0x78, + 0xd6, 0xb0, 0xaa, 0x30, 0x3e, 0x47, 0x06, 0xc6, + 0xd2, 0xf7, 0x3b, 0x53, 0x5b, 0xa4, 0x9e, 0xe2, + 0xed, 0x19, 0x36, 0x68, 0x5b, 0x8b, 0x98, 0x34, + 0xd6, 0x74, 0x8a, 0xa9, 0x4c, 0x96, 0x28, 0x46, + 0x73, 0x98, 0x68, 0x18, 0xa3, 0x27, 0x00, 0xde, + 0x15, 0x20, 0xd1, 0x66, 0xfb, 0x32, 0xcd, 0x2c, + 0xb3, 0x2c, 0x52, 0x30, 0xfb, 0x05, 0x40, 0xab, + 0x5b, 0x51, 0x86, 0x9c, 0x35, 0x53, 0x39, 0x6f, + 0x33, 0xa4, 0x44, 0x47, 0x0d, 0x7e, 0x2a, 0x57, + 0xcb, 0x53, 0x6e, 0xeb, 0xcc, 0xf8, 0xcd, 0x7e, + 0x9f, 0x66, 0x9c, 0x15, 0xd7, 0xb6, 0x48, 0xde, + 0x59, 0x23, 0x4b, 0x1e, 0xd3, 0x47, 0x34, 0xeb, + 0x05, 0x63, 0x12, 0xee, 0xce, 0xf3, 0x1b, 0x4b, + 0xd9, 0xa2, 0x96, 0xda, 0xa1, 0xc0, 0x10, 0xf2, + 0x45, 0x09, 0x1b, 0x8a, 0x36, 0xab, 0xad, 0x66, + 0x66, 0x22, 0x67, 0x83, 0x36, 0x4a, 0x45, 0x6d, + 0x31, 0x59, 0xd6, 0x23, 0xc2, 0x65, 0x79, 0x8a, + 0x6e, 0x63, 0x27, 0x8e, 0x7a, 0x62, 0x31, 0xc0, + 0xd7, 0x53, 0x55, 0x68, 0xd0, 0xb9, 0x72, 0xcc, + 0xed, 0x99, 0x8c, 0xae, 0xb7, 0x7c, 0x5c, 0xdc, + 0x98, 0x4b, 0x80, 0xad, 0x41, 0x6f, 0x07, 0x65, + 0x74, 0x47, 0x11, 0x9f, 0x26, 0x8e, 0x16, 0x90, + 0x1d, 0x2d, 0xbb, 0x5a, 0x1c, 0x75, 0x69, 0x68, + 0x5c, 0x99, 0x46, 0x46, 0xec, 0xbe, 0x57, 0x5c, + 0x4f, 0x20, 0x7b, 0xb0, 0xe1, 0x68, 0x68, 0xd0, + 0x07, 0x64, 0x95, 0x93, 0xe8, 0xdb, 0x7d, 0x66, + 0x77, 0x6b, 0xc1, 0xea, 0x4f, 0x73, 0x76, 0x2d, + 0x9a, 0x76, 0xf6, 0xfd, 0x7a, 0xa2, 0x33, 0xcb, + 0x36, 0xda, 0xdf, 0xe1, 0x88, 0x78, 0x93, 0x00, + 0xe6, 0xb4, 0x6b, 0xc4, 0x75, 0xd1, 0x78, 0x6e, + 0x4d, 0x9a, 0x39, 0xb8, 0xc4, 0x04, 0x0d, 0xe2, + 0x40, 0x3c, 0x0a, 0x6e, 0xde, 0x48, 0x33, 0x0c, + 0xf2, 0x49, 0x59, 0x47, 0xc7, 0x67, 0x18, 0x6b, + 0x1d, 0xac, 0x17, 0x38, 0xf8, 0xc4, 0x76, 0xa8, + 0xb5, 0xde, 0xe6, 0x79, 0xa4, 0x79, 0xbb, 0x61, + 0x8a, 0x37, 0x1b, 0x56, 0x96, 0xb5, 0xde, 0x25, + 0x41, 0xc5, 0xaf, 0x4f, 0x61, 0x75, 0xae, 0x5b, + 0x44, 0x44, 0x56, 0x35, 0xd2, 0x35, 0xb6, 0xae, + 0x16, 0xf2, 0xf8, 0xa6, 0x66, 0xf3, 0x33, 0xa5, + 0xa7, 0x48, 0xdb, 0xe0, 0xae, 0x48, 0xc9, 0x62, + 0x79, 0x8e, 0x46, 0x39, 0xaf, 0x1a, 0x0b, 0x0e, + 0xba, 0xad, 0xcf, 0xb0, 0xbf, 0x8f, 0x0f, 0x39, + 0x03, 0xd9, 0x88, 0xe1, 0x69, 0x23, 0x59, 0x3a, + 0x80, 0x53, 0x5b, 0x53, 0x03, 0x30, 0xdb, 0xdc, + 0xb4, 0x51, 0xd8, 0xf9, 0xb7, 0x1e, 0xc1, 0xd4, + 0xa5, 0x33, 0x1b, 0xc8, 0xac, 0xed, 0x0d, 0xcc, + 0x8d, 0xc6, 0x18, 0x41, 0x6b, 0x7f, 0xad, 0xa9, + 0x27, 0x35, 0xa6, 0x2b, 0xc2, 0x38, 0xca, 0x91, + 0xe4, 0xe9, 0x16, 0xc9, 0x5b, 0x5e, 0x7e, 0x98, + 0x89, 0xf9, 0xab, 0x96, 0x11, 0xdf, 0xe5, 0xf7, + 0xb1, 0xbd, 0xd6, 0xc6, 0x49, 0x1e, 0xc2, 0x5b, + 0x15, 0x40, 0x34, 0xdd, 0xdf, 0xd4, 0xb1, 0x9c, + 0x5c, 0x5d, 0x5d, 0x5d, 0x45, 0xce, 0xdb, 0x3a, + 0xdd, 0xe4, 0x61, 0x64, 0x64, 0xd4, 0xbb, 0x4e, + 0xe6, 0xa5, 0xd5, 0x96, 0xe6, 0xaf, 0xcc, 0xb3, + 0x98, 0x1e, 0xe8, 0xc3, 0x30, 0x46, 0xf0, 0x00, + 0x35, 0xd7, 0xbe, 0xbd, 0xe7, 0xe4, 0x75, 0xd5, + 0x87, 0x6d, 0xbf, 0xf5, 0x02, 0x4d, 0xa7, 0xb9, + 0x1a, 0xd6, 0x35, 0xd3, 0x99, 0x6a, 0x47, 0x62, + 0x76, 0xde, 0x76, 0x45, 0xa3, 0xd9, 0x08, 0x93, + 0x97, 0x66, 0x0d, 0x73, 0x58, 0xeb, 0x79, 0x01, + 0x79, 0xa3, 0x74, 0x6b, 0xa0, 0x4b, 0x9c, 0xba, + 0xfa, 0xd5, 0x82, 0x49, 0xa2, 0x2d, 0x61, 0xfc, + 0xed, 0x60, 0x70, 0x2b, 0x36, 0x77, 0x7e, 0xfb, + 0x0b, 0x4e, 0x7a, 0x30, 0x0c, 0xae, 0x76, 0x06, + 0x12, 0x2b, 0x4a, 0x84, 0xcb, 0x6e, 0x4e, 0x69, + 0x95, 0x97, 0xce, 0xd0, 0x4b, 0xc3, 0xa3, 0x78, + 0x03, 0x41, 0xa6, 0xea, 0x46, 0x6b, 0xf0, 0x99, + 0x88, 0xd3, 0x5d, 0x16, 0x9f, 0x29, 0x8a, 0x2d, + 0x6c, 0x71, 0x79, 0xdd, 0x11, 0x36, 0xac, 0x38, + 0xf6, 0x56, 0x86, 0x0b, 0x8e, 0xc3, 0xdb, 0xe0, + 0x51, 0xf7, 0x59, 0x75, 0xf5, 0xd5, 0xfd, 0xcb, + 0xe0, 0x84, 0xb9, 0xb8, 0xcf, 0x8c, 0x74, 0x03, + 0x4d, 0xe5, 0x21, 0xb2, 0x6d, 0xa4, 0x37, 0x4c, + 0x3f, 0x9b, 0x20, 0x1d, 0xe5, 0x81, 0x9d, 0xdc, + 0x75, 0xe7, 0xb1, 0x06, 0xb4, 0x41, 0x8f, 0x9b, + 0x22, 0x9a, 0x75, 0x6b, 0x51, 0x16, 0xb4, 0x64, + 0xbc, 0xd6, 0x3d, 0x9a, 0xad, 0xb6, 0x93, 0x87, + 0x0d, 0x72, 0x4f, 0xdd, 0x3a, 0x4e, 0x9e, 0xd4, + 0x0c, 0xf0, 0xcd, 0x6f, 0x21, 0x8a, 0x76, 0x18, + 0xde, 0x05, 0x70, 0x9d, 0xed, 0xf5, 0xb6, 0xdb, + 0x2f, 0xbd, 0xba, 0x6e, 0x28, 0x22, 0x73, 0x9b, + 0xf3, 0xb5, 0x0e, 0xe1, 0x53, 0x3b, 0x53, 0x00, + 0x91, 0xf6, 0x61, 0xa3, 0xc7, 0x91, 0xe6, 0x3a, + 0xef, 0x83, 0x87, 0x42, 0xec, 0xcd, 0x66, 0xb8, + 0xcb, 0xf2, 0xf6, 0x47, 0x60, 0xc3, 0x8a, 0xa1, + 0x8d, 0xa0, 0xae, 0x11, 0xbf, 0xa9, 0x5b, 0xbd, + 0x3b, 0x6b, 0xa4, 0x46, 0xe9, 0xf9, 0x39, 0xc7, + 0x93, 0xac, 0x5f, 0x26, 0xeb, 0x4e, 0xcc, 0x7f, + 0x39, 0xd7, 0x8a, 0xb3, 0x73, 0x65, 0x77, 0x68, + 0x01, 0xb8, 0x8d, 0xcc, 0x69, 0xd0, 0x1c, 0x74, + 0x8a, 0xf6, 0xc2, 0xf3, 0x0d, 0x9d, 0xe4, 0xec, + 0xe7, 0x21, 0x85, 0xf2, 0x30, 0x12, 0x31, 0x34, + 0x12, 0x2a, 0x15, 0xa2, 0xd0, 0xcd, 0x98, 0xe4, + 0xee, 0x17, 0x8c, 0x22, 0x47, 0x07, 0x35, 0xc0, + 0x8a, 0x69, 0x1f, 0x9d, 0x42, 0xb4, 0x6c, 0xae, + 0x9c, 0xb4, 0xd7, 0xd6, 0x10, 0x78, 0x13, 0xbd, + 0x68, 0x89, 0xd6, 0x23, 0x74, 0x4e, 0x84, 0x79, + 0x4a, 0x4e, 0x4a, 0x57, 0x5b, 0x69, 0x92, 0xb6, + 0xb7, 0x1f, 0x67, 0x24, 0x03, 0x6c, 0xaf, 0x0c, + 0x0e, 0xb8, 0xe6, 0x8b, 0x62, 0x65, 0x4b, 0x9c, + 0x74, 0x68, 0x1a, 0xd2, 0xda, 0xc2, 0xf6, 0xe8, + 0x17, 0x5b, 0xc4, 0xe7, 0xb4, 0x1a, 0x62, 0xd4, + 0x2a, 0x3b, 0x25, 0x48, 0xe6, 0xbb, 0x40, 0xd9, + 0x19, 0x3d, 0x84, 0x30, 0x81, 0x10, 0x06, 0x3c, + 0x75, 0xde, 0x34, 0x34, 0x0b, 0x63, 0xb3, 0xf8, + 0x23, 0xb0, 0x6d, 0xb6, 0x5d, 0x88, 0xdc, 0x34, + 0x35, 0x8d, 0x18, 0x2a, 0x05, 0x3c, 0xa3, 0x4d, + 0x4a, 0x77, 0xe4, 0xd3, 0xed, 0x8e, 0x2a, 0x57, + 0x0e, 0x0d, 0xfa, 0x6f, 0xb5, 0xb4, 0xf7, 0x23, + 0x2e, 0x32, 0xeb, 0xeb, 0x66, 0x97, 0xcd, 0x03, + 0x83, 0x06, 0xb7, 0x0a, 0x11, 0xdd, 0xa2, 0x94, + 0xd9, 0x4d, 0x32, 0xdc, 0xe9, 0xaf, 0x8a, 0xc3, + 0xc2, 0x5c, 0xa4, 0xf2, 0xd9, 0x2e, 0xee, 0x72, + 0xff, 0x00, 0xfb, 0xe6, 0xe1, 0x91, 0xd8, 0x81, + 0x04, 0x50, 0x96, 0xee, 0x12, 0x14, 0x56, 0xc9, + 0x7e, 0xde, 0xf0, 0x6e, 0x00, 0xd0, 0x38, 0x5c, + 0xa9, 0x6b, 0xcd, 0xb1, 0xde, 0x27, 0x4e, 0x0e, + 0xb8, 0xf0, 0xd6, 0x99, 0x70, 0xda, 0xb3, 0x33, + 0x5c, 0x9b, 0xb5, 0x8b, 0x38, 0xb3, 0xc2, 0x7a, + 0xd6, 0x66, 0x8d, 0x26, 0xad, 0x00, 0x77, 0x35, + 0x05, 0xe5, 0x99, 0x3e, 0x68, 0xf6, 0xe2, 0x16, + 0xee, 0xa1, 0xdf, 0x20, 0x1e, 0xe8, 0x52, 0x90, + 0xb5, 0x8f, 0xda, 0x99, 0x83, 0xc0, 0x25, 0xad, + 0xc4, 0xca, 0xfc, 0xe0, 0x1a, 0xb6, 0xe6, 0xf7, + 0xd9, 0xad, 0x9d, 0xdb, 0x24, 0x85, 0x84, 0xd9, + 0x00, 0xd2, 0xec, 0x2d, 0xc5, 0x52, 0x7c, 0xac, + 0x5b, 0xaa, 0xdd, 0xcb, 0x44, 0x56, 0xb5, 0x88, + 0xd7, 0x4d, 0x78, 0xab, 0x38, 0x29, 0x33, 0x92, + 0xf7, 0x99, 0xd2, 0x32, 0x4d, 0x7e, 0x95, 0x72, + 0x68, 0xa6, 0x82, 0x43, 0x1c, 0xcc, 0x74, 0x6f, + 0x1a, 0x48, 0x70, 0xdc, 0xdf, 0x0b, 0xc6, 0x25, + 0x29, 0x9e, 0xe6, 0xb6, 0x77, 0xec, 0x8c, 0xc0, + 0x1d, 0xce, 0xc4, 0xed, 0x38, 0x9b, 0x4d, 0x0a, + 0x1e, 0xab, 0xad, 0x2d, 0x36, 0xae, 0xb3, 0x1b, + 0x67, 0x93, 0x36, 0x4a, 0x56, 0xb6, 0xd2, 0xb6, + 0xdd, 0x1c, 0xe5, 0xb3, 0x12, 0x62, 0x5a, 0xea, + 0x95, 0x52, 0xa3, 0xbb, 0x29, 0x79, 0x19, 0x95, + 0xb5, 0x3d, 0x63, 0x42, 0x9b, 0xcd, 0x7d, 0xf5, + 0xde, 0x6b, 0x7c, 0x0a, 0x07, 0x29, 0x3f, 0xe6, + 0x76, 0xbf, 0x68, 0xdf, 0x0a, 0x9e, 0xcd, 0x7d, + 0xf5, 0xde, 0x6b, 0x7c, 0x0b, 0x2f, 0x99, 0xfb, + 0xa3, 0xe0, 0xf4, 0xfc, 0x87, 0xf0, 0xed, 0xf1, + 0x73, 0xdb, 0x8a, 0xdc, 0x44, 0x37, 0xde, 0x16, + 0x9d, 0xa7, 0x24, 0x5f, 0xb4, 0x6f, 0x46, 0x3c, + 0x25, 0x6f, 0xb6, 0xf7, 0x88, 0xbc, 0xf6, 0xf8, + 0x57, 0x36, 0xd5, 0x1f, 0xf3, 0x26, 0xfd, 0x98, + 0xf0, 0x95, 0x18, 0x3f, 0x89, 0x1f, 0x05, 0xff, + 0x00, 0x98, 0x71, 0xc1, 0xa4, 0xf3, 0x84, 0x51, + 0x76, 0x94, 0xc4, 0xb5, 0xd5, 0x2a, 0xb5, 0xea, + 0xf2, 0xa7, 0xc5, 0xb3, 0x12, 0x62, 0x5a, 0xea, + 0x95, 0x4d, 0x51, 0xa4, 0x36, 0x62, 0x4c, 0x4b, + 0x5d, 0x52, 0xa9, 0xa9, 0xa4, 0x36, 0x62, 0x4c, + 0x4b, 0x5d, 0x52, 0xa9, 0xa9, 0xa4, 0x36, 0x62, + 0x4c, 0x4b, 0x5d, 0x52, 0xa9, 0xa9, 0xa4, 0x36, + 0x62, 0x4c, 0x4b, 0x5d, 0x52, 0xa9, 0xa9, 0xa4, + 0x36, 0x62, 0x4c, 0x4b, 0x5d, 0x52, 0xa9, 0xa9, + 0xa4, 0x36, 0x62, 0x4c, 0x4b, 0x5d, 0x52, 0xa9, + 0xa9, 0xa4, 0x3a, 0x2d, 0xe3, 0x33, 0xdc, 0x45, + 0x08, 0xd3, 0xce, 0x3c, 0x36, 0x9d, 0xbf, 0x29, + 0x5d, 0xdd, 0x71, 0x1c, 0x33, 0x45, 0x6d, 0xf9, + 0xcf, 0x69, 0xc3, 0xfd, 0x80, 0x15, 0x57, 0x66, + 0xa2, 0xe7, 0x73, 0x26, 0xbe, 0x95, 0x6c, 0x2d, + 0x73, 0x8f, 0x6c, 0xe8, 0x0b, 0xbb, 0x32, 0xbf, + 0x11, 0xed, 0x15, 0xa8, 0xaf, 0x8b, 0x08, 0x6b, + 0x5d, 0xff, 0x00, 0xe4, 0xd7, 0xde, 0x21, 0x67, + 0xcd, 0xf5, 0x5f, 0x4e, 0x50, 0xdf, 0xe5, 0x7f, + 0xdb, 0xc5, 0xbb, 0x4f, 0xba, 0xf1, 0x1f, 0x84, + 0xb8, 0x33, 0xc8, 0xb9, 0x8c, 0xca, 0x50, 0x74, + 0x07, 0xd1, 0xe3, 0xb4, 0xe1, 0xa7, 0x80, 0x85, + 0xe2, 0xdf, 0x29, 0xbe, 0xb8, 0xb6, 0x17, 0x31, + 0x34, 0x18, 0xc8, 0x24, 0x78, 0xc2, 0xba, 0x2b, + 0xc4, 0xa4, 0x76, 0xb6, 0x1f, 0xd8, 0x5c, 0xef, + 0x56, 0x37, 0x70, 0xd4, 0x78, 0x0a, 0xef, 0xc8, + 0x8e, 0x1c, 0x92, 0x37, 0xeb, 0x2d, 0x0f, 0x3c, + 0x05, 0xca, 0x7b, 0x93, 0x18, 0xe2, 0x63, 0xc7, + 0x5d, 0x15, 0xf4, 0xd5, 0xb7, 0x98, 0xc9, 0x13, + 0xc2, 0x22, 0x38, 0x21, 0xa1, 0xd9, 0xec, 0xc6, + 0x58, 0x84, 0x94, 0x6b, 0x31, 0x0a, 0x86, 0x38, + 0xd0, 0xe9, 0xee, 0x28, 0xe9, 0x62, 0x9a, 0x19, + 0x8c, 0x12, 0xb4, 0xb6, 0x56, 0x90, 0x0b, 0x7b, + 0x7b, 0xdb, 0xea, 0x73, 0x67, 0xb3, 0x4b, 0xcb, + 0xbb, 0xe9, 0x63, 0x9e, 0x42, 0xf6, 0x60, 0x2e, + 0x0d, 0xa0, 0xa0, 0x35, 0xdc, 0x5a, 0x73, 0xd9, + 0xe3, 0xb6, 0xcf, 0x21, 0x99, 0xed, 0xc6, 0xc6, + 0xb5, 0xaf, 0x2d, 0xd5, 0x52, 0x2b, 0x4d, 0x3d, + 0xc5, 0x6a, 0xe4, 0xc9, 0xba, 0x6b, 0x31, 0x13, + 0xc3, 0x55, 0x32, 0x60, 0xc3, 0xda, 0xad, 0xeb, + 0x6d, 0xbf, 0x56, 0xd9, 0x99, 0xe2, 0xd5, 0x0e, + 0xcf, 0x66, 0x32, 0xc6, 0x1f, 0x46, 0xc7, 0x51, + 0x50, 0x1e, 0x48, 0x34, 0xec, 0xd0, 0x15, 0xcf, + 0x7b, 0x95, 0xde, 0x59, 0x00, 0x66, 0x68, 0x2c, + 0x3a, 0x31, 0xb4, 0xd5, 0xab, 0xbe, 0xee, 0xff, + 0x00, 0x34, 0xcd, 0x0c, 0x7d, 0x5d, 0x0c, 0xd0, + 0xc6, 0xdd, 0x2e, 0x77, 0x92, 0x09, 0xdc, 0xf1, + 0x94, 0x96, 0x70, 0xc7, 0x75, 0x24, 0xc2, 0x60, + 0x0c, 0x81, 0x8d, 0x2e, 0xf3, 0xb4, 0x28, 0x8c, + 0x97, 0xdd, 0x5d, 0x66, 0x34, 0x99, 0xd2, 0x61, + 0x69, 0xf2, 0xd8, 0xad, 0x4b, 0xcd, 0x62, 0xd1, + 0x35, 0xae, 0xb1, 0x3f, 0xab, 0x2c, 0x6c, 0xee, + 0x9c, 0xa9, 0xa7, 0xfa, 0xcf, 0xf0, 0xaa, 0xc4, + 0x70, 0xcd, 0x71, 0x71, 0xcc, 0xc0, 0xc2, 0xf7, + 0xb8, 0x9a, 0x01, 0xb8, 0x01, 0xdd, 0x56, 0x7d, + 0x9b, 0x3f, 0xe5, 0x0d, 0xf3, 0x9f, 0xe1, 0x5c, + 0x9b, 0x2b, 0x13, 0x49, 0xb9, 0x9c, 0x8f, 0x1b, + 0x1e, 0x00, 0x7b, 0x1b, 0xaa, 0xb1, 0x7d, 0xb3, + 0x96, 0x63, 0xc7, 0x5d, 0x21, 0xd2, 0xf8, 0xa3, + 0x24, 0x79, 0x7a, 0x4c, 0xfe, 0xaf, 0xe8, 0x72, + 0x0d, 0x9a, 0xcc, 0x4b, 0x71, 0x56, 0x3a, 0xd3, + 0xc9, 0xa9, 0xaf, 0x82, 0x8a, 0x36, 0xe2, 0x09, + 0xed, 0xa5, 0x31, 0x4e, 0xdc, 0x0f, 0x6e, 0xba, + 0xea, 0xa7, 0x61, 0x4a, 0x75, 0xad, 0xd8, 0xda, + 0x02, 0xc3, 0x23, 0xb9, 0x9e, 0x74, 0xc5, 0xcd, + 0xfe, 0x6e, 0x1d, 0x5a, 0x97, 0x5e, 0xd3, 0xdb, + 0xb1, 0xcf, 0xb2, 0x90, 0x8f, 0x19, 0xd2, 0x88, + 0x89, 0xec, 0x15, 0x68, 0xc9, 0x78, 0x98, 0xdd, + 0xed, 0x87, 0x1b, 0xe0, 0xc5, 0x6c, 0x77, 0xb6, + 0x39, 0x98, 0x9a, 0x4e, 0x9c, 0xfd, 0xa8, 0xdb, + 0x5c, 0x8e, 0xfe, 0xe6, 0x21, 0x33, 0x43, 0x58, + 0xc7, 0x69, 0x66, 0x33, 0x42, 0x47, 0x6a, 0x89, + 0x1e, 0x45, 0x99, 0x3c, 0xb8, 0x60, 0x03, 0x0b, + 0xb0, 0x9a, 0x90, 0x3b, 0xa3, 0xb8, 0xa6, 0xf3, + 0xfb, 0xa9, 0x2c, 0x72, 0xf1, 0xec, 0xee, 0xc0, + 0xe7, 0x39, 0xac, 0x6b, 0x86, 0xe0, 0xfc, 0x82, + 0xd9, 0x90, 0x5d, 0xcb, 0x79, 0x97, 0xb6, 0x49, + 0x5d, 0x8a, 0x46, 0x39, 0xcd, 0x73, 0xb7, 0x4d, + 0x37, 0xd4, 0x4e, 0x5b, 0xed, 0x9b, 0x46, 0x9a, + 0x6b, 0xa3, 0xaf, 0xa5, 0xc3, 0x39, 0x7b, 0x5c, + 0x62, 0x62, 0x37, 0x29, 0xe4, 0xd0, 0x91, 0xba, + 0x34, 0x1e, 0xda, 0x62, 0x5e, 0x65, 0x71, 0x32, + 0xbe, 0xbf, 0x38, 0xf8, 0x57, 0x9a, 0xae, 0xfa, + 0xcf, 0x0f, 0x67, 0x06, 0x0d, 0x23, 0x59, 0xd3, + 0x9c, 0xb6, 0x62, 0x4c, 0x4b, 0x5d, 0x52, 0xa9, + 0xa9, 0xa4, 0x36, 0x62, 0x4c, 0x4b, 0x5d, 0x52, + 0xa9, 0xa9, 0xa4, 0x36, 0x62, 0x4c, 0x4b, 0x5d, + 0x52, 0xa9, 0xa9, 0xa4, 0x36, 0x62, 0x4c, 0x4b, + 0x5d, 0x52, 0xa9, 0xa9, 0xa4, 0x36, 0x62, 0x4c, + 0x4b, 0x5d, 0x52, 0xa9, 0xa9, 0xa4, 0x36, 0x62, + 0x4c, 0x4b, 0x5d, 0x52, 0xa9, 0xa9, 0xa4, 0x36, + 0x62, 0x4c, 0x4b, 0x5d, 0x52, 0xa9, 0xa9, 0xa4, + 0x3a, 0xac, 0x5c, 0x7d, 0xb6, 0xde, 0x9e, 0xb5, + 0x9f, 0x58, 0x2b, 0x16, 0x72, 0x3f, 0xee, 0x87, + 0x65, 0x83, 0xe5, 0x55, 0xab, 0x13, 0xff, 0x00, + 0x7d, 0x6d, 0xf6, 0xac, 0xfa, 0xc1, 0x59, 0x73, + 0x9f, 0x7a, 0x1e, 0x67, 0x1a, 0xcd, 0xe6, 0x7c, + 0x6a, 0xf4, 0x7f, 0x97, 0xfd, 0x99, 0x3e, 0x2e, + 0x38, 0x7f, 0x6b, 0x1f, 0x9c, 0xdf, 0x0a, 0x97, + 0x51, 0x30, 0xfe, 0xd6, 0x3f, 0x39, 0xbe, 0x15, + 0x2c, 0xb8, 0x37, 0x0a, 0x3f, 0x32, 0xf7, 0xab, + 0x4f, 0xb4, 0xf9, 0x42, 0x90, 0x51, 0xf9, 0x97, + 0xbd, 0x5a, 0x7d, 0xa7, 0xca, 0x10, 0x63, 0x2c, + 0xf7, 0xab, 0xcf, 0x3c, 0xf8, 0x4a, 0x91, 0x51, + 0xd9, 0x67, 0xbd, 0x5e, 0x79, 0xe7, 0xc2, 0x54, + 0x8a, 0x0c, 0x3b, 0x51, 0x50, 0xe7, 0x59, 0x53, + 0x0e, 0xd4, 0x54, 0x39, 0xd6, 0x50, 0x37, 0x56, + 0xec, 0xfb, 0xfd, 0x3f, 0x6e, 0x7f, 0xae, 0xdf, + 0xef, 0x2d, 0x3b, 0xab, 0x6e, 0xd0, 0x1a, 0x6c, + 0xec, 0x1e, 0x7b, 0x3f, 0xbc, 0xad, 0x8f, 0xef, + 0xaf, 0xc5, 0xcf, 0x3f, 0xf0, 0xaf, 0xf0, 0x56, + 0x31, 0x26, 0x25, 0xaf, 0x12, 0x62, 0x5b, 0x67, + 0xdb, 0xf1, 0x78, 0xfa, 0x78, 0x36, 0x62, 0x4a, + 0xd7, 0x42, 0xd7, 0x89, 0x63, 0x12, 0x47, 0x89, + 0xb7, 0x84, 0xfc, 0x17, 0x5d, 0x97, 0x94, 0x3f, + 0x2a, 0xc1, 0xf9, 0xcc, 0x7b, 0xc1, 0x1b, 0xd5, + 0x3a, 0x15, 0x65, 0xb0, 0x17, 0x66, 0x7e, 0xc8, + 0x41, 0x24, 0xcd, 0x81, 0xcd, 0xec, 0x07, 0x6b, + 0x5e, 0xb2, 0x5c, 0xea, 0x4c, 0xb2, 0x57, 0x12, + 0xde, 0x76, 0x09, 0x69, 0xce, 0x33, 0x51, 0xa8, + 0xdd, 0x6a, 0x9d, 0xf8, 0x97, 0x22, 0xc7, 0xcf, + 0x88, 0x9d, 0xed, 0x04, 0x69, 0x38, 0x06, 0x3e, + 0x15, 0xc3, 0x4b, 0x52, 0xd3, 0x3a, 0x6b, 0xb9, + 0xb3, 0x5c, 0x79, 0x71, 0xe3, 0xdd, 0x68, 0xac, + 0xd3, 0xd8, 0xf1, 0xb4, 0x56, 0x19, 0x75, 0x9d, + 0x93, 0x64, 0x8a, 0x16, 0xb2, 0x47, 0x3c, 0x0d, + 0x1a, 0xc8, 0x00, 0xd5, 0x76, 0xed, 0x37, 0x8d, + 0x93, 0xb9, 0xcd, 0xf1, 0x86, 0x26, 0xba, 0xa3, + 0x7b, 0x7f, 0xbe, 0xab, 0x39, 0xd6, 0x74, 0xfc, + 0xd2, 0x66, 0xf8, 0xbc, 0xdc, 0x51, 0xd7, 0x9b, + 0x61, 0xd2, 0x6a, 0x77, 0x5d, 0xd9, 0x52, 0x59, + 0x76, 0xd3, 0x5a, 0x7b, 0x18, 0xb3, 0xcc, 0xa3, + 0x2f, 0x6b, 0x5b, 0x83, 0x18, 0x18, 0x83, 0x9a, + 0x35, 0x55, 0xaa, 0x27, 0x1d, 0xf6, 0xd6, 0xde, + 0x33, 0x12, 0xb5, 0x72, 0xe2, 0x9b, 0x5e, 0x91, + 0xf4, 0x56, 0xd1, 0xc2, 0xde, 0xc9, 0x75, 0x6c, + 0x83, 0x5d, 0xec, 0x97, 0x0e, 0xfc, 0xd3, 0x2e, + 0x8e, 0x00, 0xbd, 0x64, 0x4f, 0x12, 0x66, 0x99, + 0x9b, 0x86, 0xae, 0x70, 0x77, 0x8b, 0x82, 0xe6, + 0xb8, 0xda, 0x6c, 0xbe, 0xda, 0xd4, 0xdb, 0xe5, + 0x70, 0x96, 0x92, 0x08, 0x6d, 0x46, 0x16, 0x8a, + 0xeb, 0x2a, 0x3f, 0x21, 0xce, 0x2d, 0xf2, 0xc7, + 0x4c, 0x67, 0x6b, 0xe4, 0xe7, 0x69, 0x4c, 0x14, + 0x3a, 0x45, 0x49, 0xad, 0x5d, 0xd9, 0x49, 0xad, + 0xa7, 0x7c, 0xe8, 0x8a, 0xe4, 0xc7, 0x4e, 0xc5, + 0x22, 0xdb, 0xa2, 0x9c, 0x66, 0xcd, 0xb9, 0x83, + 0xbf, 0xfb, 0x31, 0x1b, 0xd3, 0x30, 0x78, 0x14, + 0xae, 0xd7, 0x68, 0xb0, 0x8b, 0xed, 0x7e, 0x42, + 0xab, 0xb7, 0x59, 0x8c, 0x53, 0x67, 0x1e, 0xde, + 0xd6, 0xbb, 0x9a, 0x32, 0x32, 0x4c, 0x26, 0x98, + 0xa8, 0xdc, 0x21, 0x76, 0xe7, 0x99, 0xfd, 0xb6, + 0x65, 0x6a, 0xc8, 0xa2, 0x64, 0x8c, 0x73, 0x5f, + 0x88, 0x97, 0x80, 0x37, 0x29, 0xb8, 0xe2, 0xad, + 0x35, 0xb6, 0xb8, 0xf8, 0x7b, 0x14, 0xdf, 0x48, + 0xa6, 0x78, 0x89, 0xe3, 0x92, 0x77, 0x27, 0x72, + 0xad, 0x3b, 0x39, 0x1d, 0x35, 0xf3, 0x2e, 0xfe, + 0xf2, 0x89, 0xd8, 0xe3, 0x5b, 0x99, 0xfb, 0x11, + 0x8f, 0xac, 0xb1, 0x93, 0xed, 0x35, 0xbd, 0xa5, + 0x9b, 0x2d, 0x2e, 0xa3, 0x77, 0xea, 0xfc, 0x56, + 0xbd, 0xb4, 0x20, 0x82, 0x7b, 0x61, 0x62, 0xdf, + 0x68, 0x32, 0xdb, 0x7c, 0xca, 0x5b, 0x98, 0x61, + 0x7b, 0x61, 0x92, 0x26, 0xb3, 0x03, 0x1a, 0xd0, + 0x71, 0x03, 0x52, 0x69, 0x8b, 0xb2, 0xab, 0xb6, + 0xd1, 0x17, 0x8d, 0x3e, 0xe7, 0x4e, 0xe6, 0x39, + 0x9c, 0x56, 0x9b, 0x47, 0xd1, 0xe3, 0xf2, 0xd1, + 0xa3, 0x69, 0x9c, 0x46, 0x71, 0x28, 0xfe, 0xab, + 0x34, 0x77, 0x14, 0xed, 0x81, 0xe7, 0x36, 0x6d, + 0x98, 0x3c, 0x6f, 0xd4, 0x38, 0x50, 0x6f, 0x8a, + 0xe8, 0x55, 0x5c, 0xe2, 0xfe, 0x3b, 0xfb, 0xf7, + 0x5d, 0x44, 0x1c, 0xd6, 0x38, 0x36, 0x81, 0xd4, + 0x07, 0x40, 0xec, 0x12, 0xbb, 0xb2, 0x2d, 0xa1, + 0x6d, 0x84, 0x46, 0xda, 0xe5, 0xa5, 0xf6, 0xf5, + 0xc4, 0xd2, 0xdd, 0x25, 0xa4, 0xeb, 0x14, 0xdd, + 0xaa, 0xb5, 0xeb, 0x3b, 0x29, 0xc3, 0x8c, 0x71, + 0x52, 0x99, 0x29, 0x5c, 0xb9, 0x75, 0x9d, 0x22, + 0xf1, 0xa6, 0xbe, 0xf9, 0x6c, 0xd9, 0x16, 0xb9, + 0xd9, 0x8b, 0xdd, 0x43, 0x85, 0xb1, 0x10, 0xe3, + 0xd9, 0x25, 0x9a, 0x3b, 0xcb, 0xbe, 0x69, 0x31, + 0x6d, 0x6c, 0x0d, 0x69, 0xf2, 0x63, 0x2d, 0x27, + 0xfb, 0x0f, 0x2b, 0x5b, 0x76, 0x8f, 0x24, 0xb3, + 0x6b, 0xdd, 0x61, 0x01, 0xe7, 0x1f, 0xa4, 0x86, + 0xb4, 0x34, 0x13, 0xfd, 0x62, 0xa1, 0x6c, 0xf3, + 0x52, 0xcc, 0xe4, 0x66, 0x37, 0x20, 0xba, 0xae, + 0x73, 0x9c, 0xd6, 0x6b, 0x01, 0xcd, 0x73, 0x00, + 0x15, 0xd1, 0xba, 0xa3, 0x4b, 0x5a, 0x66, 0xda, + 0x7b, 0x16, 0xdd, 0x4a, 0x52, 0x98, 0xe2, 0xd1, + 0x3f, 0x56, 0xe9, 0x98, 0xf6, 0x25, 0x76, 0xbc, + 0xd2, 0x7b, 0x6a, 0x7c, 0xd7, 0x78, 0x55, 0x7f, + 0x12, 0x90, 0xcf, 0xb3, 0x88, 0x33, 0x39, 0x21, + 0x7c, 0x0c, 0x7b, 0x04, 0x6d, 0x21, 0xc1, 0xe0, + 0x03, 0xa4, 0xf6, 0x1c, 0xa2, 0xb1, 0x7e, 0x5f, + 0x95, 0x17, 0x4c, 0x51, 0xa5, 0x22, 0x65, 0x9f, + 0xcc, 0xe9, 0x6c, 0xb7, 0xb4, 0x4f, 0xd3, 0x3a, + 0x4a, 0xf7, 0x96, 0x38, 0xb7, 0x67, 0xe1, 0x73, + 0x4d, 0x1c, 0x20, 0x24, 0x11, 0xda, 0x2a, 0xa0, + 0xfc, 0xc6, 0xfa, 0x56, 0x61, 0x7d, 0xc4, 0x8e, + 0x69, 0xdc, 0xc4, 0x54, 0xbd, 0xa6, 0xd2, 0xd9, + 0xc1, 0x95, 0x32, 0xc9, 0xf1, 0xc8, 0x64, 0x6c, + 0x66, 0x32, 0xe0, 0x1b, 0x4a, 0xd0, 0xff, 0x00, + 0x59, 0x57, 0x03, 0xb4, 0x2a, 0x62, 0xac, 0xc4, + 0xce, 0xb0, 0xeb, 0xe6, 0x32, 0x44, 0xc6, 0x28, + 0xad, 0xa7, 0x85, 0x7d, 0x8b, 0x0e, 0xc9, 0x38, + 0x1b, 0xe9, 0x59, 0xa8, 0xba, 0x23, 0x4e, 0x10, + 0xba, 0xf3, 0xac, 0xef, 0x30, 0xb2, 0xcc, 0x4d, + 0xac, 0x01, 0xb8, 0x1c, 0x1b, 0x83, 0x10, 0xa9, + 0x25, 0xda, 0x3c, 0x2a, 0xb9, 0x61, 0x7f, 0x2d, + 0x8d, 0xd3, 0x2e, 0x62, 0xd2, 0xe6, 0x68, 0x2d, + 0xdc, 0x70, 0x3a, 0xc1, 0x56, 0x37, 0x6d, 0x16, + 0x43, 0x70, 0xe6, 0x4d, 0x73, 0x03, 0x8c, 0xf1, + 0xf9, 0x38, 0x99, 0x88, 0x8a, 0x69, 0xd0, 0x54, + 0x5e, 0x3f, 0xdc, 0xdd, 0xa6, 0xed, 0x61, 0x38, + 0x72, 0x56, 0x70, 0xce, 0x38, 0xbf, 0x6a, 0xd1, + 0x6d, 0xda, 0xb9, 0xb3, 0xa7, 0xe7, 0x42, 0xc4, + 0x0b, 0xde, 0x68, 0x42, 0xf7, 0x36, 0x98, 0x7c, + 0xaa, 0x80, 0x78, 0x94, 0xa6, 0x75, 0xfc, 0x81, + 0xe7, 0x57, 0x89, 0x1f, 0x85, 0xaa, 0xbb, 0x9e, + 0x67, 0x67, 0x32, 0x91, 0x8d, 0x8d, 0xa6, 0x3b, + 0x78, 0xcd, 0x58, 0x0e, 0xb7, 0x1d, 0xf7, 0x6f, + 0x2e, 0xbc, 0xc7, 0x69, 0x2d, 0x2e, 0xb2, 0xc3, + 0x64, 0xc8, 0xe4, 0x6c, 0x85, 0xac, 0x68, 0x73, + 0x83, 0x70, 0xe8, 0x23, 0xfa, 0xdd, 0x84, 0xd9, + 0x6d, 0x29, 0xc3, 0xda, 0xb4, 0x65, 0xae, 0xb9, + 0x66, 0x6f, 0xbb, 0x74, 0x44, 0x47, 0xfe, 0x8e, + 0x5d, 0x9e, 0x75, 0x73, 0x7b, 0x7a, 0xee, 0xd7, + 0xea, 0x95, 0x29, 0xb5, 0x64, 0xf3, 0xd6, 0x5d, + 0xb3, 0xe1, 0x6a, 0x81, 0xca, 0xef, 0x63, 0xb2, + 0xbf, 0x8a, 0xe6, 0x40, 0xe7, 0x32, 0x32, 0x6a, + 0xd6, 0xeb, 0xd5, 0xd9, 0xa2, 0xed, 0xce, 0x73, + 0x98, 0x33, 0x39, 0xed, 0x8c, 0x2d, 0x7b, 0x39, + 0xb7, 0x50, 0x87, 0xd0, 0x7e, 0x70, 0xde, 0x71, + 0x56, 0xb5, 0x66, 0x6f, 0x16, 0xd3, 0xd8, 0xe5, + 0x8a, 0x6b, 0xe9, 0xed, 0x5d, 0x74, 0x9b, 0x5e, + 0x26, 0x21, 0x3d, 0xb4, 0xed, 0x27, 0x29, 0x7b, + 0xc0, 0xae, 0x17, 0xb1, 0xc7, 0xb5, 0x55, 0xa7, + 0x64, 0x1a, 0x7d, 0x82, 0x57, 0x6e, 0x3a, 0x43, + 0x43, 0xb9, 0xa0, 0x05, 0xdf, 0x9c, 0x5f, 0x32, + 0xc6, 0xd3, 0x9e, 0x92, 0x3e, 0x76, 0x22, 0xe0, + 0xd7, 0xb3, 0x5f, 0x8a, 0x7b, 0x0a, 0x26, 0xe3, + 0x6a, 0x72, 0xf8, 0x6d, 0x0c, 0x76, 0x11, 0xbb, + 0x1d, 0x08, 0x6b, 0x43, 0x43, 0x5a, 0xd2, 0xb9, + 0x44, 0x5a, 0x69, 0xb6, 0x23, 0xc6, 0x7c, 0x5a, + 0xaf, 0xb2, 0xb9, 0xbb, 0x96, 0xbf, 0x18, 0xa7, + 0x83, 0x6e, 0xce, 0xb8, 0x49, 0x98, 0x66, 0x6e, + 0x1a, 0x46, 0x36, 0xf8, 0x5e, 0xa3, 0x33, 0x13, + 0x4d, 0xa6, 0x23, 0xfc, 0x66, 0x7c, 0x8b, 0x56, + 0x43, 0x9d, 0x43, 0x96, 0xba, 0xe1, 0xd7, 0x0d, + 0x7c, 0x86, 0x6c, 0x24, 0x16, 0x50, 0xe9, 0x05, + 0xc4, 0xd6, 0xa4, 0x7c, 0xe5, 0xcf, 0x75, 0x98, + 0xc5, 0x36, 0x71, 0xed, 0xcd, 0x6b, 0x84, 0x66, + 0x46, 0xbf, 0x09, 0xa6, 0x2a, 0x0d, 0x1b, 0xe4, + 0x2e, 0xbb, 0x6d, 0xbe, 0xfc, 0x3d, 0x9a, 0x33, + 0xdb, 0x25, 0x3b, 0x34, 0x8a, 0xcf, 0x85, 0xf7, + 0x7e, 0x1e, 0xd5, 0x93, 0x6a, 0x9c, 0x1b, 0x6b, + 0x6c, 0xe2, 0x69, 0x4b, 0x86, 0x92, 0x7b, 0x40, + 0xae, 0x9c, 0xea, 0xf6, 0x7b, 0x4c, 0xbb, 0xda, + 0x6d, 0xe8, 0x5c, 0xd2, 0xdd, 0x27, 0x78, 0xaa, + 0xfe, 0x7d, 0x9f, 0x5a, 0xe6, 0x76, 0xac, 0x86, + 0x16, 0x3d, 0x8e, 0x6c, 0x98, 0x89, 0x78, 0x00, + 0x11, 0x47, 0x37, 0xe7, 0x76, 0x57, 0x45, 0x8e, + 0xd3, 0x5a, 0x3a, 0xd0, 0x5a, 0x66, 0x71, 0x97, + 0xd1, 0xb8, 0x0b, 0xa9, 0x89, 0xae, 0x68, 0xdf, + 0x05, 0x73, 0x8a, 0x4c, 0x45, 0x78, 0x78, 0x4c, + 0xba, 0xce, 0x7a, 0xcd, 0xed, 0xb6, 0xfb, 0x77, + 0x56, 0xbb, 0x6f, 0xec, 0xd5, 0xbe, 0xc3, 0x30, + 0xda, 0x1b, 0xe8, 0x0d, 0xc4, 0x1c, 0xcf, 0x36, + 0xd7, 0x11, 0x57, 0x0a, 0x6a, 0xde, 0x5b, 0x76, + 0x50, 0x97, 0xc1, 0x74, 0xf7, 0x69, 0x2e, 0x98, + 0x93, 0xbd, 0x5a, 0x0a, 0xd1, 0x72, 0x5d, 0xed, + 0x35, 0x94, 0x56, 0x66, 0xd3, 0x2b, 0x84, 0xb4, + 0x10, 0x43, 0x4d, 0x30, 0xb5, 0xa0, 0xee, 0xb7, + 0xb2, 0xb9, 0x72, 0x1c, 0xf2, 0xdb, 0x2c, 0x82, + 0x48, 0xe6, 0x64, 0x8f, 0xc6, 0xec, 0x75, 0x60, + 0x04, 0x6a, 0xa1, 0xd6, 0x42, 0x99, 0xac, 0xcd, + 0x67, 0xe9, 0x88, 0xe3, 0xec, 0x84, 0x57, 0x25, + 0x2b, 0x92, 0x93, 0x39, 0x26, 0xfa, 0x7b, 0x75, + 0xe1, 0xaf, 0xb9, 0xc5, 0x9a, 0x38, 0x8c, 0xca, + 0xe8, 0x0d, 0xc9, 0x1d, 0x41, 0xdd, 0x56, 0x82, + 0xdb, 0x6c, 0x97, 0x28, 0xf6, 0x98, 0xe2, 0x0f, + 0x90, 0x35, 0xb8, 0x9d, 0xba, 0xe7, 0x3a, 0x9a, + 0xcf, 0x75, 0x53, 0xef, 0x66, 0x6d, 0xc5, 0xdc, + 0xd3, 0x34, 0x10, 0xd9, 0x5e, 0xe2, 0x01, 0xa5, + 0x40, 0x3b, 0xfa, 0x4a, 0xb1, 0x5a, 0x6d, 0x2e, + 0x5d, 0x2d, 0x8b, 0x6d, 0xb3, 0x18, 0xdc, 0xe2, + 0x1a, 0x1a, 0xe6, 0xe1, 0xc4, 0xd7, 0x51, 0x5b, + 0x24, 0x5a, 0x6b, 0x5e, 0x1e, 0x1e, 0x2e, 0x78, + 0x2d, 0x8e, 0x32, 0x64, 0x9d, 0x62, 0x26, 0x66, + 0x76, 0xda, 0x7d, 0x89, 0x1d, 0x9f, 0xcc, 0x2e, + 0x33, 0x0b, 0x79, 0x66, 0xb8, 0xc3, 0x88, 0x49, + 0x84, 0x35, 0xa2, 0x80, 0x51, 0xad, 0x34, 0xe1, + 0x51, 0xbb, 0x36, 0x4f, 0x5c, 0xde, 0x0f, 0xea, + 0xbb, 0xeb, 0x85, 0x9b, 0x5d, 0xaa, 0xcb, 0xad, + 0xcb, 0xe2, 0x8e, 0xd9, 0xf1, 0xc0, 0xd3, 0xfa, + 0x96, 0xc6, 0x1a, 0x09, 0x1b, 0xa4, 0xd5, 0xc1, + 0x47, 0xe5, 0x59, 0xc5, 0xad, 0x96, 0x65, 0x73, + 0x74, 0xe6, 0x48, 0xe8, 0xa6, 0x0e, 0x0c, 0x0d, + 0xc3, 0x88, 0x55, 0xcd, 0x76, 0x9a, 0xb9, 0x53, + 0x6d, 0xb4, 0xbf, 0x0f, 0x17, 0x4e, 0xe5, 0x75, + 0xc1, 0xae, 0x48, 0xb6, 0xdb, 0x5f, 0x59, 0xe6, + 0xeb, 0xce, 0x60, 0xbb, 0xb8, 0xda, 0x03, 0x1d, + 0xa1, 0xa4, 0xc1, 0x8d, 0x78, 0x35, 0xc3, 0x4a, + 0x00, 0xba, 0x0e, 0xd0, 0xde, 0xd8, 0x4c, 0xdb, + 0x5c, 0xd2, 0x20, 0xe7, 0x50, 0x39, 0xcf, 0x8c, + 0xe9, 0xc2, 0x77, 0x68, 0xa2, 0xae, 0x73, 0xda, + 0xe7, 0x0d, 0xcc, 0xad, 0xd8, 0xec, 0x2d, 0x01, + 0xbc, 0xdb, 0xe8, 0x09, 0x6d, 0x28, 0xe0, 0x48, + 0x25, 0x4a, 0x49, 0x9f, 0xe4, 0x17, 0x58, 0x25, + 0xbb, 0x81, 0xc6, 0x56, 0x79, 0x38, 0x99, 0x52, + 0x08, 0x53, 0x31, 0x3a, 0x44, 0x4c, 0x6b, 0xa4, + 0x15, 0xbd, 0x66, 0xd9, 0x26, 0xb9, 0x36, 0x5b, + 0x5d, 0x74, 0x9f, 0x0f, 0x8b, 0x66, 0xd3, 0xd9, + 0x5b, 0x9b, 0x11, 0x7a, 0xc6, 0x86, 0xca, 0xd7, + 0x36, 0xae, 0x1a, 0x0b, 0x83, 0xb4, 0x69, 0x55, + 0x6c, 0x4a, 0x53, 0x3d, 0xda, 0x01, 0x98, 0xb0, + 0x5b, 0xc2, 0xc2, 0xc8, 0x01, 0x0e, 0x25, 0xda, + 0xdc, 0x46, 0xad, 0x01, 0x43, 0xe2, 0x5d, 0x31, + 0x6e, 0x8a, 0xfd, 0x4e, 0x1e, 0x66, 0x6b, 0x6b, + 0xeb, 0x56, 0xcc, 0x49, 0x89, 0x6b, 0xc4, 0x98, + 0x97, 0x48, 0x70, 0xd1, 0xec, 0xb9, 0x5b, 0xe3, + 0xff, 0x00, 0x4e, 0xda, 0xf6, 0x9a, 0xa9, 0xb8, + 0x95, 0xc6, 0x2f, 0xf4, 0xe5, 0x9f, 0x9a, 0xd5, + 0xc7, 0x3f, 0xdb, 0x1f, 0x16, 0xbf, 0x23, 0xf7, + 0xcf, 0xc2, 0x7f, 0x4b, 0x91, 0x11, 0x16, 0x67, + 0xa2, 0xdd, 0x65, 0xef, 0x70, 0xf9, 0xc1, 0x46, + 0xed, 0x41, 0x23, 0x37, 0x78, 0xdc, 0xc2, 0xcf, + 0x01, 0x52, 0x56, 0x5e, 0xf7, 0x0f, 0x9c, 0x14, + 0x56, 0xd5, 0x1a, 0x67, 0x0f, 0xf3, 0x59, 0xe0, + 0x2b, 0xae, 0x0f, 0xbd, 0x97, 0xce, 0xff, 0x00, + 0x0a, 0x3f, 0x69, 0x19, 0x89, 0x31, 0x2d, 0x78, + 0x93, 0x12, 0xd4, 0xf3, 0x74, 0x6c, 0xc4, 0xa5, + 0x76, 0x62, 0x50, 0xdc, 0xd9, 0xa0, 0x9a, 0x07, + 0xb1, 0xcd, 0x07, 0xb3, 0xb8, 0xa1, 0xb1, 0x2f, + 0x70, 0xcf, 0x24, 0x13, 0x32, 0x68, 0x8d, 0x1f, + 0x19, 0x0e, 0x69, 0xec, 0x85, 0x16, 0x8d, 0x6b, + 0x31, 0xcd, 0x6a, 0x5b, 0x65, 0xab, 0x6e, 0x56, + 0x4f, 0xed, 0x83, 0x1c, 0xdb, 0x98, 0x25, 0xfc, + 0xd7, 0x30, 0xb4, 0x1d, 0xca, 0x83, 0xc4, 0xba, + 0xf2, 0x2c, 0xaa, 0xc6, 0x5c, 0xad, 0x97, 0x17, + 0x30, 0xb5, 0xce, 0x71, 0x73, 0x83, 0x9c, 0x0d, + 0x70, 0x8d, 0x4b, 0x5b, 0x36, 0xa3, 0x2c, 0xb9, + 0x85, 0xac, 0xcc, 0x20, 0x38, 0x81, 0xad, 0x30, + 0x87, 0xb6, 0xbb, 0xe1, 0x68, 0xcd, 0x36, 0xa6, + 0x19, 0x2d, 0x9d, 0x6b, 0x60, 0xc7, 0x34, 0x3c, + 0x61, 0xe7, 0x1d, 0x46, 0x80, 0xdd, 0xdc, 0x20, + 0x6f, 0xae, 0x11, 0xbe, 0x62, 0x29, 0xa7, 0x18, + 0x9f, 0x16, 0xc9, 0xec, 0xef, 0xbe, 0x59, 0xb4, + 0x5a, 0x26, 0x3e, 0xd9, 0xe3, 0xc5, 0x23, 0xb2, + 0xce, 0x63, 0xac, 0x26, 0x6b, 0x68, 0x00, 0x99, + 0xda, 0x06, 0xf5, 0x1b, 0xc4, 0xa1, 0x32, 0xe6, + 0x3f, 0xe2, 0x16, 0x32, 0x9a, 0x5b, 0x2b, 0x89, + 0xed, 0x0a, 0xd4, 0xad, 0x39, 0x1e, 0x74, 0xec, + 0xb2, 0x67, 0xe2, 0x69, 0x92, 0x09, 0x69, 0x8d, + 0xa3, 0x41, 0xa8, 0xfc, 0xe6, 0xef, 0xa9, 0x8f, + 0x88, 0xb6, 0x7e, 0x39, 0x5d, 0x77, 0x14, 0x2e, + 0xf6, 0x97, 0x8a, 0x17, 0x06, 0x51, 0xc6, 0xba, + 0xc5, 0x52, 0x6b, 0x6a, 0xda, 0xfa, 0x47, 0xdd, + 0x1a, 0x23, 0x75, 0x2f, 0x4c, 0x7a, 0xde, 0x29, + 0xb2, 0x63, 0x87, 0xb7, 0x4e, 0x4d, 0x99, 0xfb, + 0x80, 0xbf, 0xcb, 0x99, 0xba, 0x65, 0xc5, 0xdc, + 0xc4, 0xd5, 0x9d, 0xb0, 0x3f, 0xf6, 0x70, 0x76, + 0x65, 0xa7, 0x79, 0x40, 0x5c, 0xe7, 0x0f, 0xbb, + 0xcd, 0x23, 0xbc, 0x95, 0xa5, 0xac, 0x89, 0xed, + 0xc1, 0x18, 0xd6, 0x1a, 0xd3, 0x5d, 0xf0, 0xba, + 0xb3, 0xec, 0xfe, 0xd7, 0x32, 0xb7, 0x8e, 0x38, + 0x59, 0x23, 0x30, 0x3b, 0x19, 0xc6, 0x00, 0xa8, + 0x22, 0x9a, 0x30, 0x92, 0xa7, 0x65, 0xa2, 0xd4, + 0xe0, 0x5f, 0x35, 0x6d, 0x19, 0xf5, 0x9d, 0x37, + 0x5b, 0x6d, 0x7f, 0x04, 0xee, 0x4d, 0xfe, 0x9f, + 0x8c, 0xff, 0x00, 0x52, 0x5f, 0xac, 0xf5, 0x13, + 0xb2, 0x04, 0x9b, 0xcb, 0x81, 0xfe, 0x10, 0xfa, + 0xcb, 0x19, 0x7e, 0xd2, 0x5a, 0x5a, 0xe5, 0x6d, + 0xb2, 0x7c, 0x72, 0x19, 0x03, 0x5e, 0xdc, 0x40, + 0x37, 0x0d, 0x5c, 0x5c, 0xef, 0x9c, 0x37, 0xd7, + 0x0e, 0x43, 0x9b, 0x43, 0x96, 0xcf, 0x24, 0xd3, + 0x35, 0xef, 0x12, 0x30, 0x34, 0x06, 0x01, 0xbe, + 0x0e, 0x9a, 0xb9, 0x36, 0xce, 0x99, 0x38, 0x7b, + 0x75, 0x47, 0x72, 0x9b, 0xbc, 0xbc, 0xee, 0xfe, + 0x1c, 0x71, 0xf9, 0x26, 0x64, 0x3f, 0xfd, 0xb9, + 0x83, 0xfa, 0xa3, 0xea, 0x95, 0xa3, 0x6c, 0x4d, + 0x2e, 0x2d, 0x7b, 0x2c, 0x7f, 0x84, 0x2e, 0x37, + 0xe7, 0x76, 0xee, 0xcf, 0x59, 0x99, 0x06, 0x3c, + 0x44, 0x05, 0x0b, 0x08, 0x18, 0xf5, 0x16, 0xe8, + 0xf1, 0xa8, 0xb5, 0xe7, 0xf9, 0xbc, 0x19, 0x9c, + 0xd0, 0x3e, 0x06, 0xb9, 0x82, 0x26, 0x96, 0x90, + 0xf0, 0x35, 0xb8, 0x82, 0x35, 0x39, 0x4d, 0x69, + 0x68, 0xbd, 0x67, 0x4f, 0xd5, 0x45, 0xef, 0x4e, + 0xd6, 0x48, 0x89, 0xd6, 0x6d, 0x7d, 0xd1, 0x0b, + 0x1d, 0xe9, 0xa6, 0xcd, 0x1f, 0xfc, 0x76, 0x78, + 0x1a, 0xb9, 0x36, 0x3b, 0x4c, 0x37, 0x5d, 0x87, + 0xb7, 0xc0, 0x57, 0x15, 0xc6, 0xd2, 0x59, 0xcd, + 0x93, 0x9b, 0x26, 0xc7, 0x27, 0x39, 0xcd, 0x35, + 0x98, 0x88, 0x18, 0x6b, 0x41, 0xfd, 0x6a, 0xee, + 0x2d, 0x19, 0x0e, 0x77, 0x6f, 0x96, 0x47, 0x30, + 0x9d, 0x92, 0x3f, 0x9d, 0x70, 0x23, 0x00, 0x04, + 0x50, 0x54, 0x6e, 0x90, 0xab, 0xb6, 0xd3, 0x8e, + 0xd1, 0xa7, 0xb7, 0x55, 0xfb, 0xb4, 0xef, 0x63, + 0xb6, 0xbf, 0x6d, 0x36, 0xe9, 0xca, 0x5b, 0xc5, + 0xbe, 0x67, 0x26, 0x73, 0x77, 0x36, 0x5c, 0x40, + 0x7c, 0x52, 0x38, 0x3a, 0xa4, 0x01, 0xa4, 0x9d, + 0x04, 0x1d, 0x61, 0x48, 0xd9, 0x6d, 0x14, 0x8f, + 0xbc, 0x16, 0x17, 0xb0, 0x86, 0xcc, 0x5e, 0x63, + 0xc4, 0xc3, 0x56, 0xe2, 0x1d, 0x82, 0xa1, 0xad, + 0x33, 0xe6, 0xda, 0xe6, 0xb7, 0x17, 0x6d, 0x61, + 0x7c, 0x17, 0x24, 0xe2, 0x66, 0x80, 0xe0, 0x2b, + 0xa0, 0x8d, 0x24, 0x55, 0x49, 0xf5, 0xfe, 0xce, + 0xf3, 0xfe, 0xd8, 0x20, 0x73, 0xae, 0xbe, 0x76, + 0x01, 0x8f, 0x89, 0x2f, 0x13, 0xc3, 0xe8, 0xd7, + 0x84, 0x69, 0x28, 0xc7, 0x68, 0x8d, 0x66, 0xb9, + 0x22, 0xba, 0xda, 0xd3, 0x6a, 0xdb, 0xc2, 0x63, + 0x5f, 0x63, 0x9b, 0x6a, 0x6c, 0xad, 0xed, 0xe5, + 0x8a, 0x68, 0x5a, 0x19, 0xce, 0x92, 0x24, 0x0d, + 0x14, 0xa9, 0x1b, 0xaa, 0x0b, 0x12, 0xeb, 0xce, + 0x73, 0x87, 0x66, 0x77, 0x01, 0xd8, 0x79, 0xb8, + 0xa3, 0x04, 0x46, 0xcd, 0xda, 0x9d, 0xd7, 0x2e, + 0x0c, 0x4b, 0xb6, 0x3d, 0x76, 0xe9, 0x3e, 0xce, + 0x6c, 0xf9, 0xe6, 0xb6, 0xc9, 0x33, 0x5f, 0x0d, + 0x57, 0xc2, 0xe7, 0x47, 0xb3, 0xcd, 0x92, 0x37, + 0x16, 0xbd, 0xb6, 0xad, 0x2d, 0x70, 0xd6, 0x0e, + 0x00, 0xa9, 0xb2, 0xe6, 0x17, 0xb3, 0x37, 0x0c, + 0x93, 0xc8, 0xf1, 0xbc, 0x5c, 0x54, 0xc3, 0xb6, + 0x9a, 0xcd, 0xd9, 0x4f, 0xb0, 0xf3, 0x72, 0x89, + 0x39, 0x91, 0x16, 0x2a, 0x36, 0x98, 0x83, 0x70, + 0xd7, 0xca, 0x55, 0xdc, 0x4a, 0x98, 0x6b, 0x3c, + 0x66, 0xd1, 0xed, 0x74, 0xf3, 0x59, 0x37, 0x6c, + 0x8a, 0xcc, 0xf1, 0x8e, 0x2b, 0x2e, 0xc7, 0xb8, + 0x73, 0xd7, 0x4c, 0x1a, 0x0e, 0x16, 0x90, 0x07, + 0x6c, 0xaf, 0x79, 0x96, 0x77, 0x99, 0x41, 0x99, + 0xbe, 0xca, 0x1c, 0x07, 0xc6, 0x68, 0x88, 0x38, + 0x69, 0x35, 0x0d, 0xf9, 0x6a, 0xa0, 0x72, 0xbc, + 0xca, 0x4c, 0xb6, 0xe9, 0xb3, 0xb0, 0x62, 0xd1, + 0x86, 0x46, 0x6e, 0x10, 0xac, 0x2e, 0xda, 0x2c, + 0x86, 0x59, 0x5b, 0x75, 0x2c, 0x2e, 0x37, 0x2c, + 0x14, 0x6b, 0x8b, 0x01, 0x70, 0xed, 0x1a, 0xa8, + 0xb5, 0x6d, 0xbe, 0x6d, 0xb7, 0x76, 0xbc, 0xd7, + 0xc5, 0x7a, 0xce, 0x1a, 0xd2, 0x32, 0x6c, 0xdb, + 0x6e, 0x31, 0xed, 0x97, 0x2e, 0x76, 0xfc, 0xdd, + 0xb1, 0x44, 0xcb, 0xfe, 0x6f, 0x03, 0xa4, 0xab, + 0x70, 0x6b, 0xa8, 0xdf, 0x52, 0x9b, 0x50, 0x29, + 0x95, 0x13, 0xfe, 0x23, 0x3c, 0x2a, 0xb7, 0x9c, + 0xe7, 0x2e, 0xcc, 0xae, 0x18, 0xe0, 0xd2, 0xc8, + 0x62, 0xfd, 0x9b, 0x09, 0xa9, 0x35, 0xfc, 0xe3, + 0xa4, 0x69, 0x5d, 0xd9, 0xce, 0xd1, 0xda, 0x66, + 0x36, 0x26, 0xda, 0x18, 0xe4, 0x6b, 0xf1, 0x35, + 0xd8, 0x9e, 0x05, 0x34, 0x13, 0xd9, 0x2a, 0xb3, + 0x5b, 0x7d, 0x13, 0xa6, 0x9c, 0x65, 0x68, 0xc9, + 0x8f, 0xfd, 0xd8, 0x9b, 0x4d, 0xb8, 0x44, 0x6b, + 0x3c, 0x5a, 0x76, 0x60, 0x93, 0x9b, 0xc7, 0xd9, + 0x63, 0xd7, 0x7e, 0xd0, 0x10, 0x33, 0xbc, 0xbf, + 0xb2, 0x5b, 0xf5, 0xc2, 0x84, 0xc9, 0xb3, 0x18, + 0xac, 0x2f, 0x9b, 0x71, 0x28, 0x73, 0x98, 0xd6, + 0x11, 0x46, 0xd0, 0x9a, 0x9e, 0xd9, 0x0b, 0xb6, + 0xfb, 0x35, 0x83, 0x32, 0xcd, 0xec, 0x65, 0x85, + 0x8e, 0x63, 0x58, 0xf6, 0x34, 0x87, 0x81, 0xa6, + 0xaf, 0x1a, 0xa8, 0x4a, 0xb5, 0xeb, 0x33, 0x7d, + 0xda, 0x7b, 0x1c, 0xa9, 0x68, 0x8f, 0x2f, 0x34, + 0x9f, 0xbb, 0x74, 0x4e, 0x9f, 0x8a, 0x5f, 0x6b, + 0x1a, 0xee, 0xaf, 0x61, 0xdc, 0x6c, 0xa0, 0xb8, + 0xf6, 0x28, 0x74, 0xaf, 0x5b, 0x2e, 0x08, 0xca, + 0x71, 0xbb, 0x40, 0x2f, 0x79, 0x1d, 0xad, 0x1a, + 0x57, 0x46, 0x73, 0x98, 0x45, 0x65, 0x04, 0x6f, + 0x9e, 0x31, 0x34, 0x32, 0x3f, 0x04, 0x8d, 0xd7, + 0xa2, 0x9b, 0x81, 0x45, 0xdf, 0x6d, 0x4d, 0x97, + 0xb2, 0x3a, 0x0c, 0xbd, 0x8e, 0x0f, 0x73, 0x70, + 0x83, 0x4c, 0x21, 0xa0, 0xe8, 0xd0, 0xb9, 0xd7, + 0x74, 0xd2, 0x2b, 0x11, 0xfa, 0xcd, 0x36, 0xd9, + 0x4c, 0xd7, 0xc9, 0x36, 0xd2, 0xfb, 0x74, 0xdb, + 0x3f, 0xe0, 0xdf, 0xb2, 0x84, 0x39, 0xb7, 0xae, + 0xd6, 0x0c, 0xa0, 0x8e, 0x05, 0x18, 0xd3, 0xff, + 0x00, 0xda, 0x29, 0xff, 0x00, 0xf1, 0x05, 0x79, + 0xc8, 0x33, 0xcb, 0x6c, 0xb2, 0x29, 0x9b, 0x3b, + 0x24, 0x7f, 0x3a, 0xe0, 0xe6, 0xe0, 0x00, 0x8a, + 0x53, 0xb2, 0x42, 0xe4, 0x6e, 0x63, 0x10, 0xce, + 0x7d, 0xbc, 0xb5, 0xdc, 0xd7, 0x39, 0xce, 0x61, + 0xd1, 0x8a, 0x9c, 0xa5, 0xd2, 0x29, 0x31, 0x6c, + 0x9e, 0xde, 0x0e, 0x16, 0xbd, 0x27, 0x1e, 0x2a, + 0xee, 0xe3, 0x16, 0xd6, 0x74, 0x58, 0xf6, 0x91, + 0xe1, 0x97, 0x19, 0x6b, 0xdc, 0x68, 0x1b, 0x3e, + 0x23, 0xdc, 0x2d, 0x5d, 0x19, 0xfd, 0xf5, 0xcd, + 0x85, 0xac, 0x73, 0xdb, 0x80, 0x49, 0x78, 0x6b, + 0xaa, 0x2a, 0x34, 0xaa, 0xfe, 0x7f, 0x9e, 0x5b, + 0xe6, 0x4c, 0x81, 0xb0, 0x35, 0xf1, 0xba, 0x27, + 0x12, 0x4b, 0xc0, 0xa7, 0x8d, 0x4d, 0xe2, 0x77, + 0x97, 0x6d, 0xb6, 0xd3, 0xd8, 0x5c, 0x5a, 0x8b, + 0x7c, 0xd2, 0x12, 0xe2, 0x3c, 0xa3, 0x4c, 0x4d, + 0x75, 0x3f, 0x39, 0x52, 0x71, 0xce, 0xda, 0x70, + 0xd7, 0x4d, 0x78, 0x3a, 0x4e, 0x5a, 0x4d, 0xb2, + 0xd6, 0x2d, 0xb6, 0x6f, 0xb6, 0x62, 0xd3, 0xee, + 0x86, 0xcb, 0x5b, 0xfd, 0xa1, 0xba, 0xb3, 0x37, + 0x51, 0xf3, 0x3c, 0xd1, 0xc5, 0xe5, 0x68, 0x34, + 0x1b, 0xcb, 0xa3, 0x64, 0xf4, 0xe5, 0xae, 0x27, + 0x72, 0x57, 0x28, 0xec, 0xc7, 0x68, 0xed, 0x0d, + 0x99, 0xb3, 0xcb, 0x22, 0x31, 0xc6, 0xe6, 0xe1, + 0x2f, 0x20, 0x34, 0x35, 0xbb, 0xc1, 0xab, 0x5e, + 0x47, 0xb4, 0x16, 0x99, 0x6d, 0x99, 0xb7, 0x96, + 0x39, 0x1e, 0xe2, 0xf2, 0xea, 0xb0, 0x02, 0x28, + 0x7b, 0x6e, 0x0a, 0x66, 0xb6, 0x98, 0x9d, 0x2b, + 0xa7, 0xc2, 0x0a, 0xe4, 0xac, 0x65, 0xaf, 0xfb, + 0x9b, 0xf4, 0xaf, 0xd5, 0x6d, 0x78, 0x6b, 0xed, + 0xd1, 0x17, 0x70, 0x6b, 0x79, 0x28, 0xff, 0x00, + 0x11, 0xc2, 0xbf, 0xda, 0x2a, 0xd9, 0x76, 0x60, + 0xc8, 0x72, 0xd6, 0xba, 0xde, 0x26, 0x97, 0x82, + 0xd8, 0xda, 0x48, 0xd6, 0x48, 0xf2, 0x89, 0x54, + 0xd9, 0xa5, 0xc7, 0x3c, 0x92, 0x37, 0x46, 0x27, + 0xb9, 0xc2, 0xba, 0xf4, 0x9a, 0xab, 0x2b, 0x76, + 0x9b, 0x2a, 0xb9, 0xb3, 0x10, 0xe6, 0x31, 0x17, + 0xbe, 0x83, 0x1c, 0x78, 0x43, 0x9a, 0xe2, 0x37, + 0x41, 0xdc, 0x57, 0xc9, 0x16, 0xd2, 0x9a, 0x71, + 0xe6, 0xe5, 0xe5, 0xe6, 0x91, 0x39, 0x22, 0x7e, + 0x89, 0xbf, 0xdb, 0x36, 0xf6, 0x7c, 0x12, 0x59, + 0x1d, 0xed, 0xc5, 0xf5, 0x81, 0xb9, 0x9c, 0x8c, + 0x6e, 0x73, 0x80, 0xa0, 0xa0, 0xc2, 0x35, 0x28, + 0xcd, 0x91, 0x35, 0xb9, 0xbc, 0xed, 0x33, 0xc2, + 0xe4, 0xb5, 0xda, 0xcb, 0x18, 0xd8, 0xe8, 0xfd, + 0x9d, 0xec, 0x88, 0x1f, 0xd5, 0x08, 0xc3, 0x7c, + 0x8f, 0xeb, 0x55, 0xca, 0x3b, 0x23, 0xce, 0xad, + 0xb2, 0xd9, 0xee, 0xa4, 0x91, 0x8f, 0x73, 0x26, + 0xa7, 0x36, 0x19, 0x42, 0x40, 0x0e, 0x76, 0xba, + 0xbb, 0xb2, 0xb9, 0xec, 0x9d, 0x2d, 0xa5, 0x7c, + 0x5d, 0x3b, 0x95, 0xdd, 0x83, 0xeb, 0x8b, 0x6d, + 0x8b, 0xcc, 0xcf, 0xb5, 0xd5, 0x7d, 0x05, 0xf4, + 0xfb, 0x41, 0x3f, 0xb1, 0x10, 0xd9, 0xa2, 0xa3, + 0xc1, 0xa8, 0x1b, 0x80, 0x6e, 0xae, 0xc8, 0xf6, + 0x86, 0xe6, 0xd6, 0xef, 0xd9, 0x33, 0x38, 0x80, + 0x92, 0xa0, 0x3a, 0x48, 0xce, 0x8f, 0x1b, 0xc9, + 0xf1, 0x54, 0x41, 0xcf, 0x44, 0x79, 0xd3, 0xf3, + 0x18, 0x18, 0x4c, 0x6f, 0xa3, 0x4b, 0x1d, 0x40, + 0x4b, 0x48, 0x15, 0xd4, 0x4e, 0xf2, 0x95, 0x76, + 0x7f, 0xb3, 0xb3, 0x48, 0xdb, 0x89, 0xe1, 0x71, + 0x9d, 0x94, 0xc2, 0x5c, 0xc0, 0x5c, 0x29, 0xb9, + 0x55, 0x6b, 0x44, 0xe9, 0x11, 0x6a, 0xeb, 0xc3, + 0xd9, 0xe2, 0x8c, 0x76, 0xac, 0x5a, 0xd3, 0x5c, + 0x9b, 0x66, 0x6d, 0xaf, 0x1f, 0x06, 0x36, 0xae, + 0xca, 0xde, 0x38, 0x19, 0x79, 0x1b, 0x43, 0x64, + 0xc7, 0x81, 0xf4, 0x14, 0xa8, 0x20, 0x9f, 0x91, + 0x56, 0xb1, 0x29, 0x1c, 0xf3, 0x3e, 0x76, 0x64, + 0x5b, 0x1c, 0x71, 0x98, 0xe1, 0x61, 0xa8, 0x0e, + 0xd6, 0x4e, 0xfe, 0x85, 0x13, 0x89, 0x74, 0xc7, + 0xba, 0x29, 0xc6, 0x7f, 0xf2, 0xe1, 0xe6, 0x26, + 0x96, 0xc9, 0xad, 0x79, 0x7b, 0x3c, 0x1b, 0x71, + 0x26, 0x25, 0xaf, 0x12, 0x62, 0x56, 0x71, 0xda, + 0xef, 0xca, 0x1d, 0xfe, 0x69, 0x6b, 0xf6, 0xad, + 0xf0, 0xab, 0x16, 0x6d, 0xef, 0xae, 0xed, 0x37, + 0xc0, 0xab, 0x59, 0x3b, 0xbf, 0xcd, 0x6d, 0x3e, + 0xd5, 0xbe, 0x15, 0x65, 0xcd, 0xbd, 0xf5, 0xde, + 0x6b, 0x7c, 0x0b, 0x3f, 0x98, 0xf1, 0x8f, 0x83, + 0xd0, 0xf2, 0x31, 0xa5, 0x2f, 0xf1, 0x68, 0xb6, + 0xf7, 0x88, 0xbc, 0xf1, 0xe1, 0x5c, 0x7b, 0x58, + 0x69, 0x99, 0xb7, 0xec, 0xc7, 0x84, 0xae, 0xcb, + 0x6f, 0x78, 0x8b, 0xce, 0x1e, 0x15, 0xc1, 0xb5, + 0xe6, 0x99, 0xa3, 0x7e, 0xc8, 0x78, 0x4a, 0x8c, + 0x1f, 0xc4, 0x8f, 0x83, 0xa7, 0x9e, 0xfe, 0x0f, + 0xe3, 0x08, 0x8c, 0x49, 0x89, 0x6b, 0xc4, 0x98, + 0x96, 0x97, 0x97, 0xb5, 0xb3, 0x12, 0x62, 0x5a, + 0xf1, 0x26, 0x24, 0x36, 0xb6, 0x62, 0x4c, 0x4b, + 0x5e, 0x24, 0xc4, 0x86, 0xd6, 0xcc, 0x49, 0x89, + 0x6b, 0xc4, 0x98, 0x90, 0xda, 0xd9, 0x89, 0x31, + 0x2d, 0x78, 0x93, 0x12, 0x1b, 0x5b, 0x31, 0x26, + 0x25, 0xaf, 0x12, 0x62, 0x43, 0x6b, 0x66, 0x24, + 0xc4, 0xb5, 0xe2, 0x4c, 0x48, 0x6d, 0x6c, 0xc4, + 0x98, 0x96, 0xbc, 0x48, 0x0d, 0x74, 0x6e, 0x9d, + 0x00, 0xa1, 0xb5, 0x6d, 0xd9, 0x2b, 0x7f, 0xfb, + 0x69, 0x67, 0x3a, 0xe4, 0x7e, 0x16, 0xf6, 0x9a, + 0x34, 0xf8, 0x56, 0xe9, 0x73, 0xbd, 0x9e, 0x13, + 0x38, 0xc9, 0xe3, 0x48, 0xc3, 0x42, 0xee, 0x6d, + 0xc7, 0x4b, 0x7b, 0x34, 0x51, 0x16, 0x1b, 0x4c, + 0xdb, 0x2b, 0x18, 0xed, 0x59, 0x6b, 0x5c, 0x00, + 0x82, 0xfc, 0x74, 0xd2, 0x74, 0x93, 0x4c, 0x27, + 0x75, 0x41, 0x97, 0x92, 0x49, 0x26, 0xa4, 0x92, + 0x49, 0xed, 0xf0, 0x2e, 0x51, 0x8e, 0x6d, 0x79, + 0x9b, 0x4e, 0x91, 0xcf, 0xdc, 0xd7, 0x3e, 0x62, + 0x29, 0x8a, 0x95, 0xa4, 0x45, 0xad, 0xc3, 0x58, + 0xf7, 0xaf, 0x19, 0xe4, 0x6c, 0xbb, 0xc9, 0x5f, + 0x34, 0x47, 0x10, 0x0d, 0x13, 0x46, 0x77, 0xc0, + 0xd3, 0xe0, 0x58, 0xc8, 0xcf, 0xf9, 0x0b, 0x4f, + 0xf5, 0x64, 0xf0, 0xb9, 0x42, 0x5a, 0x6d, 0x47, + 0x31, 0x60, 0xcb, 0x39, 0x2d, 0xf9, 0xc6, 0xb1, + 0x98, 0x0b, 0xf1, 0xd3, 0x45, 0x29, 0xab, 0x06, + 0xf2, 0xf3, 0x63, 0xb4, 0xbe, 0xc9, 0x97, 0x8b, + 0x21, 0x6e, 0x5d, 0x46, 0xb9, 0xa1, 0xf8, 0xfe, + 0x75, 0x7f, 0xab, 0xd9, 0x55, 0xed, 0xdb, 0x6c, + 0xc6, 0x9e, 0x12, 0xeb, 0xde, 0xc7, 0xbe, 0x2f, + 0xaf, 0xdd, 0x59, 0x6d, 0xd9, 0x37, 0x57, 0x32, + 0x90, 0x7f, 0x84, 0x7c, 0x2b, 0xb6, 0xfa, 0x08, + 0xee, 0x76, 0x9e, 0xde, 0x29, 0x86, 0x28, 0xf9, + 0xa0, 0xe7, 0x34, 0xea, 0x34, 0xc4, 0x68, 0xa0, + 0x32, 0x7c, 0xd0, 0xe5, 0xb7, 0x46, 0x71, 0x17, + 0x3a, 0x5c, 0xd2, 0xcc, 0x38, 0xb0, 0xd2, 0xa4, + 0x1d, 0xe3, 0xbc, 0xb6, 0xdd, 0xe7, 0xb2, 0xcf, + 0x99, 0x45, 0x98, 0x45, 0x1f, 0x34, 0xf8, 0xc0, + 0x01, 0x85, 0xd5, 0xa8, 0x15, 0xae, 0x9c, 0x21, + 0x5e, 0x71, 0xda, 0x6f, 0x3a, 0x47, 0xea, 0xb8, + 0xd3, 0x25, 0x23, 0x14, 0x56, 0x7d, 0x99, 0x37, + 0xa6, 0xf6, 0x8f, 0x34, 0xbc, 0xb2, 0x7c, 0x56, + 0xf6, 0xa7, 0x9a, 0xe7, 0x1a, 0x4e, 0x20, 0x05, + 0x4e, 0x9a, 0x61, 0x6e, 0x85, 0xd3, 0x9a, 0x63, + 0xf8, 0x7a, 0x4e, 0x70, 0x92, 0xfe, 0x69, 0xb8, + 0x89, 0xd7, 0x5d, 0x0a, 0x36, 0x6d, 0xaf, 0x82, + 0x48, 0xc1, 0x16, 0xb5, 0x98, 0x0f, 0x14, 0xb8, + 0x8a, 0x34, 0xd3, 0x58, 0xaa, 0xe6, 0xba, 0xda, + 0x87, 0xdd, 0xd8, 0x3e, 0xd2, 0x68, 0x3c, 0x79, + 0x59, 0x85, 0xd2, 0x35, 0xf4, 0xf1, 0x8e, 0xee, + 0x1c, 0x26, 0x8b, 0x9c, 0x56, 0xdf, 0x47, 0xd3, + 0xe1, 0x3e, 0x2e, 0xb7, 0xcb, 0x8e, 0x7b, 0xbf, + 0x5c, 0xfd, 0x75, 0xd2, 0xb1, 0xec, 0x8f, 0x82, + 0x73, 0x66, 0x74, 0xe4, 0xed, 0xf3, 0x9f, 0xe1, + 0x5c, 0xbb, 0x29, 0x23, 0x4c, 0x57, 0x51, 0xee, + 0xb2, 0x5c, 0x5d, 0xc3, 0xa1, 0x46, 0x65, 0x9b, + 0x4a, 0xec, 0xbe, 0xcc, 0x5a, 0xfb, 0x3f, 0x39, + 0x42, 0xe2, 0x1f, 0x8e, 0x9e, 0x51, 0xae, 0xac, + 0x0b, 0x87, 0x2e, 0xcd, 0x67, 0xcb, 0xee, 0x8c, + 0xf1, 0x00, 0xe0, 0xed, 0x12, 0x46, 0x75, 0x10, + 0x4d, 0x75, 0xab, 0x6c, 0x9d, 0x32, 0x7c, 0x55, + 0xae, 0x6a, 0x57, 0xb3, 0x3a, 0xfd, 0x91, 0xa4, + 0xbb, 0x79, 0x99, 0x3e, 0x26, 0x31, 0x69, 0xc4, + 0x6e, 0x0b, 0xbf, 0xb3, 0x5c, 0x55, 0xa7, 0x69, + 0x4b, 0x6d, 0x3c, 0xed, 0x67, 0xb1, 0x07, 0x1a, + 0x01, 0x38, 0x92, 0x9f, 0xd5, 0x6a, 0xe7, 0xf8, + 0xc2, 0xd6, 0xbc, 0xe0, 0xb4, 0x3c, 0xee, 0xac, + 0x55, 0x6f, 0x85, 0x41, 0x66, 0x19, 0x8d, 0xc6, + 0x67, 0x74, 0x24, 0x96, 0x82, 0xbe, 0x24, 0x4c, + 0x1a, 0x80, 0x27, 0x55, 0x4a, 0x98, 0x8b, 0x5a, + 0xd1, 0xba, 0x3e, 0xd8, 0x44, 0xdb, 0x1e, 0x3a, + 0xda, 0xb4, 0x99, 0xbd, 0xb2, 0x5b, 0x5d, 0x16, + 0xcd, 0xa5, 0xb7, 0x96, 0xe7, 0x2d, 0x0e, 0x81, + 0xa6, 0x42, 0xc7, 0x87, 0xe1, 0x6e, 0x92, 0x41, + 0xde, 0xe1, 0x5e, 0xf6, 0x6a, 0xda, 0x5b, 0x7c, + 0xb5, 0xad, 0x99, 0xa5, 0x8f, 0x7b, 0x9c, 0xfc, + 0x27, 0x41, 0x5c, 0x02, 0xfb, 0x3e, 0xca, 0xec, + 0x9b, 0xed, 0x76, 0xec, 0x9a, 0x36, 0x00, 0xd6, + 0xc8, 0x1d, 0x57, 0x0d, 0xe0, 0xec, 0x35, 0xe1, + 0x52, 0x39, 0x25, 0xdd, 0xd4, 0xf6, 0x2f, 0xbb, + 0xbd, 0x18, 0x4b, 0x9e, 0xe7, 0x01, 0x4a, 0x00, + 0xc6, 0x80, 0x34, 0x03, 0xda, 0x2b, 0x95, 0xb5, + 0xd9, 0x31, 0xe3, 0x5d, 0x5a, 0x2b, 0xb6, 0x73, + 0x6e, 0x9d, 0x62, 0xdb, 0x78, 0xc4, 0xa9, 0x52, + 0x9f, 0xd6, 0xbf, 0xce, 0x3e, 0x15, 0xe7, 0x12, + 0xf0, 0xf7, 0x55, 0xee, 0x3b, 0xee, 0x2b, 0x18, + 0x96, 0xbe, 0x5f, 0x08, 0x79, 0x96, 0x8d, 0x6d, + 0x33, 0xef, 0x96, 0xcc, 0x49, 0x89, 0x6b, 0xc4, + 0x98, 0x94, 0x23, 0x6b, 0x66, 0x24, 0xc4, 0xb5, + 0xe2, 0x4c, 0x48, 0x6d, 0x6c, 0xc4, 0x98, 0x96, + 0xbc, 0x49, 0x89, 0x0d, 0xad, 0x98, 0x93, 0x12, + 0xd7, 0x89, 0x31, 0x21, 0xb5, 0xb3, 0x12, 0x62, + 0x5a, 0xf1, 0x26, 0x24, 0x36, 0xb6, 0x62, 0x4c, + 0x4b, 0x5e, 0x24, 0xc4, 0x86, 0xd6, 0xcc, 0x49, + 0x89, 0x6b, 0xc4, 0x98, 0x90, 0xda, 0xeb, 0xb0, + 0x77, 0xfd, 0xfd, 0xb7, 0xdb, 0x33, 0xeb, 0x05, + 0x69, 0xce, 0x7d, 0xe8, 0x79, 0x9c, 0x6a, 0xa5, + 0x97, 0x9a, 0xdf, 0xdb, 0x7d, 0xb4, 0x7f, 0x58, + 0x2b, 0x76, 0x73, 0xef, 0x43, 0xcd, 0x1f, 0x2a, + 0xcf, 0xe6, 0x3c, 0x6a, 0xf4, 0x3c, 0x8c, 0x69, + 0x4b, 0xfc, 0x5c, 0x70, 0xfe, 0xd6, 0x3f, 0x39, + 0xbe, 0x15, 0x2c, 0xa2, 0x61, 0xfd, 0xb3, 0x3c, + 0xe6, 0xf8, 0x54, 0xb2, 0xe3, 0x2d, 0x82, 0x8f, + 0xcc, 0xbd, 0xea, 0xd3, 0xed, 0x3e, 0x50, 0xa4, + 0x14, 0x7e, 0x65, 0xef, 0x56, 0x9f, 0x69, 0xf2, + 0x84, 0x18, 0xcb, 0x3d, 0xea, 0xf3, 0xcf, 0x3e, + 0x12, 0xa4, 0x54, 0x76, 0x59, 0xef, 0x57, 0x9e, + 0x79, 0xf0, 0x95, 0x22, 0x83, 0x0e, 0xd4, 0x54, + 0x39, 0xd6, 0x54, 0xc3, 0xb5, 0x15, 0x0e, 0x75, + 0x94, 0x0d, 0x35, 0xd1, 0xb8, 0x56, 0xfc, 0xdd, + 0x9c, 0xfe, 0xcd, 0x07, 0x33, 0x5d, 0xbb, 0x83, + 0x88, 0xf3, 0x4d, 0x3f, 0xbc, 0xb4, 0x2e, 0xcc, + 0xba, 0x76, 0x02, 0xfb, 0x59, 0xb4, 0xc5, 0x38, + 0x22, 0x87, 0x7c, 0xe8, 0x3d, 0xe5, 0x35, 0x9d, + 0x26, 0x25, 0x5b, 0xd7, 0x75, 0x66, 0xbd, 0x51, + 0xa2, 0x91, 0x5d, 0x03, 0xb4, 0x13, 0x12, 0xee, + 0xce, 0xf2, 0x89, 0xf2, 0xab, 0xa2, 0xd2, 0x2b, + 0x6c, 0xf3, 0xfa, 0x89, 0x37, 0x29, 0xf3, 0x4f, + 0x64, 0x28, 0xec, 0x43, 0x7f, 0x52, 0xd7, 0x13, + 0xbb, 0x8b, 0xca, 0xb5, 0x36, 0xcc, 0xc4, 0xf0, + 0xd3, 0x83, 0xde, 0x24, 0xc4, 0xbc, 0x62, 0x58, + 0xc4, 0x14, 0xaa, 0xd9, 0x89, 0x2a, 0xb5, 0xe2, + 0x09, 0x88, 0x20, 0xd9, 0x89, 0x31, 0x2d, 0x78, + 0x82, 0x62, 0x08, 0x36, 0x55, 0x31, 0x2d, 0x78, + 0x82, 0x62, 0x08, 0x36, 0x55, 0x31, 0x2d, 0x78, + 0x82, 0x62, 0x08, 0x36, 0x55, 0x31, 0x2d, 0x78, + 0x82, 0x62, 0x08, 0x36, 0x62, 0x4c, 0x4b, 0x5e, + 0x20, 0x98, 0x82, 0x0d, 0x98, 0x93, 0x12, 0xd7, + 0x88, 0x26, 0x20, 0x83, 0x66, 0x24, 0xc4, 0xb5, + 0xe2, 0x09, 0x88, 0x20, 0xd9, 0x89, 0x31, 0x2d, + 0x78, 0x82, 0x62, 0x08, 0x36, 0x62, 0x4a, 0xad, + 0x78, 0x82, 0x62, 0x08, 0x36, 0x55, 0x31, 0x2d, + 0x78, 0x82, 0x62, 0x08, 0x36, 0x62, 0x59, 0x63, + 0xf0, 0xbd, 0xae, 0xd7, 0x42, 0x0d, 0x3b, 0x46, + 0xbd, 0x95, 0xab, 0x10, 0x4c, 0x49, 0x31, 0xac, + 0x68, 0x71, 0xf6, 0x2c, 0x19, 0xbe, 0xd2, 0x37, + 0x32, 0xb4, 0xf6, 0x56, 0xdb, 0x98, 0xea, 0xe0, + 0xec, 0x45, 0xd5, 0xef, 0x50, 0x28, 0x3c, 0x4b, + 0xc6, 0x20, 0x98, 0x82, 0x88, 0xac, 0x44, 0x69, + 0x10, 0xbd, 0xef, 0x36, 0xb6, 0xb3, 0xec, 0x87, + 0xbc, 0x49, 0x89, 0x6b, 0xc4, 0x13, 0x10, 0x52, + 0xa3, 0x66, 0x24, 0xc4, 0xb5, 0xe2, 0x09, 0x88, + 0x20, 0xd9, 0x89, 0x2a, 0xb5, 0xe2, 0x09, 0x88, + 0x20, 0xd9, 0x89, 0x31, 0x2d, 0x78, 0x82, 0x62, + 0x08, 0x36, 0x55, 0x31, 0x2d, 0x78, 0x82, 0x62, + 0x08, 0x36, 0x55, 0x31, 0x2d, 0x78, 0x82, 0x62, + 0x08, 0x36, 0x62, 0x4c, 0x4b, 0x5e, 0x20, 0x98, + 0x82, 0x0d, 0x98, 0x93, 0x12, 0xd7, 0x88, 0x2c, + 0xd7, 0xbd, 0xa4, 0xa0, 0xf7, 0x8a, 0x8a, 0xf3, + 0x2c, 0x6e, 0xb6, 0xca, 0x2c, 0xad, 0x9f, 0xe5, + 0x86, 0xb4, 0x3b, 0xb6, 0x06, 0x95, 0x01, 0xb3, + 0x39, 0x2b, 0xef, 0x2e, 0x1b, 0x7b, 0x70, 0xda, + 0x5a, 0x42, 0x43, 0x81, 0x3a, 0x31, 0x38, 0x6a, + 0xfe, 0xc8, 0xdd, 0x53, 0x57, 0xf7, 0x42, 0xe2, + 0x72, 0x5b, 0xe4, 0x33, 0xc5, 0x6f, 0x71, 0x70, + 0xcf, 0x6d, 0x67, 0x4e, 0x4d, 0xde, 0x4f, 0x16, + 0xd8, 0x9b, 0x4f, 0xb5, 0xcc, 0x88, 0x8b, 0x8b, + 0x5b, 0x65, 0xb3, 0xc3, 0x2e, 0x22, 0x71, 0xd4, + 0x1c, 0x3b, 0xe6, 0x8a, 0x3b, 0x6c, 0x61, 0x7c, + 0x79, 0x93, 0x26, 0xfc, 0xc9, 0xa3, 0x14, 0xf3, + 0x9a, 0x48, 0x77, 0x7a, 0x8b, 0xb5, 0x75, 0xde, + 0x5a, 0x37, 0x3b, 0xcb, 0x39, 0x9c, 0x40, 0x5d, + 0xdb, 0xe9, 0x8d, 0xc7, 0xe7, 0x01, 0xbb, 0xd8, + 0x2a, 0xf8, 0xed, 0xb6, 0xda, 0xb9, 0x67, 0xc7, + 0xdc, 0xc7, 0x35, 0xfc, 0x54, 0x9c, 0x49, 0x89, + 0x62, 0x68, 0xe5, 0xb7, 0x95, 0xd0, 0xcc, 0xd3, + 0x1c, 0x91, 0x9a, 0x39, 0x8e, 0xd6, 0x0f, 0x12, + 0xf3, 0x89, 0x6a, 0xf1, 0xe3, 0x0f, 0x32, 0x63, + 0x4e, 0x13, 0xec, 0x7b, 0xc4, 0x98, 0x97, 0x8c, + 0x4b, 0x18, 0x82, 0x21, 0xb3, 0x12, 0x62, 0x5a, + 0xf1, 0x04, 0xc4, 0x10, 0x6c, 0xaa, 0x62, 0x5a, + 0xf1, 0x04, 0xc4, 0x10, 0x6c, 0xc4, 0x98, 0x96, + 0xbc, 0x41, 0x31, 0x04, 0x1b, 0x2a, 0x98, 0x96, + 0xbc, 0x41, 0x31, 0x04, 0x1b, 0x31, 0x26, 0x25, + 0xaf, 0x10, 0x4c, 0x41, 0x06, 0xcc, 0x49, 0x89, + 0x6b, 0xc4, 0x13, 0x10, 0x41, 0xb3, 0x12, 0x62, + 0x5a, 0xf1, 0x04, 0xc4, 0x10, 0x6c, 0xc4, 0x98, + 0x96, 0xbc, 0x41, 0x31, 0x04, 0x1b, 0x31, 0x26, + 0x25, 0xaf, 0x10, 0x4c, 0x41, 0x06, 0xcc, 0x49, + 0x55, 0xaf, 0x10, 0x4c, 0x41, 0x06, 0xcc, 0x49, + 0x89, 0x6b, 0xc4, 0x13, 0x10, 0x41, 0xb3, 0x12, + 0xdb, 0x6b, 0x30, 0x86, 0xe2, 0x29, 0x88, 0xaf, + 0x35, 0x23, 0x5f, 0xbd, 0xa8, 0xea, 0x5c, 0xd8, + 0x82, 0xce, 0x24, 0x98, 0xd6, 0x34, 0x94, 0xf1, + 0xd6, 0x26, 0x3d, 0x9c, 0x53, 0x99, 0xce, 0xd1, + 0x0c, 0xd2, 0xd9, 0x90, 0xb6, 0x13, 0x16, 0x17, + 0x07, 0x62, 0xc4, 0x0f, 0xc8, 0xa1, 0xb1, 0x2f, + 0x18, 0x96, 0x31, 0x05, 0x11, 0x11, 0x11, 0xa4, + 0x26, 0xd7, 0x9b, 0xce, 0xe9, 0x6c, 0xaa, 0x62, + 0x5a, 0xf1, 0x04, 0xc4, 0x14, 0xaa, 0xd9, 0x89, + 0x2a, 0xb5, 0xe2, 0x09, 0x88, 0x20, 0xd9, 0x54, + 0xc4, 0xb5, 0xe2, 0x09, 0x88, 0x20, 0xd9, 0x89, + 0x31, 0x2d, 0x78, 0x82, 0x62, 0x08, 0x36, 0x62, + 0xae, 0xb4, 0xc4, 0xb5, 0xe2, 0x09, 0x88, 0x20, + 0xd9, 0x89, 0x31, 0x2d, 0x78, 0x82, 0x62, 0x08, + 0x36, 0x55, 0x31, 0x2d, 0x78, 0x82, 0x62, 0x41, + 0xb3, 0x12, 0x57, 0x7d, 0x78, 0xc4, 0x80, 0x97, + 0x10, 0xd6, 0x8c, 0x4e, 0x26, 0x81, 0xa3, 0x59, + 0x3b, 0xc8, 0x9f, 0x1f, 0x0f, 0x14, 0xb6, 0xcd, + 0xc0, 0xeb, 0x8c, 0xe2, 0xde, 0x82, 0xa2, 0x33, + 0xce, 0x38, 0xef, 0x61, 0x04, 0x8e, 0xfa, 0xb0, + 0xe6, 0x4f, 0x0f, 0xbd, 0x92, 0x9b, 0x94, 0x6f, + 0x00, 0x5e, 0x32, 0x2c, 0xbb, 0xa9, 0xac, 0x5d, + 0x75, 0x72, 0x29, 0x77, 0x38, 0xa6, 0x1f, 0x9a, + 0x3f, 0x35, 0xbd, 0xbd, 0xd2, 0xb4, 0x97, 0x39, + 0xc4, 0xb9, 0xda, 0x49, 0x35, 0x3d, 0xd5, 0x97, + 0x2d, 0xb7, 0x5b, 0xe1, 0xc1, 0xe9, 0x79, 0x6c, + 0x73, 0x4a, 0x69, 0x3e, 0xd9, 0xd5, 0xea, 0x27, + 0x60, 0x91, 0x8e, 0xde, 0x70, 0x2b, 0x97, 0x6d, + 0x21, 0x70, 0xb9, 0xb7, 0xb9, 0x1e, 0x44, 0xb1, + 0x96, 0xff, 0x00, 0x69, 0xa7, 0x17, 0xca, 0xba, + 0x3f, 0x23, 0xda, 0x5d, 0xb2, 0xdb, 0xc7, 0x9c, + 0x65, 0x8e, 0xb3, 0x79, 0xa5, 0xc4, 0x62, 0xb1, + 0xbb, 0x78, 0x8d, 0x47, 0xe4, 0x51, 0x49, 0xdb, + 0x68, 0x9e, 0x6b, 0x67, 0xc7, 0x17, 0xa4, 0xd7, + 0xdb, 0x3c, 0x7e, 0x4a, 0x39, 0x26, 0xba, 0x53, + 0x12, 0xcd, 0xcc, 0x13, 0xda, 0xce, 0xe8, 0x2e, + 0x18, 0x59, 0x2b, 0x0d, 0x0b, 0x78, 0xbb, 0x0b, + 0x5e, 0x2a, 0xea, 0x5a, 0xf5, 0xd7, 0xc1, 0xe5, + 0xce, 0xb1, 0xe3, 0xc1, 0xef, 0x12, 0x62, 0x5e, + 0x31, 0x2c, 0x62, 0x08, 0x86, 0xcc, 0x49, 0x89, + 0x6b, 0xc4, 0x13, 0x10, 0x41, 0xb3, 0x12, 0x62, + 0x5a, 0xf1, 0x04, 0xc4, 0x10, 0x6c, 0xc4, 0x98, + 0x96, 0xbc, 0x41, 0x31, 0x04, 0x1b, 0x31, 0x26, + 0x25, 0xaf, 0x10, 0x4c, 0x41, 0x06, 0xcc, 0x49, + 0x89, 0x6b, 0xc4, 0x13, 0x10, 0x41, 0xb3, 0x12, + 0x62, 0x5a, 0xf1, 0x04, 0xc4, 0x10, 0x6c, 0xaa, + 0x62, 0x5a, 0xf1, 0x04, 0xc4, 0x10, 0x6c, 0xaa, + 0x62, 0x5a, 0xf1, 0x04, 0xc4, 0x10, 0x6c, 0xaa, + 0x55, 0x6b, 0xc4, 0x13, 0x10, 0x41, 0xb3, 0x12, + 0x62, 0x5a, 0xf1, 0x04, 0xc4, 0x10, 0x6c, 0xc4, + 0x98, 0x96, 0xbc, 0x41, 0x31, 0x04, 0x1b, 0x31, + 0x25, 0x77, 0x16, 0xbc, 0x41, 0x67, 0x12, 0x9f, + 0x89, 0x31, 0xaa, 0xc1, 0x69, 0xb5, 0xd7, 0xb0, + 0x42, 0x21, 0x96, 0x36, 0x4e, 0x1b, 0xe2, 0x87, + 0x38, 0x90, 0xe3, 0x4f, 0x9c, 0xb5, 0x66, 0x3b, + 0x51, 0x7d, 0x7b, 0x09, 0x80, 0x35, 0xb0, 0x46, + 0xfd, 0x0e, 0xc1, 0x5c, 0x44, 0x6f, 0x54, 0xa8, + 0x4c, 0x49, 0x88, 0x2a, 0x6c, 0xa4, 0x4e, 0xb1, + 0x0e, 0x93, 0x9b, 0x24, 0xd7, 0x4d, 0xda, 0x3d, + 0x92, 0x98, 0x97, 0x8c, 0x41, 0x63, 0x10, 0x56, + 0x73, 0xfc, 0x75, 0x6c, 0xc4, 0x98, 0x96, 0xbc, + 0x41, 0x31, 0x04, 0x1b, 0x31, 0x26, 0x25, 0xaf, + 0x10, 0x4c, 0x41, 0x06, 0xcc, 0x49, 0x89, 0x6b, + 0xc4, 0x13, 0x10, 0x41, 0xb3, 0x12, 0x62, 0x5a, + 0xf1, 0x04, 0xc4, 0x10, 0x6c, 0xc4, 0x98, 0x96, + 0xbc, 0x41, 0x31, 0x04, 0x1b, 0x31, 0x26, 0x25, + 0xaf, 0x10, 0x59, 0xc4, 0x89, 0x7b, 0xc4, 0x98, + 0x97, 0x8a, 0xa5, 0x6a, 0x68, 0x35, 0x9e, 0xe9, + 0xed, 0x01, 0xba, 0x53, 0x5d, 0x11, 0xa6, 0xb3, + 0xa2, 0x47, 0x23, 0x84, 0xdc, 0x66, 0xd6, 0xd1, + 0x8d, 0xc7, 0x87, 0x9f, 0xec, 0x78, 0xdf, 0x22, + 0xb4, 0x66, 0xae, 0x0e, 0xbc, 0x75, 0x3f, 0x34, + 0x00, 0xb9, 0xf6, 0x7b, 0x2b, 0xea, 0xbb, 0x57, + 0xdf, 0xde, 0x37, 0x0d, 0xc4, 0x8d, 0xa3, 0x19, + 0xba, 0xd6, 0xeb, 0x03, 0xb6, 0x77, 0x57, 0x99, + 0x1e, 0x64, 0x79, 0x7b, 0x8d, 0x4b, 0x8d, 0x49, + 0x59, 0xb3, 0x5b, 0x75, 0xbe, 0x0f, 0x47, 0xcb, + 0x63, 0xd9, 0x8e, 0x67, 0xdb, 0x69, 0x7a, 0x87, + 0xf6, 0xd1, 0xf9, 0xcd, 0xf0, 0xa9, 0x65, 0x13, + 0x0f, 0xed, 0x99, 0xe7, 0x37, 0xc2, 0xa5, 0x97, + 0x36, 0x81, 0x47, 0xe6, 0x5e, 0xf5, 0x69, 0xf6, + 0x9f, 0x28, 0x52, 0x0a, 0x3f, 0x32, 0xf7, 0xab, + 0x4f, 0xb4, 0xf9, 0x42, 0x0c, 0x65, 0x9e, 0xf5, + 0x79, 0xe7, 0x9f, 0x09, 0x52, 0x2a, 0x3b, 0x2c, + 0xf7, 0xab, 0xcf, 0x3c, 0xf8, 0x4a, 0x91, 0x41, + 0x87, 0x6a, 0x2a, 0x1c, 0xeb, 0x2a, 0x60, 0xea, + 0x3d, 0xa5, 0x0e, 0x75, 0x94, 0x05, 0x8d, 0x7a, + 0x3b, 0xe1, 0x65, 0x10, 0x49, 0xbe, 0xe2, 0xdb, + 0xa9, 0xf9, 0xcc, 0xc4, 0x73, 0x90, 0x79, 0x2f, + 0xa8, 0xae, 0x82, 0x68, 0x34, 0x28, 0x67, 0xec, + 0xb6, 0x4f, 0x7a, 0x71, 0xe5, 0xd7, 0xa2, 0x3a, + 0xff, 0x00, 0xc3, 0x34, 0x7d, 0x3b, 0x1a, 0x68, + 0xe0, 0xbb, 0x73, 0x3a, 0x7c, 0x31, 0x27, 0x65, + 0xc3, 0xeb, 0x2a, 0x8e, 0x80, 0x6a, 0x34, 0x1d, + 0xf1, 0xa3, 0xc0, 0xad, 0x17, 0x98, 0xf0, 0xe0, + 0xad, 0xf1, 0xd2, 0xfc, 0x6d, 0x09, 0xcf, 0x81, + 0xe5, 0xe9, 0xb1, 0xf2, 0x7f, 0xa5, 0x3e, 0x06, + 0x9b, 0xa6, 0x33, 0x81, 0x42, 0x63, 0x7f, 0xce, + 0x77, 0x09, 0xe3, 0x59, 0xe7, 0x1f, 0xf3, 0xdd, + 0xc2, 0x78, 0xd4, 0xf7, 0x6f, 0xcd, 0xcb, 0xd3, + 0x62, 0xe9, 0x9f, 0xc1, 0x35, 0xf0, 0x34, 0xdd, + 0x31, 0x9c, 0x09, 0xf0, 0x34, 0xdd, 0x31, 0x9c, + 0x0a, 0x17, 0x9c, 0x7f, 0xcf, 0x77, 0x09, 0xe3, + 0x4e, 0x71, 0xff, 0x00, 0x3d, 0xdc, 0x27, 0x8d, + 0x3b, 0xb7, 0xe6, 0x7a, 0x6c, 0x3d, 0x32, 0x9a, + 0xf8, 0x1a, 0x6e, 0x98, 0xce, 0x04, 0xf8, 0x1a, + 0x6e, 0x98, 0xce, 0x05, 0x0b, 0xce, 0x3f, 0xe7, + 0xbb, 0x84, 0xf1, 0xa7, 0x38, 0xff, 0x00, 0x9e, + 0xee, 0x13, 0xc6, 0x9d, 0xdb, 0xf3, 0x3d, 0x36, + 0x1e, 0x99, 0x4d, 0x7c, 0x0d, 0x37, 0x4c, 0x67, + 0x02, 0x7c, 0x0d, 0x37, 0x4c, 0x67, 0x02, 0x85, + 0xe7, 0x1f, 0xf3, 0xdd, 0xc2, 0x78, 0xd3, 0x9c, + 0x7f, 0xcf, 0x77, 0x09, 0xe3, 0x4e, 0xed, 0xf9, + 0x9e, 0x9b, 0x0f, 0x4c, 0xa6, 0xbe, 0x06, 0x9b, + 0xa6, 0x33, 0x81, 0x3e, 0x06, 0x9b, 0xa6, 0x33, + 0x81, 0x42, 0xf3, 0x8f, 0xf9, 0xee, 0xe1, 0x3c, + 0x69, 0xce, 0x3f, 0xe7, 0xbb, 0x84, 0xf1, 0xa7, + 0x76, 0xfc, 0xcf, 0x4d, 0x87, 0xa6, 0x53, 0x5f, + 0x03, 0x4d, 0xd3, 0x19, 0xc0, 0x9f, 0x03, 0x4d, + 0xd3, 0x19, 0xc0, 0xa1, 0x79, 0xc7, 0xfc, 0xf7, + 0x70, 0x9e, 0x34, 0xe7, 0x1f, 0xf3, 0xdd, 0xc2, + 0x78, 0xd3, 0xbb, 0x7e, 0x67, 0xa6, 0xc3, 0xd3, + 0x29, 0xaf, 0x81, 0xa6, 0xe9, 0x8c, 0xe0, 0x4f, + 0x81, 0xa6, 0xe9, 0x8c, 0xe0, 0x50, 0xbc, 0xe3, + 0xfe, 0x7b, 0xb8, 0x4f, 0x1a, 0x73, 0x8f, 0xf9, + 0xee, 0xe1, 0x3c, 0x69, 0xdd, 0xbf, 0x33, 0xd3, + 0x61, 0xe9, 0x94, 0xd7, 0xc0, 0xd3, 0x74, 0xc6, + 0x70, 0x27, 0xc0, 0xd3, 0x74, 0xc6, 0x70, 0x28, + 0x5e, 0x71, 0xff, 0x00, 0x3d, 0xdc, 0x27, 0x8d, + 0x39, 0xc7, 0xfc, 0xf7, 0x70, 0x9e, 0x34, 0xee, + 0xdf, 0x99, 0xe9, 0xb0, 0xf4, 0xca, 0x6b, 0xe0, + 0x69, 0xba, 0x63, 0x38, 0x13, 0xe0, 0x69, 0xba, + 0x63, 0x38, 0x14, 0x2f, 0x38, 0xff, 0x00, 0x9e, + 0xee, 0x13, 0xc6, 0x9c, 0xe3, 0xfe, 0x7b, 0xb8, + 0x4f, 0x1a, 0x77, 0x6f, 0xcc, 0xf4, 0xd8, 0x7a, + 0x65, 0x35, 0xf0, 0x34, 0xdd, 0x31, 0x9c, 0x09, + 0xf0, 0x34, 0xdd, 0x31, 0x9c, 0x0a, 0x17, 0x9c, + 0x7f, 0xcf, 0x77, 0x09, 0xe3, 0x4e, 0x71, 0xff, + 0x00, 0x3d, 0xdc, 0x27, 0x8d, 0x3b, 0xb7, 0xe6, + 0x7a, 0x6c, 0x3d, 0x32, 0x9a, 0xf8, 0x1a, 0x6e, + 0x98, 0xce, 0x04, 0xf8, 0x1a, 0x6e, 0x98, 0xce, + 0x05, 0x0b, 0xce, 0x3f, 0xe7, 0xbb, 0x84, 0xf1, + 0xa7, 0x38, 0xff, 0x00, 0x9e, 0xee, 0x13, 0xc6, + 0x9d, 0xdb, 0xf3, 0x3d, 0x36, 0x1e, 0x99, 0x4d, + 0x7c, 0x0d, 0x37, 0x4c, 0x67, 0x02, 0x7c, 0x0d, + 0x37, 0x4c, 0x67, 0x02, 0x85, 0xe7, 0x1f, 0xf3, + 0xdd, 0xc2, 0x78, 0xd3, 0x9c, 0x7f, 0xcf, 0x77, + 0x09, 0xe3, 0x4e, 0xed, 0xf9, 0x9e, 0x9b, 0x0f, + 0x4c, 0xa6, 0xbe, 0x06, 0x9b, 0xa6, 0x33, 0x81, + 0x3e, 0x06, 0x9b, 0xa6, 0x33, 0x81, 0x42, 0xf3, + 0x8f, 0xf9, 0xee, 0xe1, 0x3c, 0x69, 0xce, 0x3f, + 0xe7, 0xbb, 0x84, 0xf1, 0xa7, 0x76, 0xfc, 0xcf, + 0x4d, 0x87, 0xa6, 0x53, 0x5f, 0x03, 0x4d, 0xd3, + 0x19, 0xc0, 0x9f, 0x03, 0x4d, 0xd3, 0x19, 0xc0, + 0xa1, 0x79, 0xc7, 0xfc, 0xf7, 0x70, 0x9e, 0x34, + 0xe7, 0x1f, 0xf3, 0xdd, 0xc2, 0x78, 0xd3, 0xbb, + 0x7e, 0x67, 0xa6, 0xc3, 0xd3, 0x29, 0xaf, 0x81, + 0xa6, 0xe9, 0x8c, 0xe0, 0x4f, 0x81, 0xa6, 0xe9, + 0x8c, 0xe0, 0x50, 0xbc, 0xe3, 0xfe, 0x7b, 0xb8, + 0x4f, 0x1a, 0x73, 0x8f, 0xf9, 0xee, 0xe1, 0x3c, + 0x69, 0xdd, 0xbf, 0x33, 0xd3, 0x61, 0xe9, 0x94, + 0xd7, 0xc0, 0xd3, 0x74, 0xc6, 0x70, 0x27, 0xc0, + 0xd3, 0x74, 0xc6, 0x70, 0x28, 0x5e, 0x71, 0xff, + 0x00, 0x3d, 0xdc, 0x27, 0x8d, 0x39, 0xc7, 0xfc, + 0xf7, 0x70, 0x9e, 0x34, 0xee, 0xdf, 0x99, 0xe9, + 0xb0, 0xf4, 0xca, 0x6b, 0xe0, 0x69, 0xba, 0x63, + 0x38, 0x13, 0xe0, 0x69, 0xba, 0x63, 0x38, 0x14, + 0x2f, 0x38, 0xff, 0x00, 0x9e, 0xee, 0x13, 0xc6, + 0x9c, 0xe3, 0xfe, 0x7b, 0xb8, 0x4f, 0x1a, 0x77, + 0x6f, 0xcc, 0xf4, 0xd8, 0x7a, 0x65, 0x35, 0xf0, + 0x34, 0xdd, 0x31, 0x9c, 0x09, 0xf0, 0x34, 0xdd, + 0x31, 0x9c, 0x0a, 0x17, 0x9c, 0x7f, 0xcf, 0x77, + 0x09, 0xe3, 0x4e, 0x71, 0xff, 0x00, 0x3d, 0xdc, + 0x27, 0x8d, 0x3b, 0xb7, 0xe6, 0x7a, 0x6c, 0x3d, + 0x32, 0x9a, 0xf8, 0x1a, 0x6e, 0x98, 0xce, 0x04, + 0xf8, 0x1a, 0x6e, 0x98, 0xce, 0x05, 0x0b, 0xce, + 0x3f, 0xe7, 0xbb, 0x84, 0xf1, 0xa7, 0x38, 0xff, + 0x00, 0x9e, 0xee, 0x13, 0xc6, 0x9d, 0xdb, 0xf3, + 0x3d, 0x36, 0x1e, 0x99, 0x4d, 0x7c, 0x0d, 0x37, + 0x4c, 0x67, 0x02, 0x7c, 0x0d, 0x37, 0x4c, 0x67, + 0x02, 0x85, 0xe7, 0x1f, 0xf3, 0xdd, 0xc2, 0x78, + 0xd3, 0x9c, 0x7f, 0xcf, 0x77, 0x09, 0xe3, 0x4e, + 0xed, 0xf9, 0x9e, 0x9b, 0x0f, 0x4c, 0xa6, 0xbe, + 0x06, 0x9b, 0xa6, 0x33, 0x81, 0x3e, 0x06, 0x9b, + 0xa6, 0xb3, 0x81, 0x42, 0xf3, 0x8f, 0xf9, 0xee, + 0xe1, 0x3c, 0x69, 0xce, 0x3f, 0xe7, 0xbb, 0x84, + 0xf1, 0xa7, 0x76, 0xfc, 0xcf, 0x4d, 0x8b, 0xa6, + 0x53, 0x7f, 0x03, 0xc9, 0xbb, 0x7b, 0x18, 0x1b, + 0xf8, 0x7f, 0xa5, 0x6d, 0x66, 0x43, 0xb3, 0xf9, + 0x61, 0x12, 0xdf, 0xdd, 0x0b, 0x87, 0x37, 0x48, + 0x8f, 0x40, 0x04, 0x8f, 0xea, 0xb2, 0xa4, 0xaa, + 0xff, 0x00, 0x38, 0xff, 0x00, 0x9c, 0xe3, 0xdd, + 0x2b, 0xce, 0xf9, 0xdd, 0xdf, 0x49, 0xc9, 0x79, + 0xe1, 0xaa, 0xd1, 0xe5, 0xf1, 0xc7, 0xea, 0xaf, + 0x57, 0xf3, 0xb4, 0xd8, 0xc0, 0x60, 0x18, 0x21, + 0x94, 0x02, 0x1a, 0x05, 0x3c, 0x5a, 0x54, 0x76, + 0x94, 0x62, 0xed, 0xb9, 0xfe, 0x57, 0x63, 0xe6, + 0x37, 0xea, 0x85, 0xc2, 0xa8, 0xea, 0xca, 0x22, + 0x20, 0x2d, 0x96, 0xd2, 0x3e, 0x3b, 0x86, 0x39, + 0x84, 0x83, 0x88, 0x03, 0x4d, 0xd0, 0x4d, 0x28, + 0x56, 0xb5, 0xea, 0x2f, 0xda, 0xb3, 0xce, 0x6f, + 0x84, 0x21, 0x2e, 0xbc, 0xee, 0x2c, 0x8a, 0xe2, + 0xe1, 0xb6, 0x99, 0x8d, 0x23, 0x98, 0xb7, 0x14, + 0x73, 0x79, 0x26, 0x84, 0x91, 0x4c, 0x63, 0xb5, + 0xba, 0xa2, 0x9d, 0xb1, 0x70, 0x49, 0xe3, 0x5a, + 0xdf, 0xb5, 0xd1, 0x9d, 0x55, 0x00, 0xf7, 0xda, + 0xed, 0x2b, 0x1b, 0x63, 0xfc, 0xce, 0x3f, 0xb1, + 0x1f, 0x59, 0xca, 0x04, 0x12, 0xdf, 0x24, 0x90, + 0x3b, 0x06, 0x9e, 0x05, 0x68, 0xbd, 0xa2, 0x34, + 0x89, 0x73, 0xb6, 0x1c, 0x76, 0xf1, 0x84, 0xe7, + 0xc0, 0xf3, 0x74, 0xd8, 0xf8, 0x3f, 0xa5, 0x3e, + 0x06, 0x9b, 0xa6, 0x33, 0x81, 0x42, 0xf3, 0x8f, + 0xf9, 0xce, 0xe1, 0x3c, 0x69, 0xce, 0x3f, 0xe7, + 0xbb, 0x84, 0xf1, 0xa9, 0xee, 0xdf, 0x9a, 0x9e, + 0x9b, 0x0f, 0x4c, 0xa6, 0xbe, 0x06, 0x9b, 0xa6, + 0x33, 0x81, 0x3e, 0x06, 0x9b, 0xa6, 0x33, 0x81, + 0x42, 0xf3, 0x8f, 0xf9, 0xee, 0xe1, 0x3c, 0x69, + 0xce, 0x3f, 0xe7, 0xbb, 0x84, 0xf1, 0xa7, 0x76, + 0xfc, 0xcf, 0x4d, 0x87, 0xa6, 0x53, 0x5f, 0x03, + 0x4d, 0xd3, 0x19, 0xc0, 0x9f, 0x03, 0x4d, 0xd3, + 0x19, 0xc0, 0xa1, 0x79, 0xc7, 0xfc, 0xf7, 0x70, + 0x9e, 0x34, 0xe7, 0x1f, 0xf3, 0xdd, 0xc2, 0x78, + 0xd3, 0xbb, 0x7e, 0x67, 0xa6, 0xc3, 0xd3, 0x29, + 0xaf, 0x81, 0xa6, 0xe9, 0x8c, 0xe0, 0x4f, 0x81, + 0xa6, 0xe9, 0x8c, 0xe0, 0x50, 0xbc, 0xe3, 0xfe, + 0x7b, 0xb8, 0x4f, 0x1a, 0x73, 0x8f, 0xf9, 0xee, + 0xe1, 0x3c, 0x69, 0xdd, 0xbf, 0x33, 0xd3, 0x61, + 0xe9, 0x94, 0xd7, 0xc0, 0xd3, 0x74, 0xc6, 0x70, + 0x27, 0xc0, 0xd3, 0x74, 0xc6, 0x70, 0x28, 0x5e, + 0x71, 0xff, 0x00, 0x3d, 0xdc, 0x27, 0x8d, 0x39, + 0xc7, 0xfc, 0xf7, 0x70, 0x9e, 0x34, 0xee, 0xdf, + 0x99, 0xe9, 0xb0, 0xf4, 0xca, 0x6b, 0xe0, 0x69, + 0xba, 0x63, 0x38, 0x13, 0xe0, 0x69, 0xba, 0x63, + 0x38, 0x14, 0x2f, 0x38, 0xff, 0x00, 0x9e, 0xee, + 0x13, 0xc6, 0x9c, 0xe3, 0xfe, 0x7b, 0xb8, 0x4f, + 0x1a, 0x77, 0x6f, 0xcc, 0xf4, 0xd8, 0x7a, 0x65, + 0x35, 0xf0, 0x34, 0xdd, 0x31, 0x9c, 0x09, 0xf0, + 0x34, 0xdd, 0x31, 0x9c, 0x0a, 0x17, 0x9c, 0x7f, + 0xcf, 0x77, 0x09, 0xe3, 0x4e, 0x71, 0xff, 0x00, + 0x3d, 0xdc, 0x27, 0x8d, 0x3b, 0xb7, 0xe6, 0x7a, + 0x6c, 0x3d, 0x32, 0x9a, 0xf8, 0x1a, 0x6e, 0x98, + 0xce, 0x04, 0xf8, 0x1a, 0x6e, 0x98, 0xce, 0x05, + 0x0b, 0xce, 0x3f, 0xe7, 0xbb, 0x84, 0xf1, 0xa7, + 0x38, 0xff, 0x00, 0x9e, 0xee, 0x13, 0xc6, 0x9d, + 0xdb, 0xf3, 0x3d, 0x36, 0x1e, 0x99, 0x4d, 0x7c, + 0x0d, 0x37, 0x4c, 0x67, 0x02, 0x7c, 0x0d, 0x37, + 0x4c, 0x67, 0x02, 0x85, 0xe7, 0x1f, 0xf3, 0xdd, + 0xc2, 0x78, 0xd3, 0x9c, 0x7f, 0xcf, 0x77, 0x09, + 0xe3, 0x4e, 0xed, 0xf9, 0x9e, 0x9b, 0x0f, 0x4c, + 0xa6, 0xbe, 0x06, 0x9b, 0xa6, 0x33, 0x81, 0x3e, + 0x06, 0x9b, 0xa6, 0x33, 0x81, 0x42, 0xf3, 0x8f, + 0xf9, 0xee, 0xe1, 0x3c, 0x69, 0xce, 0x3f, 0xe7, + 0xbb, 0x84, 0xf1, 0xa7, 0x76, 0xfc, 0xcf, 0x4d, + 0x87, 0xa6, 0x53, 0x5f, 0x03, 0x4d, 0xd3, 0x19, + 0xc0, 0x9f, 0x03, 0x4d, 0xd3, 0x19, 0xc0, 0xa1, + 0x79, 0xc7, 0xfc, 0xf7, 0x70, 0x9e, 0x34, 0xe7, + 0x1f, 0xf3, 0xdd, 0xc2, 0x78, 0xd3, 0xbb, 0x7e, + 0x67, 0xa6, 0xc3, 0xd3, 0x29, 0xaf, 0x81, 0xa6, + 0xe9, 0x8c, 0xe0, 0x4f, 0x81, 0xa6, 0xe9, 0x8c, + 0xe0, 0x50, 0xbc, 0xe3, 0xfe, 0x7b, 0xb8, 0x4f, + 0x1a, 0x73, 0x8f, 0xf9, 0xee, 0xe1, 0x3c, 0x69, + 0xdd, 0xbf, 0x33, 0xd3, 0x61, 0xe9, 0x94, 0xd7, + 0xc0, 0xd3, 0x74, 0xc6, 0x70, 0x27, 0xc0, 0xd3, + 0x74, 0xc6, 0x70, 0x28, 0x5e, 0x71, 0xff, 0x00, + 0x3d, 0xdc, 0x27, 0x8d, 0x39, 0xc7, 0xfc, 0xf7, + 0x70, 0x9e, 0x34, 0xee, 0xdf, 0x99, 0xe9, 0xb0, + 0xf4, 0xca, 0x6b, 0xe0, 0x69, 0xba, 0x63, 0x38, + 0x13, 0xe0, 0x69, 0xba, 0x63, 0x38, 0x14, 0x2f, + 0x38, 0xff, 0x00, 0x9e, 0xee, 0x13, 0xc6, 0x9c, + 0xe3, 0xfe, 0x7b, 0xb8, 0x4f, 0x1a, 0x77, 0x6f, + 0xcc, 0xf4, 0xd8, 0x7a, 0x65, 0x35, 0xf0, 0x34, + 0xdd, 0x31, 0x9c, 0x09, 0xf0, 0x34, 0xdd, 0x31, + 0x9c, 0x0a, 0x17, 0x9c, 0x7f, 0xcf, 0x77, 0x09, + 0xe3, 0x4e, 0x71, 0xff, 0x00, 0x3d, 0xdc, 0x27, + 0x8d, 0x3b, 0xb7, 0xe6, 0x7a, 0x6c, 0x3d, 0x32, + 0x9a, 0xf8, 0x1a, 0x6e, 0x98, 0xce, 0x04, 0xf8, + 0x1a, 0x6e, 0x98, 0xce, 0x05, 0x0b, 0xce, 0x3f, + 0xe7, 0xbb, 0x84, 0xf1, 0xa7, 0x38, 0xff, 0x00, + 0x9e, 0xee, 0x13, 0xc6, 0x9d, 0xdb, 0xf3, 0x3d, + 0x36, 0x1e, 0x99, 0x4d, 0x7c, 0x0d, 0x37, 0x4c, + 0x67, 0x02, 0x7c, 0x0d, 0x37, 0x4c, 0x67, 0x02, + 0x85, 0xe7, 0x1f, 0xf3, 0xdd, 0xc2, 0x78, 0xd3, + 0x9c, 0x7f, 0xcf, 0x77, 0x09, 0xe3, 0x4e, 0xed, + 0xf9, 0x9e, 0x9b, 0x0f, 0x4c, 0xa6, 0xbe, 0x06, + 0x9b, 0xa6, 0x33, 0x81, 0x3e, 0x06, 0x9b, 0xa6, + 0x33, 0x81, 0x42, 0xf3, 0x8f, 0xf9, 0xee, 0xe1, + 0x3c, 0x69, 0xce, 0x3f, 0xe7, 0xbb, 0x84, 0xf1, + 0xa7, 0x76, 0xfc, 0xcf, 0x4d, 0x87, 0xa6, 0x53, + 0x5f, 0x03, 0x4d, 0xd3, 0x19, 0xc0, 0x9f, 0x03, + 0x4d, 0xd3, 0x19, 0xc0, 0xa1, 0x79, 0xc7, 0xfc, + 0xf7, 0x70, 0x9e, 0x34, 0xe7, 0x1f, 0xf3, 0xdd, + 0xc2, 0x78, 0xd3, 0xbb, 0x7e, 0x67, 0xa6, 0xc3, + 0xd3, 0x29, 0xaf, 0x81, 0xa6, 0xe9, 0x8c, 0xe0, + 0x4f, 0x81, 0xa6, 0xe9, 0x8c, 0xe0, 0x50, 0xbc, + 0xe3, 0xfe, 0x7b, 0xb8, 0x4f, 0x1a, 0x73, 0x8f, + 0xf9, 0xee, 0xe1, 0x3c, 0x69, 0xdd, 0xbf, 0x33, + 0xd3, 0x61, 0xe9, 0x94, 0xd7, 0xc0, 0xd3, 0x74, + 0xc6, 0x70, 0x27, 0xc0, 0xd3, 0x74, 0xd6, 0x70, + 0x28, 0x5e, 0x71, 0xff, 0x00, 0x3d, 0xdc, 0x27, + 0x8d, 0x39, 0xc7, 0xfc, 0xf7, 0x70, 0x9e, 0x34, + 0xee, 0xdf, 0x9a, 0x63, 0xcb, 0x62, 0xe9, 0x9f, + 0xc5, 0x36, 0xdd, 0x88, 0x6b, 0x74, 0xcd, 0x7e, + 0xc6, 0xb3, 0x76, 0x8d, 0x1f, 0xde, 0x72, 0x91, + 0xca, 0xad, 0xb6, 0x7e, 0xc6, 0xee, 0x3b, 0x7b, + 0x67, 0x8b, 0x9b, 0xc9, 0x2a, 0x04, 0x87, 0xc6, + 0x22, 0x82, 0xa7, 0x4e, 0xa0, 0xaa, 0x45, 0xce, + 0x3e, 0x51, 0x24, 0x6f, 0x12, 0xa4, 0xb6, 0x68, + 0x0e, 0xbb, 0xb6, 0xa7, 0xf5, 0xf4, 0x7f, 0x60, + 0xa8, 0x9b, 0xda, 0x7d, 0xab, 0x57, 0x0e, 0x38, + 0xe3, 0x10, 0x9e, 0xcc, 0xa4, 0x7b, 0xae, 0xde, + 0xd7, 0x1a, 0x86, 0x1a, 0x34, 0x6f, 0x0a, 0x2e, + 0x55, 0xd1, 0x98, 0x7b, 0xec, 0xbe, 0x77, 0xc8, + 0x17, 0x3a, 0xab, 0xa0, 0xbd, 0x47, 0x23, 0xe2, + 0x78, 0x7c, 0x6e, 0x2d, 0x78, 0xd4, 0x42, 0xf2, + 0xb0, 0x82, 0x4b, 0x3b, 0x8f, 0x25, 0x9d, 0x90, + 0xb3, 0x33, 0xa3, 0x1d, 0x30, 0x3c, 0xd4, 0x9a, + 0x43, 0x9a, 0x40, 0x15, 0xf1, 0xdb, 0xab, 0x5a, + 0x85, 0x7e, 0xc6, 0x5b, 0x48, 0x31, 0x5a, 0xe6, + 0x0d, 0x73, 0x0e, 0xa0, 0x43, 0x4e, 0x8e, 0xdb, + 0x4a, 0xe9, 0xdb, 0x2f, 0xd8, 0xd8, 0xee, 0xe8, + 0x7e, 0x8e, 0xe3, 0x15, 0x61, 0xa4, 0xb7, 0x51, + 0x23, 0xb5, 0xa1, 0x5a, 0x2f, 0x68, 0xf0, 0x97, + 0x3b, 0xe2, 0xa5, 0xbc, 0x61, 0x39, 0xf0, 0x34, + 0xdd, 0x31, 0x9c, 0x09, 0xf0, 0x34, 0xdd, 0x31, + 0x9c, 0x0a, 0x17, 0x9c, 0x7f, 0xcf, 0x77, 0x09, + 0xe3, 0x4e, 0x71, 0xff, 0x00, 0x3d, 0xdc, 0x27, + 0x8d, 0x4f, 0x76, 0xfc, 0xd4, 0xf4, 0xd8, 0x7a, + 0x65, 0x35, 0xf0, 0x34, 0xdd, 0x31, 0x9c, 0x09, + 0xf0, 0x34, 0xdd, 0x31, 0x9c, 0x0a, 0x17, 0x9c, + 0x7f, 0xcf, 0x77, 0x09, 0xe3, 0x4e, 0x71, 0xff, + 0x00, 0x3d, 0xdc, 0x27, 0x8d, 0x3b, 0xb7, 0xe6, + 0x7a, 0x6c, 0x3d, 0x32, 0x9a, 0xf8, 0x1a, 0x6e, + 0x98, 0xce, 0x04, 0xf8, 0x1a, 0x6e, 0x98, 0xce, + 0x05, 0x0b, 0xce, 0x3f, 0xe7, 0xbb, 0x84, 0xf1, + 0xa7, 0x38, 0xff, 0x00, 0x9e, 0xee, 0x13, 0xc6, + 0x9d, 0xdb, 0xf3, 0x3d, 0x36, 0x1e, 0x99, 0x4d, + 0x7c, 0x0d, 0x37, 0x4c, 0x67, 0x02, 0x7c, 0x0d, + 0x37, 0x4c, 0x67, 0x02, 0x85, 0xe7, 0x1f, 0xf3, + 0xdd, 0xc2, 0x78, 0xd3, 0x9c, 0x7f, 0xcf, 0x77, + 0x09, 0xe3, 0x4e, 0xed, 0xf9, 0x9e, 0x9b, 0x0f, + 0x4c, 0xa6, 0xbe, 0x06, 0x9b, 0xa6, 0x33, 0x81, + 0x3e, 0x06, 0x9b, 0xa6, 0x33, 0x81, 0x42, 0xf3, + 0x8f, 0xf9, 0xee, 0xe1, 0x3c, 0x69, 0xce, 0x3f, + 0xe7, 0xbb, 0x84, 0xf1, 0xa7, 0x76, 0xfc, 0xcf, + 0x4d, 0x87, 0xa6, 0x53, 0x5f, 0x03, 0x4d, 0xd3, + 0x19, 0xc0, 0x9f, 0x03, 0x4d, 0xd3, 0x19, 0xc0, + 0xa1, 0x71, 0xc9, 0xf3, 0xdd, 0xc2, 0x78, 0xd3, + 0x9c, 0x7f, 0xcf, 0x77, 0x09, 0xe3, 0x4e, 0xed, + 0xf9, 0x9e, 0x9b, 0x0f, 0x4c, 0xa6, 0xbe, 0x06, + 0x9b, 0xa6, 0x33, 0x81, 0x3e, 0x06, 0x9b, 0xa6, + 0x33, 0x81, 0x42, 0xf3, 0x8f, 0xf9, 0xee, 0xe1, + 0x3c, 0x69, 0xce, 0x3f, 0xe7, 0xbb, 0x84, 0xf1, + 0xa7, 0x76, 0xfc, 0xcf, 0x4d, 0x87, 0xa6, 0x53, + 0x5f, 0x03, 0x4d, 0xd3, 0x19, 0xc0, 0x9f, 0x03, + 0x4d, 0xd3, 0x19, 0xc0, 0xa1, 0x79, 0xc7, 0xfc, + 0xf7, 0x70, 0x9e, 0x34, 0xe7, 0x1f, 0xf3, 0xdd, + 0xc2, 0x78, 0xd3, 0xbb, 0x7e, 0x67, 0xa6, 0xc3, + 0xd3, 0x29, 0xaf, 0x81, 0xa6, 0xe9, 0x8c, 0xe0, + 0x4f, 0x81, 0xa6, 0xe9, 0x8c, 0xe0, 0x50, 0xbc, + 0xe3, 0xfe, 0x7b, 0x8f, 0x74, 0xf1, 0xa7, 0x38, + 0xff, 0x00, 0x9c, 0xee, 0x13, 0xc6, 0x9d, 0xdb, + 0xf3, 0x3d, 0x36, 0x1e, 0x99, 0x4d, 0x7c, 0x0d, + 0x37, 0x4c, 0x67, 0x02, 0x7c, 0x0d, 0x37, 0x4c, + 0x67, 0x02, 0x85, 0xe7, 0x1f, 0xf3, 0xdd, 0xc2, + 0x78, 0xd3, 0x9c, 0x7f, 0xcf, 0x77, 0x09, 0xe3, + 0x4e, 0xed, 0xf9, 0x9e, 0x9b, 0x0f, 0x4c, 0xa6, + 0xbe, 0x06, 0x9b, 0xa6, 0x33, 0x81, 0x3e, 0x06, + 0x9b, 0xa6, 0x33, 0x81, 0x42, 0xf3, 0x8f, 0xf9, + 0xce, 0xe1, 0x3c, 0x69, 0xce, 0x3f, 0xe7, 0xbb, + 0x84, 0xf1, 0xa7, 0x76, 0xfc, 0xcf, 0x4d, 0x87, + 0xa6, 0x53, 0x5f, 0x03, 0x4d, 0xd3, 0x19, 0xc0, + 0x9f, 0x03, 0x4d, 0xd3, 0x19, 0xc0, 0xa1, 0x79, + 0xc7, 0xfc, 0xf7, 0x70, 0x9e, 0x34, 0xe7, 0x1f, + 0xf3, 0xdd, 0xc2, 0x78, 0xd3, 0xbb, 0x7e, 0x67, + 0xa6, 0xc3, 0xd3, 0x29, 0xaf, 0x81, 0xa6, 0xe9, + 0x8c, 0xe0, 0x4f, 0x81, 0xa6, 0xe9, 0x8c, 0xe0, + 0x50, 0xbc, 0xe3, 0xfe, 0x7b, 0xb8, 0x4f, 0x1a, + 0x73, 0x8f, 0xf9, 0xee, 0xe1, 0x3c, 0x69, 0xdd, + 0xbf, 0x33, 0xd3, 0x61, 0xe9, 0x94, 0xd7, 0xc0, + 0xd3, 0x74, 0xc6, 0x70, 0x27, 0xc0, 0xd3, 0x74, + 0xc6, 0x70, 0x28, 0x5c, 0x72, 0x7c, 0xf7, 0x72, + 0x8f, 0x1a, 0x73, 0x8f, 0xf9, 0xee, 0xe1, 0x3c, + 0x69, 0xdd, 0xbf, 0x33, 0xd3, 0x61, 0xe9, 0x94, + 0xd7, 0xc0, 0xd3, 0x74, 0xc6, 0x70, 0x27, 0xc0, + 0xd3, 0x74, 0xc6, 0x70, 0x28, 0x5e, 0x71, 0xff, + 0x00, 0x3d, 0xdc, 0x27, 0x8d, 0x39, 0xc7, 0xfc, + 0xf7, 0x70, 0x9e, 0x34, 0xee, 0xdf, 0x99, 0xe9, + 0xb0, 0xf4, 0xca, 0x6b, 0xe0, 0x69, 0xba, 0x63, + 0x38, 0x13, 0xe0, 0x69, 0xba, 0x63, 0x38, 0x14, + 0x2f, 0x38, 0xff, 0x00, 0x9e, 0xee, 0x13, 0xc6, + 0x9c, 0xe3, 0xfe, 0x7b, 0xb8, 0x4f, 0x1a, 0x77, + 0x6f, 0xcc, 0xf4, 0xd8, 0x7a, 0x65, 0x35, 0xf0, + 0x34, 0xdd, 0x31, 0x9c, 0x09, 0xf0, 0x34, 0xdd, + 0x31, 0x9c, 0x0a, 0x17, 0x1b, 0xfe, 0x7b, 0xb8, + 0x4f, 0x1a, 0x73, 0x92, 0x7c, 0xf7, 0x70, 0x9e, + 0x34, 0xee, 0xdf, 0x99, 0xe9, 0xb0, 0xf4, 0xca, + 0x6b, 0xe0, 0x69, 0xba, 0x63, 0x38, 0x13, 0xe0, + 0x69, 0xba, 0x63, 0x38, 0x14, 0x2f, 0x38, 0xff, + 0x00, 0x9e, 0xee, 0x13, 0xc6, 0x9c, 0xe3, 0xfe, + 0x7b, 0xb8, 0x4f, 0x1a, 0x77, 0x6f, 0xcc, 0xf4, + 0xd8, 0x7a, 0x65, 0x35, 0xf0, 0x34, 0xdd, 0x31, + 0x9c, 0x09, 0xf0, 0x34, 0xdd, 0x31, 0x9c, 0x0a, + 0x17, 0x9c, 0x7f, 0xcf, 0x77, 0x09, 0xe3, 0x4e, + 0x71, 0xff, 0x00, 0x3d, 0xdc, 0x27, 0x8d, 0x3b, + 0xb7, 0xe6, 0x7a, 0x6c, 0x3d, 0x32, 0x9a, 0xf8, + 0x1a, 0x6e, 0x98, 0xce, 0x04, 0xf8, 0x1a, 0x6e, + 0x98, 0xce, 0x05, 0x0b, 0xce, 0x3f, 0xe7, 0xbb, + 0x84, 0xf1, 0xa7, 0x38, 0xff, 0x00, 0x9e, 0xee, + 0x13, 0xc6, 0x9d, 0xdb, 0xf3, 0x3d, 0x36, 0x1e, + 0x99, 0x4d, 0x7c, 0x0d, 0x37, 0x4c, 0x67, 0x02, + 0x7c, 0x0f, 0x37, 0x4d, 0x8f, 0x81, 0x42, 0xf3, + 0x8f, 0xf9, 0xee, 0xe1, 0x3c, 0x69, 0xce, 0x3f, + 0xe7, 0xbb, 0x84, 0xf1, 0xa7, 0x76, 0xfc, 0xd3, + 0xe9, 0xb0, 0xf4, 0xca, 0x70, 0x6c, 0x45, 0x08, + 0x32, 0xdf, 0x31, 0xac, 0x1a, 0xc8, 0x68, 0xf9, + 0x5c, 0xb7, 0x44, 0xdd, 0x9b, 0xc8, 0x8e, 0x36, + 0x3b, 0xdb, 0x2e, 0xc6, 0xaa, 0x78, 0xc4, 0x7f, + 0x75, 0xaa, 0xb8, 0x5c, 0xe3, 0xa0, 0xb8, 0x91, + 0xba, 0x09, 0x27, 0xc2, 0xb1, 0xb9, 0x4d, 0xcd, + 0xc5, 0x13, 0x7b, 0x4f, 0x8c, 0xad, 0x5c, 0x38, + 0xeb, 0xe1, 0x55, 0xeb, 0x37, 0x24, 0xb6, 0x12, + 0x75, 0x3a, 0xa6, 0x8a, 0x31, 0x49, 0x66, 0xfe, + 0x45, 0xbf, 0x9a, 0x7c, 0x0a, 0x34, 0xaa, 0xba, + 0x3d, 0x43, 0xfb, 0x66, 0x79, 0xcd, 0x52, 0xea, + 0x22, 0x1f, 0xdb, 0x33, 0xce, 0x6a, 0x97, 0x40, + 0x51, 0xf9, 0x97, 0xbd, 0x5a, 0x7d, 0xa7, 0xca, + 0x14, 0x82, 0x8f, 0xcc, 0xbd, 0xea, 0xd3, 0xed, + 0x3e, 0x50, 0x83, 0x19, 0x6f, 0xbc, 0xde, 0x79, + 0xe7, 0xeb, 0x15, 0x23, 0xa3, 0x7b, 0xbe, 0xa3, + 0xb2, 0xef, 0x79, 0xbb, 0xf3, 0xcf, 0xd6, 0x2a, + 0x41, 0x00, 0x91, 0x43, 0x41, 0xb8, 0xa1, 0xce, + 0xb3, 0xdb, 0x52, 0xe7, 0x51, 0xed, 0x28, 0x83, + 0xac, 0xa0, 0x22, 0x22, 0x0d, 0xf9, 0xa7, 0xfa, + 0x65, 0xfe, 0x78, 0xfa, 0xca, 0xa2, 0xad, 0xd9, + 0xa7, 0xfa, 0x65, 0xfe, 0x78, 0xfa, 0xca, 0xa2, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x37, + 0xce, 0xe2, 0x0e, 0xcc, 0xbf, 0x2b, 0xba, 0xcc, + 0x0b, 0xf9, 0x80, 0x03, 0x23, 0xf2, 0xe4, 0x79, + 0xa3, 0x47, 0x75, 0x6c, 0xbd, 0xc8, 0xef, 0x2d, + 0x21, 0xf6, 0x8c, 0x51, 0xcf, 0x0d, 0x70, 0x97, + 0xc4, 0xec, 0x40, 0x1d, 0x5a, 0x57, 0x6e, 0x5c, + 0x0c, 0xfb, 0x35, 0x77, 0x69, 0x6d, 0xa6, 0xe5, + 0xaf, 0xab, 0x98, 0x0f, 0x8c, 0xe6, 0xe8, 0xd2, + 0x06, 0xea, 0xf7, 0x96, 0xc6, 0xfb, 0x2c, 0x97, + 0x30, 0x75, 0xdb, 0x5d, 0x14, 0x73, 0x37, 0x04, + 0x2c, 0x78, 0xa1, 0x2f, 0xa1, 0x1a, 0x01, 0x41, + 0x5f, 0xae, 0xf2, 0x55, 0x49, 0xb3, 0x2d, 0xb7, + 0xb8, 0xc9, 0x9d, 0x7b, 0x6e, 0x4f, 0xb4, 0x5b, + 0x9a, 0x5c, 0x46, 0x48, 0x23, 0x0f, 0xce, 0x6d, + 0x05, 0x56, 0x2e, 0x32, 0xcb, 0x7b, 0x4c, 0xa2, + 0x1b, 0x89, 0xcb, 0xbd, 0xae, 0xe4, 0xe2, 0x8e, + 0x30, 0x40, 0x01, 0x9b, 0xe7, 0x45, 0x50, 0x46, + 0xa9, 0x6b, 0xbd, 0x9c, 0xbb, 0xb6, 0xb0, 0x37, + 0xc6, 0x46, 0x3d, 0x81, 0xad, 0x79, 0x60, 0xae, + 0x2a, 0x3a, 0x9d, 0x8d, 0xca, 0xa8, 0x83, 0xa8, + 0xab, 0xcb, 0x88, 0x99, 0xb1, 0xe5, 0xee, 0x3a, + 0x2e, 0x2c, 0x6a, 0xd0, 0x7e, 0x73, 0x40, 0x1f, + 0x2a, 0x0a, 0x5d, 0xbc, 0x0f, 0xb8, 0xb8, 0x8e, + 0xde, 0x3f, 0x2a, 0x57, 0x86, 0x34, 0x9d, 0x5a, + 0x4e, 0xb5, 0xdd, 0x9a, 0xe4, 0x73, 0xe5, 0x71, + 0xc7, 0x24, 0xb2, 0xb1, 0xe2, 0x42, 0x47, 0x8b, + 0x5d, 0x04, 0x0a, 0xee, 0x85, 0xb7, 0x66, 0x60, + 0x0f, 0xcd, 0x03, 0xde, 0x34, 0x5a, 0xb1, 0xd2, + 0x3a, 0xbb, 0x85, 0xa3, 0x0f, 0x85, 0x75, 0xe7, + 0xd2, 0x9b, 0xac, 0x9f, 0x2e, 0x95, 0xc7, 0x4c, + 0xce, 0x73, 0xb9, 0x5f, 0xd0, 0x83, 0x82, 0xcb, + 0x24, 0x92, 0xe2, 0xdb, 0xda, 0xee, 0x26, 0x65, + 0xa5, 0xb1, 0x24, 0x31, 0xf2, 0x6b, 0x77, 0x68, + 0x2c, 0x66, 0x19, 0x24, 0xb6, 0x90, 0x0b, 0xa8, + 0xa5, 0x65, 0xd5, 0xb1, 0xd1, 0xce, 0x47, 0xb8, + 0x7b, 0x21, 0x76, 0x6d, 0x59, 0x31, 0x49, 0x67, + 0x66, 0xdd, 0x11, 0x43, 0x08, 0x70, 0x6f, 0xf5, + 0xb4, 0x85, 0xc1, 0x69, 0x9a, 0x9b, 0x6c, 0xba, + 0xe2, 0xc1, 0xf1, 0xe3, 0x65, 0xc6, 0x90, 0x4b, + 0xb0, 0xe1, 0x27, 0x77, 0x51, 0xde, 0x41, 0xc0, + 0xa5, 0xed, 0xf6, 0x76, 0x59, 0xac, 0xe2, 0xbb, + 0x37, 0x30, 0xc4, 0xc9, 0x85, 0x5a, 0x24, 0x25, + 0xbd, 0xcd, 0x4a, 0x23, 0x4e, 0xee, 0xb5, 0x3b, + 0x9a, 0x69, 0xd9, 0x8c, 0xb7, 0xb2, 0x7e, 0x42, + 0x83, 0x92, 0xfb, 0x21, 0xbb, 0xb4, 0xb7, 0x37, + 0x41, 0xf1, 0xcf, 0x00, 0xf2, 0x9f, 0x11, 0xad, + 0x3b, 0x25, 0x69, 0xcc, 0xb2, 0xc9, 0x72, 0xf3, + 0x0e, 0x37, 0xb6, 0x41, 0x3b, 0x03, 0xda, 0x59, + 0x5d, 0x47, 0xb6, 0xa5, 0x76, 0x70, 0x39, 0xb9, + 0x66, 0x66, 0xf9, 0xab, 0xec, 0xd8, 0x34, 0x62, + 0xd5, 0x5c, 0x26, 0xb4, 0x5a, 0xb3, 0x52, 0x67, + 0xd9, 0xec, 0xb6, 0xe8, 0xe9, 0x74, 0x55, 0x85, + 0xfd, 0xba, 0x7e, 0x82, 0x0e, 0x46, 0xe4, 0x77, + 0x0e, 0xca, 0xce, 0x65, 0x8d, 0xa2, 0x31, 0x53, + 0x80, 0xd7, 0x16, 0x10, 0xec, 0x35, 0x5a, 0xb2, + 0xcc, 0xb2, 0x5c, 0xc6, 0x57, 0xc7, 0x1b, 0xc4, + 0x7c, 0xdb, 0x0c, 0x8e, 0x2e, 0xae, 0xa0, 0x40, + 0xdc, 0x56, 0x68, 0x9a, 0x3d, 0x81, 0x99, 0x46, + 0xeb, 0xec, 0x0b, 0xe9, 0xd9, 0x26, 0x9f, 0x2a, + 0x89, 0xc9, 0x0f, 0xb3, 0xe4, 0xf9, 0x9d, 0xe1, + 0xd0, 0x4b, 0x04, 0x6c, 0xed, 0x90, 0x4d, 0x3e, + 0x90, 0x41, 0xa6, 0xcf, 0x67, 0x2e, 0x6f, 0x2c, + 0xbd, 0xb2, 0x29, 0x58, 0x19, 0x47, 0x10, 0xc3, + 0x8b, 0x17, 0x89, 0x51, 0xbd, 0xd8, 0x51, 0x27, + 0x46, 0xbd, 0x7b, 0xa3, 0xb4, 0x2a, 0xad, 0xb9, + 0x2d, 0xc0, 0xb7, 0xc9, 0xb2, 0xe7, 0x1d, 0x0c, + 0x7d, 0xc3, 0xa3, 0x77, 0x64, 0x3c, 0xbd, 0xa2, + 0xbd, 0xd2, 0xa1, 0x24, 0xcb, 0xff, 0x00, 0xcf, + 0xcd, 0x95, 0x3c, 0x53, 0x3d, 0x3f, 0xb2, 0x5c, + 0x0f, 0x81, 0x06, 0xcb, 0xad, 0x9c, 0xba, 0xb5, + 0xb0, 0xf6, 0xd9, 0x24, 0x66, 0x10, 0xd6, 0xb8, + 0xb0, 0x57, 0x17, 0x8d, 0xb9, 0xab, 0xb2, 0xa2, + 0x55, 0xc3, 0x36, 0x9c, 0x4d, 0x95, 0xe6, 0x80, + 0x69, 0x6c, 0x33, 0x36, 0x30, 0xdd, 0xcf, 0x14, + 0x47, 0xa1, 0x53, 0xd0, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x37, 0x0a, 0x26, 0xe1, 0x41, 0x74, 0xba, + 0xfe, 0x57, 0x63, 0xe6, 0x37, 0xea, 0x85, 0xc2, + 0xbb, 0xae, 0xbf, 0x95, 0xd8, 0xf9, 0x8d, 0xfa, + 0xa1, 0x70, 0xa0, 0xca, 0x22, 0x20, 0x2f, 0x51, + 0x7e, 0xd5, 0x9e, 0x73, 0x7c, 0x21, 0x79, 0x5e, + 0xa2, 0xfd, 0xab, 0x3c, 0xe6, 0xf8, 0x42, 0x0e, + 0x4d, 0xb2, 0xfe, 0x67, 0x1f, 0xd8, 0x8f, 0xac, + 0xe5, 0x02, 0xa7, 0xb6, 0xcb, 0xf9, 0x9c, 0x7f, + 0x62, 0x3e, 0xb3, 0x94, 0x0a, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x6e, + 0x80, 0x34, 0x93, 0xa8, 0x29, 0x76, 0x6c, 0xf3, + 0x9b, 0x1c, 0x66, 0xee, 0xea, 0x1b, 0x59, 0x25, + 0x15, 0x8e, 0x27, 0x9d, 0x3a, 0x77, 0xd4, 0x5c, + 0x4f, 0x11, 0xca, 0xc7, 0xb8, 0x55, 0xad, 0x70, + 0x2e, 0x1b, 0xe0, 0x10, 0x54, 0xee, 0x79, 0x63, + 0x79, 0x99, 0xde, 0x47, 0x79, 0x62, 0xcf, 0x68, + 0xb7, 0x99, 0x8d, 0x6b, 0x5e, 0xd2, 0x28, 0xda, + 0x6b, 0xc5, 0xbd, 0x44, 0x10, 0xf7, 0xf6, 0x37, + 0x16, 0x17, 0x06, 0xde, 0x70, 0x03, 0x80, 0x0e, + 0x6b, 0x86, 0x90, 0xe6, 0x9d, 0xd0, 0xb9, 0xfb, + 0xdd, 0xbd, 0x6a, 0x7b, 0x3f, 0xba, 0xb3, 0x76, + 0x61, 0x67, 0x0c, 0xa4, 0x4c, 0xcb, 0x56, 0x60, + 0xb9, 0xc2, 0x77, 0xcb, 0x6b, 0xa4, 0x6f, 0x05, + 0x89, 0xb6, 0x7c, 0x1c, 0xea, 0x2b, 0x68, 0x01, + 0xf6, 0x29, 0x87, 0x3c, 0x1f, 0x52, 0x69, 0x1f, + 0xe7, 0x0c, 0x5d, 0xb4, 0x10, 0x5f, 0x90, 0x5d, + 0xd9, 0x46, 0x56, 0x73, 0x29, 0x65, 0x8f, 0x9c, + 0xe6, 0xb9, 0xa6, 0x63, 0xad, 0x2a, 0x4f, 0x62, + 0x95, 0x0b, 0x5e, 0x64, 0x2c, 0xc5, 0xe4, 0x8c, + 0xb2, 0x6e, 0x0b, 0x76, 0x9c, 0x0d, 0xd2, 0x4d, + 0x69, 0xa0, 0x9d, 0x2a, 0x53, 0x64, 0x7d, 0xf2, + 0xe8, 0xff, 0x00, 0x83, 0xf2, 0xa0, 0x81, 0xdc, + 0x5d, 0xd9, 0xbe, 0x58, 0x72, 0xcb, 0x96, 0x40, + 0x64, 0xe7, 0x71, 0xb3, 0x18, 0x20, 0x53, 0x76, + 0x9b, 0xe5, 0x71, 0x6e, 0x85, 0x3b, 0xb5, 0xe2, + 0xb9, 0x94, 0x2d, 0x1e, 0xa8, 0x53, 0xb7, 0x89, + 0x06, 0x9c, 0xb7, 0x67, 0x26, 0xcc, 0x2c, 0x4d, + 0xdb, 0x65, 0x0c, 0x35, 0x70, 0x63, 0x08, 0xae, + 0x2c, 0x23, 0x7e, 0xaa, 0x2e, 0xde, 0x13, 0x3d, + 0xc4, 0x70, 0x83, 0x87, 0x9d, 0x78, 0x66, 0x2d, + 0xea, 0x9a, 0x2b, 0x47, 0xb4, 0x8c, 0xb6, 0xe7, + 0x28, 0xcb, 0xeb, 0x40, 0x1b, 0x59, 0x86, 0xf1, + 0x93, 0x40, 0xaf, 0xf6, 0x8a, 0x87, 0xb8, 0xb6, + 0x36, 0xdb, 0x46, 0x22, 0x1e, 0x48, 0xb9, 0x61, + 0x60, 0xec, 0x39, 0xc1, 0xc1, 0x07, 0x44, 0xdb, + 0x3d, 0x65, 0x04, 0xc6, 0x09, 0xb3, 0x38, 0xe3, + 0x94, 0x52, 0xac, 0x73, 0x68, 0x74, 0xff, 0x00, + 0x69, 0x68, 0xba, 0xc8, 0x24, 0xb5, 0xb9, 0x81, + 0x93, 0x4e, 0xc6, 0xdb, 0x4e, 0x48, 0x6d, 0xcf, + 0xe6, 0x8d, 0x15, 0xd3, 0xdb, 0x5b, 0x76, 0x92, + 0xd2, 0xe6, 0x6c, 0xe2, 0x53, 0x14, 0x2f, 0x78, + 0x21, 0x82, 0xad, 0x69, 0x20, 0xe8, 0xdf, 0x5b, + 0xb3, 0x60, 0xeb, 0x6d, 0x9d, 0xb4, 0xb0, 0xb8, + 0xa7, 0xb4, 0xe2, 0xc4, 0x59, 0x5a, 0x96, 0xb6, + 0xa7, 0x5f, 0x0a, 0x0c, 0x43, 0xb3, 0x36, 0xb3, + 0x87, 0x18, 0x73, 0x18, 0xde, 0x18, 0x31, 0x3e, + 0x8d, 0xd4, 0x3b, 0x3e, 0x32, 0xe2, 0xbe, 0xca, + 0xec, 0xed, 0xad, 0xcc, 0xd0, 0xdf, 0x47, 0x72, + 0xf0, 0x40, 0xe6, 0xd8, 0x34, 0xe9, 0xdd, 0xd6, + 0x57, 0x5e, 0xcb, 0xd3, 0x9b, 0xcc, 0xc8, 0xf5, + 0x1e, 0x9a, 0x82, 0x14, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, 0x29, + 0xb3, 0x5f, 0xce, 0xed, 0xbf, 0xb5, 0xf5, 0x0a, + 0x8b, 0x52, 0x9b, 0x35, 0xfc, 0xee, 0xdb, 0xfb, + 0x5f, 0x50, 0xa0, 0x9b, 0xcc, 0x3d, 0xf6, 0x6f, + 0x3b, 0xe4, 0x0b, 0x9d, 0x74, 0x66, 0x1e, 0xfb, + 0x37, 0x9d, 0xf2, 0x05, 0xce, 0x80, 0xb0, 0xb2, + 0xb0, 0x83, 0x3b, 0x65, 0xfb, 0x1b, 0x0e, 0xd3, + 0xfc, 0x0c, 0x55, 0x85, 0x67, 0xdb, 0x2f, 0xd8, + 0xd8, 0x76, 0x9f, 0xe0, 0x62, 0xac, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0xdb, 0x6d, 0x6d, 0x2d, + 0xd4, 0xec, 0xb7, 0x84, 0x56, 0x49, 0x08, 0x03, + 0x7b, 0xb6, 0x54, 0xc0, 0xc8, 0x32, 0xe1, 0x37, + 0xb2, 0x3f, 0x32, 0x68, 0xbb, 0x3a, 0x39, 0xb0, + 0xdd, 0x18, 0xbe, 0x6d, 0x71, 0x28, 0xbc, 0xba, + 0xfd, 0xf9, 0x7d, 0xdb, 0x6e, 0x98, 0xc0, 0xf7, + 0x30, 0x10, 0x03, 0xb5, 0x69, 0x14, 0xec, 0x2f, + 0x56, 0x91, 0xdc, 0x5f, 0xe6, 0x2d, 0xe6, 0xc1, + 0x74, 0xb2, 0x4a, 0x1e, 0xea, 0x7e, 0x68, 0xad, + 0x49, 0x28, 0x35, 0x5e, 0xda, 0x4d, 0x65, 0x72, + 0xfb, 0x69, 0xe8, 0x24, 0x66, 0xbd, 0xea, 0x1d, + 0x45, 0x69, 0x3f, 0xfc, 0xab, 0x26, 0x61, 0x77, + 0x97, 0xc9, 0xb4, 0x78, 0x6e, 0x18, 0xd9, 0xad, + 0xe8, 0xd8, 0x64, 0x71, 0xd4, 0x1d, 0xaf, 0x16, + 0x8d, 0xe2, 0xb5, 0xdb, 0xe4, 0x71, 0x5a, 0x5f, + 0x5d, 0xcb, 0x7a, 0xdc, 0x56, 0x56, 0x80, 0xbd, + 0xb5, 0xd4, 0xf0, 0xfd, 0x2d, 0x08, 0x2b, 0xfa, + 0xf5, 0x2f, 0x71, 0x43, 0x34, 0xae, 0xc3, 0x0c, + 0x6f, 0x90, 0xef, 0x30, 0x13, 0x4e, 0xdd, 0x35, + 0x2c, 0x48, 0xf1, 0x24, 0x8e, 0x78, 0x68, 0x60, + 0x71, 0xa8, 0x68, 0xd4, 0x06, 0xf2, 0xdd, 0x69, + 0x98, 0x5e, 0x59, 0x63, 0xf6, 0x59, 0x4c, 0x58, + 0xe8, 0x5d, 0x4a, 0x69, 0xa6, 0xa4, 0x1d, 0x19, + 0x9e, 0x52, 0xfc, 0xba, 0x0b, 0x67, 0xc8, 0xe3, + 0xce, 0xce, 0xd7, 0x17, 0xc7, 0xf3, 0x48, 0xa6, + 0x8a, 0xf7, 0x56, 0x32, 0xbc, 0xa6, 0x4c, 0xc1, + 0xef, 0x38, 0xdb, 0x14, 0x10, 0x8c, 0x52, 0xca, + 0xed, 0xc0, 0x75, 0x51, 0x77, 0xed, 0x2c, 0x8f, + 0x96, 0xcf, 0x2c, 0x92, 0x43, 0x89, 0xef, 0x88, + 0x97, 0x1d, 0xf2, 0x43, 0x34, 0xa8, 0xd8, 0x33, + 0x29, 0x6d, 0xf2, 0xf9, 0xec, 0x58, 0xc1, 0x86, + 0xe0, 0xd5, 0xd2, 0x6e, 0x8e, 0xc0, 0xd2, 0x83, + 0xbb, 0xa8, 0xad, 0x6e, 0x61, 0x91, 0xf9, 0x6d, + 0xe8, 0xba, 0x92, 0x21, 0x89, 0xd1, 0x96, 0xe1, + 0xf1, 0x77, 0xc6, 0x92, 0xa1, 0x74, 0xee, 0x8a, + 0x1d, 0xd0, 0xa7, 0x76, 0x56, 0x37, 0xc7, 0x3c, + 0xb7, 0xef, 0xf1, 0x6d, 0xa1, 0x88, 0x87, 0x38, + 0xea, 0x3b, 0xc2, 0xbb, 0xba, 0x94, 0x1b, 0xde, + 0x1c, 0xf7, 0x3f, 0x71, 0xee, 0x27, 0x84, 0xe8, + 0xaa, 0x0c, 0x25, 0x42, 0xd9, 0x6b, 0x03, 0xae, + 0xae, 0x22, 0xb7, 0x6d, 0x2b, 0x2b, 0xda, 0xda, + 0xef, 0x12, 0x74, 0xa9, 0xeb, 0xbb, 0x8c, 0xab, + 0x2d, 0xbc, 0x6e, 0x5c, 0xdb, 0x28, 0xe6, 0x89, + 0x94, 0x13, 0xce, 0xfd, 0x2f, 0xa9, 0xa5, 0x48, + 0xed, 0x20, 0x8b, 0xc9, 0xb2, 0xf6, 0x66, 0x37, + 0xad, 0xb5, 0x91, 0xc5, 0x8d, 0x73, 0x5c, 0xec, + 0x43, 0xfa, 0xab, 0x8a, 0x46, 0x86, 0x3d, 0xec, + 0xd7, 0x81, 0xc4, 0x0d, 0xda, 0x00, 0x69, 0xad, + 0x59, 0x32, 0xbb, 0x5b, 0x5b, 0x6d, 0xa7, 0xc1, + 0x68, 0xf0, 0xf8, 0x1d, 0x1b, 0x9f, 0x1d, 0x0d, + 0x40, 0xa8, 0xd5, 0xdf, 0x5a, 0xec, 0xae, 0xf2, + 0x79, 0x33, 0x11, 0x97, 0x0b, 0x16, 0x39, 0x92, + 0x48, 0xe6, 0x19, 0x9f, 0xa6, 0x42, 0xe3, 0x5d, + 0x3d, 0x8d, 0x21, 0x05, 0x7b, 0x75, 0x17, 0x46, + 0x63, 0x6e, 0xdb, 0x5b, 0xf9, 0xed, 0xd9, 0xe4, + 0x47, 0x21, 0x0d, 0xae, 0xba, 0x6e, 0x2e, 0x74, + 0x1e, 0xa3, 0x86, 0x69, 0x4e, 0x18, 0x98, 0xe9, + 0x0e, 0xe8, 0x68, 0x27, 0xc0, 0xbb, 0xb3, 0x2c, + 0xa6, 0x4b, 0x0b, 0x5b, 0x69, 0x66, 0xf1, 0x66, + 0x9c, 0x3b, 0x14, 0x74, 0xf2, 0x69, 0xd9, 0xdd, + 0x5c, 0xf6, 0x97, 0xf7, 0x96, 0x78, 0xfd, 0x96, + 0x53, 0x16, 0x3a, 0x62, 0xc3, 0x4d, 0x34, 0xd5, + 0xad, 0x4b, 0x6d, 0x0c, 0xb2, 0x4d, 0x96, 0x65, + 0x73, 0x4a, 0x71, 0x49, 0x24, 0x65, 0xef, 0x71, + 0xdd, 0x25, 0xad, 0x28, 0x23, 0xf2, 0xbc, 0xaa, + 0x5c, 0xc6, 0x57, 0x00, 0xe1, 0x14, 0x31, 0x8a, + 0xcb, 0x2b, 0xb5, 0x35, 0x76, 0xf5, 0x05, 0xa5, + 0xc4, 0x6f, 0xea, 0xeb, 0xe6, 0xdc, 0xcd, 0x10, + 0xa9, 0x8f, 0x0d, 0x2b, 0x4d, 0xed, 0x25, 0x70, + 0xda, 0xe6, 0x52, 0xdb, 0x59, 0x5c, 0x59, 0xc6, + 0xd1, 0x86, 0xe8, 0x0c, 0x4f, 0xdd, 0x14, 0xde, + 0x5d, 0xdb, 0x29, 0x13, 0xd9, 0x78, 0xeb, 0xd7, + 0x9c, 0x36, 0xd6, 0xf1, 0xbb, 0x9c, 0x79, 0xd0, + 0xde, 0xd2, 0x08, 0x52, 0x08, 0xd7, 0xac, 0x68, + 0x3d, 0xb5, 0x98, 0x99, 0x8e, 0x56, 0x30, 0x9a, + 0x63, 0x73, 0x5b, 0x5e, 0xd9, 0xa2, 0xcc, 0xef, + 0x0f, 0x99, 0xf2, 0x0d, 0x01, 0xce, 0x2e, 0x03, + 0x73, 0x4a, 0xcd, 0xa1, 0x06, 0xe6, 0x1d, 0xdf, + 0xd6, 0x33, 0xeb, 0x04, 0x1d, 0x59, 0xc5, 0x83, + 0x32, 0xfb, 0xe7, 0x5a, 0xc6, 0xe2, 0xf6, 0xb1, + 0xad, 0x35, 0x3a, 0xf4, 0x8a, 0xae, 0x48, 0x18, + 0xc7, 0xcd, 0x1b, 0x24, 0x76, 0x06, 0x39, 0xc0, + 0x39, 0xda, 0xa8, 0x09, 0xd2, 0x55, 0x9b, 0x3e, + 0xbd, 0xcb, 0xac, 0xb3, 0x22, 0x65, 0xb4, 0x6d, + 0xdc, 0xcf, 0x6b, 0x4c, 0xa6, 0x4a, 0x51, 0xad, + 0x1a, 0x00, 0x68, 0x3b, 0xb4, 0x5c, 0x59, 0x9e, + 0x5d, 0x69, 0x16, 0x65, 0x63, 0x25, 0xbb, 0x40, + 0xb5, 0xbd, 0x2d, 0x77, 0x37, 0xb8, 0x0d, 0x5b, + 0x88, 0x70, 0x38, 0x20, 0xe2, 0x92, 0xc2, 0x07, + 0xe6, 0xed, 0xb1, 0xb6, 0x9c, 0x49, 0x14, 0x8e, + 0x6b, 0x5b, 0x3d, 0x2a, 0x34, 0x8a, 0x9d, 0x4b, + 0x9e, 0xfa, 0xd4, 0xda, 0x5d, 0xcd, 0x6d, 0x8b, + 0x19, 0x85, 0xd8, 0x71, 0x01, 0x4a, 0xa9, 0xe6, + 0x0b, 0x2b, 0x2d, 0xa6, 0x75, 0xab, 0x2d, 0x58, + 0x43, 0x9f, 0x18, 0x89, 0xf5, 0xfd, 0x9f, 0xea, + 0xc1, 0x34, 0x1a, 0x75, 0xd5, 0x70, 0xed, 0x1d, + 0xcd, 0xbc, 0xb7, 0xb2, 0xc2, 0xcb, 0x76, 0xc5, + 0x2c, 0x72, 0x1e, 0x72, 0x60, 0x74, 0xbf, 0xb8, + 0x82, 0x23, 0xf2, 0xee, 0x29, 0xdf, 0x86, 0xc7, + 0x54, 0x7b, 0x77, 0x38, 0xe3, 0x70, 0x62, 0xe7, + 0x84, 0x3b, 0x94, 0xd7, 0xe0, 0x50, 0xf6, 0xb6, + 0xee, 0xb8, 0xb9, 0x8a, 0xdc, 0x56, 0xb3, 0x3c, + 0x37, 0x46, 0xf1, 0x22, 0xbd, 0xe5, 0x6b, 0x6d, + 0xf3, 0x0e, 0xd2, 0xba, 0xc2, 0xbf, 0xf6, 0xe6, + 0x0f, 0x67, 0x0d, 0xdc, 0xa8, 0x18, 0xbf, 0xa1, + 0x05, 0x63, 0x2d, 0xb5, 0x6d, 0xed, 0xf4, 0x16, + 0xae, 0x71, 0x63, 0x64, 0x34, 0xa8, 0xdc, 0xd0, + 0x4f, 0xc8, 0xa4, 0xe5, 0xca, 0x72, 0x18, 0xe7, + 0x75, 0xb3, 0xef, 0x9e, 0xc9, 0x58, 0xec, 0x04, + 0x39, 0x9a, 0x01, 0xed, 0xae, 0x7c, 0xa2, 0x07, + 0x5b, 0xed, 0x14, 0x30, 0x3b, 0xca, 0x8a, 0x57, + 0xb0, 0xff, 0x00, 0x64, 0x39, 0x68, 0xce, 0x80, + 0xeb, 0x6b, 0xbd, 0xe1, 0x2b, 0xb4, 0x76, 0x8a, + 0x06, 0x69, 0x94, 0xcd, 0x96, 0xcc, 0xd6, 0x38, + 0x89, 0x22, 0x97, 0x4c, 0x52, 0x0d, 0x44, 0x05, + 0xd3, 0x69, 0x94, 0xda, 0x32, 0xc9, 0xb7, 0xf9, + 0xa4, 0xce, 0x86, 0x19, 0x0d, 0x22, 0x64, 0x62, + 0xaf, 0x77, 0x85, 0x74, 0x5f, 0x93, 0x36, 0xca, + 0xd9, 0x4a, 0xfd, 0x2e, 0x8e, 0x42, 0xd0, 0x4e, + 0xba, 0x55, 0xcd, 0x4d, 0xaa, 0xfd, 0x5f, 0xb0, + 0xdb, 0x37, 0x43, 0x63, 0x86, 0xa0, 0x70, 0x04, + 0x1a, 0x6e, 0xf2, 0x7b, 0x37, 0xd8, 0xbf, 0x30, + 0xca, 0xe6, 0x74, 0xd1, 0x44, 0x7f, 0x5b, 0x1c, + 0x9e, 0x50, 0x1b, 0xfb, 0x8a, 0x1f, 0xf2, 0x0b, + 0xaa, 0xd3, 0x31, 0xb9, 0xb3, 0x86, 0x78, 0x61, + 0xc3, 0xcd, 0xdc, 0x0a, 0x48, 0x08, 0xae, 0xad, + 0xe5, 0xca, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x2f, 0x39, 0xbf, 0x91, 0x6f, 0xe6, + 0x9f, 0x02, 0x8d, 0x2a, 0x4b, 0x37, 0xf2, 0x2d, + 0xfc, 0xd3, 0xe0, 0x51, 0xa5, 0x07, 0xb8, 0x7f, + 0x6a, 0xcf, 0x39, 0xaa, 0x5a, 0xa3, 0x79, 0x44, + 0xc5, 0xfb, 0x46, 0x79, 0xc1, 0x4a, 0xa0, 0x54, + 0x6f, 0x28, 0xfc, 0xc8, 0xd6, 0xe6, 0xd3, 0xed, + 0x3e, 0x50, 0xbb, 0xca, 0xe0, 0xcc, 0x7d, 0xe6, + 0xd3, 0xed, 0x3e, 0x50, 0x81, 0x97, 0x7b, 0xcd, + 0xdf, 0x9e, 0x7e, 0xb1, 0x52, 0x0a, 0x3f, 0x2e, + 0xf7, 0x9b, 0xbf, 0x3c, 0xfd, 0x62, 0xa4, 0x10, + 0x60, 0xea, 0x3d, 0xa5, 0x10, 0x75, 0x95, 0x2e, + 0x75, 0x1e, 0xd2, 0x88, 0x3a, 0xca, 0x02, 0x22, + 0x20, 0xdf, 0x9a, 0x7f, 0xa6, 0x5f, 0xe7, 0x8f, + 0xac, 0xaa, 0x2a, 0xdd, 0x9a, 0x7f, 0xa6, 0x5f, + 0xe7, 0x8f, 0xac, 0xaa, 0x28, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x9a, 0x37, 0x51, 0x37, 0xd0, 0x4f, + 0x5b, 0x1e, 0xac, 0xc8, 0x86, 0x63, 0x03, 0x47, + 0xb6, 0x5c, 0xbc, 0xc6, 0x25, 0x20, 0x1c, 0x03, + 0x4e, 0xae, 0x4a, 0xd9, 0x96, 0xcf, 0x2e, 0x77, + 0x6f, 0x73, 0x69, 0x7c, 0x79, 0xd7, 0xc6, 0xce, + 0x72, 0xde, 0x52, 0x3c, 0x66, 0x1a, 0xef, 0xae, + 0x5b, 0x0c, 0xc2, 0xc6, 0x5c, 0xb5, 0xd9, 0x56, + 0x62, 0x5d, 0x1c, 0x61, 0xc5, 0xd0, 0xce, 0xd1, + 0x8b, 0x09, 0xec, 0x8e, 0xea, 0xda, 0xdb, 0xdc, + 0xaf, 0x2a, 0xb6, 0x9d, 0xb6, 0x13, 0x3a, 0xea, + 0xea, 0xe1, 0xb8, 0x39, 0xc2, 0x30, 0xb5, 0xa1, + 0x07, 0x9d, 0x94, 0xe7, 0x3d, 0xb2, 0x67, 0x1a, + 0x0b, 0x41, 0x19, 0xf6, 0x9c, 0x5e, 0x4d, 0x3f, + 0x32, 0xbf, 0x96, 0xfa, 0xf1, 0xb5, 0x22, 0x61, + 0x99, 0xfe, 0xb2, 0x9c, 0xce, 0x01, 0xec, 0xf4, + 0xd5, 0x82, 0x9a, 0x68, 0xb5, 0xfb, 0x7d, 0xad, + 0xbe, 0x47, 0xec, 0x36, 0xaf, 0x26, 0xe2, 0xe1, + 0xd5, 0xb9, 0x76, 0x12, 0x28, 0x3e, 0x68, 0x3b, + 0xab, 0x37, 0x19, 0x95, 0xad, 0xe6, 0x51, 0x14, + 0x17, 0x0e, 0x22, 0xfa, 0xd4, 0xd2, 0x23, 0x84, + 0x90, 0xe6, 0x6a, 0xf1, 0x8e, 0xe6, 0x8f, 0x02, + 0x08, 0x97, 0x6a, 0x2a, 0xd9, 0x7d, 0x73, 0xec, + 0xd9, 0x9e, 0x4d, 0x21, 0x34, 0x6f, 0x36, 0xd6, + 0xb8, 0xf6, 0x1f, 0x46, 0x95, 0x54, 0x22, 0xa2, + 0x8a, 0x57, 0x3b, 0xcc, 0x2d, 0x6f, 0x45, 0x98, + 0xb7, 0x71, 0x71, 0x82, 0x20, 0xc7, 0x92, 0xd2, + 0x34, 0x8a, 0x71, 0x20, 0x93, 0x96, 0xdf, 0xab, + 0x2d, 0xf3, 0xa9, 0xc0, 0xa1, 0x91, 0xc2, 0x28, + 0x77, 0x34, 0x3f, 0x4e, 0x8e, 0x5a, 0xe5, 0xcd, + 0x28, 0x32, 0x0c, 0xa4, 0x9d, 0x40, 0xf7, 0x93, + 0x3d, 0xcf, 0x2d, 0xb3, 0x0b, 0x0b, 0x78, 0x60, + 0x24, 0xbc, 0x90, 0xe9, 0x81, 0x69, 0x1e, 0x30, + 0x6e, 0x1f, 0x09, 0x5c, 0xb7, 0xd9, 0x85, 0xac, + 0xf9, 0x3d, 0x85, 0x9c, 0x64, 0x99, 0x6d, 0xc1, + 0xe7, 0x5a, 0x41, 0xd0, 0x3b, 0x05, 0x07, 0x4e, + 0xd7, 0xf8, 0xd7, 0xf0, 0x4a, 0x3c, 0x99, 0x21, + 0x04, 0x1e, 0xe9, 0xd0, 0xa3, 0x6c, 0xf2, 0xeb, + 0x8b, 0xab, 0x79, 0xee, 0x63, 0x2d, 0x6c, 0x76, + 0xcd, 0xc4, 0xfc, 0x5a, 0x2b, 0xa0, 0x9a, 0x05, + 0x24, 0xcb, 0xfc, 0xb7, 0x32, 0xb1, 0x86, 0xdb, + 0x32, 0x91, 0xd6, 0xf7, 0x16, 0xe0, 0x06, 0x4e, + 0xd1, 0x88, 0x38, 0x53, 0x42, 0xd7, 0x77, 0x7d, + 0x97, 0x5a, 0x65, 0xee, 0xcb, 0x72, 0xc7, 0x3a, + 0x5e, 0x78, 0xd6, 0x79, 0xdc, 0x29, 0xa1, 0x04, + 0x32, 0xb4, 0x3a, 0xfd, 0xd6, 0x3b, 0x3b, 0x97, + 0xbd, 0x91, 0x47, 0x31, 0x7f, 0x8b, 0x86, 0x50, + 0x5c, 0x06, 0xbd, 0xe5, 0x57, 0x52, 0xb7, 0xb9, + 0x8d, 0xb4, 0xd9, 0x2d, 0x95, 0x9b, 0x1c, 0x4c, + 0xd0, 0x1a, 0xc8, 0x08, 0x34, 0x15, 0x07, 0x77, + 0x75, 0x06, 0xbb, 0xfc, 0xf6, 0xf6, 0xf6, 0x2e, + 0x61, 0xd8, 0x61, 0xb7, 0xdd, 0x8e, 0x26, 0xe1, + 0x06, 0x9d, 0xd5, 0xdb, 0x97, 0x31, 0xd7, 0x9b, + 0x3b, 0x3d, 0xae, 0xb7, 0xc3, 0x3b, 0x1e, 0xd1, + 0xaf, 0x43, 0x9c, 0x2b, 0xf2, 0xa8, 0x15, 0x31, + 0xb3, 0x99, 0xa5, 0xae, 0x5f, 0x2c, 0xe2, 0xe9, + 0xc5, 0xb1, 0x4c, 0xd1, 0xa8, 0x17, 0x0c, 0x40, + 0xe8, 0xd5, 0xd8, 0x41, 0x24, 0x6e, 0x1a, 0xdd, + 0xae, 0x64, 0x60, 0xfe, 0xad, 0xac, 0x16, 0xf4, + 0xfe, 0xc6, 0xae, 0x15, 0xcb, 0x98, 0xc7, 0xec, + 0x3b, 0x3e, 0x6d, 0xdc, 0x28, 0xfb, 0x8b, 0xb7, + 0x92, 0x3f, 0xaa, 0x1c, 0x69, 0xc0, 0x00, 0x51, + 0xaf, 0xbf, 0x61, 0xce, 0xba, 0xc1, 0xb5, 0xc1, + 0xcf, 0xf3, 0xa3, 0x41, 0xae, 0x1a, 0x8a, 0x68, + 0xec, 0xae, 0xcd, 0xa4, 0xcd, 0x6d, 0x73, 0x07, + 0xc0, 0xdb, 0x57, 0x17, 0x47, 0x18, 0x71, 0x35, + 0x05, 0xb5, 0x2e, 0xd3, 0xbb, 0xd8, 0x08, 0x36, + 0x3d, 0xee, 0x8f, 0x64, 0xed, 0x64, 0x6e, 0xb6, + 0xce, 0x48, 0xed, 0x87, 0x38, 0xfc, 0x8a, 0x50, + 0x42, 0xc7, 0xe7, 0x11, 0xe6, 0xf4, 0xfd, 0x51, + 0xb4, 0xe7, 0x89, 0xdc, 0xc4, 0x06, 0x1f, 0x01, + 0x50, 0x32, 0x66, 0x16, 0x8e, 0xd9, 0xf8, 0x6c, + 0x1a, 0x5c, 0x6e, 0x19, 0x29, 0x79, 0x61, 0x1a, + 0x00, 0xa9, 0x3a, 0xfb, 0x45, 0x75, 0x37, 0x3d, + 0x81, 0xbb, 0x3c, 0x6c, 0x0b, 0x8f, 0xb5, 0x06, + 0xf3, 0x60, 0x61, 0x34, 0xc0, 0x5d, 0xae, 0xbe, + 0x6a, 0x0c, 0xdb, 0xc8, 0x64, 0xd9, 0x8c, 0xc6, + 0x53, 0xae, 0x49, 0xcb, 0x8f, 0x77, 0x02, 0x80, + 0x52, 0x96, 0xd9, 0x85, 0xac, 0x79, 0x05, 0xcd, + 0x8b, 0xdc, 0x44, 0xf2, 0xc9, 0x89, 0x8d, 0x0d, + 0x24, 0x50, 0x60, 0xdd, 0xaf, 0x61, 0x45, 0xa0, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x6e, 0x14, 0x4d, + 0xc2, 0x82, 0xe9, 0x75, 0xfc, 0xae, 0xc7, 0xcc, + 0x6f, 0xd5, 0x0b, 0x85, 0x77, 0x5d, 0x7f, 0x2b, + 0xb1, 0xf3, 0x1b, 0xf5, 0x42, 0xe1, 0x41, 0x94, + 0x44, 0x40, 0x5e, 0xa2, 0xfd, 0xab, 0x3c, 0xe6, + 0xf8, 0x42, 0xf2, 0xbd, 0x43, 0xfb, 0x68, 0xfc, + 0xf6, 0xf8, 0x42, 0x0e, 0x4d, 0xb2, 0xfe, 0x67, + 0x1f, 0xd8, 0x8f, 0xac, 0xe5, 0x02, 0xa7, 0xb6, + 0xcb, 0xf9, 0x9c, 0x5f, 0x62, 0x3e, 0xb3, 0x94, + 0x0a, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0xe8, 0xcb, 0xa0, 0x6d, 0xc5, + 0xfd, 0xbc, 0x0f, 0xf2, 0x24, 0x91, 0xad, 0x77, + 0x6b, 0x75, 0x49, 0x67, 0x79, 0x95, 0xe5, 0xbe, + 0x67, 0x25, 0xb5, 0xac, 0xae, 0xb6, 0x86, 0xdb, + 0x0b, 0x63, 0x63, 0x0e, 0x16, 0xe9, 0x68, 0x35, + 0x20, 0x6b, 0xee, 0xa8, 0x78, 0x9e, 0xf8, 0xa4, + 0x6c, 0xac, 0x34, 0x7c, 0x6e, 0x0e, 0x69, 0xec, + 0x83, 0x55, 0x35, 0x71, 0x98, 0x64, 0x59, 0x83, + 0xc5, 0xc5, 0xf4, 0x33, 0x47, 0x71, 0x40, 0x24, + 0x11, 0xd3, 0x0b, 0x88, 0x40, 0xcf, 0x99, 0x1c, + 0xb6, 0x56, 0x19, 0x89, 0x68, 0x64, 0xd7, 0x0c, + 0xa4, 0xd4, 0x14, 0xae, 0x11, 0x5c, 0x54, 0x52, + 0xd6, 0x71, 0xdc, 0x37, 0x24, 0x6e, 0x5e, 0x64, + 0x0d, 0xbf, 0x7d, 0xbb, 0x9d, 0x0b, 0x4f, 0x94, + 0x18, 0x75, 0x36, 0xaa, 0x0e, 0xef, 0x38, 0xb7, + 0xbc, 0xbe, 0xb6, 0x74, 0xb0, 0xb9, 0xb6, 0x16, + 0xba, 0x19, 0x03, 0x68, 0x5c, 0x45, 0x29, 0xa7, + 0x11, 0x01, 0x6b, 0x9b, 0x3b, 0x9a, 0x4c, 0xe5, + 0xb9, 0x93, 0x41, 0x01, 0x84, 0x06, 0x46, 0x69, + 0xfb, 0x31, 0xa1, 0xcd, 0xee, 0xa0, 0x8d, 0xa1, + 0x69, 0xa3, 0x85, 0x08, 0xd0, 0x41, 0xdf, 0x53, + 0xdb, 0x23, 0xef, 0x97, 0x03, 0x74, 0xc1, 0xab, + 0x7f, 0x4a, 0x8b, 0xcc, 0xee, 0x2d, 0xae, 0x6f, + 0x1f, 0x71, 0x6a, 0xc7, 0x47, 0x1c, 0x86, 0xa5, + 0xae, 0xa7, 0x95, 0xf9, 0xc7, 0x46, 0xfa, 0x65, + 0x99, 0x84, 0x99, 0x75, 0xe3, 0x6e, 0x58, 0x31, + 0x53, 0x43, 0xd9, 0xbe, 0xd3, 0xb8, 0x83, 0x98, + 0x03, 0x8a, 0x9a, 0xcd, 0x69, 0xdf, 0x56, 0x8c, + 0xde, 0xdc, 0x5d, 0xed, 0x2d, 0x94, 0x3a, 0xc6, + 0x06, 0xb9, 0xe3, 0xb0, 0xd2, 0x5f, 0xdf, 0xa5, + 0x17, 0x17, 0xb6, 0xec, 0xc8, 0x98, 0x5c, 0x8b, + 0x79, 0xb9, 0xda, 0xe2, 0x10, 0xd7, 0xc4, 0xc5, + 0xbd, 0xda, 0x5e, 0x2d, 0x73, 0xf6, 0xb7, 0x33, + 0x9f, 0x31, 0xba, 0x8d, 0xce, 0x92, 0x48, 0xf0, + 0x42, 0x19, 0x4f, 0x10, 0x6f, 0x14, 0x1d, 0x79, + 0xa0, 0xc9, 0x6e, 0x73, 0x17, 0xcf, 0x35, 0xfb, + 0xe3, 0x95, 0xa7, 0x0e, 0x10, 0xca, 0x86, 0xe0, + 0xd1, 0xaf, 0xb7, 0xa5, 0x7a, 0xcf, 0x23, 0x64, + 0x99, 0xae, 0x59, 0x7f, 0x09, 0xc5, 0x1d, 0xc3, + 0x98, 0x03, 0xfb, 0x21, 0xc0, 0xb7, 0xbc, 0xab, + 0x6e, 0x25, 0xce, 0x2e, 0x76, 0x92, 0x49, 0x2e, + 0xee, 0x93, 0xc6, 0xa5, 0x63, 0xce, 0x60, 0xea, + 0xfb, 0x3b, 0x69, 0x63, 0x7b, 0xa5, 0xb3, 0x99, + 0xb3, 0x07, 0x8c, 0x34, 0x2d, 0x69, 0xa9, 0x03, + 0x48, 0x41, 0xd9, 0x9f, 0xe7, 0x39, 0x9d, 0xa6, + 0x69, 0x2c, 0x36, 0xf3, 0x98, 0xe3, 0x68, 0x69, + 0x6b, 0x68, 0x08, 0xa9, 0x1d, 0x90, 0xbc, 0x67, + 0x7c, 0xdd, 0xee, 0x51, 0x65, 0x9b, 0x39, 0xa1, + 0xb7, 0x0f, 0x38, 0x24, 0x73, 0x77, 0x46, 0x91, + 0x4e, 0xf2, 0x8c, 0xcd, 0xef, 0xe3, 0xcc, 0x2f, + 0xdf, 0x75, 0x13, 0x5c, 0xc6, 0xbc, 0x34, 0x61, + 0x75, 0x2b, 0xa0, 0x76, 0x2a, 0xb7, 0x3f, 0x33, + 0x86, 0x4c, 0x8d, 0x99, 0x6b, 0xd8, 0xfe, 0x76, + 0x39, 0x31, 0x31, 0xe2, 0x98, 0x69, 0x5e, 0xdd, + 0x7f, 0x39, 0x07, 0x56, 0xcb, 0x7e, 0xcb, 0x32, + 0xff, 0x00, 0xc7, 0xf9, 0x1e, 0xa0, 0x94, 0x8e, + 0x4f, 0x99, 0xc3, 0x62, 0xdb, 0xb1, 0x23, 0x1c, + 0xf3, 0x73, 0x16, 0x06, 0xe0, 0xa5, 0x01, 0xd3, + 0xaf, 0x13, 0xbb, 0x2a, 0x39, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x14, + 0xa6, 0xcd, 0x7f, 0x3b, 0xb6, 0xfe, 0xd7, 0xd4, + 0x2a, 0x2d, 0x4a, 0x6c, 0xdf, 0xf3, 0xab, 0x6f, + 0xed, 0xfd, 0x42, 0x82, 0x6f, 0x30, 0xf7, 0xd9, + 0xbc, 0xef, 0x90, 0x2e, 0x75, 0xd1, 0x98, 0xfb, + 0xf4, 0xbd, 0xbf, 0x90, 0x2e, 0x74, 0x05, 0x85, + 0x95, 0x84, 0x19, 0xdb, 0x2f, 0xd8, 0xd8, 0x76, + 0x9f, 0xe0, 0x62, 0xac, 0x2b, 0x3e, 0xd9, 0x7e, + 0xc6, 0xc3, 0xb4, 0xff, 0x00, 0x03, 0x15, 0x61, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x06, 0xcb, 0x78, + 0x24, 0xb8, 0x9e, 0x38, 0x22, 0x15, 0x92, 0x53, + 0x85, 0xa3, 0xb2, 0x54, 0xd5, 0xe5, 0xe5, 0xbe, + 0x4d, 0x0b, 0xb2, 0xec, 0xba, 0x86, 0xe4, 0x8c, + 0x37, 0x37, 0x5b, 0xa0, 0xfc, 0xd6, 0xf6, 0x54, + 0x66, 0x57, 0x7d, 0xd5, 0xf7, 0x8d, 0xba, 0xe6, + 0xf9, 0xd2, 0xc0, 0x40, 0x69, 0x38, 0x75, 0xf6, + 0x68, 0x54, 0x83, 0xb3, 0xec, 0xb9, 0xee, 0x73, + 0x9d, 0x94, 0x42, 0x5c, 0xe3, 0x57, 0x12, 0x45, + 0x49, 0x3f, 0xd8, 0x41, 0x0f, 0x14, 0x32, 0xdc, + 0x4c, 0xc8, 0xa3, 0x15, 0x96, 0x57, 0x06, 0x80, + 0x74, 0x9c, 0x44, 0xe9, 0xe0, 0xd6, 0xad, 0x99, + 0xbb, 0x45, 0xd6, 0x59, 0x3d, 0x95, 0xbc, 0xa6, + 0x49, 0xf2, 0xfc, 0x06, 0x71, 0xba, 0xf0, 0x06, + 0x9a, 0xa8, 0x68, 0xb3, 0xab, 0x68, 0x2f, 0xcd, + 0xe4, 0x16, 0x0c, 0x8c, 0xb6, 0x3c, 0x11, 0xc6, + 0xc7, 0x50, 0x07, 0x1d, 0x6e, 0xf2, 0x35, 0xd1, + 0x73, 0x58, 0x66, 0xb3, 0xd9, 0x5f, 0x3a, 0xec, + 0x81, 0x29, 0x93, 0x10, 0x91, 0xa4, 0xe8, 0x70, + 0x76, 0x9d, 0x68, 0x38, 0x90, 0xea, 0x5b, 0x26, + 0x7c, 0x72, 0x4a, 0xf7, 0xc6, 0xce, 0x69, 0xae, + 0x76, 0x26, 0xc7, 0x5a, 0xd0, 0x1d, 0xca, 0xad, + 0x67, 0x52, 0x09, 0xcd, 0xa0, 0xf7, 0x0c, 0xab, + 0xec, 0x4f, 0x81, 0xab, 0x8b, 0x28, 0xcb, 0x1b, + 0x7f, 0x33, 0x9d, 0x33, 0xb9, 0xbb, 0x58, 0x1b, + 0x8e, 0x79, 0x35, 0x68, 0xde, 0x1d, 0xb5, 0x8c, + 0xc3, 0x33, 0x37, 0x90, 0x5a, 0xc0, 0x63, 0xc1, + 0xec, 0x8d, 0xc0, 0x1d, 0x8a, 0xb8, 0xbb, 0xdd, + 0x85, 0xb7, 0x2a, 0xce, 0x63, 0xb1, 0xb5, 0x96, + 0xda, 0x4b, 0x56, 0xdc, 0xb6, 0x67, 0x55, 0xf8, + 0x9d, 0x40, 0x74, 0x0d, 0x04, 0x50, 0xa0, 0x66, + 0xb9, 0xb8, 0xba, 0x8d, 0xb6, 0x96, 0x6c, 0xe6, + 0x2c, 0x19, 0xe4, 0x30, 0x68, 0x2e, 0x23, 0x75, + 0xcb, 0x5e, 0x5d, 0x9a, 0x32, 0xc5, 0x8f, 0x63, + 0xad, 0x62, 0xb8, 0x32, 0x1a, 0xd6, 0x41, 0xa4, + 0x2e, 0xbe, 0xbc, 0xcb, 0x05, 0x3f, 0xc9, 0xe0, + 0xe1, 0x1a, 0xbf, 0x76, 0xa1, 0xdc, 0xe0, 0x5e, + 0xe7, 0x01, 0x84, 0x38, 0x93, 0x87, 0x70, 0x03, + 0xb8, 0x34, 0x04, 0x13, 0x16, 0xf9, 0x94, 0x77, + 0xb9, 0xc5, 0x83, 0xbd, 0x9e, 0x3b, 0x60, 0xc9, + 0x29, 0xfa, 0xbd, 0x00, 0xd4, 0x83, 0x53, 0xc0, + 0xb9, 0xb3, 0xe6, 0x3c, 0xe7, 0x57, 0x31, 0xfe, + 0x73, 0xa4, 0xf1, 0x7f, 0xb5, 0x4a, 0x28, 0xf6, + 0x39, 0xcc, 0x70, 0x7b, 0x0e, 0x17, 0x36, 0x85, + 0xa7, 0xb2, 0x0d, 0x54, 0xdb, 0xb3, 0xfb, 0x29, + 0x9f, 0x1d, 0xc5, 0xdd, 0x88, 0x96, 0xf2, 0x30, + 0x29, 0x20, 0x71, 0x0d, 0x24, 0x6a, 0x25, 0xa8, + 0x36, 0x64, 0x36, 0x13, 0xd8, 0x6d, 0x03, 0x21, + 0x9c, 0x00, 0xf3, 0x1b, 0x9d, 0x46, 0x9a, 0xd0, + 0x10, 0xa3, 0xf2, 0x92, 0x7a, 0xfa, 0x01, 0xb9, + 0xed, 0x07, 0xc2, 0x78, 0xd7, 0xab, 0x6c, 0xf2, + 0x78, 0xb3, 0x57, 0x66, 0x72, 0xb3, 0x9d, 0x7b, + 0x83, 0x9a, 0x58, 0x0d, 0x28, 0x1d, 0xaa, 0x9d, + 0xa5, 0xcb, 0x6b, 0x77, 0xec, 0xd7, 0xec, 0xbd, + 0x0c, 0xa9, 0x8e, 0x43, 0x21, 0x8e, 0xb4, 0xd6, + 0x49, 0xa6, 0x2e, 0xd2, 0x0d, 0xd9, 0xe5, 0x06, + 0x6f, 0x77, 0x5f, 0x5a, 0x57, 0x0f, 0xe5, 0xa1, + 0x4c, 0x65, 0x77, 0xce, 0xb8, 0xda, 0x11, 0x74, + 0x20, 0x0e, 0x33, 0xb9, 0xd8, 0x99, 0x5a, 0x86, + 0xb4, 0x8f, 0x19, 0xe6, 0xa3, 0x50, 0x51, 0xb7, + 0x8e, 0x6b, 0xee, 0xe6, 0x7b, 0x29, 0x84, 0xc8, + 0xe2, 0x29, 0xaa, 0x95, 0x34, 0xf0, 0x20, 0xd2, + 0x14, 0xde, 0x77, 0xfc, 0x9f, 0x27, 0xfb, 0x1f, + 0xee, 0xb5, 0x42, 0x76, 0x06, 0xb3, 0xf2, 0x69, + 0x5d, 0xb7, 0x99, 0x91, 0xbb, 0xb2, 0xb4, 0xb6, + 0x74, 0x58, 0x05, 0xa3, 0x43, 0x43, 0xc1, 0xc5, + 0x8b, 0x40, 0x1a, 0x90, 0x67, 0x28, 0xcb, 0xbd, + 0xbe, 0xe0, 0x87, 0xbb, 0x05, 0xbc, 0x2d, 0xe7, + 0x27, 0x7e, 0xf3, 0x42, 0xdd, 0x9a, 0xe6, 0xed, + 0x9d, 0x82, 0xc6, 0xc9, 0xbc, 0xc5, 0x8b, 0x35, + 0x30, 0x79, 0x4f, 0xa7, 0xe7, 0x3b, 0xb0, 0xb1, + 0x95, 0xe7, 0x0c, 0xcb, 0xed, 0xe6, 0xb7, 0x92, + 0xd5, 0xb7, 0x2c, 0x9c, 0x82, 0xf0, 0xe7, 0x50, + 0x50, 0x0d, 0x54, 0xc2, 0x56, 0xfe, 0xbb, 0xca, + 0xfe, 0xe7, 0x83, 0x7f, 0x58, 0xfe, 0x1a, 0x0e, + 0x3c, 0xb3, 0x32, 0x6d, 0x88, 0x90, 0x3a, 0xda, + 0x2b, 0x80, 0xf2, 0x0f, 0xeb, 0x34, 0xd1, 0x6c, + 0xb9, 0xcc, 0x9b, 0x7d, 0x71, 0x6b, 0x4b, 0x68, + 0xed, 0xf0, 0x48, 0xda, 0xf3, 0x7b, 0xb5, 0x70, + 0x51, 0xf2, 0xbc, 0x3e, 0x57, 0xbd, 0xad, 0x0c, + 0x0e, 0x75, 0x5a, 0xc1, 0xa8, 0x0d, 0xe0, 0x91, + 0xbf, 0x9b, 0x91, 0x92, 0x6b, 0xc0, 0xe0, 0xea, + 0x76, 0x8d, 0x50, 0x4b, 0x6d, 0x53, 0x4b, 0x73, + 0x97, 0x93, 0x50, 0x1c, 0xd6, 0x39, 0xa6, 0x9b, + 0x80, 0x61, 0xd0, 0xbb, 0x33, 0x0f, 0x15, 0x99, + 0x0c, 0x4e, 0xd1, 0x23, 0x43, 0x09, 0x07, 0x58, + 0x1e, 0x20, 0xd2, 0xb4, 0x4d, 0xb4, 0x36, 0x97, + 0x73, 0x17, 0xdf, 0x58, 0x36, 0x5c, 0x3f, 0xb2, + 0x01, 0xda, 0x47, 0x60, 0x9a, 0x69, 0x15, 0x5c, + 0x17, 0x79, 0xac, 0xb7, 0x79, 0x8c, 0x77, 0xb2, + 0x34, 0x01, 0x11, 0x69, 0x8e, 0x26, 0x9a, 0x00, + 0xd6, 0x1a, 0xd2, 0xa8, 0x25, 0x2f, 0x3f, 0xd6, + 0x6c, 0xfb, 0x58, 0xbf, 0xe9, 0xb5, 0x46, 0x67, + 0xb5, 0x19, 0xc5, 0xd7, 0xda, 0x15, 0x8b, 0x9c, + 0xd5, 0xf3, 0x66, 0xdd, 0x66, 0xc6, 0x06, 0x48, + 0x1c, 0xd7, 0x36, 0x32, 0x6a, 0x3c, 0x51, 0x87, + 0x5f, 0x71, 0x7a, 0xcd, 0xb3, 0x4b, 0x6c, 0xc3, + 0xf5, 0x8c, 0xb5, 0x6c, 0x13, 0x13, 0x8a, 0x59, + 0x01, 0xa9, 0x76, 0x84, 0x1d, 0x3b, 0x2b, 0x03, + 0x5f, 0x98, 0xba, 0xe5, 0xfa, 0x23, 0xb5, 0x61, + 0x79, 0xec, 0x1d, 0x5f, 0x2a, 0xdc, 0xdb, 0xed, + 0x9c, 0x6d, 0xf7, 0xb6, 0xd6, 0xe7, 0x9f, 0xc7, + 0xce, 0x17, 0x68, 0xc3, 0x52, 0xa3, 0xec, 0xb3, + 0x53, 0x65, 0x65, 0x77, 0x6c, 0xc8, 0xfc, 0x6b, + 0x9d, 0x06, 0x6c, 0x54, 0xa0, 0xd5, 0x4c, 0x34, + 0xd3, 0xa0, 0xae, 0x0a, 0x20, 0xb3, 0xdc, 0x5b, + 0xf3, 0x5b, 0x5d, 0x6d, 0x23, 0x47, 0x8b, 0x71, + 0x49, 0x01, 0xec, 0xe1, 0x73, 0x4f, 0x1a, 0x85, + 0xce, 0xf4, 0x66, 0xd7, 0x7f, 0x6a, 0xfd, 0x1c, + 0x0b, 0xa4, 0xe7, 0xee, 0x74, 0x96, 0x13, 0x3e, + 0x10, 0xe9, 0x2c, 0x41, 0x01, 0xd8, 0xfc, 0xb0, + 0x5b, 0x84, 0xfe, 0x66, 0x85, 0xb9, 0xdb, 0x45, + 0x64, 0xe9, 0x4d, 0xc7, 0x55, 0xc4, 0x66, 0x27, + 0x11, 0x91, 0xce, 0xa9, 0xc5, 0xbf, 0xe4, 0x20, + 0xf7, 0x9a, 0x83, 0x6b, 0xb3, 0x76, 0x36, 0x72, + 0x68, 0x96, 0x47, 0x17, 0x96, 0x9d, 0x74, 0xd2, + 0xef, 0xef, 0x2c, 0x6d, 0x4f, 0xeb, 0x59, 0x97, + 0xdd, 0x37, 0xc8, 0x96, 0x2a, 0x57, 0xb3, 0xa0, + 0x81, 0xe1, 0x51, 0x59, 0x86, 0x63, 0x71, 0x98, + 0x4f, 0xcf, 0x5c, 0x11, 0xa0, 0x51, 0xad, 0x6e, + 0xa6, 0x83, 0xb8, 0x17, 0x5d, 0x8e, 0x74, 0xd8, + 0xed, 0x05, 0x8d, 0xf5, 0xb8, 0xbb, 0xb6, 0x6f, + 0x90, 0x2b, 0x42, 0xde, 0xd2, 0x0f, 0x19, 0x66, + 0x57, 0x1d, 0xe5, 0xa5, 0xe5, 0xcc, 0xb2, 0x18, + 0x9b, 0x6a, 0xda, 0x8a, 0x50, 0x82, 0x68, 0x4e, + 0x13, 0xc0, 0xa3, 0x41, 0x04, 0x56, 0xbf, 0x91, + 0xd4, 0xa5, 0x6f, 0xb3, 0x96, 0xcb, 0x6b, 0xec, + 0x36, 0x36, 0xe2, 0xd6, 0xd8, 0x90, 0x5c, 0xd0, + 0x6a, 0x5c, 0x6b, 0x5f, 0x19, 0x7a, 0x13, 0x1f, + 0x86, 0x5d, 0x1b, 0xe3, 0xc1, 0x86, 0x76, 0x88, + 0xa4, 0x3a, 0x4b, 0xf5, 0x97, 0x53, 0xcd, 0x01, + 0x04, 0x4a, 0x27, 0x7f, 0xb3, 0xbe, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x2f, 0x39, 0xbf, 0x91, + 0x6f, 0xe6, 0x9f, 0x02, 0x8d, 0x2a, 0x4b, 0x37, + 0xf2, 0x2d, 0xfc, 0xd3, 0xe0, 0x51, 0xa5, 0x07, + 0xb8, 0xbf, 0x68, 0xcf, 0x38, 0x29, 0x55, 0x15, + 0x17, 0xed, 0x19, 0xe7, 0x05, 0x2a, 0x83, 0x05, + 0x70, 0x66, 0x3e, 0xf3, 0x69, 0xf6, 0x9f, 0x28, + 0x5d, 0xe5, 0x70, 0x66, 0x3e, 0xf3, 0x69, 0xf6, + 0x9f, 0x28, 0x40, 0xcb, 0xbd, 0xe6, 0xef, 0xcf, + 0x3f, 0x58, 0xa9, 0x05, 0x1f, 0x97, 0x7b, 0xcd, + 0xdf, 0x9e, 0x7e, 0xb1, 0x52, 0x08, 0x30, 0x75, + 0x1e, 0xd2, 0x88, 0x3a, 0xca, 0x97, 0x3a, 0x8f, + 0x69, 0x44, 0x1d, 0x65, 0x01, 0x11, 0x10, 0x6f, + 0xcd, 0x3f, 0xd3, 0x0f, 0xf3, 0xc7, 0xd6, 0x55, + 0x1a, 0x85, 0x79, 0x82, 0x68, 0x5b, 0x94, 0x4c, + 0xeb, 0x88, 0x84, 0xd1, 0x43, 0x57, 0x3a, 0x32, + 0x01, 0xad, 0x3c, 0x6d, 0xd5, 0x13, 0xf1, 0x06, + 0x43, 0xf7, 0x60, 0xe4, 0xb1, 0x05, 0x72, 0xa1, + 0x2a, 0x15, 0x8f, 0xe2, 0x0c, 0x87, 0xee, 0xc1, + 0xc9, 0x62, 0x7c, 0x41, 0x91, 0x7d, 0xd8, 0x39, + 0x2c, 0x41, 0x5c, 0xa8, 0x4a, 0x85, 0x63, 0xf8, + 0x83, 0x22, 0xfb, 0xb0, 0x72, 0x58, 0x9f, 0x10, + 0x64, 0x3f, 0x76, 0x0e, 0x4b, 0x10, 0x57, 0x2a, + 0x12, 0xa1, 0x58, 0xfe, 0x20, 0xc8, 0xbe, 0xec, + 0x1c, 0x96, 0x27, 0xc4, 0x19, 0x17, 0xdd, 0x83, + 0x92, 0xc4, 0x15, 0xca, 0x84, 0xa8, 0x56, 0x3f, + 0x88, 0x32, 0x2f, 0xbb, 0x07, 0x25, 0x89, 0xf1, + 0x06, 0x43, 0xf7, 0x60, 0xe4, 0xb1, 0x05, 0x72, + 0xa1, 0x2a, 0x15, 0x8f, 0xe2, 0x0c, 0x8b, 0xee, + 0xbe, 0xcf, 0x92, 0xc4, 0xf8, 0x83, 0x22, 0xfb, + 0xb0, 0x72, 0x58, 0x82, 0xb9, 0x50, 0x95, 0x0a, + 0xc7, 0xf1, 0x06, 0x45, 0xf7, 0x60, 0xe4, 0xb1, + 0x3e, 0x20, 0xc8, 0xbe, 0xec, 0x1c, 0x96, 0x20, + 0xae, 0x57, 0xb2, 0x9a, 0x15, 0x8f, 0xe2, 0x0c, + 0x8b, 0xee, 0xc1, 0xc9, 0x62, 0x7c, 0x41, 0x90, + 0xfd, 0xd8, 0x39, 0x2c, 0x41, 0x5c, 0xa8, 0x4a, + 0x85, 0x63, 0xf8, 0x83, 0x22, 0xfb, 0xb0, 0x72, + 0x58, 0x9f, 0x10, 0x64, 0x5f, 0x76, 0x0e, 0x4b, + 0x10, 0x57, 0x2a, 0x12, 0xa1, 0x58, 0xfe, 0x20, + 0xc8, 0xbe, 0xec, 0x1c, 0x96, 0x27, 0xc4, 0x19, + 0x17, 0xdd, 0x83, 0x92, 0xc4, 0x15, 0xca, 0xf6, + 0x52, 0xbd, 0x95, 0x63, 0xf8, 0x83, 0x22, 0xfb, + 0xb0, 0x72, 0x58, 0x9f, 0x10, 0x64, 0x5f, 0x76, + 0x0e, 0x4b, 0x10, 0x57, 0x2a, 0x12, 0xa1, 0x58, + 0xfe, 0x21, 0xc8, 0x7e, 0xec, 0x1c, 0x96, 0x27, + 0xc4, 0x19, 0x17, 0xdd, 0x83, 0x92, 0xc4, 0x15, + 0xca, 0x84, 0xa8, 0x56, 0x3f, 0x88, 0x32, 0x2f, + 0xbb, 0x07, 0x25, 0x89, 0xf1, 0x06, 0x45, 0xf7, + 0x60, 0xe4, 0xb1, 0x05, 0x72, 0xa1, 0x2a, 0x15, + 0x8f, 0xe2, 0x0c, 0x8b, 0xee, 0xc1, 0xc9, 0x62, + 0x7c, 0x41, 0x91, 0x7d, 0xd8, 0x39, 0x2c, 0x41, + 0x5c, 0xa8, 0x4a, 0x85, 0x63, 0xf8, 0x83, 0x22, + 0xfb, 0xb0, 0x72, 0x58, 0x9f, 0x10, 0x64, 0x3f, + 0x76, 0x0e, 0x4b, 0x10, 0x57, 0x2a, 0x95, 0x0a, + 0xc7, 0xf1, 0x06, 0x45, 0xf7, 0x60, 0xe4, 0xb1, + 0x3e, 0x20, 0xc8, 0xbe, 0xec, 0x1c, 0x96, 0x20, + 0xae, 0x54, 0x25, 0x42, 0xb1, 0xfc, 0x41, 0x91, + 0x7d, 0xd8, 0x39, 0x2c, 0x4f, 0x88, 0x32, 0x2f, + 0xbb, 0x07, 0x25, 0x88, 0x2b, 0x95, 0x09, 0x50, + 0xac, 0x7f, 0x10, 0x64, 0x5f, 0x76, 0x0e, 0x4b, + 0x13, 0xaf, 0xf2, 0x21, 0xaf, 0x2b, 0xfa, 0x2c, + 0x41, 0x5c, 0xa8, 0x4a, 0x85, 0x63, 0xf8, 0x83, + 0x22, 0xfb, 0xb0, 0x72, 0x58, 0x9f, 0x10, 0x64, + 0x5f, 0x76, 0x0e, 0x4b, 0x10, 0x57, 0x2a, 0x12, + 0xa1, 0x58, 0xfe, 0x20, 0xc8, 0xbe, 0xec, 0x1c, + 0x96, 0x27, 0xc4, 0x19, 0x17, 0xdd, 0x83, 0x92, + 0xc4, 0x15, 0xca, 0x84, 0xa8, 0x56, 0x3f, 0x88, + 0x32, 0x2f, 0xbb, 0x07, 0x25, 0x89, 0xf1, 0x06, + 0x45, 0xf7, 0x60, 0xe4, 0xb1, 0x05, 0x72, 0xa1, + 0x2a, 0x15, 0x8f, 0xe2, 0x0c, 0x87, 0xee, 0xc1, + 0xc9, 0x62, 0x7c, 0x41, 0x91, 0x7d, 0xd8, 0x39, + 0x2c, 0x41, 0x5c, 0xa8, 0x4d, 0xc2, 0xac, 0x7f, + 0x10, 0x64, 0x5f, 0x76, 0x0e, 0x4b, 0x13, 0xe2, + 0x0c, 0x84, 0xeb, 0xcb, 0x07, 0x26, 0x34, 0x12, + 0x57, 0x22, 0xb9, 0x4d, 0x91, 0x1b, 0x8c, 0x6f, + 0xd4, 0x5c, 0x3b, 0xaa, 0x4a, 0x7b, 0xa8, 0xee, + 0xf2, 0x78, 0xae, 0x22, 0x67, 0x37, 0x1b, 0xcb, + 0x70, 0xb3, 0x46, 0x80, 0x09, 0x1b, 0x8a, 0x35, + 0x01, 0x11, 0x10, 0x17, 0xb8, 0x7f, 0x6d, 0x1f, + 0x9e, 0xdf, 0x08, 0x5e, 0x17, 0xa8, 0xbf, 0x6d, + 0x19, 0xfe, 0xbb, 0x7c, 0x21, 0x07, 0x2e, 0xd9, + 0x02, 0x73, 0x38, 0xa8, 0x09, 0xfd, 0x48, 0xfa, + 0xce, 0x50, 0x38, 0x5d, 0xbc, 0x78, 0x15, 0xcb, + 0x3c, 0xcf, 0x9f, 0x96, 0x5e, 0x36, 0x16, 0xc0, + 0xd9, 0x83, 0xd8, 0x1d, 0x89, 0xc6, 0x9b, 0xa7, + 0x46, 0xa5, 0x1d, 0xf1, 0x8c, 0xbd, 0x0e, 0x3e, + 0x51, 0xe2, 0x41, 0x5e, 0xc2, 0xed, 0xe3, 0xc0, + 0x98, 0x5d, 0xbc, 0x78, 0x15, 0x87, 0xe3, 0x19, + 0x7a, 0x1c, 0x7c, 0xa3, 0xc4, 0x9f, 0x18, 0xcb, + 0xd0, 0xe3, 0xe5, 0x1e, 0x24, 0x15, 0xec, 0x2e, + 0xde, 0x3c, 0x09, 0x85, 0xdb, 0xc7, 0x81, 0x58, + 0x7e, 0x31, 0x97, 0xa1, 0xc7, 0xca, 0x3c, 0x49, + 0xf1, 0x8c, 0xbd, 0x0e, 0x3e, 0x51, 0xe2, 0x41, + 0x5e, 0xc2, 0xed, 0xe3, 0xc0, 0x98, 0x5d, 0xbc, + 0x78, 0x15, 0x87, 0xe3, 0x19, 0x7a, 0x1c, 0x7c, + 0xa3, 0xc4, 0x9f, 0x18, 0xcb, 0xd0, 0xe3, 0xe5, + 0x1e, 0x24, 0x15, 0xec, 0x2e, 0xde, 0x3c, 0x09, + 0x85, 0xdb, 0xc7, 0x81, 0x58, 0x7e, 0x31, 0x97, + 0xa1, 0xc7, 0xca, 0x3c, 0x49, 0xf1, 0x8c, 0xbd, + 0x0e, 0x3e, 0x51, 0xe2, 0x41, 0x5e, 0xc2, 0xed, + 0xe3, 0xc0, 0x98, 0x5d, 0xbc, 0x78, 0x15, 0x87, + 0xe3, 0x19, 0x7a, 0x1c, 0x7c, 0xa3, 0xc4, 0x9f, + 0x18, 0xcb, 0xd0, 0xe3, 0xe5, 0x1e, 0x24, 0x15, + 0xec, 0x2e, 0xde, 0x3c, 0x09, 0x85, 0xdb, 0xc7, + 0x81, 0x58, 0x7e, 0x31, 0x97, 0xa1, 0xc7, 0xca, + 0x3c, 0x49, 0xf1, 0x8c, 0xbd, 0x0e, 0x3e, 0x51, + 0xe2, 0x41, 0x5e, 0xc2, 0xed, 0xe3, 0xc0, 0x98, + 0x5d, 0xbc, 0x78, 0x15, 0x87, 0xe3, 0x19, 0x7a, + 0x1c, 0x7c, 0xa3, 0xc4, 0x9f, 0x18, 0xcb, 0xd0, + 0xe3, 0xe5, 0x1e, 0x24, 0x15, 0xec, 0x2e, 0xde, + 0x3c, 0x09, 0x85, 0xdb, 0xc7, 0x81, 0x58, 0x7e, + 0x31, 0x97, 0xa1, 0xc7, 0xca, 0x3c, 0x49, 0xf1, + 0x8c, 0xbd, 0x0e, 0x3e, 0x51, 0xe2, 0x41, 0x5e, + 0xc2, 0xed, 0xe3, 0xc0, 0x98, 0x4e, 0xf1, 0xe0, + 0x56, 0x1f, 0x8c, 0x65, 0xe8, 0x71, 0xf2, 0x8f, + 0x12, 0x7c, 0x63, 0x2f, 0x43, 0x8f, 0x94, 0x78, + 0x90, 0x57, 0xb0, 0xbb, 0x78, 0xf0, 0x26, 0x17, + 0x6f, 0x1e, 0x05, 0x61, 0xf8, 0xc6, 0x5e, 0x87, + 0x1f, 0x28, 0xf1, 0x27, 0xc6, 0x32, 0xf4, 0x38, + 0xf9, 0x47, 0x89, 0x05, 0x7b, 0x0b, 0xb7, 0x8f, + 0x02, 0x61, 0x76, 0xf1, 0xe0, 0x56, 0x1f, 0x8c, + 0x65, 0xe8, 0x71, 0xf2, 0x8f, 0x12, 0x7c, 0x63, + 0x2f, 0x43, 0x8f, 0x94, 0x78, 0x90, 0x57, 0xb0, + 0xbb, 0x78, 0xf0, 0x26, 0x17, 0x6f, 0x1e, 0x05, + 0x61, 0xf8, 0xc6, 0x5e, 0x87, 0x1f, 0x28, 0xf1, + 0x27, 0xc6, 0x32, 0xf4, 0x38, 0xf9, 0x47, 0x89, + 0x05, 0x7b, 0x0b, 0xb7, 0x8f, 0x02, 0x61, 0x76, + 0xf1, 0xe0, 0x56, 0x1f, 0x8c, 0x65, 0xe8, 0x71, + 0xf2, 0x8f, 0x12, 0x7c, 0x63, 0x2f, 0x43, 0x8f, + 0x94, 0x78, 0x90, 0x57, 0xa8, 0xed, 0xe3, 0xc0, + 0x98, 0x5d, 0xbc, 0x78, 0x15, 0x87, 0xe3, 0x19, + 0x7a, 0x1c, 0x7c, 0xa3, 0xc4, 0x9f, 0x18, 0xcb, + 0xd0, 0xe3, 0xe5, 0x1e, 0x24, 0x15, 0xec, 0x2e, + 0xde, 0x3c, 0x09, 0x85, 0xdb, 0xc7, 0x81, 0x58, + 0x7e, 0x31, 0x97, 0xa1, 0xc7, 0xca, 0x3c, 0x49, + 0xf1, 0x8c, 0xbd, 0x0e, 0x3e, 0x51, 0xe2, 0x41, + 0x5e, 0xc2, 0xed, 0xe3, 0xc0, 0x98, 0x5d, 0xbc, + 0x78, 0x15, 0x87, 0xe3, 0x19, 0x7a, 0x1c, 0x7c, + 0xa3, 0xc4, 0x9f, 0x18, 0xcb, 0xd0, 0xe3, 0xe5, + 0x1e, 0x24, 0x15, 0xec, 0x2e, 0xde, 0x3c, 0x09, + 0x85, 0xdb, 0xc7, 0x81, 0x58, 0x7e, 0x31, 0x97, + 0xa1, 0xc7, 0xca, 0x3c, 0x49, 0xf1, 0x8c, 0xbd, + 0x0e, 0x3e, 0x51, 0xe2, 0x41, 0x5e, 0xc2, 0xed, + 0xe3, 0xc0, 0x98, 0x5d, 0xbc, 0x78, 0x15, 0x87, + 0xe3, 0x19, 0x7a, 0x1c, 0x7c, 0xa3, 0xc4, 0x9f, + 0x18, 0xcb, 0xd0, 0xe3, 0xe5, 0x1e, 0x24, 0x15, + 0xec, 0x2e, 0xde, 0x3c, 0x09, 0x85, 0xdb, 0xc7, + 0x81, 0x58, 0x7e, 0x31, 0x97, 0xa1, 0xc7, 0xca, + 0x3c, 0x49, 0xf1, 0x8c, 0xbd, 0x0e, 0x3e, 0x51, + 0xe2, 0x41, 0x5e, 0xc2, 0xed, 0xe3, 0xc0, 0x98, + 0x5d, 0xbc, 0x78, 0x15, 0x87, 0xe3, 0x19, 0x7a, + 0x1c, 0x7c, 0xa3, 0xc4, 0x9f, 0x18, 0xcb, 0xd0, + 0xe3, 0xe5, 0x1e, 0x24, 0x15, 0xec, 0x2e, 0xde, + 0x3c, 0x09, 0x85, 0xdb, 0xc7, 0x81, 0x58, 0x7e, + 0x31, 0x97, 0xa1, 0xc7, 0xca, 0x3c, 0x49, 0xf1, + 0x8c, 0xbd, 0x0e, 0x3e, 0x51, 0xe2, 0x41, 0x5e, + 0xc2, 0xed, 0xe3, 0xc0, 0xa4, 0xf6, 0x6c, 0x1e, + 0xba, 0xb6, 0xd0, 0x69, 0xe3, 0x6e, 0x7f, 0x50, + 0xae, 0xef, 0x8c, 0x65, 0xe8, 0x71, 0xf2, 0x8f, + 0x12, 0xea, 0xca, 0x76, 0x92, 0x4b, 0xec, 0xc2, + 0x2b, 0x67, 0x5b, 0x32, 0x31, 0x25, 0x7c, 0x66, + 0x93, 0x51, 0x46, 0x93, 0xbc, 0x83, 0x66, 0x63, + 0xef, 0xb2, 0xf6, 0xfe, 0x40, 0xb9, 0x97, 0x46, + 0x61, 0xef, 0xb3, 0x79, 0xdf, 0x20, 0x5c, 0xe8, + 0x0b, 0x0b, 0x2b, 0x08, 0x33, 0xb6, 0x5f, 0xb1, + 0xb0, 0xed, 0x3f, 0xc0, 0xc5, 0x58, 0x56, 0x7d, + 0xb2, 0xfd, 0x8d, 0x87, 0x69, 0xfe, 0x06, 0x2a, + 0xc2, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x2c, + 0xb9, 0xaf, 0x66, 0x87, 0x34, 0xb4, 0xf6, 0x41, + 0x08, 0x30, 0x8b, 0x38, 0x1f, 0x40, 0x4b, 0x48, + 0x0e, 0xf2, 0x49, 0x07, 0x4f, 0x69, 0x7a, 0x64, + 0x13, 0xbd, 0xc5, 0xac, 0x89, 0xee, 0x70, 0xd6, + 0x03, 0x49, 0x23, 0xb7, 0xa1, 0x07, 0x84, 0x42, + 0x08, 0x24, 0x11, 0x42, 0x09, 0x04, 0x1d, 0xf0, + 0xbd, 0x46, 0xc7, 0x3d, 0xed, 0x00, 0x17, 0x69, + 0x00, 0x80, 0x2b, 0xa0, 0x9e, 0xc2, 0x0f, 0x28, + 0xa5, 0x33, 0xfc, 0xba, 0x1b, 0x2b, 0xb6, 0xc7, + 0x6f, 0x19, 0x11, 0x98, 0xda, 0xe2, 0x4d, 0x48, + 0xa9, 0xec, 0xa8, 0xf8, 0xed, 0xee, 0x24, 0x69, + 0x7c, 0x71, 0x3d, 0xed, 0x1a, 0xdc, 0xd6, 0x92, + 0x10, 0x79, 0x6b, 0xde, 0xd3, 0x56, 0xb8, 0xb4, + 0x90, 0x45, 0x46, 0xf1, 0x5e, 0x77, 0x00, 0xde, + 0x4f, 0xfe, 0x16, 0xeb, 0x4b, 0x67, 0x5d, 0xdd, + 0x45, 0x6c, 0xcd, 0x0e, 0x95, 0xc1, 0xb5, 0xde, + 0xdf, 0x28, 0x34, 0xa2, 0x9f, 0xb9, 0xf8, 0x6e, + 0xc6, 0xe4, 0xd8, 0xcb, 0x6c, 0xf9, 0x8b, 0x3c, + 0x59, 0x67, 0xc5, 0x4a, 0x1d, 0xdd, 0x0b, 0x83, + 0x3b, 0xcb, 0x5b, 0x97, 0x5d, 0x86, 0x44, 0x4b, + 0xa0, 0x95, 0xa2, 0x48, 0x89, 0xde, 0x3b, 0x88, + 0x23, 0xd1, 0x74, 0xe5, 0x91, 0x32, 0x5c, 0xc6, + 0xde, 0x29, 0x1a, 0x1e, 0xc9, 0x24, 0x6b, 0x5c, + 0xd3, 0xa9, 0x4c, 0xed, 0x36, 0x5b, 0x65, 0x6f, + 0x04, 0x77, 0x16, 0x71, 0x08, 0x83, 0x24, 0x74, + 0x52, 0x86, 0xf6, 0x45, 0x42, 0x0a, 0xea, 0x76, + 0x7b, 0xea, 0x5f, 0x66, 0xec, 0x6d, 0xae, 0x6e, + 0x26, 0x9a, 0xed, 0x81, 0xf0, 0xc2, 0xcd, 0x21, + 0xd5, 0xa6, 0x27, 0x1a, 0x6e, 0x2e, 0x8b, 0xcc, + 0x9e, 0xda, 0x5d, 0xa2, 0x8e, 0xc6, 0x06, 0x88, + 0x61, 0x73, 0x03, 0xdc, 0x1b, 0xb8, 0x00, 0xf1, + 0xa9, 0xd9, 0x41, 0x00, 0x8a, 0x7a, 0x7c, 0xcb, + 0x27, 0xb7, 0xb9, 0x75, 0xab, 0x32, 0xd8, 0xe4, + 0x86, 0x37, 0x60, 0x74, 0xae, 0xf2, 0xcd, 0x35, + 0xd3, 0xc5, 0xf9, 0x56, 0xbb, 0xcc, 0xb2, 0xd2, + 0x0c, 0xee, 0xd2, 0x28, 0x86, 0x2b, 0x4b, 0x92, + 0xd7, 0x06, 0x13, 0x5a, 0x03, 0xb8, 0x82, 0x16, + 0xa8, 0xac, 0x59, 0x8d, 0xc6, 0x49, 0x65, 0x7b, + 0x2d, 0xa3, 0xf2, 0xd0, 0xf1, 0x19, 0x15, 0x7b, + 0x5c, 0x6b, 0xa4, 0x07, 0x6a, 0xee, 0xad, 0x37, + 0xd9, 0x1d, 0xb3, 0xae, 0x2c, 0x5d, 0x62, 0xe2, + 0xdb, 0x6b, 0xf7, 0x00, 0x01, 0xd2, 0x46, 0x8c, + 0x47, 0xbc, 0x82, 0x0d, 0x3b, 0x6a, 0xc1, 0x7b, + 0x79, 0x94, 0x65, 0xb7, 0x0e, 0xb2, 0x8b, 0x2e, + 0x8e, 0xe1, 0xb1, 0x10, 0xd7, 0xcb, 0x25, 0x0b, + 0x89, 0xdd, 0xdc, 0x2b, 0x93, 0x3d, 0xb1, 0xb4, + 0x80, 0xc1, 0x77, 0x64, 0x03, 0x20, 0xba, 0x66, + 0x3e, 0x6e, 0xb5, 0xc2, 0x69, 0x5a, 0x51, 0x04, + 0x52, 0x22, 0x20, 0x22, 0x22, 0x01, 0x00, 0xf6, + 0xd6, 0x5c, 0xf7, 0x16, 0x86, 0x38, 0xf8, 0xa3, + 0x50, 0x58, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x41, 0x79, 0xcd, 0xfc, 0x8b, 0x7f, + 0x34, 0xf8, 0x14, 0x69, 0x52, 0x59, 0xbf, 0x91, + 0x6f, 0xe6, 0x9f, 0x02, 0x8d, 0x28, 0x3d, 0xc5, + 0xfb, 0x46, 0x79, 0xc1, 0x4a, 0xa8, 0xa8, 0xbf, + 0x68, 0xcf, 0x38, 0x29, 0x54, 0x18, 0x2b, 0x83, + 0x31, 0xf7, 0x9b, 0x4f, 0xb4, 0xf9, 0x42, 0xef, + 0x2b, 0x83, 0x31, 0xf7, 0x9b, 0x4f, 0xb4, 0xf9, + 0x42, 0x06, 0x5d, 0xef, 0x37, 0x7e, 0x79, 0xfa, + 0xc5, 0x48, 0x28, 0xfc, 0xbb, 0xde, 0x6e, 0xfc, + 0xf3, 0xf5, 0x8a, 0x90, 0x41, 0x83, 0xa8, 0xf6, + 0x94, 0x41, 0xd6, 0x54, 0xb9, 0xd4, 0x7b, 0x4a, + 0x20, 0xeb, 0x28, 0x08, 0x88, 0x83, 0xb0, 0x7f, + 0x22, 0xbe, 0xf3, 0x5d, 0xe0, 0x54, 0xc5, 0x73, + 0x1f, 0xc8, 0xaf, 0xbc, 0xd7, 0x78, 0x15, 0x31, + 0x01, 0x48, 0xe5, 0x79, 0x40, 0xbc, 0x8e, 0x4b, + 0x89, 0xe5, 0x16, 0xf6, 0x90, 0xf9, 0x72, 0x91, + 0xad, 0xc7, 0x79, 0x47, 0x29, 0xeb, 0xda, 0x43, + 0xb2, 0x96, 0x51, 0xb7, 0x40, 0x9d, 0xf8, 0xdd, + 0xd9, 0xa6, 0x2f, 0xe8, 0x41, 0xa9, 0xf9, 0x1d, + 0x9d, 0xc5, 0xbc, 0x92, 0xe5, 0x77, 0x5e, 0xd2, + 0xf8, 0x85, 0x5f, 0x13, 0x9b, 0x43, 0x40, 0xa1, + 0x86, 0x91, 0xa3, 0x76, 0x84, 0x76, 0x2b, 0xb8, + 0xa5, 0xb6, 0x5a, 0x47, 0x33, 0x39, 0x8d, 0xa3, + 0x54, 0xad, 0x73, 0x5c, 0x37, 0x08, 0xa6, 0x2d, + 0x3c, 0x0b, 0x75, 0x9e, 0x5b, 0x69, 0x35, 0xce, + 0x6e, 0xd9, 0x99, 0x8c, 0x5a, 0x87, 0x3a, 0x3d, + 0x24, 0x50, 0xd5, 0xfc, 0x48, 0x20, 0xd0, 0x8a, + 0x57, 0xb1, 0xad, 0x49, 0x6c, 0xf5, 0x9d, 0xbd, + 0xee, 0x63, 0xcc, 0x5c, 0xb3, 0x1c, 0x7c, 0xdb, + 0x8e, 0x1a, 0x9d, 0x61, 0x6d, 0xca, 0xec, 0xb2, + 0xf1, 0x1d, 0xe5, 0xed, 0xe3, 0x71, 0xc5, 0x68, + 0xe2, 0x19, 0x00, 0x76, 0x97, 0x53, 0xbe, 0x82, + 0x20, 0x69, 0xd5, 0xa5, 0x14, 0xf3, 0x23, 0xca, + 0xf3, 0x3b, 0x1b, 0xc9, 0x21, 0xb6, 0xf6, 0x49, + 0xec, 0xd8, 0x64, 0xf1, 0x5c, 0x5c, 0x08, 0x15, + 0xdf, 0xf3, 0x56, 0xac, 0xb6, 0xca, 0xc6, 0x1c, + 0xb2, 0x4c, 0xd6, 0xfe, 0x3e, 0x7c, 0x62, 0xc1, + 0x14, 0x20, 0xd0, 0x13, 0xa9, 0x07, 0x2d, 0x96, + 0x58, 0xdb, 0xab, 0x2b, 0xcb, 0xae, 0x73, 0x0f, + 0xb2, 0x0a, 0x86, 0x61, 0xae, 0x2a, 0x8d, 0xfa, + 0xae, 0x0d, 0xca, 0xee, 0x2b, 0x45, 0xab, 0xb2, + 0xf9, 0x72, 0x4c, 0xc6, 0x6b, 0x36, 0x18, 0x31, + 0xb0, 0x89, 0x60, 0x71, 0xc4, 0x1a, 0xe0, 0x37, + 0x0e, 0xf1, 0x5c, 0xd6, 0xb9, 0x7e, 0x52, 0xcc, + 0x96, 0x0c, 0xca, 0xf1, 0xa7, 0x13, 0x5f, 0x49, + 0x30, 0x93, 0x89, 0xfa, 0x48, 0x0c, 0xa5, 0x68, + 0x82, 0x01, 0x3b, 0x1b, 0xaa, 0x72, 0xd2, 0x0c, + 0x9e, 0xea, 0x5b, 0xbb, 0xf7, 0xc5, 0xcd, 0x5a, + 0x5b, 0xb1, 0xb8, 0x2d, 0x71, 0x00, 0x4b, 0xb4, + 0xe2, 0x35, 0xaa, 0xf5, 0x0c, 0x59, 0x56, 0x6d, + 0x67, 0x75, 0xcc, 0x5a, 0xfb, 0x1d, 0xc5, 0xb3, + 0x0c, 0x8c, 0x73, 0x5c, 0x5c, 0x0e, 0xba, 0x02, + 0x0f, 0x69, 0x04, 0x65, 0x9e, 0x59, 0x2d, 0xe5, + 0xbd, 0xcc, 0xec, 0x7b, 0x5a, 0xdb, 0x46, 0x63, + 0x70, 0x20, 0x92, 0x75, 0x9f, 0x16, 0x9d, 0xa5, + 0xc9, 0x4d, 0x3d, 0xb2, 0xac, 0xd9, 0x0c, 0xf9, + 0x71, 0xca, 0xef, 0x70, 0xdb, 0x10, 0x63, 0x86, + 0xb7, 0x5e, 0x37, 0xed, 0x34, 0x3a, 0xb4, 0xf9, + 0xab, 0x8e, 0xd6, 0xd3, 0x2c, 0xbc, 0xb5, 0xcc, + 0xae, 0xa3, 0xb7, 0x31, 0xb6, 0x08, 0xc1, 0x85, + 0x85, 0xe4, 0x96, 0x9a, 0x1a, 0xe9, 0xed, 0x84, + 0x10, 0xa3, 0x4e, 0xad, 0x34, 0xd6, 0x9f, 0x90, + 0x52, 0x9b, 0x3d, 0x63, 0x6d, 0x7d, 0x77, 0x2c, + 0x77, 0x4c, 0xe7, 0x18, 0xc8, 0x9c, 0xf6, 0x8a, + 0x91, 0x47, 0x02, 0xca, 0x1d, 0x0b, 0x7e, 0x4d, + 0x96, 0xe5, 0xd7, 0x59, 0x65, 0xd5, 0xc5, 0xdd, + 0x5a, 0x61, 0x78, 0x1c, 0xe5, 0x4d, 0x43, 0x68, + 0xd2, 0x42, 0x08, 0x4a, 0xa5, 0x42, 0x9a, 0x82, + 0xdb, 0x2d, 0xcd, 0xf3, 0x18, 0xa1, 0xb3, 0x81, + 0xd6, 0xb6, 0xf1, 0x31, 0xc6, 0x7d, 0x3a, 0x5c, + 0x1b, 0xab, 0x55, 0x56, 0xeb, 0x4e, 0xa2, 0xcc, + 0xae, 0x9d, 0x97, 0xc5, 0x69, 0xcc, 0xe3, 0x0e, + 0x10, 0x5c, 0x07, 0x54, 0x92, 0xd0, 0x74, 0xb8, + 0x76, 0x68, 0x82, 0xbe, 0xa4, 0xb2, 0x7c, 0xa6, + 0x3c, 0xcb, 0x9f, 0x32, 0x4f, 0xec, 0xed, 0xb7, + 0x6b, 0x5c, 0x5d, 0x87, 0x10, 0xa1, 0xaf, 0x64, + 0x6f, 0x2e, 0x09, 0xa2, 0x74, 0x33, 0x3e, 0x17, + 0x79, 0x51, 0x38, 0xb4, 0xf7, 0x0d, 0x3e, 0x45, + 0x39, 0xb2, 0xec, 0x7c, 0x90, 0x66, 0x4c, 0x60, + 0xc4, 0xe7, 0x44, 0xd0, 0x1b, 0xbe, 0x4e, 0x34, + 0x1a, 0xfa, 0x9b, 0x25, 0xfb, 0xe1, 0x9d, 0x9f, + 0x17, 0xf4, 0x94, 0x34, 0x8d, 0x6b, 0x65, 0x7b, + 0x18, 0xec, 0x6c, 0x6b, 0x88, 0x6b, 0xc6, 0xe8, + 0xdc, 0x3b, 0xab, 0xb4, 0x64, 0x39, 0xc8, 0x1e, + 0xe8, 0xf1, 0xbf, 0xa8, 0xfc, 0xab, 0xab, 0x28, + 0xcb, 0xac, 0x2e, 0x2c, 0x2f, 0x2e, 0x2f, 0x5a, + 0x47, 0xb3, 0x11, 0x57, 0x34, 0xd0, 0xb4, 0x01, + 0x52, 0xd1, 0xdb, 0x41, 0x0d, 0xa7, 0x79, 0x06, + 0x9d, 0x4a, 0xc5, 0x69, 0x0e, 0x4d, 0x9a, 0xdb, + 0xdc, 0x45, 0x6d, 0x6a, 0x6d, 0xa6, 0x82, 0x3c, + 0x71, 0xbf, 0x15, 0x49, 0x1d, 0x95, 0xc9, 0x95, + 0x59, 0xd9, 0xb7, 0x2f, 0x9b, 0x35, 0xbf, 0x61, + 0x96, 0x18, 0x9c, 0x1b, 0x1c, 0x35, 0xa0, 0x71, + 0x34, 0xe3, 0x41, 0x10, 0x8a, 0x66, 0x68, 0x72, + 0xcb, 0xfc, 0xb2, 0x5b, 0xdb, 0x58, 0x85, 0xa4, + 0xf6, 0xe7, 0xc7, 0x8b, 0x15, 0x43, 0x9b, 0xd8, + 0xae, 0x95, 0xef, 0xd9, 0xf2, 0xfc, 0xaf, 0x2f, + 0xb6, 0xb8, 0xbc, 0xb7, 0x37, 0x77, 0x37, 0x43, + 0x10, 0x63, 0x9d, 0x84, 0x35, 0xba, 0x37, 0xbb, + 0x68, 0x20, 0xfe, 0x54, 0xd3, 0x43, 0xa1, 0x4b, + 0xe6, 0xb9, 0x7d, 0xa9, 0xb4, 0xb7, 0xcc, 0xb2, + 0xf6, 0x96, 0xc3, 0x3b, 0xb0, 0x3a, 0x2a, 0xd7, + 0x0b, 0xf4, 0x8d, 0x7d, 0xc5, 0xd3, 0x79, 0x06, + 0x4d, 0x94, 0x32, 0x2b, 0x4b, 0xab, 0x63, 0x75, + 0x3c, 0x8c, 0x06, 0x69, 0x31, 0x50, 0xb6, 0xbf, + 0x2a, 0x08, 0xeb, 0xfc, 0xb0, 0x5a, 0x59, 0xda, + 0x5d, 0x09, 0x0b, 0xfd, 0xac, 0x17, 0x61, 0xa5, + 0x30, 0xd2, 0x9c, 0x6b, 0x83, 0x4d, 0x74, 0xeb, + 0xdd, 0x56, 0x2d, 0xa3, 0x89, 0xbe, 0xc5, 0x95, + 0x43, 0x6e, 0x4b, 0xd8, 0x43, 0x9b, 0x1b, 0x8e, + 0xb2, 0x0e, 0x00, 0x3c, 0x2b, 0xc5, 0xdb, 0x72, + 0x5c, 0x9e, 0x56, 0x59, 0x4d, 0x6b, 0xed, 0x52, + 0xd0, 0x1b, 0x99, 0x4b, 0x88, 0xc3, 0x88, 0x57, + 0xc5, 0x08, 0x20, 0x3f, 0x2e, 0x04, 0x3a, 0x14, + 0xe4, 0xf9, 0x3d, 0xac, 0x19, 0xed, 0xad, 0xb0, + 0x06, 0x4b, 0x4b, 0x9c, 0x32, 0x35, 0xae, 0x3a, + 0x40, 0x35, 0x18, 0x6a, 0xb1, 0x9a, 0xb3, 0x24, + 0xb0, 0x37, 0x56, 0x51, 0x42, 0x64, 0xb9, 0x75, + 0x70, 0xbc, 0x1d, 0x11, 0x17, 0x6a, 0x1a, 0x50, + 0x42, 0x13, 0x41, 0x55, 0xdf, 0x9a, 0xe5, 0x43, + 0x2d, 0xf6, 0x70, 0x24, 0x32, 0x73, 0xf1, 0xe3, + 0xd2, 0x29, 0x42, 0xa3, 0xdd, 0xe4, 0x9e, 0xd2, + 0xb2, 0xe7, 0xec, 0x64, 0x97, 0x99, 0x5c, 0x6f, + 0x15, 0x63, 0xe3, 0x6b, 0x5c, 0x06, 0xe8, 0x25, + 0xa1, 0x05, 0x6d, 0x15, 0x86, 0xf9, 0xbb, 0x3f, + 0x95, 0xdf, 0x3e, 0x03, 0x68, 0x6e, 0x1c, 0x68, + 0x5c, 0x0b, 0xa8, 0xd6, 0x02, 0x35, 0x35, 0x6b, + 0xbc, 0xca, 0xad, 0x20, 0xcf, 0x6d, 0x2d, 0x98, + 0xd3, 0xec, 0xb7, 0x45, 0xae, 0x31, 0xd7, 0x71, + 0xd5, 0xa8, 0x41, 0x04, 0x9f, 0x26, 0x95, 0x60, + 0xba, 0x1b, 0x3d, 0x61, 0x7e, 0xfb, 0x27, 0xda, + 0x99, 0xaa, 0xe0, 0x1f, 0x26, 0x3d, 0x0c, 0x0e, + 0xd4, 0x1a, 0x3b, 0x0b, 0x59, 0xc9, 0x6d, 0xe1, + 0xda, 0x18, 0xac, 0x64, 0x1c, 0xe5, 0xac, 0xa3, + 0x1b, 0x34, 0xd3, 0x41, 0x1a, 0x90, 0x41, 0xf6, + 0x37, 0x77, 0xbb, 0x4b, 0x75, 0x9d, 0xa9, 0xbb, + 0xba, 0x8a, 0xd5, 0x8e, 0x0c, 0x74, 0xae, 0xc2, + 0x0b, 0x85, 0x40, 0xee, 0x2d, 0xd2, 0xdb, 0xc0, + 0xdc, 0xdd, 0xd6, 0xa1, 0xbf, 0xa8, 0xe7, 0xf9, + 0xbc, 0x15, 0xfc, 0xdc, 0x5a, 0xaa, 0xa6, 0xa1, + 0x87, 0x2d, 0xb1, 0xda, 0x43, 0x68, 0xdb, 0x72, + 0x5d, 0x8a, 0x21, 0x6c, 0xe0, 0xf7, 0x52, 0x3f, + 0x12, 0xae, 0xa8, 0x2e, 0xd3, 0x5a, 0xa0, 0xaf, + 0x5d, 0xdb, 0x3e, 0xd6, 0xe6, 0x5b, 0x77, 0x90, + 0xe7, 0x42, 0xe2, 0xd2, 0x5b, 0x5a, 0x68, 0xd1, + 0xa2, 0xab, 0x55, 0x15, 0x8a, 0xe6, 0xdb, 0x2f, + 0xcc, 0xb3, 0xe3, 0x65, 0x1c, 0x2e, 0x86, 0x41, + 0x2b, 0xdd, 0x71, 0x30, 0x75, 0x71, 0x86, 0x8d, + 0x34, 0x1b, 0x95, 0x2b, 0x10, 0x1c, 0x82, 0xee, + 0xf5, 0xd9, 0x71, 0xb3, 0xe6, 0x5b, 0xe3, 0x31, + 0xb7, 0x0e, 0x79, 0x06, 0xad, 0xdd, 0x20, 0xef, + 0xa0, 0xaf, 0x22, 0xf7, 0x3c, 0x7c, 0xd4, 0xcf, + 0x8a, 0xb8, 0x84, 0x6e, 0x2d, 0xc5, 0xac, 0x10, + 0x0e, 0x8d, 0x4b, 0xc2, 0x0b, 0x85, 0xaf, 0xfa, + 0x6e, 0xd7, 0xb6, 0x3e, 0xb3, 0x97, 0x32, 0xe9, + 0xb5, 0xff, 0x00, 0x4d, 0xda, 0xf6, 0xc7, 0xd6, + 0x72, 0xe6, 0x40, 0x44, 0x44, 0x05, 0xea, 0x2f, + 0xda, 0xb3, 0xce, 0x6f, 0x84, 0x2f, 0x2b, 0xd4, + 0x5f, 0xb5, 0x67, 0x9c, 0xdf, 0x08, 0x41, 0xc9, + 0xb6, 0x5f, 0xcc, 0xe3, 0xfb, 0x11, 0xf5, 0x9c, + 0xa0, 0x54, 0xf6, 0xd9, 0x7f, 0x33, 0x8f, 0xec, + 0x47, 0xd6, 0x72, 0x81, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x5b, 0x4d, 0xad, 0xc8, + 0xb7, 0x17, 0x46, 0x27, 0x0b, 0x73, 0xa0, 0x4b, + 0x4f, 0x16, 0xba, 0xa8, 0xb3, 0x65, 0x6b, 0x2d, + 0xe5, 0xcc, 0x76, 0xd1, 0x0f, 0x1e, 0x43, 0x4e, + 0xd0, 0xfc, 0xe3, 0xdc, 0x0a, 0xcb, 0x9c, 0x49, + 0x6c, 0xec, 0x82, 0x48, 0x6d, 0x47, 0xea, 0xad, + 0xa7, 0x6c, 0x00, 0xef, 0x96, 0x0f, 0x18, 0xf7, + 0xd0, 0x55, 0x11, 0x76, 0xf5, 0x5c, 0x8e, 0xcb, + 0x4e, 0x65, 0x1b, 0xda, 0xf8, 0xda, 0xe0, 0xd9, + 0x18, 0x2b, 0x89, 0xb5, 0xd1, 0xa5, 0x63, 0xab, + 0x25, 0x19, 0x69, 0xcc, 0x5f, 0x23, 0x59, 0x11, + 0x71, 0x6c, 0x6c, 0x35, 0xc4, 0xf2, 0x0d, 0x34, + 0x20, 0xe3, 0x5d, 0x16, 0x79, 0x7d, 0xed, 0xf3, + 0xa9, 0x6b, 0x13, 0xa4, 0xa6, 0xb2, 0x34, 0x01, + 0xdb, 0x2b, 0x9c, 0x92, 0x01, 0xa6, 0xb1, 0xa7, + 0xba, 0x15, 0x87, 0x36, 0x95, 0xf9, 0x66, 0x55, + 0x63, 0x65, 0x6c, 0x4c, 0x7c, 0xf3, 0x79, 0xd9, + 0x9e, 0xdd, 0x04, 0xe8, 0xae, 0xbe, 0xea, 0x08, + 0x7b, 0xcc, 0xb6, 0xfa, 0xc4, 0x8f, 0x6a, 0x85, + 0xd1, 0x87, 0x68, 0x0e, 0xd6, 0xda, 0xf6, 0xc2, + 0xd7, 0x6d, 0x6b, 0x71, 0x75, 0x27, 0x35, 0x6f, + 0x19, 0x95, 0xfb, 0xa1, 0xba, 0x69, 0xdb, 0x53, + 0x79, 0x24, 0xb2, 0xe6, 0x36, 0x37, 0xb9, 0x75, + 0xc3, 0x8c, 0xa1, 0xb1, 0xf3, 0x91, 0x17, 0x1a, + 0x90, 0xee, 0xc1, 0x2b, 0x39, 0x57, 0x39, 0x0e, + 0xcd, 0xde, 0x4f, 0x6b, 0xa2, 0xe0, 0xba, 0x8e, + 0x70, 0xf2, 0x83, 0x68, 0xdd, 0x45, 0x04, 0x65, + 0xce, 0x49, 0x9a, 0x5a, 0xc4, 0x65, 0x9a, 0xdd, + 0xc2, 0x36, 0x8a, 0x92, 0x28, 0xea, 0x70, 0x2e, + 0x58, 0x60, 0x9a, 0xe2, 0x41, 0x14, 0x0c, 0x32, + 0x48, 0xed, 0x4d, 0x6e, 0x93, 0x4d, 0xf5, 0x23, + 0x93, 0x67, 0x6f, 0xb2, 0xba, 0x73, 0xae, 0x5d, + 0x24, 0xd6, 0xf2, 0x34, 0x87, 0x32, 0xb8, 0xfc, + 0x62, 0x74, 0x6b, 0x5d, 0xbb, 0x3d, 0x46, 0x58, + 0xe6, 0x57, 0x16, 0x8d, 0xfd, 0x7b, 0x74, 0x42, + 0xda, 0x55, 0xc1, 0xb4, 0x41, 0x1b, 0x3e, 0x43, + 0x9b, 0x41, 0x19, 0x92, 0x4b, 0x73, 0x84, 0x69, + 0x25, 0xa4, 0x3a, 0x9d, 0xc0, 0xb9, 0x2d, 0xad, + 0x2e, 0x6e, 0xdc, 0x59, 0x6d, 0x1b, 0xa5, 0x73, + 0x45, 0x5c, 0x1b, 0xb8, 0x17, 0x66, 0x57, 0x9c, + 0x5c, 0x59, 0xdf, 0x36, 0x69, 0xa4, 0x92, 0x58, + 0xf4, 0x89, 0x59, 0x5a, 0x93, 0x51, 0xbc, 0x7b, + 0x2a, 0x47, 0x66, 0xe4, 0x8a, 0x5c, 0xda, 0xfa, + 0x48, 0x5b, 0x86, 0x27, 0xc6, 0xe2, 0xc6, 0x9d, + 0x60, 0x17, 0x57, 0x48, 0x41, 0x5d, 0xaf, 0xff, + 0x00, 0x0b, 0xa2, 0x5b, 0x0b, 0xb8, 0x9f, 0x14, + 0x6e, 0x8c, 0x99, 0x27, 0x68, 0x7c, 0x4c, 0x6e, + 0x97, 0x16, 0x9e, 0xc2, 0xc5, 0x8d, 0xbb, 0xae, + 0xaf, 0x20, 0xb7, 0x03, 0x44, 0xaf, 0x0d, 0x3d, + 0xaa, 0xf8, 0xdc, 0x01, 0x59, 0x72, 0xd9, 0x59, + 0x75, 0x9f, 0x5f, 0xca, 0xc0, 0x0b, 0xad, 0xa3, + 0x11, 0x5b, 0x57, 0x4d, 0x03, 0x7c, 0x53, 0xdf, + 0x08, 0x21, 0x1d, 0xb3, 0xd9, 0xc3, 0x63, 0xe7, + 0x0d, 0xb3, 0xa9, 0xa7, 0x40, 0x20, 0xbb, 0x47, + 0x61, 0x71, 0xc1, 0x6d, 0x71, 0x71, 0x2f, 0x33, + 0x04, 0x6e, 0x92, 0x4d, 0x3e, 0x28, 0xd7, 0xa3, + 0x5a, 0xe9, 0xb5, 0xcd, 0x6f, 0xad, 0xef, 0xd9, + 0x71, 0x34, 0x92, 0x12, 0xd7, 0x8e, 0x79, 0x84, + 0x9a, 0x11, 0x5f, 0x18, 0x29, 0x3c, 0xaa, 0xea, + 0x0b, 0xcd, 0xa8, 0xf6, 0x9b, 0x76, 0x96, 0x32, + 0x46, 0xb8, 0xe1, 0x76, 0xb0, 0x70, 0xd0, 0xea, + 0xdf, 0x41, 0x18, 0xec, 0x8f, 0x38, 0x68, 0xa9, + 0xb4, 0x92, 0x83, 0x78, 0x03, 0xe0, 0x2b, 0x96, + 0x1b, 0x6b, 0x89, 0xe6, 0xe6, 0x21, 0x8d, 0xcf, + 0x9b, 0x4f, 0xea, 0xc6, 0xbd, 0x1a, 0x77, 0x57, + 0x74, 0xf9, 0xbe, 0x67, 0x06, 0x61, 0x33, 0xa3, + 0xb9, 0x93, 0x0b, 0x25, 0x7d, 0x18, 0x5c, 0x70, + 0xd0, 0x38, 0xe8, 0xc2, 0xa7, 0xe6, 0x86, 0x36, + 0x6d, 0x4d, 0x9c, 0xad, 0x68, 0x6b, 0xa6, 0x85, + 0xce, 0x78, 0xec, 0x81, 0x44, 0x14, 0xf7, 0xb1, + 0xcc, 0x7b, 0x98, 0xf1, 0x85, 0xed, 0x25, 0xae, + 0x1b, 0xc4, 0x1a, 0x10, 0x56, 0x17, 0x46, 0x61, + 0xef, 0xf7, 0x3f, 0x6d, 0x26, 0x9f, 0xed, 0x15, + 0xce, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x0a, 0x53, + 0x66, 0xbf, 0x9d, 0xdb, 0x7f, 0x6b, 0xea, 0x15, + 0x16, 0xa5, 0x36, 0x6b, 0xf9, 0xdd, 0xb7, 0xf6, + 0xbe, 0xa1, 0x41, 0x37, 0x98, 0x7b, 0xec, 0xde, + 0x77, 0xc8, 0x17, 0x3a, 0xe8, 0xcc, 0x3d, 0xf6, + 0x6f, 0x3b, 0xe4, 0x0b, 0x9d, 0x01, 0x61, 0x65, + 0x61, 0x06, 0x76, 0xcb, 0xf6, 0x36, 0x1d, 0xa7, + 0xf8, 0x18, 0xab, 0x0a, 0xcf, 0xb6, 0x5f, 0xb1, + 0xb0, 0xed, 0x3f, 0xc0, 0xc5, 0x58, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x01, 0xac, 0x76, 0xd4, 0xe6, + 0xd6, 0x7b, 0xed, 0xb1, 0xde, 0xb7, 0x6d, 0x3b, + 0xa5, 0xca, 0x0c, 0x6b, 0x0a, 0x7b, 0x6a, 0xe3, + 0x91, 0xd7, 0x36, 0xaf, 0x63, 0x4b, 0x9a, 0xeb, + 0x76, 0x81, 0x40, 0x4e, 0x9a, 0xbb, 0x46, 0x8e, + 0xda, 0x0c, 0xe6, 0x63, 0xfc, 0xb7, 0x23, 0xdd, + 0x14, 0x15, 0xae, 0xef, 0xec, 0xd6, 0xfd, 0xa2, + 0xce, 0x2e, 0xec, 0xf3, 0x1e, 0x66, 0xcd, 0xc2, + 0x3c, 0x21, 0xaf, 0x90, 0xd0, 0x55, 0xee, 0xa7, + 0xe7, 0x1d, 0xea, 0x51, 0x6a, 0xce, 0x62, 0x92, + 0x1b, 0x2c, 0x9a, 0x27, 0x8c, 0x32, 0x46, 0x00, + 0x70, 0xde, 0xa1, 0x8d, 0x6b, 0xda, 0xcb, 0x59, + 0x86, 0x69, 0xce, 0x86, 0x39, 0xcc, 0x99, 0xad, + 0x0d, 0x20, 0x13, 0xe3, 0x01, 0x4a, 0x77, 0x90, + 0x63, 0x69, 0x18, 0xc9, 0x62, 0xb2, 0xcc, 0x5a, + 0xd0, 0xd7, 0x5d, 0x47, 0x59, 0x29, 0xa2, 0xa4, + 0x00, 0xea, 0xf7, 0xd4, 0x5d, 0x95, 0xdd, 0xc5, + 0x9d, 0xc3, 0x65, 0xb7, 0x77, 0x36, 0xf3, 0xe2, + 0x93, 0x40, 0x74, 0x1a, 0x54, 0x69, 0x52, 0x9b, + 0x43, 0xfa, 0xab, 0x2c, 0xb2, 0xc1, 0xff, 0x00, + 0xb4, 0x8a, 0x2a, 0xbd, 0xbd, 0x9a, 0x00, 0xa1, + 0x58, 0x6b, 0x23, 0x7c, 0xe1, 0xe1, 0x08, 0x2c, + 0xbb, 0x43, 0x71, 0x75, 0x36, 0x61, 0x06, 0x58, + 0x24, 0xa5, 0xb5, 0xc3, 0x63, 0xc6, 0xca, 0x0d, + 0x24, 0xbb, 0x7d, 0x69, 0xce, 0xb3, 0x7b, 0xcb, + 0x0b, 0xf1, 0x69, 0x64, 0xfe, 0x66, 0x0b, 0x56, + 0xb0, 0x06, 0x01, 0xa0, 0xe8, 0xa9, 0xaf, 0x71, + 0x7a, 0xcf, 0x1c, 0xe8, 0x33, 0xeb, 0x3b, 0x97, + 0x34, 0xf3, 0x6d, 0x6c, 0x55, 0x7d, 0x34, 0x79, + 0x54, 0xd6, 0xb8, 0xf6, 0x9a, 0xde, 0x41, 0x9c, + 0x49, 0x85, 0xa5, 0xc2, 0xe0, 0x35, 0xd1, 0xd3, + 0x4d, 0x74, 0x06, 0xe8, 0x41, 0xef, 0x69, 0xa0, + 0x88, 0x4b, 0x6d, 0x7b, 0x1b, 0x43, 0x3d, 0xae, + 0x3c, 0x4e, 0x03, 0x40, 0xa8, 0xa1, 0x27, 0xbe, + 0xa2, 0x20, 0x9e, 0x5b, 0x79, 0x5b, 0x34, 0x2e, + 0x2c, 0x91, 0xbe, 0x4b, 0x86, 0xb0, 0x54, 0xd6, + 0xd4, 0x10, 0xc6, 0xd8, 0x5a, 0x13, 0xe3, 0xc1, + 0x0f, 0x8e, 0xdd, 0xe2, 0x70, 0x8f, 0xee, 0xa8, + 0x7b, 0x5b, 0x77, 0xdd, 0x5c, 0xc5, 0x6e, 0xcf, + 0x2e, 0x57, 0x06, 0x8e, 0xee, 0xb3, 0xdc, 0x08, + 0x3a, 0x6c, 0x6c, 0x6e, 0xf3, 0x6b, 0xc2, 0x74, + 0xb8, 0x17, 0x62, 0xb8, 0x99, 0xda, 0x80, 0xfc, + 0xea, 0x9d, 0xf5, 0xbf, 0x68, 0xef, 0xa2, 0xba, + 0xbd, 0x11, 0xc0, 0x71, 0x45, 0x6e, 0xc1, 0x10, + 0x76, 0xf9, 0x1a, 0xc8, 0x5d, 0x79, 0xac, 0xd7, + 0x36, 0xb1, 0x9c, 0xa7, 0x2d, 0x82, 0x56, 0x41, + 0x1d, 0x04, 0xd3, 0x31, 0x8e, 0x26, 0x43, 0x4d, + 0x3a, 0x40, 0x50, 0x32, 0x45, 0x2c, 0x54, 0x12, + 0x46, 0xe8, 0xc9, 0x15, 0x01, 0xcd, 0x2d, 0xd0, + 0x3b, 0x68, 0x3a, 0xb2, 0x7a, 0x75, 0xb5, 0x9d, + 0x35, 0x73, 0xc1, 0x58, 0x6f, 0x47, 0xb5, 0x33, + 0x39, 0xb3, 0xfc, 0xe8, 0x9c, 0xd9, 0xe3, 0x1d, + 0x90, 0xd1, 0x5f, 0xaa, 0xab, 0xd9, 0x3d, 0x3a, + 0xda, 0xd3, 0x4e, 0xa9, 0x42, 0x9b, 0x8a, 0x76, + 0xc7, 0xb5, 0xb7, 0x11, 0xbf, 0xc8, 0xb9, 0xac, + 0x4e, 0x1b, 0xf5, 0x63, 0x48, 0xfa, 0xa8, 0x39, + 0xec, 0x4f, 0xb3, 0x6c, 0xf8, 0x97, 0x54, 0x97, + 0xd7, 0x2c, 0x68, 0x3f, 0xd5, 0x6b, 0x87, 0xf4, + 0xad, 0xb9, 0xcd, 0xf1, 0xcb, 0xb6, 0x95, 0xb7, + 0x41, 0xb8, 0x9a, 0xd6, 0x34, 0x3c, 0x6f, 0x82, + 0x08, 0x75, 0x16, 0xbc, 0xf1, 0xad, 0xb5, 0x93, + 0x2c, 0xcb, 0x23, 0x3a, 0x2d, 0xcb, 0x4b, 0xbc, + 0xe7, 0x38, 0x69, 0x5d, 0x37, 0xd6, 0xd6, 0x77, + 0x9b, 0x52, 0x20, 0xbb, 0x18, 0xa3, 0x7c, 0x23, + 0x08, 0xad, 0x3c, 0x7d, 0x60, 0x20, 0xe7, 0x9f, + 0x2b, 0xcb, 0x73, 0x79, 0x5d, 0x71, 0x97, 0x5d, + 0xb5, 0x92, 0xc9, 0x57, 0x18, 0x24, 0xd0, 0x71, + 0x78, 0x57, 0x0d, 0xb5, 0x9d, 0xcd, 0x96, 0x75, + 0x6b, 0x05, 0xcb, 0x4b, 0x5e, 0x24, 0x69, 0x1a, + 0x6a, 0x08, 0xaf, 0xe6, 0x95, 0xc7, 0x3d, 0x95, + 0xcc, 0x17, 0x8e, 0xb6, 0x11, 0xbc, 0x4a, 0xd7, + 0xe1, 0x61, 0x68, 0x35, 0x3a, 0xe8, 0x41, 0x0a, + 0xc7, 0x99, 0xb9, 0xde, 0xdd, 0x93, 0x47, 0x35, + 0x3d, 0xa9, 0x98, 0x79, 0xda, 0x6b, 0xd3, 0x87, + 0xe5, 0x08, 0x35, 0xe6, 0xf9, 0x0d, 0xcd, 0xd6, + 0x69, 0x34, 0xed, 0x9a, 0x28, 0xa3, 0x79, 0x6e, + 0x97, 0x3a, 0x8e, 0x00, 0x35, 0xa0, 0xe8, 0x5a, + 0x73, 0x3c, 0xd6, 0x1b, 0x49, 0x72, 0xfb, 0x7b, + 0x37, 0x73, 0xe3, 0x2f, 0x21, 0xcf, 0x73, 0x69, + 0x47, 0x1a, 0x60, 0x21, 0x71, 0x6d, 0x25, 0x7a, + 0xea, 0xe7, 0x70, 0x12, 0xdd, 0x5e, 0x68, 0x5c, + 0xf9, 0x54, 0x36, 0xd7, 0x19, 0x84, 0x16, 0xf7, + 0x23, 0xf5, 0x32, 0x3a, 0x84, 0x56, 0x9b, 0x86, + 0x9a, 0xbb, 0x28, 0x26, 0x2e, 0x6d, 0x32, 0x9c, + 0xf2, 0x63, 0x73, 0x67, 0x74, 0x20, 0xba, 0x93, + 0x4b, 0xe1, 0x93, 0x45, 0x4d, 0x29, 0xdb, 0x50, + 0xd9, 0x86, 0x5d, 0x77, 0x97, 0x4c, 0x21, 0xb9, + 0x1b, 0xf8, 0x1c, 0x0f, 0x8a, 0x46, 0xfb, 0x57, + 0xbc, 0xca, 0xc2, 0x4b, 0x4c, 0xc2, 0x58, 0x1b, + 0x1b, 0xb0, 0x87, 0x9e, 0x63, 0x41, 0x3a, 0x2b, + 0xe2, 0xd3, 0x7d, 0x4a, 0x67, 0xb8, 0xdb, 0x92, + 0x65, 0xd0, 0xdc, 0x9f, 0xfb, 0x9d, 0x64, 0x1f, + 0x28, 0x36, 0x94, 0xff, 0x00, 0xe5, 0x05, 0x79, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x05, 0xe7, + 0x37, 0xf2, 0x2d, 0xfc, 0xd3, 0xe0, 0x51, 0xa5, + 0x49, 0x66, 0xfe, 0x45, 0xbf, 0x9a, 0x7c, 0x0a, + 0x34, 0xa0, 0xf7, 0x17, 0xed, 0x19, 0xe7, 0x05, + 0x2a, 0xa2, 0xa2, 0xfd, 0xa3, 0x3c, 0xe0, 0xa5, + 0x50, 0x60, 0xae, 0x0c, 0xc7, 0xde, 0x6d, 0x3e, + 0xd3, 0xe5, 0x0b, 0xbc, 0xae, 0x0c, 0xc7, 0xde, + 0x6d, 0x3e, 0xd3, 0xe5, 0x08, 0x19, 0x77, 0xbc, + 0xdd, 0xf9, 0xe7, 0xeb, 0x15, 0x20, 0xa3, 0xb2, + 0xe3, 0xff, 0x00, 0x73, 0x77, 0xe7, 0x9f, 0xac, + 0x54, 0x85, 0x50, 0x0e, 0xa3, 0xda, 0x51, 0x07, + 0x59, 0x52, 0xc4, 0xe8, 0x2a, 0x24, 0xeb, 0x28, + 0x08, 0x88, 0x83, 0xb2, 0x87, 0xa8, 0x6f, 0x7c, + 0xd7, 0x78, 0x15, 0x31, 0x5d, 0xf2, 0xe0, 0xc9, + 0xed, 0xae, 0x2c, 0x9c, 0x69, 0xce, 0xb4, 0xd3, + 0xfb, 0x42, 0x8a, 0x99, 0x34, 0x12, 0x5b, 0xcc, + 0xf8, 0x25, 0x04, 0x49, 0x11, 0x2d, 0x78, 0xec, + 0xee, 0x53, 0xb6, 0x83, 0x5f, 0x69, 0x4f, 0x5f, + 0x7e, 0xb7, 0x65, 0x6c, 0x64, 0x6e, 0x91, 0x13, + 0xf0, 0x3b, 0xe9, 0x28, 0x15, 0x27, 0x95, 0xe6, + 0xd0, 0xdb, 0xc1, 0x2d, 0x95, 0xe4, 0x46, 0x7b, + 0x29, 0x4d, 0x70, 0x8d, 0x6d, 0x23, 0x79, 0x06, + 0xfd, 0x9b, 0xb3, 0xba, 0x6e, 0x69, 0x6d, 0x70, + 0xe8, 0x9c, 0xd8, 0x5c, 0xd7, 0xb9, 0x8f, 0x22, + 0x80, 0x80, 0x30, 0x9f, 0xac, 0xba, 0xb2, 0xa7, + 0x89, 0x6e, 0x33, 0xd7, 0xb7, 0x48, 0x73, 0x1f, + 0x4e, 0x19, 0x17, 0xbb, 0x4d, 0xa1, 0xca, 0x6d, + 0x22, 0x6d, 0xac, 0x0d, 0x9c, 0xdb, 0xb8, 0x90, + 0xe9, 0x1e, 0x41, 0x2c, 0x04, 0x6e, 0x05, 0x19, + 0x95, 0xe6, 0x76, 0xf9, 0x6d, 0xe4, 0xf4, 0x6b, + 0xa6, 0xb3, 0x98, 0x16, 0x13, 0xa3, 0x11, 0x68, + 0xd4, 0x7b, 0xe8, 0x36, 0x6c, 0x9d, 0x7a, 0xd8, + 0x11, 0xab, 0x9a, 0x79, 0x27, 0x7b, 0x40, 0x59, + 0xb3, 0xcb, 0xad, 0x1d, 0x05, 0xe6, 0x65, 0x7d, + 0x8d, 0xd6, 0xf0, 0x48, 0x43, 0x63, 0x8f, 0x41, + 0x79, 0x2e, 0xa6, 0xb1, 0xa7, 0x59, 0x5b, 0x6d, + 0x73, 0x9c, 0x97, 0x2e, 0xb9, 0xe7, 0x2c, 0xad, + 0x64, 0x70, 0x78, 0x3c, 0xe3, 0xdc, 0x46, 0x20, + 0x0e, 0xe3, 0x45, 0x75, 0x55, 0x73, 0xe5, 0xf9, + 0xb5, 0xa4, 0x70, 0x5c, 0xd9, 0x5e, 0x46, 0xe7, + 0xda, 0xdd, 0x3c, 0xbf, 0xc4, 0x3e, 0x33, 0x49, + 0x35, 0x41, 0x23, 0x97, 0x5e, 0xc1, 0x71, 0x61, + 0x99, 0xb2, 0xde, 0xd5, 0xb6, 0xb1, 0x47, 0x03, + 0x88, 0x02, 0xa5, 0xce, 0x25, 0xaf, 0xd2, 0xe7, + 0x1d, 0x6b, 0x96, 0xe7, 0x4e, 0xc9, 0x5b, 0x16, + 0x8d, 0x02, 0x72, 0x1c, 0x3b, 0x34, 0x7e, 0x94, + 0xb4, 0xce, 0x72, 0xab, 0x46, 0xcd, 0x69, 0x0d, + 0xbc, 0x9e, 0xc9, 0x33, 0x0b, 0x5f, 0x21, 0x23, + 0x9d, 0x71, 0x3a, 0x34, 0xee, 0x6a, 0x5c, 0xf9, + 0x7e, 0x67, 0x67, 0x0d, 0xb4, 0xd9, 0x75, 0xe4, + 0x4e, 0x96, 0xc6, 0x47, 0x17, 0x47, 0x4d, 0x2e, + 0x6e, 0xf2, 0x0d, 0xd9, 0x2d, 0x7a, 0x9b, 0x35, + 0x3f, 0x9b, 0x80, 0x0e, 0xed, 0x2a, 0x97, 0x3f, + 0xe9, 0x3b, 0x53, 0xba, 0x27, 0x27, 0xeb, 0x21, + 0xce, 0xb2, 0xd8, 0x2c, 0x2e, 0x6c, 0x2d, 0x2d, + 0xde, 0xd8, 0xa5, 0x6d, 0x19, 0x23, 0x88, 0xa9, + 0x71, 0xd6, 0x5d, 0xa5, 0x72, 0x4d, 0x99, 0x44, + 0xfc, 0x96, 0x2c, 0xbd, 0xac, 0x76, 0x38, 0xa4, + 0x2f, 0x2f, 0xd1, 0x84, 0xeb, 0xec, 0xf6, 0x50, + 0x6d, 0xca, 0x72, 0xdb, 0x49, 0x6d, 0x2e, 0x73, + 0x0b, 0xe2, 0xe3, 0x6d, 0x6c, 0x40, 0x31, 0xb0, + 0xf8, 0xce, 0x71, 0xa6, 0xef, 0x75, 0x49, 0xe5, + 0x37, 0x96, 0xf3, 0xdb, 0xe6, 0x11, 0x5b, 0xda, + 0xb6, 0xd6, 0x26, 0x41, 0x5d, 0x78, 0x9e, 0xe2, + 0x43, 0xbc, 0xb7, 0x1e, 0xd2, 0x8b, 0xca, 0x33, + 0x5b, 0x7b, 0x6b, 0x79, 0xec, 0xaf, 0x63, 0x74, + 0x96, 0xb7, 0x1a, 0x49, 0x65, 0x2a, 0xd3, 0x4e, + 0xca, 0xe9, 0xb3, 0xce, 0x72, 0x9b, 0x21, 0x25, + 0xbd, 0xbd, 0xbc, 0x86, 0xd6, 0x66, 0x10, 0xf7, + 0x92, 0x0c, 0xae, 0x27, 0x47, 0x6a, 0x9a, 0x50, + 0x63, 0x67, 0xf4, 0xe5, 0xb9, 0xb5, 0x37, 0x60, + 0x02, 0xbf, 0xd9, 0x7a, 0xc6, 0x47, 0x5e, 0xa7, + 0xcd, 0x85, 0x3f, 0xe1, 0xfc, 0x85, 0x68, 0xca, + 0xb3, 0x3b, 0x4b, 0x19, 0x2e, 0xa1, 0x92, 0x27, + 0x49, 0x6b, 0x74, 0x0b, 0x03, 0x6a, 0x31, 0x86, + 0xe9, 0xf2, 0xbb, 0x85, 0x6d, 0xb1, 0xcd, 0xb2, + 0xeb, 0x4b, 0x9b, 0x96, 0x32, 0x07, 0x9c, 0xbe, + 0xe9, 0xa1, 0xa6, 0x37, 0x69, 0x70, 0xa0, 0x3d, + 0x9d, 0xda, 0xa0, 0xf5, 0xb2, 0x3e, 0xff, 0x00, + 0x3f, 0xd8, 0x3f, 0xc2, 0xd4, 0xcb, 0x7f, 0xd3, + 0x19, 0x8d, 0x3d, 0x60, 0xef, 0x86, 0x05, 0xee, + 0xd7, 0x3a, 0xc9, 0xf2, 0xf9, 0x1c, 0x2c, 0xad, + 0xa4, 0x73, 0x1e, 0xd2, 0x1d, 0x23, 0x88, 0xc5, + 0x5d, 0xc0, 0x05, 0x74, 0x00, 0xb8, 0x6d, 0x73, + 0x28, 0xa1, 0xca, 0x2e, 0xac, 0x0b, 0x5c, 0x5f, + 0x72, 0xf0, 0x5a, 0xf1, 0x4a, 0x0a, 0x61, 0xd7, + 0xa7, 0xb0, 0x83, 0xbb, 0x64, 0x1c, 0xd1, 0x77, + 0x73, 0xa2, 0xa7, 0x99, 0x24, 0x57, 0x74, 0x02, + 0x02, 0xc5, 0x8e, 0x73, 0x11, 0xb9, 0x67, 0xb1, + 0xe5, 0x11, 0xfb, 0x4e, 0x90, 0xcc, 0x0e, 0x35, + 0xd5, 0xa7, 0xf3, 0x54, 0x6e, 0x57, 0x98, 0xbf, + 0x2f, 0xbc, 0x6d, 0xc3, 0x46, 0x20, 0x2a, 0x1c, + 0xcf, 0x9c, 0xd3, 0xac, 0x29, 0x18, 0xf3, 0x4c, + 0x96, 0xd2, 0x57, 0xde, 0xd8, 0xdb, 0xca, 0x6e, + 0xde, 0x0e, 0x10, 0xf2, 0x30, 0x30, 0xbb, 0x41, + 0x21, 0x04, 0x55, 0xf4, 0xaf, 0x9a, 0xf2, 0x79, + 0x64, 0x67, 0x34, 0xf7, 0xbc, 0x97, 0x47, 0xf3, + 0x4e, 0xe8, 0x52, 0xfb, 0x30, 0xe7, 0x32, 0x0c, + 0xc9, 0xcd, 0x38, 0x5c, 0xd8, 0x9a, 0x5a, 0x46, + 0xb0, 0x46, 0x3d, 0x2a, 0x0e, 0x47, 0x39, 0xef, + 0x74, 0x8f, 0x35, 0x7b, 0xce, 0x27, 0x1d, 0xf2, + 0x75, 0xa9, 0x2c, 0x93, 0x35, 0xb6, 0xcb, 0xc5, + 0xcb, 0x6e, 0x22, 0x7c, 0xcc, 0xb8, 0x6b, 0x5b, + 0x46, 0x10, 0x34, 0x0c, 0x55, 0xad, 0x48, 0xdf, + 0x41, 0xcc, 0x33, 0x5c, 0xd2, 0x82, 0xb7, 0x73, + 0x1e, 0xd3, 0xdd, 0xc7, 0xa9, 0x48, 0xe5, 0x24, + 0x9d, 0x9f, 0xcd, 0x09, 0xf2, 0x8d, 0x09, 0x3b, + 0xe4, 0x80, 0xbc, 0xfb, 0x7e, 0xcb, 0x01, 0x4e, + 0xad, 0x94, 0x76, 0x31, 0xff, 0x00, 0xfd, 0xc5, + 0xa6, 0x2c, 0xd6, 0xd6, 0x1b, 0x3b, 0xfb, 0x48, + 0xe2, 0x73, 0x5b, 0x76, 0xef, 0xd5, 0x69, 0x07, + 0x08, 0x1b, 0x87, 0x49, 0x41, 0xd3, 0xb2, 0x9f, + 0xb6, 0xbc, 0xff, 0x00, 0xc7, 0x75, 0x7b, 0x94, + 0x58, 0x1f, 0xe8, 0xe8, 0xb0, 0xfe, 0x6c, 0xfe, + 0x37, 0x6b, 0x11, 0x5c, 0x79, 0x36, 0x67, 0x1e, + 0x5e, 0xf9, 0xdc, 0xf6, 0x39, 0xfc, 0xf4, 0x66, + 0x30, 0x1b, 0x4a, 0x82, 0x77, 0x4e, 0x95, 0xef, + 0x2b, 0xcc, 0xed, 0xed, 0xed, 0x66, 0xb0, 0xbd, + 0x8c, 0xcd, 0x67, 0x31, 0xaf, 0x8b, 0xe5, 0x34, + 0xe8, 0xe2, 0x41, 0xc3, 0x1d, 0x9d, 0xcc, 0xd6, + 0xd3, 0x4f, 0x1b, 0x31, 0x43, 0x0e, 0x99, 0x5e, + 0x0d, 0x28, 0x14, 0xce, 0xd4, 0xd4, 0x8b, 0x07, + 0x0d, 0x2d, 0x36, 0xe3, 0xbd, 0x86, 0xbe, 0x15, + 0xcd, 0x77, 0x99, 0xd8, 0xc7, 0x60, 0xec, 0xbf, + 0x2d, 0x89, 0xed, 0x86, 0x47, 0x07, 0x4d, 0x2c, + 0xb4, 0xc4, 0xea, 0x6e, 0x68, 0x5e, 0xa2, 0xcc, + 0xf2, 0xfb, 0xab, 0x08, 0xac, 0xb3, 0x68, 0xe4, + 0x79, 0xb7, 0xd1, 0x14, 0xf1, 0x11, 0x5a, 0x1d, + 0xc3, 0x54, 0x1d, 0x30, 0x96, 0x8d, 0x97, 0xb7, + 0xc7, 0xf9, 0xd7, 0x4d, 0xa6, 0xf7, 0x97, 0x55, + 0xa3, 0x6b, 0x07, 0xf9, 0xbb, 0x89, 0xd4, 0x63, + 0x61, 0x07, 0xb1, 0xa9, 0x68, 0xcd, 0x33, 0x58, + 0xae, 0xa2, 0x86, 0xce, 0xce, 0x33, 0x0d, 0x9d, + 0xbe, 0x96, 0xe2, 0x3a, 0x4b, 0xb7, 0xd7, 0x53, + 0xf3, 0x6c, 0xa6, 0xfa, 0x18, 0x4e, 0x67, 0x6e, + 0xf3, 0x71, 0x03, 0x70, 0x82, 0xc2, 0x00, 0x78, + 0x1f, 0x3a, 0xa8, 0x37, 0xdc, 0x8a, 0x5a, 0x6c, + 0xff, 0x00, 0x39, 0xa3, 0x48, 0xad, 0x7f, 0xb0, + 0xbd, 0x67, 0xb9, 0x9d, 0x9d, 0xbe, 0x67, 0x2c, + 0x53, 0x65, 0xf1, 0xdc, 0x48, 0xd0, 0xda, 0xc8, + 0xf7, 0x10, 0x4d, 0x5b, 0xbd, 0x87, 0x79, 0x47, + 0xe6, 0xd9, 0xcc, 0x79, 0x84, 0x16, 0xac, 0x8a, + 0x27, 0x40, 0xfb, 0x6a, 0xd7, 0x55, 0x06, 0xaa, + 0x61, 0xa5, 0x7e, 0x6a, 0xdf, 0x36, 0x6b, 0x93, + 0x5f, 0xf3, 0x73, 0xe6, 0x36, 0xf2, 0x0b, 0xa6, + 0x34, 0x07, 0x73, 0x64, 0x60, 0x7d, 0x37, 0x0d, + 0x74, 0xa0, 0xdf, 0xed, 0x77, 0x57, 0x59, 0xd6, + 0x5a, 0x6e, 0x2d, 0x7d, 0x97, 0x0d, 0x39, 0xb6, + 0xd6, 0xb5, 0x65, 0x4e, 0x9d, 0x41, 0x44, 0x67, + 0x44, 0xf5, 0xbd, 0xe6, 0x9f, 0xf8, 0xce, 0xf0, + 0xff, 0x00, 0x42, 0xe8, 0x93, 0x3b, 0x33, 0x67, + 0x10, 0xe6, 0x12, 0x46, 0xe1, 0x14, 0x04, 0x36, + 0x38, 0x9b, 0xac, 0x34, 0x57, 0x7f, 0x42, 0xe2, + 0xbf, 0xb8, 0x6d, 0xd5, 0xec, 0xf7, 0x2c, 0x05, + 0xad, 0x95, 0xee, 0x78, 0x69, 0xd6, 0x06, 0xe5, + 0x50, 0x73, 0xbb, 0xc9, 0x3d, 0xa5, 0x67, 0xcf, + 0x3d, 0xff, 0x00, 0x29, 0xf3, 0x19, 0xf5, 0x9a, + 0xab, 0x24, 0x54, 0x10, 0xa5, 0x73, 0x0c, 0xea, + 0x0b, 0xbb, 0x8b, 0x29, 0xd9, 0x1b, 0xda, 0x2d, + 0x1a, 0xd0, 0xe0, 0xea, 0x55, 0xd8, 0x48, 0x3e, + 0x2e, 0x9e, 0xc2, 0x0c, 0x6d, 0x47, 0xf3, 0xab, + 0x8e, 0xd3, 0x3e, 0xa8, 0x52, 0xb9, 0x8f, 0xfa, + 0x83, 0x29, 0xfb, 0x38, 0xcf, 0x7d, 0xca, 0x0b, + 0x37, 0xbd, 0x66, 0x61, 0x7f, 0x2d, 0xd4, 0x60, + 0xb1, 0xb2, 0x61, 0x01, 0xae, 0xa5, 0x74, 0x0a, + 0x6f, 0xa9, 0x11, 0x99, 0x45, 0x98, 0xe7, 0x99, + 0x6b, 0xe3, 0x63, 0x98, 0x21, 0x2c, 0x88, 0x87, + 0x53, 0x49, 0x15, 0x35, 0x14, 0x3a, 0xb4, 0xa0, + 0xe0, 0xcf, 0x5a, 0xf1, 0x9b, 0x5d, 0x87, 0x0d, + 0x26, 0x5f, 0x17, 0x80, 0xd1, 0x58, 0x2e, 0x88, + 0xf8, 0x8f, 0x2c, 0x6f, 0xe7, 0x36, 0x1d, 0x3d, + 0xf5, 0xcb, 0x98, 0xde, 0xe4, 0xbd, 0x69, 0x2b, + 0xef, 0xad, 0x9e, 0xeb, 0x8b, 0x77, 0xe1, 0x6b, + 0x98, 0x7c, 0x57, 0x86, 0xea, 0xc4, 0x14, 0x5b, + 0xf3, 0x99, 0x9f, 0x9b, 0xb7, 0x34, 0x2d, 0xf2, + 0x1c, 0x28, 0xca, 0xfe, 0x60, 0xd0, 0x07, 0x02, + 0x05, 0xc5, 0x7e, 0x20, 0x7e, 0x8d, 0x3e, 0xd5, + 0xab, 0xfb, 0x74, 0x52, 0x97, 0x7f, 0xeb, 0x38, + 0xfc, 0xf8, 0xff, 0x00, 0xe9, 0xad, 0x13, 0x66, + 0xf9, 0x18, 0xba, 0x19, 0x84, 0x36, 0xb2, 0x3a, + 0xed, 0xee, 0xc6, 0x5a, 0xf2, 0x03, 0x03, 0xab, + 0xa4, 0xf6, 0xd7, 0x2d, 0xce, 0x70, 0xc9, 0x73, + 0xc6, 0xe6, 0x91, 0x46, 0x70, 0xb5, 0xec, 0x3c, + 0xdb, 0xb5, 0xf8, 0xad, 0xc2, 0x7c, 0x9a, 0xa0, + 0xd9, 0x39, 0xbe, 0x66, 0xd1, 0xdc, 0x4d, 0x63, + 0x19, 0x92, 0x78, 0xe5, 0x71, 0x0d, 0x02, 0xa3, + 0x0d, 0x74, 0xd7, 0x56, 0xb5, 0xd7, 0x14, 0xf9, + 0x46, 0x75, 0x70, 0x20, 0xba, 0xb6, 0x36, 0xb7, + 0x92, 0x92, 0xd1, 0x34, 0x67, 0x41, 0x70, 0x5a, + 0x26, 0xcf, 0x2c, 0x59, 0x98, 0x33, 0x30, 0xb1, + 0xb7, 0x7b, 0x27, 0x24, 0xfb, 0x40, 0x79, 0x14, + 0x7b, 0x4e, 0xbd, 0xd2, 0x2a, 0xb2, 0xcc, 0xcb, + 0x67, 0xe0, 0xb9, 0x37, 0xf6, 0xf6, 0xf3, 0x1b, + 0x9d, 0x2e, 0x6c, 0x6e, 0x23, 0x03, 0x5c, 0x75, + 0x9d, 0xf4, 0x11, 0x17, 0x76, 0xe6, 0xda, 0xea, + 0x6b, 0x72, 0x41, 0x30, 0xbc, 0xb2, 0xa3, 0x46, + 0xa2, 0xb5, 0x2d, 0x97, 0x13, 0xbe, 0xe2, 0x79, + 0x27, 0x93, 0xcb, 0x95, 0xc5, 0xee, 0xee, 0x9a, + 0xaf, 0x31, 0x47, 0x24, 0xb2, 0x36, 0x28, 0x86, + 0x29, 0x24, 0x38, 0x58, 0xdd, 0xf2, 0x50, 0x5b, + 0xad, 0xb4, 0x6c, 0xdd, 0xb7, 0x6f, 0x47, 0x6b, + 0x13, 0x97, 0x32, 0xee, 0xbb, 0x60, 0xb4, 0xcb, + 0xad, 0xac, 0x35, 0xb9, 0x8d, 0x6d, 0x7f, 0xb2, + 0x17, 0x0a, 0x02, 0x22, 0x20, 0x2f, 0x51, 0x7e, + 0xd5, 0x9e, 0x73, 0x7c, 0x21, 0x79, 0x5e, 0xa2, + 0xfd, 0xab, 0x3c, 0xe6, 0xf8, 0x42, 0x0e, 0x4d, + 0xb2, 0xfe, 0x67, 0x1f, 0xd8, 0x8f, 0xac, 0xe5, + 0x02, 0xa7, 0xb6, 0xcb, 0xf9, 0x9c, 0x7f, 0x62, + 0x3e, 0xb3, 0x94, 0x0a, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x21, 0xd4, 0x88, 0x82, 0x7f, 0x2b, 0xb4, + 0x9e, 0xd3, 0x2b, 0x9b, 0x31, 0x86, 0x27, 0x4b, + 0x75, 0x75, 0x58, 0xa0, 0x0d, 0x15, 0x2d, 0x6e, + 0xa7, 0x3c, 0xd3, 0xb4, 0xbd, 0xb2, 0xc6, 0xfb, + 0xe1, 0x77, 0xdb, 0xba, 0x07, 0x99, 0xfd, 0xa3, + 0x11, 0x61, 0x1e, 0x31, 0x1a, 0x3c, 0x65, 0x0f, + 0x0e, 0x69, 0x98, 0xdb, 0xc4, 0x21, 0x86, 0xe1, + 0xf1, 0xc4, 0xdd, 0x4c, 0x06, 0x80, 0x57, 0x49, + 0x53, 0x0d, 0xcd, 0xee, 0xbe, 0x1c, 0x7c, 0xa6, + 0xe8, 0xfb, 0x58, 0x9c, 0x34, 0x3b, 0x10, 0xc7, + 0x86, 0x83, 0x47, 0x69, 0x07, 0x3e, 0xcc, 0x48, + 0xf7, 0x5e, 0x4d, 0x97, 0xca, 0xc2, 0xe8, 0x2e, + 0x58, 0xe1, 0x2b, 0x7e, 0x6e, 0xe6, 0x2f, 0x91, + 0x36, 0x9a, 0x42, 0xcb, 0x98, 0xb2, 0xf6, 0x34, + 0xc7, 0x6f, 0x69, 0x1b, 0x44, 0x6d, 0x3f, 0x9d, + 0xfd, 0x6e, 0xf2, 0xf5, 0x69, 0x2c, 0x79, 0x6e, + 0x4d, 0x35, 0xd0, 0x7b, 0x4d, 0xf5, 0xe9, 0x2c, + 0x8c, 0x02, 0x1c, 0xe6, 0xb3, 0x49, 0x2b, 0x17, + 0xaf, 0x8f, 0x33, 0xc9, 0x61, 0xba, 0xc6, 0xd1, + 0x79, 0x67, 0xe2, 0x48, 0x09, 0x01, 0xce, 0x60, + 0xd5, 0x4a, 0xa0, 0x84, 0x24, 0x8d, 0x23, 0xb8, + 0xa7, 0xb6, 0xb3, 0x49, 0xb0, 0xa6, 0x90, 0x60, + 0x34, 0xa7, 0xf6, 0x74, 0xa8, 0x11, 0xab, 0xb0, + 0xac, 0x0d, 0x6c, 0x39, 0xe6, 0x55, 0x6d, 0x03, + 0x65, 0x64, 0x57, 0x96, 0x7e, 0x26, 0x19, 0x0d, + 0x03, 0xda, 0x05, 0x3c, 0x01, 0x07, 0x9d, 0x8f, + 0xf7, 0xcb, 0x87, 0x6a, 0x02, 0x1d, 0x3c, 0x2a, + 0x3f, 0x2e, 0xcc, 0xaf, 0xb2, 0xdc, 0x52, 0x42, + 0x09, 0x82, 0x43, 0x47, 0x87, 0x82, 0x63, 0x71, + 0xec, 0x1d, 0x4a, 0xcd, 0x1d, 0xac, 0x50, 0xd9, + 0x4d, 0x1d, 0xab, 0x61, 0x66, 0x65, 0x25, 0xbf, + 0x36, 0xe8, 0xe3, 0x75, 0x41, 0xa6, 0x8a, 0xe9, + 0x51, 0x39, 0x5b, 0xa0, 0xbd, 0xca, 0x25, 0xca, + 0x65, 0x95, 0xb0, 0x4e, 0xc7, 0xe3, 0x88, 0xbc, + 0xf8, 0xa6, 0x9d, 0x94, 0x1b, 0x6d, 0x8e, 0x49, + 0x9e, 0xbd, 0xd0, 0xba, 0xdc, 0xd9, 0xde, 0xb8, + 0x54, 0x3d, 0x87, 0x41, 0x3b, 0xe2, 0x94, 0x51, + 0x76, 0xd3, 0xe6, 0x19, 0x45, 0xe4, 0xae, 0x82, + 0xbf, 0xab, 0x71, 0x8e, 0x52, 0x5a, 0x4b, 0x08, + 0x07, 0x45, 0x54, 0x9e, 0x5b, 0x95, 0x33, 0x29, + 0xb8, 0xf6, 0xfc, 0xc2, 0xe2, 0x20, 0xd8, 0x01, + 0xe6, 0xd8, 0xc7, 0x02, 0xe7, 0x38, 0x82, 0x3e, + 0x55, 0x8c, 0xb6, 0xfe, 0xde, 0xf9, 0x99, 0x8d, + 0x94, 0xf2, 0x0b, 0x73, 0x7a, 0xfe, 0x72, 0x17, + 0x3b, 0x50, 0xd5, 0xe2, 0xd7, 0xb8, 0x83, 0xd4, + 0x17, 0x59, 0x3e, 0x77, 0x23, 0x6d, 0xee, 0xed, + 0xbd, 0x96, 0xea, 0x4f, 0x15, 0xb2, 0x46, 0x68, + 0x09, 0xd3, 0xbb, 0xa1, 0x7a, 0xd9, 0xfb, 0x47, + 0xd9, 0xe7, 0x17, 0xb6, 0xcf, 0x38, 0x8c, 0x71, + 0x90, 0x1d, 0xbe, 0x35, 0x8e, 0xf1, 0x5a, 0xac, + 0x32, 0x2f, 0x61, 0xba, 0x65, 0xdd, 0xf5, 0xc4, + 0x2d, 0x82, 0x03, 0x8f, 0xc5, 0x75, 0x4b, 0x88, + 0x35, 0x6f, 0x7d, 0x6d, 0xca, 0x2f, 0xe2, 0xb9, + 0xce, 0xef, 0xae, 0x71, 0x08, 0xd9, 0x24, 0x74, + 0x61, 0x79, 0x02, 0xb4, 0xa0, 0x08, 0x23, 0xf2, + 0x00, 0xd8, 0x4d, 0xd6, 0x62, 0xfd, 0x56, 0x90, + 0x9c, 0x07, 0xfc, 0x47, 0xf8, 0xad, 0x5c, 0x76, + 0x57, 0x37, 0x96, 0xb3, 0xfb, 0x55, 0xb6, 0x2e, + 0x71, 0x95, 0x32, 0x39, 0xa0, 0xb9, 0xba, 0x74, + 0xf8, 0xd4, 0x5d, 0x92, 0x96, 0xdb, 0x6c, 0xf4, + 0x30, 0x82, 0x39, 0xcb, 0xd9, 0x4c, 0x8f, 0x00, + 0xe9, 0xc0, 0xcd, 0x02, 0xbd, 0xd5, 0xeb, 0x67, + 0x2f, 0x2d, 0xe1, 0x96, 0xe2, 0xd6, 0xe5, 0xfc, + 0xdc, 0x77, 0x71, 0xf3, 0x61, 0xe7, 0x50, 0x76, + 0x91, 0xa7, 0x85, 0x07, 0x4c, 0x59, 0xae, 0x53, + 0x9a, 0x48, 0xd8, 0xb3, 0x3b, 0x41, 0x1c, 0xcf, + 0xf1, 0x5b, 0x73, 0x19, 0xd1, 0x5e, 0xca, 0xf5, + 0x97, 0x65, 0xc7, 0x2d, 0xda, 0x76, 0x5b, 0x62, + 0xc4, 0xdc, 0x0f, 0x74, 0x4e, 0xdd, 0xc2, 0x46, + 0xea, 0xd5, 0x0e, 0xcd, 0x3a, 0x2b, 0x86, 0xbe, + 0x7b, 0x98, 0x05, 0xa3, 0x0e, 0x22, 0xf0, 0xe1, + 0x52, 0xd1, 0xb8, 0x17, 0x4c, 0x19, 0x95, 0xbd, + 0xde, 0xd4, 0x36, 0xe1, 0x8e, 0x0d, 0x85, 0x91, + 0x96, 0x35, 0xee, 0x34, 0x07, 0x46, 0xbd, 0x3b, + 0xe8, 0x34, 0x4d, 0x7d, 0xb3, 0xd6, 0xf7, 0x92, + 0x4b, 0xec, 0x72, 0x49, 0x3b, 0x24, 0x76, 0x92, + 0xe1, 0x84, 0xbc, 0x38, 0xe9, 0xa1, 0x72, 0x65, + 0x19, 0x84, 0xd9, 0x8e, 0xd2, 0x47, 0x73, 0x28, + 0xa5, 0x43, 0x83, 0x58, 0x34, 0x86, 0x80, 0xd3, + 0xa1, 0x43, 0xdf, 0x10, 0x6f, 0x6e, 0x08, 0x35, + 0x06, 0x57, 0xd0, 0xd6, 0xa0, 0xf8, 0xc5, 0x76, + 0xec, 0xd4, 0x8c, 0x8f, 0x38, 0x85, 0xf2, 0x38, + 0x35, 0xa0, 0x3e, 0xae, 0x71, 0x00, 0x79, 0x25, + 0x07, 0x16, 0x61, 0xfc, 0xc2, 0xeb, 0xed, 0xa4, + 0xfa, 0xee, 0x5a, 0x16, 0xfb, 0xf2, 0xd7, 0x5f, + 0xdc, 0xb9, 0xa6, 0xad, 0x33, 0x3e, 0x87, 0x46, + 0x9a, 0xb8, 0x9a, 0x8a, 0x6e, 0x2d, 0x08, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0xa5, 0x36, 0x6b, 0xf9, + 0xdd, 0xb7, 0xf6, 0xbe, 0xa1, 0x51, 0x6a, 0x53, + 0x66, 0xbf, 0x9d, 0xdb, 0x7f, 0x6b, 0xea, 0x14, + 0x13, 0x79, 0x87, 0xbe, 0xcd, 0xe7, 0x7c, 0x81, + 0x73, 0xae, 0x8c, 0xc3, 0xdf, 0x66, 0xf3, 0xbe, + 0x40, 0xb9, 0xd0, 0x16, 0x16, 0x51, 0x07, 0x5e, + 0xd1, 0x65, 0x77, 0x99, 0x8c, 0x56, 0x82, 0xd5, + 0xa1, 0xdc, 0xd0, 0x76, 0x2c, 0x4e, 0x0d, 0xf2, + 0x83, 0x77, 0xfb, 0x4a, 0x13, 0xe1, 0x5c, 0xeb, + 0xd5, 0x33, 0x96, 0x15, 0x83, 0x38, 0xce, 0x25, + 0xcb, 0x2d, 0x6d, 0xa5, 0x64, 0x6d, 0x90, 0xca, + 0x28, 0x41, 0x24, 0x0d, 0x03, 0xb0, 0xa2, 0xbe, + 0x33, 0xba, 0xe8, 0xd1, 0xf0, 0x9e, 0x24, 0x1c, + 0x9f, 0x0a, 0xe7, 0x7e, 0xa9, 0x9c, 0xb0, 0x9f, + 0x0a, 0xe7, 0x7e, 0xa9, 0x9c, 0xb0, 0xba, 0xfe, + 0x33, 0xba, 0xe8, 0xd1, 0xf0, 0x94, 0xf8, 0xce, + 0xeb, 0xa3, 0x47, 0xc2, 0x50, 0x72, 0x7c, 0x2b, + 0x9d, 0xfa, 0xa6, 0x72, 0xc2, 0x7c, 0x2b, 0x9d, + 0xfa, 0xa6, 0x72, 0xc2, 0xeb, 0xf8, 0xce, 0xeb, + 0xa3, 0x47, 0xc2, 0x53, 0xe3, 0x3b, 0xae, 0x8d, + 0x1f, 0x09, 0x41, 0xc9, 0xf0, 0xae, 0x77, 0xea, + 0x99, 0xcb, 0x09, 0xf0, 0xae, 0x77, 0xea, 0x99, + 0xcb, 0x0b, 0xaf, 0xe3, 0x3b, 0xae, 0x8d, 0x1f, + 0x09, 0x4f, 0x8c, 0xee, 0xba, 0x34, 0x7c, 0x25, + 0x07, 0x27, 0xc2, 0xb9, 0xdf, 0xaa, 0x67, 0x2c, + 0x27, 0xc2, 0xb9, 0xdf, 0xaa, 0x67, 0x2c, 0x2e, + 0xbf, 0x8c, 0xee, 0xba, 0x34, 0x7c, 0x25, 0x3e, + 0x33, 0xba, 0xe8, 0xd1, 0xf0, 0x94, 0x1c, 0x9f, + 0x0a, 0xe7, 0x7e, 0xa9, 0x9c, 0xb0, 0x9f, 0x0a, + 0xe7, 0x7e, 0xa9, 0x9c, 0xb0, 0xba, 0xfe, 0x33, + 0xba, 0xe8, 0xd1, 0xf0, 0x94, 0xf8, 0xce, 0xeb, + 0xa3, 0x47, 0xc2, 0x50, 0x72, 0x7c, 0x29, 0x9d, + 0x7a, 0xa6, 0x7e, 0xf0, 0x29, 0x18, 0x6d, 0x76, + 0xbe, 0x18, 0x04, 0x0c, 0xe6, 0xf0, 0xb4, 0x51, + 0xae, 0x2e, 0x69, 0x70, 0x1d, 0x82, 0x56, 0x9f, + 0x8c, 0xee, 0xba, 0x34, 0x7c, 0x25, 0x3e, 0x33, + 0xba, 0xe8, 0xd1, 0xf0, 0x94, 0x18, 0x97, 0x26, + 0xda, 0x5b, 0x83, 0x6e, 0xdb, 0xac, 0x32, 0x32, + 0xdd, 0xc0, 0xb2, 0xae, 0x65, 0x75, 0x82, 0x75, + 0x01, 0x5d, 0x4a, 0x53, 0x30, 0x8b, 0x68, 0x45, + 0xf3, 0xe4, 0xcb, 0xb0, 0x3a, 0x07, 0xb5, 0xbe, + 0x2c, 0x85, 0xa4, 0x62, 0x02, 0x84, 0x80, 0x54, + 0x67, 0xc6, 0x57, 0x5d, 0x1a, 0x3e, 0x12, 0x9f, + 0x19, 0x5d, 0x74, 0x66, 0x70, 0xb9, 0x06, 0x9b, + 0x8d, 0x9e, 0xda, 0x1b, 0xa9, 0x5d, 0x34, 0xec, + 0x6c, 0x92, 0x3f, 0x5b, 0x8b, 0xc7, 0x79, 0x6a, + 0xf8, 0x57, 0x3b, 0xf5, 0x4c, 0xd5, 0x4f, 0x2c, + 0x2e, 0xbf, 0x8c, 0xee, 0xba, 0x34, 0x7c, 0x25, + 0x3e, 0x33, 0xba, 0xe8, 0xd1, 0xf0, 0x94, 0x1e, + 0xe7, 0xcb, 0xf6, 0xb2, 0xe2, 0xd7, 0xd9, 0x26, + 0xc0, 0xf8, 0x8d, 0x01, 0xf1, 0x99, 0x5a, 0x03, + 0xbf, 0x45, 0xb2, 0xde, 0xdb, 0x6b, 0xed, 0xe1, + 0x6c, 0x2d, 0x11, 0xb9, 0xac, 0x14, 0x61, 0x7b, + 0x9a, 0xe2, 0x07, 0x60, 0x95, 0xa3, 0xe3, 0x3b, + 0xae, 0x8d, 0x1f, 0x09, 0x4f, 0x8c, 0xee, 0xba, + 0x34, 0x7c, 0x25, 0x06, 0x89, 0xf6, 0x73, 0x68, + 0x2e, 0x25, 0x74, 0xd3, 0x31, 0xaf, 0x91, 0xfe, + 0x53, 0x8c, 0x81, 0x2d, 0xb6, 0x77, 0x68, 0x2d, + 0x67, 0x6c, 0xf0, 0xb1, 0x8d, 0x91, 0x9a, 0x5a, + 0x71, 0xb4, 0xf8, 0x56, 0xff, 0x00, 0x8c, 0xee, + 0xba, 0x34, 0x7c, 0x25, 0x3e, 0x33, 0xba, 0xe8, + 0xd1, 0xf0, 0x94, 0x1d, 0x22, 0x3d, 0xb6, 0x1f, + 0xf1, 0x19, 0xff, 0x00, 0x2b, 0xd0, 0x5c, 0x97, + 0xd9, 0x36, 0xd3, 0xdf, 0x96, 0xba, 0xe8, 0x32, + 0x47, 0x30, 0x51, 0xa7, 0x13, 0x1b, 0x4a, 0xf9, + 0xa0, 0x2f, 0x5f, 0x19, 0xdd, 0x74, 0x68, 0xf8, + 0x4a, 0x7c, 0x67, 0x75, 0xd1, 0xa3, 0xe1, 0x28, + 0x39, 0xe1, 0xd9, 0xac, 0xfa, 0x09, 0x99, 0x3c, + 0x51, 0xb1, 0xaf, 0x8c, 0xe2, 0x69, 0xc6, 0xd3, + 0x4a, 0x76, 0xea, 0xb6, 0x3f, 0x22, 0xda, 0x57, + 0xdd, 0xfb, 0x63, 0xda, 0xc3, 0x70, 0x1c, 0x1d, + 0x8f, 0x1b, 0x46, 0x91, 0xd8, 0x0b, 0x67, 0xc6, + 0x77, 0x5d, 0x1a, 0x3e, 0x12, 0x9f, 0x19, 0xdd, + 0x74, 0x68, 0xf8, 0x4a, 0x0d, 0x77, 0x19, 0x16, + 0xd2, 0x5d, 0x5c, 0x0b, 0x99, 0xda, 0xc7, 0xcc, + 0xdc, 0x34, 0x76, 0x36, 0x8a, 0x61, 0xd5, 0xa1, + 0x2e, 0x32, 0x3d, 0xa6, 0xb9, 0xb9, 0x17, 0x52, + 0x86, 0x99, 0xc5, 0x28, 0xf0, 0xf6, 0xb4, 0x8c, + 0x22, 0x83, 0xc9, 0xa2, 0xd9, 0xf1, 0x9d, 0xd7, + 0x46, 0x8f, 0x84, 0xa7, 0xc6, 0x77, 0x5d, 0x1a, + 0x3e, 0x12, 0x83, 0xa9, 0xac, 0xdb, 0x20, 0xcc, + 0x24, 0x44, 0x4d, 0x28, 0x1e, 0x4b, 0x71, 0x70, + 0xae, 0x03, 0x90, 0xed, 0x23, 0xae, 0x85, 0xe3, + 0x83, 0x5d, 0x3b, 0x5c, 0x1c, 0x1e, 0x5e, 0xd3, + 0x42, 0x3b, 0x6b, 0x6f, 0xc6, 0x77, 0x5d, 0x1a, + 0x3e, 0x12, 0x9f, 0x19, 0xdd, 0x74, 0x68, 0xf8, + 0x4a, 0x0d, 0x17, 0x3b, 0x3b, 0xb4, 0x37, 0x53, + 0x3a, 0x79, 0xd8, 0xc7, 0xca, 0xfa, 0x62, 0x76, + 0x36, 0x8a, 0xd0, 0x53, 0x71, 0x6b, 0x1b, 0x2d, + 0x9e, 0x02, 0x08, 0x8d, 0xa0, 0x8d, 0x20, 0x89, + 0x05, 0x57, 0x5f, 0xc6, 0x77, 0x5d, 0x1a, 0x3e, + 0x12, 0x9f, 0x19, 0xdd, 0x74, 0x68, 0xf8, 0x4a, + 0x0e, 0x98, 0xe2, 0xdb, 0x18, 0xd8, 0x19, 0x48, + 0x9f, 0x87, 0x53, 0x9e, 0x5a, 0x48, 0xee, 0xae, + 0x0b, 0xad, 0x9f, 0xda, 0x3b, 0xb9, 0x0c, 0xb7, + 0x21, 0xb2, 0x3c, 0xee, 0x99, 0x05, 0x07, 0x68, + 0x2d, 0xdf, 0x19, 0xdd, 0x74, 0x68, 0xf8, 0x4a, + 0x7c, 0x67, 0x75, 0xd1, 0xa3, 0xe1, 0x28, 0x39, + 0x3e, 0x15, 0xce, 0xfd, 0x53, 0x39, 0x61, 0x3e, + 0x15, 0xce, 0xfd, 0x53, 0x39, 0x61, 0x75, 0xfc, + 0x67, 0x75, 0xd1, 0xa3, 0xe1, 0x29, 0xf1, 0x9d, + 0xd7, 0x46, 0x8f, 0x84, 0xa0, 0xe4, 0xf8, 0x57, + 0x3b, 0xf5, 0x4c, 0xe5, 0x84, 0xf8, 0x57, 0x3b, + 0xf5, 0x4c, 0xe5, 0x85, 0xd7, 0xf1, 0x9d, 0xd7, + 0x46, 0x8f, 0x84, 0xa7, 0xc6, 0x77, 0x5d, 0x1a, + 0x3e, 0x12, 0x83, 0x93, 0xe1, 0x5c, 0xef, 0xd5, + 0x33, 0x96, 0x13, 0xe1, 0x5c, 0xef, 0xd5, 0x33, + 0x96, 0x17, 0x5f, 0xc6, 0x77, 0x5d, 0x1a, 0x3e, + 0x12, 0x9f, 0x19, 0xdd, 0x74, 0x68, 0xf8, 0x4a, + 0x0e, 0x4f, 0x85, 0x73, 0xbf, 0x54, 0xce, 0x58, + 0x4f, 0x85, 0x73, 0xbf, 0x54, 0xce, 0x58, 0x5d, + 0x7f, 0x19, 0xdd, 0x74, 0x68, 0xf8, 0x4a, 0x7c, + 0x67, 0x75, 0xd1, 0xa3, 0xe1, 0x28, 0x39, 0x3e, + 0x15, 0xce, 0xfd, 0x53, 0x39, 0x61, 0x3e, 0x15, + 0xce, 0xfd, 0x53, 0x39, 0x61, 0x75, 0xfc, 0x67, + 0x75, 0xd1, 0xa3, 0xe1, 0x29, 0xf1, 0x9d, 0xd7, + 0x46, 0x8f, 0x84, 0xa0, 0xe4, 0xf8, 0x57, 0x3b, + 0xf5, 0x4c, 0xe5, 0x84, 0xf8, 0x57, 0x3a, 0xdd, + 0x8d, 0x80, 0x79, 0xe1, 0x75, 0xfc, 0x67, 0x75, + 0xd1, 0xa3, 0xe1, 0x2b, 0xdc, 0x3b, 0x61, 0x73, + 0x24, 0xd1, 0xc6, 0x6d, 0xd8, 0xd1, 0x23, 0xda, + 0xd2, 0x41, 0x3a, 0x03, 0x8d, 0x10, 0x4a, 0xe7, + 0x00, 0x86, 0xc0, 0x0e, 0x82, 0x01, 0x04, 0x77, + 0x14, 0x61, 0x52, 0x39, 0xd3, 0xcf, 0x3c, 0xc6, + 0x6e, 0x06, 0xd7, 0x85, 0x47, 0x20, 0xf7, 0x17, + 0xed, 0x19, 0xe7, 0x05, 0x2a, 0xa2, 0x62, 0x3f, + 0xac, 0x6f, 0x9c, 0x14, 0xad, 0x50, 0x0a, 0xe0, + 0xcc, 0x7d, 0xe6, 0xd3, 0xed, 0x3e, 0x50, 0xbb, + 0xea, 0xb8, 0x33, 0x1f, 0x79, 0xb4, 0xfb, 0x4f, + 0x94, 0x20, 0xc6, 0x5f, 0xef, 0x37, 0x7e, 0x79, + 0xfa, 0xc5, 0x77, 0xd1, 0x70, 0x65, 0xfe, 0xf3, + 0x77, 0xe7, 0x9f, 0xac, 0x57, 0x7a, 0x0c, 0x1d, + 0x45, 0x45, 0x1d, 0x65, 0x4b, 0x3b, 0x51, 0x51, + 0x27, 0x59, 0x40, 0x44, 0x44, 0x1e, 0xa2, 0x95, + 0xf0, 0xc8, 0xd9, 0x18, 0x68, 0xe6, 0xea, 0xed, + 0x1d, 0xc5, 0xd5, 0x79, 0x67, 0x96, 0xe7, 0x4d, + 0x0e, 0x79, 0xe6, 0x2e, 0x80, 0xa0, 0x78, 0xfc, + 0xb4, 0xae, 0x34, 0x41, 0xa9, 0xfb, 0x17, 0x78, + 0x0f, 0xea, 0xee, 0x23, 0x23, 0x7d, 0xc1, 0xc0, + 0xf7, 0x97, 0x8f, 0x83, 0x33, 0x0f, 0x5d, 0x17, + 0xd2, 0xe2, 0x5d, 0x38, 0xdf, 0xf3, 0x8f, 0x0a, + 0x63, 0x7f, 0xce, 0x3c, 0x25, 0x07, 0x3f, 0xc1, + 0xb9, 0x8f, 0xaf, 0x8b, 0xe9, 0x71, 0x2c, 0x7c, + 0x19, 0x98, 0xfa, 0xf8, 0x87, 0x6b, 0x17, 0x12, + 0xe9, 0xc6, 0xff, 0x00, 0x9c, 0x78, 0x4a, 0x63, + 0x7f, 0xce, 0x3c, 0x25, 0x07, 0x37, 0xc1, 0x99, + 0x87, 0xae, 0x87, 0xe9, 0x71, 0x27, 0xc1, 0x99, + 0x8f, 0xaf, 0x8b, 0xe9, 0x71, 0x2e, 0x9c, 0x6f, + 0xf9, 0xc7, 0x84, 0xa6, 0x37, 0xfc, 0xe3, 0xc2, + 0x50, 0x73, 0xfc, 0x1b, 0x98, 0xfa, 0xf8, 0xbe, + 0x97, 0x12, 0xc7, 0xc1, 0x99, 0x87, 0xae, 0x8b, + 0xe9, 0x71, 0x2e, 0x9c, 0x6f, 0xf9, 0xc7, 0x84, + 0xa6, 0x37, 0xfc, 0xe3, 0xc2, 0x50, 0x73, 0x7c, + 0x19, 0x98, 0xd6, 0xbc, 0xf4, 0x55, 0xdf, 0xf1, + 0xb8, 0x93, 0xe0, 0xcc, 0xc3, 0xd7, 0x45, 0xf4, + 0xb8, 0x97, 0x4e, 0x37, 0xfc, 0xe3, 0xc2, 0x53, + 0x1b, 0xfe, 0x71, 0xe1, 0x28, 0x39, 0xbe, 0x0c, + 0xcc, 0x3d, 0x74, 0x3f, 0x4b, 0x89, 0x67, 0xe0, + 0xdc, 0xc7, 0x76, 0x78, 0x8f, 0x2b, 0x89, 0x74, + 0x63, 0x7f, 0xce, 0x3c, 0x25, 0x31, 0xbf, 0xe7, + 0x1e, 0x12, 0x83, 0x9b, 0xe0, 0xcc, 0xc3, 0x57, + 0x3d, 0x17, 0xd2, 0xe2, 0x4f, 0x83, 0x33, 0x0f, + 0x5d, 0x16, 0xff, 0x00, 0xe7, 0x71, 0x2e, 0x9c, + 0x6f, 0xf9, 0xc7, 0x84, 0xa6, 0x37, 0xfc, 0xe3, + 0xc2, 0x50, 0x73, 0x7c, 0x19, 0x98, 0x52, 0x9c, + 0xf4, 0x54, 0xde, 0xf1, 0xb8, 0x96, 0x7e, 0x0d, + 0xcc, 0x4f, 0xfc, 0x78, 0xbe, 0x97, 0x12, 0xe8, + 0xc6, 0xff, 0x00, 0x9c, 0x78, 0x4a, 0x63, 0x7f, + 0xce, 0x3c, 0x25, 0x07, 0x37, 0xc1, 0x99, 0x87, + 0xae, 0x8b, 0xe9, 0x71, 0x27, 0xc1, 0x99, 0x81, + 0xd7, 0x34, 0x5f, 0x4b, 0x89, 0x74, 0xe3, 0x7f, + 0xce, 0x3c, 0x25, 0x31, 0xbf, 0xe7, 0x1e, 0x12, + 0x83, 0x9b, 0xe0, 0xcc, 0xc3, 0xd7, 0x45, 0xf4, + 0xb8, 0x96, 0x7e, 0x0c, 0xcc, 0x3d, 0x74, 0x5f, + 0x4b, 0x89, 0x74, 0x63, 0x7f, 0xce, 0x3c, 0x25, + 0x31, 0xbf, 0xe7, 0x1e, 0x12, 0x83, 0x9f, 0xe0, + 0xdc, 0xc7, 0xd7, 0x45, 0xf4, 0xb8, 0x90, 0x6c, + 0x6e, 0x62, 0x3f, 0xe3, 0xc5, 0xf4, 0xb8, 0x97, + 0x46, 0x37, 0xfc, 0xe3, 0xc2, 0x53, 0x1b, 0xfe, + 0x71, 0xe1, 0x28, 0x39, 0xbe, 0x0c, 0xcc, 0x7d, + 0x7c, 0x5f, 0x4b, 0x89, 0x67, 0xe0, 0xdc, 0xc3, + 0xd7, 0x45, 0xf4, 0xb8, 0x97, 0x46, 0x37, 0xfc, + 0xe3, 0xc2, 0x53, 0x1b, 0xfe, 0x71, 0xe1, 0x28, + 0x39, 0xbe, 0x0c, 0xcc, 0x3d, 0x74, 0x5f, 0x4b, + 0x89, 0x3e, 0x0c, 0xcc, 0x3d, 0x74, 0x3f, 0x4b, + 0x89, 0x74, 0xe3, 0x7f, 0xce, 0x3c, 0x25, 0x31, + 0xbf, 0xe7, 0x1e, 0x12, 0x83, 0x9b, 0xe0, 0xcc, + 0xc3, 0xd7, 0x43, 0xf4, 0xb8, 0x90, 0xec, 0x66, + 0x60, 0x45, 0x0c, 0xd1, 0x11, 0xfd, 0xae, 0x25, + 0xd3, 0x8d, 0xff, 0x00, 0x38, 0xf0, 0x94, 0xc6, + 0xff, 0x00, 0x9c, 0x78, 0x4a, 0x0e, 0x6f, 0x83, + 0x33, 0x0f, 0x5d, 0x17, 0xd2, 0xe2, 0x4f, 0x83, + 0x33, 0x1f, 0x5f, 0x17, 0xd2, 0xe2, 0x5d, 0x38, + 0xdf, 0xf3, 0x8f, 0x09, 0x4c, 0x6f, 0xf9, 0xc7, + 0x84, 0xa0, 0xe6, 0xf8, 0x33, 0x30, 0xad, 0x79, + 0xe8, 0xab, 0xfd, 0xae, 0x24, 0xf8, 0x33, 0x31, + 0xf5, 0xd1, 0x7d, 0x2e, 0x25, 0xd3, 0x8d, 0xff, + 0x00, 0x38, 0xf0, 0x94, 0xc6, 0xff, 0x00, 0x9c, + 0x78, 0x4a, 0x0e, 0x6f, 0x83, 0x33, 0x0f, 0x5d, + 0x17, 0xd2, 0xe2, 0x59, 0xf8, 0x37, 0x31, 0xf5, + 0xd1, 0x7d, 0x2e, 0x25, 0xd1, 0x8d, 0xff, 0x00, + 0x38, 0xf0, 0x94, 0xc6, 0xff, 0x00, 0x9c, 0x78, + 0x4a, 0x0e, 0x71, 0xb1, 0xb9, 0x88, 0xff, 0x00, + 0x8f, 0x17, 0xd2, 0xe2, 0x5b, 0x2d, 0x76, 0x4f, + 0x33, 0xb6, 0xb8, 0x8e, 0xe2, 0x39, 0xa1, 0xc7, + 0x11, 0x0e, 0x6e, 0x20, 0xe2, 0x2a, 0x37, 0xf5, + 0x2d, 0x98, 0xdf, 0xf3, 0x8f, 0x09, 0x4c, 0x6f, + 0xf9, 0xc7, 0x84, 0xa0, 0xf1, 0x77, 0xb2, 0xb9, + 0xa5, 0xd5, 0xcb, 0xee, 0x64, 0x9a, 0x01, 0x24, + 0x86, 0xae, 0xc2, 0x1c, 0x06, 0x9d, 0xed, 0x0b, + 0x57, 0xc1, 0x99, 0x87, 0xae, 0x87, 0xe9, 0x71, + 0x2e, 0x8e, 0x71, 0xff, 0x00, 0x38, 0xf0, 0x94, + 0xc6, 0xff, 0x00, 0x9c, 0x78, 0x4a, 0x0e, 0x6f, + 0x83, 0x33, 0x1f, 0x5f, 0x16, 0x9f, 0x3b, 0x89, + 0x3e, 0x0c, 0xcc, 0x3d, 0x74, 0x47, 0x95, 0xc4, + 0xba, 0x71, 0xbf, 0xe7, 0x1e, 0x12, 0x98, 0xdf, + 0xf3, 0x8f, 0x09, 0x41, 0xcd, 0xf0, 0x66, 0x61, + 0x4a, 0x73, 0xd1, 0x7d, 0x2e, 0x25, 0x9f, 0x83, + 0x73, 0x1f, 0x5f, 0x17, 0x77, 0x17, 0x12, 0xe8, + 0xc6, 0xff, 0x00, 0x9c, 0x78, 0x4a, 0x63, 0x7f, + 0xce, 0x3c, 0x28, 0x34, 0x37, 0x62, 0xef, 0x6b, + 0xe3, 0xdc, 0x44, 0xd6, 0xee, 0x90, 0x1c, 0x7b, + 0xda, 0x14, 0x95, 0x9e, 0x5f, 0x96, 0x64, 0xc0, + 0xc8, 0x1d, 0xed, 0x17, 0x54, 0xa0, 0x71, 0xf9, + 0x06, 0xe2, 0xe4, 0xc6, 0xf3, 0xf9, 0xc7, 0x85, + 0x61, 0x07, 0xb9, 0xe6, 0x92, 0x79, 0x4c, 0x92, + 0x79, 0x47, 0x73, 0x79, 0x78, 0x44, 0x40, 0x44, + 0x44, 0x05, 0xea, 0x2f, 0xda, 0xb3, 0xce, 0x6f, + 0x84, 0x2f, 0x2b, 0xdc, 0x3f, 0xb6, 0x8f, 0xce, + 0x6f, 0x85, 0x07, 0x1e, 0xd9, 0x7f, 0x33, 0x8f, + 0xec, 0x47, 0xd6, 0x72, 0x81, 0x57, 0x6c, 0xe6, + 0x0c, 0x86, 0x5b, 0xa6, 0xbb, 0x32, 0x94, 0x47, + 0x30, 0x60, 0x0d, 0x18, 0x88, 0xf1, 0x6a, 0x77, + 0x97, 0x07, 0xb1, 0xec, 0x77, 0x48, 0xfa, 0x6e, + 0xe2, 0x41, 0x58, 0x45, 0x67, 0xf6, 0x3d, 0x8e, + 0xe9, 0x1f, 0x4d, 0xdc, 0x49, 0xec, 0x7b, 0x1d, + 0xd2, 0x3e, 0x9b, 0xb8, 0x90, 0x56, 0x11, 0x59, + 0xfd, 0x8f, 0x63, 0xba, 0x47, 0xd3, 0x77, 0x12, + 0x7b, 0x1e, 0xc7, 0x74, 0x8f, 0xa6, 0xee, 0x24, + 0x15, 0x84, 0x56, 0x7f, 0x63, 0xd8, 0xee, 0x91, + 0xf4, 0xdd, 0xc4, 0x9e, 0xc7, 0xb1, 0xdd, 0x23, + 0xe9, 0xbb, 0x89, 0x05, 0x61, 0x15, 0x9f, 0xd8, + 0xf6, 0x3b, 0xa4, 0x7d, 0x37, 0x71, 0x27, 0xb1, + 0xec, 0x77, 0x48, 0xfa, 0x6e, 0xe2, 0x41, 0x58, + 0x45, 0x67, 0xf6, 0x3d, 0x8e, 0xe9, 0x1f, 0x4d, + 0xdc, 0x49, 0xec, 0x7b, 0x1d, 0xd2, 0x3e, 0x9b, + 0xb8, 0x90, 0x56, 0x11, 0x59, 0xfd, 0x8f, 0x63, + 0xba, 0x47, 0xd3, 0x77, 0x12, 0x7b, 0x1e, 0xc7, + 0x74, 0x8f, 0xa6, 0xee, 0x24, 0x15, 0x84, 0xdd, + 0xae, 0xea, 0xb3, 0xfb, 0x1e, 0xc7, 0x74, 0x8f, + 0xa6, 0xee, 0x24, 0xf6, 0x3d, 0x8e, 0xe9, 0x1f, + 0x4d, 0xdc, 0x48, 0x2b, 0x09, 0xa2, 0xb5, 0xdd, + 0x56, 0x7f, 0x63, 0xd8, 0xee, 0x91, 0xf4, 0xdd, + 0xc4, 0x9e, 0xc7, 0xb1, 0xdd, 0x23, 0xe9, 0xbb, + 0x89, 0x05, 0x61, 0x3b, 0x3b, 0xaa, 0xcf, 0xec, + 0x7b, 0x1d, 0xd2, 0x3e, 0x9b, 0xb8, 0x93, 0xd8, + 0xf6, 0x3b, 0xa4, 0x7d, 0x37, 0x71, 0x20, 0xac, + 0xb5, 0xce, 0x69, 0xc4, 0xd2, 0x43, 0xb4, 0xe9, + 0x07, 0x4e, 0x9d, 0x0b, 0x0a, 0xcf, 0xec, 0x7b, + 0x1d, 0xd2, 0x3e, 0x9b, 0xb8, 0x93, 0xd8, 0xf6, + 0x3b, 0xa4, 0x7d, 0x37, 0x71, 0x20, 0xac, 0x6b, + 0x35, 0x3a, 0x4f, 0x65, 0x15, 0x9f, 0xd8, 0xf6, + 0x3b, 0xa4, 0x7d, 0x37, 0x71, 0x27, 0xb1, 0xec, + 0x77, 0x48, 0xfa, 0x6e, 0xe2, 0x41, 0x58, 0x3a, + 0x75, 0xe9, 0xed, 0xa5, 0x06, 0xf6, 0xad, 0x4a, + 0xcf, 0xec, 0x7b, 0x1d, 0xd2, 0x3e, 0x9b, 0xb8, + 0x93, 0xd8, 0xf6, 0x3b, 0xa4, 0x7d, 0x37, 0x71, + 0x20, 0xac, 0x77, 0xe9, 0xa0, 0x55, 0x15, 0x9f, + 0xd8, 0xf6, 0x3b, 0xa4, 0x7d, 0x37, 0x71, 0x27, + 0xb1, 0xec, 0x77, 0x48, 0xfa, 0x6e, 0xe2, 0x41, + 0x58, 0xdc, 0xa1, 0xd4, 0x35, 0x04, 0x3a, 0x75, + 0xe9, 0xed, 0xe9, 0x56, 0x7f, 0x63, 0xd8, 0xee, + 0x91, 0xf4, 0xdd, 0xc4, 0x9e, 0xc7, 0xb1, 0xdd, + 0x23, 0xe9, 0xbb, 0x89, 0x05, 0x61, 0x15, 0x9f, + 0xd8, 0xf6, 0x3b, 0xa4, 0x7d, 0x37, 0x71, 0x27, + 0xb1, 0xec, 0x77, 0x48, 0xfa, 0x6e, 0xe2, 0x41, + 0x58, 0x45, 0x67, 0xf6, 0x3d, 0x8e, 0xe9, 0x1f, + 0x4d, 0xdc, 0x49, 0xec, 0x7b, 0x1d, 0xd2, 0x3e, + 0x9b, 0xb8, 0x90, 0x56, 0x11, 0x59, 0xfd, 0x8f, + 0x63, 0xba, 0x47, 0xd3, 0x77, 0x12, 0x7b, 0x1e, + 0xc7, 0x74, 0x8f, 0xa6, 0xee, 0x24, 0x15, 0x84, + 0x56, 0x7f, 0x63, 0xd8, 0xee, 0x91, 0xf4, 0xdd, + 0xc4, 0x9e, 0xc7, 0xb1, 0xdd, 0x23, 0xe9, 0xbb, + 0x89, 0x05, 0x61, 0x15, 0x9f, 0xd8, 0xf6, 0x3b, + 0xa4, 0x7d, 0x37, 0x71, 0x27, 0xb1, 0xec, 0x77, + 0x48, 0xfa, 0x6e, 0xe2, 0x41, 0x58, 0x45, 0x67, + 0xf6, 0x3d, 0x8e, 0xe9, 0x1f, 0x4d, 0xdc, 0x49, + 0xec, 0x7b, 0x1d, 0xd2, 0x3e, 0x9b, 0xb8, 0x90, + 0x56, 0x11, 0x59, 0xfd, 0x8f, 0x63, 0xba, 0x47, + 0xd3, 0x77, 0x12, 0x7b, 0x1e, 0xc7, 0x74, 0x8f, + 0xa6, 0xee, 0x24, 0x15, 0x85, 0x29, 0xb3, 0x5f, + 0xce, 0xed, 0xbf, 0xb5, 0xf5, 0x0a, 0x93, 0xf6, + 0x3d, 0x8e, 0xe9, 0x1f, 0x4d, 0xdc, 0x4b, 0xab, + 0x2d, 0xb7, 0xd9, 0xa6, 0x5f, 0x46, 0xeb, 0x19, + 0xb1, 0xdc, 0x82, 0x70, 0x37, 0x13, 0x8e, 0xb1, + 0x43, 0xb9, 0xbc, 0x83, 0xce, 0x61, 0xef, 0xb3, + 0x79, 0xdf, 0x20, 0x5c, 0xeb, 0xa3, 0x30, 0xf7, + 0xd9, 0xbc, 0xef, 0x90, 0x2e, 0x74, 0x04, 0x44, + 0x40, 0xda, 0xd1, 0xff, 0x00, 0x61, 0x63, 0xfd, + 0xaf, 0xaa, 0x15, 0x61, 0x59, 0xf6, 0xb3, 0xdc, + 0x2c, 0x7f, 0xb5, 0xf5, 0x42, 0xac, 0x20, 0x22, + 0x22, 0x02, 0x68, 0xe3, 0x44, 0x41, 0xd5, 0x06, + 0x5b, 0x3c, 0xf6, 0x13, 0xdf, 0x30, 0xb4, 0x47, + 0x6f, 0xa1, 0xe0, 0xeb, 0xae, 0x83, 0xf2, 0xae, + 0x5d, 0x1b, 0xda, 0x37, 0x14, 0xee, 0x59, 0xfe, + 0x99, 0xcc, 0xfc, 0xe1, 0xe0, 0x6a, 0x82, 0x41, + 0x27, 0x65, 0x90, 0xdc, 0x5e, 0x5a, 0x0b, 0xb6, + 0xcd, 0x14, 0x51, 0x12, 0x5b, 0x59, 0x0d, 0x34, + 0x83, 0x45, 0x9b, 0xad, 0x9d, 0xbf, 0x82, 0x17, + 0x4e, 0xc3, 0x1d, 0xc4, 0x4c, 0x15, 0x7b, 0xa2, + 0x75, 0x68, 0x17, 0x49, 0xff, 0x00, 0x47, 0x0f, + 0xb7, 0xfe, 0xf1, 0x5a, 0xb6, 0x5a, 0xe5, 0xf1, + 0x66, 0xac, 0x86, 0xbf, 0xaa, 0x9c, 0x39, 0x8f, + 0x61, 0xd5, 0x5a, 0x62, 0x69, 0xa2, 0x08, 0xa8, + 0x61, 0x96, 0xe2, 0x56, 0x43, 0x0b, 0x71, 0x49, + 0x21, 0xa0, 0x01, 0x4b, 0xfc, 0x31, 0x26, 0x21, + 0x11, 0xbc, 0xb7, 0x17, 0x1e, 0xa3, 0x16, 0x9a, + 0xef, 0x2e, 0xbc, 0x96, 0xd6, 0x38, 0x33, 0xac, + 0xc5, 0xe0, 0x54, 0x5a, 0x87, 0xe0, 0xec, 0x12, + 0x6b, 0xf2, 0x2a, 0xe3, 0xa7, 0x91, 0xd2, 0x9b, + 0x92, 0x69, 0x21, 0x3c, 0xe6, 0x23, 0xae, 0xb5, + 0xd1, 0xa5, 0x07, 0xab, 0x8b, 0x79, 0x6d, 0xa6, + 0x74, 0x13, 0x33, 0x0c, 0xac, 0x34, 0x73, 0x7e, + 0x50, 0xb7, 0xe5, 0xf9, 0x64, 0xd7, 0xed, 0x94, + 0xc2, 0xe6, 0x56, 0x06, 0xe3, 0x2d, 0x3a, 0xc8, + 0xdd, 0x52, 0x7b, 0x56, 0xc0, 0xe9, 0x2c, 0xee, + 0xc0, 0xa3, 0xa7, 0x88, 0x62, 0xec, 0x96, 0xe9, + 0xaf, 0xd2, 0x5c, 0xfb, 0x2f, 0x38, 0x8b, 0x36, + 0x63, 0x1d, 0xe4, 0x4e, 0xd7, 0x46, 0xee, 0xe8, + 0xa8, 0xef, 0x84, 0x11, 0x1a, 0xf4, 0x01, 0xa4, + 0xe8, 0x1c, 0x34, 0x5d, 0x99, 0x8e, 0x5b, 0x2e, + 0x5e, 0xf8, 0xe3, 0x99, 0xcc, 0x2f, 0x95, 0xb8, + 0xc3, 0x46, 0xe0, 0x3f, 0xfc, 0x2d, 0xb0, 0xd8, + 0x9e, 0xbd, 0x6d, 0x91, 0x1a, 0xa7, 0x20, 0xf6, + 0x00, 0x71, 0x3e, 0x00, 0xa4, 0xae, 0xed, 0x46, + 0x71, 0x9f, 0x5c, 0x87, 0x3f, 0x9b, 0xb7, 0xb5, + 0x14, 0x95, 0xe3, 0xe6, 0xb3, 0x58, 0x08, 0x2b, + 0xbd, 0xc5, 0xd5, 0x6f, 0x96, 0xcd, 0x71, 0x67, + 0x71, 0x78, 0xc7, 0x34, 0x47, 0x6a, 0x2a, 0xf6, + 0x9f, 0x28, 0xe8, 0xdc, 0x52, 0x70, 0xe5, 0xd9, + 0x2e, 0x64, 0x24, 0x8b, 0x2e, 0x74, 0xac, 0xb8, + 0x8d, 0xa5, 0xcc, 0xe7, 0x28, 0x5a, 0xfa, 0x2c, + 0x65, 0x40, 0x8c, 0x83, 0x37, 0x14, 0xa3, 0x80, + 0x03, 0xba, 0x01, 0x41, 0x16, 0xcb, 0x0b, 0x89, + 0x2c, 0xa4, 0xbd, 0x6b, 0x5b, 0xcc, 0x44, 0xe0, + 0xd7, 0xba, 0xba, 0x6a, 0x69, 0xf9, 0xbd, 0xd5, + 0xce, 0xad, 0x36, 0xa3, 0x26, 0xf8, 0x7a, 0x70, + 0x24, 0x9b, 0xd9, 0x79, 0xc0, 0x66, 0x24, 0x78, + 0xc1, 0xf4, 0x66, 0x86, 0x8a, 0x6a, 0xd4, 0xa3, + 0xad, 0x72, 0xcc, 0xb7, 0xd9, 0x67, 0xcc, 0xae, + 0x5f, 0x21, 0xb2, 0x6c, 0x98, 0x20, 0x60, 0xa0, + 0x7b, 0x85, 0x74, 0x55, 0x04, 0x3a, 0x29, 0x8b, + 0xbc, 0xbf, 0x2d, 0x9b, 0x2c, 0x7e, 0x65, 0x96, + 0xba, 0x46, 0xb6, 0x17, 0x61, 0x96, 0x39, 0x68, + 0x4e, 0xba, 0x68, 0x58, 0xb1, 0xcb, 0xb2, 0xf6, + 0x58, 0x75, 0x96, 0x66, 0xf7, 0x88, 0x9c, 0xec, + 0x11, 0x45, 0x1f, 0x94, 0x69, 0xbb, 0xd9, 0x41, + 0x10, 0x8a, 0x6e, 0xe3, 0x28, 0xcb, 0xba, 0xaa, + 0x5c, 0xca, 0xd2, 0x59, 0x1c, 0xc0, 0x47, 0x36, + 0xd7, 0xd0, 0x16, 0x8a, 0xf8, 0xcd, 0x78, 0xdf, + 0x0b, 0x5c, 0x19, 0x76, 0x5d, 0x6d, 0x97, 0xb2, + 0xff, 0x00, 0x33, 0x74, 0x84, 0x4e, 0x69, 0x04, + 0x11, 0xf9, 0x44, 0x6f, 0x92, 0x42, 0x08, 0x84, + 0x34, 0x02, 0xaa, 0x53, 0x34, 0xcb, 0x2d, 0x62, + 0xb5, 0x86, 0xfe, 0xc1, 0xee, 0x7d, 0xac, 0xe4, + 0xb6, 0x8e, 0xd2, 0x5a, 0x46, 0xf9, 0x51, 0x4e, + 0xf2, 0x4f, 0x69, 0x04, 0xd9, 0xd9, 0x6b, 0x96, + 0x86, 0xb9, 0xf7, 0x36, 0xec, 0x0f, 0x01, 0xc0, + 0x3d, 0xc5, 0xa6, 0x87, 0xb6, 0xb9, 0x33, 0x0c, + 0x96, 0xf3, 0x2f, 0x63, 0x65, 0x94, 0x36, 0x48, + 0x5d, 0xa0, 0x4b, 0x19, 0xa8, 0xa9, 0x5d, 0xfb, + 0x5a, 0x2b, 0x2d, 0x98, 0x03, 0xfe, 0x08, 0xf0, + 0xaf, 0x70, 0x73, 0xb1, 0x6c, 0x9d, 0xcf, 0xb5, + 0x82, 0xd1, 0x23, 0xe9, 0x03, 0x5d, 0xd9, 0x0d, + 0xa5, 0x2a, 0x82, 0xbc, 0x8a, 0x5e, 0xdb, 0x2d, + 0xb0, 0x82, 0xc1, 0x97, 0xf9, 0x9b, 0xa4, 0x22, + 0x73, 0x86, 0x08, 0x62, 0xa0, 0x71, 0x03, 0x77, + 0x4a, 0xf1, 0x99, 0xe5, 0xb6, 0xb1, 0x5a, 0x43, + 0x98, 0xd8, 0x3d, 0xce, 0xb5, 0x9b, 0xc5, 0x2c, + 0x7e, 0x97, 0x35, 0xda, 0xf4, 0xa0, 0x8b, 0x45, + 0x38, 0xec, 0xb3, 0x27, 0xcb, 0xed, 0xe1, 0xeb, + 0x59, 0x25, 0x37, 0x13, 0xb7, 0x16, 0x18, 0xbf, + 0x35, 0xa7, 0x7f, 0xb4, 0xb5, 0x66, 0xb9, 0x35, + 0xb5, 0x95, 0xbd, 0xa3, 0xe2, 0x95, 0xd2, 0x1b, + 0x97, 0x50, 0xbc, 0x52, 0x85, 0xa7, 0xc9, 0x23, + 0x46, 0xf2, 0x08, 0x85, 0xea, 0x38, 0xcc, 0x92, + 0xb2, 0x31, 0x40, 0xe9, 0x1c, 0x18, 0x2b, 0xab, + 0xc6, 0xa0, 0x1d, 0xf5, 0xdd, 0x9e, 0x58, 0x43, + 0x97, 0x5e, 0x88, 0x61, 0x2e, 0x73, 0x30, 0x35, + 0xf5, 0x76, 0xba, 0x9a, 0xe8, 0x5b, 0xae, 0xb2, + 0xe8, 0x2c, 0xa4, 0xca, 0xdf, 0x13, 0x9c, 0x4d, + 0xd6, 0x09, 0x24, 0x0e, 0xd3, 0x42, 0x1c, 0xc3, + 0xa3, 0x85, 0x07, 0x0e, 0x61, 0x63, 0x2d, 0x85, + 0xd3, 0xad, 0xa5, 0x2d, 0x73, 0xda, 0x01, 0xab, + 0x75, 0x50, 0xae, 0x75, 0x60, 0xcd, 0xec, 0x5d, + 0x7f, 0xb4, 0xe6, 0xd5, 0xa7, 0x08, 0x78, 0x6e, + 0x37, 0x0d, 0xc6, 0x86, 0xd4, 0x9e, 0xda, 0xc4, + 0x76, 0x3b, 0x3b, 0x3d, 0xe7, 0x57, 0xc6, 0xe9, + 0xdb, 0x3d, 0x4b, 0x1b, 0x29, 0x20, 0xb4, 0xb8, + 0x76, 0x28, 0x82, 0x1a, 0xd2, 0xd6, 0x6b, 0xbb, + 0x86, 0xdb, 0xc0, 0x03, 0xa4, 0x7d, 0x70, 0x82, + 0x68, 0x34, 0x69, 0xd6, 0xbc, 0x4d, 0x13, 0xa1, + 0x95, 0xf1, 0x3c, 0x00, 0xf8, 0xdc, 0x5a, 0xe0, + 0x37, 0xc1, 0x23, 0xe4, 0x53, 0x99, 0x05, 0xbd, + 0x9d, 0xbe, 0x6e, 0x61, 0x99, 0xef, 0x37, 0x90, + 0xbd, 0xcc, 0x8f, 0x08, 0x18, 0x08, 0x03, 0x59, + 0xee, 0x2d, 0x77, 0x76, 0x16, 0x77, 0xf9, 0xc7, + 0xb2, 0xd8, 0xbe, 0x41, 0x33, 0xe4, 0x90, 0xdc, + 0xba, 0x41, 0xe2, 0xb6, 0x8e, 0xab, 0xb0, 0xef, + 0xee, 0xa0, 0x84, 0x45, 0x3d, 0x1e, 0x5f, 0xb3, + 0xd7, 0x17, 0x27, 0x2e, 0x86, 0x49, 0x9b, 0x71, + 0xa4, 0x32, 0x67, 0x10, 0x5a, 0xe7, 0x0d, 0xc5, + 0xa3, 0x2c, 0xc9, 0x05, 0xd5, 0xe5, 0xdd, 0x9d, + 0xc3, 0x8b, 0x24, 0xb7, 0x61, 0xc2, 0x5a, 0x69, + 0x57, 0x56, 0x80, 0x9a, 0x83, 0xa1, 0x04, 0x42, + 0x29, 0x0c, 0xc6, 0x2c, 0xa2, 0x18, 0x99, 0x1d, + 0x9c, 0xaf, 0x9a, 0xe1, 0xae, 0xfd, 0x73, 0xc8, + 0xfd, 0x59, 0x14, 0xd3, 0x87, 0x46, 0xfa, 0x8f, + 0xef, 0x20, 0x22, 0x22, 0x02, 0xdd, 0x67, 0xef, + 0x70, 0x7d, 0xab, 0x3e, 0xb2, 0xd2, 0xb7, 0x5a, + 0x7b, 0xdc, 0x1f, 0x6a, 0xcf, 0xac, 0x82, 0xe1, + 0x9d, 0x7b, 0xd3, 0x7c, 0xc1, 0xe1, 0x2b, 0x81, + 0x77, 0xe7, 0x5e, 0xf4, 0xdf, 0x30, 0x78, 0x4a, + 0xe0, 0x41, 0x98, 0xff, 0x00, 0x68, 0xde, 0xda, + 0x95, 0x23, 0x4a, 0x8a, 0x8f, 0xf6, 0x8d, 0xed, + 0xa9, 0x62, 0x83, 0x14, 0x5c, 0x19, 0x81, 0xff, + 0x00, 0xba, 0xb4, 0xfb, 0x4f, 0x94, 0x2e, 0xf5, + 0xc1, 0x98, 0x7b, 0xd5, 0xa7, 0xda, 0x7c, 0xa1, + 0x03, 0x2f, 0xf7, 0x9b, 0xbf, 0x3c, 0xfd, 0x62, + 0xbb, 0xd7, 0x06, 0x5f, 0xef, 0x37, 0x7e, 0x79, + 0xfa, 0xc5, 0x77, 0xa0, 0x3b, 0x51, 0x51, 0x27, + 0x59, 0x52, 0xce, 0xd4, 0x54, 0x49, 0xd6, 0x50, + 0x11, 0x17, 0xb8, 0x61, 0x7c, 0xf2, 0xb6, 0x36, + 0x6b, 0x3b, 0xbb, 0x80, 0x20, 0xf2, 0xc6, 0x39, + 0xef, 0x0d, 0x60, 0x25, 0xe7, 0x53, 0x46, 0xea, + 0xec, 0x8f, 0x29, 0xba, 0x70, 0xab, 0x8b, 0x59, + 0xdb, 0x35, 0x5e, 0xae, 0xaf, 0x6d, 0xb2, 0xa6, + 0x73, 0x16, 0xed, 0x0f, 0xb8, 0x22, 0xae, 0x27, + 0x73, 0xb2, 0x54, 0x34, 0xf9, 0x8d, 0xdc, 0xe6, + 0xb2, 0x4a, 0xe2, 0x3e, 0x68, 0xd0, 0x3b, 0xcb, + 0xad, 0x30, 0x5e, 0xfc, 0x67, 0x84, 0x32, 0xe6, + 0xf3, 0x98, 0xf1, 0xce, 0x91, 0x1b, 0xff, 0x00, + 0xc9, 0x35, 0xd4, 0xd2, 0x7a, 0xe6, 0xf0, 0x1e, + 0x35, 0x9e, 0xa4, 0x97, 0xd7, 0x37, 0x80, 0xf1, + 0xaa, 0xef, 0x38, 0xed, 0xf3, 0xc2, 0x78, 0xd6, + 0x79, 0xc7, 0x6f, 0x9e, 0x13, 0xc6, 0xaf, 0xe9, + 0x67, 0xab, 0x47, 0x1f, 0xea, 0x31, 0xf9, 0x6b, + 0x0f, 0x52, 0x4b, 0xeb, 0x9b, 0xc0, 0x78, 0xd3, + 0xa9, 0x25, 0xf5, 0xcd, 0xe0, 0x3c, 0x6a, 0xbd, + 0xce, 0x3b, 0x7c, 0xf0, 0x9e, 0x34, 0xe7, 0x1d, + 0xbe, 0x78, 0x4f, 0x1a, 0x7a, 0x59, 0xeb, 0x3f, + 0xa9, 0x57, 0xf2, 0xd6, 0x1e, 0xa4, 0x97, 0xd7, + 0x37, 0x80, 0xf1, 0xa7, 0x52, 0x4b, 0xeb, 0x9b, + 0xc0, 0x78, 0xd5, 0x7b, 0x9c, 0x76, 0xf9, 0xe1, + 0x3c, 0x69, 0xce, 0x3b, 0x7c, 0xf0, 0x9e, 0x34, + 0xf4, 0xb3, 0xd6, 0x7f, 0x52, 0xaf, 0xe5, 0xac, + 0x3d, 0x49, 0x2f, 0xae, 0x6f, 0x01, 0xe3, 0x4e, + 0xa4, 0x97, 0xd7, 0x37, 0x80, 0xf1, 0xaa, 0xef, + 0x38, 0xed, 0xf3, 0xc2, 0x78, 0xd3, 0x9c, 0x76, + 0xf9, 0xe1, 0x3c, 0x69, 0xe9, 0x67, 0xac, 0xfe, + 0xa7, 0x5e, 0x85, 0x8b, 0xa9, 0x25, 0xf5, 0xcd, + 0xe0, 0x3c, 0x69, 0xd4, 0x92, 0xfa, 0xe6, 0xf0, + 0x1e, 0x35, 0x5e, 0xe7, 0x1d, 0xbe, 0x78, 0x4f, + 0x1a, 0x73, 0x8e, 0xdf, 0x3c, 0x27, 0x8d, 0x3d, + 0x2c, 0xf5, 0x9f, 0xd4, 0xab, 0xf9, 0x6b, 0x0f, + 0x52, 0x4b, 0xeb, 0x9b, 0xc0, 0x78, 0xd3, 0xa9, + 0x25, 0xf5, 0xcd, 0xe0, 0x3c, 0x6a, 0xbd, 0xce, + 0x3b, 0x7c, 0xf0, 0x9e, 0x34, 0xe7, 0x1d, 0xbe, + 0x78, 0x4f, 0x1a, 0x7a, 0x59, 0xeb, 0x3f, 0xa9, + 0x57, 0xf2, 0xd6, 0x1e, 0xa4, 0x97, 0xd7, 0x37, + 0x80, 0xf1, 0xa7, 0x52, 0x4b, 0xeb, 0x9b, 0xc0, + 0x78, 0xd5, 0x7b, 0x9c, 0x76, 0xf9, 0xe1, 0x3c, + 0x69, 0xce, 0x3b, 0x7c, 0xf0, 0x9e, 0x34, 0xf4, + 0xb3, 0xd6, 0x7f, 0x52, 0xaf, 0xe5, 0xac, 0x3d, + 0x49, 0x2f, 0xae, 0x6f, 0x01, 0xe3, 0x4e, 0xa4, + 0x97, 0xd7, 0x37, 0x80, 0xf1, 0xaa, 0xf7, 0x38, + 0xed, 0xf3, 0xc2, 0x78, 0xd6, 0x39, 0xc7, 0x6f, + 0x9e, 0x13, 0xc6, 0x9e, 0x96, 0x7a, 0xcf, 0xea, + 0x55, 0xfc, 0xb5, 0x8b, 0xa9, 0x25, 0xf5, 0xcd, + 0xe0, 0x3c, 0x69, 0xd4, 0x92, 0xfa, 0xe6, 0xf0, + 0x1e, 0x35, 0x5d, 0xe7, 0x1d, 0xbe, 0x78, 0x4f, + 0x1a, 0x73, 0x8e, 0xdf, 0x3c, 0x27, 0x8d, 0x3d, + 0x2c, 0xf5, 0x9f, 0xd4, 0xeb, 0xd0, 0xb1, 0x75, + 0x24, 0xbe, 0xb9, 0xbc, 0x07, 0x8d, 0x3a, 0x92, + 0x5f, 0x5c, 0xde, 0x03, 0xc6, 0xab, 0xbc, 0xe3, + 0xb7, 0xcf, 0x09, 0xe3, 0x59, 0xe7, 0x1d, 0xbe, + 0x78, 0x4f, 0x1a, 0x7a, 0x59, 0xeb, 0x3f, 0xa9, + 0x57, 0xf2, 0xd6, 0x1e, 0xa4, 0x97, 0xd7, 0x37, + 0x80, 0xf1, 0xa7, 0x52, 0x4b, 0xeb, 0x9b, 0xc0, + 0x78, 0xd5, 0x7b, 0x9c, 0x76, 0xf9, 0xe1, 0x3c, + 0x69, 0xce, 0x3b, 0x7c, 0xf0, 0x9e, 0x34, 0xf4, + 0xb3, 0xd6, 0x7f, 0x52, 0xaf, 0xe5, 0xac, 0x3d, + 0x49, 0x2f, 0xae, 0x6f, 0x01, 0xe3, 0x4e, 0xa4, + 0x97, 0xd7, 0x37, 0x80, 0xf1, 0xaa, 0xf7, 0x38, + 0xed, 0xf3, 0xc2, 0x78, 0xd3, 0x9c, 0x76, 0xf9, + 0xe1, 0x3c, 0x69, 0xe9, 0x67, 0xac, 0xfe, 0xa5, + 0x5f, 0xcb, 0x58, 0x7a, 0x92, 0x5f, 0x5c, 0xde, + 0x03, 0xc6, 0x9d, 0x49, 0x2f, 0xae, 0x6f, 0x01, + 0xe3, 0x55, 0xee, 0x71, 0xdb, 0xe7, 0x84, 0xf1, + 0xa7, 0x38, 0xed, 0xf3, 0xc2, 0x78, 0xd3, 0xd2, + 0xcf, 0x59, 0xfd, 0x4a, 0xbf, 0x96, 0xb0, 0xf5, + 0x24, 0xbe, 0xb9, 0xbc, 0x07, 0x8d, 0x3a, 0x92, + 0x5f, 0x5c, 0xde, 0x03, 0xc6, 0xab, 0xdc, 0xe3, + 0xb7, 0xcf, 0x09, 0xe3, 0x4e, 0x71, 0xdb, 0xe7, + 0x84, 0xf1, 0xa7, 0xa5, 0x9e, 0xb3, 0xfa, 0x95, + 0x7f, 0x2d, 0x61, 0xea, 0x49, 0x7d, 0x73, 0x78, + 0x0f, 0x1a, 0x75, 0x24, 0xbe, 0xb9, 0xbc, 0x07, + 0x8d, 0x57, 0xb9, 0xc7, 0x6f, 0x9e, 0x13, 0xc6, + 0x9c, 0xe3, 0xb7, 0xcf, 0x09, 0xe3, 0x4f, 0x4b, + 0x3d, 0x67, 0xf5, 0x2a, 0xfe, 0x5a, 0xc3, 0xd4, + 0x92, 0xfa, 0xe6, 0xf0, 0x1e, 0x34, 0xea, 0x49, + 0x7d, 0x73, 0x78, 0x0f, 0x1a, 0xaf, 0x73, 0x8e, + 0xdf, 0x3c, 0x27, 0x8d, 0x63, 0x9c, 0x76, 0xf9, + 0xe1, 0x3c, 0x69, 0xe9, 0x67, 0xac, 0xfe, 0xa5, + 0x1f, 0x96, 0xb1, 0x75, 0x24, 0xbe, 0xb9, 0xbc, + 0x07, 0x8d, 0x3a, 0x92, 0x5f, 0x5c, 0xde, 0x03, + 0xc6, 0xab, 0xbc, 0xe3, 0xb7, 0xcf, 0x09, 0xe3, + 0x59, 0xe7, 0x1d, 0xbe, 0x78, 0x4f, 0x1a, 0x7a, + 0x59, 0xeb, 0x3f, 0xa9, 0x57, 0xf2, 0xd6, 0x1e, + 0xa4, 0x97, 0xd7, 0x37, 0x80, 0xf1, 0xa7, 0x52, + 0x4b, 0xeb, 0x9b, 0xc0, 0x78, 0xd5, 0x7b, 0x9c, + 0x76, 0xf9, 0xe1, 0x3c, 0x69, 0xce, 0x3b, 0x7c, + 0xf0, 0x9e, 0x34, 0xf4, 0xb3, 0xd6, 0x7f, 0x52, + 0xaf, 0xe5, 0xac, 0x3d, 0x49, 0x2f, 0xae, 0x6f, + 0x01, 0xe3, 0x4e, 0xa4, 0x97, 0xd7, 0x37, 0x80, + 0xf1, 0xaa, 0xf7, 0x38, 0xed, 0xf3, 0xc2, 0x78, + 0xd3, 0x9c, 0x76, 0xf9, 0xe1, 0x3c, 0x69, 0xe9, + 0x67, 0xac, 0xfe, 0xa5, 0x5f, 0xcb, 0x58, 0x7a, + 0x92, 0x5f, 0x5c, 0xde, 0x03, 0xc6, 0x9d, 0x49, + 0x2f, 0xae, 0x6f, 0x01, 0xe3, 0x55, 0xee, 0x71, + 0xdb, 0xe7, 0x84, 0xf1, 0xa7, 0x38, 0xed, 0xf3, + 0xc2, 0x78, 0xd3, 0xd2, 0xcf, 0x59, 0xfd, 0x4a, + 0xbf, 0x96, 0xb0, 0xf5, 0x24, 0xbe, 0xb9, 0xbc, + 0x07, 0x8d, 0x3a, 0x92, 0x5f, 0x5c, 0xde, 0x03, + 0xc6, 0xab, 0xdc, 0xe3, 0xb7, 0xcf, 0x09, 0xe3, + 0x4e, 0x71, 0xdb, 0xe7, 0x84, 0xf1, 0xa7, 0xa5, + 0x9e, 0xb3, 0xfa, 0x95, 0x7f, 0x2d, 0x61, 0xea, + 0x59, 0x47, 0xfc, 0x66, 0xf0, 0x15, 0xa6, 0x5c, + 0xae, 0xe9, 0x95, 0x70, 0x01, 0xe0, 0x7c, 0xd2, + 0xa1, 0x04, 0x8e, 0x1b, 0xa4, 0x7e, 0x5d, 0xb5, + 0xd5, 0x6f, 0x9b, 0x5e, 0xdb, 0x9a, 0xb6, 0x42, + 0xf0, 0x3f, 0x31, 0xd5, 0x20, 0xf1, 0x24, 0xf9, + 0x6b, 0x7b, 0x2d, 0xaa, 0x63, 0xf9, 0x8d, 0x26, + 0x62, 0x2d, 0x4e, 0x0d, 0xc4, 0x10, 0x48, 0x3a, + 0x08, 0xd6, 0x11, 0x48, 0xc7, 0x25, 0xae, 0x6d, + 0x09, 0x73, 0x3f, 0x57, 0x72, 0xcd, 0x63, 0xb3, + 0xc4, 0xa3, 0xde, 0xd7, 0x31, 0xc5, 0xae, 0x14, + 0x73, 0x75, 0x85, 0xc2, 0xd1, 0x31, 0x3a, 0x4b, + 0x6d, 0x6d, 0x5b, 0x46, 0xea, 0xce, 0xb5, 0x61, + 0x11, 0x14, 0x2c, 0x2f, 0x51, 0x7e, 0xd5, 0x9e, + 0x73, 0x7c, 0x21, 0x79, 0x5e, 0xa2, 0xfd, 0xab, + 0x3c, 0xe6, 0xf8, 0x42, 0x0e, 0x6d, 0xb0, 0xfe, + 0x65, 0x1f, 0xd8, 0x8f, 0xac, 0xe5, 0x04, 0xa7, + 0x76, 0xc3, 0xf9, 0x94, 0x7f, 0x62, 0x3e, 0xb3, + 0x94, 0x12, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x2e, + 0x9c, 0xbe, 0xc2, 0x7b, 0xf9, 0x4c, 0x70, 0xd0, + 0x61, 0x69, 0x7b, 0x9c, 0xed, 0x40, 0x0d, 0xce, + 0xea, 0xe6, 0x22, 0x80, 0xef, 0x0a, 0xf7, 0xb4, + 0xa0, 0x22, 0x93, 0x83, 0x67, 0xaf, 0x26, 0x85, + 0xb2, 0xcb, 0x24, 0x56, 0xed, 0x90, 0x56, 0x36, + 0xca, 0xea, 0x12, 0x37, 0xd7, 0x1d, 0xed, 0x95, + 0xcd, 0x94, 0xe6, 0x0b, 0x91, 0x85, 0xc0, 0x62, + 0x1a, 0x6a, 0x08, 0x3b, 0xa0, 0xa0, 0xd0, 0x88, + 0x88, 0x0b, 0xb2, 0xca, 0x1b, 0x2f, 0x67, 0x9a, + 0xea, 0xec, 0x97, 0xf3, 0x64, 0x32, 0x2b, 0x76, + 0x38, 0x35, 0xcf, 0x73, 0xb7, 0x6b, 0xbc, 0x17, + 0x8c, 0xba, 0xc6, 0x4b, 0xfb, 0xa6, 0xdb, 0x46, + 0xe0, 0xc7, 0xb8, 0x12, 0x1c, 0xea, 0xd3, 0x47, + 0x69, 0x6e, 0xb3, 0xcb, 0xd8, 0x65, 0xb8, 0x7d, + 0xd6, 0x23, 0x6f, 0x66, 0x4b, 0x64, 0xe6, 0xc1, + 0x2e, 0x73, 0x81, 0xf2, 0x1b, 0xdb, 0x41, 0xe3, + 0x32, 0xb6, 0xb7, 0x84, 0x5b, 0x5c, 0x5a, 0x62, + 0x10, 0xdd, 0x46, 0x64, 0x64, 0x6f, 0xd2, 0x5a, + 0x5a, 0x70, 0x9d, 0x2b, 0x8d, 0x74, 0xdf, 0xdc, + 0xcd, 0x73, 0x38, 0x32, 0x45, 0xcd, 0x35, 0xa3, + 0x04, 0x31, 0x00, 0x40, 0x6b, 0x06, 0xe3, 0x6b, + 0xad, 0x77, 0x33, 0x67, 0x8b, 0x22, 0x64, 0x97, + 0xb7, 0x71, 0xda, 0x3e, 0x50, 0x0b, 0x63, 0x75, + 0x6b, 0xa7, 0x7d, 0x04, 0x42, 0x2e, 0xdc, 0xcb, + 0x2a, 0xb8, 0xcb, 0x5e, 0xd1, 0x2d, 0x24, 0x8e, + 0x41, 0x58, 0xe4, 0x66, 0x90, 0x57, 0x12, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x29, 0x2d, 0x9b, 0xfe, 0x73, 0x6f, 0xdb, + 0x77, 0xd4, 0x2a, 0x35, 0x49, 0x6c, 0xdf, 0xf3, + 0x9b, 0x7e, 0xdb, 0xbe, 0xa1, 0x41, 0x35, 0x98, + 0x7b, 0xec, 0xde, 0x77, 0xc8, 0x17, 0x3a, 0xe8, + 0xcc, 0x3d, 0xf6, 0x6f, 0x3b, 0xe4, 0x0b, 0x9d, + 0x01, 0x11, 0x10, 0x36, 0xb3, 0xdc, 0x2c, 0x7f, + 0xb5, 0xf5, 0x42, 0xac, 0x2b, 0x3e, 0xd6, 0x7b, + 0x85, 0x8f, 0xf6, 0xbe, 0xa8, 0x55, 0x84, 0x04, + 0x44, 0x40, 0x44, 0x4e, 0xde, 0xa4, 0x13, 0xb9, + 0x67, 0xfa, 0x67, 0x33, 0xf3, 0x87, 0x81, 0xaa, + 0x09, 0x4c, 0xe4, 0xf9, 0x86, 0x5b, 0x0e, 0x5d, + 0x73, 0x65, 0x7e, 0xe9, 0x00, 0x9d, 0xc0, 0xfe, + 0xad, 0xb5, 0xd1, 0x40, 0x98, 0x36, 0x48, 0x0a, + 0x09, 0x6e, 0xbb, 0x1a, 0x37, 0xbf, 0xb2, 0x83, + 0x61, 0xff, 0x00, 0x47, 0x0f, 0xb7, 0xfe, 0xf1, + 0x5c, 0xbb, 0x35, 0x1b, 0xa4, 0xce, 0x60, 0x0d, + 0xfc, 0xdc, 0x4e, 0x71, 0xec, 0x00, 0xe5, 0xd3, + 0x67, 0x7f, 0x93, 0x1c, 0x9c, 0x65, 0xd7, 0x8f, + 0x95, 0xa0, 0x48, 0xe7, 0x82, 0xc6, 0xd4, 0xd3, + 0x11, 0x2d, 0xd3, 0x4d, 0xe5, 0x96, 0x66, 0xb9, + 0x4e, 0x5b, 0x0c, 0x9d, 0x56, 0xc9, 0x24, 0xb9, + 0x94, 0x16, 0xf3, 0xd2, 0xe8, 0xc2, 0x0a, 0x0e, + 0xcc, 0xaa, 0x56, 0xcb, 0x9b, 0x66, 0xe1, 0x87, + 0xf6, 0xad, 0x79, 0x6f, 0x70, 0xd3, 0xe5, 0x55, + 0x4a, 0x10, 0xd2, 0x0f, 0x94, 0xdd, 0x07, 0xb8, + 0xbb, 0x72, 0xcc, 0xc2, 0x4b, 0x0b, 0xd6, 0xdd, + 0x01, 0x8f, 0xd6, 0x03, 0xba, 0x1d, 0xe5, 0x29, + 0x27, 0x0d, 0x98, 0x74, 0xe6, 0xf0, 0xcd, 0x2d, + 0x0b, 0xb9, 0xc3, 0x6b, 0x87, 0xf3, 0x8e, 0x9a, + 0x76, 0x90, 0x7a, 0xda, 0x8f, 0x16, 0x1c, 0xba, + 0x23, 0xe5, 0x32, 0x1a, 0x9e, 0xe8, 0x68, 0xf9, + 0x14, 0x2d, 0xac, 0xc6, 0xde, 0xea, 0x19, 0xc1, + 0xa1, 0x89, 0xed, 0x75, 0x7b, 0x47, 0x4a, 0xdf, + 0x9a, 0xe6, 0x0e, 0xcc, 0x6f, 0x1d, 0x70, 0x46, + 0x16, 0x00, 0x1b, 0x1b, 0x37, 0x9a, 0x17, 0x19, + 0x15, 0x04, 0x20, 0xb8, 0x7b, 0x33, 0x62, 0xda, + 0x39, 0xaf, 0xf4, 0x73, 0x4d, 0xb7, 0xf6, 0x80, + 0x77, 0x2a, 0x46, 0x05, 0x1d, 0x92, 0x4a, 0x65, + 0xcb, 0xf3, 0x89, 0x7f, 0xe2, 0x48, 0xd0, 0xea, + 0x6e, 0xe9, 0xc6, 0x57, 0xa9, 0xf3, 0xfb, 0x49, + 0x32, 0x43, 0x6c, 0xdc, 0x5e, 0xd8, 0xe8, 0x9b, + 0x0b, 0x8e, 0x1d, 0x14, 0xad, 0x0f, 0x8d, 0xda, + 0x51, 0xd9, 0x2e, 0x64, 0xcb, 0x19, 0xde, 0x2e, + 0x1a, 0x5f, 0x6d, 0x3b, 0x0b, 0x26, 0x03, 0x49, + 0xd3, 0xba, 0x10, 0x6e, 0xd9, 0x4c, 0x5d, 0x73, + 0x05, 0x3e, 0x63, 0xeb, 0xda, 0xc2, 0xbb, 0x6d, + 0xb0, 0xf5, 0x66, 0x7b, 0x87, 0xc9, 0xc6, 0x69, + 0xdf, 0x5a, 0x6d, 0xae, 0xb2, 0x5c, 0xab, 0x9c, + 0xb9, 0xb3, 0x95, 0xf7, 0x57, 0x2e, 0x69, 0x64, + 0x2d, 0x73, 0x70, 0x86, 0x57, 0xb2, 0xb9, 0xac, + 0xb3, 0x28, 0x21, 0xcb, 0x33, 0x0b, 0x79, 0x9c, + 0xe3, 0x3d, 0xd0, 0x18, 0x28, 0x09, 0x15, 0xa6, + 0xfa, 0x0e, 0x8b, 0x3f, 0xf4, 0xad, 0xef, 0xdb, + 0xb7, 0xc1, 0x1a, 0xd3, 0x65, 0x97, 0xc1, 0xd5, + 0x9e, 0xdb, 0x98, 0xcf, 0x24, 0x56, 0x78, 0xf0, + 0xb2, 0x16, 0x69, 0x2e, 0x70, 0x2b, 0xd6, 0x57, + 0x7d, 0x97, 0x0c, 0xb2, 0xe3, 0x2d, 0xbf, 0x73, + 0xd8, 0xc9, 0x9f, 0x8f, 0x1b, 0x05, 0x77, 0xbd, + 0x15, 0xb6, 0x3b, 0xdc, 0xa6, 0xe3, 0x2e, 0x76, + 0x57, 0x71, 0x2b, 0xe1, 0x8e, 0x29, 0x0b, 0xad, + 0xe6, 0xc3, 0x5a, 0x82, 0x49, 0x15, 0x1b, 0xfa, + 0x50, 0x6f, 0x12, 0xd9, 0x49, 0xb3, 0x77, 0xbe, + 0xc5, 0x0b, 0xa1, 0x8d, 0xb2, 0x01, 0x47, 0xbb, + 0x13, 0x9c, 0xef, 0x17, 0x4b, 0x96, 0x8c, 0xd8, + 0x53, 0x67, 0xb2, 0xca, 0x79, 0x14, 0xab, 0xbb, + 0x78, 0x56, 0x63, 0xbf, 0xc9, 0x19, 0x97, 0xdc, + 0x65, 0x8c, 0x74, 0xac, 0x8d, 0xf4, 0x22, 0x77, + 0x37, 0x13, 0x9e, 0xea, 0x6b, 0xa6, 0xe6, 0xa5, + 0xae, 0xd2, 0xf6, 0xd5, 0xd9, 0x4b, 0x6c, 0xb3, + 0x58, 0xa5, 0x6c, 0x0d, 0x78, 0x75, 0xbd, 0xc3, + 0x5a, 0x74, 0x13, 0xb9, 0x53, 0xa2, 0xba, 0xd0, + 0x66, 0xcc, 0xbb, 0xe1, 0x6b, 0xe0, 0x75, 0x09, + 0x87, 0xf7, 0x2a, 0xbb, 0x73, 0x29, 0x32, 0xc8, + 0xb2, 0xec, 0xb0, 0x5e, 0x41, 0x24, 0xc3, 0x9a, + 0x1c, 0xd7, 0x36, 0xe0, 0xda, 0x68, 0x6d, 0x6b, + 0xa4, 0x2d, 0x72, 0x4b, 0x66, 0xed, 0x97, 0xba, + 0x6d, 0xa3, 0x1d, 0x1d, 0xbb, 0x24, 0x0c, 0x69, + 0x79, 0xab, 0x9e, 0x41, 0x6d, 0x5c, 0xee, 0xde, + 0xa5, 0xc9, 0x0d, 0xee, 0x5b, 0x7d, 0x96, 0xc3, + 0x63, 0x98, 0x48, 0xfb, 0x79, 0x6d, 0xbf, 0x67, + 0x33, 0x5b, 0x88, 0x61, 0xf9, 0xa8, 0x17, 0xf9, + 0x95, 0xa4, 0x99, 0x3b, 0x6c, 0xac, 0xed, 0x66, + 0x86, 0x21, 0x20, 0x73, 0x64, 0x7d, 0x0b, 0x75, + 0xe9, 0xf1, 0xaa, 0xa1, 0x4f, 0x92, 0x7b, 0x4a, + 0x57, 0x33, 0xbf, 0xb4, 0x36, 0x70, 0x65, 0xb6, + 0x04, 0xba, 0xde, 0x07, 0x62, 0x74, 0xae, 0x14, + 0x2f, 0x7e, 0xfd, 0x37, 0x94, 0x51, 0x1a, 0x08, + 0x08, 0x2d, 0x99, 0xe6, 0x73, 0x77, 0x60, 0xeb, + 0x58, 0xe0, 0xc1, 0x81, 0xf1, 0x07, 0x3b, 0x1b, + 0x71, 0x2e, 0x6b, 0xc9, 0x5d, 0x9b, 0xec, 0xf3, + 0xaf, 0xe6, 0x18, 0x6e, 0x2d, 0x5f, 0x84, 0xe1, + 0x24, 0x34, 0x8a, 0x36, 0xbe, 0x2e, 0xad, 0x4e, + 0x5c, 0x39, 0xf6, 0x65, 0x6d, 0x7d, 0x25, 0xb3, + 0xad, 0x8b, 0x88, 0x8a, 0x2c, 0x0f, 0xa8, 0x2d, + 0xd3, 0xd8, 0x5e, 0xac, 0xb3, 0x1b, 0x48, 0xf2, + 0x6b, 0xcc, 0xba, 0x72, 0xe0, 0xf9, 0xc9, 0x31, + 0xb8, 0x36, 0xa3, 0xbb, 0xc0, 0x82, 0x46, 0xfe, + 0x4c, 0xb6, 0x2c, 0xaf, 0x2c, 0xf6, 0xc8, 0x24, + 0x9d, 0xa6, 0x20, 0x63, 0x31, 0xbb, 0x0d, 0x34, + 0x36, 0xb5, 0xad, 0x17, 0x1d, 0xc6, 0x63, 0x63, + 0x26, 0x56, 0xcb, 0x1b, 0x4b, 0x59, 0xa2, 0x84, + 0xcc, 0xc3, 0xce, 0x49, 0x42, 0xcf, 0x2b, 0x4f, + 0x8c, 0x17, 0x98, 0xaf, 0xb2, 0xdb, 0xec, 0xb6, + 0x2b, 0x1c, 0xc5, 0xee, 0xb7, 0x96, 0xd8, 0x9e, + 0x6a, 0x76, 0x8c, 0x5e, 0x29, 0xdc, 0x5a, 0xb3, + 0x4b, 0xfb, 0x43, 0x63, 0x16, 0x57, 0x63, 0x89, + 0xd6, 0xf1, 0x92, 0xe7, 0xca, 0xe1, 0x42, 0xe7, + 0x6e, 0x68, 0xde, 0x41, 0xbb, 0x6b, 0xab, 0xd6, + 0x6c, 0xa6, 0xa1, 0x03, 0x69, 0xbd, 0xad, 0xcb, + 0x66, 0x64, 0x49, 0xc9, 0xb2, 0x7a, 0xeb, 0xc4, + 0xb3, 0x71, 0x7d, 0x96, 0x5d, 0xdb, 0xc3, 0xd6, + 0xf0, 0xcf, 0x15, 0xd4, 0x31, 0x81, 0x56, 0x36, + 0x98, 0xda, 0x34, 0xeb, 0x3b, 0xeb, 0xd6, 0xd0, + 0xce, 0xd7, 0xe5, 0xb9, 0x6c, 0x91, 0x33, 0x9a, + 0xf2, 0x9f, 0x1c, 0x7b, 0xc0, 0x0d, 0x01, 0x07, + 0x3e, 0xd6, 0xff, 0x00, 0x35, 0x1f, 0x62, 0xdf, + 0x95, 0x74, 0x66, 0xfa, 0x0e, 0x45, 0xbf, 0x81, + 0x9e, 0x18, 0x92, 0xfa, 0xef, 0x20, 0xcc, 0x9d, + 0x1d, 0xe5, 0xcc, 0xb2, 0x47, 0x33, 0x18, 0x18, + 0xf8, 0x9a, 0xda, 0x97, 0x01, 0xb9, 0x55, 0xcf, + 0x9a, 0x66, 0xd6, 0x77, 0x72, 0xe5, 0xcf, 0x80, + 0x3a, 0x36, 0xda, 0xfe, 0xd1, 0x94, 0x3e, 0x2f, + 0x8c, 0xcf, 0x14, 0x6f, 0xea, 0x41, 0xd3, 0x99, + 0xd9, 0xdc, 0x5e, 0xed, 0x3b, 0xa0, 0x81, 0xe6, + 0x27, 0x16, 0x34, 0xba, 0x41, 0x51, 0x84, 0x61, + 0x15, 0x59, 0xcb, 0x1d, 0x92, 0xdb, 0xe6, 0xf0, + 0xc1, 0x6c, 0xd9, 0x2e, 0xae, 0x0b, 0xcb, 0x4c, + 0xef, 0x34, 0x63, 0x4d, 0x0d, 0x4b, 0x5b, 0xbe, + 0xb5, 0x1c, 0xf6, 0xd6, 0x3d, 0xa0, 0x39, 0x8c, + 0x61, 0xcf, 0xb7, 0x91, 0xa2, 0x37, 0xe8, 0xa3, + 0xb4, 0x0d, 0x60, 0x2c, 0x43, 0x71, 0x90, 0x65, + 0xf7, 0x8d, 0xbb, 0x82, 0x49, 0x2e, 0x5d, 0x8b, + 0xc5, 0x65, 0x30, 0xb6, 0x30, 0x4e, 0x97, 0x76, + 0x4e, 0x94, 0x1e, 0xec, 0xff, 0x00, 0xd5, 0xf2, + 0x7d, 0xb4, 0x9e, 0x02, 0xb6, 0xe4, 0x54, 0xf8, + 0x8a, 0xf8, 0xfe, 0x77, 0xeb, 0x70, 0x76, 0xf1, + 0x2e, 0x13, 0x98, 0x58, 0xc3, 0xb4, 0x0d, 0xcc, + 0x21, 0x73, 0xa5, 0x81, 0xce, 0x2f, 0x92, 0xad, + 0xc2, 0x41, 0x7e, 0x2a, 0xd3, 0x7d, 0x6c, 0x93, + 0x32, 0xcb, 0xad, 0x33, 0x56, 0xe6, 0x36, 0x0e, + 0x92, 0x4e, 0x71, 0xee, 0x75, 0xc3, 0x1c, 0x29, + 0xa1, 0xdb, 0x8d, 0xe1, 0x41, 0x1f, 0x96, 0x13, + 0xd6, 0xb6, 0xdb, 0xfc, 0xf3, 0x6b, 0xc2, 0xac, + 0x71, 0xd3, 0xaf, 0x73, 0x9a, 0x74, 0x71, 0xc3, + 0x81, 0xaa, 0x3e, 0x29, 0x76, 0x76, 0xd6, 0xf0, + 0xe6, 0x11, 0xcb, 0x24, 0x85, 0xa4, 0xbe, 0x3b, + 0x6c, 0x14, 0xa3, 0x8f, 0x67, 0xb0, 0xb4, 0x65, + 0xd9, 0xc4, 0x71, 0xdd, 0x5f, 0x5c, 0xde, 0x12, + 0x1d, 0x77, 0x13, 0x9a, 0xcc, 0x20, 0xb8, 0x07, + 0x13, 0xab, 0x42, 0x08, 0x84, 0x4e, 0xfa, 0x20, + 0x22, 0x22, 0x02, 0xdd, 0x69, 0xef, 0x70, 0x7d, + 0xab, 0x3e, 0xb2, 0xd2, 0xb7, 0x5a, 0x7b, 0xdc, + 0x1f, 0x6a, 0xcf, 0xac, 0x82, 0xe1, 0x9d, 0x7b, + 0xd3, 0x7c, 0xc1, 0xe1, 0x2b, 0x81, 0x77, 0xe7, + 0x5e, 0xf4, 0xdf, 0x30, 0x78, 0x4a, 0xe0, 0x41, + 0x98, 0xff, 0x00, 0x68, 0xde, 0xda, 0x96, 0x2a, + 0x26, 0x3f, 0xda, 0x37, 0xb6, 0xa5, 0x8a, 0x0c, + 0x2e, 0x0c, 0xc3, 0xde, 0xad, 0x3e, 0xd3, 0xe5, + 0x0b, 0xbd, 0x70, 0x66, 0x1e, 0xf5, 0x69, 0xf6, + 0x9f, 0x28, 0x40, 0xcb, 0xfd, 0xe6, 0xef, 0xcf, + 0x3f, 0x58, 0xae, 0xf5, 0xc1, 0x97, 0xfb, 0xcd, + 0xdf, 0x9e, 0x7e, 0xb1, 0x5d, 0xe8, 0x0e, 0xd4, + 0x54, 0x49, 0xd6, 0x54, 0xb3, 0xb5, 0x15, 0x12, + 0x75, 0x94, 0x0d, 0xda, 0x6f, 0xa9, 0x0b, 0x57, + 0x8b, 0x3c, 0xbe, 0x5b, 0xd2, 0x2a, 0xe3, 0xa1, + 0x9c, 0x38, 0x47, 0x7d, 0x47, 0xd1, 0x74, 0xe6, + 0xe4, 0xb7, 0x20, 0x84, 0x0d, 0x18, 0x9c, 0xd0, + 0x7e, 0x91, 0x56, 0xa4, 0x6b, 0x68, 0x8e, 0x72, + 0xa6, 0x5b, 0x4d, 0x71, 0xda, 0xd1, 0xe3, 0x10, + 0x82, 0x7c, 0xae, 0x91, 0xe6, 0x47, 0x9a, 0xb9, + 0xe4, 0x97, 0x3b, 0x74, 0xd5, 0x79, 0xc4, 0xb5, + 0xe2, 0x4a, 0xad, 0xf1, 0xc3, 0x87, 0x27, 0x85, + 0xa4, 0xf8, 0xf5, 0x71, 0x96, 0xdc, 0x49, 0x89, + 0x6a, 0xaa, 0x55, 0x0d, 0x1b, 0x71, 0x26, 0x25, + 0xaa, 0xa9, 0x54, 0x34, 0x6d, 0xc4, 0x95, 0x5a, + 0xea, 0xb1, 0x8b, 0x80, 0x21, 0xa3, 0x6e, 0x24, + 0xc4, 0xa6, 0x2d, 0x76, 0x6d, 0xb7, 0x36, 0xd1, + 0xdc, 0x73, 0xe5, 0xbc, 0xe0, 0xc5, 0x84, 0x34, + 0x1a, 0x2d, 0x8e, 0xd9, 0x6a, 0x34, 0x98, 0xee, + 0x6a, 0xee, 0xcb, 0x68, 0x3b, 0xc5, 0x73, 0x9c, + 0xf4, 0x89, 0x98, 0xe4, 0xef, 0x1e, 0x53, 0x34, + 0xc4, 0x4c, 0x44, 0x69, 0x3c, 0x61, 0x07, 0x89, + 0x31, 0x2c, 0xdd, 0x5b, 0xcd, 0x69, 0x39, 0x82, + 0x71, 0x47, 0x8d, 0x22, 0x9a, 0x6a, 0x37, 0xc2, + 0xd3, 0x88, 0x2e, 0x91, 0xc6, 0x35, 0x8f, 0x07, + 0x09, 0x89, 0x8d, 0x75, 0x8d, 0x34, 0x6d, 0xc4, + 0x98, 0x96, 0xac, 0x5d, 0xc5, 0xd5, 0x97, 0x58, + 0xc9, 0x98, 0x4e, 0x61, 0x89, 0xed, 0x61, 0x0d, + 0x2f, 0xab, 0xab, 0x4d, 0x04, 0x0d, 0xce, 0xda, + 0x4c, 0xc4, 0x46, 0xb2, 0x9a, 0xd2, 0xd6, 0x98, + 0xac, 0x46, 0xb3, 0x3e, 0x10, 0xd5, 0x89, 0x31, + 0x2d, 0x99, 0x85, 0x94, 0x96, 0x13, 0x88, 0x24, + 0x73, 0x5e, 0x4b, 0x43, 0xaa, 0xde, 0xcf, 0x6d, + 0x73, 0x62, 0x48, 0x9d, 0x62, 0x26, 0x38, 0xeb, + 0xe0, 0x5a, 0x96, 0xad, 0xa6, 0xb3, 0x1a, 0x5a, + 0x3c, 0x61, 0xb7, 0x12, 0xc6, 0x25, 0xae, 0xa9, + 0x54, 0xd5, 0x11, 0x1a, 0xf1, 0x6d, 0xc5, 0xff, + 0x00, 0xca, 0x62, 0x5b, 0xb2, 0xcb, 0x31, 0x7f, + 0x74, 0x20, 0x2f, 0xe6, 0xc1, 0x69, 0x76, 0x20, + 0x01, 0x3a, 0x3b, 0x6a, 0x5f, 0xe1, 0x56, 0x74, + 0x93, 0xc8, 0x1c, 0x6a, 0x96, 0xcb, 0x5a, 0xce, + 0x92, 0xeb, 0x8f, 0xcb, 0x65, 0xbd, 0x77, 0x52, + 0x38, 0x20, 0xb1, 0x26, 0x25, 0x23, 0x98, 0xe4, + 0x13, 0xd9, 0xc4, 0x66, 0x89, 0xe2, 0x68, 0xdb, + 0xe5, 0x8a, 0x51, 0xc0, 0x6f, 0xa8, 0x9c, 0x5b, + 0xca, 0xd5, 0xbc, 0x5a, 0x35, 0x8f, 0x62, 0xb9, + 0x31, 0x5f, 0x1c, 0xed, 0xbc, 0x69, 0x33, 0x1a, + 0xfe, 0x0d, 0xb8, 0x93, 0x12, 0xd5, 0x88, 0x6f, + 0xa6, 0x25, 0x2a, 0x69, 0xff, 0x00, 0x96, 0xdc, + 0x49, 0x89, 0x6a, 0xc5, 0xd9, 0x5d, 0x79, 0x75, + 0x84, 0x99, 0x84, 0xce, 0x8a, 0x37, 0xb5, 0x8e, + 0x63, 0x71, 0x12, 0xea, 0xd3, 0x58, 0x1b, 0x9d, + 0xb4, 0x99, 0xd2, 0x26, 0x67, 0xc2, 0x13, 0x5a, + 0xcd, 0xa6, 0x2b, 0x58, 0xd6, 0x67, 0xc2, 0x1a, + 0x71, 0x26, 0x25, 0xb2, 0xfa, 0xce, 0x4b, 0x2b, + 0x8e, 0x62, 0x47, 0x07, 0x38, 0x00, 0xea, 0x8d, + 0x5a, 0x7b, 0x6b, 0x9b, 0x10, 0xdf, 0x48, 0x98, + 0x98, 0x89, 0x8f, 0x6a, 0x2d, 0x13, 0x59, 0x98, + 0xb7, 0x09, 0xac, 0xe9, 0x3f, 0x16, 0xdc, 0x49, + 0x89, 0x6a, 0xc4, 0x95, 0x42, 0x78, 0x36, 0xe2, + 0x4c, 0x4b, 0x56, 0x21, 0xbe, 0xb6, 0x5b, 0xc4, + 0x6e, 0x2e, 0x23, 0x81, 0xa4, 0x35, 0xd2, 0xb8, + 0x34, 0x13, 0xa8, 0x57, 0x7d, 0x26, 0x74, 0xf1, + 0x22, 0x26, 0x66, 0x22, 0x3c, 0x67, 0xc1, 0x9c, + 0x49, 0x5a, 0x6b, 0x5d, 0x59, 0x96, 0x55, 0x36, + 0x5c, 0xd6, 0x3a, 0x49, 0x19, 0x20, 0x90, 0x90, + 0x30, 0xd7, 0x45, 0x3b, 0x6b, 0xb2, 0xd7, 0x23, + 0x8a, 0x7c, 0xbd, 0xb7, 0x66, 0x57, 0x35, 0xc5, + 0x85, 0xc4, 0x53, 0x46, 0x85, 0x59, 0xc9, 0x58, + 0x88, 0x9d, 0x78, 0x4f, 0x07, 0x58, 0xf2, 0xf9, + 0x26, 0xd3, 0x5d, 0x34, 0xb5, 0x63, 0x5d, 0x11, + 0x38, 0x93, 0x12, 0xd4, 0x1d, 0xa2, 0xa9, 0x8b, + 0xb8, 0xad, 0xab, 0x97, 0x83, 0x6e, 0x24, 0xc4, + 0xb5, 0x55, 0x2a, 0x91, 0xc6, 0x74, 0x83, 0x4f, + 0x0f, 0x7b, 0x6e, 0x24, 0xc4, 0xb5, 0x62, 0xed, + 0x25, 0x50, 0x6d, 0xc4, 0x98, 0x96, 0xaa, 0xa5, + 0x50, 0xd2, 0x5b, 0x71, 0x26, 0x25, 0xaa, 0xa9, + 0x54, 0x34, 0x6d, 0xc4, 0xb1, 0x89, 0x6b, 0xaa, + 0xcd, 0x50, 0x88, 0x74, 0xda, 0x5e, 0x3e, 0xd2, + 0xe1, 0x93, 0xb0, 0xf9, 0x07, 0xc6, 0x1b, 0xed, + 0xdd, 0x53, 0xf9, 0xb4, 0x4d, 0x3c, 0xdd, 0xcb, + 0x3c, 0x99, 0x45, 0x15, 0x5a, 0xa3, 0x77, 0xf2, + 0xae, 0xb5, 0x68, 0x27, 0x16, 0x43, 0x68, 0xe7, + 0x69, 0x21, 0xad, 0xd3, 0xdc, 0xa2, 0xcd, 0xe6, + 0x23, 0xc2, 0x5e, 0x87, 0xf2, 0xfb, 0x4e, 0xb7, + 0xa7, 0xb3, 0xee, 0x87, 0x0a, 0x22, 0x2c, 0xef, + 0x40, 0x5e, 0xa2, 0xfd, 0xab, 0x3c, 0xe6, 0xf8, + 0x42, 0xf2, 0xbd, 0x45, 0xfb, 0x56, 0x79, 0xcd, + 0xf0, 0x84, 0x1c, 0xdb, 0x61, 0xfc, 0xca, 0x3f, + 0xb1, 0x1f, 0x59, 0xca, 0x09, 0x4e, 0xed, 0x87, + 0xf3, 0x28, 0xfe, 0xc4, 0x7d, 0x67, 0x28, 0x24, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x59, 0x69, 0xc2, 0xe0, 0xe1, 0x42, + 0x46, 0xfe, 0x91, 0xa1, 0x61, 0x10, 0x5a, 0x72, + 0x2c, 0xde, 0x6b, 0xc7, 0xcf, 0x0b, 0xa2, 0x8a, + 0x26, 0x36, 0x22, 0xef, 0xd5, 0xb7, 0x09, 0xd1, + 0xa1, 0x57, 0x2c, 0xe2, 0x6c, 0xd7, 0xb0, 0xc4, + 0x7f, 0x3e, 0x46, 0x34, 0xf7, 0x5d, 0xa5, 0x4a, + 0xec, 0xaf, 0xbd, 0x5c, 0xfd, 0x83, 0xbc, 0x2a, + 0x37, 0x2e, 0x70, 0x6e, 0x65, 0x6c, 0x4e, 0xa1, + 0x33, 0x09, 0x3f, 0xda, 0x01, 0x07, 0x66, 0xd4, + 0x48, 0x5f, 0x9b, 0x49, 0x19, 0xf2, 0x21, 0x6b, + 0x5a, 0xc1, 0xb8, 0x2a, 0x05, 0x74, 0x2e, 0xac, + 0xcf, 0x9b, 0x9f, 0x2a, 0xca, 0xae, 0xee, 0x43, + 0x9c, 0x2b, 0xcd, 0xcb, 0x84, 0xf8, 0xc5, 0xa3, + 0x46, 0x8e, 0xcf, 0x8a, 0xb8, 0xf6, 0x94, 0x11, + 0x9c, 0xcf, 0xd9, 0xc2, 0x7e, 0x88, 0x5d, 0x39, + 0x91, 0xc3, 0xb3, 0x79, 0x73, 0x0e, 0x82, 0x4b, + 0x88, 0xed, 0x69, 0xe3, 0x41, 0xa6, 0xf3, 0x23, + 0xc3, 0x99, 0xc1, 0x6f, 0x6a, 0xe3, 0x25, 0xbd, + 0xd0, 0x0f, 0x8a, 0x4d, 0x67, 0x0f, 0xe7, 0x69, + 0xed, 0x2e, 0x5c, 0xda, 0x1b, 0x4b, 0x7b, 0xc7, + 0xdb, 0xda, 0x17, 0xb9, 0x91, 0xf8, 0xae, 0x73, + 0xdd, 0x8a, 0xae, 0xdd, 0xa7, 0x61, 0x58, 0xf2, + 0x6f, 0x68, 0x19, 0x3c, 0x4d, 0x90, 0xb5, 0xb7, + 0x4e, 0x64, 0x8e, 0xb3, 0x07, 0xca, 0x0c, 0x3a, + 0x55, 0x41, 0xd8, 0xc3, 0x9c, 0x1e, 0x0e, 0x30, + 0x48, 0x75, 0x75, 0xd6, 0xba, 0x6a, 0x82, 0x5b, + 0x65, 0xbf, 0x9c, 0xc7, 0xe6, 0x3f, 0xc0, 0xb9, + 0xa6, 0xbe, 0xbc, 0xb5, 0xbc, 0xba, 0x6d, 0xbc, + 0xce, 0x89, 0xaf, 0x99, 0xe5, 0xc1, 0xa7, 0x59, + 0x0e, 0x2b, 0xa7, 0x65, 0xbf, 0x9c, 0xc7, 0xe6, + 0x3f, 0xc0, 0xb8, 0x2f, 0xbd, 0xf6, 0xe3, 0xed, + 0x5f, 0xf5, 0x8a, 0x0e, 0xcc, 0xba, 0x6b, 0x8c, + 0xc7, 0x36, 0xb3, 0x65, 0xdc, 0x8e, 0x9a, 0x8f, + 0xaf, 0x8d, 0xa7, 0x43, 0x46, 0x2f, 0x91, 0x78, + 0xda, 0x09, 0x5d, 0x36, 0x71, 0x70, 0x5d, 0xa7, + 0x01, 0xc0, 0xda, 0xe9, 0xa0, 0x00, 0x68, 0xa7, + 0x6d, 0x63, 0x20, 0x7b, 0x59, 0x9c, 0xda, 0x92, + 0x69, 0xe3, 0x16, 0x9f, 0xed, 0x34, 0x80, 0xbc, + 0xe7, 0x6d, 0x2d, 0xcd, 0xee, 0xc3, 0xb4, 0x7e, + 0xb2, 0xbc, 0x20, 0x14, 0x1e, 0xa7, 0xcd, 0x4c, + 0xf9, 0x54, 0x39, 0x7b, 0xe3, 0xd3, 0x6e, 0xea, + 0xb2, 0x5a, 0xe9, 0xa0, 0x07, 0x47, 0x7d, 0x70, + 0x2e, 0xb7, 0x65, 0xb3, 0x37, 0x2e, 0x6e, 0x62, + 0x5c, 0xde, 0x69, 0xef, 0xc0, 0xd6, 0x69, 0xc5, + 0x5d, 0xfe, 0xf2, 0xe4, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, 0x25, + 0xb3, 0x7f, 0xce, 0x6d, 0xfb, 0x6e, 0xfa, 0x85, + 0x46, 0xa9, 0x2d, 0x9b, 0xfe, 0x73, 0x6f, 0xdb, + 0x77, 0xd4, 0x28, 0x26, 0xb3, 0x0f, 0x7d, 0x9b, + 0xce, 0xf9, 0x02, 0xe7, 0x5d, 0x19, 0x87, 0xbe, + 0xcd, 0xe7, 0x7c, 0x81, 0x73, 0xa0, 0x22, 0x2c, + 0x20, 0xd9, 0xb5, 0x31, 0x4b, 0x25, 0x85, 0x97, + 0x36, 0xc7, 0x3e, 0x95, 0xae, 0x10, 0x4e, 0xb6, + 0x8d, 0xe5, 0x5a, 0xf6, 0x5b, 0xaf, 0x51, 0x27, + 0x21, 0xdc, 0x4a, 0xdf, 0x9c, 0xe6, 0xd7, 0x39, + 0x65, 0xa5, 0xa4, 0x90, 0x35, 0x8e, 0xe7, 0x05, + 0x08, 0x78, 0x3f, 0x9a, 0xde, 0xc1, 0x51, 0x3f, + 0x18, 0xe6, 0x5e, 0xaa, 0x1e, 0x03, 0xc6, 0x82, + 0x1b, 0xd9, 0x2e, 0xfd, 0x44, 0x9c, 0x87, 0x71, + 0x27, 0xb2, 0x5d, 0xfa, 0x89, 0x39, 0x0e, 0xe2, + 0x53, 0x3f, 0x18, 0xe6, 0x5e, 0xaa, 0x1e, 0x03, + 0xc6, 0x9f, 0x18, 0xe6, 0x5e, 0xaa, 0x1e, 0x03, + 0xc6, 0x82, 0x1b, 0xd9, 0x2e, 0xfd, 0x44, 0x9c, + 0x87, 0x71, 0x27, 0xb2, 0x5d, 0xfa, 0x89, 0x39, + 0x0e, 0xe2, 0x53, 0x3f, 0x18, 0xe6, 0x5e, 0xaa, + 0x1e, 0x03, 0xc6, 0x9f, 0x18, 0xe6, 0x5e, 0xaa, + 0x1e, 0x03, 0xc6, 0x82, 0x1b, 0xd9, 0x2e, 0xfd, + 0x44, 0x9c, 0x87, 0x71, 0x27, 0xb2, 0x5d, 0xfa, + 0x89, 0x39, 0x0e, 0xe2, 0x53, 0x3f, 0x18, 0xe6, + 0x5e, 0xaa, 0x1e, 0x03, 0xc6, 0x9f, 0x18, 0xe6, + 0x5e, 0xaa, 0x1e, 0x03, 0xc6, 0x82, 0x1b, 0xd9, + 0x2e, 0xfd, 0x44, 0x9c, 0x87, 0x71, 0x27, 0xb2, + 0x5d, 0xfa, 0x89, 0x39, 0x0e, 0xe2, 0x53, 0x3f, + 0x18, 0xe6, 0x5e, 0xaa, 0x1e, 0x03, 0xc6, 0x9f, + 0x18, 0xe6, 0x5e, 0xaa, 0x1e, 0x03, 0xc6, 0x82, + 0x1b, 0xd9, 0x2e, 0xfd, 0x44, 0x9c, 0x87, 0x71, + 0x27, 0xb2, 0x5d, 0xfa, 0x89, 0x39, 0x0e, 0xe2, + 0x53, 0x3f, 0x18, 0xe6, 0x3e, 0xae, 0x1a, 0xee, + 0xe8, 0x77, 0x1a, 0xc0, 0xdb, 0x1c, 0xc8, 0xea, + 0x8a, 0x1e, 0x03, 0xc6, 0x82, 0x1f, 0xd9, 0x2e, + 0xfd, 0x44, 0x9c, 0x87, 0x71, 0x27, 0xb2, 0x5d, + 0xfa, 0x89, 0x39, 0x0e, 0xe2, 0x53, 0x3f, 0x18, + 0xe6, 0x5e, 0xaa, 0x1e, 0x03, 0xc6, 0x9f, 0x18, + 0xe6, 0x5e, 0xaa, 0x1e, 0x03, 0xc6, 0x82, 0x1b, + 0xd9, 0x2e, 0xfd, 0x44, 0x9c, 0x87, 0x71, 0x27, + 0xb2, 0x5d, 0xfa, 0x89, 0x39, 0x0e, 0xe2, 0x53, + 0x3f, 0x18, 0xe6, 0x5e, 0xaa, 0x1e, 0x03, 0xc6, + 0x9f, 0x18, 0xe6, 0x5e, 0xaa, 0x1e, 0x03, 0xc6, + 0x82, 0x1b, 0xd9, 0x2e, 0xfd, 0x44, 0x9c, 0x87, + 0x71, 0x27, 0xb2, 0x5d, 0xfa, 0x89, 0x39, 0x0e, + 0xe2, 0x53, 0x1f, 0x18, 0xe6, 0x3e, 0xaa, 0x1e, + 0x07, 0x71, 0xac, 0xfc, 0x63, 0x99, 0x7a, 0xa8, + 0x78, 0x0f, 0x1a, 0x08, 0x6f, 0x64, 0xbb, 0xf5, + 0x12, 0x72, 0x1d, 0xc4, 0x9e, 0xc9, 0x77, 0xea, + 0x24, 0xe4, 0x3b, 0x89, 0x4c, 0xfc, 0x63, 0x99, + 0x7a, 0xa8, 0x78, 0x0f, 0x1a, 0x7c, 0x63, 0x99, + 0x7a, 0xa8, 0x78, 0x0f, 0x1a, 0x08, 0x6f, 0x64, + 0xbb, 0xf5, 0x12, 0x72, 0x1d, 0xc4, 0xa4, 0xac, + 0x6f, 0xaf, 0x2d, 0xad, 0x4d, 0x9c, 0xf6, 0x26, + 0xee, 0xda, 0xb5, 0x6c, 0x6f, 0x63, 0x86, 0x13, + 0xdb, 0xa1, 0x5b, 0xfe, 0x31, 0xcc, 0xbd, 0x54, + 0x3c, 0x07, 0x8d, 0x3e, 0x31, 0xcc, 0xbd, 0x54, + 0x3c, 0x07, 0x8d, 0x07, 0x36, 0x61, 0x7b, 0x7d, + 0x79, 0x0b, 0x2d, 0xa3, 0xb2, 0x36, 0xd6, 0xb1, + 0x9c, 0x42, 0x16, 0x35, 0xda, 0x4e, 0xf9, 0x38, + 0x42, 0x8f, 0xf6, 0x4b, 0xbf, 0x53, 0x27, 0x6f, + 0x03, 0xb8, 0x94, 0xc7, 0xc6, 0x39, 0x97, 0xaa, + 0x87, 0x80, 0xf1, 0xac, 0xfc, 0x63, 0x99, 0x7a, + 0xa8, 0x78, 0x0f, 0xa4, 0x82, 0x1b, 0xd9, 0x2e, + 0xfd, 0x44, 0x9c, 0x87, 0x71, 0x27, 0xb2, 0x5d, + 0xfa, 0x89, 0x39, 0x0e, 0xe2, 0x53, 0x3f, 0x18, + 0xe6, 0x5e, 0xaa, 0x1e, 0x03, 0xc6, 0x9f, 0x18, + 0xe6, 0x5e, 0xaa, 0x1e, 0x03, 0xc6, 0x82, 0x1b, + 0xd9, 0x2e, 0xfd, 0x44, 0x9c, 0x87, 0x71, 0x27, + 0xb2, 0x5d, 0xfa, 0x89, 0x39, 0x0e, 0xe2, 0x53, + 0x3f, 0x18, 0xe6, 0x5e, 0xaa, 0x1e, 0x03, 0xc6, + 0x9f, 0x18, 0xe6, 0x5e, 0xaa, 0x1e, 0x03, 0xc6, + 0x82, 0x1b, 0xd9, 0x2e, 0xfd, 0x44, 0x9c, 0x87, + 0x71, 0x21, 0xb4, 0xbb, 0x3a, 0x39, 0x89, 0x39, + 0x0e, 0xe2, 0x53, 0x3f, 0x18, 0xe6, 0x5e, 0xaa, + 0x1e, 0x03, 0xc6, 0x9f, 0x18, 0xe6, 0x5e, 0xaa, + 0x1e, 0x03, 0xc6, 0x83, 0xc3, 0x33, 0x3b, 0x87, + 0xc5, 0x1c, 0x77, 0xd9, 0x60, 0xbc, 0x74, 0x22, + 0x91, 0xbd, 0xed, 0x76, 0x20, 0x37, 0x8f, 0x8a, + 0x6a, 0xb8, 0xf3, 0x19, 0xb3, 0x2c, 0xc2, 0x61, + 0x24, 0x96, 0xef, 0x63, 0x18, 0xdc, 0x11, 0x44, + 0xc6, 0x38, 0x35, 0xa3, 0x7b, 0x52, 0xef, 0xf8, + 0xc7, 0x32, 0xf5, 0x50, 0xf0, 0x1e, 0x34, 0xf8, + 0xc7, 0x32, 0xf5, 0x50, 0xf0, 0x1e, 0x34, 0x10, + 0xde, 0xc9, 0x75, 0xea, 0x24, 0xe4, 0x3b, 0x89, + 0x3d, 0x92, 0xef, 0xd4, 0x49, 0xc8, 0x77, 0x12, + 0x99, 0xf8, 0xc7, 0x32, 0xf5, 0x50, 0xf0, 0x1e, + 0x34, 0xf8, 0xc7, 0x32, 0xf5, 0x50, 0xf0, 0x1e, + 0x34, 0x10, 0xde, 0xc9, 0x77, 0xea, 0x24, 0xe4, + 0x3b, 0x89, 0x3d, 0x92, 0xef, 0xd4, 0x49, 0xc8, + 0x77, 0x12, 0x99, 0xf8, 0xc7, 0x32, 0xf5, 0x50, + 0xf0, 0x1e, 0x34, 0xf8, 0xc7, 0x32, 0xf5, 0x50, + 0xf0, 0x1e, 0x34, 0x10, 0xde, 0xc9, 0x77, 0xea, + 0x24, 0xe4, 0x3b, 0x89, 0x3d, 0x92, 0xef, 0xd4, + 0x49, 0xc8, 0x77, 0x12, 0x99, 0xf8, 0xc7, 0x32, + 0xf5, 0x50, 0xf0, 0x1e, 0x34, 0xf8, 0xc7, 0x32, + 0xf5, 0x50, 0xf0, 0x1e, 0x34, 0x10, 0xde, 0xc9, + 0x77, 0xea, 0x24, 0xe4, 0x3b, 0x89, 0x3d, 0x92, + 0xef, 0xd4, 0x49, 0xc8, 0x77, 0x12, 0x99, 0xf8, + 0xc7, 0x32, 0xf5, 0x50, 0xf0, 0x1e, 0x34, 0xf8, + 0xc7, 0x32, 0xf5, 0x50, 0xf0, 0x1e, 0x34, 0x10, + 0xde, 0xc9, 0x77, 0xea, 0x24, 0xe4, 0x3b, 0x89, + 0x3d, 0x92, 0xef, 0xd4, 0x49, 0xc8, 0x77, 0x12, + 0x99, 0xf8, 0xc7, 0x32, 0xf5, 0x50, 0xf0, 0x1e, + 0x34, 0xf8, 0xc7, 0x32, 0xf5, 0x50, 0xf0, 0x1e, + 0x34, 0x10, 0xde, 0xc9, 0x77, 0xea, 0x24, 0xe4, + 0x3b, 0x89, 0x3d, 0x92, 0xef, 0xd4, 0x49, 0xc8, + 0x77, 0x12, 0x99, 0xf8, 0xc7, 0x32, 0xf5, 0x50, + 0xf0, 0x1e, 0x34, 0xf8, 0xc7, 0x32, 0xf5, 0x50, + 0xf0, 0x1e, 0x34, 0x10, 0xde, 0xc9, 0x77, 0xea, + 0x24, 0xe4, 0x3b, 0x89, 0x6d, 0xb4, 0xb5, 0xba, + 0x17, 0x50, 0x93, 0x04, 0x94, 0x12, 0x30, 0x93, + 0x81, 0xda, 0xab, 0xda, 0x52, 0x9f, 0x18, 0xe6, + 0x5e, 0xaa, 0x1e, 0x03, 0xc6, 0xbd, 0xc1, 0xb5, + 0xb9, 0x8c, 0x93, 0x47, 0x19, 0x8e, 0x20, 0x1e, + 0xf6, 0xb4, 0x90, 0x0e, 0xa2, 0x69, 0xf3, 0x90, + 0x4a, 0xe7, 0x3e, 0xf4, 0xdf, 0x30, 0x78, 0x4a, + 0xe0, 0x5d, 0xf9, 0xcf, 0xbc, 0xb4, 0x7f, 0x50, + 0x78, 0x4a, 0xe0, 0x41, 0x98, 0xff, 0x00, 0x68, + 0xde, 0xda, 0x96, 0x2a, 0x26, 0x3f, 0xda, 0x37, + 0xb6, 0xa5, 0x8a, 0x0c, 0x2e, 0x0c, 0xc3, 0xde, + 0xad, 0x3e, 0xd3, 0xe5, 0x0b, 0xbd, 0x70, 0x66, + 0x1e, 0xf5, 0x69, 0xf6, 0x9f, 0x28, 0x40, 0xcb, + 0xfd, 0xe6, 0xef, 0xcf, 0x3f, 0x58, 0xae, 0xf5, + 0xc1, 0x97, 0xfb, 0xcd, 0xdf, 0x9e, 0x7e, 0xb1, + 0x5d, 0xe8, 0x0e, 0xd4, 0x54, 0x49, 0xd6, 0x54, + 0xb3, 0xb5, 0x15, 0x12, 0x75, 0x94, 0x0d, 0xd5, + 0xbf, 0x3b, 0x34, 0xc8, 0x6d, 0xfc, 0xf6, 0xff, + 0x00, 0x79, 0x68, 0xdd, 0x5b, 0xb3, 0xef, 0xf4, + 0xfd, 0xb9, 0xfe, 0xbb, 0x7f, 0xbc, 0xaf, 0x8f, + 0xef, 0xaf, 0xc5, 0xcb, 0x3f, 0xf0, 0xaf, 0xf0, + 0x57, 0x31, 0x26, 0x25, 0xab, 0x12, 0x62, 0x5b, + 0x75, 0xf1, 0xf8, 0xbc, 0x6d, 0x38, 0x43, 0x6e, + 0x24, 0xc4, 0xb5, 0x62, 0x4c, 0x4a, 0x35, 0x34, + 0x6d, 0xc4, 0x98, 0x96, 0xac, 0x49, 0x89, 0x35, + 0x34, 0x6d, 0xc4, 0xb0, 0x5d, 0xaf, 0xb4, 0x7c, + 0x0b, 0x5e, 0x24, 0x2e, 0xd1, 0xc3, 0xe0, 0x4d, + 0x4d, 0x38, 0xae, 0xf6, 0xee, 0x23, 0x67, 0xc3, + 0x86, 0xe4, 0x04, 0x8e, 0xe0, 0x2a, 0xbf, 0x90, + 0xde, 0xcd, 0x16, 0x63, 0x0c, 0x58, 0xc9, 0x64, + 0xbe, 0x23, 0x9a, 0x49, 0x23, 0x4e, 0xea, 0x9f, + 0x83, 0xfd, 0x3a, 0x3f, 0xf1, 0x9d, 0xf5, 0x4a, + 0xaa, 0xe5, 0x04, 0x9c, 0xd2, 0xdb, 0xb3, 0x2b, + 0x4f, 0x71, 0x70, 0xac, 0x44, 0xc6, 0x59, 0xd3, + 0xda, 0xdf, 0x96, 0x66, 0x2d, 0x82, 0x62, 0x66, + 0x38, 0x47, 0x04, 0xd6, 0xd6, 0x46, 0xd6, 0x8b, + 0x79, 0x69, 0xe3, 0x69, 0x63, 0x88, 0xdd, 0x14, + 0x5e, 0x6d, 0x32, 0x0b, 0x56, 0x59, 0xb6, 0xe7, + 0x30, 0x94, 0xb7, 0x10, 0x0e, 0xa0, 0x38, 0x43, + 0x6b, 0xa8, 0x13, 0xba, 0xb6, 0x6d, 0x73, 0x83, + 0x6d, 0xed, 0xc6, 0xee, 0x37, 0x11, 0x5e, 0xc0, + 0x0b, 0x44, 0x76, 0x59, 0xe6, 0x67, 0x6a, 0xd1, + 0x77, 0x33, 0x61, 0xb5, 0xd0, 0x5a, 0xd7, 0x34, + 0x62, 0x34, 0xd4, 0x68, 0x14, 0x56, 0x67, 0x65, + 0x78, 0xe9, 0xa9, 0x92, 0xb5, 0xef, 0x64, 0x9d, + 0xbd, 0xc9, 0x98, 0xd6, 0x3a, 0x63, 0xe2, 0xdd, + 0x71, 0xb3, 0xb6, 0x92, 0xda, 0x9b, 0x8b, 0x09, + 0x4b, 0x88, 0x04, 0xb4, 0x12, 0x1c, 0xd3, 0x4e, + 0xe2, 0xf5, 0xb3, 0x36, 0xd6, 0xf8, 0x45, 0xdb, + 0x64, 0xac, 0xee, 0x6b, 0x9a, 0x62, 0xa8, 0x34, + 0x15, 0x1a, 0x69, 0xdc, 0x52, 0x39, 0x5d, 0xac, + 0x16, 0xb9, 0x7f, 0x31, 0x04, 0xa2, 0x66, 0x37, + 0x1d, 0x5e, 0x29, 0xe5, 0x13, 0xa7, 0x52, 0xaf, + 0xec, 0xa1, 0xae, 0x68, 0xff, 0x00, 0xb1, 0x77, + 0x79, 0xcc, 0x48, 0xb5, 0xad, 0x5b, 0xc4, 0xda, + 0x74, 0x85, 0xe6, 0x94, 0xa6, 0x5c, 0x76, 0x8a, + 0x46, 0xb7, 0xf1, 0xf7, 0x24, 0x36, 0x92, 0xd6, + 0xd8, 0xb5, 0xd7, 0x66, 0x4a, 0x5c, 0x35, 0xad, + 0x02, 0x2c, 0x43, 0x48, 0x26, 0x9a, 0xbb, 0xab, + 0x5d, 0xbe, 0xcf, 0x59, 0xc5, 0x68, 0xdb, 0x8c, + 0xc6, 0x52, 0xc2, 0x45, 0x5c, 0x01, 0x0d, 0x6b, + 0x49, 0xdc, 0xa9, 0xdd, 0x5c, 0x5b, 0x55, 0x46, + 0xe6, 0xa0, 0x8d, 0x62, 0x36, 0xd0, 0xf6, 0x57, + 0x57, 0xb0, 0xe7, 0x99, 0xa5, 0xb8, 0xf6, 0xe9, + 0x99, 0x14, 0x15, 0x0f, 0x6b, 0x48, 0x18, 0xbb, + 0x7a, 0x3e, 0x54, 0x8d, 0x62, 0x94, 0xfa, 0xb4, + 0x73, 0x9d, 0xb3, 0x97, 0x2c, 0xc6, 0x3d, 0xd6, + 0x8f, 0x97, 0xe2, 0xf5, 0x79, 0xb3, 0xf6, 0xae, + 0xb3, 0x37, 0x59, 0x7c, 0xa5, 0xc1, 0xad, 0x2f, + 0x68, 0x27, 0x13, 0x5c, 0x06, 0xf1, 0x55, 0xfc, + 0x4a, 0xeb, 0x65, 0x6f, 0x0d, 0xb6, 0x58, 0x60, + 0x86, 0x4e, 0x7a, 0x36, 0xb5, 0xe0, 0xbf, 0x41, + 0xa9, 0xdd, 0xd4, 0xa8, 0xa1, 0xda, 0x02, 0xbe, + 0x2b, 0xcc, 0xee, 0x89, 0x9d, 0x78, 0xf0, 0x73, + 0xf3, 0x78, 0xab, 0x59, 0xa4, 0xd6, 0x22, 0xb3, + 0x6a, 0xfd, 0x51, 0x1e, 0x09, 0xad, 0x99, 0x35, + 0xcd, 0x1b, 0xe6, 0x39, 0x74, 0x6d, 0x5c, 0xaf, + 0x65, 0xdc, 0x20, 0x38, 0xb3, 0xf5, 0x67, 0x51, + 0x23, 0x4d, 0x57, 0x26, 0xcb, 0x9a, 0xe6, 0x83, + 0xcc, 0x72, 0x9f, 0xcd, 0x2e, 0x32, 0x78, 0x67, + 0x61, 0xcc, 0x43, 0x4c, 0x98, 0x6b, 0x19, 0x22, + 0xba, 0x2a, 0x55, 0x6f, 0x6d, 0x32, 0xee, 0xd3, + 0x5e, 0x1e, 0x0e, 0x98, 0xa9, 0xbb, 0xcb, 0x69, + 0xbb, 0x6f, 0x1d, 0x75, 0x7a, 0xcb, 0xdf, 0x24, + 0xf9, 0x2b, 0x1f, 0x71, 0xa5, 0xce, 0x88, 0xe2, + 0xae, 0xe8, 0xa2, 0x87, 0xca, 0x32, 0x3b, 0x7b, + 0xec, 0xbc, 0x5c, 0x3d, 0xef, 0x6b, 0xc9, 0x70, + 0x00, 0x1d, 0x1e, 0x29, 0xd0, 0xbd, 0x66, 0x9b, + 0x49, 0x04, 0x96, 0xae, 0xb5, 0xcb, 0xda, 0x68, + 0xf6, 0xe0, 0x32, 0x11, 0x84, 0x01, 0xab, 0xc5, + 0x5d, 0xfb, 0x30, 0x41, 0xc9, 0xdb, 0xe7, 0xbf, + 0xc2, 0xa9, 0xa5, 0xab, 0x49, 0x9f, 0x0d, 0xd2, + 0xe9, 0xfe, 0xde, 0x4c, 0x95, 0xa4, 0xfd, 0x7b, + 0x69, 0x30, 0x8f, 0xbc, 0xc8, 0xe1, 0xb3, 0xcb, + 0x1f, 0x3b, 0xdc, 0xe7, 0xdc, 0x80, 0xda, 0xd0, + 0xd0, 0x54, 0x90, 0x34, 0x0d, 0xdd, 0x6b, 0x65, + 0x96, 0xcf, 0xdb, 0xb6, 0xcc, 0x5d, 0x66, 0x32, + 0x96, 0x62, 0x18, 0x9c, 0xd6, 0x90, 0xd0, 0xd0, + 0x77, 0xc9, 0x50, 0x8e, 0x9e, 0x6b, 0xab, 0xf0, + 0x26, 0x7b, 0x9d, 0x8e, 0x40, 0x0e, 0x93, 0x4a, + 0x62, 0xa2, 0xb2, 0xed, 0x6b, 0xb0, 0xe5, 0x8c, + 0x68, 0xd4, 0xe9, 0x5a, 0x08, 0xdf, 0x14, 0x71, + 0xf9, 0x17, 0x49, 0xdf, 0x59, 0xad, 0x77, 0x7d, + 0xee, 0x78, 0xeb, 0x86, 0xdb, 0xf2, 0x45, 0x22, + 0x23, 0x1c, 0x6d, 0x88, 0x72, 0xdd, 0x6c, 0xf5, + 0xac, 0x96, 0x86, 0xe7, 0x2f, 0x94, 0xbe, 0x80, + 0xb8, 0x34, 0x9c, 0x4d, 0x70, 0x0b, 0x76, 0xcc, + 0xdb, 0x5b, 0xb6, 0x31, 0x72, 0xd9, 0x2b, 0x3b, + 0xda, 0x43, 0xe3, 0xae, 0xa1, 0x5f, 0x9b, 0xaf, + 0x71, 0x7b, 0xd9, 0x37, 0x19, 0x32, 0xd7, 0xb5, + 0xda, 0x43, 0x64, 0x20, 0x77, 0x40, 0x2b, 0x87, + 0x66, 0x80, 0x19, 0xc5, 0xd8, 0x1b, 0x8d, 0x78, + 0xe0, 0x78, 0x54, 0x9d, 0x74, 0xbd, 0x66, 0x7c, + 0x16, 0xad, 0x69, 0xbf, 0x0e, 0x48, 0xa4, 0x46, + 0xff, 0x00, 0xd2, 0xe8, 0xda, 0x3b, 0x3b, 0x5c, + 0x2f, 0xba, 0xe7, 0x31, 0x5c, 0xd1, 0x8d, 0x10, + 0xd4, 0x69, 0x04, 0x86, 0xea, 0xee, 0xaf, 0x30, + 0x6c, 0xf5, 0xa4, 0x16, 0xa2, 0x7c, 0xca, 0x62, + 0xc3, 0xa3, 0x10, 0x06, 0x8d, 0x6d, 0x77, 0x16, + 0x8c, 0xd5, 0xad, 0x7e, 0xd3, 0xc2, 0xc7, 0x00, + 0x43, 0x8c, 0x40, 0xd7, 0xb8, 0xa6, 0x33, 0xbb, + 0x08, 0xef, 0x60, 0x8e, 0x39, 0x67, 0x16, 0xed, + 0x6b, 0xb1, 0x12, 0xea, 0x51, 0xda, 0x29, 0x4d, + 0x24, 0x26, 0xb3, 0x11, 0x48, 0xd6, 0x78, 0xc1, + 0xdb, 0xa5, 0xef, 0x96, 0xf3, 0x48, 0x99, 0xa4, + 0xec, 0x88, 0xd7, 0xee, 0xf7, 0xca, 0x2b, 0x32, + 0xc8, 0x60, 0x8e, 0xcc, 0xde, 0x58, 0xc8, 0x5f, + 0x1b, 0x46, 0x27, 0x34, 0x9a, 0xd5, 0xbb, 0xed, + 0x2b, 0x9b, 0x26, 0xc9, 0xdd, 0x98, 0xe2, 0x96, + 0x47, 0x16, 0x5b, 0xb0, 0xd3, 0x45, 0x2a, 0xe3, + 0xdd, 0xd4, 0xa6, 0xed, 0x19, 0x6b, 0x6b, 0x96, + 0x1b, 0x53, 0x72, 0xc9, 0xb0, 0x31, 0xd4, 0x38, + 0x9b, 0xc1, 0x4a, 0xaf, 0x19, 0x23, 0x79, 0xbc, + 0x85, 0xae, 0x6e, 0x87, 0x16, 0x3d, 0xd5, 0xec, + 0xe9, 0x53, 0x19, 0x6d, 0x15, 0x98, 0x8e, 0x7a, + 0x44, 0x9d, 0x8c, 0x73, 0x92, 0xb3, 0xb6, 0x23, + 0xe9, 0xdd, 0xb2, 0x3d, 0xad, 0x27, 0x67, 0xf2, + 0xa9, 0xb1, 0xb2, 0xda, 0xe1, 0xdc, 0xeb, 0x34, + 0x1f, 0x18, 0x3a, 0x87, 0xb2, 0x17, 0x2e, 0x4f, + 0x96, 0xc5, 0x1e, 0x60, 0xf6, 0x5d, 0x49, 0xcd, + 0xcf, 0x6d, 0x23, 0x79, 0xb6, 0x54, 0x0c, 0x5a, + 0xce, 0x80, 0x75, 0xd5, 0x44, 0xe5, 0x79, 0xa4, + 0x99, 0x7c, 0xae, 0x9d, 0x8d, 0x0f, 0x2f, 0x6d, + 0x1c, 0x1c, 0x68, 0x0e, 0xee, 0x92, 0xba, 0xa0, + 0xbf, 0x76, 0x61, 0x9f, 0xda, 0xdc, 0x3d, 0x8d, + 0x63, 0xdd, 0x23, 0x01, 0x0d, 0x35, 0x1a, 0x34, + 0x68, 0x25, 0x5a, 0x6b, 0x7a, 0xc5, 0xab, 0x36, + 0xd6, 0x34, 0xd7, 0xf1, 0x73, 0xdf, 0x8a, 0xd7, + 0xa4, 0xc5, 0x22, 0x2f, 0xbb, 0x4d, 0x23, 0xc3, + 0x45, 0x8b, 0x3a, 0xb3, 0xb5, 0xba, 0x81, 0xa6, + 0xe2, 0x4e, 0x6b, 0x9b, 0xc4, 0x58, 0x2a, 0x1b, + 0x53, 0x4e, 0xca, 0x8c, 0xb2, 0xc9, 0xa2, 0x9f, + 0x2a, 0x6d, 0xdb, 0xa6, 0x91, 0xa4, 0xc6, 0x5c, + 0x58, 0x08, 0xc3, 0xa3, 0x72, 0x8b, 0x66, 0xd8, + 0xe8, 0x86, 0xdb, 0xce, 0x7f, 0x80, 0x2e, 0xcc, + 0xac, 0xd7, 0x67, 0x5a, 0x7f, 0xc1, 0x7f, 0xca, + 0xb9, 0xc6, 0xb1, 0x48, 0xe3, 0xe3, 0x2e, 0xf7, + 0x8a, 0xdb, 0x3d, 0xa3, 0x6f, 0x18, 0xa2, 0xbf, + 0x93, 0x65, 0x6f, 0xcc, 0xa4, 0x25, 0xce, 0xe6, + 0xe1, 0x8f, 0xcb, 0x70, 0xd7, 0x5d, 0xe0, 0xa6, + 0x1b, 0x90, 0xe4, 0xd2, 0xc8, 0xfb, 0x68, 0xe6, + 0x77, 0x3e, 0xc1, 0xe3, 0x00, 0xe0, 0x48, 0xec, + 0x91, 0x45, 0xeb, 0x64, 0xc0, 0x19, 0x66, 0x31, + 0xad, 0xd2, 0x38, 0x9e, 0x0a, 0x28, 0x6c, 0x96, + 0x57, 0x75, 0xf3, 0x1d, 0x5d, 0x2e, 0x7c, 0x80, + 0xff, 0x00, 0x6a, 0xaa, 0xf3, 0x6b, 0xda, 0xd6, + 0x98, 0xb6, 0x9b, 0x61, 0xc7, 0x1d, 0x31, 0xe3, + 0xae, 0x2f, 0xa2, 0x2d, 0xdd, 0xb4, 0xc7, 0x16, + 0x26, 0xca, 0xdd, 0x6f, 0x9a, 0xc7, 0x61, 0x2b, + 0xb1, 0x32, 0x47, 0x00, 0xd9, 0x06, 0xb2, 0xd3, + 0xba, 0xa5, 0x66, 0xd9, 0x9b, 0x48, 0x8b, 0x5c, + 0x67, 0x31, 0xc2, 0x2b, 0xce, 0x39, 0xc4, 0x0d, + 0xea, 0x00, 0x4a, 0xf7, 0x9d, 0xb4, 0x0c, 0xdf, + 0x2b, 0x76, 0xeb, 0x9e, 0x41, 0xed, 0x55, 0xbc, + 0x6b, 0xce, 0xd7, 0xb8, 0x8b, 0x38, 0x1b, 0xb8, + 0xe9, 0x2a, 0x46, 0xe1, 0xa0, 0x48, 0xbd, 0xe6, + 0xd4, 0x88, 0xb6, 0x9a, 0xc4, 0xad, 0xd9, 0xc7, + 0x8e, 0x33, 0x4e, 0xdd, 0x76, 0x4c, 0x69, 0xf8, + 0xbc, 0xdf, 0x6c, 0xe5, 0xb0, 0xb4, 0x74, 0xf6, + 0x72, 0x38, 0xbd, 0x8d, 0x2f, 0x6e, 0x22, 0x1c, + 0xd3, 0x40, 0xab, 0x98, 0xb7, 0xb5, 0x6e, 0x2b, + 0x76, 0x4f, 0xa7, 0x67, 0x9a, 0x49, 0xaf, 0xea, + 0xdf, 0xfd, 0xe5, 0x4c, 0x0e, 0xd0, 0x15, 0xf0, + 0xda, 0x7e, 0xa8, 0x99, 0xd7, 0x6b, 0x97, 0x9b, + 0xa5, 0x62, 0x29, 0x6a, 0xc6, 0x9b, 0xa3, 0xc1, + 0xb7, 0x12, 0x62, 0x5a, 0xb1, 0x26, 0x25, 0xd3, + 0x56, 0x5d, 0x1b, 0x71, 0x26, 0x25, 0xab, 0x12, + 0x62, 0x4d, 0x4d, 0x1b, 0x71, 0x26, 0x25, 0xab, + 0x12, 0x62, 0x53, 0x12, 0x98, 0x86, 0xcc, 0x4a, + 0xd6, 0xdf, 0xf4, 0xfd, 0xaf, 0x69, 0xaa, 0xa1, + 0x89, 0x5b, 0x99, 0xfe, 0x9e, 0xb5, 0xed, 0x35, + 0x70, 0xf3, 0x1f, 0x6c, 0x7c, 0x5b, 0x3c, 0x84, + 0x7d, 0x73, 0xfb, 0x33, 0xfa, 0x5c, 0x68, 0x88, + 0xb3, 0x3d, 0x11, 0x7a, 0x8b, 0xf6, 0xac, 0xf3, + 0x9b, 0xe1, 0x0b, 0xca, 0xcb, 0x1d, 0x85, 0xed, + 0x71, 0xd4, 0x08, 0x27, 0xb8, 0x50, 0x73, 0xed, + 0x87, 0xf3, 0x38, 0xfe, 0xc4, 0x7d, 0x67, 0x28, + 0x2d, 0x2a, 0xe9, 0x9c, 0xdb, 0x64, 0x92, 0xcd, + 0x1c, 0xd9, 0x94, 0x86, 0x37, 0x39, 0xb8, 0x63, + 0xd3, 0x40, 0x40, 0x35, 0xdc, 0x07, 0x7d, 0x47, + 0xfb, 0x26, 0xc7, 0xf4, 0x93, 0xca, 0x3e, 0x8a, + 0x0a, 0xde, 0x94, 0xd2, 0xac, 0x9e, 0xc9, 0xb1, + 0xfd, 0x24, 0xf2, 0x8f, 0xa2, 0x9e, 0xc9, 0xb1, + 0xfd, 0x24, 0xf2, 0x8f, 0xa2, 0x82, 0xb7, 0xa5, + 0x34, 0xab, 0x27, 0xb2, 0x6c, 0x7f, 0x49, 0x3c, + 0xa3, 0xe8, 0xa7, 0xb2, 0x6c, 0x7f, 0x49, 0x3c, + 0xa3, 0xe8, 0xa0, 0xad, 0xe9, 0x4d, 0x2a, 0xc9, + 0xec, 0x9b, 0x1f, 0xd2, 0x4f, 0x28, 0xfa, 0x29, + 0xec, 0x9b, 0x1f, 0xd2, 0x4f, 0x28, 0xfa, 0x28, + 0x2b, 0x7a, 0x53, 0x4a, 0xb2, 0x7b, 0x26, 0xc7, + 0xf4, 0x93, 0xca, 0x3e, 0x8a, 0x7b, 0x26, 0xc7, + 0xf4, 0x93, 0xca, 0x3e, 0x8a, 0x0a, 0xde, 0x94, + 0xd2, 0xac, 0x9e, 0xc9, 0xb1, 0xfd, 0x24, 0xf2, + 0x8f, 0xa2, 0x9e, 0xc9, 0xb1, 0xfd, 0x24, 0xf2, + 0x8f, 0xa2, 0x82, 0xb7, 0xa5, 0x34, 0xab, 0x27, + 0xb2, 0x6c, 0x7f, 0x49, 0x3c, 0xa3, 0xe8, 0xa7, + 0xb2, 0x6c, 0x7f, 0x49, 0x3c, 0xa3, 0xe8, 0xa0, + 0xad, 0xe9, 0x4d, 0x2a, 0xc9, 0xec, 0x9b, 0x1f, + 0xd2, 0x4f, 0x28, 0xfa, 0x29, 0xec, 0x9b, 0x1f, + 0xd2, 0x4f, 0x28, 0xfa, 0x28, 0x2b, 0x7a, 0x53, + 0x4a, 0xb2, 0x7b, 0x26, 0xc7, 0xf4, 0x93, 0xca, + 0x3e, 0x8a, 0x7b, 0x26, 0xc7, 0xf4, 0x93, 0xca, + 0x3e, 0x8a, 0x08, 0xdc, 0x8e, 0xfe, 0xde, 0xc2, + 0x69, 0xe4, 0xb8, 0xa8, 0x12, 0x44, 0x58, 0xdc, + 0x20, 0x9f, 0x18, 0xf6, 0x94, 0x70, 0x73, 0x9a, + 0xe0, 0xe6, 0xe8, 0x73, 0x4d, 0x5a, 0x7b, 0x35, + 0xd0, 0x55, 0x8f, 0xd9, 0x36, 0x3f, 0xa4, 0x9e, + 0x53, 0xbd, 0x14, 0xf6, 0x4d, 0x8f, 0xe9, 0x27, + 0x84, 0xfa, 0x28, 0x34, 0x5c, 0xdd, 0x64, 0xb9, + 0xa9, 0x8e, 0x7b, 0xc9, 0x1f, 0x6b, 0x72, 0xd6, + 0x86, 0xca, 0x1a, 0xda, 0x87, 0x53, 0x79, 0x73, + 0x66, 0x19, 0x85, 0x9d, 0xed, 0xd5, 0xbc, 0x54, + 0x74, 0x79, 0x75, 0xb0, 0xc0, 0xd1, 0x42, 0x5c, + 0x5a, 0x35, 0xf8, 0xba, 0xf4, 0x85, 0x21, 0xec, + 0x9b, 0x1f, 0xab, 0xda, 0x4d, 0x35, 0xd3, 0x11, + 0xf4, 0x56, 0x3d, 0x93, 0x63, 0xfa, 0x49, 0xe5, + 0x3b, 0xd1, 0x41, 0xc3, 0x7b, 0x9d, 0xba, 0x4c, + 0xd6, 0x3b, 0xcb, 0x6d, 0x10, 0xdb, 0xd1, 0xb0, + 0xb6, 0x98, 0x7c, 0x5f, 0xce, 0xd0, 0x57, 0x3e, + 0x71, 0x3d, 0x9d, 0xc5, 0xf3, 0xa7, 0xb3, 0xc4, + 0x1b, 0x30, 0x0e, 0x7b, 0x1c, 0x30, 0xd1, 0xdb, + 0xba, 0x0a, 0x97, 0xf6, 0x4d, 0x8f, 0xe9, 0x27, + 0x94, 0xef, 0x45, 0x3d, 0x93, 0x63, 0xfa, 0x49, + 0xe5, 0x1f, 0x45, 0x04, 0x56, 0x49, 0x7b, 0x0d, + 0x8e, 0x60, 0xcb, 0x9b, 0x8a, 0x88, 0xda, 0xd7, + 0x03, 0x41, 0x53, 0xa4, 0x2e, 0x4b, 0x99, 0x1b, + 0x2d, 0xcc, 0xd2, 0x32, 0xb8, 0x5e, 0xf7, 0x38, + 0x76, 0x9c, 0x6a, 0xac, 0x1e, 0xc9, 0xb1, 0xfd, + 0x24, 0xf2, 0x8f, 0xa2, 0x9e, 0xc9, 0xb1, 0xfd, + 0x24, 0xf2, 0x8f, 0xa2, 0x82, 0xbb, 0x13, 0xe4, + 0x8a, 0x46, 0xcb, 0x19, 0xa3, 0xe3, 0x21, 0xcc, + 0xed, 0x83, 0x55, 0x37, 0x73, 0x75, 0x90, 0xe6, + 0x8e, 0x6d, 0xcd, 0xd4, 0x92, 0x5a, 0xdc, 0xe1, + 0x0d, 0x90, 0x34, 0x12, 0x0f, 0x69, 0x6f, 0xf6, + 0x4d, 0x8f, 0xd5, 0xed, 0x27, 0x7f, 0x59, 0xf4, + 0x53, 0xd9, 0x36, 0x43, 0xa4, 0x9e, 0x53, 0xbd, + 0x14, 0x11, 0xd9, 0xb6, 0x65, 0x6f, 0x71, 0x1c, + 0x16, 0x76, 0x4c, 0x2c, 0xb3, 0xb6, 0x1e, 0x29, + 0x3e, 0x53, 0x8e, 0xfa, 0x8c, 0xd2, 0xac, 0x9e, + 0xc9, 0xb1, 0xfd, 0x24, 0xf2, 0x8f, 0xa2, 0x9e, + 0xc9, 0xb1, 0xfd, 0x24, 0xf2, 0x8f, 0xa2, 0x82, + 0xb7, 0xa5, 0x34, 0xab, 0x27, 0xb2, 0x6c, 0x7f, + 0x49, 0x3c, 0xa3, 0xe8, 0xa7, 0xb2, 0x6c, 0x7f, + 0x49, 0x3c, 0xa3, 0xe8, 0xa0, 0xad, 0xe9, 0x4d, + 0x2a, 0xc9, 0xec, 0x9b, 0x1f, 0xd2, 0x4f, 0x28, + 0xfa, 0x29, 0xec, 0x9b, 0x1f, 0xd2, 0x4f, 0x28, + 0xfa, 0x28, 0x2b, 0x7a, 0x53, 0x4a, 0xb2, 0x7b, + 0x26, 0xc7, 0xf4, 0x93, 0xca, 0x3e, 0x8a, 0x7b, + 0x26, 0xc7, 0xf4, 0x93, 0xca, 0x3e, 0x8a, 0x0a, + 0xde, 0x94, 0xd2, 0xac, 0x9e, 0xc9, 0xb1, 0xfd, + 0x24, 0xf2, 0x8f, 0xa2, 0x9e, 0xc9, 0xb1, 0xfd, + 0x24, 0xf2, 0x8f, 0xa2, 0x82, 0xb7, 0xa5, 0x34, + 0xab, 0x27, 0xb2, 0x6c, 0x7f, 0x49, 0x3c, 0xa3, + 0xe8, 0xa7, 0xb2, 0x6c, 0x7f, 0x49, 0x3c, 0xa3, + 0xe8, 0xa0, 0xad, 0xe9, 0x4d, 0x2a, 0xc9, 0xec, + 0x9b, 0x1f, 0xd2, 0x4f, 0x28, 0xfa, 0x29, 0xec, + 0x9b, 0x1f, 0xd2, 0x4f, 0x28, 0xfa, 0x28, 0x2b, + 0x7a, 0x53, 0x4a, 0xb2, 0x7b, 0x26, 0xc7, 0xf4, + 0x93, 0xca, 0x3e, 0x8a, 0x7b, 0x26, 0xc7, 0xf4, + 0x93, 0xca, 0x3e, 0x8a, 0x0a, 0xde, 0x95, 0x25, + 0xb3, 0x7f, 0xce, 0x6d, 0xfb, 0x6e, 0xfa, 0x85, + 0x49, 0x7b, 0x26, 0xc7, 0xf4, 0x93, 0xca, 0x3e, + 0x8a, 0xdf, 0x97, 0xc5, 0xb3, 0x10, 0x5e, 0xc5, + 0x25, 0xad, 0xc1, 0x75, 0xc5, 0x70, 0xc6, 0xd2, + 0x49, 0xa9, 0x70, 0xc3, 0xf3, 0x7b, 0x28, 0x33, + 0x98, 0x7b, 0xec, 0xde, 0x77, 0xc8, 0x17, 0x3a, + 0xea, 0xcd, 0x18, 0x1b, 0x7a, 0xfa, 0x7e, 0x70, + 0x0e, 0x3d, 0xb2, 0x17, 0x2a, 0x02, 0x22, 0x20, + 0x6d, 0x67, 0xb8, 0x58, 0xff, 0x00, 0x6b, 0xea, + 0x85, 0x58, 0x56, 0x7d, 0xac, 0xf7, 0x0b, 0x1f, + 0xed, 0x7d, 0x50, 0xab, 0x08, 0x08, 0x88, 0x80, + 0xba, 0x72, 0xeb, 0x09, 0x73, 0x0b, 0xa6, 0xdb, + 0x44, 0x43, 0x4b, 0xb4, 0xb9, 0xc7, 0x50, 0x68, + 0xd6, 0x57, 0x32, 0xe8, 0xb2, 0xbf, 0xb8, 0xb1, + 0x91, 0xd2, 0xdb, 0xb8, 0x35, 0xcf, 0x61, 0x63, + 0x89, 0x15, 0xf1, 0x4e, 0x9f, 0x91, 0x04, 0xa4, + 0x79, 0x2e, 0x51, 0x73, 0x33, 0xac, 0xed, 0xaf, + 0x5c, 0xeb, 0xb1, 0x5c, 0x38, 0x9b, 0xe2, 0xb8, + 0x8d, 0xe2, 0xa1, 0xa5, 0x89, 0xf0, 0xca, 0xe8, + 0x64, 0x14, 0x92, 0x32, 0x5a, 0xe1, 0xd9, 0x0a, + 0x6f, 0x23, 0xca, 0xae, 0xa1, 0x9e, 0x2c, 0xd6, + 0xe0, 0x08, 0xed, 0x63, 0x06, 0x5d, 0x1e, 0x33, + 0x8d, 0x41, 0x14, 0xc2, 0xde, 0xda, 0xd5, 0x61, + 0x77, 0x67, 0x7b, 0x9b, 0xce, 0xdb, 0xa8, 0x9a, + 0xe8, 0xaf, 0xdc, 0xee, 0x6d, 0xce, 0x02, 0xac, + 0x71, 0xf2, 0x4a, 0x08, 0x6a, 0x1d, 0xd4, 0x53, + 0xd6, 0xd9, 0x5c, 0x59, 0x5c, 0x17, 0x97, 0x79, + 0x84, 0x6d, 0x93, 0x9a, 0x26, 0x1b, 0x68, 0xde, + 0x05, 0x1c, 0xe3, 0xa9, 0xca, 0x06, 0xb5, 0xd3, + 0xbf, 0xbc, 0x83, 0xbf, 0x25, 0xcb, 0x9b, 0x98, + 0xde, 0x88, 0x64, 0x24, 0x44, 0xc6, 0x39, 0xf2, + 0x91, 0xa0, 0xd0, 0x68, 0x1d, 0xf2, 0xbd, 0x67, + 0x99, 0x6c, 0x79, 0x75, 0xdb, 0x62, 0x89, 0xc5, + 0xf1, 0x48, 0xc0, 0xf8, 0xdc, 0xe3, 0x5d, 0xfe, + 0x25, 0xd7, 0x93, 0x9f, 0x64, 0xc9, 0x2f, 0xef, + 0xff, 0x00, 0x3e, 0x4a, 0x41, 0x11, 0xee, 0x69, + 0xa7, 0x74, 0xa6, 0x6a, 0x3d, 0xaf, 0x67, 0xac, + 0x2e, 0xc7, 0x97, 0x07, 0xea, 0x64, 0x3d, 0xed, + 0x3c, 0x94, 0x10, 0x7b, 0xb4, 0x4e, 0xce, 0xe7, + 0x0a, 0xb0, 0x46, 0x32, 0xfb, 0x4d, 0x9f, 0xb6, + 0xbe, 0x96, 0xd9, 0x93, 0x5c, 0x73, 0x85, 0xac, + 0xc5, 0xa0, 0x17, 0x55, 0xde, 0x56, 0xf8, 0xa0, + 0x58, 0xbb, 0x36, 0xd9, 0x9e, 0x43, 0x25, 0xf8, + 0xb6, 0x65, 0xbd, 0xc5, 0xbb, 0xc3, 0x3f, 0x56, + 0x00, 0x06, 0xa4, 0x6f, 0x79, 0xc8, 0x20, 0x2b, + 0x4d, 0x7c, 0x2b, 0x04, 0x9c, 0x24, 0x81, 0xa8, + 0x55, 0x4e, 0x8b, 0xbc, 0xbf, 0x2c, 0xcb, 0xed, + 0xbd, 0x9a, 0x28, 0x6e, 0x6e, 0xe7, 0xf1, 0xa6, + 0x74, 0x94, 0x76, 0x1e, 0xc2, 0xf3, 0x9e, 0x43, + 0x6d, 0x2e, 0x5b, 0x69, 0x99, 0x45, 0x03, 0x6d, + 0xa4, 0x9f, 0x13, 0x64, 0x63, 0x45, 0x06, 0xa3, + 0xb9, 0xdc, 0x41, 0xcf, 0x9d, 0x65, 0xd0, 0x65, + 0xef, 0xb7, 0x6c, 0x25, 0xcf, 0x12, 0xc4, 0x24, + 0x76, 0x23, 0x53, 0xa5, 0x46, 0xd7, 0x7d, 0x58, + 0xf3, 0xdb, 0x53, 0x77, 0x98, 0x65, 0xb6, 0xd5, + 0xa7, 0x3b, 0x0b, 0x1a, 0x4e, 0xf0, 0xae, 0x95, + 0x8b, 0xac, 0xca, 0xc6, 0xc2, 0xf8, 0xd8, 0x45, + 0x65, 0x0b, 0xed, 0x63, 0x70, 0x8e, 0x57, 0x39, + 0xa0, 0xbc, 0x9d, 0x18, 0x8f, 0x71, 0x05, 0x77, + 0x4a, 0x29, 0xf9, 0x72, 0x18, 0xbe, 0x21, 0x65, + 0xa3, 0x7d, 0xd6, 0x50, 0x27, 0xa7, 0xf5, 0x74, + 0xd4, 0x7d, 0x15, 0xed, 0x99, 0x86, 0x59, 0x77, + 0x98, 0xb3, 0x2f, 0x75, 0x8c, 0x4c, 0xb7, 0xc7, + 0x82, 0x39, 0x1a, 0x00, 0x78, 0x73, 0x7e, 0x77, + 0x63, 0x42, 0x0a, 0xed, 0x41, 0xd5, 0xc2, 0xb6, + 0xda, 0xdb, 0x49, 0x77, 0x71, 0x1d, 0xbc, 0x5e, + 0x5c, 0x8e, 0x0d, 0x04, 0xee, 0x76, 0x57, 0x56, + 0x7d, 0x14, 0x50, 0xe6, 0xd3, 0xc7, 0x13, 0x43, + 0x18, 0xd2, 0x00, 0x6b, 0x45, 0x00, 0xf1, 0x41, + 0x5d, 0x7b, 0x25, 0x18, 0x76, 0x6d, 0x88, 0xff, + 0x00, 0xc3, 0x8d, 0xc4, 0x78, 0x10, 0x7b, 0x96, + 0xcb, 0x67, 0x2d, 0x25, 0xf6, 0x4b, 0x99, 0xa7, + 0x7c, 0xed, 0x38, 0x64, 0x91, 0x9e, 0x43, 0x5d, + 0xc0, 0xb8, 0x73, 0x8c, 0xac, 0xe5, 0xd7, 0x0d, + 0x63, 0x5d, 0xce, 0xc1, 0x28, 0x0f, 0x85, 0xfa, + 0x2a, 0x46, 0xef, 0x02, 0xe3, 0xb8, 0x77, 0x39, + 0x3c, 0xae, 0x76, 0x92, 0xe7, 0xb8, 0x9a, 0xef, + 0x92, 0xbb, 0xe0, 0x96, 0xeb, 0x39, 0xbb, 0xb4, + 0xb1, 0xb8, 0x7d, 0x58, 0xcf, 0x15, 0xa4, 0x00, + 0x0b, 0x59, 0x4f, 0x1b, 0x57, 0x69, 0x04, 0x6d, + 0x46, 0xaa, 0xe9, 0xf9, 0x53, 0x77, 0x7b, 0x7c, + 0x95, 0x61, 0x9b, 0x34, 0xb0, 0x87, 0x32, 0x39, + 0x70, 0xb1, 0x85, 0xd6, 0x6d, 0x7f, 0x34, 0x5d, + 0x4a, 0xbe, 0xa7, 0x46, 0x2a, 0xf6, 0xd2, 0xd7, + 0x2a, 0xb6, 0xb7, 0xda, 0x7f, 0x62, 0x73, 0x04, + 0x96, 0xe5, 0x8e, 0x7c, 0x61, 0xc2, 0xa3, 0x09, + 0x6d, 0x40, 0x3d, 0xa2, 0x82, 0xbd, 0xa3, 0x74, + 0xa1, 0xd1, 0xbd, 0xda, 0xae, 0x95, 0x64, 0xb1, + 0xbd, 0xcb, 0xdd, 0x99, 0xf5, 0x53, 0x2c, 0x63, + 0x36, 0xef, 0x73, 0xa3, 0xe7, 0x1c, 0x01, 0x79, + 0x22, 0xbe, 0x31, 0xd1, 0xa9, 0x62, 0x2b, 0xac, + 0xbe, 0xd3, 0x33, 0x19, 0x4c, 0x76, 0x71, 0xc9, + 0x01, 0x93, 0x9a, 0x92, 0x57, 0xe9, 0x79, 0x71, + 0x3a, 0x69, 0xe6, 0xa0, 0xad, 0xd7, 0x7d, 0x64, + 0x9a, 0x1a, 0x1e, 0xfe, 0x85, 0x61, 0xb2, 0xcb, + 0xad, 0x59, 0xb5, 0x12, 0xd9, 0xba, 0x36, 0xbe, + 0x06, 0xb5, 0xc4, 0x31, 0xc2, 0xa0, 0x55, 0xa0, + 0x8f, 0x0a, 0x5b, 0x66, 0x19, 0x69, 0xbe, 0x19, + 0x68, 0xb2, 0x8b, 0xd9, 0x1e, 0xf3, 0x10, 0x93, + 0x5b, 0xf1, 0x12, 0x46, 0x22, 0x7b, 0x88, 0x2b, + 0xda, 0x7f, 0xa1, 0x2b, 0xb9, 0xac, 0x9e, 0xc8, + 0x53, 0x56, 0xf6, 0x19, 0x75, 0x9e, 0x71, 0x75, + 0x15, 0xe9, 0x69, 0x86, 0xd8, 0x39, 0xf1, 0x32, + 0x43, 0x4c, 0x75, 0xf1, 0x9a, 0x34, 0xf6, 0x0a, + 0xea, 0xca, 0xee, 0xad, 0xf3, 0x9b, 0x89, 0x2c, + 0x67, 0xb2, 0x86, 0x36, 0x16, 0x12, 0xc7, 0xc6, + 0xda, 0x16, 0xd3, 0x7c, 0xa0, 0xad, 0xe8, 0xa8, + 0x15, 0xd7, 0xa1, 0x2a, 0x0e, 0xa3, 0x55, 0x3b, + 0x90, 0x5b, 0x58, 0xc9, 0x63, 0x98, 0x3a, 0xf1, + 0xa1, 0xcd, 0x87, 0x0f, 0x8c, 0x75, 0x86, 0xe9, + 0xd4, 0x7b, 0x8b, 0x10, 0x5d, 0xe5, 0x99, 0x96, + 0x61, 0x03, 0x2e, 0x21, 0x8e, 0xca, 0xd2, 0xdd, + 0xae, 0x34, 0x26, 0x98, 0xc6, 0x8c, 0x21, 0xc6, + 0x81, 0x04, 0x15, 0x57, 0x6e, 0x53, 0x97, 0x8c, + 0xc6, 0xf9, 0xb6, 0x85, 0xfc, 0xde, 0x26, 0x97, + 0x17, 0x01, 0x53, 0xa0, 0x57, 0x51, 0xa2, 0x98, + 0xcb, 0xf3, 0x0b, 0x4c, 0xca, 0xfb, 0xd8, 0x1f, + 0x63, 0x08, 0xb6, 0x93, 0x10, 0x61, 0x6b, 0x46, + 0x26, 0xd0, 0x6b, 0xa8, 0x58, 0xd9, 0xd9, 0x22, + 0x83, 0x36, 0x7d, 0x80, 0x89, 0x84, 0x87, 0xcb, + 0x49, 0xcf, 0x97, 0x41, 0xa0, 0x37, 0xbc, 0x82, + 0xbd, 0x2b, 0x30, 0x4a, 0xf8, 0xeb, 0x50, 0xc2, + 0x45, 0x69, 0xbc, 0x68, 0xbc, 0x8d, 0x3a, 0x94, + 0xfd, 0xb4, 0x76, 0xf9, 0xc6, 0x6f, 0x85, 0xf6, + 0xec, 0x82, 0x1b, 0x40, 0xf7, 0xca, 0x23, 0xd3, + 0x8e, 0x84, 0x79, 0x5d, 0xd5, 0xea, 0xcf, 0x31, + 0xb2, 0xcc, 0x6f, 0x7d, 0x82, 0x4b, 0x28, 0x62, + 0xb7, 0x98, 0x96, 0xc2, 0xf6, 0x00, 0x1e, 0xd2, + 0x01, 0xa1, 0x3c, 0x08, 0x2b, 0xdb, 0xbd, 0x84, + 0x1a, 0x7b, 0x9a, 0xe8, 0xac, 0x39, 0x3e, 0x5b, + 0x6c, 0xd9, 0xb3, 0x38, 0x2e, 0x9a, 0x1e, 0xdb, + 0x70, 0xe6, 0x87, 0x10, 0x0b, 0x80, 0x05, 0xd5, + 0x73, 0x6b, 0xd8, 0x0b, 0xcd, 0x94, 0x96, 0x19, + 0xc6, 0x61, 0x6f, 0x64, 0x2d, 0x5b, 0x6f, 0x6f, + 0x0e, 0x27, 0x80, 0x0f, 0x8c, 0xf0, 0xd1, 0xa0, + 0x3a, 0x80, 0x76, 0xd0, 0x40, 0x68, 0xa6, 0xb1, + 0xe1, 0x08, 0xac, 0x51, 0x66, 0x56, 0x33, 0xde, + 0xc9, 0x61, 0x7b, 0x69, 0x05, 0xb5, 0xaf, 0x8c, + 0xd6, 0xbf, 0x0d, 0x1c, 0x08, 0xd0, 0x34, 0xd1, + 0x40, 0x4a, 0xc6, 0x32, 0x57, 0xb1, 0x8e, 0xc6, + 0xc6, 0xb8, 0x86, 0xbb, 0x7c, 0x03, 0xa0, 0xa0, + 0xf0, 0x88, 0x88, 0x0b, 0x75, 0xa7, 0xbd, 0xc1, + 0xf6, 0xac, 0xfa, 0xcb, 0x4a, 0xdd, 0x69, 0xef, + 0x70, 0x7d, 0xab, 0x3e, 0xb2, 0x0b, 0x86, 0x75, + 0xef, 0x4d, 0xf3, 0x07, 0x84, 0xae, 0x05, 0xdf, + 0x9d, 0x7b, 0xd3, 0x7c, 0xc1, 0xe1, 0x2b, 0x81, + 0x06, 0x63, 0xfd, 0xa3, 0x7b, 0x6a, 0x58, 0xa8, + 0x98, 0xff, 0x00, 0x68, 0xde, 0xda, 0x96, 0x28, + 0x30, 0xb8, 0x33, 0x0f, 0x7a, 0xb4, 0xfb, 0x4f, + 0x94, 0x2e, 0xf5, 0xc1, 0x98, 0x7b, 0xd5, 0xa7, + 0xda, 0x7c, 0xa1, 0x03, 0x2f, 0xf7, 0x9b, 0xbf, + 0x3c, 0xfd, 0x62, 0xbb, 0xf4, 0x6f, 0x85, 0xc1, + 0x97, 0xfb, 0xcd, 0xdf, 0x9e, 0x7e, 0xb1, 0x5d, + 0xc8, 0x32, 0xed, 0x47, 0x4d, 0x54, 0x49, 0xd6, + 0x54, 0xa9, 0xd4, 0x54, 0x51, 0xd6, 0x50, 0x37, + 0x56, 0xdd, 0xa0, 0x34, 0xd9, 0xe8, 0x3c, 0xf6, + 0x7f, 0x79, 0x69, 0xd3, 0x5a, 0x05, 0xbb, 0x3b, + 0x69, 0x97, 0x66, 0x98, 0xf6, 0xe9, 0xe6, 0x9c, + 0xc7, 0x1e, 0xe1, 0x2d, 0xfe, 0xf2, 0xb5, 0x3e, + 0xe8, 0x9f, 0x7b, 0x9e, 0x6f, 0xe1, 0x5f, 0xe0, + 0xaa, 0x62, 0x4c, 0x4b, 0x5e, 0x25, 0x9c, 0x4b, + 0x66, 0xaf, 0x22, 0x23, 0xc3, 0xe0, 0xf7, 0x89, + 0x31, 0x2f, 0x18, 0x93, 0x12, 0x27, 0x47, 0xbc, + 0x49, 0x89, 0x78, 0xc4, 0x98, 0x90, 0xd1, 0xef, + 0x12, 0x62, 0xf9, 0x7c, 0x0b, 0x5e, 0x24, 0xc4, + 0x37, 0xe8, 0x9a, 0x91, 0x0f, 0xa0, 0x58, 0xc6, + 0xe9, 0xb2, 0x18, 0xa3, 0x6e, 0xb9, 0x20, 0x2d, + 0x15, 0xd1, 0xa4, 0x82, 0x14, 0x56, 0x49, 0xb3, + 0x97, 0x96, 0xd7, 0x8c, 0xb9, 0xbc, 0x73, 0x00, + 0x88, 0x78, 0xac, 0x69, 0xa9, 0x2e, 0xdf, 0x50, + 0x70, 0xed, 0x06, 0x6d, 0x04, 0x4d, 0x8a, 0x2b, + 0x92, 0xd8, 0xd8, 0x28, 0xd6, 0x86, 0xb4, 0x80, + 0x3b, 0xa1, 0x66, 0x4d, 0xa0, 0xce, 0x24, 0x61, + 0x63, 0xee, 0xdc, 0x01, 0xde, 0x0d, 0x69, 0xe1, + 0x68, 0x5c, 0x76, 0x5f, 0xea, 0xd3, 0xc2, 0xcd, + 0x7d, 0xfc, 0x33, 0xb3, 0x74, 0x4c, 0xcd, 0x22, + 0x21, 0x2b, 0xb4, 0xf7, 0xd1, 0x4b, 0x7f, 0x6f, + 0x6d, 0x50, 0xe1, 0x07, 0x8d, 0x29, 0x1b, 0x85, + 0xc4, 0x0a, 0x29, 0x6d, 0xa1, 0xb7, 0xba, 0xb9, + 0xcb, 0x43, 0x2c, 0x81, 0x7d, 0x5c, 0xd2, 0xe6, + 0xb4, 0xd3, 0x13, 0x28, 0x7f, 0xa1, 0x51, 0x4b, + 0xab, 0x52, 0x74, 0x93, 0xae, 0xbb, 0xaa, 0x46, + 0x0d, 0xa3, 0xcd, 0x60, 0x84, 0x42, 0xc9, 0xb1, + 0x31, 0xba, 0x01, 0x70, 0xa9, 0x03, 0x79, 0x4c, + 0xe3, 0xfb, 0x76, 0xfe, 0xaa, 0xb5, 0xf3, 0x11, + 0x3d, 0xc9, 0xbf, 0x0d, 0xfe, 0x1a, 0x72, 0x5b, + 0x32, 0x2b, 0x39, 0xec, 0xf2, 0xa1, 0x0c, 0xff, + 0x00, 0xb5, 0xf1, 0xde, 0xe6, 0xeb, 0xa6, 0x2d, + 0xca, 0xa8, 0x0d, 0x91, 0x70, 0xeb, 0x57, 0x83, + 0xa0, 0x98, 0x9e, 0x3e, 0x93, 0x4a, 0x8e, 0x8f, + 0x3d, 0xcd, 0x62, 0x0e, 0xe6, 0xee, 0x5c, 0x39, + 0xc7, 0x17, 0x3e, 0xa1, 0xa4, 0x12, 0x7b, 0x61, + 0x72, 0xc3, 0x77, 0x3c, 0x13, 0x8b, 0x88, 0x5e, + 0x59, 0x28, 0xaf, 0x8e, 0x3b, 0x3a, 0xf4, 0x50, + 0x68, 0x4a, 0xd2, 0x74, 0xb6, 0xb3, 0xf7, 0x26, + 0xd9, 0xeb, 0x33, 0x8e, 0x63, 0xf5, 0x16, 0x8d, + 0xa0, 0xb0, 0x9f, 0xac, 0xa1, 0xbf, 0x20, 0x1b, + 0x46, 0x98, 0xc4, 0xae, 0xae, 0x91, 0xe3, 0x81, + 0xab, 0xba, 0xbb, 0x76, 0x92, 0xd6, 0xf6, 0xe6, + 0xcd, 0x91, 0xd9, 0xb4, 0xc8, 0x71, 0x83, 0x23, + 0x1a, 0x68, 0x4b, 0x69, 0xa3, 0xb8, 0xaa, 0x97, + 0x59, 0xee, 0x67, 0x77, 0x01, 0xb7, 0x9e, 0x6c, + 0x51, 0x3f, 0xca, 0x18, 0x5a, 0x09, 0xa6, 0x9d, + 0x61, 0x6d, 0x87, 0x69, 0x73, 0x68, 0x62, 0x10, + 0xb2, 0x50, 0x43, 0x05, 0x1a, 0xe7, 0x00, 0x48, + 0x03, 0x7c, 0xa8, 0xd9, 0x6d, 0x2b, 0xe1, 0xf4, + 0x9d, 0xec, 0x5f, 0xee, 0x47, 0x1a, 0xc6, 0x4e, + 0x5e, 0x2b, 0x66, 0x55, 0x69, 0x25, 0x9e, 0x4c, + 0x20, 0x96, 0x82, 0x46, 0xb5, 0xe5, 0xcd, 0x1b, + 0x84, 0xd7, 0x42, 0xa1, 0x87, 0x68, 0x0b, 0xae, + 0x3c, 0xfb, 0x36, 0x89, 0xae, 0x6c, 0x77, 0x0e, + 0xa3, 0xc9, 0x73, 0x81, 0x0d, 0x75, 0x4b, 0xb5, + 0xeb, 0x0b, 0x8b, 0x15, 0x74, 0xef, 0xab, 0x63, + 0xac, 0xd6, 0x66, 0x67, 0xda, 0xe7, 0x9b, 0x25, + 0x6f, 0x14, 0x8a, 0x7e, 0xa4, 0x69, 0xc7, 0xc5, + 0x39, 0xb2, 0x86, 0xb9, 0xb3, 0x7e, 0xcd, 0xcb, + 0x7e, 0xd9, 0x1a, 0x5e, 0xc1, 0x4f, 0x56, 0x7e, + 0xb1, 0x50, 0x36, 0x97, 0xb7, 0x16, 0x72, 0x89, + 0xad, 0xdf, 0xcd, 0xc9, 0x4a, 0x62, 0xd1, 0xab, + 0xb4, 0xe5, 0xea, 0xef, 0x30, 0xbb, 0xbd, 0x7b, + 0x5f, 0x75, 0x2f, 0x3a, 0xe6, 0x0a, 0x02, 0x40, + 0x1f, 0x54, 0x26, 0xdf, 0xaf, 0x77, 0xb0, 0x8c, + 0x91, 0x18, 0x7b, 0x7a, 0x71, 0xe6, 0xd7, 0x89, + 0x5d, 0x36, 0x54, 0xd7, 0x26, 0x6f, 0x61, 0xd2, + 0x78, 0x55, 0x1f, 0x12, 0xec, 0xb5, 0xce, 0x73, + 0x2b, 0x48, 0x79, 0x8b, 0x79, 0xcc, 0x71, 0x8a, + 0x90, 0xdc, 0x2d, 0x23, 0x4e, 0xbd, 0x34, 0x53, + 0x92, 0x26, 0xf1, 0xa7, 0xbd, 0x5f, 0x2f, 0x78, + 0xc5, 0x7d, 0xd3, 0x1e, 0xcd, 0x34, 0x6b, 0x12, + 0x98, 0xee, 0x79, 0xcf, 0x99, 0x26, 0x33, 0xbf, + 0x46, 0xba, 0xb4, 0xee, 0xab, 0x96, 0x7b, 0x6d, + 0x26, 0x67, 0x94, 0xb5, 0xd6, 0xa3, 0x9c, 0x75, + 0x5b, 0x2b, 0x1a, 0x37, 0x45, 0x35, 0x77, 0xd5, + 0x18, 0xbc, 0xb8, 0x92, 0x74, 0x92, 0x6b, 0xa5, + 0x76, 0xd9, 0x67, 0xb9, 0x9d, 0x93, 0x39, 0xa8, + 0x25, 0xfd, 0x50, 0xd4, 0xc7, 0x0a, 0x81, 0xe6, + 0xa5, 0xeb, 0x33, 0x31, 0x68, 0xf1, 0x85, 0xb0, + 0x64, 0xad, 0x62, 0xf5, 0xb7, 0x85, 0xa5, 0x6c, + 0xc8, 0xed, 0xe4, 0xcb, 0x32, 0x97, 0x3a, 0xec, + 0x73, 0x6e, 0xab, 0xa5, 0x7b, 0x49, 0xf2, 0x45, + 0x34, 0x0e, 0xda, 0x88, 0xd9, 0x39, 0x84, 0x99, + 0xad, 0xc3, 0xce, 0x83, 0x23, 0x1e, 0xe6, 0x8e, + 0xc1, 0x7b, 0x4a, 0x8a, 0xbd, 0xce, 0xf3, 0x1b, + 0xe6, 0x18, 0xee, 0x25, 0xfd, 0x51, 0xd7, 0x1b, + 0x74, 0x02, 0x7b, 0x9b, 0x8b, 0x9a, 0xde, 0xea, + 0xe2, 0xd6, 0x51, 0x35, 0xb3, 0xcc, 0x72, 0xb4, + 0x50, 0x38, 0x6f, 0x1d, 0xf0, 0x55, 0x76, 0x4e, + 0x96, 0xd6, 0x78, 0xd9, 0x7b, 0x66, 0xae, 0xec, + 0x5b, 0x62, 0x76, 0xe2, 0x9f, 0x9a, 0xcd, 0x9f, + 0x5a, 0xdc, 0xc1, 0x9a, 0xc7, 0x9a, 0x86, 0x83, + 0x6b, 0x19, 0x8b, 0x13, 0xab, 0xa4, 0x10, 0x70, + 0xea, 0x5d, 0xbb, 0x49, 0x65, 0x3d, 0xfd, 0x8c, + 0x6f, 0xb3, 0x6f, 0x3a, 0xf6, 0x3b, 0x18, 0x6b, + 0x69, 0xa5, 0xa4, 0x11, 0xa3, 0x52, 0xaa, 0x5d, + 0x67, 0x99, 0x95, 0xe4, 0x26, 0x0b, 0x89, 0xb1, + 0x44, 0xea, 0x62, 0x6e, 0x10, 0x2a, 0x41, 0xae, + 0xf2, 0xf7, 0x69, 0x9f, 0xe6, 0x76, 0x71, 0x88, + 0xa2, 0x96, 0xb1, 0x8f, 0x25, 0x8f, 0x18, 0xa9, + 0xc3, 0xa5, 0x46, 0xcb, 0x46, 0xde, 0x31, 0xad, + 0x56, 0xef, 0x63, 0x99, 0xbf, 0x8c, 0x46, 0x4f, + 0x14, 0xd7, 0x51, 0x59, 0x5a, 0xe4, 0xce, 0xb8, + 0xbf, 0x67, 0xfd, 0xcb, 0x58, 0x5c, 0x74, 0x9a, + 0x62, 0x3e, 0x48, 0xa2, 0xec, 0xd9, 0xb9, 0x9b, + 0x73, 0x92, 0xf3, 0x20, 0x8c, 0x6c, 0x2f, 0x8d, + 0xc3, 0x7a, 0xb5, 0xa7, 0x73, 0x4a, 0xaa, 0xdf, + 0x67, 0x17, 0xf7, 0xf4, 0x17, 0x32, 0xe2, 0x60, + 0xd2, 0x18, 0x34, 0x36, 0xbb, 0xe4, 0x0d, 0xd5, + 0xae, 0xd3, 0x30, 0xbb, 0xb2, 0x93, 0x9d, 0xb6, + 0x90, 0xb1, 0xc7, 0x41, 0xdd, 0x04, 0x76, 0x41, + 0xd6, 0x9d, 0xb9, 0x9a, 0xf8, 0xf1, 0xd7, 0x55, + 0x63, 0x35, 0x29, 0x6a, 0xe9, 0x13, 0x35, 0x8a, + 0xec, 0xd7, 0xda, 0xb0, 0x64, 0x59, 0x05, 0xc4, + 0x77, 0x72, 0xba, 0xfe, 0x06, 0x98, 0x58, 0xdc, + 0x0d, 0xc5, 0x42, 0x1c, 0x6b, 0xa0, 0xb5, 0x73, + 0xce, 0xeb, 0x66, 0xed, 0x44, 0x2c, 0xb7, 0x0d, + 0x64, 0x51, 0xcb, 0x1b, 0x7c, 0x5d, 0x0d, 0xa8, + 0x1e, 0x37, 0x7d, 0x71, 0xcb, 0xb4, 0xd9, 0xc4, + 0xac, 0x31, 0xf3, 0xa1, 0x80, 0xe8, 0x25, 0xad, + 0xa3, 0xa9, 0xdb, 0xdf, 0x51, 0x82, 0x47, 0x07, + 0x63, 0x04, 0xe2, 0x07, 0x16, 0x2d, 0x46, 0xa3, + 0x75, 0x4c, 0x56, 0xda, 0xda, 0x6d, 0xed, 0x8d, + 0x11, 0x7b, 0xe3, 0xac, 0x52, 0xb4, 0x8f, 0xb6, + 0xdb, 0xe6, 0x67, 0xc5, 0x76, 0xda, 0x8c, 0xbe, + 0xee, 0xf6, 0xde, 0x23, 0x6c, 0x03, 0x8c, 0x45, + 0xc5, 0xe0, 0x9a, 0x68, 0xa7, 0xf4, 0x2d, 0x99, + 0x51, 0xff, 0x00, 0xeb, 0x6c, 0x3a, 0xbf, 0x52, + 0xff, 0x00, 0x01, 0x55, 0x63, 0xb4, 0x79, 0xcb, + 0x98, 0x63, 0x37, 0x15, 0x04, 0x10, 0x6a, 0xd1, + 0xa4, 0x1e, 0xe2, 0xd5, 0x16, 0x75, 0x99, 0xc3, + 0x6c, 0x2d, 0x62, 0x9c, 0xb6, 0x16, 0xb4, 0xb4, + 0x36, 0x8d, 0xa5, 0x0e, 0xf9, 0x21, 0x57, 0xb7, + 0x6d, 0x22, 0x35, 0x8e, 0x13, 0xaa, 0xf3, 0x9f, + 0x1c, 0x5e, 0x6f, 0x11, 0x3a, 0xda, 0xbb, 0x56, + 0x3d, 0x8f, 0xb9, 0x63, 0xec, 0xa4, 0x80, 0x91, + 0x8a, 0x27, 0xe2, 0xa0, 0xf9, 0xae, 0x1a, 0xd6, + 0x8c, 0xa7, 0x24, 0xbe, 0x83, 0x3c, 0x32, 0xca, + 0xca, 0x41, 0x11, 0x7b, 0x84, 0x95, 0xd0, 0xec, + 0x55, 0xc3, 0x84, 0x77, 0x55, 0x6e, 0xd6, 0xf2, + 0x7b, 0x49, 0x44, 0xb6, 0xd2, 0x18, 0xde, 0x34, + 0x68, 0xde, 0xde, 0xec, 0xa9, 0x07, 0xed, 0x46, + 0x6e, 0xe6, 0x16, 0x73, 0xa1, 0xa4, 0xe8, 0xc4, + 0x1a, 0x31, 0x71, 0x29, 0x9a, 0x5b, 0x5b, 0x69, + 0xfa, 0xca, 0xd3, 0x26, 0x3d, 0x98, 0xf7, 0x71, + 0xb6, 0x29, 0xd6, 0x13, 0x19, 0xc5, 0xd3, 0x64, + 0xda, 0x0c, 0xbe, 0x06, 0x1a, 0x98, 0x5e, 0x0b, + 0xbb, 0x6e, 0x23, 0x47, 0x79, 0x7b, 0xdb, 0x13, + 0x4b, 0x4b, 0x6f, 0xb4, 0x3e, 0x05, 0x53, 0x6d, + 0xcc, 0xcc, 0xb8, 0x17, 0x21, 0xe4, 0xcc, 0x1d, + 0x8c, 0xc8, 0x74, 0x9c, 0x5b, 0xfa, 0x6a, 0xb7, + 0x5e, 0x66, 0xb9, 0x85, 0xeb, 0x1a, 0xdb, 0xa9, + 0x8c, 0xad, 0x61, 0xc4, 0xd0, 0x43, 0x46, 0x9f, + 0xec, 0x80, 0x54, 0xd6, 0x9a, 0x5a, 0x93, 0xd2, + 0x8b, 0x66, 0x89, 0xae, 0x58, 0x9f, 0xfe, 0xe4, + 0xeb, 0x1e, 0xe5, 0xc3, 0x24, 0x35, 0xd9, 0xc6, + 0x9f, 0xf0, 0xe4, 0xf0, 0xb9, 0x52, 0x03, 0xb4, + 0x05, 0xd5, 0x06, 0x75, 0x99, 0x41, 0x6e, 0x2d, + 0xe2, 0x9c, 0xb6, 0x10, 0x08, 0x0d, 0xc2, 0xdd, + 0x47, 0xb9, 0x55, 0xc5, 0x5e, 0xea, 0xb5, 0x2b, + 0xb6, 0x6d, 0x3d, 0x4a, 0x67, 0xbc, 0x5e, 0xb4, + 0x88, 0xfd, 0x58, 0x6c, 0xc4, 0x98, 0x97, 0x8c, + 0x49, 0x89, 0x5d, 0xcb, 0x47, 0xbc, 0x49, 0x89, + 0x78, 0xc4, 0x98, 0x90, 0xd1, 0xef, 0x12, 0x62, + 0x5e, 0x31, 0x26, 0x24, 0x34, 0x7b, 0xc4, 0xae, + 0x31, 0x1a, 0xec, 0xe5, 0xa1, 0xfe, 0xab, 0x55, + 0x28, 0xbe, 0x80, 0x9d, 0xc1, 0xa4, 0xf6, 0x95, + 0xdd, 0xcc, 0x74, 0x19, 0x1d, 0x94, 0x0f, 0xd0, + 0xfc, 0x2d, 0xc4, 0x3b, 0x34, 0xa9, 0x5c, 0x73, + 0xf8, 0x44, 0x7b, 0xda, 0xfc, 0x94, 0x4e, 0xfb, + 0x7b, 0xa3, 0x47, 0x12, 0x22, 0x2c, 0xed, 0xe2, + 0x22, 0x20, 0xc6, 0xd8, 0x6a, 0xb1, 0xf3, 0x5f, + 0xfd, 0xc5, 0x5c, 0x56, 0x3d, 0xb0, 0xd5, 0x65, + 0xe6, 0xbf, 0xfb, 0x8a, 0xb8, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x0b, + 0x0b, 0x2b, 0x65, 0xb4, 0x6c, 0x96, 0xe6, 0x28, + 0xe4, 0x21, 0xb1, 0xb9, 0xed, 0x12, 0x13, 0xa0, + 0x06, 0xd4, 0x56, 0xa6, 0xa2, 0x88, 0x30, 0xc8, + 0x27, 0x94, 0x17, 0x47, 0x13, 0xde, 0xd1, 0xac, + 0xb1, 0xa5, 0xc3, 0x86, 0x8b, 0xc5, 0x08, 0xd0, + 0x75, 0xfe, 0x5d, 0xa5, 0x3f, 0x9a, 0xe7, 0xb7, + 0x16, 0xb7, 0x62, 0xdb, 0x2e, 0x7b, 0x19, 0x6d, + 0x0b, 0x5a, 0x28, 0xc0, 0xd7, 0x07, 0x1a, 0x57, + 0x5a, 0x67, 0x76, 0xad, 0xbc, 0x76, 0x5f, 0x71, + 0x18, 0x6c, 0x57, 0x17, 0xcd, 0x01, 0xf5, 0xf1, + 0x5a, 0x5d, 0x86, 0xa2, 0xbd, 0xbd, 0x48, 0x20, + 0x11, 0x74, 0x4d, 0x61, 0x75, 0x0d, 0xe0, 0xb1, + 0x73, 0x47, 0x3e, 0x48, 0x68, 0x03, 0x48, 0x35, + 0xdd, 0x0b, 0x17, 0xb6, 0x73, 0x58, 0xce, 0xeb, + 0x79, 0x8b, 0x4c, 0x8c, 0x00, 0x9c, 0x06, 0xb4, + 0xae, 0xe1, 0x41, 0xa1, 0x74, 0xb3, 0x2c, 0xcc, + 0x9f, 0x18, 0x95, 0x96, 0xd2, 0xb9, 0x9a, 0xeb, + 0x85, 0x75, 0x6c, 0xf5, 0x9c, 0x77, 0x59, 0xa3, + 0x03, 0xc6, 0x28, 0xe1, 0x06, 0x57, 0x34, 0xee, + 0xd3, 0x50, 0xe1, 0x59, 0xbb, 0xcf, 0xf3, 0x13, + 0x7c, 0xf9, 0x60, 0x99, 0xcd, 0x8d, 0x8e, 0x22, + 0x38, 0xc6, 0x86, 0xe1, 0x6d, 0x70, 0xd5, 0xbd, + 0x94, 0x11, 0x65, 0xaf, 0x6b, 0x8b, 0x5c, 0x08, + 0x73, 0x74, 0x10, 0x74, 0x1a, 0xf6, 0x96, 0xc8, + 0xad, 0xae, 0x25, 0x69, 0x7c, 0x51, 0x3e, 0x46, + 0x37, 0x43, 0x9c, 0xd6, 0x92, 0x05, 0x3b, 0x21, + 0x48, 0xed, 0x05, 0xc5, 0x95, 0xd4, 0xf0, 0xdc, + 0xda, 0xbd, 0xaf, 0x7b, 0xe3, 0xfd, 0x78, 0x68, + 0x23, 0xc7, 0x1a, 0xab, 0xa0, 0x29, 0xac, 0x9e, + 0x48, 0xec, 0x2c, 0xac, 0x2d, 0x5e, 0x3c, 0x6c, + 0xc0, 0xbd, 0xc6, 0xbb, 0x80, 0x8a, 0xb7, 0x84, + 0x51, 0x05, 0x40, 0x07, 0x38, 0x80, 0xd0, 0x49, + 0x71, 0xa0, 0x1a, 0xce, 0x9e, 0xc2, 0xf7, 0x2c, + 0x13, 0xc0, 0x40, 0x9a, 0x37, 0xc6, 0x4e, 0xa0, + 0xe1, 0x4a, 0xae, 0x93, 0x07, 0xb3, 0x67, 0x1c, + 0xc6, 0xae, 0x6e, 0x70, 0x00, 0xdd, 0xa5, 0x74, + 0x77, 0x95, 0x83, 0x6a, 0x61, 0x65, 0xdd, 0xb4, + 0x8e, 0x8c, 0x56, 0x6b, 0x17, 0x34, 0xb8, 0x7f, + 0x56, 0x44, 0x15, 0x66, 0xc1, 0x33, 0xa3, 0x74, + 0xad, 0x63, 0x9d, 0x1b, 0x0d, 0x1e, 0xf0, 0x0d, + 0x05, 0x57, 0x85, 0x37, 0x96, 0x53, 0xe1, 0xbc, + 0xca, 0x9a, 0xb1, 0x36, 0x9f, 0x45, 0x42, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0xea, 0xca, 0xbf, 0x99, 0xda, 0x7d, + 0xb3, 0x3e, 0xb0, 0x5c, 0xab, 0xab, 0x2a, 0xfe, + 0x67, 0x69, 0xf6, 0xcc, 0xfa, 0xc1, 0x05, 0x9b, + 0x36, 0xf7, 0xd7, 0x79, 0xa3, 0xc0, 0xb8, 0xd7, + 0x66, 0x6d, 0xef, 0xae, 0xf3, 0x42, 0xe3, 0x40, + 0x44, 0x58, 0x3a, 0x8a, 0x0f, 0x5b, 0x58, 0x3f, + 0xcb, 0xec, 0x4e, 0xf1, 0x77, 0xd5, 0x0a, 0xae, + 0xae, 0x19, 0xcd, 0xb3, 0xb3, 0x0c, 0x89, 0x92, + 0x44, 0x31, 0x49, 0x6d, 0xe3, 0x61, 0x1b, 0xa0, + 0x68, 0x70, 0xe0, 0x54, 0xff, 0x00, 0xcb, 0x4a, + 0x02, 0x22, 0x20, 0x2e, 0xbc, 0xbb, 0x2d, 0x9f, + 0x30, 0x7c, 0x8d, 0x81, 0xcd, 0x06, 0x36, 0xe3, + 0x21, 0xda, 0xc8, 0x1b, 0xcb, 0x91, 0x74, 0x58, + 0x5f, 0x4f, 0x61, 0x72, 0xdb, 0x88, 0x0f, 0x8c, + 0x34, 0x10, 0x75, 0x11, 0xbc, 0x50, 0x74, 0x64, + 0xb7, 0x37, 0x31, 0x66, 0x76, 0xcd, 0x89, 0xce, + 0xf1, 0xa4, 0x0d, 0x92, 0x3a, 0x9a, 0x10, 0x4e, + 0x17, 0x0a, 0x76, 0x97, 0x55, 0xfe, 0x5f, 0xcf, + 0xed, 0x33, 0xed, 0xad, 0x7c, 0x5c, 0x4f, 0x6b, + 0xdc, 0x47, 0xe6, 0xe8, 0xc4, 0xe2, 0x83, 0x3f, + 0xb4, 0x8a, 0x53, 0x73, 0x06, 0x5f, 0x1c, 0x77, + 0x66, 0xa7, 0x9c, 0xa9, 0x20, 0x13, 0xba, 0x1b, + 0xa9, 0x72, 0xd9, 0xe7, 0x13, 0xdb, 0x3a, 0xe6, + 0x6c, 0x02, 0x5b, 0x9b, 0xa0, 0x41, 0x98, 0x9a, + 0x16, 0xd7, 0x78, 0x53, 0x4a, 0x09, 0x9d, 0xa1, + 0x73, 0x33, 0x2b, 0x07, 0x4d, 0x6c, 0xf2, 0xf1, + 0x97, 0xca, 0x59, 0x2b, 0x37, 0xe9, 0xa3, 0x17, + 0xe5, 0xd9, 0x55, 0x53, 0x51, 0xf2, 0x00, 0xbb, + 0xb2, 0xcc, 0xd2, 0x5c, 0xbd, 0xd2, 0x0c, 0x02, + 0x78, 0xe7, 0x6e, 0x09, 0x63, 0x71, 0x2d, 0x04, + 0xef, 0xd6, 0x8b, 0x91, 0xae, 0x68, 0x91, 0xae, + 0x0d, 0xf1, 0x43, 0xaa, 0x18, 0x77, 0x68, 0x71, + 0x52, 0xbd, 0xa4, 0x16, 0x6b, 0x83, 0x96, 0xd8, + 0x64, 0xf6, 0x56, 0x37, 0xf1, 0xc8, 0xfe, 0x74, + 0x73, 0xb8, 0x62, 0xd0, 0x71, 0x1d, 0x3a, 0x78, + 0x52, 0xd8, 0xe5, 0xb7, 0xd9, 0x3d, 0xed, 0x8d, + 0x83, 0x24, 0x66, 0x16, 0xf3, 0xa1, 0xb2, 0x1a, + 0x9c, 0x43, 0x7b, 0x92, 0xa0, 0xf3, 0x4c, 0xcd, + 0xf9, 0x9d, 0xc3, 0x67, 0x7c, 0x62, 0x20, 0xd6, + 0x06, 0x36, 0x30, 0x6a, 0x00, 0xed, 0xac, 0xe5, + 0x79, 0x9c, 0x99, 0x6c, 0xe6, 0x66, 0x30, 0x4a, + 0x1c, 0xd2, 0xc7, 0x31, 0xc7, 0x08, 0x23, 0xb6, + 0x83, 0xba, 0xf0, 0xff, 0x00, 0xf5, 0x4b, 0x12, + 0x3d, 0x79, 0xef, 0x09, 0x02, 0x5a, 0x0f, 0xfe, + 0xa7, 0x7d, 0xf6, 0xe2, 0x9c, 0x11, 0xae, 0x19, + 0xf3, 0x47, 0x4d, 0x97, 0x45, 0x61, 0xcd, 0x35, + 0x91, 0xc5, 0x21, 0x91, 0xae, 0x0e, 0x24, 0x9a, + 0xe2, 0xd1, 0x4a, 0x7f, 0x59, 0x62, 0x3c, 0xc9, + 0xf1, 0x65, 0x93, 0x65, 0xbc, 0xd8, 0x73, 0x26, + 0x93, 0x1b, 0xa4, 0xad, 0x08, 0xa6, 0x1f, 0xcd, + 0xfe, 0xca, 0x09, 0x39, 0xc5, 0xa6, 0x49, 0x67, + 0x6a, 0xe8, 0xed, 0x99, 0x3d, 0xdd, 0xc3, 0x31, + 0xba, 0x59, 0x45, 0x43, 0x45, 0x06, 0xa6, 0xf7, + 0x53, 0x3c, 0x9a, 0x6b, 0x8d, 0x9d, 0xb2, 0x9a, + 0x7a, 0x73, 0x8e, 0x79, 0x26, 0x82, 0x83, 0xc9, + 0x75, 0x34, 0x0d, 0x4b, 0x9d, 0x99, 0xe4, 0x32, + 0x5a, 0x45, 0x6f, 0x7f, 0x66, 0xcb, 0xb3, 0x00, + 0xa4, 0x6f, 0x2e, 0x2d, 0xd1, 0x5d, 0xde, 0xf6, + 0x85, 0xe2, 0xf3, 0x3d, 0x7d, 0xe6, 0x5e, 0x6d, + 0x2e, 0x2d, 0xd8, 0x4b, 0x49, 0x31, 0x3d, 0xb5, + 0x6e, 0x0f, 0xcd, 0x00, 0x36, 0x9d, 0x94, 0x13, + 0x17, 0xaf, 0x6b, 0x33, 0xfc, 0xa8, 0xbb, 0x40, + 0x31, 0x34, 0x57, 0xb3, 0xe3, 0x53, 0xc2, 0xa0, + 0x73, 0x98, 0xdf, 0xd7, 0x37, 0x4c, 0xa7, 0x8c, + 0xe9, 0x8e, 0x1d, 0xf3, 0x8a, 0x94, 0xa2, 0x66, + 0x39, 0xb4, 0xd7, 0xb3, 0x43, 0x28, 0x60, 0x85, + 0xf6, 0xcd, 0x0c, 0x6b, 0x9a, 0xea, 0x93, 0x4f, + 0xce, 0x5d, 0x9f, 0x10, 0xdb, 0xc8, 0xf6, 0x5c, + 0x5c, 0x58, 0x32, 0x5b, 0xc8, 0xc0, 0xa4, 0xc4, + 0x90, 0x09, 0x1a, 0x89, 0x6a, 0x09, 0xce, 0x71, + 0x83, 0x69, 0x2d, 0xa3, 0x3e, 0x50, 0xb5, 0xc3, + 0xda, 0x24, 0xb8, 0xd3, 0x80, 0x2a, 0xbd, 0xa4, + 0x12, 0x1c, 0xea, 0x38, 0x28, 0x79, 0xc1, 0x38, + 0xa8, 0xde, 0xf1, 0x89, 0xf0, 0x2f, 0x70, 0x5c, + 0x66, 0x39, 0x86, 0x6e, 0xc9, 0xe2, 0x7b, 0x5b, + 0x76, 0xf7, 0x62, 0x8d, 0xc4, 0xe1, 0x6e, 0x81, + 0xe4, 0xf6, 0xa8, 0xa5, 0xe1, 0xcc, 0x33, 0x19, + 0xb3, 0x38, 0xe0, 0xea, 0xf6, 0x41, 0x73, 0x8c, + 0x0b, 0x8b, 0x86, 0xb0, 0x97, 0x60, 0x1e, 0x51, + 0xc4, 0x5a, 0x34, 0x1d, 0xfa, 0xa0, 0x8a, 0xda, + 0x4f, 0xe7, 0x57, 0x5d, 0xb6, 0xfd, 0x56, 0xad, + 0xdb, 0x27, 0x28, 0x66, 0x6e, 0xd6, 0x93, 0x4e, + 0x71, 0x8e, 0x68, 0xed, 0xeb, 0xf9, 0x17, 0x2e, + 0x7d, 0x2b, 0x25, 0xcd, 0xae, 0x5e, 0xc3, 0x56, + 0xe3, 0xc2, 0x0f, 0x68, 0x2e, 0x28, 0xa5, 0x92, + 0x19, 0x1b, 0x34, 0x4e, 0xc1, 0x24, 0x67, 0x13, + 0x5d, 0xbc, 0x47, 0x69, 0x07, 0xbb, 0xc8, 0x9f, + 0x0d, 0xd4, 0xd1, 0xb8, 0x51, 0xcd, 0x7b, 0x85, + 0x3b, 0xa7, 0x0f, 0x0a, 0xb0, 0xe5, 0xf9, 0x7c, + 0x19, 0x6e, 0x69, 0x96, 0xbb, 0x13, 0x8c, 0xd7, + 0x31, 0xbd, 0xd2, 0x35, 0xd4, 0xf1, 0x49, 0x6e, + 0x81, 0xdf, 0x5c, 0x87, 0x68, 0x2d, 0xa6, 0x70, + 0x9e, 0xe7, 0x2e, 0x8e, 0x5b, 0xa6, 0x81, 0xfa, + 0xda, 0xd0, 0x12, 0x37, 0x48, 0x51, 0xf7, 0x39, + 0x9d, 0xd5, 0xcd, 0xe8, 0xbd, 0x7b, 0xb0, 0xcc, + 0xc2, 0x0c, 0x65, 0xa3, 0x43, 0x70, 0xe9, 0x01, + 0x06, 0x6e, 0xe2, 0x78, 0xcd, 0xe4, 0x8b, 0x4e, + 0x3f, 0x68, 0xc3, 0xd9, 0xae, 0x3d, 0x7c, 0x0a, + 0xca, 0xe7, 0x34, 0xed, 0x84, 0x2d, 0x1f, 0x99, + 0x6e, 0x5a, 0x7b, 0x74, 0x2e, 0xf9, 0x54, 0x49, + 0xda, 0x2b, 0x67, 0x48, 0x2e, 0xe4, 0xb0, 0x8d, + 0xd7, 0xc0, 0x68, 0x97, 0x16, 0x8a, 0xd3, 0xca, + 0xc2, 0xb8, 0xad, 0x73, 0x7b, 0x88, 0x33, 0x4e, + 0xb2, 0x94, 0x09, 0xa5, 0x38, 0xaa, 0x09, 0xa0, + 0xf1, 0xbb, 0x41, 0x06, 0xfc, 0xaf, 0xfd, 0x47, + 0x10, 0xdc, 0xe7, 0xdf, 0xa3, 0x94, 0x52, 0x5f, + 0xf5, 0x33, 0xbf, 0xf2, 0xcf, 0xd7, 0x5c, 0x76, + 0xd7, 0xcf, 0xb7, 0xcc, 0x1b, 0x7a, 0xd6, 0x07, + 0x39, 0xaf, 0x2f, 0x11, 0x93, 0x41, 0x57, 0x6e, + 0x55, 0x1f, 0x7c, 0x5d, 0x98, 0x9b, 0xfc, 0x02, + 0xa6, 0x53, 0x37, 0x37, 0x5d, 0x1a, 0x48, 0x34, + 0xc4, 0x3b, 0x48, 0x2c, 0x56, 0xff, 0x00, 0xeb, + 0x39, 0x7c, 0xc7, 0x7d, 0x46, 0xa8, 0x2b, 0x38, + 0x65, 0xeb, 0x98, 0x62, 0x20, 0xf3, 0x8d, 0x9c, + 0x54, 0x1d, 0x7e, 0x29, 0xa9, 0xf0, 0x29, 0x2c, + 0x92, 0xf5, 0xd7, 0xdb, 0x4a, 0x6e, 0x9c, 0xc1, + 0x1b, 0xa5, 0x8d, 0xc4, 0xb0, 0x12, 0x40, 0x01, + 0xad, 0x1b, 0xdd, 0x85, 0xac, 0xed, 0x04, 0x71, + 0xca, 0xe9, 0xbd, 0x8e, 0x37, 0x5f, 0x0a, 0xb4, + 0x5c, 0xea, 0xd3, 0x5f, 0x2b, 0x0e, 0xfa, 0x0e, + 0xd9, 0xac, 0xed, 0x2f, 0x73, 0xbc, 0xc2, 0xe6, + 0xe1, 0xbc, 0xec, 0x36, 0x6c, 0x0f, 0x31, 0x03, + 0x4c, 0x4e, 0x6b, 0x75, 0x1e, 0xd5, 0x13, 0x67, + 0xb3, 0x49, 0x2e, 0xf3, 0x03, 0x6f, 0x14, 0x31, + 0x5b, 0x5b, 0x35, 0x84, 0x98, 0xe3, 0x1a, 0x4e, + 0xe0, 0xc4, 0xe5, 0x0b, 0x97, 0xe6, 0xf3, 0xd9, + 0x5c, 0xcb, 0x3b, 0x80, 0x9c, 0x5c, 0x57, 0x9f, + 0x63, 0xb4, 0x07, 0x55, 0x75, 0x43, 0xb4, 0x31, + 0xda, 0x4a, 0x1d, 0x63, 0x64, 0xc8, 0x23, 0x35, + 0xe7, 0x1b, 0x52, 0x5c, 0xfa, 0xee, 0x62, 0xfc, + 0xd4, 0x1b, 0x32, 0x9f, 0xe5, 0x19, 0xcf, 0x73, + 0xc2, 0xe5, 0xc9, 0xb3, 0xf9, 0x7c, 0x37, 0xf7, + 0x8e, 0x6c, 0xf5, 0x31, 0x44, 0xc2, 0xf7, 0xb0, + 0x7e, 0x75, 0x37, 0x16, 0x1b, 0x9b, 0xb5, 0x91, + 0x5e, 0xc1, 0x0d, 0xbb, 0x59, 0x1d, 0xf5, 0x3c, + 0x50, 0xe3, 0xe2, 0x53, 0x78, 0xd3, 0x4a, 0xd3, + 0x96, 0x66, 0x32, 0xe5, 0xd7, 0x42, 0xe2, 0x20, + 0x1d, 0x40, 0x5a, 0xe6, 0x1d, 0x4e, 0x69, 0xec, + 0xf6, 0x10, 0x4d, 0x64, 0xd9, 0xbb, 0xa7, 0xcd, + 0x23, 0xb6, 0xb5, 0xb7, 0x8e, 0xd6, 0xdb, 0xc6, + 0xc4, 0x1a, 0xdf, 0x19, 0xc0, 0x6a, 0xc4, 0xf5, + 0xa7, 0x25, 0xd1, 0xb5, 0x52, 0x8d, 0xcc, 0x53, + 0xe8, 0xee, 0xad, 0x2c, 0xcf, 0xe1, 0xb7, 0x98, + 0x4d, 0x61, 0x65, 0x1d, 0xbb, 0x9c, 0x43, 0xa5, + 0x24, 0x97, 0x17, 0x02, 0x35, 0x0f, 0x9a, 0xb9, + 0x9b, 0x9b, 0xf3, 0x59, 0xa8, 0xcc, 0xad, 0xe1, + 0x6c, 0x55, 0xd7, 0x11, 0x24, 0x83, 0x8b, 0xca, + 0x25, 0xdb, 0xe5, 0x04, 0x8e, 0xce, 0xe9, 0xcc, + 0x73, 0x08, 0xeb, 0xe3, 0xc9, 0x13, 0xc3, 0x06, + 0xed, 0x71, 0x1a, 0x85, 0x1d, 0x91, 0x31, 0xc7, + 0x39, 0xb5, 0x02, 0xa5, 0xc2, 0x42, 0x4d, 0x77, + 0x28, 0x08, 0x5e, 0xe6, 0xce, 0xff, 0x00, 0xef, + 0x62, 0xbd, 0xb4, 0xb7, 0x65, 0xac, 0xac, 0xae, + 0x30, 0xd3, 0xa1, 0xf5, 0x3a, 0x71, 0x68, 0x1a, + 0xd6, 0xff, 0x00, 0x88, 0x6d, 0xa2, 0x2f, 0x9e, + 0xd2, 0xc2, 0x38, 0x6e, 0xe4, 0x14, 0x32, 0xe2, + 0xa8, 0x04, 0xee, 0xb4, 0x71, 0x20, 0x90, 0xb7, + 0x7b, 0x5f, 0x7b, 0x9f, 0x11, 0xa5, 0xb8, 0x1c, + 0x37, 0xc6, 0x80, 0x5a, 0xa0, 0x32, 0x98, 0x2f, + 0xa6, 0xbb, 0x67, 0xb0, 0x10, 0x27, 0x8c, 0x63, + 0x6d, 0x4d, 0x00, 0xa0, 0xa6, 0xea, 0xf7, 0x65, + 0x9a, 0x4b, 0x68, 0xcb, 0xa6, 0xe0, 0x12, 0xba, + 0xf1, 0xa5, 0x8e, 0x71, 0x24, 0x10, 0x4e, 0xb3, + 0x41, 0xdb, 0x5a, 0x2c, 0x6f, 0x66, 0xb1, 0xba, + 0x65, 0xc5, 0xb9, 0x18, 0xd9, 0xa8, 0x1a, 0xd0, + 0x83, 0xac, 0x14, 0x13, 0xb6, 0x59, 0xa4, 0x19, + 0xbd, 0xc3, 0x6c, 0x33, 0x2b, 0x56, 0x19, 0x65, + 0xab, 0x44, 0xcc, 0x18, 0x4e, 0x20, 0x35, 0x9d, + 0xd5, 0x01, 0x79, 0x00, 0xb6, 0xbb, 0x9a, 0x06, + 0x9c, 0x42, 0x27, 0xb9, 0x80, 0xef, 0xe1, 0x34, + 0x52, 0x83, 0x3f, 0xb5, 0x89, 0xce, 0xb8, 0xb5, + 0xb0, 0x64, 0x57, 0x4e, 0x04, 0x19, 0x71, 0x1a, + 0x02, 0x77, 0x43, 0x4e, 0x85, 0x10, 0xf7, 0xbe, + 0x47, 0xba, 0x47, 0x9c, 0x4f, 0x79, 0x2e, 0x73, + 0xb7, 0xc9, 0xd2, 0x4a, 0x0f, 0x28, 0x88, 0x80, + 0xb7, 0x59, 0xe9, 0xbc, 0xb7, 0x1f, 0xe2, 0xb3, + 0xc2, 0xb4, 0xa9, 0x1d, 0x9f, 0xb1, 0x92, 0xf3, + 0x32, 0x84, 0x86, 0xfe, 0xaa, 0x17, 0x09, 0x24, + 0x76, 0xe7, 0x8b, 0xab, 0x84, 0xa0, 0xb2, 0xe7, + 0x3e, 0xf4, 0xdf, 0x30, 0x78, 0x4a, 0xe0, 0x5d, + 0x59, 0x9c, 0xa2, 0x5b, 0xb7, 0x53, 0x53, 0x06, + 0x1e, 0xe8, 0xd7, 0xdf, 0x5c, 0xa8, 0x33, 0x1f, + 0xed, 0x1b, 0xdb, 0x52, 0xc6, 0x9b, 0xe1, 0x45, + 0x47, 0xfb, 0x46, 0x76, 0xd4, 0x9a, 0x0c, 0xe8, + 0xdf, 0x0b, 0x83, 0x30, 0xf7, 0xab, 0x4d, 0x3f, + 0xf1, 0x3e, 0x50, 0xbb, 0x97, 0x0e, 0x61, 0xef, + 0x56, 0xbf, 0x69, 0xf2, 0x84, 0x0c, 0xbf, 0xde, + 0x6e, 0xfc, 0xf3, 0xf5, 0x8a, 0xee, 0x5c, 0x39, + 0x7f, 0xbc, 0xdd, 0xf9, 0xe7, 0xeb, 0x15, 0xdc, + 0x80, 0x75, 0x15, 0x14, 0x75, 0x95, 0x2a, 0x75, + 0x15, 0x14, 0x75, 0x94, 0x05, 0xdd, 0x60, 0xe8, + 0xa7, 0x82, 0x5b, 0x09, 0xfc, 0x89, 0x81, 0x0d, + 0xee, 0xeb, 0xe0, 0xd6, 0xb8, 0x50, 0x38, 0xb4, + 0x87, 0x34, 0x90, 0x5b, 0xa4, 0x10, 0x88, 0x95, + 0x6f, 0x32, 0xb0, 0x9f, 0x2e, 0xba, 0x7d, 0xb4, + 0xa0, 0xe8, 0xd3, 0x1b, 0xb7, 0x1e, 0xdf, 0x9d, + 0xdb, 0x5c, 0xb5, 0xde, 0xd4, 0xbe, 0x81, 0x74, + 0xcc, 0xbe, 0xf7, 0x2c, 0x6c, 0xb9, 0xab, 0x5a, + 0x18, 0xd3, 0xfb, 0x4d, 0x35, 0x07, 0x56, 0x82, + 0x34, 0x85, 0x11, 0xd5, 0xfb, 0x19, 0xd2, 0x1c, + 0x7f, 0xb4, 0xff, 0x00, 0x41, 0x68, 0xae, 0x7a, + 0xe9, 0xc5, 0x8a, 0xfe, 0x4e, 0xfb, 0xa7, 0x6c, + 0xf0, 0x99, 0xd7, 0x8a, 0xad, 0x54, 0xaa, 0xb4, + 0xf5, 0x7e, 0xc5, 0xfa, 0xf7, 0x72, 0x9f, 0xe8, + 0x27, 0x57, 0xec, 0x5f, 0xaf, 0x77, 0x29, 0xfe, + 0x82, 0x9e, 0xfd, 0x3d, 0xea, 0xfa, 0x2c, 0x9c, + 0xe1, 0x56, 0xaa, 0x55, 0x5a, 0x7a, 0xbf, 0x62, + 0xfd, 0x7b, 0xb9, 0x4f, 0xf4, 0x13, 0xab, 0xf6, + 0x2f, 0xd7, 0xbb, 0x94, 0xff, 0x00, 0x41, 0x3b, + 0xf4, 0xf7, 0x9e, 0x8b, 0x27, 0x38, 0x55, 0xaa, + 0x95, 0x56, 0x9e, 0xaf, 0xd8, 0xbf, 0x5e, 0xee, + 0x53, 0xfd, 0x04, 0xea, 0xfd, 0x8b, 0xf5, 0xee, + 0xe5, 0x3f, 0xd0, 0x4e, 0xf5, 0x3d, 0xe7, 0xa3, + 0xc9, 0xce, 0x15, 0x6a, 0xa5, 0x55, 0xa7, 0xab, + 0xf6, 0x2f, 0xd7, 0xbb, 0x94, 0xff, 0x00, 0x41, + 0x3a, 0xbf, 0x62, 0xfd, 0x7b, 0xb9, 0x4f, 0xf4, + 0x13, 0xbf, 0x5f, 0x7a, 0x7d, 0x26, 0x5e, 0x70, + 0xab, 0x55, 0x2a, 0xad, 0x3d, 0x5f, 0xb1, 0x9e, + 0xbd, 0xdc, 0xa7, 0xfa, 0x09, 0xd5, 0xfb, 0x17, + 0xeb, 0xdd, 0xca, 0x7f, 0xa0, 0x9d, 0xea, 0x7b, + 0xd1, 0xe8, 0xef, 0xee, 0x55, 0xaa, 0x95, 0x56, + 0x9e, 0xaf, 0xd8, 0xbf, 0x5e, 0xee, 0x53, 0xfd, + 0x04, 0xea, 0xfd, 0x8b, 0xf5, 0xee, 0xe5, 0x3f, + 0xd0, 0x4e, 0xf5, 0x3d, 0xe7, 0xa2, 0xc9, 0xee, + 0x55, 0xaa, 0x95, 0x56, 0x9e, 0xaf, 0xd8, 0xbf, + 0x5e, 0xee, 0x53, 0xfd, 0x04, 0xf6, 0x0d, 0x8b, + 0xf5, 0xee, 0xe5, 0x3f, 0xd0, 0x4e, 0xf5, 0x7d, + 0xe4, 0x79, 0x3c, 0x91, 0xe1, 0xa2, 0xad, 0x54, + 0xaa, 0xb4, 0xfb, 0x06, 0xc5, 0xf4, 0x87, 0x72, + 0x9f, 0xe8, 0x27, 0x57, 0xec, 0x5f, 0xaf, 0x77, + 0x29, 0xfe, 0x82, 0x77, 0xeb, 0xef, 0x4f, 0xa4, + 0xcb, 0xce, 0x15, 0x6a, 0xa5, 0x55, 0xa7, 0xab, + 0xf6, 0x2f, 0xd7, 0xbb, 0x94, 0xff, 0x00, 0x41, + 0x3a, 0xbf, 0x62, 0xfd, 0x7b, 0xb9, 0x4f, 0xf4, + 0x13, 0xbd, 0x4f, 0x7a, 0x3d, 0x1e, 0x4e, 0x70, + 0xab, 0x62, 0x4c, 0x4a, 0xd3, 0xd5, 0xfb, 0x17, + 0xeb, 0xdd, 0xca, 0x7f, 0xa0, 0x9d, 0x5f, 0xb1, + 0x7e, 0xbd, 0xdc, 0xa7, 0xfa, 0x09, 0xde, 0xa7, + 0xbd, 0x3e, 0x8e, 0xfe, 0xe5, 0x5a, 0xa9, 0x55, + 0x69, 0xea, 0xfd, 0x8b, 0xf5, 0xee, 0xe5, 0x3f, + 0xd0, 0x4e, 0xaf, 0xd8, 0xbf, 0x5e, 0xee, 0x53, + 0xfd, 0x04, 0xef, 0x53, 0xde, 0x8f, 0x45, 0x93, + 0xdc, 0xab, 0x55, 0x2a, 0xad, 0x3d, 0x5f, 0xb1, + 0x7e, 0xbd, 0xdc, 0xa7, 0xfa, 0x09, 0xd5, 0xfb, + 0x17, 0xeb, 0xdd, 0xca, 0x7f, 0xa0, 0x9d, 0xea, + 0x7b, 0xcf, 0x47, 0x93, 0xdc, 0xab, 0x55, 0x2a, + 0xad, 0x3d, 0x5f, 0xb1, 0x7e, 0xbd, 0xdc, 0xa7, + 0xfa, 0x09, 0xd5, 0xfb, 0x19, 0xeb, 0xdd, 0xca, + 0x7f, 0xa0, 0x9d, 0xea, 0x7b, 0xcf, 0x45, 0x7f, + 0x72, 0xad, 0x54, 0xaa, 0xb4, 0xf5, 0x7e, 0xc5, + 0xfa, 0xf7, 0x72, 0x9f, 0xe8, 0x27, 0x57, 0xec, + 0x5f, 0xaf, 0x77, 0x29, 0xfe, 0x82, 0x77, 0xa9, + 0xaf, 0xb4, 0xf4, 0x59, 0x3d, 0xca, 0xb6, 0x24, + 0xaa, 0xb4, 0xf5, 0x7e, 0xc5, 0xfa, 0xf7, 0x72, + 0x9f, 0xe8, 0x27, 0x57, 0xec, 0x5f, 0xaf, 0x77, + 0x29, 0xfe, 0x82, 0x77, 0xeb, 0xef, 0x3d, 0x1e, + 0x4f, 0x72, 0xad, 0x89, 0x31, 0x2b, 0x4f, 0x57, + 0xec, 0x5f, 0xaf, 0x77, 0x29, 0xfe, 0x82, 0x75, + 0x7e, 0xc5, 0xfa, 0xf7, 0x72, 0x9f, 0xe8, 0x27, + 0x7a, 0x9e, 0xf3, 0xd1, 0x5f, 0xdc, 0xab, 0x55, + 0x2a, 0xad, 0x3d, 0x5f, 0xb1, 0x7e, 0xbd, 0xdc, + 0xa7, 0xfa, 0x09, 0xd5, 0xfb, 0x17, 0xeb, 0xdd, + 0xca, 0x7f, 0xa0, 0x9d, 0xfa, 0xfb, 0xcf, 0x47, + 0x7f, 0x72, 0xad, 0x54, 0xc4, 0xad, 0x3d, 0x5f, + 0xb1, 0x7e, 0xbd, 0xdc, 0xa7, 0xfa, 0x09, 0xd5, + 0xfb, 0x17, 0xeb, 0xdd, 0xca, 0x7f, 0xa0, 0x9d, + 0xea, 0x7b, 0xcf, 0x47, 0x93, 0xdc, 0xab, 0x55, + 0x2a, 0xad, 0x3d, 0x5f, 0xb1, 0x7e, 0xbd, 0xdc, + 0xa7, 0xfa, 0x09, 0xd5, 0xfb, 0x17, 0xeb, 0xdd, + 0xca, 0x7f, 0xa0, 0x9d, 0xea, 0x7b, 0xcf, 0x47, + 0x93, 0x9c, 0x2a, 0xd5, 0x4a, 0xab, 0x4f, 0x57, + 0xec, 0x5f, 0xaf, 0x77, 0x29, 0xfe, 0x82, 0x75, + 0x7e, 0xc5, 0xfa, 0xf7, 0x72, 0x9f, 0xe8, 0x27, + 0x7e, 0x9e, 0xf3, 0xd1, 0xe4, 0xe7, 0x0a, 0xb5, + 0x52, 0xaa, 0xd3, 0xd5, 0xfb, 0x17, 0xeb, 0xdd, + 0xca, 0x7f, 0xa0, 0x9d, 0x5f, 0xb1, 0x7e, 0xbd, + 0xdc, 0xa7, 0xfa, 0x09, 0xdf, 0xa7, 0xbc, 0xf4, + 0x59, 0x39, 0xc2, 0xad, 0x54, 0xaa, 0xb4, 0xf5, + 0x7e, 0xc5, 0xfa, 0xf7, 0x72, 0x9f, 0xe8, 0x27, + 0x57, 0xec, 0x67, 0xaf, 0x34, 0xdd, 0xf1, 0x9f, + 0xe8, 0xa7, 0x7e, 0x87, 0xa3, 0xc9, 0xee, 0x45, + 0x64, 0x39, 0x54, 0x99, 0x95, 0xeb, 0x43, 0x9a, + 0x7d, 0x9a, 0x23, 0x8a, 0x67, 0x6e, 0x1a, 0x50, + 0x86, 0xab, 0x36, 0x67, 0x70, 0x25, 0x9b, 0x03, + 0x7c, 0x88, 0x86, 0x1d, 0x1b, 0xeb, 0x74, 0xfc, + 0xc5, 0x96, 0x5f, 0x14, 0x56, 0x0d, 0x6c, 0x70, + 0xca, 0x3c, 0x52, 0x37, 0x45, 0x35, 0xef, 0xa8, + 0xd5, 0xc6, 0xf7, 0xdd, 0x3a, 0xb5, 0xe0, 0xc5, + 0x18, 0xeb, 0x31, 0xed, 0x99, 0xd4, 0xd3, 0xba, + 0x88, 0x8a, 0x8e, 0xa2, 0x22, 0x20, 0xc6, 0xd8, + 0x6a, 0xb2, 0xf3, 0x5f, 0xfd, 0xc5, 0x5c, 0x56, + 0x3d, 0xb0, 0xd5, 0x65, 0xe6, 0xbf, 0xfb, 0x8a, + 0xb8, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x8b, 0x65, 0xb4, 0x26, + 0x7b, 0x88, 0xe1, 0x1f, 0xf1, 0x1c, 0x1a, 0x4e, + 0xed, 0x0a, 0x0e, 0xdc, 0xab, 0x28, 0x37, 0x60, + 0xdd, 0x5c, 0x38, 0x43, 0x65, 0x16, 0x97, 0xc8, + 0x7f, 0x3a, 0x9a, 0xc0, 0x58, 0xce, 0x73, 0x36, + 0xdf, 0x4e, 0xce, 0x64, 0x60, 0xb6, 0xb7, 0x6e, + 0x08, 0x46, 0xed, 0x37, 0xfb, 0xca, 0x6f, 0x37, + 0xc9, 0xb3, 0x4b, 0xae, 0x6e, 0xda, 0xd3, 0x9b, + 0x65, 0x8c, 0x2d, 0x0d, 0x64, 0x65, 0xc4, 0x12, + 0x77, 0x4b, 0xb4, 0x28, 0x89, 0x76, 0x7a, 0xfe, + 0x09, 0xed, 0xe1, 0x93, 0x0d, 0x67, 0x7e, 0x16, + 0xe1, 0x35, 0xa5, 0x3c, 0xa2, 0x74, 0x0d, 0xc4, + 0x13, 0x76, 0xf2, 0xc3, 0x35, 0x94, 0x79, 0xf4, + 0xb1, 0x97, 0x5d, 0x5b, 0x44, 0xe6, 0x11, 0x4f, + 0x29, 0xc3, 0x46, 0x2e, 0xfa, 0xa9, 0x4d, 0x2b, + 0xe6, 0x95, 0xf2, 0xc8, 0x71, 0x3d, 0xee, 0xab, + 0x9d, 0xd9, 0x2a, 0xca, 0xfc, 0xd6, 0x1b, 0x4c, + 0xd6, 0x2c, 0xb9, 0x94, 0xf6, 0x08, 0x59, 0xec, + 0xf2, 0x0d, 0xc7, 0x17, 0x6b, 0x71, 0xed, 0x71, + 0xa8, 0x3c, 0xda, 0xc4, 0xd8, 0x5f, 0x49, 0x6e, + 0x7c, 0x81, 0xe3, 0x46, 0x77, 0xd8, 0xef, 0x27, + 0xba, 0x10, 0x49, 0x6c, 0x7f, 0xf3, 0x09, 0xbe, + 0xcb, 0xe5, 0x50, 0x47, 0x59, 0xdf, 0x52, 0x19, + 0x15, 0xf3, 0x2c, 0xb3, 0x26, 0x49, 0x21, 0xc3, + 0x14, 0x80, 0xc6, 0xf3, 0xbc, 0x0e, 0xa3, 0xc2, + 0xba, 0xee, 0x76, 0x6a, 0xfa, 0x4b, 0xc7, 0x9b, + 0x7c, 0x0e, 0xb5, 0x91, 0xc5, 0xed, 0x9b, 0x16, + 0x86, 0xb4, 0x9c, 0x54, 0xa7, 0x63, 0x52, 0x08, + 0xa8, 0x6d, 0x66, 0x92, 0x68, 0xa3, 0xc0, 0xe6, + 0xf3, 0xce, 0x01, 0x84, 0x8a, 0x03, 0x5d, 0xd1, + 0x55, 0x3f, 0x9c, 0xdb, 0xe6, 0x07, 0x34, 0xb7, + 0x7d, 0xac, 0x0f, 0x74, 0x36, 0x41, 0x8d, 0x63, + 0x86, 0xad, 0x06, 0xa7, 0xc0, 0xba, 0x58, 0xe8, + 0x2e, 0x73, 0xb8, 0x22, 0x89, 0xc1, 0xf6, 0xf9, + 0x5c, 0x24, 0xb9, 0xda, 0xc6, 0x2a, 0x61, 0xef, + 0x2a, 0xfc, 0xf9, 0xd6, 0x64, 0xf9, 0xe5, 0x73, + 0x2e, 0x64, 0x63, 0x5c, 0xf2, 0x5a, 0xd0, 0xed, + 0x0d, 0xd3, 0xaa, 0x83, 0x79, 0x04, 0x8e, 0x7f, + 0x6f, 0xcd, 0xe7, 0xb6, 0xd3, 0x01, 0x84, 0x4e, + 0x63, 0x34, 0xfe, 0xb3, 0x5d, 0xa5, 0x75, 0xdc, + 0x5c, 0x31, 0x9b, 0x4d, 0x2d, 0xb4, 0xa7, 0xf5, + 0x37, 0x90, 0xb6, 0x27, 0x57, 0x55, 0x5c, 0x0d, + 0x16, 0x99, 0x5c, 0xeb, 0xfc, 0xa7, 0x2e, 0xbc, + 0x24, 0xbe, 0x68, 0x27, 0x6c, 0x72, 0xb8, 0xeb, + 0xa9, 0x3a, 0x49, 0x5c, 0x5b, 0x4e, 0xf7, 0x33, + 0x3b, 0x73, 0xda, 0x68, 0xf6, 0xb1, 0x85, 0xa4, + 0x6e, 0x10, 0x83, 0xa6, 0xda, 0x07, 0xdb, 0x64, + 0x99, 0xb5, 0xbb, 0xc7, 0x8f, 0x14, 0x81, 0xa7, + 0xb2, 0x2a, 0x3e, 0x45, 0x5f, 0x57, 0x1b, 0xc7, + 0xc5, 0x3e, 0x41, 0x75, 0x7b, 0x1e, 0x87, 0x5d, + 0x46, 0xd7, 0x3c, 0x6f, 0x39, 0xb4, 0x69, 0xf0, + 0x2a, 0x72, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x2e, 0xac, 0xab, 0xf9, + 0x9d, 0xa7, 0xdb, 0x33, 0xeb, 0x05, 0xca, 0xba, + 0xb2, 0xaf, 0xe6, 0x76, 0x9f, 0x6c, 0xcf, 0xac, + 0x10, 0x59, 0xb3, 0x6f, 0x7d, 0x77, 0x9a, 0x17, + 0x1a, 0xec, 0xcd, 0xbd, 0xf5, 0xde, 0x68, 0x5c, + 0x68, 0x08, 0x88, 0x83, 0xa2, 0xca, 0xf1, 0xd6, + 0xb2, 0x6a, 0xac, 0x6e, 0xf2, 0xc7, 0x63, 0x7e, + 0x8b, 0xc5, 0xde, 0xce, 0xe5, 0xd9, 0x8b, 0xcc, + 0xf6, 0x52, 0xf3, 0x12, 0x38, 0xd5, 0xd1, 0xd2, + 0xad, 0x24, 0xf6, 0x37, 0x3b, 0x8b, 0x52, 0x02, + 0x41, 0xd1, 0xa3, 0xbc, 0x83, 0x4f, 0xc1, 0x77, + 0xbb, 0x97, 0x11, 0x70, 0x39, 0x3e, 0x0c, 0xbe, + 0xf5, 0xf1, 0x70, 0x1e, 0x25, 0xbf, 0x1b, 0xf7, + 0xcf, 0x09, 0x4e, 0x71, 0xfb, 0xe7, 0x84, 0xa0, + 0xd1, 0xf0, 0x65, 0xf7, 0xaf, 0x8b, 0x80, 0xf1, + 0x27, 0xc1, 0x97, 0xde, 0xbe, 0x2e, 0x03, 0xc4, + 0xb7, 0xf3, 0x8f, 0xdf, 0x3c, 0x25, 0x39, 0xc7, + 0xef, 0x9e, 0x12, 0x83, 0x47, 0xc1, 0x97, 0xde, + 0xbe, 0x2e, 0x03, 0xc4, 0x9f, 0x06, 0x5f, 0x7a, + 0xf8, 0xb8, 0x0f, 0x12, 0xdf, 0xce, 0x3f, 0x7c, + 0xf0, 0x94, 0xe7, 0x1f, 0xbe, 0x78, 0x4a, 0x0d, + 0x1f, 0x06, 0x5f, 0x7a, 0xf8, 0xb8, 0x0f, 0x12, + 0x7c, 0x19, 0x7d, 0xeb, 0xe2, 0xe0, 0x3c, 0x4b, + 0x7f, 0x38, 0xfd, 0xf3, 0xc2, 0x53, 0x9c, 0x7e, + 0xf9, 0xe1, 0x28, 0x34, 0x7c, 0x19, 0x7d, 0xeb, + 0xe2, 0xe0, 0x3c, 0x49, 0xf0, 0x65, 0xf7, 0xaf, + 0x8b, 0x80, 0xf1, 0x2d, 0xfc, 0xe3, 0xf7, 0xcf, + 0x09, 0x4e, 0x71, 0xfb, 0xe7, 0x84, 0xa0, 0xd1, + 0xf0, 0x65, 0xf7, 0xaf, 0x8b, 0x80, 0xf1, 0x27, + 0xc1, 0x97, 0xde, 0xbe, 0x2e, 0x03, 0xc4, 0xb7, + 0xf3, 0x8f, 0xdf, 0x3c, 0x25, 0x39, 0xc7, 0xef, + 0x9e, 0x12, 0x83, 0x47, 0xc1, 0x97, 0xde, 0xbe, + 0x2e, 0x03, 0xc4, 0x9f, 0x06, 0x5f, 0x7a, 0xf8, + 0xb8, 0x0f, 0x12, 0xdf, 0xce, 0x3f, 0x7c, 0xf0, + 0x94, 0xe7, 0x1f, 0xbe, 0x78, 0x4a, 0x0d, 0x1f, + 0x06, 0x5f, 0x7a, 0xf8, 0xb8, 0x0f, 0x12, 0x7c, + 0x19, 0x7d, 0xeb, 0xe2, 0xe0, 0x3c, 0x4b, 0x7f, + 0x38, 0xfd, 0xf3, 0xc2, 0x53, 0x9c, 0x7e, 0xf9, + 0xe1, 0x28, 0x34, 0x37, 0x63, 0xb3, 0x16, 0x38, + 0x3d, 0x97, 0x11, 0x35, 0xc3, 0x48, 0x20, 0x3b, + 0x71, 0x77, 0xbb, 0x2b, 0xda, 0x77, 0xc5, 0xcd, + 0x9c, 0xc5, 0xb8, 0x48, 0xa1, 0xa3, 0x7c, 0x6e, + 0x56, 0x1a, 0xae, 0x7e, 0x71, 0xfb, 0xe7, 0x84, + 0xa7, 0x38, 0xfd, 0xf3, 0xc2, 0x50, 0x73, 0xfc, + 0x19, 0x7f, 0x52, 0x4d, 0xc4, 0x46, 0xbe, 0x72, + 0xcf, 0xc1, 0x97, 0xde, 0xbe, 0x2e, 0x03, 0xc4, + 0xb7, 0xf3, 0x8f, 0xdf, 0x3c, 0x25, 0x39, 0xc7, + 0xef, 0x9e, 0x12, 0x83, 0x47, 0xc1, 0x97, 0xde, + 0xbe, 0x2e, 0x03, 0xc4, 0x9f, 0x06, 0x5f, 0x7a, + 0xf8, 0xb8, 0x0f, 0x12, 0xdf, 0xce, 0x3f, 0x7c, + 0xf0, 0x94, 0xe7, 0x1f, 0xbe, 0x78, 0x4a, 0x0d, + 0x1f, 0x06, 0x5f, 0x7a, 0xf8, 0xb8, 0x0f, 0x12, + 0x7c, 0x19, 0x7d, 0xeb, 0xe2, 0xe0, 0x3c, 0x4b, + 0x7f, 0x38, 0xfd, 0xf3, 0xc2, 0x53, 0x9c, 0x7e, + 0xf9, 0xe1, 0x28, 0x34, 0x7c, 0x19, 0x7d, 0xeb, + 0xe2, 0xe0, 0x3c, 0x49, 0xf0, 0x65, 0xff, 0x00, + 0xaf, 0x8b, 0x80, 0xf1, 0x2d, 0xfc, 0xe3, 0xf7, + 0xcf, 0x09, 0x4e, 0x71, 0xfb, 0xe7, 0x84, 0xa0, + 0xf3, 0x6d, 0xb2, 0xd9, 0xbd, 0xa4, 0xa2, 0x6b, + 0x7b, 0xb8, 0xe3, 0x94, 0x02, 0x03, 0x83, 0x49, + 0xd7, 0xdb, 0x0b, 0x59, 0xd8, 0xdb, 0xf7, 0x38, + 0xb8, 0xcf, 0x15, 0x49, 0x24, 0x92, 0x0e, 0xb3, + 0xaf, 0x71, 0x6e, 0xe7, 0x1f, 0xbe, 0x78, 0x4a, + 0x73, 0x8f, 0xdf, 0x3c, 0x25, 0x06, 0x8f, 0x83, + 0x2f, 0xbd, 0x7c, 0x5c, 0x07, 0x89, 0x3e, 0x0c, + 0xbe, 0xf5, 0xf1, 0x70, 0x1e, 0x25, 0xbf, 0x9c, + 0x7e, 0xf9, 0xe1, 0x29, 0xce, 0x3f, 0x7c, 0xf0, + 0x94, 0x1a, 0x3e, 0x0c, 0xbe, 0xf5, 0xf1, 0x70, + 0x1e, 0x24, 0xf8, 0x32, 0xfb, 0xd7, 0xc5, 0xc0, + 0x78, 0x96, 0xfe, 0x71, 0xfb, 0xe7, 0x84, 0xa7, + 0x38, 0xfd, 0xf3, 0xc2, 0x50, 0x68, 0xf8, 0x32, + 0xfb, 0xd7, 0xc5, 0xc0, 0x78, 0x93, 0xe0, 0xcb, + 0xef, 0x5f, 0x17, 0x01, 0xe2, 0x5b, 0xf9, 0xc7, + 0xef, 0x9e, 0x12, 0x9c, 0xe3, 0xf7, 0xcf, 0x09, + 0x41, 0xa3, 0xe0, 0xcb, 0xef, 0x5f, 0x17, 0x01, + 0xe2, 0x4f, 0x83, 0x2f, 0xbd, 0x7c, 0x5c, 0x07, + 0x89, 0x6f, 0xe7, 0x1f, 0xbe, 0x78, 0x4a, 0x73, + 0x8f, 0xdf, 0x3c, 0x25, 0x06, 0x8f, 0x83, 0x2f, + 0xbd, 0x7c, 0x5c, 0x07, 0x89, 0x3e, 0x0c, 0xbe, + 0xf5, 0xf1, 0x70, 0x1e, 0x25, 0xbf, 0x9c, 0x7e, + 0xf9, 0xe1, 0x29, 0xce, 0x3f, 0x7c, 0xf0, 0x94, + 0x1a, 0x3e, 0x0c, 0xbe, 0xf5, 0xf1, 0x70, 0x1e, + 0x24, 0xf8, 0x32, 0xfb, 0xd7, 0xc5, 0xc0, 0x78, + 0x96, 0xfe, 0x71, 0xfb, 0xe7, 0x84, 0xa7, 0x38, + 0xfd, 0xf3, 0xc2, 0x50, 0x68, 0xf8, 0x32, 0xfb, + 0xd7, 0xc5, 0xc0, 0x78, 0x93, 0xe0, 0xcb, 0xef, + 0x5f, 0x17, 0x01, 0xe2, 0x5b, 0xf9, 0xc7, 0xef, + 0x9e, 0x12, 0x9c, 0xe3, 0xf7, 0xcf, 0x09, 0x41, + 0xae, 0x2d, 0x8c, 0x91, 0xa4, 0x1b, 0x9b, 0xb6, + 0xb5, 0x9f, 0x9d, 0x80, 0x50, 0xd3, 0xb0, 0x4e, + 0xa5, 0x25, 0xce, 0x58, 0xe5, 0xb6, 0xe6, 0xd7, + 0x2e, 0x6e, 0x97, 0x79, 0x52, 0x6b, 0x35, 0xdf, + 0x27, 0x74, 0xae, 0x12, 0xe7, 0x1d, 0x64, 0x9e, + 0xe9, 0x58, 0xed, 0x70, 0x20, 0x76, 0x6b, 0x52, + 0x74, 0x92, 0x88, 0x88, 0x3d, 0x47, 0xfb, 0x46, + 0x76, 0xd4, 0x9a, 0x8c, 0x8f, 0xf6, 0x8c, 0xed, + 0xa9, 0x34, 0x05, 0xc3, 0x98, 0x7b, 0xcd, 0xaf, + 0xda, 0x7c, 0xa1, 0x77, 0x2e, 0x1c, 0xc3, 0xde, + 0x6d, 0x7e, 0xd3, 0xe5, 0x08, 0x19, 0x7f, 0xbc, + 0xdd, 0xf9, 0xe7, 0xeb, 0x15, 0xdc, 0xb8, 0x72, + 0xff, 0x00, 0x79, 0xbb, 0xf3, 0xcf, 0xd6, 0x2b, + 0xb9, 0x00, 0xea, 0x2a, 0x28, 0xeb, 0x2a, 0x54, + 0xea, 0x2a, 0x28, 0xeb, 0x28, 0x08, 0x88, 0x83, + 0xa3, 0x31, 0xff, 0x00, 0x4d, 0x3f, 0xce, 0x1f, + 0x59, 0x54, 0x86, 0xa5, 0x6d, 0xcc, 0x7f, 0xd3, + 0x4f, 0xf3, 0x87, 0xd6, 0x55, 0x21, 0xa9, 0x06, + 0x51, 0x11, 0x3f, 0x00, 0x44, 0x44, 0xfc, 0x01, + 0x11, 0x13, 0xf0, 0x04, 0x44, 0x4f, 0xc0, 0x17, + 0x65, 0xa6, 0x53, 0x75, 0x77, 0x69, 0x35, 0xdb, + 0x28, 0xd8, 0x60, 0x04, 0xb8, 0x9d, 0x07, 0xc5, + 0x15, 0x34, 0x5c, 0xd0, 0x41, 0x25, 0xc4, 0xcc, + 0x82, 0x21, 0x89, 0xf2, 0x38, 0x35, 0xa3, 0xb2, + 0x4a, 0xb5, 0x45, 0x2c, 0x51, 0xdb, 0x66, 0x19, + 0x64, 0x1a, 0x61, 0xb2, 0xb6, 0xc2, 0xe7, 0x6f, + 0xc8, 0xe0, 0xf2, 0xf3, 0x54, 0xfc, 0x05, 0x47, + 0xb3, 0x4e, 0xea, 0xca, 0x91, 0xca, 0x72, 0xfb, + 0x6c, 0xc1, 0xb3, 0xc2, 0xe7, 0x16, 0xdd, 0xb1, + 0xa5, 0xf0, 0x00, 0x74, 0x10, 0xb3, 0x65, 0x96, + 0xc2, 0xeb, 0x0b, 0x9b, 0xfb, 0xe2, 0xe6, 0x32, + 0x2f, 0xd5, 0xc6, 0x1b, 0xa0, 0xb9, 0xe9, 0xf8, + 0x0e, 0x08, 0x63, 0x32, 0xca, 0xc8, 0xc3, 0x83, + 0x71, 0x9a, 0x54, 0xea, 0xee, 0xa9, 0x86, 0xec, + 0xad, 0xd3, 0xdc, 0x5b, 0x1d, 0xcc, 0x2f, 0x3b, + 0xcd, 0x24, 0x95, 0x07, 0xa6, 0xbb, 0xca, 0x6f, + 0x64, 0xff, 0x00, 0x99, 0xbb, 0x7f, 0x99, 0x7f, + 0x85, 0xa9, 0xf8, 0x0d, 0x37, 0x59, 0x04, 0xf6, + 0xb0, 0x3e, 0x73, 0x73, 0x0b, 0xc3, 0x35, 0xb5, + 0x8e, 0x35, 0x51, 0x40, 0xd7, 0xba, 0xbb, 0xec, + 0x2c, 0x0e, 0x61, 0x99, 0x7b, 0x3d, 0x70, 0x34, + 0xb9, 0xe5, 0xee, 0xde, 0x68, 0x25, 0x48, 0x41, + 0x65, 0xb3, 0xf7, 0x77, 0x46, 0xc2, 0x0e, 0x7d, + 0xb3, 0x1a, 0x86, 0x4c, 0x4e, 0x82, 0x5b, 0xaf, + 0x41, 0xdc, 0x4f, 0xc0, 0x40, 0xa2, 0x94, 0xca, + 0xb2, 0x98, 0xee, 0xef, 0xae, 0x2d, 0x2e, 0x1e, + 0x41, 0xb7, 0x6b, 0xa8, 0xe6, 0xe8, 0x15, 0x69, + 0x0d, 0xaf, 0x7d, 0x75, 0x59, 0xe5, 0xb9, 0x15, + 0xe9, 0x7d, 0x94, 0x12, 0xca, 0x6e, 0x9a, 0xd2, + 0x44, 0xae, 0xd0, 0xc7, 0x39, 0xba, 0x2a, 0xd1, + 0xba, 0x13, 0xf0, 0x10, 0x34, 0x21, 0x34, 0x77, + 0xe8, 0xa7, 0x6d, 0x72, 0xdc, 0x8a, 0x79, 0xba, + 0xb8, 0xc9, 0x2b, 0xae, 0xe9, 0x43, 0x30, 0xd0, + 0xcc, 0x6d, 0xad, 0x43, 0x57, 0x3e, 0x55, 0x94, + 0x47, 0x75, 0x7b, 0x73, 0x6b, 0x3b, 0xdc, 0xd3, + 0x6e, 0xd7, 0x61, 0x73, 0x74, 0x69, 0x07, 0x0e, + 0x23, 0xda, 0x4f, 0xc0, 0x45, 0x68, 0xdf, 0x4f, + 0xc8, 0x29, 0xdb, 0x6c, 0xbb, 0x22, 0xbd, 0x79, + 0xb2, 0xb6, 0x92, 0x51, 0x76, 0xd0, 0x70, 0xca, + 0xef, 0x25, 0xc4, 0x6b, 0xa7, 0x61, 0x71, 0x65, + 0x99, 0x50, 0xb9, 0x9e, 0x61, 0x72, 0xee, 0x6a, + 0x0b, 0x50, 0x5d, 0x72, 0xe0, 0x34, 0xe8, 0xae, + 0x81, 0xc0, 0x9f, 0x80, 0x8f, 0x4f, 0xcb, 0xf2, + 0xe0, 0x53, 0x51, 0x65, 0xf9, 0x46, 0x63, 0x14, + 0xcd, 0xcb, 0x4c, 0xb1, 0xcf, 0x03, 0x4b, 0xc3, + 0x64, 0x35, 0x0f, 0x03, 0xb6, 0xbc, 0x65, 0x99, + 0x45, 0xad, 0xe6, 0x5b, 0x2d, 0xe4, 0xf2, 0x18, + 0x8c, 0x6f, 0x01, 0xce, 0x1a, 0x83, 0x34, 0x57, + 0x42, 0x7e, 0x02, 0x1f, 0x73, 0x42, 0xeb, 0xcb, + 0xb2, 0xd9, 0xb3, 0x19, 0x9f, 0x04, 0x2e, 0x0c, + 0x2c, 0x69, 0x7f, 0x8d, 0xa8, 0x80, 0x69, 0xb8, + 0x99, 0x8f, 0x56, 0xf3, 0xcd, 0x19, 0x71, 0x79, + 0x88, 0x36, 0x8f, 0xe7, 0x2b, 0x5c, 0x5d, 0xd5, + 0x23, 0xb2, 0x7f, 0xcc, 0x26, 0xfb, 0x07, 0x7d, + 0x66, 0xa7, 0xe0, 0x21, 0x08, 0xa1, 0x23, 0x71, + 0xb5, 0xaf, 0x73, 0x42, 0x0d, 0x3a, 0xb5, 0x1d, + 0xd5, 0x2f, 0x95, 0xe5, 0x56, 0xd7, 0xd0, 0x5e, + 0x4d, 0x3c, 0x86, 0x2e, 0x61, 0xda, 0x1e, 0x37, + 0x05, 0x49, 0x24, 0xad, 0xf0, 0x65, 0xd9, 0x2e, + 0x63, 0x14, 0xcd, 0xb0, 0x74, 0xa2, 0xe2, 0x26, + 0x97, 0x87, 0x49, 0xa9, 0xdd, 0x9a, 0x27, 0xe0, + 0x20, 0x2a, 0xb2, 0x74, 0x6b, 0xd0, 0xa5, 0xb2, + 0xac, 0xaa, 0xd2, 0xef, 0x2d, 0x9a, 0xee, 0xe2, + 0x57, 0x44, 0x60, 0x7d, 0x1c, 0x5b, 0xa4, 0x61, + 0x01, 0xa4, 0xf8, 0xbd, 0x9a, 0xad, 0x87, 0x2d, + 0xca, 0xaf, 0xac, 0xe6, 0x97, 0x2a, 0x74, 0xad, + 0x9e, 0xdd, 0xb8, 0x9d, 0x1c, 0xba, 0x71, 0x37, + 0xba, 0x9f, 0x80, 0x85, 0x45, 0x22, 0xdc, 0xba, + 0x03, 0x91, 0xbb, 0x31, 0x05, 0xdc, 0xeb, 0x65, + 0xe6, 0xc0, 0xdc, 0xa5, 0x69, 0xa9, 0x62, 0xc3, + 0x2f, 0x82, 0xe7, 0x2e, 0xbe, 0xb9, 0x90, 0xb8, + 0x3e, 0xd9, 0x95, 0x65, 0x35, 0x6e, 0x9d, 0x3c, + 0x09, 0xf8, 0x0e, 0x76, 0x58, 0xdc, 0x3e, 0xca, + 0x4b, 0xe6, 0x80, 0x60, 0x89, 0xc1, 0x8e, 0x35, + 0x15, 0xa9, 0xa6, 0xe7, 0x75, 0x73, 0x54, 0x69, + 0xd3, 0xa9, 0x59, 0xed, 0x86, 0x4c, 0x76, 0x7e, + 0x7a, 0xf3, 0xfe, 0xc8, 0x64, 0x69, 0x9b, 0x47, + 0x8f, 0x8f, 0xc5, 0xd5, 0xd8, 0xd4, 0xb8, 0x60, + 0xcb, 0xb2, 0xc6, 0x59, 0xbf, 0x31, 0xba, 0x74, + 0xae, 0xb7, 0x74, 0x86, 0x3b, 0x68, 0x99, 0xa1, + 0xc4, 0x03, 0x4f, 0x1b, 0xba, 0x13, 0xf0, 0x10, + 0xe8, 0xa5, 0x73, 0x0b, 0x0b, 0x13, 0x97, 0x47, + 0x99, 0xe5, 0xee, 0x7f, 0x32, 0xf7, 0x60, 0x7c, + 0x72, 0x69, 0x20, 0xa8, 0xa4, 0xfc, 0x01, 0x11, + 0x13, 0xf0, 0x04, 0x44, 0x4f, 0xc0, 0x11, 0x11, + 0x3f, 0x00, 0x58, 0x3b, 0xab, 0x2b, 0x07, 0x75, + 0x3f, 0x01, 0x73, 0xba, 0xfe, 0x57, 0x63, 0xe6, + 0x37, 0xea, 0x85, 0xc0, 0xbb, 0xae, 0xbf, 0x95, + 0xd8, 0xf9, 0x8d, 0xfa, 0xa1, 0x70, 0xa0, 0xca, + 0x22, 0x20, 0x2c, 0x1d, 0x00, 0x95, 0x95, 0x83, + 0xa8, 0xf7, 0xd0, 0x36, 0xc7, 0x47, 0xb1, 0x03, + 0xf3, 0x5f, 0xfd, 0xc5, 0x5b, 0xa8, 0x57, 0x6c, + 0xe6, 0x4c, 0x99, 0x82, 0x0e, 0xb4, 0x61, 0x7d, + 0x41, 0xe6, 0xa9, 0x8b, 0xb1, 0x5f, 0x24, 0x85, + 0x1b, 0xcf, 0xec, 0x6f, 0xa8, 0x77, 0x04, 0x9e, + 0x92, 0x0a, 0xdd, 0x42, 0x54, 0x2b, 0x27, 0x3f, + 0xb1, 0xbe, 0xa1, 0xdc, 0x12, 0x7a, 0x49, 0xcf, + 0xec, 0x6f, 0xa8, 0x77, 0x04, 0x9e, 0x92, 0x0a, + 0xdd, 0x42, 0x54, 0x2b, 0x27, 0x3f, 0xb1, 0xbe, + 0xa1, 0xdc, 0x12, 0x7a, 0x49, 0xcf, 0xec, 0x6f, + 0xa8, 0x77, 0x04, 0x9e, 0x92, 0x0a, 0xdd, 0x42, + 0x54, 0x2b, 0x27, 0x3f, 0xb1, 0xbe, 0xa1, 0xdc, + 0x12, 0x7a, 0x49, 0xcf, 0xec, 0x6f, 0xa8, 0x77, + 0x04, 0x9e, 0x92, 0x0a, 0xdd, 0x42, 0x54, 0x2b, + 0x27, 0x3f, 0xb1, 0xbe, 0xa1, 0xdc, 0x12, 0x7a, + 0x49, 0xcf, 0xec, 0x6f, 0xa8, 0x77, 0x04, 0x9e, + 0x92, 0x0a, 0xdd, 0x42, 0x54, 0x2b, 0x27, 0x3f, + 0xb1, 0xbe, 0xa1, 0xdc, 0x12, 0x7a, 0x49, 0xcf, + 0xec, 0x6f, 0xa8, 0x77, 0x04, 0x9e, 0x92, 0x0a, + 0xdd, 0x42, 0x54, 0x2b, 0x27, 0x3f, 0xb1, 0xbe, + 0xa1, 0xdc, 0x12, 0x7a, 0x49, 0xcf, 0xec, 0x6f, + 0xa8, 0x77, 0x04, 0x9e, 0x92, 0x0a, 0xdd, 0x42, + 0x54, 0x2b, 0x27, 0x3f, 0xb1, 0xbe, 0xa1, 0xdc, + 0x12, 0x7a, 0x49, 0xcf, 0xec, 0x6f, 0xa8, 0x77, + 0x04, 0x9e, 0x92, 0x0a, 0xdd, 0x42, 0xcd, 0x7b, + 0x2a, 0xc7, 0xcf, 0xec, 0x6f, 0xa8, 0x77, 0x04, + 0x9e, 0x92, 0x73, 0xfb, 0x1b, 0xea, 0x1d, 0xc1, + 0x27, 0xa4, 0x82, 0xb9, 0x8b, 0xb2, 0x98, 0x8d, + 0x41, 0xae, 0x91, 0xa9, 0x58, 0xf9, 0xfd, 0x8d, + 0xf5, 0x0e, 0xe0, 0x93, 0xd2, 0x4e, 0x7f, 0x63, + 0x7d, 0x43, 0xb8, 0x24, 0xf4, 0x90, 0x57, 0x2a, + 0x16, 0x37, 0x6b, 0x5a, 0xd1, 0x59, 0x39, 0xfd, + 0x8d, 0xf5, 0x0e, 0xe0, 0x93, 0xd2, 0x4e, 0x7f, + 0x63, 0x7d, 0x43, 0xb8, 0x24, 0xf4, 0x90, 0x57, + 0x2a, 0x17, 0xa1, 0x3c, 0xad, 0x66, 0x06, 0xc8, + 0xe0, 0xcf, 0x9a, 0x1c, 0x68, 0xac, 0x3c, 0xfe, + 0xc6, 0xfa, 0x87, 0x70, 0x49, 0xe9, 0x27, 0x3f, + 0xb1, 0xbe, 0xa1, 0xdc, 0x12, 0x7a, 0x48, 0x2b, + 0x7a, 0x29, 0xa0, 0xd0, 0x9d, 0xed, 0xe4, 0xaa, + 0xb2, 0x73, 0xfb, 0x1b, 0xea, 0x1d, 0xc1, 0x27, + 0xa4, 0x9c, 0xfe, 0xc6, 0xfa, 0x87, 0x70, 0x49, + 0xe9, 0x20, 0xae, 0x57, 0x72, 0xb5, 0x1b, 0xdb, + 0x95, 0xdf, 0x42, 0x6b, 0xac, 0xe9, 0xa5, 0x2a, + 0x55, 0x8f, 0x9f, 0xd8, 0xdf, 0x50, 0xee, 0x09, + 0x3d, 0x24, 0xe7, 0xf6, 0x37, 0xd4, 0x3b, 0x82, + 0x4f, 0x49, 0x05, 0x6e, 0xba, 0x28, 0x0e, 0xf6, + 0x8a, 0x9d, 0xc3, 0xbd, 0xa9, 0x2a, 0x15, 0x93, + 0x9f, 0xd8, 0xdf, 0x50, 0xee, 0x09, 0x3d, 0x24, + 0xe7, 0xf6, 0x37, 0xd4, 0x3b, 0x82, 0x4f, 0x49, + 0x05, 0x6e, 0xa1, 0x2a, 0x15, 0x93, 0x9f, 0xd8, + 0xdf, 0x50, 0xee, 0x09, 0x3d, 0x24, 0xe7, 0xf6, + 0x37, 0xd4, 0x3b, 0x82, 0x4f, 0x49, 0x05, 0x6e, + 0xa1, 0x2a, 0x15, 0x93, 0x9f, 0xd8, 0xdf, 0x50, + 0xee, 0x09, 0x3d, 0x24, 0xe7, 0xf6, 0x37, 0xd4, + 0x3b, 0x82, 0x4f, 0x49, 0x05, 0x6e, 0xa1, 0x2a, + 0x15, 0x93, 0x9f, 0xd8, 0xdf, 0x50, 0xee, 0x09, + 0x3d, 0x24, 0xe7, 0xf6, 0x37, 0xd4, 0x3b, 0x82, + 0x4f, 0x49, 0x05, 0x6e, 0xa1, 0x2a, 0x15, 0x93, + 0x9f, 0xd8, 0xdf, 0x50, 0xee, 0x09, 0x3d, 0x24, + 0xe7, 0xf6, 0x37, 0xd4, 0x3b, 0x82, 0x4f, 0x49, + 0x05, 0x6e, 0xa1, 0x2a, 0x15, 0x93, 0x9f, 0xd8, + 0xdf, 0x50, 0xee, 0x09, 0x3d, 0x24, 0xe7, 0xf6, + 0x37, 0xd4, 0x3b, 0x82, 0x4f, 0x49, 0x05, 0x6e, + 0xa1, 0x2a, 0x15, 0x93, 0x9f, 0xd8, 0xdf, 0x50, + 0xee, 0x09, 0x3d, 0x24, 0xe7, 0xf6, 0x37, 0xd4, + 0x3b, 0x82, 0x4f, 0x49, 0x05, 0x6e, 0xa1, 0x2a, + 0x15, 0x93, 0x9f, 0xd8, 0xdf, 0x50, 0xee, 0x09, + 0x3d, 0x24, 0xe7, 0xf6, 0x37, 0xd4, 0x3b, 0x82, + 0x4f, 0x49, 0x05, 0x6e, 0xa1, 0x75, 0x65, 0x5f, + 0xcc, 0xed, 0x3e, 0xd9, 0x9f, 0x58, 0x29, 0xae, + 0x7f, 0x63, 0x7d, 0x43, 0xb8, 0x24, 0xf4, 0x96, + 0xeb, 0x39, 0xb6, 0x50, 0xdd, 0xc2, 0x2d, 0xe1, + 0x70, 0x9c, 0xbd, 0xbc, 0xd1, 0xa3, 0xf4, 0x3a, + 0xbe, 0x2e, 0xb7, 0x20, 0xdf, 0x9b, 0x7b, 0xeb, + 0xbc, 0xd6, 0xae, 0x35, 0xdb, 0x9b, 0xfb, 0xe1, + 0xf3, 0x5a, 0xb8, 0x90, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x07, 0xa8, 0xff, 0x00, 0x68, 0xce, + 0xda, 0x93, 0x51, 0x91, 0xfe, 0xd1, 0x9d, 0xb5, + 0x26, 0x80, 0xb8, 0x73, 0x0f, 0x79, 0xb5, 0xfb, + 0x4f, 0x94, 0x2e, 0xe5, 0xc3, 0x98, 0x7b, 0xcd, + 0xaf, 0xda, 0x7c, 0xa1, 0x03, 0x2f, 0xf7, 0x9b, + 0xbf, 0x3c, 0xfd, 0x62, 0xbb, 0x97, 0x0e, 0x5f, + 0xef, 0x37, 0x7e, 0x79, 0xfa, 0xc5, 0x77, 0x20, + 0x1d, 0x45, 0x45, 0x1d, 0x65, 0x4a, 0x9d, 0x45, + 0x45, 0x1d, 0x65, 0x01, 0x11, 0x10, 0x74, 0x66, + 0x3f, 0xe9, 0xa7, 0xf9, 0xc3, 0xeb, 0x2a, 0x90, + 0xd4, 0xad, 0xb9, 0x8f, 0xfa, 0x69, 0xfe, 0x70, + 0xfa, 0xca, 0xa4, 0x35, 0x20, 0xca, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x09, + 0xcd, 0x9b, 0x86, 0x30, 0xdb, 0x9b, 0xa0, 0xf8, + 0xdb, 0x72, 0xc1, 0xcd, 0xdb, 0xf3, 0x84, 0x00, + 0x09, 0x1e, 0x56, 0x95, 0xdd, 0x95, 0x65, 0x53, + 0x5b, 0xc1, 0x7e, 0xd7, 0xcf, 0x14, 0x8e, 0xb8, + 0x8a, 0x98, 0x9a, 0xea, 0x80, 0x4e, 0x3d, 0x2e, + 0xe1, 0x55, 0x5d, 0xdf, 0xcb, 0xb4, 0xa4, 0x72, + 0xac, 0xc2, 0xde, 0xce, 0xda, 0xfa, 0x39, 0xb1, + 0x63, 0xb9, 0x8b, 0x04, 0x58, 0x45, 0x74, 0x90, + 0xfa, 0x57, 0x79, 0x02, 0xc2, 0xda, 0xe6, 0xdf, + 0x3b, 0x8a, 0xde, 0x07, 0x35, 0xf3, 0x46, 0xf1, + 0xe3, 0xb4, 0xd5, 0xb4, 0xfc, 0xe3, 0xda, 0xa2, + 0x93, 0xda, 0xbc, 0x4e, 0x82, 0x07, 0x5b, 0x96, + 0xfb, 0x26, 0x27, 0x03, 0x87, 0x57, 0x39, 0x5f, + 0xce, 0x51, 0xb9, 0x56, 0x61, 0x6b, 0x97, 0xdb, + 0xdc, 0xbf, 0xc6, 0x37, 0xb2, 0x37, 0x04, 0x22, + 0x9a, 0x1a, 0x37, 0x74, 0xd5, 0x67, 0x2f, 0xcc, + 0x6d, 0xdb, 0x61, 0x73, 0x97, 0xde, 0xe2, 0x74, + 0x52, 0x78, 0xd1, 0xb9, 0xa3, 0x11, 0x6b, 0xd0, + 0x46, 0x56, 0xba, 0x54, 0xce, 0xc9, 0xff, 0x00, + 0x34, 0x7f, 0xd8, 0x3f, 0xc2, 0xd5, 0x0d, 0xa7, + 0x75, 0x48, 0xe4, 0x57, 0xf0, 0x58, 0x5e, 0xba, + 0x7b, 0x8c, 0x58, 0x0c, 0x6e, 0x60, 0xc2, 0x31, + 0x69, 0x24, 0x1f, 0x91, 0x07, 0x9c, 0xb6, 0xc6, + 0x5b, 0xdc, 0xc5, 0xf0, 0xc7, 0x21, 0x84, 0x02, + 0xe7, 0x49, 0x23, 0x75, 0x86, 0x62, 0xa2, 0x94, + 0xc9, 0xdf, 0x93, 0x47, 0x9a, 0x45, 0x05, 0x9c, + 0x72, 0x4d, 0x29, 0x2e, 0xa5, 0xcc, 0xa7, 0x40, + 0xa3, 0x4d, 0x70, 0x37, 0xb3, 0x45, 0x1b, 0x94, + 0x66, 0x51, 0x58, 0x66, 0x0e, 0xb8, 0x90, 0x13, + 0x0c, 0xa1, 0xcc, 0x93, 0x46, 0x90, 0x09, 0xad, + 0x68, 0xba, 0xed, 0x6e, 0xb2, 0x3c, 0xba, 0xf1, + 0xb7, 0x30, 0x3a, 0x5b, 0x83, 0x88, 0xd0, 0x90, + 0x1a, 0x23, 0x6b, 0x81, 0xd5, 0xbf, 0xad, 0x07, + 0x46, 0x4a, 0x29, 0x9d, 0xe6, 0x5e, 0x6c, 0x9f, + 0x58, 0x2e, 0x2d, 0x93, 0x1f, 0xe6, 0xac, 0x1f, + 0xe1, 0xbf, 0x57, 0x68, 0x2d, 0xb6, 0xb9, 0x9e, + 0x5d, 0x69, 0x9a, 0x5d, 0x5c, 0xb5, 0xd2, 0x3a, + 0x0b, 0x86, 0x10, 0xd2, 0x58, 0x6b, 0x89, 0xc6, + 0xa4, 0x53, 0x78, 0x6f, 0xae, 0x1c, 0x8e, 0xfa, + 0x1c, 0xbe, 0xf5, 0xb7, 0x17, 0x15, 0xc0, 0x18, + 0xe6, 0xf8, 0xa2, 0xa6, 0xa4, 0x0a, 0x20, 0xdd, + 0x92, 0xff, 0x00, 0xa8, 0x23, 0xdf, 0xe7, 0x64, + 0x15, 0xee, 0x15, 0x21, 0x96, 0x62, 0x39, 0xbe, + 0x6b, 0x4d, 0x78, 0x24, 0x00, 0x76, 0x71, 0x28, + 0x8c, 0xba, 0xf2, 0x1b, 0x6c, 0xd5, 0xb7, 0x92, + 0x62, 0xe6, 0x9a, 0xf7, 0x3f, 0xc5, 0x15, 0x34, + 0x77, 0x60, 0x76, 0xd4, 0xb6, 0x41, 0x3b, 0x64, + 0xcd, 0x6f, 0xee, 0x58, 0x0b, 0x98, 0xf6, 0x3a, + 0x46, 0x82, 0x29, 0x51, 0x5a, 0xd0, 0xa0, 0x8b, + 0xd9, 0xdd, 0x19, 0xbd, 0xa9, 0x6e, 0x9d, 0x3e, + 0x11, 0xa5, 0x4d, 0xdb, 0xbe, 0xdd, 0x83, 0x3c, + 0x7c, 0x8c, 0x32, 0xc4, 0x1e, 0x79, 0xc6, 0x03, + 0x42, 0x5b, 0x4d, 0xc3, 0xc2, 0xb8, 0x6d, 0xaf, + 0x72, 0x3b, 0x27, 0xba, 0xfe, 0xdb, 0x9c, 0x37, + 0x2e, 0x69, 0xe6, 0xed, 0xdc, 0x3c, 0x56, 0x17, + 0x6b, 0xd2, 0xb9, 0x72, 0xac, 0xd9, 0x96, 0xd3, + 0xce, 0x2e, 0xda, 0x5f, 0x05, 0xe0, 0x22, 0x6a, + 0x6b, 0x15, 0xae, 0x9e, 0xfa, 0x0e, 0xcc, 0xbf, + 0x34, 0xcb, 0x2d, 0xe6, 0x73, 0xec, 0xac, 0x27, + 0x74, 0x8e, 0x61, 0x69, 0xa3, 0xb1, 0x1c, 0x24, + 0xe9, 0xd1, 0xa7, 0x79, 0x78, 0xb7, 0x35, 0xd9, + 0x6b, 0xd2, 0x05, 0x01, 0x9c, 0x50, 0x6f, 0x54, + 0xb3, 0x8d, 0x79, 0x8a, 0xf3, 0x29, 0xca, 0xe2, + 0x99, 0xd6, 0x0f, 0x92, 0x7b, 0x99, 0x9a, 0x63, + 0x61, 0x7b, 0x43, 0x43, 0x5a, 0x75, 0xad, 0x10, + 0x5f, 0x5b, 0xc7, 0x91, 0x5c, 0x65, 0xee, 0xc5, + 0xcf, 0xcb, 0x23, 0x5e, 0xcf, 0x17, 0xc5, 0xd0, + 0x58, 0x75, 0xf7, 0x10, 0x46, 0xa9, 0xbd, 0x93, + 0xfe, 0x61, 0x3f, 0xd8, 0x3b, 0xeb, 0x35, 0x42, + 0x29, 0x2c, 0x87, 0x31, 0xb7, 0xb0, 0xbb, 0x92, + 0x6b, 0x8c, 0x58, 0x5f, 0x11, 0x60, 0x0d, 0x15, + 0xd2, 0x5c, 0x10, 0x75, 0x65, 0x7a, 0x72, 0x6c, + 0xe0, 0x76, 0x3d, 0x25, 0x8d, 0x95, 0xf7, 0xab, + 0x93, 0xbb, 0xec, 0xef, 0xf0, 0xb5, 0x73, 0x58, + 0xe6, 0x36, 0xd6, 0xf9, 0x7d, 0xfd, 0xbc, 0xb8, + 0xb1, 0xdd, 0x0f, 0xd5, 0xd1, 0xb5, 0xdf, 0xd7, + 0xa5, 0x63, 0x23, 0xcc, 0x20, 0xb0, 0x9a, 0x69, + 0x27, 0xc5, 0x49, 0x22, 0x74, 0x60, 0x30, 0x62, + 0xf1, 0x89, 0x1c, 0x48, 0x3a, 0x2c, 0x89, 0x1b, + 0x2f, 0x7f, 0x4d, 0x1f, 0xad, 0x1d, 0xf0, 0xc5, + 0xef, 0x65, 0x7d, 0xea, 0xeb, 0xe6, 0xf3, 0x0e, + 0xa8, 0xdc, 0xd6, 0xd5, 0xb3, 0x26, 0x92, 0x28, + 0x72, 0x0b, 0xd7, 0x5c, 0x30, 0xc9, 0x17, 0x3b, + 0x47, 0xb0, 0x6b, 0xa3, 0x83, 0x05, 0x47, 0x68, + 0x15, 0xa0, 0xdf, 0x65, 0x79, 0x7d, 0x94, 0xf0, + 0xe5, 0xaf, 0x92, 0x59, 0xee, 0x06, 0x13, 0x23, + 0xc5, 0x30, 0xb7, 0xb0, 0x83, 0x2c, 0x23, 0xe1, + 0x29, 0x37, 0xbd, 0xa0, 0x53, 0x84, 0x26, 0x4c, + 0x3f, 0xc9, 0x73, 0x6f, 0xb3, 0x15, 0xed, 0xd1, + 0xcb, 0xc6, 0x59, 0x98, 0x65, 0xfd, 0x5b, 0x2e, + 0x59, 0x7c, 0x5c, 0xc8, 0xde, 0xec, 0x6d, 0x95, + 0x82, 0xba, 0x74, 0x71, 0x2d, 0x8d, 0xcc, 0xb2, + 0x9b, 0x6c, 0xbe, 0xf2, 0xc6, 0xd8, 0x48, 0xee, + 0x7d, 0x94, 0x6c, 0xae, 0x1a, 0x5e, 0xf3, 0x50, + 0x6b, 0xbc, 0x10, 0x62, 0xd8, 0x7f, 0xf5, 0x5b, + 0xbf, 0xb7, 0x6f, 0x86, 0x35, 0xe3, 0x2f, 0xcc, + 0x59, 0x0e, 0x5f, 0xec, 0x79, 0x85, 0xb3, 0xa5, + 0xb1, 0x7b, 0x89, 0x8e, 0x46, 0x8a, 0x51, 0xc6, + 0xa4, 0xd3, 0xba, 0x99, 0x65, 0xf6, 0x5e, 0xcc, + 0xba, 0x7c, 0xba, 0xf8, 0xc8, 0xd8, 0xe5, 0x78, + 0x7e, 0x38, 0xc5, 0x4d, 0x45, 0x3d, 0x15, 0xee, + 0x2b, 0xfc, 0xaa, 0xe2, 0xc7, 0xab, 0x6e, 0x9d, + 0x23, 0x22, 0x89, 0xe5, 0xf6, 0xb3, 0xb4, 0x54, + 0xd3, 0x73, 0x17, 0x0a, 0x0f, 0x37, 0xf9, 0x6d, + 0xa0, 0xcb, 0xfd, 0xbf, 0x2d, 0x9d, 0xef, 0xb4, + 0x0f, 0x0d, 0x7c, 0x4f, 0xaf, 0x8a, 0x74, 0x71, + 0xa8, 0x7f, 0x08, 0xd7, 0xe1, 0x52, 0xd7, 0x97, + 0xf6, 0x30, 0xe5, 0xbd, 0x59, 0x60, 0x5f, 0x2b, + 0x5e, 0xec, 0x72, 0xcc, 0xf1, 0x4a, 0x9d, 0xea, + 0x77, 0x14, 0x45, 0x6b, 0xf2, 0xa0, 0xca, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x2c, 0x1d, + 0xd5, 0x95, 0x83, 0xba, 0x82, 0xe5, 0x75, 0xfc, + 0xae, 0xc7, 0xcc, 0x6f, 0xd5, 0x0b, 0x85, 0x77, + 0x5d, 0x7f, 0x2b, 0xb1, 0xf3, 0x1b, 0xf5, 0x42, + 0xe1, 0x41, 0x94, 0x44, 0x40, 0x58, 0x2b, 0x2b, + 0x1b, 0x85, 0x06, 0x76, 0xc7, 0xc9, 0xb2, 0xed, + 0x3f, 0xfb, 0xaa, 0xb6, 0xac, 0xbb, 0x63, 0xe4, + 0xd9, 0xf6, 0x9f, 0xfd, 0xd5, 0x5a, 0x40, 0xf0, + 0xaf, 0x51, 0x46, 0xf9, 0x65, 0x6c, 0x51, 0x8a, + 0xb9, 0xe7, 0x0b, 0x45, 0x57, 0x85, 0x39, 0x91, + 0xe6, 0xdc, 0xdd, 0xcd, 0xbd, 0xab, 0x2d, 0x62, + 0xab, 0xdd, 0x80, 0xce, 0x01, 0xc6, 0x41, 0xec, + 0xa0, 0x89, 0xba, 0xb6, 0x96, 0xd6, 0x77, 0xdb, + 0xcb, 0x4e, 0x72, 0x33, 0x47, 0x61, 0x35, 0x0b, + 0x7d, 0x96, 0x53, 0x7b, 0x7c, 0xc7, 0x49, 0x0b, + 0x40, 0x8d, 0xba, 0x0c, 0x92, 0x3b, 0x0b, 0x6b, + 0xdd, 0x5e, 0xf3, 0xed, 0x19, 0xb5, 0xd7, 0x61, + 0xff, 0x00, 0x22, 0xed, 0xcf, 0x49, 0xb6, 0xca, + 0xf2, 0xeb, 0x46, 0xe8, 0x63, 0xd9, 0xce, 0x48, + 0xdd, 0xf3, 0x41, 0xaf, 0x85, 0x04, 0x65, 0xf6, + 0x5d, 0x77, 0x60, 0x40, 0xb8, 0x65, 0x03, 0xf4, + 0xb1, 0xed, 0x38, 0x9a, 0x7b, 0xa1, 0x78, 0xb2, + 0xb5, 0x7d, 0xe5, 0xd4, 0x76, 0xb1, 0xd0, 0x3e, + 0x43, 0x4a, 0x9a, 0xd0, 0x0d, 0x64, 0x95, 0x2d, + 0x05, 0x6e, 0x76, 0x5a, 0x76, 0xc8, 0x71, 0x1b, + 0x59, 0x6b, 0x19, 0x3b, 0x83, 0x47, 0x19, 0x5a, + 0x32, 0x51, 0xec, 0xf6, 0xf7, 0xb9, 0x8b, 0xb5, + 0xc3, 0x1f, 0x37, 0x19, 0xdf, 0x7c, 0x9e, 0x2e, + 0x84, 0x11, 0x92, 0x33, 0x04, 0xae, 0x8c, 0x1c, + 0x78, 0x4d, 0x01, 0x1b, 0xb4, 0x34, 0x34, 0x5b, + 0x6e, 0xec, 0xe7, 0xb3, 0x7b, 0x23, 0x9c, 0x00, + 0xf7, 0xb0, 0x48, 0x00, 0x35, 0xa0, 0x75, 0x69, + 0x5e, 0xce, 0x85, 0xd1, 0x97, 0xe6, 0xa2, 0xc9, + 0xb4, 0xf6, 0x68, 0xa7, 0x7e, 0x2a, 0xf3, 0xb2, + 0x0f, 0x18, 0x57, 0x70, 0x68, 0xec, 0x2e, 0xbd, + 0xad, 0x35, 0xcc, 0xd8, 0x77, 0xe1, 0x66, 0x8e, + 0xd9, 0x72, 0x08, 0xdb, 0x2c, 0xbe, 0xea, 0xfa, + 0x42, 0xcb, 0x66, 0x62, 0xc3, 0xa5, 0xee, 0x26, + 0x8d, 0x68, 0xec, 0x92, 0xb6, 0xde, 0x64, 0xf7, + 0xf6, 0x51, 0x89, 0x65, 0x6b, 0x5d, 0x11, 0xd0, + 0x24, 0x63, 0xb1, 0x36, 0xbd, 0x9a, 0x2e, 0xff, + 0x00, 0x1a, 0xd7, 0x65, 0x1a, 0xe6, 0x1a, 0x3a, + 0xea, 0x63, 0x8c, 0x8d, 0xd6, 0xd6, 0x94, 0xef, + 0x26, 0xcf, 0x1e, 0x7e, 0xd3, 0x30, 0xb3, 0x7d, + 0x4b, 0x0c, 0x25, 0xed, 0x69, 0xd4, 0x08, 0xaa, + 0x08, 0xbb, 0x2c, 0xbe, 0xee, 0xfd, 0xe5, 0x96, + 0xcc, 0xc5, 0x84, 0x55, 0xee, 0x71, 0xc2, 0xd6, + 0xd7, 0x7c, 0x95, 0xb6, 0xf3, 0x27, 0xbe, 0xb2, + 0x88, 0x4d, 0x2b, 0x5a, 0xe8, 0x8e, 0x8e, 0x72, + 0x37, 0x62, 0x03, 0xb7, 0x45, 0xdd, 0xee, 0xbb, + 0x28, 0x1c, 0xc3, 0x85, 0xf7, 0x53, 0x51, 0xee, + 0x1a, 0xcb, 0x6a, 0x45, 0x3b, 0xcb, 0x3b, 0x3b, + 0x59, 0xad, 0x73, 0x0b, 0x37, 0xf8, 0xd1, 0x98, + 0x8b, 0xda, 0xd3, 0xa8, 0x3b, 0x4d, 0x28, 0x82, + 0x0d, 0x48, 0xd8, 0x64, 0x77, 0x77, 0xf6, 0xe6, + 0xe6, 0x17, 0xc6, 0xd8, 0xc3, 0x8b, 0x3c, 0x72, + 0x41, 0xa8, 0xa7, 0x1a, 0x8d, 0xec, 0x6e, 0xee, + 0xa9, 0xe8, 0x23, 0x92, 0x5d, 0x94, 0x91, 0x91, + 0xb4, 0xbd, 0xc6, 0x73, 0x40, 0xd1, 0x53, 0xb9, + 0xbc, 0x10, 0x68, 0x97, 0x66, 0xaf, 0xa2, 0x89, + 0xf2, 0xba, 0x48, 0x48, 0x63, 0x4b, 0x88, 0x0f, + 0xde, 0x15, 0x5c, 0x0d, 0xb2, 0xb9, 0x7d, 0x9b, + 0xaf, 0x5a, 0xca, 0xdb, 0xb5, 0xd8, 0x4b, 0xeb, + 0xda, 0xdc, 0x5e, 0x5d, 0x6b, 0x74, 0xd0, 0xe7, + 0x98, 0x64, 0x63, 0x40, 0xd2, 0xe2, 0xd7, 0x00, + 0x05, 0x34, 0xeb, 0x01, 0x58, 0xe1, 0x66, 0x53, + 0xf0, 0xf4, 0x8d, 0x12, 0x4d, 0xec, 0x86, 0x51, + 0x8d, 0xd8, 0x46, 0x3c, 0x47, 0x0e, 0x80, 0x37, + 0x90, 0x40, 0x0b, 0x09, 0xba, 0xbc, 0xe6, 0x35, + 0x6f, 0x32, 0x1f, 0xcd, 0x91, 0xa7, 0x16, 0x25, + 0xcc, 0xac, 0x76, 0xd0, 0xda, 0xcb, 0xb3, 0xb3, + 0x35, 0xf2, 0x18, 0xad, 0x5b, 0x72, 0xe7, 0x73, + 0x94, 0xab, 0xb0, 0x82, 0x29, 0xe2, 0xef, 0x90, + 0xb9, 0xa5, 0xcb, 0x32, 0xbb, 0x9c, 0xb6, 0x5b, + 0xdc, 0xba, 0x49, 0x01, 0xb7, 0xa7, 0x38, 0xd9, + 0x77, 0x41, 0xa7, 0x06, 0x84, 0x10, 0xa8, 0xa5, + 0x2c, 0x72, 0xdb, 0x3f, 0x61, 0x39, 0x8e, 0x62, + 0xf7, 0xb6, 0x02, 0xec, 0x11, 0xc7, 0x1f, 0x94, + 0xe3, 0xdd, 0x4b, 0xfc, 0xb6, 0xcf, 0xd8, 0x1b, + 0x98, 0xe5, 0xcf, 0x7b, 0xa0, 0xc5, 0x82, 0x46, + 0x49, 0xe5, 0x34, 0xf6, 0xc2, 0x08, 0xb4, 0x53, + 0xae, 0xc9, 0x32, 0xdb, 0x7b, 0x6b, 0x6b, 0xcb, + 0xc9, 0xde, 0xc8, 0x65, 0x8d, 0xae, 0x7b, 0x47, + 0x96, 0x5e, 0xe1, 0x5c, 0x2d, 0x0b, 0xc4, 0x19, + 0x46, 0x5d, 0x3d, 0x94, 0xd7, 0xdc, 0xfb, 0xa2, + 0x82, 0x39, 0x8b, 0x43, 0x8e, 0x9f, 0xd5, 0x83, + 0x4e, 0x52, 0x08, 0x54, 0x53, 0x4f, 0xcb, 0x32, + 0xab, 0x9c, 0xba, 0x7b, 0xbc, 0xb5, 0xf2, 0xe3, + 0xb6, 0xd3, 0x23, 0x25, 0xd6, 0x46, 0xee, 0x8e, + 0xd2, 0xd3, 0x61, 0x96, 0xda, 0x7b, 0x0b, 0xb3, + 0x1c, 0xc5, 0xee, 0x65, 0xbe, 0x21, 0x1c, 0x6c, + 0x8f, 0xca, 0x73, 0xbf, 0xf9, 0x41, 0x16, 0xb7, + 0xbe, 0xc6, 0xe5, 0x96, 0x91, 0xde, 0x39, 0x94, + 0x82, 0x52, 0x43, 0x5d, 0x5d, 0xee, 0xc2, 0xef, + 0xb9, 0xcb, 0x72, 0xf7, 0x59, 0xc7, 0x98, 0xd9, + 0x3e, 0x43, 0x6c, 0x24, 0x0c, 0x9e, 0x37, 0xe9, + 0x7b, 0x74, 0xd0, 0xd1, 0x49, 0x5d, 0x33, 0x28, + 0xea, 0x1b, 0x50, 0xf9, 0x26, 0xf6, 0x5c, 0x67, + 0x9a, 0x70, 0x6f, 0x8c, 0x5d, 0x53, 0xe5, 0x0d, + 0xea, 0xa0, 0xab, 0xa9, 0x2b, 0x7c, 0x86, 0xf6, + 0xe2, 0xcb, 0xdb, 0x63, 0x2c, 0xe6, 0x8b, 0x5c, + 0xe0, 0x09, 0x38, 0x8e, 0x1a, 0xf1, 0x28, 0xdd, + 0x1b, 0x9a, 0xb7, 0x15, 0xc3, 0x28, 0x9c, 0x41, + 0x95, 0xe5, 0xad, 0x71, 0xf1, 0x66, 0x7b, 0xa2, + 0x77, 0x67, 0x16, 0x2a, 0x77, 0xd0, 0x53, 0xff, + 0x00, 0x2e, 0xea, 0x91, 0xbb, 0xc8, 0x6f, 0x6d, + 0x2d, 0x3d, 0xae, 0x62, 0xce, 0x6f, 0x46, 0x80, + 0x49, 0x3e, 0x32, 0x45, 0x97, 0x9e, 0xbd, 0xf6, + 0x13, 0xa6, 0x93, 0xd2, 0x9f, 0xd4, 0x07, 0x1d, + 0x79, 0x2a, 0x6f, 0x39, 0xb8, 0xf6, 0x8c, 0x9e, + 0xf4, 0xeb, 0x6b, 0x2e, 0x39, 0xb6, 0xf6, 0x98, + 0x5a, 0x82, 0xb5, 0x63, 0x65, 0x3d, 0xf5, 0xc3, + 0x6d, 0xe1, 0xa0, 0x7b, 0x81, 0x75, 0x5c, 0x68, + 0x00, 0x0b, 0x37, 0xf6, 0x33, 0x58, 0x5c, 0x7b, + 0x3c, 0xf4, 0x2f, 0xa0, 0x75, 0x5a, 0x6a, 0x08, + 0x2a, 0x4f, 0x20, 0xff, 0x00, 0xb5, 0xb3, 0xbf, + 0xcc, 0xb5, 0x18, 0x99, 0xcd, 0xc2, 0x4f, 0xce, + 0x3f, 0xfc, 0x85, 0x9c, 0xf8, 0x0b, 0x9c, 0xbf, + 0x2f, 0xcc, 0x46, 0xb7, 0xc7, 0xcd, 0x3c, 0xf6, + 0x45, 0x35, 0xf7, 0xd0, 0x46, 0xe5, 0xf9, 0x65, + 0xd6, 0x60, 0xf7, 0x36, 0x00, 0x03, 0x59, 0xa6, + 0x49, 0x1c, 0x68, 0xd6, 0xae, 0xa9, 0xb6, 0x7a, + 0xe9, 0x90, 0xba, 0x68, 0x25, 0x8a, 0xe9, 0xb1, + 0xe9, 0x78, 0x89, 0xd5, 0x20, 0x0d, 0x6b, 0xa5, + 0xf5, 0xb5, 0xd9, 0x48, 0x8b, 0x0d, 0x1d, 0x75, + 0x2f, 0x8e, 0x46, 0xb2, 0x0e, 0x2d, 0x1f, 0x45, + 0x47, 0x64, 0xf9, 0x91, 0xcb, 0x6e, 0x4c, 0xb8, + 0x0c, 0x8c, 0x7b, 0x4b, 0x5d, 0x1d, 0x69, 0xaf, + 0x75, 0x07, 0x1f, 0x6b, 0xf2, 0xaa, 0x93, 0x6e, + 0xcf, 0xdd, 0xbe, 0xe7, 0xd9, 0x63, 0x7b, 0x0c, + 0xad, 0x89, 0xb2, 0xbc, 0x12, 0x40, 0x01, 0xda, + 0x87, 0x6d, 0x6a, 0xca, 0xe0, 0x6d, 0xe6, 0x6d, + 0x1b, 0x70, 0xd2, 0x37, 0x48, 0x65, 0x73, 0x77, + 0x03, 0x07, 0x8d, 0xe0, 0x52, 0xf9, 0x2d, 0xcf, + 0xb5, 0xe6, 0xb9, 0x95, 0xc1, 0x3e, 0x2b, 0xe3, + 0x38, 0x7c, 0xd0, 0x68, 0x10, 0x70, 0x1d, 0x99, + 0xcc, 0x4b, 0x49, 0x89, 0xd0, 0xca, 0x46, 0x92, + 0xd6, 0x3e, 0xa6, 0x9c, 0x0b, 0x92, 0xcb, 0x2b, + 0xba, 0xbc, 0x96, 0x48, 0x59, 0x48, 0xe4, 0x85, + 0xb8, 0x9e, 0xd7, 0xd7, 0x45, 0x35, 0x84, 0xc9, + 0xf9, 0xfe, 0xb2, 0xb6, 0x10, 0x13, 0x8b, 0x18, + 0x0e, 0xc3, 0xa7, 0x40, 0x3a, 0x6b, 0xdc, 0x25, + 0x59, 0x2d, 0x8c, 0x7f, 0x11, 0xe6, 0x1c, 0xdf, + 0xa9, 0x18, 0xa9, 0xf3, 0x90, 0x53, 0xc1, 0xad, + 0x3b, 0x34, 0xa7, 0x75, 0x4a, 0x1d, 0x9f, 0xbd, + 0x17, 0xa2, 0xcb, 0x1c, 0x7c, 0xf3, 0x98, 0x64, + 0x68, 0x2e, 0x3a, 0x40, 0x34, 0x5c, 0xac, 0xcb, + 0x33, 0x20, 0x5b, 0x5b, 0x59, 0x86, 0x91, 0x53, + 0x80, 0xf1, 0x29, 0x8d, 0xa1, 0xba, 0x92, 0xd3, + 0x3a, 0xb5, 0xb8, 0x6d, 0x41, 0x8a, 0x36, 0xb8, + 0xee, 0x68, 0x04, 0xe2, 0x1d, 0xd0, 0x50, 0x57, + 0xe4, 0x63, 0xa3, 0x73, 0x98, 0xe1, 0x47, 0x30, + 0x96, 0x91, 0xd9, 0x6e, 0xb5, 0xd5, 0x7b, 0x96, + 0xcf, 0x62, 0xc8, 0x5d, 0x39, 0x6d, 0x67, 0x6e, + 0x26, 0xb0, 0x1f, 0x18, 0x0a, 0x6e, 0xa9, 0xab, + 0x9c, 0xa5, 0x97, 0x59, 0xe5, 0xbd, 0xcb, 0x05, + 0x6d, 0x6e, 0x5a, 0x27, 0x7b, 0xb7, 0x06, 0x0a, + 0x17, 0x0e, 0xea, 0x87, 0xce, 0x6f, 0xbd, 0xbb, + 0x30, 0x92, 0x56, 0x9a, 0xc6, 0x0e, 0x08, 0xfb, + 0x0c, 0x1c, 0x68, 0x38, 0x97, 0x5e, 0x53, 0xfc, + 0xd2, 0xd3, 0xed, 0x99, 0xf5, 0x82, 0xe4, 0x5d, + 0x59, 0x4f, 0xf3, 0x4b, 0x4f, 0xb6, 0x67, 0xd6, + 0x08, 0x2c, 0xd9, 0xbf, 0xbe, 0x1f, 0x35, 0xab, + 0x8d, 0x76, 0xe6, 0xfe, 0xf8, 0x7c, 0xd6, 0xae, + 0x24, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x41, + 0xea, 0x3f, 0xda, 0x33, 0xb6, 0xa4, 0xd4, 0x64, + 0x7f, 0xb4, 0x67, 0x6d, 0x49, 0xa0, 0x2e, 0x1c, + 0xc3, 0xde, 0x6d, 0x7e, 0xd3, 0xe5, 0x0b, 0xb9, + 0x70, 0xe6, 0x1e, 0xf3, 0x6b, 0xf6, 0x9f, 0x28, + 0x40, 0xcb, 0xfd, 0xe6, 0xef, 0xcf, 0x3f, 0x58, + 0xae, 0xe5, 0xc3, 0x97, 0xfb, 0xcd, 0xdf, 0x9e, + 0x7e, 0xb1, 0x5d, 0xc8, 0x07, 0x51, 0x51, 0x47, + 0x59, 0x52, 0xa7, 0x51, 0x51, 0x47, 0x59, 0x40, + 0x44, 0x44, 0x1d, 0x19, 0x8f, 0xfa, 0x69, 0xfe, + 0x70, 0xfa, 0xca, 0xa4, 0x35, 0x2b, 0xbe, 0x1b, + 0x17, 0x64, 0xa4, 0x5f, 0xbb, 0x0d, 0xb1, 0x3e, + 0x3b, 0xb4, 0xe8, 0x35, 0xd1, 0xe4, 0xd5, 0x46, + 0xf3, 0x1b, 0x1d, 0xeb, 0x8f, 0xd3, 0xf4, 0x50, + 0x56, 0xd1, 0x59, 0x39, 0x8d, 0x8e, 0xf5, 0xc7, + 0xe9, 0xfa, 0x29, 0xcc, 0x6c, 0x77, 0xae, 0x3f, + 0x4f, 0xd1, 0x41, 0x5b, 0x45, 0x64, 0xe6, 0x36, + 0x3b, 0xd7, 0x1f, 0xa7, 0xe8, 0xa7, 0x31, 0xb1, + 0xde, 0xb8, 0xfd, 0x3f, 0x45, 0x05, 0x6d, 0x15, + 0x93, 0x98, 0xd8, 0xef, 0x5c, 0x7e, 0x9f, 0xa2, + 0x9c, 0xc6, 0xc7, 0x7a, 0xe3, 0xf4, 0xfd, 0x14, + 0x15, 0xb4, 0x56, 0x4e, 0x63, 0x63, 0xbd, 0x71, + 0xfa, 0x7e, 0x8a, 0x73, 0x1b, 0x1d, 0xeb, 0x8f, + 0xd3, 0xf4, 0x50, 0x56, 0xd2, 0xa5, 0x59, 0x39, + 0x8d, 0x8e, 0xf5, 0xc7, 0xe9, 0xfa, 0x29, 0xcc, + 0x6c, 0x77, 0xae, 0x3f, 0x4f, 0xd1, 0x41, 0x5b, + 0x1a, 0x35, 0x27, 0xc9, 0xa9, 0x58, 0xf9, 0x8d, + 0x8e, 0xf5, 0xe7, 0xe9, 0xfa, 0x29, 0xcc, 0x6c, + 0x77, 0xae, 0x3f, 0x4f, 0xd1, 0x41, 0x5c, 0x58, + 0xa0, 0x56, 0x4e, 0x63, 0x63, 0xbd, 0x71, 0xfa, + 0x7e, 0x8a, 0x73, 0x1b, 0x1d, 0xeb, 0x8f, 0xd3, + 0xf4, 0x50, 0x57, 0x37, 0x6a, 0x9f, 0xfc, 0x2b, + 0x1f, 0x31, 0xb1, 0xde, 0xb8, 0xfd, 0x3f, 0x45, + 0x67, 0x98, 0xd8, 0xef, 0x5c, 0x7e, 0x9f, 0xa2, + 0x82, 0xb6, 0x8a, 0xc7, 0xcc, 0x6c, 0x77, 0xae, + 0x3f, 0x4f, 0xd1, 0x4e, 0x63, 0x63, 0xbd, 0x71, + 0xfa, 0x7e, 0x8a, 0x0a, 0xe2, 0xeb, 0xcb, 0xb3, + 0x29, 0x32, 0xe7, 0xca, 0xf8, 0xd8, 0xd7, 0x99, + 0x98, 0x58, 0x6b, 0xa1, 0x4c, 0xf3, 0x1b, 0x1d, + 0xeb, 0x8f, 0xd3, 0xf4, 0x53, 0x98, 0xd8, 0xef, + 0x5c, 0x7e, 0x9f, 0xa2, 0x82, 0xb4, 0x35, 0x68, + 0xd5, 0xb8, 0xb2, 0xac, 0x9c, 0xce, 0xc7, 0x7a, + 0xf7, 0x70, 0xbf, 0xd1, 0x4e, 0x63, 0x63, 0xbd, + 0x71, 0xfa, 0x7e, 0x8a, 0x0a, 0xd8, 0xd1, 0xa9, + 0x62, 0x83, 0x79, 0x59, 0x79, 0x8d, 0x8e, 0xf5, + 0xc7, 0xe9, 0xfa, 0x29, 0xcc, 0x6c, 0x77, 0xae, + 0x3f, 0x4f, 0xd1, 0x41, 0x5b, 0x45, 0x63, 0xe6, + 0x36, 0x3b, 0xd7, 0x9f, 0xa7, 0xe8, 0xac, 0xf3, + 0x1b, 0x1d, 0xeb, 0x8f, 0xd3, 0xf4, 0x50, 0x56, + 0xf7, 0xfb, 0x3a, 0xd1, 0x59, 0x39, 0x8d, 0x8e, + 0xf5, 0xc7, 0xe9, 0xfa, 0x29, 0xcc, 0x6c, 0x77, + 0xae, 0x3f, 0x4f, 0xd1, 0x41, 0x0b, 0x16, 0x63, + 0x24, 0x39, 0x74, 0xd6, 0x0d, 0x63, 0x4c, 0x73, + 0xb8, 0x39, 0xce, 0xd4, 0x41, 0xd1, 0xc4, 0xb9, + 0x7c, 0x0a, 0xc9, 0xcc, 0x6c, 0x77, 0xaf, 0x77, + 0x0b, 0xfd, 0x14, 0xe6, 0x36, 0x3b, 0xd7, 0x9e, + 0x17, 0xfa, 0x28, 0x2b, 0x68, 0xac, 0x9c, 0xc6, + 0xc7, 0x7a, 0xe3, 0xf4, 0xfd, 0x14, 0xe6, 0x36, + 0x3b, 0xd7, 0x1f, 0xa7, 0xe8, 0xa0, 0xad, 0xfe, + 0x5a, 0x11, 0x59, 0x39, 0x8d, 0x8e, 0xf5, 0xc7, + 0xe9, 0xfa, 0x29, 0xcc, 0x6c, 0x77, 0xae, 0x3f, + 0x4f, 0xd1, 0x41, 0x5b, 0x45, 0x64, 0xe6, 0x36, + 0x3b, 0xd7, 0x1f, 0xa7, 0xe8, 0xa7, 0x31, 0xb1, + 0xde, 0xb8, 0xfd, 0x3f, 0x45, 0x05, 0x6d, 0x15, + 0x93, 0x98, 0xd8, 0xef, 0x5c, 0x7e, 0x9f, 0xa2, + 0x9c, 0xc6, 0xc7, 0x7a, 0xe3, 0xf4, 0xfd, 0x14, + 0x15, 0xb4, 0x56, 0x4e, 0x63, 0x63, 0xbd, 0x71, + 0xfa, 0x7e, 0x8a, 0x73, 0x1b, 0x1d, 0xeb, 0x8f, + 0xd3, 0xf4, 0x50, 0x56, 0xd1, 0x59, 0x39, 0x8d, + 0x8e, 0xf5, 0xc7, 0xe9, 0xfa, 0x29, 0xcc, 0x6c, + 0x77, 0xae, 0x3f, 0x4f, 0xd1, 0x41, 0x5b, 0x58, + 0x3b, 0xaa, 0xcb, 0xcc, 0x6c, 0x77, 0xae, 0x3f, + 0x4f, 0xd1, 0x58, 0x30, 0x6c, 0x77, 0xae, 0x3f, + 0x4f, 0xd1, 0x41, 0xdd, 0x75, 0xfc, 0xae, 0xc7, + 0xcc, 0x6f, 0xd5, 0x0b, 0x85, 0x49, 0xe6, 0x22, + 0x21, 0x67, 0x6c, 0x21, 0xd3, 0x10, 0x1f, 0xab, + 0x3f, 0xd5, 0xa6, 0x85, 0x1a, 0x80, 0x88, 0x88, + 0x0b, 0x1b, 0x85, 0x65, 0x63, 0x70, 0xa0, 0xf5, + 0xb6, 0x3e, 0x4d, 0x9f, 0x69, 0xff, 0x00, 0xdd, + 0x55, 0xa5, 0x65, 0xdb, 0x1f, 0x26, 0xcf, 0xb4, + 0xff, 0x00, 0xee, 0xaa, 0xd2, 0x0c, 0x2e, 0xdc, + 0x98, 0x0e, 0xb5, 0xb4, 0xfb, 0x40, 0xb8, 0xd7, + 0x46, 0x5f, 0x3b, 0x2d, 0xaf, 0xa0, 0x9e, 0x4a, + 0xe0, 0x8d, 0xe1, 0xce, 0xa0, 0xd2, 0x83, 0x7e, + 0x7f, 0xfc, 0xda, 0xeb, 0xcf, 0xf9, 0x02, 0xed, + 0xda, 0x5f, 0x1e, 0xdf, 0x2d, 0x78, 0xd2, 0xd7, + 0x43, 0xa0, 0xf7, 0x1a, 0xa3, 0x33, 0x3b, 0x98, + 0xae, 0xef, 0xe7, 0xb8, 0x8a, 0xbc, 0xdc, 0xae, + 0xab, 0x6b, 0xa0, 0xd2, 0x8b, 0xba, 0x1b, 0xfc, + 0xbe, 0xef, 0x2f, 0x8e, 0xcb, 0x31, 0x73, 0xe2, + 0x7d, 0xb9, 0xfd, 0x44, 0xf1, 0x8c, 0x5e, 0x2e, + 0xf1, 0x41, 0xb2, 0xc7, 0xc5, 0xd9, 0x7b, 0xf7, + 0x3b, 0x40, 0x7b, 0x80, 0x07, 0xb2, 0x70, 0x9f, + 0x95, 0x69, 0xbd, 0xad, 0xae, 0x49, 0x69, 0x69, + 0xa9, 0xf7, 0x2e, 0x37, 0x12, 0x8d, 0xe1, 0xa9, + 0x9d, 0xe5, 0x9b, 0xcb, 0xfb, 0x03, 0x69, 0x16, + 0x55, 0x65, 0x8c, 0x5a, 0xe3, 0x0e, 0x9e, 0x67, + 0x0f, 0x19, 0xdb, 0x87, 0x47, 0x69, 0x73, 0x67, + 0x37, 0x91, 0xdd, 0xdf, 0x39, 0xf0, 0x9a, 0xc0, + 0xc0, 0xd8, 0xe2, 0xd1, 0x4f, 0x15, 0x82, 0x9e, + 0x1a, 0xa0, 0xe2, 0x04, 0xd4, 0x69, 0x53, 0x3b, + 0x59, 0xfc, 0xce, 0x23, 0xbd, 0x0b, 0x3c, 0x2e, + 0x50, 0xc3, 0x5a, 0x91, 0xcf, 0x6f, 0xe0, 0xbf, + 0xbc, 0x64, 0xf0, 0x07, 0x60, 0x11, 0x86, 0x78, + 0xe3, 0x09, 0xa8, 0x2e, 0xdc, 0x41, 0xd7, 0x75, + 0xa7, 0x64, 0xed, 0x0b, 0x74, 0x88, 0xe5, 0x21, + 0xdd, 0xbc, 0x4e, 0x58, 0xd9, 0x80, 0x43, 0xaf, + 0xa4, 0x3e, 0x4b, 0x6d, 0xcd, 0x4f, 0x7f, 0xe4, + 0x5a, 0x32, 0xdc, 0xc2, 0xd0, 0x59, 0x4b, 0x96, + 0xdf, 0x87, 0x7b, 0x3c, 0x8e, 0xc5, 0x1b, 0xd9, + 0xa4, 0xb5, 0xdb, 0xab, 0x64, 0x97, 0xd9, 0x75, + 0x8d, 0x84, 0xb6, 0x99, 0x73, 0xe4, 0x96, 0x4b, + 0x9d, 0x12, 0xcf, 0x20, 0xc2, 0x03, 0x77, 0x82, + 0x0d, 0x97, 0x54, 0x7e, 0xc9, 0xda, 0xb9, 0xba, + 0x99, 0x29, 0x07, 0xb6, 0x5c, 0xe2, 0x9b, 0x2e, + 0x70, 0xba, 0xfd, 0xe7, 0xc9, 0x6c, 0x07, 0x4f, + 0x0a, 0xe6, 0xcb, 0x73, 0x0b, 0x51, 0x67, 0x2e, + 0x5b, 0x7e, 0x1d, 0xec, 0xd2, 0x1c, 0x51, 0xc8, + 0xd1, 0x57, 0x31, 0xdd, 0xa5, 0xb6, 0x4b, 0xdc, + 0xba, 0xc6, 0xc6, 0x5b, 0x4c, 0xb5, 0xd2, 0x4b, + 0x2d, 0xce, 0x89, 0x67, 0x78, 0xa0, 0x0d, 0xde, + 0xee, 0xa0, 0x87, 0xae, 0xbd, 0xdf, 0xe9, 0x2a, + 0xc3, 0x63, 0x77, 0x71, 0x69, 0xb2, 0xf2, 0x4f, + 0x6e, 0xec, 0x12, 0x09, 0xc8, 0x0e, 0xa5, 0x75, + 0xd3, 0x7d, 0x57, 0xbf, 0xf9, 0xa7, 0x69, 0x4c, + 0xe5, 0xf9, 0x86, 0x54, 0xdc, 0xa5, 0xd9, 0x7d, + 0xf0, 0x94, 0xe2, 0x90, 0xbc, 0x88, 0xc7, 0x68, + 0x6b, 0x28, 0x39, 0x67, 0xcf, 0xb3, 0x69, 0xe1, + 0x74, 0x32, 0xce, 0x1c, 0xc7, 0x82, 0x1c, 0x30, + 0x81, 0xf2, 0x2e, 0xc8, 0x3f, 0xd2, 0x93, 0xef, + 0x8b, 0x8d, 0x7c, 0x95, 0xa9, 0xe7, 0x65, 0xb0, + 0x1c, 0x02, 0xeb, 0x10, 0x07, 0x0d, 0x69, 0x4a, + 0xd3, 0x45, 0x74, 0xac, 0xe5, 0xb9, 0x86, 0x5c, + 0xdc, 0xb6, 0x6c, 0xba, 0xfb, 0x9c, 0x0c, 0x7c, + 0x98, 0xda, 0xe8, 0xc5, 0x4e, 0xe6, 0xbd, 0xe4, + 0x1e, 0xdb, 0xfe, 0x92, 0x7f, 0xfe, 0x40, 0xf0, + 0x35, 0x67, 0x26, 0xfe, 0x4b, 0x9a, 0xf9, 0xa3, + 0xc0, 0xb9, 0xdf, 0x7f, 0x66, 0x32, 0x69, 0x72, + 0xe8, 0x8b, 0xdc, 0xf7, 0x4f, 0xce, 0x45, 0x56, + 0xe8, 0xc1, 0x51, 0x4a, 0xe9, 0xec, 0x2c, 0x65, + 0xd9, 0x85, 0xbd, 0xb6, 0x5b, 0x7b, 0x6f, 0x28, + 0x76, 0x3b, 0x96, 0x8c, 0x18, 0x5b, 0x51, 0xab, + 0x77, 0x4a, 0x09, 0x29, 0x64, 0xcb, 0xe3, 0xd9, + 0xfc, 0xbc, 0xde, 0x44, 0xf9, 0xa3, 0x24, 0xe1, + 0x0c, 0x76, 0x1a, 0x3a, 0xa7, 0x5a, 0xe4, 0x9b, + 0x31, 0xb3, 0xea, 0x89, 0xed, 0x2c, 0xed, 0x25, + 0x8e, 0x27, 0x9a, 0x99, 0x1d, 0xe3, 0x34, 0x38, + 0x1d, 0xfa, 0x2f, 0x16, 0x79, 0x85, 0x8c, 0xd9, + 0x77, 0x56, 0xe6, 0x45, 0xf1, 0x88, 0xdd, 0x8a, + 0x19, 0x98, 0x2a, 0x41, 0x3a, 0x69, 0x45, 0xe6, + 0xfa, 0xfa, 0xca, 0x3c, 0xbd, 0xb9, 0x5e, 0x5f, + 0x89, 0xd1, 0x17, 0x73, 0x92, 0xcb, 0x20, 0xa1, + 0x73, 0xb5, 0x8a, 0x04, 0x1b, 0xf6, 0x86, 0xa6, + 0xcb, 0x2b, 0xfb, 0x0f, 0x91, 0xa9, 0x0f, 0xfa, + 0x4e, 0x7f, 0xfc, 0x8f, 0x94, 0x2e, 0x6c, 0xdb, + 0x30, 0xb7, 0xbc, 0xb6, 0xb2, 0x8e, 0x1c, 0x55, + 0xb7, 0x88, 0x31, 0xe5, 0xcd, 0xa0, 0xa8, 0x0d, + 0xd5, 0xa7, 0xb0, 0x8c, 0xcc, 0x2d, 0xd9, 0x91, + 0x49, 0x60, 0x6a, 0x27, 0x7c, 0xb8, 0x85, 0x06, + 0x8a, 0x68, 0xdd, 0x41, 0xd3, 0x91, 0xff, 0x00, + 0x2b, 0xcd, 0x46, 0xe0, 0x67, 0xc8, 0x57, 0x4b, + 0xa4, 0xb0, 0x8f, 0x66, 0xec, 0x7d, 0xb2, 0x27, + 0x4d, 0x1b, 0x89, 0xa3, 0x58, 0x70, 0x9c, 0x55, + 0x3a, 0x54, 0x66, 0x59, 0x98, 0x5b, 0xdb, 0x59, + 0x5e, 0xc1, 0x2e, 0x2c, 0x77, 0x4c, 0x0d, 0x8f, + 0x08, 0xae, 0x9a, 0x1d, 0x6b, 0x65, 0x8d, 0xfd, + 0x94, 0x99, 0x69, 0xcb, 0x33, 0x12, 0xf6, 0xc6, + 0xd7, 0x07, 0xc3, 0x33, 0x05, 0x4b, 0x49, 0x3b, + 0xa0, 0xa0, 0xda, 0xfc, 0xca, 0xcc, 0x65, 0x57, + 0x16, 0xb6, 0x56, 0x93, 0x32, 0x39, 0x48, 0x2e, + 0x91, 0xc7, 0x13, 0x43, 0x81, 0x1a, 0x0b, 0x82, + 0xcd, 0xee, 0x8d, 0x97, 0xb1, 0xec, 0x48, 0x45, + 0x47, 0x60, 0xb9, 0x69, 0xbc, 0xbf, 0xb2, 0x8b, + 0x2f, 0x19, 0x6e, 0x5e, 0x5e, 0xf8, 0xdc, 0xfc, + 0x73, 0x4c, 0xf1, 0x84, 0xb8, 0x83, 0xa0, 0x01, + 0xdc, 0x5b, 0x2d, 0xef, 0xf2, 0xa9, 0xf2, 0x98, + 0xec, 0x2f, 0xb9, 0xc8, 0xdd, 0x0b, 0xf1, 0x30, + 0xc6, 0x2a, 0x34, 0x9a, 0x8f, 0x0a, 0x08, 0x51, + 0xa9, 0x58, 0x27, 0x91, 0xd1, 0x6c, 0xce, 0x5f, + 0x2b, 0x7c, 0xa8, 0xe6, 0xc6, 0x3b, 0x60, 0xbd, + 0x57, 0xc7, 0x63, 0x52, 0x93, 0xb8, 0xcc, 0x6d, + 0x65, 0xc8, 0xed, 0xf2, 0xf6, 0x87, 0x73, 0xd1, + 0x3f, 0x13, 0xbc, 0x5d, 0x14, 0xf1, 0xb5, 0x1a, + 0xff, 0x00, 0x59, 0x04, 0xf1, 0x85, 0x91, 0xe6, + 0xf2, 0xe6, 0xf4, 0xfd, 0x47, 0xb2, 0x73, 0xad, + 0x3f, 0xd6, 0x22, 0x9e, 0x00, 0xa3, 0x18, 0xe7, + 0xbf, 0x64, 0xe7, 0x91, 0xda, 0x5c, 0xeb, 0x82, + 0xe7, 0x1e, 0xc9, 0x70, 0xaa, 0xf2, 0xfc, 0xf6, + 0x27, 0x64, 0x22, 0xc3, 0xc6, 0xf6, 0x9c, 0x21, + 0x8e, 0x34, 0xa3, 0x70, 0xe2, 0xdc, 0x75, 0x77, + 0x82, 0xd1, 0x06, 0x61, 0x68, 0xdc, 0x90, 0xe5, + 0xf2, 0x63, 0x12, 0x19, 0x83, 0xdc, 0x5a, 0x2a, + 0x30, 0xe8, 0x24, 0xd6, 0xa3, 0x4d, 0x10, 0x49, + 0x0b, 0x38, 0x1b, 0xb3, 0xf6, 0xf6, 0x93, 0x5c, + 0xb2, 0xd1, 0xd3, 0x93, 0x33, 0x8c, 0x9f, 0x9c, + 0x09, 0x24, 0x01, 0xc2, 0x11, 0xd6, 0x90, 0x9d, + 0x9d, 0xb8, 0xb4, 0x86, 0xe1, 0x97, 0x66, 0xdc, + 0xf3, 0xa0, 0xc7, 0xb8, 0x2a, 0x0d, 0x0f, 0x72, + 0xaa, 0x2b, 0x3d, 0xcc, 0x61, 0xbf, 0xb9, 0x8c, + 0xdb, 0x02, 0x20, 0x86, 0x30, 0xc6, 0x02, 0x28, + 0x7b, 0x3a, 0x2a, 0xb3, 0x91, 0xe6, 0x30, 0x58, + 0xcb, 0x30, 0xb9, 0xc4, 0x60, 0x9e, 0x32, 0xc7, + 0x86, 0x8a, 0x9a, 0xee, 0x6e, 0xf6, 0xd0, 0x75, + 0xde, 0x1c, 0x7b, 0x29, 0x64, 0xe6, 0xe9, 0xe6, + 0xe5, 0xa3, 0xbe, 0x9a, 0x89, 0xb0, 0xb0, 0x9a, + 0xfe, 0xe4, 0x5b, 0x44, 0x43, 0x5c, 0xe0, 0x5d, + 0x57, 0x68, 0x14, 0x0b, 0xbb, 0x2d, 0xcc, 0xad, + 0x23, 0xb7, 0x9b, 0x2f, 0xbd, 0x6b, 0x9f, 0x67, + 0x2b, 0x8b, 0xa3, 0x73, 0x47, 0x8c, 0xce, 0xcf, + 0x02, 0xdd, 0x15, 0xee, 0x4f, 0x95, 0xb2, 0x49, + 0x2c, 0x1d, 0x24, 0xf7, 0x52, 0xb7, 0x03, 0x5e, + 0xf1, 0x40, 0xd0, 0x50, 0x6a, 0xcb, 0x98, 0x6c, + 0x6c, 0xb3, 0x1b, 0xb7, 0x10, 0x5e, 0x3f, 0xed, + 0x62, 0x70, 0xd4, 0x5c, 0xf3, 0x47, 0x96, 0xad, + 0xfb, 0x24, 0x69, 0x73, 0x74, 0x77, 0xa1, 0xd4, + 0x7b, 0x6b, 0x8a, 0xee, 0xee, 0x27, 0x65, 0x96, + 0xd6, 0x71, 0x3a, 0xae, 0x69, 0x74, 0xb7, 0x35, + 0x04, 0x56, 0x47, 0x68, 0xdd, 0xec, 0x2f, 0x59, + 0x0e, 0x63, 0x6f, 0x61, 0x2c, 0xee, 0x9e, 0xb4, + 0x96, 0x2c, 0x2d, 0xc2, 0x2a, 0x6b, 0x5d, 0xd4, + 0x1b, 0x3e, 0x25, 0xbc, 0x63, 0x29, 0x0c, 0x30, + 0xdb, 0xb8, 0x8f, 0x2d, 0x8d, 0xf1, 0x80, 0x5d, + 0x1b, 0x2a, 0xf7, 0x3e, 0xf6, 0xea, 0x47, 0x92, + 0xe7, 0x98, 0x8b, 0xb1, 0x9d, 0x64, 0xe2, 0xad, + 0x54, 0x08, 0x14, 0xa6, 0xf6, 0xad, 0x3d, 0x8a, + 0x69, 0xef, 0xa9, 0x3c, 0x87, 0x31, 0xb6, 0xb0, + 0x9e, 0x59, 0x2e, 0x2b, 0xfa, 0xd8, 0xf0, 0x37, + 0x08, 0xae, 0x92, 0x77, 0x50, 0x6b, 0x66, 0x7f, + 0x9c, 0x1a, 0x0f, 0x6a, 0x75, 0x0d, 0x06, 0xa6, + 0xfa, 0x2b, 0xb7, 0x6b, 0x89, 0xeb, 0x08, 0xbe, + 0xc8, 0x1e, 0xf9, 0x50, 0x4c, 0x20, 0x61, 0x27, + 0x50, 0xa1, 0xd0, 0x2b, 0xa2, 0x95, 0xdf, 0x52, + 0x79, 0xf6, 0x61, 0x6f, 0x98, 0x5d, 0x47, 0x2d, + 0xbe, 0x2c, 0x2d, 0x8c, 0x30, 0xe2, 0x14, 0xd2, + 0x0e, 0xe2, 0x09, 0x1b, 0x1b, 0xd9, 0xdb, 0xb2, + 0xb7, 0x24, 0x1f, 0x1a, 0x13, 0xcd, 0x46, 0xe3, + 0xac, 0x07, 0x96, 0xb7, 0xbd, 0x89, 0x56, 0xf4, + 0x77, 0x14, 0x9c, 0x19, 0x8d, 0xb4, 0x79, 0x1d, + 0xcd, 0x83, 0x83, 0xb9, 0xf9, 0x5e, 0x1c, 0xdd, + 0x1e, 0x29, 0x00, 0xb4, 0xe9, 0x75, 0x7b, 0x0a, + 0x35, 0x01, 0x75, 0x65, 0x3f, 0xcd, 0x2d, 0x3e, + 0xd9, 0x9f, 0x58, 0x2e, 0x55, 0xd5, 0x94, 0xff, + 0x00, 0x34, 0xb4, 0xfb, 0x66, 0x7d, 0x60, 0x82, + 0xcf, 0x9b, 0xfb, 0xe1, 0xf3, 0x5a, 0xb8, 0x97, + 0x6e, 0x6f, 0xef, 0x87, 0xcd, 0x6a, 0xe2, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x1e, 0xa3, + 0xfd, 0xa3, 0x3b, 0x6a, 0x4d, 0x46, 0x47, 0xfb, + 0x46, 0x76, 0xd4, 0x9a, 0x02, 0xe1, 0xcc, 0x3d, + 0xe6, 0xd7, 0xed, 0x3e, 0x50, 0xbb, 0x97, 0x0e, + 0x61, 0xef, 0x36, 0xbf, 0x69, 0xf2, 0x84, 0x0c, + 0xbf, 0xde, 0x6e, 0xfc, 0xf3, 0xf5, 0x8a, 0xee, + 0x5c, 0x39, 0x7f, 0xbc, 0xdd, 0xf9, 0xe7, 0xeb, + 0x15, 0xdc, 0x80, 0x75, 0x15, 0x14, 0x75, 0x95, + 0x2a, 0x75, 0x15, 0x14, 0x75, 0x94, 0x04, 0x44, + 0x41, 0xd1, 0x98, 0xff, 0x00, 0xa6, 0x9f, 0xe7, + 0x0f, 0xac, 0xaa, 0x43, 0x52, 0xb6, 0xe6, 0x3f, + 0xe9, 0xa7, 0xf9, 0xc3, 0xeb, 0x2a, 0x90, 0xd4, + 0x83, 0x28, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x0b, 0x2d, 0x6b, 0x9c, 0xe0, + 0xc6, 0x82, 0x5c, 0xe3, 0x40, 0xd1, 0xac, 0x95, + 0xe5, 0x4e, 0x6c, 0xeb, 0x1b, 0x0d, 0xbd, 0xee, + 0x66, 0xe0, 0x1c, 0xeb, 0x76, 0x52, 0x3a, 0xee, + 0x38, 0x8a, 0xd5, 0x04, 0x7b, 0xf2, 0x8c, 0xcd, + 0x91, 0xf3, 0x8f, 0xb6, 0x7b, 0x58, 0x34, 0x92, + 0x05, 0x74, 0x76, 0x77, 0x57, 0x3c, 0x16, 0xf3, + 0x5c, 0x38, 0xb6, 0x08, 0xdd, 0x23, 0x86, 0xb6, + 0xb0, 0x12, 0x46, 0xe6, 0xe2, 0x91, 0xcb, 0xf3, + 0xcb, 0xd8, 0xef, 0xa3, 0x96, 0xe6, 0x77, 0x3a, + 0x29, 0x1d, 0x49, 0x9a, 0xfa, 0x96, 0x86, 0x9d, + 0x64, 0x0e, 0xc2, 0x93, 0xc9, 0xdd, 0x6a, 0x73, + 0xdb, 0xd9, 0x2c, 0xdc, 0x1d, 0x0b, 0xa2, 0x2f, + 0x6b, 0x80, 0x23, 0x49, 0x20, 0x9a, 0x03, 0x4d, + 0x45, 0x04, 0x0b, 0xb2, 0xcc, 0xc1, 0xa2, 0xae, + 0xb6, 0x94, 0x01, 0xfd, 0x47, 0x71, 0x2e, 0x5a, + 0x8d, 0x5b, 0xda, 0xd4, 0xa5, 0xa6, 0x7d, 0x9b, + 0x36, 0xe6, 0x32, 0x67, 0x74, 0x8d, 0x2e, 0x0d, + 0x74, 0x6f, 0xa1, 0x69, 0xa9, 0xd2, 0xbb, 0x73, + 0x4c, 0xbe, 0x19, 0xb6, 0x92, 0x18, 0x1a, 0x28, + 0xc9, 0xf0, 0xbd, 0xed, 0x1f, 0xd5, 0xf1, 0x8f, + 0x0a, 0x08, 0x98, 0x32, 0xbc, 0xc6, 0xe6, 0x3e, + 0x72, 0x0b, 0x79, 0x1e, 0xcd, 0xc7, 0x01, 0x40, + 0x7b, 0x5a, 0x74, 0xae, 0x79, 0x62, 0x92, 0x17, + 0x98, 0xe5, 0x69, 0x8d, 0xe3, 0x5b, 0x5c, 0x28, + 0x7b, 0xea, 0x5f, 0x3b, 0xcd, 0xef, 0x46, 0x63, + 0x2c, 0x36, 0xd2, 0xba, 0x08, 0x6d, 0xcf, 0x37, + 0x1b, 0x23, 0x34, 0x15, 0x1b, 0xab, 0xce, 0x71, + 0x7f, 0x6b, 0x7d, 0x63, 0x69, 0x2e, 0x30, 0x6f, + 0x9a, 0x0b, 0x67, 0x68, 0x06, 0xb4, 0xa1, 0xa5, + 0x4d, 0x29, 0xad, 0x04, 0x3a, 0xdd, 0x1d, 0x9d, + 0xdc, 0xb1, 0x99, 0x63, 0x85, 0xef, 0x8d, 0xba, + 0xdc, 0xd6, 0x92, 0x05, 0x3b, 0x20, 0x2d, 0x4a, + 0xe3, 0x95, 0x3a, 0x3b, 0x2b, 0x5b, 0x0c, 0xbd, + 0xfe, 0x55, 0xeb, 0x5e, 0xf7, 0xd7, 0xb2, 0x2a, + 0x38, 0x50, 0x53, 0x41, 0xae, 0xad, 0xdd, 0x4b, + 0x2b, 0x65, 0xcc, 0x0e, 0x82, 0xea, 0x5b, 0x7a, + 0x54, 0xb1, 0xe5, 0x81, 0xa3, 0x5e, 0x82, 0x40, + 0x52, 0x6d, 0xd9, 0xab, 0xba, 0x35, 0xb2, 0xcf, + 0x0c, 0x73, 0xbc, 0x55, 0xb0, 0x39, 0xde, 0x31, + 0x41, 0x10, 0x8b, 0xa1, 0xb6, 0x17, 0x8f, 0xbc, + 0xf6, 0x11, 0x1d, 0x2e, 0x31, 0x61, 0x2c, 0x27, + 0x40, 0xdd, 0xe0, 0x5d, 0xd2, 0x6c, 0xe5, 0xdb, + 0x58, 0xe3, 0x0c, 0xd0, 0xcf, 0x2c, 0x42, 0xaf, + 0x85, 0x8e, 0xab, 0x82, 0x08, 0x94, 0x5d, 0x59, + 0x7e, 0x5f, 0x73, 0x98, 0x4a, 0x59, 0x05, 0x00, + 0x60, 0xab, 0xe4, 0x79, 0xa0, 0x68, 0xec, 0xad, + 0xd7, 0x79, 0x25, 0xc5, 0xb5, 0xb9, 0xba, 0x8e, + 0x58, 0xee, 0x62, 0x69, 0xa3, 0xdd, 0x0b, 0xb1, + 0x16, 0xa0, 0xe2, 0xf6, 0x79, 0xc4, 0x22, 0x7e, + 0x6d, 0xdc, 0xd1, 0x34, 0xe7, 0x28, 0x70, 0xd7, + 0x7b, 0x16, 0xa5, 0xe1, 0x4d, 0x3b, 0xfd, 0x25, + 0x17, 0xfe, 0x43, 0xbc, 0x2e, 0x5c, 0xb6, 0x79, + 0x35, 0xcd, 0xcd, 0xb8, 0xba, 0x7c, 0x91, 0xda, + 0xc0, 0x4d, 0x1a, 0xf9, 0x5d, 0x40, 0xed, 0xcd, + 0x15, 0x41, 0x1e, 0x8b, 0xae, 0xff, 0x00, 0x2c, + 0xb9, 0xb1, 0x95, 0xb1, 0x4b, 0x42, 0xd9, 0x68, + 0x63, 0x7b, 0x0d, 0x58, 0xe0, 0x74, 0x2e, 0xc1, + 0xb3, 0x19, 0x80, 0x91, 0xcc, 0x91, 0xf1, 0xc6, + 0xc6, 0xb4, 0x1c, 0x66, 0xb4, 0x24, 0xfe, 0x68, + 0x41, 0x11, 0xbb, 0x4d, 0xd4, 0x52, 0x36, 0x99, + 0x1d, 0xc5, 0xc4, 0x1e, 0xd2, 0xf9, 0x63, 0xb7, + 0x82, 0xa5, 0xa1, 0xf2, 0x9c, 0x35, 0xa1, 0xa5, + 0x45, 0x57, 0x9b, 0xcc, 0x96, 0xe6, 0xd1, 0xf0, + 0x87, 0xb9, 0x8f, 0x8a, 0xe1, 0xd8, 0x63, 0x98, + 0x1a, 0xb6, 0xba, 0xfb, 0x88, 0x38, 0x4b, 0x5c, + 0x00, 0x71, 0x04, 0x34, 0xea, 0x3b, 0x85, 0x79, + 0xa8, 0xa5, 0x77, 0x15, 0xa6, 0xf7, 0x29, 0x9d, + 0xd9, 0x25, 0xa5, 0xb3, 0x65, 0x89, 0xae, 0x85, + 0xc5, 0xce, 0x71, 0x7f, 0x8a, 0x45, 0x1d, 0xe4, + 0xba, 0x8a, 0x1a, 0xcb, 0x24, 0xb9, 0xbb, 0x88, + 0xdc, 0x3a, 0x46, 0x5b, 0xc1, 0x5c, 0x22, 0x59, + 0x4d, 0x31, 0x1e, 0xc2, 0x0e, 0x04, 0x5d, 0x79, + 0x86, 0x57, 0x71, 0x60, 0xe6, 0x19, 0x48, 0x7c, + 0x52, 0x02, 0x63, 0x9a, 0x33, 0xe2, 0x9a, 0x6e, + 0x2e, 0xb6, 0x6c, 0xce, 0x60, 0xe9, 0x03, 0x5e, + 0xf8, 0xd8, 0xc7, 0x30, 0x48, 0x65, 0x24, 0xd0, + 0x07, 0x6a, 0x6e, 0x9d, 0xd4, 0x11, 0x28, 0xb3, + 0x23, 0x30, 0x48, 0xe6, 0x6b, 0xc0, 0x4b, 0x49, + 0x1a, 0x8d, 0x37, 0x56, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x60, 0xee, 0xac, + 0xac, 0x1d, 0xd4, 0x17, 0x2b, 0xaf, 0xe5, 0x76, + 0x3e, 0x63, 0x7e, 0xa8, 0x5c, 0x2b, 0xba, 0xeb, + 0xf9, 0x5d, 0x8f, 0x98, 0xdf, 0xaa, 0x17, 0x0a, + 0x0c, 0xa2, 0x22, 0x02, 0xc6, 0xe1, 0x59, 0x58, + 0xdc, 0x28, 0x3d, 0x6d, 0x8f, 0x93, 0x67, 0xda, + 0x7f, 0xf7, 0x55, 0x69, 0x59, 0x76, 0xc7, 0xc9, + 0xb3, 0xed, 0x3f, 0xfb, 0xaa, 0xb4, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0xa4, + 0x32, 0x4c, 0xb6, 0x3c, 0xca, 0xe9, 0xd0, 0xc8, + 0xe2, 0xc0, 0x19, 0x88, 0x16, 0xeb, 0xaa, 0x08, + 0xf4, 0x52, 0x99, 0x3e, 0x55, 0x69, 0x7b, 0x0d, + 0xcc, 0xd7, 0x32, 0xba, 0x26, 0x5b, 0x50, 0xd5, + 0xa0, 0x1d, 0x06, 0xb5, 0x2b, 0x67, 0xb1, 0x6c, + 0xcd, 0x34, 0x5f, 0x4b, 0xc8, 0x3e, 0x8a, 0x08, + 0x74, 0x52, 0xd9, 0x6e, 0x53, 0x61, 0x71, 0x69, + 0x71, 0x77, 0x73, 0x33, 0xa3, 0x8a, 0xdd, 0xf4, + 0xc4, 0xd6, 0x83, 0x56, 0xee, 0x1d, 0x44, 0xee, + 0xac, 0xba, 0xcf, 0x66, 0xb0, 0x78, 0xb7, 0xd2, + 0x92, 0x06, 0x86, 0xe0, 0xd6, 0x69, 0xa3, 0xf3, + 0x50, 0x44, 0x50, 0xa2, 0x97, 0xcb, 0xf2, 0x9c, + 0xbe, 0x6c, 0xb1, 0xd7, 0xf7, 0x73, 0x3e, 0x16, + 0xb6, 0x42, 0xc2, 0x5a, 0xd0, 0x77, 0x80, 0xdc, + 0x3b, 0xeb, 0x12, 0xda, 0x6c, 0xe8, 0x89, 0xe6, + 0x2b, 0xd9, 0x1d, 0x20, 0x69, 0x2c, 0x69, 0x66, + 0x82, 0xea, 0x68, 0x1e, 0x4a, 0x08, 0x94, 0x58, + 0xdd, 0xf0, 0x2e, 0x8b, 0x6b, 0x1b, 0xcb, 0xa7, + 0x34, 0x5b, 0xc2, 0xe9, 0x31, 0x1a, 0x07, 0x00, + 0x70, 0xf6, 0x6a, 0xed, 0x48, 0x39, 0xd6, 0x57, + 0x66, 0x6d, 0x60, 0xdc, 0xbe, 0xef, 0xd9, 0x83, + 0xcc, 0x94, 0x63, 0x5c, 0x5c, 0xed, 0xca, 0xee, + 0x0e, 0xc2, 0xdd, 0x96, 0xe5, 0x11, 0x5d, 0xdb, + 0x4b, 0x73, 0x3d, 0xc0, 0xb6, 0x8e, 0x27, 0x86, + 0x54, 0x8a, 0x83, 0x51, 0x54, 0x11, 0xa8, 0xa4, + 0xee, 0xf2, 0xcc, 0xba, 0x0b, 0x69, 0x25, 0x87, + 0x30, 0x64, 0xd2, 0x30, 0x02, 0xd8, 0xc0, 0x00, + 0x92, 0x4f, 0x12, 0xf3, 0x61, 0x94, 0x32, 0xe2, + 0xd9, 0xf7, 0x97, 0x53, 0x7b, 0x3d, 0xa4, 0x4e, + 0xa6, 0x3a, 0x62, 0x71, 0x3f, 0xd5, 0x41, 0x1c, + 0x8a, 0x4e, 0xf3, 0x28, 0x84, 0x59, 0x1b, 0xfb, + 0x0b, 0x8f, 0x68, 0x81, 0x86, 0x92, 0x82, 0xdc, + 0x2f, 0x69, 0x5e, 0x32, 0xfc, 0xa5, 0xb7, 0x16, + 0xd2, 0x5e, 0xdd, 0x4b, 0xec, 0xd6, 0xb1, 0x9a, + 0x17, 0xd3, 0x13, 0x9c, 0x7b, 0x08, 0x23, 0xd1, + 0x49, 0xdd, 0x65, 0x10, 0x8b, 0x23, 0x7f, 0x61, + 0x3f, 0xb4, 0x5b, 0xb0, 0xd2, 0x5c, 0x4d, 0xc2, + 0xe6, 0x9d, 0x1c, 0x6a, 0x31, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x75, 0x65, 0x3f, + 0xcd, 0x2d, 0x3e, 0xd9, 0x9f, 0x58, 0x2e, 0x55, + 0xd5, 0x94, 0xff, 0x00, 0x34, 0xb4, 0xfb, 0x66, + 0x7d, 0x60, 0x82, 0xcf, 0x9b, 0xfb, 0xe1, 0xf3, + 0x5a, 0xb8, 0x97, 0x6e, 0x6f, 0xef, 0x87, 0xcd, + 0x6a, 0xe2, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x1e, 0xa3, 0xfd, 0xa3, 0x3b, 0x6a, 0x4d, + 0x46, 0x47, 0xfb, 0x46, 0x76, 0xd4, 0x9a, 0x02, + 0xe1, 0xcc, 0x3d, 0xe6, 0xd7, 0xed, 0x3e, 0x50, + 0xbb, 0x97, 0x0e, 0x61, 0xef, 0x36, 0xbf, 0x69, + 0xf2, 0x84, 0x0c, 0xbf, 0xde, 0x6e, 0xfc, 0xf3, + 0xf5, 0x8a, 0xee, 0x5c, 0x39, 0x7f, 0xbc, 0xdd, + 0xf9, 0xe7, 0xeb, 0x15, 0xdc, 0x80, 0x75, 0x15, + 0x14, 0x75, 0x95, 0x2a, 0x75, 0x15, 0x14, 0x75, + 0x94, 0x04, 0x44, 0x41, 0xd1, 0x98, 0xff, 0x00, + 0xa6, 0x9f, 0xe7, 0x0f, 0xac, 0xaa, 0x43, 0x52, + 0xb6, 0xe6, 0x3f, 0xe9, 0xa7, 0xf9, 0xc3, 0xeb, + 0x2a, 0x90, 0xd4, 0x83, 0x28, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x0a, 0x73, + 0x2c, 0x07, 0xe1, 0xac, 0xc8, 0x37, 0x5e, 0x21, + 0x5e, 0x06, 0xa8, 0x35, 0x31, 0xb3, 0xd7, 0x10, + 0x96, 0xdc, 0xe5, 0xd3, 0xbc, 0x31, 0x97, 0x6c, + 0xfd, 0x5b, 0x8e, 0xa0, 0xed, 0x3a, 0xd0, 0x43, + 0x80, 0x5c, 0x43, 0x5a, 0x09, 0x27, 0x50, 0x1a, + 0xf4, 0xa9, 0xdd, 0x95, 0x63, 0xe3, 0xcc, 0x27, + 0x64, 0xad, 0x2d, 0x22, 0x13, 0x88, 0x11, 0x43, + 0x4a, 0x8d, 0xf5, 0x9b, 0x0d, 0x9d, 0xba, 0xb5, + 0xbc, 0x65, 0xc5, 0xdb, 0x99, 0x1d, 0xb5, 0xbb, + 0x84, 0x9c, 0xe6, 0x20, 0x6b, 0x87, 0x48, 0xe1, + 0x5d, 0x19, 0x4d, 0xeb, 0x6f, 0x33, 0xdb, 0xdb, + 0x80, 0x69, 0x1b, 0xa2, 0x2d, 0x61, 0x3b, 0xc0, + 0xb4, 0x04, 0x1a, 0x72, 0xeb, 0xad, 0x9b, 0x17, + 0x91, 0xe0, 0xb6, 0x7b, 0x25, 0x26, 0x91, 0xbd, + 0xe7, 0x13, 0x43, 0xab, 0x4d, 0x55, 0xdf, 0x2b, + 0xdc, 0x0c, 0xb9, 0x8b, 0x6b, 0x9b, 0xed, 0x4f, + 0x0f, 0x90, 0xe2, 0x20, 0x81, 0xa3, 0x09, 0x61, + 0x2d, 0x01, 0x57, 0xe1, 0x76, 0x19, 0xd8, 0xed, + 0xd0, 0xf0, 0x7b, 0x5a, 0x54, 0xfe, 0x7b, 0x72, + 0x2d, 0x33, 0xeb, 0x6b, 0xe0, 0x31, 0x30, 0x31, + 0xae, 0x24, 0x11, 0xaa, 0xb8, 0x5c, 0x38, 0x0a, + 0x08, 0x6c, 0xd7, 0x46, 0x65, 0x73, 0x5f, 0x5a, + 0xef, 0x0a, 0xd0, 0x62, 0x94, 0x30, 0x48, 0x58, + 0xe1, 0x19, 0xd4, 0xfa, 0x68, 0x3d, 0xde, 0xe2, + 0x9e, 0xcc, 0xf2, 0x29, 0xef, 0xee, 0xdd, 0x79, + 0x97, 0x39, 0x92, 0xc1, 0x73, 0xe3, 0x13, 0x88, + 0x0c, 0x2e, 0xdd, 0x5a, 0x73, 0xc9, 0xa1, 0x82, + 0xca, 0xd7, 0x29, 0x8d, 0xe2, 0x57, 0x40, 0x09, + 0x99, 0xcd, 0x3a, 0x31, 0x1d, 0xca, 0xf7, 0x4a, + 0x08, 0xab, 0x38, 0x0d, 0xcd, 0xdc, 0x30, 0x0d, + 0x72, 0x3d, 0xad, 0xee, 0x13, 0xa5, 0x58, 0x73, + 0x6b, 0x7c, 0xc9, 0xd9, 0xcc, 0x33, 0xdb, 0xdb, + 0xbd, 0xd0, 0x5a, 0xe0, 0x11, 0x90, 0x34, 0x51, + 0xa4, 0x62, 0x5c, 0x5b, 0x2d, 0x13, 0x4d, 0xfb, + 0xae, 0x64, 0xa6, 0x0b, 0x76, 0x39, 0xd5, 0x3a, + 0x3c, 0x62, 0x30, 0xf8, 0x17, 0x14, 0xb9, 0xbe, + 0x61, 0x24, 0x8f, 0x91, 0x97, 0x12, 0x35, 0xaf, + 0x71, 0x20, 0x07, 0x11, 0x40, 0x49, 0xd0, 0x82, + 0x6a, 0xf2, 0xc8, 0x37, 0x6a, 0xed, 0xdc, 0x47, + 0x8b, 0x39, 0x12, 0x80, 0x77, 0xd8, 0x34, 0xfd, + 0x55, 0x11, 0x9b, 0x4d, 0x21, 0xce, 0xee, 0x26, + 0x06, 0xaf, 0x8e, 0x5a, 0x32, 0xbb, 0x81, 0x84, + 0x51, 0x4b, 0xbe, 0xf0, 0x3a, 0xcf, 0x2a, 0xcd, + 0x5e, 0x71, 0x3a, 0x07, 0xf3, 0x73, 0xbb, 0x59, + 0xa1, 0x14, 0x24, 0xf0, 0x2d, 0x57, 0x79, 0x04, + 0xf7, 0x39, 0xab, 0xae, 0xa3, 0x2c, 0x7d, 0x94, + 0xef, 0x12, 0xba, 0x5c, 0x42, 0x80, 0x68, 0x2e, + 0xaa, 0x0f, 0x59, 0x1d, 0xdc, 0x97, 0x97, 0xf7, + 0x99, 0x8c, 0xa1, 0xa2, 0x66, 0xc1, 0x4f, 0x17, + 0x57, 0x60, 0xfd, 0x15, 0x09, 0x63, 0x7d, 0x71, + 0x65, 0x70, 0x2f, 0x23, 0xa1, 0x92, 0x84, 0x9c, + 0x5a, 0x41, 0xc4, 0x34, 0xf8, 0x54, 0xdd, 0x8d, + 0xee, 0x5e, 0xcc, 0xf2, 0xe6, 0x28, 0xb0, 0xc5, + 0x6b, 0x3b, 0x39, 0x96, 0x91, 0xa0, 0x17, 0x0d, + 0xd5, 0xaa, 0xc3, 0x22, 0x75, 0x8d, 0xcb, 0xee, + 0x33, 0x36, 0xb3, 0xd9, 0x20, 0x6b, 0xa8, 0x5c, + 0xe0, 0x43, 0xeb, 0xe4, 0xd0, 0x20, 0xdb, 0x95, + 0xc2, 0x27, 0xc8, 0xaf, 0x1c, 0xe9, 0x59, 0x6c, + 0xeb, 0x99, 0x68, 0xf9, 0x1d, 0x40, 0xd0, 0x2a, + 0xd2, 0x5b, 0xdf, 0x2b, 0x39, 0x7d, 0xbd, 0x9d, + 0x85, 0x9d, 0xe4, 0x32, 0xdf, 0xc1, 0x33, 0x6e, + 0x23, 0xc2, 0x18, 0xd7, 0x6a, 0x23, 0x16, 0xe1, + 0x27, 0x7d, 0x73, 0xe5, 0x66, 0x3b, 0xfc, 0xb6, + 0xf7, 0x2d, 0x6d, 0x23, 0x92, 0x47, 0xf3, 0xb0, + 0x34, 0x9a, 0x03, 0xa4, 0x10, 0x34, 0xf6, 0x97, + 0x96, 0xe5, 0x6c, 0xcb, 0xec, 0x2e, 0x67, 0xcd, + 0x63, 0x6f, 0x3c, 0xe1, 0x4b, 0x78, 0xf1, 0x54, + 0xe2, 0xf1, 0xb4, 0xf8, 0xa7, 0xb2, 0x80, 0xea, + 0xfc, 0x23, 0x16, 0xff, 0x00, 0x3e, 0x7c, 0x2e, + 0x5d, 0xd9, 0xb6, 0x5b, 0x14, 0xf6, 0x96, 0x50, + 0x9b, 0xa8, 0xad, 0x63, 0x86, 0x2a, 0x86, 0x4a, + 0x69, 0x52, 0xe0, 0x34, 0xeb, 0x1b, 0xcb, 0x85, + 0xfa, 0x36, 0x4e, 0x36, 0xeb, 0x77, 0x3e, 0x74, + 0x77, 0x5c, 0xb7, 0x5e, 0x5b, 0x49, 0x9d, 0x58, + 0x59, 0xdc, 0x59, 0xe1, 0x92, 0x68, 0x59, 0xcd, + 0xcb, 0x1d, 0x40, 0x20, 0x8d, 0x47, 0x4a, 0x0f, + 0x39, 0x99, 0xb7, 0x8f, 0x28, 0xb3, 0xb6, 0x6d, + 0xcc, 0x57, 0x13, 0xc1, 0x28, 0x18, 0xa3, 0x35, + 0xa3, 0x48, 0x77, 0x64, 0x95, 0xe7, 0x6b, 0x65, + 0x90, 0xdf, 0x47, 0x01, 0x24, 0xc6, 0xc8, 0xc1, + 0x0d, 0xdc, 0xa9, 0xd6, 0x56, 0x9c, 0xce, 0xd6, + 0xd2, 0xca, 0x0b, 0x4b, 0x50, 0x1a, 0xeb, 0xea, + 0x87, 0x4e, 0xf6, 0x9a, 0xd3, 0x4f, 0x93, 0xbc, + 0xbd, 0x6d, 0x59, 0x0e, 0xcc, 0x5a, 0x7f, 0xc2, + 0x69, 0xef, 0x1d, 0x08, 0x31, 0x1d, 0xb6, 0x69, + 0x99, 0x65, 0xd0, 0x46, 0xee, 0x6e, 0xde, 0xca, + 0xd8, 0x10, 0xd9, 0x5f, 0x46, 0x83, 0xb9, 0x5a, + 0x69, 0xaa, 0xe8, 0xcd, 0x60, 0x86, 0x0d, 0x9b, + 0xb6, 0x86, 0x19, 0x85, 0xc3, 0x1b, 0x39, 0x1c, + 0xe8, 0x1a, 0x09, 0xa3, 0xeb, 0x45, 0xb2, 0xf6, + 0xce, 0x6c, 0xcf, 0x29, 0xb0, 0xf6, 0x10, 0x24, + 0x64, 0x2d, 0x2d, 0x96, 0x30, 0x40, 0xd2, 0x70, + 0xd0, 0x9e, 0x05, 0x8b, 0xeb, 0x42, 0x36, 0x6e, + 0x28, 0x62, 0x7b, 0x66, 0x75, 0xa4, 0x85, 0xf7, + 0x05, 0x84, 0x10, 0xdf, 0x2b, 0x15, 0x37, 0xe8, + 0x4a, 0x0e, 0x7c, 0xc0, 0xff, 0x00, 0xf5, 0x9c, + 0xbc, 0xff, 0x00, 0x5d, 0xde, 0x07, 0x2f, 0x5b, + 0x40, 0x04, 0x79, 0x76, 0x5b, 0x6e, 0xdf, 0x20, + 0x47, 0x88, 0xb7, 0x70, 0x92, 0x1b, 0xfd, 0x2b, + 0x6f, 0xb1, 0x4b, 0x98, 0xec, 0xdd, 0xab, 0x2d, + 0x8b, 0x4b, 0xa0, 0x2e, 0x32, 0x02, 0x69, 0xa3, + 0xc6, 0x58, 0x9e, 0xde, 0x4c, 0xe7, 0x2a, 0xb4, + 0x36, 0x94, 0x7d, 0xcd, 0xa8, 0x31, 0xcb, 0x19, + 0x20, 0x1d, 0x40, 0x57, 0x4f, 0x69, 0x06, 0x92, + 0x79, 0xdd, 0x91, 0x79, 0x7e, 0x9f, 0x67, 0x9b, + 0xc4, 0xae, 0xe0, 0x24, 0x68, 0xfa, 0x4b, 0x66, + 0xd4, 0x4d, 0x28, 0xf6, 0x38, 0x71, 0x1c, 0x02, + 0x16, 0xbe, 0x9a, 0xaa, 0xe3, 0xa2, 0xa7, 0x92, + 0xbc, 0x66, 0x4d, 0x19, 0x76, 0x43, 0x1e, 0x59, + 0x23, 0x9a, 0x6e, 0xa6, 0x71, 0x92, 0x56, 0xb4, + 0xd6, 0x80, 0x1a, 0x8a, 0xa6, 0xd4, 0x10, 0x66, + 0xb4, 0xff, 0x00, 0xc7, 0x6f, 0x84, 0xa0, 0x84, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x58, 0x3b, 0xab, 0x2b, 0x07, 0x75, + 0x05, 0xca, 0xeb, 0xf9, 0x5d, 0x8f, 0x98, 0xdf, + 0xaa, 0x17, 0x0a, 0xee, 0xba, 0xfe, 0x57, 0x63, + 0xe6, 0x37, 0xea, 0x85, 0xc2, 0x83, 0x28, 0x88, + 0x80, 0xb1, 0xb8, 0x56, 0x56, 0x37, 0x0a, 0x0f, + 0x5b, 0x63, 0xe4, 0xd9, 0xf6, 0x9f, 0xfd, 0xd5, + 0x5a, 0x56, 0x5d, 0xb1, 0xf2, 0x6c, 0xfb, 0x4f, + 0xfe, 0xea, 0xad, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x29, 0xcd, 0x90, 0xfe, 0x64, + 0xff, 0x00, 0xb2, 0x3e, 0x15, 0x06, 0xa7, 0x36, + 0x43, 0xf9, 0x93, 0xfe, 0xc8, 0xf8, 0x50, 0x6c, + 0xd9, 0xc8, 0x5f, 0x3e, 0x5f, 0x99, 0x43, 0x1d, + 0x31, 0xc8, 0x1a, 0xd6, 0xd4, 0xd0, 0x54, 0x82, + 0xb9, 0x4e, 0xcb, 0xe6, 0xad, 0x69, 0x24, 0x45, + 0x46, 0x8a, 0x9f, 0x1f, 0x7b, 0xb8, 0xb7, 0xe4, + 0x44, 0x8c, 0xab, 0x34, 0xa6, 0xbc, 0x23, 0xc0, + 0x54, 0x20, 0x96, 0x4a, 0x53, 0x9c, 0x3b, 0x95, + 0xf1, 0x8e, 0xea, 0x09, 0xec, 0x96, 0xd6, 0x6b, + 0xac, 0x86, 0xfe, 0xda, 0x20, 0x39, 0xc7, 0xbc, + 0x06, 0xe2, 0x34, 0x15, 0x14, 0x3a, 0xfb, 0x8b, + 0x92, 0x4d, 0x99, 0xcd, 0x23, 0x8d, 0xd2, 0x38, + 0x47, 0x85, 0x83, 0x13, 0xa8, 0xfd, 0xc1, 0xdc, + 0x5b, 0xf2, 0xe2, 0xe6, 0xec, 0xd6, 0x60, 0x59, + 0x56, 0x90, 0xe6, 0xd0, 0x8d, 0x07, 0x5b, 0x54, + 0x27, 0x3b, 0x25, 0x7c, 0xb2, 0x6b, 0x5f, 0xce, + 0x28, 0x2c, 0x39, 0x6d, 0xa4, 0xd7, 0xbb, 0x31, + 0x2d, 0xbc, 0x14, 0xe7, 0x1d, 0x39, 0x23, 0x11, + 0xa0, 0xd0, 0x5a, 0x75, 0xae, 0x09, 0xf6, 0x73, + 0x33, 0x82, 0x17, 0xcf, 0x20, 0x8f, 0x04, 0x6d, + 0xc4, 0xea, 0x3e, 0xa6, 0x9c, 0x0b, 0xa6, 0x02, + 0x46, 0xc9, 0x4c, 0x41, 0xa7, 0xeb, 0xf5, 0x83, + 0x4f, 0x9b, 0xba, 0xa1, 0x31, 0xbc, 0x8a, 0x17, + 0x92, 0x3b, 0x24, 0xf1, 0xa0, 0xc2, 0xec, 0xb2, + 0xcc, 0x6f, 0xad, 0xcb, 0x21, 0x86, 0x77, 0x47, + 0x11, 0x78, 0xfd, 0x5b, 0x75, 0x69, 0x3a, 0x78, + 0x57, 0x1f, 0xf4, 0x1e, 0x15, 0xee, 0x1f, 0xdb, + 0x47, 0xe7, 0xb7, 0xc2, 0x10, 0x4a, 0xed, 0x57, + 0xf3, 0x87, 0x57, 0xd5, 0xb0, 0x57, 0x85, 0x6f, + 0xb4, 0xb6, 0x64, 0xbb, 0x37, 0x49, 0x66, 0x65, + 0xb3, 0x1d, 0x70, 0x5d, 0x24, 0x8f, 0xd3, 0xe2, + 0xb7, 0x45, 0x00, 0xdd, 0x2b, 0x9f, 0x6b, 0x3f, + 0x9c, 0x3f, 0xec, 0x99, 0xc3, 0xa5, 0x71, 0x4d, + 0x63, 0x75, 0x1d, 0x84, 0x77, 0x8e, 0x20, 0xdb, + 0x4a, 0xef, 0x14, 0x02, 0x49, 0x07, 0xcd, 0xdc, + 0x41, 0xd3, 0x77, 0x92, 0xb1, 0x96, 0x7e, 0xdb, + 0x63, 0x70, 0xdb, 0xa8, 0x18, 0x40, 0x90, 0x81, + 0x84, 0xb7, 0xb3, 0x45, 0xd5, 0x96, 0xb7, 0xac, + 0xf2, 0x47, 0xe5, 0xb1, 0x55, 0xb7, 0x10, 0xbf, + 0x9d, 0x61, 0x75, 0x70, 0x38, 0x76, 0x5f, 0x4a, + 0x0d, 0x6b, 0x19, 0x08, 0x23, 0x2d, 0xcd, 0x0b, + 0xeb, 0xcd, 0x18, 0x8b, 0x74, 0xfc, 0xe2, 0x1c, + 0x37, 0x52, 0xec, 0x98, 0xb6, 0x66, 0xd3, 0x99, + 0x38, 0x5b, 0x3b, 0xc9, 0x9d, 0xcd, 0xd1, 0x53, + 0x53, 0xad, 0x07, 0xb7, 0xc0, 0xfc, 0x9b, 0x24, + 0x9e, 0x0b, 0x8f, 0x1a, 0x7b, 0xd2, 0x03, 0x43, + 0x2a, 0xe6, 0x80, 0x37, 0x4b, 0xe9, 0x45, 0xe7, + 0x2d, 0x67, 0x59, 0x64, 0xaf, 0xcb, 0x23, 0x38, + 0x6e, 0x21, 0x93, 0x9d, 0x69, 0x3e, 0x49, 0x1e, + 0x76, 0xe6, 0xb5, 0x8c, 0x8a, 0xb3, 0x65, 0x99, + 0x8c, 0x13, 0x69, 0x81, 0xb1, 0x63, 0x01, 0xda, + 0x68, 0xea, 0x13, 0xa3, 0x81, 0x2e, 0x8b, 0xa0, + 0xd9, 0x7b, 0x4e, 0x62, 0xac, 0x13, 0x48, 0x79, + 0xf2, 0xdd, 0x04, 0x9f, 0x1a, 0x95, 0xa6, 0xfd, + 0x10, 0x7b, 0x74, 0x0f, 0xc9, 0xb2, 0x4b, 0x88, + 0x6e, 0x7c, 0x69, 0xef, 0x48, 0xa0, 0x65, 0x4b, + 0x1a, 0x00, 0x1a, 0xdd, 0xa9, 0x40, 0x57, 0x73, + 0xb9, 0xc0, 0x14, 0xee, 0x44, 0x0c, 0xb9, 0x7e, + 0x63, 0x6f, 0x2e, 0x9b, 0x76, 0xc7, 0x89, 0xa0, + 0xea, 0x0f, 0xa3, 0xb5, 0x57, 0xb4, 0xa0, 0x46, + 0xaa, 0xeb, 0xad, 0x34, 0xf6, 0x90, 0x65, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x75, 0x65, + 0x3f, 0xcd, 0x2d, 0x3e, 0xd9, 0x9f, 0x58, 0x2e, + 0x55, 0xd5, 0x94, 0xff, 0x00, 0x34, 0xb4, 0xfb, + 0x66, 0x7d, 0x60, 0x82, 0xcf, 0x9b, 0xfb, 0xe1, + 0xf3, 0x5a, 0xb8, 0x97, 0x6e, 0x6f, 0xef, 0x87, + 0xcd, 0x6a, 0xe2, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x1e, 0xa3, 0xfd, 0xa3, 0x3b, 0x6a, + 0x4d, 0x46, 0x47, 0xfb, 0x46, 0x1e, 0xca, 0x93, + 0x40, 0x5c, 0x39, 0x87, 0xbc, 0xda, 0xfd, 0xa7, + 0xca, 0x17, 0x72, 0xe1, 0xcc, 0x3d, 0xe6, 0xd7, + 0xed, 0x3e, 0x50, 0x83, 0x16, 0x07, 0xfe, 0xe6, + 0xef, 0xcf, 0x3f, 0x58, 0xae, 0xea, 0xae, 0x0b, + 0x0f, 0x7a, 0xbb, 0xf3, 0xcf, 0xd6, 0x2b, 0xbd, + 0x00, 0x9d, 0x05, 0x45, 0x9d, 0x7d, 0xd2, 0xa4, + 0xf7, 0x0a, 0x8c, 0x3f, 0x29, 0x40, 0x44, 0x44, + 0x1d, 0x19, 0x8f, 0xfa, 0x69, 0xfe, 0x70, 0xfa, + 0xca, 0xa4, 0x3b, 0x4a, 0xeb, 0x5b, 0x11, 0x93, + 0x0e, 0xb0, 0xf7, 0x72, 0xea, 0x1d, 0x7a, 0xeb, + 0xa3, 0x52, 0x8e, 0xc7, 0xb1, 0x9b, 0xc7, 0xe9, + 0xa0, 0xad, 0xe9, 0xde, 0x4d, 0x3b, 0xca, 0xc9, + 0x8f, 0x63, 0x3b, 0x3f, 0x4d, 0x31, 0xec, 0x67, + 0x67, 0xe9, 0xa0, 0xad, 0xe9, 0xde, 0x4d, 0x3b, + 0xca, 0xc9, 0x8f, 0x63, 0x3b, 0x3f, 0x4d, 0x31, + 0xec, 0x67, 0x67, 0xe9, 0xa0, 0xad, 0xe9, 0xde, + 0x4d, 0x3b, 0xca, 0xc9, 0x8f, 0x63, 0x3b, 0x3f, + 0x4d, 0x31, 0xec, 0x67, 0x67, 0xe9, 0xa0, 0xad, + 0xe9, 0xde, 0x4d, 0x3b, 0xca, 0xc9, 0x8f, 0x63, + 0x3b, 0x3f, 0x4d, 0x31, 0xec, 0x67, 0x67, 0xe9, + 0xa0, 0xad, 0xd4, 0xef, 0x27, 0x71, 0x59, 0x31, + 0xec, 0x67, 0x67, 0xe9, 0xa6, 0x3d, 0x8c, 0xec, + 0xfd, 0x34, 0x15, 0xd7, 0x4b, 0x2b, 0x9b, 0x85, + 0xce, 0x71, 0x68, 0xd4, 0x09, 0x34, 0x5e, 0x74, + 0xd6, 0xba, 0xbb, 0x4a, 0xc9, 0x8f, 0x63, 0x3b, + 0x3f, 0x4d, 0x31, 0xec, 0x67, 0x67, 0xe9, 0xa0, + 0xad, 0x9d, 0x3b, 0x9a, 0x29, 0x4a, 0x25, 0x4d, + 0x6b, 0x4d, 0x3b, 0x95, 0xa9, 0xa2, 0xb2, 0x63, + 0xd8, 0xce, 0xcf, 0xd3, 0x4c, 0x7b, 0x19, 0xd9, + 0xfa, 0x68, 0x2b, 0xad, 0x7c, 0x8c, 0x14, 0x63, + 0x9c, 0xdd, 0xfa, 0x12, 0x07, 0x65, 0x79, 0xd3, + 0x5d, 0x5d, 0x9a, 0x2b, 0x26, 0x3d, 0x8c, 0xec, + 0xfd, 0x34, 0xc7, 0xb1, 0x9d, 0x9f, 0xa6, 0x82, + 0xb8, 0x09, 0x1b, 0x9b, 0x94, 0xdd, 0x09, 0x53, + 0xc1, 0x4a, 0x77, 0x15, 0x8f, 0x1e, 0xc6, 0x76, + 0x7e, 0x9a, 0x63, 0xd8, 0xce, 0xcf, 0xd3, 0x41, + 0x5b, 0xd3, 0xbd, 0xa3, 0x7b, 0x4d, 0x38, 0x17, + 0xa1, 0x24, 0x81, 0xb8, 0x43, 0x88, 0x6f, 0xcd, + 0x04, 0xd3, 0x81, 0x58, 0xb1, 0xec, 0x67, 0x67, + 0xe9, 0xa6, 0x3d, 0x8c, 0xec, 0xfd, 0x34, 0x15, + 0xbd, 0x42, 0x80, 0x68, 0x3b, 0x9a, 0xc2, 0xf4, + 0x64, 0x7b, 0x85, 0x1c, 0x4b, 0x9a, 0x35, 0x02, + 0x49, 0x0a, 0xc5, 0x8f, 0x63, 0x3b, 0x3f, 0x4d, + 0x31, 0xec, 0x67, 0x67, 0xe9, 0xa0, 0xad, 0x8a, + 0x82, 0x08, 0xad, 0x46, 0xa3, 0xbb, 0xc2, 0xbd, + 0x3a, 0x47, 0xb8, 0x87, 0x38, 0x97, 0x11, 0xba, + 0x49, 0x2a, 0xc5, 0x8f, 0x63, 0x3b, 0x3f, 0x4d, + 0x31, 0xec, 0x67, 0x67, 0xe9, 0xa0, 0xad, 0xd4, + 0xe9, 0xd1, 0x4a, 0xef, 0x55, 0x7a, 0x6b, 0xe4, + 0x61, 0x25, 0x84, 0xb6, 0xbf, 0x34, 0x91, 0xe0, + 0x56, 0x2c, 0x7b, 0x19, 0xd9, 0xfa, 0x69, 0x8f, + 0x63, 0x3b, 0x3f, 0x4d, 0x05, 0x72, 0xa4, 0xd7, + 0xb3, 0xaf, 0xb2, 0x95, 0x3b, 0xde, 0x15, 0x63, + 0xc7, 0xb1, 0x9d, 0x9f, 0xa6, 0x98, 0xf6, 0x33, + 0xb3, 0xf4, 0xd0, 0x57, 0x43, 0xde, 0xd0, 0x43, + 0x49, 0x68, 0x3a, 0xc0, 0x24, 0x78, 0x17, 0x9a, + 0xba, 0x94, 0xdc, 0xee, 0xab, 0x26, 0x3d, 0x8c, + 0xec, 0xfd, 0x34, 0xc7, 0xb1, 0x9d, 0x9f, 0xa6, + 0x82, 0xb8, 0x09, 0x1a, 0xaa, 0x35, 0x57, 0xb3, + 0x4d, 0xfd, 0x0b, 0x2d, 0x7b, 0xda, 0x6a, 0xc2, + 0x5a, 0x77, 0xc1, 0x20, 0xab, 0x16, 0x3d, 0x8c, + 0xec, 0xfd, 0x34, 0xc7, 0xb1, 0x9d, 0x9f, 0xa6, + 0x82, 0xb8, 0x49, 0x24, 0x93, 0xac, 0xeb, 0x3b, + 0xa9, 0x53, 0xbd, 0xe1, 0x56, 0x3c, 0x7b, 0x19, + 0xd9, 0xfa, 0x69, 0x8f, 0x63, 0x3b, 0x3f, 0x4d, + 0x05, 0x6f, 0x4e, 0xf2, 0x69, 0xde, 0x56, 0x4c, + 0x7b, 0x19, 0xd9, 0xfa, 0x69, 0x8f, 0x63, 0x3b, + 0x3f, 0x4d, 0x05, 0x6f, 0x4e, 0xf2, 0x69, 0xde, + 0x56, 0x4c, 0x7b, 0x19, 0xd9, 0xfa, 0x69, 0x8f, + 0x63, 0x3b, 0x3f, 0x4d, 0x05, 0x6f, 0x4e, 0xf2, + 0x69, 0xde, 0x56, 0x4c, 0x7b, 0x19, 0xd9, 0xfa, + 0x69, 0x8f, 0x63, 0x3b, 0x3f, 0x4d, 0x05, 0x6f, + 0x4e, 0xf2, 0x69, 0xde, 0x56, 0x4c, 0x7b, 0x19, + 0xd9, 0xfa, 0x69, 0x8f, 0x63, 0x3b, 0x3f, 0x4d, + 0x05, 0x6f, 0x4e, 0xf2, 0x69, 0xa1, 0x56, 0x4c, + 0x7b, 0x19, 0xd9, 0xfa, 0x6b, 0x05, 0xfb, 0x19, + 0xbc, 0x74, 0xe8, 0xfc, 0xf4, 0x1d, 0xf7, 0x5f, + 0xcb, 0x2c, 0x7c, 0xc6, 0xfd, 0x50, 0xb8, 0x54, + 0x96, 0x69, 0xcd, 0xb6, 0xde, 0xde, 0x28, 0x7c, + 0x80, 0xda, 0xc7, 0xbb, 0xe2, 0x80, 0x28, 0xa3, + 0x50, 0x65, 0x11, 0x10, 0x16, 0x37, 0x0a, 0xca, + 0xc1, 0xd0, 0x10, 0x7a, 0xdb, 0x1f, 0x26, 0xcf, + 0xb4, 0xff, 0x00, 0xee, 0xaa, 0xd2, 0xbb, 0x67, + 0x39, 0x4c, 0x79, 0x90, 0x80, 0x3a, 0x71, 0x07, + 0x34, 0x0d, 0x01, 0xa1, 0xad, 0x69, 0xd9, 0x1b, + 0xca, 0x37, 0xe1, 0x18, 0x7a, 0x73, 0x78, 0x07, + 0xa4, 0x82, 0xb6, 0x8a, 0xc9, 0xf0, 0x8c, 0x3d, + 0x39, 0xbc, 0x03, 0xd2, 0x4f, 0x84, 0x61, 0xe9, + 0xcd, 0xe0, 0x1e, 0x92, 0x0a, 0xda, 0x2b, 0x27, + 0xc2, 0x30, 0xf4, 0xe6, 0xf0, 0x0f, 0x49, 0x3e, + 0x11, 0x87, 0xa7, 0x37, 0x80, 0x7a, 0x48, 0x2b, + 0x68, 0xac, 0x9f, 0x08, 0xc3, 0xd3, 0x9b, 0xc0, + 0x3d, 0x24, 0xf8, 0x46, 0x1e, 0x9c, 0xde, 0x01, + 0xe9, 0x20, 0xad, 0xa2, 0xb2, 0x7c, 0x23, 0x0f, + 0x4e, 0x6f, 0x00, 0xf4, 0x93, 0xe1, 0x18, 0x7a, + 0x73, 0x78, 0x07, 0xa4, 0x82, 0xb6, 0x8a, 0xc9, + 0xf0, 0x8c, 0x3d, 0x39, 0xbc, 0x03, 0xd2, 0x4f, + 0x84, 0x61, 0xe9, 0xcd, 0xe0, 0x1e, 0x92, 0x0a, + 0xda, 0x2b, 0x27, 0xc2, 0x30, 0xf4, 0xe6, 0xf0, + 0x0f, 0x49, 0x3e, 0x11, 0x87, 0xa7, 0x37, 0x80, + 0x7a, 0x48, 0x2b, 0x6b, 0xb3, 0x2b, 0xcc, 0xa4, + 0xcb, 0x67, 0x33, 0xc6, 0xc6, 0xc8, 0x4b, 0x70, + 0x51, 0xc4, 0x81, 0xde, 0x53, 0x1f, 0x08, 0xc3, + 0xd3, 0x9b, 0xc0, 0x3d, 0x24, 0xf8, 0x46, 0x1e, + 0x9c, 0xde, 0x01, 0xe9, 0x20, 0x8b, 0xcb, 0x33, + 0x89, 0x32, 0xe6, 0x4c, 0xc6, 0xc2, 0xc9, 0x9b, + 0x3d, 0x31, 0x09, 0x2b, 0x4d, 0x1d, 0x85, 0xd3, + 0xf1, 0x1b, 0x3e, 0xed, 0xb5, 0xe4, 0xff, 0x00, + 0x42, 0xeb, 0xf8, 0x46, 0x1e, 0x9c, 0xde, 0x01, + 0xe9, 0x27, 0xc2, 0x30, 0xf4, 0xe6, 0xf0, 0x0f, + 0x49, 0x04, 0x75, 0x96, 0x78, 0xeb, 0x46, 0xce, + 0xc1, 0x6d, 0x14, 0x91, 0xdc, 0x3f, 0x9c, 0x73, + 0x1d, 0xe4, 0x8f, 0xea, 0x80, 0x06, 0xa5, 0xb7, + 0xe2, 0x26, 0x56, 0xbd, 0x5b, 0x6b, 0xc9, 0xfe, + 0x85, 0xd9, 0xf0, 0x8c, 0x3d, 0x39, 0xbc, 0x03, + 0xd2, 0x4f, 0x84, 0x61, 0xe9, 0xcd, 0xe0, 0x1e, + 0x92, 0x08, 0xeb, 0x1c, 0xf6, 0x4b, 0x3b, 0x57, + 0x5a, 0xfb, 0x34, 0x53, 0x46, 0xf7, 0x99, 0x08, + 0x7d, 0x69, 0x53, 0x4d, 0x14, 0xd5, 0xb8, 0xb6, + 0x3b, 0x68, 0x58, 0xe6, 0x96, 0xf5, 0x75, 0xb0, + 0xa8, 0xa5, 0x43, 0x74, 0x8a, 0xf7, 0x17, 0x6f, + 0xc2, 0x30, 0xf4, 0xe6, 0xf0, 0x0f, 0x49, 0x3e, + 0x11, 0x87, 0xa7, 0x37, 0x80, 0x7a, 0x48, 0x2b, + 0x75, 0xd7, 0xd9, 0x59, 0x63, 0xb0, 0x3d, 0xae, + 0x1a, 0x70, 0x90, 0x69, 0xda, 0x35, 0x56, 0x3f, + 0x84, 0x61, 0xe9, 0xcd, 0xe0, 0x1e, 0x92, 0x7c, + 0x23, 0x0f, 0x4e, 0x6f, 0x00, 0xf4, 0x90, 0x42, + 0xe6, 0x59, 0x84, 0x99, 0x8d, 0xd1, 0xba, 0x91, + 0x82, 0x37, 0x16, 0x86, 0xd1, 0xb5, 0x3e, 0x4f, + 0x6d, 0x6d, 0xb1, 0xcd, 0xdf, 0x6d, 0x6e, 0xeb, + 0x49, 0xe2, 0x6d, 0xd5, 0xab, 0x8d, 0x79, 0xb7, + 0xeb, 0x07, 0xb0, 0x54, 0xaf, 0xc2, 0x30, 0xf4, + 0xe6, 0xf0, 0x0f, 0x49, 0x63, 0xe1, 0x18, 0x7a, + 0x73, 0x78, 0x07, 0xa4, 0x82, 0x36, 0xf3, 0x38, + 0x74, 0xb6, 0xde, 0xc7, 0x6b, 0x03, 0x6d, 0x2d, + 0x89, 0xab, 0xd8, 0xcd, 0x25, 0xdd, 0xb3, 0xdc, + 0x5e, 0x6c, 0x33, 0x77, 0xda, 0xc0, 0xeb, 0x49, + 0xa2, 0x6d, 0xd5, 0xab, 0x8d, 0x4c, 0x52, 0x68, + 0xa1, 0xfe, 0xa9, 0x52, 0xbf, 0x08, 0xc3, 0xd3, + 0x9b, 0xc0, 0x3d, 0x24, 0xf8, 0x46, 0x1e, 0x9c, + 0xde, 0x01, 0xe9, 0x20, 0x8d, 0xba, 0xce, 0x71, + 0xda, 0x9b, 0x4b, 0x3b, 0x76, 0x5a, 0x5b, 0xbc, + 0xd6, 0x40, 0xcf, 0x29, 0xc3, 0x7a, 0xab, 0xc5, + 0x8e, 0x6e, 0xeb, 0x5b, 0x77, 0xda, 0x4d, 0x13, + 0x2e, 0x6d, 0x1e, 0x6b, 0xcd, 0xbb, 0x70, 0xf6, + 0x0a, 0x94, 0xf8, 0x46, 0x1e, 0x9c, 0xda, 0xef, + 0xd0, 0x7a, 0x4b, 0x3f, 0x08, 0xc2, 0x3f, 0xfd, + 0xf3, 0x78, 0x07, 0xa4, 0x82, 0x36, 0xe7, 0x39, + 0xc7, 0x68, 0xeb, 0x3b, 0x3b, 0x76, 0x5a, 0x5b, + 0xbf, 0xcb, 0x0c, 0xd2, 0x5d, 0xdd, 0x51, 0xbe, + 0x0d, 0xc0, 0xac, 0x9f, 0x08, 0xc3, 0xd3, 0x5b, + 0xc0, 0x3d, 0x24, 0xf8, 0x46, 0x1e, 0x9c, 0xde, + 0x01, 0xe9, 0x20, 0xad, 0xa2, 0xb2, 0x7c, 0x23, + 0x0f, 0x4e, 0x6f, 0x00, 0xf4, 0x93, 0xe1, 0x18, + 0x7a, 0x73, 0x78, 0x07, 0xa4, 0x82, 0xb6, 0x8a, + 0xc9, 0xf0, 0x8c, 0x3d, 0x39, 0xbc, 0x03, 0xd2, + 0x4f, 0x84, 0x61, 0xe9, 0xcd, 0xe0, 0x1e, 0x92, + 0x0a, 0xda, 0x2b, 0x27, 0xc2, 0x30, 0xf4, 0xe6, + 0xf0, 0x0f, 0x49, 0x3e, 0x11, 0x87, 0xa7, 0x37, + 0x80, 0x7a, 0x48, 0x2b, 0x68, 0xac, 0x9f, 0x08, + 0xc3, 0xd3, 0x9b, 0xc0, 0x3d, 0x24, 0xf8, 0x46, + 0x1e, 0x9c, 0xde, 0x01, 0xe9, 0x20, 0xad, 0xa2, + 0xb2, 0x7c, 0x23, 0x0f, 0x4e, 0x6f, 0x00, 0xf4, + 0x93, 0xe1, 0x18, 0x7a, 0x73, 0x78, 0x07, 0xa4, + 0x82, 0xb6, 0x8a, 0xc9, 0xf0, 0x8c, 0x3d, 0x39, + 0xbc, 0x03, 0xd2, 0x4f, 0x84, 0x61, 0xe9, 0xcd, + 0xe0, 0x1e, 0x92, 0x0a, 0xda, 0xea, 0xca, 0x7f, + 0x9a, 0x5a, 0x7d, 0xb3, 0x3e, 0xb0, 0x53, 0x5f, + 0x08, 0xc3, 0xd3, 0x9b, 0xc0, 0x3d, 0x25, 0xb6, + 0xd3, 0x66, 0x21, 0xb6, 0xba, 0x86, 0xe3, 0xdb, + 0x1a, 0xee, 0x69, 0xed, 0x7e, 0x1a, 0x01, 0x5c, + 0x26, 0xb4, 0xd6, 0x83, 0xa3, 0x37, 0xf7, 0xc3, + 0xe6, 0xb5, 0x71, 0x2e, 0xdc, 0xdc, 0x11, 0x77, + 0xdb, 0x63, 0x4f, 0x84, 0x2e, 0x24, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x41, 0xea, 0x3f, 0xda, + 0x37, 0xb6, 0xa4, 0xaa, 0xa3, 0x62, 0xfd, 0xa3, + 0x7b, 0x6a, 0x49, 0x02, 0xab, 0x86, 0xfc, 0xff, + 0x00, 0xdd, 0x5a, 0x7d, 0xa7, 0xca, 0x17, 0x72, + 0xe1, 0xbf, 0xf7, 0xab, 0x4f, 0xb4, 0xf9, 0x42, + 0x0c, 0x58, 0x7b, 0xd5, 0xdf, 0x9e, 0x7e, 0xb1, + 0x5d, 0xeb, 0x82, 0xc3, 0xde, 0xae, 0xfc, 0xf3, + 0xf5, 0x8a, 0xef, 0x41, 0x8d, 0xc2, 0xa3, 0x0f, + 0xca, 0x54, 0x9e, 0xe1, 0x51, 0x87, 0xe5, 0x28, + 0x08, 0x88, 0x83, 0xde, 0x79, 0xa3, 0x67, 0x21, + 0xa6, 0x8a, 0xcc, 0xdf, 0xef, 0x2a, 0xad, 0x4e, + 0xfa, 0xb5, 0x67, 0x9f, 0xe9, 0xc8, 0x7e, 0xd9, + 0xbf, 0xde, 0x55, 0x54, 0x0a, 0x9d, 0xf4, 0xa9, + 0xdf, 0x44, 0x40, 0xa9, 0xdf, 0x4a, 0x9d, 0xf4, + 0x44, 0x1e, 0xa3, 0x63, 0xe5, 0x91, 0xb1, 0x33, + 0x4b, 0xde, 0x43, 0x5a, 0x3b, 0x24, 0xae, 0xab, + 0xfc, 0xaa, 0xfb, 0x2d, 0xc0, 0x6e, 0x80, 0x02, + 0x4f, 0x24, 0xb4, 0xd4, 0x77, 0x57, 0x46, 0xcd, + 0x5b, 0x0b, 0x8c, 0xda, 0x32, 0xe1, 0x56, 0x40, + 0x0c, 0xae, 0xee, 0x0a, 0x0e, 0xfa, 0x90, 0xcc, + 0x6e, 0x0e, 0x6f, 0x91, 0x4f, 0x73, 0xa0, 0xbe, + 0xda, 0xe0, 0xe1, 0xf3, 0x09, 0xa3, 0x7b, 0xc5, + 0x04, 0x46, 0x5f, 0x94, 0xde, 0xe6, 0x21, 0xee, + 0xb6, 0xc2, 0x44, 0x64, 0x07, 0x55, 0xd8, 0x75, + 0xae, 0xbf, 0x85, 0x73, 0x80, 0x2b, 0x86, 0x3f, + 0xde, 0x7f, 0x42, 0xdd, 0x91, 0x97, 0x75, 0x1e, + 0x6a, 0xe6, 0xd4, 0x1a, 0x54, 0x53, 0x5f, 0x93, + 0x55, 0x0b, 0x8e, 0xe3, 0xe7, 0x3f, 0x84, 0xa0, + 0xdf, 0x63, 0x96, 0x5e, 0xdf, 0x4a, 0xe8, 0xed, + 0xdb, 0x5e, 0x6f, 0xcb, 0x7b, 0x8d, 0x1a, 0x3b, + 0x65, 0x74, 0xdc, 0xec, 0xee, 0x65, 0x6f, 0x09, + 0x98, 0x16, 0x4e, 0xc6, 0x69, 0x7f, 0x36, 0xfa, + 0x91, 0xdc, 0xa2, 0xee, 0xcb, 0xe3, 0x92, 0x6d, + 0x96, 0xb9, 0x8e, 0xd0, 0x93, 0x70, 0x64, 0xfd, + 0x68, 0x1a, 0xc8, 0xa8, 0xd1, 0xc9, 0x51, 0x99, + 0x5e, 0x64, 0xfc, 0xb2, 0xe5, 0xef, 0x74, 0x65, + 0xed, 0x91, 0xa5, 0x8f, 0x85, 0xc7, 0x0f, 0x94, + 0x77, 0x90, 0x70, 0x54, 0xef, 0xa6, 0x9d, 0x55, + 0xd3, 0xb8, 0xb2, 0x48, 0x2e, 0x2e, 0x02, 0x8d, + 0x24, 0x90, 0x3b, 0x65, 0x63, 0x70, 0xa0, 0xef, + 0xb2, 0xc9, 0x6f, 0xef, 0xe1, 0x33, 0xdb, 0x86, + 0x73, 0x61, 0xc5, 0xa4, 0xb9, 0xd4, 0xd2, 0x17, + 0xbb, 0x9d, 0x9f, 0xcd, 0x6d, 0xa2, 0x32, 0xbe, + 0x2c, 0x6c, 0x1e, 0x51, 0x63, 0x83, 0xa8, 0x3b, + 0x41, 0x76, 0x5a, 0xe8, 0xd9, 0x2b, 0xa2, 0x34, + 0x1e, 0x78, 0x69, 0x1e, 0x73, 0x16, 0x8d, 0x9b, + 0xbd, 0x9a, 0x1c, 0xce, 0x28, 0x4b, 0x89, 0x86, + 0x7a, 0xc6, 0xf6, 0x1d, 0x23, 0x4e, 0x90, 0x47, + 0x74, 0x20, 0xe1, 0xb0, 0xb1, 0xb9, 0xcc, 0x26, + 0x30, 0xdb, 0x51, 0xd2, 0x00, 0x5e, 0x43, 0x8e, + 0x11, 0x40, 0x40, 0xf9, 0x57, 0x7f, 0xc2, 0xb9, + 0xc7, 0xcd, 0x8f, 0xf7, 0x9f, 0xd0, 0xbb, 0xf2, + 0x88, 0x1b, 0x6f, 0xb4, 0xf7, 0xb0, 0xb4, 0x51, + 0x8d, 0x8e, 0x42, 0xd1, 0xbc, 0x0b, 0xa3, 0x75, + 0x3b, 0xea, 0xbd, 0x23, 0xee, 0x39, 0xc7, 0xf8, + 0xcf, 0xf2, 0x8e, 0xe9, 0xdf, 0x41, 0xb0, 0x65, + 0xb7, 0xae, 0xbe, 0x75, 0x83, 0x1b, 0x8e, 0x76, + 0x1a, 0x38, 0x03, 0xa0, 0x0a, 0x0d, 0x38, 0xbb, + 0xab, 0xb9, 0xfb, 0x2f, 0x9a, 0x35, 0xa4, 0xb1, + 0xd1, 0x48, 0xf6, 0x8a, 0x98, 0x9a, 0xfa, 0xbb, + 0xb5, 0xa9, 0x74, 0xec, 0xae, 0x27, 0x7b, 0x78, + 0x69, 0xff, 0x00, 0xba, 0x74, 0x43, 0x9a, 0x27, + 0x5f, 0xe7, 0x7f, 0x42, 0x88, 0xb6, 0x9e, 0xe3, + 0x2d, 0xbf, 0x64, 0xd2, 0x35, 0xcd, 0x96, 0x27, + 0x82, 0xf6, 0xb8, 0xe9, 0x3b, 0xe0, 0x94, 0x1c, + 0xce, 0x0e, 0x69, 0x2d, 0x75, 0x43, 0x9a, 0x48, + 0x70, 0x3a, 0xc1, 0x1a, 0xc2, 0xc5, 0x4e, 0xfa, + 0xdf, 0x7d, 0x72, 0xdb, 0xbb, 0xc9, 0x6e, 0x9a, + 0xce, 0x6c, 0x4a, 0x71, 0x60, 0x06, 0xb4, 0xa8, + 0x5a, 0x10, 0x6f, 0xb3, 0xb2, 0xba, 0xbe, 0x98, + 0x43, 0x6c, 0xd2, 0xf7, 0xeb, 0x3a, 0x68, 0x00, + 0xdf, 0x25, 0x77, 0xc9, 0xb3, 0x59, 0x9b, 0x18, + 0xe7, 0xb0, 0xc7, 0x31, 0x60, 0xab, 0x99, 0x1b, + 0xea, 0xe1, 0xdc, 0x5d, 0x5b, 0x38, 0xc7, 0xc9, + 0x96, 0x66, 0x4c, 0xb7, 0x3f, 0xf7, 0x6e, 0x6d, + 0x23, 0x1b, 0xb4, 0xc2, 0x69, 0xc2, 0x54, 0x56, + 0x5f, 0x79, 0x36, 0x57, 0x7c, 0xd9, 0x8b, 0x5d, + 0x89, 0x95, 0x6b, 0xe3, 0x71, 0xa6, 0x8d, 0xd0, + 0x50, 0x79, 0xb2, 0xb0, 0xba, 0xbe, 0x91, 0xf1, + 0xdb, 0xd0, 0xba, 0x36, 0xe2, 0x7e, 0x23, 0x87, + 0x40, 0x34, 0x5c, 0xe2, 0xa4, 0x80, 0x37, 0x74, + 0x0e, 0xea, 0xb0, 0xec, 0xec, 0xad, 0x9f, 0x32, + 0xbf, 0x95, 0x8d, 0xe6, 0xc4, 0x91, 0x39, 0xc1, + 0x9f, 0x36, 0xa4, 0x68, 0x50, 0x31, 0xdb, 0xdc, + 0x62, 0x67, 0xea, 0x9d, 0x4a, 0x8f, 0xcd, 0xec, + 0xa0, 0xd9, 0x7f, 0x63, 0x73, 0x61, 0x2b, 0x62, + 0xb9, 0xa0, 0x7b, 0x9b, 0x89, 0xa1, 0xa6, 0xa2, + 0x8b, 0x7d, 0x8e, 0x4f, 0x7f, 0x7d, 0x03, 0xee, + 0x2d, 0xda, 0x0c, 0x4c, 0x24, 0x12, 0x5d, 0xa4, + 0xd3, 0x5d, 0x17, 0x6e, 0xd7, 0x1a, 0x5f, 0xc0, + 0x47, 0xa8, 0x6f, 0x85, 0xca, 0x4a, 0xca, 0x71, + 0x95, 0xc3, 0x94, 0xd9, 0x3b, 0x5d, 0xc9, 0x2e, + 0x98, 0x6e, 0xf8, 0xe2, 0x8d, 0xef, 0xb9, 0x05, + 0x4b, 0x48, 0xdf, 0xae, 0xaa, 0x76, 0x96, 0x2a, + 0x77, 0xd7, 0x56, 0x6b, 0x6d, 0xec, 0xb9, 0x95, + 0xc4, 0x34, 0xa3, 0x5a, 0xf2, 0x5b, 0xda, 0x77, + 0x8d, 0xf2, 0xae, 0x54, 0x0a, 0x9e, 0x05, 0x25, + 0x16, 0xcf, 0x66, 0xd2, 0xc4, 0x26, 0x6c, 0x63, + 0x0b, 0x86, 0x26, 0xb4, 0xb8, 0x07, 0x11, 0xda, + 0x51, 0xcc, 0x70, 0x6b, 0xda, 0xe2, 0x2b, 0x84, + 0x83, 0x4d, 0xf1, 0x5d, 0x2a, 0xd7, 0x71, 0x68, + 0xfb, 0x9c, 0xd2, 0xdf, 0x38, 0x8e, 0x61, 0x1d, + 0x80, 0x63, 0x65, 0x2f, 0x2e, 0xa0, 0x60, 0x02, + 0x98, 0x00, 0xec, 0xa0, 0xaa, 0xbd, 0xb2, 0x46, + 0xf7, 0x32, 0x40, 0x5a, 0xf6, 0x9a, 0x39, 0xa7, + 0x58, 0x21, 0x79, 0xaf, 0x64, 0xae, 0x9c, 0xca, + 0xe6, 0x3b, 0xbb, 0xf9, 0xee, 0x22, 0xd0, 0xc9, + 0x5e, 0x4b, 0x7b, 0x4b, 0x98, 0xea, 0x34, 0xd7, + 0xb8, 0x82, 0x46, 0x7c, 0x8f, 0x31, 0x82, 0xcc, + 0xde, 0x3d, 0xa3, 0x99, 0xa3, 0x5d, 0xa1, 0xd5, + 0x38, 0x4e, 0xa3, 0xc6, 0xb8, 0x62, 0x8d, 0xf3, + 0x4a, 0xc8, 0x99, 0xa5, 0xd2, 0x10, 0xd6, 0xf6, + 0xca, 0xba, 0x97, 0x32, 0x7b, 0x48, 0x6c, 0x0e, + 0x96, 0xdd, 0x59, 0xb8, 0x8f, 0x39, 0xa1, 0xbe, + 0x92, 0xad, 0xec, 0xdd, 0xbf, 0x3b, 0x9b, 0xc7, + 0x8c, 0x68, 0xb7, 0x0e, 0x91, 0xfd, 0x8c, 0x1e, + 0x2f, 0xd6, 0x41, 0xa7, 0x30, 0xca, 0x2f, 0xb2, + 0xd8, 0xdb, 0x25, 0xd0, 0x68, 0x6b, 0xcd, 0x06, + 0x17, 0x6f, 0x0a, 0xfc, 0x8b, 0xa5, 0xbb, 0x33, + 0x9a, 0xb9, 0xad, 0x78, 0x11, 0x86, 0xbc, 0x07, + 0x36, 0xaf, 0x15, 0xa1, 0x5d, 0x9b, 0x4b, 0x71, + 0xed, 0x39, 0x3d, 0xa4, 0xe7, 0x5c, 0x8f, 0x79, + 0xee, 0x50, 0xad, 0x7b, 0x54, 0x5c, 0x1d, 0x63, + 0x84, 0xd3, 0xf5, 0x00, 0x9a, 0x20, 0x8b, 0xbd, + 0xcb, 0x2f, 0xec, 0x29, 0xed, 0x31, 0x16, 0xb5, + 0xde, 0x4b, 0xc1, 0xa8, 0xe1, 0x0b, 0xcd, 0x9e, + 0x5f, 0x7b, 0x7a, 0x5f, 0xec, 0xd1, 0x99, 0x79, + 0xba, 0x63, 0xa1, 0x68, 0xa5, 0x6b, 0xf3, 0x9d, + 0xd8, 0x53, 0x19, 0x44, 0x92, 0x66, 0x19, 0x2d, + 0xf5, 0x9d, 0xc1, 0x32, 0x73, 0x2d, 0xc7, 0x11, + 0x76, 0x92, 0x01, 0x04, 0xd2, 0xa7, 0xcd, 0x5a, + 0xf2, 0xa1, 0x72, 0xdc, 0x86, 0xf1, 0xd6, 0xa1, + 0xc6, 0x69, 0xe4, 0x8e, 0x38, 0xc3, 0x0f, 0x8d, + 0xf9, 0x69, 0x41, 0xc3, 0x2e, 0x47, 0x9b, 0xc3, + 0x1b, 0xa6, 0x92, 0x02, 0xc6, 0x30, 0x55, 0xce, + 0xc4, 0xda, 0x01, 0xca, 0x5c, 0x15, 0x3b, 0xea, + 0x42, 0xf6, 0x3c, 0xfa, 0xde, 0x2f, 0xfb, 0xc7, + 0xce, 0xd8, 0x9f, 0xa0, 0x97, 0x38, 0x96, 0x9e, + 0xc1, 0xd2, 0xa3, 0xd0, 0x2a, 0x77, 0xd2, 0xa7, + 0x7d, 0x11, 0x02, 0xa7, 0x7d, 0x09, 0x38, 0x4e, + 0x93, 0xa9, 0x10, 0xea, 0x3d, 0xa4, 0x17, 0x4b, + 0xff, 0x00, 0x72, 0xb2, 0x3b, 0xbc, 0xde, 0xbf, + 0xec, 0x85, 0xc4, 0xbb, 0x6f, 0x7d, 0xc6, 0xcb, + 0xec, 0xff, 0x00, 0xba, 0x17, 0x11, 0xd6, 0x80, + 0x88, 0x88, 0x08, 0x35, 0xa2, 0x0d, 0x61, 0x06, + 0x8d, 0xb2, 0xf7, 0xcb, 0x61, 0xb8, 0x22, 0xd5, + 0xdd, 0x55, 0xfa, 0x0d, 0xe5, 0x3f, 0xb6, 0x3e, + 0xfb, 0x6f, 0xf6, 0x5f, 0x29, 0x50, 0x08, 0x14, + 0x1b, 0xc9, 0x41, 0xbc, 0x88, 0x81, 0x41, 0xbc, + 0x94, 0x1b, 0xc8, 0x88, 0x14, 0x1d, 0x85, 0xd0, + 0x32, 0xfb, 0x87, 0x59, 0x3a, 0xfc, 0x34, 0x7b, + 0x3b, 0x5c, 0x58, 0x4e, 0xed, 0x6b, 0xfd, 0x2b, + 0x9c, 0xa9, 0xd8, 0xbf, 0xd2, 0x13, 0x7f, 0xe4, + 0x7a, 0x28, 0x21, 0xed, 0x6d, 0x26, 0xbb, 0x9d, + 0xb6, 0xf0, 0x34, 0x3a, 0x57, 0x6a, 0x07, 0x40, + 0xd5, 0x55, 0xee, 0x3c, 0xbe, 0xea, 0x5b, 0xb7, + 0x59, 0x47, 0x1e, 0x29, 0xd8, 0x4b, 0x5c, 0xc1, + 0xb9, 0x84, 0xd0, 0xd5, 0xcb, 0xb3, 0x66, 0x7f, + 0x9d, 0x41, 0xfd, 0xbf, 0x02, 0x95, 0xca, 0x81, + 0x75, 0xce, 0x76, 0xd8, 0x4d, 0x2e, 0x8b, 0x9f, + 0xcd, 0x53, 0x5d, 0x2a, 0xfd, 0x5d, 0xd4, 0x11, + 0x72, 0x6c, 0xc6, 0x68, 0xc6, 0x39, 0xcd, 0x11, + 0x48, 0x5a, 0x2a, 0x63, 0x63, 0x81, 0x72, 0xe3, + 0xb2, 0xcb, 0xae, 0x6f, 0xa6, 0x74, 0x16, 0xec, + 0x06, 0x46, 0x8a, 0xb9, 0xae, 0x20, 0x52, 0x85, + 0x7a, 0xb2, 0xba, 0xb8, 0xcb, 0x73, 0x06, 0xce, + 0xf6, 0xb8, 0x3e, 0x27, 0x11, 0x23, 0x1c, 0x68, + 0x5d, 0xbe, 0x2a, 0xa6, 0x36, 0x72, 0x76, 0x5d, + 0x67, 0xd7, 0x17, 0x0d, 0x60, 0x8d, 0xb2, 0xb1, + 0xce, 0x0c, 0xd7, 0x4a, 0x90, 0x83, 0x85, 0xdb, + 0x2f, 0x9b, 0x86, 0x97, 0x73, 0x4d, 0x75, 0x3f, + 0x35, 0xaf, 0x69, 0x2a, 0x2d, 0xf1, 0xba, 0x37, + 0x98, 0xe4, 0x6e, 0x07, 0xb4, 0xd1, 0xcd, 0x23, + 0x48, 0x2b, 0xb7, 0x2d, 0x92, 0xf7, 0xac, 0x60, + 0xe6, 0x1c, 0xfc, 0x66, 0x46, 0x82, 0x2a, 0x74, + 0x8a, 0xf8, 0xd5, 0xee, 0x2e, 0x8d, 0xa8, 0x30, + 0xbb, 0x38, 0x90, 0xc4, 0x41, 0x21, 0xad, 0x12, + 0x53, 0xe7, 0xee, 0xa0, 0x8d, 0xb7, 0xb6, 0x92, + 0xea, 0x76, 0x5b, 0xc2, 0x01, 0x92, 0x43, 0x46, + 0x8d, 0x5a, 0x69, 0x55, 0x25, 0xf0, 0xae, 0x71, + 0xea, 0xd9, 0xa3, 0xfa, 0xc1, 0x68, 0xc8, 0x7f, + 0x9c, 0xda, 0x79, 0xff, 0x00, 0xdd, 0x2b, 0xde, + 0x75, 0x2d, 0xc0, 0xcd, 0x6e, 0x83, 0x5e, 0xf0, + 0xd0, 0xf3, 0x40, 0x09, 0xa5, 0x10, 0x72, 0xdf, + 0x58, 0x5c, 0x58, 0x4c, 0x21, 0xb9, 0x68, 0x6b, + 0xc8, 0xc4, 0x00, 0xa1, 0x14, 0xed, 0xae, 0x7a, + 0x0d, 0xe5, 0x21, 0x94, 0xe5, 0xee, 0xcd, 0x6f, + 0x0d, 0xbc, 0xb2, 0xb9, 0x84, 0x30, 0xbf, 0x11, + 0xf1, 0x8e, 0x82, 0x34, 0x69, 0x5a, 0x32, 0xeb, + 0x46, 0xde, 0x66, 0x11, 0x5a, 0x17, 0x96, 0x09, + 0x1c, 0x46, 0x30, 0x2a, 0x74, 0x02, 0xed, 0x48, + 0x31, 0x65, 0x61, 0x71, 0x7a, 0xf7, 0xb2, 0xdd, + 0x81, 0xc6, 0x36, 0xe3, 0x75, 0x48, 0x1a, 0x02, + 0xc4, 0x16, 0x17, 0x33, 0xdb, 0x4d, 0x75, 0x1b, + 0x01, 0x8e, 0xda, 0x9c, 0xe5, 0x48, 0x1a, 0x48, + 0x53, 0x79, 0x05, 0xb8, 0xb6, 0xcc, 0xf3, 0x0b, + 0x70, 0xec, 0x62, 0x18, 0x9e, 0xc0, 0xe3, 0xbb, + 0x43, 0x4a, 0xad, 0x39, 0x4f, 0xf2, 0x1c, 0xd7, + 0xb6, 0xc4, 0x10, 0xac, 0x88, 0xc8, 0xf6, 0xb1, + 0x82, 0xaf, 0x7b, 0x83, 0x5a, 0x37, 0xcb, 0x8d, + 0x02, 0xec, 0x93, 0x25, 0xbc, 0x67, 0xb4, 0xe8, + 0x63, 0x85, 0x95, 0x39, 0xe7, 0x35, 0xd5, 0xd6, + 0xd0, 0x77, 0x56, 0xdd, 0x9e, 0x85, 0x8f, 0xcc, + 0x44, 0xf2, 0xfe, 0xca, 0xd5, 0x8e, 0x9d, 0xff, + 0x00, 0xd9, 0x1a, 0x17, 0x76, 0x57, 0x24, 0x97, + 0x39, 0x56, 0x71, 0x33, 0xbc, 0x67, 0xcc, 0x71, + 0x11, 0xd9, 0x20, 0x9a, 0x20, 0x81, 0x86, 0x17, + 0x4f, 0x33, 0x21, 0x8c, 0x02, 0xf9, 0x1c, 0x1a, + 0xd1, 0xab, 0x49, 0x34, 0x5d, 0x0d, 0xca, 0x2f, + 0x5d, 0x7c, 0x72, 0xf0, 0xc6, 0xfb, 0x4b, 0x45, + 0x48, 0xa8, 0xa6, 0xaa, 0xeb, 0xee, 0xaf, 0x59, + 0x64, 0x32, 0x8c, 0xc6, 0xd4, 0x96, 0x38, 0x01, + 0x2b, 0x2a, 0x48, 0x3f, 0x38, 0x29, 0x4b, 0x9b, + 0x57, 0xdd, 0x6d, 0x5c, 0xd0, 0x47, 0x33, 0xad, + 0xdc, 0x40, 0x22, 0x46, 0x6b, 0xd0, 0xc6, 0xe8, + 0x41, 0x5f, 0x7b, 0x0b, 0x1e, 0xe6, 0x38, 0x00, + 0x5a, 0x48, 0x3d, 0xb1, 0xa1, 0x62, 0x83, 0x79, + 0x48, 0x58, 0xe5, 0x4f, 0xbe, 0xbf, 0x9a, 0x1e, + 0x73, 0x0c, 0x70, 0x17, 0x19, 0xa6, 0x3a, 0x4d, + 0x01, 0xd7, 0xdd, 0x5d, 0xb6, 0xf9, 0x06, 0x5d, + 0x7d, 0x36, 0x1b, 0x0b, 0xe3, 0x23, 0x19, 0xfb, + 0x50, 0xe6, 0xd1, 0xc3, 0x79, 0xcd, 0xd0, 0x2a, + 0x2a, 0x82, 0x2a, 0x0b, 0x0b, 0x8b, 0x88, 0x26, + 0xb8, 0x89, 0x81, 0xd1, 0xc0, 0x2b, 0x21, 0xa8, + 0x04, 0x76, 0x97, 0x3d, 0x06, 0xf0, 0x56, 0x1c, + 0x82, 0xdf, 0x9c, 0xcb, 0xf3, 0x48, 0x03, 0x83, + 0x6b, 0xe2, 0x87, 0xbf, 0x50, 0x00, 0x11, 0x57, + 0x53, 0x79, 0x69, 0x8f, 0x24, 0xcb, 0x6e, 0xad, + 0xe5, 0x16, 0x17, 0x8e, 0x9a, 0xe2, 0x06, 0xe2, + 0x7b, 0x5c, 0xda, 0x34, 0xd3, 0x5d, 0x34, 0x20, + 0x84, 0xa0, 0xde, 0x4a, 0x6f, 0x0a, 0x9d, 0xc0, + 0x02, 0x77, 0xbb, 0x0b, 0xaf, 0x29, 0x31, 0x0c, + 0xce, 0xd7, 0x9d, 0xf2, 0x0c, 0xac, 0xad, 0x75, + 0x6b, 0x18, 0x50, 0x75, 0x45, 0xb3, 0x39, 0x9c, + 0x91, 0xb5, 0xe5, 0xb1, 0xc4, 0x1e, 0x2a, 0xd6, + 0xc8, 0xe0, 0x09, 0xee, 0x2e, 0x1b, 0xcb, 0x1b, + 0x9b, 0x19, 0xb9, 0x9b, 0x98, 0xf0, 0x3f, 0x58, + 0x3a, 0xc1, 0x1b, 0xe1, 0x48, 0x6d, 0x3c, 0x77, + 0x6d, 0xcd, 0x64, 0x96, 0x4c, 0x5c, 0xd1, 0xa1, + 0x81, 0xdf, 0x9b, 0x40, 0x05, 0x40, 0xee, 0xad, + 0x37, 0xf9, 0x99, 0xcc, 0x2d, 0xac, 0xed, 0xde, + 0xca, 0x49, 0x6f, 0xfa, 0xb7, 0x4d, 0x5a, 0x93, + 0x50, 0x1b, 0xe1, 0x41, 0x1d, 0x41, 0xbc, 0x94, + 0x1b, 0xca, 0x7a, 0xeb, 0x21, 0xcb, 0x6c, 0x67, + 0xc1, 0x7d, 0x7c, 0x63, 0x6b, 0xc0, 0xe6, 0xc3, + 0x5b, 0x57, 0x1d, 0xf2, 0xed, 0x06, 0x82, 0xaa, + 0x3f, 0x34, 0xca, 0x64, 0xb1, 0xb9, 0x64, 0x2c, + 0x77, 0x3d, 0x1c, 0xe0, 0x18, 0x1e, 0x34, 0x62, + 0xa9, 0xd1, 0x54, 0x1c, 0x34, 0x1b, 0xc9, 0x41, + 0xbc, 0xa6, 0xce, 0x4b, 0x95, 0xdb, 0xbd, 0x96, + 0xd7, 0xd7, 0xae, 0x65, 0xe4, 0x80, 0x1c, 0x2c, + 0x6d, 0x5a, 0xd2, 0x75, 0x03, 0xa1, 0x70, 0xdc, + 0x65, 0x37, 0x51, 0x66, 0x63, 0x2e, 0x14, 0x74, + 0x8f, 0x70, 0x0c, 0x76, 0xa0, 0x43, 0xb5, 0x39, + 0x07, 0x15, 0x06, 0xf2, 0x50, 0x6f, 0x29, 0xc1, + 0x92, 0x65, 0x26, 0xe3, 0xd8, 0x5b, 0x7c, 0xf3, + 0x79, 0x4a, 0x79, 0x23, 0x9b, 0x2f, 0xde, 0xaa, + 0xe2, 0xb4, 0xc9, 0xee, 0x2e, 0x33, 0x27, 0x65, + 0xee, 0x22, 0x37, 0x44, 0x4f, 0x3c, 0xed, 0x60, + 0x01, 0xba, 0x3b, 0x7a, 0x10, 0x72, 0xda, 0x5a, + 0x4d, 0x79, 0x70, 0xcb, 0x6b, 0x76, 0x83, 0x2c, + 0x95, 0xc2, 0x0e, 0x81, 0xa0, 0x54, 0xf7, 0x82, + 0xf1, 0x2c, 0x4e, 0x8a, 0x57, 0x44, 0xf0, 0x03, + 0xe3, 0x25, 0xae, 0x1d, 0x90, 0xac, 0xb9, 0x36, + 0x5b, 0x96, 0xb3, 0x35, 0x8a, 0x4b, 0x1b, 0xb3, + 0x3b, 0xed, 0xcb, 0x8c, 0xb1, 0xbd, 0xb8, 0x4d, + 0x0b, 0x5c, 0xdc, 0x4c, 0xd0, 0x37, 0x4a, 0x80, + 0xcc, 0x7f, 0x98, 0x5d, 0x7d, 0xb3, 0xfc, 0x28, + 0x39, 0xe8, 0x37, 0x92, 0x83, 0x79, 0x11, 0x02, + 0x83, 0x79, 0x28, 0x37, 0x91, 0x10, 0x28, 0x37, + 0x97, 0xa8, 0xf4, 0x48, 0xc2, 0x34, 0x1c, 0x43, + 0x4f, 0x75, 0x79, 0x5e, 0xa3, 0xfd, 0xa3, 0x3c, + 0xe1, 0xe1, 0x41, 0x74, 0xce, 0xbd, 0xe5, 0x9e, + 0x67, 0xca, 0x57, 0x02, 0xef, 0xce, 0xbd, 0xe5, + 0x9e, 0x67, 0xca, 0xb8, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x07, 0xa8, 0xbf, 0x68, 0xde, + 0xda, 0x92, 0x51, 0xb1, 0x7e, 0xd1, 0xbd, 0xb5, + 0x24, 0x80, 0xb8, 0x6f, 0xfd, 0xea, 0xd3, 0xed, + 0x3e, 0x50, 0xbb, 0x97, 0x0d, 0xff, 0x00, 0xbd, + 0x5a, 0x7d, 0xa7, 0xca, 0x10, 0x62, 0xc3, 0xde, + 0xae, 0xfc, 0xf3, 0xf5, 0x8a, 0xef, 0x5c, 0x16, + 0x1e, 0xf5, 0x77, 0xe7, 0x9f, 0xac, 0x57, 0x7a, + 0x0c, 0x6e, 0x15, 0x18, 0x7e, 0x52, 0xa4, 0xf7, + 0x0a, 0x8c, 0x3f, 0x29, 0x40, 0x44, 0x44, 0x1e, + 0xf3, 0xcf, 0xf4, 0xe4, 0x3f, 0x6c, 0xdf, 0xef, + 0x2a, 0xaa, 0xb5, 0x67, 0x9f, 0xe9, 0xc8, 0x7e, + 0xd9, 0xbf, 0xde, 0x55, 0x54, 0x04, 0x44, 0x40, + 0x4d, 0x3b, 0x88, 0x9a, 0x77, 0x10, 0x58, 0xb6, + 0x76, 0xd8, 0xf5, 0x65, 0xe5, 0xc8, 0x73, 0x62, + 0x7c, 0xff, 0x00, 0xa8, 0x89, 0xef, 0x34, 0x68, + 0x1b, 0xbd, 0xd5, 0xd5, 0x93, 0x65, 0x3c, 0xc4, + 0x37, 0x76, 0x8f, 0xb8, 0x86, 0x78, 0xee, 0x63, + 0xa6, 0x18, 0xdd, 0x52, 0x0e, 0x90, 0x4f, 0x7d, + 0x45, 0x5f, 0xdf, 0x5a, 0x75, 0x2d, 0xa5, 0x85, + 0xac, 0x98, 0xdc, 0x09, 0x92, 0xe0, 0x00, 0x45, + 0x1d, 0xe5, 0x53, 0x48, 0x1b, 0xf4, 0xd0, 0xb9, + 0x72, 0x7b, 0xc6, 0xd9, 0x66, 0x50, 0x5c, 0x3c, + 0xe1, 0x8d, 0xae, 0xa3, 0xcd, 0x09, 0xa3, 0x5d, + 0xe2, 0x9e, 0x0a, 0xd5, 0x04, 0xae, 0xcf, 0x4f, + 0x35, 0xa6, 0x57, 0x99, 0xca, 0xda, 0x09, 0xa1, + 0x23, 0xca, 0x1a, 0x31, 0x01, 0x43, 0x5e, 0xea, + 0xe5, 0x76, 0xd6, 0x66, 0xee, 0x69, 0x69, 0x31, + 0x78, 0xc2, 0x87, 0xc4, 0x5d, 0xb6, 0xd7, 0xd9, + 0x30, 0x76, 0x67, 0x03, 0xee, 0x4b, 0x2d, 0xef, + 0x1e, 0x0c, 0x6f, 0x0d, 0x7d, 0x68, 0x47, 0x8d, + 0xf9, 0xbb, 0xeb, 0x93, 0xd8, 0x36, 0x63, 0xef, + 0x39, 0x7f, 0x76, 0x7f, 0x86, 0x83, 0x8a, 0xd1, + 0xf9, 0xa5, 0x84, 0x2d, 0xcc, 0x2d, 0xf1, 0x47, + 0x03, 0x8e, 0x0c, 0x75, 0x18, 0x5c, 0x47, 0xe6, + 0xb9, 0xbb, 0xaa, 0x66, 0xc3, 0x30, 0xb5, 0xcf, + 0x64, 0x36, 0x59, 0x8d, 0xbb, 0x44, 0xee, 0x69, + 0xc1, 0x70, 0xc1, 0x4a, 0x90, 0x37, 0xf5, 0xe8, + 0x5c, 0x96, 0x17, 0x99, 0x74, 0xb6, 0x12, 0xe5, + 0x17, 0x92, 0xba, 0x38, 0x44, 0x85, 0xd6, 0xf7, + 0x14, 0x27, 0x76, 0xa2, 0xa0, 0x2d, 0xb6, 0x67, + 0x26, 0xc9, 0x9e, 0xeb, 0xa6, 0x5d, 0x1b, 0xcb, + 0x8c, 0x25, 0xb0, 0xb1, 0xad, 0xa0, 0x15, 0xdd, + 0x28, 0x20, 0xee, 0x21, 0x30, 0x5c, 0x4b, 0x01, + 0x35, 0x31, 0x3c, 0xb2, 0xbb, 0xf4, 0xd4, 0x56, + 0xbd, 0xc3, 0xf9, 0x6e, 0x29, 0x4c, 0xaa, 0x2b, + 0x2c, 0xc2, 0xe2, 0xe9, 0xd7, 0xa4, 0xf3, 0xd2, + 0x35, 0xd3, 0x42, 0x01, 0x23, 0xc6, 0x38, 0x9c, + 0xfa, 0xd3, 0x46, 0x85, 0x17, 0xb9, 0xdb, 0x08, + 0x27, 0xad, 0xbf, 0xd2, 0x37, 0x5f, 0x6c, 0x3e, + 0xb3, 0x17, 0x06, 0x46, 0xd2, 0xfc, 0xe2, 0xd0, + 0x0d, 0xc7, 0x87, 0x1e, 0xe5, 0x57, 0x6e, 0x5b, + 0x75, 0x96, 0x3b, 0x24, 0x97, 0x2f, 0xbc, 0xb8, + 0x30, 0x3a, 0x59, 0x31, 0x68, 0x6b, 0x9c, 0x68, + 0x0b, 0x4e, 0xe3, 0x48, 0xdc, 0x5e, 0xed, 0xae, + 0xb2, 0x2c, 0xa0, 0x3a, 0x7b, 0x49, 0x5f, 0x79, + 0x76, 0x41, 0x0c, 0x2e, 0x69, 0x68, 0x1c, 0x20, + 0x20, 0xec, 0xb0, 0x70, 0x76, 0xd6, 0x5f, 0x38, + 0x6a, 0x11, 0xb8, 0x57, 0xb2, 0xde, 0x6d, 0x47, + 0x3f, 0x6b, 0x73, 0x76, 0xbd, 0xc0, 0x18, 0xa8, + 0x09, 0x03, 0xc4, 0xde, 0x3d, 0xb5, 0xaf, 0x67, + 0xef, 0xe0, 0xb6, 0xcc, 0xa5, 0xb9, 0xbd, 0x93, + 0x00, 0x95, 0x8e, 0x05, 0xf4, 0x27, 0xc6, 0x71, + 0x07, 0x70, 0x15, 0xb5, 0xd6, 0x5b, 0x30, 0xe7, + 0x17, 0x1c, 0xca, 0x4f, 0x18, 0x92, 0x7f, 0x56, + 0x77, 0x7f, 0xfc, 0x68, 0x38, 0x62, 0x39, 0x9c, + 0xd2, 0xcd, 0x99, 0xdb, 0xe2, 0x6b, 0xe2, 0x25, + 0xf2, 0xca, 0xca, 0x34, 0x36, 0xba, 0x4e, 0x8a, + 0x95, 0x27, 0x67, 0x9f, 0xb6, 0xf6, 0x46, 0x5a, + 0x66, 0xb0, 0x32, 0x76, 0x48, 0x43, 0x04, 0xb4, + 0x00, 0xb6, 0xbb, 0xbb, 0xab, 0x55, 0x85, 0xee, + 0x59, 0x63, 0x73, 0x73, 0x68, 0x64, 0x74, 0xd9, + 0x7d, 0xd3, 0x03, 0x4c, 0xb8, 0x4d, 0x41, 0xa6, + 0x92, 0x45, 0x2a, 0xbd, 0x5b, 0xd9, 0x64, 0x16, + 0x73, 0x36, 0xe5, 0xd7, 0xfc, 0xf4, 0x71, 0x9c, + 0x4c, 0x85, 0xad, 0x35, 0x24, 0x69, 0x00, 0xe8, + 0x41, 0x1f, 0x9c, 0xd8, 0x32, 0xc3, 0x31, 0x92, + 0xde, 0x33, 0x58, 0xc5, 0x0b, 0x2b, 0xae, 0x8e, + 0xf1, 0xbe, 0x55, 0xc4, 0xa5, 0x9b, 0x73, 0x6b, + 0x9b, 0x67, 0xa2, 0x4b, 0xea, 0xb2, 0x09, 0x8e, + 0x16, 0x80, 0x48, 0x23, 0x45, 0x18, 0x3c, 0x5a, + 0xee, 0xa8, 0xfb, 0xc8, 0x99, 0x0d, 0xe4, 0xf0, + 0xc7, 0xe4, 0xc7, 0x23, 0x9a, 0x34, 0xd7, 0x40, + 0x3a, 0x34, 0xa0, 0xdb, 0x66, 0x33, 0x18, 0x58, + 0xeb, 0xfb, 0x4c, 0x4c, 0x6c, 0x27, 0x0b, 0xe5, + 0x07, 0x40, 0x27, 0x71, 0xc3, 0x75, 0x4b, 0xd8, + 0xe7, 0x51, 0x66, 0x73, 0x32, 0xcb, 0x35, 0xb7, + 0x8e, 0x5e, 0x77, 0xc4, 0x64, 0xcd, 0x14, 0x38, + 0xbb, 0x3b, 0xcb, 0x8f, 0x26, 0xbf, 0xb4, 0x8e, + 0xde, 0xe3, 0x2f, 0xbe, 0x25, 0xb6, 0xd7, 0x3a, + 0x71, 0x81, 0x5c, 0x2e, 0xa5, 0x2b, 0xa3, 0xb4, + 0xba, 0x2d, 0x6d, 0xf2, 0x2c, 0xb6, 0x66, 0xde, + 0x3a, 0xf7, 0xda, 0x8c, 0x5e, 0x34, 0x51, 0x31, + 0xb4, 0x24, 0xee, 0x55, 0x07, 0x56, 0x49, 0x69, + 0xec, 0x19, 0xcd, 0xfd, 0xbb, 0x09, 0x70, 0x8a, + 0x22, 0x58, 0xe7, 0x69, 0x34, 0xa8, 0x23, 0x81, + 0x47, 0x33, 0x6a, 0x73, 0xa2, 0x5a, 0x0c, 0xac, + 0xa1, 0x20, 0x1f, 0x10, 0x71, 0x2d, 0xd9, 0x5e, + 0x71, 0x6f, 0xd6, 0x57, 0xb7, 0x97, 0x6f, 0xe6, + 0x85, 0xcc, 0x65, 0xac, 0x14, 0x2e, 0xde, 0xa0, + 0xf1, 0x41, 0x50, 0x6c, 0xd0, 0xe6, 0x93, 0xb8, + 0x45, 0x78, 0x50, 0x58, 0xf6, 0x82, 0x03, 0x77, + 0x9f, 0x59, 0x41, 0xbb, 0x24, 0x6c, 0x07, 0xb4, + 0x5c, 0x6b, 0xde, 0x5b, 0xb3, 0x9c, 0xb6, 0x4b, + 0xbc, 0xc9, 0xb3, 0xc5, 0x77, 0x04, 0x4d, 0x80, + 0x31, 0xac, 0x63, 0xdd, 0x42, 0xdc, 0x3a, 0x74, + 0xf0, 0xac, 0x3b, 0x37, 0xca, 0x4e, 0x75, 0x1d, + 0xe9, 0x9a, 0xb1, 0xc1, 0x6d, 0x85, 0x87, 0x0b, + 0xb4, 0xc9, 0x53, 0xa3, 0xc9, 0xde, 0x2a, 0xb3, + 0x3c, 0x8e, 0x9e, 0x69, 0x25, 0x7e, 0x97, 0x3d, + 0xc5, 0xdc, 0xad, 0x3d, 0xe4, 0x13, 0x7b, 0x5d, + 0x08, 0xf6, 0xa8, 0x2e, 0xda, 0x41, 0x6c, 0xf1, + 0xe9, 0x73, 0x74, 0x82, 0x5b, 0xbb, 0xc1, 0x45, + 0x02, 0xa5, 0xe6, 0xbe, 0xb3, 0xb8, 0xc8, 0x6d, + 0xed, 0xa5, 0x92, 0x97, 0x56, 0xd2, 0x02, 0x1b, + 0x43, 0xa6, 0x3a, 0x90, 0x74, 0xd2, 0x9e, 0x4e, + 0x9d, 0x6b, 0x46, 0x75, 0x6b, 0x65, 0x6f, 0x34, + 0x26, 0xc4, 0x93, 0x04, 0xd1, 0x36, 0x56, 0x92, + 0x49, 0xad, 0x49, 0x1a, 0x8e, 0xad, 0x48, 0x31, + 0x91, 0xe5, 0xec, 0xcc, 0x2f, 0xdb, 0x14, 0xbf, + 0xb1, 0x60, 0x32, 0x49, 0x43, 0x43, 0x41, 0xb9, + 0xdd, 0x52, 0x96, 0xf9, 0xbd, 0xbd, 0xfc, 0xf2, + 0xe5, 0x77, 0x2c, 0x6c, 0x56, 0x13, 0x7e, 0xaa, + 0xdc, 0x34, 0x53, 0x03, 0x9b, 0xab, 0x85, 0x45, + 0x64, 0xf9, 0x8f, 0x57, 0x5f, 0x36, 0xe0, 0x8c, + 0x4c, 0x20, 0xb2, 0x40, 0x35, 0xe1, 0x2b, 0xb9, + 0xf6, 0x1b, 0x3b, 0x24, 0xae, 0xb9, 0x6d, 0xf9, + 0x64, 0x2e, 0x76, 0x27, 0x44, 0x1a, 0x71, 0x8d, + 0xda, 0x03, 0x4a, 0xeb, 0x41, 0xaa, 0xef, 0x26, + 0x65, 0x86, 0x57, 0x2c, 0xd7, 0x4d, 0x70, 0xbb, + 0x13, 0xf3, 0x71, 0x10, 0x7c, 0x52, 0xc1, 0x4d, + 0x34, 0xec, 0x8a, 0xa8, 0x73, 0xe4, 0x91, 0xd8, + 0x56, 0x0c, 0xe3, 0x34, 0xcb, 0xf3, 0x5b, 0x20, + 0x1a, 0xf7, 0x41, 0x3d, 0xab, 0x8f, 0x30, 0xc7, + 0xe2, 0x3c, 0xe3, 0x48, 0xa1, 0xae, 0x10, 0x45, + 0x7b, 0x6a, 0xbe, 0x75, 0x50, 0x20, 0xb6, 0xde, + 0xdd, 0x7b, 0x35, 0xe6, 0x49, 0x31, 0x34, 0x6e, + 0x0c, 0x2e, 0xf3, 0x5e, 0x1a, 0xd2, 0xb5, 0x98, + 0x0e, 0x56, 0xdc, 0xea, 0xe8, 0x0c, 0x26, 0xbc, + 0xdc, 0x27, 0xed, 0x00, 0x23, 0xeb, 0x05, 0x1d, + 0x9e, 0x5f, 0xdb, 0x5c, 0xc5, 0x62, 0x2d, 0xa4, + 0xc6, 0xf8, 0x23, 0xa3, 0xf4, 0x11, 0x85, 0xde, + 0x2e, 0xf8, 0x1b, 0xcb, 0xa7, 0x3d, 0xce, 0xad, + 0x6f, 0x32, 0xd8, 0x20, 0x81, 0xf8, 0xa5, 0x73, + 0x9a, 0xe9, 0xc5, 0x08, 0xd2, 0xd6, 0xd3, 0x4d, + 0x46, 0x94, 0x1a, 0xf3, 0x71, 0xff, 0x00, 0xd6, + 0xb2, 0xc0, 0x35, 0x00, 0x40, 0xe4, 0x95, 0xeb, + 0x6a, 0xf5, 0xd8, 0x9d, 0xce, 0x60, 0x7c, 0x8b, + 0x9f, 0x31, 0xbd, 0xb5, 0x9f, 0x23, 0xb1, 0xb4, + 0x8a, 0x4c, 0x53, 0xc3, 0xfb, 0x56, 0xd0, 0x8a, + 0x68, 0x3b, 0xa4, 0x51, 0x77, 0x66, 0x32, 0xe4, + 0x39, 0x93, 0x6d, 0xcc, 0xb7, 0xce, 0x85, 0xd0, + 0xc6, 0x18, 0x43, 0x63, 0x71, 0xde, 0xaf, 0xe6, + 0xa0, 0xd5, 0xb3, 0x3e, 0x25, 0xae, 0x65, 0x31, + 0xf2, 0x44, 0x54, 0xee, 0xd1, 0xca, 0x32, 0xdb, + 0x35, 0xbe, 0xb7, 0xb0, 0x75, 0xa4, 0x2e, 0xe6, + 0xe1, 0x90, 0x92, 0x5e, 0xd0, 0x43, 0xb4, 0x8a, + 0x68, 0x70, 0x3a, 0x17, 0x75, 0xee, 0x65, 0x61, + 0x6f, 0x97, 0x1c, 0xb3, 0x2b, 0xab, 0x9b, 0x21, + 0xac, 0xd3, 0xbc, 0x53, 0x17, 0xcb, 0xa5, 0x79, + 0xb0, 0xbc, 0xb0, 0xb8, 0xca, 0xdd, 0x94, 0xdf, + 0xc8, 0x60, 0x6b, 0x5d, 0x8e, 0x09, 0x68, 0x48, + 0x04, 0x9a, 0xd0, 0xd1, 0x07, 0x4e, 0xcf, 0xcd, + 0x2d, 0xe5, 0xad, 0xf5, 0x8d, 0xcb, 0xdd, 0x2c, + 0x46, 0x12, 0xf6, 0x97, 0x9c, 0x44, 0x11, 0x51, + 0xbb, 0xd9, 0xd2, 0xab, 0xc3, 0x52, 0x9c, 0x6d, + 0xc6, 0x5f, 0x94, 0x59, 0x5c, 0x47, 0x6b, 0x71, + 0xed, 0x97, 0x97, 0x4d, 0xe6, 0xf9, 0xc6, 0xb7, + 0x0b, 0x5a, 0xdf, 0xc8, 0xa8, 0x34, 0x04, 0x44, + 0x40, 0x43, 0xa8, 0xf6, 0x91, 0x0e, 0xa3, 0xda, + 0x41, 0x74, 0xbd, 0xf7, 0x1b, 0x2f, 0xb3, 0xfe, + 0xe8, 0x5c, 0x47, 0x5a, 0xed, 0xbd, 0xf7, 0x1b, + 0x2f, 0xb3, 0xfe, 0xe8, 0x5c, 0x47, 0x5a, 0x02, + 0x22, 0x20, 0x20, 0xd6, 0x11, 0x06, 0xb0, 0x83, + 0x9f, 0x6c, 0x7d, 0xf6, 0xdf, 0xec, 0x7e, 0x52, + 0xa0, 0x14, 0xfe, 0xd8, 0xfb, 0xed, 0xbf, 0xd8, + 0xfc, 0xa5, 0x40, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x29, 0xd8, 0xb4, 0xec, 0x8c, 0xd4, 0xe9, + 0x1e, 0x8a, 0x82, 0x53, 0x19, 0x4d, 0xfd, 0x90, + 0xb2, 0x9f, 0x2b, 0xbe, 0x71, 0x64, 0x13, 0x9c, + 0x4c, 0x94, 0x0a, 0xe1, 0x71, 0xff, 0x00, 0xe1, + 0x06, 0xbd, 0x9a, 0xfe, 0x75, 0x07, 0xf6, 0xfc, + 0x09, 0x33, 0x2f, 0xe3, 0xcc, 0x2f, 0x6f, 0xac, + 0xf1, 0x35, 0xb0, 0x4c, 0xfc, 0x72, 0xb4, 0xe8, + 0x00, 0xb8, 0xeb, 0xdf, 0x5d, 0x96, 0x87, 0x26, + 0xc9, 0xe4, 0x75, 0xe3, 0x6e, 0xbd, 0xb2, 0xe1, + 0xad, 0x2d, 0x86, 0x36, 0xb4, 0x8d, 0x63, 0x75, + 0x73, 0x65, 0x19, 0xac, 0x0c, 0x37, 0x76, 0xf7, + 0xf5, 0x16, 0xf7, 0xda, 0x5e, 0xf1, 0xa4, 0xb5, + 0xdd, 0xc4, 0x1d, 0x56, 0x79, 0xf4, 0x59, 0x84, + 0xac, 0xb5, 0xcd, 0xad, 0xa3, 0x99, 0xb2, 0x90, + 0xc6, 0x4c, 0x05, 0x1c, 0x09, 0xd5, 0x51, 0xac, + 0x77, 0x16, 0xfc, 0x9e, 0xc5, 0xb6, 0x1b, 0x49, + 0x71, 0x6c, 0xd3, 0x56, 0x32, 0x2a, 0xb0, 0x9f, + 0x9a, 0xea, 0x1a, 0x15, 0xc9, 0x6f, 0x69, 0x90, + 0xd9, 0x4e, 0xdb, 0xb7, 0xdf, 0xfb, 0x43, 0x63, + 0x38, 0xa3, 0x89, 0x8c, 0x20, 0x92, 0x35, 0x55, + 0x67, 0x2c, 0xce, 0xe0, 0x39, 0xe4, 0xf9, 0x85, + 0xdb, 0xb9, 0x96, 0x4a, 0xcc, 0x2d, 0xd0, 0x5d, + 0x4a, 0x50, 0x01, 0xe2, 0x82, 0x83, 0x5c, 0x1b, + 0x53, 0x98, 0x47, 0x28, 0xe7, 0x5b, 0x1b, 0xe3, + 0x27, 0xc7, 0x0d, 0x6e, 0x17, 0x61, 0xdd, 0xa3, + 0x82, 0xd5, 0xb4, 0x76, 0x10, 0x59, 0xde, 0x31, + 0xd0, 0x0a, 0x45, 0x70, 0xde, 0x70, 0x02, 0x49, + 0xa3, 0xbf, 0x3b, 0x5e, 0xfa, 0xda, 0xcb, 0x5d, + 0x99, 0x8a, 0x41, 0x23, 0xef, 0xa4, 0x99, 0xad, + 0x38, 0x8c, 0x42, 0x37, 0x00, 0x7b, 0x1a, 0x5a, + 0xb9, 0x73, 0xac, 0xcc, 0x66, 0x37, 0x9c, 0xeb, + 0x1a, 0x59, 0x14, 0x6d, 0xc1, 0x10, 0x3a, 0xe9, + 0xba, 0x50, 0x63, 0x21, 0xfe, 0x73, 0x69, 0xe7, + 0xff, 0x00, 0x74, 0xa9, 0x4c, 0xcf, 0x69, 0x33, + 0x1b, 0x6c, 0xc2, 0x7b, 0x78, 0xf9, 0xac, 0x11, + 0xb8, 0xb5, 0xa5, 0xcd, 0xa9, 0xf0, 0xa8, 0x7c, + 0xa2, 0x78, 0xad, 0xf3, 0x3b, 0x69, 0xe6, 0x76, + 0x08, 0xa3, 0x7d, 0x5e, 0xea, 0x13, 0x41, 0x43, + 0xbc, 0xb1, 0x9a, 0xcf, 0x15, 0xc6, 0x63, 0x71, + 0x34, 0x2e, 0xc5, 0x1c, 0x8f, 0xab, 0x5d, 0x42, + 0x2a, 0x3b, 0xa8, 0x26, 0x76, 0x76, 0xf6, 0x6b, + 0xec, 0xf5, 0xf7, 0x13, 0xd0, 0x3d, 0xd0, 0x91, + 0xe2, 0x8c, 0x23, 0x45, 0x3b, 0x25, 0x46, 0xec, + 0xff, 0x00, 0xf3, 0xcb, 0x4f, 0x38, 0xfd, 0x47, + 0x26, 0x41, 0x7f, 0x0d, 0x86, 0x62, 0xd9, 0xa7, + 0xa8, 0x89, 0xcd, 0x2c, 0x73, 0x87, 0xe6, 0xd6, + 0x9a, 0x57, 0x7d, 0xab, 0x32, 0x1c, 0xbb, 0x30, + 0x65, 0xd7, 0xb5, 0x99, 0xbc, 0x72, 0x63, 0x63, + 0x58, 0x68, 0xca, 0x82, 0x31, 0x38, 0x8d, 0x28, + 0x37, 0xe5, 0x7f, 0xcf, 0x73, 0x5f, 0x36, 0x4f, + 0xac, 0xb9, 0x32, 0x8f, 0xe4, 0x39, 0xaf, 0x6d, + 0x8b, 0x39, 0x7e, 0x65, 0x65, 0x0e, 0x6d, 0x98, + 0x5c, 0x49, 0x26, 0x18, 0x67, 0x6b, 0xc4, 0x4e, + 0xa3, 0x8d, 0x6a, 0x74, 0x68, 0x02, 0xa3, 0xba, + 0xb9, 0xf2, 0xeb, 0xdb, 0x68, 0x72, 0x8c, 0xc2, + 0xd6, 0x49, 0x03, 0x26, 0xb8, 0xc2, 0x22, 0x6d, + 0x09, 0xaf, 0x74, 0x0a, 0x20, 0xcd, 0xbf, 0xfd, + 0xa6, 0xcf, 0xdc, 0x4d, 0xaa, 0x4b, 0xd7, 0x88, + 0x59, 0xbf, 0x81, 0xba, 0x5c, 0xbb, 0x36, 0x76, + 0x79, 0x2d, 0xf2, 0x9c, 0xca, 0x78, 0x88, 0x12, + 0x47, 0x47, 0x30, 0xeb, 0xd3, 0x42, 0xa3, 0xf3, + 0x8b, 0x88, 0x4c, 0x56, 0x96, 0x96, 0xee, 0xc7, + 0x15, 0xb4, 0x40, 0xbc, 0x8d, 0x46, 0x47, 0x1a, + 0xb9, 0x6c, 0xca, 0xaf, 0xad, 0x6d, 0xf2, 0x9c, + 0xc2, 0xde, 0x67, 0xe1, 0x96, 0x70, 0x39, 0xa6, + 0xd0, 0x9a, 0xe8, 0xdf, 0x02, 0x88, 0x3a, 0x2c, + 0x76, 0x9b, 0x37, 0x9e, 0xf6, 0x08, 0x64, 0x91, + 0x85, 0x92, 0x48, 0xd6, 0xba, 0x8c, 0x03, 0x41, + 0x34, 0x5d, 0x70, 0x81, 0xf1, 0xa4, 0x87, 0xfa, + 0xa7, 0xea, 0x34, 0x2a, 0xed, 0x84, 0xac, 0x86, + 0xfa, 0xde, 0x59, 0x0e, 0x16, 0x47, 0x23, 0x5c, + 0xe3, 0xae, 0x80, 0x1d, 0x3a, 0x94, 0xc4, 0x79, + 0xa5, 0x8b, 0x76, 0x9e, 0x4b, 0xe3, 0x2d, 0x2d, + 0x9c, 0xd2, 0x04, 0x98, 0x5d, 0xf3, 0x40, 0xd5, + 0x4a, 0xa0, 0xf7, 0x96, 0x8a, 0x58, 0xe7, 0x8e, + 0x6f, 0x97, 0x57, 0xb7, 0xb9, 0xe3, 0x2e, 0x5d, + 0x93, 0x71, 0x19, 0xc3, 0x40, 0xd4, 0xe8, 0x9f, + 0xc0, 0x08, 0xd2, 0x99, 0x66, 0x67, 0x05, 0xb5, + 0xed, 0xd8, 0x98, 0x17, 0xd9, 0xdd, 0x97, 0x09, + 0x0b, 0x41, 0xd0, 0x09, 0x34, 0x75, 0x3b, 0xaa, + 0x4b, 0x21, 0x66, 0x4f, 0x06, 0x60, 0x63, 0xb1, + 0x95, 0xf7, 0x32, 0x48, 0xc7, 0x7e, 0xb1, 0xcd, + 0xc2, 0xd6, 0x34, 0x11, 0xa3, 0x48, 0x15, 0xaa, + 0x0e, 0x4c, 0xaf, 0xf9, 0x66, 0x73, 0xdd, 0xaf, + 0x7d, 0x6b, 0xd9, 0x3f, 0x7d, 0x9f, 0xec, 0x1d, + 0xe1, 0x0b, 0xc5, 0x8d, 0xf5, 0xac, 0x16, 0x59, + 0x9c, 0x32, 0x49, 0x86, 0x4b, 0x8a, 0x88, 0x45, + 0x09, 0xc5, 0xaf, 0x74, 0x0f, 0x0a, 0xf1, 0xb3, + 0xd7, 0xb6, 0xd6, 0x77, 0x53, 0x49, 0x72, 0xfe, + 0x6d, 0xaf, 0x89, 0xcd, 0x69, 0xa1, 0x3a, 0x49, + 0x1a, 0x3c, 0x50, 0x50, 0x69, 0xcb, 0xa2, 0xc9, + 0x9f, 0x13, 0x9d, 0x98, 0x4b, 0x24, 0x72, 0x83, + 0x46, 0x88, 0xc5, 0x46, 0x14, 0xbb, 0xb5, 0xb3, + 0x96, 0xe2, 0x28, 0x32, 0x83, 0x24, 0xee, 0x78, + 0x21, 0xcd, 0x76, 0x83, 0x8b, 0x5e, 0x8f, 0xec, + 0xae, 0x05, 0xbe, 0xce, 0xe4, 0xda, 0x5d, 0x43, + 0x72, 0xd1, 0x88, 0xc4, 0xe0, 0xe2, 0x06, 0xee, + 0xe1, 0x1c, 0x08, 0x24, 0xa0, 0xcf, 0xf3, 0x3b, + 0x42, 0xeb, 0x4b, 0xc6, 0xb6, 0xe2, 0x38, 0x8e, + 0x07, 0xc7, 0x28, 0xab, 0x87, 0x62, 0xab, 0x66, + 0x6d, 0x63, 0x64, 0xeb, 0x6b, 0x5c, 0xd2, 0xc9, + 0x9c, 0xcb, 0x27, 0x7b, 0x5a, 0xf8, 0xb7, 0x31, + 0x57, 0x73, 0x81, 0x7b, 0xbc, 0xb7, 0xc8, 0xb3, + 0x2b, 0x87, 0x5d, 0xb6, 0xfb, 0xd9, 0xcc, 0x9a, + 0x65, 0x8d, 0xcd, 0x24, 0x83, 0xd8, 0xd0, 0xb4, + 0x66, 0x99, 0x95, 0xa3, 0xe2, 0xb6, 0xcb, 0xac, + 0x6a, 0x6d, 0xad, 0xdc, 0x09, 0x79, 0xd1, 0x89, + 0xd5, 0xde, 0x40, 0xda, 0xd2, 0x4e, 0x70, 0xea, + 0xea, 0x11, 0x30, 0x70, 0xd4, 0xae, 0xf7, 0x80, + 0xf8, 0x76, 0x7c, 0xc9, 0xa5, 0xd8, 0xe9, 0xdb, + 0xd5, 0x40, 0xbd, 0xe7, 0xf6, 0xd9, 0x55, 0xde, + 0x60, 0x23, 0xb9, 0xb8, 0x36, 0x93, 0xc6, 0xc6, + 0xe2, 0x24, 0x55, 0xaf, 0x61, 0xae, 0xad, 0xe2, + 0x14, 0x56, 0x67, 0x9b, 0x44, 0xeb, 0xbb, 0x6f, + 0x62, 0xa9, 0x82, 0xc0, 0x01, 0x11, 0xd5, 0x88, + 0xb4, 0x83, 0x5d, 0x3d, 0xa4, 0x1d, 0x99, 0xb9, + 0xc8, 0x3a, 0xce, 0x77, 0x5c, 0xba, 0xe0, 0x5c, + 0x07, 0x0c, 0x78, 0x00, 0x2d, 0x14, 0x03, 0x55, + 0x4a, 0xe9, 0xb3, 0xbd, 0xb5, 0xcc, 0x36, 0x86, + 0xda, 0x5b, 0x70, 0xf0, 0xd8, 0x60, 0x73, 0x0e, + 0x30, 0x01, 0xae, 0xa0, 0x47, 0x70, 0xae, 0x4b, + 0xb6, 0x64, 0xb9, 0x8d, 0xc8, 0xcc, 0x1d, 0x79, + 0xcc, 0x03, 0x84, 0xdc, 0x40, 0x5a, 0x6a, 0x4b, + 0x77, 0x88, 0x5c, 0xf3, 0x67, 0x8d, 0xeb, 0xc6, + 0x5f, 0xc6, 0xc3, 0xcc, 0x43, 0x48, 0xda, 0xdd, + 0xd2, 0xcd, 0x44, 0xa0, 0xdc, 0x66, 0xd9, 0xe8, + 0x6f, 0xcd, 0xce, 0x2b, 0x9e, 0x7a, 0x39, 0x8b, + 0xc8, 0xa3, 0x68, 0x5e, 0x1f, 0x5a, 0x6b, 0xdf, + 0x5d, 0x79, 0x7d, 0xd4, 0x57, 0x77, 0xb9, 0xbd, + 0xe5, 0xbd, 0x5a, 0x1d, 0x0b, 0x70, 0x17, 0x0a, + 0x1d, 0x4e, 0xaf, 0x81, 0x73, 0x08, 0xb2, 0x28, + 0xef, 0xfa, 0xcc, 0x5e, 0x87, 0x44, 0x1d, 0xce, + 0x8b, 0x7c, 0x07, 0x1e, 0x2d, 0x74, 0xaf, 0x6d, + 0x68, 0xb0, 0xce, 0xe3, 0x66, 0x71, 0x3d, 0xdd, + 0xc3, 0x48, 0x82, 0xec, 0x16, 0x48, 0xd1, 0xa7, + 0x0b, 0x75, 0x37, 0x47, 0x61, 0x06, 0x9d, 0x99, + 0x73, 0x9b, 0x9d, 0x5b, 0x53, 0xf3, 0xb1, 0x02, + 0x3b, 0x18, 0x0a, 0xe4, 0xcc, 0x7f, 0x98, 0xdd, + 0x7d, 0xb3, 0xfe, 0xb1, 0x53, 0x59, 0x78, 0xc8, + 0x72, 0xab, 0xe6, 0x5c, 0xfb, 0x61, 0x9e, 0xb8, + 0x9b, 0x18, 0x0d, 0x34, 0x8c, 0x38, 0x13, 0x89, + 0xda, 0x2b, 0xd8, 0x50, 0x77, 0xb2, 0x32, 0x5b, + 0xc9, 0xe5, 0x8c, 0xd5, 0x8f, 0x91, 0xce, 0x69, + 0xdf, 0x04, 0xd4, 0x20, 0xd2, 0x88, 0x88, 0x08, + 0x88, 0x80, 0xbd, 0x47, 0xfb, 0x46, 0x79, 0xc3, + 0xc2, 0xbc, 0xaf, 0x51, 0xfe, 0xd1, 0x9e, 0x70, + 0xf0, 0xa0, 0xba, 0x67, 0x5e, 0xf3, 0x1f, 0x99, + 0xf2, 0xae, 0x05, 0xdf, 0x9d, 0x7b, 0xcc, 0x7e, + 0x67, 0xca, 0xb8, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x07, 0xa8, 0xbf, 0x68, 0xde, 0xda, + 0x92, 0x51, 0xb1, 0x7e, 0xd1, 0xbd, 0xb5, 0x24, + 0x80, 0xb8, 0x6f, 0xfd, 0xea, 0xd3, 0xed, 0x3e, + 0x50, 0xbb, 0x97, 0x0d, 0xff, 0x00, 0xbd, 0x5a, + 0x7d, 0xa7, 0xca, 0x10, 0x62, 0xc3, 0xde, 0xae, + 0xfc, 0xf3, 0xf5, 0x8a, 0xef, 0x5c, 0x16, 0x1e, + 0xf5, 0x77, 0xe7, 0x9f, 0xac, 0x57, 0x7a, 0x0c, + 0x6e, 0x15, 0x18, 0x7e, 0x52, 0xa4, 0xf7, 0x0a, + 0x8c, 0x3f, 0x29, 0x40, 0x44, 0x44, 0x1e, 0xf3, + 0xcf, 0xf4, 0xe4, 0x3f, 0x6c, 0xdf, 0xef, 0x2a, + 0xaa, 0xb5, 0x67, 0x9f, 0xe9, 0xc8, 0x7e, 0xd9, + 0xbf, 0xde, 0x55, 0x54, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x00, + 0x03, 0xe1, 0x44, 0x41, 0xbe, 0xde, 0xf2, 0x6b, + 0x66, 0x4a, 0xd8, 0xb0, 0x87, 0x4c, 0xce, 0x6c, + 0xb8, 0x8d, 0x21, 0xbb, 0xa0, 0x76, 0xd6, 0x8d, + 0x5a, 0x06, 0xad, 0xc0, 0x88, 0x80, 0x95, 0x5d, + 0x39, 0x6d, 0x93, 0xaf, 0xaf, 0x62, 0xb5, 0x6b, + 0x8b, 0x79, 0xc3, 0xe3, 0x38, 0x69, 0xa0, 0xa1, + 0x3f, 0x22, 0xe9, 0xce, 0xb2, 0x8e, 0xac, 0x9a, + 0x36, 0x32, 0x4e, 0x71, 0x92, 0x8a, 0x87, 0x91, + 0x4d, 0x20, 0xd0, 0x84, 0x11, 0xa8, 0x9e, 0x04, + 0xd0, 0x80, 0x94, 0x1f, 0x96, 0x84, 0x4e, 0xea, + 0x0d, 0xd6, 0x97, 0x2f, 0xb4, 0x9d, 0xb3, 0xc6, + 0x01, 0x7b, 0x34, 0xb7, 0x10, 0xa8, 0x07, 0x7d, + 0x6a, 0x73, 0x9c, 0xf7, 0x17, 0xbc, 0xd5, 0xce, + 0x24, 0x93, 0xbe, 0x4e, 0x95, 0x85, 0xd5, 0x96, + 0x59, 0x8b, 0xeb, 0xe8, 0xed, 0x4b, 0xcc, 0x62, + 0x4a, 0x8c, 0x40, 0x69, 0x14, 0x15, 0x41, 0xcb, + 0xa3, 0xba, 0x9a, 0x37, 0xa9, 0xd9, 0x5b, 0x6e, + 0xa1, 0x10, 0x5d, 0x4b, 0x00, 0x38, 0x84, 0x6f, + 0x2c, 0x0e, 0x3a, 0xcd, 0x37, 0x56, 0xae, 0xd7, + 0xc8, 0x80, 0x88, 0x34, 0xf7, 0x53, 0xf2, 0xde, + 0xf0, 0xa0, 0x22, 0x68, 0xdf, 0x0b, 0xaf, 0x2c, + 0xcb, 0xdf, 0x98, 0xdd, 0x0b, 0x66, 0x3c, 0x46, + 0x4b, 0x4b, 0xb1, 0x11, 0x51, 0xa1, 0x07, 0x20, + 0xd6, 0x0f, 0x67, 0x4f, 0x69, 0x6e, 0xbb, 0xbb, + 0x9a, 0xf2, 0x6e, 0x7a, 0x5a, 0x03, 0x40, 0xd6, + 0xb1, 0xa2, 0x8d, 0x6b, 0x46, 0x80, 0xd0, 0xb5, + 0xbd, 0x85, 0x8f, 0x73, 0x0e, 0xb6, 0x92, 0xde, + 0xdd, 0x09, 0x1f, 0x22, 0xf3, 0xf9, 0x69, 0xa8, + 0xf0, 0xa0, 0x27, 0x63, 0x7f, 0x5a, 0x69, 0x4e, + 0x2a, 0xd7, 0x71, 0x01, 0x13, 0x75, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x00, 0x50, + 0x71, 0x22, 0x22, 0x02, 0x22, 0x20, 0x21, 0xd4, + 0x7b, 0x48, 0x87, 0x51, 0xed, 0x20, 0xba, 0x5e, + 0xfb, 0x8d, 0x97, 0xd9, 0xff, 0x00, 0x74, 0x2e, + 0x23, 0xad, 0x76, 0xde, 0xfb, 0x8d, 0x97, 0xd9, + 0xff, 0x00, 0x74, 0x2e, 0x23, 0xad, 0x01, 0x11, + 0x10, 0x10, 0x6b, 0x08, 0x83, 0x58, 0x41, 0xcf, + 0xb6, 0x3e, 0xfb, 0x6f, 0xf6, 0x3f, 0x29, 0x50, + 0x0a, 0x7f, 0x6c, 0x7d, 0xf6, 0xdf, 0xec, 0x7e, + 0x52, 0xa0, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x03, 0xbc, 0x9a, 0x3b, 0xa8, 0xb7, + 0xd8, 0xda, 0x49, 0x79, 0x75, 0x1d, 0xbc, 0x7a, + 0x0b, 0xcf, 0x8c, 0xed, 0xe6, 0x8f, 0x29, 0xc7, + 0xb4, 0x83, 0x46, 0xae, 0xc7, 0x02, 0x76, 0xf4, + 0x76, 0xd4, 0x94, 0x39, 0x54, 0x53, 0x59, 0x5e, + 0xdd, 0xb2, 0x62, 0x5b, 0x66, 0x68, 0xc1, 0x4d, + 0x0e, 0xec, 0xf6, 0x17, 0x1d, 0x95, 0xbf, 0xb4, + 0xdd, 0x43, 0x6f, 0x8b, 0x0f, 0x3c, 0xe0, 0xd2, + 0xea, 0x56, 0x95, 0x41, 0xa5, 0x17, 0x4e, 0x63, + 0x66, 0x2c, 0xaf, 0xa4, 0xb4, 0x0e, 0xc6, 0x23, + 0x20, 0x17, 0x1d, 0x66, 0xa0, 0x1d, 0x5d, 0xd5, + 0xcd, 0xa9, 0x01, 0x12, 0x89, 0xae, 0xb4, 0xe0, + 0x40, 0x45, 0xd9, 0xd5, 0xb2, 0x75, 0x59, 0xcc, + 0xb1, 0x8e, 0x6c, 0x49, 0xcd, 0x60, 0xa6, 0x9e, + 0xda, 0xe6, 0xb7, 0x89, 0xf3, 0xcf, 0x1c, 0x31, + 0xf9, 0x52, 0xb9, 0xac, 0x69, 0xdd, 0x18, 0x8a, + 0x0f, 0x1d, 0xad, 0x29, 0x4a, 0xf6, 0x42, 0x9b, + 0x87, 0x20, 0xb4, 0x9a, 0xee, 0xf2, 0x16, 0xdc, + 0xb9, 0x90, 0xd9, 0x79, 0x52, 0x38, 0x03, 0x5a, + 0x0f, 0x1b, 0x55, 0x35, 0x2c, 0x33, 0x20, 0xb2, + 0xba, 0x25, 0x96, 0x59, 0x8b, 0x25, 0x94, 0x0a, + 0xb6, 0x32, 0xda, 0x57, 0xbe, 0x82, 0x17, 0x73, + 0xb7, 0xac, 0x22, 0xf7, 0x3c, 0x12, 0xdb, 0xcc, + 0xf8, 0x25, 0x6e, 0x19, 0x23, 0x34, 0x73, 0x7b, + 0x2b, 0xc5, 0x34, 0x57, 0xb3, 0x44, 0x04, 0x44, + 0xed, 0xf7, 0x10, 0x76, 0x65, 0x79, 0x9c, 0x99, + 0x74, 0xee, 0x7b, 0x5a, 0x24, 0x8e, 0x56, 0xe0, + 0x96, 0x33, 0xa0, 0x39, 0xbd, 0xb5, 0xd9, 0xd7, + 0x76, 0x96, 0xf1, 0xc9, 0xd5, 0xb6, 0x42, 0xda, + 0x59, 0x9b, 0x84, 0xca, 0x5d, 0x88, 0x81, 0xd8, + 0x14, 0x5c, 0x6d, 0xb3, 0x84, 0xe5, 0xaf, 0xbc, + 0x74, 0xe1, 0xb3, 0x31, 0xd8, 0x44, 0x1b, 0xa4, + 0x57, 0xca, 0x5c, 0x67, 0x5f, 0x6d, 0x03, 0xbe, + 0x89, 0xa6, 0x95, 0x44, 0x04, 0xd5, 0xdb, 0x43, + 0x5f, 0xe9, 0x5d, 0x90, 0x58, 0xb1, 0xf9, 0x65, + 0xc5, 0xfc, 0xaf, 0x73, 0x0c, 0x4f, 0x6c, 0x70, + 0xb4, 0x6a, 0x73, 0x8e, 0x93, 0x5e, 0xe2, 0x0e, + 0x3f, 0xc8, 0xaf, 0x4d, 0x25, 0xaf, 0x6b, 0xa9, + 0x5a, 0x10, 0x77, 0xb5, 0x29, 0x48, 0x32, 0x4b, + 0x66, 0x5a, 0x32, 0xf3, 0x33, 0xb9, 0xf6, 0x68, + 0xa6, 0xd3, 0x0b, 0x1a, 0x2a, 0xe3, 0xd9, 0xd4, + 0x57, 0x8c, 0xc3, 0x27, 0x8a, 0x0b, 0x51, 0x7f, + 0x63, 0x37, 0xb4, 0xda, 0x38, 0xd1, 0xce, 0xc3, + 0x47, 0x34, 0xf6, 0x50, 0x69, 0xcd, 0xf3, 0x1e, + 0xb2, 0xbc, 0x37, 0x26, 0x3e, 0x6c, 0x61, 0x0c, + 0xc1, 0x5a, 0xd7, 0x0d, 0x74, 0xae, 0x2a, 0xd7, + 0xb6, 0xa6, 0x6d, 0xb2, 0x7c, 0xae, 0xe1, 0xb1, + 0x0e, 0xb1, 0x6b, 0x66, 0x94, 0x0f, 0xd5, 0x61, + 0xa9, 0x0e, 0x3b, 0x8b, 0x64, 0xf9, 0x06, 0x59, + 0x6f, 0x23, 0xa1, 0x97, 0x32, 0x0d, 0x91, 0xba, + 0xd8, 0x5b, 0x43, 0x5d, 0xc4, 0x10, 0x5d, 0x9a, + 0x26, 0x95, 0x23, 0x96, 0x65, 0x3e, 0xda, 0xd9, + 0x6e, 0x25, 0x97, 0xd9, 0xed, 0x20, 0xd0, 0xf9, + 0x8f, 0x80, 0x2e, 0xa1, 0x92, 0x65, 0xf7, 0x70, + 0xc8, 0xec, 0xaa, 0xf0, 0xdc, 0x49, 0x10, 0xc4, + 0xe8, 0xe4, 0x14, 0x24, 0x0d, 0xe3, 0x40, 0x82, + 0x13, 0x57, 0x60, 0xf7, 0xd1, 0x75, 0x36, 0xc4, + 0xbf, 0x2e, 0x75, 0xe4, 0x6e, 0xab, 0xa2, 0x93, + 0x9b, 0x9e, 0x3f, 0x9a, 0x0f, 0x92, 0x6a, 0xb9, + 0x50, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x7a, 0x8f, 0xf6, 0x8c, 0xf3, 0x87, 0x85, + 0x79, 0x5e, 0xa3, 0xfd, 0xa3, 0x3c, 0xe1, 0xe1, + 0x41, 0x74, 0xce, 0xbd, 0xe6, 0x3f, 0x33, 0xe5, + 0x5c, 0x0b, 0xbf, 0x3a, 0xf7, 0x98, 0xfc, 0xcf, + 0x95, 0x70, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x0f, 0x51, 0x7e, 0xd1, 0xbd, 0xb5, 0x24, + 0xa3, 0x62, 0xfd, 0xa3, 0x7b, 0x6a, 0x49, 0x01, + 0x70, 0xdf, 0xfb, 0xd5, 0xa7, 0xda, 0x7c, 0xa1, + 0x77, 0x2e, 0x1b, 0xff, 0x00, 0x7a, 0xb4, 0xfb, + 0x4f, 0x94, 0x20, 0xc5, 0x87, 0xbd, 0x5d, 0xf9, + 0xe7, 0xeb, 0x15, 0xde, 0xb8, 0x2c, 0x7d, 0xea, + 0xeb, 0xcf, 0x3f, 0x58, 0xae, 0xea, 0xa0, 0x6e, + 0x15, 0x18, 0x7e, 0x52, 0xa4, 0x89, 0xd0, 0xa3, + 0x4e, 0xbe, 0x14, 0x04, 0x44, 0x41, 0xef, 0x3c, + 0xff, 0x00, 0x4e, 0x43, 0x4f, 0x5c, 0xdf, 0xef, + 0x2a, 0xaa, 0xb7, 0x5f, 0x44, 0x6e, 0x36, 0x72, + 0x66, 0x81, 0x57, 0x40, 0xec, 0x63, 0xb9, 0xfd, + 0x05, 0x54, 0x50, 0x11, 0x11, 0x01, 0x11, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x2a, 0x06, 0xbd, 0xcd, 0x3c, 0x08, 0x26, + 0xf6, 0x68, 0x36, 0xdd, 0x97, 0xb9, 0x8b, 0xfc, + 0x9b, 0x78, 0x8b, 0x5b, 0xd9, 0x73, 0xbf, 0x21, + 0xc2, 0xbd, 0xdd, 0xe2, 0xbd, 0xd9, 0x98, 0x2e, + 0x1c, 0x71, 0x4b, 0x69, 0x21, 0x64, 0x87, 0x76, + 0x87, 0x45, 0x7b, 0xe1, 0x74, 0x5b, 0xb2, 0xc6, + 0xd3, 0x67, 0x22, 0x8a, 0xfd, 0xef, 0x8d, 0xb7, + 0xaf, 0x2f, 0x3c, 0xd8, 0xab, 0x8e, 0x13, 0x51, + 0xe0, 0x5b, 0x32, 0xc8, 0xf2, 0x99, 0xec, 0x6f, + 0x32, 0xec, 0xbe, 0x49, 0x1c, 0xe9, 0x18, 0x5e, + 0x44, 0xa3, 0x51, 0x02, 0x80, 0x8e, 0xed, 0x10, + 0x47, 0x65, 0xf6, 0x76, 0x36, 0xf9, 0x53, 0xf3, + 0x6b, 0xd8, 0x84, 0xf8, 0x9f, 0xcd, 0xc1, 0x11, + 0xd0, 0xda, 0xef, 0x95, 0x8b, 0xb6, 0x65, 0xb7, + 0xb9, 0x53, 0xef, 0xad, 0xe3, 0x6d, 0xa5, 0xc4, + 0x2e, 0xc2, 0xf8, 0x1a, 0xed, 0x0e, 0x1d, 0x86, + 0xf7, 0x56, 0xcb, 0xaf, 0x1b, 0x64, 0xed, 0x30, + 0x82, 0x03, 0x67, 0x21, 0xfc, 0x12, 0x02, 0xa2, + 0xe2, 0xb1, 0xb8, 0x92, 0xd6, 0x4b, 0xd6, 0xb4, + 0x73, 0x30, 0xb8, 0x09, 0x1d, 0x5a, 0x50, 0x9a, + 0x7a, 0x48, 0x25, 0xa6, 0x87, 0x2d, 0xc9, 0xad, + 0x2d, 0xb9, 0xfb, 0x56, 0xdd, 0xdd, 0xdc, 0x37, + 0x9c, 0x76, 0x3d, 0x40, 0x6f, 0x00, 0xb4, 0x66, + 0x36, 0x16, 0x72, 0xbe, 0xca, 0x5c, 0xb8, 0x86, + 0x0b, 0xda, 0x34, 0xc2, 0x1d, 0x52, 0xc7, 0x1d, + 0xe1, 0xb8, 0xb6, 0xed, 0x60, 0xad, 0xc5, 0x9b, + 0x9b, 0xe4, 0xba, 0xdd, 0xb8, 0x77, 0xb5, 0x9d, + 0xde, 0xd1, 0x5a, 0x32, 0xbb, 0x29, 0xed, 0xaf, + 0xb2, 0xeb, 0xa9, 0x5a, 0x04, 0x57, 0x12, 0x0e, + 0x68, 0xd7, 0x5f, 0x73, 0xba, 0x83, 0xae, 0xe6, + 0x5c, 0x93, 0x2e, 0xbc, 0xea, 0xe3, 0x66, 0x27, + 0x6b, 0x70, 0xb6, 0xe2, 0x67, 0x1f, 0x1a, 0xae, + 0xdd, 0x1c, 0x2b, 0xd5, 0xb5, 0x83, 0x2c, 0x36, + 0xa2, 0x08, 0x62, 0xaf, 0x32, 0xea, 0xbe, 0x3a, + 0xef, 0x16, 0x1d, 0x0b, 0x19, 0xae, 0x6e, 0xdb, + 0x7c, 0xce, 0x68, 0x8d, 0x8c, 0x12, 0x39, 0x8f, + 0x00, 0x3d, 0xe0, 0xe2, 0x75, 0x40, 0xa1, 0x5b, + 0x21, 0xb8, 0xbd, 0x9f, 0x69, 0x6c, 0xdd, 0x7b, + 0x03, 0x6d, 0xe5, 0x6b, 0x08, 0x0d, 0x69, 0xae, + 0x8a, 0x38, 0xef, 0x9d, 0xf4, 0x1c, 0x96, 0xd9, + 0x74, 0x57, 0xb9, 0xdd, 0xe9, 0xb8, 0x24, 0x5b, + 0xc0, 0xe9, 0x24, 0x92, 0x86, 0x95, 0xa1, 0xd0, + 0xd5, 0xba, 0xc8, 0xe4, 0xd9, 0xc4, 0xd2, 0x59, + 0x32, 0xcd, 0xb6, 0xce, 0x2d, 0x2e, 0xb7, 0x95, + 0x9e, 0x51, 0x03, 0x55, 0x57, 0x4e, 0x50, 0xfc, + 0x17, 0xb9, 0xd1, 0x0d, 0x0f, 0x70, 0xab, 0x83, + 0x48, 0xa8, 0x20, 0x17, 0xe8, 0xef, 0xae, 0x4c, + 0xbf, 0x3a, 0xb8, 0x96, 0xe5, 0xac, 0xb1, 0xcb, + 0x6d, 0xf9, 0xf2, 0x09, 0x6e, 0x1a, 0xb4, 0xd0, + 0x6b, 0xd2, 0x48, 0x41, 0xe7, 0x26, 0xcb, 0x6c, + 0x66, 0xb2, 0xbd, 0x7d, 0xf0, 0xf7, 0x77, 0x00, + 0xe7, 0xee, 0x80, 0xd1, 0xe3, 0x53, 0xb6, 0x96, + 0xdd, 0x4f, 0x99, 0xdf, 0x44, 0xc6, 0x40, 0x2d, + 0x2d, 0x60, 0x63, 0x9f, 0x27, 0x8c, 0x2b, 0x20, + 0x1e, 0x4d, 0x75, 0x15, 0xee, 0xc0, 0xb9, 0xd9, + 0x2e, 0x72, 0xe7, 0x8c, 0x2f, 0x73, 0xc9, 0x70, + 0x1b, 0x86, 0xb5, 0x21, 0x71, 0x64, 0x79, 0x6c, + 0x59, 0x8d, 0xdb, 0xc4, 0xe4, 0xf3, 0x30, 0x37, + 0x9c, 0x78, 0x1a, 0xcd, 0x0f, 0x90, 0x83, 0xbe, + 0xc2, 0x5c, 0x9b, 0x33, 0xbc, 0x39, 0x7f, 0xb0, + 0x36, 0x26, 0xbc, 0x38, 0x45, 0x23, 0x49, 0xc4, + 0x30, 0x82, 0x6a, 0x74, 0xf0, 0x2f, 0x5b, 0x30, + 0xfb, 0x68, 0xb3, 0x07, 0xda, 0x98, 0x31, 0x5c, + 0x34, 0xc8, 0x3d, 0xa0, 0x9f, 0xcd, 0x07, 0xc9, + 0xa7, 0x71, 0x7a, 0xc8, 0x73, 0x2b, 0x47, 0xe6, + 0x71, 0xdb, 0x58, 0xda, 0x32, 0xde, 0x17, 0x07, + 0x78, 0xfa, 0xe4, 0x2d, 0x6b, 0x4d, 0x2a, 0xee, + 0xda, 0xd3, 0xb3, 0xdf, 0xea, 0x29, 0x7f, 0xfc, + 0xde, 0x12, 0x83, 0xcd, 0xad, 0xb5, 0x86, 0x6d, + 0x9a, 0x39, 0xac, 0xb7, 0x36, 0xd6, 0xf6, 0xed, + 0x7b, 0xee, 0x40, 0x76, 0x2c, 0x64, 0x38, 0xee, + 0xee, 0x2f, 0x76, 0x6f, 0xc9, 0x73, 0x4b, 0xa7, + 0x65, 0xe2, 0xc9, 0xb0, 0x35, 0xd5, 0x10, 0xcc, + 0xd3, 0xa6, 0xad, 0x15, 0xd2, 0xb3, 0xb3, 0x74, + 0x33, 0xe6, 0x6d, 0x03, 0xc7, 0x73, 0x1f, 0x87, + 0x7e, 0x95, 0x23, 0xe5, 0x51, 0xdb, 0x3c, 0xd7, + 0x3b, 0x38, 0xb4, 0x02, 0xb5, 0x6b, 0xaa, 0x7b, + 0x80, 0xd5, 0x07, 0x66, 0x4f, 0x95, 0x5a, 0xc8, + 0x33, 0x18, 0xaf, 0x40, 0x2e, 0xb6, 0x00, 0x09, + 0x34, 0xf8, 0xb4, 0x2e, 0xab, 0xbb, 0xcb, 0xd5, + 0xa4, 0x39, 0x4e, 0x6d, 0x7f, 0x15, 0xa5, 0xb5, + 0xb1, 0x82, 0x08, 0x43, 0x9e, 0xf7, 0xd7, 0x4c, + 0xa0, 0x79, 0x35, 0xed, 0xae, 0xa8, 0x1c, 0x1d, + 0x2e, 0xd0, 0x96, 0x9d, 0x06, 0x94, 0x23, 0xfb, + 0x6a, 0x0f, 0x28, 0x6d, 0xff, 0x00, 0xb5, 0x09, + 0x72, 0xf6, 0xd6, 0x68, 0x5a, 0x5c, 0x74, 0x80, + 0x30, 0x9d, 0x75, 0xae, 0xb4, 0x12, 0x96, 0xb2, + 0xe4, 0x77, 0xd7, 0x32, 0x58, 0xbe, 0xcd, 0x96, + 0xac, 0x01, 0xc2, 0x39, 0xb1, 0x50, 0x82, 0xdd, + 0x15, 0x72, 0x80, 0x78, 0x0d, 0x7b, 0x9a, 0x0d, + 0x43, 0x49, 0x00, 0xef, 0x80, 0x75, 0xab, 0x15, + 0xb5, 0xce, 0x57, 0x9e, 0xcf, 0xec, 0xd7, 0x56, + 0x82, 0x0b, 0xb9, 0x2b, 0x82, 0x78, 0xb7, 0xc6, + 0xfa, 0x80, 0xb9, 0x85, 0xd0, 0x4f, 0x24, 0x27, + 0x49, 0x8d, 0xc5, 0xb5, 0xdf, 0xa2, 0x0d, 0x68, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x87, 0x51, 0x45, 0xea, + 0x28, 0x9d, 0x34, 0xac, 0x89, 0xa2, 0xa6, 0x47, + 0x06, 0x8e, 0xe9, 0xa2, 0x0b, 0x95, 0xee, 0x8b, + 0x2b, 0x26, 0x9d, 0x7c, 0xdf, 0xc8, 0xd5, 0xc4, + 0xbb, 0xf3, 0x6a, 0x35, 0xf0, 0x43, 0xea, 0xd9, + 0x4f, 0xcb, 0x81, 0x70, 0x76, 0xd0, 0x11, 0x11, + 0x01, 0x37, 0x42, 0x2c, 0x1d, 0x5c, 0x3e, 0x04, + 0x1a, 0x76, 0xc4, 0x7f, 0xde, 0xdb, 0x9f, 0xf0, + 0xb4, 0x72, 0x8a, 0xaf, 0xab, 0x2e, 0xd7, 0x33, + 0x1d, 0xbd, 0x95, 0xd8, 0xf2, 0x48, 0x2c, 0x3d, + 0xd0, 0x08, 0xf0, 0x2a, 0xd7, 0xc8, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x0a, 0x63, + 0x28, 0x68, 0x83, 0x2a, 0xcc, 0xaf, 0xff, 0x00, + 0x3c, 0x33, 0x99, 0x8c, 0xf9, 0xda, 0xd4, 0x3f, + 0x65, 0x4d, 0xdb, 0x50, 0xec, 0x9d, 0xd8, 0x6f, + 0x94, 0xd9, 0x41, 0x77, 0x6b, 0xc5, 0x41, 0xbb, + 0x21, 0xb7, 0x92, 0xe7, 0x25, 0xcc, 0x6d, 0xe2, + 0xa3, 0xa5, 0x90, 0xb5, 0xa0, 0x54, 0x0d, 0x34, + 0xec, 0xaf, 0x19, 0x6e, 0xcf, 0x66, 0xd0, 0x5f, + 0x5b, 0x4f, 0x24, 0x20, 0x47, 0x1b, 0xc3, 0x9c, + 0x43, 0x9a, 0x74, 0x72, 0x93, 0x28, 0x7b, 0x9b, + 0xb3, 0xf9, 0xa3, 0x9a, 0x4b, 0x5c, 0x29, 0x42, + 0x0d, 0x0e, 0xa5, 0xc1, 0x94, 0x4f, 0x70, 0xec, + 0xce, 0xd0, 0x3a, 0x59, 0x1c, 0x0c, 0xa2, 0xa0, + 0xb8, 0x90, 0x7b, 0xe8, 0x24, 0xe6, 0xcb, 0x99, + 0x98, 0xed, 0x3d, 0xd4, 0x52, 0x92, 0x20, 0x8e, + 0x92, 0x4c, 0x41, 0xa1, 0xa0, 0x63, 0x68, 0x17, + 0x9b, 0x37, 0xe4, 0x79, 0x8d, 0xd7, 0xb0, 0xb6, + 0xc8, 0x5b, 0x87, 0xd4, 0x43, 0x3b, 0x4f, 0x8d, + 0x88, 0x57, 0x5f, 0x02, 0xee, 0xb7, 0xa3, 0xb3, + 0xec, 0xdd, 0x83, 0xcb, 0x74, 0x20, 0x30, 0x6f, + 0xf8, 0xad, 0x50, 0x39, 0x0b, 0x5c, 0x73, 0xab, + 0x5a, 0x6b, 0x2f, 0xad, 0x7b, 0x01, 0xae, 0xaa, + 0x0e, 0xac, 0xbb, 0x2b, 0xb6, 0x8d, 0xb7, 0xd7, + 0x17, 0xcc, 0x33, 0xb3, 0x2f, 0x25, 0x9c, 0xd0, + 0x24, 0x02, 0xea, 0x9a, 0x92, 0xb2, 0x46, 0x51, + 0x98, 0xe5, 0xf7, 0x12, 0xc7, 0x6e, 0xcb, 0x3b, + 0x9b, 0x7a, 0x16, 0x35, 0xae, 0x14, 0x78, 0x5b, + 0xa6, 0xba, 0xcc, 0x2c, 0xb3, 0x0c, 0xc2, 0xf6, + 0xda, 0x31, 0x2d, 0x9f, 0x39, 0x86, 0x70, 0xef, + 0x27, 0x55, 0x34, 0x8d, 0x6b, 0xc9, 0xb7, 0xca, + 0x73, 0x8b, 0x2b, 0x99, 0xed, 0xad, 0xcd, 0xa5, + 0xdd, 0xb3, 0x79, 0xc7, 0xb5, 0xbe, 0x49, 0xa0, + 0xae, 0xe6, 0x8d, 0xc4, 0x1d, 0x42, 0xf3, 0x2d, + 0x3b, 0x3c, 0x27, 0xf6, 0x3f, 0xfb, 0x63, 0x38, + 0x06, 0xdf, 0x18, 0xa9, 0x77, 0xce, 0xc4, 0xa2, + 0xf2, 0x11, 0x10, 0xbe, 0x9a, 0xf8, 0xb7, 0x0c, + 0x36, 0x71, 0xba, 0x60, 0xda, 0xd6, 0x84, 0x8a, + 0x31, 0xbd, 0xb5, 0xb8, 0x7f, 0xa4, 0x0d, 0x77, + 0x6e, 0x75, 0x6f, 0x69, 0xd0, 0xb5, 0x37, 0xfe, + 0xd3, 0x67, 0xab, 0xff, 0x00, 0x13, 0x30, 0x94, + 0x0f, 0xff, 0x00, 0x14, 0x61, 0x07, 0x4e, 0xcf, + 0xbd, 0xd2, 0x5a, 0x66, 0xd2, 0xbc, 0xd5, 0xce, + 0x85, 0xce, 0x27, 0x7c, 0xb8, 0x3d, 0xc5, 0x42, + 0x5a, 0xc8, 0xf8, 0x27, 0x8a, 0x66, 0x1a, 0x39, + 0x8e, 0x18, 0x4f, 0x69, 0x4c, 0xec, 0xe7, 0xb8, + 0x66, 0xbf, 0x60, 0xef, 0xaa, 0xe5, 0x0d, 0x6b, + 0x0b, 0xa7, 0xb9, 0x86, 0x06, 0x69, 0x74, 0xaf, + 0x0d, 0x68, 0xec, 0xd7, 0x4f, 0x00, 0x41, 0x3f, + 0x9f, 0xe5, 0xfe, 0xd7, 0xb4, 0x30, 0x40, 0xcf, + 0x17, 0xda, 0x58, 0x31, 0x38, 0x6e, 0x52, 0xb8, + 0x8f, 0x24, 0x2f, 0x1c, 0xe6, 0x40, 0xdc, 0xc3, + 0xab, 0x3d, 0x88, 0x18, 0xf1, 0xf3, 0x06, 0xe4, + 0x93, 0x8f, 0x17, 0x93, 0x5a, 0xd7, 0x7c, 0xae, + 0xf9, 0x67, 0x8d, 0xdb, 0x61, 0x0b, 0x2b, 0x5e, + 0x6e, 0x1c, 0x1f, 0xda, 0x20, 0x9f, 0x02, 0x8e, + 0x9b, 0x38, 0xc3, 0x98, 0xc9, 0x13, 0x32, 0xe8, + 0x1d, 0x33, 0x66, 0x73, 0x18, 0xe2, 0x08, 0x73, + 0x9c, 0x1d, 0x4a, 0xf7, 0x4a, 0x0c, 0xd9, 0xe4, + 0xd6, 0xa6, 0xfb, 0x31, 0xcb, 0xa6, 0x6f, 0x39, + 0x2c, 0x4c, 0x2f, 0xb5, 0x79, 0xd7, 0x4f, 0xcd, + 0x5c, 0xbb, 0x3d, 0x61, 0x6f, 0x77, 0x73, 0x33, + 0xae, 0xdb, 0x8e, 0x0b, 0x78, 0x8b, 0x9e, 0x0e, + 0x8d, 0x35, 0xd0, 0x4d, 0x3b, 0x01, 0x74, 0xc5, + 0x7f, 0x75, 0x1e, 0xd4, 0x47, 0x35, 0xdc, 0x62, + 0x09, 0x5e, 0x44, 0x52, 0x46, 0x2a, 0x40, 0x6b, + 0x85, 0x01, 0xaf, 0x6d, 0x74, 0x5c, 0x42, 0x72, + 0xcc, 0xb7, 0x35, 0x76, 0xa7, 0x5c, 0xce, 0x62, + 0x8b, 0xcd, 0x3f, 0xd0, 0x50, 0x47, 0xb2, 0xd2, + 0xd1, 0xfb, 0x3f, 0x3d, 0xf7, 0x36, 0x04, 0xcd, + 0x9a, 0x8d, 0x76, 0xf3, 0x09, 0x06, 0x9d, 0xf5, + 0xb9, 0x96, 0xb6, 0x19, 0x5e, 0x59, 0x05, 0xd5, + 0xdd, 0xb0, 0xbb, 0xba, 0xbb, 0xa9, 0x8e, 0x37, + 0x1f, 0x15, 0xad, 0xd6, 0x3b, 0xc9, 0x0d, 0x3e, + 0x11, 0xb8, 0xde, 0xe7, 0xfc, 0x25, 0xa9, 0xb4, + 0x40, 0x1b, 0x0c, 0xad, 0xc3, 0x4b, 0x39, 0x80, + 0xda, 0xf6, 0x40, 0x6a, 0x0d, 0x59, 0x9d, 0xa5, + 0x84, 0xb6, 0xd6, 0xd7, 0xf9, 0x70, 0x10, 0x99, + 0xdc, 0x63, 0x7d, 0xbd, 0x6b, 0x84, 0x9d, 0x5a, + 0x3b, 0x8b, 0xa2, 0xec, 0x64, 0xf9, 0x3c, 0x91, + 0xd9, 0x4b, 0x66, 0x2e, 0xe5, 0xc2, 0x1d, 0x71, + 0x23, 0xce, 0xaa, 0xfc, 0xdd, 0xe5, 0x1f, 0x67, + 0x63, 0x3c, 0x6e, 0xb3, 0xbf, 0x95, 0xa0, 0x5b, + 0x3e, 0x76, 0x06, 0xb8, 0x9d, 0x74, 0x7d, 0x69, + 0x45, 0x2d, 0x9f, 0x66, 0x91, 0xdb, 0xe6, 0x52, + 0x42, 0xfb, 0x18, 0x67, 0x20, 0x34, 0xf3, 0x8f, + 0x07, 0x11, 0xc4, 0x10, 0x46, 0x67, 0xb9, 0x7c, + 0x36, 0x57, 0x2c, 0x75, 0xb7, 0xbb, 0x5c, 0x30, + 0x4b, 0x13, 0x49, 0xad, 0x3b, 0x0b, 0x76, 0x62, + 0x3d, 0x9e, 0xc3, 0x2f, 0xcb, 0x9b, 0xa1, 0xce, + 0x02, 0xe2, 0x61, 0xfd, 0x69, 0x34, 0x36, 0xbd, + 0xc5, 0xb6, 0xef, 0xdb, 0x73, 0x3b, 0xfc, 0xba, + 0x0b, 0xab, 0x66, 0xdb, 0x35, 0xc0, 0x73, 0x6d, + 0x61, 0xaf, 0xea, 0xaa, 0x1c, 0x4f, 0x62, 0x8d, + 0x0b, 0x83, 0x36, 0xbc, 0x17, 0x39, 0xac, 0xb3, + 0xb4, 0xf8, 0x8d, 0x7e, 0x06, 0x79, 0xac, 0xd1, + 0xf2, 0x20, 0xee, 0xda, 0xd3, 0x86, 0xfa, 0x1b, + 0x76, 0x9a, 0x32, 0x18, 0x5a, 0x18, 0x37, 0xbf, + 0x2a, 0x2f, 0x59, 0x00, 0x12, 0xe5, 0x59, 0xa4, + 0x0e, 0xd2, 0xce, 0x6f, 0x9c, 0xa7, 0xf5, 0xb0, + 0x93, 0xf2, 0x2f, 0x3b, 0x5a, 0xd2, 0x6f, 0xe1, + 0x9c, 0x69, 0x64, 0xd0, 0x82, 0xd3, 0xdd, 0xfe, + 0x95, 0x9c, 0x82, 0xb1, 0x65, 0x59, 0xac, 0xfa, + 0x81, 0x8f, 0x03, 0x49, 0xd5, 0x8b, 0x09, 0x1e, + 0x12, 0x82, 0x33, 0x2b, 0xfe, 0x69, 0x67, 0xf6, + 0xd1, 0xfd, 0x65, 0xd3, 0xb4, 0xbf, 0xce, 0xae, + 0x01, 0xd5, 0x56, 0xfd, 0x50, 0xb9, 0xb2, 0xa3, + 0xfe, 0x6b, 0x69, 0xf6, 0xf1, 0x9f, 0xa4, 0x17, + 0x4e, 0xd2, 0x7f, 0x3a, 0xb8, 0xae, 0xfb, 0x3e, + 0xa8, 0xaa, 0x0e, 0xbb, 0x9f, 0xd4, 0x6c, 0x95, + 0xb3, 0x5b, 0xe2, 0x89, 0xe4, 0xc4, 0xfa, 0x6e, + 0xe9, 0x27, 0xe4, 0x51, 0xb9, 0x7d, 0xc5, 0xfd, + 0x94, 0xde, 0xd1, 0x6b, 0x1b, 0xb1, 0x16, 0xd3, + 0x4b, 0x5c, 0xe1, 0x43, 0xdc, 0x52, 0x57, 0x55, + 0x9b, 0x64, 0xad, 0x4b, 0x74, 0x98, 0xa4, 0xc0, + 0xe3, 0xbd, 0x5c, 0x5a, 0x56, 0xcd, 0x9a, 0xcd, + 0x73, 0x09, 0xef, 0xa1, 0xb4, 0x32, 0x56, 0xdd, + 0x8c, 0x35, 0x65, 0x06, 0x86, 0x81, 0xe2, 0xe9, + 0xed, 0xa0, 0xe7, 0xd9, 0xe7, 0x7b, 0x45, 0xed, + 0xd5, 0xa4, 0xc3, 0xc5, 0xbc, 0x89, 0xf8, 0x9b, + 0x4a, 0x78, 0xd5, 0xae, 0xae, 0xc5, 0x4a, 0x86, + 0x73, 0x4b, 0x1c, 0x58, 0xed, 0x6d, 0x38, 0x4f, + 0x6c, 0x56, 0xaa, 0x6f, 0x23, 0x04, 0xed, 0x3b, + 0x8e, 0xe0, 0x92, 0x73, 0xdc, 0xf1, 0xb8, 0xd4, + 0x4d, 0xe1, 0x06, 0xf2, 0xe4, 0x8d, 0x46, 0x69, + 0x08, 0xed, 0x17, 0x14, 0x1a, 0x51, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x7a, 0x8f, 0xf6, + 0x8c, 0xf3, 0x87, 0x85, 0x79, 0x5d, 0x39, 0x5c, + 0x0e, 0xb8, 0xcc, 0x6d, 0xe1, 0xa5, 0x71, 0x48, + 0x2b, 0xe6, 0x8d, 0x25, 0x05, 0xb7, 0x3a, 0xf7, + 0x96, 0x79, 0x9f, 0x2a, 0xe0, 0x5d, 0x99, 0xb3, + 0xf1, 0x5e, 0x38, 0x0d, 0x4d, 0x00, 0x2e, 0x34, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, + 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x41, 0xea, + 0x2f, 0xda, 0x37, 0xb6, 0xa4, 0x94, 0x6c, 0x5f, + 0xb4, 0x6f, 0x6d, 0x48, 0xd5, 0x06, 0x57, 0x0d, + 0xff, 0x00, 0xbd, 0x5a, 0x7d, 0xa7, 0xca, 0x17, + 0x6d, 0x57, 0x0d, 0xf1, 0xad, 0xd5, 0xaf, 0xda, + 0x7c, 0xa1, 0x02, 0xcb, 0xde, 0x6e, 0xbc, 0xf3, + 0xe1, 0x2b, 0xb1, 0x71, 0xd9, 0x7b, 0xcd, 0xd7, + 0x9e, 0x7c, 0x25, 0x76, 0x20, 0x15, 0x1e, 0xf1, + 0x47, 0x91, 0xd9, 0x52, 0x0b, 0x96, 0xea, 0x3c, + 0x2f, 0x0f, 0x1a, 0x9c, 0x83, 0x42, 0x22, 0x20, + 0xee, 0xca, 0x9e, 0xd7, 0x3e, 0x4b, 0x69, 0x34, + 0xc7, 0x2b, 0x69, 0x43, 0xbb, 0xa2, 0x84, 0x77, + 0x42, 0xa9, 0xe6, 0x56, 0x12, 0x65, 0xf7, 0x8f, + 0xb6, 0x78, 0x34, 0x69, 0xfd, 0x5b, 0x8f, 0xe7, + 0x34, 0xea, 0x3c, 0x1a, 0xd4, 0xfb, 0x1e, 0xf6, + 0x3d, 0xaf, 0x69, 0xa3, 0x9a, 0x6a, 0x14, 0x9c, + 0xd6, 0xf6, 0x19, 0xdd, 0xb3, 0x59, 0x38, 0xfd, + 0x73, 0x37, 0x47, 0x94, 0xd3, 0xc4, 0x82, 0x88, + 0x8a, 0xd0, 0xed, 0x8a, 0xd3, 0xe2, 0xdd, 0x9c, + 0x3d, 0x96, 0x57, 0xe5, 0x0b, 0x1f, 0x04, 0x9e, + 0x99, 0xf4, 0x3f, 0x49, 0x05, 0x61, 0x15, 0x9f, + 0xe0, 0x93, 0xd3, 0x3e, 0x87, 0xe9, 0x27, 0xc1, + 0x27, 0xa6, 0x7d, 0x0f, 0xd2, 0x41, 0x58, 0x45, + 0x67, 0xf8, 0x24, 0xf4, 0xcf, 0xa1, 0xfa, 0x49, + 0xf0, 0x49, 0xe9, 0x9f, 0x43, 0xf4, 0x90, 0x56, + 0x11, 0x59, 0xfe, 0x09, 0x3d, 0x33, 0xe8, 0x7e, + 0x92, 0x7c, 0x12, 0x7a, 0x67, 0xd0, 0xfd, 0x24, + 0x15, 0x84, 0x56, 0x7f, 0x82, 0x4f, 0x4c, 0xfa, + 0x1f, 0xa4, 0x9f, 0x04, 0x9e, 0x99, 0xf4, 0x3f, + 0x49, 0x05, 0x61, 0x0d, 0x37, 0x75, 0x6e, 0xea, + 0x1e, 0x15, 0x67, 0xf8, 0x24, 0xf4, 0xcf, 0xa1, + 0xfa, 0x49, 0xf0, 0x49, 0xe9, 0x9f, 0x43, 0xf4, + 0x90, 0x43, 0xe6, 0xb9, 0xab, 0x6f, 0xc4, 0x11, + 0xc6, 0xc3, 0x14, 0x56, 0xf1, 0xf3, 0x6d, 0x18, + 0xb1, 0x6e, 0x50, 0x9d, 0x1d, 0x85, 0xe3, 0x29, + 0xcc, 0x7a, 0xba, 0xf5, 0x97, 0x38, 0x79, 0xc0, + 0xd0, 0x58, 0xe6, 0x02, 0x05, 0x41, 0xfc, 0x82, + 0x9b, 0xf8, 0x24, 0xf4, 0xcf, 0xa1, 0xfa, 0x49, + 0xf0, 0x4b, 0xba, 0x67, 0xd0, 0xfd, 0x24, 0x11, + 0xd6, 0xb9, 0xd5, 0xbc, 0x6c, 0xb8, 0xb6, 0xb8, + 0xb7, 0x32, 0xd8, 0xdc, 0x3c, 0xc8, 0x23, 0xaf, + 0x8c, 0xc2, 0xe3, 0x8b, 0x5f, 0x6d, 0x6a, 0xbe, + 0xcd, 0x2d, 0xe4, 0xb3, 0x6e, 0x5f, 0x61, 0x09, + 0x82, 0xd5, 0xae, 0xc6, 0xf2, 0xe3, 0x89, 0xcf, + 0x2a, 0x5b, 0xe0, 0x97, 0x74, 0xcf, 0xa1, 0xfa, + 0x49, 0xf0, 0x4b, 0xba, 0x67, 0xd0, 0xfd, 0x24, + 0x11, 0xec, 0xce, 0x2c, 0xa7, 0xb3, 0x8a, 0xd3, + 0x34, 0xb7, 0x74, 0xde, 0xcf, 0xa2, 0x29, 0x58, + 0xec, 0x26, 0x9b, 0xc7, 0x81, 0x73, 0x66, 0x19, + 0xb3, 0xef, 0x27, 0x86, 0x48, 0x98, 0x20, 0x8a, + 0xd8, 0x06, 0xc1, 0x18, 0xd3, 0x4c, 0x3a, 0xaa, + 0xa6, 0x7e, 0x09, 0x3d, 0x33, 0xe8, 0x7e, 0x92, + 0x7c, 0x12, 0xee, 0x99, 0xf4, 0x3f, 0x49, 0x07, + 0x24, 0x99, 0xd6, 0x57, 0x71, 0x2b, 0x2e, 0xef, + 0x2c, 0x8b, 0xaf, 0x63, 0x02, 0xa5, 0xaf, 0xa3, + 0x1c, 0x46, 0xa2, 0x42, 0xe5, 0x8f, 0x39, 0x93, + 0xad, 0xdb, 0x9a, 0x4e, 0xdc, 0x44, 0x13, 0x46, + 0x34, 0x81, 0xa2, 0x94, 0xa6, 0x95, 0x2b, 0xf0, + 0x4b, 0xba, 0x67, 0xd0, 0xfd, 0x24, 0xf8, 0x24, + 0xf4, 0xcf, 0xa1, 0xfa, 0x48, 0x22, 0x2d, 0x73, + 0x79, 0x2d, 0x73, 0x39, 0x6f, 0xa3, 0x67, 0x8b, + 0x31, 0x3c, 0xe4, 0x44, 0x83, 0x56, 0xb8, 0xd6, + 0x95, 0x5d, 0x23, 0x39, 0xcb, 0xad, 0x44, 0xaf, + 0xcb, 0x6d, 0x0c, 0x57, 0x33, 0x02, 0xdc, 0x6f, + 0x75, 0x43, 0x43, 0xb5, 0xe1, 0x1b, 0x8b, 0xbb, + 0xe0, 0x97, 0x74, 0xcf, 0xa1, 0xfa, 0x49, 0xf0, + 0x4b, 0xba, 0x67, 0xd0, 0xfd, 0x24, 0x10, 0xd6, + 0x99, 0x98, 0xb7, 0xcb, 0xae, 0xec, 0x9c, 0xc2, + 0xf7, 0x5d, 0x50, 0xf3, 0x98, 0x80, 0xa1, 0xdd, + 0xa8, 0x58, 0xca, 0x33, 0x37, 0xe5, 0xb7, 0x46, + 0x5c, 0x1c, 0xe3, 0x1e, 0xdc, 0x12, 0xc7, 0x5d, + 0x25, 0xa7, 0x76, 0xbb, 0xea, 0x6b, 0xe0, 0x97, + 0x74, 0xcf, 0xa1, 0xfa, 0x49, 0xf0, 0x49, 0xe9, + 0x9f, 0x43, 0xf4, 0x90, 0x71, 0x41, 0x9d, 0x65, + 0xb6, 0x17, 0x02, 0x5b, 0x0b, 0x3c, 0x15, 0x3f, + 0xad, 0x2f, 0x75, 0x48, 0x6f, 0xcd, 0x60, 0xd4, + 0x02, 0xe7, 0x83, 0x36, 0x8a, 0xd3, 0x37, 0x37, + 0xf6, 0xd0, 0x96, 0xc6, 0x41, 0xc5, 0x0b, 0x9d, + 0x53, 0xe3, 0x79, 0x47, 0x12, 0x95, 0xf8, 0x25, + 0xda, 0xbd, 0xb3, 0xe8, 0x7e, 0x92, 0x7c, 0x10, + 0x7a, 0x60, 0xfd, 0xdf, 0xe9, 0x20, 0x8d, 0xeb, + 0x9b, 0x78, 0x33, 0x06, 0x5e, 0x65, 0xf6, 0xdc, + 0xc0, 0xa1, 0x13, 0x46, 0xe3, 0x5c, 0x78, 0x8d, + 0x4a, 0xdc, 0xcc, 0xeb, 0x2c, 0xb5, 0x7b, 0xee, + 0x6c, 0x2c, 0x9c, 0xcb, 0xa7, 0x83, 0x85, 0xcf, + 0x75, 0x5a, 0xd2, 0x45, 0x0d, 0x02, 0xec, 0xf8, + 0x24, 0xf4, 0xcf, 0xa1, 0xfa, 0x49, 0xf0, 0x49, + 0xe9, 0x9f, 0x43, 0xf4, 0x90, 0x43, 0xd8, 0xe6, + 0xbe, 0xcb, 0x6f, 0x7b, 0x1b, 0xd8, 0x65, 0x7d, + 0xeb, 0x68, 0x5e, 0x08, 0x6e, 0x13, 0xe3, 0x78, + 0xc6, 0xbd, 0x97, 0x2d, 0x59, 0x6e, 0x61, 0x2e, + 0x5d, 0x74, 0xdb, 0x98, 0xc0, 0x7d, 0x06, 0x17, + 0x30, 0xea, 0x73, 0x4e, 0xb5, 0x3b, 0xf0, 0x4b, + 0xba, 0x67, 0xd0, 0xfd, 0x24, 0xf8, 0x25, 0xdd, + 0x33, 0xe8, 0x7e, 0x92, 0x0e, 0x36, 0x67, 0x39, + 0x4d, 0xac, 0xae, 0xbb, 0xb3, 0xb1, 0x73, 0x2e, + 0x9d, 0x5c, 0x25, 0xef, 0xf1, 0x1a, 0x4e, 0xb3, + 0x45, 0x0c, 0xf7, 0xba, 0x49, 0x1d, 0x23, 0xcd, + 0x5e, 0xf7, 0x17, 0x38, 0xf6, 0x4a, 0xb2, 0xfc, + 0x12, 0x7a, 0x67, 0xd0, 0xfd, 0x24, 0xf8, 0x24, + 0xf4, 0xcf, 0xa1, 0xfa, 0x48, 0x2b, 0x08, 0xac, + 0xff, 0x00, 0x04, 0x9e, 0x99, 0xf4, 0x3f, 0x49, + 0x3e, 0x09, 0x3d, 0x33, 0xe8, 0x7e, 0x92, 0x0a, + 0xc2, 0x2b, 0x3f, 0xc1, 0x27, 0xa6, 0x7d, 0x0f, + 0xd2, 0x4f, 0x82, 0x4f, 0x4c, 0xfa, 0x1f, 0xa4, + 0x82, 0xb0, 0x8a, 0xcf, 0xf0, 0x49, 0xe9, 0x9f, + 0x43, 0xf4, 0x93, 0xe0, 0x93, 0xd3, 0x3e, 0x87, + 0xe9, 0x20, 0xac, 0x22, 0xb3, 0xfc, 0x12, 0x7a, + 0x67, 0xd0, 0xfd, 0x24, 0xf8, 0x24, 0xf4, 0xcf, + 0xa1, 0xfa, 0x48, 0x2b, 0x08, 0xac, 0xff, 0x00, + 0x04, 0x9e, 0x99, 0xf4, 0x3f, 0x49, 0x3e, 0x09, + 0x3d, 0x33, 0xe8, 0x7e, 0x92, 0x0a, 0xc2, 0x9c, + 0xd9, 0x4c, 0xb9, 0xd7, 0x17, 0x9e, 0xd8, 0xfd, + 0x10, 0xdb, 0x79, 0x24, 0xe8, 0xab, 0xff, 0x00, + 0xa1, 0x77, 0xc5, 0xb1, 0x71, 0x35, 0xe0, 0xcd, + 0x72, 0x5e, 0xc1, 0xad, 0xad, 0x6e, 0x12, 0x7b, + 0xb5, 0x2b, 0xbe, 0xee, 0x7b, 0x7b, 0x3b, 0x71, + 0x65, 0x68, 0x03, 0x00, 0xd0, 0xec, 0x3a, 0x9a, + 0x0f, 0x67, 0x7d, 0x07, 0x15, 0xe4, 0xdc, 0xfd, + 0xcc, 0x92, 0x0d, 0x2d, 0x26, 0x8d, 0xed, 0x0d, + 0x0b, 0x4a, 0xc7, 0xe5, 0x45, 0x94, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x1d, 0xc6, 0xd5, 0xb9, 0xa6, + 0x4f, 0x2d, 0x9f, 0xfc, 0x56, 0x0f, 0xd5, 0xd7, + 0x7c, 0x69, 0x6f, 0x71, 0x52, 0xde, 0xc7, 0xc6, + 0xf2, 0xc7, 0x82, 0xd7, 0xb4, 0xd1, 0xcd, 0x3a, + 0xc1, 0xde, 0x2a, 0xd9, 0x69, 0x72, 0xfb, 0x69, + 0x83, 0xda, 0x2a, 0x0e, 0x87, 0x34, 0x6e, 0x85, + 0xd5, 0x7f, 0x92, 0x65, 0xd9, 0xb8, 0x17, 0x11, + 0xb8, 0xc7, 0x29, 0xd7, 0x23, 0x37, 0x7c, 0xf1, + 0xbe, 0x82, 0x90, 0x8a, 0xcf, 0xf0, 0x49, 0x3a, + 0x7d, 0xae, 0x9d, 0x8c, 0x1f, 0xa4, 0x13, 0xe0, + 0x93, 0xd3, 0x3e, 0x87, 0xe9, 0x20, 0xac, 0x22, + 0xb3, 0xfc, 0x12, 0x7a, 0x67, 0xd0, 0xfd, 0x24, + 0xf8, 0x24, 0xf4, 0xcf, 0xa1, 0xfa, 0x48, 0x2b, + 0x08, 0xac, 0xff, 0x00, 0x04, 0x9e, 0x99, 0xf4, + 0x3f, 0x49, 0x3e, 0x09, 0x3d, 0x33, 0xe8, 0x7e, + 0x92, 0x0a, 0xc2, 0x97, 0xc8, 0x5e, 0x27, 0x86, + 0xf7, 0x2c, 0x3a, 0xee, 0xa3, 0x2e, 0x8b, 0xb3, + 0x23, 0x35, 0x0e, 0xea, 0x90, 0xf8, 0x24, 0xf4, + 0xcf, 0xa1, 0xfa, 0x4b, 0xdc, 0x3b, 0x1f, 0x2c, + 0x12, 0xb2, 0x68, 0xaf, 0x68, 0xf8, 0xdc, 0x1c, + 0xd3, 0xcd, 0xee, 0x8d, 0x3f, 0x3d, 0x04, 0x25, + 0xa6, 0x67, 0xec, 0xd9, 0x7d, 0xd5, 0x89, 0x88, + 0xb9, 0xd7, 0x34, 0xab, 0xf1, 0x00, 0x1b, 0x4d, + 0x06, 0xa0, 0xeb, 0x5c, 0xd6, 0x37, 0x1e, 0xcd, + 0x75, 0x0c, 0xe0, 0x63, 0xe6, 0x9e, 0xd7, 0x11, + 0x5d, 0x27, 0x73, 0x42, 0xb2, 0x4b, 0xb1, 0xd2, + 0x4d, 0x2b, 0xe6, 0x7d, 0xd8, 0x0e, 0x7b, 0x8b, + 0x8d, 0x23, 0xa0, 0xa9, 0x35, 0xd0, 0x03, 0x97, + 0x8f, 0x82, 0x5d, 0xd3, 0x3e, 0x87, 0xe9, 0x20, + 0x8b, 0x39, 0xdc, 0x8c, 0xce, 0x1d, 0x9a, 0x42, + 0xcc, 0x06, 0x42, 0x31, 0x44, 0xe3, 0x5a, 0xb3, + 0x08, 0x69, 0x04, 0xf6, 0xc2, 0xe9, 0x66, 0x75, + 0x95, 0xda, 0xc8, 0xfb, 0xab, 0x2b, 0x22, 0xcb, + 0xb7, 0x83, 0x47, 0x3d, 0xd5, 0x6b, 0x4b, 0xb5, + 0xd0, 0x2e, 0xbf, 0x82, 0x4f, 0x4c, 0xfa, 0x1f, + 0xa4, 0x9f, 0x04, 0x9e, 0x99, 0xf4, 0x3f, 0x49, + 0x04, 0x56, 0x5b, 0x9c, 0x1b, 0x63, 0x71, 0x15, + 0xd4, 0x7e, 0xd1, 0x6f, 0x76, 0x4b, 0xa6, 0x61, + 0x34, 0x24, 0x9d, 0x38, 0x81, 0xec, 0xad, 0xaf, + 0xcd, 0xec, 0xad, 0xed, 0x25, 0xb7, 0xca, 0xed, + 0x9d, 0x09, 0x9c, 0x61, 0x96, 0x49, 0x1d, 0x89, + 0xc5, 0xba, 0xa8, 0x14, 0x87, 0xc1, 0x27, 0x57, + 0xb6, 0x7d, 0x0f, 0xd2, 0x4f, 0x82, 0x4f, 0x4c, + 0xfa, 0x1f, 0xa4, 0x82, 0x37, 0x2f, 0xcd, 0xed, + 0x6d, 0xec, 0x1d, 0x97, 0xde, 0x5b, 0xfb, 0x4c, + 0x05, 0xd8, 0xc7, 0x8d, 0x85, 0x68, 0xcd, 0x6f, + 0xe0, 0xbc, 0x74, 0x0c, 0xb7, 0x8c, 0xc5, 0x6f, + 0x6f, 0x1f, 0x36, 0xc8, 0xdc, 0x6a, 0x41, 0xd6, + 0xed, 0x4a, 0x67, 0xe0, 0x93, 0xd3, 0x3e, 0x87, + 0xe9, 0x27, 0xc1, 0x2e, 0xe9, 0x9f, 0x43, 0xf4, + 0x90, 0x45, 0x65, 0x19, 0xb4, 0x79, 0x7b, 0x6e, + 0x23, 0x96, 0x0f, 0x68, 0x6d, 0xc8, 0x0d, 0x73, + 0x71, 0x61, 0xd1, 0xa6, 0xbb, 0x87, 0x5d, 0x57, + 0x44, 0x79, 0xf5, 0x85, 0xa8, 0x73, 0xec, 0x32, + 0xe6, 0xc1, 0x31, 0x14, 0x12, 0x17, 0x62, 0xa0, + 0x2b, 0xb7, 0xe0, 0x93, 0xd3, 0x3e, 0x87, 0xe9, + 0x27, 0xc1, 0x27, 0xa6, 0x7d, 0x0f, 0xd2, 0x41, + 0x5f, 0x65, 0xf5, 0xc3, 0x2f, 0x5b, 0x7d, 0x8a, + 0xb3, 0x89, 0x39, 0xc2, 0xe3, 0xba, 0x48, 0xa1, + 0xaa, 0x95, 0x39, 0xd6, 0x52, 0x6e, 0x3a, 0xc3, + 0xd8, 0x4f, 0xb6, 0x8d, 0x3e, 0x5f, 0x89, 0x8f, + 0x71, 0xd4, 0x5d, 0x7f, 0x04, 0x9e, 0x99, 0xf4, + 0x3f, 0x49, 0x3e, 0x09, 0x3d, 0x33, 0xe8, 0x7e, + 0x92, 0x0a, 0xf4, 0xf7, 0x32, 0xcf, 0x74, 0xeb, + 0xa9, 0x0f, 0xeb, 0x5e, 0xfc, 0x75, 0xec, 0x8d, + 0x43, 0x75, 0x48, 0x67, 0x39, 0xe9, 0xcc, 0xe2, + 0x86, 0x31, 0x11, 0x8b, 0x9a, 0x38, 0x9c, 0x4b, + 0xaa, 0x1c, 0x48, 0xa6, 0xac, 0x21, 0x48, 0xfc, + 0x12, 0x7a, 0x67, 0xd0, 0xfd, 0x24, 0xf8, 0x24, + 0xf4, 0xcf, 0xa1, 0xfa, 0x48, 0x21, 0xe3, 0xcc, + 0x83, 0x32, 0x79, 0x32, 0xde, 0x6c, 0x93, 0x23, + 0xc3, 0xc4, 0x95, 0xa3, 0x68, 0x29, 0xa2, 0x9d, + 0xc5, 0xbe, 0xdb, 0x38, 0xb5, 0x7d, 0x83, 0x6c, + 0x73, 0x18, 0x0c, 0xf1, 0xc4, 0x6b, 0x13, 0xd8, + 0xec, 0x2e, 0x6f, 0x61, 0x48, 0xfc, 0x12, 0x7a, + 0x67, 0xd0, 0xfd, 0x24, 0xf8, 0x24, 0xf4, 0xcf, + 0xa1, 0xfa, 0x48, 0x21, 0xf3, 0x4c, 0xd0, 0x5e, + 0x36, 0x18, 0x20, 0x8f, 0xd9, 0xed, 0x6d, 0xc5, + 0x22, 0x8e, 0xb5, 0x35, 0x3f, 0x9c, 0x57, 0x63, + 0xf3, 0x9c, 0xb6, 0xf0, 0x45, 0x26, 0x65, 0x68, + 0x65, 0xb9, 0x88, 0x00, 0x5e, 0xc7, 0x50, 0x3e, + 0x9a, 0xb1, 0x2e, 0xcf, 0x82, 0x4f, 0x4c, 0xfa, + 0x1f, 0xa4, 0x9f, 0x04, 0x9e, 0x99, 0xf4, 0x3f, + 0x49, 0x04, 0x78, 0xcf, 0xcb, 0xaf, 0xa7, 0xbd, + 0x99, 0x94, 0x93, 0x99, 0x74, 0x56, 0xd1, 0xb7, + 0x54, 0x75, 0x1a, 0xc9, 0x51, 0x1d, 0xff, 0x00, + 0xca, 0x8a, 0xcf, 0xf0, 0x4b, 0xba, 0x67, 0xd0, + 0xfd, 0x24, 0xf8, 0x24, 0xf4, 0xcf, 0xa1, 0xfa, + 0x48, 0x23, 0xed, 0xf3, 0x9b, 0x69, 0x2d, 0x19, + 0x69, 0x9a, 0x5b, 0x9b, 0x96, 0x43, 0xfb, 0x29, + 0x1a, 0x70, 0xb8, 0x76, 0x17, 0x8c, 0xc3, 0x38, + 0x8e, 0x6b, 0x46, 0xd8, 0x59, 0x41, 0xec, 0xd6, + 0x80, 0xd5, 0xcd, 0xad, 0x5c, 0xe2, 0x37, 0xca, + 0x93, 0xf8, 0x24, 0xf4, 0xcf, 0xa1, 0xfa, 0x49, + 0xf0, 0x49, 0xe9, 0x9f, 0x43, 0xf4, 0x90, 0x57, + 0x6d, 0x27, 0x16, 0xd7, 0x50, 0xdc, 0x11, 0x88, + 0x42, 0xf6, 0xbf, 0x0d, 0x68, 0x4e, 0x12, 0x0e, + 0xea, 0xdb, 0x99, 0x5e, 0x8b, 0xfb, 0xd9, 0x2e, + 0xc3, 0x0c, 0x62, 0x4a, 0x78, 0xa4, 0x83, 0x4a, + 0x00, 0x37, 0x14, 0xef, 0xc1, 0x27, 0xa6, 0x7d, + 0x0f, 0xd2, 0x4f, 0x82, 0x4f, 0x4c, 0xfa, 0x1f, + 0xa4, 0x82, 0x27, 0x2b, 0xcd, 0xc5, 0x94, 0x72, + 0x5a, 0xdc, 0x44, 0x2e, 0x2d, 0x26, 0xf2, 0xe3, + 0xad, 0x08, 0xec, 0x85, 0xd3, 0x0e, 0x7b, 0x97, + 0xd8, 0xc8, 0xd3, 0x97, 0xda, 0x18, 0x98, 0x5c, + 0x0c, 0xa5, 0xce, 0xab, 0xdc, 0xd1, 0xf9, 0xa3, + 0x78, 0x55, 0x76, 0xfc, 0x12, 0x7a, 0x67, 0xd0, + 0xfd, 0x24, 0xf8, 0x24, 0xf4, 0xcf, 0xa1, 0xfa, + 0x48, 0x38, 0x72, 0x79, 0x84, 0x72, 0xdf, 0xe6, + 0xce, 0x6e, 0x16, 0xc2, 0xd7, 0x96, 0x34, 0xfa, + 0xc9, 0x49, 0xc2, 0xc5, 0x0c, 0x49, 0x3a, 0x49, + 0xa9, 0xdf, 0xed, 0xe9, 0x56, 0xc3, 0xb2, 0xb3, + 0x9b, 0x56, 0xda, 0x0b, 0xc0, 0x21, 0x0f, 0x32, + 0x11, 0xcd, 0xe9, 0x24, 0x8a, 0x69, 0xf1, 0xf7, + 0x16, 0xaf, 0x82, 0x4f, 0x4c, 0xfa, 0x1f, 0xa4, + 0x82, 0xb0, 0x8a, 0xcf, 0xf0, 0x49, 0xe9, 0x9f, + 0x43, 0xf4, 0x93, 0xe0, 0x93, 0xd3, 0x3e, 0x87, + 0xe9, 0x20, 0xac, 0x22, 0xb3, 0xfc, 0x12, 0x7a, + 0x67, 0xd0, 0xfd, 0x24, 0xf8, 0x24, 0xf4, 0xcf, + 0xa1, 0xfa, 0x48, 0x2b, 0x08, 0xac, 0xff, 0x00, + 0x04, 0x9e, 0x99, 0xf4, 0x3f, 0x49, 0x3e, 0x09, + 0x3d, 0x33, 0xe8, 0x7e, 0x92, 0x0a, 0xc2, 0xb2, + 0x6c, 0x95, 0x86, 0x13, 0x26, 0x67, 0x30, 0xa4, + 0x6c, 0x05, 0xb1, 0x13, 0xbb, 0xa3, 0xc7, 0x77, + 0xc8, 0xba, 0x2d, 0xb6, 0x36, 0xda, 0x37, 0x87, + 0x5c, 0xcc, 0xe9, 0x98, 0xdf, 0xf8, 0x60, 0x61, + 0x07, 0xba, 0xbb, 0x33, 0x0b, 0xa8, 0x9b, 0x18, + 0xb4, 0xb6, 0x01, 0xb1, 0xb6, 0x81, 0xd8, 0x75, + 0x50, 0x7e, 0x68, 0x41, 0xc1, 0x34, 0xbc, 0xec, + 0xae, 0x90, 0xeb, 0x79, 0xa8, 0x1b, 0xcb, 0xca, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0xf7, 0x03, 0x71, 0x4a, 0xd1, 0xd9, 0xaa, 0xee, + 0xd7, 0xa5, 0x73, 0x5a, 0x32, 0x95, 0x79, 0xdd, + 0xd0, 0x17, 0x4a, 0x02, 0xe3, 0xbd, 0xf7, 0xab, + 0x5f, 0xb4, 0xf9, 0x42, 0xec, 0x5c, 0x77, 0xbe, + 0xf5, 0x6b, 0xf6, 0x9f, 0x28, 0x40, 0xb2, 0xf7, + 0x9b, 0xaf, 0x3c, 0xf8, 0x4a, 0xec, 0x5c, 0x76, + 0x5e, 0xf3, 0x75, 0xe7, 0x9f, 0x09, 0x5d, 0x88, + 0x0b, 0xcb, 0xda, 0x1e, 0xdc, 0x27, 0x52, 0xf4, + 0x88, 0x38, 0x24, 0x8d, 0xd1, 0xba, 0x87, 0xb8, + 0x57, 0x95, 0xde, 0xf6, 0x35, 0xed, 0xc2, 0xe1, + 0x50, 0xb9, 0xa4, 0xb5, 0x7b, 0x7c, 0x83, 0x88, + 0x6f, 0x20, 0xd2, 0x8d, 0x2e, 0x6b, 0xb1, 0x34, + 0x90, 0x77, 0xc1, 0xa1, 0x59, 0x73, 0x1c, 0x3f, + 0x34, 0xac, 0x20, 0xdf, 0xed, 0xf7, 0x80, 0x7e, + 0xd9, 0xdf, 0x97, 0x71, 0x3a, 0xc2, 0xf7, 0xd7, + 0x3b, 0xbd, 0xc4, 0xb4, 0x22, 0x0d, 0xfd, 0x61, + 0x7b, 0xeb, 0x9d, 0xde, 0xe2, 0x4e, 0xb0, 0xbd, + 0xf5, 0xce, 0xef, 0x71, 0x2d, 0x08, 0x83, 0x7f, + 0x58, 0x5e, 0xfa, 0xe7, 0x77, 0xb8, 0x93, 0xac, + 0x2f, 0x7d, 0x73, 0xbb, 0xdc, 0x4b, 0x42, 0x20, + 0xdf, 0xd6, 0x17, 0xbe, 0xb9, 0xdd, 0xee, 0x24, + 0xeb, 0x0b, 0xdf, 0x5c, 0xee, 0xf7, 0x12, 0xd0, + 0x88, 0x37, 0xf5, 0x85, 0xef, 0xae, 0x77, 0x7b, + 0x89, 0x3a, 0xc2, 0xf7, 0xd7, 0x3b, 0xbd, 0xc4, + 0xb4, 0x22, 0x0d, 0xfd, 0x61, 0x7b, 0xeb, 0x9d, + 0xde, 0xe2, 0x4e, 0xb0, 0xbd, 0xf5, 0xce, 0xef, + 0x71, 0x2d, 0x08, 0x83, 0x7f, 0x58, 0x5e, 0xfa, + 0xe7, 0x77, 0xb8, 0x93, 0xac, 0x2f, 0x7d, 0x73, + 0xbb, 0xdc, 0x4b, 0x42, 0x20, 0xdf, 0xd6, 0x17, + 0xbe, 0xb9, 0xdd, 0xee, 0x24, 0xeb, 0x0b, 0xdf, + 0x5c, 0xee, 0xf7, 0x12, 0xd0, 0x88, 0x37, 0xf5, + 0x85, 0xef, 0xae, 0x77, 0x7b, 0x89, 0x3a, 0xc2, + 0xf7, 0xd7, 0x3b, 0xbd, 0xc4, 0xb4, 0x22, 0x0d, + 0xfd, 0x61, 0x7b, 0xeb, 0x9d, 0xde, 0xe2, 0x4e, + 0xb0, 0xbd, 0xf5, 0xce, 0xef, 0x71, 0x2d, 0x08, + 0x83, 0x7f, 0x58, 0x5e, 0xfa, 0xe7, 0x77, 0xb8, + 0x93, 0xac, 0x2f, 0x7d, 0x73, 0xbb, 0xdc, 0x4b, + 0x42, 0x20, 0xdf, 0xd6, 0x17, 0xbe, 0xb9, 0xdd, + 0xee, 0x24, 0xeb, 0x0b, 0xdf, 0x5c, 0xee, 0xf7, + 0x12, 0xd0, 0x88, 0x37, 0xf5, 0x85, 0xef, 0xae, + 0x77, 0x7b, 0x89, 0x3a, 0xc2, 0xf7, 0xd7, 0x3b, + 0xbd, 0xc4, 0xb4, 0x22, 0x0d, 0xfd, 0x61, 0x7b, + 0xeb, 0x9d, 0xde, 0xe2, 0x4e, 0xb0, 0xbd, 0xf5, + 0xce, 0xef, 0x71, 0x2d, 0x08, 0x83, 0x7f, 0x58, + 0x5e, 0xfa, 0xe7, 0x77, 0xb8, 0x93, 0xac, 0x2f, + 0x7d, 0x73, 0xbb, 0xdc, 0x4b, 0x42, 0x20, 0xdf, + 0xd6, 0x17, 0xbe, 0xb9, 0xdd, 0xee, 0x24, 0xeb, + 0x0b, 0xdf, 0x5c, 0xee, 0xf7, 0x12, 0xd0, 0x88, + 0x37, 0xf5, 0x85, 0xef, 0xae, 0x77, 0x7b, 0x89, + 0x3a, 0xc2, 0xf7, 0xd7, 0x3b, 0xbd, 0xc4, 0xb4, + 0x22, 0x0d, 0xfd, 0x61, 0x7b, 0xeb, 0x9d, 0xde, + 0xe2, 0x4e, 0xb0, 0xbd, 0xf5, 0xce, 0xef, 0x71, + 0x2d, 0x08, 0x83, 0x7f, 0x58, 0x5e, 0xfa, 0xe7, + 0x77, 0xb8, 0x93, 0xac, 0x2f, 0x7d, 0x73, 0xbb, + 0xdc, 0x4b, 0x42, 0x20, 0xdf, 0xd6, 0x17, 0xbe, + 0xb9, 0xdd, 0xee, 0x24, 0xeb, 0x0b, 0xdf, 0x5c, + 0xee, 0xf7, 0x12, 0xd0, 0x88, 0x37, 0xf5, 0x85, + 0xef, 0xae, 0x77, 0x7b, 0x89, 0x3a, 0xc2, 0xf7, + 0xd7, 0x3b, 0xbd, 0xc4, 0xb4, 0x22, 0x0d, 0xcf, + 0xbc, 0xba, 0x78, 0xc2, 0xe9, 0x5c, 0x46, 0xe8, + 0xaf, 0xf4, 0x2d, 0x0b, 0x28, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x0b, 0xd3, 0x25, + 0x92, 0x33, 0x8a, 0x37, 0x16, 0x9e, 0xc1, 0x5e, + 0x51, 0x06, 0xfe, 0xb0, 0xbd, 0xf5, 0xce, 0xef, + 0x71, 0x27, 0x58, 0x5e, 0xfa, 0xe7, 0x77, 0xb8, + 0x96, 0x84, 0x41, 0xbf, 0xac, 0x2f, 0x7d, 0x73, + 0xbb, 0xdc, 0x49, 0xd6, 0x17, 0xbe, 0xb9, 0xdd, + 0xee, 0x25, 0xa1, 0x10, 0x6f, 0xeb, 0x0b, 0xdf, + 0x5c, 0xee, 0xf7, 0x12, 0x75, 0x85, 0xef, 0xae, + 0x77, 0x7b, 0x89, 0x68, 0x44, 0x1b, 0xfa, 0xc2, + 0xf7, 0xd7, 0x3b, 0xbd, 0xc4, 0x9d, 0x61, 0x7b, + 0xeb, 0x9d, 0xde, 0xe2, 0x5a, 0x11, 0x06, 0xfe, + 0xb0, 0xbd, 0xf5, 0xce, 0xef, 0x71, 0x27, 0x58, + 0x5e, 0xfa, 0xe7, 0x77, 0xb8, 0x96, 0x84, 0x41, + 0xbf, 0xac, 0x2f, 0x7d, 0x73, 0xbb, 0xdc, 0x49, + 0xd6, 0x17, 0xbe, 0xb9, 0xdd, 0xee, 0x25, 0xa1, + 0x10, 0x6f, 0xeb, 0x0b, 0xdf, 0x5c, 0xee, 0xf7, + 0x12, 0x75, 0x85, 0xef, 0xae, 0x77, 0x7b, 0x89, + 0x68, 0x44, 0x1b, 0xfa, 0xc2, 0xf7, 0xd7, 0x3b, + 0xbd, 0xc4, 0x9d, 0x61, 0x7b, 0xeb, 0x9d, 0xde, + 0xe2, 0x5a, 0x11, 0x06, 0xfe, 0xb0, 0xbd, 0xf5, + 0xce, 0xef, 0x71, 0x27, 0x58, 0x5e, 0xfa, 0xe7, + 0x77, 0xb8, 0x96, 0x84, 0x41, 0xbf, 0xac, 0x2f, + 0x7d, 0x73, 0xbb, 0xdc, 0x49, 0xd6, 0x17, 0xbe, + 0xb9, 0xdd, 0xee, 0x25, 0xa1, 0x10, 0x6f, 0xeb, + 0x0b, 0xdf, 0x5c, 0xee, 0xf7, 0x12, 0x75, 0x85, + 0xef, 0xae, 0x77, 0x7b, 0x89, 0x68, 0x44, 0x1b, + 0xfa, 0xc2, 0xf7, 0xd7, 0x3b, 0xbd, 0xc4, 0x9d, + 0x61, 0x7b, 0xeb, 0x9d, 0xde, 0xe2, 0x5a, 0x11, + 0x06, 0xfe, 0xb0, 0xbd, 0xf5, 0xce, 0xef, 0x71, + 0x27, 0x58, 0x5e, 0xfa, 0xe7, 0x77, 0xb8, 0x96, + 0x84, 0x41, 0xbf, 0xac, 0x2f, 0x7d, 0x73, 0xbb, + 0xdc, 0x49, 0xd6, 0x17, 0xbe, 0xb9, 0xdd, 0xee, + 0x25, 0xa1, 0x10, 0x6f, 0xeb, 0x0b, 0xdf, 0x5c, + 0xee, 0xf7, 0x12, 0x75, 0x85, 0xef, 0xae, 0x77, + 0x7b, 0x89, 0x68, 0x44, 0x1b, 0xfa, 0xc2, 0xf7, + 0xd7, 0x3b, 0xbd, 0xc4, 0x9d, 0x61, 0x7b, 0xeb, + 0x9d, 0xde, 0xe2, 0x5a, 0x11, 0x06, 0xfe, 0xb0, + 0xbd, 0xf5, 0xce, 0xef, 0x71, 0x27, 0x58, 0x5e, + 0xfa, 0xe7, 0x77, 0xb8, 0x96, 0x84, 0x41, 0xbf, + 0xac, 0x2f, 0x7d, 0x73, 0xbb, 0xdc, 0x49, 0xd6, + 0x17, 0xbe, 0xb9, 0xdd, 0xee, 0x25, 0xa1, 0x10, + 0x6f, 0xeb, 0x0b, 0xdf, 0x5c, 0xee, 0xf7, 0x12, + 0x75, 0x85, 0xef, 0xae, 0x77, 0x7b, 0x89, 0x68, + 0x44, 0x1b, 0xfa, 0xc2, 0xf7, 0xd7, 0x3b, 0xbd, + 0xc4, 0x9d, 0x61, 0x7b, 0xeb, 0x9d, 0xde, 0xe2, + 0x5a, 0x11, 0x06, 0xfe, 0xb0, 0xbd, 0xf5, 0xce, + 0xef, 0x71, 0x27, 0x58, 0x5e, 0xfa, 0xe7, 0x77, + 0xb8, 0x96, 0x84, 0x41, 0xb6, 0x4b, 0xbb, 0xa9, + 0x05, 0x1f, 0x2b, 0x9c, 0x37, 0xab, 0x4f, 0x02, + 0xd4, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x89, + 0x43, 0xbc, 0xb2, 0x23, 0x79, 0xd4, 0xd2, 0x83, + 0x0b, 0x64, 0x51, 0x19, 0x0e, 0xf3, 0x46, 0xb3, + 0xc4, 0xbd, 0xc7, 0x6a, 0xed, 0x06, 0x43, 0xa3, + 0x78, 0x2e, 0x90, 0x00, 0x14, 0x02, 0x81, 0x00, + 0x00, 0x00, 0x03, 0x50, 0x59, 0x44, 0x40, 0x5c, + 0x77, 0xbe, 0xf5, 0x6b, 0xf6, 0x9f, 0x28, 0x5d, + 0x8b, 0x8e, 0xf7, 0xde, 0xad, 0x7e, 0xd3, 0xe5, + 0x08, 0x16, 0x5e, 0xf3, 0x75, 0xe7, 0x9f, 0x09, + 0x5d, 0x8b, 0x8e, 0xc6, 0xa6, 0xe6, 0xef, 0x47, + 0xe7, 0x91, 0xdf, 0x2b, 0xb1, 0x01, 0x11, 0x10, + 0x12, 0xa8, 0x88, 0x07, 0x4e, 0xb4, 0xa2, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x05, 0x13, 0x4e, 0xfa, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0xe3, + 0xbd, 0xf7, 0xab, 0x5f, 0xb4, 0xf9, 0x42, 0xec, + 0x5c, 0x77, 0xbe, 0xf5, 0x6b, 0xe7, 0x83, 0xc2, + 0x42, 0x0e, 0x59, 0x1a, 0x3d, 0xa6, 0x6e, 0x6a, + 0x49, 0x6b, 0x8c, 0xe2, 0xc0, 0xc1, 0x4a, 0xd4, + 0xff, 0x00, 0x5d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x30, 0xcf, 0xeb, 0x2e, 0x39, + 0x03, 0xd3, 0x44, 0x40, 0xc3, 0x3f, 0xac, 0xb8, + 0xe4, 0x0f, 0x4d, 0x23, 0x6f, 0xfd, 0xc4, 0x1c, + 0xe3, 0xe5, 0x27, 0x10, 0xc2, 0x1e, 0xc0, 0x06, + 0xbd, 0xdf, 0x1d, 0x11, 0x07, 0xff, 0xd9, +}; + +static const uint8_t data_images_tiva_globe_small_gif[] = +{ + /* /images/tiva_globe-small.gif */ + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x74, 0x69, 0x76, 0x61, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x65, 0x2d, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x2e, 0x67, 0x69, 0x66, 0x00, + 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0xa4, 0x01, + 0xf3, 0x01, 0xb3, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x66, 0x66, + 0x66, 0xcc, 0xcc, 0xcc, 0xff, 0x66, 0x66, 0xff, + 0x99, 0x99, 0xff, 0x33, 0x33, 0xff, 0xcc, 0xcc, + 0x33, 0x33, 0x33, 0x99, 0x33, 0x33, 0x4d, 0x4c, + 0x4c, 0x99, 0x99, 0x99, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0x0b, + 0x58, 0x4d, 0x50, 0x20, 0x44, 0x61, 0x74, 0x61, + 0x58, 0x4d, 0x50, 0x3c, 0x3f, 0x78, 0x70, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, + 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, + 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, + 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, + 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, + 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, + 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, + 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, + 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, + 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x30, + 0x2d, 0x63, 0x30, 0x36, 0x30, 0x20, 0x36, 0x31, + 0x2e, 0x31, 0x33, 0x34, 0x37, 0x37, 0x37, 0x2c, + 0x20, 0x32, 0x30, 0x31, 0x30, 0x2f, 0x30, 0x32, + 0x2f, 0x31, 0x32, 0x2d, 0x31, 0x37, 0x3a, 0x33, + 0x32, 0x3a, 0x30, 0x30, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, + 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, + 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, + 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, + 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, + 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, + 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, + 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, + 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, + 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, + 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, + 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, + 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, + 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, + 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, + 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, + 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, + 0x64, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x70, 0x75, 0x72, 0x6c, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x63, 0x2f, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x31, 0x2e, 0x31, 0x2f, 0x22, 0x20, 0x78, 0x6d, + 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, + 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, + 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, + 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, + 0x3a, 0x42, 0x43, 0x32, 0x36, 0x41, 0x38, 0x31, + 0x39, 0x32, 0x36, 0x44, 0x45, 0x31, 0x31, 0x45, + 0x33, 0x39, 0x36, 0x37, 0x32, 0x38, 0x44, 0x36, + 0x41, 0x36, 0x30, 0x35, 0x45, 0x30, 0x37, 0x41, + 0x38, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, + 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, + 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x42, 0x43, 0x32, + 0x36, 0x41, 0x38, 0x31, 0x38, 0x32, 0x36, 0x44, + 0x45, 0x31, 0x31, 0x45, 0x33, 0x39, 0x36, 0x37, + 0x32, 0x38, 0x44, 0x36, 0x41, 0x36, 0x30, 0x35, + 0x45, 0x30, 0x37, 0x41, 0x38, 0x22, 0x20, 0x78, + 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, + 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, + 0x43, 0x53, 0x35, 0x20, 0x57, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x73, 0x22, 0x3e, 0x20, 0x3c, 0x78, + 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, + 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, + 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, + 0x44, 0x3d, 0x22, 0x75, 0x75, 0x69, 0x64, 0x3a, + 0x66, 0x61, 0x66, 0x35, 0x62, 0x64, 0x64, 0x35, + 0x2d, 0x62, 0x61, 0x33, 0x64, 0x2d, 0x31, 0x31, + 0x64, 0x61, 0x2d, 0x61, 0x64, 0x33, 0x31, 0x2d, + 0x64, 0x33, 0x33, 0x64, 0x37, 0x35, 0x31, 0x38, + 0x32, 0x66, 0x31, 0x62, 0x22, 0x20, 0x73, 0x74, + 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, + 0x75, 0x75, 0x69, 0x64, 0x3a, 0x66, 0x61, 0x66, + 0x35, 0x62, 0x64, 0x64, 0x35, 0x2d, 0x62, 0x61, + 0x33, 0x64, 0x2d, 0x31, 0x31, 0x64, 0x61, 0x2d, + 0x61, 0x64, 0x33, 0x31, 0x2d, 0x64, 0x33, 0x33, + 0x64, 0x37, 0x35, 0x31, 0x38, 0x32, 0x66, 0x31, + 0x62, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x64, 0x63, + 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, + 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x53, + 0x65, 0x71, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, + 0x3a, 0x6c, 0x69, 0x3e, 0x48, 0x61, 0x75, 0x67, + 0x6c, 0x69, 0x65, 0x3c, 0x2f, 0x72, 0x64, 0x66, + 0x3a, 0x6c, 0x69, 0x3e, 0x20, 0x3c, 0x72, 0x64, + 0x66, 0x3a, 0x6c, 0x69, 0x3e, 0x4a, 0x6f, 0x65, + 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, + 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, + 0x53, 0x65, 0x71, 0x3e, 0x20, 0x3c, 0x2f, 0x64, + 0x63, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, + 0x72, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, + 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, + 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, + 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, + 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, + 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, + 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, + 0x3e, 0x01, 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, + 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, + 0xf1, 0xf0, 0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, + 0xe9, 0xe8, 0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, + 0xe1, 0xe0, 0xdf, 0xde, 0xdd, 0xdc, 0xdb, 0xda, + 0xd9, 0xd8, 0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, + 0xd1, 0xd0, 0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, + 0xc9, 0xc8, 0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, + 0xc1, 0xc0, 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, + 0xb9, 0xb8, 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, + 0xb1, 0xb0, 0xaf, 0xae, 0xad, 0xac, 0xab, 0xaa, + 0xa9, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, + 0xa1, 0xa0, 0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, + 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, + 0x91, 0x90, 0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, + 0x89, 0x88, 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, + 0x81, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, + 0x79, 0x78, 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, + 0x71, 0x70, 0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, + 0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, + 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, + 0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, + 0x51, 0x50, 0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, + 0x49, 0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, + 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, + 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, + 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, + 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, + 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, + 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, + 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, + 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, + 0x01, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, + 0xa4, 0x01, 0xf3, 0x01, 0x00, 0x04, 0xff, 0x10, + 0xc8, 0x49, 0xab, 0xbd, 0x38, 0xeb, 0xcd, 0xbb, + 0xff, 0x60, 0x28, 0x8e, 0xa4, 0x46, 0x0c, 0xc9, + 0xc2, 0x18, 0x04, 0x6b, 0x30, 0x03, 0x51, 0xce, + 0x74, 0x6d, 0xdf, 0x78, 0xae, 0xef, 0x7c, 0xef, + 0xff, 0x20, 0x82, 0x50, 0x06, 0x10, 0x52, 0x88, + 0x43, 0xa0, 0x72, 0xc9, 0x6c, 0x3a, 0x9f, 0xd0, + 0xa8, 0x74, 0x68, 0x0c, 0x09, 0x19, 0xd8, 0xaa, + 0x74, 0xcb, 0xed, 0x7a, 0xbf, 0xe0, 0xe7, 0x75, + 0x10, 0xb3, 0xb4, 0x0c, 0xaf, 0x44, 0x82, 0x48, + 0x13, 0x92, 0x19, 0xec, 0xb0, 0x7c, 0x4e, 0xaf, + 0xdb, 0xa1, 0xc2, 0x85, 0x7a, 0x51, 0xae, 0x0c, + 0x02, 0x0a, 0x03, 0x05, 0x05, 0x70, 0x3b, 0x04, + 0x30, 0x7d, 0x77, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, + 0x47, 0x5a, 0x15, 0x6e, 0x85, 0x4c, 0x87, 0x7c, + 0x71, 0x17, 0x98, 0x8f, 0x9b, 0x9c, 0x9d, 0x9e, + 0x1f, 0x49, 0x18, 0x27, 0x89, 0x78, 0x03, 0x2a, + 0x9a, 0x92, 0xa8, 0x9f, 0xab, 0xac, 0xad, 0x74, + 0x87, 0x94, 0x92, 0x30, 0x0c, 0x61, 0x0c, 0x97, + 0x26, 0xa1, 0xae, 0xba, 0xbb, 0xbc, 0x4c, 0x70, + 0x91, 0x13, 0xa3, 0xaa, 0x5d, 0x04, 0x0b, 0x0b, + 0x98, 0x87, 0x6c, 0x59, 0xbd, 0xcc, 0xcd, 0xce, + 0x23, 0x87, 0xa4, 0x47, 0x64, 0xc3, 0x60, 0x27, + 0xc7, 0x13, 0x7f, 0x01, 0x01, 0x31, 0x6e, 0xd8, + 0x26, 0xcf, 0xe1, 0xe2, 0xac, 0xd1, 0xaa, 0xb3, + 0x8a, 0x57, 0x88, 0x09, 0x31, 0xeb, 0xa6, 0xa6, + 0xc6, 0x64, 0xee, 0x04, 0x29, 0x6f, 0xdd, 0xc5, + 0x01, 0xd5, 0xe3, 0xfa, 0xfb, 0x5e, 0xe5, 0xa2, + 0x2a, 0x5c, 0x60, 0xb1, 0x71, 0xf3, 0x8e, 0x0f, + 0xb5, 0x24, 0xc5, 0xbe, 0x65, 0x38, 0x41, 0x6b, + 0xc8, 0x00, 0x18, 0x0b, 0x14, 0x10, 0x42, 0xc0, + 0xaf, 0xa2, 0xc5, 0x29, 0x30, 0x54, 0x15, 0xa3, + 0xd5, 0x65, 0xc1, 0xb6, 0x00, 0x29, 0xff, 0xe0, + 0xfd, 0xe2, 0x90, 0x30, 0x5f, 0xc6, 0x4c, 0x06, + 0x14, 0xac, 0x8b, 0x75, 0xb1, 0xa5, 0x4b, 0x1c, + 0xd4, 0x44, 0x91, 0xe9, 0x67, 0x2b, 0x80, 0x31, + 0x85, 0x21, 0x18, 0xac, 0xe3, 0x70, 0xd2, 0xcc, + 0x2f, 0x4b, 0x2c, 0x5f, 0x0a, 0x1d, 0xba, 0x81, + 0x61, 0x86, 0x98, 0x53, 0x0a, 0x06, 0x9d, 0x81, + 0x22, 0x9f, 0xd1, 0x0d, 0xb3, 0xce, 0x11, 0x9d, + 0x4a, 0x75, 0x54, 0x06, 0x5b, 0xf9, 0x66, 0x00, + 0x0b, 0x06, 0xf1, 0x54, 0x8f, 0x79, 0x0b, 0x48, + 0xe2, 0x2c, 0x9a, 0x8b, 0xaa, 0xd9, 0x8a, 0x27, + 0x34, 0x02, 0x04, 0x32, 0x8a, 0x0f, 0x1f, 0x5b, + 0xb7, 0x96, 0xe8, 0xe4, 0xa8, 0x01, 0xe9, 0x55, + 0xba, 0x5b, 0xcf, 0xea, 0x6d, 0xf6, 0xf0, 0xa8, + 0xb4, 0xaf, 0x80, 0x14, 0x1c, 0x38, 0xa0, 0x00, + 0x24, 0x1e, 0x63, 0x62, 0xab, 0x9d, 0xd8, 0xb9, + 0xb7, 0xf1, 0xb3, 0xb4, 0xff, 0xb2, 0xc2, 0x04, + 0x34, 0x78, 0xb0, 0x1a, 0x29, 0x4d, 0x39, 0xcc, + 0x84, 0x4a, 0xd7, 0xb1, 0x67, 0x57, 0x7d, 0x31, + 0xd8, 0x2d, 0x21, 0x39, 0xa1, 0xa9, 0x04, 0x2a, + 0x13, 0xe0, 0xdb, 0x32, 0x6f, 0x40, 0x62, 0xb2, + 0x9f, 0x63, 0x7f, 0x82, 0x9c, 0x69, 0x2c, 0x34, + 0x92, 0xef, 0x06, 0x1a, 0x49, 0xc6, 0x45, 0x8f, + 0xd3, 0xcd, 0xb2, 0x83, 0xeb, 0xa2, 0x6d, 0xc1, + 0x56, 0x8d, 0xac, 0x09, 0x97, 0x56, 0xc0, 0xc2, + 0x45, 0x67, 0x56, 0xac, 0xc2, 0xa3, 0x7f, 0x82, + 0x91, 0x61, 0x2d, 0xe9, 0xa2, 0x70, 0x25, 0x4b, + 0xe0, 0xad, 0x04, 0xcb, 0x43, 0x65, 0x36, 0xc5, + 0x76, 0x96, 0x4e, 0x5e, 0x51, 0x68, 0x33, 0xb6, + 0xad, 0x98, 0x40, 0xf1, 0xb7, 0x83, 0xf2, 0x1c, + 0x04, 0x3e, 0x6e, 0xeb, 0x8c, 0xb8, 0xa8, 0x75, + 0x49, 0x1d, 0xf2, 0x96, 0xdf, 0x7f, 0xbc, 0x3d, + 0x00, 0xe3, 0x5a, 0x99, 0x60, 0xcc, 0xff, 0x78, + 0x22, 0xe8, 0x07, 0x4a, 0x59, 0xd3, 0x18, 0x64, + 0x41, 0x66, 0x1b, 0x98, 0x22, 0x0a, 0x7f, 0x10, + 0x3a, 0x41, 0x9c, 0x1f, 0xae, 0x5d, 0xb7, 0x10, + 0x0a, 0x04, 0x92, 0x70, 0x88, 0x86, 0x1e, 0x81, + 0x04, 0x92, 0x7f, 0x57, 0xad, 0x06, 0x55, 0x7a, + 0xda, 0x45, 0x68, 0x22, 0x09, 0x0c, 0x84, 0x87, + 0x5e, 0x89, 0x56, 0x0c, 0x08, 0x1b, 0x08, 0xef, + 0xd5, 0x05, 0x52, 0x65, 0x2a, 0x71, 0x03, 0x8e, + 0x24, 0x09, 0x64, 0x28, 0x09, 0x89, 0x27, 0xf6, + 0x88, 0x03, 0x03, 0x82, 0xe5, 0xb8, 0x22, 0x0f, + 0xc9, 0xe5, 0x17, 0x23, 0x06, 0x47, 0x5e, 0xf0, + 0x87, 0x60, 0x95, 0x0d, 0x06, 0x12, 0x42, 0x24, + 0x05, 0xc0, 0xd1, 0x6e, 0x54, 0xc8, 0x90, 0x62, + 0x86, 0x2c, 0xfa, 0xa8, 0xa5, 0x1f, 0x82, 0x29, + 0xa0, 0x49, 0x31, 0x44, 0xba, 0x08, 0x4a, 0x85, + 0x41, 0x88, 0xa0, 0x86, 0x44, 0x4d, 0x16, 0xa6, + 0x63, 0x11, 0x32, 0x10, 0x54, 0x44, 0x0a, 0xdb, + 0x2d, 0xc4, 0x18, 0x42, 0x20, 0x6e, 0x69, 0x27, + 0x8e, 0x8c, 0x2d, 0x47, 0x66, 0x7f, 0xf0, 0xdc, + 0xe7, 0xc1, 0x86, 0x05, 0x5a, 0xb1, 0x0d, 0x93, + 0x05, 0x10, 0xa6, 0x22, 0x9b, 0x08, 0xa9, 0x02, + 0x27, 0x07, 0x7e, 0x16, 0x51, 0x86, 0x26, 0xd4, + 0x51, 0xc0, 0xdc, 0x9d, 0x94, 0x02, 0x70, 0x5e, + 0x1b, 0x1d, 0x7e, 0x94, 0xa5, 0x04, 0x6b, 0x92, + 0x14, 0x04, 0x16, 0xaa, 0xa1, 0xf6, 0x51, 0x0c, + 0xdf, 0x19, 0x18, 0x27, 0x00, 0x29, 0xa4, 0xe3, + 0x5d, 0x54, 0x58, 0x70, 0x53, 0x96, 0x46, 0x4f, + 0x06, 0xa3, 0xda, 0xa6, 0x95, 0x7e, 0x76, 0x29, + 0x0d, 0xaa, 0x79, 0x68, 0x18, 0x1e, 0x20, 0x54, + 0x78, 0xc2, 0x36, 0x5e, 0x91, 0x85, 0xc8, 0x80, + 0x3a, 0x49, 0x99, 0x4c, 0x95, 0x54, 0xe8, 0x81, + 0x05, 0x22, 0x88, 0x6c, 0x35, 0x8f, 0xff, 0x88, + 0x12, 0x78, 0x44, 0x6b, 0xad, 0x7b, 0xdd, 0x4a, + 0x83, 0x7c, 0x87, 0xe2, 0xa1, 0x5d, 0x5a, 0x08, + 0xa6, 0x82, 0xc8, 0x1b, 0x50, 0x46, 0x1b, 0x96, + 0x66, 0x7b, 0xb2, 0xf9, 0xd0, 0x43, 0x23, 0x71, + 0x8a, 0x13, 0x7b, 0xd3, 0x52, 0xcb, 0x4c, 0x31, + 0x6b, 0x7c, 0x90, 0x9e, 0x56, 0xcb, 0xb6, 0x7b, + 0xc3, 0x91, 0x54, 0x80, 0x18, 0xcd, 0x5b, 0x06, + 0xb2, 0x51, 0xdf, 0x06, 0x7c, 0x98, 0x81, 0x44, + 0x34, 0xe9, 0xe2, 0x08, 0xad, 0xbb, 0x2d, 0xe9, + 0xa4, 0xc6, 0xc1, 0x1a, 0xcc, 0x8b, 0xcb, 0x23, + 0xa8, 0x0c, 0xd1, 0x19, 0x29, 0xa3, 0x80, 0xfb, + 0x27, 0x5d, 0xff, 0x36, 0x5c, 0x2e, 0x9b, 0x3e, + 0x2d, 0x73, 0x84, 0xb4, 0x08, 0xb7, 0x14, 0xd1, + 0x60, 0x81, 0xe4, 0xe7, 0xf0, 0xc3, 0x8f, 0x74, + 0x06, 0x0b, 0x92, 0xde, 0x8c, 0x76, 0xe0, 0x04, + 0x19, 0x57, 0xb7, 0xf1, 0x9a, 0x04, 0xc7, 0x91, + 0x62, 0xc8, 0x68, 0x8d, 0x7c, 0x80, 0x90, 0xaf, + 0x91, 0x50, 0xe7, 0x1c, 0xc9, 0xf4, 0x24, 0xb0, + 0x1e, 0x3f, 0xbb, 0xe7, 0xef, 0xb8, 0x00, 0xcf, + 0x2c, 0x2c, 0x25, 0xa6, 0xe2, 0xbc, 0xcb, 0x3c, + 0x34, 0x6e, 0x5c, 0x9b, 0xbd, 0x45, 0x24, 0xf9, + 0x45, 0x1e, 0x48, 0xa3, 0x77, 0x09, 0x30, 0xb4, + 0x02, 0x2a, 0x41, 0x9e, 0x1a, 0xcb, 0x92, 0x1f, + 0x6f, 0x5e, 0x3b, 0xdd, 0x0c, 0xd4, 0x84, 0xc5, + 0xdb, 0xc1, 0xc9, 0x41, 0x50, 0xfd, 0x83, 0x3f, + 0x41, 0x5d, 0x43, 0x4a, 0xdc, 0xd0, 0xe0, 0x05, + 0x76, 0x06, 0x3c, 0x73, 0xf5, 0x72, 0xa3, 0x66, + 0xeb, 0xa2, 0x9a, 0x4a, 0x52, 0x8b, 0xe6, 0x36, + 0x23, 0x0c, 0xc5, 0x41, 0x66, 0x76, 0x99, 0x04, + 0x2e, 0x42, 0x2c, 0xf1, 0x75, 0xba, 0x9d, 0xda, + 0x13, 0x58, 0xbd, 0x9c, 0x4d, 0x83, 0xf7, 0x6d, + 0x8d, 0x6a, 0x6c, 0x53, 0x50, 0xb4, 0xff, 0x21, + 0x12, 0x7e, 0x67, 0x06, 0x19, 0x71, 0x89, 0x82, + 0x8c, 0xcf, 0x47, 0x30, 0x9c, 0x09, 0xe4, 0x12, + 0x28, 0xbe, 0xd0, 0x36, 0xaa, 0x5b, 0xbe, 0x49, + 0x96, 0x9b, 0xc3, 0x47, 0xa4, 0xb3, 0xdd, 0xd4, + 0x76, 0xf7, 0x51, 0x66, 0xd4, 0x5d, 0x3a, 0x72, + 0xa8, 0x97, 0xfd, 0xa7, 0x47, 0x99, 0xbb, 0xde, + 0x8b, 0xb5, 0x6f, 0xbf, 0xbd, 0x6c, 0x11, 0x62, + 0x16, 0x67, 0x8c, 0x95, 0x17, 0xdf, 0x6b, 0x33, + 0xea, 0x48, 0x26, 0xb0, 0x1c, 0xad, 0x7f, 0x40, + 0x2f, 0xbc, 0x33, 0x56, 0x55, 0xd2, 0xc4, 0x62, + 0xbb, 0x2e, 0x17, 0xfa, 0x09, 0x46, 0xe6, 0x5e, + 0x60, 0xb9, 0x0c, 0xd6, 0x95, 0xb5, 0xa5, 0x24, + 0x28, 0x5b, 0xc4, 0xf5, 0xd8, 0x77, 0x28, 0xbd, + 0x12, 0x4d, 0xe7, 0x00, 0x47, 0xe8, 0x91, 0xd3, + 0xbf, 0x9d, 0xe3, 0xe0, 0x0b, 0x3c, 0x02, 0x4b, + 0x29, 0x4a, 0xc9, 0xa8, 0xca, 0xad, 0xab, 0xce, + 0x40, 0xd8, 0xc7, 0x0b, 0x9d, 0x04, 0xe9, 0x7c, + 0x86, 0x88, 0xdf, 0xbd, 0xe4, 0x73, 0x3e, 0x5b, + 0xe8, 0xab, 0x76, 0x71, 0x1a, 0x83, 0x46, 0x68, + 0x45, 0x9f, 0x8f, 0xe4, 0x68, 0x59, 0x18, 0xcc, + 0xc2, 0x1f, 0xb2, 0x60, 0xa5, 0xae, 0xed, 0x49, + 0x81, 0x04, 0x54, 0x84, 0x4e, 0x2a, 0x63, 0x3d, + 0xf8, 0x54, 0xce, 0x03, 0xb9, 0x02, 0xc9, 0xa4, + 0x1c, 0x58, 0x1a, 0x58, 0x8c, 0xc4, 0x29, 0x59, + 0xc2, 0x5a, 0x3c, 0x40, 0xf7, 0x24, 0x64, 0xb5, + 0xe9, 0x0a, 0x17, 0x5c, 0xd6, 0x29, 0x40, 0xb8, + 0x9d, 0x72, 0x9d, 0x30, 0x84, 0x62, 0x48, 0x00, + 0x09, 0x7f, 0x98, 0x0a, 0x28, 0xa0, 0x80, 0x31, + 0x10, 0x89, 0x5d, 0x80, 0xb0, 0x03, 0xba, 0xef, + 0x48, 0xc3, 0x39, 0x3c, 0xc9, 0x1a, 0xb7, 0x8e, + 0x25, 0x19, 0x52, 0x10, 0x0f, 0x88, 0x57, 0xbb, + 0xe1, 0x40, 0x50, 0x93, 0xb6, 0x86, 0xff, 0x10, + 0x91, 0x3b, 0x01, 0xf1, 0xcd, 0xf6, 0x04, 0xe6, + 0x40, 0x08, 0x06, 0x43, 0x13, 0x28, 0x58, 0xdb, + 0x9e, 0x58, 0x32, 0x30, 0x80, 0x0d, 0xe4, 0x8a, + 0x58, 0x7c, 0xdb, 0x97, 0xa2, 0x04, 0x88, 0x3e, + 0x20, 0xeb, 0x38, 0x92, 0x03, 0xc2, 0x3b, 0x1c, + 0xe7, 0x83, 0xb6, 0x14, 0xcc, 0x0c, 0xeb, 0xc0, + 0xc4, 0xed, 0x2e, 0x00, 0xb9, 0xfc, 0x3d, 0x28, + 0x62, 0x1b, 0x23, 0x62, 0x1c, 0x35, 0x80, 0x80, + 0x45, 0xad, 0xef, 0x03, 0x29, 0xd0, 0x51, 0x3a, + 0xa6, 0xc5, 0xc3, 0x4c, 0xd8, 0xc0, 0x16, 0x70, + 0x08, 0xa0, 0x0e, 0x2a, 0x66, 0xc6, 0xd5, 0x8d, + 0x6a, 0x77, 0x24, 0x79, 0x1f, 0xa7, 0x5a, 0x28, + 0x09, 0x4d, 0x2e, 0xd2, 0x10, 0x0a, 0x28, 0x59, + 0x81, 0xf8, 0x78, 0xbf, 0x3c, 0x9e, 0x4a, 0x43, + 0x36, 0x28, 0xc9, 0xa4, 0x96, 0xb0, 0x2f, 0x60, + 0x7d, 0x60, 0x49, 0x96, 0x41, 0x5a, 0xae, 0xf8, + 0xe8, 0xa0, 0x6c, 0x1c, 0x88, 0x0d, 0x89, 0xa8, + 0xe4, 0x29, 0x49, 0x90, 0x4a, 0x03, 0x40, 0xc3, + 0x94, 0x5c, 0x71, 0x25, 0x2c, 0x6d, 0xf0, 0x07, + 0x04, 0xb2, 0x65, 0x40, 0x87, 0x90, 0x8f, 0x64, + 0x52, 0xd4, 0xa4, 0x54, 0x69, 0x63, 0x1b, 0x21, + 0xb9, 0xc9, 0x4d, 0xdc, 0xd1, 0x4c, 0x0d, 0xb6, + 0x2b, 0x11, 0x4a, 0x1c, 0xe6, 0xe2, 0x02, 0x60, + 0xcc, 0x11, 0x84, 0x53, 0x52, 0xca, 0xfc, 0x13, + 0x0e, 0xc0, 0xa2, 0x48, 0xd1, 0xa1, 0x40, 0x21, + 0x29, 0x12, 0x95, 0x28, 0x4d, 0x40, 0x99, 0xca, + 0x80, 0x64, 0x61, 0x1f, 0x71, 0x66, 0xe9, 0x62, + 0x50, 0x13, 0x7a, 0x54, 0x12, 0x38, 0x8f, 0x14, + 0x67, 0x02, 0x51, 0x64, 0xaf, 0x95, 0xc5, 0xf2, + 0x87, 0x7f, 0x40, 0x66, 0x1b, 0xde, 0x69, 0xc3, + 0x7b, 0xd8, 0xd2, 0x9d, 0xf0, 0xa8, 0xe7, 0x01, + 0x6c, 0xd4, 0x3f, 0x6c, 0xb6, 0xe9, 0xff, 0x2a, + 0xd2, 0x8b, 0xcf, 0x1e, 0x72, 0xb5, 0x92, 0xa6, + 0xc5, 0x27, 0x78, 0x02, 0xc5, 0x03, 0x2b, 0x71, + 0x13, 0x87, 0x4d, 0x09, 0xd3, 0x04, 0x39, 0x52, + 0xa8, 0x86, 0xb8, 0xf7, 0x9d, 0x7a, 0xe5, 0x0b, + 0x9b, 0xd6, 0xf1, 0x06, 0xbf, 0xb6, 0x03, 0x92, + 0x54, 0xda, 0xc8, 0x52, 0xd2, 0x7c, 0xd0, 0xd7, + 0x8c, 0x21, 0x3d, 0x6c, 0x5c, 0x63, 0x0d, 0x35, + 0x5b, 0x5d, 0x09, 0x43, 0xca, 0x1a, 0x95, 0x72, + 0x66, 0x3b, 0x25, 0xea, 0xd6, 0x0c, 0x96, 0x87, + 0xbe, 0x75, 0x3a, 0x44, 0x0f, 0xc0, 0x53, 0xaa, + 0xa4, 0x02, 0x93, 0x1a, 0xb8, 0x78, 0xee, 0x73, + 0x16, 0xad, 0x1f, 0xeb, 0x78, 0x62, 0xd1, 0xad, + 0xaa, 0x0b, 0x09, 0xb3, 0x40, 0x85, 0x47, 0x86, + 0x4a, 0x54, 0x23, 0x7e, 0xd1, 0x35, 0x86, 0xc4, + 0xc5, 0x48, 0x7f, 0x47, 0x97, 0x5f, 0xc0, 0x21, + 0x9d, 0x48, 0xa5, 0x22, 0x6a, 0x54, 0x52, 0x22, + 0x2e, 0x92, 0x90, 0xac, 0xd3, 0xc8, 0x44, 0x7c, + 0xb2, 0xd2, 0x4c, 0x3d, 0xcc, 0x47, 0x56, 0x25, + 0x15, 0x88, 0x1f, 0x8e, 0x57, 0xd6, 0xe6, 0xb4, + 0x93, 0x5b, 0xad, 0x03, 0x23, 0x33, 0x7b, 0xc7, + 0xd1, 0x87, 0x16, 0x25, 0xa0, 0x15, 0x18, 0x99, + 0x02, 0xf4, 0x89, 0x81, 0xbf, 0xd9, 0x93, 0xb2, + 0x0b, 0x32, 0xc7, 0x3c, 0xab, 0xe3, 0x9c, 0xb1, + 0x02, 0x0a, 0x8a, 0xb2, 0x60, 0x1c, 0x5a, 0x7d, + 0x57, 0xd8, 0x4a, 0xac, 0xd5, 0x9c, 0x6e, 0x10, + 0xdd, 0x26, 0x03, 0x16, 0x59, 0x89, 0x16, 0x06, + 0xb3, 0x1e, 0x90, 0x87, 0x91, 0xdc, 0x72, 0x4f, + 0x47, 0x86, 0xaf, 0xb2, 0x01, 0x9c, 0x87, 0x71, + 0x2e, 0xb3, 0x9b, 0xcb, 0x2c, 0x84, 0x08, 0x93, + 0x92, 0x6a, 0x69, 0x7b, 0x60, 0x54, 0x11, 0x74, + 0x63, 0x3c, 0x8a, 0xbd, 0xa4, 0xf5, 0xe2, 0xc3, + 0x24, 0x12, 0x9a, 0xee, 0x2b, 0xf0, 0xff, 0x20, + 0x55, 0xe1, 0x8c, 0xbb, 0xba, 0xac, 0xf0, 0x01, + 0xa8, 0xe3, 0x49, 0x11, 0x02, 0xcb, 0x26, 0x84, + 0x42, 0x16, 0x77, 0xb8, 0x8b, 0x6b, 0xe7, 0x82, + 0x38, 0x16, 0x8c, 0x1d, 0xf4, 0xd2, 0x0c, 0x12, + 0x3d, 0x40, 0x01, 0xba, 0xd7, 0xc7, 0xdc, 0x10, + 0xe7, 0xa4, 0xff, 0x19, 0xc6, 0x79, 0xe5, 0xe4, + 0x9c, 0x8d, 0xb1, 0x56, 0x73, 0xc8, 0xd8, 0x86, + 0x32, 0x4e, 0x0b, 0xde, 0x55, 0x9a, 0xf6, 0x99, + 0xaa, 0xf3, 0x48, 0x2a, 0x0d, 0xf5, 0xdc, 0x75, + 0x9a, 0x82, 0x2e, 0x4a, 0xf3, 0x2f, 0xde, 0xf8, + 0xe8, 0x16, 0x8f, 0xc9, 0xca, 0x02, 0x31, 0xfb, + 0x8f, 0x7e, 0x81, 0x0b, 0xdf, 0xfe, 0x6a, 0xa6, + 0x06, 0xb3, 0x44, 0xd9, 0x57, 0xf0, 0x1a, 0x2d, + 0x06, 0x8a, 0x17, 0x79, 0xf7, 0x21, 0xed, 0xb4, + 0x54, 0xb7, 0xd7, 0xa2, 0xa8, 0x61, 0x0d, 0x04, + 0xf2, 0x93, 0x6e, 0x01, 0x79, 0xc1, 0x33, 0x5a, + 0x58, 0x7e, 0x83, 0xcb, 0xb0, 0x56, 0xa8, 0x07, + 0x52, 0x44, 0xf5, 0x91, 0xa9, 0x62, 0x2b, 0x62, + 0x78, 0xcd, 0x97, 0xdc, 0x60, 0x58, 0x70, 0x2c, + 0xf3, 0xd0, 0x5f, 0x29, 0x69, 0xc1, 0xc6, 0x17, + 0xc7, 0x92, 0xbf, 0xeb, 0x39, 0xb2, 0x4a, 0x23, + 0x1c, 0xa8, 0x58, 0xe2, 0xf8, 0x02, 0x58, 0x3a, + 0x26, 0x4a, 0x29, 0x33, 0xa5, 0xa9, 0xea, 0x2a, + 0xc5, 0xac, 0x7c, 0x07, 0xa7, 0x76, 0x64, 0x64, + 0xa6, 0x6c, 0x52, 0x23, 0x39, 0x01, 0xc5, 0x20, + 0xb1, 0xc3, 0x38, 0x19, 0xb7, 0x88, 0x6d, 0x4b, + 0x19, 0x31, 0x54, 0x02, 0x03, 0xbd, 0x3c, 0xe8, + 0x0a, 0x7a, 0x09, 0xd5, 0x8c, 0x7e, 0x39, 0x56, + 0x85, 0x48, 0x75, 0x39, 0x27, 0x87, 0x3d, 0x02, + 0x92, 0x21, 0xab, 0x01, 0x28, 0x72, 0x87, 0xb4, + 0x91, 0xeb, 0xa4, 0xde, 0x0a, 0xe4, 0x11, 0x56, + 0x8a, 0x98, 0x82, 0xf9, 0xa0, 0x87, 0xff, 0xe2, + 0xae, 0xb9, 0x1a, 0x40, 0x69, 0x83, 0xc3, 0xc0, + 0xdb, 0xb2, 0xa5, 0x88, 0x60, 0x80, 0xef, 0x5a, + 0x18, 0xd0, 0x37, 0x18, 0x60, 0x93, 0xb9, 0x8a, + 0x84, 0x52, 0x2a, 0xc9, 0x24, 0x2c, 0xba, 0xc6, + 0x31, 0x24, 0x27, 0xb5, 0x3d, 0xa7, 0xf5, 0x74, + 0xa1, 0x54, 0x83, 0x0f, 0x3b, 0x14, 0xc0, 0x42, + 0x03, 0xc0, 0xa7, 0xca, 0x80, 0xed, 0x9d, 0x35, + 0xd7, 0x8a, 0x92, 0xf4, 0x19, 0x13, 0x56, 0xc3, + 0xb4, 0x92, 0x00, 0x82, 0x56, 0x56, 0x2e, 0x65, + 0xcf, 0x4d, 0x0d, 0x5b, 0xd2, 0x52, 0x65, 0x01, + 0x55, 0x93, 0xc4, 0x38, 0x29, 0x42, 0x23, 0xb0, + 0x87, 0x5b, 0xe1, 0x30, 0x8c, 0x39, 0xaf, 0xb4, + 0xee, 0x80, 0x26, 0x1d, 0x18, 0x39, 0xe6, 0x91, + 0xe4, 0x4b, 0x88, 0x2e, 0x4a, 0x81, 0x83, 0xe1, + 0xd9, 0x05, 0x6d, 0x37, 0x71, 0x32, 0xe0, 0xed, + 0x87, 0x4f, 0xa9, 0x6b, 0x47, 0xf0, 0x4d, 0x49, + 0x7e, 0xf0, 0x00, 0xbe, 0x9e, 0x5c, 0xb5, 0x60, + 0x27, 0x59, 0x7c, 0x21, 0x38, 0xa2, 0xc3, 0xe6, + 0x7b, 0x95, 0x53, 0xbf, 0x09, 0x19, 0x5f, 0xa2, + 0xce, 0x95, 0x82, 0xac, 0xe3, 0x59, 0x17, 0xc7, + 0xa4, 0xcb, 0xd6, 0x70, 0x7e, 0xf2, 0xc6, 0x13, + 0x9b, 0x95, 0x66, 0x4d, 0xe5, 0xa3, 0x35, 0xa9, + 0x2d, 0x29, 0xa8, 0x35, 0xfc, 0x01, 0x56, 0xda, + 0xf9, 0x0b, 0x93, 0x2f, 0xc0, 0xd4, 0xbe, 0x08, + 0xc2, 0x97, 0xf6, 0xf6, 0x77, 0xb9, 0xeb, 0x12, + 0x70, 0x86, 0x8b, 0x19, 0x76, 0xc1, 0x40, 0x26, + 0x96, 0xee, 0xfb, 0xef, 0x8d, 0x8f, 0x52, 0xc8, + 0x20, 0x50, 0x4d, 0xea, 0x36, 0xeb, 0xe3, 0x6d, + 0x11, 0x68, 0x1e, 0xd3, 0xdc, 0xc9, 0x86, 0x10, + 0xa0, 0x80, 0x72, 0x52, 0xc9, 0xdf, 0xcb, 0x99, + 0x81, 0x9d, 0xf1, 0xc0, 0x61, 0x70, 0xf3, 0x19, + 0x2a, 0x98, 0x30, 0x45, 0x35, 0x0a, 0xff, 0xa1, + 0x49, 0x67, 0x6d, 0x2a, 0xd9, 0xd1, 0xea, 0xdd, + 0xb3, 0xb6, 0x15, 0x96, 0x48, 0x00, 0x54, 0x03, + 0x5b, 0x2d, 0x04, 0x68, 0x37, 0xd4, 0x6c, 0x72, + 0x53, 0xcd, 0xcc, 0x75, 0x43, 0x9c, 0x89, 0xc7, + 0xfd, 0x6f, 0x59, 0xf1, 0x71, 0x43, 0xb9, 0x4e, + 0xe4, 0x9e, 0x1d, 0xa9, 0xb0, 0x13, 0x67, 0xf5, + 0x96, 0xa4, 0x7d, 0x3a, 0x06, 0x3a, 0xf4, 0xd6, + 0x68, 0x7d, 0x89, 0x22, 0x38, 0xef, 0x38, 0xa7, + 0xe4, 0x8e, 0x02, 0xc1, 0xf8, 0xaf, 0xcf, 0x3d, + 0xdf, 0x24, 0x47, 0x84, 0x1e, 0xdb, 0xf8, 0x4a, + 0x1b, 0xca, 0xd0, 0x38, 0xd8, 0x15, 0xe0, 0x8b, + 0x69, 0xbe, 0x0b, 0x48, 0xbf, 0x53, 0x8a, 0x18, + 0xd7, 0x11, 0x76, 0xc2, 0x73, 0x2e, 0x87, 0x49, + 0x74, 0xed, 0xb3, 0xac, 0x7b, 0x30, 0x3f, 0x85, + 0xf6, 0xfa, 0xef, 0xf0, 0x0e, 0xc1, 0xc4, 0x4b, + 0xa0, 0x38, 0x78, 0x0d, 0xdd, 0x41, 0x94, 0x90, + 0xa4, 0xc6, 0x73, 0xe0, 0xf8, 0x09, 0xcc, 0x55, + 0x95, 0x18, 0xdd, 0x02, 0xbb, 0x8d, 0xe6, 0xee, + 0x7a, 0xa3, 0x3c, 0x08, 0xdb, 0x76, 0x94, 0x36, + 0x4f, 0x4c, 0xfb, 0x6c, 0x1e, 0x78, 0x18, 0x1b, + 0xb9, 0x4b, 0x43, 0x2a, 0xc4, 0xb8, 0xc9, 0x17, + 0xf6, 0xac, 0xa4, 0x89, 0x1f, 0x80, 0x0e, 0x93, + 0xf7, 0x22, 0x16, 0xfd, 0xe5, 0x5d, 0xdb, 0x76, + 0x3c, 0xdf, 0xc0, 0xc1, 0x2a, 0x2d, 0xeb, 0x34, + 0x27, 0x9e, 0x29, 0x05, 0xe6, 0x95, 0xbd, 0xbe, + 0x94, 0x4d, 0xed, 0x2f, 0x56, 0xa4, 0xc9, 0x75, + 0xee, 0x7b, 0x43, 0xe4, 0xe8, 0xa4, 0xe0, 0x5b, + 0xf8, 0x8e, 0xc2, 0x39, 0x0f, 0x96, 0x53, 0xe0, + 0xd9, 0xa2, 0x98, 0x12, 0x44, 0xf6, 0x50, 0x06, + 0xec, 0x73, 0xca, 0xfa, 0x1c, 0x61, 0x89, 0xa5, + 0xb1, 0xb8, 0xf8, 0x1d, 0x0c, 0xff, 0x09, 0x7c, + 0xdf, 0x7e, 0x71, 0x2c, 0x95, 0xb9, 0xff, 0xf1, + 0x30, 0x3a, 0xb1, 0xb6, 0xa0, 0x6a, 0xaa, 0x73, + 0x77, 0xbd, 0xa2, 0x57, 0xa7, 0x71, 0x53, 0x50, + 0x16, 0x29, 0xea, 0x87, 0x73, 0xac, 0xa0, 0x13, + 0x52, 0x40, 0x72, 0x8e, 0x57, 0x2c, 0x7f, 0xd5, + 0x67, 0xa5, 0x83, 0x2d, 0x52, 0xb3, 0x18, 0xaa, + 0x66, 0x25, 0x6a, 0xa0, 0x23, 0x24, 0x17, 0x5b, + 0x8a, 0xa1, 0x18, 0x27, 0x41, 0x09, 0xf3, 0x47, + 0x6e, 0x9c, 0x70, 0x7f, 0xdb, 0x43, 0x70, 0x8f, + 0xc6, 0x22, 0xda, 0x50, 0x18, 0xb1, 0x37, 0x4b, + 0xf1, 0x31, 0x28, 0x9a, 0x12, 0x72, 0x98, 0x13, + 0x0b, 0x15, 0x95, 0x2d, 0x2d, 0x97, 0x13, 0x1d, + 0x17, 0x0f, 0xc8, 0xd3, 0x41, 0x0c, 0xd8, 0x09, + 0xfc, 0xf6, 0x04, 0xa0, 0x45, 0x53, 0x1e, 0x62, + 0x7e, 0x9e, 0xc4, 0x82, 0x20, 0xe8, 0x63, 0x33, + 0xc2, 0x82, 0x2a, 0x80, 0x02, 0xac, 0xa3, 0x09, + 0x29, 0xe4, 0x55, 0x91, 0xa5, 0x52, 0x19, 0x07, + 0x23, 0x00, 0xe2, 0x2b, 0x18, 0xa3, 0x69, 0x3d, + 0x08, 0x34, 0xc5, 0x47, 0x7a, 0x2c, 0xf7, 0x82, + 0x85, 0xb1, 0x85, 0xf0, 0xe2, 0x58, 0xe9, 0x77, + 0x7e, 0xd8, 0xf4, 0x84, 0x81, 0x54, 0x44, 0xcf, + 0x02, 0x08, 0x31, 0x38, 0x77, 0x45, 0x80, 0x80, + 0x7d, 0x47, 0x2f, 0x8f, 0x02, 0x5c, 0xd9, 0xa0, + 0x00, 0x90, 0x90, 0x85, 0x61, 0x00, 0x73, 0x50, + 0x30, 0x66, 0x15, 0x75, 0x5a, 0x1b, 0xd2, 0x81, + 0xa2, 0x51, 0x81, 0x1e, 0xc6, 0x28, 0xdb, 0x40, + 0x60, 0xbe, 0x02, 0x08, 0x6d, 0xa2, 0x6a, 0xdf, + 0x52, 0x0d, 0xe4, 0x47, 0x39, 0xd9, 0xc0, 0x1c, + 0x9f, 0xc5, 0x06, 0x12, 0x11, 0x72, 0x76, 0xb8, + 0x52, 0x70, 0x35, 0x35, 0x4b, 0x14, 0x04, 0x04, + 0xf7, 0x39, 0x47, 0xe7, 0x77, 0x3c, 0x31, 0x39, + 0x16, 0x54, 0x1a, 0xd8, 0xc4, 0x82, 0xbe, 0x12, + 0x24, 0xc0, 0xb5, 0x4d, 0x3c, 0x05, 0xff, 0x5c, + 0x48, 0xd1, 0x5b, 0x91, 0xf4, 0x1e, 0x50, 0xe3, + 0x25, 0x73, 0x37, 0x2e, 0x87, 0x73, 0x83, 0x48, + 0x35, 0x89, 0x41, 0x90, 0x29, 0x01, 0x17, 0x86, + 0xcb, 0x46, 0x00, 0x05, 0x90, 0x4a, 0x98, 0xf8, + 0x1c, 0xe6, 0xd4, 0x6e, 0x17, 0x26, 0x2b, 0x21, + 0xa1, 0x44, 0x99, 0x02, 0x85, 0x40, 0x42, 0x56, + 0xc0, 0xa3, 0x68, 0xda, 0x44, 0x0b, 0xa9, 0x02, + 0x03, 0xc6, 0x46, 0x71, 0x82, 0x31, 0x2e, 0xfe, + 0x50, 0x05, 0x6b, 0x54, 0x7f, 0x85, 0xc5, 0x68, + 0x5b, 0xb8, 0x20, 0x81, 0xc1, 0x5e, 0x56, 0x90, + 0x4a, 0x22, 0x97, 0x77, 0x7b, 0xf6, 0x0b, 0x45, + 0xe7, 0x2f, 0x19, 0x15, 0x43, 0x4f, 0x68, 0x38, + 0x9d, 0x92, 0x2b, 0x52, 0x74, 0x02, 0x35, 0x02, + 0x40, 0xe6, 0x07, 0x35, 0x22, 0xf2, 0x06, 0xc0, + 0x58, 0x75, 0xb4, 0xf8, 0x6a, 0xd8, 0x14, 0x2b, + 0x3e, 0x23, 0x44, 0x96, 0x41, 0x84, 0x1f, 0x00, + 0x77, 0xee, 0x01, 0x52, 0x70, 0x45, 0x74, 0x63, + 0x43, 0x53, 0x5e, 0x44, 0x68, 0x50, 0xe8, 0x01, + 0x99, 0xa2, 0x09, 0xc7, 0x10, 0x7d, 0xa1, 0xf7, + 0x8e, 0xa0, 0xd5, 0x4c, 0x92, 0xa6, 0x7f, 0xf5, + 0x48, 0x71, 0x81, 0xa8, 0x21, 0x01, 0x50, 0x4d, + 0xdd, 0x47, 0x03, 0xf4, 0xf6, 0x22, 0x30, 0x22, + 0x03, 0xe3, 0x68, 0x7a, 0xbe, 0x22, 0x0b, 0x7c, + 0x15, 0x78, 0x73, 0xe6, 0x07, 0x56, 0x01, 0x2f, + 0x01, 0x73, 0x6e, 0x56, 0x46, 0x64, 0x14, 0x36, + 0x91, 0x05, 0x92, 0x4f, 0x54, 0x83, 0x02, 0x34, + 0x92, 0x8d, 0x9c, 0x97, 0x91, 0xff, 0x51, 0x65, + 0x8f, 0x74, 0x51, 0x55, 0x72, 0x93, 0xff, 0x21, + 0x8d, 0x3a, 0x89, 0x5f, 0xd9, 0xd0, 0x68, 0x91, + 0x53, 0x86, 0x99, 0x98, 0x6e, 0x23, 0x90, 0x2b, + 0x68, 0xd4, 0x5d, 0x1f, 0xa3, 0x07, 0xfc, 0x18, + 0x39, 0xa1, 0x32, 0x8f, 0xd6, 0x58, 0xff, 0x5a, + 0x7f, 0x54, 0x02, 0x1e, 0x61, 0x19, 0xb1, 0xf7, + 0x0f, 0xcf, 0xc8, 0x28, 0xd2, 0x18, 0x41, 0x02, + 0xd7, 0x3c, 0x3c, 0xb9, 0x10, 0xdf, 0xe0, 0x66, + 0x03, 0xc2, 0x6a, 0x43, 0xb9, 0x26, 0x95, 0x18, + 0x03, 0x7e, 0xb8, 0x21, 0x45, 0x59, 0x7e, 0x0e, + 0x93, 0x49, 0xab, 0xb1, 0x80, 0x9e, 0xe2, 0x92, + 0x3c, 0x50, 0x51, 0x34, 0x69, 0x8f, 0x0c, 0x64, + 0x49, 0x87, 0xe8, 0x78, 0xe0, 0x77, 0x38, 0xed, + 0x31, 0x21, 0xdb, 0xd1, 0x21, 0xc1, 0x42, 0x04, + 0x0f, 0xc7, 0x32, 0xe3, 0xf3, 0x26, 0x9f, 0x63, + 0x29, 0x89, 0xf4, 0x7d, 0x37, 0x31, 0x40, 0xce, + 0x01, 0x26, 0xc1, 0x76, 0x7c, 0x72, 0xb9, 0x5a, + 0x84, 0x15, 0x6f, 0x16, 0xf4, 0x11, 0x9d, 0xa2, + 0x92, 0x1c, 0x09, 0x0a, 0x2a, 0xc3, 0x41, 0x33, + 0x04, 0x22, 0x34, 0x23, 0x22, 0x17, 0x75, 0x72, + 0x91, 0x55, 0x94, 0xb4, 0xf6, 0x83, 0xa5, 0x69, + 0x7e, 0xbd, 0xa4, 0x8b, 0xc4, 0xc6, 0x29, 0xae, + 0x38, 0x2e, 0xa1, 0x37, 0x4d, 0x91, 0x99, 0x03, + 0x98, 0x29, 0x88, 0xf7, 0x84, 0x4d, 0x1a, 0x40, + 0x9a, 0x1f, 0x10, 0x8e, 0x99, 0x09, 0x78, 0xa2, + 0x50, 0x60, 0x3b, 0xd7, 0x86, 0x13, 0x88, 0x6e, + 0x69, 0x34, 0x5e, 0xa8, 0xf2, 0x25, 0xf1, 0x92, + 0x2c, 0xa7, 0x10, 0x11, 0xc6, 0xf4, 0x28, 0x70, + 0xd9, 0x89, 0xb1, 0x59, 0x03, 0xee, 0x07, 0x0a, + 0xd8, 0x42, 0x56, 0xb8, 0x89, 0x1b, 0x1e, 0x71, + 0x4e, 0x23, 0x48, 0x5e, 0x93, 0xd3, 0x79, 0xd9, + 0xc5, 0x66, 0x5e, 0xd4, 0x16, 0x09, 0xf9, 0x69, + 0x88, 0x49, 0x48, 0x5f, 0xc2, 0x1e, 0x93, 0xc5, + 0x89, 0x64, 0x62, 0x4a, 0x51, 0x79, 0x67, 0x26, + 0xa8, 0x21, 0x0e, 0x44, 0x33, 0xb3, 0xe9, 0x49, + 0xf2, 0x61, 0x79, 0xc7, 0x51, 0x52, 0x63, 0xd5, + 0x29, 0xbe, 0x83, 0x36, 0x13, 0x85, 0xff, 0x4f, + 0xf4, 0x80, 0x49, 0xae, 0xe7, 0x98, 0x83, 0x65, + 0x02, 0xbb, 0x27, 0x69, 0x93, 0x76, 0x23, 0x21, + 0x24, 0x91, 0x51, 0x00, 0xa0, 0x4b, 0x50, 0x9d, + 0xda, 0x86, 0x2d, 0xc1, 0x69, 0x1f, 0xf6, 0xb2, + 0x7c, 0x87, 0x80, 0x39, 0x55, 0xc4, 0x15, 0x02, + 0x46, 0x32, 0xc7, 0xb0, 0x1b, 0xa2, 0x99, 0x09, + 0x1c, 0x61, 0x3d, 0xed, 0x59, 0x1b, 0xa2, 0x49, + 0x8f, 0x38, 0x53, 0x7a, 0x4d, 0x50, 0x97, 0x54, + 0x89, 0x9f, 0x88, 0x82, 0x2c, 0x99, 0x22, 0x2a, + 0x16, 0xa5, 0xa1, 0x99, 0x60, 0x99, 0x3e, 0xe3, + 0xa0, 0xc4, 0x58, 0x13, 0x1f, 0x62, 0x40, 0x85, + 0x81, 0x0a, 0x1f, 0xda, 0x43, 0xd1, 0xf2, 0x72, + 0x4d, 0x39, 0x7d, 0x6d, 0xd2, 0x9c, 0xeb, 0x29, + 0x1d, 0x08, 0x50, 0x00, 0x8a, 0x10, 0x9f, 0x33, + 0x76, 0x88, 0x3b, 0x84, 0x41, 0x12, 0x53, 0x2f, + 0x6f, 0x75, 0x2c, 0x29, 0x64, 0x95, 0x4d, 0xf8, + 0x7c, 0xaa, 0xe2, 0x8c, 0x57, 0x46, 0x05, 0x1f, + 0xe0, 0xa0, 0x3d, 0x2a, 0x83, 0x20, 0x81, 0x13, + 0xa6, 0x21, 0x13, 0xb3, 0x08, 0x6d, 0x1f, 0x1a, + 0x3c, 0x7d, 0x90, 0x9e, 0x7f, 0x29, 0x50, 0x06, + 0xe0, 0x8f, 0x74, 0x10, 0x9d, 0xbf, 0x74, 0x2c, + 0x1c, 0xc4, 0x41, 0x32, 0x47, 0x95, 0x1f, 0x11, + 0x24, 0x6b, 0x78, 0x9b, 0x80, 0x40, 0xa1, 0x63, + 0x30, 0x0b, 0xf1, 0x40, 0x45, 0x42, 0x58, 0xa7, + 0x0f, 0xea, 0x13, 0xa1, 0xa2, 0xa6, 0x17, 0x22, + 0x30, 0xa9, 0x65, 0x98, 0xca, 0xe3, 0x1e, 0xbc, + 0x27, 0x98, 0x94, 0x36, 0x47, 0x04, 0x24, 0x77, + 0x37, 0xd6, 0x36, 0x54, 0x90, 0x05, 0x3f, 0x31, + 0x0c, 0x46, 0xda, 0xa0, 0x58, 0x9a, 0x1f, 0x39, + 0x25, 0x3a, 0xe9, 0x00, 0x3a, 0x1c, 0x45, 0x88, + 0xff, 0xf0, 0x21, 0x2d, 0x49, 0x5d, 0x7a, 0xf5, + 0x7d, 0xaf, 0xe6, 0x1d, 0x71, 0x10, 0xff, 0x9f, + 0x8e, 0xf9, 0x88, 0xe5, 0x85, 0x1f, 0xec, 0x83, + 0x75, 0x57, 0x43, 0x56, 0x8f, 0x6a, 0x43, 0x9a, + 0x97, 0x9d, 0x9c, 0xe2, 0xa0, 0x57, 0xe9, 0x94, + 0x0c, 0x8a, 0x1e, 0xdc, 0x90, 0x2b, 0x35, 0x52, + 0xa3, 0xe9, 0x42, 0xa1, 0x26, 0x39, 0x02, 0x98, + 0x65, 0x0f, 0xb3, 0x42, 0x71, 0xc1, 0x02, 0xa2, + 0x27, 0x87, 0xa0, 0x96, 0x13, 0xa4, 0x20, 0x00, + 0x64, 0xb0, 0x0a, 0x9d, 0x36, 0x69, 0x1f, 0x30, + 0xd9, 0x91, 0xbd, 0xc2, 0x88, 0x35, 0xf8, 0x57, + 0x63, 0xc0, 0x84, 0x82, 0x16, 0x37, 0x1b, 0x58, + 0x17, 0xb7, 0x36, 0xab, 0xc5, 0x9a, 0x0d, 0x33, + 0xb8, 0x76, 0x92, 0xc8, 0x38, 0x8f, 0xf5, 0x9c, + 0xd2, 0xd6, 0x74, 0x3f, 0x69, 0x5e, 0xcf, 0xea, + 0x81, 0x3b, 0x66, 0xa9, 0xa8, 0x53, 0x8c, 0xe6, + 0xf7, 0x7d, 0xde, 0x01, 0x2e, 0xd2, 0x60, 0x76, + 0x8b, 0x36, 0x0c, 0x4c, 0x73, 0x9c, 0x0e, 0xc6, + 0x26, 0x0a, 0xc3, 0xa5, 0x52, 0x24, 0x46, 0x6e, + 0xd7, 0x95, 0xe6, 0x5a, 0x1c, 0x59, 0x7a, 0x2f, + 0xeb, 0xaa, 0x6e, 0xfb, 0x03, 0x8a, 0xa5, 0xb6, + 0xa5, 0xa5, 0x58, 0x06, 0x99, 0x78, 0x05, 0xd1, + 0xf5, 0x56, 0x94, 0x71, 0xa3, 0x82, 0x73, 0x17, + 0x30, 0xa3, 0x1b, 0xfb, 0xea, 0x28, 0xf8, 0x58, + 0xa0, 0x2e, 0xd6, 0xb1, 0x0b, 0xe1, 0x92, 0xfb, + 0x72, 0x32, 0x26, 0x5a, 0x20, 0x05, 0x5b, 0x02, + 0xe1, 0x38, 0x4d, 0x01, 0x70, 0x15, 0x3e, 0xb6, + 0x0e, 0xc0, 0xb3, 0x91, 0xb3, 0x08, 0x0b, 0x7a, + 0x40, 0x42, 0x81, 0xa3, 0x2f, 0x18, 0xf3, 0x72, + 0x19, 0x3b, 0xa1, 0xdf, 0x37, 0xb2, 0xa9, 0x3a, + 0x89, 0xb6, 0x30, 0x60, 0x5f, 0xa8, 0x0a, 0x93, + 0xda, 0x06, 0x3a, 0xeb, 0x1e, 0x09, 0xeb, 0x1e, + 0xfc, 0x38, 0x25, 0x6e, 0xd8, 0x21, 0x11, 0xa3, + 0x32, 0x17, 0x49, 0x32, 0xc6, 0x82, 0xff, 0x6b, + 0xb8, 0x77, 0x38, 0x94, 0x25, 0x58, 0x92, 0x82, + 0x39, 0x03, 0xbb, 0xac, 0xfa, 0xe8, 0xb4, 0xe6, + 0x70, 0xb0, 0x56, 0x30, 0xb4, 0x44, 0xdb, 0xae, + 0xda, 0xa6, 0xb2, 0xaf, 0x86, 0x40, 0x56, 0xeb, + 0x13, 0x15, 0x90, 0x02, 0x24, 0x83, 0x62, 0xf1, + 0xf0, 0x0b, 0xd5, 0x69, 0x48, 0xa6, 0xc9, 0xa1, + 0xf3, 0x83, 0x85, 0x6d, 0x60, 0x87, 0x1a, 0x95, + 0x36, 0xab, 0x09, 0x48, 0x4c, 0x10, 0xb4, 0x9c, + 0x57, 0xb4, 0x1d, 0xa0, 0x87, 0x5f, 0x43, 0x20, + 0xfd, 0x63, 0xb3, 0x92, 0xb0, 0x8d, 0x1f, 0xb4, + 0x18, 0x07, 0x70, 0x0c, 0xe7, 0x12, 0x4c, 0x7b, + 0x92, 0x77, 0x1f, 0x75, 0xb5, 0x28, 0xc2, 0x4f, + 0xf9, 0x50, 0x63, 0x4b, 0x25, 0xab, 0xce, 0x89, + 0x67, 0x7f, 0x42, 0x80, 0x92, 0x22, 0x2e, 0x14, + 0xd9, 0x85, 0x80, 0x7b, 0x76, 0xfb, 0xf2, 0x37, + 0xa1, 0x02, 0x53, 0xd2, 0xb8, 0x27, 0x93, 0xba, + 0x41, 0x8c, 0xea, 0xb1, 0x57, 0x9b, 0xa3, 0x3a, + 0xe0, 0xb2, 0x44, 0xc2, 0xb7, 0x96, 0x0a, 0x29, + 0x34, 0xf5, 0x25, 0x7d, 0x9a, 0x71, 0xb0, 0xc0, + 0x84, 0xf7, 0xe4, 0x44, 0x56, 0x48, 0x06, 0xe1, + 0x71, 0x25, 0xf5, 0xf3, 0x27, 0x3f, 0x2a, 0xa2, + 0x5f, 0x79, 0xb5, 0x6f, 0x4b, 0x79, 0x5c, 0xbb, + 0x69, 0x05, 0xd8, 0x2b, 0x2c, 0x87, 0x60, 0xa8, + 0xb9, 0xb1, 0xc0, 0xa8, 0xa5, 0x9e, 0x8a, 0x0c, + 0x89, 0xe9, 0x57, 0xa2, 0x34, 0xbc, 0x46, 0x72, + 0x42, 0xca, 0xca, 0x3e, 0x92, 0xab, 0x21, 0x5e, + 0x0b, 0x23, 0xbf, 0x18, 0x02, 0x77, 0xd3, 0x19, + 0xb7, 0xf3, 0x2c, 0x85, 0xdb, 0x43, 0xd8, 0x54, + 0x27, 0x80, 0x56, 0x0c, 0x4c, 0xf8, 0x0d, 0x5c, + 0x2b, 0x5c, 0x6d, 0x13, 0x0e, 0x7e, 0xf8, 0x12, + 0x80, 0x7a, 0x03, 0xdb, 0xcb, 0xbd, 0x8b, 0xf3, + 0x92, 0x9d, 0xc1, 0xb4, 0x90, 0x52, 0xff, 0x92, + 0x8e, 0xf2, 0x68, 0x92, 0x43, 0xbb, 0x6b, 0x30, + 0x1f, 0xea, 0x80, 0x6f, 0xbf, 0x74, 0x1c, 0x8f, + 0x61, 0x5b, 0x42, 0x41, 0xbd, 0x3b, 0xf0, 0xbe, + 0x7d, 0xb4, 0x67, 0xc5, 0x55, 0x62, 0xcd, 0x9b, + 0x3a, 0xce, 0xb4, 0x30, 0xa3, 0x16, 0x2a, 0xca, + 0xe4, 0xbf, 0xaf, 0x46, 0x26, 0xf0, 0x42, 0x37, + 0xed, 0x7b, 0x1b, 0xa7, 0x4b, 0x07, 0x05, 0x20, + 0x00, 0x1d, 0xcc, 0x0a, 0x7a, 0x9b, 0x3e, 0x5b, + 0x89, 0xba, 0xf0, 0xc1, 0xc0, 0xf9, 0xb8, 0xb3, + 0x8f, 0x03, 0xb8, 0x6b, 0xc0, 0x94, 0xe8, 0x17, + 0xa8, 0x10, 0x26, 0x3d, 0xe5, 0x92, 0x11, 0x16, + 0xb3, 0x52, 0x56, 0xc0, 0xbe, 0xe4, 0x40, 0x18, + 0xd7, 0x3b, 0x07, 0xaa, 0xbb, 0x4e, 0x07, 0xdb, + 0x69, 0xdb, 0x72, 0x76, 0xc7, 0x7b, 0x94, 0x8a, + 0x13, 0x84, 0x20, 0x39, 0x68, 0x9f, 0xc2, 0xb2, + 0xa1, 0x1b, 0x2b, 0x14, 0x33, 0xbd, 0x2e, 0xa3, + 0x1e, 0xb1, 0x85, 0xae, 0xce, 0xb0, 0x00, 0x07, + 0x40, 0xb9, 0xe4, 0x50, 0xbc, 0x7f, 0x32, 0xbf, + 0xa9, 0x70, 0x43, 0x88, 0x22, 0x1f, 0x25, 0x8b, + 0xc4, 0x2f, 0x19, 0x9a, 0x67, 0x9b, 0x48, 0xa0, + 0x69, 0x68, 0x01, 0xc8, 0x40, 0xe8, 0x92, 0x0b, + 0xd2, 0x70, 0x3e, 0xd1, 0x40, 0xa2, 0xdb, 0xf2, + 0x3e, 0x21, 0xec, 0x6c, 0x09, 0x80, 0xa6, 0xf0, + 0x1b, 0xc7, 0x14, 0x67, 0xc7, 0x98, 0x5a, 0x53, + 0xf3, 0x61, 0xa5, 0x45, 0x31, 0x7f, 0xce, 0x81, + 0x25, 0xa6, 0xc3, 0x5a, 0xf1, 0xf3, 0x82, 0xfc, + 0x32, 0x85, 0xa9, 0x83, 0x09, 0x24, 0xf2, 0xc4, + 0xbe, 0xfb, 0x3f, 0x0f, 0xbc, 0x0b, 0x23, 0xdc, + 0x3e, 0x4a, 0x10, 0xbf, 0x3b, 0x90, 0x42, 0x40, + 0x35, 0x78, 0x3f, 0xc1, 0xa1, 0x34, 0x00, 0xb0, + 0x0b, 0xd2, 0x85, 0x8d, 0x96, 0x15, 0x77, 0x63, + 0xc8, 0x1c, 0xdb, 0x88, 0x0b, 0x21, 0xff, 0x15, + 0x1b, 0xdc, 0x67, 0x21, 0x39, 0x91, 0xd9, 0x4b, + 0xb2, 0x09, 0xda, 0x4c, 0xb8, 0x17, 0x57, 0x6c, + 0x78, 0x2d, 0x6b, 0x72, 0x3b, 0x88, 0x11, 0x3f, + 0x6d, 0xd6, 0x79, 0x99, 0xc8, 0xaa, 0xd3, 0x40, + 0xa2, 0x8e, 0x4b, 0x21, 0x6c, 0xa1, 0xc5, 0xfb, + 0x63, 0x4e, 0x0d, 0xa1, 0x73, 0x05, 0x86, 0x87, + 0xbb, 0x43, 0xcb, 0xd0, 0xbb, 0x10, 0x91, 0xf8, + 0x31, 0x7f, 0xa2, 0xc8, 0x0d, 0xb2, 0xc3, 0x04, + 0xa4, 0xa0, 0xc6, 0xcb, 0x59, 0x5c, 0x50, 0x5c, + 0x95, 0xe8, 0x07, 0x36, 0x78, 0x7e, 0x1b, 0x73, + 0x7b, 0x8c, 0x0c, 0x6d, 0x18, 0x90, 0x4a, 0xf6, + 0x19, 0x04, 0xcc, 0xbc, 0x76, 0x58, 0xdc, 0x65, + 0x70, 0x34, 0xb7, 0xfc, 0xd7, 0x05, 0x27, 0x9b, + 0xc9, 0x30, 0x0a, 0x65, 0xdb, 0xa5, 0x06, 0xc8, + 0xc1, 0xc6, 0xaa, 0x63, 0x2d, 0xd9, 0x2b, 0x0c, + 0xea, 0xd6, 0x94, 0xbf, 0xc9, 0x80, 0xd0, 0xec, + 0x7d, 0x25, 0x25, 0x06, 0x28, 0x2c, 0xcc, 0x97, + 0xea, 0x3d, 0x14, 0x89, 0x42, 0x25, 0x15, 0xcf, + 0x0a, 0xe9, 0x41, 0x9b, 0x93, 0x0f, 0xd6, 0x97, + 0x85, 0xa9, 0xac, 0x79, 0xc8, 0xf1, 0x73, 0x99, + 0xd6, 0xcf, 0x9c, 0xb7, 0x8d, 0xd7, 0x8c, 0x2a, + 0x17, 0x98, 0x77, 0x00, 0x05, 0xca, 0x7f, 0x51, + 0xce, 0x7d, 0x2c, 0x77, 0xa0, 0xfc, 0x62, 0xf7, + 0xbc, 0xba, 0x96, 0x26, 0xc6, 0xc1, 0xf7, 0xcb, + 0xfe, 0x8c, 0x39, 0x77, 0x5b, 0x7e, 0x40, 0x3b, + 0x79, 0x0a, 0x5a, 0x6e, 0x19, 0x3d, 0x82, 0x4f, + 0xa1, 0x21, 0x44, 0xaa, 0xd0, 0xe3, 0x86, 0xc0, + 0xc1, 0xc7, 0xc5, 0x03, 0x69, 0x05, 0xd9, 0x99, + 0x42, 0xdd, 0x95, 0x52, 0xa1, 0x22, 0x5f, 0xb5, + 0xfa, 0x6a, 0xc0, 0x44, 0xd0, 0x0b, 0x22, 0xab, + 0x7e, 0x29, 0xad, 0x0c, 0x28, 0xc9, 0x4b, 0xf5, + 0x61, 0x12, 0x63, 0x2a, 0x70, 0x85, 0xff, 0xac, + 0xa7, 0xa3, 0x10, 0xf2, 0x36, 0x30, 0x90, 0xc2, + 0xba, 0x00, 0xfd, 0x7e, 0x82, 0xba, 0x11, 0x56, + 0xba, 0x62, 0xf7, 0x52, 0x7a, 0x1d, 0xcd, 0x6c, + 0xe3, 0xdc, 0x20, 0x56, 0x9c, 0x1f, 0x55, 0x73, + 0xc9, 0xad, 0xa7, 0x6e, 0x83, 0xb3, 0x2d, 0x29, + 0xaa, 0x96, 0x92, 0xc1, 0x33, 0x19, 0x01, 0x03, + 0xb5, 0x39, 0x9d, 0xd8, 0xf2, 0xd5, 0xd3, 0x60, + 0x68, 0xaa, 0xea, 0x6f, 0x1a, 0x2d, 0xb4, 0xc4, + 0xa0, 0x43, 0x38, 0x3c, 0x3d, 0xf5, 0xb9, 0x4a, + 0x42, 0x97, 0x31, 0xe7, 0x1b, 0x12, 0x1c, 0xd5, + 0x0e, 0x4d, 0x5a, 0x0c, 0x5a, 0x04, 0xbc, 0x50, + 0xf6, 0x33, 0xba, 0x2c, 0x50, 0xf9, 0xac, 0x03, + 0x0b, 0x4d, 0x24, 0x6e, 0x95, 0xc6, 0x08, 0x7d, + 0x50, 0xee, 0x39, 0xa1, 0x3b, 0x54, 0xb6, 0xa5, + 0x84, 0x21, 0xf2, 0x25, 0x21, 0xf8, 0x03, 0x64, + 0x78, 0x8c, 0x33, 0x8f, 0xdd, 0xc7, 0x7b, 0x70, + 0x87, 0xf8, 0xa6, 0xa4, 0x68, 0x74, 0x49, 0x94, + 0xb4, 0x77, 0x40, 0x35, 0x56, 0xdb, 0x56, 0x27, + 0x61, 0xad, 0x4e, 0x02, 0xb2, 0x7f, 0x46, 0xd6, + 0xd8, 0xc7, 0x71, 0x8f, 0x3f, 0x2d, 0x17, 0x1f, + 0x28, 0x10, 0x0e, 0x71, 0x49, 0x23, 0x7d, 0x6f, + 0x6d, 0xa8, 0x1a, 0x57, 0x15, 0x59, 0x51, 0xbb, + 0x4a, 0x49, 0x52, 0x61, 0xb4, 0xfd, 0x62, 0xa1, + 0x2d, 0x27, 0xfa, 0x58, 0x18, 0xaf, 0xbd, 0xb7, + 0x6d, 0x23, 0x74, 0x57, 0xd7, 0xdb, 0x17, 0xfc, + 0x35, 0xe1, 0x51, 0xbb, 0x55, 0x40, 0xcc, 0x89, + 0x53, 0x20, 0x12, 0x54, 0x6f, 0x94, 0x74, 0xd7, + 0x65, 0x75, 0xdc, 0x4b, 0xd5, 0xb4, 0xb9, 0x04, + 0x06, 0x27, 0xbb, 0x1b, 0x53, 0xf9, 0xb5, 0xae, + 0x8b, 0x87, 0x7e, 0x49, 0x30, 0xae, 0xe6, 0xa5, + 0x3a, 0x07, 0x22, 0x2f, 0x7c, 0x15, 0xcd, 0xdd, + 0x37, 0xc9, 0x9d, 0x01, 0xe9, 0xe5, 0xff, 0x86, + 0xac, 0x91, 0xce, 0x90, 0xb0, 0xd7, 0xf7, 0x63, + 0xb2, 0x51, 0x48, 0x47, 0xd4, 0x47, 0xd4, 0xed, + 0x01, 0xdc, 0xce, 0x7c, 0x3d, 0x1f, 0x5d, 0xdb, + 0xcd, 0x35, 0x51, 0x05, 0x5e, 0x6d, 0xdd, 0x7b, + 0x6b, 0x52, 0x75, 0xe0, 0x98, 0xf7, 0x60, 0x72, + 0x86, 0x2e, 0x71, 0x63, 0xc5, 0x7e, 0xb9, 0x13, + 0x48, 0x2d, 0xd3, 0x44, 0x32, 0x23, 0x86, 0x22, + 0xd7, 0x18, 0x46, 0x3d, 0x6b, 0xaa, 0x05, 0x80, + 0xa9, 0x3b, 0x91, 0xf5, 0x75, 0x48, 0xe3, 0x42, + 0xc0, 0x85, 0x93, 0xb1, 0x94, 0x93, 0x48, 0x60, + 0x0f, 0xb1, 0xd9, 0xd5, 0x70, 0x2a, 0x2a, 0x94, + 0x15, 0x80, 0xee, 0x1c, 0xc9, 0x52, 0xa6, 0xdd, + 0x6e, 0xf0, 0xcf, 0x9a, 0x09, 0x48, 0xbf, 0xd1, + 0x31, 0x3a, 0x11, 0x16, 0xda, 0xb5, 0x04, 0x19, + 0x3e, 0x6b, 0xf5, 0x7d, 0x78, 0xf8, 0x6d, 0x65, + 0xf3, 0x69, 0x3c, 0xae, 0x1b, 0xa3, 0x36, 0x65, + 0x54, 0x22, 0xc6, 0x61, 0x86, 0xfc, 0x82, 0x12, + 0xb8, 0xe0, 0xe5, 0x5a, 0x5a, 0xe0, 0x9d, 0xb7, + 0xa1, 0x38, 0xa7, 0x03, 0x05, 0xb6, 0x28, 0x52, + 0x9b, 0x19, 0x0a, 0x42, 0x79, 0xd1, 0xc3, 0xc1, + 0xab, 0x24, 0x31, 0xa0, 0x86, 0xf3, 0xbd, 0x4e, + 0x9f, 0x7d, 0x27, 0x45, 0x0e, 0x0a, 0x2e, 0xac, + 0xbe, 0x83, 0xb2, 0x33, 0x7d, 0x0a, 0x63, 0x0d, + 0x4e, 0x1a, 0x39, 0xa5, 0x2a, 0xa0, 0x56, 0x59, + 0x8a, 0x98, 0xe7, 0xa8, 0x02, 0x2c, 0xd5, 0x2c, + 0x17, 0x56, 0xee, 0xe1, 0x7d, 0xfb, 0x84, 0xfe, + 0xf3, 0x82, 0xd8, 0xf2, 0x61, 0x0d, 0x2c, 0xab, + 0x0a, 0x83, 0x6d, 0xf5, 0x82, 0x6e, 0xa2, 0xd1, + 0x79, 0x47, 0x0e, 0x94, 0xda, 0xd0, 0x26, 0xc1, + 0x2d, 0x3b, 0xd2, 0x1d, 0x52, 0x6b, 0x7e, 0xb9, + 0x82, 0x7e, 0x9c, 0x4f, 0x98, 0xe6, 0x4e, 0xdd, + 0xc8, 0x04, 0x75, 0x6c, 0x1c, 0x74, 0xff, 0xb1, + 0x78, 0xa3, 0x0a, 0xd5, 0xd3, 0x30, 0xa2, 0xcc, + 0x15, 0x8b, 0xfd, 0x1f, 0x7a, 0xe5, 0xd0, 0x1a, + 0x07, 0xe8, 0x74, 0xa4, 0xc7, 0x50, 0x48, 0xcf, + 0x3e, 0x50, 0x89, 0x7d, 0x9e, 0xb9, 0x07, 0xc2, + 0xa4, 0x0d, 0x53, 0x42, 0xa5, 0xee, 0xde, 0xeb, + 0xc1, 0x38, 0x25, 0xf2, 0xd1, 0x10, 0x41, 0x8b, + 0xde, 0x9d, 0x03, 0x82, 0x7e, 0x90, 0xb8, 0x8d, + 0x5a, 0xbc, 0x7d, 0x4c, 0xdf, 0x7a, 0x7e, 0x35, + 0x3e, 0xb8, 0x34, 0xa3, 0x9e, 0x1e, 0x53, 0xd4, + 0x48, 0x82, 0x0d, 0x6b, 0x74, 0xdb, 0x5e, 0x8d, + 0x07, 0x58, 0x1a, 0xa4, 0xdf, 0x45, 0xd4, 0xb9, + 0x28, 0xe9, 0x05, 0xd3, 0x8a, 0xdb, 0x85, 0x59, + 0x30, 0x2e, 0x29, 0x76, 0xd4, 0xbf, 0x4c, 0xb8, + 0x45, 0x26, 0x15, 0x52, 0xb8, 0xfc, 0x36, 0x47, + 0x74, 0xb7, 0x04, 0x7c, 0x6c, 0x24, 0xde, 0x06, + 0xed, 0xc2, 0x46, 0x8b, 0xbe, 0xdc, 0xc7, 0x6c, + 0xb1, 0xe3, 0xa3, 0x7e, 0x59, 0xe6, 0x86, 0x54, + 0xbe, 0x25, 0x57, 0x0e, 0x3f, 0x7d, 0xd4, 0xad, + 0x5c, 0x6e, 0xb2, 0xf3, 0x9e, 0x7e, 0x06, 0xb4, + 0x33, 0xc5, 0xd1, 0x29, 0xeb, 0x0e, 0x82, 0x85, + 0x80, 0xc3, 0x1f, 0x15, 0x96, 0x76, 0x08, 0xe1, + 0xbc, 0x80, 0x0a, 0xdb, 0x1e, 0x63, 0x5e, 0xd6, + 0x67, 0x42, 0x7c, 0xc8, 0x75, 0x41, 0x35, 0x54, + 0x1b, 0xb9, 0x79, 0x70, 0xde, 0xb0, 0x7d, 0x4a, + 0x97, 0xee, 0x08, 0x60, 0x45, 0x3a, 0xc9, 0x1e, + 0xef, 0xa2, 0x70, 0x62, 0x61, 0x15, 0xb0, 0x47, + 0x51, 0x39, 0x19, 0xdb, 0x20, 0xeb, 0x3b, 0x4c, + 0xff, 0xfe, 0x0c, 0xc3, 0x9e, 0x63, 0xf2, 0x5e, + 0xe9, 0xb9, 0xe3, 0x91, 0x3f, 0xfa, 0x10, 0xb0, + 0xe5, 0xea, 0x2f, 0x2f, 0xe7, 0xe2, 0x94, 0xea, + 0xab, 0x10, 0x87, 0x46, 0x7d, 0xf3, 0x9f, 0x6e, + 0x32, 0x47, 0x70, 0x41, 0x88, 0xd4, 0xff, 0xba, + 0xb3, 0x9e, 0xe6, 0x11, 0x32, 0xf3, 0x34, 0x6f, + 0xf3, 0xb6, 0x63, 0xed, 0x14, 0xe8, 0xdf, 0xf2, + 0xf2, 0x46, 0x55, 0xe3, 0x39, 0x69, 0x34, 0xee, + 0x3c, 0xdc, 0xef, 0x7a, 0x51, 0xf3, 0xef, 0x32, + 0x41, 0xc5, 0x81, 0x2d, 0x72, 0x17, 0x70, 0x96, + 0x77, 0x38, 0x9b, 0x79, 0xee, 0x9d, 0xde, 0x0f, + 0x5e, 0x7f, 0x16, 0x23, 0xcf, 0x09, 0x3f, 0x83, + 0x10, 0xb4, 0x5a, 0x50, 0xb9, 0xc8, 0x87, 0x48, + 0x43, 0x31, 0xc0, 0x29, 0x8f, 0x50, 0xc0, 0xd1, + 0x6d, 0x3f, 0x15, 0x12, 0x3f, 0x0e, 0xea, 0xe9, + 0x50, 0xba, 0x82, 0xb9, 0xda, 0x8d, 0xf3, 0x8c, + 0x42, 0x04, 0xe9, 0xe1, 0x1b, 0xd2, 0xb7, 0x3d, + 0xa9, 0x8e, 0xd8, 0x3d, 0x22, 0xf4, 0xb3, 0xc1, + 0x22, 0xba, 0xca, 0xa9, 0x56, 0x7f, 0xf4, 0x63, + 0x12, 0x2d, 0x00, 0x93, 0xf5, 0xda, 0xfe, 0xf3, + 0x3a, 0x25, 0xf3, 0xae, 0xbe, 0x09, 0x92, 0xeb, + 0x3e, 0x2c, 0xf8, 0xe8, 0xb9, 0x79, 0xf1, 0xb5, + 0xe8, 0x28, 0xef, 0x36, 0x77, 0xb5, 0xae, 0x79, + 0xa4, 0x8f, 0xc9, 0x4e, 0xbf, 0x1f, 0xeb, 0x2e, + 0x0e, 0x5c, 0x3f, 0xab, 0x0e, 0xba, 0xe8, 0x56, + 0x50, 0xf7, 0xb7, 0xaf, 0xb6, 0xa9, 0x8f, 0xea, + 0x8b, 0xe7, 0x96, 0x7b, 0x57, 0xae, 0x0d, 0x8f, + 0x45, 0x6f, 0xbf, 0x09, 0x70, 0x25, 0xe8, 0x56, + 0xc8, 0xf9, 0x50, 0xd6, 0x2e, 0x9d, 0x8e, 0xbe, + 0x43, 0x27, 0x49, 0x54, 0xdb, 0x43, 0x95, 0xf3, + 0xa3, 0xb3, 0x10, 0x7b, 0x2d, 0xce, 0xea, 0x7d, + 0x03, 0xf5, 0xce, 0xf0, 0x5d, 0xb6, 0xe8, 0xe3, + 0xbe, 0x48, 0xf0, 0xe9, 0x13, 0x7b, 0x71, 0xef, + 0x31, 0x98, 0x6d, 0xce, 0x7f, 0xd9, 0xfa, 0x01, + 0xd5, 0xa4, 0x21, 0x04, 0xf9, 0x9e, 0xb0, 0xf6, + 0x82, 0xe6, 0x13, 0x93, 0xae, 0x67, 0xa6, 0xbf, + 0x38, 0x9b, 0x05, 0x46, 0x20, 0x15, 0xff, 0x0d, + 0x5a, 0x6e, 0x21, 0x43, 0xe9, 0x7b, 0x6b, 0xaf, + 0xe6, 0x42, 0x01, 0x01, 0x8c, 0x00, 0x5a, 0xed, + 0xbd, 0x03, 0xef, 0x4a, 0xd8, 0x90, 0x2e, 0x62, + 0xe2, 0xca, 0x8e, 0x31, 0x53, 0x62, 0xc1, 0x46, + 0x46, 0x62, 0xd3, 0x6b, 0x09, 0x94, 0x80, 0x94, + 0xd5, 0x8b, 0x09, 0x16, 0x09, 0x2f, 0x01, 0x73, + 0x43, 0x62, 0xd1, 0x78, 0x44, 0x26, 0x39, 0x1f, + 0x65, 0xd3, 0xf9, 0xac, 0x68, 0x90, 0x2f, 0xa4, + 0xe7, 0x45, 0x0a, 0x25, 0x3d, 0xca, 0xc1, 0x8d, + 0x43, 0x18, 0x2c, 0x84, 0xa9, 0xae, 0x2d, 0x0b, + 0xed, 0x04, 0x24, 0x83, 0xc4, 0x18, 0xfd, 0x86, + 0xc7, 0xe5, 0xa6, 0x81, 0x7b, 0x7e, 0x6f, 0x6e, + 0x91, 0xe2, 0xfc, 0x8b, 0xaa, 0x3c, 0x33, 0xea, + 0x52, 0xa3, 0xd0, 0xab, 0xb8, 0xba, 0xca, 0x19, + 0x6c, 0xf3, 0xb0, 0x33, 0x1a, 0xa1, 0x40, 0x01, + 0x20, 0xf0, 0x12, 0x71, 0xc4, 0xc3, 0xcc, 0xd4, + 0x5c, 0xd1, 0xec, 0x4c, 0x92, 0x3a, 0x02, 0x43, + 0x63, 0xf0, 0xb9, 0xa4, 0x53, 0x4a, 0x08, 0xe8, + 0xe9, 0x00, 0xaa, 0x2b, 0x4c, 0x34, 0xa1, 0x0c, + 0x00, 0x85, 0x6c, 0x62, 0x48, 0xd8, 0x68, 0x6b, + 0x01, 0xf5, 0xec, 0xf5, 0x7d, 0x63, 0xfa, 0x15, + 0xfe, 0xe2, 0x2d, 0xfa, 0x7b, 0x0a, 0x01, 0x0b, + 0x94, 0x31, 0x3c, 0x52, 0x0d, 0xb3, 0x8b, 0xb1, + 0xb0, 0x32, 0x09, 0x9e, 0xae, 0x3d, 0x2a, 0xd0, + 0x15, 0xe1, 0x00, 0x19, 0xfe, 0x06, 0x1f, 0xe2, + 0x0b, 0x07, 0x5f, 0x26, 0x72, 0x85, 0x92, 0x2c, + 0x54, 0x36, 0x8d, 0x6c, 0x2f, 0xe9, 0x1a, 0x29, + 0xae, 0x90, 0xb6, 0x7c, 0x17, 0x31, 0x97, 0x51, + 0x50, 0x28, 0x1c, 0x37, 0xa9, 0x27, 0x17, 0x30, + 0x1c, 0xa7, 0x37, 0xf7, 0x04, 0x02, 0x98, 0x37, + 0x44, 0x14, 0x94, 0x66, 0x27, 0x40, 0x5c, 0xca, + 0x37, 0xc4, 0xdb, 0x42, 0x11, 0x09, 0xff, 0x9f, + 0x34, 0x32, 0x86, 0xa5, 0x52, 0x2c, 0x8b, 0x07, + 0x3d, 0x66, 0xb2, 0x76, 0x31, 0x00, 0xae, 0x8f, + 0x25, 0x22, 0xca, 0x40, 0x77, 0xf1, 0x92, 0x87, + 0x94, 0x19, 0x9a, 0x8c, 0x6b, 0x49, 0xc1, 0xdb, + 0x1d, 0x6c, 0x2d, 0x0a, 0x61, 0xa0, 0xf1, 0x2e, + 0x66, 0x49, 0x9e, 0x73, 0xfc, 0x41, 0xa1, 0xa1, + 0xae, 0x67, 0x14, 0x2e, 0xc0, 0x14, 0x0e, 0x68, + 0xd9, 0xb0, 0x08, 0xc1, 0x49, 0xf3, 0x76, 0x76, + 0x52, 0xc6, 0x06, 0xe7, 0x46, 0x8e, 0x43, 0xad, + 0xca, 0x01, 0xc8, 0xf0, 0x98, 0x9c, 0x15, 0x09, + 0x16, 0x3c, 0xcd, 0xa1, 0xf4, 0x28, 0x43, 0xaf, + 0x46, 0x3e, 0x84, 0x38, 0xc9, 0x8c, 0xd6, 0xbc, + 0xac, 0xbf, 0x68, 0x60, 0x08, 0x99, 0x22, 0xed, + 0x55, 0xba, 0x43, 0xe2, 0x16, 0x04, 0x6b, 0x6b, + 0xa4, 0x2a, 0x55, 0x06, 0x2d, 0x74, 0x44, 0xe9, + 0xf7, 0x0b, 0x5f, 0xa1, 0x0a, 0x3f, 0xfc, 0x14, + 0xd4, 0x0a, 0x08, 0xc5, 0x6f, 0x5d, 0x9e, 0xe4, + 0xad, 0x1b, 0x99, 0x8e, 0xe0, 0xc4, 0x70, 0x28, + 0xa5, 0xe2, 0xdb, 0xf7, 0x51, 0x61, 0x22, 0x8c, + 0x95, 0xd0, 0x48, 0xd5, 0x36, 0x2c, 0x88, 0xb9, + 0x1c, 0x7e, 0x6e, 0xdd, 0x3a, 0x4c, 0xac, 0x59, + 0xce, 0x92, 0x5d, 0x97, 0x10, 0x0d, 0x27, 0xb5, + 0x5e, 0xcc, 0x99, 0x63, 0x77, 0xa3, 0x1c, 0xa9, + 0xf5, 0x11, 0x1a, 0xcf, 0x92, 0x24, 0x3b, 0x6b, + 0x90, 0x29, 0x3d, 0x0b, 0x88, 0x5f, 0x1f, 0x47, + 0x3e, 0x76, 0x13, 0x64, 0x22, 0x3c, 0x54, 0x25, + 0x38, 0x90, 0x59, 0x38, 0xe0, 0x14, 0xb7, 0x97, + 0x3e, 0xcf, 0x8d, 0x10, 0x1f, 0x73, 0xdd, 0x18, + 0x52, 0x5a, 0x4f, 0x1e, 0x5e, 0xfc, 0x4c, 0x91, + 0x1d, 0xc1, 0x64, 0x9f, 0x96, 0xd9, 0xc6, 0x5e, + 0x83, 0xdc, 0x89, 0xbd, 0x71, 0xff, 0x65, 0xf7, + 0x07, 0x53, 0xc6, 0x67, 0x7a, 0x2e, 0xff, 0x89, + 0x5e, 0x3c, 0x72, 0xf0, 0x45, 0x52, 0xed, 0x96, + 0x09, 0x40, 0x22, 0x16, 0xa8, 0x8d, 0x2f, 0x92, + 0x46, 0xe3, 0x42, 0xbf, 0x6b, 0x6c, 0xb9, 0x04, + 0xb2, 0xb6, 0x16, 0x22, 0x4f, 0x20, 0x05, 0xf7, + 0x0b, 0x6f, 0xb8, 0x8b, 0x90, 0x5a, 0x29, 0xbe, + 0x2f, 0x0a, 0x7c, 0xc6, 0x87, 0x1c, 0x4a, 0xfb, + 0xa2, 0x3f, 0xbb, 0xf4, 0xa3, 0x6e, 0xb5, 0xa6, + 0xba, 0xa1, 0xc0, 0xb8, 0x81, 0x26, 0x98, 0x90, + 0x42, 0xd7, 0x66, 0xbb, 0x30, 0x43, 0xfd, 0xba, + 0xc2, 0x4e, 0x26, 0x15, 0x3b, 0xa0, 0x6e, 0x32, + 0x34, 0x4c, 0x0c, 0x4b, 0xc0, 0x48, 0xe0, 0xb1, + 0x23, 0x04, 0x11, 0x0b, 0x82, 0x31, 0x0a, 0x0d, + 0x5d, 0xa4, 0xf0, 0xc6, 0xc7, 0x4c, 0x89, 0x50, + 0x0b, 0x21, 0xc0, 0xb8, 0x11, 0xc4, 0x0d, 0xf0, + 0x53, 0xa2, 0xa6, 0x23, 0x4a, 0x73, 0xe4, 0xc6, + 0x46, 0x72, 0xbc, 0xc8, 0x92, 0x58, 0x7c, 0x44, + 0x32, 0x4c, 0x0b, 0xe3, 0x60, 0xee, 0xbc, 0x39, + 0xa0, 0x7c, 0x92, 0xcb, 0x25, 0xc0, 0x3c, 0xc7, + 0x09, 0x2e, 0xed, 0x18, 0xf3, 0xaf, 0x23, 0x37, + 0x6b, 0xb1, 0xc2, 0x30, 0xab, 0xc2, 0xa4, 0xc9, + 0x5d, 0xea, 0x6c, 0xe1, 0x2b, 0x1c, 0xa4, 0xdc, + 0x60, 0x48, 0x66, 0xd8, 0x6c, 0x61, 0x04, 0x2a, + 0xf1, 0xe9, 0x46, 0x40, 0xa9, 0x30, 0xb9, 0xc7, + 0xca, 0x3b, 0x1f, 0xdd, 0x60, 0xce, 0x29, 0x72, + 0xbc, 0xab, 0xa0, 0xaf, 0x4e, 0xfc, 0x8d, 0xd0, + 0x0f, 0x05, 0x63, 0x91, 0xa5, 0x76, 0x22, 0x52, + 0x72, 0x12, 0x41, 0xf1, 0xa0, 0x84, 0x4d, 0x40, + 0x03, 0x42, 0x00, 0xd2, 0x40, 0xf9, 0xc4, 0x93, + 0x23, 0x56, 0x77, 0x58, 0x20, 0xd4, 0xea, 0x64, + 0x33, 0x0b, 0x08, 0x0f, 0xe9, 0x50, 0x31, 0x4e, + 0x39, 0x05, 0xe2, 0x21, 0x47, 0x4a, 0x5e, 0x25, + 0x35, 0x55, 0x55, 0xa7, 0x19, 0x35, 0xff, 0x8f, + 0x32, 0xf5, 0xb4, 0xf4, 0x56, 0xd6, 0x80, 0xf1, + 0xab, 0x26, 0x2b, 0xb2, 0xf4, 0xcd, 0x3b, 0x1f, + 0x63, 0xe5, 0x75, 0x15, 0xb9, 0xa8, 0xa2, 0x4b, + 0xd8, 0x61, 0x23, 0x51, 0x73, 0x47, 0x59, 0x11, + 0xea, 0x56, 0x90, 0xa6, 0xbe, 0x9d, 0x01, 0x8e, + 0x70, 0x01, 0x28, 0xac, 0x0e, 0x47, 0x0b, 0xd9, + 0xeb, 0xc0, 0xe2, 0x56, 0x2a, 0x85, 0x26, 0x42, + 0xbb, 0xb8, 0xb4, 0x1a, 0x6c, 0xaf, 0x02, 0xb6, + 0x24, 0x49, 0x9d, 0x30, 0x53, 0x85, 0x7d, 0xbf, + 0xc4, 0x91, 0x5c, 0x4c, 0xb5, 0x5a, 0x4a, 0x08, + 0x0d, 0xd6, 0x9d, 0xa4, 0x06, 0x6b, 0x89, 0x95, + 0x4b, 0x02, 0x4d, 0x43, 0x31, 0x15, 0x97, 0x15, + 0x1c, 0x89, 0x47, 0x32, 0x84, 0xef, 0x14, 0x98, + 0x4c, 0x30, 0x95, 0x31, 0xb7, 0x4f, 0xee, 0x8a, + 0xad, 0xa6, 0xd9, 0xc5, 0x50, 0x40, 0x58, 0x16, + 0x42, 0x8a, 0x1b, 0xa9, 0xba, 0x09, 0xce, 0xd5, + 0x04, 0xa9, 0xd9, 0x78, 0x78, 0x2d, 0x5f, 0x8f, + 0x74, 0xed, 0xa4, 0x52, 0xb8, 0xfe, 0xdd, 0x01, + 0x4e, 0x3f, 0x89, 0x4d, 0xc0, 0x2b, 0x64, 0xb5, + 0x78, 0x78, 0x12, 0x97, 0x26, 0x81, 0xb6, 0x18, + 0xe7, 0xee, 0xed, 0x20, 0x06, 0x96, 0x37, 0x99, + 0xa5, 0xd0, 0x6d, 0x93, 0x3b, 0xd4, 0x13, 0x9b, + 0x45, 0xc8, 0xf8, 0xbd, 0x6a, 0xea, 0x75, 0xae, + 0xb6, 0xa5, 0x97, 0x10, 0x79, 0x1a, 0x29, 0x00, + 0x73, 0x03, 0x34, 0xa4, 0xb9, 0x75, 0x87, 0xa7, + 0xb2, 0x1e, 0x91, 0xf9, 0xe9, 0x26, 0x7e, 0xee, + 0xa5, 0x5f, 0x32, 0xb6, 0x96, 0xe9, 0x1d, 0x52, + 0xba, 0xe0, 0x70, 0xec, 0x2b, 0xcd, 0xca, 0x99, + 0x68, 0xde, 0x6a, 0x34, 0x8d, 0x84, 0x5a, 0xd2, + 0xbe, 0x92, 0xb2, 0x8b, 0xd5, 0xfe, 0xa6, 0x6a, + 0x9a, 0xc8, 0x25, 0x25, 0x37, 0x1e, 0x31, 0xa8, + 0x5b, 0x15, 0x90, 0x9d, 0xee, 0xcc, 0xff, 0xe0, + 0xb2, 0x05, 0xd1, 0x2c, 0x44, 0x0b, 0x82, 0xb6, + 0x6a, 0x70, 0xc2, 0x85, 0x79, 0xdc, 0xa7, 0x77, + 0x56, 0xc0, 0xfc, 0xdc, 0xbd, 0x6a, 0xc0, 0xac, + 0x67, 0x28, 0xce, 0x0d, 0x64, 0x8b, 0xc5, 0x37, + 0x74, 0x84, 0x80, 0xb3, 0x7f, 0x44, 0xf2, 0xd4, + 0xcd, 0x19, 0x85, 0x7b, 0x0e, 0xa4, 0x24, 0xd2, + 0xf0, 0xd4, 0xcb, 0x54, 0xd9, 0xc7, 0x40, 0x95, + 0xf0, 0xfe, 0x6b, 0x72, 0x41, 0x04, 0x04, 0x6d, + 0xc1, 0xfc, 0x66, 0x17, 0xaf, 0xc8, 0x72, 0xd4, + 0x9c, 0x18, 0xc1, 0xeb, 0x32, 0x33, 0xb0, 0x73, + 0xa2, 0x0a, 0x9e, 0x46, 0x92, 0xad, 0xad, 0x7b, + 0xce, 0xf8, 0x80, 0x48, 0xf9, 0x01, 0xf9, 0xf0, + 0x70, 0xc6, 0x83, 0x94, 0x01, 0x73, 0x94, 0xb4, + 0x67, 0xe8, 0x43, 0x9b, 0x51, 0xb0, 0xc2, 0x92, + 0x51, 0x9c, 0xba, 0xd0, 0xb8, 0x09, 0x68, 0x8b, + 0xdb, 0xbd, 0x4f, 0xce, 0x70, 0x4f, 0x9a, 0xff, + 0x50, 0xc9, 0xd5, 0xa7, 0x1c, 0x29, 0x15, 0xf3, + 0xeb, 0xd8, 0xd9, 0x14, 0xba, 0x86, 0x23, 0x99, + 0x24, 0x41, 0x56, 0x09, 0x98, 0x47, 0x9d, 0x34, + 0x17, 0x8b, 0x3c, 0xd0, 0x8f, 0x1c, 0x34, 0x8b, + 0x9f, 0xc0, 0x40, 0xc7, 0x0a, 0x16, 0xc1, 0xed, + 0x68, 0xd1, 0x42, 0x57, 0xbd, 0x96, 0x12, 0xb4, + 0xf5, 0xb1, 0x48, 0x40, 0x3a, 0x53, 0x41, 0x5b, + 0xc0, 0x57, 0x81, 0xd7, 0x39, 0x90, 0x7e, 0x51, + 0x3b, 0x88, 0xb2, 0x64, 0x90, 0xb8, 0xde, 0x20, + 0x10, 0x7c, 0x48, 0x79, 0x08, 0x5c, 0x34, 0xf8, + 0xa1, 0x50, 0x0c, 0xed, 0x24, 0xa6, 0xdb, 0xc0, + 0xd4, 0x02, 0x34, 0xa5, 0xc5, 0x2c, 0x70, 0x07, + 0x27, 0x33, 0x21, 0xfd, 0x94, 0xe7, 0x11, 0xf1, + 0x29, 0xa4, 0x36, 0xef, 0xab, 0x12, 0xa5, 0x54, + 0x18, 0x04, 0x0e, 0x22, 0xca, 0x44, 0x3c, 0x70, + 0xd7, 0xbb, 0x54, 0xb6, 0xc2, 0x91, 0xff, 0x40, + 0x03, 0x21, 0xed, 0x48, 0x45, 0x10, 0x4d, 0x38, + 0xc2, 0xfb, 0x09, 0xac, 0x74, 0x7c, 0x43, 0x82, + 0x7b, 0xa0, 0xe4, 0x23, 0xdd, 0xa5, 0x4b, 0x78, + 0x2d, 0x40, 0x1a, 0x0a, 0x45, 0x95, 0x83, 0xf7, + 0x81, 0x21, 0x15, 0xd4, 0xe9, 0x95, 0x2d, 0x82, + 0xa0, 0xc5, 0xa1, 0xd8, 0xef, 0x1b, 0xf8, 0x8b, + 0x05, 0x66, 0xd6, 0x63, 0xb7, 0x86, 0x2d, 0x25, + 0x0c, 0xbb, 0xd9, 0xdf, 0x34, 0x10, 0xa5, 0x9d, + 0x39, 0xf6, 0x8d, 0x0c, 0x6c, 0x4a, 0x05, 0x0e, + 0xe8, 0x45, 0xbc, 0x00, 0xb8, 0x49, 0x34, 0xb5, + 0xa3, 0x23, 0x1e, 0xa4, 0x37, 0x8c, 0x25, 0xe6, + 0xe2, 0x7c, 0xd9, 0x01, 0x19, 0x9a, 0xe0, 0x52, + 0xc3, 0xbf, 0x4c, 0x40, 0x76, 0xfd, 0x90, 0x81, + 0x88, 0x66, 0xe8, 0x8d, 0xb9, 0xb9, 0x61, 0x1b, + 0xb6, 0xe0, 0x83, 0x3a, 0x10, 0x80, 0xb9, 0x48, + 0x66, 0x02, 0x82, 0x43, 0x99, 0x9f, 0x49, 0x2e, + 0x19, 0x46, 0xf4, 0xac, 0xc0, 0x1f, 0x81, 0xec, + 0x40, 0x45, 0x0a, 0x18, 0x46, 0x32, 0xbe, 0xe9, + 0x49, 0x97, 0x0b, 0x20, 0x57, 0xd8, 0x30, 0xc9, + 0x56, 0xd2, 0x2e, 0x39, 0x89, 0xb3, 0x57, 0xcf, + 0x00, 0x78, 0x2e, 0x35, 0x86, 0x25, 0x56, 0x9e, + 0xe4, 0x64, 0x14, 0x3a, 0xc5, 0x40, 0x43, 0xfe, + 0x43, 0x6e, 0xed, 0x58, 0x01, 0x17, 0x4d, 0xc3, + 0xc7, 0x62, 0x82, 0x83, 0x6d, 0x74, 0xc1, 0x23, + 0x5c, 0x6a, 0x62, 0x45, 0x71, 0x24, 0x8b, 0x83, + 0x8b, 0xf9, 0xda, 0x6f, 0x4a, 0x24, 0xa2, 0x8d, + 0xf5, 0xc3, 0x8e, 0xd5, 0x21, 0x67, 0x37, 0x3d, + 0xa2, 0x4d, 0x70, 0x7c, 0x05, 0x31, 0x62, 0x99, + 0xe0, 0x0a, 0x59, 0xf9, 0x8f, 0x60, 0xae, 0x30, + 0x6f, 0x3c, 0xca, 0x12, 0x93, 0xd8, 0xe4, 0x43, + 0xa1, 0x89, 0x8a, 0x9e, 0xaf, 0x20, 0xa8, 0x3c, + 0x3d, 0xf1, 0x4e, 0x8f, 0x64, 0x2f, 0xff, 0x78, + 0xf0, 0x08, 0x55, 0x33, 0xd1, 0x96, 0x41, 0xee, + 0xa4, 0x4e, 0x0a, 0x09, 0x65, 0xd8, 0xac, 0x68, + 0xb8, 0x94, 0x7e, 0xa0, 0xa3, 0x45, 0x3a, 0x54, + 0xa8, 0x5b, 0x5c, 0xd4, 0x1b, 0x45, 0x9a, 0xc2, + 0x75, 0x00, 0x62, 0x28, 0x8a, 0x0e, 0x31, 0xc3, + 0x1c, 0xe6, 0x4d, 0x6f, 0x5f, 0x80, 0x8d, 0x29, + 0x40, 0xfa, 0x8a, 0x2a, 0x54, 0x10, 0x29, 0x51, + 0x04, 0x44, 0x48, 0x25, 0x44, 0x4c, 0x5e, 0x35, + 0x6f, 0x88, 0x7f, 0x31, 0xce, 0x4f, 0x03, 0xe7, + 0x1d, 0x96, 0x1e, 0x02, 0x9d, 0xac, 0x08, 0x05, + 0x78, 0x10, 0x97, 0x1d, 0x8c, 0xb8, 0x6e, 0x23, + 0x80, 0xd3, 0xe9, 0x72, 0xee, 0x94, 0xcd, 0x87, + 0x9d, 0xd4, 0x6b, 0x71, 0x30, 0xd1, 0x1f, 0x37, + 0x79, 0xb9, 0x56, 0xc0, 0x34, 0x51, 0x21, 0x54, + 0x08, 0xbf, 0x50, 0x90, 0x80, 0xc3, 0x18, 0x6a, + 0x9f, 0x51, 0x1d, 0x08, 0x81, 0x20, 0x99, 0x1f, + 0x04, 0x1e, 0x81, 0x9c, 0x07, 0x3d, 0xe3, 0x2e, + 0x3c, 0xd4, 0x15, 0xa1, 0x78, 0xc6, 0x6d, 0x37, + 0xb1, 0x1c, 0x19, 0xa0, 0xaa, 0x4b, 0x51, 0x89, + 0xe1, 0x93, 0x68, 0x0d, 0x47, 0x6f, 0xb8, 0xf9, + 0x1a, 0x0d, 0x20, 0x73, 0x29, 0x64, 0x15, 0xea, + 0x66, 0x46, 0x43, 0x20, 0x87, 0xc6, 0x95, 0x5b, + 0x1e, 0xac, 0xc6, 0x3a, 0xed, 0x82, 0x55, 0x92, + 0x75, 0x61, 0xad, 0x80, 0xbd, 0x5f, 0x0d, 0x0e, + 0xd0, 0xb3, 0xbd, 0x76, 0xc2, 0xa3, 0x95, 0x0c, + 0xe5, 0x60, 0xc5, 0xd5, 0x9c, 0x76, 0x11, 0xd0, + 0x24, 0xdd, 0x2b, 0x01, 0x4e, 0xa5, 0x15, 0x16, + 0x60, 0x25, 0xa3, 0x8a, 0x98, 0xad, 0x0b, 0x25, + 0x14, 0x70, 0x80, 0xcd, 0x5e, 0x96, 0x1c, 0xcb, + 0x28, 0xea, 0x21, 0x41, 0xeb, 0x24, 0x63, 0x8c, + 0x8e, 0x04, 0x23, 0x9c, 0xa9, 0x88, 0x30, 0x4a, + 0x4d, 0x86, 0xd9, 0x12, 0xb6, 0x99, 0xff, 0x0b, + 0x00, 0x6d, 0x0f, 0xa0, 0x00, 0xd5, 0xc6, 0xac, + 0x35, 0x61, 0x38, 0x87, 0x24, 0x9e, 0x79, 0xba, + 0x47, 0x60, 0x27, 0x56, 0x89, 0x9d, 0x62, 0x64, + 0x47, 0xc4, 0x90, 0x2f, 0x40, 0x82, 0x7b, 0xc7, + 0xed, 0x49, 0x02, 0x66, 0x4b, 0x5b, 0xd1, 0x0e, + 0x25, 0x6a, 0xae, 0xc3, 0x26, 0x2f, 0xac, 0xca, + 0xa0, 0x47, 0x90, 0xc7, 0x75, 0x29, 0x0d, 0x6e, + 0xa3, 0xd4, 0x31, 0xdc, 0x5c, 0x06, 0xc1, 0x15, + 0x1f, 0x88, 0x25, 0x78, 0x03, 0x32, 0x80, 0xf1, + 0x46, 0xe7, 0xac, 0x0f, 0x5c, 0x27, 0x75, 0xda, + 0x32, 0xdd, 0x2a, 0x84, 0x0e, 0x1f, 0xb6, 0xc4, + 0xa4, 0x49, 0xc3, 0x05, 0x8d, 0xcb, 0xd0, 0x04, + 0x12, 0x94, 0x48, 0xa9, 0x7e, 0x0b, 0xa2, 0x59, + 0xff, 0x7e, 0x4f, 0x27, 0xb1, 0x01, 0xcb, 0x7a, + 0x47, 0x4b, 0xbd, 0x4e, 0x46, 0x82, 0xc0, 0xcd, + 0x51, 0x2a, 0xa7, 0xd8, 0x90, 0x32, 0x57, 0x8a, + 0x21, 0xbf, 0x12, 0xfe, 0x06, 0x14, 0x2b, 0x77, + 0x9c, 0xdc, 0xf1, 0x01, 0x4a, 0x75, 0xf8, 0xe9, + 0x87, 0x37, 0xe5, 0xd6, 0x41, 0xae, 0x34, 0x63, + 0xa1, 0x22, 0x05, 0x23, 0x82, 0xe6, 0xb8, 0x2a, + 0x9d, 0x92, 0x9a, 0xf4, 0x41, 0x31, 0x38, 0x5c, + 0xf7, 0x9f, 0x63, 0x72, 0xea, 0x2b, 0x05, 0xea, + 0x8f, 0xeb, 0x98, 0x87, 0xb9, 0x65, 0x58, 0xa4, + 0x94, 0x2b, 0x04, 0x0c, 0x0c, 0x48, 0x41, 0x62, + 0x22, 0x20, 0xd1, 0xad, 0x89, 0xec, 0x6e, 0x37, + 0xe0, 0x1a, 0x64, 0xbb, 0x90, 0xac, 0xb3, 0x71, + 0xf8, 0xab, 0xc9, 0x7c, 0x27, 0x91, 0x6f, 0xc9, + 0xae, 0x21, 0x69, 0x79, 0x72, 0x4c, 0x99, 0xc8, + 0x89, 0xcb, 0x64, 0xcc, 0x61, 0xbf, 0xa1, 0x72, + 0x0e, 0x9f, 0x02, 0x86, 0x6f, 0x72, 0x59, 0x63, + 0x8e, 0xbd, 0x0a, 0x76, 0xe1, 0x62, 0x20, 0xbe, + 0x08, 0xa7, 0xad, 0x41, 0xa0, 0x8c, 0xff, 0x45, + 0x3f, 0x84, 0x40, 0x37, 0xe8, 0x50, 0x03, 0xae, + 0x10, 0x85, 0x26, 0xc3, 0x5a, 0x05, 0x20, 0x16, + 0xea, 0x59, 0x91, 0xda, 0xb2, 0x9d, 0x71, 0x43, + 0x53, 0xc9, 0xe8, 0xd9, 0x3b, 0xcf, 0xd9, 0xa3, + 0x60, 0xd8, 0xe0, 0x06, 0x5c, 0x9e, 0x20, 0x03, + 0x06, 0x49, 0x33, 0x3d, 0x5a, 0x07, 0x83, 0x29, + 0xc5, 0xb3, 0x90, 0xbf, 0xf9, 0x92, 0xba, 0x0a, + 0x7d, 0x16, 0x49, 0x67, 0x22, 0x25, 0xff, 0xf5, + 0x85, 0xa5, 0xd1, 0x78, 0xbe, 0x2a, 0x50, 0xcb, + 0xa8, 0x9f, 0x2c, 0x86, 0x44, 0x77, 0xf0, 0x67, + 0x1a, 0x00, 0xe6, 0xd0, 0x0d, 0x0a, 0x95, 0x6d, + 0x23, 0xcb, 0x69, 0xb2, 0xb5, 0xfa, 0x4c, 0xa7, + 0xa4, 0xaf, 0x30, 0x64, 0x1d, 0xa8, 0x02, 0xf9, + 0xd8, 0x18, 0x6d, 0xb8, 0x05, 0x8f, 0x6b, 0xf5, + 0xe9, 0x4f, 0x30, 0x76, 0x61, 0x2d, 0x20, 0x35, + 0x4a, 0x40, 0xfb, 0xca, 0x1d, 0xc5, 0x30, 0x44, + 0x5f, 0x3e, 0x6e, 0x0b, 0x2f, 0x47, 0x97, 0x65, + 0x4f, 0xa9, 0x67, 0x5e, 0x19, 0x41, 0x6e, 0xc3, + 0x62, 0xbe, 0x3e, 0x6f, 0x70, 0x07, 0xff, 0xe5, + 0x81, 0x0d, 0x62, 0x83, 0x02, 0x37, 0x57, 0x12, + 0xdc, 0x1c, 0x83, 0x07, 0xac, 0x8d, 0x7d, 0x88, + 0xfe, 0xbd, 0xee, 0xaf, 0x52, 0xd3, 0x77, 0xdc, + 0x88, 0x9a, 0x9b, 0x45, 0xa8, 0xe2, 0x61, 0x4e, + 0x71, 0xc2, 0xd1, 0xc8, 0x3a, 0xa5, 0x6c, 0x1b, + 0x23, 0x98, 0x04, 0xd0, 0x16, 0x54, 0xd4, 0xd5, + 0x96, 0x99, 0xee, 0x3b, 0xb4, 0xd2, 0xa1, 0x34, + 0x4f, 0xca, 0x9d, 0xc3, 0xf9, 0x38, 0x3b, 0x07, + 0x2d, 0x5c, 0x31, 0x33, 0x0c, 0xa6, 0x20, 0x59, + 0x1c, 0x7a, 0xe1, 0xe3, 0x7e, 0xe7, 0x2d, 0x24, + 0x01, 0xee, 0x69, 0x94, 0xd0, 0x6b, 0x2c, 0x0f, + 0x29, 0x87, 0xd4, 0xf1, 0x6f, 0x4c, 0x6c, 0xfc, + 0x66, 0xb1, 0x50, 0x37, 0x6c, 0x32, 0xff, 0xf3, + 0xe7, 0x41, 0xf1, 0x35, 0x0f, 0xb7, 0x64, 0x83, + 0x14, 0x7e, 0x20, 0xec, 0x88, 0xf7, 0x02, 0x81, + 0x80, 0x44, 0x34, 0xcc, 0x5b, 0x09, 0x9a, 0xf5, + 0x48, 0xa3, 0xd3, 0x35, 0x0b, 0xf8, 0xc0, 0x70, + 0xe5, 0xf2, 0x20, 0xf8, 0x0f, 0x05, 0x9b, 0x5e, + 0xe1, 0xc8, 0x9f, 0x60, 0x1c, 0x5b, 0xe6, 0x24, + 0xc2, 0xdb, 0x6b, 0x8a, 0x1d, 0xea, 0x50, 0x67, + 0x8b, 0x4f, 0x45, 0x61, 0xd7, 0x8e, 0x3a, 0x1a, + 0xe8, 0xa9, 0x6b, 0x00, 0xf4, 0x86, 0x4b, 0xa8, + 0x2d, 0x04, 0xd5, 0xab, 0xf7, 0xee, 0x8b, 0xc4, + 0x46, 0x16, 0x97, 0xaa, 0x85, 0x61, 0x91, 0x73, + 0xd7, 0x28, 0x78, 0xbc, 0xec, 0x26, 0xe0, 0x50, + 0x3d, 0x92, 0x6d, 0x3b, 0x05, 0x6a, 0x68, 0x10, + 0xe0, 0x59, 0x8d, 0xca, 0x19, 0xee, 0xf3, 0x26, + 0xf8, 0x3d, 0xee, 0xb7, 0xf8, 0xca, 0x2a, 0xd4, + 0x05, 0x49, 0x43, 0x89, 0x75, 0x12, 0x55, 0x1d, + 0x83, 0xeb, 0xfe, 0x5e, 0x84, 0x11, 0xf3, 0x05, + 0x20, 0xc2, 0x4e, 0x22, 0x9f, 0xe6, 0xe4, 0x02, + 0xc7, 0x5f, 0x1e, 0xe7, 0x88, 0x69, 0xf2, 0x84, + 0x74, 0x38, 0xf4, 0xbb, 0xa3, 0x83, 0xe6, 0x2f, + 0xe5, 0x97, 0x65, 0xe9, 0x04, 0xd4, 0xb4, 0xeb, + 0x77, 0x77, 0x58, 0xe6, 0xea, 0x40, 0x0e, 0x8a, + 0x33, 0x25, 0x73, 0x8d, 0x19, 0x3c, 0x3f, 0xb3, + 0xbe, 0xd1, 0xcb, 0xc4, 0xb6, 0x53, 0x20, 0x34, + 0x27, 0xff, 0xfa, 0x28, 0x66, 0x21, 0x1c, 0xe1, + 0xc1, 0x7d, 0xf3, 0xcc, 0xf0, 0x3c, 0xb6, 0x85, + 0x0c, 0x7a, 0x2e, 0x62, 0x3d, 0xf7, 0x12, 0xd1, + 0x45, 0x61, 0xd8, 0x4e, 0x07, 0x01, 0x39, 0xec, + 0xa2, 0x5b, 0x62, 0xac, 0xd2, 0x97, 0x70, 0x30, + 0xbb, 0xd8, 0x7a, 0xf0, 0xcf, 0xa7, 0x46, 0x0e, + 0xc5, 0x6f, 0xf3, 0x48, 0x29, 0xf0, 0xe4, 0xa6, + 0x5f, 0x4a, 0x4e, 0xa8, 0xcd, 0xaf, 0xff, 0xdb, + 0x6c, 0x41, 0xf0, 0x92, 0x70, 0x0e, 0xe8, 0x7d, + 0xc1, 0x22, 0x41, 0x3e, 0x9f, 0xb2, 0xc2, 0x20, + 0x3b, 0xce, 0x63, 0x15, 0xe3, 0x7a, 0xba, 0x42, + 0x08, 0xba, 0x43, 0x08, 0xb8, 0x60, 0x43, 0x08, + 0xa1, 0x00, 0x05, 0x1e, 0xf8, 0x80, 0xf7, 0xa3, + 0x10, 0xf1, 0x93, 0xb0, 0xd7, 0x6b, 0x2f, 0x56, + 0x61, 0x3f, 0x93, 0x90, 0xbb, 0x9e, 0x43, 0x08, + 0x46, 0xb8, 0xac, 0x13, 0xb3, 0x07, 0xc1, 0xc3, + 0x81, 0xbf, 0x61, 0x03, 0xa1, 0xa0, 0x40, 0x61, + 0xa8, 0x3c, 0xff, 0x23, 0x92, 0xfb, 0x81, 0xab, + 0x00, 0xfc, 0x04, 0x9e, 0x6b, 0x8e, 0x10, 0x94, + 0x3f, 0x7e, 0x69, 0x2e, 0xa2, 0xf8, 0x09, 0xb0, + 0x19, 0xc1, 0x15, 0xb8, 0x36, 0x70, 0x22, 0x81, + 0xdd, 0x42, 0xc1, 0x30, 0xaa, 0x19, 0xfd, 0xbb, + 0xc0, 0x58, 0x58, 0x99, 0xd2, 0x13, 0xa7, 0x1d, + 0x18, 0x41, 0x27, 0xe0, 0x41, 0x74, 0x91, 0x87, + 0xeb, 0x2b, 0xa8, 0x5d, 0x28, 0x1d, 0x07, 0x8b, + 0x03, 0x03, 0x98, 0x3c, 0x09, 0x04, 0xaf, 0x02, + 0xf4, 0xa3, 0x57, 0x61, 0xc1, 0x9a, 0xea, 0x00, + 0x17, 0x24, 0xbe, 0xab, 0xda, 0xc0, 0xec, 0x28, + 0xa2, 0xf7, 0xb8, 0xa5, 0xf9, 0x4a, 0x81, 0x31, + 0x2b, 0x08, 0x84, 0x68, 0xb4, 0x03, 0x4b, 0x0c, + 0x2a, 0x44, 0x31, 0xfd, 0x7b, 0x39, 0x30, 0xab, + 0x3d, 0x2f, 0xc9, 0x00, 0x22, 0x24, 0xa4, 0x87, + 0x72, 0x27, 0xca, 0x50, 0xc0, 0x08, 0xc9, 0x82, + 0xc1, 0x31, 0x99, 0x03, 0xec, 0x36, 0x83, 0x4b, + 0xad, 0x7d, 0x28, 0x82, 0x55, 0xa2, 0x23, 0x5b, + 0x8b, 0x8c, 0xf3, 0xe3, 0x3e, 0x39, 0xc8, 0xc2, + 0x2a, 0xd8, 0x90, 0x8e, 0x88, 0x89, 0x9d, 0xb8, + 0x85, 0x05, 0x03, 0x9b, 0x86, 0x83, 0xbd, 0xb4, + 0x18, 0xb2, 0x0a, 0x22, 0x34, 0xa0, 0x08, 0xb9, + 0x0c, 0x50, 0x00, 0x03, 0x98, 0xc0, 0xff, 0xc6, + 0xaa, 0x0b, 0xfd, 0xe3, 0xbb, 0xd3, 0x01, 0x9c, + 0xfa, 0xf0, 0xb8, 0x65, 0xc8, 0x2a, 0x3a, 0x04, + 0xa5, 0x53, 0x38, 0x0d, 0x4f, 0xd3, 0x81, 0x39, + 0x1c, 0xa1, 0x37, 0x42, 0x84, 0x2a, 0xe9, 0xa6, + 0xa3, 0xe1, 0x29, 0xa8, 0x48, 0xbb, 0x45, 0x3c, + 0x87, 0x52, 0x1c, 0x34, 0xf5, 0xd2, 0xbe, 0x75, + 0x3a, 0xa0, 0x95, 0x60, 0x09, 0x26, 0xfc, 0xaf, + 0x61, 0x12, 0x1c, 0xe3, 0x8b, 0x01, 0x1c, 0x64, + 0x43, 0x17, 0xb9, 0xa0, 0x65, 0x6c, 0x93, 0x18, + 0x11, 0x26, 0x67, 0xbc, 0x43, 0xba, 0xd1, 0xba, + 0x15, 0xe2, 0xc2, 0x5d, 0xa9, 0x86, 0x30, 0x84, + 0x3f, 0xd8, 0x03, 0x04, 0x74, 0x63, 0x44, 0x04, + 0x94, 0x46, 0xf1, 0x10, 0xb3, 0x19, 0xcc, 0x8f, + 0xff, 0xc2, 0x37, 0xac, 0x8a, 0xb4, 0x84, 0xcb, + 0x0c, 0x06, 0xf4, 0x8b, 0x23, 0xa4, 0x1a, 0xe8, + 0x63, 0xc7, 0x8c, 0x43, 0x06, 0x6f, 0xec, 0x41, + 0x23, 0x48, 0x05, 0xe6, 0x2a, 0xaf, 0xfd, 0x02, + 0x84, 0x74, 0x1c, 0x45, 0xac, 0x0a, 0x05, 0x8c, + 0x93, 0x47, 0x85, 0x90, 0x31, 0x55, 0xcc, 0xa6, + 0xfb, 0xfa, 0x93, 0x57, 0x81, 0xbc, 0x70, 0xd4, + 0x22, 0xba, 0xc1, 0x20, 0x70, 0xc2, 0x9c, 0x7e, + 0x64, 0x08, 0x37, 0xdc, 0x91, 0xcc, 0xb8, 0x28, + 0xb8, 0xc9, 0xa6, 0x09, 0x48, 0x42, 0x51, 0x43, + 0x17, 0xb2, 0x0a, 0x41, 0x99, 0x81, 0xbc, 0x38, + 0x44, 0xb1, 0x71, 0x54, 0x48, 0x32, 0xf0, 0x23, + 0x90, 0x3c, 0x04, 0x89, 0x84, 0x9f, 0xa4, 0xf2, + 0x93, 0x67, 0x1a, 0xa1, 0x30, 0x80, 0x2e, 0x94, + 0x00, 0x10, 0xa8, 0xca, 0x31, 0x93, 0x04, 0xaf, + 0x41, 0xd8, 0xc4, 0xcc, 0x19, 0x28, 0x0f, 0x34, + 0x17, 0x9a, 0xec, 0x3f, 0x88, 0xf9, 0xa1, 0xcb, + 0xba, 0x0c, 0x93, 0x9a, 0xb7, 0xce, 0xa2, 0xab, + 0x7a, 0x4c, 0x81, 0xda, 0x18, 0x49, 0xff, 0x92, + 0xe4, 0x88, 0x74, 0x34, 0xc0, 0xa4, 0x9c, 0x3f, + 0x04, 0x24, 0x10, 0x05, 0x11, 0x03, 0x04, 0x53, + 0xb3, 0xc5, 0x6b, 0x1b, 0xb5, 0x32, 0xca, 0xc1, + 0xa8, 0x1c, 0xa7, 0x94, 0xbe, 0x52, 0x63, 0xca, + 0xa6, 0xcc, 0xb3, 0x34, 0x89, 0x84, 0x6b, 0x04, + 0xb1, 0x2d, 0xdc, 0x09, 0xb6, 0xe1, 0x49, 0x9c, + 0xcb, 0xc4, 0x33, 0x04, 0x2c, 0xe3, 0xea, 0xc9, + 0x9e, 0x18, 0xb2, 0xba, 0xf2, 0xb6, 0xf0, 0x49, + 0xcb, 0x74, 0x10, 0xcb, 0xa4, 0x51, 0xc5, 0x16, + 0xc0, 0xa9, 0x48, 0xcc, 0x28, 0xf5, 0x9b, 0x3e, + 0x7a, 0x6c, 0xc2, 0x30, 0x4a, 0xbe, 0x13, 0x1a, + 0x8a, 0x1a, 0x60, 0x2e, 0xbf, 0x9a, 0x4b, 0x9a, + 0xf8, 0xca, 0x1d, 0xe1, 0x0c, 0x48, 0xcc, 0xc0, + 0xd4, 0xe2, 0x34, 0x77, 0xd4, 0x92, 0xba, 0xc4, + 0x3e, 0x13, 0x23, 0xc7, 0x41, 0x2b, 0x41, 0x07, + 0x4a, 0x4a, 0x4a, 0x50, 0x2e, 0xce, 0x92, 0x38, + 0xae, 0x9c, 0xbb, 0xa7, 0xc4, 0x09, 0x08, 0xfc, + 0x87, 0x0f, 0x8a, 0x15, 0x1e, 0xa4, 0xcc, 0x67, + 0x8b, 0x33, 0x40, 0x00, 0x4d, 0x70, 0x0a, 0xcc, + 0x70, 0x10, 0x2f, 0xda, 0x52, 0x80, 0x5b, 0xec, + 0x23, 0x1d, 0xf4, 0x0e, 0x93, 0x02, 0xcc, 0x25, + 0xe8, 0x8f, 0x5e, 0xe1, 0xb4, 0xa4, 0xa4, 0x01, + 0x02, 0xe1, 0x0c, 0x44, 0x0c, 0x32, 0x8c, 0xb8, + 0xa3, 0xc3, 0x88, 0xcd, 0x1c, 0x8c, 0xc6, 0xd8, + 0xe2, 0x0c, 0xec, 0xea, 0x82, 0x98, 0xbc, 0x4c, + 0x51, 0x7b, 0xaf, 0x91, 0xe1, 0x09, 0xbc, 0x53, + 0x2b, 0xbf, 0x69, 0x9a, 0xac, 0xe4, 0xa1, 0xb6, + 0xa1, 0xb3, 0x2c, 0x88, 0xb6, 0x7c, 0x9c, 0x14, + 0xc9, 0x48, 0xa0, 0x70, 0xb9, 0xc4, 0x5c, 0x78, + 0x87, 0x71, 0xf0, 0x00, 0x9e, 0xcb, 0x4c, 0x57, + 0x23, 0x34, 0xdc, 0xc3, 0x4e, 0x40, 0x3b, 0x13, + 0x96, 0x48, 0x4c, 0x26, 0x44, 0xc7, 0xff, 0x7b, + 0x6b, 0x20, 0xc6, 0x23, 0xad, 0x62, 0xc8, 0xc8, + 0x62, 0xfb, 0x0b, 0x8e, 0x6c, 0x4d, 0xb8, 0xc0, + 0x8c, 0xf6, 0x8c, 0x9c, 0x64, 0x33, 0x2b, 0x97, + 0x01, 0x11, 0x89, 0x04, 0xb2, 0xc8, 0x40, 0x45, + 0x8b, 0x04, 0xce, 0x71, 0x71, 0x26, 0x9d, 0xeb, + 0x4f, 0x0c, 0x00, 0x23, 0x00, 0x2d, 0x98, 0xa6, + 0x32, 0x14, 0x17, 0xf0, 0x03, 0x3f, 0xa0, 0x2f, + 0x2b, 0xb4, 0x2f, 0x96, 0xd3, 0x8f, 0x04, 0x25, + 0x39, 0xf1, 0x62, 0x2e, 0x71, 0x70, 0x04, 0x18, + 0x18, 0x4c, 0x90, 0xe8, 0x81, 0x07, 0x95, 0x50, + 0x7a, 0x0a, 0xc2, 0x58, 0x1b, 0x03, 0x6d, 0x62, + 0x00, 0x05, 0x10, 0x80, 0xfe, 0x40, 0x4b, 0xbf, + 0x91, 0xb1, 0x9e, 0x10, 0x1f, 0x14, 0xb5, 0x18, + 0x71, 0x5c, 0x2b, 0x88, 0x1c, 0x0a, 0x73, 0x58, + 0xbb, 0x36, 0x88, 0x4a, 0xed, 0x92, 0x0f, 0xaa, + 0x29, 0x51, 0x79, 0x41, 0xbf, 0xe4, 0xa9, 0xa5, + 0xc5, 0x7c, 0xcf, 0xdb, 0x7c, 0x83, 0x5b, 0x89, + 0xce, 0x6d, 0x5c, 0xa3, 0x21, 0x9d, 0x92, 0x1a, + 0xfd, 0x88, 0xd4, 0x24, 0xcc, 0xef, 0x29, 0x30, + 0x2b, 0xb5, 0x8c, 0xf6, 0x83, 0x8f, 0x62, 0x60, + 0x03, 0xff, 0x91, 0x22, 0xdf, 0xab, 0xba, 0x22, + 0x3d, 0x07, 0xaf, 0xd0, 0x52, 0x09, 0x35, 0xd2, + 0xce, 0x38, 0xd0, 0x98, 0xe1, 0xd2, 0x51, 0x10, + 0x21, 0x69, 0x53, 0x3c, 0x31, 0x95, 0x0b, 0x2a, + 0x25, 0x95, 0xfb, 0x8a, 0x15, 0x25, 0x55, 0x28, + 0x1c, 0x65, 0xd2, 0x41, 0xc1, 0xd3, 0x33, 0x69, + 0x53, 0xb2, 0x70, 0x03, 0x7a, 0x89, 0x95, 0x7d, + 0x20, 0x4d, 0x57, 0x2c, 0x3f, 0x32, 0x55, 0x29, + 0x1c, 0x31, 0x53, 0xe1, 0xb4, 0xbd, 0xe3, 0x38, + 0x8f, 0x88, 0xf0, 0x94, 0xf0, 0xf0, 0x51, 0x3e, + 0x19, 0x3e, 0xaf, 0x8a, 0x4d, 0x05, 0xe0, 0x34, + 0x56, 0x8a, 0x44, 0xc0, 0x89, 0x88, 0xff, 0xef, + 0x92, 0x50, 0x46, 0xed, 0xa2, 0x9d, 0x1b, 0x99, + 0x3e, 0xbd, 0x83, 0x49, 0x85, 0x03, 0x82, 0x84, + 0x0e, 0xe6, 0x82, 0x44, 0xf4, 0x20, 0x05, 0x44, + 0x85, 0x52, 0x34, 0x75, 0xcf, 0xba, 0xe8, 0x0d, + 0x42, 0xf5, 0x0d, 0x76, 0xd8, 0x0f, 0x53, 0x6d, + 0xd2, 0x81, 0x1a, 0x89, 0x11, 0xf0, 0xcc, 0xcb, + 0xe3, 0xa2, 0x56, 0x7d, 0x15, 0x3d, 0xd5, 0x4c, + 0x7c, 0x19, 0x09, 0xe5, 0xa2, 0x2d, 0xf4, 0x71, + 0x11, 0x47, 0x81, 0xab, 0x9c, 0xcb, 0x80, 0xba, + 0x32, 0x53, 0xbe, 0x28, 0x88, 0xdc, 0x84, 0x55, + 0x65, 0xeb, 0x51, 0x0a, 0x33, 0x56, 0x55, 0x48, + 0xd6, 0x3f, 0x3d, 0x1d, 0x35, 0xa9, 0x14, 0x86, + 0x7c, 0xce, 0x47, 0x58, 0xd0, 0x3c, 0x10, 0xd6, + 0x48, 0xda, 0xcc, 0x62, 0x35, 0xd6, 0xe5, 0x4a, + 0x43, 0xe7, 0xd2, 0x56, 0x64, 0x60, 0xa7, 0x47, + 0x8a, 0x3e, 0xae, 0xc0, 0x4a, 0x2d, 0x98, 0xd6, + 0xdf, 0x89, 0x9f, 0x41, 0x38, 0x80, 0x02, 0xa0, + 0x2d, 0x7c, 0xb5, 0x01, 0x94, 0xdc, 0x84, 0xe7, + 0xb2, 0x40, 0xe1, 0xc2, 0xb0, 0x67, 0x70, 0x47, + 0x74, 0x5c, 0xcb, 0x79, 0x55, 0x0d, 0xa5, 0xb3, + 0x82, 0x87, 0x80, 0xa2, 0x73, 0x25, 0xb2, 0xbd, + 0xcb, 0x3c, 0xb8, 0xd2, 0x3c, 0x67, 0x1a, 0xd1, + 0xcf, 0x2a, 0xd4, 0x88, 0x94, 0xd6, 0x6a, 0x30, + 0x58, 0xac, 0x3a, 0x41, 0xae, 0x48, 0xd8, 0x26, + 0x1b, 0x89, 0x7d, 0xc0, 0xc7, 0xbc, 0x2c, 0xc7, + 0x3d, 0xb1, 0x8c, 0x6f, 0x4d, 0x91, 0x51, 0xeb, + 0x13, 0x17, 0x33, 0xc4, 0x74, 0xe8, 0x99, 0x8d, + 0x19, 0x57, 0xd8, 0xaa, 0xd0, 0xca, 0x13, 0x99, + 0x01, 0xbd, 0x02, 0x88, 0x68, 0x36, 0x0e, 0x65, + 0x88, 0x87, 0x1d, 0x40, 0x91, 0xd5, 0x1f, 0xe7, + 0x5c, 0x80, 0xd9, 0xa2, 0x4d, 0xbc, 0xcc, 0x0b, + 0x52, 0x35, 0xd8, 0x4e, 0x31, 0xab, 0xff, 0x1f, + 0xb0, 0x50, 0xa4, 0x45, 0x5a, 0xc1, 0xb9, 0x02, + 0x52, 0xad, 0x13, 0x73, 0xd8, 0xbe, 0x75, 0xbb, + 0x87, 0x93, 0x58, 0x1c, 0xd7, 0x59, 0xae, 0xa0, + 0xf5, 0x1a, 0x33, 0x85, 0xb4, 0x97, 0xcd, 0xd8, + 0xf6, 0x72, 0x8d, 0x75, 0xa9, 0xb8, 0xc3, 0xba, + 0x07, 0x9d, 0x94, 0x26, 0x32, 0x98, 0x2d, 0xaf, + 0x70, 0x55, 0x0f, 0x2b, 0x58, 0x99, 0x58, 0xd4, + 0xae, 0x1d, 0x16, 0x0d, 0x5d, 0x34, 0x7a, 0xa5, + 0xbb, 0x92, 0x9d, 0xda, 0x28, 0xc3, 0xa6, 0x3f, + 0x03, 0xd6, 0x3a, 0xf5, 0x99, 0xc5, 0x20, 0x90, + 0x7e, 0x72, 0x5b, 0x17, 0xe1, 0xc7, 0x82, 0x08, + 0xd4, 0x60, 0x95, 0xa0, 0xdb, 0xf8, 0xb7, 0xbc, + 0xd5, 0xdb, 0x25, 0xca, 0xb1, 0x9d, 0x01, 0xd5, + 0xbf, 0xf5, 0x26, 0xae, 0x10, 0x5c, 0x92, 0xa5, + 0x5b, 0x81, 0x0c, 0x99, 0x84, 0xa3, 0x53, 0xd9, + 0xe8, 0xdb, 0x5f, 0x6c, 0x59, 0xc7, 0xdd, 0x0f, + 0xb8, 0xb5, 0x09, 0xc6, 0x2c, 0x35, 0xc2, 0x6d, + 0x94, 0xfa, 0x8b, 0x3a, 0xc4, 0x65, 0x94, 0xbe, + 0x4d, 0x0a, 0xce, 0xa5, 0x10, 0x2e, 0x1a, 0xc0, + 0xd6, 0x58, 0x51, 0x11, 0x10, 0x59, 0x08, 0xf2, + 0xdc, 0x29, 0xad, 0x58, 0x39, 0x38, 0x0c, 0xac, + 0x55, 0xdd, 0x70, 0xf8, 0x97, 0xd9, 0x2d, 0xc2, + 0xd5, 0xc2, 0xaa, 0xc2, 0x6d, 0x1d, 0x94, 0xec, + 0x0a, 0x7e, 0x15, 0xcd, 0xdc, 0xd5, 0x51, 0x2d, + 0xdc, 0x52, 0xc9, 0xb5, 0x0c, 0xe0, 0xb5, 0x2f, + 0x57, 0x0a, 0x3a, 0xa8, 0x6a, 0x5c, 0xe3, 0xbd, + 0x2d, 0x4d, 0x89, 0x5e, 0xa4, 0xba, 0x39, 0x78, + 0x1d, 0xdd, 0xe0, 0xed, 0x05, 0x63, 0x24, 0x15, + 0xe9, 0x0d, 0x13, 0xee, 0x70, 0x01, 0x8e, 0x5d, + 0x57, 0x37, 0xcd, 0xde, 0xe6, 0xfd, 0x85, 0x99, + 0xf4, 0x5e, 0xd8, 0x2a, 0x11, 0x60, 0x59, 0x17, + 0x1e, 0x45, 0xa5, 0xce, 0x08, 0x36, 0xff, 0x09, + 0x1c, 0x5e, 0x4a, 0x4d, 0x5f, 0x31, 0x49, 0x88, + 0xea, 0xb5, 0x5e, 0xb8, 0xa0, 0xc9, 0x97, 0x94, + 0xd8, 0x58, 0x25, 0x87, 0x61, 0x0a, 0xce, 0x89, + 0xaa, 0xdf, 0xd8, 0x49, 0x09, 0xde, 0xcd, 0x32, + 0xe5, 0x8d, 0x03, 0x66, 0xa5, 0x9a, 0x06, 0x51, + 0xc8, 0xf9, 0x65, 0x5b, 0x0e, 0x1b, 0xe0, 0x91, + 0x12, 0xaf, 0xb4, 0xc5, 0xab, 0xeb, 0x85, 0x57, + 0xea, 0xd5, 0x1f, 0xa2, 0x75, 0xb8, 0x9f, 0x3d, + 0x00, 0xcc, 0x8b, 0xe0, 0x64, 0x85, 0x8e, 0xe5, + 0xa2, 0x49, 0x38, 0x61, 0xca, 0x4a, 0x6d, 0x50, + 0x1d, 0xb1, 0x0a, 0xfe, 0x52, 0xd5, 0xcf, 0x61, + 0x86, 0x0f, 0xd6, 0x41, 0x15, 0x4e, 0xd7, 0x2e, + 0x19, 0x3f, 0x8f, 0xac, 0x37, 0xbd, 0xc2, 0x17, + 0xf1, 0x72, 0x81, 0xd3, 0xcc, 0xbb, 0x39, 0x04, + 0x2b, 0x17, 0x56, 0x88, 0xbd, 0x9a, 0x26, 0x56, + 0x78, 0xdd, 0xfa, 0x42, 0x60, 0x32, 0x11, 0x14, + 0x6d, 0x84, 0x1c, 0xd7, 0x34, 0x42, 0x1f, 0x50, + 0x80, 0x57, 0x6b, 0xe2, 0x58, 0x88, 0x61, 0x1f, + 0x36, 0xbb, 0xb5, 0xdd, 0x11, 0x6e, 0xf4, 0x5d, + 0x19, 0xc6, 0x36, 0xe2, 0x55, 0xe0, 0x0c, 0xb0, + 0x41, 0xae, 0xcd, 0x80, 0x02, 0x08, 0x83, 0xaf, + 0x60, 0x00, 0x01, 0xc0, 0xd4, 0xee, 0x7a, 0x4c, + 0x29, 0x4e, 0x03, 0x10, 0x35, 0x83, 0x1d, 0xd9, + 0x58, 0x1b, 0xae, 0x92, 0x89, 0x4d, 0x9b, 0x7c, + 0x12, 0x07, 0x1b, 0x44, 0x12, 0x5b, 0x51, 0x00, + 0x30, 0x76, 0xc9, 0xaf, 0x80, 0x21, 0x10, 0xb8, + 0x4e, 0x34, 0x3e, 0xca, 0xfe, 0xda, 0xd7, 0x9a, + 0xd2, 0x8f, 0xce, 0x29, 0x99, 0xc5, 0xd4, 0xbb, + 0x8f, 0xfb, 0xa0, 0x33, 0xbd, 0x9f, 0x7d, 0xc8, + 0xbc, 0x95, 0xf2, 0xe3, 0x0f, 0x49, 0xae, 0x6b, + 0x5d, 0x5f, 0x2b, 0xfe, 0xb9, 0x68, 0xda, 0x85, + 0xba, 0xe4, 0xdf, 0xfe, 0xed, 0x42, 0xff, 0x48, + 0xa9, 0x18, 0xe2, 0x7a, 0x64, 0x32, 0xa8, 0x01, + 0x7c, 0x45, 0x57, 0xf1, 0xd3, 0xb5, 0x8b, 0x89, + 0x54, 0x52, 0xd9, 0x62, 0x62, 0x59, 0x09, 0x45, + 0x6e, 0x9b, 0x4f, 0x96, 0x0d, 0xc3, 0xdc, 0x2c, + 0xef, 0x94, 0x0d, 0x5f, 0x81, 0x93, 0x35, 0x2d, + 0xd5, 0xaa, 0xb1, 0x65, 0xfd, 0x75, 0x65, 0x09, + 0xc3, 0xc1, 0x08, 0xfd, 0x05, 0xb6, 0x19, 0x35, + 0x3c, 0xcd, 0x64, 0x45, 0x80, 0x23, 0x2f, 0xde, + 0xe5, 0x15, 0xd9, 0xaf, 0x46, 0x96, 0x0f, 0x3c, + 0x95, 0x63, 0x67, 0xf2, 0x11, 0x0d, 0x3e, 0x66, + 0xff, 0x33, 0xcf, 0xa5, 0xec, 0x2c, 0x53, 0x63, + 0x06, 0x59, 0x49, 0xcf, 0x68, 0x2e, 0x5a, 0x22, + 0xb4, 0xd5, 0x4d, 0x48, 0x65, 0x60, 0xca, 0x10, + 0x6d, 0x9e, 0x1d, 0x63, 0x66, 0xa0, 0x43, 0x09, + 0x0e, 0x4f, 0xb0, 0xe6, 0x50, 0x2a, 0x11, 0x56, + 0x16, 0x67, 0xd5, 0x60, 0x67, 0xc8, 0x9d, 0x01, + 0xb4, 0x55, 0x97, 0x5c, 0x3e, 0x5d, 0x66, 0xca, + 0xc8, 0x21, 0x6e, 0x67, 0x87, 0x0c, 0x45, 0xab, + 0x7b, 0x4b, 0x94, 0x01, 0xd9, 0x7d, 0x65, 0xb9, + 0x74, 0x9e, 0x53, 0x99, 0x22, 0xe7, 0x7c, 0x0e, + 0x05, 0xe2, 0x45, 0x86, 0x59, 0x02, 0xbc, 0xfe, + 0x8a, 0x0e, 0xdc, 0x0d, 0x82, 0xfc, 0xc4, 0x89, + 0x75, 0x2e, 0xe8, 0xfa, 0xdc, 0xe5, 0xa8, 0xdd, + 0xbf, 0xe7, 0xc0, 0x0c, 0x9b, 0x8d, 0x64, 0xf2, + 0x42, 0xe8, 0x3b, 0x04, 0x57, 0x93, 0x9a, 0x68, + 0x7e, 0x09, 0x69, 0x3a, 0xc2, 0xdf, 0x75, 0xb8, + 0x88, 0x23, 0x62, 0xb8, 0x18, 0xfa, 0xd2, 0xfe, + 0xf1, 0x2c, 0xfb, 0x11, 0x68, 0xed, 0x31, 0xe8, + 0xb2, 0xb3, 0xc9, 0x1e, 0x00, 0x1f, 0xe2, 0x5c, + 0x87, 0x73, 0xf6, 0x12, 0x7c, 0x96, 0xa1, 0x87, + 0xcc, 0xc8, 0x36, 0x8e, 0x69, 0x8b, 0x7b, 0x8e, + 0x9d, 0x8b, 0x30, 0x2b, 0xa8, 0xd9, 0xff, 0x0f, + 0x31, 0xc9, 0x8b, 0x74, 0xab, 0x6f, 0x19, 0xe9, + 0x57, 0xfc, 0xe9, 0x4e, 0x10, 0xac, 0xf3, 0x09, + 0x9a, 0xa3, 0x75, 0xbe, 0x2e, 0x5b, 0x5e, 0xfb, + 0x69, 0x66, 0xaf, 0x22, 0x9c, 0xa5, 0xde, 0x66, + 0x03, 0x59, 0x0f, 0x2b, 0xeb, 0xae, 0x98, 0x4d, + 0x87, 0x80, 0x53, 0x34, 0x3f, 0x92, 0x95, 0x92, + 0x86, 0xcb, 0xa6, 0x3e, 0x5f, 0xf5, 0x00, 0xb9, + 0x8b, 0x7a, 0x4d, 0xba, 0x34, 0x16, 0x88, 0xde, + 0x69, 0x91, 0xdb, 0x1c, 0xb3, 0x46, 0x6b, 0x15, + 0x68, 0x9c, 0x2c, 0x1a, 0x86, 0x72, 0x1b, 0xa3, + 0x5a, 0x7b, 0x13, 0xe4, 0xd1, 0x6a, 0xce, 0x9d, + 0xe9, 0xfe, 0x91, 0x65, 0x60, 0xa8, 0x2a, 0xad, + 0x12, 0x4c, 0x16, 0x86, 0x14, 0xbe, 0xfb, 0x6b, + 0xd5, 0xf5, 0x00, 0x6b, 0xeb, 0xe3, 0xbc, 0x7e, + 0x93, 0xcb, 0x5d, 0x21, 0x88, 0x5e, 0x6c, 0x99, + 0x08, 0xd1, 0x7e, 0xae, 0x6b, 0x21, 0xf3, 0x69, + 0x77, 0x5e, 0x07, 0x21, 0x08, 0x35, 0x70, 0x65, + 0x1e, 0x55, 0x21, 0x80, 0xd9, 0xe2, 0x07, 0xcc, + 0xce, 0xec, 0x62, 0xc2, 0xc1, 0x23, 0xf2, 0x01, + 0xee, 0x61, 0x2a, 0xbf, 0xc5, 0xea, 0x47, 0xb1, + 0xda, 0x77, 0x3e, 0x6d, 0xd7, 0x58, 0x04, 0xd2, + 0xee, 0x9d, 0x9b, 0x3c, 0x0a, 0x0a, 0x06, 0xcf, + 0x05, 0xf0, 0x44, 0xd3, 0xae, 0xe0, 0xd9, 0xf6, + 0x9e, 0x85, 0x3d, 0x57, 0xf2, 0x7a, 0xec, 0xdc, + 0xae, 0xec, 0x51, 0xb0, 0x07, 0x4a, 0x06, 0x6e, + 0xc2, 0xa1, 0x01, 0x86, 0x16, 0xe5, 0x58, 0x36, + 0x59, 0x03, 0x94, 0xa0, 0x20, 0x5a, 0x6d, 0x02, + 0x3d, 0xee, 0xf6, 0x44, 0xd1, 0x5e, 0xbe, 0xd7, + 0x73, 0x5d, 0x0f, 0x42, 0x19, 0x6b, 0xa6, 0x36, + 0xa1, 0x46, 0xb8, 0xee, 0x79, 0x75, 0xca, 0xc6, + 0x06, 0x81, 0x16, 0xb2, 0xed, 0xf5, 0x78, 0x93, + 0x97, 0x5e, 0xee, 0xdc, 0xa5, 0x6b, 0xff, 0xc3, + 0x70, 0x49, 0x6c, 0xa0, 0x91, 0xe8, 0x51, 0xa2, + 0xf8, 0x98, 0x68, 0x0d, 0x6b, 0xef, 0xbd, 0x43, + 0x5a, 0x46, 0x81, 0x4f, 0x31, 0x06, 0xe9, 0xa4, + 0x89, 0xcc, 0xf8, 0x7c, 0x9a, 0x17, 0x3d, 0x00, + 0x61, 0x33, 0xe0, 0xfc, 0x46, 0x1b, 0x17, 0x10, + 0x6f, 0xa6, 0xb2, 0xd0, 0x3d, 0x7e, 0xbd, 0xbb, + 0xc2, 0xaf, 0xf1, 0xce, 0x21, 0xf1, 0xaa, 0x9d, + 0x07, 0xf3, 0x1b, 0x04, 0x7f, 0xa0, 0xa3, 0x1d, + 0xbb, 0x0b, 0xe5, 0xf0, 0x17, 0xd8, 0x63, 0x97, + 0xd9, 0xec, 0x84, 0x93, 0x87, 0x78, 0x71, 0xa0, + 0x0f, 0x28, 0xba, 0x41, 0x89, 0x59, 0x09, 0x3f, + 0xe6, 0x14, 0xaf, 0xd0, 0xb6, 0xe6, 0x8a, 0x5b, + 0x10, 0xd9, 0x90, 0x52, 0x71, 0x0c, 0x7f, 0x71, + 0x97, 0x09, 0x3b, 0x1a, 0xc7, 0xf1, 0x4d, 0xa0, + 0xb3, 0xb3, 0x9c, 0x71, 0x9a, 0xc8, 0xf1, 0xcc, + 0xd9, 0x5c, 0x5c, 0x04, 0xf1, 0x2f, 0x01, 0x6b, + 0x79, 0x62, 0x1f, 0xe5, 0xfe, 0x71, 0x9e, 0xb0, + 0xc9, 0xa3, 0x86, 0x4f, 0x29, 0x81, 0x71, 0x5a, + 0xed, 0xe8, 0x43, 0x7c, 0x88, 0xf7, 0x4e, 0xf2, + 0x52, 0x5d, 0xbb, 0x1d, 0x17, 0xf0, 0x6b, 0x61, + 0x68, 0x1c, 0xaa, 0xf2, 0xcc, 0xe6, 0x3f, 0xa2, + 0xb1, 0xf0, 0x84, 0x25, 0x0d, 0x44, 0x8c, 0xb7, + 0x7f, 0x8e, 0xf1, 0x2e, 0x8f, 0x60, 0x9f, 0x56, + 0x70, 0x87, 0x59, 0xf0, 0x16, 0x07, 0x33, 0x10, + 0xd7, 0x69, 0x34, 0x2f, 0xda, 0x20, 0x85, 0x4b, + 0x68, 0x96, 0x73, 0x14, 0xa4, 0xf2, 0x0b, 0xb9, + 0xf3, 0x3d, 0x87, 0xd7, 0x02, 0x28, 0x00, 0xd9, + 0xe6, 0xf3, 0xe7, 0xbb, 0xae, 0x65, 0xe4, 0xaf, + 0xcd, 0x8a, 0xee, 0x40, 0x1f, 0xe0, 0xee, 0x8c, + 0xf2, 0x58, 0x40, 0x00, 0x37, 0x47, 0xf4, 0x15, + 0xcf, 0xe6, 0xb0, 0xee, 0xf1, 0x47, 0x87, 0x55, + 0x58, 0xa0, 0xf4, 0x4b, 0x9f, 0xd0, 0xff, 0x5f, + 0x08, 0x71, 0x4c, 0x0f, 0xc9, 0x21, 0x97, 0x10, + 0x45, 0x2e, 0x72, 0x4e, 0x0f, 0x32, 0xc1, 0x62, + 0x2e, 0x8e, 0xec, 0x29, 0x51, 0x97, 0xe2, 0xae, + 0x38, 0xa2, 0x70, 0x9c, 0x74, 0x54, 0x4f, 0x56, + 0x96, 0x60, 0xe7, 0x95, 0x88, 0x5b, 0x57, 0xaf, + 0x6b, 0x9b, 0xce, 0x5f, 0xab, 0x34, 0x5f, 0x5a, + 0xaf, 0xeb, 0x7d, 0x69, 0x75, 0x5d, 0x37, 0x5e, + 0x02, 0x30, 0x00, 0x03, 0xa0, 0x67, 0x5f, 0x47, + 0xf0, 0xd5, 0x21, 0x90, 0xe5, 0x02, 0x63, 0xdd, + 0x26, 0xf6, 0x76, 0x1e, 0x81, 0x46, 0x5f, 0xf6, + 0x67, 0x87, 0xf6, 0x68, 0x97, 0xf6, 0x69, 0xa7, + 0xf6, 0x6a, 0xb7, 0xf6, 0x6b, 0xc7, 0xf6, 0x6c, + 0xd7, 0xf6, 0x6d, 0xe7, 0xf6, 0x6e, 0xf7, 0xf6, + 0x6f, 0x07, 0xf7, 0x70, 0x17, 0xf7, 0x71, 0x27, + 0xf7, 0x72, 0x37, 0xf7, 0x73, 0x47, 0xf7, 0x74, + 0x57, 0xf7, 0x75, 0x67, 0xf7, 0x76, 0x77, 0xf7, + 0x77, 0x87, 0xf7, 0x78, 0x97, 0xf7, 0x79, 0xa7, + 0xf7, 0x7a, 0xb7, 0xf7, 0x7b, 0xc7, 0xf7, 0x7c, + 0xd7, 0xf7, 0x7d, 0xe7, 0xf7, 0x7e, 0xf7, 0xf7, + 0x7f, 0x07, 0xf8, 0x80, 0x17, 0xf8, 0x81, 0x27, + 0xf8, 0x82, 0x37, 0xf8, 0x83, 0x47, 0xf8, 0x84, + 0x57, 0xf8, 0x85, 0x67, 0xf8, 0x86, 0x77, 0xf8, + 0x87, 0xdf, 0x73, 0x04, 0x90, 0xf8, 0x89, 0xa7, + 0xf8, 0x8a, 0xb7, 0xf8, 0x0a, 0xa8, 0x78, 0x22, + 0xa0, 0xf8, 0xde, 0x86, 0x78, 0x2d, 0x12, 0x80, + 0x8f, 0x07, 0xf9, 0x90, 0x17, 0x79, 0x91, 0x2f, + 0x80, 0x0a, 0x38, 0x80, 0x90, 0x2f, 0xf9, 0x1c, + 0x38, 0x79, 0x90, 0x3f, 0xf1, 0x8e, 0x47, 0x9e, + 0x91, 0x87, 0x79, 0x98, 0x4f, 0x79, 0x00, 0x58, + 0xf9, 0x8f, 0x3f, 0x80, 0x1c, 0x40, 0x00, 0x91, + 0x6f, 0x79, 0x97, 0xdf, 0x9c, 0xe1, 0x56, 0x2e, + 0x90, 0xf7, 0xf9, 0x03, 0xe0, 0xf8, 0xff, 0x9a, + 0xff, 0xf8, 0x9d, 0xb7, 0x00, 0x03, 0xd0, 0x79, + 0x9e, 0x97, 0x27, 0xa4, 0x17, 0x80, 0x9b, 0x4f, + 0x01, 0xa2, 0x17, 0x80, 0x99, 0x2f, 0x01, 0xa8, + 0x37, 0x7a, 0xa5, 0xa7, 0x1f, 0xa6, 0x77, 0x7a, + 0x13, 0x58, 0xf9, 0xad, 0x4f, 0x81, 0x9c, 0x4f, + 0x7a, 0xab, 0x6f, 0x25, 0xac, 0x97, 0x01, 0x90, + 0xc7, 0xd7, 0x8f, 0xe7, 0xf8, 0x0d, 0x28, 0x00, + 0xb3, 0x67, 0x79, 0xb0, 0x0f, 0x7b, 0x9b, 0x97, + 0x81, 0x95, 0x0f, 0xf6, 0x8f, 0x97, 0x7a, 0x0c, + 0x38, 0x79, 0xa1, 0x5f, 0x7b, 0xb6, 0xa7, 0x23, + 0xb1, 0x7f, 0x7a, 0xb3, 0xf7, 0xfa, 0xac, 0xc7, + 0x00, 0xa6, 0x37, 0x00, 0xaf, 0x17, 0x80, 0xaa, + 0xc7, 0x7b, 0xc2, 0xd1, 0x7b, 0xad, 0x97, 0x7b, + 0x9a, 0x37, 0x7b, 0x0e, 0x48, 0xfb, 0xc1, 0x67, + 0xfa, 0xc1, 0x2f, 0x7c, 0x2d, 0x3a, 0xfc, 0x12, + 0x20, 0x7b, 0x00, 0x68, 0xfc, 0xb9, 0x37, 0xf9, + 0xa6, 0x07, 0x80, 0xc7, 0x27, 0xfc, 0x68, 0x47, + 0xfa, 0xba, 0xaf, 0xfb, 0xa6, 0x0f, 0x7d, 0xda, + 0x6a, 0x7a, 0xd1, 0x2f, 0x7d, 0xd2, 0x07, 0xfd, + 0xd3, 0x1f, 0x7d, 0xcd, 0x3f, 0x7a, 0x9b, 0x5f, + 0xfd, 0xb3, 0x0f, 0xa2, 0xc9, 0xe7, 0x80, 0x95, + 0x2f, 0xf9, 0xbe, 0xdf, 0x00, 0xc0, 0xdf, 0xfc, + 0xbb, 0xd7, 0xf6, 0xc7, 0x8f, 0xf9, 0xde, 0xf7, + 0xfd, 0xdf, 0x8f, 0x38, 0xde, 0x27, 0xf9, 0xb6, + 0x67, 0x7d, 0xc4, 0x8f, 0x7a, 0x0a, 0x80, 0x7b, + 0x0c, 0x68, 0xfc, 0x54, 0xe1, 0x7c, 0x6e, 0x17, + 0xfe, 0xdf, 0x87, 0xfe, 0xe8, 0xbf, 0x80, 0xe7, + 0x07, 0x7a, 0xe2, 0xf7, 0xfb, 0xd9, 0x4f, 0xfc, + 0xdc, 0x3f, 0xfe, 0x0b, 0x70, 0x7b, 0xed, 0x87, + 0xfc, 0x6d, 0xa7, 0xfe, 0xe8, 0x17, 0x7f, 0x98, + 0x9f, 0xfe, 0xde, 0xc7, 0x7c, 0x07, 0x92, 0xfd, + 0x0d, 0x00, 0xf9, 0xde, 0xb6, 0xfd, 0xff, 0xd6, + 0x17, 0x80, 0xde, 0x6e, 0x7e, 0xf0, 0x1f, 0xff, + 0xf9, 0xf7, 0xfd, 0xe0, 0x37, 0x7f, 0xeb, 0x7f, + 0xfb, 0xec, 0x57, 0xfc, 0xf7, 0xb7, 0x00, 0x08, + 0x28, 0x42, 0x20, 0x00, 0xcc, 0xa4, 0x76, 0xf3, + 0xee, 0x3f, 0x18, 0x8a, 0x23, 0x59, 0x9a, 0x27, + 0x9a, 0xaa, 0x2b, 0x8b, 0x62, 0x19, 0x1c, 0xcb, + 0x33, 0x3d, 0x77, 0xef, 0x5c, 0xb4, 0x3b, 0xdf, + 0xdf, 0xd3, 0x81, 0x74, 0x98, 0xe8, 0x2c, 0xaf, + 0xa2, 0x05, 0xb8, 0xc1, 0x55, 0x7c, 0xce, 0x27, + 0x34, 0x2a, 0x9d, 0x42, 0x71, 0xb5, 0x2b, 0x96, + 0xd6, 0x34, 0xd6, 0x90, 0xd4, 0xef, 0xf3, 0x15, + 0x1c, 0x0d, 0x05, 0x48, 0x84, 0x92, 0x2b, 0x30, + 0x2c, 0x33, 0x5b, 0x30, 0x3c, 0x2e, 0x9f, 0xd3, + 0xdb, 0xd9, 0x3b, 0x5e, 0xf0, 0xa3, 0x79, 0xeb, + 0x7e, 0x91, 0x18, 0x49, 0x86, 0x57, 0x19, 0x1b, + 0x40, 0x19, 0x07, 0xd3, 0xdf, 0x22, 0x63, 0xa3, + 0xe3, 0x4d, 0xc1, 0x81, 0xe4, 0x24, 0xa5, 0x64, + 0xe4, 0x95, 0xe5, 0x64, 0xe4, 0xe6, 0xc1, 0x66, + 0x9f, 0x55, 0x8c, 0xe1, 0xa3, 0x63, 0x20, 0x19, + 0x51, 0xe2, 0x29, 0x40, 0xaa, 0x9a, 0xc6, 0xa8, + 0xeb, 0x2b, 0xec, 0x5f, 0x59, 0x4e, 0x0b, 0x02, + 0x82, 0xc1, 0x6d, 0xae, 0x6d, 0xec, 0x62, 0xa9, + 0x48, 0x99, 0x17, 0x9a, 0x40, 0xd0, 0x8b, 0xe8, + 0x85, 0x1b, 0x6f, 0xb2, 0xf2, 0x32, 0xcf, 0xac, + 0x4c, 0x1f, 0x73, 0xb4, 0x87, 0x6f, 0x08, 0x70, + 0x47, 0x19, 0x82, 0x84, 0x1e, 0xea, 0xc4, 0x9b, + 0xf4, 0x37, 0x38, 0xb3, 0x73, 0x0c, 0x74, 0x78, + 0x34, 0x35, 0x48, 0x86, 0xf1, 0xf1, 0xf0, 0x2a, + 0xab, 0xb7, 0x79, 0xbc, 0x3c, 0xe3, 0x38, 0x4c, + 0xf9, 0x3c, 0x2f, 0xfa, 0x87, 0x35, 0x87, 0xb0, + 0xfa, 0x5e, 0x2b, 0x7c, 0x02, 0x07, 0xc2, 0xa9, + 0x37, 0x88, 0xe0, 0x0e, 0x5b, 0x06, 0xff, 0x16, + 0x32, 0xdc, 0xc5, 0x43, 0x9f, 0x07, 0x7e, 0x1c, + 0x66, 0x8d, 0xe1, 0x16, 0x10, 0x21, 0xc6, 0x8c, + 0x3b, 0x0c, 0xba, 0x43, 0x91, 0xcd, 0x40, 0x81, + 0x85, 0x21, 0x41, 0x7a, 0x03, 0xc9, 0x70, 0xa4, + 0x49, 0x15, 0x26, 0x57, 0x8e, 0x84, 0x37, 0xed, + 0x12, 0xa6, 0x03, 0xb8, 0x58, 0x40, 0xec, 0x70, + 0x10, 0x20, 0x34, 0x45, 0x1a, 0x77, 0xf2, 0x3c, + 0xc1, 0xd1, 0x0c, 0xcd, 0x1a, 0xeb, 0x40, 0xc1, + 0xa8, 0x68, 0xc2, 0x9f, 0x0d, 0x40, 0x3f, 0x6b, + 0x1c, 0x70, 0x39, 0xc2, 0x80, 0x25, 0x12, 0x91, + 0x64, 0xee, 0x93, 0xb4, 0x0e, 0x00, 0x82, 0x49, + 0x3d, 0xb7, 0x72, 0x05, 0xf1, 0xf3, 0x1e, 0x09, + 0xa2, 0xff, 0x6c, 0x0a, 0x75, 0xd1, 0x25, 0x44, + 0xd6, 0x3c, 0xb4, 0xba, 0xb2, 0x6d, 0xbb, 0xec, + 0x6b, 0x50, 0x1a, 0x57, 0xb5, 0xad, 0x35, 0xf1, + 0xd3, 0x69, 0x5a, 0xb5, 0x75, 0xdd, 0xf2, 0xed, + 0x4b, 0xef, 0xec, 0x0a, 0xb1, 0x13, 0xae, 0x22, + 0x95, 0x71, 0x42, 0xf0, 0x30, 0x10, 0x79, 0xf5, + 0xee, 0xf5, 0xeb, 0xf8, 0xf1, 0x17, 0xb8, 0x81, + 0xcb, 0x46, 0xa4, 0x2c, 0xd5, 0x72, 0x07, 0xba, + 0x8c, 0x67, 0x38, 0x85, 0xec, 0xf9, 0xf3, 0x0a, + 0xc9, 0x2a, 0x31, 0xdb, 0x99, 0x61, 0x54, 0x04, + 0x53, 0x10, 0x88, 0x37, 0x03, 0x05, 0xed, 0xfa, + 0x75, 0x0a, 0xd1, 0x29, 0x10, 0x5f, 0xb5, 0x70, + 0x37, 0x2c, 0xe0, 0xca, 0x5d, 0x70, 0xd9, 0xba, + 0x05, 0x93, 0xc6, 0x69, 0xd8, 0xc2, 0x87, 0x4f, + 0xcc, 0x3d, 0x9b, 0xf4, 0x06, 0xcd, 0xa1, 0x84, + 0xd4, 0x70, 0xb9, 0xba, 0xb6, 0x05, 0xe5, 0x45, + 0x89, 0x53, 0xaf, 0x2e, 0xdb, 0xac, 0x5c, 0xc5, + 0xa9, 0x45, 0x14, 0x9e, 0xfe, 0x41, 0xfa, 0xd8, + 0x6a, 0xcd, 0xab, 0x93, 0x87, 0x7d, 0xfd, 0x30, + 0xf2, 0x0d, 0xb7, 0x43, 0xd0, 0x56, 0xff, 0x5d, + 0xe0, 0x77, 0xc7, 0xef, 0xe3, 0xcb, 0xd3, 0xf7, + 0x7c, 0xde, 0x44, 0x7b, 0xd5, 0xc6, 0x75, 0xcb, + 0x08, 0xae, 0x1a, 0x64, 0x53, 0xb8, 0x65, 0x57, + 0x1f, 0x81, 0x7e, 0xdd, 0x57, 0x42, 0x7e, 0x5e, + 0x01, 0xc7, 0xde, 0x7e, 0x4e, 0x24, 0x58, 0x20, + 0x84, 0x5d, 0x1d, 0x28, 0xe0, 0x0c, 0xd0, 0x45, + 0x97, 0x1e, 0x00, 0xe0, 0x75, 0x33, 0xc5, 0x83, + 0x11, 0x7a, 0xb8, 0xd3, 0x84, 0x4f, 0x61, 0x68, + 0x41, 0x77, 0x37, 0xf1, 0x17, 0x83, 0x7f, 0x3b, + 0x00, 0x78, 0x85, 0x85, 0x1f, 0xba, 0x38, 0x4f, + 0x88, 0x80, 0x8c, 0x68, 0xdb, 0x7c, 0x16, 0xc9, + 0xd0, 0xe2, 0x51, 0x2b, 0xde, 0x81, 0xe3, 0x8b, + 0x3d, 0x7e, 0x13, 0x23, 0x83, 0x03, 0x06, 0x59, + 0xe1, 0x89, 0x31, 0xb0, 0xe0, 0xdb, 0x52, 0x33, + 0xfa, 0xb8, 0xa4, 0x38, 0x0d, 0xe2, 0xa7, 0xe4, + 0x21, 0x0b, 0xf6, 0xe3, 0x24, 0x77, 0xf0, 0x6d, + 0xc6, 0x23, 0x93, 0x59, 0xc2, 0x02, 0xa4, 0x7e, + 0x42, 0x86, 0xa0, 0xe1, 0x45, 0x88, 0x75, 0x36, + 0x4d, 0x92, 0x79, 0x60, 0xa9, 0x25, 0x9a, 0x8e, + 0x70, 0xf9, 0x41, 0x87, 0x1f, 0x94, 0xe8, 0x0e, + 0x47, 0x29, 0xca, 0xc7, 0x1a, 0x91, 0x69, 0xda, + 0x99, 0xcc, 0x9a, 0xd3, 0x40, 0x19, 0xa5, 0x69, + 0xa5, 0xdd, 0x58, 0xc2, 0x62, 0x77, 0x74, 0xb2, + 0xd0, 0x9e, 0x77, 0x1a, 0x3a, 0xc7, 0x15, 0x60, + 0x89, 0xe8, 0xe5, 0x90, 0x32, 0x34, 0x01, 0xa6, + 0x5d, 0x82, 0x2e, 0xb4, 0x85, 0x98, 0x87, 0x5a, + 0xfa, 0x48, 0x9e, 0x00, 0xfd, 0x59, 0x02, 0x47, + 0x45, 0x74, 0x8a, 0x20, 0x16, 0x21, 0x75, 0x59, + 0xe7, 0xa5, 0xa5, 0xfa, 0x91, 0xa9, 0x8d, 0xcb, + 0x95, 0xa0, 0x61, 0x10, 0x6f, 0x5e, 0xa4, 0x5d, + 0x17, 0x63, 0x56, 0x6a, 0x2a, 0xad, 0x73, 0xa0, + 0xea, 0xa7, 0xaa, 0x24, 0xb8, 0x7a, 0xff, 0x8b, + 0x94, 0x8b, 0xf6, 0xe9, 0xab, 0xa3, 0xb5, 0x0a, + 0x0b, 0x47, 0xa2, 0x71, 0x91, 0x7a, 0x59, 0x0e, + 0x1c, 0x61, 0x09, 0xe6, 0x98, 0xac, 0x04, 0x3b, + 0x2c, 0xb4, 0x52, 0xdc, 0xea, 0x6c, 0xae, 0x14, + 0xe6, 0x11, 0xe9, 0xaf, 0x23, 0x30, 0x1b, 0x2d, + 0xb7, 0x4f, 0x4c, 0xcb, 0xce, 0xb1, 0xcc, 0xe5, + 0xa1, 0x68, 0x71, 0xd9, 0xfe, 0x52, 0x63, 0xb7, + 0xe9, 0xb2, 0xf0, 0x6d, 0x9b, 0x22, 0x80, 0x19, + 0x6e, 0x08, 0x57, 0x34, 0xfb, 0x9c, 0xba, 0xf5, + 0xae, 0x50, 0xec, 0x64, 0x8c, 0x8e, 0xe0, 0x6a, + 0x7f, 0x3e, 0x51, 0x49, 0x22, 0x16, 0x67, 0xda, + 0x3b, 0x30, 0x9f, 0x8d, 0xa1, 0xa7, 0xaf, 0xb6, + 0x78, 0x08, 0xfc, 0x2e, 0x74, 0x50, 0x05, 0x4c, + 0x30, 0xc4, 0xa6, 0xf0, 0x61, 0xec, 0xa6, 0x07, + 0x67, 0x81, 0xdd, 0x7e, 0x20, 0xed, 0x18, 0x31, + 0xc7, 0xfb, 0xfc, 0x0b, 0x6c, 0xb5, 0xd8, 0xe2, + 0x7b, 0x82, 0xa0, 0x53, 0x8d, 0xdb, 0x31, 0xca, + 0x1b, 0x8c, 0x7c, 0x1c, 0xc2, 0x20, 0xc3, 0xeb, + 0x32, 0x9d, 0xde, 0xa5, 0xdc, 0x31, 0xbb, 0x85, + 0x4e, 0x89, 0x49, 0x68, 0xac, 0x75, 0x52, 0xc3, + 0xcc, 0x28, 0xaf, 0x8c, 0x71, 0xc5, 0x28, 0x30, + 0xbc, 0x42, 0xa0, 0x78, 0xe8, 0xe0, 0xaa, 0xc0, + 0x3d, 0xd7, 0x5a, 0x73, 0xcb, 0x30, 0x23, 0x43, + 0x74, 0x99, 0x30, 0x88, 0xf2, 0xa9, 0xd2, 0x10, + 0x33, 0xfd, 0x32, 0xa7, 0x13, 0xab, 0x78, 0x47, + 0x1f, 0xdb, 0x56, 0x3d, 0x70, 0x2e, 0x0c, 0x89, + 0xdd, 0x2c, 0x20, 0xb8, 0x4c, 0xda, 0xd0, 0x91, + 0x67, 0x9b, 0x3d, 0x53, 0x0f, 0x3a, 0x66, 0x30, + 0xe8, 0x7f, 0x63, 0x2f, 0xf4, 0x35, 0xdd, 0x90, + 0xf5, 0x56, 0x37, 0xde, 0x79, 0xeb, 0xbd, 0x37, + 0xdf, 0x7d, 0xfb, 0xfd, 0x37, 0xe0, 0x81, 0x0b, + 0x3e, 0x38, 0xe1, 0x85, 0x1b, 0x7e, 0xff, 0x38, + 0xe2, 0x89, 0x2b, 0xbe, 0x38, 0xe3, 0x8d, 0x3b, + 0xfe, 0x38, 0xe4, 0x91, 0x4b, 0x3e, 0x39, 0xe5, + 0x95, 0xf7, 0x44, 0x00, 0x03, 0x04, 0x68, 0x8e, + 0x66, 0x05, 0x64, 0x3f, 0xae, 0xf9, 0xe6, 0xaf, + 0x11, 0x30, 0x40, 0x02, 0x01, 0x98, 0x6e, 0xfa, + 0x02, 0x0c, 0x40, 0x16, 0x7a, 0x2d, 0xbf, 0x59, + 0x45, 0xe0, 0x54, 0x49, 0x7f, 0x33, 0x7a, 0xe9, + 0xa7, 0x07, 0xb0, 0x00, 0x01, 0x7f, 0xb0, 0x0e, + 0x05, 0x01, 0x01, 0x94, 0x9e, 0xbb, 0x08, 0xbd, + 0xdb, 0x3e, 0xfc, 0x02, 0x8e, 0x0d, 0x10, 0x00, + 0xf0, 0x14, 0xa3, 0xe8, 0xb9, 0x7d, 0xf1, 0x45, + 0x91, 0x95, 0xec, 0x2c, 0x30, 0x50, 0xfb, 0xf0, + 0xa6, 0x0f, 0x50, 0x47, 0xef, 0xaa, 0x4b, 0xc1, + 0xc0, 0xe9, 0xda, 0x83, 0xc0, 0x7d, 0xf5, 0xc4, + 0xf3, 0x45, 0x40, 0xed, 0xc9, 0xab, 0xf0, 0xee, + 0x86, 0xe4, 0x99, 0x38, 0x85, 0x36, 0xe4, 0xfa, + 0x00, 0x7e, 0xf8, 0xa7, 0x5f, 0x1f, 0x07, 0x01, + 0x0b, 0x98, 0xee, 0x3d, 0x14, 0xf0, 0xe3, 0xdf, + 0x81, 0xf0, 0xf2, 0x6b, 0x3e, 0xbd, 0xed, 0xf6, + 0xb7, 0x95, 0xe3, 0x99, 0xce, 0x7c, 0x40, 0x2b, + 0x40, 0xe7, 0xac, 0x20, 0x27, 0xd7, 0x88, 0x24, + 0x7a, 0x27, 0xf0, 0x87, 0x03, 0x51, 0xd0, 0x3f, + 0xdf, 0x65, 0x0e, 0x73, 0xd4, 0x43, 0x1e, 0xfd, + 0xba, 0x37, 0x05, 0xfd, 0x85, 0xc0, 0x7e, 0xa6, + 0x4b, 0x80, 0x01, 0xa9, 0x97, 0x00, 0xb7, 0x10, + 0x10, 0x83, 0xf7, 0x0a, 0x0f, 0x89, 0x66, 0xc1, + 0xbc, 0x43, 0x41, 0x10, 0x0e, 0x1e, 0xbc, 0x9d, + 0x07, 0xa8, 0x57, 0x3c, 0x38, 0xf4, 0x4f, 0x80, + 0xef, 0xd3, 0xe0, 0x07, 0x26, 0x68, 0x40, 0x00, + 0xf4, 0x6f, 0x86, 0x1c, 0xc0, 0xdc, 0x02, 0x12, + 0xb0, 0x80, 0xd4, 0x7d, 0x80, 0x01, 0x0c, 0x18, + 0x40, 0xee, 0x68, 0x37, 0x44, 0x03, 0xff, 0x8e, + 0xce, 0x88, 0x16, 0x60, 0x40, 0x10, 0x17, 0x80, + 0xc4, 0x1c, 0x0e, 0x20, 0x8a, 0x53, 0x04, 0x41, + 0xfd, 0xac, 0x98, 0x3c, 0x20, 0x9e, 0x2e, 0x75, + 0x3b, 0xf4, 0x55, 0x6d, 0x30, 0x20, 0x09, 0x78, + 0x20, 0x49, 0x54, 0x1e, 0xb8, 0x05, 0xdb, 0x40, + 0x12, 0x12, 0x4a, 0x6d, 0x62, 0x1d, 0x68, 0x34, + 0x04, 0x80, 0xd8, 0x76, 0x81, 0x36, 0x4e, 0x63, + 0x52, 0x37, 0xb0, 0x23, 0x89, 0x18, 0x62, 0x84, + 0xf7, 0x98, 0x31, 0x11, 0x78, 0xec, 0x07, 0x80, + 0xd6, 0xe8, 0x9e, 0x36, 0xbe, 0x81, 0x50, 0x40, + 0x98, 0x1b, 0x20, 0xf9, 0x18, 0x41, 0x1e, 0xda, + 0x6e, 0x87, 0xfd, 0x9b, 0xdf, 0x0f, 0xa1, 0x28, + 0x44, 0xdc, 0x15, 0xd1, 0x88, 0x49, 0xac, 0x62, + 0x02, 0xae, 0xf8, 0xc4, 0x17, 0xa6, 0x4e, 0x7b, + 0x4d, 0x54, 0x9d, 0x24, 0x35, 0xc9, 0x43, 0x4c, + 0x4a, 0x71, 0x87, 0x1c, 0x2c, 0x62, 0x17, 0xbf, + 0xf7, 0x45, 0xf8, 0xd9, 0x0e, 0x84, 0x1d, 0xa8, + 0x9d, 0x11, 0xab, 0x07, 0x49, 0x00, 0x94, 0xb0, + 0x7e, 0xd5, 0x63, 0x62, 0xf8, 0x66, 0x69, 0x01, + 0xf2, 0xe5, 0x72, 0x97, 0xe1, 0x1b, 0xa1, 0xd0, + 0x9e, 0x76, 0x46, 0x10, 0x80, 0x67, 0x1d, 0xed, + 0x73, 0x18, 0x0c, 0x2a, 0xa0, 0x1c, 0x2f, 0xb4, + 0xaf, 0x68, 0x6c, 0x58, 0xe6, 0xcd, 0xd6, 0x10, + 0x4d, 0x51, 0x34, 0x73, 0x1c, 0x7d, 0x90, 0xc8, + 0x85, 0x82, 0x06, 0x2e, 0x72, 0xa8, 0x27, 0x29, + 0xd9, 0x2c, 0xca, 0x0a, 0x39, 0x00, 0x3f, 0x5d, + 0x6e, 0x60, 0x77, 0x1b, 0x28, 0x61, 0x2b, 0xcd, + 0xd7, 0xbf, 0xd1, 0xc9, 0x72, 0x03, 0xf1, 0xb3, + 0x80, 0x07, 0x13, 0xc0, 0x4a, 0xe0, 0xd9, 0xb2, + 0x7a, 0x3e, 0x7c, 0x22, 0x0e, 0x3d, 0xf0, 0x42, + 0x72, 0x8a, 0x00, 0x9d, 0xb7, 0xe4, 0xc0, 0xe9, + 0x2e, 0x18, 0xc0, 0x73, 0xc6, 0x2f, 0xff, 0xa0, + 0xe2, 0x2c, 0xe8, 0x3d, 0x79, 0x19, 0xbf, 0xeb, + 0x4d, 0x30, 0x95, 0x28, 0x28, 0xc3, 0x02, 0x3d, + 0xa6, 0xb5, 0x6f, 0x02, 0x01, 0x45, 0xa4, 0xa2, + 0xcb, 0x10, 0xc6, 0x01, 0x51, 0xa9, 0x6d, 0xa0, + 0x85, 0x1d, 0x0d, 0x8f, 0x36, 0x24, 0xd1, 0x0e, + 0x7b, 0x94, 0xcb, 0x18, 0x60, 0x12, 0x05, 0x52, + 0xc6, 0x61, 0x88, 0x7a, 0x54, 0x84, 0x55, 0x2b, + 0x78, 0xa1, 0x0d, 0x43, 0xe0, 0xcf, 0xe1, 0x99, + 0x2f, 0xa0, 0xf1, 0x4b, 0xa2, 0x40, 0x7d, 0x07, + 0xcf, 0x5f, 0x6e, 0x20, 0xa7, 0x06, 0xdd, 0xc0, + 0x29, 0xf5, 0x99, 0x4f, 0x12, 0x4c, 0x10, 0x89, + 0x50, 0x6c, 0x64, 0x4f, 0x03, 0xa8, 0x39, 0x4e, + 0x02, 0xd5, 0x76, 0xb8, 0xc3, 0x1c, 0x52, 0x2d, + 0x40, 0xbd, 0x0a, 0xbe, 0x30, 0x79, 0x9c, 0xfc, + 0x9f, 0xed, 0x46, 0x29, 0xc3, 0x01, 0xc4, 0x34, + 0x5e, 0x69, 0x30, 0x01, 0x46, 0xcd, 0x36, 0x0b, + 0x6a, 0x72, 0x34, 0x43, 0xf6, 0xa8, 0x00, 0x0e, + 0x5a, 0x5a, 0x56, 0xcd, 0x04, 0x28, 0xad, 0x1f, + 0x1d, 0xcc, 0x34, 0x93, 0x53, 0x56, 0xb7, 0x76, + 0xb3, 0x35, 0xe0, 0x6a, 0xeb, 0x58, 0xb3, 0x49, + 0x95, 0xbb, 0xee, 0xf1, 0x6d, 0x88, 0xc4, 0x01, + 0x02, 0x2f, 0x80, 0x4d, 0x13, 0x54, 0xf5, 0x04, + 0xac, 0x34, 0xea, 0x0b, 0x81, 0xc9, 0xc8, 0x46, + 0x6a, 0x8e, 0x7a, 0xf3, 0x3b, 0x2a, 0xea, 0x06, + 0x30, 0xbf, 0x17, 0xfa, 0x8e, 0x74, 0x93, 0x0d, + 0x68, 0xe6, 0x00, 0x88, 0xba, 0xa6, 0xde, 0x0f, + 0x04, 0xd4, 0xfb, 0xa2, 0x67, 0x87, 0x5a, 0x42, + 0x48, 0x7e, 0xb6, 0x9c, 0x3f, 0xa5, 0xe5, 0x69, + 0x51, 0x5b, 0x40, 0x7c, 0x76, 0x36, 0xa9, 0x30, + 0x5c, 0xac, 0x4e, 0x39, 0x6b, 0xc2, 0x5a, 0xaa, + 0xc0, 0x1f, 0xee, 0x7b, 0xab, 0x5d, 0xb1, 0x02, + 0x51, 0xb9, 0xc2, 0xd5, 0x59, 0xe5, 0xff, 0x52, + 0x6b, 0x6f, 0xb1, 0x02, 0x03, 0x0e, 0xd0, 0x05, + 0xb7, 0xc6, 0xf0, 0xa8, 0x59, 0x83, 0x9b, 0xdc, + 0x6d, 0xd0, 0xc8, 0xae, 0xbb, 0x7d, 0xeb, 0x5e, + 0x1b, 0x48, 0xdc, 0xaf, 0x22, 0x97, 0x4f, 0x46, + 0xd1, 0xc9, 0x09, 0x4a, 0x6b, 0x02, 0xed, 0xee, + 0xd4, 0x7a, 0xee, 0x3c, 0xdd, 0x16, 0x4f, 0x5b, + 0x43, 0x0e, 0x24, 0x96, 0x7f, 0x01, 0xdd, 0xa2, + 0x76, 0x83, 0xfa, 0xca, 0xa1, 0x06, 0x2f, 0xb5, + 0xb0, 0x55, 0xac, 0x7b, 0x4f, 0xab, 0xde, 0x53, + 0x16, 0x96, 0xa0, 0xa6, 0x63, 0x6d, 0x00, 0xf6, + 0xb7, 0x3b, 0xda, 0xa6, 0xc0, 0xb6, 0x16, 0x1b, + 0xca, 0x58, 0x8a, 0x8b, 0x5b, 0x66, 0x7e, 0x95, + 0x2e, 0x6f, 0x58, 0x9f, 0x80, 0x85, 0xab, 0x5c, + 0xe4, 0x1a, 0xd8, 0x22, 0x5b, 0x28, 0x84, 0xca, + 0x3a, 0x42, 0xb6, 0xbc, 0x54, 0x04, 0xb9, 0xd5, + 0x55, 0x85, 0x72, 0x4b, 0xc0, 0xdd, 0x11, 0xf4, + 0xd0, 0xbc, 0x1f, 0xf4, 0xe5, 0x87, 0x4d, 0x1b, + 0x62, 0xd8, 0xe2, 0x6f, 0x9f, 0x1d, 0x28, 0xe1, + 0xfe, 0xc6, 0x89, 0xdf, 0x98, 0xc2, 0xd4, 0x04, + 0x8f, 0x14, 0xea, 0x6a, 0x01, 0x50, 0xbb, 0x7b, + 0xca, 0x78, 0xc4, 0x28, 0xfe, 0x21, 0x0e, 0x1d, + 0x2b, 0x59, 0xc9, 0x96, 0x96, 0xbf, 0x32, 0x05, + 0xef, 0x09, 0x13, 0x03, 0xd6, 0x0c, 0x9c, 0x31, + 0xc0, 0x44, 0xe6, 0x00, 0x82, 0x0b, 0x7c, 0xe4, + 0x08, 0xe7, 0x56, 0x27, 0xd5, 0x65, 0xf0, 0x92, + 0xdf, 0x51, 0xd7, 0x22, 0x5c, 0x18, 0x2d, 0x6e, + 0x9b, 0x80, 0x71, 0x4b, 0x13, 0x92, 0x2d, 0x03, + 0x36, 0x05, 0xf5, 0x25, 0x81, 0x7a, 0xa5, 0x7a, + 0xba, 0xef, 0xbe, 0xd6, 0xb5, 0x8a, 0x1d, 0xef, + 0x06, 0xbe, 0xdc, 0x5d, 0x13, 0x8a, 0xf8, 0xb5, + 0x61, 0x4e, 0xb3, 0xfc, 0xb0, 0x68, 0xbe, 0x37, + 0xd7, 0x77, 0xc6, 0xeb, 0x8d, 0x2d, 0xff, 0x00, + 0xe6, 0x9b, 0xe3, 0x82, 0x02, 0xd9, 0xc7, 0x20, + 0xf0, 0xb3, 0xbf, 0x84, 0xec, 0xa6, 0xcc, 0x7c, + 0x75, 0xc0, 0xdf, 0x24, 0x8b, 0x34, 0x4b, 0xc3, + 0x5b, 0xe6, 0x36, 0x97, 0xc0, 0x58, 0x06, 0xd8, + 0x82, 0x41, 0x1a, 0x65, 0x70, 0x3d, 0x38, 0x15, + 0x38, 0xe0, 0x11, 0x32, 0xfb, 0x05, 0x69, 0xbb, + 0xae, 0xc6, 0x79, 0x22, 0x68, 0x71, 0x0e, 0xe7, + 0xcc, 0xde, 0x1a, 0xdf, 0x17, 0xb6, 0x34, 0x76, + 0x28, 0x89, 0xc9, 0x0b, 0x64, 0x0e, 0x6c, 0xd8, + 0x02, 0x3f, 0x7d, 0x33, 0x7e, 0x15, 0xdb, 0x81, + 0x0f, 0xce, 0xef, 0xc5, 0x1d, 0xa8, 0x2f, 0xaa, + 0xc5, 0x8c, 0xe7, 0x1b, 0xb7, 0x59, 0x7b, 0x32, + 0x9c, 0x24, 0xb0, 0x29, 0x09, 0x68, 0x0f, 0x0c, + 0x3b, 0x6b, 0xe9, 0xfb, 0x81, 0x4c, 0x1e, 0x35, + 0xe9, 0x24, 0xf4, 0x36, 0xa4, 0x88, 0x36, 0xa9, + 0x92, 0x1f, 0x3d, 0x65, 0x8b, 0x64, 0xb9, 0xda, + 0xcb, 0x05, 0x48, 0xa5, 0x5b, 0x73, 0xe9, 0x84, + 0x1d, 0xf2, 0x99, 0x4b, 0xf6, 0x2f, 0x2b, 0x3a, + 0xc1, 0xc7, 0x71, 0xcb, 0x0e, 0x7e, 0x34, 0xfe, + 0x2e, 0x11, 0xf3, 0x3c, 0x6a, 0xed, 0xc6, 0x99, + 0xd5, 0x23, 0x46, 0xf3, 0x9a, 0x0d, 0xa8, 0x66, + 0x53, 0xaf, 0x18, 0x8b, 0x51, 0x3d, 0xe8, 0x98, + 0xe9, 0x7d, 0x67, 0xc5, 0xda, 0xd9, 0xdd, 0x78, + 0xd6, 0x73, 0x6b, 0xe3, 0x39, 0x02, 0x15, 0x73, + 0x80, 0xab, 0xa1, 0x2b, 0x36, 0x85, 0xca, 0x41, + 0x17, 0x43, 0x24, 0xb8, 0x34, 0x0c, 0x8f, 0x72, + 0x75, 0x13, 0xdc, 0x70, 0x0c, 0xe7, 0x36, 0xc1, + 0x4f, 0x96, 0xb4, 0xa0, 0xa5, 0xdc, 0x5c, 0x43, + 0x80, 0x7b, 0x09, 0x6c, 0xeb, 0x78, 0x72, 0x2b, + 0x1c, 0x9e, 0x2a, 0xb3, 0x40, 0x87, 0x1e, 0x80, + 0x1f, 0x30, 0x6d, 0x5d, 0xce, 0xda, 0xa5, 0x3c, + 0xd7, 0xa4, 0x3e, 0xf3, 0x50, 0xe7, 0xff, 0x0d, + 0x68, 0x5b, 0xc3, 0x7a, 0xcd, 0xae, 0x6c, 0x73, + 0x99, 0x37, 0x6c, 0x6e, 0xd7, 0xd2, 0x98, 0xe5, + 0xf6, 0xcd, 0x2f, 0x8e, 0x5b, 0xeb, 0x67, 0xc9, + 0x66, 0x0e, 0xc4, 0x78, 0x86, 0xed, 0xfc, 0x10, + 0x2e, 0xae, 0x44, 0xfb, 0x49, 0xcb, 0x84, 0x4e, + 0xdf, 0xc4, 0x51, 0xe8, 0x8b, 0x89, 0x63, 0xd3, + 0xc9, 0x52, 0xc7, 0x38, 0xa3, 0x29, 0x3d, 0xed, + 0xe6, 0x9e, 0xc6, 0x1a, 0xd8, 0xb5, 0xae, 0xb5, + 0xf9, 0x14, 0x0c, 0x41, 0xaa, 0xa0, 0xbc, 0x41, + 0xf7, 0xae, 0xab, 0x57, 0x6d, 0x81, 0xd1, 0x92, + 0x59, 0x97, 0x3e, 0x37, 0x7a, 0x89, 0xd5, 0x6e, + 0x74, 0x1a, 0xd7, 0xb7, 0xe6, 0xb0, 0xb5, 0x9e, + 0x11, 0xfd, 0x99, 0xbc, 0x12, 0xde, 0x7c, 0x9e, + 0x64, 0xee, 0xf9, 0x88, 0x01, 0x0e, 0xf4, 0xf7, + 0x02, 0x0f, 0xe5, 0xae, 0x0d, 0xc0, 0x14, 0x15, + 0x3a, 0xdb, 0x38, 0x03, 0x2f, 0x88, 0xbe, 0x03, + 0xad, 0x9f, 0xd6, 0xa8, 0x31, 0x14, 0xe6, 0xf5, + 0x9b, 0x48, 0x70, 0x36, 0x92, 0x95, 0x2b, 0xf1, + 0x49, 0xa3, 0xb0, 0xe1, 0x6f, 0x6b, 0x02, 0x52, + 0xc8, 0x2a, 0x6d, 0x8d, 0x8b, 0x5d, 0xcb, 0xca, + 0x86, 0xeb, 0xb6, 0xc3, 0x6d, 0xe8, 0x45, 0x8b, + 0xbe, 0x15, 0x59, 0x19, 0x02, 0x8e, 0x26, 0x98, + 0x49, 0xcd, 0xa1, 0x53, 0xd6, 0x7c, 0x07, 0x1e, + 0x3a, 0xe9, 0xe9, 0x72, 0x54, 0x77, 0xb8, 0xf1, + 0x72, 0xd7, 0xf5, 0xed, 0x92, 0x68, 0x76, 0x75, + 0xb7, 0x16, 0x00, 0xf6, 0x4b, 0x00, 0xcc, 0xf9, + 0x3c, 0xf8, 0xc3, 0xfb, 0x6e, 0x78, 0xb3, 0xec, + 0xb7, 0x99, 0x7f, 0x8e, 0x3f, 0x78, 0xa3, 0x73, + 0x88, 0xf7, 0x6e, 0xe8, 0x05, 0x7d, 0x88, 0xfd, + 0x78, 0x5b, 0xcb, 0x5c, 0x0a, 0x7e, 0x9b, 0xcc, + 0xae, 0x9d, 0x79, 0xa6, 0x87, 0x7c, 0xd1, 0xd7, + 0x70, 0x07, 0x0e, 0xa6, 0x0b, 0x04, 0xff, 0x2b, + 0xb5, 0x1e, 0xdb, 0x5b, 0x6f, 0x6e, 0x45, 0xdf, + 0x56, 0x57, 0x33, 0x4c, 0x3e, 0xca, 0x14, 0xd1, + 0xc0, 0x62, 0x3a, 0x31, 0x8b, 0x33, 0xa0, 0xd0, + 0xde, 0xca, 0x57, 0xe7, 0x05, 0x09, 0x14, 0xfe, + 0xb4, 0x5b, 0xf4, 0x19, 0x5d, 0xbe, 0xcd, 0xdb, + 0xdd, 0x35, 0xdf, 0xbd, 0x05, 0x15, 0xf5, 0xfc, + 0x90, 0x4f, 0x15, 0x9f, 0xaa, 0xf5, 0x92, 0xbf, + 0x01, 0xde, 0xae, 0x0d, 0x95, 0x7a, 0x51, 0xd6, + 0x40, 0xe1, 0x9b, 0x3d, 0x9d, 0xdd, 0x01, 0xfe, + 0xde, 0xa8, 0x3c, 0x03, 0x9b, 0x18, 0xc4, 0x69, + 0x34, 0x5c, 0xc4, 0x2d, 0x59, 0xd4, 0xb9, 0x03, + 0x09, 0xf6, 0x07, 0x32, 0xb5, 0x9f, 0x83, 0xd5, + 0xd5, 0x71, 0x89, 0x60, 0xaa, 0x0c, 0x03, 0x76, + 0x29, 0x07, 0xe8, 0x4d, 0xd4, 0xf7, 0x61, 0x89, + 0xe2, 0x0d, 0xcf, 0xcd, 0x39, 0x60, 0xfc, 0x4c, + 0x9f, 0xcb, 0xbd, 0x1d, 0xf0, 0xad, 0x16, 0x02, + 0x26, 0xe0, 0x79, 0x69, 0xa0, 0xf7, 0x34, 0xe0, + 0x89, 0x09, 0x14, 0x25, 0x61, 0x51, 0xf6, 0xed, + 0x10, 0xf2, 0x21, 0xde, 0xad, 0x21, 0x9f, 0x0f, + 0x4d, 0x0f, 0xf2, 0x01, 0x20, 0xf2, 0xa5, 0x58, + 0x13, 0xe6, 0x10, 0x65, 0xc9, 0x93, 0x07, 0x28, + 0x1e, 0x30, 0x91, 0x4e, 0x15, 0x1e, 0x86, 0x33, + 0x04, 0x16, 0x7b, 0x50, 0xc4, 0x55, 0x40, 0x45, + 0x27, 0x5c, 0xc3, 0xeb, 0x2c, 0x41, 0x54, 0x18, + 0x81, 0x56, 0x10, 0xd7, 0x1a, 0xba, 0xa1, 0x24, + 0xf0, 0x47, 0x11, 0xc4, 0x0e, 0x1b, 0xa6, 0x61, + 0x22, 0xbc, 0x61, 0x74, 0xc4, 0x21, 0x1b, 0xfa, + 0x15, 0x99, 0xdc, 0x84, 0x1d, 0x2e, 0x5a, 0x80, + 0xf8, 0xc9, 0x5e, 0x4d, 0x04, 0x1f, 0x0e, 0x5c, + 0x00, 0x8a, 0x52, 0x07, 0x68, 0x16, 0xea, 0x38, + 0x21, 0xf2, 0xb9, 0xdd, 0x23, 0xf2, 0xe0, 0x07, + 0xe5, 0x0e, 0x18, 0xee, 0x20, 0xb1, 0x0b, 0x39, + 0x5f, 0x17, 0x3e, 0xa1, 0x55, 0x21, 0x5f, 0x02, + 0x44, 0x00, 0x00, 0x3b, +}; + +static const uint8_t data_images_ti_logo_gif[] = +{ + /* /images/ti_logo.gif */ + 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x74, 0x69, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, + 0x67, 0x69, 0x66, 0x00, + 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x68, 0x01, + 0x54, 0x00, 0xb3, 0x0f, 0x00, 0xf2, 0x54, 0x5a, + 0x25, 0x25, 0x25, 0xa3, 0xa3, 0xa3, 0xf5, 0x87, + 0x8b, 0x62, 0x62, 0x62, 0x83, 0x83, 0x83, 0x48, + 0x48, 0x48, 0xfa, 0xf7, 0xf8, 0xd4, 0xd4, 0xd4, + 0xbf, 0xbf, 0xbf, 0xea, 0xe7, 0xe7, 0xf9, 0xaf, + 0xb2, 0xfb, 0xce, 0xd0, 0xed, 0x1c, 0x24, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x21, 0xf9, 0x04, + 0x01, 0x00, 0x00, 0x0f, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x00, 0x68, 0x01, 0x54, 0x00, 0x00, 0x04, + 0xff, 0xf0, 0xc9, 0x49, 0xab, 0x5d, 0x2d, 0xeb, + 0xcd, 0x33, 0xb0, 0x60, 0x28, 0x8e, 0x64, 0x69, + 0x9e, 0x68, 0xaa, 0xae, 0x6c, 0xeb, 0xbe, 0x70, + 0x2c, 0xcf, 0x15, 0xd6, 0xdd, 0xda, 0x47, 0xef, + 0x7c, 0xef, 0xff, 0xc0, 0xa0, 0x70, 0x28, 0xb3, + 0xe1, 0x6e, 0x3a, 0xa2, 0x72, 0xc9, 0x6c, 0x3a, + 0x9f, 0x50, 0x94, 0xf1, 0xc8, 0x49, 0x46, 0xaf, + 0xd8, 0xac, 0x76, 0xcb, 0x95, 0x4c, 0xa9, 0x39, + 0xd1, 0x01, 0x40, 0x2e, 0x37, 0x16, 0xdd, 0xb4, + 0x7a, 0xcd, 0x4e, 0x7f, 0xc1, 0x0d, 0x6b, 0x85, + 0x71, 0x63, 0xb4, 0xef, 0xf8, 0xbc, 0x7e, 0xf7, + 0x06, 0xcb, 0x29, 0x7d, 0x7b, 0x82, 0x83, 0x84, + 0x85, 0x80, 0x70, 0x55, 0x22, 0x03, 0x1d, 0x7f, + 0x86, 0x8e, 0x8f, 0x90, 0x50, 0x7d, 0x54, 0x8d, + 0x12, 0x00, 0x1d, 0x03, 0x91, 0x9a, 0x9b, 0x9c, + 0x41, 0x93, 0x47, 0x95, 0x0a, 0x37, 0x68, 0x9d, + 0xa5, 0xa6, 0xa7, 0x2a, 0x9f, 0x38, 0x95, 0x74, + 0x1d, 0x76, 0xa8, 0xb0, 0xb1, 0xb2, 0x0f, 0xaa, + 0x48, 0x21, 0x0a, 0x0b, 0xb9, 0xba, 0x0b, 0x07, + 0xb3, 0xbe, 0xbf, 0x9a, 0xb5, 0x8c, 0xc0, 0xc4, + 0xc5, 0xb0, 0xc2, 0x89, 0xc6, 0xca, 0xcb, 0x90, + 0xc8, 0x55, 0x65, 0x99, 0x0f, 0x07, 0x03, 0x65, + 0x65, 0xaf, 0x0b, 0xd5, 0xd9, 0xd9, 0xd1, 0x28, + 0x04, 0x06, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe1, + 0x09, 0xcc, 0xe7, 0xa7, 0xce, 0x38, 0xd1, 0xad, + 0x1c, 0xaf, 0x97, 0x88, 0x95, 0x21, 0x09, 0x0e, + 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xf8, 0x04, 0xe8, + 0xfd, 0x9c, 0xea, 0xa3, 0xbc, 0xdc, 0xe8, 0xf5, + 0x00, 0x1e, 0x1c, 0x79, 0x20, 0x0a, 0xe8, 0x5b, + 0xc8, 0xb0, 0x5e, 0x00, 0x82, 0xfe, 0x22, 0x1a, + 0x02, 0xd8, 0x41, 0x81, 0x84, 0x45, 0xc9, 0x44, + 0x21, 0x8a, 0x93, 0x22, 0x80, 0xbd, 0x00, 0xe0, + 0xff, 0x08, 0x10, 0xf0, 0x98, 0xcf, 0x80, 0xb7, + 0x6f, 0x24, 0xeb, 0x09, 0x90, 0xc8, 0x92, 0x10, + 0xc5, 0x0d, 0x49, 0x0c, 0x6a, 0x88, 0xa6, 0x0e, + 0x61, 0x05, 0x7a, 0x0e, 0x0a, 0x58, 0xb4, 0x90, + 0x52, 0xa5, 0x85, 0x03, 0x09, 0x0c, 0x38, 0xe0, + 0xd7, 0xb2, 0x68, 0x9e, 0x97, 0x61, 0xa4, 0x05, + 0x7c, 0x80, 0x31, 0x1e, 0x0a, 0xa1, 0x10, 0x2d, + 0x08, 0xbd, 0x87, 0x40, 0x84, 0xc2, 0x9d, 0x46, + 0xb3, 0xaa, 0x41, 0x9a, 0x81, 0x5d, 0x1d, 0x4b, + 0x1b, 0x39, 0x9e, 0x10, 0x50, 0x55, 0x04, 0x01, + 0x7c, 0x65, 0xe7, 0xa5, 0xd5, 0xca, 0x56, 0x0b, + 0xd7, 0x33, 0x02, 0x3b, 0x10, 0x94, 0xe9, 0x87, + 0xc6, 0x54, 0x7b, 0x6b, 0x1f, 0x20, 0x48, 0xa0, + 0x00, 0x81, 0x82, 0x03, 0x7d, 0xfd, 0x22, 0x10, + 0x4c, 0xd8, 0xaf, 0x84, 0xbd, 0x7d, 0x03, 0x27, + 0x46, 0x3c, 0x01, 0x28, 0x61, 0x05, 0x81, 0x43, + 0x00, 0x1e, 0x9c, 0x18, 0x85, 0x82, 0x04, 0x05, + 0x32, 0x93, 0x9d, 0xf0, 0xb7, 0x6d, 0xb0, 0xb0, + 0xae, 0x2e, 0x0e, 0x7b, 0xd0, 0xce, 0xe9, 0x8c, + 0xbb, 0xf5, 0xf2, 0x2a, 0x6c, 0xa8, 0x2f, 0x80, + 0x04, 0x01, 0xac, 0xb1, 0x1e, 0xe8, 0x69, 0x8f, + 0xa8, 0x05, 0x9c, 0xf6, 0x0c, 0x98, 0x40, 0x80, + 0xfa, 0x1e, 0xd9, 0x9c, 0x9e, 0x23, 0x01, 0xcc, + 0x36, 0x17, 0x93, 0x04, 0x3a, 0xd5, 0xea, 0x9e, + 0x46, 0x6b, 0x01, 0x01, 0x6d, 0xd6, 0x0e, 0xcc, + 0x3d, 0x50, 0x70, 0xb6, 0x64, 0xc2, 0x7b, 0x01, + 0xa4, 0x83, 0xa8, 0x4e, 0x95, 0x04, 0xf7, 0x86, + 0xba, 0x83, 0x3f, 0x52, 0xc7, 0x8d, 0x82, 0x46, + 0x0e, 0xa4, 0xa2, 0x9e, 0x5f, 0x65, 0x97, 0xb9, + 0x05, 0xd8, 0xf8, 0x40, 0xca, 0x37, 0xd0, 0xd3, + 0xf6, 0x83, 0xd5, 0xf7, 0x0a, 0x80, 0xc0, 0x6d, + 0xdf, 0x82, 0x02, 0x7d, 0xfa, 0x59, 0x85, 0x8f, + 0xff, 0x49, 0xde, 0xe4, 0x83, 0x95, 0x78, 0x2e, + 0x85, 0xf5, 0xca, 0x1c, 0x5f, 0x59, 0x50, 0x9a, + 0x2d, 0xcb, 0x75, 0xd7, 0x1c, 0x3e, 0x01, 0x56, + 0x00, 0xd4, 0x54, 0x07, 0xf6, 0x16, 0x5e, 0x05, + 0x53, 0x6d, 0x18, 0x02, 0x7c, 0xf1, 0x89, 0x80, + 0xdb, 0x50, 0x07, 0x5e, 0x68, 0x8f, 0x76, 0x08, + 0x0e, 0xa2, 0xce, 0x81, 0x13, 0xf4, 0x11, 0xd5, + 0x04, 0x4d, 0x1d, 0xc1, 0xa2, 0x0b, 0xbd, 0xe5, + 0x75, 0x18, 0x3e, 0x28, 0x5a, 0xa0, 0x50, 0x85, + 0xd3, 0xe5, 0xc3, 0xe3, 0x7d, 0x78, 0x91, 0x40, + 0x12, 0x6d, 0x39, 0x4e, 0xc0, 0x9d, 0x87, 0x15, + 0x38, 0x37, 0x54, 0x8a, 0x85, 0x38, 0x53, 0x49, + 0x8c, 0x1e, 0x84, 0x40, 0xd7, 0x52, 0x31, 0xd4, + 0x08, 0x02, 0x02, 0x38, 0x92, 0x50, 0x40, 0x7f, + 0x20, 0x06, 0x79, 0xa3, 0x4f, 0x23, 0xe0, 0x14, + 0x80, 0x92, 0xb5, 0x85, 0x90, 0xd2, 0x8f, 0x3c, + 0x39, 0xf0, 0x22, 0x93, 0x4a, 0x1c, 0xe0, 0xe6, + 0x9b, 0x70, 0xc6, 0x19, 0x27, 0x2d, 0x1b, 0x55, + 0x32, 0x65, 0x79, 0x14, 0x4c, 0x39, 0x5a, 0x95, + 0xee, 0x25, 0x99, 0xe5, 0x0a, 0xdf, 0x39, 0xb0, + 0x21, 0x49, 0xfd, 0x6d, 0x57, 0x0f, 0x3f, 0x81, + 0xce, 0x38, 0x5b, 0x99, 0x23, 0x1c, 0xa0, 0x13, + 0x9b, 0x4e, 0xe8, 0x09, 0x1a, 0x1c, 0x78, 0x4a, + 0x70, 0x00, 0x95, 0x14, 0x5c, 0x8a, 0x08, 0x29, + 0x30, 0x58, 0x39, 0xe1, 0x3d, 0x45, 0x9e, 0x40, + 0x9b, 0x7e, 0xab, 0x3d, 0x44, 0xc2, 0x7f, 0xf5, + 0x98, 0xd3, 0x25, 0x70, 0x16, 0xf6, 0xb4, 0x12, + 0xa4, 0x69, 0x48, 0x3a, 0x29, 0x15, 0x9c, 0x52, + 0xf0, 0x60, 0x06, 0x0b, 0x1e, 0xb2, 0xd1, 0x9a, + 0x2b, 0x78, 0xea, 0x27, 0xa8, 0x21, 0x88, 0x14, + 0x66, 0x7c, 0xf8, 0x85, 0x5a, 0x41, 0xa9, 0x96, + 0xf6, 0x84, 0xa4, 0x04, 0xbd, 0x05, 0x40, 0x80, + 0xff, 0x00, 0x33, 0xc2, 0xfa, 0x04, 0x94, 0xb3, + 0xc2, 0xc1, 0xab, 0x8b, 0x20, 0x50, 0x0b, 0x4a, + 0xb4, 0x29, 0xf8, 0x4a, 0x01, 0x96, 0xc0, 0x4e, + 0xb8, 0xec, 0xb1, 0x0b, 0xa1, 0x09, 0x02, 0x49, + 0x15, 0xe2, 0x97, 0x9a, 0x8e, 0x0c, 0x39, 0x5b, + 0x80, 0x8d, 0xd2, 0x2a, 0x71, 0x6b, 0xb5, 0xb4, + 0x0e, 0x60, 0xef, 0x00, 0x04, 0x51, 0xab, 0xc3, + 0x34, 0xf7, 0x62, 0x33, 0x29, 0xaf, 0x4f, 0xf5, + 0xf9, 0x6d, 0x7c, 0xf4, 0x05, 0x60, 0xb0, 0xc1, + 0x87, 0x96, 0xd0, 0x9b, 0xa0, 0x26, 0xe0, 0x86, + 0xd5, 0x88, 0xac, 0x66, 0xfa, 0x5c, 0x3e, 0x01, + 0x14, 0x00, 0x70, 0xbc, 0x40, 0x68, 0x4b, 0xaf, + 0x72, 0x05, 0x19, 0x47, 0xda, 0xc6, 0x19, 0x5c, + 0x6c, 0x82, 0xb7, 0x13, 0x80, 0x0b, 0xdd, 0x92, + 0x24, 0x2c, 0x9a, 0x9f, 0x09, 0xd5, 0x21, 0xd9, + 0x93, 0xa9, 0x15, 0x28, 0x30, 0xb1, 0x3e, 0xc6, + 0x62, 0xec, 0x83, 0xa6, 0x20, 0xd7, 0x69, 0xe9, + 0x52, 0x1a, 0x87, 0x25, 0xb2, 0xc2, 0x02, 0x97, + 0x1c, 0xdf, 0xc1, 0x07, 0x33, 0x4a, 0xc2, 0xc2, + 0xf0, 0x9a, 0x67, 0xcf, 0xab, 0x13, 0xa8, 0xeb, + 0x00, 0xd3, 0xe4, 0x9e, 0x0c, 0xb5, 0xcd, 0x41, + 0xcc, 0x9b, 0xf3, 0x0d, 0x5e, 0x85, 0xd6, 0x31, + 0xc8, 0x3f, 0x1f, 0x1d, 0xf4, 0x97, 0x27, 0x4a, + 0xf3, 0xe6, 0x6b, 0x0c, 0x6b, 0xd9, 0x1a, 0x09, + 0xf0, 0xb9, 0x16, 0xf3, 0x80, 0x61, 0x8e, 0x14, + 0x1b, 0xd5, 0x44, 0x58, 0x7d, 0xf5, 0x06, 0xa4, + 0xf4, 0x61, 0x11, 0xce, 0x1b, 0x77, 0x3d, 0x02, + 0xc9, 0x60, 0xa7, 0x1a, 0xc2, 0x37, 0x24, 0x88, + 0x39, 0xea, 0xde, 0x87, 0x02, 0x95, 0xc0, 0x5e, + 0x7e, 0xd1, 0x96, 0x74, 0xa6, 0x98, 0x2d, 0x1c, + 0x31, 0xdc, 0x55, 0xcf, 0x4d, 0xc5, 0x4e, 0xfa, + 0x1e, 0x77, 0xb5, 0xde, 0x22, 0xf0, 0xad, 0xd7, + 0xff, 0x9f, 0x3f, 0x71, 0x9b, 0x6c, 0x3d, 0xfa, + 0x11, 0x39, 0xcf, 0xc9, 0x2b, 0xa3, 0xe0, 0xe8, + 0x3e, 0x90, 0x13, 0xb1, 0x9e, 0xe4, 0x49, 0x6d, + 0xbd, 0x01, 0x4d, 0x97, 0xbf, 0xa0, 0xb9, 0xc9, + 0x7e, 0xb3, 0x50, 0x9d, 0xa9, 0xab, 0xc2, 0x5c, + 0x41, 0xa0, 0xd0, 0xa9, 0xad, 0xd7, 0xe2, 0x14, + 0xa8, 0x3b, 0x6e, 0xea, 0x3d, 0x8c, 0xc1, 0x3a, + 0x4c, 0x3b, 0x77, 0x40, 0x4a, 0xcf, 0x3e, 0xcb, + 0xfe, 0xf5, 0xe6, 0xe1, 0xaa, 0x00, 0x22, 0xd3, + 0x81, 0x16, 0xaa, 0x32, 0x81, 0x22, 0x65, 0x2f, + 0x92, 0xe8, 0x0f, 0x8c, 0xb4, 0xdb, 0x3d, 0xc3, + 0x13, 0xcf, 0x03, 0xde, 0xac, 0x67, 0xed, 0x0e, + 0x58, 0x39, 0x63, 0xfe, 0xf7, 0xf3, 0xb4, 0x47, + 0x57, 0x02, 0x02, 0xf6, 0xc9, 0x9c, 0x70, 0x63, + 0xb4, 0x4d, 0x9d, 0xf6, 0xc5, 0x10, 0x13, 0x45, + 0x4f, 0xf8, 0x42, 0x1b, 0x2d, 0x7e, 0xe4, 0xc7, + 0x83, 0x0b, 0x9d, 0xe4, 0x82, 0x3e, 0xae, 0xbd, + 0x20, 0x50, 0xf0, 0x6a, 0x5f, 0xcd, 0x24, 0xf0, + 0x1f, 0x0f, 0xdd, 0x85, 0x45, 0x10, 0x73, 0x40, + 0x86, 0xe6, 0x27, 0x02, 0xda, 0xf4, 0x62, 0x51, + 0x63, 0x1a, 0x81, 0xba, 0xa6, 0xf6, 0xbf, 0x1f, + 0x30, 0xaf, 0x5a, 0xaf, 0xa8, 0xdc, 0xc7, 0x62, + 0x47, 0x23, 0xf6, 0xe1, 0x83, 0x83, 0x14, 0x80, + 0x8f, 0x76, 0xf0, 0x83, 0x42, 0xa7, 0x6d, 0x08, + 0x37, 0x0b, 0x04, 0x92, 0x6f, 0x98, 0x55, 0x9b, + 0x68, 0x8d, 0x48, 0x77, 0x1d, 0x04, 0xc2, 0xea, + 0xae, 0x36, 0x81, 0x3b, 0xc5, 0x25, 0x7d, 0x2f, + 0xe0, 0xde, 0x4d, 0x88, 0x95, 0x99, 0x22, 0x6e, + 0xe9, 0x2e, 0x2f, 0xcc, 0x8d, 0x64, 0x06, 0xf7, + 0x80, 0xa9, 0xe0, 0x70, 0x3f, 0x21, 0x92, 0xe1, + 0x47, 0x0a, 0x20, 0x80, 0x2a, 0x0a, 0xa0, 0x37, + 0x28, 0xcc, 0x61, 0x0f, 0x64, 0x35, 0xab, 0x7d, + 0xff, 0x2d, 0xe5, 0x2d, 0x1b, 0x50, 0xdf, 0x6d, + 0xac, 0x63, 0x01, 0xde, 0x41, 0xe7, 0x55, 0x5d, + 0x1a, 0x9e, 0xca, 0x7c, 0xa3, 0x2e, 0xcf, 0x91, + 0x0d, 0x75, 0xed, 0x63, 0x4d, 0x16, 0xb5, 0xc8, + 0x03, 0x30, 0x72, 0xc0, 0x7c, 0x1b, 0x78, 0xc5, + 0x0e, 0xab, 0x25, 0x46, 0xce, 0xcc, 0xec, 0x69, + 0x13, 0x58, 0x15, 0xe9, 0x5c, 0xe3, 0xb4, 0xa5, + 0x65, 0xca, 0x8c, 0x0b, 0x29, 0xd4, 0x04, 0x1c, + 0x97, 0x1a, 0x8f, 0x04, 0x05, 0x3c, 0xc0, 0xa3, + 0xe3, 0x0e, 0xb8, 0x08, 0x9a, 0xf4, 0x30, 0xe0, + 0x92, 0x98, 0x64, 0x00, 0x44, 0x0e, 0x70, 0xc9, + 0x69, 0xd0, 0xab, 0x8f, 0x0c, 0x34, 0x89, 0x11, + 0x8b, 0x68, 0x00, 0xa6, 0x5d, 0x71, 0x94, 0xa8, + 0x44, 0xe5, 0xb3, 0xee, 0x63, 0x00, 0x54, 0x96, + 0x32, 0x53, 0xa2, 0x4c, 0xe5, 0x28, 0x4d, 0x22, + 0x19, 0x91, 0xa4, 0xd2, 0x00, 0x08, 0xa8, 0xe2, + 0x61, 0x0a, 0x80, 0x12, 0x90, 0xb4, 0xd2, 0x8d, + 0x92, 0xe4, 0xc1, 0x07, 0x15, 0xb4, 0x82, 0x61, + 0x32, 0xa2, 0x52, 0xc1, 0x4c, 0xe6, 0x0b, 0xc8, + 0x87, 0x84, 0x7b, 0x81, 0x82, 0x05, 0x94, 0x84, + 0x09, 0x2f, 0x94, 0x49, 0x4d, 0x1a, 0x30, 0x2f, + 0x57, 0xc6, 0xdb, 0x93, 0x65, 0xe2, 0x31, 0xcd, + 0x6a, 0x7a, 0x73, 0x06, 0x92, 0x52, 0x94, 0x0f, + 0x53, 0xe1, 0x87, 0x5c, 0x7d, 0xf3, 0x9c, 0x2f, + 0xd8, 0xa3, 0x39, 0x27, 0x70, 0x2b, 0x9b, 0x64, + 0x0b, 0x14, 0xeb, 0x8c, 0x41, 0x02, 0xdc, 0xe5, + 0x4a, 0x45, 0xa2, 0x33, 0x5e, 0xd9, 0xc4, 0xd5, + 0x08, 0xa8, 0x05, 0x4c, 0x0b, 0x48, 0x0a, 0x99, + 0x32, 0x98, 0x27, 0x43, 0xcc, 0x75, 0x4f, 0x8c, + 0xe1, 0x42, 0x93, 0x29, 0xd3, 0xa6, 0x09, 0xa6, + 0x04, 0x80, 0x7e, 0xc2, 0x20, 0x82, 0xfc, 0x2b, + 0x68, 0x30, 0xf5, 0x85, 0xd0, 0x12, 0xec, 0x10, + 0xff, 0xa0, 0x3d, 0x10, 0xa2, 0x44, 0xbf, 0xc9, + 0xcc, 0x1c, 0x90, 0xe1, 0x5e, 0x20, 0xbd, 0x17, + 0x5d, 0x30, 0xda, 0x03, 0xcd, 0x6d, 0x54, 0x99, + 0xc6, 0xdc, 0x14, 0x13, 0x10, 0x78, 0x52, 0x74, + 0xee, 0x71, 0x56, 0x24, 0xf5, 0x81, 0x49, 0x5b, + 0x3a, 0xd1, 0x9c, 0xb9, 0xb3, 0xa4, 0x7d, 0x72, + 0x53, 0x0a, 0xd6, 0xa4, 0x53, 0x0b, 0xed, 0x25, + 0x01, 0x7c, 0xb9, 0x19, 0x28, 0x2d, 0x24, 0x19, + 0x5e, 0xf1, 0x74, 0x6c, 0x3b, 0xd0, 0xe9, 0x50, + 0x2d, 0x25, 0xc6, 0x9e, 0x36, 0x66, 0xa9, 0x8d, + 0xfa, 0x69, 0x50, 0x9b, 0x20, 0xb7, 0x5d, 0x39, + 0xc1, 0x57, 0x82, 0x43, 0xd8, 0x1c, 0x85, 0x42, + 0x34, 0x07, 0xf8, 0xee, 0x35, 0x0b, 0x7b, 0xa5, + 0x37, 0x82, 0xe7, 0x55, 0xa2, 0x99, 0xf5, 0xac, + 0x8e, 0x94, 0x21, 0x5a, 0x89, 0xf6, 0x0d, 0x02, + 0xbc, 0xab, 0x8c, 0x65, 0xed, 0xaa, 0xfb, 0xa4, + 0x12, 0x57, 0x92, 0x1c, 0x00, 0x5c, 0x66, 0x45, + 0x99, 0x77, 0xea, 0x4a, 0x12, 0x8b, 0x70, 0x75, + 0xad, 0x68, 0x05, 0xa4, 0x04, 0x3c, 0xd2, 0x55, + 0x7b, 0x3e, 0x20, 0x6d, 0x45, 0x33, 0x87, 0x42, + 0x00, 0xbb, 0xd6, 0xb9, 0xa6, 0x30, 0xac, 0x2b, + 0x01, 0x1c, 0x11, 0xa2, 0x79, 0x84, 0x5a, 0x2d, + 0xc1, 0x5b, 0x85, 0x74, 0x40, 0xd2, 0x14, 0x80, + 0x9a, 0xec, 0x70, 0x86, 0x91, 0x0e, 0xa9, 0x07, + 0x56, 0xfe, 0xd8, 0x10, 0x7e, 0x9c, 0x8e, 0x74, + 0x0e, 0x59, 0x0b, 0x75, 0x28, 0x26, 0x00, 0x5e, + 0xf1, 0x06, 0x3b, 0x68, 0x9c, 0x58, 0x24, 0xe3, + 0xe8, 0xd5, 0x57, 0xbd, 0x16, 0xb5, 0x5e, 0x9d, + 0x80, 0x40, 0x51, 0x07, 0x82, 0xd3, 0xda, 0x23, + 0x40, 0xa4, 0x1d, 0xa8, 0x79, 0x40, 0xeb, 0x55, + 0xd1, 0xc6, 0x8d, 0x5e, 0x37, 0x95, 0x69, 0xd0, + 0x04, 0xa9, 0xd9, 0xcc, 0x79, 0x69, 0x3a, 0xcf, + 0xff, 0x99, 0xd8, 0xab, 0x22, 0x38, 0xc8, 0x40, + 0xe2, 0x16, 0x4c, 0x46, 0x7a, 0x1e, 0x05, 0xee, + 0x82, 0x22, 0xda, 0x1a, 0x56, 0x02, 0x66, 0x64, + 0x11, 0x71, 0xf5, 0xb1, 0x96, 0xe7, 0x10, 0xf4, + 0xb0, 0xbf, 0x95, 0x00, 0x75, 0x4f, 0xe6, 0x3b, + 0xf9, 0xc5, 0x87, 0x66, 0x4a, 0xa0, 0xac, 0xf2, + 0xa0, 0x40, 0xb2, 0x35, 0x7e, 0x84, 0x5b, 0x2d, + 0xdb, 0x6e, 0x7e, 0xfe, 0xe2, 0x26, 0x05, 0x5c, + 0x91, 0x51, 0xd5, 0x21, 0x80, 0x5f, 0x2c, 0x12, + 0xa8, 0x04, 0x00, 0xc6, 0xbf, 0x24, 0x29, 0x0b, + 0xc4, 0x0c, 0x10, 0x98, 0xc1, 0xfc, 0x97, 0x73, + 0xe8, 0xbd, 0xc7, 0xcf, 0xf0, 0x13, 0x15, 0xfb, + 0xda, 0xc3, 0x73, 0x16, 0x2e, 0x1b, 0x59, 0x41, + 0x75, 0x60, 0xc8, 0x40, 0x26, 0x01, 0xd5, 0xe1, + 0x91, 0x19, 0xb3, 0x68, 0xb2, 0xb2, 0xac, 0x46, + 0xc0, 0x90, 0x69, 0x22, 0x5a, 0x0e, 0x2c, 0x00, + 0x92, 0x48, 0x07, 0x35, 0x3a, 0x79, 0x93, 0x7f, + 0xef, 0x72, 0x5e, 0x1e, 0x54, 0xf5, 0x08, 0x50, + 0xed, 0xd4, 0xd7, 0x26, 0xf6, 0xd5, 0x0d, 0x6f, + 0x88, 0x76, 0xc6, 0x52, 0x92, 0xda, 0xd2, 0x9a, + 0x42, 0xec, 0xc0, 0x35, 0x40, 0xed, 0x6b, 0x21, + 0xdb, 0xac, 0xfb, 0x91, 0x09, 0x3b, 0xe4, 0x45, + 0x13, 0x3b, 0x2f, 0x73, 0x97, 0x25, 0xbc, 0x11, + 0x80, 0x0b, 0x22, 0x99, 0x75, 0xec, 0xc0, 0xd6, + 0xf5, 0x00, 0x22, 0x37, 0xcd, 0xc8, 0xbb, 0x03, + 0x0e, 0x90, 0x43, 0x20, 0xe4, 0x25, 0xc8, 0xb7, + 0x75, 0x57, 0xdd, 0xf1, 0x42, 0xc6, 0xb5, 0x9a, + 0x0d, 0xe1, 0xa7, 0xc7, 0x70, 0xf5, 0x8b, 0x60, + 0x8b, 0xfc, 0x11, 0x10, 0x08, 0x45, 0xbd, 0x27, + 0xec, 0x2d, 0x6d, 0xb0, 0xd2, 0xa5, 0x27, 0xb2, + 0xcb, 0xab, 0x15, 0x1e, 0x12, 0x3e, 0xb8, 0x25, + 0x68, 0x25, 0x46, 0xad, 0x1e, 0x11, 0x95, 0x19, + 0xff, 0xd3, 0xb2, 0xdc, 0xdc, 0x5f, 0x35, 0x17, + 0x36, 0x1c, 0x54, 0x17, 0x9c, 0x55, 0x2c, 0xc5, + 0x49, 0xeb, 0x37, 0x86, 0x34, 0x78, 0xe9, 0x11, + 0x62, 0x1a, 0x04, 0xbe, 0x91, 0x64, 0x61, 0x85, + 0x6a, 0x73, 0x76, 0x1d, 0x52, 0x02, 0x02, 0x00, + 0x55, 0x91, 0x7d, 0x06, 0x01, 0x67, 0xab, 0x02, + 0xb1, 0x2c, 0xfa, 0xaa, 0xcf, 0x4e, 0x06, 0xb4, + 0xc4, 0xbc, 0xea, 0x34, 0x14, 0xe2, 0xc4, 0xad, + 0xe0, 0xfb, 0x33, 0xa2, 0x4b, 0xe0, 0xd4, 0x52, + 0xd1, 0x26, 0x00, 0x2c, 0x2a, 0xf1, 0x7d, 0x14, + 0x29, 0x69, 0x55, 0x23, 0xaa, 0xce, 0x47, 0x9b, + 0x63, 0x0f, 0x52, 0xda, 0x95, 0x28, 0x78, 0x3a, + 0x55, 0x82, 0xfc, 0x91, 0xa8, 0xc1, 0x5b, 0xba, + 0x16, 0xa4, 0x7a, 0x58, 0x33, 0xb4, 0x73, 0x9f, + 0x60, 0x6d, 0x36, 0x59, 0xd3, 0x2f, 0x35, 0x9d, + 0xd5, 0x76, 0x74, 0xaa, 0x7c, 0x68, 0x0d, 0x9f, + 0xe0, 0xc4, 0xa8, 0x02, 0x73, 0xff, 0x1a, 0x1d, + 0x82, 0x62, 0x9b, 0xa5, 0xda, 0x5b, 0x38, 0x33, + 0xa7, 0x81, 0xf0, 0x6c, 0x40, 0xf2, 0x0e, 0x6a, + 0xd3, 0x96, 0x22, 0xa2, 0xc9, 0x02, 0xca, 0x6b, + 0x8b, 0x28, 0xcf, 0xe7, 0xc2, 0x07, 0x44, 0xb8, + 0xad, 0xc1, 0x27, 0xcf, 0x5a, 0x4d, 0xad, 0xfe, + 0x15, 0x21, 0x73, 0x5d, 0xee, 0xf0, 0x99, 0xfa, + 0xcf, 0xba, 0x81, 0xe8, 0x96, 0xd9, 0x7d, 0x1d, + 0x64, 0xb7, 0x7b, 0x40, 0xfc, 0xd6, 0xc2, 0x8d, + 0x5f, 0xe7, 0x6c, 0x35, 0x0b, 0x76, 0x61, 0x2b, + 0xdc, 0x75, 0xdf, 0x06, 0x54, 0x00, 0x03, 0x8f, + 0x45, 0xdd, 0xa3, 0xcb, 0xf6, 0x10, 0xef, 0x61, + 0x1f, 0x82, 0x0b, 0xc8, 0xdb, 0x9f, 0x6b, 0xae, + 0xb2, 0xa2, 0xa6, 0x9f, 0xef, 0x50, 0x99, 0xe1, + 0x63, 0x2c, 0xd2, 0xb4, 0x0b, 0x69, 0x1b, 0x61, + 0xbf, 0x9c, 0xd4, 0x22, 0xa0, 0x2d, 0xa2, 0x4b, + 0xff, 0x9e, 0xe3, 0x18, 0x6c, 0xbc, 0xd9, 0xf4, + 0xf5, 0xf8, 0xab, 0x32, 0x6c, 0x62, 0x91, 0xd3, + 0x90, 0x35, 0x01, 0x68, 0x2d, 0xda, 0x50, 0x0e, + 0x45, 0x95, 0xaf, 0xfb, 0xc2, 0x74, 0x36, 0x78, + 0xc1, 0x61, 0x2e, 0x8d, 0x04, 0xeb, 0xdb, 0xb1, + 0xe9, 0xae, 0x8a, 0xcd, 0x75, 0xed, 0x55, 0xed, + 0x65, 0x6f, 0x2a, 0x3a, 0x77, 0x7a, 0x21, 0x91, + 0xfc, 0xdc, 0x8a, 0x03, 0xdd, 0xb9, 0xac, 0x29, + 0x65, 0xd1, 0x5d, 0x80, 0x8c, 0xe4, 0x2a, 0x57, + 0x42, 0x14, 0x20, 0x09, 0xd3, 0xdc, 0x7b, 0x0f, + 0x8b, 0xe4, 0xbb, 0xeb, 0xa4, 0x53, 0xb6, 0xbf, + 0x53, 0x5e, 0x9b, 0x04, 0x58, 0x91, 0x97, 0xf9, + 0xc8, 0x8b, 0xcb, 0x2f, 0xce, 0x75, 0x95, 0x99, + 0x23, 0xdd, 0x14, 0x3c, 0x31, 0xb5, 0x0d, 0xbd, + 0xe1, 0x93, 0xa5, 0xdd, 0xdc, 0xf7, 0x86, 0x1e, + 0xc5, 0xc9, 0x6e, 0xe9, 0x6f, 0x4b, 0x0d, 0x0a, + 0x47, 0x77, 0xe8, 0xdd, 0xdb, 0x3e, 0x58, 0xec, + 0x6a, 0xbe, 0xce, 0x7f, 0x97, 0x00, 0xa3, 0x29, + 0x24, 0x82, 0xc1, 0x57, 0x9d, 0xbd, 0x16, 0x7b, + 0x0f, 0x76, 0x62, 0x8d, 0x43, 0xc7, 0xab, 0xde, + 0x3d, 0x2e, 0x9e, 0xbc, 0xd3, 0xbf, 0x4c, 0xba, + 0xcb, 0x23, 0x09, 0x69, 0x07, 0x20, 0x7d, 0xb9, + 0x3b, 0x5f, 0x79, 0xd6, 0xd4, 0x38, 0x08, 0x0a, + 0xa0, 0xa4, 0x65, 0x2f, 0xab, 0xf4, 0x95, 0xb3, + 0x3c, 0xf5, 0x0c, 0x7c, 0x70, 0x43, 0x8c, 0xe5, + 0xfa, 0x31, 0x7e, 0xfe, 0x43, 0xb3, 0xef, 0x76, + 0xed, 0x73, 0x7f, 0xfa, 0x25, 0xc1, 0x67, 0x43, + 0x63, 0x1f, 0xbe, 0x54, 0x81, 0x0a, 0x54, 0x2f, + 0xf3, 0x1e, 0x49, 0x16, 0x8e, 0xba, 0xf0, 0x8b, + 0x4f, 0x7c, 0xf3, 0x48, 0x9f, 0x21, 0x98, 0x06, + 0x82, 0x2a, 0xec, 0xce, 0x83, 0x7a, 0x73, 0x90, + 0xb9, 0xbb, 0xdf, 0xcf, 0x96, 0x26, 0x36, 0xbc, + 0xff, 0xea, 0x3b, 0x7f, 0xe8, 0x99, 0xd1, 0x1b, + 0x04, 0xc0, 0x2b, 0x8b, 0x57, 0x71, 0xdb, 0x57, + 0x3b, 0xdd, 0x63, 0x64, 0xd5, 0x41, 0x3d, 0x38, + 0xc7, 0x7b, 0xf9, 0xc7, 0x19, 0x73, 0x76, 0x7e, + 0xfe, 0xf1, 0x47, 0xc0, 0xe3, 0x6e, 0x29, 0x80, + 0x19, 0x6e, 0x93, 0x0f, 0xdf, 0x35, 0x04, 0xd3, + 0xa0, 0x27, 0xf3, 0x36, 0x7a, 0x5c, 0x96, 0x77, + 0xa6, 0xe7, 0x80, 0x4b, 0x66, 0x02, 0xab, 0x35, + 0x68, 0x20, 0xe0, 0x7f, 0x14, 0x90, 0x70, 0x4c, + 0xd6, 0x64, 0xb2, 0x67, 0x71, 0x2f, 0x77, 0x80, + 0x8e, 0x95, 0x3f, 0x84, 0x45, 0x01, 0xe1, 0x57, + 0x7c, 0xe1, 0x63, 0x18, 0x51, 0x33, 0x2e, 0x42, + 0xb7, 0x79, 0xc3, 0x97, 0x4e, 0x81, 0xd2, 0x7e, + 0x6d, 0xc2, 0x00, 0xba, 0x20, 0x7a, 0x3f, 0x60, + 0x7f, 0xc1, 0xa2, 0x0f, 0xe1, 0xe1, 0x54, 0xd8, + 0xb6, 0x7e, 0x2a, 0xa8, 0x5b, 0x00, 0x47, 0x82, + 0xe6, 0xf6, 0x46, 0x5a, 0xf7, 0x73, 0x81, 0x86, + 0x80, 0x2a, 0xe6, 0x23, 0x36, 0xd8, 0x80, 0xb7, + 0x47, 0x79, 0xe7, 0xf6, 0x80, 0x78, 0x46, 0x5e, + 0x5b, 0xf7, 0x76, 0x3f, 0xa1, 0x37, 0xab, 0x52, + 0x14, 0x48, 0xb8, 0x3e, 0x4b, 0x46, 0x0f, 0x0e, + 0x85, 0x1a, 0xf0, 0xf2, 0x84, 0x61, 0x68, 0x48, + 0x07, 0x97, 0x5e, 0x59, 0x67, 0x5c, 0x5b, 0x27, + 0x83, 0x28, 0xc2, 0x5c, 0x07, 0x72, 0x83, 0x24, + 0x18, 0x51, 0x10, 0xd7, 0x7a, 0x62, 0xf8, 0x73, + 0xb9, 0x35, 0x3a, 0x6d, 0x78, 0x0f, 0x68, 0xd8, + 0x7c, 0x15, 0xb4, 0x64, 0xa8, 0xd2, 0x4f, 0xa8, + 0x11, 0x2d, 0x70, 0xf8, 0x00, 0x2c, 0x58, 0x87, + 0x76, 0x38, 0x72, 0x31, 0xe4, 0x44, 0xad, 0x82, + 0x85, 0x5d, 0xc6, 0x5b, 0xa3, 0xf6, 0x80, 0xe4, + 0x16, 0x38, 0xd2, 0x01, 0x7d, 0xc5, 0x17, 0x82, + 0x6e, 0x37, 0x88, 0xaa, 0x36, 0x89, 0x70, 0x47, + 0xff, 0x8a, 0x12, 0x91, 0x86, 0x4b, 0x84, 0x73, + 0xd5, 0x11, 0x43, 0x29, 0x61, 0x69, 0x8f, 0x18, + 0x89, 0x9e, 0xe7, 0x3f, 0x99, 0x48, 0x87, 0xb7, + 0x40, 0x8b, 0xb6, 0x17, 0x8a, 0x79, 0xc1, 0x87, + 0x5d, 0x08, 0x86, 0x7e, 0x12, 0x20, 0xa0, 0xb8, + 0x85, 0x78, 0x37, 0x8a, 0xc4, 0x57, 0x1d, 0xc0, + 0x03, 0x79, 0x7e, 0x68, 0x0c, 0xaa, 0x78, 0x8b, + 0x94, 0x07, 0x22, 0x03, 0x98, 0x84, 0x72, 0xf8, + 0x82, 0x64, 0x78, 0x25, 0x51, 0x18, 0x8a, 0x5a, + 0x56, 0x6b, 0xa7, 0x98, 0x23, 0x2a, 0x93, 0x17, + 0x6b, 0xb4, 0x2c, 0xbc, 0xa8, 0x6f, 0x11, 0x05, + 0x1b, 0xbe, 0x13, 0x8c, 0xfa, 0xb5, 0x7e, 0x24, + 0x48, 0x7c, 0xce, 0x08, 0x30, 0xdf, 0xa1, 0x6c, + 0xcb, 0xd0, 0x1b, 0xda, 0x88, 0x2e, 0x25, 0x80, + 0x1b, 0x3f, 0xb6, 0x0f, 0x02, 0xc0, 0x17, 0x7d, + 0xf1, 0x7e, 0x9d, 0x67, 0x81, 0x84, 0x37, 0x82, + 0x13, 0xf0, 0x6b, 0x13, 0x04, 0x3e, 0x64, 0xf1, + 0x17, 0x97, 0xd1, 0x62, 0x5e, 0x68, 0x29, 0x61, + 0x73, 0x68, 0x45, 0x12, 0x6e, 0xe5, 0x96, 0x13, + 0x86, 0x67, 0x45, 0x87, 0x07, 0x8f, 0x93, 0x27, + 0x84, 0xb5, 0xe8, 0x83, 0xec, 0x67, 0x65, 0xf4, + 0x68, 0x8f, 0x86, 0x37, 0x73, 0x2d, 0x11, 0x47, + 0x5c, 0x02, 0x83, 0x80, 0x68, 0x6e, 0xc1, 0x85, + 0x1d, 0x9e, 0xe3, 0x8e, 0x63, 0xe8, 0x8b, 0x71, + 0x94, 0x41, 0x0c, 0x14, 0x92, 0xf7, 0x25, 0x8d, + 0x85, 0x82, 0x57, 0xfe, 0x91, 0x78, 0x15, 0xa0, + 0x92, 0x7d, 0x92, 0x12, 0x98, 0xe6, 0x5e, 0xc0, + 0x43, 0x92, 0x89, 0x38, 0x48, 0x46, 0xe8, 0x0b, + 0x27, 0xc8, 0x5a, 0xd2, 0xb0, 0x30, 0xec, 0x08, + 0x24, 0x1e, 0x72, 0x16, 0x05, 0x52, 0x5a, 0x56, + 0xc1, 0x7f, 0x36, 0x42, 0x26, 0xf1, 0x81, 0x42, + 0x4a, 0xa9, 0x72, 0xab, 0x97, 0x1b, 0x2f, 0xc2, + 0x84, 0x59, 0xf1, 0xb1, 0x8b, 0x11, 0x18, 0x61, + 0x1a, 0xf8, 0x1a, 0x32, 0xc9, 0x72, 0x54, 0x98, + 0x1b, 0xc0, 0x04, 0x2e, 0xf0, 0xe2, 0x28, 0x48, + 0x99, 0x84, 0x45, 0xc9, 0x10, 0x1b, 0xa8, 0x0c, + 0xfb, 0x63, 0x76, 0xdb, 0xc3, 0x0f, 0xce, 0x81, + 0x3d, 0x23, 0x91, 0x8c, 0x63, 0xa5, 0x5b, 0x06, + 0xd0, 0x0b, 0xf0, 0x83, 0x30, 0x65, 0xf5, 0x4b, + 0x22, 0x20, 0x33, 0xce, 0x62, 0x76, 0x42, 0x11, + 0x69, 0x82, 0x82, 0x96, 0xce, 0x72, 0x94, 0x82, + 0x86, 0x22, 0x07, 0x20, 0x00, 0xde, 0x40, 0x97, + 0x06, 0x63, 0x97, 0xb7, 0x01, 0x12, 0x67, 0xf7, + 0x38, 0x90, 0x08, 0x6c, 0x1c, 0x92, 0x97, 0xda, + 0x43, 0x1f, 0x7e, 0x05, 0x99, 0x68, 0x59, 0x99, + 0xde, 0x50, 0x16, 0xf4, 0x11, 0x99, 0x9e, 0x15, + 0x38, 0x14, 0x89, 0x97, 0x68, 0xb9, 0x97, 0x1f, + 0x12, 0x97, 0x90, 0x38, 0x12, 0x43, 0x02, 0x12, + 0x8f, 0x32, 0x01, 0x11, 0x00, 0x00, 0x3b, +}; + +static const uint8_t data_index_htm[] = +{ + /* /index.htm */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, + 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, + 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x36, 0x39, + 0x2d, 0x31, 0x22, 0x3e, 0x0a, 0x3c, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3e, 0x54, 0x69, 0x76, 0x61, + 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, 0x20, + 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x20, 0x54, 0x4d, 0x34, 0x43, 0x31, 0x32, 0x39, + 0x58, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x4b, 0x69, + 0x74, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, + 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x69, 0x63, 0x6f, + 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x2e, 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x73, 0x2f, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, + 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, + 0x6e, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, + 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, + 0x22, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, + 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2e, 0x2f, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x66, + 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, + 0x63, 0x6f, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, + 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, + 0x2f, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x0a, 0x0a, 0x3c, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x73, 0x65, 0x74, 0x20, 0x72, 0x6f, + 0x77, 0x73, 0x3d, 0x22, 0x31, 0x32, 0x30, 0x2c, + 0x2a, 0x2c, 0x34, 0x35, 0x22, 0x20, 0x63, 0x6f, + 0x6c, 0x73, 0x3d, 0x22, 0x2a, 0x22, 0x20, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, + 0x22, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, + 0x30, 0x22, 0x3e, 0x0a, 0x3c, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x20, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x20, + 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2e, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x68, 0x74, + 0x6d, 0x22, 0x3e, 0x0a, 0x3c, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x73, 0x65, 0x74, 0x20, 0x72, 0x6f, + 0x77, 0x73, 0x3d, 0x22, 0x2a, 0x22, 0x20, 0x63, + 0x6f, 0x6c, 0x73, 0x3d, 0x22, 0x32, 0x35, 0x2c, + 0x37, 0x35, 0x22, 0x20, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, + 0x22, 0x31, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x3e, + 0x0a, 0x3c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x69, + 0x64, 0x65, 0x22, 0x20, 0x73, 0x72, 0x63, 0x3d, + 0x22, 0x2e, 0x2f, 0x73, 0x69, 0x64, 0x65, 0x2e, + 0x68, 0x74, 0x6d, 0x22, 0x3e, 0x0a, 0x3c, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x22, + 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2e, 0x2f, + 0x74, 0x69, 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x3e, + 0x0a, 0x3c, 0x2f, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x3c, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, + 0x22, 0x20, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, + 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x6e, 0x6f, 0x22, + 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2e, 0x2f, + 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x68, + 0x74, 0x6d, 0x22, 0x3e, 0x0a, 0x3c, 0x2f, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x73, 0x65, 0x74, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0x0a, 0x0a, +}; + +static const uint8_t data_io_ssi[] = +{ + /* /io.ssi */ + 0x2f, 0x69, 0x6f, 0x2e, 0x73, 0x73, 0x69, 0x00, + + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x39, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0x0a, + 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, + 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, + 0x3b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, + 0x3d, 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x36, + 0x39, 0x2d, 0x31, 0x22, 0x20, 0x68, 0x74, 0x74, + 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2d, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x0d, + 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2e, 0x2f, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x73, + 0x73, 0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, + 0x65, 0x74, 0x22, 0x20, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x3d, 0x22, 0x73, 0x63, 0x72, 0x65, 0x65, + 0x6e, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3e, 0x49, 0x2f, 0x4f, 0x20, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x3c, + 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0d, + 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x0d, 0x0a, 0x0d, 0x0a, 0x3c, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x31, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x49, + 0x2f, 0x4f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x0d, + 0x0a, 0x3c, 0x68, 0x72, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x3d, 0x22, 0x32, 0x22, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, + 0x25, 0x22, 0x3e, 0x0d, 0x0a, 0x54, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, + 0x52, 0x54, 0x4f, 0x53, 0x20, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x0d, 0x0a, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x0d, 0x0a, 0x3c, + 0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x69, + 0x3e, 0x3c, 0x69, 0x3e, 0x4c, 0x45, 0x44, 0x20, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x20, 0x52, + 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x69, 0x3e, 0x0d, + 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x62, 0x72, + 0x3e, 0x0d, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x61, 0x74, + 0x65, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x6e, 0x2d, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, + 0x4c, 0x45, 0x44, 0x20, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x73, 0x2e, 0x0d, 0x0a, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x0d, 0x0a, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x20, 0x72, + 0x61, 0x74, 0x65, 0x3a, 0x20, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x6c, 0x65, 0x64, 0x72, 0x61, 0x74, + 0x65, 0x2d, 0x2d, 0x3e, 0x20, 0x6d, 0x69, 0x6c, + 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x2e, 0x0d, 0x0a, 0x3c, 0x62, 0x72, 0x3e, + 0x0d, 0x0a, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, + 0x67, 0x65, 0x74, 0x22, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, + 0x2e, 0x63, 0x67, 0x69, 0x22, 0x3e, 0x0d, 0x0a, + 0x4e, 0x65, 0x77, 0x20, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x20, 0x72, 0x61, 0x74, 0x65, 0x3a, + 0x0d, 0x0a, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, + 0x35, 0x30, 0x30, 0x22, 0x20, 0x6d, 0x61, 0x78, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x22, + 0x34, 0x22, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x3d, + 0x22, 0x35, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3e, + 0x0d, 0x0a, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x0d, + 0x0a, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x20, 0x72, 0x61, 0x74, 0x65, 0x22, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x3e, 0x0d, + 0x0a, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, + 0x0d, 0x0a, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x69, + 0x3e, 0x53, 0x70, 0x69, 0x64, 0x65, 0x72, 0x20, + 0x53, 0x70, 0x65, 0x65, 0x64, 0x3c, 0x2f, 0x69, + 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x3c, + 0x62, 0x72, 0x3e, 0x0d, 0x0a, 0x54, 0x68, 0x69, + 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x61, 0x74, 0x65, 0x20, 0x61, 0x74, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x20, 0x63, 0x72, 0x61, 0x77, 0x6c, 0x20, 0x61, + 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4c, 0x43, 0x44, 0x2e, 0x0d, 0x0a, 0x3c, + 0x62, 0x72, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x0d, + 0x0a, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0x20, + 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x72, 0x61, 0x74, + 0x65, 0x3a, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0x2d, 0x2d, + 0x3e, 0x20, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x0d, + 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, + 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x72, 0x61, 0x74, 0x65, 0x2e, 0x63, 0x67, + 0x69, 0x22, 0x3e, 0x0d, 0x0a, 0x4e, 0x65, 0x77, + 0x20, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0x20, + 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x72, 0x61, 0x74, + 0x65, 0x3a, 0x0d, 0x0a, 0x3c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3d, 0x22, 0x31, 0x30, 0x22, 0x20, 0x6d, 0x61, + 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, + 0x22, 0x33, 0x22, 0x20, 0x73, 0x69, 0x7a, 0x65, + 0x3d, 0x22, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x22, + 0x3e, 0x0d, 0x0a, 0x6d, 0x69, 0x6c, 0x6c, 0x69, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2e, + 0x0d, 0x0a, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x20, 0x73, 0x70, 0x69, + 0x64, 0x65, 0x72, 0x20, 0x6d, 0x6f, 0x76, 0x65, + 0x20, 0x72, 0x61, 0x74, 0x65, 0x22, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, + 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0d, 0x0a, + 0x3c, 0x62, 0x3e, 0x4e, 0x6f, 0x74, 0x65, 0x3a, + 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x49, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, + 0x65, 0x20, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67, + 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x73, 0x70, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x20, 0x61, 0x6c, 0x69, 0x76, + 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0d, 0x0a, + 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x70, 0x69, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x6f, + 0x76, 0x65, 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x6d, 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x20, + 0x61, 0x6e, 0x79, 0x20, 0x66, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x28, 0x73, 0x69, 0x6e, 0x63, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x20, 0x69, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, + 0x67, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, + 0x29, 0x2e, 0x0d, 0x0a, 0x3c, 0x2f, 0x75, 0x6c, + 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0x0d, 0x0a, +}; + +static const uint8_t data_lwipstat_ssi[] = +{ + /* /lwipstat.ssi */ + 0x2f, 0x6c, 0x77, 0x69, 0x70, 0x73, 0x74, 0x61, + 0x74, 0x2e, 0x73, 0x73, 0x69, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x39, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x63, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x49, 0x53, + 0x4f, 0x2d, 0x38, 0x38, 0x36, 0x39, 0x2d, 0x31, + 0x22, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, + 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x72, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x22, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x35, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x3c, + 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x2e, 0x2f, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x73, 0x73, 0x22, + 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, + 0x22, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d, + 0x22, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, + 0x3e, 0x0a, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3e, 0x6c, 0x77, 0x49, 0x50, 0x20, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x0a, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0a, 0x3c, 0x68, 0x31, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x6c, 0x77, 0x49, 0x50, + 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x31, 0x3e, + 0x0a, 0x3c, 0x68, 0x72, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x3d, 0x22, 0x32, 0x22, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, + 0x25, 0x22, 0x3e, 0x0a, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x20, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x77, 0x49, 0x50, 0x20, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x75, 0x74, 0x6f, + 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x0a, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, + 0x66, 0x69, 0x76, 0x65, 0x20, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x0a, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x3c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, + 0x25, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3d, 0x22, 0x31, 0x22, 0x3e, 0x0a, 0x3c, + 0x74, 0x72, 0x3e, 0x0a, 0x3c, 0x74, 0x68, 0x3e, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x3c, 0x62, + 0x72, 0x3e, 0x54, 0x79, 0x70, 0x65, 0x3c, 0x2f, + 0x74, 0x68, 0x3e, 0x0a, 0x3c, 0x74, 0x68, 0x3e, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x3c, + 0x62, 0x72, 0x3e, 0x53, 0x65, 0x6e, 0x74, 0x3c, + 0x2f, 0x74, 0x68, 0x3e, 0x0a, 0x3c, 0x74, 0x68, + 0x3e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x3c, 0x62, 0x72, 0x3e, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x0a, 0x3c, 0x74, 0x68, 0x3e, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x3c, 0x62, 0x72, + 0x3e, 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x0a, 0x3c, 0x74, + 0x68, 0x3e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x75, 0x6d, 0x3c, 0x62, 0x72, 0x3e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x0a, 0x3c, 0x74, 0x68, 0x3e, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x3c, 0x62, 0x72, 0x3e, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3c, 0x2f, + 0x74, 0x68, 0x3e, 0x0a, 0x3c, 0x74, 0x68, 0x3e, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x3c, 0x62, + 0x72, 0x3e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x0a, 0x3c, 0x74, + 0x68, 0x3e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x3c, 0x62, 0x72, 0x3e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x3c, 0x2f, 0x74, 0x68, 0x3e, + 0x0a, 0x3c, 0x74, 0x68, 0x3e, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3c, 0x62, 0x72, + 0x3e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3c, + 0x2f, 0x74, 0x68, 0x3e, 0x0a, 0x3c, 0x74, 0x68, + 0x3e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x3c, 0x62, 0x72, 0x3e, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x0a, + 0x3c, 0x74, 0x68, 0x3e, 0x4f, 0x74, 0x68, 0x65, + 0x72, 0x3c, 0x62, 0x72, 0x3e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x3c, 0x2f, 0x74, 0x68, 0x3e, + 0x0a, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x3c, + 0x74, 0x72, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x65, 0x6e, 0x2e, 0x77, 0x69, 0x6b, 0x69, 0x70, + 0x65, 0x64, 0x69, 0x61, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x77, 0x69, 0x6b, 0x69, 0x2f, 0x45, 0x74, + 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x22, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, + 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3e, + 0x4c, 0x69, 0x6e, 0x6b, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, + 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, + 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, + 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x6c, 0x69, + 0x6e, 0x6b, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x2d, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, + 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x6c, + 0x69, 0x6e, 0x6b, 0x72, 0x65, 0x63, 0x76, 0x2d, + 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x6c, 0x69, 0x6e, 0x6b, 0x64, 0x72, 0x6f, 0x70, + 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x6c, 0x69, 0x6e, 0x6b, 0x63, 0x6b, 0x73, + 0x6d, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x6c, 0x69, 0x6e, 0x6b, 0x6c, 0x65, + 0x6e, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x6c, 0x69, 0x6e, 0x6b, 0x6d, 0x65, + 0x6d, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x6c, 0x69, 0x6e, 0x6b, 0x72, 0x74, + 0x65, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x6c, 0x69, 0x6e, 0x6b, 0x70, 0x72, + 0x6f, 0x74, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, + 0x2d, 0x2d, 0x23, 0x6c, 0x69, 0x6e, 0x6b, 0x6f, + 0x70, 0x74, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, + 0x2d, 0x2d, 0x23, 0x6c, 0x69, 0x6e, 0x6b, 0x6d, + 0x69, 0x73, 0x63, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x2f, 0x74, 0x72, + 0x3e, 0x0a, 0x3c, 0x74, 0x72, 0x3e, 0x0a, 0x3c, + 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x65, 0x6e, 0x2e, 0x77, 0x69, + 0x6b, 0x69, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x77, 0x69, 0x6b, 0x69, + 0x2f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x5f, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3e, 0x41, 0x52, + 0x50, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, + 0x2d, 0x2d, 0x23, 0x61, 0x72, 0x70, 0x73, 0x65, + 0x6e, 0x74, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, + 0x2d, 0x2d, 0x23, 0x61, 0x72, 0x70, 0x72, 0x65, + 0x63, 0x76, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, + 0x2d, 0x2d, 0x23, 0x61, 0x72, 0x70, 0x64, 0x72, + 0x6f, 0x70, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, + 0x2d, 0x2d, 0x23, 0x61, 0x72, 0x70, 0x63, 0x6b, + 0x73, 0x6d, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, + 0x2d, 0x2d, 0x23, 0x61, 0x72, 0x70, 0x6c, 0x65, + 0x6e, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x61, 0x72, 0x70, 0x6d, 0x65, 0x6d, + 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x61, 0x72, 0x70, 0x72, 0x74, 0x65, 0x2d, + 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x61, 0x72, 0x70, 0x70, 0x72, 0x6f, 0x74, 0x2d, + 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x61, 0x72, 0x70, 0x6f, 0x70, 0x74, 0x2d, 0x2d, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, + 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x61, + 0x72, 0x70, 0x6d, 0x69, 0x73, 0x63, 0x2d, 0x2d, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, + 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x3c, 0x74, 0x72, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x65, 0x6e, + 0x2e, 0x77, 0x69, 0x6b, 0x69, 0x70, 0x65, 0x64, + 0x69, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x77, + 0x69, 0x6b, 0x69, 0x2f, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x5f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x5f, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, + 0x65, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3e, 0x49, + 0x43, 0x4d, 0x50, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, + 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x63, 0x6d, + 0x70, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x2d, 0x3e, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, + 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, + 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, + 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x63, + 0x6d, 0x70, 0x72, 0x65, 0x63, 0x76, 0x2d, 0x2d, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, + 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, + 0x63, 0x6d, 0x70, 0x64, 0x72, 0x6f, 0x70, 0x2d, + 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x69, 0x63, 0x6d, 0x70, 0x63, 0x6b, 0x73, 0x6d, + 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x69, 0x63, 0x6d, 0x70, 0x6c, 0x65, 0x6e, + 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x69, 0x63, 0x6d, 0x70, 0x6d, 0x65, 0x6d, + 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x69, 0x63, 0x6d, 0x70, 0x72, 0x74, 0x65, + 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x69, 0x63, 0x6d, 0x70, 0x70, 0x72, 0x6f, + 0x74, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x69, 0x63, 0x6d, 0x70, 0x6f, 0x70, + 0x74, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x69, 0x63, 0x6d, 0x70, 0x6d, 0x69, + 0x73, 0x63, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x3c, 0x2f, 0x74, 0x72, 0x3e, + 0x0a, 0x3c, 0x74, 0x72, 0x3e, 0x0a, 0x3c, 0x74, + 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x65, 0x6e, 0x2e, 0x77, 0x69, 0x6b, + 0x69, 0x70, 0x65, 0x64, 0x69, 0x61, 0x2e, 0x6f, + 0x72, 0x67, 0x2f, 0x77, 0x69, 0x6b, 0x69, 0x2f, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x5f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3d, 0x22, 0x5f, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x3e, 0x49, 0x50, 0x3c, 0x2f, 0x61, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, + 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, + 0x70, 0x73, 0x65, 0x6e, 0x74, 0x2d, 0x2d, 0x3e, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, + 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, + 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, + 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, + 0x72, 0x65, 0x63, 0x76, 0x2d, 0x2d, 0x3e, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, + 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x64, + 0x72, 0x6f, 0x70, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, + 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x63, 0x6b, + 0x73, 0x6d, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, + 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x6c, 0x65, 0x6e, + 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x69, 0x70, 0x6d, 0x65, 0x6d, 0x2d, 0x2d, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, + 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, + 0x70, 0x72, 0x74, 0x65, 0x2d, 0x2d, 0x3e, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, + 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x70, + 0x72, 0x6f, 0x74, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, + 0x21, 0x2d, 0x2d, 0x23, 0x69, 0x70, 0x6f, 0x70, + 0x74, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x69, 0x70, 0x6d, 0x69, 0x73, 0x63, + 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x3c, + 0x74, 0x72, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x65, 0x6e, 0x2e, 0x77, 0x69, 0x6b, 0x69, 0x70, + 0x65, 0x64, 0x69, 0x61, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x77, 0x69, 0x6b, 0x69, 0x2f, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x5f, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x22, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x3e, 0x54, 0x43, 0x50, + 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x74, 0x63, 0x70, 0x73, 0x65, 0x6e, + 0x74, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x74, 0x63, 0x70, 0x72, 0x65, 0x63, + 0x76, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x74, 0x63, 0x70, 0x64, 0x72, 0x6f, + 0x70, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x74, 0x63, 0x70, 0x63, 0x6b, 0x73, + 0x6d, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, + 0x2d, 0x23, 0x74, 0x63, 0x70, 0x6c, 0x65, 0x6e, + 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, + 0x23, 0x74, 0x63, 0x70, 0x6d, 0x65, 0x6d, 0x2d, + 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x74, 0x63, 0x70, 0x72, 0x74, 0x65, 0x2d, 0x2d, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, + 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x74, + 0x63, 0x70, 0x70, 0x72, 0x6f, 0x74, 0x2d, 0x2d, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, + 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x74, + 0x63, 0x70, 0x6f, 0x70, 0x74, 0x2d, 0x2d, 0x3e, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, + 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, + 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, + 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x74, 0x63, + 0x70, 0x6d, 0x69, 0x73, 0x63, 0x2d, 0x2d, 0x3e, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x2f, + 0x74, 0x72, 0x3e, 0x0a, 0x3c, 0x74, 0x72, 0x3e, + 0x0a, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x65, 0x6e, 0x2e, + 0x77, 0x69, 0x6b, 0x69, 0x70, 0x65, 0x64, 0x69, + 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x77, 0x69, + 0x6b, 0x69, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x5f, + 0x44, 0x61, 0x74, 0x61, 0x67, 0x72, 0x61, 0x6d, + 0x5f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3d, 0x22, 0x5f, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x3e, 0x55, 0x44, 0x50, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x75, 0x64, 0x70, 0x73, 0x65, 0x6e, 0x74, 0x2d, + 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x75, 0x64, 0x70, 0x72, 0x65, 0x63, 0x76, 0x2d, + 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x75, 0x64, 0x70, 0x64, 0x72, 0x6f, 0x70, 0x2d, + 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x75, 0x64, 0x70, 0x63, 0x6b, 0x73, 0x6d, 0x2d, + 0x2d, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, + 0x3c, 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, + 0x75, 0x64, 0x70, 0x6c, 0x65, 0x6e, 0x2d, 0x2d, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, + 0x74, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x75, + 0x64, 0x70, 0x6d, 0x65, 0x6d, 0x2d, 0x2d, 0x3e, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, + 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, + 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, + 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x75, 0x64, + 0x70, 0x72, 0x74, 0x65, 0x2d, 0x2d, 0x3e, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, + 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x75, 0x64, 0x70, + 0x70, 0x72, 0x6f, 0x74, 0x2d, 0x2d, 0x3e, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, + 0x3c, 0x21, 0x2d, 0x2d, 0x23, 0x75, 0x64, 0x70, + 0x6f, 0x70, 0x74, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, + 0x21, 0x2d, 0x2d, 0x23, 0x75, 0x64, 0x70, 0x6d, + 0x69, 0x73, 0x63, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x0a, 0x3c, 0x2f, 0x74, 0x72, + 0x3e, 0x0a, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, + 0x6c, 0x3e, 0x0a, +}; + +static const uint8_t data_perror_htm[] = +{ + /* /perror.htm */ + 0x2f, 0x70, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x68, 0x74, 0x6d, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x39, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, + 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x36, 0x39, + 0x2d, 0x31, 0x22, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, + 0x6e, 0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x2e, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x73, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x20, 0x72, + 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d, 0x22, 0x73, + 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x3e, 0x0a, + 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x46, + 0x6f, 0x72, 0x6d, 0x20, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x65, + 0x61, 0x64, 0x3e, 0x0a, 0x0a, 0x3c, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x68, 0x31, 0x20, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x49, + 0x2f, 0x4f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x0a, + 0x3c, 0x68, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, + 0x3d, 0x22, 0x32, 0x22, 0x20, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, + 0x22, 0x3e, 0x0a, 0x3c, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x3e, 0x0a, 0x3c, 0x62, 0x3e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3c, 0x2f, + 0x62, 0x3e, 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x3c, + 0x62, 0x72, 0x3e, 0x0a, 0x4f, 0x6f, 0x70, 0x73, + 0x20, 0x2d, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x20, 0x77, 0x61, 0x73, 0x20, 0x65, + 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x69, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x6f, + 0x72, 0x0a, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x0a, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x62, 0x72, 0x3e, + 0x0a, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, + 0x74, 0x72, 0x79, 0x20, 0x61, 0x67, 0x61, 0x69, + 0x6e, 0x21, 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x3c, + 0x62, 0x72, 0x3e, 0x0a, 0x3c, 0x66, 0x72, 0x6f, + 0x6d, 0x3e, 0x0a, 0x3c, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, + 0x30, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3d, 0x22, 0x42, 0x61, 0x63, 0x6b, 0x22, 0x20, + 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x3d, + 0x22, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x67, 0x6f, 0x28, 0x2d, 0x31, 0x29, 0x3b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x3b, 0x22, 0x3e, 0x0a, 0x3c, + 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0a, 0x3c, + 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, + 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0x0a, +}; + +static const uint8_t data_side_htm[] = +{ + /* /side.htm */ + 0x2f, 0x73, 0x69, 0x64, 0x65, 0x2e, 0x68, 0x74, + 0x6d, 0x00, + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0x0a, + 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, + 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x68, 0x74, + 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, + 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3b, 0x63, 0x68, 0x61, 0x72, 0x73, + 0x65, 0x74, 0x3d, 0x49, 0x53, 0x4f, 0x2d, 0x38, + 0x38, 0x36, 0x39, 0x2d, 0x31, 0x22, 0x3e, 0x0d, + 0x0a, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x53, 0x69, 0x64, 0x65, 0x3c, 0x2f, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, + 0x63, 0x73, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x62, + 0x6f, 0x64, 0x79, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x20, + 0x41, 0x72, 0x69, 0x61, 0x6c, 0x3b, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, + 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x70, + 0x78, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x3c, 0x2f, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, + 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, + 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0d, + 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, + 0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x69, + 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x2e, 0x2f, 0x74, 0x69, 0x2e, + 0x68, 0x74, 0x6d, 0x22, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3d, 0x22, 0x6d, 0x61, 0x69, + 0x6e, 0x22, 0x3e, 0x41, 0x62, 0x6f, 0x75, 0x74, + 0x20, 0x54, 0x49, 0x3c, 0x2f, 0x61, 0x3e, 0x0d, + 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x62, 0x72, + 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x69, 0x3e, 0x20, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x2e, 0x2f, 0x66, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x6d, + 0x61, 0x69, 0x6e, 0x22, 0x3e, 0x41, 0x62, 0x6f, + 0x75, 0x74, 0x20, 0x54, 0x69, 0x76, 0x61, 0x20, + 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x20, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3c, + 0x2f, 0x61, 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x72, + 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, + 0x6c, 0x69, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2e, 0x2f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x68, 0x74, 0x6d, + 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x3d, 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3e, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x44, 0x69, + 0x61, 0x67, 0x72, 0x61, 0x6d, 0x3c, 0x2f, 0x61, + 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x3c, + 0x62, 0x72, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x69, + 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x2e, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x22, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, + 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3e, 0x57, + 0x68, 0x79, 0x20, 0x54, 0x69, 0x76, 0x61, 0x20, + 0x43, 0x20, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x3f, 0x3c, 0x2f, 0x61, 0x3e, 0x0d, 0x0a, 0x3c, + 0x62, 0x72, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x0d, + 0x0a, 0x3c, 0x6c, 0x69, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2e, + 0x2f, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, + 0x73, 0x2e, 0x68, 0x74, 0x6d, 0x22, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x6d, + 0x61, 0x69, 0x6e, 0x22, 0x3e, 0x41, 0x62, 0x6f, + 0x75, 0x74, 0x20, 0x46, 0x72, 0x65, 0x65, 0x52, + 0x54, 0x4f, 0x53, 0x26, 0x74, 0x72, 0x61, 0x64, + 0x65, 0x3b, 0x3c, 0x2f, 0x61, 0x3e, 0x0d, 0x0a, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x62, 0x72, 0x3e, + 0x0d, 0x0a, 0x3c, 0x6c, 0x69, 0x3e, 0x20, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x6c, 0x77, 0x69, 0x70, 0x73, 0x74, 0x61, 0x74, + 0x2e, 0x73, 0x73, 0x69, 0x22, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x6d, 0x61, + 0x69, 0x6e, 0x22, 0x3e, 0x6c, 0x77, 0x49, 0x50, + 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x0d, + 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x62, 0x72, + 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x69, 0x3e, 0x20, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x69, 0x6f, 0x2e, 0x73, 0x73, 0x69, 0x22, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, + 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3e, 0x49, + 0x2f, 0x4f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x3c, 0x2f, 0x61, 0x3e, 0x0d, 0x0a, + 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0d, 0x0a, + 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, + 0x0a, +}; + +static const uint8_t data_styles_css[] = +{ + /* /styles.css */ + 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x2e, + 0x63, 0x73, 0x73, 0x00, + 0x2f, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, + 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, + 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x39, + 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, + 0x78, 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, + 0x49, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, + 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, + 0x0a, 0x42, 0x4f, 0x44, 0x59, 0x0a, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x20, + 0x41, 0x72, 0x69, 0x61, 0x6c, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x74, + 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x31, 0x30, + 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, + 0x30, 0x70, 0x78, 0x0a, 0x7d, 0x0a, 0x0a, 0x42, + 0x4f, 0x44, 0x59, 0x2e, 0x73, 0x69, 0x64, 0x65, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x3a, 0x20, 0x41, 0x72, 0x69, 0x61, 0x6c, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x77, + 0x68, 0x69, 0x74, 0x65, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, + 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x3a, 0x20, 0x30, 0x70, 0x78, 0x0a, 0x7d, + 0x0a, 0x0a, 0x48, 0x31, 0x0a, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x74, + 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x62, 0x6c, 0x61, + 0x63, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x20, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, + 0x6c, 0x79, 0x3a, 0x20, 0x41, 0x72, 0x69, 0x61, + 0x6c, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x20, 0x32, 0x34, 0x70, 0x74, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, + 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, + 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2d, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, + 0x35, 0x30, 0x25, 0x3b, 0x0a, 0x7d, 0x0a, +}; + +static const uint8_t data_ti_htm[] = +{ + /* /ti.htm */ + 0x2f, 0x74, 0x69, 0x2e, 0x68, 0x74, 0x6d, 0x00, + + 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, + 0x32, 0x30, 0x31, 0x34, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x49, + 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x20, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x2e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, + 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x36, 0x39, + 0x2d, 0x31, 0x22, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, + 0x6e, 0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x2e, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x73, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x20, 0x72, + 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d, 0x22, 0x73, + 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x3e, 0x0a, + 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x41, + 0x62, 0x6f, 0x75, 0x74, 0x20, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3c, 0x2f, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x0a, + 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, + 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x3e, 0x0a, + 0x3c, 0x21, 0x2d, 0x2d, 0x0a, 0x20, 0x20, 0x2e, + 0x6d, 0x63, 0x75, 0x53, 0x42, 0x53, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x2e, 0x74, + 0x69, 0x76, 0x61, 0x47, 0x6c, 0x6f, 0x62, 0x65, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x32, 0x35, 0x25, 0x3b, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x2d, 0x2d, 0x3e, + 0x0a, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x0a, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x0a, 0x3c, 0x68, 0x31, 0x3e, 0x41, 0x62, + 0x6f, 0x75, 0x74, 0x20, 0x54, 0x65, 0x78, 0x61, + 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3c, 0x2f, 0x68, + 0x31, 0x3e, 0x0a, 0x3c, 0x68, 0x72, 0x3e, 0x0a, + 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, + 0x3d, 0x22, 0x2e, 0x2f, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x73, 0x2f, 0x74, 0x69, 0x76, 0x61, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x65, 0x2d, 0x73, 0x6d, + 0x61, 0x6c, 0x6c, 0x2e, 0x67, 0x69, 0x66, 0x22, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x74, 0x69, 0x76, 0x61, 0x47, 0x6c, 0x6f, 0x62, + 0x65, 0x22, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, + 0x3e, 0x0a, 0x3c, 0x70, 0x3e, 0x54, 0x65, 0x78, + 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x28, + 0x54, 0x49, 0x29, 0x20, 0x69, 0x73, 0x0a, 0x3c, + 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x64, + 0x6f, 0x63, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x6e, 0x79, 0x2f, 0x74, 0x69, 0x62, 0x75, + 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, + 0x3e, 0x61, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x6f, 0x67, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x6d, + 0x69, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x63, 0x74, + 0x6f, 0x72, 0x20, 0x49, 0x43, 0x20, 0x64, 0x65, + 0x73, 0x69, 0x67, 0x6e, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, + 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x3c, 0x2f, + 0x61, 0x3e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x6e, 0x79, 0x2e, 0x20, 0x49, 0x6e, 0x20, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x6f, 0x0a, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, + 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x6e, + 0x61, 0x6c, 0x6f, 0x67, 0x22, 0x3e, 0x61, 0x6e, + 0x61, 0x6c, 0x6f, 0x67, 0x20, 0x74, 0x65, 0x63, + 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, + 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x2c, 0x0a, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x64, 0x73, 0x70, 0x22, 0x3e, 0x64, + 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x28, 0x44, 0x53, + 0x50, 0x29, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x0a, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6d, 0x63, 0x75, 0x22, 0x3e, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x28, 0x4d, 0x43, 0x55, + 0x29, 0x20, 0x73, 0x65, 0x6d, 0x69, 0x63, 0x6f, + 0x6e, 0x64, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x2c, 0x20, 0x54, 0x49, 0x20, 0x64, 0x65, 0x73, + 0x69, 0x67, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x73, 0x65, + 0x6d, 0x69, 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x63, + 0x74, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x6f, 0x67, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x6d, 0x62, + 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x2e, 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x3c, + 0x62, 0x72, 0x3e, 0x0a, 0x49, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x2c, 0x20, 0x54, 0x49, 0x20, 0x6f, 0x66, 0x66, + 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x72, 0x6f, 0x61, 0x64, 0x65, 0x73, 0x74, + 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, + 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x2c, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6c, + 0x74, 0x72, 0x61, 0x2d, 0x6c, 0x6f, 0x77, 0x2d, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x0a, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6d, 0x73, 0x70, 0x34, 0x33, 0x30, 0x22, + 0x3e, 0x4d, 0x53, 0x50, 0x34, 0x33, 0x30, 0x3c, + 0x2f, 0x61, 0x3e, 0x26, 0x74, 0x72, 0x61, 0x64, + 0x65, 0x3b, 0x20, 0x4d, 0x43, 0x55, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x68, 0x69, 0x67, 0x68, + 0x2d, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x0a, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x63, 0x32, 0x30, 0x30, 0x30, 0x22, 0x3e, 0x43, + 0x32, 0x30, 0x30, 0x30, 0x3c, 0x2f, 0x61, 0x3e, + 0x26, 0x74, 0x72, 0x61, 0x64, 0x65, 0x3b, 0x20, + 0x72, 0x65, 0x61, 0x6c, 0x2d, 0x74, 0x69, 0x6d, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x33, 0x32, + 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2d, 0x70, 0x75, + 0x72, 0x70, 0x6f, 0x73, 0x65, 0x20, 0x41, 0x52, + 0x4d, 0xc2, 0xae, 0x2d, 0x62, 0x61, 0x73, 0x65, + 0x64, 0x20, 0x4d, 0x43, 0x55, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x74, 0x69, 0x76, 0x61, 0x2d, 0x63, 0x22, + 0x3e, 0x54, 0x69, 0x76, 0x61, 0x26, 0x74, 0x72, + 0x61, 0x64, 0x65, 0x3b, 0x20, 0x43, 0x20, 0x53, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x68, 0x65, 0x72, 0x63, 0x75, 0x6c, + 0x65, 0x73, 0x22, 0x3e, 0x48, 0x65, 0x72, 0x63, + 0x75, 0x6c, 0x65, 0x73, 0x26, 0x74, 0x72, 0x61, + 0x64, 0x65, 0x3b, 0x20, 0x53, 0x61, 0x66, 0x65, + 0x74, 0x79, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x4d, + 0x43, 0x55, 0x73, 0x2e, 0x0a, 0x3c, 0x62, 0x72, + 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x56, 0x69, + 0x73, 0x69, 0x74, 0x20, 0x75, 0x73, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x65, + 0x62, 0x20, 0x61, 0x74, 0x20, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x74, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x22, + 0x3e, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x69, 0x2e, + 0x63, 0x6f, 0x6d, 0x3c, 0x2f, 0x61, 0x3e, 0x2e, + 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x0a, 0x3c, 0x62, + 0x72, 0x3e, 0x0a, 0x3c, 0x62, 0x72, 0x3e, 0x0a, + 0x0a, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, + 0x63, 0x3d, 0x22, 0x2e, 0x2f, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x73, 0x2f, 0x6d, 0x63, 0x75, 0x5f, + 0x73, 0x69, 0x64, 0x65, 0x2d, 0x62, 0x79, 0x2d, + 0x73, 0x69, 0x64, 0x65, 0x2e, 0x6a, 0x70, 0x67, + 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x6d, 0x63, 0x75, 0x53, 0x42, 0x53, 0x22, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x6c, 0x65, 0x66, 0x74, 0x22, 0x3e, 0x0a, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, +}; + +const struct fsdata_file file_ti_htm[] = +{ + { + NULL, + data_ti_htm, + data_ti_htm + 8, + sizeof(data_ti_htm) - 8 + } +}; + +const struct fsdata_file file_styles_css[] = +{ + { + file_ti_htm, + data_styles_css, + data_styles_css + 12, + sizeof(data_styles_css) - 12 + } +}; + +const struct fsdata_file file_side_htm[] = +{ + { + file_styles_css, + data_side_htm, + data_side_htm + 10, + sizeof(data_side_htm) - 10 + } +}; + +const struct fsdata_file file_perror_htm[] = +{ + { + file_side_htm, + data_perror_htm, + data_perror_htm + 12, + sizeof(data_perror_htm) - 12 + } +}; + +const struct fsdata_file file_lwipstat_ssi[] = +{ + { + file_perror_htm, + data_lwipstat_ssi, + data_lwipstat_ssi + 14, + sizeof(data_lwipstat_ssi) - 14 + } +}; + +const struct fsdata_file file_io_ssi[] = +{ + { + file_lwipstat_ssi, + data_io_ssi, + data_io_ssi + 8, + sizeof(data_io_ssi) - 8 + } +}; + +const struct fsdata_file file_index_htm[] = +{ + { + file_io_ssi, + data_index_htm, + data_index_htm + 11, + sizeof(data_index_htm) - 11 + } +}; + +const struct fsdata_file file_images_ti_logo_gif[] = +{ + { + file_index_htm, + data_images_ti_logo_gif, + data_images_ti_logo_gif + 20, + sizeof(data_images_ti_logo_gif) - 20 + } +}; + +const struct fsdata_file file_images_tiva_globe_small_gif[] = +{ + { + file_images_ti_logo_gif, + data_images_tiva_globe_small_gif, + data_images_tiva_globe_small_gif + 29, + sizeof(data_images_tiva_globe_small_gif) - 29 + } +}; + +const struct fsdata_file file_images_tiva_jpg[] = +{ + { + file_images_tiva_globe_small_gif, + data_images_tiva_jpg, + data_images_tiva_jpg + 17, + sizeof(data_images_tiva_jpg) - 17 + } +}; + +const struct fsdata_file file_images_ti_gif[] = +{ + { + file_images_tiva_jpg, + data_images_ti_gif, + data_images_ti_gif + 15, + sizeof(data_images_ti_gif) - 15 + } +}; + +const struct fsdata_file file_images_mcu_side_by_side_jpg[] = +{ + { + file_images_ti_gif, + data_images_mcu_side_by_side_jpg, + data_images_mcu_side_by_side_jpg + 29, + sizeof(data_images_mcu_side_by_side_jpg) - 29 + } +}; + +const struct fsdata_file file_images_freertos_jpg[] = +{ + { + file_images_mcu_side_by_side_jpg, + data_images_freertos_jpg, + data_images_freertos_jpg + 21, + sizeof(data_images_freertos_jpg) - 21 + } +}; + +const struct fsdata_file file_images_cortex_jpg[] = +{ + { + file_images_freertos_jpg, + data_images_cortex_jpg, + data_images_cortex_jpg + 19, + sizeof(data_images_cortex_jpg) - 19 + } +}; + +const struct fsdata_file file_images_c_c_c_control_small_jpg[] = +{ + { + file_images_cortex_jpg, + data_images_c_c_c_control_small_jpg, + data_images_c_c_c_control_small_jpg + 32, + sizeof(data_images_c_c_c_control_small_jpg) - 32 + } +}; + +const struct fsdata_file file_images_c_c_c_connect_small_jpg[] = +{ + { + file_images_c_c_c_control_small_jpg, + data_images_c_c_c_connect_small_jpg, + data_images_c_c_c_connect_small_jpg + 32, + sizeof(data_images_c_c_c_connect_small_jpg) - 32 + } +}; + +const struct fsdata_file file_images_c_c_c_communicate_small_jpg[] = +{ + { + file_images_c_c_c_connect_small_jpg, + data_images_c_c_c_communicate_small_jpg, + data_images_c_c_c_communicate_small_jpg + 36, + sizeof(data_images_c_c_c_communicate_small_jpg) - 36 + } +}; + +const struct fsdata_file file_images_apps_jpg[] = +{ + { + file_images_c_c_c_communicate_small_jpg, + data_images_apps_jpg, + data_images_apps_jpg + 17, + sizeof(data_images_apps_jpg) - 17 + } +}; + +const struct fsdata_file file_header_htm[] = +{ + { + file_images_apps_jpg, + data_header_htm, + data_header_htm + 12, + sizeof(data_header_htm) - 12 + } +}; + +const struct fsdata_file file_freertos_htm[] = +{ + { + file_header_htm, + data_freertos_htm, + data_freertos_htm + 14, + sizeof(data_freertos_htm) - 14 + } +}; + +const struct fsdata_file file_footer_htm[] = +{ + { + file_freertos_htm, + data_footer_htm, + data_footer_htm + 12, + sizeof(data_footer_htm) - 12 + } +}; + +const struct fsdata_file file_favicon_ico[] = +{ + { + file_footer_htm, + data_favicon_ico, + data_favicon_ico + 13, + sizeof(data_favicon_ico) - 13 + } +}; + +const struct fsdata_file file_family_htm[] = +{ + { + file_favicon_ico, + data_family_htm, + data_family_htm + 12, + sizeof(data_family_htm) - 12 + } +}; + +const struct fsdata_file file_connect_htm[] = +{ + { + file_family_htm, + data_connect_htm, + data_connect_htm + 13, + sizeof(data_connect_htm) - 13 + } +}; + +const struct fsdata_file file_block_htm[] = +{ + { + file_connect_htm, + data_block_htm, + data_block_htm + 11, + sizeof(data_block_htm) - 11 + } +}; + +const struct fsdata_file file_404_htm[] = +{ + { + file_block_htm, + data_404_htm, + data_404_htm + 9, + sizeof(data_404_htm) - 9 + } +}; + +#define FS_ROOT file_404_htm + +#define FS_NUMFILES 26 + diff --git a/boards/dk-tm4c129x/freertos_demo/idle_task.c b/boards/dk-tm4c129x/freertos_demo/idle_task.c new file mode 100644 index 0000000..9fdcc13 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/idle_task.c @@ -0,0 +1,460 @@ +//***************************************************************************** +// +// idle_task.c - The FreeRTOS idle task. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "utils/lwiplib.h" +#include "lwip/stats.h" +#include "display_task.h" +#include "idle_task.h" +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" +//***************************************************************************** +// +// The stack for the idle task. +// +//***************************************************************************** +uint32_t g_pui32IdleTaskStack[128]; + +//***************************************************************************** +// +// The number of tasks that are running. +// +//***************************************************************************** +static uint32_t g_ui32Tasks; + +//***************************************************************************** +// +// The number of tasks that existed the last time the display was updated (used +// to detect when the display should be updated again). +// +//***************************************************************************** +static uint32_t g_ui32PreviousTasks; + +//***************************************************************************** +// +// The number of seconds that the application has been running. This is +// initialized to -1 in order to get the initial display updated as soon as +// possible. +// +//***************************************************************************** +static uint32_t g_ui32Seconds = 0xffffffff; + +//***************************************************************************** +// +// The current IP address. This is initialized to -1 in order to get the +// initial display updated as soon as possible. +// +//***************************************************************************** +static uint32_t g_ui32IPAddress = 0xffffffff; + +//***************************************************************************** +// +// The number of packets that have been transmitted. This is initialized to -1 +// in order to get the initial display updated as soon as possible. +// +//***************************************************************************** +static uint32_t g_ui32TXPackets = 0xffffffff; + +//***************************************************************************** +// +// The number of packets that have been received. This is initialized to -1 in +// order to get the initial display updated as soon as possible. +// +//***************************************************************************** +static uint32_t g_ui32RXPackets = 0xffffffff; + +//***************************************************************************** +// +// A buffer to contain the string versions of the information displayed at the +// bottom of the display. +// +//***************************************************************************** +static char g_pcTimeString[12]; +static char g_pcTaskString[4]; +static char g_pcIPString[24]; +static char g_pcTxString[8]; +static char g_pcRxString[8]; + +//***************************************************************************** +// +// Displays the IP address in a human-readable format. +// +//***************************************************************************** +static void +DisplayIP(uint32_t ui32IP) +{ + uint32_t ui32Loop, ui32Idx, ui32Value; + + // + // If there is no IP address, indicate that one is being acquired. + // + if(ui32IP == 0) + { + DisplayString(114, 231 - 10, " Acquiring... "); + return; + } + + // + // Set the initial index into the string that is being constructed. + // + ui32Idx = 0; + + // + // Start the string with four spaces. Not all will necessarily be used, + // depending upon the length of the IP address string. + // + for(ui32Loop = 0; ui32Loop < 4; ui32Loop++) + { + g_pcIPString[ui32Idx++] = ' '; + } + + // + // Loop through the four bytes of the IP address. + // + for(ui32Loop = 0; ui32Loop < 32; ui32Loop += 8) + { + // + // Extract this byte from the IP address word. + // + ui32Value = (ui32IP >> ui32Loop) & 0xff; + + // + // Convert this byte into ASCII, using only the characters required. + // + if(ui32Value > 99) + { + g_pcIPString[ui32Idx++] = '0' + (ui32Value / 100); + } + if(ui32Value > 9) + { + g_pcIPString[ui32Idx++] = '0' + ((ui32Value / 10) % 10); + } + g_pcIPString[ui32Idx++] = '0' + (ui32Value % 10); + + // + // Add a dot to separate this byte from the next. + // + g_pcIPString[ui32Idx++] = '.'; + } + + // + // Fill the remainder of the string buffer with spaces. + // + for(ui32Loop = ui32Idx - 1; ui32Loop < 20; ui32Loop++) + { + g_pcIPString[ui32Loop] = ' '; + } + + // + // Null terminate the string at the appropriate place, based on the length + // of the string version of the IP address. There may or may not be + // trailing spaces that remain. + // + g_pcIPString[ui32Idx + 3 - ((ui32Idx - 12) / 2)] = '\0'; + + // + // Display the string. The horizontal position and the number of leading + // spaces utilized depend on the length of the string version of the IP + // address. The end result is the IP address centered in the provided + // space with leading/trailing spaces as required to clear the remainder of + // the space. + // + DisplayString(117 - ((ui32Idx & 1) * 3), 231 - 10, + g_pcIPString + ((ui32Idx - 12) / 2)); +} + +//***************************************************************************** +// +// Displays a value in a human-readable format. This does not need to deal +// with leading/trailing spaces sicne the values displayed are monotonically +// increasing. +// +//***************************************************************************** +static void +DisplayValue(char *pcBuffer, uint32_t ui32Value, uint32_t ui32X, + uint32_t ui32Y) +{ + // + // See if the value is less than 10. + // + if(ui32Value < 10) + { + // + // Display the value using only a single digit. + // + pcBuffer[0] = '0' + ui32Value; + pcBuffer[1] = '\0'; + DisplayString(ui32X + 15, ui32Y, pcBuffer); + } + + // + // Otherwise, see if the value is less than 100. + // + else if(ui32Value < 100) + { + // + // Display the value using two digits. + // + pcBuffer[0] = '0' + (ui32Value / 10); + pcBuffer[1] = '0' + (ui32Value % 10); + pcBuffer[2] = '\0'; + DisplayString(ui32X + 12, ui32Y, pcBuffer); + } + + // + // Otherwise, see if the value is less than 1,000. + // + else if(ui32Value < 1000) + { + // + // Display the value using three digits. + // + pcBuffer[0] = '0' + (ui32Value / 100); + pcBuffer[1] = '0' + ((ui32Value / 10) % 10); + pcBuffer[2] = '0' + (ui32Value % 10); + pcBuffer[3] = '\0'; + DisplayString(ui32X + 9, ui32Y, pcBuffer); + } + + // + // Otherwise, see if the value is less than 10,000. + // + else if(ui32Value < 10000) + { + // + // Display the value using four digits. + // + pcBuffer[0] = '0' + (ui32Value / 1000); + pcBuffer[1] = '0' + ((ui32Value / 100) % 10); + pcBuffer[2] = '0' + ((ui32Value / 10) % 10); + pcBuffer[3] = '0' + (ui32Value % 10); + pcBuffer[4] = '\0'; + DisplayString(ui32X + 6, ui32Y, pcBuffer); + } + + // + // Otherwise, see if the value is less than 100,000. + // + else if(ui32Value < 100000) + { + // + // Display the value using five digits. + // + pcBuffer[0] = '0' + (ui32Value / 10000); + pcBuffer[1] = '0' + ((ui32Value / 1000) % 10); + pcBuffer[2] = '0' + ((ui32Value / 100) % 10); + pcBuffer[3] = '0' + ((ui32Value / 10) % 10); + pcBuffer[4] = '0' + (ui32Value % 10); + pcBuffer[5] = '\0'; + DisplayString(ui32X + 3, ui32Y, pcBuffer); + } + + // + // Otherwise, the value is between 100,000 and 999,999. + // + else + { + // + // Display the value using six digits. + // + pcBuffer[0] = '0' + ((ui32Value / 100000) % 10); + pcBuffer[1] = '0' + ((ui32Value / 10000) % 10); + pcBuffer[2] = '0' + ((ui32Value / 1000) % 10); + pcBuffer[3] = '0' + ((ui32Value / 100) % 10); + pcBuffer[4] = '0' + ((ui32Value / 10) % 10); + pcBuffer[5] = '0' + (ui32Value % 10); + pcBuffer[6] = '\0'; + DisplayString(ui32X, ui32Y, pcBuffer); + } +} + +//***************************************************************************** +// +// This hook is called by the FreeRTOS idle task when no other tasks are +// runnable. +// +//***************************************************************************** +void +vApplicationIdleHook(void) +{ + uint32_t ui32Temp; + + // + // See if this is the first time that the idle task has been called. + // + if(g_ui32Seconds == 0xffffffff) + { + // + // Draw the boxes for the statistics that are displayed. + // + DisplayMove(8, 231 - 20); + DisplayDraw(311, 231 - 20); + DisplayDraw(311, 230); + DisplayDraw(8, 230); + DisplayDraw(8, 231 - 20); + DisplayMove(69, 231 - 20); + DisplayDraw(69, 230); + DisplayMove(111, 231 - 20); + DisplayDraw(111, 230); + DisplayMove(213, 231 - 20); + DisplayDraw(213, 230); + DisplayMove(262, 231 - 20); + DisplayDraw(262, 230); + + // + // Place the statistics titles in the boxes. + // + DisplayString(21, 231 - 18, "Uptime"); + DisplayString(75, 231 - 18, "Tasks"); + DisplayString(133, 231 - 18, "IP Address"); + DisplayString(232, 231 - 18, "TX"); + DisplayString(280, 231 - 18, "RX"); + } + + // + // Get the number of seconds that the application has been running. + // + ui32Temp = xTaskGetTickCount() / (1000 / portTICK_RATE_MS); + + // + // See if the number of seconds has changed. + // + if(ui32Temp != g_ui32Seconds) + { + // + // Update the local copy of the run time. + // + g_ui32Seconds = ui32Temp; + + // + // Convert the number of seconds into a text string. + // + g_pcTimeString[0] = '0' + ((ui32Temp / 36000) % 10); + g_pcTimeString[1] = '0' + ((ui32Temp / 3600) % 10); + g_pcTimeString[2] = ':'; + g_pcTimeString[3] = '0' + ((ui32Temp / 600) % 6); + g_pcTimeString[4] = '0' + ((ui32Temp / 60) % 10); + g_pcTimeString[5] = ':'; + g_pcTimeString[6] = '0' + ((ui32Temp / 10) % 6); + g_pcTimeString[7] = '0' + (ui32Temp % 10); + g_pcTimeString[8] = '\0'; + + // + // Have the display task write this string onto the display. + // + DisplayString(16, 231 - 10, g_pcTimeString); + } + + // + // Get the number of task that are running except idle task. + // + g_ui32Tasks = uxTaskGetNumberOfTasks() - 1; + + // + // See if the number of tasks has changed. + // + if(g_ui32Tasks != g_ui32PreviousTasks) + { + // + // Update the local copy of the number of tasks. + // + ui32Temp = g_ui32PreviousTasks = g_ui32Tasks; + + // + // Convert the number of tasks into a text string and display it. + // + if(ui32Temp < 10) + { + g_pcTaskString[0] = ' '; + g_pcTaskString[1] = '0' + (ui32Temp % 10); + g_pcTaskString[2] = ' '; + g_pcTaskString[3] = '\0'; + DisplayString(81, 231 - 10, g_pcTaskString); + } + else + { + g_pcTaskString[0] = '0' + ((ui32Temp / 10) % 10); + g_pcTaskString[1] = '0' + (ui32Temp % 10); + g_pcTaskString[2] = '\0'; + DisplayString(83, 231 - 10, g_pcTaskString); + } + } + + // + // Get the current IP address. + // + ui32Temp = lwIPLocalIPAddrGet(); + + // + // See if the IP address has changed. + // + if(ui32Temp != g_ui32IPAddress) + { + // + // Save the current IP address. + // + g_ui32IPAddress = ui32Temp; + + // + // Update the display of the IP address. + // + DisplayIP(ui32Temp); + } + + // + // See if the number of transmitted packets has changed. + // + if(lwip_stats.link.xmit != g_ui32TXPackets) + { + // + // Save the number of transmitted packets. + // + ui32Temp = g_ui32TXPackets = lwip_stats.link.xmit; + + // + // Update the display of transmitted packets. + // + DisplayValue(g_pcTxString, ui32Temp, 219, 231 - 10); + } + + // + // See if the number of received packets has changed. + // + if(lwip_stats.link.recv != g_ui32RXPackets) + { + // + // Save the number of received packets. + // + ui32Temp = g_ui32RXPackets = lwip_stats.link.recv; + + // + // Update the display of received packets. + // + DisplayValue(g_pcRxString, ui32Temp, 268, 231 - 10); + } + +} diff --git a/boards/dk-tm4c129x/freertos_demo/idle_task.h b/boards/dk-tm4c129x/freertos_demo/idle_task.h new file mode 100644 index 0000000..7066357 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/idle_task.h @@ -0,0 +1,35 @@ +//***************************************************************************** +// +// idle_task.h - Prototypes for the FreeRTOS idle task. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __IDLE_TASK_H__ +#define __IDLE_TASK_H__ + +//***************************************************************************** +// +// Prototypes for the idle task. +// +//***************************************************************************** +extern uint32_t g_pui32IdleTaskStack[128]; + +#endif // __IDLE_TASK_H__ diff --git a/boards/dk-tm4c129x/freertos_demo/images.c b/boards/dk-tm4c129x/freertos_demo/images.c new file mode 100644 index 0000000..0fc0f79 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/images.c @@ -0,0 +1,4602 @@ +//***************************************************************************** +// +// images.c - Spider images that are drawn onto the LCD. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" +#include "images.h" + +//***************************************************************************** +// +// A blank image used to erase a spider that has been smashed. +// +//***************************************************************************** +const uint8_t g_pui8SpiderBlankImage[] = +{ + IMAGE_FMT_1BPP_COMP, + 24, 0, + 24, 0, + + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +}; + +//***************************************************************************** +// +// The first image of the spider facing left. +// +//***************************************************************************** +const uint8_t g_pui8SpiderL1Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 240, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x00, 0x02, 0x02, + 0x00, 0x00, 0x06, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x00, 0x00, 0x07, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x01, 0x04, 0x04, + 0x03, 0x04, 0x04, + 0x04, 0x04, 0x04, + 0x03, 0x05, 0x05, + 0x08, 0x05, 0x05, + 0x05, 0x06, 0x06, + 0x0a, 0x06, 0x06, + 0x04, 0x07, 0x07, + 0x08, 0x07, 0x07, + 0x0b, 0x07, 0x07, + 0x09, 0x08, 0x08, + 0x0b, 0x08, 0x08, + 0x08, 0x0a, 0x0a, + 0x0a, 0x0b, 0x0b, + 0x0b, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, + 0x0e, 0x0d, 0x0d, + 0x0f, 0x0d, 0x0d, + 0x0c, 0x0e, 0x0e, + 0x0d, 0x0e, 0x0e, + 0x0f, 0x0e, 0x0e, + 0x0c, 0x10, 0x10, + 0x0d, 0x10, 0x10, + 0x0e, 0x10, 0x10, + 0x0d, 0x11, 0x11, + 0x13, 0x11, 0x11, + 0x11, 0x12, 0x12, + 0x12, 0x12, 0x12, + 0x15, 0x12, 0x12, + 0x0f, 0x15, 0x15, + 0x14, 0x15, 0x15, + 0x15, 0x16, 0x16, + 0x16, 0x19, 0x19, + 0x17, 0x19, 0x19, + 0x19, 0x19, 0x19, + 0x15, 0x1c, 0x1c, + 0x18, 0x1d, 0x1d, + 0x19, 0x1d, 0x1d, + 0x1b, 0x1d, 0x1d, + 0x00, 0x00, 0x60, + 0x1e, 0x1d, 0x1d, + 0x20, 0x1b, 0x21, + 0x00, 0x00, 0x67, + 0x1a, 0x21, 0x21, + 0x24, 0x21, 0x21, + 0x26, 0x21, 0x21, + 0x21, 0x22, 0x22, + 0x17, 0x26, 0x26, + 0x27, 0x25, 0x25, + 0x28, 0x25, 0x25, + 0x1e, 0x22, 0x2f, + 0x25, 0x26, 0x26, + 0x2b, 0x27, 0x27, + 0x2b, 0x2b, 0x2b, + 0x2f, 0x2b, 0x2b, + 0x2c, 0x2d, 0x2d, + 0x13, 0x00, 0x8f, + 0x09, 0x01, 0x93, + 0x30, 0x2e, 0x2e, + 0x04, 0x03, 0x93, + 0x30, 0x2f, 0x2f, + 0x34, 0x2f, 0x2f, + 0x00, 0x00, 0xa1, + 0x00, 0x00, 0xa4, + 0x30, 0x32, 0x32, + 0x0d, 0x00, 0xa2, + 0x06, 0x03, 0xa7, + 0x00, 0x00, 0xb0, + 0x38, 0x35, 0x35, + 0x2d, 0x37, 0x37, + 0x00, 0x00, 0xb4, + 0x31, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x01, 0x01, 0xb5, + 0x08, 0x0a, 0xa1, + 0x33, 0x39, 0x39, + 0x3c, 0x38, 0x38, + 0x3d, 0x38, 0x38, + 0x25, 0x21, 0x70, + 0x1b, 0x18, 0x86, + 0x3f, 0x39, 0x39, + 0x3b, 0x3b, 0x3b, + 0x0e, 0x0e, 0xa7, + 0x21, 0x1b, 0x88, + 0x3c, 0x3e, 0x3e, + 0x3d, 0x3e, 0x3e, + 0x3b, 0x3f, 0x3f, + 0x22, 0x2b, 0x70, + 0x15, 0x15, 0xa6, + 0x3d, 0x41, 0x41, + 0x41, 0x42, 0x42, + 0x42, 0x42, 0x42, + 0x41, 0x43, 0x43, + 0x49, 0x45, 0x45, + 0x41, 0x47, 0x47, + 0x24, 0x18, 0xaf, + 0x44, 0x47, 0x47, + 0x32, 0x33, 0x77, + 0x46, 0x49, 0x49, + 0x46, 0x4a, 0x4a, + 0x48, 0x4b, 0x4b, + 0x45, 0x4c, 0x4c, + 0x25, 0x25, 0xa5, + 0x29, 0x21, 0xb2, + 0x4b, 0x4e, 0x4e, + 0x49, 0x4f, 0x4f, + 0x26, 0x26, 0xad, + 0x4b, 0x51, 0x51, + 0x53, 0x50, 0x51, + 0x4c, 0x52, 0x52, + 0x50, 0x52, 0x52, + 0x53, 0x55, 0x55, + 0x5e, 0x55, 0x55, + 0x57, 0x56, 0x56, + 0x53, 0x57, 0x57, + 0x51, 0x48, 0x79, + 0x50, 0x59, 0x59, + 0x62, 0x5a, 0x5a, + 0x60, 0x5c, 0x5c, + 0x59, 0x5e, 0x5e, + 0x57, 0x5f, 0x5f, + 0x5a, 0x61, 0x61, + 0x54, 0x53, 0x89, + 0x67, 0x67, 0x67, + 0x4d, 0x4b, 0xaf, + 0x69, 0x6d, 0x6d, + 0x66, 0x6e, 0x6e, + 0x6d, 0x6e, 0x6e, + 0x68, 0x6f, 0x6f, + 0x6f, 0x6f, 0x6f, + 0x71, 0x71, 0x71, + 0x75, 0x71, 0x71, + 0x54, 0x54, 0xb7, + 0x5f, 0x5b, 0xab, + 0x75, 0x74, 0x74, + 0x74, 0x77, 0x77, + 0x70, 0x78, 0x7f, + 0x7f, 0x7e, 0x7e, + 0x81, 0x7e, 0x7e, + 0x82, 0x7e, 0x7e, + 0x7f, 0x80, 0x80, + 0x88, 0x7f, 0x7f, + 0x81, 0x83, 0x83, + 0x8c, 0x86, 0x86, + 0x86, 0x88, 0x88, + 0x88, 0x88, 0x88, + 0x8e, 0x88, 0x88, + 0x8c, 0x8b, 0x8b, + 0x88, 0x8c, 0x8c, + 0x91, 0x8c, 0x8c, + 0x95, 0x90, 0x90, + 0x83, 0x7b, 0xc1, + 0x98, 0x90, 0x90, + 0x91, 0x91, 0x91, + 0x8d, 0x92, 0x95, + 0x99, 0x94, 0x94, + 0x84, 0x88, 0xb7, + 0x98, 0x98, 0x98, + 0x94, 0x9b, 0x9a, + 0x96, 0x9b, 0x9b, + 0x9f, 0x9d, 0x9d, + 0xa5, 0xa1, 0xa3, + 0xa4, 0xa4, 0xa4, + 0xa8, 0xa5, 0xa5, + 0xa3, 0xa6, 0xa6, + 0xab, 0xa7, 0xa7, + 0xb7, 0xa6, 0xa6, + 0xa8, 0xa8, 0xa8, + 0xa3, 0xaa, 0xaa, + 0xa5, 0xac, 0xac, + 0xb0, 0xab, 0xab, + 0xad, 0xae, 0xae, + 0xac, 0xaf, 0xaf, + 0xaf, 0xb2, 0xb2, + 0xb2, 0xb5, 0xb5, + 0xb5, 0xb6, 0xb6, + 0xb5, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb8, + 0xae, 0xba, 0xba, + 0xad, 0xae, 0xd6, + 0xbd, 0xba, 0xba, + 0xbe, 0xbe, 0xbe, + 0xbf, 0xb5, 0xd1, + 0xbc, 0xc0, 0xc0, + 0xc1, 0xc3, 0xc3, + 0xbd, 0xc4, 0xc4, + 0xc0, 0xc5, 0xc5, + 0xc4, 0xc5, 0xc5, + 0xc7, 0xc8, 0xc8, + 0xc9, 0xc8, 0xc8, + 0xc3, 0xc9, 0xc9, + 0xc9, 0xca, 0xca, + 0xca, 0xca, 0xca, + 0xc2, 0xcc, 0xcc, + 0xc8, 0xcc, 0xcc, + 0xce, 0xcc, 0xcc, + 0xc8, 0xcd, 0xcd, + 0xd4, 0xcc, 0xcc, + 0xd1, 0xcd, 0xcd, + 0xd3, 0xcd, 0xcd, + 0xd3, 0xcf, 0xcf, + 0xcd, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, + 0xcd, 0xd1, 0xd1, + 0xc8, 0xd4, 0xd4, + 0xd0, 0xd4, 0xd4, + 0xd5, 0xd6, 0xd5, + 0xe3, 0xdc, 0xdc, + 0xd8, 0xdd, 0xe1, + 0xdd, 0xde, 0xde, + 0xe3, 0xdf, 0xdf, + 0xd8, 0xe2, 0xe2, + 0xe4, 0xe2, 0xe2, + 0xe3, 0xe5, 0xe5, + 0xe4, 0xe6, 0xe6, + 0xe5, 0xe7, 0xe7, + 0xe5, 0xe9, 0xe9, + 0xec, 0xea, 0xea, + 0xe5, 0xeb, 0xeb, + 0xee, 0xeb, 0xeb, + 0xf1, 0xed, 0xed, + 0xf4, 0xed, 0xed, + 0xf0, 0xee, 0xee, + 0xf5, 0xf1, 0xf1, + 0xf5, 0xf7, 0xf7, + 0xfa, 0xf7, 0xf7, + 0xfc, 0xfb, 0xfb, + 0xfd, 0xfb, 0xfb, + + 0xf2, 0x07, 0x07, 0x07, 0x06, 0x2d, 0x04, 0x02, 0x7f, 0xca, 0x07, 0x06, + 0x66, 0x85, 0x02, 0xa8, 0x47, 0x00, 0x09, 0x00, 0x18, 0x70, 0x0e, 0x02, + 0xb6, 0x46, 0x01, 0x60, 0xb8, 0x47, 0x01, 0x62, 0xb5, 0x7a, 0x1f, 0x00, + 0x01, 0x00, 0x55, 0xc8, 0x24, 0x00, 0x00, 0xd4, 0xe1, 0x80, 0x2f, 0x00, + 0x3a, 0xba, 0xe1, 0xb0, 0x50, 0x03, 0x02, 0xa6, 0xac, 0x0b, 0x00, 0xcb, + 0x5a, 0x47, 0x00, 0x00, 0x00, 0x1c, 0x2b, 0x07, 0x69, 0xed, 0x58, 0x00, + 0x02, 0x7d, 0xf0, 0x61, 0x00, 0xb7, 0x96, 0x47, 0x27, 0x00, 0x8f, 0xdf, + 0xe4, 0x42, 0x26, 0xe2, 0x22, 0x21, 0x01, 0xde, 0xa0, 0x0d, 0x2f, 0xbe, + 0xc5, 0x04, 0x3b, 0x00, 0x03, 0x3c, 0x8a, 0xad, 0x8c, 0x5d, 0xbb, 0xd5, + 0x00, 0x32, 0xce, 0x19, 0x97, 0xaa, 0x23, 0x93, 0xe7, 0x11, 0xe8, 0xb2, + 0x15, 0x43, 0x13, 0x59, 0x20, 0x01, 0x00, 0x17, 0xa1, 0xbc, 0xc6, 0x3f, + 0xc4, 0x67, 0xc9, 0x18, 0xd8, 0x8b, 0x2e, 0x53, 0x2b, 0x00, 0x00, 0x01, + 0x00, 0x39, 0x2a, 0x95, 0xc0, 0xa7, 0xc1, 0xc3, 0xa4, 0x18, 0x64, 0x3e, + 0x0f, 0x47, 0x01, 0x08, 0x9f, 0xa9, 0x00, 0x65, 0x54, 0x77, 0x91, 0x47, + 0x4d, 0x44, 0x4e, 0x20, 0x5c, 0x35, 0x3f, 0x00, 0x00, 0x03, 0x6f, 0x92, + 0x00, 0x56, 0x54, 0x54, 0x54, 0x33, 0x06, 0x09, 0x4a, 0x10, 0x54, 0x60, + 0x08, 0x47, 0x00, 0x03, 0x84, 0x79, 0x00, 0x87, 0x6c, 0x74, 0x89, 0x45, + 0x4b, 0x36, 0x4f, 0x24, 0x52, 0x5b, 0x4c, 0x29, 0x1e, 0x0b, 0x6b, 0xd7, + 0x00, 0xab, 0xdb, 0xe0, 0x80, 0x73, 0x5f, 0x57, 0x6e, 0x40, 0x30, 0x44, + 0x37, 0x9d, 0xa3, 0x5e, 0x10, 0x01, 0x00, 0x75, 0xd3, 0x3d, 0x76, 0xbf, + 0x86, 0xd1, 0x78, 0x08, 0xae, 0xdd, 0x9b, 0x40, 0x44, 0x00, 0x08, 0x6a, + 0x00, 0xca, 0xd2, 0x9c, 0xea, 0x63, 0x00, 0x43, 0xcd, 0x00, 0x0a, 0xa2, + 0xcf, 0x31, 0x51, 0xb1, 0xe5, 0xc2, 0x10, 0x90, 0x48, 0x03, 0x23, 0x16, + 0x98, 0xee, 0x9a, 0x00, 0x00, 0x00, 0x2c, 0xe6, 0x16, 0x11, 0xaf, 0xda, + 0x01, 0x41, 0x03, 0x25, 0x82, 0xdc, 0xef, 0xb3, 0x43, 0x00, 0x00, 0x00, + 0x53, 0x28, 0x07, 0x1b, 0x49, 0xec, 0x00, 0x72, 0x00, 0x18, 0xbd, 0xe9, + 0x68, 0x00, 0x71, 0x10, 0xeb, 0x99, 0x12, 0x44, 0x02, 0x30, 0x88, 0xb4, + 0x00, 0xd0, 0xd6, 0xd9, 0xa5, 0x00, 0x4c, 0xe3, 0xb9, 0x04, 0x38, 0x1a, + 0xc7, 0x7b, 0x02, 0x4c, 0x00, 0x3b, 0x00, 0x94, 0x6d, 0x34, 0x1d, 0x04, + 0x05, 0x11, 0x2d, 0x03, 0xcc, 0x8d, 0x0c, 0x00, 0x8e, 0x81, 0x4e, 0x15, + 0x00, 0x00, 0x03, 0x9e, 0x83, 0x07, 0x00, 0x08, 0x7c, 0xc7, 0x4f, 0x0e, + 0x14, 0x7e, 0x03, 0x6f, 0x27, 0x77, 0x80, 0x2f, +}; + +//***************************************************************************** +// +// The second image of the spider facing left. +// +//***************************************************************************** +const uint8_t g_pui8SpiderL2Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 240, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x00, 0x02, 0x02, + 0x00, 0x00, 0x06, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x00, 0x00, 0x07, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x01, 0x04, 0x04, + 0x03, 0x04, 0x04, + 0x04, 0x04, 0x04, + 0x03, 0x05, 0x05, + 0x08, 0x05, 0x05, + 0x05, 0x06, 0x06, + 0x0a, 0x06, 0x06, + 0x04, 0x07, 0x07, + 0x08, 0x07, 0x07, + 0x0b, 0x07, 0x07, + 0x09, 0x08, 0x08, + 0x0b, 0x08, 0x08, + 0x08, 0x0a, 0x0a, + 0x0a, 0x0b, 0x0b, + 0x0b, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, + 0x0e, 0x0d, 0x0d, + 0x0f, 0x0d, 0x0d, + 0x0c, 0x0e, 0x0e, + 0x0d, 0x0e, 0x0e, + 0x0f, 0x0e, 0x0e, + 0x0c, 0x10, 0x10, + 0x0d, 0x10, 0x10, + 0x0e, 0x10, 0x10, + 0x0d, 0x11, 0x11, + 0x13, 0x11, 0x11, + 0x11, 0x12, 0x12, + 0x12, 0x12, 0x12, + 0x15, 0x12, 0x12, + 0x0f, 0x15, 0x15, + 0x14, 0x15, 0x15, + 0x15, 0x16, 0x16, + 0x16, 0x19, 0x19, + 0x17, 0x19, 0x19, + 0x19, 0x19, 0x19, + 0x15, 0x1c, 0x1c, + 0x18, 0x1d, 0x1d, + 0x19, 0x1d, 0x1d, + 0x1b, 0x1d, 0x1d, + 0x00, 0x00, 0x60, + 0x1e, 0x1d, 0x1d, + 0x20, 0x1b, 0x21, + 0x00, 0x00, 0x67, + 0x1a, 0x21, 0x21, + 0x24, 0x21, 0x21, + 0x26, 0x21, 0x21, + 0x21, 0x22, 0x22, + 0x17, 0x26, 0x26, + 0x27, 0x25, 0x25, + 0x28, 0x25, 0x25, + 0x1e, 0x22, 0x2f, + 0x25, 0x26, 0x26, + 0x2b, 0x27, 0x27, + 0x2b, 0x2b, 0x2b, + 0x2f, 0x2b, 0x2b, + 0x2c, 0x2d, 0x2d, + 0x13, 0x00, 0x8f, + 0x09, 0x01, 0x93, + 0x30, 0x2e, 0x2e, + 0x04, 0x03, 0x93, + 0x30, 0x2f, 0x2f, + 0x34, 0x2f, 0x2f, + 0x00, 0x00, 0xa1, + 0x00, 0x00, 0xa4, + 0x30, 0x32, 0x32, + 0x0d, 0x00, 0xa2, + 0x06, 0x03, 0xa7, + 0x00, 0x00, 0xb0, + 0x38, 0x35, 0x35, + 0x2d, 0x37, 0x37, + 0x00, 0x00, 0xb4, + 0x31, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x01, 0x01, 0xb5, + 0x08, 0x0a, 0xa1, + 0x33, 0x39, 0x39, + 0x3c, 0x38, 0x38, + 0x3d, 0x38, 0x38, + 0x25, 0x21, 0x70, + 0x1b, 0x18, 0x86, + 0x3f, 0x39, 0x39, + 0x3b, 0x3b, 0x3b, + 0x0e, 0x0e, 0xa7, + 0x21, 0x1b, 0x88, + 0x3c, 0x3e, 0x3e, + 0x3d, 0x3e, 0x3e, + 0x3b, 0x3f, 0x3f, + 0x22, 0x2b, 0x70, + 0x15, 0x15, 0xa6, + 0x3d, 0x41, 0x41, + 0x41, 0x42, 0x42, + 0x42, 0x42, 0x42, + 0x41, 0x43, 0x43, + 0x49, 0x45, 0x45, + 0x41, 0x47, 0x47, + 0x24, 0x18, 0xaf, + 0x44, 0x47, 0x47, + 0x32, 0x33, 0x77, + 0x46, 0x49, 0x49, + 0x46, 0x4a, 0x4a, + 0x48, 0x4b, 0x4b, + 0x45, 0x4c, 0x4c, + 0x25, 0x25, 0xa5, + 0x29, 0x21, 0xb2, + 0x4b, 0x4e, 0x4e, + 0x49, 0x4f, 0x4f, + 0x26, 0x26, 0xad, + 0x4b, 0x51, 0x51, + 0x53, 0x50, 0x51, + 0x4c, 0x52, 0x52, + 0x50, 0x52, 0x52, + 0x53, 0x55, 0x55, + 0x5e, 0x55, 0x55, + 0x57, 0x56, 0x56, + 0x53, 0x57, 0x57, + 0x51, 0x48, 0x79, + 0x50, 0x59, 0x59, + 0x62, 0x5a, 0x5a, + 0x60, 0x5c, 0x5c, + 0x59, 0x5e, 0x5e, + 0x57, 0x5f, 0x5f, + 0x5a, 0x61, 0x61, + 0x54, 0x53, 0x89, + 0x67, 0x67, 0x67, + 0x4d, 0x4b, 0xaf, + 0x69, 0x6d, 0x6d, + 0x66, 0x6e, 0x6e, + 0x6d, 0x6e, 0x6e, + 0x68, 0x6f, 0x6f, + 0x6f, 0x6f, 0x6f, + 0x71, 0x71, 0x71, + 0x75, 0x71, 0x71, + 0x54, 0x54, 0xb7, + 0x5f, 0x5b, 0xab, + 0x75, 0x74, 0x74, + 0x74, 0x77, 0x77, + 0x70, 0x78, 0x7f, + 0x7f, 0x7e, 0x7e, + 0x81, 0x7e, 0x7e, + 0x82, 0x7e, 0x7e, + 0x7f, 0x80, 0x80, + 0x88, 0x7f, 0x7f, + 0x81, 0x83, 0x83, + 0x8c, 0x86, 0x86, + 0x86, 0x88, 0x88, + 0x88, 0x88, 0x88, + 0x8e, 0x88, 0x88, + 0x8c, 0x8b, 0x8b, + 0x88, 0x8c, 0x8c, + 0x91, 0x8c, 0x8c, + 0x95, 0x90, 0x90, + 0x98, 0x90, 0x90, + 0x83, 0x7b, 0xc1, + 0x91, 0x91, 0x91, + 0x8d, 0x92, 0x95, + 0x99, 0x94, 0x94, + 0x84, 0x88, 0xb7, + 0x98, 0x98, 0x98, + 0x94, 0x9b, 0x9a, + 0x96, 0x9b, 0x9b, + 0x9f, 0x9d, 0x9d, + 0xa5, 0xa1, 0xa3, + 0xa4, 0xa4, 0xa4, + 0xa8, 0xa5, 0xa5, + 0xa3, 0xa6, 0xa6, + 0xab, 0xa7, 0xa7, + 0xb7, 0xa6, 0xa6, + 0xa8, 0xa8, 0xa8, + 0xa3, 0xaa, 0xaa, + 0xa5, 0xac, 0xac, + 0xb0, 0xab, 0xab, + 0xad, 0xae, 0xae, + 0xac, 0xaf, 0xaf, + 0xaf, 0xb2, 0xb2, + 0xb2, 0xb5, 0xb5, + 0xb5, 0xb6, 0xb6, + 0xb5, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb8, + 0xae, 0xba, 0xba, + 0xad, 0xae, 0xd6, + 0xbd, 0xba, 0xba, + 0xbe, 0xbe, 0xbe, + 0xbf, 0xb5, 0xd1, + 0xbc, 0xc0, 0xc0, + 0xc1, 0xc3, 0xc3, + 0xbd, 0xc4, 0xc4, + 0xc0, 0xc5, 0xc5, + 0xc4, 0xc5, 0xc5, + 0xc7, 0xc8, 0xc8, + 0xc9, 0xc8, 0xc8, + 0xc3, 0xc9, 0xc9, + 0xc9, 0xca, 0xca, + 0xca, 0xca, 0xca, + 0xc2, 0xcc, 0xcc, + 0xc8, 0xcc, 0xcc, + 0xce, 0xcc, 0xcc, + 0xc8, 0xcd, 0xcd, + 0xd4, 0xcc, 0xcc, + 0xd1, 0xcd, 0xcd, + 0xd3, 0xcd, 0xcd, + 0xd3, 0xcf, 0xcf, + 0xcd, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, + 0xcd, 0xd1, 0xd1, + 0xc8, 0xd4, 0xd4, + 0xd0, 0xd4, 0xd4, + 0xd5, 0xd6, 0xd5, + 0xe3, 0xdc, 0xdc, + 0xd8, 0xdd, 0xe1, + 0xdd, 0xde, 0xde, + 0xe3, 0xdf, 0xdf, + 0xd8, 0xe2, 0xe2, + 0xe4, 0xe2, 0xe2, + 0xe3, 0xe5, 0xe5, + 0xe4, 0xe6, 0xe6, + 0xe5, 0xe7, 0xe7, + 0xe5, 0xe9, 0xe9, + 0xec, 0xea, 0xea, + 0xe5, 0xeb, 0xeb, + 0xee, 0xeb, 0xeb, + 0xf1, 0xed, 0xed, + 0xf4, 0xed, 0xed, + 0xf0, 0xee, 0xee, + 0xf5, 0xf1, 0xf1, + 0xf5, 0xf7, 0xf7, + 0xfa, 0xf7, 0xf7, + 0xfc, 0xfb, 0xfb, + 0xfd, 0xfb, 0xfb, + + 0xf1, 0x07, 0x07, 0x07, 0x07, 0x14, 0x7e, 0x03, 0x07, 0xc0, 0x07, 0x01, + 0x03, 0x9e, 0x83, 0x07, 0x00, 0x08, 0x20, 0x7c, 0x02, 0x1f, 0x3b, 0x94, + 0x6d, 0x34, 0x1d, 0x00, 0x04, 0x05, 0x11, 0x2d, 0xcc, 0x8d, 0x0c, 0x00, + 0x20, 0x8e, 0x81, 0x3f, 0x02, 0x30, 0x88, 0xb4, 0xd0, 0x00, 0xd6, 0xd9, + 0xa4, 0x00, 0x4c, 0xe3, 0xb9, 0x38, 0x10, 0x1a, 0xc7, 0x7b, 0x3f, 0x53, + 0x28, 0x07, 0x1b, 0x00, 0x49, 0xec, 0x72, 0x00, 0x18, 0xbd, 0xe9, 0x68, + 0x04, 0x00, 0x71, 0xeb, 0x99, 0x12, 0x3b, 0x16, 0x98, 0x00, 0xee, 0x9a, + 0x00, 0x00, 0x2c, 0xe6, 0x16, 0x11, 0x00, 0xaf, 0xda, 0x41, 0x03, 0x25, + 0x82, 0xdc, 0xef, 0x40, 0xb3, 0x41, 0x08, 0x6a, 0xca, 0xd2, 0x9c, 0xea, + 0x00, 0x63, 0x00, 0x43, 0xcd, 0x0a, 0xa2, 0xcf, 0x31, 0x00, 0x51, 0xb1, + 0xe5, 0xc2, 0x90, 0x48, 0x03, 0x00, 0x00, 0x00, 0x37, 0x9d, 0xa3, 0x5e, + 0x10, 0x01, 0x75, 0x00, 0xd3, 0x3d, 0x76, 0xbf, 0x86, 0xd1, 0x78, 0xae, + 0x02, 0xdd, 0x9b, 0x40, 0x00, 0x00, 0x00, 0xe9, 0x29, 0x40, 0x1e, 0xc3, + 0x6b, 0xd7, 0xab, 0xdb, 0xe0, 0x80, 0x06, 0x73, 0x5f, 0x57, 0x6e, 0x30, + 0x44, 0x13, 0x03, 0x00, 0x84, 0x79, 0x87, 0x6c, 0x74, 0x89, 0x45, 0x4b, + 0x0c, 0x36, 0x4f, 0x52, 0x5b, 0x47, 0x41, 0x6f, 0x92, 0x00, 0x56, 0x54, + 0x54, 0x54, 0x33, 0x06, 0x09, 0x4a, 0x10, 0x54, 0x60, 0x08, 0x3f, 0x00, + 0x08, 0x9f, 0xa9, 0x00, 0x65, 0x54, 0x77, 0x91, 0x47, 0x4d, 0x44, 0x4e, + 0x20, 0x5c, 0x35, 0x4f, 0x00, 0x00, 0x01, 0x39, 0x2a, 0x00, 0x95, 0xc0, + 0xa7, 0xc1, 0xc3, 0xa5, 0x64, 0x3e, 0x44, 0x0f, 0x4d, 0x13, 0x59, 0x20, + 0x01, 0x17, 0xa1, 0x00, 0xbc, 0xc6, 0x3f, 0xc4, 0x67, 0xc9, 0xd8, 0x8b, + 0x40, 0x2e, 0x45, 0x03, 0x3c, 0x8a, 0xad, 0x8c, 0x5d, 0x00, 0xbb, 0xd5, + 0x32, 0xce, 0x19, 0x97, 0xaa, 0x23, 0x04, 0x93, 0xe7, 0xe8, 0xb2, 0x15, + 0x35, 0x00, 0x27, 0x00, 0x8f, 0xdf, 0xe4, 0x42, 0x26, 0xe2, 0x22, 0x21, + 0x01, 0xde, 0xa0, 0x0d, 0x2f, 0xbe, 0xc5, 0x04, 0x46, 0x00, 0x00, 0x00, + 0x1c, 0x2b, 0x07, 0x69, 0xed, 0x58, 0x01, 0x00, 0x7d, 0xf0, 0x61, 0x00, + 0xb7, 0x96, 0x4f, 0x80, 0x01, 0x3a, 0xba, 0xe1, 0xb0, 0x50, 0x03, 0xa6, + 0x04, 0xac, 0x0b, 0x00, 0xcb, 0x5a, 0x47, 0x00, 0x00, 0x00, 0x62, 0xb5, + 0x7a, 0x1f, 0x00, 0x00, 0x55, 0xc8, 0x0c, 0x24, 0x00, 0x00, 0xd4, 0xe1, + 0x36, 0x18, 0x70, 0x4b, 0x0e, 0x02, 0xb6, 0x46, 0x69, 0xb8, 0x4f, 0x06, + 0x2c, 0x66, 0x85, 0x1a, 0xa8, 0x47, 0x06, 0x2d, 0x04, 0xbc, 0x02, 0x7f, + 0x47, 0x07, 0x77, 0x2c, +}; + +//***************************************************************************** +// +// The first image of the spider facing right. +// +//***************************************************************************** +const uint8_t g_pui8SpiderR1Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 240, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x00, 0x02, 0x02, + 0x00, 0x00, 0x06, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x00, 0x00, 0x07, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x01, 0x04, 0x04, + 0x03, 0x04, 0x04, + 0x04, 0x04, 0x04, + 0x03, 0x05, 0x05, + 0x08, 0x05, 0x05, + 0x05, 0x06, 0x06, + 0x0a, 0x06, 0x06, + 0x04, 0x07, 0x07, + 0x08, 0x07, 0x07, + 0x0b, 0x07, 0x07, + 0x09, 0x08, 0x08, + 0x0b, 0x08, 0x08, + 0x08, 0x0a, 0x0a, + 0x0a, 0x0b, 0x0b, + 0x0b, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, + 0x0e, 0x0d, 0x0d, + 0x0f, 0x0d, 0x0d, + 0x0c, 0x0e, 0x0e, + 0x0d, 0x0e, 0x0e, + 0x0f, 0x0e, 0x0e, + 0x0c, 0x10, 0x10, + 0x0d, 0x10, 0x10, + 0x0e, 0x10, 0x10, + 0x0d, 0x11, 0x11, + 0x13, 0x11, 0x11, + 0x11, 0x12, 0x12, + 0x12, 0x12, 0x12, + 0x15, 0x12, 0x12, + 0x0f, 0x15, 0x15, + 0x14, 0x15, 0x15, + 0x15, 0x16, 0x16, + 0x16, 0x19, 0x19, + 0x17, 0x19, 0x19, + 0x19, 0x19, 0x19, + 0x15, 0x1c, 0x1c, + 0x18, 0x1d, 0x1d, + 0x19, 0x1d, 0x1d, + 0x1b, 0x1d, 0x1d, + 0x00, 0x00, 0x60, + 0x1e, 0x1d, 0x1d, + 0x20, 0x1b, 0x21, + 0x00, 0x00, 0x67, + 0x1a, 0x21, 0x21, + 0x24, 0x21, 0x21, + 0x26, 0x21, 0x21, + 0x21, 0x22, 0x22, + 0x17, 0x26, 0x26, + 0x27, 0x25, 0x25, + 0x28, 0x25, 0x25, + 0x1e, 0x22, 0x2f, + 0x25, 0x26, 0x26, + 0x2b, 0x27, 0x27, + 0x2b, 0x2b, 0x2b, + 0x2f, 0x2b, 0x2b, + 0x2c, 0x2d, 0x2d, + 0x13, 0x00, 0x8f, + 0x09, 0x01, 0x93, + 0x30, 0x2e, 0x2e, + 0x04, 0x03, 0x93, + 0x30, 0x2f, 0x2f, + 0x34, 0x2f, 0x2f, + 0x00, 0x00, 0xa1, + 0x00, 0x00, 0xa4, + 0x30, 0x32, 0x32, + 0x0d, 0x00, 0xa2, + 0x06, 0x03, 0xa7, + 0x00, 0x00, 0xb0, + 0x38, 0x35, 0x35, + 0x2d, 0x37, 0x37, + 0x00, 0x00, 0xb4, + 0x31, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x01, 0x01, 0xb5, + 0x08, 0x0a, 0xa1, + 0x33, 0x39, 0x39, + 0x3c, 0x38, 0x38, + 0x3d, 0x38, 0x38, + 0x25, 0x21, 0x70, + 0x1b, 0x18, 0x86, + 0x3f, 0x39, 0x39, + 0x3b, 0x3b, 0x3b, + 0x0e, 0x0e, 0xa7, + 0x21, 0x1b, 0x88, + 0x3c, 0x3e, 0x3e, + 0x3d, 0x3e, 0x3e, + 0x3b, 0x3f, 0x3f, + 0x22, 0x2b, 0x70, + 0x15, 0x15, 0xa6, + 0x3d, 0x41, 0x41, + 0x41, 0x42, 0x42, + 0x42, 0x42, 0x42, + 0x41, 0x43, 0x43, + 0x49, 0x45, 0x45, + 0x41, 0x47, 0x47, + 0x24, 0x18, 0xaf, + 0x44, 0x47, 0x47, + 0x32, 0x33, 0x77, + 0x46, 0x49, 0x49, + 0x46, 0x4a, 0x4a, + 0x48, 0x4b, 0x4b, + 0x45, 0x4c, 0x4c, + 0x25, 0x25, 0xa5, + 0x29, 0x21, 0xb2, + 0x4b, 0x4e, 0x4e, + 0x49, 0x4f, 0x4f, + 0x26, 0x26, 0xad, + 0x4b, 0x51, 0x51, + 0x53, 0x50, 0x51, + 0x4c, 0x52, 0x52, + 0x50, 0x52, 0x52, + 0x53, 0x55, 0x55, + 0x5e, 0x55, 0x55, + 0x57, 0x56, 0x56, + 0x53, 0x57, 0x57, + 0x51, 0x48, 0x79, + 0x50, 0x59, 0x59, + 0x62, 0x5a, 0x5a, + 0x60, 0x5c, 0x5c, + 0x59, 0x5e, 0x5e, + 0x57, 0x5f, 0x5f, + 0x5a, 0x61, 0x61, + 0x54, 0x53, 0x89, + 0x67, 0x67, 0x67, + 0x4d, 0x4b, 0xaf, + 0x69, 0x6d, 0x6d, + 0x66, 0x6e, 0x6e, + 0x6d, 0x6e, 0x6e, + 0x68, 0x6f, 0x6f, + 0x6f, 0x6f, 0x6f, + 0x71, 0x71, 0x71, + 0x75, 0x71, 0x71, + 0x54, 0x54, 0xb7, + 0x5f, 0x5b, 0xab, + 0x75, 0x74, 0x74, + 0x74, 0x77, 0x77, + 0x70, 0x78, 0x7f, + 0x7f, 0x7e, 0x7e, + 0x81, 0x7e, 0x7e, + 0x82, 0x7e, 0x7e, + 0x7f, 0x80, 0x80, + 0x88, 0x7f, 0x7f, + 0x81, 0x83, 0x83, + 0x8c, 0x86, 0x86, + 0x86, 0x88, 0x88, + 0x88, 0x88, 0x88, + 0x8e, 0x88, 0x88, + 0x8c, 0x8b, 0x8b, + 0x88, 0x8c, 0x8c, + 0x91, 0x8c, 0x8c, + 0x95, 0x90, 0x90, + 0x98, 0x90, 0x90, + 0x83, 0x7b, 0xc1, + 0x91, 0x91, 0x91, + 0x8d, 0x92, 0x95, + 0x99, 0x94, 0x94, + 0x84, 0x88, 0xb7, + 0x98, 0x98, 0x98, + 0x94, 0x9b, 0x9a, + 0x96, 0x9b, 0x9b, + 0x9f, 0x9d, 0x9d, + 0xa5, 0xa1, 0xa3, + 0xa4, 0xa4, 0xa4, + 0xa8, 0xa5, 0xa5, + 0xa3, 0xa6, 0xa6, + 0xab, 0xa7, 0xa7, + 0xb7, 0xa6, 0xa6, + 0xa8, 0xa8, 0xa8, + 0xa3, 0xaa, 0xaa, + 0xa5, 0xac, 0xac, + 0xb0, 0xab, 0xab, + 0xad, 0xae, 0xae, + 0xac, 0xaf, 0xaf, + 0xaf, 0xb2, 0xb2, + 0xb2, 0xb5, 0xb5, + 0xb5, 0xb6, 0xb6, + 0xb5, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb8, + 0xae, 0xba, 0xba, + 0xad, 0xae, 0xd6, + 0xbd, 0xba, 0xba, + 0xbe, 0xbe, 0xbe, + 0xbf, 0xb5, 0xd1, + 0xbc, 0xc0, 0xc0, + 0xc1, 0xc3, 0xc3, + 0xbd, 0xc4, 0xc4, + 0xc0, 0xc5, 0xc5, + 0xc4, 0xc5, 0xc5, + 0xc7, 0xc8, 0xc8, + 0xc9, 0xc8, 0xc8, + 0xc3, 0xc9, 0xc9, + 0xc9, 0xca, 0xca, + 0xca, 0xca, 0xca, + 0xc2, 0xcc, 0xcc, + 0xc8, 0xcc, 0xcc, + 0xce, 0xcc, 0xcc, + 0xc8, 0xcd, 0xcd, + 0xd4, 0xcc, 0xcc, + 0xd1, 0xcd, 0xcd, + 0xd3, 0xcd, 0xcd, + 0xd3, 0xcf, 0xcf, + 0xcd, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, + 0xcd, 0xd1, 0xd1, + 0xc8, 0xd4, 0xd4, + 0xd0, 0xd4, 0xd4, + 0xd5, 0xd6, 0xd5, + 0xe3, 0xdc, 0xdc, + 0xd8, 0xdd, 0xe1, + 0xdd, 0xde, 0xde, + 0xe3, 0xdf, 0xdf, + 0xd8, 0xe2, 0xe2, + 0xe4, 0xe2, 0xe2, + 0xe3, 0xe5, 0xe5, + 0xe4, 0xe6, 0xe6, + 0xe5, 0xe7, 0xe7, + 0xe5, 0xe9, 0xe9, + 0xec, 0xea, 0xea, + 0xe5, 0xeb, 0xeb, + 0xee, 0xeb, 0xeb, + 0xf1, 0xed, 0xed, + 0xf4, 0xed, 0xed, + 0xf0, 0xee, 0xee, + 0xf5, 0xf1, 0xf1, + 0xf5, 0xf7, 0xf7, + 0xfa, 0xf7, 0xf7, + 0xfc, 0xfb, 0xfb, + 0xfd, 0xfb, 0xfb, + + 0xf1, 0x07, 0x07, 0x07, 0x04, 0x03, 0x7e, 0x14, 0x07, 0x80, 0x05, 0x02, + 0x7c, 0x08, 0x00, 0x07, 0x83, 0x9e, 0x60, 0x03, 0x4f, 0x4d, 0x81, 0x8e, + 0x00, 0x0c, 0x8d, 0x00, 0xcc, 0x2d, 0x11, 0x05, 0x04, 0x1d, 0x34, 0x6d, + 0x20, 0x94, 0x3b, 0x4e, 0x7b, 0xc7, 0x1a, 0x38, 0xb9, 0x00, 0xe3, 0x4c, + 0x00, 0xa4, 0xd9, 0xd6, 0xd0, 0xb4, 0x10, 0x88, 0x30, 0x02, 0x44, 0x12, + 0x99, 0xeb, 0x71, 0x00, 0x00, 0x68, 0xe9, 0xbd, 0x18, 0x00, 0x72, 0xec, + 0x04, 0x49, 0x1b, 0x07, 0x28, 0x53, 0x4c, 0x00, 0xb3, 0x00, 0xef, 0xdc, + 0x82, 0x25, 0x03, 0x41, 0xda, 0xaf, 0x00, 0x11, 0x16, 0xe6, 0x2c, 0x00, + 0x00, 0x9a, 0xee, 0x20, 0x98, 0x16, 0x33, 0x03, 0x48, 0x90, 0xc2, 0xe5, + 0x00, 0xb1, 0x51, 0x31, 0xcf, 0xa2, 0x0a, 0xcd, 0x43, 0x00, 0x00, 0x63, + 0xea, 0x9c, 0xd2, 0xca, 0x6a, 0x08, 0x80, 0x33, 0x00, 0x00, 0x40, 0x9b, + 0xdd, 0xae, 0x78, 0x00, 0xd1, 0x86, 0xbf, 0x76, 0x3d, 0xd3, 0x75, 0x01, + 0x04, 0x10, 0x5e, 0xa3, 0x9d, 0x37, 0x3c, 0x30, 0x6e, 0x00, 0x57, 0x5f, + 0x73, 0x80, 0xe0, 0xdb, 0xab, 0xd7, 0x48, 0x6b, 0x7b, 0x1e, 0x29, 0x44, + 0x5b, 0x52, 0x4f, 0x00, 0x36, 0x4b, 0x45, 0x89, 0x74, 0x6c, 0x87, 0x79, + 0x30, 0x84, 0x03, 0x6c, 0x02, 0x08, 0x60, 0x54, 0x4a, 0x00, 0x09, 0x06, + 0x33, 0x54, 0x54, 0x54, 0x56, 0x92, 0x60, 0x6f, 0x47, 0x01, 0x35, 0x5c, + 0x4e, 0x44, 0x4d, 0x00, 0x47, 0x91, 0x77, 0x54, 0x65, 0xa9, 0x9f, 0x08, + 0xc0, 0x47, 0x01, 0x0f, 0x3e, 0x64, 0xa5, 0xc3, 0xc1, 0x03, 0xa7, 0xc0, + 0x95, 0x2a, 0x39, 0x01, 0x47, 0x01, 0x00, 0x2e, 0x8b, 0xd8, 0xc9, 0x67, + 0xc4, 0x3f, 0xc6, 0x11, 0xbc, 0xa1, 0x17, 0x49, 0x20, 0x59, 0x13, 0x1b, + 0x00, 0x15, 0xb2, 0xe8, 0xe7, 0x93, 0x23, 0xaa, 0x97, 0x00, 0x19, 0xce, + 0x32, 0xd5, 0xbb, 0x5d, 0x8c, 0xad, 0x10, 0x8a, 0x3c, 0x03, 0x43, 0x04, + 0xc5, 0xbe, 0x2f, 0x00, 0x0d, 0xa0, 0xde, 0x21, 0x22, 0xe2, 0x26, 0x42, + 0x0c, 0xe4, 0xdf, 0x8f, 0x27, 0x5b, 0x32, 0x96, 0xb7, 0x00, 0x00, 0x61, + 0xf0, 0x7d, 0x00, 0x58, 0xed, 0x69, 0x10, 0x07, 0x2b, 0x1c, 0x57, 0x00, + 0x00, 0x5a, 0xcb, 0x00, 0x00, 0x0b, 0xac, 0xa6, 0x03, 0x50, 0xb0, 0xe1, + 0x32, 0xba, 0x3a, 0x4f, 0x01, 0x24, 0xd4, 0xe1, 0xc8, 0x01, 0x55, 0x00, + 0x00, 0x1f, 0x7a, 0xb5, 0x62, 0x3f, 0xa4, 0x01, 0xb8, 0x01, 0x46, 0xb6, + 0x72, 0x0e, 0x70, 0x44, 0x18, 0x3f, 0x00, 0x00, 0xa8, 0x02, 0x85, 0x66, + 0xd3, 0x77, 0x2e, 0x7f, 0x02, 0x04, 0x2d, 0x47, 0x07, 0xc0, 0x77, 0x2f, +}; + +//***************************************************************************** +// +// The second image of the spider facing right. +// +//***************************************************************************** +const uint8_t g_pui8SpiderR2Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 240, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x00, 0x02, 0x02, + 0x00, 0x00, 0x06, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x00, 0x00, 0x07, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x01, 0x04, 0x04, + 0x03, 0x04, 0x04, + 0x04, 0x04, 0x04, + 0x03, 0x05, 0x05, + 0x08, 0x05, 0x05, + 0x05, 0x06, 0x06, + 0x0a, 0x06, 0x06, + 0x04, 0x07, 0x07, + 0x08, 0x07, 0x07, + 0x0b, 0x07, 0x07, + 0x09, 0x08, 0x08, + 0x0b, 0x08, 0x08, + 0x08, 0x0a, 0x0a, + 0x0a, 0x0b, 0x0b, + 0x0b, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, + 0x0e, 0x0d, 0x0d, + 0x0f, 0x0d, 0x0d, + 0x0c, 0x0e, 0x0e, + 0x0d, 0x0e, 0x0e, + 0x0f, 0x0e, 0x0e, + 0x0c, 0x10, 0x10, + 0x0d, 0x10, 0x10, + 0x0e, 0x10, 0x10, + 0x0d, 0x11, 0x11, + 0x13, 0x11, 0x11, + 0x11, 0x12, 0x12, + 0x12, 0x12, 0x12, + 0x15, 0x12, 0x12, + 0x0f, 0x15, 0x15, + 0x14, 0x15, 0x15, + 0x15, 0x16, 0x16, + 0x16, 0x19, 0x19, + 0x17, 0x19, 0x19, + 0x19, 0x19, 0x19, + 0x15, 0x1c, 0x1c, + 0x18, 0x1d, 0x1d, + 0x19, 0x1d, 0x1d, + 0x1b, 0x1d, 0x1d, + 0x00, 0x00, 0x60, + 0x1e, 0x1d, 0x1d, + 0x20, 0x1b, 0x21, + 0x00, 0x00, 0x67, + 0x1a, 0x21, 0x21, + 0x24, 0x21, 0x21, + 0x26, 0x21, 0x21, + 0x21, 0x22, 0x22, + 0x17, 0x26, 0x26, + 0x27, 0x25, 0x25, + 0x28, 0x25, 0x25, + 0x1e, 0x22, 0x2f, + 0x25, 0x26, 0x26, + 0x2b, 0x27, 0x27, + 0x2b, 0x2b, 0x2b, + 0x2f, 0x2b, 0x2b, + 0x2c, 0x2d, 0x2d, + 0x13, 0x00, 0x8f, + 0x09, 0x01, 0x93, + 0x30, 0x2e, 0x2e, + 0x04, 0x03, 0x93, + 0x30, 0x2f, 0x2f, + 0x34, 0x2f, 0x2f, + 0x00, 0x00, 0xa1, + 0x00, 0x00, 0xa4, + 0x30, 0x32, 0x32, + 0x0d, 0x00, 0xa2, + 0x06, 0x03, 0xa7, + 0x00, 0x00, 0xb0, + 0x38, 0x35, 0x35, + 0x2d, 0x37, 0x37, + 0x00, 0x00, 0xb4, + 0x31, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x01, 0x01, 0xb5, + 0x08, 0x0a, 0xa1, + 0x33, 0x39, 0x39, + 0x3c, 0x38, 0x38, + 0x3d, 0x38, 0x38, + 0x25, 0x21, 0x70, + 0x1b, 0x18, 0x86, + 0x3f, 0x39, 0x39, + 0x3b, 0x3b, 0x3b, + 0x0e, 0x0e, 0xa7, + 0x21, 0x1b, 0x88, + 0x3c, 0x3e, 0x3e, + 0x3d, 0x3e, 0x3e, + 0x3b, 0x3f, 0x3f, + 0x22, 0x2b, 0x70, + 0x15, 0x15, 0xa6, + 0x3d, 0x41, 0x41, + 0x41, 0x42, 0x42, + 0x42, 0x42, 0x42, + 0x41, 0x43, 0x43, + 0x49, 0x45, 0x45, + 0x41, 0x47, 0x47, + 0x24, 0x18, 0xaf, + 0x44, 0x47, 0x47, + 0x32, 0x33, 0x77, + 0x46, 0x49, 0x49, + 0x46, 0x4a, 0x4a, + 0x48, 0x4b, 0x4b, + 0x45, 0x4c, 0x4c, + 0x25, 0x25, 0xa5, + 0x29, 0x21, 0xb2, + 0x4b, 0x4e, 0x4e, + 0x49, 0x4f, 0x4f, + 0x26, 0x26, 0xad, + 0x4b, 0x51, 0x51, + 0x53, 0x50, 0x51, + 0x4c, 0x52, 0x52, + 0x50, 0x52, 0x52, + 0x53, 0x55, 0x55, + 0x5e, 0x55, 0x55, + 0x57, 0x56, 0x56, + 0x53, 0x57, 0x57, + 0x51, 0x48, 0x79, + 0x50, 0x59, 0x59, + 0x62, 0x5a, 0x5a, + 0x60, 0x5c, 0x5c, + 0x59, 0x5e, 0x5e, + 0x57, 0x5f, 0x5f, + 0x5a, 0x61, 0x61, + 0x54, 0x53, 0x89, + 0x67, 0x67, 0x67, + 0x4d, 0x4b, 0xaf, + 0x69, 0x6d, 0x6d, + 0x66, 0x6e, 0x6e, + 0x6d, 0x6e, 0x6e, + 0x68, 0x6f, 0x6f, + 0x6f, 0x6f, 0x6f, + 0x71, 0x71, 0x71, + 0x75, 0x71, 0x71, + 0x54, 0x54, 0xb7, + 0x5f, 0x5b, 0xab, + 0x75, 0x74, 0x74, + 0x74, 0x77, 0x77, + 0x70, 0x78, 0x7f, + 0x7f, 0x7e, 0x7e, + 0x81, 0x7e, 0x7e, + 0x82, 0x7e, 0x7e, + 0x7f, 0x80, 0x80, + 0x88, 0x7f, 0x7f, + 0x81, 0x83, 0x83, + 0x8c, 0x86, 0x86, + 0x86, 0x88, 0x88, + 0x88, 0x88, 0x88, + 0x8e, 0x88, 0x88, + 0x8c, 0x8b, 0x8b, + 0x88, 0x8c, 0x8c, + 0x91, 0x8c, 0x8c, + 0x95, 0x90, 0x90, + 0x83, 0x7b, 0xc1, + 0x98, 0x90, 0x90, + 0x91, 0x91, 0x91, + 0x8d, 0x92, 0x95, + 0x99, 0x94, 0x94, + 0x84, 0x88, 0xb7, + 0x98, 0x98, 0x98, + 0x94, 0x9b, 0x9a, + 0x96, 0x9b, 0x9b, + 0x9f, 0x9d, 0x9d, + 0xa5, 0xa1, 0xa3, + 0xa4, 0xa4, 0xa4, + 0xa8, 0xa5, 0xa5, + 0xa3, 0xa6, 0xa6, + 0xab, 0xa7, 0xa7, + 0xb7, 0xa6, 0xa6, + 0xa8, 0xa8, 0xa8, + 0xa3, 0xaa, 0xaa, + 0xa5, 0xac, 0xac, + 0xb0, 0xab, 0xab, + 0xad, 0xae, 0xae, + 0xac, 0xaf, 0xaf, + 0xaf, 0xb2, 0xb2, + 0xb2, 0xb5, 0xb5, + 0xb5, 0xb6, 0xb6, + 0xb5, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb8, + 0xae, 0xba, 0xba, + 0xad, 0xae, 0xd6, + 0xbd, 0xba, 0xba, + 0xbe, 0xbe, 0xbe, + 0xbf, 0xb5, 0xd1, + 0xbc, 0xc0, 0xc0, + 0xc1, 0xc3, 0xc3, + 0xbd, 0xc4, 0xc4, + 0xc0, 0xc5, 0xc5, + 0xc4, 0xc5, 0xc5, + 0xc7, 0xc8, 0xc8, + 0xc9, 0xc8, 0xc8, + 0xc3, 0xc9, 0xc9, + 0xc9, 0xca, 0xca, + 0xca, 0xca, 0xca, + 0xc2, 0xcc, 0xcc, + 0xc8, 0xcc, 0xcc, + 0xce, 0xcc, 0xcc, + 0xc8, 0xcd, 0xcd, + 0xd4, 0xcc, 0xcc, + 0xd1, 0xcd, 0xcd, + 0xd3, 0xcd, 0xcd, + 0xd3, 0xcf, 0xcf, + 0xcd, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, + 0xcd, 0xd1, 0xd1, + 0xc8, 0xd4, 0xd4, + 0xd0, 0xd4, 0xd4, + 0xd5, 0xd6, 0xd5, + 0xe3, 0xdc, 0xdc, + 0xd8, 0xdd, 0xe1, + 0xdd, 0xde, 0xde, + 0xe3, 0xdf, 0xdf, + 0xd8, 0xe2, 0xe2, + 0xe4, 0xe2, 0xe2, + 0xe3, 0xe5, 0xe5, + 0xe4, 0xe6, 0xe6, + 0xe5, 0xe7, 0xe7, + 0xe5, 0xe9, 0xe9, + 0xec, 0xea, 0xea, + 0xe5, 0xeb, 0xeb, + 0xee, 0xeb, 0xeb, + 0xf1, 0xed, 0xed, + 0xf4, 0xed, 0xed, + 0xf0, 0xee, 0xee, + 0xf5, 0xf1, 0xf1, + 0xf5, 0xf7, 0xf7, + 0xfa, 0xf7, 0xf7, + 0xfc, 0xfb, 0xfb, + 0xfd, 0xfb, 0xfb, + + 0xf4, 0x07, 0x07, 0x07, 0x01, 0x7f, 0x02, 0x04, 0x2d, 0xd3, 0x07, 0x06, + 0xa8, 0x02, 0x85, 0x66, 0x47, 0x06, 0x48, 0xb8, 0x01, 0x46, 0xb6, 0x1a, + 0x0e, 0x70, 0x18, 0x88, 0x17, 0x00, 0x24, 0xd4, 0xe1, 0xc8, 0x55, 0x00, + 0x04, 0x00, 0x1f, 0x7a, 0xb5, 0x62, 0x4f, 0x00, 0x00, 0x00, 0x5a, 0xcb, + 0x00, 0x0b, 0xac, 0xa6, 0x03, 0x50, 0x0c, 0xb0, 0xe1, 0xba, 0x3a, 0x4f, + 0x01, 0x96, 0xb7, 0x00, 0x00, 0x61, 0xf0, 0x7d, 0x00, 0x58, 0xed, 0x69, + 0x10, 0x07, 0x2b, 0x1c, 0x3f, 0x00, 0x04, 0xc5, 0xbe, 0x00, 0x2f, 0x0d, + 0xa0, 0xde, 0x21, 0x22, 0xe2, 0x26, 0x04, 0x42, 0xe4, 0xdf, 0x8f, 0x27, + 0x36, 0x15, 0xb2, 0x00, 0xe8, 0xe7, 0x93, 0x23, 0xaa, 0x97, 0x19, 0xce, + 0x00, 0x32, 0xd5, 0xbb, 0x5d, 0x8c, 0xad, 0x8a, 0x3c, 0x40, 0x03, 0x2d, + 0x2e, 0x8b, 0xd8, 0xc9, 0x67, 0xc4, 0x04, 0x3f, 0xc6, 0xbc, 0xa1, 0x17, + 0x71, 0x20, 0x59, 0x40, 0x13, 0x45, 0x0f, 0x3e, 0x64, 0xa4, 0xc3, 0xc1, + 0x03, 0xa7, 0xc0, 0x95, 0x2a, 0x39, 0x01, 0x6d, 0x32, 0x00, 0x35, 0x5c, + 0x4e, 0x44, 0x4d, 0x47, 0x91, 0x77, 0x04, 0x54, 0x65, 0xa9, 0x9f, 0x08, + 0x47, 0x00, 0x08, 0x00, 0x60, 0x54, 0x4a, 0x09, 0x06, 0x33, 0x54, 0x54, + 0x04, 0x54, 0x56, 0x92, 0x6f, 0x03, 0x47, 0x00, 0x00, 0x00, 0x5b, 0x52, + 0x4f, 0x36, 0x4b, 0x45, 0x89, 0x74, 0x0c, 0x6c, 0x87, 0x79, 0x84, 0x47, + 0x01, 0x30, 0x6e, 0x00, 0x57, 0x5f, 0x73, 0x80, 0xe0, 0xdb, 0xab, 0xd7, + 0x48, 0x6b, 0x53, 0x1e, 0x29, 0x1c, 0x40, 0x9b, 0xdd, 0x00, 0xae, 0x78, + 0xd1, 0x86, 0xbf, 0x76, 0x3d, 0xd3, 0x00, 0x75, 0x01, 0x10, 0x5e, 0xa3, + 0x9d, 0x37, 0x00, 0x00, 0x00, 0x03, 0x48, 0x90, 0xc2, 0xe5, 0xb1, 0x51, + 0x00, 0x31, 0xcf, 0xa2, 0x0a, 0xcd, 0x43, 0x00, 0x63, 0x00, 0xea, 0x9c, + 0xd2, 0xca, 0x6a, 0x08, 0x00, 0x00, 0x00, 0x00, 0xb3, 0xef, 0xdc, 0x82, + 0x25, 0x03, 0x41, 0x00, 0xda, 0xaf, 0x11, 0x16, 0xe6, 0x2c, 0x00, 0x00, + 0x08, 0x9a, 0xee, 0x98, 0x16, 0x51, 0x00, 0x00, 0x12, 0x00, 0x99, 0xeb, + 0x71, 0x00, 0x68, 0xe9, 0xbd, 0x18, 0x00, 0x00, 0x72, 0xec, 0x49, 0x1b, + 0x07, 0x28, 0x53, 0xc0, 0x53, 0x29, 0x02, 0x7b, 0xc7, 0x1a, 0x38, 0xb9, + 0x00, 0xe3, 0x4c, 0x00, 0xa5, 0xd9, 0xd6, 0xd0, 0xb4, 0x10, 0x88, 0x30, + 0x02, 0x3f, 0x81, 0x8e, 0x00, 0x0c, 0x00, 0x8d, 0xcc, 0x2d, 0x11, 0x05, + 0x04, 0x1d, 0x34, 0x10, 0x6d, 0x94, 0x3b, 0x46, 0x00, 0x02, 0x7c, 0x08, + 0x07, 0x00, 0x07, 0x83, 0x9e, 0x03, 0x7f, 0x37, 0x01, 0x1e, 0x03, 0x7e, + 0x14, 0x47, 0x07, 0x77, 0x2f, +}; + +//***************************************************************************** +// +// The first image of the spider facing up. +// +//***************************************************************************** +const uint8_t g_pui8SpiderU1Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 238, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x00, 0x02, 0x02, + 0x00, 0x00, 0x06, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x00, 0x00, 0x07, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x01, 0x04, 0x04, + 0x04, 0x04, 0x04, + 0x03, 0x05, 0x05, + 0x08, 0x05, 0x05, + 0x05, 0x06, 0x06, + 0x08, 0x06, 0x06, + 0x0a, 0x06, 0x06, + 0x04, 0x07, 0x07, + 0x0a, 0x07, 0x07, + 0x09, 0x08, 0x08, + 0x0b, 0x08, 0x08, + 0x09, 0x09, 0x09, + 0x08, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, + 0x0f, 0x0c, 0x0c, + 0x0c, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, + 0x0e, 0x0d, 0x0d, + 0x0c, 0x0e, 0x0e, + 0x0f, 0x0e, 0x0e, + 0x0c, 0x10, 0x10, + 0x0d, 0x10, 0x10, + 0x0e, 0x10, 0x10, + 0x0d, 0x11, 0x11, + 0x13, 0x11, 0x11, + 0x12, 0x12, 0x12, + 0x16, 0x12, 0x12, + 0x11, 0x13, 0x13, + 0x0f, 0x15, 0x15, + 0x14, 0x15, 0x15, + 0x15, 0x16, 0x16, + 0x17, 0x18, 0x18, + 0x17, 0x19, 0x19, + 0x19, 0x19, 0x19, + 0x15, 0x1c, 0x1c, + 0x18, 0x1c, 0x1c, + 0x1b, 0x1c, 0x1c, + 0x19, 0x1d, 0x1d, + 0x00, 0x00, 0x60, + 0x1e, 0x1d, 0x1d, + 0x20, 0x1b, 0x21, + 0x00, 0x00, 0x67, + 0x1a, 0x21, 0x21, + 0x24, 0x21, 0x21, + 0x26, 0x21, 0x21, + 0x21, 0x22, 0x22, + 0x17, 0x26, 0x26, + 0x28, 0x25, 0x25, + 0x1e, 0x22, 0x2f, + 0x25, 0x26, 0x26, + 0x27, 0x26, 0x26, + 0x2b, 0x26, 0x26, + 0x2b, 0x2b, 0x2b, + 0x2f, 0x2b, 0x2b, + 0x12, 0x00, 0x8f, + 0x2c, 0x2d, 0x2d, + 0x09, 0x01, 0x93, + 0x30, 0x2e, 0x2e, + 0x04, 0x03, 0x93, + 0x34, 0x2e, 0x2e, + 0x30, 0x2f, 0x2f, + 0x00, 0x00, 0xa2, + 0x00, 0x00, 0xa4, + 0x30, 0x32, 0x32, + 0x0d, 0x00, 0xa2, + 0x00, 0x00, 0xb0, + 0x06, 0x04, 0xa7, + 0x38, 0x35, 0x35, + 0x2d, 0x37, 0x37, + 0x00, 0x00, 0xb4, + 0x31, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x01, 0x01, 0xb5, + 0x08, 0x0a, 0xa1, + 0x33, 0x39, 0x39, + 0x3c, 0x38, 0x38, + 0x3d, 0x38, 0x38, + 0x3f, 0x38, 0x38, + 0x25, 0x21, 0x70, + 0x1c, 0x17, 0x87, + 0x3b, 0x3b, 0x3b, + 0x0e, 0x0e, 0xa7, + 0x21, 0x1b, 0x88, + 0x3c, 0x3e, 0x3e, + 0x22, 0x2a, 0x6f, + 0x3d, 0x3e, 0x3e, + 0x3b, 0x40, 0x40, + 0x3d, 0x41, 0x41, + 0x16, 0x15, 0xa6, + 0x41, 0x42, 0x42, + 0x41, 0x43, 0x43, + 0x49, 0x44, 0x44, + 0x41, 0x47, 0x47, + 0x24, 0x18, 0xaf, + 0x44, 0x47, 0x47, + 0x32, 0x33, 0x77, + 0x47, 0x49, 0x49, + 0x47, 0x4a, 0x4a, + 0x48, 0x4b, 0x4b, + 0x25, 0x24, 0xa5, + 0x45, 0x4c, 0x4c, + 0x29, 0x20, 0xb2, + 0x4b, 0x4e, 0x4e, + 0x49, 0x4f, 0x4f, + 0x26, 0x26, 0xad, + 0x4b, 0x51, 0x51, + 0x53, 0x50, 0x51, + 0x4c, 0x52, 0x52, + 0x50, 0x52, 0x52, + 0x53, 0x55, 0x55, + 0x5e, 0x55, 0x55, + 0x57, 0x56, 0x56, + 0x53, 0x57, 0x57, + 0x50, 0x59, 0x59, + 0x51, 0x49, 0x79, + 0x62, 0x5a, 0x5a, + 0x60, 0x5c, 0x5c, + 0x59, 0x5e, 0x5e, + 0x57, 0x5f, 0x5f, + 0x5b, 0x61, 0x61, + 0x54, 0x53, 0x89, + 0x68, 0x66, 0x66, + 0x4d, 0x4b, 0xaf, + 0x69, 0x6d, 0x6d, + 0x66, 0x6e, 0x6e, + 0x6d, 0x6e, 0x6e, + 0x68, 0x6f, 0x6f, + 0x6e, 0x6f, 0x6f, + 0x71, 0x71, 0x71, + 0x53, 0x53, 0xb7, + 0x75, 0x71, 0x71, + 0x5f, 0x5c, 0xab, + 0x76, 0x74, 0x74, + 0x74, 0x77, 0x77, + 0x70, 0x77, 0x7f, + 0x80, 0x7e, 0x7e, + 0x82, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, + 0x88, 0x7f, 0x7f, + 0x80, 0x83, 0x83, + 0x8b, 0x86, 0x86, + 0x86, 0x88, 0x88, + 0x88, 0x88, 0x88, + 0x8e, 0x88, 0x88, + 0x8c, 0x8b, 0x8b, + 0x88, 0x8c, 0x8c, + 0x91, 0x8b, 0x8b, + 0x83, 0x7a, 0xc1, + 0x95, 0x90, 0x90, + 0x98, 0x90, 0x90, + 0x91, 0x91, 0x91, + 0x8e, 0x92, 0x95, + 0x99, 0x94, 0x94, + 0x84, 0x88, 0xb7, + 0x98, 0x98, 0x98, + 0x94, 0x9b, 0x9a, + 0x96, 0x9b, 0x9b, + 0x9f, 0x9d, 0x9d, + 0xa5, 0xa2, 0xa4, + 0xa4, 0xa5, 0xa5, + 0xa7, 0xa5, 0xa5, + 0xa3, 0xa6, 0xa6, + 0xab, 0xa7, 0xa7, + 0xb7, 0xa6, 0xa6, + 0xa8, 0xa8, 0xa8, + 0xa3, 0xa9, 0xa9, + 0xa5, 0xac, 0xac, + 0xb0, 0xac, 0xac, + 0xac, 0xae, 0xae, + 0xad, 0xae, 0xae, + 0xaf, 0xb2, 0xb2, + 0xb2, 0xb5, 0xb5, + 0xb6, 0xb6, 0xb6, + 0xb5, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb8, + 0xae, 0xba, 0xba, + 0xad, 0xae, 0xd6, + 0xbe, 0xba, 0xba, + 0xbe, 0xbe, 0xbe, + 0xbf, 0xb5, 0xd1, + 0xbc, 0xc0, 0xc0, + 0xc1, 0xc3, 0xc3, + 0xbd, 0xc4, 0xc4, + 0xc0, 0xc5, 0xc5, + 0xc4, 0xc5, 0xc5, + 0xc7, 0xc8, 0xc8, + 0xc9, 0xc8, 0xc8, + 0xc3, 0xc9, 0xc9, + 0xca, 0xc9, 0xc9, + 0xca, 0xcb, 0xcb, + 0xc2, 0xcc, 0xcc, + 0xc8, 0xcc, 0xcc, + 0xce, 0xcc, 0xcc, + 0xc8, 0xcd, 0xcd, + 0xd3, 0xcc, 0xcc, + 0xd4, 0xcc, 0xcc, + 0xd1, 0xcd, 0xcd, + 0xd3, 0xcf, 0xcf, + 0xcd, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, + 0xcc, 0xd1, 0xd1, + 0xd0, 0xd3, 0xd3, + 0xc8, 0xd4, 0xd4, + 0xd5, 0xd5, 0xd5, + 0xe3, 0xdc, 0xdc, + 0xd8, 0xdd, 0xe1, + 0xdd, 0xde, 0xde, + 0xe3, 0xdf, 0xdf, + 0xd8, 0xe2, 0xe2, + 0xe4, 0xe2, 0xe2, + 0xe3, 0xe5, 0xe5, + 0xe3, 0xe6, 0xe6, + 0xe5, 0xe7, 0xe7, + 0xe5, 0xe9, 0xe9, + 0xec, 0xea, 0xea, + 0xe5, 0xeb, 0xeb, + 0xee, 0xeb, 0xeb, + 0xf1, 0xed, 0xed, + 0xf4, 0xed, 0xed, + 0xf0, 0xee, 0xee, + 0xf4, 0xf1, 0xf1, + 0xf5, 0xf7, 0xf7, + 0xfa, 0xf7, 0xf7, + 0xfc, 0xfb, 0xfb, + 0xfd, 0xfc, 0xfc, + + 0xf2, 0x07, 0x07, 0x07, 0x03, 0x36, 0x28, 0x02, 0x13, 0x62, 0x03, 0x07, + 0x04, 0x08, 0x9b, 0x1e, 0x02, 0x58, 0x64, 0x3e, 0x47, 0x04, 0x68, 0xa2, + 0x03, 0x1f, 0x88, 0xc4, 0x47, 0x03, 0x17, 0xc8, 0x5d, 0x04, 0xab, 0x25, + 0x80, 0x3f, 0x00, 0x3a, 0x02, 0x00, 0x95, 0xd1, 0x0f, 0x94, 0x44, 0x8a, + 0x8d, 0x01, 0x18, 0x24, 0x92, 0x31, 0x00, 0x52, 0xec, 0x9a, 0x00, 0x00, + 0x03, 0x03, 0x08, 0x00, 0x01, 0x00, 0x5a, 0xdd, 0x1d, 0x00, 0x62, 0x6e, + 0x80, 0x44, 0x6b, 0x86, 0x26, 0x98, 0xe8, 0x73, 0x00, 0x00, 0x82, 0x6d, + 0x9d, 0x38, 0x16, 0xb9, 0xe2, 0x2a, 0x10, 0x39, 0xb3, 0x0d, 0x44, 0x33, + 0xb2, 0x07, 0x01, 0x00, 0x63, 0xd2, 0x69, 0x77, 0x90, 0xa7, 0x29, 0x9f, + 0x04, 0xd3, 0x41, 0x07, 0xb8, 0x78, 0x4c, 0x00, 0x1a, 0x00, 0xce, 0x1c, + 0x00, 0x00, 0x3b, 0xd5, 0x85, 0x55, 0x01, 0x65, 0x93, 0xba, 0x30, 0x27, + 0x67, 0xdf, 0x91, 0x80, 0x33, 0x04, 0xd4, 0x47, 0x2c, 0x43, 0x74, 0xa9, + 0x00, 0x6a, 0x53, 0x53, 0xbe, 0xc4, 0xcc, 0xe0, 0xeb, 0x40, 0xae, 0x4d, + 0x00, 0x05, 0xd8, 0xea, 0xe4, 0xcb, 0x00, 0xbd, 0xd9, 0x72, 0x53, 0x75, + 0xa5, 0x3d, 0x19, 0x00, 0x21, 0x57, 0x4f, 0x00, 0x00, 0x64, 0x2b, 0x00, + 0x00, 0x00, 0x11, 0x03, 0x10, 0xa3, 0x71, 0x15, 0x0a, 0x00, 0x84, 0xde, + 0x87, 0x53, 0x8e, 0xbf, 0xc2, 0x94, 0x00, 0x20, 0x00, 0x03, 0x54, 0xb4, + 0x83, 0x04, 0x00, 0x00, 0x00, 0x7c, 0x9c, 0x2c, 0x00, 0x00, 0x10, 0xa0, + 0x00, 0xcf, 0x7f, 0x44, 0x32, 0x46, 0xc1, 0x67, 0xa8, 0x00, 0xdc, 0x7b, + 0xa4, 0xc6, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0xca, 0x4b, + 0x18, 0xad, 0xcd, 0x00, 0x76, 0x70, 0x4a, 0x06, 0x4c, 0xa1, 0xc7, 0x22, + 0x08, 0x9e, 0xee, 0xaa, 0x23, 0x4a, 0x00, 0x00, 0x07, 0x00, 0x8b, 0xe1, + 0xbb, 0xd7, 0x31, 0xac, 0x5e, 0x35, 0x00, 0x09, 0x42, 0x61, 0xd6, 0x91, + 0x0e, 0x60, 0x0b, 0x80, 0x4c, 0x00, 0x00, 0x0c, 0xb6, 0xe7, 0x40, 0x50, + 0x00, 0xdb, 0x56, 0x4d, 0x49, 0x4e, 0x3c, 0x89, 0xe5, 0x40, 0x2e, 0x56, + 0x00, 0x08, 0x00, 0x37, 0x66, 0x03, 0x00, 0xaf, 0x99, 0x6c, 0x51, 0x53, + 0x5c, 0x0e, 0x2d, 0x00, 0xe6, 0xbc, 0xb5, 0xc9, 0xd0, 0xb7, 0xa6, 0x7d, + 0x80, 0x11, 0x7a, 0x8c, 0x1b, 0x00, 0x24, 0xe3, 0x3f, 0x00, 0x2f, 0x5b, + 0x5f, 0x34, 0x00, 0x00, 0xb0, 0xc3, 0x18, 0x96, 0x59, 0x23, 0x59, 0x41, + 0x02, 0x7e, 0xc5, 0x14, 0x6f, 0x80, 0xc0, 0xa1, 0x08, 0x81, 0x14, 0x04, + 0xc3, 0x5c, 0x3b, 0x79, 0xe9, 0xda, 0x8f, 0x8f, 0x47, 0x8e, 0x39, 0x97, + 0xed, 0x48, 0x47, 0x07, 0x01, 0x12, 0x3e, 0xb1, 0x03, 0x47, 0x07, 0x77, + 0x2f, 0x07, +}; + +//***************************************************************************** +// +// The second image of the spider facing up. +// +//***************************************************************************** +const uint8_t g_pui8SpiderU2Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 238, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x00, 0x02, 0x02, + 0x00, 0x00, 0x06, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x00, 0x00, 0x07, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x01, 0x04, 0x04, + 0x04, 0x04, 0x04, + 0x03, 0x05, 0x05, + 0x08, 0x05, 0x05, + 0x05, 0x06, 0x06, + 0x08, 0x06, 0x06, + 0x0a, 0x06, 0x06, + 0x04, 0x07, 0x07, + 0x0a, 0x07, 0x07, + 0x09, 0x08, 0x08, + 0x0b, 0x08, 0x08, + 0x09, 0x09, 0x09, + 0x08, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, + 0x0f, 0x0c, 0x0c, + 0x0c, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, + 0x0e, 0x0d, 0x0d, + 0x0c, 0x0e, 0x0e, + 0x0f, 0x0e, 0x0e, + 0x0c, 0x10, 0x10, + 0x0d, 0x10, 0x10, + 0x0e, 0x10, 0x10, + 0x0d, 0x11, 0x11, + 0x13, 0x11, 0x11, + 0x12, 0x12, 0x12, + 0x16, 0x12, 0x12, + 0x11, 0x13, 0x13, + 0x0f, 0x15, 0x15, + 0x14, 0x15, 0x15, + 0x15, 0x16, 0x16, + 0x17, 0x18, 0x18, + 0x17, 0x19, 0x19, + 0x19, 0x19, 0x19, + 0x15, 0x1c, 0x1c, + 0x18, 0x1c, 0x1c, + 0x1b, 0x1c, 0x1c, + 0x19, 0x1d, 0x1d, + 0x00, 0x00, 0x60, + 0x1e, 0x1d, 0x1d, + 0x20, 0x1b, 0x21, + 0x00, 0x00, 0x67, + 0x1a, 0x21, 0x21, + 0x24, 0x21, 0x21, + 0x26, 0x21, 0x21, + 0x21, 0x22, 0x22, + 0x17, 0x26, 0x26, + 0x28, 0x25, 0x25, + 0x1e, 0x22, 0x2f, + 0x25, 0x26, 0x26, + 0x27, 0x26, 0x26, + 0x2b, 0x26, 0x26, + 0x2b, 0x2b, 0x2b, + 0x2f, 0x2b, 0x2b, + 0x12, 0x00, 0x8f, + 0x2c, 0x2d, 0x2d, + 0x09, 0x01, 0x93, + 0x30, 0x2e, 0x2e, + 0x04, 0x03, 0x93, + 0x34, 0x2e, 0x2e, + 0x30, 0x2f, 0x2f, + 0x00, 0x00, 0xa2, + 0x00, 0x00, 0xa4, + 0x30, 0x32, 0x32, + 0x0d, 0x00, 0xa2, + 0x00, 0x00, 0xb0, + 0x06, 0x04, 0xa7, + 0x38, 0x35, 0x35, + 0x2d, 0x37, 0x37, + 0x00, 0x00, 0xb4, + 0x31, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x01, 0x01, 0xb5, + 0x08, 0x0a, 0xa1, + 0x33, 0x39, 0x39, + 0x3c, 0x38, 0x38, + 0x3d, 0x38, 0x38, + 0x3f, 0x38, 0x38, + 0x25, 0x21, 0x70, + 0x1c, 0x17, 0x87, + 0x3b, 0x3b, 0x3b, + 0x0e, 0x0e, 0xa7, + 0x21, 0x1b, 0x88, + 0x3c, 0x3e, 0x3e, + 0x22, 0x2a, 0x6f, + 0x3d, 0x3e, 0x3e, + 0x3b, 0x40, 0x40, + 0x3d, 0x41, 0x41, + 0x16, 0x15, 0xa6, + 0x41, 0x42, 0x42, + 0x41, 0x43, 0x43, + 0x49, 0x44, 0x44, + 0x41, 0x47, 0x47, + 0x24, 0x18, 0xaf, + 0x44, 0x47, 0x47, + 0x32, 0x33, 0x77, + 0x47, 0x49, 0x49, + 0x47, 0x4a, 0x4a, + 0x48, 0x4b, 0x4b, + 0x25, 0x24, 0xa5, + 0x45, 0x4c, 0x4c, + 0x29, 0x20, 0xb2, + 0x4b, 0x4e, 0x4e, + 0x49, 0x4f, 0x4f, + 0x26, 0x26, 0xad, + 0x4b, 0x51, 0x51, + 0x53, 0x50, 0x51, + 0x4c, 0x52, 0x52, + 0x50, 0x52, 0x52, + 0x53, 0x55, 0x55, + 0x5e, 0x55, 0x55, + 0x57, 0x56, 0x56, + 0x53, 0x57, 0x57, + 0x50, 0x59, 0x59, + 0x51, 0x49, 0x79, + 0x62, 0x5a, 0x5a, + 0x60, 0x5c, 0x5c, + 0x59, 0x5e, 0x5e, + 0x57, 0x5f, 0x5f, + 0x5b, 0x61, 0x61, + 0x54, 0x53, 0x89, + 0x68, 0x66, 0x66, + 0x4d, 0x4b, 0xaf, + 0x69, 0x6d, 0x6d, + 0x66, 0x6e, 0x6e, + 0x6d, 0x6e, 0x6e, + 0x68, 0x6f, 0x6f, + 0x6e, 0x6f, 0x6f, + 0x71, 0x71, 0x71, + 0x53, 0x53, 0xb7, + 0x75, 0x71, 0x71, + 0x5f, 0x5c, 0xab, + 0x76, 0x74, 0x74, + 0x74, 0x77, 0x77, + 0x70, 0x77, 0x7f, + 0x80, 0x7e, 0x7e, + 0x82, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, + 0x88, 0x7f, 0x7f, + 0x80, 0x83, 0x83, + 0x8b, 0x86, 0x86, + 0x86, 0x88, 0x88, + 0x88, 0x88, 0x88, + 0x8e, 0x88, 0x88, + 0x8c, 0x8b, 0x8b, + 0x88, 0x8c, 0x8c, + 0x91, 0x8b, 0x8b, + 0x83, 0x7a, 0xc1, + 0x95, 0x90, 0x90, + 0x98, 0x90, 0x90, + 0x91, 0x91, 0x91, + 0x8e, 0x92, 0x95, + 0x99, 0x94, 0x94, + 0x84, 0x88, 0xb7, + 0x98, 0x98, 0x98, + 0x94, 0x9b, 0x9a, + 0x96, 0x9b, 0x9b, + 0x9f, 0x9d, 0x9d, + 0xa5, 0xa2, 0xa4, + 0xa4, 0xa5, 0xa5, + 0xa7, 0xa5, 0xa5, + 0xa3, 0xa6, 0xa6, + 0xab, 0xa7, 0xa7, + 0xb7, 0xa6, 0xa6, + 0xa8, 0xa8, 0xa8, + 0xa3, 0xa9, 0xa9, + 0xa5, 0xac, 0xac, + 0xb0, 0xac, 0xac, + 0xac, 0xae, 0xae, + 0xad, 0xae, 0xae, + 0xaf, 0xb2, 0xb2, + 0xb2, 0xb5, 0xb5, + 0xb6, 0xb6, 0xb6, + 0xb5, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb8, + 0xae, 0xba, 0xba, + 0xad, 0xae, 0xd6, + 0xbe, 0xba, 0xba, + 0xbe, 0xbe, 0xbe, + 0xbf, 0xb5, 0xd1, + 0xbc, 0xc0, 0xc0, + 0xc1, 0xc3, 0xc3, + 0xbd, 0xc4, 0xc4, + 0xc0, 0xc5, 0xc5, + 0xc4, 0xc5, 0xc5, + 0xc7, 0xc8, 0xc8, + 0xc9, 0xc8, 0xc8, + 0xc3, 0xc9, 0xc9, + 0xca, 0xc9, 0xc9, + 0xca, 0xcb, 0xcb, + 0xc2, 0xcc, 0xcc, + 0xc8, 0xcc, 0xcc, + 0xce, 0xcc, 0xcc, + 0xc8, 0xcd, 0xcd, + 0xd3, 0xcc, 0xcc, + 0xd4, 0xcc, 0xcc, + 0xd1, 0xcd, 0xcd, + 0xd3, 0xcf, 0xcf, + 0xcd, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, + 0xcc, 0xd1, 0xd1, + 0xd0, 0xd3, 0xd3, + 0xc8, 0xd4, 0xd4, + 0xd5, 0xd5, 0xd5, + 0xe3, 0xdc, 0xdc, + 0xd8, 0xdd, 0xe1, + 0xdd, 0xde, 0xde, + 0xe3, 0xdf, 0xdf, + 0xd8, 0xe2, 0xe2, + 0xe4, 0xe2, 0xe2, + 0xe3, 0xe5, 0xe5, + 0xe3, 0xe6, 0xe6, + 0xe5, 0xe7, 0xe7, + 0xe5, 0xe9, 0xe9, + 0xec, 0xea, 0xea, + 0xe5, 0xeb, 0xeb, + 0xee, 0xeb, 0xeb, + 0xf1, 0xed, 0xed, + 0xf4, 0xed, 0xed, + 0xf0, 0xee, 0xee, + 0xf4, 0xf1, 0xf1, + 0xf5, 0xf7, 0xf7, + 0xfa, 0xf7, 0xf7, + 0xfc, 0xfb, 0xfb, + 0xfd, 0xfc, 0xfc, + + 0xf2, 0x07, 0x07, 0x07, 0x03, 0x03, 0x13, 0x02, 0x28, 0x64, 0x36, 0x07, + 0x05, 0x3e, 0x58, 0x02, 0x1e, 0x9b, 0x64, 0x08, 0x3f, 0x04, 0x88, 0x1f, + 0x03, 0xa2, 0x68, 0xc8, 0x47, 0x03, 0x25, 0xab, 0x04, 0x5d, 0xc8, 0x17, + 0xa4, 0x3f, 0x18, 0x01, 0x8d, 0x8a, 0x04, 0x0f, 0xd1, 0x08, 0x95, 0x00, + 0x02, 0x3a, 0x2c, 0x6e, 0x62, 0x00, 0x00, 0x1d, 0xdd, 0x5a, 0x00, 0x01, + 0x08, 0x03, 0x03, 0x01, 0x00, 0x00, 0x9a, 0xec, 0x52, 0x31, 0x92, 0x44, + 0x00, 0x0d, 0xb3, 0x39, 0x2a, 0xe2, 0xb9, 0x16, 0x38, 0x00, 0x9d, 0x6d, + 0x82, 0x00, 0x73, 0xe8, 0x98, 0x26, 0x20, 0x86, 0x6b, 0x44, 0x00, 0x78, + 0xb8, 0x07, 0x41, 0x00, 0xd3, 0x9f, 0x29, 0xa7, 0x90, 0x77, 0x69, 0xd2, + 0x04, 0x63, 0x01, 0x07, 0xb2, 0x33, 0x45, 0x1c, 0xdf, 0x00, 0x67, 0x27, + 0x30, 0xba, 0x93, 0x65, 0x55, 0x85, 0x24, 0xd5, 0x3b, 0x91, 0xce, 0x1a, + 0x45, 0x00, 0xae, 0x00, 0xeb, 0xe0, 0xcc, 0xc4, 0xbe, 0x53, 0x53, 0x6a, + 0x01, 0xa9, 0x74, 0x43, 0x2c, 0x47, 0xd4, 0x04, 0x42, 0x00, 0x2b, 0x64, + 0x00, 0x00, 0x4f, 0x57, 0x21, 0x19, 0x00, 0x3d, 0xa5, 0x75, 0x53, 0x72, + 0xd9, 0xbd, 0xcb, 0x08, 0xe4, 0xea, 0xd8, 0x05, 0x42, 0x04, 0x83, 0xb4, + 0x00, 0x54, 0x03, 0x00, 0x20, 0x94, 0xc2, 0xbf, 0x8e, 0x00, 0x53, 0x87, + 0xde, 0x84, 0x0a, 0x15, 0x71, 0xa3, 0x10, 0x10, 0x03, 0x11, 0x32, 0x45, + 0xc6, 0xa4, 0x7b, 0x00, 0xdc, 0xa8, 0x67, 0xc1, 0x46, 0x32, 0x44, 0x7f, + 0x00, 0xcf, 0xa0, 0x10, 0x00, 0x00, 0x2c, 0x9c, 0x7c, 0x80, 0x42, 0x00, + 0x23, 0xaa, 0xee, 0x9e, 0x22, 0xc7, 0x00, 0xa1, 0x4c, 0x06, 0x4a, 0x70, + 0x76, 0xcd, 0xad, 0x04, 0x18, 0x4b, 0xca, 0x81, 0x03, 0x43, 0x00, 0x0b, + 0x00, 0x60, 0x0e, 0x91, 0xd6, 0x61, 0x42, 0x09, 0x35, 0x00, 0x5e, 0xac, + 0x31, 0xd7, 0xbb, 0xe1, 0x8b, 0x07, 0xc0, 0x4c, 0x19, 0x2e, 0xe5, 0x89, + 0x3c, 0x4e, 0x49, 0x00, 0x4d, 0x56, 0xdb, 0x50, 0x40, 0xe7, 0xb6, 0x0c, + 0x80, 0x4a, 0x7d, 0xa6, 0xb7, 0xd0, 0xc9, 0xb5, 0xbc, 0x00, 0xe6, 0x2d, + 0x0e, 0x5c, 0x53, 0x51, 0x6c, 0x99, 0x02, 0xaf, 0x03, 0x66, 0x37, 0x00, + 0x08, 0x3a, 0x00, 0x00, 0x00, 0x23, 0x59, 0x96, 0xc3, 0xb0, 0x00, 0x00, + 0x00, 0x34, 0x5f, 0x5b, 0x2f, 0x3f, 0xe3, 0x24, 0x00, 0x19, 0x1b, 0x8c, + 0x7a, 0x44, 0x11, 0x04, 0x14, 0x01, 0x40, 0x08, 0x89, 0xc0, 0x80, 0x6f, + 0xc5, 0x7e, 0x02, 0xc3, 0x47, 0xbf, 0x8f, 0xda, 0xe9, 0x79, 0x4f, 0x0f, + 0x07, 0x00, 0x00, 0x48, 0xed, 0x97, 0x4f, 0x0f, 0x01, 0x1e, 0x03, 0xb1, + 0x12, 0x4f, 0x07, 0x77, 0x2f, +}; + +//***************************************************************************** +// +// The first image of the spider facing down. +// +//***************************************************************************** +const uint8_t g_pui8SpiderD1Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 238, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x00, 0x02, 0x02, + 0x00, 0x00, 0x06, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x00, 0x00, 0x07, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x01, 0x04, 0x04, + 0x04, 0x04, 0x04, + 0x03, 0x05, 0x05, + 0x08, 0x05, 0x05, + 0x05, 0x06, 0x06, + 0x08, 0x06, 0x06, + 0x0a, 0x06, 0x06, + 0x04, 0x07, 0x07, + 0x0a, 0x07, 0x07, + 0x09, 0x08, 0x08, + 0x0b, 0x08, 0x08, + 0x09, 0x09, 0x09, + 0x08, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, + 0x0f, 0x0c, 0x0c, + 0x0c, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, + 0x0e, 0x0d, 0x0d, + 0x0c, 0x0e, 0x0e, + 0x0f, 0x0e, 0x0e, + 0x0c, 0x10, 0x10, + 0x0d, 0x10, 0x10, + 0x0e, 0x10, 0x10, + 0x0d, 0x11, 0x11, + 0x13, 0x11, 0x11, + 0x12, 0x12, 0x12, + 0x16, 0x12, 0x12, + 0x11, 0x13, 0x13, + 0x0f, 0x15, 0x15, + 0x14, 0x15, 0x15, + 0x15, 0x16, 0x16, + 0x17, 0x18, 0x18, + 0x17, 0x19, 0x19, + 0x19, 0x19, 0x19, + 0x15, 0x1c, 0x1c, + 0x18, 0x1c, 0x1c, + 0x1b, 0x1c, 0x1c, + 0x19, 0x1d, 0x1d, + 0x00, 0x00, 0x60, + 0x1e, 0x1d, 0x1d, + 0x20, 0x1b, 0x21, + 0x00, 0x00, 0x67, + 0x1a, 0x21, 0x21, + 0x24, 0x21, 0x21, + 0x26, 0x21, 0x21, + 0x21, 0x22, 0x22, + 0x17, 0x26, 0x26, + 0x28, 0x25, 0x25, + 0x1e, 0x22, 0x2f, + 0x25, 0x26, 0x26, + 0x27, 0x26, 0x26, + 0x2b, 0x26, 0x26, + 0x2b, 0x2b, 0x2b, + 0x2f, 0x2b, 0x2b, + 0x12, 0x00, 0x8f, + 0x2c, 0x2d, 0x2d, + 0x09, 0x01, 0x93, + 0x30, 0x2e, 0x2e, + 0x04, 0x03, 0x93, + 0x34, 0x2e, 0x2e, + 0x30, 0x2f, 0x2f, + 0x00, 0x00, 0xa2, + 0x00, 0x00, 0xa4, + 0x30, 0x32, 0x32, + 0x0d, 0x00, 0xa2, + 0x00, 0x00, 0xb0, + 0x06, 0x04, 0xa7, + 0x38, 0x35, 0x35, + 0x2d, 0x37, 0x37, + 0x00, 0x00, 0xb4, + 0x31, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x01, 0x01, 0xb5, + 0x08, 0x0a, 0xa1, + 0x33, 0x39, 0x39, + 0x3c, 0x38, 0x38, + 0x3d, 0x38, 0x38, + 0x3f, 0x38, 0x38, + 0x25, 0x21, 0x70, + 0x1c, 0x17, 0x87, + 0x3b, 0x3b, 0x3b, + 0x0e, 0x0e, 0xa7, + 0x21, 0x1b, 0x88, + 0x3c, 0x3e, 0x3e, + 0x22, 0x2a, 0x6f, + 0x3d, 0x3e, 0x3e, + 0x3b, 0x40, 0x40, + 0x3d, 0x41, 0x41, + 0x16, 0x15, 0xa6, + 0x41, 0x42, 0x42, + 0x41, 0x43, 0x43, + 0x49, 0x44, 0x44, + 0x41, 0x47, 0x47, + 0x24, 0x18, 0xaf, + 0x44, 0x47, 0x47, + 0x32, 0x33, 0x77, + 0x47, 0x49, 0x49, + 0x47, 0x4a, 0x4a, + 0x48, 0x4b, 0x4b, + 0x25, 0x24, 0xa5, + 0x45, 0x4c, 0x4c, + 0x29, 0x20, 0xb2, + 0x4b, 0x4e, 0x4e, + 0x49, 0x4f, 0x4f, + 0x26, 0x26, 0xad, + 0x4b, 0x51, 0x51, + 0x53, 0x50, 0x51, + 0x4c, 0x52, 0x52, + 0x50, 0x52, 0x52, + 0x53, 0x55, 0x55, + 0x5e, 0x55, 0x55, + 0x57, 0x56, 0x56, + 0x53, 0x57, 0x57, + 0x50, 0x59, 0x59, + 0x51, 0x49, 0x79, + 0x62, 0x5a, 0x5a, + 0x60, 0x5c, 0x5c, + 0x59, 0x5e, 0x5e, + 0x57, 0x5f, 0x5f, + 0x5b, 0x61, 0x61, + 0x54, 0x53, 0x89, + 0x68, 0x66, 0x66, + 0x4d, 0x4b, 0xaf, + 0x69, 0x6d, 0x6d, + 0x66, 0x6e, 0x6e, + 0x6d, 0x6e, 0x6e, + 0x68, 0x6f, 0x6f, + 0x6e, 0x6f, 0x6f, + 0x53, 0x53, 0xb7, + 0x71, 0x71, 0x71, + 0x75, 0x71, 0x71, + 0x5f, 0x5c, 0xab, + 0x76, 0x74, 0x74, + 0x74, 0x77, 0x77, + 0x70, 0x77, 0x7f, + 0x80, 0x7e, 0x7e, + 0x82, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, + 0x88, 0x7f, 0x7f, + 0x80, 0x83, 0x83, + 0x8b, 0x86, 0x86, + 0x86, 0x88, 0x88, + 0x88, 0x88, 0x88, + 0x8e, 0x88, 0x88, + 0x8c, 0x8b, 0x8b, + 0x88, 0x8c, 0x8c, + 0x91, 0x8b, 0x8b, + 0x83, 0x7a, 0xc1, + 0x95, 0x90, 0x90, + 0x98, 0x90, 0x90, + 0x91, 0x91, 0x91, + 0x8e, 0x92, 0x95, + 0x99, 0x94, 0x94, + 0x84, 0x88, 0xb7, + 0x98, 0x98, 0x98, + 0x94, 0x9b, 0x9a, + 0x96, 0x9b, 0x9b, + 0x9f, 0x9d, 0x9d, + 0xa5, 0xa2, 0xa4, + 0xa4, 0xa5, 0xa5, + 0xa7, 0xa5, 0xa5, + 0xa3, 0xa6, 0xa6, + 0xab, 0xa7, 0xa7, + 0xb7, 0xa6, 0xa6, + 0xa8, 0xa8, 0xa8, + 0xa3, 0xa9, 0xa9, + 0xa5, 0xac, 0xac, + 0xb0, 0xac, 0xac, + 0xac, 0xae, 0xae, + 0xad, 0xae, 0xae, + 0xaf, 0xb2, 0xb2, + 0xb2, 0xb5, 0xb5, + 0xb6, 0xb6, 0xb6, + 0xb5, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb8, + 0xae, 0xba, 0xba, + 0xad, 0xae, 0xd6, + 0xbe, 0xba, 0xba, + 0xbe, 0xbe, 0xbe, + 0xbf, 0xb5, 0xd1, + 0xbc, 0xc0, 0xc0, + 0xc1, 0xc3, 0xc3, + 0xbd, 0xc4, 0xc4, + 0xc0, 0xc5, 0xc5, + 0xc4, 0xc5, 0xc5, + 0xc7, 0xc8, 0xc8, + 0xc9, 0xc8, 0xc8, + 0xc3, 0xc9, 0xc9, + 0xca, 0xc9, 0xc9, + 0xca, 0xcb, 0xcb, + 0xc2, 0xcc, 0xcc, + 0xc8, 0xcc, 0xcc, + 0xce, 0xcc, 0xcc, + 0xc8, 0xcd, 0xcd, + 0xd3, 0xcc, 0xcc, + 0xd4, 0xcc, 0xcc, + 0xd1, 0xcd, 0xcd, + 0xd3, 0xcf, 0xcf, + 0xcd, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, + 0xcc, 0xd1, 0xd1, + 0xd0, 0xd3, 0xd3, + 0xc8, 0xd4, 0xd4, + 0xd5, 0xd5, 0xd5, + 0xe3, 0xdc, 0xdc, + 0xd8, 0xdd, 0xe1, + 0xdd, 0xde, 0xde, + 0xe3, 0xdf, 0xdf, + 0xd8, 0xe2, 0xe2, + 0xe4, 0xe2, 0xe2, + 0xe3, 0xe5, 0xe5, + 0xe3, 0xe6, 0xe6, + 0xe5, 0xe7, 0xe7, + 0xe5, 0xe9, 0xe9, + 0xec, 0xea, 0xea, + 0xe5, 0xeb, 0xeb, + 0xee, 0xeb, 0xeb, + 0xf1, 0xed, 0xed, + 0xf4, 0xed, 0xed, + 0xf0, 0xee, 0xee, + 0xf4, 0xf1, 0xf1, + 0xf5, 0xf7, 0xf7, + 0xfa, 0xf7, 0xf7, + 0xfc, 0xfb, 0xfb, + 0xfd, 0xfc, 0xfc, + + 0xf8, 0x07, 0x07, 0x07, 0x07, 0x02, 0x03, 0xb1, 0x12, 0xe1, 0x07, 0x07, + 0x01, 0x48, 0xed, 0x97, 0x02, 0x3f, 0x81, 0x07, 0x00, 0x00, 0x8f, 0xda, + 0xe9, 0x79, 0x3f, 0x0a, 0x00, 0x00, 0x04, 0x14, 0x01, 0x08, 0x01, 0xc0, + 0x08, 0x80, 0x6f, 0xc5, 0x7e, 0x3d, 0x23, 0x59, 0x96, 0x00, 0xc3, 0xb0, + 0x00, 0x00, 0x34, 0x5f, 0x5b, 0x2f, 0x01, 0x3f, 0xe3, 0x24, 0x00, 0x1b, + 0x8c, 0x7a, 0x41, 0x00, 0x7d, 0xa6, 0xb7, 0xd0, 0xc9, 0xb5, 0xbc, 0xe6, + 0x00, 0x2d, 0x0e, 0x5c, 0x53, 0x51, 0x6c, 0x99, 0xaf, 0x07, 0x03, 0x66, + 0x37, 0x00, 0x08, 0x41, 0x29, 0x11, 0x00, 0x2e, 0xe5, 0x89, 0x3c, 0x4e, + 0x49, 0x4d, 0x56, 0x02, 0xdb, 0x50, 0x40, 0xe7, 0xb6, 0x0c, 0x4e, 0x0b, + 0x00, 0x60, 0x0e, 0x91, 0xd6, 0x61, 0x42, 0x09, 0x35, 0x00, 0x5e, 0xac, + 0x31, 0xd7, 0xbb, 0xe1, 0x8b, 0x07, 0x80, 0x3c, 0x23, 0xaa, 0xee, 0x9e, + 0x22, 0xc7, 0xa1, 0x00, 0x4c, 0x06, 0x4a, 0x70, 0x76, 0xcd, 0xad, 0x18, + 0x08, 0x4b, 0xca, 0x81, 0x03, 0x3a, 0x45, 0xc6, 0xa4, 0x00, 0x7b, 0xdc, + 0xa8, 0x67, 0xc1, 0x46, 0x32, 0x44, 0x00, 0x7f, 0xcf, 0xa0, 0x10, 0x00, + 0x00, 0x2c, 0x9c, 0x00, 0x7c, 0x00, 0x00, 0x04, 0x83, 0xb4, 0x54, 0x03, + 0x00, 0x00, 0x20, 0x94, 0xc2, 0xbf, 0x8d, 0x53, 0x87, 0x00, 0xde, 0x84, + 0x0a, 0x15, 0x71, 0xa3, 0x10, 0x03, 0x00, 0x11, 0x00, 0x00, 0x2b, 0x64, + 0x00, 0x00, 0x4f, 0x00, 0x57, 0x21, 0x19, 0x3d, 0xa5, 0x75, 0x53, 0x72, + 0x00, 0xd9, 0xbd, 0xcb, 0xe4, 0xea, 0xd8, 0x05, 0x00, 0x20, 0x00, 0x00, + 0xe9, 0x00, 0x00, 0xae, 0xeb, 0xe0, 0x00, 0xcc, 0xc4, 0xbe, 0x53, 0x53, + 0x6a, 0xa9, 0x74, 0x04, 0x43, 0x2c, 0x47, 0xd4, 0x04, 0x45, 0x1c, 0xdf, + 0x00, 0x67, 0x27, 0x30, 0xba, 0x93, 0x65, 0x55, 0x85, 0x24, 0xd5, 0x3b, + 0x91, 0xce, 0x1a, 0x45, 0x78, 0xb8, 0x00, 0x07, 0x41, 0xd3, 0x9f, 0x29, + 0xa7, 0x90, 0x77, 0x01, 0x69, 0xd2, 0x63, 0x01, 0x07, 0xb2, 0x33, 0x44, + 0x00, 0x0d, 0xb3, 0x39, 0x2a, 0xe2, 0xb9, 0x16, 0x38, 0x00, 0x9d, 0x6d, + 0x82, 0x00, 0x73, 0xe8, 0x98, 0x26, 0x20, 0x86, 0x6b, 0x44, 0x6e, 0x62, + 0x00, 0x1d, 0xdd, 0x00, 0x5a, 0x00, 0x01, 0x08, 0x03, 0x03, 0x00, 0x00, + 0x05, 0x9a, 0xec, 0x52, 0x31, 0x92, 0x44, 0x18, 0x09, 0x20, 0x8e, 0x8a, + 0xa4, 0x0f, 0xd1, 0x95, 0x00, 0x02, 0x64, 0x3a, 0x44, 0x12, 0x25, 0xab, + 0x44, 0x5d, 0xc8, 0x64, 0x17, 0x5f, 0x13, 0x88, 0x1f, 0x03, 0xa2, 0x68, + 0xc8, 0x4f, 0x04, 0x3e, 0x58, 0x02, 0x1e, 0x9b, 0x08, 0xc9, 0x47, 0x04, + 0x03, 0x13, 0x02, 0x28, 0x36, 0x4f, 0xe0, 0x07, 0x77, 0x2f, +}; + +//***************************************************************************** +// +// The second image of the spider facing down. +// +//***************************************************************************** +const uint8_t g_pui8SpiderD2Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 238, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x00, 0x02, 0x02, + 0x00, 0x00, 0x06, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x00, 0x00, 0x07, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x01, 0x04, 0x04, + 0x04, 0x04, 0x04, + 0x03, 0x05, 0x05, + 0x08, 0x05, 0x05, + 0x05, 0x06, 0x06, + 0x08, 0x06, 0x06, + 0x0a, 0x06, 0x06, + 0x04, 0x07, 0x07, + 0x0a, 0x07, 0x07, + 0x09, 0x08, 0x08, + 0x0b, 0x08, 0x08, + 0x09, 0x09, 0x09, + 0x08, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, + 0x0f, 0x0c, 0x0c, + 0x0c, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, + 0x0e, 0x0d, 0x0d, + 0x0c, 0x0e, 0x0e, + 0x0f, 0x0e, 0x0e, + 0x0c, 0x10, 0x10, + 0x0d, 0x10, 0x10, + 0x0e, 0x10, 0x10, + 0x0d, 0x11, 0x11, + 0x13, 0x11, 0x11, + 0x12, 0x12, 0x12, + 0x16, 0x12, 0x12, + 0x11, 0x13, 0x13, + 0x0f, 0x15, 0x15, + 0x14, 0x15, 0x15, + 0x15, 0x16, 0x16, + 0x17, 0x18, 0x18, + 0x17, 0x19, 0x19, + 0x19, 0x19, 0x19, + 0x15, 0x1c, 0x1c, + 0x18, 0x1c, 0x1c, + 0x1b, 0x1c, 0x1c, + 0x19, 0x1d, 0x1d, + 0x00, 0x00, 0x60, + 0x1e, 0x1d, 0x1d, + 0x20, 0x1b, 0x21, + 0x00, 0x00, 0x67, + 0x1a, 0x21, 0x21, + 0x24, 0x21, 0x21, + 0x26, 0x21, 0x21, + 0x21, 0x22, 0x22, + 0x17, 0x26, 0x26, + 0x28, 0x25, 0x25, + 0x1e, 0x22, 0x2f, + 0x25, 0x26, 0x26, + 0x27, 0x26, 0x26, + 0x2b, 0x26, 0x26, + 0x2b, 0x2b, 0x2b, + 0x2f, 0x2b, 0x2b, + 0x12, 0x00, 0x8f, + 0x2c, 0x2d, 0x2d, + 0x09, 0x01, 0x93, + 0x30, 0x2e, 0x2e, + 0x04, 0x03, 0x93, + 0x34, 0x2e, 0x2e, + 0x30, 0x2f, 0x2f, + 0x00, 0x00, 0xa2, + 0x00, 0x00, 0xa4, + 0x30, 0x32, 0x32, + 0x0d, 0x00, 0xa2, + 0x00, 0x00, 0xb0, + 0x06, 0x04, 0xa7, + 0x38, 0x35, 0x35, + 0x2d, 0x37, 0x37, + 0x00, 0x00, 0xb4, + 0x31, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x01, 0x01, 0xb5, + 0x08, 0x0a, 0xa1, + 0x33, 0x39, 0x39, + 0x3c, 0x38, 0x38, + 0x3d, 0x38, 0x38, + 0x3f, 0x38, 0x38, + 0x25, 0x21, 0x70, + 0x1c, 0x17, 0x87, + 0x3b, 0x3b, 0x3b, + 0x0e, 0x0e, 0xa7, + 0x21, 0x1b, 0x88, + 0x3c, 0x3e, 0x3e, + 0x22, 0x2a, 0x6f, + 0x3d, 0x3e, 0x3e, + 0x3b, 0x40, 0x40, + 0x3d, 0x41, 0x41, + 0x16, 0x15, 0xa6, + 0x41, 0x42, 0x42, + 0x41, 0x43, 0x43, + 0x49, 0x44, 0x44, + 0x41, 0x47, 0x47, + 0x24, 0x18, 0xaf, + 0x44, 0x47, 0x47, + 0x32, 0x33, 0x77, + 0x47, 0x49, 0x49, + 0x47, 0x4a, 0x4a, + 0x48, 0x4b, 0x4b, + 0x25, 0x24, 0xa5, + 0x45, 0x4c, 0x4c, + 0x29, 0x20, 0xb2, + 0x4b, 0x4e, 0x4e, + 0x49, 0x4f, 0x4f, + 0x26, 0x26, 0xad, + 0x4b, 0x51, 0x51, + 0x53, 0x50, 0x51, + 0x4c, 0x52, 0x52, + 0x50, 0x52, 0x52, + 0x53, 0x55, 0x55, + 0x5e, 0x55, 0x55, + 0x57, 0x56, 0x56, + 0x53, 0x57, 0x57, + 0x50, 0x59, 0x59, + 0x51, 0x49, 0x79, + 0x62, 0x5a, 0x5a, + 0x60, 0x5c, 0x5c, + 0x59, 0x5e, 0x5e, + 0x57, 0x5f, 0x5f, + 0x5b, 0x61, 0x61, + 0x54, 0x53, 0x89, + 0x68, 0x66, 0x66, + 0x4d, 0x4b, 0xaf, + 0x69, 0x6d, 0x6d, + 0x66, 0x6e, 0x6e, + 0x6d, 0x6e, 0x6e, + 0x68, 0x6f, 0x6f, + 0x6e, 0x6f, 0x6f, + 0x53, 0x53, 0xb7, + 0x71, 0x71, 0x71, + 0x75, 0x71, 0x71, + 0x5f, 0x5c, 0xab, + 0x76, 0x74, 0x74, + 0x74, 0x77, 0x77, + 0x70, 0x77, 0x7f, + 0x80, 0x7e, 0x7e, + 0x82, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, + 0x88, 0x7f, 0x7f, + 0x80, 0x83, 0x83, + 0x8b, 0x86, 0x86, + 0x86, 0x88, 0x88, + 0x88, 0x88, 0x88, + 0x8e, 0x88, 0x88, + 0x8c, 0x8b, 0x8b, + 0x88, 0x8c, 0x8c, + 0x91, 0x8b, 0x8b, + 0x83, 0x7a, 0xc1, + 0x95, 0x90, 0x90, + 0x98, 0x90, 0x90, + 0x91, 0x91, 0x91, + 0x8e, 0x92, 0x95, + 0x99, 0x94, 0x94, + 0x84, 0x88, 0xb7, + 0x98, 0x98, 0x98, + 0x94, 0x9b, 0x9a, + 0x96, 0x9b, 0x9b, + 0x9f, 0x9d, 0x9d, + 0xa5, 0xa2, 0xa4, + 0xa4, 0xa5, 0xa5, + 0xa7, 0xa5, 0xa5, + 0xa3, 0xa6, 0xa6, + 0xab, 0xa7, 0xa7, + 0xb7, 0xa6, 0xa6, + 0xa8, 0xa8, 0xa8, + 0xa3, 0xa9, 0xa9, + 0xa5, 0xac, 0xac, + 0xb0, 0xac, 0xac, + 0xac, 0xae, 0xae, + 0xad, 0xae, 0xae, + 0xaf, 0xb2, 0xb2, + 0xb2, 0xb5, 0xb5, + 0xb6, 0xb6, 0xb6, + 0xb5, 0xb7, 0xb7, + 0xb9, 0xb8, 0xb8, + 0xae, 0xba, 0xba, + 0xad, 0xae, 0xd6, + 0xbe, 0xba, 0xba, + 0xbe, 0xbe, 0xbe, + 0xbf, 0xb5, 0xd1, + 0xbc, 0xc0, 0xc0, + 0xc1, 0xc3, 0xc3, + 0xbd, 0xc4, 0xc4, + 0xc0, 0xc5, 0xc5, + 0xc4, 0xc5, 0xc5, + 0xc7, 0xc8, 0xc8, + 0xc9, 0xc8, 0xc8, + 0xc3, 0xc9, 0xc9, + 0xca, 0xc9, 0xc9, + 0xca, 0xcb, 0xcb, + 0xc2, 0xcc, 0xcc, + 0xc8, 0xcc, 0xcc, + 0xce, 0xcc, 0xcc, + 0xc8, 0xcd, 0xcd, + 0xd3, 0xcc, 0xcc, + 0xd4, 0xcc, 0xcc, + 0xd1, 0xcd, 0xcd, + 0xd3, 0xcf, 0xcf, + 0xcd, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, + 0xcc, 0xd1, 0xd1, + 0xd0, 0xd3, 0xd3, + 0xc8, 0xd4, 0xd4, + 0xd5, 0xd5, 0xd5, + 0xe3, 0xdc, 0xdc, + 0xd8, 0xdd, 0xe1, + 0xdd, 0xde, 0xde, + 0xe3, 0xdf, 0xdf, + 0xd8, 0xe2, 0xe2, + 0xe4, 0xe2, 0xe2, + 0xe3, 0xe5, 0xe5, + 0xe3, 0xe6, 0xe6, + 0xe5, 0xe7, 0xe7, + 0xe5, 0xe9, 0xe9, + 0xec, 0xea, 0xea, + 0xe5, 0xeb, 0xeb, + 0xee, 0xeb, 0xeb, + 0xf1, 0xed, 0xed, + 0xf4, 0xed, 0xed, + 0xf0, 0xee, 0xee, + 0xf4, 0xf1, 0xf1, + 0xf5, 0xf7, 0xf7, + 0xfa, 0xf7, 0xf7, + 0xfc, 0xfb, 0xfb, + 0xfd, 0xfc, 0xfc, + + 0xe0, 0x07, 0x07, 0x07, 0x00, 0x00, 0x12, 0xb1, 0x03, 0xc0, 0x07, 0x07, + 0x00, 0x00, 0x02, 0x97, 0xed, 0x48, 0xc0, 0x4f, 0x4f, 0x00, 0x02, 0x79, + 0xe9, 0xda, 0x8f, 0xc0, 0x4f, 0x4f, 0x02, 0x7e, 0xc5, 0x6f, 0x80, 0xc0, + 0xa4, 0x01, 0x08, 0x21, 0x14, 0x04, 0x07, 0x7a, 0x8c, 0x00, 0x1b, 0x00, + 0x24, 0xe3, 0x3f, 0x2f, 0x5b, 0x5f, 0x00, 0x34, 0x00, 0x00, 0xb0, 0xc3, + 0x96, 0x59, 0x23, 0x80, 0x2c, 0x08, 0x00, 0x37, 0x66, 0x03, 0xaf, 0x99, + 0x00, 0x6c, 0x51, 0x53, 0x5c, 0x0e, 0x2d, 0xe6, 0xbc, 0x02, 0xb5, 0xc9, + 0xd0, 0xb7, 0xa6, 0x7d, 0x2a, 0x0c, 0x00, 0xb6, 0xe7, 0x40, 0x50, 0xdb, + 0x56, 0x4d, 0x49, 0x06, 0x4e, 0x3c, 0x89, 0xe5, 0x2e, 0x72, 0x52, 0x00, + 0x00, 0x07, 0x8b, 0xe1, 0xbb, 0xd7, 0x31, 0xac, 0x5e, 0x00, 0x35, 0x09, + 0x42, 0x61, 0xd6, 0x91, 0x0e, 0x60, 0x40, 0x0b, 0x34, 0x03, 0x81, 0xca, + 0x4b, 0x18, 0xad, 0x00, 0xcd, 0x76, 0x70, 0x4a, 0x06, 0x4c, 0xa1, 0xc7, + 0x04, 0x22, 0x9e, 0xee, 0xaa, 0x23, 0x3b, 0x7c, 0x9c, 0x00, 0x2c, 0x00, + 0x00, 0x10, 0xa0, 0xcf, 0x7f, 0x44, 0x00, 0x32, 0x46, 0xc1, 0x67, 0xa8, + 0xdc, 0x7b, 0xa4, 0x20, 0xc6, 0x45, 0x3a, 0x11, 0x03, 0x10, 0xa3, 0x71, + 0x00, 0x15, 0x0a, 0x84, 0xde, 0x87, 0x53, 0x8d, 0xbf, 0x00, 0xc2, 0x94, + 0x20, 0x00, 0x03, 0x54, 0xb4, 0x83, 0x40, 0x04, 0x32, 0x05, 0xd8, 0xea, + 0xe4, 0xcb, 0xbd, 0x00, 0xd9, 0x72, 0x53, 0x75, 0xa5, 0x3d, 0x19, 0x21, + 0x02, 0x57, 0x4f, 0x00, 0x00, 0x64, 0x2b, 0x42, 0x04, 0x00, 0xd4, 0x47, + 0x2c, 0x43, 0x74, 0xa9, 0x6a, 0x53, 0x01, 0x53, 0xbe, 0xc4, 0xcc, 0xe0, + 0xeb, 0xae, 0x62, 0x80, 0x42, 0x1a, 0xce, 0x1c, 0x00, 0x00, 0x3b, 0xd5, + 0x00, 0x85, 0x55, 0x65, 0x93, 0xba, 0x30, 0x27, 0x67, 0x60, 0xdf, 0x91, + 0x2b, 0x33, 0xb2, 0x07, 0x01, 0x63, 0x00, 0xd2, 0x69, 0x77, 0x90, 0xa7, + 0x29, 0x9f, 0xd3, 0x08, 0x41, 0x07, 0xb8, 0x78, 0x45, 0x6b, 0x86, 0x26, + 0x00, 0x98, 0xe8, 0x73, 0x00, 0x82, 0x6d, 0x9d, 0x38, 0x01, 0x16, 0xb9, + 0xe2, 0x2a, 0x39, 0xb3, 0x0d, 0x3c, 0x00, 0x92, 0x31, 0x52, 0xec, 0x9a, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x08, 0x01, 0x00, 0x5a, 0xdd, 0x1d, 0x00, + 0x20, 0x62, 0x6e, 0x44, 0x3a, 0x02, 0x00, 0x95, 0xd1, 0x4b, 0x0f, 0xa4, + 0x8a, 0x8e, 0x61, 0x18, 0x44, 0x11, 0x13, 0x17, 0xc8, 0x5d, 0x44, 0xab, + 0x25, 0x67, 0x1b, 0x26, 0x68, 0xa2, 0x03, 0x1f, 0x88, 0x4f, 0x04, 0x08, + 0x26, 0x9b, 0x1e, 0x02, 0x58, 0x3e, 0x47, 0x05, 0x36, 0x4f, 0x28, 0x02, + 0x13, 0x03, 0x47, 0x07, 0x77, 0x2f, +}; + +//***************************************************************************** +// +// The first image of the spider facing up and left. +// +//***************************************************************************** +const uint8_t g_pui8SpiderUL1Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 236, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x05, 0x03, 0x03, + 0x03, 0x04, 0x04, + 0x05, 0x04, 0x04, + 0x05, 0x05, 0x05, + 0x07, 0x06, 0x06, + 0x06, 0x08, 0x08, + 0x08, 0x08, 0x08, + 0x08, 0x07, 0x0b, + 0x09, 0x09, 0x09, + 0x0a, 0x09, 0x09, + 0x09, 0x0a, 0x0a, + 0x0d, 0x00, 0x1f, + 0x0c, 0x0b, 0x0b, + 0x0e, 0x0b, 0x0b, + 0x0b, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, + 0x0d, 0x0d, 0x0d, + 0x00, 0x00, 0x2e, + 0x0d, 0x0d, 0x16, + 0x0e, 0x10, 0x10, + 0x11, 0x10, 0x10, + 0x0f, 0x0d, 0x17, + 0x0f, 0x11, 0x11, + 0x11, 0x12, 0x12, + 0x15, 0x13, 0x13, + 0x13, 0x14, 0x14, + 0x17, 0x14, 0x14, + 0x04, 0x00, 0x43, + 0x16, 0x15, 0x15, + 0x19, 0x15, 0x15, + 0x12, 0x16, 0x16, + 0x15, 0x18, 0x18, + 0x1b, 0x1a, 0x1a, + 0x1d, 0x1c, 0x1c, + 0x1f, 0x1c, 0x1c, + 0x1b, 0x1d, 0x1d, + 0x1a, 0x1e, 0x1e, + 0x24, 0x1e, 0x1e, + 0x1d, 0x1f, 0x1f, + 0x21, 0x1f, 0x1f, + 0x1c, 0x1e, 0x23, + 0x00, 0x00, 0x6c, + 0x25, 0x20, 0x20, + 0x20, 0x1a, 0x2e, + 0x1e, 0x22, 0x22, + 0x24, 0x22, 0x22, + 0x00, 0x00, 0x81, + 0x1d, 0x29, 0x29, + 0x21, 0x29, 0x29, + 0x06, 0x01, 0x83, + 0x13, 0x00, 0x86, + 0x28, 0x2c, 0x2c, + 0x29, 0x2d, 0x2d, + 0x31, 0x2e, 0x2e, + 0x34, 0x2f, 0x2f, + 0x2c, 0x2f, 0x39, + 0x00, 0x00, 0xa8, + 0x2e, 0x33, 0x33, + 0x00, 0x00, 0xab, + 0x3a, 0x33, 0x33, + 0x2f, 0x35, 0x35, + 0x34, 0x35, 0x35, + 0x35, 0x36, 0x36, + 0x11, 0x0b, 0x99, + 0x04, 0x03, 0xae, + 0x32, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x01, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x09, 0x09, 0xa2, + 0x01, 0x01, 0xb5, + 0x07, 0x04, 0xad, + 0x38, 0x37, 0x37, + 0x0b, 0x0a, 0xa0, + 0x33, 0x38, 0x38, + 0x3c, 0x38, 0x38, + 0x3e, 0x38, 0x38, + 0x04, 0x04, 0xb5, + 0x05, 0x05, 0xb4, + 0x37, 0x3a, 0x3a, + 0x1c, 0x15, 0x8d, + 0x39, 0x3a, 0x3a, + 0x3c, 0x3a, 0x3a, + 0x3e, 0x3a, 0x3a, + 0x36, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, + 0x0b, 0x0b, 0xac, + 0x3c, 0x3c, 0x3c, + 0x22, 0x25, 0x74, + 0x14, 0x0b, 0xaf, + 0x3c, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, + 0x10, 0x10, 0xad, + 0x3e, 0x40, 0x40, + 0x3f, 0x41, 0x41, + 0x1b, 0x1d, 0x97, + 0x3f, 0x42, 0x42, + 0x3b, 0x44, 0x44, + 0x44, 0x43, 0x43, + 0x22, 0x21, 0x93, + 0x48, 0x44, 0x44, + 0x4e, 0x44, 0x44, + 0x1f, 0x1a, 0xac, + 0x4b, 0x46, 0x46, + 0x46, 0x47, 0x47, + 0x4a, 0x47, 0x46, + 0x4b, 0x47, 0x47, + 0x43, 0x48, 0x48, + 0x47, 0x48, 0x48, + 0x4b, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, + 0x49, 0x50, 0x50, + 0x45, 0x4f, 0x5d, + 0x4f, 0x53, 0x53, + 0x55, 0x53, 0x53, + 0x57, 0x55, 0x55, + 0x51, 0x57, 0x57, + 0x5e, 0x56, 0x56, + 0x4e, 0x56, 0x5c, + 0x58, 0x58, 0x58, + 0x32, 0x32, 0xb1, + 0x61, 0x58, 0x58, + 0x56, 0x5b, 0x5b, + 0x57, 0x5e, 0x5e, + 0x66, 0x5d, 0x5d, + 0x5e, 0x5e, 0x5e, + 0x43, 0x3c, 0xac, + 0x5b, 0x63, 0x63, + 0x65, 0x63, 0x63, + 0x63, 0x64, 0x64, + 0x67, 0x64, 0x64, + 0x66, 0x65, 0x65, + 0x69, 0x66, 0x66, + 0x5d, 0x69, 0x69, + 0x6a, 0x68, 0x68, + 0x67, 0x6a, 0x6a, + 0x6b, 0x6a, 0x6a, + 0x60, 0x6c, 0x6c, + 0x74, 0x6e, 0x6e, + 0x54, 0x54, 0xb6, + 0x71, 0x73, 0x74, + 0x6d, 0x75, 0x75, + 0x71, 0x75, 0x75, + 0x7a, 0x77, 0x77, + 0x7b, 0x78, 0x78, + 0x76, 0x7a, 0x7a, + 0x7d, 0x7b, 0x7b, + 0x80, 0x7b, 0x7b, + 0x7a, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7c, + 0x7e, 0x7c, 0x7c, + 0x7d, 0x7d, 0x7d, + 0x75, 0x75, 0x90, + 0x7d, 0x7e, 0x7e, + 0x83, 0x7e, 0x7e, + 0x80, 0x7f, 0x7f, + 0x7d, 0x80, 0x80, + 0x80, 0x83, 0x83, + 0x7f, 0x86, 0x86, + 0x85, 0x87, 0x87, + 0x88, 0x89, 0x89, + 0x85, 0x8c, 0x8c, + 0x7b, 0x73, 0xc6, + 0x8b, 0x8f, 0x8f, + 0x8c, 0x90, 0x90, + 0x8e, 0x90, 0x90, + 0x96, 0x91, 0x91, + 0x8f, 0x93, 0x93, + 0x85, 0x7f, 0xc2, + 0x90, 0x8c, 0xa8, + 0x95, 0x95, 0x95, + 0x93, 0x97, 0x97, + 0x94, 0x97, 0x97, + 0x88, 0x8a, 0xba, + 0x94, 0x99, 0x99, + 0x97, 0x99, 0x99, + 0x9f, 0x9a, 0x9a, + 0x8e, 0x93, 0xb9, + 0xa6, 0xa1, 0xa1, + 0xa3, 0xa3, 0xa3, + 0xa7, 0xa3, 0xa4, + 0xa6, 0xa6, 0xa6, + 0xae, 0xaa, 0xaa, + 0xb2, 0xac, 0xac, + 0xaf, 0xad, 0xad, + 0xb6, 0xad, 0xad, + 0xb0, 0xae, 0xae, + 0xb4, 0xb2, 0xb2, + 0xb7, 0xb7, 0xb7, + 0xb8, 0xba, 0xba, + 0xb5, 0xbc, 0xbc, + 0xb6, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, + 0xc0, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbe, + 0xc1, 0xc3, 0xc3, + 0xc2, 0xc4, 0xc4, + 0xcc, 0xca, 0xca, + 0xc6, 0xcb, 0xcb, + 0xc2, 0xca, 0xcf, + 0xca, 0xcb, 0xcb, + 0xcb, 0xcc, 0xcc, + 0xca, 0xce, 0xd0, + 0xcc, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd2, + 0xd3, 0xd2, 0xd2, + 0xd1, 0xd1, 0xd6, + 0xd5, 0xd3, 0xd3, + 0xd2, 0xd4, 0xd4, + 0xd0, 0xd5, 0xd5, + 0xce, 0xd6, 0xd6, + 0xd1, 0xd7, 0xd7, + 0xd6, 0xd6, 0xdb, + 0xd9, 0xd9, 0xd9, + 0xd7, 0xda, 0xda, + 0xde, 0xda, 0xda, + 0xe3, 0xde, 0xe3, + 0xe2, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe1, + 0xe5, 0xe3, 0xe3, + 0xe7, 0xe3, 0xe3, + 0xe5, 0xe7, 0xe7, + 0xe9, 0xe7, 0xe7, + 0xea, 0xe8, 0xe8, + 0xeb, 0xea, 0xea, + 0xef, 0xec, 0xec, + 0xee, 0xf1, 0xf1, + 0xf4, 0xf3, 0xf3, + 0xf6, 0xf6, 0xf6, + + 0xf3, 0x07, 0x07, 0x07, 0x07, 0x00, 0x79, 0x07, 0x05, 0x09, 0x2e, 0x6c, + 0x27, 0x05, 0x01, 0xa5, 0x12, 0x3f, 0x80, 0x04, 0x01, 0x2a, 0xa3, 0xb3, + 0x6a, 0x15, 0x00, 0x2c, 0xa8, 0x69, 0x19, 0x1b, 0x27, 0x02, 0x07, 0x50, + 0x05, 0xc9, 0xd4, 0x21, 0x83, 0xbf, 0x41, 0x95, 0x45, 0x40, 0x06, 0x05, + 0x5a, 0xeb, 0x29, 0x1f, 0xe8, 0x5b, 0x11, 0x00, 0x44, 0x99, 0x44, 0x05, + 0x87, 0x12, 0x02, 0x00, 0x02, 0x03, 0x2d, 0xe3, 0x20, 0x82, 0xea, 0x9a, + 0x11, 0x00, 0x9c, 0x7a, 0x44, 0x00, 0x85, 0x72, 0x02, 0x00, 0x3e, 0x98, + 0x1e, 0xd9, 0x68, 0xd3, 0x63, 0x04, 0x01, 0x00, 0xc5, 0x41, 0x00, 0x00, + 0x02, 0x62, 0x21, 0x00, 0x3d, 0xbe, 0x0b, 0x00, 0x00, 0x66, 0x71, 0xb5, + 0x00, 0x3f, 0xd2, 0xc7, 0x3c, 0x02, 0x34, 0x7d, 0xe1, 0x04, 0x26, 0x00, + 0x03, 0x88, 0x8c, 0x41, 0x17, 0xcd, 0x00, 0x43, 0x00, 0x00, 0x5c, 0xb1, + 0x55, 0x56, 0x93, 0x00, 0x94, 0x97, 0xca, 0xe2, 0xe7, 0xd5, 0x0c, 0x02, + 0x10, 0x84, 0xb2, 0x0d, 0x41, 0x00, 0xbf, 0xba, 0x6d, 0x00, 0x52, 0x49, + 0x7e, 0x61, 0x4a, 0x64, 0xd6, 0xad, 0x00, 0x5f, 0x18, 0x02, 0x06, 0x00, + 0x73, 0xd0, 0x2b, 0x80, 0x4a, 0x00, 0xa1, 0xe9, 0xd7, 0xbd, 0xb8, 0xc6, + 0x00, 0x86, 0x4b, 0x4e, 0x80, 0xaa, 0xe0, 0xde, 0xc0, 0x08, 0x91, 0x4c, + 0xdf, 0x7b, 0x4a, 0x37, 0x1e, 0x28, 0x00, 0x32, 0x11, 0x00, 0x00, 0x8f, + 0xdc, 0xb0, 0x48, 0x00, 0x31, 0x39, 0x6e, 0x78, 0xa9, 0xe5, 0xec, 0xc4, + 0x40, 0x0e, 0x42, 0x3b, 0xa6, 0x90, 0x16, 0x00, 0x00, 0x00, 0x59, 0xda, + 0x8d, 0xcf, 0x47, 0x23, 0x13, 0x3a, 0x04, 0x60, 0x09, 0x25, 0x9e, 0x53, + 0x4a, 0x00, 0x00, 0x00, 0x10, 0x8a, 0xc4, 0x6f, 0x35, 0xd1, 0x76, 0x7c, + 0x01, 0xbc, 0x6b, 0x40, 0x19, 0x36, 0x4d, 0x1a, 0x5c, 0x80, 0x2b, 0x54, + 0xce, 0xdd, 0xb7, 0x05, 0x92, 0xac, 0x03, 0xa0, 0x5e, 0x42, 0x4a, 0x4f, + 0x33, 0x47, 0x01, 0x00, 0x38, 0xd8, 0x46, 0x00, 0x9f, 0xab, 0x8e, 0xb9, + 0x0c, 0x67, 0x51, 0x58, 0x1d, 0x47, 0x02, 0x22, 0x08, 0x00, 0x00, 0xa7, + 0xb4, 0x2c, 0xdb, 0x45, 0x30, 0x0f, 0xc0, 0x4f, 0x02, 0x14, 0x57, 0x7f, + 0x96, 0xcb, 0xc2, 0x18, 0x05, 0xbb, 0x9d, 0x57, 0x0b, 0x0a, 0x89, 0x9b, + 0x00, 0xaf, 0xb6, 0xcc, 0xc3, 0x05, 0x5d, 0xd4, 0x24, 0xc0, 0x3f, 0x07, + 0x07, 0x1c, 0x00, 0x0e, 0xc1, 0xa2, 0x60, 0x02, 0x3f, 0x06, 0x21, 0x74, + 0xa4, 0xc8, 0xe4, 0x30, 0xe6, 0x2f, 0x47, 0x06, 0x65, 0x75, 0x77, 0x70, + 0x1e, 0x8b, 0xae, 0x81, 0x47, 0x07, 0x77, 0x2f, +}; + +//***************************************************************************** +// +// The second image of the spider facing up and left. +// +//***************************************************************************** +const uint8_t g_pui8SpiderUL2Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 236, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x05, 0x03, 0x03, + 0x03, 0x04, 0x04, + 0x05, 0x04, 0x04, + 0x05, 0x05, 0x05, + 0x07, 0x06, 0x06, + 0x06, 0x08, 0x08, + 0x08, 0x08, 0x08, + 0x08, 0x07, 0x0a, + 0x09, 0x09, 0x09, + 0x0a, 0x09, 0x09, + 0x09, 0x0a, 0x0a, + 0x0d, 0x00, 0x1f, + 0x0d, 0x0b, 0x0b, + 0x0e, 0x0b, 0x0b, + 0x0b, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, + 0x0d, 0x0d, 0x0d, + 0x00, 0x00, 0x2e, + 0x0d, 0x0d, 0x16, + 0x0e, 0x10, 0x10, + 0x11, 0x10, 0x10, + 0x0f, 0x0d, 0x17, + 0x0f, 0x11, 0x11, + 0x0f, 0x12, 0x12, + 0x11, 0x12, 0x12, + 0x15, 0x13, 0x13, + 0x13, 0x14, 0x14, + 0x17, 0x14, 0x14, + 0x04, 0x00, 0x43, + 0x16, 0x15, 0x15, + 0x19, 0x15, 0x15, + 0x12, 0x16, 0x16, + 0x15, 0x18, 0x18, + 0x1b, 0x1a, 0x1a, + 0x1d, 0x1c, 0x1c, + 0x1e, 0x1c, 0x1c, + 0x1b, 0x1d, 0x1d, + 0x19, 0x1e, 0x1e, + 0x24, 0x1e, 0x1e, + 0x1d, 0x1f, 0x1f, + 0x1c, 0x1e, 0x23, + 0x22, 0x1f, 0x1f, + 0x00, 0x00, 0x6c, + 0x25, 0x20, 0x20, + 0x20, 0x1a, 0x2e, + 0x1e, 0x22, 0x22, + 0x24, 0x22, 0x22, + 0x00, 0x00, 0x81, + 0x1d, 0x29, 0x29, + 0x21, 0x29, 0x29, + 0x06, 0x01, 0x83, + 0x14, 0x00, 0x85, + 0x28, 0x2c, 0x2c, + 0x29, 0x2d, 0x2d, + 0x31, 0x2e, 0x2e, + 0x34, 0x2f, 0x2f, + 0x2d, 0x2f, 0x38, + 0x00, 0x00, 0xa8, + 0x2e, 0x33, 0x33, + 0x00, 0x00, 0xab, + 0x3a, 0x33, 0x33, + 0x34, 0x34, 0x35, + 0x2f, 0x35, 0x35, + 0x35, 0x36, 0x36, + 0x11, 0x0b, 0x99, + 0x04, 0x03, 0xae, + 0x32, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x01, 0x01, 0xb4, + 0x01, 0x00, 0xb6, + 0x09, 0x09, 0xa2, + 0x0a, 0x0a, 0xa0, + 0x07, 0x04, 0xad, + 0x38, 0x37, 0x37, + 0x33, 0x38, 0x38, + 0x36, 0x38, 0x38, + 0x3c, 0x38, 0x38, + 0x3e, 0x38, 0x38, + 0x04, 0x04, 0xb5, + 0x05, 0x05, 0xb4, + 0x1b, 0x15, 0x8d, + 0x37, 0x3a, 0x3a, + 0x39, 0x3a, 0x3a, + 0x3c, 0x3a, 0x3a, + 0x3d, 0x3a, 0x3a, + 0x37, 0x3b, 0x3b, + 0x3a, 0x3b, 0x3b, + 0x0b, 0x0b, 0xad, + 0x23, 0x24, 0x74, + 0x3c, 0x3c, 0x3c, + 0x14, 0x0b, 0xae, + 0x3c, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, + 0x10, 0x10, 0xad, + 0x3f, 0x40, 0x40, + 0x3e, 0x41, 0x41, + 0x1b, 0x1d, 0x97, + 0x3f, 0x42, 0x42, + 0x3b, 0x44, 0x44, + 0x44, 0x43, 0x43, + 0x22, 0x21, 0x93, + 0x48, 0x44, 0x44, + 0x4d, 0x44, 0x44, + 0x1f, 0x1a, 0xac, + 0x4b, 0x46, 0x46, + 0x43, 0x47, 0x47, + 0x45, 0x47, 0x47, + 0x4a, 0x47, 0x47, + 0x4b, 0x47, 0x47, + 0x47, 0x48, 0x48, + 0x4b, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, + 0x49, 0x50, 0x50, + 0x45, 0x4f, 0x5d, + 0x55, 0x52, 0x52, + 0x4f, 0x53, 0x53, + 0x58, 0x55, 0x55, + 0x51, 0x57, 0x57, + 0x5e, 0x56, 0x56, + 0x4e, 0x56, 0x5c, + 0x58, 0x58, 0x58, + 0x32, 0x32, 0xb1, + 0x61, 0x59, 0x59, + 0x56, 0x5c, 0x5c, + 0x57, 0x5e, 0x5e, + 0x66, 0x5d, 0x5d, + 0x44, 0x3c, 0xac, + 0x5e, 0x5f, 0x5f, + 0x5c, 0x63, 0x63, + 0x63, 0x63, 0x63, + 0x65, 0x64, 0x64, + 0x68, 0x65, 0x65, + 0x66, 0x66, 0x66, + 0x69, 0x66, 0x66, + 0x6a, 0x67, 0x68, + 0x5d, 0x69, 0x69, + 0x67, 0x6a, 0x6a, + 0x6b, 0x6a, 0x6a, + 0x60, 0x6c, 0x6c, + 0x74, 0x6f, 0x6f, + 0x54, 0x54, 0xb6, + 0x71, 0x74, 0x74, + 0x6d, 0x75, 0x75, + 0x72, 0x75, 0x75, + 0x79, 0x77, 0x77, + 0x7b, 0x77, 0x77, + 0x76, 0x7a, 0x7a, + 0x80, 0x7b, 0x7b, + 0x7a, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7c, + 0x7e, 0x7c, 0x7c, + 0x75, 0x75, 0x8f, + 0x7d, 0x7d, 0x7d, + 0x7d, 0x7e, 0x7e, + 0x80, 0x7f, 0x7f, + 0x83, 0x7f, 0x7f, + 0x7d, 0x80, 0x80, + 0x80, 0x83, 0x83, + 0x7f, 0x86, 0x86, + 0x85, 0x87, 0x87, + 0x88, 0x8a, 0x8a, + 0x85, 0x8c, 0x8c, + 0x7b, 0x73, 0xc6, + 0x8b, 0x8f, 0x8f, + 0x8c, 0x90, 0x90, + 0x8e, 0x90, 0x90, + 0x96, 0x90, 0x90, + 0x8f, 0x93, 0x93, + 0x84, 0x7e, 0xc2, + 0x8f, 0x8c, 0xa7, + 0x95, 0x95, 0x95, + 0x93, 0x96, 0x96, + 0x93, 0x97, 0x97, + 0x93, 0x99, 0x99, + 0x88, 0x8b, 0xba, + 0x97, 0x99, 0x99, + 0x9f, 0x9a, 0x9a, + 0x8e, 0x93, 0xb9, + 0xa6, 0xa1, 0xa1, + 0xa7, 0xa3, 0xa4, + 0xa3, 0xa4, 0xa4, + 0xa5, 0xa5, 0xa5, + 0xae, 0xaa, 0xaa, + 0xb2, 0xac, 0xac, + 0xaf, 0xad, 0xad, + 0xb0, 0xae, 0xae, + 0xb6, 0xae, 0xae, + 0xb4, 0xb2, 0xb2, + 0xb7, 0xb6, 0xb6, + 0xb7, 0xb7, 0xb7, + 0xb8, 0xba, 0xba, + 0xb5, 0xbc, 0xbc, + 0xb6, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, + 0xc0, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbe, + 0xc1, 0xc3, 0xc3, + 0xc2, 0xc4, 0xc4, + 0xcd, 0xca, 0xca, + 0xc6, 0xcb, 0xcb, + 0xc2, 0xca, 0xcf, + 0xcb, 0xcb, 0xcb, + 0xca, 0xce, 0xd0, + 0xcb, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd2, + 0xd4, 0xd2, 0xd2, + 0xd1, 0xd1, 0xd6, + 0xd5, 0xd3, 0xd3, + 0xd2, 0xd4, 0xd4, + 0xd0, 0xd5, 0xd5, + 0xce, 0xd6, 0xd6, + 0xd1, 0xd7, 0xd7, + 0xd7, 0xd6, 0xdb, + 0xd7, 0xda, 0xda, + 0xd9, 0xda, 0xda, + 0xde, 0xda, 0xda, + 0xe2, 0xde, 0xe3, + 0xe2, 0xe0, 0xe0, + 0xe0, 0xe1, 0xe1, + 0xe5, 0xe4, 0xe4, + 0xe7, 0xe4, 0xe4, + 0xe5, 0xe7, 0xe7, + 0xea, 0xe7, 0xe7, + 0xea, 0xe8, 0xe8, + 0xeb, 0xea, 0xea, + 0xef, 0xec, 0xec, + 0xee, 0xf1, 0xf1, + 0xf4, 0xf3, 0xf3, + 0xf7, 0xf6, 0xf6, + + 0xf4, 0x07, 0x07, 0x07, 0x01, 0x04, 0x03, 0x38, 0x3c, 0xc0, 0x07, 0x04, + 0x06, 0x88, 0x87, 0x3e, 0x17, 0x00, 0x0c, 0x00, 0x1f, 0xa6, 0x10, 0x3f, + 0x04, 0x12, 0x74, 0x01, 0xbe, 0xce, 0xbf, 0xa1, 0x29, 0x91, 0x8b, 0x47, + 0x80, 0x06, 0x0b, 0x44, 0xba, 0xe9, 0x33, 0x16, 0xc5, 0x58, 0x55, 0x39, + 0x0a, 0x1f, 0x03, 0x6e, 0xd7, 0x11, 0x01, 0x00, 0x70, 0xcf, 0x39, 0x00, + 0x14, 0x89, 0x44, 0x20, 0x2f, 0x01, 0x04, 0x52, 0xbd, 0x00, 0x00, 0x36, + 0x04, 0xde, 0xd8, 0x23, 0x59, 0x9b, 0x44, 0x6d, 0x2b, 0x80, 0x02, 0x66, + 0x5d, 0x4a, 0xb8, 0x00, 0x5a, 0xd1, 0x04, 0xb7, 0x47, 0x08, 0x80, 0xaf, + 0x44, 0x28, 0xa2, 0x00, 0x07, 0x00, 0x01, 0x3f, 0x73, 0xb1, 0x7f, 0xc7, + 0x00, 0x90, 0xda, 0x77, 0x05, 0x00, 0x00, 0x97, 0xb5, 0x80, 0x44, 0x05, + 0xb3, 0x51, 0x00, 0x03, 0x99, 0xb6, 0x00, 0x56, 0x62, 0x86, 0xdc, 0x8f, + 0x7d, 0x93, 0xa0, 0x02, 0xa7, 0xcc, 0xcd, 0x07, 0x22, 0x67, 0x2a, 0x6b, + 0x00, 0xca, 0x5b, 0x2e, 0x1e, 0x40, 0x57, 0x4b, 0x4d, 0x00, 0xb0, 0xd0, + 0xbb, 0xac, 0xab, 0xb4, 0xc1, 0xc3, 0x10, 0x1c, 0x75, 0x76, 0x42, 0x15, + 0xd4, 0xeb, 0xe3, 0x00, 0xd9, 0xd2, 0x94, 0x65, 0x4c, 0x49, 0x48, 0x6c, + 0x00, 0x9f, 0x8e, 0x2d, 0x05, 0x05, 0x00, 0xa4, 0x78, 0x80, 0x42, 0x00, + 0x22, 0x2a, 0x21, 0x69, 0xc8, 0x95, 0x00, 0xd6, 0x81, 0x32, 0x24, 0x41, + 0x5f, 0xb9, 0xdb, 0x00, 0xbc, 0x5e, 0x0e, 0xc9, 0x72, 0x00, 0x00, 0x7b, + 0x00, 0xa5, 0xa8, 0x84, 0x20, 0x83, 0xd3, 0x3d, 0x98, 0x00, 0xad, 0xaa, + 0x3a, 0x13, 0x19, 0x43, 0x68, 0x45, 0x00, 0x9d, 0xd4, 0xc2, 0xe4, 0x8c, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x6a, 0xbf, 0xe8, 0xea, 0x64, 0x02, 0xcb, + 0x00, 0x61, 0xe0, 0x6f, 0x3b, 0x37, 0x4b, 0x4f, 0x30, 0x06, 0x00, 0x25, + 0xa3, 0xe6, 0xae, 0x41, 0x29, 0x5c, 0x00, 0x9d, 0x04, 0x35, 0xe2, 0x18, + 0xdd, 0x79, 0x60, 0x00, 0x4e, 0x50, 0x58, 0x0f, 0x00, 0x00, 0x02, 0x31, + 0x60, 0x82, 0x44, 0x11, 0x7e, 0xe7, 0x02, 0xc0, 0xa9, 0x0c, 0x09, 0x1a, + 0x34, 0x1d, 0x77, 0x29, 0x46, 0x9c, 0x01, 0xc6, 0xe1, 0xd5, 0x06, 0x92, + 0xe5, 0x26, 0x5f, 0x80, 0x12, 0x1b, 0x96, 0x9a, 0x7a, 0x42, 0x27, 0x0c, + 0x0c, 0x00, 0x53, 0xec, 0x9e, 0x47, 0x07, 0x00, 0x02, 0x0c, 0x71, 0xdf, + 0xc4, 0x54, 0x47, 0x07, 0x03, 0x85, 0x18, 0xd1, 0x7c, 0x0e, 0x4f, 0x07, + 0x02, 0x8a, 0xb2, 0x60, 0x2c, 0x57, 0x0f, 0x00, 0x00, 0x63, 0x8d, 0x0d, + 0xf8, 0x4f, 0x07, 0x77, 0x2f, 0x06, +}; + +//***************************************************************************** +// +// The first image of the spider facing up and right. +// +//***************************************************************************** +const uint8_t g_pui8SpiderUR1Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 236, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x05, 0x03, 0x03, + 0x03, 0x04, 0x04, + 0x05, 0x04, 0x04, + 0x05, 0x05, 0x05, + 0x07, 0x06, 0x06, + 0x06, 0x08, 0x08, + 0x08, 0x08, 0x08, + 0x08, 0x07, 0x0a, + 0x09, 0x09, 0x09, + 0x0a, 0x09, 0x09, + 0x09, 0x0a, 0x0a, + 0x0d, 0x00, 0x1f, + 0x0d, 0x0b, 0x0b, + 0x0e, 0x0b, 0x0b, + 0x0b, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, + 0x0d, 0x0d, 0x0d, + 0x00, 0x00, 0x2e, + 0x0d, 0x0d, 0x16, + 0x0e, 0x10, 0x10, + 0x11, 0x10, 0x10, + 0x0f, 0x0d, 0x17, + 0x0f, 0x11, 0x11, + 0x0f, 0x12, 0x12, + 0x11, 0x12, 0x12, + 0x15, 0x13, 0x13, + 0x13, 0x14, 0x14, + 0x17, 0x14, 0x14, + 0x04, 0x00, 0x43, + 0x16, 0x15, 0x15, + 0x19, 0x15, 0x15, + 0x12, 0x16, 0x16, + 0x15, 0x18, 0x18, + 0x1b, 0x1a, 0x1a, + 0x1d, 0x1c, 0x1c, + 0x1e, 0x1c, 0x1c, + 0x1b, 0x1d, 0x1d, + 0x19, 0x1e, 0x1e, + 0x24, 0x1e, 0x1e, + 0x1d, 0x1f, 0x1f, + 0x1c, 0x1e, 0x23, + 0x22, 0x1f, 0x1f, + 0x00, 0x00, 0x6c, + 0x25, 0x20, 0x20, + 0x20, 0x1a, 0x2e, + 0x1e, 0x22, 0x22, + 0x24, 0x22, 0x22, + 0x00, 0x00, 0x81, + 0x1d, 0x29, 0x29, + 0x21, 0x29, 0x29, + 0x06, 0x01, 0x83, + 0x14, 0x00, 0x85, + 0x28, 0x2c, 0x2c, + 0x29, 0x2d, 0x2d, + 0x31, 0x2e, 0x2e, + 0x34, 0x2f, 0x2f, + 0x2d, 0x2f, 0x38, + 0x00, 0x00, 0xa8, + 0x2e, 0x33, 0x33, + 0x00, 0x00, 0xab, + 0x3a, 0x33, 0x33, + 0x34, 0x34, 0x35, + 0x2f, 0x35, 0x35, + 0x35, 0x36, 0x36, + 0x11, 0x0b, 0x99, + 0x04, 0x03, 0xae, + 0x32, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x01, 0x01, 0xb4, + 0x01, 0x00, 0xb6, + 0x09, 0x09, 0xa2, + 0x0a, 0x0a, 0xa0, + 0x07, 0x04, 0xad, + 0x38, 0x37, 0x37, + 0x33, 0x38, 0x38, + 0x36, 0x38, 0x38, + 0x3c, 0x38, 0x38, + 0x3e, 0x38, 0x38, + 0x04, 0x04, 0xb5, + 0x05, 0x05, 0xb4, + 0x1b, 0x15, 0x8d, + 0x37, 0x3a, 0x3a, + 0x39, 0x3a, 0x3a, + 0x3c, 0x3a, 0x3a, + 0x3d, 0x3a, 0x3a, + 0x37, 0x3b, 0x3b, + 0x3a, 0x3b, 0x3b, + 0x0b, 0x0b, 0xad, + 0x23, 0x24, 0x74, + 0x3c, 0x3c, 0x3c, + 0x14, 0x0b, 0xae, + 0x3c, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, + 0x10, 0x10, 0xad, + 0x3f, 0x40, 0x40, + 0x3e, 0x41, 0x41, + 0x1b, 0x1d, 0x97, + 0x3f, 0x42, 0x42, + 0x3b, 0x44, 0x44, + 0x44, 0x43, 0x43, + 0x22, 0x21, 0x93, + 0x48, 0x44, 0x44, + 0x4d, 0x44, 0x44, + 0x1f, 0x1a, 0xac, + 0x4b, 0x46, 0x46, + 0x43, 0x47, 0x47, + 0x45, 0x47, 0x47, + 0x4a, 0x47, 0x47, + 0x4b, 0x47, 0x47, + 0x47, 0x48, 0x48, + 0x4b, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, + 0x49, 0x50, 0x50, + 0x45, 0x4f, 0x5d, + 0x55, 0x52, 0x52, + 0x4f, 0x53, 0x53, + 0x58, 0x55, 0x55, + 0x51, 0x57, 0x57, + 0x5e, 0x56, 0x56, + 0x4e, 0x56, 0x5c, + 0x58, 0x58, 0x58, + 0x32, 0x32, 0xb1, + 0x61, 0x59, 0x59, + 0x56, 0x5c, 0x5c, + 0x57, 0x5e, 0x5e, + 0x66, 0x5d, 0x5d, + 0x44, 0x3c, 0xac, + 0x5e, 0x5f, 0x5f, + 0x5c, 0x63, 0x63, + 0x63, 0x63, 0x63, + 0x65, 0x64, 0x64, + 0x68, 0x65, 0x65, + 0x66, 0x66, 0x66, + 0x69, 0x66, 0x66, + 0x6a, 0x67, 0x68, + 0x5d, 0x69, 0x69, + 0x67, 0x6a, 0x6a, + 0x6b, 0x6a, 0x6a, + 0x60, 0x6c, 0x6c, + 0x74, 0x6f, 0x6f, + 0x54, 0x54, 0xb6, + 0x71, 0x74, 0x74, + 0x6d, 0x75, 0x75, + 0x72, 0x75, 0x75, + 0x79, 0x77, 0x77, + 0x7b, 0x77, 0x77, + 0x76, 0x7a, 0x7a, + 0x80, 0x7b, 0x7b, + 0x7a, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7c, + 0x7e, 0x7c, 0x7c, + 0x75, 0x75, 0x8f, + 0x7d, 0x7d, 0x7d, + 0x7d, 0x7e, 0x7e, + 0x80, 0x7f, 0x7f, + 0x83, 0x7f, 0x7f, + 0x7d, 0x80, 0x80, + 0x80, 0x83, 0x83, + 0x7f, 0x86, 0x86, + 0x85, 0x87, 0x87, + 0x88, 0x8a, 0x8a, + 0x85, 0x8c, 0x8c, + 0x7b, 0x73, 0xc6, + 0x8b, 0x8f, 0x8f, + 0x8c, 0x90, 0x90, + 0x8e, 0x90, 0x90, + 0x96, 0x90, 0x90, + 0x8f, 0x93, 0x93, + 0x84, 0x7e, 0xc2, + 0x8f, 0x8c, 0xa7, + 0x95, 0x95, 0x95, + 0x93, 0x96, 0x96, + 0x93, 0x97, 0x97, + 0x93, 0x99, 0x99, + 0x88, 0x8b, 0xba, + 0x97, 0x99, 0x99, + 0x9f, 0x9a, 0x9a, + 0x8e, 0x93, 0xb9, + 0xa6, 0xa1, 0xa1, + 0xa7, 0xa3, 0xa4, + 0xa3, 0xa4, 0xa4, + 0xa5, 0xa5, 0xa5, + 0xae, 0xaa, 0xaa, + 0xb2, 0xac, 0xac, + 0xaf, 0xad, 0xad, + 0xb0, 0xae, 0xae, + 0xb6, 0xae, 0xae, + 0xb4, 0xb2, 0xb2, + 0xb7, 0xb6, 0xb6, + 0xb7, 0xb7, 0xb7, + 0xb8, 0xba, 0xba, + 0xb5, 0xbc, 0xbc, + 0xb6, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, + 0xc0, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbe, + 0xc1, 0xc3, 0xc3, + 0xc2, 0xc4, 0xc4, + 0xcd, 0xca, 0xca, + 0xc6, 0xcb, 0xcb, + 0xc2, 0xca, 0xcf, + 0xcb, 0xcb, 0xcb, + 0xca, 0xce, 0xd0, + 0xcb, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd2, + 0xd4, 0xd2, 0xd2, + 0xd1, 0xd1, 0xd6, + 0xd5, 0xd3, 0xd3, + 0xd2, 0xd4, 0xd4, + 0xd0, 0xd5, 0xd5, + 0xce, 0xd6, 0xd6, + 0xd1, 0xd7, 0xd7, + 0xd7, 0xd6, 0xdb, + 0xd7, 0xda, 0xda, + 0xd9, 0xda, 0xda, + 0xde, 0xda, 0xda, + 0xe2, 0xde, 0xe3, + 0xe2, 0xe0, 0xe0, + 0xe0, 0xe1, 0xe1, + 0xe5, 0xe4, 0xe4, + 0xe7, 0xe4, 0xe4, + 0xe5, 0xe7, 0xe7, + 0xea, 0xe7, 0xe7, + 0xea, 0xe8, 0xe8, + 0xeb, 0xea, 0xea, + 0xef, 0xec, 0xec, + 0xee, 0xf1, 0xf1, + 0xf4, 0xf3, 0xf3, + 0xf7, 0xf6, 0xf6, + + 0xf2, 0x07, 0x07, 0x07, 0x05, 0x3c, 0x38, 0x03, 0x04, 0xc0, 0x07, 0x04, + 0x10, 0xa6, 0x1f, 0x00, 0x00, 0x17, 0x0c, 0x3e, 0x87, 0x88, 0x06, 0x3f, + 0x03, 0x8b, 0x91, 0x01, 0x29, 0xa1, 0xbf, 0xce, 0xbe, 0x74, 0x12, 0x4f, + 0x20, 0x00, 0x0a, 0x01, 0x55, 0xc5, 0x16, 0x33, 0xe9, 0x18, 0xba, 0x44, + 0x0b, 0x57, 0x09, 0x89, 0x14, 0x00, 0x01, 0x39, 0xcf, 0x70, 0x00, 0x11, + 0xd7, 0x6e, 0x57, 0x80, 0x0b, 0x9b, 0x59, 0x23, 0xd8, 0xde, 0x36, 0x00, + 0x12, 0x00, 0xbd, 0x52, 0x44, 0x01, 0x2f, 0x04, 0xaf, 0x00, 0x80, 0x08, + 0x47, 0xb7, 0xd1, 0x5a, 0x00, 0xb8, 0x12, 0x4a, 0x5d, 0x66, 0x32, 0x2b, + 0x6d, 0x04, 0xb5, 0x00, 0x97, 0x00, 0x00, 0x05, 0x77, 0xda, 0x90, 0xc7, + 0x00, 0x7f, 0xb1, 0x73, 0x3f, 0x01, 0x00, 0x07, 0xa2, 0x40, 0x28, 0x11, + 0x67, 0x22, 0x07, 0xcd, 0xcc, 0xa7, 0x00, 0xa0, 0x93, 0x7d, 0x8f, 0xdc, + 0x86, 0x62, 0x56, 0x01, 0xb6, 0x99, 0x03, 0x00, 0x51, 0xb3, 0x05, 0x41, + 0x00, 0x76, 0x75, 0x1c, 0xc3, 0xc1, 0xb4, 0xab, 0xac, 0x00, 0xbb, 0xd0, + 0xb0, 0x4d, 0x4b, 0x57, 0x40, 0x1e, 0x08, 0x2e, 0x5b, 0xca, 0x6b, 0x49, + 0x00, 0x78, 0xa4, 0x00, 0x00, 0x05, 0x05, 0x2d, 0x8e, 0x9f, 0x6c, 0x48, + 0x00, 0x49, 0x4c, 0x65, 0x94, 0xd2, 0xd9, 0xe3, 0xeb, 0x20, 0xd4, 0x15, + 0x42, 0x72, 0xc9, 0x0e, 0x5e, 0xbc, 0x00, 0xdb, 0xb9, 0x5f, 0x41, 0x24, + 0x32, 0x81, 0xd6, 0x02, 0x95, 0xc8, 0x69, 0x21, 0x2a, 0x22, 0x4a, 0x00, + 0x00, 0x8c, 0xe4, 0xc2, 0xd4, 0x9d, 0x45, 0x68, 0x43, 0x00, 0x19, 0x13, + 0x3a, 0xaa, 0xad, 0x98, 0x3d, 0xd3, 0x00, 0x83, 0x20, 0x84, 0xa8, 0xa5, + 0x7b, 0x00, 0x00, 0x00, 0xae, 0xe6, 0xa3, 0x25, 0x00, 0x30, 0x4f, 0x4b, + 0x00, 0x37, 0x3b, 0x6f, 0xe0, 0x61, 0xcb, 0x02, 0x64, 0x00, 0xea, 0xe8, + 0xbf, 0x6a, 0x10, 0x00, 0x00, 0x00, 0x00, 0x82, 0x31, 0x02, 0x00, 0x00, + 0x0f, 0x58, 0x50, 0x00, 0x4e, 0x60, 0x79, 0xdd, 0x18, 0xe2, 0x35, 0x04, + 0x38, 0x9d, 0x5c, 0x59, 0x41, 0xd4, 0x1d, 0x34, 0x1a, 0x03, 0x09, 0xa9, + 0xc0, 0x02, 0xe7, 0x7e, 0x5f, 0x17, 0x00, 0x26, 0xe5, 0x92, 0x06, 0xd5, + 0xe1, 0xc6, 0x9c, 0x60, 0x46, 0x2f, 0x04, 0x9e, 0xec, 0x53, 0x00, 0x0c, + 0x03, 0x27, 0x42, 0x7a, 0x9a, 0x96, 0x1b, 0x37, 0x02, 0x06, 0x54, 0xc4, + 0xdf, 0x71, 0x02, 0x77, 0x2f, 0x00, 0x03, 0x00, 0x0e, 0x7c, 0xd1, 0x85, + 0x03, 0x3f, 0x07, 0x87, 0x01, 0x2c, 0xb2, 0x8a, 0x02, 0x3f, 0x07, 0x01, + 0x1e, 0x0d, 0x8d, 0x63, 0x47, 0x07, 0x77, 0x2f, +}; + +//***************************************************************************** +// +// The second image of the spider facing up and right. +// +//***************************************************************************** +const uint8_t g_pui8SpiderUR2Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 236, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x05, 0x03, 0x03, + 0x03, 0x04, 0x04, + 0x05, 0x04, 0x04, + 0x05, 0x05, 0x05, + 0x07, 0x06, 0x06, + 0x06, 0x08, 0x08, + 0x08, 0x08, 0x08, + 0x08, 0x07, 0x0b, + 0x09, 0x09, 0x09, + 0x0a, 0x09, 0x09, + 0x09, 0x0a, 0x0a, + 0x0d, 0x00, 0x1f, + 0x0c, 0x0b, 0x0b, + 0x0e, 0x0b, 0x0b, + 0x0b, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, + 0x0d, 0x0d, 0x0d, + 0x00, 0x00, 0x2e, + 0x0d, 0x0d, 0x16, + 0x0e, 0x10, 0x10, + 0x11, 0x10, 0x10, + 0x0f, 0x0d, 0x17, + 0x0f, 0x11, 0x11, + 0x11, 0x12, 0x12, + 0x15, 0x13, 0x13, + 0x13, 0x14, 0x14, + 0x17, 0x14, 0x14, + 0x04, 0x00, 0x43, + 0x16, 0x15, 0x15, + 0x19, 0x15, 0x15, + 0x12, 0x16, 0x16, + 0x15, 0x18, 0x18, + 0x1b, 0x1a, 0x1a, + 0x1d, 0x1c, 0x1c, + 0x1f, 0x1c, 0x1c, + 0x1b, 0x1d, 0x1d, + 0x1a, 0x1e, 0x1e, + 0x24, 0x1e, 0x1e, + 0x1d, 0x1f, 0x1f, + 0x21, 0x1f, 0x1f, + 0x1c, 0x1e, 0x23, + 0x00, 0x00, 0x6c, + 0x25, 0x20, 0x20, + 0x20, 0x1a, 0x2e, + 0x1e, 0x22, 0x22, + 0x24, 0x22, 0x22, + 0x00, 0x00, 0x81, + 0x1d, 0x29, 0x29, + 0x21, 0x29, 0x29, + 0x06, 0x01, 0x83, + 0x13, 0x00, 0x86, + 0x28, 0x2c, 0x2c, + 0x29, 0x2d, 0x2d, + 0x31, 0x2e, 0x2e, + 0x34, 0x2f, 0x2f, + 0x2c, 0x2f, 0x39, + 0x00, 0x00, 0xa8, + 0x2e, 0x33, 0x33, + 0x00, 0x00, 0xab, + 0x3a, 0x33, 0x33, + 0x2f, 0x35, 0x35, + 0x34, 0x35, 0x35, + 0x35, 0x36, 0x36, + 0x11, 0x0b, 0x99, + 0x04, 0x03, 0xae, + 0x32, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x01, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x09, 0x09, 0xa2, + 0x01, 0x01, 0xb5, + 0x07, 0x04, 0xad, + 0x38, 0x37, 0x37, + 0x0b, 0x0a, 0xa0, + 0x33, 0x38, 0x38, + 0x3c, 0x38, 0x38, + 0x3e, 0x38, 0x38, + 0x04, 0x04, 0xb5, + 0x05, 0x05, 0xb4, + 0x37, 0x3a, 0x3a, + 0x1c, 0x15, 0x8d, + 0x39, 0x3a, 0x3a, + 0x3c, 0x3a, 0x3a, + 0x3e, 0x3a, 0x3a, + 0x36, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, + 0x0b, 0x0b, 0xac, + 0x3c, 0x3c, 0x3c, + 0x22, 0x25, 0x74, + 0x14, 0x0b, 0xaf, + 0x3c, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, + 0x10, 0x10, 0xad, + 0x3e, 0x40, 0x40, + 0x3f, 0x41, 0x41, + 0x1b, 0x1d, 0x97, + 0x3f, 0x42, 0x42, + 0x3b, 0x44, 0x44, + 0x44, 0x43, 0x43, + 0x22, 0x21, 0x93, + 0x48, 0x44, 0x44, + 0x4e, 0x44, 0x44, + 0x1f, 0x1a, 0xac, + 0x4b, 0x46, 0x46, + 0x46, 0x47, 0x47, + 0x4a, 0x47, 0x46, + 0x4b, 0x47, 0x47, + 0x43, 0x48, 0x48, + 0x47, 0x48, 0x48, + 0x4b, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, + 0x49, 0x50, 0x50, + 0x45, 0x4f, 0x5d, + 0x4f, 0x53, 0x53, + 0x55, 0x53, 0x53, + 0x57, 0x55, 0x55, + 0x51, 0x57, 0x57, + 0x5e, 0x56, 0x56, + 0x4e, 0x56, 0x5c, + 0x58, 0x58, 0x58, + 0x32, 0x32, 0xb1, + 0x61, 0x58, 0x58, + 0x56, 0x5b, 0x5b, + 0x57, 0x5e, 0x5e, + 0x66, 0x5d, 0x5d, + 0x5e, 0x5e, 0x5e, + 0x43, 0x3c, 0xac, + 0x5b, 0x63, 0x63, + 0x65, 0x63, 0x63, + 0x63, 0x64, 0x64, + 0x67, 0x64, 0x64, + 0x66, 0x65, 0x65, + 0x69, 0x66, 0x66, + 0x5d, 0x69, 0x69, + 0x6a, 0x68, 0x68, + 0x67, 0x6a, 0x6a, + 0x6b, 0x6a, 0x6a, + 0x60, 0x6c, 0x6c, + 0x74, 0x6e, 0x6e, + 0x54, 0x54, 0xb6, + 0x71, 0x73, 0x74, + 0x6d, 0x75, 0x75, + 0x71, 0x75, 0x75, + 0x7a, 0x77, 0x77, + 0x7b, 0x78, 0x78, + 0x76, 0x7a, 0x7a, + 0x7d, 0x7b, 0x7b, + 0x80, 0x7b, 0x7b, + 0x7a, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7c, + 0x7e, 0x7c, 0x7c, + 0x7d, 0x7d, 0x7d, + 0x75, 0x75, 0x90, + 0x7d, 0x7e, 0x7e, + 0x83, 0x7e, 0x7e, + 0x80, 0x7f, 0x7f, + 0x7d, 0x80, 0x80, + 0x80, 0x83, 0x83, + 0x7f, 0x86, 0x86, + 0x85, 0x87, 0x87, + 0x88, 0x89, 0x89, + 0x85, 0x8c, 0x8c, + 0x7b, 0x73, 0xc6, + 0x8b, 0x8f, 0x8f, + 0x8c, 0x90, 0x90, + 0x8e, 0x90, 0x90, + 0x96, 0x91, 0x91, + 0x8f, 0x93, 0x93, + 0x85, 0x7f, 0xc2, + 0x90, 0x8c, 0xa8, + 0x95, 0x95, 0x95, + 0x93, 0x97, 0x97, + 0x94, 0x97, 0x97, + 0x88, 0x8a, 0xba, + 0x94, 0x99, 0x99, + 0x97, 0x99, 0x99, + 0x9f, 0x9a, 0x9a, + 0x8e, 0x93, 0xb9, + 0xa6, 0xa1, 0xa1, + 0xa3, 0xa3, 0xa3, + 0xa7, 0xa3, 0xa4, + 0xa6, 0xa6, 0xa6, + 0xae, 0xaa, 0xaa, + 0xb2, 0xac, 0xac, + 0xaf, 0xad, 0xad, + 0xb6, 0xad, 0xad, + 0xb0, 0xae, 0xae, + 0xb4, 0xb2, 0xb2, + 0xb7, 0xb7, 0xb7, + 0xb8, 0xba, 0xba, + 0xb5, 0xbc, 0xbc, + 0xb6, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, + 0xc0, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbe, + 0xc1, 0xc3, 0xc3, + 0xc2, 0xc4, 0xc4, + 0xcc, 0xca, 0xca, + 0xc6, 0xcb, 0xcb, + 0xc2, 0xca, 0xcf, + 0xca, 0xcb, 0xcb, + 0xcb, 0xcc, 0xcc, + 0xca, 0xce, 0xd0, + 0xcc, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd2, + 0xd3, 0xd2, 0xd2, + 0xd1, 0xd1, 0xd6, + 0xd5, 0xd3, 0xd3, + 0xd2, 0xd4, 0xd4, + 0xd0, 0xd5, 0xd5, + 0xce, 0xd6, 0xd6, + 0xd1, 0xd7, 0xd7, + 0xd6, 0xd6, 0xdb, + 0xd9, 0xd9, 0xd9, + 0xd7, 0xda, 0xda, + 0xde, 0xda, 0xda, + 0xe3, 0xde, 0xe3, + 0xe2, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe1, + 0xe5, 0xe3, 0xe3, + 0xe7, 0xe3, 0xe3, + 0xe5, 0xe7, 0xe7, + 0xe9, 0xe7, 0xe7, + 0xea, 0xe8, 0xe8, + 0xeb, 0xea, 0xea, + 0xef, 0xec, 0xec, + 0xee, 0xf1, 0xf1, + 0xf4, 0xf3, 0xf3, + 0xf6, 0xf6, 0xf6, + + 0xf7, 0x07, 0x07, 0x07, 0x05, 0x79, 0x07, 0x07, 0x02, 0x21, 0x12, 0xa5, + 0x01, 0x05, 0x27, 0x6c, 0x2e, 0x0f, 0x10, 0x00, 0x00, 0x1b, 0x01, 0x69, + 0xa8, 0x00, 0x15, 0x04, 0x6a, 0xb3, 0xa3, 0x2a, 0x01, 0x47, 0x00, 0x00, + 0x40, 0x95, 0x01, 0xbf, 0x83, 0x21, 0xd4, 0xc9, 0x50, 0x60, 0x07, 0x57, + 0x0a, 0x99, 0x44, 0x00, 0x5b, 0xe8, 0x0a, 0x1f, 0x29, 0xeb, 0x5a, 0x55, + 0x06, 0x15, 0x7a, 0x00, 0x9c, 0x00, 0x9a, 0xea, 0x82, 0x20, 0xe3, 0x2d, + 0x20, 0x03, 0x02, 0x32, 0x12, 0x87, 0x05, 0x00, 0x00, 0x40, 0x62, 0xa9, + 0x41, 0xc5, 0x00, 0x04, 0x63, 0xd3, 0x04, 0x68, 0xd9, 0x1e, 0x98, 0x3e, + 0x42, 0x72, 0x85, 0x80, 0x11, 0x8c, 0x88, 0x03, 0x00, 0x26, 0xe1, 0x7d, + 0x00, 0x34, 0x02, 0x3c, 0xc7, 0xd2, 0x3f, 0xb5, 0x71, 0x02, 0x66, 0x00, + 0x00, 0x0b, 0xbe, 0x3d, 0x11, 0x0d, 0x00, 0xb2, 0x84, 0x02, 0x0c, 0xd5, + 0xe7, 0xe2, 0xca, 0x00, 0x97, 0x94, 0x93, 0x56, 0x55, 0xb1, 0x5c, 0x00, + 0x08, 0x00, 0x43, 0xcd, 0x17, 0x41, 0x00, 0x2b, 0xd0, 0x00, 0x73, 0x00, + 0x06, 0x02, 0x18, 0x5f, 0xad, 0xd6, 0x00, 0x64, 0x4a, 0x61, 0x7e, 0x49, + 0x52, 0x6d, 0xba, 0x40, 0xbf, 0x4a, 0x00, 0x00, 0x7b, 0xdf, 0x4c, 0x91, + 0x00, 0xc0, 0xde, 0xe0, 0xaa, 0x80, 0x4e, 0x4b, 0x86, 0x02, 0xc6, 0xb8, + 0xbd, 0xd7, 0xe9, 0xa1, 0x44, 0x0e, 0x00, 0xc4, 0xec, 0xe5, 0xa9, 0x78, + 0x6e, 0x39, 0x31, 0x00, 0x48, 0xb0, 0xdc, 0x8f, 0x00, 0x00, 0x11, 0x32, + 0x10, 0x28, 0x1e, 0x37, 0x33, 0x53, 0x9e, 0x25, 0x09, 0x00, 0x60, 0x3a, + 0x13, 0x23, 0x47, 0xcf, 0x8d, 0xda, 0x01, 0x59, 0x00, 0x00, 0x16, 0x90, + 0xa6, 0x3b, 0x43, 0x80, 0x19, 0x1a, 0x4d, 0x36, 0x19, 0x40, 0x6b, 0xbc, + 0x00, 0x7c, 0x76, 0xd1, 0x35, 0x6f, 0xc4, 0x8a, 0x10, 0x80, 0x4e, 0x00, + 0x33, 0x4f, 0x4a, 0x42, 0x5e, 0xa0, 0x01, 0xac, 0x92, 0x05, 0xb7, 0xdd, + 0xce, 0x54, 0x57, 0x00, 0x00, 0x00, 0x1d, 0x58, 0x51, 0x67, 0xb9, 0x8e, + 0x03, 0xab, 0x9f, 0x00, 0x46, 0xd8, 0x38, 0x4f, 0x02, 0x00, 0x0f, 0x30, + 0x45, 0xdb, 0x2c, 0xb4, 0xa7, 0x00, 0x30, 0x08, 0x22, 0x4f, 0x05, 0x9d, + 0xbb, 0x05, 0xc2, 0x06, 0xcb, 0x96, 0x7f, 0x57, 0x14, 0x3f, 0x03, 0x24, + 0x00, 0xd4, 0x5d, 0x05, 0xc3, 0xcc, 0xb6, 0xaf, 0x9b, 0x30, 0x89, 0x0a, + 0x3f, 0x01, 0x02, 0xa2, 0xc1, 0x0e, 0x18, 0x00, 0x1c, 0x07, 0x6f, 0x26, + 0x2f, 0xe6, 0xe4, 0x0c, 0xc8, 0xa4, 0x74, 0x21, 0x47, 0x06, 0x81, 0xae, + 0x07, 0x8b, 0x70, 0x77, 0x75, 0x65, 0x47, 0x07, 0x77, 0x80, 0x2f, +}; + +//***************************************************************************** +// +// The first image of the spider facing down and left. +// +//***************************************************************************** +const uint8_t g_pui8SpiderDL1Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 236, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x05, 0x03, 0x03, + 0x03, 0x04, 0x04, + 0x05, 0x04, 0x04, + 0x05, 0x05, 0x05, + 0x07, 0x06, 0x06, + 0x06, 0x08, 0x08, + 0x08, 0x08, 0x08, + 0x08, 0x07, 0x0a, + 0x09, 0x09, 0x09, + 0x0a, 0x09, 0x09, + 0x09, 0x0a, 0x0a, + 0x0d, 0x00, 0x1f, + 0x0d, 0x0b, 0x0b, + 0x0e, 0x0b, 0x0b, + 0x0b, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, + 0x0d, 0x0d, 0x0d, + 0x00, 0x00, 0x2e, + 0x0d, 0x0d, 0x16, + 0x0e, 0x10, 0x10, + 0x11, 0x10, 0x10, + 0x0f, 0x0d, 0x17, + 0x0f, 0x11, 0x11, + 0x0f, 0x12, 0x12, + 0x11, 0x12, 0x12, + 0x15, 0x13, 0x13, + 0x13, 0x14, 0x14, + 0x17, 0x14, 0x14, + 0x04, 0x00, 0x43, + 0x16, 0x15, 0x15, + 0x19, 0x15, 0x15, + 0x12, 0x16, 0x16, + 0x15, 0x18, 0x18, + 0x1b, 0x1a, 0x1a, + 0x1d, 0x1c, 0x1c, + 0x1e, 0x1c, 0x1c, + 0x1b, 0x1d, 0x1d, + 0x19, 0x1e, 0x1e, + 0x24, 0x1e, 0x1e, + 0x1d, 0x1f, 0x1f, + 0x1c, 0x1e, 0x23, + 0x22, 0x1f, 0x1f, + 0x00, 0x00, 0x6c, + 0x25, 0x20, 0x20, + 0x20, 0x1a, 0x2e, + 0x1e, 0x22, 0x22, + 0x24, 0x22, 0x22, + 0x00, 0x00, 0x81, + 0x1d, 0x29, 0x29, + 0x21, 0x29, 0x29, + 0x06, 0x01, 0x83, + 0x14, 0x00, 0x85, + 0x28, 0x2c, 0x2c, + 0x29, 0x2d, 0x2d, + 0x31, 0x2e, 0x2e, + 0x34, 0x2f, 0x2f, + 0x2d, 0x2f, 0x38, + 0x00, 0x00, 0xa8, + 0x2e, 0x33, 0x33, + 0x00, 0x00, 0xab, + 0x3a, 0x33, 0x33, + 0x34, 0x34, 0x35, + 0x2f, 0x35, 0x35, + 0x35, 0x36, 0x36, + 0x11, 0x0b, 0x99, + 0x04, 0x03, 0xae, + 0x32, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x01, 0x01, 0xb4, + 0x01, 0x00, 0xb6, + 0x09, 0x09, 0xa2, + 0x0a, 0x0a, 0xa0, + 0x07, 0x04, 0xad, + 0x38, 0x37, 0x37, + 0x33, 0x38, 0x38, + 0x36, 0x38, 0x38, + 0x3c, 0x38, 0x38, + 0x3e, 0x38, 0x38, + 0x04, 0x04, 0xb5, + 0x05, 0x05, 0xb4, + 0x1b, 0x15, 0x8d, + 0x37, 0x3a, 0x3a, + 0x39, 0x3a, 0x3a, + 0x3c, 0x3a, 0x3a, + 0x3d, 0x3a, 0x3a, + 0x37, 0x3b, 0x3b, + 0x3a, 0x3b, 0x3b, + 0x0b, 0x0b, 0xad, + 0x23, 0x24, 0x74, + 0x3c, 0x3c, 0x3c, + 0x14, 0x0b, 0xae, + 0x3c, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, + 0x10, 0x10, 0xad, + 0x3f, 0x40, 0x40, + 0x3e, 0x41, 0x41, + 0x1b, 0x1d, 0x97, + 0x3f, 0x42, 0x42, + 0x3b, 0x44, 0x44, + 0x44, 0x43, 0x43, + 0x22, 0x21, 0x93, + 0x48, 0x44, 0x44, + 0x4d, 0x44, 0x44, + 0x1f, 0x1a, 0xac, + 0x4b, 0x46, 0x46, + 0x43, 0x47, 0x47, + 0x45, 0x47, 0x47, + 0x4a, 0x47, 0x47, + 0x4b, 0x47, 0x47, + 0x47, 0x48, 0x48, + 0x4b, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, + 0x49, 0x50, 0x50, + 0x45, 0x4f, 0x5d, + 0x55, 0x52, 0x52, + 0x4f, 0x53, 0x53, + 0x58, 0x55, 0x55, + 0x51, 0x57, 0x57, + 0x5e, 0x56, 0x56, + 0x4e, 0x56, 0x5c, + 0x58, 0x58, 0x58, + 0x32, 0x32, 0xb1, + 0x61, 0x59, 0x59, + 0x56, 0x5c, 0x5c, + 0x57, 0x5e, 0x5e, + 0x66, 0x5d, 0x5d, + 0x44, 0x3c, 0xac, + 0x5e, 0x5f, 0x5f, + 0x5c, 0x63, 0x63, + 0x63, 0x63, 0x63, + 0x65, 0x64, 0x64, + 0x68, 0x65, 0x65, + 0x66, 0x66, 0x66, + 0x69, 0x66, 0x66, + 0x6a, 0x67, 0x68, + 0x5d, 0x69, 0x69, + 0x67, 0x6a, 0x6a, + 0x6b, 0x6a, 0x6a, + 0x60, 0x6c, 0x6c, + 0x74, 0x6f, 0x6f, + 0x54, 0x54, 0xb6, + 0x71, 0x74, 0x74, + 0x6d, 0x75, 0x75, + 0x72, 0x75, 0x75, + 0x79, 0x77, 0x77, + 0x7b, 0x77, 0x77, + 0x76, 0x7a, 0x7a, + 0x80, 0x7b, 0x7b, + 0x7a, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7c, + 0x7e, 0x7c, 0x7c, + 0x75, 0x75, 0x8f, + 0x7d, 0x7d, 0x7d, + 0x7d, 0x7e, 0x7e, + 0x80, 0x7f, 0x7f, + 0x83, 0x7f, 0x7f, + 0x7d, 0x80, 0x80, + 0x80, 0x83, 0x83, + 0x7f, 0x86, 0x86, + 0x85, 0x87, 0x87, + 0x88, 0x8a, 0x8a, + 0x85, 0x8c, 0x8c, + 0x7b, 0x73, 0xc6, + 0x8b, 0x8f, 0x8f, + 0x8c, 0x90, 0x90, + 0x8e, 0x90, 0x90, + 0x96, 0x90, 0x90, + 0x8f, 0x93, 0x93, + 0x84, 0x7e, 0xc2, + 0x8f, 0x8c, 0xa7, + 0x95, 0x95, 0x95, + 0x93, 0x96, 0x96, + 0x93, 0x97, 0x97, + 0x93, 0x99, 0x99, + 0x88, 0x8b, 0xba, + 0x97, 0x99, 0x99, + 0x9f, 0x9a, 0x9a, + 0x8e, 0x93, 0xb9, + 0xa6, 0xa1, 0xa1, + 0xa7, 0xa3, 0xa4, + 0xa3, 0xa4, 0xa4, + 0xa5, 0xa5, 0xa5, + 0xae, 0xaa, 0xaa, + 0xb2, 0xac, 0xac, + 0xaf, 0xad, 0xad, + 0xb0, 0xae, 0xae, + 0xb6, 0xae, 0xae, + 0xb4, 0xb2, 0xb2, + 0xb7, 0xb6, 0xb6, + 0xb7, 0xb7, 0xb7, + 0xb8, 0xba, 0xba, + 0xb5, 0xbc, 0xbc, + 0xb6, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, + 0xc0, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbe, + 0xc1, 0xc3, 0xc3, + 0xc2, 0xc4, 0xc4, + 0xcd, 0xca, 0xca, + 0xc6, 0xcb, 0xcb, + 0xc2, 0xca, 0xcf, + 0xcb, 0xcb, 0xcb, + 0xca, 0xce, 0xd0, + 0xcb, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd2, + 0xd4, 0xd2, 0xd2, + 0xd1, 0xd1, 0xd6, + 0xd5, 0xd3, 0xd3, + 0xd2, 0xd4, 0xd4, + 0xd0, 0xd5, 0xd5, + 0xce, 0xd6, 0xd6, + 0xd1, 0xd7, 0xd7, + 0xd7, 0xd6, 0xdb, + 0xd7, 0xda, 0xda, + 0xd9, 0xda, 0xda, + 0xde, 0xda, 0xda, + 0xe2, 0xde, 0xe3, + 0xe2, 0xe0, 0xe0, + 0xe0, 0xe1, 0xe1, + 0xe5, 0xe4, 0xe4, + 0xe7, 0xe4, 0xe4, + 0xe5, 0xe7, 0xe7, + 0xea, 0xe7, 0xe7, + 0xea, 0xe8, 0xe8, + 0xeb, 0xea, 0xea, + 0xef, 0xec, 0xec, + 0xee, 0xf1, 0xf1, + 0xf4, 0xf3, 0xf3, + 0xf7, 0xf6, 0xf6, + + 0xf1, 0x07, 0x07, 0x07, 0x02, 0x63, 0x8d, 0x0d, 0x07, 0xc3, 0x07, 0x01, + 0x02, 0x8a, 0xb2, 0x2c, 0x3f, 0x07, 0x83, 0x01, 0x03, 0x85, 0xd1, 0x7c, + 0x0e, 0x37, 0x07, 0x01, 0x00, 0x00, 0x02, 0x71, 0xdf, 0xc4, 0x54, 0x3f, + 0x80, 0x02, 0x1b, 0x96, 0x9a, 0x7a, 0x42, 0x27, 0x0c, 0x0c, 0x00, 0x53, + 0xec, 0x9e, 0x47, 0x04, 0x46, 0x9c, 0x01, 0xc6, 0xe1, 0xd5, 0x06, 0x92, + 0xe5, 0x26, 0x47, 0x80, 0x07, 0x7e, 0xe7, 0x02, 0xc0, 0xa9, 0x09, 0x1a, + 0x30, 0x34, 0x1d, 0x2f, 0x01, 0x5c, 0x9d, 0x04, 0x35, 0x00, 0xe2, 0x18, + 0xdd, 0x79, 0x60, 0x4e, 0x50, 0x58, 0x02, 0x0f, 0x00, 0x00, 0x02, 0x31, + 0x82, 0x11, 0x10, 0x00, 0x6a, 0xbf, 0xe8, 0xea, 0x64, 0x02, 0xcb, 0x61, + 0x00, 0xe0, 0x6f, 0x3b, 0x37, 0x4b, 0x4f, 0x30, 0x00, 0x00, 0x25, 0xa3, + 0xe6, 0xae, 0x00, 0x00, 0x7b, 0xa5, 0x00, 0xa8, 0x84, 0x20, 0x83, 0xd3, + 0x3d, 0x98, 0xad, 0x00, 0xaa, 0x3a, 0x13, 0x19, 0x43, 0x68, 0x45, 0x9d, + 0x00, 0xd4, 0xc2, 0xe4, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, + 0x2a, 0x21, 0x69, 0xc8, 0x95, 0xd6, 0x00, 0x81, 0x32, 0x24, 0x41, 0x5f, + 0xb9, 0xdb, 0xbc, 0x08, 0x5e, 0x0e, 0xc9, 0x72, 0x42, 0x15, 0xd4, 0xeb, + 0x00, 0xe3, 0xd9, 0xd2, 0x94, 0x65, 0x4c, 0x49, 0x48, 0x00, 0x6c, 0x9f, + 0x8e, 0x2d, 0x05, 0x05, 0x00, 0xa4, 0x40, 0x78, 0x42, 0x6b, 0xca, 0x5b, + 0x2e, 0x1e, 0x40, 0x00, 0x57, 0x4b, 0x4d, 0xb0, 0xd0, 0xbb, 0xac, 0xab, + 0x02, 0xb4, 0xc1, 0xc3, 0x1c, 0x75, 0x76, 0x41, 0x05, 0x00, 0xb3, 0x51, + 0x00, 0x03, 0x99, 0xb6, 0x56, 0x62, 0x00, 0x86, 0xdc, 0x8f, 0x7d, 0x93, + 0xa0, 0xa7, 0xcc, 0x08, 0xcd, 0x07, 0x22, 0x67, 0x41, 0x28, 0xa2, 0x07, + 0x00, 0x00, 0x01, 0x3f, 0x73, 0xb1, 0x7f, 0xc7, 0x90, 0x01, 0xda, 0x77, + 0x05, 0x00, 0x00, 0x97, 0xb5, 0x59, 0x90, 0x41, 0x6d, 0x2b, 0xc2, 0x66, + 0x5d, 0x4a, 0xb8, 0x00, 0x00, 0x5a, 0xd1, 0xb7, 0x47, 0x08, 0x80, 0xaf, + 0x90, 0x44, 0x2f, 0x01, 0x04, 0x52, 0xbd, 0x00, 0x00, 0x03, 0x36, 0xde, + 0xd8, 0x23, 0x59, 0x9b, 0x44, 0x14, 0x00, 0x00, 0x00, 0x6e, 0xd7, 0x11, + 0x00, 0x70, 0xcf, 0x0c, 0x39, 0x00, 0x14, 0x89, 0x47, 0x01, 0x0b, 0x44, + 0x02, 0xba, 0xe9, 0x33, 0x16, 0xc5, 0x55, 0x61, 0x0a, 0x80, 0x47, 0x00, + 0x12, 0x74, 0xbe, 0xce, 0xbf, 0xa1, 0x18, 0x29, 0x91, 0x8b, 0x6f, 0x23, + 0x06, 0x88, 0x87, 0x01, 0x3e, 0x17, 0x00, 0x00, 0x1f, 0xa6, 0x10, 0x47, + 0xa7, 0x04, 0x04, 0x03, 0x38, 0x3c, 0x4f, 0x07, 0x77, 0x80, 0x2f, +}; + +//***************************************************************************** +// +// The second image of the spider facing down and left. +// +//***************************************************************************** +const uint8_t g_pui8SpiderDL2Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 236, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x05, 0x03, 0x03, + 0x03, 0x04, 0x04, + 0x05, 0x04, 0x04, + 0x05, 0x05, 0x05, + 0x07, 0x06, 0x06, + 0x06, 0x08, 0x08, + 0x08, 0x08, 0x08, + 0x08, 0x07, 0x0b, + 0x09, 0x09, 0x09, + 0x0a, 0x09, 0x09, + 0x09, 0x0a, 0x0a, + 0x0d, 0x00, 0x1f, + 0x0c, 0x0b, 0x0b, + 0x0e, 0x0b, 0x0b, + 0x0b, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, + 0x0d, 0x0d, 0x0d, + 0x00, 0x00, 0x2e, + 0x0d, 0x0d, 0x16, + 0x0e, 0x10, 0x10, + 0x11, 0x10, 0x10, + 0x0f, 0x0d, 0x17, + 0x0f, 0x11, 0x11, + 0x11, 0x12, 0x12, + 0x15, 0x13, 0x13, + 0x13, 0x14, 0x14, + 0x17, 0x14, 0x14, + 0x04, 0x00, 0x43, + 0x16, 0x15, 0x15, + 0x19, 0x15, 0x15, + 0x12, 0x16, 0x16, + 0x15, 0x18, 0x18, + 0x1b, 0x1a, 0x1a, + 0x1d, 0x1c, 0x1c, + 0x1f, 0x1c, 0x1c, + 0x1b, 0x1d, 0x1d, + 0x1a, 0x1e, 0x1e, + 0x24, 0x1e, 0x1e, + 0x1d, 0x1f, 0x1f, + 0x21, 0x1f, 0x1f, + 0x1c, 0x1e, 0x23, + 0x00, 0x00, 0x6c, + 0x25, 0x20, 0x20, + 0x20, 0x1a, 0x2e, + 0x1e, 0x22, 0x22, + 0x24, 0x22, 0x22, + 0x00, 0x00, 0x81, + 0x1d, 0x29, 0x29, + 0x21, 0x29, 0x29, + 0x06, 0x01, 0x83, + 0x13, 0x00, 0x86, + 0x28, 0x2c, 0x2c, + 0x29, 0x2d, 0x2d, + 0x31, 0x2e, 0x2e, + 0x34, 0x2f, 0x2f, + 0x2c, 0x2f, 0x39, + 0x00, 0x00, 0xa8, + 0x2e, 0x33, 0x33, + 0x00, 0x00, 0xab, + 0x3a, 0x33, 0x33, + 0x2f, 0x35, 0x35, + 0x34, 0x35, 0x35, + 0x35, 0x36, 0x36, + 0x11, 0x0b, 0x99, + 0x04, 0x03, 0xae, + 0x32, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x01, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x09, 0x09, 0xa2, + 0x01, 0x01, 0xb5, + 0x07, 0x04, 0xad, + 0x0b, 0x0a, 0xa0, + 0x38, 0x37, 0x37, + 0x33, 0x38, 0x38, + 0x3c, 0x38, 0x38, + 0x3e, 0x38, 0x38, + 0x04, 0x04, 0xb5, + 0x05, 0x05, 0xb4, + 0x37, 0x3a, 0x3a, + 0x1c, 0x15, 0x8d, + 0x39, 0x3a, 0x3a, + 0x3c, 0x3a, 0x3a, + 0x3e, 0x3a, 0x3a, + 0x36, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, + 0x0b, 0x0b, 0xac, + 0x3c, 0x3c, 0x3c, + 0x22, 0x25, 0x74, + 0x14, 0x0b, 0xaf, + 0x3c, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, + 0x10, 0x10, 0xad, + 0x3e, 0x40, 0x40, + 0x3f, 0x41, 0x41, + 0x1b, 0x1d, 0x97, + 0x3f, 0x42, 0x42, + 0x3b, 0x44, 0x44, + 0x44, 0x43, 0x43, + 0x22, 0x21, 0x93, + 0x48, 0x44, 0x44, + 0x4e, 0x44, 0x44, + 0x1f, 0x1a, 0xac, + 0x4b, 0x46, 0x46, + 0x46, 0x47, 0x47, + 0x4a, 0x47, 0x46, + 0x4b, 0x47, 0x47, + 0x43, 0x48, 0x48, + 0x47, 0x48, 0x48, + 0x4b, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, + 0x49, 0x50, 0x50, + 0x45, 0x4f, 0x5d, + 0x4f, 0x53, 0x53, + 0x55, 0x53, 0x53, + 0x57, 0x55, 0x55, + 0x51, 0x57, 0x57, + 0x5e, 0x56, 0x56, + 0x4e, 0x56, 0x5c, + 0x58, 0x58, 0x58, + 0x32, 0x32, 0xb1, + 0x61, 0x58, 0x58, + 0x56, 0x5b, 0x5b, + 0x57, 0x5e, 0x5e, + 0x66, 0x5d, 0x5d, + 0x5e, 0x5e, 0x5e, + 0x43, 0x3c, 0xac, + 0x5b, 0x63, 0x63, + 0x65, 0x63, 0x63, + 0x63, 0x64, 0x64, + 0x67, 0x64, 0x64, + 0x66, 0x65, 0x65, + 0x69, 0x66, 0x66, + 0x5d, 0x69, 0x69, + 0x6a, 0x68, 0x68, + 0x67, 0x6a, 0x6a, + 0x6b, 0x6a, 0x6a, + 0x60, 0x6c, 0x6c, + 0x74, 0x6e, 0x6e, + 0x54, 0x54, 0xb6, + 0x71, 0x73, 0x74, + 0x6d, 0x75, 0x75, + 0x71, 0x75, 0x75, + 0x7a, 0x77, 0x77, + 0x7b, 0x78, 0x78, + 0x76, 0x7a, 0x7a, + 0x7d, 0x7b, 0x7b, + 0x80, 0x7b, 0x7b, + 0x7a, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7c, + 0x7e, 0x7c, 0x7c, + 0x7d, 0x7d, 0x7d, + 0x75, 0x75, 0x90, + 0x7d, 0x7e, 0x7e, + 0x83, 0x7e, 0x7e, + 0x80, 0x7f, 0x7f, + 0x7d, 0x80, 0x80, + 0x80, 0x83, 0x83, + 0x7f, 0x86, 0x86, + 0x85, 0x87, 0x87, + 0x88, 0x89, 0x89, + 0x85, 0x8c, 0x8c, + 0x7b, 0x73, 0xc6, + 0x8b, 0x8f, 0x8f, + 0x8c, 0x90, 0x90, + 0x8e, 0x90, 0x90, + 0x96, 0x91, 0x91, + 0x8f, 0x93, 0x93, + 0x85, 0x7f, 0xc2, + 0x90, 0x8c, 0xa8, + 0x95, 0x95, 0x95, + 0x93, 0x97, 0x97, + 0x94, 0x97, 0x97, + 0x88, 0x8a, 0xba, + 0x94, 0x99, 0x99, + 0x97, 0x99, 0x99, + 0x9f, 0x9a, 0x9a, + 0x8e, 0x93, 0xb9, + 0xa6, 0xa1, 0xa1, + 0xa3, 0xa3, 0xa3, + 0xa7, 0xa3, 0xa4, + 0xa6, 0xa6, 0xa6, + 0xae, 0xaa, 0xaa, + 0xb2, 0xac, 0xac, + 0xaf, 0xad, 0xad, + 0xb6, 0xad, 0xad, + 0xb0, 0xae, 0xae, + 0xb4, 0xb2, 0xb2, + 0xb7, 0xb7, 0xb7, + 0xb8, 0xba, 0xba, + 0xb5, 0xbc, 0xbc, + 0xb6, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, + 0xc0, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbe, + 0xc1, 0xc3, 0xc3, + 0xc2, 0xc4, 0xc4, + 0xcc, 0xca, 0xca, + 0xc6, 0xcb, 0xcb, + 0xc2, 0xca, 0xcf, + 0xca, 0xcb, 0xcb, + 0xcb, 0xcc, 0xcc, + 0xca, 0xce, 0xd0, + 0xcc, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd2, + 0xd3, 0xd2, 0xd2, + 0xd1, 0xd1, 0xd6, + 0xd5, 0xd3, 0xd3, + 0xd2, 0xd4, 0xd4, + 0xd0, 0xd5, 0xd5, + 0xce, 0xd6, 0xd6, + 0xd1, 0xd7, 0xd7, + 0xd6, 0xd6, 0xdb, + 0xd9, 0xd9, 0xd9, + 0xd7, 0xda, 0xda, + 0xde, 0xda, 0xda, + 0xe3, 0xde, 0xe3, + 0xe2, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe1, + 0xe5, 0xe3, 0xe3, + 0xe7, 0xe3, 0xe3, + 0xe5, 0xe7, 0xe7, + 0xe9, 0xe7, 0xe7, + 0xea, 0xe8, 0xe8, + 0xeb, 0xea, 0xea, + 0xef, 0xec, 0xec, + 0xee, 0xf1, 0xf1, + 0xf4, 0xf3, 0xf3, + 0xf6, 0xf6, 0xf6, + + 0xf0, 0x07, 0x07, 0x07, 0x04, 0x65, 0x75, 0x77, 0x70, 0x18, 0x8b, 0xae, + 0x81, 0x07, 0x06, 0x21, 0x74, 0xa4, 0x0c, 0xc8, 0xe4, 0xe6, 0x2f, 0x47, + 0x06, 0x07, 0x1c, 0x06, 0x00, 0x0e, 0xc1, 0xa2, 0x02, 0x47, 0x01, 0x0a, + 0x00, 0x89, 0x9b, 0xaf, 0xb6, 0xcc, 0xc3, 0x05, 0x5d, 0x30, 0xd4, 0x24, + 0x4f, 0x03, 0x14, 0x57, 0x7f, 0x96, 0x06, 0xcb, 0xc2, 0x05, 0xbb, 0x9d, + 0x4f, 0x05, 0x22, 0x00, 0x08, 0x00, 0xa7, 0xb4, 0x2c, 0xdb, 0x45, 0x30, + 0x60, 0x0f, 0x37, 0x02, 0x38, 0xd8, 0x46, 0x00, 0x9f, 0x01, 0xab, 0x8e, + 0xb9, 0x67, 0x50, 0x58, 0x1d, 0x3f, 0x00, 0x00, 0x00, 0x54, 0xce, 0xdd, + 0xb7, 0x05, 0x92, 0x01, 0xac, 0xa0, 0x5e, 0x42, 0x4a, 0x4f, 0x33, 0x47, + 0x00, 0x10, 0x8a, 0xc4, 0x6f, 0x35, 0xd1, 0x76, 0x7c, 0x01, 0xbc, 0x6b, + 0x40, 0x19, 0x36, 0x4d, 0x1a, 0x46, 0x00, 0x3b, 0xa6, 0x90, 0x16, 0x00, + 0x00, 0x59, 0xda, 0x00, 0x8d, 0xcf, 0x47, 0x23, 0x13, 0x3a, 0x60, 0x09, + 0x10, 0x25, 0x9e, 0x53, 0x2b, 0x37, 0x1e, 0x28, 0x32, 0x00, 0x11, 0x00, + 0x00, 0x8f, 0xdc, 0xb0, 0x48, 0x31, 0x00, 0x39, 0x6e, 0x78, 0xa9, 0xe5, + 0xec, 0xc4, 0x0e, 0x80, 0x3b, 0x00, 0xa1, 0xe9, 0xd7, 0xbd, 0xb8, 0xc6, + 0x00, 0x86, 0x4b, 0x4e, 0x80, 0xaa, 0xe0, 0xde, 0xc0, 0x08, 0x91, 0x4c, + 0xdf, 0x7b, 0x44, 0xbf, 0xba, 0x6d, 0x00, 0x52, 0x49, 0x7e, 0x61, 0x4a, + 0x64, 0xd6, 0xad, 0x00, 0x5f, 0x18, 0x02, 0x06, 0x00, 0x73, 0xd0, 0x2b, + 0x80, 0x3a, 0x17, 0xcd, 0x43, 0x00, 0x00, 0x5c, 0xb1, 0x00, 0x55, 0x56, + 0x93, 0x94, 0x97, 0xca, 0xe2, 0xe7, 0x02, 0xd5, 0x0c, 0x02, 0x84, 0xb2, + 0x0d, 0x39, 0x3d, 0x00, 0xbe, 0x0b, 0x00, 0x00, 0x66, 0x71, 0xb5, 0x3f, + 0x00, 0xd2, 0xc7, 0x3c, 0x02, 0x34, 0x7d, 0xe1, 0x26, 0x09, 0x00, 0x03, + 0x88, 0x8c, 0x41, 0x85, 0x72, 0x19, 0x00, 0x00, 0x3e, 0x98, 0x1e, 0xd9, + 0x68, 0xd3, 0x63, 0x00, 0x04, 0x00, 0xc5, 0x41, 0x00, 0x00, 0x02, 0x62, + 0x04, 0x00, 0x00, 0x05, 0x87, 0x12, 0x42, 0x02, 0x03, 0x00, 0x2d, 0xe3, + 0x20, 0x82, 0xea, 0x9a, 0x00, 0x9c, 0x68, 0x7a, 0x8a, 0x69, 0x06, 0xc5, + 0x5a, 0xeb, 0x29, 0x03, 0x1f, 0xe8, 0x5b, 0x00, 0x44, 0x99, 0x45, 0x0c, + 0x01, 0x07, 0x51, 0xc9, 0xd4, 0x21, 0x83, 0xbf, 0x01, 0x40, 0x95, 0x47, + 0x00, 0x00, 0x01, 0x2a, 0xa3, 0xb3, 0x05, 0x6a, 0x15, 0x00, 0xa8, 0x69, + 0x41, 0x1b, 0x47, 0x02, 0x00, 0x00, 0x2e, 0x6c, 0x27, 0x05, 0x01, 0xa5, + 0x77, 0x12, 0x67, 0x1f, 0x02, 0x79, 0x4f, 0x07, 0x77, 0x80, 0x2f, +}; + +//***************************************************************************** +// +// The first image of the spider facing down and right. +// +//***************************************************************************** +const uint8_t g_pui8SpiderDR1Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 236, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x05, 0x03, 0x03, + 0x03, 0x04, 0x04, + 0x05, 0x04, 0x04, + 0x05, 0x05, 0x05, + 0x07, 0x06, 0x06, + 0x06, 0x08, 0x08, + 0x08, 0x08, 0x08, + 0x08, 0x07, 0x0b, + 0x09, 0x09, 0x09, + 0x0a, 0x09, 0x09, + 0x09, 0x0a, 0x0a, + 0x0d, 0x00, 0x1f, + 0x0c, 0x0b, 0x0b, + 0x0e, 0x0b, 0x0b, + 0x0b, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, + 0x0d, 0x0d, 0x0d, + 0x00, 0x00, 0x2e, + 0x0d, 0x0d, 0x16, + 0x0e, 0x10, 0x10, + 0x11, 0x10, 0x10, + 0x0f, 0x0d, 0x17, + 0x0f, 0x11, 0x11, + 0x11, 0x12, 0x12, + 0x15, 0x13, 0x13, + 0x13, 0x14, 0x14, + 0x17, 0x14, 0x14, + 0x04, 0x00, 0x43, + 0x16, 0x15, 0x15, + 0x19, 0x15, 0x15, + 0x12, 0x16, 0x16, + 0x15, 0x18, 0x18, + 0x1b, 0x1a, 0x1a, + 0x1d, 0x1c, 0x1c, + 0x1f, 0x1c, 0x1c, + 0x1b, 0x1d, 0x1d, + 0x1a, 0x1e, 0x1e, + 0x24, 0x1e, 0x1e, + 0x1d, 0x1f, 0x1f, + 0x21, 0x1f, 0x1f, + 0x1c, 0x1e, 0x23, + 0x00, 0x00, 0x6c, + 0x25, 0x20, 0x20, + 0x20, 0x1a, 0x2e, + 0x1e, 0x22, 0x22, + 0x24, 0x22, 0x22, + 0x00, 0x00, 0x81, + 0x1d, 0x29, 0x29, + 0x21, 0x29, 0x29, + 0x06, 0x01, 0x83, + 0x13, 0x00, 0x86, + 0x28, 0x2c, 0x2c, + 0x29, 0x2d, 0x2d, + 0x31, 0x2e, 0x2e, + 0x34, 0x2f, 0x2f, + 0x2c, 0x2f, 0x39, + 0x00, 0x00, 0xa8, + 0x2e, 0x33, 0x33, + 0x00, 0x00, 0xab, + 0x3a, 0x33, 0x33, + 0x2f, 0x35, 0x35, + 0x34, 0x35, 0x35, + 0x35, 0x36, 0x36, + 0x11, 0x0b, 0x99, + 0x04, 0x03, 0xae, + 0x32, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x01, 0x00, 0xb6, + 0x36, 0x37, 0x37, + 0x09, 0x09, 0xa2, + 0x01, 0x01, 0xb5, + 0x07, 0x04, 0xad, + 0x0b, 0x0a, 0xa0, + 0x38, 0x37, 0x37, + 0x33, 0x38, 0x38, + 0x3c, 0x38, 0x38, + 0x3e, 0x38, 0x38, + 0x04, 0x04, 0xb5, + 0x05, 0x05, 0xb4, + 0x37, 0x3a, 0x3a, + 0x1c, 0x15, 0x8d, + 0x39, 0x3a, 0x3a, + 0x3c, 0x3a, 0x3a, + 0x3e, 0x3a, 0x3a, + 0x36, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, + 0x0b, 0x0b, 0xac, + 0x3c, 0x3c, 0x3c, + 0x22, 0x25, 0x74, + 0x14, 0x0b, 0xaf, + 0x3c, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, + 0x10, 0x10, 0xad, + 0x3e, 0x40, 0x40, + 0x3f, 0x41, 0x41, + 0x1b, 0x1d, 0x97, + 0x3f, 0x42, 0x42, + 0x3b, 0x44, 0x44, + 0x44, 0x43, 0x43, + 0x22, 0x21, 0x93, + 0x48, 0x44, 0x44, + 0x4e, 0x44, 0x44, + 0x1f, 0x1a, 0xac, + 0x4b, 0x46, 0x46, + 0x46, 0x47, 0x47, + 0x4a, 0x47, 0x46, + 0x4b, 0x47, 0x47, + 0x43, 0x48, 0x48, + 0x47, 0x48, 0x48, + 0x4b, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, + 0x49, 0x50, 0x50, + 0x45, 0x4f, 0x5d, + 0x4f, 0x53, 0x53, + 0x55, 0x53, 0x53, + 0x57, 0x55, 0x55, + 0x51, 0x57, 0x57, + 0x5e, 0x56, 0x56, + 0x4e, 0x56, 0x5c, + 0x58, 0x58, 0x58, + 0x32, 0x32, 0xb1, + 0x61, 0x58, 0x58, + 0x56, 0x5b, 0x5b, + 0x57, 0x5e, 0x5e, + 0x66, 0x5d, 0x5d, + 0x5e, 0x5e, 0x5e, + 0x43, 0x3c, 0xac, + 0x5b, 0x63, 0x63, + 0x65, 0x63, 0x63, + 0x63, 0x64, 0x64, + 0x67, 0x64, 0x64, + 0x66, 0x65, 0x65, + 0x69, 0x66, 0x66, + 0x5d, 0x69, 0x69, + 0x6a, 0x68, 0x68, + 0x67, 0x6a, 0x6a, + 0x6b, 0x6a, 0x6a, + 0x60, 0x6c, 0x6c, + 0x74, 0x6e, 0x6e, + 0x54, 0x54, 0xb6, + 0x71, 0x73, 0x74, + 0x6d, 0x75, 0x75, + 0x71, 0x75, 0x75, + 0x7a, 0x77, 0x77, + 0x7b, 0x78, 0x78, + 0x76, 0x7a, 0x7a, + 0x7d, 0x7b, 0x7b, + 0x80, 0x7b, 0x7b, + 0x7a, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7c, + 0x7e, 0x7c, 0x7c, + 0x7d, 0x7d, 0x7d, + 0x75, 0x75, 0x90, + 0x7d, 0x7e, 0x7e, + 0x83, 0x7e, 0x7e, + 0x80, 0x7f, 0x7f, + 0x7d, 0x80, 0x80, + 0x80, 0x83, 0x83, + 0x7f, 0x86, 0x86, + 0x85, 0x87, 0x87, + 0x88, 0x89, 0x89, + 0x85, 0x8c, 0x8c, + 0x7b, 0x73, 0xc6, + 0x8b, 0x8f, 0x8f, + 0x8c, 0x90, 0x90, + 0x8e, 0x90, 0x90, + 0x96, 0x91, 0x91, + 0x8f, 0x93, 0x93, + 0x85, 0x7f, 0xc2, + 0x90, 0x8c, 0xa8, + 0x95, 0x95, 0x95, + 0x93, 0x97, 0x97, + 0x94, 0x97, 0x97, + 0x88, 0x8a, 0xba, + 0x94, 0x99, 0x99, + 0x97, 0x99, 0x99, + 0x9f, 0x9a, 0x9a, + 0x8e, 0x93, 0xb9, + 0xa6, 0xa1, 0xa1, + 0xa3, 0xa3, 0xa3, + 0xa7, 0xa3, 0xa4, + 0xa6, 0xa6, 0xa6, + 0xae, 0xaa, 0xaa, + 0xb2, 0xac, 0xac, + 0xaf, 0xad, 0xad, + 0xb6, 0xad, 0xad, + 0xb0, 0xae, 0xae, + 0xb4, 0xb2, 0xb2, + 0xb7, 0xb7, 0xb7, + 0xb8, 0xba, 0xba, + 0xb5, 0xbc, 0xbc, + 0xb6, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, + 0xc0, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbe, + 0xc1, 0xc3, 0xc3, + 0xc2, 0xc4, 0xc4, + 0xcc, 0xca, 0xca, + 0xc6, 0xcb, 0xcb, + 0xc2, 0xca, 0xcf, + 0xca, 0xcb, 0xcb, + 0xcb, 0xcc, 0xcc, + 0xca, 0xce, 0xd0, + 0xcc, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd2, + 0xd3, 0xd2, 0xd2, + 0xd1, 0xd1, 0xd6, + 0xd5, 0xd3, 0xd3, + 0xd2, 0xd4, 0xd4, + 0xd0, 0xd5, 0xd5, + 0xce, 0xd6, 0xd6, + 0xd1, 0xd7, 0xd7, + 0xd6, 0xd6, 0xdb, + 0xd9, 0xd9, 0xd9, + 0xd7, 0xda, 0xda, + 0xde, 0xda, 0xda, + 0xe3, 0xde, 0xe3, + 0xe2, 0xe0, 0xe0, + 0xe1, 0xe1, 0xe1, + 0xe5, 0xe3, 0xe3, + 0xe7, 0xe3, 0xe3, + 0xe5, 0xe7, 0xe7, + 0xe9, 0xe7, 0xe7, + 0xea, 0xe8, 0xe8, + 0xeb, 0xea, 0xea, + 0xef, 0xec, 0xec, + 0xee, 0xf1, 0xf1, + 0xf4, 0xf3, 0xf3, + 0xf6, 0xf6, 0xf6, + + 0xf0, 0x07, 0x07, 0x07, 0x03, 0x81, 0xae, 0x8b, 0x70, 0x18, 0x77, 0x75, + 0x65, 0x07, 0x06, 0x2f, 0xe6, 0xe4, 0x0c, 0xc8, 0xa4, 0x74, 0x21, 0x47, + 0x06, 0x02, 0xa2, 0x06, 0xc1, 0x0e, 0x00, 0x1c, 0x07, 0x47, 0x07, 0x24, + 0x00, 0xd4, 0x5d, 0x05, 0xc3, 0xcc, 0xb6, 0xaf, 0x9b, 0x30, 0x89, 0x0a, + 0x1f, 0x03, 0x9d, 0xbb, 0x05, 0xc2, 0x06, 0xcb, 0x96, 0x7f, 0x57, 0x14, + 0x4f, 0x02, 0x0f, 0x00, 0x30, 0x45, 0xdb, 0x2c, 0xb4, 0xa7, 0x00, 0x08, + 0x60, 0x22, 0x4f, 0x02, 0x1d, 0x58, 0x50, 0x67, 0xb9, 0x01, 0x8e, 0xab, + 0x9f, 0x00, 0x46, 0xd8, 0x38, 0x3f, 0x80, 0x01, 0x33, 0x4f, 0x4a, 0x42, + 0x5e, 0xa0, 0xac, 0x02, 0x92, 0x05, 0xb7, 0xdd, 0xce, 0x54, 0x3f, 0x00, + 0x00, 0x00, 0x1a, 0x4d, 0x36, 0x19, 0x40, 0x6b, 0xbc, 0x00, 0x7c, 0x76, + 0xd1, 0x35, 0x6f, 0xc4, 0x8a, 0x10, 0x80, 0x34, 0x53, 0x9e, 0x25, 0x09, + 0x60, 0x3a, 0x13, 0x00, 0x23, 0x47, 0xcf, 0x8d, 0xda, 0x59, 0x00, 0x00, + 0x08, 0x16, 0x90, 0xa6, 0x3b, 0x3a, 0x0e, 0xc4, 0xec, 0x00, 0xe5, 0xa9, + 0x78, 0x6e, 0x39, 0x31, 0x48, 0xb0, 0x00, 0xdc, 0x8f, 0x00, 0x00, 0x11, + 0x32, 0x28, 0x1e, 0x40, 0x37, 0x42, 0x7b, 0xdf, 0x4c, 0x91, 0xc0, 0xde, + 0x00, 0xe0, 0xaa, 0x80, 0x4e, 0x4b, 0x86, 0xc6, 0xb8, 0x08, 0xbd, 0xd7, + 0xe9, 0xa1, 0x52, 0x00, 0x2b, 0xd0, 0x00, 0x73, 0x00, 0x06, 0x02, 0x18, + 0x5f, 0xad, 0xd6, 0x00, 0x64, 0x4a, 0x61, 0x7e, 0x49, 0x52, 0x6d, 0xba, + 0x40, 0xbf, 0x42, 0x0d, 0xb2, 0x84, 0x02, 0x0c, 0xd5, 0x00, 0xe7, 0xe2, + 0xca, 0x97, 0x94, 0x93, 0x56, 0x55, 0x01, 0xb1, 0x5c, 0x00, 0x00, 0x43, + 0xcd, 0x17, 0x39, 0x00, 0x8c, 0x88, 0x03, 0x00, 0x26, 0xe1, 0x7d, 0x34, + 0x00, 0x02, 0x3c, 0xc7, 0xd2, 0x3f, 0xb5, 0x71, 0x66, 0x04, 0x00, 0x00, + 0x0b, 0xbe, 0x3d, 0x41, 0x62, 0x02, 0x00, 0x00, 0x00, 0x41, 0xc5, 0x00, + 0x04, 0x63, 0xd3, 0x04, 0x68, 0xd9, 0x1e, 0x98, 0x3e, 0x71, 0x00, 0x72, + 0x60, 0x85, 0xd2, 0x21, 0x7a, 0x9c, 0x00, 0x9a, 0xea, 0x02, 0x82, 0x20, + 0xe3, 0x2d, 0x03, 0x02, 0x42, 0x12, 0x20, 0x87, 0x05, 0x3c, 0x99, 0x44, + 0x00, 0x5b, 0xe8, 0x09, 0x1f, 0x29, 0xeb, 0x5a, 0x8c, 0x00, 0x06, 0xc5, + 0x40, 0x95, 0x09, 0xbf, 0x83, 0x21, 0xd4, 0xc9, 0x51, 0x68, 0x07, 0x35, + 0x04, 0x1b, 0x01, 0x69, 0xa8, 0x00, 0x03, 0x15, 0x6a, 0xb3, 0xa3, 0x2a, + 0x01, 0x37, 0x04, 0x21, 0x12, 0xa5, 0x19, 0x05, 0x27, 0x6c, 0x2e, 0x47, + 0xbe, 0x05, 0x79, 0x7f, 0x37, 0x77, 0x2f, 0x07, +}; + +//***************************************************************************** +// +// The second image of the spider facing down and right. +// +//***************************************************************************** +const uint8_t g_pui8SpiderDR2Image[] = +{ + IMAGE_FMT_8BPP_COMP, + 24, 0, + 24, 0, + + 236, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, + 0x02, 0x01, 0x01, + 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, + 0x02, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x05, 0x03, 0x03, + 0x03, 0x04, 0x04, + 0x05, 0x04, 0x04, + 0x05, 0x05, 0x05, + 0x07, 0x06, 0x06, + 0x06, 0x08, 0x08, + 0x08, 0x08, 0x08, + 0x08, 0x07, 0x0a, + 0x09, 0x09, 0x09, + 0x0a, 0x09, 0x09, + 0x09, 0x0a, 0x0a, + 0x0d, 0x00, 0x1f, + 0x0d, 0x0b, 0x0b, + 0x0e, 0x0b, 0x0b, + 0x0b, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, + 0x0d, 0x0d, 0x0d, + 0x00, 0x00, 0x2e, + 0x0d, 0x0d, 0x16, + 0x0e, 0x10, 0x10, + 0x11, 0x10, 0x10, + 0x0f, 0x0d, 0x17, + 0x0f, 0x11, 0x11, + 0x0f, 0x12, 0x12, + 0x11, 0x12, 0x12, + 0x15, 0x13, 0x13, + 0x13, 0x14, 0x14, + 0x17, 0x14, 0x14, + 0x04, 0x00, 0x43, + 0x16, 0x15, 0x15, + 0x19, 0x15, 0x15, + 0x12, 0x16, 0x16, + 0x15, 0x18, 0x18, + 0x1b, 0x1a, 0x1a, + 0x1d, 0x1c, 0x1c, + 0x1e, 0x1c, 0x1c, + 0x1b, 0x1d, 0x1d, + 0x19, 0x1e, 0x1e, + 0x24, 0x1e, 0x1e, + 0x1d, 0x1f, 0x1f, + 0x1c, 0x1e, 0x23, + 0x22, 0x1f, 0x1f, + 0x00, 0x00, 0x6c, + 0x25, 0x20, 0x20, + 0x20, 0x1a, 0x2e, + 0x1e, 0x22, 0x22, + 0x24, 0x22, 0x22, + 0x00, 0x00, 0x81, + 0x1d, 0x29, 0x29, + 0x21, 0x29, 0x29, + 0x06, 0x01, 0x83, + 0x14, 0x00, 0x85, + 0x28, 0x2c, 0x2c, + 0x29, 0x2d, 0x2d, + 0x31, 0x2e, 0x2e, + 0x34, 0x2f, 0x2f, + 0x2d, 0x2f, 0x38, + 0x00, 0x00, 0xa8, + 0x2e, 0x33, 0x33, + 0x00, 0x00, 0xab, + 0x3a, 0x33, 0x33, + 0x34, 0x34, 0x35, + 0x2f, 0x35, 0x35, + 0x35, 0x36, 0x36, + 0x11, 0x0b, 0x99, + 0x04, 0x03, 0xae, + 0x32, 0x37, 0x37, + 0x00, 0x00, 0xb6, + 0x01, 0x01, 0xb4, + 0x01, 0x00, 0xb6, + 0x09, 0x09, 0xa2, + 0x0a, 0x0a, 0xa0, + 0x07, 0x04, 0xad, + 0x38, 0x37, 0x37, + 0x33, 0x38, 0x38, + 0x36, 0x38, 0x38, + 0x3c, 0x38, 0x38, + 0x3e, 0x38, 0x38, + 0x04, 0x04, 0xb5, + 0x05, 0x05, 0xb4, + 0x1b, 0x15, 0x8d, + 0x37, 0x3a, 0x3a, + 0x39, 0x3a, 0x3a, + 0x3c, 0x3a, 0x3a, + 0x3d, 0x3a, 0x3a, + 0x37, 0x3b, 0x3b, + 0x3a, 0x3b, 0x3b, + 0x0b, 0x0b, 0xad, + 0x23, 0x24, 0x74, + 0x3c, 0x3c, 0x3c, + 0x14, 0x0b, 0xae, + 0x3c, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, + 0x10, 0x10, 0xad, + 0x3f, 0x40, 0x40, + 0x3e, 0x41, 0x41, + 0x1b, 0x1d, 0x97, + 0x3f, 0x42, 0x42, + 0x3b, 0x44, 0x44, + 0x44, 0x43, 0x43, + 0x22, 0x21, 0x93, + 0x48, 0x44, 0x44, + 0x4d, 0x44, 0x44, + 0x1f, 0x1a, 0xac, + 0x4b, 0x46, 0x46, + 0x43, 0x47, 0x47, + 0x45, 0x47, 0x47, + 0x4a, 0x47, 0x47, + 0x4b, 0x47, 0x47, + 0x47, 0x48, 0x48, + 0x4b, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, + 0x49, 0x50, 0x50, + 0x45, 0x4f, 0x5d, + 0x55, 0x52, 0x52, + 0x4f, 0x53, 0x53, + 0x58, 0x55, 0x55, + 0x51, 0x57, 0x57, + 0x5e, 0x56, 0x56, + 0x4e, 0x56, 0x5c, + 0x58, 0x58, 0x58, + 0x32, 0x32, 0xb1, + 0x61, 0x59, 0x59, + 0x56, 0x5c, 0x5c, + 0x57, 0x5e, 0x5e, + 0x66, 0x5d, 0x5d, + 0x44, 0x3c, 0xac, + 0x5e, 0x5f, 0x5f, + 0x5c, 0x63, 0x63, + 0x63, 0x63, 0x63, + 0x65, 0x64, 0x64, + 0x68, 0x65, 0x65, + 0x66, 0x66, 0x66, + 0x69, 0x66, 0x66, + 0x6a, 0x67, 0x68, + 0x5d, 0x69, 0x69, + 0x67, 0x6a, 0x6a, + 0x6b, 0x6a, 0x6a, + 0x60, 0x6c, 0x6c, + 0x74, 0x6f, 0x6f, + 0x54, 0x54, 0xb6, + 0x71, 0x74, 0x74, + 0x6d, 0x75, 0x75, + 0x72, 0x75, 0x75, + 0x79, 0x77, 0x77, + 0x7b, 0x77, 0x77, + 0x76, 0x7a, 0x7a, + 0x80, 0x7b, 0x7b, + 0x7a, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7c, + 0x7e, 0x7c, 0x7c, + 0x75, 0x75, 0x8f, + 0x7d, 0x7d, 0x7d, + 0x7d, 0x7e, 0x7e, + 0x80, 0x7f, 0x7f, + 0x83, 0x7f, 0x7f, + 0x7d, 0x80, 0x80, + 0x80, 0x83, 0x83, + 0x7f, 0x86, 0x86, + 0x85, 0x87, 0x87, + 0x88, 0x8a, 0x8a, + 0x85, 0x8c, 0x8c, + 0x7b, 0x73, 0xc6, + 0x8b, 0x8f, 0x8f, + 0x8c, 0x90, 0x90, + 0x8e, 0x90, 0x90, + 0x96, 0x90, 0x90, + 0x8f, 0x93, 0x93, + 0x84, 0x7e, 0xc2, + 0x8f, 0x8c, 0xa7, + 0x95, 0x95, 0x95, + 0x93, 0x96, 0x96, + 0x93, 0x97, 0x97, + 0x93, 0x99, 0x99, + 0x88, 0x8b, 0xba, + 0x97, 0x99, 0x99, + 0x9f, 0x9a, 0x9a, + 0x8e, 0x93, 0xb9, + 0xa6, 0xa1, 0xa1, + 0xa7, 0xa3, 0xa4, + 0xa3, 0xa4, 0xa4, + 0xa5, 0xa5, 0xa5, + 0xae, 0xaa, 0xaa, + 0xb2, 0xac, 0xac, + 0xaf, 0xad, 0xad, + 0xb0, 0xae, 0xae, + 0xb6, 0xae, 0xae, + 0xb4, 0xb2, 0xb2, + 0xb7, 0xb6, 0xb6, + 0xb7, 0xb7, 0xb7, + 0xb8, 0xba, 0xba, + 0xb5, 0xbc, 0xbc, + 0xb6, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, + 0xc0, 0xbd, 0xbd, + 0xbf, 0xbe, 0xbe, + 0xc1, 0xc3, 0xc3, + 0xc2, 0xc4, 0xc4, + 0xcd, 0xca, 0xca, + 0xc6, 0xcb, 0xcb, + 0xc2, 0xca, 0xcf, + 0xcb, 0xcb, 0xcb, + 0xca, 0xce, 0xd0, + 0xcb, 0xd1, 0xd1, + 0xd2, 0xd2, 0xd2, + 0xd4, 0xd2, 0xd2, + 0xd1, 0xd1, 0xd6, + 0xd5, 0xd3, 0xd3, + 0xd2, 0xd4, 0xd4, + 0xd0, 0xd5, 0xd5, + 0xce, 0xd6, 0xd6, + 0xd1, 0xd7, 0xd7, + 0xd7, 0xd6, 0xdb, + 0xd7, 0xda, 0xda, + 0xd9, 0xda, 0xda, + 0xde, 0xda, 0xda, + 0xe2, 0xde, 0xe3, + 0xe2, 0xe0, 0xe0, + 0xe0, 0xe1, 0xe1, + 0xe5, 0xe4, 0xe4, + 0xe7, 0xe4, 0xe4, + 0xe5, 0xe7, 0xe7, + 0xea, 0xe7, 0xe7, + 0xea, 0xe8, 0xe8, + 0xeb, 0xea, 0xea, + 0xef, 0xec, 0xec, + 0xee, 0xf1, 0xf1, + 0xf4, 0xf3, 0xf3, + 0xf7, 0xf6, 0xf6, + + 0xf0, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x0d, 0x8d, 0x60, 0x63, 0x07, + 0x07, 0x00, 0x00, 0x2c, 0xb2, 0x8a, 0x60, 0x02, 0x47, 0x07, 0x0e, 0x7c, + 0xd1, 0x85, 0x03, 0xc1, 0x4f, 0x07, 0x54, 0xc4, 0xdf, 0x71, 0x02, 0x4f, + 0x80, 0x07, 0x00, 0x9e, 0xec, 0x53, 0x00, 0x0c, 0x27, 0x06, 0x42, 0x7a, + 0x9a, 0x96, 0x1b, 0x17, 0x02, 0x26, 0x00, 0xe5, 0x92, 0x06, 0xd5, 0xe1, + 0xc6, 0x9c, 0x46, 0xc0, 0x57, 0x09, 0x1d, 0x34, 0x1a, 0x09, 0xa9, 0xc0, + 0x10, 0x02, 0xe7, 0x7e, 0x5f, 0x82, 0x31, 0x02, 0x00, 0x00, 0x00, 0x0f, + 0x58, 0x50, 0x4e, 0x60, 0x79, 0xdd, 0x02, 0x18, 0xe2, 0x35, 0x04, 0x9d, + 0x5c, 0x2c, 0xae, 0x00, 0xe6, 0xa3, 0x25, 0x00, 0x30, 0x4f, 0x4b, 0x37, + 0x00, 0x3b, 0x6f, 0xe0, 0x61, 0xcb, 0x02, 0x64, 0xea, 0x08, 0xe8, 0xbf, + 0x6a, 0x10, 0x29, 0x8c, 0xe4, 0xc2, 0x00, 0xd4, 0x9d, 0x45, 0x68, 0x43, + 0x19, 0x13, 0x3a, 0x00, 0xaa, 0xad, 0x98, 0x3d, 0xd3, 0x83, 0x20, 0x84, + 0x00, 0xa8, 0xa5, 0x7b, 0x00, 0x00, 0x72, 0xc9, 0x0e, 0x00, 0x5e, 0xbc, + 0xdb, 0xb9, 0x5f, 0x41, 0x24, 0x32, 0x00, 0x81, 0xd6, 0x95, 0xc8, 0x69, + 0x21, 0x2a, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xa4, 0x00, + 0x00, 0x05, 0x05, 0x2d, 0x8e, 0x9f, 0x6c, 0x48, 0x49, 0x00, 0x4c, 0x65, + 0x94, 0xd2, 0xd9, 0xe3, 0xeb, 0xd4, 0x40, 0x15, 0x3a, 0x76, 0x75, 0x1c, + 0xc3, 0xc1, 0xb4, 0x00, 0xab, 0xac, 0xbb, 0xd0, 0xb0, 0x4d, 0x4b, 0x57, + 0x02, 0x40, 0x1e, 0x2e, 0x5b, 0xca, 0x6b, 0x42, 0x67, 0x00, 0x22, 0x07, + 0xcd, 0xcc, 0xa7, 0xa0, 0x93, 0x7d, 0x00, 0x8f, 0xdc, 0x86, 0x62, 0x56, + 0xb6, 0x99, 0x03, 0x08, 0x00, 0x51, 0xb3, 0x05, 0x3a, 0x00, 0x00, 0xb5, + 0x00, 0x97, 0x00, 0x00, 0x05, 0x77, 0xda, 0x90, 0xc7, 0x00, 0x7f, 0xb1, + 0x73, 0x3f, 0x01, 0x00, 0x07, 0xa2, 0x40, 0x28, 0x44, 0xaf, 0x80, 0x08, + 0x47, 0xb7, 0xd1, 0x02, 0x5a, 0x00, 0xb8, 0x4a, 0x5d, 0x66, 0x72, 0x2b, + 0x40, 0x6d, 0x44, 0x9b, 0x59, 0x23, 0xd8, 0xde, 0x36, 0x09, 0x00, 0x00, + 0xbd, 0x52, 0x84, 0x01, 0x2f, 0x44, 0x00, 0x89, 0x14, 0x00, 0x39, 0xcf, + 0x70, 0x00, 0x11, 0x31, 0xd7, 0x6e, 0x44, 0x14, 0x00, 0x00, 0x0a, 0x09, + 0x00, 0x55, 0xc5, 0x16, 0x33, 0xe9, 0xba, 0x44, 0x0b, 0xc0, 0x37, 0x06, + 0x8b, 0x91, 0x29, 0xa1, 0xbf, 0xce, 0x18, 0xbe, 0x74, 0x12, 0x37, 0x04, + 0x10, 0xa6, 0x1f, 0x01, 0x00, 0x00, 0x17, 0x3e, 0x87, 0x88, 0x06, 0x3f, + 0x97, 0x04, 0x3c, 0x38, 0x03, 0x04, 0x4f, 0x07, 0x77, 0x80, 0x2c, +}; diff --git a/boards/dk-tm4c129x/freertos_demo/images.h b/boards/dk-tm4c129x/freertos_demo/images.h new file mode 100644 index 0000000..cbf213d --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/images.h @@ -0,0 +1,51 @@ +//***************************************************************************** +// +// images.h - Prototypes for the spider images for the LCD. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __IMAGES_H__ +#define __IMAGES_H__ + +//***************************************************************************** +// +// Prototypes for the spider images. +// +//***************************************************************************** +extern const uint8_t g_pui8SpiderBlankImage[]; +extern const uint8_t g_pui8SpiderL1Image[]; +extern const uint8_t g_pui8SpiderL2Image[]; +extern const uint8_t g_pui8SpiderR1Image[]; +extern const uint8_t g_pui8SpiderR2Image[]; +extern const uint8_t g_pui8SpiderU1Image[]; +extern const uint8_t g_pui8SpiderU2Image[]; +extern const uint8_t g_pui8SpiderD1Image[]; +extern const uint8_t g_pui8SpiderD2Image[]; +extern const uint8_t g_pui8SpiderUL1Image[]; +extern const uint8_t g_pui8SpiderUL2Image[]; +extern const uint8_t g_pui8SpiderUR1Image[]; +extern const uint8_t g_pui8SpiderUR2Image[]; +extern const uint8_t g_pui8SpiderDL1Image[]; +extern const uint8_t g_pui8SpiderDL2Image[]; +extern const uint8_t g_pui8SpiderDR1Image[]; +extern const uint8_t g_pui8SpiderDR2Image[]; + +#endif // __IMAGES_H__ diff --git a/boards/dk-tm4c129x/freertos_demo/led_task.c b/boards/dk-tm4c129x/freertos_demo/led_task.c new file mode 100644 index 0000000..6929dd5 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/led_task.c @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// led_task.c - A simple flashing LED task. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "idle_task.h" +#include "led_task.h" +#include "priorities.h" +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" +//***************************************************************************** +// +// The stack size for the LED toggle task. +// +//***************************************************************************** +#define STACKSIZE_LEDTASK 128 + +//***************************************************************************** +// +// The amount of time to delay between toggles of the LED. +// +//***************************************************************************** +uint32_t g_ui32LEDDelay = 500; + +//***************************************************************************** +// +// This task simply toggles the user LED at a 1 Hz rate. +// +//***************************************************************************** +static void +LEDTask(void *pvParameters) +{ + portTickType ui32LastTime; + + // + // Get the current tick count. + // + ui32LastTime = xTaskGetTickCount(); + + // + // Loop forever. + // + while(1) + { + // + // Turn on the user LED. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Wait for the required amount of time. + // + vTaskDelayUntil(&ui32LastTime, g_ui32LEDDelay / portTICK_RATE_MS); + + // + // Turn off the user LED. + // + ROM_GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_7, 0); + + // + // Wait for the required amount of time. + // + vTaskDelayUntil(&ui32LastTime, g_ui32LEDDelay / portTICK_RATE_MS); + } +} + +//***************************************************************************** +// +// Initializes the LED task. +// +//***************************************************************************** +uint32_t +LEDTaskInit(void) +{ + // + // Initialize the GPIO used to drive the user LED. + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTQ_BASE, GPIO_PIN_7); + + // + // Create the LED task. + // + if(xTaskCreate(LEDTask, (signed portCHAR *)"LED", STACKSIZE_LEDTASK, NULL, + tskIDLE_PRIORITY + PRIORITY_LED_TASK, NULL) != pdTRUE) + { + return(1); + } + + // + // Success. + // + return(0); +} diff --git a/boards/dk-tm4c129x/freertos_demo/led_task.h b/boards/dk-tm4c129x/freertos_demo/led_task.h new file mode 100644 index 0000000..116be95 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/led_task.h @@ -0,0 +1,36 @@ +//***************************************************************************** +// +// led_task.h - Prototypes for the LED task. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __LED_TASK_H__ +#define __LED_TASK_H__ + +//***************************************************************************** +// +// Prototypes for the LED task. +// +//***************************************************************************** +extern uint32_t g_ui32LEDDelay; +extern uint32_t LEDTaskInit(void); + +#endif // __LED_TASK_H__ diff --git a/boards/dk-tm4c129x/freertos_demo/lwip_task.c b/boards/dk-tm4c129x/freertos_demo/lwip_task.c new file mode 100644 index 0000000..9787b34 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/lwip_task.c @@ -0,0 +1,378 @@ +//***************************************************************************** +// +// lwip_task.c - Tasks to serve web pages over Ethernet using lwIP. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_types.h" +#include "driverlib/rom.h" +#include "utils/lwiplib.h" +#include "utils/locator.h" +#include "utils/ustdlib.h" +#include "httpserver_raw/httpd.h" +#include "freertos_demo.h" +#include "cgifuncs.h" +#include "led_task.h" +#include "idle_task.h" +#include "lwip_task.h" +#include "spider_task.h" +//***************************************************************************** +// +// This structure contains the details of a SSI tag. +// +//***************************************************************************** +typedef struct +{ + // + // The text name of the tag. If the name is "foo", it will appear in the + // HTML source as "". + // + const char *pcName; + + // + // A pointer to the variable that contains the value of this tag. + // + uint32_t *pui32Value; +} +tSSITag; + +//***************************************************************************** +// +// The list of tags. +// +//***************************************************************************** +const tSSITag g_psTags[] = +{ + { "linksent", (uint32_t *) &lwip_stats.link.xmit }, + { "linkrecv", (uint32_t *) &lwip_stats.link.recv }, + { "linkdrop", (uint32_t *) &lwip_stats.link.drop }, + { "linkcksm", (uint32_t *) &lwip_stats.link.chkerr }, + { "linklen", (uint32_t *) &lwip_stats.link.lenerr }, + { "linkmem", (uint32_t *) &lwip_stats.link.memerr }, + { "linkrte", (uint32_t *) &lwip_stats.link.rterr }, + { "linkprot", (uint32_t *) &lwip_stats.link.proterr }, + { "linkopt", (uint32_t *) &lwip_stats.link.opterr }, + { "linkmisc", (uint32_t *) &lwip_stats.link.err }, + { "arpsent", (uint32_t *) &lwip_stats.etharp.xmit }, + { "arprecv", (uint32_t *) &lwip_stats.etharp.recv }, + { "arpdrop", (uint32_t *) &lwip_stats.etharp.drop }, + { "arpcksm", (uint32_t *) &lwip_stats.etharp.chkerr }, + { "arplen", (uint32_t *) &lwip_stats.etharp.lenerr }, + { "arpmem", (uint32_t *) &lwip_stats.etharp.memerr }, + { "arprte", (uint32_t *) &lwip_stats.etharp.rterr }, + { "arpprot", (uint32_t *) &lwip_stats.etharp.proterr }, + { "arpopt", (uint32_t *) &lwip_stats.etharp.opterr }, + { "arpmisc", (uint32_t *) &lwip_stats.etharp.err }, + { "icmpsent", (uint32_t *) &lwip_stats.icmp.xmit }, + { "icmprecv", (uint32_t *) &lwip_stats.icmp.recv }, + { "icmpdrop", (uint32_t *) &lwip_stats.icmp.drop }, + { "icmpcksm", (uint32_t *) &lwip_stats.icmp.chkerr }, + { "icmplen", (uint32_t *) &lwip_stats.icmp.lenerr }, + { "icmpmem", (uint32_t *) &lwip_stats.icmp.memerr }, + { "icmprte", (uint32_t *) &lwip_stats.icmp.rterr }, + { "icmpprot", (uint32_t *) &lwip_stats.icmp.proterr }, + { "icmpopt", (uint32_t *) &lwip_stats.icmp.opterr }, + { "icmpmisc", (uint32_t *) &lwip_stats.icmp.err }, + { "ipsent", (uint32_t *) &lwip_stats.ip.xmit }, + { "iprecv", (uint32_t *) &lwip_stats.ip.recv }, + { "ipdrop", (uint32_t *) &lwip_stats.ip.drop }, + { "ipcksm", (uint32_t *) &lwip_stats.ip.chkerr }, + { "iplen", (uint32_t *) &lwip_stats.ip.lenerr }, + { "ipmem", (uint32_t *) &lwip_stats.ip.memerr }, + { "iprte", (uint32_t *) &lwip_stats.ip.rterr }, + { "ipprot", (uint32_t *) &lwip_stats.ip.proterr }, + { "ipopt", (uint32_t *) &lwip_stats.ip.opterr }, + { "ipmisc", (uint32_t *) &lwip_stats.ip.err }, + { "tcpsent", (uint32_t *) &lwip_stats.tcp.xmit }, + { "tcprecv", (uint32_t *) &lwip_stats.tcp.recv }, + { "tcpdrop", (uint32_t *) &lwip_stats.tcp.drop }, + { "tcpcksm", (uint32_t *) &lwip_stats.tcp.chkerr }, + { "tcplen", (uint32_t *) &lwip_stats.tcp.lenerr }, + { "tcpmem", (uint32_t *) &lwip_stats.tcp.memerr }, + { "tcprte", (uint32_t *) &lwip_stats.tcp.rterr }, + { "tcpprot", (uint32_t *) &lwip_stats.tcp.proterr }, + { "tcpopt", (uint32_t *) &lwip_stats.tcp.opterr }, + { "tcpmisc", (uint32_t *) &lwip_stats.tcp.err }, + { "udpsent", (uint32_t *) &lwip_stats.udp.xmit }, + { "udprecv", (uint32_t *) &lwip_stats.udp.recv }, + { "udpdrop", (uint32_t *) &lwip_stats.udp.drop }, + { "udpcksm", (uint32_t *) &lwip_stats.udp.chkerr }, + { "udplen", (uint32_t *) &lwip_stats.udp.lenerr }, + { "udpmem", (uint32_t *) &lwip_stats.udp.memerr }, + { "udprte", (uint32_t *) &lwip_stats.udp.rterr }, + { "udpprot", (uint32_t *) &lwip_stats.udp.proterr }, + { "udpopt", (uint32_t *) &lwip_stats.udp.opterr }, + { "udpmisc", (uint32_t *) &lwip_stats.udp.err }, + { "ledrate", (uint32_t *) &g_ui32LEDDelay }, + { "spider", (uint32_t *) g_pui32SpiderDelay } +}; + +//***************************************************************************** +// +// The number of tags. +// +//***************************************************************************** +#define NUM_TAGS (sizeof(g_psTags) / sizeof(g_psTags[0])) + +//***************************************************************************** +// +// An array of names for the tags, as required by the web server. +// +//***************************************************************************** +static const char *g_ppcSSITags[NUM_TAGS]; + +//***************************************************************************** +// +// The CGI handler for changing the toggle rate of the LED task. +// +//***************************************************************************** +static const char * +ToggleRateCGIHandler(int32_t i32Index, int32_t i32NumParams, char *ppcParam[], + char *ppcValue[]) +{ + bool bParamError; + int32_t i32Rate; + + // + // Get the value of the time parameter. + // + bParamError = false; + i32Rate = GetCGIParam("time", ppcParam, ppcValue, i32NumParams, + &bParamError); + + // + // Return a parameter error if the time parameter was not supplied or was + // out of range. + // + if(bParamError || (i32Rate < 1) || (i32Rate > 10000)) + { + return("/perror.htm"); + } + + // + // Update the delay between toggles of the LED. + // + g_ui32LEDDelay = i32Rate; + + // + // Refresh the current page. + // + return("/io.ssi"); +} + +//***************************************************************************** +// +// The CGI handler for changing the spider speed. +// +//***************************************************************************** +static const char * +SpiderSpeedCGIHandler(int32_t i32Index, int32_t i32NumParams, char *ppcParam[], + char *ppcValue[]) +{ + bool bParamError; + int32_t i32Rate; + + // + // Get the value of the time parameter. + // + bParamError = false; + i32Rate = GetCGIParam("time", ppcParam, ppcValue, i32NumParams, + &bParamError); + + // + // Return a parameter error if the time parameter was not supplied or was + // out of range. + // + if(bParamError) + { + return("/perror.htm"); + } + + // + // Update the speed of the spiders. + // + SpiderSpeedSet(i32Rate); + + // + // Refresh the current page. + // + return("/io.ssi"); +} + +//***************************************************************************** +// +// The array of CGI handlers, as required by the web server. +// +//***************************************************************************** +static const tCGI g_psCGIs[] = +{ + { "/toggle_rate.cgi", ToggleRateCGIHandler }, + { "/spider_rate.cgi", SpiderSpeedCGIHandler } +}; + +//***************************************************************************** +// +// The number of CGI handlers. +// +//***************************************************************************** +#define NUM_CGIS (sizeof(g_psCGIs) / sizeof(g_psCGIs[0])) + +//***************************************************************************** +// +// The handler for server side includes. +// +//***************************************************************************** +static uint16_t +SSIHandler(int32_t i32Index, char *pcInsert, int32_t i32InsertLen) +{ + // + // Replace the tag with an appropriate value. + // + if(i32Index < NUM_TAGS) + { + // + // This is a valid tag, so print out its value. + // + usnprintf(pcInsert, i32InsertLen, "%d", + *(g_psTags[i32Index].pui32Value)); + } + else + { + // + // This is an unknown tag. + // + usnprintf(pcInsert, i32InsertLen, "??"); + } + + // + // Determine the length of the replacement text. + // + for(i32Index = 0; pcInsert[i32Index] != 0; i32Index++) + { + } + + // + // Return the length of the replacement text. + // + return(i32Index); +} + +//***************************************************************************** +// +// Sets up the additional lwIP raw API services provided by the application. +// +//***************************************************************************** +void +SetupServices(void *pvArg) +{ + uint8_t pui8MAC[6]; + uint32_t ui32Idx; + + // + // Setup the device locator service. + // + LocatorInit(); + lwIPLocalMACGet(pui8MAC); + LocatorMACAddrSet(pui8MAC); + + LocatorAppTitleSet("DK-TM4C129X freertos_demo"); + + // + // Initialize the sample httpd server. + // + httpd_init(); + + // + // Initialize the tag array used by the web server's SSI processing. + // + for(ui32Idx = 0; ui32Idx < NUM_TAGS; ui32Idx++) + { + g_ppcSSITags[ui32Idx] = g_psTags[ui32Idx].pcName; + } + + // + // Register the SSI tags and handler with the web server. + // + http_set_ssi_handler(SSIHandler, g_ppcSSITags, NUM_TAGS); + + // + // Register the CGI handlers with the web server. + // + http_set_cgi_handlers(g_psCGIs, NUM_CGIS); +} + +//***************************************************************************** +// +// Initializes the lwIP tasks. +// +//***************************************************************************** +uint32_t +lwIPTaskInit(void) +{ + uint32_t ui32User0, ui32User1; + uint8_t pui8MAC[6]; + + // + // Get the MAC address from the user registers. + // + ROM_FlashUserGet(&ui32User0, &ui32User1); + if((ui32User0 == 0xffffffff) || (ui32User1 == 0xffffffff)) + { + return(1); + } + + // + // Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC + // address needed to program the hardware registers, then program the MAC + // address into the Ethernet Controller registers. + // + pui8MAC[0] = ((ui32User0 >> 0) & 0xff); + pui8MAC[1] = ((ui32User0 >> 8) & 0xff); + pui8MAC[2] = ((ui32User0 >> 16) & 0xff); + pui8MAC[3] = ((ui32User1 >> 0) & 0xff); + pui8MAC[4] = ((ui32User1 >> 8) & 0xff); + pui8MAC[5] = ((ui32User1 >> 16) & 0xff); + + // + // Lower the priority of the Ethernet interrupt handler. This is required + // so that the interrupt handler can safely call the interrupt-safe + // FreeRTOS functions (specifically to send messages to the queue). + // + ROM_IntPrioritySet(INT_EMAC0, 0xC0); + + // + // Initialize lwIP. + // + lwIPInit(g_ui32SysClock, pui8MAC, 0, 0, 0, IPADDR_USE_DHCP); + + // + // Setup the remaining services inside the TCP/IP thread's context. + // + tcpip_callback(SetupServices, 0); + + // + // Success. + // + return(0); +} diff --git a/boards/dk-tm4c129x/freertos_demo/lwip_task.h b/boards/dk-tm4c129x/freertos_demo/lwip_task.h new file mode 100644 index 0000000..5625c37 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/lwip_task.h @@ -0,0 +1,35 @@ +//***************************************************************************** +// +// lwip_task.h - Prototypes for the lwIP tasks. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __LWIP_TASK_H__ +#define __LWIP_TASK_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern uint32_t lwIPTaskInit(void); + +#endif // __LWIP_TASK_H__ diff --git a/boards/dk-tm4c129x/freertos_demo/lwipopts.h b/boards/dk-tm4c129x/freertos_demo/lwipopts.h new file mode 100644 index 0000000..919ddf2 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/lwipopts.h @@ -0,0 +1,446 @@ +//***************************************************************************** +// +// lwipopts.h - Configuration file for lwIP +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +// +// NOTE: This file has been derived from the lwIP/src/include/lwip/opt.h +// header file. +// +// For additional details, refer to the original "opt.h" file, and lwIP +// documentation. +// +//***************************************************************************** + +#ifndef __LWIPOPTS_H__ +#define __LWIPOPTS_H__ + +//***************************************************************************** +// +// ---------- Stellaris / lwIP Port Options ---------- +// +//***************************************************************************** +//#define HOST_TMR_INTERVAL 100 // default is 0 +//#define DHCP_EXPIRE_TIMER_MSECS (60 * 1000) +#define LWIP_HTTPD_SSI 1 +#define LWIP_HTTPD_CGI 1 +#define LWIP_HTTPD_DYNAMIC_HEADERS 1 +//#define INCLUDE_HTTPD_DEBUG +#define LWIP_HTTPD_CGI 1 +#define LWIP_HTTPD_SSI 1 +#define EMAC_PHY_CONFIG (EMAC_PHY_TYPE_INTERNAL | EMAC_PHY_INT_MDIX_EN | \ + EMAC_PHY_AN_100B_T_FULL_DUPLEX) +#define PHY_PHYS_ADDR 0 +#define NUM_TX_DESCRIPTORS 24 +#define NUM_RX_DESCRIPTORS 8 + +//***************************************************************************** +// +// ---------- Platform specific locking ---------- +// +//***************************************************************************** +#define SYS_LIGHTWEIGHT_PROT 1 // default is 0 +#define NO_SYS 0 // default is 0 +#if !NO_SYS +#define LWIP_COMPAT_MUTEX 1 +#define RTOS_FREERTOS 1 +#endif /* !NO_SYS */ +//#define MEMCPY(dst,src,len) memcpy(dst,src,len) +//#define SMEMCPY(dst,src,len) memcpy(dst,src,len) + +//***************************************************************************** +// +// ---------- Memory options ---------- +// +//***************************************************************************** +//#define MEM_LIBC_MALLOC 0 +#define MEM_ALIGNMENT 4 // default is 1 +#define MEM_SIZE (64 * 1024) // default is 1600, was 16K +//#define MEMP_OVERFLOW_CHECK 0 +//#define MEMP_SANITY_CHECK 0 +//#define MEM_USE_POOLS 0 +//#define MEMP_USE_CUSTOM_POOLS 0 + +//***************************************************************************** +// +// ---------- Internal Memory Pool Sizes ---------- +// +//***************************************************************************** +#define MEMP_NUM_PBUF 64 // Default 16 +//#define MEMP_NUM_RAW_PCB 4 +//#define MEMP_NUM_UDP_PCB 4 +#define MEMP_NUM_TCP_PCB 40 // Default is 5 +//#define MEMP_NUM_TCP_PCB_LISTEN 8 +#define MEMP_NUM_TCP_SEG 48 // Default is 16 +//#define MEMP_NUM_REASSDATA 5 +//#define MEMP_NUM_ARP_QUEUE 30 +//#define MEMP_NUM_IGMP_GROUP 8 +#define MEMP_NUM_SYS_TIMEOUT 10 +//#define MEMP_NUM_NETBUF 2 +//#define MEMP_NUM_NETCONN 4 +//#define MEMP_NUM_TCPIP_MSG_API 8 +//#define MEMP_NUM_TCPIP_MSG_INPKT 8 +#define PBUF_POOL_SIZE 64 // Default 16 + +//***************************************************************************** +// +// ---------- ARP options ---------- +// +//***************************************************************************** +//#define LWIP_ARP 1 +//#define ARP_TABLE_SIZE 10 +//#define ARP_QUEUEING 1 +//#define ETHARP_TRUST_IP_MAC 1 + +//***************************************************************************** +// +// ---------- IP options ---------- +// +//***************************************************************************** +//#define IP_FORWARD 0 +//#define IP_OPTIONS_ALLOWED 1 +#define IP_REASSEMBLY 0 // default is 1 +#define IP_FRAG 0 // default is 1 +//#define IP_REASS_MAXAGE 3 +//#define IP_REASS_MAX_PBUFS 10 +//#define IP_FRAG_USES_STATIC_BUF 1 +//#define IP_FRAG_MAX_MTU 1500 +//#define IP_DEFAULT_TTL 255 + +//***************************************************************************** +// +// ---------- ICMP options ---------- +// +//***************************************************************************** +//#define LWIP_ICMP 1 +//#define ICMP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- RAW options ---------- +// +//***************************************************************************** +//#define LWIP_RAW 1 +//#define RAW_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- DHCP options ---------- +// +//***************************************************************************** +#define LWIP_DHCP 1 // default is 0 +//#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) + +//***************************************************************************** +// +// ---------- UPNP options ---------- +// +//***************************************************************************** +//#define LWIP_UPNP 0 + +//***************************************************************************** +// +// ---------- PTPD options ---------- +// +//***************************************************************************** +//#define LWIP_PTPD 0 + +//***************************************************************************** +// +// ---------- AUTOIP options ---------- +// +//***************************************************************************** +#define LWIP_AUTOIP 1 // default is 0 +#define LWIP_DHCP_AUTOIP_COOP ((LWIP_DHCP) && (LWIP_AUTOIP)) + // default is 0 +#define LWIP_DHCP_AUTOIP_COOP_TRIES 5 // default is 9 + +//***************************************************************************** +// +// ---------- SNMP options ---------- +// +//***************************************************************************** +//#define LWIP_SNMP 0 +//#define SNMP_CONCURRENT_REQUESTS 1 +//#define SNMP_TRAP_DESTINATIONS 1 +//#define SNMP_PRIVATE_MIB 0 +//#define SNMP_SAFE_REQUESTS 1 + +//***************************************************************************** +// +// ---------- IGMP options ---------- +// +//***************************************************************************** +//#define LWIP_IGMP 0 + +//***************************************************************************** +// +// ---------- DNS options ----------- +// +//***************************************************************************** +//#define LWIP_DNS 0 +//#define DNS_TABLE_SIZE 4 +//#define DNS_MAX_NAME_LENGTH 256 +//#define DNS_MAX_SERVERS 2 +//#define DNS_DOES_NAME_CHECK 1 +//#define DNS_USES_STATIC_BUF 1 +//#define DNS_MSG_SIZE 512 + +//***************************************************************************** +// +// ---------- UDP options ---------- +// +//***************************************************************************** +//#define LWIP_UDP 1 +//#define LWIP_UDPLITE 0 +//#define UDP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- TCP options ---------- +// +//***************************************************************************** +//#define LWIP_TCP 1 +//#define TCP_TTL (IP_DEFAULT_TTL) +#define TCP_WND 4096 // default is 2048 +//#define TCP_MAXRTX 12 +//#define TCP_SYNMAXRTX 6 +//#define TCP_QUEUE_OOSEQ 1 +#define TCP_MSS 1500 // default is 128 +//#define TCP_CALCULATE_EFF_SEND_MSS 1 +#define TCP_SND_BUF (6 * TCP_MSS) + // default is 256 +#define TCP_SND_QUEUELEN (MEMP_NUM_TCP_SEG) + // default is (4 * (TCP_SND_BUF/TCP_MSS)) +//#define TCP_SNDLOWAT (TCP_SND_BUF/2) +//#define TCP_LISTEN_BACKLOG 0 +//#define TCP_DEFAULT_LISTEN_BACKLOG 0xff + +//***************************************************************************** +// +// ---------- API options ---------- +// +//***************************************************************************** +//#define LWIP_EVENT_API 0 +//#define LWIP_CALLBACK_API 1 + +//***************************************************************************** +// +// ---------- Pbuf options ---------- +// +//***************************************************************************** +#define PBUF_LINK_HLEN 16 // default is 14 +#define PBUF_POOL_BUFSIZE 512 + // default is LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) +#define ETH_PAD_SIZE 0 // default is 0 + +//***************************************************************************** +// +// ---------- Network Interfaces options ---------- +// +//***************************************************************************** +//#define LWIP_NETIF_HOSTNAME 0 +//#define LWIP_NETIF_API 0 +//#define LWIP_NETIF_STATUS_CALLBACK 0 +//#define LWIP_NETIF_LINK_CALLBACK 0 +//#define LWIP_NETIF_HWADDRHINT 0 + +//***************************************************************************** +// +// ---------- LOOPIF options ---------- +// +//***************************************************************************** +//#define LWIP_HAVE_LOOPIF 0 +//#define LWIP_LOOPIF_MULTITHREADING 1 + +//***************************************************************************** +// +// ---------- Thread options ---------- +// +//***************************************************************************** +#define TCPIP_THREAD_NAME "tcpip_thread" +#define TCPIP_THREAD_STACKSIZE 1024 +#define TCPIP_THREAD_PRIO 3 +#define TCPIP_MBOX_SIZE 32 +//#define SLIPIF_THREAD_NAME "slipif_loop" +//#define SLIPIF_THREAD_STACKSIZE 0 +//#define SLIPIF_THREAD_PRIO 1 +//#define PPP_THREAD_NAME "pppMain" +//#define PPP_THREAD_STACKSIZE 0 +//#define PPP_THREAD_PRIO 1 +//#define DEFAULT_THREAD_NAME "lwIP" +//#define DEFAULT_THREAD_STACKSIZE 0 +//#define DEFAULT_THREAD_PRIO 1 +//#define DEFAULT_RAW_RECVMBOX_SIZE 0 +//#define DEFAULT_UDP_RECVMBOX_SIZE 0 +//#define DEFAULT_TCP_RECVMBOX_SIZE 0 +//#define DEFAULT_ACCEPTMBOX_SIZE 0 + +//***************************************************************************** +// +// ---------- Sequential layer options ---------- +// +//***************************************************************************** +//#define LWIP_TCPIP_CORE_LOCKING 0 +#define LWIP_NETCONN 0 // default is 1 + +//***************************************************************************** +// +// ---------- Socket Options ---------- +// +//***************************************************************************** +#define LWIP_SOCKET 0 // default is 1 +//#define LWIP_COMPAT_SOCKETS 1 +//#define LWIP_POSIX_SOCKETS_IO_NAMES 1 +//#define LWIP_TCP_KEEPALIVE 0 +//#define LWIP_SO_RCVTIMEO 0 +//#define LWIP_SO_RCVBUF 0 +//#define SO_REUSE 0 + +//***************************************************************************** +// +// ---------- Statistics options ---------- +// +//***************************************************************************** +//#define LWIP_STATS 1 +//#define LWIP_STATS_DISPLAY 0 +//#define LINK_STATS 1 +//#define ETHARP_STATS (LWIP_ARP) +//#define IP_STATS 1 +//#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) +//#define ICMP_STATS 1 +//#define IGMP_STATS (LWIP_IGMP) +//#define UDP_STATS (LWIP_UDP) +//#define TCP_STATS (LWIP_TCP) +//#define MEM_STATS 1 +//#define MEMP_STATS 1 +//#define SYS_STATS 1 +#define LWIP_STATS_LARGE 1 + +//***************************************************************************** +// +// ---------- PPP options ---------- +// +//***************************************************************************** +//#define PPP_SUPPORT 0 +//#define PPPOE_SUPPORT 0 +//#define PPPOS_SUPPORT PPP_SUPPORT + +#if PPP_SUPPORT +//#define NUM_PPP 1 +//#define PAP_SUPPORT 0 +//#define CHAP_SUPPORT 0 +//#define MSCHAP_SUPPORT 0 +//#define CBCP_SUPPORT 0 +//#define CCP_SUPPORT 0 +//#define VJ_SUPPORT 0 +//#define MD5_SUPPORT 0 +//#define FSM_DEFTIMEOUT 6 +//#define FSM_DEFMAXTERMREQS 2 +//#define FSM_DEFMAXCONFREQS 10 +//#define FSM_DEFMAXNAKLOOPS 5 +//#define UPAP_DEFTIMEOUT 6 +//#define UPAP_DEFREQTIME 30 +//#define CHAP_DEFTIMEOUT 6 +//#define CHAP_DEFTRANSMITS 10 +//#define LCP_ECHOINTERVAL 0 +//#define LCP_MAXECHOFAILS 3 +//#define PPP_MAXIDLEFLAG 100 + +//#define PPP_MAXMTU 1500 +//#define PPP_DEFMRU 296 +#endif + +//***************************************************************************** +// +// ---------- checksum options ---------- +// +//***************************************************************************** +#define CHECKSUM_GEN_IP 0 +#define CHECKSUM_GEN_UDP 0 +#define CHECKSUM_GEN_TCP 0 +#define CHECKSUM_CHECK_IP 0 +#define CHECKSUM_CHECK_UDP 0 +#define CHECKSUM_CHECK_TCP 0 + +//***************************************************************************** +// +// ---------- Debugging options ---------- +// +//***************************************************************************** +#if 0 +#define U8_F "c" +#define S8_F "c" +#define X8_F "x" +#define U16_F "u" +#define S16_F "d" +#define X16_F "x" +#define U32_F "u" +#define S32_F "d" +#define X32_F "x" +extern void UARTprintf(const char *pcString, ...); +#define LWIP_DEBUG +#endif + +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SERIOUS +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE + +//#define LWIP_DBG_TYPES_ON LWIP_DBG_ON +#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH) + +//#define ETHARP_DEBUG LWIP_DBG_ON // default is OFF +//#define NETIF_DEBUG LWIP_DBG_ON // default is OFF +//#define PBUF_DEBUG LWIP_DBG_OFF +//#define API_LIB_DEBUG LWIP_DBG_OFF +//#define API_MSG_DEBUG LWIP_DBG_OFF +//#define SOCKETS_DEBUG LWIP_DBG_OFF +//#define ICMP_DEBUG LWIP_DBG_OFF +//#define IGMP_DEBUG LWIP_DBG_OFF +//#define INET_DEBUG LWIP_DBG_OFF +//#define IP_DEBUG LWIP_DBG_ON // default is OFF +//#define IP_REASS_DEBUG LWIP_DBG_OFF +//#define RAW_DEBUG LWIP_DBG_OFF +//#define MEM_DEBUG LWIP_DBG_OFF +//#define MEMP_DEBUG LWIP_DBG_OFF +//#define SYS_DEBUG LWIP_DBG_OFF +//#define TCP_DEBUG LWIP_DBG_OFF +//#define TCP_INPUT_DEBUG LWIP_DBG_OFF +//#define TCP_FR_DEBUG LWIP_DBG_OFF +//#define TCP_RTO_DEBUG LWIP_DBG_OFF +//#define TCP_CWND_DEBUG LWIP_DBG_OFF +//#define TCP_WND_DEBUG LWIP_DBG_OFF +//#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +//#define TCP_RST_DEBUG LWIP_DBG_OFF +//#define TCP_QLEN_DEBUG LWIP_DBG_OFF +//#define UDP_DEBUG LWIP_DBG_ON // default is OFF +//#define TCPIP_DEBUG LWIP_DBG_OFF +//#define PPP_DEBUG LWIP_DBG_OFF +//#define SLIP_DEBUG LWIP_DBG_OFF +//#define DHCP_DEBUG LWIP_DBG_ON // default is OFF +//#define AUTOIP_DEBUG LWIP_DBG_OFF +//#define SNMP_MSG_DEBUG LWIP_DBG_OFF +//#define SNMP_MIB_DEBUG LWIP_DBG_OFF +//#define DNS_DEBUG LWIP_DBG_OFF + +#endif /* __LWIPOPTS_H__ */ diff --git a/boards/dk-tm4c129x/freertos_demo/priorities.h b/boards/dk-tm4c129x/freertos_demo/priorities.h new file mode 100644 index 0000000..b25e0c8 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/priorities.h @@ -0,0 +1,39 @@ +//***************************************************************************** +// +// priorities.h - Priorities for the various FreeRTOS tasks. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __PRIORITIES_H__ +#define __PRIORITIES_H__ + +//***************************************************************************** +// +// The priorities of the various tasks. +// +//***************************************************************************** +#define PRIORITY_LED_TASK 4 +#define PRIORITY_HTTPD_TASK 3 +#define PRIORITY_DISPLAY_TASK 2 +#define PRIORITY_CONTROL_TASK 1 +#define PRIORITY_SPIDER_TASK 0 + +#endif // __PRIORITIES_H__ diff --git a/boards/dk-tm4c129x/freertos_demo/random.c b/boards/dk-tm4c129x/freertos_demo/random.c new file mode 100644 index 0000000..6918a8f --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/random.c @@ -0,0 +1,176 @@ +//***************************************************************************** +// +// random.c - Random number generator utilizing MD4 hash function of +// environmental noise captured as the seed and a linear congruence +// generator for the random numbers. +// +// Copyright (c) 2005-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "random.h" + +//***************************************************************************** +// +// The pool of entropy that has been collected. +// +//***************************************************************************** +static uint32_t g_pui32RandomEntropy[16]; + +//***************************************************************************** +// +// The index of the next byte to be added to the entropy pool. +// +//***************************************************************************** +static uint32_t g_ui32RandomIndex = 0; + +//***************************************************************************** +// +// The random number seed, which corresponds to the most recently returned +// random number. This is set based on the entropy-generated random number +// by RandomSeed(). +// +//***************************************************************************** +static uint32_t g_ui32RandomSeed = 0; + +//***************************************************************************** +// +// Add entropy to the pool. +// +//***************************************************************************** +void +RandomAddEntropy(uint32_t ui32Entropy) +{ + // + // Add this byte to the entropy pool. + // + ((uint8_t *)g_pui32RandomEntropy)[g_ui32RandomIndex] = ui32Entropy & 0xff; + + // + // Increment to the next byte of the entropy pool. + // + g_ui32RandomIndex = (g_ui32RandomIndex + 1) & 63; +} + +//***************************************************************************** +// +// Seed the random number generator by running a MD4 hash on the entropy pool. +// Note that the entropy pool may change from beneath us, but for the purposes +// of generating random numbers that is not a concern. Also, the MD4 hash was +// broken long ago, but since it is being used to generate random numbers +// instead of providing security this is not a concern. +// +//***************************************************************************** +void +RandomSeed(void) +{ + uint32_t ui32A, ui32B, ui32C, ui32D, ui32Temp, ui32Idx; + + // + // Initialize the digest. + // + ui32A = 0x67452301; + ui32B = 0xefcdab89; + ui32C = 0x98badcfe; + ui32D = 0x10325476; + + // + // Perform the first round of operations. + // +#define F(a, b, c, d, k, s) \ + { \ + ui32Temp = a + (d ^ (b & (c ^ d))) + g_pui32RandomEntropy[k]; \ + a = (ui32Temp << s) | (ui32Temp >> (32 - s)); \ + } + for(ui32Idx = 0; ui32Idx < 16; ui32Idx += 4) + { + F(ui32A, ui32B, ui32C, ui32D, ui32Idx + 0, 3); + F(ui32D, ui32A, ui32B, ui32C, ui32Idx + 1, 7); + F(ui32C, ui32D, ui32A, ui32B, ui32Idx + 2, 11); + F(ui32B, ui32C, ui32D, ui32A, ui32Idx + 3, 19); + } + + // + // Perform the second round of operations. + // +#define G(a, b, c, d, k, s) \ + { \ + ui32Temp = a + ((b & c) | (b & d) | (c & d)) + \ + g_pui32RandomEntropy[k] + 0x5a827999; \ + a = (ui32Temp << s) | (ui32Temp >> (32 - s)); \ + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx++) + { + G(ui32A, ui32B, ui32C, ui32D, ui32Idx + 0, 3); + G(ui32D, ui32A, ui32B, ui32C, ui32Idx + 4, 5); + G(ui32C, ui32D, ui32A, ui32B, ui32Idx + 8, 9); + G(ui32B, ui32C, ui32D, ui32A, ui32Idx + 12, 13); + } + + // + // Perform the third round of operations. + // +#define H(a, b, c, d, k, s) \ + { \ + ui32Temp = a + (b ^ c ^ d) + g_pui32RandomEntropy[k] + 0x6ed9eba1; \ + a = (ui32Temp << s) | (ui32Temp >> (32 - s)); \ + } + for(ui32Idx = 0; ui32Idx < 4; ui32Idx += 2) + { + H(ui32A, ui32B, ui32C, ui32D, ui32Idx + 0, 3); + H(ui32D, ui32A, ui32B, ui32C, ui32Idx + 8, 9); + H(ui32C, ui32D, ui32A, ui32B, ui32Idx + 4, 11); + H(ui32B, ui32C, ui32D, ui32A, ui32Idx + 12, 15); + + if(ui32Idx == 2) + { + ui32Idx -= 3; + } + } + + // + // Use the first word of the resulting digest as the random number seed. + // + g_ui32RandomSeed = ui32A + 0x67452301; +} + +//***************************************************************************** +// +// Generate a new random number. The number returned would more accruately be +// described as a pseudo-random number since a linear congruence generator is +// being used. +// +//***************************************************************************** +uint32_t +RandomNumber(void) +{ + // + // Generate a new pseudo-random number with a linear congruence random + // number generator. This new random number becomes the seed for the next + // random number. + // + g_ui32RandomSeed = (g_ui32RandomSeed * 1664525) + 1013904223; + + // + // Return the new random number. + // + return(g_ui32RandomSeed); +} diff --git a/boards/dk-tm4c129x/freertos_demo/random.h b/boards/dk-tm4c129x/freertos_demo/random.h new file mode 100644 index 0000000..2924e7b --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/random.h @@ -0,0 +1,37 @@ +//***************************************************************************** +// +// random.h - Protoytpes for the random number generator. +// +// Copyright (c) 2005-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __RANDOM_H__ +#define __RANDOM_H__ + +//***************************************************************************** +// +// Prototypes for the random number generator functions. +// +//***************************************************************************** +extern void RandomAddEntropy(uint32_t ui32Entropy); +extern void RandomSeed(void); +extern uint32_t RandomNumber(void); + +#endif // __RANDOM_H__ diff --git a/boards/dk-tm4c129x/freertos_demo/readme.txt b/boards/dk-tm4c129x/freertos_demo/readme.txt new file mode 100644 index 0000000..050e4d4 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/readme.txt @@ -0,0 +1,66 @@ +FreeRTOS Example + +This application utilizes FreeRTOS to perform a variety of tasks in a +concurrent fashion. The following tasks are created: + +* An lwIP task, which serves up web pages via the Ethernet interface. This + is actually two tasks, one which runs the lwIP stack and one which + manages the Ethernet interface (sending and receiving raw packets). + +* An LED task, which simply blinks the on-board LED at a user-controllable + rate (changed via the web interface). + +* A set of spider tasks, each of which controls a spider that crawls around + the LCD. The speed at which the spiders move is controllable via the web + interface. Up to thirty-two spider tasks can be run concurrently (an + application-imposed limit). + +* A spider control task, which manages presses on the touch screen and + determines if a spider task should be terminated (if the spider is + ``squished'') or if a new spider task should be created (if no spider is + ``squished''). + +* There is an automatically created idle task, which monitors changes in + the board's IP address and sends those changes to the user via a UART + message. + +Across the bottom of the LCD, several status items are displayed: the +amount of time the application has been running, the number of tasks that +are running, the IP address of the board, the number of Ethernet packets +that have been transmitted, and the number of Ethernet packets that have +been received. + +The finder application (in tools/finder) can also be used to discover the +IP address of the board. The finder application will search the network +for all boards that respond to its requests and display information about +them. + +The web site served by lwIP includes the ability to adjust the toggle rate +of the LED task and the update speed of the spiders (all spiders move at +the same speed). + +For additional details on FreeRTOS, refer to the FreeRTOS web page at: +http://www.freertos.org/ + +For additional details on lwIP, refer to the lwIP web page at: +http://savannah.nongnu.org/projects/lwip/ + +------------------------------------------------------------------------------- + +Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/freertos_demo/rvmdk/freertos_demo.axf b/boards/dk-tm4c129x/freertos_demo/rvmdk/freertos_demo.axf new file mode 100644 index 0000000..2e53549 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/rvmdk/freertos_demo.axf differ diff --git a/boards/dk-tm4c129x/freertos_demo/rvmdk/freertos_demo.bin b/boards/dk-tm4c129x/freertos_demo/rvmdk/freertos_demo.bin new file mode 100644 index 0000000..ae3e724 Binary files /dev/null and b/boards/dk-tm4c129x/freertos_demo/rvmdk/freertos_demo.bin differ diff --git a/boards/dk-tm4c129x/freertos_demo/spider_task.c b/boards/dk-tm4c129x/freertos_demo/spider_task.c new file mode 100644 index 0000000..2f530c0 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/spider_task.c @@ -0,0 +1,855 @@ +//***************************************************************************** +// +// spider_task.c - Tasks to animate a set of spiders on the LCD, one task per +// spider. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_types.h" +#include "driverlib/interrupt.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "drivers/touch.h" +#include "display_task.h" +#include "idle_task.h" +#include "images.h" +#include "priorities.h" +#include "random.h" +#include "freertos_demo.h" +#include "spider_task.h" +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" +//***************************************************************************** +// +// The stack size for the spider control task. +// +//***************************************************************************** +# define STACKSIZE_CONTROLTASK 128 + +//***************************************************************************** +// +// The stack sizes for the spider tasks. +// +//***************************************************************************** +# define STACKSIZE_SPIDERTASK 128 + +//***************************************************************************** +// +// The following define the screen area in which the spiders are allowed to +// roam +// +//***************************************************************************** +#define AREA_X 8 +#define AREA_Y 24 +#define AREA_WIDTH 303 +#define AREA_HEIGHT (231 - 24 - 20) + +//***************************************************************************** +// +// The size of the spider images. +// +//***************************************************************************** +#define SPIDER_WIDTH 24 +#define SPIDER_HEIGHT 24 + +//***************************************************************************** +// +// The following define the extents of the centroid of the spiders. +// +//***************************************************************************** +#define SPIDER_MIN_X (AREA_X + (SPIDER_WIDTH / 2)) +#define SPIDER_MAX_X (AREA_X + AREA_WIDTH - (SPIDER_WIDTH / 2)) +#define SPIDER_MIN_Y (AREA_Y + (SPIDER_HEIGHT / 2)) +#define SPIDER_MAX_Y (AREA_Y + AREA_HEIGHT - (SPIDER_HEIGHT / 2)) + +//***************************************************************************** +// +// The item size, queue size, and memory size for the spider control message +// queue. +// +//***************************************************************************** +#define CONTROL_ITEM_SIZE sizeof(unsigned long) +#define CONTROL_QUEUE_SIZE 10 + +//***************************************************************************** +// +// The queue that holds messages sent to the spider control task. +// +//***************************************************************************** +static xQueueHandle g_pControlQueue; + +//***************************************************************************** +// +// The amount the spider moves horizontally for each direction of movement. +// +// For this and all subsequent arrays that are indexed by direction of +// movement, the indices are as follows: +// +// 0 => right +// 1 => right and down +// 2 => down +// 3 => left and down +// 4 => left +// 5 => left and up +// 6 => up +// 7 => right and up +// +//***************************************************************************** +static const int32_t g_pi32SpiderStepX[8] = +{ + 1, 1, 0, -1, -1, -1, 0, 1 +}; + +//***************************************************************************** +// +// The amount the spider moves vertically for each direction of movement. +// +//***************************************************************************** +static const int32_t g_pi32SpiderStepY[8] = +{ + 0, 1, 1, 1, 0, -1, -1, -1 +}; + +//***************************************************************************** +// +// The animation images for the spider, two per direction of movement. In +// other words, entries 0 and 1 correspond to direction 0 (right), entries 2 +// and 3 correspond to direction 1 (right and down), etc. +// +//***************************************************************************** +static const uint8_t *g_ppui8SpiderImage[16] = +{ + g_pui8SpiderR1Image, + g_pui8SpiderR2Image, + g_pui8SpiderDR1Image, + g_pui8SpiderDR2Image, + g_pui8SpiderD1Image, + g_pui8SpiderD2Image, + g_pui8SpiderDL1Image, + g_pui8SpiderDL2Image, + g_pui8SpiderL1Image, + g_pui8SpiderL2Image, + g_pui8SpiderUL1Image, + g_pui8SpiderUL2Image, + g_pui8SpiderU1Image, + g_pui8SpiderU2Image, + g_pui8SpiderUR1Image, + g_pui8SpiderUR2Image +}; + +//***************************************************************************** +// +// The number of ticks to delay a spider task based on the direction of +// movement. This array has only two entries; the first corresponding to +// horizontal and vertical movement, and the second corresponding to diagonal +// movement. By having the second entry be 1.4 times the first, the spiders +// are updated slower when moving along the diagonal to compensate for the +// fact that each step is further (since it is moving one step in both the +// horizontal and vertical). +// +//***************************************************************************** +uint32_t g_pui32SpiderDelay[2]; + +//***************************************************************************** +// +// The horizontal position of the spiders. +// +//***************************************************************************** +static int32_t g_pi32SpiderX[MAX_SPIDERS]; + +//***************************************************************************** +// +// The vertical position of the spiders. +// +//***************************************************************************** +static int32_t g_pi32SpiderY[MAX_SPIDERS]; + +//***************************************************************************** +// +// A bitmap that indicates which spiders are alive (which corresponds to a +// running task for that spider). +// +//***************************************************************************** +static uint32_t g_ui32SpiderAlive; + +//***************************************************************************** +// +// A bitmap that indicates which spiders have been killed (by touching them). +// +//***************************************************************************** +static uint32_t g_ui32SpiderDead; +xTaskHandle g_sSpiderTask; // FIXME +//***************************************************************************** +// +// Determines if a given point collides with one of the spiders. The spider +// specified is ignored when doing collision detection in order to prevent a +// false collision with itself (when checking to see if it is safe to move the +// spider). +// +//***************************************************************************** +static int32_t +SpiderCollide(int32_t i32Spider, int32_t i32X, int32_t i32Y) +{ + int32_t i32Idx, i32DX, i32DY; + + // + // Loop through all the spiders. + // + for(i32Idx = 0; i32Idx < MAX_SPIDERS; i32Idx++) + { + // + // Skip this spider if it is not alive or is the spider that should be + // ignored. + // + if((HWREGBITW(&g_ui32SpiderAlive, i32Idx) == 0) || + (i32Idx == i32Spider)) + { + continue; + } + + // + // Compute the horizontal and vertical difference between this spider's + // position and the point in question. + // + i32DX = ((g_pi32SpiderX[i32Idx] > i32X) ? + (g_pi32SpiderX[i32Idx] - i32X) : + (i32X - g_pi32SpiderX[i32Idx])); + i32DY = ((g_pi32SpiderY[i32Idx] > i32Y) ? + (g_pi32SpiderY[i32Idx] - i32Y) : + (i32Y - g_pi32SpiderY[i32Idx])); + + // + // Return this spider index if the point in question collides with it. + // + if((i32DX < SPIDER_WIDTH) && (i32DY < SPIDER_HEIGHT)) + { + return(i32Idx); + } + } + + // + // No collision was detected. + // + return(-1); +} + +//***************************************************************************** +// +// This task manages the scurrying about of a spider. +// +//***************************************************************************** +static void +SpiderTask(void *pvParameters) +{ + uint32_t ui32Dir, ui32Image, ui32Temp; + int32_t i32X, i32Y, i32Spider; + + // + // Get the spider number from the parameter. + // + i32Spider = (long)pvParameters; + + // + // Add the current tick count to the random entropy pool. + // + RandomAddEntropy(xTaskGetTickCount()); + + // + // Reseed the random number generator. + // + RandomSeed(); + + // + // Indicate that this spider is alive. + // + HWREGBITW(&g_ui32SpiderAlive, i32Spider) = 1; + + // + // Indicate that this spider is not dead yet. + // + HWREGBITW(&g_ui32SpiderDead, i32Spider) = 0; + + // + // Get a local copy of the spider's starting position. + // + i32X = g_pi32SpiderX[i32Spider]; + i32Y = g_pi32SpiderY[i32Spider]; + + // + // Choose a random starting direction for the spider. + // + ui32Dir = RandomNumber() >> 29; + + // + // Start by displaying the first of the two spider animation images. + // + ui32Image = 0; + + // + // Loop forever. + // + while(1) + { + // + // See if this spider has been killed. + // + if(HWREGBITW(&g_ui32SpiderDead, i32Spider) == 1) + { + // + // Wait for 2 seconds. + // + vTaskDelay((1000 / portTICK_RATE_MS) * 2); + + // + // Clear the spider from the display. + // + DisplayImage(i32X - (SPIDER_WIDTH / 2), i32Y - (SPIDER_HEIGHT / 2), + g_pui8SpiderBlankImage); + + // + // Indicate that this spider is not alive. + // + HWREGBITW(&g_ui32SpiderAlive, i32Spider) = 0; + + // + // Delete the current task. This should never return. + // + vTaskDelete(NULL); + + // + // In case it does return, loop forever. + // + while(1) + { + } + } + + // + // Enter a critical section while the next move for the spider is + // determined. Having more than one spider trying to move at a time + // (via preemption) would make the collision detection check fail. + // + taskENTER_CRITICAL(); + + // + // Move the spider. + // + i32X += g_pi32SpiderStepX[ui32Dir]; + i32Y += g_pi32SpiderStepY[ui32Dir]; + + // + // See if the spider has cross the boundary of its area, if it has + // collided with another spider, or if random chance says that the + // spider should turn despite not having collided with anything. + // + if((i32X < SPIDER_MIN_X) || (i32X > SPIDER_MAX_X) || + (i32Y < SPIDER_MIN_Y) || (i32Y > SPIDER_MAX_Y) || + (SpiderCollide(i32Spider, i32X, i32Y) != -1) || + (RandomNumber() < 0x08000000)) + { + // + // Undo the previous movement of the spider. + // + i32X -= g_pi32SpiderStepX[ui32Dir]; + i32Y -= g_pi32SpiderStepY[ui32Dir]; + + // + // Get a random number to determine the turn to be made. + // + ui32Temp = RandomNumber(); + + // + // Determine how to turn the spider based on the random number. + // Half the time the spider turns to the left and half the time it + // turns to the right. Of each half, it turns a quarter of a turn + // 12.5% of the time and an eighth of a turn 87.5% of the time. + // + if(ui32Temp < 0x10000000) + { + ui32Dir = (ui32Dir + 2) & 7; + } + else if(ui32Temp < 0x80000000) + { + ui32Dir = (ui32Dir + 1) & 7; + } + else if(ui32Temp < 0xf0000000) + { + ui32Dir = (ui32Dir - 1) & 7; + } + else + { + ui32Dir = (ui32Dir - 2) & 7; + } + } + + // + // Update the position of the spider. + // + g_pi32SpiderX[i32Spider] = i32X; + g_pi32SpiderY[i32Spider] = i32Y; + + // + // Exit the critical section now that the spider has been moved. + // + taskEXIT_CRITICAL(); + + // + // Have the display task draw the spider at the new position. Since + // there is a one pixel empty border around all the images, and the + // position of the spider is incremented by only one pixel, this also + // erases any traces of the spider in its previous position. + // + DisplayImage(i32X - (SPIDER_WIDTH / 2), i32Y - (SPIDER_HEIGHT / 2), + g_ppui8SpiderImage[(ui32Dir * 2) + ui32Image]); + + // + // Toggle the spider animation index. + // + ui32Image ^= 1; + + // + // Delay this task for an amount of time based on the direction the + // spider is moving. + // + vTaskDelay(g_pui32SpiderDelay[ui32Dir & 1]); + + // + // Add the new tick count to the random entropy pool. + // + RandomAddEntropy(xTaskGetTickCount()); + + // + // Reseed the random number generator. + // + RandomSeed(); + } +} + +//***************************************************************************** +// +// Creates a spider task. +// +//***************************************************************************** +static uint32_t +CreateSpider(int32_t i32X, int32_t i32Y) +{ + uint32_t ui32Spider; + + // + // Search to see if there is a spider task available. + // + for(ui32Spider = 0; ui32Spider < MAX_SPIDERS; ui32Spider++) + { + if(HWREGBITW(&g_ui32SpiderAlive, ui32Spider) == 0) + { + break; + } + } + + // + // Return a failure if no spider tasks are available (in other words, the + // maximum number of spiders are already alive). + // + if(ui32Spider == MAX_SPIDERS) + { + return(1); + } + + // + // Adjust the starting horizontal position to make sure it is inside the + // allowable area for the spiders. + // + if(i32X < SPIDER_MIN_X) + { + i32X = SPIDER_MIN_X; + } + else if(i32X > SPIDER_MAX_X) + { + i32X = SPIDER_MAX_X; + } + + // + // Adjust the starting vertical position to make sure it is inside the + // allowable area for the spiders. + // + if(i32Y < SPIDER_MIN_Y) + { + i32Y = SPIDER_MIN_Y; + } + else if(i32Y > SPIDER_MAX_Y) + { + i32Y = SPIDER_MAX_Y; + } + + // + // Save the starting position for this spider. + // + g_pi32SpiderX[ui32Spider] = i32X; + g_pi32SpiderY[ui32Spider] = i32Y; + + // + // Create a task to animate this spider. + // + if(xTaskCreate(SpiderTask, (signed portCHAR *)"Spider", + STACKSIZE_SPIDERTASK, (void *)ui32Spider, + tskIDLE_PRIORITY + PRIORITY_SPIDER_TASK, NULL) != pdTRUE) + { + return(1); + } + + // + // Success. + // + return(0); +} + +//***************************************************************************** +// +// The callback function for messages from the touch screen driver. +// +//***************************************************************************** +static int32_t +ControlTouchCallback(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + portBASE_TYPE bTaskWaken; + + // + // Ignore all messages other than pointer down messages. + // + if(ui32Message != WIDGET_MSG_PTR_DOWN) + { + return(0); + } + + // + // Pack the position into a message to send to the spider control task. + // + ui32Message = ((i32X & 65535) << 16) | (i32Y & 65535); + + // + // Send the position message to the spider control task. + // + xQueueSendFromISR(g_pControlQueue, &ui32Message, &bTaskWaken); + + // + // Perform a task yield if necessary. + // +#if defined(__Check_Later) + taskYIELD_FROM_ISR(bTaskWaken); +#endif + + // + // This message has been handled. + // + return(0); +} + +//***************************************************************************** +// +// Determines if a given touch screen point collides with one of the spiders. +// +//***************************************************************************** +static int32_t +SpiderTouchCollide(int32_t i32X, int32_t i32Y) +{ + int32_t i32Idx, i32DX, i32DY, i32Best, i32Dist; + + // + // Until a collision is found, there is no best spider choice. + // + i32Best = -1; + i32Dist = 1000000; + + // + // Loop through all the spiders. + // + for(i32Idx = 0; i32Idx < MAX_SPIDERS; i32Idx++) + { + // + // Skip this spider if it is not alive. + // + if((HWREGBITW(&g_ui32SpiderAlive, i32Idx) == 0) || + (HWREGBITW(&g_ui32SpiderDead, i32Idx) == 1)) + { + continue; + } + + // + // Compute the horizontal and vertical difference between this spider's + // position and the point in question. + // + i32DX = ((g_pi32SpiderX[i32Idx] > i32X) ? + (g_pi32SpiderX[i32Idx] - i32X) : + (i32X - g_pi32SpiderX[i32Idx])); + i32DY = ((g_pi32SpiderY[i32Idx] > i32Y) ? + (g_pi32SpiderY[i32Idx] - i32Y) : + (i32Y - g_pi32SpiderY[i32Idx])); + + // + // See if the point in question collides with this spider. + // + if((i32DX < (SPIDER_WIDTH + 4)) && (i32DY < (SPIDER_HEIGHT + 4))) + { + // + // Compute distance (squared) between this point and the spider. + // + i32DX = (i32DX * i32DX) + (i32DY * i32DY); + + // + // See if this spider is closer to the point in question than any + // other spider encountered. + // + if(i32DX < i32Dist) + { + // + // Save this spider as the new best choice. + // + i32Best = i32Idx; + i32Dist = i32DX; + } + } + } + + // + // Return the best choice, if one was found. + // + if(i32Best != -1) + { + return(i32Best); + } + + // + // Loop through all the spiders. This time, the spiders that are dead but + // not cleared from the screen are not ignored. + // + for(i32Idx = 0; i32Idx < MAX_SPIDERS; i32Idx++) + { + // + // Skip this spider if it is not alive. + // + if(HWREGBITW(&g_ui32SpiderAlive, i32Idx) == 0) + { + continue; + } + + // + // Compute the horizontal and vertical difference between this spider's + // position and the point in question. + // + i32DX = ((g_pi32SpiderX[i32Idx] > i32X) ? + (g_pi32SpiderX[i32Idx] - i32X) : + (i32X - g_pi32SpiderX[i32Idx])); + i32DY = ((g_pi32SpiderY[i32Idx] > i32Y) ? + (g_pi32SpiderY[i32Idx] - i32Y) : + (i32Y - g_pi32SpiderY[i32Idx])); + + // + // See if the point in question collides with this spider. + // + if((i32DX < (SPIDER_WIDTH + 4)) && (i32DY < (SPIDER_HEIGHT + 4))) + { + // + // Compute distance (squared) between this point and the spider. + // + i32DX = (i32DX * i32DX) + (i32DY * i32DY); + + // + // See if this spider is closer to the point in question than any + // other spider encountered. + // + if(i32DX < i32Dist) + { + // + // Save this spider as the new best choice. + // + i32Best = i32Idx; + i32Dist = i32DX; + } + } + } + + // + // Return the best choice, if one was found. + // + return(i32Best); +} + +//***************************************************************************** +// +// This task provides overall control of the spiders, spawning and killing them +// in response to presses on the touch screen. +// +//***************************************************************************** +static void +ControlTask(void *pvParameters) +{ + uint32_t ui32Message; + int32_t i32X, i32Y, i32Spider; + + // + // Initialize the touch screen driver and register a callback function. + // + TouchScreenInit(g_ui32SysClock); + TouchScreenCallbackSet(ControlTouchCallback); + + // + // Lower the priority of the touch screen interrupt handler. This is + // required so that the interrupt handler can safely call the interrupt- + // safe FreeRTOS functions (specifically to send messages to the queue). + // + IntPrioritySet(INT_ADC0SS3, 0xc0); + + // + // Loop forever. + // + while(1) + { + // + // Read the next message from the queue. + // + if(xQueueReceive(g_pControlQueue, &ui32Message, portMAX_DELAY) == + pdPASS) + { + // + // Extract the position of the screen touch from the message. + // + i32X = ui32Message >> 16; + i32Y = ui32Message & 65535; + + // + // Ignore this screen touch if it is not inside the spider area. + // + if((i32X >= AREA_X) && (i32X < (AREA_X + AREA_WIDTH)) && + (i32Y >= AREA_Y) && (i32Y < (AREA_Y + AREA_HEIGHT))) + { + // + // See if this position collides with any of the spiders. + // + i32Spider = SpiderTouchCollide(i32X, i32Y); + if(i32Spider == -1) + { + // + // There is no collision, so create a new spider (if + // possible) at this position. + // + CreateSpider(i32X, i32Y); + } + else + { + // + // There is a collision, so kill this spider. + // + HWREGBITW(&g_ui32SpiderDead, i32Spider) = 1; + } + } + } + } +} + +//***************************************************************************** +// +// Sets the speed of the spiders by specifying the number of milliseconds +// between updates to the spider's position. +// +//***************************************************************************** +void +SpiderSpeedSet(uint32_t ui32Speed) +{ + // + // Convert the update rate from milliseconds to ticks. The second entry + // of the array is 1.4 times the first so that updates when moving along + // the diagonal, which are longer steps, are done less frequently by a + // proportional amount. + // + g_pui32SpiderDelay[0] = (ui32Speed * (1000 / portTICK_RATE_MS)) / 1000; + g_pui32SpiderDelay[1] = (ui32Speed * 14 * (1000 / portTICK_RATE_MS)) / + 10000; +} + +//***************************************************************************** +// +// Initializes the spider tasks. +// +//***************************************************************************** +uint32_t +SpiderTaskInit(void) +{ + uint32_t ui32Idx; + + // + // Set the initial speed of the spiders. + // + SpiderSpeedSet(10); + + // + // Create a queue for sending messages to the spider control task. + // + g_pControlQueue = xQueueCreate(CONTROL_QUEUE_SIZE, CONTROL_QUEUE_SIZE); + if(g_pControlQueue == NULL) + { + return(1); + } + + // + // Create the spider control task. + // + if(xTaskCreate(ControlTask, (signed portCHAR *)"ControlTask", + STACKSIZE_CONTROLTASK, NULL, + tskIDLE_PRIORITY + PRIORITY_CONTROL_TASK, &g_sSpiderTask) != pdTRUE) + {// FIXME + return(1); + } + + // + // Create eight spiders initially. + // + for(ui32Idx = 0; ui32Idx < 8; ui32Idx++) + { + // + // Create a spider that is centered vertically and equally spaced + // horizontally across the display. + // + if(CreateSpider((ui32Idx * (AREA_WIDTH / 8)) + (AREA_WIDTH / 16), + (AREA_HEIGHT / 2) + AREA_Y) == 1) + { + return(1); + } + + // + // Provide an early indication that this spider is alive. The task is + // not running yet (since this function is called before the scheduler + // has been started) so this variable is not set by the task (yet). + // Manually setting it allows the remaining initial spiders to be + // created properly. + // + HWREGBITW(&g_ui32SpiderAlive, ui32Idx) = 1; + } + + // + // Success. + // + return(0); +} diff --git a/boards/dk-tm4c129x/freertos_demo/spider_task.h b/boards/dk-tm4c129x/freertos_demo/spider_task.h new file mode 100644 index 0000000..e39af88 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/spider_task.h @@ -0,0 +1,44 @@ +//***************************************************************************** +// +// spider_task.h - Prototypes for the spider tasks. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __SPIDER_TASK_H__ +#define __SPIDER_TASK_H__ + +//***************************************************************************** +// +// The maximum number of spider tasks. +// +//***************************************************************************** +#define MAX_SPIDERS 32 + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern uint32_t g_pui32SpiderDelay[2]; +extern void SpiderSpeedSet(uint32_t ui32Speed); +extern uint32_t SpiderTaskInit(void); + +#endif // __SPIDER_TASK_H__ diff --git a/boards/dk-tm4c129x/freertos_demo/startup_ccs.c b/boards/dk-tm4c129x/freertos_demo/startup_ccs.c new file mode 100644 index 0000000..0cffa93 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/startup_ccs.c @@ -0,0 +1,279 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void lwIPEthernetIntHandler(void); +extern void xPortPendSVHandler(void); +extern void vPortSVCHandler(void); +extern void xPortSysTickHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/freertos_demo/startup_ewarm.c b/boards/dk-tm4c129x/freertos_demo/startup_ewarm.c new file mode 100644 index 0000000..e62ffaf --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/startup_ewarm.c @@ -0,0 +1,310 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void lwIPEthernetIntHandler(void); +extern void xPortPendSVHandler(void); +extern void vPortSVCHandler(void); +extern void xPortSysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[1024] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/freertos_demo/startup_gcc.c b/boards/dk-tm4c129x/freertos_demo/startup_gcc.c new file mode 100644 index 0000000..2ab65a5 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/startup_gcc.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void lwIPEthernetIntHandler(void); +extern void xPortPendSVHandler(void); +extern void vPortSVCHandler(void); +extern void xPortSysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[1024]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/freertos_demo/startup_rvmdk.S b/boards/dk-tm4c129x/freertos_demo/startup_rvmdk.S new file mode 100644 index 0000000..08ee4a9 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/startup_rvmdk.S @@ -0,0 +1,335 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00001000 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN lwIPEthernetIntHandler + EXTERN xPortPendSVHandler + EXTERN vPortSVCHandler + EXTERN xPortSysTickHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD vPortSVCHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD xPortPendSVHandler ; The PendSV handler + DCD xPortSysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD lwIPEthernetIntHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/gpio_jtag/Makefile b/boards/dk-tm4c129x/gpio_jtag/Makefile new file mode 100644 index 0000000..18828e3 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/Makefile @@ -0,0 +1,90 @@ +#****************************************************************************** +# +# Makefile - Rules for building the gpio_jtag example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the gpio_jtag example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/gpio_jtag.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the gpio_jtag example. +# +${COMPILER}/gpio_jtag.axf: ${COMPILER}/frame.o +${COMPILER}/gpio_jtag.axf: ${COMPILER}/gpio_jtag.o +${COMPILER}/gpio_jtag.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/gpio_jtag.axf: ${COMPILER}/pinout.o +${COMPILER}/gpio_jtag.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/gpio_jtag.axf: ${COMPILER}/touch.o +${COMPILER}/gpio_jtag.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/gpio_jtag.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/gpio_jtag.axf: gpio_jtag.ld +SCATTERgcc_gpio_jtag=gpio_jtag.ld +ENTRY_gpio_jtag=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/gpio_jtag/ccs/.ccsimportspec b/boards/dk-tm4c129x/gpio_jtag/ccs/.ccsimportspec new file mode 100644 index 0000000..005f812 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/gpio_jtag/ccs/.ccsproject b/boards/dk-tm4c129x/gpio_jtag/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/gpio_jtag/ccs/.cproject b/boards/dk-tm4c129x/gpio_jtag/ccs/.cproject new file mode 100644 index 0000000..20d9524 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/gpio_jtag/ccs/.project b/boards/dk-tm4c129x/gpio_jtag/ccs/.project new file mode 100644 index 0000000..cec06ae --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/ccs/.project @@ -0,0 +1,70 @@ + + + gpio_jtag + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + gpio_jtag.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.c + + + gpio_jtag_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/gpio_jtag/gpio_jtag_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/gpio_jtag/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/gpio_jtag/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/gpio_jtag/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/gpio_jtag/ccs/Debug/gpio_jtag.bin b/boards/dk-tm4c129x/gpio_jtag/ccs/Debug/gpio_jtag.bin new file mode 100644 index 0000000..7f66a76 Binary files /dev/null and b/boards/dk-tm4c129x/gpio_jtag/ccs/Debug/gpio_jtag.bin differ diff --git a/boards/dk-tm4c129x/gpio_jtag/ccs/Debug/gpio_jtag.out b/boards/dk-tm4c129x/gpio_jtag/ccs/Debug/gpio_jtag.out new file mode 100644 index 0000000..9727c64 Binary files /dev/null and b/boards/dk-tm4c129x/gpio_jtag/ccs/Debug/gpio_jtag.out differ diff --git a/boards/dk-tm4c129x/gpio_jtag/ccs/macros.ini_initial b/boards/dk-tm4c129x/gpio_jtag/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/gpio_jtag/ccs/target_config.ccxml b/boards/dk-tm4c129x/gpio_jtag/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/gpio_jtag/ewarm/Exe/gpio_jtag.bin b/boards/dk-tm4c129x/gpio_jtag/ewarm/Exe/gpio_jtag.bin new file mode 100644 index 0000000..90a5f5b Binary files /dev/null and b/boards/dk-tm4c129x/gpio_jtag/ewarm/Exe/gpio_jtag.bin differ diff --git a/boards/dk-tm4c129x/gpio_jtag/ewarm/Exe/gpio_jtag.out b/boards/dk-tm4c129x/gpio_jtag/ewarm/Exe/gpio_jtag.out new file mode 100644 index 0000000..7bebf78 Binary files /dev/null and b/boards/dk-tm4c129x/gpio_jtag/ewarm/Exe/gpio_jtag.out differ diff --git a/boards/dk-tm4c129x/gpio_jtag/gcc/gpio_jtag.axf b/boards/dk-tm4c129x/gpio_jtag/gcc/gpio_jtag.axf new file mode 100644 index 0000000..aae409a Binary files /dev/null and b/boards/dk-tm4c129x/gpio_jtag/gcc/gpio_jtag.axf differ diff --git a/boards/dk-tm4c129x/gpio_jtag/gcc/gpio_jtag.bin b/boards/dk-tm4c129x/gpio_jtag/gcc/gpio_jtag.bin new file mode 100644 index 0000000..611d8d8 Binary files /dev/null and b/boards/dk-tm4c129x/gpio_jtag/gcc/gpio_jtag.bin differ diff --git a/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.c b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.c new file mode 100644 index 0000000..7a34355 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.c @@ -0,0 +1,262 @@ +//***************************************************************************** +// +// gpio_jtag.c - Example to demonstrate recovering the JTAG interface. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_gpio.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      GPIO JTAG Recovery (gpio_jtag)

      +//! +//! This example demonstrates changing the JTAG pins into GPIOs, along with a +//! mechanism to revert them to JTAG pins. When first run, the pins remain in +//! JTAG mode. Pressing the touchscreen will toggle the pins between JTAG +//! and GPIO modes. +//! +//! In this example, four pins (PC0, PC1, PC2, and PC3) are switched. +// +//***************************************************************************** + +//***************************************************************************** +// +// The current mode of pins PC0, PC1, PC2, and PC3. When zero, the pins +// are in JTAG mode; when non-zero, the pins are in GPIO mode. +// +//***************************************************************************** +volatile uint32_t g_ui32Mode; + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The touch screen driver calls this function to report all state changes. +// +//***************************************************************************** +static int32_t +GPIOJTAGTestCallback(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + // + // Determine what to do now. The only message we act upon here is PTR_UP + // which indicates that someone has just ended a touch on the screen. + // + if(ui32Message == WIDGET_MSG_PTR_UP) + { + + // + // Toggle the pin mode. + // + g_ui32Mode ^= 1; + + // + // See if the pins should be in JTAG or GPIO mode. + // + if(g_ui32Mode == 0) + { + // + // Change PC0-3 into hardware (i.e. JTAG) pins. First open the + // lock and select the bits we want to modify in the GPIO commit + // register. + // + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x0F; + + // + // Now modify the configuration of the pins that we unlocked. + // + HWREG(GPIO_PORTC_BASE + GPIO_O_AFSEL) |= 0x0F; + + // + // Finally, clear the commit register and the lock to prevent + // the pin configuration from being changed accidentally later. + // Note that the lock is closed whenever we write to the GPIO_O_CR + // register so we need to reopen it here. + // + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x00; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = 0; + } + else + { + // + // Change PC0-3 into GPIO inputs. First open the lock and select + // the bits we want to modify in the GPIO commit register. + // + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x0F; + + // + // Now modifiy the configuration of the pins that we unlocked. + // Note that the DriverLib GPIO functions may need to access + // registers protected by the lock mechanism so these calls should + // be made while the lock is open here. + // + HWREG(GPIO_PORTC_BASE + GPIO_O_AFSEL) &= 0xf0; + ROM_GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, + (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | + GPIO_PIN_3)); + + // + // Finally, clear the commit register and the lock to prevent + // the pin configuration from being changed accidentally later. + // Note that the lock is closed whenever we write to the GPIO_O_CR + // register so we need to reopen it here. + // + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x00; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = 0; + } + } + + return(0); +} + +//***************************************************************************** +// +// Toggle the JTAG pins between JTAG and GPIO mode with touches on the +// touchscreen toggling between the two states. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Mode; + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "gpio-jtag"); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + TouchScreenCallbackSet(GPIOJTAGTestCallback); + + // + // Set the global and local indicator of pin mode to zero, meaning JTAG. + // + g_ui32Mode = 0; + ui32Mode = 0; + + // + // Tell the user what to do. + // + GrStringDrawCentered(&g_sContext, "Tap display to toggle pin mode.", -1, + GrContextDpyWidthGet(&g_sContext) / 2 , + (GrContextDpyHeightGet(&g_sContext) - 24), 0); + + // + // Tell the user what state we are in. + // + GrContextFontSet(&g_sContext, g_psFontCmss22b); + GrStringDrawCentered(&g_sContext, "PC0-3 are", -1, + GrContextDpyWidthGet(&g_sContext) / 2 , + GrContextDpyHeightGet(&g_sContext) / 2, 0); + GrStringDrawCentered(&g_sContext, "JTAG", -1, + GrContextDpyWidthGet(&g_sContext) / 2 , + (GrContextDpyHeightGet(&g_sContext) / 2) + 26, 0); + + // + // Loop forever. This loop simply exists to display the current state of + // PC0-3; the handling of changing the JTAG pins to and from GPIO mode is + // done in GPIO Interrupt Handler. + // + while(1) + { + // + // Wait until the pin mode changes. + // + while(g_ui32Mode == ui32Mode) + { + } + + // + // Save the new mode locally so that a subsequent pin mode change can + // be detected. + // + ui32Mode = g_ui32Mode; + + // + // Indicate the current mode for the PC0-3 pins. + // + GrStringDrawCentered(&g_sContext, ui32Mode ? " GPIO " : " JTAG ", -1, + GrContextDpyWidthGet(&g_sContext) / 2 , + (GrContextDpyHeightGet(&g_sContext) / 2) + 26, 1); + } +} diff --git a/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ewd b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ewp b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ewp new file mode 100644 index 0000000..77874e3 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\gpio_jtag.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + diff --git a/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.icf b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.icf new file mode 100644 index 0000000..181dfdb --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// gpio_jtag.icf - Linker configuration file for gpio_jtag. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ld b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ld new file mode 100644 index 0000000..6c87a6b --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * gpio_jtag.ld - Linker configuration file for gpio_jtag. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.sct b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.sct new file mode 100644 index 0000000..8f0e9da --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; gpio_jtag.sct - Linker configuration file for gpio_jtag. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.uvopt b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.uvopt new file mode 100644 index 0000000..b57e210 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + gpio_jtag + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\gpio_jtag.c + gpio_jtag.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.uvproj b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.uvproj new file mode 100644 index 0000000..b94f837 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + gpio_jtag + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + gpio_jtag + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\gpio_jtag.bin .\rvmdk\gpio_jtag.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + gpio_jtag.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + gpio_jtag.c + 1 + .\gpio_jtag.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/gpio_jtag/gpio_jtag_ccs.cmd b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag_ccs.cmd new file mode 100644 index 0000000..8ddabea --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/gpio_jtag_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * gpio_jtag_ccs.cmd - CCS linker configuration file for gpio_jtag. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c129x/gpio_jtag/readme.txt b/boards/dk-tm4c129x/gpio_jtag/readme.txt new file mode 100644 index 0000000..3331f50 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/readme.txt @@ -0,0 +1,28 @@ +GPIO JTAG Recovery + +This example demonstrates changing the JTAG pins into GPIOs, along with a +mechanism to revert them to JTAG pins. When first run, the pins remain in +JTAG mode. Pressing the touchscreen will toggle the pins between JTAG +and GPIO modes. + +In this example, four pins (PC0, PC1, PC2, and PC3) are switched. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/gpio_jtag/rvmdk/gpio_jtag.axf b/boards/dk-tm4c129x/gpio_jtag/rvmdk/gpio_jtag.axf new file mode 100644 index 0000000..bdb31d5 Binary files /dev/null and b/boards/dk-tm4c129x/gpio_jtag/rvmdk/gpio_jtag.axf differ diff --git a/boards/dk-tm4c129x/gpio_jtag/rvmdk/gpio_jtag.bin b/boards/dk-tm4c129x/gpio_jtag/rvmdk/gpio_jtag.bin new file mode 100644 index 0000000..82d5403 Binary files /dev/null and b/boards/dk-tm4c129x/gpio_jtag/rvmdk/gpio_jtag.bin differ diff --git a/boards/dk-tm4c129x/gpio_jtag/startup_ccs.c b/boards/dk-tm4c129x/gpio_jtag/startup_ccs.c new file mode 100644 index 0000000..5d2884c --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/gpio_jtag/startup_ewarm.c b/boards/dk-tm4c129x/gpio_jtag/startup_ewarm.c new file mode 100644 index 0000000..8aaaa21 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/gpio_jtag/startup_gcc.c b/boards/dk-tm4c129x/gpio_jtag/startup_gcc.c new file mode 100644 index 0000000..48b4d47 --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/gpio_jtag/startup_rvmdk.S b/boards/dk-tm4c129x/gpio_jtag/startup_rvmdk.S new file mode 100644 index 0000000..862384f --- /dev/null +++ b/boards/dk-tm4c129x/gpio_jtag/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/grlib_demo/Makefile b/boards/dk-tm4c129x/grlib_demo/Makefile new file mode 100644 index 0000000..df5423b --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/Makefile @@ -0,0 +1,95 @@ +#****************************************************************************** +# +# Makefile - Rules for building the grlib_demo example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the grlib_demo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/grlib_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the grlib_demo example. +# +${COMPILER}/grlib_demo.axf: ${COMPILER}/frame.o +${COMPILER}/grlib_demo.axf: ${COMPILER}/grlib_demo.o +${COMPILER}/grlib_demo.axf: ${COMPILER}/images.o +${COMPILER}/grlib_demo.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/grlib_demo.axf: ${COMPILER}/pinout.o +${COMPILER}/grlib_demo.axf: ${COMPILER}/sine.o +${COMPILER}/grlib_demo.axf: ${COMPILER}/sound.o +${COMPILER}/grlib_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/grlib_demo.axf: ${COMPILER}/touch.o +${COMPILER}/grlib_demo.axf: ${COMPILER}/ustdlib.o +${COMPILER}/grlib_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/grlib_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/grlib_demo.axf: grlib_demo.ld +SCATTERgcc_grlib_demo=grlib_demo.ld +ENTRY_grlib_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/grlib_demo/ccs/.ccsimportspec b/boards/dk-tm4c129x/grlib_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..542acf7 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_demo/ccs/.ccsproject b/boards/dk-tm4c129x/grlib_demo/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_demo/ccs/.cproject b/boards/dk-tm4c129x/grlib_demo/ccs/.cproject new file mode 100644 index 0000000..1f4f47c --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_demo/ccs/.project b/boards/dk-tm4c129x/grlib_demo/ccs/.project new file mode 100644 index 0000000..9a1511b --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/ccs/.project @@ -0,0 +1,90 @@ + + + grlib_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + grlib_demo.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_demo/grlib_demo.c + + + grlib_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_demo/grlib_demo_ccs.cmd + + + images.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_demo/images.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_demo/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/sound.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/sound.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/sine.c + 1 + SW_ROOT/utils/sine.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/grlib_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/grlib_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/grlib_demo/ccs/Debug/grlib_demo.bin b/boards/dk-tm4c129x/grlib_demo/ccs/Debug/grlib_demo.bin new file mode 100644 index 0000000..197a7c4 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_demo/ccs/Debug/grlib_demo.bin differ diff --git a/boards/dk-tm4c129x/grlib_demo/ccs/Debug/grlib_demo.out b/boards/dk-tm4c129x/grlib_demo/ccs/Debug/grlib_demo.out new file mode 100644 index 0000000..bfd06af Binary files /dev/null and b/boards/dk-tm4c129x/grlib_demo/ccs/Debug/grlib_demo.out differ diff --git a/boards/dk-tm4c129x/grlib_demo/ccs/macros.ini_initial b/boards/dk-tm4c129x/grlib_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/grlib_demo/ccs/target_config.ccxml b/boards/dk-tm4c129x/grlib_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_demo/ewarm/Exe/grlib_demo.bin b/boards/dk-tm4c129x/grlib_demo/ewarm/Exe/grlib_demo.bin new file mode 100644 index 0000000..9862dea Binary files /dev/null and b/boards/dk-tm4c129x/grlib_demo/ewarm/Exe/grlib_demo.bin differ diff --git a/boards/dk-tm4c129x/grlib_demo/ewarm/Exe/grlib_demo.out b/boards/dk-tm4c129x/grlib_demo/ewarm/Exe/grlib_demo.out new file mode 100644 index 0000000..62126b9 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_demo/ewarm/Exe/grlib_demo.out differ diff --git a/boards/dk-tm4c129x/grlib_demo/gcc/grlib_demo.axf b/boards/dk-tm4c129x/grlib_demo/gcc/grlib_demo.axf new file mode 100644 index 0000000..5b941c7 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_demo/gcc/grlib_demo.axf differ diff --git a/boards/dk-tm4c129x/grlib_demo/gcc/grlib_demo.bin b/boards/dk-tm4c129x/grlib_demo/gcc/grlib_demo.bin new file mode 100644 index 0000000..091acc1 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_demo/gcc/grlib_demo.bin differ diff --git a/boards/dk-tm4c129x/grlib_demo/grlib_demo.c b/boards/dk-tm4c129x/grlib_demo/grlib_demo.c new file mode 100644 index 0000000..d2eac50 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/grlib_demo.c @@ -0,0 +1,1324 @@ +//***************************************************************************** +// +// grlib_demo.c - Demonstration of the TivaWare Graphics Library. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/checkbox.h" +#include "grlib/container.h" +#include "grlib/pushbutton.h" +#include "grlib/radiobutton.h" +#include "grlib/slider.h" +#include "utils/ustdlib.h" +#include "utils/sine.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/sound.h" +#include "drivers/touch.h" +#include "images.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Graphics Library Demonstration (grlib_demo)

      +//! +//! This application provides a demonstration of the capabilities of the +//! TivaWare Graphics Library. A series of panels show different features of +//! the library. For each panel, the bottom provides a forward and back button +//! (when appropriate), along with a brief description of the contents of the +//! panel. +//! +//! The first panel provides some introductory text and basic instructions for +//! operation of the application. +//! +//! The second panel shows the available drawing primitives: lines, circles, +//! rectangles, strings, and images. +//! +//! The third panel shows the canvas widget, which provides a general drawing +//! surface within the widget hierarchy. A text, image, and application-drawn +//! canvas are displayed. +//! +//! The fourth panel shows the check box widget, which provides a means of +//! toggling the state of an item. Three check boxes are provided, with each +//! having a red ``LED'' to the right. The state of the LED tracks the state +//! of the check box via an application callback. +//! +//! The fifth panel shows the container widget, which provides a grouping +//! construct typically used for radio buttons. Containers with a title, a +//! centered title, and no title are displayed. +//! +//! The sixth panel shows the push button widget. Two rows of push buttons +//! are provided; the appearance of each row is the same but the top row +//! does not utilize auto-repeat while the bottom row does. Each push button +//! has a red ``LED'' beneath it, which is toggled via an application callback +//! each time the push button is pressed. While holding down any of +//! auto-repeat buttons, the ``LED'' for that button should be toggled as long +//! as the button is being held down. +//! +//! The seventh panel shows the radio button widget. Two groups of radio +//! buttons are displayed, the first using text and the second using images for +//! the selection value. Each radio button has a red ``LED'' to its right, +//! which tracks the selection state of the radio buttons via an application +//! callback. Only one radio button from each group can be selected at a time, +//! though the radio buttons in each group operate independently. +//! +//! The eighth and final panel shows the slider widget. Six sliders +//! constructed using the various supported style options are shown. The +//! slider value callback is used to update two widgets to reflect the values +//! reported by sliders. A canvas widget near the top right of the display +//! tracks the value of the red and green image-based slider to its left and +//! the text of the grey slider on the left side of the panel is update to show +//! its own value. The slider on the right is configured as an indicator +//! which tracks the state of the upper slider and ignores user input. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#ifdef ewarm +#pragma data_alignment=1024 +tDMAControlTable psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(psDMAControlTable, 1024) +tDMAControlTable psDMAControlTable[64]; +#else +tDMAControlTable psDMAControlTable[64] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// The sound effect that is played when a key is pressed. +// +//***************************************************************************** +#define AUDIO_SIZE 2048 +static int16_t g_pi16AudioBuffer[AUDIO_SIZE]; + +//***************************************************************************** +// +// A set of flags that indicate the current state of the application. +// +//***************************************************************************** +static uint32_t g_ui32Flags; +#define FLAG_PING 0 // The "ping" half of the sound + // buffer needs to be filled +#define FLAG_PONG 1 // The "pong" half of the sound + // buffer needs to be filled + +//***************************************************************************** +// +// The screen offset of the upper left hand corner where we start to draw. +// +//***************************************************************************** +#define X_OFFSET 8 +#define Y_OFFSET 24 + +//***************************************************************************** +// +// Forward declarations for the globals required to define the widgets at +// compile-time. +// +//***************************************************************************** +void OnPrevious(tWidget *psWidget); +void OnNext(tWidget *psWidget); +void OnIntroPaint(tWidget *psWidget, tContext *psContext); +void OnPrimitivePaint(tWidget *psWidget, tContext *psContext); +void OnCanvasPaint(tWidget *psWidget, tContext *psContext); +void OnCheckChange(tWidget *psWidget, uint32_t bSelected); +void OnButtonPress(tWidget *psWidget); +void OnRadioChange(tWidget *psWidget, uint32_t bSelected); +void OnSliderChange(tWidget *psWidget, int32_t i32Value); +extern tCanvasWidget g_psPanels[]; +void SoundCallback(uint32_t ui32Half); + +//***************************************************************************** +// +// The first panel, which contains introductory text explaining the +// application. +// +//***************************************************************************** +Canvas(g_sIntroduction, g_psPanels, 0, 0, &g_sKentec320x240x16_SSD2119, + X_OFFSET, Y_OFFSET, (320 - (X_OFFSET*2)), 158, + CANVAS_STYLE_APP_DRAWN, 0, 0, 0, 0, 0, 0, OnIntroPaint); + +//***************************************************************************** +// +// The second panel, which demonstrates the graphics primitives. +// +//***************************************************************************** +Canvas(g_sPrimitives, g_psPanels + 1, 0, 0, &g_sKentec320x240x16_SSD2119, + X_OFFSET, Y_OFFSET, (320 - (X_OFFSET*2)), 158, + CANVAS_STYLE_APP_DRAWN, 0, 0, 0, 0, 0, 0, OnPrimitivePaint); + +//***************************************************************************** +// +// The third panel, which demonstrates the canvas widget. +// +//***************************************************************************** +Canvas(g_sCanvas3, g_psPanels + 2, 0, 0, &g_sKentec320x240x16_SSD2119, 200, + Y_OFFSET, 110, 152, CANVAS_STYLE_OUTLINE | CANVAS_STYLE_APP_DRAWN, 0, + ClrGray, 0, 0, 0, 0, OnCanvasPaint); +Canvas(g_sCanvas2, g_psPanels + 2, &g_sCanvas3, 0, + &g_sKentec320x240x16_SSD2119, X_OFFSET, (76+Y_OFFSET), 190, 76, + CANVAS_STYLE_OUTLINE | CANVAS_STYLE_IMG, 0, ClrGray, 0, 0, 0, + g_ui8Logo, 0); +Canvas(g_sCanvas1, g_psPanels + 2, &g_sCanvas2, 0, + &g_sKentec320x240x16_SSD2119, X_OFFSET, Y_OFFSET, 190, 76, + CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT, + ClrMidnightBlue, ClrGray, ClrSilver, g_psFontCm22, "Text", 0, 0); + +//***************************************************************************** +// +// The fourth panel, which demonstrates the checkbox widget. +// +//***************************************************************************** +tCanvasWidget g_psCheckBoxIndicators[] = +{ + CanvasStruct(g_psPanels + 3, g_psCheckBoxIndicators + 1, 0, + &g_sKentec320x240x16_SSD2119, 230, 30, 50, 42, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psPanels + 3, g_psCheckBoxIndicators + 2, 0, + &g_sKentec320x240x16_SSD2119, 230, 82, 50, 48, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psPanels + 3, 0, 0, + &g_sKentec320x240x16_SSD2119, 230, 134, 50, 42, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0) +}; +tCheckBoxWidget g_psCheckBoxes[] = +{ + CheckBoxStruct(g_psPanels + 3, g_psCheckBoxes + 1, 0, + &g_sKentec320x240x16_SSD2119, 40, 25, 185, 42, + CB_STYLE_OUTLINE | CB_STYLE_FILL | CB_STYLE_TEXT, 16, + ClrMidnightBlue, ClrGray, ClrSilver, g_psFontCm22, + "Select", 0, OnCheckChange), + CheckBoxStruct(g_psPanels + 3, g_psCheckBoxes + 2, 0, + &g_sKentec320x240x16_SSD2119, 40, 78, 185, 48, + CB_STYLE_IMG, 16, 0, ClrGray, 0, 0, 0, g_ui8Logo, + OnCheckChange), + CheckBoxStruct(g_psPanels + 3, g_psCheckBoxIndicators, 0, + &g_sKentec320x240x16_SSD2119, 40, 129, 189, 42, + CB_STYLE_OUTLINE | CB_STYLE_TEXT, 16, + 0, ClrGray, ClrGreen, g_psFontCm20, "Select", + 0, OnCheckChange), +}; +#define NUM_CHECK_BOXES (sizeof(g_psCheckBoxes) / \ + sizeof(g_psCheckBoxes[0])) + +//***************************************************************************** +// +// The fifth panel, which demonstrates the container widget. +// +//***************************************************************************** +Container(g_sContainer3, g_psPanels + 4, 0, 0, &g_sKentec320x240x16_SSD2119, + 205, 47, 105, 118, CTR_STYLE_OUTLINE | CTR_STYLE_FILL, + ClrMidnightBlue, ClrGray, 0, 0, 0); +Container(g_sContainer2, g_psPanels + 4, &g_sContainer3, 0, + &g_sKentec320x240x16_SSD2119, X_OFFSET, 100, 190, 70, + (CTR_STYLE_OUTLINE | CTR_STYLE_FILL | CTR_STYLE_TEXT | + CTR_STYLE_TEXT_CENTER), ClrMidnightBlue, ClrGray, ClrSilver, + g_psFontCm22, "Group2"); +Container(g_sContainer1, g_psPanels + 4, &g_sContainer2, 0, + &g_sKentec320x240x16_SSD2119, X_OFFSET, Y_OFFSET, 190, 70, + CTR_STYLE_OUTLINE | CTR_STYLE_FILL | CTR_STYLE_TEXT, ClrMidnightBlue, + ClrGray, ClrSilver, g_psFontCm22, "Group1"); + +//***************************************************************************** +// +// The sixth panel, which contains a selection of push buttons. +// +//***************************************************************************** +tCanvasWidget g_psPushButtonIndicators[] = +{ + CanvasStruct(g_psPanels + 5, g_psPushButtonIndicators + 1, 0, + &g_sKentec320x240x16_SSD2119, 40, 80, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psPanels + 5, g_psPushButtonIndicators + 2, 0, + &g_sKentec320x240x16_SSD2119, 90, 80, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psPanels + 5, g_psPushButtonIndicators + 3, 0, + &g_sKentec320x240x16_SSD2119, 145, 80, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psPanels + 5, g_psPushButtonIndicators + 4, 0, + &g_sKentec320x240x16_SSD2119, 40, 160, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psPanels + 5, g_psPushButtonIndicators + 5, 0, + &g_sKentec320x240x16_SSD2119, 90, 160, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psPanels + 5, g_psPushButtonIndicators + 6, 0, + &g_sKentec320x240x16_SSD2119, 145, 160, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psPanels + 5, g_psPushButtonIndicators + 7, 0, + &g_sKentec320x240x16_SSD2119, 190, 30, 110, 24, + CANVAS_STYLE_TEXT, 0, 0, ClrSilver, g_psFontCm20, "Non-auto", + 0, 0), + CanvasStruct(g_psPanels + 5, g_psPushButtonIndicators + 8, 0, + &g_sKentec320x240x16_SSD2119, 190, 50, 110, 24, + CANVAS_STYLE_TEXT, 0, 0, ClrSilver, g_psFontCm20, "repeat", + 0, 0), + CanvasStruct(g_psPanels + 5, g_psPushButtonIndicators + 9, 0, + &g_sKentec320x240x16_SSD2119, 190, 110, 110, 24, + CANVAS_STYLE_TEXT, 0, 0, ClrSilver, g_psFontCm20, "Auto", + 0, 0), + CanvasStruct(g_psPanels + 5, 0, 0, + &g_sKentec320x240x16_SSD2119, 190, 130, 110, 24, + CANVAS_STYLE_TEXT, 0, 0, ClrSilver, g_psFontCm20, "repeat", + 0, 0), +}; +tPushButtonWidget g_psPushButtons[] = +{ + RectangularButtonStruct(g_psPanels + 5, g_psPushButtons + 1, 0, + &g_sKentec320x240x16_SSD2119, 30, 30, 40, 40, + PB_STYLE_FILL | PB_STYLE_OUTLINE | PB_STYLE_TEXT, + ClrMidnightBlue, ClrBlack, ClrGray, ClrSilver, + g_psFontCm22, "1", 0, 0, 0, 0, OnButtonPress), + CircularButtonStruct(g_psPanels + 5, g_psPushButtons + 2, 0, + &g_sKentec320x240x16_SSD2119, 100, 50, 20, + PB_STYLE_FILL | PB_STYLE_OUTLINE | PB_STYLE_TEXT, + ClrMidnightBlue, ClrBlack, ClrGray, ClrSilver, + g_psFontCm22, "3", 0, 0, 0, 0, OnButtonPress), + RectangularButtonStruct(g_psPanels + 5, g_psPushButtons + 3, 0, + &g_sKentec320x240x16_SSD2119, 130, 25, 50, 50, + PB_STYLE_IMG | PB_STYLE_TEXT, 0, 0, 0, ClrSilver, + g_psFontCm22, "5", g_pui8Blue50x50, + g_pui8Blue50x50Press, 0, 0, OnButtonPress), + RectangularButtonStruct(g_psPanels + 5, g_psPushButtons + 4, 0, + &g_sKentec320x240x16_SSD2119, 30, 110, 40, 40, + (PB_STYLE_FILL | PB_STYLE_OUTLINE | PB_STYLE_TEXT | + PB_STYLE_AUTO_REPEAT), ClrMidnightBlue, ClrBlack, + ClrGray, ClrSilver, g_psFontCm22, "2", 0, 0, 125, + 25, OnButtonPress), + CircularButtonStruct(g_psPanels + 5, g_psPushButtons + 5, 0, + &g_sKentec320x240x16_SSD2119, 100, 130, 20, + (PB_STYLE_FILL | PB_STYLE_OUTLINE | PB_STYLE_TEXT | + PB_STYLE_AUTO_REPEAT), ClrMidnightBlue, ClrBlack, + ClrGray, ClrSilver, g_psFontCm22, "4", 0, 0, 125, 25, + OnButtonPress), + RectangularButtonStruct(g_psPanels + 5, g_psPushButtonIndicators, 0, + &g_sKentec320x240x16_SSD2119, 130, 105, 50, 50, + (PB_STYLE_IMG | PB_STYLE_TEXT | + PB_STYLE_AUTO_REPEAT), 0, 0, 0, ClrSilver, + g_psFontCm22, "6", g_pui8Blue50x50, + g_pui8Blue50x50Press, 125, 25, OnButtonPress), +}; +#define NUM_PUSH_BUTTONS (sizeof(g_psPushButtons) / \ + sizeof(g_psPushButtons[0])) +uint32_t g_ui32ButtonState; + +//***************************************************************************** +// +// The seventh panel, which contains a selection of radio buttons. +// +//***************************************************************************** +tContainerWidget g_psRadioContainers[]; +tCanvasWidget g_psRadioButtonIndicators[] = +{ + CanvasStruct(g_psRadioContainers, g_psRadioButtonIndicators + 1, 0, + &g_sKentec320x240x16_SSD2119, 95, 52, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psRadioContainers, g_psRadioButtonIndicators + 2, 0, + &g_sKentec320x240x16_SSD2119, 95, 97, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psRadioContainers, 0, 0, + &g_sKentec320x240x16_SSD2119, 95, 142, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psRadioContainers + 1, g_psRadioButtonIndicators + 4, 0, + &g_sKentec320x240x16_SSD2119, 260, 52, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psRadioContainers + 1, g_psRadioButtonIndicators + 5, 0, + &g_sKentec320x240x16_SSD2119, 260, 97, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), + CanvasStruct(g_psRadioContainers + 1, 0, 0, + &g_sKentec320x240x16_SSD2119, 260, 142, 20, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0), +}; +tRadioButtonWidget g_psRadioButtons1[] = +{ + RadioButtonStruct(g_psRadioContainers, g_psRadioButtons1 + 1, 0, + &g_sKentec320x240x16_SSD2119, 10, 40, 80, 45, + RB_STYLE_TEXT, 16, 0, ClrSilver, ClrSilver, g_psFontCm20, + "One", 0, OnRadioChange), + RadioButtonStruct(g_psRadioContainers, g_psRadioButtons1 + 2, 0, + &g_sKentec320x240x16_SSD2119, 10, 85, 80, 45, + RB_STYLE_TEXT, 16, 0, ClrSilver, ClrSilver, g_psFontCm20, + "Two", 0, OnRadioChange), + RadioButtonStruct(g_psRadioContainers, g_psRadioButtonIndicators, 0, + &g_sKentec320x240x16_SSD2119, 10, 130, 80, 45, + RB_STYLE_TEXT, 24, 0, ClrSilver, ClrSilver, g_psFontCm20, + "Three", 0, OnRadioChange) +}; +#define NUM_RADIO1_BUTTONS (sizeof(g_psRadioButtons1) / \ + sizeof(g_psRadioButtons1[0])) +tRadioButtonWidget g_psRadioButtons2[] = +{ + RadioButtonStruct(g_psRadioContainers + 1, g_psRadioButtons2 + 1, 0, + &g_sKentec320x240x16_SSD2119, 175, 40, 80, 45, + RB_STYLE_IMG, 16, 0, ClrSilver, 0, 0, 0, g_ui8Logo, + OnRadioChange), + RadioButtonStruct(g_psRadioContainers + 1, g_psRadioButtons2 + 2, 0, + &g_sKentec320x240x16_SSD2119, 175, 85, 80, 45, + RB_STYLE_IMG, 24, 0, ClrSilver, 0, 0, 0, g_ui8Logo, + OnRadioChange), + RadioButtonStruct(g_psRadioContainers + 1, g_psRadioButtonIndicators + 3, + 0, &g_sKentec320x240x16_SSD2119, 175, 130, 80, 45, + RB_STYLE_IMG, 24, 0, ClrSilver, 0, 0, 0, g_ui8Logo, + OnRadioChange) +}; +#define NUM_RADIO2_BUTTONS (sizeof(g_psRadioButtons2) / \ + sizeof(g_psRadioButtons2[0])) +tContainerWidget g_psRadioContainers[] = +{ + ContainerStruct(g_psPanels + 6, g_psRadioContainers + 1, g_psRadioButtons1, + &g_sKentec320x240x16_SSD2119, 8, 24, 145, 154, + CTR_STYLE_OUTLINE | CTR_STYLE_TEXT, 0, ClrGray, ClrSilver, + g_psFontCm20, "Group One"), + ContainerStruct(g_psPanels + 6, 0, g_psRadioButtons2, + &g_sKentec320x240x16_SSD2119, 167, 24, 145, 154, + CTR_STYLE_OUTLINE | CTR_STYLE_TEXT, 0, ClrGray, ClrSilver, + g_psFontCm20, "Group Two") +}; + +//***************************************************************************** +// +// The eighth panel, which demonstrates the slider widget. +// +//***************************************************************************** +Canvas(g_sSliderValueCanvas, g_psPanels + 7, 0, 0, + &g_sKentec320x240x16_SSD2119, 210, 30, 60, 40, + CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE, ClrBlack, 0, ClrSilver, + g_psFontCm24, "50%", + 0, 0); + +tSliderWidget g_psSliders[] = +{ + SliderStruct(g_psPanels + 7, g_psSliders + 1, 0, + &g_sKentec320x240x16_SSD2119, 10, 105, 220, 30, 0, 100, 25, + (SL_STYLE_FILL | SL_STYLE_BACKG_FILL | SL_STYLE_OUTLINE | + SL_STYLE_TEXT | SL_STYLE_BACKG_TEXT), + ClrGray, ClrBlack, ClrSilver, ClrWhite, ClrWhite, + g_psFontCm20, "25%", 0, 0, OnSliderChange), + SliderStruct(g_psPanels + 7, g_psSliders + 2, 0, + &g_sKentec320x240x16_SSD2119, 10, 145, 220, 25, 0, 100, 25, + (SL_STYLE_FILL | SL_STYLE_BACKG_FILL | SL_STYLE_OUTLINE | + SL_STYLE_TEXT), + ClrWhite, ClrBlueViolet, ClrSilver, ClrBlack, 0, + g_psFontCm18, "Foreground Text Only", 0, 0, OnSliderChange), + SliderStruct(g_psPanels + 7, g_psSliders + 3, 0, + &g_sKentec320x240x16_SSD2119, 240, 70, 26, 110, 0, 100, 50, + (SL_STYLE_FILL | SL_STYLE_BACKG_FILL | SL_STYLE_VERTICAL | + SL_STYLE_OUTLINE | SL_STYLE_LOCKED), ClrDarkGreen, + ClrDarkRed, ClrSilver, 0, 0, 0, 0, 0, 0, 0), + SliderStruct(g_psPanels + 7, g_psSliders + 4, 0, + &g_sKentec320x240x16_SSD2119, 275, 30, 30, 150, 0, 100, 75, + (SL_STYLE_IMG | SL_STYLE_BACKG_IMG | SL_STYLE_VERTICAL | + SL_STYLE_OUTLINE), 0, ClrBlack, ClrSilver, 0, 0, 0, + 0, g_pui8GettingHotter28x148, g_pui8GettingHotter28x148Mono, + OnSliderChange), + SliderStruct(g_psPanels + 7, g_psSliders + 5, 0, + &g_sKentec320x240x16_SSD2119, 10, 30, 195, 37, 0, 100, 50, + SL_STYLE_IMG | SL_STYLE_BACKG_IMG, 0, 0, 0, 0, 0, 0, + 0, g_pui8GreenSlider195x37, g_pui8RedSlider195x37, + OnSliderChange), + SliderStruct(g_psPanels + 7, &g_sSliderValueCanvas, 0, + &g_sKentec320x240x16_SSD2119, 10, 70, 220, 25, 0, 100, 50, + (SL_STYLE_FILL | SL_STYLE_BACKG_FILL | SL_STYLE_TEXT | + SL_STYLE_BACKG_TEXT | SL_STYLE_TEXT_OPAQUE | + SL_STYLE_BACKG_TEXT_OPAQUE), + ClrBlue, ClrYellow, ClrSilver, ClrYellow, ClrBlue, + g_psFontCm18, "Text in both areas", 0, 0, + OnSliderChange), +}; + +#define SLIDER_TEXT_VAL_INDEX 0 +#define SLIDER_LOCKED_INDEX 2 +#define SLIDER_CANVAS_VAL_INDEX 4 + +#define NUM_SLIDERS (sizeof(g_psSliders) / sizeof(g_psSliders[0])) + +//***************************************************************************** +// +// An array of canvas widgets, one per panel. Each canvas is filled with +// black, overwriting the contents of the previous panel. +// +//***************************************************************************** +tCanvasWidget g_psPanels[] = +{ + CanvasStruct(0, 0, &g_sIntroduction, &g_sKentec320x240x16_SSD2119, + X_OFFSET, Y_OFFSET, (320 - (X_OFFSET*2)), 158, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0), + CanvasStruct(0, 0, &g_sPrimitives, &g_sKentec320x240x16_SSD2119, + X_OFFSET, Y_OFFSET, (320 - (X_OFFSET*2)), 158, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0), + CanvasStruct(0, 0, &g_sCanvas1, &g_sKentec320x240x16_SSD2119, + X_OFFSET, Y_OFFSET, (320 - (X_OFFSET*2)), 158, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0), + CanvasStruct(0, 0, g_psCheckBoxes, &g_sKentec320x240x16_SSD2119, + X_OFFSET, Y_OFFSET, (320 - (X_OFFSET*2)), 158, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0), + CanvasStruct(0, 0, &g_sContainer1, &g_sKentec320x240x16_SSD2119, + X_OFFSET, Y_OFFSET, (320 - (X_OFFSET*2)), 158, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0), + CanvasStruct(0, 0, g_psPushButtons, &g_sKentec320x240x16_SSD2119, + X_OFFSET, Y_OFFSET, (320 - (X_OFFSET*2)), 158, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0), + CanvasStruct(0, 0, g_psRadioContainers, &g_sKentec320x240x16_SSD2119, + X_OFFSET, Y_OFFSET, (320 - (X_OFFSET*2)), 158, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0), + CanvasStruct(0, 0, g_psSliders, &g_sKentec320x240x16_SSD2119, + X_OFFSET, Y_OFFSET, (320 - (X_OFFSET*2)), 158, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0), +}; + +//***************************************************************************** +// +// The number of panels. +// +//***************************************************************************** +#define NUM_PANELS (sizeof(g_psPanels) / sizeof(g_psPanels[0])) + +//***************************************************************************** +// +// The names for each of the panels, which is displayed at the bottom of the +// screen. +// +//***************************************************************************** +char *g_pcPanelNames[] = +{ + " Introduction ", + " Primitives ", + " Canvas ", + " Checkbox ", + " Container ", + " Push Buttons ", + " Radio Buttons ", + " Sliders ", + " S/W Update " +}; + +//***************************************************************************** +// +// The buttons and text across the bottom of the screen. +// +//***************************************************************************** +RectangularButton(g_sPrevious, 0, 0, 0, &g_sKentec320x240x16_SSD2119, + X_OFFSET, 182, 50, 50, + PB_STYLE_FILL, ClrBlack, ClrBlack, 0, ClrSilver, + g_psFontCm20, "-", g_pui8Blue50x50, g_pui8Blue50x50Press, + 0, 0, OnPrevious); +Canvas(g_sTitle, 0, 0, 0, &g_sKentec320x240x16_SSD2119, + (X_OFFSET+50), 182, 204, 50, + CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE, 0, 0, ClrSilver, + g_psFontCm20, 0, 0, 0); +RectangularButton(g_sNext, 0, 0, 0, &g_sKentec320x240x16_SSD2119, + (320-50-X_OFFSET), 182, 50, 50, + PB_STYLE_IMG | PB_STYLE_TEXT, ClrBlack, ClrBlack, 0, + ClrSilver, g_psFontCm20, "+", g_pui8Blue50x50, + g_pui8Blue50x50Press, 0, 0, OnNext); + +//***************************************************************************** +// +// The panel that is currently being displayed. +// +//***************************************************************************** +uint32_t g_ui32Panel; + +//***************************************************************************** +// +// The position within the waveform of the click sound. +// +//***************************************************************************** +uint32_t g_ui32AudioPos; + +//***************************************************************************** +// +// The step rate of the waveform for the click sound. +// +//***************************************************************************** +uint32_t g_ui32AudioStep; + +//***************************************************************************** +// +// The amplitude of the waveformfor the click sound. +// +//***************************************************************************** +uint32_t g_ui32Amp; + +//***************************************************************************** +// +// The step rate of the amplitude for the click sound. +// +//***************************************************************************** +uint32_t g_ui32AmpStep; + +//***************************************************************************** +// +// Initialize the variables for generating the click sound waveform +// +//***************************************************************************** +void +PlayClick(void) +{ + // + // Start the new waveform at zero. + // + g_ui32AudioPos = 0; + + // + // Set the fixed Audio step + // + g_ui32AudioStep = ((265 * 65536) / 64000) * 65536; + + // + // Set the amplitude of the waveform generator to full volume. + // + g_ui32Amp = 2048; + + // + // Set the decreasing step of amplitude. + // + g_ui32AmpStep = 1; +} + +//***************************************************************************** +// +// Handles presses of the previous panel button. +// +//***************************************************************************** +void +OnPrevious(tWidget *psWidget) +{ + // + // There is nothing to be done if the first panel is already being + // displayed. + // + if(g_ui32Panel == 0) + { + return; + } + + // + // Remove the current panel. + // + WidgetRemove((tWidget *)(g_psPanels + g_ui32Panel)); + + // + // Decrement the panel index. + // + g_ui32Panel--; + + // + // Add and draw the new panel. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)(g_psPanels + g_ui32Panel)); + WidgetPaint((tWidget *)(g_psPanels + g_ui32Panel)); + + // + // Set the title of this panel. + // + CanvasTextSet(&g_sTitle, g_pcPanelNames[g_ui32Panel]); + WidgetPaint((tWidget *)&g_sTitle); + + // + // See if this is the first panel. + // + if(g_ui32Panel == 0) + { + // + // Clear the previous button from the display since the first panel is + // being displayed. + // + PushButtonImageOff(&g_sPrevious); + PushButtonTextOff(&g_sPrevious); + PushButtonFillOn(&g_sPrevious); + WidgetPaint((tWidget *)&g_sPrevious); + } + + // + // See if the previous panel was the last panel. + // + if(g_ui32Panel == (NUM_PANELS - 2)) + { + // + // Display the next button. + // + PushButtonImageOn(&g_sNext); + PushButtonTextOn(&g_sNext); + PushButtonFillOff(&g_sNext); + WidgetPaint((tWidget *)&g_sNext); + } + + // + // Play the key click sound. + // + PlayClick(); +} + +//***************************************************************************** +// +// Handles presses of the next panel button. +// +//***************************************************************************** +void +OnNext(tWidget *psWidget) +{ + // + // There is nothing to be done if the last panel is already being + // displayed. + // + if(g_ui32Panel == (NUM_PANELS - 1)) + { + return; + } + + // + // Remove the current panel. + // + WidgetRemove((tWidget *)(g_psPanels + g_ui32Panel)); + + // + // Increment the panel index. + // + g_ui32Panel++; + + // + // Add and draw the new panel. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)(g_psPanels + g_ui32Panel)); + WidgetPaint((tWidget *)(g_psPanels + g_ui32Panel)); + + // + // Set the title of this panel. + // + CanvasTextSet(&g_sTitle, g_pcPanelNames[g_ui32Panel]); + WidgetPaint((tWidget *)&g_sTitle); + + // + // See if the previous panel was the first panel. + // + if(g_ui32Panel == 1) + { + // + // Display the previous button. + // + PushButtonImageOn(&g_sPrevious); + PushButtonTextOn(&g_sPrevious); + PushButtonFillOff(&g_sPrevious); + WidgetPaint((tWidget *)&g_sPrevious); + } + + // + // See if this is the last panel. + // + if(g_ui32Panel == (NUM_PANELS - 1)) + { + // + // Clear the next button from the display since the last panel is being + // displayed. + // + PushButtonImageOff(&g_sNext); + PushButtonTextOff(&g_sNext); + PushButtonFillOn(&g_sNext); + WidgetPaint((tWidget *)&g_sNext); + } + + // + // Play the key click sound. + // + PlayClick(); +} + +//***************************************************************************** +// +// Handles paint requests for the introduction canvas widget. +// +//***************************************************************************** +void +OnIntroPaint(tWidget *psWidget, tContext *psContext) +{ + // + // Display the introduction text in the canvas. + // + GrContextFontSet(psContext, g_psFontCm16); + GrContextForegroundSet(psContext, ClrSilver); + GrStringDraw(psContext, "This application demonstrates the ", -1, + 10, 30, 0); + GrStringDraw(psContext, "TivaWare Graphics Library.", -1, + 10, (30+16), 0); + GrStringDraw(psContext, "Each panel shows a different feature of", -1, + 10, (30+(16*2)), 0); + GrStringDraw(psContext, "the graphics library. Widgets on the panels", -1, + 10, (30+(16*3)), 0); + GrStringDraw(psContext, "are fully operational; pressing them will", -1, + 10, (30+(16*4)), 0); + GrStringDraw(psContext, "result in visible feedback of some kind.", -1, + 10, (30+(16*5)), 0); + GrStringDraw(psContext, "Press the + and - buttons at the bottom", -1, + 10, (30+(16*6)), 0); + GrStringDraw(psContext, "of the screen to move between the panels.", -1, + 10, (30+(16*7)), 0); +} + +//***************************************************************************** +// +// Handles paint requests for the primitives canvas widget. +// +//***************************************************************************** +void +OnPrimitivePaint(tWidget *psWidget, tContext *psContext) +{ + uint32_t ui32Idx; + tRectangle sRect; + + // + // Draw a vertical sweep of lines from red to green. + // + for(ui32Idx = 0; ui32Idx <= 8; ui32Idx++) + { + GrContextForegroundSet(psContext, + (((((10 - ui32Idx) * 255) / 10) << ClrRedShift) | + (((ui32Idx * 255) / 10) << ClrGreenShift))); + GrLineDraw(psContext, 115, 120, 5, 120 - (11 * ui32Idx)); + } + + // + // Draw a horizontal sweep of lines from green to blue. + // + for(ui32Idx = 1; ui32Idx <= 10; ui32Idx++) + { + GrContextForegroundSet(psContext, + (((((10 - ui32Idx) * 255) / 10) << + ClrGreenShift) | + (((ui32Idx * 255) / 10) << ClrBlueShift))); + GrLineDraw(psContext, 115, 120, 5 + (ui32Idx * 11), 29); + } + + // + // Draw a filled circle with an overlapping circle. + // + GrContextForegroundSet(psContext, ClrBrown); + GrCircleFill(psContext, 185, 69, 40); + GrContextForegroundSet(psContext, ClrSkyBlue); + GrCircleDraw(psContext, 205, 99, 30); + + // + // Draw a filled rectangle with an overlapping rectangle. + // + GrContextForegroundSet(psContext, ClrSlateGray); + sRect.i16XMin = 20; + sRect.i16YMin = 100; + sRect.i16XMax = 75; + sRect.i16YMax = 160; + GrRectFill(psContext, &sRect); + GrContextForegroundSet(psContext, ClrSlateBlue); + sRect.i16XMin += 40; + sRect.i16YMin += 30; + sRect.i16XMax += 30; + sRect.i16YMax += 18; + GrRectDraw(psContext, &sRect); + + // + // Draw a piece of text in fonts of increasing size. + // + GrContextForegroundSet(psContext, ClrSilver); + GrContextFontSet(psContext, g_psFontCm14); + GrStringDraw(psContext, "Strings", -1, 120, 104, 0); + GrContextFontSet(psContext, g_psFontCm18); + GrStringDraw(psContext, "Strings", -1, 140, 118, 0); + GrContextFontSet(psContext, g_psFontCm22); + GrStringDraw(psContext, "Strings", -1, 160, 136, 0); + GrContextFontSet(psContext, g_psFontCm24); + GrStringDraw(psContext, "Strings", -1, 180, 158, 0); + + // + // Draw an image. + // + GrImageDraw(psContext, g_ui8Logo, 262, 80); +} + +//***************************************************************************** +// +// Handles paint requests for the canvas demonstration widget. +// +//***************************************************************************** +void +OnCanvasPaint(tWidget *psWidget, tContext *psContext) +{ + uint32_t ui32Idx; + + // + // Draw a set of radiating lines. + // + GrContextForegroundSet(psContext, ClrGoldenrod); + for(ui32Idx = 50; ui32Idx <= 180; ui32Idx += 10) + { + GrLineDraw(psContext, 210, ui32Idx, 310, 230 - ui32Idx); + } + + // + // Indicate that the contents of this canvas were drawn by the application. + // + GrContextFontSet(psContext, g_psFontCm12); + GrStringDrawCentered(psContext, "App Drawn", -1, 260, 50, 1); +} + +//***************************************************************************** +// +// Handles change notifications for the check box widgets. +// +//***************************************************************************** +void +OnCheckChange(tWidget *psWidget, uint32_t bSelected) +{ + uint32_t ui32Idx; + + // + // Find the index of this check box. + // + for(ui32Idx = 0; ui32Idx < NUM_CHECK_BOXES; ui32Idx++) + { + if(psWidget == (tWidget *)(g_psCheckBoxes + ui32Idx)) + { + break; + } + } + + // + // Return if the check box could not be found. + // + if(ui32Idx == NUM_CHECK_BOXES) + { + return; + } + + // + // Set the matching indicator based on the selected state of the check box. + // + CanvasImageSet(g_psCheckBoxIndicators + ui32Idx, + bSelected ? g_pui8LightOn : g_pui8LightOff); + WidgetPaint((tWidget *)(g_psCheckBoxIndicators + ui32Idx)); + + // + // Play the key click sound. + // + PlayClick(); +} + +//***************************************************************************** +// +// Handles press notifications for the push button widgets. +// +//***************************************************************************** +void +OnButtonPress(tWidget *psWidget) +{ + uint32_t ui32Idx; + + // + // Find the index of this push button. + // + for(ui32Idx = 0; ui32Idx < NUM_PUSH_BUTTONS; ui32Idx++) + { + if(psWidget == (tWidget *)(g_psPushButtons + ui32Idx)) + { + break; + } + } + + // + // Return if the push button could not be found. + // + if(ui32Idx == NUM_PUSH_BUTTONS) + { + return; + } + + // + // Toggle the state of this push button indicator. + // + g_ui32ButtonState ^= 1 << ui32Idx; + + // + // Set the matching indicator based on the selected state of the check box. + // + CanvasImageSet(g_psPushButtonIndicators + ui32Idx, + (g_ui32ButtonState & (1 << ui32Idx)) ? g_pui8LightOn : + g_pui8LightOff); + WidgetPaint((tWidget *)(g_psPushButtonIndicators + ui32Idx)); + + // + // Play the key click sound. + // + PlayClick(); +} + +//***************************************************************************** +// +// Handles notifications from the slider controls. +// +//***************************************************************************** +void +OnSliderChange(tWidget *psWidget, int32_t i32Value) +{ + static char pcCanvasText[5]; + static char pcSliderText[5]; + + // + // Is this the widget whose value we mirror in the canvas widget and the + // locked slider? + // + if(psWidget == (tWidget *)&g_psSliders[SLIDER_CANVAS_VAL_INDEX]) + { + // + // Yes - update the canvas to show the slider value. + // + usprintf(pcCanvasText, "%3d%%", i32Value); + CanvasTextSet(&g_sSliderValueCanvas, pcCanvasText); + WidgetPaint((tWidget *)&g_sSliderValueCanvas); + + // + // Also update the value of the locked slider to reflect this one. + // + SliderValueSet(&g_psSliders[SLIDER_LOCKED_INDEX], i32Value); + WidgetPaint((tWidget *)&g_psSliders[SLIDER_LOCKED_INDEX]); + } + + if(psWidget == (tWidget *)&g_psSliders[SLIDER_TEXT_VAL_INDEX]) + { + // + // Yes - update the canvas to show the slider value. + // + usprintf(pcSliderText, "%3d%%", i32Value); + SliderTextSet(&g_psSliders[SLIDER_TEXT_VAL_INDEX], pcSliderText); + WidgetPaint((tWidget *)&g_psSliders[SLIDER_TEXT_VAL_INDEX]); + } +} + +//***************************************************************************** +// +// Handles change notifications for the radio button widgets. +// +//***************************************************************************** +void +OnRadioChange(tWidget *psWidget, uint32_t bSelected) +{ + uint32_t ui32Idx; + + // + // Find the index of this radio button in the first group. + // + for(ui32Idx = 0; ui32Idx < NUM_RADIO1_BUTTONS; ui32Idx++) + { + if(psWidget == (tWidget *)(g_psRadioButtons1 + ui32Idx)) + { + break; + } + } + + // + // See if the radio button was found. + // + if(ui32Idx == NUM_RADIO1_BUTTONS) + { + // + // Find the index of this radio button in the second group. + // + for(ui32Idx = 0; ui32Idx < NUM_RADIO2_BUTTONS; ui32Idx++) + { + if(psWidget == (tWidget *)(g_psRadioButtons2 + ui32Idx)) + { + break; + } + } + + // + // Return if the radio button could not be found. + // + if(ui32Idx == NUM_RADIO2_BUTTONS) + { + return; + } + + // + // Sind the radio button is in the second group, offset the index to + // the indicators associated with the second group. + // + ui32Idx += NUM_RADIO1_BUTTONS; + } + + // + // Set the matching indicator based on the selected state of the radio + // button. + // + CanvasImageSet(g_psRadioButtonIndicators + ui32Idx, + bSelected ? g_pui8LightOn : g_pui8LightOff); + WidgetPaint((tWidget *)(g_psRadioButtonIndicators + ui32Idx)); + + // + // Play the key click sound. + // + PlayClick(); +} + +//***************************************************************************** +// +// The callback function that is called by the sound driver to indicate that +// half of the sound buffer has been played. +// +//***************************************************************************** +void +SoundCallback(uint32_t ui32Half) +{ + // + // See which half of the sound buffer has been played. + // + if(ui32Half == 0) + { + // + // The first half of the sound buffer needs to be filled. + // + HWREGBITW(&g_ui32Flags, FLAG_PING) = 1; + } + else + { + // + // The second half of the sound buffer needs to be filled. + // + HWREGBITW(&g_ui32Flags, FLAG_PONG) = 1; + } +} + +//***************************************************************************** +// +// Generates an additional section of the audio output +// +//***************************************************************************** +void +GenerateAudio(int16_t *pi16Buffer, uint32_t ui32Count) +{ + int32_t i32Val; + + // + // if g_ui32Amp is down to 0, fill the buffer with silence. + // + if(g_ui32Amp == 0) + { + // + // Fill the buffer with silence. + // + while(ui32Count--) + { + *pi16Buffer++ = 0; + } + return; + } + + // + // Loop through the samples to be generated. + // + while(ui32Count--) + { + // + // Compute the value of the waveform. + // + i32Val = sine(g_ui32AudioPos + (sine(g_ui32AudioPos * 3) * 10922)); + + // + // Increment the position of the waveform. + // + g_ui32AudioPos += g_ui32AudioStep; + + // + // Scale the waveform value by the volume. + // + i32Val = (i32Val * g_ui32Amp) / 1024; + + // + // Decrement the waveform amplitude by the step. + // + g_ui32Amp -= g_ui32AmpStep; + + // + // Cilp the waveform to min/max if required. + // + i32Val /= 2; + if(i32Val > 32767) + { + i32Val = 32767; + } + if(i32Val < -32768) + { + i32Val = -32768; + } + + // + // Add the new waveform value to the sample buffer. + // + *pi16Buffer++ = (int16_t)i32Val; + } +} +//***************************************************************************** +// +// A simple demonstration of the features of the TivaWare Graphics Library. +// +//***************************************************************************** +int +main(void) +{ + tContext sContext; + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "grlib-demo"); + + // + // Configure and enable uDMA + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + SysCtlDelay(10); + ROM_uDMAControlBaseSet(&psDMAControlTable[0]); + ROM_uDMAEnable(); + + // + // Initialize the sound driver. + // + SoundInit(ui32SysClock); + SoundVolumeSet(128); + SoundStart(g_pi16AudioBuffer, AUDIO_SIZE, 64000, SoundCallback); + + // + // Initialize the touch screen driver and have it route its messages to the + // widget tree. + // + TouchScreenInit(ui32SysClock); + TouchScreenCallbackSet(WidgetPointerMessage); + + // + // Add the title block and the previous and next buttons to the widget + // tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sPrevious); + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sTitle); + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sNext); + + // + // Add the first panel to the widget tree. + // + g_ui32Panel = 0; + WidgetAdd(WIDGET_ROOT, (tWidget *)g_psPanels); + CanvasTextSet(&g_sTitle, g_pcPanelNames[0]); + + // + // Issue the initial paint request to the widgets. + // + WidgetPaint(WIDGET_ROOT); + + // + // Loop forever handling widget messages. + // + while(1) + { + // + // Process any messages in the widget message queue. + // + WidgetMessageQueueProcess(); + + // + // See if the first half of the sound buffer needs to be filled. + // + if(HWREGBITW(&g_ui32Flags, FLAG_PING) == 1) + { + // + // generate new audio into the first half of the sound buffer. + // + GenerateAudio(g_pi16AudioBuffer, AUDIO_SIZE / 2); + + // + // Clear the flag for the first half of the sound buffer. + // + HWREGBITW(&g_ui32Flags, FLAG_PING) = 0; + } + + // + // See if the second half of the sound buffer needs to be filled. + // + if(HWREGBITW(&g_ui32Flags, FLAG_PONG) == 1) + { + // + // generate new audio into the second half of the sound buffer. + // + GenerateAudio(g_pi16AudioBuffer + (AUDIO_SIZE / 2), + AUDIO_SIZE / 2); + + // + // Clear the flag for the second half of the sound buffer. + // + HWREGBITW(&g_ui32Flags, FLAG_PONG) = 0; + } + } +} diff --git a/boards/dk-tm4c129x/grlib_demo/grlib_demo.ewd b/boards/dk-tm4c129x/grlib_demo/grlib_demo.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/grlib_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/grlib_demo/grlib_demo.ewp b/boards/dk-tm4c129x/grlib_demo/grlib_demo.ewp new file mode 100644 index 0000000..ac0accb --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/grlib_demo.ewp @@ -0,0 +1,813 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\grlib_demo.c + + + $PROJ_DIR$\images.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\..\..\..\..\utils\sine.c + + + $PROJ_DIR$\..\drivers\sound.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/grlib_demo/grlib_demo.icf b/boards/dk-tm4c129x/grlib_demo/grlib_demo.icf new file mode 100644 index 0000000..bbee1cb --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/grlib_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// grlib_demo.icf - Linker configuration file for grlib_demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/grlib_demo/grlib_demo.ld b/boards/dk-tm4c129x/grlib_demo/grlib_demo.ld new file mode 100644 index 0000000..33033f0 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/grlib_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * grlib_demo.ld - Linker configuration file for grlib_demo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/grlib_demo/grlib_demo.sct b/boards/dk-tm4c129x/grlib_demo/grlib_demo.sct new file mode 100644 index 0000000..7cd69f3 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/grlib_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; grlib_demo.sct - Linker configuration file for grlib_demo. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/grlib_demo/grlib_demo.uvopt b/boards/dk-tm4c129x/grlib_demo/grlib_demo.uvopt new file mode 100644 index 0000000..42fd806 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/grlib_demo.uvopt @@ -0,0 +1,415 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + grlib_demo + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\grlib_demo.c + grlib_demo.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\images.c + images.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\sine.c + sine.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\sound.c + sound.c + + + 1 + 8 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 12 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 13 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/grlib_demo/grlib_demo.uvproj b/boards/dk-tm4c129x/grlib_demo/grlib_demo.uvproj new file mode 100644 index 0000000..c3a49a7 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/grlib_demo.uvproj @@ -0,0 +1,469 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + grlib_demo + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + grlib_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\grlib_demo.bin .\rvmdk\grlib_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + grlib_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + grlib_demo.c + 1 + .\grlib_demo.c + + + images.c + 1 + .\images.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + sine.c + 1 + ..\..\..\..\utils\sine.c + + + sound.c + 1 + ..\drivers\sound.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/grlib_demo/grlib_demo_ccs.cmd b/boards/dk-tm4c129x/grlib_demo/grlib_demo_ccs.cmd new file mode 100644 index 0000000..137604d --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/grlib_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * grlib_demo_ccs.cmd - CCS linker configuration file for grlib_demo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/grlib_demo/images.c b/boards/dk-tm4c129x/grlib_demo/images.c new file mode 100644 index 0000000..b291f67 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/images.c @@ -0,0 +1,1131 @@ +//***************************************************************************** +// +// images.c - Data for the images used by the application. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// The image of the TI symbol. +// +//***************************************************************************** +const uint8_t g_ui8Logo[] = +{ + IMAGE_FMT_4BPP_COMP, + 50, 0, + 50, 0, + + 15, + 0x00, 0x00, 0x00, + 0x03, 0x02, 0x13, + 0x07, 0x05, 0x2a, + 0x0a, 0x08, 0x41, + 0x0d, 0x0a, 0x55, + 0x10, 0x0c, 0x68, + 0x12, 0x0e, 0x74, + 0x15, 0x10, 0x88, + 0x17, 0x12, 0x97, + 0x19, 0x14, 0xa7, + 0x1c, 0x16, 0xb8, + 0x1e, 0x18, 0xc8, + 0x20, 0x19, 0xd6, + 0x22, 0x1b, 0xe1, + 0x24, 0x1c, 0xe9, + 0x24, 0x1c, 0xed, + + 0xf0, 0x07, 0x07, 0x07, 0x02, 0x04, 0xba, 0xaa, 0xaa, 0x18, 0xaa, 0xac, + 0x30, 0x07, 0x07, 0x05, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x40, 0x3f, + 0x3f, 0x3f, 0x3f, 0xc7, 0x3f, 0x3d, 0x48, 0x78, 0x50, 0x3f, 0x3f, 0x3a, + 0x1c, 0xbf, 0xff, 0x70, 0x3f, 0x3f, 0x39, 0x01, 0xdf, 0xe0, 0x12, 0x3f, + 0x3f, 0x00, 0x04, 0xff, 0xff, 0x20, 0xe1, 0x3f, 0x3f, 0x39, 0x03, 0x97, + 0x87, 0x10, 0x3f, 0xf8, 0x3f, 0x39, 0x5f, 0x3f, 0x3b, 0x96, 0x82, 0x06, + 0x00, 0x87, 0x84, 0x04, 0x87, 0x77, 0x77, 0x78, 0x30, 0xc0, 0x3f, 0x3b, + 0xff, 0xd1, 0x0d, 0xff, 0xf5, 0x09, 0xb0, 0xaa, 0x60, 0x3f, 0x3c, 0xa0, + 0x2f, 0xff, 0xf2, 0x60, 0x0c, 0x3f, 0x3f, 0xff, 0xff, 0x80, 0x4f, 0xff, + 0x30, 0xc0, 0x1e, 0x3f, 0x3f, 0xff, 0xff, 0x50, 0x7f, 0x18, 0xff, 0x90, + 0x4f, 0x3f, 0x3f, 0xfd, 0xef, 0x20, 0x06, 0xaf, 0xff, 0x70, 0x7f, 0xdd, + 0x3f, 0x3e, 0xb2, 0x01, 0x12, 0x01, 0xcf, 0xff, 0x50, 0x12, 0x07, 0x3f, + 0x80, 0x3e, 0x80, 0x00, 0x03, 0xff, 0xff, 0x30, 0x00, 0x5a, 0x08, 0x39, + 0x70, 0x3f, 0x3a, 0x60, 0x01, 0xfc, 0x10, 0x10, 0x00, 0x1b, 0x39, 0xb0, + 0x00, 0x00, 0x8c, 0x02, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0x3a, 0x40, + 0x01, 0x00, 0x07, 0xff, 0xfa, 0x00, 0x00, 0x2f, 0x39, 0x0c, 0xf6, 0x00, + 0x00, 0x7f, 0x6a, 0x4a, 0xff, 0xfd, 0x00, 0x20, 0x00, 0x0a, 0xff, 0xf7, + 0x00, 0x00, 0x4f, 0x84, 0x39, 0xfe, 0x40, 0x00, 0x29, 0x3f, 0xfe, 0xab, + 0x01, 0xa0, 0x1c, 0xff, 0xf4, 0x08, 0xca, 0xcf, 0x72, 0x08, 0xf7, 0x00, + 0x02, 0xdf, 0x37, 0xff, 0xb0, 0x2f, 0x10, 0xff, 0xf2, 0x0c, 0x8c, 0xf7, + 0x00, 0x00, 0x3f, 0x81, 0x3f, 0xff, 0x80, 0x4f, 0xff, 0xc0, 0x2e, 0x3f, + 0x20, 0x02, 0xcf, 0x37, 0x50, 0x8f, 0xff, 0xa0, 0x4f, 0x90, 0x3f, 0x00, + 0x2c, 0x3f, 0x30, 0xaf, 0xff, 0x70, 0x48, 0x7f, 0x3f, 0x00, 0x02, 0x3e, + 0xfd, 0x10, 0xcf, 0x11, 0xff, 0x40, 0x9f, 0x3f, 0x00, 0x00, 0x8f, 0x35, + 0x02, 0xfa, 0x02, 0xff, 0xfe, 0x20, 0xcf, 0x3f, 0x00, 0x20, 0x00, 0x2f, + 0x3d, 0xf8, 0x05, 0xff, 0xfd, 0x00, 0xd0, 0x3f, 0x31, 0x09, 0x3d, 0xf5, + 0x03, 0x54, 0x53, 0x12, 0x00, 0x34, 0x6e, 0x3f, 0x00, 0x04, 0x39, 0xfa, + 0x09, 0x9c, 0xff, 0xff, 0xf3, 0x9a, 0x00, 0x3f, 0x3a, 0x20, 0xa6, 0x31, + 0xa3, 0xaf, 0xff, 0xfe, 0x30, 0x01, 0x10, 0xbf, 0xff, 0xd1, 0x3b, 0x7f, + 0xff, 0xff, 0xfd, 0x40, 0x72, 0x4b, 0x00, 0x00, 0x2c, 0xff, 0xe3, 0x00, + 0x08, 0x00, 0x2d, 0xff, 0xe1, 0x3b, 0x9f, 0xff, 0xfe, 0x40, 0x71, 0x45, + 0x00, 0x01, 0x68, 0x20, 0x00, 0x00, 0x11, 0x06, 0xff, 0xf6, 0xa3, 0xbf, + 0xff, 0xb2, 0x46, 0x80, 0x15, 0xbf, 0xff, 0x94, 0x33, 0x22, 0x22, 0x23, + 0x30, 0xef, 0xf8, 0x47, 0x05, 0x6f, 0xff, 0xff, 0xfe, 0x06, 0xee, 0xee, + 0xee, 0xff, 0x70, 0x3f, 0x05, 0x1c, 0x16, 0xff, 0xff, 0xff, 0xe9, 0xf9, + 0x47, 0x06, 0x07, 0xb2, 0x3c, 0xc1, 0x3f, 0x06, 0x02, 0xdf, 0x33, 0x50, + 0xd3, 0x3f, 0x07, 0x7f, 0x3a, 0xfc, 0x10, 0x3f, 0x07, 0x59, 0x2d, 0x3a, + 0xf9, 0x47, 0x07, 0x00, 0x05, 0x3a, 0x62, 0xf7, 0x3f, 0x07, 0x00, 0x00, + 0x9f, 0x31, 0xf8, 0xc5, 0x3f, 0x07, 0x00, 0x00, 0x0a, 0x39, 0xf9, 0x3f, + 0xc1, 0x07, 0x01, 0x9f, 0xff, 0xff, 0xfc, 0x10, 0x37, 0x80, 0x07, 0x00, + 0x00, 0x06, 0xdf, 0xff, 0xff, 0x50, 0xe1, 0x3f, 0x07, 0x01, 0x15, 0x78, + 0x86, 0x20, 0x3f, 0xff, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x00, 0x00, +}; + +//***************************************************************************** +// +// This is the image of a red LED that is turned off. +// +//***************************************************************************** +const uint8_t g_pui8LightOff[] = +{ + IMAGE_FMT_4BPP_COMP, + 20, 0, + 20, 0, + + 15, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, + 0x00, 0x00, 0x19, + 0x00, 0x00, 0x2a, + 0x00, 0x00, 0x30, + 0x00, 0x00, 0x34, + 0x00, 0x00, 0x37, + 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x3d, + 0x00, 0x00, 0x3f, + 0x00, 0x00, 0x40, + 0x00, 0x00, 0x42, + 0x00, 0x00, 0x45, + 0x00, 0x00, 0x4a, + 0x00, 0x00, 0x50, + 0x00, 0x00, 0x56, + + 0x84, 0x01, 0x13, 0xaf, 0xe8, 0x31, 0x03, 0x1b, 0xff, 0x08, 0xff, 0xee, + 0xed, 0x71, 0x01, 0x02, 0xff, 0xff, 0x00, 0xfe, 0xed, 0xdd, 0xcc, 0x20, + 0x00, 0x00, 0x2f, 0x00, 0xff, 0xfe, 0xee, 0xdd, 0xcc, 0xcb, 0xa2, 0x00, + 0x40, 0x01, 0x21, 0xdd, 0xdc, 0xcc, 0xbb, 0xa8, 0x10, 0x00, 0x09, 0xff, + 0xfe, 0xdd, 0xdc, 0xcb, 0xbb, 0xba, 0x00, 0x98, 0x30, 0x1e, 0xfe, 0xed, + 0xdc, 0xcb, 0xaa, 0x00, 0xaa, 0xaa, 0x98, 0x61, 0x3e, 0xfe, 0xdd, 0xcc, + 0x00, 0xba, 0x99, 0x9a, 0xaa, 0x98, 0x62, 0x7d, 0xee, 0x00, 0xdc, 0xcb, + 0xa9, 0x99, 0x99, 0x99, 0x88, 0x73, 0x08, 0xcd, 0xed, 0xdc, 0xba, 0xb9, + 0x99, 0x88, 0x64, 0x20, 0xcc, 0xdd, 0x6b, 0x99, 0x87, 0x63, 0x6c, 0xcc, + 0x40, 0xba, 0x1a, 0x98, 0x76, 0x42, 0x2b, 0xba, 0xaa, 0x88, 0x1b, 0x65, + 0x42, 0x1a, 0x2a, 0x99, 0x98, 0x87, 0x00, 0x64, 0x30, 0x04, 0x78, 0x88, + 0x88, 0x89, 0x99, 0x00, 0x88, 0x76, 0x54, 0x20, 0x01, 0x67, 0x77, 0x88, + 0x00, 0x88, 0x88, 0x87, 0x65, 0x43, 0x00, 0x00, 0x25, 0x00, 0x67, 0x77, + 0x77, 0x77, 0x65, 0x44, 0x31, 0x00, 0x00, 0x00, 0x01, 0x45, 0x66, 0x66, + 0x65, 0x54, 0x43, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, 0x44, 0x45, 0x44, + 0x20, 0x33, 0x20, 0xb9, 0x00, 0x00, 0x12, 0x23, 0x32, 0x80, 0x72, +}; + +//***************************************************************************** +// +// This is the image of a red LED that is turned on. +// +//***************************************************************************** +const uint8_t g_pui8LightOn[] = +{ + IMAGE_FMT_4BPP_COMP, + 20, 0, + 20, 0, + + 15, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x16, + 0x00, 0x00, 0x40, + 0x00, 0x00, 0x76, + 0x00, 0x00, 0x9b, + 0x00, 0x00, 0xac, + 0x00, 0x00, 0xb6, + 0x00, 0x00, 0xbc, + 0x00, 0x00, 0xbe, + 0x00, 0x00, 0xbf, + 0x00, 0x00, 0xc1, + 0x00, 0x00, 0xc5, + 0x00, 0x00, 0xcd, + 0x00, 0x00, 0xdb, + 0x00, 0x00, 0xef, + 0x00, 0x00, 0xfc, + + 0x84, 0x01, 0x13, 0xaf, 0xe7, 0x31, 0x03, 0x1b, 0xff, 0x09, 0xff, 0xee, + 0xee, 0x51, 0x01, 0x02, 0xff, 0xb1, 0x02, 0xdd, 0xcc, 0x20, 0x00, 0x00, + 0x2f, 0xbb, 0xcc, 0x10, 0x92, 0x00, 0x01, 0x72, 0xdc, 0xcc, 0xcb, 0x96, + 0x00, 0x10, 0x07, 0xff, 0xfe, 0xed, 0xdc, 0xcc, 0xbb, 0x08, 0xba, 0x96, + 0x30, 0x1e, 0x22, 0xba, 0xaa, 0xaa, 0x10, 0x86, 0x51, 0x3e, 0x69, 0xba, + 0x99, 0x99, 0x99, 0x01, 0x76, 0x52, 0x5d, 0xee, 0xdd, 0xcb, 0xa9, 0xb2, + 0x20, 0x53, 0xcd, 0x6c, 0x98, 0x76, 0x54, 0xcc, 0xdd, 0x40, 0xcc, 0x6a, + 0x97, 0x66, 0x43, 0x5c, 0xcc, 0xba, 0x40, 0x98, 0x19, 0x87, 0x65, 0x43, + 0x3c, 0xcb, 0xa9, 0x20, 0x98, 0x89, 0x1a, 0x42, 0x1a, 0x88, 0x98, 0x77, + 0x40, 0x88, 0x69, 0x44, 0x31, 0x04, 0x67, 0x77, 0x77, 0x00, 0x78, 0x88, + 0x76, 0x55, 0x44, 0x20, 0x01, 0x55, 0x00, 0x66, 0x66, 0x77, 0x77, 0x65, + 0x54, 0x43, 0x10, 0x00, 0x00, 0x24, 0x55, 0x55, 0x66, 0x65, 0x54, 0x44, + 0x00, 0x31, 0x00, 0x00, 0x02, 0x44, 0x45, 0x55, 0x54, 0x00, 0x44, 0x33, + 0x10, 0x00, 0x00, 0x00, 0x13, 0x44, 0x08, 0x44, 0x44, 0x33, 0x21, 0xb9, + 0x00, 0x00, 0x12, 0x10, 0x33, 0x32, 0x20, 0xba, +}; + +//***************************************************************************** +// +// This is the image of the blue push button background. +// +//***************************************************************************** +const uint8_t g_pui8Blue50x50[] = +{ + IMAGE_FMT_4BPP_COMP, + 50, 0, + 50, 0, + + 15, + 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x52, 0x00, 0x00, + 0x63, 0x00, 0x00, + 0x6f, 0x00, 0x00, + 0x78, 0x00, 0x00, + 0x7c, 0x00, 0x00, + 0x7d, 0x00, 0x00, + 0x7f, 0x00, 0x00, + 0x81, 0x00, 0x00, + 0x85, 0x00, 0x00, + 0x89, 0x00, 0x00, + 0x8d, 0x00, 0x00, + 0x93, 0x00, 0x00, + 0x9b, 0x00, 0x00, + 0xa9, 0x00, 0x00, + + 0x81, 0x03, 0x13, 0x9e, 0xfe, 0xff, 0xff, 0xff, 0xe9, 0x8a, 0xd1, 0xfe, + 0xd7, 0x31, 0x07, 0x2e, 0x51, 0xee, 0x35, 0xee, 0xee, 0xe9, 0xd4, 0xa2, + 0x35, 0x1e, 0x41, 0x41, 0xfe, 0x3f, 0xee, 0xee, 0xdd, 0xcc, 0x91, 0x33, + 0x40, 0x03, 0x41, 0xee, 0xee, 0xed, 0xdd, 0xdd, 0xdd, 0xc1, 0xe9, 0xd1, + 0xdc, 0xcd, 0xcc, 0xaa, 0x20, 0x32, 0x41, 0x3f, 0x41, 0xed, 0xdc, 0xcc, + 0xcc, 0xcc, 0xe9, 0x81, 0xd1, 0xbb, 0xbb, 0xcc, 0xcb, 0xba, 0x52, 0x39, + 0x40, 0x03, 0x42, 0xcc, 0xba, 0xaa, 0x99, 0x99, 0x99, 0xc0, 0xe9, 0xd1, + 0xaa, 0xaa, 0xab, 0xa9, 0x95, 0x20, 0x04, 0x00, 0x00, 0x1f, 0xff, 0xfe, + 0x41, 0x99, 0x98, 0x1c, 0x88, 0x88, 0x88, 0xe9, 0xd1, 0x29, 0x99, 0x98, + 0x00, 0x41, 0x00, 0x00, 0xef, 0xff, 0xee, 0xdc, 0xba, 0x60, 0x99, 0x4f, + 0x01, 0x89, 0x99, 0x99, 0x98, 0x53, 0x01, 0x00, 0x02, 0xff, 0xfe, 0xed, + 0xcb, 0xa9, 0x47, 0x80, 0x35, 0x98, 0x64, 0x10, 0x0d, 0xef, 0xee, 0xdc, + 0x30, 0xba, 0x98, 0x3f, 0x04, 0x99, 0x88, 0x54, 0x30, 0x06, 0x1e, 0xfe, + 0xed, 0xcb, 0xa9, 0x47, 0x06, 0x86, 0x01, 0x55, 0x41, 0x3e, 0xfe, 0xed, + 0xba, 0x98, 0x3f, 0x81, 0x3f, 0x65, 0x41, 0x5e, 0xee, 0xdc, 0xb9, 0x47, + 0x80, 0x07, 0x88, 0x65, 0x42, 0xbd, 0xee, 0xdb, 0xa9, 0xe1, 0x3f, 0x3f, + 0x39, 0xcc, 0xed, 0xcb, 0x98, 0x3f, 0x81, 0x3f, 0x88, 0x65, 0x43, 0xcc, + 0xdd, 0xca, 0x3f, 0xc3, 0x3f, 0x39, 0x42, 0xcb, 0xdc, 0xba, 0x3f, 0x3f, + 0xb0, 0x3c, 0xb9, 0x47, 0x07, 0x88, 0x88, 0x75, 0x32, 0x18, 0xcb, 0xdc, + 0xa9, 0x3f, 0x07, 0x88, 0x88, 0x65, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0xf8, 0x3f, 0x3f, 0x3f, 0x07, 0x01, 0x64, 0x32, 0xcb, + 0x73, 0xcc, 0x3f, 0x3f, 0x3b, 0x9b, 0xcb, 0x3f, 0x07, 0x00, 0x88, 0x88, + 0x87, 0x54, 0x32, 0x4a, 0xba, 0x99, 0x60, 0x98, 0x37, 0x07, 0x86, 0x54, + 0x32, 0x2a, 0xaa, 0x60, 0xa9, 0x47, 0x07, 0x88, 0x75, 0x43, 0x21, 0x19, + 0x30, 0x8a, 0x99, 0x3f, 0x07, 0x88, 0x65, 0x43, 0x21, 0x0c, 0x04, 0x49, + 0x98, 0x98, 0x37, 0x06, 0x86, 0x54, 0x06, 0x33, 0x20, 0x02, 0x46, 0x68, + 0x47, 0x07, 0x76, 0x01, 0x54, 0x32, 0x10, 0x00, 0x44, 0x66, 0x66, 0x2f, + 0x80, 0x05, 0x87, 0x65, 0x43, 0x32, 0x00, 0x00, 0x13, 0x18, 0x45, 0x55, + 0x66, 0x3f, 0x04, 0x66, 0x54, 0x33, 0x00, 0x21, 0x00, 0x00, 0x01, 0x34, + 0x45, 0x56, 0x66, 0x60, 0x78, 0x2f, 0x01, 0x76, 0x54, 0x43, 0x32, 0x10, + 0x01, 0x00, 0x00, 0x00, 0x12, 0x44, 0x45, 0x55, 0x37, 0x82, 0x01, 0x66, + 0x55, 0x44, 0x33, 0x21, 0x41, 0x00, 0x00, 0x01, 0x23, 0x44, 0x44, 0x55, + 0x56, 0x66, 0x66, 0x60, 0x66, 0xe9, 0xd1, 0x65, 0x54, 0x44, 0x33, 0x22, + 0x40, 0x10, 0x3a, 0x00, 0x12, 0x33, 0x34, 0x44, 0x44, 0x61, 0x44, 0xe9, + 0xd4, 0x43, 0x33, 0x22, 0x21, 0x43, 0x86, 0x31, 0x23, 0x33, 0x33, 0x33, + 0xe9, 0xd4, 0x32, 0x80, 0x47, 0x00, 0x00, 0x01, 0x12, 0x22, 0x22, 0x22, + 0xc8, 0xe9, 0xd3, 0x21, 0x10, 0x43, +}; + +//***************************************************************************** +// +// This is the image of the blue push button background, used when the buttons +// are pressed. +// +//***************************************************************************** +const uint8_t g_pui8Blue50x50Press[] = +{ + IMAGE_FMT_4BPP_COMP, + 50, 0, + 50, 0, + + 15, + 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x52, 0x00, 0x00, + 0x63, 0x00, 0x00, + 0x6f, 0x00, 0x00, + 0x78, 0x00, 0x00, + 0x7c, 0x00, 0x00, + 0x7d, 0x00, 0x00, + 0x7f, 0x00, 0x00, + 0x81, 0x00, 0x00, + 0x85, 0x00, 0x00, + 0x89, 0x00, 0x00, + 0x8d, 0x00, 0x00, + 0x93, 0x00, 0x00, + 0x9b, 0x00, 0x00, + 0xa9, 0x00, 0x00, + + 0x83, 0x03, 0x01, 0x12, 0x22, 0x22, 0x22, 0xe9, 0xd3, 0x20, 0x21, 0x10, + 0x07, 0x12, 0x22, 0x23, 0x33, 0x33, 0x64, 0x33, 0xe9, 0xd4, 0x32, 0x21, + 0x47, 0x33, 0x34, 0x19, 0x44, 0x44, 0x44, 0xe9, 0xd4, 0x43, 0x33, 0x34, + 0x00, 0x01, 0x22, 0x33, 0x44, 0x45, 0x56, 0x66, 0x66, 0x60, 0x66, 0xe9, + 0xd1, 0x65, 0x55, 0x44, 0x44, 0x32, 0x40, 0x10, 0x32, 0x12, 0x33, 0x44, + 0x55, 0x66, 0x88, 0x30, 0x88, 0x88, 0xe9, 0xd2, 0x87, 0x66, 0x55, 0x54, + 0x20, 0x44, 0x21, 0x39, 0x01, 0x23, 0x34, 0x45, 0x67, 0xc0, 0x47, 0x33, + 0x65, 0x54, 0x43, 0x10, 0x00, 0x00, 0x0c, 0x12, 0x33, 0x45, 0x66, 0x47, + 0x04, 0x66, 0x55, 0x00, 0x54, 0x31, 0x00, 0x00, 0x23, 0x34, 0x56, 0x78, + 0xc0, 0x3f, 0x04, 0x86, 0x66, 0x66, 0x44, 0x00, 0x01, 0x18, 0x23, 0x45, + 0x67, 0x47, 0x2f, 0x86, 0x64, 0x20, 0x0c, 0x02, 0x33, 0x45, 0x68, 0x3f, + 0x06, 0x89, 0x89, 0x06, 0x94, 0x40, 0x12, 0x34, 0x56, 0x47, 0x07, 0x88, + 0x03, 0x99, 0xa8, 0x91, 0x12, 0x34, 0x57, 0x3f, 0x07, 0x01, 0x88, 0x9a, + 0xaa, 0xa2, 0x23, 0x45, 0x68, 0x3f, 0x80, 0x07, 0x89, 0x99, 0xab, 0xa4, + 0x23, 0x45, 0x78, 0xc0, 0x3f, 0x07, 0x88, 0x9a, 0xbc, 0xb9, 0x23, 0x46, + 0xe7, 0x47, 0x3f, 0x39, 0xcc, 0xbc, 0x3f, 0x3f, 0x3b, 0x0f, 0xcd, 0xbc, + 0x23, 0x56, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0xb0, 0x39, 0x57, 0x3f, 0x07, 0x88, 0x88, 0x9b, 0xcd, + 0x18, 0xbc, 0x24, 0x56, 0x3f, 0x07, 0x88, 0x89, 0xab, 0xe1, 0x3f, 0x3f, + 0x3c, 0xac, 0xdd, 0xcc, 0x34, 0x3f, 0xc3, 0x3f, 0x39, 0xbc, 0xde, 0xcc, + 0x24, 0x3f, 0x07, 0x03, 0x88, 0x88, 0x9a, 0xbd, 0xee, 0xdb, 0x3f, 0x07, + 0x80, 0x01, 0x9b, 0xcd, 0xee, 0xe5, 0x14, 0x56, 0x68, 0xc0, 0x37, 0x06, + 0x89, 0xab, 0xde, 0xef, 0xe3, 0x14, 0x60, 0x55, 0x3f, 0x07, 0x9a, 0xbc, + 0xde, 0xef, 0xe1, 0x0c, 0x03, 0x45, 0x88, 0x99, 0x37, 0x04, 0x89, 0xab, + 0x00, 0xcd, 0xee, 0xfe, 0xd0, 0x01, 0x46, 0x89, 0x99, 0x60, 0x98, 0x37, + 0x03, 0x9a, 0xbc, 0xde, 0xef, 0xff, 0x06, 0x20, 0x00, 0x35, 0x89, 0x99, + 0x37, 0x03, 0x99, 0x00, 0xab, 0xcd, 0xee, 0xff, 0xfe, 0x00, 0x00, 0x14, + 0x04, 0x89, 0x99, 0xaa, 0x99, 0x99, 0x37, 0x89, 0x99, 0x00, 0xab, 0xcc, + 0xde, 0xef, 0xff, 0xf1, 0x00, 0x00, 0x05, 0x02, 0x59, 0x9a, 0xba, 0xaa, + 0x29, 0x99, 0xe9, 0xa0, 0xd1, 0xaa, 0x41, 0xee, 0xff, 0xff, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x25, 0xab, 0xbc, 0xcc, 0xbb, 0xbb, 0x1a, 0xcc, 0xcc, + 0xcc, 0xe9, 0xd1, 0xcd, 0x42, 0xf3, 0x80, 0x41, 0x00, 0x02, 0xaa, 0xcc, + 0xdc, 0xcd, 0xdd, 0x32, 0xdd, 0xdd, 0xe9, 0xd1, 0xde, 0xee, 0x41, 0xff, + 0x40, 0x30, 0x3a, 0x00, 0x19, 0xcc, 0xdd, 0xee, 0xee, 0x6a, 0xee, 0xe9, + 0xd3, 0xef, 0x41, 0xe1, 0x43, 0x00, 0x3a, 0x00, 0x2a, 0x47, 0x01, 0x41, + 0xe2, 0x45, 0x00, 0x0e, 0x00, 0x13, 0x7d, 0xef, 0x81, 0x69, 0x51, 0xef, + 0x20, 0xe9, 0x31, 0x43, +}; + +//***************************************************************************** +// +// Vertical "Temperature" image used in the slider widget example. +// +//***************************************************************************** +const uint8_t g_pui8GettingHotter28x148[] = +{ + IMAGE_FMT_8BPP_COMP, + 28, 0, + 148, 0, + + 63, + 0x00, 0x10, 0x42, + 0x00, 0x29, 0x46, + 0x00, 0x13, 0x72, + 0x00, 0x3c, 0x3c, + 0x00, 0x38, 0x6c, + 0x00, 0x0d, 0xc7, + 0x00, 0x22, 0x9e, + 0x00, 0x06, 0xe5, + 0x00, 0x03, 0xfe, + 0x00, 0x10, 0xf0, + 0x00, 0x45, 0x8a, + 0x00, 0x0b, 0xfe, + 0x00, 0x57, 0x69, + 0x00, 0x1e, 0xe2, + 0x00, 0x2e, 0xc7, + 0x00, 0x13, 0xfd, + 0x00, 0x1c, 0xf6, + 0x00, 0x1d, 0xfc, + 0x00, 0x34, 0xd7, + 0x00, 0x2c, 0xed, + 0x00, 0x44, 0xc3, + 0x00, 0x29, 0xfb, + 0x00, 0x65, 0x8d, + 0x00, 0x3f, 0xe3, + 0x00, 0x58, 0xb4, + 0x00, 0x37, 0xf9, + 0x00, 0x80, 0x7e, + 0x00, 0x46, 0xf8, + 0x00, 0x56, 0xe0, + 0x00, 0x6b, 0xc3, + 0x00, 0x54, 0xf6, + 0x00, 0x7d, 0xb6, + 0x00, 0x68, 0xe1, + 0x00, 0x61, 0xf5, + 0x00, 0x77, 0xd8, + 0x00, 0x6b, 0xf4, + 0x00, 0x9a, 0x9d, + 0x00, 0x74, 0xf3, + 0x00, 0xa7, 0x97, + 0x00, 0x94, 0xbd, + 0x00, 0x7b, 0xf2, + 0x00, 0x88, 0xdf, + 0x00, 0x90, 0xd6, + 0x00, 0x83, 0xf1, + 0x00, 0x8b, 0xf0, + 0x00, 0xab, 0xb9, + 0x00, 0x91, 0xf0, + 0x00, 0x9a, 0xee, + 0x00, 0xa8, 0xdc, + 0x00, 0xa5, 0xed, + 0x00, 0xc4, 0xc6, + 0x00, 0xb2, 0xec, + 0x00, 0xbc, 0xeb, + 0x00, 0xc3, 0xea, + 0x00, 0xd2, 0xda, + 0x00, 0xcc, 0xe9, + 0x00, 0xd4, 0xe9, + 0x00, 0xe1, 0xd8, + 0x00, 0xdb, 0xe8, + 0x00, 0xe0, 0xe7, + 0x00, 0xe6, 0xe7, + 0x00, 0xec, 0xe6, + 0x00, 0xf3, 0xe5, + 0x00, 0xfa, 0xe4, + + 0x1f, 0x08, 0x08, 0x08, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xfc, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x08, 0x19, 0x03, 0x28, 0x34, 0x34, 0x19, 0x15, + 0x15, 0x07, 0x07, 0x00, 0x08, 0x0f, 0x34, 0x3f, 0x3f, 0x3f, 0x3f, 0x0a, + 0x1c, 0x20, 0x3d, 0x20, 0x1f, 0x07, 0x2b, 0x3f, 0x04, 0x0d, 0x22, 0x3f, + 0x3f, 0x18, 0x1f, 0x05, 0x1e, 0x2b, 0x01, 0x3f, 0x04, 0x2a, 0x3f, 0x3f, + 0x39, 0x05, 0x1f, 0xa8, 0x04, 0x2c, 0x61, 0x16, 0x21, 0x29, 0x3f, 0x3f, + 0x30, 0x3f, 0x02, 0x27, 0x04, 0x34, 0x3f, 0x3f, 0x16, 0x4a, 0x00, 0x21, + 0x05, 0x36, 0xd9, 0x07, 0x1d, 0x0b, 0x29, 0x0b, 0x0b, 0xe9, 0x0b, 0x21, + 0x04, 0x05, 0x22, 0xe1, 0xbb, 0x5d, 0x25, 0x31, 0x3f, 0x3f, 0x2d, 0x22, + 0x30, 0x12, 0x3f, 0x27, 0x07, 0x28, 0x3e, 0x3e, 0x3e, 0x09, 0x36, 0x3e, + 0x3e, 0x32, 0xc9, 0x3e, 0x00, 0x27, 0x98, 0x04, 0x11, 0x3c, 0x52, 0x32, + 0x3e, 0x24, 0x00, 0xd1, 0x2f, 0x05, 0x1e, 0x26, 0x32, 0x00, 0x02, 0x27, + 0x90, 0x06, 0x0e, 0x2d, 0x12, 0x39, 0x16, 0x00, 0x02, 0x44, 0x09, 0x26, + 0x0f, 0x0f, 0x0f, 0xe9, 0x0f, 0x15, 0x00, 0x1b, 0x0f, 0x05, 0x02, 0x04, + 0x04, 0x04, 0x00, 0x18, 0x00, 0x05, 0x09, 0x6d, 0x35, 0x0f, 0x0f, 0x2f, + 0x00, 0x3d, 0x36, 0x28, 0x0f, 0x09, 0x05, 0x05, 0x05, 0xc0, 0x3f, 0x07, + 0x0f, 0x33, 0x3d, 0x3d, 0x32, 0x06, 0xe0, 0x47, 0x07, 0x03, 0x28, 0x3d, + 0x3d, 0x36, 0x02, 0xe8, 0x27, 0x07, 0x04, 0x1d, 0x19, 0x28, 0x1e, 0x1e, + 0x70, 0x1e, 0xe9, 0x07, 0x05, 0x28, 0x3d, 0x3d, 0x3d, 0xd1, 0xe9, 0xd3, + 0x05, 0x1e, 0x11, 0x11, 0x11, 0xe9, 0x06, 0x11, 0x28, 0x3c, 0x3c, 0x3c, + 0xe9, 0xd3, 0x00, 0xf8, 0x65, 0x2d, 0x27, 0x27, 0x07, 0x11, 0x11, 0x23, + 0x0f, 0x30, 0x2d, 0x2d, 0x2d, 0xe9, 0xd2, 0x27, 0x06, 0x0f, 0x05, 0x02, + 0x02, 0x02, 0xe9, 0xd3, 0x27, 0x07, 0xe1, 0x77, 0x2f, 0x05, 0x19, 0x1e, + 0x1e, 0x1e, 0xe9, 0xe1, 0xd3, 0x07, 0x05, 0x28, 0x3b, 0x3b, 0x3b, 0xe9, + 0xa2, 0xd3, 0x05, 0x1e, 0x15, 0x15, 0x15, 0xe9, 0x15, 0x0d, 0x28, 0x3a, + 0x3a, 0x3a, 0xe9, 0xd3, 0x00, 0x65, 0xf0, 0x2d, 0x27, 0x27, 0x07, 0x15, + 0x15, 0x23, 0x30, 0x00, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x36, 0x3a, 0x3a, + 0x30, 0x27, 0x16, 0x27, 0x06, 0x06, 0x02, 0x02, 0x02, 0x83, 0xe9, 0x1f, + 0x3a, 0x3a, 0x0a, 0x06, 0x27, 0x07, 0x83, 0x73, 0x1e, 0x38, 0x38, 0x32, + 0x0e, 0x27, 0x04, 0x08, 0x1b, 0x1e, 0x1e, 0x1e, 0xe9, 0x21, 0x33, 0x38, + 0x1b, 0x38, 0x38, 0x0a, 0x27, 0x04, 0x28, 0x61, 0x49, 0x9d, 0xd3, 0x04, + 0x0e, 0x27, 0x27, 0x0e, 0x00, 0x26, 0x10, 0x19, 0x19, 0x19, 0xe9, 0x19, + 0x28, 0x37, 0x37, 0x63, 0x37, 0xe9, 0xd2, 0x16, 0x00, 0x13, 0x5d, 0x25, + 0x04, 0x25, 0x30, 0x27, 0x27, 0x27, 0xe9, 0x27, 0x16, 0x18, 0x04, 0x00, + 0x06, 0x2f, 0x05, 0x06, 0x02, 0x02, 0x43, 0x02, 0xe9, 0x02, 0x02, 0x06, + 0x0e, 0x2f, 0x05, 0x0e, 0x1b, 0x21, 0x21, 0x1e, 0xb6, 0x27, 0x05, 0x28, + 0x08, 0x35, 0x35, 0x2f, 0x12, 0x1a, 0x33, 0x35, 0x35, 0x64, 0x0e, 0x27, + 0x27, 0x27, 0x02, 0x22, 0x31, 0x35, 0x37, 0x35, 0x04, 0x47, 0x43, 0x35, + 0xe9, 0xd4, 0xa1, 0x23, 0x04, 0x0e, 0x1f, 0x19, 0x1b, 0x30, 0x27, 0x27, + 0x80, 0x3c, 0x1b, 0x1b, 0x1b, 0x25, 0x34, 0x34, 0x34, 0xc3, 0xe9, 0xd4, + 0x34, 0x30, 0x00, 0x12, 0x5a, 0x3a, 0xa0, 0x1a, 0x30, 0x1f, 0x34, 0x33, + 0x1f, 0x01, 0x00, 0xc0, 0x2f, 0x03, 0x02, 0x16, 0x34, 0x34, 0x27, 0x00, + 0x23, 0x00, 0x00, 0xe9, 0x00, 0x02, 0x17, 0x27, 0x04, 0x07, 0x21, 0x1d, + 0x16, 0x0a, 0x02, 0x67, 0x1f, 0x04, 0x01, 0x14, 0x06, 0x14, 0x18, 0x23, + 0x23, 0x23, 0xe9, 0x60, 0x2b, 0x07, 0x06, 0x21, 0x31, 0x33, 0x33, 0x33, + 0xda, 0xe9, 0xd1, 0x06, 0x1f, 0x04, 0x1e, 0x37, 0x33, 0x24, 0x33, 0x00, + 0x5f, 0x1e, 0x1e, 0xe9, 0x1e, 0x28, 0xf0, 0x27, 0x21, 0x65, 0x2d, 0x1e, + 0x2e, 0x33, 0x33, 0x00, 0x30, 0x2a, 0x33, 0x30, 0x1f, 0x30, 0x33, 0x30, + 0x60, 0x0a, 0x27, 0x27, 0x33, 0x0a, 0x04, 0x33, 0x33, 0x03, 0x00, 0x04, + 0x1f, 0x33, 0x16, 0x14, 0x27, 0x25, 0x00, 0x31, 0x31, 0x04, 0x14, 0x2f, + 0x31, 0x0a, 0x1e, 0x0c, 0x23, 0x31, 0x30, 0x0a, 0x27, 0x27, 0x1f, 0x14, + 0x43, 0x2b, 0xe1, 0x25, 0x31, 0x31, 0x04, 0x27, 0x04, 0x00, 0x2b, 0x31, + 0x31, 0x31, 0x18, 0x28, 0x31, 0x31, 0x4d, 0x2a, 0xc1, 0x04, 0x14, 0x1f, + 0x03, 0x25, 0x62, 0x71, 0x18, 0x39, 0x27, 0x01, 0x21, 0x21, 0x21, 0xe9, + 0x14, 0x21, 0x21, 0x29, 0x62, 0x2f, 0x1a, 0x2a, 0x00, 0x68, 0x14, 0x5e, + 0x1e, 0x18, 0x61, 0x23, 0x2a, 0x2f, 0x0c, 0x2f, 0x2a, 0x04, 0x01, 0x2f, + 0x06, 0x1c, 0x0a, 0x81, 0x61, 0x1c, 0x0a, 0x04, 0x00, 0x01, 0x1c, 0x27, + 0x93, 0x04, 0x23, 0x25, 0x7d, 0x14, 0x14, 0x37, 0x06, 0x0c, 0x2b, 0x2f, + 0x2e, 0x28, 0x5f, 0x16, 0x23, 0x23, 0x40, 0x23, 0xe9, 0x23, 0x2c, 0x2f, + 0x2f, 0x22, 0x0a, 0xe0, 0xa5, 0x6d, 0x97, 0x28, 0x2e, 0x2e, 0x29, 0x04, + 0xe8, 0x27, 0x07, 0x04, 0x1d, 0x19, 0x28, 0x25, 0x25, 0x70, 0x25, 0xe9, + 0x07, 0x05, 0x28, 0x2e, 0x2e, 0x2e, 0xd8, 0xe9, 0xd3, 0x18, 0x27, 0x25, + 0x2c, 0x2c, 0x2c, 0xd1, 0xe9, 0xd3, 0x00, 0x26, 0x25, 0x25, 0x25, 0xe9, + 0x78, 0x25, 0x27, 0x22, 0x65, 0x2d, 0x25, 0x28, 0x22, 0x1e, 0x1d, 0x1d, + 0x1d, 0xe9, 0xd2, 0x27, 0x06, 0x18, 0x1c, 0x04, 0x04, 0x04, 0xe9, 0xd3, + 0x26, 0x28, 0x28, 0x67, 0x28, 0xe9, 0xd4, 0x2b, 0x2b, 0x97, 0x4f, 0x3d, + 0x01, 0x2b, 0x2b, 0x2b, 0x0a, 0x22, 0x2b, 0x22, 0x2f, 0xc0, 0x2f, 0x2b, + 0x2b, 0x04, 0x22, 0x2b, 0x2b, 0x1d, 0xe0, 0x1f, 0x07, 0x73, 0x04, 0x22, + 0x28, 0x28, 0x22, 0x45, 0x18, 0x1e, 0x2b, 0x2b, 0x2b, 0xe9, 0x2b, 0x01, + 0x27, 0x25, 0x0a, 0x24, 0x28, 0x04, 0x65, 0x2d, 0x22, 0x25, 0x0a, 0x01, + 0x21, 0x1d, 0x25, 0x21, 0x22, 0x27, 0x85, 0x24, 0x25, 0x25, 0x04, 0x18, + 0xe1, 0x1d, 0xba, 0x65, 0x1d, 0x27, 0x26, 0x18, 0x1d, 0x22, 0x25, 0x27, + 0x04, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0xe9, 0x2c, 0x2b, 0x88, 0x61, 0x20, + 0x25, 0x25, 0x2a, 0x25, 0x01, 0x1d, 0xcc, 0x5d, 0x25, 0x2c, 0x23, 0x52, + 0x32, 0x25, 0x18, 0x61, 0x01, 0x2f, 0x05, 0x2b, 0x23, 0x23, 0x23, 0xe9, + 0x04, 0x23, 0x23, 0x1d, 0x01, 0x0a, 0x26, 0x2e, 0x2e, 0x64, 0x2e, 0xe9, + 0xd1, 0x1d, 0x18, 0x12, 0x20, 0x0a, 0x18, 0x01, 0x04, 0x29, 0x67, 0x1f, + 0x22, 0x0a, 0x04, 0x07, 0x04, 0x04, 0x01, 0x01, 0x16, 0x2f, 0x07, 0x02, + 0x0c, 0x29, 0x1f, 0x1f, 0x22, 0x3f, 0x01, 0x2f, 0x2f, 0x60, 0x2f, 0xe9, + 0xd2, 0x2b, 0x28, 0x25, 0x25, 0x25, 0x30, 0x2b, 0x2c, 0x7f, 0x37, 0x2f, + 0x2c, 0x23, 0x21, 0x23, 0x21, 0x21, 0xe9, 0x21, 0x20, 0x2e, 0x17, 0x05, + 0x6d, 0x2e, 0x35, 0x01, 0x18, 0x1f, 0x05, 0x28, 0x27, 0x18, 0x21, 0x21, + 0x16, 0x27, 0x04, 0x23, 0x21, 0x21, 0x02, 0x1c, 0x0a, 0x04, 0x04, 0x04, + 0x14, 0x01, 0x04, 0x88, 0x26, 0x31, 0x31, 0x31, 0xe9, 0x31, 0x25, 0x1e, + 0x00, 0x1e, 0x0a, 0x01, 0x16, 0x1f, 0x1f, 0x1f, 0x1c, 0x0d, 0x1e, 0x1e, + 0x04, 0x1f, 0x5d, 0x25, 0x2c, 0x21, 0x83, 0x6b, 0x21, 0x1e, 0x1c, 0x01, + 0x2a, 0x27, 0x04, 0x00, 0x20, 0x1e, 0x1c, 0x1d, 0x2e, 0x2e, 0x2c, 0x23, + 0x01, 0x1e, 0x1e, 0x0a, 0x0a, 0x2e, 0x2e, 0x2e, 0x17, 0x87, 0x01, 0x2b, + 0x1e, 0x1e, 0x1e, 0xe9, 0xd4, 0xa1, 0x39, 0x22, 0x2f, 0x27, 0x27, 0x06, + 0x04, 0x1f, 0x27, 0xd1, 0x27, 0x27, 0x27, 0x21, 0x33, 0x33, 0x33, 0xe9, + 0x03, 0x33, 0x2b, 0x1c, 0x14, 0x14, 0x14, 0xe9, 0xd4, 0x0c, 0x14, 0x14, + 0x04, 0x27, 0x3d, 0x02, 0x1f, 0x0c, 0x3e, 0x0c, 0x0c, 0xe9, 0xd4, 0xa1, + 0x27, 0x03, 0x2f, 0x3c, 0x2f, 0x2f, 0xe9, 0xd1, 0x57, 0x0e, 0x2c, 0x1e, + 0x1b, 0x1b, 0x1b, 0x1b, 0xe9, 0xd1, 0x27, 0x1f, 0x04, 0x44, 0x2f, 0x37, + 0x1b, 0x1b, 0x01, 0x26, 0x34, 0x34, 0x4f, 0x34, 0xe9, 0x34, 0x23, 0x27, + 0x21, 0x65, 0x2d, 0x21, 0x34, 0x21, 0x21, 0x17, 0x14, 0x14, 0x14, 0xe9, + 0x68, 0x14, 0x27, 0x05, 0x25, 0x29, 0x01, 0x03, 0x0c, 0x2c, 0x0c, 0x0c, + 0xe9, 0x0c, 0x27, 0x04, 0x2f, 0x19, 0x0e, 0x19, 0x12, 0x03, 0x33, 0x5f, + 0x17, 0x03, 0x22, 0x02, 0x19, 0x19, 0x14, 0x2f, 0x2f, 0x2f, 0xe9, 0x2f, + 0x88, 0x07, 0x35, 0x35, 0x35, 0xe9, 0x35, 0x35, 0x2b, 0x1b, 0x19, 0x19, + 0x19, 0xe9, 0xd2, 0x27, 0x66, 0x25, 0x46, 0x2e, 0x2f, 0x19, 0x19, 0x03, + 0x27, 0x04, 0x21, 0xe8, 0x27, 0x27, 0x07, 0x1e, 0x21, 0x12, 0x0e, 0x0e, + 0x51, 0x0e, 0xe9, 0x0e, 0x27, 0x37, 0x37, 0x37, 0xe9, 0x20, 0x37, 0x23, + 0x29, 0x01, 0x03, 0x0c, 0x0c, 0x0c, 0xb0, 0xe9, 0x0c, 0x65, 0x2d, 0x37, + 0x31, 0x15, 0x15, 0x1c, 0x12, 0x03, 0x35, 0x5f, 0x17, 0x03, 0x22, 0x15, + 0x05, 0x15, 0x14, 0x31, 0x31, 0x31, 0xe9, 0x31, 0x07, 0x86, 0x05, 0x2b, + 0x15, 0x15, 0x15, 0xe9, 0xd3, 0x2d, 0x8b, 0x1e, 0x38, 0x38, 0x38, 0xe9, + 0x38, 0x27, 0x01, 0x7c, 0x03, 0x65, 0x2d, 0x27, 0x27, 0x07, 0x38, 0x38, + 0x07, 0x2c, 0x17, 0x0e, 0x0e, 0x0e, 0xe9, 0xd2, 0x27, 0x87, 0x06, 0x24, + 0x0c, 0x0c, 0x0c, 0xe9, 0xd3, 0x27, 0xe3, 0x07, 0x77, 0x2f, 0x3a, 0x3a, + 0x3a, 0xe9, 0xd2, 0x01, 0x33, 0x2b, 0x1e, 0x1e, 0x33, 0x35, 0x35, 0x7f, + 0x80, 0x37, 0x3a, 0x37, 0x1e, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x0a, 0x22, + 0x15, 0x29, 0x1f, 0x07, 0x2b, 0x11, 0x04, 0x04, 0x20, 0x11, 0x11, 0x1d, + 0x1f, 0x3b, 0x3b, 0x48, 0x3b, 0xe9, 0x3b, 0x2f, 0x2b, 0x11, 0x04, 0x1c, + 0x0c, 0x11, 0x11, 0x0d, 0x2d, 0x65, 0x2d, 0x3b, 0x25, 0x09, 0x11, 0x11, + 0x10, 0x06, 0x21, 0x20, 0x11, 0xd9, 0xc1, 0x27, 0x04, 0x1e, 0x11, 0x11, + 0x06, 0x03, 0x21, 0x28, 0x2d, 0x13, 0x21, 0x32, 0x1d, 0x3c, 0x3c, 0x3c, + 0x81, 0xe9, 0x3c, 0x1e, 0x0f, 0x0f, 0x04, 0x24, 0xe1, 0x58, 0x2d, 0xba, + 0x2d, 0x5d, 0x25, 0x21, 0x0f, 0x0f, 0x26, 0x0e, 0x2d, 0x01, 0x27, 0x0f, + 0x27, 0x07, 0x2b, 0xb3, 0x61, 0x0d, 0xe9, 0x29, 0x0f, 0x03, 0x27, 0x04, + 0x31, 0x3a, 0x10, 0x52, 0x32, 0x0f, 0x06, 0x03, 0x2e, 0x11, 0x3d, 0x3d, + 0x3d, 0xe9, 0x3d, 0x3d, 0x2f, 0x26, 0x18, 0x0d, 0x03, 0x1a, 0x66, 0x26, + 0x3d, 0x27, 0x0e, 0x82, 0x12, 0x09, 0x06, 0x03, 0x0c, 0x39, 0x27, 0x3d, + 0x30, 0x3d, 0x1b, 0x59, 0x01, 0x32, 0x16, 0x04, 0x04, 0x0c, 0x04, 0x03, + 0x03, 0x24, 0x2f, 0x23, 0x0b, 0x0b, 0x21, 0x0b, 0x03, 0x7a, 0x39, 0x32, + 0x32, 0x32, 0x3f, 0xf1, 0x27, 0x24, 0x47, 0x05, 0x3e, 0x3e, 0x3e, 0x23, + 0xf8, 0xc1, 0xa9, 0xd4, 0xa7, 0x24, 0x06, 0x2b, 0x2b, 0x7f, 0x2b, 0xe9, + 0xd3, 0x27, 0x25, 0x09, 0xd4, 0xa1, 0x63, 0x24, 0x27, 0x21, 0x08, 0x08, + 0x08, 0xe9, 0xd4, 0xbf, 0xa1, 0x03, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x84, 0x27, 0x3e, 0x3f, 0x3f, 0x3f, 0x22, 0x03, 0x03, 0x6f, 0x03, 0xe9, + 0xd4, 0x03, 0x61, 0x49, 0xd3, 0x23, 0xff, 0x87, 0x3f, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x07, 0x87, 0x05, 0x2f, 0x14, 0x06, 0x06, 0x27, 0x07, 0x05, + 0x0f, 0x26, 0x26, 0x26, 0x26, 0x27, 0x07, 0x77, 0x2f, 0xf8, 0x07, 0x07, + 0x07, 0x07, 0x02, +}; + +//***************************************************************************** +// +// Background version of vertical "Temperature" image. +// +//***************************************************************************** +const uint8_t g_pui8GettingHotter28x148Mono[] = +{ + IMAGE_FMT_4BPP_COMP, + 28, 0, + 148, 0, + + 15, + 0x00, 0x00, 0x00, + 0x0e, 0x0d, 0x00, + 0x1c, 0x1a, 0x01, + 0x2a, 0x28, 0x01, + 0x38, 0x35, 0x01, + 0x46, 0x42, 0x01, + 0x54, 0x4f, 0x02, + 0x62, 0x5c, 0x02, + 0x70, 0x6a, 0x02, + 0x7e, 0x77, 0x02, + 0x8c, 0x84, 0x03, + 0x9a, 0x91, 0x03, + 0xa8, 0x9e, 0x03, + 0xb6, 0xac, 0x03, + 0xc4, 0xb9, 0x04, + 0xd2, 0xc6, 0x04, + + 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x37, 0x10, 0xbb, 0x32, + 0x20, 0x07, 0x1b, 0xff, 0xff, 0x46, 0x40, 0xe6, 0x07, 0xbf, 0xff, 0xff, + 0x47, 0xff, 0x50, 0x80, 0x1d, 0x05, 0xff, 0xff, 0xff, 0x49, 0xff, 0xd0, + 0x80, 0x1d, 0x08, 0xff, 0xe6, 0xff, 0x48, 0xff, 0xf2, 0x80, 0x25, 0x0b, + 0xff, 0x60, 0xff, 0x40, 0xdf, 0xf4, 0x84, 0x97, 0x40, 0xff, 0x40, 0xbf, + 0x96, 0x0a, 0xff, 0x08, 0xa0, 0xff, 0x43, 0xff, 0x26, 0x07, 0xff, 0xfd, + 0x08, 0xff, 0xcf, 0xff, 0xf0, 0x25, 0x01, 0xef, 0xff, 0x09, 0xff, 0xff, + 0xff, 0x90, 0x25, 0x00, 0x5f, 0x91, 0x20, 0xfc, 0x10, 0x96, 0x03, 0xaf, + 0xff, 0xfe, 0x71, 0x82, 0x2e, 0x02, 0x40, 0x01, 0x44, 0x30, 0x36, 0x00, + 0x10, 0x09, 0xfd, 0x70, 0xa7, 0x00, 0x00, 0x0b, 0xff, 0x41, 0xc0, 0x97, + 0x00, 0x00, 0x07, 0xff, 0xd1, 0x27, 0x81, 0x01, 0x7f, 0xfd, 0x74, 0x44, + 0x44, 0x40, 0x27, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x97, 0x97, 0x27, + 0x80, 0x26, 0x06, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb0, 0xf8, 0x25, 0x5d, + 0x97, 0x4f, 0x01, 0x02, 0x44, 0x44, 0x08, 0x44, 0x44, 0x44, 0x40, 0x05, + 0x07, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xf0, 0x97, 0x97, 0x27, 0x26, + 0x01, 0x06, 0xbb, 0xbb, 0xbb, 0xef, 0xfa, 0x70, 0x25, 0x88, 0x02, 0x09, + 0xff, 0x40, 0x97, 0x00, 0x00, 0x04, 0x20, 0xff, 0xd0, 0x25, 0x02, 0x44, + 0x44, 0x44, 0x5c, 0x20, 0xff, 0xf4, 0x25, 0x07, 0xff, 0xff, 0xff, 0xff, + 0xda, 0x97, 0x94, 0xf1, 0x27, 0x1a, 0x60, 0x25, 0x06, 0x07, 0xbb, 0xbb, + 0xbb, 0xbb, 0x84, 0x2d, 0x65, 0x96, 0x14, 0x02, 0x44, 0x30, 0xd9, 0x40, + 0x1d, 0x07, 0xff, 0x06, 0xb0, 0x00, 0x00, 0xdf, 0xf0, 0x97, 0x91, 0xcf, + 0x4a, 0xf4, 0x35, 0xff, 0xff, 0xe9, 0xff, 0x94, 0x01, 0x52, 0xdf, 0x8c, + 0xf3, 0x23, 0x00, 0x6f, 0x1c, 0xd0, 0xa4, 0x94, 0x0c, 0x23, 0xea, 0x20, + 0x24, 0x00, 0x07, 0x31, 0xff, 0xb0, 0xb5, 0x0a, 0x04, 0x77, 0x60, 0x97, + 0x82, 0x02, 0x24, 0x44, 0x44, 0x44, 0x80, 0x06, 0x3d, 0x04, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x05, 0x02, 0xef, 0xd8, 0x97, 0x01, 0x07, 0x2a, 0x27, + 0x0a, 0xff, 0xed, 0x08, 0xfe, 0xbe, 0xfe, 0x50, 0x25, 0x0b, 0xff, 0x53, + 0x08, 0xff, 0x01, 0xbf, 0x70, 0x97, 0x40, 0xdf, 0x50, 0x20, 0x5f, 0xe0, + 0x27, 0xa1, 0x9f, 0xa0, 0x5f, 0xf3, 0x80, 0x25, 0x08, 0xff, 0xf7, 0x7f, + 0xfc, 0xef, 0xf4, 0x81, 0x25, 0x05, 0xff, 0xf4, 0x3f, 0xff, 0xff, 0x26, + 0x01, 0x00, 0xcf, 0xf4, 0x0d, 0xff, 0xff, 0xd0, 0x96, 0x03, 0x17, 0xd0, + 0x03, 0xdf, 0xfd, 0x30, 0x26, 0x01, 0x2c, 0x04, 0x40, 0x2e, 0x02, 0xb7, + 0x0a, 0x09, 0xfd, 0x41, 0x70, 0x8f, 0x00, 0x00, 0x0b, 0xff, 0xc0, 0x1f, + 0x06, 0x00, 0x00, 0x07, 0xff, 0xd1, 0x27, 0x01, 0x7f, 0x04, 0xfd, 0x74, + 0x44, 0x44, 0x40, 0x27, 0xff, 0xff, 0x1e, 0xff, 0xff, 0xf0, 0x97, 0x97, + 0x27, 0x26, 0x06, 0x03, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb0, 0x25, 0x5d, + 0x84, 0x97, 0x37, 0xbb, 0x32, 0x20, 0x2f, 0x1b, 0xff, 0x10, 0xff, 0x46, + 0xe6, 0x07, 0xbf, 0xff, 0xff, 0x47, 0x20, 0xff, 0x50, 0x1d, 0x05, 0xff, + 0xff, 0xff, 0x49, 0x20, 0xff, 0xd0, 0x1d, 0x08, 0xff, 0xe6, 0xff, 0x48, + 0x20, 0xff, 0xf2, 0x25, 0x0b, 0xff, 0x60, 0xff, 0x40, 0x21, 0xdf, 0xf4, + 0x97, 0x40, 0xff, 0x40, 0xbf, 0x96, 0x02, 0x0a, 0xff, 0xa0, 0xff, 0x43, + 0xff, 0x26, 0x07, 0x02, 0xff, 0xfd, 0xff, 0xcf, 0xff, 0xf0, 0x25, 0x01, + 0x02, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x25, 0x00, 0x48, 0x5f, 0x91, + 0xfc, 0x10, 0x96, 0x03, 0xaf, 0xff, 0x20, 0xfe, 0x71, 0x2e, 0x00, 0x00, + 0x01, 0x44, 0x30, 0xe2, 0x9f, 0x57, 0x0d, 0x58, 0xbb, 0xb7, 0x1f, 0x00, + 0x02, 0x3d, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x05, 0x02, 0x4a, 0xef, 0x91, + 0xff, 0x80, 0x1d, 0x09, 0x9a, 0xff, 0x40, 0xf1, 0x25, 0x0b, 0xff, 0xe8, + 0x44, 0x5a, 0xff, 0x40, 0xf4, 0x25, 0x0a, 0xff, 0x60, 0x00, 0x00, 0xcf, + 0x52, 0xf3, 0x25, 0x05, 0x92, 0xdf, 0xd0, 0x25, 0x00, 0x00, 0x9f, 0xe7, + 0x44, 0x5b, 0xff, 0x74, 0x44, 0x41, 0x84, 0x13, 0x07, 0xff, 0xff, 0xff, + 0xe9, 0xff, 0xf4, 0xf0, 0x97, 0x97, 0x27, 0x24, 0x06, 0xbb, 0xbb, 0xbb, + 0x9c, 0xe9, 0xbb, 0xb3, 0x23, 0x6b, 0xb7, 0x00, 0x00, 0x04, 0x34, 0x44, + 0x44, 0x44, 0x40, 0x36, 0x6e, 0xff, 0x0b, 0xff, 0xff, 0xff, 0xf0, 0x05, + 0x04, 0x9a, 0x97, 0x60, 0x0a, 0x97, 0x0a, 0x0b, 0xff, 0xfe, 0xbb, 0xbb, + 0x23, 0xbb, 0xb0, 0x25, 0x09, 0xff, 0xd1, 0x45, 0x0a, 0x18, 0x04, 0xff, + 0xc0, 0x97, 0x01, 0x6f, 0xfa, 0x44, 0x10, 0x44, 0x44, 0x40, 0x06, 0x7e, + 0xff, 0xff, 0xff, 0x2d, 0xff, 0xf0, 0x05, 0x05, 0x9a, 0x97, 0x0a, 0x97, + 0x80, 0x0a, 0x0b, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, 0xb0, 0x8c, 0x25, 0x09, + 0xff, 0xd1, 0x45, 0x0a, 0x04, 0xff, 0x60, 0xc0, 0x97, 0x01, 0x6f, 0xfa, + 0x44, 0x44, 0x44, 0x40, 0x40, 0x05, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x78, 0xf0, 0x97, 0x97, 0x27, 0x26, 0x06, 0xbb, 0xbb, 0x0f, 0xbb, 0xbb, + 0xbb, 0xb0, 0x25, 0x5d, 0x97, 0x4f, 0x84, 0x03, 0x37, 0xbb, 0x32, 0x20, + 0x07, 0x1b, 0xff, 0x10, 0xff, 0x46, 0xe6, 0x07, 0xbf, 0xff, 0xff, 0x47, + 0x20, 0xff, 0x50, 0x1d, 0x05, 0xff, 0xff, 0xff, 0x49, 0x20, 0xff, 0xd0, + 0x1d, 0x08, 0xff, 0xe6, 0xff, 0x48, 0x20, 0xff, 0xf2, 0x25, 0x0b, 0xff, + 0x60, 0xff, 0x40, 0x21, 0xdf, 0xf4, 0x97, 0x40, 0xff, 0x40, 0xbf, 0x96, + 0x02, 0x0a, 0xff, 0xa0, 0xff, 0x43, 0xff, 0x26, 0x07, 0x02, 0xff, 0xfd, + 0xff, 0xcf, 0xff, 0xf0, 0x25, 0x01, 0x02, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x25, 0x00, 0x48, 0x5f, 0x91, 0xfc, 0x10, 0x96, 0x03, 0xaf, 0xff, + 0x20, 0xfe, 0x71, 0x2c, 0x0b, 0xff, 0xf0, 0x00, 0x01, 0x3f, 0x44, 0x30, + 0x35, 0x92, 0xad, 0x97, 0x97, 0x27, 0x80, 0x24, 0xf7, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x70, 0x93, 0x25, 0xff, 0xff, 0xe9, 0xff, 0xf0, 0x97, 0x97, + 0xff, 0x27, 0x27, 0x27, 0x22, 0x54, 0x2b, 0x97, 0x97, 0xe3, 0x27, 0x27, + 0x05, 0x06, 0x77, 0x70, 0x27, 0x4f, 0xf0, 0x77, 0x2f, 0x07, 0x07, +}; + +//***************************************************************************** +// +// Green horizontal slider image. +// +//***************************************************************************** +const uint8_t g_pui8GreenSlider195x37[] = +{ + IMAGE_FMT_8BPP_COMP, + 195, 0, + 37, 0, + + 63, + 0x04, 0x04, 0x04, + 0x16, 0x16, 0x16, + 0x01, 0x29, 0x01, + 0x20, 0x21, 0x20, + 0x01, 0x3a, 0x01, + 0x17, 0x35, 0x17, + 0x2d, 0x2e, 0x2d, + 0x01, 0x50, 0x01, + 0x23, 0x43, 0x23, + 0x3a, 0x3a, 0x3a, + 0x01, 0x67, 0x01, + 0x2e, 0x4c, 0x2e, + 0x1a, 0x63, 0x1a, + 0x4b, 0x4b, 0x4b, + 0x02, 0x7e, 0x02, + 0x2f, 0x65, 0x2f, + 0x19, 0x76, 0x19, + 0x46, 0x59, 0x46, + 0x02, 0x8b, 0x02, + 0x02, 0x97, 0x02, + 0x5a, 0x5a, 0x5a, + 0x17, 0x90, 0x17, + 0x50, 0x6c, 0x50, + 0x02, 0xa3, 0x02, + 0x05, 0xa4, 0x05, + 0x0a, 0xa6, 0x0a, + 0x68, 0x68, 0x68, + 0x0f, 0xa8, 0x0f, + 0x13, 0xa9, 0x13, + 0x1f, 0xad, 0x1f, + 0x38, 0x9c, 0x38, + 0x73, 0x73, 0x73, + 0x6b, 0x7c, 0x6b, + 0x2a, 0xb1, 0x2a, + 0x7c, 0x7e, 0x7c, + 0x33, 0xb5, 0x33, + 0x4d, 0xa5, 0x4d, + 0x6d, 0x93, 0x6d, + 0x56, 0xa4, 0x56, + 0x63, 0xa0, 0x63, + 0x42, 0xba, 0x42, + 0x89, 0x89, 0x89, + 0x56, 0xb7, 0x56, + 0x4e, 0xbf, 0x4e, + 0x91, 0x91, 0x91, + 0x8f, 0x95, 0x8f, + 0x59, 0xc3, 0x59, + 0x71, 0xb9, 0x71, + 0x9e, 0x9e, 0x9e, + 0x64, 0xc7, 0x64, + 0x87, 0xb4, 0x87, + 0x6c, 0xca, 0x6c, + 0xa8, 0xa8, 0xa8, + 0x75, 0xcd, 0x75, + 0x7b, 0xcf, 0x7b, + 0x82, 0xd2, 0x82, + 0x8d, 0xcf, 0x8d, + 0x8b, 0xd5, 0x8b, + 0x98, 0xce, 0x98, + 0x92, 0xd7, 0x92, + 0x95, 0xd8, 0x95, + 0x9c, 0xdb, 0x9c, + 0xa3, 0xdc, 0xa3, + 0xa9, 0xe0, 0xa9, + + 0x80, 0x07, 0x06, 0x20, 0x32, 0x3a, 0x3d, 0x3d, 0x3c, 0x0f, 0x3c, 0x3b, + 0x3b, 0x3b, 0xe9, 0xd4, 0xa7, 0x5f, 0xff, 0x17, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x39, 0x39, + 0x00, 0x39, 0x37, 0x2f, 0x27, 0x16, 0x0b, 0x03, 0x00, 0x38, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x0b, 0x32, 0x3e, 0x00, 0x3f, 0x3e, 0x3d, 0x3d, 0x3c, + 0x3b, 0x3b, 0x39, 0x3f, 0x39, 0x39, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x07, 0x37, 0x37, 0x37, 0x36, 0x00, 0x35, 0x33, 0x31, 0x24, 0x0f, + 0x05, 0x01, 0x00, 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa3, 0x25, 0x3e, 0x3f, + 0x00, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x39, 0x39, 0x37, 0x3f, 0x37, 0x37, + 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x07, 0x37, 0x36, 0x36, 0x35, + 0x00, 0x35, 0x33, 0x31, 0x2e, 0x2b, 0x28, 0x1e, 0x0f, 0x06, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x00, 0x00, 0x03, 0x32, 0x3f, 0x3f, 0x3f, + 0x3e, 0x3d, 0x3b, 0x00, 0x39, 0x37, 0x37, 0x36, 0x36, 0x35, 0x35, 0x35, + 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc0, 0x07, 0x07, 0x35, 0x33, 0x33, + 0x33, 0x31, 0x2e, 0x00, 0x2e, 0x2b, 0x28, 0x23, 0x21, 0x10, 0x05, 0x01, + 0x0c, 0x01, 0x00, 0x00, 0x00, 0xe9, 0xd2, 0x03, 0x32, 0x00, 0x3f, 0x3f, + 0x3e, 0x3d, 0x3c, 0x39, 0x37, 0x36, 0x03, 0x35, 0x33, 0x33, 0x31, 0x31, + 0x31, 0xe9, 0xd4, 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x80, 0x02, 0x2e, + 0x2e, 0x2e, 0x2b, 0x28, 0x23, 0x21, 0x00, 0x1d, 0x1c, 0x10, 0x06, 0x03, + 0x01, 0x00, 0x00, 0x60, 0x00, 0xe9, 0xd1, 0x32, 0x3e, 0x3e, 0x3e, 0x3d, + 0x08, 0x3b, 0x37, 0x36, 0x33, 0x01, 0x2b, 0x2b, 0x2b, 0xff, 0xe9, 0xd4, + 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, 0x05, 0x28, 0x28, 0x28, 0x23, 0x21, + 0x00, 0x1c, 0x19, 0x17, 0x10, 0x06, 0x03, 0x01, 0x00, 0x20, 0x00, 0x00, + 0xe9, 0x00, 0x25, 0x3d, 0x3d, 0x3d, 0x04, 0x3c, 0x39, 0x37, 0x33, 0x31, + 0x12, 0x23, 0x23, 0x7f, 0x23, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x07, 0x23, 0x21, 0x1d, 0x1b, 0x00, 0x17, 0x13, 0x13, 0x0f, 0x06, + 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x38, 0x3c, 0x3b, + 0x02, 0x3b, 0x37, 0x36, 0x31, 0x2b, 0x28, 0x31, 0x1d, 0x1f, 0x1c, 0x1c, + 0x1c, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x1d, 0x1d, + 0x40, 0x1d, 0xe9, 0x1c, 0x18, 0x17, 0x13, 0x12, 0x10, 0x00, 0x0b, 0x06, + 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x39, 0x39, 0x39, 0x37, + 0x35, 0x31, 0x2b, 0x00, 0x23, 0x21, 0x1c, 0x1b, 0x19, 0x18, 0x18, 0x17, + 0x3f, 0x17, 0x17, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x07, 0x17, + 0x17, 0x18, 0x18, 0x00, 0x19, 0x19, 0x1b, 0x1c, 0x1c, 0x1c, 0x19, 0x17, + 0x00, 0x13, 0x12, 0x12, 0x0e, 0x0f, 0x09, 0x06, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x36, 0x37, 0x36, 0x36, 0x00, 0x33, 0x31, 0x2b, 0x23, 0x1d, + 0x1c, 0x19, 0x18, 0x0f, 0x18, 0x17, 0x17, 0x17, 0xe9, 0xd4, 0xa7, 0x5f, + 0xff, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x05, 0x18, 0x00, 0x18, 0x19, 0x19, 0x19, 0x17, + 0x13, 0x13, 0x12, 0x00, 0x0e, 0x0e, 0x10, 0x11, 0x09, 0x03, 0x01, 0x00, + 0x00, 0x00, 0x16, 0x35, 0x35, 0x35, 0x33, 0x31, 0x2b, 0x00, 0x23, 0x1d, + 0x1c, 0x19, 0x18, 0x17, 0x17, 0x17, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xe0, 0x07, 0x07, 0x07, 0x17, 0x17, 0x18, 0x18, 0x18, 0x00, 0x17, 0x13, + 0x12, 0x0e, 0x0e, 0x0a, 0x0a, 0x16, 0x00, 0x0d, 0x06, 0x01, 0x00, 0x00, + 0x26, 0x33, 0x31, 0x00, 0x31, 0x2e, 0x2b, 0x28, 0x21, 0x1c, 0x19, 0x18, + 0xff, 0x03, 0xdb, 0xb7, 0x6f, 0x27, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x07, 0x13, + 0x12, 0x0e, 0x0a, 0x00, 0x0a, 0x0a, 0x0f, 0x14, 0x09, 0x03, 0x01, 0x00, + 0x00, 0x2a, 0x2e, 0x2e, 0x2e, 0x2b, 0x28, 0x23, 0x1d, 0x3f, 0x1b, 0x18, + 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0x17, 0x13, 0x12, + 0x00, 0x0e, 0x0e, 0x0a, 0x0a, 0x07, 0x0c, 0x1a, 0x0d, 0x00, 0x06, 0x01, + 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x28, 0x07, 0x23, 0x21, 0x1c, 0x19, 0x18, + 0x07, 0xbf, 0x77, 0xff, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x17, 0x13, + 0x12, 0x0e, 0x0a, 0x0a, 0x07, 0x07, 0x00, 0x07, 0x1f, 0x14, 0x09, 0x03, + 0x00, 0x28, 0x28, 0x01, 0x28, 0x28, 0x28, 0x23, 0x1d, 0x1c, 0x18, 0x07, + 0xff, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc0, 0x07, 0x07, 0x17, 0x17, 0x13, + 0x12, 0x0e, 0x0a, 0x00, 0x0a, 0x07, 0x07, 0x04, 0x22, 0x14, 0x09, 0x03, + 0x00, 0x01, 0x23, 0x23, 0x23, 0x23, 0x23, 0x21, 0x1d, 0x3f, 0x1b, 0x18, + 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0x17, 0x17, 0x13, + 0x00, 0x12, 0x0e, 0x0a, 0x07, 0x07, 0x04, 0x04, 0x29, 0x00, 0x1a, 0x09, + 0x03, 0x01, 0x21, 0x21, 0x21, 0x21, 0x0f, 0x21, 0x1d, 0x1c, 0x19, 0x07, + 0xbf, 0x77, 0x2f, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x01, 0x00, 0x13, 0x0e, + 0x0a, 0x0a, 0x07, 0x04, 0x04, 0x05, 0x00, 0x29, 0x1a, 0x0d, 0x06, 0x01, + 0x1d, 0x1d, 0x1d, 0x07, 0x1d, 0x1d, 0x1c, 0x1c, 0x19, 0x07, 0xbf, 0x77, + 0xff, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x17, 0x17, 0x13, 0x12, 0x0e, + 0x0a, 0x07, 0x04, 0x00, 0x04, 0x02, 0x0b, 0x29, 0x1a, 0x0d, 0x06, 0x01, + 0x00, 0x15, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x19, 0x18, 0xff, 0x07, 0xbf, + 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, 0x07, 0x17, 0x13, 0x13, 0x0e, 0x0a, + 0x00, 0x07, 0x07, 0x04, 0x02, 0x02, 0x11, 0x29, 0x1a, 0x0f, 0x0d, 0x06, + 0x01, 0x10, 0x07, 0xbf, 0x77, 0x2f, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, + 0x00, 0x13, 0x13, 0x12, 0x0e, 0x0a, 0x07, 0x04, 0x02, 0x00, 0x02, 0x02, + 0x20, 0x29, 0x1a, 0x0d, 0x06, 0x01, 0x09, 0x08, 0x13, 0x13, 0x13, 0xe9, + 0x13, 0x13, 0x05, 0xff, 0xcd, 0x97, 0x4f, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc0, 0x07, 0x07, + 0x17, 0x17, 0x13, 0x13, 0x12, 0x0e, 0x00, 0x0a, 0x07, 0x04, 0x02, 0x02, + 0x02, 0x08, 0x2d, 0x00, 0x29, 0x1a, 0x09, 0x03, 0x01, 0x03, 0x10, 0x12, + 0x23, 0x12, 0x12, 0xe9, 0x13, 0x13, 0x13, 0x02, 0xe2, 0xff, 0xc6, 0x87, + 0x3f, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xc0, 0x07, 0x03, 0x13, 0x13, 0x12, 0x12, 0x0e, 0x0a, + 0x00, 0x07, 0x04, 0x02, 0x02, 0x02, 0x02, 0x16, 0x30, 0x00, 0x22, 0x14, + 0x09, 0x03, 0x01, 0x03, 0x0b, 0x0e, 0x20, 0x0e, 0x0e, 0xe9, 0x0e, 0x12, + 0x12, 0x12, 0x13, 0x3f, 0x13, 0x13, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, + 0x07, 0x07, 0x05, 0x12, 0x12, 0x0e, 0x00, 0x0e, 0x0a, 0x0a, 0x07, 0x04, + 0x02, 0x02, 0x02, 0x00, 0x02, 0x08, 0x2d, 0x2c, 0x1f, 0x14, 0x09, 0x03, + 0x0a, 0x00, 0x01, 0x06, 0x0c, 0x61, 0x0a, 0xe9, 0x0e, 0x3f, 0x0e, 0x0e, + 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0e, 0x0a, 0x0a, + 0x00, 0x0a, 0x07, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x20, + 0x30, 0x29, 0x1a, 0x0d, 0x06, 0x01, 0x07, 0x00, 0x01, 0x06, 0x0d, 0x0c, + 0x49, 0x31, 0xd4, 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc0, 0x07, 0x05, + 0x07, 0x07, 0x07, 0x04, 0x02, 0x02, 0x40, 0x02, 0xe9, 0x16, 0x34, 0x2c, + 0x22, 0x14, 0x09, 0x00, 0x03, 0x01, 0x00, 0x01, 0x03, 0x09, 0x11, 0x0c, + 0xff, 0x41, 0x29, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x03, + 0x04, 0x04, 0x04, 0x10, 0x02, 0x02, 0x02, 0xe9, 0x02, 0x16, 0x30, 0x30, + 0x00, 0x29, 0x1a, 0x0d, 0x06, 0x01, 0x00, 0x00, 0x00, 0x07, 0x01, 0x06, + 0x09, 0x11, 0x0c, 0x23, 0x09, 0xd4, 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x83, 0x07, 0x04, 0x04, 0x02, 0x02, 0x02, 0xe9, 0xd1, 0x00, 0x16, 0x30, + 0x30, 0x29, 0x1f, 0x14, 0x09, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x06, 0x0d, 0x3f, 0x1a, 0x0f, 0x17, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfc, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x05, 0x08, 0x20, 0x00, 0x34, 0x30, 0x2c, 0x1f, 0x14, + 0x09, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x09, + 0x0f, 0x0d, 0x1a, 0x16, 0x08, 0x07, 0xbf, 0x77, 0x2f, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x08, 0x00, 0x16, 0x2d, 0x34, 0x30, 0x29, 0x1f, 0x14, 0x0d, + 0x02, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0xe9, 0x01, 0x00, 0x03, 0x09, + 0x0d, 0x1a, 0x22, 0x20, 0x11, 0x08, 0x7f, 0x05, 0x02, 0xe2, 0xc6, 0x87, + 0x3f, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xf8, 0x07, 0x07, 0x07, 0x07, 0x01, 0x05, 0x0b, 0x16, 0x00, 0x22, 0x30, + 0x34, 0x30, 0x2c, 0x29, 0x1f, 0x14, 0x01, 0x0d, 0x06, 0x03, 0x01, 0x00, + 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x01, 0x03, 0x09, 0x0d, 0x14, 0x1f, + 0x01, 0x22, 0x2c, 0x30, 0x30, 0x34, 0x34, 0x34, 0xe9, 0xff, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xc0, 0x07, 0x07, 0x30, 0x30, 0x2c, 0x29, 0x22, 0x1a, + 0x00, 0x14, 0x09, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0xc0, 0xe9, 0xd2, + 0x01, 0x03, 0x06, 0x09, 0x0d, 0x1a, 0x01, 0x1f, 0x22, 0x29, 0x29, 0x2c, + 0x2c, 0x2c, 0xe9, 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc0, 0x07, 0x05, + 0x29, 0x29, 0x22, 0x1f, 0x1a, 0x14, 0x00, 0x0d, 0x09, 0x06, 0x03, 0x01, + 0x00, 0x00, 0x00, 0xc0, 0xe9, 0xd4, 0x01, 0x01, 0x06, 0x09, 0x0d, 0x0d, + 0x03, 0x14, 0x1a, 0x1a, 0x1f, 0x1f, 0x1f, 0xe9, 0xd4, 0xff, 0xa7, 0x5f, + 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x80, 0x05, 0x1a, 0x1a, 0x14, 0x14, 0x0d, 0x09, 0x06, + 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x03, 0x06, 0x06, 0x09, 0x0f, 0x09, 0x0d, 0x0d, 0x0d, 0xe9, + 0xd4, 0xa7, 0x5f, 0xff, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x00, 0x09, 0x09, + 0x06, 0x03, 0x01, 0x01, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa4, 0x01, + 0x01, 0x01, 0x03, 0x0f, 0x03, 0x06, 0x06, 0x06, 0xe9, 0xd4, 0xa7, 0x5f, + 0xff, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x01, 0x03, 0x03, 0x01, 0x01, 0x00, + 0x00, 0x00, 0xe9, 0xc1, 0xd4, 0xa7, 0x00, 0x00, 0x01, 0x01, 0x01, 0xe9, + 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe3, 0x07, 0x07, 0x02, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfc, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x06, +}; + +//***************************************************************************** +// +// Red horizontal slider image. +// +//***************************************************************************** +const uint8_t g_pui8RedSlider195x37[] = +{ + IMAGE_FMT_8BPP_COMP, + 195, 0, + 37, 0, + + 63, + 0x04, 0x04, 0x04, + 0x00, 0x00, 0x40, + 0x16, 0x16, 0x16, + 0x00, 0x00, 0x5b, + 0x0c, 0x0c, 0x48, + 0x23, 0x23, 0x23, + 0x00, 0x00, 0x7c, + 0x20, 0x20, 0x35, + 0x15, 0x15, 0x52, + 0x00, 0x00, 0x93, + 0x2e, 0x2e, 0x2e, + 0x00, 0x00, 0xa1, + 0x00, 0x00, 0xb4, + 0x27, 0x27, 0x59, + 0x00, 0x00, 0xc7, + 0x14, 0x14, 0x9d, + 0x3d, 0x3d, 0x3e, + 0x25, 0x25, 0x79, + 0x00, 0x00, 0xd9, + 0x1f, 0x1f, 0xa3, + 0x00, 0x00, 0xec, + 0x13, 0x13, 0xc3, + 0x00, 0x00, 0xf3, + 0x00, 0x00, 0xfa, + 0x30, 0x30, 0x8a, + 0x4c, 0x4c, 0x4c, + 0x00, 0x00, 0xff, + 0x46, 0x46, 0x65, + 0x05, 0x05, 0xff, + 0x0b, 0x0b, 0xff, + 0x11, 0x11, 0xff, + 0x5a, 0x5a, 0x5a, + 0x50, 0x50, 0x7e, + 0x21, 0x21, 0xff, + 0x36, 0x36, 0xd5, + 0x68, 0x68, 0x68, + 0x32, 0x32, 0xff, + 0x73, 0x73, 0x73, + 0x6b, 0x6b, 0x88, + 0x51, 0x51, 0xd4, + 0x67, 0x67, 0xb6, + 0x4c, 0x4c, 0xff, + 0x55, 0x55, 0xef, + 0x85, 0x85, 0x85, + 0x5a, 0x5a, 0xff, + 0x8e, 0x8e, 0x96, + 0x91, 0x91, 0x91, + 0x63, 0x63, 0xff, + 0x70, 0x70, 0xe3, + 0x93, 0x93, 0x9e, + 0x6b, 0x6b, 0xff, + 0x9b, 0x9b, 0x9b, + 0x86, 0x86, 0xcd, + 0x74, 0x74, 0xff, + 0xa0, 0xa0, 0xa2, + 0x7a, 0x7a, 0xfe, + 0x81, 0x81, 0xff, + 0xa8, 0xa8, 0xa8, + 0x8c, 0x8c, 0xf6, + 0x8a, 0x8a, 0xff, + 0x97, 0x97, 0xee, + 0x91, 0x91, 0xff, + 0x9a, 0x9a, 0xff, + 0xa5, 0xa5, 0xfe, + + 0x80, 0x07, 0x07, 0x26, 0x34, 0x3c, 0x3e, 0x3e, 0x3e, 0x1f, 0x3d, 0x3d, + 0x3d, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0x3b, 0x3b, 0x3b, + 0x00, 0x38, 0x30, 0x28, 0x20, 0x0d, 0x02, 0x00, 0x00, 0x70, 0x00, 0xe9, + 0xd4, 0xa7, 0x10, 0x34, 0x3f, 0x3f, 0x00, 0x3f, 0x3e, 0x3e, 0x3d, 0x3d, + 0x3d, 0x3b, 0x3b, 0x7f, 0x3b, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, + 0x07, 0x38, 0x38, 0x38, 0x37, 0x35, 0x00, 0x32, 0x2f, 0x27, 0x18, 0x07, + 0x02, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa3, 0x28, 0x3f, 0x3f, 0x3f, + 0x00, 0x3f, 0x3e, 0x3e, 0x3d, 0x3b, 0x3b, 0x38, 0x38, 0x7f, 0x38, 0xe9, + 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, 0x07, 0x38, 0x37, 0x37, 0x35, 0x35, + 0x00, 0x32, 0x2f, 0x2c, 0x29, 0x29, 0x22, 0x11, 0x02, 0x0c, 0x02, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0x00, 0x07, 0x00, 0x34, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3e, 0x3d, 0x3b, 0x01, 0x38, 0x38, 0x37, 0x37, 0x35, 0x35, 0x35, 0xe9, + 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x80, 0x07, 0x35, 0x32, 0x32, 0x32, + 0x2f, 0x2c, 0x2c, 0x00, 0x29, 0x24, 0x24, 0x21, 0x13, 0x07, 0x02, 0x02, + 0x18, 0x00, 0x00, 0x00, 0xe9, 0xd2, 0x07, 0x34, 0x3f, 0x00, 0x3f, 0x3f, + 0x3e, 0x3e, 0x3b, 0x38, 0x37, 0x35, 0x07, 0x32, 0x32, 0x2f, 0x2f, 0x2f, + 0xe9, 0xd4, 0xa7, 0xff, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x01, 0x00, 0x2c, 0x2c, + 0x2c, 0x2c, 0x29, 0x29, 0x24, 0x24, 0x00, 0x21, 0x1e, 0x13, 0x07, 0x02, + 0x02, 0x00, 0x00, 0x60, 0x00, 0xe9, 0xd1, 0x34, 0x3f, 0x3f, 0x3e, 0x3e, + 0x05, 0x3d, 0x38, 0x37, 0x32, 0x2f, 0x0a, 0x29, 0xe9, 0xff, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xc0, 0x07, 0x07, 0x24, 0x24, 0x21, 0x1e, 0x1d, 0x1a, + 0x01, 0x13, 0x0a, 0x05, 0x02, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x28, + 0x3e, 0x3e, 0x3e, 0x3d, 0x3b, 0x38, 0x2f, 0x32, 0x2f, 0x1b, 0x24, 0xe9, + 0xd4, 0xa7, 0x5f, 0xff, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x24, 0x00, 0x24, 0x21, + 0x21, 0x1e, 0x1a, 0x16, 0x14, 0x18, 0x00, 0x0a, 0x05, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0d, 0x3a, 0x3d, 0x3d, 0x3d, 0x38, 0x37, 0x2f, + 0x27, 0x29, 0x29, 0x32, 0x1e, 0x1e, 0xe9, 0xd4, 0xa7, 0xff, 0x5f, 0x17, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x05, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x1e, 0x1c, 0x16, + 0x00, 0x14, 0x12, 0x15, 0x1b, 0x0a, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x3b, 0x3b, 0x3b, 0x38, 0x00, 0x35, 0x2f, 0x29, 0x24, 0x21, + 0x1e, 0x1e, 0x1d, 0x0f, 0x1c, 0x1a, 0x1a, 0x1a, 0xe9, 0xd4, 0xa7, 0x5f, + 0xff, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x02, 0x1c, 0x00, 0x1c, 0x1d, 0x1d, 0x1e, 0x1e, + 0x1e, 0x1c, 0x17, 0x00, 0x14, 0x12, 0x12, 0x0e, 0x18, 0x10, 0x0a, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x37, 0x38, 0x37, 0x37, 0x00, 0x32, 0x2f, + 0x29, 0x24, 0x21, 0x1e, 0x1d, 0x1c, 0x1f, 0x1a, 0x1a, 0x1a, 0xe9, 0xd4, + 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x1c, 0x1c, 0x00, 0x1c, 0x1d, + 0x1c, 0x1a, 0x16, 0x14, 0x12, 0x0e, 0x00, 0x0c, 0x0f, 0x1b, 0x10, 0x05, + 0x02, 0x00, 0x00, 0x00, 0x20, 0x35, 0x35, 0x35, 0x32, 0x2c, 0x29, 0x24, + 0x27, 0x21, 0x1e, 0x39, 0x1a, 0x1a, 0xe9, 0xd4, 0xa7, 0xff, 0x5f, 0x17, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x00, 0x1a, 0x1a, 0x1c, 0x1c, 0x1a, 0x17, 0x14, 0x12, + 0x00, 0x0e, 0x0c, 0x0c, 0x0b, 0x20, 0x19, 0x0a, 0x02, 0x00, 0x00, 0x00, + 0x27, 0x32, 0x2f, 0x2f, 0x2c, 0x29, 0x07, 0x24, 0x21, 0x1e, 0x1d, 0x1c, + 0x03, 0xdb, 0xb7, 0xff, 0x6f, 0x27, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x80, 0x06, 0x16, + 0x14, 0x12, 0x0e, 0x0c, 0x0b, 0x09, 0x00, 0x18, 0x1f, 0x10, 0x05, 0x02, + 0x00, 0x2a, 0x2c, 0x00, 0x2c, 0x2c, 0x29, 0x29, 0x24, 0x21, 0x1d, 0x1c, + 0xff, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, 0x07, 0x1a, 0x16, + 0x12, 0x0e, 0x0c, 0x00, 0x0b, 0x09, 0x09, 0x11, 0x23, 0x19, 0x0a, 0x02, + 0x00, 0x00, 0x29, 0x29, 0x29, 0x29, 0x29, 0x24, 0x21, 0x3f, 0x1e, 0x1c, + 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0x1a, 0x1a, 0x16, + 0x00, 0x12, 0x0e, 0x0c, 0x0b, 0x09, 0x06, 0x06, 0x25, 0x00, 0x1f, 0x0a, + 0x02, 0x00, 0x29, 0x29, 0x29, 0x29, 0x07, 0x24, 0x24, 0x21, 0x1e, 0x1c, + 0x07, 0xbf, 0x77, 0xff, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x1a, 0x17, + 0x14, 0x12, 0x0e, 0x0b, 0x09, 0x06, 0x00, 0x06, 0x03, 0x2b, 0x1f, 0x10, + 0x05, 0x02, 0x24, 0x01, 0x24, 0x24, 0x24, 0x24, 0x21, 0x21, 0x1d, 0x07, + 0xff, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc0, 0x07, 0x07, 0x1a, 0x1a, 0x17, + 0x14, 0x0e, 0x0c, 0x00, 0x0b, 0x06, 0x06, 0x03, 0x03, 0x2b, 0x23, 0x10, + 0x00, 0x05, 0x02, 0x24, 0x24, 0x21, 0x21, 0x21, 0x21, 0x3f, 0x1e, 0x1d, + 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0x1a, 0x17, 0x16, + 0x00, 0x14, 0x0e, 0x0c, 0x09, 0x06, 0x03, 0x03, 0x08, 0x00, 0x2b, 0x23, + 0x19, 0x05, 0x02, 0x21, 0x21, 0x21, 0x07, 0x21, 0x21, 0x1e, 0x1e, 0x1c, + 0x07, 0xbf, 0x77, 0xff, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x1a, 0x17, + 0x14, 0x12, 0x0c, 0x0b, 0x06, 0x03, 0x00, 0x03, 0x01, 0x0d, 0x2e, 0x23, + 0x19, 0x0a, 0x02, 0x0b, 0x15, 0x1d, 0x1d, 0x1d, 0xe9, 0x1c, 0x07, 0xbf, + 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x80, 0x07, 0x17, 0x16, 0x14, 0x0e, + 0x0b, 0x09, 0x06, 0x00, 0x03, 0x01, 0x01, 0x1b, 0x2e, 0x23, 0x19, 0x0a, + 0x03, 0x02, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x49, 0xda, 0xff, 0x02, 0xd4, + 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x01, 0x17, 0x16, 0x14, 0x12, + 0x00, 0x0c, 0x09, 0x06, 0x03, 0x01, 0x01, 0x01, 0x26, 0x00, 0x2b, 0x23, + 0x19, 0x05, 0x02, 0x0d, 0x14, 0x14, 0x41, 0x14, 0xe9, 0x16, 0x16, 0x16, + 0x17, 0x17, 0x01, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, + 0x06, 0x17, 0x17, 0x16, 0x14, 0x12, 0x00, 0x0e, 0x0b, 0x06, 0x03, 0x01, + 0x01, 0x01, 0x0d, 0x00, 0x2d, 0x2b, 0x23, 0x10, 0x05, 0x02, 0x05, 0x15, + 0x10, 0x12, 0x12, 0x12, 0xe9, 0x14, 0x14, 0x16, 0x16, 0x07, 0x17, 0x17, + 0x1a, 0x1a, 0x1a, 0xe9, 0xd4, 0xa7, 0xff, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x02, + 0x00, 0x17, 0x17, 0x16, 0x14, 0x12, 0x12, 0x0c, 0x0b, 0x00, 0x06, 0x03, + 0x01, 0x01, 0x01, 0x01, 0x20, 0x33, 0x00, 0x2b, 0x1f, 0x10, 0x05, 0x02, + 0x05, 0x0d, 0x0e, 0x20, 0x0e, 0x0e, 0xe9, 0x0e, 0x12, 0x12, 0x12, 0x14, + 0x3f, 0x14, 0x14, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x05, + 0x12, 0x12, 0x0e, 0x00, 0x0e, 0x0c, 0x09, 0x06, 0x03, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x0d, 0x2d, 0x2e, 0x25, 0x1f, 0x0a, 0x02, 0x01, 0x00, 0x02, + 0x0a, 0x13, 0x0c, 0x0c, 0x0c, 0xe9, 0x8f, 0xd1, 0x0e, 0x0e, 0x0e, 0xe9, + 0xd4, 0xa7, 0x5f, 0xff, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x0c, 0x00, 0x0c, 0x0b, + 0x09, 0x06, 0x03, 0x03, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x26, 0x36, + 0x2b, 0x23, 0x19, 0x00, 0x0a, 0x02, 0x00, 0x02, 0x05, 0x10, 0x0f, 0x0b, + 0x00, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x7f, 0x0b, 0xe9, + 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x05, 0x09, 0x09, 0x06, 0x06, + 0x04, 0x06, 0x03, 0x01, 0x01, 0x01, 0xe9, 0x20, 0x39, 0x00, 0x2e, 0x25, + 0x1f, 0x10, 0x05, 0x02, 0x00, 0x02, 0x0f, 0x05, 0x0a, 0x1b, 0x0f, 0x3a, + 0x21, 0xd4, 0xa7, 0xff, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x81, 0x02, 0x03, + 0x03, 0x03, 0x01, 0x01, 0x01, 0xe9, 0x00, 0x01, 0x1b, 0x36, 0x33, 0x2b, + 0x23, 0x19, 0x0a, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x05, 0x10, 0x1b, + 0x7f, 0x11, 0x23, 0x09, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x03, 0x03, 0x01, 0x30, 0x01, 0x01, 0xe9, 0xd1, 0x20, 0x36, 0x36, 0x2e, + 0x00, 0x25, 0x1f, 0x10, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, + 0x0a, 0x19, 0x23, 0x11, 0x17, 0xd4, 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xc0, 0x07, 0x05, 0x0d, 0x26, 0x39, 0x36, 0x2e, 0x25, 0x00, 0x1f, 0x10, + 0x0a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x0a, 0x19, + 0x23, 0x20, 0x0d, 0xff, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, + 0x07, 0x0d, 0x20, 0x31, 0x39, 0x33, 0x00, 0x2e, 0x25, 0x1f, 0x19, 0x0a, + 0x02, 0x02, 0x00, 0x20, 0x00, 0x00, 0xe9, 0x02, 0x05, 0x10, 0x19, 0x23, + 0x07, 0x25, 0x25, 0x1b, 0x0d, 0x04, 0x02, 0xe2, 0xc6, 0xff, 0x87, 0x3f, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x80, 0x01, 0x08, 0x0d, 0x20, 0x26, 0x36, 0x39, 0x36, + 0x00, 0x2e, 0x2b, 0x25, 0x1f, 0x19, 0x0a, 0x05, 0x02, 0x10, 0x00, 0x00, + 0x00, 0xe9, 0x00, 0x00, 0x02, 0x05, 0x00, 0x0a, 0x19, 0x1f, 0x25, 0x2b, + 0x2e, 0x33, 0x36, 0x0f, 0x36, 0x39, 0x39, 0x39, 0xe9, 0xd4, 0xa7, 0x5f, + 0xff, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x05, 0x36, 0x00, 0x36, 0x33, 0x2e, 0x2b, 0x25, + 0x23, 0x1f, 0x10, 0x03, 0x0a, 0x05, 0x02, 0x00, 0x00, 0x00, 0xe9, 0xd2, + 0x00, 0x02, 0x05, 0x0a, 0x10, 0x19, 0x23, 0x25, 0x25, 0x07, 0x2b, 0x2b, + 0x2e, 0x2e, 0x2e, 0xe9, 0xd4, 0xa7, 0xff, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, + 0x00, 0x2b, 0x2b, 0x2b, 0x25, 0x23, 0x1f, 0x19, 0x10, 0x03, 0x0a, 0x02, + 0x02, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x00, 0x02, 0x02, 0x05, 0x0a, 0x10, + 0x19, 0x1f, 0x23, 0x0f, 0x23, 0x25, 0x25, 0x25, 0xe9, 0xd4, 0xa7, 0x5f, + 0xff, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x05, 0x23, 0x00, 0x23, 0x1f, 0x1f, 0x19, 0x10, + 0x0a, 0x05, 0x02, 0x0c, 0x02, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x05, 0x05, 0x0a, 0x10, 0x10, 0x19, 0x3f, 0x19, 0x19, + 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0x10, 0x10, 0x0a, + 0x01, 0x0a, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa4, + 0x02, 0x02, 0x02, 0x05, 0x05, 0x0a, 0x3f, 0x0a, 0x0a, 0xe9, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x02, 0x07, 0x02, 0x02, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x3f, 0x00, 0x00, 0x31, 0x19, 0xd4, + 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x02, 0x00, 0x3f, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xc0, 0x07, 0x06, +}; diff --git a/boards/dk-tm4c129x/grlib_demo/images.h b/boards/dk-tm4c129x/grlib_demo/images.h new file mode 100644 index 0000000..9a3ed1d --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/images.h @@ -0,0 +1,43 @@ +//***************************************************************************** +// +// images.h - Prototypes for the images used by the application. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __IMAGES_H__ +#define __IMAGES_H__ + +//***************************************************************************** +// +// Prototypes for the image arrays. +// +//***************************************************************************** +extern const uint8_t g_ui8Logo[]; +extern const uint8_t g_pui8LightOff[]; +extern const uint8_t g_pui8LightOn[]; +extern const uint8_t g_pui8Blue50x50[]; +extern const uint8_t g_pui8Blue50x50Press[]; +extern const uint8_t g_pui8RedSlider195x37[]; +extern const uint8_t g_pui8GreenSlider195x37[]; +extern const uint8_t g_pui8GettingHotter28x148[]; +extern const uint8_t g_pui8GettingHotter28x148Mono[]; + +#endif // __IMAGES_H__ diff --git a/boards/dk-tm4c129x/grlib_demo/readme.txt b/boards/dk-tm4c129x/grlib_demo/readme.txt new file mode 100644 index 0000000..fba020b --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/readme.txt @@ -0,0 +1,70 @@ +Graphics Library Demonstration + +This application provides a demonstration of the capabilities of the +TivaWare Graphics Library. A series of panels show different features of +the library. For each panel, the bottom provides a forward and back button +(when appropriate), along with a brief description of the contents of the +panel. + +The first panel provides some introductory text and basic instructions for +operation of the application. + +The second panel shows the available drawing primitives: lines, circles, +rectangles, strings, and images. + +The third panel shows the canvas widget, which provides a general drawing +surface within the widget hierarchy. A text, image, and application-drawn +canvas are displayed. + +The fourth panel shows the check box widget, which provides a means of +toggling the state of an item. Three check boxes are provided, with each +having a red ``LED'' to the right. The state of the LED tracks the state +of the check box via an application callback. + +The fifth panel shows the container widget, which provides a grouping +construct typically used for radio buttons. Containers with a title, a +centered title, and no title are displayed. + +The sixth panel shows the push button widget. Two rows of push buttons +are provided; the appearance of each row is the same but the top row +does not utilize auto-repeat while the bottom row does. Each push button +has a red ``LED'' beneath it, which is toggled via an application callback +each time the push button is pressed. While holding down any of +auto-repeat buttons, the ``LED'' for that button should be toggled as long +as the button is being held down. + +The seventh panel shows the radio button widget. Two groups of radio +buttons are displayed, the first using text and the second using images for +the selection value. Each radio button has a red ``LED'' to its right, +which tracks the selection state of the radio buttons via an application +callback. Only one radio button from each group can be selected at a time, +though the radio buttons in each group operate independently. + +The eighth and final panel shows the slider widget. Six sliders +constructed using the various supported style options are shown. The +slider value callback is used to update two widgets to reflect the values +reported by sliders. A canvas widget near the top right of the display +tracks the value of the red and green image-based slider to its left and +the text of the grey slider on the left side of the panel is update to show +its own value. The slider on the right is configured as an indicator +which tracks the state of the upper slider and ignores user input. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/grlib_demo/rvmdk/grlib_demo.axf b/boards/dk-tm4c129x/grlib_demo/rvmdk/grlib_demo.axf new file mode 100644 index 0000000..ffcbdc0 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_demo/rvmdk/grlib_demo.axf differ diff --git a/boards/dk-tm4c129x/grlib_demo/rvmdk/grlib_demo.bin b/boards/dk-tm4c129x/grlib_demo/rvmdk/grlib_demo.bin new file mode 100644 index 0000000..9a5a6dd Binary files /dev/null and b/boards/dk-tm4c129x/grlib_demo/rvmdk/grlib_demo.bin differ diff --git a/boards/dk-tm4c129x/grlib_demo/startup_ccs.c b/boards/dk-tm4c129x/grlib_demo/startup_ccs.c new file mode 100644 index 0000000..30b1a9a --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SoundIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + SoundIntHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/grlib_demo/startup_ewarm.c b/boards/dk-tm4c129x/grlib_demo/startup_ewarm.c new file mode 100644 index 0000000..5694146 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SoundIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + SoundIntHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/grlib_demo/startup_gcc.c b/boards/dk-tm4c129x/grlib_demo/startup_gcc.c new file mode 100644 index 0000000..12e19b0 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SoundIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + SoundIntHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/grlib_demo/startup_rvmdk.S b/boards/dk-tm4c129x/grlib_demo/startup_rvmdk.S new file mode 100644 index 0000000..78d5a58 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_demo/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SoundIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD SoundIntHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/grlib_driver_test/Makefile b/boards/dk-tm4c129x/grlib_driver_test/Makefile new file mode 100644 index 0000000..183be2a --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/Makefile @@ -0,0 +1,93 @@ +#****************************************************************************** +# +# Makefile - Rules for building the A command-line driven testcase to aid development of GrLib display drivers. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the A command-line driven testcase to aid development of GrLib display drivers to be built. +# +all: ${COMPILER} +all: ${COMPILER}/grlib_driver_test.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the A command-line driven testcase to aid development of GrLib display drivers. +# +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/cmdline.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/grlib_driver_test.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/images.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/pinout.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/uartstdio.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/ustdlib.o +${COMPILER}/grlib_driver_test.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/grlib_driver_test.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/grlib_driver_test.axf: grlib_driver_test.ld +SCATTERgcc_grlib_driver_test=grlib_driver_test.ld +ENTRY_grlib_driver_test=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsimportspec b/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsimportspec new file mode 100644 index 0000000..01de889 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsimportspec @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsproject b/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/.cproject b/boards/dk-tm4c129x/grlib_driver_test/ccs/.cproject new file mode 100644 index 0000000..a50ef9c --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/.project b/boards/dk-tm4c129x/grlib_driver_test/ccs/.project new file mode 100644 index 0000000..2d8a647 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/.project @@ -0,0 +1,80 @@ + + + grlib_driver_test + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + grlib_driver_test.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.c + + + grlib_driver_test_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test_ccs.cmd + + + images.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_driver_test/images.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_driver_test/startup_ccs.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/cmdline.c + 1 + SW_ROOT/utils/cmdline.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/grlib_driver_test/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.bin b/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.bin new file mode 100644 index 0000000..e8beac8 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.bin differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.out b/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.out new file mode 100644 index 0000000..93d8cb5 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.out differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/macros.ini_initial b/boards/dk-tm4c129x/grlib_driver_test/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/target_config.ccxml b/boards/dk-tm4c129x/grlib_driver_test/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/driver_config.h b/boards/dk-tm4c129x/grlib_driver_test/driver_config.h new file mode 100644 index 0000000..10c8ced --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/driver_config.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// driver_config.h - Modify this header file to tailor grlib_driver_test for +// operation with your board and graphics display driver. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __DRIVER_CONFIG_H__ +#define __DRIVER_CONFIG_H__ + +//***************************************************************************** +// +// TODO: Include the header file for your display driver here. The default +// driver is for the QVGA display on the DK-TM4C129X board. If your +// driver is dependent upon any other headers, include them here too. +// This may be the case if, for example, you are using a raster mode +// display and you have a header containing the timing parameters for +// the screen. +// +//***************************************************************************** +#include "drivers/kentec320x240x16_ssd2119.h" + +//***************************************************************************** +// +// These two headers are required by the default implementation and can likely +// be removed or reworked when you update the application to run on a custom +// board. +// +//***************************************************************************** +#include "drivers/frame.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +// TODO: Set DRIVER_NAME to the name of the tDisplay structure exported by +// your display driver. +// +//***************************************************************************** +#define DRIVER_NAME g_sKentec320x240x16_SSD2119 + +//***************************************************************************** +// +// TODO: Set DRIVER_SYS_CLOCK_CONFIG to the value you require for your system. +// This is the first parameter that is passed to the SysCtlClockFreqSet +// function. +// +//***************************************************************************** +#define DRIVER_SYS_CLOCK_CONFIG (SYSCTL_XTAL_25MHZ | \ + SYSCTL_OSC_MAIN | \ + SYSCTL_USE_PLL | \ + SYSCTL_CFG_VCO_480) + +//***************************************************************************** +// +// TODO: Set DRIVER_SYS_CLOCK_FREQUENCY to the value you require for your +// system. This is the second parameter that is passed to the +// SysCtlClockFreqSet function and represents the desired system clock +// frequency. +// +//***************************************************************************** +#define DRIVER_SYS_CLOCK_FREQUENCY 120000000 + +//***************************************************************************** +// +// TODO: Define the color depth of the display driver's frame buffer. If this +// value is 16 or greater, any operations involving the driver color +// palette will be compiled out of the test. If it is 8 or lower, make +// sure you also define the macro DRIVER_PALETTE_SET to allow the +// application to set colors in the driver's color lookup table. +// +//***************************************************************************** +#define DRIVER_BPP 16 + +#if (DRIVER_BPP < 16) +//***************************************************************************** +// +// TODO: This macro must be defined if your display driver uses a palettized +// pixel format and a global color lookup table. Parameter pui32Color +// points to an array of 32-bit values each containing and RGB888 color +// definition. ui32Index is the starting palette index in the driver's +// color table that will be changed and ui32NumEntries indicates both the +// number of colors in the array pointed to by pui32Color and the number +// of driver color palette locations that are to be written. +// +//***************************************************************************** +#define DRIVER_PALETTE_SET(pui32Color, ui32Index, ui32NumEntries) \ + YourDriverPaletteSet((pui32Color), (ui32Index), (ui32NumEntries)); + +#endif + +//***************************************************************************** +// +// TODO: This macro must be defined to perform all necessary hardware and +// software initialization for your display driver. This will typically +// involve configuring the LCD controller into the relevant mode for +// the driver, setting peripheral pin muxing, configuring the EPI and +// SDRAM if your driver uses raster mode and requires a frame buffer in +// EPI-connected memory and setting a default color palette if needed. +// +// The ui32SysClock parameter provides the configured system clock rate +// in Hz. +// +//***************************************************************************** +#define DRIVER_INIT(ui32SysClock) \ +{ \ + PinoutSet(); \ + Kentec320x240x16_SSD2119Init(ui32SysClock); \ +} + +//***************************************************************************** +// +// We allow the testcase to be built such that it issues no drawing orders +// other than those requested via the command line. This can be helpful +// when bringing up a new display driver. +// +//***************************************************************************** +//#define NO_GRLIB_CALLS_ON_STARTUP + +#endif diff --git a/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.bin b/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.bin new file mode 100644 index 0000000..8b41d40 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.bin differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.out b/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.out new file mode 100644 index 0000000..9fb846a Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.out differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.axf b/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.axf new file mode 100644 index 0000000..e218a2f Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.axf differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.bin b/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.bin new file mode 100644 index 0000000..239522e Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.bin differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.c b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.c new file mode 100644 index 0000000..c6ceafe --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.c @@ -0,0 +1,2544 @@ +//***************************************************************************** +// +// grlib_driver_test.c - A test tool intended to aid developers of drivers +// for the TivaWare Graphics Library +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_gpio.h" +#include "inc/hw_ints.h" +#include "inc/hw_lcd.h" +#include "driverlib/sysctl.h" +#include "driverlib/gpio.h" +#include "driverlib/lcd.h" +#include "driverlib/interrupt.h" +#include "driverlib/systick.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "utils/cmdline.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "images.h" +#include "driver_config.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Graphics Driver Test Tool (grlib_driver_test)

      +//! +//! This application provides a simple, command-line tool to aid in +//! debugging TivaWare Graphics Library display drivers. As shipped in +//! TivaWare, it is configured to operate with a DK-TM4C129X board using its +//! QVGA display. The code is written, however, to allow easy retargeting to +//! other boards and display drivers via modifications to the driver_config.h +//! header file. +//! +//! The tool is driven via a command line interface provided on UART0. Use a +//! terminal emulator on your host system and set the serial port to use +//! 115200bps, 8-N-1. To see a list of supported commands, enter ``help'' on +//! the command line and to see extended help on a specific command enter +//! ``help [command]''. +//! +//! The commands in the tool fall broadly into three categories: +//! +//! - commands allowing a given low level graphics function to be executed with +//! parameters provided by the user, +//! - commands providing the ability to read and write arbitrary memory +//! locations and registers, and +//! - tests displaying test patterns intended to exercise specific display +//! driver functions. +//! +//! The first group of commands includes ``r'' to read a word from a memory +//! location or register, ``w'' to write a word to a memory location or +//! register, ``dump'' to dump a range of memory as words and ``db'' to dump +//! a range of memory as bytes. Note that no checking is performed to ensure +//! that addresses passed to these functions are valid. If an invalid address +//! is passed, the test tool will fault. +//! +//! The second group of commands contains ``fill'' which fills the screen with +//! a given color, ``rect'' which draws a rectangle outline at a given position +//! on the display, ''hline`` which draws a horizontal line, ``vline'' which +//! draws a vertical line, ``image'' which draws an image at provided +//! coordinates, and ``text'' which renders a given text string. The output of +//! these commands is also modified via several other commands. ``fg'' selects +//! the foreground color to be used by the drawing commands and ``bg'' selects +//! the background color. ``setimg'' selects from one of four different test +//! images that are drawn in response to the ``image'' command and ``clipimg'' +//! allows image clipping to be adjusted to test handling of the \e i32X0 +//! parameter to the driver's PixelDrawMultiple function. +//! +//! Additional graphics commands are ``pat'' which redraws the test pattern +//! displayed when the tool starts, ``colbar'' which fills the display with +//! a set of color bars and ``perf'' which draws randomly positioned and +//! colored rectangles for a given number of seconds and determines the drawing +//! speed in pixels-per-second. +//! +//! All driver function test patterns are generated using the ``test'' command +//! whose first parameter indicates the test to display. Tests are as follow: +//! +//! - ``color'' tests the driver's color handling. The test starts by +//! splitting the screen into two and showing a different primary or +//! secondary color in each half. Verify that the correct colors are +//! displayed. After this, red, blue and green color gradients are +//! displayed. Again, verify that these are correct and that no color other +//! than the shades of the specific primary are displayed. If any color is +//! incorrect, this likely indicates an error in the driver's +//! pfnColorTranslate function or the function used to set the display +//! palette if the driver provides this feature. +//! +//! - ``pixel'' tests basic pixel plotting. A test pattern is drawn with a +//! single white pixel in each corner of the display, a small cross +//! comprising 5 white pixels in the center, and small arrows near each +//! corner. If any of the corner dots are missing or any of the other +//! pattern elements are incorrect, this points to a problem in the +//! driver's pfnPixelDraw function or, more generally, a problem with the +//! display coordinate space handling. +//! +//! - ``hline'' tests horizontal line drawing. White horizontal lines are +//! drawn at the top and bottom and a right-angled triangle is constructed in +//! the center of the display. If any line is missing or the triangle is +//! incorrect, this points to a problem in the driver's pfnLineDrawH +//! function. +//! +//! - ``vline'' tests vertical line drawing. White vertical lines are drawn +//! at the left and right and a right-angled triangle is constructed in +//! the center of the display. If any line is missing or the triangle is +//! incorrect, this points to a problem in the driver's pfnLineDrawV +//! function. +//! +//! - ``mult'' tests the driver's pfnPixelDrawMultiple function. This is the +//! most complex driver function and the one most prone to errors. The tool +//! fills the display with each of the included test images in turn. These +//! cover all the pixel formats (1-, 4- and 8-bpp) that the driver is +//! required to handle and the image clipping and x positions are set to +//! ensure that all alignment cases are handled for each format. In each +//! case, the image is drawn inside a single pixel red rectangle. If the +//! driver is handling each case correctly, the image should look correct +//! and no part of the red rectangle should be overwritten when the image +//! is drawn. In the displayed grid of images, the x alignment increases +//! from 1 to 8 across the display and each line increases the left-side +//! image clipping by one pixel from 0 in the top row to 7 in the bottom +//! row. An error in any image indicates that one of the cases handled by +//! the driver's pfnPixelDrawMultiple function is not handled correctly. +//! +//***************************************************************************** + +//***************************************************************************** +// +// The number of SysTick interrupts to generate per second. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 10 + +//***************************************************************************** +// +// Global system tick count. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount; + +//***************************************************************************** +// +// System clock rate in Hertz. +// +//***************************************************************************** +volatile uint32_t g_ui32SysClk; + +//***************************************************************************** +// +// Default colors. +// +//***************************************************************************** +uint32_t g_ui32Foreground = ClrWhite; +uint32_t g_ui32Background = ClrBlack; + +//***************************************************************************** +// +// Definitions related to the color bar pattern. +// +//***************************************************************************** +const uint32_t g_pui32BarColors[] = +{ + ClrBlack, + ClrWhite, + ClrYellow, + ClrCyan, + ClrGreen, + ClrMagenta, + ClrRed, + ClrBlue +}; + +#define NUM_COLOR_BARS (sizeof(g_pui32BarColors) / sizeof(uint32_t)) + +//***************************************************************************** +// +// Names for each of the colors in the g_pui32BarColors array. These two +// arrays must be kept in sync! +// +//***************************************************************************** +const char *g_ppcBarColors[] = +{ + "Black", "White", "Yellow", "Cyan", "Green", "Magenta", "Red", "Blue" +}; + +#if (DRIVER_BPP < 16) +//***************************************************************************** +// +// Set aside space for a color palette if the driver being tested uses a +// palettized pixel format. +// +//***************************************************************************** +uint32_t g_pui32Palette[1 << DRIVER_BPP]; +#endif + +//***************************************************************************** +// +// The number of pixels to clip off the left edge of an image drawn using the +// "image" command. +// +//***************************************************************************** +uint32_t g_ui32Clip = 0; + +//***************************************************************************** +// +// Graphics context used to show text on the QVGA display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Defines the size of the buffer that holds the command line. +// +//***************************************************************************** +#define CMD_BUF_SIZE 64 + +//***************************************************************************** +// +// Simple macros to return the maximum or minimum of two values. +// +//***************************************************************************** +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +//***************************************************************************** +// +// The buffer that holds the command line. +// +//***************************************************************************** +static char g_cCmdBuf[CMD_BUF_SIZE]; + +typedef struct +{ + char *pcDesc; + const unsigned char *pucImage; +} +tTestImage; + +tTestImage g_pImages[] = +{ + {"TI Logo, 4bpp", g_pucLogo}, + {"32x32 test image, 1bpp", g_pucTest32x32x1Comp}, + {"32x32 test image, 4bpp", g_pucTest32x32x4Comp}, + {"32x32 test image, 8bpp", g_pucTest32x32x8Comp} +}; + +#define NUM_IMAGES (sizeof(g_pImages) / sizeof (tTestImage)) + +//***************************************************************************** +// +// The size of the arrows drawn in the PixelDraw test. +// +//***************************************************************************** +#define ARROW_SIZE 10 + +//***************************************************************************** +// +// A pointer to the currently selected image +// +//***************************************************************************** +const unsigned char *g_pucCurrentImage = g_pucLogo; + +//***************************************************************************** +// +// Command handler function prototypes. +// +//***************************************************************************** +int Cmd_Help(int argc, char *argv[]); +int Cmd_Foreground(int argc, char *argv[]); +int Cmd_Background(int argc, char *argv[]); +int Cmd_Fill(int argc, char *argv[]); +int Cmd_Rect(int argc, char *argv[]); +int Cmd_HLine(int argc, char *argv[]); +int Cmd_VLine(int argc, char *argv[]); +int Cmd_SetImage(int argc, char *argv[]); +int Cmd_Image(int argc, char *argv[]); +int Cmd_ClipImage(int argc, char *argv[]); +int Cmd_ColorBars(int argc, char *argv[]); +int Cmd_Text(int argc, char *argv[]); +int Cmd_Test(int argc, char *argv[]); +int Cmd_Pal(int argc, char *argv[]); +int Cmd_Pattern(int argc, char *argv[]); +int Cmd_Perf(int argc, char *argv[]); +int Cmd_Read(int argc, char *argv[]); +int Cmd_Write(int argc, char *argv[]); +int Cmd_Dump(int argc, char *argv[]); +int Cmd_DumpBytes(int argc, char *argv[]); + +//***************************************************************************** +// +// This is the table that holds the command names, implementing functions, +// and brief description. +// +//***************************************************************************** +tCmdLineEntry g_psCmdTable[] = +{ + { "fg", Cmd_Foreground, "[RGB24] Set the foreground color. Default is white." }, + { "bg", Cmd_Background, "[RGB24] Set the background color. Default is black." }, + { "fill", Cmd_Fill, "[RGB24] Fill the screen with a color." }, + { "rect", Cmd_Rect, "[xTL yTL xBR yBR] Draw a rectangle" }, + { "hline", Cmd_HLine, " Draw a horizontal line on the display" }, + { "vline", Cmd_VLine, " Draw a vertical line on the display" }, + { "setimg", Cmd_SetImage, " Sets the index of the current image." }, + { "image", Cmd_Image, "[x y] Draw an image at (x,y) or tile whole screen" }, + { "clipimg",Cmd_ClipImage, "[clip] Sets number of x image clipping pixels. Default 0." }, + { "colbar", Cmd_ColorBars, "Draw a color bar pattern on the display" }, + { "text", Cmd_Text, " [x y] Write text string at (x,y). Default center" }, + { "test", Cmd_Test, " Run tests for specific driver functions" }, + { "pal", Cmd_Pal, " Sets a palette entry to a given color" }, + { "pat", Cmd_Pattern, "Draw the initial test pattern." }, + { "perf", Cmd_Perf, " Run grlib performance test for some period" }, + { "r", Cmd_Read, " Read a memory location or register" }, + { "w", Cmd_Write, " Write a memory location" }, + { "dump", Cmd_Dump, " Dump words from a given address" }, + { "d", Cmd_Dump, " alias for dump" }, + { "db", Cmd_DumpBytes, " Dump bytes from a given address" }, + { "help", Cmd_Help, "[command] Display help on a command or a list of commands" }, + { "h", Cmd_Help, " alias for help" }, + { "?", Cmd_Help, " alias for help" }, + { 0, 0, 0 } +}; + +//***************************************************************************** +// +// Prototypes for specific test functions. +// +//***************************************************************************** +int Test_ColorTranslate(int argc, char *argv[]); +int Test_PixelDraw(int argc, char *argv[]); +int Test_LineDrawH(int argc, char *argv[]); +int Test_LineDrawV(int argc, char *argv[]); +int Test_PixelDrawMultiple(int argc, char *argv[]); + +//***************************************************************************** +// +// A table of test functions that are called based on the first command line +// parameter passed to the "test" command. +// +//***************************************************************************** +tCmdLineEntry g_psTestTable[] = +{ + { "color", Test_ColorTranslate, "" }, + { "pixel", Test_PixelDraw, "" }, + { "hline", Test_LineDrawH, "" }, + { "vline", Test_LineDrawV, "" }, + { "mult", Test_PixelDrawMultiple, "" }, + { 0, 0, 0 } +}; + +//***************************************************************************** +// +// A structure used to hold command-based help information. +// +//***************************************************************************** +typedef struct +{ + char *pcCommand; + char *pcHelp; +} +tCommandHelp; + +tCommandHelp g_psCommandHelp[] = +{ + { "fg", + "Sets the foreground color used in future ""rect"", ""hline"", ""vlins"" \n" + """image"" and ""text"" commands. The color is provided as a 24-bit RGB\n" + "value of the form 0xRRGGBB\n" }, + { "bg", + "Sets the background color used in future ""text"" and ""image"" commands.\n" + "The color is provided as a 24-bit RGB value of the form 0xRRGGBB\n" }, + { "fill", + "Fill the entire display with the provided RGB color or, if no parameter is\n" + "given, the current background color.\n" }, + { "rect", + "Draw a rectangle in the current foreground color at the given position on\n" + "the screen. If no parameters are provided, the rectangle is drawn around the\n" + "entire display area. Note that, unlike many other graphics APIs, rectangle\n" + "coordinates are bottom-right inclusive.\n" }, + { "hline", + "Draw a single horizontal line on the display using the current foreground\n" + "color. The command accepts three parameters, the starting and ending x\n" + "coordinates and the y coordinate for the line.\n" }, + { "vline", + "Draw a single vertical line on the display using the current foreground\n" + "color. The command accepts three parameters, the starting and ending y\n" + "coordinates and the x coordinate for the line.\n" }, + { "setimg", + "Determine which test image will be drawn on future calls to the ""image""\n" + "command. The index passed must be between 0 and 3 (inclusive) and identifies\n" + "the following images:\n" + " 0 - TI logo, 4bpp, 80 x 75, compressed\n" + " 1 - 4 square quadrants, 1bpp, 32 x 32, compressed\n" + " 2 - 16 color test pattern, 4bpp, 32 x 32, compressed\n" + " 3 - 256 color test pattern, 8bpp, 32 x 32, compressed\n" }, + { "image", + "Draw the image selected by the previous ""setimg"" command at position (x,y)\n" + "on the display. If a 1bpp image is selected, the current foreground and\n" + "background colors are used, otherwise the image's own palette determines the\n" + "color. If the ""clipimg"" command has previously been issued, the left edge\n" + "of the image will be clipped by the number of pixels indicated in that command.\n" + "When clipping is enabled, the (x, y) position is not adjusted to compensate for\n" + "the fact that the image is being cropped. For example, if a 32x32 image is \n" + "selected and the clip value has been set to 4, drawing the image at (0, 0) will\n" + "result in 28 pixels of each image line being drawn at x=4 on the display with\n" + "the first displayed pixel coming from the 5th column of the source image.\n" }, + { "clipimg", + "Sets the number of pixels that will be clipped or cropped off the left edge of\n" + "future images drawn using the ""image"" command. If no parameter is passed,\n" + "image clipping is disabled, otherwise the parameter represents the number of\n" + "pixels to clip.\n" }, + { "colbar", + "Draw a series of vertical color bars on the display. From left to right, the\n" + "bars are black, white, yellow, cyan, green, magenta, red and blue.\n" }, + { "text", + "Renders text at a given location on the display. The foreground and background\n" + "colors are as set using previous ""fg"" and ""bg"" commands. If no parameters\n" + "are provided, a short string is drawn in the center of the screen. If\n" + "parameters are provided they must be the required string (containing no spaces)\n" + "followed by the x coordinate and the y coordinate for the top left corner of\n" + "the string.\n" }, + { "pal", + "Sets the given color lookup table location to a particular RGB color. This\n" + "command is only available if the display frame buffer uses a format containing\n" + "less than 16 bits per pixel. The range of valid indices depends upon the frame\n" + "buffer format. For a 1bpp display, indices 0 and 1 are valid. For 4bpp, the\n" + "index must be in the range 0 to 15, and for an 8bpp buffer, values 0 to 255\n" + "are valid.\n" }, + { "pat", + "Clears the display and redraws the initial test pattern that was shown when the\n" + "tool originally started.\n" }, + { "perf", + "Draws random filled rectangles on the display for a given number of seconds and\n" + "then calculates the approximate throughput in megapixels per second and\n" + "megabytes per second.\n" }, + { "r", + "Reads a word from a given memory address. Note that no checking is performed\n" + "on the validity of the supplied address. If an invalid address is supplied, the\n" + "command will cause an exception and the test tool will hang.\n" }, + { "w", + "Writes a word to a given memory address. Note that no checking is performed\n" + "on the validity of the supplied address. If an invalid address is supplied, the\n" + "command will cause an exception and the test tool will hang.\n" }, + { "dump", + "Reads a block of words from a given memory address. Note that no checking\n" + "is performed on the validity of the supplied address. If an invalid address\n" + "is supplied, the command will cause an exception and the test tool will hang.\n" }, + { "db", + "Reads a block of bytes from a given memory address and displays them in hex\n" + "format. Note that no checking is performed on the validity of the supplied\n" + "address. If an invalid address is supplied, the command will cause an\n" + "exception and the test tool will hang.\n" }, + { "test", + "Run one of a number of tests designed to exercise a specific display driver\n" + "function. Valid tests are as follow:\n" + " ""color"" - tests pfnColorTranslate and color handling.\n" + " ""pixel"" - tests pfnPixelDraw().\n" + " ""hline"" - tests pfnLineDrawH().\n" + " ""vline"" - tests pfnLineDrawV().\n" + " ""mult"" - tests pfnPixelDrawMultiple().\n" }, + { "help", + "Show a list of supported commands or provide additional help on a single command.\n" }, + { 0, 0 } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +void +__error__(char *pcFilename, unsigned long ulLine) +{ + // + // A runtime error was detected so stop here to allow debug. + // + while(1) + { + // + // Hang. + // + } +} + +//***************************************************************************** +// +// The handler for the SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Increment the SysTick count. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// A wrapper around GrImageDraw() that allows us to supply an x pixel clipping +// value and sets the clip rectangle as required before drawing the image. +// +//***************************************************************************** +void DrawImage(tContext *psContext, const uint32_t ui32Clip, + const uint8_t *pui8Image, int32_t i32X, int32_t i32Y) +{ + tRectangle sRect; + + sRect.i16XMax = GrContextDpyWidthGet(psContext) - 1; + sRect.i16YMax = GrContextDpyHeightGet(psContext) - 1; + sRect.i16YMin = 0; + + // + // Are we performing clipping? + // + if(ui32Clip == 0) + { + // + // No - set the clipping rectangle to the whole screen. + // + sRect.i16XMin = 0; + } + else + { + // + // Yes - set the clipping rectangle to clip off only the leftmost + // ui32Clip pixels from the image to be drawn. + // + sRect.i16XMin = i32X + ui32Clip; + } + + // + // Set the required clipping rectangle. + // + GrContextClipRegionSet(psContext, &sRect); + + // + // Draw the image. + // + GrImageDraw(psContext, pui8Image, i32X, i32Y); + + // + // Clear the clipping rectangle again. + // + sRect.i16XMin = 0; + GrContextClipRegionSet(psContext, &sRect); +} + +//***************************************************************************** +// +// Draw a test pattern onto the display. This pattern contains a variety of +// graphics primitives and will call every display driver API (although not all +// cases that each API must support). +// +//***************************************************************************** +void +DrawTestPattern(tContext *psContext) +{ + int32_t i32Loop, i32XInc, i32YInc, i32Width, i32Height; + tRectangle sRect; + + // + // Fill the the display with black and draw a white box around it. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(psContext) - 1; + sRect.i16YMin = 0; + sRect.i16YMax = GrContextDpyHeightGet(psContext) - 1; + GrContextForegroundSet(psContext, ClrBlack); + GrRectFill(psContext, &sRect); + GrContextForegroundSet(psContext, ClrWhite); + GrRectDraw(psContext, &sRect); + + // + // Draw a pattern of lines within the main display area. + // + i32XInc = GrContextDpyWidthGet(psContext) / 20; + i32YInc = GrContextDpyHeightGet(psContext) / 20; + + GrContextForegroundSet(psContext, ClrWhite); + + // + // Draw a pattern of lines. + // + for(i32Loop = 0; i32Loop < 20; i32Loop++) + { + GrLineDraw(psContext, 0, i32YInc * i32Loop, i32XInc * i32Loop, + (GrContextDpyHeightGet(psContext) - 1)); + GrLineDraw(psContext, + (GrContextDpyWidthGet(psContext) - 1), + (GrContextDpyHeightGet(psContext) - + (i32YInc * i32Loop + 1)), + (GrContextDpyWidthGet(psContext) - + (i32XInc * i32Loop + 1)), + 0); + } + + // + // Fill the top 22 lines of the display with blue. + // + sRect.i16XMin = 1; + sRect.i16XMax = GrContextDpyWidthGet(psContext) - 2; + sRect.i16YMin = 1; + sRect.i16YMax = 22; + + GrContextForegroundSet(psContext, ClrBlue); + GrRectFill(psContext, &sRect); + + // + // Draw a white line at the bottom of the blue box. + // + GrContextForegroundSet(psContext, ClrWhite); + GrLineDraw(psContext, sRect.i16XMin, sRect.i16YMax, + sRect.i16XMax, sRect.i16YMax); + + // + // Write the application name inside the blue box at the top of the screen. + // + GrContextFontSet(psContext, g_psFontCmss18b); + GrStringDrawCentered(psContext, "grlib-driver-test", -1, sRect.i16XMax / 2, + 8, false); + + // + // Draw a circle around the center of the main display area. + // + GrContextForegroundSet(psContext, ClrRed); + GrCircleDraw(psContext, GrContextDpyWidthGet(psContext) / 2, + 23 + ((GrContextDpyHeightGet(psContext) - 23) / 2), 70); + + // + // Determine where to draw the logo so that it is centered in the + // main section of the display. + // + i32Width = *(uint16_t *)(g_pImages[0].pucImage + 1); + i32Height = *(uint16_t *)(g_pImages[0].pucImage + 3); + i32XInc = (GrContextDpyWidthGet(psContext) - i32Width) / 2; + i32YInc = ((GrContextDpyHeightGet(psContext) - (23 + i32Height)) / 2) + 23; + + // + // Draw the TI logo in the center of the display + // + GrTransparentImageDraw(psContext, g_pImages[0].pucImage, i32XInc, i32YInc, + ClrBlack); + + // + // Flush any cached drawing operations. + // + GrFlush(psContext); +} + +//***************************************************************************** +// +// Draw test patterns that exercises the display driver's ColorTranslate +// function and, if applicable, its palette manipulation function. +// +//***************************************************************************** +int +Test_ColorTranslate(int argc, char *argv[]) +{ + int32_t i32Loop, i32NumBars, i32BarWidth, i32BarLoop; + uint32_t ui32Color; + tRectangle sRect; + + UARTprintf("Running ColorTranslate Test.\n\n"); + + UARTprintf("This test shows various color patterns to allow a driver writer " + "to ensure that\n" + "color mapping and palette functions are operating correctly.\n"); + + UARTprintf("\nFirst, some basic primary and secondary colors...\n"); + + // + // Loop through pairs of colors that we have configured for the color bar + // test pattern. + // + for(i32Loop = 0; i32Loop < NUM_COLOR_BARS; i32Loop += 2) + { + // + // Does this driver require a color lookup table? + // +#if (DRIVER_BPP < 16) + // + // Set the palette we want to use for this portion of the test. + // + g_pui32Palette[0] = g_pui32BarColors[i32Loop]; + g_pui32Palette[1] = g_pui32BarColors[i32Loop + 1]; + DRIVER_PALETTE_SET(g_pui32Palette, 0, 2); +#endif + + // + // Fill the left half of the display with one color of the pair. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) / 2; + sRect.i16YMin = 0; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + GrContextForegroundSet(&g_sContext, g_pui32BarColors[i32Loop]); + GrRectFill(&g_sContext, &sRect); + + // + // Fill the right half of the display with the other color. + // + sRect.i16XMin = (GrContextDpyWidthGet(&g_sContext) / 2) + 1; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + GrContextForegroundSet(&g_sContext, g_pui32BarColors[i32Loop + 1]); + GrRectFill(&g_sContext, &sRect); + + // + // Tell the user what they should be seeing. + // + UARTprintf("Left %s, right %s. Press ""Enter"" to continue.\n", g_ppcBarColors[i32Loop], + g_ppcBarColors[i32Loop + 1]); + + // + // Wait for the user to press "Enter" + // + UARTgets(g_cCmdBuf, sizeof(g_cCmdBuf)); + } + + // + // Clear the screen again. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMin = 0; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + + // + // From the display width and the frame buffer color depth, determine the + // number of bars to draw and the width of each. + // +#if (DRIVER_BPP < 16) + // + // For a palettized frame buffer, the number of bars we draw is the + // the number of simultaneous colors that the pixel format can represent. + // + i32NumBars = (1 << DRIVER_BPP) - 1; +#else + // + // For a direct color frame buffer, we show no more than 256 steps because + // that's as many independent shades of any primary that you can represent + // in RGB24 format. + // + i32NumBars = 256; +#endif + + // + // If the number of bars we need to draw is more than the number of pixels + // across the display, reduce the number of bars. + // + i32NumBars = MIN(i32NumBars, GrContextDpyWidthGet(&g_sContext)); + + // + // What's the width of each bar? We store this in 24.8 fixed point + // notation. + // + i32BarWidth = (GrContextDpyWidthGet(&g_sContext) * 256) / i32NumBars; + + // + // Now draw a color gradient across the display in each primary color. + // + sRect.i16YMin = 0; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + + for(i32Loop = 0; i32Loop < 3; i32Loop++) + { +#if (DRIVER_BPP < 16) + // + // For palettized frame buffers, set the desired color palette. + // + for(i32BarLoop = 0; i32BarLoop < (1 << DRIVER_BPP); i32BarLoop++) + { + g_pui32Palette[i32BarLoop] = (i32BarLoop * 256) / (1 << DRIVER_BPP); + g_pui32Palette[i32BarLoop] <<= (8 * i32Loop); + } + DRIVER_PALETTE_SET(g_pui32Palette, 0, (1 << DRIVER_BPP)); +#endif + + // + // Draw each of the vertical bars making up the gradient pattern. + // + for(i32BarLoop = 0; i32BarLoop < i32NumBars; i32BarLoop++) + { + // + // Calculate the position of this bar. + // + sRect.i16XMin = sRect.i16XMax + 1; + sRect.i16XMax = ((i32BarLoop * i32BarWidth) / 256) - 1; + + // + // Set the color of this bar. + // + ui32Color = (i32BarLoop == (i32NumBars - 1)) ? 255 : + ((i32BarLoop * 256) / i32NumBars); + ui32Color <<= (i32Loop * 8); + GrContextForegroundSet(&g_sContext, ui32Color); + + // + // Draw the bar. + // + GrRectFill(&g_sContext, &sRect); + } + + // + // Tell the user what they should be seeing. + // + UARTprintf("%s gradient with %d steps. Press ""Enter"" to continue\n", + (i32Loop == 0) ? "Blue" : + ((i32Loop == 1) ? "Green" : "Red"), + i32NumBars); + + // + // Wait for the user to press "Enter" + // + UARTgets(g_cCmdBuf, sizeof(g_cCmdBuf)); + } + + return(0); +} + +//***************************************************************************** +// +// Draw a test pattern that exercises the display driver's PixelDraw function. +// +//***************************************************************************** +int +Test_PixelDraw(int argc, char *argv[]) +{ + tRectangle sRect; + int32_t i32Loop; + + UARTprintf("Running PixelDraw Test.\n\n"); + + UARTprintf("The display should show single white dots in each corner, a " + "small cross at\n" + "the center of the display, and small arrows pointing to each " + "corner.\n"); + + // + // Set the drawing color to black and clear the screen. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMin = 0; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + + // + // Set the drawing color to white. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Plot points at each corner. + // + GrPixelDraw(&g_sContext, 0, 0); + GrPixelDraw(&g_sContext, sRect.i16XMax, 0); + GrPixelDraw(&g_sContext, 0, sRect.i16YMax); + GrPixelDraw(&g_sContext, sRect.i16XMax, sRect.i16YMax); + + // + // Draw a small cross at the center of the display. + // + GrPixelDraw(&g_sContext, sRect.i16XMax / 2, sRect.i16YMax / 2); + GrPixelDraw(&g_sContext, (sRect.i16XMax / 2) + 1, (sRect.i16YMax / 2)); + GrPixelDraw(&g_sContext, (sRect.i16XMax / 2) - 1, (sRect.i16YMax / 2)); + GrPixelDraw(&g_sContext, (sRect.i16XMax / 2), (sRect.i16YMax / 2) + 1); + GrPixelDraw(&g_sContext, (sRect.i16XMax / 2), (sRect.i16YMax / 2) - 1); + + // + // Draw the arrows one pixel at a time. + // + for(i32Loop = 1; i32Loop < ARROW_SIZE; i32Loop++) + { + // + // Top left arrow. + // + GrPixelDraw(&g_sContext, ARROW_SIZE + i32Loop, ARROW_SIZE + i32Loop); + GrPixelDraw(&g_sContext, ARROW_SIZE, ARROW_SIZE + i32Loop); + GrPixelDraw(&g_sContext, ARROW_SIZE + i32Loop, ARROW_SIZE); + + // + // Top right arrow. + // + GrPixelDraw(&g_sContext, sRect.i16XMax - (ARROW_SIZE + i32Loop), + ARROW_SIZE + i32Loop); + GrPixelDraw(&g_sContext, sRect.i16XMax - ARROW_SIZE, + ARROW_SIZE + i32Loop); + GrPixelDraw(&g_sContext, sRect.i16XMax - (ARROW_SIZE + i32Loop), + ARROW_SIZE); + + // + // Bottom right arrow. + // + GrPixelDraw(&g_sContext, sRect.i16XMax - (ARROW_SIZE + i32Loop), + sRect.i16YMax - (ARROW_SIZE + i32Loop)); + GrPixelDraw(&g_sContext, sRect.i16XMax - ARROW_SIZE, + sRect.i16YMax - (ARROW_SIZE + i32Loop)); + GrPixelDraw(&g_sContext, sRect.i16XMax - (ARROW_SIZE + i32Loop), + sRect.i16YMax - ARROW_SIZE); + + // + // Bottom left arrow. + // + GrPixelDraw(&g_sContext, ARROW_SIZE + i32Loop, + sRect.i16YMax - (ARROW_SIZE + i32Loop)); + GrPixelDraw(&g_sContext, ARROW_SIZE, + sRect.i16YMax - (ARROW_SIZE + i32Loop)); + GrPixelDraw(&g_sContext, ARROW_SIZE + i32Loop, + sRect.i16YMax - ARROW_SIZE); + } + + return(0); +} + +//***************************************************************************** +// +// Draw a test pattern that exercises the display driver's LineDrawH function. +// +//***************************************************************************** +int +Test_LineDrawH(int argc, char *argv[]) +{ + tRectangle sRect; + int32_t i32Loop, i32X, i32Y, i32Size; + + UARTprintf("Running LineDrawH Test.\n\n"); + + UARTprintf("The display should show horizontal white lines across the " + "complete width of\n" + "the screen at top and bottom and a right-angled triangle with " + "horizontal\n" + "edge at the bottom and vertical edge on the left.\n"); + + // + // Set the drawing color to black and clear the screen. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMin = 0; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + + // + // Set the drawing color to white. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Draw horizontal lines at the top and bottom of the display. + // + GrLineDrawH(&g_sContext, 0, sRect.i16XMax, 0); + GrLineDrawH(&g_sContext, 0, sRect.i16XMax, sRect.i16YMax); + + // + // Determine the size of the triangle we will draw. + // + i32Size = (MIN(sRect.i16YMax, sRect.i16XMax) * 3) / 4; + i32X = (GrContextDpyWidthGet(&g_sContext) - i32Size) / 2; + i32Y = (GrContextDpyHeightGet(&g_sContext) - i32Size) / 2; + + // + // Draw the rectangle based on the size and position calculated. + // + for(i32Loop = 1; i32Loop < i32Size; i32Loop++) + { + GrLineDrawH(&g_sContext, i32X, i32X + i32Loop, i32Y + i32Loop); + } + + return(0); +} + +//***************************************************************************** +// +// Draw a test pattern that exercises the display driver's LineDrawV function. +// +//***************************************************************************** +int +Test_LineDrawV(int argc, char *argv[]) +{ + tRectangle sRect; + int32_t i32Loop, i32X, i32Y, i32Size; + + UARTprintf("Running LineDrawV Test.\n\n"); + + UARTprintf("The display should show vertical white lines down the " + "complete height of\n" + "the screen at left and right and a right-angled triangle with " + "horizontal\n" + "edge at the top and vertical edge on the right.\n"); + + // + // Set the drawing color to black and clear the screen. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMin = 0; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + + // + // Set the drawing color to white. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Draw vertical lines on the left and right sides of the display. + // + GrLineDrawV(&g_sContext, 0, 0, sRect.i16YMax); + GrLineDrawV(&g_sContext, sRect.i16XMax, 0, sRect.i16YMax); + + // + // Determine the size of the triangle we will draw. + // + i32Size = (MIN(sRect.i16YMax, sRect.i16XMax) * 3) / 4; + i32X = (GrContextDpyWidthGet(&g_sContext) - i32Size) / 2; + i32Y = (GrContextDpyHeightGet(&g_sContext) - i32Size) / 2; + + // + // Draw the rectangle based on the size and position calculated. + // + for(i32Loop = 1; i32Loop < i32Size; i32Loop++) + { + GrLineDrawV(&g_sContext, i32X + i32Loop, i32Y, + i32Y + i32Loop); + } + + return(0); +} + +//***************************************************************************** +// +// Draw test patterns that exercise the display driver's PixelDrawMultiple +// function. This function ensures that all supported image pixel formats +// are used along with all possible drawing alignment and sub-byte clipping +// settings. +// +//***************************************************************************** +int +Test_PixelDrawMultiple(int argc, char *argv[]) +{ + int32_t i32X, i32Y, i32Width, i32Height; + int32_t i32ImageLoop, i32PositionLoop, i32ClipLoop; + tRectangle sRect; + + UARTprintf("Running PixelDrawMultiple Test.\n\n"); + + // + // Loop through each of the test images. + // + for(i32ImageLoop = 0; i32ImageLoop < NUM_IMAGES; i32ImageLoop++) + { + // + // Tell the user what we're doing. + // + UARTprintf("Image %d: %s\n", i32ImageLoop, + g_pImages[i32ImageLoop].pcDesc); + + // + // Set the drawing color to black and clear the screen. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMin = 0; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + + // + // Determine the size of the current test image. + // + i32Width = (int32_t)g_pImages[i32ImageLoop].pucImage[1] + + 256 * (int32_t)g_pImages[i32ImageLoop].pucImage[2]; + i32Height = (int32_t)g_pImages[i32ImageLoop].pucImage[3] + + 256 * (int32_t)g_pImages[i32ImageLoop].pucImage[4]; + // + // Loop through each possible x offset from 0 to 7. + // + for(i32PositionLoop = 0; i32PositionLoop < 8; i32PositionLoop++) + { + // + // Loop through all clipping values from 0 to 7 + // + for(i32ClipLoop = 0; i32ClipLoop < 8; i32ClipLoop++) + { + // + // Determine the (x, y) position for this image. + // + i32X = i32PositionLoop * (i32Width + 4) + i32PositionLoop + 1; + i32Y = i32ClipLoop * (i32Height + 4) + 1; + + // + // Draw the outline rectangle that the image should fit inside. + // + sRect.i16XMin = i32X + i32ClipLoop - 1; + sRect.i16XMax = i32X + i32Width; + sRect.i16YMin = i32Y - 1; + sRect.i16YMax = i32Y + i32Height; + GrContextForegroundSet(&g_sContext, ClrRed); + GrRectDraw(&g_sContext, &sRect); + + // + // Set drawing colors to blue and yellow in case we're using + // a 1bpp source image. + // + GrContextForegroundSet(&g_sContext, ClrYellow); + GrContextBackgroundSet(&g_sContext, ClrBlue); + + // + // Draw the test image at the relevant position. + // + DrawImage(&g_sContext, i32ClipLoop, + g_pImages[i32ImageLoop].pucImage, i32X, i32Y); + } + } + + // + // Tell the user what they should be seeing. + // + UARTprintf("Check pattern. No image should overdraw the red rectangle " + "edges.\nPress ""Enter"" to continue."); + + // + // Wait for the user to press "Enter" + // + UARTgets(g_cCmdBuf, sizeof(g_cCmdBuf)); + } + + // + // Reset the foreground and background colors to the user's original + // choices. + // + GrContextForegroundSet(&g_sContext, g_ui32Foreground); + GrContextBackgroundSet(&g_sContext, g_ui32Background); + + UARTprintf("PixelDrawMultiple test complete.\n"); + + return(0); +} + +//***************************************************************************** +// +// This function implements the "test" command. It requires a single parameter +// which identifies the test to run. Any additional command line parameters +// are passed on to the specific test function. +// +//***************************************************************************** +int +Cmd_Test(int argc, char *argv[]) +{ + tCmdLineEntry *pTests; + + // + // Make sure we have at least one additional parameter. + // + if(argc < 2) + { + UARTprintf("ERROR: This command requires one parameter .\n"); + return(0); + } + + // + // Walk through the list of configured tests and look for a match with + // the identifier passed. + // + pTests = g_psTestTable; + + while(pTests->pcCmd) + { + // + // Does this test match the string passed? + // + if(ustrcmp(pTests->pcCmd, argv[1]) == 0) + { + // + // Yes - call the test function. + // + return((pTests->pfnCmd)(argc - 1, &argv[1])); + } + + // + // Move on to the next test in the list. + // + pTests++; + } + + // + // If we get here, the test name provided is not recognized. + // + UARTprintf("Test ""%s"" cannot be found.\n", argv[1]); + return(0); +} + +//***************************************************************************** +// +// This function implements the "help" command. It prints a simple list +// of the available commands with a brief description. +// +//***************************************************************************** +int +Cmd_Help(int argc, char *argv[]) +{ + tCmdLineEntry *psEntry; + tCommandHelp *psHelp; + bool bFound; + + // + // Get pointers to the beginning of the command table and the extended + // help table. + // + psEntry = g_psCmdTable; + psHelp = g_psCommandHelp; + bFound = false; + + // + // Are we being asked to list all the commands? + // + if(argc == 1) + { + // + // Print some header text. + // + UARTprintf("\nAvailable commands\n"); + UARTprintf("------------------\n"); + + // + // Enter a loop to read each entry from the command table. The + // end of the table has been reached when the command name is NULL. + // + while(psEntry->pcCmd) + { + // + // Print the command name and the brief description. + // + UARTprintf("%12s : %s\n", psEntry->pcCmd, psEntry->pcHelp); + + // + // Advance to the next entry in the table. + // + psEntry++; + } + } + else + { + // + // We are being asked for help on a specific command. + // + + // + // Enter a loop find the requested command in the basic command table + // and print the summary help for that command. + // + while(psEntry->pcCmd) + { + // + // Does the provided command match the current table entry? + // + if(ustrcmp(argv[1], psEntry->pcCmd) == 0) + { + // + // Yes - print the command name and the brief description. + // + UARTprintf("\n%s : %s\n", psEntry->pcCmd, psEntry->pcHelp); + + bFound = true; + + // + // Drop out of the loop. + // + break; + } + + // + // Advance to the next entry in the table. + // + psEntry++; + } + + // + // If we get here without finding the command, then it's not a valid + // command. + // + if(!bFound) + { + UARTprintf("Command ""%s"" is not supported.\n", argv[1]); + return(0); + } + + // + // We found the command so now go and look for extended help. + // + bFound = false; + + // + // Walk through the table of detailed help entries until we see a NULL + // for the command string pointer. + // + while(psHelp->pcCommand) + { + // + // Does the command passed match this entry in the detailed help + // table? + // + if(ustrcmp(argv[1], psHelp->pcCommand) == 0) + { + UARTprintf("\n%s\n", psHelp->pcHelp); + bFound = true; + break; + } + + // + // Move to the next entry in the list. + // + psHelp++; + } + + if(!bFound) + { + UARTprintf("No extended help is available for ""%s"".\n", argv[1]); + } + } + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "r" command and reads a single word from a +// given memory location. +// +//***************************************************************************** +int +Cmd_Read(int argc, char *argv[]) +{ + uint32_t ulAddr; + + // + // Parameter check. + // + if(argc != 2) + { + UARTprintf("ERROR: This command requires one parameter .\n"); + return(0); + } + + // + // Get the address to read. + // + ulAddr = ustrtoul(argv[1], 0, 0); + + UARTprintf("0x%08x: 0x%08x\n", ulAddr, HWREG(ulAddr)); + + return(0); +} + +//***************************************************************************** +// +// This function implements the "w" command and writes a single word to a +// given memory location. +// +//***************************************************************************** +int +Cmd_Write(int argc, char *argv[]) +{ + uint32_t ulAddr, ulVal; + + // + // Parameter check. + // + if(argc != 3) + { + UARTprintf("ERROR: This command requires 2 parameters .\n"); + return(0); + } + + // + // Get the address and value to write. + // + ulAddr = ustrtoul(argv[1], 0, 0); + ulVal = ustrtoul(argv[2], 0, 0); + + HWREG(ulAddr) = ulVal; + UARTprintf("0x%08x: 0x%08x\n", ulAddr, HWREG(ulAddr)); + + return(0); +} + +//***************************************************************************** +// +// This function implements the "d" command and dumps a number of words from a +// given memory location. +// +//***************************************************************************** +int +Cmd_Dump(int argc, char *argv[]) +{ + uint32_t ulAddr, ui32Count, ulLoop; + + // + // Parameter check. + // + if(argc != 3) + { + UARTprintf("ERROR: This command requires 2 parameters .\n"); + return(0); + } + + // + // Get the address and value to write. + // + ulAddr = ustrtoul(argv[1], 0, 0); + ui32Count = ustrtoul(argv[2], 0, 0); + + // + // Walk through the memory range making sure that we align the addresses + // on 16 byte boundaries (to make the output look good). + // + for(ulLoop = ulAddr & ~0x0F; ulLoop < ulAddr + (ui32Count * 4); ulLoop += 4) + { + // + // Take a new line and print the address every 16 bytes. + // + if(!(ulLoop % 16)) + { + UARTprintf("\n0x%08x: ", ulLoop); + } + + // + // Display the value of a particular word or pad with spaces if we are + // still below the requested address. + // + if(ulLoop >= ulAddr) + { + UARTprintf("%08x ", HWREG(ulLoop)); + } + else + { + UARTprintf(" "); + } + } + + UARTprintf("\n"); + + return(0); +} + +//***************************************************************************** +// +// Dump the contents of ui32Count bytes from address ulAddr. +// +//***************************************************************************** +static void +DumpBytes(uint32_t ulAddr, uint32_t ui32Count) +{ + uint32_t ulLoop; + + // + // Walk through the memory range making sure that we align the addresses + // on 16 byte boundaries (to make the output look good). + // + for(ulLoop = ulAddr & ~0x0F; ulLoop < ulAddr + ui32Count; ulLoop++) + { + // + // Take a new line and print the address every 16 bytes. + // + if(!(ulLoop % 16)) + { + UARTprintf("\n0x%08x: ", ulLoop); + } + + // + // Display the value of a particular byte or pad with spaces if we are + // still below the requested address. + // + if(ulLoop >= ulAddr) + { + UARTprintf("%02x ", HWREGB(ulLoop)); + } + else + { + UARTprintf(" "); + } + } + + UARTprintf("\n"); +} + +//***************************************************************************** +// +// This function implements the "db" command and dumps a number of bytes from a +// given memory location. +// +//***************************************************************************** +int +Cmd_DumpBytes(int argc, char *argv[]) +{ + uint32_t ulAddr, ui32Count; + + // + // Parameter check. + // + if(argc != 3) + { + UARTprintf("ERROR: This command requires 2 parameters .\n"); + return(0); + } + + // + // Get the address and value to write. + // + ulAddr = ustrtoul(argv[1], 0, 0); + ui32Count = ustrtoul(argv[2], 0, 0); + + DumpBytes(ulAddr, ui32Count); + + return(0); +} + +//***************************************************************************** +// +// This function implements the "fill" command and fills the whole screen with +// a given color value. +// +//***************************************************************************** +int +Cmd_Fill(int argc, char *argv[]) +{ + tRectangle sRect; + uint32_t ui32Color; + + // + // Get the color value to use if one was provided. Default to + // the current background if none was specified. + // + if(argc > 1) + { + ui32Color = ustrtoul(argv[1], 0, 0); + } + else + { + ui32Color = g_ui32Background; + } + + UARTprintf("Filling display with RGB 0x%06x.\n", ui32Color); + + // + // Fill the frame buffer with the desired color. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMin = 0; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + GrContextForegroundSet(&g_sContext, ui32Color); + GrRectFill(&g_sContext, &sRect); + + return(0); +} + +//***************************************************************************** +// +// This function implements the "rect" command and draws a rectangle in the +// current foreground color. If 4 parameters are supplied, they represent +// the X and Y coordinates of the top left and bottom right points. If no +// parameters are supplied, the display edge outline is drawn. +// +//***************************************************************************** +int +Cmd_Rect(int argc, char *argv[]) +{ + tRectangle sRect; + + if(argc == 1) + { + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMin = 0; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + } + else + { + if(argc != 5) + { + UARTprintf("This command reguires either 0 or 4 arguments!\n"); + return(0); + } + else + { + sRect.i16XMin = ustrtoul(argv[1], 0, 0); + sRect.i16XMax = ustrtoul(argv[3], 0, 0); + sRect.i16YMin = ustrtoul(argv[2], 0, 0); + sRect.i16YMax = ustrtoul(argv[4], 0, 0);; + } + } + + // + // Set the foreground color. + // + GrContextForegroundSet(&g_sContext, g_ui32Foreground); + + // + // Draw the required rectangle. + // + GrRectDraw(&g_sContext, &sRect); + + return(0); +} + +//***************************************************************************** +// +// This function implements the "line" command and draws a pattern of angled +// lines on the display. If 4 parameters are provided, this function draws +// a single line between the specified points. +// +//***************************************************************************** +int +Cmd_Line(int argc, char *argv[]) +{ + int32_t i32Loop, i32XInc, i32YInc; + tRectangle sRect; + + // + // Set the foreground color. + // + GrContextForegroundSet(&g_sContext, g_ui32Foreground); + + // + // Are we drawing the pattern or just a single line? + // + if(argc == 1) + { + i32XInc = GrContextDpyWidthGet(&g_sContext) / 20; + i32YInc = GrContextDpyHeightGet(&g_sContext) / 20; + + // + // Draw a pattern of lines. + // + for(i32Loop = 0; i32Loop < 20; i32Loop++) + { + GrLineDraw(&g_sContext, 0, i32YInc * i32Loop, i32XInc * i32Loop, + (GrContextDpyHeightGet(&g_sContext) - 1)); + GrLineDraw(&g_sContext, + (GrContextDpyWidthGet(&g_sContext) - 1), + (GrContextDpyHeightGet(&g_sContext) - + (i32YInc * i32Loop + 1)), + (GrContextDpyWidthGet(&g_sContext) - + (i32XInc * i32Loop + 1)), + 0); + } + } + else + { + // + // We're drawing a single line. Do we have the correct number of + // parameters? + // + if(argc != 5) + { + UARTprintf("This command reguires either 0 or 4 arguments!\n"); + return(0); + } + + // + // Get the line start and end points. + // + sRect.i16XMin = ustrtoul(argv[1], 0, 0); + sRect.i16XMax = ustrtoul(argv[3], 0, 0); + sRect.i16YMin = ustrtoul(argv[2], 0, 0); + sRect.i16YMax = ustrtoul(argv[4], 0, 0);; + + // + // Draw the line. + // + GrLineDraw(&g_sContext, sRect.i16XMin, sRect.i16YMin, + sRect.i16XMax, sRect.i16YMax); + } + + return(0); +} + +//***************************************************************************** +// +// This function implements the "fg" command and saves the given color as the +// foreground color for future drawing operations. +// +//***************************************************************************** +int +Cmd_Foreground(int argc, char *argv[]) +{ + // + // Get the color value to use if one was provided. Default to white if + // no color was specified. + // + if(argc > 1) + { + g_ui32Foreground = ustrtoul(argv[1], 0, 0); + } + else + { + g_ui32Foreground = ClrWhite; + } + + UARTprintf("Foreground color set to 0x%06x.\n", g_ui32Foreground); + + return(0); +} + + +//***************************************************************************** +// +// This function implements the "bg" command and saves the given color as the +// background color for future drawing operations. +// +//***************************************************************************** +int +Cmd_Background(int argc, char *argv[]) +{ + // + // Get the color value to use if one was provided. Default to black if + // no color was specified. + // + if(argc > 1) + { + g_ui32Background = ustrtoul(argv[1], 0, 0); + } + else + { + g_ui32Background = ClrBlack; + } + + UARTprintf("Background color set to 0x%06x.\n", g_ui32Background); + + return(0); +} + +//***************************************************************************** +// +// This function implements the "hlines" command and draws a single horizontal +// line on the display. +// +//***************************************************************************** +int +Cmd_HLine(int argc, char *argv[]) +{ + int32_t i32X1, i32X2, i32Y; + + // + // Ensure that we were passed the correct number of parameters. + // + if(argc != 4) + { + UARTprintf("This command requires 3 parameters, x1, x2, y.\n"); + return(0); + } + + // + // Extract the command line parameters. + // + i32X1 = ustrtoul(argv[1], 0, 0); + i32X2 = ustrtoul(argv[2], 0, 0); + i32Y = ustrtoul(argv[3], 0, 0); + + UARTprintf("Drawing a horizontal line on the display in color 0x%06x.\n", + g_ui32Foreground); + UARTprintf("Line (%d, %d) to (%d, %d).\n", i32X1, i32Y, i32X2, i32Y); + + // + // Set the desired color. + // + GrContextForegroundSet(&g_sContext, g_ui32Foreground); + + // + // Draw the line. + // + GrLineDrawH(&g_sContext, i32X1, i32X2, i32Y); + + return(0); +} + +//***************************************************************************** +// +// This function implements the "vline" command and draws a pattern of +// horizontal lines on the display. +// +//***************************************************************************** +int +Cmd_VLine(int argc, char *argv[]) +{ + int32_t i32Y1, i32Y2, i32X; + + // + // Ensure that we were passed the correct number of parameters. + // + if(argc != 4) + { + UARTprintf("This command requires 3 parameters, x, y1, y2.\n"); + return(0); + } + + // + // Extract the command line parameters. + // + i32X = ustrtoul(argv[1], 0, 0); + i32Y1 = ustrtoul(argv[2], 0, 0); + i32Y2 = ustrtoul(argv[3], 0, 0); + + UARTprintf("Drawing a vertical line on the display in color 0x%06x.\n", + g_ui32Foreground); + UARTprintf("Line (%d, %d) to (%d, %d).\n", i32X, i32Y1, i32X, i32Y2); + + // + // Set the desired color. + // + GrContextForegroundSet(&g_sContext, g_ui32Foreground); + + // + // Draw the line. + // + GrLineDrawV(&g_sContext, i32X, i32Y1, i32Y2); + + return(0); +} + +//***************************************************************************** +// +// This function implements the "pal" command and sets a single palette entry +// to the given color. +// +//***************************************************************************** +int +Cmd_Pal(int argc, char *argv[]) +{ +#if (DRIVER_BPP == 16) + UARTprintf("This command is not supported for 16bpp frame buffers.\n"); +#else + uint32_t ui32Color, ui32Index; + + // + // Get the palette index and color value to use. + // + if(argc > 2) + { + ui32Index = ustrtoul(argv[1], 0, 0); + ui32Color = ustrtoul(argv[2], 0, 0); + } + else + { + UARTprintf("This command requires 2 parameters - index, color.\n"); + return(0); + } + + if(ui32Index > ((DRIVER_BPP == 8) ? 255 : 15)) + { + UARTprintf("Invalid palette index! Must be less than %d.\n", + ((DRIVER_BPP == 8) ? 256 : 16)); + return(0); + } + + UARTprintf("Setting palette entry %d to color 0x%06x.\n", ui32Index, + ui32Color); + + // + // Set the desired color. + // + DRIVER_PALETTE_SET(&ui32Color, ui32Index, 1); +#endif + + return(0); +} + +//***************************************************************************** +// +// This function implements the "image" command and draws an image at a given +// (x, y) position on the display. If no parameters are provided, the image +// is tiled across the whole display. +// +//***************************************************************************** +int +Cmd_Image(int argc, char *argv[]) +{ + int32_t i32X, i32Y, i32Width, i32Height; + + // + // Set foreground and background colors to black and white. + // + GrContextBackgroundSet(&g_sContext, g_ui32Foreground); + GrContextForegroundSet(&g_sContext, g_ui32Background); + + // + // Get the palette index and color value to use. + // + if(argc == 1) + { + UARTprintf("Tiling image across the whole display.\n"); + + // + // Get the image dimensions. + // + i32Width = (int32_t)g_pucCurrentImage[1] + + 256 * (int32_t)g_pucCurrentImage[2]; + i32Height = (int32_t)g_pucCurrentImage[3] + + 256 * (int32_t)g_pucCurrentImage[4]; + + // + // Step through each row of images. + // + for(i32Y = 0; i32Y < GrContextDpyHeightGet(&g_sContext); + i32Y += i32Height) + { + // + // Step across each row of images. + // + for(i32X = 0; i32X < GrContextDpyWidthGet(&g_sContext); + i32X += i32Width) + { + // + // Draw the next tile on the display. + // + DrawImage(&g_sContext, g_ui32Clip, g_pucCurrentImage, + i32X, i32Y); + } + } + } + else + { + // + // The command has at least 1 parameter. Make sure there are 2. + if(argc != 3) + { + UARTprintf("This command requires 2 parameters - x, y.\n"); + return(0); + } + + // + // Read the coordinates. + // + i32X = (int32_t)ustrtoul(argv[1], 0, 0); + i32Y = (int32_t)ustrtoul(argv[2], 0, 0); + + // + // Draw the image at this position. + // + DrawImage(&g_sContext, g_ui32Clip, g_pucCurrentImage, i32X, i32Y); + } + + return(0); +} + +//***************************************************************************** +// +// This function implements the "setimg" command and sets the image that +// will be used with all future calls to Cmd_Image. +// +//***************************************************************************** +int +Cmd_SetImage(int argc, char *argv[]) +{ + uint32_t ui32Index; + + // + // Get the image index to use. + // + if(argc != 2) + { + UARTprintf("This command requires 1 parameter, the image index.\n"); + return(0); + } + + // + // Get the index. + // + ui32Index = (uint32_t)ustrtoul(argv[1], 0, 0); + + // + // Check that it is valid. + // + if(ui32Index >= NUM_IMAGES) + { + UARTprintf("Image index must be less than %d!\n", NUM_IMAGES); + } + else + { + g_pucCurrentImage = g_pImages[ui32Index].pucImage; + UARTprintf("Current image is %d - %s.\n", ui32Index, + g_pImages[ui32Index].pcDesc); + } + + return(0); +} + +//***************************************************************************** +// +// This function implements the "clipimg" command and sets the number of +// pixels to clip off the left of an image when drawing as a result of all +// future calls to Cmd_Image. +// +//***************************************************************************** +int +Cmd_ClipImage(int argc, char *argv[]) +{ + // + // Were we passed any parameters? + // + if(argc == 1) + { + UARTprintf("Disabling image clipping.\n"); + g_ui32Clip = 0; + } + else if(argc == 2) + { + g_ui32Clip = (uint32_t)ustrtoul(argv[1], 0, 0); + UARTprintf("Image clipping set to %d pixels.\n", g_ui32Clip); + } + else + { + UARTprintf("This function requires either zero or 1 parameter!\n"); + } + + return(0); +} + +//***************************************************************************** +// +// This function implements the "circle" command and draws a circle in a given +// color and with a given radius on the display. If no parameters are +// provided, filled and unfilled circles are tiled across the whole display. +// +//***************************************************************************** +int +Cmd_Circle(int argc, char *argv[]) +{ + int32_t i32X, i32Y, i32R; + bool bFill; + + // + // Set the foreground and background colors. + // + GrContextForegroundSet(&g_sContext, g_ui32Foreground); + GrContextBackgroundSet(&g_sContext, g_ui32Background); + + // + // Have we been provided with any parameters? + // + if(argc == 1) + { + UARTprintf("Tiling circles across the whole display.\n"); + + // + // We fill the first circle. + // + bFill = true; + + // + // Set the foreground color to white. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Step through each row of circles. + // + for(i32Y = 20; i32Y <= GrContextDpyHeightGet(&g_sContext); + i32Y += 40) + { + // + // Step across each row of circles. + // + for(i32X = 20; i32X <= GrContextDpyWidthGet(&g_sContext); + i32X += 40) + { + // + // Draw the next circle on the display. + // + if(bFill) + { + GrCircleFill(&g_sContext, i32X, i32Y, 20); + } + else + { + GrCircleDraw(&g_sContext, i32X, i32Y, 20); + } + + + // + // Flip the outline/fill marker. + // + bFill = !bFill; + } + } + } + else + { + // + // The command has at least 1 parameter. Make sure there are 3. + if(argc != 4) + { + UARTprintf("This command requires 3 parameters - x, y, r.\n"); + return(0); + } + + // + // Read the coordinates. + // + i32X = (int32_t)ustrtoul(argv[1], 0, 0); + i32Y = (int32_t)ustrtoul(argv[2], 0, 0); + i32R = (int32_t)ustrtoul(argv[3], 0, 0); + + // + // Fill the circle at this position. + // + GrCircleFill(&g_sContext, i32X, i32Y, i32R); + } + + return(0); +} + + +//***************************************************************************** +// +// This function implements the "text" command and displays a string of text +// at a given screen position. +// +//***************************************************************************** +int +Cmd_Text(int argc, char *argv[]) +{ + uint32_t ui32Color; + int32_t i32X, i32Y; + bool bCenter; + char *pcString; + + // + // Set the foreground and background colors. + // + GrContextForegroundSet(&g_sContext, g_ui32Foreground); + GrContextBackgroundSet(&g_sContext, g_ui32Background); + + // + // Set the font to be used. + // + GrContextFontSet(&g_sContext, g_psFontCmss28); + + // + // Set default values for the position and color of the string. + // + i32X = GrContextDpyWidthGet(&g_sContext) / 2; + i32Y = GrContextDpyHeightGet(&g_sContext) / 2; + ui32Color = ClrBlack; + bCenter = true; + + // + // Have we been provided with any parameters? + // + if(argc == 1) + { + // + // No parameters were provided so just show the default string in + // the middle of the display. + // + pcString = "Some Arbitrary Text"; + } + else + { + // + // The command has at least 1 parameter. This is the string so + // remember it. + // + pcString = argv[1]; + + // + // Has the X parameter been provided? + // + if(argc > 2) + { + // + // The X position has been provided. + // + i32X = (int32_t)ustrtoul(argv[2], 0, 0); + bCenter = false; + } + + // + // Has the Y parameter been provided? + // + if(argc > 3) + { + // + // The Y position has been provided. + // + i32Y = (int32_t)ustrtoul(argv[3], 0, 0); + bCenter = false; + } + } + + UARTprintf("Displaying %sstring at (%d, %d)\n", + bCenter ? "centered " : "", i32X, i32Y, ui32Color); + + // + // Draw the text.Fill the circle at this position. + // + if(bCenter) + { + GrStringDrawCentered(&g_sContext, pcString, -1, i32X, i32Y, true); + } + else + { + GrStringDraw(&g_sContext, pcString, -1, i32X, i32Y, true); + } + + return(0); +} + +//***************************************************************************** +// +// This function implements the "colbar" command and fills the screen with a +// color bar pattern. +// +//***************************************************************************** +int +Cmd_ColorBars(int argc, char *argv[]) +{ + uint32_t ui32X, ui32Width, ui32Height; + tRectangle sRect; + + // + // Determine the size of the color bar. + // + ui32Width = GrContextDpyWidthGet(&g_sContext) / NUM_COLOR_BARS; + ui32Height = GrContextDpyHeightGet(&g_sContext); + + // + // The Y coordinates for each color bar don't change. + // + sRect.i16YMin = 0; + sRect.i16YMax = (ui32Height - 1); + + for(ui32X = 0; ui32X < NUM_COLOR_BARS; ui32X++) + { + sRect.i16XMin = ui32X * ui32Width; + if(ui32X < (NUM_COLOR_BARS - 1)) + { + // + // For all but the rightmost bar, set the calculated width. + // + sRect.i16XMax = sRect.i16XMin + ui32Width - 1; + } + else + { + // + // Ensure the bars reach the right edge. This prevents any + // rounding error from leaving undrawn pixels on the right + // depending upon the screen size and number of color bars + // in use. + // + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext); + } + + GrContextForegroundSet(&g_sContext, g_pui32BarColors[ui32X]); + GrRectFill(&g_sContext, &sRect); + } + + // + // Revert to the expected foreground color. + // + GrContextForegroundSet(&g_sContext, g_ui32Foreground); + + return(0); +} + +//***************************************************************************** +// +// This function implements the "pat" command and draws the same test pattern +// that is displayed when the application starts. +// +//***************************************************************************** +int +Cmd_Pattern(int argc, char *argv[]) +{ + UARTprintf("Drawing initial test pattern.\n"); + DrawTestPattern(&g_sContext); + return(0); +} + +//***************************************************************************** +// +// This function implements the "perf" command and draws randomly positioned, +// filled rectangles for some period of time. +// +//***************************************************************************** +int +Cmd_Perf(int argc, char *argv[]) +{ + uint32_t ui32NumSeconds, ui32EndTime, ui32NumPixels; + tRectangle sRect, sRectScreen, sRectDraw; + uint32_t ui32Width, ui32Height, ui32Color, ui32X, ui32Y; + + // + // We need 1 parameter. Is it there? + // + if(argc != 2) + { + UARTprintf("This command requires one parameter!\n"); + return(0); + } + + // + // Get the required timeout. + // + ui32NumSeconds = ustrtoul(argv[1], 0, 0); + ui32NumPixels = 0; + + UARTprintf("Drawing random rectangles for %d seconds...\n", ui32NumSeconds); + + // + // When must the test end? + // + ui32EndTime = g_ui32SysTickCount + (ui32NumSeconds * SYSTICKS_PER_SECOND); + + // + // Get a rectangle representing the screen. + // + sRectScreen.i16XMin = 0; + sRectScreen.i16YMin = 0; + sRectScreen.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRectScreen.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + + // + // Loop for the required time. + // + while(g_ui32SysTickCount < ui32EndTime) + { + // + // Get some randomized parameters. + // + ui32Color = urand() & 0xFFFFFF; + ui32Width = (urand() & 0xFF) + 64; + ui32Height = (urand() & 0xFF) + 32; + ui32X = urand() & 0x1FF; + ui32Y = urand() & 0x1FF; + + sRect.i16XMin = (short)ui32X; + sRect.i16YMin = (short)ui32Y; + sRect.i16XMax = sRect.i16XMin + ui32Width; + sRect.i16YMax = sRect.i16YMin + ui32Height; + + // + // Clip the rectangle to the screen. + // + if(GrRectIntersectGet(&sRectScreen, &sRect, &sRectDraw)) + { + // + // Set the color and fill this rectangle. + // + GrContextForegroundSet(&g_sContext, ui32Color); + GrRectFill(&g_sContext, &sRectDraw); + + // + // Update our pixel count. + // + ui32NumPixels += ((sRectDraw.i16XMax - sRectDraw.i16XMin) + 1) * + ((sRectDraw.i16YMax - sRectDraw.i16YMin) + 1); + } + } + + UARTprintf("Performance test completed.\n"); + if(ui32NumSeconds) + { + // + // Recycle a couple of variables we're finished with to store the + // drawing throughput values. + // + ui32NumPixels /= ui32NumSeconds; + ui32Width = ui32NumPixels >> 20; + ui32Height = ((ui32NumPixels - (ui32Width << 20)) * 10) / (1024 * 1024); + + // + // Tell the user how fast we managed to draw pixels. + // + UARTprintf("Throughput %d.%01dMpps\n", ui32Width, ui32Height); + + // + // Calculate the number of MB per second. + // + ui32NumPixels = (ui32NumPixels * DRIVER_BPP) / 8; + ui32Width = ui32NumPixels >> 20; + ui32Height = ((ui32NumPixels - (ui32Width << 20)) * 10) / (1024 * 1024); + UARTprintf(" %d.%01dMBps\n", ui32Width, ui32Height); + } + + return(0); +} + +//***************************************************************************** +// +// A simple testcase allowing various graphics primitives to be tested. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Val; + int nStatus; + + // + // Set the PLL and system clock to the frequencies needed to allow + // generation of the required pixel clock. + // + g_ui32SysClk = MAP_SysCtlClockFreqSet(DRIVER_SYS_CLOCK_CONFIG, + DRIVER_SYS_CLOCK_FREQUENCY); + + // + // Enable GPIOA for the UART. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Set GPIO A0 and A1 as UART pins. + // + ui32Val = HWREG(GPIO_PORTA_BASE + GPIO_O_PCTL); + ui32Val &= 0xFFFFFF00; + ui32Val |= 0x00000011; + HWREG(GPIO_PORTA_BASE + GPIO_O_PCTL) = ui32Val; + + // + // Set GPIO A0 and A1 as UART. + // + GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Initialize the UART as a console for text I/O. + // + UARTStdioConfig(0, 115200, g_ui32SysClk); + + // + // Set up the system tick to run and interrupt when it times out. + // + MAP_SysTickIntEnable(); + MAP_SysTickPeriodSet(g_ui32SysClk / SYSTICKS_PER_SECOND); + MAP_SysTickEnable(); + + // + // Enable interrupts. + // + IntMasterEnable(); + + // + // Print hello message to user. + // + UARTprintf("\n\nGrLib Driver Test Tool\n\n"); + UARTprintf("Display configured for %dx%d at %dbpp.\n", + DRIVER_NAME.ui16Width, DRIVER_NAME.ui16Height, DRIVER_BPP); + UARTprintf("System clock is %dMHz\n", g_ui32SysClk / 1000000); + UARTprintf("\nEnter ""help"" for a list of supported commands\n\n"); + + // + // Initialize the display. + // + DRIVER_INIT(g_ui32SysClk); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &DRIVER_NAME); + + // + // We allow the testcase to be built such that it issues no drawing orders + // other than those requested via the command line. This can be helpful + // when bringing up a new display driver. + // +#ifndef NO_GRLIB_CALLS_ON_STARTUP + // + // Draw a test pattern on the display. + // + DrawTestPattern(&g_sContext); +#endif + + // + // Loop forever. + // + while(1) + { + // + // Print a prompt to the console. Show the CWD. + // + UARTprintf("> "); + + // + // Get a line of text from the user. + // + UARTgets(g_cCmdBuf, sizeof(g_cCmdBuf)); + + // + // Pass the line from the user to the command processor. + // It will be parsed and valid commands executed. + // + nStatus = CmdLineProcess(g_cCmdBuf); + + // + // Handle the case of bad command. + // + if(nStatus == CMDLINE_BAD_CMD) + { + UARTprintf("Bad command!\n"); + } + + // + // Handle the case of too many arguments. + // + else if(nStatus == CMDLINE_TOO_MANY_ARGS) + { + UARTprintf("Too many arguments for command processor!\n"); + } + } +} diff --git a/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ewd b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ewp b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ewp new file mode 100644 index 0000000..356394e --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ewp @@ -0,0 +1,807 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\..\..\..\utils\cmdline.c + + + $PROJ_DIR$\grlib_driver_test.c + + + $PROJ_DIR$\images.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.icf b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.icf new file mode 100644 index 0000000..bfef852 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// grlib_driver_test.icf - Linker configuration file for grlib_driver_test. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ld b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ld new file mode 100644 index 0000000..1ab660d --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * grlib_driver_test.ld - Linker configuration file for grlib_driver_test. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.sct b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.sct new file mode 100644 index 0000000..e10719a --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; grlib_driver_test.sct - Linker configuration file for grlib_driver_test. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.uvopt b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.uvopt new file mode 100644 index 0000000..93d0dd9 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + grlib_driver_test + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\cmdline.c + cmdline.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\grlib_driver_test.c + grlib_driver_test.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\images.c + images.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.uvproj b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.uvproj new file mode 100644 index 0000000..d5d739f --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + grlib_driver_test + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + grlib_driver_test + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\grlib_driver_test.bin .\rvmdk\grlib_driver_test.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + grlib_driver_test.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cmdline.c + 1 + ..\..\..\..\utils\cmdline.c + + + grlib_driver_test.c + 1 + .\grlib_driver_test.c + + + images.c + 1 + .\images.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test_ccs.cmd b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test_ccs.cmd new file mode 100644 index 0000000..443e9cd --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * grlib_driver_test_ccs.cmd - CCS linker configuration file for grlib_driver_test. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/grlib_driver_test/images.c b/boards/dk-tm4c129x/grlib_driver_test/images.c new file mode 100644 index 0000000..4a42d7c --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/images.c @@ -0,0 +1,551 @@ +//***************************************************************************** +// +// images.c - Data for the images used by the application. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// The image of the TI logo. +// +//***************************************************************************** +const unsigned char g_pucLogo[] = +{ + IMAGE_FMT_4BPP_COMP, + 80, 0, + 75, 0, + + 15, + 0x00, 0x00, 0x00, + 0x02, 0x02, 0x0f, + 0x06, 0x05, 0x27, + 0x09, 0x07, 0x3b, + 0x0c, 0x09, 0x4c, + 0x0d, 0x0a, 0x56, + 0x10, 0x0c, 0x68, + 0x13, 0x0f, 0x7a, + 0x15, 0x10, 0x89, + 0x17, 0x11, 0x95, + 0x19, 0x14, 0xa5, + 0x1c, 0x16, 0xb6, + 0x1e, 0x18, 0xc7, + 0x22, 0x1a, 0xdc, + 0x22, 0x1b, 0xe3, + 0x24, 0x1c, 0xed, + + 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x04, 0xfe, 0x13, 0xee, 0xee, + 0xee, 0xe9, 0xef, 0xd1, 0x07, 0x07, 0xc2, 0x77, 0x29, 0x04, 0xff, 0xff, + 0xff, 0xe9, 0xff, 0x3c, 0xff, 0xd1, 0x07, 0x07, 0x77, 0x29, 0x04, 0xff, + 0x23, 0xff, 0xff, 0xe9, 0xff, 0xff, 0xd1, 0x07, 0x07, 0xc2, 0x77, 0x29, + 0x04, 0xff, 0xff, 0xff, 0xe9, 0xff, 0x2e, 0xff, 0xd1, 0x05, 0x01, 0x07, + 0xbf, 0x32, 0x04, 0x11, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xff, 0xd1, 0x02, + 0x0e, 0x6f, 0xdc, 0xdc, 0xf7, 0x07, 0xbf, 0x32, 0x04, 0x11, 0xff, 0xff, + 0xff, 0xe9, 0xff, 0xff, 0xd1, 0x02, 0x0e, 0xaf, 0xff, 0xff, 0xf5, 0x07, + 0xbf, 0x32, 0x04, 0x11, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xff, 0xd1, 0x02, + 0x0e, 0xdf, 0xff, 0xff, 0xf2, 0x07, 0xbf, 0x32, 0x04, 0x11, 0xff, 0xff, + 0xff, 0xe9, 0xff, 0xff, 0xd1, 0x01, 0x73, 0x01, 0xc5, 0x07, 0xa7, 0x00, + 0x04, 0x29, 0x11, 0xae, 0x04, 0x03, 0x99, 0xa0, 0x07, 0xbf, 0x72, 0x04, + 0xc5, 0x29, 0x11, 0xff, 0xff, 0xd1, 0x01, 0x08, 0x99, 0x76, 0x70, 0x07, + 0xbf, 0x72, 0x04, 0x29, 0x11, 0xff, 0x20, 0xff, 0xd1, 0x01, 0x07, 0xcb, + 0xbb, 0xbc, 0x40, 0xe1, 0x07, 0xbf, 0x72, 0x04, 0xff, 0xff, 0xff, 0xe9, + 0x1e, 0xff, 0xff, 0xd1, 0x07, 0x07, 0x77, 0x29, 0x04, 0x11, 0xff, 0xff, + 0xff, 0xe9, 0xff, 0xff, 0xd1, 0x07, 0xe1, 0x07, 0x77, 0x29, 0x04, 0xff, + 0xff, 0xff, 0xe9, 0x00, 0xff, 0xff, 0xe6, 0x45, 0x63, 0x00, 0x26, 0x55, + 0x2b, 0x55, 0x64, 0xda, 0x55, 0xe9, 0x51, 0x04, 0xd4, 0x03, 0x00, 0x00, + 0x04, 0xff, 0xff, 0xff, 0xe9, 0xd2, 0x03, 0xf7, 0x00, 0x6f, 0xff, 0xff, + 0xf9, 0xda, 0x62, 0x63, 0xf2, 0x04, 0xd4, 0x00, 0x00, 0x04, 0x54, 0x22, + 0x00, 0xf3, 0x00, 0x9f, 0xff, 0xff, 0xf6, 0x00, 0x8f, 0xb1, 0x74, 0xf2, + 0x04, 0xd4, 0x00, 0x00, 0x04, 0x54, 0x8e, 0x22, 0xd1, 0x00, 0xcf, 0x0a, + 0xd9, 0x62, 0xf2, 0xc6, 0x04, 0xd4, 0x00, 0x00, 0x04, 0x54, 0x22, 0xc0, + 0x45, 0x01, 0x01, 0xd1, 0x01, 0xef, 0x74, 0xf2, 0x04, 0x8c, 0xd4, 0x00, + 0x00, 0x04, 0x54, 0x22, 0x90, 0x03, 0xb6, 0x01, 0xb0, 0xda, 0x62, 0xf2, + 0x04, 0xd4, 0x00, 0x32, 0x00, 0x04, 0x4d, 0x11, 0x60, 0x06, 0x01, 0x90, + 0xd8, 0xda, 0x62, 0xf2, 0x04, 0xd4, 0x00, 0x00, 0x04, 0xcb, 0x4d, 0x11, + 0x30, 0x09, 0x01, 0x50, 0xda, 0x62, 0x62, 0xf2, 0x04, 0xd4, 0x00, 0x00, + 0x04, 0x4d, 0xff, 0x0b, 0xff, 0xfe, 0x10, 0x0c, 0x01, 0x30, 0xda, 0x62, + 0x62, 0xf2, 0x04, 0xd4, 0x00, 0x00, 0x04, 0x4d, 0xda, 0x00, 0xaa, 0xb9, + 0x00, 0x1e, 0xff, 0xff, 0xfe, 0x10, 0x0b, 0x1a, 0xba, 0xaa, 0xdf, 0x62, + 0xf2, 0x04, 0xd4, 0x1a, 0x00, 0x00, 0x04, 0x62, 0x41, 0x80, 0x49, 0x2f, + 0x12, 0xff, 0xff, 0xfb, 0x11, 0x01, 0xef, 0x62, 0xf3, 0xc6, 0x04, 0xd4, + 0x00, 0x00, 0x04, 0x62, 0x41, 0x60, 0x85, 0x49, 0x6f, 0xff, 0xff, 0xf8, + 0x6f, 0xf4, 0x04, 0xc4, 0xd4, 0x5e, 0xff, 0xff, 0x30, 0x49, 0x9f, 0xff, + 0x2b, 0xff, 0xf6, 0x11, 0x06, 0x6b, 0xf7, 0x04, 0xd4, 0x11, 0x00, 0x00, + 0x04, 0x5b, 0xff, 0xfe, 0x10, 0x49, 0x0a, 0xbf, 0xff, 0xff, 0xf3, 0x11, + 0x09, 0x6b, 0xfc, 0x86, 0x02, 0x05, 0x55, 0x55, 0x55, 0xe9, 0xd1, 0x38, + 0x90, 0x5b, 0xff, 0xfb, 0x01, 0x01, 0xef, 0xff, 0xff, 0x55, 0xd1, 0x11, + 0x0c, 0x6c, 0x40, 0x69, 0x0d, 0x14, 0xd5, 0x7c, 0x4a, 0xf9, 0x01, 0x03, + 0x01, 0xb0, 0x19, 0x56, 0x1f, 0x1c, 0xc0, 0x69, 0x09, 0x06, 0xc6, 0xf6, + 0xaa, 0x01, 0x06, 0x01, 0x80, 0x19, 0x3f, 0x1c, 0xfa, 0xb0, 0x69, 0x05, + 0x06, 0xc6, 0xf4, 0x02, 0x22, 0x00, 0x41, 0x08, 0x01, 0x50, 0x01, 0x22, + 0x20, 0x7f, 0x1d, 0x06, 0xb4, 0x00, 0x00, 0x00, 0xcf, 0x05, 0x6d, 0xff, + 0x04, 0xfe, 0xff, 0xfe, 0x10, 0x0b, 0x01, 0x20, 0x0c, 0x81, 0x3f, 0xff, + 0xf9, 0x00, 0x00, 0x00, 0x5f, 0x8f, 0x80, 0x46, 0xfc, 0x00, 0x1f, 0xff, + 0xff, 0xfe, 0x10, 0x40, 0x1e, 0x3f, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x08, + 0xc0, 0x8f, 0x46, 0xfa, 0x00, 0x3f, 0xff, 0xff, 0xfb, 0xc0, 0xda, 0x2e, + 0xf9, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xc0, 0x87, 0x3d, 0xf6, 0x00, 0x5f, + 0xff, 0xff, 0xf8, 0x20, 0x00, 0x6f, 0x47, 0xff, 0xf9, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x08, 0x87, 0x3d, 0xf3, 0x00, 0x9f, 0xff, 0x30, 0xff, 0xf6, + 0xda, 0x36, 0xf9, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x6f, 0x7f, 0x34, + 0xf1, 0x00, 0xcf, 0x18, 0xff, 0xff, 0xf3, 0xda, 0x3e, 0xf9, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x05, 0x7f, 0x34, 0xc0, 0x01, 0x0c, 0xef, 0xff, + 0xff, 0xd0, 0xda, 0x3e, 0xf9, 0x00, 0x2c, 0x00, 0x00, 0xe9, 0x6f, 0x77, + 0x2b, 0x90, 0x02, 0x90, 0x01, 0xb0, 0x03, 0x5f, 0xff, 0xff, 0xf9, 0x00, + 0x2c, 0x00, 0x00, 0xe9, 0x09, 0x6f, 0x23, 0x60, 0x06, 0xb0, 0x01, 0x80, + 0xda, 0x46, 0xf9, 0x00, 0x00, 0x00, 0x99, 0xe9, 0x01, 0xdf, 0x67, 0x1a, + 0x30, 0x09, 0x01, 0x61, 0x50, 0xda, 0x4e, 0xf9, 0x00, 0x00, 0x00, 0xe9, + 0x31, 0x00, 0x7f, 0x67, 0x19, 0xfe, 0x10, 0x0b, 0x01, 0x61, 0x20, 0xda, + 0x4e, 0xf9, 0x00, 0x00, 0x00, 0xe9, 0x30, 0x00, 0x2f, 0x67, 0x19, 0xfc, + 0x00, 0x1e, 0xff, 0x08, 0xff, 0xfd, 0x10, 0x0c, 0x67, 0xff, 0xff, 0xf9, + 0x13, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x0a, 0x67, 0x5b, 0x00, 0x3f, 0xee, + 0xee, 0xfb, 0x00, 0x05, 0xee, 0xed, 0x84, 0x6f, 0xf9, 0x00, 0x00, 0x00, + 0xe9, 0x00, 0x05, 0xc0, 0x77, 0x29, 0xf6, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x08, 0x00, 0x00, 0x01, 0x04, 0x57, 0xf9, 0x00, 0x00, 0x44, 0x00, 0xe9, + 0x00, 0x00, 0xcf, 0x6f, 0xff, 0xff, 0x52, 0xf2, 0x5e, 0x06, 0x5e, 0xc8, + 0x42, 0x6e, 0x6f, 0x85, 0x6a, 0xfc, 0x42, 0x25, 0xdf, 0x29, 0xe1, 0x5e, + 0x42, 0x0a, 0x5a, 0xff, 0xff, 0xfd, 0x72, 0x7e, 0x00, 0x21, 0x00, 0x0c, + 0x6a, 0x90, 0x00, 0x00, 0x1c, 0x29, 0x63, 0xc0, 0x5f, 0x5a, 0xff, 0xfc, + 0x40, 0x86, 0x41, 0x50, 0x02, 0x01, 0xf8, 0x01, 0x01, 0xef, 0xff, 0xff, + 0x51, 0xc0, 0x46, 0x1e, 0x59, 0xff, 0xfb, 0x20, 0x8e, 0x84, 0x4b, 0x3f, + 0xff, 0xff, 0x90, 0x02, 0x5f, 0xff, 0x20, 0xff, 0xe1, 0x3e, 0x4f, 0xff, + 0xff, 0xff, 0xfd, 0x62, 0x30, 0x96, 0x54, 0x01, 0x6b, 0xb5, 0x0b, 0x0b, + 0x10, 0xff, 0xff, 0xf6, 0x36, 0x7f, 0xff, 0xff, 0xff, 0x74, 0x70, 0x9e, + 0x5e, 0x1d, 0x03, 0x27, 0x00, 0x00, 0x0e, 0x9f, 0xff, 0xff, 0xd2, 0x07, + 0xbf, 0x1d, 0xbf, 0x00, 0xff, 0xff, 0xfd, 0x96, 0x54, 0x33, 0x33, 0x33, + 0x03, 0x33, 0x32, 0xcf, 0xff, 0xfc, 0x10, 0x07, 0xbf, 0x86, 0x75, 0x4f, + 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xb0, 0xee, 0x07, 0x07, 0x76, 0x0b, 0x02, + 0xe2, 0xc1, 0xfc, 0xee, 0x07, 0x07, 0x77, 0x05, 0x01, 0xe9, 0xd3, 0xe1, + 0xe0, 0x07, 0x07, 0x77, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xdc, 0xe9, 0xd2, + 0x40, 0x07, 0x07, 0x77, 0x00, 0x6f, 0x1b, 0xff, 0xff, 0xff, 0xe9, 0xd1, + 0xf9, 0x07, 0x07, 0x81, 0x77, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xe9, + 0xb8, 0xd1, 0xf2, 0x07, 0x07, 0x77, 0x00, 0x00, 0x06, 0x1b, 0xff, 0xff, + 0xff, 0xe9, 0xd1, 0x90, 0x07, 0x07, 0x80, 0x77, 0x00, 0x00, 0x01, 0xdf, + 0xff, 0xff, 0xff, 0x8f, 0xe9, 0xff, 0xff, 0x40, 0x07, 0x07, 0x77, 0x29, + 0x08, 0x6f, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xfe, 0x10, 0xf0, 0x07, 0x07, + 0x77, 0x29, 0x0c, 0xff, 0xff, 0xff, 0x9e, 0xe9, 0xff, 0xfb, 0x07, 0x07, + 0x77, 0x2a, 0x03, 0x13, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xfb, 0x07, 0x07, + 0xc2, 0x77, 0x2b, 0x8f, 0xff, 0xff, 0xff, 0xe9, 0xfb, 0xf0, 0x07, 0x07, + 0x77, 0x2b, 0x0a, 0xff, 0xff, 0xff, 0xbc, 0xe9, 0xfc, 0x07, 0x07, 0x77, + 0x2c, 0xcf, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x07, 0x07, + 0xc2, 0x77, 0x2b, 0x0c, 0xff, 0xff, 0xff, 0xe9, 0x30, 0xf0, 0x07, 0x07, + 0x77, 0x2c, 0xaf, 0xff, 0xff, 0xff, 0x1e, 0xff, 0xff, 0x60, 0x07, 0x07, + 0x77, 0x2c, 0x05, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0x07, + 0xc0, 0x77, 0x2d, 0x18, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf0, 0x07, 0x07, + 0x77, 0x2e, 0x14, 0x79, 0xa9, 0x86, 0x7f, 0x20, 0x07, 0x07, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x07, +}; + +const unsigned char g_pucTest32x32x1Comp[] = +{ + IMAGE_FMT_1BPP_COMP, + 32, 0, + 32, 0, + + 0x80, 0x02, 0x3f, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0x00, 0xfa, 0x6f, + 0xff, 0xff, 0xf6, 0x77, 0xff, 0xff, 0x00, 0xee, 0x7b, 0xff, 0xff, 0xde, + 0x7d, 0xff, 0xff, 0x00, 0xbe, 0x7e, 0xff, 0xff, 0x7e, 0x7f, 0x7f, 0xfe, + 0x00, 0xfe, 0x7f, 0xbf, 0xfd, 0xfe, 0x7f, 0xdf, 0xfb, 0x00, 0xfe, 0x7f, + 0xef, 0xf7, 0xfe, 0x7f, 0xf7, 0xef, 0x00, 0xfe, 0x7f, 0xfb, 0xdf, 0xfe, + 0x7f, 0xfd, 0xbf, 0x0f, 0xfe, 0x7f, 0xfe, 0x7f, 0xe2, 0xa4, 0x62, 0x22, + 0x00, 0xef, 0xf7, 0xfe, 0x7f, 0xdf, 0xfb, 0xfe, 0x7f, 0x00, 0xbf, 0xfd, + 0xfe, 0x7f, 0x7f, 0xfe, 0xfe, 0x7e, 0x00, 0xff, 0xff, 0x7e, 0x7d, 0xff, + 0xff, 0xbe, 0x7b, 0x00, 0xff, 0xff, 0xde, 0x77, 0xff, 0xff, 0xee, 0x6f, + 0x00, 0xff, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xfa, 0x3f, 0x00, 0xff, 0xff, + 0xfc, 0x00, 0x00, 0x00, 0x00, +}; + +const unsigned char g_pucTest32x32x1Raw[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 32, 0, + 32, 0, + + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xfa, + 0x6f, 0xff, 0xff, 0xf6, 0x77, 0xff, 0xff, 0xee, 0x7b, 0xff, 0xff, 0xde, + 0x7d, 0xff, 0xff, 0xbe, 0x7e, 0xff, 0xff, 0x7e, 0x7f, 0x7f, 0xfe, 0xfe, + 0x7f, 0xbf, 0xfd, 0xfe, 0x7f, 0xdf, 0xfb, 0xfe, 0x7f, 0xef, 0xf7, 0xfe, + 0x7f, 0xf7, 0xef, 0xfe, 0x7f, 0xfb, 0xdf, 0xfe, 0x7f, 0xfd, 0xbf, 0xfe, + 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfd, 0xbf, 0xfe, + 0x7f, 0xfb, 0xdf, 0xfe, 0x7f, 0xf7, 0xef, 0xfe, 0x7f, 0xef, 0xf7, 0xfe, + 0x7f, 0xdf, 0xfb, 0xfe, 0x7f, 0xbf, 0xfd, 0xfe, 0x7f, 0x7f, 0xfe, 0xfe, + 0x7e, 0xff, 0xff, 0x7e, 0x7d, 0xff, 0xff, 0xbe, 0x7b, 0xff, 0xff, 0xde, + 0x77, 0xff, 0xff, 0xee, 0x6f, 0xff, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xfa, + 0x3f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, +}; + +const unsigned char g_pucTest32x32x4Comp[] = +{ + IMAGE_FMT_4BPP_COMP, + 32, 0, + 32, 0, + + 4, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, + 0x80, 0x80, 0x00, + 0x00, 0xff, 0x00, + 0xff, 0xff, 0xff, + + 0xc6, 0x07, 0x06, 0x44, 0x44, 0x44, 0xe9, 0xd4, 0x44, 0x0c, 0x44, 0x00, + 0x02, 0x04, 0x7f, 0x31, 0x40, 0x10, 0x30, 0x02, 0x20, 0x07, 0x01, 0x01, + 0x10, 0x02, 0x22, 0x45, 0x04, 0x0f, 0x44, 0x40, 0x11, 0x81, 0x20, 0x0f, + 0x25, 0x44, 0x01, 0x82, 0x22, 0x04, 0x0f, 0x11, 0x83, 0x66, 0x20, 0x0f, + 0x84, 0x22, 0x04, 0x0f, 0x84, 0x20, 0xcd, 0x0f, 0x04, 0x22, 0x04, 0x0e, + 0x85, 0x20, 0x0e, 0x9b, 0x05, 0x22, 0x04, 0x0d, 0x86, 0x20, 0x0d, 0x06, + 0x37, 0x22, 0x04, 0x0c, 0x87, 0x20, 0x0c, 0x87, 0x87, 0x98, 0x05, 0x03, + 0x30, 0x07, 0x0b, 0x33, 0x33, 0x01, 0xc6, 0x07, 0x0a, 0x33, 0x33, 0x30, + 0x07, 0x0b, 0x33, 0x31, 0x33, 0x01, 0x07, 0x0a, 0x33, 0x33, 0x30, 0x07, + 0x8c, 0x0b, 0x33, 0x33, 0x01, 0x06, 0x0b, 0x33, 0x33, 0x63, 0x30, 0x05, + 0x0d, 0x33, 0x33, 0x01, 0x04, 0x0d, 0x18, 0x33, 0x33, 0x30, 0x03, 0x0f, + 0x33, 0x33, 0x01, 0xc7, 0x02, 0x0f, 0x33, 0x33, 0x30, 0x01, 0x0f, 0x4a, + 0x18, 0x01, 0x10, 0x02, 0x0f, 0x42, 0x30, 0x10, 0x00, 0xc7, 0x0f, 0x43, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa3, +}; + +const unsigned char g_pucTest32x32x4Raw[] = +{ + IMAGE_FMT_4BPP_UNCOMP, + 32, 0, + 32, 0, + + 4, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, + 0x80, 0x80, 0x00, + 0x00, 0xff, 0x00, + 0xff, 0xff, 0xff, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, + 0x02, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x10, + 0x02, 0x20, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x01, 0x10, + 0x02, 0x22, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x11, 0x10, + 0x02, 0x22, 0x20, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x01, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x20, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x01, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x20, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x01, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x04, 0x44, 0x44, 0x44, 0x44, 0x40, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x20, 0x44, 0x44, 0x44, 0x44, 0x01, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x04, 0x44, 0x44, 0x40, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x44, 0x44, 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x04, 0x40, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x03, 0x30, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x33, 0x33, 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x03, 0x33, 0x33, 0x30, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x20, 0x33, 0x33, 0x33, 0x33, 0x01, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x22, 0x03, 0x33, 0x33, 0x33, 0x33, 0x30, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x20, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x01, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x22, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, 0x11, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x20, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x01, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x22, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, 0x11, 0x11, 0x10, + 0x02, 0x22, 0x20, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x01, 0x11, 0x10, + 0x02, 0x22, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, 0x11, 0x10, + 0x02, 0x20, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x01, 0x10, + 0x02, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, 0x10, + 0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const unsigned char g_pucTest32x32x8Comp[] = +{ + IMAGE_FMT_8BPP_COMP, + 32, 0, + 32, 0, + + 63, + 0x00, 0x00, 0x00, + 0xff, 0x00, 0x0f, + 0xff, 0x00, 0x10, + 0xff, 0x0d, 0x00, + 0xff, 0x0e, 0x00, + 0xff, 0x00, 0x39, + 0xff, 0x00, 0x3a, + 0xff, 0x00, 0x6d, + 0xff, 0x00, 0x6e, + 0xff, 0x3c, 0x00, + 0xff, 0x3d, 0x00, + 0x00, 0x00, 0xff, + 0xff, 0x00, 0xa4, + 0xff, 0x00, 0xa5, + 0x28, 0x00, 0xff, + 0x29, 0x00, 0xff, + 0x65, 0x00, 0xff, + 0x66, 0x00, 0xff, + 0xff, 0x00, 0xd6, + 0xff, 0x00, 0xd7, + 0xa6, 0x00, 0xff, + 0xa7, 0x00, 0xff, + 0xff, 0x77, 0x00, + 0x00, 0x25, 0xff, + 0xff, 0x78, 0x00, + 0x00, 0x26, 0xff, + 0xe0, 0x00, 0xff, + 0xe1, 0x00, 0xff, + 0xff, 0x00, 0xfa, + 0xff, 0x00, 0xfb, + 0x00, 0x5d, 0xff, + 0x00, 0x5e, 0xff, + 0xff, 0xb4, 0x00, + 0xff, 0xb5, 0x00, + 0x0b, 0xff, 0x00, + 0x0c, 0xff, 0x00, + 0x00, 0xff, 0x11, + 0x33, 0xff, 0x00, + 0x34, 0xff, 0x00, + 0x67, 0xff, 0x00, + 0x68, 0xff, 0x00, + 0xff, 0xe7, 0x00, + 0xff, 0xe8, 0x00, + 0x9e, 0xff, 0x00, + 0x9f, 0xff, 0x00, + 0x00, 0x9b, 0xff, + 0x00, 0x9c, 0xff, + 0x00, 0xff, 0x3d, + 0x00, 0xff, 0x3e, + 0xd0, 0xff, 0x00, + 0xd1, 0xff, 0x00, + 0xf6, 0xff, 0x00, + 0xf7, 0xff, 0x00, + 0x00, 0xff, 0x75, + 0x00, 0xff, 0x76, + 0x00, 0xd3, 0xff, + 0x00, 0xd4, 0xff, + 0x00, 0xff, 0xaf, + 0x00, 0xff, 0xb0, + 0x00, 0xff, 0xe1, + 0x00, 0xff, 0xe2, + 0x00, 0xfb, 0xff, + 0x00, 0xfc, 0xff, + 0xff, 0xff, 0xff, + + 0x00, 0x0b, 0x0f, 0x11, 0x15, 0x1b, 0x1d, 0x12, 0x0d, 0x00, 0x07, 0x06, + 0x02, 0x03, 0x09, 0x18, 0x20, 0x2a, 0x00, 0x34, 0x32, 0x2b, 0x27, 0x26, + 0x23, 0x24, 0x30, 0x00, 0x36, 0x3a, 0x3b, 0x3e, 0x37, 0x2d, 0x1e, 0x17, + 0x00, 0x0b, 0x0f, 0x10, 0x14, 0x1a, 0x1c, 0x12, 0x0d, 0x00, 0x08, 0x06, + 0x02, 0x04, 0x09, 0x16, 0x21, 0x29, 0x14, 0x34, 0x32, 0x2c, 0x04, 0x39, + 0x03, 0x19, 0x0b, 0x10, 0x0f, 0x11, 0x15, 0x07, 0x16, 0x21, 0x2a, 0x33, + 0x80, 0x02, 0x22, 0x24, 0x2f, 0x36, 0x39, 0x3c, 0x3d, 0x00, 0x38, 0x2d, + 0x1e, 0x17, 0x0b, 0x0f, 0x10, 0x15, 0x00, 0x1b, 0x1c, 0x12, 0x0c, 0x08, + 0x05, 0x01, 0x04, 0x40, 0x0a, 0x03, 0x2b, 0x27, 0x25, 0x23, 0x24, 0x30, + 0x05, 0x36, 0x3a, 0x3c, 0x3e, 0x37, 0x05, 0x1a, 0x02, 0x04, 0x06, 0x02, + 0x03, 0x09, 0x18, 0x01, 0x31, 0x2b, 0x20, 0x27, 0x26, 0x02, 0x39, 0x3b, + 0x3e, 0x38, 0x2d, 0x05, 0x1e, 0x19, 0x0b, 0x0f, 0x11, 0x02, 0x0d, 0x01, + 0x50, 0x04, 0x03, 0x32, 0x05, 0x3a, 0x3c, 0x3e, 0x38, 0x54, 0x2e, 0x02, + 0x10, 0x04, 0x05, 0x02, 0x20, 0x2a, 0x11, 0x34, 0x32, 0x2c, 0x02, 0x2f, + 0x36, 0x39, 0x01, 0x10, 0x2d, 0x1e, 0x17, 0x06, 0x07, 0x05, 0x01, 0x03, + 0x01, 0x09, 0x16, 0x21, 0x2a, 0x34, 0x31, 0x2b, 0x02, 0x08, 0x30, 0x36, + 0x3a, 0x3b, 0x02, 0x19, 0x0b, 0x0f, 0x11, 0x11, 0x15, 0x1b, 0x01, 0x3f, + 0x3f, 0x3f, 0xe9, 0x04, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, + 0x01, 0x36, 0x39, 0x3b, 0x3d, 0x37, 0x2d, 0x1f, 0x01, 0x4c, 0x10, 0x01, + 0x13, 0x0c, 0x07, 0x07, 0x3b, 0x3e, 0x13, 0x38, 0x2d, 0x1e, 0x05, 0x12, + 0x0d, 0x07, 0x06, 0x0e, 0x3a, 0x3c, 0x3e, 0x37, 0x07, 0x07, 0x07, 0x36, + 0x08, 0x3a, 0x3b, 0x3e, 0x38, 0x03, 0x11, 0x15, 0x1a, 0xe0, 0x07, 0x07, + 0x06, 0x17, 0x0b, 0x0f, 0x10, 0x15, 0x75, 0x1b, 0x07, 0x07, 0x06, 0x19, + 0x02, 0x1a, 0x07, 0x81, 0x07, 0x00, 0x36, 0x39, 0x3b, 0x3e, 0x37, 0x07, + 0xc0, 0x07, 0x07, 0x36, 0x3a, 0x3b, 0x3e, 0x38, 0x2d, 0x2c, 0x1e, 0x17, + 0x02, 0x1b, 0x01, 0x46, 0x3f, 0x3f, 0x40, 0x3f, 0xe9, 0x3f, 0x3f, 0x36, + 0x39, 0x3b, 0x3e, 0x08, 0x37, 0x2d, 0x1e, 0x19, 0x02, 0x1a, 0x1c, 0x12, + 0x60, 0x0c, 0x07, 0x06, 0x3a, 0x3b, 0x3e, 0x38, 0x2d, 0x38, 0x1e, 0x17, + 0x07, 0x07, 0x07, 0x3e, 0x37, 0x2d, 0x2e, 0x1e, 0x19, 0x01, 0x14, 0x07, + 0x07, 0x02, 0x3c, 0x83, 0x06, 0x15, 0x1b, 0x1c, 0x12, 0x0d, 0x07, 0x05, + 0x1b, 0x35, 0x3a, 0x3b, 0x07, 0x01, 0x0c, 0x07, 0x05, 0x2b, 0x36, 0x39, + 0x05, 0x0e, 0x03, 0x0d, 0x07, 0x06, 0x0e, 0x3a, 0x3c, 0x3e, 0x38, 0x07, + 0x07, 0x07, 0x36, 0x21, 0x3a, 0x3b, 0x01, 0x1f, 0x19, 0x0b, 0x0f, 0x04, + 0x00, 0x08, 0x05, 0x02, 0x04, 0x09, 0x18, 0x20, 0x2a, 0x00, 0x33, 0x32, + 0x2b, 0x27, 0x26, 0x23, 0x24, 0x30, 0x14, 0x36, 0x3a, 0x3c, 0x01, 0x1e, + 0x02, 0x14, 0x1a, 0xa2, 0x03, 0x01, 0x01, 0x21, 0x2a, 0x34, 0x01, 0x25, + 0x94, 0x02, 0x39, 0x3b, 0x06, 0x15, 0x01, 0x0c, 0x08, 0x0b, 0x06, 0x02, + 0x04, 0x0a, 0x02, 0x31, 0x07, 0x07, 0x81, 0x01, 0x0d, 0x08, 0x05, 0x02, + 0x04, 0x09, 0x02, 0x04, 0x32, 0x2c, 0x27, 0x26, 0x22, 0x01, 0x3a, 0x3b, + 0x05, 0x3d, 0x37, 0x2d, 0x1e, 0x17, 0x02, 0x1b, 0x06, 0x00, 0x16, 0x20, + 0x2a, 0x33, 0x32, 0x2b, 0x28, 0x26, 0x4a, 0x23, 0x02, 0x3c, 0x3e, 0x01, + 0x19, 0x02, 0x1a, 0xa0, 0x02, 0x06, 0x01, 0x18, 0x21, 0x2a, 0x34, 0x32, + 0x0a, 0x2c, 0x28, 0x25, 0x22, 0x02, 0x3b, 0x05, 0x11, 0xa2, 0x06, 0x03, + 0x04, 0x2b, 0x27, 0x26, 0x03, 0x3c, 0xa0, 0x01, 0x1f, 0x01, 0x10, 0x15, + 0x1b, 0x1c, 0x12, 0x48, 0x0c, 0x01, 0x04, 0x0a, 0x01, 0x33, 0x32, 0x2c, + 0x10, 0x27, 0x26, 0x23, 0x01, 0x39, 0x3b, 0x3d, 0x37, 0x00, 0x2d, 0x1e, + 0x19, +}; + +const unsigned char g_pucTest32x32x8Raw[] = +{ + IMAGE_FMT_8BPP_UNCOMP, + 32, 0, + 32, 0, + + 63, + 0x00, 0x00, 0x00, + 0xff, 0x00, 0x0f, + 0xff, 0x00, 0x10, + 0xff, 0x0d, 0x00, + 0xff, 0x0e, 0x00, + 0xff, 0x00, 0x39, + 0xff, 0x00, 0x3a, + 0xff, 0x00, 0x6d, + 0xff, 0x00, 0x6e, + 0xff, 0x3c, 0x00, + 0xff, 0x3d, 0x00, + 0x00, 0x00, 0xff, + 0xff, 0x00, 0xa4, + 0xff, 0x00, 0xa5, + 0x28, 0x00, 0xff, + 0x29, 0x00, 0xff, + 0x65, 0x00, 0xff, + 0x66, 0x00, 0xff, + 0xff, 0x00, 0xd6, + 0xff, 0x00, 0xd7, + 0xa6, 0x00, 0xff, + 0xa7, 0x00, 0xff, + 0xff, 0x77, 0x00, + 0x00, 0x25, 0xff, + 0xff, 0x78, 0x00, + 0x00, 0x26, 0xff, + 0xe0, 0x00, 0xff, + 0xe1, 0x00, 0xff, + 0xff, 0x00, 0xfa, + 0xff, 0x00, 0xfb, + 0x00, 0x5d, 0xff, + 0x00, 0x5e, 0xff, + 0xff, 0xb4, 0x00, + 0xff, 0xb5, 0x00, + 0x0b, 0xff, 0x00, + 0x0c, 0xff, 0x00, + 0x00, 0xff, 0x11, + 0x33, 0xff, 0x00, + 0x34, 0xff, 0x00, + 0x67, 0xff, 0x00, + 0x68, 0xff, 0x00, + 0xff, 0xe7, 0x00, + 0xff, 0xe8, 0x00, + 0x9e, 0xff, 0x00, + 0x9f, 0xff, 0x00, + 0x00, 0x9b, 0xff, + 0x00, 0x9c, 0xff, + 0x00, 0xff, 0x3d, + 0x00, 0xff, 0x3e, + 0xd0, 0xff, 0x00, + 0xd1, 0xff, 0x00, + 0xf6, 0xff, 0x00, + 0xf7, 0xff, 0x00, + 0x00, 0xff, 0x75, + 0x00, 0xff, 0x76, + 0x00, 0xd3, 0xff, + 0x00, 0xd4, 0xff, + 0x00, 0xff, 0xaf, + 0x00, 0xff, 0xb0, + 0x00, 0xff, 0xe1, + 0x00, 0xff, 0xe2, + 0x00, 0xfb, 0xff, + 0x00, 0xfc, 0xff, + 0xff, 0xff, 0xff, + + 0x0b, 0x0f, 0x11, 0x15, 0x1b, 0x1d, 0x12, 0x0d, 0x07, 0x06, 0x02, 0x03, + 0x09, 0x18, 0x20, 0x2a, 0x34, 0x32, 0x2b, 0x27, 0x26, 0x23, 0x24, 0x30, + 0x36, 0x3a, 0x3b, 0x3e, 0x37, 0x2d, 0x1e, 0x17, 0x0b, 0x0f, 0x10, 0x14, + 0x1a, 0x1c, 0x12, 0x0d, 0x08, 0x06, 0x02, 0x04, 0x09, 0x16, 0x21, 0x29, + 0x34, 0x32, 0x2c, 0x27, 0x26, 0x23, 0x24, 0x30, 0x36, 0x39, 0x3b, 0x3e, + 0x37, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x11, 0x15, 0x1a, 0x1c, 0x12, 0x0d, + 0x08, 0x06, 0x02, 0x04, 0x09, 0x16, 0x21, 0x2a, 0x33, 0x32, 0x2c, 0x27, + 0x26, 0x22, 0x24, 0x2f, 0x36, 0x39, 0x3c, 0x3d, 0x38, 0x2d, 0x1e, 0x17, + 0x0b, 0x0f, 0x10, 0x15, 0x1b, 0x1c, 0x12, 0x0c, 0x08, 0x05, 0x01, 0x04, + 0x0a, 0x16, 0x21, 0x2a, 0x33, 0x32, 0x2b, 0x27, 0x25, 0x23, 0x24, 0x30, + 0x36, 0x3a, 0x3c, 0x3e, 0x37, 0x2d, 0x1e, 0x17, 0x0b, 0x0f, 0x10, 0x15, + 0x1a, 0x1c, 0x12, 0x0c, 0x08, 0x06, 0x02, 0x03, 0x09, 0x18, 0x21, 0x2a, + 0x33, 0x31, 0x2b, 0x27, 0x26, 0x23, 0x24, 0x30, 0x36, 0x39, 0x3b, 0x3e, + 0x38, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x11, 0x15, 0x1a, 0x1c, 0x12, 0x0d, + 0x08, 0x06, 0x02, 0x04, 0x09, 0x18, 0x21, 0x2a, 0x33, 0x32, 0x2b, 0x27, + 0x26, 0x23, 0x24, 0x30, 0x36, 0x3a, 0x3c, 0x3e, 0x38, 0x2e, 0x1e, 0x19, + 0x0b, 0x0f, 0x10, 0x15, 0x1a, 0x1c, 0x12, 0x0d, 0x08, 0x05, 0x02, 0x04, + 0x09, 0x18, 0x20, 0x2a, 0x34, 0x32, 0x2c, 0x27, 0x26, 0x23, 0x24, 0x2f, + 0x36, 0x39, 0x3c, 0x3e, 0x38, 0x2d, 0x1e, 0x17, 0x0b, 0x0f, 0x10, 0x15, + 0x1a, 0x1c, 0x12, 0x0d, 0x07, 0x05, 0x01, 0x03, 0x09, 0x16, 0x21, 0x2a, + 0x34, 0x31, 0x2b, 0x27, 0x26, 0x23, 0x24, 0x30, 0x36, 0x3a, 0x3b, 0x3e, + 0x38, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x11, 0x15, 0x1b, 0x1c, 0x12, 0x0d, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x36, 0x39, 0x3b, 0x3d, 0x37, 0x2d, 0x1f, 0x19, + 0x0b, 0x0f, 0x10, 0x15, 0x1b, 0x1c, 0x13, 0x0c, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x39, 0x3b, 0x3e, 0x38, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x10, 0x15, + 0x1b, 0x1c, 0x12, 0x0d, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x3a, 0x3c, 0x3e, + 0x37, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x10, 0x15, 0x1b, 0x1c, 0x12, 0x0d, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x36, 0x3a, 0x3b, 0x3e, 0x38, 0x2d, 0x1e, 0x19, + 0x0b, 0x0f, 0x11, 0x15, 0x1a, 0x1c, 0x12, 0x0d, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x3a, 0x3b, 0x3e, 0x38, 0x2d, 0x1e, 0x17, 0x0b, 0x0f, 0x10, 0x15, + 0x1b, 0x1c, 0x12, 0x0d, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x3a, 0x3b, 0x3e, + 0x38, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x10, 0x15, 0x1a, 0x1c, 0x12, 0x0d, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x36, 0x39, 0x3b, 0x3e, 0x37, 0x2d, 0x1e, 0x19, + 0x0b, 0x0f, 0x10, 0x15, 0x1a, 0x1c, 0x12, 0x0d, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x3a, 0x3b, 0x3e, 0x38, 0x2d, 0x1e, 0x17, 0x0b, 0x0f, 0x10, 0x15, + 0x1b, 0x1c, 0x12, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x36, 0x39, 0x3b, 0x3e, + 0x37, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x10, 0x15, 0x1a, 0x1c, 0x12, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x36, 0x3a, 0x3b, 0x3e, 0x38, 0x2d, 0x1e, 0x17, + 0x0b, 0x0f, 0x10, 0x15, 0x1a, 0x1c, 0x12, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x36, 0x3a, 0x3b, 0x3e, 0x37, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x10, 0x14, + 0x1a, 0x1c, 0x12, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x36, 0x3a, 0x3c, 0x3e, + 0x37, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x10, 0x15, 0x1b, 0x1c, 0x12, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x35, 0x3a, 0x3b, 0x3e, 0x37, 0x2d, 0x1e, 0x19, + 0x0b, 0x0f, 0x10, 0x15, 0x1b, 0x1c, 0x12, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x36, 0x39, 0x3b, 0x3e, 0x37, 0x2d, 0x1e, 0x19, 0x0b, 0x0e, 0x10, 0x15, + 0x1b, 0x1c, 0x12, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x36, 0x3a, 0x3c, 0x3e, + 0x38, 0x2d, 0x1e, 0x19, 0x0b, 0x0e, 0x10, 0x15, 0x1b, 0x1c, 0x12, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x36, 0x3a, 0x3b, 0x3e, 0x38, 0x2d, 0x1f, 0x19, + 0x0b, 0x0f, 0x10, 0x15, 0x1b, 0x1c, 0x12, 0x0d, 0x08, 0x05, 0x02, 0x04, + 0x09, 0x18, 0x20, 0x2a, 0x33, 0x32, 0x2b, 0x27, 0x26, 0x23, 0x24, 0x30, + 0x36, 0x3a, 0x3c, 0x3e, 0x38, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x10, 0x14, + 0x1a, 0x1c, 0x12, 0x0d, 0x08, 0x05, 0x01, 0x04, 0x09, 0x18, 0x21, 0x2a, + 0x34, 0x32, 0x2b, 0x27, 0x25, 0x23, 0x24, 0x30, 0x36, 0x39, 0x3b, 0x3e, + 0x38, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x10, 0x15, 0x1a, 0x1c, 0x12, 0x0c, + 0x08, 0x06, 0x02, 0x04, 0x0a, 0x18, 0x21, 0x2a, 0x34, 0x31, 0x2b, 0x27, + 0x25, 0x23, 0x24, 0x30, 0x36, 0x39, 0x3b, 0x3e, 0x38, 0x2d, 0x1e, 0x19, + 0x0b, 0x0f, 0x10, 0x15, 0x1a, 0x1c, 0x12, 0x0d, 0x08, 0x05, 0x02, 0x04, + 0x09, 0x18, 0x21, 0x2a, 0x34, 0x32, 0x2c, 0x27, 0x26, 0x22, 0x24, 0x30, + 0x36, 0x3a, 0x3b, 0x3d, 0x37, 0x2d, 0x1e, 0x17, 0x0b, 0x0f, 0x10, 0x15, + 0x1b, 0x1c, 0x12, 0x0d, 0x08, 0x05, 0x02, 0x04, 0x09, 0x16, 0x20, 0x2a, + 0x33, 0x32, 0x2b, 0x28, 0x26, 0x23, 0x24, 0x30, 0x36, 0x3a, 0x3c, 0x3e, + 0x37, 0x2d, 0x1e, 0x19, 0x0b, 0x0f, 0x10, 0x15, 0x1a, 0x1c, 0x12, 0x0d, + 0x08, 0x06, 0x02, 0x04, 0x09, 0x18, 0x21, 0x2a, 0x34, 0x32, 0x2c, 0x28, + 0x25, 0x22, 0x24, 0x30, 0x36, 0x3a, 0x3b, 0x3e, 0x37, 0x2d, 0x1e, 0x19, + 0x0b, 0x0f, 0x11, 0x15, 0x1a, 0x1c, 0x12, 0x0d, 0x08, 0x06, 0x02, 0x03, + 0x09, 0x18, 0x21, 0x2a, 0x34, 0x32, 0x2b, 0x27, 0x26, 0x22, 0x24, 0x30, + 0x36, 0x3a, 0x3c, 0x3e, 0x37, 0x2d, 0x1f, 0x19, 0x0b, 0x0f, 0x10, 0x15, + 0x1b, 0x1c, 0x12, 0x0c, 0x08, 0x06, 0x02, 0x04, 0x0a, 0x18, 0x21, 0x2a, + 0x33, 0x32, 0x2c, 0x27, 0x26, 0x23, 0x24, 0x30, 0x36, 0x39, 0x3b, 0x3d, + 0x37, 0x2d, 0x1e, 0x19, +}; diff --git a/boards/dk-tm4c129x/grlib_driver_test/images.h b/boards/dk-tm4c129x/grlib_driver_test/images.h new file mode 100644 index 0000000..3d0d212 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/images.h @@ -0,0 +1,41 @@ +//***************************************************************************** +// +// images.h - Prototypes for the images used by the application. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __IMAGES_H__ +#define __IMAGES_H__ + +//***************************************************************************** +// +// Prototypes for the image arrays. +// +//***************************************************************************** +extern const unsigned char g_pucLogo[]; +extern const unsigned char g_pucTest32x32x1Raw[]; +extern const unsigned char g_pucTest32x32x1Comp[]; +extern const unsigned char g_pucTest32x32x4Raw[]; +extern const unsigned char g_pucTest32x32x4Comp[]; +extern const unsigned char g_pucTest32x32x8Raw[]; +extern const unsigned char g_pucTest32x32x8Comp[]; + +#endif // __IMAGES_H__ diff --git a/boards/dk-tm4c129x/grlib_driver_test/readme.txt b/boards/dk-tm4c129x/grlib_driver_test/readme.txt new file mode 100644 index 0000000..bbf218e --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/readme.txt @@ -0,0 +1,117 @@ +Graphics Driver Test Tool + +This application provides a simple, command-line tool to aid in +debugging TivaWare Graphics Library display drivers. As shipped in +TivaWare, it is configured to operate with a DK-TM4C129X board using its +QVGA display. The code is written, however, to allow easy retargeting to +other boards and display drivers via modifications to the driver_config.h +header file. + +The tool is driven via a command line interface provided on UART0. Use a +terminal emulator on your host system and set the serial port to use +115200bps, 8-N-1. To see a list of supported commands, enter ``help'' on +the command line and to see extended help on a specific command enter +``help [command]''. + +The commands in the tool fall broadly into three categories: + +- commands allowing a given low level graphics function to be executed with + parameters provided by the user, +- commands providing the ability to read and write arbitrary memory + locations and registers, and +- tests displaying test patterns intended to exercise specific display + driver functions. + +The first group of commands includes ``r'' to read a word from a memory +location or register, ``w'' to write a word to a memory location or +register, ``dump'' to dump a range of memory as words and ``db'' to dump +a range of memory as bytes. Note that no checking is performed to ensure +that addresses passed to these functions are valid. If an invalid address +is passed, the test tool will fault. + +The second group of commands contains ``fill'' which fills the screen with +a given color, ``rect'' which draws a rectangle outline at a given position +on the display, ''hline`` which draws a horizontal line, ``vline'' which +draws a vertical line, ``image'' which draws an image at provided +coordinates, and ``text'' which renders a given text string. The output of +these commands is also modified via several other commands. ``fg'' selects +the foreground color to be used by the drawing commands and ``bg'' selects +the background color. ``setimg'' selects from one of four different test +images that are drawn in response to the ``image'' command and ``clipimg'' +allows image clipping to be adjusted to test handling of the \e i32X0 +parameter to the driver's PixelDrawMultiple function. + +Additional graphics commands are ``pat'' which redraws the test pattern +displayed when the tool starts, ``colbar'' which fills the display with +a set of color bars and ``perf'' which draws randomly positioned and +colored rectangles for a given number of seconds and determines the drawing +speed in pixels-per-second. + +All driver function test patterns are generated using the ``test'' command +whose first parameter indicates the test to display. Tests are as follow: + +- ``color'' tests the driver's color handling. The test starts by + splitting the screen into two and showing a different primary or + secondary color in each half. Verify that the correct colors are + displayed. After this, red, blue and green color gradients are + displayed. Again, verify that these are correct and that no color other + than the shades of the specific primary are displayed. If any color is + incorrect, this likely indicates an error in the driver's + pfnColorTranslate function or the function used to set the display + palette if the driver provides this feature. + +- ``pixel'' tests basic pixel plotting. A test pattern is drawn with a + single white pixel in each corner of the display, a small cross + comprising 5 white pixels in the center, and small arrows near each + corner. If any of the corner dots are missing or any of the other + pattern elements are incorrect, this points to a problem in the + driver's pfnPixelDraw function or, more generally, a problem with the + display coordinate space handling. + +- ``hline'' tests horizontal line drawing. White horizontal lines are + drawn at the top and bottom and a right-angled triangle is constructed in + the center of the display. If any line is missing or the triangle is + incorrect, this points to a problem in the driver's pfnLineDrawH + function. + +- ``vline'' tests vertical line drawing. White vertical lines are drawn + at the left and right and a right-angled triangle is constructed in + the center of the display. If any line is missing or the triangle is + incorrect, this points to a problem in the driver's pfnLineDrawV + function. + +- ``mult'' tests the driver's pfnPixelDrawMultiple function. This is the + most complex driver function and the one most prone to errors. The tool + fills the display with each of the included test images in turn. These + cover all the pixel formats (1-, 4- and 8-bpp) that the driver is + required to handle and the image clipping and x positions are set to + ensure that all alignment cases are handled for each format. In each + case, the image is drawn inside a single pixel red rectangle. If the + driver is handling each case correctly, the image should look correct + and no part of the red rectangle should be overwritten when the image + is drawn. In the displayed grid of images, the x alignment increases + from 1 to 8 across the display and each line increases the left-side + image clipping by one pixel from 0 in the top row to 7 in the bottom + row. An error in any image indicates that one of the cases handled by + the driver's pfnPixelDrawMultiple function is not handled correctly. + + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/grlib_driver_test/rvmdk/grlib_driver_test.axf b/boards/dk-tm4c129x/grlib_driver_test/rvmdk/grlib_driver_test.axf new file mode 100644 index 0000000..5b34bef Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/rvmdk/grlib_driver_test.axf differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/rvmdk/grlib_driver_test.bin b/boards/dk-tm4c129x/grlib_driver_test/rvmdk/grlib_driver_test.bin new file mode 100644 index 0000000..7d6acc4 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/rvmdk/grlib_driver_test.bin differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/startup_ccs.c b/boards/dk-tm4c129x/grlib_driver_test/startup_ccs.c new file mode 100644 index 0000000..38dfca5 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/grlib_driver_test/startup_ewarm.c b/boards/dk-tm4c129x/grlib_driver_test/startup_ewarm.c new file mode 100644 index 0000000..7f2e7df --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/grlib_driver_test/startup_gcc.c b/boards/dk-tm4c129x/grlib_driver_test/startup_gcc.c new file mode 100644 index 0000000..7a4f634 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/grlib_driver_test/startup_rvmdk.S b/boards/dk-tm4c129x/grlib_driver_test/startup_rvmdk.S new file mode 100644 index 0000000..b2cebec --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/hello/Makefile b/boards/dk-tm4c129x/hello/Makefile new file mode 100644 index 0000000..f01ef60 --- /dev/null +++ b/boards/dk-tm4c129x/hello/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the hello example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the hello example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/hello.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the hello example. +# +${COMPILER}/hello.axf: ${COMPILER}/frame.o +${COMPILER}/hello.axf: ${COMPILER}/hello.o +${COMPILER}/hello.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/hello.axf: ${COMPILER}/pinout.o +${COMPILER}/hello.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/hello.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/hello.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/hello.axf: hello.ld +SCATTERgcc_hello=hello.ld +ENTRY_hello=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/hello/ccs/.ccsimportspec b/boards/dk-tm4c129x/hello/ccs/.ccsimportspec new file mode 100644 index 0000000..77b03f5 --- /dev/null +++ b/boards/dk-tm4c129x/hello/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/hello/ccs/.ccsproject b/boards/dk-tm4c129x/hello/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/hello/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/hello/ccs/.cproject b/boards/dk-tm4c129x/hello/ccs/.cproject new file mode 100644 index 0000000..5296339 --- /dev/null +++ b/boards/dk-tm4c129x/hello/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/hello/ccs/.project b/boards/dk-tm4c129x/hello/ccs/.project new file mode 100644 index 0000000..b34bff3 --- /dev/null +++ b/boards/dk-tm4c129x/hello/ccs/.project @@ -0,0 +1,65 @@ + + + hello + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + hello.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/hello/hello.c + + + hello_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/hello/hello_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/hello/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/hello/ccs/Debug/hello.bin b/boards/dk-tm4c129x/hello/ccs/Debug/hello.bin new file mode 100644 index 0000000..bfd7d78 Binary files /dev/null and b/boards/dk-tm4c129x/hello/ccs/Debug/hello.bin differ diff --git a/boards/dk-tm4c129x/hello/ccs/Debug/hello.out b/boards/dk-tm4c129x/hello/ccs/Debug/hello.out new file mode 100644 index 0000000..3966c58 Binary files /dev/null and b/boards/dk-tm4c129x/hello/ccs/Debug/hello.out differ diff --git a/boards/dk-tm4c129x/hello/ccs/macros.ini_initial b/boards/dk-tm4c129x/hello/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/hello/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/hello/ccs/target_config.ccxml b/boards/dk-tm4c129x/hello/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/hello/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/hello/ewarm/Exe/hello.bin b/boards/dk-tm4c129x/hello/ewarm/Exe/hello.bin new file mode 100644 index 0000000..b35bbd9 Binary files /dev/null and b/boards/dk-tm4c129x/hello/ewarm/Exe/hello.bin differ diff --git a/boards/dk-tm4c129x/hello/ewarm/Exe/hello.out b/boards/dk-tm4c129x/hello/ewarm/Exe/hello.out new file mode 100644 index 0000000..c02ef42 Binary files /dev/null and b/boards/dk-tm4c129x/hello/ewarm/Exe/hello.out differ diff --git a/boards/dk-tm4c129x/hello/gcc/hello.axf b/boards/dk-tm4c129x/hello/gcc/hello.axf new file mode 100644 index 0000000..17e9b30 Binary files /dev/null and b/boards/dk-tm4c129x/hello/gcc/hello.axf differ diff --git a/boards/dk-tm4c129x/hello/gcc/hello.bin b/boards/dk-tm4c129x/hello/gcc/hello.bin new file mode 100644 index 0000000..e774c0b Binary files /dev/null and b/boards/dk-tm4c129x/hello/gcc/hello.bin differ diff --git a/boards/dk-tm4c129x/hello/hello.c b/boards/dk-tm4c129x/hello/hello.c new file mode 100644 index 0000000..3c51b72 --- /dev/null +++ b/boards/dk-tm4c129x/hello/hello.c @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// hello.c - Simple hello world example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Hello World (hello)

      +//! +//! A very simple ``hello world'' example. It simply displays ``Hello World!'' +//! on the display and is a starting point for more complicated applications. +//! This example uses calls to the TivaWare Graphics Library graphics +//! primitives functions to update the display. For a similar example using +//! widgets, please see ``hello_widget''. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Print "Hello World!" to the display on the Intelligent Display Module. +// +//***************************************************************************** +int +main(void) +{ + tContext sContext; + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "hello"); + + // + // Say hello using the Computer Modern 40 point font. + // + GrContextFontSet(&sContext, g_psFontCm40); + GrStringDrawCentered(&sContext, "Hello World!", -1, + GrContextDpyWidthGet(&sContext) / 2, + ((GrContextDpyHeightGet(&sContext) - 32) / 2) + 24, + 0); + + // + // Flush any cached drawing operations. + // + GrFlush(&sContext); + + // + // We are finished. Hang around doing nothing. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/hello/hello.ewd b/boards/dk-tm4c129x/hello/hello.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/hello/hello.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/hello/hello.ewp b/boards/dk-tm4c129x/hello/hello.ewp new file mode 100644 index 0000000..2535170 --- /dev/null +++ b/boards/dk-tm4c129x/hello/hello.ewp @@ -0,0 +1,798 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\hello.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/dk-tm4c129x/hello/hello.icf b/boards/dk-tm4c129x/hello/hello.icf new file mode 100644 index 0000000..3b4da91 --- /dev/null +++ b/boards/dk-tm4c129x/hello/hello.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// hello.icf - Linker configuration file for hello. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/hello/hello.ld b/boards/dk-tm4c129x/hello/hello.ld new file mode 100644 index 0000000..87f5f28 --- /dev/null +++ b/boards/dk-tm4c129x/hello/hello.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * hello.ld - Linker configuration file for hello. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/hello/hello.sct b/boards/dk-tm4c129x/hello/hello.sct new file mode 100644 index 0000000..eb0fd7f --- /dev/null +++ b/boards/dk-tm4c129x/hello/hello.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; hello.sct - Linker configuration file for hello. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/hello/hello.uvopt b/boards/dk-tm4c129x/hello/hello.uvopt new file mode 100644 index 0000000..daf45f8 --- /dev/null +++ b/boards/dk-tm4c129x/hello/hello.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + hello + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\hello.c + hello.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/hello/hello.uvproj b/boards/dk-tm4c129x/hello/hello.uvproj new file mode 100644 index 0000000..63141be --- /dev/null +++ b/boards/dk-tm4c129x/hello/hello.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + hello + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + hello + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\hello.bin .\rvmdk\hello.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + hello.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + hello.c + 1 + .\hello.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/hello/hello_ccs.cmd b/boards/dk-tm4c129x/hello/hello_ccs.cmd new file mode 100644 index 0000000..1f63aca --- /dev/null +++ b/boards/dk-tm4c129x/hello/hello_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * hello_ccs.cmd - CCS linker configuration file for hello. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c129x/hello/readme.txt b/boards/dk-tm4c129x/hello/readme.txt new file mode 100644 index 0000000..029ba59 --- /dev/null +++ b/boards/dk-tm4c129x/hello/readme.txt @@ -0,0 +1,27 @@ +Hello World + +A very simple ``hello world'' example. It simply displays ``Hello World!'' +on the display and is a starting point for more complicated applications. +This example uses calls to the TivaWare Graphics Library graphics +primitives functions to update the display. For a similar example using +widgets, please see ``hello_widget''. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/hello/rvmdk/hello.axf b/boards/dk-tm4c129x/hello/rvmdk/hello.axf new file mode 100644 index 0000000..d16c4d5 Binary files /dev/null and b/boards/dk-tm4c129x/hello/rvmdk/hello.axf differ diff --git a/boards/dk-tm4c129x/hello/rvmdk/hello.bin b/boards/dk-tm4c129x/hello/rvmdk/hello.bin new file mode 100644 index 0000000..60bfcdc Binary files /dev/null and b/boards/dk-tm4c129x/hello/rvmdk/hello.bin differ diff --git a/boards/dk-tm4c129x/hello/startup_ccs.c b/boards/dk-tm4c129x/hello/startup_ccs.c new file mode 100644 index 0000000..a769216 --- /dev/null +++ b/boards/dk-tm4c129x/hello/startup_ccs.c @@ -0,0 +1,268 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/hello/startup_ewarm.c b/boards/dk-tm4c129x/hello/startup_ewarm.c new file mode 100644 index 0000000..cf3864b --- /dev/null +++ b/boards/dk-tm4c129x/hello/startup_ewarm.c @@ -0,0 +1,299 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/hello/startup_gcc.c b/boards/dk-tm4c129x/hello/startup_gcc.c new file mode 100644 index 0000000..00771a6 --- /dev/null +++ b/boards/dk-tm4c129x/hello/startup_gcc.c @@ -0,0 +1,315 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/hello/startup_rvmdk.S b/boards/dk-tm4c129x/hello/startup_rvmdk.S new file mode 100644 index 0000000..f07ac83 --- /dev/null +++ b/boards/dk-tm4c129x/hello/startup_rvmdk.S @@ -0,0 +1,324 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/hello_widget/Makefile b/boards/dk-tm4c129x/hello_widget/Makefile new file mode 100644 index 0000000..ad8b324 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the hello_widget example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the hello_widget example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/hello_widget.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the hello_widget example. +# +${COMPILER}/hello_widget.axf: ${COMPILER}/frame.o +${COMPILER}/hello_widget.axf: ${COMPILER}/hello_widget.o +${COMPILER}/hello_widget.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/hello_widget.axf: ${COMPILER}/pinout.o +${COMPILER}/hello_widget.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/hello_widget.axf: ${COMPILER}/touch.o +${COMPILER}/hello_widget.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/hello_widget.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/hello_widget.axf: hello_widget.ld +SCATTERgcc_hello_widget=hello_widget.ld +ENTRY_hello_widget=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/hello_widget/ccs/.ccsimportspec b/boards/dk-tm4c129x/hello_widget/ccs/.ccsimportspec new file mode 100644 index 0000000..5ee6004 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/hello_widget/ccs/.ccsproject b/boards/dk-tm4c129x/hello_widget/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/hello_widget/ccs/.cproject b/boards/dk-tm4c129x/hello_widget/ccs/.cproject new file mode 100644 index 0000000..857cc75 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/hello_widget/ccs/.project b/boards/dk-tm4c129x/hello_widget/ccs/.project new file mode 100644 index 0000000..3624ea3 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/ccs/.project @@ -0,0 +1,70 @@ + + + hello_widget + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + hello_widget.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/hello_widget/hello_widget.c + + + hello_widget_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/hello_widget/hello_widget_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/hello_widget/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/hello_widget/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/hello_widget/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/hello_widget/ccs/Debug/hello_widget.bin b/boards/dk-tm4c129x/hello_widget/ccs/Debug/hello_widget.bin new file mode 100644 index 0000000..a11ba4c Binary files /dev/null and b/boards/dk-tm4c129x/hello_widget/ccs/Debug/hello_widget.bin differ diff --git a/boards/dk-tm4c129x/hello_widget/ccs/Debug/hello_widget.out b/boards/dk-tm4c129x/hello_widget/ccs/Debug/hello_widget.out new file mode 100644 index 0000000..fe88419 Binary files /dev/null and b/boards/dk-tm4c129x/hello_widget/ccs/Debug/hello_widget.out differ diff --git a/boards/dk-tm4c129x/hello_widget/ccs/macros.ini_initial b/boards/dk-tm4c129x/hello_widget/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/hello_widget/ccs/target_config.ccxml b/boards/dk-tm4c129x/hello_widget/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/hello_widget/ewarm/Exe/hello_widget.bin b/boards/dk-tm4c129x/hello_widget/ewarm/Exe/hello_widget.bin new file mode 100644 index 0000000..eebb0ce Binary files /dev/null and b/boards/dk-tm4c129x/hello_widget/ewarm/Exe/hello_widget.bin differ diff --git a/boards/dk-tm4c129x/hello_widget/ewarm/Exe/hello_widget.out b/boards/dk-tm4c129x/hello_widget/ewarm/Exe/hello_widget.out new file mode 100644 index 0000000..a1f0192 Binary files /dev/null and b/boards/dk-tm4c129x/hello_widget/ewarm/Exe/hello_widget.out differ diff --git a/boards/dk-tm4c129x/hello_widget/gcc/hello_widget.axf b/boards/dk-tm4c129x/hello_widget/gcc/hello_widget.axf new file mode 100644 index 0000000..42f0420 Binary files /dev/null and b/boards/dk-tm4c129x/hello_widget/gcc/hello_widget.axf differ diff --git a/boards/dk-tm4c129x/hello_widget/gcc/hello_widget.bin b/boards/dk-tm4c129x/hello_widget/gcc/hello_widget.bin new file mode 100644 index 0000000..de238fa Binary files /dev/null and b/boards/dk-tm4c129x/hello_widget/gcc/hello_widget.bin differ diff --git a/boards/dk-tm4c129x/hello_widget/hello_widget.c b/boards/dk-tm4c129x/hello_widget/hello_widget.c new file mode 100644 index 0000000..0752033 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/hello_widget.c @@ -0,0 +1,258 @@ +//***************************************************************************** +// +// hello_widget.c - Simple hello world example using Widgets +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/pushbutton.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Hello using Widgets (hello_widget)

      +//! +//! A very simple ``hello world'' example written using the TivaWare Graphics +//! Library widgets. It displays a button which, when pressed, toggles +//! display of the words ``Hello World!'' on the screen. This may be used as +//! a starting point for more complex widget-based applications. +// +//***************************************************************************** + +//***************************************************************************** +// +// Forward reference to various widget structures. +// +//***************************************************************************** +extern tCanvasWidget g_sBackground; +extern tPushButtonWidget g_sPushBtn; + +//***************************************************************************** +// +// Forward reference to the button press handler. +// +//***************************************************************************** +void OnButtonPress(tWidget *psWidget); + +//***************************************************************************** +// +// The canvas widget acting as the background to the display. +// +//***************************************************************************** +Canvas(g_sBackground, WIDGET_ROOT, 0, &g_sPushBtn, + &g_sKentec320x240x16_SSD2119, 10, 25, 300, (240 - 25 -10), + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The button used to hide or display the "Hello World" message. +// +//***************************************************************************** +RectangularButton(g_sPushBtn, &g_sBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, 60, 60, 200, 40, + (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_RELEASE_NOTIFY), + ClrDarkBlue, ClrBlue, ClrWhite, ClrWhite, + g_psFontCmss22b, "Show Welcome", 0, 0, 0, 0, OnButtonPress); + +//***************************************************************************** +// +// The canvas widget used to display the "Hello!" string. Note that this +// is NOT hooked into the active widget tree (by making it a child of the +// g_sPushBtn widget above) yet since we do not want the widget to be displayed +// until the button is pressed. +// +//***************************************************************************** +Canvas(g_sHello, &g_sPushBtn, 0, 0, + &g_sKentec320x240x16_SSD2119, 10, 150, 300, 40, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), + ClrBlack, 0, ClrWhite, g_psFontCm40, "Hello World!", 0, 0); + +//***************************************************************************** +// +// A global we use to keep track of whether or not the "Hello" widget is +// currently visible. +// +//***************************************************************************** +bool g_bHelloVisible = false; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This function is called by the graphics library widget manager in the +// context of WidgetMessageQueueProcess whenever the user releases the +// "Press Me!" button. We use this notification to display or hide the +// "Hello!" widget. +// +// This is actually a rather inefficient way to accomplish this but it's +// a good example of how to add and remove widgets dynamically. In +// normal circumstances, you would likely leave the g_sHello widget +// linked into the tree and merely add or remove the text by changing +// its style then repainting. +// +// If using this dynamic add/remove strategy, another useful optimization +// is to use a black canvas widget that covers the same area of the screen +// as the widgets that you will be adding and removing. If this is the used +// as the point in the tree where the subtree is added or removed, you can +// repaint just the desired area by repainting the black canvas rather than +// repainting the whole tree. +// +//***************************************************************************** +void +OnButtonPress(tWidget *psWidget) +{ + g_bHelloVisible = !g_bHelloVisible; + + if(g_bHelloVisible) + { + // + // Add the Hello widget to the tree as a child of the push + // button. We could add it elsewhere but this seems as good a + // place as any. It also means we can repaint from g_sPushBtn and + // this will paint both the button and the welcome message. + // + WidgetAdd((tWidget *)&g_sPushBtn, (tWidget *)&g_sHello); + + // + // Change the button text to indicate the new function. + // + PushButtonTextSet(&g_sPushBtn, "Hide Welcome"); + + // + // Repaint the pushbutton and all widgets beneath it (in this case, + // the welcome message). + // + WidgetPaint((tWidget *)&g_sPushBtn); + } + else + { + // + // Remove the Hello widget from the tree. + // + WidgetRemove((tWidget *)&g_sHello); + + // + // Change the button text to indicate the new function. + // + PushButtonTextSet(&g_sPushBtn, "Show Welcome"); + + // + // Repaint the widget tree to remove the Hello widget from the + // display. This is rather inefficient but saves having to use + // additional widgets to overpaint the area of the Hello text (since + // disabling a widget does not automatically erase whatever it + // previously displayed on the screen). + // + WidgetPaint(WIDGET_ROOT); + } +} + +//***************************************************************************** +// +// Print "Hello World!" to the display on the Intelligent Display Module. +// +//***************************************************************************** +int +main(void) +{ + tContext sContext; + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "hello-widget"); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(WidgetPointerMessage); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sBackground); + + // + // Paint the widget tree to make sure they all appear on the display. + // + WidgetPaint(WIDGET_ROOT); + + // + // Loop forever, processing widget messages. + // + while(1) + { + // + // Process any messages from or for the widgets. + // + WidgetMessageQueueProcess(); + } +} diff --git a/boards/dk-tm4c129x/hello_widget/hello_widget.ewd b/boards/dk-tm4c129x/hello_widget/hello_widget.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/hello_widget.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/hello_widget/hello_widget.ewp b/boards/dk-tm4c129x/hello_widget/hello_widget.ewp new file mode 100644 index 0000000..0defd92 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/hello_widget.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\hello_widget.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + diff --git a/boards/dk-tm4c129x/hello_widget/hello_widget.icf b/boards/dk-tm4c129x/hello_widget/hello_widget.icf new file mode 100644 index 0000000..3818280 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/hello_widget.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// hello_widget.icf - Linker configuration file for hello_widget. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/hello_widget/hello_widget.ld b/boards/dk-tm4c129x/hello_widget/hello_widget.ld new file mode 100644 index 0000000..3c6740d --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/hello_widget.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * hello_widget.ld - Linker configuration file for hello_widget. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/hello_widget/hello_widget.sct b/boards/dk-tm4c129x/hello_widget/hello_widget.sct new file mode 100644 index 0000000..92a6f4b --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/hello_widget.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; hello_widget.sct - Linker configuration file for hello_widget. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/hello_widget/hello_widget.uvopt b/boards/dk-tm4c129x/hello_widget/hello_widget.uvopt new file mode 100644 index 0000000..4a35ca5 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/hello_widget.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + hello_widget + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\hello_widget.c + hello_widget.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/hello_widget/hello_widget.uvproj b/boards/dk-tm4c129x/hello_widget/hello_widget.uvproj new file mode 100644 index 0000000..69322c7 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/hello_widget.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + hello_widget + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + hello_widget + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\hello_widget.bin .\rvmdk\hello_widget.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + hello_widget.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + hello_widget.c + 1 + .\hello_widget.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/hello_widget/hello_widget_ccs.cmd b/boards/dk-tm4c129x/hello_widget/hello_widget_ccs.cmd new file mode 100644 index 0000000..f74d399 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/hello_widget_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * hello_widget_ccs.cmd - CCS linker configuration file for hello_widget. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/hello_widget/readme.txt b/boards/dk-tm4c129x/hello_widget/readme.txt new file mode 100644 index 0000000..36c9abc --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/readme.txt @@ -0,0 +1,26 @@ +Hello using Widgets + +A very simple ``hello world'' example written using the TivaWare Graphics +Library widgets. It displays a button which, when pressed, toggles +display of the words ``Hello World!'' on the screen. This may be used as +a starting point for more complex widget-based applications. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/hello_widget/rvmdk/hello_widget.axf b/boards/dk-tm4c129x/hello_widget/rvmdk/hello_widget.axf new file mode 100644 index 0000000..e52364f Binary files /dev/null and b/boards/dk-tm4c129x/hello_widget/rvmdk/hello_widget.axf differ diff --git a/boards/dk-tm4c129x/hello_widget/rvmdk/hello_widget.bin b/boards/dk-tm4c129x/hello_widget/rvmdk/hello_widget.bin new file mode 100644 index 0000000..15b4181 Binary files /dev/null and b/boards/dk-tm4c129x/hello_widget/rvmdk/hello_widget.bin differ diff --git a/boards/dk-tm4c129x/hello_widget/startup_ccs.c b/boards/dk-tm4c129x/hello_widget/startup_ccs.c new file mode 100644 index 0000000..5d2884c --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/hello_widget/startup_ewarm.c b/boards/dk-tm4c129x/hello_widget/startup_ewarm.c new file mode 100644 index 0000000..860b8a6 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/hello_widget/startup_gcc.c b/boards/dk-tm4c129x/hello_widget/startup_gcc.c new file mode 100644 index 0000000..fad3049 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/hello_widget/startup_rvmdk.S b/boards/dk-tm4c129x/hello_widget/startup_rvmdk.S new file mode 100644 index 0000000..07659c1 --- /dev/null +++ b/boards/dk-tm4c129x/hello_widget/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/hibernate/Makefile b/boards/dk-tm4c129x/hibernate/Makefile new file mode 100644 index 0000000..86e91fa --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/Makefile @@ -0,0 +1,94 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Hibernate Example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. + +# +# The default rule, which causes the Hibernate Example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/hibernate.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Hibernate Example. +# +${COMPILER}/hibernate.axf: ${COMPILER}/frame.o +${COMPILER}/hibernate.axf: ${COMPILER}/hibernate.o +${COMPILER}/hibernate.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/hibernate.axf: ${COMPILER}/pinout.o +${COMPILER}/hibernate.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/hibernate.axf: ${COMPILER}/touch.o +${COMPILER}/hibernate.axf: ${COMPILER}/uartstdio.o +${COMPILER}/hibernate.axf: ${COMPILER}/ustdlib.o +${COMPILER}/hibernate.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/hibernate.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/hibernate.axf: hibernate.ld +SCATTERgcc_hibernate=hibernate.ld +ENTRY_hibernate=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 -DSNOWFLAKE + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/hibernate/ccs/.ccsimportspec b/boards/dk-tm4c129x/hibernate/ccs/.ccsimportspec new file mode 100644 index 0000000..160e565 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/hibernate/ccs/.ccsproject b/boards/dk-tm4c129x/hibernate/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/hibernate/ccs/.cproject b/boards/dk-tm4c129x/hibernate/ccs/.cproject new file mode 100644 index 0000000..acbab34 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/ccs/.cproject @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/hibernate/ccs/.project b/boards/dk-tm4c129x/hibernate/ccs/.project new file mode 100644 index 0000000..690bde8 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/ccs/.project @@ -0,0 +1,80 @@ + + + hibernate + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + hibernate.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/hibernate/hibernate.c + + + hibernate_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/hibernate/hibernate_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/hibernate/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/hibernate/ccs/Debug/hibernate.bin b/boards/dk-tm4c129x/hibernate/ccs/Debug/hibernate.bin new file mode 100644 index 0000000..153b5fa Binary files /dev/null and b/boards/dk-tm4c129x/hibernate/ccs/Debug/hibernate.bin differ diff --git a/boards/dk-tm4c129x/hibernate/ccs/Debug/hibernate.out b/boards/dk-tm4c129x/hibernate/ccs/Debug/hibernate.out new file mode 100644 index 0000000..d4c5e2e Binary files /dev/null and b/boards/dk-tm4c129x/hibernate/ccs/Debug/hibernate.out differ diff --git a/boards/dk-tm4c129x/hibernate/ccs/macros.ini_initial b/boards/dk-tm4c129x/hibernate/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/hibernate/ccs/target_config.ccxml b/boards/dk-tm4c129x/hibernate/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/hibernate/ewarm/Exe/hibernate.bin b/boards/dk-tm4c129x/hibernate/ewarm/Exe/hibernate.bin new file mode 100644 index 0000000..2be59c3 Binary files /dev/null and b/boards/dk-tm4c129x/hibernate/ewarm/Exe/hibernate.bin differ diff --git a/boards/dk-tm4c129x/hibernate/ewarm/Exe/hibernate.out b/boards/dk-tm4c129x/hibernate/ewarm/Exe/hibernate.out new file mode 100644 index 0000000..d9c2972 Binary files /dev/null and b/boards/dk-tm4c129x/hibernate/ewarm/Exe/hibernate.out differ diff --git a/boards/dk-tm4c129x/hibernate/gcc/hibernate.axf b/boards/dk-tm4c129x/hibernate/gcc/hibernate.axf new file mode 100644 index 0000000..20a7f82 Binary files /dev/null and b/boards/dk-tm4c129x/hibernate/gcc/hibernate.axf differ diff --git a/boards/dk-tm4c129x/hibernate/gcc/hibernate.bin b/boards/dk-tm4c129x/hibernate/gcc/hibernate.bin new file mode 100644 index 0000000..780b615 Binary files /dev/null and b/boards/dk-tm4c129x/hibernate/gcc/hibernate.bin differ diff --git a/boards/dk-tm4c129x/hibernate/hibernate.c b/boards/dk-tm4c129x/hibernate/hibernate.c new file mode 100644 index 0000000..0062fd3 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/hibernate.c @@ -0,0 +1,1568 @@ +//***************************************************************************** +// +// hibernate.c - Hibernation Example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include +#include "inc/hw_gpio.h" +#include "inc/hw_hibernate.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/hibernate.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/pushbutton.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" +#include "utils/ustdlib.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Hibernate Example (hibernate)

      +//! +//! An example to demonstrate the use of the Hibernation module. The user +//! can put the microcontroller in hibernation by touching the display. The +//! microcontroller will then wake on its own after 5 seconds, or immediately +//! if the user presses the RESET button. External WAKE pin and GPIO (PK5) +//! wake sources can also be used to wake immediately from hibernation. The +//! following wiring enables the use of these pins as wake sources. +//! WAKE on J27 to SEL on J37 +//! PK5 on J28 to UP on J37 +//! +//! The program keeps a count of the number of times it has entered +//! hibernation. The value of the counter is stored in the battery backed +//! memory of the Hibernation module so that it can be retrieved when the +//! microcontroller wakes. The program displays the wall time and date by +//! making use of the calendar function of the Hibernate module. User can +//! modify the date and time if so desired. +// +//***************************************************************************** + +//***************************************************************************** +// +// A collection of wake sources that will be displayed to indicate the source +// of the most recent wake. +// +//***************************************************************************** +static char *g_ppcWakeSource[] = +{ + "RTC TIMEOUT", + "RESET", + "WAKE PIN", + "GPIO WAKE", + "SYSTEM RESET" +}; + +//***************************************************************************** +// +// Lookup table to convert numerical value of a month into text. +// +//***************************************************************************** +static char *g_ppcMonth[12] = +{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" +}; + +//***************************************************************************** +// +// Flag to indicate that main screen is active so that main screen buffers can +// be updated and widgets redrawn. +// +//***************************************************************************** +bool g_bMainScreen; + +//***************************************************************************** +// +// Flag that informs that the user has requested hibernation. +// +//***************************************************************************** +volatile bool g_bHibernate; + +//***************************************************************************** +// +// Flag that informs that date and time have to be set. +// +//***************************************************************************** +volatile bool g_bSetDate; + +//***************************************************************************** +// +// Buffers to store widget display information. +// +//***************************************************************************** +char g_pcWakeBuf[40], g_pcHibBuf[40], g_pcDateTimeBuf[40]; +char g_pcInfoBuf0[40], g_pcInfoBuf1[40], g_pcInfoBuf2[40], g_pcInfoBuf3[40]; +char g_pcMonBuf[4], g_pcDayBuf[3], g_pcYearBuf[5]; +char g_pcHourBuf[3], g_pcMinBuf[3], g_pcAMPMBuf[3]; + +//***************************************************************************** +// +// Variables that keep track of the date and time across different screens. +// +//***************************************************************************** +uint32_t g_ui32MonthIdx, g_ui32DayIdx, g_ui32YearIdx; +uint32_t g_ui32HourIdx, g_ui32MinIdx; + +//***************************************************************************** +// +// Forward reference for widget structures. +// +//***************************************************************************** +extern tCanvasWidget g_sMainScreen; +extern tCanvasWidget g_sWakeInfo, g_sHibCount, g_sDateTime; +extern tPushButtonWidget g_sInfoStrBtn; +extern tCanvasWidget g_sInfoStr1, g_sInfoStr2, g_sInfoStr3; +extern tPushButtonWidget g_sDateTimeSetBtn; +extern tCanvasWidget g_sDateScreen; +extern tCanvasWidget g_sMonText; +extern tPushButtonWidget g_sMonUpBtn, g_sMonDwnBtn; +extern tCanvasWidget g_sDayText; +extern tPushButtonWidget g_sDayUpBtn, g_sDayDwnBtn; +extern tCanvasWidget g_sYearText; +extern tPushButtonWidget g_sYearUpBtn, g_sYearDwnBtn; +extern tPushButtonWidget g_sDateNextBtn; +extern tCanvasWidget g_sTimeScreen; +extern tCanvasWidget g_sHourText; +extern tPushButtonWidget g_sHourUpBtn, g_sHourDwnBtn; +extern tCanvasWidget g_sMinText; +extern tPushButtonWidget g_sMinUpBtn, g_sMinDwnBtn; +extern tCanvasWidget g_sAMPMText; +extern tPushButtonWidget g_sAMPMUpBtn, g_sAMPMDwnBtn; +extern tPushButtonWidget g_sTimeDoneBtn; + +//***************************************************************************** +// +// Forward reference of functions that are called on a button press. +// +//***************************************************************************** +void OnInfoStrBtnPress(tWidget *psWidget); +void OnDateTimeSetBtnPress(tWidget *psWidget); +void OnMonUpBtnPress(tWidget *psWidget); +void OnMonDwnBtnPress(tWidget *psWidget); +void OnDayUpBtnPress(tWidget *psWidget); +void OnDayDwnBtnPress(tWidget *psWidget); +void OnYearUpBtnPress(tWidget *psWidget); +void OnYearDwnBtnPress(tWidget *psWidget); +void OnDateNextBtnPress(tWidget *psWidget); +void OnHourUpBtnPress(tWidget *psWidget); +void OnHourDwnBtnPress(tWidget *psWidget); +void OnMinUpBtnPress(tWidget *psWidget); +void OnMinDwnBtnPress(tWidget *psWidget); +void OnAMPMBtnPress(tWidget *psWidget); +void OnTimeDoneBtnPress(tWidget *psWidget); + +//***************************************************************************** +// +// The graphics library structures for the Main screen. +// +//***************************************************************************** +RectangularButton(g_sDateTimeSetBtn, &g_sMainScreen, 0, 0, + &g_sKentec320x240x16_SSD2119, (319 - 9 - 95), 34, 95, 45, + (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE | + PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, ClrWhite, + g_psFontCm16, "DATE/TIME", 0, 0, 0, 0, + OnDateTimeSetBtnPress); +Canvas(g_sDateTime, &g_sMainScreen, &g_sDateTimeSetBtn, 0, + &g_sKentec320x240x16_SSD2119, 9, 50, (310 - 9 - 100), 17, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, 0, ClrWhite, + g_psFontCm16, g_pcDateTimeBuf, 0, 0); +Canvas(g_sWakeInfo, &g_sMainScreen, &g_sDateTime, 0, + &g_sKentec320x240x16_SSD2119, 9, 100, (310 - 9), 17, CANVAS_STYLE_TEXT, + ClrBlack, 0, ClrWhite, g_psFontCm16, g_pcWakeBuf, 0, 0); +Canvas(g_sHibCount, &g_sMainScreen, &g_sWakeInfo, 0, + &g_sKentec320x240x16_SSD2119, 9, 120, (310 - 9), 17, CANVAS_STYLE_TEXT, + ClrBlack, 0, ClrWhite, g_psFontCm16, g_pcHibBuf, 0, 0); +RectangularButton(g_sInfoStrBtn, &g_sMainScreen, &g_sHibCount, 0, + &g_sKentec320x240x16_SSD2119, 9, 150, (310 - 9), 25, + (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE | + PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, ClrWhite, + g_psFontCm16, g_pcInfoBuf0, 0, 0, 0, 0, OnInfoStrBtnPress); +Canvas(g_sInfoStr1, &g_sMainScreen, &g_sInfoStrBtn, 0, + &g_sKentec320x240x16_SSD2119, 9, 175, (310 - 9), 17, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, 0, ClrWhite, + g_psFontCm16, g_pcInfoBuf1, 0, 0); +Canvas(g_sInfoStr2, &g_sMainScreen, &g_sInfoStr1, 0, + &g_sKentec320x240x16_SSD2119, 9, 192, (310 - 9), 17, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, 0, ClrWhite, + g_psFontCm16, g_pcInfoBuf2, 0, 0); +Canvas(g_sInfoStr3, &g_sMainScreen, &g_sInfoStr2, 0, + &g_sKentec320x240x16_SSD2119, 9, 209, (310 - 9), 17, + (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, 0, ClrWhite, + g_psFontCm16, g_pcInfoBuf3, 0, 0); +Canvas(g_sMainScreen, WIDGET_ROOT, 0, &g_sInfoStr3, + &g_sKentec320x240x16_SSD2119, 9, 25, (310 - 9), (230 - 25), + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The graphics library structures for the Date screen. +// +//***************************************************************************** +RectangularButton(g_sDateNextBtn, &g_sDateScreen, 0, 0, + &g_sKentec320x240x16_SSD2119, 240, 190, 60, 30, + (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE | + PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, ClrWhite, + g_psFontCm16, "NEXT", 0, 0, 0, 0, OnDateNextBtnPress); +CircularButton(g_sYearDwnBtn, &g_sDateScreen, &g_sDateNextBtn, 0, + &g_sKentec320x240x16_SSD2119, 260, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100, + 10, OnYearDwnBtnPress); +CircularButton(g_sYearUpBtn, &g_sDateScreen, &g_sYearDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 260, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100, + 10, OnYearUpBtnPress); +Canvas(g_sYearText, &g_sDateScreen, &g_sYearUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 230, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcYearBuf, 0, 0); +CircularButton(g_sDayDwnBtn, &g_sDateScreen, &g_sYearText, 0, + &g_sKentec320x240x16_SSD2119, 160, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100, + 10, OnDayDwnBtnPress); +CircularButton(g_sDayUpBtn, &g_sDateScreen, &g_sDayDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 160, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100, + 10, OnDayUpBtnPress); +Canvas(g_sDayText, &g_sDateScreen, &g_sDayUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 130, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcDayBuf, 0, 0); +CircularButton(g_sMonDwnBtn, &g_sDateScreen, &g_sDayText, 0, + &g_sKentec320x240x16_SSD2119, 60, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100, + 20, OnMonDwnBtnPress); +CircularButton(g_sMonUpBtn, &g_sDateScreen, &g_sMonDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 60, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100, + 20, OnMonUpBtnPress); +Canvas(g_sMonText, &g_sDateScreen, &g_sMonUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 30, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcMonBuf, 0, 0); +Canvas(g_sDateScreen, WIDGET_ROOT, 0, &g_sMonText, + &g_sKentec320x240x16_SSD2119, 9, 25, (310 - 9), (230 - 25), + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The graphics library structures for the Time screen. +// +//***************************************************************************** +RectangularButton(g_sTimeDoneBtn, &g_sTimeScreen, 0, 0, + &g_sKentec320x240x16_SSD2119, 240, 190, 60, 30, + (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE | + PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, ClrWhite, + g_psFontCm16, "DONE", 0, 0, 0, 0, OnTimeDoneBtnPress); +CircularButton(g_sAMPMDwnBtn, &g_sTimeScreen, &g_sTimeDoneBtn, 0, + &g_sKentec320x240x16_SSD2119, 260, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, + ClrWhite, g_psFontCm20, "+", 0, 0, 0, 0, OnAMPMBtnPress); +CircularButton(g_sAMPMUpBtn, &g_sTimeScreen, &g_sAMPMDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 260, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, + ClrWhite, g_psFontCm20, "-", 0, 0, 0, 0, OnAMPMBtnPress); +Canvas(g_sAMPMText, &g_sTimeScreen, &g_sAMPMUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 230, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcAMPMBuf, 0, 0); +CircularButton(g_sMinDwnBtn, &g_sTimeScreen, &g_sAMPMText, 0, + &g_sKentec320x240x16_SSD2119, 160, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100, + 10, OnMinDwnBtnPress); +CircularButton(g_sMinUpBtn, &g_sTimeScreen, &g_sMinDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 160, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100, + 10, OnMinUpBtnPress); +Canvas(g_sMinText, &g_sTimeScreen, &g_sMinUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 130, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcMinBuf, 0, 0); +CircularButton(g_sHourDwnBtn, &g_sTimeScreen, &g_sMinText, 0, + &g_sKentec320x240x16_SSD2119, 60, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100, + 20, OnHourDwnBtnPress); +CircularButton(g_sHourUpBtn, &g_sTimeScreen, &g_sHourDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 60, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100, + 20, OnHourUpBtnPress); +Canvas(g_sHourText, &g_sTimeScreen, &g_sHourUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 30, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcHourBuf, 0, 0); +Canvas(g_sTimeScreen, WIDGET_ROOT, 0, &g_sHourText, + &g_sKentec320x240x16_SSD2119, 9, 25, (310 - 9), (230 - 25), + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This function reads the current date and time from the calendar logic of the +// hibernate module. Return status indicates the validity of the data read. +// If the received data is valid, the 24-hour time format is converted to +// 12-hour format. +// +//***************************************************************************** +bool +DateTimeGet(struct tm *sTime, char *pcAMPM) +{ + // + // Get the latest time. + // + HibernateCalendarGet(sTime); + + // + // Is valid data read? + // + if(((sTime->tm_sec < 0) || (sTime->tm_sec > 59)) || + ((sTime->tm_min < 0) || (sTime->tm_min > 59)) || + ((sTime->tm_hour < 0) || (sTime->tm_hour > 23)) || + ((sTime->tm_mday < 1) || (sTime->tm_mday > 31)) || + ((sTime->tm_mon < 0) || (sTime->tm_mon > 11)) || + ((sTime->tm_year < 100) || (sTime->tm_year > 199))) + { + // + // No - Let the application know the same by returning relevant + // message. + // + return false; + } + + // + // Set AM as default. + // + strcpy(pcAMPM, "AM"); + + // + // Convert 24-hour format into 12-hour format with AM/PM indication. + // + if(sTime->tm_hour == 0) + { + sTime->tm_hour = 12; + strcpy(pcAMPM, "AM"); + } + else if(sTime->tm_hour == 12) + { + strcpy(pcAMPM, "PM"); + } + else if(sTime->tm_hour > 12) + { + sTime->tm_hour -= 12; + strcpy(pcAMPM, "PM"); + } + + // + // Return that new data is available so that it can be displayed. + // + return true; +} + +//***************************************************************************** +// +// This function formats valid new date and time to be displayed on the home +// screen in the format "MMM DD, YYYY HH : MM : SS AM/PM". Example of this +// format is Aug 01, 2013 08:15:30 AM. It also indicates if valid new data +// is available or not. If date and time is invalid, this function sets the +// date and time to default value. +// +//***************************************************************************** +bool +DateTimeDisplayGet(char *pcBuf, uint32_t ui32BufSize) +{ + static uint32_t ui32SecondsPrev = 0xFF; + struct tm sTime; + char pcAMPM[3]; + uint32_t ui32Len; + + // + // Get the latest date and time and check the validity. + // + if(DateTimeGet(&sTime, pcAMPM) == false) + { + // + // Invalid - Force set the date and time to default values and return + // false to indicate no information to display. + // + g_bSetDate = true; + return false; + } + + // + // If date and time is valid, check if seconds have updated from previous + // visit. + // + if(ui32SecondsPrev == sTime.tm_sec) + { + // + // No - Return false to indicate no information to display. + // + return false; + } + + // + // If valid new date and time is available, update a local variable to keep + // track of seconds to determine new data for next visit. + // + ui32SecondsPrev = sTime.tm_sec; + + // + // Format the date and time into a user readable format. + // + ui32Len = usnprintf(pcBuf, ui32BufSize, "%s %02u, 20%02u ", + g_ppcMonth[sTime.tm_mon], sTime.tm_mday, + sTime.tm_year - 100); + usnprintf(&pcBuf[ui32Len], ui32BufSize - ui32Len, "%02u : %02u : %02u %s", + sTime.tm_hour, sTime.tm_min, sTime.tm_sec, pcAMPM); + + // + // Return true to indicate new information to display. + // + return true; +} + +//***************************************************************************** +// +// This function updates individual buffers with valid date and time to be +// displayed on the date screen so that the date and time can be updated. +// +//***************************************************************************** +bool +DateTimeUpdateGet(char *pcMon, char *pcDay, char *pcYear, char *pcHour, + char *pcMin, char *pcAMPM) +{ + struct tm sTime; + + // + // Get the latest date and time and check the validity. + // + if(DateTimeGet(&sTime, pcAMPM) == false) + { + // + // Invalid - Return here with false as no information to update. So + // use default values. + // + return false; + } + + // + // If date and time is valid, copy the date and time values into respective + // indexes. + // + g_ui32MonthIdx = sTime.tm_mon; + g_ui32DayIdx = sTime.tm_mday; + g_ui32YearIdx = sTime.tm_year - 100; + g_ui32HourIdx = sTime.tm_hour; + g_ui32MinIdx = sTime.tm_min; + + // + // Convert the date and time into string format and copy into supplied + // buffers. + // + usnprintf(pcMon, 4, "%s", g_ppcMonth[g_ui32MonthIdx]); + usnprintf(pcDay, 3, "%u", g_ui32DayIdx); + usnprintf(pcYear, 5, "20%02u", g_ui32YearIdx); + usnprintf(pcHour, 3, "%u", g_ui32HourIdx); + usnprintf(pcMin, 3, "%02u", g_ui32MinIdx); + + // + // Return true to indicate new information has been updated. + // + return true; +} + +//***************************************************************************** +// +// This function writes the requested date and time to the calendar logic of +// hibernation module. +// +//***************************************************************************** +void +DateTimeSet(void) +{ + struct tm sTime; + + // + // Get the latest date and time. This is done here so that unchanged + // parts of date and time can be written back as is. + // + HibernateCalendarGet(&sTime); + + // + // Set the date and time values that are to be updated. + // + sTime.tm_hour = g_ui32HourIdx; + sTime.tm_min = g_ui32MinIdx; + sTime.tm_mon = g_ui32MonthIdx; + sTime.tm_mday = g_ui32DayIdx; + sTime.tm_year = 100 + g_ui32YearIdx; + + // + // Convert 12-hour format into 24-hour format. + // + if(strcmp(g_pcAMPMBuf, "PM") == 0) + { + if(sTime.tm_hour < 12) + { + sTime.tm_hour += 12; + } + } + else + { + if(sTime.tm_hour > 11) + { + sTime.tm_hour -= 12; + } + } + + // + // Update the calendar logic of hibernation module with the requested data. + // + HibernateCalendarSet(&sTime); +} + +//***************************************************************************** +// +// This function returns the number of days in a month including for a leap +// year. +// +//***************************************************************************** +uint32_t +GetDaysInMonth(uint32_t ui32Year, uint32_t ui32Mon) +{ + // + // Return the number of days based on the month. + // + if(ui32Mon == 1) + { + // + // For February return the number of days based on the year being a + // leap year or not. + // + if((ui32Year % 4) == 0) + { + // + // If leap year return 29. + // + return 29; + } + else + { + // + // If not leap year return 28. + // + return 28; + } + } + else if((ui32Mon == 3) || (ui32Mon == 5) || (ui32Mon == 8) || + (ui32Mon == 10)) + { + // + // For April, June, September and November return 30. + // + return 30; + } + + // + // For all the other months return 31. + // + return 31; +} + +//***************************************************************************** +// +// This function returns the date and time value that is written to the +// calendar match register. 5 seconds are added to the current time. Any +// side-effects due to this addition are handled here. +// +//***************************************************************************** +void +GetCalendarMatchValue(struct tm* sTime) +{ + uint32_t ui32MonthDays; + + // + // Get the current date and time and add 5 secs to it. + // + HibernateCalendarGet(sTime); + sTime->tm_sec += 5; + + // + // Check if seconds is out of bounds. If so subtract seconds by 60 and + // increment minutes. + // + if(sTime->tm_sec > 59) + { + sTime->tm_sec -= 60; + sTime->tm_min++; + } + + // + // Check if minutes is out of bounds. If so subtract minutes by 60 and + // increment hours. + // + if(sTime->tm_min > 59) + { + sTime->tm_min -= 60; + sTime->tm_hour++; + } + + // + // Check if hours is out of bounds. If so subtract minutes by 24 and + // increment days. + // + if(sTime->tm_hour > 23) + { + sTime->tm_hour -= 24; + sTime->tm_mday++; + } + + // + // Since different months have varying number of days, get the number of + // days for the current month and year. + // + ui32MonthDays = GetDaysInMonth(sTime->tm_year, sTime->tm_mon); + + // + // Check if days is out of bounds for the current month and year. If so + // subtract days by the number of days in the current month and increment + // months. + // + if(sTime->tm_mday > ui32MonthDays) + { + sTime->tm_mday -= ui32MonthDays; + sTime->tm_mon++; + } + + // + // Check if months is out of bounds. If so subtract months by 11 and + // increment years. + // + if(sTime->tm_mon > 11) + { + sTime->tm_mon -= 11; + sTime->tm_year++; + } + + // + // Check if years is out of bounds. If so subtract years by 100. + // + if(sTime->tm_year > 99) + { + sTime->tm_year -= 100; + } +} +//***************************************************************************** +// +// Handle the Info String button press on Main Screen. +// +//***************************************************************************** +void +OnInfoStrBtnPress(tWidget *psWidget) +{ + // + // If this button is pressed then user wants to enter hibernation. So + // set the respective flag. + // + g_bHibernate = true; +} + +//***************************************************************************** +// +// Handle the "Date/Time" button press on Main Screen. +// +//***************************************************************************** +void +OnDateTimeSetBtnPress(tWidget *psWidget) +{ + // + // Update the date and time screen buffers before painting the screens. + // Even though only buffers used with the date screen are needed at this + // time, we update both to save few cycles. + // + DateTimeUpdateGet(g_pcMonBuf, g_pcDayBuf, g_pcYearBuf, g_pcHourBuf, + g_pcMinBuf, g_pcAMPMBuf); + + // + // Remove the main screen from the root. + // + WidgetRemove((tWidget *)&g_sMainScreen); + + // + // Add the date screen to the root. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sDateScreen); + + // + // Add the widget tree to message queue so that it can be drawn on the + // display. + // + WidgetPaint(WIDGET_ROOT); + + // + // Set the flag to indicate that the main screen is not active. + // + g_bMainScreen = false; +} + +//***************************************************************************** +// +// Handle the Month "-" button press on Date Screen. +// +//***************************************************************************** +void +OnMonUpBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to decrement the month. So reduce index by one such that the + // index cycles back to the bottom of the list if it is at the top. + // + g_ui32MonthIdx = (g_ui32MonthIdx == 0) ? 11 : g_ui32MonthIdx - 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + strcpy(g_pcMonBuf, g_ppcMonth[g_ui32MonthIdx]); + WidgetPaint(&g_sMonText.sBase); + + // + // Makes sure that the day value does not exceed the number of days for the + // selected month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth : + g_ui32DayIdx; + + // + // Since the day value might also have been modified, store the day index + // in a buffer as a string and add the widget to the message queue so that + // it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the Month "+" button press on Date Screen. +// +//***************************************************************************** +void +OnMonDwnBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to increment the month. So increment index by one such that + // the index cycles back to the top of the list if it is at the bottom. + // + g_ui32MonthIdx = (g_ui32MonthIdx == 11) ? 0 : g_ui32MonthIdx + 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + strcpy(g_pcMonBuf, g_ppcMonth[g_ui32MonthIdx]); + WidgetPaint(&g_sMonText.sBase); + + // + // Makes sure that the day value does not exceed the number of days for the + // selected month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth : + g_ui32DayIdx; + + // + // Since the day value might also have been modified, store the day index + // in a buffer as a string and add the widget to the message queue so that + // it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the Day "-" button press on Date Screen. +// +//***************************************************************************** +void +OnDayUpBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to decrement the day. So reduce index by one such that the + // index cycles back to the bottom of the list if it is at the top. Make + // sure that the day index is adjusted based on the number of days in a + // month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx < 2) ? ui32DaysInMonth : g_ui32DayIdx - 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the Day "+" button press on Date Screen. +// +//***************************************************************************** +void +OnDayDwnBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to increment the day. So increment index by one such that + // the index cycles back to the top of the list if it is at the bottom. + // Make sure that the day index does not exceed the number of days for the + // selected month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx > (ui32DaysInMonth - 1)) ? 1 : + (g_ui32DayIdx + 1); + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the Year "-" button press on Date Screen. +// +//***************************************************************************** +void +OnYearUpBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to decrement the year. So reduce index by one such that the + // index cycles back to the bottom of the list if it is at the top. + // + g_ui32YearIdx = (g_ui32YearIdx == 0) ? 99 : g_ui32YearIdx - 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcYearBuf, sizeof(g_pcYearBuf), "20%02u", g_ui32YearIdx); + WidgetPaint(&g_sYearText.sBase); + + // + // Makes sure that the day value does not exceed the number of days for the + // selected month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth : + g_ui32DayIdx; + + // + // Since the day value might also have been modified, store the day index + // in a buffer as a string and add the widget to the message queue so that + // it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the Year "+" button press on Date Screen. +// +//***************************************************************************** +void +OnYearDwnBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to increment the year. So increment index by one such that + // the index cycles back to the top of the list if it is at the bottom. + // + g_ui32YearIdx = (g_ui32YearIdx == 99) ? 0 : g_ui32YearIdx + 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcYearBuf, sizeof(g_pcYearBuf), "20%02u", g_ui32YearIdx); + WidgetPaint(&g_sYearText.sBase); + + // + // Makes sure that the day value does not exceed the number of days for the + // selected month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth : + g_ui32DayIdx; + + // + // Since the day value might also have been modified, store the day index + // in a buffer as a string and add the widget to the message queue so that + // it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the "NEXT" button press on Date Screen. +// +//***************************************************************************** +void +OnDateNextBtnPress(tWidget *psWidget) +{ + // + // Remove the main screen from the root. + // + WidgetRemove((tWidget *)&g_sDateScreen); + + // + // Add the date screen to the root. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sTimeScreen); + + // + // Add the widget tree to message queue so that it can be drawn on the + // display. + // + WidgetPaint(WIDGET_ROOT); +} + +//***************************************************************************** +// +// Handle the Hour "-" button press on Time Screen. +// +//***************************************************************************** +void +OnHourUpBtnPress(tWidget *psWidget) +{ + // + // User wants to decrement the hour. So reduce index by one such that the + // index cycles back to the bottom of the list if it is at the top. + // + g_ui32HourIdx = (g_ui32HourIdx == 1) ? 12 : g_ui32HourIdx - 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcHourBuf, sizeof(g_pcHourBuf), "%u", g_ui32HourIdx); + WidgetPaint(&g_sHourText.sBase); +} + +//***************************************************************************** +// +// Handle the Hour "+" button press on Time Screen. +// +//***************************************************************************** +void +OnHourDwnBtnPress(tWidget *psWidget) +{ + // + // User wants to increment the hour. So increment index by one such that + // the index cycles back to the top of the list if it is at the bottom. + // + g_ui32HourIdx = (g_ui32HourIdx == 12) ? 1 : g_ui32HourIdx + 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcHourBuf, sizeof(g_pcHourBuf), "%u", g_ui32HourIdx); + WidgetPaint(&g_sHourText.sBase); +} + +//***************************************************************************** +// +// Handle the Minute "-" button press on Time Screen. +// +//***************************************************************************** +void +OnMinUpBtnPress(tWidget *psWidget) +{ + // + // User wants to decrement the minute. So reduce index by one such that + // the index cycles back to the bottom of the list if it is at the top. + // + g_ui32MinIdx = (g_ui32MinIdx == 0) ? 59 : g_ui32MinIdx - 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcMinBuf, sizeof(g_pcMinBuf), "%02u", g_ui32MinIdx); + WidgetPaint(&g_sMinText.sBase); +} + +//***************************************************************************** +// +// Handle the Minute "+" button press on Time Screen. +// +//***************************************************************************** +void +OnMinDwnBtnPress(tWidget *psWidget) +{ + // + // User wants to increment the minute. So increment index by one such that + // the index cycles back to the top of the list if it is at the bottom. + // + g_ui32MinIdx = (g_ui32MinIdx == 59) ? 0 : g_ui32MinIdx + 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcMinBuf, sizeof(g_pcMinBuf), "%02u", g_ui32MinIdx); + WidgetPaint(&g_sMinText.sBase); +} + +//***************************************************************************** +// +// Handle the AM/PM "+" and "-" button press on Time Screen. The same function +// handles both the button presses. +// +//***************************************************************************** +void +OnAMPMBtnPress(tWidget *psWidget) +{ + // + // User wants to change AM to PM or vice versa. Change to "PM" if "AM" and + // vice versa. + // + if(strcmp(g_pcAMPMBuf, "AM") == 0) + { + strcpy(g_pcAMPMBuf, "PM"); + } + else + { + strcpy(g_pcAMPMBuf, "AM"); + } + + // + // Add the widget to the message queue so that it can be redrawn. + // + WidgetPaint(&g_sAMPMText.sBase); +} + +//***************************************************************************** +// +// Handle the "DONE" button press on Time Screen. +// +//***************************************************************************** +void +OnTimeDoneBtnPress(tWidget *psWidget) +{ + // + // Remove the main screen from the root. + // + WidgetRemove((tWidget *)&g_sTimeScreen); + + // + // Add the date screen to the root. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sMainScreen); + + // + // Add the widget tree to message queue so that it can be drawn on the + // display. + // + WidgetPaint(WIDGET_ROOT); + + // + // Set the flag to indicate that date and time have to updated. + // + g_bSetDate = true; +} + +//***************************************************************************** +// +// This example demonstrates the different hibernate wake sources. The +// microcontroller is put into hibernation by the user and wakes up based on +// timeout or one of the user inputs. This example also demonstrates the RTC +// calendar function that keeps track of date and time. +// +//***************************************************************************** +int +main(void) +{ + tContext sContext; + struct tm sTime; + bool bUpdate; + uint32_t ui32SysClock, ui32Status, ui32HibernateCount, ui32Len; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "hibernate"); + + // + // Flush any cached drawing operations. + // + GrFlush(&sContext); + + // + // Set a font henceforth. + // + GrContextFontSet(&sContext, g_psFontCm16); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + TouchScreenCallbackSet(WidgetPointerMessage); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sMainScreen); + + // + // Enable the hibernate module. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); + + // + // Initialize these variables before they are used. + // + ui32Status = 0; + ui32HibernateCount = 0; + + // + // Check to see if Hibernation module is already active, which could mean + // that the processor is waking from a hibernation. + // + if(HibernateIsActive()) + { + // + // Read the status bits to see what caused the wake. Clear the wake + // source so that the device can be put into hibernation again. + // + ui32Status = HibernateIntStatus(0); + HibernateIntClear(ui32Status); + + // + // Store the common part of the wake information message into a buffer. + // The wake source will be appended based on the status bits. + // + ui32Len = usnprintf(g_pcWakeBuf, sizeof(g_pcWakeBuf), + "Wake Due To : "); + + // + // Wake was due to RTC match. + // + if(ui32Status & HIBERNATE_INT_RTC_MATCH_0) + { + ui32Len = usnprintf(&g_pcWakeBuf[ui32Len], + sizeof(g_pcWakeBuf) - ui32Len, "%s", + g_ppcWakeSource[0]); + } + + // + // Wake was due to Reset button. + // + else if(ui32Status & HIBERNATE_INT_RESET_WAKE) + { + ui32Len = usnprintf(&g_pcWakeBuf[ui32Len], + sizeof(g_pcWakeBuf) - ui32Len, "%s", + g_ppcWakeSource[1]); + } + + // + // Wake was due to the External Wake pin. + // + else if(ui32Status & HIBERNATE_INT_PIN_WAKE) + { + ui32Len = usnprintf(&g_pcWakeBuf[ui32Len], + sizeof(g_pcWakeBuf) - ui32Len, "%s", + g_ppcWakeSource[2]); + } + + // + // Wake was due to GPIO wake. + // + else if(ui32Status & HIBERNATE_INT_GPIO_WAKE) + { + ui32Len = usnprintf(&g_pcWakeBuf[ui32Len], + sizeof(g_pcWakeBuf) - ui32Len, "%s", + g_ppcWakeSource[3]); + } + + // + // If the wake is due to any of the configured wake sources, then read + // the first location from the battery backed memory, as the + // hibernation count. + // + if(ui32Status & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0 | + HIBERNATE_INT_GPIO_WAKE | HIBERNATE_INT_RESET_WAKE)) + { + HibernateDataGet(&ui32HibernateCount, 1); + } + } + + // + // Configure Hibernate module clock. + // + HibernateEnableExpClk(ui32SysClock); + + // + // If the wake was not due to the above sources, then it was a system + // reset. + // + if(!(ui32Status & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0 | + HIBERNATE_INT_GPIO_WAKE | HIBERNATE_INT_RESET_WAKE))) + { + // + // Configure the module clock source. + // + HibernateClockConfig(HIBERNATE_OSC_LOWDRIVE); + + // + // Store that this was a system restart, not wake from hibernation. + // + ui32Len = usnprintf(g_pcWakeBuf, sizeof(g_pcWakeBuf), "%s", + g_ppcWakeSource[4]); + + // + // Set Calendar time to start from 08/29/2013 at 8:30AM + // + g_ui32MonthIdx = 7; + g_ui32DayIdx = 29; + g_ui32YearIdx = 13; + g_ui32HourIdx = 8; + g_ui32MinIdx = 30; + strcpy(g_pcMonBuf, "AUG"); + strcpy(g_pcDayBuf, "29"); + strcpy(g_pcYearBuf, "2013"); + strcpy(g_pcHourBuf, "8"); + strcpy(g_pcMinBuf, "30"); + strcpy(g_pcAMPMBuf, "AM"); + } + + // + // Store the hibernation count message into the respective widget buffer. + // + usnprintf(g_pcHibBuf, sizeof(g_pcHibBuf), "Hibernate count = %u", + ui32HibernateCount); + + // + // Store the text, that informs the user on how to hibernate, into the + // respective widget buffer. + // + usnprintf(g_pcInfoBuf0, sizeof(g_pcInfoBuf0), "To hibernate touch HERE."); + + // + // Add the widget tree to the message queue so that it can be drawn. + // + WidgetPaint(WIDGET_ROOT); + + // + // Enable RTC mode. + // + HibernateRTCEnable(); + + // + // Configure the hibernate module counter to 24-hour calendar mode. + // + HibernateCounterMode(HIBERNATE_COUNTER_24HR); + + // + // Configure GPIOs used as Hibernate wake source + // + GPIOPadConfigSet(GPIO_PORTK_BASE, 0x20, GPIO_STRENGTH_2MA, + (GPIO_PIN_TYPE_WAKE_LOW | GPIO_PIN_TYPE_STD_WPU)); + + // + // Enable processor interrupts. + // + IntMasterEnable(); + + // + // If hibernation count is very large, it may be that there was already + // a value in the hibernate memory, so reset the count. + // + ui32HibernateCount = (ui32HibernateCount > 10000) ? 0 : ui32HibernateCount; + + // + // Increment the hibernation count, and store it in the battery backed + // memory. + // + ui32HibernateCount++; + HibernateDataSet(&ui32HibernateCount, 1); + + // + // Initialize the necessary flags before entering indefinite loop. + // + g_bMainScreen = true; + g_bHibernate = false; + g_bSetDate = false; + + // + // Loop forever. + // + while(1) + { + // + // Process any messages for/from the widgets. + // + WidgetMessageQueueProcess(); + + // + // Check if date and time has to be written to the calendar logic of + // hibernate module. + // + if(g_bSetDate == true) + { + // + // Yes - Clear the flag to avoid unwanted writes to the calendar + // logic. + // + g_bSetDate = false; + + // + // Write the requested date and time. + // + DateTimeSet(); + + // + // Set the flag to indicate that the main screen is active. + // + g_bMainScreen = true; + } + + // + // Check if main screen is active and update the required buffers and + // redraw the required widgets. + // + if(g_bMainScreen) + { + // + // Update the buffer that displays date and time on the main + // screen. + // + bUpdate = DateTimeDisplayGet(g_pcDateTimeBuf, + sizeof(g_pcDateTimeBuf)); + + // + // Is a new value of date and time available to be displayed? + // + if(bUpdate == true) + { + // + // Yes - Redraw the widget. + // + WidgetPaint(&g_sDateTime.sBase); + } + } + + // + // Check if user wants to enter hibernation. + // + if(g_bHibernate == true) + { + // + // Yes - Clear the flag. + // + g_bHibernate = false; + + // + // Store the text, that informs the user on how to wake-up from + // hibernation, into the respective widget buffers. + // + usnprintf(g_pcInfoBuf1, sizeof(g_pcInfoBuf1), "To wake up wait " + "for 5 secs or press the"); + usnprintf(g_pcInfoBuf2, sizeof(g_pcInfoBuf2), "RESET button. " + "Refer document for"); + usnprintf(g_pcInfoBuf3, sizeof(g_pcInfoBuf3), "additional " + "wake sources."); + + // + // Redraw the widgets to display the updated buffers. These + // widgets have to be redrawn here instead of adding to the message + // queue by using WidgetPaint() function as + // WidgetMessageQueueProcess() function won't be executed before + // entering hibernation. + // + CanvasMsgProc(&g_sInfoStr1.sBase, WIDGET_MSG_PAINT, 0, 0); + CanvasMsgProc(&g_sInfoStr2.sBase, WIDGET_MSG_PAINT, 0, 0); + CanvasMsgProc(&g_sInfoStr3.sBase, WIDGET_MSG_PAINT, 0, 0); + + // + // Get calendar match value to be 5 seconds from the current time. + // + GetCalendarMatchValue(&sTime); + + // + // Set the calendar match register such that it wakes up from + // hibernation in 5 seconds. + // + HibernateCalendarMatchSet(0, &sTime); + + // + // Read and clear any status bits that might have been set since + // last clearing them. + // + ui32Status = HibernateIntStatus(0); + HibernateIntClear(ui32Status); + + // + // Configure Hibernate wake sources. + // + HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_GPIO | + HIBERNATE_WAKE_RESET | HIBERNATE_WAKE_RTC); + + // + // Request Hibernation. + // + HibernateRequest(); + + // + // Wait for a while for hibernate to activate. It should never get + // past this point. + // + SysCtlDelay(100); + + // + // If it ever gets here, store the text, that informs the user on + // what to do, into the respective widget buffers. + // + usnprintf(g_pcInfoBuf1, sizeof(g_pcInfoBuf1), "The controller did " + "not enter hibernate mode."); + usnprintf(g_pcInfoBuf2, sizeof(g_pcInfoBuf2), "TOUCH THE DISPLAY " + "TO RESTART."); + usnprintf(g_pcInfoBuf3, sizeof(g_pcInfoBuf3), ""); + + // + // Redraw the widgets to display the updated buffers. + // + CanvasMsgProc(&g_sInfoStr1.sBase, WIDGET_MSG_PAINT, 0, 0); + CanvasMsgProc(&g_sInfoStr2.sBase, WIDGET_MSG_PAINT, 0, 0); + CanvasMsgProc(&g_sInfoStr3.sBase, WIDGET_MSG_PAINT, 0, 0); + + // + // Wait for the user request to reset processor. Then reset the + // processor. + // + g_bHibernate = false; + while(g_bHibernate != true) + { + } + + // + // Reset the processor. + // + ROM_SysCtlReset(); + + // + // Wait here. + // + while(1) + { + } + } + } +} diff --git a/boards/dk-tm4c129x/hibernate/hibernate.ewd b/boards/dk-tm4c129x/hibernate/hibernate.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/hibernate.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/hibernate/hibernate.ewp b/boards/dk-tm4c129x/hibernate/hibernate.ewp new file mode 100644 index 0000000..fd4a9ad --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/hibernate.ewp @@ -0,0 +1,810 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\hibernate.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/hibernate/hibernate.icf b/boards/dk-tm4c129x/hibernate/hibernate.icf new file mode 100644 index 0000000..8ecb442 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/hibernate.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// hibernate.icf - Linker configuration file for hibernate. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/hibernate/hibernate.ld b/boards/dk-tm4c129x/hibernate/hibernate.ld new file mode 100644 index 0000000..91ddcfa --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/hibernate.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * hibernate.ld - Linker configuration file for hibernate. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/hibernate/hibernate.sct b/boards/dk-tm4c129x/hibernate/hibernate.sct new file mode 100644 index 0000000..25625e4 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/hibernate.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; hibernate.sct - Linker configuration file for hibernate. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/hibernate/hibernate.uvopt b/boards/dk-tm4c129x/hibernate/hibernate.uvopt new file mode 100644 index 0000000..fa3bf3b --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/hibernate.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + hibernate + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\hibernate.c + hibernate.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/hibernate/hibernate.uvproj b/boards/dk-tm4c129x/hibernate/hibernate.uvproj new file mode 100644 index 0000000..f9c0bb3 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/hibernate.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + hibernate + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + hibernate + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\hibernate.bin .\rvmdk\hibernate.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 SNOWFLAKE + + .;..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + hibernate.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + hibernate.c + 1 + .\hibernate.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/hibernate/hibernate_ccs.cmd b/boards/dk-tm4c129x/hibernate/hibernate_ccs.cmd new file mode 100644 index 0000000..e89de9d --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/hibernate_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * hibernate_ccs.cmd - CCS linker configuration file for hibernate. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/hibernate/readme.txt b/boards/dk-tm4c129x/hibernate/readme.txt new file mode 100644 index 0000000..d446a9f --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/readme.txt @@ -0,0 +1,37 @@ +Hibernate Example + +An example to demonstrate the use of the Hibernation module. The user +can put the microcontroller in hibernation by touching the display. The +microcontroller will then wake on its own after 5 seconds, or immediately +if the user presses the RESET button. External WAKE pin and GPIO (PK5) +wake sources can also be used to wake immediately from hibernation. The +following wiring enables the use of these pins as wake sources. + WAKE on J27 to SEL on J37 + PK5 on J28 to UP on J37 + +The program keeps a count of the number of times it has entered +hibernation. The value of the counter is stored in the battery backed +memory of the Hibernation module so that it can be retrieved when the +microcontroller wakes. The program displays the wall time and date by +making use of the calendar function of the Hibernate module. User can +modify the date and time if so desired. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/hibernate/rvmdk/hibernate.axf b/boards/dk-tm4c129x/hibernate/rvmdk/hibernate.axf new file mode 100644 index 0000000..e2192cb Binary files /dev/null and b/boards/dk-tm4c129x/hibernate/rvmdk/hibernate.axf differ diff --git a/boards/dk-tm4c129x/hibernate/rvmdk/hibernate.bin b/boards/dk-tm4c129x/hibernate/rvmdk/hibernate.bin new file mode 100644 index 0000000..9e86066 Binary files /dev/null and b/boards/dk-tm4c129x/hibernate/rvmdk/hibernate.bin differ diff --git a/boards/dk-tm4c129x/hibernate/startup_ccs.c b/boards/dk-tm4c129x/hibernate/startup_ccs.c new file mode 100644 index 0000000..5d2884c --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/hibernate/startup_ewarm.c b/boards/dk-tm4c129x/hibernate/startup_ewarm.c new file mode 100644 index 0000000..860b8a6 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/hibernate/startup_gcc.c b/boards/dk-tm4c129x/hibernate/startup_gcc.c new file mode 100644 index 0000000..fad3049 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/hibernate/startup_rvmdk.S b/boards/dk-tm4c129x/hibernate/startup_rvmdk.S new file mode 100644 index 0000000..07659c1 --- /dev/null +++ b/boards/dk-tm4c129x/hibernate/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/interrupts/Makefile b/boards/dk-tm4c129x/interrupts/Makefile new file mode 100644 index 0000000..bf038e3 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the interrupts example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the interrupts example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/interrupts.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the interrupts example. +# +${COMPILER}/interrupts.axf: ${COMPILER}/frame.o +${COMPILER}/interrupts.axf: ${COMPILER}/interrupts.o +${COMPILER}/interrupts.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/interrupts.axf: ${COMPILER}/pinout.o +${COMPILER}/interrupts.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/interrupts.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/interrupts.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/interrupts.axf: interrupts.ld +SCATTERgcc_interrupts=interrupts.ld +ENTRY_interrupts=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/interrupts/ccs/.ccsimportspec b/boards/dk-tm4c129x/interrupts/ccs/.ccsimportspec new file mode 100644 index 0000000..9033256 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/interrupts/ccs/.ccsproject b/boards/dk-tm4c129x/interrupts/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/interrupts/ccs/.cproject b/boards/dk-tm4c129x/interrupts/ccs/.cproject new file mode 100644 index 0000000..0e1ef48 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/interrupts/ccs/.project b/boards/dk-tm4c129x/interrupts/ccs/.project new file mode 100644 index 0000000..a801de8 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/ccs/.project @@ -0,0 +1,65 @@ + + + interrupts + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + interrupts.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/interrupts/interrupts.c + + + interrupts_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/interrupts/interrupts_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/interrupts/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/interrupts/ccs/Debug/interrupts.bin b/boards/dk-tm4c129x/interrupts/ccs/Debug/interrupts.bin new file mode 100644 index 0000000..df13101 Binary files /dev/null and b/boards/dk-tm4c129x/interrupts/ccs/Debug/interrupts.bin differ diff --git a/boards/dk-tm4c129x/interrupts/ccs/Debug/interrupts.out b/boards/dk-tm4c129x/interrupts/ccs/Debug/interrupts.out new file mode 100644 index 0000000..07e6760 Binary files /dev/null and b/boards/dk-tm4c129x/interrupts/ccs/Debug/interrupts.out differ diff --git a/boards/dk-tm4c129x/interrupts/ccs/macros.ini_initial b/boards/dk-tm4c129x/interrupts/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/interrupts/ccs/target_config.ccxml b/boards/dk-tm4c129x/interrupts/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/interrupts/ewarm/Exe/interrupts.bin b/boards/dk-tm4c129x/interrupts/ewarm/Exe/interrupts.bin new file mode 100644 index 0000000..e0df21a Binary files /dev/null and b/boards/dk-tm4c129x/interrupts/ewarm/Exe/interrupts.bin differ diff --git a/boards/dk-tm4c129x/interrupts/ewarm/Exe/interrupts.out b/boards/dk-tm4c129x/interrupts/ewarm/Exe/interrupts.out new file mode 100644 index 0000000..a48df2c Binary files /dev/null and b/boards/dk-tm4c129x/interrupts/ewarm/Exe/interrupts.out differ diff --git a/boards/dk-tm4c129x/interrupts/gcc/interrupts.axf b/boards/dk-tm4c129x/interrupts/gcc/interrupts.axf new file mode 100644 index 0000000..5d93993 Binary files /dev/null and b/boards/dk-tm4c129x/interrupts/gcc/interrupts.axf differ diff --git a/boards/dk-tm4c129x/interrupts/gcc/interrupts.bin b/boards/dk-tm4c129x/interrupts/gcc/interrupts.bin new file mode 100644 index 0000000..d5e6f81 Binary files /dev/null and b/boards/dk-tm4c129x/interrupts/gcc/interrupts.bin differ diff --git a/boards/dk-tm4c129x/interrupts/interrupts.c b/boards/dk-tm4c129x/interrupts/interrupts.c new file mode 100644 index 0000000..4a3cd5e --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/interrupts.c @@ -0,0 +1,593 @@ +//***************************************************************************** +// +// interrupts.c - Interrupt preemption and tail-chaining example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/systick.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Interrupts (interrupts)

      +//! +//! This example application demonstrates the interrupt preemption and +//! tail-chaining capabilities of Cortex-M4 microprocessor and NVIC. Nested +//! interrupts are synthesized when the interrupts have the same priority, +//! increasing priorities, and decreasing priorities. With increasing +//! priorities, preemption will occur; in the other two cases tail-chaining +//! will occur. The currently pending interrupts and the currently executing +//! interrupt will be displayed on the display; GPIO pins B3, L1 and L0 (the +//! GPIO on jumper J27 on the left edge of the board) will be asserted upon +//! interrupt handler entry and de-asserted before interrupt handler exit so +//! that the off-to-on time can be observed with a scope or logic analyzer to +//! see the speed of tail-chaining (for the two cases where tail-chaining is +//! occurring). +// +//***************************************************************************** + + +//***************************************************************************** +// +// The count of interrupts received. This is incremented as each interrupt +// handler runs, and its value saved into interrupt handler specific values to +// determine the order in which the interrupt handlers were executed. +// +//***************************************************************************** +volatile uint32_t g_ui32Index; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOA interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOa; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOB interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOb; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOC interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOc; + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// GPIOs that are used for this example. +// +//***************************************************************************** +#define GPIO_A_BASE GPIO_PORTB_BASE +#define GPIO_A_PIN GPIO_PIN_3 +#define GPIO_B_BASE GPIO_PORTL_BASE +#define GPIO_B_PIN GPIO_PIN_1 +#define GPIO_C_BASE GPIO_PORTL_BASE +#define GPIO_C_PIN GPIO_PIN_0 + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Delay for the specified number of seconds. Depending upon the current +// SysTick value, the delay will be between N-1 and N seconds (i.e. N-1 full +// seconds are guaranteed, along with the remainder of the current second). +// +//***************************************************************************** +void +Delay(uint32_t ui32Seconds) +{ + uint8_t ui8Loop; + + // + // Loop while there are more seconds to wait. + // + while(ui32Seconds--) + { + for(ui8Loop = 0; ui8Loop < 100; ui8Loop++) + { + // + // Wait until the SysTick value is less than 1000. + // + while(ROM_SysTickValueGet() > 1000) + { + } + + // + // Wait until the SysTick value is greater than 1000. + // + while(ROM_SysTickValueGet() < 1000) + { + } + } + } +} + +//***************************************************************************** +// +// Display the interrupt state on the display. The currently active and pending +// interrupts are displayed. +// +//***************************************************************************** +void +DisplayIntStatus(void) +{ + uint32_t ui32Temp; + char pcBuffer[6]; + + // + // Display the currently active interrupts. + // + ui32Temp = HWREG(NVIC_ACTIVE0); + pcBuffer[0] = ' '; + pcBuffer[1] = (ui32Temp & 1) ? '1' : ' '; + pcBuffer[2] = (ui32Temp & 2) ? '2' : ' '; + pcBuffer[3] = (ui32Temp & 4) ? '3' : ' '; + pcBuffer[4] = ' '; + pcBuffer[5] = '\0'; + GrStringDrawCentered(&g_sContext, pcBuffer, -1, 130, 150, 1); + + // + // Display the currently pending interrupts. + // + ui32Temp = HWREG(NVIC_PEND0); + pcBuffer[1] = (ui32Temp & 1) ? '1' : ' '; + pcBuffer[2] = (ui32Temp & 2) ? '2' : ' '; + pcBuffer[3] = (ui32Temp & 4) ? '3' : ' '; + GrStringDrawCentered(&g_sContext, pcBuffer, -1, 270, 150, 1); + + // + // Flush the display. + // + GrFlush(&g_sContext); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOA. It simply saves the interrupt sequence +// number. +// +//***************************************************************************** +void +IntGPIOa(void) +{ + // + // Set GPIO high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_A_BASE, GPIO_A_PIN, GPIO_A_PIN); + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOa = g_ui32Index++; + + // + // Set GPIO low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_A_BASE, GPIO_A_PIN, 0); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOB. It triggers INT_GPIOA and saves the +// interrupt sequence number. +// +//***************************************************************************** +void +IntGPIOb(void) +{ + // + // Set GPIO high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_B_BASE, GPIO_B_PIN, GPIO_B_PIN); + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Trigger the INT_GPIOA interrupt. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOA - 16; + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOb = g_ui32Index++; + + // + // Set GPIO low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_B_BASE, GPIO_B_PIN, 0); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOC. It triggers INT_GPIOB and saves the +// interrupt sequence number. +// +//***************************************************************************** +void +IntGPIOc(void) +{ + // + // Set GPIO high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_C_BASE, GPIO_C_PIN, GPIO_C_PIN); + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Trigger the INT_GPIOB interrupt. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOB - 16; + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOc = g_ui32Index++; + + // + // Set GPIO low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_C_BASE, GPIO_C_PIN, 0); +} + +//***************************************************************************** +// +// This is the main example program. It checks to see that the interrupts are +// processed in the correct order when they have identical priorities, +// increasing priorities, and decreasing priorities. This exercises interrupt +// preemption and tail chaining. +// +//***************************************************************************** +int +main(void) +{ + uint_fast8_t ui8Error; + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "interrupts"); + + // + // Put the status header text on the display. + // + GrContextFontSet(&g_sContext, g_psFontCm20); + GrStringDrawCentered(&g_sContext, "Active: Pending: ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 150, 0); + + // + // Configure the B3, L1 and L0 to be outputs to indicate entry/exit of one + // of the interrupt handlers. + // + GPIOPinTypeGPIOOutput(GPIO_A_BASE, GPIO_A_PIN); + GPIOPinTypeGPIOOutput(GPIO_B_BASE, GPIO_B_PIN); + GPIOPinTypeGPIOOutput(GPIO_C_BASE, GPIO_C_PIN); + GPIOPinWrite(GPIO_A_BASE, GPIO_A_PIN, 0); + GPIOPinWrite(GPIO_B_BASE, GPIO_B_PIN, 0); + GPIOPinWrite(GPIO_C_BASE, GPIO_C_PIN, 0); + + // + // Set up and enable the SysTick timer. It will be used as a reference + // for delay loops in the interrupt handlers. The SysTick timer period + // will be set up for 100 times per second. + // + ROM_SysTickPeriodSet(ui32SysClock / 100); + ROM_SysTickEnable(); + + // + // Reset the error indicator. + // + ui8Error = 0; + + // + // Enable interrupts to the processor. + // + ROM_IntMasterEnable(); + + // + // Enable the interrupts. + // + ROM_IntEnable(INT_GPIOA); + ROM_IntEnable(INT_GPIOB); + ROM_IntEnable(INT_GPIOC); + + // + // Indicate that the equal interrupt priority test is beginning. + // + GrStringDrawCentered(&g_sContext, "Equal Priority", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 60, 1); + + // + // Set the interrupt priorities so they are all equal. + // + ROM_IntPrioritySet(INT_GPIOA, 0x00); + ROM_IntPrioritySet(INT_GPIOB, 0x00); + ROM_IntPrioritySet(INT_GPIOC, 0x00); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the LCD. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 3) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 1)) + { + ui8Error |= 1; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Indicate that the decreasing interrupt priority test is beginning. + // + GrStringDrawCentered(&g_sContext, " Decreasing Priority ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 60, 1); + + // + // Set the interrupt priorities so that they are decreasing (i.e. C > B > + // A). + // + ROM_IntPrioritySet(INT_GPIOA, 0x80); + ROM_IntPrioritySet(INT_GPIOB, 0x40); + ROM_IntPrioritySet(INT_GPIOC, 0x00); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 3) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 1)) + { + ui8Error |= 2; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Indicate that the increasing interrupt priority test is beginning. + // + GrStringDrawCentered(&g_sContext, " Increasing Priority ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 60, 1); + + // + // Set the interrupt priorities so that they are increasing (i.e. C < B < + // A). + // + ROM_IntPrioritySet(INT_GPIOA, 0x00); + ROM_IntPrioritySet(INT_GPIOB, 0x40); + ROM_IntPrioritySet(INT_GPIOC, 0x80); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 1) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 3)) + { + ui8Error |= 4; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Disable the interrupts. + // + ROM_IntDisable(INT_GPIOA); + ROM_IntDisable(INT_GPIOB); + ROM_IntDisable(INT_GPIOC); + + // + // Disable interrupts to the processor. + // + ROM_IntMasterDisable(); + + // + // Print out the test results. + // + GrStringDrawCentered(&g_sContext, " Interrupt Priority ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 60, 1); + if(ui8Error) + { + GrStringDrawCentered(&g_sContext, " Equal: P Inc: P Dec: P ", + -1, GrContextDpyWidthGet(&g_sContext) / 2, 150, 1); + if(ui8Error & 1) + { + GrStringDrawCentered(&g_sContext, " F ", -1, 113, 150, 1); + } + if(ui8Error & 2) + { + GrStringDrawCentered(&g_sContext, " F ", -1, 187, 150, 1); + } + if(ui8Error & 4) + { + GrStringDrawCentered(&g_sContext, " F ", -1, 272, 150, 1); + } + } + else + { + GrStringDrawCentered(&g_sContext, " Success! ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 150, 1); + } + + // + // Flush the display. + // + GrFlush(&g_sContext); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/interrupts/interrupts.ewd b/boards/dk-tm4c129x/interrupts/interrupts.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/interrupts.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/interrupts/interrupts.ewp b/boards/dk-tm4c129x/interrupts/interrupts.ewp new file mode 100644 index 0000000..45888bc --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/interrupts.ewp @@ -0,0 +1,798 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\interrupts.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/dk-tm4c129x/interrupts/interrupts.icf b/boards/dk-tm4c129x/interrupts/interrupts.icf new file mode 100644 index 0000000..8768d65 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/interrupts.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// interrupts.icf - Linker configuration file for interrupts. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/interrupts/interrupts.ld b/boards/dk-tm4c129x/interrupts/interrupts.ld new file mode 100644 index 0000000..3865cc3 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/interrupts.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * interrupts.ld - Linker configuration file for interrupts. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/interrupts/interrupts.sct b/boards/dk-tm4c129x/interrupts/interrupts.sct new file mode 100644 index 0000000..2b4f99e --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/interrupts.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; interrupts.sct - Linker configuration file for interrupts. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/interrupts/interrupts.uvopt b/boards/dk-tm4c129x/interrupts/interrupts.uvopt new file mode 100644 index 0000000..e62284e --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/interrupts.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + interrupts + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\interrupts.c + interrupts.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/interrupts/interrupts.uvproj b/boards/dk-tm4c129x/interrupts/interrupts.uvproj new file mode 100644 index 0000000..5fca192 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/interrupts.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + interrupts + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + interrupts + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\interrupts.bin .\rvmdk\interrupts.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + interrupts.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + interrupts.c + 1 + .\interrupts.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/interrupts/interrupts_ccs.cmd b/boards/dk-tm4c129x/interrupts/interrupts_ccs.cmd new file mode 100644 index 0000000..584ef34 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/interrupts_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * interrupts_ccs.cmd - CCS linker configuration file for interrupts. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/interrupts/readme.txt b/boards/dk-tm4c129x/interrupts/readme.txt new file mode 100644 index 0000000..b011a90 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/readme.txt @@ -0,0 +1,34 @@ +Interrupts + +This example application demonstrates the interrupt preemption and +tail-chaining capabilities of Cortex-M4 microprocessor and NVIC. Nested +interrupts are synthesized when the interrupts have the same priority, +increasing priorities, and decreasing priorities. With increasing +priorities, preemption will occur; in the other two cases tail-chaining +will occur. The currently pending interrupts and the currently executing +interrupt will be displayed on the display; GPIO pins B3, L1 and L0 (the +GPIO on jumper J27 on the left edge of the board) will be asserted upon +interrupt handler entry and de-asserted before interrupt handler exit so +that the off-to-on time can be observed with a scope or logic analyzer to +see the speed of tail-chaining (for the two cases where tail-chaining is +occurring). + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/interrupts/rvmdk/interrupts.axf b/boards/dk-tm4c129x/interrupts/rvmdk/interrupts.axf new file mode 100644 index 0000000..cbf8773 Binary files /dev/null and b/boards/dk-tm4c129x/interrupts/rvmdk/interrupts.axf differ diff --git a/boards/dk-tm4c129x/interrupts/rvmdk/interrupts.bin b/boards/dk-tm4c129x/interrupts/rvmdk/interrupts.bin new file mode 100644 index 0000000..f11b71e Binary files /dev/null and b/boards/dk-tm4c129x/interrupts/rvmdk/interrupts.bin differ diff --git a/boards/dk-tm4c129x/interrupts/startup_ccs.c b/boards/dk-tm4c129x/interrupts/startup_ccs.c new file mode 100644 index 0000000..a6d72a0 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/interrupts/startup_ewarm.c b/boards/dk-tm4c129x/interrupts/startup_ewarm.c new file mode 100644 index 0000000..19757a3 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/interrupts/startup_gcc.c b/boards/dk-tm4c129x/interrupts/startup_gcc.c new file mode 100644 index 0000000..4bd2865 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/interrupts/startup_rvmdk.S b/boards/dk-tm4c129x/interrupts/startup_rvmdk.S new file mode 100644 index 0000000..e9bd094 --- /dev/null +++ b/boards/dk-tm4c129x/interrupts/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN IntGPIOa + EXTERN IntGPIOb + EXTERN IntGPIOc + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntGPIOa ; GPIO Port A + DCD IntGPIOb ; GPIO Port B + DCD IntGPIOc ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/lang_demo/Makefile b/boards/dk-tm4c129x/lang_demo/Makefile new file mode 100644 index 0000000..ff02631 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/Makefile @@ -0,0 +1,102 @@ +#****************************************************************************** +# +# Makefile - Rules for building the lang_demo example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fonts/lang_demo +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/fonts/lang_demo +IPATH+=../../../../third_party + +# +# The default rule, which causes the lang_demo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/lang_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the lang_demo example. +# +${COMPILER}/lang_demo.axf: ${COMPILER}/fontcustom14pt.o +${COMPILER}/lang_demo.axf: ${COMPILER}/fontcustom20pt.o +${COMPILER}/lang_demo.axf: ${COMPILER}/fontcustomr14pt.o +${COMPILER}/lang_demo.axf: ${COMPILER}/fontcustomr20pt.o +${COMPILER}/lang_demo.axf: ${COMPILER}/frame.o +${COMPILER}/lang_demo.axf: ${COMPILER}/images.o +${COMPILER}/lang_demo.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/lang_demo.axf: ${COMPILER}/lang_demo.o +${COMPILER}/lang_demo.axf: ${COMPILER}/langremap.o +${COMPILER}/lang_demo.axf: ${COMPILER}/language.o +${COMPILER}/lang_demo.axf: ${COMPILER}/pinout.o +${COMPILER}/lang_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/lang_demo.axf: ${COMPILER}/touch.o +${COMPILER}/lang_demo.axf: ${COMPILER}/ustdlib.o +${COMPILER}/lang_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/lang_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/lang_demo.axf: lang_demo.ld +SCATTERgcc_lang_demo=lang_demo.ld +ENTRY_lang_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/lang_demo/ccs/.ccsimportspec b/boards/dk-tm4c129x/lang_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..9a5b64f --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/lang_demo/ccs/.ccsproject b/boards/dk-tm4c129x/lang_demo/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/lang_demo/ccs/.cproject b/boards/dk-tm4c129x/lang_demo/ccs/.cproject new file mode 100644 index 0000000..dd6d34b --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/ccs/.cproject @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/lang_demo/ccs/.project b/boards/dk-tm4c129x/lang_demo/ccs/.project new file mode 100644 index 0000000..1db2069 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/ccs/.project @@ -0,0 +1,110 @@ + + + lang_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + images.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/lang_demo/images.c + + + lang_demo.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/lang_demo/lang_demo.c + + + lang_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/lang_demo/lang_demo_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/lang_demo/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/fonts/lang_demo/fontcustom14pt.c + 1 + SW_ROOT/third_party/fonts/lang_demo/fontcustom14pt.c + + + third_party/fonts/lang_demo/fontcustom20pt.c + 1 + SW_ROOT/third_party/fonts/lang_demo/fontcustom20pt.c + + + third_party/fonts/lang_demo/fontcustomr14pt.c + 1 + SW_ROOT/third_party/fonts/lang_demo/fontcustomr14pt.c + + + third_party/fonts/lang_demo/fontcustomr20pt.c + 1 + SW_ROOT/third_party/fonts/lang_demo/fontcustomr20pt.c + + + third_party/fonts/lang_demo/langremap.c + 1 + SW_ROOT/third_party/fonts/lang_demo/langremap.c + + + third_party/fonts/lang_demo/language.c + 1 + SW_ROOT/third_party/fonts/lang_demo/language.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/lang_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/lang_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/lang_demo/ccs/Debug/lang_demo.bin b/boards/dk-tm4c129x/lang_demo/ccs/Debug/lang_demo.bin new file mode 100644 index 0000000..4a14a30 Binary files /dev/null and b/boards/dk-tm4c129x/lang_demo/ccs/Debug/lang_demo.bin differ diff --git a/boards/dk-tm4c129x/lang_demo/ccs/Debug/lang_demo.out b/boards/dk-tm4c129x/lang_demo/ccs/Debug/lang_demo.out new file mode 100644 index 0000000..27ea1a7 Binary files /dev/null and b/boards/dk-tm4c129x/lang_demo/ccs/Debug/lang_demo.out differ diff --git a/boards/dk-tm4c129x/lang_demo/ccs/macros.ini_initial b/boards/dk-tm4c129x/lang_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/lang_demo/ccs/target_config.ccxml b/boards/dk-tm4c129x/lang_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/lang_demo/ewarm/Exe/lang_demo.bin b/boards/dk-tm4c129x/lang_demo/ewarm/Exe/lang_demo.bin new file mode 100644 index 0000000..a69b8ce Binary files /dev/null and b/boards/dk-tm4c129x/lang_demo/ewarm/Exe/lang_demo.bin differ diff --git a/boards/dk-tm4c129x/lang_demo/ewarm/Exe/lang_demo.out b/boards/dk-tm4c129x/lang_demo/ewarm/Exe/lang_demo.out new file mode 100644 index 0000000..4e14def Binary files /dev/null and b/boards/dk-tm4c129x/lang_demo/ewarm/Exe/lang_demo.out differ diff --git a/boards/dk-tm4c129x/lang_demo/gcc/lang_demo.axf b/boards/dk-tm4c129x/lang_demo/gcc/lang_demo.axf new file mode 100644 index 0000000..3d088c6 Binary files /dev/null and b/boards/dk-tm4c129x/lang_demo/gcc/lang_demo.axf differ diff --git a/boards/dk-tm4c129x/lang_demo/gcc/lang_demo.bin b/boards/dk-tm4c129x/lang_demo/gcc/lang_demo.bin new file mode 100644 index 0000000..c62d26b Binary files /dev/null and b/boards/dk-tm4c129x/lang_demo/gcc/lang_demo.bin differ diff --git a/boards/dk-tm4c129x/lang_demo/images.c b/boards/dk-tm4c129x/lang_demo/images.c new file mode 100644 index 0000000..fcda2f5 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/images.c @@ -0,0 +1,170 @@ +//***************************************************************************** +// +// images.c - Data for the images used by the application. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// This is the image of the blue push button background. +// +//***************************************************************************** +const uint8_t g_pui8Blue50x50[] = +{ + IMAGE_FMT_4BPP_COMP, + 50, 0, + 50, 0, + + 15, + 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x52, 0x00, 0x00, + 0x63, 0x00, 0x00, + 0x6f, 0x00, 0x00, + 0x78, 0x00, 0x00, + 0x7c, 0x00, 0x00, + 0x7d, 0x00, 0x00, + 0x7f, 0x00, 0x00, + 0x81, 0x00, 0x00, + 0x85, 0x00, 0x00, + 0x89, 0x00, 0x00, + 0x8d, 0x00, 0x00, + 0x93, 0x00, 0x00, + 0x9b, 0x00, 0x00, + 0xa9, 0x00, 0x00, + + 0x81, 0x03, 0x13, 0x9e, 0xfe, 0xff, 0xff, 0xff, 0xe9, 0x8a, 0xd1, 0xfe, + 0xd7, 0x31, 0x07, 0x2e, 0x51, 0xee, 0x35, 0xee, 0xee, 0xe9, 0xd4, 0xa2, + 0x35, 0x1e, 0x41, 0x41, 0xfe, 0x3f, 0xee, 0xee, 0xdd, 0xcc, 0x91, 0x33, + 0x40, 0x03, 0x41, 0xee, 0xee, 0xed, 0xdd, 0xdd, 0xdd, 0xc1, 0xe9, 0xd1, + 0xdc, 0xcd, 0xcc, 0xaa, 0x20, 0x32, 0x41, 0x3f, 0x41, 0xed, 0xdc, 0xcc, + 0xcc, 0xcc, 0xe9, 0x81, 0xd1, 0xbb, 0xbb, 0xcc, 0xcb, 0xba, 0x52, 0x39, + 0x40, 0x03, 0x42, 0xcc, 0xba, 0xaa, 0x99, 0x99, 0x99, 0xc0, 0xe9, 0xd1, + 0xaa, 0xaa, 0xab, 0xa9, 0x95, 0x20, 0x04, 0x00, 0x00, 0x1f, 0xff, 0xfe, + 0x41, 0x99, 0x98, 0x1c, 0x88, 0x88, 0x88, 0xe9, 0xd1, 0x29, 0x99, 0x98, + 0x00, 0x41, 0x00, 0x00, 0xef, 0xff, 0xee, 0xdc, 0xba, 0x60, 0x99, 0x4f, + 0x01, 0x89, 0x99, 0x99, 0x98, 0x53, 0x01, 0x00, 0x02, 0xff, 0xfe, 0xed, + 0xcb, 0xa9, 0x47, 0x80, 0x35, 0x98, 0x64, 0x10, 0x0d, 0xef, 0xee, 0xdc, + 0x30, 0xba, 0x98, 0x3f, 0x04, 0x99, 0x88, 0x54, 0x30, 0x06, 0x1e, 0xfe, + 0xed, 0xcb, 0xa9, 0x47, 0x06, 0x86, 0x01, 0x55, 0x41, 0x3e, 0xfe, 0xed, + 0xba, 0x98, 0x3f, 0x81, 0x3f, 0x65, 0x41, 0x5e, 0xee, 0xdc, 0xb9, 0x47, + 0x80, 0x07, 0x88, 0x65, 0x42, 0xbd, 0xee, 0xdb, 0xa9, 0xe1, 0x3f, 0x3f, + 0x39, 0xcc, 0xed, 0xcb, 0x98, 0x3f, 0x81, 0x3f, 0x88, 0x65, 0x43, 0xcc, + 0xdd, 0xca, 0x3f, 0xc3, 0x3f, 0x39, 0x42, 0xcb, 0xdc, 0xba, 0x3f, 0x3f, + 0xb0, 0x3c, 0xb9, 0x47, 0x07, 0x88, 0x88, 0x75, 0x32, 0x18, 0xcb, 0xdc, + 0xa9, 0x3f, 0x07, 0x88, 0x88, 0x65, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0xf8, 0x3f, 0x3f, 0x3f, 0x07, 0x01, 0x64, 0x32, 0xcb, + 0x73, 0xcc, 0x3f, 0x3f, 0x3b, 0x9b, 0xcb, 0x3f, 0x07, 0x00, 0x88, 0x88, + 0x87, 0x54, 0x32, 0x4a, 0xba, 0x99, 0x60, 0x98, 0x37, 0x07, 0x86, 0x54, + 0x32, 0x2a, 0xaa, 0x60, 0xa9, 0x47, 0x07, 0x88, 0x75, 0x43, 0x21, 0x19, + 0x30, 0x8a, 0x99, 0x3f, 0x07, 0x88, 0x65, 0x43, 0x21, 0x0c, 0x04, 0x49, + 0x98, 0x98, 0x37, 0x06, 0x86, 0x54, 0x06, 0x33, 0x20, 0x02, 0x46, 0x68, + 0x47, 0x07, 0x76, 0x01, 0x54, 0x32, 0x10, 0x00, 0x44, 0x66, 0x66, 0x2f, + 0x80, 0x05, 0x87, 0x65, 0x43, 0x32, 0x00, 0x00, 0x13, 0x18, 0x45, 0x55, + 0x66, 0x3f, 0x04, 0x66, 0x54, 0x33, 0x00, 0x21, 0x00, 0x00, 0x01, 0x34, + 0x45, 0x56, 0x66, 0x60, 0x78, 0x2f, 0x01, 0x76, 0x54, 0x43, 0x32, 0x10, + 0x01, 0x00, 0x00, 0x00, 0x12, 0x44, 0x45, 0x55, 0x37, 0x82, 0x01, 0x66, + 0x55, 0x44, 0x33, 0x21, 0x41, 0x00, 0x00, 0x01, 0x23, 0x44, 0x44, 0x55, + 0x56, 0x66, 0x66, 0x60, 0x66, 0xe9, 0xd1, 0x65, 0x54, 0x44, 0x33, 0x22, + 0x40, 0x10, 0x3a, 0x00, 0x12, 0x33, 0x34, 0x44, 0x44, 0x61, 0x44, 0xe9, + 0xd4, 0x43, 0x33, 0x22, 0x21, 0x43, 0x86, 0x31, 0x23, 0x33, 0x33, 0x33, + 0xe9, 0xd4, 0x32, 0x80, 0x47, 0x00, 0x00, 0x01, 0x12, 0x22, 0x22, 0x22, + 0xc8, 0xe9, 0xd3, 0x21, 0x10, 0x43, +}; + +//***************************************************************************** +// +// This is the image of the blue push button background, used when the buttons +// are pressed. +// +//***************************************************************************** +const uint8_t g_pui8Blue50x50Press[] = +{ + IMAGE_FMT_4BPP_COMP, + 50, 0, + 50, 0, + + 15, + 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, + 0x52, 0x00, 0x00, + 0x63, 0x00, 0x00, + 0x6f, 0x00, 0x00, + 0x78, 0x00, 0x00, + 0x7c, 0x00, 0x00, + 0x7d, 0x00, 0x00, + 0x7f, 0x00, 0x00, + 0x81, 0x00, 0x00, + 0x85, 0x00, 0x00, + 0x89, 0x00, 0x00, + 0x8d, 0x00, 0x00, + 0x93, 0x00, 0x00, + 0x9b, 0x00, 0x00, + 0xa9, 0x00, 0x00, + + 0x83, 0x03, 0x01, 0x12, 0x22, 0x22, 0x22, 0xe9, 0xd3, 0x20, 0x21, 0x10, + 0x07, 0x12, 0x22, 0x23, 0x33, 0x33, 0x64, 0x33, 0xe9, 0xd4, 0x32, 0x21, + 0x47, 0x33, 0x34, 0x19, 0x44, 0x44, 0x44, 0xe9, 0xd4, 0x43, 0x33, 0x34, + 0x00, 0x01, 0x22, 0x33, 0x44, 0x45, 0x56, 0x66, 0x66, 0x60, 0x66, 0xe9, + 0xd1, 0x65, 0x55, 0x44, 0x44, 0x32, 0x40, 0x10, 0x32, 0x12, 0x33, 0x44, + 0x55, 0x66, 0x88, 0x30, 0x88, 0x88, 0xe9, 0xd2, 0x87, 0x66, 0x55, 0x54, + 0x20, 0x44, 0x21, 0x39, 0x01, 0x23, 0x34, 0x45, 0x67, 0xc0, 0x47, 0x33, + 0x65, 0x54, 0x43, 0x10, 0x00, 0x00, 0x0c, 0x12, 0x33, 0x45, 0x66, 0x47, + 0x04, 0x66, 0x55, 0x00, 0x54, 0x31, 0x00, 0x00, 0x23, 0x34, 0x56, 0x78, + 0xc0, 0x3f, 0x04, 0x86, 0x66, 0x66, 0x44, 0x00, 0x01, 0x18, 0x23, 0x45, + 0x67, 0x47, 0x2f, 0x86, 0x64, 0x20, 0x0c, 0x02, 0x33, 0x45, 0x68, 0x3f, + 0x06, 0x89, 0x89, 0x06, 0x94, 0x40, 0x12, 0x34, 0x56, 0x47, 0x07, 0x88, + 0x03, 0x99, 0xa8, 0x91, 0x12, 0x34, 0x57, 0x3f, 0x07, 0x01, 0x88, 0x9a, + 0xaa, 0xa2, 0x23, 0x45, 0x68, 0x3f, 0x80, 0x07, 0x89, 0x99, 0xab, 0xa4, + 0x23, 0x45, 0x78, 0xc0, 0x3f, 0x07, 0x88, 0x9a, 0xbc, 0xb9, 0x23, 0x46, + 0xe7, 0x47, 0x3f, 0x39, 0xcc, 0xbc, 0x3f, 0x3f, 0x3b, 0x0f, 0xcd, 0xbc, + 0x23, 0x56, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0xb0, 0x39, 0x57, 0x3f, 0x07, 0x88, 0x88, 0x9b, 0xcd, + 0x18, 0xbc, 0x24, 0x56, 0x3f, 0x07, 0x88, 0x89, 0xab, 0xe1, 0x3f, 0x3f, + 0x3c, 0xac, 0xdd, 0xcc, 0x34, 0x3f, 0xc3, 0x3f, 0x39, 0xbc, 0xde, 0xcc, + 0x24, 0x3f, 0x07, 0x03, 0x88, 0x88, 0x9a, 0xbd, 0xee, 0xdb, 0x3f, 0x07, + 0x80, 0x01, 0x9b, 0xcd, 0xee, 0xe5, 0x14, 0x56, 0x68, 0xc0, 0x37, 0x06, + 0x89, 0xab, 0xde, 0xef, 0xe3, 0x14, 0x60, 0x55, 0x3f, 0x07, 0x9a, 0xbc, + 0xde, 0xef, 0xe1, 0x0c, 0x03, 0x45, 0x88, 0x99, 0x37, 0x04, 0x89, 0xab, + 0x00, 0xcd, 0xee, 0xfe, 0xd0, 0x01, 0x46, 0x89, 0x99, 0x60, 0x98, 0x37, + 0x03, 0x9a, 0xbc, 0xde, 0xef, 0xff, 0x06, 0x20, 0x00, 0x35, 0x89, 0x99, + 0x37, 0x03, 0x99, 0x00, 0xab, 0xcd, 0xee, 0xff, 0xfe, 0x00, 0x00, 0x14, + 0x04, 0x89, 0x99, 0xaa, 0x99, 0x99, 0x37, 0x89, 0x99, 0x00, 0xab, 0xcc, + 0xde, 0xef, 0xff, 0xf1, 0x00, 0x00, 0x05, 0x02, 0x59, 0x9a, 0xba, 0xaa, + 0x29, 0x99, 0xe9, 0xa0, 0xd1, 0xaa, 0x41, 0xee, 0xff, 0xff, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x25, 0xab, 0xbc, 0xcc, 0xbb, 0xbb, 0x1a, 0xcc, 0xcc, + 0xcc, 0xe9, 0xd1, 0xcd, 0x42, 0xf3, 0x80, 0x41, 0x00, 0x02, 0xaa, 0xcc, + 0xdc, 0xcd, 0xdd, 0x32, 0xdd, 0xdd, 0xe9, 0xd1, 0xde, 0xee, 0x41, 0xff, + 0x40, 0x30, 0x3a, 0x00, 0x19, 0xcc, 0xdd, 0xee, 0xee, 0x6a, 0xee, 0xe9, + 0xd3, 0xef, 0x41, 0xe1, 0x43, 0x00, 0x3a, 0x00, 0x2a, 0x47, 0x01, 0x41, + 0xe2, 0x45, 0x00, 0x0e, 0x00, 0x13, 0x7d, 0xef, 0x81, 0x69, 0x51, 0xef, + 0x20, 0xe9, 0x31, 0x43, +}; diff --git a/boards/dk-tm4c129x/lang_demo/images.h b/boards/dk-tm4c129x/lang_demo/images.h new file mode 100644 index 0000000..06b261c --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/images.h @@ -0,0 +1,36 @@ +//***************************************************************************** +// +// images.h - Prototypes for the images used by the application. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __IMAGES_H__ +#define __IMAGES_H__ + +//***************************************************************************** +// +// Prototypes for the image arrays. +// +//***************************************************************************** +extern const uint8_t g_pui8Blue50x50[]; +extern const uint8_t g_pui8Blue50x50Press[]; + +#endif // __IMAGES_H__ diff --git a/boards/dk-tm4c129x/lang_demo/lang_demo.c b/boards/dk-tm4c129x/lang_demo/lang_demo.c new file mode 100644 index 0000000..26ce3b6 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/lang_demo.c @@ -0,0 +1,852 @@ +//***************************************************************************** +// +// lang_demo.c - Demonstration of the TivaWare Graphics Library's string +// table support. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/container.h" +#include "grlib/pushbutton.h" +#include "grlib/radiobutton.h" +#include "utils/ustdlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/touch.h" +#include "drivers/pinout.h" +#include "images.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Graphics Library String Table Demonstration (lang_demo)

      +//! +//! This application provides a demonstration of the capabilities of the +//! TivaWare Graphics Library's string table functions. Two panels show +//! different implementations of features of the string table functions. +//! For each panel, the bottom provides a forward and back button +//! (when appropriate). +//! +//! The first panel provides a large string with introductory text and basic +//! instructions for operation of the application. +//! +//! The second panel shows the available languages and allows them to be +//! switched between English, German, Spanish and Italian. +//! +//! The string table and custom fonts used by this application can be found +//! under /third_party/fonts/lang_demo. The original strings that the +//! application intends displaying are found in the language.csv file (encoded +//! in UTF8 format to allow accented characters and Asian language ideographs +//! to be included. The mkstringtable tool is used to generate two versions +//! of the string table, one which remains encoded in UTF8 format and the other +//! which has been remapped to a custom codepage allowing the table to be +//! reduced in size compared to the original UTF8 text. The tool also produces +//! character map files listing each character used in the string table. These +//! are then provided as input to the ftrasterize tool which generates two +//! custom fonts for the application, one indexed using Unicode and a smaller +//! one indexed using the custom codepage generated for this string table. +//! +//! The command line parameters required for mkstringtable and ftrasterize +//! can be found in the makefile in third_party/fonts/lang_demo. +//! +//! By default, the application builds to use the custom codepage version of +//! the string table and its matching custom font. To build using the UTF8 +//! string table and Unicode-indexed custom font, ensure that the definition of +//! \b USE_REMAPPED_STRINGS at the top of the lang_demo.c source file is +//! commented out. +//! +//***************************************************************************** + +//***************************************************************************** +// +// Comment the following line to use a version of the string table and custom +// font that does not use codepage remapping. In this version, the font is +// somewhat larger and character lookup will be slower but it has the advantage +// that the strings you retrieve from the string table are encoded exactly +// as they were in the original CSV file and are generally readable in your +// debugger (since they use a standard codepage like ISO8859-1 or UTF8). +// +//***************************************************************************** +#define USE_REMAPPED_STRINGS + +#ifdef USE_REMAPPED_STRINGS +#include "langremap.h" +extern const unsigned char g_pui8Customr14pt[]; +extern const unsigned char g_pui8Customr20pt[]; + +#define SPACE_CHAR MAP8000_CHAR_000020 +#define FONT_20PT (const tFont *)g_pui8Customr20pt +#define FONT_14PT (const tFont *)g_pui8Customr14pt +#define STRING_TABLE g_pui8Tablelangremap +#define GRLIB_INIT_STRUCT g_sGrLibDefaultlangremap + +#else + +#include "language.h" + +extern const unsigned char g_pui8Custom14pt[]; +extern const unsigned char g_pui8Custom20pt[]; + +#define SPACE_CHAR 0x20 +#define FONT_20PT (const tFont *)g_pui8Custom20pt +#define FONT_14PT (const tFont *)g_pui8Custom14pt + +#define STRING_TABLE g_pui8Tablelanguage +#define GRLIB_INIT_STRUCT g_sGrLibDefaultlanguage + +#endif + +//***************************************************************************** +// +// The names for each of the panels, which is displayed at the bottom of the +// screen. +// +//***************************************************************************** +static const uint32_t g_ui32PanelNames[3] = +{ + STR_INTRO, + STR_CONFIG, + STR_UPDATE +}; + +//***************************************************************************** +// +// This string holds the title of the group of languages. The size is fixed +// by LANGUAGE_MAX_SIZE since the names of the languages in this application +// are not larger than LANGUAGE_MAX_SIZE bytes. +// +//***************************************************************************** +#define LANGUAGE_MAX_SIZE 16 +char g_pcLanguage[LANGUAGE_MAX_SIZE]; + +//***************************************************************************** +// +// This is a generic buffer that is used to retrieve strings from the string +// table. This forces its size to be at least as big as the largest string +// in the string table which is defined by the SCOMP_MAX_STRLEN value. +// +//***************************************************************************** +char g_pcBuffer[SCOMP_MAX_STRLEN]; + +//***************************************************************************** +// +// This string holds the title of each "panel" in the application. The size is +// fixed by TITLE_MAX_SIZE since the names of the panels in this application +// are not larger than TITLE_MAX_SIZE bytes. +// +//***************************************************************************** +#define TITLE_MAX_SIZE 20 +char g_pcTitle[TITLE_MAX_SIZE]; + +//***************************************************************************** +// +// This table holds the array of languages supported. +// +//***************************************************************************** +typedef struct +{ + uint16_t ui16Language; + bool bBreakOnSpace; +} +tLanguageParams; + +const tLanguageParams g_psLanguageTable[] = +{ + { GrLangEnUS, true }, + { GrLangDe, true }, + { GrLangEsSP, true }, + { GrLangIt, true }, + { GrLangZhPRC, false }, + { GrLangKo, true }, + { GrLangJp, false } +}; + +#define NUM_LANGUAGES (sizeof(g_LanguageTable) / sizeof(tLanguageParams)) + +//***************************************************************************** +// +// The index of the current language in the g_psLanguageTable array. +// +//***************************************************************************** +uint32_t g_ui32LangIdx; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Forward declarations for the globals required to define the widgets at +// compile-time. +// +//***************************************************************************** +void OnPrevious(tWidget *psWidget); +void OnNext(tWidget *psWidget); +void OnIntroPaint(tWidget *psWidget, tContext *psContext); +void OnRadioChange(tWidget *psWidget, uint32_t bSelected); +extern tCanvasWidget g_psPanels[]; + +//***************************************************************************** +// +// The first panel, which contains introductory text explaining the +// application. +// +//***************************************************************************** +Canvas(g_sIntroduction, g_psPanels, 0, 0, &g_sKentec320x240x16_SSD2119, 8, 26, + 300, 154, CANVAS_STYLE_APP_DRAWN, 0, 0, 0, 0, 0, 0, OnIntroPaint); + +//***************************************************************************** +// +// Storage for language name strings. Note that we could hardcode these into +// the relevant widget initialization macros but since we may be using a +// custom font and remapped codepage, keeping the strings in the string table +// and loading them when the app starts is likely to create less confusion and +// prevents the risk of seeing garbled output if you accidentally use ASCII or +// ISO8859-1 text strings with the custom font. +// +//***************************************************************************** +#define MAX_LANGUAGE_NAME_LEN 10 +char g_pcEnglish[MAX_LANGUAGE_NAME_LEN]; +char g_pcDeutsch[MAX_LANGUAGE_NAME_LEN]; +char g_pcEspanol[MAX_LANGUAGE_NAME_LEN]; +char g_pcItaliano[MAX_LANGUAGE_NAME_LEN]; +char g_pcChinese[MAX_LANGUAGE_NAME_LEN]; +char g_pcKorean[MAX_LANGUAGE_NAME_LEN]; +char g_pcJapanese[MAX_LANGUAGE_NAME_LEN]; + +//***************************************************************************** +// +// The language selection panel, which contains a selection of radio buttons +// for each language. +// +//***************************************************************************** +tContainerWidget g_psRadioContainers[]; + +tRadioButtonWidget g_psRadioButtons1[] = +{ + RadioButtonStruct(g_psRadioContainers, g_psRadioButtons1 + 1, 0, + &g_sKentec320x240x16_SSD2119, 18, 54, 120, 25, + RB_STYLE_TEXT | RB_STYLE_SELECTED, 16, 0, ClrSilver, + ClrSilver, FONT_20PT, g_pcEnglish, 0, OnRadioChange), + RadioButtonStruct(g_psRadioContainers, g_psRadioButtons1 + 2, 0, + &g_sKentec320x240x16_SSD2119, 18, 82, 120, 25, + RB_STYLE_TEXT, 16, 0, ClrSilver, ClrSilver, FONT_20PT, + g_pcDeutsch, 0, OnRadioChange), + RadioButtonStruct(g_psRadioContainers, g_psRadioButtons1 + 3, 0, + &g_sKentec320x240x16_SSD2119, 180, 54, 120, 25, + RB_STYLE_TEXT, 16, 0, ClrSilver, ClrSilver, FONT_20PT, + g_pcEspanol, 0, OnRadioChange), + RadioButtonStruct(g_psRadioContainers, g_psRadioButtons1 + 4, 0, + &g_sKentec320x240x16_SSD2119, 180, 82, 120, 25, + RB_STYLE_TEXT, 16, 0, ClrSilver, ClrSilver, FONT_20PT, + g_pcItaliano, 0, OnRadioChange), + RadioButtonStruct(g_psRadioContainers, g_psRadioButtons1 + 5, 0, + &g_sKentec320x240x16_SSD2119, 18, 110, 120, 25, + RB_STYLE_TEXT, 16, 0, ClrSilver, ClrSilver, FONT_20PT, + g_pcChinese, 0, OnRadioChange), + RadioButtonStruct(g_psRadioContainers, g_psRadioButtons1 + 6, 0, + &g_sKentec320x240x16_SSD2119, 180, 110, 120, 25, + RB_STYLE_TEXT, 16, 0, ClrSilver, ClrSilver, FONT_20PT, + g_pcKorean, 0, OnRadioChange), + RadioButtonStruct(g_psRadioContainers, 0, 0, + &g_sKentec320x240x16_SSD2119, 18, 138, 120, 25, + RB_STYLE_TEXT, 16, 0, ClrSilver, ClrSilver, FONT_20PT, + g_pcJapanese, 0, OnRadioChange), +}; + +#define NUM_RADIO1_BUTTONS (sizeof(g_psRadioButtons1) / \ + sizeof(g_psRadioButtons1[0])) + +tContainerWidget g_psRadioContainers[] = +{ + ContainerStruct(g_psPanels + 1, 0, g_psRadioButtons1, + &g_sKentec320x240x16_SSD2119, 8, 30, 300, 140, + CTR_STYLE_OUTLINE | CTR_STYLE_TEXT, 0, ClrGray, ClrSilver, + FONT_20PT, g_pcLanguage), +}; + +//***************************************************************************** +// +// An array of canvas widgets, one per panel. Each canvas is filled with +// black, overwriting the contents of the previous panel. +// +//***************************************************************************** +tCanvasWidget g_psPanels[] = +{ + CanvasStruct(0, 0, &g_sIntroduction, &g_sKentec320x240x16_SSD2119, 8, 22, + 300, 158, CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0), + CanvasStruct(0, 0, g_psRadioContainers, &g_sKentec320x240x16_SSD2119, 8, + 22, 300, 158, CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0), +}; + +//***************************************************************************** +// +// The number of panels. +// +//***************************************************************************** +#define NUM_PANELS (sizeof(g_psPanels) / sizeof(g_psPanels[0])) + +//***************************************************************************** +// +// The buttons and text across the bottom of the screen. +// +//***************************************************************************** +char g_pcPlus[2]; +char g_pcMinus[2]; + +RectangularButton(g_sPrevious, 0, 0, 0, &g_sKentec320x240x16_SSD2119, 8, 180, + 50, 50, PB_STYLE_FILL, ClrBlack, ClrBlack, 0, ClrSilver, + FONT_20PT, g_pcMinus, g_pui8Blue50x50, g_pui8Blue50x50Press, + 0, 0, OnPrevious); +Canvas(g_sTitle, 0, 0, 0, &g_sKentec320x240x16_SSD2119, 58, 180, 200, 50, + CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | CANVAS_STYLE_FILL, 0, 0, + ClrSilver, FONT_20PT, 0, 0, 0); +RectangularButton(g_sNext, 0, 0, 0, &g_sKentec320x240x16_SSD2119, 260, 180, + 50, 50, PB_STYLE_IMG | PB_STYLE_TEXT, ClrBlack, ClrBlack, 0, + ClrSilver, FONT_20PT, g_pcPlus, g_pui8Blue50x50, + g_pui8Blue50x50Press, 0, 0, OnNext); + +//***************************************************************************** +// +// The panel that is currently being displayed. +// +//***************************************************************************** +uint32_t g_ui32Panel; + +//***************************************************************************** +// +// Handles presses of the previous panel button. +// +//***************************************************************************** +void +OnPrevious(tWidget *psWidget) +{ + // + // There is nothing to be done if the first panel is already being + // displayed. + // + if(g_ui32Panel == 0) + { + return; + } + + // + // Remove the current panel. + // + WidgetRemove((tWidget *)(g_psPanels + g_ui32Panel)); + + // + // Decrement the panel index. + // + g_ui32Panel--; + + // + // Add and draw the new panel. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)(g_psPanels + g_ui32Panel)); + WidgetPaint((tWidget *)(g_psPanels + g_ui32Panel)); + + // + // Set the title of this panel. + // + GrStringGet(g_ui32PanelNames[g_ui32Panel], g_pcTitle, TITLE_MAX_SIZE); + WidgetPaint((tWidget *)&g_sTitle); + + // + // See if this is the first panel. + // + if(g_ui32Panel == 0) + { + // + // Clear the previous button from the display since the first panel is + // being displayed. + // + PushButtonImageOff(&g_sPrevious); + PushButtonTextOff(&g_sPrevious); + PushButtonFillOn(&g_sPrevious); + WidgetPaint((tWidget *)&g_sPrevious); + } + + // + // See if the previous panel was the last panel. + // + if(g_ui32Panel == (NUM_PANELS - 2)) + { + // + // Display the next button. + // + PushButtonImageOn(&g_sNext); + PushButtonTextOn(&g_sNext); + PushButtonFillOff(&g_sNext); + WidgetPaint((tWidget *)&g_sNext); + } +} + +//***************************************************************************** +// +// Handles presses of the next panel button. +// +//***************************************************************************** +void +OnNext(tWidget *psWidget) +{ + // + // There is nothing to be done if the last panel is already being + // displayed. + // + if(g_ui32Panel == (NUM_PANELS - 1)) + { + return; + } + + // + // Remove the current panel. + // + WidgetRemove((tWidget *)(g_psPanels + g_ui32Panel)); + + // + // Increment the panel index. + // + g_ui32Panel++; + + // + // Add and draw the new panel. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)(g_psPanels + g_ui32Panel)); + WidgetPaint((tWidget *)(g_psPanels + g_ui32Panel)); + + // + // Set the title of this panel. + // + GrStringGet(g_ui32PanelNames[g_ui32Panel], g_pcTitle, TITLE_MAX_SIZE); + WidgetPaint((tWidget *)&g_sTitle); + + // + // See if the previous panel was the first panel. + // + if(g_ui32Panel == 1) + { + // + // Display the previous button. + // + PushButtonImageOn(&g_sPrevious); + PushButtonTextOn(&g_sPrevious); + PushButtonFillOff(&g_sPrevious); + WidgetPaint((tWidget *)&g_sPrevious); + } + + // + // See if this is the last panel. + // + if(g_ui32Panel == (NUM_PANELS - 1)) + { + // + // Clear the next button from the display since the last panel is being + // displayed. + // + PushButtonImageOff(&g_sNext); + PushButtonTextOff(&g_sNext); + PushButtonFillOn(&g_sNext); + WidgetPaint((tWidget *)&g_sNext); + } +} + +//***************************************************************************** +// +// Switch out all of the dynamic strings. +// +//***************************************************************************** +void +ChangeLanguage(uint16_t ui16Language) +{ + // + // Change the language. + // + GrStringLanguageSet(ui16Language); + + // + // Update the Language string. + // + GrStringGet(STR_LANGUAGE, g_pcLanguage, LANGUAGE_MAX_SIZE); + + // + // Update the title string. + // + GrStringGet(g_ui32PanelNames[g_ui32Panel], g_pcTitle, TITLE_MAX_SIZE); +} + +//***************************************************************************** +// +// Handles wrapping a string within an area. +// +// \param psContext is the context of the area to update. +// \param pcString is the string to print out. +// \param i32LineHeight is the height of a character in the currrent font. +// \param i32X is the x position to start printing this string. +// \param i32Y is the y position to start printing this string. +// \param bSplitOnSpace is true if strings in the current language must be +// split only on space characters or false if they may be split between any +// two characters. +// +// \return Returns the number of lines that were printed due to this string. +// +//***************************************************************************** +uint32_t +DrawStringWrapped(tContext *psContext, char *pcString, + int32_t i32LineHeight, int32_t i32X, int32_t i32Y, + bool bSplitOnSpace) +{ + uint32_t ui32Width, ui32CharWidth, ui32StrWidth, ui32Char; + uint32_t ui32Lines, ui32Skip; + char *pcStart, *pcEnd; + char *pcLastSpace; + + ui32Lines = 0; + + // + // Get the number of pixels we have to fit the string into across the + // screen. + // + ui32Width = GrContextDpyWidthGet(psContext) - 16 - i32X; + + // + // Get a pointer to the terminating zero. + // + pcEnd = pcString; + while(*pcEnd) + { + pcEnd++; + } + + // + // The first substring we draw will start at the beginning of the string. + // + pcStart = pcString; + pcLastSpace = pcString; + ui32StrWidth = 0; + + // + // Keep processing until we have no more characters to display. + // + do + { + // + // Get the next character in the string. + // + ui32Char = GrStringNextCharGet(psContext, pcString, + (pcEnd - pcString), &ui32Skip); + + // + // Did we reach the end of the string? + // + if(ui32Char) + { + // + // No - how wide is this character? + // + ui32CharWidth = GrStringWidthGet(psContext, pcString, ui32Skip); + + // + // Have we run off the edge of the display? + // + if((ui32StrWidth + ui32CharWidth) > ui32Width) + { + // + // If we are splitting on spaces, rewind the string pointer to + // the byte after the last space. + // + if(bSplitOnSpace) + { + pcString = pcLastSpace; + } + + // + // Yes - draw the substring. + // + GrStringDraw(psContext, pcStart, (pcString - pcStart), + i32X, i32Y, 0); + + // + // Increment the line count and move the y position down by the + // current font's line height. + // + ui32Lines++; + i32Y += i32LineHeight; + ui32StrWidth = 0; + + // + // The next string we draw will start at the current position. + // + pcStart = pcString; + } + else + { + // + // No - update the width and move on to the next character. + // + ui32StrWidth += ui32CharWidth; + pcString += ui32Skip; + + // + // If this is a space, remember where we are. + // + if(ui32Char == SPACE_CHAR) + { + pcLastSpace = pcString; + } + } + } + else + { + // + // Do we have any remaining chunk of string to draw? + // + if(pcStart != pcString) + { + // + // Yes - draw the last section of string. + // + GrStringDraw(psContext, pcStart, -1, i32X, i32Y, 0); + ui32Lines++; + } + } + } while(ui32Char); + + return(ui32Lines); +} + +//***************************************************************************** +// +// Handles paint requests for the introduction canvas widget. +// +//***************************************************************************** +void +OnIntroPaint(tWidget *psWidget, tContext *psContext) +{ + int32_t i32LineHeight, i32Offset; + uint32_t ui32Lines; + + i32LineHeight = GrFontHeightGet(FONT_14PT); + i32Offset = 28; + + // + // Display the introduction text in the canvas. + // + GrContextFontSet(psContext, FONT_14PT); + GrContextForegroundSet(psContext, ClrSilver); + + // + // Write the first paragraph of the introduction page. + // + GrStringGet(STR_INTRO_1, g_pcBuffer, SCOMP_MAX_STRLEN); + ui32Lines = DrawStringWrapped(psContext, g_pcBuffer, i32LineHeight, 8, + i32Offset, + g_psLanguageTable[g_ui32LangIdx].bBreakOnSpace); + // + // Move down by 1/4 of a line between paragraphs. + // + i32Offset += i32LineHeight/4; + + // + // Write the second paragraph of the introduction page. + // + GrStringGet(STR_INTRO_2, g_pcBuffer, SCOMP_MAX_STRLEN); + ui32Lines += DrawStringWrapped(psContext, g_pcBuffer, i32LineHeight, 8, + i32Offset + (ui32Lines * i32LineHeight), + g_psLanguageTable[g_ui32LangIdx].bBreakOnSpace); + // + // Move down by 1/4 of a line between paragraphs. + // + i32Offset += i32LineHeight/4; + + // + // Write the third paragraph of the introduction page. + // + GrStringGet(STR_INTRO_3, g_pcBuffer, SCOMP_MAX_STRLEN); + DrawStringWrapped(psContext, g_pcBuffer, i32LineHeight, 8, i32Offset + + (ui32Lines * i32LineHeight), + g_psLanguageTable[g_ui32LangIdx].bBreakOnSpace ); +} + +//***************************************************************************** +// +// Handles change notifications for the radio button widgets. +// +//***************************************************************************** +void +OnRadioChange(tWidget *psWidget, uint32_t bSelected) +{ + // + // Find the index of this radio button in the first group. + // + for(g_ui32LangIdx = 0; g_ui32LangIdx < NUM_RADIO1_BUTTONS; g_ui32LangIdx++) + { + if(psWidget == (tWidget *)(g_psRadioButtons1 + g_ui32LangIdx)) + { + break; + } + } + + // + // Change any dynamic language strings. + // + ChangeLanguage(g_psLanguageTable[g_ui32LangIdx].ui16Language); + + // + // Issue the initial paint request to the widgets. + // + WidgetPaint(WIDGET_ROOT); +} + +//***************************************************************************** +// +// A simple demonstration of the features of the TivaWare Graphics Library. +// +//***************************************************************************** +int +main(void) +{ + tContext sContext; + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Set graphics library text rendering defaults. + // + GrLibInit(&GRLIB_INIT_STRUCT); + + // + // Set the string table and the default language. + // + GrStringTableSet(STRING_TABLE); + + // + // Set the default language. + // + ChangeLanguage(GrLangEnUS); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "lang-demo"); + + // + // Load the static strings from the string table. These strings are + // independent of the language in use but we store them in the string + // table nonetheless since (a) we may be using codepage remapping in + // which case it would be difficult to hardcode them into the app source + // anyway (ASCII or ISO8859-1 text would not render properly with the + // remapped custom font) and (b) even if we're not using codepage remapping, + // we may have generated a custom font from the string table output and + // we want to make sure that all glyphs required by the application are + // present in that font. If we hardcode some text in the application + // source and don't put it in the string table, we run the risk of having + // characters missing in the font. + // + GrStringGet(STR_ENGLISH, g_pcEnglish, MAX_LANGUAGE_NAME_LEN); + GrStringGet(STR_DEUTSCH, g_pcDeutsch, MAX_LANGUAGE_NAME_LEN); + GrStringGet(STR_ESPANOL, g_pcEspanol, MAX_LANGUAGE_NAME_LEN); + GrStringGet(STR_ITALIANO, g_pcItaliano, MAX_LANGUAGE_NAME_LEN); + GrStringGet(STR_CHINESE, g_pcChinese, MAX_LANGUAGE_NAME_LEN); + GrStringGet(STR_KOREAN, g_pcKorean, MAX_LANGUAGE_NAME_LEN); + GrStringGet(STR_JAPANESE, g_pcJapanese, MAX_LANGUAGE_NAME_LEN); + GrStringGet(STR_PLUS, g_pcPlus, 2); + GrStringGet(STR_MINUS, g_pcMinus, 2); + + // + // Initialize the touch screen driver and have it route its messages to the + // widget tree. + // + TouchScreenInit(ui32SysClock); + TouchScreenCallbackSet(WidgetPointerMessage); + + // + // Add the title block and the previous and next buttons to the widget + // tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sPrevious); + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sTitle); + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sNext); + + // + // Add the first panel to the widget tree. + // + g_ui32Panel = 0; + WidgetAdd(WIDGET_ROOT, (tWidget *)g_psPanels); + + // + // Set the string for the title. + // + CanvasTextSet(&g_sTitle, g_pcTitle); + + // + // Issue the initial paint request to the widgets. + // + WidgetPaint(WIDGET_ROOT); + + // + // Loop forever, processing widget messages. + // + while(1) + { + // + // Process any messages in the widget message queue. + // + WidgetMessageQueueProcess(); + } + +} diff --git a/boards/dk-tm4c129x/lang_demo/lang_demo.ewd b/boards/dk-tm4c129x/lang_demo/lang_demo.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/lang_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/lang_demo/lang_demo.ewp b/boards/dk-tm4c129x/lang_demo/lang_demo.ewp new file mode 100644 index 0000000..0311110 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/lang_demo.ewp @@ -0,0 +1,829 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\..\..\..\third_party\fonts\lang_demo\fontcustom14pt.c + + + $PROJ_DIR$\..\..\..\..\third_party\fonts\lang_demo\fontcustom20pt.c + + + $PROJ_DIR$\..\..\..\..\third_party\fonts\lang_demo\fontcustomr14pt.c + + + $PROJ_DIR$\..\..\..\..\third_party\fonts\lang_demo\fontcustomr20pt.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\images.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\lang_demo.c + + + $PROJ_DIR$\..\..\..\..\third_party\fonts\lang_demo\langremap.c + + + $PROJ_DIR$\..\..\..\..\third_party\fonts\lang_demo\language.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/lang_demo/lang_demo.icf b/boards/dk-tm4c129x/lang_demo/lang_demo.icf new file mode 100644 index 0000000..19a4a18 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/lang_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// lang_demo.icf - Linker configuration file for lang_demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/lang_demo/lang_demo.ld b/boards/dk-tm4c129x/lang_demo/lang_demo.ld new file mode 100644 index 0000000..ab49292 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/lang_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * lang_demo.ld - Linker configuration file for lang_demo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/lang_demo/lang_demo.sct b/boards/dk-tm4c129x/lang_demo/lang_demo.sct new file mode 100644 index 0000000..0a2e30e --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/lang_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; lang_demo.sct - Linker configuration file for lang_demo. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/lang_demo/lang_demo.uvopt b/boards/dk-tm4c129x/lang_demo/lang_demo.uvopt new file mode 100644 index 0000000..ccf05ff --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/lang_demo.uvopt @@ -0,0 +1,471 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + lang_demo + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fonts\lang_demo\fontcustom14pt.c + fontcustom14pt.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fonts\lang_demo\fontcustom20pt.c + fontcustom20pt.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fonts\lang_demo\fontcustomr14pt.c + fontcustomr14pt.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fonts\lang_demo\fontcustomr20pt.c + fontcustomr20pt.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\images.c + images.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\lang_demo.c + lang_demo.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fonts\lang_demo\langremap.c + langremap.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fonts\lang_demo\language.c + language.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 12 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 15 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 16 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 17 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/lang_demo/lang_demo.uvproj b/boards/dk-tm4c129x/lang_demo/lang_demo.uvproj new file mode 100644 index 0000000..794f9fa --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/lang_demo.uvproj @@ -0,0 +1,489 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + lang_demo + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + lang_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\lang_demo.bin .\rvmdk\lang_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..;..\..\..\..\third_party\fonts\lang_demo;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + lang_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + fontcustom14pt.c + 1 + ..\..\..\..\third_party\fonts\lang_demo\fontcustom14pt.c + + + fontcustom20pt.c + 1 + ..\..\..\..\third_party\fonts\lang_demo\fontcustom20pt.c + + + fontcustomr14pt.c + 1 + ..\..\..\..\third_party\fonts\lang_demo\fontcustomr14pt.c + + + fontcustomr20pt.c + 1 + ..\..\..\..\third_party\fonts\lang_demo\fontcustomr20pt.c + + + frame.c + 1 + ..\drivers\frame.c + + + images.c + 1 + .\images.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + lang_demo.c + 1 + .\lang_demo.c + + + langremap.c + 1 + ..\..\..\..\third_party\fonts\lang_demo\langremap.c + + + language.c + 1 + ..\..\..\..\third_party\fonts\lang_demo\language.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/lang_demo/lang_demo_ccs.cmd b/boards/dk-tm4c129x/lang_demo/lang_demo_ccs.cmd new file mode 100644 index 0000000..30c18c1 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/lang_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * lang_demo_ccs.cmd - CCS linker configuration file for lang_demo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/lang_demo/readme.txt b/boards/dk-tm4c129x/lang_demo/readme.txt new file mode 100644 index 0000000..3b822b6 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/readme.txt @@ -0,0 +1,56 @@ +Graphics Library String Table Demonstration + +This application provides a demonstration of the capabilities of the +TivaWare Graphics Library's string table functions. Two panels show +different implementations of features of the string table functions. +For each panel, the bottom provides a forward and back button +(when appropriate). + +The first panel provides a large string with introductory text and basic +instructions for operation of the application. + +The second panel shows the available languages and allows them to be +switched between English, German, Spanish and Italian. + +The string table and custom fonts used by this application can be found +under /third_party/fonts/lang_demo. The original strings that the +application intends displaying are found in the language.csv file (encoded +in UTF8 format to allow accented characters and Asian language ideographs +to be included. The mkstringtable tool is used to generate two versions +of the string table, one which remains encoded in UTF8 format and the other +which has been remapped to a custom codepage allowing the table to be +reduced in size compared to the original UTF8 text. The tool also produces +character map files listing each character used in the string table. These +are then provided as input to the ftrasterize tool which generates two +custom fonts for the application, one indexed using Unicode and a smaller +one indexed using the custom codepage generated for this string table. + +The command line parameters required for mkstringtable and ftrasterize +can be found in the makefile in third_party/fonts/lang_demo. + +By default, the application builds to use the custom codepage version of +the string table and its matching custom font. To build using the UTF8 +string table and Unicode-indexed custom font, ensure that the definition of +\b USE_REMAPPED_STRINGS at the top of the lang_demo.c source file is +commented out. + + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/lang_demo/rvmdk/lang_demo.axf b/boards/dk-tm4c129x/lang_demo/rvmdk/lang_demo.axf new file mode 100644 index 0000000..56a7882 Binary files /dev/null and b/boards/dk-tm4c129x/lang_demo/rvmdk/lang_demo.axf differ diff --git a/boards/dk-tm4c129x/lang_demo/rvmdk/lang_demo.bin b/boards/dk-tm4c129x/lang_demo/rvmdk/lang_demo.bin new file mode 100644 index 0000000..092fb18 Binary files /dev/null and b/boards/dk-tm4c129x/lang_demo/rvmdk/lang_demo.bin differ diff --git a/boards/dk-tm4c129x/lang_demo/startup_ccs.c b/boards/dk-tm4c129x/lang_demo/startup_ccs.c new file mode 100644 index 0000000..5d2884c --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/lang_demo/startup_ewarm.c b/boards/dk-tm4c129x/lang_demo/startup_ewarm.c new file mode 100644 index 0000000..860b8a6 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/lang_demo/startup_gcc.c b/boards/dk-tm4c129x/lang_demo/startup_gcc.c new file mode 100644 index 0000000..fad3049 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/lang_demo/startup_rvmdk.S b/boards/dk-tm4c129x/lang_demo/startup_rvmdk.S new file mode 100644 index 0000000..07659c1 --- /dev/null +++ b/boards/dk-tm4c129x/lang_demo/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/mpu_fault/Makefile b/boards/dk-tm4c129x/mpu_fault/Makefile new file mode 100644 index 0000000..9717edd --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the MPU example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the MPU example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/mpu_fault.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the MPU example. +# +${COMPILER}/mpu_fault.axf: ${COMPILER}/frame.o +${COMPILER}/mpu_fault.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/mpu_fault.axf: ${COMPILER}/mpu_fault.o +${COMPILER}/mpu_fault.axf: ${COMPILER}/pinout.o +${COMPILER}/mpu_fault.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/mpu_fault.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/mpu_fault.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/mpu_fault.axf: mpu_fault.ld +SCATTERgcc_mpu_fault=mpu_fault.ld +ENTRY_mpu_fault=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/mpu_fault/ccs/.ccsimportspec b/boards/dk-tm4c129x/mpu_fault/ccs/.ccsimportspec new file mode 100644 index 0000000..2bef69c --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/mpu_fault/ccs/.ccsproject b/boards/dk-tm4c129x/mpu_fault/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/mpu_fault/ccs/.cproject b/boards/dk-tm4c129x/mpu_fault/ccs/.cproject new file mode 100644 index 0000000..0455fea --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/mpu_fault/ccs/.project b/boards/dk-tm4c129x/mpu_fault/ccs/.project new file mode 100644 index 0000000..e90884a --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/ccs/.project @@ -0,0 +1,65 @@ + + + mpu_fault + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + mpu_fault.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/mpu_fault/mpu_fault.c + + + mpu_fault_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/mpu_fault/mpu_fault_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/mpu_fault/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/mpu_fault/ccs/Debug/mpu_fault.bin b/boards/dk-tm4c129x/mpu_fault/ccs/Debug/mpu_fault.bin new file mode 100644 index 0000000..2e1fc94 Binary files /dev/null and b/boards/dk-tm4c129x/mpu_fault/ccs/Debug/mpu_fault.bin differ diff --git a/boards/dk-tm4c129x/mpu_fault/ccs/Debug/mpu_fault.out b/boards/dk-tm4c129x/mpu_fault/ccs/Debug/mpu_fault.out new file mode 100644 index 0000000..b7e7c13 Binary files /dev/null and b/boards/dk-tm4c129x/mpu_fault/ccs/Debug/mpu_fault.out differ diff --git a/boards/dk-tm4c129x/mpu_fault/ccs/macros.ini_initial b/boards/dk-tm4c129x/mpu_fault/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/mpu_fault/ccs/target_config.ccxml b/boards/dk-tm4c129x/mpu_fault/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/mpu_fault/ewarm/Exe/mpu_fault.bin b/boards/dk-tm4c129x/mpu_fault/ewarm/Exe/mpu_fault.bin new file mode 100644 index 0000000..1def7b0 Binary files /dev/null and b/boards/dk-tm4c129x/mpu_fault/ewarm/Exe/mpu_fault.bin differ diff --git a/boards/dk-tm4c129x/mpu_fault/ewarm/Exe/mpu_fault.out b/boards/dk-tm4c129x/mpu_fault/ewarm/Exe/mpu_fault.out new file mode 100644 index 0000000..db11208 Binary files /dev/null and b/boards/dk-tm4c129x/mpu_fault/ewarm/Exe/mpu_fault.out differ diff --git a/boards/dk-tm4c129x/mpu_fault/gcc/mpu_fault.axf b/boards/dk-tm4c129x/mpu_fault/gcc/mpu_fault.axf new file mode 100644 index 0000000..bf420f1 Binary files /dev/null and b/boards/dk-tm4c129x/mpu_fault/gcc/mpu_fault.axf differ diff --git a/boards/dk-tm4c129x/mpu_fault/gcc/mpu_fault.bin b/boards/dk-tm4c129x/mpu_fault/gcc/mpu_fault.bin new file mode 100644 index 0000000..44862d8 Binary files /dev/null and b/boards/dk-tm4c129x/mpu_fault/gcc/mpu_fault.bin differ diff --git a/boards/dk-tm4c129x/mpu_fault/mpu_fault.c b/boards/dk-tm4c129x/mpu_fault/mpu_fault.c new file mode 100644 index 0000000..1ac658b --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/mpu_fault.c @@ -0,0 +1,504 @@ +//***************************************************************************** +// +// mpu_fault.c - MPU example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/interrupt.h" +#include "driverlib/mpu.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      MPU (mpu_fault)

      +//! +//! This example application demonstrates the use of the MPU to protect a +//! region of memory from access, and to generate a memory management fault +//! when there is an access violation. +//! +//***************************************************************************** + +//***************************************************************************** +// +// Variables to hold the state of the fault status when the fault occurs and +// the faulting address. +// +//***************************************************************************** +static volatile uint32_t g_ui32MMAR; +static volatile uint32_t g_ui32FaultStatus; + +//***************************************************************************** +// +// A counter to track the number of times the fault handler has been entered. +// +//***************************************************************************** +static volatile uint32_t g_ui32MPUFaultCount; + +//***************************************************************************** +// +// A location for storing data read from various addresses. Volatile forces +// the compiler to use it and not optimize the access away. +// +//***************************************************************************** +static volatile uint32_t g_ui32Value; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// A simple function to perform a write using a 16-bit instruction, allowing +// for easy fix-up in the mpu fault handler. +// +//***************************************************************************** +#if defined(gcc) || defined(sourcerygxx) +void __attribute__((naked)) +Write(uint32_t ui32Addr, uint32_t ui32Data) +{ + __asm(" str r1, [r0]\n" + " bx lr"); +} + +uint32_t __attribute__((naked)) +Read(uint32_t ui32Offset) +{ + __asm(" ldr r0, [r0]\n" + " bx lr"); + + // + // This shouldn't be needed but it keeps the compiler from generating + // a warning. + // + return(0); +} +#endif + +#if defined(rvmdk) +__asm void +Write(uint32_t ui32Addr, uint32_t ui32Data) +{ + str r1, [r0]; + bx lr; +} + +__asm uint32_t +Read(uint32_t ui32Offset) +{ + ldr r0, [r0]; + bx lr; +} +#endif + +#if defined(ewarm) +void +Write(uint32_t ui32Addr, uint32_t ui32Data) +{ + __asm("str r1, [r0]\n" + "bx lr"); +} + +uint32_t +Read(uint32_t ui32Offset) +{ + __asm("ldr r0, [r0]\n" + "bx lr\n"); +#pragma diag_suppress=Pe940 +} +#pragma diag_default=Pe940 +#endif + +#if defined(ccs) +__asm(" .sect \".text\"\n" + " .clink\n" + " .thumbfunc Write\n" + " .thumb\n" + " .global Write\n" + "Write:\n" + " str r1, [r0]\n" + " bx lr\n"); + +__asm(" .sect \".text\"\n" + " .clink\n" + " .thumbfunc Read\n" + " .thumb\n" + " .global Read\n" + "Read:\n" + " ldr r0, [r0]\n" + " bx lr\n"); +void Write(uint32_t ui32Addr, uint32_t ui32Data); +uint32_t Read(uint32_t ui32Offset); +#endif + +//***************************************************************************** +// +// The exception handler for memory management faults, which are caused by MPU +// access violations. This handler will verify the cause of the fault and +// clear the NVIC fault status register. +// +//***************************************************************************** +void +MPUFaultHandler(void) +{ + // + // Preserve the value of the MMAR (the address causing the fault). + // Preserve the fault status register value, then clear it. + // + g_ui32MMAR = HWREG(NVIC_MM_ADDR); + g_ui32FaultStatus = HWREG(NVIC_FAULT_STAT); + HWREG(NVIC_FAULT_STAT) = g_ui32FaultStatus; + + // + // Increment a counter to indicate the fault occurred. + // + g_ui32MPUFaultCount++; + + // + // How the MPU fault is handled is application dependent... + // In this sample code, we are skipping the faulted instruction and + // continuing through the application. Since we are forcing the Read + // and Write function to use 16bits instructions only, it is safe to + // add 2 to the faulted instruction address to get the next + // instruction address. + // + #if defined(rvmdk) + { + uint32_t puiFaultPC; + + puiFaultPC = __current_sp() + 0x18; + *(uint32_t*)puiFaultPC = *(uint32_t*)puiFaultPC + 2; + } + #else + __asm(" mov r0, sp\n" + " ldr r1, [r0, #0x18]\n" + " adds r1, #2\n" + " str r1, [r0, #0x18]"); + #endif +} + +//***************************************************************************** +// +// This example demonstrates how to configure MPU regions for different levels +// of memory protection. The following memory map is set up: +// +// 0000.0000 - 0000.7000 - rgn 0: executable read-only, flash +// 0000.7000 - 0000.8000 - rgn 0: no access, flash (disabled sub-region 7) +// 2000.0000 - 2000.8000 - rgn 1: read-write, RAM +// 2000.8000 - 2000.A000 - rgn 2: read-only, RAM (disabled sub-rgn 4 of rgn 1) +// 2000.A000 - 2000.FFFF - rgn 1: read-write, RAM +// 4000.0000 - 4001.0000 - rgn 3: read-write, peripherals +// 4001.0000 - 4002.0000 - rgn 3: no access (disabled sub-region 1) +// 4002.0000 - 4006.0000 - rgn 3: read-write, peripherals +// 4006.0000 - 4008.0000 - rgn 3: no access (disabled sub-region 6, 7) +// 4400.0000 - 4403.0000 - rgn 4: no access (disabled sub-region 0, 1, 2) +// 4403.0000 - 4404.0000 - rgn 4: read-write, peripherals (sub-region 3) +// 4404.0000 - 4405.0000 - rgn 4: no access (disabled sub-region 4) +// 4405.0000 - 4406.0000 - rgn 4: read-write, peripherals (sub-region 5) +// 4406.0000 - 4408.0000 - rgn 4: no access (disabled sub-region 6, 7) +// E000.E000 - E000.F000 - rgn 5: read-write, NVIC +// 2003.8000 - 2003.FFFF - rgn 6: read-write, upper 32K RAM +// 0100.0000 - 0100.FFFF - rgn 7: executable read-only, ROM +// +// The example code will attempt to perform the following operations and check +// the faulting behavior: +// +// - write to flash (should fault) +// - read from the disabled area of flash (should fault) +// - read from the read-only area of RAM (should not fault) +// - write to the read-only section of RAM (should fault) +// +//***************************************************************************** +int +main(void) +{ + bool bFail = 0; + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "mpu-fault"); + + // + // Configure an executable, read-only MPU region for flash. It is a 32 KB + // region with the last 4 KB disabled to result in a 28 KB executable + // region. This region is needed so that the program can execute from + // flash. + // + ROM_MPURegionSet(0, FLASH_BASE, + MPU_RGN_SIZE_32K | MPU_RGN_PERM_EXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_SUB_RGN_DISABLE_7 | + MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for RAM. It is a 64 KB region. There + // is a 8 KB sub-region in the middle that is disabled in order to open up + // a hole in which different permissions can be applied. + // + ROM_MPURegionSet(1, SRAM_BASE, + MPU_RGN_SIZE_64K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_SUB_RGN_DISABLE_4 | + MPU_RGN_ENABLE); + // + // Configure a read-only MPU region for the 8 KB of RAM that is disabled in + // the previous region. This region is used for demonstrating read-only + // permissions. + // + ROM_MPURegionSet(2, SRAM_BASE + 0x8000, + MPU_RGN_SIZE_8K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for peripherals. The region is 512 KB + // total size, with several sub-regions disabled to prevent access to areas + // where there are no peripherals. This region is needed because the + // program needs access to some peripherals. + // + ROM_MPURegionSet(3, 0x40000000, + MPU_RGN_SIZE_512K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_SUB_RGN_DISABLE_1 | + MPU_SUB_RGN_DISABLE_6 | MPU_SUB_RGN_DISABLE_7 | + MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for peripherals. The region is 512 KB + // total size, with several sub-regions disabled to prevent access to areas + // where there are no peripherals. This region is needed because the + // program needs access to some peripherals. + // + ROM_MPURegionSet(4, 0x44000000, + MPU_RGN_SIZE_512K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_SUB_RGN_DISABLE_0 | + MPU_SUB_RGN_DISABLE_1 | MPU_SUB_RGN_DISABLE_2 | + MPU_SUB_RGN_DISABLE_4 | MPU_SUB_RGN_DISABLE_6 | + MPU_SUB_RGN_DISABLE_7 | + MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for access to the NVIC. The region is + // 4 KB in size. This region is needed because NVIC registers are needed + // in order to control the MPU. + // + ROM_MPURegionSet(5, NVIC_BASE, + MPU_RGN_SIZE_4K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for the top 32KB of RAM. + // This region is used as stack for Sourcery CodeBench. + // + ROM_MPURegionSet(6, SRAM_BASE + (ROM_SysCtlSRAMSizeGet() - (32 * 1024)), + MPU_RGN_SIZE_32K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_RGN_ENABLE); + + // + // Configure an executable, read-only MPU region for ROM. It is a 64 KB + // region. This region is needed so that ROM library calls work. + // + ROM_MPURegionSet(7, 0x01000000, + MPU_RGN_SIZE_64K | MPU_RGN_PERM_EXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_RGN_ENABLE); + + // + // Need to clear the NVIC fault status register to make sure there is no + // status hanging around from a previous program. + // + g_ui32FaultStatus = HWREG(NVIC_FAULT_STAT); + HWREG(NVIC_FAULT_STAT) = g_ui32FaultStatus; + + // + // Enable the MPU fault. + // + ROM_IntEnable(FAULT_MPU); + + // + // Enable the MPU. This will begin to enforce the memory protection + // regions. The MPU is configured so that when in the hard fault or NMI + // exceptions, a default map will be used. Neither of these should occur + // in this example program. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to write to the flash. This should cause a protection fault due + // to the fact that this region is read-only. + // + GrContextFontSet(&g_sContext, g_psFontCm20); + GrStringDraw(&g_sContext, "Check flash write", -1, 10, 60, 0); + g_ui32MPUFaultCount = 0; + Write(0x100, 0x12345678); + + // + // Verify that the fault occurred, at the expected address. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x100)) + { + GrStringDraw(&g_sContext, " OK", -1, 210, 60, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 210, 60, 0); + } + + // + // Attempt to read from the disabled section of flash, the upper 4 KB of + // the 32 KB region. + // + GrStringDraw(&g_sContext, "Check flash read", -1, 10, 85, 0); + g_ui32MPUFaultCount = 0; + g_ui32Value = Read(0x7820); + + // + // Verify that the fault occurred, at the expected address. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x7820)) + { + GrStringDraw(&g_sContext, " OK", -1, 210, 85, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 210, 85, 0); + } + + // + // Attempt to read from the read-only area of RAM, the middle 8 KB of the + // 64 KB region. + // + GrStringDraw(&g_sContext, "Check RAM read", -1, 10, 110, 0); + g_ui32MPUFaultCount = 0; + g_ui32Value = Read(0x20008440); + + // + // Verify that the RAM read did not cause a fault. + // + if(g_ui32MPUFaultCount == 0) + { + GrStringDraw(&g_sContext, " OK", -1, 210, 110, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 210, 110, 0); + } + + // + // Attempt to write to the read-only area of RAM, the middle 8 KB of the + // 64 KB region. + // + GrStringDraw(&g_sContext, "Check RAM write", -1, 10, 135, 0); + g_ui32MPUFaultCount = 0; + Write(0x20008460, 0xabcdef00); + + // + // Verify that the RAM write caused a fault. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x20008460)) + { + GrStringDraw(&g_sContext, " OK", -1, 210, 135, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 210, 135, 0); + } + + // + // Display the results of the example program. + // + if(bFail) + { + GrStringDrawCentered(&g_sContext, "Failure!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 220, 0); + } + else + { + GrStringDrawCentered(&g_sContext, "Success!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 220, 0); + } + + // + // Disable the MPU, so there are no lingering side effects if another + // program is run. + // + ROM_MPUDisable(); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/mpu_fault/mpu_fault.ewd b/boards/dk-tm4c129x/mpu_fault/mpu_fault.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/mpu_fault.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/mpu_fault/mpu_fault.ewp b/boards/dk-tm4c129x/mpu_fault/mpu_fault.ewp new file mode 100644 index 0000000..6d50d4e --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/mpu_fault.ewp @@ -0,0 +1,798 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\mpu_fault.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/dk-tm4c129x/mpu_fault/mpu_fault.icf b/boards/dk-tm4c129x/mpu_fault/mpu_fault.icf new file mode 100644 index 0000000..af567eb --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/mpu_fault.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// mpu_fault.icf - Linker configuration file for mpu_fault. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/mpu_fault/mpu_fault.ld b/boards/dk-tm4c129x/mpu_fault/mpu_fault.ld new file mode 100644 index 0000000..44f97a9 --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/mpu_fault.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * mpu_fault.ld - Linker configuration file for mpu_fault. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/mpu_fault/mpu_fault.sct b/boards/dk-tm4c129x/mpu_fault/mpu_fault.sct new file mode 100644 index 0000000..e53ff72 --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/mpu_fault.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; mpu_fault.sct - Linker configuration file for mpu_fault. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/mpu_fault/mpu_fault.uvopt b/boards/dk-tm4c129x/mpu_fault/mpu_fault.uvopt new file mode 100644 index 0000000..ffe0ed2 --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/mpu_fault.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + mpu_fault + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\mpu_fault.c + mpu_fault.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/mpu_fault/mpu_fault.uvproj b/boards/dk-tm4c129x/mpu_fault/mpu_fault.uvproj new file mode 100644 index 0000000..9d28faa --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/mpu_fault.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + mpu_fault + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + mpu_fault + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\mpu_fault.bin .\rvmdk\mpu_fault.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + mpu_fault.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + mpu_fault.c + 1 + .\mpu_fault.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/mpu_fault/mpu_fault_ccs.cmd b/boards/dk-tm4c129x/mpu_fault/mpu_fault_ccs.cmd new file mode 100644 index 0000000..3fa8544 --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/mpu_fault_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * mpu_fault_ccs.cmd - CCS linker configuration file for mpu_fault. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/mpu_fault/readme.txt b/boards/dk-tm4c129x/mpu_fault/readme.txt new file mode 100644 index 0000000..20f3bca --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/readme.txt @@ -0,0 +1,26 @@ +MPU + +This example application demonstrates the use of the MPU to protect a +region of memory from access, and to generate a memory management fault +when there is an access violation. + + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/mpu_fault/rvmdk/mpu_fault.axf b/boards/dk-tm4c129x/mpu_fault/rvmdk/mpu_fault.axf new file mode 100644 index 0000000..522bae0 Binary files /dev/null and b/boards/dk-tm4c129x/mpu_fault/rvmdk/mpu_fault.axf differ diff --git a/boards/dk-tm4c129x/mpu_fault/rvmdk/mpu_fault.bin b/boards/dk-tm4c129x/mpu_fault/rvmdk/mpu_fault.bin new file mode 100644 index 0000000..32ef1c0 Binary files /dev/null and b/boards/dk-tm4c129x/mpu_fault/rvmdk/mpu_fault.bin differ diff --git a/boards/dk-tm4c129x/mpu_fault/startup_ccs.c b/boards/dk-tm4c129x/mpu_fault/startup_ccs.c new file mode 100644 index 0000000..6e5f7c0 --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/mpu_fault/startup_ewarm.c b/boards/dk-tm4c129x/mpu_fault/startup_ewarm.c new file mode 100644 index 0000000..0685221 --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/mpu_fault/startup_gcc.c b/boards/dk-tm4c129x/mpu_fault/startup_gcc.c new file mode 100644 index 0000000..a204bec --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/mpu_fault/startup_rvmdk.S b/boards/dk-tm4c129x/mpu_fault/startup_rvmdk.S new file mode 100644 index 0000000..39f9e99 --- /dev/null +++ b/boards/dk-tm4c129x/mpu_fault/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN MPUFaultHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD MPUFaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/qs_weather/Makefile b/boards/dk-tm4c129x/qs_weather/Makefile new file mode 100644 index 0000000..0261c2e --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/Makefile @@ -0,0 +1,106 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Sample Ethernet Weather Application using lwIP 1.4.1. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/lwip-1.4.1/apps/httpserver_raw +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/lwip-1.4.1/apps +IPATH+=../../../../third_party/lwip-1.4.1/ports/tiva-tm4c129/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include +IPATH+=../../../../third_party/lwip-1.4.1/src/include/ipv4 +IPATH+=../../../../third_party + +# +# The default rule, which causes the Sample Ethernet Weather Application using lwIP 1.4.1 to be built. +# +all: ${COMPILER} +all: ${COMPILER}/qs_weather.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Sample Ethernet Weather Application using lwIP 1.4.1. +# +${COMPILER}/qs_weather.axf: ${COMPILER}/eth_client.o +${COMPILER}/qs_weather.axf: ${COMPILER}/flash_pb.o +${COMPILER}/qs_weather.axf: ${COMPILER}/frame.o +${COMPILER}/qs_weather.axf: ${COMPILER}/images.o +${COMPILER}/qs_weather.axf: ${COMPILER}/json.o +${COMPILER}/qs_weather.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/qs_weather.axf: ${COMPILER}/locator.o +${COMPILER}/qs_weather.axf: ${COMPILER}/lwiplib.o +${COMPILER}/qs_weather.axf: ${COMPILER}/pinout.o +${COMPILER}/qs_weather.axf: ${COMPILER}/qs_weather.o +${COMPILER}/qs_weather.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/qs_weather.axf: ${COMPILER}/touch.o +${COMPILER}/qs_weather.axf: ${COMPILER}/uartstdio.o +${COMPILER}/qs_weather.axf: ${COMPILER}/ustdlib.o +${COMPILER}/qs_weather.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/qs_weather.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/qs_weather.axf: qs_weather.ld +SCATTERgcc_qs_weather=qs_weather.ld +ENTRY_qs_weather=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 -DLWIP_1_4_1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/qs_weather/ccs/.ccsimportspec b/boards/dk-tm4c129x/qs_weather/ccs/.ccsimportspec new file mode 100644 index 0000000..ef5d7e5 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/ccs/.ccsimportspec @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/qs_weather/ccs/.ccsproject b/boards/dk-tm4c129x/qs_weather/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/qs_weather/ccs/.cproject b/boards/dk-tm4c129x/qs_weather/ccs/.cproject new file mode 100644 index 0000000..e0db47c --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/ccs/.cproject @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/qs_weather/ccs/.project b/boards/dk-tm4c129x/qs_weather/ccs/.project new file mode 100644 index 0000000..22e5b8a --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/ccs/.project @@ -0,0 +1,110 @@ + + + qs_weather + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + eth_client.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/qs_weather/eth_client.c + + + images.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/qs_weather/images.c + + + json.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/qs_weather/json.c + + + qs_weather.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/qs_weather/qs_weather.c + + + qs_weather_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/qs_weather/qs_weather_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/qs_weather/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/flash_pb.c + 1 + SW_ROOT/utils/flash_pb.c + + + utils/locator.c + 1 + SW_ROOT/utils/locator.c + + + utils/lwiplib.c + 1 + SW_ROOT/utils/lwiplib.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/qs_weather/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/qs_weather/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/qs_weather/ccs/Debug/qs_weather.bin b/boards/dk-tm4c129x/qs_weather/ccs/Debug/qs_weather.bin new file mode 100644 index 0000000..5e9444d Binary files /dev/null and b/boards/dk-tm4c129x/qs_weather/ccs/Debug/qs_weather.bin differ diff --git a/boards/dk-tm4c129x/qs_weather/ccs/Debug/qs_weather.out b/boards/dk-tm4c129x/qs_weather/ccs/Debug/qs_weather.out new file mode 100644 index 0000000..90fd3ed Binary files /dev/null and b/boards/dk-tm4c129x/qs_weather/ccs/Debug/qs_weather.out differ diff --git a/boards/dk-tm4c129x/qs_weather/ccs/macros.ini_initial b/boards/dk-tm4c129x/qs_weather/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/qs_weather/ccs/target_config.ccxml b/boards/dk-tm4c129x/qs_weather/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/qs_weather/debug.h b/boards/dk-tm4c129x/qs_weather/debug.h new file mode 100644 index 0000000..0ceaffe --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/debug.h @@ -0,0 +1,38 @@ +//***************************************************************************** +// +// debug.h - +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +#ifdef DEBUG_OUTPUT +//#include "driverlib/uart.h" +#include "utils/uartstdio.h" +#define DebugPrintf(...) UARTprintf(__VA_ARGS__) +#else +#define DebugPrintf(...) +#endif +#else +#define DebugPrintf(...) + +#endif diff --git a/boards/dk-tm4c129x/qs_weather/eth_client.c b/boards/dk-tm4c129x/qs_weather/eth_client.c new file mode 100644 index 0000000..5ab229a --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/eth_client.c @@ -0,0 +1,1309 @@ +//***************************************************************************** +// +// eth_client.c - This file handles all of the Ethernet connections using lwIP. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/flash.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "utils/lwiplib.h" +#include "lwip/dns.h" +#include "driverlib/systick.h" +#include "lwip/dns.h" +#include "eth_client.h" +#include "json.h" + +//***************************************************************************** +// +// Flag indexes for g_sEnet.ui32Flags +// +//***************************************************************************** +#define FLAG_TIMER_DHCP_EN 0 +#define FLAG_TIMER_DNS_EN 1 +#define FLAG_TIMER_TCP_EN 2 +#define FLAG_DHCP_STARTED 3 +#define FLAG_DNS_ADDRFOUND 4 + +//***************************************************************************** +// +// g_sEnet.ulRequest Values +// +//***************************************************************************** +#define WEATHER_NONE 0 +#define WEATHER_CURRENT 1 +#define WEATHER_FORECAST 2 + +//***************************************************************************** +// +// The current state of the Ethernet connection. +// +//***************************************************************************** +struct +{ + volatile uint32_t ui32Flags; + + // + // Array to hold the MAC addresses. + // + uint8_t pui8MACAddr[8]; + + // + // Global define of the TCP structure used. + // + struct tcp_pcb *psTCP; + + // + // Global IP structure to hold a copy of the IP address. + // + struct ip_addr sLocalIP; + + // + // Global IP structure to hold a copy of the DNS resolved address. + // + struct ip_addr sServerIP; + + // + // The saved proxy name as a text string. + // + const char *pcProxyName; + + volatile enum + { + iEthNoConnection, + iEthDHCPWait, + iEthDHCPComplete, + iEthDNSWait, + iEthTCPConnectWait, + iEthTCPConnectComplete, + iEthQueryWait, + iEthTCPOpen, + iEthIdle + } eState; + + unsigned long ulRequest; + + tEventFunction pfnEvent; +} +g_sEnet; + +//***************************************************************************** +// +// Maximum size of an weather request. +// +//***************************************************************************** +#define MAX_REQUEST 256 + +extern uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// Various strings used to access weather information on the web. +// +//***************************************************************************** +static const char g_cWeatherRequest[] = + "GET http://api.openweathermap.org/data/2.5/weather?q="; + +static const char g_cWeatherRequestForecast[] = + "GET http://api.openweathermap.org/data/2.5/forecast/daily?q="; +static const char g_cMode[] = "&mode=json&units=metric"; + +static char g_cAPPIDOpenWeather[] = + "&APIID=afc5370fef1dfec1666a5676346b163b"; +static char g_cHTTP11[] = " HTTP/1.0\r\n\r\n"; + +//***************************************************************************** +// +// This structure holds the state and control values for the weather requests. +// +//***************************************************************************** +struct +{ + // + // The current weather source. + // + tWeatherSource eWeatherSource; + + // + // The format expected from the weather source. + // + enum + { + iFormatJSON + } + eFormat; + + // + // The application provided callback function. + // + tEventFunction pfnEvent; + + // + // The application provided weather information structure. + // + tWeatherReport *psWeatherReport; + + // + // The local buffer used to store the current weather request. + // + char pcRequest[MAX_REQUEST]; + + // + // The number of valid bytes in the request. + // + uint32_t ui32RequestSize; +} +g_sWeather; + +//***************************************************************************** +// +// Close an active connection. +// +//***************************************************************************** +void +EthClientReset(void) +{ + // + // No longer have a link. + // + g_sEnet.eState = iEthNoConnection; + + // + // Reset the flags to just enable the lwIP timer. + // + g_sEnet.ui32Flags = (1 << FLAG_TIMER_DHCP_EN); + + // + // Reset the addresses. + // + g_sEnet.sLocalIP.addr = 0; + g_sEnet.sServerIP.addr = 0; + + // + // Deallocate the TCP structure if it was already allocated. + // + if(g_sEnet.psTCP) + { + // + // Clear out all of the TCP callbacks. + // + tcp_sent(g_sEnet.psTCP, NULL); + tcp_recv(g_sEnet.psTCP, NULL); + tcp_err(g_sEnet.psTCP, NULL); + + // + // Close the TCP connection. + // + tcp_close(g_sEnet.psTCP); + g_sEnet.psTCP = 0; + } +} + +//***************************************************************************** +// +// Handles lwIP TCP/IP errors. +// +// \param vPArg is the state data for this connection. +// \param iErr is the error that was detected. +// +// This function is called when the lwIP TCP/IP stack has detected an error. +// The connection is no longer valid. +// +// \return None. +// +//***************************************************************************** +static void +TCPError(void *vPArg, err_t iErr) +{ +} + +//***************************************************************************** +// +// Finalizes the TCP connection in client mode. +// +// \param pvArg is the state data for this connection. +// \param psPcb is the pointer to the TCP control structure. +// \param psBuf is the buffer structure that holds the data for this receive +// event. +// \param iErr is not used in this implementation. +// +// This function is called when the lwIP TCP/IP stack has completed a TCP +// connection. +// +// \return This function will return an lwIP defined error code. +// +//***************************************************************************** +static err_t +TCPReceive(void *pvArg, struct tcp_pcb *psPcb, struct pbuf *psBuf, err_t iErr) +{ + struct pbuf *psBufCur; + int32_t i32Items; + + if(psBuf == 0) + { + // + // Tell the application that the connection was closed. + // + if(g_sWeather.pfnEvent) + { + g_sWeather.pfnEvent(ETH_EVENT_CLOSE, 0, 0); + g_sWeather.pfnEvent = 0; + } + + // + // Close out the port. + // + tcp_close(psPcb); + + if(psPcb == g_sEnet.psTCP) + { + g_sEnet.psTCP = 0; + } + + g_sEnet.eState = iEthIdle; + + return(ERR_OK); + } + + if(g_sEnet.eState == iEthQueryWait) + { + if(g_sEnet.ulRequest == WEATHER_CURRENT) + { + // + // Read items from the buffer. + // + i32Items = JSONParseCurrent(0, g_sWeather.psWeatherReport, psBuf); + + // + // Make sure some items were found. + // + if(i32Items > 0) + { + if(g_sWeather.pfnEvent) + { + g_sWeather.pfnEvent(ETH_EVENT_RECEIVE, + (void *)g_sWeather.psWeatherReport, 0); + + // + // Clear the event function and return to the idle state. + // + g_sEnet.eState = iEthIdle; + } + } + else if(i32Items < 0) + { + if(g_sWeather.pfnEvent) + { + // + // This was not a valid request. + // + g_sWeather.pfnEvent(ETH_EVENT_INVALID_REQ, 0, 0); + + // + // Clear the event function and return to the idle state. + // + g_sEnet.eState = iEthIdle; + } + } + } + else if(g_sEnet.ulRequest == WEATHER_FORECAST) + { + // + // Read items from the buffer. + // + i32Items = JSONParseForecast(0, g_sWeather.psWeatherReport, psBuf); + + if(i32Items > 0) + { + if(g_sWeather.pfnEvent) + { + g_sWeather.pfnEvent(ETH_EVENT_RECEIVE, + (void *)g_sWeather.psWeatherReport, 0); + + // + // Clear the event function and return to the idle state. + // + g_sEnet.eState = iEthIdle; + } + } + else if(i32Items < 0) + { + if(g_sWeather.pfnEvent) + { + // + // This was not a valid request. + // + g_sWeather.pfnEvent(ETH_EVENT_INVALID_REQ, 0, 0); + + // + // Clear the event function and return to the idle state. + // + g_sEnet.eState = iEthIdle; + } + } + } + } + else + { + // + // Go to idle state. + // + g_sEnet.eState = iEthIdle; + } + + // + // Initialize the linked list pointer to parse. + // + psBufCur = psBuf; + + // + // Free the buffers used since they have been processed. + // + while(psBufCur->len != 0) + { + // + // Indicate that you have received and processed this set of TCP data. + // + tcp_recved(psPcb, psBufCur->len); + + // + // Go to the next buffer. + // + psBufCur = psBufCur->next; + + // + // Terminate if there are no more buffers. + // + if(psBufCur == 0) + { + break; + } + } + + // + // Free the memory space allocated for this receive. + // + pbuf_free(psBuf); + + // + // Return. + // + return(ERR_OK); +} + +//***************************************************************************** +// +// Handles acknowledgment of data transmitted via Ethernet. +// +// \param pvArg is the state data for this connection. +// \param psPcb is the pointer to the TCP control structure. +// \param ui16Len is the length of the data transmitted. +// +// This function is called when the lwIP TCP/IP stack has received an +// acknowledgment for data that has been transmitted. +// +// \return This function will return an lwIP defined error code. +// +//***************************************************************************** +static err_t +TCPSent(void *pvArg, struct tcp_pcb *psPcb, u16_t ui16Len) +{ + // + // Return OK. + // + return (ERR_OK); +} + +//***************************************************************************** +// +// Finalizes the TCP connection in client mode. +// +// \param pvArg is the state data for this connection. +// \param psPcb is the pointer to the TCP control structure. +// \param iErr is not used in this implementation. +// +// This function is called when the lwIP TCP/IP stack has completed a TCP +// connection. +// +// \return This function will return an lwIP defined error code. +// +//***************************************************************************** +static err_t +TCPConnected(void *pvArg, struct tcp_pcb *psPcb, err_t iErr) +{ + // + // Check if there was a TCP error. + // + if(iErr != ERR_OK) + { + // + // Clear out all of the TCP callbacks. + // + tcp_sent(psPcb, NULL); + tcp_recv(psPcb, NULL); + tcp_err(psPcb, NULL); + + // + // Close the TCP connection. + // + tcp_close(psPcb); + + if(psPcb == g_sEnet.psTCP) + { + g_sEnet.psTCP = 0; + } + + // + // And return. + // + return (ERR_OK); + } + + // + // Setup the TCP receive function. + // + tcp_recv(psPcb, TCPReceive); + + // + // Setup the TCP error function. + // + tcp_err(psPcb, TCPError); + + // + // Setup the TCP sent callback function. + // + tcp_sent(psPcb, TCPSent); + + // + // Connection is complete. + // + g_sEnet.eState = iEthTCPConnectComplete; + + // + // Return a success code. + // + return(ERR_OK); +} + +//***************************************************************************** +// +// TCP connect +// +// This function attempts to connect to a TCP endpoint. +// +// \return None. +// +//***************************************************************************** +err_t +EthClientTCPConnect(uint32_t ui32Port) +{ + err_t eTCPReturnCode; + + // + // Enable the TCP timer function calls. + // + HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_TCP_EN) = 1; + + if(g_sEnet.psTCP) + { + // + // Initially clear out all of the TCP callbacks. + // + tcp_sent(g_sEnet.psTCP, NULL); + tcp_recv(g_sEnet.psTCP, NULL); + tcp_err(g_sEnet.psTCP, NULL); + + // + // Make sure there is no lingering TCP connection. + // + tcp_close(g_sEnet.psTCP); + } + + // + // Create a new TCP socket. + // + g_sEnet.psTCP = tcp_new(); + + // + // Check if you need to go through a proxy. + // + if(g_sEnet.pcProxyName != 0) + { + // + // Attempt to connect through the proxy server. + // + eTCPReturnCode = tcp_connect(g_sEnet.psTCP, &g_sEnet.sServerIP, + ui32Port, TCPConnected); + } + else + { + // + // Attempt to connect to the server directly. + // + eTCPReturnCode = tcp_connect(g_sEnet.psTCP, &g_sEnet.sServerIP, + ui32Port, TCPConnected); + } + + return(eTCPReturnCode); +} + +//***************************************************************************** +// +// TCP connect +// +// This function attempts to connect to a TCP endpoint. +// +// \return None. +// +//***************************************************************************** +void +EthClientTCPDisconnect(void) +{ + // + // No longer have a link. + // + g_sEnet.eState = iEthNoConnection; + + // + // Deallocate the TCP structure if it was already allocated. + // + if(g_sEnet.psTCP) + { + // + // Close the TCP connection. + // + tcp_close(g_sEnet.psTCP); + g_sEnet.psTCP = 0; + } +} + +//***************************************************************************** +// +// Handler function when the DNS server gets a response or times out. +// +// \param pcName is DNS server name. +// \param psIPAddr is the DNS server's IP address. +// \param vpArg is the configurable argument. +// +// This function is called when the DNS server resolves an IP or times out. +// If the DNS server returns an IP structure that is not NULL, add the IP to +// to the g_sEnet.sServerIP IP structure. +// +// \return None. +// +//***************************************************************************** +static void +DNSServerFound(const char *pcName, struct ip_addr *psIPAddr, void *vpArg) +{ + // + // Check if a valid DNS server address was found. + // + if(psIPAddr != NULL) + { + // + // Copy the returned IP address into a global IP address. + // + g_sEnet.sServerIP = *psIPAddr; + + // + // Tell the main program that a DNS address was found. + // + HWREGBITW(&g_sEnet.ui32Flags, FLAG_DNS_ADDRFOUND) = 1; + } + else + { + // + // Disable the DNS timer. + // + HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 0; + } +} + +//***************************************************************************** +// +// Required by lwIP library to support any host-related timer functions. +// +//***************************************************************************** +void +lwIPHostTimerHandler(void) +{ +} + +//***************************************************************************** +// +// Send a request to the server +// +// \param pcRequest request to be sent +// \param ui32Size length of the request to be sent. this is usually the size +// of the request minus the termination character +// +// This function will send the request to the connected server +// +// \return the lwIP error code. +// +//***************************************************************************** +err_t +EthClientSend(char *pcRequest, uint32_t ui32Size) +{ + err_t eError; + + eError = tcp_write(g_sEnet.psTCP, pcRequest, ui32Size, + TCP_WRITE_FLAG_COPY); + + // + // Write data for sending (but does not send it immediately). + // + if(eError == ERR_OK) + { + // + // Find out what we can send and send it + // + tcp_output(g_sEnet.psTCP); + } + + return(eError); +} + +//***************************************************************************** +// +// DHCP connect +// +// This function obtains the MAC address from the User registers, starts the +// DHCP timer and blocks until an IP address is obtained. +// +// \return None. +// +//***************************************************************************** +err_t +EthClientDHCPConnect(void) +{ + // + // Check if the DHCP has already been started. + // + if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_DHCP_STARTED) == 0) + { + // + // Set the DCHP started flag. + // + HWREGBITW(&g_sEnet.ui32Flags, FLAG_DHCP_STARTED) = 1; + } + else + { + // + // If DHCP has already been started, we need to clear the IPs and + // switch to static. This forces the LWIP to get new IP address + // and retry the DHCP connection. + // + lwIPNetworkConfigChange(0, 0, 0, IPADDR_USE_STATIC); + + // + // Restart the DHCP connection. + // + lwIPNetworkConfigChange(0, 0, 0, IPADDR_USE_DHCP); + } + + return ERR_OK; +} + +//***************************************************************************** +// +// Handler function when the DNS server gets a response or times out. +// +// \param pcName is DNS server name. +// +// This function is called when the DNS server resolves an IP or times out. +// If the DNS server returns an IP structure that is not NULL, add the IP to +// to the g_sEnet.sServerIP IP structure. +// +// \return None. +// +//***************************************************************************** +int32_t +EthClientDNSResolve(const char *pcName) +{ + err_t iRet; + + if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN)) + { + return(ERR_INPROGRESS); + } + + // + // Set DNS config timer to true. + // + HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 1; + + // + // Initialize the host name IP address found flag to false. + // + HWREGBITW(&g_sEnet.ui32Flags, FLAG_DNS_ADDRFOUND) = 0; + + // + // Resolve host name. + // + iRet = dns_gethostbyname(pcName, &g_sEnet.sServerIP, DNSServerFound, 0); + + // + // If ERR_OK is returned, the local DNS table resolved the host name. If + // ERR_INPROGRESS is returned, the DNS request has been queued and will be + // sent to the DNS server. + // + if(iRet == ERR_OK) + { + // + // Stop calling the DNS timer function. + // + HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 0; + } + + // + // Return host name not found. + // + return(iRet); +} + +//***************************************************************************** +// +// Returns the IP address for this interface. +// +// This function will read and return the currently assigned IP address for +// the Tiva Ethernet interface. +// +// \return Returns the assigned IP address for this interface. +// +//***************************************************************************** +uint32_t +EthClientAddrGet(void) +{ + // + // Return IP. + // + return(lwIPLocalIPAddrGet()); +} + +//***************************************************************************** +// +// Returns the weather server IP address for this interface. +// +// This function will read and return the weather server IP address that is +// currently in use. This could be the proxy server if the Internet proxy +// is enabled. +// +// \return Returns the weather server IP address for this interface. +// +//***************************************************************************** +uint32_t +EthClientServerAddrGet(void) +{ + // + // Return IP. + // + return((uint32_t)g_sEnet.sServerIP.addr); +} + +//***************************************************************************** +// +// Returns the MAC address for the Tiva Ethernet controller. +// +// \param pui8MACAddr is the 6 byte MAC address assigned to the Ethernet +// controller. +// +// This function will read and return the MAC address for the Ethernet +// controller. +// +// \return Returns the weather server IP address for this interface. +// +//***************************************************************************** +void +EthClientMACAddrGet(uint8_t *pui8MACAddr) +{ + int32_t iIdx; + + for(iIdx = 0; iIdx < 6; iIdx++) + { + pui8MACAddr[iIdx] = g_sEnet.pui8MACAddr[iIdx]; + } +} + +//***************************************************************************** +// +// Set the proxy string for the Ethernet connection. +// +// \param pcProxyName is the string used as the proxy server name. +// +// This function sets the current proxy used by the Ethernet connection. The +// \e pcProxyName value can be 0 to indicate that no proxy is in use or it can +// be a pointer to a string that holds the name of the proxy server to use. +// The content of the pointer passed to \e pcProxyName should not be changed +// after this call as this function only stores the pointer and does not copy +// the data from this pointer. +// +// \return None. +// +//***************************************************************************** +void +EthClientProxySet(const char *pcProxyName) +{ + // + // Save the new proxy string. + // + g_sEnet.pcProxyName = pcProxyName; + + // + // Reset the connection on any change to the proxy. + // + EthClientReset(); +} + +//***************************************************************************** +// +// Initialize the Ethernet client +// +// This function initializes all the Ethernet components to not configured. +// This tells the SysTick interrupt which timer modules to call. +// +// \return None. +// +//***************************************************************************** +void +EthClientInit(tEventFunction pfnEvent) +{ + uint32_t ui32User0, ui32User1; + + // + // Initialize all the Ethernet components to not configured. This tells + // the SysTick interrupt which timer modules to call. + // + HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DHCP_EN) = 0; + HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 0; + HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_TCP_EN) = 0; + + g_sEnet.eState = iEthNoConnection; + + g_sEnet.pfnEvent = pfnEvent; + + // + // Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC + // address needed to program the hardware registers, then program the MAC + // address into the Ethernet Controller registers. + // + FlashUserGet(&ui32User0, &ui32User1); + + g_sEnet.pui8MACAddr[0] = ((ui32User0 >> 0) & 0xff); + g_sEnet.pui8MACAddr[1] = ((ui32User0 >> 8) & 0xff); + g_sEnet.pui8MACAddr[2] = ((ui32User0 >> 16) & 0xff); + g_sEnet.pui8MACAddr[3] = ((ui32User1 >> 0) & 0xff); + g_sEnet.pui8MACAddr[4] = ((ui32User1 >> 8) & 0xff); + g_sEnet.pui8MACAddr[5] = ((ui32User1 >> 16) & 0xff); + + lwIPInit(g_ui32SysClock, g_sEnet.pui8MACAddr, 0, 0, 0, IPADDR_USE_DHCP); + + // + // Start lwIP tick interrupt. + // + HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DHCP_EN) = 1; +} + +//***************************************************************************** +// +// Periodic Tick for the Ethernet client +// +// This function is the needed periodic tick for the Ethernet client. It needs +// to be called periodically through the use of a timer or systick. +// +// \return None. +// +//***************************************************************************** +void +EthClientTick(uint32_t ui32TickMS) +{ + uint32_t ui32IPAddr; + int32_t i32Ret; + + if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DHCP_EN)) + { + lwIPTimer(ui32TickMS); + } + + if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN)) + { + dns_tmr(); + } + + if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_TCP_EN)) + { + tcp_tmr(); + } + + // + // Check for loss of link. + // + if((g_sEnet.eState != iEthNoConnection) && + (lwIPLocalIPAddrGet() == 0xffffffff)) + { + // + // Reset the connection due to a loss of link. + // + EthClientReset(); + + // + // Signal a disconnect event. + // + g_sEnet.pfnEvent(ETH_EVENT_DISCONNECT, 0, 0); + } + else if(g_sEnet.eState == iEthNoConnection) + { + // + // Once link is detected start DHCP. + // + if(lwIPLocalIPAddrGet() != 0xffffffff) + { + EthClientDHCPConnect(); + + g_sEnet.eState = iEthDHCPWait; + } + } + else if(g_sEnet.eState == iEthDHCPWait) + { + // + // Get IP address. + // + ui32IPAddr = lwIPLocalIPAddrGet(); + + // + // If IP Address has not yet been assigned, update the display + // accordingly. + // + if((ui32IPAddr != 0xffffffff) && (ui32IPAddr != 0)) + { + // + // Update the DHCP IP address. + // + g_sEnet.sLocalIP.addr = ui32IPAddr; + + g_sEnet.eState = iEthDHCPComplete; + + // + // Stop DHCP timer since an address has been provided. + // + HWREGBITW(&g_sEnet.ui32Flags, FLAG_DHCP_STARTED) = 0; + } + } + else if(g_sEnet.eState == iEthDHCPComplete) + { + if(g_sEnet.pcProxyName == 0) + { + // + // Resolve the host by name. + // + i32Ret = EthClientDNSResolve("api.openweathermap.org"); + } + else + { + // + // Resolve the proxy by name. + // + i32Ret = EthClientDNSResolve(g_sEnet.pcProxyName); + } + + if(i32Ret == ERR_OK) + { + // + // If the address was already returned then go to idle. + // + g_sEnet.eState = iEthIdle; + + // + // Notify the main routine of the new Ethernet connection. + // + g_sEnet.pfnEvent(ETH_EVENT_CONNECT, &g_sEnet.sLocalIP.addr, 4); + } + else if(i32Ret == ERR_INPROGRESS) + { + // + // If the request is pending the go to the iEthDNSWait state. + // + g_sEnet.eState = iEthDNSWait; + } + } + else if(g_sEnet.eState == iEthDNSWait) + { + // + // Check if the host name was resolved. + // + if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_DNS_ADDRFOUND)) + { + // + // Stop calling the DNS timer function. + // + HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 0; + + g_sEnet.eState = iEthIdle; + + // + // Notify the main routine of the new Ethernet connection. + // + g_sEnet.pfnEvent(ETH_EVENT_CONNECT, &g_sEnet.sLocalIP.addr, 4); + } + } + else if(g_sEnet.eState == iEthTCPConnectWait) + { + } + else if(g_sEnet.eState == iEthTCPConnectComplete) + { + err_t eError; + + g_sEnet.eState = iEthTCPOpen; + + eError = EthClientSend(g_sWeather.pcRequest, + g_sWeather.ui32RequestSize); + + if(eError == ERR_OK) + { + // + // Waiting on a query response. + // + g_sEnet.eState = iEthQueryWait; + } + else + { + g_sEnet.eState = iEthIdle; + } + } +} + +//***************************************************************************** +// +// Set the current weather source. +// +//***************************************************************************** +void +WeatherSourceSet(tWeatherSource eWeatherSource) +{ + // + // Save the source. + // + g_sWeather.eWeatherSource = eWeatherSource; + g_sWeather.eFormat = iFormatJSON; +} + +//***************************************************************************** +// +// Merges strings into the current request at a given pointer and offset. +// +//***************************************************************************** +static int32_t +MergeRequest(int32_t i32Offset, const char *pcSrc, int32_t i32Size, + bool bReplaceSpace) +{ + int32_t i32Idx; + + // + // Copy the base request to the buffer. + // + for(i32Idx = 0; i32Idx < i32Size; i32Idx++) + { + if((pcSrc[i32Idx] == ' ') && (bReplaceSpace)) + { + if((i32Offset + 3) >= sizeof(g_sWeather.pcRequest)) + { + break; + } + g_sWeather.pcRequest[i32Offset++] = '%'; + g_sWeather.pcRequest[i32Offset++] = '2'; + g_sWeather.pcRequest[i32Offset] = '0'; + } + else + { + g_sWeather.pcRequest[i32Offset] = pcSrc[i32Idx]; + } + + if((i32Offset >= sizeof(g_sWeather.pcRequest)) || + (pcSrc[i32Idx] == 0)) + { + break; + } + + i32Offset++; + } + + return(i32Offset); +} + +//***************************************************************************** +// +// Gets the daily forecast for a given city. +// +//***************************************************************************** +int32_t +WeatherForecast(tWeatherSource eWeatherSource, const char *pcQuery, + tWeatherReport *psWeatherReport, tEventFunction pfnEvent) +{ + int32_t i32Idx; + const char pcCount[] = "&cnt=1"; + + // + // If the requested source is not valid or there is no call back then + // just fail. + // + if((eWeatherSource != iWSrcOpenWeatherMap) || (g_sWeather.pfnEvent)) + { + return (-1); + } + + g_sWeather.pfnEvent = pfnEvent; + g_sWeather.psWeatherReport = psWeatherReport; + + // + // Connect or reconnect to port 80. + // + g_sEnet.eState = iEthTCPConnectWait; + + // + // Copy the base forecast request to the buffer. + // + i32Idx = MergeRequest(0, g_cWeatherRequestForecast, + sizeof(g_cWeatherRequestForecast), false); + + // + // Append the request. + // + i32Idx = MergeRequest(i32Idx, pcQuery, sizeof(g_sWeather.pcRequest), + true); + + // + // Append the request mode. + // + i32Idx = MergeRequest(i32Idx, g_cMode, sizeof(g_cMode), false); + + // + // Append the count. + // + i32Idx = MergeRequest(i32Idx, pcCount, sizeof(pcCount), false); + + // + // Append the App ID. + // + i32Idx = MergeRequest(i32Idx, g_cAPPIDOpenWeather, + sizeof(g_cAPPIDOpenWeather), false); + + // + // Append the "HTTP:/1.1" string. + // + i32Idx = MergeRequest(i32Idx, g_cHTTP11, sizeof(g_cHTTP11), false); + + // + // Forcast weather report request. + // + g_sEnet.ulRequest = WEATHER_FORECAST; + + if(EthClientTCPConnect(80) != ERR_OK) + { + return(-1); + } + + // + // Save the size of the request. + // + g_sWeather.ui32RequestSize = i32Idx; + + return(0); +} + +//***************************************************************************** +// +// Gets the current weather information for a given city. +// +//***************************************************************************** +int32_t +WeatherCurrent(tWeatherSource eWeatherSource, const char *pcQuery, + tWeatherReport *psWeatherReport, tEventFunction pfnEvent) +{ + int32_t i32Idx; + + // + // If the requested source is not valid or there is no call back then + // just fail. + // + if((eWeatherSource != iWSrcOpenWeatherMap) || (g_sWeather.pfnEvent)) + { + return (-1); + } + + g_sWeather.pfnEvent = pfnEvent; + g_sWeather.psWeatherReport = psWeatherReport; + + // + // Copy the base current request to the buffer. + // + i32Idx = MergeRequest(0, g_cWeatherRequest, sizeof(g_cWeatherRequest), + false); + + // + // Append the request. + // + i32Idx = MergeRequest(i32Idx, pcQuery, sizeof(g_sWeather.pcRequest), true); + + // + // Append the request mode. + // + i32Idx = MergeRequest(i32Idx, g_cMode, sizeof(g_cMode), false); + + // + // Append the App ID. + // + i32Idx = MergeRequest(i32Idx, g_cAPPIDOpenWeather, + sizeof(g_cAPPIDOpenWeather), false); + + // + // Append the "HTTP:/1.1" string. + // + i32Idx = MergeRequest(i32Idx, g_cHTTP11, sizeof(g_cHTTP11), false); + + // + // Save the size of this request. + // + g_sWeather.ui32RequestSize = i32Idx; + + // + // Connect or reconnect to port 80. + // + g_sEnet.eState = iEthTCPConnectWait; + + // + // Current weather report request. + // + g_sEnet.ulRequest = WEATHER_CURRENT; + + // + // Connect to server + // + if(EthClientTCPConnect(80) != ERR_OK) + { + return(-1); + } + + return(0); +} diff --git a/boards/dk-tm4c129x/qs_weather/eth_client.h b/boards/dk-tm4c129x/qs_weather/eth_client.h new file mode 100644 index 0000000..cccff86 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/eth_client.h @@ -0,0 +1,163 @@ +//***************************************************************************** +// +// eth_client.h - Prototypes for the driver for the eth_client +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +#ifndef ETH_CLIENT_H_ +#define ETH_CLIENT_H_ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Events passed back to the application. +// +//***************************************************************************** +#define ETH_EVENT_RECEIVE 0x00000001 +#define ETH_EVENT_CONNECT 0x00000002 +#define ETH_EVENT_DISCONNECT 0x00000003 +#define ETH_EVENT_CLOSE 0x00000004 +#define ETH_EVENT_INVALID_REQ 0x00000005 + +//***************************************************************************** +// +// The weather access methods. +// +//***************************************************************************** +typedef enum +{ + // + // openweathermap.org. + // + iWSrcOpenWeatherMap +} +tWeatherSource; + +//***************************************************************************** +// +// Generic weather reporting structure. +// +//***************************************************************************** +typedef struct +{ + // + // The brief weather description, this is caller provided. + // + const char *pcDescription; + + // + // The current temperature(units determined by caller). + // + int32_t i32Temp; + + // + // The daily high temperature(units determined by caller). + // + int32_t i32TempHigh; + + // + // The daily low temperature(units determined by caller). + // + int32_t i32TempLow; + + // + // The current humidity(units determined by caller). + // + int32_t i32Humidity; + + // + // The current atmospheric pressure(units determined by caller). + // + int32_t i32Pressure; + + // + // The last time these values were update (GMT Unix time). + // + uint32_t ui32Time; + + // + // The sunrise time (GMT Unix time). + // + uint32_t ui32SunRise; + + // + // The sunset time (GMT Unix time). + // + uint32_t ui32SunSet; + + // + // Icon image. + // + const uint8_t *pui8Image; +} +tWeatherReport; + +//***************************************************************************** +// +// The type definition for event functions. +// +//***************************************************************************** +typedef void (* tEventFunction)(uint32_t ui32Event, void* pvData, + uint32_t ui32Param); + +//***************************************************************************** +// +// Exported Ethernet function prototypes. +// +//***************************************************************************** +extern void EthClientInit(tEventFunction pfnEvent); +extern void EthClientProxySet(const char *pcProxyName); +extern void EthClientTick(uint32_t ui32TickMS); +extern uint32_t EthClientAddrGet(void); +extern void EthClientMACAddrGet(uint8_t *pui8Addr); +extern uint32_t EthClientServerAddrGet(void); +extern void EthClientReset(void); +void EthClientTCPDisconnect(void); + +//***************************************************************************** +// +// Exported weather related prototypes. +// +//***************************************************************************** +extern void WeatherSourceSet(tWeatherSource eWeatherSource); +extern int32_t WeatherCurrent(tWeatherSource eWeatherSource, + const char *pcQuery, + tWeatherReport *psWeather, + tEventFunction pfnEvent); +extern int32_t WeatherForecast(tWeatherSource eWeatherSource, + const char *pcQuery, + tWeatherReport *psWeather, + tEventFunction pfnEvent); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/boards/dk-tm4c129x/qs_weather/ewarm/Exe/qs_weather.bin b/boards/dk-tm4c129x/qs_weather/ewarm/Exe/qs_weather.bin new file mode 100644 index 0000000..93df16e Binary files /dev/null and b/boards/dk-tm4c129x/qs_weather/ewarm/Exe/qs_weather.bin differ diff --git a/boards/dk-tm4c129x/qs_weather/ewarm/Exe/qs_weather.out b/boards/dk-tm4c129x/qs_weather/ewarm/Exe/qs_weather.out new file mode 100644 index 0000000..dad1c37 Binary files /dev/null and b/boards/dk-tm4c129x/qs_weather/ewarm/Exe/qs_weather.out differ diff --git a/boards/dk-tm4c129x/qs_weather/gcc/qs_weather.axf b/boards/dk-tm4c129x/qs_weather/gcc/qs_weather.axf new file mode 100644 index 0000000..9b85507 Binary files /dev/null and b/boards/dk-tm4c129x/qs_weather/gcc/qs_weather.axf differ diff --git a/boards/dk-tm4c129x/qs_weather/gcc/qs_weather.bin b/boards/dk-tm4c129x/qs_weather/gcc/qs_weather.bin new file mode 100644 index 0000000..ca0216a Binary files /dev/null and b/boards/dk-tm4c129x/qs_weather/gcc/qs_weather.bin differ diff --git a/boards/dk-tm4c129x/qs_weather/images.c b/boards/dk-tm4c129x/qs_weather/images.c new file mode 100644 index 0000000..773b223 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/images.c @@ -0,0 +1,7176 @@ +//***************************************************************************** +// +// images.c - The image sets for the various weather conditions. Images are +// derived from the work by user d3stroy. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Sun Image +// +//***************************************************************************** +const uint8_t g_pui8SunImage[] = +{ + IMAGE_FMT_8BPP_COMP, + 128, 0, + 128, 0, + + 255, + 0x00, 0x00, 0x00, + 0x00, 0x78, 0xd3, + 0x00, 0x7c, 0xef, + 0x00, 0x7e, 0xef, + 0x00, 0x7f, 0xef, + 0x00, 0x80, 0xef, + 0x00, 0x81, 0xef, + 0x00, 0x82, 0xef, + 0x01, 0x82, 0xef, + 0x00, 0x83, 0xef, + 0x00, 0x83, 0xf0, + 0x01, 0x84, 0xf1, + 0x00, 0x84, 0xf2, + 0x02, 0x85, 0xf0, + 0x00, 0x85, 0xf4, + 0x00, 0x86, 0xf5, + 0x07, 0x89, 0xf2, + 0x00, 0x88, 0xf7, + 0x00, 0x89, 0xfa, + 0x00, 0x8a, 0xfb, + 0x00, 0x8b, 0xfd, + 0x00, 0x8b, 0xfe, + 0x09, 0x8f, 0xf4, + 0x00, 0x8c, 0xfe, + 0x00, 0x8c, 0xff, + 0x00, 0x8d, 0xfe, + 0x00, 0x8d, 0xff, + 0x00, 0x8e, 0xff, + 0x00, 0x8f, 0xfe, + 0x00, 0x8f, 0xff, + 0x00, 0x90, 0xff, + 0x00, 0x91, 0xff, + 0x01, 0x91, 0xff, + 0x00, 0x94, 0xfa, + 0x00, 0x92, 0xfe, + 0x05, 0x91, 0xff, + 0x00, 0x92, 0xff, + 0x00, 0x93, 0xff, + 0x01, 0x93, 0xff, + 0x00, 0x99, 0xf4, + 0x00, 0x94, 0xfe, + 0x00, 0x94, 0xff, + 0x00, 0x95, 0xfe, + 0x00, 0x95, 0xff, + 0x01, 0x95, 0xff, + 0x00, 0x96, 0xfe, + 0x04, 0x97, 0xfb, + 0x00, 0x9b, 0xf5, + 0x00, 0x96, 0xff, + 0x01, 0x96, 0xff, + 0x00, 0x98, 0xfd, + 0x17, 0x97, 0xf8, + 0x00, 0x9d, 0xf5, + 0x00, 0x9c, 0xf7, + 0x01, 0x98, 0xff, + 0x0c, 0x97, 0xfe, + 0x00, 0x9e, 0xf7, + 0x00, 0x9a, 0xff, + 0x00, 0x9b, 0xff, + 0x00, 0x9d, 0xfc, + 0x01, 0xa0, 0xf7, + 0x00, 0xa0, 0xf9, + 0x03, 0xa0, 0xfa, + 0x01, 0xa2, 0xf7, + 0x01, 0x9e, 0xff, + 0x00, 0xa1, 0xfb, + 0x0b, 0xa1, 0xf7, + 0x00, 0x9f, 0xff, + 0x01, 0xa2, 0xf9, + 0x18, 0x9c, 0xfd, + 0x00, 0xa0, 0xff, + 0x18, 0x9f, 0xf9, + 0x01, 0xa5, 0xf7, + 0x01, 0xa3, 0xfc, + 0x00, 0xa3, 0xff, + 0x01, 0xa5, 0xfb, + 0x00, 0xa5, 0xfd, + 0x01, 0xa8, 0xf7, + 0x01, 0xa4, 0xff, + 0x00, 0xa5, 0xfe, + 0x04, 0xa5, 0xfd, + 0x20, 0x9f, 0xff, + 0x0b, 0xa4, 0xfd, + 0x01, 0xa7, 0xfb, + 0x01, 0xa6, 0xfd, + 0x01, 0xa5, 0xff, + 0x17, 0xa4, 0xfa, + 0x02, 0xa6, 0xfe, + 0x00, 0xa7, 0xfe, + 0x01, 0xab, 0xf6, + 0x00, 0xa8, 0xfd, + 0x01, 0xa7, 0xff, + 0x1f, 0xa4, 0xfa, + 0x01, 0xa8, 0xfe, + 0x00, 0xa8, 0xff, + 0x01, 0xab, 0xf9, + 0x01, 0xa9, 0xfd, + 0x02, 0xaa, 0xfc, + 0x00, 0xa9, 0xff, + 0x03, 0xa9, 0xff, + 0x02, 0xad, 0xf8, + 0x05, 0xa9, 0xff, + 0x01, 0xaa, 0xff, + 0x27, 0xa5, 0xfc, + 0x02, 0xad, 0xfa, + 0x01, 0xb0, 0xf5, + 0x01, 0xac, 0xfd, + 0x28, 0xa4, 0xff, + 0x01, 0xaf, 0xf8, + 0x02, 0xad, 0xfc, + 0x0a, 0xaa, 0xff, + 0x01, 0xac, 0xff, + 0x03, 0xb0, 0xf7, + 0x04, 0xac, 0xff, + 0x02, 0xad, 0xfe, + 0x01, 0xad, 0xff, + 0x01, 0xb3, 0xf4, + 0x00, 0xae, 0xff, + 0x01, 0xae, 0xff, + 0x01, 0xb3, 0xf6, + 0x0f, 0xac, 0xff, + 0x02, 0xb0, 0xfc, + 0x01, 0xaf, 0xff, + 0x27, 0xac, 0xf7, + 0x02, 0xb3, 0xf7, + 0x02, 0xaf, 0xff, + 0x15, 0xac, 0xfe, + 0x04, 0xaf, 0xff, + 0x1a, 0xac, 0xfd, + 0x20, 0xac, 0xfb, + 0x00, 0xb0, 0xff, + 0x01, 0xb3, 0xf9, + 0x01, 0xb1, 0xfd, + 0x01, 0xb0, 0xff, + 0x32, 0xa9, 0xfb, + 0x08, 0xaf, 0xff, + 0x02, 0xb3, 0xfa, + 0x01, 0xb5, 0xf7, + 0x01, 0xb3, 0xfb, + 0x01, 0xb1, 0xff, + 0x0c, 0xaf, 0xff, + 0x02, 0xb2, 0xfe, + 0x00, 0xb2, 0xff, + 0x01, 0xb3, 0xfd, + 0x01, 0xb2, 0xff, + 0x32, 0xa9, 0xff, + 0x00, 0xb3, 0xfe, + 0x06, 0xb5, 0xf8, + 0x00, 0xb3, 0xff, + 0x39, 0xa9, 0xfe, + 0x28, 0xac, 0xff, + 0x01, 0xb5, 0xfc, + 0x01, 0xb5, 0xfd, + 0x01, 0xb4, 0xff, + 0x06, 0xb7, 0xf8, + 0x02, 0xb5, 0xfe, + 0x06, 0xb4, 0xff, + 0x01, 0xb5, 0xff, + 0x0d, 0xb4, 0xfd, + 0x3f, 0xab, 0xfe, + 0x13, 0xb3, 0xff, + 0x0c, 0xb8, 0xf8, + 0x01, 0xb7, 0xfe, + 0x07, 0xb7, 0xfe, + 0x19, 0xb4, 0xff, + 0x32, 0xb2, 0xfa, + 0x11, 0xb9, 0xf9, + 0x24, 0xb4, 0xfd, + 0x1f, 0xb4, 0xff, + 0x00, 0xba, 0xff, + 0x3f, 0xaf, 0xfe, + 0x32, 0xb1, 0xff, + 0x1e, 0xb5, 0xff, + 0x13, 0xb8, 0xff, + 0x2a, 0xb5, 0xfd, + 0x25, 0xb5, 0xff, + 0x3c, 0xb3, 0xfc, + 0x00, 0xbd, 0xff, + 0x06, 0xbd, 0xfe, + 0x1b, 0xbc, 0xf9, + 0x0c, 0xbc, 0xff, + 0x12, 0xbc, 0xfe, + 0x44, 0xb4, 0xfc, + 0x1c, 0xba, 0xff, + 0x1d, 0xbb, 0xff, + 0x2b, 0xba, 0xfe, + 0x24, 0xbc, 0xfd, + 0x01, 0xc2, 0xff, + 0x37, 0xb9, 0xfe, + 0x40, 0xb9, 0xfd, + 0x30, 0xbd, 0xfb, + 0x49, 0xb9, 0xfc, + 0x29, 0xc0, 0xfa, + 0x23, 0xc0, 0xfd, + 0x1d, 0xc1, 0xfe, + 0x31, 0xbd, 0xff, + 0x14, 0xc4, 0xff, + 0x37, 0xbe, 0xfe, + 0x51, 0xbc, 0xfa, + 0x29, 0xc1, 0xff, + 0x32, 0xc3, 0xfb, + 0x40, 0xbf, 0xfe, + 0x49, 0xbe, 0xfd, + 0x3a, 0xc4, 0xfb, + 0x40, 0xc5, 0xf7, + 0x1c, 0xc8, 0xff, + 0x52, 0xc0, 0xfd, + 0x5a, 0xc1, 0xfa, + 0x3a, 0xc5, 0xfe, + 0x32, 0xc6, 0xff, + 0x23, 0xc9, 0xff, + 0x41, 0xc5, 0xfc, + 0x29, 0xc8, 0xff, + 0x42, 0xc4, 0xfe, + 0x48, 0xc6, 0xfa, + 0x49, 0xc4, 0xfe, + 0x60, 0xc3, 0xf8, + 0x29, 0xcc, 0xff, + 0x4f, 0xc6, 0xfd, + 0x55, 0xc5, 0xfd, + 0x51, 0xc9, 0xfa, + 0x2f, 0xcd, 0xff, + 0x49, 0xca, 0xfc, + 0x68, 0xc7, 0xf8, + 0x5c, 0xc7, 0xfd, + 0x62, 0xc7, 0xfb, + 0x34, 0xce, 0xff, + 0x59, 0xca, 0xfb, + 0x6c, 0xc8, 0xf8, + 0x39, 0xce, 0xff, + 0x41, 0xcd, 0xff, + 0x53, 0xcc, 0xfb, + 0x62, 0xcb, 0xfa, + 0x60, 0xca, 0xfd, + 0x5b, 0xcc, 0xfb, + 0x62, 0xcc, 0xf9, + 0x3b, 0xd1, 0xff, + 0x6c, 0xcc, 0xf8, + 0x72, 0xcc, 0xf6, + 0x6a, 0xcc, 0xfb, + 0x6b, 0xce, 0xf7, + 0x6a, 0xcd, 0xfa, + 0x62, 0xcf, 0xfa, + 0x71, 0xce, 0xf8, + 0x41, 0xd4, 0xff, + 0x6a, 0xd0, 0xfb, + 0x48, 0xd6, 0xff, + 0x73, 0xd4, 0xfd, + 0x6d, 0xd5, 0xff, + 0x72, 0xd7, 0xfe, + 0x76, 0xd8, 0xfe, + 0x73, 0xda, 0xff, + 0x78, 0xdc, 0xff, + 0x7c, 0xdc, 0xff, + 0x77, 0xdd, 0xff, + 0x86, 0xe0, 0xff, + + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x7f, 0x4a, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x7f, 0x39, 0x07, 0x07, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x43, + 0x7f, 0x30, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x2a, 0x7f, 0x30, 0x07, 0x07, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x30, + 0x31, 0x30, 0x43, 0x07, 0x07, 0x00, 0x00, 0x01, 0x5f, 0xff, 0x17, 0x77, + 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x38, 0x00, 0x43, 0x5f, 0x5f, 0x59, + 0x30, 0x30, 0x2a, 0xc7, 0x47, 0x07, 0x00, 0x00, 0x39, 0x5f, 0x17, 0x77, + 0xfc, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x43, 0x60, 0x2a, 0x07, + 0x07, 0x00, 0x2a, 0x30, 0x30, 0x30, 0x67, 0x4a, 0x47, 0x07, 0x43, 0x30, + 0x67, 0x1f, 0x77, 0xfc, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x43, + 0x31, 0x30, 0x39, 0x07, 0x07, 0x30, 0x30, 0x30, 0x4f, 0x9f, 0x17, 0x00, + 0x4f, 0x67, 0x2f, 0x87, 0x3f, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x01, + 0x01, 0x30, 0x30, 0x60, 0x43, 0x07, 0x05, 0x39, 0x2b, 0x2b, 0x2b, 0x2b, + 0x61, 0x2b, 0x57, 0x0d, 0x01, 0x2a, 0x30, 0x43, 0x67, 0xff, 0x1f, 0x77, + 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x02, 0x00, 0x00, 0x2b, 0x30, 0x30, + 0x43, 0x07, 0x00, 0x22, 0x00, 0x8e, 0x01, 0x29, 0x29, 0x29, 0xe9, 0x39, + 0xc1, 0x57, 0x0b, 0x01, 0x2a, 0x30, 0x30, 0x43, 0x6f, 0xff, 0x27, 0x77, + 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x01, 0x00, 0x00, 0x30, 0x30, 0x30, + 0x30, 0x43, 0x07, 0x00, 0x00, 0x58, 0x00, 0x00, 0x36, 0x25, 0x25, 0x25, + 0xa8, 0xe9, 0x25, 0x5f, 0xa9, 0x09, 0x01, 0x2a, 0x30, 0x1f, 0x30, 0x30, + 0x43, 0x6f, 0x27, 0x77, 0x2f, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x07, 0x00, + 0x00, 0x30, 0x30, 0x08, 0x30, 0x30, 0x2b, 0x43, 0x07, 0x5e, 0x75, 0x00, + 0x11, 0x24, 0x24, 0x24, 0xe9, 0x24, 0x24, 0x30, 0x5e, 0x00, 0x4c, 0x00, + 0x00, 0x01, 0x28, 0x2b, 0x30, 0x2b, 0x3f, 0x30, 0x43, 0x76, 0x36, 0x87, + 0x3f, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x02, 0x30, 0x2b, 0x2b, 0x2b, + 0x10, 0x29, 0x29, 0x40, 0x06, 0x58, 0x5e, 0x24, 0x1f, 0x21, 0x1f, 0x1f, + 0xe9, 0x1e, 0x1f, 0x1f, 0x46, 0x5c, 0x00, 0x75, 0x75, 0x00, 0x01, 0x22, + 0x29, 0x2b, 0x29, 0x1f, 0x2b, 0x30, 0x43, 0x7c, 0x4c, 0xa7, 0x5f, 0x17, + 0xf8, 0x07, 0x07, 0x07, 0x07, 0x06, 0x2b, 0x2b, 0x29, 0x04, 0x25, 0x25, + 0x25, 0x25, 0x3a, 0x05, 0x5e, 0x30, 0x19, 0x1e, 0x1e, 0x1e, 0xe9, 0xd1, + 0x1d, 0x1c, 0x6d, 0x00, 0x5e, 0x43, 0x22, 0x25, 0x25, 0x29, 0x29, 0x29, + 0x3f, 0x29, 0x4a, 0x7c, 0x4c, 0xa7, 0x5f, 0x17, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x06, 0x36, 0x29, 0x25, 0x24, 0x02, 0x24, 0x24, 0x1f, 0x1f, 0x1c, + 0x30, 0x02, 0x8e, 0x0c, 0x2b, 0x1b, 0x1b, 0x1b, 0xe9, 0xd3, 0x1d, 0x19, + 0x40, 0x43, 0x61, 0x58, 0x5e, 0x3a, 0x1e, 0x1f, 0x24, 0x03, 0x24, 0x25, + 0x25, 0x25, 0x29, 0x62, 0x89, 0x71, 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x07, 0x07, 0x07, 0x80, 0x03, 0x62, 0x00, 0x00, 0x22, 0x25, 0x24, 0x1f, + 0x00, 0x1f, 0x1f, 0x1e, 0x1e, 0x1e, 0x1d, 0x25, 0x40, 0x03, 0x00, 0x40, + 0x17, 0x1a, 0x1a, 0x1a, 0xe9, 0xd1, 0x40, 0x1b, 0xdb, 0x24, 0x43, 0x4a, + 0x36, 0x1d, 0x1d, 0x00, 0x1e, 0x1e, 0x1f, 0x1f, 0x24, 0x24, 0x24, 0x25, + 0x0f, 0x40, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xf1, 0x17, 0x07, + 0x07, 0x02, 0x25, 0x25, 0x25, 0x07, 0x80, 0x05, 0x6f, 0x62, 0x00, 0x24, + 0x24, 0x1f, 0x1f, 0x00, 0x1e, 0x1e, 0x1d, 0x1d, 0x1b, 0x1b, 0x19, 0x1a, + 0x00, 0x1b, 0x14, 0x12, 0x11, 0x0f, 0x0e, 0x0c, 0x0a, 0x00, 0x09, 0x07, + 0x09, 0x09, 0x0a, 0x0c, 0x0e, 0x0f, 0x00, 0x11, 0x12, 0x14, 0x1a, 0x1a, + 0x19, 0x1b, 0x1b, 0x00, 0x1b, 0x1d, 0x1d, 0x1e, 0x1e, 0x1f, 0x1f, 0x24, + 0x0f, 0x3a, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xf0, 0x17, 0x07, + 0x07, 0x03, 0x25, 0x25, 0x25, 0x25, 0xc0, 0x07, 0x03, 0x8e, 0x58, 0x4a, + 0x1f, 0x1f, 0x1e, 0x00, 0x1d, 0x1d, 0x1b, 0x1b, 0x1a, 0x1a, 0x17, 0x12, + 0x00, 0x0e, 0x0a, 0x09, 0x09, 0x07, 0x05, 0x04, 0x03, 0x10, 0x02, 0x02, + 0x02, 0xe9, 0x04, 0x05, 0x05, 0x07, 0x00, 0x09, 0x09, 0x0a, 0x0e, 0x12, + 0x17, 0x1a, 0x1a, 0x00, 0x1b, 0x1b, 0x1d, 0x1d, 0x1e, 0x1e, 0x1f, 0x39, + 0x1d, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa4, 0x43, 0x6f, 0xf0, 0x27, 0x77, + 0x2f, 0x06, 0x25, 0x30, 0x25, 0x25, 0xc0, 0x07, 0x02, 0x62, 0x5e, 0x43, + 0x1e, 0x1d, 0x1d, 0x00, 0x1b, 0x19, 0x1a, 0x17, 0x11, 0x0c, 0x09, 0x09, + 0x00, 0x05, 0x02, 0x16, 0x47, 0x7b, 0xc8, 0xd0, 0xf4, 0x00, 0xf6, 0xf6, + 0xf6, 0xf6, 0xf6, 0xe7, 0xe0, 0xc6, 0x00, 0xc5, 0x7b, 0x47, 0x16, 0x02, + 0x05, 0x07, 0x09, 0x00, 0x0c, 0x11, 0x17, 0x1a, 0x19, 0x1b, 0x1b, 0x1d, + 0x07, 0x1e, 0x2b, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa2, 0x1f, 0x4f, 0x2a, + 0x4f, 0x6f, 0x27, 0x77, 0x2f, 0x06, 0x02, 0x25, 0x43, 0x30, 0x25, 0x25, + 0x25, 0x07, 0x00, 0x00, 0x00, 0x30, 0x5e, 0x30, 0x1d, 0x1b, 0x19, 0x1a, + 0x00, 0x12, 0x0e, 0x07, 0x09, 0x03, 0x10, 0x5c, 0xcb, 0x00, 0xf6, 0xf6, + 0xf6, 0xf4, 0xf4, 0xf4, 0xec, 0xec, 0x58, 0xec, 0xe9, 0xec, 0xb1, 0x81, + 0xf6, 0xc8, 0x47, 0x00, 0x10, 0x04, 0x07, 0x09, 0x0e, 0x12, 0x1a, 0x19, + 0x01, 0x1b, 0x1b, 0x1d, 0x30, 0x00, 0x00, 0x00, 0xe9, 0x10, 0x00, 0x94, + 0x94, 0xba, 0x25, 0x39, 0x30, 0x2a, 0xfc, 0x7d, 0x45, 0x97, 0x4f, 0x07, + 0x03, 0x25, 0x2a, 0x04, 0x2b, 0x25, 0x25, 0x25, 0x25, 0x87, 0x25, 0x4f, + 0x00, 0x1a, 0x19, 0x1b, 0x12, 0x0c, 0x09, 0x06, 0x09, 0x00, 0x5c, 0xcb, + 0xf6, 0xf4, 0xf4, 0xec, 0xec, 0xe5, 0x04, 0xe2, 0xe2, 0xdd, 0xdd, 0xdd, + 0xe9, 0xdd, 0xdd, 0x00, 0xe2, 0xe2, 0xe2, 0xe5, 0xec, 0xec, 0xf4, 0xf4, + 0x00, 0xf6, 0xf6, 0xd0, 0x56, 0x09, 0x06, 0x09, 0x0c, 0x00, 0x12, 0x1a, + 0x19, 0x1b, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x94, 0x94, + 0x94, 0x00, 0x00, 0x03, 0x25, 0x25, 0x30, 0x30, 0x30, 0x4f, 0x7b, 0x53, + 0xf0, 0xb7, 0x6f, 0x27, 0x07, 0x00, 0x4f, 0x30, 0x23, 0x02, 0x26, 0x2b, + 0x25, 0x25, 0x25, 0x25, 0x03, 0x25, 0x00, 0x25, 0x1c, 0x1a, 0x13, 0x0c, + 0x09, 0x05, 0x16, 0x00, 0xa5, 0xf6, 0xf4, 0xf4, 0xe5, 0xe2, 0xe2, 0xdd, + 0x00, 0xdd, 0xd9, 0xd9, 0xd9, 0xd2, 0xd2, 0xcd, 0xcd, 0x40, 0xcd, 0xe9, + 0xd2, 0xd2, 0xd9, 0xd9, 0xdd, 0xdd, 0x00, 0xe2, 0xe2, 0xe5, 0xec, 0xf4, + 0xf6, 0xf6, 0xa5, 0x00, 0x16, 0x05, 0x09, 0x0c, 0x13, 0x1a, 0x19, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x75, 0x58, 0x94, 0x94, 0x01, 0x4a, 0x39, + 0x2b, 0x30, 0x30, 0x30, 0x2a, 0x89, 0xfc, 0x71, 0xd4, 0xa7, 0x5f, 0x17, + 0x07, 0x25, 0x2a, 0x00, 0x26, 0x23, 0x29, 0x2b, 0x25, 0x25, 0x25, 0x46, + 0x80, 0xe1, 0x25, 0x25, 0x19, 0x17, 0x0f, 0x09, 0x06, 0x00, 0x10, 0xbe, + 0xf4, 0xf4, 0xe5, 0xe2, 0xe2, 0xdd, 0x00, 0xd9, 0xd9, 0xd2, 0xd2, 0xe2, + 0xf6, 0xf2, 0xfb, 0x08, 0xfd, 0xff, 0xff, 0xff, 0xe9, 0xfd, 0xfb, 0xf2, + 0x00, 0xf6, 0xe2, 0xd2, 0xd2, 0xd9, 0xdd, 0xdd, 0xe2, 0x00, 0xe5, 0xec, + 0xf4, 0xf6, 0xbe, 0x10, 0x05, 0x09, 0x00, 0x0f, 0x17, 0x19, 0x24, 0x94, + 0xa2, 0x58, 0x4f, 0x00, 0x46, 0x30, 0x22, 0x29, 0x2b, 0x2b, 0x30, 0x30, + 0x0f, 0x30, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xc0, 0x17, 0x07, + 0x00, 0x00, 0x25, 0x2b, 0x29, 0x20, 0x00, 0x29, 0x25, 0x24, 0x24, 0x1f, + 0x1e, 0x1e, 0x1d, 0x00, 0x19, 0x1a, 0x12, 0x0a, 0x07, 0x0d, 0x7b, 0xf4, + 0x00, 0xec, 0xe5, 0xe2, 0xdd, 0xd4, 0xd2, 0xd2, 0xd9, 0x00, 0xf6, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x24, 0xfd, 0xfd, 0xe9, 0xfd, 0xfd, + 0x9b, 0xfb, 0xf6, 0x00, 0xdd, 0xd2, 0xd4, 0xdd, 0xdd, 0xe5, 0xec, 0xf4, + 0x00, 0xf6, 0xa5, 0x0d, 0x07, 0x0a, 0x12, 0x1a, 0x19, 0x00, 0x1a, 0x1b, + 0x1d, 0x1e, 0x24, 0x24, 0x25, 0x29, 0x01, 0x2b, 0x2b, 0x30, 0x39, 0x00, + 0x00, 0x00, 0xe9, 0xf8, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x00, 0x00, 0x25, + 0x00, 0x39, 0x2b, 0x29, 0x20, 0x24, 0x24, 0x1f, 0x1e, 0x00, 0x1d, 0x1d, + 0x19, 0x1a, 0x0f, 0x09, 0x05, 0x47, 0x00, 0xe6, 0xe6, 0xe5, 0xe2, 0xdd, + 0xd4, 0xd2, 0xd2, 0x00, 0xf6, 0xfb, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xfe, + 0x20, 0xfe, 0xfe, 0xe9, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0x00, 0xfc, 0xfe, + 0xfc, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xf6, 0xd2, 0xd2, 0xd4, + 0xdd, 0xe2, 0xe5, 0x00, 0xf4, 0xde, 0x47, 0x03, 0x09, 0x0f, 0x18, 0x19, + 0x00, 0x1b, 0x1d, 0x1e, 0x1f, 0x1f, 0x24, 0x25, 0x29, 0x07, 0x2b, 0x2b, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xf0, 0x5f, 0x17, 0x07, 0x02, 0x4a, + 0x29, 0x25, 0x24, 0x00, 0x24, 0x1e, 0x1e, 0x1d, 0x1b, 0x19, 0x14, 0x0c, + 0x00, 0x09, 0x0d, 0x9f, 0xf4, 0xec, 0xe2, 0xdd, 0xd4, 0x00, 0xd2, 0xd4, + 0xe7, 0xfd, 0xff, 0xfd, 0xfc, 0xfe, 0x38, 0xfe, 0xfe, 0xe9, 0xd4, 0xa7, + 0xfc, 0xfd, 0xff, 0x00, 0xff, 0xff, 0xea, 0xd4, 0xd2, 0xd4, 0xdd, 0xe5, + 0x00, 0xe6, 0xf6, 0xbe, 0x0d, 0x07, 0x0c, 0x14, 0x19, 0x00, 0x1b, 0x1d, + 0x1e, 0x1f, 0x1f, 0x24, 0x25, 0x29, 0x0f, 0x28, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0xe0, 0x17, 0x07, 0x02, 0x25, 0x22, 0x24, 0x24, 0x1e, + 0x00, 0x1b, 0x1d, 0x1b, 0x1a, 0x14, 0x0a, 0x06, 0x16, 0x00, 0xe6, 0xe6, + 0xe5, 0xd1, 0xd4, 0xd2, 0xd2, 0xe7, 0x01, 0xfd, 0xfd, 0xfc, 0xfe, 0xfb, + 0xfb, 0xfb, 0xe9, 0x01, 0xfb, 0xfb, 0xfa, 0xfa, 0xf7, 0xf7, 0xf7, 0xe9, + 0x02, 0xfa, 0xfa, 0xfa, 0xfb, 0xfe, 0xfe, 0xe9, 0xfb, 0x00, 0xfc, 0xfd, + 0xff, 0xff, 0xe7, 0xd2, 0xd4, 0xd4, 0x00, 0xe2, 0xe5, 0xe6, 0xe6, 0x16, + 0x06, 0x0a, 0x13, 0x00, 0x1a, 0x1b, 0x1d, 0x23, 0x1f, 0x1f, 0x24, 0x25, + 0x0f, 0x4a, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xc8, 0x17, 0x07, + 0x00, 0x62, 0x01, 0x40, 0x24, 0x1f, 0x00, 0x1e, 0x1d, 0x15, 0x1a, 0x13, + 0x09, 0x05, 0x47, 0x00, 0xe6, 0xe6, 0xd1, 0xd4, 0xd4, 0xc2, 0xe6, 0xfd, + 0x04, 0xfd, 0xfc, 0xfb, 0xfb, 0xfb, 0xe9, 0xf9, 0xf7, 0x06, 0xf3, 0xf3, + 0xee, 0xee, 0xee, 0xe9, 0xd4, 0xf3, 0x20, 0xf7, 0xf7, 0x3c, 0xfe, 0xfd, + 0xff, 0xfd, 0xe6, 0x00, 0xc1, 0xd4, 0xd1, 0xe5, 0xe6, 0xe6, 0x47, 0x04, + 0x00, 0x09, 0x12, 0x1a, 0x1b, 0x1d, 0x1e, 0x1e, 0x24, 0x0f, 0x24, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xc0, 0x17, 0x07, 0x00, 0x00, 0x62, + 0xa2, 0x30, 0x25, 0x00, 0x25, 0x1f, 0x1e, 0x1d, 0x1b, 0x1a, 0x12, 0x09, + 0x00, 0x04, 0x7b, 0xe6, 0xd0, 0xd1, 0xd4, 0xc1, 0xc1, 0x02, 0xf2, 0xfd, + 0xfc, 0xf9, 0xf9, 0xf9, 0xe9, 0xf7, 0x0c, 0xf3, 0xee, 0xee, 0xee, 0xe9, + 0xd1, 0xf3, 0xf3, 0x60, 0xf3, 0xe2, 0x7a, 0xf3, 0xf7, 0xf9, 0xfb, 0xf9, + 0x00, 0xf9, 0xfb, 0xfa, 0xfd, 0xff, 0xf8, 0xc7, 0xc7, 0x00, 0xd4, 0xd1, + 0xe6, 0xde, 0x5c, 0x04, 0x0a, 0x12, 0x00, 0x1a, 0x1b, 0x1d, 0x1e, 0x1f, + 0x30, 0x00, 0x00, 0x7f, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x01, + 0x00, 0x62, 0x58, 0x58, 0x5e, 0x1e, 0x1d, 0x1b, 0x1a, 0x00, 0x13, 0x09, + 0x04, 0x7b, 0xe6, 0xd0, 0xd1, 0xc7, 0x00, 0xc1, 0xd1, 0xfa, 0xfd, 0xf9, + 0xf8, 0xf8, 0xf8, 0x02, 0xf8, 0xf9, 0xf3, 0xe4, 0xe4, 0xe4, 0xe9, 0xee, + 0x13, 0xee, 0xf3, 0xee, 0xe1, 0xf3, 0xf3, 0xe9, 0xd4, 0x80, 0xa1, 0xf9, + 0xf9, 0xf9, 0xf9, 0xf9, 0xfa, 0xfd, 0x00, 0xfd, 0xd1, 0xc1, 0xc7, 0xd1, + 0xd0, 0xe6, 0x7b, 0x00, 0x03, 0x09, 0x12, 0x1a, 0x1b, 0x1d, 0x1e, 0x39, + 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xc0, 0x07, 0x02, + 0x62, 0x5e, 0x62, 0x24, 0x1d, 0x19, 0x00, 0x14, 0x09, 0x04, 0x7b, 0xe6, + 0xd0, 0xd1, 0xc7, 0x00, 0xc2, 0xe6, 0xfd, 0xf9, 0xf8, 0xf8, 0xf8, 0xf8, + 0x04, 0xf8, 0xf3, 0xe4, 0xe4, 0xe4, 0xe9, 0xe4, 0xe4, 0x0e, 0xed, 0xed, + 0xf3, 0xf3, 0xe9, 0xca, 0xb9, 0xf0, 0xc0, 0xd2, 0xb2, 0xf9, 0xf8, 0xf9, + 0xf9, 0xf9, 0xfa, 0x00, 0xfd, 0xde, 0xc1, 0xc7, 0xd1, 0xd0, 0xe6, 0x7b, + 0x00, 0x04, 0x09, 0x13, 0x19, 0x1b, 0x1d, 0x00, 0x00, 0x7f, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x03, 0x00, 0x62, 0x94, 0x5e, 0x24, 0x19, + 0x14, 0x0a, 0x05, 0x00, 0x5c, 0xe6, 0xd0, 0xd1, 0xc7, 0xb8, 0xe7, 0xfa, + 0x00, 0xf9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf5, 0xe4, 0xe4, 0x63, 0xe4, 0xe9, + 0xd4, 0xed, 0xed, 0xed, 0xe9, 0xd4, 0x0c, 0xed, 0xf0, 0xf0, 0xf0, 0xe9, + 0xd1, 0xf5, 0xf8, 0x00, 0xf8, 0xf8, 0xf8, 0xf9, 0xfd, 0xe7, 0xb8, 0xc7, + 0x00, 0xd1, 0xd0, 0xe6, 0x7b, 0x05, 0x0a, 0x14, 0x19, 0x0f, 0x1b, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xe0, 0x17, 0x07, 0x04, 0x62, 0x75, + 0x1c, 0x1a, 0x0c, 0x00, 0x06, 0x47, 0xd5, 0xd0, 0xc3, 0xc7, 0xb8, 0xe7, + 0x00, 0xfa, 0xf8, 0xf5, 0xf8, 0xf5, 0xf5, 0xe4, 0xdf, 0x01, 0xdf, 0xdf, + 0xe4, 0xdf, 0xe4, 0xe4, 0xe4, 0xe9, 0x00, 0xe4, 0xe4, 0xed, 0xef, 0xed, + 0xef, 0xf1, 0xf1, 0x42, 0xf1, 0xe9, 0xf1, 0xf1, 0xf0, 0xf0, 0xe2, 0xf0, + 0x80, 0xe9, 0xf0, 0xf0, 0xf5, 0xf8, 0xf8, 0xf8, 0xf8, 0x00, 0xfd, 0xe3, + 0xb8, 0xc7, 0xc3, 0xd0, 0xde, 0x47, 0x00, 0x06, 0x0c, 0x18, 0x19, 0x3a, + 0x00, 0x00, 0x00, 0xfe, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x04, 0x4f, + 0x00, 0x1a, 0x0f, 0x09, 0x16, 0xd5, 0xd0, 0xc3, 0xc7, 0x00, 0xb8, 0xe7, + 0xf7, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0x10, 0xdf, 0xdf, 0xdf, 0xe9, 0xdf, + 0xdf, 0xe4, 0xdf, 0x00, 0xe4, 0xdf, 0xdf, 0xef, 0xef, 0xef, 0xef, 0xf1, + 0x0d, 0xef, 0xf1, 0xf1, 0xf1, 0xe9, 0xd4, 0xf0, 0xe9, 0x00, 0xf1, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf5, 0xf5, 0xf5, 0x00, 0xf5, 0xf8, 0xfa, 0xe7, 0xb8, + 0xc7, 0xc3, 0xd0, 0x00, 0xd7, 0x16, 0x07, 0x0f, 0x18, 0x24, 0x00, 0x00, + 0x7f, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x03, 0x00, 0x25, 0x25, + 0x12, 0x09, 0x0d, 0xd5, 0xd5, 0xc5, 0x00, 0xb9, 0xb8, 0xd7, 0xf7, 0xf5, + 0xf2, 0xf2, 0xf5, 0x0c, 0xef, 0xdf, 0xdf, 0xdf, 0xe9, 0xd4, 0xdf, 0xdf, + 0x18, 0xef, 0xef, 0xef, 0xe9, 0xd3, 0xf1, 0xf1, 0xf1, 0xc0, 0xe9, 0xd3, + 0xf0, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, + 0xfa, 0xd7, 0xb8, 0x00, 0xb9, 0xc5, 0xd0, 0xd5, 0x0d, 0x07, 0x12, 0x19, + 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x94, 0xfc, 0xcb, 0xa3, + 0xb7, 0x6f, 0x27, 0x04, 0x25, 0x25, 0x00, 0x19, 0x17, 0x0a, 0x04, 0xa5, + 0xd5, 0xc5, 0xb9, 0x00, 0xaf, 0xc5, 0xf7, 0xf2, 0xe9, 0xe9, 0xe9, 0xe1, + 0x01, 0xd8, 0xd8, 0xd8, 0xd8, 0xdf, 0xdf, 0xdf, 0xe9, 0x00, 0xdf, 0xdf, + 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe8, 0x38, 0xe8, 0xe8, 0xe9, 0xd4, 0xa1, + 0xeb, 0xe8, 0xf2, 0x18, 0xeb, 0xeb, 0xeb, 0xe9, 0xd2, 0xe9, 0xe8, 0xef, + 0x00, 0xf5, 0xf7, 0xc5, 0xaf, 0xb9, 0xc5, 0xd5, 0xa5, 0x00, 0x04, 0x0a, + 0x15, 0x19, 0x36, 0x78, 0x45, 0x50, 0x07, 0x5e, 0x94, 0x00, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x80, 0x5d, 0x30, 0x30, 0x30, 0x43, 0x43, 0x4a, 0x25, + 0x30, 0x25, 0x25, 0xe9, 0xd1, 0x40, 0x29, 0x1b, 0x1a, 0x00, 0x0f, 0x09, + 0x33, 0xd7, 0xc5, 0xb9, 0xaf, 0xb9, 0x00, 0xf5, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe1, 0xd8, 0xd8, 0x41, 0xd8, 0xe9, 0xe1, 0xd8, 0xe1, 0xe1, 0xe1, 0xe9, + 0x07, 0xe1, 0xe1, 0xe8, 0xe8, 0xe8, 0xe9, 0xd4, 0xa2, 0x06, 0xeb, 0xe8, + 0xeb, 0xeb, 0xeb, 0xe9, 0xd4, 0xeb, 0x00, 0xe9, 0xe9, 0xe9, 0xef, 0xf7, + 0xb9, 0xaf, 0xb9, 0x00, 0xc5, 0xd7, 0x33, 0x07, 0x0f, 0x18, 0x1b, 0x1b, + 0x03, 0x30, 0x40, 0x40, 0x25, 0x25, 0x25, 0xe9, 0xd1, 0x03, 0x43, 0x43, + 0x43, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x88, 0xa5, 0x30, 0x30, 0x30, 0xe9, + 0x30, 0x30, 0x2b, 0x00, 0x29, 0x25, 0x24, 0x1f, 0x1e, 0x1d, 0x19, 0x13, + 0x00, 0x09, 0x0d, 0xca, 0xc9, 0xc3, 0xae, 0xa8, 0xe9, 0x00, 0xef, 0xe0, + 0xe0, 0xe9, 0xe0, 0xd8, 0xd8, 0xd8, 0xc6, 0xe9, 0xd1, 0xe1, 0xe1, 0xe1, + 0xe9, 0xd1, 0xe9, 0x01, 0xe9, 0xe1, 0xe8, 0xe9, 0xe9, 0xe9, 0xe9, 0xdb, + 0x80, 0xca, 0xe8, 0xe9, 0xea, 0xe8, 0xeb, 0xeb, 0xeb, 0xe0, 0xe9, 0xd2, + 0x29, 0xef, 0xe9, 0xa8, 0xaf, 0xc3, 0x00, 0xc9, 0xc9, 0x0d, 0x07, 0x13, + 0x19, 0x1b, 0x1d, 0x00, 0x1e, 0x1f, 0x25, 0x29, 0x2b, 0x2b, 0x30, 0x30, + 0x00, 0x30, 0x30, 0x30, 0x2a, 0x4f, 0x00, 0x00, 0x00, 0xf0, 0xe9, 0xd4, + 0xa7, 0x23, 0x30, 0x2b, 0x2b, 0x29, 0x00, 0x25, 0x24, 0x1f, 0x1d, 0x1b, + 0x1b, 0x0c, 0x06, 0x00, 0x86, 0xc9, 0xbc, 0xae, 0xa8, 0xca, 0xef, 0xe0, + 0x00, 0xe0, 0xe0, 0xe0, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0x10, 0xd8, 0xd8, + 0xd8, 0xe9, 0xe1, 0xe1, 0xe1, 0xe1, 0x00, 0xe1, 0xe9, 0xe9, 0xe0, 0xe0, + 0xe9, 0xe9, 0xe9, 0x81, 0xe9, 0xe9, 0xe9, 0xea, 0xe9, 0xea, 0xea, 0xe2, + 0xe0, 0xd1, 0xdb, 0xb4, 0xe0, 0xe0, 0xe0, 0xe0, 0xef, 0x00, 0xd7, 0xa8, + 0xb9, 0xbc, 0xc9, 0x67, 0x05, 0x0c, 0x00, 0x1a, 0x1b, 0x1d, 0x1e, 0x1f, + 0x24, 0x25, 0x29, 0x00, 0x2b, 0x30, 0x30, 0x30, 0x30, 0x2a, 0x00, 0x00, + 0x7c, 0x00, 0xe9, 0xd4, 0xa7, 0x59, 0x1a, 0x30, 0x2b, 0x00, 0x29, 0x25, + 0x24, 0x1f, 0x1e, 0x1d, 0x19, 0x12, 0x00, 0x09, 0x10, 0xd7, 0xbd, 0xb9, + 0xaf, 0xae, 0xe1, 0x01, 0xe0, 0xdb, 0xdb, 0xdb, 0xcf, 0xcf, 0xcf, 0xe9, + 0x8c, 0xd3, 0xe0, 0xe0, 0xe0, 0xe9, 0xd4, 0xe0, 0xe0, 0x01, 0xea, 0xe0, + 0xe3, 0xea, 0xea, 0xe3, 0xe3, 0xdb, 0x74, 0xe3, 0xba, 0xa1, 0x74, 0xe3, + 0x02, 0xef, 0xae, 0x00, 0xa7, 0xb9, 0xbc, 0xc9, 0x10, 0x07, 0x12, 0x19, + 0x00, 0x1b, 0x1d, 0x1f, 0x24, 0x25, 0x29, 0x2b, 0x2b, 0x03, 0x30, 0x30, + 0x2a, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xc0, 0xa7, 0x5b, 0x30, 0x30, 0x30, + 0x30, 0x2b, 0x25, 0x00, 0x24, 0x1f, 0x1f, 0x1d, 0x1b, 0x1a, 0x0c, 0x05, + 0x00, 0x86, 0xc9, 0xbc, 0xae, 0xa8, 0xce, 0xe0, 0xce, 0x04, 0xce, 0xce, + 0xc6, 0xc6, 0xc6, 0xe9, 0xcf, 0xc6, 0x10, 0xcf, 0xcf, 0xcf, 0xe9, 0xcf, + 0xcf, 0xe0, 0xe0, 0x43, 0xe0, 0xe9, 0xe0, 0xe3, 0xe3, 0xe3, 0xe9, 0xd4, + 0x82, 0xa4, 0xe7, 0xe3, 0xe7, 0xe7, 0xe7, 0xe9, 0xe7, 0x00, 0xe7, 0xdc, + 0xe3, 0xe3, 0xdb, 0xdb, 0xdb, 0xe9, 0x00, 0xdb, 0xa8, 0xae, 0xbc, 0xbd, + 0x86, 0x05, 0x0c, 0x00, 0x1a, 0x1b, 0x1d, 0x1e, 0x1f, 0x24, 0x25, 0x29, + 0x03, 0x2b, 0x2b, 0x43, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xc0, 0xa7, 0x5e, + 0x30, 0x30, 0x29, 0x25, 0x24, 0x1f, 0x00, 0x1e, 0x1d, 0x19, 0x12, 0x09, + 0x10, 0xca, 0xbd, 0x00, 0xab, 0x96, 0xab, 0xe0, 0xce, 0xce, 0xce, 0xc6, + 0x20, 0xc6, 0xc6, 0xe9, 0xc6, 0xc6, 0xce, 0xc6, 0xce, 0x0e, 0xce, 0xdb, + 0xdb, 0xdb, 0xe9, 0xd4, 0xa5, 0xe7, 0x01, 0xdb, 0xdc, 0xe7, 0xdc, 0xdc, + 0xe7, 0xe7, 0xd1, 0xb0, 0xe2, 0xdc, 0xa1, 0xda, 0xdc, 0xdc, 0xce, 0xce, + 0x00, 0xce, 0xe1, 0xab, 0x96, 0xae, 0xbc, 0xca, 0x10, 0x00, 0x07, 0x12, + 0x19, 0x1b, 0x1d, 0x1f, 0x24, 0x25, 0x03, 0x29, 0x29, 0x46, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xc0, 0xa7, 0x5f, 0x00, 0x30, 0x30, 0x25, 0x24, 0x1f, + 0x00, 0x1e, 0x1b, 0x1a, 0x0e, 0x06, 0x86, 0xbd, 0xab, 0x00, 0x96, 0x81, + 0xce, 0xce, 0xca, 0xca, 0xca, 0xc6, 0x0c, 0xbf, 0xc6, 0xc6, 0xc6, 0xe9, + 0xd1, 0xce, 0xce, 0x41, 0xce, 0xe9, 0xce, 0xce, 0xdb, 0xdb, 0xdb, 0xe9, + 0x1c, 0xda, 0xda, 0xda, 0xe9, 0xd4, 0xa1, 0xdc, 0xdc, 0xb0, 0xe9, 0xdc, + 0xe9, 0xd4, 0xdc, 0xce, 0xce, 0xce, 0x00, 0xcf, 0xce, 0x80, 0x96, 0xab, + 0xbd, 0x67, 0x06, 0x00, 0x0e, 0x18, 0x1b, 0x1d, 0x1e, 0x1f, 0x25, 0x29, + 0x0f, 0x43, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x80, 0x11, 0x30, + 0x22, 0x1f, 0x1e, 0x1d, 0x1b, 0x17, 0x00, 0x07, 0x08, 0xbf, 0xb0, 0xab, + 0x96, 0xab, 0xce, 0x01, 0xbf, 0xbf, 0xbf, 0xb6, 0xb6, 0xb6, 0xb6, 0xc9, + 0x80, 0xb1, 0xc6, 0xc6, 0xce, 0xca, 0xce, 0xce, 0xce, 0x0e, 0xce, 0xda, + 0xda, 0xda, 0xe9, 0xd4, 0xa7, 0xda, 0x10, 0xde, 0xde, 0xde, 0xe9, 0xde, + 0xde, 0xd6, 0xd6, 0x60, 0xd6, 0xe9, 0xd2, 0xca, 0xca, 0xce, 0xe0, 0xab, + 0x00, 0x96, 0xab, 0xb0, 0xbf, 0x07, 0x07, 0x17, 0x1a, 0x00, 0x1d, 0x1e, + 0x1f, 0x24, 0x40, 0x00, 0x00, 0x00, 0xf8, 0xe9, 0xd4, 0xa7, 0x5f, 0x13, + 0x30, 0x1f, 0x1e, 0x00, 0x1d, 0x1a, 0x11, 0x09, 0x33, 0xb6, 0xab, 0x96, + 0x01, 0x81, 0xb6, 0xbf, 0xbd, 0xb6, 0xb6, 0xb6, 0xe9, 0x00, 0xb6, 0xb6, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xca, 0x20, 0xca, 0xca, 0xe9, 0xca, 0xca, + 0xd7, 0xd7, 0xd7, 0xe0, 0xe9, 0xd4, 0xa6, 0xd6, 0xd7, 0xd6, 0xd6, 0xd6, + 0xe0, 0xe9, 0xd4, 0xa3, 0xca, 0xbf, 0xbf, 0xce, 0xbf, 0x00, 0x81, 0x96, + 0xab, 0xbd, 0x33, 0x07, 0x11, 0x1a, 0x01, 0x1b, 0x1d, 0x1f, 0x1f, 0x00, + 0x00, 0x00, 0xe9, 0xe2, 0xd4, 0xa7, 0x5f, 0x62, 0x62, 0x62, 0xe9, 0x62, + 0x00, 0x2b, 0x1e, 0x1b, 0x1a, 0x0c, 0x05, 0xb0, 0xb0, 0x01, 0xab, 0x96, + 0x96, 0xbf, 0xb0, 0xb0, 0xb0, 0xe9, 0x88, 0xd1, 0xbd, 0xbd, 0xbd, 0xe9, + 0xbd, 0xca, 0xca, 0x40, 0xca, 0xe9, 0xca, 0xca, 0xd7, 0xca, 0xd7, 0xd7, + 0x06, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd4, 0xab, 0xd5, 0x18, 0xd3, 0xd3, + 0xd3, 0xe9, 0xd2, 0xcc, 0xcc, 0xcc, 0x80, 0xe9, 0xcc, 0xcc, 0xb6, 0xb6, + 0xbf, 0xce, 0x81, 0x00, 0x96, 0xab, 0xb0, 0xaa, 0x04, 0x0c, 0x18, 0x1b, + 0x07, 0x1d, 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x80, 0x5f, 0x00, + 0x00, 0x62, 0xbb, 0x82, 0x6f, 0x94, 0x00, 0x94, 0x50, 0x1e, 0x1b, 0x17, + 0x09, 0x0d, 0xbf, 0x00, 0xb0, 0x91, 0x81, 0xab, 0xb6, 0xab, 0xab, 0xab, + 0x02, 0xa5, 0xa5, 0xa5, 0xb0, 0xb0, 0xb0, 0xe9, 0xb0, 0x10, 0xbd, 0xbd, + 0xbd, 0xe9, 0xbd, 0xc9, 0xc9, 0xc9, 0xc4, 0xe9, 0xd2, 0xd5, 0xd5, 0xd5, + 0xe9, 0xd5, 0xd5, 0x18, 0xd3, 0xd3, 0xd3, 0xe9, 0xd2, 0xd0, 0xd0, 0xcb, + 0x00, 0xcb, 0xcb, 0xcb, 0xcc, 0xcb, 0xcc, 0xcc, 0xcc, 0x80, 0xe9, 0xcc, + 0xbd, 0xaa, 0xaa, 0xbf, 0xab, 0x81, 0x00, 0x96, 0xb0, 0xbf, 0x0d, 0x07, + 0x17, 0x1a, 0x1d, 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x13, + 0x00, 0x62, 0xa9, 0x58, 0x5e, 0x5e, 0x3a, 0x19, 0x12, 0x00, 0x09, 0x33, + 0xb6, 0xab, 0x96, 0x5c, 0xaa, 0xb0, 0x02, 0x91, 0x91, 0x86, 0xa5, 0xa5, + 0xa5, 0xe9, 0xa5, 0x00, 0xa5, 0xb0, 0xb0, 0xb0, 0xbc, 0xbc, 0xbc, 0xbd, + 0x01, 0xbc, 0xbd, 0xbd, 0xbd, 0xc9, 0xc9, 0xc9, 0xe9, 0x80, 0xd4, 0xc9, + 0xc9, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0x66, 0xcb, 0xe9, 0xc3, 0xcb, 0xcb, + 0xe9, 0xd4, 0xcb, 0x00, 0xcb, 0xc5, 0xaa, 0xb0, 0xb6, 0xb6, 0x5c, 0x96, + 0x00, 0xab, 0xb6, 0x33, 0x07, 0x12, 0x19, 0x19, 0x00, 0x3e, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x5f, 0x15, 0x62, 0x00, 0x94, 0x5e, 0x4a, 0x18, 0x0e, + 0x05, 0x86, 0xaa, 0x10, 0x91, 0x6b, 0x51, 0xe1, 0x96, 0x7b, 0x7b, 0x7b, + 0x0c, 0x7b, 0xa5, 0xa5, 0xa5, 0xe9, 0xd1, 0xbc, 0xbc, 0x63, 0xbc, 0xe9, + 0xd1, 0xc5, 0xc5, 0xc5, 0xe9, 0xd4, 0x8e, 0xa7, 0xc8, 0xc8, 0xc8, 0xe9, + 0xd4, 0xa5, 0x95, 0x00, 0x95, 0x95, 0xbf, 0x51, 0x6b, 0x91, 0xaa, 0x86, + 0x01, 0x05, 0x0f, 0x18, 0x36, 0x00, 0x00, 0x00, 0xe9, 0xf0, 0xd4, 0xa7, + 0x5f, 0x16, 0x62, 0x62, 0x62, 0x18, 0x00, 0x0a, 0x04, 0xb6, 0x95, 0x91, + 0x6b, 0x6b, 0x95, 0x03, 0x6b, 0x6b, 0x67, 0x7b, 0x7b, 0x7b, 0xe9, 0xd1, + 0x00, 0xae, 0xae, 0xa5, 0xae, 0xab, 0xae, 0xa5, 0xb9, 0x07, 0xbc, 0xbc, + 0xc3, 0xc3, 0xc3, 0xe2, 0xc9, 0xd4, 0x83, 0xa4, 0xc8, 0xc3, 0xc8, 0xc8, + 0xc8, 0xe9, 0xd4, 0x10, 0xc8, 0xc8, 0xbe, 0x8a, 0xa5, 0x91, 0x91, 0xaa, + 0x00, 0x6b, 0x6b, 0x91, 0x95, 0xb6, 0x03, 0x0a, 0x18, 0x0f, 0x30, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x80, 0x17, 0x00, 0x62, 0x14, 0x09, + 0x10, 0xbf, 0x95, 0x00, 0x6b, 0x51, 0x6b, 0x6b, 0x51, 0x51, 0x5c, 0x5c, + 0x00, 0x5c, 0x5c, 0x7b, 0x7b, 0x7b, 0x7b, 0x81, 0x7b, 0x02, 0x7b, 0xa7, + 0xa7, 0xae, 0xae, 0xae, 0xe9, 0xae, 0x1b, 0xb9, 0xb9, 0xb9, 0xe9, 0xd1, + 0xc3, 0xe9, 0xd9, 0x8c, 0xe1, 0xc7, 0xc7, 0xc7, 0xe9, 0xd1, 0xc0, 0xc7, + 0x18, 0xc0, 0xc0, 0xc0, 0xe9, 0xd4, 0xc0, 0xae, 0x91, 0x00, 0x91, 0x91, + 0x91, 0x51, 0x6b, 0x95, 0xb6, 0x10, 0x03, 0x07, 0x14, 0x17, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xe0, 0xa7, 0x5f, 0x17, 0x30, 0x19, 0x12, 0x09, 0x33, + 0x00, 0xaa, 0x95, 0x6b, 0x51, 0x91, 0x51, 0x51, 0x51, 0x11, 0x5c, 0x5c, + 0x5c, 0xe9, 0x81, 0x81, 0x81, 0xe9, 0x10, 0xa7, 0xa7, 0xa7, 0xe9, 0xaf, + 0xa7, 0xaf, 0xae, 0x02, 0xaf, 0xae, 0xae, 0xb9, 0xb9, 0xb9, 0xe9, 0xb9, + 0x25, 0xb9, 0xba, 0xe9, 0xba, 0xba, 0xe9, 0xc7, 0xc9, 0x10, 0xc1, 0xc1, + 0xc1, 0xe9, 0xc1, 0xc1, 0xba, 0xc1, 0x04, 0xc0, 0xc1, 0xc0, 0xc0, 0xc0, + 0xe9, 0x6b, 0x6b, 0x00, 0x6b, 0x95, 0x51, 0x6b, 0x91, 0xaa, 0x33, 0x07, + 0x04, 0x12, 0x1a, 0x62, 0x62, 0x62, 0xe9, 0x00, 0x00, 0x78, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x00, 0x00, 0x30, 0x00, 0x36, 0x1a, 0x11, 0x07, 0x51, + 0xaa, 0x91, 0x6b, 0x00, 0x51, 0x6b, 0x45, 0x45, 0x45, 0x47, 0x47, 0x56, + 0x00, 0x56, 0x56, 0x56, 0x56, 0x80, 0x80, 0x80, 0x80, 0x00, 0x81, 0x81, + 0x81, 0x81, 0x81, 0xa8, 0xa7, 0xa7, 0x03, 0xa7, 0xa7, 0xa7, 0xaf, 0xaf, + 0xaf, 0xe9, 0xd3, 0x1a, 0xba, 0xba, 0xba, 0xe9, 0xd3, 0xc1, 0xe2, 0xc1, + 0x60, 0xc1, 0xe9, 0xcb, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0x00, 0x67, 0x6b, + 0x6b, 0x95, 0x51, 0x6b, 0x91, 0xaa, 0x00, 0x51, 0x06, 0x11, 0x1a, 0x1a, + 0x4a, 0x5e, 0x75, 0x00, 0x6f, 0x94, 0x62, 0x62, 0x62, 0x00, 0x00, 0x00, + 0xf0, 0xe9, 0xd4, 0xa7, 0x5d, 0x30, 0x39, 0x1d, 0x1a, 0x00, 0x0f, 0x06, + 0x86, 0x9f, 0x91, 0x6b, 0x51, 0x6b, 0x00, 0x45, 0x45, 0x45, 0x47, 0x47, + 0x56, 0x56, 0x56, 0x80, 0xe9, 0x56, 0x80, 0x80, 0x7e, 0x80, 0x80, 0x80, + 0x81, 0xe9, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xac, 0xe9, 0x08, 0xa8, 0xac, + 0xac, 0xac, 0xe9, 0xb7, 0xb7, 0xb7, 0x82, 0xe9, 0xb8, 0xb7, 0xb8, 0xb8, + 0xb8, 0xd9, 0xb7, 0x0c, 0xb7, 0xb3, 0xb3, 0xb3, 0xe9, 0xd4, 0xb3, 0xb3, + 0x00, 0x81, 0x51, 0x51, 0x91, 0x51, 0x6b, 0x91, 0x9f, 0x00, 0x86, 0x05, + 0x0f, 0x1a, 0x1b, 0x1b, 0x46, 0x5e, 0x01, 0x58, 0x62, 0x62, 0x62, 0x00, + 0x00, 0x00, 0xe9, 0xe0, 0xd4, 0xa7, 0x5c, 0x30, 0x30, 0x1c, 0x1e, 0x1b, + 0x00, 0x1a, 0x0e, 0x05, 0x9f, 0x9f, 0x6b, 0x51, 0x51, 0x00, 0x51, 0x37, + 0x37, 0x37, 0x42, 0x42, 0x42, 0x42, 0x00, 0x42, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x7e, 0x7e, 0x00, 0x7e, 0x7e, 0x7e, 0x80, 0x80, 0x80, 0xa4, 0xa4, + 0x71, 0xa4, 0xe9, 0xd4, 0xa2, 0xb7, 0xb7, 0xb7, 0xe9, 0xc6, 0xd4, 0xa3, + 0xb3, 0xb3, 0xb3, 0xe9, 0xd4, 0xb3, 0x00, 0x80, 0x45, 0x45, 0x6b, 0x51, + 0x51, 0x91, 0x9f, 0x00, 0x95, 0x04, 0x0e, 0x18, 0x1b, 0x1d, 0x1d, 0x39, + 0x07, 0x5e, 0x62, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x80, 0x5c, 0x30, + 0x30, 0x36, 0x24, 0x1f, 0x1e, 0x1b, 0x00, 0x1a, 0x0c, 0x04, 0xb6, 0x95, + 0x6b, 0x51, 0x51, 0x01, 0x37, 0x37, 0x37, 0x37, 0x42, 0x42, 0x42, 0xe9, + 0x00, 0x42, 0x42, 0x52, 0x52, 0x52, 0x78, 0x7e, 0x7e, 0x41, 0x7e, 0xe9, + 0x7e, 0x7e, 0xa0, 0xa0, 0xa0, 0xe9, 0x80, 0xd1, 0xa4, 0xa0, 0xa4, 0xa0, + 0xa4, 0xad, 0xad, 0x70, 0xad, 0xe9, 0xd4, 0xa2, 0xb5, 0xb5, 0xa6, 0xb5, + 0x18, 0xa6, 0xa6, 0xa6, 0xe9, 0xd1, 0xb3, 0x7e, 0x45, 0x00, 0x45, 0x51, + 0x51, 0x51, 0x6b, 0x95, 0xaa, 0x03, 0x00, 0x0c, 0x18, 0x1b, 0x1d, 0x1e, + 0x24, 0x22, 0x4a, 0x0f, 0x25, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x59, + 0x00, 0x30, 0x4a, 0x39, 0x29, 0x25, 0x24, 0x1f, 0x1e, 0x00, 0x1b, 0x1a, + 0x0a, 0x04, 0xb6, 0x95, 0x6b, 0x51, 0x00, 0x45, 0x37, 0x37, 0x37, 0x37, + 0x42, 0x42, 0x42, 0x80, 0xe9, 0x42, 0x42, 0x52, 0x52, 0x52, 0x52, 0x78, + 0x08, 0x52, 0x78, 0x78, 0x78, 0xe9, 0x78, 0x78, 0xa0, 0x30, 0xa0, 0xa0, + 0xe9, 0xd4, 0xa0, 0xa0, 0xad, 0xad, 0x60, 0xad, 0xe9, 0xd4, 0xad, 0xb5, + 0xb5, 0xb5, 0xa6, 0x0c, 0xb5, 0xa6, 0xa6, 0xa6, 0xe9, 0xd3, 0x37, 0x45, + 0x00, 0x45, 0x51, 0x51, 0x6b, 0x95, 0xb6, 0x03, 0x0a, 0x00, 0x18, 0x1b, + 0x1d, 0x1e, 0x1f, 0x25, 0x29, 0x28, 0x03, 0x46, 0x25, 0x25, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0x80, 0xa4, 0x30, 0x30, 0x43, 0x2a, 0x30, 0x2b, 0x29, + 0x00, 0x25, 0x24, 0x1f, 0x1e, 0x1b, 0x1a, 0x09, 0x04, 0x00, 0xaa, 0x95, + 0x6b, 0x51, 0x45, 0x37, 0x23, 0x23, 0x00, 0x2e, 0x27, 0x2f, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x10, 0x52, 0x52, 0x52, 0xe9, 0x6e, 0x6e, 0x6e, 0x6e, + 0x00, 0x78, 0x6e, 0x78, 0x78, 0x78, 0x78, 0x8c, 0x78, 0x11, 0x8c, 0x8c, + 0x8c, 0xe9, 0x9e, 0x9e, 0x9e, 0xe9, 0x80, 0xd4, 0x9e, 0xb4, 0x9e, 0xb4, + 0x9e, 0xad, 0xb5, 0x01, 0xb4, 0xb4, 0xa6, 0xa6, 0xa1, 0xa1, 0xa1, 0xe9, + 0x80, 0xd3, 0x37, 0x37, 0x45, 0x51, 0x51, 0x6b, 0x95, 0x00, 0xaa, 0x03, + 0x07, 0x1a, 0x1a, 0x1d, 0x1e, 0x1f, 0x00, 0x25, 0x29, 0x2b, 0x30, 0x30, + 0x39, 0x4a, 0x25, 0x0c, 0x25, 0x00, 0x00, 0x00, 0xe9, 0xd3, 0x30, 0x30, + 0x00, 0x4a, 0x43, 0x2a, 0x30, 0x30, 0x30, 0x30, 0x2b, 0x00, 0x29, 0x25, + 0x24, 0x1f, 0x1e, 0x1b, 0x1a, 0x07, 0x00, 0x04, 0x9f, 0x95, 0x6b, 0x51, + 0x45, 0x23, 0x23, 0x00, 0x23, 0x2e, 0x27, 0x2f, 0x34, 0x34, 0x3e, 0x3e, + 0x00, 0x3e, 0x3e, 0x3e, 0x52, 0x52, 0x52, 0x52, 0x52, 0x10, 0x6e, 0x6e, + 0x6e, 0xe9, 0x6e, 0x8c, 0x8c, 0x8c, 0xc7, 0xe9, 0xd2, 0x9e, 0x9e, 0x9e, + 0xe9, 0xd4, 0xa1, 0x21, 0xb4, 0xa3, 0xe9, 0xa3, 0xa1, 0xa1, 0xa1, 0xe9, + 0x80, 0xd4, 0xa1, 0x37, 0x37, 0x37, 0x51, 0x51, 0x6b, 0x00, 0x95, 0xaa, + 0x03, 0x07, 0x1a, 0x1a, 0x1d, 0x1e, 0x00, 0x1f, 0x25, 0x29, 0x2b, 0x30, + 0x30, 0x30, 0x30, 0x00, 0x30, 0x39, 0x4a, 0x25, 0x25, 0x00, 0x00, 0x00, + 0x81, 0xe9, 0x00, 0x30, 0x30, 0x4a, 0x43, 0x2a, 0x5b, 0x00, 0x2b, 0x29, + 0x25, 0x24, 0x1f, 0x1e, 0x1b, 0x1a, 0x00, 0x09, 0x04, 0x9f, 0x95, 0x6b, + 0x51, 0x45, 0x23, 0x00, 0x23, 0x20, 0x2e, 0x27, 0x2f, 0x34, 0x34, 0x3c, + 0x00, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x50, 0x50, 0x50, 0x04, 0x50, 0x65, + 0x6e, 0x6e, 0x6e, 0xe9, 0x6e, 0x6e, 0x12, 0x87, 0x87, 0x87, 0xe9, 0x87, + 0x8c, 0xe2, 0x87, 0x00, 0x9c, 0x9e, 0x9c, 0x9e, 0xa3, 0x9c, 0xa3, 0xa3, + 0x60, 0xa3, 0xe9, 0xd4, 0xa3, 0xa3, 0x9a, 0xa1, 0x9a, 0x00, 0x9a, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0x37, 0x37, 0x00, 0x37, 0x51, 0x51, 0x6b, 0x95, + 0xaa, 0x03, 0x06, 0x00, 0x1a, 0x1a, 0x1d, 0x1e, 0x1f, 0x25, 0x29, 0x2b, + 0x10, 0x30, 0x30, 0x30, 0xe9, 0x39, 0x43, 0x25, 0x25, 0x18, 0x00, 0x00, + 0x00, 0xe9, 0xd2, 0x30, 0x30, 0x43, 0x00, 0x2a, 0x30, 0x30, 0x2b, 0x29, + 0x25, 0x24, 0x1f, 0x00, 0x1e, 0x1b, 0x1a, 0x09, 0x05, 0x9f, 0x91, 0x6b, + 0x00, 0x51, 0x45, 0x23, 0x20, 0x20, 0x21, 0x27, 0x27, 0x00, 0x2f, 0x35, + 0x3c, 0x38, 0x3e, 0x3e, 0x3e, 0x3e, 0x00, 0x50, 0x50, 0x50, 0x50, 0x65, + 0x50, 0x65, 0x65, 0x40, 0x65, 0xe9, 0x71, 0x71, 0x71, 0x71, 0x87, 0x87, + 0x62, 0x87, 0xe9, 0xd3, 0x9c, 0x9c, 0x9c, 0xe9, 0x9c, 0x18, 0xa3, 0xa3, + 0xa3, 0xe9, 0xd4, 0x93, 0x9a, 0x9a, 0x10, 0x93, 0x93, 0x93, 0xe9, 0x23, + 0x23, 0x37, 0x45, 0x00, 0x51, 0x6b, 0x95, 0xaa, 0x03, 0x07, 0x1a, 0x1a, + 0x00, 0x1d, 0x1e, 0x1f, 0x25, 0x29, 0x2b, 0x30, 0x30, 0x00, 0x30, 0x39, + 0x4a, 0x25, 0x25, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa2, 0x30, 0x30, + 0x43, 0x28, 0x29, 0x00, 0x25, 0x24, 0x1e, 0x1e, 0x1b, 0x1b, 0x0a, 0x05, + 0x00, 0x9f, 0x95, 0x6b, 0x51, 0x45, 0x23, 0x1e, 0x1e, 0x00, 0x21, 0x27, + 0x27, 0x2f, 0x35, 0x38, 0x3c, 0x38, 0x00, 0x3e, 0x3e, 0x3e, 0x49, 0x50, + 0x50, 0x50, 0x50, 0x00, 0x50, 0x65, 0x65, 0x63, 0x65, 0x65, 0x71, 0x71, + 0x41, 0x71, 0xe9, 0x7f, 0x71, 0x7f, 0x7f, 0x7f, 0xe9, 0x0c, 0x7f, 0x9c, + 0x9c, 0x9c, 0xe9, 0xd1, 0xa3, 0xa3, 0x40, 0xa3, 0xe9, 0xa3, 0xa3, 0x9a, + 0x9a, 0x9a, 0x93, 0x40, 0x93, 0xdb, 0x93, 0x70, 0x23, 0x23, 0x37, 0x45, + 0x00, 0x51, 0x6b, 0x95, 0xb6, 0x03, 0x0a, 0x18, 0x1b, 0x00, 0x1d, 0x1e, + 0x1f, 0x25, 0x29, 0x2b, 0x39, 0x4a, 0x07, 0x25, 0x25, 0x00, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x00, 0x00, 0x30, 0x4a, 0x22, 0x24, 0x1f, 0x1e, 0x1b, + 0x00, 0x1a, 0x0c, 0x05, 0x9f, 0x95, 0x6b, 0x51, 0x45, 0x00, 0x23, 0x1f, + 0x20, 0x21, 0x27, 0x27, 0x2f, 0x2f, 0x00, 0x38, 0x38, 0x38, 0x41, 0x41, + 0x49, 0x49, 0x49, 0x00, 0x50, 0x50, 0x57, 0x57, 0x57, 0x63, 0x63, 0x63, + 0x00, 0x63, 0x71, 0x63, 0x71, 0x71, 0x71, 0x71, 0x71, 0x10, 0x7f, 0x7f, + 0x7f, 0xe9, 0x7f, 0x7f, 0x9c, 0x9c, 0x40, 0x8d, 0xe9, 0x9c, 0x9c, 0x9b, + 0x9c, 0x9b, 0x9b, 0x00, 0x9b, 0xa3, 0xa3, 0xa3, 0x9b, 0x9a, 0x97, 0x97, + 0x00, 0x93, 0x93, 0x9a, 0x93, 0x93, 0x7c, 0x93, 0x74, 0x00, 0x70, 0x23, + 0x23, 0x37, 0x45, 0x51, 0x6b, 0x95, 0x00, 0xb6, 0x03, 0x0a, 0x18, 0x1b, + 0x1d, 0x1e, 0x24, 0x01, 0x25, 0x36, 0x25, 0x25, 0x00, 0x00, 0x00, 0xe9, + 0xe0, 0xd4, 0xa7, 0x5c, 0x30, 0x46, 0x1c, 0x1d, 0x1b, 0x00, 0x1a, 0x0e, + 0x05, 0x95, 0x95, 0x6b, 0x51, 0x45, 0x00, 0x37, 0x1f, 0x20, 0x22, 0x27, + 0x27, 0x2f, 0x2f, 0x00, 0x35, 0x38, 0x3c, 0x3d, 0x3d, 0x41, 0x49, 0x49, + 0x00, 0x4c, 0x49, 0x57, 0x57, 0x57, 0x57, 0x5b, 0x63, 0x00, 0x63, 0x63, + 0x66, 0x71, 0x66, 0x6f, 0x71, 0x72, 0x00, 0x71, 0x7d, 0x7f, 0x7d, 0x7f, + 0x7f, 0x7f, 0x7f, 0x00, 0x85, 0x8d, 0x90, 0x8d, 0x90, 0x90, 0x99, 0x90, + 0x18, 0x9b, 0x9b, 0x9b, 0xe9, 0xd1, 0x97, 0x97, 0x97, 0x00, 0x83, 0x89, + 0x89, 0x89, 0x93, 0x7c, 0x7c, 0x74, 0x00, 0x48, 0x23, 0x23, 0x37, 0x45, + 0x51, 0x91, 0x95, 0x00, 0x9f, 0x04, 0x0c, 0x18, 0x1a, 0x1d, 0x1e, 0x30, + 0x07, 0x25, 0x25, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x80, 0x5f, 0x00, + 0x5e, 0x25, 0x1d, 0x1a, 0x0f, 0x06, 0x00, 0x86, 0x95, 0x6b, 0x51, 0x45, + 0x37, 0x1f, 0x1f, 0x00, 0x22, 0x27, 0x27, 0x2f, 0x2f, 0x35, 0x38, 0x35, + 0x00, 0x3d, 0x3d, 0x3d, 0x49, 0x49, 0x4c, 0x4c, 0x4c, 0x00, 0x4f, 0x54, + 0x5b, 0x5b, 0x5e, 0x63, 0x66, 0x66, 0x40, 0x66, 0xe9, 0x6f, 0x6f, 0x73, + 0x73, 0x7d, 0x7d, 0x00, 0x7d, 0x7d, 0x7d, 0x85, 0x8b, 0x8b, 0x90, 0x90, + 0x00, 0x90, 0x94, 0x94, 0x9d, 0x9b, 0x9b, 0x9b, 0x9b, 0x00, 0x9b, 0x98, + 0xa2, 0x97, 0x97, 0x97, 0x97, 0x89, 0x00, 0x89, 0x89, 0x89, 0x89, 0x7c, + 0x74, 0x74, 0x3e, 0x00, 0x26, 0x26, 0x45, 0x45, 0x6b, 0x91, 0x9f, 0x86, + 0x00, 0x05, 0x0f, 0x18, 0x1b, 0x1d, 0x25, 0x25, 0x00, 0x3c, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x5f, 0x62, 0x62, 0x00, 0x62, 0x58, 0x5e, 0x24, 0x1a, + 0x11, 0x07, 0x51, 0x00, 0x95, 0x6b, 0x51, 0x45, 0x37, 0x24, 0x25, 0x22, + 0x00, 0x27, 0x27, 0x2f, 0x2f, 0x35, 0x38, 0x35, 0x3d, 0x00, 0x3d, 0x3d, + 0x41, 0x49, 0x49, 0x49, 0x4f, 0x4f, 0x00, 0x54, 0x5b, 0x5b, 0x5e, 0x5e, + 0x62, 0x62, 0x62, 0x00, 0x62, 0x66, 0x62, 0x6f, 0x6f, 0x73, 0x76, 0x76, + 0x00, 0x76, 0x7d, 0x7d, 0x85, 0x85, 0x82, 0x8b, 0x8b, 0x00, 0x90, 0x82, + 0x94, 0x8e, 0x99, 0x99, 0x9d, 0x9b, 0x00, 0x9b, 0x9b, 0x98, 0x98, 0x97, + 0x97, 0x97, 0x97, 0x00, 0x83, 0x89, 0x89, 0x89, 0x89, 0x89, 0x74, 0x74, + 0x00, 0x32, 0x26, 0x26, 0x45, 0x51, 0x6b, 0x91, 0x9f, 0x00, 0x51, 0x06, + 0x11, 0x18, 0x1b, 0x25, 0x25, 0x00, 0x3c, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x5f, 0x62, 0x62, 0x00, 0x58, 0x5e, 0x5e, 0x58, 0x58, 0x1d, 0x12, 0x09, + 0x00, 0x33, 0xaa, 0x91, 0x6b, 0x45, 0x37, 0x2c, 0x29, 0x00, 0x25, 0x27, + 0x27, 0x2f, 0x2f, 0x35, 0x38, 0x35, 0x00, 0x3d, 0x3d, 0x3d, 0x49, 0x41, + 0x4c, 0x49, 0x4f, 0x00, 0x4f, 0x54, 0x54, 0x58, 0x5e, 0x5e, 0x5e, 0x62, + 0x00, 0x62, 0x62, 0x66, 0x66, 0x6f, 0x66, 0x6f, 0x73, 0x00, 0x76, 0x76, + 0x7d, 0x7a, 0x85, 0x75, 0x85, 0x8b, 0x00, 0x82, 0x8e, 0x8b, 0x94, 0x8e, + 0x99, 0x99, 0x9d, 0x00, 0x8f, 0x98, 0x98, 0x98, 0x98, 0x97, 0x97, 0x83, + 0x00, 0x83, 0x97, 0x89, 0x89, 0x89, 0x77, 0x74, 0x74, 0x00, 0x74, 0x26, + 0x2c, 0x31, 0x45, 0x51, 0x6b, 0x91, 0x00, 0xaa, 0x33, 0x07, 0x12, 0x1a, + 0x31, 0x25, 0x00, 0x3c, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x62, 0x62, + 0x40, 0x62, 0xe9, 0x8e, 0x8e, 0x4a, 0x14, 0x09, 0x10, 0x00, 0xaa, 0x91, + 0x6b, 0x51, 0x45, 0x2e, 0x29, 0x2b, 0x00, 0x21, 0x27, 0x2f, 0x2f, 0x35, + 0x38, 0x35, 0x3d, 0x00, 0x3d, 0x41, 0x41, 0x41, 0x4c, 0x49, 0x4c, 0x4e, + 0x00, 0x4f, 0x54, 0x58, 0x5e, 0x5e, 0x62, 0x62, 0x62, 0x00, 0x62, 0x66, + 0x62, 0x6f, 0x66, 0x73, 0x6f, 0x75, 0x00, 0x76, 0x7a, 0x7a, 0x7a, 0x75, + 0x85, 0x82, 0x82, 0x00, 0x8e, 0x82, 0x94, 0x90, 0x94, 0x94, 0x99, 0x8f, + 0x00, 0x99, 0x98, 0x97, 0x98, 0x97, 0x97, 0x83, 0x97, 0x00, 0x83, 0x83, + 0x89, 0x89, 0x77, 0x74, 0x74, 0x4d, 0x00, 0x29, 0x2c, 0x37, 0x45, 0x51, + 0x6b, 0x95, 0xb6, 0x00, 0x10, 0x07, 0x14, 0x17, 0x25, 0x25, 0x00, 0x00, + 0x78, 0x00, 0xe9, 0xd4, 0xa7, 0x5e, 0x62, 0x62, 0x62, 0xc0, 0xe9, 0xd2, + 0x1a, 0x0a, 0x04, 0xaa, 0x91, 0x6b, 0x00, 0x51, 0x45, 0x37, 0x2b, 0x30, + 0x2d, 0x27, 0x27, 0x00, 0x2f, 0x35, 0x35, 0x35, 0x3d, 0x3d, 0x41, 0x41, + 0x00, 0x41, 0x49, 0x49, 0x4c, 0x4c, 0x4f, 0x4c, 0x5b, 0x00, 0x5e, 0x5e, + 0x5e, 0x62, 0x62, 0x62, 0x66, 0x62, 0x00, 0x6f, 0x66, 0x75, 0x6f, 0x76, + 0x76, 0x75, 0x7a, 0x00, 0x7a, 0x82, 0x85, 0x82, 0x82, 0x8e, 0x82, 0x94, + 0x00, 0x8e, 0x99, 0x99, 0x92, 0x99, 0x9b, 0x92, 0x97, 0x00, 0x98, 0x8a, + 0x97, 0x97, 0x83, 0x83, 0x83, 0x89, 0x00, 0x77, 0x77, 0x74, 0x74, 0x3d, + 0x31, 0x2b, 0x37, 0x00, 0x45, 0x51, 0x91, 0x95, 0xb6, 0x03, 0x07, 0x18, + 0x07, 0x29, 0x25, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xc0, 0x5f, 0x17, + 0x30, 0x1a, 0x0e, 0x06, 0x86, 0x91, 0x00, 0x6b, 0x51, 0x45, 0x37, 0x31, + 0x30, 0x30, 0x27, 0x00, 0x27, 0x2f, 0x35, 0x35, 0x35, 0x38, 0x3d, 0x3d, + 0x00, 0x3d, 0x41, 0x49, 0x49, 0x4c, 0x4f, 0x4f, 0x4f, 0x00, 0x58, 0x58, + 0x5e, 0x62, 0x62, 0x62, 0x62, 0x66, 0x00, 0x62, 0x6f, 0x66, 0x75, 0x6f, + 0x76, 0x75, 0x76, 0x00, 0x7a, 0x75, 0x85, 0x82, 0x82, 0x82, 0x8e, 0x82, + 0x00, 0x94, 0x8e, 0x94, 0x92, 0x8f, 0x92, 0x99, 0x98, 0x00, 0x97, 0x97, + 0x97, 0x97, 0x83, 0x83, 0x83, 0x83, 0x00, 0x89, 0x77, 0x74, 0x74, 0x74, + 0x32, 0x31, 0x31, 0x00, 0x45, 0x51, 0x6b, 0x91, 0xaa, 0x86, 0x04, 0x0f, + 0x01, 0x18, 0x25, 0x94, 0x62, 0x00, 0x00, 0x00, 0xe9, 0xf0, 0xd4, 0xa7, + 0x5f, 0x16, 0x3a, 0x19, 0x12, 0x07, 0x00, 0x33, 0xb0, 0x96, 0x67, 0x45, + 0x52, 0x36, 0x36, 0x00, 0x36, 0x32, 0x27, 0x2f, 0x2f, 0x35, 0x38, 0x3d, + 0x00, 0x3d, 0x3d, 0x41, 0x41, 0x41, 0x49, 0x4c, 0x4c, 0x00, 0x4c, 0x4f, + 0x54, 0x5e, 0x5e, 0x62, 0x62, 0x62, 0x00, 0x62, 0x66, 0x62, 0x6f, 0x66, + 0x73, 0x6f, 0x76, 0x00, 0x76, 0x76, 0x75, 0x7a, 0x82, 0x82, 0x82, 0x82, + 0x00, 0x8e, 0x82, 0x94, 0x90, 0x99, 0x92, 0x92, 0x99, 0x00, 0x99, 0x97, + 0x98, 0x8a, 0x97, 0x83, 0x83, 0x83, 0x00, 0x83, 0x83, 0x89, 0x77, 0x74, + 0x74, 0x59, 0x31, 0x00, 0x36, 0x2e, 0x45, 0x5c, 0x96, 0x91, 0xb6, 0x33, + 0x00, 0x07, 0x12, 0x17, 0x1a, 0x5e, 0x62, 0x62, 0x62, 0x1f, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x13, 0x00, 0x30, 0x29, 0x1b, 0x17, 0x09, + 0x0d, 0xb0, 0x91, 0x00, 0x67, 0x56, 0x56, 0x52, 0x39, 0x39, 0x32, 0x27, + 0x00, 0x2f, 0x2f, 0x35, 0x35, 0x38, 0x38, 0x3d, 0x41, 0x00, 0x41, 0x49, + 0x49, 0x4c, 0x4c, 0x4f, 0x4f, 0x4f, 0x00, 0x58, 0x5e, 0x62, 0x62, 0x62, + 0x62, 0x66, 0x62, 0x00, 0x6f, 0x66, 0x75, 0x6f, 0x76, 0x75, 0x76, 0x75, + 0x00, 0x75, 0x82, 0x82, 0x82, 0x82, 0x8e, 0x82, 0x94, 0x00, 0x8e, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x98, 0x97, 0x00, 0x8a, 0x8a, 0x97, 0x83, 0x83, + 0x83, 0x83, 0x77, 0x00, 0x74, 0x74, 0x74, 0x41, 0x39, 0x39, 0x52, 0x56, + 0x00, 0x67, 0x96, 0xb0, 0xbf, 0x0d, 0x07, 0x15, 0x1a, 0x00, 0x1b, 0x40, + 0x5e, 0x5e, 0x62, 0x62, 0x00, 0x00, 0x7c, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, + 0x12, 0x43, 0x1d, 0x00, 0x1b, 0x1a, 0x0c, 0x05, 0x86, 0xab, 0x96, 0x80, + 0x00, 0x56, 0x52, 0x40, 0x3a, 0x3a, 0x35, 0x27, 0x2f, 0x00, 0x35, 0x35, + 0x38, 0x38, 0x3d, 0x41, 0x41, 0x41, 0x00, 0x41, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4f, 0x58, 0x58, 0x00, 0x62, 0x62, 0x62, 0x62, 0x66, 0x62, 0x6f, 0x66, + 0x00, 0x75, 0x6f, 0x76, 0x73, 0x75, 0x7a, 0x75, 0x85, 0x00, 0x82, 0x82, + 0x82, 0x8e, 0x82, 0x92, 0x8e, 0x92, 0x00, 0x92, 0x99, 0x92, 0x97, 0x98, + 0x97, 0x97, 0x83, 0x00, 0x83, 0x83, 0x83, 0x83, 0x89, 0x77, 0x74, 0x74, + 0x00, 0x69, 0x3a, 0x3a, 0x40, 0x56, 0x5c, 0x96, 0xab, 0x00, 0xb0, 0xb0, + 0x04, 0x0c, 0x18, 0x1a, 0x1d, 0x1e, 0x00, 0x58, 0x58, 0x5e, 0x62, 0x62, + 0x62, 0x00, 0x00, 0x78, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x00, 0x01, 0x1c, + 0x00, 0x1e, 0x1b, 0x1a, 0x11, 0x07, 0x33, 0xb0, 0x96, 0x00, 0x81, 0x56, + 0x52, 0x52, 0x3a, 0x3a, 0x3b, 0x27, 0x00, 0x2f, 0x2f, 0x35, 0x38, 0x38, + 0x3d, 0x41, 0x41, 0x00, 0x41, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x58, + 0x00, 0x58, 0x58, 0x62, 0x62, 0x62, 0x66, 0x62, 0x6f, 0x00, 0x66, 0x75, + 0x6f, 0x75, 0x76, 0x76, 0x7a, 0x7a, 0x00, 0x75, 0x85, 0x82, 0x82, 0x90, + 0x82, 0x90, 0x84, 0x00, 0x92, 0x92, 0x92, 0x8f, 0x97, 0x97, 0x97, 0x8a, + 0x00, 0x8a, 0x83, 0x83, 0x83, 0x83, 0x77, 0x77, 0x74, 0x00, 0x74, 0x4b, + 0x3a, 0x3a, 0x52, 0x56, 0x81, 0x96, 0x00, 0xab, 0xbd, 0x33, 0x07, 0x11, + 0x18, 0x1b, 0x1d, 0x04, 0x1e, 0x2b, 0x62, 0x62, 0x62, 0xe9, 0x00, 0x00, + 0x78, 0x00, 0xe9, 0xd4, 0xa7, 0x5e, 0x01, 0x22, 0x1f, 0x00, 0x1e, 0x1d, + 0x1b, 0x17, 0x09, 0x07, 0xb0, 0xab, 0x00, 0x96, 0x80, 0x56, 0x52, 0x43, + 0x43, 0x43, 0x35, 0x00, 0x27, 0x2f, 0x35, 0x38, 0x38, 0x3d, 0x3d, 0x41, + 0x00, 0x41, 0x41, 0x4c, 0x4c, 0x4c, 0x4c, 0x54, 0x58, 0x00, 0x58, 0x58, + 0x58, 0x62, 0x62, 0x66, 0x66, 0x6f, 0x00, 0x66, 0x73, 0x73, 0x76, 0x76, + 0x75, 0x7a, 0x75, 0x00, 0x75, 0x85, 0x8b, 0x82, 0x8e, 0x82, 0x92, 0x90, + 0x00, 0x8e, 0x92, 0x8f, 0x8f, 0x97, 0x8a, 0x97, 0x83, 0x00, 0x83, 0x83, + 0x83, 0x83, 0x77, 0x77, 0x74, 0x74, 0x00, 0x69, 0x40, 0x43, 0x40, 0x56, + 0x80, 0x96, 0xab, 0x00, 0xb0, 0xbf, 0x07, 0x06, 0x15, 0x1a, 0x1b, 0x1e, + 0x00, 0x1f, 0x24, 0x40, 0x25, 0x25, 0x00, 0x00, 0x00, 0xf0, 0xe9, 0xd4, + 0xa7, 0x5f, 0x00, 0x01, 0x22, 0x25, 0x00, 0x24, 0x1f, 0x1d, 0x1b, 0x1a, + 0x0e, 0x06, 0x67, 0x00, 0xab, 0x96, 0x81, 0x7e, 0x52, 0x52, 0x46, 0x46, + 0x00, 0x43, 0x27, 0x2f, 0x2f, 0x34, 0x38, 0x38, 0x38, 0x00, 0x41, 0x41, + 0x41, 0x49, 0x49, 0x4c, 0x4c, 0x4c, 0x00, 0x58, 0x54, 0x5d, 0x58, 0x5a, + 0x62, 0x66, 0x66, 0x00, 0x6f, 0x66, 0x75, 0x6f, 0x75, 0x76, 0x7a, 0x7a, + 0x00, 0x7a, 0x85, 0x82, 0x82, 0x84, 0x84, 0x84, 0x90, 0x00, 0x90, 0x92, + 0x8f, 0x8f, 0x98, 0x8a, 0x97, 0x88, 0x00, 0x88, 0x83, 0x83, 0x83, 0x83, + 0x77, 0x77, 0x74, 0x00, 0x74, 0x53, 0x46, 0x46, 0x52, 0x80, 0x81, 0x96, + 0x00, 0xab, 0xbd, 0x95, 0x06, 0x0e, 0x18, 0x1a, 0x1d, 0x00, 0x1e, 0x1f, + 0x24, 0x25, 0x43, 0x25, 0x00, 0x00, 0x78, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, + 0x01, 0x28, 0x29, 0x00, 0x25, 0x24, 0x1f, 0x1e, 0x1d, 0x19, 0x12, 0x09, + 0x00, 0x10, 0xbc, 0xab, 0x81, 0x80, 0x7e, 0x52, 0x4a, 0x00, 0x46, 0x46, + 0x38, 0x2f, 0x2f, 0x34, 0x34, 0x38, 0x00, 0x38, 0x3d, 0x41, 0x41, 0x41, + 0x49, 0x4b, 0x4c, 0x00, 0x54, 0x5a, 0x54, 0x5a, 0x5d, 0x62, 0x5d, 0x5a, + 0x00, 0x66, 0x66, 0x6f, 0x73, 0x6f, 0x76, 0x7d, 0x7d, 0x00, 0x85, 0x85, + 0x85, 0x85, 0x79, 0x84, 0x84, 0x84, 0x00, 0x84, 0x8d, 0x8f, 0x8f, 0x8f, + 0x97, 0x97, 0x8a, 0x00, 0x8a, 0x83, 0x83, 0x83, 0x7c, 0x77, 0x77, 0x74, + 0x00, 0x74, 0x6c, 0x46, 0x46, 0x50, 0x7e, 0x80, 0x81, 0x00, 0xab, 0xbc, + 0xca, 0x10, 0x07, 0x12, 0x19, 0x1b, 0x00, 0x1d, 0x1e, 0x24, 0x24, 0x25, + 0x2b, 0x43, 0x25, 0x1e, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5d, 0x01, + 0x00, 0x2a, 0x2b, 0x2b, 0x29, 0x25, 0x24, 0x1e, 0x1d, 0x00, 0x1b, 0x1a, + 0x0c, 0x05, 0x67, 0xab, 0xaf, 0x81, 0x00, 0x7e, 0x78, 0x6e, 0x4a, 0x4a, + 0x4a, 0x2f, 0x2f, 0x00, 0x34, 0x34, 0x38, 0x38, 0x3d, 0x3d, 0x3d, 0x44, + 0x00, 0x49, 0x4c, 0x4b, 0x54, 0x54, 0x5a, 0x58, 0x5d, 0x00, 0x60, 0x58, + 0x66, 0x66, 0x66, 0x6a, 0x6a, 0x6d, 0x00, 0x6a, 0x6d, 0x6d, 0x6d, 0x79, + 0x85, 0x85, 0x8d, 0x00, 0x8d, 0x8d, 0x8d, 0x8f, 0x84, 0x8f, 0x8a, 0x8a, + 0x00, 0x97, 0x8a, 0x8a, 0x88, 0x83, 0x83, 0x7c, 0x7c, 0x00, 0x77, 0x77, + 0x74, 0x74, 0x54, 0x4e, 0x4e, 0x78, 0x00, 0x80, 0x81, 0xae, 0xbc, 0xbd, + 0x95, 0x05, 0x0c, 0x00, 0x18, 0x1a, 0x1d, 0x1e, 0x1f, 0x24, 0x25, 0x29, + 0x01, 0x2b, 0x30, 0x43, 0x25, 0x00, 0x00, 0x00, 0xe9, 0xe0, 0xd4, 0xa7, + 0x5b, 0x01, 0x2a, 0x30, 0x30, 0x29, 0x00, 0x29, 0x25, 0x24, 0x1f, 0x1e, + 0x1b, 0x19, 0x12, 0x00, 0x09, 0x10, 0xbc, 0xae, 0xa7, 0x80, 0x7e, 0x78, + 0x00, 0x57, 0x4f, 0x4f, 0x49, 0x2f, 0x34, 0x35, 0x38, 0x00, 0x38, 0x38, + 0x3d, 0x3d, 0x44, 0x41, 0x4b, 0x4b, 0x00, 0x4b, 0x54, 0x54, 0x5a, 0x5a, + 0x5a, 0x5d, 0x66, 0x00, 0x66, 0x66, 0x66, 0x72, 0x6a, 0x72, 0x72, 0x72, + 0x00, 0x7d, 0x7d, 0x85, 0x85, 0x84, 0x8d, 0x8d, 0x84, 0x00, 0x8f, 0x84, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x88, 0x00, 0x83, 0x7c, 0x83, 0x7c, 0x7c, + 0x77, 0x74, 0x74, 0x00, 0x5f, 0x55, 0x55, 0x6e, 0x7e, 0x80, 0xa7, 0xae, + 0x00, 0xbc, 0xca, 0x10, 0x07, 0x12, 0x19, 0x1b, 0x1d, 0x00, 0x1e, 0x1f, + 0x24, 0x25, 0x29, 0x2b, 0x30, 0x30, 0x07, 0x43, 0x25, 0x00, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x80, 0x59, 0x4f, 0x2a, 0x30, 0x30, 0x2b, 0x2b, 0x29, + 0x00, 0x25, 0x24, 0x1f, 0x1e, 0x1d, 0x1b, 0x1a, 0x0c, 0x00, 0x06, 0x5c, + 0xbc, 0xae, 0xa8, 0xa4, 0x78, 0x6e, 0x00, 0x58, 0x58, 0x58, 0x49, 0x2f, + 0x2f, 0x34, 0x38, 0x00, 0x38, 0x3d, 0x3d, 0x44, 0x44, 0x4b, 0x44, 0x4b, + 0x00, 0x54, 0x54, 0x5a, 0x5a, 0x60, 0x60, 0x6a, 0x60, 0x00, 0x66, 0x66, + 0x72, 0x6a, 0x72, 0x72, 0x6d, 0x7d, 0x00, 0x7d, 0x85, 0x79, 0x84, 0x79, + 0x84, 0x79, 0x8f, 0x00, 0x84, 0x8a, 0x8a, 0x8a, 0x8a, 0x88, 0x83, 0x7c, + 0x00, 0x7c, 0x83, 0x7c, 0x77, 0x74, 0x74, 0x6c, 0x5e, 0x00, 0x5b, 0x63, + 0x7e, 0xa4, 0xa8, 0xae, 0xbc, 0xc9, 0x00, 0x86, 0x06, 0x0c, 0x18, 0x1a, + 0x1b, 0x1e, 0x1f, 0x00, 0x24, 0x25, 0x29, 0x29, 0x30, 0x30, 0x30, 0x30, + 0x0e, 0x43, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x20, 0x00, 0x43, + 0x1a, 0x30, 0x30, 0x29, 0x29, 0x25, 0x00, 0x24, 0x1f, 0x1e, 0x1b, 0x19, + 0x13, 0x09, 0x0b, 0x00, 0xc3, 0xb9, 0xaf, 0xa4, 0xa0, 0x78, 0x6e, 0x5e, + 0x00, 0x62, 0x62, 0x3d, 0x2f, 0x34, 0x38, 0x38, 0x3c, 0x00, 0x3c, 0x44, + 0x44, 0x44, 0x4b, 0x4b, 0x4b, 0x4c, 0x00, 0x53, 0x53, 0x60, 0x60, 0x61, + 0x61, 0x6d, 0x61, 0x00, 0x6d, 0x6a, 0x6d, 0x6d, 0x6d, 0x79, 0x79, 0x79, + 0x08, 0x79, 0x84, 0x84, 0x84, 0xc9, 0x8a, 0x88, 0x88, 0x00, 0x88, 0x83, + 0x7c, 0x7c, 0x7c, 0x7c, 0x77, 0x74, 0x00, 0x74, 0x69, 0x66, 0x66, 0x66, + 0x78, 0xa0, 0xa8, 0x00, 0xae, 0xc3, 0xc9, 0xc9, 0x08, 0x07, 0x12, 0x19, + 0x00, 0x1b, 0x1d, 0x1e, 0x1f, 0x24, 0x25, 0x29, 0x2b, 0x00, 0x2b, 0x30, + 0x30, 0x30, 0x30, 0x2a, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa7, 0x39, + 0x30, 0x39, 0x43, 0x00, 0x43, 0x43, 0x4a, 0x25, 0x25, 0x25, 0x25, 0x25, + 0x00, 0x39, 0x2b, 0x1d, 0x1b, 0x1a, 0x0f, 0x07, 0x33, 0x00, 0xc5, 0xb9, + 0xa8, 0xa4, 0xa0, 0x8c, 0x71, 0x62, 0x00, 0x62, 0x62, 0x3d, 0x34, 0x34, + 0x38, 0x3c, 0x3c, 0x00, 0x3c, 0x44, 0x44, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, + 0x00, 0x5a, 0x53, 0x53, 0x61, 0x61, 0x6a, 0x6a, 0x6d, 0x00, 0x6a, 0x6d, + 0x6d, 0x6d, 0x6d, 0x79, 0x79, 0x84, 0x10, 0x79, 0x79, 0x79, 0xe9, 0x8a, + 0x88, 0x70, 0x88, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x69, 0x74, 0x69, 0x69, + 0x00, 0x66, 0x71, 0x66, 0x8c, 0xa0, 0xac, 0xaf, 0xb9, 0x00, 0xc5, 0xd5, + 0x33, 0x06, 0x0f, 0x18, 0x1a, 0x1d, 0x04, 0x29, 0x39, 0x25, 0x25, 0x25, + 0xe9, 0x43, 0x43, 0x01, 0x43, 0x43, 0x2a, 0x2a, 0x00, 0x00, 0x00, 0xe9, + 0xc4, 0xd4, 0xa5, 0x30, 0x30, 0x30, 0x57, 0x62, 0x62, 0x00, 0x5e, 0x5e, + 0x40, 0x19, 0x17, 0x0a, 0x04, 0x7b, 0x00, 0xc3, 0xb9, 0xac, 0xa4, 0xa0, + 0x8c, 0x72, 0x6f, 0x00, 0x6a, 0x6f, 0x3f, 0x34, 0x34, 0x38, 0x3c, 0x3c, + 0x00, 0x3c, 0x44, 0x44, 0x44, 0x44, 0x4b, 0x4b, 0x53, 0x00, 0x53, 0x61, + 0x61, 0x61, 0x61, 0x61, 0x6d, 0x6d, 0x41, 0x6d, 0xe9, 0x68, 0x68, 0x79, + 0x79, 0x79, 0xe9, 0x00, 0x79, 0x88, 0x79, 0x70, 0x83, 0x70, 0x7c, 0x70, + 0x00, 0x77, 0x69, 0x74, 0x69, 0x72, 0x72, 0x73, 0x87, 0x00, 0xa0, 0xa4, + 0xaf, 0xb9, 0xc5, 0xd5, 0xa5, 0x03, 0x00, 0x07, 0x15, 0x19, 0x24, 0x25, + 0x25, 0x00, 0x00, 0x7e, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x02, 0x62, + 0x00, 0x62, 0x58, 0x5e, 0x5e, 0x5e, 0x66, 0x19, 0x12, 0x00, 0x09, 0x0d, + 0xc5, 0xc3, 0xba, 0xac, 0xa4, 0xa0, 0x00, 0x9e, 0x7a, 0x75, 0x75, 0x75, + 0x48, 0x34, 0x34, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x3f, 0x3f, 0x44, 0x4b, + 0x00, 0x4b, 0x4b, 0x53, 0x53, 0x61, 0x61, 0x61, 0x61, 0x10, 0x6d, 0x6d, + 0x6d, 0xe9, 0x6d, 0x68, 0x79, 0x79, 0x00, 0x68, 0x79, 0x68, 0x79, 0x68, + 0x83, 0x6c, 0x70, 0x00, 0x70, 0x70, 0x69, 0x69, 0x69, 0x69, 0x69, 0x7d, + 0x00, 0x7d, 0x7d, 0x7f, 0xa4, 0xa4, 0xba, 0xb9, 0xc5, 0x00, 0xc9, 0xc9, + 0x0b, 0x07, 0x12, 0x17, 0x30, 0x25, 0x0f, 0x25, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0xc0, 0x17, 0x02, 0x62, 0x62, 0x58, 0x58, 0x62, 0x62, + 0x00, 0x62, 0x25, 0x25, 0x1a, 0x0f, 0x07, 0x10, 0xd0, 0x00, 0xc3, 0xba, + 0xb7, 0xad, 0xa0, 0x9e, 0x8b, 0x82, 0x00, 0x82, 0x85, 0x53, 0x34, 0x34, + 0x3c, 0x3c, 0x3f, 0x00, 0x3c, 0x3f, 0x44, 0x48, 0x48, 0x4b, 0x53, 0x53, + 0x01, 0x61, 0x53, 0x61, 0x61, 0x5f, 0x5f, 0x68, 0xe9, 0x20, 0x68, 0x68, + 0xe9, 0x6c, 0x6c, 0x6c, 0x6c, 0x83, 0x80, 0xda, 0x69, 0x69, 0x69, 0x6c, + 0x8b, 0x8d, 0x8b, 0x00, 0x8d, 0xad, 0xb7, 0xba, 0xb9, 0xc3, 0xd0, 0xd7, + 0x00, 0x16, 0x07, 0x0f, 0x18, 0x1d, 0x25, 0x00, 0x00, 0x7e, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x17, 0x04, 0x62, 0x08, 0x62, 0x62, 0x62, 0x62, 0x01, + 0x25, 0x24, 0x18, 0x00, 0x0c, 0x06, 0x33, 0xd0, 0xc7, 0xba, 0xb8, 0xad, + 0x00, 0xad, 0x9e, 0x8d, 0x8e, 0x8e, 0x90, 0x6d, 0x3c, 0x00, 0x34, 0x3c, + 0x3c, 0x3f, 0x3f, 0x3f, 0x48, 0x48, 0x00, 0x48, 0x48, 0x48, 0x53, 0x4d, + 0x5f, 0x53, 0x5f, 0x10, 0x5f, 0x68, 0x68, 0xe2, 0x64, 0x68, 0x68, 0x6c, + 0x00, 0x64, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x69, 0x69, 0x00, 0x69, 0x69, + 0x88, 0x90, 0x8d, 0x94, 0x9c, 0xad, 0x00, 0xb7, 0xba, 0xc7, 0xc3, 0xd0, + 0xde, 0x47, 0x05, 0x00, 0x0c, 0x18, 0x19, 0x39, 0x62, 0x00, 0x00, 0x00, + 0xfc, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x03, 0x62, 0x62, 0x10, 0x62, 0x62, + 0x62, 0x02, 0x25, 0x30, 0x19, 0x14, 0x00, 0x0a, 0x05, 0x5c, 0xd1, 0xc7, + 0xba, 0xb8, 0xad, 0x00, 0xad, 0x9e, 0x9c, 0x94, 0x94, 0x94, 0x92, 0x53, + 0x00, 0x34, 0x3c, 0x3c, 0x3f, 0x3f, 0x3f, 0x3f, 0x48, 0x00, 0x48, 0x48, + 0x48, 0x53, 0x4d, 0x5f, 0x5f, 0x5f, 0x80, 0xe9, 0x5f, 0x64, 0x5f, 0x64, + 0x64, 0x6c, 0x6c, 0x40, 0x64, 0xd9, 0x64, 0x69, 0x69, 0x69, 0x6c, 0x8f, + 0x00, 0x99, 0x99, 0x99, 0xa3, 0xad, 0xb7, 0xba, 0xc7, 0x00, 0xd1, 0xd0, + 0xde, 0x5c, 0x04, 0x0a, 0x14, 0x19, 0x01, 0x1a, 0x43, 0x62, 0x62, 0x00, + 0x00, 0x00, 0xe9, 0xfc, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x03, 0x39, 0x1b, + 0x00, 0x19, 0x13, 0x09, 0x04, 0x81, 0xd1, 0xc7, 0xc1, 0x00, 0xb8, 0xb7, + 0xb5, 0xb4, 0xa3, 0x9d, 0x9d, 0x98, 0x00, 0x9d, 0x84, 0x48, 0x34, 0x3c, + 0x3f, 0x3f, 0x48, 0x20, 0x48, 0x48, 0xe9, 0x4d, 0x4d, 0x4d, 0x4d, 0x5f, + 0x30, 0x5f, 0x5f, 0xe9, 0xd1, 0x64, 0x64, 0x64, 0x64, 0x00, 0x69, 0x6c, + 0x69, 0x69, 0x8a, 0x9d, 0xa2, 0x9d, 0x00, 0x9d, 0xb5, 0xb5, 0xb8, 0xc1, + 0xc7, 0xd1, 0xd0, 0x00, 0xde, 0x7b, 0x03, 0x07, 0x13, 0x17, 0x1b, 0x1d, + 0x03, 0x43, 0x58, 0x62, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, + 0x17, 0x07, 0x02, 0x25, 0x1c, 0x1d, 0x00, 0x1b, 0x1a, 0x12, 0x09, 0x04, + 0x81, 0xd0, 0xd1, 0x00, 0xc1, 0xc2, 0xb7, 0xb5, 0xb5, 0xb4, 0xa3, 0xa2, + 0x00, 0xa2, 0xa2, 0xa2, 0x84, 0x48, 0x3c, 0x3f, 0x3f, 0x00, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x4d, 0x48, 0x4d, 0x20, 0x4d, 0x4d, 0xe9, 0x5f, 0x5f, + 0x5f, 0x59, 0x59, 0x00, 0x59, 0x59, 0x64, 0x59, 0x69, 0x69, 0x83, 0xa2, + 0x00, 0xa2, 0xa2, 0xa2, 0xa3, 0xb5, 0xb7, 0xc2, 0xc1, 0x00, 0xc7, 0xd1, + 0xd0, 0xde, 0x7b, 0x02, 0x07, 0x12, 0x00, 0x18, 0x1a, 0x1b, 0x1d, 0x39, + 0x5e, 0x62, 0x62, 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, + 0xc0, 0x07, 0x01, 0x25, 0x1f, 0x1e, 0x1d, 0x1b, 0x1a, 0x00, 0x12, 0x09, + 0x04, 0x5c, 0xd0, 0xd1, 0xc7, 0xc1, 0x00, 0xc2, 0xb5, 0xb5, 0xb4, 0xb4, + 0xa2, 0xa2, 0xa9, 0x00, 0xa9, 0xa9, 0x92, 0x4d, 0x3f, 0x3f, 0x3f, 0x48, + 0x04, 0x48, 0x48, 0x4d, 0x4d, 0x4d, 0xe9, 0x4d, 0x59, 0x92, 0xe9, 0x59, + 0x59, 0xe9, 0x6c, 0x97, 0x19, 0xa2, 0x00, 0xa2, 0xb4, 0xb5, 0xc2, 0xc2, + 0xc7, 0xd4, 0xd1, 0x00, 0xd0, 0xde, 0x7b, 0x03, 0x07, 0x12, 0x18, 0x1a, + 0x00, 0x1b, 0x1d, 0x1e, 0x29, 0x62, 0x5e, 0x62, 0x62, 0x1f, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x80, 0x07, 0x00, 0x00, 0x46, 0x24, + 0x1f, 0x1e, 0x1d, 0x00, 0x1b, 0x1a, 0x12, 0x09, 0x05, 0x47, 0xd0, 0xd1, + 0x00, 0xd4, 0xc1, 0xc2, 0xc2, 0xb5, 0xb5, 0xb4, 0xb2, 0x10, 0xa9, 0xa9, + 0xa9, 0xe9, 0x8a, 0x5f, 0x48, 0x48, 0x02, 0x48, 0x48, 0x48, 0x4d, 0x4d, + 0x4d, 0xe9, 0x4d, 0x02, 0x4d, 0x59, 0x59, 0x59, 0x6c, 0x97, 0x34, 0xb4, + 0x00, 0xc4, 0xc2, 0xc2, 0xc1, 0xd4, 0xd1, 0xd1, 0xe6, 0x00, 0xde, 0x47, + 0x04, 0x07, 0x12, 0x18, 0x1a, 0x1b, 0x00, 0x1d, 0x1e, 0x1f, 0x24, 0x62, + 0x62, 0x75, 0xa9, 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, + 0x80, 0x07, 0x00, 0x25, 0x36, 0x24, 0x1f, 0x1f, 0x1e, 0x00, 0x1d, 0x1b, + 0x1a, 0x13, 0x0a, 0x06, 0x10, 0xd1, 0x00, 0xe2, 0xd1, 0xd4, 0xc1, 0xc2, + 0xc4, 0xc4, 0xb5, 0x00, 0xb4, 0xb4, 0xb1, 0xa9, 0xa9, 0xb1, 0xb1, 0xb1, + 0x00, 0xb1, 0xa9, 0x97, 0x6c, 0x59, 0x4d, 0x48, 0x4d, 0x02, 0x4d, 0x4d, + 0x4d, 0x59, 0x6c, 0x97, 0x74, 0xa9, 0x00, 0xb2, 0xb4, 0xc4, 0xc4, 0xc2, + 0xc1, 0xd4, 0xd4, 0x00, 0xd1, 0xe5, 0xe6, 0xde, 0x16, 0x05, 0x0a, 0x13, + 0x00, 0x18, 0x1a, 0x1b, 0x1d, 0x1e, 0x1f, 0x24, 0x25, 0x00, 0x4a, 0x62, + 0x62, 0x62, 0xbb, 0x00, 0x00, 0x00, 0xfc, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, + 0x07, 0x25, 0x29, 0x00, 0x25, 0x24, 0x1f, 0x1f, 0x1e, 0x1d, 0x1b, 0x19, + 0x00, 0x14, 0x0c, 0x07, 0x0d, 0xa7, 0xe5, 0xd1, 0xd4, 0x00, 0xd4, 0xd2, + 0xcd, 0xc4, 0xc4, 0xc4, 0xc4, 0xb4, 0x0e, 0xb2, 0xb1, 0xb1, 0xb1, 0xe9, + 0xd4, 0xa7, 0xb1, 0x40, 0xb2, 0x19, 0xc2, 0xd2, 0xd2, 0xd4, 0xdd, 0xe5, + 0x00, 0xe6, 0xf6, 0xbe, 0x0b, 0x07, 0x0c, 0x14, 0x17, 0x00, 0x1a, 0x1b, + 0x1d, 0x1e, 0x1f, 0x24, 0x25, 0x25, 0x07, 0x39, 0x25, 0x00, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0xe0, 0x5f, 0x17, 0x07, 0x00, 0x00, 0x25, 0x25, 0x2b, + 0x00, 0x29, 0x25, 0x24, 0x1f, 0x1e, 0x1e, 0x1d, 0x1b, 0x00, 0x19, 0x18, + 0x0f, 0x07, 0x03, 0x42, 0xe2, 0xe2, 0x00, 0xdd, 0xd4, 0xd2, 0xd2, 0xcd, + 0xcd, 0xc4, 0xc4, 0x01, 0xc4, 0xc4, 0xb4, 0xb2, 0xb1, 0xb1, 0xb1, 0xe9, + 0xd0, 0xd4, 0xa2, 0xb2, 0x49, 0xcd, 0xcd, 0xd2, 0xd2, 0x00, 0xd4, 0xdd, + 0xe2, 0xec, 0xe6, 0xe6, 0x47, 0x02, 0x00, 0x07, 0x0f, 0x18, 0x19, 0x1b, + 0x1b, 0x1d, 0x1e, 0x00, 0x1f, 0x24, 0x25, 0x25, 0x29, 0x2b, 0x25, 0x00, + 0x3f, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x00, 0x00, 0x00, + 0x25, 0x2b, 0x2b, 0x2b, 0x29, 0x25, 0x00, 0x24, 0x24, 0x1f, 0x1e, 0x1b, + 0x1a, 0x17, 0x18, 0x00, 0x12, 0x0a, 0x07, 0x0d, 0x7b, 0xec, 0xe2, 0xdd, + 0x00, 0xd4, 0xd2, 0xd2, 0xcd, 0xcd, 0xcd, 0xc4, 0xc4, 0x41, 0xc4, 0xe9, + 0xb4, 0xb2, 0xbb, 0xbb, 0xbb, 0xe9, 0x20, 0xb2, 0xb2, 0x83, 0xcd, 0xd2, + 0xd2, 0xd4, 0xd4, 0x00, 0xdd, 0xe2, 0xec, 0xf4, 0xf6, 0xae, 0x0b, 0x06, + 0x00, 0x07, 0x12, 0x18, 0x19, 0x1b, 0x1d, 0x1d, 0x1e, 0x00, 0x1f, 0x24, + 0x25, 0x25, 0x29, 0x29, 0x30, 0x39, 0x0f, 0x25, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0xc0, 0x17, 0x07, 0x25, 0x39, 0x30, 0x30, 0x2b, 0x2b, + 0x00, 0x29, 0x25, 0x22, 0x3a, 0x2d, 0x4a, 0x4f, 0x4a, 0x00, 0x3a, 0x19, + 0x15, 0x0f, 0x07, 0x05, 0x10, 0xb9, 0x00, 0xec, 0xe5, 0xdd, 0xd9, 0xd9, + 0xd2, 0xd2, 0xcd, 0x03, 0xcd, 0xcd, 0xcd, 0xc4, 0xc4, 0xc4, 0xe9, 0xd3, + 0x80, 0x8a, 0xd2, 0xd2, 0xd9, 0xd9, 0xdd, 0xe2, 0xe5, 0x00, 0xec, 0xf4, + 0xf6, 0xbe, 0x10, 0x05, 0x07, 0x0f, 0x00, 0x15, 0x17, 0x24, 0x25, 0x25, + 0x25, 0x25, 0x46, 0x00, 0x30, 0x25, 0x25, 0x29, 0x29, 0x2b, 0x2b, 0x30, + 0x0f, 0x25, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xc0, 0x17, 0x07, + 0x25, 0x30, 0x30, 0x30, 0x30, 0x2b, 0x00, 0x39, 0x4a, 0x62, 0x62, 0x62, + 0x5e, 0x5e, 0x58, 0x00, 0x62, 0x62, 0x19, 0x18, 0x13, 0x0c, 0x07, 0x04, + 0x00, 0x10, 0xae, 0xec, 0xec, 0xe2, 0xdd, 0xdd, 0xd9, 0x00, 0xd9, 0xd9, + 0xd2, 0xd2, 0xd2, 0xd2, 0xcd, 0xcd, 0x70, 0xcd, 0xe9, 0xb2, 0x79, 0xdd, + 0xdd, 0xe2, 0xec, 0x00, 0xec, 0xf4, 0xf6, 0xa5, 0x10, 0x03, 0x07, 0x0c, + 0x00, 0x12, 0x18, 0x19, 0x39, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x25, 0x4a, 0x28, 0x30, 0x2b, 0x0f, 0x30, 0x30, 0x39, 0x25, 0x8b, + 0x63, 0xb7, 0x6f, 0xc0, 0x27, 0x07, 0x25, 0x39, 0x30, 0x30, 0x30, 0x39, + 0x00, 0x25, 0x25, 0x00, 0x62, 0x62, 0x62, 0x5e, 0x62, 0x40, 0x62, 0x79, + 0x1b, 0x19, 0x1a, 0x12, 0x0c, 0x07, 0x00, 0x06, 0x08, 0x47, 0xc8, 0xf4, + 0xec, 0xe5, 0xe2, 0x01, 0xe2, 0xdd, 0xdd, 0xdd, 0xd9, 0xd9, 0xd9, 0xe9, + 0x20, 0xd9, 0xd9, 0xa9, 0xe2, 0xe2, 0xe5, 0xec, 0xec, 0x00, 0xf4, 0xf6, + 0xd3, 0x5c, 0x06, 0x05, 0x07, 0x0c, 0x00, 0x12, 0x18, 0x19, 0x1a, 0x1f, + 0x75, 0x62, 0x00, 0x20, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x25, 0x4f, 0x2a, + 0x0f, 0x30, 0x30, 0x30, 0x25, 0x8e, 0x4e, 0x87, 0x3f, 0xc0, 0x07, 0x01, + 0x4f, 0x30, 0x30, 0x39, 0x25, 0x25, 0x84, 0x02, 0x62, 0x58, 0x62, 0x62, + 0x01, 0x25, 0x25, 0x00, 0x1b, 0x1b, 0x19, 0x1a, 0x12, 0x0e, 0x07, 0x07, + 0x00, 0x03, 0x0d, 0x47, 0xbe, 0xec, 0xf4, 0xec, 0xec, 0x00, 0xec, 0xe5, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe5, 0x40, 0xe5, 0xa9, 0xf4, 0xf4, 0xf6, + 0xf6, 0xc8, 0x5c, 0x00, 0x10, 0x02, 0x07, 0x06, 0x0e, 0x12, 0x18, 0x19, + 0x00, 0x1a, 0x1b, 0x1b, 0x46, 0x75, 0x62, 0x00, 0x00, 0x60, 0x00, 0xe9, + 0xd2, 0x25, 0x43, 0x30, 0x30, 0x39, 0x7c, 0x25, 0x87, 0x3f, 0x77, 0x2f, + 0x06, 0x25, 0x2a, 0x10, 0x2a, 0x4f, 0x25, 0x03, 0x62, 0x62, 0x62, 0x62, + 0x80, 0x6c, 0x1d, 0x1d, 0x1b, 0x1b, 0x19, 0x18, 0x17, 0x00, 0x11, 0x0c, + 0x07, 0x07, 0x04, 0x02, 0x16, 0x47, 0x02, 0x81, 0xbe, 0xe6, 0xf4, 0xf6, + 0xf4, 0xe9, 0xf6, 0x00, 0xf4, 0xe5, 0xbe, 0x7b, 0x47, 0x16, 0x02, 0x04, + 0x00, 0x07, 0x07, 0x0c, 0x11, 0x15, 0x18, 0x19, 0x1a, 0x00, 0x1b, 0x1b, + 0x1d, 0x1d, 0x5e, 0x5e, 0x62, 0x62, 0x18, 0x00, 0x00, 0x00, 0xe9, 0xd2, + 0x25, 0x25, 0x39, 0x3e, 0x30, 0x4f, 0x8f, 0x47, 0x77, 0x2f, 0x05, 0x25, + 0x12, 0x43, 0x4f, 0x25, 0x05, 0x62, 0x62, 0x66, 0x25, 0x00, 0x1e, 0x1d, + 0x1d, 0x1b, 0x1b, 0x1a, 0x1a, 0x18, 0x00, 0x17, 0x12, 0x0f, 0x0a, 0x07, + 0x07, 0x06, 0x04, 0x18, 0x02, 0x02, 0x02, 0xe9, 0xd2, 0x04, 0x06, 0x07, + 0x00, 0x07, 0x07, 0x0e, 0x12, 0x14, 0x18, 0x18, 0x1a, 0x00, 0x1a, 0x1b, + 0x1d, 0x1d, 0x1e, 0x1e, 0x30, 0x5e, 0x03, 0x5e, 0xa2, 0x62, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0x0f, 0x25, 0x25, 0x28, 0x25, 0x87, 0x3f, 0x77, 0x2f, + 0x92, 0x04, 0x25, 0x25, 0x06, 0x62, 0x62, 0x67, 0x25, 0x00, 0x1f, 0x1f, + 0x1e, 0x1d, 0x1d, 0x1d, 0x1b, 0x1b, 0x00, 0x1a, 0x19, 0x18, 0x18, 0x14, + 0x12, 0x11, 0x0f, 0x00, 0x0c, 0x0c, 0x0a, 0x07, 0x07, 0x06, 0x07, 0x0a, + 0x00, 0x0a, 0x0e, 0x0f, 0x11, 0x12, 0x14, 0x18, 0x18, 0x00, 0x17, 0x1a, + 0x1a, 0x1b, 0x1b, 0x1d, 0x1d, 0x1e, 0x00, 0x1e, 0x1f, 0x1f, 0x1c, 0x75, + 0x5e, 0x94, 0x62, 0x18, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x00, 0x00, 0x25, + 0x7f, 0x25, 0x87, 0x3f, 0x77, 0x2f, 0x07, 0x07, 0x06, 0x00, 0x25, 0x25, + 0x24, 0x24, 0x1f, 0x1f, 0x1e, 0x1e, 0x00, 0x1d, 0x1d, 0x1b, 0x1d, 0x30, + 0x39, 0x39, 0x17, 0x01, 0x1a, 0x1a, 0x18, 0x18, 0x18, 0x1a, 0x1a, 0xcb, + 0x80, 0xb9, 0x1c, 0x30, 0x30, 0x25, 0x25, 0x1d, 0x1d, 0x00, 0x1e, 0x1e, + 0x1e, 0x1f, 0x1f, 0x24, 0x24, 0x25, 0x01, 0x62, 0x94, 0x58, 0x62, 0x00, + 0x00, 0x00, 0xe9, 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, + 0x80, 0x01, 0x25, 0x25, 0x25, 0x25, 0x24, 0x24, 0x1f, 0x00, 0x1f, 0x1f, + 0x1d, 0x40, 0x62, 0x5e, 0x62, 0x62, 0x00, 0x01, 0x19, 0x1b, 0x1b, 0x1b, + 0x1b, 0x1a, 0x1a, 0x20, 0x1a, 0x1a, 0xd1, 0x1b, 0x1a, 0x3a, 0x94, 0x62, + 0x00, 0x00, 0x25, 0x25, 0x39, 0x1e, 0x1f, 0x1f, 0x24, 0x01, 0x24, 0x24, + 0x25, 0x25, 0x25, 0x00, 0x62, 0x79, 0x3f, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x01, 0x25, 0x28, 0x29, 0x29, + 0x00, 0x25, 0x25, 0x25, 0x24, 0x30, 0x46, 0x5e, 0x5e, 0x00, 0x5e, 0x62, + 0x00, 0x00, 0x01, 0x19, 0x1d, 0x1d, 0x61, 0x1d, 0xe9, 0xd2, 0x1b, 0x43, + 0x5e, 0x8e, 0x69, 0x00, 0x00, 0x25, 0x46, 0x1f, 0x24, 0x24, 0x25, 0x25, + 0x03, 0x29, 0x29, 0x25, 0x00, 0x00, 0x62, 0x7a, 0x61, 0xff, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x80, 0x01, 0x25, 0x2b, 0x2b, 0x2b, + 0x29, 0x29, 0x29, 0x01, 0x40, 0x25, 0x62, 0x5e, 0x5e, 0x62, 0x62, 0x01, + 0x06, 0x01, 0x1c, 0x1e, 0x1e, 0x1e, 0xe9, 0xd1, 0x3a, 0x10, 0x5e, 0x5e, + 0x8e, 0x6a, 0x00, 0x00, 0x25, 0x25, 0x03, 0x25, 0x29, 0x29, 0x29, 0x2b, + 0x4a, 0x9b, 0x73, 0xff, 0xb7, 0x6f, 0x27, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x00, 0x25, 0x30, 0x30, 0x2b, 0x2b, 0x29, 0x43, 0x25, 0x04, 0x00, 0x62, + 0x5e, 0x58, 0x62, 0x74, 0x24, 0x1f, 0x20, 0x1f, 0x1f, 0xe9, 0x24, 0x1c, + 0x62, 0x5e, 0x5e, 0x40, 0x62, 0x64, 0x00, 0x25, 0x25, 0x2b, 0x2b, 0x30, + 0x3f, 0x2b, 0x43, 0x9c, 0x6c, 0xa7, 0x5f, 0x17, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x05, 0x25, 0x30, 0x30, 0x30, 0x00, 0x2b, 0x46, 0x25, 0x00, 0x00, + 0x62, 0x5e, 0xa9, 0x88, 0x76, 0x25, 0x25, 0x25, 0xe9, 0x25, 0x25, 0x62, + 0x08, 0x75, 0x5e, 0x62, 0x62, 0x5c, 0x00, 0x25, 0x2a, 0x0f, 0x30, 0x30, + 0x30, 0x43, 0x9d, 0x65, 0x97, 0x4f, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x03, 0x25, 0x30, 0x08, 0x30, 0x30, 0x43, 0x25, 0x01, 0x62, 0x4c, 0x62, + 0x88, 0x6e, 0x29, 0x29, 0x29, 0xe9, 0x36, 0x25, 0x00, 0x20, 0xa2, 0x5e, + 0x66, 0x00, 0x25, 0x25, 0x30, 0x30, 0x3f, 0x30, 0x43, 0x96, 0x56, 0x87, + 0x3f, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x01, 0x25, 0x30, 0x30, 0x2a, + 0x48, 0x25, 0x02, 0x62, 0x62, 0x6f, 0x25, 0x2b, 0x2b, 0x12, 0x2b, 0x2b, + 0x2b, 0x51, 0x62, 0x4c, 0x5f, 0x00, 0x07, 0x25, 0x43, 0x30, 0x30, 0x43, + 0x97, 0x4f, 0x77, 0xfc, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x4a, + 0x12, 0x30, 0x2a, 0x01, 0x03, 0x62, 0x62, 0x67, 0x4a, 0x02, 0x30, 0x30, + 0x30, 0x30, 0x39, 0x25, 0x01, 0xb1, 0x87, 0x5f, 0x00, 0x00, 0x25, 0x43, + 0x64, 0x77, 0xa7, 0xfe, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x04, 0x43, + 0x28, 0x2a, 0x01, 0x04, 0x62, 0x07, 0x00, 0x25, 0x2a, 0x0c, 0x30, 0x30, + 0x30, 0x4a, 0x5f, 0x4f, 0x39, 0x30, 0x7f, 0x25, 0x87, 0x3f, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0xcc, 0x07, 0x07, 0x43, 0x4f, 0x5f, 0x5f, 0x00, 0x43, + 0x0c, 0x30, 0x30, 0x30, 0x25, 0x47, 0x07, 0x25, 0x2a, 0xff, 0x5f, 0x1f, + 0x7f, 0x37, 0x07, 0x07, 0x07, 0x07, 0x8c, 0x07, 0x25, 0x4a, 0x25, 0x57, + 0x57, 0x00, 0x25, 0x1f, 0x30, 0x30, 0x39, 0x47, 0x47, 0x41, 0x5f, 0x1f, + 0xfe, 0x7f, 0x37, 0x07, 0x07, 0x07, 0x07, 0x07, 0x25, 0x73, 0x25, 0x57, + 0x57, 0x51, 0x2a, 0x30, 0x47, 0x47, 0xff, 0x42, 0x57, 0x17, 0x7f, 0x37, + 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x03, 0x43, 0x30, 0x25, + 0xff, 0x07, 0x07, 0x01, 0x57, 0x17, 0x7f, 0x37, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x03, 0x4a, 0x3f, 0x39, 0x25, 0x07, 0x07, 0x77, + 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x3f, 0x25, 0x43, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x3f, 0x25, 0x25, 0x07, 0x07, 0x77, + 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x3f, 0x00, 0x25, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xc0, 0x07, 0x06, +}; + +//***************************************************************************** +// +// Cloudy Image +// +//***************************************************************************** +const uint8_t g_pui8CloudyImage[] = +{ + IMAGE_FMT_8BPP_COMP, + 128, 0, + 128, 0, + + 254, + 0x00, 0x00, 0x00, + 0x89, 0x4b, 0x09, + 0x8a, 0x4c, 0x09, + 0x8a, 0x4c, 0x0a, + 0x8b, 0x4d, 0x09, + 0x8d, 0x4d, 0x0a, + 0x8d, 0x4e, 0x0a, + 0x8d, 0x4e, 0x0c, + 0x83, 0x4d, 0x12, + 0x90, 0x4f, 0x0b, + 0x90, 0x50, 0x0c, + 0x90, 0x51, 0x0c, + 0x8e, 0x50, 0x0f, + 0x91, 0x50, 0x0e, + 0x92, 0x52, 0x0c, + 0x92, 0x52, 0x0f, + 0x93, 0x53, 0x0e, + 0x95, 0x53, 0x0e, + 0x94, 0x53, 0x0f, + 0x95, 0x54, 0x0f, + 0x95, 0x54, 0x11, + 0x96, 0x54, 0x11, + 0x97, 0x55, 0x0f, + 0x92, 0x54, 0x14, + 0x96, 0x55, 0x12, + 0x96, 0x56, 0x11, + 0x99, 0x56, 0x10, + 0x98, 0x56, 0x12, + 0x97, 0x56, 0x13, + 0x9a, 0x58, 0x10, + 0x99, 0x57, 0x13, + 0x9b, 0x58, 0x12, + 0x99, 0x58, 0x14, + 0x9c, 0x59, 0x11, + 0x9a, 0x58, 0x14, + 0x9c, 0x59, 0x14, + 0x9c, 0x59, 0x15, + 0x9d, 0x5a, 0x14, + 0x9e, 0x5b, 0x12, + 0x9e, 0x5a, 0x16, + 0x9d, 0x5b, 0x16, + 0x98, 0x5a, 0x1b, + 0xa0, 0x5d, 0x14, + 0xa0, 0x5c, 0x16, + 0x9f, 0x5c, 0x17, + 0xa0, 0x5c, 0x17, + 0xa0, 0x5d, 0x19, + 0xa3, 0x5f, 0x14, + 0xa2, 0x5e, 0x17, + 0xa3, 0x5f, 0x17, + 0xa3, 0x5e, 0x19, + 0xa2, 0x5f, 0x19, + 0xa5, 0x5f, 0x19, + 0xa5, 0x61, 0x16, + 0xa4, 0x60, 0x1a, + 0xa4, 0x60, 0x1b, + 0xa6, 0x61, 0x1a, + 0xa7, 0x63, 0x17, + 0xa7, 0x61, 0x1c, + 0xa8, 0x63, 0x1a, + 0xa8, 0x62, 0x1c, + 0xa7, 0x62, 0x1d, + 0xa4, 0x62, 0x1f, + 0xa9, 0x65, 0x19, + 0xa9, 0x64, 0x1c, + 0xaa, 0x64, 0x1d, + 0xab, 0x66, 0x1c, + 0xab, 0x65, 0x1f, + 0xac, 0x67, 0x1b, + 0xab, 0x66, 0x1e, + 0xad, 0x67, 0x1e, + 0xac, 0x67, 0x20, + 0xae, 0x69, 0x1c, + 0xae, 0x67, 0x20, + 0xa5, 0x66, 0x26, + 0xaf, 0x67, 0x21, + 0xae, 0x69, 0x20, + 0xaf, 0x6a, 0x1e, + 0xb0, 0x69, 0x21, + 0xb1, 0x6c, 0x1e, + 0xb0, 0x6a, 0x23, + 0xb1, 0x6c, 0x20, + 0xb1, 0x6b, 0x22, + 0xb2, 0x6b, 0x23, + 0xb3, 0x6c, 0x24, + 0xb1, 0x6c, 0x25, + 0xb3, 0x6e, 0x22, + 0xb4, 0x6f, 0x20, + 0xb5, 0x6e, 0x24, + 0xb5, 0x70, 0x23, + 0xb6, 0x71, 0x21, + 0xb6, 0x6f, 0x25, + 0xb7, 0x70, 0x26, + 0xb2, 0x6f, 0x2b, + 0xb8, 0x70, 0x27, + 0xb6, 0x70, 0x28, + 0xb7, 0x73, 0x23, + 0xb8, 0x72, 0x26, + 0xb9, 0x72, 0x26, + 0xb9, 0x74, 0x24, + 0xba, 0x73, 0x28, + 0xbb, 0x73, 0x29, + 0xb8, 0x73, 0x2b, + 0xbb, 0x76, 0x26, + 0xbb, 0x74, 0x2a, + 0xbb, 0x75, 0x29, + 0xbc, 0x78, 0x26, + 0xbc, 0x76, 0x2a, + 0xbc, 0x78, 0x28, + 0xbc, 0x76, 0x2d, + 0xbe, 0x77, 0x2b, + 0xbd, 0x78, 0x2a, + 0xb0, 0x74, 0x37, + 0xbf, 0x77, 0x2d, + 0xbf, 0x79, 0x2c, + 0xbe, 0x7b, 0x29, + 0xc1, 0x78, 0x2e, + 0xbf, 0x7c, 0x2a, + 0xbf, 0x7b, 0x2c, + 0xc0, 0x7b, 0x2e, + 0xc1, 0x7b, 0x2e, + 0xc1, 0x7d, 0x2c, + 0xc1, 0x7d, 0x2d, + 0xc3, 0x7c, 0x2f, + 0xc2, 0x7d, 0x2e, + 0xc4, 0x7d, 0x30, + 0xc2, 0x7f, 0x2d, + 0xc3, 0x7e, 0x2f, + 0xc6, 0x7e, 0x31, + 0xc3, 0x80, 0x2f, + 0xc4, 0x80, 0x2f, + 0xc5, 0x7f, 0x31, + 0xc8, 0x7e, 0x32, + 0xc6, 0x7e, 0x33, + 0xc4, 0x7f, 0x34, + 0xbd, 0x7d, 0x3b, + 0xcb, 0x7f, 0x33, + 0xc6, 0x82, 0x31, + 0xc9, 0x81, 0x33, + 0xc7, 0x82, 0x32, + 0xc9, 0x81, 0x34, + 0xcc, 0x80, 0x35, + 0xc7, 0x83, 0x32, + 0xc8, 0x83, 0x33, + 0xc8, 0x84, 0x32, + 0xca, 0x83, 0x34, + 0xc8, 0x82, 0x37, + 0xcd, 0x82, 0x37, + 0xc9, 0x85, 0x33, + 0xcc, 0x83, 0x36, + 0xca, 0x86, 0x34, + 0xcb, 0x86, 0x35, + 0xcc, 0x85, 0x37, + 0xd0, 0x85, 0x39, + 0xcb, 0x88, 0x35, + 0xcd, 0x87, 0x38, + 0xcd, 0x85, 0x3c, + 0xcc, 0x89, 0x36, + 0xcd, 0x89, 0x37, + 0xd2, 0x86, 0x3c, + 0xcd, 0x8b, 0x37, + 0xcf, 0x8a, 0x39, + 0xd5, 0x88, 0x3d, + 0xd0, 0x8b, 0x39, + 0xcf, 0x8c, 0x38, + 0xd2, 0x8a, 0x3c, + 0xd0, 0x8d, 0x3a, + 0xd6, 0x8a, 0x3f, + 0xd1, 0x8d, 0x3b, + 0xd9, 0x8a, 0x40, + 0xcc, 0x89, 0x48, + 0xd2, 0x8e, 0x3c, + 0xd5, 0x8e, 0x3e, + 0xd2, 0x90, 0x3c, + 0xd2, 0x91, 0x3c, + 0xd3, 0x91, 0x3c, + 0xd6, 0x8f, 0x40, + 0xd9, 0x8e, 0x41, + 0xd4, 0x91, 0x3d, + 0xdc, 0x8d, 0x42, + 0xdf, 0x8d, 0x43, + 0xd6, 0x91, 0x40, + 0xd4, 0x93, 0x3e, + 0xd8, 0x91, 0x41, + 0xd6, 0x93, 0x40, + 0xdf, 0x8f, 0x45, + 0xdd, 0x91, 0x44, + 0xd6, 0x95, 0x3f, + 0xd8, 0x94, 0x41, + 0xcd, 0x8e, 0x51, + 0xda, 0x93, 0x43, + 0xe2, 0x90, 0x46, + 0xd6, 0x95, 0x41, + 0xdc, 0x92, 0x46, + 0xdf, 0x92, 0x46, + 0xd9, 0x93, 0x47, + 0xd8, 0x96, 0x42, + 0xe2, 0x92, 0x47, + 0xd9, 0x97, 0x43, + 0xe4, 0x92, 0x49, + 0xdb, 0x96, 0x46, + 0xe6, 0x93, 0x48, + 0xd9, 0x98, 0x43, + 0xdf, 0x95, 0x48, + 0xea, 0x93, 0x48, + 0xe2, 0x95, 0x49, + 0xe6, 0x94, 0x4a, + 0xda, 0x9a, 0x44, + 0xdc, 0x99, 0x47, + 0xe5, 0x96, 0x4a, + 0xd8, 0x95, 0x51, + 0xdf, 0x98, 0x49, + 0xe2, 0x97, 0x4a, + 0xeb, 0x95, 0x4b, + 0xe9, 0x96, 0x4c, + 0xdf, 0x9a, 0x48, + 0xe7, 0x97, 0x4b, + 0xea, 0x96, 0x4c, + 0xdc, 0x9c, 0x47, + 0xe1, 0x98, 0x4e, + 0xe4, 0x99, 0x4b, + 0xdf, 0x9b, 0x49, + 0xe2, 0x9a, 0x4a, + 0xea, 0x97, 0x4d, + 0xdd, 0x9c, 0x48, + 0xd0, 0x95, 0x5c, + 0xeb, 0x97, 0x4f, + 0xe7, 0x99, 0x4d, + 0xe5, 0x9a, 0x4d, + 0xe7, 0x9a, 0x4d, + 0xe8, 0x9a, 0x4d, + 0xde, 0x9e, 0x49, + 0xe5, 0x99, 0x51, + 0xe2, 0x9d, 0x4b, + 0xe0, 0x9e, 0x4a, + 0xe9, 0x9a, 0x50, + 0xe2, 0x9f, 0x4b, + 0xe4, 0x9e, 0x4d, + 0xe1, 0x9e, 0x50, + 0xe5, 0x9e, 0x4f, + 0xdb, 0x9c, 0x5d, + 0xe7, 0x9c, 0x5b, + 0xda, 0xa1, 0x6e, + 0xeb, 0xa5, 0x68, + 0xdd, 0xaa, 0x7d, + 0xe8, 0xac, 0x79, + 0xf1, 0xb0, 0x79, + 0xe4, 0xb5, 0x8b, + 0xf1, 0xba, 0x8c, + 0xe6, 0xbd, 0x9b, + 0xf0, 0xc2, 0x9b, + 0xf1, 0xca, 0xa9, + 0xf6, 0xd4, 0xb8, + 0xf7, 0xda, 0xc3, + 0xf9, 0xe1, 0xcd, + + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x04, 0xfe, 0x01, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, + 0xfe, 0xfe, 0x07, 0xff, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xf0, 0x07, 0x07, 0x07, 0x07, 0xfd, 0xfb, 0xf6, 0xf3, 0x00, 0xe2, 0xd5, + 0xcc, 0xcc, 0xe2, 0xf1, 0xf6, 0xfa, 0x3f, 0xfd, 0xfe, 0x07, 0x07, 0x77, + 0x2f, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x01, 0xfd, + 0x00, 0xfc, 0xf6, 0xe2, 0xd5, 0xd9, 0xdf, 0xd9, 0xdf, 0x00, 0xd9, 0xd9, + 0xd9, 0xd9, 0xd5, 0xd5, 0xcc, 0xf3, 0x3f, 0xfb, 0xfe, 0x07, 0xbf, 0x77, + 0x2f, 0x07, 0x07, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0xfd, 0xfc, + 0x03, 0xf6, 0xd5, 0xd9, 0xdf, 0xdf, 0xdf, 0xe9, 0xd1, 0x00, 0xd9, 0xd9, + 0xd9, 0xd5, 0xd5, 0xcc, 0xf1, 0xfb, 0x7f, 0xfe, 0x07, 0xbf, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x03, 0xfd, 0xf8, 0xd6, + 0x0c, 0xd6, 0xdf, 0xdf, 0xdf, 0xe9, 0xd3, 0xd6, 0xd9, 0x00, 0xd9, 0xd9, + 0xd5, 0xd5, 0xd5, 0xcc, 0xf6, 0xfd, 0xff, 0x05, 0xcd, 0x97, 0x4f, 0x07, + 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x05, 0xfc, 0xf3, 0xd5, 0xd6, + 0x03, 0xdf, 0xd9, 0xd9, 0xdf, 0xdf, 0xdf, 0xe9, 0xd3, 0x00, 0xd6, 0xd6, + 0xd8, 0xd6, 0xd5, 0xcc, 0xc9, 0xeb, 0x00, 0xfc, 0xfe, 0xfa, 0xe2, 0xe2, + 0xe2, 0xf1, 0xf3, 0x0f, 0xfa, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, + 0xfe, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0xfc, 0x00, 0xf1, 0xce, + 0xd8, 0xd8, 0xd8, 0xd8, 0xe3, 0xe3, 0x08, 0xe3, 0xe3, 0xe3, 0xe6, 0xd3, + 0xd8, 0xd8, 0xd6, 0x00, 0xd8, 0xd6, 0xce, 0xce, 0xce, 0xc9, 0xce, 0xfb, + 0x00, 0xfe, 0xfa, 0xd5, 0xe2, 0xe2, 0xd9, 0xd5, 0xcc, 0x0f, 0xf6, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xfe, 0x17, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x03, 0xfc, 0x00, 0xf1, 0xd1, 0xd1, 0xd8, 0xd8, 0xd8, 0xe3, 0xe3, + 0x10, 0xe6, 0xe6, 0xe6, 0xe9, 0xe6, 0xe3, 0xe3, 0xe3, 0x40, 0xe3, 0x81, + 0xd1, 0xce, 0xce, 0xc7, 0xc9, 0xc9, 0x00, 0xce, 0xfc, 0xfd, 0xf5, 0xdf, + 0xeb, 0xdf, 0xdf, 0x01, 0xd9, 0xd5, 0xcc, 0xf8, 0x00, 0x00, 0x00, 0xe9, + 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x80, 0x07, 0x00, + 0x00, 0xfc, 0xf5, 0xd1, 0xd1, 0xd8, 0x03, 0xd8, 0xe3, 0xe3, 0xe4, 0xe4, + 0xe4, 0xe9, 0xd4, 0x00, 0xe3, 0xe3, 0xd8, 0xd1, 0xd1, 0xd1, 0xd1, 0xc7, + 0x00, 0xc7, 0xc7, 0xc7, 0xe8, 0xfd, 0xfd, 0xf1, 0xeb, 0x00, 0xe6, 0xe3, + 0xd6, 0xd6, 0xce, 0xc9, 0xf3, 0x00, 0x3f, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x07, 0x00, 0xfa, 0xc7, 0xd1, + 0x00, 0xd1, 0xd1, 0xdc, 0xdc, 0xdc, 0xe4, 0xe4, 0xe4, 0xc2, 0xe9, 0xd4, + 0xe4, 0xe4, 0xe3, 0xdc, 0x51, 0xc7, 0x00, 0xc7, 0xc7, 0xc5, 0xbf, 0xf5, + 0xfd, 0xfb, 0xd8, 0x00, 0xeb, 0xe5, 0xe3, 0xd8, 0xce, 0xce, 0xc9, 0xf3, + 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xf8, 0x07, 0x07, + 0x07, 0x07, 0x06, 0xfb, 0xe8, 0xcd, 0x00, 0xcd, 0xd4, 0xdc, 0xdc, 0xdc, + 0xdc, 0xdc, 0xe4, 0x04, 0xe4, 0xe4, 0xef, 0xef, 0xef, 0xe9, 0xe4, 0xed, + 0x40, 0xe4, 0x7a, 0xd4, 0xcd, 0xcd, 0xc5, 0xc5, 0xc5, 0x04, 0xbf, 0xb4, + 0xfb, 0xfd, 0xf3, 0x61, 0xe3, 0xd1, 0x01, 0xc7, 0xc7, 0xbf, 0xf8, 0x00, + 0x00, 0x00, 0xe9, 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, + 0x80, 0x05, 0xf5, 0xc5, 0xcd, 0xcd, 0xd4, 0xd4, 0xd4, 0x01, 0xdc, 0xde, + 0xdc, 0xde, 0xed, 0xed, 0xed, 0xe9, 0x80, 0xd2, 0xe9, 0xdc, 0xdc, 0xde, + 0xd4, 0xd4, 0xcd, 0x00, 0xcd, 0xc5, 0xc5, 0xb9, 0xbf, 0xb4, 0xf1, 0xfc, + 0x00, 0xfb, 0xe4, 0xef, 0xef, 0xe4, 0xdc, 0xcd, 0xc5, 0x07, 0xbf, 0xbf, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xfe, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0x07, 0x04, 0xfa, 0x00, 0xe8, 0xdb, 0xcd, 0xcd, 0xcd, 0xd4, 0xde, 0xde, + 0x00, 0xde, 0xe9, 0xe9, 0xe9, 0xed, 0xe9, 0xed, 0xed, 0x60, 0xed, 0xe9, + 0xa9, 0xe9, 0xde, 0xde, 0xd4, 0xcd, 0x00, 0xcd, 0xc2, 0xc2, 0xc2, 0xb9, + 0xb4, 0xb3, 0xfa, 0x00, 0xfc, 0xf3, 0xef, 0xef, 0xe4, 0xdb, 0xcd, 0xc5, + 0x03, 0xc2, 0xb4, 0xf5, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xff, 0xa7, 0x5f, + 0x17, 0x07, 0x07, 0x07, 0x07, 0x02, 0x00, 0xfa, 0xf5, 0xdb, 0xdb, 0xd4, + 0xd3, 0xd3, 0xd3, 0x00, 0xde, 0xde, 0xe9, 0xe9, 0xe9, 0xe9, 0xec, 0xec, + 0x48, 0xec, 0xe9, 0xec, 0xec, 0xa2, 0xe9, 0xde, 0xd3, 0x00, 0xd3, 0xcb, + 0xc2, 0xc2, 0xba, 0xb9, 0xba, 0xb3, 0x01, 0xf3, 0xfc, 0xf8, 0xee, 0xee, + 0xdb, 0xdb, 0x89, 0x07, 0xb9, 0xb4, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0xf8, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x00, 0x00, 0xf8, 0x00, 0xf8, 0xf8, + 0xf6, 0xf3, 0xf3, 0xf3, 0xf3, 0xf5, 0x00, 0xf8, 0xf8, 0xf7, 0xdb, 0xdb, + 0xd3, 0xd3, 0xcb, 0x00, 0xd3, 0xd3, 0xd7, 0xdd, 0xdd, 0xe9, 0xea, 0xea, + 0x00, 0xe9, 0xe9, 0xec, 0xec, 0xec, 0xec, 0xec, 0xe9, 0x40, 0xe9, 0xb1, + 0xdd, 0xd3, 0xd7, 0xcb, 0xcb, 0xc2, 0x00, 0xc2, 0xba, 0xba, 0xb3, 0xb3, + 0xb3, 0xfb, 0xfb, 0x00, 0xee, 0xee, 0xee, 0xde, 0xd3, 0xcb, 0xba, 0xb3, + 0x07, 0xa9, 0xf7, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xf8, 0x5f, 0x17, + 0x07, 0x07, 0x05, 0xf8, 0xf8, 0xf6, 0x00, 0xf1, 0xd6, 0xcc, 0xc9, 0xc9, + 0xc9, 0xc7, 0xc7, 0x00, 0xc5, 0xc2, 0xb9, 0xba, 0xcb, 0xcb, 0xcb, 0xcb, + 0x00, 0xd3, 0xd3, 0xd7, 0xd7, 0xd7, 0xdd, 0xdd, 0xea, 0x30, 0xea, 0xea, + 0xe9, 0xd4, 0xdd, 0xdd, 0xd7, 0xd7, 0x00, 0xd3, 0xcb, 0xcb, 0xc1, 0xba, + 0xba, 0xb3, 0xb3, 0x00, 0xb1, 0xa9, 0xf7, 0xfb, 0xf1, 0xee, 0xee, 0xdd, + 0x00, 0xd3, 0xc8, 0xc1, 0xb1, 0xa9, 0xf0, 0x00, 0x00, 0x7f, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x80, 0x03, 0xf8, 0xf6, 0xf3, 0xd6, + 0xc9, 0xce, 0xc9, 0x00, 0xc9, 0xc7, 0xc9, 0xc5, 0xc5, 0xc5, 0xc2, 0xc2, + 0x00, 0xba, 0xba, 0xba, 0xbe, 0xc8, 0xc8, 0xc8, 0xd0, 0x00, 0xd0, 0xd7, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe7, 0xe7, 0x70, 0xe7, 0xe9, 0xd3, 0x89, 0xd7, + 0xd0, 0xd0, 0xc8, 0x00, 0xbe, 0xbe, 0xbe, 0xb1, 0xb1, 0xb1, 0xa9, 0xf2, + 0x00, 0xfb, 0xf5, 0xee, 0xee, 0xee, 0xd3, 0xc8, 0xc3, 0x01, 0xb1, 0xa7, + 0xd2, 0xfb, 0x00, 0x00, 0x00, 0xe9, 0xfe, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x07, 0x01, 0xf5, 0x01, 0xf3, 0xce, 0xc7, 0xc7, 0xc7, 0xc5, 0xc5, 0xe9, + 0x00, 0xc2, 0xc2, 0xc2, 0xba, 0xba, 0xba, 0xbe, 0xbe, 0x00, 0xbe, 0xbe, + 0xc8, 0xc8, 0xd0, 0xd0, 0xd0, 0xda, 0x00, 0xda, 0xda, 0xda, 0xe0, 0xe0, + 0xe0, 0xe7, 0xe7, 0xe0, 0xe9, 0xc1, 0x89, 0xd0, 0xd0, 0xc8, 0xc8, 0xbe, + 0x00, 0xbe, 0xb7, 0xb1, 0xb1, 0xa7, 0xa7, 0xd2, 0xfa, 0x00, 0xf7, 0xf0, + 0xee, 0xdb, 0xd0, 0xc8, 0xc3, 0xb0, 0x03, 0xa7, 0xa7, 0xfb, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x00, 0xf6, 0xf3, + 0x08, 0xe8, 0xbf, 0xbf, 0xbf, 0xe9, 0xbf, 0xc2, 0xb9, 0x00, 0xb9, 0xba, + 0xba, 0xba, 0xb1, 0xbe, 0xb7, 0xbe, 0x00, 0xbe, 0xbe, 0xc4, 0xc6, 0xc6, + 0xca, 0xcf, 0xd0, 0x06, 0xd0, 0xd0, 0xda, 0xda, 0xda, 0xe9, 0xd4, 0xda, + 0x00, 0xda, 0xd0, 0xcf, 0xcf, 0xca, 0xc6, 0xc6, 0xbe, 0x00, 0xb7, 0xb7, + 0xb0, 0xa7, 0xa7, 0xa2, 0xb1, 0xf9, 0x00, 0xf7, 0xf0, 0xee, 0xee, 0xd0, + 0xc3, 0xb7, 0xb0, 0x00, 0xa5, 0xa2, 0xf7, 0xf5, 0xf5, 0xf7, 0xf9, 0xf9, + 0x01, 0xf7, 0xf4, 0xf0, 0xcd, 0x00, 0x00, 0x00, 0xe9, 0xf8, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0xf6, 0xf3, 0xc5, 0x02, 0xb4, 0xb4, 0xb4, 0xb9, 0xb9, + 0xb9, 0xe9, 0xba, 0x00, 0xba, 0xba, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb5, + 0x00, 0xb8, 0xb8, 0xc4, 0xc4, 0xc6, 0xca, 0xca, 0xca, 0x1c, 0xcf, 0xcf, + 0xcf, 0xe9, 0xd4, 0xa4, 0xca, 0xca, 0x00, 0xc4, 0xc4, 0xb8, 0xb5, 0xb0, + 0xac, 0xac, 0xa5, 0x00, 0xa2, 0x9f, 0xf7, 0xf7, 0xf0, 0xf0, 0xd2, 0xc3, + 0x00, 0xc3, 0xac, 0xa5, 0x9f, 0x99, 0xf0, 0xf4, 0xf2, 0x00, 0xf0, 0xd2, + 0xbd, 0xd2, 0xf2, 0xf4, 0xf9, 0xf4, 0x07, 0xd2, 0x4a, 0x00, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0xe0, 0x5f, 0x17, 0x03, 0xf3, 0xf1, 0xb9, 0xb3, 0xb3, + 0x60, 0xb3, 0xe9, 0xd1, 0xba, 0xb1, 0xb1, 0xb7, 0xb7, 0x00, 0xb0, 0xb0, + 0xb5, 0xb5, 0xb5, 0xb8, 0xbc, 0xbc, 0x01, 0xc4, 0xc6, 0xc6, 0xc6, 0xca, + 0xca, 0xca, 0xe9, 0x88, 0xd4, 0xca, 0xca, 0xcf, 0x89, 0xc6, 0xc6, 0xc4, + 0x00, 0xc4, 0xb8, 0xb5, 0xb0, 0xac, 0xac, 0xa5, 0xa5, 0x00, 0x9f, 0x99, + 0xf7, 0xf7, 0xf0, 0xd2, 0xf0, 0xf2, 0x00, 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, + 0xbd, 0x99, 0x8d, 0x00, 0x93, 0x93, 0x93, 0x93, 0x8d, 0x88, 0x9c, 0xe1, + 0x03, 0xf4, 0xf4, 0xc1, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xf0, 0xa7, 0x5f, + 0x17, 0x01, 0xf3, 0xf0, 0xb9, 0xa9, 0x21, 0xa9, 0xa9, 0xe9, 0xa9, 0xb1, + 0xb1, 0xb1, 0xe9, 0x00, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb5, 0xb5, 0xb8, + 0x00, 0xb8, 0xc0, 0xc0, 0xc0, 0xc0, 0xc4, 0xc4, 0xc4, 0xf0, 0xe9, 0xd4, + 0xa5, 0x49, 0xb8, 0xb8, 0xb5, 0xb0, 0x00, 0xac, 0xac, 0xa5, 0x9f, 0x9f, + 0x99, 0xf4, 0xf4, 0x0c, 0xf7, 0xf9, 0xf9, 0xf9, 0xe9, 0xd1, 0xf7, 0xf7, + 0x00, 0xf2, 0xaa, 0x8d, 0x95, 0x95, 0x8c, 0x8c, 0x84, 0x01, 0x84, 0xe1, + 0xf4, 0xd2, 0x00, 0x00, 0x00, 0xe9, 0xf0, 0xd4, 0xa7, 0x5f, 0x17, 0x00, + 0x00, 0xf0, 0xc3, 0x00, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa7, 0xa7, 0xa7, + 0x08, 0xa7, 0xb0, 0xac, 0xac, 0xe9, 0xac, 0xac, 0xac, 0x00, 0xb2, 0xb2, + 0xb6, 0xb6, 0xb6, 0xbb, 0xb8, 0xb8, 0x1c, 0xbb, 0xbb, 0xbb, 0xe9, 0xd4, + 0xa6, 0xb8, 0xb8, 0x80, 0x21, 0xb2, 0xab, 0xab, 0xa5, 0xa5, 0xa1, 0x99, + 0x00, 0x99, 0xd2, 0xf4, 0xf4, 0xf2, 0xf0, 0xd2, 0xaa, 0x00, 0x9c, 0x9f, + 0xaa, 0xd2, 0xf2, 0xf4, 0xf7, 0xf7, 0x00, 0xf7, 0xf4, 0xbd, 0x88, 0x8c, + 0x8c, 0x85, 0x80, 0x01, 0x7d, 0x9c, 0xf2, 0xd2, 0x00, 0x00, 0x00, 0xe9, + 0xf0, 0xd4, 0xa7, 0x5f, 0x17, 0xf1, 0xd2, 0x9f, 0x9f, 0x40, 0x9f, 0xe9, + 0x9f, 0x9f, 0xa5, 0xa5, 0xa5, 0xac, 0x00, 0xac, 0xac, 0xab, 0xac, 0xab, + 0xab, 0xab, 0xab, 0x00, 0xab, 0xad, 0xb2, 0xb2, 0xb2, 0xb2, 0xb6, 0xb6, + 0x4e, 0xb6, 0xe9, 0xb6, 0xb6, 0xa2, 0x82, 0x64, 0xb2, 0x40, 0xad, 0x01, + 0xa8, 0xa5, 0xa1, 0xa1, 0x9b, 0x99, 0x00, 0x99, 0x99, 0x9c, 0x98, 0x8d, + 0x93, 0x93, 0x8d, 0x00, 0x93, 0x8d, 0x8d, 0x8d, 0x8d, 0x88, 0x93, 0xbd, + 0x00, 0xf2, 0xf4, 0xf4, 0xf2, 0x9c, 0x84, 0x8b, 0x83, 0x00, 0x7d, 0x7b, + 0x92, 0xe1, 0xb1, 0x00, 0x00, 0x00, 0xf8, 0xe9, 0xd4, 0xa7, 0x5f, 0x16, + 0xd2, 0x9f, 0x99, 0x20, 0x99, 0x99, 0xe9, 0x99, 0x99, 0x9f, 0xa5, 0xa5, + 0x00, 0xa5, 0xab, 0xab, 0xab, 0xa8, 0xab, 0xa8, 0xa8, 0x00, 0xab, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xae, 0xad, 0x0f, 0xaf, 0xae, 0xae, 0xae, 0xe9, + 0x93, 0x69, 0x4c, 0x00, 0xad, 0xab, 0xab, 0xa8, 0xa8, 0xa6, 0xa1, 0xa1, + 0x00, 0x9b, 0x9b, 0x98, 0x98, 0x98, 0x98, 0x98, 0x93, 0x00, 0x95, 0x95, + 0x95, 0x95, 0x8d, 0x8d, 0x8d, 0x8c, 0x00, 0x8d, 0x88, 0x88, 0x84, 0x9c, + 0xf2, 0xf4, 0xf4, 0x00, 0xbd, 0x80, 0x7d, 0x7b, 0x74, 0x74, 0x92, 0xe1, + 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x15, 0x00, 0xd2, 0xaa, + 0x93, 0x93, 0x93, 0x93, 0x8d, 0x88, 0x00, 0x84, 0x8a, 0x8a, 0x91, 0x97, + 0x9b, 0xa1, 0xa3, 0x04, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xd4, 0xa6, 0xa8, + 0x33, 0xa8, 0xa8, 0xe9, 0x7d, 0xa3, 0xa3, 0xe9, 0x44, 0x00, 0xa6, 0xa6, + 0xa1, 0xa1, 0xa1, 0x9b, 0x9b, 0x98, 0x20, 0x95, 0x95, 0xe9, 0x95, 0x95, + 0x91, 0x8c, 0x8d, 0x00, 0x8c, 0x95, 0x8c, 0x8c, 0x8c, 0x8c, 0x84, 0x84, + 0x00, 0x84, 0x84, 0x84, 0xaa, 0xf2, 0xf2, 0xe1, 0x7d, 0x00, 0x7c, 0x78, + 0x71, 0x6b, 0xaa, 0xaa, 0x00, 0x00, 0x7c, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, + 0x14, 0xbd, 0x9c, 0x00, 0x8d, 0x88, 0x93, 0xa9, 0xf3, 0xfa, 0xfc, 0xfe, + 0x00, 0xfe, 0xfc, 0xf8, 0xf1, 0xa9, 0xa4, 0xa1, 0xa1, 0x1c, 0xa4, 0xa4, + 0xa4, 0xe9, 0xd4, 0xa3, 0xa0, 0x9e, 0x08, 0xa0, 0x9e, 0x9e, 0x9e, 0xe9, + 0x9e, 0x9e, 0xa0, 0x28, 0xa0, 0xa0, 0xe9, 0xa0, 0x81, 0x9d, 0x97, 0x97, + 0x00, 0x97, 0x91, 0x91, 0x98, 0x98, 0x92, 0x98, 0x91, 0x10, 0x91, 0x91, + 0x8c, 0xe1, 0x91, 0x8c, 0x8a, 0x84, 0x00, 0x84, 0x84, 0x84, 0x80, 0x7d, + 0x85, 0xe1, 0xf2, 0x00, 0xe1, 0x7b, 0x72, 0x6e, 0x68, 0x6d, 0xbd, 0x00, + 0x3e, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x13, 0xc3, 0x00, 0xaa, 0x88, + 0x8d, 0xe8, 0xfa, 0xfe, 0xfe, 0xfc, 0x00, 0xfa, 0xf8, 0xf8, 0xfb, 0xfd, + 0xfe, 0xfd, 0xf8, 0x04, 0xc2, 0xa0, 0x9e, 0x9e, 0x9e, 0xe9, 0x9e, 0x9e, + 0x04, 0x9d, 0x9e, 0x9d, 0x9d, 0x9d, 0xe9, 0x9d, 0x9d, 0x1e, 0x97, 0x97, + 0x97, 0xe9, 0xd1, 0x7e, 0x73, 0x91, 0x00, 0x91, 0x91, 0x91, 0x91, 0x92, + 0x92, 0x91, 0x91, 0x00, 0x8c, 0x8c, 0x91, 0x8f, 0x8f, 0x8f, 0x8c, 0x8a, + 0x00, 0x8b, 0x84, 0x85, 0x80, 0x80, 0x80, 0x7d, 0x7d, 0x00, 0x7b, 0xbd, + 0xf2, 0xe1, 0x72, 0x6b, 0x65, 0x61, 0x07, 0x87, 0xaa, 0x00, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0xc0, 0x5f, 0x12, 0xaa, 0x9c, 0xa2, 0xf8, 0xfe, 0xfc, + 0x00, 0xf6, 0xe2, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xcc, 0x00, 0xeb, 0xf6, + 0xfd, 0xfe, 0xf6, 0xa3, 0x9a, 0x9a, 0x02, 0x9a, 0x9a, 0x9a, 0x96, 0x96, + 0x96, 0xe9, 0x94, 0x0c, 0x96, 0x94, 0x94, 0x94, 0xe9, 0xd1, 0x8f, 0x94, + 0x70, 0x8f, 0xa2, 0x44, 0x4a, 0x8f, 0x8f, 0x8e, 0x8f, 0x24, 0x8b, 0x8f, + 0xe9, 0x8b, 0x8e, 0xd1, 0x8b, 0x8b, 0x00, 0x8b, 0x83, 0x80, 0x83, 0x80, + 0x7d, 0x7d, 0x7b, 0x00, 0x74, 0x74, 0x74, 0xbd, 0xe1, 0xaa, 0x67, 0x61, + 0x03, 0x5c, 0x66, 0x87, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xe0, 0xa7, 0x5f, + 0x12, 0xaa, 0xdb, 0xfc, 0xfc, 0xf3, 0x00, 0xcc, 0xd9, 0xd9, 0xdf, 0xdf, + 0xdf, 0xdf, 0xd9, 0x00, 0xd9, 0xd9, 0xd5, 0xcc, 0xf6, 0xfe, 0xfb, 0xac, + 0x00, 0x94, 0x94, 0x94, 0x94, 0x8f, 0x8f, 0x8e, 0x8e, 0x04, 0x8b, 0x8e, + 0x8b, 0x8b, 0x8b, 0xe9, 0x83, 0x83, 0x04, 0x89, 0x89, 0x83, 0x83, 0x83, + 0x9a, 0x8e, 0x8e, 0x03, 0x8e, 0x8e, 0x90, 0x8e, 0x90, 0x90, 0xc1, 0x92, + 0xc0, 0x04, 0xd4, 0x89, 0x83, 0x83, 0x83, 0x7d, 0x7d, 0x00, 0x7b, 0x7b, + 0x78, 0x74, 0x74, 0x74, 0xbd, 0xe1, 0x00, 0x87, 0x5c, 0x58, 0x54, 0x87, + 0x00, 0x00, 0x00, 0xf8, 0xe9, 0xd4, 0xa7, 0x5f, 0x11, 0xc3, 0xf0, 0xfd, + 0x06, 0xfa, 0xd9, 0xdf, 0xdf, 0xdf, 0xe9, 0xd3, 0xd6, 0x00, 0xd5, 0xcc, + 0xe2, 0xfc, 0xfc, 0xa7, 0x89, 0x89, 0x10, 0x82, 0x82, 0x82, 0xe9, 0x82, + 0x7f, 0x7f, 0x7f, 0x00, 0x7f, 0x7b, 0x7f, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, + 0x57, 0x7c, 0xa2, 0x7f, 0x43, 0x83, 0xe2, 0x03, 0xa9, 0x18, 0x89, 0x89, + 0x89, 0xe9, 0xd2, 0x82, 0x82, 0x7f, 0x00, 0x7b, 0x7b, 0x78, 0x78, 0x74, + 0x72, 0x71, 0x6e, 0x00, 0x77, 0xbd, 0xbd, 0x64, 0x56, 0x4e, 0x70, 0x00, + 0x3e, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x11, 0xe8, 0x00, 0xfc, 0xf8, + 0xc9, 0xd8, 0xe3, 0xe3, 0xe3, 0xe6, 0x00, 0xe6, 0xe6, 0xe6, 0xe6, 0xe3, + 0xe3, 0xd8, 0xd6, 0x00, 0xd8, 0xce, 0xce, 0xc9, 0xfb, 0xfc, 0x91, 0x81, + 0x00, 0x7e, 0x7f, 0x7c, 0x7a, 0x7a, 0x7a, 0x78, 0x78, 0x01, 0x78, 0x77, + 0x72, 0x77, 0x72, 0x72, 0x72, 0xe9, 0x04, 0x72, 0x72, 0x77, 0x77, 0x78, + 0x61, 0x7a, 0x7c, 0x00, 0x7c, 0x7f, 0x7c, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x00, 0x7e, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0xc0, 0xe9, 0xd4, + 0x82, 0x7e, 0x7f, 0x7a, 0x78, 0x77, 0x00, 0x72, 0x6e, 0x6e, 0x6b, 0x65, + 0x87, 0xbd, 0x87, 0x03, 0x4e, 0x49, 0x5d, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xe0, 0xa7, 0x5f, 0x12, 0xfa, 0xc9, 0xd8, 0xd8, 0xe3, 0x00, 0xe3, 0xe5, + 0xe5, 0xe5, 0xe6, 0xe6, 0xe5, 0xe5, 0x00, 0xe3, 0xe3, 0xd8, 0xd1, 0xce, + 0xc7, 0xc7, 0xc7, 0x00, 0xfd, 0xf8, 0x79, 0x7a, 0x77, 0x72, 0x72, 0x72, + 0x01, 0x6e, 0x6f, 0x6e, 0x6e, 0x6e, 0x6e, 0x6b, 0xda, 0xe0, 0xba, 0x99, + 0x59, 0x72, 0x76, 0x76, 0x77, 0x77, 0x00, 0x77, 0x77, 0x7a, 0x77, 0x7a, + 0x7a, 0x7a, 0x7a, 0x00, 0x7a, 0x7f, 0x7e, 0x7c, 0x7e, 0x7e, 0x81, 0x82, + 0x20, 0x81, 0x82, 0xe1, 0x81, 0x7e, 0x7c, 0x7a, 0x77, 0x00, 0x76, 0x72, + 0x6e, 0x6e, 0x6b, 0x68, 0x65, 0x65, 0x00, 0xaa, 0xaa, 0x54, 0x42, 0x5d, + 0x00, 0x00, 0x00, 0xf8, 0xe9, 0xd4, 0xa7, 0x5f, 0x11, 0xfc, 0xe3, 0xd1, + 0x00, 0xd1, 0xdc, 0xe4, 0xe4, 0xe4, 0xe4, 0xef, 0xef, 0x20, 0xef, 0xef, + 0xc1, 0xdc, 0xd1, 0xd1, 0xc7, 0xc7, 0x00, 0xc5, 0xf1, 0xfe, 0xc3, 0x77, + 0x72, 0x6b, 0x68, 0x00, 0x68, 0x65, 0x65, 0x65, 0x65, 0x64, 0x64, 0x64, + 0xc0, 0xe9, 0xd4, 0x69, 0x69, 0x6b, 0x6b, 0x6b, 0x6b, 0x04, 0x6f, 0x6f, + 0x6f, 0x6f, 0x72, 0xe9, 0x72, 0x72, 0x00, 0x76, 0x76, 0x76, 0x79, 0x75, + 0x79, 0x7a, 0x7a, 0x08, 0x7a, 0x7e, 0x7e, 0x7e, 0xe9, 0x7e, 0x7e, 0x7a, + 0x80, 0x71, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x64, 0x5e, 0x00, 0x87, 0xaa, + 0x87, 0x3b, 0x47, 0x00, 0x00, 0x00, 0xf8, 0xe9, 0xd4, 0xa7, 0x5f, 0x11, + 0xf5, 0xcd, 0xcd, 0x01, 0xd4, 0xde, 0xdc, 0xed, 0xed, 0xed, 0xef, 0xe1, + 0x00, 0xed, 0xed, 0xe4, 0xdc, 0xd4, 0xd4, 0xcd, 0xc5, 0x00, 0xbf, 0xb4, + 0xfa, 0xfa, 0x69, 0x6d, 0x6b, 0x62, 0x03, 0x62, 0x5e, 0x5e, 0x5c, 0x5c, + 0x5c, 0xe9, 0xd1, 0x00, 0x61, 0x5c, 0x5e, 0x5c, 0x5e, 0x5e, 0x62, 0x62, + 0x00, 0x62, 0x62, 0x64, 0x64, 0x69, 0x69, 0x69, 0x69, 0x00, 0x69, 0x6b, + 0x6b, 0x6b, 0x6f, 0x6f, 0x6f, 0x6f, 0x00, 0x73, 0x6f, 0x75, 0x75, 0x75, + 0x75, 0x79, 0x79, 0x60, 0x79, 0xe9, 0xd1, 0x75, 0x75, 0x6f, 0x6f, 0x6b, + 0x00, 0x69, 0x64, 0x62, 0x5c, 0x5c, 0x5f, 0x87, 0x87, 0x07, 0x3b, 0x4a, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x80, 0x5f, 0x00, 0x00, 0xfa, 0xdb, + 0xdb, 0xd4, 0xd4, 0x02, 0xde, 0xde, 0xe9, 0xed, 0xed, 0xed, 0xe9, 0xed, + 0x00, 0xed, 0xe9, 0xde, 0xd4, 0xd4, 0xcd, 0xc2, 0xc2, 0x00, 0xb9, 0xe8, + 0xfd, 0x9c, 0x6d, 0x66, 0x5e, 0x5b, 0x14, 0x58, 0x58, 0x58, 0xe9, 0x54, + 0xcc, 0x58, 0x58, 0x00, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, + 0x00, 0x5c, 0x61, 0x61, 0x61, 0x62, 0x62, 0x64, 0x64, 0x00, 0x64, 0x69, + 0x69, 0x69, 0x6b, 0x6c, 0x6f, 0x6f, 0x06, 0x6f, 0x73, 0x75, 0x75, 0x75, + 0xe9, 0xd1, 0x73, 0x00, 0x6f, 0x6f, 0x6c, 0x69, 0x69, 0x62, 0x5c, 0x5c, + 0x00, 0x58, 0x58, 0x87, 0x87, 0x50, 0x50, 0x00, 0x00, 0x78, 0x00, 0xe9, + 0xd4, 0xa7, 0x5b, 0xf8, 0xf6, 0xf6, 0x00, 0xf6, 0xf8, 0xfa, 0xf3, 0xdb, + 0xd4, 0xcb, 0xd3, 0x00, 0xd7, 0xde, 0xe9, 0xe9, 0xe9, 0xec, 0xec, 0xec, + 0x80, 0xd1, 0xe9, 0xde, 0xd3, 0xd3, 0xcb, 0xc2, 0xb9, 0x00, 0xb3, 0xa9, + 0xfb, 0xf2, 0x6d, 0x66, 0x5f, 0x58, 0x04, 0x53, 0x50, 0x50, 0x52, 0x52, + 0xe9, 0x52, 0x52, 0x00, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54, 0x53, 0x54, + 0x00, 0x54, 0x54, 0x54, 0x58, 0x58, 0x58, 0x5b, 0x5b, 0x00, 0x58, 0x5c, + 0x5c, 0x5c, 0x5c, 0x61, 0x61, 0x61, 0x00, 0x64, 0x67, 0x67, 0x67, 0x67, + 0x6c, 0x6a, 0x6a, 0x08, 0x6c, 0x73, 0x73, 0x73, 0xe9, 0x73, 0x6c, 0x6c, + 0x00, 0x6c, 0x67, 0x67, 0x61, 0x5c, 0x5b, 0x58, 0x54, 0x01, 0x53, 0x66, + 0x87, 0x5d, 0x00, 0x00, 0x00, 0xe9, 0xe0, 0xd4, 0xa7, 0x59, 0xf5, 0xf1, + 0xce, 0xc9, 0xc9, 0x00, 0xc7, 0xc5, 0xbf, 0xba, 0xc2, 0xcb, 0xcb, 0xd3, + 0x01, 0xd7, 0xd7, 0xdd, 0xdd, 0xea, 0xea, 0xea, 0xe9, 0x00, 0xea, 0xea, + 0xdd, 0xdd, 0xd7, 0xd0, 0xcb, 0xc1, 0x00, 0xba, 0xb3, 0xa9, 0xf5, 0xf9, + 0x6d, 0x6d, 0x5f, 0x00, 0x55, 0x4e, 0x4e, 0x4b, 0x49, 0x4b, 0x49, 0x4b, + 0x20, 0x4b, 0x4b, 0xe9, 0x4b, 0x4b, 0x4e, 0x4b, 0x4e, 0x04, 0x4e, 0x4e, + 0x52, 0x52, 0x52, 0xe9, 0x52, 0x54, 0x00, 0x54, 0x56, 0x59, 0x58, 0x59, + 0x58, 0x59, 0x59, 0x00, 0x5c, 0x61, 0x61, 0x63, 0x63, 0x67, 0x67, 0x67, + 0x10, 0x6a, 0x6a, 0x6a, 0xe9, 0x6a, 0x6a, 0x67, 0x67, 0x00, 0x63, 0x63, + 0x60, 0x59, 0x59, 0x54, 0x52, 0x52, 0x03, 0x55, 0x87, 0x70, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0x80, 0xa7, 0x00, 0xf3, 0xce, 0xc7, 0xc7, 0xc7, 0xc7, + 0x00, 0xc5, 0xc2, 0xc2, 0xba, 0xba, 0xbe, 0xbe, 0xc8, 0x00, 0xc8, 0xd0, + 0xd0, 0xe0, 0xe0, 0xe0, 0xe7, 0xe7, 0x60, 0xe7, 0xe9, 0xb9, 0xd0, 0xd0, + 0xc8, 0xbe, 0xb1, 0x00, 0xb1, 0xa9, 0xd2, 0xfb, 0x87, 0x6d, 0x5d, 0x55, + 0x01, 0x50, 0x47, 0x47, 0x47, 0x43, 0x43, 0x43, 0xe9, 0xe0, 0xd1, 0xa1, + 0x89, 0x49, 0x49, 0x49, 0x49, 0x49, 0x00, 0x4b, 0x4e, 0x4e, 0x4e, 0x52, + 0x52, 0x52, 0x52, 0x00, 0x56, 0x56, 0x58, 0x59, 0x59, 0x59, 0x60, 0x60, + 0x01, 0x60, 0x60, 0x63, 0x63, 0x67, 0x67, 0x67, 0xe9, 0x00, 0x67, 0x63, + 0x63, 0x60, 0x60, 0x59, 0x59, 0x56, 0x00, 0x52, 0x4e, 0x4e, 0x49, 0x70, + 0x87, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa7, 0xe8, 0xbf, 0xbf, 0xbf, + 0x00, 0xbf, 0xb9, 0xb9, 0xc2, 0xba, 0xbe, 0xbe, 0xbe, 0x00, 0xbe, 0xbe, + 0xc6, 0xc8, 0xd0, 0xd0, 0xda, 0xda, 0x60, 0xda, 0xe9, 0xd3, 0xd0, 0xcf, + 0xc8, 0xbe, 0xbe, 0x00, 0xb1, 0xac, 0xa7, 0xc3, 0xf9, 0xaa, 0x87, 0x5d, + 0x00, 0x50, 0x47, 0x45, 0x40, 0x41, 0x41, 0x41, 0x40, 0x45, 0x41, 0xd2, + 0x41, 0x43, 0x43, 0xe9, 0x43, 0xe9, 0x00, 0x43, 0x45, 0x46, 0x47, 0x47, + 0x47, 0x4c, 0x4c, 0x00, 0x4d, 0x4c, 0x4c, 0x52, 0x51, 0x51, 0x51, 0x51, + 0x00, 0x56, 0x57, 0x5a, 0x5a, 0x60, 0x60, 0x60, 0x60, 0x04, 0x63, 0x63, + 0x63, 0x63, 0x63, 0xb9, 0x59, 0x59, 0x00, 0x56, 0x51, 0x52, 0x4c, 0x47, + 0x47, 0x5d, 0x87, 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa6, 0xb9, 0xb3, + 0x00, 0xb4, 0xb4, 0xb3, 0xb4, 0xba, 0xba, 0xba, 0xb7, 0x00, 0xb7, 0xb7, + 0xb7, 0xb7, 0xbc, 0xc6, 0xc6, 0xca, 0x18, 0xcf, 0xcf, 0xcf, 0xe9, 0xd4, + 0xca, 0xc6, 0xc6, 0x00, 0xbc, 0xb7, 0xb0, 0xa7, 0xa2, 0xa2, 0xf9, 0xbd, + 0x00, 0xbd, 0xbd, 0xe1, 0xe1, 0xbd, 0x9c, 0x68, 0x4e, 0x00, 0x3a, 0x3c, + 0x40, 0x3c, 0x3c, 0x3a, 0x3c, 0x3a, 0x00, 0x3a, 0x3c, 0x3d, 0x3c, 0x3d, + 0x40, 0x3d, 0x40, 0x00, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x00, 0x45, 0x46, 0x46, 0x46, 0x46, 0x46, 0x4d, 0x4d, 0x00, 0x4d, 0x4f, + 0x4f, 0x51, 0x57, 0x57, 0x57, 0x5a, 0x00, 0x5a, 0x5a, 0x60, 0x60, 0x5a, + 0x60, 0x5a, 0x5a, 0x00, 0x57, 0x57, 0x51, 0x51, 0x4d, 0x4c, 0x46, 0x45, + 0x03, 0x41, 0x5d, 0x6d, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x80, 0xa5, 0xb9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xb1, 0x00, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb5, 0xb8, 0x03, 0xbc, 0xc0, 0xc0, 0xc4, 0xc4, 0xc4, 0xe9, 0xd4, + 0x00, 0xc4, 0xc0, 0xc0, 0xb8, 0xb5, 0xb0, 0xac, 0xa5, 0x01, 0x9f, 0x9f, + 0xf4, 0xf7, 0xf9, 0xf9, 0xf9, 0xe2, 0x00, 0xf4, 0xbd, 0x5e, 0x3a, 0x3a, + 0x3a, 0x38, 0x38, 0x70, 0x38, 0xe9, 0xd1, 0xa1, 0x3a, 0x3a, 0x3c, 0x3c, + 0x00, 0x3c, 0x3c, 0x40, 0x40, 0x40, 0x41, 0x42, 0x41, 0x00, 0x42, 0x42, + 0x46, 0x46, 0x46, 0x4d, 0x4d, 0x4d, 0x00, 0x4f, 0x4f, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x5a, 0x80, 0xd3, 0x4f, 0x4d, 0x4d, 0x46, 0x42, 0x41, 0x40, + 0x07, 0x50, 0x6d, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa4, 0x00, 0xc3, 0x9f, + 0x9f, 0x9f, 0xa2, 0xa2, 0xa7, 0xac, 0x00, 0xac, 0xac, 0xac, 0xac, 0xab, + 0xb2, 0xb2, 0xb2, 0x04, 0xb6, 0xb6, 0xbb, 0xbb, 0xbb, 0xe9, 0xb6, 0xb6, + 0x40, 0xb6, 0xab, 0xb6, 0xb6, 0xb2, 0xad, 0xab, 0xa5, 0x00, 0xa5, 0xa1, + 0x99, 0xaa, 0xbd, 0x9c, 0x8d, 0x88, 0x00, 0x8d, 0x88, 0x93, 0xaa, 0xf2, + 0xf7, 0xf4, 0xbd, 0x00, 0x49, 0x32, 0x34, 0x34, 0x32, 0x32, 0x36, 0x32, + 0x08, 0x36, 0x36, 0x36, 0x36, 0xc1, 0x37, 0x37, 0x37, 0x00, 0x37, 0x38, + 0x38, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x00, 0x3c, 0x40, 0x40, 0x40, 0x42, + 0x46, 0x46, 0x46, 0x00, 0x48, 0x4d, 0x4f, 0x4f, 0x4f, 0x57, 0x57, 0x57, + 0x20, 0x57, 0x57, 0xc1, 0x4d, 0x48, 0x46, 0x42, 0x40, 0x01, 0x40, 0x3a, + 0x47, 0x66, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa3, 0xd2, 0x99, 0x99, + 0x99, 0x93, 0x99, 0x00, 0x99, 0xa1, 0xa5, 0xa8, 0xab, 0xa8, 0xab, 0xa8, + 0x01, 0xab, 0xab, 0xad, 0xad, 0xae, 0xad, 0xae, 0xe9, 0x06, 0xad, 0xad, + 0xad, 0xad, 0xad, 0x91, 0xc1, 0xa8, 0x00, 0xa8, 0xa3, 0xa1, 0x9b, 0x9b, + 0x9b, 0x98, 0x98, 0x00, 0x93, 0x95, 0x93, 0x8d, 0x8d, 0x8d, 0x88, 0x88, + 0x00, 0x88, 0xbd, 0xf4, 0xf2, 0x5f, 0x2d, 0x32, 0x32, 0x30, 0x32, 0x2e, + 0xe9, 0xc9, 0x32, 0x32, 0x30, 0x30, 0x44, 0x30, 0x89, 0x34, 0x36, 0x36, + 0xe9, 0x38, 0x38, 0x00, 0x3b, 0x3b, 0x40, 0x3f, 0x42, 0x42, 0x44, 0x48, + 0x00, 0x48, 0x4d, 0x48, 0x4f, 0x4f, 0x4f, 0x4d, 0x4d, 0x00, 0x48, 0x48, + 0x48, 0x44, 0x42, 0x3f, 0x3b, 0x38, 0x03, 0x34, 0x4a, 0x5d, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0x80, 0xa3, 0x9f, 0x8d, 0x8d, 0x8d, 0x8c, 0x95, 0x98, + 0x00, 0x98, 0x9b, 0xa1, 0xa1, 0xa6, 0xa6, 0xa4, 0xa6, 0x30, 0xa6, 0xa6, + 0xe9, 0xd1, 0xa4, 0xa1, 0xa4, 0xa1, 0x40, 0xa1, 0xe1, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa0, 0x00, 0xa1, 0x9e, 0x9b, 0x97, 0x98, 0x98, 0x98, 0x95, + 0x00, 0x91, 0x91, 0x91, 0x91, 0x8c, 0x8c, 0x84, 0x84, 0x00, 0x84, 0x85, + 0xf0, 0xf2, 0x5f, 0x2b, 0x2d, 0x2d, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, + 0x2c, 0x2d, 0x2c, 0x10, 0x2d, 0x2d, 0x2d, 0xe9, 0x2d, 0x2e, 0x2d, 0x30, + 0x00, 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x35, 0x38, 0x00, 0x38, 0x3b, + 0x3f, 0x3f, 0x3f, 0x44, 0x44, 0x48, 0x20, 0x48, 0x48, 0xe9, 0x48, 0x44, + 0x44, 0x3f, 0x3b, 0x00, 0x3b, 0x38, 0x31, 0x31, 0x4a, 0x5d, 0x00, 0x00, + 0x70, 0x00, 0xe9, 0xd4, 0xa2, 0xcb, 0x88, 0x84, 0x85, 0x00, 0x84, 0x85, + 0x8c, 0x8c, 0x91, 0x97, 0x9d, 0x9d, 0x00, 0x9e, 0x9e, 0xa0, 0x9e, 0x9e, + 0x9e, 0x9d, 0x9d, 0x40, 0x9d, 0xe9, 0x9a, 0x9a, 0x97, 0x97, 0x97, 0x97, + 0x20, 0x97, 0x9a, 0x94, 0x97, 0x96, 0x96, 0x96, 0x96, 0x00, 0x92, 0x96, + 0x94, 0x91, 0x91, 0x91, 0x8c, 0x8f, 0x00, 0x8b, 0x8a, 0x80, 0x80, 0x7d, + 0x7b, 0xbd, 0xe1, 0x05, 0x4b, 0x27, 0x28, 0x28, 0x28, 0xe9, 0x24, 0xcb, + 0x80, 0x99, 0x27, 0x27, 0x27, 0x27, 0x2c, 0x2d, 0x2d, 0x00, 0x2d, 0x2d, + 0x30, 0x30, 0x31, 0x31, 0x35, 0x35, 0x00, 0x39, 0x3b, 0x3f, 0x3f, 0x3f, + 0x44, 0x44, 0x44, 0x20, 0x44, 0x44, 0xc1, 0x3b, 0x39, 0x35, 0x31, 0x31, + 0x03, 0x30, 0x4a, 0x87, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x80, 0xa2, 0x9c, + 0x7d, 0x7b, 0x7b, 0x7b, 0x7d, 0x83, 0x01, 0x83, 0x8f, 0x8f, 0x94, 0x96, + 0x96, 0x96, 0xe9, 0x00, 0x94, 0x94, 0x94, 0x8f, 0x91, 0x8f, 0x8f, 0x8f, + 0x0f, 0x8f, 0x8b, 0x8f, 0x8b, 0xe1, 0x41, 0x72, 0x79, 0x60, 0x8e, 0x5a, + 0x42, 0x83, 0x83, 0x83, 0x7d, 0x7b, 0x00, 0x74, 0x74, 0xbd, 0xbd, 0x2d, + 0x24, 0x24, 0x24, 0x68, 0x22, 0xe1, 0xd1, 0x22, 0xc3, 0x25, 0x25, 0x24, + 0x00, 0x24, 0x27, 0x28, 0x27, 0x28, 0x27, 0x2c, 0x2b, 0x00, 0x30, 0x30, + 0x31, 0x31, 0x35, 0x39, 0x39, 0x39, 0x18, 0x3f, 0x3f, 0x3f, 0xe9, 0xb9, + 0x35, 0x31, 0x30, 0x03, 0x2b, 0x33, 0x3e, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0x80, 0xa2, 0x66, 0x86, 0x74, 0x74, 0x74, 0x74, 0x78, 0x00, 0x78, 0x7d, + 0x82, 0x89, 0x89, 0x8e, 0x8e, 0x8e, 0x00, 0x8e, 0x8b, 0x89, 0x82, 0x83, + 0x82, 0x83, 0x7f, 0x04, 0x7f, 0x7f, 0x7b, 0x7d, 0x7d, 0xe9, 0x7f, 0x82, + 0x02, 0x83, 0x83, 0x89, 0x89, 0x82, 0x82, 0xe9, 0x89, 0x10, 0x89, 0x8b, + 0x8b, 0xe9, 0x89, 0x8b, 0x89, 0x89, 0x00, 0x83, 0x7d, 0x7b, 0x78, 0x74, + 0x71, 0x71, 0xe1, 0x07, 0x87, 0x1f, 0x22, 0x22, 0x22, 0xe9, 0xd4, 0xa6, + 0x00, 0x23, 0x23, 0x23, 0x25, 0x25, 0x27, 0x27, 0x2b, 0x00, 0x2b, 0x30, + 0x31, 0x35, 0x35, 0x35, 0x39, 0x39, 0x60, 0x39, 0xe9, 0xb9, 0x31, 0x2a, + 0x2b, 0x27, 0x33, 0x0e, 0x3e, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa2, 0x66, + 0x00, 0x66, 0x6d, 0x6b, 0x6e, 0x6e, 0x71, 0x77, 0x7a, 0x00, 0x7c, 0x7f, + 0x82, 0x82, 0x82, 0x82, 0x7f, 0x7f, 0x00, 0x7c, 0x78, 0x77, 0x78, 0x72, + 0x72, 0x72, 0x71, 0xc0, 0xe1, 0xc9, 0x72, 0x78, 0x78, 0x7a, 0x7c, 0x7a, + 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7f, 0x7f, 0x81, 0x04, 0x82, 0x82, + 0x82, 0x82, 0x89, 0xda, 0x7c, 0x78, 0x00, 0x78, 0x72, 0x6e, 0x68, 0x87, + 0xbd, 0x2d, 0x1e, 0x08, 0x1e, 0x1c, 0x1c, 0x1c, 0xe9, 0x1b, 0x1e, 0x1e, + 0x40, 0x1b, 0xb1, 0x1e, 0x1c, 0x1e, 0x1c, 0x1e, 0x1e, 0x00, 0x1e, 0x1e, + 0x1e, 0x22, 0x23, 0x23, 0x25, 0x25, 0x00, 0x26, 0x2a, 0x2a, 0x2f, 0x2f, + 0x2f, 0x2f, 0x35, 0x40, 0x35, 0xd2, 0x2f, 0x2a, 0x2a, 0x25, 0x25, 0x33, + 0x0e, 0x70, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa2, 0x66, 0x00, 0x66, 0x64, + 0x64, 0x65, 0x65, 0x6b, 0x6f, 0x6e, 0x00, 0x72, 0x76, 0x76, 0x76, 0x76, + 0x76, 0x72, 0x6e, 0x00, 0x6f, 0x6b, 0x6b, 0x69, 0x65, 0x68, 0x65, 0x65, + 0x40, 0x65, 0xe9, 0x65, 0x6b, 0x6b, 0x6b, 0x6b, 0x6f, 0x80, 0x21, 0x72, + 0x72, 0x76, 0x72, 0x77, 0x7a, 0x79, 0x00, 0x7a, 0x7e, 0x7e, 0x7e, 0x7e, + 0x82, 0x82, 0x7e, 0x00, 0x7e, 0x7a, 0x76, 0x72, 0x6e, 0x6b, 0x64, 0x5e, + 0x00, 0xaa, 0x5d, 0x1b, 0x1c, 0x1b, 0x18, 0x18, 0x18, 0x02, 0x18, 0x15, + 0x1c, 0x1c, 0x18, 0x1c, 0xba, 0x18, 0xa0, 0xc9, 0x1c, 0x59, 0x1b, 0x1e, + 0x22, 0x22, 0x23, 0x00, 0x25, 0x25, 0x26, 0x2a, 0x2a, 0x2a, 0x2f, 0x2f, + 0x20, 0x2f, 0x2f, 0xc9, 0x26, 0x26, 0x25, 0x21, 0x28, 0x0e, 0x28, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa3, 0x66, 0x00, 0x66, 0x5c, 0x5c, 0x5c, 0x5e, + 0x62, 0x64, 0x69, 0x00, 0x6b, 0x6b, 0x6c, 0x6b, 0x6b, 0x69, 0x69, 0x64, + 0x0d, 0x64, 0x62, 0x5c, 0x5e, 0x69, 0x51, 0x5b, 0xcb, 0x02, 0x62, 0x61, + 0x64, 0x64, 0x64, 0x69, 0x09, 0x6f, 0x00, 0x6f, 0x73, 0x75, 0x75, 0x75, + 0x79, 0x79, 0x79, 0x80, 0xe9, 0x75, 0x75, 0x6f, 0x6b, 0x64, 0x62, 0x5c, + 0x00, 0x6d, 0x87, 0x16, 0x15, 0x15, 0x14, 0x14, 0x14, 0x06, 0x14, 0x12, + 0x14, 0x18, 0x1c, 0xbb, 0x9a, 0x14, 0x00, 0x15, 0x15, 0x15, 0x15, 0x19, + 0x1b, 0x1e, 0x1e, 0x00, 0x1f, 0x1f, 0x21, 0x26, 0x26, 0x26, 0x2a, 0x2a, + 0x20, 0x2a, 0x2a, 0xc9, 0x21, 0x21, 0x1f, 0x1f, 0x28, 0x0e, 0x5d, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa3, 0x66, 0x00, 0x66, 0x54, 0x54, 0x58, 0x58, + 0x5b, 0x5c, 0x5c, 0x00, 0x61, 0x61, 0x61, 0x61, 0x61, 0x5c, 0x5b, 0x58, + 0x06, 0x58, 0x58, 0x54, 0x53, 0x53, 0xe9, 0xda, 0x54, 0x48, 0x54, 0x1a, + 0x58, 0x5b, 0x0b, 0x62, 0x67, 0x67, 0x02, 0x6a, 0x6c, 0x6c, 0x73, 0x73, + 0x73, 0xe9, 0x73, 0x00, 0x6c, 0x6c, 0x67, 0x61, 0x5b, 0x58, 0x5b, 0x87, + 0x00, 0x2e, 0x13, 0x12, 0x12, 0x0f, 0x12, 0x0f, 0x10, 0x00, 0x10, 0x14, + 0x29, 0x29, 0x20, 0x0f, 0x12, 0x12, 0x60, 0x12, 0x8a, 0x61, 0x13, 0x15, + 0x15, 0x15, 0x19, 0x03, 0x1b, 0x1a, 0x1d, 0x21, 0x21, 0x21, 0xe9, 0xd2, + 0x00, 0x1d, 0x1d, 0x1a, 0x1e, 0x1e, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, + 0xa4, 0x66, 0x5d, 0x4b, 0x4e, 0x52, 0x00, 0x52, 0x52, 0x54, 0x56, 0x58, + 0x58, 0x56, 0x58, 0x00, 0x54, 0x53, 0x52, 0x50, 0x4e, 0x4e, 0x4b, 0x49, + 0x02, 0x4b, 0x49, 0x49, 0x49, 0x49, 0x4b, 0xc1, 0x4b, 0x08, 0x4b, 0x4b, + 0x4e, 0x4e, 0x03, 0x58, 0x58, 0x58, 0x00, 0x59, 0x5c, 0x60, 0x62, 0x63, + 0x67, 0x67, 0x6a, 0x00, 0x6a, 0x6a, 0x6a, 0x6a, 0x67, 0x63, 0x60, 0x59, + 0x00, 0x56, 0x53, 0x4e, 0x87, 0x70, 0x70, 0x4a, 0x29, 0x00, 0x29, 0x20, + 0x29, 0x29, 0x4a, 0x70, 0x87, 0x29, 0x03, 0x4a, 0x1c, 0x0d, 0x0f, 0x0f, + 0x0f, 0xe9, 0xd1, 0x00, 0x10, 0x0f, 0x12, 0x11, 0x13, 0x13, 0x19, 0x1a, + 0x08, 0x1a, 0x1d, 0x1d, 0x1d, 0xe9, 0x1d, 0x1d, 0x1a, 0x00, 0x1a, 0x19, + 0x19, 0x1c, 0x08, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa5, 0x5d, 0x43, + 0x43, 0x46, 0x47, 0x00, 0x4c, 0x4c, 0x4e, 0x4e, 0x4e, 0x4e, 0x4c, 0x49, + 0x00, 0x49, 0x46, 0x46, 0x43, 0x43, 0x43, 0x43, 0x41, 0x3c, 0x41, 0x41, + 0xe9, 0xc1, 0x9a, 0x02, 0x49, 0x4c, 0x00, 0x4c, 0x4e, 0x4e, 0x51, 0x56, + 0x56, 0x56, 0x59, 0x00, 0x59, 0x60, 0x60, 0x63, 0x63, 0x63, 0x63, 0x63, + 0x00, 0x60, 0x59, 0x56, 0x52, 0x4c, 0x49, 0x5d, 0x00, 0x30, 0x00, 0x00, + 0xe9, 0xd4, 0x00, 0x4a, 0x0f, 0x0d, 0x30, 0x0d, 0x0d, 0xe9, 0xd2, 0x0f, + 0x10, 0x10, 0x10, 0x00, 0x10, 0x11, 0x13, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x40, 0x1a, 0xd2, 0x13, 0x13, 0x14, 0x36, 0x00, 0x00, 0x70, 0x00, 0xe9, + 0xd4, 0xa6, 0x66, 0x43, 0x3c, 0x3c, 0x00, 0x40, 0x41, 0x45, 0x45, 0x46, + 0x45, 0x43, 0x45, 0x00, 0x41, 0x40, 0x3d, 0x3a, 0x3a, 0x38, 0x38, 0x38, + 0x04, 0x38, 0x38, 0x3a, 0x3a, 0x3a, 0xe9, 0x3a, 0x3a, 0x00, 0x3d, 0x3a, + 0x3d, 0x3d, 0x3c, 0x40, 0x40, 0x40, 0x00, 0x41, 0x43, 0x43, 0x46, 0x46, + 0x4c, 0x4c, 0x4d, 0x02, 0x51, 0x51, 0x57, 0x5a, 0x5a, 0x5a, 0xe9, 0x57, + 0x00, 0x57, 0x51, 0x4c, 0x46, 0x41, 0x5d, 0x00, 0x00, 0x60, 0x00, 0xe9, + 0xd4, 0x00, 0x00, 0x29, 0x0a, 0x0a, 0x60, 0x0a, 0xe9, 0xd2, 0x0b, 0x0b, + 0x0a, 0x0b, 0x0e, 0x00, 0x0e, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, + 0xc3, 0xe9, 0xb1, 0x26, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x80, 0xa7, 0x00, + 0x50, 0x32, 0x36, 0x34, 0x38, 0x38, 0x40, 0x38, 0xe9, 0x38, 0x38, 0x34, + 0x34, 0x32, 0x32, 0x50, 0x32, 0xe9, 0x2d, 0xca, 0x36, 0x32, 0x34, 0x36, + 0x10, 0x34, 0x34, 0x36, 0x11, 0x37, 0x38, 0x3a, 0x3a, 0x00, 0x3c, 0x3c, + 0x3c, 0x40, 0x40, 0x44, 0x46, 0x48, 0x00, 0x4d, 0x4f, 0x4f, 0x57, 0x57, + 0x57, 0x57, 0x4f, 0x00, 0x4d, 0x48, 0x46, 0x40, 0x3b, 0x50, 0x00, 0x00, + 0x60, 0x00, 0xe9, 0xd4, 0x00, 0x00, 0x4a, 0x29, 0x07, 0x20, 0x07, 0x07, + 0xe9, 0x07, 0x07, 0x09, 0x0a, 0x09, 0x00, 0x0a, 0x09, 0x0a, 0x0a, 0x0a, + 0x0e, 0x0e, 0x0e, 0xc1, 0xe9, 0xd2, 0x10, 0x21, 0x00, 0x00, 0x00, 0xe9, + 0xc0, 0xd4, 0xa7, 0x00, 0x00, 0x66, 0x33, 0x2c, 0x2d, 0x00, 0x30, 0x31, + 0x31, 0x30, 0x30, 0x30, 0x2e, 0x2e, 0x00, 0x2b, 0x2d, 0x27, 0x27, 0x27, + 0x24, 0x27, 0x28, 0x00, 0x24, 0x2d, 0x2d, 0x2e, 0x2e, 0x2d, 0x2d, 0x2d, + 0xc0, 0x59, 0xe2, 0x30, 0x32, 0x32, 0x34, 0x34, 0x34, 0x00, 0x34, 0x34, + 0x38, 0x38, 0x3b, 0x3f, 0x44, 0x44, 0x00, 0x48, 0x4d, 0x4d, 0x4d, 0x4d, + 0x48, 0x48, 0x44, 0x01, 0x3f, 0x3b, 0x34, 0x4a, 0x00, 0x00, 0x00, 0xe9, + 0xc0, 0xd4, 0xa1, 0x3e, 0x17, 0x07, 0x05, 0x06, 0x06, 0x11, 0x06, 0x06, + 0x06, 0xd3, 0x09, 0x09, 0x09, 0xe9, 0x0b, 0x09, 0x0b, 0x0b, 0x0b, 0xd9, + 0x1d, 0x02, 0xe2, 0xc0, 0xc6, 0x87, 0x50, 0x24, 0x1f, 0x23, 0x24, 0x28, + 0x00, 0x25, 0x25, 0x23, 0x23, 0x23, 0x23, 0x22, 0x22, 0x10, 0x1e, 0x1e, + 0x1e, 0xe9, 0x1e, 0x24, 0x27, 0x27, 0x60, 0x27, 0xe9, 0xd2, 0x28, 0x2c, + 0x2c, 0x2c, 0x2d, 0x00, 0x2d, 0x2d, 0x2d, 0x2d, 0x2e, 0x30, 0x31, 0x36, + 0x02, 0x38, 0x3b, 0x3b, 0x44, 0x44, 0x44, 0xe9, 0x3f, 0x00, 0x3b, 0x38, + 0x36, 0x31, 0x4a, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa3, 0x17, 0x0c, + 0x03, 0x05, 0x05, 0x48, 0x05, 0xe9, 0x05, 0x06, 0xe2, 0x06, 0x09, 0x09, + 0x47, 0x09, 0xe9, 0x06, 0x06, 0x33, 0x05, 0xcd, 0x97, 0x82, 0x4a, 0x3d, + 0x1b, 0x1b, 0x1b, 0x1a, 0xe1, 0x1b, 0x04, 0x1b, 0x15, 0x15, 0x15, 0x14, + 0xe1, 0x12, 0x12, 0x01, 0x29, 0x00, 0x00, 0x22, 0x24, 0x24, 0x24, 0xe9, + 0x04, 0x24, 0x24, 0x22, 0x22, 0x22, 0xa3, 0x27, 0x27, 0x00, 0x28, 0x27, + 0x2b, 0x30, 0x31, 0x35, 0x39, 0x39, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x39, + 0x35, 0x31, 0x30, 0x0e, 0x30, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa4, 0x08, + 0x02, 0x17, 0x0c, 0x07, 0x02, 0x02, 0x02, 0xe9, 0x02, 0x00, 0x04, 0x04, + 0x04, 0x04, 0x05, 0x04, 0x04, 0x06, 0x07, 0x05, 0x06, 0x06, 0x0e, 0x08, + 0x06, 0xc6, 0x87, 0x80, 0x3a, 0x3e, 0x14, 0x12, 0x12, 0x12, 0x12, 0x10, + 0x00, 0x12, 0x10, 0x0f, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x10, 0x0d, 0x0a, + 0x3e, 0x02, 0x1b, 0x1e, 0x1e, 0x1e, 0xe0, 0xe9, 0xd4, 0xa1, 0x22, 0x1f, + 0x1f, 0x23, 0x25, 0x00, 0x25, 0x2a, 0x2a, 0x2f, 0x2f, 0x35, 0x35, 0x35, + 0x00, 0x35, 0x2f, 0x2f, 0x2a, 0x25, 0x2e, 0x00, 0x00, 0x70, 0x00, 0xe9, + 0xd4, 0xa7, 0x0f, 0x0c, 0x03, 0x02, 0x00, 0x01, 0x01, 0x02, 0x01, 0x02, + 0x02, 0x04, 0x04, 0x8f, 0xe2, 0x07, 0x0a, 0x08, 0x07, 0xbf, 0x77, 0x2b, + 0x00, 0x4a, 0x17, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x01, 0x09, 0x09, + 0x09, 0x07, 0x07, 0x06, 0x0c, 0x04, 0x00, 0x08, 0x20, 0x15, 0x18, 0x18, + 0x18, 0x18, 0x15, 0x20, 0x1c, 0x1c, 0xca, 0x18, 0x1c, 0x18, 0x1b, 0x1b, + 0x00, 0x1b, 0x1f, 0x1f, 0x23, 0x26, 0x26, 0x2a, 0x2a, 0x00, 0x2f, 0x2f, + 0x2a, 0x2a, 0x26, 0x25, 0x1f, 0x33, 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xa7, 0x00, 0x02, 0x00, 0x23, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x03, 0x03, 0x07, 0x03, 0x13, 0x08, 0x07, 0xe0, 0xbf, 0x77, + 0x2f, 0x3e, 0x0c, 0x05, 0x02, 0x03, 0x01, 0x03, 0x04, 0x03, 0x03, 0x02, + 0x0c, 0x29, 0x07, 0x00, 0x4a, 0x20, 0x12, 0x12, 0x12, 0x12, 0x12, 0x20, + 0x20, 0x3e, 0x18, 0xc3, 0x13, 0x13, 0x15, 0x15, 0x19, 0x00, 0x1a, 0x1d, + 0x21, 0x21, 0x26, 0x26, 0x26, 0x21, 0x01, 0x21, 0x1f, 0x1a, 0x22, 0x00, + 0x00, 0x00, 0xe9, 0xe3, 0xd4, 0xa7, 0x5a, 0x02, 0x02, 0x02, 0xe9, 0xd4, + 0xf8, 0x07, 0x07, 0x77, 0x2f, 0x03, 0x29, 0x1c, 0x19, 0x0c, 0x19, 0x1c, + 0x29, 0x4a, 0x07, 0x02, 0x87, 0x5d, 0x00, 0x4a, 0x70, 0x87, 0x00, 0x00, + 0x70, 0x0f, 0x0f, 0x40, 0x0f, 0xe9, 0x0f, 0x0f, 0x12, 0x11, 0x13, 0x16, + 0x00, 0x1a, 0x1a, 0x1d, 0x1d, 0x1d, 0x1d, 0x1a, 0x16, 0x07, 0x16, 0x36, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xff, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xc1, 0x07, 0x02, 0x29, 0x09, 0x0a, 0x0a, 0x0a, 0xe9, + 0x00, 0x0d, 0x0e, 0x0e, 0x10, 0x10, 0x11, 0x16, 0x11, 0x07, 0x16, 0x16, + 0x11, 0x10, 0x26, 0x07, 0xbf, 0x77, 0xff, 0x2f, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x80, 0x07, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, + 0x01, 0x09, 0x0a, 0x0a, 0x0b, 0x0e, 0x0e, 0x0e, 0xe9, 0x3f, 0x0e, 0x21, + 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x00, 0x00, 0x00, 0x28, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, + 0x00, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x09, 0x09, 0x7f, 0x26, 0x07, + 0xbf, 0x77, 0x2f, 0x07, 0x07, 0x07, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x03, 0x07, 0x05, 0x00, 0x02, 0x02, 0x03, 0x03, 0x05, 0x05, 0x05, 0x05, + 0x1f, 0x05, 0x06, 0x0e, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x00, 0x3e, 0x07, 0x03, 0x03, 0x01, + 0x01, 0x03, 0x04, 0x3f, 0x07, 0x0b, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x01, 0x17, 0x02, 0x02, + 0x02, 0xe9, 0x02, 0x07, 0x07, 0x77, 0xff, 0x2f, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, +}; + +//***************************************************************************** +// +// Rain Image +// +//***************************************************************************** +const uint8_t g_pui8RainImage[] = +{ + IMAGE_FMT_8BPP_COMP, + 128, 0, + 128, 0, + + 255, + 0x00, 0x00, 0x00, + 0x86, 0x4b, 0x0b, + 0x8a, 0x4c, 0x0a, + 0x88, 0x4c, 0x0b, + 0x8b, 0x4c, 0x0a, + 0x8c, 0x4d, 0x0a, + 0x8a, 0x4d, 0x0c, + 0x8b, 0x4d, 0x0c, + 0x8d, 0x4e, 0x0a, + 0x8e, 0x4e, 0x0c, + 0x8b, 0x4e, 0x0e, + 0x8f, 0x50, 0x0b, + 0x8d, 0x4f, 0x0e, + 0x90, 0x50, 0x0b, + 0x8f, 0x4f, 0x0e, + 0x91, 0x51, 0x0c, + 0x8f, 0x51, 0x0f, + 0x92, 0x51, 0x0f, + 0x92, 0x51, 0x10, + 0x93, 0x53, 0x0c, + 0x93, 0x53, 0x0e, + 0x93, 0x52, 0x10, + 0x93, 0x53, 0x10, + 0x8f, 0x53, 0x12, + 0x93, 0x53, 0x11, + 0x96, 0x54, 0x0e, + 0x95, 0x54, 0x11, + 0x96, 0x55, 0x10, + 0x95, 0x55, 0x12, + 0x97, 0x55, 0x12, + 0x93, 0x55, 0x14, + 0x97, 0x56, 0x11, + 0x99, 0x57, 0x0f, + 0x99, 0x56, 0x13, + 0x97, 0x56, 0x14, + 0x9a, 0x57, 0x11, + 0x97, 0x57, 0x13, + 0x99, 0x57, 0x14, + 0x99, 0x57, 0x15, + 0x9a, 0x58, 0x13, + 0x8e, 0x56, 0x1c, + 0x9c, 0x5a, 0x10, + 0x9b, 0x59, 0x13, + 0x9a, 0x59, 0x15, + 0x9a, 0x59, 0x16, + 0x9d, 0x5a, 0x13, + 0x9d, 0x5a, 0x15, + 0x9e, 0x5c, 0x11, + 0x96, 0x59, 0x1a, + 0x9d, 0x5a, 0x16, + 0x9d, 0x5a, 0x17, + 0x9e, 0x5c, 0x14, + 0x9f, 0x5b, 0x16, + 0x9f, 0x5c, 0x16, + 0x9f, 0x5b, 0x18, + 0xa0, 0x5e, 0x13, + 0x9f, 0x5c, 0x19, + 0x9f, 0x5d, 0x18, + 0x9a, 0x5c, 0x1c, + 0xa1, 0x5e, 0x16, + 0xa4, 0x60, 0x14, + 0xa2, 0x5e, 0x19, + 0xa0, 0x5f, 0x18, + 0x9f, 0x5e, 0x1b, + 0xa4, 0x60, 0x16, + 0xa4, 0x5f, 0x19, + 0xa3, 0x5f, 0x1a, + 0xa5, 0x61, 0x18, + 0xa6, 0x63, 0x15, + 0xa3, 0x60, 0x1c, + 0xa6, 0x60, 0x1b, + 0xa6, 0x61, 0x1c, + 0xa7, 0x63, 0x19, + 0xa6, 0x63, 0x1b, + 0xa8, 0x63, 0x1b, + 0xa6, 0x63, 0x1d, + 0xa9, 0x64, 0x1c, + 0xab, 0x67, 0x17, + 0xa9, 0x64, 0x1e, + 0xa7, 0x64, 0x1f, + 0xaa, 0x64, 0x1e, + 0x9f, 0x63, 0x24, + 0xab, 0x67, 0x1a, + 0xab, 0x67, 0x1e, + 0xaa, 0x66, 0x21, + 0xab, 0x67, 0x1f, + 0xad, 0x67, 0x1f, + 0xac, 0x69, 0x1c, + 0xae, 0x67, 0x21, + 0xa8, 0x68, 0x25, + 0xae, 0x6a, 0x1f, + 0xae, 0x69, 0x21, + 0xae, 0x69, 0x22, + 0xb0, 0x6c, 0x1c, + 0xae, 0x69, 0x23, + 0xb1, 0x6a, 0x22, + 0xb1, 0x6a, 0x24, + 0xb0, 0x6c, 0x22, + 0xb2, 0x6c, 0x23, + 0xb4, 0x70, 0x1d, + 0xb3, 0x6f, 0x21, + 0xb1, 0x6e, 0x24, + 0xb4, 0x6e, 0x24, + 0xb0, 0x6e, 0x27, + 0xb4, 0x6f, 0x27, + 0xb7, 0x6f, 0x26, + 0xb5, 0x6f, 0x27, + 0xa3, 0x6c, 0x34, + 0xb5, 0x71, 0x24, + 0xb6, 0x71, 0x27, + 0xb7, 0x72, 0x26, + 0xb9, 0x75, 0x20, + 0xb9, 0x71, 0x29, + 0xb7, 0x72, 0x29, + 0xb8, 0x73, 0x28, + 0xb8, 0x75, 0x26, + 0xb9, 0x74, 0x2a, + 0xba, 0x76, 0x28, + 0xb0, 0x73, 0x33, + 0xba, 0x76, 0x2a, + 0xbe, 0x75, 0x2b, + 0xbc, 0x76, 0x2a, + 0xbc, 0x7a, 0x24, + 0xba, 0x76, 0x2d, + 0xbc, 0x79, 0x29, + 0xbd, 0x79, 0x2b, + 0xbf, 0x78, 0x2d, + 0xbf, 0x79, 0x2e, + 0xc0, 0x7d, 0x26, + 0xbe, 0x7b, 0x2b, + 0xc0, 0x7b, 0x2c, + 0xc2, 0x7a, 0x2e, + 0xc2, 0x7b, 0x30, + 0xc0, 0x7d, 0x2d, + 0xbf, 0x7b, 0x32, + 0xb9, 0x7a, 0x37, + 0xc2, 0x7d, 0x2e, + 0xc2, 0x7e, 0x2e, + 0xc4, 0x82, 0x27, + 0xc5, 0x7d, 0x32, + 0xc3, 0x7e, 0x31, + 0xc3, 0x7f, 0x30, + 0xc8, 0x7d, 0x33, + 0xc3, 0x80, 0x2f, + 0xc5, 0x80, 0x31, + 0xc3, 0x7f, 0x35, + 0xc9, 0x7f, 0x35, + 0xc7, 0x81, 0x33, + 0xc6, 0x82, 0x32, + 0xc7, 0x82, 0x32, + 0xc8, 0x84, 0x33, + 0xc8, 0x83, 0x35, + 0xca, 0x83, 0x37, + 0xcb, 0x8a, 0x2a, + 0xcd, 0x83, 0x38, + 0xc9, 0x82, 0x3c, + 0xc8, 0x86, 0x35, + 0xca, 0x89, 0x30, + 0xca, 0x87, 0x35, + 0xd0, 0x85, 0x3a, + 0xcb, 0x88, 0x37, + 0xcd, 0x88, 0x37, + 0xff, 0x7f, 0x37, + 0xcb, 0x8a, 0x38, + 0xd1, 0x87, 0x3e, + 0xcd, 0x8b, 0x38, + 0xcf, 0x8b, 0x39, + 0xcf, 0x8b, 0x3b, + 0xd0, 0x8d, 0x3a, + 0xd1, 0x8b, 0x3e, + 0xd0, 0x92, 0x31, + 0xd6, 0x8a, 0x3f, + 0xd0, 0x8e, 0x3c, + 0xcb, 0x89, 0x48, + 0xd6, 0x8b, 0x41, + 0xd2, 0x8f, 0x3c, + 0xd1, 0x8f, 0x3e, + 0xda, 0x8c, 0x41, + 0xd3, 0x8f, 0x3f, + 0xd5, 0x91, 0x3f, + 0xd7, 0x90, 0x41, + 0xdb, 0x8e, 0x44, + 0xd3, 0x93, 0x3e, + 0xd3, 0x92, 0x40, + 0xdc, 0x8f, 0x44, + 0xea, 0x8e, 0x41, + 0xff, 0x8c, 0x3e, + 0xdf, 0x8f, 0x46, + 0xc4, 0x8c, 0x56, + 0xd5, 0x94, 0x41, + 0xd6, 0x97, 0x3b, + 0xdc, 0x91, 0x46, + 0xe2, 0x90, 0x47, + 0xd9, 0x94, 0x43, + 0xd7, 0x95, 0x43, + 0xe5, 0x91, 0x48, + 0xd7, 0x97, 0x43, + 0xdf, 0x93, 0x48, + 0xe2, 0x93, 0x48, + 0xd9, 0x96, 0x46, + 0xdb, 0x96, 0x46, + 0xe8, 0x93, 0x49, + 0xdc, 0x96, 0x48, + 0xe7, 0x93, 0x4a, + 0xd9, 0x99, 0x44, + 0xdf, 0x96, 0x48, + 0xe2, 0x95, 0x49, + 0xe5, 0x94, 0x4b, + 0xff, 0x8f, 0x4c, + 0xf4, 0x94, 0x48, + 0xdc, 0x99, 0x47, + 0xdf, 0x97, 0x4a, + 0xe3, 0x96, 0x4b, + 0xe7, 0x95, 0x4c, + 0xe5, 0x96, 0x4b, + 0xda, 0x9b, 0x47, + 0xde, 0x9a, 0x48, + 0xe0, 0x99, 0x4a, + 0xe6, 0x97, 0x4c, + 0xe4, 0x98, 0x4b, + 0xdf, 0x98, 0x4e, + 0xe3, 0x99, 0x4b, + 0xdc, 0x9c, 0x48, + 0xde, 0x9b, 0x4a, + 0xd4, 0x95, 0x5b, + 0xe1, 0x9b, 0x4b, + 0xde, 0x9d, 0x49, + 0xe4, 0x9a, 0x4d, + 0xdf, 0x9d, 0x4b, + 0xf3, 0x97, 0x51, + 0xe1, 0x9d, 0x4c, + 0xe6, 0x9a, 0x57, + 0xfa, 0x9d, 0x57, + 0xde, 0x9d, 0x64, + 0xf6, 0x9c, 0x63, + 0xf9, 0xa7, 0x63, + 0xe6, 0xa6, 0x70, + 0xf7, 0xaa, 0x6c, + 0xef, 0xaa, 0x74, + 0xff, 0xb1, 0x7e, + 0xe1, 0xb3, 0x8a, + 0xfb, 0xb7, 0x79, + 0xf6, 0xb4, 0x84, + 0xff, 0xb3, 0x86, + 0xec, 0xb6, 0x89, + 0xff, 0xbe, 0x86, + 0xf4, 0xbd, 0x93, + 0xff, 0xc2, 0x92, + 0xed, 0xc3, 0xa0, + 0xf9, 0xc9, 0xa2, + 0xf4, 0xce, 0xaf, + 0xf8, 0xd4, 0xb6, + 0xf3, 0xd7, 0xc0, + 0xfa, 0xdb, 0xc3, + 0xf8, 0xdf, 0xcb, + 0xfc, 0xe6, 0xd7, + + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x01, 0xf9, 0xfb, 0xfd, 0xfe, 0xfe, 0xfc, 0xfa, 0x07, + 0xff, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x07, 0xf6, 0xfb, 0xfe, 0xfe, 0x02, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, + 0xfd, 0xc1, 0xfd, 0x7f, 0xf9, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0x07, + 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x01, 0xf9, 0xfe, 0x00, 0xfe, 0xfc, + 0xf8, 0xee, 0xea, 0xd5, 0xc9, 0xc9, 0x00, 0xc9, 0xd5, 0xe7, 0xee, 0xf6, + 0xfc, 0xfe, 0xfe, 0x7f, 0xfb, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0x07, + 0xf8, 0x07, 0x07, 0x07, 0x07, 0x06, 0xf6, 0xfc, 0xfd, 0x01, 0xfa, 0xee, + 0xd5, 0xc9, 0xd5, 0xd5, 0xd5, 0xe9, 0x00, 0xd5, 0xd5, 0xcb, 0xc9, 0xc9, + 0xec, 0xf9, 0xfe, 0x3f, 0xfe, 0xfa, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, + 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0xfb, 0xfc, 0x03, 0xfb, 0xee, + 0xc9, 0xd5, 0xd5, 0xd5, 0xe9, 0xd2, 0x40, 0xcb, 0xe9, 0xcb, 0xc3, 0xe7, + 0xfa, 0xfe, 0xfe, 0xff, 0x05, 0xcd, 0x97, 0x4f, 0x07, 0x07, 0x07, 0x07, + 0xf0, 0x07, 0x07, 0x07, 0x05, 0xfc, 0xfc, 0xf4, 0xcf, 0x01, 0xcf, 0xd5, + 0xd5, 0xd5, 0xd5, 0xd5, 0xda, 0xd3, 0x08, 0xcf, 0xcb, 0xcb, 0xcb, 0xe9, + 0xc3, 0xee, 0xfc, 0x3f, 0xfe, 0xf6, 0x02, 0xe2, 0xc6, 0x87, 0x3f, 0x07, + 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0xfc, 0xfb, + 0xec, 0xcb, 0xcf, 0xd5, 0xd5, 0xd5, 0x02, 0xd5, 0xd5, 0xda, 0xda, 0xda, + 0xda, 0xbb, 0xcf, 0x00, 0xcf, 0xcf, 0xcb, 0xcb, 0xc3, 0xc3, 0xe7, 0xfa, + 0x07, 0xfd, 0xf9, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xff, 0x5f, 0x17, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x80, 0x02, 0xfb, 0xfb, 0xe7, 0xc3, + 0xcf, 0xcf, 0xcf, 0x06, 0xd6, 0xd6, 0xda, 0xda, 0xda, 0xe9, 0xd1, 0xd6, + 0x40, 0xd6, 0x81, 0xcf, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x03, 0xf8, 0xfd, + 0xf6, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x80, 0x07, 0x00, 0x00, 0xfa, 0xfb, 0xe7, 0xce, 0xce, + 0x00, 0xce, 0xd4, 0xd4, 0xdb, 0xda, 0xdb, 0xdb, 0xdb, 0x80, 0xe9, 0xdb, + 0xda, 0xd6, 0xdb, 0xdb, 0xd4, 0xce, 0x00, 0xcf, 0xce, 0xc6, 0xc6, 0xc0, + 0xc0, 0xc0, 0xc0, 0x07, 0xfa, 0xfc, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0xff, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0xf9, + 0xfb, 0xec, 0xc6, 0xce, 0xce, 0xd4, 0x00, 0xd4, 0xd4, 0xdd, 0xdd, 0xdd, + 0xe3, 0xe3, 0xe3, 0x88, 0xe9, 0xe3, 0xdd, 0xdd, 0x89, 0xce, 0xce, 0xc6, + 0x00, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xdc, 0xfc, 0xfc, 0x1f, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x06, 0xec, 0xfa, 0x00, 0xf6, 0xc0, 0xc6, 0xce, 0xce, 0xce, 0xd4, 0xd4, + 0x04, 0xdd, 0xdd, 0xe3, 0xe3, 0xe3, 0xe9, 0xe3, 0xdd, 0x00, 0xe3, 0xdd, + 0xdd, 0xdd, 0xd4, 0xd4, 0xce, 0xce, 0x00, 0xc6, 0xc6, 0xc0, 0xc0, 0xbb, + 0xbb, 0xec, 0xfc, 0x0c, 0xf9, 0x00, 0x00, 0x00, 0xe9, 0xd2, 0xfb, 0xfe, + 0x07, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0x37, 0x77, 0xf8, 0x2f, 0x07, + 0x07, 0x07, 0x07, 0x00, 0x00, 0xfa, 0x00, 0xfa, 0xdc, 0xc5, 0xc5, 0xc5, + 0xce, 0xd3, 0xd3, 0x00, 0xd9, 0xd9, 0xe1, 0xe1, 0xe3, 0xe1, 0xe1, 0xe6, + 0x41, 0xe1, 0xca, 0xdd, 0xd9, 0xd9, 0xd3, 0xce, 0x41, 0x00, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb1, 0xf8, 0xfc, 0x00, 0x20, 0x00, 0x00, 0xe9, 0x00, 0x00, + 0xfe, 0xfc, 0xf4, 0x00, 0xec, 0xe7, 0xcb, 0xd5, 0xe7, 0xee, 0xf6, 0xfe, + 0x7f, 0xfe, 0x66, 0x26, 0x87, 0x3f, 0x07, 0x07, 0x07, 0x80, 0x07, 0xec, + 0xf8, 0xec, 0xbf, 0xc5, 0xc5, 0xcd, 0x00, 0xcd, 0xcd, 0xd3, 0xd9, 0xd9, + 0xd9, 0xe1, 0xe1, 0x00, 0xe6, 0xe6, 0xe1, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1, + 0x80, 0x99, 0xd9, 0xcd, 0xcd, 0xc5, 0xc5, 0xbb, 0xbb, 0x00, 0xb8, 0xbb, + 0xb5, 0xe7, 0xfc, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfa, + 0xec, 0xc9, 0xcb, 0x00, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xcb, 0xc9, 0xc9, + 0x1f, 0xee, 0xfc, 0xfd, 0x5b, 0x33, 0xb7, 0x6f, 0x27, 0xe0, 0x07, 0x07, + 0x03, 0xe7, 0xeb, 0xed, 0xed, 0xed, 0x00, 0xec, 0xe0, 0xbc, 0xf0, 0xf8, + 0xdc, 0xc5, 0xc5, 0x00, 0xc5, 0xc5, 0xcd, 0xd3, 0xd3, 0xd9, 0xdf, 0xe1, + 0x00, 0xe1, 0xe4, 0xe1, 0xe4, 0xe6, 0xe6, 0xe4, 0xe4, 0x00, 0xe1, 0xe1, + 0xe1, 0xdf, 0xd9, 0xd3, 0xd3, 0xcd, 0x00, 0xc5, 0xc5, 0xbf, 0xbf, 0xb8, + 0xb5, 0xb5, 0xb1, 0x00, 0xf8, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xee, + 0x08, 0xc9, 0xd5, 0xd5, 0xd5, 0xe9, 0xd5, 0xd5, 0xcb, 0x03, 0xd5, 0xcb, + 0xcb, 0xc3, 0xf4, 0xfe, 0x52, 0x32, 0xfc, 0xc6, 0x87, 0x3f, 0x07, 0x07, + 0x01, 0xe7, 0xee, 0x06, 0xf4, 0xf6, 0xf8, 0xf8, 0xf8, 0xe9, 0xd1, 0xf0, + 0x10, 0xca, 0xca, 0xca, 0xe9, 0xd3, 0xd3, 0xdf, 0xdf, 0x06, 0xdf, 0xdf, + 0xe4, 0xe4, 0xe4, 0xe9, 0xd1, 0xdf, 0x08, 0xdf, 0xd8, 0xdf, 0xd3, 0x31, + 0xbf, 0xbf, 0xbf, 0x00, 0xb8, 0xb8, 0xb8, 0xe9, 0xfb, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0xe7, 0xcf, 0xcf, 0xd6, 0xda, 0xda, 0xda, 0x80, 0xe9, 0xd6, + 0xd5, 0xcf, 0xcf, 0xc3, 0xc3, 0xc3, 0x3f, 0xec, 0xfe, 0x49, 0x31, 0xd4, + 0xa7, 0x5f, 0x17, 0xc0, 0x07, 0x02, 0xed, 0xf4, 0xf4, 0xf6, 0xf6, 0xf4, + 0x00, 0xee, 0xec, 0xe9, 0xe9, 0xec, 0xec, 0xf4, 0xf4, 0x00, 0xf4, 0xdc, + 0xdc, 0xca, 0xca, 0xca, 0xca, 0xca, 0x00, 0xd2, 0xca, 0xd8, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0x04, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xb2, 0xd8, 0xd2, + 0x00, 0xd3, 0xcd, 0xcd, 0xcd, 0xc5, 0xc5, 0xc5, 0xbf, 0x00, 0xc5, 0xbf, + 0xc5, 0xfa, 0xfa, 0x00, 0xfc, 0xe7, 0x01, 0xd4, 0xd4, 0xd4, 0xdb, 0xda, + 0xe3, 0xda, 0xe9, 0x00, 0xdb, 0xda, 0xd4, 0xd4, 0xcf, 0xc6, 0xc6, 0xc0, + 0x07, 0xec, 0xfe, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xe0, 0x5f, 0x17, + 0x07, 0x00, 0xea, 0xf2, 0xf4, 0xf4, 0x00, 0xee, 0xe7, 0xcf, 0xc3, 0xc3, + 0xc3, 0xc0, 0xc0, 0x00, 0xc0, 0xbb, 0xb8, 0xb5, 0xb5, 0xbf, 0xca, 0xca, + 0x00, 0xc7, 0xc8, 0xc8, 0xc8, 0xca, 0xd2, 0xd2, 0xd2, 0x00, 0xde, 0xde, + 0xdf, 0xde, 0xde, 0xde, 0xe2, 0xe2, 0x00, 0xe2, 0xdf, 0xdf, 0xdf, 0xd8, + 0xd8, 0xdf, 0xd8, 0x00, 0xd9, 0xd8, 0xd3, 0xca, 0xca, 0xbf, 0xca, 0xc5, + 0x00, 0xbf, 0xbf, 0xf4, 0xf4, 0xfb, 0xec, 0xcf, 0xd6, 0x00, 0xd4, 0xd4, + 0xdd, 0xdb, 0xe3, 0xe3, 0xe3, 0xe3, 0x00, 0xe3, 0xdb, 0xdb, 0xd4, 0xd4, + 0xce, 0xc6, 0xc0, 0x01, 0xc0, 0xbb, 0xf4, 0xfb, 0x00, 0x00, 0x00, 0xe9, + 0xf8, 0xd4, 0xa7, 0x5f, 0x17, 0x05, 0xad, 0xec, 0xee, 0x00, 0xee, 0xec, + 0xcf, 0xc3, 0xc3, 0xc0, 0xc0, 0xc0, 0x00, 0xc0, 0xc0, 0xbb, 0xbb, 0xb8, + 0xb8, 0xb5, 0xb4, 0x00, 0xb4, 0xb4, 0xc1, 0xc1, 0xc7, 0xc7, 0xc7, 0xc8, + 0x01, 0xd2, 0xd7, 0xd7, 0xd7, 0xde, 0xde, 0xde, 0xe9, 0x80, 0xd3, 0xe2, + 0xe2, 0xdf, 0xdf, 0xd8, 0xd2, 0xc8, 0x00, 0xca, 0xc8, 0xc8, 0xca, 0xca, + 0xca, 0xdc, 0xec, 0x00, 0xf8, 0xf6, 0xce, 0xdb, 0xdd, 0xdb, 0xdd, 0xdd, + 0x00, 0xe3, 0xe1, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe1, 0x00, 0xdd, 0xdd, + 0xce, 0xc6, 0xc5, 0xc0, 0xbb, 0xbb, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0xc0, 0x17, 0x04, 0xe7, 0xec, 0xee, 0xec, 0xc3, 0xc0, + 0x20, 0xc0, 0xc0, 0xe9, 0xbb, 0xbb, 0xb8, 0xb8, 0xb8, 0x00, 0xb5, 0xb4, + 0xb4, 0xb4, 0xb4, 0xc1, 0xc2, 0xc1, 0x00, 0xc2, 0xc7, 0xcc, 0xc7, 0xcc, + 0xcc, 0xd7, 0xd7, 0x60, 0xd7, 0xe9, 0xd3, 0xde, 0xe2, 0xe2, 0xde, 0xde, + 0x00, 0xde, 0xd2, 0xd2, 0xc7, 0xc8, 0xc6, 0xce, 0xda, 0x00, 0xda, 0xe7, + 0xe7, 0xe9, 0xfa, 0xe7, 0xd4, 0xd4, 0x00, 0xdd, 0xe1, 0xe3, 0xe3, 0xe1, + 0xe6, 0xe6, 0xe6, 0x80, 0xe9, 0xd9, 0xd9, 0xd9, 0xcd, 0xcd, 0xc5, 0xbf, + 0x01, 0xb8, 0xb5, 0xec, 0xfb, 0x00, 0x00, 0x00, 0xe9, 0xf8, 0xd4, 0xa7, + 0x5f, 0x17, 0x02, 0xe7, 0xec, 0xec, 0x08, 0xe7, 0xbb, 0xbb, 0xbb, 0xe9, + 0xbb, 0xb8, 0xb5, 0x02, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xe9, 0xb4, + 0x00, 0xbd, 0xc2, 0xc2, 0xc2, 0xc4, 0xc7, 0xcc, 0xcc, 0x02, 0xcc, 0xcc, + 0xcc, 0xd7, 0xd7, 0xd7, 0xe9, 0xd7, 0x08, 0xde, 0xde, 0xde, 0xde, 0xa9, + 0xcc, 0xcd, 0xe7, 0x00, 0xee, 0xf4, 0xf6, 0xf9, 0xf9, 0xf9, 0xf9, 0xf8, + 0x00, 0xf4, 0xd3, 0xd4, 0xd3, 0xd9, 0xe1, 0xe6, 0xe6, 0x40, 0xe6, 0xe9, + 0xe6, 0xe6, 0xe4, 0xe1, 0xdf, 0xd9, 0x00, 0xd3, 0xcd, 0xc5, 0xbf, 0xb5, + 0xb5, 0xb1, 0xfb, 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, + 0x80, 0x01, 0xdc, 0xe9, 0xe9, 0xbb, 0xb1, 0xb1, 0xb5, 0x20, 0xb5, 0xb5, + 0xe9, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0x00, 0xb4, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb7, 0xb7, 0xbd, 0x03, 0xbd, 0xc2, 0xc2, 0xc4, 0xc4, 0xc4, 0xe9, 0xd4, + 0x08, 0xcc, 0xd7, 0xd7, 0xd7, 0xe9, 0xd7, 0xc8, 0xe7, 0x00, 0xf2, 0xf6, + 0xf2, 0xec, 0xe7, 0xda, 0xd5, 0xe3, 0x00, 0xe7, 0xe9, 0xdc, 0xdc, 0xd3, + 0xd3, 0xd3, 0xd8, 0x00, 0xe1, 0xe6, 0xe6, 0xe6, 0xe4, 0xe2, 0xe2, 0xdf, + 0x00, 0xdf, 0xdf, 0xd8, 0xd2, 0xca, 0xc8, 0xbf, 0xb8, 0x00, 0xb5, 0xb1, + 0xab, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0xf8, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, + 0x00, 0x9b, 0xe9, 0x06, 0xe9, 0xb5, 0xb1, 0xb1, 0xb1, 0xe9, 0xd2, 0xb4, + 0x04, 0xb4, 0xb4, 0xb2, 0xb2, 0xb2, 0xe9, 0xb3, 0xb3, 0x00, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xc2, 0xc4, 0xc2, 0x10, 0xc4, 0xc4, 0xc4, 0xe9, 0xc4, + 0xc4, 0xcc, 0xcc, 0x20, 0xd7, 0xcc, 0xe1, 0xcd, 0xec, 0xf2, 0xec, 0xd5, + 0x00, 0xc3, 0xc3, 0xc3, 0xc6, 0xc6, 0xc0, 0xc5, 0xbf, 0x00, 0xbf, 0xc8, + 0xc8, 0xc8, 0xd2, 0xd8, 0xd8, 0xe2, 0x00, 0xe4, 0xe4, 0xe4, 0xde, 0xde, + 0xde, 0xde, 0xde, 0x00, 0xd2, 0xd2, 0xc8, 0xc7, 0xc1, 0xb4, 0xb4, 0xae, + 0x03, 0xab, 0xe9, 0xf8, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xe0, 0xa7, 0x5f, + 0x17, 0x00, 0xe9, 0xe9, 0xb5, 0xab, 0x20, 0xab, 0xab, 0xe9, 0xab, 0xab, + 0xae, 0xae, 0xae, 0x00, 0xb2, 0xae, 0xb2, 0xb2, 0xb2, 0xb2, 0xb0, 0xb0, + 0x08, 0xb0, 0xb7, 0xb7, 0xb7, 0xe9, 0xbd, 0xbd, 0xbd, 0xc0, 0xe9, 0xd3, + 0xc2, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0x00, 0xcc, 0xcd, 0xec, 0xec, 0xcf, + 0xc0, 0xc3, 0xc0, 0x00, 0xc6, 0xc0, 0xc0, 0xbf, 0xb8, 0xb8, 0xb8, 0xc1, + 0x00, 0xc1, 0xc8, 0xd2, 0xd2, 0xd2, 0xd2, 0xde, 0xde, 0x00, 0xe2, 0xe2, + 0xe2, 0xd7, 0xd7, 0xd7, 0xd7, 0xcc, 0x00, 0xcc, 0xc7, 0xc7, 0xc1, 0xb4, + 0xb4, 0xab, 0xab, 0x07, 0xbf, 0xf8, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0xc0, 0x5f, 0x17, 0xdc, 0xe0, 0xb5, 0xa4, 0xa4, 0xa4, 0x80, 0xe9, 0xa4, + 0xa4, 0xa9, 0xab, 0xa9, 0xa9, 0xb2, 0x00, 0xa9, 0xa9, 0xac, 0xac, 0xaf, + 0xac, 0xaf, 0xb0, 0x00, 0xaf, 0xb0, 0xb6, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, + 0xc4, 0xe9, 0xd3, 0xbd, 0xbd, 0xc2, 0xe9, 0xbd, 0xbf, 0x04, 0xec, 0xe7, + 0xbb, 0xbb, 0xbb, 0xe9, 0xb8, 0xb8, 0x00, 0xb5, 0xb4, 0xb4, 0xb4, 0xc1, + 0xc1, 0xc1, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xd7, 0xd7, 0xd7, 0xd7, 0xde, + 0x40, 0xd7, 0xb2, 0xc4, 0xc2, 0xc2, 0xbd, 0xb2, 0xb2, 0x01, 0xa9, 0xa4, + 0xa4, 0xf8, 0x00, 0x00, 0x00, 0xe9, 0xf0, 0xd4, 0xa7, 0x5f, 0x17, 0xe0, + 0xca, 0x9f, 0x9f, 0x60, 0x9f, 0xe9, 0xd1, 0xa4, 0xa4, 0xa9, 0xa9, 0xa9, + 0x00, 0xa9, 0xac, 0xac, 0xa8, 0xa8, 0xa8, 0xa8, 0xac, 0x06, 0xaf, 0xaf, + 0xaf, 0xaf, 0xb0, 0xda, 0xba, 0xaf, 0x04, 0xb0, 0xb6, 0xb6, 0xb7, 0xb7, + 0xe9, 0xb4, 0xe9, 0x00, 0xe7, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb5, 0xb5, + 0x00, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb3, 0xb4, 0xc2, 0x00, 0xc2, 0xc2, + 0xc4, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x80, 0xd1, 0xc4, 0xc4, 0xc2, 0xbd, + 0xbd, 0xbd, 0xbd, 0x00, 0xb7, 0xb2, 0xa9, 0xa4, 0x9f, 0xa4, 0xf0, 0x00, + 0x00, 0xec, 0xf0, 0xf8, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0xe9, 0xd4, + 0xa7, 0x5f, 0x00, 0x00, 0xbf, 0xe0, 0x08, 0xa4, 0x9a, 0x9a, 0x9a, 0xe9, + 0x9a, 0x9f, 0x9f, 0x00, 0x9f, 0xa6, 0xa7, 0xa7, 0xa7, 0xa8, 0xa7, 0xa7, + 0x02, 0xa6, 0xa6, 0xa8, 0xac, 0xac, 0xac, 0xe9, 0xac, 0x60, 0xaf, 0xc5, + 0xb1, 0xb0, 0xb7, 0xb0, 0xb0, 0xb0, 0x02, 0xb6, 0xdc, 0xe7, 0xab, 0xab, + 0xab, 0xe9, 0xae, 0x00, 0xb4, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb3, 0xb3, + 0x18, 0xbd, 0xbd, 0xbd, 0xe9, 0xd3, 0xc2, 0xc2, 0xb6, 0x00, 0xb6, 0xb6, + 0xb6, 0xb7, 0xb0, 0xb0, 0xac, 0xa7, 0x00, 0x9f, 0x9f, 0x9a, 0xe9, 0xec, + 0xe9, 0xe0, 0xe0, 0x00, 0xad, 0xe0, 0xe9, 0xf0, 0xf0, 0x00, 0x00, 0x00, + 0xf0, 0xe9, 0xd4, 0xa7, 0x5e, 0xad, 0xad, 0x92, 0x92, 0x40, 0x92, 0xe9, + 0x92, 0x98, 0x98, 0x9a, 0x9a, 0xa1, 0x0b, 0xa1, 0xa6, 0xa6, 0xa6, 0xe9, + 0xa5, 0xcc, 0x9c, 0x80, 0x6c, 0xa8, 0xac, 0xa7, 0xac, 0xac, 0xa8, 0xa9, + 0x00, 0xe0, 0xab, 0x9f, 0x9f, 0x9f, 0x9f, 0xa4, 0xa9, 0x00, 0xa9, 0xaf, + 0xb2, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0x05, 0xb6, 0xb3, 0xb6, 0xb6, 0xb6, + 0xe9, 0xb6, 0xba, 0x00, 0xb7, 0xb6, 0xaf, 0xb0, 0xb0, 0xaf, 0xac, 0xa8, + 0x00, 0xa7, 0xa6, 0xa1, 0x9a, 0x9a, 0x98, 0x92, 0x92, 0x40, 0x92, 0xe9, + 0x92, 0x8e, 0x98, 0xe0, 0xec, 0xec, 0x1e, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xa7, 0x5a, 0x9b, 0x04, 0xad, 0x98, 0x8e, 0x8e, 0x8e, 0xe9, 0x8e, 0x92, + 0x00, 0x93, 0x97, 0x97, 0x98, 0xa0, 0xa0, 0xa0, 0xa3, 0x02, 0xa5, 0xa1, + 0xa5, 0xa5, 0xa3, 0xa1, 0xd2, 0xa5, 0x11, 0xa5, 0xa5, 0xa1, 0x9a, 0xa0, + 0xa3, 0xa0, 0x9b, 0x00, 0xa6, 0xa6, 0xae, 0xae, 0x9a, 0x9a, 0x9a, 0x9a, + 0x00, 0x9a, 0xa1, 0xa6, 0xa6, 0xa8, 0xa8, 0xac, 0xaf, 0x01, 0xa8, 0xaf, + 0xac, 0xac, 0xaf, 0xaf, 0xaf, 0xe9, 0x18, 0xa8, 0xa8, 0xa8, 0xe9, 0xc3, + 0xa6, 0xa6, 0xa6, 0x00, 0xa1, 0xa0, 0x98, 0x98, 0x98, 0x97, 0x98, 0x92, + 0x00, 0x92, 0x92, 0x92, 0x92, 0x8e, 0x8e, 0x8e, 0x8e, 0x03, 0x8e, 0xe0, + 0xec, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xc0, 0xa7, 0x59, 0xae, 0xad, 0x8e, + 0x8b, 0x8b, 0x8b, 0x80, 0xe9, 0x8b, 0x8e, 0x93, 0x97, 0x97, 0x97, 0x98, + 0x08, 0x9e, 0xa0, 0xa0, 0xa0, 0xe9, 0xa0, 0x9e, 0x9e, 0x70, 0xa0, 0xae, + 0x75, 0x3b, 0xad, 0x9a, 0x92, 0x92, 0x00, 0x92, 0x93, 0x97, 0x98, 0xa0, + 0xa1, 0xa5, 0xa5, 0x1c, 0xa6, 0xa6, 0xa5, 0xd9, 0xe1, 0xc9, 0xa5, 0xa1, + 0x20, 0xa1, 0xa0, 0x61, 0xa6, 0xa3, 0xa0, 0xa0, 0xa0, 0x01, 0xa0, 0x9e, + 0x9e, 0x9e, 0x97, 0x97, 0x97, 0xe9, 0x00, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x8b, 0x8b, 0x8b, 0x01, 0x8b, 0x83, 0x9b, 0xe9, 0x00, 0x00, 0x00, 0xe9, + 0xc0, 0xd4, 0xa7, 0x00, 0x00, 0xad, 0x9b, 0x84, 0x84, 0x00, 0x84, 0x84, + 0x83, 0x84, 0x84, 0x88, 0x8c, 0x8b, 0x03, 0x90, 0x93, 0x95, 0x96, 0x96, + 0x96, 0xe9, 0xd4, 0x1c, 0x9e, 0x9e, 0x9e, 0xe9, 0xd3, 0x4b, 0x9c, 0x97, + 0x00, 0x9c, 0x9b, 0xad, 0x8e, 0x8b, 0x8b, 0x8b, 0x8b, 0x00, 0x93, 0x93, + 0x96, 0x9e, 0xa0, 0xa0, 0xa3, 0xa3, 0x08, 0xa5, 0xa3, 0xa3, 0xa0, 0x03, + 0x9e, 0x9c, 0x9e, 0x40, 0x96, 0xbd, 0x96, 0x96, 0x96, 0x96, 0x96, 0x95, + 0x01, 0x93, 0x93, 0x94, 0x94, 0x94, 0x94, 0x93, 0xc9, 0x00, 0x90, 0x90, + 0x8b, 0x8c, 0x84, 0x83, 0x83, 0x91, 0x0e, 0xe0, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x00, 0x00, 0x9b, 0x8b, 0x83, 0x7e, 0x7f, 0x7e, 0x83, 0x83, + 0x00, 0x83, 0x84, 0x84, 0x8c, 0x90, 0x90, 0x90, 0x94, 0x02, 0x95, 0x95, + 0x95, 0x95, 0x96, 0x96, 0xdb, 0x96, 0x80, 0xe9, 0x95, 0x93, 0x95, 0x95, + 0x94, 0x95, 0x94, 0x00, 0x95, 0x94, 0x94, 0x90, 0x94, 0x93, 0x93, 0x95, + 0x00, 0x9b, 0x9b, 0x84, 0x84, 0x84, 0x83, 0x84, 0x8c, 0x20, 0x90, 0x94, + 0x01, 0x9c, 0x9c, 0x96, 0x96, 0x96, 0x12, 0x96, 0x96, 0x95, 0x1a, 0x90, + 0x90, 0xe9, 0x90, 0x0c, 0x90, 0x93, 0x95, 0x90, 0xa7, 0x66, 0x8d, 0x8c, + 0x00, 0x88, 0x84, 0x83, 0x7e, 0x78, 0x91, 0xe0, 0x00, 0x38, 0x00, 0x00, + 0xe9, 0xd4, 0xa6, 0x76, 0x9b, 0x7e, 0x00, 0x78, 0x78, 0x78, 0x7e, 0x78, + 0x7e, 0x7e, 0x7f, 0x00, 0x85, 0x88, 0x88, 0x89, 0x8d, 0x8d, 0x8f, 0x8f, + 0x00, 0x94, 0x94, 0x8f, 0x8f, 0x8f, 0x90, 0x94, 0x90, 0x00, 0x94, 0x94, + 0x8d, 0x8d, 0x8d, 0x89, 0x89, 0x89, 0x02, 0x89, 0x88, 0x89, 0x88, 0x88, + 0x88, 0x1a, 0x8c, 0x00, 0x8d, 0x91, 0x91, 0x7e, 0x7e, 0x7e, 0x7e, 0x83, + 0x08, 0x84, 0x8c, 0x8d, 0x8d, 0x01, 0x94, 0x94, 0x90, 0x08, 0x90, 0x8d, + 0x8d, 0x8c, 0x12, 0x83, 0x85, 0x83, 0x06, 0x82, 0x83, 0x83, 0x83, 0x8c, + 0x9b, 0x79, 0x89, 0x00, 0x89, 0x8c, 0x8d, 0x89, 0x8d, 0x8d, 0x8d, 0x8f, + 0x00, 0x8f, 0x8d, 0x8d, 0x88, 0x88, 0x82, 0x7e, 0x7e, 0x01, 0x78, 0x74, + 0xad, 0xad, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa5, 0x87, 0x91, 0x78, + 0x79, 0x79, 0x79, 0x80, 0xe9, 0x79, 0x7d, 0x82, 0x82, 0x85, 0x85, 0x85, + 0x08, 0x88, 0x89, 0x89, 0x89, 0xe9, 0x8d, 0x8d, 0x8f, 0x00, 0x8d, 0x89, + 0x88, 0x88, 0x85, 0x82, 0x82, 0x82, 0xe0, 0xe9, 0xd4, 0x19, 0x88, 0x91, + 0x7e, 0x78, 0x78, 0x00, 0x78, 0x79, 0x7e, 0x82, 0x82, 0x88, 0x89, 0x89, + 0x00, 0x89, 0x89, 0x89, 0x88, 0x88, 0x82, 0x82, 0x7e, 0x01, 0x7d, 0x7e, + 0x7e, 0x7e, 0x79, 0x79, 0x79, 0xe9, 0x00, 0x79, 0x78, 0x7e, 0x82, 0x7f, + 0x7d, 0x81, 0x82, 0x84, 0xe9, 0x82, 0x85, 0x85, 0x85, 0xe9, 0x89, 0x89, + 0x00, 0x89, 0x89, 0x89, 0x85, 0x82, 0x82, 0x7d, 0x79, 0x01, 0x77, 0x70, + 0x7b, 0xbc, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa5, 0x86, 0x86, 0x70, + 0x70, 0x74, 0x70, 0x00, 0x74, 0x74, 0x77, 0x77, 0x79, 0x7d, 0x7d, 0x81, + 0x00, 0x82, 0x82, 0x85, 0x82, 0x85, 0x85, 0x85, 0x85, 0x00, 0x85, 0x88, + 0x88, 0x85, 0x7f, 0x82, 0x7e, 0x7d, 0x02, 0x7d, 0x7d, 0x7d, 0x79, 0x79, + 0x79, 0x31, 0x7d, 0x80, 0x11, 0x7e, 0x7f, 0x7f, 0x81, 0x86, 0x7b, 0x70, + 0x08, 0x70, 0x74, 0x74, 0x77, 0x71, 0x81, 0x82, 0x82, 0x40, 0x82, 0x0b, + 0x74, 0x74, 0x74, 0x70, 0x72, 0x74, 0x10, 0x72, 0x72, 0x72, 0xe9, 0x72, + 0x74, 0x79, 0x75, 0x00, 0x74, 0x75, 0x75, 0x75, 0x75, 0x75, 0x7c, 0x7d, + 0x01, 0x7d, 0x81, 0x81, 0x81, 0x85, 0x85, 0x85, 0xe9, 0x80, 0xb9, 0x7c, + 0x75, 0x74, 0x70, 0x6a, 0x87, 0x00, 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa5, + 0x87, 0x87, 0x70, 0x00, 0x70, 0x70, 0x6d, 0x71, 0x71, 0x72, 0x74, 0x77, + 0x00, 0x75, 0x75, 0x7c, 0x7c, 0x7d, 0x7d, 0x81, 0x81, 0x00, 0x7d, 0x81, + 0x82, 0x82, 0x82, 0x7d, 0x79, 0x79, 0x00, 0x79, 0x77, 0x77, 0x74, 0x74, + 0x74, 0x74, 0x75, 0x38, 0x75, 0x75, 0xe9, 0xd2, 0x69, 0x7b, 0x71, 0x69, + 0x08, 0x69, 0x69, 0x6d, 0x72, 0x66, 0x72, 0x72, 0x6e, 0x40, 0x6d, 0x79, + 0x69, 0x6a, 0x6a, 0x6a, 0x66, 0x66, 0x40, 0x66, 0xe9, 0x6a, 0x6e, 0x6d, + 0x6d, 0x6e, 0x6e, 0x08, 0x6e, 0x6e, 0x72, 0x72, 0x01, 0x7c, 0x7c, 0x7c, + 0x00, 0x7c, 0x81, 0x81, 0x81, 0x81, 0x81, 0x7c, 0x7c, 0x00, 0x75, 0x75, + 0x6e, 0x6a, 0x66, 0x71, 0x9b, 0x00, 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa4, + 0x76, 0x7b, 0x6a, 0x00, 0x6a, 0x6a, 0x6a, 0x6d, 0x6d, 0x6d, 0x6e, 0x72, + 0x04, 0x72, 0x72, 0x75, 0x75, 0x75, 0xe9, 0x79, 0x7c, 0x20, 0x7c, 0x79, + 0xb1, 0x72, 0x72, 0x6e, 0x6e, 0x6e, 0x90, 0xe9, 0x6e, 0x6d, 0xc5, 0x72, + 0x75, 0x74, 0x74, 0x00, 0x74, 0x71, 0x5f, 0x60, 0x62, 0x66, 0x66, 0x69, + 0x00, 0x69, 0x6d, 0x69, 0x69, 0x6e, 0x69, 0x69, 0x66, 0x01, 0x66, 0x62, + 0x62, 0x60, 0x5f, 0x5f, 0x5f, 0xe9, 0x80, 0xd4, 0x5f, 0x62, 0x62, 0x62, + 0x62, 0x62, 0x66, 0x00, 0x66, 0x66, 0x66, 0x6c, 0x6c, 0x6e, 0x6e, 0x73, + 0x00, 0x73, 0x75, 0x75, 0x7c, 0x7c, 0x7c, 0x7c, 0x75, 0x00, 0x73, 0x73, + 0x6e, 0x6c, 0x66, 0x5f, 0x60, 0x87, 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xa4, 0x51, 0x7b, 0x00, 0x62, 0x66, 0x66, 0x66, 0x66, 0x68, 0x68, 0x6a, + 0x00, 0x6d, 0x6d, 0x6e, 0x6e, 0x72, 0x72, 0x72, 0x72, 0x00, 0x72, 0x75, + 0x75, 0x75, 0x72, 0x6e, 0x6e, 0x69, 0x25, 0x69, 0x69, 0xe9, 0x69, 0x69, + 0x12, 0x66, 0xd1, 0x00, 0x69, 0x69, 0x6d, 0x6e, 0x6d, 0x70, 0x71, 0x67, + 0x00, 0x58, 0x58, 0x5f, 0x5f, 0x5f, 0x62, 0x62, 0x62, 0xa2, 0xe9, 0x62, + 0xb1, 0x58, 0x58, 0x58, 0xe9, 0x56, 0x62, 0x56, 0xda, 0xa3, 0x5c, 0x58, + 0x5c, 0x04, 0x66, 0x00, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x73, 0x73, 0x73, + 0x80, 0xe9, 0x73, 0x6c, 0x6c, 0x66, 0x61, 0x5b, 0x56, 0x0e, 0x76, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa5, 0x71, 0x00, 0x60, 0x60, 0x60, 0x62, 0x62, + 0x65, 0x65, 0x66, 0x02, 0x66, 0x66, 0x6c, 0x6d, 0x6d, 0x6d, 0xe9, 0x6e, + 0x11, 0x6e, 0x6c, 0x6c, 0x91, 0x62, 0x62, 0x62, 0xe9, 0x18, 0x62, 0x5f, + 0x5f, 0xe9, 0xd9, 0x62, 0x62, 0x66, 0x00, 0x68, 0x6a, 0x68, 0x6a, 0x67, + 0x54, 0x50, 0x53, 0x00, 0x55, 0x56, 0x58, 0x5b, 0x5b, 0x5b, 0x5b, 0x58, + 0x00, 0x56, 0x56, 0x55, 0x50, 0x50, 0x50, 0x4e, 0x4c, 0x23, 0x4c, 0x4c, + 0xd1, 0x4e, 0x4e, 0x4e, 0xc9, 0x81, 0x20, 0x55, 0x54, 0x01, 0x58, 0x5b, + 0x5b, 0x61, 0x5f, 0x01, 0x61, 0x64, 0x64, 0x64, 0x6c, 0x6c, 0x6c, 0xe9, + 0x00, 0x6c, 0x64, 0x64, 0x61, 0x5a, 0x55, 0x50, 0x67, 0x1c, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa5, 0x71, 0x5e, 0x00, 0x5c, 0x58, 0x5c, 0x5f, 0x5c, + 0x61, 0x62, 0x62, 0x00, 0x62, 0x65, 0x62, 0x65, 0x66, 0x65, 0x66, 0x66, + 0x20, 0x66, 0x66, 0xa1, 0x5f, 0x5f, 0x61, 0x5f, 0x5f, 0x01, 0x5f, 0x5f, + 0x5f, 0x58, 0x5f, 0x58, 0x5b, 0xd9, 0x80, 0xa3, 0x60, 0x60, 0x62, 0x5f, + 0x67, 0x54, 0x47, 0x02, 0x4a, 0x4a, 0x4c, 0x50, 0x50, 0x50, 0xe9, 0x4c, + 0x02, 0x4a, 0x4b, 0x47, 0x46, 0x46, 0x46, 0xe9, 0x46, 0x10, 0x47, 0x47, + 0x47, 0xe9, 0x46, 0x46, 0x49, 0x4a, 0x00, 0x47, 0x4b, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x50, 0x00, 0x50, 0x53, 0x53, 0x56, 0x5a, 0x5a, 0x5d, 0x64, + 0x20, 0x64, 0x64, 0xe9, 0x64, 0x5d, 0x5a, 0x5a, 0x53, 0x03, 0x50, 0x4a, + 0x67, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x80, 0xa5, 0x71, 0x5e, 0x55, 0x55, + 0x58, 0x58, 0x58, 0x00, 0x5b, 0x5b, 0x5c, 0x5c, 0x61, 0x61, 0x61, 0x61, + 0x01, 0x61, 0x5f, 0x62, 0x62, 0x5f, 0x5f, 0x5b, 0x71, 0x01, 0x58, 0x58, + 0x56, 0x58, 0x56, 0x56, 0x56, 0xe9, 0xc0, 0xd2, 0x7a, 0x5e, 0x5e, 0x5e, + 0x5c, 0x5e, 0x59, 0x02, 0x42, 0x42, 0x41, 0x46, 0x46, 0x46, 0xe9, 0x42, + 0x00, 0x42, 0x42, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x36, 0x0c, 0x36, 0x36, + 0x3d, 0x3d, 0x99, 0x39, 0x41, 0x41, 0x60, 0x41, 0xda, 0x03, 0x48, 0x48, + 0x4a, 0x4c, 0x52, 0x04, 0x57, 0x5a, 0x5d, 0x5d, 0x5d, 0xe9, 0x5a, 0x57, + 0x00, 0x4c, 0x4c, 0x49, 0x41, 0x59, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, + 0xa5, 0x51, 0x59, 0x4e, 0x4e, 0x50, 0x00, 0x55, 0x54, 0x55, 0x55, 0x55, + 0x55, 0x5a, 0x55, 0x00, 0x5a, 0x5a, 0x5a, 0x5a, 0x61, 0x5b, 0x5b, 0x56, + 0x11, 0x55, 0x53, 0x55, 0xe9, 0x50, 0x50, 0x50, 0xe9, 0xc0, 0xd4, 0xa1, + 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x00, 0x59, 0x45, 0x2e, 0x34, 0x39, + 0x3b, 0x3e, 0x3d, 0x00, 0x39, 0x3d, 0x35, 0x35, 0x34, 0x34, 0x31, 0x31, + 0x00, 0x31, 0x31, 0x31, 0x2c, 0x2c, 0x31, 0x38, 0x38, 0x00, 0x3d, 0x36, + 0x38, 0x38, 0x36, 0x36, 0x36, 0x36, 0x04, 0x3b, 0x3d, 0x3d, 0x3d, 0x3b, + 0xda, 0x41, 0x41, 0x00, 0x43, 0x41, 0x46, 0x48, 0x4c, 0x57, 0x57, 0x5d, + 0x00, 0x5d, 0x57, 0x57, 0x52, 0x52, 0x4a, 0x48, 0x42, 0x07, 0x3d, 0x59, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa6, 0x00, 0x59, 0x4b, 0x47, 0x47, 0x4c, + 0x4c, 0x4e, 0x50, 0x00, 0x50, 0x53, 0x53, 0x53, 0x53, 0x56, 0x56, 0x5a, + 0x40, 0x56, 0xc1, 0x50, 0x4a, 0x43, 0x3c, 0x3c, 0x3c, 0x00, 0x3c, 0x40, + 0x46, 0x4a, 0x4a, 0x4a, 0x4a, 0x4c, 0x04, 0x4c, 0x4c, 0x4c, 0x4c, 0x4b, + 0xd2, 0x4e, 0x4e, 0x00, 0x4e, 0x55, 0x50, 0x59, 0x38, 0x27, 0x27, 0x2a, + 0x20, 0x2a, 0x2a, 0xe9, 0x27, 0x25, 0x27, 0x21, 0x21, 0x40, 0x21, 0xe9, + 0x1d, 0x1d, 0x51, 0x38, 0x36, 0x32, 0x00, 0x32, 0x32, 0x32, 0x31, 0x32, + 0x31, 0x32, 0x31, 0x00, 0x31, 0x34, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, + 0x00, 0x35, 0x3b, 0x3b, 0x40, 0x41, 0x43, 0x48, 0x4c, 0x00, 0x52, 0x52, + 0x52, 0x52, 0x48, 0x48, 0x43, 0x41, 0x03, 0x3b, 0x3e, 0x51, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0x80, 0xa6, 0x59, 0x4f, 0x46, 0x46, 0x46, 0x47, 0x47, + 0x00, 0x47, 0x4b, 0x4c, 0x4c, 0x50, 0x50, 0x50, 0x53, 0x00, 0x53, 0x4c, + 0x53, 0x49, 0x58, 0x8e, 0xe9, 0xf6, 0x00, 0xfb, 0xfe, 0xfd, 0xfb, 0xf4, + 0xdc, 0x78, 0x4a, 0x18, 0x41, 0x47, 0x47, 0x12, 0xe9, 0x47, 0x47, 0x4b, + 0x00, 0x4b, 0x4b, 0x49, 0x4c, 0x4e, 0x51, 0x2c, 0x1b, 0x00, 0x1f, 0x1f, + 0x1d, 0x1d, 0x1d, 0x1b, 0x1b, 0x1a, 0x00, 0x1a, 0x1a, 0x1a, 0x16, 0x1a, + 0x16, 0x16, 0x14, 0x01, 0x76, 0xbc, 0xbc, 0x32, 0x2b, 0x2b, 0x2b, 0xe9, + 0x80, 0xd1, 0x27, 0x27, 0x27, 0x27, 0x27, 0x2a, 0x2a, 0x00, 0x2a, 0x2d, + 0x2d, 0x2e, 0x35, 0x3b, 0x3b, 0x40, 0x00, 0x40, 0x43, 0x48, 0x48, 0x48, + 0x43, 0x40, 0x3b, 0x03, 0x35, 0x2e, 0x38, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0x80, 0xa7, 0x00, 0x59, 0x3d, 0x3d, 0x3d, 0x42, 0x42, 0x00, 0x42, 0x46, + 0x46, 0x46, 0x49, 0x49, 0x49, 0x4c, 0x00, 0x4c, 0x49, 0x56, 0xb5, 0xf6, + 0xfd, 0xfe, 0xfa, 0x00, 0xf6, 0xf4, 0xf4, 0xf8, 0xfc, 0xfe, 0xfc, 0xf4, + 0x20, 0x92, 0x46, 0x21, 0x42, 0x46, 0x42, 0x41, 0x42, 0x00, 0x41, 0x46, + 0x41, 0x46, 0x46, 0x46, 0x46, 0x49, 0x00, 0x4b, 0x45, 0x30, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x10, 0x11, 0x11, 0x11, 0xe9, 0x11, 0x10, 0x0f, 0x1e, + 0x00, 0x76, 0xbc, 0x61, 0xad, 0xbc, 0x3f, 0x21, 0x21, 0x44, 0x21, 0xe9, + 0x21, 0x27, 0x25, 0xcc, 0x27, 0x27, 0x00, 0x27, 0x2a, 0x2d, 0x2d, 0x33, + 0x37, 0x37, 0x3c, 0x00, 0x3c, 0x3c, 0x44, 0x3c, 0x37, 0x33, 0x2d, 0x2a, + 0x0e, 0x42, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x00, 0x51, 0x45, + 0x36, 0x36, 0x39, 0x3d, 0x3e, 0x3d, 0x00, 0x3d, 0x3d, 0x41, 0x41, 0x46, + 0x49, 0x41, 0x83, 0x00, 0xf4, 0xfe, 0xfa, 0xee, 0xd5, 0xc9, 0xc9, 0xc9, + 0x00, 0xc9, 0xc9, 0xb9, 0xe7, 0xf2, 0xfc, 0xfe, 0xee, 0x70, 0x5f, 0x31, + 0x19, 0xd4, 0x42, 0x42, 0x41, 0x42, 0x01, 0x45, 0x4b, 0x30, 0x18, 0x09, + 0x09, 0x09, 0xe9, 0x80, 0xd1, 0x05, 0x0c, 0x3a, 0x76, 0x87, 0x52, 0x57, + 0x00, 0x52, 0x87, 0x87, 0x6b, 0x22, 0x1a, 0x1c, 0x1c, 0x60, 0x1c, 0xe9, + 0xd4, 0x1c, 0x1d, 0x1f, 0x1f, 0x1f, 0x00, 0x27, 0x2a, 0x2d, 0x2f, 0x33, + 0x33, 0x33, 0x37, 0x00, 0x37, 0x33, 0x27, 0x27, 0x25, 0x00, 0x00, 0x00, + 0xf0, 0xe9, 0xd4, 0xa7, 0x59, 0x51, 0x32, 0x31, 0x31, 0x00, 0x34, 0x35, + 0x35, 0x35, 0x3e, 0x3e, 0x3d, 0x42, 0x00, 0x43, 0xa4, 0xfb, 0xfb, 0xec, + 0xc9, 0xc9, 0xc9, 0x08, 0xd5, 0xd5, 0xd5, 0xd5, 0xc9, 0xc9, 0xc3, 0xee, + 0x03, 0xfe, 0xf9, 0x78, 0x35, 0x3e, 0x39, 0x09, 0xe9, 0x00, 0x35, 0x35, + 0x3b, 0x35, 0x3b, 0x3e, 0x3e, 0x3b, 0x00, 0x45, 0x3f, 0x30, 0x17, 0x0c, + 0x07, 0x04, 0x04, 0x00, 0x04, 0x0c, 0x17, 0x30, 0x6b, 0x6b, 0x54, 0x43, + 0x00, 0x48, 0x48, 0x52, 0x52, 0x61, 0x76, 0x76, 0x51, 0x00, 0x3a, 0x26, + 0x22, 0x26, 0x3a, 0x51, 0x6b, 0x3a, 0x00, 0x15, 0x16, 0x16, 0x16, 0x16, + 0x1a, 0x1a, 0x1a, 0x00, 0x1b, 0x1b, 0x1f, 0x20, 0x23, 0x29, 0x29, 0x29, + 0x00, 0x29, 0x29, 0x23, 0x23, 0x1b, 0x27, 0x00, 0x00, 0x78, 0x00, 0xe9, + 0xd4, 0xa7, 0x5a, 0x3f, 0x27, 0x27, 0x00, 0x27, 0x2e, 0x2e, 0x2e, 0x39, + 0x3e, 0x3e, 0x3e, 0x00, 0xad, 0xfc, 0xf6, 0xcb, 0xd5, 0xd5, 0xd5, 0xd5, + 0x10, 0xda, 0xda, 0xda, 0xca, 0xcb, 0xcb, 0xc3, 0xd5, 0x00, 0xfa, 0xfb, + 0x7b, 0x2e, 0x34, 0x31, 0x34, 0x34, 0x50, 0x34, 0xe9, 0x34, 0xbb, 0x35, + 0x34, 0x35, 0x42, 0x00, 0x45, 0x3f, 0x3a, 0x3a, 0x3a, 0x51, 0x51, 0x51, + 0x00, 0x59, 0x47, 0x3b, 0x40, 0x40, 0x43, 0x43, 0x43, 0x00, 0x48, 0x48, + 0x48, 0x5a, 0x67, 0x67, 0x76, 0x76, 0x00, 0x76, 0x76, 0x67, 0x61, 0x6b, + 0x22, 0x11, 0x11, 0x40, 0x11, 0xe9, 0x14, 0x14, 0x14, 0x1b, 0x1b, 0x1b, + 0x10, 0x20, 0x20, 0x20, 0xe9, 0x1f, 0x1f, 0x00, 0x00, 0x78, 0x00, 0xe9, + 0xd4, 0xa7, 0x5b, 0x28, 0x3a, 0x24, 0x00, 0x24, 0x24, 0x2b, 0x31, 0x32, + 0x39, 0x3e, 0x86, 0x00, 0xfb, 0xf4, 0xc3, 0xcf, 0xd6, 0xda, 0xd6, 0xda, + 0x00, 0xda, 0xda, 0xda, 0xda, 0xd6, 0xd6, 0xcf, 0xcf, 0x00, 0xcf, 0xc3, + 0xc3, 0xc3, 0xfa, 0xfa, 0x56, 0x31, 0x1c, 0x2e, 0x2e, 0x2e, 0xe9, 0xd4, + 0xa5, 0x34, 0x35, 0x10, 0x35, 0x35, 0x34, 0xd3, 0x3b, 0x3b, 0x40, 0x40, + 0x00, 0x43, 0x43, 0x48, 0x48, 0x48, 0x4d, 0x4d, 0x4d, 0x80, 0xe9, 0x48, + 0x55, 0x51, 0x12, 0x0f, 0x0e, 0x0e, 0x00, 0x0e, 0x0e, 0x11, 0x11, 0x11, + 0x13, 0x13, 0x13, 0x00, 0x14, 0x19, 0x19, 0x19, 0x19, 0x14, 0x13, 0x59, + 0x1e, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5c, 0x30, 0x00, 0x2c, 0x1a, + 0x21, 0x2c, 0x32, 0x38, 0x45, 0x4c, 0x00, 0xf8, 0xf8, 0xc0, 0xce, 0xd4, + 0xdb, 0xdb, 0xdd, 0x20, 0xdd, 0xdd, 0xd9, 0xdb, 0xdb, 0xdb, 0xce, 0xc6, + 0x00, 0xc6, 0xc6, 0xc3, 0xcf, 0xfc, 0xf4, 0x2a, 0x31, 0x0e, 0x2a, 0x27, + 0x27, 0x27, 0xe9, 0xd4, 0xa4, 0x2a, 0x00, 0x2a, 0x2a, 0x2a, 0x2d, 0x2d, + 0x2d, 0x2e, 0x2e, 0x00, 0x34, 0x35, 0x35, 0x3b, 0x40, 0x40, 0x40, 0x40, + 0x08, 0x44, 0x48, 0x48, 0x48, 0xe9, 0x44, 0x40, 0x49, 0x00, 0x3a, 0x10, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x04, 0x0b, 0x0b, 0x0f, 0x0f, 0x0f, + 0xe9, 0x0f, 0x0d, 0x07, 0x76, 0xbc, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x80, 0x5d, 0x28, 0x3a, 0x25, 0x2c, 0x3f, 0x45, 0x45, 0x00, 0xe9, 0xfa, + 0xd4, 0xc6, 0xce, 0xd4, 0xdd, 0xdd, 0x02, 0xdd, 0xdd, 0xe3, 0xe3, 0xe3, + 0xe3, 0xc1, 0xd4, 0x00, 0xce, 0xce, 0xc6, 0xc6, 0xc0, 0xe9, 0xfe, 0x9b, + 0x03, 0x31, 0x2b, 0x27, 0x21, 0x21, 0x21, 0xe9, 0xd3, 0x44, 0x24, 0xa4, + 0x27, 0x27, 0x27, 0xe9, 0x27, 0x2a, 0x00, 0x2d, 0x2d, 0x33, 0x33, 0x37, + 0x37, 0x3b, 0x3c, 0x01, 0x3c, 0x3c, 0x3c, 0x44, 0x44, 0x3c, 0x44, 0xc1, + 0x00, 0x40, 0x3a, 0x17, 0x09, 0x05, 0x08, 0x08, 0x05, 0x00, 0x08, 0x09, + 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x01, 0x14, 0x65, 0x9b, 0xbc, 0x00, + 0x00, 0x00, 0xe9, 0xe0, 0xd4, 0xa7, 0x5f, 0x3a, 0x2c, 0x38, 0x59, 0x76, + 0x00, 0xf8, 0xec, 0xc5, 0xc5, 0xcd, 0xcd, 0xd9, 0xd9, 0x00, 0xe1, 0xe1, + 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xd9, 0x00, 0xd9, 0xd9, 0xd3, 0xce, 0xc6, + 0xc6, 0xc0, 0xb8, 0x00, 0xf6, 0xf8, 0x51, 0x31, 0x2b, 0x1f, 0x1d, 0x1d, + 0x07, 0x1d, 0x1c, 0x1c, 0x1c, 0x1c, 0xd9, 0xc1, 0x99, 0x80, 0x81, 0x1d, + 0x1d, 0x21, 0x24, 0x21, 0x23, 0x27, 0x00, 0x2a, 0x2a, 0x2d, 0x2d, 0x33, + 0x37, 0x37, 0x37, 0x18, 0x3c, 0x3c, 0x3c, 0xe9, 0xb9, 0x2f, 0x33, 0x31, + 0x00, 0x1e, 0x0c, 0x06, 0x04, 0x04, 0x04, 0x04, 0x05, 0x00, 0x05, 0x05, + 0x04, 0x11, 0x55, 0x81, 0x7c, 0x77, 0x07, 0xad, 0xad, 0x00, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x80, 0x5c, 0xbc, 0xec, 0xf2, 0xf2, 0xf2, 0xee, 0xec, + 0x00, 0xf8, 0xc5, 0xd3, 0xc5, 0xcd, 0xd3, 0xd9, 0xd9, 0x00, 0xe1, 0xe1, + 0xe6, 0xe6, 0xe6, 0xe1, 0xe4, 0xd9, 0x00, 0xe1, 0xd9, 0xd9, 0xd3, 0xcd, + 0xc5, 0xbf, 0xb8, 0x00, 0xe7, 0xfc, 0xbc, 0x76, 0x3f, 0x22, 0x1a, 0x1a, + 0x68, 0x1a, 0xe9, 0xd2, 0x1c, 0xaf, 0x1a, 0x1b, 0x1d, 0x00, 0x1d, 0x1f, + 0x1f, 0x23, 0x27, 0x27, 0x2a, 0x2a, 0x02, 0x2d, 0x2f, 0x2f, 0x37, 0x37, + 0x37, 0xe9, 0x2f, 0x00, 0x2f, 0x2d, 0x2d, 0x2a, 0x2a, 0x32, 0x65, 0x73, + 0x00, 0x2b, 0x10, 0x0c, 0x0c, 0x0c, 0x16, 0x3e, 0x73, 0x00, 0x94, 0x85, + 0x81, 0x7c, 0x73, 0x87, 0xad, 0x00, 0x3c, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x59, 0xad, 0xf2, 0x00, 0xf4, 0xf4, 0xf4, 0xee, 0xee, 0xf4, 0xf4, 0xf6, + 0x00, 0xe9, 0xd3, 0xca, 0xca, 0xca, 0xd2, 0xd8, 0xd8, 0x00, 0xd8, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xe4, 0xe4, 0x00, 0xdf, 0xe1, 0xd9, 0xcd, 0xc5, + 0xb8, 0xb8, 0xb5, 0x00, 0xb1, 0xf8, 0xf0, 0xbc, 0x76, 0x6b, 0x3a, 0x16, + 0x00, 0x15, 0x15, 0x15, 0x16, 0x15, 0x14, 0x14, 0x18, 0x00, 0x3a, 0x3a, + 0x22, 0x15, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x15, 0x16, 0x1a, 0x1a, + 0x16, 0x1a, 0x1b, 0x00, 0x1b, 0x1b, 0x1f, 0x1f, 0x23, 0x23, 0x29, 0x29, + 0x04, 0x29, 0x29, 0x2f, 0x2f, 0x2f, 0xca, 0x29, 0x20, 0x00, 0x27, 0x2c, + 0xaa, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0x00, 0xaa, 0xaa, 0x9d, 0x9d, 0x89, + 0x81, 0x7c, 0x75, 0x03, 0x72, 0x7b, 0x87, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0x80, 0xa7, 0x00, 0x00, 0xee, 0xf4, 0xec, 0xe7, 0xc0, 0x00, 0xbb, 0xbb, + 0xbb, 0xb8, 0xb5, 0xb1, 0xb8, 0xbf, 0x00, 0xc8, 0xc8, 0xc8, 0xd2, 0xd2, + 0xd2, 0xde, 0xde, 0x00, 0xde, 0xe2, 0xe2, 0xe2, 0xe2, 0xdf, 0xd8, 0xd8, + 0x10, 0xd2, 0xc8, 0xc8, 0x41, 0xb1, 0xec, 0xf6, 0x91, 0x00, 0xad, 0x87, + 0x76, 0x6b, 0x51, 0x3a, 0x30, 0x30, 0x00, 0x30, 0x3a, 0x51, 0x6b, 0x6b, + 0x76, 0x6b, 0x22, 0x18, 0x11, 0x11, 0x11, 0xe9, 0xd1, 0x15, 0x14, 0x15, + 0x00, 0x14, 0x19, 0x19, 0x19, 0x1f, 0x1f, 0x1f, 0x23, 0x00, 0x23, 0x29, + 0x29, 0x29, 0x29, 0x23, 0x23, 0x23, 0x00, 0x20, 0x20, 0x20, 0x24, 0x7a, + 0xbe, 0xaa, 0xaa, 0x40, 0xaa, 0xe9, 0x9d, 0x9d, 0x9d, 0x8a, 0x80, 0x7c, + 0x01, 0x73, 0x6c, 0x6c, 0x87, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa7, + 0xe0, 0xec, 0xe9, 0xbb, 0xbb, 0xbb, 0x00, 0xbb, 0xbb, 0xb5, 0xb5, 0xb5, + 0xae, 0xb4, 0xb4, 0x00, 0xb4, 0xc1, 0xc7, 0xc7, 0xd2, 0xd2, 0xd2, 0xd2, + 0x14, 0xde, 0xde, 0xde, 0xe9, 0xde, 0xa9, 0xc8, 0xc1, 0x00, 0xc1, 0xb4, + 0xb1, 0xab, 0xe0, 0xf8, 0x91, 0x86, 0x02, 0x87, 0x87, 0x87, 0x76, 0x76, + 0x76, 0xe9, 0x76, 0x00, 0x87, 0x76, 0x71, 0x6b, 0x51, 0x11, 0x11, 0x11, + 0xc0, 0xe9, 0xd4, 0x14, 0x14, 0x14, 0x13, 0x19, 0x19, 0x02, 0x1b, 0x1b, + 0x1b, 0x20, 0x20, 0x20, 0xe9, 0x20, 0x01, 0x1b, 0x1b, 0x1f, 0x49, 0xaa, + 0xaa, 0xaa, 0xe9, 0x00, 0xaa, 0xaa, 0x99, 0x99, 0x8a, 0x8a, 0x80, 0x75, + 0x00, 0x73, 0x6c, 0x65, 0x87, 0x76, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, + 0xa5, 0xe0, 0xec, 0xdc, 0xb1, 0xb5, 0x00, 0xb1, 0xb5, 0xb1, 0xb1, 0xb1, + 0xae, 0xae, 0xae, 0x00, 0xb2, 0xb2, 0xb2, 0xc1, 0xcc, 0xcc, 0xcc, 0xcc, + 0x1c, 0xd7, 0xd7, 0xd7, 0xe9, 0xd1, 0x99, 0xc1, 0xc1, 0x00, 0xb4, 0xb4, + 0xab, 0xab, 0xb5, 0xf8, 0xad, 0x87, 0x00, 0x7b, 0x60, 0x5c, 0x5b, 0x5c, + 0x5e, 0x67, 0x5e, 0x00, 0x5e, 0x55, 0x50, 0x53, 0x53, 0x67, 0x51, 0x3a, + 0x0c, 0x0e, 0x0b, 0x0b, 0x0b, 0xe9, 0xd1, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, + 0x0f, 0x13, 0x13, 0x14, 0x13, 0x13, 0x10, 0x19, 0x19, 0x19, 0xe9, 0x19, + 0x14, 0x14, 0x2b, 0x08, 0x99, 0xaa, 0xaa, 0xaa, 0xe9, 0x99, 0x99, 0x99, + 0x00, 0x99, 0x8a, 0x80, 0x7a, 0x73, 0x6c, 0x64, 0x61, 0x07, 0x76, 0x87, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa4, 0x00, 0xad, 0xe9, 0xb5, 0xab, 0xab, + 0xae, 0xae, 0xae, 0x80, 0xe9, 0xa9, 0xa9, 0xa9, 0xa9, 0xb0, 0xb2, 0xbd, + 0x01, 0xc2, 0xc1, 0xc4, 0xc4, 0xcc, 0xcc, 0xcc, 0xe9, 0x80, 0xd2, 0xc4, + 0xc2, 0xc2, 0xb4, 0xb4, 0xb2, 0xab, 0x00, 0xa4, 0xa4, 0xf0, 0xbc, 0xad, + 0xe0, 0xe0, 0xe0, 0x00, 0xad, 0x9b, 0x78, 0x5f, 0x4c, 0x4c, 0x50, 0x4c, + 0x00, 0x50, 0x4c, 0x47, 0x59, 0x3a, 0x30, 0x09, 0x09, 0x60, 0x09, 0xe9, + 0xd1, 0x0b, 0x09, 0x0b, 0x0d, 0x0f, 0x21, 0x0f, 0x0f, 0xe9, 0x0f, 0x13, + 0x13, 0x13, 0xe9, 0x03, 0x14, 0x1f, 0x8a, 0x99, 0x99, 0x99, 0xe9, 0xd2, + 0x00, 0x8a, 0x8a, 0x80, 0x7a, 0x6f, 0x6c, 0x64, 0x5a, 0x07, 0x67, 0x87, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa4, 0x00, 0xe0, 0xae, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa9, 0x00, 0xa9, 0xa9, 0xa9, 0xa9, 0xa7, 0xa7, 0xac, 0xb0, + 0x00, 0xb0, 0xb0, 0xbd, 0xbd, 0xc2, 0xc2, 0xc2, 0xc2, 0x40, 0xc2, 0xcc, + 0xbd, 0xbd, 0xbd, 0xb3, 0xb3, 0xb2, 0x01, 0xa9, 0xa7, 0x9f, 0x9f, 0xf0, + 0xf0, 0xf0, 0xe9, 0x00, 0xf0, 0xf8, 0xf0, 0xec, 0xad, 0x70, 0x4a, 0x49, + 0x00, 0x46, 0x46, 0x42, 0x42, 0x59, 0x3a, 0x1e, 0x0c, 0x00, 0x05, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x05, 0x08, 0x00, 0x09, 0x09, 0x09, 0x09, 0x0b, + 0x0d, 0x0d, 0x0d, 0x04, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0xe1, 0x20, 0x80, + 0x04, 0x8a, 0x8a, 0x99, 0x99, 0x99, 0xe9, 0x99, 0x99, 0x00, 0x8a, 0x8a, + 0x80, 0x80, 0x6f, 0x6f, 0x64, 0x5d, 0x03, 0x5a, 0x67, 0x87, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0x80, 0xa3, 0xdc, 0xad, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, + 0x04, 0x9f, 0xa4, 0xa7, 0xa7, 0xa7, 0xe9, 0xa7, 0xac, 0x02, 0xac, 0xac, + 0xb0, 0xb6, 0xb6, 0xb6, 0xe9, 0xb6, 0x20, 0xb3, 0xb3, 0xbc, 0xaf, 0xaf, + 0xac, 0xa7, 0x9f, 0x00, 0x9f, 0x9a, 0xa9, 0xad, 0xa4, 0x92, 0x8e, 0x92, + 0x00, 0x8e, 0x9a, 0xad, 0xe9, 0xf0, 0xf0, 0xad, 0x56, 0x00, 0x42, 0x3d, + 0x3d, 0x3d, 0x3d, 0x4b, 0x3a, 0x1e, 0x08, 0x10, 0x04, 0x04, 0x04, 0xe9, + 0x05, 0x05, 0x08, 0x41, 0x05, 0xe1, 0x09, 0x0b, 0x09, 0x09, 0x09, 0xda, + 0x00, 0x33, 0x7a, 0x80, 0x80, 0x80, 0x8a, 0x8a, 0x8a, 0x08, 0x99, 0x99, + 0x99, 0x99, 0xc9, 0x80, 0x7a, 0x6f, 0x00, 0x64, 0x64, 0x5a, 0x53, 0x5e, + 0x76, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa3, 0xad, 0x92, 0x92, 0x92, + 0x00, 0x92, 0x92, 0x98, 0x98, 0xa0, 0xa0, 0xa3, 0xa3, 0x40, 0xa3, 0xe9, + 0xa3, 0xa5, 0xa5, 0xa5, 0xaf, 0xaf, 0x42, 0xaf, 0xe9, 0xa8, 0xaf, 0xa8, + 0xac, 0xbc, 0xa8, 0x00, 0xa6, 0xa6, 0xa1, 0x9a, 0x9a, 0x98, 0x98, 0x98, + 0x00, 0x92, 0x98, 0x92, 0x92, 0x92, 0x92, 0x8e, 0x8e, 0x00, 0xe0, 0xec, + 0xe9, 0x6a, 0x36, 0x38, 0x38, 0x36, 0x00, 0x36, 0x3f, 0x3f, 0x17, 0x10, + 0x07, 0x02, 0x04, 0x14, 0x04, 0x04, 0x04, 0xd9, 0x05, 0xe9, 0x05, 0x05, + 0x00, 0x08, 0x05, 0x08, 0x08, 0x0d, 0x48, 0x6c, 0x6f, 0x00, 0x6f, 0x7a, + 0x7a, 0x80, 0x80, 0x8a, 0x8a, 0x8a, 0x80, 0xe9, 0x80, 0x80, 0x7a, 0x6f, + 0x6f, 0x64, 0x5d, 0x03, 0x57, 0x4c, 0x59, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0x80, 0xa3, 0xad, 0x9b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x00, 0x93, 0x97, + 0x97, 0x9e, 0x9c, 0xa3, 0xa0, 0x9c, 0x10, 0xa3, 0xa3, 0xa3, 0xe9, 0xa5, + 0xa8, 0xa6, 0xa5, 0x06, 0xa5, 0xa5, 0xa5, 0xa1, 0xa1, 0xd2, 0xb3, 0xa0, + 0x00, 0x9e, 0x97, 0x98, 0x98, 0x98, 0x97, 0x93, 0x93, 0x80, 0xe9, 0x8e, + 0x8e, 0x8e, 0x8b, 0x8e, 0xe0, 0xe9, 0x00, 0x6a, 0x31, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x38, 0x01, 0x30, 0x17, 0x0c, 0x06, 0x02, 0x02, 0x02, 0xe9, + 0x10, 0x02, 0x04, 0x04, 0xe9, 0x04, 0x05, 0x0b, 0x2a, 0x00, 0x57, 0x5d, + 0x5d, 0x63, 0x63, 0x6f, 0x6f, 0x7a, 0x00, 0x7a, 0x80, 0x80, 0x80, 0x80, + 0x8a, 0x80, 0x80, 0x00, 0x7a, 0x7a, 0x6f, 0x63, 0x5d, 0x57, 0x52, 0x4c, + 0x0e, 0x59, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa3, 0xad, 0x10, 0x84, 0x84, + 0x84, 0xe9, 0x8c, 0x90, 0x94, 0x97, 0x0c, 0x96, 0x9c, 0x9c, 0x9c, 0xe9, + 0xca, 0x9e, 0x9e, 0x68, 0x9e, 0xe9, 0xd4, 0xa0, 0x9a, 0x96, 0x96, 0x96, + 0x00, 0x96, 0x97, 0x96, 0x96, 0x93, 0x96, 0x93, 0x93, 0x00, 0x93, 0x90, + 0x93, 0x8b, 0x8b, 0x84, 0x83, 0xbc, 0x02, 0xe0, 0x58, 0x31, 0x2c, 0x2c, + 0x2c, 0xe9, 0x3a, 0x00, 0x22, 0x17, 0x0a, 0x06, 0x06, 0x02, 0x02, 0x02, + 0x00, 0x03, 0x02, 0x02, 0x06, 0x06, 0x07, 0x10, 0x2c, 0x00, 0x43, 0x49, + 0x4a, 0x52, 0x57, 0x5d, 0x5d, 0x63, 0x00, 0x63, 0x6f, 0x6f, 0x7a, 0x7a, + 0x80, 0x80, 0x80, 0x00, 0x7a, 0x7a, 0x6f, 0x6f, 0x63, 0x5d, 0x5d, 0x52, + 0x03, 0x4c, 0x49, 0x59, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x80, 0xa3, 0x9b, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x01, 0x84, 0x8c, 0x8d, 0x90, 0x94, + 0x94, 0x94, 0xe9, 0x00, 0x90, 0x8d, 0x8d, 0x8c, 0x91, 0x8c, 0x94, 0x95, + 0x00, 0x93, 0x94, 0x93, 0x90, 0x93, 0x90, 0x95, 0x95, 0x01, 0x95, 0x96, + 0x96, 0x96, 0x96, 0x95, 0x95, 0x1c, 0x80, 0xd2, 0x90, 0x90, 0x8c, 0x8c, + 0x84, 0x83, 0x7e, 0x01, 0x7e, 0xbc, 0xbc, 0x32, 0x26, 0x26, 0x26, 0xe9, + 0x00, 0x26, 0x26, 0x2c, 0x2c, 0x26, 0x1c, 0x1e, 0x18, 0x00, 0x1e, 0x18, + 0x1e, 0x1e, 0x24, 0x2c, 0x39, 0x39, 0x00, 0x3b, 0x3b, 0x3e, 0x43, 0x48, + 0x48, 0x52, 0x57, 0x00, 0x5d, 0x5d, 0x63, 0x6f, 0x6f, 0x6f, 0x6f, 0x7a, + 0x40, 0x7a, 0xd1, 0x63, 0x5d, 0x5d, 0x52, 0x52, 0x48, 0x07, 0x4b, 0x54, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa2, 0x00, 0x6b, 0x86, 0x74, 0x7b, 0x7b, + 0x7b, 0x7b, 0x7b, 0x00, 0x7f, 0x85, 0x85, 0x85, 0x8d, 0x8d, 0x89, 0x8d, + 0x40, 0x89, 0xc1, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x88, 0x00, 0x84, 0x84, + 0x83, 0x84, 0x84, 0x88, 0x89, 0x8d, 0x00, 0x8d, 0x8f, 0x90, 0x8f, 0x8d, + 0x90, 0x8d, 0x8d, 0x0c, 0x8d, 0x8d, 0x90, 0x90, 0xe9, 0xaa, 0x8c, 0x8c, + 0x00, 0x84, 0x84, 0x7e, 0x78, 0x78, 0xbc, 0x87, 0x21, 0x18, 0x22, 0x22, + 0x22, 0xe9, 0xd3, 0x26, 0x22, 0x26, 0x00, 0x26, 0x26, 0x26, 0x2b, 0x26, + 0x2b, 0x2b, 0x2e, 0x00, 0x2e, 0x34, 0x35, 0x3e, 0x43, 0x43, 0x48, 0x52, + 0x01, 0x57, 0x5d, 0x5d, 0x63, 0x6f, 0x6f, 0x6f, 0xe9, 0x00, 0x63, 0x5d, + 0x5d, 0x57, 0x52, 0x48, 0x43, 0x4b, 0x0e, 0x3f, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa2, 0x76, 0x00, 0x7b, 0x70, 0x70, 0x70, 0x71, 0x74, 0x7b, 0x7b, + 0x00, 0x7d, 0x7d, 0x81, 0x85, 0x81, 0x81, 0x81, 0x7d, 0x08, 0x7d, 0x7b, + 0x7b, 0x7b, 0xe9, 0x7b, 0x77, 0x78, 0x00, 0x78, 0x78, 0x7e, 0x7e, 0x7d, + 0x7e, 0x82, 0x82, 0x00, 0x82, 0x82, 0x85, 0x82, 0x85, 0x85, 0x85, 0x89, + 0x20, 0x89, 0x89, 0xe9, 0x89, 0x8f, 0x89, 0x8f, 0x8d, 0x00, 0x8d, 0x85, + 0x7f, 0x7f, 0x7e, 0x78, 0x74, 0x86, 0x03, 0xbc, 0x32, 0x1d, 0x1c, 0x1c, + 0x1c, 0xe9, 0xd4, 0x80, 0xa3, 0x22, 0x22, 0x21, 0x25, 0x25, 0x21, 0x2a, + 0x00, 0x2d, 0x35, 0x40, 0x40, 0x44, 0x48, 0x4d, 0x5d, 0x08, 0x5d, 0x63, + 0x63, 0x63, 0xe9, 0x5d, 0x5d, 0x4d, 0x00, 0x4d, 0x44, 0x40, 0x3b, 0x4b, + 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa3, 0x76, 0x71, 0x68, 0x68, 0x6a, + 0x01, 0x6a, 0x71, 0x71, 0x74, 0x77, 0x77, 0x77, 0xe9, 0x00, 0x77, 0x74, + 0x74, 0x71, 0x71, 0x6d, 0x6d, 0x6d, 0x00, 0x6a, 0x6a, 0x6a, 0x6d, 0x70, + 0x70, 0x72, 0x74, 0x00, 0x74, 0x74, 0x75, 0x79, 0x79, 0x79, 0x7d, 0x7d, + 0x00, 0x7d, 0x81, 0x7d, 0x81, 0x81, 0x81, 0x82, 0x85, 0x00, 0x85, 0x85, + 0x85, 0x89, 0x89, 0x89, 0x81, 0x7d, 0x00, 0x77, 0x77, 0x79, 0x79, 0x70, + 0x69, 0xad, 0x67, 0x00, 0x1a, 0x1a, 0x1a, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x1a, 0x1a, 0x18, 0x1e, 0xd2, 0x89, 0x1c, 0xe9, 0x1c, 0x00, 0x1d, 0x27, + 0x2a, 0x2d, 0x33, 0x37, 0x3c, 0x44, 0x02, 0x44, 0x4d, 0x4d, 0x5d, 0x5d, + 0x5d, 0xe9, 0x4d, 0x00, 0x4d, 0x4d, 0x44, 0x3c, 0x37, 0x3e, 0x45, 0x00, + 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa3, 0x51, 0x67, 0x60, 0x00, 0x67, 0x62, + 0x67, 0x68, 0x68, 0x6d, 0x6d, 0x71, 0x00, 0x72, 0x71, 0x71, 0x6d, 0x6d, + 0x68, 0x68, 0x68, 0x02, 0x67, 0x67, 0x67, 0x60, 0x60, 0x60, 0xe9, 0x66, + 0x00, 0x6a, 0x69, 0x69, 0x6d, 0x6e, 0x6e, 0x6e, 0x72, 0x00, 0x72, 0x72, + 0x75, 0x75, 0x75, 0x75, 0x7c, 0x7c, 0x00, 0x7c, 0x81, 0x81, 0x81, 0x85, + 0x85, 0x85, 0x81, 0x00, 0x7c, 0x77, 0x75, 0x72, 0x71, 0x72, 0x72, 0x6a, + 0x00, 0x87, 0x87, 0x16, 0x15, 0x18, 0x12, 0x12, 0x12, 0x82, 0xe9, 0x18, + 0x12, 0x18, 0x12, 0x15, 0xaa, 0x15, 0x00, 0x15, 0x15, 0x16, 0x1a, 0x1a, + 0x1d, 0x1d, 0x23, 0x00, 0x2a, 0x33, 0x37, 0x3c, 0x3c, 0x44, 0x4d, 0x4d, + 0x40, 0x4d, 0xe9, 0x4d, 0x4d, 0x44, 0x44, 0x3c, 0x37, 0x07, 0x37, 0x39, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa5, 0x00, 0x67, 0x5e, 0x5e, 0x5e, 0x60, + 0x61, 0x65, 0x65, 0x42, 0x65, 0xe9, 0x65, 0x65, 0x61, 0x60, 0x89, 0x5c, + 0x02, 0x5e, 0x5e, 0x58, 0x58, 0x58, 0x58, 0x39, 0x5f, 0x00, 0x62, 0x62, + 0x62, 0x66, 0x66, 0x66, 0x66, 0x6c, 0x00, 0x6c, 0x6c, 0x6e, 0x6e, 0x73, + 0x73, 0x75, 0x75, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x75, 0x75, 0x75, 0x73, + 0x00, 0x6e, 0x6e, 0x6c, 0x65, 0x65, 0x62, 0x68, 0x87, 0x00, 0x3a, 0x12, + 0x11, 0x11, 0x10, 0x12, 0x10, 0x10, 0x00, 0x10, 0x10, 0x30, 0x30, 0x1e, + 0x10, 0x12, 0x12, 0x80, 0xe9, 0x12, 0x12, 0x15, 0x12, 0x16, 0x16, 0x1a, + 0x00, 0x1f, 0x20, 0x23, 0x2d, 0x2f, 0x37, 0x3c, 0x3c, 0x10, 0x44, 0x44, + 0x44, 0xe9, 0x44, 0x3c, 0x37, 0x37, 0x03, 0x2f, 0x33, 0x32, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0x80, 0xa5, 0x67, 0x54, 0x54, 0x54, 0x54, 0x58, 0x5c, + 0x22, 0x5c, 0x5c, 0xe9, 0x5c, 0x5c, 0x58, 0x91, 0x4e, 0x31, 0x4e, 0x4e, + 0xe9, 0xd3, 0x54, 0x54, 0x56, 0x31, 0x00, 0x5f, 0x5f, 0x5f, 0x62, 0x62, + 0x62, 0x62, 0x66, 0x06, 0x6c, 0x6c, 0x6e, 0x6e, 0x6e, 0xe9, 0xd1, 0x6c, + 0x00, 0x6c, 0x65, 0x61, 0x5c, 0x5c, 0x58, 0x87, 0x6b, 0x00, 0x6b, 0x51, + 0x3a, 0x30, 0x1e, 0x30, 0x3a, 0x51, 0x00, 0x6b, 0x00, 0x00, 0x6b, 0x1e, + 0x0e, 0x10, 0x10, 0x20, 0x0e, 0x10, 0xd9, 0x11, 0x11, 0x11, 0x11, 0x14, + 0x00, 0x1b, 0x1f, 0x20, 0x2f, 0x2f, 0x2f, 0x37, 0x37, 0x00, 0x3c, 0x3c, + 0x3c, 0x3c, 0x3c, 0x37, 0x37, 0x2f, 0x03, 0x2f, 0x2d, 0x2d, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0x80, 0xa6, 0x59, 0x4b, 0x4b, 0x4e, 0x4f, 0x4e, 0x4e, + 0x00, 0x55, 0x54, 0x54, 0x54, 0x55, 0x4e, 0x4e, 0x4e, 0x06, 0x4e, 0x4b, + 0x47, 0x47, 0x47, 0xe9, 0xd4, 0x47, 0x40, 0x47, 0x11, 0x4e, 0x50, 0x55, + 0x55, 0x56, 0x5b, 0x00, 0x5b, 0x5b, 0x5a, 0x61, 0x61, 0x61, 0x61, 0x61, + 0x00, 0x64, 0x64, 0x6c, 0x64, 0x6c, 0x64, 0x64, 0x61, 0x00, 0x61, 0x5b, + 0x55, 0x55, 0x4e, 0x76, 0x00, 0x00, 0x60, 0x00, 0xe9, 0xd4, 0x00, 0x51, + 0x10, 0x0c, 0x0c, 0x40, 0x0c, 0xe9, 0x0c, 0x0c, 0x0e, 0x0e, 0x11, 0x11, + 0x00, 0x15, 0x19, 0x1b, 0x20, 0x29, 0x2f, 0x2f, 0x2f, 0x10, 0x2f, 0x2f, + 0x37, 0xd2, 0x29, 0x23, 0x23, 0x00, 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x00, 0x4b, 0x42, 0x02, 0x45, 0x45, 0x47, 0x4b, 0x4b, 0x4b, 0xe9, 0x47, + 0x00, 0x45, 0x45, 0x42, 0x42, 0x3d, 0x3d, 0x3d, 0x3d, 0x04, 0x3d, 0x3f, + 0x42, 0x42, 0x42, 0xe9, 0x42, 0x45, 0xa0, 0x19, 0x45, 0xe9, 0x45, 0x4b, + 0x4b, 0x4f, 0x4e, 0x00, 0x4c, 0x4e, 0x53, 0x55, 0x5a, 0x5a, 0x61, 0x61, + 0x00, 0x61, 0x64, 0x61, 0x61, 0x5a, 0x5a, 0x55, 0x4e, 0x03, 0x4b, 0x47, + 0x59, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x02, 0x00, 0x00, 0x30, 0x07, 0x07, + 0x07, 0xe9, 0x09, 0x80, 0xe9, 0x09, 0x0b, 0x0f, 0x0f, 0x13, 0x19, 0x19, + 0x04, 0x20, 0x20, 0x29, 0x29, 0x29, 0xe9, 0x29, 0x20, 0x07, 0x20, 0x1b, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x00, 0x00, 0x59, 0x36, 0x38, + 0x3d, 0x3d, 0x3d, 0xc1, 0xe9, 0xd1, 0x38, 0x36, 0x36, 0x32, 0x32, 0xe9, + 0x80, 0xd9, 0x36, 0x36, 0x38, 0x36, 0x38, 0x38, 0x38, 0x88, 0xe9, 0x38, + 0x3d, 0x3f, 0x01, 0x42, 0x42, 0x45, 0x00, 0x49, 0x49, 0x49, 0x4c, 0x4c, + 0x53, 0x57, 0x57, 0x00, 0x5a, 0x5a, 0x5a, 0x57, 0x57, 0x53, 0x4c, 0x49, + 0x03, 0x49, 0x42, 0x59, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x84, 0xa1, 0x30, + 0x07, 0x07, 0x07, 0xe9, 0x07, 0x07, 0x00, 0x09, 0x09, 0x09, 0x09, 0x0e, + 0x0f, 0x0f, 0x13, 0x00, 0x13, 0x19, 0x19, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0f, 0x19, 0x19, 0x19, 0x0a, 0x01, 0xe9, 0xd4, 0xa7, 0x80, 0x59, 0x3f, + 0x2c, 0x2c, 0x31, 0x35, 0x35, 0x32, 0x00, 0x32, 0x32, 0x32, 0x32, 0x2b, + 0x2c, 0x2b, 0x26, 0x2e, 0x26, 0x22, 0xe9, 0x2c, 0x8b, 0x63, 0xb4, 0x36, + 0x00, 0x36, 0x36, 0x39, 0x39, 0x3d, 0x3d, 0x41, 0x43, 0x04, 0x48, 0x4a, + 0x52, 0x52, 0x52, 0xe9, 0x4c, 0x48, 0x01, 0x43, 0x42, 0x39, 0x59, 0x00, + 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa2, 0x1e, 0x07, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x02, 0x04, 0x04, 0x07, 0x05, 0x05, 0x09, 0x09, 0x02, 0x0d, 0x0f, + 0x0f, 0x13, 0x13, 0x13, 0xe9, 0x13, 0x3c, 0x0f, 0x13, 0x04, 0xd4, 0xa7, + 0x5b, 0x28, 0x22, 0x00, 0x1d, 0x22, 0x22, 0x25, 0x25, 0x25, 0x21, 0x24, + 0x00, 0x22, 0x22, 0x1c, 0x1c, 0x1a, 0x1a, 0x18, 0x18, 0x01, 0x18, 0x18, + 0x1a, 0x22, 0x26, 0x26, 0x26, 0xe9, 0x88, 0xd3, 0x2c, 0x2c, 0x2c, 0xe9, + 0x2c, 0x2c, 0x32, 0x00, 0x32, 0x35, 0x39, 0x3e, 0x3e, 0x43, 0x48, 0x48, + 0x00, 0x4a, 0x4a, 0x48, 0x48, 0x43, 0x43, 0x3d, 0x39, 0x07, 0x35, 0x59, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa3, 0x00, 0x1e, 0x0a, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x02, 0x00, 0x02, 0x02, 0x02, 0x04, 0x04, 0x05, 0x09, 0x09, + 0x07, 0x09, 0x0d, 0x0d, 0x0f, 0x0d, 0xe1, 0x06, 0xc6, 0xc0, 0x87, 0x39, + 0x30, 0x18, 0x16, 0x16, 0x16, 0x18, 0x00, 0x16, 0x18, 0x15, 0x15, 0x12, + 0x12, 0x12, 0x10, 0x00, 0x12, 0x12, 0x11, 0x10, 0x0e, 0x30, 0x87, 0x6b, + 0x0e, 0x1c, 0x22, 0x22, 0x22, 0xe9, 0xd4, 0xa2, 0x25, 0x00, 0x26, 0x26, + 0x2b, 0x2e, 0x2e, 0x35, 0x35, 0x3b, 0x00, 0x40, 0x40, 0x43, 0x40, 0x40, + 0x3b, 0x3b, 0x35, 0x07, 0x2e, 0x32, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa5, + 0x00, 0x01, 0x10, 0x03, 0x01, 0x03, 0x01, 0x03, 0x03, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x04, 0x05, 0x05, 0x03, 0x08, 0x08, 0x08, 0x09, 0x0d, + 0x01, 0x07, 0xbf, 0xc0, 0x77, 0x29, 0x28, 0x10, 0x0e, 0x10, 0x10, 0x10, + 0x40, 0x0c, 0xe9, 0x0c, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x00, 0x07, 0x3a, + 0xbc, 0x00, 0x6b, 0x6b, 0x15, 0x1a, 0x21, 0x1a, 0x1a, 0xe9, 0x1a, 0x18, + 0x1e, 0x18, 0xd9, 0x00, 0x1a, 0x1a, 0x1c, 0x1a, 0x1c, 0x22, 0x24, 0x27, + 0x00, 0x2a, 0x2d, 0x33, 0x33, 0x3b, 0x3b, 0x3b, 0x37, 0x00, 0x33, 0x2d, + 0x2a, 0x27, 0x32, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa7, 0x01, 0x0c, + 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x02, 0x02, 0x02, 0xe9, + 0x1e, 0x04, 0x0b, 0x01, 0x07, 0xbf, 0x77, 0x2d, 0x17, 0x01, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x06, 0xe9, 0x08, 0x06, 0x06, 0x0a, 0x51, 0x03, + 0x6b, 0x1e, 0x12, 0x24, 0x12, 0x12, 0xe9, 0x18, 0x17, 0xcc, 0x12, 0x18, + 0x00, 0x18, 0x16, 0x1a, 0x1b, 0x24, 0x27, 0x27, 0x2d, 0x00, 0x2d, 0x33, + 0x2f, 0x2d, 0x2a, 0x23, 0x24, 0x1c, 0x0f, 0x30, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x59, 0x00, 0x01, 0x0a, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x0f, 0x02, 0x02, 0x09, 0x06, 0x07, 0x07, 0x77, 0x2f, 0x00, 0x00, 0x00, + 0x0a, 0x10, 0x03, 0x01, 0x01, 0x01, 0x84, 0xe9, 0x01, 0x06, 0x30, 0x28, + 0x05, 0x6b, 0x51, 0x00, 0x1e, 0x10, 0x0e, 0x0e, 0x0e, 0x10, 0x1e, 0x3a, + 0x08, 0x17, 0x10, 0x10, 0x10, 0xe9, 0x10, 0x11, 0x11, 0x00, 0x16, 0x16, + 0x1b, 0x1b, 0x1f, 0x23, 0x23, 0x23, 0x00, 0x20, 0x1f, 0x1b, 0x16, 0x22, + 0x00, 0x00, 0x00, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0xc0, 0x07, 0x01, 0x01, 0x17, 0x18, 0x16, 0x17, 0x17, 0x61, 0x28, 0x07, + 0x02, 0x28, 0x28, 0x28, 0x28, 0x71, 0x08, 0x51, 0x0c, 0x0c, 0x0c, 0xe9, + 0x0c, 0x0c, 0x0e, 0x00, 0x10, 0x10, 0x11, 0x14, 0x14, 0x19, 0x19, 0x19, + 0x0f, 0x19, 0x14, 0x14, 0x11, 0x01, 0xe9, 0xd4, 0xa7, 0xff, 0x5f, 0x17, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc2, 0x07, 0x03, 0x3a, 0x07, 0x07, + 0x07, 0xe9, 0x07, 0x00, 0x0a, 0x0c, 0x0c, 0x0c, 0x0e, 0x11, 0x11, 0x11, + 0x98, 0xe9, 0x10, 0x0a, 0x07, 0xbf, 0x00, 0xd0, 0xd0, 0xff, 0x5f, 0x17, + 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0xc2, 0x07, 0x04, 0x1e, 0x06, 0x06, + 0x06, 0xe9, 0x06, 0x01, 0x07, 0x07, 0x07, 0x09, 0x0c, 0x0c, 0x0c, 0xe9, + 0x61, 0x06, 0x07, 0xbf, 0x00, 0x00, 0xd0, 0xd0, 0x57, 0xff, 0x0f, 0x77, + 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x84, 0x05, 0x17, 0x03, 0x03, 0x03, + 0xe9, 0x03, 0x03, 0x01, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x08, 0x07, + 0xc3, 0xbf, 0x71, 0xd0, 0xea, 0xea, 0xe5, 0x3f, 0x07, 0xfc, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x60, 0xba, 0x07, 0x03, 0x0c, 0x03, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x05, 0x01, + 0xe0, 0x2f, 0x07, 0x72, 0xed, 0xed, 0xed, 0xed, 0xd0, 0xff, 0x2f, 0x07, + 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x18, 0x00, 0xd0, 0xd0, 0x07, 0x05, + 0x03, 0x03, 0x01, 0x0e, 0x01, 0x03, 0x02, 0x01, 0x4f, 0x07, 0x04, 0xef, + 0x07, 0xef, 0xef, 0xef, 0xef, 0xf3, 0x17, 0x07, 0x77, 0xf8, 0x2f, 0x07, + 0x07, 0x07, 0x07, 0xeb, 0xea, 0xea, 0xf8, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0x00, 0xd0, 0xf3, 0x2f, 0xf3, 0xf3, 0xe9, 0xf2, 0x07, 0x07, 0x77, 0x2f, + 0xf0, 0x07, 0x07, 0x07, 0x05, 0xea, 0xed, 0xed, 0xed, 0x7c, 0xed, 0x07, + 0x07, 0x77, 0x2f, 0x07, 0xf7, 0xf3, 0x27, 0xf3, 0xf3, 0xe9, 0xf7, 0xd0, + 0x07, 0x07, 0x77, 0xf8, 0x2f, 0x07, 0x07, 0x07, 0x04, 0xef, 0xef, 0xef, + 0x1f, 0xef, 0xef, 0xd0, 0x07, 0x07, 0x77, 0x2f, 0x05, 0x08, 0xf7, 0xf3, + 0xf3, 0xf3, 0xe9, 0xf3, 0xf3, 0xf9, 0xff, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0x07, 0x07, 0x03, 0x0f, 0xf7, 0xf3, 0xf3, 0xf3, 0xe9, 0x07, 0x07, 0x77, + 0xc1, 0x2f, 0x04, 0xd0, 0xf3, 0xef, 0xef, 0xef, 0xe9, 0x0f, 0xef, 0xef, + 0xf3, 0xd0, 0x07, 0x07, 0x77, 0x2f, 0xf0, 0x07, 0x07, 0x07, 0x01, 0xf4, + 0xf3, 0xf3, 0xf3, 0x9f, 0xe9, 0xf3, 0xf7, 0x07, 0x07, 0x77, 0x2f, 0x03, + 0x02, 0xf6, 0xeb, 0xeb, 0xed, 0xed, 0xed, 0xe9, 0xed, 0x3f, 0xed, 0xf9, + 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0xc2, 0x07, 0x01, 0xf7, 0xf3, 0xf3, + 0xf3, 0xe9, 0xf3, 0x3e, 0xf7, 0xd0, 0x07, 0x07, 0x77, 0x2f, 0x02, 0xf5, + 0x1b, 0xe8, 0xe8, 0xe8, 0xe9, 0xd2, 0xf1, 0x07, 0x07, 0xf8, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0x00, 0x00, 0xf7, 0x1b, 0xef, 0xef, 0xef, 0xe9, 0xd1, + 0xf9, 0x07, 0x07, 0xe1, 0x77, 0x2f, 0x02, 0xed, 0xba, 0xba, 0xba, 0xe9, + 0x07, 0xba, 0xe8, 0xe8, 0xba, 0xeb, 0x07, 0x07, 0x77, 0xf0, 0x2f, 0x07, + 0x07, 0x07, 0x00, 0x00, 0xef, 0xeb, 0x10, 0xed, 0xed, 0xed, 0xe9, 0xed, + 0xed, 0xef, 0xd0, 0xf8, 0x07, 0x07, 0x77, 0x2f, 0x01, 0xeb, 0xa2, 0xa2, + 0x00, 0xa2, 0xa2, 0xa2, 0xd0, 0xfa, 0xfd, 0xff, 0xf9, 0x7f, 0xe8, 0x07, + 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x06, 0x00, 0xa2, 0xe8, 0xe8, 0xe8, + 0xe9, 0xd3, 0xf6, 0xec, 0x07, 0x07, 0x73, 0xba, 0x47, 0x04, 0xf1, 0xa2, + 0x00, 0xa2, 0xa2, 0xa2, 0xba, 0xf9, 0xfb, 0xfd, 0xff, 0x3f, 0xff, 0xf5, + 0x2f, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x82, 0x07, 0x00, 0xa2, 0xba, 0xba, + 0xba, 0xe9, 0xba, 0x07, 0xd0, 0xeb, 0xd0, 0xba, 0xf7, 0x07, 0x07, 0x72, + 0x18, 0xd0, 0xd0, 0xd0, 0x7f, 0x7c, 0xba, 0xba, 0xba, 0x01, 0xd0, 0xf5, + 0xf9, 0xfb, 0xfd, 0xff, 0xff, 0x37, 0xfc, 0x07, 0x7f, 0x37, 0x07, 0x07, + 0x07, 0x00, 0x00, 0x10, 0xa2, 0xa2, 0xa2, 0xe9, 0xa2, 0xef, 0xfd, 0xfe, + 0x1c, 0xff, 0xd0, 0xf2, 0x07, 0x07, 0x72, 0xeb, 0xea, 0x30, 0xea, 0xd0, + 0x37, 0x03, 0xf5, 0xba, 0xe8, 0xed, 0x03, 0xf5, 0xf9, 0xfb, 0xfe, 0xff, + 0xf9, 0x47, 0x07, 0xfc, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x01, 0xd0, 0xa2, + 0x00, 0xa2, 0xa2, 0xa2, 0xed, 0xf9, 0xfb, 0xfe, 0xff, 0x38, 0xfb, 0xd0, + 0x07, 0x07, 0x71, 0xea, 0xed, 0xed, 0x30, 0xed, 0xed, 0x37, 0x03, 0xd0, + 0xf1, 0xe8, 0xeb, 0x03, 0xf5, 0xf9, 0xfd, 0xff, 0xf9, 0xd0, 0x47, 0x07, + 0xfc, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x01, 0xf1, 0xba, 0x00, 0xba, 0xba, + 0xeb, 0xf7, 0xf9, 0xfd, 0xff, 0xff, 0x70, 0xfb, 0x07, 0x07, 0x01, 0xd0, + 0xef, 0xef, 0xef, 0x18, 0xef, 0xef, 0xd0, 0x27, 0x04, 0xec, 0xf1, 0xf5, + 0x1f, 0xf7, 0xf7, 0xee, 0x5f, 0x17, 0x77, 0x2f, 0x07, 0xe0, 0x07, 0x07, + 0x03, 0xa2, 0xd1, 0xd1, 0xeb, 0xf1, 0x03, 0xf7, 0xfa, 0xfd, 0xff, 0xff, + 0xe0, 0x07, 0x07, 0x87, 0x01, 0xf7, 0xf3, 0xf3, 0xf3, 0xe9, 0x27, 0x06, + 0x1f, 0xd0, 0xd0, 0xd0, 0x67, 0x1f, 0x77, 0x2f, 0x07, 0xe0, 0x07, 0x07, + 0x05, 0xf2, 0xeb, 0xe8, 0xf1, 0xf7, 0x0e, 0xfb, 0xfe, 0xfd, 0xf5, 0x07, + 0x07, 0x01, 0xf4, 0x13, 0xf3, 0xf3, 0xf3, 0xe9, 0xf3, 0xf7, 0x17, 0x07, + 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x01, 0xa2, 0xf5, + 0xf1, 0xf5, 0xf7, 0xf7, 0xa2, 0x07, 0xc1, 0x07, 0x01, 0xd0, 0xf7, 0xf3, + 0xf3, 0xf3, 0xe9, 0x1f, 0xf3, 0xf7, 0xd0, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0xa2, 0xa2, 0xe1, 0x07, 0x07, + 0x04, 0xf7, 0xef, 0xef, 0xef, 0xe9, 0xbf, 0xd1, 0xf9, 0x07, 0x07, 0x77, + 0x2f, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0xd0, + 0x04, 0xef, 0xeb, 0xed, 0xed, 0xed, 0xe9, 0xed, 0xed, 0x3f, 0xef, 0xd0, + 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x05, 0xd0, 0x1b, 0xe8, 0xe8, 0xe8, 0xe9, 0xd3, 0xf6, 0x07, 0x07, + 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe1, 0x07, 0x07, + 0x05, 0xd0, 0xba, 0xba, 0xba, 0xe9, 0x03, 0xba, 0xd0, 0xeb, 0xd0, 0xba, + 0xf7, 0x07, 0x07, 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xe1, 0x07, 0x07, 0x05, 0xd0, 0xa2, 0xa2, 0xa2, 0xe9, 0x03, 0xef, 0xfd, + 0xfe, 0xff, 0xd0, 0xf2, 0x07, 0x07, 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, 0x05, 0xd0, 0xd0, 0xa2, 0xa2, 0xa2, + 0x00, 0xa2, 0xed, 0xf9, 0xfb, 0xfe, 0xff, 0xfb, 0xd0, 0xff, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x06, + 0xf1, 0xba, 0xba, 0x00, 0xba, 0xeb, 0xf7, 0xf9, 0xfd, 0xff, 0xff, 0xfb, + 0xff, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xd0, 0xd1, 0xd1, 0x00, 0xeb, 0xf1, 0xf7, 0xfa, 0xfd, + 0xff, 0xff, 0xe0, 0xff, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, + 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0xf2, 0xeb, 0x01, 0xe8, 0xf1, + 0xf7, 0xfb, 0xfe, 0xfd, 0xf5, 0x07, 0xff, 0x07, 0x77, 0x2f, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x01, 0xd0, 0xf5, 0xf1, + 0x0f, 0xf5, 0xf7, 0xf7, 0xd0, 0x07, 0x07, 0x77, 0x2f, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x80, 0x05, +}; + +//***************************************************************************** +// +// Thunderstorm Image +// +//***************************************************************************** +const uint8_t g_pui8ThuderStormImage[] = +{ + IMAGE_FMT_8BPP_COMP, + 128, 0, + 128, 0, + + 254, + 0x00, 0x00, 0x00, + 0x7b, 0x3c, 0x00, + 0x6d, 0x3e, 0x0c, + 0x76, 0x42, 0x0c, + 0x7e, 0x45, 0x0a, + 0x86, 0x47, 0x07, + 0x86, 0x4a, 0x0b, + 0x7e, 0x49, 0x11, + 0x8a, 0x4b, 0x09, + 0x86, 0x4b, 0x0d, + 0x8b, 0x4c, 0x0b, + 0x8b, 0x4d, 0x0b, + 0x8d, 0x4e, 0x0b, + 0x8b, 0x4d, 0x0e, + 0x8f, 0x4e, 0x0c, + 0x85, 0x4d, 0x13, + 0x8d, 0x4f, 0x0e, + 0x8f, 0x50, 0x0c, + 0x8b, 0x4f, 0x10, + 0x91, 0x51, 0x0d, + 0x90, 0x51, 0x0f, + 0x93, 0x52, 0x0d, + 0x91, 0x51, 0x10, + 0x92, 0x52, 0x0f, + 0x90, 0x52, 0x13, + 0x93, 0x54, 0x0e, + 0x8c, 0x52, 0x15, + 0x95, 0x54, 0x0e, + 0x92, 0x54, 0x11, + 0x95, 0x55, 0x11, + 0x94, 0x55, 0x12, + 0x98, 0x56, 0x0f, + 0x93, 0x54, 0x15, + 0x96, 0x55, 0x13, + 0x97, 0x56, 0x11, + 0x98, 0x56, 0x13, + 0x98, 0x57, 0x13, + 0x94, 0x57, 0x16, + 0x9a, 0x59, 0x10, + 0x98, 0x57, 0x15, + 0x9a, 0x58, 0x13, + 0x9c, 0x5a, 0x11, + 0x98, 0x58, 0x17, + 0x8a, 0x57, 0x1f, + 0x9c, 0x59, 0x15, + 0x9c, 0x59, 0x17, + 0x9d, 0x5b, 0x13, + 0x9d, 0x5b, 0x15, + 0x99, 0x5b, 0x18, + 0xa0, 0x5d, 0x12, + 0x9e, 0x5b, 0x17, + 0x9c, 0x5c, 0x17, + 0x9f, 0x5c, 0x16, + 0x9f, 0x5c, 0x18, + 0x82, 0x59, 0x29, + 0xa1, 0x5e, 0x14, + 0xa1, 0x5e, 0x17, + 0xa1, 0x5d, 0x19, + 0x98, 0x5d, 0x1e, + 0xa4, 0x60, 0x14, + 0xa1, 0x5f, 0x19, + 0x9f, 0x5e, 0x1c, + 0xa4, 0x60, 0x17, + 0xa4, 0x5f, 0x19, + 0xa4, 0x5f, 0x1b, + 0xa6, 0x63, 0x15, + 0xa4, 0x61, 0x1a, + 0xa4, 0x60, 0x1d, + 0x9f, 0x62, 0x1f, + 0xa7, 0x64, 0x19, + 0xa5, 0x63, 0x1c, + 0xa8, 0x62, 0x1d, + 0xa8, 0x64, 0x1c, + 0xaa, 0x66, 0x18, + 0xa8, 0x64, 0x1e, + 0xaa, 0x64, 0x1e, + 0xa5, 0x64, 0x20, + 0xaa, 0x65, 0x1d, + 0xaa, 0x67, 0x1c, + 0xaa, 0x65, 0x20, + 0xac, 0x66, 0x1f, + 0xac, 0x68, 0x1e, + 0xae, 0x68, 0x1e, + 0xb0, 0x6b, 0x18, + 0xaa, 0x68, 0x21, + 0xad, 0x67, 0x22, + 0xa1, 0x67, 0x29, + 0xb0, 0x69, 0x21, + 0xae, 0x69, 0x22, + 0xb0, 0x69, 0x22, + 0xaf, 0x6c, 0x1d, + 0xb0, 0x69, 0x23, + 0xb0, 0x6b, 0x23, + 0xb0, 0x6d, 0x20, + 0xac, 0x6b, 0x27, + 0xb3, 0x6d, 0x21, + 0xb0, 0x6e, 0x23, + 0xb3, 0x6d, 0x24, + 0xb3, 0x6d, 0x25, + 0xb3, 0x6d, 0x27, + 0x9a, 0x6b, 0x36, + 0xb6, 0x72, 0x1e, + 0xb6, 0x6f, 0x25, + 0xb5, 0x72, 0x23, + 0xb4, 0x70, 0x28, + 0xb7, 0x71, 0x25, + 0xae, 0x70, 0x2b, + 0xb7, 0x71, 0x27, + 0xb8, 0x71, 0x29, + 0xb8, 0x73, 0x27, + 0xb4, 0x73, 0x29, + 0xb9, 0x74, 0x28, + 0xbc, 0x76, 0x23, + 0xb8, 0x76, 0x26, + 0xbb, 0x74, 0x2a, + 0xbb, 0x75, 0x29, + 0xb9, 0x75, 0x2b, + 0xbc, 0x75, 0x2c, + 0x7f, 0x70, 0x4e, + 0xbc, 0x77, 0x2a, + 0xbf, 0x76, 0x2d, + 0xb2, 0x75, 0x35, + 0xbc, 0x78, 0x2c, + 0xbe, 0x7b, 0x26, + 0xbf, 0x79, 0x2c, + 0xc0, 0x78, 0x2f, + 0xbe, 0x7a, 0x2c, + 0xc1, 0x7e, 0x25, + 0xbe, 0x7b, 0x2d, + 0xc1, 0x7b, 0x2d, + 0xc0, 0x7d, 0x2d, + 0xc1, 0x7c, 0x2f, + 0xc2, 0x7c, 0x31, + 0xc1, 0x7e, 0x2f, + 0xc6, 0x7d, 0x32, + 0xc4, 0x7f, 0x2f, + 0xc5, 0x7d, 0x34, + 0xc4, 0x82, 0x2c, + 0xc6, 0x84, 0x28, + 0xc4, 0x80, 0x31, + 0xc1, 0x7d, 0x39, + 0xc4, 0x82, 0x31, + 0xc7, 0x81, 0x32, + 0xcb, 0x80, 0x36, + 0xc7, 0x83, 0x32, + 0xc7, 0x83, 0x33, + 0xc9, 0x83, 0x34, + 0xcd, 0x82, 0x39, + 0xc7, 0x84, 0x38, + 0xcb, 0x85, 0x36, + 0xcb, 0x88, 0x31, + 0xcb, 0x88, 0x36, + 0xce, 0x86, 0x39, + 0xcc, 0x89, 0x37, + 0xce, 0x8f, 0x2d, + 0xd3, 0x87, 0x3d, + 0xce, 0x89, 0x3b, + 0xcd, 0x8b, 0x38, + 0xcd, 0x8b, 0x39, + 0xcf, 0x8b, 0x3a, + 0xce, 0x8c, 0x3b, + 0xd1, 0x8c, 0x3d, + 0x6c, 0x82, 0x76, + 0xd7, 0x8a, 0x40, + 0x34, 0x80, 0x90, + 0xff, 0x86, 0x3a, + 0xd3, 0x8c, 0x3f, + 0xd1, 0x8f, 0x3b, + 0xcd, 0x8a, 0x47, + 0xd1, 0x8f, 0x3d, + 0xdf, 0x8b, 0x40, + 0xd3, 0x8f, 0x3d, + 0xd4, 0x8f, 0x3f, + 0xd3, 0x95, 0x36, + 0xd8, 0x8e, 0x42, + 0xd3, 0x92, 0x3e, + 0xdd, 0x8d, 0x45, + 0xdb, 0x8e, 0x44, + 0xd4, 0x92, 0x40, + 0xd6, 0x92, 0x41, + 0xe0, 0x8f, 0x45, + 0xd4, 0x94, 0x40, + 0xd0, 0x8d, 0x50, + 0xdd, 0x91, 0x45, + 0xe0, 0x90, 0x47, + 0xd6, 0x96, 0x40, + 0xd8, 0x94, 0x45, + 0xe4, 0x91, 0x47, + 0xd8, 0x96, 0x42, + 0xd9, 0x95, 0x45, + 0xd7, 0x97, 0x43, + 0xe7, 0x91, 0x49, + 0xdd, 0x95, 0x46, + 0xe0, 0x94, 0x47, + 0xdb, 0x95, 0x47, + 0xe4, 0x92, 0x4a, + 0xf2, 0x91, 0x47, + 0xdd, 0x95, 0x49, + 0xe1, 0x95, 0x49, + 0xe7, 0x93, 0x4d, + 0xdb, 0x99, 0x46, + 0xd9, 0x9a, 0x45, + 0xe4, 0x96, 0x4a, + 0xdd, 0x99, 0x47, + 0xe0, 0x98, 0x49, + 0xe6, 0x96, 0x4b, + 0xe1, 0x98, 0x4a, + 0xec, 0x96, 0x4a, + 0xe3, 0x97, 0x4c, + 0xe7, 0x96, 0x4d, + 0xde, 0x9a, 0x49, + 0xe4, 0x98, 0x4b, + 0xdb, 0x9c, 0x47, + 0xdd, 0x9c, 0x48, + 0xe0, 0x9b, 0x4a, + 0xe0, 0x9b, 0x4c, + 0xe4, 0x9a, 0x4d, + 0xe2, 0x9b, 0x4c, + 0xde, 0x9d, 0x4a, + 0xe0, 0x9d, 0x4a, + 0xdf, 0x98, 0x56, + 0xff, 0x95, 0x53, + 0xd2, 0x97, 0x61, + 0xe4, 0x9c, 0x5d, + 0x13, 0x91, 0xc1, + 0xef, 0x9e, 0x58, + 0xff, 0xa0, 0x55, + 0x00, 0x90, 0xd2, + 0xef, 0xa2, 0x67, + 0x07, 0x9d, 0xd7, + 0xf6, 0xaa, 0x6b, + 0xd7, 0xa7, 0x80, + 0x00, 0x9f, 0xe0, + 0xed, 0xad, 0x78, + 0x00, 0xa3, 0xe3, + 0xfe, 0xac, 0x77, + 0x00, 0xa4, 0xe5, + 0xe7, 0xae, 0x7d, + 0x00, 0xa6, 0xe9, + 0x00, 0xab, 0xec, + 0xfe, 0xb2, 0x84, + 0x04, 0xad, 0xeb, + 0xfd, 0xb9, 0x83, + 0xee, 0xb8, 0x8c, + 0x00, 0xb1, 0xf3, + 0xfc, 0xbc, 0x8f, + 0x00, 0xb9, 0xfa, + 0xec, 0xc0, 0x9b, + 0xf9, 0xc6, 0x9c, + 0xf0, 0xcc, 0xae, + 0xfa, 0xd0, 0xae, + 0xf3, 0xd5, 0xbc, + 0xf9, 0xdb, 0xc2, + 0xf8, 0xde, 0xca, + 0xfb, 0xe5, 0xd5, + + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x07, 0x00, + 0x00, 0xfa, 0xfb, 0x03, 0xfc, 0xfd, 0xfd, 0xfb, 0xfa, 0xf5, 0x07, 0x07, + 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, + 0x06, 0xf5, 0xfb, 0xfd, 0xfd, 0xfd, 0x00, 0xfd, 0xfc, 0xfb, 0xfc, 0xfd, + 0xfd, 0xfe, 0xfd, 0x3f, 0xfc, 0xf8, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, + 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x01, 0xf9, 0x00, 0xfd, 0xfd, + 0xfc, 0xf8, 0xe9, 0xe4, 0xd1, 0xbf, 0x00, 0xbf, 0xbf, 0xd1, 0xe1, 0xe9, + 0xf7, 0xfb, 0xfd, 0x3f, 0xfd, 0xfb, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, + 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0xf8, 0xfc, 0x00, 0xfc, 0xf9, + 0xe9, 0xd1, 0xbf, 0xd1, 0xd1, 0xc7, 0x00, 0xd1, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc7, 0xbf, 0xbf, 0x07, 0xe4, 0xf9, 0xfd, 0xfd, 0xfa, 0x07, 0xbf, 0x77, + 0xff, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x80, 0x03, 0xfb, + 0xfb, 0xfb, 0xe9, 0xbf, 0xcd, 0xd1, 0x30, 0xd1, 0xd1, 0xe9, 0xd1, 0xc7, + 0xc7, 0xc7, 0xc7, 0x03, 0xc7, 0xbf, 0xdf, 0xf9, 0xfd, 0xfd, 0x05, 0xcd, + 0xff, 0x97, 0x4f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc0, 0x07, 0x05, + 0xfb, 0xfb, 0xf3, 0xc7, 0xcd, 0xcd, 0x4c, 0xcd, 0xe9, 0xd1, 0xd1, 0xc2, + 0x9a, 0xbf, 0xbf, 0x03, 0xbf, 0xbb, 0xe9, 0xfc, 0xfd, 0xf8, 0x02, 0xe2, + 0xff, 0xc6, 0x87, 0x3f, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc0, 0x07, 0x07, + 0x00, 0x00, 0xfb, 0xfb, 0xe4, 0xbf, 0x00, 0xc7, 0xd1, 0xcd, 0xcd, 0xd1, + 0xd1, 0xd1, 0xd1, 0xc0, 0xdb, 0xa1, 0xcd, 0xc3, 0xc3, 0xbf, 0xbf, 0xbb, + 0x01, 0xd1, 0xf9, 0xfc, 0xf8, 0x00, 0x00, 0x00, 0xe9, 0xff, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, 0x02, 0xfb, 0xfb, + 0xdf, 0xc3, 0xc3, 0x03, 0xcd, 0xcd, 0xcd, 0xd3, 0xd3, 0xd3, 0xe9, 0xd2, + 0x80, 0x99, 0xcd, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xbb, 0x01, 0xbb, 0xf9, + 0xfd, 0xf7, 0x00, 0x00, 0x00, 0xe9, 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x07, 0x07, 0x07, 0xc0, 0x07, 0x07, 0x00, 0x00, 0xf9, 0xfb, 0xdf, 0xc6, + 0x01, 0xc3, 0xca, 0xd0, 0xca, 0xd3, 0xd3, 0xd3, 0xe9, 0x80, 0xd4, 0xd0, + 0xd0, 0xca, 0xc3, 0xc3, 0xc3, 0xbb, 0x00, 0xbb, 0xbb, 0xbb, 0xbb, 0xf9, + 0xfc, 0xed, 0x00, 0x3f, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0xf8, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf9, 0xfb, 0xe9, 0x02, 0xc1, 0xc6, + 0xca, 0xd0, 0xd0, 0xd0, 0xe9, 0xd8, 0x28, 0xd8, 0xd8, 0xe9, 0xd8, 0x9b, + 0xc6, 0xc6, 0xc6, 0x00, 0xc6, 0xbb, 0xb8, 0xb8, 0xb8, 0xd0, 0xfb, 0xfb, + 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xfc, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0xf9, 0xf3, 0x00, 0xb8, 0xc6, 0xc6, 0xc6, 0xc6, + 0xd0, 0xd0, 0xd0, 0x08, 0xd0, 0xd8, 0xd8, 0xd8, 0xe9, 0xd8, 0xd9, 0xd8, + 0x40, 0xd3, 0x92, 0xc6, 0xc6, 0xc1, 0xb8, 0xb8, 0xb8, 0x00, 0xb4, 0xb4, + 0xe9, 0xfc, 0xf9, 0x00, 0x00, 0x00, 0xc0, 0xe9, 0xd2, 0xfa, 0xfd, 0xfe, + 0xfe, 0xfe, 0xfe, 0x3f, 0xfd, 0xfa, 0x77, 0x2f, 0x77, 0x2f, 0x07, 0x07, + 0xc0, 0x07, 0x07, 0x00, 0xf9, 0xf9, 0xdc, 0xc1, 0xc1, 0x00, 0xc6, 0xc6, + 0xce, 0xce, 0xce, 0xce, 0xd9, 0xd9, 0x64, 0xd9, 0xe9, 0xd2, 0xd7, 0xd9, + 0x81, 0xc6, 0xc6, 0x00, 0xc1, 0xb8, 0xb8, 0xb8, 0xb4, 0xb0, 0xaa, 0xf7, + 0x08, 0xfb, 0x00, 0x00, 0x00, 0xe9, 0x00, 0xf8, 0xfd, 0x00, 0xfb, 0xf3, + 0xe4, 0xe1, 0xc7, 0xc7, 0xe1, 0xe4, 0x0f, 0xf7, 0xfd, 0xfd, 0xf3, 0x5d, + 0x25, 0x97, 0x4f, 0xf0, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0xf7, 0xed, + 0x00, 0xb7, 0xc1, 0xc1, 0xc1, 0xc1, 0xc5, 0xcc, 0xcc, 0x00, 0xce, 0xce, + 0xd7, 0xd7, 0xd9, 0xd9, 0xd9, 0xd9, 0x00, 0xd9, 0xd7, 0xd7, 0xd6, 0xd6, + 0xce, 0xce, 0xcc, 0x00, 0xc5, 0xc6, 0xc1, 0xb7, 0xb8, 0xb7, 0xb0, 0xb0, + 0x00, 0xb0, 0xdf, 0xfb, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0xfc, + 0xf9, 0xe4, 0xbf, 0xcd, 0xd1, 0xd1, 0x00, 0xd1, 0xd1, 0xd1, 0xc7, 0xbf, + 0xbf, 0xe9, 0xfc, 0x7f, 0xfc, 0x5a, 0x3a, 0xc6, 0x87, 0x3f, 0x07, 0x07, + 0x80, 0x06, 0xdc, 0xe4, 0xe6, 0xe6, 0xe6, 0xe4, 0x00, 0x02, 0x00, 0xf7, + 0xf7, 0xc5, 0xc5, 0xc5, 0xe9, 0xcc, 0x00, 0xcc, 0xd2, 0xd2, 0xd6, 0xd6, + 0xd6, 0xd6, 0xd6, 0x30, 0xd7, 0xd7, 0xe1, 0xb2, 0xcc, 0xcc, 0xc5, 0xc5, + 0x00, 0xc1, 0xb7, 0xb7, 0xb7, 0xb1, 0xb1, 0xaa, 0xf7, 0x00, 0xfb, 0x00, + 0x00, 0x00, 0xf3, 0xfc, 0xe9, 0xbf, 0x10, 0xd1, 0xd1, 0xd1, 0xe9, 0xd1, + 0xd1, 0xcd, 0xcd, 0x07, 0xcd, 0xbf, 0xbf, 0xf3, 0xfe, 0x51, 0x39, 0xd4, + 0xf8, 0xa7, 0x5f, 0x17, 0x07, 0x06, 0xe9, 0xf3, 0xf7, 0x04, 0xf7, 0xf7, + 0xf8, 0xf9, 0xf9, 0xd1, 0xf7, 0xed, 0x10, 0xc5, 0xc5, 0xc5, 0xe9, 0xc5, + 0xd2, 0xd2, 0xd2, 0x06, 0xd6, 0xd6, 0xda, 0xda, 0xda, 0xe9, 0xd1, 0xd6, + 0x80, 0x89, 0xd2, 0xc5, 0xc0, 0xc0, 0xc0, 0xb7, 0xb7, 0x00, 0xb1, 0xb1, + 0xb1, 0xdf, 0xfb, 0xe7, 0x00, 0xf3, 0x00, 0xfb, 0xdf, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xd3, 0x80, 0xd3, 0xcd, 0xc3, 0xc3, 0xc3, 0xbb, 0xe4, 0xfd, + 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xc0, 0x07, 0x02, + 0xe6, 0xed, 0xf3, 0xf3, 0xf3, 0xf3, 0x00, 0xe9, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe9, 0xed, 0xf3, 0x00, 0xed, 0xc5, 0xc5, 0xc5, 0xc5, 0xc2, 0xc2, 0xc0, + 0x00, 0xcb, 0xcb, 0xd2, 0xd2, 0xd5, 0xda, 0xda, 0xda, 0xc0, 0xe9, 0xd3, + 0xd2, 0xd2, 0xcb, 0xd2, 0xcc, 0xcc, 0x00, 0xcc, 0xc0, 0xc5, 0xc0, 0xb7, + 0xb7, 0xb7, 0xc5, 0x00, 0xf9, 0xf9, 0xe9, 0xfb, 0xdf, 0xca, 0xca, 0xca, + 0x10, 0xd3, 0xd3, 0xd8, 0xe9, 0xd3, 0xd3, 0xd3, 0xd0, 0x00, 0xca, 0xc3, + 0xc3, 0xc3, 0xbb, 0xe9, 0xfd, 0x00, 0x3f, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0x00, 0x00, 0xe4, 0xed, 0xed, 0xf3, 0xe9, 0xdf, 0xc7, + 0x00, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb8, 0xb8, 0xb7, 0x04, 0xb1, 0xb1, + 0xc2, 0xc2, 0xc2, 0xe9, 0xc8, 0xc2, 0x02, 0xcb, 0xcb, 0xcb, 0xd5, 0xd5, + 0xd5, 0xe9, 0xda, 0x80, 0xcb, 0xcb, 0xd5, 0xd2, 0xd2, 0xd2, 0xd2, 0xc5, + 0x00, 0xc5, 0xc0, 0xc0, 0xc0, 0xc5, 0xc2, 0xb7, 0xf3, 0x00, 0xf3, 0xfb, + 0xe9, 0xca, 0xca, 0xca, 0xd0, 0xd0, 0x00, 0xd3, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd3, 0xd0, 0x00, 0xd0, 0xca, 0xc3, 0xc6, 0xbb, 0xb8, 0xaa, 0xf3, + 0x0f, 0xfb, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xc0, 0x17, 0x06, + 0xe9, 0xed, 0xed, 0xe4, 0xc7, 0xbb, 0x00, 0xc3, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb8, 0xb8, 0xb7, 0x00, 0xb0, 0xb7, 0xb1, 0xae, 0xae, 0xb3, 0xba, 0xbd, + 0x04, 0xbd, 0xbd, 0xc8, 0xc8, 0xc8, 0xe9, 0xd5, 0xd5, 0x60, 0xd5, 0xe9, + 0xd4, 0xda, 0xda, 0xd2, 0xd2, 0xcb, 0x00, 0xc8, 0xc2, 0xc2, 0xc0, 0xc2, + 0xc5, 0xc5, 0xc5, 0x00, 0xe9, 0xf7, 0xf7, 0xc6, 0xd0, 0xd3, 0xd3, 0xd3, + 0x08, 0xce, 0xd9, 0xd9, 0xd9, 0xe9, 0xd9, 0xd9, 0xce, 0x00, 0xce, 0xc6, + 0xc1, 0xb8, 0xb8, 0xb4, 0xb4, 0xfb, 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xa7, 0x5f, 0x17, 0x80, 0x04, 0xdc, 0xe9, 0xe9, 0xe4, 0xc3, 0xb4, 0xb4, + 0x00, 0xb8, 0xb8, 0xb8, 0xb8, 0xb4, 0xb7, 0xb0, 0xb7, 0x00, 0xb1, 0xb1, + 0xae, 0xae, 0xae, 0xb3, 0xb3, 0xb3, 0x00, 0xba, 0xbd, 0xbd, 0xc9, 0xc9, + 0xc9, 0xc8, 0xc9, 0x0c, 0xc9, 0xd4, 0xd4, 0xd4, 0xe9, 0xd1, 0xd5, 0xd5, + 0x00, 0xd5, 0xd5, 0xd5, 0xd4, 0xcb, 0xc8, 0xc8, 0xc0, 0x00, 0xc1, 0xc6, + 0xd0, 0xd1, 0xdc, 0xdc, 0xdf, 0xf9, 0x00, 0xdf, 0xc6, 0xce, 0xd9, 0xd9, + 0xd9, 0xd9, 0xd7, 0x20, 0xd7, 0xd7, 0xe9, 0xd7, 0xd6, 0xce, 0xcc, 0xc5, + 0x00, 0xc1, 0xc1, 0xb7, 0xb0, 0xb0, 0xe9, 0xfb, 0x00, 0x3f, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x02, 0x01, 0xdc, 0xe4, 0xe4, 0xdc, 0xb4, + 0xb4, 0xb4, 0xe9, 0x00, 0xb4, 0xb0, 0xb1, 0xb1, 0xb1, 0xae, 0xae, 0xae, + 0x00, 0xae, 0xae, 0xb3, 0xb3, 0xb3, 0xb3, 0xba, 0xbc, 0x03, 0xbe, 0xbe, + 0xbd, 0xc9, 0xc9, 0xc9, 0xe9, 0xd4, 0x00, 0xd4, 0xd5, 0xd5, 0xd5, 0xd4, + 0xc8, 0xc8, 0xc8, 0x00, 0xc0, 0xe1, 0xe9, 0xf3, 0xf8, 0xf8, 0xf9, 0xf9, + 0x00, 0xf8, 0xf7, 0xf3, 0xce, 0xc6, 0xc6, 0xce, 0xd6, 0x00, 0xd9, 0xd9, + 0xd9, 0xdb, 0xd7, 0xd7, 0xd7, 0xd7, 0x00, 0xd6, 0xd6, 0xd2, 0xd2, 0xc5, + 0xc5, 0xc0, 0xb7, 0x01, 0xb1, 0xb1, 0xb1, 0xfb, 0x00, 0x00, 0x00, 0xe9, + 0xf8, 0xd4, 0xa7, 0x5f, 0x17, 0x01, 0xc5, 0xe4, 0xdf, 0x08, 0xb8, 0xb0, + 0xb0, 0xb0, 0xe9, 0xb1, 0xb1, 0xb1, 0x00, 0xb1, 0xae, 0xae, 0xae, 0xae, + 0xac, 0xac, 0xac, 0x00, 0xac, 0xb2, 0xb2, 0xb3, 0xb5, 0xb9, 0xbe, 0xbe, + 0x60, 0xbe, 0xe9, 0xd4, 0xbe, 0xc9, 0xc9, 0xd4, 0xd4, 0x00, 0xd4, 0xc9, + 0xd4, 0xc9, 0xc8, 0xe1, 0xe9, 0xf3, 0x00, 0xe9, 0xe4, 0xe1, 0xd1, 0xd1, + 0xd1, 0xdf, 0xdf, 0x00, 0xd0, 0xce, 0xc5, 0xc5, 0xcc, 0xd2, 0xd6, 0xd7, + 0x00, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0x00, 0xd2, 0xcb, + 0xc2, 0xc0, 0xbd, 0xb1, 0xae, 0xae, 0x03, 0xa3, 0xf3, 0xe7, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xe0, 0xa7, 0x5f, 0x17, 0x00, 0x00, 0xdf, 0xdf, 0xb1, + 0x00, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xae, 0xae, 0xae, 0x84, 0xe9, 0xae, + 0xac, 0xac, 0xac, 0xe9, 0xac, 0xb2, 0x00, 0xb2, 0xb2, 0xb5, 0xb9, 0xb9, + 0xb9, 0xbe, 0xbe, 0x62, 0xbe, 0xe9, 0xd3, 0xc9, 0xc9, 0xc9, 0xe9, 0xc9, + 0x00, 0xc6, 0xe4, 0xed, 0xe4, 0xd1, 0xbf, 0xbf, 0xc3, 0x00, 0xbb, 0xbb, + 0xb8, 0xb8, 0xb7, 0xb7, 0xc0, 0xc0, 0x00, 0xc0, 0xcb, 0xcb, 0xd5, 0xd5, + 0xda, 0xda, 0xda, 0x00, 0xd5, 0xd5, 0xd5, 0xd5, 0xd4, 0xcb, 0xc8, 0xc8, + 0x00, 0xbd, 0xbd, 0xae, 0xae, 0xa3, 0xa3, 0xdf, 0xf7, 0x1f, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x00, 0x00, 0xdf, 0xdf, 0xb1, 0xa3, + 0x9b, 0xa3, 0xa3, 0x40, 0xa3, 0xe9, 0xa3, 0xa3, 0xac, 0xa6, 0xa6, 0xa6, + 0x80, 0xe9, 0xa9, 0xa9, 0xa9, 0xaf, 0xb2, 0xb2, 0xb2, 0x06, 0xb2, 0xb2, + 0xb5, 0xb5, 0xb5, 0xe9, 0xd3, 0xbc, 0x00, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xc9, 0xc5, 0xe4, 0x00, 0xe4, 0xc7, 0xbb, 0xbb, 0xbb, 0xbb, 0xb8, 0xb8, + 0x00, 0xb7, 0xb7, 0xb7, 0xb1, 0xbd, 0xbd, 0xbd, 0xc8, 0x00, 0xc8, 0xcb, + 0xcb, 0xd5, 0xd5, 0xd5, 0xda, 0xd5, 0x00, 0xd4, 0xd4, 0xd4, 0xc8, 0xc8, + 0xc8, 0xbd, 0xbd, 0x00, 0xba, 0xae, 0xae, 0xa6, 0x9b, 0xb6, 0xf7, 0x00, + 0x3e, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xdc, 0x04, 0xdc, 0xb1, + 0x9b, 0x9b, 0x9b, 0xe9, 0x9b, 0x9b, 0x00, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa1, 0xa1, 0xa1, 0x00, 0xa1, 0xa1, 0xa7, 0xa9, 0xa9, 0xa9, 0xaf, 0xaf, + 0x42, 0xaf, 0xe9, 0xaf, 0xb5, 0xb5, 0xb5, 0xc4, 0xb9, 0x20, 0xbe, 0xb9, + 0xe9, 0xb7, 0xe4, 0xdf, 0xb4, 0xb4, 0x40, 0xb4, 0xe9, 0xb7, 0xb7, 0xae, + 0xae, 0xae, 0xb3, 0x00, 0xb3, 0xba, 0xbc, 0xbd, 0xc9, 0xc9, 0xc8, 0xc8, + 0x00, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xc9, 0xc9, 0xc9, 0x00, 0xbe, 0xbe, + 0xbe, 0xb3, 0xb3, 0xac, 0xa6, 0xa6, 0x03, 0x9b, 0x9b, 0xf7, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xe0, 0xa7, 0x5f, 0x17, 0xdc, 0xb6, 0x93, 0x93, 0x93, + 0x00, 0x93, 0x93, 0x98, 0x98, 0x98, 0x9b, 0x9b, 0x9b, 0x10, 0xa1, 0xa1, + 0xa1, 0xe9, 0xa1, 0xa7, 0xa7, 0xa7, 0x80, 0xe9, 0xa7, 0xa7, 0xa9, 0xa9, + 0xaf, 0xaf, 0xa9, 0x20, 0xaf, 0xa9, 0xca, 0xaf, 0xaf, 0xb2, 0xb2, 0xb2, + 0x00, 0xb2, 0xb2, 0xb3, 0xdf, 0xdc, 0xaa, 0xa3, 0xaa, 0x00, 0xb1, 0xb1, + 0xb1, 0xb1, 0xae, 0xae, 0xae, 0xb3, 0x00, 0xb3, 0xb3, 0xb3, 0xb9, 0xbc, + 0xbc, 0xbc, 0xbe, 0x24, 0xbe, 0xbe, 0xe9, 0xc9, 0xc9, 0xc1, 0xb5, 0xb9, + 0x00, 0xb5, 0xb3, 0xb2, 0xac, 0xa1, 0x9b, 0x9b, 0x9b, 0x00, 0xf3, 0xde, + 0xed, 0xf3, 0xf7, 0xf7, 0xf3, 0xed, 0x0f, 0xde, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x02, 0xc5, 0xb6, 0x9b, 0x93, 0x93, 0x93, 0xe9, 0x93, + 0x00, 0x98, 0x98, 0x98, 0x9c, 0x9c, 0x9f, 0x9f, 0x9f, 0x23, 0x9f, 0xa0, + 0xe9, 0xa7, 0xa7, 0xa7, 0xe9, 0xd4, 0x80, 0xa3, 0xa9, 0xaf, 0xaf, 0xaf, + 0xaf, 0xa9, 0xaf, 0x00, 0xc5, 0xdc, 0xa3, 0xa3, 0x9b, 0xa3, 0xa3, 0xa3, + 0x08, 0xae, 0xac, 0xac, 0xac, 0xe9, 0xb2, 0xb2, 0xb2, 0x0c, 0xb5, 0xb9, + 0xb9, 0xb9, 0xe9, 0xd1, 0xbe, 0xb9, 0x00, 0xb2, 0xb2, 0xaf, 0xaf, 0xaf, + 0xaf, 0xa9, 0xa1, 0x00, 0x9f, 0x9c, 0x98, 0x98, 0xde, 0xe7, 0xe7, 0xde, + 0x00, 0xb6, 0xb6, 0xb6, 0xde, 0xe7, 0xf3, 0xed, 0xb6, 0x1e, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5c, 0xb6, 0x0c, 0xa8, 0x8f, 0x8f, 0x8f, 0xe9, + 0xd1, 0x95, 0x95, 0x00, 0x98, 0x98, 0x9c, 0x9e, 0x9e, 0x9c, 0x9f, 0x9e, + 0x00, 0x9d, 0x9e, 0x9e, 0x9e, 0x9f, 0xa0, 0x9f, 0x9f, 0x41, 0x9f, 0xe9, + 0x9f, 0x9e, 0xa0, 0xa0, 0x9f, 0x91, 0x00, 0xa1, 0xa1, 0xa1, 0xa7, 0xa1, + 0xa6, 0xdc, 0x9b, 0x20, 0x9b, 0x9b, 0xe9, 0xa1, 0xa1, 0xab, 0xac, 0xab, + 0x01, 0xa9, 0xa7, 0xab, 0xab, 0xaf, 0xaf, 0xaf, 0xe9, 0x80, 0xd4, 0xaf, + 0xb2, 0xaf, 0xa7, 0xa9, 0xa9, 0xa7, 0x00, 0xa1, 0xa0, 0x9c, 0x9c, 0x98, + 0x95, 0x93, 0x8f, 0x20, 0x8f, 0x8f, 0xe9, 0x8f, 0x8f, 0x86, 0x8f, 0xb6, + 0x07, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x81, 0x5a, 0x94, + 0xa8, 0x93, 0x86, 0x86, 0x86, 0xe9, 0x00, 0x86, 0x8e, 0x92, 0x92, 0x92, + 0x95, 0x97, 0x99, 0x1e, 0x99, 0x99, 0x9d, 0xe1, 0xc9, 0xbf, 0x82, 0x97, + 0x00, 0x9d, 0x9d, 0x9e, 0x9e, 0x9e, 0x9c, 0x9f, 0xa8, 0x00, 0xa8, 0x93, + 0x93, 0x93, 0x93, 0x95, 0x98, 0x9c, 0x03, 0x9f, 0x9f, 0x9f, 0xa7, 0xa7, + 0xa7, 0xe9, 0xd4, 0xc0, 0xa1, 0x73, 0xa0, 0xa0, 0x9f, 0x9f, 0x9e, 0x9e, + 0x00, 0x99, 0x97, 0x95, 0x95, 0x95, 0x94, 0x94, 0x8f, 0x00, 0x92, 0x92, + 0x8f, 0x8f, 0x86, 0x86, 0x86, 0x86, 0x01, 0x86, 0xb6, 0xe7, 0xa8, 0x00, + 0x00, 0x00, 0xe9, 0xc3, 0xd4, 0xa7, 0x00, 0x00, 0xa8, 0xa8, 0x02, 0xe2, + 0x00, 0x86, 0x8e, 0x92, 0x92, 0x92, 0x95, 0x97, 0x97, 0x60, 0x97, 0xe9, + 0xd4, 0x97, 0x97, 0x99, 0x99, 0x99, 0x8a, 0xe9, 0x99, 0x99, 0x97, 0x42, + 0x99, 0x89, 0xb6, 0x00, 0x93, 0x8f, 0x8f, 0x8f, 0x8e, 0x92, 0x95, 0x95, + 0x01, 0x99, 0x9d, 0x9d, 0x9e, 0x9d, 0x9d, 0x9d, 0xe9, 0x80, 0xd4, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x9e, 0x9f, 0x20, 0x99, 0x97, 0xb9, 0x97, 0x95, + 0x95, 0x92, 0x92, 0x00, 0x92, 0x94, 0x92, 0x92, 0x8e, 0x8e, 0x8e, 0x8e, + 0x00, 0x8e, 0x86, 0x86, 0x86, 0x86, 0x7d, 0x94, 0xde, 0x0e, 0xa8, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x00, 0xa8, 0x94, 0x84, 0x84, 0x7d, + 0x84, 0x83, 0x83, 0x00, 0x83, 0x83, 0x87, 0x86, 0x8e, 0x8e, 0x90, 0x91, + 0x18, 0x92, 0x92, 0x92, 0xe9, 0xd3, 0x95, 0x97, 0x97, 0x02, 0x97, 0x95, + 0x97, 0x95, 0x95, 0x95, 0x67, 0x92, 0x00, 0x94, 0xa8, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x8e, 0x40, 0x91, 0x1a, 0x99, 0x99, 0x9d, 0x99, 0x99, 0x97, + 0x2e, 0x97, 0x97, 0xe9, 0x95, 0x04, 0x59, 0xbb, 0x91, 0x20, 0x91, 0x91, + 0xe9, 0x91, 0x91, 0x8e, 0x91, 0x8e, 0x00, 0x8e, 0x8e, 0x8b, 0x86, 0x84, + 0x84, 0x83, 0x7d, 0x03, 0x8c, 0xde, 0x64, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0x80, 0xa7, 0x94, 0x88, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x00, 0x81, 0x81, + 0x83, 0x83, 0x87, 0x87, 0x8b, 0x8e, 0x02, 0x8e, 0x90, 0x8e, 0x90, 0x90, + 0x90, 0xe9, 0x91, 0x30, 0x91, 0x91, 0xe9, 0xd1, 0x90, 0x8e, 0x8e, 0x8e, + 0xc0, 0xe9, 0xd2, 0x91, 0x91, 0x94, 0x94, 0x7d, 0x7d, 0x00, 0x7d, 0x83, + 0x84, 0x84, 0x8b, 0x8e, 0x91, 0x92, 0x21, 0x92, 0x92, 0xe9, 0x92, 0x91, + 0x91, 0x90, 0x04, 0x0b, 0x8b, 0x8b, 0x8b, 0x8e, 0x49, 0x8b, 0xa5, 0x89, + 0x80, 0xd4, 0x8b, 0x87, 0x87, 0x83, 0x83, 0x7d, 0x78, 0x03, 0x78, 0x8c, + 0xde, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x90, 0xa6, 0x79, 0x8c, 0x29, 0x78, + 0x78, 0x78, 0x7c, 0x00, 0x7c, 0x7e, 0x82, 0x82, 0x83, 0x87, 0x87, 0x87, + 0x00, 0x87, 0x8b, 0x8d, 0x8d, 0x8b, 0x8b, 0x8b, 0x8b, 0x02, 0x8d, 0x8e, + 0x8e, 0x8e, 0x8b, 0x8b, 0x7a, 0x87, 0x00, 0x83, 0x87, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x85, 0x80, 0x49, 0x8c, 0x88, 0x78, 0x7d, 0x7c, 0x7d, 0x81, + 0x00, 0x83, 0x84, 0x87, 0x8b, 0x8b, 0x8e, 0x90, 0x8e, 0x02, 0x8d, 0x8b, + 0x8b, 0x87, 0x87, 0x84, 0x12, 0x81, 0x22, 0x81, 0x81, 0xe9, 0x81, 0x84, + 0x87, 0x99, 0x82, 0x00, 0x82, 0x83, 0x82, 0x85, 0x85, 0x85, 0x87, 0x87, + 0x60, 0x87, 0xe9, 0xd1, 0x83, 0x82, 0x81, 0x7c, 0x78, 0x01, 0x75, 0x72, + 0xa8, 0xa8, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa5, 0x8c, 0x8c, 0x75, + 0x72, 0x72, 0x75, 0x00, 0x75, 0x77, 0x77, 0x77, 0x7e, 0x7e, 0x81, 0x82, + 0x02, 0x82, 0x82, 0x83, 0x85, 0x85, 0x85, 0xe9, 0x87, 0x00, 0x8b, 0x87, + 0x87, 0x85, 0x82, 0x81, 0x81, 0x81, 0x82, 0xe9, 0x7c, 0x81, 0x7c, 0x7c, + 0x7c, 0xa9, 0x82, 0x00, 0x83, 0x83, 0x83, 0x8c, 0x7d, 0x75, 0x75, 0x75, + 0x00, 0x75, 0x78, 0x81, 0x81, 0x83, 0x85, 0x85, 0x87, 0x00, 0x85, 0x85, + 0x83, 0x83, 0x81, 0x7e, 0x7c, 0x7e, 0x01, 0x7c, 0x7c, 0x78, 0x77, 0x77, + 0x75, 0x77, 0x31, 0x02, 0x77, 0x7c, 0x81, 0x7e, 0x7e, 0x7e, 0x69, 0x7e, + 0x08, 0x7e, 0x82, 0x82, 0x82, 0xe9, 0x82, 0x85, 0x85, 0x40, 0x85, 0xb1, + 0x7e, 0x7e, 0x77, 0x72, 0x6c, 0x74, 0x0e, 0xa8, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa5, 0x8c, 0x08, 0x7d, 0x72, 0x72, 0x72, 0xe9, 0x72, 0x72, 0x77, + 0x00, 0x7a, 0x7e, 0x7e, 0x7e, 0x80, 0x82, 0x82, 0x82, 0x80, 0xe9, 0x82, + 0x83, 0x83, 0x81, 0x7e, 0x7e, 0x7c, 0x00, 0x7e, 0x7c, 0x7a, 0x7c, 0x77, + 0x77, 0x77, 0x77, 0x10, 0x7a, 0x7a, 0x7a, 0xe1, 0x7c, 0x80, 0x80, 0x7e, + 0x00, 0x7d, 0x75, 0x6c, 0x6c, 0x72, 0x72, 0x72, 0x77, 0x02, 0x7c, 0x7c, + 0x7e, 0x7e, 0x7e, 0x7e, 0x1a, 0x73, 0x00, 0x72, 0x72, 0x6f, 0x6f, 0x6f, + 0x6f, 0x6f, 0x6d, 0x00, 0x6f, 0x6d, 0x6f, 0x6c, 0x6f, 0x6f, 0x72, 0x73, + 0x08, 0x6f, 0x73, 0x73, 0x73, 0x41, 0x77, 0x7a, 0x7e, 0x04, 0x7e, 0x7e, + 0x82, 0x82, 0x82, 0xe9, 0x82, 0x7e, 0x00, 0x7e, 0x77, 0x73, 0x6f, 0x6c, + 0x66, 0x8c, 0x64, 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa4, 0x8c, 0x7d, + 0x00, 0x6c, 0x6c, 0x6c, 0x6b, 0x6c, 0x6c, 0x6d, 0x72, 0x00, 0x74, 0x73, + 0x77, 0x77, 0x77, 0x7e, 0x7a, 0x7e, 0x20, 0x7e, 0x7e, 0xe9, 0x7e, 0x7c, + 0x77, 0x73, 0x77, 0x11, 0x72, 0x72, 0x72, 0xe9, 0x6f, 0x6f, 0x6f, 0xe9, + 0x80, 0xd1, 0x73, 0x77, 0x75, 0x77, 0x75, 0x6c, 0x66, 0x08, 0x6b, 0x69, + 0x6b, 0x6d, 0x99, 0x73, 0x73, 0x73, 0x00, 0x73, 0x6f, 0x6f, 0x6d, 0x6b, + 0x6b, 0x66, 0x66, 0x0c, 0x66, 0x66, 0x66, 0x62, 0xd3, 0xa9, 0x69, 0x6b, + 0x00, 0x66, 0x69, 0x69, 0x6b, 0x6b, 0x6d, 0x6f, 0x6f, 0x00, 0x73, 0x73, + 0x77, 0x77, 0x7e, 0x7b, 0x7e, 0x7e, 0x40, 0x7e, 0xd9, 0x77, 0x77, 0x6f, + 0x6d, 0x66, 0x62, 0x07, 0x6e, 0x8c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa4, + 0x00, 0x79, 0x74, 0x66, 0x68, 0x66, 0x68, 0x6b, 0x6b, 0x00, 0x6b, 0x6b, + 0x6d, 0x6f, 0x6f, 0x73, 0x73, 0x77, 0x20, 0x77, 0x77, 0xe9, 0x77, 0x77, + 0x73, 0x6f, 0x6f, 0x00, 0x6f, 0x6d, 0x6d, 0x6d, 0x6b, 0x6d, 0x69, 0x69, + 0x20, 0x69, 0x6b, 0xe1, 0x69, 0x69, 0x6d, 0x6b, 0x6c, 0x80, 0x61, 0x74, + 0x68, 0x5b, 0x5c, 0x61, 0x61, 0x66, 0x10, 0x66, 0x69, 0x66, 0x39, 0x66, + 0x66, 0x66, 0x61, 0x04, 0x61, 0x61, 0x5b, 0x5b, 0x5b, 0xe9, 0x5b, 0x5b, + 0x00, 0x59, 0x59, 0x59, 0x59, 0x5c, 0x59, 0x61, 0x61, 0x04, 0x5c, 0x5c, + 0x61, 0x62, 0x61, 0x29, 0x69, 0x69, 0x00, 0x6d, 0x6d, 0x6f, 0x71, 0x71, + 0x77, 0x77, 0x77, 0x00, 0x77, 0x73, 0x6f, 0x71, 0x69, 0x66, 0x61, 0x5c, + 0x07, 0x5b, 0x8c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa5, 0x00, 0x74, 0x62, + 0x62, 0x62, 0x62, 0x62, 0x66, 0x66, 0x00, 0x66, 0x6b, 0x6b, 0x6b, 0x6d, + 0x6d, 0x6f, 0x6f, 0x41, 0x6f, 0xe2, 0x6d, 0x6d, 0x6d, 0x69, 0x69, 0x61, + 0xf0, 0x49, 0x31, 0x12, 0x9a, 0x6b, 0x6b, 0x6c, 0x6c, 0x00, 0x6a, 0x55, + 0x57, 0x59, 0x59, 0x5c, 0x61, 0x5f, 0x20, 0x61, 0x61, 0xe1, 0x5c, 0x59, + 0x59, 0x57, 0x58, 0x02, 0x55, 0x55, 0x55, 0x55, 0x50, 0x50, 0xdb, 0x55, + 0x00, 0x52, 0x52, 0x55, 0x58, 0x57, 0x58, 0x59, 0x59, 0x20, 0x5c, 0x5c, + 0x11, 0x66, 0x67, 0x67, 0x67, 0x67, 0x00, 0x6d, 0x71, 0x71, 0x71, 0x71, + 0x71, 0x6d, 0x67, 0x00, 0x67, 0x61, 0x5c, 0x57, 0x50, 0x79, 0x00, 0x00, + 0x70, 0x00, 0xe9, 0xd4, 0xa5, 0x6e, 0x5b, 0x5b, 0x5c, 0x00, 0x5c, 0x5c, + 0x61, 0x62, 0x62, 0x66, 0x66, 0x66, 0x10, 0x69, 0x69, 0x69, 0xe9, 0x6b, + 0x69, 0x69, 0x66, 0x01, 0x66, 0x62, 0x61, 0x61, 0x61, 0x61, 0x61, 0x31, + 0xe0, 0x19, 0xd2, 0x89, 0x62, 0x62, 0x68, 0x62, 0x68, 0x00, 0x6a, 0x4f, + 0x4b, 0x50, 0x50, 0x51, 0x57, 0x58, 0x00, 0x58, 0x58, 0x57, 0x52, 0x50, + 0x50, 0x50, 0x4f, 0x00, 0x4b, 0x4b, 0x4a, 0x47, 0x47, 0x47, 0x4a, 0x4a, + 0x80, 0xe9, 0x4b, 0x48, 0x4b, 0x4b, 0x4b, 0x4f, 0x4f, 0x80, 0x51, 0x50, + 0x55, 0x58, 0x57, 0x57, 0x57, 0x57, 0x02, 0x5d, 0x5f, 0x5f, 0x67, 0x67, + 0x67, 0xe9, 0x67, 0x00, 0x67, 0x5f, 0x5f, 0x5d, 0x58, 0x51, 0x4b, 0x6a, + 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa5, 0x6e, 0x5b, 0x00, 0x58, 0x58, + 0x58, 0x59, 0x58, 0x5c, 0x5c, 0x5c, 0x11, 0x61, 0x61, 0x61, 0xe9, 0x61, + 0x66, 0x66, 0xb9, 0x00, 0x5f, 0x5c, 0x59, 0x5c, 0x5c, 0x57, 0x57, 0x57, + 0xc0, 0xe9, 0xd4, 0x57, 0x59, 0x59, 0x5b, 0x5b, 0x5c, 0x00, 0x62, 0x5c, + 0x5e, 0x54, 0x46, 0x47, 0x48, 0x48, 0x00, 0x4d, 0x4b, 0x4b, 0x4b, 0x4b, + 0x4b, 0x47, 0x47, 0x00, 0x47, 0x47, 0x40, 0x40, 0x40, 0x40, 0x39, 0x39, + 0x01, 0x35, 0x39, 0x3d, 0x40, 0x40, 0x43, 0x46, 0x7a, 0x80, 0x5a, 0x48, + 0x48, 0x4d, 0x4b, 0x4d, 0x50, 0x51, 0x01, 0x52, 0x52, 0x5d, 0x5d, 0x5f, + 0x5f, 0x5f, 0xe9, 0x00, 0x5f, 0x5d, 0x5d, 0x52, 0x51, 0x4d, 0x48, 0x5e, + 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa5, 0x6e, 0x5e, 0x00, 0x50, 0x50, + 0x55, 0x55, 0x55, 0x58, 0x58, 0x58, 0x08, 0x58, 0x5c, 0x5c, 0x5c, 0xe9, + 0x5c, 0x5c, 0x59, 0x00, 0x57, 0x57, 0x57, 0x58, 0x58, 0x52, 0x55, 0x50, + 0x0c, 0x55, 0x50, 0x50, 0x50, 0xe9, 0xd2, 0x55, 0x55, 0x00, 0x55, 0x55, + 0x58, 0x5b, 0x5b, 0x58, 0x5b, 0x54, 0x02, 0x40, 0x3f, 0x3f, 0x42, 0x42, + 0x42, 0xe9, 0x42, 0x00, 0x42, 0x3f, 0x39, 0x39, 0x39, 0x39, 0x35, 0x2d, + 0x00, 0x2a, 0x20, 0x1a, 0x1a, 0x20, 0x25, 0x30, 0x35, 0x0c, 0x39, 0x3f, + 0x3f, 0x3f, 0xe9, 0x05, 0x45, 0x45, 0x00, 0x48, 0x48, 0x4e, 0x51, 0x52, + 0x5a, 0x5a, 0x5a, 0x80, 0xe9, 0x5a, 0x51, 0x4e, 0x48, 0x46, 0x3f, 0x5e, + 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa5, 0x56, 0x5e, 0x00, 0x4a, 0x4a, + 0x4b, 0x4f, 0x4f, 0x50, 0x51, 0x51, 0x00, 0x51, 0x51, 0x51, 0x58, 0x58, + 0x52, 0x57, 0x5d, 0x04, 0x58, 0x58, 0x50, 0x50, 0x51, 0xe9, 0x50, 0x4f, + 0x15, 0x4b, 0x4b, 0x4b, 0xe9, 0x4b, 0x09, 0x4f, 0xe9, 0x80, 0xd1, 0x54, + 0x51, 0x50, 0x54, 0x44, 0x2f, 0x34, 0x00, 0x38, 0x38, 0x38, 0x39, 0x35, + 0x39, 0x34, 0x34, 0x00, 0x32, 0x32, 0x2f, 0x2f, 0x2c, 0x27, 0x20, 0x12, + 0x00, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x1a, 0x25, 0x2d, 0x00, 0x35, 0x35, + 0x39, 0x35, 0x38, 0x39, 0x39, 0x39, 0x80, 0x01, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3e, 0x3f, 0x42, 0x00, 0x45, 0x4d, 0x4e, 0x52, 0x5a, 0x5a, 0x52, 0x51, + 0x00, 0x4e, 0x49, 0x45, 0x45, 0x42, 0x38, 0x5e, 0x00, 0x38, 0x00, 0x00, + 0xe9, 0xd4, 0xa6, 0x5e, 0x47, 0x47, 0x00, 0x47, 0x47, 0x48, 0x4a, 0x4b, + 0x4b, 0x50, 0x50, 0x10, 0x51, 0x51, 0x51, 0xe9, 0x51, 0x4d, 0x4d, 0x4b, + 0x00, 0x48, 0x3e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3e, 0x42, 0xe0, 0x22, 0x02, + 0xc4, 0x4f, 0x4a, 0x4f, 0x4f, 0x4f, 0x01, 0x4c, 0x35, 0x28, 0x28, 0x2c, + 0x2c, 0x2c, 0xe9, 0x00, 0x28, 0x28, 0x28, 0x23, 0x23, 0x23, 0x1c, 0x12, + 0x00, 0x07, 0x36, 0xf4, 0xa4, 0x76, 0x0e, 0x0d, 0x1a, 0x04, 0x25, 0x2c, + 0x32, 0x32, 0x32, 0xe9, 0x34, 0x34, 0x40, 0x34, 0xe9, 0x34, 0x38, 0x38, + 0x38, 0x3e, 0x3f, 0x00, 0x3e, 0x45, 0x45, 0x49, 0x4e, 0x4e, 0x49, 0x45, + 0x00, 0x45, 0x3e, 0x3f, 0x38, 0x39, 0x44, 0x00, 0x00, 0x70, 0x00, 0xe9, + 0xd4, 0xa6, 0x5e, 0x4c, 0x40, 0x42, 0x00, 0x42, 0x46, 0x47, 0x47, 0x47, + 0x48, 0x4d, 0x4d, 0x00, 0x4d, 0x4d, 0x4d, 0x50, 0x4d, 0x4d, 0x48, 0x57, + 0x00, 0x86, 0xdf, 0xf7, 0xfa, 0xfd, 0xfc, 0xfa, 0xf3, 0x0e, 0xdc, 0x78, + 0x47, 0x3f, 0x2a, 0x11, 0xd4, 0x47, 0x00, 0x48, 0x48, 0x4a, 0x44, 0x2a, + 0x1d, 0x22, 0x22, 0x00, 0x22, 0x22, 0x22, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, + 0x00, 0x1e, 0x17, 0x0d, 0x04, 0x04, 0xa4, 0xf6, 0xf6, 0x00, 0xf6, 0xf6, + 0xa2, 0x0f, 0x18, 0x23, 0x2c, 0x2c, 0x00, 0x2c, 0x2c, 0x2c, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x80, 0xb2, 0x2e, 0x2f, 0x34, 0x37, 0x38, 0x3e, 0x3e, + 0x00, 0x41, 0x45, 0x45, 0x45, 0x3e, 0x3e, 0x38, 0x34, 0x07, 0x2f, 0x35, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x00, 0x4c, 0x39, 0x39, 0x39, + 0x3f, 0x42, 0x3f, 0x00, 0x42, 0x42, 0x42, 0x46, 0x46, 0x48, 0x48, 0x48, + 0x00, 0x47, 0x50, 0xb1, 0xf5, 0xfc, 0xfd, 0xfa, 0xf7, 0x00, 0xf3, 0xf3, + 0xf8, 0xfb, 0xfe, 0xfc, 0xf3, 0x8f, 0x02, 0x3f, 0x3f, 0x3f, 0x40, 0x40, + 0x40, 0xd1, 0x3f, 0x00, 0x42, 0x3f, 0x42, 0x42, 0x42, 0x42, 0x46, 0x47, + 0x00, 0x44, 0x2a, 0x17, 0x15, 0x17, 0x17, 0x17, 0x17, 0x00, 0x17, 0x16, + 0x13, 0x13, 0x13, 0x0d, 0x06, 0x02, 0x00, 0x05, 0xf4, 0xf6, 0xf6, 0xf6, + 0xf6, 0x76, 0x07, 0x00, 0x12, 0x21, 0x24, 0x24, 0x24, 0x24, 0x28, 0x28, + 0xc0, 0xd2, 0xc9, 0x28, 0x28, 0x28, 0x2e, 0x2e, 0x31, 0x00, 0x31, 0x37, + 0x3b, 0x3b, 0x3b, 0x41, 0x3b, 0x37, 0x01, 0x2e, 0x2e, 0x28, 0x3c, 0x00, + 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa7, 0x00, 0x4c, 0x44, 0x32, 0x35, 0x35, + 0x00, 0x39, 0x38, 0x3c, 0x3c, 0x3c, 0x3e, 0x3f, 0x42, 0x00, 0x47, 0x3f, + 0x7d, 0xf3, 0xfd, 0xf9, 0xe9, 0xd1, 0x00, 0xbf, 0xbf, 0xcf, 0xcf, 0xbf, + 0xbf, 0xd1, 0xe9, 0x01, 0xfb, 0xfd, 0xe9, 0x57, 0x39, 0x39, 0x39, 0xe9, + 0x80, 0xd4, 0x3f, 0x3f, 0x3f, 0x3f, 0x40, 0x4c, 0x30, 0x08, 0x1c, 0x0e, + 0x0e, 0x0e, 0xe9, 0x0c, 0x0e, 0x0b, 0x00, 0x06, 0x04, 0x07, 0xa2, 0xf6, + 0xf6, 0xf6, 0xf6, 0x00, 0xf6, 0x64, 0x36, 0x12, 0x16, 0x1e, 0x21, 0x21, + 0x60, 0x21, 0xe9, 0xd4, 0x22, 0x22, 0x22, 0x22, 0x28, 0x00, 0x28, 0x29, + 0x2e, 0x31, 0x31, 0x31, 0x37, 0x37, 0x01, 0x31, 0x28, 0x28, 0x24, 0x00, + 0x00, 0x00, 0xe9, 0xe0, 0xd4, 0xa7, 0x59, 0x4c, 0x33, 0x2c, 0x2c, 0x32, + 0x00, 0x34, 0x34, 0x34, 0x38, 0x3c, 0x3c, 0x42, 0x3e, 0x00, 0xa8, 0xfa, + 0xfb, 0xe4, 0xbf, 0xcf, 0xcf, 0xd1, 0x00, 0xd1, 0xd1, 0xd1, 0xcf, 0xcf, + 0xcf, 0xbf, 0xbf, 0x01, 0xe9, 0xfd, 0xf9, 0x78, 0x34, 0x38, 0x35, 0x09, + 0x80, 0xe9, 0x34, 0x34, 0x38, 0x34, 0x38, 0x38, 0x38, 0x00, 0x38, 0x46, + 0x44, 0x2a, 0x18, 0x10, 0x0b, 0x0b, 0x00, 0x08, 0x0b, 0x0b, 0x12, 0x2b, + 0x36, 0x2b, 0xa4, 0x00, 0xf4, 0xf4, 0xf6, 0xf6, 0xe5, 0x27, 0x36, 0x64, + 0x00, 0x56, 0x3a, 0x2a, 0x21, 0x2a, 0x3a, 0x56, 0x79, 0x00, 0x3a, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x1b, 0x1d, 0x00, 0x1d, 0x1d, 0x22, 0x1f, 0x1f, + 0x26, 0x29, 0x29, 0x40, 0x29, 0xe9, 0x26, 0x22, 0x28, 0x00, 0x00, 0x00, + 0xf0, 0xe9, 0xd4, 0xa7, 0x5a, 0x44, 0x28, 0x28, 0x28, 0x00, 0x2c, 0x2c, + 0x2f, 0x34, 0x39, 0x38, 0x38, 0xa8, 0x00, 0xfb, 0xf7, 0xcd, 0xcd, 0xcd, + 0xcd, 0xd1, 0xd1, 0x10, 0xd1, 0xd1, 0xd1, 0xba, 0xbf, 0xbf, 0xd1, 0xf9, + 0x01, 0xfb, 0x75, 0x2f, 0x34, 0x32, 0x32, 0x32, 0xe9, 0x80, 0xd4, 0x32, + 0x34, 0x34, 0x34, 0x40, 0x43, 0x44, 0x00, 0x3a, 0x3a, 0x44, 0x44, 0x44, + 0x44, 0x3a, 0x07, 0x00, 0x14, 0xf6, 0xf4, 0xf4, 0xf4, 0xf4, 0xa4, 0x12, + 0x00, 0x1a, 0x46, 0x5e, 0x6a, 0x6a, 0x79, 0x6a, 0x6a, 0x01, 0x6a, 0x60, + 0x56, 0x25, 0x17, 0x17, 0x17, 0xe9, 0x00, 0x17, 0x17, 0x19, 0x1b, 0x1b, + 0x1f, 0x1f, 0x1f, 0x81, 0xe9, 0x1f, 0x22, 0x22, 0x00, 0x00, 0x00, 0xe9, + 0xe0, 0xd4, 0xa7, 0x5b, 0x2b, 0x30, 0x22, 0x24, 0x24, 0x00, 0x28, 0x2c, + 0x32, 0x35, 0x38, 0x84, 0xfb, 0xf3, 0x00, 0xbb, 0xcd, 0xcd, 0xcd, 0xd3, + 0xd3, 0xd3, 0xd3, 0x00, 0xd3, 0xcd, 0xd3, 0xcd, 0xca, 0xc3, 0xc3, 0xbb, + 0x00, 0xbb, 0xbb, 0xf9, 0xf9, 0x50, 0x33, 0x2f, 0x2c, 0x19, 0x2f, 0x2f, + 0x2f, 0xe9, 0xd2, 0x2c, 0x2c, 0x9b, 0x00, 0x32, 0x34, 0x32, 0x34, 0x2f, + 0x21, 0x0f, 0x07, 0x00, 0xa2, 0xf4, 0xf4, 0xf4, 0xf4, 0xf6, 0x76, 0x07, + 0x02, 0x18, 0x38, 0x45, 0x49, 0x49, 0x49, 0xe9, 0x45, 0x00, 0x54, 0x44, + 0x17, 0x13, 0x14, 0x14, 0x14, 0x14, 0x00, 0x13, 0x13, 0x13, 0x15, 0x15, + 0x15, 0x19, 0x1b, 0x00, 0x1b, 0x1b, 0x1b, 0x19, 0x15, 0x54, 0x00, 0x00, + 0x78, 0x00, 0xe9, 0xd4, 0xa7, 0x5c, 0x3a, 0x2a, 0x1d, 0x00, 0x23, 0x2c, + 0x33, 0x33, 0x43, 0x48, 0xf8, 0xf7, 0x01, 0xbb, 0xca, 0xca, 0xca, 0xd3, + 0xd3, 0xd3, 0xe9, 0x20, 0xd3, 0xd3, 0xa9, 0xc6, 0xbb, 0xbb, 0xc3, 0xc3, + 0x01, 0xfb, 0xf3, 0x28, 0x2f, 0x28, 0x28, 0x28, 0xe9, 0xc0, 0xd4, 0xa5, + 0x2c, 0x2c, 0x2c, 0x24, 0x18, 0x07, 0x00, 0x08, 0xe5, 0xf4, 0xf4, 0xf4, + 0xf4, 0xf6, 0x1a, 0x01, 0x07, 0x20, 0x37, 0x41, 0x45, 0x45, 0x45, 0xe9, + 0x00, 0x41, 0x3e, 0x46, 0x3a, 0x16, 0x0c, 0x0e, 0x0e, 0x00, 0x0e, 0x0e, + 0x11, 0x11, 0x11, 0x13, 0x13, 0x15, 0x40, 0x15, 0xe1, 0x11, 0x6a, 0xb6, + 0x00, 0x00, 0x00, 0xf0, 0xe9, 0xd4, 0xa7, 0x5d, 0x25, 0x30, 0x24, 0x30, + 0x00, 0x3d, 0x44, 0x44, 0xde, 0xf9, 0xd0, 0xc1, 0xc6, 0x00, 0xce, 0xce, + 0xd3, 0xd9, 0xd9, 0xd8, 0xd8, 0xd9, 0x00, 0xd9, 0xd9, 0xd3, 0xce, 0xce, + 0xc6, 0xc6, 0xc6, 0x00, 0xc3, 0xbb, 0xdf, 0xfd, 0x8c, 0x2a, 0x24, 0x1e, + 0x00, 0x1e, 0x1e, 0x21, 0x23, 0x24, 0x23, 0x24, 0x24, 0x50, 0x23, 0xe1, + 0x24, 0xe9, 0x24, 0x24, 0x28, 0x24, 0x00, 0x1c, 0x0f, 0x03, 0x36, 0xf4, + 0xf4, 0xf4, 0xf4, 0x00, 0xf4, 0xe5, 0x08, 0x07, 0x1e, 0x37, 0x3b, 0x3b, + 0x00, 0x3b, 0x41, 0x41, 0x3b, 0x41, 0x3b, 0x3b, 0x37, 0x02, 0x3e, 0x30, + 0x18, 0x0c, 0x0b, 0x0c, 0xe9, 0x0c, 0x00, 0x0c, 0x0c, 0x0e, 0x11, 0x11, + 0x11, 0x17, 0x60, 0x03, 0x94, 0xa8, 0x79, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xc0, 0xa7, 0x5e, 0x3a, 0x2a, 0x33, 0x4c, 0x6a, 0xf9, 0x00, 0xe9, 0xc1, + 0xc1, 0xc6, 0xcc, 0xcc, 0xd6, 0xd9, 0x00, 0xd9, 0xd9, 0xdb, 0xdb, 0xd9, + 0xd9, 0xd6, 0xce, 0x00, 0xcc, 0xcc, 0xc6, 0xc6, 0xc1, 0xb4, 0xaa, 0xf7, + 0x00, 0xf7, 0x3a, 0x18, 0x12, 0x12, 0x12, 0x14, 0x1c, 0x07, 0x1d, 0x21, + 0x21, 0x21, 0x22, 0xe9, 0xc9, 0xb1, 0x00, 0x21, 0x1d, 0x12, 0x04, 0x04, + 0xa4, 0xef, 0xef, 0x00, 0xef, 0xef, 0xf4, 0xa4, 0x04, 0x07, 0x1c, 0x2e, + 0x00, 0x37, 0x37, 0x3b, 0x3b, 0x3b, 0x3b, 0x37, 0x37, 0x00, 0x37, 0x31, + 0x31, 0x31, 0x33, 0x25, 0x10, 0x0b, 0x00, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0c, 0x08, 0x00, 0x13, 0x54, 0x80, 0x77, 0x7a, 0xa8, 0xa8, 0x00, + 0x3c, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5c, 0xb6, 0xe4, 0x00, 0xe9, 0xf3, + 0xf2, 0xe9, 0xed, 0xf7, 0xc5, 0xc5, 0x00, 0xc5, 0xc5, 0xcc, 0xd2, 0xd6, + 0xd6, 0xd6, 0xd7, 0x20, 0xd7, 0xd7, 0xd1, 0xd6, 0xd6, 0xcc, 0xcc, 0xc1, + 0x00, 0xc1, 0xb7, 0xb1, 0xdc, 0xf9, 0x79, 0x64, 0x12, 0x00, 0x09, 0x07, + 0x09, 0x10, 0x17, 0x1d, 0x1d, 0x1d, 0x04, 0x1b, 0x1d, 0x1e, 0x21, 0x21, + 0xc1, 0x1d, 0x1d, 0x00, 0x1c, 0x14, 0x09, 0x03, 0x06, 0xef, 0xef, 0xef, + 0x00, 0xef, 0xef, 0xf4, 0xa2, 0x02, 0x03, 0x09, 0x1d, 0x02, 0x22, 0x29, + 0x2e, 0x31, 0x31, 0x31, 0xe9, 0x2e, 0x00, 0x29, 0x28, 0x28, 0x33, 0x60, + 0x71, 0x30, 0x17, 0x00, 0x10, 0x10, 0x10, 0x1c, 0x3c, 0x71, 0x8d, 0x82, + 0x00, 0x7e, 0x77, 0x71, 0x8c, 0x8c, 0x00, 0x00, 0x00, 0xf0, 0xe9, 0xd4, + 0xa7, 0x59, 0xb6, 0xe9, 0xf3, 0xf3, 0x00, 0xf3, 0xed, 0xe9, 0xed, 0xf3, + 0xf7, 0xe4, 0xc5, 0x00, 0xc5, 0xc2, 0xc0, 0xcb, 0xcb, 0xd2, 0xd2, 0xd6, + 0x00, 0xda, 0xda, 0xda, 0xda, 0xda, 0xd6, 0xd6, 0xd6, 0x00, 0xd2, 0xc1, + 0xc0, 0xb7, 0xb1, 0xae, 0x93, 0xe7, 0x00, 0xde, 0xa2, 0xf1, 0xa4, 0x76, + 0x07, 0x09, 0x14, 0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1c, 0x30, 0x30, + 0x40, 0x27, 0xba, 0x16, 0x0d, 0x04, 0x03, 0xa2, 0xef, 0x00, 0xef, 0xef, + 0xef, 0xef, 0xf4, 0x0f, 0x03, 0x02, 0x00, 0x03, 0x09, 0x0d, 0x14, 0x19, + 0x1f, 0x26, 0x29, 0x00, 0x29, 0x29, 0x29, 0x26, 0x26, 0x1f, 0x28, 0x2c, + 0x10, 0xad, 0xad, 0xad, 0xe9, 0xad, 0x9a, 0x9a, 0x96, 0x00, 0x89, 0x82, + 0x7b, 0x71, 0x6d, 0x74, 0x8c, 0x00, 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x00, 0x00, 0xe9, 0x00, 0xed, 0xe4, 0xdc, 0xb8, 0xb4, 0xb8, 0xb0, 0xb0, + 0x00, 0xb1, 0xb1, 0xb1, 0xb7, 0xc2, 0xc2, 0xc8, 0xc8, 0x00, 0xcb, 0xcb, + 0xd5, 0xd5, 0xd5, 0xd5, 0xda, 0xda, 0x00, 0xda, 0xda, 0xd2, 0xcb, 0xcb, + 0xc0, 0xc0, 0xb7, 0x00, 0xae, 0xa3, 0x8f, 0xb6, 0xe7, 0xe0, 0xf6, 0xf6, + 0x00, 0xa4, 0x2b, 0x2b, 0x3a, 0x2a, 0x2a, 0x2a, 0x3a, 0x00, 0x56, 0x56, + 0x79, 0x79, 0x64, 0x25, 0x13, 0x17, 0x00, 0x16, 0x10, 0x09, 0x03, 0x01, + 0xe0, 0xee, 0xee, 0x00, 0xee, 0xee, 0xef, 0xef, 0xe5, 0xa4, 0x36, 0x05, + 0x00, 0x03, 0x03, 0x03, 0x09, 0x0d, 0x10, 0x17, 0x1b, 0x00, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x24, 0x71, 0xad, 0x00, 0xad, 0xad, 0xad, 0xad, 0x9a, + 0x9a, 0x9a, 0x96, 0x00, 0x89, 0x89, 0x7b, 0x7b, 0x71, 0x67, 0x68, 0x8c, + 0x0e, 0x64, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa6, 0xb6, 0x00, 0xed, 0xdf, + 0xb8, 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0x00, 0xb1, 0xb1, 0xae, 0xae, 0xae, + 0xb3, 0xbd, 0xbd, 0x00, 0xbd, 0xc8, 0xc8, 0xcb, 0xcb, 0xd5, 0xd5, 0xd4, + 0x00, 0xd5, 0xd5, 0xd5, 0xd5, 0xcb, 0xcb, 0xc8, 0xc8, 0x00, 0xbd, 0xb3, + 0xae, 0x9c, 0x8c, 0x79, 0xe7, 0xf6, 0x00, 0xf6, 0xf6, 0x76, 0x56, 0x64, + 0x6a, 0x79, 0x79, 0x40, 0x79, 0xe9, 0x79, 0x6e, 0x6a, 0x56, 0x17, 0x13, + 0x00, 0x14, 0x0d, 0x04, 0x02, 0x36, 0xef, 0xec, 0xec, 0x00, 0xee, 0xee, + 0xee, 0xee, 0xef, 0xef, 0xf4, 0xe5, 0x00, 0xa4, 0x36, 0x05, 0x03, 0x03, + 0x04, 0x09, 0x0d, 0x00, 0x13, 0x19, 0x1b, 0x1b, 0x22, 0x45, 0xad, 0xad, + 0x00, 0xad, 0xad, 0xad, 0x9a, 0x9a, 0x9a, 0x96, 0x96, 0x00, 0x89, 0x7f, + 0x7b, 0x71, 0x71, 0x67, 0x60, 0x79, 0x0e, 0x79, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa5, 0xdc, 0x00, 0xe4, 0xdc, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xae, + 0x00, 0xae, 0xa3, 0xa6, 0xa6, 0xa6, 0xac, 0xac, 0xba, 0x00, 0xbd, 0xc8, + 0xc8, 0xc8, 0xc8, 0xd4, 0xd4, 0xd4, 0x80, 0xe9, 0xd4, 0xd4, 0xc8, 0xc8, + 0xc9, 0xbd, 0xbc, 0x00, 0xb3, 0xa6, 0x94, 0x79, 0x79, 0xa2, 0xf4, 0xf4, + 0x00, 0xf6, 0x44, 0x2b, 0x44, 0x4f, 0x5e, 0x5e, 0x5e, 0x00, 0x58, 0x50, + 0x4b, 0x50, 0x51, 0x5e, 0x56, 0x3a, 0x00, 0x10, 0x0d, 0x06, 0x03, 0x03, + 0xa4, 0xea, 0xec, 0x00, 0xec, 0xec, 0xec, 0xec, 0xee, 0xee, 0xee, 0xee, + 0x00, 0xef, 0xef, 0xf4, 0xe5, 0xa4, 0x36, 0x05, 0x04, 0x00, 0x04, 0x09, + 0x11, 0x17, 0x19, 0x2c, 0x9a, 0x9a, 0x60, 0x9a, 0xe9, 0xd1, 0x96, 0x8a, + 0x89, 0x7f, 0x7b, 0x00, 0x71, 0x67, 0x60, 0x5d, 0x79, 0x8c, 0x00, 0x00, + 0x70, 0x00, 0xe9, 0xd4, 0xa5, 0xdf, 0xb1, 0xa3, 0xa3, 0x40, 0xa3, 0xe9, + 0xa6, 0xa6, 0xa6, 0xa1, 0xa1, 0xa1, 0x00, 0xa9, 0xac, 0xb3, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbe, 0x11, 0xc9, 0xc9, 0xc9, 0xe9, 0xc9, 0xbe, 0xbe, 0x91, + 0x00, 0xb3, 0xac, 0x9c, 0x8c, 0x56, 0x75, 0xf1, 0xf4, 0x00, 0xf4, 0xe5, + 0x79, 0x79, 0x8c, 0x8c, 0x75, 0x57, 0x00, 0x48, 0x48, 0x4b, 0x48, 0x4b, + 0x47, 0x46, 0x5e, 0x00, 0x3a, 0x25, 0x0a, 0x04, 0x03, 0x04, 0xea, 0xe8, + 0x00, 0xea, 0xea, 0xea, 0xec, 0xec, 0xec, 0xec, 0xee, 0x00, 0xee, 0xee, + 0xee, 0xef, 0xef, 0xef, 0xf4, 0xe5, 0x00, 0xa4, 0x36, 0x04, 0x0b, 0x13, + 0x22, 0x8a, 0x9a, 0x20, 0x9a, 0x9a, 0xe9, 0x9a, 0x9a, 0x96, 0x8a, 0x8a, + 0x00, 0x89, 0x7f, 0x70, 0x71, 0x67, 0x5d, 0x5a, 0x6a, 0x0e, 0x80, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa4, 0xde, 0x00, 0xa3, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0xa6, 0xa6, 0x00, 0xa1, 0xa1, 0xa1, 0xa0, 0xa1, 0xa1, 0xa9, 0xa9, + 0x06, 0xaf, 0xb5, 0xb9, 0xb9, 0xb9, 0xe9, 0xd4, 0xb9, 0x00, 0xb5, 0xb5, + 0xb2, 0xaf, 0xa1, 0x94, 0x79, 0x56, 0x00, 0x76, 0xf4, 0xf4, 0xf4, 0xa4, + 0xde, 0xde, 0xe7, 0x00, 0xe7, 0xf3, 0xe7, 0xb6, 0x6c, 0x47, 0x47, 0x47, + 0x00, 0x43, 0x3f, 0x40, 0x54, 0x3a, 0x1a, 0x04, 0x03, 0x00, 0xa2, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xea, 0xea, 0x00, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xee, 0xee, 0xee, 0x00, 0xee, 0xef, 0xef, 0xef, 0xa4, 0x05, 0x06, 0x1d, + 0x00, 0x7f, 0x8a, 0x8a, 0x8a, 0x8a, 0x9a, 0x8a, 0x9a, 0x80, 0xca, 0x8a, + 0x7f, 0x7b, 0x70, 0x67, 0x5f, 0x5d, 0x03, 0x52, 0x5e, 0x7a, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0x80, 0xa3, 0xdc, 0xa8, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x00, 0x98, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9e, 0xa0, 0x01, 0xa0, 0xa0, + 0xa0, 0xa0, 0xaf, 0xaf, 0xaf, 0xe9, 0xc0, 0xd4, 0xa2, 0xab, 0xa7, 0x9c, + 0x8c, 0x6a, 0x6a, 0x00, 0xa4, 0xef, 0xef, 0xf4, 0xa2, 0x2b, 0x2b, 0x56, + 0x00, 0x6a, 0x8c, 0xde, 0xe7, 0xe7, 0xa8, 0x52, 0x3f, 0x00, 0x39, 0x39, + 0x39, 0x39, 0x43, 0x2a, 0x0f, 0x04, 0x04, 0xe0, 0xea, 0xe8, 0xe8, 0xe8, + 0xe9, 0xea, 0xea, 0x00, 0xea, 0xec, 0xec, 0xec, 0xec, 0xec, 0xee, 0xee, + 0x00, 0xee, 0xe5, 0x04, 0x03, 0x1e, 0x71, 0x7b, 0x7f, 0x0c, 0x7f, 0x8a, + 0x8a, 0x8a, 0xe9, 0xd1, 0x7f, 0x7f, 0x00, 0x70, 0x70, 0x65, 0x5d, 0x5a, + 0x51, 0x5e, 0x6a, 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa3, 0xb6, 0x8f, + 0x00, 0x8f, 0x8f, 0x8f, 0x8f, 0x94, 0x94, 0x95, 0x99, 0x01, 0x9e, 0x99, + 0x9e, 0x99, 0x9e, 0x9e, 0x9e, 0xe9, 0x1c, 0xa7, 0xa7, 0xa7, 0xe9, 0xd4, + 0xa1, 0x9f, 0x9f, 0x00, 0x94, 0x79, 0x56, 0x79, 0xee, 0xee, 0xef, 0xef, + 0x00, 0xa2, 0x79, 0x55, 0x56, 0x56, 0x56, 0x6a, 0x75, 0x00, 0xb6, 0xe7, + 0xde, 0x63, 0x35, 0x35, 0x35, 0x35, 0x00, 0x32, 0x3d, 0x25, 0x07, 0x07, + 0x36, 0x76, 0xa2, 0x00, 0xa4, 0xa4, 0xe0, 0xe8, 0xee, 0xee, 0xec, 0xea, + 0x00, 0xea, 0xec, 0xec, 0xec, 0xec, 0xec, 0xee, 0x07, 0x00, 0x03, 0x25, + 0x5d, 0x65, 0x70, 0x70, 0x7b, 0x7f, 0x02, 0x7f, 0x7f, 0x8a, 0x8a, 0x8a, + 0x8a, 0xc9, 0x7b, 0x00, 0x70, 0x65, 0x5f, 0x5a, 0x51, 0x4e, 0x5e, 0x56, + 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa2, 0xa8, 0x93, 0x00, 0x86, 0x86, + 0x88, 0x88, 0x88, 0x91, 0x91, 0x94, 0x04, 0x97, 0x94, 0x97, 0x97, 0x97, + 0xe9, 0x99, 0x99, 0x00, 0x99, 0x9d, 0x9f, 0x9e, 0x9d, 0x9d, 0x9d, 0x9d, + 0xc0, 0xb9, 0xca, 0x9d, 0x9d, 0x97, 0x8b, 0x6a, 0x6a, 0x00, 0xa2, 0xec, + 0xec, 0xee, 0xee, 0xef, 0xef, 0xe0, 0x00, 0xa2, 0x79, 0x58, 0x5e, 0x6a, + 0x74, 0x7d, 0xde, 0x00, 0xde, 0x68, 0x2c, 0x32, 0x32, 0x2d, 0x2a, 0x25, + 0x00, 0x25, 0x0f, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x01, 0x03, + 0x36, 0x76, 0xa4, 0xec, 0xea, 0xea, 0x00, 0xea, 0xec, 0xef, 0x76, 0x07, + 0x1a, 0x3c, 0x4e, 0x00, 0x5a, 0x65, 0x65, 0x70, 0x70, 0x7b, 0x7f, 0x7f, + 0x40, 0x7f, 0xe9, 0x7f, 0x70, 0x70, 0x65, 0x65, 0x5a, 0x01, 0x5a, 0x4e, + 0x48, 0x54, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa3, 0xa8, 0x84, 0x7d, + 0x7d, 0x7d, 0x84, 0x00, 0x84, 0x84, 0x8b, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x40, 0x94, 0xd3, 0x91, 0x91, 0x97, 0x97, 0x97, 0x97, 0x04, 0x95, 0x95, + 0x95, 0x95, 0x95, 0xba, 0x97, 0x97, 0x00, 0x92, 0x85, 0x6a, 0x69, 0xe0, + 0xea, 0xea, 0xec, 0x00, 0xec, 0xec, 0xee, 0xee, 0xef, 0xf4, 0xe0, 0xa2, + 0x00, 0x64, 0x6a, 0x78, 0x7d, 0xb6, 0xde, 0x55, 0x2c, 0x00, 0x2c, 0x2c, + 0x2a, 0x27, 0x20, 0x20, 0x1a, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x02, 0x02, + 0xe9, 0xa4, 0xe8, 0x00, 0xe8, 0xe8, 0xea, 0xea, 0xa4, 0x12, 0x0f, 0x30, + 0x00, 0x3c, 0x4e, 0x5a, 0x5a, 0x65, 0x65, 0x65, 0x70, 0x00, 0x70, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7b, 0x70, 0x70, 0x00, 0x70, 0x65, 0x5a, 0x5a, 0x4e, + 0x45, 0x46, 0x54, 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa3, 0x8c, 0x78, + 0x00, 0x78, 0x78, 0x7a, 0x7d, 0x7d, 0x83, 0x84, 0x8b, 0x08, 0x8b, 0x8d, + 0x8d, 0x8d, 0xe9, 0x8b, 0x8b, 0x8b, 0x8c, 0xe9, 0x8e, 0x8e, 0x8e, 0xe9, + 0xd1, 0x90, 0x91, 0x00, 0x91, 0x91, 0x91, 0x8d, 0x80, 0x6a, 0x76, 0xec, + 0x00, 0xe8, 0xe8, 0xe8, 0xea, 0xea, 0xec, 0xec, 0xee, 0x00, 0xee, 0xee, + 0xef, 0x64, 0x6a, 0x74, 0x78, 0x78, 0x00, 0xb6, 0xb6, 0x32, 0x27, 0x27, + 0x27, 0x27, 0x21, 0x00, 0x21, 0x20, 0x20, 0x20, 0x20, 0x1a, 0x0f, 0x07, + 0x00, 0x03, 0x02, 0x05, 0xe5, 0xe8, 0xe8, 0xe8, 0xe8, 0x00, 0xe0, 0x0e, + 0x07, 0x1a, 0x30, 0x3e, 0x45, 0x49, 0x00, 0x4e, 0x5a, 0x5a, 0x65, 0x65, + 0x70, 0x70, 0x70, 0x80, 0xe9, 0x70, 0x65, 0x65, 0x5a, 0x5a, 0x4e, 0x49, + 0x03, 0x45, 0x46, 0x54, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x80, 0xa2, 0x6a, + 0x8c, 0x75, 0x75, 0x75, 0x75, 0x75, 0x01, 0x7a, 0x80, 0x80, 0x83, 0x85, + 0x85, 0x85, 0xe9, 0x02, 0x83, 0x82, 0x83, 0x80, 0x80, 0x80, 0x89, 0x83, + 0x20, 0x83, 0x81, 0xe1, 0x87, 0x87, 0x87, 0x87, 0x8b, 0x00, 0x87, 0x85, + 0x80, 0x6a, 0x64, 0x76, 0xa2, 0xa4, 0x00, 0xa4, 0xe0, 0xe5, 0xec, 0xea, + 0xec, 0xec, 0xef, 0x00, 0x76, 0x56, 0x6a, 0x7a, 0x7c, 0x78, 0x78, 0xb6, + 0x00, 0x79, 0x23, 0x23, 0x23, 0x23, 0x21, 0x21, 0x21, 0x80, 0xe9, 0x21, + 0x18, 0x12, 0x07, 0x03, 0xa2, 0xe8, 0x00, 0xe8, 0xe8, 0xe8, 0xe8, 0x0f, + 0x03, 0x0f, 0x20, 0x00, 0x2c, 0x38, 0x3e, 0x3e, 0x45, 0x49, 0x4e, 0x53, + 0x08, 0x5a, 0x65, 0x65, 0x65, 0xe9, 0x65, 0x65, 0x5a, 0x00, 0x53, 0x4e, + 0x49, 0x45, 0x3e, 0x46, 0x44, 0x00, 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa2, + 0x79, 0x75, 0x6c, 0x00, 0x6c, 0x6c, 0x6c, 0x74, 0x74, 0x7a, 0x7a, 0x7e, + 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7e, 0x7a, 0x7a, 0x00, 0x7a, 0x75, + 0x74, 0x74, 0x74, 0x75, 0x75, 0x77, 0x00, 0x77, 0x77, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7c, 0x81, 0x00, 0x81, 0x81, 0x81, 0x81, 0x7a, 0x6e, 0x5e, 0x56, + 0x00, 0x56, 0x56, 0x44, 0x4c, 0x60, 0x76, 0xea, 0xe8, 0x00, 0xea, 0xa4, + 0x54, 0x56, 0x6a, 0x7a, 0x7a, 0x75, 0x01, 0x72, 0x8c, 0xa8, 0x32, 0x21, + 0x21, 0x21, 0xe9, 0x80, 0xd1, 0x1e, 0x18, 0x0f, 0x03, 0x05, 0xe3, 0xe5, + 0x00, 0xe8, 0xe8, 0xe8, 0x76, 0x03, 0x07, 0x12, 0x1e, 0x00, 0x28, 0x2e, + 0x34, 0x3e, 0x3e, 0x41, 0x45, 0x49, 0x00, 0x53, 0x53, 0x53, 0x65, 0x65, + 0x65, 0x65, 0x65, 0x00, 0x53, 0x53, 0x49, 0x49, 0x41, 0x3e, 0x38, 0x46, + 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa3, 0x79, 0x6c, 0x00, 0x63, 0x63, + 0x68, 0x68, 0x6c, 0x6c, 0x74, 0x74, 0x08, 0x74, 0x74, 0x7a, 0x7a, 0xd2, + 0x6c, 0x6c, 0x6b, 0x00, 0x6b, 0x6c, 0x68, 0x68, 0x68, 0x6b, 0x6c, 0x6c, + 0x00, 0x6f, 0x72, 0x72, 0x72, 0x73, 0x73, 0x77, 0x77, 0x00, 0x77, 0x77, + 0x73, 0x6f, 0x6e, 0x6a, 0x5e, 0x44, 0x00, 0x2b, 0x07, 0x44, 0xe0, 0xe8, + 0xe8, 0xe0, 0x58, 0x00, 0x3a, 0x56, 0x6a, 0x74, 0x77, 0x75, 0x6c, 0x66, + 0x01, 0xa8, 0x6a, 0x1d, 0x1e, 0x1e, 0x1c, 0x1e, 0xe1, 0x00, 0x1c, 0x18, + 0x12, 0x07, 0x03, 0x76, 0xe5, 0xe5, 0x00, 0xe5, 0xe8, 0xa4, 0x04, 0x03, + 0x0f, 0x18, 0x1e, 0x00, 0x24, 0x28, 0x2e, 0x2e, 0x37, 0x3b, 0x41, 0x41, + 0x08, 0x49, 0x53, 0x53, 0x53, 0xe9, 0x53, 0x53, 0x49, 0x00, 0x49, 0x41, + 0x3b, 0x37, 0x38, 0x42, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa3, 0x56, + 0x63, 0x62, 0x62, 0x00, 0x62, 0x62, 0x62, 0x68, 0x68, 0x6b, 0x6d, 0x6d, + 0x02, 0x6d, 0x6d, 0x6e, 0x68, 0x68, 0x68, 0x82, 0x5c, 0x20, 0x62, 0x5c, + 0x4a, 0x66, 0x66, 0x66, 0x66, 0x69, 0x40, 0x69, 0x39, 0x6f, 0x6f, 0x6f, + 0x6d, 0x6e, 0x60, 0x00, 0x54, 0x3a, 0x3a, 0x76, 0xe8, 0xe8, 0xe5, 0x56, + 0x00, 0x3a, 0x56, 0x6a, 0x6e, 0x6d, 0x6c, 0x6d, 0x6c, 0x00, 0x66, 0x79, + 0x8c, 0x17, 0x17, 0x1c, 0x16, 0x16, 0x40, 0x16, 0xe9, 0x12, 0x07, 0x03, + 0x05, 0xe0, 0xe3, 0x00, 0xe3, 0xe3, 0xe0, 0x05, 0x02, 0x07, 0x12, 0x16, + 0x00, 0x17, 0x21, 0x23, 0x26, 0x28, 0x2e, 0x31, 0x3b, 0x01, 0x3b, 0x41, + 0x49, 0x49, 0x49, 0x53, 0x53, 0xd9, 0x00, 0x41, 0x41, 0x3b, 0x31, 0x37, + 0x35, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa5, 0x6a, 0x55, 0x58, 0x58, + 0x00, 0x5c, 0x5c, 0x60, 0x60, 0x60, 0x62, 0x62, 0x60, 0x00, 0x61, 0x62, + 0x5c, 0x5c, 0x58, 0x58, 0x58, 0x55, 0x30, 0x55, 0x55, 0xe9, 0xd1, 0x58, + 0x5b, 0x61, 0x61, 0x40, 0x61, 0xe9, 0x66, 0x66, 0x66, 0x69, 0x69, 0x69, + 0x00, 0x67, 0x54, 0x3a, 0x42, 0xa4, 0xe3, 0xe8, 0x76, 0x00, 0x3a, 0x3a, + 0x5e, 0x68, 0x6e, 0x6e, 0x68, 0x62, 0x00, 0x62, 0x61, 0x63, 0x8c, 0x3d, + 0x17, 0x16, 0x16, 0x00, 0x14, 0x16, 0x14, 0x14, 0x10, 0x09, 0x07, 0x07, + 0x00, 0x76, 0xe3, 0xe3, 0xe3, 0xe3, 0x07, 0x02, 0x04, 0x00, 0x09, 0x14, + 0x17, 0x17, 0x17, 0x1d, 0x22, 0x1f, 0x00, 0x26, 0x29, 0x31, 0x37, 0x3b, + 0x3b, 0x41, 0x41, 0x40, 0x41, 0xe9, 0x41, 0x3b, 0x37, 0x31, 0x2e, 0x2f, + 0x0e, 0x33, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa5, 0x6a, 0x00, 0x4f, 0x4f, + 0x54, 0x54, 0x55, 0x58, 0x58, 0x58, 0x80, 0xe9, 0x58, 0x55, 0x55, 0x54, + 0x4f, 0x4f, 0x4f, 0xe8, 0xe9, 0xd4, 0xa1, 0x50, 0x31, 0x57, 0x57, 0x57, + 0x00, 0x5f, 0x5f, 0x5f, 0x5c, 0x54, 0x44, 0x3a, 0x64, 0x00, 0xe3, 0xe3, + 0xa2, 0x3a, 0x3a, 0x4c, 0x60, 0x67, 0x00, 0x67, 0x67, 0x60, 0x5c, 0x58, + 0x58, 0x55, 0x79, 0x00, 0x64, 0x56, 0x56, 0x3a, 0x25, 0x25, 0x25, 0x3a, + 0x00, 0x3a, 0x36, 0x36, 0x02, 0xe0, 0xe3, 0xe3, 0xe3, 0x00, 0x36, 0x02, + 0x03, 0x09, 0x0d, 0x14, 0x14, 0x16, 0x00, 0x17, 0x17, 0x17, 0x1d, 0x1f, + 0x26, 0x2e, 0x2e, 0x00, 0x31, 0x37, 0x37, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x00, 0x37, 0x31, 0x31, 0x2e, 0x29, 0x2e, 0x00, 0x00, 0x70, 0x00, 0xe9, + 0xd4, 0xa6, 0x5e, 0x47, 0x46, 0x4a, 0x02, 0x4a, 0x4f, 0x4f, 0x4f, 0x4f, + 0x54, 0xd9, 0x4a, 0x03, 0x4a, 0x4a, 0x47, 0x43, 0x43, 0x43, 0xe9, 0xd4, + 0x08, 0x43, 0x43, 0x47, 0x47, 0x11, 0x50, 0x50, 0x51, 0x00, 0x58, 0x58, + 0x54, 0x44, 0x3a, 0x30, 0xa4, 0xe3, 0x00, 0xa4, 0x38, 0x2b, 0x44, 0x54, + 0x60, 0x60, 0x67, 0x00, 0x60, 0x5d, 0x58, 0x51, 0x4f, 0x4a, 0x6a, 0x00, + 0x30, 0x00, 0x00, 0xe9, 0xd4, 0xe3, 0xe3, 0xe3, 0xa2, 0x00, 0x03, 0x02, + 0x04, 0x0d, 0x0d, 0x10, 0x10, 0x14, 0x00, 0x10, 0x13, 0x17, 0x17, 0x1b, + 0x1f, 0x1f, 0x26, 0x04, 0x29, 0x29, 0x31, 0x31, 0x31, 0xe9, 0x31, 0x29, + 0x03, 0x29, 0x26, 0x22, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x80, 0xa7, 0x00, + 0x4c, 0x40, 0x40, 0x40, 0x43, 0x46, 0x00, 0x47, 0x48, 0x47, 0x47, 0x46, + 0x46, 0x43, 0x43, 0x00, 0x40, 0x40, 0x39, 0x39, 0x39, 0x39, 0x39, 0x3d, + 0xe0, 0x59, 0x41, 0xd3, 0x43, 0x43, 0x43, 0x43, 0x46, 0x00, 0x46, 0x46, + 0x3d, 0x30, 0x1a, 0x36, 0xe3, 0xe0, 0x00, 0x3a, 0x1a, 0x3a, 0x4c, 0x51, + 0x5d, 0x5d, 0x5d, 0x00, 0x5d, 0x5a, 0x54, 0x4d, 0x48, 0x46, 0x5e, 0x00, + 0x30, 0x00, 0x00, 0xe9, 0xd3, 0xe3, 0xe3, 0xe3, 0xa4, 0x00, 0x01, 0x02, + 0x04, 0x06, 0x0d, 0x0b, 0x0c, 0x0c, 0x00, 0x0c, 0x0c, 0x0e, 0x11, 0x13, + 0x13, 0x15, 0x1b, 0x00, 0x1f, 0x1f, 0x26, 0x29, 0x26, 0x29, 0x29, 0x29, + 0x00, 0x26, 0x26, 0x26, 0x1f, 0x1f, 0x12, 0x00, 0x00, 0x70, 0x00, 0xe9, + 0xd4, 0xa7, 0x00, 0x4c, 0x35, 0x35, 0x04, 0x39, 0x39, 0x39, 0x39, 0x3c, + 0xda, 0x35, 0x35, 0x00, 0x32, 0x32, 0x32, 0x32, 0x2d, 0x2d, 0x2d, 0x32, + 0x1c, 0x35, 0x35, 0x35, 0xe9, 0xd4, 0x0a, 0x39, 0x35, 0x00, 0x30, 0x1a, + 0x18, 0xa4, 0xe3, 0x36, 0x1a, 0x25, 0x00, 0x3d, 0x4e, 0x51, 0x5a, 0x5a, + 0x5a, 0x51, 0x4e, 0x00, 0x4e, 0x48, 0x46, 0x42, 0x5e, 0x00, 0x00, 0x00, + 0xc0, 0xe9, 0xd3, 0xe3, 0xe3, 0xe3, 0x03, 0x02, 0x03, 0x00, 0x06, 0x09, + 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x00, 0x0c, 0x0e, 0x0e, 0x11, 0x13, + 0x15, 0x15, 0x15, 0x00, 0x1b, 0x1b, 0x1f, 0x1f, 0x1f, 0x26, 0x1f, 0x1b, + 0x03, 0x1b, 0x1b, 0x12, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xc0, 0xa7, 0x59, + 0x3d, 0x2c, 0x2c, 0x2f, 0x34, 0x32, 0x00, 0x32, 0x32, 0x33, 0x2d, 0x2d, + 0x2c, 0x2c, 0x28, 0x10, 0x27, 0x27, 0x27, 0xe9, 0x2c, 0x2d, 0x2d, 0x2d, + 0xc8, 0xe9, 0xd4, 0x2d, 0x2d, 0x11, 0x2a, 0x20, 0x1a, 0x00, 0x2b, 0xe3, + 0xa2, 0x1a, 0x1a, 0x30, 0x3c, 0x45, 0x00, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x45, 0x45, 0x42, 0x03, 0x3f, 0x38, 0x54, 0x00, 0x00, 0x00, 0xe9, 0xd2, + 0x10, 0xe3, 0xe3, 0xe3, 0x99, 0x0f, 0x09, 0x08, 0x0a, 0x20, 0x0a, 0x0a, + 0xe9, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x00, 0x11, 0x13, 0x13, 0x15, 0x15, + 0x15, 0x15, 0x1b, 0xbe, 0xda, 0x07, 0x11, 0xe9, 0xd4, 0xa7, 0x5a, 0x3a, + 0x00, 0x21, 0x21, 0x23, 0x24, 0x24, 0x24, 0x24, 0x23, 0x00, 0x24, 0x23, + 0x21, 0x21, 0x21, 0x1e, 0x1e, 0x1c, 0x00, 0x1c, 0x1c, 0x1c, 0x1e, 0x23, + 0x27, 0x27, 0x27, 0xc0, 0xe9, 0xd2, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x27, + 0x00, 0x20, 0x1a, 0x0f, 0xa4, 0xa4, 0x10, 0x0f, 0x25, 0x04, 0x33, 0x3c, + 0x45, 0x45, 0x45, 0xe9, 0x42, 0x42, 0x01, 0x3c, 0x35, 0x32, 0x4c, 0x00, + 0x00, 0x00, 0xe9, 0x90, 0xd2, 0xe3, 0xe3, 0xa3, 0x1a, 0x0d, 0x06, 0x08, + 0x02, 0x08, 0x06, 0x08, 0x0a, 0x0a, 0x0a, 0xe9, 0x0c, 0x00, 0x0c, 0x0e, + 0x0e, 0x0e, 0x11, 0x13, 0x11, 0x11, 0x3c, 0x11, 0x15, 0x1b, 0xdb, 0xb7, + 0x6f, 0x3a, 0x1c, 0x04, 0x17, 0x17, 0x17, 0x1c, 0x17, 0xd2, 0x16, 0x16, + 0x40, 0x16, 0xe9, 0x14, 0x14, 0x3a, 0x79, 0x64, 0x21, 0x38, 0x21, 0x21, + 0xe9, 0xd4, 0xa1, 0x18, 0x12, 0x0f, 0x00, 0xe0, 0x0f, 0x0f, 0x1a, 0x1e, + 0x2c, 0x34, 0x38, 0x00, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x38, 0x38, 0x34, + 0x06, 0x2f, 0x33, 0x00, 0x00, 0x00, 0xe9, 0xd2, 0xe3, 0x20, 0xe3, 0xe3, + 0x9c, 0x07, 0x14, 0x09, 0x06, 0x08, 0x08, 0x06, 0x08, 0x08, 0x08, 0xe9, + 0x08, 0x08, 0x0b, 0x01, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x11, 0x09, 0x24, + 0xe0, 0xd4, 0xa7, 0x5f, 0x25, 0x16, 0x14, 0x14, 0x14, 0x02, 0x14, 0x10, + 0x14, 0x10, 0x10, 0x10, 0xe9, 0x0d, 0x00, 0x0d, 0x0d, 0x3a, 0x79, 0x00, + 0x76, 0x56, 0x17, 0x18, 0x1e, 0x1e, 0x1e, 0xe9, 0xd3, 0x1c, 0x16, 0x12, + 0x00, 0x09, 0xa4, 0x36, 0x0f, 0x12, 0x18, 0x1e, 0x28, 0x00, 0x2c, 0x2e, + 0x34, 0x37, 0x37, 0x37, 0x37, 0x2e, 0x01, 0x2e, 0x28, 0x28, 0x33, 0x00, + 0x00, 0x00, 0xe9, 0x90, 0xd2, 0xe3, 0xe3, 0xa7, 0x07, 0x12, 0x06, 0x06, + 0x44, 0x06, 0xe9, 0x08, 0x08, 0x08, 0xe9, 0x08, 0x0a, 0x3c, 0x11, 0x09, + 0x2f, 0xbf, 0x77, 0x2c, 0x07, 0x18, 0x01, 0x0b, 0x0b, 0x0d, 0x0d, 0x0a, + 0x0a, 0x0a, 0xe9, 0x04, 0x0a, 0x0a, 0x0d, 0x56, 0x76, 0x01, 0x76, 0x79, + 0x00, 0x20, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x1c, 0x40, 0x1c, 0xc1, + 0x14, 0x0d, 0x07, 0x76, 0x09, 0x0d, 0x00, 0x12, 0x1c, 0x1e, 0x22, 0x28, + 0x28, 0x2e, 0x29, 0x00, 0x2e, 0x2e, 0x2e, 0x28, 0x26, 0x24, 0x21, 0x30, + 0x19, 0x00, 0x00, 0x00, 0xe9, 0xd1, 0xe3, 0xe3, 0xaf, 0x80, 0x62, 0x09, + 0x0d, 0x09, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x08, 0x0a, 0x0c, 0x0b, + 0x3f, 0x07, 0x77, 0x80, 0x2f, 0x00, 0x00, 0x0f, 0x14, 0x06, 0x06, 0x06, + 0x82, 0xe9, 0x06, 0x06, 0x0d, 0x3a, 0x36, 0x05, 0x64, 0x00, 0x56, 0x20, + 0x14, 0x10, 0x10, 0x10, 0x14, 0x20, 0x00, 0x3a, 0x16, 0x10, 0x10, 0x09, + 0x07, 0x04, 0x0d, 0x00, 0x0d, 0x10, 0x14, 0x17, 0x17, 0x1d, 0x22, 0x22, + 0x00, 0x26, 0x26, 0x26, 0x1f, 0x22, 0x1d, 0x1d, 0x23, 0x1b, 0x00, 0x00, + 0x00, 0xe9, 0xd2, 0xe3, 0xaf, 0x67, 0xfc, 0x77, 0x2f, 0x07, 0x07, 0x07, + 0x02, 0x0f, 0x1a, 0x06, 0x17, 0x16, 0x18, 0x1a, 0x2b, 0x07, 0x02, 0x36, + 0x00, 0x2b, 0x3a, 0x2b, 0x36, 0x00, 0x00, 0x56, 0x12, 0x10, 0x0d, 0x0d, + 0x0d, 0xe9, 0x0d, 0x10, 0x14, 0x14, 0x00, 0x17, 0x19, 0x19, 0x1b, 0x1b, + 0x1b, 0x1b, 0x19, 0x39, 0x19, 0x17, 0x01, 0xe9, 0xd2, 0xe3, 0xe3, 0xa7, + 0xff, 0x5f, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc2, 0x07, 0x03, + 0x3a, 0x0d, 0x0d, 0x0d, 0xe9, 0x0d, 0x00, 0x0d, 0x10, 0x10, 0x11, 0x14, + 0x13, 0x13, 0x13, 0x93, 0xe9, 0x14, 0x12, 0x07, 0xe3, 0xe3, 0xaf, 0x67, + 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x80, 0x05, 0x25, + 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x42, 0x0a, 0xc9, 0x0c, 0x10, 0x10, + 0x10, 0xe9, 0x09, 0x9f, 0x07, 0x00, 0xe3, 0xaf, 0x67, 0x77, 0x2f, 0x07, + 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x1a, 0x0a, 0x00, 0x08, 0x06, + 0x06, 0x06, 0x06, 0x0a, 0x0a, 0x0a, 0x8f, 0xe9, 0x0a, 0x0a, 0x0c, 0x07, + 0xbf, 0x77, 0x2f, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x80, 0x04, 0x10, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x03, 0x08, 0x08, + 0x08, 0x08, 0x0c, 0x06, 0x07, 0x07, 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, 0x07, 0x04, 0x06, 0x08, 0x06, 0x06, + 0x1f, 0x08, 0x0b, 0x06, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x02, 0xdd, 0xff, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0x07, 0x07, 0x07, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0xdd, + 0x7e, 0xaa, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x01, 0xdd, 0xff, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x87, 0x02, 0xdd, 0xe2, 0xe2, 0xdd, + 0x07, 0x07, 0x77, 0xc3, 0x2f, 0x07, 0x00, 0xdd, 0xdd, 0xc7, 0x07, 0x07, + 0xfe, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x01, 0xeb, 0x1f, 0xeb, 0xeb, + 0xeb, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x00, 0xeb, 0xe6, 0xeb, 0xdd, + 0x07, 0x07, 0x77, 0xf8, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x00, 0xf0, 0xf0, + 0x0f, 0xf0, 0xf0, 0xf0, 0xe9, 0x07, 0x07, 0x77, 0x2f, 0x83, 0x06, 0xe9, + 0xf0, 0xf0, 0xf0, 0xf0, 0x07, 0x07, 0xfc, 0x77, 0x2f, 0x07, 0x07, 0x07, + 0x07, 0xde, 0xf0, 0x03, 0xf0, 0xf0, 0xf0, 0xf5, 0xf5, 0xdd, 0x07, 0x07, + 0x38, 0x00, 0x00, 0x5f, 0x57, 0x53, 0xf5, 0xf5, 0xf5, 0x1f, 0xf5, 0xf5, + 0xed, 0x27, 0x07, 0x77, 0x2f, 0x07, 0xe1, 0x07, 0x07, 0x06, 0xf5, 0xf0, + 0xf0, 0xf0, 0xe9, 0x63, 0xf8, 0x07, 0x07, 0x00, 0xdd, 0xdd, 0x5f, 0x17, + 0x80, 0x01, 0xf8, 0xf0, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xff, 0x1f, 0x07, + 0x7f, 0x37, 0x07, 0x07, 0x07, 0x05, 0x08, 0xe7, 0xeb, 0xeb, 0xeb, 0xe9, + 0xeb, 0xeb, 0xdd, 0xc6, 0x07, 0x07, 0xe6, 0xe4, 0xb6, 0x5f, 0x17, 0x00, + 0x05, 0xe7, 0xeb, 0xf0, 0xf0, 0xf0, 0xe9, 0xf8, 0x27, 0xfe, 0x07, 0x77, + 0x2f, 0x07, 0x07, 0x07, 0x04, 0xf2, 0x11, 0xe2, 0xe2, 0xe2, 0xe9, 0xe2, + 0xe2, 0xf3, 0x07, 0x86, 0x06, 0xe6, 0xeb, 0xeb, 0xeb, 0x5f, 0x17, 0x00, + 0x05, 0xf2, 0xe6, 0xe6, 0xe6, 0xe6, 0x22, 0xdd, 0x1f, 0xfe, 0x07, 0x77, + 0x2f, 0x07, 0x07, 0x07, 0x03, 0xe6, 0x00, 0xa5, 0xa5, 0xa5, 0xc4, 0xa5, + 0xdd, 0xe2, 0xa5, 0x60, 0xf2, 0x07, 0x05, 0xb6, 0xf0, 0xf0, 0xf0, 0xf0, + 0x60, 0xf5, 0x57, 0x0f, 0xe2, 0xdd, 0xdd, 0xdd, 0xdd, 0x9f, 0xd9, 0xe2, + 0xf3, 0x27, 0x07, 0x77, 0x2f, 0x07, 0xe0, 0x07, 0x07, 0x03, 0xe2, 0xa5, + 0xa5, 0xa5, 0xa5, 0x06, 0xeb, 0xfc, 0xfe, 0xfa, 0xe6, 0x07, 0x05, 0xf5, + 0x2c, 0xf5, 0xf5, 0xe9, 0xe7, 0x4f, 0x06, 0xa5, 0xa5, 0x00, 0xa5, 0xa5, + 0xa5, 0xdd, 0xf5, 0xf8, 0xa5, 0xf2, 0xff, 0x2f, 0x07, 0x77, 0x2f, 0x07, + 0x07, 0x07, 0x03, 0x00, 0xe4, 0xa5, 0xa5, 0xa5, 0xe6, 0xfa, 0xfc, 0xfe, + 0x30, 0xfe, 0xdd, 0x07, 0x04, 0xf3, 0xf0, 0xf0, 0xf0, 0x0c, 0xf0, 0xf0, + 0xf2, 0xf8, 0x4f, 0x06, 0xc4, 0xa5, 0x00, 0xa5, 0xa5, 0xdd, 0xfa, 0xfc, + 0xfe, 0xfa, 0xdd, 0xff, 0x2f, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x03, + 0x00, 0xdd, 0xe2, 0xdd, 0xe6, 0xf5, 0xfa, 0xfc, 0xfe, 0x61, 0xfc, 0x07, + 0x05, 0xf2, 0xeb, 0xeb, 0xeb, 0xe9, 0x30, 0xeb, 0xe7, 0x3f, 0x05, 0xe6, + 0xa5, 0xa5, 0xdd, 0x07, 0xf8, 0xfa, 0xfc, 0xfe, 0xfd, 0x3f, 0x07, 0x77, + 0xf8, 0x2f, 0x07, 0x07, 0x07, 0x05, 0xde, 0xe2, 0xe6, 0x06, 0xf2, 0xfa, + 0xfd, 0xfc, 0xdd, 0x07, 0x04, 0xdd, 0x11, 0xe2, 0xe2, 0xe2, 0xe9, 0xe6, + 0xe2, 0xf2, 0x3f, 0x80, 0x06, 0xe2, 0xe2, 0xeb, 0xf5, 0xfa, 0xfd, 0xfe, + 0x7f, 0xde, 0x3f, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x83, 0x06, 0xdd, + 0xe9, 0xf2, 0xf8, 0xed, 0x57, 0x57, 0x00, 0xa5, 0xc4, 0xc4, 0xc4, 0xc4, + 0xa5, 0xe2, 0xc4, 0x60, 0xe2, 0x2f, 0x2f, 0xe6, 0xe6, 0xf5, 0xfa, 0xfc, + 0x7f, 0xe7, 0x47, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x02, 0xdd, 0xa5, 0xa5, 0xa5, 0x03, 0xa5, 0xdd, 0xfa, 0xfd, 0xfe, + 0xdd, 0x1f, 0x1f, 0x0f, 0x00, 0xdd, 0xf2, 0xde, 0x57, 0x0f, 0x77, 0x2f, + 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0xdd, 0x00, 0xa5, 0xa5, + 0xa5, 0xa5, 0xf8, 0xfa, 0xfd, 0xfe, 0x7f, 0xf8, 0x07, 0x07, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, + 0x00, 0xe2, 0xa5, 0xe2, 0xf2, 0xf8, 0xfc, 0xfe, 0xfe, 0x7f, 0xdd, 0x07, + 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x00, 0x00, 0x00, 0xdd, 0xe2, 0xe2, 0xf2, 0xf8, 0xfc, 0xfe, 0xf5, + 0xff, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0xfc, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x02, 0xdd, 0xe9, 0x0f, 0xf2, 0xf5, 0xf8, 0xdd, 0x07, + 0x07, 0x77, 0x2f, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xc0, 0x07, 0x07, 0x00, 0x00, +}; + +//***************************************************************************** +// +// Fog/Mist Image +// +//***************************************************************************** +const uint8_t g_pui8FogImage[] = +{ + IMAGE_FMT_8BPP_COMP, + 128, 0, + 128, 0, + + 148, + 0x00, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, + 0x11, 0x11, 0x11, + 0x13, 0x13, 0x13, + 0x1b, 0x1b, 0x1b, + 0x1c, 0x1c, 0x1c, + 0x1e, 0x1e, 0x1e, + 0x1f, 0x1f, 0x1f, + 0x22, 0x22, 0x22, + 0x26, 0x26, 0x26, + 0x2d, 0x2d, 0x2d, + 0x2e, 0x2e, 0x2e, + 0x2f, 0x2f, 0x2f, + 0x30, 0x30, 0x30, + 0x31, 0x31, 0x31, + 0x32, 0x32, 0x32, + 0x33, 0x33, 0x33, + 0x34, 0x34, 0x34, + 0x35, 0x35, 0x35, + 0x36, 0x36, 0x36, + 0x37, 0x37, 0x37, + 0x38, 0x38, 0x38, + 0x39, 0x39, 0x39, + 0x3a, 0x3a, 0x3a, + 0x3c, 0x3c, 0x3c, + 0x41, 0x41, 0x41, + 0x44, 0x44, 0x44, + 0x47, 0x47, 0x47, + 0x48, 0x48, 0x48, + 0x4a, 0x4a, 0x4a, + 0x4d, 0x4d, 0x4d, + 0x4e, 0x4e, 0x4e, + 0x4f, 0x4f, 0x4f, + 0x50, 0x50, 0x50, + 0x51, 0x51, 0x51, + 0x52, 0x52, 0x52, + 0x53, 0x53, 0x53, + 0x54, 0x54, 0x54, + 0x55, 0x55, 0x55, + 0x56, 0x56, 0x56, + 0x57, 0x57, 0x57, + 0x59, 0x59, 0x59, + 0x5a, 0x5a, 0x5a, + 0x5b, 0x5b, 0x5b, + 0x5c, 0x5c, 0x5c, + 0x5d, 0x5d, 0x5d, + 0x5e, 0x5e, 0x5e, + 0x61, 0x61, 0x61, + 0x62, 0x62, 0x62, + 0x64, 0x64, 0x64, + 0x65, 0x65, 0x65, + 0x6a, 0x6a, 0x6a, + 0x6b, 0x6b, 0x6b, + 0x6c, 0x6c, 0x6c, + 0x6d, 0x6d, 0x6d, + 0x6e, 0x6e, 0x6e, + 0x6f, 0x6f, 0x6f, + 0x70, 0x70, 0x70, + 0x71, 0x71, 0x71, + 0x72, 0x72, 0x72, + 0x73, 0x73, 0x73, + 0x74, 0x74, 0x74, + 0x75, 0x75, 0x75, + 0x76, 0x76, 0x76, + 0x77, 0x77, 0x77, + 0x78, 0x78, 0x78, + 0x79, 0x79, 0x79, + 0x7a, 0x7a, 0x7a, + 0x7b, 0x7b, 0x7b, + 0x7c, 0x7c, 0x7c, + 0x7d, 0x7d, 0x7d, + 0x7e, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, + 0x81, 0x81, 0x81, + 0x82, 0x82, 0x82, + 0x83, 0x83, 0x83, + 0x84, 0x84, 0x84, + 0x85, 0x85, 0x85, + 0x86, 0x86, 0x86, + 0x87, 0x87, 0x87, + 0x88, 0x88, 0x88, + 0x89, 0x89, 0x89, + 0x8a, 0x8a, 0x8a, + 0x8b, 0x8b, 0x8b, + 0x8c, 0x8c, 0x8c, + 0x8d, 0x8d, 0x8d, + 0x8e, 0x8e, 0x8e, + 0x8f, 0x8f, 0x8f, + 0x90, 0x90, 0x90, + 0x91, 0x91, 0x91, + 0x92, 0x92, 0x92, + 0x93, 0x93, 0x93, + 0x94, 0x94, 0x94, + 0x98, 0x98, 0x98, + 0x99, 0x99, 0x99, + 0x9a, 0x9a, 0x9a, + 0x9b, 0x9b, 0x9b, + 0x9c, 0x9c, 0x9c, + 0x9d, 0x9d, 0x9d, + 0x9e, 0x9e, 0x9e, + 0x9f, 0x9f, 0x9f, + 0xa0, 0xa0, 0xa0, + 0xa1, 0xa1, 0xa1, + 0xa2, 0xa2, 0xa2, + 0xa3, 0xa3, 0xa3, + 0xa4, 0xa4, 0xa4, + 0xa5, 0xa5, 0xa5, + 0xa6, 0xa6, 0xa6, + 0xa7, 0xa7, 0xa7, + 0xa8, 0xa8, 0xa8, + 0xa9, 0xa9, 0xa9, + 0xaa, 0xaa, 0xaa, + 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, + 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, + 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, + 0xb1, 0xb1, 0xb1, + 0xb2, 0xb2, 0xb2, + 0xb3, 0xb3, 0xb3, + 0xb4, 0xb4, 0xb4, + 0xb5, 0xb5, 0xb5, + 0xb6, 0xb6, 0xb6, + 0xb7, 0xb7, 0xb7, + 0xb8, 0xb8, 0xb8, + 0xb9, 0xb9, 0xb9, + 0xba, 0xba, 0xba, + 0xbb, 0xbb, 0xbb, + 0xbc, 0xbc, 0xbc, + 0xbd, 0xbd, 0xbd, + 0xbe, 0xbe, 0xbe, + 0xbf, 0xbf, 0xbf, + 0xc0, 0xc0, 0xc0, + 0xc1, 0xc1, 0xc1, + 0xc2, 0xc2, 0xc2, + 0xc3, 0xc3, 0xc3, + 0xc4, 0xc4, 0xc4, + 0xc5, 0xc5, 0xc5, + 0xc6, 0xc6, 0xc6, + 0xc7, 0xc7, 0xc7, + 0xc8, 0xc8, 0xc8, + 0xc9, 0xc9, 0xc9, + 0xca, 0xca, 0xca, + 0xcb, 0xcb, 0xcb, + 0xd0, 0xd0, 0xd0, + 0xd2, 0xd2, 0xd2, + 0xd3, 0xd3, 0xd3, + + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe1, 0x07, 0x07, + 0x04, 0x4b, 0x7b, 0x7b, 0x7b, 0xe9, 0x8c, 0xd3, 0x7a, 0x7a, 0x7a, 0xe9, + 0xd1, 0x79, 0x79, 0x02, 0x79, 0x79, 0x79, 0x78, 0x78, 0x78, 0xe9, 0x77, + 0x00, 0x77, 0x77, 0x77, 0x76, 0x76, 0x76, 0x75, 0x76, 0x03, 0x75, 0x74, + 0x42, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x0a, 0x2d, 0x87, 0x87, 0x87, 0xe9, 0x86, 0xcc, 0x85, + 0x00, 0x86, 0x85, 0x86, 0x86, 0x86, 0x86, 0x85, 0x85, 0x08, 0x84, 0x85, + 0x85, 0x85, 0xd1, 0x84, 0x84, 0x83, 0x00, 0x83, 0x83, 0x82, 0x82, 0x82, + 0x82, 0x81, 0x80, 0x00, 0x80, 0x80, 0x80, 0x81, 0x23, 0x00, 0x00, 0x00, + 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0xc1, 0x07, 0x05, + 0x30, 0x8d, 0x8c, 0x8c, 0x8c, 0xe9, 0x92, 0xd2, 0x8b, 0x8b, 0xda, 0x8a, + 0x8a, 0xe9, 0x8a, 0x00, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x87, 0x87, + 0x01, 0x87, 0x87, 0x86, 0x86, 0x85, 0x85, 0x85, 0xe9, 0x01, 0x85, 0x84, + 0x84, 0x2d, 0x00, 0x00, 0x00, 0xe9, 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x07, 0x07, 0x07, 0x82, 0x05, 0x1e, 0x67, 0x66, 0x66, 0x66, 0xe9, 0x66, + 0x00, 0x65, 0x65, 0x65, 0x65, 0x65, 0x64, 0x64, 0x64, 0x00, 0x64, 0x63, + 0x63, 0x62, 0x62, 0x62, 0x62, 0x61, 0x08, 0x61, 0x60, 0x60, 0x60, 0xe9, + 0x5f, 0x5f, 0x5f, 0x18, 0x5e, 0x5e, 0x5e, 0xe9, 0xd1, 0x5f, 0x1a, 0x00, + 0x3f, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x06, 0x18, 0x17, 0x17, 0x17, 0x82, 0xe9, 0x17, 0x17, 0x16, 0x16, + 0x16, 0xe9, 0x15, 0x20, 0x15, 0x15, 0xe9, 0x15, 0x15, 0x14, 0x14, 0x14, + 0xe3, 0xe9, 0xd4, 0xa7, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xff, 0xa7, 0x5f, + 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0x79, 0x7b, 0x7c, 0x7c, 0x7c, + 0xe2, 0xe9, 0xd4, 0xa3, 0x7b, 0x7b, 0x7b, 0xe9, 0x7b, 0x00, 0x7a, 0x7a, + 0x7a, 0x7a, 0x7a, 0x79, 0x79, 0x79, 0x01, 0x79, 0x78, 0x78, 0x78, 0x77, + 0x77, 0x77, 0xe9, 0x00, 0x76, 0x76, 0x76, 0x76, 0x75, 0x75, 0x75, 0x75, + 0x01, 0x74, 0x73, 0x6f, 0x24, 0x00, 0x00, 0x00, 0xe9, 0xff, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0x07, 0x07, 0x03, 0x07, 0x85, 0x82, 0x81, 0x81, 0x81, + 0xe9, 0xd4, 0xa3, 0x10, 0x80, 0x80, 0x80, 0xe9, 0x80, 0x7f, 0x7f, 0x7f, + 0x88, 0xe9, 0x7e, 0x7e, 0x7e, 0xe9, 0x7d, 0x7d, 0x7d, 0x00, 0x7d, 0x7d, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7b, 0x00, 0x7b, 0x7b, 0x7b, 0x7a, 0x79, + 0x79, 0x79, 0x7c, 0x0f, 0x05, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, + 0xf8, 0x17, 0x07, 0x07, 0x07, 0x02, 0x94, 0x8e, 0x8e, 0x71, 0x8e, 0xe9, + 0xd4, 0xa5, 0x8d, 0x8d, 0x8d, 0xe9, 0x00, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8b, 0x8b, 0x00, 0x8b, 0x8b, 0x8b, 0x89, 0x8a, 0x8a, 0x89, 0x88, + 0x00, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x87, 0x00, 0x86, 0x86, + 0x86, 0x86, 0x85, 0x85, 0x85, 0x2c, 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xa7, 0x5f, 0x17, 0xf0, 0x07, 0x07, 0x07, 0x02, 0x92, 0x8b, 0x8b, 0x8b, + 0x00, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x89, 0x90, 0xdb, 0x89, + 0x89, 0xe9, 0x88, 0x88, 0x88, 0x88, 0x00, 0x87, 0x87, 0x87, 0x86, 0x85, + 0x85, 0x84, 0x85, 0x01, 0x84, 0x83, 0x82, 0x82, 0x82, 0x83, 0x82, 0xd2, + 0x00, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x43, 0x7f, 0xe9, + 0x2a, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xfe, 0xa7, 0x5f, 0x17, 0x07, 0x07, + 0x07, 0x02, 0x68, 0x00, 0x6b, 0x6b, 0x6a, 0x6a, 0x6a, 0x69, 0x69, 0x69, + 0x08, 0x69, 0x68, 0x68, 0x68, 0xe9, 0x67, 0x67, 0x67, 0x00, 0x67, 0x67, + 0x66, 0x65, 0x65, 0x65, 0x64, 0x64, 0x00, 0x63, 0x63, 0x63, 0x62, 0x62, + 0x61, 0x61, 0x61, 0x00, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x5f, 0x5f, + 0x70, 0x5f, 0xe9, 0xd4, 0xa1, 0x60, 0x19, 0x00, 0x00, 0x7f, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0xc0, 0x07, 0x02, 0x4d, 0x46, 0x4a, + 0x49, 0x49, 0x49, 0x00, 0x49, 0x48, 0x48, 0x48, 0x47, 0x47, 0x47, 0x47, + 0x00, 0x47, 0x46, 0x46, 0x46, 0x45, 0x45, 0x45, 0x45, 0x00, 0x44, 0x44, + 0x44, 0x43, 0x43, 0x43, 0x42, 0x42, 0x00, 0x42, 0x42, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x40, 0x38, 0x40, 0x40, 0xe9, 0xd4, 0xa5, 0x28, 0x00, 0x00, + 0x7f, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x06, 0x24, 0x28, 0x28, 0x28, 0xe9, 0xd4, 0xa7, 0x8f, 0x5e, 0x27, + 0x27, 0x27, 0xe9, 0xd4, 0xa7, 0x5f, 0x08, 0x27, 0x26, 0x26, 0x26, 0xe9, + 0x26, 0x26, 0x25, 0x20, 0x25, 0x25, 0xe9, 0x25, 0x24, 0x24, 0x24, 0x24, + 0x00, 0x23, 0x23, 0x23, 0x23, 0x23, 0x22, 0x1f, 0x05, 0x1f, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x16, 0x00, 0x4b, 0x7d, 0x78, 0x78, 0x78, + 0x79, 0x79, 0x79, 0xf8, 0xe9, 0xd4, 0x89, 0x71, 0xd4, 0x78, 0x77, 0x77, + 0x78, 0x77, 0xe9, 0xd4, 0xa7, 0x5b, 0x76, 0x76, 0x76, 0x80, 0xe9, 0x75, + 0x75, 0x75, 0x75, 0x75, 0x74, 0x74, 0x00, 0x74, 0x74, 0x73, 0x73, 0x73, + 0x72, 0x72, 0x72, 0x00, 0x71, 0x71, 0x71, 0x70, 0x70, 0x70, 0x6f, 0x6f, + 0x00, 0x6f, 0x6e, 0x6e, 0x6e, 0x71, 0x43, 0x00, 0x00, 0x7c, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x14, 0x51, 0x80, 0x38, 0x80, 0x80, 0xe9, 0xd4, 0xa7, + 0x80, 0x7f, 0x7f, 0x63, 0x7f, 0xe9, 0xd1, 0x7e, 0x7e, 0x7e, 0xe9, 0xd4, + 0xc0, 0xa7, 0x5e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x00, 0x7c, 0x7c, + 0x7c, 0x7c, 0x7b, 0x7b, 0x7b, 0x7b, 0x00, 0x7b, 0x7a, 0x7a, 0x7a, 0x7a, + 0x79, 0x79, 0x79, 0x00, 0x79, 0x78, 0x78, 0x77, 0x77, 0x76, 0x75, 0x74, + 0x07, 0x74, 0x47, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xc1, 0x5f, 0x12, + 0x08, 0x8f, 0x8a, 0x8a, 0x8a, 0xe9, 0xc6, 0xd4, 0xa4, 0x89, 0x89, 0x89, + 0xe9, 0xd2, 0x88, 0x0f, 0x87, 0x88, 0x88, 0x88, 0xe9, 0xd4, 0xa7, 0x5a, + 0x04, 0x87, 0x86, 0x87, 0x87, 0x87, 0xe9, 0x87, 0x86, 0x20, 0x86, 0x86, + 0xe9, 0x86, 0x85, 0x85, 0x85, 0x85, 0x00, 0x85, 0x84, 0x83, 0x83, 0x83, + 0x82, 0x82, 0x81, 0x00, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, 0x7d, + 0x07, 0x82, 0x07, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xc1, 0x5f, 0x11, + 0x2f, 0x91, 0x90, 0x90, 0x90, 0xe9, 0x8c, 0xd3, 0x8f, 0x8f, 0x8f, 0xe9, + 0xd2, 0x8e, 0x8e, 0x63, 0x8e, 0xe9, 0xd4, 0x8d, 0x8d, 0x8d, 0xe9, 0xd4, + 0xc4, 0xa7, 0x5c, 0x8c, 0x8c, 0x8c, 0xe9, 0x8b, 0x8b, 0x00, 0x8b, 0x8b, + 0x8b, 0x8a, 0x8a, 0x89, 0x89, 0x88, 0x00, 0x88, 0x88, 0x87, 0x86, 0x86, + 0x85, 0x85, 0x85, 0x00, 0x84, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, + 0x0f, 0x29, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x86, 0x11, 0x32, + 0x90, 0x90, 0x90, 0xe9, 0xd1, 0x8f, 0x31, 0x8f, 0x8f, 0xe9, 0xd3, 0x8e, + 0x8e, 0x8e, 0xe9, 0x04, 0x8e, 0x8e, 0x8d, 0x8d, 0x8d, 0xe9, 0x8d, 0x8c, + 0x3c, 0x8c, 0x8c, 0xe9, 0xd4, 0xa7, 0x5a, 0x8b, 0x8b, 0x00, 0x8b, 0x8a, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x00, 0x87, 0x87, 0x86, 0x86, 0x86, + 0x85, 0x85, 0x85, 0x00, 0x84, 0x84, 0x84, 0x83, 0x83, 0x82, 0x82, 0x82, + 0x00, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x2c, 0x1f, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x11, 0x00, 0x2e, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x86, 0x86, 0x44, 0x86, 0xe9, 0x85, 0x85, 0x85, 0xe9, 0x85, 0x84, + 0x00, 0x84, 0x84, 0x84, 0x83, 0x83, 0x83, 0x83, 0x83, 0x00, 0x82, 0x82, + 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, 0x07, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0xe9, 0xd4, 0xa5, 0x10, 0x7e, 0x7e, 0x7e, 0xe9, 0x7d, 0x7c, 0x7c, 0x7b, + 0x00, 0x7b, 0x7b, 0x7b, 0x7b, 0x7a, 0x7a, 0x79, 0x79, 0x00, 0x79, 0x78, + 0x78, 0x78, 0x78, 0x77, 0x77, 0x77, 0x04, 0x76, 0x76, 0x75, 0x75, 0x75, + 0xe9, 0x74, 0x74, 0x07, 0x74, 0x26, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0xc0, 0x5f, 0x11, 0x22, 0x75, 0x73, 0x73, 0x73, 0x73, 0x00, 0x72, 0x72, + 0x72, 0x72, 0x71, 0x71, 0x71, 0x71, 0x00, 0x70, 0x70, 0x70, 0x6f, 0x6f, + 0x6f, 0x6f, 0x6e, 0x00, 0x6d, 0x6d, 0x6d, 0x6d, 0x6c, 0x6b, 0x6b, 0x6b, + 0x00, 0x6a, 0x6a, 0x6a, 0x69, 0x69, 0x69, 0x68, 0x68, 0x70, 0x68, 0xe9, + 0xd4, 0xa7, 0x68, 0x67, 0x67, 0x67, 0x00, 0x66, 0x66, 0x66, 0x66, 0x65, + 0x65, 0x65, 0x65, 0x00, 0x64, 0x64, 0x64, 0x64, 0x63, 0x63, 0x63, 0x63, + 0x01, 0x63, 0x62, 0x62, 0x62, 0x61, 0x61, 0x61, 0xe9, 0x80, 0xd2, 0x60, + 0x60, 0x62, 0x1c, 0x00, 0x00, 0x00, 0xf8, 0xe9, 0xd4, 0xa7, 0x5f, 0x12, + 0x5f, 0x5d, 0x5d, 0x00, 0x5d, 0x5c, 0x5c, 0x5a, 0x5b, 0x5a, 0x59, 0x5a, + 0x00, 0x59, 0x59, 0x58, 0x58, 0x57, 0x56, 0x57, 0x57, 0x00, 0x55, 0x55, + 0x54, 0x55, 0x54, 0x53, 0x53, 0x52, 0x40, 0x52, 0xe9, 0x51, 0x51, 0x51, + 0x51, 0x50, 0x4f, 0x1c, 0x50, 0x50, 0x50, 0xe9, 0xd4, 0xa7, 0x50, 0x4e, + 0x03, 0x4e, 0x4e, 0x4e, 0x4d, 0x4d, 0x4d, 0xe9, 0xd1, 0x12, 0x4c, 0x4c, + 0x4c, 0xe9, 0x4c, 0x4b, 0xd4, 0x4b, 0x41, 0x4b, 0xb9, 0x4b, 0x50, 0x00, + 0x00, 0x00, 0xe9, 0xf0, 0xd4, 0xa7, 0x5f, 0x13, 0x03, 0x48, 0x43, 0x43, + 0x00, 0x42, 0x42, 0x41, 0x41, 0x40, 0x40, 0x3f, 0x3f, 0x00, 0x3e, 0x3e, + 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c, 0x00, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, + 0x39, 0x39, 0x39, 0x00, 0x39, 0x38, 0x38, 0x38, 0x38, 0x38, 0x37, 0x37, + 0x0f, 0x37, 0x36, 0x36, 0x36, 0xe9, 0xd4, 0xa7, 0x59, 0x10, 0x35, 0x35, + 0x35, 0xe9, 0x35, 0x34, 0x34, 0x34, 0x83, 0xe9, 0x34, 0x34, 0x33, 0x33, + 0x33, 0xe9, 0xd4, 0x83, 0x61, 0x38, 0x02, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xe0, 0xa7, 0x5f, 0x14, 0x02, 0x11, 0x11, 0x11, 0x11, 0x00, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x04, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, + 0xe9, 0x0d, 0x0d, 0x47, 0x0d, 0xe9, 0x0c, 0x0c, 0x0c, 0xe9, 0xd4, 0xa7, + 0x8f, 0x5c, 0x0b, 0x0b, 0x0b, 0xe9, 0xd4, 0xa7, 0x5f, 0x83, 0x13, 0x0a, + 0x01, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x81, 0x04, 0x09, 0x1d, 0x24, 0x25, 0x25, 0x25, 0xe9, + 0xc1, 0xd4, 0xa7, 0x25, 0x25, 0x24, 0x24, 0x24, 0xe9, 0x88, 0xd2, 0x23, + 0x23, 0x23, 0xe9, 0x23, 0x23, 0x22, 0x20, 0x22, 0x22, 0xe9, 0x22, 0x22, + 0x21, 0x21, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x09, 0x1d, 0x24, + 0x1c, 0x25, 0x25, 0x25, 0xe9, 0xd4, 0xa7, 0x25, 0x25, 0x18, 0x24, 0x24, + 0x24, 0xe9, 0xd2, 0x23, 0x23, 0x23, 0x82, 0xe9, 0x23, 0x23, 0x22, 0x22, + 0x22, 0xe9, 0x22, 0x00, 0x22, 0x21, 0x21, 0x20, 0x04, 0x00, 0x00, 0x00, + 0xc0, 0xe9, 0xd3, 0x09, 0x7e, 0x7a, 0x78, 0x78, 0x78, 0xe2, 0xe9, 0xd4, + 0xa2, 0x77, 0x77, 0x77, 0xe9, 0x77, 0x00, 0x77, 0x76, 0x76, 0x76, 0x76, + 0x76, 0x75, 0x75, 0x02, 0x75, 0x75, 0x75, 0x74, 0x74, 0x74, 0xe9, 0x74, + 0x00, 0x73, 0x73, 0x73, 0x73, 0x72, 0x72, 0x72, 0x72, 0x00, 0x72, 0x71, + 0x71, 0x70, 0x73, 0x25, 0x00, 0x00, 0x03, 0x09, 0x7e, 0x7a, 0x78, 0x78, + 0x78, 0xe9, 0xd4, 0x88, 0xa2, 0x77, 0x77, 0x77, 0xe9, 0x77, 0x77, 0x76, + 0x00, 0x76, 0x76, 0x76, 0x76, 0x75, 0x75, 0x75, 0x75, 0x08, 0x75, 0x74, + 0x74, 0x74, 0xe9, 0x74, 0x73, 0x73, 0x00, 0x73, 0x73, 0x72, 0x72, 0x72, + 0x72, 0x72, 0x71, 0x01, 0x71, 0x70, 0x73, 0x25, 0x00, 0x00, 0x00, 0xe9, + 0x83, 0xd2, 0x28, 0x8b, 0x89, 0x89, 0x89, 0xe9, 0xd3, 0x18, 0x88, 0x88, + 0x88, 0xe9, 0xd4, 0x89, 0x87, 0x87, 0x44, 0x87, 0xe9, 0x87, 0x86, 0x86, + 0xe2, 0x86, 0x86, 0x00, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, + 0x00, 0x83, 0x82, 0x82, 0x82, 0x81, 0x81, 0x82, 0x81, 0x00, 0x83, 0x00, + 0x00, 0x28, 0x8b, 0x89, 0x89, 0x89, 0xc6, 0xe9, 0xd3, 0x88, 0x88, 0x88, + 0xe9, 0xd4, 0x89, 0x11, 0x87, 0x87, 0x87, 0xe9, 0x87, 0x86, 0x86, 0xe2, + 0x00, 0x86, 0x86, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x00, 0x84, 0x84, + 0x83, 0x82, 0x82, 0x82, 0x81, 0x81, 0x03, 0x82, 0x81, 0x83, 0x00, 0x00, + 0x00, 0xe9, 0xd2, 0x0e, 0x31, 0x8f, 0x8f, 0x8f, 0xe9, 0xd4, 0xa6, 0x8e, + 0x20, 0x8e, 0x8e, 0xe9, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x00, 0x8c, 0x8b, + 0x8b, 0x8a, 0x8a, 0x8a, 0x89, 0x89, 0x00, 0x89, 0x89, 0x89, 0x88, 0x88, + 0x88, 0x87, 0x87, 0x00, 0x87, 0x87, 0x87, 0x86, 0x86, 0x85, 0x85, 0x85, + 0x00, 0x85, 0x8f, 0x00, 0x00, 0x31, 0x8f, 0x8f, 0x8f, 0xe2, 0xe9, 0xd4, + 0xa6, 0x8e, 0x8e, 0x8e, 0xe9, 0x8d, 0x00, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, + 0x8b, 0x8b, 0x8a, 0x00, 0x8a, 0x8a, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, + 0x00, 0x88, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x00, 0x86, 0x85, + 0x85, 0x85, 0x85, 0x8f, 0x00, 0x00, 0x61, 0x00, 0xe9, 0xd2, 0x29, 0x7d, + 0x7d, 0x7d, 0xe9, 0x18, 0x7c, 0x7c, 0x7c, 0xe9, 0xd1, 0x7b, 0x7b, 0x7b, + 0x00, 0x7b, 0x7b, 0x7a, 0x79, 0x79, 0x79, 0x79, 0x78, 0x00, 0x77, 0x77, + 0x77, 0x77, 0x76, 0x75, 0x75, 0x75, 0x01, 0x75, 0x74, 0x74, 0x74, 0x73, + 0x73, 0x73, 0xe9, 0x04, 0x73, 0x73, 0x72, 0x72, 0x72, 0xe9, 0x71, 0x71, + 0x00, 0x71, 0x71, 0x79, 0x00, 0x00, 0x29, 0x7d, 0x7d, 0x46, 0x7d, 0xe9, + 0x7c, 0x7c, 0x7c, 0xe9, 0xd1, 0x7b, 0x00, 0x7b, 0x7b, 0x7b, 0x7b, 0x7a, + 0x79, 0x79, 0x79, 0x00, 0x79, 0x78, 0x77, 0x77, 0x77, 0x77, 0x76, 0x75, + 0x00, 0x75, 0x75, 0x75, 0x74, 0x74, 0x74, 0x73, 0x73, 0x41, 0x73, 0xe9, + 0x73, 0x73, 0x72, 0x72, 0x72, 0xe9, 0x00, 0x71, 0x71, 0x71, 0x71, 0x79, + 0x00, 0x00, 0x00, 0xc0, 0xe9, 0xd2, 0x21, 0x52, 0x58, 0x58, 0x57, 0x57, + 0x00, 0x57, 0x56, 0x56, 0x56, 0x56, 0x55, 0x55, 0x55, 0x00, 0x55, 0x55, + 0x54, 0x54, 0x54, 0x54, 0x54, 0x53, 0x00, 0x52, 0x52, 0x52, 0x52, 0x51, + 0x51, 0x51, 0x50, 0x00, 0x50, 0x50, 0x50, 0x4f, 0x4f, 0x4f, 0x4f, 0x4e, + 0x01, 0x4e, 0x4e, 0x4e, 0x4e, 0x4d, 0x4d, 0x4d, 0xe9, 0x80, 0xd4, 0x4d, + 0x4d, 0x4e, 0x2d, 0x00, 0x00, 0x21, 0x00, 0x52, 0x58, 0x58, 0x57, 0x57, + 0x57, 0x56, 0x56, 0x00, 0x56, 0x56, 0x55, 0x55, 0x55, 0x55, 0x55, 0x54, + 0x00, 0x54, 0x54, 0x54, 0x54, 0x53, 0x52, 0x52, 0x52, 0x00, 0x52, 0x51, + 0x51, 0x51, 0x50, 0x50, 0x50, 0x50, 0x00, 0x4f, 0x4f, 0x4f, 0x4f, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0c, 0x4e, 0x4d, 0x4d, 0x4d, 0xe9, 0xd4, 0x4d, 0x4d, + 0x06, 0x4e, 0x2d, 0x00, 0x00, 0x00, 0xe9, 0xd3, 0x1e, 0x04, 0x15, 0x15, + 0x14, 0x14, 0x14, 0xe9, 0x13, 0x13, 0x41, 0x13, 0xe9, 0x13, 0x13, 0x12, + 0x12, 0x12, 0xe9, 0x08, 0x12, 0x11, 0x11, 0x11, 0xe9, 0x11, 0x11, 0x10, + 0x38, 0x10, 0x10, 0xe9, 0xd4, 0xa7, 0x10, 0x10, 0x11, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x15, 0x15, 0x14, 0x22, 0x14, 0x14, 0xe9, 0x13, 0x13, + 0x13, 0xe9, 0x13, 0x08, 0x13, 0x12, 0x12, 0x12, 0xe9, 0x12, 0x11, 0x11, + 0x41, 0x11, 0xe9, 0x11, 0x11, 0x10, 0x10, 0x10, 0xe9, 0xc0, 0xd4, 0xa7, + 0x10, 0x10, 0x11, 0x00, 0x00, 0x00, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x02, 0x09, 0x79, 0x7b, 0x7b, + 0x63, 0x7b, 0xe9, 0xd3, 0x7a, 0x7a, 0x7a, 0xe9, 0xd1, 0x00, 0x79, 0x79, + 0x79, 0x79, 0x79, 0x78, 0x78, 0x78, 0x80, 0xe9, 0x77, 0x77, 0x77, 0x77, + 0x76, 0x76, 0x76, 0x00, 0x75, 0x76, 0x75, 0x74, 0x42, 0x00, 0x00, 0x00, + 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0xc0, 0x07, 0x06, + 0x2b, 0x88, 0x87, 0x87, 0x87, 0x87, 0x20, 0x87, 0x86, 0xd3, 0x87, 0x85, + 0x86, 0x85, 0x86, 0x00, 0x86, 0x86, 0x86, 0x85, 0x85, 0x84, 0x85, 0x85, + 0x40, 0x85, 0xd1, 0x84, 0x84, 0x83, 0x83, 0x83, 0x82, 0x00, 0x82, 0x82, + 0x82, 0x81, 0x80, 0x80, 0x80, 0x80, 0x07, 0x81, 0x23, 0x00, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0xfe, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x05, 0x30, + 0x0c, 0x8d, 0x8c, 0x8c, 0x8c, 0xe9, 0xd2, 0x8b, 0x8b, 0x90, 0xda, 0x8a, + 0x8a, 0xe9, 0x8a, 0x89, 0x89, 0x89, 0x00, 0x89, 0x88, 0x88, 0x87, 0x87, + 0x87, 0x87, 0x86, 0x08, 0x86, 0x85, 0x85, 0x85, 0xe9, 0x85, 0x84, 0x84, + 0x0f, 0x2d, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xfc, 0x17, 0x07, + 0x07, 0x07, 0x07, 0x05, 0x1b, 0x68, 0x10, 0x66, 0x66, 0x66, 0xe9, 0x66, + 0x65, 0x65, 0x65, 0x00, 0x65, 0x65, 0x64, 0x64, 0x64, 0x64, 0x63, 0x63, + 0x00, 0x62, 0x62, 0x62, 0x62, 0x61, 0x61, 0x60, 0x60, 0x40, 0x60, 0xe9, + 0x5f, 0x5f, 0x5f, 0x5e, 0x5e, 0x5e, 0xc1, 0xe9, 0xd1, 0x5f, 0x1a, 0x00, + 0x00, 0x00, 0xe9, 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, + 0x82, 0x05, 0x0c, 0x13, 0x17, 0x17, 0x17, 0xe9, 0x17, 0x08, 0x17, 0x16, + 0x16, 0x16, 0xe9, 0x15, 0x15, 0x15, 0x83, 0xe9, 0x15, 0x15, 0x14, 0x14, + 0x14, 0xe9, 0xd4, 0x8f, 0xa7, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, + 0xff, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x03, 0x07, 0x79, 0x7b, 0x7c, 0x7c, + 0x7c, 0xe9, 0xd4, 0x88, 0xa3, 0x7b, 0x7b, 0x7b, 0xe9, 0x7b, 0x7a, 0x7a, + 0x00, 0x7a, 0x7a, 0x7a, 0x79, 0x79, 0x79, 0x79, 0x78, 0x04, 0x78, 0x78, + 0x77, 0x77, 0x77, 0xe9, 0x76, 0x76, 0x00, 0x76, 0x76, 0x75, 0x75, 0x75, + 0x75, 0x74, 0x73, 0x07, 0x6f, 0x24, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0xfc, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x03, 0x89, 0x82, 0x1c, 0x81, 0x81, + 0x81, 0xe9, 0xd4, 0xa3, 0x80, 0x80, 0x42, 0x80, 0xe9, 0x80, 0x7f, 0x7f, + 0x7f, 0xe9, 0x7e, 0x20, 0x7e, 0x7e, 0xe9, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, + 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, 0x7b, 0x00, 0x7b, 0x7a, + 0x79, 0x79, 0x79, 0x7c, 0x05, 0x00, 0x3f, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0xe1, 0x07, 0x07, 0x02, 0x93, 0x8e, 0x8e, 0x8e, 0xe9, + 0xc4, 0xd4, 0xa5, 0x8d, 0x8d, 0x8d, 0xe9, 0x8d, 0x8c, 0x00, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8b, 0x8b, 0x8b, 0x8b, 0x00, 0x8b, 0x89, 0x8a, 0x8a, 0x89, + 0x88, 0x89, 0x88, 0x00, 0x88, 0x88, 0x88, 0x88, 0x87, 0x87, 0x86, 0x86, + 0x00, 0x86, 0x86, 0x85, 0x85, 0x85, 0x2c, 0x00, 0x00, 0x7f, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0xc0, 0x07, 0x02, 0x92, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x02, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x89, 0xdb, 0x89, + 0x40, 0x89, 0xe9, 0x88, 0x88, 0x88, 0x88, 0x87, 0x87, 0x00, 0x87, 0x86, + 0x85, 0x85, 0x84, 0x85, 0x84, 0x83, 0x04, 0x82, 0x82, 0x82, 0x83, 0x82, + 0xd2, 0x81, 0x81, 0x01, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0xe9, + 0x0f, 0x2a, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xf8, 0x17, 0x07, + 0x07, 0x07, 0x02, 0x68, 0x6b, 0x6b, 0x00, 0x6a, 0x6a, 0x6a, 0x69, 0x69, + 0x69, 0x69, 0x68, 0x20, 0x68, 0x68, 0xe9, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x00, 0x66, 0x65, 0x65, 0x65, 0x64, 0x64, 0x63, 0x63, 0x00, 0x63, 0x62, + 0x62, 0x61, 0x61, 0x61, 0x61, 0x61, 0x01, 0x60, 0x60, 0x60, 0x60, 0x5f, + 0x5f, 0x5f, 0xe9, 0xc1, 0xd4, 0xa1, 0x60, 0x19, 0x00, 0x00, 0x00, 0xe9, + 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x02, 0x00, 0x4d, 0x46, + 0x4a, 0x49, 0x49, 0x49, 0x49, 0x48, 0x00, 0x48, 0x48, 0x47, 0x47, 0x47, + 0x47, 0x47, 0x46, 0x00, 0x46, 0x46, 0x45, 0x45, 0x45, 0x45, 0x44, 0x44, + 0x00, 0x44, 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x42, 0x00, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x40, 0x40, 0x40, 0xe1, 0xe9, 0xd4, 0xa5, 0x28, 0x00, + 0x00, 0x00, 0xe9, 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x80, 0x05, +}; + +//***************************************************************************** +// +// Snow Image +// +//***************************************************************************** +const uint8_t g_pui8SnowImage[] = +{ + IMAGE_FMT_8BPP_COMP, + 128, 0, + 128, 0, + + 254, + 0x00, 0x00, 0x00, + 0x89, 0x4b, 0x09, + 0x8b, 0x4c, 0x09, + 0x8c, 0x4d, 0x09, + 0x8a, 0x4d, 0x0a, + 0x8c, 0x4d, 0x0b, + 0x8e, 0x4e, 0x0a, + 0x8e, 0x4e, 0x0b, + 0x8d, 0x4e, 0x0c, + 0x90, 0x50, 0x0a, + 0x91, 0x50, 0x0b, + 0x8f, 0x50, 0x0c, + 0x89, 0x4f, 0x11, + 0x91, 0x50, 0x0d, + 0x91, 0x51, 0x0e, + 0x8f, 0x51, 0x0f, + 0x92, 0x52, 0x0d, + 0x93, 0x52, 0x0d, + 0x92, 0x52, 0x0f, + 0x94, 0x53, 0x0d, + 0x93, 0x53, 0x0f, + 0x94, 0x54, 0x0e, + 0x94, 0x53, 0x10, + 0x95, 0x53, 0x10, + 0x91, 0x53, 0x12, + 0x97, 0x54, 0x0e, + 0x94, 0x54, 0x11, + 0x97, 0x55, 0x0e, + 0x96, 0x54, 0x11, + 0x96, 0x55, 0x11, + 0x96, 0x55, 0x12, + 0x97, 0x56, 0x10, + 0x97, 0x55, 0x12, + 0x98, 0x56, 0x11, + 0x9a, 0x57, 0x0f, + 0x98, 0x56, 0x12, + 0x96, 0x56, 0x14, + 0x99, 0x57, 0x11, + 0x99, 0x56, 0x13, + 0x99, 0x57, 0x13, + 0x9b, 0x58, 0x11, + 0x9a, 0x57, 0x14, + 0x9b, 0x58, 0x13, + 0x9b, 0x58, 0x14, + 0x9c, 0x5a, 0x10, + 0x9c, 0x58, 0x14, + 0x9b, 0x59, 0x14, + 0x9d, 0x5a, 0x12, + 0x9c, 0x59, 0x15, + 0x96, 0x59, 0x19, + 0x9b, 0x5a, 0x16, + 0x9c, 0x5b, 0x14, + 0x9f, 0x5c, 0x11, + 0x9d, 0x5a, 0x16, + 0x9e, 0x5b, 0x16, + 0xa0, 0x5b, 0x16, + 0x9e, 0x5b, 0x17, + 0x9f, 0x5c, 0x15, + 0xa0, 0x5c, 0x17, + 0xa2, 0x5f, 0x12, + 0xa1, 0x5d, 0x17, + 0x9e, 0x5d, 0x19, + 0xa3, 0x5f, 0x14, + 0xa3, 0x5d, 0x19, + 0x9e, 0x5d, 0x1b, + 0xa2, 0x60, 0x16, + 0xa2, 0x5f, 0x18, + 0xa6, 0x61, 0x14, + 0xa3, 0x60, 0x19, + 0xa5, 0x61, 0x17, + 0x9e, 0x5f, 0x1e, + 0xa5, 0x60, 0x1a, + 0xa4, 0x60, 0x1b, + 0xa5, 0x60, 0x1b, + 0xa6, 0x62, 0x19, + 0xa7, 0x61, 0x1c, + 0xa8, 0x64, 0x16, + 0xa6, 0x62, 0x1c, + 0xa8, 0x62, 0x1c, + 0xa9, 0x62, 0x1d, + 0xa9, 0x65, 0x19, + 0xa9, 0x64, 0x1b, + 0xa9, 0x64, 0x1d, + 0xab, 0x67, 0x18, + 0xa9, 0x64, 0x1f, + 0xac, 0x66, 0x1c, + 0x9f, 0x64, 0x25, + 0xab, 0x65, 0x1f, + 0xac, 0x66, 0x1f, + 0xad, 0x66, 0x20, + 0xaf, 0x6a, 0x18, + 0xac, 0x67, 0x20, + 0xab, 0x67, 0x21, + 0xae, 0x6a, 0x1c, + 0xae, 0x68, 0x20, + 0xad, 0x69, 0x1f, + 0xaf, 0x68, 0x21, + 0xa9, 0x68, 0x25, + 0xb0, 0x69, 0x21, + 0xb0, 0x6b, 0x20, + 0xb0, 0x6a, 0x23, + 0xb1, 0x6b, 0x22, + 0xb2, 0x6e, 0x1c, + 0xb2, 0x6b, 0x23, + 0xb2, 0x6b, 0x24, + 0xb1, 0x6c, 0x26, + 0xb3, 0x6e, 0x22, + 0xb6, 0x71, 0x1c, + 0xb3, 0x6f, 0x24, + 0xb5, 0x6f, 0x24, + 0xb6, 0x6f, 0x25, + 0xb6, 0x71, 0x22, + 0xb6, 0x70, 0x25, + 0xb2, 0x6f, 0x29, + 0xb6, 0x70, 0x27, + 0xb8, 0x71, 0x26, + 0xa7, 0x6e, 0x33, + 0xb8, 0x73, 0x25, + 0xb8, 0x72, 0x28, + 0xb9, 0x72, 0x28, + 0xba, 0x73, 0x28, + 0xbb, 0x77, 0x20, + 0xba, 0x74, 0x28, + 0xbb, 0x76, 0x26, + 0xba, 0x76, 0x28, + 0xbd, 0x74, 0x2b, + 0xbd, 0x76, 0x2b, + 0xbc, 0x77, 0x2a, + 0xb1, 0x74, 0x34, + 0xbd, 0x78, 0x29, + 0xbf, 0x77, 0x2c, + 0xbe, 0x7b, 0x25, + 0xbb, 0x77, 0x30, + 0xbf, 0x79, 0x2c, + 0xc1, 0x78, 0x2e, + 0xbf, 0x7a, 0x2c, + 0xc2, 0x7e, 0x25, + 0xbf, 0x7c, 0x2b, + 0xbf, 0x7c, 0x2c, + 0xc2, 0x7b, 0x2f, + 0xc4, 0x7c, 0x2f, + 0xc2, 0x7e, 0x2d, + 0xc2, 0x7e, 0x2e, + 0xc5, 0x7d, 0x31, + 0xbc, 0x7b, 0x39, + 0xc3, 0x7f, 0x2f, + 0xc6, 0x83, 0x27, + 0xc4, 0x80, 0x2e, + 0xc9, 0x7d, 0x33, + 0xc2, 0x7d, 0x36, + 0xc4, 0x80, 0x30, + 0xc5, 0x7f, 0x32, + 0xc5, 0x81, 0x31, + 0xc9, 0x80, 0x33, + 0xc7, 0x82, 0x32, + 0xc8, 0x82, 0x33, + 0xc5, 0x81, 0x38, + 0xcb, 0x81, 0x36, + 0xc8, 0x84, 0x33, + 0xca, 0x84, 0x34, + 0xcb, 0x84, 0x36, + 0xca, 0x86, 0x34, + 0xcc, 0x8b, 0x2a, + 0xcc, 0x85, 0x37, + 0xcb, 0x84, 0x3c, + 0xd0, 0x85, 0x39, + 0xcb, 0x88, 0x36, + 0xcc, 0x8b, 0x31, + 0xcc, 0x89, 0x37, + 0xcd, 0x89, 0x37, + 0xce, 0x8a, 0x38, + 0xcf, 0x8b, 0x39, + 0xd1, 0x8a, 0x3b, + 0xce, 0x8c, 0x39, + 0xd5, 0x89, 0x3d, + 0xd2, 0x8a, 0x3e, + 0xd1, 0x8d, 0x3a, + 0xd0, 0x8e, 0x3a, + 0xd7, 0x8b, 0x40, + 0xd1, 0x8f, 0x3c, + 0xc6, 0x89, 0x4d, + 0xd2, 0x8f, 0x3d, + 0xdb, 0x8c, 0x41, + 0xd5, 0x8f, 0x3e, + 0xd4, 0x96, 0x33, + 0xd8, 0x8f, 0x41, + 0xd3, 0x92, 0x3d, + 0xd4, 0x92, 0x3e, + 0xdf, 0x8e, 0x44, + 0xdb, 0x90, 0x43, + 0xd6, 0x93, 0x40, + 0xd5, 0x94, 0x3f, + 0xe2, 0x8f, 0x45, + 0xd8, 0x93, 0x41, + 0xd6, 0x94, 0x40, + 0xd9, 0x94, 0x43, + 0xd6, 0x96, 0x41, + 0xd6, 0x90, 0x4d, + 0xe1, 0x92, 0x46, + 0xd8, 0x96, 0x42, + 0xdd, 0x94, 0x45, + 0xdc, 0x95, 0x45, + 0xe5, 0x92, 0x48, + 0xe2, 0x93, 0x48, + 0xd9, 0x97, 0x44, + 0xdd, 0x94, 0x49, + 0xe7, 0x93, 0x49, + 0xde, 0x95, 0x49, + 0xda, 0x99, 0x44, + 0xe1, 0x96, 0x48, + 0xe4, 0x95, 0x49, + 0xea, 0x94, 0x49, + 0xe1, 0x97, 0x49, + 0xdb, 0x9a, 0x46, + 0xda, 0x9b, 0x45, + 0xe6, 0x96, 0x4b, + 0xe9, 0x96, 0x4b, + 0xde, 0x9a, 0x48, + 0xe1, 0x97, 0x4d, + 0xe4, 0x98, 0x4b, + 0xe7, 0x96, 0x4e, + 0xeb, 0x96, 0x4d, + 0xdc, 0x9c, 0x48, + 0xe9, 0x98, 0x4d, + 0xeb, 0x98, 0x4d, + 0xde, 0x9d, 0x48, + 0xe2, 0x9b, 0x4b, + 0xe0, 0x9c, 0x4a, + 0xe8, 0x99, 0x4d, + 0xe4, 0x9b, 0x4c, + 0xe9, 0x99, 0x50, + 0xdf, 0x9e, 0x4a, + 0xe7, 0x9b, 0x4d, + 0xe5, 0x9c, 0x4d, + 0xe1, 0x9e, 0x4b, + 0xe2, 0x9e, 0x4c, + 0xe5, 0x9c, 0x4f, + 0xce, 0x99, 0x67, + 0xe8, 0xa1, 0x62, + 0xee, 0xa6, 0x69, + 0xe0, 0xa8, 0x77, + 0xef, 0xb2, 0x7f, + 0xe8, 0xb3, 0x85, + 0xf1, 0xbd, 0x92, + 0xb8, 0xb7, 0xb6, + 0xf1, 0xc6, 0xa1, + 0xc1, 0xc0, 0xbf, + 0xef, 0xce, 0xb2, + 0xf6, 0xd1, 0xb4, + 0xe2, 0xd6, 0xcb, + 0xf7, 0xd9, 0xc1, + 0xf9, 0xe0, 0xcc, + 0xf2, 0xe5, 0xdb, + 0xfe, 0xfe, 0xfe, + 0xff, 0xff, 0xff, + + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc0, 0x07, 0x02, + 0xf5, 0xf8, 0xfb, 0xfb, 0xfb, 0xfa, 0x7f, 0xf8, 0x07, 0x07, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0xfa, + 0x02, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xcb, 0xfb, 0xff, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x03, + 0xfb, 0xfb, 0xfa, 0x00, 0xf5, 0xf1, 0xee, 0xe6, 0xd3, 0xd3, 0xd3, 0xdd, + 0x0f, 0xee, 0xf1, 0xf3, 0xfa, 0x89, 0x07, 0xbf, 0x77, 0xff, 0x2f, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x80, 0x07, 0xfa, 0xfb, 0xf8, 0xf1, + 0xe0, 0xd3, 0xdd, 0x30, 0xdd, 0xdd, 0xe9, 0xd1, 0xd3, 0xd3, 0xef, 0xf5, + 0x1f, 0xfb, 0xfb, 0xf8, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x03, 0xf8, 0x01, 0xfa, 0xf8, 0xef, 0xd3, 0xdd, + 0xdd, 0xdd, 0xe9, 0xc1, 0xd4, 0xa1, 0xd3, 0xee, 0xf7, 0xfb, 0xfb, 0x05, + 0xff, 0xcd, 0x97, 0x4f, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, + 0x05, 0xfa, 0xfa, 0xf3, 0xdd, 0xd8, 0x14, 0xdf, 0xdf, 0xdf, 0xe9, 0xe0, + 0xca, 0xdd, 0xdd, 0x00, 0xdd, 0xd8, 0xd8, 0xd3, 0xd3, 0xce, 0xef, 0xfa, + 0x7f, 0xfb, 0x03, 0xdb, 0xb7, 0x6f, 0x27, 0x07, 0x07, 0xf8, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xfa, 0xfa, 0xef, 0x00, 0xd8, 0xdd, 0xdd, 0xdd, 0xdd, + 0xe0, 0xe0, 0xe0, 0x20, 0xe0, 0xdf, 0xd9, 0xdd, 0xdd, 0xdf, 0xd8, 0xd8, + 0x00, 0xd8, 0xd8, 0xd8, 0xd3, 0xce, 0xe6, 0xf8, 0xfb, 0xff, 0x01, 0xe9, + 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x03, + 0xfa, 0xf8, 0xee, 0x01, 0xd8, 0xd8, 0xd8, 0xd8, 0xe4, 0xe4, 0xe4, 0xe9, + 0xa0, 0xd4, 0xe4, 0x7a, 0xce, 0xce, 0xce, 0xce, 0xce, 0x07, 0xf5, 0xfb, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xff, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x80, 0x01, 0xf8, 0xf8, 0xee, 0xd7, 0xd7, 0xd7, 0xdb, + 0x18, 0xe4, 0xe4, 0xe4, 0xe9, 0xd4, 0xe4, 0xe4, 0xdb, 0x80, 0x69, 0xd7, + 0xce, 0xca, 0xca, 0xca, 0xce, 0xf8, 0x0f, 0xfb, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0xfe, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, + 0x00, 0x00, 0xf8, 0xf0, 0xd2, 0xd7, 0xd7, 0xdb, 0xe4, 0x0c, 0xe4, 0xe8, + 0xe8, 0xe8, 0xe9, 0xd4, 0xe4, 0xe4, 0x00, 0xdb, 0xdb, 0xd7, 0xd2, 0xd2, + 0xca, 0xca, 0xca, 0x01, 0xca, 0xe6, 0xfa, 0xfa, 0x00, 0x00, 0x00, 0xe9, + 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0xc0, 0x07, 0x07, + 0xf8, 0xf3, 0xca, 0xd2, 0xdb, 0xdb, 0x00, 0xdb, 0xdb, 0xdb, 0xe8, 0xe8, + 0xe8, 0xe9, 0xe9, 0x48, 0xe9, 0xe9, 0xe9, 0xe9, 0xa9, 0xe4, 0xdb, 0xdb, + 0x00, 0xd7, 0xd2, 0xd2, 0xca, 0xca, 0xc6, 0xc0, 0xf0, 0x06, 0xfa, 0xf5, + 0x00, 0x00, 0x00, 0xe9, 0xd2, 0xf8, 0x03, 0xfb, 0xfb, 0xfb, 0xfc, 0xfb, + 0xfb, 0x77, 0x37, 0xfc, 0x7f, 0x37, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, + 0x00, 0xf7, 0xf7, 0xec, 0xd2, 0xd2, 0xd2, 0xdb, 0xdb, 0x03, 0xdb, 0xe5, + 0xe5, 0xe9, 0xe9, 0xe9, 0xe9, 0xd4, 0x08, 0xe5, 0xe5, 0xdb, 0xdb, 0x41, + 0xcb, 0xcb, 0xc6, 0x01, 0xc0, 0xbc, 0xf5, 0xfa, 0x00, 0x00, 0x00, 0xe9, + 0x00, 0x00, 0xf5, 0xfb, 0xfa, 0xf3, 0xef, 0xe6, 0xdd, 0x03, 0xdd, 0xee, + 0xef, 0xf3, 0xfb, 0xfb, 0x65, 0x2d, 0xfc, 0x97, 0x4f, 0x07, 0x07, 0x07, + 0x07, 0x00, 0x00, 0x00, 0xf3, 0xf7, 0xf1, 0xcb, 0xd2, 0xd1, 0xd4, 0xd4, + 0x00, 0xd4, 0xdb, 0xe2, 0xe5, 0xe5, 0xe5, 0xe9, 0xe9, 0x48, 0xe9, 0xe9, + 0xe9, 0xe9, 0xa9, 0xe5, 0xe2, 0xd4, 0x00, 0xdb, 0xd1, 0xcb, 0xcb, 0xc6, + 0xc6, 0xc0, 0xbc, 0x00, 0xee, 0xfa, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xfb, 0xf8, 0xef, 0xd3, 0xdd, 0xdd, 0xdd, 0xe9, 0x03, 0xdd, 0xd3, + 0xd3, 0xf1, 0xfa, 0xfa, 0x5b, 0x33, 0xfe, 0xb7, 0x6f, 0x27, 0x07, 0x07, + 0x07, 0x02, 0xf5, 0x00, 0xf5, 0xec, 0xda, 0xd4, 0xd1, 0xd1, 0xd4, 0xe2, + 0x03, 0xe2, 0xe2, 0xe2, 0xeb, 0xeb, 0xeb, 0xe9, 0xd4, 0xc0, 0x82, 0x41, + 0xc6, 0xc6, 0xc6, 0xbc, 0xbc, 0xb6, 0x00, 0xf5, 0xfa, 0x00, 0x00, 0x00, + 0x00, 0xfb, 0xf1, 0x08, 0xd3, 0xe0, 0xe0, 0xe0, 0xe9, 0xdd, 0xe0, 0xdd, + 0x03, 0xdd, 0xdd, 0xd3, 0xd3, 0xf3, 0xfb, 0x52, 0x32, 0xfc, 0xc6, 0x87, + 0x3f, 0x07, 0x07, 0x03, 0xf3, 0xf3, 0x18, 0xf5, 0xf5, 0xf5, 0xe9, 0xd1, + 0xf2, 0xda, 0xda, 0x00, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xe2, 0xe3, 0xe3, + 0x18, 0xeb, 0xeb, 0xeb, 0xe9, 0xd4, 0xea, 0xe3, 0xe3, 0x00, 0xd9, 0xd4, + 0xd1, 0xd1, 0xc8, 0xc8, 0xc8, 0xbc, 0x00, 0xbc, 0xbc, 0xee, 0xf8, 0xf3, + 0x00, 0x00, 0xfa, 0x00, 0xee, 0xd8, 0xd8, 0xdf, 0xdf, 0xe4, 0xe4, 0xe4, + 0x00, 0xe4, 0xe4, 0xdf, 0xdf, 0xd8, 0xd8, 0xd8, 0xce, 0x03, 0xca, 0xef, + 0xfb, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, 0x17, 0x07, 0x03, + 0xf1, 0xf3, 0xf3, 0x00, 0xf3, 0xf2, 0xf1, 0xef, 0xef, 0xee, 0xef, 0xf1, + 0x00, 0xf2, 0xf2, 0xf2, 0xda, 0xda, 0xcf, 0xcf, 0xcf, 0x00, 0xd4, 0xd4, + 0xd9, 0xe3, 0xe3, 0xe3, 0xe3, 0xea, 0x01, 0xea, 0xea, 0xeb, 0xeb, 0xeb, + 0xea, 0xeb, 0xc1, 0x80, 0x89, 0xd4, 0xd9, 0xd1, 0xd1, 0xc8, 0xcd, 0xc8, + 0x00, 0xc8, 0xc8, 0xc8, 0xcd, 0xf7, 0xf7, 0x00, 0xfa, 0x01, 0xe6, 0xd7, + 0xe4, 0xe4, 0xe4, 0xe4, 0xe8, 0xe9, 0x80, 0xda, 0xd7, 0xd7, 0xd7, 0xce, + 0xca, 0xef, 0xfb, 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, + 0x80, 0x07, 0x00, 0x00, 0xf1, 0xf1, 0xf1, 0xf1, 0xee, 0x00, 0xdd, 0xce, + 0xce, 0xce, 0xce, 0xca, 0xca, 0xcb, 0x00, 0xc6, 0xbc, 0xbc, 0xcd, 0xcf, + 0xcf, 0xcf, 0xcf, 0x00, 0xcf, 0xd9, 0xd9, 0xd9, 0xe3, 0xe3, 0xe3, 0xe3, + 0x01, 0xe3, 0xe7, 0xe7, 0xe7, 0xea, 0xea, 0xe7, 0xab, 0x80, 0x69, 0xd9, + 0xcf, 0xcf, 0xc8, 0xc8, 0xc8, 0xcd, 0x00, 0xcd, 0xc8, 0xf3, 0xf3, 0xf8, + 0xef, 0xd2, 0xd7, 0x04, 0xdb, 0xe4, 0xe8, 0xe8, 0xe8, 0xe9, 0xe8, 0xe8, + 0x00, 0xe4, 0xe4, 0xd7, 0xd7, 0xd2, 0xca, 0xca, 0xc0, 0x0f, 0xf3, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xc0, 0x17, 0x07, 0xef, 0xf1, 0xf1, + 0xef, 0xdc, 0xce, 0x00, 0xce, 0xce, 0xce, 0xca, 0xca, 0xcb, 0xcb, 0xc6, + 0x00, 0xc6, 0xc6, 0xbc, 0xbd, 0xbd, 0xc3, 0xc9, 0xc9, 0x00, 0xc9, 0xd9, + 0xd9, 0xd9, 0xd9, 0xe1, 0xe1, 0xe1, 0x0e, 0xe1, 0xe7, 0xe7, 0xe7, 0xe9, + 0xd1, 0x99, 0xe3, 0xc0, 0x59, 0x29, 0xc9, 0xc9, 0xcd, 0xcd, 0xda, 0xf0, + 0x00, 0xf5, 0xf3, 0xd2, 0xdb, 0xdb, 0xdb, 0xe5, 0xe9, 0x30, 0xe9, 0xe9, + 0xe9, 0xd1, 0xe5, 0xe5, 0xdb, 0xd2, 0x00, 0xcb, 0xcb, 0xc6, 0xc0, 0xfa, + 0x00, 0x00, 0x00, 0xfc, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x05, 0xf0, 0xf1, + 0x04, 0xef, 0xce, 0xca, 0xca, 0xca, 0xe9, 0xc6, 0xc6, 0x00, 0xc6, 0xc6, + 0xc8, 0xc8, 0xbd, 0xbd, 0xc3, 0xc3, 0x00, 0xc3, 0xc3, 0xc9, 0xd0, 0xd5, + 0xd5, 0xd5, 0xde, 0x03, 0xde, 0xde, 0xde, 0xe1, 0xe1, 0xe1, 0xe9, 0xd4, + 0x80, 0x81, 0xd5, 0xd5, 0xcc, 0xc9, 0xc6, 0xd1, 0xda, 0x00, 0xdc, 0xec, + 0xec, 0xee, 0xf7, 0xee, 0xd4, 0xd4, 0x00, 0xe2, 0xe2, 0xe5, 0xe5, 0xe5, + 0xeb, 0xeb, 0xeb, 0x80, 0xe9, 0xe5, 0xe5, 0xe2, 0xd4, 0xd4, 0xd1, 0xc6, + 0x01, 0xc6, 0xbc, 0xf0, 0xf8, 0x00, 0x00, 0x00, 0xe9, 0xf8, 0xd4, 0xa7, + 0x5f, 0x17, 0x03, 0xef, 0xef, 0xe6, 0x10, 0xc0, 0xc0, 0xc0, 0xe9, 0xc0, + 0xc6, 0xbc, 0xbc, 0x10, 0xbd, 0xbd, 0xbd, 0xe9, 0xc1, 0xc3, 0xc3, 0xc3, + 0x00, 0xcc, 0xcc, 0xd0, 0xd0, 0xd5, 0xd5, 0xd5, 0xd5, 0x07, 0xde, 0xd5, + 0xde, 0xde, 0xde, 0xe9, 0xd3, 0x7a, 0x01, 0xc8, 0xe6, 0xef, 0xf3, 0xf5, + 0xf5, 0xf5, 0xe9, 0x00, 0xf2, 0xda, 0xd4, 0xd4, 0xd4, 0xe2, 0xe2, 0xeb, + 0x30, 0xeb, 0xeb, 0xe9, 0xd1, 0xe2, 0xe2, 0xd4, 0xd4, 0x00, 0xd1, 0xc6, + 0xbc, 0xbc, 0xbc, 0xf8, 0x00, 0x00, 0x7e, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, + 0x17, 0x02, 0xee, 0x06, 0xee, 0xcb, 0xbc, 0xbc, 0xbc, 0xe9, 0xd1, 0xbd, + 0x00, 0xbd, 0xbd, 0xb9, 0xb9, 0xb9, 0xb9, 0xc1, 0xbe, 0x00, 0xc1, 0xc1, + 0xc7, 0xc7, 0xcc, 0xcc, 0xd0, 0xd0, 0x03, 0xd0, 0xd0, 0xd0, 0xd6, 0xd6, + 0xd6, 0xe9, 0xd4, 0x80, 0xa1, 0xd0, 0xe6, 0xf1, 0xf3, 0xf1, 0xef, 0xee, + 0x00, 0xe6, 0xdc, 0xe6, 0xee, 0xee, 0xda, 0xda, 0xcf, 0x01, 0xcf, 0xd4, + 0xd9, 0xe3, 0xea, 0xea, 0xea, 0xe9, 0x80, 0xd1, 0xe3, 0xe3, 0xd9, 0xd9, + 0xc8, 0xc8, 0xbd, 0x01, 0xb6, 0xb6, 0xf2, 0xf5, 0x00, 0x00, 0x00, 0xe9, + 0xf0, 0xd4, 0xa7, 0x5f, 0x17, 0x00, 0x00, 0xee, 0xee, 0x00, 0xbc, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xbd, 0xb6, 0x00, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xb9, 0xb9, 0xb9, 0x00, 0xb9, 0xbe, 0xbe, 0xbe, 0xbe, 0xc1, 0xc7, 0xc7, + 0x00, 0xc7, 0xc7, 0xc7, 0xcc, 0xd0, 0xcc, 0xd0, 0xd0, 0x60, 0xd0, 0xe9, + 0xc2, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0x00, 0xd1, 0xef, 0xf1, 0xef, 0xdc, + 0xca, 0xca, 0xca, 0x00, 0xca, 0xcb, 0xc6, 0xc6, 0xc8, 0xc8, 0xc9, 0xc9, + 0x00, 0xc9, 0xd9, 0xd9, 0xd9, 0xe1, 0xe7, 0xe7, 0xe7, 0x80, 0xe9, 0xe1, + 0xe1, 0xe1, 0xd9, 0xd9, 0xc9, 0xc9, 0x00, 0xbd, 0xbd, 0xb6, 0xb2, 0xee, + 0xf8, 0x00, 0x00, 0x7c, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x00, 0xee, + 0x00, 0xee, 0xbc, 0xb6, 0xb2, 0xb6, 0xb2, 0xb6, 0xb6, 0x00, 0xb6, 0xb6, + 0xb9, 0xb6, 0xb9, 0xb9, 0xb9, 0xb9, 0x00, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, + 0xbb, 0xbe, 0xc2, 0x01, 0xc2, 0xc4, 0xc4, 0xc4, 0xc7, 0xc7, 0xc7, 0xe9, + 0x88, 0xd4, 0xcc, 0xcc, 0xcc, 0xe9, 0xcf, 0xef, 0xef, 0x00, 0xd7, 0xc0, + 0xca, 0xc6, 0xcb, 0xc6, 0xc6, 0xc6, 0x00, 0xbd, 0xbd, 0xbd, 0xc3, 0xc3, + 0xc9, 0xd5, 0xd5, 0x00, 0xd9, 0xd9, 0xde, 0xde, 0xe1, 0xe7, 0xe1, 0xe1, + 0x00, 0xe1, 0xe1, 0xde, 0xde, 0xde, 0xd5, 0xc9, 0xc9, 0x00, 0xc3, 0xb9, + 0xb2, 0xb2, 0xc5, 0xf8, 0x00, 0x00, 0x7c, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, + 0x17, 0xda, 0xda, 0x08, 0xc5, 0xae, 0xae, 0xae, 0xe9, 0xae, 0xb2, 0xb2, + 0x0c, 0xb2, 0xb7, 0xb7, 0xb7, 0xe9, 0xd1, 0xbb, 0xbb, 0x00, 0xbb, 0xbf, + 0xbf, 0xbf, 0xc2, 0xc2, 0xc2, 0xc4, 0x18, 0xc4, 0xc4, 0xc4, 0xb7, 0x99, + 0xc8, 0xee, 0xee, 0x10, 0xbc, 0xbc, 0xbc, 0xe9, 0xbc, 0xbd, 0xbd, 0xbd, + 0x00, 0xb9, 0xc1, 0xc1, 0xc3, 0xcc, 0xcc, 0xd0, 0xd0, 0x02, 0xd5, 0xd5, + 0xd5, 0xd5, 0xde, 0xde, 0xd2, 0xd5, 0x00, 0xd0, 0xd0, 0xcc, 0xc3, 0xc1, + 0xb9, 0xb2, 0xae, 0x07, 0xb2, 0xf5, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0xc1, 0x5f, 0x17, 0xc5, 0xc5, 0xa5, 0xa5, 0xa5, 0xe9, 0x00, 0xae, 0xae, + 0xae, 0xac, 0xae, 0xb7, 0xb7, 0xb7, 0x04, 0xb5, 0xb7, 0xb5, 0xb5, 0xb5, + 0xe9, 0xb7, 0xba, 0x07, 0xba, 0xba, 0xbb, 0xbb, 0xbb, 0xe9, 0xd4, 0xa2, + 0x00, 0xbf, 0xbf, 0xbe, 0xee, 0xda, 0xb6, 0xb6, 0xb6, 0x80, 0xe9, 0xbd, + 0xbd, 0xb9, 0xb9, 0xb9, 0xbe, 0xbe, 0x00, 0xbe, 0xc4, 0xc7, 0xc7, 0xc7, + 0xcc, 0xcc, 0xcc, 0x80, 0xe9, 0xd0, 0xd0, 0xcc, 0xd0, 0xcc, 0xcc, 0xc7, + 0x00, 0xc7, 0xc3, 0xc1, 0xb7, 0xb7, 0xae, 0xae, 0xae, 0x00, 0xf2, 0x00, + 0x00, 0xf2, 0xf3, 0xf3, 0xf2, 0xf0, 0x0f, 0xee, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x02, 0xda, 0xc5, 0xae, 0xa5, 0xa5, 0xa5, 0xe9, 0xa5, + 0x00, 0xa5, 0xac, 0xac, 0xac, 0xac, 0xb0, 0xb0, 0xb0, 0x01, 0xb0, 0xb3, + 0xb0, 0xb1, 0xb3, 0xb3, 0xb3, 0xe9, 0x05, 0xba, 0xb3, 0xba, 0xba, 0xba, + 0xe9, 0xba, 0x89, 0x40, 0xb5, 0xaa, 0xb5, 0xba, 0xcd, 0xda, 0xae, 0xae, + 0x00, 0xae, 0xae, 0xb2, 0xb2, 0xb2, 0xb7, 0xb7, 0xb7, 0x80, 0xe9, 0xbb, + 0xbb, 0xbe, 0xc2, 0xc2, 0xc2, 0xc2, 0x30, 0xc2, 0xc4, 0xdb, 0xd3, 0xbf, + 0xbf, 0xb7, 0xb7, 0x00, 0xac, 0xac, 0xac, 0xa5, 0xed, 0xf0, 0xf0, 0xed, + 0x00, 0xc5, 0xc5, 0xc5, 0xed, 0xf0, 0xf3, 0xf2, 0xda, 0x1e, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5c, 0xc5, 0x08, 0xc5, 0x9d, 0x9d, 0x9d, 0xe9, + 0xa0, 0xa3, 0xa3, 0x00, 0xa3, 0xa5, 0xaa, 0xab, 0xab, 0xb0, 0xb0, 0xb0, + 0x03, 0xb0, 0xb0, 0xab, 0xb1, 0xb1, 0xb1, 0xe9, 0xd4, 0x81, 0xa1, 0xb0, + 0xab, 0xb0, 0xb1, 0xb1, 0xac, 0xc1, 0x00, 0xaf, 0xc5, 0xae, 0xa5, 0xa5, + 0xa5, 0xa5, 0xac, 0x00, 0xac, 0xaf, 0xb7, 0xb7, 0xb5, 0xb5, 0xb3, 0xb5, + 0x04, 0xb5, 0xba, 0xba, 0xba, 0xbb, 0xe9, 0xbb, 0xbb, 0xc0, 0xd3, 0xba, + 0xba, 0xb5, 0xb3, 0xac, 0xac, 0xab, 0x01, 0xa5, 0xa5, 0xa3, 0xa0, 0x9d, + 0x9d, 0x9d, 0xe9, 0x00, 0x94, 0xa4, 0xc5, 0xf0, 0xf0, 0xbd, 0x00, 0x00, + 0x78, 0x00, 0xe9, 0xd4, 0xa7, 0x59, 0xc5, 0xc5, 0xa4, 0x00, 0x94, 0x94, + 0x94, 0x94, 0x99, 0x99, 0x99, 0x9d, 0x00, 0xa0, 0xa0, 0xa3, 0xa9, 0xa9, + 0xaa, 0xaa, 0xad, 0x1c, 0xad, 0xab, 0xad, 0xe2, 0xd2, 0xbb, 0xad, 0xaa, + 0x20, 0xaa, 0xaa, 0x41, 0xaa, 0xad, 0xaa, 0xab, 0xab, 0x00, 0xc5, 0xc5, + 0x9d, 0x9d, 0xa3, 0x9d, 0xa3, 0xa9, 0x00, 0xaa, 0xab, 0xb0, 0xb1, 0xb1, + 0xb3, 0xb1, 0xb3, 0x93, 0xd9, 0xb3, 0xb3, 0xe9, 0xb1, 0xb1, 0x81, 0xa1, + 0xc0, 0xd9, 0xa9, 0xab, 0xaa, 0xa9, 0xa3, 0xa3, 0xa3, 0x00, 0xa3, 0xa0, + 0xa0, 0xa0, 0x9d, 0x9d, 0x9d, 0x99, 0x00, 0x99, 0x94, 0x94, 0xc5, 0xf0, + 0xc5, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x00, 0xaf, 0xaf, + 0x10, 0x94, 0x94, 0x94, 0xe9, 0x94, 0x99, 0x99, 0x9b, 0x00, 0x9f, 0xa0, + 0xa3, 0xa6, 0xa8, 0xa9, 0xaa, 0xaa, 0x10, 0xa9, 0xa9, 0xa9, 0xe9, 0xa9, + 0xa8, 0xa9, 0xa8, 0x20, 0xa8, 0xa8, 0xe9, 0xa8, 0xa8, 0xa6, 0xa6, 0xa6, + 0x80, 0xe9, 0xa8, 0xa6, 0xa8, 0xa3, 0xc5, 0xa4, 0x99, 0x00, 0x99, 0x99, + 0x99, 0x9b, 0xa0, 0xa3, 0xa9, 0xaa, 0x18, 0xad, 0xad, 0xad, 0xe9, 0xd1, + 0xaa, 0xad, 0xaa, 0x03, 0xaa, 0xaa, 0xa9, 0xa9, 0xa8, 0xa8, 0x61, 0xb1, + 0x80, 0xa1, 0xa8, 0xa6, 0xa3, 0x9f, 0xa0, 0xa0, 0xa0, 0x00, 0xa0, 0x9f, + 0x9f, 0x9b, 0x9f, 0x9b, 0x99, 0x99, 0x00, 0x94, 0x94, 0x8c, 0xa4, 0xed, + 0xc5, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa7, 0xc5, 0xa4, 0xa4, 0x8f, + 0x00, 0x8f, 0x8c, 0x8f, 0x8c, 0x8c, 0x8f, 0x8f, 0x97, 0x00, 0x9a, 0x9a, + 0x9b, 0x9f, 0x9f, 0xa1, 0xa1, 0xa1, 0x1e, 0xa6, 0xa6, 0xa6, 0xe9, 0xb9, + 0xa1, 0xd3, 0x9f, 0x20, 0x9f, 0x9f, 0xe9, 0x9f, 0x9f, 0x9e, 0x9f, 0xa4, + 0x00, 0xa4, 0x94, 0x8f, 0x8f, 0x97, 0x97, 0x99, 0x9b, 0x00, 0x9f, 0xa1, + 0xa6, 0xa6, 0xa8, 0xa8, 0xa8, 0xa8, 0x00, 0xa8, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa1, 0xa1, 0x66, 0xa1, 0x02, 0x59, 0xa1, 0xa6, 0x39, 0x93, 0x9e, + 0x00, 0x9e, 0x9e, 0x9e, 0x9b, 0x9f, 0x9f, 0x9b, 0x9b, 0x00, 0x9a, 0x9a, + 0x97, 0x8f, 0x8c, 0x8b, 0x9c, 0xed, 0x0e, 0xb2, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa6, 0x9c, 0x00, 0xa4, 0x95, 0x8b, 0x86, 0x8b, 0x8b, 0x8b, 0x8b, + 0x00, 0x8b, 0x8c, 0x8f, 0x97, 0x9a, 0x9a, 0x9a, 0x9e, 0x02, 0x9e, 0x9e, + 0x9e, 0x9e, 0xa1, 0xa1, 0xcb, 0x9e, 0x06, 0x9e, 0x9b, 0x9e, 0x9a, 0x9b, + 0x59, 0x41, 0x9a, 0x10, 0x9a, 0x98, 0x9a, 0xa1, 0xa4, 0x9c, 0x8b, 0x8b, + 0x00, 0x8b, 0x8b, 0x8c, 0x8f, 0x97, 0x9a, 0x9a, 0x9e, 0x00, 0x9f, 0xa1, + 0xa1, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x80, 0x1b, 0x98, 0x98, 0x97, 0x97, + 0x97, 0x98, 0x98, 0xf0, 0xa2, 0x82, 0xc6, 0x23, 0x97, 0x91, 0x8c, 0x8b, + 0x01, 0x86, 0x82, 0x9c, 0xed, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa6, + 0x9c, 0xa4, 0x86, 0x86, 0x86, 0x86, 0x00, 0x86, 0x82, 0x86, 0x8b, 0x8b, + 0x8e, 0x91, 0x96, 0x00, 0x96, 0x98, 0x98, 0x98, 0x9a, 0x9e, 0x9e, 0x9a, + 0x20, 0x9a, 0x9a, 0xba, 0x9a, 0x96, 0x96, 0x96, 0x91, 0x00, 0x91, 0x91, + 0x91, 0x8c, 0x91, 0x8c, 0x8c, 0x8e, 0x10, 0x8b, 0x8e, 0x8e, 0x89, 0x9c, + 0x95, 0x82, 0x86, 0x01, 0x86, 0x86, 0x8b, 0x8b, 0x8c, 0x96, 0x96, 0x01, + 0x02, 0x9a, 0x98, 0x98, 0x96, 0x96, 0x91, 0x21, 0x8b, 0x10, 0x8b, 0x8b, + 0x8a, 0xda, 0x8b, 0x8c, 0x91, 0x91, 0x60, 0x91, 0xe9, 0xd1, 0x96, 0x96, + 0x98, 0x96, 0x98, 0x20, 0x98, 0x98, 0xe9, 0x98, 0x93, 0x91, 0x8c, 0x8b, + 0x00, 0x86, 0x82, 0x7d, 0xb4, 0xb4, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, + 0xa5, 0x9c, 0x9c, 0x82, 0x7d, 0x7d, 0x00, 0x7e, 0x7e, 0x7e, 0x7e, 0x82, + 0x87, 0x8b, 0x8d, 0x01, 0x8e, 0x8e, 0x91, 0x91, 0x93, 0x93, 0x93, 0xe9, + 0x00, 0x91, 0x96, 0x93, 0x91, 0x8e, 0x8e, 0x8d, 0x8a, 0x03, 0x8b, 0x8b, + 0x8b, 0x87, 0x87, 0x87, 0xe9, 0xd1, 0x00, 0x8a, 0x8b, 0x8e, 0x8e, 0x95, + 0x84, 0x7d, 0x7d, 0x04, 0x7d, 0x7e, 0x82, 0x87, 0x87, 0xa1, 0x91, 0x8e, + 0x20, 0x8e, 0x8e, 0x09, 0x85, 0x85, 0x82, 0x82, 0x82, 0x06, 0x7e, 0x7f, + 0x7e, 0x7e, 0x7e, 0xe9, 0x31, 0x87, 0x88, 0xe9, 0x87, 0x8a, 0x8a, 0x19, + 0x8e, 0x91, 0x91, 0x00, 0x93, 0x93, 0x93, 0x93, 0x93, 0x91, 0x8d, 0x8a, + 0x00, 0x87, 0x82, 0x7e, 0x78, 0x7d, 0xb4, 0x00, 0x00, 0x70, 0x00, 0xe9, + 0xd4, 0xa5, 0x95, 0x95, 0x7d, 0x7d, 0x40, 0x7d, 0xe9, 0x7e, 0x7e, 0x82, + 0x87, 0x87, 0x87, 0x00, 0x8a, 0x8d, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8e, + 0x00, 0x8d, 0x8e, 0x8b, 0x8a, 0x87, 0x87, 0x85, 0x85, 0x00, 0x82, 0x7f, + 0x82, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x20, 0x7f, 0x7f, 0xe1, 0x82, 0x87, + 0x87, 0x87, 0x84, 0x05, 0x7d, 0x77, 0x77, 0x78, 0x78, 0xa1, 0x85, 0x99, + 0x00, 0x87, 0x85, 0x81, 0x81, 0x7f, 0x7f, 0x7a, 0x7a, 0x42, 0x78, 0x69, + 0x78, 0x77, 0x77, 0x77, 0x29, 0x7a, 0x00, 0x7d, 0x7f, 0x7a, 0x7f, 0x7f, + 0x7f, 0x81, 0x81, 0x00, 0x81, 0x87, 0x87, 0x89, 0x89, 0x8a, 0x8d, 0x8d, + 0x40, 0x8d, 0xe9, 0x8d, 0x8d, 0x89, 0x85, 0x7f, 0x7a, 0x01, 0x77, 0x70, + 0x90, 0xa4, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa4, 0x90, 0x84, 0x77, + 0x77, 0x77, 0x77, 0x00, 0x78, 0x78, 0x7a, 0x7d, 0x7f, 0x7f, 0x7f, 0x81, + 0x04, 0x81, 0x87, 0x87, 0x87, 0x89, 0xe1, 0x87, 0x87, 0x41, 0x82, 0x89, + 0x7f, 0x7f, 0x7a, 0x7a, 0x7a, 0xe9, 0x80, 0xd4, 0x7a, 0x7a, 0x7f, 0x7e, + 0x7f, 0x84, 0x76, 0x00, 0x6e, 0x72, 0x70, 0x72, 0x77, 0x7a, 0x7a, 0x7c, + 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7a, 0x7a, 0x76, 0x73, 0x08, 0x72, 0x6e, + 0x6e, 0x6e, 0xe9, 0x6e, 0x6d, 0x6d, 0x40, 0x6d, 0xe9, 0x6e, 0x73, 0x72, + 0x73, 0x73, 0x73, 0x00, 0x76, 0x77, 0x7a, 0x7a, 0x7c, 0x81, 0x7f, 0x81, + 0x08, 0x81, 0x89, 0x89, 0x89, 0xe9, 0x89, 0x89, 0x81, 0x00, 0x81, 0x7c, + 0x7a, 0x73, 0x6e, 0x76, 0x90, 0x00, 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa4, + 0x84, 0x84, 0x72, 0x00, 0x72, 0x73, 0x72, 0x73, 0x73, 0x77, 0x77, 0x7a, + 0x01, 0x7a, 0x7a, 0x7f, 0x7f, 0x81, 0x81, 0x81, 0xe9, 0x20, 0x7f, 0x7f, + 0x99, 0x78, 0x77, 0x76, 0x76, 0x73, 0x18, 0x76, 0x73, 0x73, 0x12, 0xd1, + 0x73, 0x73, 0x76, 0x00, 0x7a, 0x78, 0x7a, 0x76, 0x71, 0x67, 0x68, 0x68, + 0x00, 0x6d, 0x6d, 0x6e, 0x70, 0x70, 0x70, 0x70, 0x73, 0x00, 0x6e, 0x6e, + 0x6d, 0x6d, 0x68, 0x68, 0x68, 0x64, 0x00, 0x67, 0x64, 0x64, 0x64, 0x64, + 0x67, 0x62, 0x62, 0x00, 0x65, 0x65, 0x65, 0x65, 0x68, 0x68, 0x67, 0x67, + 0x00, 0x6d, 0x6d, 0x6d, 0x6d, 0x70, 0x70, 0x75, 0x75, 0x01, 0x7a, 0x7b, + 0x7b, 0x7b, 0x81, 0x81, 0x81, 0xe9, 0x00, 0x7b, 0x7b, 0x75, 0x70, 0x6d, + 0x67, 0x68, 0x90, 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa4, 0x84, 0x84, + 0x00, 0x6d, 0x6e, 0x6e, 0x6e, 0x6e, 0x70, 0x70, 0x73, 0x03, 0x76, 0x76, + 0x77, 0x7a, 0x7a, 0x7a, 0xe9, 0xd1, 0x04, 0x76, 0x76, 0x76, 0x70, 0x70, + 0x42, 0x6e, 0x6e, 0x04, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0xd1, 0x6e, 0x6e, + 0x00, 0x70, 0x73, 0x72, 0x76, 0x76, 0x71, 0x5e, 0x60, 0x00, 0x62, 0x65, + 0x65, 0x67, 0x6a, 0x67, 0x6a, 0x67, 0x00, 0x65, 0x67, 0x65, 0x62, 0x62, + 0x60, 0x5e, 0x59, 0x30, 0x59, 0x59, 0xe9, 0xd3, 0x5e, 0x5e, 0x5e, 0x60, + 0x00, 0x60, 0x60, 0x62, 0x64, 0x64, 0x67, 0x67, 0x6a, 0x00, 0x6a, 0x6a, + 0x6d, 0x6d, 0x6f, 0x75, 0x75, 0x7b, 0x20, 0x7b, 0x7b, 0xe9, 0x75, 0x75, + 0x75, 0x6d, 0x65, 0x03, 0x65, 0x5e, 0x80, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0x80, 0xa4, 0x84, 0x84, 0x68, 0x68, 0x68, 0x6c, 0x67, 0x00, 0x6d, 0x6d, + 0x6d, 0x70, 0x70, 0x70, 0x73, 0x73, 0x44, 0x73, 0xe9, 0x76, 0x73, 0x70, + 0x89, 0x6d, 0x67, 0x83, 0x39, 0x67, 0x67, 0x67, 0x65, 0x65, 0xe9, 0xd9, + 0x00, 0x67, 0x68, 0x6d, 0x6d, 0x72, 0x6d, 0x72, 0x71, 0x01, 0x5c, 0x57, + 0x57, 0x58, 0x5e, 0x5e, 0x5e, 0xe9, 0x00, 0x5e, 0x5b, 0x58, 0x58, 0x57, + 0x57, 0x54, 0x4f, 0x00, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x4f, 0x52, 0x52, + 0x02, 0x52, 0x52, 0x52, 0x57, 0x57, 0x57, 0xe9, 0x5b, 0x00, 0x5b, 0x5e, + 0x5e, 0x60, 0x60, 0x63, 0x65, 0x65, 0x00, 0x6a, 0x6a, 0x6a, 0x6f, 0x6f, + 0x75, 0x75, 0x75, 0x00, 0x75, 0x6f, 0x6f, 0x6a, 0x63, 0x63, 0x5f, 0x58, + 0x0e, 0x71, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa4, 0x80, 0x00, 0x71, 0x64, + 0x64, 0x62, 0x65, 0x65, 0x65, 0x65, 0x00, 0x6a, 0x6a, 0x6a, 0x6d, 0x6a, + 0x6d, 0x6d, 0x6d, 0x88, 0xe9, 0x6a, 0x67, 0x6a, 0x72, 0x65, 0x62, 0x62, + 0x06, 0x62, 0x62, 0x60, 0x62, 0x60, 0xe9, 0xb2, 0x62, 0x00, 0x64, 0x68, + 0x68, 0x69, 0x65, 0x69, 0x61, 0x4d, 0x00, 0x4e, 0x4e, 0x4e, 0x52, 0x57, + 0x57, 0x57, 0x52, 0x00, 0x52, 0x4f, 0x4e, 0x4d, 0x4b, 0x49, 0x49, 0x49, + 0x82, 0xe9, 0x49, 0x4d, 0x4b, 0x4b, 0x4b, 0xe9, 0x4b, 0x10, 0x4d, 0x4e, + 0x4b, 0x09, 0x51, 0x4e, 0x51, 0x52, 0x00, 0x55, 0x58, 0x58, 0x5f, 0x63, + 0x63, 0x63, 0x6a, 0x00, 0x6a, 0x6a, 0x6f, 0x6f, 0x6f, 0x6f, 0x6a, 0x63, + 0x00, 0x63, 0x5f, 0x55, 0x51, 0x69, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, + 0xa4, 0x9c, 0x71, 0x69, 0x5e, 0x5e, 0x00, 0x5e, 0x5e, 0x60, 0x62, 0x62, + 0x65, 0x65, 0x65, 0xc4, 0xe9, 0xd3, 0x62, 0x60, 0x60, 0x5a, 0x5b, 0x5e, + 0x18, 0x59, 0x59, 0x59, 0xe9, 0xd4, 0x59, 0x5b, 0x60, 0x00, 0x60, 0x64, + 0x60, 0x64, 0x61, 0x48, 0x44, 0x44, 0x10, 0x47, 0x47, 0x47, 0xe9, 0x48, + 0x48, 0x44, 0x3f, 0x01, 0x3f, 0x3f, 0x3c, 0x3c, 0x3a, 0x3a, 0x3a, 0xc1, + 0x43, 0x48, 0xa1, 0x44, 0x44, 0x44, 0x44, 0x09, 0x02, 0x00, 0x4a, 0x47, + 0x4a, 0x4a, 0x51, 0x51, 0x55, 0x5f, 0x00, 0x5d, 0x5d, 0x63, 0x66, 0x66, + 0x66, 0x66, 0x5d, 0x00, 0x5d, 0x55, 0x51, 0x4e, 0x4a, 0x61, 0x00, 0x00, + 0x70, 0x00, 0xe9, 0xd4, 0xa5, 0x71, 0x69, 0x57, 0x57, 0x00, 0x58, 0x58, + 0x5b, 0x5f, 0x5e, 0x5e, 0x5f, 0x63, 0x00, 0x5f, 0x63, 0x63, 0x63, 0x63, + 0x63, 0x5e, 0x5e, 0x08, 0x5b, 0x58, 0x58, 0x58, 0x59, 0x57, 0x57, 0x57, + 0x38, 0x57, 0x52, 0xda, 0xba, 0x99, 0x5c, 0x57, 0x5c, 0x00, 0x5b, 0x58, + 0x61, 0x46, 0x33, 0x37, 0x3a, 0x3c, 0x00, 0x3c, 0x3c, 0x3a, 0x3c, 0x3a, + 0x3a, 0x36, 0x36, 0x00, 0x35, 0x35, 0x30, 0x30, 0x30, 0x32, 0x32, 0x35, + 0x11, 0x3a, 0x3f, 0x3f, 0xe9, 0x3a, 0x3a, 0x3a, 0x29, 0x00, 0x3f, 0x3f, + 0x3c, 0x42, 0x42, 0x3f, 0x3f, 0x44, 0x00, 0x44, 0x45, 0x47, 0x47, 0x4a, + 0x51, 0x55, 0x5d, 0x00, 0x5d, 0x5d, 0x5d, 0x5d, 0x55, 0x53, 0x50, 0x4a, + 0x03, 0x47, 0x44, 0x61, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x80, 0xa5, 0x80, + 0x61, 0x52, 0x4e, 0x4e, 0x52, 0x52, 0x00, 0x57, 0x58, 0x58, 0x58, 0x58, + 0x5f, 0x5f, 0x5f, 0x80, 0xe9, 0x58, 0x55, 0x55, 0x52, 0x4e, 0x45, 0x3e, + 0x00, 0x3e, 0x3e, 0x3e, 0x45, 0x4a, 0x4e, 0x4e, 0x4e, 0x06, 0x4e, 0x4f, + 0x4f, 0x4f, 0x4f, 0xd1, 0xb9, 0x54, 0x00, 0x52, 0x54, 0x57, 0x57, 0x61, + 0x3d, 0x28, 0x2a, 0x10, 0x2e, 0x2e, 0x2e, 0xe9, 0x27, 0x29, 0x27, 0x26, + 0x00, 0x26, 0x23, 0x23, 0x23, 0x23, 0x20, 0x20, 0x56, 0x00, 0x3d, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x35, 0x38, 0x00, 0x35, 0x38, 0x35, 0x35, 0x36, + 0x36, 0x36, 0x36, 0x00, 0x37, 0x37, 0x3a, 0x3a, 0x3c, 0x42, 0x42, 0x44, + 0x00, 0x45, 0x4a, 0x50, 0x53, 0x53, 0x53, 0x53, 0x50, 0x00, 0x50, 0x4a, + 0x45, 0x3f, 0x42, 0x61, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa5, 0x90, + 0x61, 0x54, 0x4b, 0x00, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x52, 0x52, 0x55, + 0x00, 0x55, 0x55, 0x55, 0x55, 0x57, 0x51, 0x52, 0x51, 0x00, 0x5e, 0x94, + 0xee, 0xf3, 0xf8, 0xfb, 0xfb, 0xf8, 0x00, 0xf3, 0xda, 0x82, 0x4e, 0x47, + 0x4d, 0x4b, 0x4b, 0x60, 0x4b, 0xe9, 0xd2, 0x4d, 0x4d, 0x4d, 0x4d, 0x51, + 0x00, 0x54, 0x46, 0x32, 0x1d, 0x1d, 0x1f, 0x1d, 0x21, 0x00, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1a, 0x1a, 0x1a, 0x16, 0x00, 0x17, 0x16, 0x14, 0x14, 0x80, + 0xed, 0xb4, 0x32, 0x18, 0x2b, 0x2b, 0x2b, 0xe9, 0xd4, 0x2b, 0x2b, 0x2e, + 0x00, 0x2e, 0x2e, 0x2d, 0x33, 0x36, 0x39, 0x3c, 0x3c, 0x00, 0x41, 0x45, + 0x45, 0x4c, 0x4c, 0x4c, 0x45, 0x45, 0x00, 0x41, 0x3c, 0x39, 0x3d, 0x84, + 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa6, 0x74, 0x61, 0x44, 0x48, 0x48, + 0x00, 0x47, 0x47, 0x47, 0x4a, 0x4e, 0x4d, 0x51, 0x51, 0x00, 0x4e, 0x52, + 0x51, 0x4d, 0x58, 0xc5, 0xf3, 0xfa, 0x00, 0xfb, 0xf8, 0xf3, 0xf2, 0xf3, + 0xf5, 0xfa, 0xfb, 0x00, 0xfa, 0xf1, 0x9d, 0x47, 0x3f, 0x48, 0x48, 0x48, + 0x00, 0x49, 0x48, 0x47, 0x48, 0x47, 0x47, 0x47, 0x47, 0x00, 0x49, 0x49, + 0x49, 0x4d, 0x4d, 0x46, 0x31, 0x14, 0x00, 0x11, 0x12, 0x12, 0x12, 0x10, + 0x12, 0x0e, 0x0e, 0x20, 0x0e, 0x0d, 0xe9, 0x1a, 0x74, 0xb4, 0x63, 0xb4, + 0x03, 0xb4, 0x40, 0x23, 0x27, 0x27, 0x27, 0xe9, 0xd4, 0x00, 0x27, 0x2a, + 0x2a, 0x28, 0x28, 0x28, 0x2f, 0x33, 0x00, 0x34, 0x3b, 0x3e, 0x3e, 0x3e, + 0x43, 0x43, 0x3e, 0x00, 0x3e, 0x34, 0x34, 0x2f, 0x3d, 0x00, 0x00, 0x00, + 0xe0, 0xe9, 0xd4, 0xa7, 0xb4, 0x54, 0x48, 0x3a, 0x3c, 0x00, 0x42, 0x3f, + 0x42, 0x44, 0x44, 0x44, 0x45, 0x4a, 0x00, 0x47, 0x4d, 0x44, 0x86, 0xf3, + 0xfb, 0xf7, 0xef, 0x00, 0xdd, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xca, 0xe6, + 0x00, 0xf1, 0xfa, 0xfb, 0xf1, 0x62, 0x3c, 0x3f, 0x3f, 0x60, 0x3f, 0xe9, + 0xd3, 0x44, 0x44, 0x44, 0x44, 0x48, 0x00, 0x4d, 0x31, 0x18, 0x0b, 0x0b, + 0x0b, 0x08, 0x08, 0x40, 0x08, 0xe9, 0x05, 0x0f, 0x46, 0x74, 0x80, 0x55, + 0x00, 0x55, 0x55, 0x90, 0x90, 0x56, 0x24, 0x1a, 0x1e, 0x30, 0x1e, 0x1e, + 0xe9, 0xd4, 0x1e, 0x20, 0x1f, 0x21, 0x00, 0x21, 0x28, 0x28, 0x2f, 0x34, + 0x34, 0x34, 0x34, 0x00, 0x39, 0x39, 0x34, 0x2f, 0x28, 0x2e, 0x71, 0x00, + 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x90, 0x56, 0x00, 0x38, 0x36, + 0x36, 0x37, 0x3a, 0x3c, 0x3c, 0x42, 0x00, 0x42, 0x44, 0x44, 0x44, 0xaf, + 0xf8, 0xf8, 0xef, 0x08, 0xd3, 0xd8, 0xd8, 0xd8, 0xe9, 0xd8, 0xd3, 0xd3, + 0x00, 0xd3, 0xca, 0xf1, 0xfb, 0xf5, 0x82, 0x3a, 0x3c, 0x18, 0x3a, 0x3a, + 0x3a, 0xe9, 0xd1, 0x3c, 0x3a, 0x3c, 0x00, 0x3c, 0x3c, 0x3c, 0x4d, 0x46, + 0x31, 0x18, 0x0f, 0x00, 0x05, 0x04, 0x02, 0x04, 0x08, 0x0f, 0x31, 0x56, + 0x00, 0x74, 0x5c, 0x45, 0x4a, 0x50, 0x50, 0x50, 0x65, 0x00, 0x80, 0x74, + 0x56, 0x40, 0x24, 0x24, 0x31, 0x46, 0x00, 0x56, 0x74, 0x46, 0x14, 0x16, + 0x16, 0x16, 0x16, 0x00, 0x17, 0x17, 0x17, 0x1c, 0x1f, 0x1f, 0x25, 0x28, + 0x00, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x28, 0x22, 0x21, 0x0f, 0x1d, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x59, 0x00, 0x61, 0x46, 0x2a, 0x2e, 0x33, + 0x36, 0x36, 0x39, 0x00, 0x3c, 0x42, 0x42, 0x3c, 0xc5, 0xfa, 0xf3, 0xce, + 0x01, 0xd7, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xe9, 0x00, 0xd7, 0xce, + 0xce, 0xca, 0xdc, 0xf7, 0xf8, 0x7d, 0x03, 0x36, 0x36, 0x35, 0x36, 0x36, + 0x36, 0xe9, 0xbc, 0x01, 0x39, 0x36, 0x3a, 0x48, 0x46, 0x46, 0x46, 0xe9, + 0x00, 0x56, 0x56, 0x61, 0x4d, 0x3c, 0x42, 0x41, 0x45, 0x00, 0x4a, 0x4a, + 0x4c, 0x50, 0x50, 0x5f, 0x69, 0x71, 0x00, 0x80, 0x80, 0x80, 0x80, 0x71, + 0x63, 0x74, 0x24, 0x10, 0x12, 0x12, 0x12, 0xe9, 0x12, 0x14, 0x15, 0x15, + 0x00, 0x1b, 0x1f, 0x1f, 0x22, 0x22, 0x22, 0x1f, 0x1f, 0x07, 0x1f, 0x17, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x80, 0x5b, 0x40, 0x3d, 0x25, 0x28, + 0x2a, 0x33, 0x36, 0x00, 0x3a, 0x3c, 0x42, 0x95, 0xf8, 0xf2, 0xca, 0xd7, + 0x00, 0xd7, 0xd7, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xd7, 0x00, 0xdb, 0xd7, + 0xd2, 0xd2, 0xd2, 0xca, 0xca, 0xca, 0x00, 0xf5, 0xf7, 0x59, 0x36, 0x35, + 0x30, 0x35, 0x35, 0x64, 0x35, 0xe9, 0xd2, 0x30, 0x30, 0x9b, 0x36, 0x3a, + 0x00, 0x38, 0x3a, 0x36, 0x36, 0x39, 0x39, 0x37, 0x3a, 0x00, 0x3c, 0x41, + 0x41, 0x45, 0x45, 0x45, 0x4c, 0x4c, 0x00, 0x50, 0x4c, 0x50, 0x53, 0x53, + 0x50, 0x50, 0x50, 0x00, 0x5c, 0x46, 0x12, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x00, 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11, 0x13, 0x13, 0x00, 0x19, 0x15, + 0x13, 0x13, 0x11, 0x00, 0x00, 0x00, 0xf0, 0xe9, 0xd4, 0xa7, 0x5c, 0xed, + 0x40, 0x32, 0x1f, 0x00, 0x27, 0x32, 0x38, 0x3d, 0x48, 0x52, 0xf5, 0xf5, + 0x03, 0xc6, 0xd2, 0xd2, 0xdb, 0xdb, 0xdb, 0xe9, 0xd3, 0x00, 0xd2, 0xcb, + 0xcb, 0xcb, 0xca, 0xca, 0xfa, 0xf2, 0x03, 0x2a, 0x35, 0x2e, 0x2b, 0x2b, + 0x2b, 0xe9, 0xd4, 0x80, 0xa4, 0x2e, 0x2e, 0x2e, 0x2e, 0x2d, 0x2d, 0x33, + 0x00, 0x36, 0x36, 0x39, 0x39, 0x39, 0x3c, 0x41, 0x45, 0x04, 0x45, 0x45, + 0x4c, 0x4c, 0x4c, 0xe9, 0x4c, 0x4c, 0x00, 0x45, 0x4d, 0x40, 0x0f, 0x07, + 0x08, 0x08, 0x08, 0x00, 0x08, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x10, 0x10, + 0x83, 0xe1, 0x0a, 0x74, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xc0, 0xa7, 0x5d, + 0xed, 0x32, 0x40, 0x2e, 0x38, 0x40, 0x00, 0x4d, 0x4d, 0xed, 0xf7, 0xda, + 0xcb, 0xd1, 0xd4, 0x04, 0xd4, 0xdb, 0xe5, 0xe5, 0xe5, 0xe9, 0xe2, 0xdb, + 0x00, 0xdb, 0xd4, 0xd1, 0xcb, 0xcb, 0xcb, 0xcb, 0xee, 0x00, 0xfb, 0x9c, + 0x32, 0x32, 0x2a, 0x25, 0x27, 0x27, 0x00, 0x27, 0x27, 0x26, 0x27, 0x27, + 0x23, 0x23, 0x27, 0x60, 0x27, 0xa3, 0x81, 0x2a, 0x2a, 0x2a, 0x2a, 0x28, + 0x00, 0x2a, 0x33, 0x2f, 0x39, 0x39, 0x34, 0x39, 0x3e, 0x04, 0x3e, 0x45, + 0x43, 0x43, 0x43, 0xe9, 0x3e, 0x3e, 0x01, 0x3e, 0x41, 0x32, 0x18, 0x08, + 0x05, 0x08, 0xe9, 0x00, 0x07, 0x07, 0x07, 0x06, 0x09, 0x09, 0x0b, 0x10, + 0x03, 0x6c, 0xa4, 0xb4, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xc0, 0xa7, 0x5d, + 0xf0, 0x56, 0x40, 0x32, 0x3d, 0x61, 0x00, 0x80, 0xf5, 0xf0, 0xc6, 0xc6, + 0xd1, 0xd1, 0xd4, 0x02, 0xe2, 0xe2, 0xe2, 0xeb, 0xea, 0xea, 0xd1, 0xd4, + 0x00, 0xd4, 0xd4, 0xd1, 0xcb, 0xc6, 0xc6, 0xbc, 0xf3, 0x00, 0xf5, 0x56, + 0x32, 0x2e, 0x21, 0x20, 0x20, 0x20, 0x01, 0x1e, 0x1e, 0x1e, 0x1e, 0x1d, + 0x1e, 0x1e, 0xc1, 0x80, 0x99, 0x20, 0x20, 0x23, 0x23, 0x23, 0x25, 0x23, + 0x00, 0x25, 0x25, 0x28, 0x2a, 0x2a, 0x2f, 0x2f, 0x34, 0x02, 0x34, 0x3b, + 0x3b, 0x3e, 0x3e, 0x3e, 0xe9, 0x3b, 0x00, 0x3e, 0x34, 0x34, 0x34, 0x32, + 0x24, 0x08, 0x04, 0x00, 0x02, 0x02, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02, + 0x00, 0x0e, 0x5f, 0x8d, 0x89, 0x87, 0xb4, 0xb4, 0x00, 0x3c, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x5c, 0xee, 0xf1, 0x00, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, + 0xf3, 0xcd, 0xcf, 0x00, 0xcd, 0xcf, 0xd4, 0xd9, 0xe3, 0xe3, 0xe2, 0xe2, + 0x10, 0xea, 0xea, 0xe3, 0xc9, 0xe3, 0xd4, 0xd4, 0xd1, 0x00, 0xc6, 0xc8, + 0xbc, 0xda, 0xfa, 0xb4, 0x80, 0x46, 0x00, 0x24, 0x1c, 0x17, 0x1a, 0x1a, + 0x1a, 0x1a, 0x1a, 0x98, 0xd1, 0x1e, 0x1c, 0xb3, 0xa1, 0x17, 0x1d, 0x1d, + 0x00, 0x1d, 0x21, 0x21, 0x25, 0x28, 0x28, 0x2f, 0x2f, 0x00, 0x2f, 0x34, + 0x34, 0x34, 0x3b, 0x3b, 0x3b, 0x3b, 0x80, 0xc9, 0x2f, 0x2f, 0x28, 0x28, + 0x3d, 0x6c, 0x7c, 0x00, 0x32, 0x12, 0x08, 0x08, 0x0f, 0x14, 0x41, 0x7c, + 0x00, 0xa1, 0x93, 0x8d, 0x89, 0x7c, 0x9c, 0xb4, 0x00, 0x3c, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x5a, 0xf1, 0xf3, 0x08, 0xf3, 0xf3, 0xf1, 0xf1, 0xd1, + 0xee, 0xcd, 0xcd, 0x00, 0xc9, 0xc9, 0xd9, 0xd9, 0xd9, 0xd9, 0xe3, 0xe3, + 0x60, 0xe3, 0xe9, 0xd1, 0xd9, 0xd1, 0xc8, 0xbd, 0xbd, 0x00, 0xb6, 0xb6, + 0xf5, 0xf0, 0xb4, 0x80, 0x74, 0x40, 0x00, 0x16, 0x12, 0x12, 0x12, 0x16, + 0x12, 0x14, 0x14, 0x00, 0x16, 0x31, 0x31, 0x24, 0x12, 0x16, 0x16, 0x16, + 0x00, 0x16, 0x16, 0x12, 0x16, 0x17, 0x17, 0x16, 0x17, 0x00, 0x1c, 0x1f, + 0x1f, 0x21, 0x21, 0x25, 0x28, 0x2c, 0x00, 0x2f, 0x2c, 0x2c, 0x34, 0x34, + 0x34, 0x2c, 0x2c, 0x00, 0x2f, 0x28, 0x28, 0x25, 0x2a, 0x32, 0xb8, 0xb8, + 0x40, 0xb8, 0xe9, 0xb8, 0xb8, 0xa7, 0xa7, 0x93, 0x8d, 0x00, 0x89, 0x81, + 0x7c, 0x84, 0x90, 0xa4, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa7, 0x00, + 0xf1, 0xf2, 0xef, 0x00, 0xe6, 0xce, 0xca, 0xca, 0xca, 0xcb, 0xc6, 0xbd, + 0x00, 0xbd, 0xc8, 0xc9, 0xc9, 0xc9, 0xd5, 0xd5, 0xd9, 0x00, 0xde, 0xde, + 0xde, 0xe1, 0xe1, 0xe1, 0xe3, 0xe3, 0x00, 0xd9, 0xd9, 0xd9, 0xc9, 0xc8, + 0xbd, 0xbd, 0xb6, 0x00, 0xb2, 0xf0, 0xf3, 0x9c, 0xb4, 0x90, 0x74, 0x74, + 0x00, 0x56, 0x46, 0x31, 0x31, 0x31, 0x46, 0x56, 0x74, 0x00, 0x74, 0x80, + 0x74, 0x24, 0x0e, 0x12, 0x12, 0x12, 0xc0, 0xe9, 0xd1, 0x14, 0x12, 0x14, + 0x13, 0x19, 0x19, 0x00, 0x1f, 0x1f, 0x1f, 0x22, 0x22, 0x28, 0x2c, 0x2c, + 0x00, 0x28, 0x28, 0x28, 0x22, 0x25, 0x1f, 0x1f, 0x24, 0x08, 0x83, 0xb8, + 0xb8, 0xb8, 0xe9, 0xb8, 0xa7, 0xa7, 0x00, 0xa2, 0x92, 0x88, 0x83, 0x7b, + 0x75, 0x76, 0x90, 0x0e, 0x9c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xf1, + 0x00, 0xef, 0xd7, 0xca, 0xca, 0xca, 0xca, 0xc6, 0xc6, 0x00, 0xc6, 0xbd, + 0xbd, 0xbd, 0xc3, 0xc3, 0xcc, 0xcc, 0x00, 0xd5, 0xd5, 0xd5, 0xd5, 0xde, + 0xde, 0xde, 0xe1, 0x80, 0xe1, 0xd9, 0xd5, 0xd5, 0xcc, 0xc3, 0xc3, 0xb9, + 0x00, 0xb2, 0xb2, 0xda, 0xf5, 0x9c, 0x90, 0x84, 0x90, 0x00, 0x90, 0x80, + 0x80, 0x74, 0x74, 0x74, 0x80, 0x80, 0x00, 0x80, 0x80, 0x71, 0x74, 0x56, + 0x12, 0x0e, 0x0e, 0x40, 0x0e, 0xe9, 0x0e, 0x0d, 0x0d, 0x0e, 0x10, 0x11, + 0x00, 0x11, 0x13, 0x13, 0x13, 0x19, 0x1b, 0x1b, 0x1b, 0x00, 0x1f, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x1f, 0x1b, 0x02, 0x1b, 0x1d, 0x50, 0xb8, 0xb8, + 0xb8, 0xe9, 0xb8, 0x00, 0xa7, 0xa7, 0xa2, 0x92, 0x92, 0x89, 0x83, 0x7b, + 0x01, 0x75, 0x6d, 0x90, 0x9c, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa6, + 0xef, 0xdc, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0xc6, 0xc0, 0xc6, 0xbd, 0xbd, + 0xbd, 0xbd, 0xc3, 0x00, 0xc3, 0xc3, 0xcc, 0xd0, 0xd0, 0xd5, 0xd5, 0xd5, + 0xc0, 0xe9, 0xd3, 0xd0, 0xd0, 0xc3, 0xc3, 0xb9, 0xb9, 0x00, 0xb2, 0xae, + 0xb9, 0xf3, 0xb4, 0x90, 0x84, 0x69, 0x00, 0x5e, 0x5c, 0x5c, 0x64, 0x69, + 0x64, 0x60, 0x5b, 0x00, 0x57, 0x58, 0x58, 0x71, 0x56, 0x31, 0x0b, 0x0b, + 0x60, 0x0b, 0xe9, 0xd4, 0x0a, 0x0a, 0x10, 0x11, 0x11, 0x00, 0x11, 0x13, + 0x13, 0x13, 0x19, 0x1b, 0x19, 0x1b, 0x00, 0x1b, 0x13, 0x15, 0x15, 0x33, + 0xa7, 0xb8, 0xb8, 0x40, 0xb8, 0xe9, 0xa7, 0xa2, 0xa2, 0xa2, 0x92, 0x92, + 0x00, 0x88, 0x83, 0x75, 0x6f, 0x6a, 0x84, 0x95, 0x00, 0x38, 0x00, 0x00, + 0xe9, 0xd4, 0xa5, 0xef, 0xbc, 0xb6, 0x00, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbd, 0xbd, 0xb9, 0x00, 0xb9, 0xb9, 0xb9, 0xc1, 0xc3, 0xc7, 0xc7, 0xcc, + 0x01, 0xcc, 0xcc, 0xcc, 0xd0, 0xd0, 0xd0, 0xd0, 0xd9, 0x80, 0xa9, 0xc7, + 0xc7, 0xc1, 0xb7, 0xb7, 0xae, 0xae, 0x00, 0xae, 0xf2, 0xc5, 0xb4, 0xc5, + 0xc5, 0xc5, 0xc5, 0x00, 0xa4, 0x7d, 0x62, 0x4e, 0x52, 0x52, 0x52, 0x52, + 0x00, 0x4f, 0x4f, 0x61, 0x46, 0x31, 0x08, 0x08, 0x08, 0x80, 0xe9, 0x08, + 0x08, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00, 0x0a, 0x0a, 0x0a, 0x10, 0x10, + 0x10, 0x10, 0x11, 0x10, 0x11, 0x11, 0x13, 0xe9, 0x1f, 0x92, 0xa2, 0xa2, + 0x60, 0xa2, 0xe9, 0xd2, 0x92, 0x92, 0x88, 0x83, 0x79, 0x00, 0x75, 0x6f, + 0x6a, 0x71, 0x84, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa4, 0xef, 0xbc, + 0xb2, 0xb2, 0xb2, 0x00, 0xb2, 0xb6, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb7, + 0x00, 0xb7, 0xbb, 0xbe, 0xc2, 0xc4, 0xc2, 0xc2, 0xc4, 0x30, 0xc4, 0xc4, + 0xe9, 0xd4, 0xc2, 0xc2, 0xbb, 0xbb, 0x00, 0xb7, 0xaf, 0xac, 0xa5, 0xa5, + 0xf0, 0xf2, 0xf3, 0x00, 0xf3, 0xf2, 0xf2, 0xf2, 0xf3, 0xf2, 0xf0, 0xc5, + 0x00, 0x73, 0x4e, 0x4d, 0x4b, 0x4d, 0x4b, 0x4b, 0x61, 0x00, 0x40, 0x24, + 0x08, 0x05, 0x08, 0x08, 0x08, 0x08, 0x80, 0xd1, 0x07, 0x07, 0x07, 0x07, + 0x0b, 0x0a, 0x0a, 0x60, 0x0a, 0xe9, 0xd3, 0x25, 0x88, 0x92, 0x92, 0xa2, + 0x30, 0xa2, 0xa2, 0xe9, 0xd1, 0x92, 0x92, 0x88, 0x83, 0x00, 0x79, 0x6f, + 0x6a, 0x63, 0x71, 0x84, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa3, 0xee, + 0xc5, 0xae, 0xae, 0x40, 0xae, 0xe9, 0xb2, 0xb7, 0xb7, 0xb7, 0xb7, 0xb5, + 0x0c, 0xb7, 0xbb, 0xbb, 0xbb, 0xe9, 0xd4, 0xbb, 0xba, 0x80, 0xd4, 0xb5, + 0xb3, 0xb0, 0xac, 0xac, 0xa5, 0xa3, 0x00, 0xaf, 0xc5, 0xaf, 0x9d, 0x94, + 0x99, 0x94, 0x9d, 0x00, 0xc5, 0xed, 0xf2, 0xf0, 0xb4, 0x59, 0x44, 0x47, + 0x00, 0x49, 0x48, 0x48, 0x54, 0x40, 0x18, 0x0f, 0x02, 0x12, 0x05, 0x05, + 0x05, 0xe9, 0x05, 0x08, 0xe2, 0x07, 0x30, 0x07, 0x07, 0xe9, 0xd1, 0x39, + 0x83, 0x88, 0x88, 0x00, 0x92, 0x92, 0x92, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0x80, 0xc1, 0x88, 0x83, 0x79, 0x6f, 0x6f, 0x63, 0x5f, 0x07, 0x69, 0x84, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa3, 0x08, 0xc5, 0xa5, 0xa5, 0xa5, 0xe9, + 0xac, 0xac, 0xb0, 0x00, 0xb0, 0xb0, 0xb3, 0xb1, 0xb3, 0xb3, 0xb3, 0xb3, + 0x63, 0xba, 0xda, 0xb9, 0xb1, 0xb3, 0xb1, 0x83, 0xc9, 0x00, 0xab, 0xaa, + 0xa3, 0xa3, 0xa3, 0xa0, 0xa0, 0x9d, 0x00, 0x9d, 0x9d, 0x9d, 0x9d, 0x99, + 0x94, 0x94, 0x94, 0x00, 0xc5, 0xf0, 0xed, 0x72, 0x3f, 0x3f, 0x3f, 0x3f, + 0x00, 0x3f, 0x48, 0x46, 0x18, 0x0f, 0x05, 0x02, 0x02, 0x44, 0x02, 0xe9, + 0x02, 0x02, 0x03, 0xe9, 0x03, 0x03, 0x00, 0x03, 0x03, 0x06, 0x08, 0x0b, + 0x53, 0x79, 0x79, 0x01, 0x79, 0x83, 0x88, 0x88, 0x92, 0x92, 0x92, 0xe9, + 0x00, 0x92, 0x92, 0x88, 0x83, 0x83, 0x79, 0x6b, 0x66, 0x01, 0x5d, 0x55, + 0x69, 0x84, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa2, 0xe6, 0xaf, 0x9d, + 0x9d, 0x9d, 0x9d, 0x00, 0x9d, 0xa3, 0xa3, 0xaa, 0xab, 0xab, 0xb1, 0xb1, + 0x50, 0xad, 0xe9, 0xb1, 0xc9, 0xad, 0xad, 0xad, 0xaa, 0x0c, 0xaa, 0xaa, + 0xa9, 0xa9, 0xd9, 0xbc, 0xa6, 0xa3, 0x00, 0x9f, 0xa0, 0xa0, 0xa0, 0x9f, + 0x99, 0x99, 0x9b, 0x00, 0x99, 0x99, 0x99, 0x94, 0x94, 0x8f, 0x94, 0xed, + 0x00, 0xed, 0x72, 0x37, 0x3c, 0x3c, 0x3a, 0x38, 0x3a, 0x00, 0x44, 0x32, + 0x18, 0x0f, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, + 0x02, 0x04, 0xe9, 0x00, 0x05, 0x08, 0x33, 0x5d, 0x66, 0x66, 0x6b, 0x6b, + 0x00, 0x79, 0x79, 0x83, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x92, 0x88, + 0x88, 0x83, 0x83, 0x79, 0x6b, 0x6b, 0x00, 0x66, 0x5d, 0x55, 0x64, 0x84, + 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa2, 0xb4, 0x94, 0x94, 0x94, 0x94, + 0x00, 0x94, 0x99, 0x9b, 0x9f, 0xa1, 0xa8, 0xa9, 0xa9, 0x20, 0xa9, 0xaa, + 0xe1, 0xa8, 0xa8, 0xa8, 0xa8, 0xa6, 0x08, 0xa6, 0xa1, 0xa1, 0xa1, 0xe9, + 0xa1, 0xa1, 0xa6, 0x20, 0xa6, 0xa6, 0xe9, 0xa1, 0x9f, 0x9f, 0x9e, 0x9e, + 0x00, 0x9b, 0x9e, 0x9b, 0x9a, 0x9b, 0x9a, 0x9a, 0x9a, 0x00, 0x97, 0x97, + 0x8f, 0x8f, 0x8c, 0x8b, 0xb4, 0xed, 0x00, 0x60, 0x36, 0x36, 0x36, 0x35, + 0x35, 0x35, 0x38, 0x00, 0x3d, 0x32, 0x18, 0x08, 0x04, 0x04, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x04, 0x04, 0x04, 0x05, 0x12, 0x00, 0x36, 0x51, + 0x50, 0x53, 0x53, 0x5d, 0x66, 0x66, 0x00, 0x6b, 0x6b, 0x79, 0x79, 0x83, + 0x88, 0x88, 0x88, 0x00, 0x88, 0x88, 0x83, 0x79, 0x79, 0x6b, 0x6b, 0x66, + 0x01, 0x5d, 0x53, 0x51, 0x61, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa3, + 0xa4, 0x8c, 0x8c, 0x8c, 0x8b, 0x8c, 0x00, 0x8f, 0x97, 0x9b, 0x9e, 0x9f, + 0xa1, 0xa1, 0xa1, 0x80, 0xe9, 0x9f, 0x9e, 0x9f, 0x9e, 0x9f, 0x9e, 0x9a, + 0x01, 0x9a, 0x9a, 0x9a, 0x9a, 0x98, 0x9a, 0x98, 0xc1, 0x1c, 0x9e, 0x9e, + 0x9e, 0x8c, 0x63, 0x51, 0x97, 0x91, 0x00, 0x91, 0x8c, 0x8b, 0x86, 0x82, + 0xb4, 0xb4, 0x3a, 0x10, 0x30, 0x30, 0x30, 0xe9, 0x30, 0x30, 0x38, 0x38, + 0x00, 0x32, 0x24, 0x24, 0x1a, 0x24, 0x1a, 0x24, 0x24, 0x00, 0x24, 0x32, + 0x42, 0x42, 0x41, 0x45, 0x45, 0x4a, 0x00, 0x50, 0x50, 0x53, 0x5a, 0x66, + 0x6b, 0x6b, 0x79, 0x30, 0x79, 0x79, 0xe9, 0xd1, 0x6b, 0x6b, 0x66, 0x5d, + 0x01, 0x53, 0x50, 0x52, 0x54, 0x00, 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa2, + 0xaf, 0x9c, 0x86, 0x86, 0x86, 0x86, 0x00, 0x8b, 0x8b, 0x91, 0x96, 0x98, + 0x9a, 0x9a, 0x9e, 0x00, 0x9a, 0x9a, 0x9a, 0x98, 0x98, 0x98, 0x96, 0x8f, + 0x00, 0x91, 0x91, 0x91, 0x8b, 0x8c, 0x8b, 0x8b, 0x8b, 0x20, 0x8b, 0x8e, + 0xb1, 0x93, 0x96, 0x93, 0x91, 0x96, 0x09, 0x91, 0x91, 0x96, 0x96, 0x31, + 0x96, 0x96, 0xe9, 0x00, 0x96, 0x91, 0x8f, 0x8f, 0x8b, 0x86, 0x7d, 0x7d, + 0x00, 0xb4, 0x90, 0x2a, 0x2b, 0x2b, 0x29, 0x29, 0x29, 0xc0, 0xe9, 0xd1, + 0x2e, 0x2b, 0x30, 0x30, 0x30, 0x30, 0x00, 0x35, 0x30, 0x35, 0x35, 0x39, + 0x39, 0x3c, 0x41, 0x00, 0x45, 0x4a, 0x4a, 0x53, 0x5a, 0x5a, 0x66, 0x6b, + 0x00, 0x6b, 0x79, 0x79, 0x79, 0x79, 0x79, 0x6b, 0x6b, 0x00, 0x6b, 0x66, + 0x5a, 0x53, 0x50, 0x4a, 0x52, 0x48, 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xa2, 0x95, 0x86, 0x00, 0x7d, 0x7d, 0x7d, 0x7e, 0x82, 0x87, 0x8a, 0x8e, + 0x00, 0x8e, 0x91, 0x93, 0x91, 0x91, 0x91, 0x8e, 0x8b, 0x00, 0x8b, 0x87, + 0x87, 0x85, 0x85, 0x85, 0x86, 0x82, 0x00, 0x7e, 0x7e, 0x7e, 0x82, 0x82, + 0x85, 0x85, 0x87, 0x08, 0x87, 0x8b, 0x8a, 0x8a, 0xe9, 0x8a, 0x8e, 0x8e, + 0x00, 0x8e, 0x8e, 0x8e, 0x91, 0x8e, 0x91, 0x91, 0x93, 0x00, 0x91, 0x91, + 0x91, 0x8e, 0x8b, 0x82, 0x7d, 0x78, 0x00, 0x90, 0xb4, 0x3a, 0x27, 0x27, + 0x23, 0x27, 0x23, 0x00, 0x23, 0x23, 0x23, 0x25, 0x27, 0x27, 0x25, 0x23, + 0x20, 0x27, 0x27, 0xd1, 0x27, 0x2a, 0x2a, 0x2e, 0x2e, 0x00, 0x2a, 0x34, + 0x39, 0x3e, 0x45, 0x4c, 0x4c, 0x53, 0x02, 0x5a, 0x66, 0x66, 0x6b, 0x6b, + 0x6b, 0xe9, 0x66, 0x00, 0x66, 0x5a, 0x53, 0x4c, 0x4c, 0x45, 0x4d, 0x00, + 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa3, 0x95, 0x7d, 0x77, 0x00, 0x77, 0x78, + 0x7a, 0x7d, 0x7f, 0x82, 0x87, 0x87, 0x00, 0x87, 0x8a, 0x8a, 0x89, 0x87, + 0x82, 0x7f, 0x7e, 0x00, 0x7d, 0x7f, 0x7a, 0x7d, 0x7a, 0x78, 0x78, 0x7a, + 0x40, 0x78, 0x39, 0x7a, 0x7a, 0x7a, 0x7f, 0x81, 0x7f, 0x00, 0x81, 0x81, + 0x81, 0x87, 0x81, 0x87, 0x8a, 0x89, 0x00, 0x8a, 0x8a, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8e, 0x00, 0x8e, 0x8d, 0x8a, 0x87, 0x7f, 0x7d, 0x77, 0x73, + 0x00, 0xb4, 0x71, 0x21, 0x20, 0x23, 0x1e, 0x20, 0x20, 0x02, 0x20, 0x1d, + 0x20, 0x1e, 0x20, 0x1e, 0xb9, 0x23, 0x80, 0xe9, 0x21, 0x21, 0x25, 0x25, + 0x28, 0x2f, 0x2f, 0x00, 0x39, 0x39, 0x3e, 0x43, 0x4c, 0x53, 0x5a, 0x5a, + 0x00, 0x5a, 0x66, 0x66, 0x66, 0x6b, 0x66, 0x5a, 0x5a, 0x00, 0x53, 0x53, + 0x43, 0x3e, 0x41, 0x42, 0x00, 0x00, 0x70, 0x00, 0xe9, 0xd4, 0xa3, 0x84, + 0x76, 0x72, 0x72, 0x00, 0x73, 0x73, 0x77, 0x7a, 0x7a, 0x7f, 0x7f, 0x81, + 0x00, 0x7f, 0x7f, 0x7c, 0x7a, 0x7a, 0x77, 0x77, 0x72, 0x02, 0x73, 0x72, + 0x70, 0x6e, 0x6e, 0x6e, 0xe9, 0x72, 0x01, 0x6e, 0x6e, 0x70, 0x73, 0x73, + 0x76, 0x77, 0x09, 0x00, 0x7a, 0x7c, 0x7c, 0x7c, 0x81, 0x81, 0x89, 0x89, + 0x04, 0x89, 0x89, 0x89, 0x8d, 0x8d, 0xc9, 0x81, 0x7f, 0x00, 0x7a, 0x77, + 0x72, 0x84, 0x90, 0x1f, 0x1c, 0x1d, 0x08, 0x17, 0x1a, 0x1a, 0x1a, 0xe2, + 0x1e, 0x1a, 0x1c, 0x80, 0xba, 0x1c, 0x1c, 0x1c, 0x1f, 0x21, 0x1f, 0x25, + 0x00, 0x28, 0x2c, 0x2f, 0x3b, 0x3b, 0x43, 0x43, 0x53, 0x08, 0x53, 0x5a, + 0x5a, 0x5a, 0xe9, 0x53, 0x53, 0x4c, 0x01, 0x43, 0x3e, 0x3e, 0x42, 0x00, + 0x00, 0x00, 0xe9, 0xc0, 0xd4, 0xa4, 0x84, 0x71, 0x68, 0x68, 0x6d, 0x6d, + 0x02, 0x6e, 0x70, 0x70, 0x73, 0x73, 0x73, 0xe9, 0x70, 0x00, 0x6d, 0x6d, + 0x6d, 0x68, 0x67, 0x68, 0x68, 0x68, 0xc0, 0xe9, 0xcc, 0x67, 0x6a, 0x6a, + 0x6d, 0x6d, 0x70, 0x00, 0x70, 0x70, 0x75, 0x75, 0x75, 0x75, 0x7b, 0x7c, + 0x02, 0x81, 0x81, 0x81, 0x89, 0x89, 0x89, 0xd1, 0x81, 0x00, 0x7a, 0x73, + 0x70, 0x6d, 0x71, 0x90, 0x46, 0x17, 0x00, 0x14, 0x14, 0x12, 0x16, 0x12, + 0x14, 0x14, 0x16, 0x00, 0x31, 0x31, 0x24, 0x12, 0x14, 0x16, 0x12, 0x16, + 0x00, 0x16, 0x16, 0x16, 0x1c, 0x17, 0x1d, 0x1f, 0x21, 0x00, 0x25, 0x28, + 0x2f, 0x34, 0x3b, 0x43, 0x43, 0x4c, 0x00, 0x4c, 0x4c, 0x53, 0x53, 0x53, + 0x4c, 0x4c, 0x43, 0x00, 0x43, 0x3e, 0x34, 0x39, 0x33, 0x00, 0x00, 0x00, + 0xe0, 0xe9, 0xd4, 0xa5, 0x71, 0x60, 0x60, 0x65, 0x65, 0x08, 0x65, 0x6a, + 0x6a, 0x6a, 0xe9, 0x6a, 0x67, 0x65, 0x00, 0x64, 0x62, 0x62, 0x60, 0x5e, + 0x60, 0x59, 0x59, 0x12, 0x59, 0x59, 0x60, 0xc1, 0x60, 0x60, 0xe9, 0x60, + 0x00, 0x62, 0x62, 0x62, 0x65, 0x67, 0x6a, 0x6a, 0x6d, 0x00, 0x6d, 0x70, + 0x75, 0x75, 0x7c, 0x7b, 0x7b, 0x7b, 0x40, 0x81, 0xe1, 0x75, 0x75, 0x70, + 0x6a, 0x67, 0x64, 0x00, 0x90, 0x74, 0x74, 0x56, 0x46, 0x31, 0x31, 0x31, + 0x00, 0x46, 0x56, 0x56, 0x00, 0x00, 0x74, 0x24, 0x0e, 0x10, 0x12, 0x12, + 0x12, 0xe9, 0x14, 0x14, 0x14, 0x15, 0x00, 0x15, 0x1b, 0x1f, 0x28, 0x2c, + 0x34, 0x34, 0x3b, 0x10, 0x43, 0x43, 0x43, 0xe9, 0x43, 0x43, 0x3b, 0x3b, + 0x03, 0x34, 0x34, 0x33, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x80, 0xa6, 0x69, + 0x57, 0x57, 0x58, 0x5b, 0x5e, 0x5e, 0x00, 0x63, 0x60, 0x62, 0x62, 0x5e, + 0x5e, 0x5e, 0x58, 0x00, 0x58, 0x57, 0x57, 0x54, 0x54, 0x52, 0x52, 0x4f, + 0x06, 0x52, 0x4f, 0x52, 0x57, 0x57, 0xe9, 0x11, 0x58, 0x00, 0x58, 0x59, + 0x5b, 0x5e, 0x5e, 0x60, 0x62, 0x65, 0x00, 0x6a, 0x6a, 0x6a, 0x6f, 0x6f, + 0x75, 0x75, 0x75, 0x00, 0x75, 0x7b, 0x75, 0x75, 0x6f, 0x6f, 0x6a, 0x65, + 0x03, 0x63, 0x5e, 0x80, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x00, 0xb4, 0x56, + 0x12, 0x0e, 0x0e, 0x0e, 0x0d, 0x0e, 0x00, 0x0d, 0x0e, 0x0e, 0x10, 0x0e, + 0x13, 0x15, 0x19, 0x00, 0x1f, 0x22, 0x22, 0x2c, 0x34, 0x34, 0x3b, 0x3b, + 0x40, 0x3b, 0xe9, 0x3b, 0x34, 0x34, 0x2c, 0x28, 0x5c, 0x1c, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa6, 0x84, 0x54, 0x00, 0x4e, 0x4e, 0x4e, 0x52, 0x57, + 0x58, 0x58, 0x58, 0x00, 0x57, 0x57, 0x52, 0x52, 0x4e, 0x4d, 0x4b, 0x49, + 0x00, 0x49, 0x49, 0x49, 0x49, 0x4d, 0x4b, 0x4b, 0x4b, 0x80, 0xe9, 0x4d, + 0x4d, 0x4d, 0x4e, 0x4e, 0x4f, 0x4f, 0x00, 0x4f, 0x52, 0x52, 0x57, 0x58, + 0x58, 0x5f, 0x5f, 0x00, 0x5e, 0x63, 0x63, 0x6a, 0x6a, 0x6f, 0x6f, 0x6f, + 0x80, 0xe9, 0x6f, 0x6a, 0x63, 0x5f, 0x58, 0x55, 0x71, 0x18, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0x00, 0x74, 0x31, 0x18, 0x0b, 0x0b, 0x0b, 0xe9, 0xd2, + 0x10, 0x10, 0x11, 0x00, 0x13, 0x1b, 0x1b, 0x22, 0x22, 0x2c, 0x34, 0x34, + 0x02, 0x34, 0x34, 0x34, 0x2c, 0x2c, 0x2c, 0xa9, 0x00, 0x38, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x00, 0x61, 0x44, 0x00, 0x48, 0x47, 0x47, 0x4a, 0x4a, + 0x4a, 0x4a, 0x4a, 0x01, 0x47, 0x49, 0x47, 0x44, 0x3f, 0x3f, 0x3f, 0xe9, + 0x44, 0x3a, 0xca, 0x48, 0x3f, 0x47, 0x31, 0x48, 0x48, 0x00, 0x47, 0x49, + 0x49, 0x49, 0x4b, 0x4b, 0x4e, 0x4e, 0x00, 0x4e, 0x51, 0x51, 0x55, 0x5f, + 0x5d, 0x63, 0x63, 0x00, 0x66, 0x6a, 0x6a, 0x6a, 0x66, 0x66, 0x63, 0x5d, + 0x01, 0x55, 0x51, 0x4e, 0x61, 0x00, 0x00, 0x00, 0xe9, 0x80, 0xd4, 0x00, + 0x00, 0x61, 0x31, 0x08, 0x08, 0x08, 0x80, 0xe9, 0x08, 0x0b, 0x0b, 0x0b, + 0x0a, 0x0a, 0x10, 0x00, 0x13, 0x13, 0x19, 0x1b, 0x1b, 0x22, 0x22, 0x22, + 0x00, 0x22, 0x2c, 0x22, 0x1b, 0x1b, 0x1f, 0x34, 0x00, 0x38, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x00, 0x00, 0x74, 0x00, 0x48, 0x3a, 0x3a, 0x3c, 0x42, + 0x42, 0x42, 0x42, 0x00, 0x3c, 0x3c, 0x3c, 0x37, 0x37, 0x36, 0x36, 0x35, + 0x00, 0x35, 0x35, 0x35, 0x30, 0x37, 0x3a, 0x3f, 0x3f, 0x2c, 0x3a, 0x3a, + 0xd9, 0x3f, 0xe2, 0xc9, 0x44, 0x44, 0x00, 0x44, 0x47, 0x47, 0x4a, 0x4a, + 0x51, 0x50, 0x55, 0x08, 0x55, 0x5d, 0x5d, 0x5d, 0xe9, 0x5d, 0x55, 0x51, + 0x03, 0x51, 0x45, 0x61, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x80, 0xa1, 0x56, + 0x24, 0x08, 0x05, 0x08, 0x05, 0x05, 0x00, 0x08, 0x07, 0x07, 0x07, 0x07, + 0x0a, 0x0a, 0x0a, 0x00, 0x11, 0x11, 0x11, 0x19, 0x19, 0x19, 0x1b, 0x1b, + 0x07, 0x19, 0x19, 0x13, 0x1b, 0x3c, 0x02, 0xe2, 0xc6, 0x80, 0x87, 0x46, + 0x32, 0x2a, 0x2e, 0x30, 0x33, 0x35, 0x00, 0x35, 0x2d, 0x33, 0x2e, 0x2e, + 0x29, 0x29, 0x27, 0x20, 0x27, 0x27, 0xe9, 0x27, 0x30, 0x38, 0x38, 0x38, + 0xc0, 0xe9, 0xd4, 0x38, 0x38, 0x37, 0x37, 0x3a, 0x3a, 0x00, 0x3a, 0x3c, + 0x42, 0x42, 0x44, 0x4a, 0x4a, 0x51, 0x00, 0x53, 0x53, 0x55, 0x55, 0x55, + 0x55, 0x50, 0x51, 0x01, 0x4a, 0x44, 0x42, 0x61, 0x00, 0x00, 0x00, 0xe9, + 0xc0, 0xd4, 0xa2, 0x74, 0x18, 0x0f, 0x02, 0x05, 0x05, 0x10, 0x05, 0x05, + 0x08, 0xe9, 0x07, 0x07, 0x09, 0x0a, 0x04, 0x0a, 0x10, 0x11, 0x11, 0x11, + 0xe9, 0x10, 0x61, 0xf0, 0x04, 0xd4, 0xa7, 0x5c, 0x40, 0x23, 0x21, 0x21, + 0x00, 0x21, 0x23, 0x21, 0x23, 0x20, 0x21, 0x1d, 0x1c, 0x00, 0x1c, 0x1a, + 0x1c, 0x1c, 0x1c, 0x17, 0x17, 0x46, 0x01, 0x00, 0x74, 0x29, 0x2b, 0x2d, + 0x2d, 0x2d, 0xe9, 0x00, 0x2d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2d, 0x30, 0x30, + 0x00, 0x30, 0x35, 0x35, 0x36, 0x36, 0x37, 0x3c, 0x45, 0x00, 0x45, 0x4a, + 0x4c, 0x50, 0x50, 0x50, 0x50, 0x4a, 0x00, 0x45, 0x42, 0x3c, 0x3c, 0x69, + 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa3, 0x31, 0x1a, 0x0f, 0x05, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x00, 0x03, 0x06, + 0x06, 0x06, 0x09, 0x0a, 0x09, 0x0a, 0x1e, 0x0a, 0x13, 0x0c, 0x06, 0xc6, + 0x87, 0x3a, 0x31, 0x08, 0x1d, 0x14, 0x14, 0x14, 0xe9, 0x14, 0x12, 0x12, + 0x01, 0x12, 0x12, 0x0e, 0x0e, 0x0e, 0x0b, 0x46, 0x01, 0x04, 0x74, 0x21, + 0x27, 0x27, 0x27, 0xe9, 0x27, 0x26, 0x20, 0x27, 0x26, 0xda, 0x27, 0x2a, + 0x2a, 0x2a, 0x2e, 0x00, 0x33, 0x39, 0x39, 0x3c, 0x3e, 0x3e, 0x45, 0x45, + 0x00, 0x45, 0x43, 0x3e, 0x3e, 0x39, 0x39, 0x3d, 0x00, 0x38, 0x00, 0x00, + 0xe9, 0xd4, 0xa6, 0x0c, 0x18, 0x0f, 0x08, 0x04, 0x02, 0x02, 0x02, 0xe9, + 0x03, 0x03, 0x03, 0x87, 0xe9, 0x06, 0x0b, 0x11, 0x0c, 0x07, 0xbf, 0x77, + 0x80, 0x2c, 0x18, 0x0b, 0x0b, 0x0b, 0x0d, 0x0b, 0x07, 0x00, 0x07, 0x08, + 0x08, 0x08, 0x08, 0x07, 0x0b, 0x56, 0x80, 0x04, 0x29, 0x1c, 0x20, 0x20, + 0x1e, 0x1e, 0x1d, 0x08, 0x20, 0x24, 0x1e, 0x20, 0xb9, 0x20, 0x20, 0x23, + 0x00, 0x23, 0x21, 0x28, 0x28, 0x33, 0x2f, 0x34, 0x39, 0x00, 0x3b, 0x3e, + 0x3b, 0x3e, 0x39, 0x34, 0x2f, 0x2a, 0x0e, 0x44, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x00, 0x00, 0x00, 0x2e, 0x0f, 0x04, 0x04, 0x01, 0x01, 0x02, + 0x01, 0x01, 0x02, 0x04, 0x05, 0x08, 0x04, 0x1f, 0x07, 0xe0, 0x07, 0x77, + 0x2f, 0x00, 0x31, 0x0f, 0x05, 0x02, 0x12, 0x02, 0x02, 0x04, 0xe1, 0x08, + 0x31, 0x07, 0x56, 0x00, 0x24, 0x16, 0x14, 0x14, 0x14, 0x16, 0x31, 0x46, + 0x00, 0x1e, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x00, 0x1c, 0x1d, + 0x1f, 0x21, 0x28, 0x28, 0x2c, 0x2f, 0x00, 0x2f, 0x2f, 0x2f, 0x28, 0x28, + 0x25, 0x29, 0x00, 0x3f, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0xe0, 0x07, 0x07, 0x07, 0x00, 0x00, 0x56, 0x31, 0x24, 0x06, 0x1d, 0x1a, + 0x1e, 0x31, 0x56, 0x07, 0x02, 0x80, 0x10, 0x74, 0x74, 0x74, 0x01, 0x74, + 0x12, 0x12, 0x12, 0x80, 0xe9, 0x12, 0x12, 0x14, 0x15, 0x15, 0x1f, 0x1f, + 0x00, 0x25, 0x22, 0x22, 0x22, 0x22, 0x1f, 0x1f, 0x1f, 0x7f, 0x44, 0x31, + 0x19, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x02, 0x31, 0x08, 0x0b, 0x0d, 0x0d, 0x0d, 0xe9, 0x0d, 0x10, 0x11, + 0x04, 0x11, 0x13, 0x19, 0x1b, 0x19, 0xe9, 0x15, 0x2f, 0xff, 0x07, 0xbf, + 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x07, 0x24, + 0x08, 0x08, 0x08, 0x00, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, + 0x17, 0x10, 0x10, 0x10, 0xe9, 0x28, 0x07, 0xbf, 0x77, 0xff, 0x2f, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x80, 0x07, 0x00, 0x00, 0x24, 0x08, + 0x03, 0x05, 0x03, 0x00, 0x05, 0x05, 0x08, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x0f, 0x09, 0x07, 0x0b, 0x1b, 0x07, 0xbf, 0x77, 0x2f, 0x08, 0x00, 0xfe, + 0x00, 0xf9, 0x01, 0xf9, 0xf6, 0xfe, 0xff, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0x07, 0x07, 0x01, 0x00, 0x46, 0x08, 0x05, 0x02, 0x02, 0x02, 0x02, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x0a, 0x07, 0x07, 0xc0, 0x77, 0x2f, + 0x00, 0x00, 0xf6, 0xfd, 0xfe, 0xf6, 0xbf, 0x01, 0xfe, 0xd3, 0x07, 0xa7, + 0x5f, 0x17, 0x07, 0xc0, 0x07, 0x07, 0x00, 0x00, 0x46, 0x08, 0x04, 0x04, + 0x03, 0x01, 0x01, 0x04, 0x04, 0x05, 0x0b, 0x07, 0x07, 0xe1, 0x77, 0x2f, + 0x02, 0xfe, 0xfe, 0xfd, 0xfe, 0xd1, 0x1f, 0xfd, 0xfe, 0xfe, 0xc9, 0x07, + 0xaf, 0x67, 0x1f, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x8b, 0x07, 0xfe, 0xfe, 0xfe, 0xe9, 0xf4, 0x07, 0x07, 0xff, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf1, 0x07, 0x07, 0x07, 0x01, 0xfe, + 0xfe, 0xfe, 0xe9, 0x3e, 0xfe, 0xfe, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x00, + 0x27, 0x00, 0xf9, 0xe2, 0xfe, 0xfe, 0x07, 0x07, 0x77, 0xc7, 0x2f, 0x01, + 0xfe, 0x00, 0xfe, 0xc4, 0xcc, 0x47, 0x8d, 0x52, 0xfe, 0xfe, 0xfe, 0xe9, + 0x01, 0xf9, 0x27, 0xf0, 0x07, 0x77, 0x2f, 0x03, 0xf6, 0xfd, 0xfe, 0xf6, + 0xbe, 0x01, 0xfe, 0xd3, 0x07, 0xa7, 0x5f, 0x17, 0xfe, 0x2e, 0xfe, 0xfe, + 0x01, 0xf6, 0xd3, 0x07, 0x79, 0xfd, 0xe0, 0x39, 0x21, 0x09, 0xfd, 0xfe, + 0xf4, 0xfe, 0xf6, 0xf8, 0x17, 0xbf, 0x77, 0x2f, 0x02, 0xfe, 0xfe, 0xfd, + 0x4f, 0xfe, 0xd1, 0xfd, 0xfe, 0xd1, 0x07, 0x07, 0x67, 0x81, 0x1f, 0xf9, + 0xfe, 0xfe, 0xfd, 0xfe, 0x00, 0xda, 0x6b, 0xfe, 0x07, 0x01, 0xf4, 0x81, + 0xfe, 0xe9, 0xd4, 0xfc, 0xa2, 0x17, 0xbf, 0x77, 0x2f, 0x03, 0xfe, 0xfe, + 0x5f, 0xfe, 0xe9, 0xf4, 0x07, 0x07, 0x77, 0x2f, 0x03, 0x01, 0xf4, 0xfe, + 0xfd, 0xfe, 0xfd, 0xfe, 0xfe, 0x07, 0xac, 0x04, 0xf6, 0x69, 0xfe, 0xe9, + 0xd1, 0xfd, 0xfe, 0x7c, 0xf4, 0x17, 0x07, 0x7f, 0x37, 0x05, 0xfe, 0xfe, + 0x4f, 0xfe, 0xe9, 0xfe, 0xfe, 0x07, 0x07, 0x77, 0x2f, 0x85, 0x03, 0xfd, + 0xfe, 0xfe, 0xfe, 0xe9, 0xf6, 0x07, 0x86, 0x04, 0xfe, 0x00, 0x00, 0xf4, + 0x34, 0xb1, 0xf9, 0xf8, 0x91, 0x07, 0xaf, 0x67, 0x1f, 0xfe, 0x00, 0x00, + 0x0d, 0xf4, 0xfe, 0xfe, 0xfe, 0xe9, 0xb1, 0xf9, 0x07, 0xe0, 0x07, 0x77, + 0x2d, 0xf9, 0x00, 0x00, 0xfe, 0xfe, 0x40, 0xfe, 0xe9, 0xfe, 0xfe, 0x00, + 0xfe, 0x00, 0xfc, 0xff, 0x07, 0x04, 0x2f, 0x47, 0x07, 0x6f, 0x27, 0x02, + 0x06, 0xf6, 0xfd, 0xfe, 0xfe, 0xfe, 0xe9, 0xd1, 0xfd, 0x0f, 0xfe, 0xf4, + 0xfe, 0xf6, 0x07, 0xbf, 0x77, 0x2c, 0x03, 0xfe, 0xfe, 0xfd, 0xfe, 0xfe, + 0xfe, 0xe9, 0xd2, 0x3f, 0xf4, 0xfe, 0x0f, 0x0f, 0x43, 0x4f, 0x07, 0x77, + 0xc1, 0x2f, 0x02, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0xe9, 0xfc, 0xd4, 0xa2, + 0x07, 0xbf, 0x77, 0x2a, 0xfe, 0xfe, 0x73, 0xfe, 0xe9, 0xd4, 0xa2, 0xfd, + 0xfe, 0x17, 0x13, 0xcf, 0x82, 0x59, 0xfe, 0xf4, 0x4f, 0x07, 0x77, 0x2f, + 0x83, 0x01, 0xf6, 0xfd, 0xfe, 0xfe, 0xfe, 0xe9, 0xd1, 0x07, 0xfd, 0xfe, + 0xf4, 0xfe, 0xf6, 0x07, 0xbf, 0x77, 0x81, 0x2c, 0xfe, 0xfe, 0xfd, 0xfe, + 0xfe, 0xfe, 0xe9, 0x98, 0xd2, 0xf4, 0xfe, 0x07, 0x03, 0xf6, 0xfd, 0xfe, + 0x5f, 0xf6, 0x71, 0xfe, 0xd3, 0x2f, 0xa7, 0x5f, 0x17, 0x00, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0xf4, 0xfe, 0xfe, 0x6f, 0xfe, 0xe9, 0xb1, 0xf9, 0x07, + 0x07, 0x77, 0x2d, 0x02, 0xf9, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xe9, 0xfe, + 0x5a, 0xfe, 0x01, 0xfc, 0x07, 0x04, 0xfe, 0x02, 0x00, 0x3f, 0xf9, 0xf6, + 0x22, 0x2f, 0xa7, 0x5f, 0x17, 0x03, 0x13, 0xfe, 0xfe, 0xfe, 0xe9, 0xfe, + 0xfe, 0x3f, 0x3f, 0x26, 0x00, 0xf9, 0x01, 0xf9, 0xf6, 0x37, 0x05, 0xfd, + 0x1f, 0xfe, 0xfe, 0xfe, 0xe9, 0x57, 0x0f, 0x77, 0x2f, 0xf0, 0x07, 0x07, + 0x07, 0x07, 0x00, 0xfe, 0xfe, 0xfe, 0xe1, 0xe9, 0x07, 0x06, 0xf6, 0xfd, + 0xfe, 0xf6, 0x13, 0xe0, 0xd2, 0x17, 0x73, 0xfd, 0xfe, 0xfd, 0xfe, 0xfe, + 0xff, 0x57, 0x0f, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x06, 0x09, 0xfe, 0xfe, + 0xfd, 0xfe, 0xd1, 0xfd, 0xfe, 0xd1, 0xce, 0x3f, 0x3f, 0x00, 0x00, 0x39, + 0x37, 0x02, 0xf9, 0xff, 0x43, 0x1a, 0x4f, 0x0f, 0x7f, 0x37, 0x07, 0x07, + 0xc2, 0x07, 0x05, 0xf6, 0xfd, 0xfe, 0xf6, 0x01, 0xfe, 0xe2, 0xd3, 0x07, + 0x03, 0xfe, 0xfe, 0xfe, 0xe9, 0xf4, 0xef, 0x57, 0x57, 0x01, 0xf6, 0xd3, + 0x2f, 0xa7, 0x5f, 0xf8, 0x17, 0x07, 0x07, 0x07, 0x03, 0xfe, 0x00, 0xf9, + 0x8c, 0x01, 0xf9, 0xf6, 0xfe, 0x3f, 0x3e, 0xfe, 0xfe, 0xb5, 0xe9, 0xfe, + 0x47, 0x4e, 0x00, 0x72, 0xf9, 0x09, 0xff, 0x3f, 0x07, 0x77, 0x2f, 0x07, + 0x07, 0x07, 0x07, 0xc0, 0x07, 0x07, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xf4, + 0x1b, 0xfe, 0xfe, 0xfe, 0xe9, 0xb1, 0xf9, 0x07, 0x07, 0xff, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, 0x03, 0xf6, 0xfd, + 0xfe, 0xfe, 0xfe, 0xc1, 0xe9, 0xd1, 0xfd, 0xfe, 0xf4, 0xfe, 0xf6, 0x07, + 0xff, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x01, 0xf4, 0xfd, 0xfe, 0xfe, 0x7f, 0xfe, 0xe9, 0xd4, 0xa2, 0x07, + 0xbf, 0x77, 0x2f, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x83, 0x01, 0xf6, 0xfd, 0xfe, 0xfe, 0xfe, 0xe9, 0xd1, 0x07, 0xfd, 0xfe, + 0xf4, 0xfe, 0xf6, 0x07, 0xbf, 0x77, 0xff, 0x2f, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xc0, 0x07, 0x03, 0xfe, 0x00, 0x00, 0xf4, 0xfe, 0xfe, + 0x6f, 0xfe, 0xe9, 0xb1, 0xf9, 0x07, 0x07, 0x77, 0x2f, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x89, 0x07, 0xfe, 0xfe, 0xfe, 0xe9, + 0xfe, 0xfe, 0x07, 0xff, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xf8, 0x07, 0x07, 0x07, 0x07, 0x02, 0xfe, 0xfe, 0xfe, 0xbf, 0xe9, 0xf4, + 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x00, 0x04, 0x00, 0xfe, 0xfe, 0xfd, 0xfe, 0xd1, 0xfd, 0xfe, + 0x7f, 0xfe, 0xc9, 0x07, 0xaf, 0x67, 0x1f, 0x07, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x05, 0xf6, 0x17, 0xfd, 0xfe, 0xf6, 0x01, 0xfe, + 0xd3, 0x07, 0xa7, 0xff, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xe2, 0x07, 0x07, 0x06, 0xfe, 0x00, 0xf9, 0x01, 0xf9, 0x3f, 0xf6, 0xfe, + 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, +}; + +//***************************************************************************** +// +// Moon Image +// +//***************************************************************************** +const uint8_t g_pui8MoonImage[] = +{ + IMAGE_FMT_8BPP_COMP, + 128, 0, + 128, 0, + + 223, + 0x00, 0x00, 0x00, + 0x05, 0x05, 0x05, + 0x0d, 0x0d, 0x0d, + 0x16, 0x16, 0x16, + 0x1c, 0x1d, 0x1d, + 0x1f, 0x1f, 0x1f, + 0x20, 0x20, 0x20, + 0x23, 0x23, 0x23, + 0x25, 0x25, 0x25, + 0x26, 0x26, 0x26, + 0x27, 0x27, 0x27, + 0x28, 0x28, 0x28, + 0x2a, 0x29, 0x29, + 0x29, 0x29, 0x2a, + 0x2b, 0x2b, 0x2b, + 0x2b, 0x2c, 0x2b, + 0x2c, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, + 0x2f, 0x2f, 0x2f, + 0x30, 0x30, 0x30, + 0x30, 0x30, 0x31, + 0x31, 0x31, 0x31, + 0x31, 0x32, 0x32, + 0x32, 0x32, 0x32, + 0x33, 0x33, 0x33, + 0x33, 0x33, 0x34, + 0x34, 0x34, 0x35, + 0x36, 0x35, 0x36, + 0x36, 0x37, 0x37, + 0x38, 0x38, 0x38, + 0x3a, 0x3a, 0x3a, + 0x3c, 0x3c, 0x3c, + 0x3d, 0x3d, 0x3d, + 0x3e, 0x3e, 0x3e, + 0x3f, 0x3f, 0x3f, + 0x40, 0x40, 0x41, + 0x40, 0x41, 0x41, + 0x42, 0x41, 0x42, + 0x42, 0x42, 0x42, + 0x42, 0x43, 0x42, + 0x43, 0x43, 0x43, + 0x44, 0x43, 0x43, + 0x43, 0x43, 0x44, + 0x43, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x44, 0x45, 0x44, + 0x44, 0x45, 0x45, + 0x45, 0x45, 0x45, + 0x46, 0x46, 0x46, + 0x46, 0x46, 0x47, + 0x47, 0x47, 0x47, + 0x48, 0x47, 0x48, + 0x48, 0x48, 0x47, + 0x48, 0x48, 0x48, + 0x47, 0x49, 0x48, + 0x49, 0x49, 0x48, + 0x48, 0x49, 0x49, + 0x49, 0x49, 0x49, + 0x4a, 0x49, 0x4a, + 0x4a, 0x4a, 0x4a, + 0x4b, 0x4a, 0x4a, + 0x4b, 0x4a, 0x4b, + 0x4a, 0x4b, 0x4a, + 0x4a, 0x4b, 0x4b, + 0x4b, 0x4b, 0x4b, + 0x4c, 0x4b, 0x4b, + 0x4b, 0x4b, 0x4c, + 0x4b, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, + 0x4d, 0x4c, 0x4c, + 0x4c, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, + 0x4e, 0x4e, 0x4d, + 0x4d, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, + 0x4f, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4f, + 0x4f, 0x4f, 0x4f, + 0x50, 0x4f, 0x4f, + 0x4f, 0x50, 0x50, + 0x50, 0x50, 0x50, + 0x50, 0x50, 0x51, + 0x51, 0x50, 0x51, + 0x50, 0x51, 0x51, + 0x51, 0x51, 0x51, + 0x52, 0x52, 0x51, + 0x52, 0x52, 0x52, + 0x52, 0x53, 0x53, + 0x53, 0x53, 0x53, + 0x53, 0x54, 0x53, + 0x54, 0x54, 0x54, + 0x55, 0x54, 0x54, + 0x55, 0x55, 0x55, + 0x56, 0x56, 0x56, + 0x57, 0x57, 0x57, + 0x57, 0x58, 0x58, + 0x58, 0x58, 0x58, + 0x58, 0x58, 0x59, + 0x58, 0x59, 0x58, + 0x59, 0x59, 0x59, + 0x5a, 0x5a, 0x5a, + 0x5b, 0x5b, 0x5b, + 0x5c, 0x5b, 0x5b, + 0x5b, 0x5c, 0x5c, + 0x5c, 0x5c, 0x5c, + 0x5d, 0x5c, 0x5c, + 0x5c, 0x5c, 0x5d, + 0x5d, 0x5d, 0x5d, + 0x5d, 0x5e, 0x5d, + 0x5d, 0x5e, 0x5e, + 0x5e, 0x5e, 0x5e, + 0x5f, 0x5e, 0x5f, + 0x5f, 0x5f, 0x5e, + 0x5f, 0x5f, 0x5f, + 0x5f, 0x60, 0x60, + 0x60, 0x60, 0x60, + 0x60, 0x60, 0x61, + 0x60, 0x61, 0x60, + 0x60, 0x61, 0x61, + 0x61, 0x61, 0x61, + 0x61, 0x62, 0x62, + 0x62, 0x62, 0x62, + 0x63, 0x62, 0x63, + 0x63, 0x63, 0x63, + 0x63, 0x63, 0x64, + 0x63, 0x64, 0x63, + 0x63, 0x64, 0x64, + 0x64, 0x64, 0x64, + 0x65, 0x64, 0x65, + 0x64, 0x65, 0x65, + 0x65, 0x65, 0x65, + 0x65, 0x66, 0x66, + 0x66, 0x66, 0x66, + 0x66, 0x66, 0x67, + 0x67, 0x66, 0x67, + 0x66, 0x67, 0x66, + 0x67, 0x67, 0x67, + 0x67, 0x67, 0x68, + 0x67, 0x68, 0x67, + 0x67, 0x68, 0x68, + 0x68, 0x68, 0x68, + 0x68, 0x68, 0x69, + 0x68, 0x69, 0x69, + 0x69, 0x69, 0x69, + 0x6a, 0x69, 0x69, + 0x6a, 0x69, 0x6b, + 0x6a, 0x6a, 0x6a, + 0x6a, 0x6b, 0x6b, + 0x6b, 0x6b, 0x6b, + 0x6c, 0x6b, 0x6b, + 0x6b, 0x6b, 0x6c, + 0x6c, 0x6c, 0x6c, + 0x6c, 0x6d, 0x6d, + 0x6d, 0x6d, 0x6d, + 0x6e, 0x6e, 0x6e, + 0x6f, 0x6e, 0x6f, + 0x6e, 0x6f, 0x6f, + 0x6f, 0x6f, 0x6f, + 0x6e, 0x6f, 0x70, + 0x70, 0x6f, 0x70, + 0x6f, 0x70, 0x70, + 0x70, 0x70, 0x70, + 0x71, 0x70, 0x70, + 0x70, 0x71, 0x70, + 0x71, 0x71, 0x71, + 0x71, 0x71, 0x72, + 0x72, 0x72, 0x71, + 0x72, 0x72, 0x72, + 0x71, 0x72, 0x73, + 0x73, 0x72, 0x73, + 0x72, 0x73, 0x73, + 0x73, 0x73, 0x73, + 0x74, 0x74, 0x74, + 0x74, 0x74, 0x75, + 0x75, 0x74, 0x75, + 0x75, 0x75, 0x75, + 0x76, 0x75, 0x75, + 0x75, 0x75, 0x76, + 0x75, 0x76, 0x76, + 0x76, 0x76, 0x76, + 0x76, 0x76, 0x78, + 0x77, 0x77, 0x77, + 0x78, 0x78, 0x78, + 0x79, 0x78, 0x79, + 0x78, 0x79, 0x79, + 0x79, 0x79, 0x79, + 0x7a, 0x79, 0x7a, + 0x7a, 0x7a, 0x79, + 0x7a, 0x7a, 0x7a, + 0x7b, 0x7a, 0x7a, + 0x7a, 0x7a, 0x7b, + 0x7a, 0x7b, 0x7a, + 0x7b, 0x7b, 0x7b, + 0x7b, 0x7c, 0x7c, + 0x7c, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7d, + 0x7c, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, + 0x7e, 0x7d, 0x7d, + 0x7d, 0x7e, 0x7d, + 0x7d, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, + 0x7f, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, + 0x81, 0x80, 0x80, + 0x80, 0x81, 0x7f, + 0x80, 0x80, 0x81, + 0x80, 0x81, 0x81, + 0x81, 0x81, 0x81, + 0x82, 0x81, 0x81, + 0x80, 0x81, 0x82, + 0x81, 0x82, 0x82, + 0x82, 0x82, 0x82, + 0x83, 0x82, 0x83, + 0x82, 0x83, 0x82, + 0x83, 0x83, 0x83, + 0x84, 0x84, 0x84, + 0x84, 0x85, 0x85, + 0x86, 0x86, 0x87, + + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x02, + 0x01, 0x02, 0x03, 0x00, 0x03, 0x04, 0x05, 0x06, 0x06, 0x06, 0x05, 0x04, + 0x3f, 0x03, 0x01, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0xfc, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, 0x03, 0x07, 0x13, 0x1b, + 0x1b, 0x1a, 0x1a, 0x00, 0x18, 0x17, 0x17, 0x18, 0x18, 0x1b, 0x1c, 0x1d, + 0x00, 0x20, 0x26, 0x30, 0x30, 0x18, 0x09, 0x08, 0x02, 0xff, 0x06, 0xc6, + 0x87, 0x3f, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x01, 0x02, + 0x03, 0x0e, 0x13, 0x00, 0x11, 0x0f, 0x0d, 0x0e, 0x11, 0x15, 0x1a, 0x1b, + 0x00, 0x1d, 0x1e, 0x20, 0x23, 0x24, 0x26, 0x26, 0x26, 0x00, 0x26, 0x27, + 0x28, 0x23, 0x21, 0x21, 0x23, 0x35, 0x03, 0x4d, 0x07, 0x0d, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x80, 0x07, 0x00, 0x01, 0x04, 0x0f, 0x0f, 0x0d, 0x09, 0x00, 0x0b, 0x11, + 0x17, 0x1b, 0x1d, 0x1e, 0x1f, 0x21, 0x00, 0x23, 0x26, 0x2c, 0x2f, 0x30, + 0x35, 0x39, 0x40, 0x00, 0x44, 0x47, 0x47, 0x4a, 0x50, 0x54, 0x53, 0x50, + 0x00, 0x46, 0x35, 0x2c, 0x2c, 0x54, 0x1e, 0x0f, 0x00, 0x3f, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x03, + 0x03, 0x0b, 0x0e, 0x00, 0x0a, 0x09, 0x0b, 0x11, 0x15, 0x1b, 0x1b, 0x1d, + 0x00, 0x1f, 0x22, 0x26, 0x2c, 0x2f, 0x31, 0x35, 0x35, 0x00, 0x3b, 0x40, + 0x44, 0x4a, 0x4d, 0x50, 0x56, 0x5a, 0x00, 0x5c, 0x5e, 0x60, 0x60, 0x5f, + 0x60, 0x60, 0x63, 0x00, 0x5d, 0x54, 0x40, 0x32, 0x5c, 0x20, 0x03, 0x00, + 0x3f, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x06, 0x01, 0x03, 0x0b, 0x09, 0x00, 0x07, 0x08, 0x0e, 0x13, 0x17, + 0x1a, 0x1d, 0x1f, 0x00, 0x22, 0x22, 0x24, 0x26, 0x2c, 0x2f, 0x30, 0x32, + 0x00, 0x35, 0x3b, 0x3b, 0x44, 0x4a, 0x4d, 0x50, 0x56, 0x00, 0x58, 0x5a, + 0x5d, 0x60, 0x64, 0x65, 0x6b, 0x6b, 0x00, 0x71, 0x71, 0x71, 0x71, 0x6e, + 0x68, 0x5d, 0x47, 0x03, 0x54, 0x23, 0x03, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x03, 0x00, 0x03, 0x0b, + 0x08, 0x06, 0x09, 0x0f, 0x13, 0x15, 0x00, 0x1b, 0x1e, 0x1f, 0x20, 0x21, + 0x22, 0x24, 0x26, 0x00, 0x28, 0x2c, 0x30, 0x32, 0x39, 0x3b, 0x40, 0x46, + 0x00, 0x47, 0x4a, 0x50, 0x56, 0x58, 0x5a, 0x5d, 0x62, 0x00, 0x63, 0x68, + 0x6e, 0x73, 0x71, 0x77, 0x77, 0x7b, 0x00, 0x7f, 0x82, 0x7f, 0x7b, 0x7b, + 0x71, 0x5a, 0x54, 0x07, 0x26, 0x03, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0xfc, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x00, 0x03, 0x00, 0x09, 0x07, + 0x06, 0x08, 0x0e, 0x11, 0x13, 0x1b, 0x00, 0x1d, 0x1e, 0x1e, 0x20, 0x21, + 0x22, 0x24, 0x26, 0x00, 0x28, 0x2f, 0x30, 0x32, 0x39, 0x3b, 0x40, 0x4d, + 0x00, 0x4c, 0x4f, 0x50, 0x58, 0x59, 0x5c, 0x5d, 0x60, 0x00, 0x68, 0x65, + 0x71, 0x73, 0x79, 0x7b, 0x7b, 0x7f, 0x00, 0x82, 0x84, 0x84, 0x88, 0x8c, + 0x8f, 0x84, 0x88, 0x00, 0x7f, 0x60, 0x5a, 0x2f, 0x03, 0x00, 0x00, 0x00, + 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x80, 0x04, 0x01, + 0x07, 0x08, 0x06, 0x08, 0x0e, 0x11, 0x00, 0x12, 0x1b, 0x1d, 0x1d, 0x1e, + 0x1e, 0x1f, 0x21, 0x00, 0x22, 0x23, 0x24, 0x28, 0x2c, 0x2f, 0x32, 0x35, + 0x00, 0x3b, 0x40, 0x47, 0x47, 0x50, 0x5a, 0x5a, 0x5c, 0x00, 0x5c, 0x5e, + 0x60, 0x68, 0x6b, 0x68, 0x73, 0x77, 0x00, 0x7b, 0x7f, 0x84, 0x88, 0x8c, + 0x88, 0x8c, 0x8f, 0x00, 0x92, 0x92, 0x97, 0x99, 0x94, 0x92, 0x8c, 0x65, + 0x07, 0x60, 0x39, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xfc, 0x5f, 0x17, + 0x07, 0x07, 0x07, 0x02, 0x03, 0x08, 0x00, 0x06, 0x06, 0x0b, 0x0f, 0x11, + 0x18, 0x1b, 0x1c, 0x00, 0x1d, 0x1e, 0x1e, 0x1f, 0x21, 0x22, 0x23, 0x26, + 0x00, 0x28, 0x2c, 0x30, 0x32, 0x35, 0x3b, 0x40, 0x44, 0x00, 0x4a, 0x54, + 0x54, 0x56, 0x5d, 0x60, 0x5e, 0x63, 0x00, 0x64, 0x68, 0x71, 0x71, 0x77, + 0x7b, 0x7f, 0x84, 0x00, 0x85, 0x8c, 0x92, 0x92, 0x94, 0x94, 0x92, 0x94, + 0x00, 0x99, 0x9a, 0x9a, 0xa1, 0x99, 0x99, 0x8c, 0x61, 0x07, 0x79, 0x0f, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xf8, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0x01, 0x07, 0x07, 0x00, 0x05, 0x08, 0x0e, 0x0e, 0x12, 0x1b, 0x1b, 0x1c, + 0x00, 0x1d, 0x1e, 0x1e, 0x1f, 0x20, 0x22, 0x23, 0x24, 0x00, 0x26, 0x2c, + 0x2f, 0x30, 0x35, 0x3b, 0x40, 0x44, 0x00, 0x4a, 0x54, 0x56, 0x5a, 0x5e, + 0x5f, 0x63, 0x68, 0x00, 0x6b, 0x6e, 0x71, 0x79, 0x79, 0x7f, 0x7f, 0x82, + 0x00, 0x84, 0x8c, 0x8c, 0x94, 0x97, 0x99, 0x97, 0x97, 0x00, 0x97, 0x9a, + 0x9d, 0xa4, 0xa7, 0xab, 0xa7, 0x9d, 0x00, 0xa1, 0x7f, 0x60, 0x39, 0x02, + 0x00, 0x00, 0x00, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x04, + 0x00, 0x02, 0x08, 0x05, 0x06, 0x0b, 0x0d, 0x0f, 0x17, 0x00, 0x19, 0x1b, + 0x1b, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x00, 0x22, 0x23, 0x26, 0x28, 0x2c, + 0x2f, 0x32, 0x35, 0x00, 0x39, 0x3b, 0x44, 0x4a, 0x50, 0x56, 0x5c, 0x5d, + 0x00, 0x61, 0x64, 0x68, 0x6b, 0x71, 0x77, 0x79, 0x7f, 0x00, 0x82, 0x84, + 0x88, 0x8c, 0x88, 0x8c, 0x92, 0x94, 0x00, 0x99, 0x9c, 0x9d, 0x9d, 0x9a, + 0x9d, 0xa4, 0xab, 0x00, 0xac, 0xaf, 0xaf, 0xaf, 0xab, 0xa4, 0xa1, 0x6a, + 0x07, 0x73, 0x02, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xf8, 0x5f, 0x17, + 0x07, 0x07, 0x02, 0x03, 0x07, 0x05, 0x00, 0x07, 0x0d, 0x0d, 0x11, 0x18, + 0x18, 0x1b, 0x1c, 0x00, 0x1d, 0x1d, 0x1e, 0x1e, 0x20, 0x21, 0x23, 0x24, + 0x00, 0x26, 0x28, 0x2f, 0x30, 0x35, 0x39, 0x40, 0x44, 0x00, 0x47, 0x4a, + 0x50, 0x58, 0x5e, 0x63, 0x64, 0x6b, 0x00, 0x6e, 0x71, 0x79, 0x78, 0x7b, + 0x82, 0x8f, 0x8e, 0x00, 0x8f, 0x8f, 0x8c, 0x92, 0x94, 0x97, 0x9a, 0x9d, + 0x00, 0xa1, 0xa3, 0xa3, 0xa4, 0xa4, 0xac, 0xb3, 0xb6, 0x00, 0xb6, 0xb6, + 0xb6, 0xb6, 0xa7, 0xaf, 0x82, 0x73, 0x0f, 0x2c, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0xe0, 0x17, 0x07, 0x07, 0x00, 0x00, 0x05, 0x07, 0x05, + 0x00, 0x08, 0x0d, 0x0d, 0x10, 0x18, 0x1a, 0x1b, 0x1c, 0x00, 0x1d, 0x1d, + 0x1e, 0x1e, 0x20, 0x21, 0x23, 0x24, 0x00, 0x27, 0x2c, 0x30, 0x35, 0x3b, + 0x40, 0x47, 0x4a, 0x00, 0x4d, 0x54, 0x56, 0x5a, 0x5e, 0x62, 0x64, 0x68, + 0x00, 0x6e, 0x73, 0x79, 0x7b, 0x82, 0x87, 0x8c, 0x78, 0x00, 0x7f, 0x84, + 0x94, 0x94, 0x94, 0x99, 0x99, 0x9d, 0x00, 0xa1, 0xa4, 0xa4, 0xa7, 0xa4, + 0xa7, 0xaf, 0xb6, 0x00, 0xbc, 0xbc, 0xc0, 0xc0, 0xc0, 0xbc, 0xad, 0xb5, + 0x03, 0x9a, 0x6b, 0x40, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, + 0x17, 0x07, 0x07, 0x06, 0x05, 0x05, 0x00, 0x0a, 0x0d, 0x0d, 0x11, 0x17, + 0x19, 0x1a, 0x1c, 0x00, 0x1c, 0x1d, 0x1e, 0x1e, 0x20, 0x20, 0x22, 0x23, + 0x00, 0x20, 0x1a, 0x0f, 0x0b, 0x08, 0x07, 0x07, 0x07, 0x00, 0x08, 0x0d, + 0x12, 0x1d, 0x32, 0x5d, 0x65, 0x65, 0x00, 0x6b, 0x71, 0x77, 0x79, 0x82, + 0x84, 0x92, 0x97, 0x00, 0x79, 0x8c, 0x88, 0x94, 0x97, 0x9a, 0x99, 0x9a, + 0x00, 0x9a, 0xa3, 0xa7, 0xab, 0xab, 0xab, 0xab, 0xaf, 0x00, 0xb7, 0xc0, + 0xc2, 0xc5, 0xc8, 0xc5, 0xc5, 0xc1, 0x00, 0xb5, 0xb6, 0xaf, 0x71, 0x4a, + 0x00, 0x00, 0x00, 0xfe, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x04, 0x01, + 0x00, 0x07, 0x05, 0x05, 0x0a, 0x0a, 0x0d, 0x11, 0x17, 0x00, 0x18, 0x1a, + 0x1b, 0x1b, 0x1d, 0x1d, 0x1e, 0x1f, 0x00, 0x21, 0x1e, 0x11, 0x07, 0x06, + 0x07, 0x09, 0x0d, 0x00, 0x0f, 0x11, 0x12, 0x13, 0x13, 0x13, 0x12, 0x11, + 0x00, 0x0d, 0x0d, 0x1a, 0x40, 0x71, 0x77, 0x7b, 0x82, 0x00, 0x84, 0x8f, + 0x92, 0x99, 0x82, 0x88, 0x84, 0x94, 0x00, 0xa4, 0x9d, 0xa1, 0xa7, 0xa4, + 0xa7, 0xaa, 0xac, 0x00, 0xaf, 0xac, 0xac, 0xb3, 0xb6, 0xbc, 0xc2, 0xc5, + 0x00, 0xc9, 0xcd, 0xcd, 0xcd, 0xc5, 0xb5, 0xb6, 0xb6, 0x07, 0x77, 0x4d, + 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xf0, 0x5f, 0x17, 0x07, 0x02, 0x01, + 0x07, 0x05, 0x05, 0x00, 0x0a, 0x0a, 0x0b, 0x11, 0x17, 0x17, 0x18, 0x1a, + 0x00, 0x1b, 0x1d, 0x1d, 0x1e, 0x20, 0x1c, 0x0a, 0x06, 0x00, 0x07, 0x0a, + 0x0e, 0x14, 0x1a, 0x1d, 0x20, 0x22, 0x00, 0x24, 0x26, 0x26, 0x23, 0x26, + 0x23, 0x20, 0x1e, 0x00, 0x1a, 0x11, 0x11, 0x2f, 0x77, 0x7b, 0x7f, 0x84, + 0x00, 0x92, 0x98, 0x9a, 0x97, 0x99, 0xa7, 0xa1, 0xa7, 0x00, 0xa7, 0xa7, + 0xa7, 0xab, 0xa7, 0xac, 0xb3, 0xb3, 0x00, 0xaf, 0xb3, 0xb6, 0xb9, 0xbf, + 0xc3, 0xc8, 0xd0, 0x00, 0xd5, 0xd0, 0xd0, 0xcd, 0xb6, 0xb6, 0xbc, 0x7e, + 0x0f, 0x4d, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xe0, 0x17, 0x07, + 0x01, 0x06, 0x05, 0x06, 0x0a, 0x0a, 0x00, 0x0d, 0x0e, 0x17, 0x17, 0x18, + 0x1b, 0x1b, 0x1d, 0x00, 0x1d, 0x1e, 0x1e, 0x0b, 0x05, 0x07, 0x0b, 0x12, + 0x00, 0x1c, 0x21, 0x2c, 0x35, 0x40, 0x43, 0x49, 0x4a, 0x00, 0x4c, 0x49, + 0x4a, 0x47, 0x47, 0x40, 0x3b, 0x30, 0x00, 0x24, 0x1d, 0x16, 0x12, 0x50, + 0x8c, 0x8f, 0x8c, 0x00, 0x9a, 0x9d, 0xa1, 0xa1, 0xa1, 0xab, 0xa7, 0xa7, + 0x00, 0xac, 0xb3, 0xb5, 0xad, 0xaf, 0xb3, 0xb5, 0xb5, 0x00, 0xb5, 0xb6, + 0xb6, 0xb9, 0xbc, 0xc4, 0xd0, 0xd5, 0x00, 0xd5, 0xd9, 0xd0, 0xcb, 0xb8, + 0xb9, 0xc2, 0x82, 0x0f, 0x4a, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, + 0xc0, 0x17, 0x07, 0x00, 0x05, 0x05, 0x05, 0x0a, 0x0a, 0x00, 0x0b, 0x0d, + 0x13, 0x15, 0x18, 0x1a, 0x1a, 0x1b, 0x00, 0x1c, 0x1e, 0x17, 0x05, 0x06, + 0x0a, 0x13, 0x1d, 0x00, 0x26, 0x39, 0x44, 0x50, 0x56, 0x56, 0x57, 0x56, + 0x00, 0x5a, 0x56, 0x58, 0x58, 0x54, 0x54, 0x56, 0x54, 0x00, 0x50, 0x46, + 0x3b, 0x2b, 0x1f, 0x17, 0x21, 0x82, 0x00, 0x97, 0x99, 0xa1, 0xa1, 0x9d, + 0xa1, 0xa4, 0xab, 0x00, 0xad, 0xac, 0xac, 0xaf, 0xb5, 0xaf, 0xb5, 0xb5, + 0x00, 0xb5, 0xb5, 0xb6, 0xb3, 0xb5, 0xb9, 0xbc, 0xc9, 0x00, 0xd5, 0xdc, + 0xdc, 0xd9, 0xd0, 0xc5, 0xb9, 0xbc, 0x03, 0xc0, 0x7f, 0x47, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xf0, 0xa7, 0x5f, 0x17, 0x06, 0x04, 0x06, 0x05, 0x09, + 0x00, 0x0a, 0x0b, 0x0d, 0x12, 0x15, 0x17, 0x18, 0x1a, 0x00, 0x1b, 0x1c, + 0x1d, 0x0e, 0x04, 0x08, 0x0e, 0x1c, 0x00, 0x24, 0x3b, 0x50, 0x58, 0x5c, + 0x5c, 0x5a, 0x5a, 0x00, 0x58, 0x58, 0x58, 0x58, 0x57, 0x54, 0x54, 0x57, + 0x00, 0x58, 0x5a, 0x58, 0x57, 0x50, 0x4d, 0x40, 0x2c, 0x00, 0x1e, 0x1b, + 0x83, 0x99, 0xa1, 0x9d, 0x9c, 0xa1, 0x00, 0xa1, 0xa7, 0xab, 0xaf, 0xb3, + 0xb3, 0xb3, 0xae, 0x00, 0xb5, 0xb5, 0xb5, 0xb3, 0xaf, 0xae, 0xaf, 0xb6, + 0x00, 0xbe, 0xb9, 0xd0, 0xda, 0xdd, 0xdc, 0xd5, 0xd0, 0x00, 0xc1, 0xbc, + 0xc0, 0xc0, 0x7e, 0x35, 0x00, 0x00, 0x7e, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, + 0x17, 0x04, 0x03, 0x00, 0x06, 0x05, 0x09, 0x0a, 0x0b, 0x0d, 0x0f, 0x15, + 0x00, 0x16, 0x18, 0x19, 0x1b, 0x1b, 0x1d, 0x09, 0x04, 0x00, 0x09, 0x12, + 0x1f, 0x30, 0x4d, 0x58, 0x5c, 0x5d, 0x00, 0x5c, 0x5a, 0x5a, 0x5c, 0x5a, + 0x5c, 0x56, 0x56, 0x00, 0x56, 0x50, 0x50, 0x56, 0x58, 0x58, 0x56, 0x55, + 0x00, 0x58, 0x55, 0x50, 0x47, 0x39, 0x23, 0x1b, 0x7c, 0x00, 0xa4, 0x9c, + 0xa1, 0xa1, 0xa1, 0xa7, 0xab, 0xab, 0x00, 0xaf, 0xb5, 0xb6, 0xb5, 0xb5, + 0xb5, 0xb3, 0xac, 0x00, 0xab, 0xa7, 0xaa, 0xb3, 0xbe, 0xc0, 0xb9, 0xd5, + 0x00, 0xdd, 0xdc, 0xdc, 0xd9, 0xd0, 0xc0, 0xbe, 0xc0, 0x03, 0xbc, 0x7f, + 0x0d, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xf0, 0xa7, 0x5f, 0x17, 0x02, 0x02, + 0x07, 0x04, 0x08, 0x00, 0x09, 0x0a, 0x0b, 0x0d, 0x11, 0x12, 0x16, 0x17, + 0x00, 0x19, 0x1a, 0x1b, 0x09, 0x05, 0x08, 0x15, 0x22, 0x01, 0x3b, 0x56, + 0x5c, 0x5a, 0x5c, 0x5c, 0x5b, 0xe1, 0x00, 0x5c, 0x5a, 0x59, 0x54, 0x54, + 0x53, 0x54, 0x56, 0x00, 0x58, 0x56, 0x55, 0x56, 0x56, 0x54, 0x55, 0x56, + 0x00, 0x51, 0x44, 0x28, 0x1e, 0x88, 0xa1, 0xa1, 0xa1, 0x00, 0xa4, 0xa7, + 0xa7, 0xa4, 0xab, 0xaf, 0xaf, 0xb3, 0x00, 0xaf, 0xb5, 0xaf, 0xab, 0xa7, + 0x9d, 0x9d, 0xa7, 0x00, 0xb6, 0xc2, 0xc5, 0xbd, 0xdb, 0xdd, 0xdd, 0xd9, + 0x00, 0xd5, 0xc5, 0xc1, 0xc2, 0xc2, 0xb6, 0x88, 0x02, 0x1f, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x80, 0x01, 0x07, 0x04, 0x07, 0x0a, + 0x0a, 0x0b, 0x0b, 0x00, 0x0e, 0x11, 0x13, 0x15, 0x18, 0x18, 0x1b, 0x0d, + 0x00, 0x04, 0x08, 0x14, 0x22, 0x44, 0x56, 0x5c, 0x5c, 0x00, 0x5c, 0x5c, + 0x5a, 0x59, 0x5c, 0x5a, 0x5d, 0x5a, 0x00, 0x5a, 0x59, 0x56, 0x53, 0x56, + 0x54, 0x56, 0x54, 0x04, 0x53, 0x53, 0x54, 0x54, 0x56, 0xb9, 0x50, 0x47, + 0x00, 0x2e, 0x20, 0x99, 0xa4, 0xa2, 0xa5, 0xa4, 0xa4, 0x00, 0x9a, 0xa1, + 0xab, 0xac, 0xa7, 0x9b, 0xa7, 0xac, 0x00, 0xac, 0xab, 0xa1, 0x9a, 0x9a, + 0xab, 0xb9, 0xc9, 0x00, 0xcd, 0xd1, 0xdb, 0xdd, 0xdc, 0xd9, 0xd5, 0xc2, + 0x00, 0xc2, 0xc2, 0xc5, 0xa1, 0x88, 0x00, 0x00, 0x00, 0xf8, 0xe9, 0xd4, + 0xa7, 0x5f, 0x17, 0x00, 0x00, 0x04, 0x00, 0x05, 0x06, 0x09, 0x0a, 0x0b, + 0x0a, 0x0b, 0x10, 0x00, 0x11, 0x11, 0x15, 0x17, 0x18, 0x12, 0x04, 0x06, + 0x00, 0x11, 0x1f, 0x39, 0x4d, 0x5a, 0x5a, 0x5c, 0x5c, 0x04, 0x5a, 0x5a, + 0x58, 0x5a, 0x58, 0xe9, 0x58, 0x56, 0x00, 0x56, 0x56, 0x54, 0x50, 0x50, + 0x4d, 0x51, 0x4d, 0x00, 0x50, 0x54, 0x4d, 0x4d, 0x4e, 0x4d, 0x4a, 0x46, + 0x00, 0x2c, 0x33, 0xa7, 0xa5, 0xa4, 0xa5, 0xa4, 0x99, 0x00, 0x99, 0xa4, + 0xb2, 0xac, 0xb3, 0xad, 0xaf, 0xa7, 0x00, 0xb3, 0xab, 0x9d, 0x99, 0x9d, + 0xaa, 0xb9, 0xd0, 0x00, 0xd5, 0xd9, 0xdd, 0xdd, 0xd9, 0xd9, 0xc9, 0xc5, + 0x00, 0xc5, 0xc5, 0xc9, 0x8f, 0x11, 0x00, 0x00, 0x00, 0xf8, 0xe9, 0xd4, + 0xa7, 0x5f, 0x17, 0x02, 0x07, 0x05, 0x00, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, + 0x0d, 0x11, 0x11, 0x00, 0x12, 0x13, 0x15, 0x18, 0x04, 0x05, 0x0d, 0x1d, + 0x00, 0x2c, 0x40, 0x4d, 0x54, 0x5a, 0x5c, 0x5a, 0x58, 0x08, 0x57, 0x56, + 0x56, 0x54, 0xe1, 0x56, 0x58, 0x56, 0x00, 0x56, 0x50, 0x4d, 0x4c, 0x4d, + 0x4a, 0x4d, 0x50, 0x00, 0x4d, 0x4d, 0x4a, 0x47, 0x40, 0x40, 0x43, 0x3b, + 0x00, 0x22, 0x65, 0xa9, 0xa8, 0xa7, 0xa3, 0x99, 0x97, 0x00, 0x9d, 0xa7, + 0xab, 0xa7, 0xb5, 0xaf, 0xa7, 0xb3, 0x00, 0xb3, 0xa4, 0x99, 0x9a, 0x9d, + 0xab, 0xc0, 0xd5, 0x00, 0xd9, 0xd9, 0xdc, 0xdc, 0xd9, 0xd0, 0xc5, 0xc5, + 0x01, 0xc3, 0xc2, 0xc9, 0x9c, 0x00, 0x00, 0x00, 0xe9, 0xf0, 0xd4, 0xa7, + 0x5f, 0x17, 0x08, 0x04, 0x08, 0x0a, 0x00, 0x0a, 0x0b, 0x0b, 0x0b, 0x0d, + 0x11, 0x11, 0x12, 0x00, 0x13, 0x17, 0x08, 0x04, 0x09, 0x1a, 0x24, 0x35, + 0x00, 0x40, 0x47, 0x50, 0x56, 0x58, 0x5a, 0x58, 0x56, 0x00, 0x56, 0x50, + 0x50, 0x54, 0x54, 0x54, 0x56, 0x57, 0x00, 0x57, 0x56, 0x4d, 0x4f, 0x50, + 0x4c, 0x47, 0x47, 0x00, 0x47, 0x4a, 0x4b, 0x4a, 0x44, 0x3b, 0x35, 0x38, + 0x00, 0x31, 0x2c, 0x20, 0x92, 0x97, 0xa1, 0x9b, 0x97, 0x00, 0x97, 0x9d, + 0xa7, 0xaf, 0xaa, 0xac, 0x9f, 0xab, 0x00, 0xc0, 0xb9, 0xac, 0x9d, 0x9a, + 0x9a, 0x9d, 0xac, 0x00, 0xc2, 0xd9, 0xd9, 0xdc, 0xdc, 0xd9, 0xd9, 0xc5, + 0x00, 0xc7, 0xc3, 0xc2, 0xc5, 0xb5, 0x54, 0x00, 0x00, 0x7c, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x15, 0x04, 0x06, 0x00, 0x06, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0d, 0x0b, 0x0f, 0x00, 0x11, 0x11, 0x13, 0x13, 0x15, 0x03, 0x06, 0x11, + 0x00, 0x1f, 0x2f, 0x39, 0x3b, 0x40, 0x49, 0x50, 0x56, 0x00, 0x58, 0x56, + 0x56, 0x50, 0x4f, 0x50, 0x50, 0x50, 0x40, 0x54, 0xb1, 0x54, 0x53, 0x54, + 0x4d, 0x4d, 0x47, 0x00, 0x47, 0x47, 0x45, 0x47, 0x47, 0x44, 0x3c, 0x35, + 0x00, 0x35, 0x31, 0x2c, 0x21, 0x50, 0x92, 0x94, 0x97, 0x00, 0x99, 0x99, + 0x9d, 0xac, 0xab, 0xb5, 0xa4, 0xa4, 0x00, 0xc0, 0xb9, 0xbb, 0xb5, 0xa7, + 0x9d, 0x9a, 0x9d, 0x00, 0xa3, 0xac, 0xc2, 0xdc, 0xdc, 0xd9, 0xdc, 0xdc, + 0x00, 0xcd, 0xc6, 0xc5, 0xc5, 0xc5, 0xcd, 0x9a, 0x03, 0x1f, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x13, 0x00, 0x01, 0x08, 0x04, 0x0a, 0x0b, + 0x0d, 0x0d, 0x0c, 0x00, 0x0d, 0x0d, 0x11, 0x11, 0x14, 0x15, 0x17, 0x09, + 0x00, 0x04, 0x0a, 0x1c, 0x28, 0x32, 0x35, 0x39, 0x3b, 0x00, 0x43, 0x47, + 0x53, 0x56, 0x56, 0x54, 0x50, 0x4a, 0x00, 0x50, 0x4e, 0x50, 0x54, 0x54, + 0x54, 0x4f, 0x4d, 0x00, 0x54, 0x50, 0x4d, 0x4d, 0x47, 0x44, 0x47, 0x46, + 0x00, 0x3f, 0x40, 0x44, 0x44, 0x39, 0x3b, 0x31, 0x2f, 0x00, 0x26, 0x21, + 0x94, 0x97, 0x99, 0x9a, 0x9d, 0x9e, 0x00, 0xa7, 0xac, 0xaf, 0xb3, 0xa4, + 0xb6, 0xc2, 0xc0, 0x00, 0xb6, 0xb3, 0x9d, 0x9d, 0x9d, 0xa4, 0xa4, 0xab, + 0x00, 0xd4, 0xdd, 0xde, 0xde, 0xdd, 0xd5, 0xc9, 0xc9, 0x00, 0xc6, 0xc9, + 0xc8, 0xc2, 0x94, 0x00, 0x00, 0x00, 0xf8, 0xe9, 0xd4, 0xa7, 0x5f, 0x13, + 0x06, 0x05, 0x08, 0x00, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0f, 0x11, + 0x00, 0x12, 0x16, 0x18, 0x1b, 0x04, 0x06, 0x13, 0x22, 0x00, 0x32, 0x39, + 0x35, 0x38, 0x39, 0x3b, 0x46, 0x4d, 0x00, 0x53, 0x54, 0x4f, 0x4d, 0x4d, + 0x4d, 0x4d, 0x54, 0x00, 0x54, 0x50, 0x4f, 0x4a, 0x4a, 0x4d, 0x4e, 0x4f, + 0x00, 0x4d, 0x46, 0x47, 0x47, 0x44, 0x40, 0x44, 0x44, 0x00, 0x41, 0x40, + 0x39, 0x35, 0x2f, 0x2c, 0x22, 0x68, 0x00, 0x99, 0x9a, 0x9d, 0x9d, 0xa1, + 0xa7, 0xb3, 0xad, 0x00, 0xbc, 0xaf, 0xa4, 0xab, 0xc0, 0xc0, 0xb6, 0xa1, + 0x00, 0x9e, 0xa1, 0xa1, 0xa3, 0xaf, 0xc3, 0xdd, 0xde, 0x00, 0xdf, 0xdf, + 0xde, 0xd0, 0xce, 0xcd, 0xcd, 0xc5, 0x03, 0xc9, 0xa0, 0x13, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xe0, 0xa7, 0x5f, 0x11, 0x02, 0x08, 0x05, 0x0d, 0x0d, + 0x00, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f, 0x11, 0x12, 0x13, 0x00, 0x17, 0x1b, + 0x18, 0x04, 0x09, 0x1b, 0x2b, 0x3b, 0x00, 0x3b, 0x3b, 0x39, 0x35, 0x39, + 0x43, 0x49, 0x50, 0x00, 0x4f, 0x4d, 0x4d, 0x4e, 0x4f, 0x54, 0x53, 0x53, + 0x00, 0x50, 0x4d, 0x4d, 0x4d, 0x54, 0x53, 0x50, 0x49, 0x00, 0x47, 0x43, + 0x43, 0x42, 0x44, 0x40, 0x44, 0x44, 0x00, 0x40, 0x3b, 0x35, 0x30, 0x2f, + 0x28, 0x43, 0x9a, 0x00, 0x9a, 0x9d, 0xa1, 0xa4, 0xab, 0xb2, 0xb5, 0xb6, + 0x00, 0xc1, 0xa8, 0xab, 0xb9, 0xc3, 0xc0, 0xa7, 0xa1, 0x00, 0x9d, 0x9d, + 0xa1, 0xab, 0xdd, 0xdc, 0xde, 0xdf, 0x00, 0xdf, 0xdd, 0xd0, 0xd0, 0xd3, + 0xd0, 0xcd, 0xc5, 0x07, 0xcd, 0x99, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0xc0, 0x5f, 0x11, 0x06, 0x05, 0x08, 0x0d, 0x0d, 0x0e, 0x00, 0x0f, 0x11, + 0x11, 0x11, 0x12, 0x13, 0x17, 0x19, 0x00, 0x1c, 0x0e, 0x05, 0x10, 0x1f, + 0x2f, 0x39, 0x3e, 0x00, 0x40, 0x3b, 0x3b, 0x3b, 0x3e, 0x47, 0x4a, 0x4d, + 0x00, 0x4d, 0x4d, 0x4f, 0x50, 0x53, 0x54, 0x50, 0x4d, 0x00, 0x53, 0x4d, + 0x53, 0x50, 0x4f, 0x4c, 0x4c, 0x47, 0x00, 0x44, 0x40, 0x3b, 0x43, 0x44, + 0x43, 0x3f, 0x40, 0x00, 0x3e, 0x39, 0x32, 0x2f, 0x2c, 0x23, 0x9d, 0x9d, + 0x00, 0xa1, 0xa4, 0xa4, 0xab, 0xb3, 0xb6, 0xbc, 0xc5, 0x00, 0xb9, 0xab, + 0xb5, 0xc3, 0xbd, 0xb5, 0xa7, 0xa1, 0x40, 0xa1, 0x71, 0xd6, 0xdd, 0xde, + 0xdd, 0xd5, 0xc2, 0x00, 0xc2, 0xc5, 0xd1, 0xd4, 0xc5, 0xc3, 0xa1, 0x13, + 0x1e, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x00, 0x00, 0x02, 0x08, + 0x06, 0x0d, 0x0d, 0x0e, 0x0f, 0x11, 0x00, 0x12, 0x12, 0x13, 0x11, 0x13, + 0x18, 0x1a, 0x1d, 0x00, 0x08, 0x07, 0x17, 0x22, 0x30, 0x32, 0x34, 0x40, + 0x00, 0x3f, 0x43, 0x40, 0x47, 0x4a, 0x4d, 0x49, 0x47, 0x00, 0x47, 0x4f, + 0x50, 0x50, 0x50, 0x4f, 0x50, 0x4d, 0x08, 0x50, 0x54, 0x54, 0x4d, 0x89, + 0x44, 0x44, 0x42, 0x00, 0x44, 0x44, 0x44, 0x40, 0x3b, 0x3b, 0x3b, 0x35, + 0x00, 0x2f, 0x2f, 0x23, 0x8e, 0xa3, 0xa4, 0xa1, 0xa5, 0x00, 0xa7, 0xaf, + 0xb8, 0xc2, 0xcd, 0xc9, 0xb6, 0xbd, 0x00, 0xc9, 0xb9, 0xbb, 0xb5, 0xab, + 0xa4, 0xa4, 0xa4, 0x00, 0xa1, 0xc9, 0xdb, 0xdb, 0xd9, 0xcd, 0xbe, 0xb6, + 0x00, 0xbc, 0xcc, 0xd9, 0xd0, 0xc5, 0xc2, 0x94, 0x00, 0x3c, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x5f, 0x00, 0x05, 0x00, 0x06, 0x09, 0x0d, 0x0e, 0x0f, + 0x11, 0x11, 0x13, 0x00, 0x13, 0x13, 0x0f, 0x13, 0x1a, 0x1c, 0x1e, 0x06, + 0x00, 0x0d, 0x1e, 0x2d, 0x31, 0x30, 0x2f, 0x2e, 0x39, 0x00, 0x46, 0x47, + 0x47, 0x4a, 0x47, 0x4a, 0x44, 0x47, 0x00, 0x4a, 0x4a, 0x4c, 0x4a, 0x47, + 0x4d, 0x4d, 0x51, 0x00, 0x51, 0x50, 0x4d, 0x4d, 0x4a, 0x46, 0x44, 0x46, + 0x00, 0x44, 0x46, 0x42, 0x42, 0x40, 0x40, 0x44, 0x4f, 0x00, 0x38, 0x2f, + 0x30, 0x26, 0x76, 0xa1, 0xa3, 0xa7, 0x00, 0xa7, 0xa7, 0xab, 0xb5, 0xc4, + 0xcd, 0xc9, 0xc2, 0x00, 0xc3, 0xc9, 0xb5, 0xb9, 0xc5, 0xb5, 0xaf, 0xa6, + 0x00, 0xa4, 0xa1, 0xd5, 0xdc, 0xd9, 0xd0, 0xc3, 0xb5, 0x00, 0xb6, 0xb7, + 0xc9, 0xd6, 0xd5, 0xcd, 0xc0, 0x9b, 0x0f, 0x16, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x5e, 0x00, 0x01, 0x09, 0x06, 0x0e, 0x0e, 0x0f, 0x11, 0x11, + 0x00, 0x13, 0x11, 0x15, 0x15, 0x11, 0x1b, 0x1d, 0x1d, 0x00, 0x1f, 0x06, + 0x10, 0x21, 0x35, 0x3b, 0x30, 0x2f, 0x00, 0x2e, 0x32, 0x49, 0x4a, 0x48, + 0x49, 0x44, 0x44, 0x00, 0x44, 0x40, 0x3f, 0x40, 0x3f, 0x3b, 0x43, 0x46, + 0x00, 0x4a, 0x4d, 0x4c, 0x4f, 0x4f, 0x49, 0x47, 0x47, 0x20, 0x46, 0x45, + 0x69, 0x40, 0x3b, 0x3b, 0x47, 0x3b, 0x00, 0x30, 0x30, 0x2e, 0x26, 0x6b, + 0xa2, 0xa5, 0xa7, 0x00, 0xab, 0xab, 0xae, 0xb5, 0xc9, 0xd0, 0xd0, 0xbc, + 0x00, 0xd0, 0xc9, 0xaf, 0xb3, 0xd0, 0xc2, 0xc2, 0xc9, 0x00, 0xa8, 0xc2, + 0xdc, 0xdc, 0xd7, 0xc9, 0xbc, 0xad, 0x00, 0xb3, 0xbc, 0xc9, 0xd4, 0xd5, + 0xcf, 0xc2, 0xbc, 0x0f, 0x40, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5e, + 0x00, 0x03, 0x07, 0x08, 0x0e, 0x0f, 0x11, 0x11, 0x12, 0x00, 0x12, 0x0f, + 0x15, 0x11, 0x11, 0x1a, 0x1e, 0x1e, 0x00, 0x21, 0x05, 0x13, 0x26, 0x42, + 0x42, 0x37, 0x31, 0x00, 0x30, 0x35, 0x4c, 0x4d, 0x48, 0x47, 0x40, 0x40, + 0x00, 0x3b, 0x39, 0x38, 0x39, 0x35, 0x3b, 0x39, 0x44, 0x00, 0x49, 0x49, + 0x4d, 0x4d, 0x4d, 0x4c, 0x4a, 0x4a, 0x00, 0x47, 0x46, 0x44, 0x43, 0x44, + 0x3f, 0x3b, 0x42, 0x00, 0x33, 0x28, 0x2e, 0x2c, 0x2c, 0x28, 0x68, 0xa8, + 0x00, 0xa7, 0xa7, 0xac, 0xaf, 0xb2, 0xb5, 0xc9, 0xd0, 0x00, 0xd6, 0xc2, + 0xb6, 0xc0, 0xab, 0xab, 0xcc, 0xcb, 0x00, 0xd1, 0xdc, 0xdc, 0xdc, 0xdc, + 0xd9, 0xd4, 0xbf, 0x00, 0xb5, 0xab, 0xb1, 0xbc, 0xc4, 0xcb, 0xcd, 0xcd, + 0x01, 0xc5, 0xb9, 0x97, 0x03, 0x00, 0x00, 0x00, 0xe9, 0xe0, 0xd4, 0xa7, + 0x5d, 0x09, 0x06, 0x0d, 0x0f, 0x11, 0x00, 0x11, 0x12, 0x13, 0x12, 0x0e, + 0x11, 0x18, 0x15, 0x00, 0x1d, 0x1f, 0x20, 0x23, 0x06, 0x15, 0x2b, 0x44, + 0x00, 0x44, 0x3b, 0x3b, 0x3b, 0x43, 0x4f, 0x4a, 0x47, 0x00, 0x40, 0x42, + 0x3b, 0x39, 0x35, 0x35, 0x32, 0x35, 0x00, 0x32, 0x39, 0x40, 0x44, 0x4c, + 0x4f, 0x50, 0x4c, 0x00, 0x4d, 0x4c, 0x47, 0x47, 0x47, 0x47, 0x4d, 0x47, + 0x00, 0x40, 0x3b, 0x43, 0x2c, 0x2c, 0x2f, 0x28, 0x27, 0x00, 0x26, 0x6b, + 0xac, 0xab, 0xac, 0xac, 0xaf, 0xac, 0x00, 0xb2, 0xc9, 0xd5, 0xd5, 0xdc, + 0xb9, 0xac, 0xac, 0x00, 0xab, 0xc5, 0xcf, 0xcf, 0xd9, 0xdb, 0xdc, 0xd9, + 0x00, 0xd9, 0xc8, 0xb6, 0xb1, 0xa8, 0xb1, 0xb5, 0xb9, 0x00, 0xbe, 0xc4, + 0xc9, 0xc3, 0xb5, 0xa9, 0x0e, 0x00, 0x3c, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x5c, 0x01, 0x0a, 0x00, 0x07, 0x0f, 0x11, 0x11, 0x12, 0x13, 0x17, 0x13, + 0x00, 0x0f, 0x1a, 0x1d, 0x1d, 0x1f, 0x20, 0x21, 0x24, 0x00, 0x06, 0x17, + 0x2c, 0x47, 0x49, 0x47, 0x42, 0x44, 0x00, 0x4d, 0x4c, 0x4a, 0x44, 0x44, + 0x42, 0x3b, 0x35, 0x00, 0x32, 0x30, 0x30, 0x30, 0x35, 0x3b, 0x40, 0x47, + 0x01, 0x4f, 0x4e, 0x4f, 0x4a, 0x4a, 0x47, 0x4a, 0x31, 0x20, 0x46, 0x44, + 0x39, 0x26, 0x3b, 0x35, 0x28, 0x26, 0x00, 0x27, 0x7b, 0xb9, 0xb3, 0xb1, + 0xaf, 0xb2, 0xb0, 0x00, 0xaf, 0xcd, 0xd5, 0xd9, 0xd9, 0xc7, 0xaf, 0xaf, + 0x00, 0xaf, 0xb5, 0xd9, 0xcf, 0xdc, 0xd9, 0xd9, 0xdc, 0x00, 0xd0, 0xbf, + 0xb5, 0xab, 0xab, 0xac, 0xaf, 0xaf, 0x00, 0xb9, 0xc2, 0xc5, 0xc2, 0xb6, + 0xb6, 0x8c, 0x00, 0x3c, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5c, 0x03, 0x07, + 0x00, 0x0b, 0x0f, 0x11, 0x12, 0x13, 0x17, 0x15, 0x0f, 0x00, 0x11, 0x1b, + 0x1a, 0x18, 0x20, 0x22, 0x22, 0x28, 0x00, 0x08, 0x17, 0x29, 0x47, 0x4c, + 0x4b, 0x44, 0x46, 0x00, 0x4d, 0x4a, 0x47, 0x46, 0x42, 0x44, 0x3b, 0x35, + 0x00, 0x30, 0x32, 0x30, 0x35, 0x3b, 0x44, 0x44, 0x4d, 0x00, 0x51, 0x4f, + 0x4d, 0x4c, 0x4d, 0x4a, 0x4a, 0x44, 0x00, 0x44, 0x3b, 0x3b, 0x40, 0x42, + 0x3b, 0x40, 0x39, 0x00, 0x3b, 0x44, 0x2b, 0x26, 0x26, 0x90, 0xc4, 0xbc, + 0x00, 0xb6, 0xb9, 0xb8, 0xb5, 0xb3, 0xc5, 0xd1, 0xc5, 0x00, 0xd9, 0xd9, + 0xdc, 0xb6, 0xb3, 0xac, 0xc5, 0xc2, 0x00, 0xc1, 0xdc, 0xdc, 0xdc, 0xcc, + 0xb6, 0xb2, 0xab, 0x00, 0xa7, 0xaf, 0xa4, 0xa7, 0xb6, 0xbc, 0xc2, 0xc0, + 0x01, 0xb9, 0xb3, 0x97, 0x03, 0x00, 0x00, 0x00, 0xe9, 0xe0, 0xd4, 0xa7, + 0x5b, 0x05, 0x06, 0x0f, 0x11, 0x12, 0x00, 0x13, 0x15, 0x18, 0x0f, 0x11, + 0x11, 0x1b, 0x17, 0x00, 0x18, 0x20, 0x1f, 0x1e, 0x2c, 0x0d, 0x17, 0x28, + 0x00, 0x4a, 0x50, 0x50, 0x4a, 0x40, 0x4a, 0x47, 0x32, 0x00, 0x47, 0x44, + 0x44, 0x3b, 0x32, 0x34, 0x30, 0x32, 0x00, 0x3b, 0x47, 0x45, 0x4d, 0x4f, + 0x50, 0x50, 0x4d, 0x00, 0x4b, 0x4d, 0x4d, 0x47, 0x47, 0x40, 0x3b, 0x3f, + 0x00, 0x47, 0x3b, 0x3b, 0x44, 0x3f, 0x44, 0x3b, 0x2b, 0x00, 0x2c, 0x24, + 0xa1, 0xc9, 0xc9, 0xc0, 0xc1, 0xc0, 0x00, 0xb9, 0xb5, 0xb5, 0xb5, 0xb5, + 0xc9, 0xdd, 0xdd, 0x00, 0xc9, 0xb5, 0xb3, 0xaf, 0xab, 0xa7, 0xdb, 0xd9, + 0x00, 0xdb, 0xc0, 0xb3, 0xaf, 0xa7, 0xa7, 0xab, 0xa3, 0x00, 0x9d, 0xb5, + 0xb6, 0xb9, 0xbc, 0xb9, 0xb3, 0xa7, 0x0f, 0x0d, 0x00, 0x00, 0x00, 0xe9, + 0xd4, 0xa7, 0x5b, 0x00, 0x0d, 0x08, 0x11, 0x11, 0x13, 0x15, 0x18, 0x13, + 0x00, 0x12, 0x11, 0x13, 0x13, 0x17, 0x18, 0x1a, 0x22, 0x00, 0x22, 0x27, + 0x18, 0x14, 0x26, 0x44, 0x50, 0x4d, 0x00, 0x4c, 0x43, 0x35, 0x28, 0x2e, + 0x44, 0x3f, 0x43, 0x00, 0x3b, 0x39, 0x32, 0x32, 0x35, 0x40, 0x44, 0x4d, + 0x00, 0x50, 0x50, 0x4d, 0x50, 0x4d, 0x4f, 0x4d, 0x4a, 0x00, 0x49, 0x44, + 0x3f, 0x40, 0x40, 0x40, 0x3f, 0x3b, 0x00, 0x3e, 0x44, 0x44, 0x2f, 0x2c, + 0x2a, 0x24, 0xac, 0x00, 0xcd, 0xcd, 0xc9, 0xc9, 0xcb, 0xc5, 0xb6, 0xb6, + 0x00, 0xb6, 0xb9, 0xb9, 0xcd, 0xc9, 0xb6, 0xb5, 0xb5, 0x00, 0xb5, 0xaf, + 0xab, 0xdc, 0xdb, 0xd5, 0xb5, 0xb2, 0x01, 0xab, 0xa7, 0xa4, 0xa4, 0x9d, + 0x97, 0xb3, 0x79, 0x01, 0xb5, 0xb2, 0xad, 0x7f, 0x00, 0x00, 0x00, 0xe9, + 0xe0, 0xd4, 0xa7, 0x5a, 0x01, 0x0b, 0x0d, 0x11, 0x12, 0x00, 0x15, 0x17, + 0x1a, 0x1b, 0x1b, 0x12, 0x13, 0x17, 0x00, 0x18, 0x1a, 0x1b, 0x1f, 0x2a, + 0x2b, 0x1f, 0x11, 0x00, 0x24, 0x44, 0x4d, 0x4c, 0x49, 0x47, 0x3b, 0x2f, + 0x00, 0x2f, 0x42, 0x3b, 0x44, 0x40, 0x3b, 0x35, 0x35, 0x00, 0x35, 0x39, + 0x40, 0x4c, 0x4d, 0x4c, 0x4a, 0x4c, 0x00, 0x4d, 0x4a, 0x4a, 0x47, 0x44, + 0x44, 0x40, 0x40, 0x00, 0x40, 0x3b, 0x40, 0x3b, 0x44, 0x44, 0x3c, 0x31, + 0x00, 0x2c, 0x2c, 0x4c, 0xaf, 0xc9, 0xd0, 0xd5, 0xd3, 0x00, 0xd0, 0xd0, + 0xc0, 0xb6, 0xb9, 0xb9, 0xb6, 0xb9, 0x80, 0xda, 0xb5, 0xb3, 0xb3, 0xc2, + 0xdc, 0xc2, 0xac, 0x00, 0xaf, 0xa4, 0xa4, 0xa3, 0x9d, 0x9a, 0x94, 0xab, + 0x00, 0xb3, 0xb3, 0xb1, 0xaf, 0xab, 0xab, 0x8c, 0x00, 0x3c, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x5a, 0x03, 0x08, 0x00, 0x0f, 0x11, 0x15, 0x16, 0x18, + 0x1a, 0x1c, 0x1a, 0x00, 0x13, 0x15, 0x18, 0x18, 0x1b, 0x1b, 0x1c, 0x22, + 0x00, 0x27, 0x2e, 0x0f, 0x21, 0x39, 0x4a, 0x4c, 0x4a, 0x00, 0x47, 0x4d, + 0x2f, 0x2e, 0x39, 0x39, 0x43, 0x44, 0x00, 0x42, 0x3b, 0x32, 0x32, 0x35, + 0x3d, 0x44, 0x46, 0x00, 0x44, 0x46, 0x4a, 0x4d, 0x4a, 0x4a, 0x46, 0x42, + 0x00, 0x40, 0x44, 0x47, 0x43, 0x43, 0x40, 0x3b, 0x3b, 0x00, 0x3f, 0x44, + 0x43, 0x32, 0x40, 0x71, 0xaf, 0xd4, 0x00, 0xd5, 0xd5, 0xd5, 0xd3, 0xd9, + 0xc9, 0xb6, 0xb9, 0x00, 0xb8, 0xbc, 0xb9, 0xb8, 0xb9, 0xbd, 0xc0, 0xb6, + 0x00, 0xb9, 0xb6, 0xb5, 0xbb, 0xb1, 0xb0, 0xab, 0xa7, 0x00, 0xa4, 0xa1, + 0x9a, 0x9a, 0x91, 0xa1, 0xb3, 0xaf, 0x00, 0xad, 0xab, 0xa8, 0xa3, 0x8f, + 0x11, 0x00, 0x00, 0x78, 0x00, 0xe9, 0xd4, 0xa7, 0x59, 0x0e, 0x08, 0x12, + 0x00, 0x13, 0x15, 0x18, 0x1b, 0x1b, 0x1c, 0x15, 0x17, 0x40, 0x17, 0xc9, + 0x1d, 0x1d, 0x1e, 0x24, 0x3f, 0x1a, 0x00, 0x1d, 0x32, 0x46, 0x4d, 0x47, + 0x4c, 0x44, 0x2c, 0x00, 0x2a, 0x2f, 0x39, 0x44, 0x44, 0x44, 0x42, 0x38, + 0x08, 0x35, 0x35, 0x39, 0x3b, 0xb9, 0x4a, 0x4a, 0x4c, 0x00, 0x4d, 0x47, + 0x46, 0x49, 0x47, 0x47, 0x47, 0x43, 0x00, 0x46, 0x44, 0x3f, 0x43, 0x49, + 0x44, 0x44, 0x39, 0x00, 0x9e, 0xd0, 0xd5, 0xd5, 0xd9, 0xd9, 0xd2, 0xd5, + 0x00, 0xd5, 0xb6, 0xb9, 0xbc, 0xb9, 0xb8, 0xb9, 0xb9, 0x00, 0xc2, 0xbe, + 0xc0, 0xb9, 0xb7, 0xb6, 0xb5, 0xb3, 0x00, 0xac, 0xa7, 0xa5, 0xa1, 0x9e, + 0x99, 0x97, 0x92, 0x00, 0xa5, 0xb2, 0xaf, 0xa7, 0xa4, 0xa4, 0x9d, 0x9d, + 0x0f, 0x0b, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x59, 0x00, 0x11, 0x0a, + 0x13, 0x15, 0x17, 0x1a, 0x1b, 0x1c, 0x00, 0x1e, 0x13, 0x17, 0x18, 0x1b, + 0x1b, 0x1d, 0x1d, 0x00, 0x1e, 0x26, 0x21, 0x39, 0x2b, 0x15, 0x26, 0x44, + 0x00, 0x4c, 0x4c, 0x4a, 0x4d, 0x32, 0x2c, 0x2c, 0x42, 0x00, 0x40, 0x43, + 0x44, 0x3b, 0x3b, 0x38, 0x38, 0x35, 0x00, 0x3b, 0x42, 0x42, 0x4a, 0x4c, + 0x4c, 0x4c, 0x46, 0x00, 0x47, 0x47, 0x47, 0x47, 0x47, 0x40, 0x42, 0x3b, + 0x00, 0x43, 0x43, 0x47, 0x44, 0x44, 0x44, 0x60, 0xb9, 0x00, 0xdc, 0xd9, + 0xdc, 0xd6, 0xdc, 0xcd, 0xd0, 0xd5, 0x00, 0xb6, 0xbc, 0xb9, 0xb9, 0xb6, + 0xb6, 0xb9, 0xc0, 0x00, 0xbc, 0xbc, 0xbc, 0xbc, 0xb5, 0xb5, 0xaf, 0xab, + 0x00, 0xa6, 0xa4, 0xa1, 0x9a, 0x99, 0x95, 0x8f, 0xa3, 0x00, 0xad, 0xac, + 0xa8, 0xa5, 0xa1, 0x9d, 0xa0, 0x71, 0x1e, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xa7, 0x59, 0x0f, 0x00, 0x0d, 0x15, 0x17, 0x19, 0x1b, 0x1c, 0x1d, 0x18, + 0x10, 0x17, 0x18, 0x1a, 0xc9, 0x1d, 0x1e, 0x28, 0x39, 0x00, 0x40, 0x44, + 0x1b, 0x20, 0x39, 0x4b, 0x4f, 0x4f, 0x00, 0x4a, 0x50, 0x2e, 0x2f, 0x44, + 0x40, 0x3b, 0x39, 0x00, 0x40, 0x40, 0x39, 0x35, 0x39, 0x39, 0x3b, 0x44, + 0x00, 0x4a, 0x4f, 0x4a, 0x43, 0x3b, 0x44, 0x43, 0x46, 0x00, 0x46, 0x47, + 0x44, 0x3f, 0x43, 0x43, 0x44, 0x44, 0x00, 0x40, 0x40, 0x35, 0xac, 0xcb, + 0xdd, 0xdd, 0xdc, 0x00, 0xdc, 0xdd, 0xcd, 0xc2, 0xd5, 0xb9, 0xb9, 0xb9, + 0x00, 0xb6, 0xb6, 0xb8, 0xbc, 0xc0, 0xbc, 0xbc, 0xb9, 0x00, 0xb6, 0xb9, + 0xb6, 0xaf, 0xac, 0xa5, 0xa4, 0x9d, 0x00, 0x9a, 0x97, 0x94, 0x8c, 0x97, + 0xac, 0xab, 0xa4, 0x00, 0xa1, 0xa1, 0x9a, 0x9a, 0x77, 0x00, 0x00, 0x00, + 0xe0, 0xe9, 0xd4, 0xa7, 0x00, 0x00, 0x03, 0x0d, 0x11, 0x00, 0x17, 0x18, + 0x1a, 0x1c, 0x1d, 0x1b, 0x15, 0x18, 0x00, 0x1a, 0x1b, 0x1c, 0x1c, 0x1d, + 0x1e, 0x1f, 0x1f, 0x00, 0x39, 0x42, 0x49, 0x35, 0x1a, 0x2e, 0x49, 0x4d, + 0x00, 0x4d, 0x3f, 0x2f, 0x2e, 0x2e, 0x40, 0x35, 0x30, 0x00, 0x32, 0x40, + 0x44, 0x3b, 0x3b, 0x39, 0x39, 0x44, 0x00, 0x46, 0x47, 0x4c, 0x4a, 0x3f, + 0x35, 0x3b, 0x35, 0x10, 0x39, 0x3f, 0x46, 0x79, 0x3f, 0x40, 0x41, 0x3f, + 0x00, 0x3e, 0x61, 0xcc, 0xd3, 0xdc, 0xdd, 0xde, 0xdd, 0x00, 0xdd, 0xd4, + 0xb9, 0xcd, 0xbc, 0xbc, 0xb9, 0xb6, 0x00, 0xb6, 0xb6, 0xbc, 0xbc, 0xbc, + 0xbc, 0xb6, 0xb8, 0x00, 0xb6, 0xb5, 0xac, 0xab, 0xa5, 0xa4, 0x9c, 0x99, + 0x00, 0x98, 0x92, 0x8c, 0x92, 0xac, 0xa4, 0xa1, 0x9e, 0x00, 0x9d, 0x9a, + 0x97, 0x79, 0x02, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa7, 0x00, 0x03, + 0x0b, 0x12, 0x18, 0x00, 0x1b, 0x18, 0x15, 0x18, 0x18, 0x18, 0x1a, 0x1b, + 0x00, 0x1c, 0x1d, 0x1d, 0x1e, 0x1e, 0x20, 0x21, 0x2f, 0x00, 0x44, 0x4c, + 0x56, 0x1f, 0x20, 0x3b, 0x47, 0x4a, 0x02, 0x2e, 0x2f, 0x2c, 0x2c, 0x38, + 0x30, 0xe1, 0x42, 0x00, 0x43, 0x40, 0x3b, 0x39, 0x40, 0x40, 0x47, 0x4a, + 0x00, 0x53, 0x44, 0x3b, 0x39, 0x32, 0x31, 0x35, 0x3f, 0x00, 0x38, 0x38, + 0x39, 0x3f, 0x42, 0x40, 0x43, 0x44, 0x00, 0xb9, 0xc7, 0xc9, 0xd0, 0xdb, + 0xde, 0xde, 0xdf, 0x00, 0xdd, 0xc0, 0xc0, 0xc2, 0xbc, 0xb9, 0xb6, 0xb6, + 0x00, 0xb6, 0xb9, 0xbe, 0xbc, 0xb9, 0xb9, 0xb6, 0xb5, 0x00, 0xaf, 0xac, + 0xa7, 0xa7, 0xa1, 0x9d, 0x99, 0x96, 0x00, 0x8f, 0x88, 0x8b, 0xa9, 0xa4, + 0x9d, 0x9a, 0x79, 0x01, 0x99, 0x92, 0x79, 0x0b, 0x00, 0x00, 0x00, 0xe9, + 0xc0, 0xd4, 0xa7, 0x00, 0x03, 0x0a, 0x18, 0x1a, 0x15, 0x00, 0x11, 0x1b, + 0x18, 0x18, 0x1a, 0x1b, 0x1b, 0x1d, 0x00, 0x1d, 0x1e, 0x1e, 0x1f, 0x21, + 0x22, 0x26, 0x4a, 0x00, 0x47, 0x4d, 0x4a, 0x1d, 0x2c, 0x3b, 0x3a, 0x2f, + 0x00, 0x2f, 0x30, 0x2a, 0x2c, 0x28, 0x28, 0x2b, 0x2e, 0x00, 0x40, 0x42, + 0x42, 0x3b, 0x3b, 0x38, 0x3b, 0x3c, 0x00, 0x49, 0x4a, 0x4a, 0x3f, 0x39, + 0x39, 0x33, 0x35, 0x00, 0x38, 0x35, 0x39, 0x3b, 0x3b, 0x43, 0x44, 0x3e, + 0x00, 0x9a, 0xcc, 0xcd, 0xcc, 0xd0, 0xd5, 0xdd, 0xdf, 0x00, 0xdf, 0xdf, + 0xc4, 0xc3, 0xc1, 0xc0, 0xbc, 0xb9, 0x00, 0xb6, 0xb9, 0xbc, 0xbc, 0xbc, + 0xb8, 0xb6, 0xb6, 0x00, 0xb5, 0xaf, 0xad, 0xab, 0xa4, 0xa0, 0x9a, 0x99, + 0x00, 0x92, 0x8f, 0x84, 0x7f, 0xa4, 0xa1, 0x9d, 0x96, 0x00, 0x65, 0x96, + 0x8c, 0x7f, 0x0b, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa7, 0x00, 0x03, + 0x0b, 0x1a, 0x1b, 0x00, 0x14, 0x1a, 0x1e, 0x1e, 0x18, 0x1b, 0x1b, 0x1c, + 0x00, 0x1d, 0x1d, 0x1e, 0x20, 0x21, 0x21, 0x22, 0x3b, 0x00, 0x44, 0x44, + 0x4c, 0x44, 0x4a, 0x21, 0x2b, 0x28, 0x00, 0x2c, 0x30, 0x32, 0x31, 0x28, + 0x2b, 0x28, 0x26, 0x00, 0x26, 0x35, 0x44, 0x43, 0x3b, 0x35, 0x35, 0x35, + 0x00, 0x40, 0x43, 0x49, 0x47, 0x44, 0x40, 0x3b, 0x32, 0x00, 0x35, 0x32, + 0x38, 0x39, 0x40, 0x3f, 0x40, 0x3f, 0x00, 0x7f, 0xd4, 0xcd, 0xcf, 0xd4, + 0xd0, 0xd4, 0xdd, 0x00, 0xdf, 0xdf, 0xdf, 0xd4, 0xc3, 0xc4, 0xbc, 0xbc, + 0x00, 0xb6, 0xb6, 0xb9, 0xb6, 0xb9, 0xb6, 0xb6, 0xb6, 0x00, 0xb5, 0xb5, + 0xb2, 0xac, 0xab, 0xa1, 0xa1, 0x9a, 0x00, 0x99, 0x92, 0x8e, 0x86, 0x7f, + 0x8e, 0xa1, 0x99, 0x00, 0x8f, 0x64, 0x8f, 0x8c, 0x8c, 0x0a, 0x00, 0x00, + 0x70, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x13, 0x0d, 0x1b, 0x00, 0x1b, 0x1d, + 0x1d, 0x1e, 0x1f, 0x1b, 0x1b, 0x1c, 0x00, 0x1d, 0x1e, 0x1e, 0x1f, 0x21, + 0x21, 0x23, 0x28, 0x00, 0x3b, 0x42, 0x30, 0x44, 0x3b, 0x4e, 0x50, 0x1d, + 0x00, 0x22, 0x2e, 0x32, 0x31, 0x2c, 0x26, 0x26, 0x25, 0x00, 0x24, 0x24, + 0x35, 0x43, 0x3f, 0x35, 0x35, 0x32, 0x00, 0x39, 0x39, 0x42, 0x43, 0x42, + 0x3f, 0x3b, 0x39, 0x00, 0x31, 0x31, 0x38, 0x39, 0x3f, 0x3f, 0x40, 0x3b, + 0x00, 0x6e, 0xd0, 0xcf, 0xd4, 0xd3, 0xd5, 0xd3, 0xd5, 0x00, 0xd5, 0xdd, + 0xdf, 0xdf, 0xd0, 0xc3, 0xc2, 0xbc, 0x00, 0xb9, 0xb8, 0xb9, 0xb9, 0xb6, + 0xb8, 0xb6, 0xb5, 0x00, 0xb3, 0xb3, 0xb1, 0xad, 0xab, 0xac, 0xa4, 0xa1, + 0x00, 0x9a, 0x98, 0x94, 0x8c, 0x88, 0x7e, 0x77, 0x8f, 0x00, 0x99, 0x92, + 0x64, 0x8e, 0x84, 0x84, 0x1d, 0x00, 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x00, 0x15, 0x0e, 0x00, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x1e, 0x1b, + 0x80, 0xcb, 0x21, 0x22, 0x24, 0x2d, 0x33, 0x37, 0x31, 0x00, 0x35, 0x43, + 0x46, 0x50, 0x40, 0x1e, 0x26, 0x2c, 0x00, 0x2c, 0x28, 0x25, 0x27, 0x23, + 0x24, 0x24, 0x26, 0x00, 0x3b, 0x3f, 0x35, 0x32, 0x35, 0x35, 0x3b, 0x38, + 0x08, 0x35, 0x40, 0x39, 0x39, 0xd1, 0x35, 0x3b, 0x3b, 0x00, 0x3b, 0x39, + 0x73, 0xcd, 0xcf, 0xd4, 0xd0, 0xd7, 0x00, 0xd5, 0xd7, 0xd0, 0xd3, 0xd8, + 0xdd, 0xdc, 0xc9, 0x00, 0xc1, 0xc0, 0xbe, 0xb9, 0xb9, 0xbc, 0xb6, 0xb6, + 0x00, 0xb6, 0xb5, 0xb5, 0xb5, 0xaf, 0xb3, 0xab, 0xaa, 0x00, 0xa4, 0xa4, + 0xa1, 0x99, 0x94, 0x92, 0x8c, 0x84, 0x00, 0x7f, 0x77, 0x7c, 0x84, 0x94, + 0x85, 0x82, 0x84, 0x07, 0x84, 0x4a, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x00, 0x00, 0x17, 0x10, 0x1d, 0x1d, 0x1e, 0x1e, 0x1f, 0x00, 0x21, 0x20, + 0x1e, 0x24, 0x1e, 0x1f, 0x20, 0x21, 0x00, 0x22, 0x23, 0x28, 0x2f, 0x35, + 0x32, 0x32, 0x39, 0x00, 0x43, 0x47, 0x4c, 0x54, 0x53, 0x21, 0x22, 0x24, + 0x08, 0x26, 0x24, 0x23, 0x22, 0x59, 0x2c, 0x3f, 0x35, 0x00, 0x35, 0x33, + 0x39, 0x3b, 0x35, 0x38, 0x3b, 0x35, 0x00, 0x35, 0x35, 0x39, 0x42, 0x3f, + 0x3d, 0x3f, 0x39, 0x00, 0x92, 0xd1, 0xcd, 0xd0, 0xd0, 0xd8, 0xd9, 0xd9, + 0x00, 0xd7, 0xd0, 0xd4, 0xd3, 0xd6, 0xd5, 0xcc, 0xca, 0x00, 0xc2, 0xbe, + 0xbc, 0xbc, 0xb9, 0xb6, 0xb5, 0xb5, 0x00, 0xb3, 0xb3, 0xad, 0xac, 0xaa, + 0xa5, 0xa7, 0xa4, 0x00, 0xa1, 0x9a, 0x99, 0x96, 0x92, 0x8d, 0x84, 0x7f, + 0x00, 0x76, 0x6e, 0x64, 0x8c, 0x89, 0x71, 0x6e, 0x82, 0x0e, 0x50, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x00, 0x1a, 0x11, 0x1e, 0x1e, 0x1e, + 0x20, 0x21, 0x22, 0x00, 0x24, 0x27, 0x2c, 0x23, 0x1f, 0x21, 0x22, 0x23, + 0x00, 0x26, 0x2c, 0x30, 0x35, 0x35, 0x38, 0x3f, 0x44, 0x00, 0x49, 0x4a, + 0x50, 0x56, 0x5a, 0x30, 0x20, 0x23, 0x00, 0x22, 0x23, 0x23, 0x22, 0x24, + 0x26, 0x35, 0x39, 0x00, 0x35, 0x35, 0x35, 0x3f, 0x3b, 0x3f, 0x39, 0x40, + 0x80, 0xc1, 0x40, 0x43, 0x40, 0x3b, 0x54, 0xb2, 0xcd, 0x00, 0xcf, 0xd0, + 0xd3, 0xd8, 0xd5, 0xd8, 0xd9, 0xd3, 0x00, 0xd4, 0xd0, 0xd0, 0xd0, 0xd4, + 0xd0, 0xcd, 0xc4, 0x00, 0xc0, 0xbe, 0xbc, 0xbc, 0xb9, 0xb5, 0xb3, 0xb2, + 0x00, 0xab, 0xab, 0xa5, 0xa4, 0xa1, 0xa0, 0x9a, 0x9d, 0x00, 0x99, 0x94, + 0x94, 0x8f, 0x88, 0x82, 0x7f, 0x77, 0x00, 0x6b, 0x6e, 0x8c, 0x85, 0x7b, + 0x79, 0x7f, 0x56, 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x1a, + 0x00, 0x12, 0x1e, 0x1e, 0x1f, 0x21, 0x22, 0x24, 0x26, 0x00, 0x28, 0x2f, + 0x35, 0x31, 0x22, 0x23, 0x26, 0x2c, 0x00, 0x2f, 0x31, 0x39, 0x39, 0x38, + 0x40, 0x44, 0x47, 0x00, 0x4c, 0x54, 0x59, 0x5a, 0x5e, 0x56, 0x26, 0x21, + 0x00, 0x22, 0x22, 0x22, 0x26, 0x30, 0x39, 0x39, 0x35, 0x01, 0x39, 0x39, + 0x39, 0x3f, 0x3f, 0x3b, 0x40, 0xb9, 0x00, 0x42, 0x42, 0x47, 0x8f, 0xc9, + 0xc8, 0xc9, 0xcd, 0x00, 0xd1, 0xd5, 0xd3, 0xd9, 0xd8, 0xd8, 0xd9, 0xd4, + 0x00, 0xcf, 0xd0, 0xcd, 0xcd, 0xcf, 0xcb, 0xc9, 0xc4, 0x00, 0xbe, 0xbf, + 0xbc, 0xb8, 0xb5, 0xb3, 0xb5, 0xaf, 0x00, 0xab, 0xa4, 0xa1, 0x9d, 0x9a, + 0x9a, 0x99, 0x99, 0x00, 0x94, 0x90, 0x88, 0x85, 0x7f, 0x7b, 0x71, 0x6b, + 0x00, 0x7f, 0x88, 0x83, 0x7f, 0x79, 0x79, 0x5a, 0x00, 0x38, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x00, 0x1b, 0x13, 0x00, 0x1f, 0x1f, 0x21, 0x22, 0x23, + 0x26, 0x28, 0x2f, 0x00, 0x30, 0x33, 0x39, 0x3b, 0x24, 0x28, 0x2c, 0x30, + 0x00, 0x35, 0x39, 0x40, 0x3f, 0x40, 0x44, 0x50, 0x50, 0x00, 0x56, 0x5c, + 0x5c, 0x5e, 0x5e, 0x61, 0x58, 0x30, 0x00, 0x22, 0x22, 0x24, 0x30, 0x32, + 0x36, 0x38, 0x39, 0x00, 0x38, 0x38, 0x42, 0x43, 0x40, 0x3b, 0x42, 0x46, + 0x00, 0x3b, 0x57, 0x8f, 0xcd, 0xd4, 0xcc, 0xcc, 0xc9, 0x00, 0xc9, 0xd4, + 0xd5, 0xd9, 0xd8, 0xd5, 0xd9, 0xd6, 0x00, 0xd5, 0xcd, 0xcd, 0xcd, 0xca, + 0xcb, 0xc9, 0xcb, 0x00, 0xc5, 0xc2, 0xc0, 0xbc, 0xb9, 0xb5, 0xb3, 0xaf, + 0x00, 0xac, 0xa7, 0xa1, 0x9d, 0x9a, 0x99, 0x99, 0x99, 0x00, 0x96, 0x93, + 0x8f, 0x88, 0x84, 0x7e, 0x77, 0x71, 0x00, 0x68, 0x82, 0x84, 0x7b, 0x7b, + 0x77, 0x77, 0x56, 0x1c, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x1b, + 0x00, 0x15, 0x21, 0x20, 0x22, 0x23, 0x26, 0x28, 0x2c, 0x00, 0x2f, 0x32, + 0x39, 0x3b, 0x47, 0x32, 0x2c, 0x30, 0x00, 0x35, 0x39, 0x3b, 0x46, 0x47, + 0x47, 0x4d, 0x53, 0x00, 0x56, 0x59, 0x5c, 0x5e, 0x5e, 0x63, 0x65, 0x65, + 0x00, 0x68, 0x65, 0x56, 0x3f, 0x30, 0x2a, 0x2c, 0x2f, 0x00, 0x2e, 0x2c, + 0x30, 0x31, 0x31, 0x33, 0x39, 0x5a, 0x00, 0x79, 0xb1, 0xd0, 0xd4, 0xcf, + 0xcf, 0xcb, 0xcb, 0x00, 0xc5, 0xcb, 0xd0, 0xd9, 0xdd, 0xdb, 0xd9, 0xd8, + 0x00, 0xd5, 0xd0, 0xd0, 0xcf, 0xd0, 0xcd, 0xca, 0xd0, 0x00, 0xc8, 0xc2, + 0xc1, 0xbe, 0xbc, 0xb9, 0xb5, 0xb3, 0x00, 0xaf, 0xaa, 0xa5, 0x9d, 0x9a, + 0x99, 0x98, 0x96, 0x00, 0x97, 0x94, 0x8c, 0x85, 0x84, 0x81, 0x7b, 0x73, + 0x00, 0x6e, 0x68, 0x77, 0x82, 0x82, 0x79, 0x73, 0x73, 0x0e, 0x47, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x00, 0x1b, 0x15, 0x22, 0x22, 0x23, + 0x24, 0x28, 0x2c, 0x00, 0x30, 0x32, 0x35, 0x3b, 0x40, 0x47, 0x4d, 0x30, + 0x00, 0x33, 0x3b, 0x47, 0x44, 0x4a, 0x4d, 0x4a, 0x4d, 0x00, 0x54, 0x56, + 0x58, 0x5c, 0x5d, 0x5e, 0x64, 0x68, 0x00, 0x68, 0x71, 0x73, 0x84, 0x94, + 0x8c, 0x79, 0x6b, 0x00, 0x65, 0x63, 0x65, 0x6e, 0x79, 0x8a, 0xa7, 0xc0, + 0x00, 0xc3, 0xc2, 0xc3, 0xc0, 0xc2, 0xc1, 0xc0, 0xc0, 0x00, 0xc3, 0xc9, + 0xcd, 0xd3, 0xdc, 0xdd, 0xdb, 0xdb, 0x00, 0xd7, 0xd5, 0xd0, 0xce, 0xd5, + 0xd0, 0xcf, 0xcd, 0x00, 0xcd, 0xc5, 0xc5, 0xc7, 0xc2, 0xc0, 0xbc, 0xb5, + 0x00, 0xb3, 0xac, 0xa5, 0xa1, 0x9a, 0x9a, 0x97, 0x94, 0x00, 0x92, 0x94, + 0x92, 0x8c, 0x84, 0x82, 0x7b, 0x79, 0x00, 0x71, 0x6b, 0x64, 0x7b, 0x82, + 0x7b, 0x73, 0x6e, 0x07, 0x71, 0x39, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x00, 0x00, 0x1b, 0x15, 0x23, 0x23, 0x24, 0x28, 0x2c, 0x00, 0x30, 0x32, + 0x35, 0x39, 0x40, 0x44, 0x4c, 0x54, 0x00, 0x58, 0x57, 0x58, 0x50, 0x4d, + 0x4c, 0x53, 0x4f, 0x00, 0x53, 0x56, 0x56, 0x58, 0x5d, 0x60, 0x62, 0x65, + 0x00, 0x68, 0x65, 0x6e, 0x7b, 0x8f, 0x94, 0x8a, 0x85, 0x00, 0x89, 0x8f, + 0x91, 0x99, 0xa5, 0xa9, 0xac, 0xb1, 0x00, 0xb5, 0xb5, 0xb6, 0xbc, 0xbe, + 0xc0, 0xc2, 0xc4, 0x00, 0xc6, 0xcb, 0xcd, 0xd5, 0xd9, 0xdc, 0xdd, 0xdc, + 0x00, 0xdb, 0xd6, 0xd5, 0xd4, 0xd5, 0xd5, 0xd4, 0xcd, 0x00, 0xc9, 0xc5, + 0xc4, 0xc5, 0xc5, 0xc2, 0xbb, 0xb6, 0x00, 0xb5, 0xb2, 0xab, 0xa1, 0x9d, + 0x9a, 0x99, 0x94, 0x00, 0x92, 0x8f, 0x8f, 0x8c, 0x84, 0x82, 0x7b, 0x79, + 0x00, 0x77, 0x71, 0x68, 0x64, 0x7b, 0x7e, 0x79, 0x73, 0x03, 0x6b, 0x68, + 0x30, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0x80, 0xa7, 0x00, 0x0d, 0x15, 0x23, + 0x24, 0x28, 0x2c, 0x00, 0x2f, 0x30, 0x35, 0x3b, 0x39, 0x44, 0x4a, 0x50, + 0x00, 0x56, 0x56, 0x5e, 0x4a, 0x4f, 0x57, 0x4f, 0x54, 0x00, 0x56, 0x54, + 0x54, 0x58, 0x5c, 0x5d, 0x5e, 0x61, 0x00, 0x65, 0x68, 0x68, 0x6b, 0x74, + 0x7f, 0x92, 0x94, 0x00, 0x8f, 0x88, 0x8f, 0x91, 0x9a, 0xa5, 0xac, 0xaf, + 0x00, 0xb1, 0xb5, 0xb4, 0xb9, 0xbe, 0xbf, 0xc2, 0xc2, 0x00, 0xc5, 0xcb, + 0xcd, 0xcd, 0xd3, 0xd5, 0xd9, 0xd9, 0x00, 0xdb, 0xd8, 0xd8, 0xd8, 0xd5, + 0xd4, 0xd7, 0xd3, 0x00, 0xcb, 0xc4, 0xc0, 0xc1, 0xbe, 0xc0, 0xb9, 0xb6, + 0x00, 0xb5, 0xb3, 0xab, 0xa4, 0x9d, 0x9a, 0x97, 0x94, 0x00, 0x92, 0x8e, + 0x86, 0x84, 0x84, 0x81, 0x7b, 0x79, 0x00, 0x73, 0x72, 0x6e, 0x68, 0x63, + 0x6b, 0x79, 0x77, 0x01, 0x71, 0x68, 0x68, 0x06, 0x00, 0x00, 0x00, 0xe9, + 0xc0, 0xd4, 0xa7, 0x00, 0x05, 0x15, 0x24, 0x26, 0x28, 0x00, 0x2f, 0x32, + 0x35, 0x3b, 0x30, 0x26, 0x26, 0x39, 0x00, 0x30, 0x1d, 0x1c, 0x1e, 0x32, + 0x56, 0x54, 0x54, 0x00, 0x56, 0x57, 0x56, 0x58, 0x5c, 0x5d, 0x5e, 0x5e, + 0x00, 0x61, 0x65, 0x67, 0x6b, 0x6b, 0x73, 0x82, 0x98, 0x00, 0xa4, 0xa5, + 0xa4, 0x9d, 0x99, 0x9e, 0xa8, 0xad, 0x00, 0xb2, 0xb3, 0xb4, 0xb6, 0xb9, + 0xb9, 0xbe, 0xbe, 0x00, 0xc0, 0xc3, 0xc8, 0xcb, 0xcf, 0xcf, 0xd7, 0xd9, + 0x00, 0xdb, 0xdb, 0xd8, 0xd8, 0xd7, 0xd8, 0xd5, 0xd8, 0x00, 0xd0, 0xcd, + 0xc5, 0xc0, 0xba, 0xb9, 0xb6, 0xb6, 0x00, 0xb5, 0xb3, 0xaf, 0xab, 0xa5, + 0x9a, 0x99, 0x96, 0x00, 0x92, 0x8f, 0x88, 0x84, 0x82, 0x7f, 0x7b, 0x77, + 0x00, 0x77, 0x71, 0x71, 0x6e, 0x65, 0x63, 0x79, 0x77, 0x00, 0x71, 0x6b, + 0x67, 0x64, 0x07, 0x00, 0x00, 0x00, 0xe0, 0xe9, 0xd4, 0xa7, 0x00, 0x06, + 0x18, 0x26, 0x28, 0x00, 0x2f, 0x30, 0x32, 0x39, 0x26, 0x22, 0x24, 0x28, + 0x00, 0x1b, 0x12, 0x1c, 0x1d, 0x1f, 0x1f, 0x22, 0x5c, 0x00, 0x58, 0x56, + 0x56, 0x56, 0x5a, 0x5d, 0x5e, 0x61, 0x00, 0x63, 0x63, 0x65, 0x68, 0x6b, + 0x6c, 0x77, 0x89, 0x00, 0xa7, 0xac, 0xb3, 0xb1, 0xad, 0xa4, 0xa1, 0xa5, + 0x00, 0xab, 0xaf, 0xb5, 0xb6, 0xb9, 0xbe, 0xbf, 0xbc, 0x00, 0xc0, 0xbe, + 0xc3, 0xc9, 0xcb, 0xcd, 0xcd, 0xd6, 0x00, 0xdc, 0xd9, 0xd8, 0xdb, 0xdb, + 0xd7, 0xd5, 0xd0, 0x00, 0xd4, 0xd0, 0xcc, 0xc7, 0xbc, 0xb9, 0xb6, 0xb5, + 0x00, 0xb5, 0xb2, 0xb0, 0xaf, 0xa7, 0xa1, 0x9c, 0x97, 0x00, 0x96, 0x8f, + 0x8c, 0x84, 0x84, 0x7f, 0x79, 0x77, 0x00, 0x77, 0x71, 0x6e, 0x6b, 0x68, + 0x64, 0x60, 0x71, 0x00, 0x71, 0x6e, 0x68, 0x64, 0x5c, 0x07, 0x00, 0x00, + 0x70, 0x00, 0xe9, 0xd4, 0xa7, 0x00, 0x05, 0x1b, 0x22, 0x00, 0x2f, 0x30, + 0x35, 0x39, 0x39, 0x22, 0x24, 0x28, 0x00, 0x21, 0x0f, 0x15, 0x1f, 0x26, + 0x30, 0x30, 0x2c, 0x00, 0x26, 0x63, 0x5c, 0x58, 0x59, 0x5b, 0x5c, 0x5e, + 0x00, 0x60, 0x64, 0x65, 0x68, 0x68, 0x73, 0x8f, 0xa1, 0x00, 0x97, 0xb1, + 0xb1, 0xb5, 0xb5, 0xb5, 0xb5, 0xb3, 0x00, 0xb5, 0xb6, 0xb5, 0xb6, 0xb5, + 0xb8, 0xbf, 0xc0, 0x00, 0xc2, 0xc2, 0xc4, 0xc4, 0xc5, 0xcc, 0xcd, 0xd0, + 0x00, 0xd5, 0xdb, 0xd7, 0xd5, 0xd6, 0xd3, 0xcd, 0xcd, 0x00, 0xca, 0xcd, + 0xc5, 0xc2, 0xbd, 0xbc, 0xb7, 0xb5, 0x00, 0xb3, 0xb0, 0xaf, 0xac, 0xab, + 0xa7, 0xa1, 0x9c, 0x00, 0x9a, 0x91, 0x8f, 0x8b, 0x84, 0x82, 0x7b, 0x77, + 0x00, 0x71, 0x73, 0x6e, 0x6b, 0x6b, 0x65, 0x64, 0x60, 0x00, 0x6c, 0x71, + 0x68, 0x67, 0x63, 0x56, 0x04, 0x00, 0x38, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x00, 0x00, 0x22, 0x00, 0x22, 0x30, 0x32, 0x39, 0x3b, 0x47, 0x24, 0x26, + 0x00, 0x2c, 0x18, 0x13, 0x1c, 0x26, 0x3b, 0x4a, 0x4c, 0x00, 0x44, 0x35, + 0x44, 0x64, 0x5a, 0x5a, 0x5c, 0x5e, 0x00, 0x5e, 0x63, 0x64, 0x67, 0x68, + 0x6a, 0x6d, 0x83, 0x00, 0x9a, 0xad, 0xa5, 0x99, 0x9d, 0xaf, 0xb6, 0xb8, + 0x00, 0xb6, 0xbc, 0xc0, 0xc3, 0xc7, 0xc9, 0xbe, 0xbe, 0x00, 0xc8, 0xc8, + 0xcc, 0xcc, 0xcd, 0xcb, 0xcb, 0xcd, 0x00, 0xd0, 0xd5, 0xd0, 0xd0, 0xcd, + 0xcf, 0xcd, 0xcc, 0x00, 0xc9, 0xc7, 0xc1, 0xc0, 0xbf, 0xb9, 0xb6, 0xb6, + 0x00, 0xb3, 0xb1, 0xac, 0xac, 0xaa, 0xa7, 0xa4, 0x9e, 0x00, 0x9c, 0x97, + 0x8f, 0x8c, 0x85, 0x82, 0x7f, 0x77, 0x00, 0x71, 0x71, 0x6e, 0x6b, 0x6b, + 0x65, 0x64, 0x60, 0x00, 0x5e, 0x5c, 0x68, 0x68, 0x63, 0x63, 0x54, 0x00, + 0x3c, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x59, 0x24, 0x1f, 0x00, 0x35, 0x39, + 0x3b, 0x3b, 0x32, 0x28, 0x2c, 0x2f, 0x00, 0x11, 0x1a, 0x21, 0x33, 0x4d, + 0x54, 0x54, 0x50, 0x00, 0x4d, 0x35, 0x6c, 0x5e, 0x5c, 0x5d, 0x5e, 0x62, + 0x00, 0x7f, 0x68, 0x65, 0x6b, 0x6b, 0x6e, 0x76, 0x77, 0x00, 0x7b, 0x7f, + 0x82, 0x85, 0x89, 0x8f, 0x96, 0xb5, 0x00, 0xbe, 0xc1, 0xc3, 0xcc, 0xcf, + 0xd4, 0xd9, 0xd9, 0x00, 0xd9, 0xdb, 0xd9, 0xd9, 0xcf, 0xcc, 0xca, 0xcc, + 0x00, 0xcf, 0xcc, 0xcb, 0xc9, 0xcb, 0xc8, 0xc8, 0xc4, 0x00, 0xc1, 0xbe, + 0xbc, 0xb9, 0xb5, 0xb6, 0xb5, 0xb1, 0x00, 0xac, 0xad, 0xac, 0xa8, 0xa2, + 0xa1, 0x9d, 0x9a, 0x00, 0x97, 0x8e, 0x89, 0x84, 0x7b, 0x77, 0x73, 0x71, + 0x00, 0x71, 0x6b, 0x6b, 0x68, 0x64, 0x63, 0x5e, 0x5c, 0x00, 0x5a, 0x54, + 0x64, 0x63, 0x60, 0x44, 0x00, 0x00, 0x78, 0x00, 0xe9, 0xd4, 0xa7, 0x59, + 0x12, 0x1e, 0x3b, 0x00, 0x3b, 0x40, 0x39, 0x24, 0x2c, 0x2f, 0x2c, 0x12, + 0x00, 0x1d, 0x26, 0x35, 0x50, 0x50, 0x54, 0x50, 0x50, 0x00, 0x4a, 0x5c, + 0x65, 0x5d, 0x60, 0x64, 0x7b, 0x92, 0x00, 0x93, 0x68, 0x6b, 0x71, 0x72, + 0x77, 0x79, 0x79, 0x00, 0x82, 0x84, 0x8e, 0x92, 0x8c, 0x8c, 0x8f, 0xb5, + 0x00, 0xa1, 0xc1, 0xcf, 0xd0, 0xd8, 0xd9, 0xdc, 0xdb, 0x00, 0xdc, 0xdc, + 0xdc, 0xd0, 0xc5, 0xc1, 0xc2, 0xc2, 0x00, 0xc2, 0xc5, 0xc7, 0xc7, 0xc4, + 0xc9, 0xc0, 0xbc, 0x00, 0xb9, 0xb6, 0xb6, 0xb5, 0xb3, 0xb2, 0xaf, 0xab, + 0x00, 0xaa, 0xaa, 0xa1, 0xa3, 0x9d, 0x9c, 0x9a, 0x92, 0x00, 0x8d, 0x84, + 0x80, 0x7b, 0x73, 0x71, 0x6e, 0x6b, 0x00, 0x68, 0x68, 0x65, 0x63, 0x61, + 0x5e, 0x5a, 0x56, 0x00, 0x5d, 0x63, 0x5e, 0x5e, 0x17, 0x00, 0x00, 0x00, + 0xf0, 0xe9, 0xd4, 0xa7, 0x59, 0x07, 0x1d, 0x3e, 0x40, 0x00, 0x46, 0x4a, + 0x2c, 0x2c, 0x2f, 0x2f, 0x15, 0x1e, 0x00, 0x2c, 0x35, 0x4a, 0x50, 0x50, + 0x53, 0x53, 0x4d, 0x00, 0x53, 0x6b, 0x60, 0x63, 0x68, 0x82, 0x97, 0x99, + 0x00, 0x71, 0x71, 0x71, 0x74, 0x77, 0x7b, 0x7c, 0x81, 0x00, 0x85, 0x8e, + 0x8f, 0x92, 0x92, 0x8f, 0x93, 0xaa, 0x00, 0xbe, 0xcf, 0xd6, 0xd9, 0xd5, + 0xdc, 0xdb, 0xde, 0x00, 0xdd, 0xdb, 0xd0, 0xc2, 0xbe, 0xbf, 0xc2, 0xc0, + 0x00, 0xc2, 0xc2, 0xc4, 0xc2, 0xbe, 0xba, 0xb9, 0xb9, 0x00, 0xb5, 0xb5, + 0xb3, 0xb2, 0xaf, 0xac, 0xaa, 0xa5, 0x00, 0xa5, 0xa1, 0x9d, 0x9a, 0x9c, + 0x97, 0x92, 0x89, 0x00, 0x83, 0x7f, 0x79, 0x77, 0x6e, 0x6e, 0x6a, 0x68, + 0x00, 0x65, 0x65, 0x63, 0x60, 0x5c, 0x58, 0x54, 0x65, 0x01, 0x5d, 0x5d, + 0x5a, 0x06, 0x00, 0x00, 0x00, 0xe9, 0xe0, 0xd4, 0xa7, 0x59, 0x02, 0x21, + 0x32, 0x44, 0x47, 0x00, 0x4d, 0x40, 0x2c, 0x30, 0x39, 0x1a, 0x1f, 0x2f, + 0x00, 0x39, 0x4a, 0x50, 0x50, 0x53, 0x50, 0x4d, 0x57, 0x00, 0x6e, 0x64, + 0x64, 0x73, 0x85, 0x97, 0x9d, 0x7e, 0x00, 0x72, 0x73, 0x73, 0x78, 0x79, + 0x7d, 0x82, 0x82, 0x00, 0x8c, 0x8f, 0x92, 0x96, 0x96, 0x92, 0xaa, 0x92, + 0x00, 0x9a, 0xb3, 0xd5, 0xd0, 0xd7, 0xdd, 0xde, 0xdd, 0x00, 0xd9, 0xc0, + 0xb5, 0xbc, 0xbe, 0xc0, 0xc2, 0xc1, 0x00, 0xc0, 0xbe, 0xbc, 0xb9, 0xbc, + 0xb9, 0xb6, 0xb5, 0x00, 0xb3, 0xb3, 0xb2, 0xad, 0xac, 0xa5, 0xa4, 0xa3, + 0x00, 0xa1, 0x9c, 0x9a, 0x99, 0x92, 0x8f, 0x8b, 0x84, 0x00, 0x81, 0x79, + 0x71, 0x6e, 0x6b, 0x68, 0x65, 0x63, 0x00, 0x63, 0x60, 0x5e, 0x5c, 0x58, + 0x50, 0x47, 0x5c, 0x03, 0x5a, 0x50, 0x02, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xc0, 0xa7, 0x5a, 0x31, 0x2f, 0x4a, 0x4d, 0x4f, 0x56, 0x00, 0x30, 0x35, + 0x39, 0x20, 0x1f, 0x2c, 0x35, 0x4d, 0x00, 0x50, 0x50, 0x51, 0x51, 0x50, + 0x5d, 0x7b, 0x6e, 0x00, 0x65, 0x79, 0x8f, 0x9c, 0x9d, 0x78, 0x71, 0x71, + 0x00, 0x73, 0x7b, 0x7b, 0x7f, 0x82, 0x84, 0x88, 0x8b, 0x00, 0x90, 0x96, + 0x97, 0x92, 0x91, 0x94, 0x94, 0xc5, 0x00, 0xd5, 0xd8, 0xd9, 0xdd, 0xde, + 0xdf, 0xde, 0xde, 0x00, 0xcd, 0xb6, 0xbc, 0xc3, 0xc1, 0xc0, 0xc1, 0xb9, + 0x00, 0xb9, 0xb9, 0xb6, 0xb6, 0xb6, 0xb5, 0xb3, 0xb2, 0x00, 0xac, 0xab, + 0xaa, 0xa5, 0xa4, 0xa1, 0x9c, 0x9a, 0x00, 0x99, 0x96, 0x92, 0x8f, 0x88, + 0x84, 0x7b, 0x77, 0x00, 0x71, 0x6e, 0x6b, 0x65, 0x64, 0x63, 0x5e, 0x5d, + 0x00, 0x5d, 0x5a, 0x54, 0x4d, 0x4a, 0x5d, 0x5c, 0x44, 0x1e, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5b, 0x17, 0x00, 0x23, 0x53, 0x50, 0x51, 0x56, + 0x54, 0x35, 0x3b, 0x00, 0x2f, 0x1e, 0x28, 0x35, 0x54, 0x4d, 0x50, 0x4f, + 0x00, 0x4d, 0x54, 0x65, 0x85, 0x7f, 0x6b, 0x7b, 0x91, 0x00, 0x9e, 0xa1, + 0x8b, 0x71, 0x74, 0x77, 0x79, 0x7f, 0x00, 0x81, 0x84, 0x84, 0x88, 0x8b, + 0x8f, 0x92, 0x98, 0x00, 0x96, 0x94, 0x96, 0x9a, 0xdc, 0xd0, 0xd9, 0xd8, + 0x00, 0xdc, 0xde, 0xdf, 0xdf, 0xde, 0xdf, 0xdd, 0xc9, 0x00, 0xb9, 0xbc, + 0xbe, 0xbe, 0xb6, 0xb6, 0xb6, 0xb8, 0x00, 0xb5, 0xb5, 0xb3, 0xb1, 0xad, + 0xad, 0xaa, 0xa4, 0x00, 0xa1, 0xa0, 0x9d, 0x9c, 0x9a, 0x97, 0x93, 0x8f, + 0x00, 0x8c, 0x88, 0x82, 0x7b, 0x76, 0x71, 0x6d, 0x68, 0x00, 0x65, 0x64, + 0x61, 0x5e, 0x5c, 0x5a, 0x58, 0x50, 0x00, 0x47, 0x54, 0x5c, 0x5a, 0x12, + 0x00, 0x00, 0x00, 0xf0, 0xe9, 0xd4, 0xa7, 0x5b, 0x09, 0x21, 0x50, 0x54, + 0x00, 0x56, 0x59, 0x5c, 0x58, 0x40, 0x40, 0x24, 0x24, 0x00, 0x47, 0x4d, + 0x50, 0x4d, 0x4e, 0x53, 0x54, 0x7f, 0x00, 0x8c, 0x8c, 0x7e, 0x82, 0x97, + 0x9e, 0xa4, 0xad, 0x00, 0x82, 0x77, 0x79, 0x7b, 0x7f, 0x82, 0x83, 0x85, + 0x00, 0x88, 0x92, 0x8f, 0x92, 0x97, 0x94, 0x97, 0x94, 0x00, 0x96, 0xcc, + 0xd5, 0xd7, 0xd8, 0xde, 0xde, 0xdf, 0x20, 0xde, 0xdf, 0xe9, 0xdb, 0xb9, + 0xbc, 0xbc, 0xb9, 0x00, 0xb6, 0xb6, 0xb5, 0xb5, 0xb3, 0xb2, 0xaf, 0xad, + 0x00, 0xaa, 0xa7, 0xa1, 0x9d, 0x9d, 0x9a, 0x99, 0x96, 0x00, 0x93, 0x92, + 0x8c, 0x88, 0x84, 0x7f, 0x79, 0x72, 0x00, 0x6e, 0x6d, 0x65, 0x64, 0x61, + 0x5e, 0x5c, 0x5a, 0x00, 0x57, 0x54, 0x4a, 0x44, 0x40, 0x58, 0x50, 0x05, + 0x1e, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5c, 0x3b, 0x00, 0x3b, 0x58, + 0x58, 0x5b, 0x5d, 0x5e, 0x63, 0x5d, 0x00, 0x5d, 0x38, 0x3e, 0x4d, 0x4e, + 0x50, 0x50, 0x53, 0x00, 0x65, 0x8f, 0x8c, 0x92, 0x92, 0x8f, 0x9a, 0x9d, + 0x00, 0xa5, 0xad, 0x88, 0x7b, 0x7f, 0x7f, 0x7f, 0x82, 0x00, 0x85, 0x88, + 0x8f, 0x91, 0x92, 0x91, 0x94, 0x96, 0x00, 0x96, 0x96, 0x94, 0xc1, 0xcf, + 0xd5, 0xdd, 0xde, 0x04, 0xdd, 0xde, 0xde, 0xdf, 0xde, 0xe1, 0xc1, 0xb6, + 0x00, 0xb8, 0xb6, 0xb6, 0xb5, 0xb5, 0xb3, 0xb3, 0xad, 0x00, 0xac, 0xab, + 0xa4, 0xa4, 0xa0, 0x9a, 0x9a, 0x99, 0x00, 0x97, 0x8f, 0x8f, 0x8f, 0x8b, + 0x88, 0x7f, 0x7b, 0x00, 0x77, 0x71, 0x6d, 0x6b, 0x64, 0x63, 0x5d, 0x5c, + 0x00, 0x5a, 0x56, 0x51, 0x4c, 0x47, 0x3b, 0x44, 0x58, 0x0f, 0x40, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5d, 0x00, 0x32, 0x2b, 0x5c, 0x5c, 0x5d, + 0x5e, 0x60, 0x64, 0x00, 0x65, 0x68, 0x6b, 0x54, 0x44, 0x4a, 0x4a, 0x50, + 0x00, 0x63, 0x8c, 0x8c, 0x92, 0x94, 0x97, 0x98, 0x9d, 0x00, 0xa0, 0xa7, + 0x96, 0x73, 0x7b, 0x7e, 0x7f, 0x82, 0x00, 0x89, 0x88, 0x8e, 0x8e, 0x92, + 0x92, 0x92, 0x94, 0x00, 0x96, 0x97, 0x97, 0xb5, 0xd3, 0xcf, 0xd5, 0xdd, + 0x01, 0xde, 0xde, 0xdd, 0xde, 0xdf, 0xde, 0xde, 0xe1, 0x00, 0xb6, 0xb5, + 0xb5, 0xb3, 0xb5, 0xb5, 0xaf, 0xaf, 0x00, 0xac, 0xac, 0xa4, 0xa0, 0xa1, + 0x9a, 0x9a, 0x9a, 0x00, 0x98, 0x92, 0x8f, 0x8f, 0x8b, 0x85, 0x82, 0x7f, + 0x00, 0x79, 0x74, 0x73, 0x6e, 0x64, 0x63, 0x5e, 0x5d, 0x00, 0x5a, 0x57, + 0x54, 0x4d, 0x50, 0x3b, 0x50, 0x56, 0x07, 0x56, 0x12, 0x00, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0x80, 0x5d, 0x08, 0x26, 0x58, 0x5d, 0x60, 0x63, 0x64, + 0x00, 0x64, 0x65, 0x68, 0x6e, 0x73, 0x71, 0x68, 0x6b, 0x00, 0x7b, 0x88, + 0x88, 0x8c, 0x93, 0x94, 0x99, 0x9a, 0x00, 0xa1, 0xa1, 0xa5, 0xac, 0xab, + 0x81, 0x7f, 0x85, 0x00, 0x89, 0x91, 0x89, 0x8c, 0x8f, 0x92, 0x94, 0x96, + 0x00, 0x95, 0x94, 0x96, 0x97, 0x9a, 0xd5, 0xd7, 0xd8, 0x00, 0xdc, 0xdd, + 0xdd, 0xdd, 0xde, 0xde, 0xde, 0xdd, 0x00, 0xdf, 0xd9, 0xc5, 0xb1, 0xaf, + 0xb2, 0xaf, 0xb2, 0x00, 0xaf, 0xad, 0xac, 0xa7, 0xa5, 0xa1, 0x9c, 0x9a, + 0x00, 0x98, 0x99, 0x99, 0x93, 0x8f, 0x8c, 0x88, 0x88, 0x00, 0x88, 0x7f, + 0x7b, 0x77, 0x72, 0x6e, 0x68, 0x63, 0x00, 0x5e, 0x5d, 0x5c, 0x58, 0x54, + 0x50, 0x47, 0x58, 0x00, 0x50, 0x56, 0x50, 0x4a, 0x02, 0x00, 0x00, 0x00, + 0xf0, 0xe9, 0xd4, 0xa7, 0x5e, 0x4d, 0x44, 0x60, 0x63, 0x00, 0x64, 0x64, + 0x65, 0x68, 0x6a, 0x6b, 0x6e, 0x73, 0x00, 0x77, 0x7b, 0x7f, 0x84, 0x88, + 0x8c, 0x93, 0x94, 0x00, 0x99, 0x9a, 0xa1, 0xa4, 0xa7, 0xac, 0xaf, 0x7f, + 0x00, 0x82, 0x88, 0x8e, 0x92, 0x8f, 0x8d, 0x92, 0x92, 0x00, 0x94, 0x97, + 0x94, 0x96, 0x94, 0x94, 0x99, 0xd9, 0x00, 0xd5, 0xd5, 0xd9, 0xdd, 0xdd, + 0xde, 0xde, 0xdf, 0x00, 0xde, 0xdd, 0xb6, 0xab, 0xaf, 0xad, 0xac, 0xab, + 0x00, 0xab, 0xac, 0xac, 0xac, 0xaa, 0xa3, 0xa3, 0x9a, 0x00, 0x9a, 0x98, + 0x97, 0x96, 0x94, 0x92, 0x8e, 0x89, 0x00, 0x88, 0x85, 0x81, 0x7b, 0x79, + 0x72, 0x6e, 0x65, 0x00, 0x64, 0x60, 0x5e, 0x5c, 0x58, 0x56, 0x50, 0x4d, + 0x00, 0x50, 0x56, 0x58, 0x53, 0x50, 0x32, 0x00, 0x00, 0x78, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x0a, 0x2c, 0x63, 0x00, 0x65, 0x64, 0x68, 0x68, 0x68, + 0x6b, 0x6a, 0x6d, 0x00, 0x71, 0x77, 0x79, 0x7b, 0x81, 0x84, 0x8c, 0x94, + 0x00, 0x94, 0x99, 0x9e, 0xa4, 0xa7, 0xab, 0xab, 0xac, 0x00, 0xad, 0x85, + 0x89, 0x8c, 0x92, 0x91, 0x8e, 0x8f, 0x00, 0x92, 0x94, 0x97, 0x96, 0x96, + 0x97, 0x97, 0x98, 0x00, 0xbe, 0xd1, 0xd5, 0xdc, 0xdd, 0xdc, 0xdd, 0xdd, + 0x00, 0xdd, 0xdf, 0xc2, 0xa5, 0xac, 0xab, 0xaa, 0xa5, 0x00, 0xa5, 0xa4, + 0xa4, 0xa4, 0xa1, 0xa1, 0x9a, 0x98, 0x00, 0x96, 0x96, 0x94, 0x94, 0x91, + 0x92, 0x8c, 0x88, 0x00, 0x88, 0x87, 0x83, 0x7f, 0x79, 0x72, 0x71, 0x6b, + 0x00, 0x64, 0x63, 0x5e, 0x5c, 0x58, 0x56, 0x54, 0x4d, 0x00, 0x47, 0x50, + 0x58, 0x4d, 0x50, 0x4a, 0x04, 0x00, 0x3c, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0x5f, 0x00, 0x54, 0x00, 0x50, 0x6a, 0x6a, 0x68, 0x6b, 0x6a, 0x6a, 0x6b, + 0x00, 0x6b, 0x6e, 0x71, 0x73, 0x79, 0x7c, 0x82, 0x88, 0x00, 0x92, 0x98, + 0x99, 0x9d, 0xa5, 0xab, 0xac, 0xaf, 0x00, 0xaf, 0xad, 0x97, 0x8c, 0x92, + 0x92, 0x92, 0x8f, 0x00, 0x92, 0x94, 0x94, 0x97, 0x96, 0x95, 0x97, 0x99, + 0x00, 0xa5, 0xb3, 0xd5, 0xd0, 0xd5, 0xd8, 0xd7, 0xd9, 0x00, 0xdd, 0xdc, + 0xb3, 0x9d, 0xa4, 0xa7, 0xa8, 0xa4, 0x00, 0xa5, 0xa4, 0x9e, 0x9d, 0x9b, + 0x9a, 0x98, 0x97, 0x00, 0x94, 0x93, 0x92, 0x8f, 0x92, 0x8f, 0x8f, 0x88, + 0x00, 0x85, 0x82, 0x7f, 0x7b, 0x79, 0x73, 0x71, 0x6b, 0x00, 0x65, 0x63, + 0x5e, 0x5d, 0x58, 0x58, 0x53, 0x4d, 0x00, 0x4a, 0x44, 0x3e, 0x56, 0x2f, + 0x47, 0x3b, 0x00, 0x3c, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x00, 0x00, + 0x00, 0x0a, 0x33, 0x6e, 0x6b, 0x6d, 0x6e, 0x6b, 0x67, 0x00, 0x68, 0x6b, + 0x6b, 0x6e, 0x71, 0x78, 0x7b, 0x82, 0x00, 0x85, 0x8f, 0x97, 0x9d, 0xa4, + 0xab, 0xaf, 0xa4, 0x00, 0xab, 0xb5, 0xa7, 0x99, 0x8a, 0x8f, 0x91, 0x8f, + 0x00, 0x8f, 0x94, 0x94, 0x96, 0x97, 0x98, 0x97, 0x97, 0x00, 0x98, 0xd0, + 0xd4, 0xd4, 0xb9, 0xdc, 0xd5, 0xd5, 0x00, 0xdb, 0xc8, 0xa4, 0xa3, 0xa0, + 0xa4, 0xa3, 0xa4, 0x00, 0xa1, 0xa1, 0x9d, 0x9a, 0x9a, 0x98, 0x97, 0x91, + 0x00, 0x92, 0x8f, 0x8b, 0x88, 0x88, 0x88, 0x85, 0x84, 0x00, 0x84, 0x82, + 0x7f, 0x7f, 0x7b, 0x77, 0x71, 0x6b, 0x00, 0x65, 0x64, 0x60, 0x5d, 0x5a, + 0x58, 0x54, 0x54, 0x00, 0x4a, 0x45, 0x40, 0x39, 0x35, 0x2f, 0x4a, 0x05, + 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x11, 0x00, 0x5a, 0x5c, + 0x6e, 0x71, 0x6e, 0x6b, 0x6b, 0x68, 0x00, 0x6b, 0x6b, 0x6e, 0x70, 0x73, + 0x7b, 0x82, 0x88, 0x00, 0x91, 0x98, 0x99, 0x94, 0x94, 0x92, 0x96, 0xa5, + 0x00, 0xac, 0xa7, 0x99, 0x92, 0x92, 0x94, 0x90, 0x94, 0x00, 0x98, 0x9a, + 0x96, 0x97, 0x97, 0x98, 0x9a, 0xb5, 0x00, 0xd5, 0xd0, 0xc2, 0x99, 0xa3, + 0xd5, 0xd9, 0xdc, 0x00, 0xdd, 0xaf, 0xd5, 0xac, 0xa1, 0xa4, 0xa0, 0x9e, + 0x00, 0x9c, 0x99, 0x99, 0x97, 0x93, 0x92, 0x8e, 0x8d, 0x00, 0x89, 0x88, + 0x84, 0x82, 0x84, 0x7f, 0x7f, 0x7e, 0x00, 0x7a, 0x79, 0x77, 0x72, 0x71, + 0x6a, 0x66, 0x64, 0x00, 0x61, 0x5e, 0x5c, 0x58, 0x56, 0x50, 0x4d, 0x47, + 0x00, 0x40, 0x3b, 0x35, 0x2f, 0x3b, 0x40, 0x00, 0x00, 0x7c, 0x00, 0xe9, + 0xd4, 0xa7, 0x5f, 0x12, 0x0b, 0x40, 0x00, 0x77, 0x71, 0x71, 0x71, 0x6e, + 0x6b, 0x68, 0x6e, 0x00, 0x6e, 0x71, 0x77, 0x7f, 0x84, 0x8a, 0x8c, 0x8a, + 0x00, 0x84, 0x84, 0x85, 0x93, 0x9e, 0xa4, 0xa4, 0xa1, 0x00, 0x97, 0x8f, + 0x92, 0x95, 0xab, 0xcb, 0xcd, 0x9d, 0x00, 0x97, 0x98, 0x96, 0x97, 0x99, + 0xaa, 0xd5, 0xc9, 0x00, 0x8f, 0x79, 0x6e, 0x7f, 0x97, 0x97, 0x9e, 0x8c, + 0x00, 0xab, 0x9a, 0x94, 0x9a, 0x9d, 0x9a, 0x99, 0x98, 0x00, 0x94, 0x92, + 0x92, 0x8c, 0x8b, 0x84, 0x82, 0x82, 0x00, 0x7d, 0x7f, 0x79, 0x79, 0x78, + 0x76, 0x73, 0x73, 0x00, 0x70, 0x6d, 0x6b, 0x67, 0x64, 0x61, 0x5e, 0x5c, + 0x00, 0x5a, 0x57, 0x56, 0x50, 0x4a, 0x44, 0x3d, 0x35, 0x01, 0x31, 0x2c, + 0x40, 0x05, 0x00, 0x00, 0x00, 0xe9, 0xf0, 0xd4, 0xa7, 0x5f, 0x13, 0x5e, + 0x5e, 0x79, 0x76, 0x00, 0x73, 0x73, 0x71, 0x6e, 0x71, 0x6b, 0x71, 0x7a, + 0x00, 0x84, 0x88, 0x8c, 0x8f, 0x8c, 0x88, 0x8b, 0x8f, 0x00, 0x8f, 0x97, + 0x9a, 0xa0, 0xa0, 0x99, 0x92, 0x92, 0x00, 0xa5, 0xbf, 0xcb, 0xcd, 0xab, + 0x99, 0x96, 0x98, 0x00, 0x97, 0xab, 0xc5, 0xa4, 0x97, 0x65, 0x68, 0x6b, + 0x00, 0x71, 0xa1, 0x97, 0x88, 0x79, 0xa1, 0x73, 0x6e, 0x00, 0x77, 0x85, + 0x99, 0x97, 0x97, 0x94, 0x92, 0x8c, 0x00, 0x88, 0x84, 0x82, 0x7f, 0x7b, + 0x7b, 0x74, 0x73, 0x00, 0x71, 0x71, 0x6b, 0x6b, 0x6b, 0x6a, 0x69, 0x68, + 0x00, 0x64, 0x60, 0x5e, 0x5c, 0x5a, 0x58, 0x56, 0x4d, 0x00, 0x4c, 0x45, + 0x40, 0x39, 0x34, 0x2c, 0x2f, 0x35, 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xa7, 0x5f, 0x14, 0x00, 0x0d, 0x47, 0x73, 0x77, 0x78, 0x77, 0x72, 0x71, + 0x00, 0x72, 0x72, 0x73, 0x7d, 0x84, 0x92, 0x95, 0x97, 0x01, 0x9a, 0x99, + 0x97, 0x92, 0x8c, 0x8c, 0x92, 0xc1, 0x00, 0x92, 0x94, 0xa8, 0xad, 0xc0, + 0xcf, 0xd5, 0xd0, 0x00, 0xc9, 0xbc, 0xac, 0xa1, 0x92, 0x94, 0x99, 0x71, + 0x00, 0x73, 0x7b, 0x7b, 0x81, 0x82, 0x84, 0x84, 0x82, 0x00, 0x7f, 0x79, + 0x79, 0x71, 0x71, 0x88, 0x93, 0x92, 0x00, 0x8c, 0x85, 0x84, 0x82, 0x82, + 0x7b, 0x77, 0x76, 0x00, 0x71, 0x6e, 0x6e, 0x68, 0x66, 0x65, 0x6b, 0x6d, + 0x00, 0x6e, 0x6a, 0x68, 0x68, 0x63, 0x5e, 0x5c, 0x56, 0x00, 0x51, 0x4c, + 0x47, 0x3f, 0x3b, 0x35, 0x2c, 0x2f, 0x07, 0x3b, 0x02, 0x00, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0xc0, 0x5f, 0x15, 0x23, 0x5a, 0x82, 0x7b, 0x79, 0x78, + 0x00, 0x77, 0x78, 0x79, 0x78, 0x82, 0x8c, 0x96, 0x9a, 0x00, 0xa2, 0xa7, + 0xa4, 0xa4, 0x9d, 0x9a, 0x92, 0x8c, 0x00, 0x8f, 0x97, 0x97, 0x91, 0x94, + 0x9f, 0x98, 0x94, 0x00, 0xc5, 0xd0, 0xd4, 0xd3, 0xc2, 0x99, 0x92, 0x94, + 0x00, 0x9a, 0x82, 0x7f, 0x7f, 0x84, 0x8b, 0x8c, 0x8b, 0x00, 0x8e, 0x8c, + 0x8c, 0x88, 0x85, 0x7f, 0x7b, 0x73, 0x00, 0x6e, 0x78, 0x8e, 0x8b, 0x85, + 0x81, 0x7f, 0x7f, 0x00, 0x79, 0x73, 0x71, 0x6d, 0x6a, 0x65, 0x64, 0x64, + 0x00, 0x64, 0x67, 0x6b, 0x71, 0x71, 0x6b, 0x65, 0x60, 0x00, 0x5c, 0x56, + 0x50, 0x4c, 0x46, 0x42, 0x39, 0x35, 0x01, 0x2e, 0x30, 0x3c, 0x18, 0x00, + 0x00, 0x00, 0xe9, 0xf0, 0xd4, 0xa7, 0x5f, 0x16, 0x03, 0x5e, 0x71, 0x82, + 0x00, 0x7f, 0x7e, 0x7b, 0x7f, 0x7d, 0x7f, 0x84, 0x8f, 0x00, 0x97, 0xa0, + 0xa7, 0xab, 0xab, 0xb0, 0xb3, 0xb3, 0x00, 0xb5, 0xa8, 0x92, 0x97, 0x92, + 0x92, 0x9a, 0x9d, 0x00, 0x92, 0x97, 0x94, 0xd0, 0xd4, 0xc9, 0x96, 0x97, + 0x00, 0x99, 0xa0, 0xaa, 0x89, 0x84, 0x92, 0xb5, 0x93, 0x00, 0x92, 0x92, + 0x92, 0x8f, 0x8d, 0x8e, 0x8d, 0x88, 0x00, 0x81, 0x79, 0x73, 0x6b, 0x6e, + 0x83, 0x82, 0x7f, 0x00, 0x7b, 0x79, 0x73, 0x71, 0x6e, 0x68, 0x65, 0x64, + 0x00, 0x63, 0x60, 0x65, 0x6a, 0x71, 0x71, 0x6e, 0x67, 0x00, 0x5e, 0x5a, + 0x55, 0x50, 0x4a, 0x47, 0x44, 0x3b, 0x00, 0x32, 0x2c, 0x28, 0x3b, 0x3b, + 0x02, 0x00, 0x00, 0x7c, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x0d, 0x56, + 0x00, 0x84, 0x84, 0x82, 0x82, 0x85, 0x88, 0x88, 0x8f, 0x00, 0x93, 0x99, + 0xa3, 0xab, 0xad, 0xaf, 0xb2, 0xb6, 0x00, 0xb5, 0xb9, 0xb2, 0xa7, 0x99, + 0x92, 0x94, 0xab, 0x00, 0xb6, 0xbe, 0xb9, 0xc0, 0xd0, 0xc9, 0x97, 0x9a, + 0x00, 0x9d, 0xa4, 0xac, 0xb3, 0xb9, 0xb9, 0xb6, 0xb5, 0x00, 0xb2, 0x8c, + 0x8e, 0x8f, 0x8e, 0x8b, 0x89, 0x89, 0x00, 0x85, 0x7f, 0x7b, 0x78, 0x71, + 0x68, 0x71, 0x7f, 0x00, 0x7f, 0x78, 0x77, 0x71, 0x6e, 0x6b, 0x65, 0x65, + 0x00, 0x63, 0x60, 0x68, 0x73, 0x77, 0x74, 0x71, 0x67, 0x00, 0x5c, 0x59, + 0x56, 0x51, 0x4a, 0x47, 0x41, 0x39, 0x00, 0x32, 0x31, 0x3b, 0x32, 0x3b, + 0x04, 0x00, 0x00, 0x7c, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x00, 0x00, + 0x00, 0x2c, 0x5e, 0x94, 0x8c, 0x8f, 0x8d, 0x92, 0x92, 0x00, 0x97, 0x99, + 0xa1, 0xa7, 0xaf, 0xb2, 0xb3, 0xb5, 0x00, 0xb6, 0xb9, 0xb9, 0xb8, 0xb5, + 0xa7, 0xa1, 0xae, 0x00, 0xc0, 0xc8, 0xc5, 0xd0, 0xd0, 0xd0, 0xa5, 0x94, + 0x00, 0x9d, 0xac, 0xb2, 0xb6, 0xb8, 0xb6, 0xb6, 0xb6, 0x00, 0xb6, 0xb6, + 0xa3, 0x8c, 0x8c, 0x8b, 0x84, 0x84, 0x00, 0x84, 0x82, 0x7b, 0x7b, 0x77, + 0x73, 0x6b, 0x65, 0x00, 0x7b, 0x79, 0x76, 0x71, 0x71, 0x6b, 0x68, 0x68, + 0x00, 0x79, 0x82, 0x82, 0x7b, 0x79, 0x77, 0x71, 0x6f, 0x00, 0x5c, 0x57, + 0x54, 0x54, 0x4d, 0x47, 0x40, 0x39, 0x00, 0x32, 0x30, 0x2d, 0x44, 0x44, + 0x12, 0x00, 0x00, 0x7e, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x01, 0x02, + 0x00, 0x65, 0x71, 0x97, 0x96, 0x97, 0x98, 0x9a, 0x9d, 0x00, 0xa1, 0xaa, + 0xac, 0xb3, 0xb6, 0xb6, 0xb6, 0xb9, 0x00, 0xbc, 0xbc, 0xbe, 0xbe, 0xb9, + 0xb9, 0xc2, 0xb6, 0x00, 0xaf, 0xac, 0xad, 0xd0, 0xc2, 0x93, 0x9c, 0xa8, + 0x00, 0xaf, 0xb9, 0xb9, 0xb9, 0xb8, 0xb6, 0xb5, 0xb5, 0x00, 0xb5, 0xb6, + 0x8f, 0x8b, 0x85, 0x85, 0x82, 0x82, 0x00, 0x7e, 0x7c, 0x79, 0x77, 0x73, + 0x6e, 0x68, 0x67, 0x00, 0x77, 0x71, 0x71, 0x6b, 0x65, 0x64, 0x65, 0x84, + 0x00, 0x82, 0x7f, 0x79, 0x76, 0x71, 0x6e, 0x65, 0x53, 0x00, 0x50, 0x4d, + 0x4a, 0x47, 0x40, 0x39, 0x31, 0x2f, 0x00, 0x2c, 0x28, 0x47, 0x26, 0x01, + 0x00, 0x00, 0x00, 0xfc, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x02, 0x02, 0x68, + 0x00, 0x8c, 0x9a, 0x9d, 0xa0, 0xa4, 0xa7, 0xab, 0xad, 0x00, 0xb5, 0xb5, + 0xbc, 0xc0, 0xbc, 0xbc, 0xbe, 0xbe, 0x00, 0xc2, 0xc2, 0xc4, 0xc3, 0xc0, + 0xa9, 0xac, 0xaf, 0x00, 0xac, 0xcd, 0xad, 0x9a, 0x92, 0x92, 0xa7, 0xb6, + 0x00, 0xb9, 0xbc, 0xb9, 0xb9, 0xb5, 0xb5, 0xb3, 0xb2, 0x00, 0x84, 0x8c, + 0x84, 0x82, 0x7f, 0x7b, 0x79, 0x79, 0x00, 0x77, 0x72, 0x71, 0x6e, 0x6a, + 0x63, 0x71, 0x6e, 0x00, 0x6d, 0x68, 0x64, 0x61, 0x64, 0x84, 0x7d, 0x79, + 0x00, 0x76, 0x71, 0x71, 0x5d, 0x50, 0x4f, 0x4f, 0x4a, 0x00, 0x47, 0x40, + 0x3b, 0x33, 0x2f, 0x35, 0x24, 0x40, 0x07, 0x39, 0x02, 0x00, 0x00, 0x00, + 0xe9, 0xd4, 0xa7, 0xe0, 0x5f, 0x17, 0x04, 0x0d, 0x5f, 0x99, 0xa3, 0xa7, + 0x00, 0xab, 0xac, 0xb3, 0xb5, 0xb6, 0xb9, 0xbc, 0xc0, 0x00, 0xc0, 0xbe, + 0xbe, 0xc1, 0xc1, 0xc2, 0xc2, 0xc5, 0x00, 0xc8, 0xae, 0xb2, 0xc0, 0xc5, + 0xd0, 0x9a, 0x82, 0x00, 0x88, 0x92, 0x97, 0xa1, 0xb8, 0xb5, 0xb6, 0xb6, + 0x00, 0xb5, 0xb3, 0xb3, 0xaf, 0xac, 0xab, 0x7f, 0x7e, 0x00, 0x7b, 0x82, + 0x79, 0x77, 0x73, 0x71, 0x6d, 0x68, 0x08, 0x65, 0x63, 0x6e, 0x7e, 0xd9, + 0x5e, 0x65, 0x82, 0x40, 0x7b, 0x81, 0x6a, 0x50, 0x51, 0x4d, 0x4c, 0x49, + 0x00, 0x44, 0x3b, 0x35, 0x30, 0x30, 0x49, 0x3b, 0x35, 0x0f, 0x03, 0x00, + 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xc0, 0x17, 0x06, 0x38, 0x65, 0xa5, + 0xab, 0xad, 0xb3, 0x00, 0xb6, 0xb6, 0xbc, 0xbe, 0xc0, 0xc1, 0xc2, 0xc2, + 0x00, 0xc2, 0xc2, 0xc8, 0xc3, 0xc5, 0xcb, 0xc0, 0xab, 0x00, 0xb3, 0xd5, + 0xd0, 0xcd, 0x79, 0x81, 0x8f, 0x96, 0x00, 0x97, 0x98, 0xab, 0xb5, 0xaf, + 0xad, 0xb5, 0xb3, 0x00, 0xac, 0xad, 0xac, 0xab, 0x94, 0x84, 0x88, 0x9a, + 0x00, 0x88, 0x71, 0x71, 0x6e, 0x6a, 0x65, 0x64, 0x64, 0x00, 0x8f, 0x92, + 0x73, 0x63, 0x5e, 0x6b, 0x71, 0x7e, 0x00, 0x78, 0x77, 0x73, 0x6e, 0x65, + 0x4d, 0x4d, 0x4c, 0x00, 0x49, 0x46, 0x40, 0x39, 0x32, 0x2f, 0x47, 0x40, + 0x07, 0x39, 0x0e, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xe0, 0x5f, 0x17, + 0x07, 0x00, 0x3b, 0x6b, 0xaf, 0xb3, 0x00, 0xb5, 0xb5, 0xbc, 0xbc, 0xc0, + 0xc5, 0xc5, 0xc5, 0x00, 0xc5, 0xc9, 0xcd, 0xc8, 0xcd, 0xc9, 0xcd, 0xc5, + 0x00, 0xab, 0xcd, 0xd0, 0xb6, 0xac, 0x79, 0x82, 0x93, 0x00, 0x97, 0x9a, + 0x97, 0xa1, 0xb6, 0xa1, 0x9a, 0xb2, 0x00, 0xaf, 0xad, 0xac, 0xa8, 0xa7, + 0xa4, 0xa4, 0x99, 0x00, 0x99, 0x9c, 0x6e, 0x6b, 0x67, 0x65, 0x64, 0x65, + 0x00, 0x83, 0x8c, 0x94, 0x92, 0x73, 0x84, 0x82, 0x7f, 0x00, 0x7b, 0x79, + 0x77, 0x6e, 0x6b, 0x5e, 0x4d, 0x50, 0x00, 0x4c, 0x47, 0x41, 0x3b, 0x35, + 0x2f, 0x2c, 0x44, 0x07, 0x39, 0x11, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0xf0, 0x5f, 0x17, 0x07, 0x01, 0x40, 0x71, 0xb5, 0xb5, 0x00, 0xb6, 0xb9, + 0xbd, 0xc2, 0xc5, 0xc9, 0xc9, 0xcd, 0x00, 0xcd, 0xd0, 0xcc, 0xcd, 0xce, + 0xcf, 0xd3, 0xac, 0x00, 0xad, 0xaf, 0xaf, 0xaf, 0x7b, 0x84, 0x8f, 0x97, + 0x00, 0x97, 0x98, 0x97, 0x9d, 0x94, 0x92, 0xaa, 0x9d, 0x00, 0xa4, 0xab, + 0xa7, 0xa1, 0x9e, 0x99, 0x71, 0x77, 0x00, 0x99, 0x81, 0x7f, 0x81, 0x7f, + 0x84, 0x84, 0x7b, 0x00, 0x8b, 0x8f, 0x8e, 0x8c, 0x82, 0x82, 0x7f, 0x79, + 0x00, 0x60, 0x56, 0x56, 0x53, 0x50, 0x4f, 0x49, 0x44, 0x00, 0x44, 0x39, + 0x35, 0x31, 0x26, 0x35, 0x3b, 0x13, 0x1f, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xa7, 0x5f, 0x17, 0xc0, 0x07, 0x03, 0x44, 0x72, 0xb3, 0xb6, 0xb6, 0xc0, + 0x00, 0xc2, 0xc5, 0xc9, 0xc8, 0xc9, 0xd8, 0xd0, 0xd5, 0x00, 0xd0, 0xd0, + 0xd1, 0xc9, 0xac, 0xaf, 0xad, 0xaf, 0x00, 0xaf, 0x8d, 0x85, 0x94, 0x98, + 0x99, 0x9a, 0x97, 0x00, 0x94, 0x94, 0x94, 0x92, 0x92, 0x92, 0xa7, 0xa1, + 0x00, 0x9e, 0x9d, 0x9d, 0x88, 0x96, 0x92, 0x8f, 0x8c, 0x02, 0x88, 0x84, + 0x82, 0x7f, 0x79, 0x8e, 0xc1, 0x82, 0x00, 0x7b, 0x77, 0x73, 0x56, 0x56, + 0x54, 0x54, 0x50, 0x00, 0x4b, 0x49, 0x40, 0x39, 0x35, 0x31, 0x2e, 0x3b, + 0x07, 0x3b, 0x13, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0xf0, 0x5f, 0x17, + 0x07, 0x05, 0x40, 0x73, 0xaf, 0xb9, 0x00, 0xb9, 0xc2, 0xc5, 0xcd, 0xc0, + 0x96, 0xb5, 0xdc, 0x00, 0xd4, 0xd0, 0xd0, 0xd1, 0xd9, 0xcb, 0xaf, 0xac, + 0x00, 0xad, 0xac, 0x9a, 0x87, 0x91, 0x97, 0xb1, 0xaf, 0x00, 0x99, 0x9a, + 0x92, 0x8f, 0x8e, 0x8f, 0x8c, 0x92, 0x00, 0x9d, 0x9d, 0x99, 0x97, 0x94, + 0x93, 0x8f, 0x79, 0x00, 0x84, 0x88, 0x83, 0x7f, 0x7b, 0x7b, 0x8f, 0x8c, + 0x00, 0x88, 0x84, 0x7e, 0x79, 0x77, 0x60, 0x56, 0x56, 0x00, 0x51, 0x4d, + 0x5e, 0x45, 0x3f, 0x39, 0x35, 0x32, 0x01, 0x2f, 0x47, 0x39, 0x11, 0x00, + 0x00, 0x00, 0xe9, 0xfc, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x39, 0x73, + 0x00, 0xaf, 0xc0, 0xc0, 0xc5, 0xc9, 0xcf, 0xc9, 0xb3, 0x00, 0xd7, 0xd3, + 0xd8, 0xd5, 0xd3, 0xcd, 0xd0, 0xcf, 0x00, 0xb5, 0xb5, 0xb5, 0xb9, 0x84, + 0x92, 0xad, 0xad, 0x00, 0xb3, 0x97, 0xac, 0xab, 0x97, 0x8c, 0x89, 0x88, + 0x00, 0x88, 0x84, 0x8f, 0x94, 0x94, 0x8c, 0x7b, 0x73, 0x00, 0x71, 0x6e, + 0x6e, 0x82, 0x7c, 0x79, 0x82, 0x8c, 0x00, 0x78, 0x68, 0x60, 0x5f, 0x6b, + 0x5d, 0x56, 0x50, 0x00, 0x52, 0x5d, 0x63, 0x5e, 0x3b, 0x39, 0x35, 0x40, + 0x01, 0x4a, 0x47, 0x35, 0x0d, 0x00, 0x00, 0x00, 0xe9, 0xfc, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0x07, 0x00, 0x00, 0x00, 0x28, 0x7f, 0x9a, 0xc9, 0xc0, + 0xc8, 0xcd, 0xcf, 0x00, 0xd4, 0xd4, 0xd7, 0xd8, 0xd8, 0xd5, 0xd4, 0xd0, + 0x00, 0xd0, 0xd9, 0xdb, 0xd9, 0xd9, 0xbc, 0xa5, 0xac, 0x00, 0xaf, 0xad, + 0xac, 0xab, 0xaa, 0xa7, 0xa7, 0x94, 0x00, 0x82, 0x82, 0x82, 0x7c, 0x79, + 0x77, 0x77, 0x76, 0x00, 0x71, 0x6e, 0x6e, 0x68, 0x6e, 0x7b, 0x79, 0x8b, + 0x00, 0x6a, 0x60, 0x5e, 0x5d, 0x5c, 0x5a, 0x60, 0x64, 0x00, 0x63, 0x65, + 0x61, 0x5d, 0x5d, 0x35, 0x30, 0x50, 0x01, 0x4a, 0x47, 0x32, 0x03, 0x00, + 0x00, 0x00, 0xe9, 0xfe, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x02, 0x02, + 0x00, 0x84, 0x88, 0xc5, 0xc4, 0xc5, 0xd0, 0xd0, 0xd9, 0x00, 0xd5, 0xd9, + 0xd9, 0xd4, 0xd9, 0xd8, 0xd7, 0xd6, 0x00, 0xd6, 0xd7, 0xd5, 0xd7, 0xb5, + 0xa7, 0xab, 0xab, 0x00, 0xab, 0xa7, 0xa4, 0xa1, 0x9e, 0x9a, 0x96, 0x85, + 0x00, 0x7f, 0x8e, 0x93, 0x81, 0x76, 0x72, 0x71, 0x6e, 0x00, 0x6a, 0x65, + 0x68, 0x7b, 0x8b, 0x88, 0x84, 0x7f, 0x00, 0x6a, 0x6a, 0x6e, 0x73, 0x6e, + 0x68, 0x64, 0x63, 0x00, 0x60, 0x54, 0x39, 0x30, 0x3b, 0x4a, 0x44, 0x22, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xf0, 0x17, 0x07, + 0x07, 0x04, 0x02, 0x40, 0x7f, 0xb6, 0x00, 0xcd, 0xc5, 0xd0, 0xd5, 0xd5, + 0xd8, 0xd3, 0xd8, 0x00, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd8, 0xd4, 0xd0, + 0x00, 0xcd, 0xb2, 0xa7, 0xa7, 0xa4, 0xa1, 0xa1, 0x9a, 0x00, 0x9a, 0x99, + 0x97, 0x91, 0x92, 0x92, 0x92, 0x8e, 0x00, 0x73, 0x71, 0x79, 0x73, 0x71, + 0x6b, 0x73, 0x8b, 0x00, 0x8b, 0x83, 0x82, 0x7b, 0x7b, 0x77, 0x72, 0x6e, + 0x00, 0x6a, 0x65, 0x64, 0x5e, 0x5e, 0x44, 0x30, 0x30, 0x01, 0x51, 0x39, + 0x11, 0x01, 0x00, 0x00, 0x00, 0xe9, 0xfe, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x07, 0x07, 0x0f, 0x00, 0x8c, 0x94, 0xc9, 0xcd, 0xcd, 0xd0, 0xd5, 0xd4, + 0x00, 0xd6, 0xd5, 0xd9, 0xd9, 0xd9, 0xd3, 0xd0, 0xcf, 0x00, 0xcf, 0xcc, + 0xc9, 0xb3, 0xa4, 0xa4, 0xa1, 0x9c, 0x00, 0x97, 0x97, 0x94, 0x92, 0x8f, + 0x8c, 0x8c, 0x88, 0x00, 0x82, 0x81, 0x79, 0x81, 0x7b, 0x7b, 0x7e, 0x88, + 0x00, 0x85, 0x84, 0x82, 0x7e, 0x7b, 0x77, 0x71, 0x6d, 0x00, 0x68, 0x65, + 0x64, 0x5e, 0x5d, 0x5a, 0x50, 0x4d, 0x03, 0x4c, 0x27, 0x08, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xfe, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x01, 0x02, + 0x00, 0x40, 0x84, 0xab, 0xd4, 0xc9, 0xcc, 0xd3, 0xd8, 0x00, 0xd5, 0xd7, + 0xd9, 0xd0, 0xd3, 0xd4, 0xd0, 0xd4, 0x00, 0xcd, 0xc8, 0xc8, 0xc2, 0xb2, + 0xa7, 0xa4, 0x9d, 0x00, 0x99, 0x90, 0x8a, 0x88, 0x83, 0x81, 0x7f, 0x7b, + 0x00, 0x79, 0x79, 0x77, 0x77, 0x7f, 0x89, 0x85, 0x84, 0x00, 0x82, 0x7b, + 0x77, 0x75, 0x71, 0x6b, 0x6d, 0x65, 0x00, 0x63, 0x61, 0x5d, 0x58, 0x53, + 0x53, 0x3b, 0x11, 0x0f, 0x01, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, + 0xf8, 0x17, 0x07, 0x07, 0x07, 0x04, 0x0a, 0x88, 0x8c, 0x00, 0xb6, 0xd5, + 0xc8, 0xc8, 0xcf, 0xd0, 0xd5, 0xd1, 0x00, 0xd5, 0xd5, 0xd5, 0xd9, 0xdb, + 0xd5, 0xd5, 0xd7, 0x00, 0xd4, 0xc9, 0xb6, 0xac, 0xa1, 0x99, 0x8f, 0x84, + 0x00, 0x7f, 0x79, 0x77, 0x71, 0x72, 0x77, 0x7b, 0x83, 0x00, 0x7f, 0x82, + 0x81, 0x82, 0x7e, 0x79, 0x77, 0x73, 0x00, 0x6e, 0x6a, 0x65, 0x64, 0x60, + 0x5c, 0x56, 0x58, 0x03, 0x44, 0x17, 0x02, 0x00, 0x00, 0x00, 0xe9, 0xd4, + 0xfe, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x0f, 0x8c, + 0x8c, 0xb3, 0xd4, 0xc5, 0xc4, 0xcd, 0x00, 0xc9, 0xd0, 0xcd, 0xcf, 0xcd, + 0xd5, 0xd9, 0xd5, 0x00, 0xd4, 0xcf, 0xd0, 0xcd, 0xc5, 0xbc, 0xb5, 0xab, + 0x00, 0x9e, 0x94, 0x8c, 0x81, 0x7f, 0x7b, 0x81, 0x7f, 0x00, 0x81, 0x7f, + 0x7c, 0x7f, 0x7f, 0x7b, 0x73, 0x71, 0x00, 0x6e, 0x6e, 0x67, 0x63, 0x5d, + 0x5a, 0x5a, 0x4a, 0x07, 0x26, 0x04, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, + 0xfe, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x03, 0x0f, 0x00, 0x7f, 0x92, + 0xac, 0xc5, 0xcc, 0xc1, 0xc0, 0xc2, 0x00, 0xc2, 0xc2, 0xc2, 0xc9, 0xcd, + 0xd0, 0xcd, 0xc9, 0x00, 0xc8, 0xc2, 0xbc, 0xb9, 0xb6, 0xb2, 0xac, 0xa0, + 0x00, 0x96, 0x88, 0x7f, 0x7f, 0x7d, 0x7b, 0x7f, 0x7b, 0x00, 0x7e, 0x7b, + 0x79, 0x74, 0x6e, 0x68, 0x63, 0x5e, 0x00, 0x5e, 0x5a, 0x4a, 0x17, 0x02, + 0x00, 0x00, 0x00, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0xc0, 0x07, 0x07, 0x03, 0x35, 0x92, 0x92, 0xaf, 0xc2, 0x00, 0xc0, 0xb6, + 0xb5, 0xb6, 0xb8, 0xbc, 0xc2, 0xc5, 0x00, 0xc5, 0xc0, 0xb6, 0xac, 0xa7, + 0xa1, 0x9c, 0x9a, 0x00, 0x9a, 0x9a, 0x92, 0x8b, 0x82, 0x7c, 0x7b, 0x7e, + 0x00, 0x7f, 0x78, 0x71, 0x6b, 0x65, 0x64, 0x63, 0x60, 0x01, 0x50, 0x44, + 0x12, 0x02, 0x00, 0x00, 0x00, 0xe9, 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x07, 0x07, 0x07, 0xc0, 0x07, 0x03, 0x14, 0x35, 0x8f, 0x92, 0xa0, 0xaf, + 0x00, 0xb6, 0xaf, 0xac, 0xac, 0xaf, 0xb2, 0xaf, 0xa4, 0x00, 0x99, 0x92, + 0x8c, 0x84, 0x84, 0x84, 0x84, 0x84, 0x00, 0x82, 0x7b, 0x77, 0x73, 0x71, + 0x6e, 0x6b, 0x6b, 0x00, 0x6b, 0x60, 0x54, 0x4d, 0x17, 0x06, 0x00, 0x00, + 0x7f, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x07, 0x00, 0x00, 0x11, 0x11, 0x00, 0x7f, 0x7f, 0x88, 0x94, 0xa1, + 0xa4, 0xa7, 0xa4, 0x00, 0x99, 0x94, 0x8f, 0x83, 0x7f, 0x79, 0x79, 0x78, + 0x00, 0x77, 0x79, 0x78, 0x7b, 0x76, 0x6b, 0x64, 0x5c, 0x01, 0x5a, 0x47, + 0x06, 0x06, 0x00, 0x00, 0x00, 0xe9, 0xff, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x07, 0x07, 0x07, 0xe0, 0x07, 0x07, 0x06, 0x02, 0x0d, 0x11, 0x24, 0x6a, + 0x00, 0x77, 0x79, 0x73, 0x71, 0x72, 0x71, 0x6e, 0x6d, 0x00, 0x68, 0x65, + 0x63, 0x63, 0x5f, 0x5a, 0x4a, 0x1b, 0x3f, 0x08, 0x06, 0x07, 0xbf, 0x77, + 0x2f, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x02, 0x05, + 0x00, 0x07, 0x09, 0x0d, 0x0d, 0x0d, 0x0a, 0x08, 0x06, 0x7f, 0x02, 0x07, + 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x07, 0x00, +}; + +//***************************************************************************** +// +// Right Arrow Image +// +//***************************************************************************** +const uint8_t g_pui8RightImage[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 10, 0, + 39, 0, + + 0x7f, 0xc0, 0x7f, 0xc0, 0x3f, 0xc0, 0x3f, 0xc0, 0x1f, 0xc0, 0x1f, 0xc0, + 0x0f, 0xc0, 0x0f, 0xc0, 0x07, 0xc0, 0x07, 0xc0, 0x03, 0xc0, 0x03, 0xc0, + 0x81, 0xc0, 0x81, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0x40, 0xe0, 0x40, + 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xe0, 0x40, 0xe0, 0x40, 0xc0, 0xc0, + 0xc0, 0xc0, 0x81, 0xc0, 0x81, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x07, 0xc0, + 0x07, 0xc0, 0x0f, 0xc0, 0x0f, 0xc0, 0x1f, 0xc0, 0x1f, 0xc0, 0x3f, 0xc0, + 0x3f, 0xc0, 0x7f, 0xc0, 0x7f, 0xc0, +}; + +//***************************************************************************** +// +// Left Arrow Image +// +//***************************************************************************** +const uint8_t g_pui8LeftImage[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 10, 0, + 39, 0, + + 0xff, 0x80, 0xff, 0x80, 0xff, 0x00, 0xff, 0x00, 0xfe, 0x00, 0xfe, 0x00, + 0xfc, 0x00, 0xfc, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf0, 0x00, 0xf0, 0x00, + 0xe0, 0x40, 0xe0, 0x40, 0xc0, 0xc0, 0xc0, 0xc0, 0x81, 0xc0, 0x81, 0xc0, + 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x81, 0xc0, 0x81, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xe0, 0x40, 0xe0, 0x40, 0xf0, 0x00, 0xf0, 0x00, 0xf8, 0x00, + 0xf8, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xff, 0x00, + 0xff, 0x00, 0xff, 0x80, 0xff, 0x80, +}; + +//***************************************************************************** +// +// Up Tab Image +// +//***************************************************************************** +const uint8_t g_pui8UpTabImage[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 32, 0, + 10, 0, + + 0xff, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x0f, + 0xc0, 0x00, 0x00, 0x03, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +//***************************************************************************** +// +// Down Tab Image +// +//***************************************************************************** +const uint8_t g_pui8DownTabImage[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 32, 0, + 10, 0, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, + 0xc0, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x3f, + 0xff, 0x00, 0x00, 0xff, +}; + +//***************************************************************************** +// +// Texas Instrument Logo Image +// +//***************************************************************************** +uint8_t g_pui8TIImagePalette[16 * 3]; +uint8_t g_pui8TIImage[] = +{ + IMAGE_FMT_4BPP_COMP, + 64, 1, + 78, 0, + + 15, + 0x00, 0x00, 0x00, + 0x09, 0x09, 0x09, + 0x24, 0x24, 0x24, + 0x1b, 0x13, 0xec, + 0x55, 0x55, 0x55, + 0x24, 0x1c, 0xed, + 0x26, 0x1e, 0xed, + 0x3f, 0x38, 0xef, + 0x7b, 0x7b, 0x7b, + 0x87, 0x84, 0xca, + 0xa8, 0xa7, 0xc8, + 0xd5, 0xd5, 0xd5, + 0xe1, 0xe0, 0xfb, + 0xfb, 0xfb, 0xfd, + 0xfb, 0xfb, 0xff, + 0xff, 0xff, 0xff, + + 0x1f, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x05, 0xfc, 0x13, 0xcc, 0xcc, 0xcc, 0xe9, 0xcc, 0xcd, 0x07, 0x07, + 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x05, 0xf7, 0x13, 0x66, 0x66, 0x66, 0xe9, 0x66, + 0x7a, 0x07, 0x07, 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0xf7, 0x0b, 0x35, 0x55, + 0x55, 0x55, 0xe9, 0x6a, 0x07, 0x07, 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0xf7, + 0x13, 0x55, 0x55, 0x55, 0xe9, 0x55, 0x6a, 0x07, 0x07, 0xff, 0x77, 0x2f, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x05, 0xf7, 0x12, 0x55, 0x55, 0x55, 0xe9, 0x55, 0x6a, 0x02, 0xaa, + 0x1f, 0xaa, 0xa9, 0xaf, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe1, 0x07, 0x07, 0x06, 0xf7, 0x55, + 0x55, 0x55, 0xe9, 0x20, 0x55, 0x6a, 0x01, 0xfc, 0x65, 0x55, 0x53, 0x7f, + 0xff, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x09, 0xf7, 0x55, 0x55, 0x55, 0xe9, + 0x55, 0x6a, 0x01, 0x07, 0xfa, 0x65, 0x55, 0x55, 0x9f, 0x07, 0xbf, 0x77, + 0xff, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf8, 0x07, 0x07, + 0x07, 0x07, 0x06, 0xf7, 0x55, 0x55, 0x48, 0x55, 0xe9, 0x55, 0x6a, 0x01, + 0xf9, 0x55, 0x55, 0x3f, 0x56, 0xbf, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xc2, 0x07, 0x06, + 0xf7, 0x55, 0x55, 0x55, 0xe9, 0x55, 0x43, 0x6a, 0xa2, 0x35, 0x55, 0x57, + 0xcf, 0x07, 0xbf, 0xff, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0xf7, 0x55, 0x24, 0x55, 0x55, + 0xe9, 0x55, 0x6a, 0x01, 0xd7, 0x35, 0x1f, 0x55, 0x37, 0xef, 0x07, 0xbf, + 0x77, 0x2f, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xe1, 0x07, 0x07, 0x06, 0xf7, 0x55, 0x55, 0x55, 0xe9, 0x21, 0x55, 0x6a, + 0x01, 0xc7, 0x35, 0x55, 0x57, 0x07, 0xff, 0xbf, 0x77, 0x2f, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf7, + 0x12, 0x55, 0x55, 0x55, 0xe9, 0x55, 0x6a, 0x01, 0xed, 0x1f, 0xdd, 0xdd, + 0xdd, 0x07, 0xbf, 0x77, 0x2f, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xe1, 0x07, 0x07, 0x07, 0xf7, 0x55, 0x55, 0x55, 0xe9, + 0x3f, 0x55, 0x6b, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe1, 0x07, 0x07, 0x05, 0xf7, 0x55, + 0x55, 0x55, 0xe9, 0x00, 0x55, 0x69, 0xaa, 0xac, 0xff, 0xb9, 0xaa, 0xaa, + 0x01, 0x9e, 0xfc, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0x99, 0x03, 0xff, 0xff, + 0xb8, 0x88, 0x88, 0x88, 0xe9, 0xd2, 0x7f, 0x8a, 0x89, 0x71, 0xd4, 0xa7, + 0x5f, 0x17, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x04, 0xff, 0xf7, 0x55, 0x55, 0x55, 0xe9, 0x55, 0x53, 0x00, 0x33, 0x39, + 0xfd, 0x73, 0x33, 0x33, 0x6d, 0xf9, 0x10, 0x33, 0x33, 0x33, 0xe9, 0x3a, + 0xff, 0xff, 0xfd, 0x0c, 0x40, 0x00, 0x00, 0x00, 0xe9, 0xd3, 0xbf, 0xff, + 0x3f, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0c, 0xf7, 0x55, 0x55, 0x55, 0xe9, + 0xd1, 0x5b, 0xfc, 0x02, 0x73, 0x55, 0x53, 0x9f, 0xe9, 0x35, 0x7b, 0x6a, + 0x01, 0xff, 0xff, 0xfb, 0x10, 0x00, 0x00, 0x00, 0xe9, 0x87, 0xd3, 0x8f, + 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0xff, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xe1, 0x07, 0x07, 0x07, 0xf7, 0x55, 0x55, 0x55, 0xe9, + 0x80, 0xd1, 0x5d, 0xfb, 0x65, 0x55, 0x53, 0x9f, 0xc7, 0x40, 0x35, 0x7b, + 0x6a, 0xff, 0xff, 0xfa, 0x00, 0x11, 0x00, 0x22, 0x22, 0x20, 0x00, 0x00, + 0x01, 0x22, 0x22, 0x03, 0x21, 0x00, 0x4d, 0xff, 0xff, 0xff, 0xe9, 0xd4, + 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x07, 0xf7, 0x55, 0x55, 0x55, 0xc0, 0xe9, 0xd1, 0x7d, 0xfa, 0x35, + 0x55, 0x53, 0xbf, 0x40, 0xc6, 0x84, 0x6a, 0xff, 0xff, 0xf4, 0x14, 0xab, + 0x00, 0xff, 0xff, 0xd4, 0x00, 0x00, 0x2b, 0xff, 0xff, 0x03, 0xdb, 0x82, + 0x1b, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xff, 0xa7, 0x5f, 0x17, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x07, 0xf7, 0x55, 0x55, 0x55, + 0x80, 0xe9, 0x55, 0x55, 0x53, 0x9e, 0xf9, 0x35, 0x55, 0x10, 0x55, 0xcf, + 0xb3, 0x84, 0x6a, 0xff, 0xff, 0xb1, 0x42, 0x8f, 0x01, 0xfa, 0x00, 0x00, + 0x2f, 0xc9, 0xfb, 0x7f, 0x28, 0xa1, 0x89, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0xf7, 0x55, + 0x55, 0x55, 0xe9, 0x55, 0x55, 0x53, 0x01, 0xaf, 0xd7, 0x35, 0x55, 0x37, + 0xcf, 0x93, 0x84, 0x08, 0x6a, 0xff, 0xff, 0xca, 0x02, 0xfa, 0x00, 0x00, + 0x5f, 0x2f, 0xc2, 0xcb, 0x9a, 0x7a, 0xc6, 0x87, 0x3d, 0x3f, 0xfd, 0xbd, + 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x03, 0xf7, + 0x55, 0x55, 0x55, 0x80, 0xe9, 0x55, 0x55, 0x53, 0xcf, 0xc7, 0x35, 0x55, + 0x14, 0x39, 0xee, 0x93, 0x84, 0x6a, 0x05, 0xfa, 0x00, 0x00, 0x00, 0x2f, + 0xff, 0xff, 0xa4, 0x44, 0x88, 0x44, 0x01, 0x44, 0x44, 0x44, 0x44, 0x4a, + 0xfc, 0x84, 0xc2, 0x60, 0xaf, 0x79, 0xd2, 0xff, 0xfd, 0x84, 0x44, 0x4a, + 0x10, 0xff, 0xff, 0xff, 0xe9, 0xb8, 0x22, 0x22, 0x28, 0x3f, 0xbc, 0x8b, + 0xa4, 0x74, 0xa7, 0x5f, 0x17, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x06, 0xf7, + 0x55, 0x55, 0x55, 0x80, 0xe9, 0x56, 0x66, 0x67, 0xcf, 0xc3, 0x55, 0x55, + 0x05, 0x39, 0xfd, 0x76, 0x66, 0x65, 0x72, 0x6a, 0x05, 0x00, 0xfa, 0x00, + 0x00, 0x2f, 0xff, 0xff, 0xa2, 0x00, 0x21, 0x00, 0x00, 0xe9, 0x00, 0x02, + 0xdd, 0x81, 0xb1, 0x08, 0x14, 0xbf, 0xff, 0xb4, 0xd3, 0xff, 0xfb, 0x20, + 0x00, 0x00, 0x02, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x4f, 0x10, 0x01, + 0x12, 0x08, 0xaa, 0x8a, 0xc6, 0x87, 0xfe, 0x3f, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x02, 0xf7, 0x10, 0x55, 0x55, 0x55, 0xe9, 0x39, 0xaa, 0xab, 0xdf, + 0x00, 0xa3, 0x55, 0x55, 0x3a, 0xfd, 0xaa, 0xaa, 0x95, 0xa0, 0x72, 0x6b, + 0x05, 0xfa, 0x00, 0x00, 0x2f, 0xff, 0x00, 0xff, 0xfd, 0x20, 0x00, 0x00, + 0x12, 0x22, 0x21, 0x0c, 0x00, 0x00, 0xaf, 0xfb, 0xb1, 0x79, 0xfb, 0x20, + 0x2c, 0x02, 0xaf, 0x14, 0x00, 0xc2, 0x51, 0x01, 0x22, 0x0f, 0x10, 0x00, + 0x04, 0xdf, 0x61, 0x49, 0xd4, 0xa7, 0xfe, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0x07, 0x05, 0xf7, 0x00, 0x55, 0x55, 0x55, 0x55, 0x55, 0x53, 0x7c, 0xff, + 0x12, 0xff, 0xfe, 0x93, 0xcb, 0xff, 0x93, 0x72, 0x6a, 0x84, 0x05, 0xfa, + 0x00, 0x00, 0x2f, 0x61, 0x40, 0x00, 0x00, 0x04, 0xab, 0xbb, 0xba, 0x88, + 0x10, 0x4f, 0xff, 0x00, 0xb2, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xf8, 0x10, + 0x80, 0xd9, 0xff, 0xff, 0xd2, 0x00, 0x00, 0x00, 0x8d, 0x80, 0x09, 0xd4, + 0x00, 0x02, 0x8a, 0xbb, 0xa8, 0x20, 0x3f, 0x02, 0xbf, 0x5a, 0x3a, 0xc6, + 0x87, 0x3f, 0x07, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x01, 0xf7, 0x55, 0x55, + 0x00, 0x55, 0x55, 0x55, 0x53, 0x7d, 0xff, 0xff, 0xfd, 0x0a, 0x73, 0x55, + 0x53, 0x7c, 0x01, 0x75, 0x72, 0x39, 0x84, 0x05, 0xfa, 0x00, 0x00, 0x2f, + 0x61, 0x80, 0x00, 0x48, 0x0a, 0x7a, 0xb2, 0x1b, 0x7a, 0x04, 0xdf, 0xff, + 0x10, 0xb2, 0x00, 0xaf, 0x02, 0xb0, 0x01, 0x10, 0x00, 0x53, 0x1b, 0x09, + 0xb1, 0xd3, 0xb8, 0x10, 0x5b, 0x3a, 0xff, 0xc6, 0x87, 0x3f, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x80, 0x01, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x55, 0x53, + 0x00, 0x9f, 0xff, 0xff, 0xfc, 0x65, 0x55, 0x53, 0x9e, 0x09, 0xff, 0xff, + 0xfe, 0x75, 0x72, 0x37, 0xef, 0x04, 0x08, 0xfa, 0x00, 0x00, 0x2f, 0xb1, + 0x80, 0x00, 0x0b, 0x90, 0x82, 0xfc, 0x4b, 0xaa, 0x00, 0xaf, 0xfd, 0x40, + 0x20, 0x04, 0xdf, 0x02, 0x40, 0x08, 0x20, 0x00, 0x0a, 0x89, 0x09, 0xa0, + 0x00, 0x2f, 0x0a, 0xa2, 0x4d, 0x5a, 0xff, 0x3a, 0xc6, 0x87, 0x3f, 0x07, + 0x07, 0x07, 0x07, 0x03, 0xff, 0xff, 0xfd, 0xcc, 0xcc, 0xcc, 0xe9, 0xd1, + 0x00, 0xc7, 0x55, 0x55, 0x55, 0x55, 0x55, 0x53, 0xaf, 0x01, 0xff, 0xff, + 0xfc, 0x35, 0x55, 0x53, 0x9f, 0xc9, 0x41, 0x65, 0x72, 0x36, 0xbf, 0xff, + 0xff, 0xff, 0xe9, 0x08, 0xfa, 0x00, 0x00, 0x2f, 0xb1, 0x80, 0x00, 0x0a, + 0x80, 0x83, 0xdd, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x2b, 0x10, 0xf8, 0x00, + 0x2b, 0x0a, 0xfc, 0x20, 0x1b, 0x80, 0x00, 0x00, 0x04, 0xdf, 0xff, 0xff, + 0xa0, 0x00, 0x2c, 0x9f, 0x0a, 0xfb, 0xad, 0x52, 0x32, 0xc6, 0x87, 0x3f, + 0xf0, 0x07, 0x07, 0x07, 0x07, 0xff, 0xff, 0xfc, 0x33, 0x30, 0x33, 0x33, + 0xe9, 0xd1, 0x35, 0x55, 0x55, 0x55, 0x00, 0x55, 0x55, 0x56, 0xcf, 0xff, + 0xff, 0xfa, 0x35, 0x14, 0x55, 0x56, 0xaf, 0xc9, 0x65, 0x72, 0x53, 0x7d, + 0x10, 0xff, 0xff, 0xff, 0xe9, 0xfa, 0x00, 0x00, 0x2f, 0x89, 0xb1, 0x80, + 0x00, 0x0a, 0x81, 0xfb, 0xbf, 0x72, 0x02, 0x10, 0x00, 0x04, 0xb1, 0x01, + 0xaf, 0x0a, 0xf8, 0x04, 0x00, 0x4d, 0xb0, 0x00, 0x00, 0x59, 0xa0, 0x00, + 0x1f, 0x04, 0xab, 0xdf, 0x72, 0x52, 0xc6, 0x87, 0x3f, 0xf8, 0x07, 0x07, + 0x07, 0x07, 0x04, 0xfd, 0x75, 0x55, 0x30, 0x55, 0x55, 0xe9, 0xd4, 0x55, + 0x55, 0x37, 0xcf, 0x18, 0xff, 0xff, 0xf9, 0xcd, 0x34, 0x39, 0xef, 0xff, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x2f, 0x89, 0xb9, 0x80, + 0x00, 0x0b, 0x89, 0xd2, 0x4f, 0x62, 0x04, 0x80, 0x00, 0x01, 0x20, 0x08, + 0x1b, 0xd2, 0x00, 0x00, 0x8f, 0xf2, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xb1, + 0x03, 0x00, 0x00, 0x02, 0x48, 0xab, 0xdf, 0x5b, 0x33, 0xfe, 0xb7, 0x6f, + 0x27, 0x07, 0x07, 0x07, 0x07, 0xff, 0x06, 0xfe, 0x93, 0x55, 0x55, 0x55, + 0xe9, 0xd4, 0x55, 0x02, 0x55, 0x37, 0xab, 0xbb, 0xcf, 0xf7, 0xc9, 0xdf, + 0x10, 0xcb, 0xbb, 0xc7, 0x34, 0x53, 0x9e, 0xff, 0xff, 0x01, 0xff, 0xff, + 0xff, 0xfa, 0x00, 0x00, 0x2f, 0xb9, 0x00, 0x80, 0x00, 0x04, 0x88, 0x88, + 0x88, 0x40, 0x8f, 0x82, 0x62, 0xd4, 0x00, 0x00, 0x00, 0x2c, 0x1b, 0xb1, + 0x28, 0x02, 0xcf, 0x01, 0x2d, 0x6c, 0x00, 0x02, 0x48, 0x7f, 0xbf, 0x53, + 0x2b, 0xb7, 0x6f, 0x27, 0x07, 0x07, 0xc1, 0x07, 0x07, 0xff, 0xc3, 0x55, + 0x55, 0x55, 0xe9, 0x80, 0xd4, 0x55, 0x55, 0x56, 0x66, 0x67, 0xbf, 0xc6, + 0x01, 0x55, 0x55, 0x37, 0xff, 0x76, 0x66, 0x65, 0x35, 0x00, 0x5d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x21, 0x00, 0x2f, 0xb9, 0x80, 0x00, + 0x00, 0x00, 0xe9, 0x41, 0x8f, 0x62, 0xfb, 0x20, 0x00, 0x01, 0xaf, 0x1b, + 0x01, 0x80, 0x04, 0xff, 0xfb, 0x10, 0x00, 0x1a, 0x6b, 0x9f, 0x02, 0x14, + 0xcf, 0x4b, 0x23, 0xb7, 0x6f, 0x27, 0xf0, 0x07, 0x07, 0x07, 0x07, 0xd9, + 0x35, 0x55, 0x55, 0x70, 0x55, 0xe9, 0xd4, 0xa1, 0x37, 0xcf, 0xc6, 0x55, + 0x08, 0x55, 0x59, 0xfd, 0x73, 0x4f, 0x6d, 0xff, 0xff, 0x01, 0xff, 0xff, + 0xff, 0xfa, 0x00, 0x00, 0x2f, 0xb9, 0x00, 0x80, 0x00, 0x01, 0x11, 0x11, + 0x11, 0x00, 0x8f, 0x84, 0x63, 0x80, 0x00, 0x00, 0x4d, 0x1a, 0xfb, 0x20, + 0x00, 0x1a, 0xff, 0xfd, 0x40, 0x00, 0x04, 0xdf, 0xff, 0x00, 0xff, 0xb4, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x4c, 0x03, 0xdb, 0xb7, 0x6f, + 0x27, 0x07, 0x07, 0xc1, 0x07, 0x07, 0xfc, 0x73, 0x55, 0x55, 0x55, 0xe9, + 0xc0, 0xd4, 0xa1, 0x37, 0xdf, 0xa5, 0x55, 0x55, 0x6a, 0x80, 0x4f, 0x55, + 0x55, 0x6d, 0xff, 0xff, 0xff, 0xff, 0x04, 0xff, 0xfa, 0x00, 0x00, 0x2f, + 0xb9, 0x80, 0x00, 0x02, 0x08, 0xaa, 0xaa, 0xaa, 0x81, 0x4f, 0x62, 0xfb, + 0x0c, 0x10, 0x00, 0x00, 0x1a, 0x24, 0x29, 0xa1, 0x00, 0x20, 0x02, 0xbf, + 0x51, 0xa8, 0x42, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x08, 0xdf, 0x42, 0x22, + 0xc6, 0x87, 0x3f, 0xf8, 0x07, 0x07, 0x07, 0x07, 0x01, 0xc7, 0x35, 0x55, + 0x30, 0x55, 0x55, 0xe9, 0xd4, 0x55, 0x55, 0x39, 0xff, 0x02, 0x93, 0x55, + 0x55, 0x6c, 0xfa, 0x65, 0x57, 0x6d, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x00, 0x00, 0x44, 0x2f, 0xb9, 0x80, 0x00, 0x0b, 0x89, 0xf4, 0x4f, + 0x81, 0x62, 0xc2, 0x01, 0x10, 0x00, 0x02, 0xbf, 0x11, 0x00, 0xd4, 0x00, + 0x4a, 0xaa, 0xaa, 0x82, 0x00, 0x00, 0x40, 0x8f, 0x52, 0xfb, 0xa8, 0x42, + 0x00, 0x00, 0x01, 0x7f, 0xcf, 0xaa, 0x8a, 0xc6, 0x87, 0x3f, 0x07, 0x07, + 0xe0, 0x07, 0x07, 0x01, 0xfc, 0x73, 0x55, 0x55, 0x55, 0xc0, 0xe9, 0xd4, + 0x55, 0x55, 0x59, 0xff, 0x73, 0x55, 0x08, 0x53, 0x7d, 0xf9, 0x35, 0x57, + 0x6d, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x2f, 0xb9, + 0x12, 0x80, 0x00, 0x0a, 0x89, 0xfc, 0xbf, 0x62, 0x80, 0x04, 0x04, 0xb2, + 0x00, 0x00, 0x4d, 0x11, 0xb1, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x52, 0x01, 0xff, 0xff, 0xdb, 0x81, 0x00, 0x00, 0xbf, 0xac, + 0xff, 0x7c, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, 0x06, 0x06, 0xc7, 0x35, + 0x55, 0x55, 0x55, 0xe9, 0xd4, 0x55, 0x01, 0x6a, 0xfc, 0x73, 0x55, 0x55, + 0x7f, 0xf9, 0x5f, 0x00, 0x55, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x11, 0x00, 0x00, 0x2f, 0xb9, 0x80, 0x00, 0x0a, 0x8b, 0x81, 0x72, 0x10, + 0x1b, 0xf8, 0x00, 0x00, 0x08, 0x5b, 0x21, 0x00, 0x00, 0xe9, 0x00, 0x1a, + 0xfd, 0x8b, 0x1b, 0xbf, 0x49, 0xaf, 0xbb, 0x93, 0xb7, 0x6f, 0x27, 0x07, + 0xe0, 0x07, 0x07, 0x07, 0xff, 0xfd, 0x93, 0x55, 0x55, 0x60, 0x55, 0xe9, + 0xd4, 0x55, 0x6c, 0xfc, 0x63, 0x55, 0x08, 0x55, 0x9f, 0xc7, 0x35, 0x5f, + 0x6d, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x2f, 0xb9, + 0x10, 0x80, 0x00, 0x0a, 0x8b, 0xfb, 0xcf, 0xff, 0xb2, 0x00, 0x00, 0x8f, + 0xff, 0x40, 0x00, 0x01, 0xbf, 0xff, 0x00, 0xfc, 0x20, 0x08, 0x88, 0x88, + 0x88, 0x88, 0x20, 0x04, 0x00, 0x08, 0xfd, 0x42, 0xbf, 0x1b, 0x00, 0x00, + 0x7f, 0xaf, 0xc2, 0xa2, 0xc6, 0x87, 0x3f, 0x07, 0x07, 0xe0, 0x07, 0x07, + 0x03, 0xc7, 0x35, 0x55, 0x55, 0x55, 0xca, 0xe9, 0xd4, 0x7e, 0xfa, 0x91, + 0xaf, 0x67, 0x55, 0x00, 0x55, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x11, 0x00, 0x00, 0x2f, 0xb9, 0x80, 0x00, 0x0b, 0x8b, 0x00, 0xb2, 0xaf, + 0xff, 0x40, 0x02, 0xdf, 0xff, 0xb2, 0x14, 0x00, 0x00, 0x2c, 0x29, 0x2c, + 0x62, 0x80, 0x00, 0x08, 0x02, 0xcf, 0x80, 0x2b, 0x12, 0xfa, 0x00, 0x01, + 0x7f, 0xbf, 0x72, 0x52, 0xc6, 0x87, 0x3f, 0x07, 0x07, 0xe0, 0x07, 0x07, + 0x03, 0xfc, 0x73, 0x55, 0x55, 0x55, 0xc0, 0xe9, 0xd4, 0x7f, 0xf9, 0x35, + 0x55, 0x55, 0xcf, 0x40, 0xa3, 0x6f, 0x55, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0x04, 0xff, 0xfa, 0x00, 0x00, 0x2f, 0xb9, 0x80, 0x00, 0x40, 0x0a, 0x8a, + 0xda, 0x22, 0xcf, 0xfa, 0x00, 0x1a, 0x82, 0x53, 0x08, 0xff, 0xf4, 0x00, + 0x8f, 0x62, 0xb1, 0x02, 0x00, 0x00, 0xaf, 0xa0, 0x01, 0x8c, 0x09, 0xb2, + 0x1f, 0x00, 0x04, 0xdf, 0x72, 0x52, 0xc6, 0x87, 0x3f, 0xf8, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x93, 0x55, 0x55, 0x60, 0x55, 0xe9, 0xd4, 0x9f, 0xe7, + 0x35, 0x55, 0x57, 0x40, 0xdf, 0x6f, 0x55, 0x55, 0x6d, 0xff, 0xff, 0xff, + 0x02, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x2d, 0xb9, 0x40, 0x00, 0x00, 0x04, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x08, 0x08, 0xff, 0xb1, 0x00, 0x8d, 0x83, + 0x01, 0xaf, 0xa0, 0x20, 0x01, 0xaf, 0x31, 0xff, 0xf2, 0x00, 0x00, 0x2d, + 0x00, 0xb2, 0x00, 0x02, 0x48, 0xaa, 0xa8, 0x20, 0x00, 0x7f, 0x1a, 0x7a, + 0x5a, 0xc6, 0x87, 0x3f, 0x07, 0x07, 0xe1, 0x07, 0x07, 0x05, 0xc6, 0x55, + 0x55, 0x55, 0xe9, 0x80, 0xd4, 0xbf, 0xc7, 0x35, 0x55, 0x37, 0xef, 0x93, + 0x80, 0x6f, 0x55, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0xc2, 0x00, + 0x00, 0x08, 0xdf, 0xff, 0xfb, 0x20, 0x10, 0x00, 0x00, 0x00, 0xe9, 0x00, + 0x1b, 0xda, 0x20, 0x20, 0x00, 0x8f, 0x49, 0x80, 0x00, 0x00, 0x18, 0x20, + 0x00, 0x00, 0xad, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x00, 0x00, 0x00, 0x08, + 0xd4, 0x00, 0x00, 0x01, 0x11, 0x10, 0x3f, 0x00, 0x01, 0x29, 0x6a, 0xd4, + 0xa7, 0x5f, 0x17, 0xf0, 0x07, 0x07, 0x07, 0x07, 0xff, 0xff, 0xf7, 0x55, + 0x30, 0x55, 0x55, 0xe9, 0xd4, 0xcf, 0xc7, 0x66, 0x66, 0x04, 0x69, 0xff, + 0xa6, 0x66, 0x65, 0x5e, 0x6d, 0xff, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x10, + 0x00, 0x00, 0x00, 0x18, 0x4c, 0xff, 0xa2, 0xd1, 0xb9, 0x00, 0x00, 0x4b, + 0x01, 0x20, 0x00, 0x00, 0x14, 0xdf, 0xff, 0xb4, 0x84, 0x04, 0x28, 0xdf, + 0xff, 0xff, 0xfb, 0x71, 0x00, 0x48, 0x20, 0x04, 0x41, 0x01, 0x01, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x07, + 0xc1, 0x07, 0x01, 0xfa, 0x35, 0x55, 0x55, 0x55, 0xe9, 0x80, 0xd2, 0x57, + 0xdf, 0xcb, 0xab, 0xbb, 0xac, 0xff, 0x10, 0xfc, 0xbb, 0x93, 0x65, 0x33, + 0x5d, 0xff, 0xff, 0x00, 0xff, 0xff, 0xfa, 0x88, 0x88, 0x88, 0x88, 0x8c, + 0x34, 0xff, 0xa8, 0xca, 0xaa, 0xbb, 0x82, 0xdf, 0xff, 0x42, 0xb8, 0x85, + 0xdf, 0xff, 0xff, 0xfb, 0x2a, 0x8a, 0x00, 0x8d, 0xfa, 0x84, 0x42, 0x44, + 0x8b, 0xff, 0xff, 0x7f, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, + 0xe0, 0x07, 0x07, 0x02, 0xfd, 0x75, 0x55, 0x55, 0x55, 0x09, 0x55, 0x53, + 0x33, 0x35, 0xc9, 0x39, 0xef, 0x05, 0x41, 0xa3, 0x62, 0x55, 0x55, 0x33, + 0x79, 0xae, 0x7d, 0xfb, 0x45, 0x97, 0x4f, 0x07, 0x04, 0xdd, 0x07, 0x07, + 0xfe, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x00, 0xa3, 0x55, + 0x55, 0x55, 0x55, 0x69, 0xcb, 0x96, 0xa4, 0xc9, 0x3a, 0x05, 0xfe, 0x93, + 0x62, 0x55, 0x37, 0x3f, 0x9b, 0xcf, 0x7d, 0x45, 0x97, 0x4f, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x80, 0x07, 0xc7, + 0x35, 0x55, 0x55, 0x37, 0xcf, 0xff, 0x05, 0xfc, 0x73, 0x55, 0x55, 0x3c, + 0x05, 0xfd, 0xa1, 0x07, 0x55, 0x53, 0x37, 0xac, 0xef, 0x85, 0x4d, 0x97, + 0xff, 0x4f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, + 0x07, 0x07, 0xff, 0xfc, 0x63, 0x55, 0x21, 0x53, 0x7c, 0x01, 0xb6, 0x35, + 0x55, 0x3c, 0x6e, 0x02, 0x55, 0x55, 0x55, 0x53, 0x37, 0xad, 0x95, 0xff, + 0x03, 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0x96, 0x56, 0xff, 0x87, 0x3f, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0x07, 0x07, 0x07, 0x04, 0xa7, + 0x33, 0x37, 0xcf, 0x84, 0x01, 0xf9, 0x35, 0x55, 0x39, 0x05, 0xfc, 0x35, + 0x08, 0x55, 0x55, 0x37, 0x9d, 0x06, 0xff, 0xd4, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x2b, 0x8f, 0x47, 0x77, 0x2f, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xc4, 0x07, 0x02, 0xfc, 0xa9, 0xac, 0xcb, 0x73, 0x55, + 0x20, 0x56, 0xbf, 0x04, 0xfa, 0x35, 0x55, 0x53, 0x7c, 0x81, 0x07, 0xff, + 0xfd, 0xa1, 0x00, 0x00, 0x04, 0x2d, 0xff, 0x57, 0x8f, 0x47, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x95, 0x55, + 0x10, 0x53, 0x69, 0xcd, 0x03, 0xf9, 0x55, 0x55, 0x59, 0x40, 0xdf, 0x07, + 0xff, 0xff, 0xf8, 0x00, 0x00, 0x2b, 0xff, 0x8f, 0x47, 0x77, 0x2f, 0x07, + 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x02, 0xd7, + 0x00, 0x55, 0x55, 0x33, 0x67, 0x77, 0x79, 0x99, 0x99, 0x06, 0x99, 0x97, + 0x55, 0x55, 0xae, 0x07, 0x01, 0xfa, 0x1f, 0x00, 0x00, 0x2f, 0x87, 0x3f, + 0x77, 0x2f, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xc0, 0x07, 0x02, 0xf9, 0x35, 0x55, 0x55, 0x53, 0x33, 0x16, 0x55, 0x55, + 0x55, 0xc9, 0x6a, 0x07, 0x02, 0xfa, 0x1f, 0x00, 0x00, 0x2f, 0x7f, 0x37, + 0x77, 0x2f, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xc1, 0x07, 0x02, 0xfc, 0x65, 0x55, 0x55, 0x55, 0xe9, 0x98, 0xd1, 0x53, + 0x9f, 0x07, 0x02, 0xfa, 0x00, 0x00, 0x67, 0x2f, 0x7f, 0x35, 0xfd, 0xdd, + 0x77, 0x2f, 0x77, 0xfe, 0x2f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0xdd, + 0x70, 0xdf, 0x07, 0x07, 0x03, 0x93, 0x55, 0x55, 0x55, 0xcc, 0xe9, 0xd1, + 0x39, 0xdf, 0x07, 0x02, 0xfa, 0x00, 0x01, 0x00, 0x2f, 0xff, 0xb8, 0x88, + 0x88, 0x8a, 0x51, 0x00, 0xfd, 0xa8, 0x88, 0x88, 0x8b, 0xff, 0xff, 0xb8, + 0x00, 0x44, 0x44, 0x8a, 0xdb, 0x8c, 0xff, 0xd8, 0x88, 0x23, 0x88, 0x88, + 0xe9, 0x88, 0x88, 0x8f, 0x49, 0xa1, 0x04, 0x8a, 0xab, 0xdf, 0xff, 0xff, + 0xaa, 0x8a, 0xdf, 0x28, 0xff, 0xfd, 0x6a, 0xb8, 0x01, 0x8c, 0xff, 0xff, + 0x0b, 0xff, 0xff, 0xff, 0xd8, 0x01, 0x8d, 0x2a, 0x11, 0x16, 0x88, 0x8a, + 0xff, 0x39, 0x8a, 0x42, 0x71, 0x8b, 0x40, 0xf8, 0x55, 0x88, 0xaf, 0xff, + 0xff, 0xfb, 0x84, 0x07, 0x44, 0x48, 0xaf, 0xb8, 0xdf, 0x2a, 0x0a, 0xc6, + 0x84, 0x82, 0xc6, 0x55, 0x55, 0x55, 0xe9, 0x55, 0x55, 0x30, 0x53, 0x7c, + 0x0f, 0x03, 0xfa, 0x00, 0x00, 0x2f, 0x00, 0xff, 0xb2, 0x00, 0x00, 0x01, + 0xaf, 0xff, 0xff, 0x00, 0xfd, 0x81, 0x00, 0x00, 0x2b, 0xff, 0xb4, 0x20, + 0x80, 0x91, 0x22, 0x0a, 0xff, 0xb1, 0x00, 0x00, 0x00, 0x84, 0xe9, 0x00, + 0x00, 0x1c, 0xa2, 0xb4, 0x02, 0x28, 0x20, 0xbf, 0xff, 0xaa, 0x1a, 0xdf, + 0xff, 0xff, 0xa1, 0x08, 0x00, 0x00, 0x18, 0xb4, 0x01, 0x0a, 0xff, 0xff, + 0x0b, 0xff, 0xff, 0xff, 0xa0, 0x01, 0x8d, 0x2a, 0x11, 0x0a, 0x00, 0x01, + 0xbf, 0xb2, 0xd9, 0xaf, 0x39, 0xa1, 0x08, 0x00, 0x00, 0x1b, 0xb0, 0x55, + 0x00, 0x2b, 0xff, 0x23, 0xfb, 0x42, 0x01, 0x04, 0x20, 0xbf, 0x31, 0x19, + 0xc1, 0xd4, 0xa6, 0xe9, 0x35, 0x55, 0x55, 0x55, 0xe9, 0x18, 0x55, 0x55, + 0x9f, 0x0f, 0x03, 0xfa, 0x00, 0x00, 0x01, 0x2f, 0xff, 0xfc, 0x40, 0x00, + 0x00, 0x2b, 0x41, 0x00, 0xda, 0x20, 0x02, 0xcf, 0xfb, 0x20, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x08, 0xff, 0x80, 0x00, 0x00, 0x46, 0x00, 0xe9, + 0x00, 0x00, 0x1a, 0x0a, 0x9b, 0x2b, 0x40, 0xff, 0xa9, 0x02, 0xbf, 0xff, + 0xff, 0xff, 0xfb, 0x00, 0x20, 0x02, 0xaf, 0xfd, 0x80, 0x00, 0x00, 0x04, + 0x50, 0xdf, 0x99, 0xff, 0x01, 0x1a, 0xdf, 0xfb, 0x20, 0x11, 0x00, 0x00, + 0x00, 0xe9, 0x00, 0x8f, 0xfc, 0x39, 0x43, 0x1a, 0x41, 0xfb, 0x20, 0x02, + 0xbf, 0xa9, 0x4c, 0x03, 0x0a, 0xff, 0xb2, 0x00, 0x00, 0x01, 0x0a, 0x31, + 0xe0, 0x19, 0xd4, 0xa6, 0xfc, 0x63, 0x55, 0x55, 0x55, 0x8c, 0xe9, 0x55, + 0x57, 0xdf, 0x0f, 0x03, 0xfa, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xa0, + 0x00, 0x00, 0x02, 0x00, 0xbf, 0xff, 0xff, 0xfd, 0x40, 0x08, 0xff, 0xd4, + 0x00, 0x00, 0x02, 0x8a, 0xba, 0x82, 0x10, 0x02, 0xfd, 0x00, 0x40, 0x14, + 0x88, 0x82, 0x00, 0x00, 0x48, 0xa8, 0x00, 0x20, 0x04, 0xff, 0x80, 0x00, + 0x01, 0x48, 0x88, 0x00, 0x42, 0x10, 0x00, 0x02, 0xbf, 0xff, 0xa0, 0x00, + 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x02, 0x01, 0xff, 0xff, + 0xb1, 0x00, 0x00, 0x00, 0xbf, 0x91, 0x04, 0xfa, 0x10, 0x00, 0x00, 0x2f, + 0x69, 0x00, 0x02, 0x02, 0x88, 0x88, 0x8a, 0x84, 0x10, 0x4d, 0x3a, 0x02, + 0x80, 0x3a, 0x40, 0x08, 0xfd, 0x40, 0x14, 0x8a, 0x82, 0x04, 0x00, 0x00, + 0x4a, 0xa8, 0x21, 0xa9, 0x00, 0x28, 0x07, 0xab, 0xa8, 0x41, 0x00, 0x2f, + 0x39, 0x21, 0xd4, 0x82, 0xa6, 0xfe, 0x93, 0x55, 0x55, 0x55, 0xe9, 0x55, + 0x60, 0x59, 0x17, 0x04, 0xfa, 0x00, 0x00, 0x2f, 0xff, 0x00, 0xff, 0xa1, + 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0x14, 0xfd, 0x40, 0x1a, 0xa9, 0x2b, + 0x01, 0xa4, 0x00, 0x00, 0xdb, 0x12, 0xaf, 0xff, 0xf4, 0x00, 0x00, 0xbf, + 0x01, 0xff, 0xf8, 0x12, 0xdf, 0x80, 0x00, 0x02, 0x61, 0x00, 0x81, 0x00, + 0x00, 0x8f, 0xff, 0xa0, 0x00, 0x08, 0x88, 0x09, 0xff, 0xff, 0x80, 0x71, + 0xb2, 0x00, 0x00, 0x2b, 0x00, 0x4f, 0x39, 0xf4, 0xc1, 0x2f, 0x69, 0x2c, + 0x08, 0xa2, 0x0b, 0xff, 0xb1, 0x39, 0x2c, 0xff, 0xff, 0x00, 0xfd, 0x40, + 0x08, 0xfb, 0x12, 0xaf, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xfa, + 0x12, 0xcb, 0x00, 0x00, 0x02, 0xbf, 0xff, 0xff, 0xfa, 0x40, 0x1b, 0xff, + 0x38, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0xc6, 0x35, 0x55, 0x2c, 0x55, 0x55, + 0xe9, 0x5a, 0x17, 0x04, 0xfa, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0xfd, 0x40, 0x1a, 0xff, 0x80, + 0x20, 0x00, 0x8f, 0x02, 0x80, 0x88, 0x1b, 0xff, 0xff, 0x08, 0xf4, 0x00, + 0x00, 0xbf, 0x19, 0xaf, 0x80, 0x00, 0x00, 0x02, 0xdf, 0xff, 0xff, 0xd4, + 0x00, 0x00, 0x4d, 0x08, 0xff, 0xa0, 0x00, 0x08, 0x0a, 0xff, 0x80, 0x02, + 0x01, 0xff, 0xff, 0xb2, 0x01, 0x00, 0x00, 0x1b, 0x91, 0xb0, 0xc2, 0x2f, + 0x69, 0x2c, 0xfb, 0x4a, 0xff, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x04, 0xcf, + 0xff, 0xfd, 0x40, 0x00, 0x08, 0xf8, 0x1a, 0xff, 0xff, 0xd4, 0x00, 0x01, + 0x05, 0xbf, 0xff, 0xff, 0xa0, 0xa8, 0x0c, 0xd8, 0xd3, 0xe0, 0xb2, 0xc6, + 0x83, 0xf9, 0x35, 0x55, 0x55, 0x55, 0xb0, 0xe9, 0x6c, 0x17, 0x04, 0xfa, + 0x00, 0x00, 0x2f, 0x00, 0xff, 0xff, 0xa1, 0x01, 0x20, 0x00, 0x00, 0x8f, + 0x00, 0xff, 0xfd, 0x40, 0x1a, 0xff, 0x40, 0x00, 0x4f, 0x80, 0x02, 0xf8, + 0xaa, 0xaf, 0xff, 0xff, 0xf4, 0x00, 0x20, 0x00, 0xbf, 0xa9, 0xaf, 0x80, + 0x00, 0x02, 0xdf, 0x80, 0x69, 0x00, 0x00, 0x2c, 0xff, 0xa0, 0x00, 0x08, + 0x80, 0x0a, 0xff, 0x80, 0x02, 0xff, 0xff, 0xb2, 0x02, 0x41, 0x20, 0x93, + 0x80, 0x04, 0x00, 0x00, 0x2f, 0x69, 0x80, 0x2d, 0xdc, 0xff, 0xb1, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xfd, 0x40, 0x08, 0xfa, 0xaf, 0xff, + 0x00, 0xff, 0xd4, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xd8, 0x5c, 0xb4, 0x0d, + 0xaa, 0xd3, 0xab, 0xb7, 0xff, 0xff, 0x05, 0xfc, 0x73, 0x55, 0x55, 0x55, + 0xe9, 0x6d, 0x17, 0x80, 0x04, 0xfa, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xa1, + 0x00, 0x02, 0xb1, 0x00, 0x00, 0x08, 0xff, 0xfd, 0x40, 0x02, 0x1a, 0xff, + 0x80, 0x00, 0x18, 0xdd, 0x06, 0xf4, 0x10, 0x00, 0x00, 0xbf, 0xa1, 0xdf, + 0x80, 0x00, 0x02, 0x00, 0xdf, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x4c, 0xff, + 0x10, 0xa0, 0x00, 0x08, 0x13, 0x80, 0x02, 0xff, 0xff, 0x00, 0xb2, 0x02, + 0xa0, 0x00, 0x02, 0xcf, 0xff, 0xfc, 0x06, 0x20, 0x1b, 0x00, 0x00, 0x2f, + 0x69, 0x2b, 0xfd, 0x01, 0xdf, 0xff, 0xff, 0xb1, 0x01, 0xb2, 0x00, 0x99, + 0x08, 0xfd, 0x40, 0x08, 0xfd, 0x71, 0xd4, 0x00, 0x01, 0x57, 0xbf, 0xcc, + 0x8c, 0x21, 0xff, 0x6a, 0x51, 0xd4, 0x82, 0xa7, 0xff, 0xb5, 0x55, 0x55, + 0x55, 0xe9, 0x6d, 0xc0, 0x17, 0x04, 0xfa, 0x00, 0x00, 0x2f, 0xff, 0xff, + 0x00, 0xa1, 0x01, 0xfa, 0x10, 0x00, 0x00, 0xaf, 0xfd, 0x00, 0x40, 0x1a, + 0xff, 0x80, 0x00, 0x00, 0x14, 0x8b, 0x42, 0xbc, 0x04, 0xf4, 0x00, 0x00, + 0xbf, 0xb2, 0x80, 0x00, 0x00, 0x02, 0xdf, 0xff, 0xff, 0xd4, 0x00, 0x00, + 0x04, 0x8f, 0xff, 0xa0, 0x00, 0x08, 0x23, 0x80, 0x02, 0x04, 0xff, 0xff, + 0xb2, 0x02, 0xc2, 0x6a, 0xfa, 0x00, 0x0c, 0x4c, 0x00, 0x00, 0x2f, 0x69, + 0x2b, 0xf4, 0x4f, 0x00, 0xff, 0xff, 0xb1, 0x01, 0xfb, 0x10, 0x00, 0x00, + 0x10, 0xaf, 0xfd, 0x40, 0x7a, 0xff, 0xd4, 0x00, 0x01, 0x40, 0xbf, 0x39, + 0xf8, 0x00, 0x00, 0x01, 0x48, 0xab, 0x78, 0xcf, 0x72, 0x52, 0xc6, 0x86, + 0xe9, 0x35, 0x55, 0x06, 0x55, 0x55, 0x55, 0x55, 0x5c, 0x07, 0x04, 0xfa, + 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xa1, 0x01, 0xff, 0x00, 0xa1, 0x00, + 0x00, 0x1a, 0xfd, 0x40, 0x1a, 0xff, 0x00, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x8a, 0xcf, 0x84, 0x02, 0xf4, 0x00, 0x00, 0xbf, 0xc2, 0x80, 0x00, + 0x40, 0x04, 0x89, 0x81, 0x00, 0x01, 0xaf, 0xff, 0xa0, 0x20, 0x00, 0x08, + 0x32, 0xff, 0x80, 0x02, 0xff, 0xff, 0x00, 0xb2, 0x02, 0xda, 0x00, 0x00, + 0x2d, 0xff, 0xd4, 0x04, 0x01, 0xbc, 0x00, 0x00, 0x2f, 0x69, 0x00, 0x04, + 0x00, 0xaa, 0xaa, 0xaa, 0x81, 0x4f, 0xff, 0xff, 0xb1, 0x00, 0x01, 0xdf, + 0xa1, 0x00, 0x00, 0x1a, 0xfd, 0x40, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x00, 0x01, 0x40, 0xbf, 0xc1, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x01, + 0x3c, 0x28, 0xad, 0x6a, 0x4a, 0xc6, 0x85, 0xfe, 0x93, 0x03, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x5a, 0x0f, 0x04, 0x00, 0xfa, 0x00, 0x00, 0x2f, 0xff, + 0xff, 0xa1, 0x01, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x02, 0xbf, 0x40, 0x1a, + 0xa8, 0x7a, 0x00, 0xe9, 0x2a, 0x02, 0xf4, 0x00, 0x00, 0x40, 0xbf, 0xc2, + 0x80, 0x00, 0x02, 0xbb, 0xba, 0xa4, 0x03, 0x10, 0x00, 0x08, 0xff, 0xff, + 0xa0, 0xda, 0x6a, 0x00, 0x02, 0xff, 0xff, 0xb2, 0x02, 0xdc, 0x20, 0x00, + 0x00, 0x1a, 0xff, 0xb0, 0x04, 0xdc, 0x00, 0x00, 0x2f, 0x88, 0x69, 0x00, + 0x00, 0x00, 0xe9, 0x4f, 0xff, 0xff, 0x00, 0xb1, 0x01, 0xdf, 0xf8, 0x00, + 0x00, 0x01, 0xbf, 0x01, 0x40, 0x08, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xb1, + 0xa7, 0xc2, 0xa0, 0x03, 0x04, 0xaf, 0x62, 0x42, 0xc6, 0x80, 0x85, 0xd9, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x59, 0xc0, 0x17, 0x04, 0xfa, 0x00, 0x00, + 0x2f, 0xff, 0xff, 0x00, 0xa1, 0x01, 0xff, 0xfd, 0x80, 0x00, 0x00, 0x2b, + 0x00, 0x40, 0x1a, 0xff, 0xff, 0xa2, 0x00, 0x00, 0x00, 0xa1, 0xe9, 0x8f, + 0x01, 0xf4, 0x00, 0x00, 0xbf, 0xc9, 0x00, 0xff, 0x80, 0x00, 0x01, 0x22, + 0x21, 0x00, 0x00, 0x01, 0x02, 0xad, 0xff, 0xff, 0xa0, 0x00, 0x08, 0x72, + 0x00, 0xff, 0x80, 0x02, 0xff, 0xff, 0xb2, 0x02, 0xdd, 0x00, 0x80, 0x00, + 0x04, 0xdf, 0x40, 0x0a, 0xfc, 0x00, 0x22, 0x00, 0x2f, 0x69, 0x00, 0x00, + 0x00, 0xe9, 0x4f, 0x04, 0xff, 0xff, 0xb1, 0x01, 0xdf, 0x92, 0x2b, 0x40, + 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x01, 0x4b, 0xbf, 0xc2, + 0xda, 0x20, 0x03, 0x18, 0x62, 0x42, 0xc0, 0xc6, 0x85, 0xfe, 0xa6, 0x35, + 0x55, 0x55, 0x55, 0x30, 0x57, 0xef, 0x0f, 0x03, 0xfa, 0x00, 0x00, 0x2f, + 0x00, 0xff, 0xff, 0xa1, 0x01, 0xff, 0xff, 0xd4, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x1a, 0xff, 0xff, 0xfc, 0x82, 0x04, 0x11, 0x00, 0x00, 0x00, 0x00, + 0xb1, 0xff, 0xf4, 0x12, 0x00, 0x00, 0xbf, 0xc9, 0xff, 0x80, 0x7a, 0x00, + 0x22, 0x02, 0xad, 0x69, 0xa0, 0x00, 0x08, 0x72, 0xff, 0x00, 0x80, 0x02, + 0xff, 0xff, 0xb2, 0x02, 0xdf, 0xb1, 0x00, 0x00, 0x01, 0xac, 0x10, 0x2c, + 0xfc, 0x00, 0x00, 0x40, 0x2f, 0x69, 0x00, 0x04, 0xaa, 0xaa, 0xa8, 0x40, + 0x00, 0x4f, 0xff, 0xff, 0xb1, 0x01, 0xdf, 0xff, 0xd4, 0x00, 0x00, 0x00, + 0x02, 0x20, 0x08, 0xff, 0xff, 0xff, 0x90, 0xb1, 0x01, 0xbf, 0xc2, 0xff, + 0xca, 0x21, 0x10, 0x07, 0x00, 0x00, 0x00, 0x01, 0xaf, 0x9b, 0x73, 0xb7, + 0x80, 0x02, 0xfc, 0x96, 0x33, 0x35, 0x53, 0x35, 0xcf, 0xc0, 0x17, 0x03, + 0xfa, 0x00, 0x00, 0x2f, 0xff, 0xff, 0x20, 0xa1, 0x01, 0x09, 0x40, 0x00, + 0x00, 0x00, 0x1a, 0x80, 0x12, 0xda, 0x84, 0x21, 0x00, 0x00, 0x04, 0xdf, + 0x02, 0xff, 0xff, 0xf4, 0x00, 0x00, 0xbf, 0x7a, 0x80, 0x01, 0x00, 0x02, + 0x44, 0x42, 0x00, 0x00, 0x2b, 0x19, 0x10, 0xa0, 0x00, 0x08, 0x72, 0xff, + 0x80, 0x02, 0xff, 0x00, 0xff, 0xb2, 0x02, 0xdf, 0xf4, 0x00, 0x00, 0x88, + 0x03, 0x00, 0x8f, 0xfc, 0x00, 0x00, 0x2f, 0x69, 0x2b, 0x00, 0xf8, 0x4f, + 0xff, 0xff, 0xb1, 0x01, 0xdf, 0xff, 0x08, 0xfd, 0x40, 0x00, 0x00, 0x7b, + 0xff, 0xd4, 0x00, 0x20, 0x01, 0xbf, 0xc2, 0xff, 0xff, 0xfc, 0xa8, 0x22, + 0x0f, 0x10, 0x00, 0x00, 0x4d, 0x9c, 0x6c, 0xa7, 0x01, 0x03, 0xfa, 0x97, + 0x76, 0x67, 0x79, 0xcf, 0x67, 0x64, 0x01, 0x00, 0x00, 0x2f, 0xff, 0xff, + 0xa1, 0x01, 0x01, 0x04, 0xb2, 0x00, 0x00, 0x00, 0x1a, 0x14, 0xca, 0x40, + 0x00, 0x00, 0x02, 0xcf, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x40, 0xbf, 0x7a, + 0x80, 0x00, 0x04, 0xff, 0xfd, 0x40, 0x22, 0x00, 0x01, 0x99, 0xa0, 0x00, + 0x08, 0x72, 0xff, 0x00, 0x80, 0x02, 0xff, 0xff, 0xb2, 0x02, 0xdf, 0xfa, + 0x00, 0x10, 0x00, 0x21, 0x02, 0xbf, 0xfc, 0x00, 0x00, 0x60, 0x2f, 0x69, + 0x2b, 0xfb, 0xbf, 0xff, 0xff, 0xb1, 0x24, 0x01, 0xdf, 0x11, 0x00, 0x00, + 0x7b, 0xff, 0xd4, 0x30, 0x00, 0x01, 0x61, 0xb2, 0xff, 0xff, 0xfd, 0xa4, + 0x1c, 0x00, 0x00, 0x2b, 0x9e, 0x5e, 0x87, 0xfc, 0xca, 0x30, 0xbc, 0xcf, + 0x1f, 0x04, 0xfa, 0x00, 0x00, 0x2f, 0x08, 0xff, 0xff, 0xa1, 0x01, 0x01, + 0xfb, 0x20, 0x00, 0x08, 0x00, 0x1a, 0xfc, 0xad, 0x03, 0xd4, 0x00, 0x02, + 0x02, 0xbf, 0xff, 0xff, 0xf4, 0x00, 0x00, 0xd1, 0xff, 0x00, 0xff, 0x80, + 0x00, 0x02, 0xdf, 0xff, 0xd2, 0x00, 0x01, 0x00, 0x2b, 0xff, 0xff, 0xa0, + 0x00, 0x08, 0x02, 0x00, 0xff, 0x80, 0x02, 0xff, 0xff, 0xb2, 0x02, 0xdf, + 0x00, 0xfd, 0x40, 0x00, 0x00, 0x04, 0xff, 0xfc, 0x00, 0x30, 0x00, 0x2f, + 0x69, 0x2d, 0xff, 0xff, 0xb1, 0x01, 0x02, 0xdf, 0xff, 0xff, 0xfb, 0x20, + 0x00, 0x7c, 0xd4, 0x14, 0x00, 0x01, 0xbf, 0x39, 0xca, 0x1b, 0xfd, 0x40, + 0x3f, 0x00, 0x2b, 0xbb, 0x93, 0xb7, 0x6f, 0x27, 0x05, 0x00, 0xfa, 0x00, + 0x00, 0x2f, 0xff, 0xff, 0xa1, 0x01, 0x81, 0x02, 0xa1, 0x00, 0x00, 0x1a, + 0xfb, 0x24, 0x03, 0x00, 0xf8, 0x00, 0x02, 0xbf, 0xff, 0xff, 0xf4, 0x00, + 0x40, 0x00, 0xd1, 0xff, 0xff, 0x80, 0x00, 0x02, 0xdf, 0x00, 0xff, 0xfa, + 0x00, 0x00, 0x04, 0xff, 0xff, 0xa0, 0xc2, 0xda, 0x6a, 0x02, 0xff, 0xff, + 0xb2, 0x51, 0xa1, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xfc, 0x00, 0x00, 0x2f, + 0x90, 0x69, 0x00, 0x08, 0x2b, 0xfd, 0xdf, 0xb1, 0x01, 0x48, 0xdf, 0xb1, + 0xb2, 0x00, 0x7c, 0xd4, 0x00, 0x01, 0x48, 0xbf, 0x39, 0xc1, 0x8f, 0x13, + 0x80, 0x00, 0x2b, 0xfc, 0xc3, 0x9b, 0xb7, 0x6f, 0x27, 0x05, 0xfa, 0x00, + 0x02, 0x00, 0x2f, 0xff, 0xff, 0xa1, 0x01, 0xa5, 0x1a, 0x10, 0xfd, 0x20, + 0x4d, 0x02, 0xf8, 0x00, 0x02, 0xcf, 0x02, 0xff, 0xff, 0xf4, 0x00, 0x00, + 0xbf, 0x3a, 0x80, 0x00, 0x00, 0x02, 0xdf, 0xff, 0xfc, 0x20, 0x00, 0x01, + 0x18, 0xbf, 0xff, 0xb1, 0x3b, 0x99, 0x04, 0xff, 0xff, 0x40, 0xb2, 0x51, + 0xd2, 0x00, 0x00, 0x4f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, + 0x80, 0x00, 0x08, 0x80, 0x31, 0xff, 0xff, 0xd4, 0xaf, 0xb1, 0x01, 0xdf, + 0x90, 0xb1, 0xfa, 0x10, 0x7c, 0xd4, 0x00, 0x01, 0xbf, 0x90, 0x39, 0xf2, + 0x08, 0x5a, 0xff, 0x80, 0x00, 0x2b, 0xfc, 0x5a, 0x3a, 0xc6, 0x87, 0x3f, + 0x07, 0xff, 0xfa, 0x01, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xa1, 0x01, 0x03, + 0x01, 0x80, 0x00, 0x1a, 0xff, 0x80, 0x04, 0xbd, 0x01, 0x10, 0xb2, 0x00, + 0x04, 0x01, 0xf4, 0x00, 0x00, 0xbf, 0x80, 0x44, 0x02, 0xdf, 0xff, 0xff, + 0xa0, 0x00, 0x00, 0x02, 0x4d, 0xff, 0xd4, 0x00, 0x00, 0x8d, 0x01, 0xf8, + 0x04, 0x00, 0x0a, 0xff, 0xff, 0xb2, 0x51, 0xfa, 0x00, 0x00, 0x00, 0xaf, + 0xff, 0xfc, 0x00, 0x00, 0x2f, 0xff, 0x08, 0xff, 0x80, 0x00, 0x08, 0x31, + 0xff, 0xfb, 0x40, 0x0a, 0xbf, 0xb1, 0x01, 0xdf, 0xb2, 0xa1, 0x7c, 0xd8, + 0x11, 0x00, 0x01, 0xbf, 0x39, 0xf8, 0x00, 0x4b, 0x51, 0x0f, 0xfb, 0x20, + 0x00, 0x4f, 0x22, 0x02, 0xc6, 0x87, 0xc0, 0x3f, 0x07, 0xff, 0xf8, 0x00, + 0x00, 0x2d, 0xff, 0x08, 0xff, 0xb1, 0x01, 0xdf, 0x02, 0xd8, 0x00, 0x1a, + 0x00, 0xff, 0xa1, 0x00, 0x14, 0xab, 0xbb, 0xba, 0x20, 0x21, 0x00, 0x1b, + 0x01, 0xf4, 0x00, 0x00, 0xbf, 0x42, 0x10, 0xa0, 0x00, 0x02, 0x09, 0xc2, + 0x00, 0x00, 0x08, 0x04, 0xff, 0xfa, 0x10, 0x00, 0x04, 0x01, 0x80, 0x00, + 0x00, 0x2d, 0xff, 0xff, 0xb1, 0x02, 0xdf, 0xff, 0xfc, 0x40, 0x20, 0xd9, + 0xfb, 0x00, 0x00, 0x2f, 0xff, 0xff, 0x00, 0x80, 0x00, 0x04, 0xaa, 0xaa, + 0xaa, 0xaa, 0x82, 0x00, 0x04, 0xdf, 0xb1, 0x01, 0xcf, 0xff, 0xff, 0xff, + 0x09, 0xff, 0xf8, 0x00, 0x08, 0xcc, 0x01, 0xaf, 0x89, 0x00, 0xfa, 0x00, + 0x00, 0x4a, 0xbb, 0xbb, 0xa2, 0x00, 0x3f, 0x01, 0xbf, 0x22, 0x02, 0xc6, + 0x87, 0x3f, 0x07, 0x00, 0xff, 0xd2, 0x00, 0x00, 0x1a, 0xff, 0xff, 0x80, + 0x22, 0x00, 0x8f, 0x02, 0xfd, 0x40, 0x0a, 0x7a, 0x01, 0x06, 0x22, 0x10, + 0x00, 0x01, 0xaf, 0x1c, 0x43, 0x40, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, + 0xfb, 0x20, 0x00, 0x00, 0x00, 0x8d, 0xff, 0xa1, 0x00, 0x00, 0x02, 0x22, + 0x11, 0x20, 0x00, 0x02, 0x79, 0x80, 0x00, 0xaf, 0xd9, 0x00, 0x0a, 0xff, + 0xff, 0xf8, 0x00, 0x00, 0x1b, 0xff, 0x00, 0xfd, 0x40, 0x00, 0x00, 0x01, + 0x11, 0x11, 0x10, 0x00, 0x00, 0x0a, 0xff, 0xa0, 0x00, 0x8f, 0xff, 0xff, + 0x52, 0xff, 0x71, 0x08, 0xca, 0xd2, 0x00, 0x8b, 0xfc, 0x00, 0x10, 0x00, + 0x00, 0x12, 0x21, 0x00, 0x00, 0x1a, 0xfc, 0x2a, 0x0a, 0xc6, 0x87, 0x3f, + 0x07, 0xff, 0xda, 0x00, 0x20, 0x00, 0x00, 0x01, 0x4b, 0xc4, 0x10, 0x00, + 0x20, 0x14, 0xbf, 0x02, 0xc4, 0x0a, 0xff, 0xf4, 0x14, 0x8a, 0x69, 0x00, + 0x00, 0x2a, 0x01, 0xd8, 0x19, 0x04, 0x00, 0xaf, 0xff, 0xff, 0xb4, 0x10, + 0x00, 0x00, 0x28, 0x80, 0x09, 0xb2, 0x00, 0x00, 0x02, 0x8f, 0xfb, 0x40, + 0x80, 0x0a, 0x00, 0x4b, 0xff, 0xff, 0xd4, 0x10, 0x00, 0x00, 0x28, 0xdf, + 0xff, 0xb2, 0x2b, 0xff, 0xfb, 0x41, 0x06, 0x00, 0x00, 0x01, 0x8d, 0xa4, + 0x43, 0x19, 0x2c, 0x00, 0xc4, 0x10, 0x00, 0x14, 0xbf, 0xff, 0xff, 0xff, + 0x10, 0xff, 0xd4, 0x08, 0xd1, 0xd8, 0x20, 0x00, 0x00, 0x01, 0x14, 0xaf, + 0xff, 0xff, 0xfd, 0x40, 0x22, 0x02, 0x7f, 0x02, 0xa9, 0x22, 0xd4, 0xa7, + 0x5f, 0x17, 0x03, 0x01, 0xd8, 0x88, 0x88, 0x88, 0x88, 0x8b, 0xc8, 0xd1, + 0x40, 0xbf, 0x02, 0xfb, 0x2a, 0xff, 0xfa, 0x8c, 0xb8, 0x05, 0x42, 0x11, + 0x12, 0x8a, 0xdf, 0x01, 0xda, 0x1a, 0x0c, 0xaf, 0xff, 0xff, 0xb4, 0xc2, + 0x79, 0xfc, 0x82, 0x00, 0x11, 0x12, 0xaf, 0xff, 0xdb, 0x84, 0x11, 0x11, + 0x50, 0x14, 0x02, 0xc8, 0x53, 0xf4, 0x8f, 0xff, 0xfb, 0x9a, 0x02, 0x8d, + 0xa8, 0xd2, 0xb2, 0xaf, 0x3a, 0xbf, 0x02, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x28, 0xd1, 0xd8, 0x90, 0x11, 0x84, 0xaf, 0x89, 0xa8, 0xcc, 0x84, 0x21, + 0x1f, 0x11, 0x24, 0xad, 0x3a, 0x1a, 0xc6, 0x87, 0x3f, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, +}; diff --git a/boards/dk-tm4c129x/qs_weather/images.h b/boards/dk-tm4c129x/qs_weather/images.h new file mode 100644 index 0000000..4d4ef34 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/images.h @@ -0,0 +1,42 @@ +//***************************************************************************** +// +// images.h - The definitions for the images in the images.c file. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __IMAGES_H__ +#define __IMAGES_H__ + +extern const uint8_t g_pui8SunImage[]; +extern const uint8_t g_pui8MoonImage[]; +extern const uint8_t g_pui8CloudyImage[]; +extern const uint8_t g_pui8RainImage[]; +extern const uint8_t g_pui8ThuderStormImage[]; +extern const uint8_t g_pui8SnowImage[]; +extern const uint8_t g_pui8FogImage[]; +extern const uint8_t g_pui8UpTabImage[]; +extern const uint8_t g_pui8DownTabImage[]; +extern const uint8_t g_pui8LeftImage[]; +extern const uint8_t g_pui8RightImage[]; +extern uint8_t g_pui8TIImagePalette[]; +extern uint8_t g_pui8TIImage[]; + +#endif diff --git a/boards/dk-tm4c129x/qs_weather/json.c b/boards/dk-tm4c129x/qs_weather/json.c new file mode 100644 index 0000000..1f71bc7 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/json.c @@ -0,0 +1,843 @@ +//***************************************************************************** +// +// json.c - File to handle json formatted data from websites. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +#include +#include +#include +#include +#include "utils/ustdlib.h" +#include "utils/lwiplib.h" +#include "eth_client.h" +#include "json.h" +#include "images.h" + +//**************************************************************************** +// +// The locally defined lwIP buffer parsing pointer. +// +//**************************************************************************** +typedef struct +{ + // + // A pbuf pointer from lwIP. + // + struct pbuf *psBuf; + + // + // The current index into the pbuf pointer. + // + uint32_t ui32Idx; +} +tBufPtr; + +//**************************************************************************** +// +// Initialize a buffer parsing pointer. +// +//**************************************************************************** +static void +BufPtrInit(tBufPtr *psBufPtr, struct pbuf *psBuf) +{ + psBufPtr->psBuf = psBuf; + psBufPtr->ui32Idx = 0; +} + +//**************************************************************************** +// +// Get a single byte from a parsing pointer. +// +//**************************************************************************** +static uint8_t +BufData8Get(tBufPtr *psBufPtr) +{ + return(((uint8_t *)psBufPtr->psBuf->payload)[psBufPtr->ui32Idx]); +} + +//***************************************************************************** +// +// Increment a parsing pointer by a given value. +// +//***************************************************************************** +uint32_t +BufPtrInc(tBufPtr *psBufPtr, uint32_t ui32Inc) +{ + psBufPtr->ui32Idx += ui32Inc; + + if(psBufPtr->ui32Idx >= psBufPtr->psBuf->len) + { + psBufPtr->ui32Idx = 0; + + psBufPtr->psBuf = psBufPtr->psBuf->next; + + if(psBufPtr->psBuf == 0) + { + ui32Inc = 0; + } + } + return(ui32Inc); +} + +//***************************************************************************** +// +// Return the image to use for the given icon returned from the weather update. +// +//***************************************************************************** +void +GetImage(char *pcIcon, const uint8_t **ppui8Image, const char **ppcDescription) +{ + static const struct + { + char pcId[2]; + const uint8_t *pui8Image; + const char *pcDescription; + } + pcIconTable[9] = + { + // + // Clear Sky. + // + { "01", g_pui8SunImage, "Clear Sky"}, + + // + // Light Clouds. + // + { "02", g_pui8CloudyImage, "Light Clouds"}, + + // + // Scattered Clouds. + // + { "03", g_pui8CloudyImage, "Scattered Clouds"}, + + // + // Broken Clouds. + // + { "04", g_pui8CloudyImage, "Broken Clouds"}, + + // + // Rain showers. + // + { "09", g_pui8RainImage, "Light Rain"}, + + // + // Rain. + // + { "10", g_pui8RainImage, "Rain"}, + + // + // Thunderstorms. + // + { "11", g_pui8ThuderStormImage, "Thunderstorms"}, + + // + // Snow. + // + { "13", g_pui8SnowImage, "Snow"}, + + // + // Mist/Fog. + // + { "50", g_pui8FogImage, "Mist/Fog"}, + }; + int32_t i32Idx; + + for(i32Idx = 0; i32Idx < 9; i32Idx++) + { + if((pcIcon[0] == pcIconTable[i32Idx].pcId[0]) && + (pcIcon[1] == pcIconTable[i32Idx].pcId[1])) + { + *ppui8Image = pcIconTable[i32Idx].pui8Image; + *ppcDescription = pcIconTable[i32Idx].pcDescription; + break; + } + } +} + +//***************************************************************************** +// +// Compare a string at the current location of a parsing pointer. +// +//***************************************************************************** +uint32_t +CompareString(tBufPtr *psBufPtr, const char *pcField, uint32_t ui32Size) +{ + uint32_t ui32Idx; + + for(ui32Idx = 0; ui32Idx < ui32Size; ui32Idx++) + { + if(BufData8Get(psBufPtr) == pcField[ui32Idx]) + { + if(BufPtrInc(psBufPtr, 1) != 1) + { + break; + } + } + else + { + break; + } + } + + if(ui32Idx == ui32Size) + { + return(0); + } + + return(1); +} + +//***************************************************************************** +// +// This function searches for a field from the JSON data. The field should be +// quoted in the data and immediately follow a '{' character. This can be used +// to also search for sub data in another field if the pointer to the data for +// the parent field. +// +//***************************************************************************** +static uint32_t +GetField(char *pcField, tBufPtr *psBufPtr) +{ + uint32_t ui32Curly, ui32Quote; + int32_t i32NewItem; + + ui32Curly = 0; + i32NewItem = 0; + ui32Quote = 0; + + while(1) + { + if(BufData8Get(psBufPtr) == '{') + { + ui32Curly++; + } + else if(BufData8Get(psBufPtr) == '}') + { + ui32Curly--; + + if(ui32Curly == 1) + { + ui32Quote = 0; + } + } + else if(BufData8Get(psBufPtr) == ',') + { + if((ui32Curly == 1) && ((ui32Quote & 1) == 0)) + { + ui32Quote = 0; + } + } + else if(BufData8Get(psBufPtr) == '"') + { + if((ui32Curly == 1) && (ui32Quote == 0)) + { + i32NewItem = 1; + } + ui32Quote++; + } + + if(BufPtrInc(psBufPtr, 1) != 1) + { + break; + } + + if(i32NewItem) + { + i32NewItem = 0; + if(CompareString(psBufPtr, pcField, ustrlen(pcField)) == 0) + { + while(1) + { + if(BufData8Get(psBufPtr) == ':') + { + if(BufPtrInc(psBufPtr, 1) != 1) + { + break; + } + return(1); + } + + if(BufPtrInc(psBufPtr, 1) != 1) + { + break; + } + } + return(0); + } + } + } + return(0); +} + +//***************************************************************************** +// +// This function searches for a value in a JSON item as an integer. These are +// non-quoted values so if the number is a quoted integer this function returns +// -1. If the value is found then it is returned by this function. +// +//***************************************************************************** +int32_t +GetFieldValueInt(tBufPtr *psBufPtr) +{ + int32_t i32Idx; + char pcTemp[20]; + const char *pEnd; + + i32Idx = 0; + + while(1) + { + // + // Find the end of this item. + // + if((BufData8Get(psBufPtr) == '}') || (BufData8Get(psBufPtr) == ',')) + { + // + // null terminate the string and get the value from the string in + // decimal. + // + pcTemp[i32Idx] = 0; + return(ustrtoul(pcTemp, &pEnd, 10)); + } + + // + // Should not hit a " char or something went wrong. + // + if(BufData8Get(psBufPtr) == '"') + { + break; + } + + // + // Copy the string to the local variable. + // + pcTemp[i32Idx] = BufData8Get(psBufPtr); + + if((pcTemp[i32Idx] == '\r') || (pcTemp[i32Idx] == '\n')) + { + pcTemp[i32Idx] = 0; + } + else + { + i32Idx++; + } + + if(BufPtrInc(psBufPtr, 1) != 1) + { + break; + } + + // + // Number was too large to represent. + // + if(i32Idx >= sizeof(pcTemp)) + { + break; + } + } + return(INVALID_INT); +} + +//***************************************************************************** +// +// This function searches for a value in a JSON item as quoted value. These +// values are quoted values so if the number is not a quoted value this +// function returns -1. If the quoted value is found then it is returned in +// the pcDataDest array. +// +//***************************************************************************** +int32_t +GetFieldValueString(tBufPtr *psBufPtr, char *pcDataDest, uint32_t ui32SizeDest) +{ + int32_t i32OutIdx; + + // + // The value should always start with a " char or something went wrong. + // + if(BufData8Get(psBufPtr) != '"') + { + return(-1); + } + + // + // Skip the initial " char. + // + if(BufPtrInc(psBufPtr, 1) != 1) + { + return(-1); + } + + for(i32OutIdx = 0; i32OutIdx < ui32SizeDest;) + { + // + // Either a '}', ',', or '"' ends an item. + // + if((BufData8Get(psBufPtr) == '}') || + (BufData8Get(psBufPtr) == ',') || + (BufData8Get(psBufPtr) == '"')) + { + // + // Null terminate the string and return. + // + pcDataDest[i32OutIdx] = 0; + return(i32OutIdx); + } + + // + // Continue coping chars into the destination buffer. + // + pcDataDest[i32OutIdx] = BufData8Get(psBufPtr); + + // + // These can occur in the response string and need to be ignored. + // + if((pcDataDest[i32OutIdx] == '\r') || (pcDataDest[i32OutIdx] == '\n')) + { + pcDataDest[i32OutIdx] = 0; + } + else + { + i32OutIdx++; + } + + if(BufPtrInc(psBufPtr, 1) != 1) + { + break; + } + } + + // + // Make sure to null terminate inside the current string. + // + if(i32OutIdx == ui32SizeDest) + { + pcDataDest[i32OutIdx-1] = 0; + return(i32OutIdx - 1); + } + return(-1); +} + +//***************************************************************************** +// +// Fill out the psWeatherReport structure from data returned from the JSON +// query. +// +//***************************************************************************** +int32_t +JSONParseForecast(uint32_t ui32Index, tWeatherReport *psWeatherReport, + struct pbuf *psBuf) +{ + tBufPtr sBufPtr, sBufList, sBufTemp; + char pcCode[4]; + int32_t i32Items,i32Code; + + + // + // Reset the pointers. + // + BufPtrInit(&sBufPtr, psBuf); + + // + // Check and see if the request was valid. + // + if(GetField("cod", &sBufPtr) != 0) + { + // + // Check for a 404 not found error. + // + sBufTemp = sBufPtr; + + // + // Check for a 404 not found error. + // + i32Code = GetFieldValueInt(&sBufTemp); + + sBufTemp = sBufPtr; + + if(i32Code != INVALID_INT) + { + if(i32Code == 404) + { + return(-1); + } + } + else if(GetFieldValueString(&sBufTemp, pcCode, sizeof(pcCode)) >= 0) + { + // + // Check for a 404 not found error. + // + if(ustrncmp(pcCode, "404", 3) == 0) + { + return(-1); + } + } + } + + // + // Reset the pointers. + // + BufPtrInit(&sBufPtr, psBuf); + + // + // Initialize the number of items found. + // + i32Items = 0; + + if(GetField("list", &sBufPtr) != 0) + { + // + // Save the list pointer. + // + sBufList = sBufPtr; + + // + // Get the humidity. + // + if(GetField("humidity", &sBufPtr) != 0) + { + psWeatherReport->i32Humidity = GetFieldValueInt(&sBufPtr); + i32Items++; + } + else + { + psWeatherReport->i32Humidity = INVALID_INT; + } + + // + // Reset the pointer to the start of the list values. + // + sBufPtr = sBufList; + + // + // Get the average daily pressure. + // + if(GetField("pressure", &sBufPtr) != 0) + { + psWeatherReport->i32Pressure = GetFieldValueInt(&sBufPtr); + i32Items++; + } + else + { + psWeatherReport->i32Pressure = INVALID_INT; + } + + // + // Reset the pointer to the start of the list values. + // + sBufPtr = sBufList; + + // + // Get the average daily temperature. + // + if(GetField("temp", &sBufPtr) != 0) + { + if(GetField("day", &sBufPtr) != 0) + { + psWeatherReport->i32Temp = GetFieldValueInt(&sBufPtr); + i32Items++; + } + else + { + psWeatherReport->i32Temp = INVALID_INT; + } + } + + // + // Reset the pointer to the start of the list values. + // + sBufPtr = sBufList; + + // + // Get the low temperature. + // + if(GetField("temp", &sBufPtr) != 0) + { + if(GetField("min", &sBufPtr) != 0) + { + psWeatherReport->i32TempLow = GetFieldValueInt(&sBufPtr); + i32Items++; + } + else + { + psWeatherReport->i32TempLow = INVALID_INT; + } + } + + // + // Reset the pointer to the start of the list values. + // + sBufPtr = sBufList; + + // + // Get the high temperature. + // + if(GetField("temp", &sBufPtr) != 0) + { + if(GetField("max", &sBufPtr) != 0) + { + psWeatherReport->i32TempHigh = GetFieldValueInt(&sBufPtr); + i32Items++; + } + else + { + psWeatherReport->i32TempHigh = INVALID_INT; + } + } + // + // Reset the pointer to the start of the list values. + // + sBufPtr = sBufList; + + if(GetField("dt", &sBufPtr) != 0) + { + psWeatherReport->ui32Time = GetFieldValueInt(&sBufPtr); + i32Items++; + } + else + { + psWeatherReport->ui32Time = 0; + } + } + + return(i32Items); +} + +//***************************************************************************** +// +// Fill out the psWeatherReport structure from data returned from the JSON +// query. +// +//***************************************************************************** +int32_t +JSONParseCurrent(uint32_t ui32Index, tWeatherReport *psWeatherReport, + struct pbuf *psBuf) +{ + tBufPtr sBufPtr, sBufMain, sBufTemp; + char pcIcon[3]; + char pcCode[4]; + int32_t i32Items, i32Code; + + // + // Reset the pointers. + // + BufPtrInit(&sBufPtr, psBuf); + + // + // Check and see if the request was valid. + // + if(GetField("cod", &sBufPtr) != 0) + { + sBufTemp = sBufPtr; + + // + // Check for a 404 not found error. + // + i32Code = GetFieldValueInt(&sBufTemp); + + sBufTemp = sBufPtr; + + if(i32Code != INVALID_INT) + { + if(i32Code == 404) + { + return(-1); + } + } + else if(GetFieldValueString(&sBufTemp, pcCode, sizeof(pcCode)) >= 0) + { + // + // Check for a 404 not found error. + // + if(ustrncmp(pcCode, "404", 3) == 0) + { + return(-1); + } + } + } + + // + // Initialize the number of items that have been found. + // + i32Items = 0; + + // + // Reset the pointers. + // + BufPtrInit(&sBufPtr, psBuf); + + // + // Find the basic weather description(weather.description). + // + if(GetField("weather", &sBufPtr) != 0) + { + if(GetField("icon", &sBufPtr) != 0) + { + if(GetFieldValueString(&sBufPtr, pcIcon, sizeof(pcIcon)) > 0) + { + // + // Save the image pointer. + // + GetImage(pcIcon, &psWeatherReport->pui8Image, + &psWeatherReport->pcDescription); + + i32Items++; + } + else + { + // + // No image was found. + // + psWeatherReport->pui8Image = 0; + } + } + } + + // + // Reset the pointers. + // + BufPtrInit(&sBufPtr, psBuf); + + // + // Find the humidity value(main.humidity). + // + if(GetField("sys", &sBufPtr) != 0) + { + // + // Save the pointer to the data. + // + sBufMain = sBufPtr; + + // + // Get the sunrise time. + // + if(GetField("sunrise", &sBufPtr) != 0) + { + psWeatherReport->ui32SunRise = GetFieldValueInt(&sBufPtr); + + i32Items++; + } + else + { + psWeatherReport->ui32SunRise = 0; + } + + // + // Restore the pointer to the data. + // + sBufPtr = sBufMain; + + // + // Get the sunset time. + // + if(GetField("sunset", &sBufPtr) != 0) + { + psWeatherReport->ui32SunSet = GetFieldValueInt(&sBufPtr); + + i32Items++; + } + else + { + psWeatherReport->ui32SunSet = 0; + } + } + + // + // Reset the pointers. + // + BufPtrInit(&sBufPtr, psBuf); + + // + // Get the last update time. + // + if(GetField("dt", &sBufPtr) != 0) + { + psWeatherReport->ui32Time = GetFieldValueInt(&sBufPtr); + + i32Items++; + } + else + { + psWeatherReport->ui32Time = 0; + } + + // + // Reset the pointers. + // + BufPtrInit(&sBufPtr, psBuf); + + // + // Find the humidity value(main.humidity). + // + if(GetField("main", &sBufPtr) != 0) + { + // + // Save the pointer to the main data. + // + sBufMain = sBufPtr; + + if(GetField("humidity", &sBufPtr) != 0) + { + psWeatherReport->i32Humidity = GetFieldValueInt(&sBufPtr); + i32Items++; + } + else + { + psWeatherReport->i32Humidity = INVALID_INT; + } + + // + // Reset the buffer pointer to main. + // + sBufPtr = sBufMain; + + // + // Find the current temperature value. + // + if(GetField("temp", &sBufPtr) != 0) + { + psWeatherReport->i32Temp = GetFieldValueInt(&sBufPtr); + i32Items++; + } + else + { + psWeatherReport->i32Temp = INVALID_INT; + } + + // + // Reset the buffer pointer to main. + // + sBufPtr = sBufMain; + + // + // Find the current atmospheric pressure. + // + if(GetField("pressure", &sBufPtr) != 0) + { + psWeatherReport->i32Pressure = GetFieldValueInt(&sBufPtr); + i32Items++; + } + else + { + psWeatherReport->i32Pressure = INVALID_INT; + } + } + return(i32Items); +} diff --git a/boards/dk-tm4c129x/qs_weather/json.h b/boards/dk-tm4c129x/qs_weather/json.h new file mode 100644 index 0000000..989912f --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/json.h @@ -0,0 +1,41 @@ +//***************************************************************************** +// +// json.h - The parsing function headers for JSON data from the web server. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __JSON_H__ +#define __JSON_H__ + +#ifndef JSON_H_ +#define JSON_H_ + +#define INVALID_INT ((int32_t)(0x80000000)) + +extern int32_t JSONParseCurrent(uint32_t ui32Index, + tWeatherReport *psWeatherReport, + struct pbuf *psBuf); +extern int32_t JSONParseForecast(uint32_t ui32Index, + tWeatherReport *psWeatherReport, + struct pbuf *psBuf); +#endif + +#endif diff --git a/boards/dk-tm4c129x/qs_weather/lwipopts.h b/boards/dk-tm4c129x/qs_weather/lwipopts.h new file mode 100644 index 0000000..ef7a6d6 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/lwipopts.h @@ -0,0 +1,444 @@ +//***************************************************************************** +// +// lwipopts.h - Configuration file for lwIP +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +// +// NOTE: This file has been derived from the lwIP/src/include/lwip/opt.h +// header file. +// +// For additional details, refer to the original "opt.h" file, and lwIP +// documentation. +// +//***************************************************************************** +#ifndef __LWIPOPTS_H__ +#define __LWIPOPTS_H__ + +#include + +//***************************************************************************** +// +// ---------- Stellaris / lwIP Port Options ---------- +// +//***************************************************************************** +#define HOST_TMR_INTERVAL 100 // default is 0 +//#define DHCP_EXPIRE_TIMER_MSECS (60 * 1000) +//#define LWIP_HTTPD_SSI 1 +//#define LWIP_HTTPD_CGI 1 +#define LWIP_HTTPD_DYNAMIC_HEADERS 1 +//#define EMAC_PHY_CONFIG EMAC_PHY_TYPE_EXTERNAL_RMII +//#define PHY_PHYS_ADDR 1 +#define EMAC_PHY_CONFIG (EMAC_PHY_TYPE_INTERNAL | EMAC_PHY_INT_MDIX_EN | \ + EMAC_PHY_AN_100B_T_FULL_DUPLEX) +#define PHY_PHYS_ADDR 0 +#define NUM_TX_DESCRIPTORS 8 +#define NUM_RX_DESCRIPTORS 8 + +//***************************************************************************** +// +// ---------- Platform specific locking ---------- +// +//***************************************************************************** +#define SYS_LIGHTWEIGHT_PROT 1 // default is 0 +#define NO_SYS 1 // default is 0 +//#define MEMCPY(dst,src,len) memcpy(dst,src,len) +//#define SMEMCPY(dst,src,len) memcpy(dst,src,len) + +//***************************************************************************** +// +// ---------- Memory options ---------- +// +//***************************************************************************** +//#define MEM_LIBC_MALLOC 0 +#define MEM_ALIGNMENT 4 +#define MEM_SIZE (32 * 1024) +//#define MEMP_OVERFLOW_CHECK 0 +//#define MEMP_SANITY_CHECK 0 +//#define MEM_USE_POOLS 0 +//#define MEMP_USE_CUSTOM_POOLS 0 + +//***************************************************************************** +// +// ---------- Internal Memory Pool Sizes ---------- +// +//***************************************************************************** +#define MEMP_NUM_PBUF 16 // Default 16, was 16 +//#define MEMP_NUM_RAW_PCB 4 +//#define MEMP_NUM_UDP_PCB 4 +#define MEMP_NUM_TCP_PCB 16 +//#define MEMP_NUM_TCP_PCB_LISTEN 8 +//#define MEMP_NUM_TCP_SEG 16 +//#define MEMP_NUM_REASSDATA 5 +//#define MEMP_NUM_ARP_QUEUE 30 +//#define MEMP_NUM_IGMP_GROUP 8 +#define MEMP_NUM_SYS_TIMEOUT 6 //5 +//#define MEMP_NUM_NETBUF 2 +//#define MEMP_NUM_NETCONN 4 +//#define MEMP_NUM_TCPIP_MSG_API 8 +//#define MEMP_NUM_TCPIP_MSG_INPKT 8 +#define PBUF_POOL_SIZE 16 // Default 16 + +//***************************************************************************** +// +// ---------- ARP options ---------- +// +//***************************************************************************** +//#define LWIP_ARP 1 +//#define ARP_TABLE_SIZE 10 +//#define ARP_QUEUEING 1 +//#define ETHARP_TRUST_IP_MAC 1 + +//***************************************************************************** +// +// ---------- IP options ---------- +// +//***************************************************************************** +//#define IP_FORWARD 0 +//#define IP_OPTIONS_ALLOWED 1 +#define IP_REASSEMBLY 0 // default is 1 +#define IP_FRAG 0 // default is 1 +//#define IP_REASS_MAXAGE 3 +//#define IP_REASS_MAX_PBUFS 10 +//#define IP_FRAG_USES_STATIC_BUF 1 +//#define IP_FRAG_MAX_MTU 1500 +//#define IP_DEFAULT_TTL 255 + +//***************************************************************************** +// +// ---------- ICMP options ---------- +// +//***************************************************************************** +//#define LWIP_ICMP 1 +//#define ICMP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- RAW options ---------- +// +//***************************************************************************** +//#define LWIP_RAW 1 +//#define RAW_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- DHCP options ---------- +// +//***************************************************************************** +#define LWIP_DHCP 1 // default is 0 +//#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) + +//***************************************************************************** +// +// ---------- UPNP options ---------- +// +//***************************************************************************** +//#define LWIP_UPNP 0 + +//***************************************************************************** +// +// ---------- PTPD options ---------- +// +//***************************************************************************** +//#define LWIP_PTPD 0 + +//***************************************************************************** +// +// ---------- AUTOIP options ---------- +// +//***************************************************************************** +#define LWIP_AUTOIP 1 // default is 0 +#define LWIP_DHCP_AUTOIP_COOP ((LWIP_DHCP) && (LWIP_AUTOIP)) + // default is 0 +#define LWIP_DHCP_AUTOIP_COOP_TRIES 5 // default is 9 + +//***************************************************************************** +// +// ---------- SNMP options ---------- +// +//***************************************************************************** +//#define LWIP_SNMP 0 +//#define SNMP_CONCURRENT_REQUESTS 1 +//#define SNMP_TRAP_DESTINATIONS 1 +//#define SNMP_PRIVATE_MIB 0 +//#define SNMP_SAFE_REQUESTS 1 + +//***************************************************************************** +// +// ---------- IGMP options ---------- +// +//***************************************************************************** +//#define LWIP_IGMP 0 + +//***************************************************************************** +// +// ---------- DNS options ----------- +// +//***************************************************************************** +#define LWIP_DNS 1 +#define DNS_TABLE_SIZE 4 +#define DNS_MAX_NAME_LENGTH 256 +#define DNS_MAX_SERVERS 2 +#define DNS_DOES_NAME_CHECK 1 +#define DNS_USES_STATIC_BUF 1 +#define DNS_MSG_SIZE 512 + +//***************************************************************************** +// +// ---------- UDP options ---------- +// +//***************************************************************************** +//#define LWIP_UDP 1 +//#define LWIP_UDPLITE 0 +//#define UDP_TTL (IP_DEFAULT_TTL) + +//***************************************************************************** +// +// ---------- TCP options ---------- +// +//***************************************************************************** +#define LWIP_TCP 1 +//#define TCP_TTL (IP_DEFAULT_TTL) +#define TCP_WND 4096 // default is 2048 +//#define TCP_MAXRTX 12 +//#define TCP_SYNMAXRTX 6 +//#define TCP_QUEUE_OOSEQ 1 +#define TCP_MSS 1500 // default is 128 +//#define TCP_CALCULATE_EFF_SEND_MSS 1 +#define TCP_SND_BUF (4 * TCP_MSS) + // default is 256, was 6 * +//#define TCP_SND_QUEUELEN (4 * (TCP_SND_BUF/TCP_MSS)) +//#define TCP_SNDLOWAT (TCP_SND_BUF/2) +//#define TCP_LISTEN_BACKLOG 0 +//#define TCP_DEFAULT_LISTEN_BACKLOG 0xff + +//***************************************************************************** +// +// ---------- API options ---------- +// +//***************************************************************************** +//#define LWIP_EVENT_API 0 +//#define LWIP_CALLBACK_API 1 + +//***************************************************************************** +// +// ---------- Pbuf options ---------- +// +//***************************************************************************** +#define PBUF_LINK_HLEN 16 // default is 14 +#define PBUF_POOL_BUFSIZE 512 + // default is LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) +#define ETH_PAD_SIZE 0 // default is 0 + +//***************************************************************************** +// +// ---------- Network Interfaces options ---------- +// +//***************************************************************************** +//#define LWIP_NETIF_HOSTNAME 0 +//#define LWIP_NETIF_API 0 +//#define LWIP_NETIF_STATUS_CALLBACK 0 +//#define LWIP_NETIF_LINK_CALLBACK 0 +//#define LWIP_NETIF_HWADDRHINT 0 + +//***************************************************************************** +// +// ---------- LOOPIF options ---------- +// +//***************************************************************************** +//#define LWIP_HAVE_LOOPIF 0 +//#define LWIP_LOOPIF_MULTITHREADING 1 + +//***************************************************************************** +// +// ---------- Thread options ---------- +// +//***************************************************************************** +//#define TCPIP_THREAD_NAME "tcpip_thread" +//#define TCPIP_THREAD_STACKSIZE 0 +//#define TCPIP_THREAD_PRIO 1 +//#define TCPIP_MBOX_SIZE 0 +//#define SLIPIF_THREAD_NAME "slipif_loop" +//#define SLIPIF_THREAD_STACKSIZE 0 +//#define SLIPIF_THREAD_PRIO 1 +//#define PPP_THREAD_NAME "pppMain" +//#define PPP_THREAD_STACKSIZE 0 +//#define PPP_THREAD_PRIO 1 +//#define DEFAULT_THREAD_NAME "lwIP" +//#define DEFAULT_THREAD_STACKSIZE 0 +//#define DEFAULT_THREAD_PRIO 1 +//#define DEFAULT_RAW_RECVMBOX_SIZE 0 +//#define DEFAULT_UDP_RECVMBOX_SIZE 0 +//#define DEFAULT_TCP_RECVMBOX_SIZE 0 +//#define DEFAULT_ACCEPTMBOX_SIZE 0 + +//***************************************************************************** +// +// ---------- Sequential layer options ---------- +// +//***************************************************************************** +//#define LWIP_TCPIP_CORE_LOCKING 0 +#define LWIP_NETCONN 0 // default is 1 + +//***************************************************************************** +// +// ---------- Socket Options ---------- +// +//***************************************************************************** +#define LWIP_SOCKET 0 // default is 1 +//#define LWIP_COMPAT_SOCKETS 1 +//#define LWIP_POSIX_SOCKETS_IO_NAMES 1 +//#define LWIP_TCP_KEEPALIVE 0 +//#define LWIP_SO_RCVTIMEO 0 +//#define LWIP_SO_RCVBUF 0 +//#define SO_REUSE 0 + +//***************************************************************************** +// +// ---------- Statistics options ---------- +// +//***************************************************************************** +//#define LWIP_STATS 1 +//#define LWIP_STATS_DISPLAY 0 +//#define LINK_STATS 1 +//#define ETHARP_STATS (LWIP_ARP) +//#define IP_STATS 1 +//#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) +//#define ICMP_STATS 1 +//#define IGMP_STATS (LWIP_IGMP) +//#define UDP_STATS (LWIP_UDP) +//#define TCP_STATS (LWIP_TCP) +//#define MEM_STATS 1 +//#define MEMP_STATS 1 +//#define SYS_STATS 1 + +//***************************************************************************** +// +// ---------- PPP options ---------- +// +//***************************************************************************** +//#define PPP_SUPPORT 0 +//#define PPPOE_SUPPORT 0 +//#define PPPOS_SUPPORT PPP_SUPPORT + +#if PPP_SUPPORT +//#define NUM_PPP 1 +//#define PAP_SUPPORT 0 +//#define CHAP_SUPPORT 0 +//#define MSCHAP_SUPPORT 0 +//#define CBCP_SUPPORT 0 +//#define CCP_SUPPORT 0 +//#define VJ_SUPPORT 0 +//#define MD5_SUPPORT 0 +//#define FSM_DEFTIMEOUT 6 +//#define FSM_DEFMAXTERMREQS 2 +//#define FSM_DEFMAXCONFREQS 10 +//#define FSM_DEFMAXNAKLOOPS 5 +//#define UPAP_DEFTIMEOUT 6 +//#define UPAP_DEFREQTIME 30 +//#define CHAP_DEFTIMEOUT 6 +//#define CHAP_DEFTRANSMITS 10 +//#define LCP_ECHOINTERVAL 0 +//#define LCP_MAXECHOFAILS 3 +//#define PPP_MAXIDLEFLAG 100 + +//#define PPP_MAXMTU 1500 +//#define PPP_DEFMRU 296 +#endif + +//***************************************************************************** +// +// ---------- checksum options ---------- +// +//***************************************************************************** +#define CHECKSUM_GEN_IP 0 +#define CHECKSUM_GEN_ICMP 0 +#define CHECKSUM_GEN_UDP 0 +#define CHECKSUM_GEN_TCP 0 +#define CHECKSUM_CHECK_IP 0 +#define CHECKSUM_CHECK_UDP 0 +#define CHECKSUM_CHECK_TCP 0 + +//***************************************************************************** +// +// ---------- Debugging options ---------- +// +//***************************************************************************** +#ifdef DEBUG +#define U8_F "c" +#define S8_F "c" +#define X8_F "02x" +#define U16_F "u" +#define S16_F "d" +#define X16_F "x" +#define U32_F "u" +#define S32_F "d" +#define X32_F "x" +extern void UARTprintf(const char *pcString, ...); +#define LWIP_PLATFORM_DIAG(msg) UARTprintf msg +#define LWIP_PLATFORM_ASSERT(msg) UARTprintf("ASSERT FAIL at line %d of %s: %s\n", __LINE__, __FILE__, msg) +#define LWIP_DEBUG 1 +#endif + +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SERIOUS +//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE + +//#define LWIP_DBG_TYPES_ON LWIP_DBG_ON +//#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH) + +//#define ETHARP_DEBUG LWIP_DBG_ON // default is OFF +#define NETIF_DEBUG LWIP_DBG_OFF +//#define PBUF_DEBUG LWIP_DBG_OFF +//#define API_LIB_DEBUG LWIP_DBG_OFF +//#define API_MSG_DEBUG LWIP_DBG_OFF +//#define SOCKETS_DEBUG LWIP_DBG_OFF +#define HTTPD_DEBUG LWIP_DBG_OFF +//#define ICMP_DEBUG LWIP_DBG_OFF +//#define IGMP_DEBUG LWIP_DBG_OFF +//#define INET_DEBUG LWIP_DBG_OFF +//#define IP_DEBUG LWIP_DBG_ON +//#define IP_REASS_DEBUG LWIP_DBG_OFF +#define RAW_DEBUG LWIP_DBG_OFF +//#define MEM_DEBUG LWIP_DBG_OFF +//#define MEMP_DEBUG LWIP_DBG_OFF +//#define SYS_DEBUG LWIP_DBG_OFF +//#define TCP_DEBUG LWIP_DBG_ON +#define TCP_INPUT_DEBUG LWIP_DBG_OFF +//#define TCP_FR_DEBUG LWIP_DBG_OFF +//#define TCP_RTO_DEBUG LWIP_DBG_OFF +//#define TCP_CWND_DEBUG LWIP_DBG_OFF +//#define TCP_WND_DEBUG LWIP_DBG_OFF +#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +//#define TCP_RST_DEBUG LWIP_DBG_OFF +//#define TCP_QLEN_DEBUG LWIP_DBG_OFF +//#define UDP_DEBUG LWIP_DBG_ON // default is OFF +//#define TCPIP_DEBUG LWIP_DBG_ON +//#define PPP_DEBUG LWIP_DBG_OFF +//#define SLIP_DEBUG LWIP_DBG_OFF +//#define DHCP_DEBUG LWIP_DBG_ON // default is OFF +//#define AUTOIP_DEBUG LWIP_DBG_OFF +//#define SNMP_MSG_DEBUG LWIP_DBG_OFF +//#define SNMP_MIB_DEBUG LWIP_DBG_OFF +//#define DNS_DEBUG LWIP_DBG_OFF + +#endif /* __LWIPOPTS_H__ */ diff --git a/boards/dk-tm4c129x/qs_weather/qs_weather.c b/boards/dk-tm4c129x/qs_weather/qs_weather.c new file mode 100644 index 0000000..4a0879f --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/qs_weather.c @@ -0,0 +1,2896 @@ +//***************************************************************************** +// +// qs_weather.c - Sample Weather application using lwIP. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_gpio.h" +#include "driverlib/flash.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/emac.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/keyboard.h" +#include "grlib/canvas.h" +#include "grlib/pushbutton.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" +#include "utils/locator.h" +#include "utils/flash_pb.h" +#include "utils/lwiplib.h" +#include "utils/ustdlib.h" +#include "eth_client.h" +#include "images.h" +#include "json.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Quickstart Weather Application (qs_weather)

      +//! +//! This example application demonstrates the operation of the Tiva C series +//! evaluation kit as a weather reporting application. +//! +//! The application supports updating weather information from Open Weather Map +//! weather provider(http://openweathermap.org/). The application uses the +//! lwIP stack to obtain an address through DNS, resolve the address of the +//! Open Weather Map site and then build and handle all of the requests +//! necessary to access the weather information. The application can also use +//! a web proxy, allows for a custom city to be added to the list of cities and +//! toggles temperature units from Celsius to Fahrenheit. The application uses +//! gestures to navigate between various screens. To open the settings screen +//! just press and drag down on any city screen. To exit the setting screen +//! press and drag up and you are returned to the main city display. To +//! navigate between cities, press and drag left or right and the new city +//! information is displayed. +//! +//! For additional details about Open Weather Map refer to their web page at: +//! http://openweathermap.org/ +//! +//! For additional details on lwIP, refer to the lwIP web page at: +//! http://savannah.nongnu.org/projects/lwip/ +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines for setting up the system tick clock. +// +//***************************************************************************** +#define SYSTEM_TICK_MS 10 +#define SYSTEM_TICK_S 100 + +//***************************************************************************** +// +// Define the size of the flash program blocks for saving configuration data. +// +//***************************************************************************** +#define FLASH_PB_START 0x40000 +#define FLASH_PB_END FLASH_PB_START + 0x4000 + +//***************************************************************************** +// +// The animation delay passed to SysCtlDelay(). +// +//***************************************************************************** +#define SCREEN_ANIMATE_DELAY 0x10000 + +//***************************************************************************** +// +// Minimum change to be a swipe action. +// +//***************************************************************************** +#define SWIPE_MIN_DIFF 40 + +//***************************************************************************** +// +// Connection states for weather application. +// +//***************************************************************************** +volatile enum +{ + STATE_NOT_CONNECTED, + STATE_NEW_CONNECTION, + STATE_CONNECTED_IDLE, + STATE_WAIT_DATA, + STATE_UPDATE_CITY, + STATE_WAIT_NICE, +} +g_iState = STATE_NOT_CONNECTED; + +//***************************************************************************** +// +// The city being displayed. +// +//***************************************************************************** +uint32_t g_ui32CityActive; + +//***************************************************************************** +// +// The city being updated. +// +//***************************************************************************** +uint32_t g_ui32CityUpdating; + +//***************************************************************************** +// +// The delay count to reduce traffic to the weather server. +// +//***************************************************************************** +volatile uint32_t g_ui32Delay; + +//***************************************************************************** +// +// Screen saver timeout. +// +//***************************************************************************** +volatile uint32_t g_ui32ScreenSaver; + +//***************************************************************************** +// +// State information for the toggle buttons used in the settings panel. +// +//***************************************************************************** +typedef struct +{ + // + // The outside area of the button. + // + tRectangle sRectContainer; + + // + // The actual button area. + // + tRectangle sRectButton; + + // + // The text for the on position. + // + const char *pcOn; + + // + // The text for the off position. + // + const char *pcOff; + + // + // The label for the button. + // + const char *pcLabel; +} +tButtonToggle; + +// +// System clock rate in Hz. +// +uint32_t g_ui32SysClock; + +// +// Global graphic context for the application. +// +tContext g_sContext; + +//***************************************************************************** +// +// Storage for the filename list box widget string table. +// +//***************************************************************************** +#define NUM_CITIES 30 + +//***************************************************************************** +// +// The flash parameter block structure. +// +//***************************************************************************** +typedef struct +{ + // + // Reserved space used by the flash program block code. + // + uint32_t ui32PBReserved; + + // + // The custom city name. + // + char pcCustomCity[60]; + + // + // The web proxy name. + // + char pcProxy[80]; + + // + // The current temperature unit setting. + // + bool bCelsius; + + // + // Current enable/disable setting for the custom city. + // + bool bCustomEnabled; + + // + // Current enable/disable setting for the proxy. + // + bool bProxyEnabled; + + // + // Indicates whether the current settings have been saved. + // + bool bSave; +} +sParameters; + +//***************************************************************************** +// +// The defaults for the flash and application settings. +// +//***************************************************************************** +static const sParameters g_sDefaultParams = +{ + 0, + {"Custom City Name"}, + {"your.proxy.com"}, + true, + false, + false, + false +}; + +// +// The current live configuration settings for the application. +// +static sParameters g_sConfig; + +//***************************************************************************** +// +// The state of each city panel. +// +//***************************************************************************** +struct +{ + // + // The last update time for this city. + // + uint32_t ui32LastUpdate; + + // + // The current weather report data for this city. + // + tWeatherReport sReport; + + // + // Indicates if the city needs updating. + // + bool bNeedsUpdate; + + // + // The name of the current city. + // + const char *pcName; +} +g_psCityInfo[NUM_CITIES]; + +// +// The list of city names. +// +static const char *g_ppcCityNames[NUM_CITIES - 1] = +{ + "Austin, TX", + "Beijing, China", + "Berlin, Germany", + "Boston, MA", + "Buenos Aires, Argentina", + "Chicago, IL", + "Dallas, TX", + "Frankfurt, Germany", + "Hong Kong, HK", + "Jerusalem, Israel", + "Johannesburg, ZA", + "London, England", + "Mexico City, Mexico", + "Moscow, Russia", + "New Delhi, India", + "New York, NY", + "Paris, France", + "Rome, Italy", + "San Jose, CA", + "Sao Paulo, Brazil", + "Seoul, S. Korea", + "Shanghai, China", + "Shenzhen, China", + "Singapore City, Singapore", + "Sydney, Australia", + "Taipei, Taiwan", + "Tokyo, Japan", + "Toronto, Canada", + "Vancouver, Canada" +}; + +//***************************************************************************** +// +// Constant strings for status messages. +// +//***************************************************************************** +const char g_pcNotFound[] = "City Not Found"; +const char g_pcServerBusy[] = "Server Busy"; +const char g_pcWaitData[] = "Waiting for Data"; + +//***************************************************************************** +// +// Interrupt priority definitions. The top 3 bits of these values are +// significant with lower values indicating higher priority interrupts. +// +//***************************************************************************** +#define SYSTICK_INT_PRIORITY 0x80 +#define ETHERNET_INT_PRIORITY 0xC0 + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Pre-declaration of the functions used by the graphical objects. +// +//***************************************************************************** +static void UpdateCity(uint32_t ui32Idx, bool bDraw); +static void ProxyEnable(tWidget *psWidget); +static void CustomEnable(tWidget *psWidget); +static void DrawToggle(const tButtonToggle *psButton, bool bOn); +static void OnProxyEntry(tWidget *psWidget); +static void OnCustomEntry(tWidget *psWidget); +static void OnTempUnit(tWidget *psWidget); +static void KeyEvent(tWidget *psWidget, uint32_t ui32Key, uint32_t ui32Event); + +//***************************************************************************** +// +// Defines for the basic screen area used by the application. +// +//***************************************************************************** +#define BG_MIN_X 8 +#define BG_MAX_X (320 - 8) +#define BG_MIN_Y 24 +#define BG_MAX_Y (240 - 8) +#define BG_COLOR_SETTINGS ClrGray +#define BG_COLOR_MAIN ClrBlack + +//***************************************************************************** +// +// The canvas widget acting as the background to the left portion of the +// display. +// +//***************************************************************************** +extern tCanvasWidget g_sMainBackground; + +char g_pcTempHighLow[40]="--/--C"; +Canvas(g_sTempHighLow, &g_sMainBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, 120, 195, 70, 30, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT | + CANVAS_STYLE_TEXT_TOP | CANVAS_STYLE_TEXT_OPAQUE, BG_COLOR_MAIN, + ClrWhite, ClrWhite, g_psFontCmss20, g_pcTempHighLow, 0, 0); + +char g_pcTemp[40]="--C"; +Canvas(g_sTemp, &g_sMainBackground, &g_sTempHighLow, 0, + &g_sKentec320x240x16_SSD2119, 20, 175, 100, 50, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_RIGHT | + CANVAS_STYLE_TEXT_TOP | CANVAS_STYLE_TEXT_OPAQUE, BG_COLOR_MAIN, + ClrWhite, ClrWhite, g_psFontCmss48, g_pcTemp, 0, 0); + +char g_pcHumidity[40]="Humidity: --%"; +Canvas(g_sHumidity, &g_sMainBackground, &g_sTemp, 0, + &g_sKentec320x240x16_SSD2119, 20, 140, 160, 25, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT | + CANVAS_STYLE_TEXT_OPAQUE, BG_COLOR_MAIN, ClrWhite, ClrWhite, + g_psFontCmss20, g_pcHumidity, 0, 0); + +char g_pcStatus[40]; +Canvas(g_sStatus, &g_sMainBackground, &g_sHumidity, 0, + &g_sKentec320x240x16_SSD2119, 20, 110, 160, 25, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT | + CANVAS_STYLE_TEXT_OPAQUE, BG_COLOR_MAIN, ClrWhite, ClrWhite, + g_psFontCmss20, g_pcStatus, 0, 0); + +char g_pcCity[40]; +Canvas(g_sCityName, &g_sMainBackground, &g_sStatus, 0, + &g_sKentec320x240x16_SSD2119, 20, 40, 240, 25, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT | + CANVAS_STYLE_TEXT_OPAQUE, BG_COLOR_MAIN, ClrWhite, ClrWhite, + g_psFontCmss20, g_pcCity, 0, 0); + +Canvas(g_sMainBackground, WIDGET_ROOT, 0, &g_sCityName, + &g_sKentec320x240x16_SSD2119, BG_MIN_X, BG_MIN_Y, + BG_MAX_X - BG_MIN_X, + BG_MAX_Y - BG_MIN_Y, CANVAS_STYLE_FILL, + BG_COLOR_MAIN, ClrWhite, ClrWhite, g_psFontCmss20, + 0, 0, 0); + +//***************************************************************************** +// +// Settings panel graphical variables. +// +//***************************************************************************** +extern tCanvasWidget g_sStatusPanel; + +// +// The temperature toggle button. +// +const tButtonToggle sTempToggle = +{ + {12, 90, 164, 117}, + {14, 92, 54, 115}, + "C", + "F", + "Temperature" +}; + +// +// The actual button to receive the press events for temperature unit changes. +// +RectangularButton(g_sTempUnit, &g_sStatusPanel, 0, 0, + &g_sKentec320x240x16_SSD2119, 14, 92, 40, 24, 0, ClrDarkGray, + ClrDarkGray, ClrDarkGray, ClrDarkGray, 0, 0, 0, 0, 0 ,0 , + OnTempUnit); + +//***************************************************************************** +// +// Proxy button and proxy text entry widgets. +// +//***************************************************************************** + +// +// The proxy toggle button. +// +const tButtonToggle sProxyToggle = +{ + // + // Outer border of button. + // + {12, 60, 116, 87}, + + // + // Button border. + // + {14, 62, 54, 85}, + + // + // Button Text. + // + "On", + "Off", + "Proxy" +}; + +// +// The actual button widget that receives the press events. +// +RectangularButton(g_sProxyEnable, &g_sStatusPanel, &g_sTempUnit, 0, + &g_sKentec320x240x16_SSD2119, 14, 62, 40, 24, + 0, ClrDarkGray, ClrDarkGray, ClrDarkGray, + ClrDarkGray, 0, 0, 0, 0, 0 ,0 , ProxyEnable); + +// +// The button that receives press events for text entry. +// +RectangularButton(g_sProxyAddr, &g_sStatusPanel, &g_sProxyEnable, 0, + &g_sKentec320x240x16_SSD2119, 118, 60, 190, 28, + PB_STYLE_FILL | PB_STYLE_TEXT | PB_STYLE_RELEASE_NOTIFY, ClrLightGrey, + ClrLightGrey, ClrWhite, ClrGray, g_psFontCmss16, + g_sConfig.pcProxy, 0, 0, 0 ,0 , OnProxyEntry); + +//***************************************************************************** +// +// Custom city button and city text entry widgets. +// +//***************************************************************************** + +// +// The custom city toggle button. +// +const tButtonToggle sCustomToggle = +{ + // + // Outer border of button. + // + {12, 30, 116, 57}, + + // + // Button border. + // + {14, 32, 54, 55}, + + "On", + "Off", + "City" +}; + +// +// The actual button widget that receives the press events. +// +RectangularButton(g_sCustomEnable, &g_sStatusPanel, &g_sProxyAddr, 0, + &g_sKentec320x240x16_SSD2119, 14, 32, 40, 24, + 0, ClrLightGrey, ClrLightGrey, ClrLightGrey, + ClrBlack, 0, 0, 0, 0, 0 ,0 , CustomEnable); + +// +// The text entry button for the custom city. +// +RectangularButton(g_sCustomCity, &g_sStatusPanel, &g_sCustomEnable, 0, + &g_sKentec320x240x16_SSD2119, 118, 30, 190, 28, + PB_STYLE_FILL | PB_STYLE_TEXT | PB_STYLE_RELEASE_NOTIFY, ClrLightGrey, + ClrLightGrey, ClrWhite, ClrGray, g_psFontCmss16, + g_sConfig.pcCustomCity, 0, 0, 0 ,0 , OnCustomEntry); + +// +// MAC Address display. +// +char g_pcMACAddr[40]; +Canvas(g_sMACAddr, &g_sStatusPanel, &g_sCustomCity, 0, + &g_sKentec320x240x16_SSD2119, 12, 180, 147, 20, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT, + ClrGray, ClrDarkGray, ClrBlack, g_psFontCmss16, + g_pcMACAddr, 0, 0); + +// +// IP Address display. +// +char g_pcIPAddr[20]; +Canvas(g_sIPAddr, &g_sStatusPanel, &g_sMACAddr, 0, + &g_sKentec320x240x16_SSD2119, 12, 200, 147, 20, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT, + ClrGray, ClrDarkGray, ClrBlack, g_psFontCmss16, + g_pcIPAddr, 0, 0); + +// +// Background of the settings panel. +// +Canvas(g_sStatusPanel, WIDGET_ROOT, 0, &g_sIPAddr, + &g_sKentec320x240x16_SSD2119, BG_MIN_X, BG_MIN_Y, + BG_MAX_X - BG_MIN_X, BG_MAX_Y - BG_MIN_Y, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT_RIGHT | + CANVAS_STYLE_TEXT_TOP, ClrGray, ClrWhite, ClrBlack, 0, + 0, 0, 0); + +//***************************************************************************** +// +// Keyboard +// +//***************************************************************************** + +// +// Keyboard cursor blink rate. +// +#define KEYBOARD_BLINK_RATE 100 + +// +// The current string pointer for the keyboard. +// +static char *g_pcKeyStr; + +// +// The current string index for the keyboard. +// +static uint32_t g_ui32StringIdx; + +// +// A place holder string used when nothing is being displayed on the keyboard. +// +static const char g_cTempStr = 0; + +// +// The current string width for the keyboard in pixels. +// +static int32_t g_i32StringWidth; + +// +// The cursor blink counter. +// +static volatile uint32_t g_ui32CursorDelay; + +extern tCanvasWidget g_sKeyboardBackground; + +// +// The keyboard widget used by the application. +// +Keyboard(g_sKeyboard, &g_sKeyboardBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, 8, 90, 300, 140, + KEYBOARD_STYLE_FILL | KEYBOARD_STYLE_AUTO_REPEAT | + KEYBOARD_STYLE_PRESS_NOTIFY | KEYBOARD_STYLE_RELEASE_NOTIFY | + KEYBOARD_STYLE_BG, + ClrBlack, ClrGray, ClrDarkGray, ClrGray, ClrBlack, g_psFontCmss14, + 100, 100, NUM_KEYBOARD_US_ENGLISH, g_psKeyboardUSEnglish, KeyEvent); + +// +// The keyboard text entry area. +// +Canvas(g_sKeyboardText, &g_sKeyboardBackground, &g_sKeyboard, 0, + &g_sKentec320x240x16_SSD2119, BG_MIN_X, BG_MIN_Y, + BG_MAX_X - BG_MIN_X, 60, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT, + ClrBlack, ClrWhite, ClrWhite, g_psFontCmss24, &g_cTempStr, 0 ,0 ); + +// +// The full background for the keyboard when it is takes over the screen. +// +Canvas(g_sKeyboardBackground, WIDGET_ROOT, 0, &g_sKeyboardText, + &g_sKentec320x240x16_SSD2119, BG_MIN_X, BG_MIN_Y, + BG_MAX_X - BG_MIN_X, BG_MAX_Y - BG_MIN_Y, + CANVAS_STYLE_FILL, ClrBlack, ClrWhite, ClrWhite, 0, 0, 0 ,0 ); + +//***************************************************************************** +// +// The main control paths for changing screens. +// +//***************************************************************************** +#define NUM_SCREENS 3 + +// +// Screen index values. +// +#define SCREEN_MAIN 0 +#define SCREEN_SETTINGS 1 +#define SCREEN_KEYBOARD 2 + +static struct +{ + tWidget *psWidget; + uint32_t ui32Up; + uint32_t ui32Down; + uint32_t ui32Left; + uint32_t ui32Right; +} +g_sScreens[NUM_SCREENS] = +{ + { + (tWidget *)&g_sMainBackground, + SCREEN_MAIN, SCREEN_SETTINGS, SCREEN_MAIN, SCREEN_MAIN + }, + { + (tWidget *)&g_sStatusPanel, + SCREEN_MAIN, SCREEN_SETTINGS, SCREEN_SETTINGS, SCREEN_SETTINGS + }, + { + (tWidget *)&g_sKeyboardBackground, + SCREEN_KEYBOARD, SCREEN_KEYBOARD, SCREEN_KEYBOARD, SCREEN_KEYBOARD + } +}; + +// +// The current active screen index. +// +static uint32_t g_i32ScreenIdx; + +//***************************************************************************** +// +// The state of the direction control for the application. +// +//***************************************************************************** +static struct +{ + // + // The initial touch location. + // + int32_t i32InitX; + int32_t i32InitY; + + // + // The current movement that was detected. + // + enum + { + iSwipeUp, + iSwipeDown, + iSwipeLeft, + iSwipeRight, + iSwipeNone, + } + eMovement; + + // + // Holds if the swipe detection is enabled. + // + bool bEnable; +} +g_sSwipe; + +//***************************************************************************** +// +// The screen buttons state structure. +// +//***************************************************************************** +struct +{ + // + // Indicates if an on-screen buttons are enabled. + // + bool bEnabled; + + // + // Indicates if an on-screen buttons can be pressed. + // + bool bActive; + + // + // The X position of an on-screen button. + // + int32_t i32X; + + // + // The Y position of an on-screen button. + // + int32_t i32Y; + + // + // The delay time before the on-screen button is removed. + // + volatile uint32_t ui32Delay; +} +g_sButtons; + +//***************************************************************************** +// +// Celsius to Fahrenheit conversion. +// +//***************************************************************************** +static int32_t +TempCtoF(int32_t i32Temp) +{ + // + // Only convert if measurements are not in Celsius. + // + if(g_sConfig.bCelsius == false) + { + i32Temp = ((i32Temp * 9) / 5) + 32; + } + + return(i32Temp); +} + +//***************************************************************************** +// +// Reset a cities information so that it can be properly updated. +// +//***************************************************************************** +void +ResetCity(uint32_t ui32Idx) +{ + g_psCityInfo[ui32Idx].sReport.i32Pressure = INVALID_INT; + g_psCityInfo[ui32Idx].sReport.i32Humidity = INVALID_INT; + g_psCityInfo[ui32Idx].sReport.i32Temp = INVALID_INT; + g_psCityInfo[ui32Idx].sReport.i32TempHigh = INVALID_INT; + g_psCityInfo[ui32Idx].sReport.i32TempLow = INVALID_INT; + g_psCityInfo[ui32Idx].sReport.pcDescription = 0; + g_psCityInfo[ui32Idx].sReport.pui8Image = 0; + g_psCityInfo[ui32Idx].sReport.ui32SunRise = 0; + g_psCityInfo[ui32Idx].sReport.ui32SunSet = 0; + g_psCityInfo[ui32Idx].sReport.ui32Time = 0; + g_psCityInfo[ui32Idx].ui32LastUpdate = 0; + + // + // Make sure to copy the name into the string for a custom city. + // + if(ui32Idx == NUM_CITIES - 1) + { + // + // Custom city is in another list. + // + g_psCityInfo[ui32Idx].pcName = g_sConfig.pcCustomCity; + + if(g_ui32CityActive == ui32Idx) + { + // + // Update the custom city name. + // + ustrncpy(g_pcCity, g_psCityInfo[ui32Idx].pcName, sizeof(g_pcCity)); + } + + // + // The custom city only needs an update if enabled. + // + if(g_sConfig.bCustomEnabled) + { + g_psCityInfo[ui32Idx].bNeedsUpdate = true; + } + } + else + { + g_psCityInfo[ui32Idx].pcName = g_ppcCityNames[ui32Idx]; + g_psCityInfo[ui32Idx].bNeedsUpdate = true; + } +} + +//***************************************************************************** +// +// Handle keyboard updates. +// +//***************************************************************************** +void +HandleKeyboard(void) +{ + // + // Nothing to do if the keyboard is not active. + // + if(g_i32ScreenIdx != SCREEN_KEYBOARD) + { + return; + } + + // + // If the mid value is hit then clear the cursor. + // + if(g_ui32CursorDelay == KEYBOARD_BLINK_RATE / 2) + { + GrContextForegroundSet(&g_sContext, ClrBlack); + + // + // Keep the counter moving now that the clearing has been handled. + // + g_ui32CursorDelay--; + } + else if(g_ui32CursorDelay == 0) + { + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Reset the blink delay now that the drawing of the cursor has been + // handled. + // + g_ui32CursorDelay = KEYBOARD_BLINK_RATE; + } + else + { + return; + } + + // + // Draw the cursor only if it is time. + // + GrLineDrawV(&g_sContext, BG_MIN_X + g_i32StringWidth , BG_MIN_Y + 20, + BG_MIN_Y + 40); +} + +//***************************************************************************** +// +// Draw the pop up buttons on the screen. +// +//***************************************************************************** +static void +DrawButtons(int32_t i32Offset, bool bClear) +{ + static const tRectangle sRectTop = + { + 140, + BG_MIN_Y, + 171, + BG_MIN_Y + 10, + }; + static const tRectangle sRectRight = + { + BG_MAX_X - 11, + BG_MIN_Y - 20 + ((BG_MAX_Y - BG_MIN_Y) / 2), + BG_MAX_X, + BG_MIN_Y - 20 + ((BG_MAX_Y - BG_MIN_Y) / 2) + 40, + }; + static const tRectangle sRectLeft = + { + BG_MIN_X, + BG_MIN_Y - 20 + ((BG_MAX_Y - BG_MIN_Y) / 2), + BG_MIN_X + 10, + BG_MIN_Y - 20 + ((BG_MAX_Y - BG_MIN_Y) / 2) + 40, + }; + + // + // Only draw if they are enabled. + // + if(g_sButtons.bEnabled == false) + { + return; + } + + // + // Draw the three pop up buttons. + // + if(g_i32ScreenIdx == SCREEN_MAIN) + { + GrContextForegroundSet(&g_sContext, ClrBlack); + GrContextBackgroundSet(&g_sContext, ClrGray); + + GrRectFill(&g_sContext, &sRectRight); + GrRectFill(&g_sContext, &sRectLeft); + + if(bClear == false) + { + GrLineDrawH(&g_sContext, 140, 171, BG_MIN_Y + 10 + i32Offset); + + GrImageDraw(&g_sContext, g_pui8DownTabImage, 140, + BG_MIN_Y + i32Offset); + + GrTransparentImageDraw(&g_sContext, g_pui8RightImage, + BG_MAX_X - 10 + i32Offset, + BG_MIN_Y - 20 + ((BG_MAX_Y - BG_MIN_Y) / 2), + 1); + GrTransparentImageDraw(&g_sContext, g_pui8LeftImage, + BG_MIN_X - i32Offset, + BG_MIN_Y - 20 + ((BG_MAX_Y - BG_MIN_Y) / 2), + 1); + } + else + { + GrRectFill(&g_sContext, &sRectTop); + } + } + else if(g_i32ScreenIdx == SCREEN_SETTINGS) + { + GrContextForegroundSet(&g_sContext, ClrGray); + GrContextBackgroundSet(&g_sContext, ClrWhite); + if(bClear == false) + { + GrLineDrawH(&g_sContext, 140, 171, BG_MAX_Y - 11 - i32Offset); + GrImageDraw(&g_sContext, g_pui8UpTabImage, 140, + BG_MAX_Y - 10 - i32Offset); + } + } +} + +//***************************************************************************** +// +// Disable the pop up buttons. +// +//***************************************************************************** +static void +ButtonsDisable(void) +{ + g_sButtons.bEnabled = false; + g_sButtons.bActive = false; +} + +//***************************************************************************** +// +// Draw the weather image icon. +// +//***************************************************************************** +static void +DrawIcon(uint32_t ui32Idx) +{ + if(g_psCityInfo[ui32Idx].sReport.pui8Image) + { + if((g_psCityInfo[ui32Idx].sReport.ui32Time > + g_psCityInfo[ui32Idx].sReport.ui32SunRise) && + (g_psCityInfo[ui32Idx].sReport.ui32Time < + g_psCityInfo[ui32Idx].sReport.ui32SunSet)) + { + GrTransparentImageDraw(&g_sContext, g_pui8SunImage, + 176, 65, 0); + + if(g_psCityInfo[ui32Idx].sReport.pui8Image != g_pui8SunImage) + { + GrTransparentImageDraw(&g_sContext, + g_psCityInfo[ui32Idx].sReport.pui8Image, + 176, 80, 0); + } + } + else + { + GrTransparentImageDraw(&g_sContext, g_pui8MoonImage, + 176, 65, 0); + if(g_psCityInfo[ui32Idx].sReport.pui8Image != g_pui8SunImage) + { + GrTransparentImageDraw(&g_sContext, + g_psCityInfo[ui32Idx].sReport.pui8Image, + 176, 80, 0); + } + } + } +} + +//***************************************************************************** +// +// Handle the animation when switching between screens. +// +//***************************************************************************** +void +AnimatePanel(uint32_t ui32Color) +{ + int32_t i32Idx; + + GrContextForegroundSet(&g_sContext, ui32Color); + + if(g_i32ScreenIdx == SCREEN_SETTINGS) + { + for(i32Idx = BG_MIN_Y; i32Idx < BG_MAX_Y; i32Idx++) + { + GrLineDrawH(&g_sContext, BG_MIN_X, BG_MAX_X, i32Idx); + + if(i32Idx == 58) + { + if(g_sConfig.bCustomEnabled) + { + // + // Draw the text black for the custom city when it is + // enabled. + // + PushButtonTextColorSet(&g_sCustomCity, ClrBlack); + } + else + { + // + // Gray out the text entry for the custom city when it is + // disabled. + // + PushButtonTextColorSet(&g_sCustomCity, ClrGray); + } + WidgetPaint((tWidget *)&g_sCustomCity); + DrawToggle(&sCustomToggle, g_sConfig.bCustomEnabled); + GrContextForegroundSet(&g_sContext, ui32Color); + WidgetMessageQueueProcess(); + } + else if(i32Idx == 88) + { + if(g_sConfig.bProxyEnabled) + { + // + // Enable text entry area for the proxy text entry. + // + PushButtonTextColorSet(&g_sProxyAddr, ClrBlack); + } + else + { + // + // Gray out the text entry area for the proxy text entry. + // + PushButtonTextColorSet(&g_sProxyAddr, ClrGray); + } + DrawToggle(&sProxyToggle, g_sConfig.bProxyEnabled); + WidgetPaint((tWidget *)&g_sProxyAddr); + GrContextForegroundSet(&g_sContext, ui32Color); + WidgetMessageQueueProcess(); + } + else if(i32Idx == 116) + { + DrawToggle(&sTempToggle, g_sConfig.bCelsius); + WidgetPaint((tWidget *)&g_sTempUnit); + GrContextForegroundSet(&g_sContext, ui32Color); + WidgetMessageQueueProcess(); + } + else if(i32Idx == 200) + { + WidgetPaint((tWidget *)&g_sMACAddr); + WidgetMessageQueueProcess(); + } + else if(i32Idx == 220) + { + WidgetPaint((tWidget *)&g_sIPAddr); + WidgetMessageQueueProcess(); + } + + SysCtlDelay(SCREEN_ANIMATE_DELAY); + } + } + else if(g_i32ScreenIdx == SCREEN_MAIN) + { + for(i32Idx = BG_MAX_Y; i32Idx >= BG_MIN_Y; i32Idx--) + { + GrLineDrawH(&g_sContext, BG_MIN_X, BG_MAX_X, i32Idx); + + if(i32Idx == 175) + { + WidgetPaint((tWidget *)&g_sTempHighLow); + WidgetPaint((tWidget *)&g_sTemp); + WidgetMessageQueueProcess(); + } + else if(i32Idx == 140) + { + WidgetPaint((tWidget *)&g_sHumidity); + WidgetMessageQueueProcess(); + } + else if(i32Idx == 110) + { + WidgetPaint((tWidget *)&g_sStatus); + WidgetMessageQueueProcess(); + } + else if(i32Idx == 65) + { + DrawIcon(g_ui32CityActive); + } + else if(i32Idx == 40) + { + WidgetPaint((tWidget *)&g_sCityName); + WidgetMessageQueueProcess(); + } + + SysCtlDelay(SCREEN_ANIMATE_DELAY); + } + } +} + +//***************************************************************************** +// +// Animate Buttons. +// +//***************************************************************************** +void +AnimateButtons(bool bInit) +{ + if(bInit) + { + g_sButtons.i32X = 0; + g_sButtons.i32Y = 0; + g_sButtons.bEnabled = true; + g_sButtons.bActive = false; + g_sButtons.ui32Delay = 0; + } + else if(g_sButtons.bEnabled == false) + { + // + // Just return if the buttons are not on screen. + // + return; + } + + if(g_sButtons.ui32Delay == 0) + { + g_sButtons.ui32Delay = 6; + + GrContextForegroundSet(&g_sContext, ClrBlack); + GrContextBackgroundSet(&g_sContext, ClrGray); + + if((bInit == false) || (g_sButtons.bActive == true)) + { + // + // Update the buttons. + // + DrawButtons(g_sButtons.i32X - g_sButtons.i32Y, true); + + if(g_sButtons.i32X < 3) + { + g_sButtons.i32X++; + } + else + { + g_sButtons.i32Y++; + } + } + + if(g_sButtons.bActive == false) + { + // + // Update the buttons. + // + DrawButtons(g_sButtons.i32X - g_sButtons.i32Y, false); + + if(g_sButtons.i32Y >= 3) + { + g_sButtons.bActive = true; + g_sButtons.ui32Delay = 200; + } + } + else if(g_i32ScreenIdx == SCREEN_MAIN) + { + ButtonsDisable(); + } + } +} + +//***************************************************************************** +// +// Clears the full screen. +// +//***************************************************************************** +void +ClearScreen(tContext *psContext) +{ + static const tRectangle sRect = + { + 0, + 0, + 319, + 239, + }; + + GrRectFill(psContext, &sRect); +} + +//***************************************************************************** +// +// Clears the main screens background. +// +//***************************************************************************** +void +ClearBackground(tContext *psContext) +{ + static const tRectangle sRect = + { + BG_MIN_X, + BG_MIN_Y, + BG_MAX_X, + BG_MAX_Y, + }; + + GrRectFill(psContext, &sRect); +} + +//***************************************************************************** +// +// Update the IP address string. +// +//***************************************************************************** +void +UpdateIPAddress(char *pcAddr, uint32_t ipAddr) +{ + uint8_t *pui8Temp = (uint8_t *)&ipAddr; + + if(ipAddr == 0) + { + ustrncpy(pcAddr, "IP: ---.---.---.---", sizeof(g_pcIPAddr)); + } + else + { + usprintf(pcAddr,"IP: %d.%d.%d.%d", pui8Temp[0], pui8Temp[1], + pui8Temp[2], pui8Temp[3]); + } + + // + // If the status panel is active then update the address. + // + if(g_i32ScreenIdx == SCREEN_SETTINGS) + { + WidgetPaint((tWidget *)&g_sIPAddr); + } +} + +//***************************************************************************** +// +// Handles the proxy select button presses. +// +//***************************************************************************** +void +ProxyEnable(tWidget *psWidget) +{ + // + // If a city was waiting to be updated then reset its data. + // + if(g_iState != STATE_CONNECTED_IDLE) + { + ResetCity(g_ui32CityUpdating); + } + + // + // Reset the state to not connected. + // + g_iState = STATE_NOT_CONNECTED; + + // + // Toggle the proxy setting. + // + if(g_sConfig.bProxyEnabled) + { + g_sConfig.bProxyEnabled = false; + + // + // Reset the IP address on the screen and disable the proxy which + // resets the network interface and starts DHCP again. + // + UpdateIPAddress(g_pcIPAddr, 0); + EthClientProxySet(0); + + // + // Gray out the text entry area for the proxy text entry. + // + PushButtonTextColorSet(&g_sProxyAddr, ClrGray); + } + else + { + g_sConfig.bProxyEnabled = true; + + // + // Enable the proxy which resets the network interface and starts DHCP + // again. + // + EthClientProxySet(g_sConfig.pcProxy); + + // + // Enable text entry area for the proxy text entry. + // + PushButtonTextColorSet(&g_sProxyAddr, ClrBlack); + } + + // + // Update the toggle button. + // + DrawToggle(&sProxyToggle, g_sConfig.bProxyEnabled); + WidgetPaint((tWidget *)&g_sProxyAddr); + + // + // A change was made so update the settings in flash. + // + g_sConfig.bSave = true; +} + +//***************************************************************************** +// +// Handles the custom enable button presses. +// +//***************************************************************************** +void +CustomEnable(tWidget *psWidget) +{ + // + // Toggle the custom city toggle button. + // + if(g_sConfig.bCustomEnabled) + { + g_sConfig.bCustomEnabled = false; + + // + // Gray out the text entry for the custom city when it is disabled. + // + PushButtonTextColorSet(&g_sCustomCity, ClrGray); + + // + // Reset the custom city data. + // + ResetCity(NUM_CITIES - 1); + + if(g_ui32CityActive == (NUM_CITIES - 1)) + { + // + // Move to the first city in the list. + // + g_ui32CityActive = 0; + + // + // Since we must be on the settings screen to change this, then + // just update the city and do not draw it. + // + UpdateCity(g_ui32CityActive, false); + } + } + else + { + g_sConfig.bCustomEnabled = true; + + // + // Draw the text black for the custom city when it is enabled. + // + PushButtonTextColorSet(&g_sCustomCity, ClrBlack); + } + + // + // Update the toggle button. + // + DrawToggle(&sCustomToggle, g_sConfig.bCustomEnabled); + WidgetPaint((tWidget *)&g_sCustomCity); + + // + // A change was made so update the settings in flash. + // + g_sConfig.bSave = true; +} + +//***************************************************************************** +// +// Handles when a key is pressed on the keyboard. +// +//***************************************************************************** +void +KeyEvent(tWidget *psWidget, uint32_t ui32Key, uint32_t ui32Event) +{ + switch(ui32Key) + { + // + // Look for a backspace key press. + // + case UNICODE_BACKSPACE: + { + if(ui32Event == KEYBOARD_EVENT_PRESS) + { + if(g_ui32StringIdx != 0) + { + g_ui32StringIdx--; + g_pcKeyStr[g_ui32StringIdx] = 0; + } + + WidgetPaint((tWidget *)&g_sKeyboardText); + + // + // Save the pixel width of the current string. + // + g_i32StringWidth = GrStringWidthGet(&g_sContext, g_pcKeyStr, + 40); + } + break; + } + // + // Look for an enter/return key press. This will exit the keyboard and + // return to the current active screen. + // + case UNICODE_RETURN: + { + if(ui32Event == KEYBOARD_EVENT_RELEASE) + { + // + // Get rid of the keyboard widget. + // + WidgetRemove(g_sScreens[g_i32ScreenIdx].psWidget); + + // + // Switch back to the previous screen and add its widget back. + // + g_i32ScreenIdx = SCREEN_SETTINGS; + WidgetAdd(WIDGET_ROOT, g_sScreens[g_i32ScreenIdx].psWidget); + + // + // If the proxy was disabled and we were modifying the proxy + // string the re-enable the proxy. + // + if((!g_sConfig.bProxyEnabled) && + (g_pcKeyStr == g_sConfig.pcProxy)) + { + // + // Enable the proxy since it has just been updated. This + // also restarts DHCP for a new address. + // + g_sConfig.bProxyEnabled = true; + EthClientProxySet(g_sConfig.pcProxy); + } + else if((!g_sConfig.bCustomEnabled) && + (g_pcKeyStr == g_sConfig.pcCustomCity)) + { + // + // If the custom city string was being modified then make + // sure to update it. + // + g_sConfig.bCustomEnabled = true; + + // + // Reset the city data. + // + ResetCity(NUM_CITIES - 1); + + // + // Update the city with the reset values. + // + if(g_ui32CityActive == (NUM_CITIES - 1)) + { + UpdateCity(g_ui32CityActive, false); + } + } + + // + // If returning to the main screen then re-draw the frame to + // indicate the main screen. + // + if(g_i32ScreenIdx == SCREEN_MAIN) + { + FrameDraw(&g_sContext, "qs-weather"); + WidgetPaint(g_sScreens[g_i32ScreenIdx].psWidget); + } + else + { + // + // Returning to the settings screen. + // + FrameDraw(&g_sContext, "Settings"); + WidgetPaint(g_sScreens[g_i32ScreenIdx].psWidget); + AnimateButtons(true); + WidgetMessageQueueProcess(); + + // + // Redraw all the toggle buttons. + // + DrawToggle(&sTempToggle, g_sConfig.bCelsius); + DrawToggle(&sProxyToggle, g_sConfig.bProxyEnabled); + DrawToggle(&sCustomToggle, g_sConfig.bCustomEnabled); + } + + // + // Enable gestures. + // + g_sSwipe.bEnable = true; + } + break; + } + // + // If the key is not special then update the text string. + // + default: + { + if(ui32Event == KEYBOARD_EVENT_PRESS) + { + // + // If the proxy is enabled and we get a key stroke then disable + // the proxy and wait for the new proxy string. + // + if((g_sConfig.bProxyEnabled) && + (g_pcKeyStr == g_sConfig.pcProxy)) + { + // + // Disable proxy while updating the proxy string. This + // starts DHCP for a new address. + // + g_sConfig.bProxyEnabled = false; + EthClientProxySet(0); + } + if((g_sConfig.bCustomEnabled) && + (g_pcKeyStr == g_sConfig.pcCustomCity)) + { + // + // Temporarily disable custom city while it is being + // modified. + // + g_sConfig.bCustomEnabled = false; + } + + // + // A change was made so update the settings in flash. + // + g_sConfig.bSave = true; + + // + // Set the string to the current string to be updated. + // + if(g_ui32StringIdx == 0) + { + CanvasTextSet(&g_sKeyboardText, g_pcKeyStr); + } + g_pcKeyStr[g_ui32StringIdx] = (char)ui32Key; + g_ui32StringIdx++; + g_pcKeyStr[g_ui32StringIdx] = 0; + + WidgetPaint((tWidget *)&g_sKeyboardText); + + // + // Save the pixel width of the current string. + // + g_i32StringWidth = GrStringWidthGet(&g_sContext, g_pcKeyStr, + 40); + } + break; + } + } +} + +//***************************************************************************** +// +// Draws a toggle button. +// +//***************************************************************************** +void +DrawToggle(const tButtonToggle *psButton, bool bOn) +{ + tRectangle sRect; + int16_t i16X, i16Y; + + // + // Copy the data out of the bounds of the button. + // + sRect = psButton->sRectButton; + + GrContextForegroundSet(&g_sContext, ClrLightGrey); + GrRectFill(&g_sContext, &psButton->sRectContainer); + + // + // Copy the data out of the bounds of the button. + // + sRect = psButton->sRectButton; + + GrContextForegroundSet(&g_sContext, ClrDarkGray); + GrRectFill(&g_sContext, &psButton->sRectButton); + + if(bOn) + { + sRect.i16XMin += 2; + sRect.i16YMin += 2; + sRect.i16XMax -= 15; + sRect.i16YMax -= 2; + } + else + { + sRect.i16XMin += 15; + sRect.i16YMin += 2; + sRect.i16XMax -= 2; + sRect.i16YMax -= 2; + } + GrContextForegroundSet(&g_sContext, ClrLightGrey); + GrRectFill(&g_sContext, &sRect); + + GrContextFontSet(&g_sContext, &g_sFontCm16); + GrContextForegroundSet(&g_sContext, ClrBlack); + GrContextBackgroundSet(&g_sContext, ClrLightGrey); + + i16X = sRect.i16XMin + ((sRect.i16XMax - sRect.i16XMin) / 2); + i16Y = sRect.i16YMin + ((sRect.i16YMax - sRect.i16YMin) / 2); + + if(bOn) + { + GrStringDrawCentered(&g_sContext, psButton->pcOn, -1, i16X, i16Y, + true); + } + else + { + GrStringDrawCentered(&g_sContext, psButton->pcOff, -1, i16X, i16Y, + true); + } + + if(psButton->pcLabel) + { + GrStringDraw(&g_sContext, psButton->pcLabel, -1, + psButton->sRectButton.i16XMax + 2, + psButton->sRectButton.i16YMin + 6, + true); + } +} + +//***************************************************************************** +// +// Handles the temperature unit select button is pressed. +// +//***************************************************************************** +static void +OnTempUnit(tWidget *psWidget) +{ + // + // Toggle the Celsius state. + // + if(g_sConfig.bCelsius) + { + g_sConfig.bCelsius = false; + + } + else + { + g_sConfig.bCelsius = true; + } + + // + // Update the toggle button and the current city. + // + DrawToggle(&sTempToggle, g_sConfig.bCelsius); + UpdateCity(g_ui32CityActive, false); + + // + // A change was made so update the settings in flash. + // + g_sConfig.bSave = true; +} + +//***************************************************************************** +// +// Handles when the proxy text area is pressed. +// +//***************************************************************************** +static void +OnProxyEntry(tWidget *psWidget) +{ + // + // Only respond if the proxy has been enabled. + // + if(g_sConfig.bProxyEnabled) + { + // + // Disable swiping while the keyboard is active. + // + g_sSwipe.bEnable = false; + + // + // The keyboard string is now the proxy address so set the string, + // reset the string index and width to 0. + // + g_pcKeyStr = g_sConfig.pcProxy; + g_ui32StringIdx = 0; + g_i32StringWidth = 0; + + // + // Set the initial string to a null string so that nothing is shown. + // + CanvasTextSet(&g_sKeyboardText, &g_cTempStr); + + // + // Remove the current widget so that it is not used while keyboard + // is active. + // + WidgetRemove(g_sScreens[g_i32ScreenIdx].psWidget); + + // + // Activate the keyboard. + // + g_i32ScreenIdx = SCREEN_KEYBOARD; + WidgetAdd(WIDGET_ROOT, g_sScreens[g_i32ScreenIdx].psWidget); + + // + // Clear the main screen area with the settings background color. + // + GrContextForegroundSet(&g_sContext, BG_COLOR_SETTINGS); + ClearBackground(&g_sContext); + + GrContextFontSet(&g_sContext, g_psFontCmss24); + WidgetPaint((tWidget *)&g_sKeyboardBackground); + } +} + +//***************************************************************************** +// +// Handles when the custom text area is pressed. +// +//***************************************************************************** +static void +OnCustomEntry(tWidget *psWidget) +{ + // + // Only respond if the custom has been enabled. + // + if(g_sConfig.bCustomEnabled) + { + // + // Disable swiping while the keyboard is active. + // + g_sSwipe.bEnable = false; + + // + // The keyboard string is now the custom city so set the string, + // reset the string index and width to 0. + // + g_pcKeyStr = g_sConfig.pcCustomCity; + g_ui32StringIdx = 0; + g_i32StringWidth = 0; + + // + // Set the initial string to a null string so that nothing is shown. + // + CanvasTextSet(&g_sKeyboardText, &g_cTempStr); + + // + // Remove the current widget so that it is not used while keyboard + // is active. + // + WidgetRemove(g_sScreens[g_i32ScreenIdx].psWidget); + + // + // Activate the keyboard. + // + g_i32ScreenIdx = SCREEN_KEYBOARD; + WidgetAdd(WIDGET_ROOT, g_sScreens[g_i32ScreenIdx].psWidget); + + // + // Clear the main screen area with the settings background color. + // + GrContextForegroundSet(&g_sContext, BG_COLOR_SETTINGS); + ClearBackground(&g_sContext); + + GrContextFontSet(&g_sContext, g_psFontCmss24); + WidgetPaint((tWidget *)&g_sKeyboardBackground); + } +} + +//***************************************************************************** +// +// Update the MAC address string. +// +//***************************************************************************** +void +UpdateMACAddr(void) +{ + uint8_t pui8MACAddr[6]; + + EthClientMACAddrGet(pui8MACAddr); + + usprintf(g_pcMACAddr, "MAC: %02x:%02x:%02x:%02x:%02x:%02x", + pui8MACAddr[0], pui8MACAddr[1], pui8MACAddr[2], pui8MACAddr[3], + pui8MACAddr[4], pui8MACAddr[5]); +} + +//***************************************************************************** +// +// The weather event handler. +// +//***************************************************************************** +void +WeatherEvent(uint32_t ui32Event, void* pvData, uint32_t ui32Param) +{ + if(ui32Event == ETH_EVENT_RECEIVE) + { + // + // Let the main loop update the city. + // + g_iState = STATE_UPDATE_CITY; + + g_psCityInfo[g_ui32CityUpdating].ui32LastUpdate = + g_psCityInfo[g_ui32CityUpdating].sReport.ui32Time; + } + else if(ui32Event == ETH_EVENT_INVALID_REQ) + { + g_psCityInfo[g_ui32CityUpdating].sReport.pcDescription = g_pcNotFound; + g_iState = STATE_UPDATE_CITY; + } + else if(ui32Event == ETH_EVENT_CLOSE) + { + if(g_iState == STATE_WAIT_DATA) + { + g_psCityInfo[g_ui32CityUpdating].sReport.pcDescription = + g_pcServerBusy; + + g_iState = STATE_UPDATE_CITY; + } + } + + // + // If the update indicated no time, then just set the time to a value + // to indicate that at least the update occurred. + // + if(g_psCityInfo[g_ui32CityUpdating].ui32LastUpdate == 0) + { + // + // Failed to update for some reason. + // + g_psCityInfo[g_ui32CityUpdating].ui32LastUpdate = 1; + } +} + +//***************************************************************************** +// +// The interrupt handler for the SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Call the lwIP timer handler. + // + EthClientTick(SYSTEM_TICK_MS); + + // + // Handle the delay between accesses to the weather server. + // + if(g_ui32Delay != 0) + { + g_ui32Delay--; + } + + if(g_sButtons.ui32Delay != 0) + { + g_sButtons.ui32Delay--; + } + + // + // Timeout for the screen saver. + // + if(g_ui32ScreenSaver != 0) + { + g_ui32ScreenSaver--; + } + + // + // Stop updating until the toggle event points have been handled. + // + if((g_ui32CursorDelay != 0) && + (g_ui32CursorDelay != (KEYBOARD_BLINK_RATE / 2))) + { + g_ui32CursorDelay--; + } +} + +//***************************************************************************** +// +// Network events handler. +// +//***************************************************************************** +void +EnetEvents(uint32_t ui32Event, void *pvData, uint32_t ui32Param) +{ + if(ui32Event == ETH_EVENT_CONNECT) + { + g_iState = STATE_NEW_CONNECTION; + + // + // Update the string version of the address. + // + UpdateIPAddress(g_pcIPAddr, EthClientAddrGet()); + } + else if(ui32Event == ETH_EVENT_DISCONNECT) + { + // + // If a city was waiting to be updated then reset its data. + // + if(g_iState != STATE_CONNECTED_IDLE) + { + ResetCity(g_ui32CityUpdating); + } + + g_iState = STATE_NOT_CONNECTED; + + // + // Update the address to 0.0.0.0. + // + UpdateIPAddress(g_pcIPAddr, 0); + } +} + +//***************************************************************************** +// +// Update the information for the current city. +// +//***************************************************************************** +void +UpdateCity(uint32_t ui32Idx, bool bDraw) +{ + char cUnits; + bool bIntDisabled; + + // + // Need to disable interrupts since this can be called from interrupt + // handlers for both System tick and Ethernet controller and from the + // main routine. + // + bIntDisabled = IntMasterDisable(); + + if(g_sConfig.bCelsius) + { + cUnits = 'C'; + } + else + { + cUnits = 'F'; + } + + // + // Update the city. + // + ustrncpy(g_pcCity, g_psCityInfo[ui32Idx].pcName, sizeof(g_pcCity)); + + // + // Check if the humidity value is valid. + // + if(g_psCityInfo[ui32Idx].sReport.i32Humidity == INVALID_INT) + { + usprintf(g_pcHumidity, "Humidity: --%%"); + } + else + { + usprintf(g_pcHumidity, "Humidity: %d%%", + g_psCityInfo[ui32Idx].sReport.i32Humidity); + } + + // + // Copy the updated description. + // + if(g_psCityInfo[ui32Idx].sReport.pcDescription) + { + ustrncpy(g_pcStatus, g_psCityInfo[ui32Idx].sReport.pcDescription, + sizeof(g_pcStatus)); + } + else if((g_ui32CityUpdating == g_ui32CityActive) && + (g_iState != STATE_NOT_CONNECTED)) + { + // + // Waiting on data for this city. + // + ustrncpy(g_pcStatus, g_pcWaitData, sizeof(g_pcStatus)); + } + else + { + // + // No current status. + // + ustrncpy(g_pcStatus, "--", sizeof(g_pcStatus)); + } + + + // + // Check if the temperature value is valid. + // + if(g_psCityInfo[ui32Idx].sReport.i32Temp == INVALID_INT) + { + usprintf(g_pcTemp, "--%c", cUnits); + usprintf(g_pcTempHighLow, "--/--%c", + TempCtoF(g_psCityInfo[ui32Idx].sReport.i32TempHigh), + TempCtoF(g_psCityInfo[ui32Idx].sReport.i32TempLow), cUnits); + } + else + { + usprintf(g_pcTemp, "%d%c", + TempCtoF(g_psCityInfo[ui32Idx].sReport.i32Temp), cUnits); + usprintf(g_pcTempHighLow, "%d/%d%c", + TempCtoF(g_psCityInfo[ui32Idx].sReport.i32TempHigh), + TempCtoF(g_psCityInfo[ui32Idx].sReport.i32TempLow), cUnits); + } + + // + // Update the screen contents if requested. + // + if(bDraw) + { + GrContextForegroundSet(&g_sContext, BG_COLOR_MAIN); + ClearBackground(&g_sContext); + WidgetPaint((tWidget *)&g_sCityName); + WidgetPaint((tWidget *)&g_sStatus); + WidgetPaint((tWidget *)&g_sHumidity); + WidgetPaint((tWidget *)&g_sTemp); + WidgetPaint((tWidget *)&g_sTempHighLow); + + DrawIcon(ui32Idx); + + DrawButtons(0, false); + } + + if(bIntDisabled == false) + { + IntMasterEnable(); + } +} + +//***************************************************************************** +// +// The callback function that is called by the touch screen driver to indicate +// activity on the touch screen. +// +//***************************************************************************** +int32_t +TouchCallback(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + int32_t i32XDiff, i32YDiff; + + // + // Reset the timeout for the screen saver. + // + g_ui32ScreenSaver = 60 * SYSTEM_TICK_S; + + if(g_sSwipe.bEnable) + { + switch(ui32Message) + { + // + // The user has just touched the screen. + // + case WIDGET_MSG_PTR_DOWN: + { + // + // Save this press location. + // + g_sSwipe.i32InitX = i32X; + g_sSwipe.i32InitY = i32Y; + + // + // Done handling this message. + // + break; + } + + // + // The user has moved the touch location on the screen. + // + case WIDGET_MSG_PTR_MOVE: + { + // + // Done handling this message. + // + break; + } + + // + // The user is no longer touching the screen. + // + case WIDGET_MSG_PTR_UP: + { + // + // Indicate that no key is being pressed. + // + i32XDiff = i32X - g_sSwipe.i32InitX; + i32YDiff = i32Y - g_sSwipe.i32InitY; + + // + // Dead zone for just a button press. + // + if(((i32XDiff < SWIPE_MIN_DIFF) && + (i32XDiff > -SWIPE_MIN_DIFF)) && + ((i32YDiff < SWIPE_MIN_DIFF) && + (i32YDiff > -SWIPE_MIN_DIFF))) + { + if(g_sButtons.bActive) + { + // + // Reset the delay. + // + g_sButtons.ui32Delay = 200; + + if(i32X < 30) + { + g_sSwipe.eMovement = iSwipeRight; + } + else if(i32X > 290) + { + g_sSwipe.eMovement = iSwipeLeft; + } + else if(i32Y < 40) + { + g_sSwipe.eMovement = iSwipeDown; + } + else if(i32Y > 200) + { + g_sSwipe.eMovement = iSwipeUp; + } + else + { + g_sSwipe.eMovement = iSwipeNone; + } + } + else + { + if(g_i32ScreenIdx == SCREEN_MAIN) + { + AnimateButtons(true); + } + } + break; + } + + // + // If Y movement dominates then this is an up/down motion. + // + if(i32YDiff/i32XDiff) + { + if(i32YDiff < 0) + { + g_sSwipe.eMovement = iSwipeUp; + } + else + { + g_sSwipe.eMovement = iSwipeDown; + } + } + else + { + if(i32XDiff > 0) + { + g_sSwipe.eMovement = iSwipeRight; + } + else + { + g_sSwipe.eMovement = iSwipeLeft; + } + } + + // + // Done handling this message. + // + break; + } + } + } + WidgetPointerMessage(ui32Message, i32X, i32Y); + + return(0); +} + +//***************************************************************************** +// +// Handle the touch screen movements. +// +//***************************************************************************** +void +HandleMovement(void) +{ + uint32_t ui32NumCities; + uint32_t ui32NewIdx; + + if(g_sSwipe.eMovement != iSwipeNone) + { + if(g_sConfig.bCustomEnabled) + { + ui32NumCities = NUM_CITIES; + } + else + { + ui32NumCities = NUM_CITIES - 1; + } + + switch(g_sSwipe.eMovement) + { + case iSwipeUp: + { + ui32NewIdx = g_sScreens[g_i32ScreenIdx].ui32Up; + + break; + } + case iSwipeDown: + { + ui32NewIdx = g_sScreens[g_i32ScreenIdx].ui32Down; + + break; + } + case iSwipeRight: + { + ui32NewIdx = g_sScreens[g_i32ScreenIdx].ui32Left; + + // + // Check if on main screen. + // + if(g_i32ScreenIdx == SCREEN_MAIN) + { + if(g_ui32CityActive == 0) + { + g_ui32CityActive = ui32NumCities - 1; + + } + else + { + g_ui32CityActive--; + } + + UpdateCity(g_ui32CityActive, true); + } + + break; + } + case iSwipeLeft: + { + ui32NewIdx = g_sScreens[g_i32ScreenIdx].ui32Right; + + // + // Check if on main screen. + // + if(g_i32ScreenIdx == SCREEN_MAIN) + { + if(g_ui32CityActive >= ui32NumCities - 1) + { + g_ui32CityActive = 0; + } + else + { + g_ui32CityActive++; + } + + UpdateCity(g_ui32CityActive, true); + } + + break; + } + default: + { + ui32NewIdx = g_i32ScreenIdx; + break; + } + } + + // + // Check if the panel has changed. + // + if(ui32NewIdx != g_i32ScreenIdx) + { + // + // Remove the current widget. + // + WidgetRemove(g_sScreens[g_i32ScreenIdx].psWidget); + + WidgetAdd(WIDGET_ROOT, g_sScreens[ui32NewIdx].psWidget); + + g_i32ScreenIdx = ui32NewIdx; + + // + // Screen switched so disable the overlay buttons. + // + ButtonsDisable(); + + if(g_i32ScreenIdx == SCREEN_MAIN) + { + // + // Update the frame. + // + FrameDraw(&g_sContext, "qs-weather"); + + // + // Change the status to updating if on the main screen. + // + UpdateCity(g_ui32CityActive, false); + + // + // Animate the panel switch. + // + AnimatePanel(ClrBlack); + + // + // If returning to the main screen then see if the settings + // should be saved. + // + if(g_sConfig.bSave) + { + g_sConfig.bSave = false; + FlashPBSave((uint8_t *)&g_sConfig); + } + } + else + { + // + // Update the frame. + // + FrameDraw(&g_sContext, "Settings"); + + // + // Animate the panel switch. + // + AnimatePanel(ClrGray); + + // + // Animate the pull up tab once. + // + AnimateButtons(true); + } + } + + g_sSwipe.eMovement = iSwipeNone; + } +} + +//***************************************************************************** +// +// Linear scaling of the palette entries from white to normal color. +// +//***************************************************************************** +static uint8_t +PaletteScale(uint32_t ui32Entry, uint32_t ui32Scale) +{ + uint32_t ui32Value; + + ui32Value = ui32Entry + ((0xff - ui32Entry) * ui32Scale)/15; + + return((uint8_t)ui32Value); +} + +//***************************************************************************** +// +// Display the TI logo screen. +// +//***************************************************************************** +void +TIWelcome(void) +{ + int32_t i32Idx, i32Line, i32Step; + + // + // Initial color is white. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + ClearScreen(&g_sContext); + + // + // Copy the default palette from the image. + // + for(i32Idx = 0; i32Idx < (g_pui8TIImage[5] * 3); i32Idx++) + { + g_pui8TIImagePalette[i32Idx] = g_pui8TIImage[6 + i32Idx]; + } + + // + // Palette multiplier. + // + i32Step = 0xf; + + while(i32Step > 0) + { + // + // Shift the palette of the image. + // + for(i32Idx = 0; i32Idx < g_pui8TIImage[5]; i32Idx++) + { + g_pui8TIImage[6 + (i32Idx * 3)] = + PaletteScale(g_pui8TIImagePalette[i32Idx * 3], i32Step); + g_pui8TIImage[7 + (i32Idx * 3)] = + PaletteScale(g_pui8TIImagePalette[(i32Idx * 3) + 1], + i32Step); + g_pui8TIImage[8 + (i32Idx * 3)] = + PaletteScale(g_pui8TIImagePalette[(i32Idx * 3) + 2], + i32Step); + } + + // + // Draw the areas of the screen. + // + GrImageDraw(&g_sContext, g_pui8TIImage, 0, 75); + + SysCtlDelay(g_ui32SysClock/50); + + // + // Decrement the palette scaling. + // + i32Step--; + } + + // + // Hold the image for a few seconds. + // + SysCtlDelay(g_ui32SysClock); + + // + // Set the initial scaling to not adjust the palette. + // + i32Step = 0; + + GrContextForegroundSet(&g_sContext, ClrBlack); + + // + // Clear the screen from top and bottom while fading out the logo. + // + for(i32Line = 0; i32Line < 119; i32Line++) + { + // + // Erase from the top and bottom of the screen. + // + GrLineDrawH(&g_sContext, 0, 329, i32Line); + GrLineDrawH(&g_sContext, 0, 329, 239-i32Line); + + // + // Fade the palette every 5th line and stop when the line draws cross + // the image. + // + if(((i32Line % 5) == 0) && (i32Line < 75)) + { + // + // Shift the palette of the image. + // + for(i32Idx = 0; i32Idx < g_pui8TIImage[5]; i32Idx++) + { + g_pui8TIImage[6 + (i32Idx * 3)] = + PaletteScale(g_pui8TIImagePalette[i32Idx * 3], + i32Step); + g_pui8TIImage[7 + (i32Idx * 3)] = + PaletteScale(g_pui8TIImagePalette[(i32Idx * 3) + 1], + i32Step); + g_pui8TIImage[8 + (i32Idx * 3)] = + PaletteScale(g_pui8TIImagePalette[(i32Idx * 3) + 2], + i32Step); + + } + + // + // Draw the areas of the screen. + // + GrImageDraw(&g_sContext, g_pui8TIImage, 0, 75); + + // + // Darken the background and decrement the palette multiplier. + // + i32Step++; + } + + SysCtlDelay(g_ui32SysClock/2400); + } + + // + // Blank out one of the last pairs of lines. + // + GrContextForegroundSet(&g_sContext, ClrBlack); + GrLineDrawH(&g_sContext, 0, 329, 120); + + // + // "erase" the final line towards the middle. + // + for(i32Line = 0; i32Line < 159; i32Line++) + { + GrPixelDraw(&g_sContext,i32Line, 119); + GrPixelDraw(&g_sContext,319- i32Line, 119); + SysCtlDelay(g_ui32SysClock/2400); + } + + // + // Wait about a 1/4 second and set the background to black. + // + SysCtlDelay(g_ui32SysClock/12); + GrContextForegroundSet(&g_sContext, ClrBlack); + ClearScreen(&g_sContext); +} + +//***************************************************************************** +// +// This example demonstrates the use of the Ethernet Controller. +// +//***************************************************************************** +int +main(void) +{ + enum + { + eRequestIdle, + eRequestUpdate, + eRequestForecast, + eRequestCurrent, + eRequestComplete, + } + iRequest; + int32_t i32City; + sParameters *pParams; + iRequest = eRequestIdle; + + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Logo Screen + // + TIWelcome(); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "qs-weather"); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sMainBackground); + + // + // Start on the main screen. + // + g_i32ScreenIdx = SCREEN_MAIN; + + WidgetPaint(WIDGET_ROOT); + + // + // Make sure the main oscillator is enabled because this is required by + // the PHY. The system must have a 25MHz crystal attached to the OSC + // pins. The SYSCTL_MOSC_HIGHFREQ parameter is used when the crystal + // frequency is 10MHz or higher. + // + SysCtlMOSCConfigSet(SYSCTL_MOSC_HIGHFREQ); + + // + // Configure SysTick for a periodic interrupt at 10ms. + // + SysTickPeriodSet((g_ui32SysClock / 1000) * SYSTEM_TICK_MS); + SysTickEnable(); + SysTickIntEnable(); + + // + // Initialized the flash program block and read the current settings. + // + FlashPBInit(FLASH_PB_START, FLASH_PB_END, 256); + pParams = (sParameters *)FlashPBGet(); + + // + // Use the defaults if no settings were found. + // + if(pParams == 0) + { + g_sConfig = g_sDefaultParams; + } + else + { + g_sConfig = *pParams; + } + + // + // Initialize all of the cities. + // + for(i32City = 0; i32City < NUM_CITIES; i32City++) + { + ResetCity(i32City); + } + + // + // Initialize the swipe state. + // + g_sSwipe.eMovement = iSwipeNone; + + // + // Set the IP address to 0.0.0.0. + // + UpdateIPAddress(g_pcIPAddr, 0); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(g_ui32SysClock); + TouchScreenCallbackSet(TouchCallback); + + // + // Enable processor interrupts. + // + IntMasterEnable(); + + // + // Set the interrupt priorities. We set the SysTick interrupt to a higher + // priority than the Ethernet interrupt to ensure that the file system + // tick is processed if SysTick occurs while the Ethernet handler is being + // processed. This is very likely since all the TCP/IP and HTTP work is + // done in the context of the Ethernet interrupt. + // + IntPriorityGroupingSet(4); + IntPrioritySet(INT_EMAC0, ETHERNET_INT_PRIORITY); + IntPrioritySet(FAULT_SYSTICK, SYSTICK_INT_PRIORITY); + + if(g_sConfig.bProxyEnabled) + { + EthClientProxySet(g_sConfig.pcProxy); + EthClientInit(EnetEvents); + } + else + { + EthClientProxySet(0); + EthClientInit(EnetEvents); + } + + UpdateMACAddr(); + + // + // Initialize the city index and enable swipe detection. + // + g_ui32CityActive = 0; + g_ui32CityUpdating = 0; + g_sSwipe.bEnable = true; + + // + // Display the current city information. + // + UpdateCity(g_ui32CityActive, true); + + // + // One minute timeout for screen saver. + // + g_ui32ScreenSaver = SYSTEM_TICK_S * 60; + + // + // Loop forever. All the work is done in interrupt handlers. + // + while(1) + { + if(g_iState == STATE_NEW_CONNECTION) + { + iRequest = eRequestIdle; + + g_iState = STATE_CONNECTED_IDLE; + } + else if(g_iState == STATE_CONNECTED_IDLE) + { + if(iRequest == eRequestIdle) + { + // + // If this city needs updating then start an update. + // + if((g_psCityInfo[g_ui32CityUpdating].bNeedsUpdate) && + ((g_ui32CityUpdating < NUM_CITIES - 1) || + (g_sConfig.bCustomEnabled == true))) + { + iRequest = eRequestUpdate; + + // + // Change the status to updating if on the main screen. + // + if((g_ui32CityUpdating == g_ui32CityActive) && + (g_i32ScreenIdx == SCREEN_MAIN)) + { + // + // Display the waiting message. + // + ustrncpy(g_pcStatus, g_pcWaitData, sizeof(g_pcStatus)); + WidgetPaint((tWidget *)&g_sStatus); + } + } + + if(iRequest != eRequestUpdate) + { + // + // If the custom city is enabled and it needs updating, + // then update it first. + // + if((g_psCityInfo[NUM_CITIES - 1].bNeedsUpdate) && + (g_sConfig.bCustomEnabled == true)) + { + g_ui32CityUpdating = NUM_CITIES - 1; + } + else + { + // + // Move on to the next city to see if it needs to be + // updated on the next pass. + // + g_ui32CityUpdating++; + } + if(g_ui32CityUpdating >= NUM_CITIES) + { + g_ui32CityUpdating = 0; + } + } + } + else if(iRequest == eRequestUpdate) + { + g_iState = STATE_WAIT_DATA; + + // + // Timeout at 10 seconds. + // + g_ui32Delay = 1000; + + WeatherForecast(iWSrcOpenWeatherMap, + g_psCityInfo[g_ui32CityUpdating].pcName, + &g_psCityInfo[g_ui32CityUpdating].sReport, + WeatherEvent); + + iRequest = eRequestForecast; + } + else if(iRequest == eRequestForecast) + { + g_iState = STATE_WAIT_DATA; + + // + // Timeout at 10 seconds. + // + g_ui32Delay = 1000; + + WeatherCurrent(iWSrcOpenWeatherMap, + g_psCityInfo[g_ui32CityUpdating].pcName, + &g_psCityInfo[g_ui32CityUpdating].sReport, + WeatherEvent); + + iRequest = eRequestCurrent; + } + else if(iRequest == eRequestCurrent) + { + // + // Return to the idle request state. + // + iRequest = eRequestIdle; + + // + // Done updating this city. + // + g_psCityInfo[g_ui32CityUpdating].bNeedsUpdate = false; + } + } + else if(g_iState == STATE_UPDATE_CITY) + { + if(iRequest == eRequestCurrent) + { + // + // If the city is the current active city and the the + // application is on the main screen then update the screen + // and not just the values. + // + if(g_ui32CityUpdating == g_ui32CityActive) + { + // + // Update the current city. + // + if(g_i32ScreenIdx == SCREEN_MAIN) + { + UpdateCity(g_ui32CityUpdating, true); + } + else + { + UpdateCity(g_ui32CityUpdating, false); + } + } + + // + // Done updating this city. + // + g_psCityInfo[g_ui32CityUpdating].bNeedsUpdate = false; + } + + // + // Go to the wait nice state. + // + g_iState = STATE_WAIT_NICE; + + // + // 10ms * 10 is a 1 second delay between updates. + // + g_ui32Delay = SYSTEM_TICK_MS * 10; + } + else if(g_iState == STATE_WAIT_NICE) + { + // + // Wait for the "nice" delay to not hit the server too often. + // + if(g_ui32Delay == 0) + { + g_iState = STATE_CONNECTED_IDLE; + } + } + else if(g_iState == STATE_WAIT_DATA) + { + // + // If no data has been received by the timeout then close the + // connection. + // + if(g_ui32Delay == 0) + { + // + // Close out the current connection. + // + EthClientTCPDisconnect(); + } + } + + // + // Handle screen movements. + // + HandleMovement(); + + // + // Handle button animation. + // + AnimateButtons(false); + + // + // Handle keyboard entry if it is open. + // + HandleKeyboard(); + + // + // If nothing has happened for awhile, then move to a new city. + // + if(g_ui32ScreenSaver == 0) + { + // + // Reset the timeout for 10s to update the screen more often. + // + g_ui32ScreenSaver = 10 * SYSTEM_TICK_S; + + // + // Trigger a left swipe. + // + g_sSwipe.eMovement = iSwipeLeft; + } + + WidgetMessageQueueProcess(); + } +} diff --git a/boards/dk-tm4c129x/qs_weather/qs_weather.ewd b/boards/dk-tm4c129x/qs_weather/qs_weather.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/qs_weather.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/qs_weather/qs_weather.ewp b/boards/dk-tm4c129x/qs_weather/qs_weather.ewp new file mode 100644 index 0000000..e5ad3ac --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/qs_weather.ewp @@ -0,0 +1,838 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\eth_client.c + + + $PROJ_DIR$\..\..\..\..\utils\flash_pb.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\images.c + + + $PROJ_DIR$\json.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\..\..\..\utils\locator.c + + + $PROJ_DIR$\..\..\..\..\utils\lwiplib.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\qs_weather.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/qs_weather/qs_weather.icf b/boards/dk-tm4c129x/qs_weather/qs_weather.icf new file mode 100644 index 0000000..3161586 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/qs_weather.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// qs_weather.icf - Linker configuration file for qs_weather. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/qs_weather/qs_weather.ld b/boards/dk-tm4c129x/qs_weather/qs_weather.ld new file mode 100644 index 0000000..0e981fb --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/qs_weather.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * qs_weather.ld - Linker configuration file for qs_weather. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/qs_weather/qs_weather.sct b/boards/dk-tm4c129x/qs_weather/qs_weather.sct new file mode 100644 index 0000000..0f0224f --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/qs_weather.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; qs_weather.sct - Linker configuration file for qs_weather. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/qs_weather/qs_weather.uvopt b/boards/dk-tm4c129x/qs_weather/qs_weather.uvopt new file mode 100644 index 0000000..6de8f21 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/qs_weather.uvopt @@ -0,0 +1,471 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + qs_weather + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\eth_client.c + eth_client.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\flash_pb.c + flash_pb.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\images.c + images.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\json.c + json.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\locator.c + locator.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\lwiplib.c + lwiplib.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\qs_weather.c + qs_weather.c + + + 1 + 11 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 15 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 16 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 17 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/qs_weather/qs_weather.uvproj b/boards/dk-tm4c129x/qs_weather/qs_weather.uvproj new file mode 100644 index 0000000..19664ce --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/qs_weather.uvproj @@ -0,0 +1,489 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + qs_weather + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + qs_weather + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\qs_weather.bin .\rvmdk\qs_weather.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 LWIP_1_4_1 + + .;..;..\..\..\..;..\..\..\..\third_party\lwip-1.4.1\apps;..\..\..\..\third_party\lwip-1.4.1\ports\tiva-tm4c129\include;..\..\..\..\third_party\lwip-1.4.1\src\include;..\..\..\..\third_party\lwip-1.4.1\src\include\ipv4;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + qs_weather.sct + + + --entry Reset_Handler + + + + + + + + Source + + + eth_client.c + 1 + .\eth_client.c + + + flash_pb.c + 1 + ..\..\..\..\utils\flash_pb.c + + + frame.c + 1 + ..\drivers\frame.c + + + images.c + 1 + .\images.c + + + json.c + 1 + .\json.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + locator.c + 1 + ..\..\..\..\utils\locator.c + + + lwiplib.c + 1 + ..\..\..\..\utils\lwiplib.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + qs_weather.c + 1 + .\qs_weather.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/qs_weather/qs_weather_ccs.cmd b/boards/dk-tm4c129x/qs_weather/qs_weather_ccs.cmd new file mode 100644 index 0000000..cf784c9 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/qs_weather_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * qs_weather_ccs.cmd - CCS linker configuration file for qs_weather. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/qs_weather/readme.txt b/boards/dk-tm4c129x/qs_weather/readme.txt new file mode 100644 index 0000000..af26898 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/readme.txt @@ -0,0 +1,43 @@ +Quickstart Weather Application + +This example application demonstrates the operation of the Tiva C series +evaluation kit as a weather reporting application. + +The application supports updating weather information from Open Weather Map +weather provider(http://openweathermap.org/). The application uses the +lwIP stack to obtain an address through DNS, resolve the address of the +Open Weather Map site and then build and handle all of the requests +necessary to access the weather information. The application can also use +a web proxy, allows for a custom city to be added to the list of cities and +toggles temperature units from Celsius to Fahrenheit. The application uses +gestures to navigate between various screens. To open the settings screen +just press and drag down on any city screen. To exit the setting screen +press and drag up and you are returned to the main city display. To +navigate between cities, press and drag left or right and the new city +information is displayed. + +For additional details about Open Weather Map refer to their web page at: +http://openweathermap.org/ + +For additional details on lwIP, refer to the lwIP web page at: +http://savannah.nongnu.org/projects/lwip/ + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/qs_weather/rvmdk/qs_weather.axf b/boards/dk-tm4c129x/qs_weather/rvmdk/qs_weather.axf new file mode 100644 index 0000000..1469761 Binary files /dev/null and b/boards/dk-tm4c129x/qs_weather/rvmdk/qs_weather.axf differ diff --git a/boards/dk-tm4c129x/qs_weather/rvmdk/qs_weather.bin b/boards/dk-tm4c129x/qs_weather/rvmdk/qs_weather.bin new file mode 100644 index 0000000..9e5d9a5 Binary files /dev/null and b/boards/dk-tm4c129x/qs_weather/rvmdk/qs_weather.bin differ diff --git a/boards/dk-tm4c129x/qs_weather/startup_ccs.c b/boards/dk-tm4c129x/qs_weather/startup_ccs.c new file mode 100644 index 0000000..9a270fa --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void lwIPEthernetIntHandler(void); +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/qs_weather/startup_ewarm.c b/boards/dk-tm4c129x/qs_weather/startup_ewarm.c new file mode 100644 index 0000000..b284964 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void lwIPEthernetIntHandler(void); +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/qs_weather/startup_gcc.c b/boards/dk-tm4c129x/qs_weather/startup_gcc.c new file mode 100644 index 0000000..2dd0712 --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void lwIPEthernetIntHandler(void); +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + lwIPEthernetIntHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/qs_weather/startup_rvmdk.S b/boards/dk-tm4c129x/qs_weather/startup_rvmdk.S new file mode 100644 index 0000000..767456e --- /dev/null +++ b/boards/dk-tm4c129x/qs_weather/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN lwIPEthernetIntHandler + EXTERN SysTickIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD lwIPEthernetIntHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/scribble/Makefile b/boards/dk-tm4c129x/scribble/Makefile new file mode 100644 index 0000000..9aa1d3b --- /dev/null +++ b/boards/dk-tm4c129x/scribble/Makefile @@ -0,0 +1,93 @@ +#****************************************************************************** +# +# Makefile - Rules for building the scribble example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the scribble example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/scribble.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the scribble example. +# +${COMPILER}/scribble.axf: ${COMPILER}/frame.o +${COMPILER}/scribble.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/scribble.axf: ${COMPILER}/pinout.o +${COMPILER}/scribble.axf: ${COMPILER}/ringbuf.o +${COMPILER}/scribble.axf: ${COMPILER}/scribble.o +${COMPILER}/scribble.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/scribble.axf: ${COMPILER}/touch.o +${COMPILER}/scribble.axf: ${COMPILER}/ustdlib.o +${COMPILER}/scribble.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/scribble.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/scribble.axf: scribble.ld +SCATTERgcc_scribble=scribble.ld +ENTRY_scribble=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/scribble/ccs/.ccsimportspec b/boards/dk-tm4c129x/scribble/ccs/.ccsimportspec new file mode 100644 index 0000000..b34cde8 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/scribble/ccs/.ccsproject b/boards/dk-tm4c129x/scribble/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/scribble/ccs/.cproject b/boards/dk-tm4c129x/scribble/ccs/.cproject new file mode 100644 index 0000000..e82c0b5 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/scribble/ccs/.project b/boards/dk-tm4c129x/scribble/ccs/.project new file mode 100644 index 0000000..369b681 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/ccs/.project @@ -0,0 +1,80 @@ + + + scribble + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + scribble.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/scribble/scribble.c + + + scribble_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/scribble/scribble_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/scribble/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/ringbuf.c + 1 + SW_ROOT/utils/ringbuf.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/scribble/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/scribble/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/scribble/ccs/Debug/scribble.bin b/boards/dk-tm4c129x/scribble/ccs/Debug/scribble.bin new file mode 100644 index 0000000..22002e0 Binary files /dev/null and b/boards/dk-tm4c129x/scribble/ccs/Debug/scribble.bin differ diff --git a/boards/dk-tm4c129x/scribble/ccs/Debug/scribble.out b/boards/dk-tm4c129x/scribble/ccs/Debug/scribble.out new file mode 100644 index 0000000..85e3113 Binary files /dev/null and b/boards/dk-tm4c129x/scribble/ccs/Debug/scribble.out differ diff --git a/boards/dk-tm4c129x/scribble/ccs/macros.ini_initial b/boards/dk-tm4c129x/scribble/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/scribble/ccs/target_config.ccxml b/boards/dk-tm4c129x/scribble/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/scribble/ewarm/Exe/scribble.bin b/boards/dk-tm4c129x/scribble/ewarm/Exe/scribble.bin new file mode 100644 index 0000000..c4328c4 Binary files /dev/null and b/boards/dk-tm4c129x/scribble/ewarm/Exe/scribble.bin differ diff --git a/boards/dk-tm4c129x/scribble/ewarm/Exe/scribble.out b/boards/dk-tm4c129x/scribble/ewarm/Exe/scribble.out new file mode 100644 index 0000000..9b08717 Binary files /dev/null and b/boards/dk-tm4c129x/scribble/ewarm/Exe/scribble.out differ diff --git a/boards/dk-tm4c129x/scribble/gcc/scribble.axf b/boards/dk-tm4c129x/scribble/gcc/scribble.axf new file mode 100644 index 0000000..497aa65 Binary files /dev/null and b/boards/dk-tm4c129x/scribble/gcc/scribble.axf differ diff --git a/boards/dk-tm4c129x/scribble/gcc/scribble.bin b/boards/dk-tm4c129x/scribble/gcc/scribble.bin new file mode 100644 index 0000000..66ef308 Binary files /dev/null and b/boards/dk-tm4c129x/scribble/gcc/scribble.bin differ diff --git a/boards/dk-tm4c129x/scribble/readme.txt b/boards/dk-tm4c129x/scribble/readme.txt new file mode 100644 index 0000000..b49afec --- /dev/null +++ b/boards/dk-tm4c129x/scribble/readme.txt @@ -0,0 +1,28 @@ +Scribble Pad + +The scribble pad provides a drawing area on the screen. Touching the +screen will draw onto the drawing area using a selection of fundamental +colors (in other words, the seven colors produced by the three color +channels being either fully on or fully off). Each time the screen is +touched to start a new drawing, the drawing area is erased and the next +color is selected. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/scribble/rvmdk/scribble.axf b/boards/dk-tm4c129x/scribble/rvmdk/scribble.axf new file mode 100644 index 0000000..a05a43b Binary files /dev/null and b/boards/dk-tm4c129x/scribble/rvmdk/scribble.axf differ diff --git a/boards/dk-tm4c129x/scribble/rvmdk/scribble.bin b/boards/dk-tm4c129x/scribble/rvmdk/scribble.bin new file mode 100644 index 0000000..1af807f Binary files /dev/null and b/boards/dk-tm4c129x/scribble/rvmdk/scribble.bin differ diff --git a/boards/dk-tm4c129x/scribble/scribble.c b/boards/dk-tm4c129x/scribble/scribble.c new file mode 100644 index 0000000..c9d0723 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/scribble.c @@ -0,0 +1,399 @@ +//***************************************************************************** +// +// scribble.c - A simple scribble pad to demonstrate the touch screen driver. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "utils/ringbuf.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Scribble Pad (scribble)

      +//! +//! The scribble pad provides a drawing area on the screen. Touching the +//! screen will draw onto the drawing area using a selection of fundamental +//! colors (in other words, the seven colors produced by the three color +//! channels being either fully on or fully off). Each time the screen is +//! touched to start a new drawing, the drawing area is erased and the next +//! color is selected. +// +//***************************************************************************** + +//***************************************************************************** +// +// A structure used to pass touchscreen messages from the interrupt-context +// handler function to the main loop for processing. +// +//***************************************************************************** +typedef struct +{ + uint32_t ui32Msg; + int32_t i32X; + int32_t i32Y; +} +tScribbleMessage; + +//***************************************************************************** +// +// The number of messages we can store in the message queue. +// +//***************************************************************************** +#define MSG_QUEUE_SIZE 16 + +//***************************************************************************** +// +// The ring buffer memory and control structure we use to implement the +// message queue. +// +//***************************************************************************** +static tScribbleMessage g_psMsgQueueBuffer[MSG_QUEUE_SIZE]; +static tRingBufObject g_sMsgQueue; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The colors that are used to draw on the screen. +// +//***************************************************************************** +static const uint32_t g_pui32Colors[] = +{ + ClrWhite, + ClrYellow, + ClrMagenta, + ClrRed, + ClrCyan, + ClrLime, + ClrBlue +}; + +//***************************************************************************** +// +// The index to the current color in use. +// +//***************************************************************************** +static uint32_t g_ui32ColorIdx; + +//***************************************************************************** +// +// The previous pen position returned from the touch screen driver. +// +//***************************************************************************** +static int32_t g_i32X, g_i32Y; + +//***************************************************************************** +// +// The drawing context used to draw to the screen. +// +//***************************************************************************** +static tContext g_sContext; + +//***************************************************************************** +// +// The interrupt-context handler for touch screen events from the touch screen +// driver. This function merely bundles up the event parameters and posts +// them to a message queue. In the context of the main loop, they will be +// read from the queue and handled using TSMainHandler(). +// +//***************************************************************************** +int32_t +TSHandler(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + tScribbleMessage sMsg; + + // + // Build the message that we will write to the queue. + // + sMsg.ui32Msg = ui32Message; + sMsg.i32X = i32X; + sMsg.i32Y = i32Y; + + // + // Make sure the queue isn't full. If it is, we just ignore this message. + // + if(!RingBufFull(&g_sMsgQueue)) + { + RingBufWrite(&g_sMsgQueue, (uint8_t *)&sMsg, sizeof(tScribbleMessage)); + } + + // + // Tell the touch handler that everything is fine. + // + return(1); +} + +//***************************************************************************** +// +// The main loop handler for touch screen events from the touch screen driver. +// +//***************************************************************************** +int32_t +TSMainHandler(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + tRectangle sRect; + + // + // See which event is being sent from the touch screen driver. + // + switch(ui32Message) + { + // + // The pen has just been placed down. + // + case WIDGET_MSG_PTR_DOWN: + { + // + // Erase the drawing area. + // + GrContextForegroundSet(&g_sContext, ClrBlack); + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = 319; + sRect.i16YMax = 239; + GrRectFill(&g_sContext, &sRect); + + // + // Flush any cached drawing operations. + // + GrFlush(&g_sContext); + + // + // Set the drawing color to the current pen color. + // + GrContextForegroundSet(&g_sContext, g_pui32Colors[g_ui32ColorIdx]); + + // + // Save the current position. + // + g_i32X = i32X; + g_i32Y = i32Y; + + // + // This event has been handled. + // + break; + } + + // + // Then pen has moved. + // + case WIDGET_MSG_PTR_MOVE: + { + // + // Draw a line from the previous position to the current position. + // + GrLineDraw(&g_sContext, g_i32X, g_i32Y, i32X, i32Y); + + // + // Flush any cached drawing operations. + // + GrFlush(&g_sContext); + + // + // Save the current position. + // + g_i32X = i32X; + g_i32Y = i32Y; + + // + // This event has been handled. + // + break; + } + + // + // The pen has just been picked up. + // + case WIDGET_MSG_PTR_UP: + { + // + // Draw a line from the previous position to the current position. + // + GrLineDraw(&g_sContext, g_i32X, g_i32Y, i32X, i32Y); + + // + // Flush any cached drawing operations. + // + GrFlush(&g_sContext); + + // + // Increment to the next drawing color. + // + g_ui32ColorIdx++; + if(g_ui32ColorIdx == + (sizeof(g_pui32Colors) / sizeof(g_pui32Colors[0]))) + { + g_ui32ColorIdx = 0; + } + + // + // This event has been handled. + // + break; + } + } + + // + // Success. + // + return(1); +} + +//***************************************************************************** +// +// This function is called in the context of the main loop to process any +// touch screen messages that have been sent. Messages are posted to a +// queue from the message handler and pulled off here. This is required +// since it is not safe to have two different execution contexts performing +// graphics operations using the same graphics context. +// +//***************************************************************************** +void +ProcessTouchMessages(void) +{ + tScribbleMessage sMsg; + + // + // Loop while there are more messages to process. + // + while(!RingBufEmpty(&g_sMsgQueue)) + { + // + // Get the next message. + // + RingBufRead(&g_sMsgQueue, (uint8_t *)&sMsg, sizeof(tScribbleMessage)); + + // + // Dispatch it to the handler. + // + TSMainHandler(sMsg.ui32Msg, sMsg.i32X, sMsg.i32Y); + } +} + +//***************************************************************************** +// +// Provides a scribble pad using the display on the Intelligent Display Module. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "scribble"); + + // + // Print the instructions across the top of the screen in white with a 20 + // point san-serif font. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrContextFontSet(&g_sContext, g_psFontCmss20); + GrStringDrawCentered(&g_sContext, "Touch the screen to draw", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + ((GrContextDpyHeightGet(&g_sContext) - 32) / 2) + 14, + 0); + + // + // Flush any cached drawing operations. + // + GrFlush(&g_sContext); + + // + // Set the color index to zero. + // + g_ui32ColorIdx = 0; + + // + // Initialize the message queue we use to pass messages from the touch + // interrupt handler context to the main loop for processing. + // + RingBufInit(&g_sMsgQueue, (uint8_t *)g_psMsgQueueBuffer, + (MSG_QUEUE_SIZE * sizeof(tScribbleMessage))); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(TSHandler); + + // + // Loop forever. All the drawing is done in the touch screen event + // handler. + // + while(1) + { + // + // Process any new touchscreen messages. + // + ProcessTouchMessages(); + } +} diff --git a/boards/dk-tm4c129x/scribble/scribble.ewd b/boards/dk-tm4c129x/scribble/scribble.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/scribble/scribble.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/scribble/scribble.ewp b/boards/dk-tm4c129x/scribble/scribble.ewp new file mode 100644 index 0000000..dadca7f --- /dev/null +++ b/boards/dk-tm4c129x/scribble/scribble.ewp @@ -0,0 +1,807 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\..\..\..\..\utils\ringbuf.c + + + $PROJ_DIR$\scribble.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/scribble/scribble.icf b/boards/dk-tm4c129x/scribble/scribble.icf new file mode 100644 index 0000000..58f279a --- /dev/null +++ b/boards/dk-tm4c129x/scribble/scribble.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// scribble.icf - Linker configuration file for scribble. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/scribble/scribble.ld b/boards/dk-tm4c129x/scribble/scribble.ld new file mode 100644 index 0000000..9e82a87 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/scribble.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * scribble.ld - Linker configuration file for scribble. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/scribble/scribble.sct b/boards/dk-tm4c129x/scribble/scribble.sct new file mode 100644 index 0000000..00eb028 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/scribble.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; scribble.sct - Linker configuration file for scribble. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/scribble/scribble.uvopt b/boards/dk-tm4c129x/scribble/scribble.uvopt new file mode 100644 index 0000000..4848f1a --- /dev/null +++ b/boards/dk-tm4c129x/scribble/scribble.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + scribble + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ringbuf.c + ringbuf.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\scribble.c + scribble.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/scribble/scribble.uvproj b/boards/dk-tm4c129x/scribble/scribble.uvproj new file mode 100644 index 0000000..13d7cec --- /dev/null +++ b/boards/dk-tm4c129x/scribble/scribble.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + scribble + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + scribble + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\scribble.bin .\rvmdk\scribble.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + scribble.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + ringbuf.c + 1 + ..\..\..\..\utils\ringbuf.c + + + scribble.c + 1 + .\scribble.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/scribble/scribble_ccs.cmd b/boards/dk-tm4c129x/scribble/scribble_ccs.cmd new file mode 100644 index 0000000..cd2e46c --- /dev/null +++ b/boards/dk-tm4c129x/scribble/scribble_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * scribble_ccs.cmd - CCS linker configuration file for scribble. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/scribble/startup_ccs.c b/boards/dk-tm4c129x/scribble/startup_ccs.c new file mode 100644 index 0000000..5d2884c --- /dev/null +++ b/boards/dk-tm4c129x/scribble/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/scribble/startup_ewarm.c b/boards/dk-tm4c129x/scribble/startup_ewarm.c new file mode 100644 index 0000000..860b8a6 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/scribble/startup_gcc.c b/boards/dk-tm4c129x/scribble/startup_gcc.c new file mode 100644 index 0000000..fad3049 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/scribble/startup_rvmdk.S b/boards/dk-tm4c129x/scribble/startup_rvmdk.S new file mode 100644 index 0000000..07659c1 --- /dev/null +++ b/boards/dk-tm4c129x/scribble/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/sd_card/Makefile b/boards/dk-tm4c129x/sd_card/Makefile new file mode 100644 index 0000000..2a4122e --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/Makefile @@ -0,0 +1,101 @@ +#****************************************************************************** +# +# Makefile - Rules for building the SD card example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/src/option +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the SD card example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/sd_card.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the SD card example. +# +${COMPILER}/sd_card.axf: ${COMPILER}/cc932.o +${COMPILER}/sd_card.axf: ${COMPILER}/cmdline.o +${COMPILER}/sd_card.axf: ${COMPILER}/ff.o +${COMPILER}/sd_card.axf: ${COMPILER}/frame.o +${COMPILER}/sd_card.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/sd_card.axf: ${COMPILER}/mmc-dk-tm4c129x.o +${COMPILER}/sd_card.axf: ${COMPILER}/pinout.o +${COMPILER}/sd_card.axf: ${COMPILER}/sd_card.o +${COMPILER}/sd_card.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/sd_card.axf: ${COMPILER}/touch.o +${COMPILER}/sd_card.axf: ${COMPILER}/uartstdio.o +${COMPILER}/sd_card.axf: ${COMPILER}/ustdlib.o +${COMPILER}/sd_card.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/sd_card.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/sd_card.axf: sd_card.ld +SCATTERgcc_sd_card=sd_card.ld +ENTRY_sd_card=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 -DENABLE_LFN -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/sd_card/ccs/.ccsimportspec b/boards/dk-tm4c129x/sd_card/ccs/.ccsimportspec new file mode 100644 index 0000000..67417bd --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/sd_card/ccs/.ccsproject b/boards/dk-tm4c129x/sd_card/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/sd_card/ccs/.cproject b/boards/dk-tm4c129x/sd_card/ccs/.cproject new file mode 100644 index 0000000..4cf1f8e --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/ccs/.cproject @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/sd_card/ccs/.project b/boards/dk-tm4c129x/sd_card/ccs/.project new file mode 100644 index 0000000..f6bd6d2 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/ccs/.project @@ -0,0 +1,100 @@ + + + sd_card + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + sd_card.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/sd_card/sd_card.c + + + sd_card_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/sd_card/sd_card_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/sd_card/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/cmdline.c + 1 + SW_ROOT/utils/cmdline.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/fatfs/port/mmc-dk-tm4c129x.c + 1 + SW_ROOT/third_party/fatfs/port/mmc-dk-tm4c129x.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + third_party/fatfs/src/option/cc932.c + 1 + SW_ROOT/third_party/fatfs/src/option/cc932.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/sd_card/ccs/Debug/sd_card.bin b/boards/dk-tm4c129x/sd_card/ccs/Debug/sd_card.bin new file mode 100644 index 0000000..4236f8d Binary files /dev/null and b/boards/dk-tm4c129x/sd_card/ccs/Debug/sd_card.bin differ diff --git a/boards/dk-tm4c129x/sd_card/ccs/Debug/sd_card.out b/boards/dk-tm4c129x/sd_card/ccs/Debug/sd_card.out new file mode 100644 index 0000000..ba13ff6 Binary files /dev/null and b/boards/dk-tm4c129x/sd_card/ccs/Debug/sd_card.out differ diff --git a/boards/dk-tm4c129x/sd_card/ccs/macros.ini_initial b/boards/dk-tm4c129x/sd_card/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/sd_card/ccs/target_config.ccxml b/boards/dk-tm4c129x/sd_card/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/sd_card/ewarm/Exe/sd_card.bin b/boards/dk-tm4c129x/sd_card/ewarm/Exe/sd_card.bin new file mode 100644 index 0000000..93bfd71 Binary files /dev/null and b/boards/dk-tm4c129x/sd_card/ewarm/Exe/sd_card.bin differ diff --git a/boards/dk-tm4c129x/sd_card/ewarm/Exe/sd_card.out b/boards/dk-tm4c129x/sd_card/ewarm/Exe/sd_card.out new file mode 100644 index 0000000..9055afc Binary files /dev/null and b/boards/dk-tm4c129x/sd_card/ewarm/Exe/sd_card.out differ diff --git a/boards/dk-tm4c129x/sd_card/gcc/sd_card.axf b/boards/dk-tm4c129x/sd_card/gcc/sd_card.axf new file mode 100644 index 0000000..5a0575e Binary files /dev/null and b/boards/dk-tm4c129x/sd_card/gcc/sd_card.axf differ diff --git a/boards/dk-tm4c129x/sd_card/gcc/sd_card.bin b/boards/dk-tm4c129x/sd_card/gcc/sd_card.bin new file mode 100644 index 0000000..4a81f2d Binary files /dev/null and b/boards/dk-tm4c129x/sd_card/gcc/sd_card.bin differ diff --git a/boards/dk-tm4c129x/sd_card/readme.txt b/boards/dk-tm4c129x/sd_card/readme.txt new file mode 100644 index 0000000..ba7be54 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/readme.txt @@ -0,0 +1,35 @@ +SD card using FAT file system + +This example application demonstrates reading a file system from +an SD card. It makes use of FatFs, a FAT file system driver. It +provides a simple widget-based console on the display and also a +UART-based command line for viewing and navigating the file system +on the SD card. + +For additional details about FatFs, see the following site: +http://elm-chan.org/fsw/ff/00index_e.html + +The application may also be operated via a serial terminal attached to +UART0. The RS232 communication parameters should be set to 115,200 bits +per second, and 8-n-1 mode. When the program is started a message will +be printed to the terminal. Type ``help'' for command help. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/sd_card/rvmdk/sd_card.axf b/boards/dk-tm4c129x/sd_card/rvmdk/sd_card.axf new file mode 100644 index 0000000..6c57656 Binary files /dev/null and b/boards/dk-tm4c129x/sd_card/rvmdk/sd_card.axf differ diff --git a/boards/dk-tm4c129x/sd_card/rvmdk/sd_card.bin b/boards/dk-tm4c129x/sd_card/rvmdk/sd_card.bin new file mode 100644 index 0000000..a50ccb1 Binary files /dev/null and b/boards/dk-tm4c129x/sd_card/rvmdk/sd_card.bin differ diff --git a/boards/dk-tm4c129x/sd_card/sd_card.c b/boards/dk-tm4c129x/sd_card/sd_card.c new file mode 100644 index 0000000..d1a7e6a --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/sd_card.c @@ -0,0 +1,1579 @@ +//***************************************************************************** +// +// sd_card.c - Example program for reading files from an SD card. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/listbox.h" +#include "grlib/pushbutton.h" +#include "utils/cmdline.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "fatfs/src/ff.h" +#include "fatfs/src/diskio.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      SD card using FAT file system (sd_card)

      +//! +//! This example application demonstrates reading a file system from +//! an SD card. It makes use of FatFs, a FAT file system driver. It +//! provides a simple widget-based console on the display and also a +//! UART-based command line for viewing and navigating the file system +//! on the SD card. +//! +//! For additional details about FatFs, see the following site: +//! http://elm-chan.org/fsw/ff/00index_e.html +//! +//! The application may also be operated via a serial terminal attached to +//! UART0. The RS232 communication parameters should be set to 115,200 bits +//! per second, and 8-n-1 mode. When the program is started a message will +//! be printed to the terminal. Type ``help'' for command help. +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines the size of the buffers that hold the path, or temporary data from +// the SD card. There are two buffers allocated of this size. The buffer size +// must be large enough to hold the longest expected full path name, including +// the file name, and a trailing null character. +// +//***************************************************************************** +#define PATH_BUF_SIZE 80 + +//***************************************************************************** +// +// Defines the size of the buffer that holds the command line. +// +//***************************************************************************** +#define CMD_BUF_SIZE 64 + +//***************************************************************************** +// +// This buffer holds the full path to the current working directory. Initially +// it is root ("/"). +// +//***************************************************************************** +static char g_pcCwdBuf[PATH_BUF_SIZE] = "/"; + +//***************************************************************************** +// +// A temporary data buffer used when manipulating file paths, or reading data +// from the SD card. +// +//***************************************************************************** +static char g_pcTmpBuf[PATH_BUF_SIZE]; + +//***************************************************************************** +// +// The buffer that holds the command line. +// +//***************************************************************************** +static char g_pcCmdBuf[CMD_BUF_SIZE]; + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static DIR g_sDirObject; +static FILINFO g_sFileInfo; +static FIL g_sFileObject; + +//***************************************************************************** +// +// A structure that holds a mapping between an FRESULT numerical code, and a +// string representation. FRESULT codes are returned from the FatFs FAT file +// system driver. +// +//***************************************************************************** +typedef struct +{ + FRESULT iFResult; + char *pcResultStr; +} +tFResultString; + +//***************************************************************************** +// +// A macro to make it easy to add result codes to the table. +// +//***************************************************************************** +#define FRESULT_ENTRY(f) { (f), (#f) } + +//***************************************************************************** +// +// A table that holds a mapping between the numerical FRESULT code and it's +// name as a string. This is used for looking up error codes for printing to +// the console. +// +//***************************************************************************** +tFResultString g_psFResultStrings[] = +{ + FRESULT_ENTRY(FR_OK), + FRESULT_ENTRY(FR_DISK_ERR), + FRESULT_ENTRY(FR_INT_ERR), + FRESULT_ENTRY(FR_NOT_READY), + FRESULT_ENTRY(FR_NO_FILE), + FRESULT_ENTRY(FR_NO_PATH), + FRESULT_ENTRY(FR_INVALID_NAME), + FRESULT_ENTRY(FR_DENIED), + FRESULT_ENTRY(FR_EXIST), + FRESULT_ENTRY(FR_INVALID_OBJECT), + FRESULT_ENTRY(FR_WRITE_PROTECTED), + FRESULT_ENTRY(FR_INVALID_DRIVE), + FRESULT_ENTRY(FR_NOT_ENABLED), + FRESULT_ENTRY(FR_NO_FILESYSTEM), + FRESULT_ENTRY(FR_MKFS_ABORTED), + FRESULT_ENTRY(FR_TIMEOUT), + FRESULT_ENTRY(FR_LOCKED), + FRESULT_ENTRY(FR_NOT_ENOUGH_CORE), + FRESULT_ENTRY(FR_TOO_MANY_OPEN_FILES), + FRESULT_ENTRY(FR_INVALID_PARAMETER), +}; + +//***************************************************************************** +// +// Error reasons returned by ChangeDirectory(). +// +//***************************************************************************** +#define NAME_TOO_LONG_ERROR 1 +#define OPENDIR_ERROR 2 + +//***************************************************************************** +// +// A macro that holds the number of result codes. +// +//***************************************************************************** +#define NUM_FRESULT_CODES (sizeof(g_psFResultStrings) / \ + sizeof(tFResultString)) + +//***************************************************************************** +// +// Storage for the filename listbox widget string table. +// +//***************************************************************************** +#define NUM_LIST_STRINGS 48 +const char *g_ppcDirListStrings[NUM_LIST_STRINGS]; + +//***************************************************************************** +// +// Storage for the names of the files in the current directory. Filenames +// are stored in format "(D) filename.ext" for directories or "(F) filename.ext" +// for files. +// +//***************************************************************************** +#define MAX_FILENAME_STRING_LEN (4 + 8 + 1 + 3 + 1) +char g_pcFilenames[NUM_LIST_STRINGS][MAX_FILENAME_STRING_LEN]; + +//***************************************************************************** +// +// Storage for the strings which appear in the status box at the bottom of the +// display. +// +//**************************************************************************** +#define NUM_STATUS_STRINGS 6 +#define MAX_STATUS_STRING_LEN (36 + 1) +char g_pcStatus[NUM_STATUS_STRINGS][MAX_STATUS_STRING_LEN]; + +//***************************************************************************** +// +// Storage for the status listbox widget string table. +// +//***************************************************************************** +const char *g_ppcStatusStrings[NUM_STATUS_STRINGS] = +{ + g_pcStatus[0], + g_pcStatus[1], + g_pcStatus[2], + g_pcStatus[3], + g_pcStatus[4], + g_pcStatus[5] +}; +uint32_t g_ui32StatusStringIndex = 0; + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The system clock frequency in Hz. +// +//***************************************************************************** +uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// Forward declarations for functions called by the widgets used in the user +// interface. +// +//***************************************************************************** +void OnListBoxChange(tWidget *psWidget, int16_t i16Selected); +void OnBtnCD(tWidget *psWidget); +void OnBtnUp(tWidget *psWidget); +static int PopulateFileListBox(bool bRedraw); +static FRESULT ChangeToDirectory(char *pcDirectory, uint32_t *pui32Reason); +static int PrintfStatus(char *pcFormat, ...); +static const char *StringFromFResult(FRESULT iFResult); + +//***************************************************************************** +// +// Widget definitions +// +//***************************************************************************** + +//***************************************************************************** +// +// The listbox used to display directory contents. +// +//***************************************************************************** +extern tCanvasWidget g_sBackground; +extern tCanvasWidget g_sUpBackground; +extern tCanvasWidget g_sCDBackground; + +ListBox(g_sStatusList, &g_sBackground, 0, 0, &g_sKentec320x240x16_SSD2119, + 40, 170, 220, 52, (LISTBOX_STYLE_OUTLINE | LISTBOX_STYLE_LOCKED | + LISTBOX_STYLE_WRAP), ClrBlack, ClrBlack, ClrSilver, ClrSilver, ClrWhite, + g_psFontFixed6x8, g_ppcStatusStrings, NUM_STATUS_STRINGS, + NUM_STATUS_STRINGS, 0); + +ListBox(g_sDirList, &g_sBackground, &g_sStatusList, 0, + &g_sKentec320x240x16_SSD2119, + 40, 60, 120, 100, LISTBOX_STYLE_OUTLINE, ClrBlack, ClrDarkBlue, + ClrSilver, ClrWhite, ClrWhite, g_psFontCmss12, g_ppcDirListStrings, + NUM_LIST_STRINGS, 0, OnListBoxChange); + +//***************************************************************************** +// +// The canvas widget used to show the current directory prompt. +// +//***************************************************************************** +Canvas(g_sPWDTitle, &g_sBackground, &g_sDirList, 0, + &g_sKentec320x240x16_SSD2119, 10, 35, 40, 20, CANVAS_STYLE_TEXT, + ClrBlack, 0, ClrWhite, g_psFontCmss12, "PWD:", 0, 0); + +//***************************************************************************** +// +// The canvas widget used to show the current directory. +// +//***************************************************************************** +Canvas(g_sPWD, &g_sBackground, &g_sPWDTitle, 0, &g_sKentec320x240x16_SSD2119, + 50, 35, 260, 20, (CANVAS_STYLE_TEXT | CANVAS_STYLE_FILL | + CANVAS_STYLE_TEXT_LEFT), ClrBlack, 0, ClrWhite, g_psFontCmss12, + g_pcCwdBuf, 0, 0); + +//***************************************************************************** +// +// The button used to change to the selected directory directory. +// +//***************************************************************************** +RectangularButton(g_sCDBtn, &g_sCDBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, 170, 75, 90, 30, + (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_RELEASE_NOTIFY), + ClrBlack, ClrBlue, ClrWhite, ClrWhite, + g_psFontCm20, "CD", 0, 0, 0, 0, OnBtnCD); + +//***************************************************************************** +// +// The canvas widget acting as the background to the CD button. +// +//***************************************************************************** +Canvas(g_sCDBackground, WIDGET_ROOT, 0, 0, + &g_sKentec320x240x16_SSD2119, 170, 75, 90, 30, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The button used to change to the next higher directory. +// +//***************************************************************************** +RectangularButton(g_sUpBtn, &g_sUpBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, 170, 115, 90, 30, + (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_RELEASE_NOTIFY), + ClrBlack, ClrBlue, ClrWhite, ClrWhite, + g_psFontCm20, "Up", 0, 0, 0, 0, OnBtnUp); + +//***************************************************************************** +// +// The canvas widget acting as the background to the UP button. +// +//***************************************************************************** +Canvas(g_sUpBackground, WIDGET_ROOT, &g_sCDBackground, 0, + &g_sKentec320x240x16_SSD2119, 170, 115, 90, 30, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The canvas widget acting as the background to the left portion of the +// display. +// +//***************************************************************************** +Canvas(g_sBackground, WIDGET_ROOT, &g_sUpBackground, &g_sPWD, + &g_sKentec320x240x16_SSD2119, 10, 60, 120, 160, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The listbox widget callback function. +// +// This function is called whenever someone changes the selected entry in the +// listbox containing the files and directories found in the current directory. +// +//***************************************************************************** +void OnListBoxChange(tWidget *psWidget, int16_t i16Selected) +{ + int16_t i16Sel; + + // + // Get the current selection from the list box. + // + i16Sel = ListBoxSelectionGet(&g_sDirList); + + // + // Is there any selection? + // + if(i16Sel == -1) + { + return; + } + else + { + // + // Is the selection a directory name? + // + if(g_pcFilenames[i16Sel][1] == 'D') + { + // + // Enable the "CD" button. + // + WidgetAdd((tWidget *)&g_sCDBackground, (tWidget *)&g_sCDBtn); + } + else + { + // + // Hide the "CD" button. + // + WidgetRemove((tWidget *)&g_sCDBtn); + } + + // + // Make sure the CD button (or its background) is drawn correctly). + // + WidgetPaint((tWidget *)&g_sCDBackground); + } + + // + // Update the status display to say what we've done. + // + PrintfStatus("Selected %s %s\n", + (g_pcFilenames[i16Sel][1] == 'D') ? "dir" : "file", + &g_pcFilenames[i16Sel][4]); +} + +//***************************************************************************** +// +// The "CD" button widget callback function. +// +// This function is called whenever someone presses the "CD" button. +// +//***************************************************************************** +void OnBtnCD(tWidget *psWidget) +{ + int16_t i16Selected; + uint32_t ui32Reason; + FRESULT iFResult; + // + // Get the current selection from the list box. + // + i16Selected = ListBoxSelectionGet(&g_sDirList); + + // + // Is there any selection? + // + if(i16Selected == -1) + { + return; + } + else + { + // + // Is the selection a directory name? + // + if(g_pcFilenames[i16Selected][1] == 'D') + { + // + // Yes - change to the new directory. + // + iFResult = ChangeToDirectory(&g_pcFilenames[i16Selected][4], + &ui32Reason); + + if(iFResult != FR_OK) + { + // + // Update the status display to show the error. + // + PrintfStatus("Error changing directory."); + PrintfStatus((char *)StringFromFResult(iFResult)); + } + else + { + // + // Tell the user what happened. + // + PrintfStatus("Changed to %s", g_pcCwdBuf); + + // + // Update the directory name and the list box contents. + // + PopulateFileListBox(true); + WidgetPaint((tWidget *)&g_sPWD); + + // + // Enable the "Up" button and disable the "CD" button. + // + WidgetAdd((tWidget *)&g_sUpBackground, (tWidget *)&g_sUpBtn); + WidgetRemove((tWidget *)&g_sCDBtn); + + // + // Make sure the buttons are repainted correctly. + // + WidgetPaint((tWidget *)&g_sUpBtn); + WidgetPaint((tWidget *)&g_sCDBackground); + } + } + } +} + +//***************************************************************************** +// +// The "Up" button widget callback function. +// +// This function is called whenever someone presses the "Up" button. +// +//***************************************************************************** +void OnBtnUp(tWidget *psWidget) +{ + uint32_t ui32Reason; + FRESULT iFResult; + + // + // Change up one directory. + // + iFResult = ChangeToDirectory("..", &ui32Reason); + + if(iFResult != FR_OK) + { + // + // Update the status display to show the error. + // + PrintfStatus("Error changing directory."); + PrintfStatus((char *)StringFromFResult(iFResult)); + } + else + { + // + // Update the directory name and the list box contents. + // + WidgetPaint((tWidget *)&g_sPWD); + PopulateFileListBox(true); + + // + // If we are now in the root directory, hide the "Up" button. + // + if((strlen(g_pcCwdBuf) == 1) && (g_pcCwdBuf[0] == '/')) + { + WidgetRemove((tWidget *)&g_sUpBtn); + } + else + { + WidgetAdd((tWidget *)&g_sUpBackground, (tWidget *)&g_sUpBtn); + } + + // + // Disable the CD button since repopulating the list removes the + // selection. + // + WidgetRemove((tWidget *)&g_sCDBtn); + + // + // Tell the user what happened. + // + PrintfStatus("Changed to %s", g_pcCwdBuf); + + // + // Repaint the buttons. + // + WidgetPaint((tWidget *)&g_sUpBackground); + WidgetPaint((tWidget *)&g_sCDBackground); + } +} + +//***************************************************************************** +// +// This function is used to add a new string to the status list box at the +// bottom of the display. This shows errors and echos user commands entered +// via the UART. +// +//***************************************************************************** +static int +PrintfStatus(char *pcFormat, ...) +{ + int32_t i32Ret; + va_list vaArgP; + + // + // Start the varargs processing. + // + va_start(vaArgP, pcFormat); + + // + // Call vsnprintf to perform the conversion. + // + i32Ret = uvsnprintf(g_pcStatus[g_ui32StatusStringIndex], + MAX_STATUS_STRING_LEN, pcFormat, vaArgP); + + // + // End the varargs processing. + // + va_end(vaArgP); + + // + // Add the new string to the status listbox. + // + ListBoxTextAdd(&g_sStatusList, g_pcStatus[g_ui32StatusStringIndex]); + + // + // Update our string index. + // + g_ui32StatusStringIndex++; + if(g_ui32StatusStringIndex == NUM_STATUS_STRINGS) + { + g_ui32StatusStringIndex = 0; + } + + // + // Repaint the status listbox. + // + WidgetPaint((tWidget *)&g_sStatusList); + + // + // Return the conversion count. + // + return(i32Ret); + +} + +//***************************************************************************** +// +// This function returns a string representation of an error code +// that was returned from a function call to FatFs. It can be used +// for printing human readable error messages. +// +//***************************************************************************** +static const char * +StringFromFResult(FRESULT iFResult) +{ + uint32_t ui32Idx; + + // + // Enter a loop to search the error code table for a matching error code. + // + for(ui32Idx = 0; ui32Idx < NUM_FRESULT_CODES; ui32Idx++) + { + // + // If a match is found, then return the string name of the error code. + // + if(g_psFResultStrings[ui32Idx].iFResult == iFResult) + { + return(g_psFResultStrings[ui32Idx].pcResultStr); + } + } + + // + // At this point no matching code was found, so return a string indicating + // an unknown error. + // + return("UNKNOWN ERROR CODE"); +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. FatFs requires a timer tick +// every 10 ms for internal timing purposes. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Call the FatFs tick timer. + // + disk_timerproc(); +} + +//***************************************************************************** +// +// This function implements the "ls" command. It opens the current directory +// and enumerates through the contents, and prints a line for each item it +// finds. It shows details such as file attributes, time and date, and the +// file size, along with the name. It shows a summary of file sizes at the end +// along with free space. +// +//***************************************************************************** +int +Cmd_ls(int argc, char *argv[]) +{ + uint32_t ui32TotalSize, ui32ItemCount, ui32FileCount, ui32DirCount; + FRESULT iFResult; + FATFS *psFatFs; + char *pcFileName; +#if _USE_LFN + char pucLfn[_MAX_LFN + 1]; + g_sFileInfo.lfname = pucLfn; + g_sFileInfo.lfsize = sizeof(pucLfn); +#endif + + // + // Empty the list box on the display. + // + ListBoxClear(&g_sDirList); + + // + // Make sure the list box will be redrawn next time the message queue + // is processed. + // + WidgetPaint((tWidget *)&g_sDirList); + + // + // Open the current directory for access. + // + iFResult = f_opendir(&g_sDirObject, g_pcCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + // + // Ensure that the error is reported. + // + ListBoxTextAdd(&g_sDirList, "Error from SD Card:"); + ListBoxTextAdd(&g_sDirList, (char *)StringFromFResult(iFResult)); + return(iFResult); + } + + ui32TotalSize = 0; + ui32FileCount = 0; + ui32DirCount = 0; + ui32ItemCount = 0; + + // + // Give an extra blank line before the listing. + // + UARTprintf("\n"); + + // + // Enter loop to enumerate through all directory entries. + // + for(;;) + { + // + // Read an entry from the directory. + // + iFResult = f_readdir(&g_sDirObject, &g_sFileInfo); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + return((int)iFResult); + } + + // + // If the file name is blank, then this is the end of the listing. + // + if(!g_sFileInfo.fname[0]) + { + break; + } + +#if _USE_LFN + pcFileName = ((*g_sFileInfo.lfname)?g_sFileInfo.lfname:g_sFileInfo.fname); +#else + pcFileName = g_sFileInfo.fname; +#endif + + // + // Print the entry information on a single line with formatting to show + // the attributes, date, time, size, and name. + // + UARTprintf("%c%c%c%c%c %u/%02u/%02u %02u:%02u %9u %s\n", + (g_sFileInfo.fattrib & AM_DIR) ? 'D' : '-', + (g_sFileInfo.fattrib & AM_RDO) ? 'R' : '-', + (g_sFileInfo.fattrib & AM_HID) ? 'H' : '-', + (g_sFileInfo.fattrib & AM_SYS) ? 'S' : '-', + (g_sFileInfo.fattrib & AM_ARC) ? 'A' : '-', + (g_sFileInfo.fdate >> 9) + 1980, + (g_sFileInfo.fdate >> 5) & 15, + g_sFileInfo.fdate & 31, + (g_sFileInfo.ftime >> 11), + (g_sFileInfo.ftime >> 5) & 63, + g_sFileInfo.fsize, + pcFileName); + + // + // Add the information as a line in the listbox widget. + // + if(ui32ItemCount < NUM_LIST_STRINGS) + { + usprintf(g_pcFilenames[ui32ItemCount], "(%c) %12s", + (g_sFileInfo.fattrib & AM_DIR) ? 'D' : 'F', + g_sFileInfo.fname); + ListBoxTextAdd(&g_sDirList, g_pcFilenames[ui32ItemCount]); + } + + // + // If the attribute is directory, then increment the directory count. + // + if(g_sFileInfo.fattrib & AM_DIR) + { + ui32DirCount++; + } + + // + // Otherwise, it is a file. Increment the file count, and + // add in the file size to the total. + // + else + { + ui32FileCount++; + ui32TotalSize += g_sFileInfo.fsize; + } + + // + // Move to the next entry in the item array we use to populate the + // list box. + // + ui32ItemCount++; + + // + // Wait for the UART transmit buffer to empty. + // + UARTFlushTx(false); + + } // endfor + + // + // Print summary lines showing the file, dir, and size totals. + // + UARTprintf("\n%4u File(s),%10u bytes total\n%4u Dir(s)", + ui32FileCount, ui32TotalSize, ui32DirCount); + + // + // Get the free space. + // + iFResult = f_getfree("/", (DWORD *)&ui32TotalSize, &psFatFs); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + return((int)iFResult); + } + + // + // Display the amount of free space that was calculated. + // + UARTprintf(", %10uK bytes free\n", (ui32TotalSize * + psFatFs->free_clust / 2)); + // + // Wait for the UART transmit buffer to empty. + // + UARTFlushTx(false); + + // + // Made it to here, return with no errors. + // + return(0); +} + +//***************************************************************************** +// +// This function is called to read the contents of the current directory on +// the SD card and fill the listbox containing the names of all files and +// directories. +// +//***************************************************************************** +static int +PopulateFileListBox(bool bRepaint) +{ + uint32_t ui32ItemCount; + FRESULT iFResult; + + // + // Empty the list box on the display. + // + ListBoxClear(&g_sDirList); + + // + // Make sure the list box will be redrawn next time the message queue + // is processed. + // + if(bRepaint) + { + WidgetPaint((tWidget *)&g_sDirList); + } + + // + // Open the current directory for access. + // + iFResult = f_opendir(&g_sDirObject, g_pcCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + // + // Ensure that the error is reported. + // + PrintfStatus("Error from SD Card:"); + PrintfStatus((char *)StringFromFResult(iFResult)); + return(iFResult); + } + + ui32ItemCount = 0; + + // + // Enter loop to enumerate through all directory entries. + // + for(;;) + { + // + // Read an entry from the directory. + // + iFResult = f_readdir(&g_sDirObject, &g_sFileInfo); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + PrintfStatus("Error from SD Card:"); + PrintfStatus((char *)StringFromFResult(iFResult)); + return(iFResult); + } + + // + // If the file name is blank, then this is the end of the + // listing. + // + if(!g_sFileInfo.fname[0]) + { + break; + } + + // + // Add the information as a line in the listbox widget. + // + if(ui32ItemCount < NUM_LIST_STRINGS) + { + usnprintf(g_pcFilenames[ui32ItemCount], MAX_FILENAME_STRING_LEN, + "(%c) %s", (g_sFileInfo.fattrib & AM_DIR) ? 'D' : 'F', + g_sFileInfo.fname); + ListBoxTextAdd(&g_sDirList, g_pcFilenames[ui32ItemCount]); + } + + // + // Move to the next entry in the item array we use to populate the + // list box. + // + ui32ItemCount++; + } // endfor + + // + // Made it to here, return with no errors. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "cd" command. It takes an argument +// that specifes the directory to make the current working directory. +// Path separators must use a forward slash "/". The argument to cd +// can be one of the following: +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so dont try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory to +// make sure it exists. If the new path is opened successfully, then the +// current working directory (cwd) is changed to the new path. +// +// In cases of error, the pui32Reason parameter will be written with one of +// the following values: +// +//***************************************************************************** +static FRESULT +ChangeToDirectory(char *pcDirectory, uint32_t *pui32Reason) +{ + uint32_t ui32Idx; + FRESULT iFResult; + + // + // Copy the current working path into a temporary buffer so it can be + // manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If the first character is /, then this is a fully specified path, and it + // should just be used as-is. + // + if(pcDirectory[0] == '/') + { + // + // Make sure the new path is not bigger than the cwd buffer. + // + if(strlen(pcDirectory) + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_OK); + } + + // + // If the new path name (in argv[1]) is not too long, then + // copy it into the temporary buffer so it can be checked. + // + else + { + strncpy(g_pcTmpBuf, pcDirectory, sizeof(g_pcTmpBuf)); + } + } + + // + // If the argument is .. then attempt to remove the lowest level + // on the CWD. + // + else if(!strcmp(pcDirectory, "..")) + { + // + // Get the index to the last character in the current path. + // + ui32Idx = strlen(g_pcTmpBuf) - 1; + + // + // Back up from the end of the path name until a separator (/) is + // found, or until we bump up to the start of the path. + // + while((g_pcTmpBuf[ui32Idx] != '/') && (ui32Idx > 1)) + { + // + // Back up one character. + // + ui32Idx--; + } + + // + // Now we are either at the lowest level separator in the current path, + // or at the beginning of the string (root). So set the new end of + // string here, effectively removing that last part of the path. + // + g_pcTmpBuf[ui32Idx] = 0; + } + + // + // Otherwise this is just a normal path name from the current directory, + // and it needs to be appended to the current path. + // + else + { + // + // Test to make sure that when the new additional path is added on to + // the current path, there is room in the buffer for the full new path. + // It needs to include a new separator, and a trailing null character. + // + if(strlen(g_pcTmpBuf) + strlen(pcDirectory) + 1 + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_INVALID_OBJECT); + } + + // + // The new path is okay, so add the separator and then append the new + // directory to the path. + // + else + { + // + // If not already at the root level, then append a / + // + if(strcmp(g_pcTmpBuf, "/")) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Append the new directory to the path. + // + strcat(g_pcTmpBuf, pcDirectory); + } + } + + // + // At this point, a candidate new directory path is in chTmpBuf. Try to + // open it to make sure it is valid. + // + iFResult = f_opendir(&g_sDirObject, g_pcTmpBuf); + + // + // If it can't be opened, then it is a bad path. Inform the user and + // return. + // + if(iFResult != FR_OK) + { + *pui32Reason = OPENDIR_ERROR; + return(iFResult); + } + + // + // Otherwise, it is a valid new path, so copy it into the CWD and update + // the screen. + // + else + { + strncpy(g_pcCwdBuf, g_pcTmpBuf, sizeof(g_pcCwdBuf)); + } + + // + // Return success. + // + return(FR_OK); +} + +//***************************************************************************** +// +// This function implements the "cd" command. It takes an argument +// that specifes the directory to make the current working directory. +// Path separators must use a forward slash "/". The argument to cd +// can be one of the following: +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so dont try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory +// to make sure it exists. If the new path is opened successfully, then +// the current working directory (cwd) is changed to the new path. +// +//***************************************************************************** +int +Cmd_cd(int argc, char *argv[]) +{ + uint32_t ui32Reason; + FRESULT iFResult; + + // + // Try to change to the directory provided on the command line. + // + iFResult = ChangeToDirectory(argv[1], &ui32Reason); + + // + // If an error was reported, try to offer some helpful information. + // + if(iFResult != FR_OK) + { + switch(ui32Reason) + { + case OPENDIR_ERROR: + UARTprintf("Error opening new directory.\n"); + PrintfStatus("Error opening new directory.\n"); + break; + + case NAME_TOO_LONG_ERROR: + UARTprintf("Resulting path name is too long.\n"); + PrintfStatus("Resulting path name is too long.\n"); + break; + + default: + UARTprintf("An unrecognized error was reported.\n"); + PrintfStatus("An unrecognized error was reported.\n"); + break; + } + } + else + { + // + // Tell the user what happened. + // + PrintfStatus("Changed to %s", g_pcCwdBuf); + + // + // Update the contents of the file list. + // + PopulateFileListBox(true); + + // + // Update the current directory on the display. + // + WidgetPaint((tWidget *)&g_sPWD); + + // + // Enable the "Up" button if we are no longer in the root directory. + // + if((g_pcCwdBuf[0] == '/') && (g_pcCwdBuf[1] == '\0')) + { + // + // We are in the root directory so disable the "Up" button. + // + WidgetRemove((tWidget *)&g_sUpBtn); + } + else + { + // + // Enable the "Up" button. + // + WidgetAdd((tWidget *)&g_sUpBackground, (tWidget *)&g_sUpBtn); + } + + // + // Make sure the "Up" button is repainted correctly. + // + WidgetPaint((tWidget *)&g_sUpBackground); + } + + // + // Return the appropriate error code. + // + return(iFResult); +} + +//***************************************************************************** +// +// This function implements the "pwd" command. It simply prints the current +// working directory. +// +//***************************************************************************** +int +Cmd_pwd(int argc, char *argv[]) +{ + // + // Print the CWD to the console. + // + UARTprintf("%s\n", g_pcCwdBuf); + + // + // Wait for the UART transmit buffer to empty. + // + UARTFlushTx(false); + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "cat" command. It reads the contents of a file +// and prints it to the console. This should only be used on text files. If +// it is used on a binary file, then a bunch of garbage is likely to printed on +// the console. +// +//***************************************************************************** +int +Cmd_cat(int argc, char *argv[]) +{ + FRESULT iFResult; + uint32_t ui32BytesRead; + + // + // First, check to make sure that the current path (CWD), plus the file + // name, plus a separator and trailing null, will all fit in the temporary + // buffer that will be used to hold the file name. The file name must be + // fully specified, with path, to FatFs. + // + if(strlen(g_pcCwdBuf) + strlen(argv[1]) + 1 + 1 > sizeof(g_pcTmpBuf)) + { + UARTprintf("Resulting path name is too long\n"); + return(0); + } + + // + // Copy the current path to the temporary buffer so it can be manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If not already at the root level, then append a separator. + // + if(strcmp("/", g_pcCwdBuf)) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Now finally, append the file name to result in a fully specified file. + // + strcat(g_pcTmpBuf, argv[1]); + + // + // Open the file for reading. + // + iFResult = f_open(&g_sFileObject, g_pcTmpBuf, FA_READ); + + // + // If there was some problem opening the file, then return an error. + // + if(iFResult != FR_OK) + { + return((int)iFResult); + } + + // + // Enter a loop to repeatedly read data from the file and display it, until + // the end of the file is reached. + // + do + { + // + // Read a block of data from the file. Read as much as can fit in the + // temporary buffer, including a space for the trailing null. + // + iFResult = f_read(&g_sFileObject, g_pcTmpBuf, sizeof(g_pcTmpBuf) - 1, + (UINT *)&ui32BytesRead); + + // + // If there was an error reading, then print a newline and return the + // error to the user. + // + if(iFResult != FR_OK) + { + UARTprintf("\n"); + return((int)iFResult); + } + + // + // Null terminate the last block that was read to make it a null + // terminated string that can be used with printf. + // + g_pcTmpBuf[ui32BytesRead] = 0; + + // + // Print the last chunk of the file that was received. + // + UARTprintf("%s", g_pcTmpBuf); + + // + // Wait for the UART transmit buffer to empty. + // + UARTFlushTx(false); + + // + // Continue reading until less than the full number of bytes are + // read. That means the end of the buffer was reached. + // + } + while(ui32BytesRead == sizeof(g_pcTmpBuf) - 1); + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "help" command. It prints a simple list of the +// available commands with a brief description. +// +//***************************************************************************** +int +Cmd_help(int argc, char *argv[]) +{ + tCmdLineEntry *psEntry; + + // + // Print some header text. + // + UARTprintf("\nAvailable commands\n"); + UARTprintf("------------------\n"); + + // + // Point at the beginning of the command table. + // + psEntry = &g_psCmdTable[0]; + + // + // Enter a loop to read each entry from the command table. The end of the + // table has been reached when the command name is NULL. + // + while(psEntry->pcCmd) + { + // + // Print the command name and the brief description. + // + UARTprintf("%6s: %s\n", psEntry->pcCmd, psEntry->pcHelp); + + // + // Advance to the next entry in the table. + // + psEntry++; + + // + // Wait for the UART to catch up. + // + UARTFlushTx(false); + } + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This is the table that holds the command names, implementing functions, and +// brief description. +// +//***************************************************************************** +tCmdLineEntry g_psCmdTable[] = +{ + { "help", Cmd_help, "Display list of commands" }, + { "h", Cmd_help, "alias for help" }, + { "?", Cmd_help, "alias for help" }, + { "ls", Cmd_ls, "Display list of files" }, + { "chdir", Cmd_cd, "Change directory" }, + { "cd", Cmd_cd, "alias for chdir" }, + { "pwd", Cmd_pwd, "Show current working directory" }, + { "cat", Cmd_cat, "Show contents of a text file" }, + { 0, 0, 0 } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The program main function. It performs initialization, then runs a command +// processing loop to read commands from the console. +// +//***************************************************************************** +int +main(void) +{ + int nStatus; + FRESULT iFResult; + + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | + SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "sd-card"); + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(g_ui32SysClock / 100); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, g_ui32SysClock); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(g_ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(WidgetPointerMessage); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sBackground); + + // + // Set some initial strings. + // + ListBoxTextAdd(&g_sDirList, "Initializing..."); + + // + // Issue the initial paint request to the widgets then immediately call + // the widget manager to process the paint message. This ensures that the + // display is drawn as quickly as possible and saves the delay we would + // otherwise experience if we processed the paint message after mounting + // and reading the SD card. + // + WidgetPaint(WIDGET_ROOT); + WidgetMessageQueueProcess(); + + // + // Print hello message to user. + // + UARTprintf("\n\nSD Card Example Program\n"); + UARTprintf("Type \'help\' for help.\n"); + + // + // Mount the file system, using logical disk 0. + // + iFResult = f_mount(0, &g_sFatFs); + if(iFResult != FR_OK) + { + UARTprintf("f_mount error: %s\n", StringFromFResult(iFResult)); + return(1); + } + + // + // Populate the list box with the contents of the root directory. + // + PopulateFileListBox(true); + + // + // Enter an (almost) infinite loop for reading and processing commands from + // the user. + // + while(1) + { + // + // Print a prompt to the console. Show the CWD. + // + UARTprintf("\n%s> ", g_pcCwdBuf); + + // + // Is there a command waiting to be processed? + // + while(UARTPeek('\r') < 0) + { + // + // Process any messages in the widget message queue. + // + WidgetMessageQueueProcess(); + } + + // + // Get a line of text from the user. + // + UARTgets(g_pcCmdBuf, sizeof(g_pcCmdBuf)); + + // + // Pass the line from the user to the command processor. It will be + // parsed and valid commands executed. + // + nStatus = CmdLineProcess(g_pcCmdBuf); + + // + // Handle the case of bad command. + // + if(nStatus == CMDLINE_BAD_CMD) + { + UARTprintf("Bad command!\n"); + } + + // + // Handle the case of too many arguments. + // + else if(nStatus == CMDLINE_TOO_MANY_ARGS) + { + UARTprintf("Too many arguments for command processor!\n"); + } + + // + // Otherwise the command was executed. Print the error code if one was + // returned. + // + else if(nStatus != 0) + { + UARTprintf("Command returned error code %s\n", + StringFromFResult((FRESULT)nStatus)); + } + } +} diff --git a/boards/dk-tm4c129x/sd_card/sd_card.ewd b/boards/dk-tm4c129x/sd_card/sd_card.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/sd_card.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/sd_card/sd_card.ewp b/boards/dk-tm4c129x/sd_card/sd_card.ewp new file mode 100644 index 0000000..205d8d7 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/sd_card.ewp @@ -0,0 +1,823 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\option\cc932.c + + + $PROJ_DIR$\..\..\..\..\utils\cmdline.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\sd_card.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/sd_card/sd_card.icf b/boards/dk-tm4c129x/sd_card/sd_card.icf new file mode 100644 index 0000000..8a589f2 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/sd_card.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// sd_card.icf - Linker configuration file for sd_card. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/sd_card/sd_card.ld b/boards/dk-tm4c129x/sd_card/sd_card.ld new file mode 100644 index 0000000..5b3a329 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/sd_card.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * sd_card.ld - Linker configuration file for sd_card. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/sd_card/sd_card.sct b/boards/dk-tm4c129x/sd_card/sd_card.sct new file mode 100644 index 0000000..fe3711d --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/sd_card.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; sd_card.sct - Linker configuration file for sd_card. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/sd_card/sd_card.uvopt b/boards/dk-tm4c129x/sd_card/sd_card.uvopt new file mode 100644 index 0000000..ccfe1ea --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/sd_card.uvopt @@ -0,0 +1,443 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + sd_card + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\option\cc932.c + cc932.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\cmdline.c + cmdline.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + mmc-dk-tm4c129x.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\sd_card.c + sd_card.c + + + 1 + 9 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 14 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 15 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/sd_card/sd_card.uvproj b/boards/dk-tm4c129x/sd_card/sd_card.uvproj new file mode 100644 index 0000000..46d41c3 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/sd_card.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + sd_card + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + sd_card + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\sd_card.bin .\rvmdk\sd_card.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 ENABLE_LFN UART_BUFFERED + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + sd_card.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cc932.c + 1 + ..\..\..\..\third_party\fatfs\src\option\cc932.c + + + cmdline.c + 1 + ..\..\..\..\utils\cmdline.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + mmc-dk-tm4c129x.c + 1 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + sd_card.c + 1 + .\sd_card.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/sd_card/sd_card_ccs.cmd b/boards/dk-tm4c129x/sd_card/sd_card_ccs.cmd new file mode 100644 index 0000000..5bb5155 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/sd_card_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * sd_card_ccs.cmd - CCS linker configuration file for sd_card. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/sd_card/startup_ccs.c b/boards/dk-tm4c129x/sd_card/startup_ccs.c new file mode 100644 index 0000000..630b0c5 --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void UARTStdioIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/sd_card/startup_ewarm.c b/boards/dk-tm4c129x/sd_card/startup_ewarm.c new file mode 100644 index 0000000..3e79ade --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void UARTStdioIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/sd_card/startup_gcc.c b/boards/dk-tm4c129x/sd_card/startup_gcc.c new file mode 100644 index 0000000..0e4632c --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void UARTStdioIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/sd_card/startup_rvmdk.S b/boards/dk-tm4c129x/sd_card/startup_rvmdk.S new file mode 100644 index 0000000..3be1d1c --- /dev/null +++ b/boards/dk-tm4c129x/sd_card/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SysTickHandler + EXTERN UARTStdioIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTStdioIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/sha1_hash/Makefile b/boards/dk-tm4c129x/sha1_hash/Makefile new file mode 100644 index 0000000..6f151ac --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the SHA1 Hash Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the SHA1 Hash Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/sha1_hash.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the SHA1 Hash Demo. +# +${COMPILER}/sha1_hash.axf: ${COMPILER}/frame.o +${COMPILER}/sha1_hash.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/sha1_hash.axf: ${COMPILER}/pinout.o +${COMPILER}/sha1_hash.axf: ${COMPILER}/sha1_hash.o +${COMPILER}/sha1_hash.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/sha1_hash.axf: ${COMPILER}/uartstdio.o +${COMPILER}/sha1_hash.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/sha1_hash.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/sha1_hash.axf: sha1_hash.ld +SCATTERgcc_sha1_hash=sha1_hash.ld +ENTRY_sha1_hash=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/sha1_hash/ccs/.ccsimportspec b/boards/dk-tm4c129x/sha1_hash/ccs/.ccsimportspec new file mode 100644 index 0000000..b5b0021 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/sha1_hash/ccs/.ccsproject b/boards/dk-tm4c129x/sha1_hash/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/sha1_hash/ccs/.cproject b/boards/dk-tm4c129x/sha1_hash/ccs/.cproject new file mode 100644 index 0000000..a14d344 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/sha1_hash/ccs/.project b/boards/dk-tm4c129x/sha1_hash/ccs/.project new file mode 100644 index 0000000..fa44b4d --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/ccs/.project @@ -0,0 +1,70 @@ + + + sha1_hash + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + sha1_hash.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/sha1_hash/sha1_hash.c + + + sha1_hash_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/sha1_hash/sha1_hash_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/sha1_hash/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/sha1_hash/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/sha1_hash/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/sha1_hash/ccs/Debug/sha1_hash.bin b/boards/dk-tm4c129x/sha1_hash/ccs/Debug/sha1_hash.bin new file mode 100644 index 0000000..28553d7 Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hash/ccs/Debug/sha1_hash.bin differ diff --git a/boards/dk-tm4c129x/sha1_hash/ccs/Debug/sha1_hash.out b/boards/dk-tm4c129x/sha1_hash/ccs/Debug/sha1_hash.out new file mode 100644 index 0000000..0601071 Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hash/ccs/Debug/sha1_hash.out differ diff --git a/boards/dk-tm4c129x/sha1_hash/ccs/macros.ini_initial b/boards/dk-tm4c129x/sha1_hash/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/sha1_hash/ccs/target_config.ccxml b/boards/dk-tm4c129x/sha1_hash/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/sha1_hash/ewarm/Exe/sha1_hash.bin b/boards/dk-tm4c129x/sha1_hash/ewarm/Exe/sha1_hash.bin new file mode 100644 index 0000000..ff4794d Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hash/ewarm/Exe/sha1_hash.bin differ diff --git a/boards/dk-tm4c129x/sha1_hash/ewarm/Exe/sha1_hash.out b/boards/dk-tm4c129x/sha1_hash/ewarm/Exe/sha1_hash.out new file mode 100644 index 0000000..199f49e Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hash/ewarm/Exe/sha1_hash.out differ diff --git a/boards/dk-tm4c129x/sha1_hash/gcc/sha1_hash.axf b/boards/dk-tm4c129x/sha1_hash/gcc/sha1_hash.axf new file mode 100644 index 0000000..5aeb94a Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hash/gcc/sha1_hash.axf differ diff --git a/boards/dk-tm4c129x/sha1_hash/gcc/sha1_hash.bin b/boards/dk-tm4c129x/sha1_hash/gcc/sha1_hash.bin new file mode 100644 index 0000000..c9c3371 Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hash/gcc/sha1_hash.bin differ diff --git a/boards/dk-tm4c129x/sha1_hash/readme.txt b/boards/dk-tm4c129x/sha1_hash/readme.txt new file mode 100644 index 0000000..b6b4169 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/readme.txt @@ -0,0 +1,26 @@ +SHA1 Hash Demo + +Simple example showing SHA1 hash generation using a block of random data. + +Please note that the use of uDMA is not required for the operation of the +SHA module. It is for demostration purposes only. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/sha1_hash/rvmdk/sha1_hash.axf b/boards/dk-tm4c129x/sha1_hash/rvmdk/sha1_hash.axf new file mode 100644 index 0000000..7fb0d53 Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hash/rvmdk/sha1_hash.axf differ diff --git a/boards/dk-tm4c129x/sha1_hash/rvmdk/sha1_hash.bin b/boards/dk-tm4c129x/sha1_hash/rvmdk/sha1_hash.bin new file mode 100644 index 0000000..70f1d1f Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hash/rvmdk/sha1_hash.bin differ diff --git a/boards/dk-tm4c129x/sha1_hash/sha1_hash.c b/boards/dk-tm4c129x/sha1_hash/sha1_hash.c new file mode 100644 index 0000000..81fcc85 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/sha1_hash.c @@ -0,0 +1,670 @@ +//***************************************************************************** +// +// sha1_hash.c - Simple SHA1 hash demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_shamd5.h" +#include "driverlib/debug.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/shamd5.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      SHA1 Hash Demo (sha1_hash)

      +//! +//! Simple example showing SHA1 hash generation using a block of random data. +//! +//! Please note that the use of uDMA is not required for the operation of the +//! SHA module. It is for demostration purposes only. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Source data for producing hashes. This array contains 1024 bytes of +// randomly generated data. +// +//***************************************************************************** +uint32_t g_pui32RandomData[] = +{ + 0x7c68c9ec, 0x72af34b3, 0xca0edf2e, 0x60f4860d, 0x50cfa1dc, 0x9a2b538c, + 0x98450274, 0x60f5c272, 0x7317d78e, 0x2361ca0e, 0xfa4a52b1, 0x658f729b, + 0x5267f9d9, 0x1bccd3ca, 0x2f0bb993, 0x1be38a3d, 0x00bd2d2a, 0x97405e63, + 0xe3efd585, 0xb02d1588, 0xe55d71c8, 0x43a27ecf, 0x5fd275db, 0x73ad8f06, + 0x88f55495, 0x68922493, 0x03ea6039, 0xe40a678a, 0x052847ce, 0xf7a28b46, + 0x3b60c73e, 0x3f08dbd4, 0x2a66b3a6, 0xcf398b15, 0xacbfc6d8, 0x6c15a285, + 0x997d0e01, 0xbfd12e26, 0xa26bc485, 0xb8946d2f, 0x0f84742b, 0x5be82a2f, + 0x8d2e2cc7, 0xc7a1dea6, 0xcfaa6cb6, 0xe706434c, 0x079810d0, 0x5eca9400, + 0x7b92dd1c, 0x1ec552e8, 0xa74ae9c3, 0x2e859af5, 0x8d9d1a35, 0x07ff6040, + 0xc0b19670, 0x2e348aa8, 0xed89efea, 0x3262e8f0, 0x45093372, 0x8f8bae5c, + 0x505d64bb, 0x9a172079, 0x327b5f67, 0xa3a12ba8, 0x7f573054, 0xd3d5f778, + 0xbc1bd124, 0x0d0ad1c6, 0x24ac345b, 0x4f50084a, 0x302a5985, 0xfa3e8b86, + 0x2022c497, 0xd297e4b4, 0xd1c53c01, 0x6e541890, 0x93ec53c6, 0x24c5ce2b, + 0xdd38e334, 0x078a0334, 0x2a470b22, 0xadad86b4, 0x7b2041db, 0xc74ce30b, + 0x8e6dc4ca, 0x273b85c8, 0x339d2334, 0x86d1dacc, 0xd588e165, 0xcee15221, + 0x8e11a0a1, 0x9315a6c2, 0x53e9fa9a, 0xf4bb6d7a, 0x421cb9ec, 0x1f370567, + 0xfd8c880f, 0xd20797cd, 0x90aee852, 0x2a2f966a, 0x126ffcdd, 0x44a2f09a, + 0xbac72ac4, 0x77d588c5, 0x77b53c09, 0x275b8828, 0x778a2be5, 0x40167d1e, + 0x550c0c94, 0x14e070e7, 0x597ff5a3, 0xbef40dc2, 0x8306d119, 0x6a8d29a6, + 0xb5d8e740, 0x52a37fe2, 0xdf34ad27, 0x1bb885fd, 0x6dd352f8, 0x8b0d62b5, + 0x5c82d35f, 0x0eb84312, 0xd2c7823a, 0x494f7a00, 0x30680642, 0x01fa9460, + 0xdc63956f, 0x70fa0b53, 0xd0865e78, 0x3a52e983, 0x318a881c, 0x4d113947, + 0xc0f302df, 0x6b2027fb, 0x1078566d, 0xd71d39a6, 0xcdd00388, 0x119e3c4e, + 0x4ddbf1c6, 0xb371eb0f, 0xdcbd768f, 0x2fc5b5e8, 0xc67a2efe, 0x29d18630, + 0xb389d68f, 0x26a71f13, 0x43583b57, 0x56f5eae8, 0x2edc7cd5, 0xcc93d41e, + 0xab691f87, 0x51ab1d8e, 0x37c2966e, 0x19ccd9ec, 0xb782124a, 0xdefc2804, + 0xea3bde3c, 0x46d81e08, 0xf828d58e, 0x757a39d3, 0xc92f1b5f, 0x56a2b368, + 0x1bbbb9b9, 0x46086ac7, 0x8a343144, 0x1675157a, 0x28ac0cf1, 0xb8695178, + 0x25fc4cec, 0x3f23a44e, 0x0a697977, 0x525794ad, 0xf920e15c, 0x49a0a7a7, + 0x1f54cafb, 0x7357b64c, 0x6d3a19c6, 0x5efb526d, 0x3d37f6e2, 0xd4f5835b, + 0x6ff454ee, 0x4f2a311c, 0x83cc4a40, 0x003036e9, 0xd481bf33, 0x38868b3c, + 0x63ee4445, 0x58426a29, 0xa022ae59, 0x07deb8ce, 0xfe3e673d, 0x176aa368, + 0xf2b18641, 0xbadeccd8, 0xea7a72b4, 0x72ccf0a0, 0xcdee3b08, 0x1689c54f, + 0xd577085a, 0xd9d79bd1, 0x089fa69a, 0x03fdaf65, 0x855e5697, 0x5788c00c, + 0x1139e03e, 0x48f4305f, 0x2d8ad2fd, 0x71ab04b5, 0xf5c7871c, 0x76801f21, + 0x329a590e, 0xe8e982a2, 0xdb67783e, 0x26ebf88b, 0x13ac5de7, 0x69b07707, + 0x2bc54e92, 0xc2556f94, 0x6d21bc3b, 0x3a230d0c, 0x4e02eeec, 0x53605beb, + 0x3a31e796, 0x6e186887, 0x8f93356e, 0xfa2342e4, 0xfbf2f519, 0x7ae95455, + 0xad6e9d94, 0xd942c7ab, 0x624f7aed, 0xd4158624, 0x82a0c0a9, 0x6d79b262, + 0xa7b9c84d, 0x2015bfeb, 0x462c7267, 0x44a17743, 0x7d207f71, 0xc2ab7566, + 0xaa833e65, 0x0a6c385e, 0x3b2d85f1, 0x8a4821a8, 0x62bf5742, 0xf55cf0e1, + 0xfc07d0d9, 0x54910235, 0xe8ae66c9, 0x9beb7306, 0xe5671f9e, 0x3332ad03, + 0xdb2343b6, 0x124332ac, 0xf595c7fb, 0xda2c72b0 +}; + +//***************************************************************************** +// +// Expected hash results. These results have been separately verified using +// a Perl script. +// +//***************************************************************************** +typedef struct SHA1TestVectorStruct +{ + uint32_t pui32HashResult[5]; + uint32_t ui32DataLength; +} +tSHA1TestVector; + +tSHA1TestVector g_psSHA1TestVectors[] = +{ + { + { 0xe08e0896, 0xe63b4b20, 0x5c8d85b0, 0x95a95bdd, 0x2b4f2797 }, + 1024 + }, + { + { 0x11e16f58, 0x04518339, 0x6e6bcaff, 0xdf48fb60, 0xed5ff029 }, + 1000 + }, + { + { 0xeea339da, 0x0d4b6b5e, 0xefbf5532, 0x90186095, 0x0907d8af }, + 0 + } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The SHA/MD5 interrupt handler +// +//***************************************************************************** + +// +// Flags to check that interrupts were successfully generated. +// +volatile bool g_bContextReadyFlag; +volatile bool g_bParthashReadyFlag; +volatile bool g_bInputReadyFlag; +volatile bool g_bOutputReadyFlag; +volatile bool g_bContextInDMADoneFlag; +volatile bool g_bDataInDMADoneFlag; +volatile bool g_bContextOutDMADoneFlag; + +void +SHAMD5IntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the SHA/MD5 masked interrupt status. + // + ui32IntStatus = ROM_SHAMD5IntStatus(SHAMD5_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & SHAMD5_INT_CONTEXT_READY) + { + ROM_SHAMD5IntDisable(SHAMD5_BASE, SHAMD5_INT_CONTEXT_READY); + g_bContextReadyFlag = true; + UARTprintf("Context input registers are ready.\n"); + } + if(ui32IntStatus & SHAMD5_INT_PARTHASH_READY) + { + ROM_SHAMD5IntDisable(SHAMD5_BASE, SHAMD5_INT_PARTHASH_READY); + UARTprintf("Context output registers are ready after a\n"); + UARTprintf("context switch.\n"); + } + if(ui32IntStatus & SHAMD5_INT_INPUT_READY) + { + ROM_SHAMD5IntDisable(SHAMD5_BASE, SHAMD5_INT_INPUT_READY); + g_bInputReadyFlag = true; + UARTprintf("Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & SHAMD5_INT_OUTPUT_READY) + { + ROM_SHAMD5IntDisable(SHAMD5_BASE, SHAMD5_INT_OUTPUT_READY); + g_bOutputReadyFlag = true; + UARTprintf("Context output registers are ready.\n"); + } + if(ui32IntStatus & SHAMD5_INT_DMA_CONTEXT_IN) + { + ROM_SHAMD5IntClear(SHAMD5_BASE, SHAMD5_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneFlag = true; + UARTprintf("DMA completed a context write to the internal\n"); + UARTprintf("registers.\n"); + } + if(ui32IntStatus & SHAMD5_INT_DMA_DATA_IN) + { + ROM_SHAMD5IntClear(SHAMD5_BASE, SHAMD5_INT_DMA_DATA_IN); + g_bDataInDMADoneFlag = true; + UARTprintf("DMA has written the last word of input data to\n"); + UARTprintf("the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & SHAMD5_INT_DMA_CONTEXT_OUT) + { + ROM_SHAMD5IntClear(SHAMD5_BASE, SHAMD5_INT_DMA_CONTEXT_OUT); + g_bContextOutDMADoneFlag = true; + UARTprintf("DMA completed the output context movement from\n"); + UARTprintf("the internal registers.\n"); + } +} + +//***************************************************************************** +// +// Generate a hash for the given data. +// +//***************************************************************************** +void +SHA1HashGenerate(uint32_t *pui32Data, uint32_t ui32DataLength, + uint32_t *pui32HashResult, bool bUseDMA) +{ + // + // Perform a soft reset of the SHA module. + // + ROM_SHAMD5Reset(SHAMD5_BASE); + + // + // Clear the flags + // + g_bContextReadyFlag = false; + g_bInputReadyFlag = false; + g_bDataInDMADoneFlag = false; + g_bContextOutDMADoneFlag = false; + + // + // Enable interrupts. + // + ROM_SHAMD5IntEnable(SHAMD5_BASE, (SHAMD5_INT_CONTEXT_READY | + SHAMD5_INT_PARTHASH_READY | + SHAMD5_INT_INPUT_READY | + SHAMD5_INT_OUTPUT_READY)); + + // + // Wait for the context ready flag. + // + while(!g_bContextReadyFlag) + { + } + + // + // Configure the SHA/MD5 module. + // + ROM_SHAMD5ConfigSet(SHAMD5_BASE, SHAMD5_ALGO_SHA1); + + // + // Use DMA to write the data into the SHA/MD5 module. + // + if(bUseDMA) + { + // + // Enable DMA done interrupts. + // + ROM_SHAMD5IntEnable(SHAMD5_BASE, (SHAMD5_INT_DMA_CONTEXT_IN | + SHAMD5_INT_DMA_DATA_IN | + SHAMD5_INT_DMA_CONTEXT_OUT)); + + if(ui32DataLength != 0) + { + // + // Setup the DMA module to copy data in. + // + ROM_uDMAChannelAssign(UDMA_CH5_SHAMD50DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH5_SHAMD50DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH5_SHAMD50DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_16 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH5_SHAMD50DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Data, + (void *)(SHAMD5_BASE + + SHAMD5_O_DATA_0_IN), + ui32DataLength / 4); + ROM_uDMAChannelEnable(UDMA_CH5_SHAMD50DIN); + UARTprintf("Data in DMA request enabled.\n"); + } + + // + // Setup the DMA module to copy the hash out. + // + ROM_uDMAChannelAssign(UDMA_CH6_SHAMD50COUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH6_SHAMD50COUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH6_SHAMD50COUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_32 | UDMA_ARB_8 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH6_SHAMD50COUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(SHAMD5_BASE + SHAMD5_O_IDIGEST_A), + (void *)pui32HashResult, 5); + ROM_uDMAChannelEnable(UDMA_CH6_SHAMD50COUT); + UARTprintf("Context out DMA request enabled.\n"); + + // + // Enable DMA in the SHA/MD5 module. + // + ROM_SHAMD5DMAEnable(SHAMD5_BASE); + + // + // Write the length. + // + ROM_SHAMD5HashLengthSet(SHAMD5_BASE, ui32DataLength); + + if(ui32DataLength != 0) + { + // + // Wait for the DMA done interrupt. + // + while(!g_bDataInDMADoneFlag) + { + } + } + + // + // Wait for the next DMA done interrupt. + // + while(!g_bContextOutDMADoneFlag) + { + } + + // + // Disable DMA requests. + // + ROM_SHAMD5DMADisable(SHAMD5_BASE); + } + + // + // Perform hash computation by copying the data with the CPU. + // + else + { + // + // Perform the hashing operation + // + ROM_SHAMD5DataProcess(SHAMD5_BASE, pui32Data, ui32DataLength, + pui32HashResult); + } +} + +//***************************************************************************** +// +// Initializes the CCM and SHA/MD5 modules. +// +//***************************************************************************** +bool +SHAMD5Init(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf(" No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example generates hashes from a random block of data and empty block. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32HashResult[5], ui32Errors, ui32Vector, ui32Idx, ui32SysClock; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "sha1-hash"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + + // + // Enable SHA interrupts. + // + ROM_IntEnable(INT_SHA0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting SHA1 hash encryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and SHAMD5 modules. + // + if(!SHAMD5Init()) + { + UARTprintf("Initialization of the SHA module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Run tests without uDMA. + // + for(ui32Vector = 0; ui32Vector < 3; ui32Vector++) + { + UARTprintf("Running test #%d without uDMA\n", ui32Vector); + + // + // Generate the hash. + // + SHA1HashGenerate(g_pui32RandomData, + g_psSHA1TestVectors[ui32Vector].ui32DataLength, + pui32HashResult, false); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 5; ui32Idx++) + { + if(pui32HashResult[ui32Idx] != + g_psSHA1TestVectors[ui32Vector].pui32HashResult[ui32Idx]) + { + UARTprintf("Hash result mismatch - Exp: 0x%x, Act: 0x%x\n", + g_psSHA1TestVectors[ui32Vector]. + pui32HashResult[ui32Idx], pui32HashResult[0]); + ui32Errors |= ((ui32Idx << 16) | 0x2); + } + } + } + + // + // Run tests with uDMA. + // + for(ui32Vector = 0; ui32Vector < 3; ui32Vector++) + { + UARTprintf("Running test #%d with uDMA\n", ui32Vector); + + // + // Generate the hash. + // + SHA1HashGenerate(g_pui32RandomData, + g_psSHA1TestVectors[ui32Vector].ui32DataLength, + pui32HashResult, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 5; ui32Idx++) + { + if(pui32HashResult[ui32Idx] != + g_psSHA1TestVectors[ui32Vector].pui32HashResult[ui32Idx]) + { + UARTprintf("Hash result mismatch - Exp: 0x%x, Act: 0x%x\n", + g_psSHA1TestVectors[ui32Vector]. + pui32HashResult[ui32Idx], pui32HashResult[0]); + ui32Errors |= ((ui32Idx << 16) | 0x3); + } + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/sha1_hash/sha1_hash.ewd b/boards/dk-tm4c129x/sha1_hash/sha1_hash.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/sha1_hash.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/sha1_hash/sha1_hash.ewp b/boards/dk-tm4c129x/sha1_hash/sha1_hash.ewp new file mode 100644 index 0000000..ee1c7b0 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/sha1_hash.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\sha1_hash.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/sha1_hash/sha1_hash.icf b/boards/dk-tm4c129x/sha1_hash/sha1_hash.icf new file mode 100644 index 0000000..6adf7d0 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/sha1_hash.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// sha1_hash.icf - Linker configuration file for sha1_hash. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/sha1_hash/sha1_hash.ld b/boards/dk-tm4c129x/sha1_hash/sha1_hash.ld new file mode 100644 index 0000000..bad97da --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/sha1_hash.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * sha1_hash.ld - Linker configuration file for sha1_hash. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/sha1_hash/sha1_hash.sct b/boards/dk-tm4c129x/sha1_hash/sha1_hash.sct new file mode 100644 index 0000000..cafaee8 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/sha1_hash.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; sha1_hash.sct - Linker configuration file for sha1_hash. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/sha1_hash/sha1_hash.uvopt b/boards/dk-tm4c129x/sha1_hash/sha1_hash.uvopt new file mode 100644 index 0000000..0f2dc5a --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/sha1_hash.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + sha1_hash + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\sha1_hash.c + sha1_hash.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/sha1_hash/sha1_hash.uvproj b/boards/dk-tm4c129x/sha1_hash/sha1_hash.uvproj new file mode 100644 index 0000000..b4587a3 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/sha1_hash.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + sha1_hash + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + sha1_hash + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\sha1_hash.bin .\rvmdk\sha1_hash.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + sha1_hash.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + sha1_hash.c + 1 + .\sha1_hash.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/sha1_hash/sha1_hash_ccs.cmd b/boards/dk-tm4c129x/sha1_hash/sha1_hash_ccs.cmd new file mode 100644 index 0000000..bed8652 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/sha1_hash_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * sha1_hash_ccs.cmd - CCS linker configuration file for sha1_hash. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/sha1_hash/startup_ccs.c b/boards/dk-tm4c129x/sha1_hash/startup_ccs.c new file mode 100644 index 0000000..1652405 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SHAMD5IntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + SHAMD5IntHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/sha1_hash/startup_ewarm.c b/boards/dk-tm4c129x/sha1_hash/startup_ewarm.c new file mode 100644 index 0000000..db90816 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SHAMD5IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + SHAMD5IntHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/sha1_hash/startup_gcc.c b/boards/dk-tm4c129x/sha1_hash/startup_gcc.c new file mode 100644 index 0000000..08d01f3 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SHAMD5IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + SHAMD5IntHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/sha1_hash/startup_rvmdk.S b/boards/dk-tm4c129x/sha1_hash/startup_rvmdk.S new file mode 100644 index 0000000..5d04775 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hash/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN SHAMD5IntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD SHAMD5IntHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/sha1_hmac/Makefile b/boards/dk-tm4c129x/sha1_hmac/Makefile new file mode 100644 index 0000000..d33d663 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the SHA1 HMAC Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the SHA1 HMAC Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/sha1_hmac.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the SHA1 HMAC Demo. +# +${COMPILER}/sha1_hmac.axf: ${COMPILER}/frame.o +${COMPILER}/sha1_hmac.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/sha1_hmac.axf: ${COMPILER}/pinout.o +${COMPILER}/sha1_hmac.axf: ${COMPILER}/sha1_hmac.o +${COMPILER}/sha1_hmac.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/sha1_hmac.axf: ${COMPILER}/uartstdio.o +${COMPILER}/sha1_hmac.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/sha1_hmac.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/sha1_hmac.axf: sha1_hmac.ld +SCATTERgcc_sha1_hmac=sha1_hmac.ld +ENTRY_sha1_hmac=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/sha1_hmac/ccs/.ccsimportspec b/boards/dk-tm4c129x/sha1_hmac/ccs/.ccsimportspec new file mode 100644 index 0000000..aadf516 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/sha1_hmac/ccs/.ccsproject b/boards/dk-tm4c129x/sha1_hmac/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/sha1_hmac/ccs/.cproject b/boards/dk-tm4c129x/sha1_hmac/ccs/.cproject new file mode 100644 index 0000000..8ad8822 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/sha1_hmac/ccs/.project b/boards/dk-tm4c129x/sha1_hmac/ccs/.project new file mode 100644 index 0000000..895e2b0 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/ccs/.project @@ -0,0 +1,70 @@ + + + sha1_hmac + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + sha1_hmac.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.c + + + sha1_hmac_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/sha1_hmac/sha1_hmac_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/sha1_hmac/startup_ccs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/sha1_hmac/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/sha1_hmac/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/sha1_hmac/ccs/Debug/sha1_hmac.bin b/boards/dk-tm4c129x/sha1_hmac/ccs/Debug/sha1_hmac.bin new file mode 100644 index 0000000..448a26b Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hmac/ccs/Debug/sha1_hmac.bin differ diff --git a/boards/dk-tm4c129x/sha1_hmac/ccs/Debug/sha1_hmac.out b/boards/dk-tm4c129x/sha1_hmac/ccs/Debug/sha1_hmac.out new file mode 100644 index 0000000..33d3065 Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hmac/ccs/Debug/sha1_hmac.out differ diff --git a/boards/dk-tm4c129x/sha1_hmac/ccs/macros.ini_initial b/boards/dk-tm4c129x/sha1_hmac/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/sha1_hmac/ccs/target_config.ccxml b/boards/dk-tm4c129x/sha1_hmac/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/sha1_hmac/ewarm/Exe/sha1_hmac.bin b/boards/dk-tm4c129x/sha1_hmac/ewarm/Exe/sha1_hmac.bin new file mode 100644 index 0000000..a35158d Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hmac/ewarm/Exe/sha1_hmac.bin differ diff --git a/boards/dk-tm4c129x/sha1_hmac/ewarm/Exe/sha1_hmac.out b/boards/dk-tm4c129x/sha1_hmac/ewarm/Exe/sha1_hmac.out new file mode 100644 index 0000000..5afb179 Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hmac/ewarm/Exe/sha1_hmac.out differ diff --git a/boards/dk-tm4c129x/sha1_hmac/gcc/sha1_hmac.axf b/boards/dk-tm4c129x/sha1_hmac/gcc/sha1_hmac.axf new file mode 100644 index 0000000..6eb1969 Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hmac/gcc/sha1_hmac.axf differ diff --git a/boards/dk-tm4c129x/sha1_hmac/gcc/sha1_hmac.bin b/boards/dk-tm4c129x/sha1_hmac/gcc/sha1_hmac.bin new file mode 100644 index 0000000..1e4322a Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hmac/gcc/sha1_hmac.bin differ diff --git a/boards/dk-tm4c129x/sha1_hmac/readme.txt b/boards/dk-tm4c129x/sha1_hmac/readme.txt new file mode 100644 index 0000000..6223135 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/readme.txt @@ -0,0 +1,23 @@ +SHA1 HMAC Demo + +Simple example showing SHA1 HMAC generation using a block of random data. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/sha1_hmac/rvmdk/sha1_hmac.axf b/boards/dk-tm4c129x/sha1_hmac/rvmdk/sha1_hmac.axf new file mode 100644 index 0000000..2f15935 Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hmac/rvmdk/sha1_hmac.axf differ diff --git a/boards/dk-tm4c129x/sha1_hmac/rvmdk/sha1_hmac.bin b/boards/dk-tm4c129x/sha1_hmac/rvmdk/sha1_hmac.bin new file mode 100644 index 0000000..7c26843 Binary files /dev/null and b/boards/dk-tm4c129x/sha1_hmac/rvmdk/sha1_hmac.bin differ diff --git a/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.c b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.c new file mode 100644 index 0000000..81f97a1 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.c @@ -0,0 +1,733 @@ +//***************************************************************************** +// +// sha1_hmac.c - Simple SHA1 HMAC demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_shamd5.h" +#include "driverlib/debug.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/shamd5.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      SHA1 HMAC Demo (sha1_hmac)

      +//! +//! Simple example showing SHA1 HMAC generation using a block of random data. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Source data for producing HMACs. This array contains 1024 bytes of +// randomly generated data. +// +//***************************************************************************** +uint32_t g_pui32RandomData[] = +{ + 0x7c68c9ec, 0x72af34b3, 0xca0edf2e, 0x60f4860d, 0x50cfa1dc, 0x9a2b538c, + 0x98450274, 0x60f5c272, 0x7317d78e, 0x2361ca0e, 0xfa4a52b1, 0x658f729b, + 0x5267f9d9, 0x1bccd3ca, 0x2f0bb993, 0x1be38a3d, 0x00bd2d2a, 0x97405e63, + 0xe3efd585, 0xb02d1588, 0xe55d71c8, 0x43a27ecf, 0x5fd275db, 0x73ad8f06, + 0x88f55495, 0x68922493, 0x03ea6039, 0xe40a678a, 0x052847ce, 0xf7a28b46, + 0x3b60c73e, 0x3f08dbd4, 0x2a66b3a6, 0xcf398b15, 0xacbfc6d8, 0x6c15a285, + 0x997d0e01, 0xbfd12e26, 0xa26bc485, 0xb8946d2f, 0x0f84742b, 0x5be82a2f, + 0x8d2e2cc7, 0xc7a1dea6, 0xcfaa6cb6, 0xe706434c, 0x079810d0, 0x5eca9400, + 0x7b92dd1c, 0x1ec552e8, 0xa74ae9c3, 0x2e859af5, 0x8d9d1a35, 0x07ff6040, + 0xc0b19670, 0x2e348aa8, 0xed89efea, 0x3262e8f0, 0x45093372, 0x8f8bae5c, + 0x505d64bb, 0x9a172079, 0x327b5f67, 0xa3a12ba8, 0x7f573054, 0xd3d5f778, + 0xbc1bd124, 0x0d0ad1c6, 0x24ac345b, 0x4f50084a, 0x302a5985, 0xfa3e8b86, + 0x2022c497, 0xd297e4b4, 0xd1c53c01, 0x6e541890, 0x93ec53c6, 0x24c5ce2b, + 0xdd38e334, 0x078a0334, 0x2a470b22, 0xadad86b4, 0x7b2041db, 0xc74ce30b, + 0x8e6dc4ca, 0x273b85c8, 0x339d2334, 0x86d1dacc, 0xd588e165, 0xcee15221, + 0x8e11a0a1, 0x9315a6c2, 0x53e9fa9a, 0xf4bb6d7a, 0x421cb9ec, 0x1f370567, + 0xfd8c880f, 0xd20797cd, 0x90aee852, 0x2a2f966a, 0x126ffcdd, 0x44a2f09a, + 0xbac72ac4, 0x77d588c5, 0x77b53c09, 0x275b8828, 0x778a2be5, 0x40167d1e, + 0x550c0c94, 0x14e070e7, 0x597ff5a3, 0xbef40dc2, 0x8306d119, 0x6a8d29a6, + 0xb5d8e740, 0x52a37fe2, 0xdf34ad27, 0x1bb885fd, 0x6dd352f8, 0x8b0d62b5, + 0x5c82d35f, 0x0eb84312, 0xd2c7823a, 0x494f7a00, 0x30680642, 0x01fa9460, + 0xdc63956f, 0x70fa0b53, 0xd0865e78, 0x3a52e983, 0x318a881c, 0x4d113947, + 0xc0f302df, 0x6b2027fb, 0x1078566d, 0xd71d39a6, 0xcdd00388, 0x119e3c4e, + 0x4ddbf1c6, 0xb371eb0f, 0xdcbd768f, 0x2fc5b5e8, 0xc67a2efe, 0x29d18630, + 0xb389d68f, 0x26a71f13, 0x43583b57, 0x56f5eae8, 0x2edc7cd5, 0xcc93d41e, + 0xab691f87, 0x51ab1d8e, 0x37c2966e, 0x19ccd9ec, 0xb782124a, 0xdefc2804, + 0xea3bde3c, 0x46d81e08, 0xf828d58e, 0x757a39d3, 0xc92f1b5f, 0x56a2b368, + 0x1bbbb9b9, 0x46086ac7, 0x8a343144, 0x1675157a, 0x28ac0cf1, 0xb8695178, + 0x25fc4cec, 0x3f23a44e, 0x0a697977, 0x525794ad, 0xf920e15c, 0x49a0a7a7, + 0x1f54cafb, 0x7357b64c, 0x6d3a19c6, 0x5efb526d, 0x3d37f6e2, 0xd4f5835b, + 0x6ff454ee, 0x4f2a311c, 0x83cc4a40, 0x003036e9, 0xd481bf33, 0x38868b3c, + 0x63ee4445, 0x58426a29, 0xa022ae59, 0x07deb8ce, 0xfe3e673d, 0x176aa368, + 0xf2b18641, 0xbadeccd8, 0xea7a72b4, 0x72ccf0a0, 0xcdee3b08, 0x1689c54f, + 0xd577085a, 0xd9d79bd1, 0x089fa69a, 0x03fdaf65, 0x855e5697, 0x5788c00c, + 0x1139e03e, 0x48f4305f, 0x2d8ad2fd, 0x71ab04b5, 0xf5c7871c, 0x76801f21, + 0x329a590e, 0xe8e982a2, 0xdb67783e, 0x26ebf88b, 0x13ac5de7, 0x69b07707, + 0x2bc54e92, 0xc2556f94, 0x6d21bc3b, 0x3a230d0c, 0x4e02eeec, 0x53605beb, + 0x3a31e796, 0x6e186887, 0x8f93356e, 0xfa2342e4, 0xfbf2f519, 0x7ae95455, + 0xad6e9d94, 0xd942c7ab, 0x624f7aed, 0xd4158624, 0x82a0c0a9, 0x6d79b262, + 0xa7b9c84d, 0x2015bfeb, 0x462c7267, 0x44a17743, 0x7d207f71, 0xc2ab7566, + 0xaa833e65, 0x0a6c385e, 0x3b2d85f1, 0x8a4821a8, 0x62bf5742, 0xf55cf0e1, + 0xfc07d0d9, 0x54910235, 0xe8ae66c9, 0x9beb7306, 0xe5671f9e, 0x3332ad03, + 0xdb2343b6, 0x124332ac, 0xf595c7fb, 0xda2c72b0 +}; + +//***************************************************************************** +// +// Sample key for generating an HMAC. This array contains 64 bytes (512 bits) +// of randomly generated data. +// +//***************************************************************************** +uint32_t g_pui32SHA1HMACKey[] = +{ + 0x8a5f1b22, 0xcb935d29, 0xcc1ac092, 0x5dad8c9e, 0x6a83b39f, 0x8607dc60, + 0xda0ba4d2, 0xf49b0fa2, 0xaf35d524, 0xffa8001d, 0xbcc931e8, 0x4a2c99ef, + 0x7fa297ab, 0xab943bae, 0x07c61cc4, 0x47c8627d +}; + +//***************************************************************************** +// +// Expected HMAC results. These results have been separately verified using +// a Perl script. +// +//***************************************************************************** +typedef struct SHA1TestVectorStruct +{ + uint32_t pui32HMACResult[5]; + uint32_t ui32DataLength; +} +tSHA1TestVector; + +tSHA1TestVector g_psSHA1TestVectors[] = +{ + { + { 0x06d4db72, 0xa1f8c22a, 0x869efcc5, 0xca8bc8fc, 0x30b77c92 }, + 1024 + }, + { + { 0x5c01f196, 0xbad6b65e, 0x73eed7a2, 0x61665901, 0x7320b932 }, + 1000 + }, + { + { 0xee4dfa06, 0x78f74a98, 0x109a6d09, 0xa9470d90, 0xeb550d5f }, + 0 + } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +//! The SHA/MD5 interrupt handler +// +//***************************************************************************** + +// +// Flags to check that interrupts were successfully generated. +// +volatile bool g_bContextReadyFlag; +volatile bool g_bParthashReadyFlag; +volatile bool g_bInputReadyFlag; +volatile bool g_bOutputReadyFlag; +volatile bool g_bContextInDMADoneFlag; +volatile bool g_bDataInDMADoneFlag; +volatile bool g_bContextOutDMADoneFlag; + +void +SHAMD5IntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the SHA/MD5 masked interrupt status. + // + ui32IntStatus = ROM_SHAMD5IntStatus(SHAMD5_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & SHAMD5_INT_CONTEXT_READY) + { + ROM_SHAMD5IntDisable(SHAMD5_BASE, SHAMD5_INT_CONTEXT_READY); + g_bContextReadyFlag = true; + UARTprintf("Context input registers are ready.\n"); + } + if(ui32IntStatus & SHAMD5_INT_PARTHASH_READY) + { + ROM_SHAMD5IntDisable(SHAMD5_BASE, SHAMD5_INT_PARTHASH_READY); + UARTprintf("Context output registers are ready after a\n"); + UARTprintf("context switch.\n"); + } + if(ui32IntStatus & SHAMD5_INT_INPUT_READY) + { + ROM_SHAMD5IntDisable(SHAMD5_BASE, SHAMD5_INT_INPUT_READY); + g_bInputReadyFlag = true; + UARTprintf("Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & SHAMD5_INT_OUTPUT_READY) + { + ROM_SHAMD5IntDisable(SHAMD5_BASE, SHAMD5_INT_OUTPUT_READY); + g_bOutputReadyFlag = true; + UARTprintf("Context output registers are ready.\n"); + } + if(ui32IntStatus & SHAMD5_INT_DMA_CONTEXT_IN) + { + ROM_SHAMD5IntClear(SHAMD5_BASE, SHAMD5_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneFlag = true; + UARTprintf("DMA completed a context write to the internal\n"); + UARTprintf("registers.\n"); + } + if(ui32IntStatus & SHAMD5_INT_DMA_DATA_IN) + { + ROM_SHAMD5IntClear(SHAMD5_BASE, SHAMD5_INT_DMA_DATA_IN); + g_bDataInDMADoneFlag = true; + UARTprintf("DMA has written the last word of input data to\n"); + UARTprintf("the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & SHAMD5_INT_DMA_CONTEXT_OUT) + { + ROM_SHAMD5IntClear(SHAMD5_BASE, SHAMD5_INT_DMA_CONTEXT_OUT); + g_bContextOutDMADoneFlag = true; + UARTprintf("DMA completed the output context movement from\n"); + UARTprintf("the internal registers.\n"); + } +} + +//***************************************************************************** +// +// Generate a HMAC for the given data. +// +//***************************************************************************** +void +SHA1HMACGenerate(uint32_t *pui32Data, uint32_t ui32DataLength, + uint32_t *pui32HMACKey, uint32_t *pui32HMACResult, + bool bUseDMA, bool bPreProcessedKey) +{ + // + // Perform a soft reset of the SHA module. + // + ROM_SHAMD5Reset(SHAMD5_BASE); + + // + // Clear the flags + // + g_bContextReadyFlag = false; + g_bInputReadyFlag = false; + g_bDataInDMADoneFlag = false; + g_bContextOutDMADoneFlag = false; + + // + // Enable interrupts. + // + ROM_SHAMD5IntEnable(SHAMD5_BASE, (SHAMD5_INT_CONTEXT_READY | + SHAMD5_INT_PARTHASH_READY | + SHAMD5_INT_INPUT_READY | + SHAMD5_INT_OUTPUT_READY)); + + // + // Wait for the context ready flag. + // + while(!g_bContextReadyFlag) + { + } + + // + // Configure the SHA/MD5 module. + // + ROM_SHAMD5ConfigSet(SHAMD5_BASE, SHAMD5_ALGO_HMAC_SHA1); + + // + // Write the key. + // + if(bPreProcessedKey) + { + ROM_SHAMD5HMACPPKeySet(SHAMD5_BASE, pui32HMACKey); + } + else + { + ROM_SHAMD5HMACKeySet(SHAMD5_BASE, pui32HMACKey); + } + + // + // Use DMA to write the data into the SHA/MD5 module. + // + if(bUseDMA) + { + // + // Enable DMA done interrupts. + // + ROM_SHAMD5IntEnable(SHAMD5_BASE, (SHAMD5_INT_DMA_CONTEXT_IN | + SHAMD5_INT_DMA_DATA_IN | + SHAMD5_INT_DMA_CONTEXT_OUT)); + + if(ui32DataLength != 0) + { + // + // Setup the DMA module to copy data in. + // + ROM_uDMAChannelAssign(UDMA_CH5_SHAMD50DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH5_SHAMD50DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH5_SHAMD50DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_16 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH5_SHAMD50DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Data, + (void *)(SHAMD5_BASE + + SHAMD5_O_DATA_0_IN), + ui32DataLength / 4); + ROM_uDMAChannelEnable(UDMA_CH5_SHAMD50DIN); + UARTprintf("Data in DMA request enabled.\n"); + } + + // + // Setup the DMA module to copy the HMAC out. + // + ROM_uDMAChannelAssign(UDMA_CH6_SHAMD50COUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH6_SHAMD50COUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH6_SHAMD50COUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_32 | UDMA_ARB_8 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH6_SHAMD50COUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(SHAMD5_BASE + SHAMD5_O_IDIGEST_A), + (void *)pui32HMACResult, 5); + ROM_uDMAChannelEnable(UDMA_CH6_SHAMD50COUT); + UARTprintf("Context out DMA request enabled.\n"); + + // + // Enable DMA in the SHA/MD5 module. + // + ROM_SHAMD5DMAEnable(SHAMD5_BASE); + + // + // Write the length. + // + ROM_SHAMD5HashLengthSet(SHAMD5_BASE, ui32DataLength); + + if(ui32DataLength != 0) + { + // + // Wait for the DMA done interrupt. + // + while(!g_bDataInDMADoneFlag) + { + } + } + + // + // Wait for the next DMA done interrupt. + // + while(!g_bContextOutDMADoneFlag) + { + } + + // + // Disable DMA requests. + // + ROM_SHAMD5DMADisable(SHAMD5_BASE); + } + + // + // Perform hash computation by copying the data with the CPU. + // + else + { + // + // Perform the hashing operation + // + ROM_SHAMD5HMACProcess(SHAMD5_BASE, pui32Data, ui32DataLength, + pui32HMACResult); + } +} + +//***************************************************************************** +// +// Initializes the CCM and SHA/MD5 modules. +// +//***************************************************************************** +bool +SHAMD5Init(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf(" No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example generates HMACs from a random block of data and empty block. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32HMACPPKey[16], pui32HMACResult[5], ui32Errors, ui32Vector; + uint32_t ui32Idx, ui32SysClock; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "sha1-hmac"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + + // + // Enable SHA interrupts. + // + ROM_IntEnable(INT_SHA0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting SHA1 HMAC encryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and SHAMD5 modules. + // + if(!SHAMD5Init()) + { + UARTprintf("Initialization of the SHA module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Run tests without uDMA. + // + for(ui32Vector = 0; ui32Vector < 3; ui32Vector++) + { + UARTprintf("Running test #%d without uDMA\n", ui32Vector); + + // + // Generate the HMAC. + // + SHA1HMACGenerate(g_pui32RandomData, + g_psSHA1TestVectors[ui32Vector].ui32DataLength, + g_pui32SHA1HMACKey, pui32HMACResult, false, false); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 5; ui32Idx++) + { + if(pui32HMACResult[ui32Idx] != + g_psSHA1TestVectors[ui32Vector].pui32HMACResult[ui32Idx]) + { + UARTprintf("HMAC result mismatch - Exp: 0x%x, Act: 0x%x\n", + g_psSHA1TestVectors[ui32Vector]. + pui32HMACResult[ui32Idx], pui32HMACResult[0]); + ui32Errors |= ((ui32Idx << 16) | 0x2); + } + } + } + + // + // Run tests with uDMA. + // + for(ui32Vector = 0; ui32Vector < 3; ui32Vector++) + { + UARTprintf("Running test #%d with uDMA\n", ui32Vector); + + // + // Generate the HMAC. + // + SHA1HMACGenerate(g_pui32RandomData, + g_psSHA1TestVectors[ui32Vector].ui32DataLength, + g_pui32SHA1HMACKey, pui32HMACResult, true, false); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 5; ui32Idx++) + { + if(pui32HMACResult[ui32Idx] != + g_psSHA1TestVectors[ui32Vector].pui32HMACResult[ui32Idx]) + { + UARTprintf("HMAC result mismatch - Exp: 0x%x, Act: 0x%x\n", + g_psSHA1TestVectors[ui32Vector]. + pui32HMACResult[ui32Idx], pui32HMACResult[0]); + ui32Errors |= ((ui32Idx << 16) | 0x3); + } + } + } + + // + // Preprocess the HMAC key. + // + UARTprintf("Preprocessing HMAC key with SHA1...\n"); + ROM_SHAMD5Reset(SHAMD5_BASE); + ROM_SHAMD5ConfigSet(SHAMD5_BASE, SHAMD5_ALGO_HMAC_SHA1); + ROM_SHAMD5HMACPPKeyGenerate(SHAMD5_BASE, g_pui32SHA1HMACKey, + pui32HMACPPKey); + + // + // Run tests with a preprocessed key and without uDMA. + // + for(ui32Vector = 0; ui32Vector < 3; ui32Vector++) + { + UARTprintf("Running test #%d without uDMA\n", ui32Vector); + + // + // Generate the HMAC. + // + SHA1HMACGenerate(g_pui32RandomData, + g_psSHA1TestVectors[ui32Vector].ui32DataLength, + pui32HMACPPKey, pui32HMACResult, false, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 5; ui32Idx++) + { + if(pui32HMACResult[ui32Idx] != + g_psSHA1TestVectors[ui32Vector].pui32HMACResult[ui32Idx]) + { + UARTprintf("HMAC result mismatch - Exp: 0x%x, Act: 0x%x\n", + g_psSHA1TestVectors[ui32Vector]. + pui32HMACResult[ui32Idx], pui32HMACResult[0]); + ui32Errors |= ((ui32Idx << 16) | 0x2); + } + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ewd b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ewp b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ewp new file mode 100644 index 0000000..9d3822c --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\sha1_hmac.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.icf b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.icf new file mode 100644 index 0000000..4915b70 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// sha1_hmac.icf - Linker configuration file for sha1_hmac. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ld b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ld new file mode 100644 index 0000000..faeddb8 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * sha1_hmac.ld - Linker configuration file for sha1_hmac. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.sct b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.sct new file mode 100644 index 0000000..734e64d --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; sha1_hmac.sct - Linker configuration file for sha1_hmac. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.uvopt b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.uvopt new file mode 100644 index 0000000..8ea2cd7 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + sha1_hmac + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\sha1_hmac.c + sha1_hmac.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.uvproj b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.uvproj new file mode 100644 index 0000000..ecef863 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + sha1_hmac + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + sha1_hmac + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\sha1_hmac.bin .\rvmdk\sha1_hmac.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + sha1_hmac.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + sha1_hmac.c + 1 + .\sha1_hmac.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/sha1_hmac/sha1_hmac_ccs.cmd b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac_ccs.cmd new file mode 100644 index 0000000..d6bd3f0 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/sha1_hmac_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * sha1_hmac_ccs.cmd - CCS linker configuration file for sha1_hmac. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/sha1_hmac/startup_ccs.c b/boards/dk-tm4c129x/sha1_hmac/startup_ccs.c new file mode 100644 index 0000000..1652405 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SHAMD5IntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + SHAMD5IntHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/sha1_hmac/startup_ewarm.c b/boards/dk-tm4c129x/sha1_hmac/startup_ewarm.c new file mode 100644 index 0000000..db90816 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SHAMD5IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + SHAMD5IntHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/sha1_hmac/startup_gcc.c b/boards/dk-tm4c129x/sha1_hmac/startup_gcc.c new file mode 100644 index 0000000..08d01f3 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SHAMD5IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + SHAMD5IntHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/sha1_hmac/startup_rvmdk.S b/boards/dk-tm4c129x/sha1_hmac/startup_rvmdk.S new file mode 100644 index 0000000..5d04775 --- /dev/null +++ b/boards/dk-tm4c129x/sha1_hmac/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN SHAMD5IntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD SHAMD5IntHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/synth/Makefile b/boards/dk-tm4c129x/synth/Makefile new file mode 100644 index 0000000..69e0aeb --- /dev/null +++ b/boards/dk-tm4c129x/synth/Makefile @@ -0,0 +1,93 @@ +#****************************************************************************** +# +# Makefile - Rules for building the synth example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the synth example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/synth.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the synth example. +# +${COMPILER}/synth.axf: ${COMPILER}/frame.o +${COMPILER}/synth.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/synth.axf: ${COMPILER}/pinout.o +${COMPILER}/synth.axf: ${COMPILER}/sine.o +${COMPILER}/synth.axf: ${COMPILER}/sound.o +${COMPILER}/synth.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/synth.axf: ${COMPILER}/synth.o +${COMPILER}/synth.axf: ${COMPILER}/touch.o +${COMPILER}/synth.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/synth.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/synth.axf: synth.ld +SCATTERgcc_synth=synth.ld +ENTRY_synth=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/synth/ccs/.ccsimportspec b/boards/dk-tm4c129x/synth/ccs/.ccsimportspec new file mode 100644 index 0000000..637a7b0 --- /dev/null +++ b/boards/dk-tm4c129x/synth/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/synth/ccs/.ccsproject b/boards/dk-tm4c129x/synth/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/synth/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/synth/ccs/.cproject b/boards/dk-tm4c129x/synth/ccs/.cproject new file mode 100644 index 0000000..f4620a0 --- /dev/null +++ b/boards/dk-tm4c129x/synth/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/synth/ccs/.project b/boards/dk-tm4c129x/synth/ccs/.project new file mode 100644 index 0000000..9654eb4 --- /dev/null +++ b/boards/dk-tm4c129x/synth/ccs/.project @@ -0,0 +1,80 @@ + + + synth + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/synth/startup_ccs.c + + + synth.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/synth/synth.c + + + synth_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/synth/synth_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/sound.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/sound.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/sine.c + 1 + SW_ROOT/utils/sine.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/synth/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/synth/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/synth/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/synth/ccs/Debug/synth.bin b/boards/dk-tm4c129x/synth/ccs/Debug/synth.bin new file mode 100644 index 0000000..3f9a91c Binary files /dev/null and b/boards/dk-tm4c129x/synth/ccs/Debug/synth.bin differ diff --git a/boards/dk-tm4c129x/synth/ccs/Debug/synth.out b/boards/dk-tm4c129x/synth/ccs/Debug/synth.out new file mode 100644 index 0000000..004bd85 Binary files /dev/null and b/boards/dk-tm4c129x/synth/ccs/Debug/synth.out differ diff --git a/boards/dk-tm4c129x/synth/ccs/macros.ini_initial b/boards/dk-tm4c129x/synth/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/synth/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/synth/ccs/target_config.ccxml b/boards/dk-tm4c129x/synth/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/synth/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/synth/ewarm/Exe/synth.bin b/boards/dk-tm4c129x/synth/ewarm/Exe/synth.bin new file mode 100644 index 0000000..46491fc Binary files /dev/null and b/boards/dk-tm4c129x/synth/ewarm/Exe/synth.bin differ diff --git a/boards/dk-tm4c129x/synth/ewarm/Exe/synth.out b/boards/dk-tm4c129x/synth/ewarm/Exe/synth.out new file mode 100644 index 0000000..942c13c Binary files /dev/null and b/boards/dk-tm4c129x/synth/ewarm/Exe/synth.out differ diff --git a/boards/dk-tm4c129x/synth/gcc/synth.axf b/boards/dk-tm4c129x/synth/gcc/synth.axf new file mode 100644 index 0000000..99411cd Binary files /dev/null and b/boards/dk-tm4c129x/synth/gcc/synth.axf differ diff --git a/boards/dk-tm4c129x/synth/gcc/synth.bin b/boards/dk-tm4c129x/synth/gcc/synth.bin new file mode 100644 index 0000000..841b06b Binary files /dev/null and b/boards/dk-tm4c129x/synth/gcc/synth.bin differ diff --git a/boards/dk-tm4c129x/synth/readme.txt b/boards/dk-tm4c129x/synth/readme.txt new file mode 100644 index 0000000..a979dcd --- /dev/null +++ b/boards/dk-tm4c129x/synth/readme.txt @@ -0,0 +1,25 @@ +Synthesizer + +This application provides a single-octave synthesizer utilizing the touch +screen as a virtual piano keyboard. The notes played on the virtual piano +are played out via the on-board speaker. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/synth/rvmdk/synth.axf b/boards/dk-tm4c129x/synth/rvmdk/synth.axf new file mode 100644 index 0000000..4e87774 Binary files /dev/null and b/boards/dk-tm4c129x/synth/rvmdk/synth.axf differ diff --git a/boards/dk-tm4c129x/synth/rvmdk/synth.bin b/boards/dk-tm4c129x/synth/rvmdk/synth.bin new file mode 100644 index 0000000..fc3d204 Binary files /dev/null and b/boards/dk-tm4c129x/synth/rvmdk/synth.bin differ diff --git a/boards/dk-tm4c129x/synth/startup_ccs.c b/boards/dk-tm4c129x/synth/startup_ccs.c new file mode 100644 index 0000000..30b1a9a --- /dev/null +++ b/boards/dk-tm4c129x/synth/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SoundIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + SoundIntHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/synth/startup_ewarm.c b/boards/dk-tm4c129x/synth/startup_ewarm.c new file mode 100644 index 0000000..5694146 --- /dev/null +++ b/boards/dk-tm4c129x/synth/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SoundIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + SoundIntHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/synth/startup_gcc.c b/boards/dk-tm4c129x/synth/startup_gcc.c new file mode 100644 index 0000000..12e19b0 --- /dev/null +++ b/boards/dk-tm4c129x/synth/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SoundIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + SoundIntHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/synth/startup_rvmdk.S b/boards/dk-tm4c129x/synth/startup_rvmdk.S new file mode 100644 index 0000000..78d5a58 --- /dev/null +++ b/boards/dk-tm4c129x/synth/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SoundIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD SoundIntHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/synth/synth.c b/boards/dk-tm4c129x/synth/synth.c new file mode 100644 index 0000000..7a59e3b --- /dev/null +++ b/boards/dk-tm4c129x/synth/synth.c @@ -0,0 +1,1438 @@ +//***************************************************************************** +// +// synth.c - A single-octave synthesizer to demonstrate the use of the sound +// driver. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "utils/sine.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/sound.h" +#include "drivers/touch.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Synthesizer (synth)

      +//! +//! This application provides a single-octave synthesizer utilizing the touch +//! screen as a virtual piano keyboard. The notes played on the virtual piano +//! are played out via the on-board speaker. +// +//***************************************************************************** + +//***************************************************************************** +// +// The colors used to draw the white keys. +// +//***************************************************************************** +#define ClrWhiteKey 0xcfcfcf +#define ClrWhiteBright 0xffffff +#define ClrWhiteDim 0x9f9f9f + +//***************************************************************************** +// +// The colors used to draw the black keys. +// +//***************************************************************************** +#define ClrBlackKey 0x000000 +#define ClrBlackBright 0x606060 +#define ClrBlackDim 0x303030 + +//***************************************************************************** +// +// The color used to draw a pressed key. +// +//***************************************************************************** +#define ClrPressed 0x3f3fbf + +//***************************************************************************** +// +// The width and height of the white keys. The width should be an even number. +// +//***************************************************************************** +#define WHITE_WIDTH 36 +#define WHITE_HEIGHT 190 + +//***************************************************************************** +// +// The width and height of the black keys. The width should be a multiple of +// four. +// +//***************************************************************************** +#define BLACK_WIDTH 26 +#define BLACK_HEIGHT 110 + +//***************************************************************************** +// +// The screen offset of the upper left hand corner of the keyboard. +// +//***************************************************************************** +#define X_OFFSET 16 +#define Y_OFFSET 32 + +//***************************************************************************** +// +// A structure that describes a key on the keyboard. +// +//***************************************************************************** +typedef struct +{ + // + // The outline of the key. + // + tRectangle sOutline; + + // + // The first/top fill for the key. + // + tRectangle sFill1; + + // + // The second/bottom fill for the key (not used for black keys). + // + tRectangle sFill2; + + // + // The frequency of the note produced by this key. + // + uint32_t ui32Freq; +} +tKey; + +//***************************************************************************** +// +// The white keys on the keyboard. +// +//***************************************************************************** +static const tKey g_psWhiteKeys[] = +{ + // + // C4 + // + { + // + // Outline + // + { + X_OFFSET, + Y_OFFSET, + X_OFFSET + WHITE_WIDTH - 1, + Y_OFFSET + WHITE_HEIGHT - 1 + }, + + // + // Top fill + // + { + X_OFFSET + 2, + Y_OFFSET + 2, + X_OFFSET + WHITE_WIDTH - ((BLACK_WIDTH * 3) / 4) - 1, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Bottom fill + // + { + X_OFFSET + 2, + Y_OFFSET + BLACK_HEIGHT, + X_OFFSET + WHITE_WIDTH - 3, + Y_OFFSET + WHITE_HEIGHT - 3 + }, + + // + // Frequency + // + 261 + }, + + // + // D4 + // + { + // + // Outline + // + { + X_OFFSET + WHITE_WIDTH, + Y_OFFSET, + X_OFFSET + (WHITE_WIDTH * 2) - 1, + Y_OFFSET + WHITE_HEIGHT - 1 + }, + + // + // Top fill + // + { + X_OFFSET + WHITE_WIDTH + (BLACK_WIDTH / 4), + Y_OFFSET + 2, + X_OFFSET + (WHITE_WIDTH * 2) - (BLACK_WIDTH / 4) - 1, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Bottom fill + // + { + X_OFFSET + WHITE_WIDTH + 2, + Y_OFFSET + BLACK_HEIGHT, + X_OFFSET + (WHITE_WIDTH * 2) - 3, + Y_OFFSET + WHITE_HEIGHT - 3 + }, + + // + // Frequency + // + 294 + }, + + // + // E4 + // + { + // + // Outline + // + { + X_OFFSET + (WHITE_WIDTH * 2), + Y_OFFSET, + X_OFFSET + (WHITE_WIDTH * 3) - 1, + Y_OFFSET + WHITE_HEIGHT - 1 + }, + + // + // Top fill + // + { + X_OFFSET + (WHITE_WIDTH * 2) + ((BLACK_WIDTH * 3) / 4), + Y_OFFSET + 2, + X_OFFSET + (WHITE_WIDTH * 3) - 3, + Y_OFFSET + BLACK_HEIGHT - 1, + }, + + // + // Bottom fill + // + { + X_OFFSET + (WHITE_WIDTH * 2) + 2, + Y_OFFSET + BLACK_HEIGHT, + X_OFFSET + (WHITE_WIDTH * 3) - 3, + Y_OFFSET + WHITE_HEIGHT - 3 + }, + + // + // Frequency + // + 330 + }, + + // + // F4 + // + { + // + // Outline + // + { + X_OFFSET + (WHITE_WIDTH * 3), + Y_OFFSET, + X_OFFSET + (WHITE_WIDTH * 4) - 1, + Y_OFFSET + WHITE_HEIGHT - 1 + }, + + // + // Top fill + // + { + X_OFFSET + (WHITE_WIDTH * 3) + 2, + Y_OFFSET + 2, + X_OFFSET + (WHITE_WIDTH * 4) - ((BLACK_WIDTH * 3) / 4) - 1, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Bottom fill + // + { + X_OFFSET + (WHITE_WIDTH * 3) + 2, + Y_OFFSET + BLACK_HEIGHT, + X_OFFSET + (WHITE_WIDTH * 4) - 3, + Y_OFFSET + WHITE_HEIGHT - 3 + }, + + // + // Frequency + // + 349 + }, + + // + // G4 + // + { + // + // Outline + // + { + X_OFFSET + (WHITE_WIDTH * 4), + Y_OFFSET, + X_OFFSET + (WHITE_WIDTH * 5) - 1, + Y_OFFSET + WHITE_HEIGHT - 1 + }, + + // + // Top fill + // + { + X_OFFSET + (WHITE_WIDTH * 4) + (BLACK_WIDTH / 4), + Y_OFFSET + 2, + X_OFFSET + (WHITE_WIDTH * 5) - (BLACK_WIDTH / 2) - 1, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Bottom fill + // + { + X_OFFSET + (WHITE_WIDTH * 4) + 2, + Y_OFFSET + BLACK_HEIGHT, + X_OFFSET + (WHITE_WIDTH * 5) - 3, + Y_OFFSET + WHITE_HEIGHT - 3 + }, + + // + // Frequency + // + 392 + }, + + // + // A4 + // + { + // + // Outline + // + { + X_OFFSET + (WHITE_WIDTH * 5), + Y_OFFSET, + X_OFFSET + (WHITE_WIDTH * 6) - 1, + Y_OFFSET + WHITE_HEIGHT - 1 + }, + + // + // Top fill + // + { + X_OFFSET + (WHITE_WIDTH * 5) + (BLACK_WIDTH / 2), + Y_OFFSET + 2, + X_OFFSET + (WHITE_WIDTH * 6) - (BLACK_WIDTH / 4) - 1, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Bottom fill + // + { + X_OFFSET + (WHITE_WIDTH * 5) + 2, + Y_OFFSET + BLACK_HEIGHT, + X_OFFSET + (WHITE_WIDTH * 6) - 3, + Y_OFFSET + WHITE_HEIGHT - 3 + }, + + // + // Frequency + // + 440 + }, + + // + // B4 + // + { + // + // Outline + // + { + X_OFFSET + (WHITE_WIDTH * 6), + Y_OFFSET, + X_OFFSET + (WHITE_WIDTH * 7) - 1, + Y_OFFSET + WHITE_HEIGHT - 1 + }, + + // + // Top fill + // + { + X_OFFSET + (WHITE_WIDTH * 6) + ((BLACK_WIDTH * 3) / 4), + Y_OFFSET + 2, + X_OFFSET + (WHITE_WIDTH * 7) - 3, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Bottom fill + // + { + X_OFFSET + (WHITE_WIDTH * 6) + 2, + Y_OFFSET + BLACK_HEIGHT, + X_OFFSET + (WHITE_WIDTH * 7) - 3, + Y_OFFSET + WHITE_HEIGHT - 3 + }, + + // + // Frequency + // + 494 + }, + + // + // C5 + // + { + // + // Outline + // + { + X_OFFSET + (WHITE_WIDTH * 7), + Y_OFFSET, + X_OFFSET + (WHITE_WIDTH * 8) - 1, + Y_OFFSET + WHITE_HEIGHT - 1 + }, + + // + // Top fill + // + { + X_OFFSET + (WHITE_WIDTH * 7) + 2, + Y_OFFSET + 2, + X_OFFSET + (WHITE_WIDTH * 8) - 3, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Bottom fill + // + { + X_OFFSET + (WHITE_WIDTH * 7) + 2, + Y_OFFSET + BLACK_HEIGHT, + X_OFFSET + (WHITE_WIDTH * 8) - 3, + Y_OFFSET + WHITE_HEIGHT - 3 + }, + + // + // Frequency + // + 523 + } +}; + +//***************************************************************************** +// +// The number of white keys. +// +//***************************************************************************** +#define NUM_WHITE_KEYS (sizeof(g_psWhiteKeys) / \ + sizeof(g_psWhiteKeys[0])) + +//***************************************************************************** +// +// The black keys on the keyboard. +// +//***************************************************************************** +static const tKey g_psBlackKeys[] = +{ + // + // C#4 + // + { + // + // Outline + // + { + X_OFFSET + WHITE_WIDTH - ((BLACK_WIDTH * 3) / 4), + Y_OFFSET, + X_OFFSET + WHITE_WIDTH + (BLACK_WIDTH / 4) - 1, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Fill + // + { + X_OFFSET + WHITE_WIDTH - ((BLACK_WIDTH * 3) / 4) + 2, + Y_OFFSET + 2, + X_OFFSET + WHITE_WIDTH + (BLACK_WIDTH / 4) - 3, + Y_OFFSET + BLACK_HEIGHT - 3 + }, + + // + // Unused + // + { + 0 + }, + + // + // Frequency + // + 277 + }, + + // + // D#4 + // + { + // + // Outline + // + { + X_OFFSET + (WHITE_WIDTH * 2) - (BLACK_WIDTH / 4), + Y_OFFSET, + X_OFFSET + (WHITE_WIDTH * 2) + ((BLACK_WIDTH * 3) / 4) - 1, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Fill + // + { + X_OFFSET + (WHITE_WIDTH * 2) - (BLACK_WIDTH / 4) + 2, + Y_OFFSET + 2, + X_OFFSET + (WHITE_WIDTH * 2) + ((BLACK_WIDTH * 3) / 4) - 3, + Y_OFFSET + BLACK_HEIGHT - 3 + }, + + // + // Unused + // + { + 0 + }, + + // + // Frequency + // + 311 + }, + + // + // F#4 + // + { + // + // Outline + // + { + X_OFFSET + (WHITE_WIDTH * 4) - ((BLACK_WIDTH * 3) / 4), + Y_OFFSET, + X_OFFSET + (WHITE_WIDTH * 4) + (BLACK_WIDTH / 4) - 1, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Fill + // + { + X_OFFSET + (WHITE_WIDTH * 4) - ((BLACK_WIDTH * 3) / 4) + 2, + Y_OFFSET + 2, + X_OFFSET + (WHITE_WIDTH * 4) + (BLACK_WIDTH / 4) - 3, + Y_OFFSET + BLACK_HEIGHT - 3 + }, + + // + // Unused + // + { + 0 + }, + + // + // Frequency + // + 370 + }, + + // + // G#4 + // + { + // + // Outline + // + { + X_OFFSET + (WHITE_WIDTH * 5) - (BLACK_WIDTH / 2), + Y_OFFSET, + X_OFFSET + (WHITE_WIDTH * 5) + (BLACK_WIDTH / 2) - 1, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Fill + // + { + X_OFFSET + (WHITE_WIDTH * 5) - (BLACK_WIDTH / 2) + 2, + Y_OFFSET + 2, + X_OFFSET + (WHITE_WIDTH * 5) + (BLACK_WIDTH / 2) - 3, + Y_OFFSET + BLACK_HEIGHT - 3 + }, + + // + // Unused + // + { + 0 + }, + + // + // Frequency + // + 415 + }, + + // + // A#4 + // + { + // + // Outline + // + { + X_OFFSET + (WHITE_WIDTH * 6) - (BLACK_WIDTH / 4), + Y_OFFSET, + X_OFFSET + (WHITE_WIDTH * 6) + ((BLACK_WIDTH * 3) / 4) - 1, + Y_OFFSET + BLACK_HEIGHT - 1 + }, + + // + // Fill + // + { + X_OFFSET + (WHITE_WIDTH * 6) - (BLACK_WIDTH / 4) + 2, + Y_OFFSET + 2, + X_OFFSET + (WHITE_WIDTH * 6) + ((BLACK_WIDTH * 3) / 4) - 3, + Y_OFFSET + BLACK_HEIGHT - 3 + }, + + // + // Unused + // + { + 0 + }, + + // + // Frequency + // + 466 + } +}; + +//***************************************************************************** +// +// The number of black keys. +// +//***************************************************************************** +#define NUM_BLACK_KEYS (sizeof(g_psBlackKeys) / \ + sizeof(g_psBlackKeys[0])) + +//***************************************************************************** +// +// The buffer used to store the synthesized waveform that is to be played. The +// buffer size must be a power of 2 less than or equal to 2048. +// +//***************************************************************************** +#define AUDIO_SIZE 2048 +static int16_t g_pi16AudioBuffer[AUDIO_SIZE]; + +//***************************************************************************** +// +// A set of flags that indicate the current state of the application. +// +//***************************************************************************** +static uint32_t g_ui32Flags; +#define FLAG_PING 0 // The "ping" half of the sound + // buffer needs to be filled +#define FLAG_PONG 1 // The "pong" half of the sound + // buffer needs to be filled + +//***************************************************************************** +// +// The key that is currently pressed. +// +//***************************************************************************** +uint32_t g_ui32Key = NUM_WHITE_KEYS + NUM_BLACK_KEYS; + +//***************************************************************************** +// +// The position within the waveform of the currently playing key. +// +//***************************************************************************** +uint32_t g_ui32AudioPos; + +//***************************************************************************** +// +// The step rate of the waveform for the currently playing key. +// +//***************************************************************************** +uint32_t g_ui32AudioStep; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Fills in one of the white keys with the given color. +// +//***************************************************************************** +static inline void +FillWhiteKey(tContext *pContext, uint32_t ui32Key, uint32_t ui32Color) +{ + // + // Select the specified color. + // + GrContextForegroundSet(pContext, ui32Color); + + // + // Fill in the upper and lower portions of the white key. + // + GrRectFill(pContext, &(g_psWhiteKeys[ui32Key].sFill1)); + GrRectFill(pContext, &(g_psWhiteKeys[ui32Key].sFill2)); +} + +//***************************************************************************** +// +// Draws the white keys on the display. +// +//***************************************************************************** +static inline void +DrawWhiteKeys(tContext *pContext) +{ + uint32_t ui32Key; + + // + // Loop through the white keys. + // + for(ui32Key = 0; ui32Key < NUM_WHITE_KEYS; ui32Key++) + { + // + // Select the color for the top and left edges of the white key. + // + GrContextForegroundSet(pContext, ClrWhiteBright); + + // + // Draw the top and left edges of the white key. + // + GrLineDraw(pContext, + g_psWhiteKeys[ui32Key].sOutline.i16XMin, + g_psWhiteKeys[ui32Key].sOutline.i16YMin, + g_psWhiteKeys[ui32Key].sOutline.i16XMax, + g_psWhiteKeys[ui32Key].sOutline.i16YMin); + GrLineDraw(pContext, + g_psWhiteKeys[ui32Key].sOutline.i16XMin + 1, + g_psWhiteKeys[ui32Key].sOutline.i16YMin + 1, + g_psWhiteKeys[ui32Key].sOutline.i16XMax - 1, + g_psWhiteKeys[ui32Key].sOutline.i16YMin + 1); + GrLineDraw(pContext, + g_psWhiteKeys[ui32Key].sOutline.i16XMin, + g_psWhiteKeys[ui32Key].sOutline.i16YMin + 1, + g_psWhiteKeys[ui32Key].sOutline.i16XMin, + g_psWhiteKeys[ui32Key].sOutline.i16YMax); + GrLineDraw(pContext, + g_psWhiteKeys[ui32Key].sOutline.i16XMin + 1, + g_psWhiteKeys[ui32Key].sOutline.i16YMin + 2, + g_psWhiteKeys[ui32Key].sOutline.i16XMin + 1, + g_psWhiteKeys[ui32Key].sOutline.i16YMax - 1); + + // + // Select the color for the bottom and right edges of the white key. + // + GrContextForegroundSet(pContext, ClrWhiteDim); + + // + // Draw the bottom and right edges of the white key. + // + GrLineDraw(pContext, + g_psWhiteKeys[ui32Key].sOutline.i16XMax, + g_psWhiteKeys[ui32Key].sOutline.i16YMin + 1, + g_psWhiteKeys[ui32Key].sOutline.i16XMax, + g_psWhiteKeys[ui32Key].sOutline.i16YMax); + GrLineDraw(pContext, + g_psWhiteKeys[ui32Key].sOutline.i16XMax - 1, + g_psWhiteKeys[ui32Key].sOutline.i16YMin + 2, + g_psWhiteKeys[ui32Key].sOutline.i16XMax - 1, + g_psWhiteKeys[ui32Key].sOutline.i16YMax - 1); + GrLineDraw(pContext, + g_psWhiteKeys[ui32Key].sOutline.i16XMin + 1, + g_psWhiteKeys[ui32Key].sOutline.i16YMax, + g_psWhiteKeys[ui32Key].sOutline.i16XMax - 1, + g_psWhiteKeys[ui32Key].sOutline.i16YMax); + GrLineDraw(pContext, + g_psWhiteKeys[ui32Key].sOutline.i16XMin + 2, + g_psWhiteKeys[ui32Key].sOutline.i16YMax - 1, + g_psWhiteKeys[ui32Key].sOutline.i16XMax - 2, + g_psWhiteKeys[ui32Key].sOutline.i16YMax - 1); + + // + // Fill in the white key with the default color. + // + FillWhiteKey(pContext, ui32Key, ClrWhiteKey); + } +} + +//***************************************************************************** +// +// Fills in one of the black keys with the given color. +// +//***************************************************************************** +static inline void +FillBlackKey(tContext *pContext, uint32_t ui32Key, uint32_t ui32Color) +{ + // + // Select the specified color. + // + GrContextForegroundSet(pContext, ui32Color); + + // + // FIll in the black key. + // + GrRectFill(pContext, &(g_psBlackKeys[ui32Key].sFill1)); +} + +//***************************************************************************** +// +// Draws the black keys on the display. +// +//***************************************************************************** +static inline void +DrawBlackKeys(tContext *pContext) +{ + uint32_t ui32Key; + + // + // Loop through the black keys. + // + for(ui32Key = 0; ui32Key < NUM_BLACK_KEYS; ui32Key++) + { + // + // Select the color for the top and left edges of the black key. + // + GrContextForegroundSet(pContext, ClrBlackBright); + + // + // Draw the top and left edges of the black key. + // + GrLineDraw(pContext, + g_psBlackKeys[ui32Key].sOutline.i16XMin, + g_psBlackKeys[ui32Key].sOutline.i16YMin, + g_psBlackKeys[ui32Key].sOutline.i16XMax, + g_psBlackKeys[ui32Key].sOutline.i16YMin); + GrLineDraw(pContext, + g_psBlackKeys[ui32Key].sOutline.i16XMin + 1, + g_psBlackKeys[ui32Key].sOutline.i16YMin + 1, + g_psBlackKeys[ui32Key].sOutline.i16XMax - 1, + g_psBlackKeys[ui32Key].sOutline.i16YMin + 1); + GrLineDraw(pContext, + g_psBlackKeys[ui32Key].sOutline.i16XMin, + g_psBlackKeys[ui32Key].sOutline.i16YMin + 1, + g_psBlackKeys[ui32Key].sOutline.i16XMin, + g_psBlackKeys[ui32Key].sOutline.i16YMax); + GrLineDraw(pContext, + g_psBlackKeys[ui32Key].sOutline.i16XMin + 1, + g_psBlackKeys[ui32Key].sOutline.i16YMin + 2, + g_psBlackKeys[ui32Key].sOutline.i16XMin + 1, + g_psBlackKeys[ui32Key].sOutline.i16YMax - 1); + + // + // Select the color for the bottom and right edges of the black key. + // + GrContextForegroundSet(pContext, ClrBlackDim); + + // + // Draw the bottom and right edges of the black key. + // + GrLineDraw(pContext, + g_psBlackKeys[ui32Key].sOutline.i16XMax, + g_psBlackKeys[ui32Key].sOutline.i16YMin + 1, + g_psBlackKeys[ui32Key].sOutline.i16XMax, + g_psBlackKeys[ui32Key].sOutline.i16YMax); + GrLineDraw(pContext, + g_psBlackKeys[ui32Key].sOutline.i16XMax - 1, + g_psBlackKeys[ui32Key].sOutline.i16YMin + 2, + g_psBlackKeys[ui32Key].sOutline.i16XMax - 1, + g_psBlackKeys[ui32Key].sOutline.i16YMax - 1); + GrLineDraw(pContext, + g_psBlackKeys[ui32Key].sOutline.i16XMin + 1, + g_psBlackKeys[ui32Key].sOutline.i16YMax, + g_psBlackKeys[ui32Key].sOutline.i16XMax - 1, + g_psBlackKeys[ui32Key].sOutline.i16YMax); + GrLineDraw(pContext, + g_psBlackKeys[ui32Key].sOutline.i16XMin + 2, + g_psBlackKeys[ui32Key].sOutline.i16YMax - 1, + g_psBlackKeys[ui32Key].sOutline.i16XMax - 2, + g_psBlackKeys[ui32Key].sOutline.i16YMax - 1); + + // + // Fill in the black key with the default color. + // + FillBlackKey(pContext, ui32Key, ClrBlackKey); + } +} + +//***************************************************************************** +// +// The callback function that is called by the sound driver to indicate that +// half of the sound buffer has been played. +// +//***************************************************************************** +void +SoundCallback(uint32_t ui32Half) +{ + // + // See which half of the sound buffer has been played. + // + if(ui32Half == 0) + { + // + // The first half of the sound buffer needs to be filled. + // + HWREGBITW(&g_ui32Flags, FLAG_PING) = 1; + } + else + { + // + // The second half of the sound buffer needs to be filled. + // + HWREGBITW(&g_ui32Flags, FLAG_PONG) = 1; + } +} + +//***************************************************************************** +// +// The callback function that is called by the touch screen driver to indicate +// activity on the touch screen. +// +//***************************************************************************** +int32_t +TouchCallback(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + uint32_t ui32Key; + + // + // See if this touch event occurred on one of the black keys. + // + for(ui32Key = 0; ui32Key < NUM_BLACK_KEYS; ui32Key++) + { + if((i32X >= g_psBlackKeys[ui32Key].sOutline.i16XMin) && + (i32X <= g_psBlackKeys[ui32Key].sOutline.i16XMax) && + (i32Y >= g_psBlackKeys[ui32Key].sOutline.i16YMin) && + (i32Y <= g_psBlackKeys[ui32Key].sOutline.i16YMax)) + { + break; + } + } + + // + // See if a match was found. + // + if(ui32Key != NUM_BLACK_KEYS) + { + // + // The touch event occurred on one of the black keys. Increment the + // index by the number of white keys since they are listed first. + // + ui32Key += NUM_WHITE_KEYS; + } + else + { + // + // The touch event did not occur on one of the black keys. Check the + // white keys. + // + for(ui32Key = 0; ui32Key < NUM_WHITE_KEYS; ui32Key++) + { + if((i32X >= g_psWhiteKeys[ui32Key].sOutline.i16XMin) && + (i32X <= g_psWhiteKeys[ui32Key].sOutline.i16XMax) && + (i32Y >= g_psWhiteKeys[ui32Key].sOutline.i16YMin) && + (i32Y <= g_psWhiteKeys[ui32Key].sOutline.i16YMax)) + { + break; + } + } + + // + // If the touch event did not occur on one of the white keys, set the + // key number to a non-existant key. + // + if(ui32Key == NUM_WHITE_KEYS) + { + ui32Key += NUM_BLACK_KEYS; + } + } + + // + // Determine the message that is being sent. + // + switch(ui32Message) + { + // + // The user has just touched the screen. + // + case WIDGET_MSG_PTR_DOWN: + { + // + // Save this key as the currently pressed key. + // + g_ui32Key = ui32Key; + + // + // Done handling this message. + // + break; + } + + // + // The user has moved the touch location on the screen. + // + case WIDGET_MSG_PTR_MOVE: + { + // + // Save this key as the currently pressed key. + // + g_ui32Key = ui32Key; + + // + // Done handling this message. + // + break; + } + + // + // The user is no longer touching the screen. + // + case WIDGET_MSG_PTR_UP: + { + // + // Indicate that no key is being pressed. + // + g_ui32Key = NUM_WHITE_KEYS + NUM_BLACK_KEYS; + + // + // Done handling this message. + // + break; + } + } + + // + // Success. + // + return(0); +} + +//***************************************************************************** +// +// Generates an additional section of the audio output based on the currently +// pressed key (if any). +// +//***************************************************************************** +uint32_t +GenerateAudio(int16_t *pi16Buffer, uint32_t ui32Count) +{ + int32_t i32Val, i32Vol, i32VolStep; + uint32_t ui32Key, ui32NewStep; + + // + // See if one of the push buttons is pressed. + // + ui32Key = (ROM_GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_3) | + ROM_GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_5)); + if(ui32Key == GPIO_PIN_5) + { + // + // The up botton is pressed and the down button is not pressed. + // Therefore, turn up the volume. + // + SoundVolumeUp(1); + } + if(ui32Key == GPIO_PIN_3) + { + // + // The up botton is not pressed and the down button is pressed. + // Therefore, turn down the volume. + // + SoundVolumeDown(1); + } + + // + // Get the currently pressed piano key. + // + ui32Key = g_ui32Key; + + // + // See if this key is one of the white keys. + // + if(ui32Key < NUM_WHITE_KEYS) + { + // + // Compute the step value required to generate this white key's + // frequency. + // + ui32NewStep = + ((g_psWhiteKeys[ui32Key].ui32Freq * 65536) / 64000) * 65536; + } + + // + // See if this key is one of the black keys. + // + else if(ui32Key < (NUM_WHITE_KEYS + NUM_BLACK_KEYS)) + { + // + // Compute the step value required to generate this black key's + // frequency. + // + ui32NewStep = + (((g_psBlackKeys[ui32Key - NUM_WHITE_KEYS].ui32Freq * 65536) / + 64000) * 65536); + } + + // + // No key is being pressed. + // + else + { + // + // Do not generate any waveform. + // + ui32NewStep = 0; + } + + // + // See if no key was previously pressed and no key is currently pressed. + // + if((g_ui32AudioStep == 0) && (ui32NewStep == 0)) + { + // + // Fill the buffer with silence. + // + while(ui32Count--) + { + *pi16Buffer++ = 0; + } + + // + // There is nothing further to do. + // + return(ui32Key); + } + + // + // See if the same key as last time is pressed. + // + if(g_ui32AudioStep == ui32NewStep) + { + // + // Set the volume of the waveform generator to full volume. + // + i32Vol = 1024; + i32VolStep = 0; + } + + // + // See if a key was previously pressed. + // + else if(g_ui32AudioStep == 0) + { + // + // There was not a previously pressed key, so ramp the volume of the + // first waveform generator to full volume. + // + i32Vol = 0; + i32VolStep = 1024 / ui32Count; + + // + // Start the new waveform at zero. + // + g_ui32AudioPos = 0; + } + + // + // Otherwise there is already a key playing. + // + else + { + // + // Ramp the volume of the waveform generator to zero. + // + i32Vol = 1024; + i32VolStep = -1024 / ui32Count; + } + + // + // Loop through the samples to be generated. + // + while(ui32Count--) + { + // + // Compute the value of the waveform. + // + i32Val = sine(g_ui32AudioPos + (sine(g_ui32AudioPos * 3) * 10922)); + + // + // Increment the position of the waveform. + // + g_ui32AudioPos += g_ui32AudioStep; + + // + // Scale the waveform value by the volume. + // + i32Val = (i32Val * i32Vol) / 1024; + + // + // Increment the waveform volume by the step. + // + i32Vol += i32VolStep; + if(i32Vol < 0) + { + i32Vol = 0; + } + if(i32Vol > 1024) + { + i32Vol = 1024; + } + + // + // Cilp the waveform to min/max if required. + // + i32Val /= 2; + if(i32Val > 32767) + { + i32Val = 32767; + } + if(i32Val < -32768) + { + i32Val = -32768; + } + + // + // Add the new waveform value to the sample buffer. + // + *pi16Buffer++ = (int16_t)i32Val; + } + + // + // Save the new step value. + // + g_ui32AudioStep = ui32NewStep; + + // + // Return the currently pressed key. + // + return(ui32Key); +} + +//***************************************************************************** +// +// This application performs simple audio synthesis and playback based on the +// keys pressed on the touch screen virtual piano keyboard. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock, ui32OldKey, ui32NewKey; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "synth"); + + // + // Draw the keys on the virtual piano keyboard. + // + DrawWhiteKeys(&sContext); + DrawBlackKeys(&sContext); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + TouchScreenCallbackSet(TouchCallback); + + // + // Initialize the sound driver. + // + SoundInit(ui32SysClock); + SoundVolumeSet(128); + SoundStart(g_pi16AudioBuffer, AUDIO_SIZE, 64000, SoundCallback); + + // + // Default the old and new key to not pressed so that the first key press + // will be properly drawn on the keyboard. + // + ui32OldKey = NUM_WHITE_KEYS + NUM_BLACK_KEYS; + ui32NewKey = NUM_WHITE_KEYS + NUM_BLACK_KEYS; + + // + // Loop forever. + // + while(1) + { + // + // See if the first half of the sound buffer needs to be filled. + // + if(HWREGBITW(&g_ui32Flags, FLAG_PING) == 1) + { + // + // Synthesize new audio into the first half of the sound buffer. + // + ui32NewKey = GenerateAudio(g_pi16AudioBuffer, AUDIO_SIZE / 2); + + // + // Clear the flag for the first half of the sound buffer. + // + HWREGBITW(&g_ui32Flags, FLAG_PING) = 0; + } + + // + // See if the second half of the sound buffer needs to be filled. + // + if(HWREGBITW(&g_ui32Flags, FLAG_PONG) == 1) + { + // + // Synthesize new audio into the second half of the sound buffer. + // + ui32NewKey = GenerateAudio(g_pi16AudioBuffer + (AUDIO_SIZE / 2), + AUDIO_SIZE / 2); + + // + // Clear the flag for the second half of the sound buffer. + // + HWREGBITW(&g_ui32Flags, FLAG_PONG) = 0; + } + + // + // See if a different key has been pressed. + // + if(ui32OldKey != ui32NewKey) + { + // + // See if the old key was a white key. + // + if(ui32OldKey < NUM_WHITE_KEYS) + { + // + // Redraw the face of the white key so that it no longer shows + // as being pressed. + // + FillWhiteKey(&sContext, ui32OldKey, ClrWhiteKey); + } + + // + // See if the old key was a black key. + // + else if(ui32OldKey < (NUM_WHITE_KEYS + NUM_BLACK_KEYS)) + { + // + // Redraw the face of the black key so that it no longer shows + // as being pressed. + // + FillBlackKey(&sContext, ui32OldKey - NUM_WHITE_KEYS, + ClrBlackKey); + } + + // + // See if the new key is a white key. + // + if(ui32NewKey < NUM_WHITE_KEYS) + { + // + // Redraw the face of the white key so that it is shown as + // being pressed. + // + FillWhiteKey(&sContext, ui32NewKey, ClrPressed); + } + + // + // See if the new key is a black key. + // + else if(ui32NewKey < (NUM_WHITE_KEYS + NUM_BLACK_KEYS)) + { + // + // Redraw the face of the black key so that it is shown as + // being pressed. + // + FillBlackKey(&sContext, ui32NewKey - NUM_WHITE_KEYS, + ClrPressed); + } + + // + // Save the new key as the old key. + // + ui32OldKey = ui32NewKey; + } + } +} diff --git a/boards/dk-tm4c129x/synth/synth.ewd b/boards/dk-tm4c129x/synth/synth.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/synth/synth.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/synth/synth.ewp b/boards/dk-tm4c129x/synth/synth.ewp new file mode 100644 index 0000000..750cd76 --- /dev/null +++ b/boards/dk-tm4c129x/synth/synth.ewp @@ -0,0 +1,807 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\..\..\..\..\utils\sine.c + + + $PROJ_DIR$\..\drivers\sound.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\synth.c + + + $PROJ_DIR$\..\drivers\touch.c + + + diff --git a/boards/dk-tm4c129x/synth/synth.icf b/boards/dk-tm4c129x/synth/synth.icf new file mode 100644 index 0000000..7e217ce --- /dev/null +++ b/boards/dk-tm4c129x/synth/synth.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// synth.icf - Linker configuration file for synth. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/synth/synth.ld b/boards/dk-tm4c129x/synth/synth.ld new file mode 100644 index 0000000..d207c8b --- /dev/null +++ b/boards/dk-tm4c129x/synth/synth.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * synth.ld - Linker configuration file for synth. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/synth/synth.sct b/boards/dk-tm4c129x/synth/synth.sct new file mode 100644 index 0000000..e1bef02 --- /dev/null +++ b/boards/dk-tm4c129x/synth/synth.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; synth.sct - Linker configuration file for synth. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/synth/synth.uvopt b/boards/dk-tm4c129x/synth/synth.uvopt new file mode 100644 index 0000000..d39244c --- /dev/null +++ b/boards/dk-tm4c129x/synth/synth.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + synth + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\sine.c + sine.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\sound.c + sound.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\synth.c + synth.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/synth/synth.uvproj b/boards/dk-tm4c129x/synth/synth.uvproj new file mode 100644 index 0000000..497bf42 --- /dev/null +++ b/boards/dk-tm4c129x/synth/synth.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + synth + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + synth + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\synth.bin .\rvmdk\synth.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + synth.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + sine.c + 1 + ..\..\..\..\utils\sine.c + + + sound.c + 1 + ..\drivers\sound.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + synth.c + 1 + .\synth.c + + + touch.c + 1 + ..\drivers\touch.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/synth/synth_ccs.cmd b/boards/dk-tm4c129x/synth/synth_ccs.cmd new file mode 100644 index 0000000..910e257 --- /dev/null +++ b/boards/dk-tm4c129x/synth/synth_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * synth_ccs.cmd - CCS linker configuration file for synth. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/tamper/Makefile b/boards/dk-tm4c129x/tamper/Makefile new file mode 100644 index 0000000..7737e38 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the tamper example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the tamper example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/tamper.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the tamper example. +# +${COMPILER}/tamper.axf: ${COMPILER}/frame.o +${COMPILER}/tamper.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/tamper.axf: ${COMPILER}/pinout.o +${COMPILER}/tamper.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/tamper.axf: ${COMPILER}/tamper.o +${COMPILER}/tamper.axf: ${COMPILER}/touch.o +${COMPILER}/tamper.axf: ${COMPILER}/ustdlib.o +${COMPILER}/tamper.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/tamper.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/tamper.axf: tamper.ld +SCATTERgcc_tamper=tamper.ld +ENTRY_tamper=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/tamper/ccs/.ccsimportspec b/boards/dk-tm4c129x/tamper/ccs/.ccsimportspec new file mode 100644 index 0000000..0c9fc62 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/tamper/ccs/.ccsproject b/boards/dk-tm4c129x/tamper/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/tamper/ccs/.cproject b/boards/dk-tm4c129x/tamper/ccs/.cproject new file mode 100644 index 0000000..2296c56 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/tamper/ccs/.project b/boards/dk-tm4c129x/tamper/ccs/.project new file mode 100644 index 0000000..042e881 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/ccs/.project @@ -0,0 +1,75 @@ + + + tamper + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/tamper/startup_ccs.c + + + tamper.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/tamper/tamper.c + + + tamper_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/tamper/tamper_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/tamper/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/tamper/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/tamper/ccs/Debug/tamper.bin b/boards/dk-tm4c129x/tamper/ccs/Debug/tamper.bin new file mode 100644 index 0000000..507c4d4 Binary files /dev/null and b/boards/dk-tm4c129x/tamper/ccs/Debug/tamper.bin differ diff --git a/boards/dk-tm4c129x/tamper/ccs/Debug/tamper.out b/boards/dk-tm4c129x/tamper/ccs/Debug/tamper.out new file mode 100644 index 0000000..4b2b65a Binary files /dev/null and b/boards/dk-tm4c129x/tamper/ccs/Debug/tamper.out differ diff --git a/boards/dk-tm4c129x/tamper/ccs/macros.ini_initial b/boards/dk-tm4c129x/tamper/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/tamper/ccs/target_config.ccxml b/boards/dk-tm4c129x/tamper/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/tamper/ewarm/Exe/tamper.bin b/boards/dk-tm4c129x/tamper/ewarm/Exe/tamper.bin new file mode 100644 index 0000000..8288671 Binary files /dev/null and b/boards/dk-tm4c129x/tamper/ewarm/Exe/tamper.bin differ diff --git a/boards/dk-tm4c129x/tamper/ewarm/Exe/tamper.out b/boards/dk-tm4c129x/tamper/ewarm/Exe/tamper.out new file mode 100644 index 0000000..6d1bd11 Binary files /dev/null and b/boards/dk-tm4c129x/tamper/ewarm/Exe/tamper.out differ diff --git a/boards/dk-tm4c129x/tamper/gcc/tamper.axf b/boards/dk-tm4c129x/tamper/gcc/tamper.axf new file mode 100644 index 0000000..0788552 Binary files /dev/null and b/boards/dk-tm4c129x/tamper/gcc/tamper.axf differ diff --git a/boards/dk-tm4c129x/tamper/gcc/tamper.bin b/boards/dk-tm4c129x/tamper/gcc/tamper.bin new file mode 100644 index 0000000..763b384 Binary files /dev/null and b/boards/dk-tm4c129x/tamper/gcc/tamper.bin differ diff --git a/boards/dk-tm4c129x/tamper/readme.txt b/boards/dk-tm4c129x/tamper/readme.txt new file mode 100644 index 0000000..65726d6 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/readme.txt @@ -0,0 +1,46 @@ +Tamper + +An example to demonstrate the use of tamper function in Hibernate module. +The user can ground any of these four GPIO pins(PM4, PM5, PM6, PM7 on +J28 and J30 headers on the development kit) to manually +triggle tamper events(s). The red indicators on the top of display should +reflect on which pin has triggered a tamper event. +The event along with the time stamp will be printed on the display. +The user can put the system in hibernation by pressing the HIB button. +The system should wake when the user either press RESET button, +or ground any of the four pins to trigger tamper event(s). When the +system boots up, the display should show whether the system woke +from hibernation or booted up from POR in which case a description of +howto instruction is printed on the display. +The RTC clock is displayed on the bottom of the display, the clock starts +from August 1st, 2013 at midnight when the app starts. The date and time +can be changed by pressing the CLOCK button. The clock is update every +second using hibernate calendar match interrupt. When the system +is in hibernation, the clock update on the display is paused, it resumes +once the system wakes up from hibernation. + +WARNING: XOSC failure is implemented in this example code, care must be +taken to ensure that the XOSCn pin(Y3) is properly grounded in order to +safely generate the external oscillator failure without damaging the +external oscillator. XOSCFAIL can be triggered as a tamper event, +as well as wakeup event from hibernation. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/tamper/rvmdk/tamper.axf b/boards/dk-tm4c129x/tamper/rvmdk/tamper.axf new file mode 100644 index 0000000..8a5e9cd Binary files /dev/null and b/boards/dk-tm4c129x/tamper/rvmdk/tamper.axf differ diff --git a/boards/dk-tm4c129x/tamper/rvmdk/tamper.bin b/boards/dk-tm4c129x/tamper/rvmdk/tamper.bin new file mode 100644 index 0000000..6a78615 Binary files /dev/null and b/boards/dk-tm4c129x/tamper/rvmdk/tamper.bin differ diff --git a/boards/dk-tm4c129x/tamper/startup_ccs.c b/boards/dk-tm4c129x/tamper/startup_ccs.c new file mode 100644 index 0000000..eb654d8 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/startup_ccs.c @@ -0,0 +1,258 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void HibernateIntHandler(void); +extern void NMITamperEventHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NMITamperEventHandler, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + HibernateIntHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/tamper/startup_ewarm.c b/boards/dk-tm4c129x/tamper/startup_ewarm.c new file mode 100644 index 0000000..c82084a --- /dev/null +++ b/boards/dk-tm4c129x/tamper/startup_ewarm.c @@ -0,0 +1,289 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void HibernateIntHandler(void); +extern void NMITamperEventHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NMITamperEventHandler, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + HibernateIntHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/tamper/startup_gcc.c b/boards/dk-tm4c129x/tamper/startup_gcc.c new file mode 100644 index 0000000..0922ade --- /dev/null +++ b/boards/dk-tm4c129x/tamper/startup_gcc.c @@ -0,0 +1,305 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void HibernateIntHandler(void); +extern void NMITamperEventHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NMITamperEventHandler, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + HibernateIntHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/tamper/startup_rvmdk.S b/boards/dk-tm4c129x/tamper/startup_rvmdk.S new file mode 100644 index 0000000..0431488 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/startup_rvmdk.S @@ -0,0 +1,323 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN HibernateIntHandler + EXTERN NMITamperEventHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMITamperEventHandler ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD HibernateIntHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/tamper/tamper.c b/boards/dk-tm4c129x/tamper/tamper.c new file mode 100644 index 0000000..05b36e3 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/tamper.c @@ -0,0 +1,2052 @@ +//***************************************************************************** +// +// tamper.c - tamper example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include +#include "inc/hw_gpio.h" +#include "inc/hw_memmap.h" +#include "inc/hw_ints.h" +#include "inc/hw_hibernate.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/hibernate.h" +#include "driverlib/interrupt.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/listbox.h" +#include "grlib/pushbutton.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" +#include "utils/ustdlib.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Tamper (tamper)

      +//! +//! An example to demonstrate the use of tamper function in Hibernate module. +//! The user can ground any of these four GPIO pins(PM4, PM5, PM6, PM7 on +//! J28 and J30 headers on the development kit) to manually +//! triggle tamper events(s). The red indicators on the top of display should +//! reflect on which pin has triggered a tamper event. +//! The event along with the time stamp will be printed on the display. +//! The user can put the system in hibernation by pressing the HIB button. +//! The system should wake when the user either press RESET button, +//! or ground any of the four pins to trigger tamper event(s). When the +//! system boots up, the display should show whether the system woke +//! from hibernation or booted up from POR in which case a description of +//! howto instruction is printed on the display. +//! The RTC clock is displayed on the bottom of the display, the clock starts +//! from August 1st, 2013 at midnight when the app starts. The date and time +//! can be changed by pressing the CLOCK button. The clock is update every +//! second using hibernate calendar match interrupt. When the system +//! is in hibernation, the clock update on the display is paused, it resumes +//! once the system wakes up from hibernation. +//! +//! WARNING: XOSC failure is implemented in this example code, care must be +//! taken to ensure that the XOSCn pin(Y3) is properly grounded in order to +//! safely generate the external oscillator failure without damaging the +//! external oscillator. XOSCFAIL can be triggered as a tamper event, +//! as well as wakeup event from hibernation. +// +//***************************************************************************** + +//***************************************************************************** +// +// Global variables used for Tamper events. +// +//***************************************************************************** +static volatile uint32_t g_ui32NMIEvent = 0; +static volatile uint32_t g_ui32TamperEventFlag = 0; +static volatile uint32_t g_ui32TamperRTCLog = 0; +static volatile uint32_t g_ui32TamperXOSCFailEvent = 0; +static uint32_t g_ui32RTCLog[4]; +static uint32_t g_ui32EventLog[4]; + +//***************************************************************************** +// +// Flag to indicate that main screen is active so that main screen buffers can +// be updated and widgets redrawn. +// +//***************************************************************************** +static bool g_bMainScreen; + +//***************************************************************************** +// +// Flag that informs that the user has requested hibernation. +// +//***************************************************************************** +static volatile bool g_bHibernate = false; + +//***************************************************************************** +// +// Flag that indicates clock update on the display. +// +//***************************************************************************** +static bool g_bUpdateRTC = 0; + +//***************************************************************************** +// +// Flag that informs that date and time have to be set. +// +//***************************************************************************** +volatile bool g_bSetDate; + +//***************************************************************************** +// +// Buffers to store widget display information. +// +//***************************************************************************** +char g_pcMonBuf[4], g_pcDayBuf[3], g_pcYearBuf[5]; +char g_pcHourBuf[3], g_pcMinBuf[3], g_pcAMPMBuf[3]; + +//***************************************************************************** +// +// Variables that keep track of the date and time across different screens. +// +//***************************************************************************** +uint32_t g_ui32MonthIdx, g_ui32DayIdx, g_ui32YearIdx; +uint32_t g_ui32HourIdx, g_ui32MinIdx; + + +//***************************************************************************** +// +// Lookup table to convert numerical value of a month into text. +// +//***************************************************************************** +static char *g_ppcMonth[12] = +{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" +}; + +//***************************************************************************** +// +// This is the image of a red LED that is turned off. +// +//***************************************************************************** +const uint8_t g_pui8LightOff[] = +{ + IMAGE_FMT_4BPP_COMP, + 20, 0, + 20, 0, + + 15, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, + 0x00, 0x00, 0x19, + 0x00, 0x00, 0x2a, + 0x00, 0x00, 0x30, + 0x00, 0x00, 0x34, + 0x00, 0x00, 0x37, + 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x3d, + 0x00, 0x00, 0x3f, + 0x00, 0x00, 0x40, + 0x00, 0x00, 0x42, + 0x00, 0x00, 0x45, + 0x00, 0x00, 0x4a, + 0x00, 0x00, 0x50, + 0x00, 0x00, 0x56, + + 0x84, 0x01, 0x13, 0xaf, 0xe8, 0x31, 0x03, 0x1b, 0xff, 0x08, 0xff, 0xee, + 0xed, 0x71, 0x01, 0x02, 0xff, 0xff, 0x00, 0xfe, 0xed, 0xdd, 0xcc, 0x20, + 0x00, 0x00, 0x2f, 0x00, 0xff, 0xfe, 0xee, 0xdd, 0xcc, 0xcb, 0xa2, 0x00, + 0x40, 0x01, 0x21, 0xdd, 0xdc, 0xcc, 0xbb, 0xa8, 0x10, 0x00, 0x09, 0xff, + 0xfe, 0xdd, 0xdc, 0xcb, 0xbb, 0xba, 0x00, 0x98, 0x30, 0x1e, 0xfe, 0xed, + 0xdc, 0xcb, 0xaa, 0x00, 0xaa, 0xaa, 0x98, 0x61, 0x3e, 0xfe, 0xdd, 0xcc, + 0x00, 0xba, 0x99, 0x9a, 0xaa, 0x98, 0x62, 0x7d, 0xee, 0x00, 0xdc, 0xcb, + 0xa9, 0x99, 0x99, 0x99, 0x88, 0x73, 0x08, 0xcd, 0xed, 0xdc, 0xba, 0xb9, + 0x99, 0x88, 0x64, 0x20, 0xcc, 0xdd, 0x6b, 0x99, 0x87, 0x63, 0x6c, 0xcc, + 0x40, 0xba, 0x1a, 0x98, 0x76, 0x42, 0x2b, 0xba, 0xaa, 0x88, 0x1b, 0x65, + 0x42, 0x1a, 0x2a, 0x99, 0x98, 0x87, 0x00, 0x64, 0x30, 0x04, 0x78, 0x88, + 0x88, 0x89, 0x99, 0x00, 0x88, 0x76, 0x54, 0x20, 0x01, 0x67, 0x77, 0x88, + 0x00, 0x88, 0x88, 0x87, 0x65, 0x43, 0x00, 0x00, 0x25, 0x00, 0x67, 0x77, + 0x77, 0x77, 0x65, 0x44, 0x31, 0x00, 0x00, 0x00, 0x01, 0x45, 0x66, 0x66, + 0x65, 0x54, 0x43, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, 0x44, 0x45, 0x44, + 0x20, 0x33, 0x20, 0xb9, 0x00, 0x00, 0x12, 0x23, 0x32, 0x80, 0x72, +}; + +//***************************************************************************** +// +// This is the image of a red LED that is turned on. +// +//***************************************************************************** +const uint8_t g_pui8LightOn[] = +{ + IMAGE_FMT_4BPP_COMP, + 20, 0, + 20, 0, + + 15, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x16, + 0x00, 0x00, 0x40, + 0x00, 0x00, 0x76, + 0x00, 0x00, 0x9b, + 0x00, 0x00, 0xac, + 0x00, 0x00, 0xb6, + 0x00, 0x00, 0xbc, + 0x00, 0x00, 0xbe, + 0x00, 0x00, 0xbf, + 0x00, 0x00, 0xc1, + 0x00, 0x00, 0xc5, + 0x00, 0x00, 0xcd, + 0x00, 0x00, 0xdb, + 0x00, 0x00, 0xef, + 0x00, 0x00, 0xfc, + + 0x84, 0x01, 0x13, 0xaf, 0xe7, 0x31, 0x03, 0x1b, 0xff, 0x09, 0xff, 0xee, + 0xee, 0x51, 0x01, 0x02, 0xff, 0xb1, 0x02, 0xdd, 0xcc, 0x20, 0x00, 0x00, + 0x2f, 0xbb, 0xcc, 0x10, 0x92, 0x00, 0x01, 0x72, 0xdc, 0xcc, 0xcb, 0x96, + 0x00, 0x10, 0x07, 0xff, 0xfe, 0xed, 0xdc, 0xcc, 0xbb, 0x08, 0xba, 0x96, + 0x30, 0x1e, 0x22, 0xba, 0xaa, 0xaa, 0x10, 0x86, 0x51, 0x3e, 0x69, 0xba, + 0x99, 0x99, 0x99, 0x01, 0x76, 0x52, 0x5d, 0xee, 0xdd, 0xcb, 0xa9, 0xb2, + 0x20, 0x53, 0xcd, 0x6c, 0x98, 0x76, 0x54, 0xcc, 0xdd, 0x40, 0xcc, 0x6a, + 0x97, 0x66, 0x43, 0x5c, 0xcc, 0xba, 0x40, 0x98, 0x19, 0x87, 0x65, 0x43, + 0x3c, 0xcb, 0xa9, 0x20, 0x98, 0x89, 0x1a, 0x42, 0x1a, 0x88, 0x98, 0x77, + 0x40, 0x88, 0x69, 0x44, 0x31, 0x04, 0x67, 0x77, 0x77, 0x00, 0x78, 0x88, + 0x76, 0x55, 0x44, 0x20, 0x01, 0x55, 0x00, 0x66, 0x66, 0x77, 0x77, 0x65, + 0x54, 0x43, 0x10, 0x00, 0x00, 0x24, 0x55, 0x55, 0x66, 0x65, 0x54, 0x44, + 0x00, 0x31, 0x00, 0x00, 0x02, 0x44, 0x45, 0x55, 0x54, 0x00, 0x44, 0x33, + 0x10, 0x00, 0x00, 0x00, 0x13, 0x44, 0x08, 0x44, 0x44, 0x33, 0x21, 0xb9, + 0x00, 0x00, 0x12, 0x10, 0x33, 0x32, 0x20, 0xba, +}; + +//***************************************************************************** +// +// The screen offset of the upper left hand corner where we start to draw. +// +//***************************************************************************** +#define X_OFFSET 8 +#define Y_OFFSET 24 + +//***************************************************************************** +// +// Defines for Hibernate memory value. It is used to determine if a wakeup is +// due to a tamper event. +// +//***************************************************************************** +#define HIBERNATE_TAMPER_DATA0 0xdeadbeef + +//***************************************************************************** +// +// Storage for the strings which appear in the status box in the middle of the +// display. +// +//**************************************************************************** +#define NUM_STATUS_STRINGS 10 +#define MAX_STATUS_STRING_LEN (64 + 1) +char g_pcStatus[NUM_STATUS_STRINGS][MAX_STATUS_STRING_LEN]; + +//***************************************************************************** +// +// Storage for the status listbox widget string table. +// +//***************************************************************************** +const char *g_ppcStatusStrings[NUM_STATUS_STRINGS] = +{ + g_pcStatus[0], g_pcStatus[1], g_pcStatus[2], g_pcStatus[3], + g_pcStatus[4], g_pcStatus[5], g_pcStatus[6], g_pcStatus[7], + g_pcStatus[8], g_pcStatus[9] +}; +uint32_t g_ui32StatusStringIndex = 0; + +//***************************************************************************** +// +// Forward reference to various widget structures in the main screen. +// +//***************************************************************************** +extern tCanvasWidget g_sMainScreen; +extern tCanvasWidget g_sIndicator0; +extern tCanvasWidget g_sIndicator1; +extern tCanvasWidget g_sIndicator2; +extern tCanvasWidget g_sIndicator3; +extern tCanvasWidget g_sIndicatorMarker; +extern tCanvasWidget g_sRTC; +extern tListBoxWidget g_sStatusList; +extern tPushButtonWidget g_sDateTimeSetBtn; +extern tPushButtonWidget g_sHIBBtn; + +//***************************************************************************** +// +// Forward reference to various widget structures in the clock setting screen. +// +//***************************************************************************** +extern tCanvasWidget g_sDateScreen; +extern tCanvasWidget g_sMonText; +extern tPushButtonWidget g_sMonUpBtn, g_sMonDwnBtn; +extern tCanvasWidget g_sDayText; +extern tPushButtonWidget g_sDayUpBtn, g_sDayDwnBtn; +extern tCanvasWidget g_sYearText; +extern tPushButtonWidget g_sYearUpBtn, g_sYearDwnBtn; +extern tPushButtonWidget g_sDateNextBtn; +extern tCanvasWidget g_sTimeScreen; +extern tCanvasWidget g_sHourText; +extern tPushButtonWidget g_sHourUpBtn, g_sHourDwnBtn; +extern tCanvasWidget g_sMinText; +extern tPushButtonWidget g_sMinUpBtn, g_sMinDwnBtn; +extern tCanvasWidget g_sAMPMText; +extern tPushButtonWidget g_sAMPMUpBtn, g_sAMPMDwnBtn; +extern tPushButtonWidget g_sTimeDoneBtn; + +//***************************************************************************** +// +// Forward reference of functions that are called on a button press. +// +//***************************************************************************** +void OnHIBBtnPress(tWidget *psWidget); +void OnDateTimeSetBtnPress(tWidget *psWidget); +void OnMonUpBtnPress(tWidget *psWidget); +void OnMonDwnBtnPress(tWidget *psWidget); +void OnDayUpBtnPress(tWidget *psWidget); +void OnDayDwnBtnPress(tWidget *psWidget); +void OnYearUpBtnPress(tWidget *psWidget); +void OnYearDwnBtnPress(tWidget *psWidget); +void OnDateNextBtnPress(tWidget *psWidget); +void OnHourUpBtnPress(tWidget *psWidget); +void OnHourDwnBtnPress(tWidget *psWidget); +void OnMinUpBtnPress(tWidget *psWidget); +void OnMinDwnBtnPress(tWidget *psWidget); +void OnAMPMBtnPress(tWidget *psWidget); +void OnTimeDoneBtnPress(tWidget *psWidget); + +//***************************************************************************** +// +// The canvas widget acting as the background to the display. +// +//***************************************************************************** +Canvas(g_sMainScreen, WIDGET_ROOT, 0, &g_sIndicator0, + &g_sKentec320x240x16_SSD2119, X_OFFSET, Y_OFFSET, (320 - X_OFFSET*2), + 240-X_OFFSET-Y_OFFSET, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); +//***************************************************************************** +// +// The four indicators on the top of the screen. +// +//***************************************************************************** +Canvas(g_sIndicator0, &g_sMainScreen, &g_sIndicator1, 0, + &g_sKentec320x240x16_SSD2119, 20, 30, 50, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0); +Canvas(g_sIndicator1, &g_sMainScreen, &g_sIndicator2, 0, + &g_sKentec320x240x16_SSD2119, 20 + 75*1, 30, 50, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0); +Canvas(g_sIndicator2, &g_sMainScreen, &g_sIndicator3, 0, + &g_sKentec320x240x16_SSD2119, 20 + 75*2, 30, 50, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0); +Canvas(g_sIndicator3, &g_sMainScreen, 0, &g_sIndicatorMarker, + &g_sKentec320x240x16_SSD2119, 20 + 75*3, 30, 50, 20, + CANVAS_STYLE_IMG, 0, 0, 0, 0, 0, g_pui8LightOff, 0); + +//***************************************************************************** +// +// The canvas widget used to show the text under indicators +// +//***************************************************************************** +Canvas(g_sIndicatorMarker, &g_sIndicator3, 0, &g_sStatusList, + &g_sKentec320x240x16_SSD2119, X_OFFSET, 60, 304, 16, + CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE, 0, 0, ClrWhite, + g_psFontCm16, "PM7 PM6 PM5 PM4", 0, 0); + +//***************************************************************************** +// +// The listbox used to display tamper events. +// +//***************************************************************************** +ListBox(g_sStatusList, &g_sIndicatorMarker, 0, &g_sDateTimeSetBtn, + &g_sKentec320x240x16_SSD2119, + X_OFFSET, 90, (320-(X_OFFSET*2)), 90, + (LISTBOX_STYLE_OUTLINE | LISTBOX_STYLE_LOCKED | + LISTBOX_STYLE_WRAP), ClrBlack, ClrBlack, ClrSilver, ClrSilver, ClrWhite, + g_psFontFixed6x8, g_ppcStatusStrings, NUM_STATUS_STRINGS, + NUM_STATUS_STRINGS, 0); +//***************************************************************************** +// +// The button used to enter hibernation. +// +//***************************************************************************** +RectangularButton(g_sHIBBtn, &g_sStatusList, 0, 0, + &g_sKentec320x240x16_SSD2119, 320-50-X_OFFSET, 190, 50, 40, + (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE | + PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrDarkRed, 0, + ClrWhite, g_psFontCm14, "HIB", 0, 0, 0, 0, OnHIBBtnPress); + +//***************************************************************************** +// +// The Canvas used to display the time. +// +//***************************************************************************** +Canvas(g_sRTC, &g_sStatusList, &g_sHIBBtn, 0, &g_sKentec320x240x16_SSD2119, + (X_OFFSET+50), 200, 204, 20, + CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE, 0, 0, ClrSilver, + g_psFontCm16, 0, 0, 0); + +//***************************************************************************** +// +// The button used to set the clock. +// +//***************************************************************************** +RectangularButton(g_sDateTimeSetBtn, &g_sStatusList, &g_sRTC, 0, + &g_sKentec320x240x16_SSD2119, X_OFFSET, 190, 50, 40, + (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE | + PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, ClrWhite, + g_psFontCm14, "CLOCK", 0, 0, 0, 0, + OnDateTimeSetBtnPress); + +//***************************************************************************** +// +// The graphics library structures for the Date screen. +// +//***************************************************************************** +RectangularButton(g_sDateNextBtn, &g_sDateScreen, 0, 0, + &g_sKentec320x240x16_SSD2119, 240, 190, 60, 30, + (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE | + PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, ClrWhite, + g_psFontCm16, "NEXT", 0, 0, 0, 0, OnDateNextBtnPress); +CircularButton(g_sYearDwnBtn, &g_sDateScreen, &g_sDateNextBtn, 0, + &g_sKentec320x240x16_SSD2119, 260, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100, + 10, OnYearDwnBtnPress); +CircularButton(g_sYearUpBtn, &g_sDateScreen, &g_sYearDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 260, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100, + 10, OnYearUpBtnPress); +Canvas(g_sYearText, &g_sDateScreen, &g_sYearUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 230, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcYearBuf, 0, 0); +CircularButton(g_sDayDwnBtn, &g_sDateScreen, &g_sYearText, 0, + &g_sKentec320x240x16_SSD2119, 160, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100, + 10, OnDayDwnBtnPress); +CircularButton(g_sDayUpBtn, &g_sDateScreen, &g_sDayDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 160, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100, + 10, OnDayUpBtnPress); +Canvas(g_sDayText, &g_sDateScreen, &g_sDayUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 130, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcDayBuf, 0, 0); +CircularButton(g_sMonDwnBtn, &g_sDateScreen, &g_sDayText, 0, + &g_sKentec320x240x16_SSD2119, 60, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100, + 20, OnMonDwnBtnPress); +CircularButton(g_sMonUpBtn, &g_sDateScreen, &g_sMonDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 60, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100, + 20, OnMonUpBtnPress); +Canvas(g_sMonText, &g_sDateScreen, &g_sMonUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 30, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcMonBuf, 0, 0); +Canvas(g_sDateScreen, WIDGET_ROOT, 0, &g_sMonText, + &g_sKentec320x240x16_SSD2119, X_OFFSET, Y_OFFSET, (320 - X_OFFSET*2), + (240-X_OFFSET-Y_OFFSET), + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The graphics library structures for the Time screen. +// +//***************************************************************************** +RectangularButton(g_sTimeDoneBtn, &g_sTimeScreen, 0, 0, + &g_sKentec320x240x16_SSD2119, 240, 190, 60, 30, + (PB_STYLE_TEXT | PB_STYLE_FILL | PB_STYLE_OUTLINE | + PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, ClrWhite, + g_psFontCm16, "DONE", 0, 0, 0, 0, OnTimeDoneBtnPress); +CircularButton(g_sAMPMDwnBtn, &g_sTimeScreen, &g_sTimeDoneBtn, 0, + &g_sKentec320x240x16_SSD2119, 260, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, + ClrWhite, g_psFontCm20, "+", 0, 0, 0, 0, OnAMPMBtnPress); +CircularButton(g_sAMPMUpBtn, &g_sTimeScreen, &g_sAMPMDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 260, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE), ClrDarkBlue, ClrBlue, 0, + ClrWhite, g_psFontCm20, "-", 0, 0, 0, 0, OnAMPMBtnPress); +Canvas(g_sAMPMText, &g_sTimeScreen, &g_sAMPMUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 230, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcAMPMBuf, 0, 0); +CircularButton(g_sMinDwnBtn, &g_sTimeScreen, &g_sAMPMText, 0, + &g_sKentec320x240x16_SSD2119, 160, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100, + 10, OnMinDwnBtnPress); +CircularButton(g_sMinUpBtn, &g_sTimeScreen, &g_sMinDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 160, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100, + 10, OnMinUpBtnPress); +Canvas(g_sMinText, &g_sTimeScreen, &g_sMinUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 130, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcMinBuf, 0, 0); +CircularButton(g_sHourDwnBtn, &g_sTimeScreen, &g_sMinText, 0, + &g_sKentec320x240x16_SSD2119, 60, 90, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "+", 0, 0, 100, + 20, OnHourDwnBtnPress); +CircularButton(g_sHourUpBtn, &g_sTimeScreen, &g_sHourDwnBtn, 0, + &g_sKentec320x240x16_SSD2119, 60, 153, 15, (PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_TEXT_OPAQUE | PB_STYLE_AUTO_REPEAT), + ClrDarkBlue, ClrBlue, 0, ClrWhite, g_psFontCm20, "-", 0, 0, 100, + 20, OnHourUpBtnPress); +Canvas(g_sHourText, &g_sTimeScreen, &g_sHourUpBtn, 0, + &g_sKentec320x240x16_SSD2119, 30, 110, 60, 25, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT), ClrBlack, ClrWhite, ClrWhite, + g_psFontCm16, g_pcHourBuf, 0, 0); +Canvas(g_sTimeScreen, WIDGET_ROOT, 0, &g_sHourText, + &g_sKentec320x240x16_SSD2119, 9, 25, (310 - 9), (230 - 25), + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Handle the "Date/Time" button press on Main Screen. +// +//***************************************************************************** +void +OnHIBBtnPress(tWidget *psWidget) +{ + // + // The button has been touched. So indicate that the + // user wants the device to enter hibernation. + // + g_bHibernate = true; +} + +//***************************************************************************** +// +// This function is used to add a new string to the status list box in the +// middle of the display. This shows tamper events and system status. +// +//***************************************************************************** +static int +PrintfStatus(char *pcFormat, ...) +{ + int32_t i32Ret; + va_list vaArgP; + + // + // Start the varargs processing. + // + va_start(vaArgP, pcFormat); + + // + // Call vsnprintf to perform the conversion. + // + i32Ret = uvsnprintf(g_pcStatus[g_ui32StatusStringIndex], + MAX_STATUS_STRING_LEN, pcFormat, vaArgP); + + // + // End the varargs processing. + // + va_end(vaArgP); + + // + // Add the new string to the status listbox. + // + ListBoxTextAdd(&g_sStatusList, g_pcStatus[g_ui32StatusStringIndex]); + + // + // Update our string index. + // + g_ui32StatusStringIndex++; + if(g_ui32StatusStringIndex == NUM_STATUS_STRINGS) + { + g_ui32StatusStringIndex = 0; + } + + // + // Repaint the status listbox. + // + WidgetPaint((tWidget *)&g_sStatusList); + + // + // Return the conversion count. + // + return(i32Ret); + +} + +//***************************************************************************** +// +// Handles an NMI interrupt generated by a Tamper event. +// +//***************************************************************************** +void +NMITamperEventHandler(void) +{ + uint32_t ui32NMIStatus, ui32TamperStatus; + uint32_t pui32Buf[3]; + uint8_t ui8Idx, ui8StartIdx; + bool bDetectedEventsDuringClear; + + // + // Get the cause of the NMI event. + // + ui32NMIStatus = SysCtlNMIStatus(); + + // + // Get the tamper event. + // + ui32TamperStatus = HibernateTamperStatusGet(); + + if(CLASS_IS_TM4C129 && REVISION_IS_A0) + { + // + // We should have got the cause of the NMI event in ui32NMIStatus. + // But in Snowflake RA0 the NMIC register is not set correctly when an + // event occurs. So as a work around check if the NMI event is caused by a + // tamper event and append this to the return value from SysCtlNMIStatus(). + // This way only this section can be removed once the bug is fixed in next + // silicon rev. + // + if(ui32TamperStatus & (HIBERNATE_TAMPER_STATUS_EVENT | + HIBERNATE_TAMPER_STATUS_EXT_OSC_FAILED)) + { + ui32NMIStatus |= SYSCTL_NMI_TAMPER; + } + } + + // + // Clear NMI events if SysCtlNMIStatus() returned a value. + // + if(ui32NMIStatus) + { + SysCtlNMIClear(ui32NMIStatus); + } + + // + // Check if NMI interrupt is due to a tamper event. + // + if((ui32NMIStatus & SYSCTL_NMI_TAMPER) == 0) + { + + // + // Not due to tamper event. + // Should not get here. + // + return; + } + + // + // Now handle NMI Interrupt due to a tamper event. + // + + // + // If the previous NMI event has not been processed by main + // thread, we need to OR the new event along with the old ones. + // Otherwise, clear the variables here. + // + if(g_ui32NMIEvent == 0) + { + // + // Reset variables that used for tamper event. + // + g_ui32TamperEventFlag = 0; + g_ui32TamperRTCLog = 0; + + // + // Clean the log data for debugging purpose. + // + memset(g_ui32RTCLog, 0, sizeof(g_ui32RTCLog)); + memset(g_ui32EventLog, 0, sizeof(g_ui32EventLog)); + } + + + // + // Log the tamper event data before clearing tamper events. + // + for(ui8Idx = 0; ui8Idx< 4; ui8Idx++) + { + if(HibernateTamperEventsGet(ui8Idx, + &g_ui32RTCLog[ui8Idx], + &g_ui32EventLog[ui8Idx])) + { + // + // If the timestamp entry has zero, ignore the tamper + // log entry, otherwise, save the event. + // + if(g_ui32RTCLog[ui8Idx]) + { + // + // Event in this log entry, store it. + // + g_ui32TamperEventFlag |= g_ui32EventLog[ui8Idx]; + g_ui32TamperRTCLog = g_ui32RTCLog[ui8Idx]; + } + else + { + // + // Not valid event in this log entry. Done checking the logs. + // + break; + } + } + else + { + // + // No event in this log entry. Done checking the logs. + // + break; + } + } + + // + // Process external oscillator failed event. + // + if(ui32TamperStatus & HIBERNATE_TAMPER_STATUS_EXT_OSC_FAILED) + { + g_ui32TamperXOSCFailEvent++; + + if(CLASS_IS_TM4C129 && REVISION_IS_A0) + { + // + // Snowflake A0 bug: XOSCFAIL doesn't get logged + // + g_ui32TamperEventFlag |= HIBERNATE_TAMPER_EVENT_EXT_OSC; + g_ui32TamperRTCLog = HWREG(HIB_TPLOG0); + } + } + + // + // Clear tamper event. + // + // + // The following block of code is to workaround hardware defect + // which results in missing new tamper events during tamper clear + // synchronization. + // + // There is a window after the application code writes the tamper + // clear where a new tamper event can be missed if the application + // requires more than one tamper event pins detection. + // + // The tamper Clear is synchronized to the hibernate 32kHz clock + // domain. The clear takes 3 rising edges of the 32KHz clock. + // During this window, new tamper events could be missed. + // A software workaround is to poll the tamper log during the + // tamper event clear synchronization. + // + + + // + // Record the index for the first empty log entry, this is the first + // entry log we will be polling from for any new events. + // + if(ui8Idx >= 4) + { + // + // All 4 log entries have data, new event will be ORed in the last + // entry. + // + ui8StartIdx = 3; + } + else + { + ui8StartIdx = ui8Idx; + } + + // + // Clear the flag for the case there are events triggered + // during clear execution. + // + bDetectedEventsDuringClear = false; + + // + // Unlock the Tamper Control register. This is required before + // calling HibernateTamperEventsClearNoLock(). + // + HibernateTamperUnLock(); + do + { + + // + // Clear the Tamper event. + // Note this API doesn't wait for synchronization, which + // allows us to check the tamper log during synchronization. + // + HibernateTamperEventsClearNoLock(); + + // + // Check new tamper event during tamper event clear + // synchronization, start polling until clear is done. + // This will take about 92us(three clock cycles) at most. + // + while(HibernateTamperStatusGet() & HIBERNATE_TAMPER_STATUS_EVENT) + { + + // + // Clear execution isn't done yet , poll for new events. + // If there were any new event, it will be logged starting + // the first empty log entry. + // + for(ui8Idx = ui8StartIdx; ui8Idx< 4; ui8Idx++) + { + if(HibernateTamperEventsGet(ui8Idx, + &g_ui32RTCLog[ui8Idx], + &g_ui32EventLog[ui8Idx])) + { + // + // If the timestamp log has zero, ignore the tamper + // log entry. + // + if(g_ui32RTCLog[ui8Idx]) + { + // + // detected new event, store it. + // + g_ui32TamperEventFlag |= g_ui32EventLog[ui8Idx]; + } + else + { + // + // Not valid event in this log, update the log + // entry index to be checked in next iteration. + // Break out of loop. + // + ui8StartIdx = ui8Idx; + break; + } + + // + // check for more event. + // + continue; + } + else + { + // + // No new event in this log, update the log + // entry index to be checked in next iteration. + // Break out of loop. + // + ui8StartIdx = ui8Idx; + break; + } + } + + // + // all last three logs have info. Check if all 4 logs + // have the same info. This is to detect the case that + // events happen during clear execution. + // + if(ui8Idx == 4) + { + // + // If events happens during clear + // execution, all four log registers will be + // logged with the same event, to detect this + // condition, we will compare with all four log data. + // + if(HibernateTamperEventsGet(0, &g_ui32RTCLog[0], &g_ui32EventLog[0])) + { + if((g_ui32RTCLog[0] == g_ui32RTCLog[1]) && + (g_ui32EventLog[0] == g_ui32EventLog[1]) && + (g_ui32RTCLog[0] == g_ui32RTCLog[2]) && + (g_ui32EventLog[0] == g_ui32EventLog[2]) && + (g_ui32RTCLog[0] == g_ui32RTCLog[3]) && + (g_ui32EventLog[0] == g_ui32EventLog[3])) + { + // + // Detected events during clear execution. + // Event logging takes priority, the clear + // will not be done in this case. We will need + // to go back to the beginning of the loop and + // clear the events. + // + if(bDetectedEventsDuringClear) + { + // + // This condition has already detected, + // we have cleared the event, + // clear the flag. + // + bDetectedEventsDuringClear = false; + } + else + { + // This is the first time it has been + // detected, set the flag. + // + bDetectedEventsDuringClear = true; + } + + // + // Break out of while loop so that we can + // clear the events, and start the + // workaround all over again. + // + break; + } + } + else + { + // + // Log 0 didn't detect any events. So this is not + // the case of missing events during clear + // execution. + // Update the log index at which we will poll next. + // It should be the last log entry that OR all the + // new events. + // + ui8StartIdx = 3; + } + } + } + } + while(bDetectedEventsDuringClear); + + // + // Lock the Tamper Control register. + // + HibernateTamperLock(); + + // + // Save the tamper event and RTC log info in the Hibernate Memory + // + HibernateDataGet(pui32Buf, 3); + pui32Buf[1] = g_ui32TamperEventFlag; + pui32Buf[2] = g_ui32TamperRTCLog; + HibernateDataSet(pui32Buf, 3); + + // + // Signal the main loop that an NMI event occurred. + // + g_ui32NMIEvent++; + +} + +//***************************************************************************** +// +// The interrupt handler for the Hibernate interrupt. It clears any pending +// interrupts and set the flag used by the application to update calendar time +// on the display. +// +//***************************************************************************** +void +HibernateIntHandler(void) +{ + uint32_t ui32Status; + + // + // Get the interrupt status, and clear any pending interrupts. + // + ui32Status = ROM_HibernateIntStatus(1); + ROM_HibernateIntClear(ui32Status); + + // + // Process the RTC match 0 interrupt + // + if(ui32Status & HIBERNATE_INT_RTC_MATCH_0) + { + g_bUpdateRTC = 1; + } +} + +//***************************************************************************** +// +// Returns whether the system has come out of Hibernation due to a tamper +// event or reset event. +// +//***************************************************************************** +void +HibernateTamperWakeUp(bool *pbWakeupFromTamper, bool *pbWakeupFromReset) +{ + uint32_t ui32TempBuf[3]; + + // + // Clear both flags. + // + *pbWakeupFromReset = false; + *pbWakeupFromTamper = false; + + // + // Read the status bits to see what caused the wake. Clear the wake + // source so that the device can be put into hibernation again. + // + ui32TempBuf[0] = HibernateIntStatus(0); + HibernateIntClear(ui32TempBuf[0]); + + // + // Check the wake was due to reset. + // + if(ui32TempBuf[0] & HIBERNATE_INT_RESET_WAKE) + { + *pbWakeupFromReset = true; + return; + } + + // + // The wake was not due to reset. + // Check if it is due to tamper event. + // + // Read the Hibernate module memory registers that show the state of the + // system. + // + HibernateDataGet(ui32TempBuf, 3); + + // + // Determine if system came out of hibernation due to a tamper event. + // + if(ui32TempBuf[0] == HIBERNATE_TAMPER_DATA0) + { + // + // It is due to a tamper event. + // Read the saved tamper event and RTC log info from the hibernate + // memory, so the main routine can print the info on the display. + // + g_ui32TamperEventFlag = ui32TempBuf[1]; + g_ui32TamperRTCLog = ui32TempBuf[2]; + g_ui32NMIEvent++; + *pbWakeupFromTamper = true; + return; + } + + return; +} + +//***************************************************************************** +// +// This function convert the hour in 24 hour format to 12 hour format +// +//***************************************************************************** +void +ConvertHourTo12Mode(uint8_t *pui8Hour, bool *pbPM) +{ + if(*pui8Hour == 0) + { + *pbPM = false; + *pui8Hour += 12; + } + else if(*pui8Hour == 12) + { + *pbPM = true; + } + else if(*pui8Hour > 12) + { + *pui8Hour -= 12; + *pbPM = true; + } + else + { + *pbPM = false; + } +} + +//***************************************************************************** +// +// This function returns the number of days in a month including for a leap +// year. +// +//***************************************************************************** +uint32_t +GetDaysInMonth(uint32_t ui32Year, uint32_t ui32Mon) +{ + // + // Return the number of days based on the month. + // + if(ui32Mon == 1) + { + // + // For February return the number of days based on the year being a + // leap year or not. + // + if((ui32Year % 4) == 0) + { + // + // If leap year return 29. + // + return 29; + } + else + { + // + // If not leap year return 28. + // + return 28; + } + } + else if((ui32Mon == 3) || (ui32Mon == 5) || (ui32Mon == 8) || + (ui32Mon == 10)) + { + // + // For April, June, September and November return 30. + // + return 30; + } + + // + // For all the other months return 31. + // + return 31; +} + +//***************************************************************************** +// +// This function updates individual buffers with valid date and time to be +// displayed on the date screen so that the date and time can be updated. +// +//***************************************************************************** +bool +DateTimeUpdateGet(char *pcMon, char *pcDay, char *pcYear, char *pcHour, + char *pcMin, char *pcAMPM) +{ + struct tm sTime; + bool bPM; + + + // + // Get the latest time. + // + HibernateCalendarGet(&sTime); + + // + // Set AM as default. + // + bPM = false; + + // + // Convert 24-hour format into 12-hour format with AM/PM indication. + // + ConvertHourTo12Mode((uint8_t*)&sTime.tm_hour, &bPM); + strcpy(pcAMPM, bPM?"PM":"AM"); + + // + // If date and time is valid, copy the date and time values into respective + // indexes. + // + g_ui32MonthIdx = sTime.tm_mon; + g_ui32DayIdx = sTime.tm_mday; + g_ui32YearIdx = sTime.tm_year - 100; + g_ui32HourIdx = sTime.tm_hour; + g_ui32MinIdx = sTime.tm_min; + + // + // Convert the date and time into string format and copy into supplied + // buffers. + // + usnprintf(pcMon, 4, "%s", g_ppcMonth[g_ui32MonthIdx]); + usnprintf(pcDay, 3, "%u", g_ui32DayIdx); + usnprintf(pcYear, 5, "20%02u", g_ui32YearIdx); + usnprintf(pcHour, 3, "%u", g_ui32HourIdx); + usnprintf(pcMin, 3, "%02u", g_ui32MinIdx); + + // + // Return true to indicate new information has been updated. + // + return true; +} + +//***************************************************************************** +// +// This function writes the requested date and time to the calendar logic of +// hibernation module. +// +//***************************************************************************** +void +DateTimeSet(void) +{ + struct tm sTime; + + // + // Get the latest date and time. This is done here so that unchanged + // parts of date and time can be written back as is. + // + HibernateCalendarGet(&sTime); + + // + // Set the date and time values that are to be updated. + // + sTime.tm_hour = g_ui32HourIdx; + sTime.tm_min = g_ui32MinIdx; + sTime.tm_mon = g_ui32MonthIdx; + sTime.tm_mday = g_ui32DayIdx; + sTime.tm_year = 100 + g_ui32YearIdx; + + // + // Convert 12-hour format into 24-hour format. + // + if(strcmp(g_pcAMPMBuf, "PM") == 0) + { + if(sTime.tm_hour < 12) + { + sTime.tm_hour += 12; + } + } + else + { + if(sTime.tm_hour > 11) + { + sTime.tm_hour -= 12; + } + } + + // + // Update the calendar logic of hibernation module with the requested data. + // + HibernateCalendarSet(&sTime); +} + +//***************************************************************************** +// +// Handle the "Date/Time" button press on Main Screen. +// +//***************************************************************************** +void +OnDateTimeSetBtnPress(tWidget *psWidget) +{ + // + // Update the date and time screen buffers before painting the screens. + // Even though only buffers used with the date screen are needed at this + // time, we update both to save few cycles. + // + DateTimeUpdateGet(g_pcMonBuf, g_pcDayBuf, g_pcYearBuf, g_pcHourBuf, + g_pcMinBuf, g_pcAMPMBuf); + + // + // Remove the main screen from the root. + // + WidgetRemove((tWidget *)&g_sMainScreen); + + // + // Add the date screen to the root. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sDateScreen); + + // + // Add the widget tree to message queue so that it can be drawn on the + // display. + // + WidgetPaint(WIDGET_ROOT); + + // + // Set the flag to indicate that the main screen is not active. + // + g_bMainScreen = false; +} + +//***************************************************************************** +// +// Handle the Month "-" button press on Date Screen. +// +//***************************************************************************** +void +OnMonUpBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to decrement the month. So reduce index by one such that the + // index cycles back to the bottom of the list if it is at the top. + // + g_ui32MonthIdx = (g_ui32MonthIdx == 0) ? 11 : g_ui32MonthIdx - 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + strcpy(g_pcMonBuf, g_ppcMonth[g_ui32MonthIdx]); + WidgetPaint(&g_sMonText.sBase); + + // + // Makes sure that the day value does not exceed the number of days for the + // selected month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth : + g_ui32DayIdx; + + // + // Since the day value might also have been modified, store the day index + // in a buffer as a string and add the widget to the message queue so that + // it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the Month "+" button press on Date Screen. +// +//***************************************************************************** +void +OnMonDwnBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to increment the month. So increment index by one such that + // the index cycles back to the top of the list if it is at the bottom. + // + g_ui32MonthIdx = (g_ui32MonthIdx == 11) ? 0 : g_ui32MonthIdx + 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + strcpy(g_pcMonBuf, g_ppcMonth[g_ui32MonthIdx]); + WidgetPaint(&g_sMonText.sBase); + + // + // Makes sure that the day value does not exceed the number of days for the + // selected month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth : + g_ui32DayIdx; + + // + // Since the day value might also have been modified, store the day index + // in a buffer as a string and add the widget to the message queue so that + // it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the Day "-" button press on Date Screen. +// +//***************************************************************************** +void +OnDayUpBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to decrement the day. So reduce index by one such that the + // index cycles back to the bottom of the list if it is at the top. Make + // sure that the day index is adjusted based on the number of days in a + // month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx < 2) ? ui32DaysInMonth : g_ui32DayIdx - 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the Day "+" button press on Date Screen. +// +//***************************************************************************** +void +OnDayDwnBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to increment the day. So increment index by one such that + // the index cycles back to the top of the list if it is at the bottom. + // Make sure that the day index does not exceed the number of days for the + // selected month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx > (ui32DaysInMonth - 1)) ? 1 : + (g_ui32DayIdx + 1); + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the Year "-" button press on Date Screen. +// +//***************************************************************************** +void +OnYearUpBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to decrement the year. So reduce index by one such that the + // index cycles back to the bottom of the list if it is at the top. + // + g_ui32YearIdx = (g_ui32YearIdx == 0) ? 99 : g_ui32YearIdx - 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcYearBuf, sizeof(g_pcYearBuf), "20%02u", g_ui32YearIdx); + WidgetPaint(&g_sYearText.sBase); + + // + // Makes sure that the day value does not exceed the number of days for the + // selected month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth : + g_ui32DayIdx; + + // + // Since the day value might also have been modified, store the day index + // in a buffer as a string and add the widget to the message queue so that + // it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the Year "+" button press on Date Screen. +// +//***************************************************************************** +void +OnYearDwnBtnPress(tWidget *psWidget) +{ + uint32_t ui32DaysInMonth; + + // + // User wants to increment the year. So increment index by one such that + // the index cycles back to the top of the list if it is at the bottom. + // + g_ui32YearIdx = (g_ui32YearIdx == 99) ? 0 : g_ui32YearIdx + 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcYearBuf, sizeof(g_pcYearBuf), "20%02u", g_ui32YearIdx); + WidgetPaint(&g_sYearText.sBase); + + // + // Makes sure that the day value does not exceed the number of days for the + // selected month. + // + ui32DaysInMonth = GetDaysInMonth(g_ui32YearIdx, g_ui32MonthIdx); + g_ui32DayIdx = (g_ui32DayIdx > ui32DaysInMonth) ? ui32DaysInMonth : + g_ui32DayIdx; + + // + // Since the day value might also have been modified, store the day index + // in a buffer as a string and add the widget to the message queue so that + // it can be redrawn. + // + usnprintf(g_pcDayBuf, sizeof(g_pcDayBuf), "%02u", g_ui32DayIdx); + WidgetPaint(&g_sDayText.sBase); +} + +//***************************************************************************** +// +// Handle the "NEXT" button press on Date Screen. +// +//***************************************************************************** +void +OnDateNextBtnPress(tWidget *psWidget) +{ + // + // Remove the main screen from the root. + // + WidgetRemove((tWidget *)&g_sDateScreen); + + // + // Add the date screen to the root. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sTimeScreen); + + // + // Add the widget tree to message queue so that it can be drawn on the + // display. + // + WidgetPaint(WIDGET_ROOT); +} + +//***************************************************************************** +// +// Handle the Hour "-" button press on Time Screen. +// +//***************************************************************************** +void +OnHourUpBtnPress(tWidget *psWidget) +{ + // + // User wants to decrement the hour. So reduce index by one such that the + // index cycles back to the bottom of the list if it is at the top. + // + g_ui32HourIdx = (g_ui32HourIdx == 1) ? 12 : g_ui32HourIdx - 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcHourBuf, sizeof(g_pcHourBuf), "%u", g_ui32HourIdx); + WidgetPaint(&g_sHourText.sBase); +} + +//***************************************************************************** +// +// Handle the Hour "+" button press on Time Screen. +// +//***************************************************************************** +void +OnHourDwnBtnPress(tWidget *psWidget) +{ + // + // User wants to increment the hour. So increment index by one such that + // the index cycles back to the top of the list if it is at the bottom. + // + g_ui32HourIdx = (g_ui32HourIdx == 12) ? 1 : g_ui32HourIdx + 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcHourBuf, sizeof(g_pcHourBuf), "%u", g_ui32HourIdx); + WidgetPaint(&g_sHourText.sBase); +} + +//***************************************************************************** +// +// Handle the Minute "-" button press on Time Screen. +// +//***************************************************************************** +void +OnMinUpBtnPress(tWidget *psWidget) +{ + // + // User wants to decrement the minute. So reduce index by one such that + // the index cycles back to the bottom of the list if it is at the top. + // + g_ui32MinIdx = (g_ui32MinIdx == 0) ? 59 : g_ui32MinIdx - 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcMinBuf, sizeof(g_pcMinBuf), "%02u", g_ui32MinIdx); + WidgetPaint(&g_sMinText.sBase); +} + +//***************************************************************************** +// +// Handle the Minute "+" button press on Time Screen. +// +//***************************************************************************** +void +OnMinDwnBtnPress(tWidget *psWidget) +{ + // + // User wants to increment the minute. So increment index by one such that + // the index cycles back to the top of the list if it is at the bottom. + // + g_ui32MinIdx = (g_ui32MinIdx == 59) ? 0 : g_ui32MinIdx + 1; + + // + // Store the index in a buffer as a string and add the widget to the + // message queue so that it can be redrawn. + // + usnprintf(g_pcMinBuf, sizeof(g_pcMinBuf), "%02u", g_ui32MinIdx); + WidgetPaint(&g_sMinText.sBase); +} + +//***************************************************************************** +// +// Handle the AM/PM "+" and "-" button press on Time Screen. The same function +// handles both the button presses. +// +//***************************************************************************** +void +OnAMPMBtnPress(tWidget *psWidget) +{ + // + // User wants to change AM to PM or vice versa. Change to "PM" if "AM" and + // vice versa. + // + if(strcmp(g_pcAMPMBuf, "AM") == 0) + { + strcpy(g_pcAMPMBuf, "PM"); + } + else + { + strcpy(g_pcAMPMBuf, "AM"); + } + + // + // Add the widget to the message queue so that it can be redrawn. + // + WidgetPaint(&g_sAMPMText.sBase); +} + +//***************************************************************************** +// +// Handle the "DONE" button press on Time Screen. +// +//***************************************************************************** +void +OnTimeDoneBtnPress(tWidget *psWidget) +{ + // + // Remove the time screen from the root. + // + WidgetRemove((tWidget *)&g_sTimeScreen); + + // + // Add the main screen to the root. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sMainScreen); + + // + // Add the widget tree to message queue so that it can be drawn on the + // display. + // + WidgetPaint(WIDGET_ROOT); + + // + // Set the flag to indicate that date and time have to updated. + // + g_bSetDate = true; +} + +//***************************************************************************** +// +// This example demonstrates the use of the Tamper module. +// +//***************************************************************************** +int +main(void) +{ + tContext sContext; + uint32_t ui32SysClock; + uint32_t ui32Index; + uint32_t ui32TempBuf[3]; + struct tm sTime; + bool bWakeFromTamper; + bool bWakeFromReset; + char pcBuf[64]; + char pcRTCBuf[32]; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "tamper"); + + // + // Initialize the touch screen driver and have it route its messages to the + // widget tree. + // + TouchScreenInit(ui32SysClock); + TouchScreenCallbackSet(WidgetPointerMessage); + + // + // Check to see if the processor is waking from a hibernation. + // + HibernateTamperWakeUp(&bWakeFromTamper, &bWakeFromReset); + + if(!bWakeFromTamper && !bWakeFromReset) + { + // + // If the system didn't wake from hibernation, + // Initialize the Hibernate module and enable the RTC/calendar mode. + // + HibernateEnableExpClk(0); + HibernateRTCEnable(); + HibernateCounterMode(HIBERNATE_COUNTER_24HR); + + // + // Fill the first three words in the Hibernate module memory with + // the required values. + // + ui32TempBuf[0] = HIBERNATE_TAMPER_DATA0; + ui32TempBuf[1] = 0; + ui32TempBuf[2] = 0; + HibernateDataSet(ui32TempBuf, 3); + + // + // Configure Hibernate wake sources. + // + HibernateWakeSet(HIBERNATE_WAKE_RESET); + + // + // Start Calendar time from 2013/8/1 00:00:00 + // + sTime.tm_hour = 0; + sTime.tm_min = 0; + sTime.tm_sec = 0; + sTime.tm_wday = 4; + sTime.tm_mon = 7; // [0, 11] + sTime.tm_mday = 1; // [1, 31] + sTime.tm_year = 113; // since 1900 + HibernateCalendarSet(&sTime); + + // + // Set Calendar match to every second + // + memset((void*)&sTime, 0, sizeof(struct tm)); + sTime.tm_sec = 0xFF; + sTime.tm_min = 0xFF; + sTime.tm_hour = 0xFF; + sTime.tm_mday = 0xFF; + HibernateCalendarMatchSet(0, &sTime); + + // + // Enable Calendar Match interrupt + // + ROM_HibernateIntClear(HIBERNATE_INT_RTC_MATCH_0); + ROM_HibernateIntEnable(HIBERNATE_INT_RTC_MATCH_0); + + + // + // Configure the TPIO0~3 signals by enabling trigger on low, + // weak pull-up and glitch filtering. + // + for(ui32Index = 0; ui32Index < 4; ui32Index++) + { + HibernateTamperIOEnable(ui32Index, + HIBERNATE_TAMPER_IO_TRIGGER_LOW | + HIBERNATE_TAMPER_IO_WPU_ENABLED | + HIBERNATE_TAMPER_IO_MATCH_SHORT); + } + + // + // Configure Hibernate module to wake up from tamper event. + // + HibernateTamperEventsConfig(HIBERNATE_TAMPER_EVENTS_HIB_WAKE); + + // + // Enable Tamper Module. + // + HibernateTamperEnable(); + } + else + { + if(bWakeFromTamper && + (g_ui32TamperEventFlag & HIBERNATE_TAMPER_EVENT_EXT_OSC)) + { + // + // XOSCFAIL was used to trigger a tamper event, set the flag + // g_ui32TamperXOSCFailEvent so that it will clear external + // oscillator failure after the external oscillator becomes + // active. + // + g_ui32TamperXOSCFailEvent = 1; + } + } + + // + // Clear Tamper event flag. + // + g_ui32NMIEvent = 0; + + + // + // Enable interrupts. + // + IntEnable(INT_HIBERNATE); + IntMasterEnable(); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sMainScreen); + + // + // Print instruction + // + if(!bWakeFromTamper && !bWakeFromReset) + { + PrintfStatus("Tamper Example app instruction:"); + PrintfStatus("-Ground PM4~7 to GND to trigger tamper events."); + PrintfStatus(" Corresponding indicator above should lightup") ; + PrintfStatus(" upon detection, the event along with the time"); + PrintfStatus(" stamp should be logged on the display."); + PrintfStatus("-Tap HIB button on the display to hibernate, and"); + PrintfStatus(" press RESET button or ground PM4~7 to wake up"); + PrintfStatus(" from hibernation."); + } + else + { + PrintfStatus("Wake from %s...", + bWakeFromReset? "RESET":"tamper event"); + } + + // + // Issue the initial paint request to the widgets. + // + WidgetPaint(WIDGET_ROOT); + + g_bMainScreen = true; + g_bHibernate = false; + g_bSetDate = false; + + while(1) + { + + if( g_bMainScreen && g_bUpdateRTC ) + { + bool bPM = false; + uint8_t ui8Hour; + + g_bUpdateRTC = 0; + HibernateCalendarGet(&sTime); + ui8Hour = sTime.tm_hour; + // + // covert the hour to 12 hour format + // + ConvertHourTo12Mode(&ui8Hour, &bPM); + usprintf(pcRTCBuf, " %02d/%02d/%04d %02d:%02d:%02d %s", + (sTime.tm_mon+1), sTime.tm_mday, (sTime.tm_year+1900), + ui8Hour, sTime.tm_min, sTime.tm_sec, (bPM?"PM":"AM") ); + CanvasTextSet(&g_sRTC, pcRTCBuf); + WidgetPaint((tWidget *)&g_sRTC.sBase); + } + + // + // Check if date and time has to be written to the calendar logic of + // hibernate module. + // + if(g_bSetDate == true) + { + // + // Yes - Clear the flag to avoid unwanted writes to the calendar + // logic. + // + g_bSetDate = false; + + // + // Write the requested date and time. + // + DateTimeSet(); + + // + // Set the flag to indicate that the main screen is active. + // + g_bMainScreen = true; + } + + if(g_ui32NMIEvent && g_bMainScreen) + { + uint8_t ui8Pos= 0; + uint8_t ui8Hour; + bool bPM; + + // + // Save the temper event first, so that they don't get overwriten + // from IRQ while we reference them. + // + ui32TempBuf[0] = g_ui32TamperEventFlag; + ui32TempBuf[1] = g_ui32TamperRTCLog; + + // + // Clear NMI event counter + // + g_ui32NMIEvent = 0; + + // + // Update GPIO indicator lights and status list box + // + if(ui32TempBuf[0] & HIBERNATE_TAMPER_EVENT_0) + { + CanvasImageSet(&g_sIndicator0,g_pui8LightOn); + strcpy(pcBuf, "PM7/TMPR0 "); + ui8Pos = 10; + } + else + { + CanvasImageSet(&g_sIndicator0, g_pui8LightOff); + } + + if(ui32TempBuf[0] & HIBERNATE_TAMPER_EVENT_1) + { + CanvasImageSet(&g_sIndicator1, g_pui8LightOn); + strcpy(pcBuf + ui8Pos, "PM6/TMPR1 "); + ui8Pos += 10; + } + else + { + CanvasImageSet(&g_sIndicator1, g_pui8LightOff); + } + + if(ui32TempBuf[0] & HIBERNATE_TAMPER_EVENT_2) + { + CanvasImageSet(&g_sIndicator2,g_pui8LightOn); + strcpy(pcBuf + ui8Pos, "PM5/TMPR2 "); + ui8Pos += 10; + } + else + { + CanvasImageSet(&g_sIndicator2, g_pui8LightOff); + } + + if(ui32TempBuf[0] & HIBERNATE_TAMPER_EVENT_3) + { + CanvasImageSet(&g_sIndicator3,g_pui8LightOn); + strcpy(pcBuf + ui8Pos, "PM4/TMPR3 "); + ui8Pos += 10; + } + else + { + CanvasImageSet(&g_sIndicator3,g_pui8LightOff); + } + + if(ui32TempBuf[0] & HIBERNATE_TAMPER_EVENT_EXT_OSC) + { + strcpy(pcBuf + ui8Pos, "XOSCFAIL "); + } + + WidgetPaint((tWidget *)&g_sMainScreen); + + // + // covert the hour to 12 hour format + // + ui8Hour = (ui32TempBuf[1]&0x0001F000)>>12; + ConvertHourTo12Mode(&ui8Hour, &bPM); + PrintfStatus("%s triggered on", pcBuf); + PrintfStatus(" %02d/%02d/%04d %02d:%02d:%02d %s", + (ui32TempBuf[1]&0x03C00000)>>22, + (ui32TempBuf[1]&0x003E0000)>>17, + (((ui32TempBuf[1]&0xFC000000)>>26) + 2000), + ui8Hour, + (ui32TempBuf[1]&0x00000FC0)>>6, + (ui32TempBuf[1]&0x0000003F), + (bPM?"PM":"AM")); + + } + + // + // Wait for the user to touch the display panel. + // + if(g_bHibernate == true) + { + // + // Clear the flag. + // + g_bHibernate = false; + + // + // Read and clear any status bits that might have been set since + // last clearing them. + // + ui32Index = HibernateIntStatus(0); + HibernateIntClear(ui32Index); + + PrintfStatus("Hibernating..."); + + // + // Process any messages in the widget message queue. + // + WidgetMessageQueueProcess(); + + // + // Request Hibernation. + // + HibernateRequest(); + + // + // Wait for a while for hibernate to activate. It should never + // get past this point. + // + SysCtlDelay(100); + } + + // + // Process any messages in the widget message queue. + // + WidgetMessageQueueProcess(); + + // + // If we have external oscillator failure, wait till the external + // oscillator becomes active, then clear external oscillator failure. + // + if(g_ui32TamperXOSCFailEvent) + { + while(HibernateTamperExtOscValid() == 0); + HibernateTamperExtOscRecover(); + g_ui32TamperXOSCFailEvent = 0; + } + } + +} diff --git a/boards/dk-tm4c129x/tamper/tamper.ewd b/boards/dk-tm4c129x/tamper/tamper.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/tamper/tamper.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/tamper/tamper.ewp b/boards/dk-tm4c129x/tamper/tamper.ewp new file mode 100644 index 0000000..afb914e --- /dev/null +++ b/boards/dk-tm4c129x/tamper/tamper.ewp @@ -0,0 +1,804 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\tamper.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/tamper/tamper.icf b/boards/dk-tm4c129x/tamper/tamper.icf new file mode 100644 index 0000000..cf5c508 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/tamper.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// tamper.icf - Linker configuration file for tamper. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/tamper/tamper.ld b/boards/dk-tm4c129x/tamper/tamper.ld new file mode 100644 index 0000000..2b243b5 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/tamper.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * tamper.ld - Linker configuration file for tamper. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/tamper/tamper.sct b/boards/dk-tm4c129x/tamper/tamper.sct new file mode 100644 index 0000000..05d4ea4 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/tamper.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; tamper.sct - Linker configuration file for tamper. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/tamper/tamper.uvopt b/boards/dk-tm4c129x/tamper/tamper.uvopt new file mode 100644 index 0000000..9cdc669 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/tamper.uvopt @@ -0,0 +1,373 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + tamper + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\tamper.c + tamper.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 10 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/tamper/tamper.uvproj b/boards/dk-tm4c129x/tamper/tamper.uvproj new file mode 100644 index 0000000..6323755 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/tamper.uvproj @@ -0,0 +1,454 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + tamper + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + tamper + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\tamper.bin .\rvmdk\tamper.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + tamper.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + tamper.c + 1 + .\tamper.c + + + touch.c + 1 + ..\drivers\touch.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/tamper/tamper_ccs.cmd b/boards/dk-tm4c129x/tamper/tamper_ccs.cmd new file mode 100644 index 0000000..0ea48b4 --- /dev/null +++ b/boards/dk-tm4c129x/tamper/tamper_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * tamper_ccs.cmd - CCS linker configuration file for tamper. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/Makefile b/boards/dk-tm4c129x/tdes_cbc_decrypt/Makefile new file mode 100644 index 0000000..a86262c --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Triple DES CBC Decryption Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the Triple DES CBC Decryption Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/tdes_cbc_decrypt.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Triple DES CBC Decryption Demo. +# +${COMPILER}/tdes_cbc_decrypt.axf: ${COMPILER}/frame.o +${COMPILER}/tdes_cbc_decrypt.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/tdes_cbc_decrypt.axf: ${COMPILER}/pinout.o +${COMPILER}/tdes_cbc_decrypt.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/tdes_cbc_decrypt.axf: ${COMPILER}/tdes_cbc_decrypt.o +${COMPILER}/tdes_cbc_decrypt.axf: ${COMPILER}/uartstdio.o +${COMPILER}/tdes_cbc_decrypt.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/tdes_cbc_decrypt.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/tdes_cbc_decrypt.axf: tdes_cbc_decrypt.ld +SCATTERgcc_tdes_cbc_decrypt=tdes_cbc_decrypt.ld +ENTRY_tdes_cbc_decrypt=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.ccsimportspec b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.ccsimportspec new file mode 100644 index 0000000..4183821 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.ccsproject b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.cproject b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.cproject new file mode 100644 index 0000000..0404349 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.project b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.project new file mode 100644 index 0000000..c494820 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.project @@ -0,0 +1,70 @@ + + + tdes_cbc_decrypt + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_ccs.c + + + tdes_cbc_decrypt.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.c + + + tdes_cbc_decrypt_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/Debug/tdes_cbc_decrypt.bin b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/Debug/tdes_cbc_decrypt.bin new file mode 100644 index 0000000..f190c78 Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/Debug/tdes_cbc_decrypt.bin differ diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/Debug/tdes_cbc_decrypt.out b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/Debug/tdes_cbc_decrypt.out new file mode 100644 index 0000000..14e1212 Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/Debug/tdes_cbc_decrypt.out differ diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/macros.ini_initial b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/target_config.ccxml b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/ewarm/Exe/tdes_cbc_decrypt.bin b/boards/dk-tm4c129x/tdes_cbc_decrypt/ewarm/Exe/tdes_cbc_decrypt.bin new file mode 100644 index 0000000..197997a Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_decrypt/ewarm/Exe/tdes_cbc_decrypt.bin differ diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/ewarm/Exe/tdes_cbc_decrypt.out b/boards/dk-tm4c129x/tdes_cbc_decrypt/ewarm/Exe/tdes_cbc_decrypt.out new file mode 100644 index 0000000..cb16423 Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_decrypt/ewarm/Exe/tdes_cbc_decrypt.out differ diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/gcc/tdes_cbc_decrypt.axf b/boards/dk-tm4c129x/tdes_cbc_decrypt/gcc/tdes_cbc_decrypt.axf new file mode 100644 index 0000000..c4ef1c4 Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_decrypt/gcc/tdes_cbc_decrypt.axf differ diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/gcc/tdes_cbc_decrypt.bin b/boards/dk-tm4c129x/tdes_cbc_decrypt/gcc/tdes_cbc_decrypt.bin new file mode 100644 index 0000000..3d60493 Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_decrypt/gcc/tdes_cbc_decrypt.bin differ diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/readme.txt b/boards/dk-tm4c129x/tdes_cbc_decrypt/readme.txt new file mode 100644 index 0000000..990fb46 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/readme.txt @@ -0,0 +1,31 @@ +TDES CBC Decryption Demo + +Simple demo showing an decryption operation using the DES module with +triple DES in CBC mode. A single block of data is decrypted at a time. +The module is also capable of performing in DES mode, but this has been +proven to be cryptographically insecure. CBC mode is also not recommended +because it will always produce the same ciphertext for a block of +plaintext. CBC and CFB modes are recommended instead. + +Please note that the use of interrupts and uDMA is not required for the +operation of the module. It is only done for demonstration purposes. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/rvmdk/tdes_cbc_decrypt.axf b/boards/dk-tm4c129x/tdes_cbc_decrypt/rvmdk/tdes_cbc_decrypt.axf new file mode 100644 index 0000000..4ba4a4b Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_decrypt/rvmdk/tdes_cbc_decrypt.axf differ diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/rvmdk/tdes_cbc_decrypt.bin b/boards/dk-tm4c129x/tdes_cbc_decrypt/rvmdk/tdes_cbc_decrypt.bin new file mode 100644 index 0000000..ee86af7 Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_decrypt/rvmdk/tdes_cbc_decrypt.bin differ diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_ccs.c b/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_ccs.c new file mode 100644 index 0000000..9f7112d --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TDESIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + TDESIntHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_ewarm.c b/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_ewarm.c new file mode 100644 index 0000000..2220a82 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TDESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + TDESIntHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_gcc.c b/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_gcc.c new file mode 100644 index 0000000..2b05d71 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TDESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + TDESIntHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_rvmdk.S b/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_rvmdk.S new file mode 100644 index 0000000..0fdfbc1 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN TDESIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD TDESIntHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.c b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.c new file mode 100644 index 0000000..bcb575f --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.c @@ -0,0 +1,657 @@ +//***************************************************************************** +// +// tdes_cbc_decrypt.c - Simple TDES CBC decryption demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_des.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/des.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      TDES CBC Decryption Demo (tdes_cbc_decrypt)

      +//! +//! Simple demo showing an decryption operation using the DES module with +//! triple DES in CBC mode. A single block of data is decrypted at a time. +//! The module is also capable of performing in DES mode, but this has been +//! proven to be cryptographically insecure. CBC mode is also not recommended +//! because it will always produce the same ciphertext for a block of +//! plaintext. CBC and CFB modes are recommended instead. +//! +//! Please note that the use of interrupts and uDMA is not required for the +//! operation of the module. It is only done for demonstration purposes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Triple DES test vector. +// The plaintext is from the AES example. The key was randomly generated. +// The resulting ciphertext was then generated using a Perl script with the +// Crypt::DES_EDE3 module. +// +//***************************************************************************** +uint32_t g_pui32TDESPlainText[16] = +{ + 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373, + 0x578a2dae, 0x9cac031e, 0xac6fb79e, 0x518eaf45, + 0x461cc830, 0x11e45ca3, 0x19c1fbe5, 0xef520a1a, + 0x45249ff6, 0x179b4fdf, 0x7b412bad, 0x10376ce6 +}; + +uint32_t g_pui32TDESKey[6] = +{ + 0xc7f51c87, 0x8076211f, 0x5de5c871, 0xa243cf7e, + 0xd25fdb75, 0xad73068f +}; + +uint32_t g_pui32TDESIV[2] = +{ + 0x6d8ecac4, 0x3b27c885 +}; + +uint32_t g_pui32TDESCipherText[16] = +{ + 0x24c69385, 0xb338be54, 0x6eeeb276, 0x1a952b4e, + 0x7242ce4b, 0x9ec147cf, 0x765916ee, 0x3d25e685, + 0xfe5865b4, 0xf2238cb8, 0x2a5b68d5, 0x0f79a41a, + 0x6f4a7601, 0x7a57235f, 0xce84d08a, 0x1a34d011 +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Round up length to nearest 8 byte boundary. This is needed because all +// two data registers must be written at once. This is handled in the DES +// driver, but if using uDMA, the length must rounded up. +// +//***************************************************************************** +uint32_t +LengthRoundUp(uint32_t ui32Length) +{ + uint32_t ui32Remainder; + + ui32Remainder = ui32Length % 8; + if(ui32Remainder == 0) + { + return(ui32Length); + } + else + { + return(ui32Length + (8 - ui32Remainder)); + } +} + +//***************************************************************************** +// +// The TDES interrupt handler and interrupt flags. +// +//***************************************************************************** +static volatile bool g_bContextInIntFlag; +static volatile bool g_bDataInIntFlag; +static volatile bool g_bDataOutIntFlag; +static volatile bool g_bContextInDMADoneIntFlag; +static volatile bool g_bDataInDMADoneIntFlag; +static volatile bool g_bDataOutDMADoneIntFlag; + +void +TDESIntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the DES masked interrupt status. + // + ui32IntStatus = ROM_DESIntStatus(DES_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & DES_INT_CONTEXT_IN) + { + ROM_DESIntDisable(DES_BASE, DES_INT_CONTEXT_IN); + g_bContextInIntFlag = true; + UARTprintf(" Context input registers are ready.\n"); + } + if(ui32IntStatus & DES_INT_DATA_IN) + { + ROM_DESIntDisable(DES_BASE, DES_INT_DATA_IN); + g_bDataInIntFlag = true; + UARTprintf(" Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & DES_INT_DATA_OUT) + { + ROM_DESIntDisable(DES_BASE, DES_INT_DATA_OUT); + g_bDataOutIntFlag = true; + UARTprintf(" Data FIFO is ready to provide data.\n"); + } + if(ui32IntStatus & DES_INT_DMA_CONTEXT_IN) + { + ROM_DESIntClear(DES_BASE, DES_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneIntFlag = true; + UARTprintf(" DMA completed a context write to the internal\n"); + UARTprintf(" registers.\n"); + } + if(ui32IntStatus & DES_INT_DMA_DATA_IN) + { + ROM_DESIntClear(DES_BASE, DES_INT_DMA_DATA_IN); + g_bDataInDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of input data to\n"); + UARTprintf(" the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & DES_INT_DMA_DATA_OUT) + { + ROM_DESIntClear(DES_BASE, DES_INT_DMA_DATA_OUT); + g_bDataOutDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of process result.\n"); + } +} + +//***************************************************************************** +// +// Perform an decryption operation. +// +//***************************************************************************** +bool +TDESCBCDecrypt(uint32_t *pui32Src, uint32_t *pui32Dst, uint32_t *pui32Key, + uint32_t ui32Length, uint32_t *pui32IV, bool bUseDMA) +{ + // + // Perform a soft reset. + // + ROM_DESReset(DES_BASE); + + // + // Clear the interrupt flags. + // + g_bContextInIntFlag = false; + g_bDataInIntFlag = false; + g_bDataOutIntFlag = false; + g_bContextInDMADoneIntFlag = false; + g_bDataInDMADoneIntFlag = false; + g_bDataOutDMADoneIntFlag = false; + + // + // Enable all interrupts. + // + ROM_DESIntEnable(DES_BASE, (DES_INT_CONTEXT_IN | + DES_INT_DATA_IN | DES_INT_DATA_OUT)); + + // + // Configure the DES module. + // + ROM_DESConfigSet(DES_BASE, (DES_CFG_DIR_DECRYPT | DES_CFG_TRIPLE | + DES_CFG_MODE_CBC)); + + // + // Write the key. + // + ROM_DESKeySet(DES_BASE, pui32Key); + + // + // Write the IV. + // + ROM_DESIVSet(DES_BASE, pui32IV); + + // + // Depending on the argument, perform the decryption + // with or without uDMA. + // + if(bUseDMA) + { + // + // Enable DMA interrupts. + // + ROM_DESIntEnable(DES_BASE, (DES_INT_DMA_CONTEXT_IN | + DES_INT_DMA_DATA_IN | + DES_INT_DMA_DATA_OUT)); + + // + // Setup the DMA module to copy data in. + // + ROM_uDMAChannelAssign(UDMA_CH21_DES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH21_DES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH21_DES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_2 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH21_DES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Src, + (void *)(DES_BASE + DES_O_DATA_L), + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data in DMA request enabled.\n"); + + // + // Setup the DMA module to copy the data out. + // + ROM_uDMAChannelAssign(UDMA_CH22_DES0DOUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH22_DES0DOUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH22_DES0DOUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_NONE | + UDMA_DST_INC_32 | UDMA_ARB_2 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH22_DES0DOUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(DES_BASE + DES_O_DATA_L), + (void *)pui32Dst, + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data out DMA request enabled.\n"); + + // + // Enable DMA requests + // + ROM_DESDMAEnable(DES_BASE, DES_DMA_DATA_IN | DES_DMA_DATA_OUT); + + // + // Write the length registers to start the process. + // + ROM_DESLengthSet(DES_BASE, ui32Length); + + // + // Enable the DMA channels to start the transfers. This must be done after + // writing the length to prevent data from copying before the context is + // truly ready. + // + ROM_uDMAChannelEnable(UDMA_CH21_DES0DIN); + ROM_uDMAChannelEnable(UDMA_CH22_DES0DOUT); + + // + // Wait for the data in DMA done interrupt. + // + while(!g_bDataInDMADoneIntFlag) + { + } + + // + // Wait for the data out DMA done interrupt. + // + while(!g_bDataOutDMADoneIntFlag) + { + } + } + else + { + // + // Perform the decryption. + // + ROM_DESDataProcess(DES_BASE, pui32Src, pui32Dst, ui32Length); + } + + return(true); +} + +//***************************************************************************** +// +// Initialize the DES and CCM modules. +// +//***************************************************************************** +bool +DESInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example decrypts blocks of plaintext using TDES in CBC mode. It +// does the decryption first without uDMA and then with uDMA. The results +// are checked after each operation. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32PlainText[16], ui32Errors, ui32Idx, ui32SysClock; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "tdes-cbc-decrypt"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32PlainText[ui32Idx] = 0; + } + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUStackingEnable(); + + // + // Enable DES interrupts. + // + ROM_IntEnable(INT_DES0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting TDES CBC decryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and DES modules. + // + if(!DESInit()) + { + UARTprintf("Initialization of the DES module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Perform the decryption without uDMA. + // + UARTprintf("Performing decryption without uDMA.\n"); + TDESCBCDecrypt(g_pui32TDESCipherText, pui32PlainText, g_pui32TDESKey, + 64, g_pui32TDESIV, false); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32PlainText[ui32Idx] != g_pui32TDESPlainText[ui32Idx]) + { + UARTprintf("Plaintext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, g_pui32TDESPlainText[ui32Idx], + pui32PlainText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + + // + // Clear the array containing the plaintext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32PlainText[ui32Idx] = 0; + } + + // + // Perform the decryption with uDMA. + // + UARTprintf("Performing decryption with uDMA.\n"); + TDESCBCDecrypt(g_pui32TDESCipherText, pui32PlainText, g_pui32TDESKey, + 64, g_pui32TDESIV, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32PlainText[ui32Idx] != g_pui32TDESPlainText[ui32Idx]) + { + UARTprintf("Plaintext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, g_pui32TDESPlainText[ui32Idx], + pui32PlainText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000004; + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ewd b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ewp b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ewp new file mode 100644 index 0000000..05e10e3 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\tdes_cbc_decrypt.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.icf b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.icf new file mode 100644 index 0000000..0ead529 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// tdes_cbc_decrypt.icf - Linker configuration file for tdes_cbc_decrypt. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ld b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ld new file mode 100644 index 0000000..f5649e0 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * tdes_cbc_decrypt.ld - Linker configuration file for tdes_cbc_decrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.sct b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.sct new file mode 100644 index 0000000..1787e52 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; tdes_cbc_decrypt.sct - Linker configuration file for tdes_cbc_decrypt. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.uvopt b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.uvopt new file mode 100644 index 0000000..f79d52c --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + tdes_cbc_decrypt + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\tdes_cbc_decrypt.c + tdes_cbc_decrypt.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.uvproj b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.uvproj new file mode 100644 index 0000000..015bb4e --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + tdes_cbc_decrypt + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + tdes_cbc_decrypt + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\tdes_cbc_decrypt.bin .\rvmdk\tdes_cbc_decrypt.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + tdes_cbc_decrypt.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + tdes_cbc_decrypt.c + 1 + .\tdes_cbc_decrypt.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt_ccs.cmd b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt_ccs.cmd new file mode 100644 index 0000000..8b635ae --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_decrypt/tdes_cbc_decrypt_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * tdes_cbc_decrypt_ccs.cmd - CCS linker configuration file for tdes_cbc_decrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/Makefile b/boards/dk-tm4c129x/tdes_cbc_encrypt/Makefile new file mode 100644 index 0000000..7b07ffc --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Triple DES CBC Ecryption Demo. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the Triple DES CBC Ecryption Demo to be built. +# +all: ${COMPILER} +all: ${COMPILER}/tdes_cbc_encrypt.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Triple DES CBC Ecryption Demo. +# +${COMPILER}/tdes_cbc_encrypt.axf: ${COMPILER}/frame.o +${COMPILER}/tdes_cbc_encrypt.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/tdes_cbc_encrypt.axf: ${COMPILER}/pinout.o +${COMPILER}/tdes_cbc_encrypt.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/tdes_cbc_encrypt.axf: ${COMPILER}/tdes_cbc_encrypt.o +${COMPILER}/tdes_cbc_encrypt.axf: ${COMPILER}/uartstdio.o +${COMPILER}/tdes_cbc_encrypt.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/tdes_cbc_encrypt.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/tdes_cbc_encrypt.axf: tdes_cbc_encrypt.ld +SCATTERgcc_tdes_cbc_encrypt=tdes_cbc_encrypt.ld +ENTRY_tdes_cbc_encrypt=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.ccsimportspec b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.ccsimportspec new file mode 100644 index 0000000..e936c38 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.ccsproject b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.cproject b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.cproject new file mode 100644 index 0000000..660aba4 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.project b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.project new file mode 100644 index 0000000..f6a2c0a --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.project @@ -0,0 +1,70 @@ + + + tdes_cbc_encrypt + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_ccs.c + + + tdes_cbc_encrypt.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.c + + + tdes_cbc_encrypt_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/Debug/tdes_cbc_encrypt.bin b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/Debug/tdes_cbc_encrypt.bin new file mode 100644 index 0000000..ebd6c76 Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/Debug/tdes_cbc_encrypt.bin differ diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/Debug/tdes_cbc_encrypt.out b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/Debug/tdes_cbc_encrypt.out new file mode 100644 index 0000000..9684a84 Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/Debug/tdes_cbc_encrypt.out differ diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/macros.ini_initial b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/target_config.ccxml b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/ewarm/Exe/tdes_cbc_encrypt.bin b/boards/dk-tm4c129x/tdes_cbc_encrypt/ewarm/Exe/tdes_cbc_encrypt.bin new file mode 100644 index 0000000..37d84eb Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_encrypt/ewarm/Exe/tdes_cbc_encrypt.bin differ diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/ewarm/Exe/tdes_cbc_encrypt.out b/boards/dk-tm4c129x/tdes_cbc_encrypt/ewarm/Exe/tdes_cbc_encrypt.out new file mode 100644 index 0000000..4dad88b Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_encrypt/ewarm/Exe/tdes_cbc_encrypt.out differ diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/gcc/tdes_cbc_encrypt.axf b/boards/dk-tm4c129x/tdes_cbc_encrypt/gcc/tdes_cbc_encrypt.axf new file mode 100644 index 0000000..e362a71 Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_encrypt/gcc/tdes_cbc_encrypt.axf differ diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/gcc/tdes_cbc_encrypt.bin b/boards/dk-tm4c129x/tdes_cbc_encrypt/gcc/tdes_cbc_encrypt.bin new file mode 100644 index 0000000..ec3a270 Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_encrypt/gcc/tdes_cbc_encrypt.bin differ diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/readme.txt b/boards/dk-tm4c129x/tdes_cbc_encrypt/readme.txt new file mode 100644 index 0000000..2af8698 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/readme.txt @@ -0,0 +1,31 @@ +TDES CBC Encryption Demo + +Simple demo showing an encryption operation using the DES module with +triple DES in CBC mode. A single block of data is encrypted at a time. +The module is also capable of performing in DES mode, but this has been +proven to be cryptographically insecure. CBC mode is also not recommended +because it will always produce the same ciphertext for a block of +plaintext. CBC and CFB modes are recommended instead. + +Please note that the use of interrupts and uDMA is not required for the +operation of the module. It is only done for demonstration purposes. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/rvmdk/tdes_cbc_encrypt.axf b/boards/dk-tm4c129x/tdes_cbc_encrypt/rvmdk/tdes_cbc_encrypt.axf new file mode 100644 index 0000000..6ccdf58 Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_encrypt/rvmdk/tdes_cbc_encrypt.axf differ diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/rvmdk/tdes_cbc_encrypt.bin b/boards/dk-tm4c129x/tdes_cbc_encrypt/rvmdk/tdes_cbc_encrypt.bin new file mode 100644 index 0000000..3e689ae Binary files /dev/null and b/boards/dk-tm4c129x/tdes_cbc_encrypt/rvmdk/tdes_cbc_encrypt.bin differ diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_ccs.c b/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_ccs.c new file mode 100644 index 0000000..9f7112d --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TDESIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + TDESIntHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_ewarm.c b/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_ewarm.c new file mode 100644 index 0000000..2220a82 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TDESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + TDESIntHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_gcc.c b/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_gcc.c new file mode 100644 index 0000000..2b05d71 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void TDESIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + TDESIntHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_rvmdk.S b/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_rvmdk.S new file mode 100644 index 0000000..0fdfbc1 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN TDESIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD TDESIntHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.c b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.c new file mode 100644 index 0000000..ad23545 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.c @@ -0,0 +1,657 @@ +//***************************************************************************** +// +// tdes_cbc_encrypt.c - Simple TDES CBC encryption demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_des.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/des.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      TDES CBC Encryption Demo (tdes_cbc_encrypt)

      +//! +//! Simple demo showing an encryption operation using the DES module with +//! triple DES in CBC mode. A single block of data is encrypted at a time. +//! The module is also capable of performing in DES mode, but this has been +//! proven to be cryptographically insecure. CBC mode is also not recommended +//! because it will always produce the same ciphertext for a block of +//! plaintext. CBC and CFB modes are recommended instead. +//! +//! Please note that the use of interrupts and uDMA is not required for the +//! operation of the module. It is only done for demonstration purposes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration defines. +// +//***************************************************************************** +#define CCM_LOOP_TIMEOUT 500000 + +//***************************************************************************** +// +// The DMA control structure table. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[64]; +#else +tDMAControlTable g_psDMAControlTable[64] __attribute__((aligned(1024))); +#endif + +//***************************************************************************** +// +// Triple DES test vector. +// The plaintext is from the AES example. The key was randomly generated. +// The resulting ciphertext was then generated using a Perl script with the +// Crypt::DES_EDE3 module. +// +//***************************************************************************** +uint32_t g_pui32TDESPlainText[16] = +{ + 0xe2bec16b, 0x969f402e, 0x117e3de9, 0x2a179373, + 0x578a2dae, 0x9cac031e, 0xac6fb79e, 0x518eaf45, + 0x461cc830, 0x11e45ca3, 0x19c1fbe5, 0xef520a1a, + 0x45249ff6, 0x179b4fdf, 0x7b412bad, 0x10376ce6 +}; + +uint32_t g_pui32TDESKey[6] = +{ + 0xc7f51c87, 0x8076211f, 0x5de5c871, 0xa243cf7e, + 0xd25fdb75, 0xad73068f +}; + +uint32_t g_pui32TDESIV[2] = +{ + 0x6d8ecac4, 0x3b27c885 +}; + +uint32_t g_pui32TDESCipherText[16] = +{ + 0x24c69385, 0xb338be54, 0x6eeeb276, 0x1a952b4e, + 0x7242ce4b, 0x9ec147cf, 0x765916ee, 0x3d25e685, + 0xfe5865b4, 0xf2238cb8, 0x2a5b68d5, 0x0f79a41a, + 0x6f4a7601, 0x7a57235f, 0xce84d08a, 0x1a34d011 +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Round up length to nearest 8 byte boundary. This is needed because all +// two data registers must be written at once. This is handled in the DES +// driver, but if using uDMA, the length must rounded up. +// +//***************************************************************************** +uint32_t +LengthRoundUp(uint32_t ui32Length) +{ + uint32_t ui32Remainder; + + ui32Remainder = ui32Length % 8; + if(ui32Remainder == 0) + { + return(ui32Length); + } + else + { + return(ui32Length + (8 - ui32Remainder)); + } +} + +//***************************************************************************** +// +// The TDES interrupt handler and interrupt flags. +// +//***************************************************************************** +static volatile bool g_bContextInIntFlag; +static volatile bool g_bDataInIntFlag; +static volatile bool g_bDataOutIntFlag; +static volatile bool g_bContextInDMADoneIntFlag; +static volatile bool g_bDataInDMADoneIntFlag; +static volatile bool g_bDataOutDMADoneIntFlag; + +void +TDESIntHandler(void) +{ + uint32_t ui32IntStatus; + + // + // Read the DES masked interrupt status. + // + ui32IntStatus = ROM_DESIntStatus(DES_BASE, true); + + // + // Print a different message depending on the interrupt source. + // + if(ui32IntStatus & DES_INT_CONTEXT_IN) + { + ROM_DESIntDisable(DES_BASE, DES_INT_CONTEXT_IN); + g_bContextInIntFlag = true; + UARTprintf(" Context input registers are ready.\n"); + } + if(ui32IntStatus & DES_INT_DATA_IN) + { + ROM_DESIntDisable(DES_BASE, DES_INT_DATA_IN); + g_bDataInIntFlag = true; + UARTprintf(" Data FIFO is ready to receive data.\n"); + } + if(ui32IntStatus & DES_INT_DATA_OUT) + { + ROM_DESIntDisable(DES_BASE, DES_INT_DATA_OUT); + g_bDataOutIntFlag = true; + UARTprintf(" Data FIFO is ready to provide data.\n"); + } + if(ui32IntStatus & DES_INT_DMA_CONTEXT_IN) + { + ROM_DESIntClear(DES_BASE, DES_INT_DMA_CONTEXT_IN); + g_bContextInDMADoneIntFlag = true; + UARTprintf(" DMA completed a context write to the internal\n"); + UARTprintf(" registers.\n"); + } + if(ui32IntStatus & DES_INT_DMA_DATA_IN) + { + ROM_DESIntClear(DES_BASE, DES_INT_DMA_DATA_IN); + g_bDataInDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of input data to\n"); + UARTprintf(" the internal FIFO of the engine.\n"); + } + if(ui32IntStatus & DES_INT_DMA_DATA_OUT) + { + ROM_DESIntClear(DES_BASE, DES_INT_DMA_DATA_OUT); + g_bDataOutDMADoneIntFlag = true; + UARTprintf(" DMA has written the last word of process result.\n"); + } +} + +//***************************************************************************** +// +// Perform an encryption operation. +// +//***************************************************************************** +bool +TDESCBCEncrypt(uint32_t *pui32Src, uint32_t *pui32Dst, uint32_t *pui32Key, + uint32_t ui32Length, uint32_t *pui32IV, bool bUseDMA) +{ + // + // Perform a soft reset. + // + ROM_DESReset(DES_BASE); + + // + // Clear the interrupt flags. + // + g_bContextInIntFlag = false; + g_bDataInIntFlag = false; + g_bDataOutIntFlag = false; + g_bContextInDMADoneIntFlag = false; + g_bDataInDMADoneIntFlag = false; + g_bDataOutDMADoneIntFlag = false; + + // + // Enable all interrupts. + // + ROM_DESIntEnable(DES_BASE, (DES_INT_CONTEXT_IN | + DES_INT_DATA_IN | DES_INT_DATA_OUT)); + + // + // Configure the DES module. + // + ROM_DESConfigSet(DES_BASE, (DES_CFG_DIR_ENCRYPT | DES_CFG_TRIPLE | + DES_CFG_MODE_CBC)); + + // + // Write the key. + // + ROM_DESKeySet(DES_BASE, pui32Key); + + // + // Write the IV. + // + ROM_DESIVSet(DES_BASE, pui32IV); + + // + // Depending on the argument, perform the encryption + // with or without uDMA. + // + if(bUseDMA) + { + // + // Enable DMA interrupts. + // + ROM_DESIntEnable(DES_BASE, (DES_INT_DMA_CONTEXT_IN | + DES_INT_DMA_DATA_IN | + DES_INT_DMA_DATA_OUT)); + + // + // Setup the DMA module to copy data in. + // + ROM_uDMAChannelAssign(UDMA_CH21_DES0DIN); + ROM_uDMAChannelAttributeDisable(UDMA_CH21_DES0DIN, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH21_DES0DIN | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | + UDMA_DST_INC_NONE | UDMA_ARB_2 | + UDMA_DST_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH21_DES0DIN | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, (void *)pui32Src, + (void *)(DES_BASE + DES_O_DATA_L), + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data in DMA request enabled.\n"); + + // + // Setup the DMA module to copy the data out. + // + ROM_uDMAChannelAssign(UDMA_CH22_DES0DOUT); + ROM_uDMAChannelAttributeDisable(UDMA_CH22_DES0DOUT, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + ROM_uDMAChannelControlSet(UDMA_CH22_DES0DOUT | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_NONE | + UDMA_DST_INC_32 | UDMA_ARB_2 | + UDMA_SRC_PROT_PRIV); + ROM_uDMAChannelTransferSet(UDMA_CH22_DES0DOUT | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, + (void *)(DES_BASE + DES_O_DATA_L), + (void *)pui32Dst, + LengthRoundUp(ui32Length) / 4); + UARTprintf("Data out DMA request enabled.\n"); + + // + // Enable DMA requests + // + ROM_DESDMAEnable(DES_BASE, DES_DMA_DATA_IN | DES_DMA_DATA_OUT); + + // + // Write the length registers to start the process. + // + ROM_DESLengthSet(DES_BASE, ui32Length); + + // + // Enable the DMA channels to start the transfers. This must be done after + // writing the length to prevent data from copying before the context is + // truly ready. + // + ROM_uDMAChannelEnable(UDMA_CH21_DES0DIN); + ROM_uDMAChannelEnable(UDMA_CH22_DES0DOUT); + + // + // Wait for the data in DMA done interrupt. + // + while(!g_bDataInDMADoneIntFlag) + { + } + + // + // Wait for the data out DMA done interrupt. + // + while(!g_bDataOutDMADoneIntFlag) + { + } + } + else + { + // + // Perform the encryption. + // + ROM_DESDataProcess(DES_BASE, pui32Src, pui32Dst, ui32Length); + } + + return(true); +} + +//***************************************************************************** +// +// Initialize the DES and CCM modules. +// +//***************************************************************************** +bool +DESInit(void) +{ + uint32_t ui32Loop; + + // + // Check that the CCM peripheral is present. + // + if(!ROM_SysCtlPeripheralPresent(SYSCTL_PERIPH_CCM0)) + { + UARTprintf("No CCM peripheral found!\n"); + + // + // Return failure. + // + return(false); + } + + // + // The hardware is available, enable it. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, notify and spin. + // + UARTprintf("Time out on CCM ready after enable.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Reset the peripheral to ensure we are starting from a known condition. + // + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0); + + // + // Wait for the peripheral to be ready again. + // + ui32Loop = 0; + while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0)) + { + // + // Increment our poll counter. + // + ui32Loop++; + + if(ui32Loop > CCM_LOOP_TIMEOUT) + { + // + // Timed out, spin. + // + UARTprintf("Time out on CCM ready after reset.\n"); + + // + // Return failure. + // + return(false); + } + } + + // + // Return initialization success. + // + return(true); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + ROM_UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example encrypts blocks of plaintext using TDES in CBC mode. It +// does the encryption first without uDMA and then with uDMA. The results +// are checked after each operation. +// +//***************************************************************************** +int +main(void) +{ + uint32_t pui32CipherText[16], ui32Errors, ui32Idx, ui32SysClock; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "tdes-cbc-encrypt"); + + // + // Show some instructions on the display + // + GrContextFontSet(&sContext, g_psFontCm20); + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDrawCentered(&sContext, "Connect a terminal to", -1, + GrContextDpyWidthGet(&sContext) / 2, 60, false); + GrStringDrawCentered(&sContext, "UART0 (115200,N,8,1)", -1, + GrContextDpyWidthGet(&sContext) / 2, 80, false); + GrStringDrawCentered(&sContext, "for more information.", -1, + GrContextDpyWidthGet(&sContext) / 2, 100, false); + + // + // Initialize local variables. + // + ui32Errors = 0; + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUStackingEnable(); + + // + // Enable DES interrupts. + // + ROM_IntEnable(INT_DES0); + + // + // Enable debug output on UART0 and print a welcome message. + // + ConfigureUART(); + UARTprintf("Starting TDES CBC encryption demo.\n"); + GrStringDrawCentered(&sContext, "Starting demo...", -1, + GrContextDpyWidthGet(&sContext) / 2, 140, false); + + // + // Enable the uDMA module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + + // + // Setup the control table. + // + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initialize the CCM and DES modules. + // + if(!DESInit()) + { + UARTprintf("Initialization of the DES module failed.\n"); + ui32Errors |= 0x00000001; + } + + // + // Perform the encryption without uDMA. + // + UARTprintf("Performing encryption without uDMA.\n"); + TDESCBCEncrypt(g_pui32TDESPlainText, pui32CipherText, g_pui32TDESKey, + 64, g_pui32TDESIV, false); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32CipherText[ui32Idx] != g_pui32TDESCipherText[ui32Idx]) + { + UARTprintf("Ciphertext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, g_pui32TDESCipherText[ui32Idx], + pui32CipherText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000002; + } + } + + // + // Clear the array containing the ciphertext. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + pui32CipherText[ui32Idx] = 0; + } + + // + // Perform the encryption with uDMA. + // + UARTprintf("Performing encryption with uDMA.\n"); + TDESCBCEncrypt(g_pui32TDESPlainText, pui32CipherText, g_pui32TDESKey, + 64, g_pui32TDESIV, true); + + // + // Check the result. + // + for(ui32Idx = 0; ui32Idx < 16; ui32Idx++) + { + if(pui32CipherText[ui32Idx] != g_pui32TDESCipherText[ui32Idx]) + { + UARTprintf("Ciphertext mismatch on word %d. Exp: 0x%x, Act: " + "0x%x\n", ui32Idx, g_pui32TDESCipherText[ui32Idx], + pui32CipherText[ui32Idx]); + ui32Errors |= (ui32Idx << 16) | 0x00000004; + } + } + + // + // Finished. + // + if(ui32Errors) + { + UARTprintf("Demo failed with error code 0x%x.\n", ui32Errors); + GrStringDrawCentered(&sContext, "Demo failed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + else + { + UARTprintf("Demo completed successfully.\n"); + GrStringDrawCentered(&sContext, "Demo passed.", -1, + GrContextDpyWidthGet(&sContext) / 2, 180, false); + } + + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ewd b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ewp b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ewp new file mode 100644 index 0000000..0f1ef88 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\tdes_cbc_encrypt.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.icf b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.icf new file mode 100644 index 0000000..4933f04 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// tdes_cbc_encrypt.icf - Linker configuration file for tdes_cbc_encrypt. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ld b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ld new file mode 100644 index 0000000..9cb345d --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * tdes_cbc_encrypt.ld - Linker configuration file for tdes_cbc_encrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.sct b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.sct new file mode 100644 index 0000000..cec817b --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; tdes_cbc_encrypt.sct - Linker configuration file for tdes_cbc_encrypt. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.uvopt b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.uvopt new file mode 100644 index 0000000..912fee3 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + tdes_cbc_encrypt + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\tdes_cbc_encrypt.c + tdes_cbc_encrypt.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.uvproj b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.uvproj new file mode 100644 index 0000000..d993dfd --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + tdes_cbc_encrypt + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + tdes_cbc_encrypt + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\tdes_cbc_encrypt.bin .\rvmdk\tdes_cbc_encrypt.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + tdes_cbc_encrypt.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + tdes_cbc_encrypt.c + 1 + .\tdes_cbc_encrypt.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt_ccs.cmd b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt_ccs.cmd new file mode 100644 index 0000000..8a50399 --- /dev/null +++ b/boards/dk-tm4c129x/tdes_cbc_encrypt/tdes_cbc_encrypt_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * tdes_cbc_encrypt_ccs.cmd - CCS linker configuration file for tdes_cbc_encrypt. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/timers/Makefile b/boards/dk-tm4c129x/timers/Makefile new file mode 100644 index 0000000..5c06af4 --- /dev/null +++ b/boards/dk-tm4c129x/timers/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the timers example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the timers example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/timers.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the timers example. +# +${COMPILER}/timers.axf: ${COMPILER}/frame.o +${COMPILER}/timers.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/timers.axf: ${COMPILER}/pinout.o +${COMPILER}/timers.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/timers.axf: ${COMPILER}/timers.o +${COMPILER}/timers.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/timers.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/timers.axf: timers.ld +SCATTERgcc_timers=timers.ld +ENTRY_timers=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/timers/ccs/.ccsimportspec b/boards/dk-tm4c129x/timers/ccs/.ccsimportspec new file mode 100644 index 0000000..e61983c --- /dev/null +++ b/boards/dk-tm4c129x/timers/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/timers/ccs/.ccsproject b/boards/dk-tm4c129x/timers/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/timers/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/timers/ccs/.cproject b/boards/dk-tm4c129x/timers/ccs/.cproject new file mode 100644 index 0000000..76a4eff --- /dev/null +++ b/boards/dk-tm4c129x/timers/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/timers/ccs/.project b/boards/dk-tm4c129x/timers/ccs/.project new file mode 100644 index 0000000..ad6a35e --- /dev/null +++ b/boards/dk-tm4c129x/timers/ccs/.project @@ -0,0 +1,65 @@ + + + timers + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/timers/startup_ccs.c + + + timers.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/timers/timers.c + + + timers_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/timers/timers_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/timers/ccs/Debug/timers.bin b/boards/dk-tm4c129x/timers/ccs/Debug/timers.bin new file mode 100644 index 0000000..5b46901 Binary files /dev/null and b/boards/dk-tm4c129x/timers/ccs/Debug/timers.bin differ diff --git a/boards/dk-tm4c129x/timers/ccs/Debug/timers.out b/boards/dk-tm4c129x/timers/ccs/Debug/timers.out new file mode 100644 index 0000000..762bd25 Binary files /dev/null and b/boards/dk-tm4c129x/timers/ccs/Debug/timers.out differ diff --git a/boards/dk-tm4c129x/timers/ccs/macros.ini_initial b/boards/dk-tm4c129x/timers/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/timers/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/timers/ccs/target_config.ccxml b/boards/dk-tm4c129x/timers/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/timers/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/timers/ewarm/Exe/timers.bin b/boards/dk-tm4c129x/timers/ewarm/Exe/timers.bin new file mode 100644 index 0000000..1452b86 Binary files /dev/null and b/boards/dk-tm4c129x/timers/ewarm/Exe/timers.bin differ diff --git a/boards/dk-tm4c129x/timers/ewarm/Exe/timers.out b/boards/dk-tm4c129x/timers/ewarm/Exe/timers.out new file mode 100644 index 0000000..7e5939b Binary files /dev/null and b/boards/dk-tm4c129x/timers/ewarm/Exe/timers.out differ diff --git a/boards/dk-tm4c129x/timers/gcc/timers.axf b/boards/dk-tm4c129x/timers/gcc/timers.axf new file mode 100644 index 0000000..3d13480 Binary files /dev/null and b/boards/dk-tm4c129x/timers/gcc/timers.axf differ diff --git a/boards/dk-tm4c129x/timers/gcc/timers.bin b/boards/dk-tm4c129x/timers/gcc/timers.bin new file mode 100644 index 0000000..9998957 Binary files /dev/null and b/boards/dk-tm4c129x/timers/gcc/timers.bin differ diff --git a/boards/dk-tm4c129x/timers/readme.txt b/boards/dk-tm4c129x/timers/readme.txt new file mode 100644 index 0000000..e1b65a2 --- /dev/null +++ b/boards/dk-tm4c129x/timers/readme.txt @@ -0,0 +1,26 @@ +Timer + +This example application demonstrates the use of the timers to generate +periodic interrupts. One timer is set up to interrupt once per second and +the other to interrupt twice per second; each interrupt handler will toggle +its own indicator on the display. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/timers/rvmdk/timers.axf b/boards/dk-tm4c129x/timers/rvmdk/timers.axf new file mode 100644 index 0000000..b64b0d4 Binary files /dev/null and b/boards/dk-tm4c129x/timers/rvmdk/timers.axf differ diff --git a/boards/dk-tm4c129x/timers/rvmdk/timers.bin b/boards/dk-tm4c129x/timers/rvmdk/timers.bin new file mode 100644 index 0000000..407b29c Binary files /dev/null and b/boards/dk-tm4c129x/timers/rvmdk/timers.bin differ diff --git a/boards/dk-tm4c129x/timers/startup_ccs.c b/boards/dk-tm4c129x/timers/startup_ccs.c new file mode 100644 index 0000000..1b86573 --- /dev/null +++ b/boards/dk-tm4c129x/timers/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/timers/startup_ewarm.c b/boards/dk-tm4c129x/timers/startup_ewarm.c new file mode 100644 index 0000000..0abf7ce --- /dev/null +++ b/boards/dk-tm4c129x/timers/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/timers/startup_gcc.c b/boards/dk-tm4c129x/timers/startup_gcc.c new file mode 100644 index 0000000..c249581 --- /dev/null +++ b/boards/dk-tm4c129x/timers/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/timers/startup_rvmdk.S b/boards/dk-tm4c129x/timers/startup_rvmdk.S new file mode 100644 index 0000000..365e20f --- /dev/null +++ b/boards/dk-tm4c129x/timers/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN Timer0IntHandler + EXTERN Timer1IntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD Timer0IntHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD Timer1IntHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/timers/timers.c b/boards/dk-tm4c129x/timers/timers.c new file mode 100644 index 0000000..72ec92f --- /dev/null +++ b/boards/dk-tm4c129x/timers/timers.c @@ -0,0 +1,216 @@ +//***************************************************************************** +// +// timers.c - Timers example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Timer (timers)

      +//! +//! This example application demonstrates the use of the timers to generate +//! periodic interrupts. One timer is set up to interrupt once per second and +//! the other to interrupt twice per second; each interrupt handler will toggle +//! its own indicator on the display. +// +//***************************************************************************** + +//***************************************************************************** +// +// Flags that contain the current value of the interrupt indicator as displayed +// on the display. +// +//***************************************************************************** +uint32_t g_ui32Flags; + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the first timer interrupt. +// +//***************************************************************************** +void +Timer0IntHandler(void) +{ + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); + + // + // Toggle the flag for the first timer. + // + HWREGBITW(&g_ui32Flags, 0) ^= 1; + + // + // Update the interrupt status on the display. + // + ROM_IntMasterDisable(); + GrStringDraw(&g_sContext, (HWREGBITW(&g_ui32Flags, 0) ? "1" : "0"), -1, + 195, 108, 1); + ROM_IntMasterEnable(); +} + +//***************************************************************************** +// +// The interrupt handler for the second timer interrupt. +// +//***************************************************************************** +void +Timer1IntHandler(void) +{ + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); + + // + // Toggle the flag for the second timer. + // + HWREGBITW(&g_ui32Flags, 1) ^= 1; + + // + // Update the interrupt status on the display. + // + ROM_IntMasterDisable(); + GrStringDraw(&g_sContext, (HWREGBITW(&g_ui32Flags, 1) ? "1" : "0"), -1, + 195, 128, 1); + ROM_IntMasterEnable(); +} + +//***************************************************************************** +// +// This example application demonstrates the use of the timers to generate +// periodic interrupts. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "timers"); + + // + // Initialize timer status display. + // + GrStringDraw(&g_sContext, "Timer 0:", -1, 100, 108, 0); + GrStringDraw(&g_sContext, "Timer 1:", -1, 100, 128, 0); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); + + // + // Enable processor interrupts. + // + ROM_IntMasterEnable(); + + // + // Configure the two 32-bit periodic timers. + // + ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); + ROM_TimerConfigure(TIMER1_BASE, TIMER_CFG_PERIODIC); + ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ui32SysClock); + ROM_TimerLoadSet(TIMER1_BASE, TIMER_A, ui32SysClock / 2); + + // + // Setup the interrupts for the timer timeouts. + // + ROM_IntEnable(INT_TIMER0A); + ROM_IntEnable(INT_TIMER1A); + ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); + ROM_TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); + + // + // Enable the timers. + // + ROM_TimerEnable(TIMER0_BASE, TIMER_A); + ROM_TimerEnable(TIMER1_BASE, TIMER_A); + + // + // Loop forever while the timers run. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/timers/timers.ewd b/boards/dk-tm4c129x/timers/timers.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/timers/timers.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/timers/timers.ewp b/boards/dk-tm4c129x/timers/timers.ewp new file mode 100644 index 0000000..4b0b64a --- /dev/null +++ b/boards/dk-tm4c129x/timers/timers.ewp @@ -0,0 +1,798 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\timers.c + + + diff --git a/boards/dk-tm4c129x/timers/timers.icf b/boards/dk-tm4c129x/timers/timers.icf new file mode 100644 index 0000000..ad775c2 --- /dev/null +++ b/boards/dk-tm4c129x/timers/timers.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// timers.icf - Linker configuration file for timers. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/timers/timers.ld b/boards/dk-tm4c129x/timers/timers.ld new file mode 100644 index 0000000..3c45d47 --- /dev/null +++ b/boards/dk-tm4c129x/timers/timers.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * timers.ld - Linker configuration file for timers. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/timers/timers.sct b/boards/dk-tm4c129x/timers/timers.sct new file mode 100644 index 0000000..03b5e15 --- /dev/null +++ b/boards/dk-tm4c129x/timers/timers.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; timers.sct - Linker configuration file for timers. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/timers/timers.uvopt b/boards/dk-tm4c129x/timers/timers.uvopt new file mode 100644 index 0000000..d722453 --- /dev/null +++ b/boards/dk-tm4c129x/timers/timers.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + timers + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\timers.c + timers.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/timers/timers.uvproj b/boards/dk-tm4c129x/timers/timers.uvproj new file mode 100644 index 0000000..284ecce --- /dev/null +++ b/boards/dk-tm4c129x/timers/timers.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + timers + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + timers + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\timers.bin .\rvmdk\timers.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + timers.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + timers.c + 1 + .\timers.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/timers/timers_ccs.cmd b/boards/dk-tm4c129x/timers/timers_ccs.cmd new file mode 100644 index 0000000..5bffa4a --- /dev/null +++ b/boards/dk-tm4c129x/timers/timers_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * timers_ccs.cmd - CCS linker configuration file for timers. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/uart_echo/Makefile b/boards/dk-tm4c129x/uart_echo/Makefile new file mode 100644 index 0000000..68229ef --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the uart_echo example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the uart_echo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/uart_echo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the uart_echo example. +# +${COMPILER}/uart_echo.axf: ${COMPILER}/frame.o +${COMPILER}/uart_echo.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/uart_echo.axf: ${COMPILER}/pinout.o +${COMPILER}/uart_echo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/uart_echo.axf: ${COMPILER}/uart_echo.o +${COMPILER}/uart_echo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/uart_echo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/uart_echo.axf: uart_echo.ld +SCATTERgcc_uart_echo=uart_echo.ld +ENTRY_uart_echo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/uart_echo/ccs/.ccsimportspec b/boards/dk-tm4c129x/uart_echo/ccs/.ccsimportspec new file mode 100644 index 0000000..9a02fa9 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/uart_echo/ccs/.ccsproject b/boards/dk-tm4c129x/uart_echo/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/uart_echo/ccs/.cproject b/boards/dk-tm4c129x/uart_echo/ccs/.cproject new file mode 100644 index 0000000..2cce08d --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/uart_echo/ccs/.project b/boards/dk-tm4c129x/uart_echo/ccs/.project new file mode 100644 index 0000000..72362ca --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/ccs/.project @@ -0,0 +1,65 @@ + + + uart_echo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/uart_echo/startup_ccs.c + + + uart_echo.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/uart_echo/uart_echo.c + + + uart_echo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/uart_echo/uart_echo_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/uart_echo/ccs/Debug/uart_echo.bin b/boards/dk-tm4c129x/uart_echo/ccs/Debug/uart_echo.bin new file mode 100644 index 0000000..2645f4c Binary files /dev/null and b/boards/dk-tm4c129x/uart_echo/ccs/Debug/uart_echo.bin differ diff --git a/boards/dk-tm4c129x/uart_echo/ccs/Debug/uart_echo.out b/boards/dk-tm4c129x/uart_echo/ccs/Debug/uart_echo.out new file mode 100644 index 0000000..476d864 Binary files /dev/null and b/boards/dk-tm4c129x/uart_echo/ccs/Debug/uart_echo.out differ diff --git a/boards/dk-tm4c129x/uart_echo/ccs/macros.ini_initial b/boards/dk-tm4c129x/uart_echo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/uart_echo/ccs/target_config.ccxml b/boards/dk-tm4c129x/uart_echo/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/uart_echo/ewarm/Exe/uart_echo.bin b/boards/dk-tm4c129x/uart_echo/ewarm/Exe/uart_echo.bin new file mode 100644 index 0000000..6276789 Binary files /dev/null and b/boards/dk-tm4c129x/uart_echo/ewarm/Exe/uart_echo.bin differ diff --git a/boards/dk-tm4c129x/uart_echo/ewarm/Exe/uart_echo.out b/boards/dk-tm4c129x/uart_echo/ewarm/Exe/uart_echo.out new file mode 100644 index 0000000..ea87942 Binary files /dev/null and b/boards/dk-tm4c129x/uart_echo/ewarm/Exe/uart_echo.out differ diff --git a/boards/dk-tm4c129x/uart_echo/gcc/uart_echo.axf b/boards/dk-tm4c129x/uart_echo/gcc/uart_echo.axf new file mode 100644 index 0000000..19b8215 Binary files /dev/null and b/boards/dk-tm4c129x/uart_echo/gcc/uart_echo.axf differ diff --git a/boards/dk-tm4c129x/uart_echo/gcc/uart_echo.bin b/boards/dk-tm4c129x/uart_echo/gcc/uart_echo.bin new file mode 100644 index 0000000..dbc05ff Binary files /dev/null and b/boards/dk-tm4c129x/uart_echo/gcc/uart_echo.bin differ diff --git a/boards/dk-tm4c129x/uart_echo/readme.txt b/boards/dk-tm4c129x/uart_echo/readme.txt new file mode 100644 index 0000000..9410427 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/readme.txt @@ -0,0 +1,26 @@ +UART Echo + +This example application utilizes the UART to echo text. The first UART +(connected to the FTDI virtual serial port on the evaluation board) will be +configured in 115,200 baud, 8-n-1 mode. All characters received on the +UART are transmitted back to the UART. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/uart_echo/rvmdk/uart_echo.axf b/boards/dk-tm4c129x/uart_echo/rvmdk/uart_echo.axf new file mode 100644 index 0000000..4295465 Binary files /dev/null and b/boards/dk-tm4c129x/uart_echo/rvmdk/uart_echo.axf differ diff --git a/boards/dk-tm4c129x/uart_echo/rvmdk/uart_echo.bin b/boards/dk-tm4c129x/uart_echo/rvmdk/uart_echo.bin new file mode 100644 index 0000000..c6c0afc Binary files /dev/null and b/boards/dk-tm4c129x/uart_echo/rvmdk/uart_echo.bin differ diff --git a/boards/dk-tm4c129x/uart_echo/startup_ccs.c b/boards/dk-tm4c129x/uart_echo/startup_ccs.c new file mode 100644 index 0000000..1d6dc44 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/uart_echo/startup_ewarm.c b/boards/dk-tm4c129x/uart_echo/startup_ewarm.c new file mode 100644 index 0000000..82f52a2 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/uart_echo/startup_gcc.c b/boards/dk-tm4c129x/uart_echo/startup_gcc.c new file mode 100644 index 0000000..350c6e6 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/uart_echo/startup_rvmdk.S b/boards/dk-tm4c129x/uart_echo/startup_rvmdk.S new file mode 100644 index 0000000..30c1e2e --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN UARTIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/uart_echo/uart_echo.c b/boards/dk-tm4c129x/uart_echo/uart_echo.c new file mode 100644 index 0000000..83d1507 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/uart_echo.c @@ -0,0 +1,207 @@ +//***************************************************************************** +// +// uart_echo.c - Example for reading data from and writing data to the UART in +// an interrupt driven fashion. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/frame.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      UART Echo (uart_echo)

      +//! +//! This example application utilizes the UART to echo text. The first UART +//! (connected to the FTDI virtual serial port on the evaluation board) will be +//! configured in 115,200 baud, 8-n-1 mode. All characters received on the +//! UART are transmitted back to the UART. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The UART interrupt handler. +// +//***************************************************************************** +void +UARTIntHandler(void) +{ + uint32_t ui32Status; + + // + // Get the interrrupt status. + // + ui32Status = ROM_UARTIntStatus(UART0_BASE, true); + + // + // Clear the asserted interrupts. + // + ROM_UARTIntClear(UART0_BASE, ui32Status); + + // + // Loop while there are characters in the receive FIFO. + // + while(ROM_UARTCharsAvail(UART0_BASE)) + { + // + // Read the next character from the UART and write it back to the UART. + // + ROM_UARTCharPutNonBlocking(UART0_BASE, + UARTCharGetNonBlocking(UART0_BASE)); + } +} + +//***************************************************************************** +// +// Send a string to the UART. +// +//***************************************************************************** +void +UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count) +{ + // + // Loop while there are more characters to send. + // + while(ui32Count--) + { + // + // Write the next character to the UART. + // + ROM_UARTCharPutNonBlocking(UART0_BASE, *pui8Buffer++); + } +} + +//***************************************************************************** +// +// This example demonstrates how to send a string of data to the UART. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock; + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "uart-echo"); + + // + // Display UART configuration on the display. + // + GrStringDraw(&sContext, "Port:", -1, 70, 70, 0); + GrStringDraw(&sContext, "Baud:", -1, 70, 95, 0); + GrStringDraw(&sContext, "Data:", -1, 70, 120, 0); + GrStringDraw(&sContext, "Parity:", -1, 70, 145, 0); + GrStringDraw(&sContext, "Stop:", -1, 70, 170, 0); + GrStringDraw(&sContext, "Uart 0", -1, 150, 70, 0); + GrStringDraw(&sContext, "115,200 bps", -1, 150, 95, 0); + GrStringDraw(&sContext, "8 Bit", -1, 150, 120, 0); + GrStringDraw(&sContext, "None", -1, 150, 145, 0); + GrStringDraw(&sContext, "1 Bit", -1, 150, 170, 0); + + // + // Enable the (non-GPIO) peripherals used by this example. PinoutSet() + // already enabled GPIO Port A. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Enable processor interrupts. + // + IntMasterEnable(); + + // + // Configure the UART for 115,200, 8-N-1 operation. + // + ROM_UARTConfigSetExpClk(UART0_BASE, ui32SysClock, 115200, + (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | + UART_CONFIG_PAR_NONE)); + + // + // Enable the UART interrupt. + // + ROM_IntEnable(INT_UART0); + ROM_UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT); + + // + // Prompt for text to be entered. + // + UARTSend((uint8_t *)"Enter text: ", 12); + + // + // Loop forever echoing data through the UART. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/uart_echo/uart_echo.ewd b/boards/dk-tm4c129x/uart_echo/uart_echo.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/uart_echo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/uart_echo/uart_echo.ewp b/boards/dk-tm4c129x/uart_echo/uart_echo.ewp new file mode 100644 index 0000000..ecaa25d --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/uart_echo.ewp @@ -0,0 +1,798 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\uart_echo.c + + + diff --git a/boards/dk-tm4c129x/uart_echo/uart_echo.icf b/boards/dk-tm4c129x/uart_echo/uart_echo.icf new file mode 100644 index 0000000..939afba --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/uart_echo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// uart_echo.icf - Linker configuration file for uart_echo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/uart_echo/uart_echo.ld b/boards/dk-tm4c129x/uart_echo/uart_echo.ld new file mode 100644 index 0000000..fe62efb --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/uart_echo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * uart_echo.ld - Linker configuration file for uart_echo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/uart_echo/uart_echo.sct b/boards/dk-tm4c129x/uart_echo/uart_echo.sct new file mode 100644 index 0000000..5b1afe1 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/uart_echo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; uart_echo.sct - Linker configuration file for uart_echo. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/uart_echo/uart_echo.uvopt b/boards/dk-tm4c129x/uart_echo/uart_echo.uvopt new file mode 100644 index 0000000..7e1c9d2 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/uart_echo.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + uart_echo + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\uart_echo.c + uart_echo.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/uart_echo/uart_echo.uvproj b/boards/dk-tm4c129x/uart_echo/uart_echo.uvproj new file mode 100644 index 0000000..70ecbc6 --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/uart_echo.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + uart_echo + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + uart_echo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\uart_echo.bin .\rvmdk\uart_echo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + uart_echo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uart_echo.c + 1 + .\uart_echo.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/uart_echo/uart_echo_ccs.cmd b/boards/dk-tm4c129x/uart_echo/uart_echo_ccs.cmd new file mode 100644 index 0000000..687e69c --- /dev/null +++ b/boards/dk-tm4c129x/uart_echo/uart_echo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * uart_echo_ccs.cmd - CCS linker configuration file for uart_echo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c129x/udma_demo/Makefile b/boards/dk-tm4c129x/udma_demo/Makefile new file mode 100644 index 0000000..d5e1ab9 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the uDMA example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the uDMA example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/udma_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the uDMA example. +# +${COMPILER}/udma_demo.axf: ${COMPILER}/cpu_usage.o +${COMPILER}/udma_demo.axf: ${COMPILER}/frame.o +${COMPILER}/udma_demo.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/udma_demo.axf: ${COMPILER}/pinout.o +${COMPILER}/udma_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/udma_demo.axf: ${COMPILER}/udma_demo.o +${COMPILER}/udma_demo.axf: ${COMPILER}/ustdlib.o +${COMPILER}/udma_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/udma_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/udma_demo.axf: udma_demo.ld +SCATTERgcc_udma_demo=udma_demo.ld +ENTRY_udma_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/udma_demo/ccs/.ccsimportspec b/boards/dk-tm4c129x/udma_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..aea8941 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/udma_demo/ccs/.ccsproject b/boards/dk-tm4c129x/udma_demo/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/udma_demo/ccs/.cproject b/boards/dk-tm4c129x/udma_demo/ccs/.cproject new file mode 100644 index 0000000..1fc0fea --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/udma_demo/ccs/.project b/boards/dk-tm4c129x/udma_demo/ccs/.project new file mode 100644 index 0000000..b96b6fa --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/ccs/.project @@ -0,0 +1,75 @@ + + + udma_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/udma_demo/startup_ccs.c + + + udma_demo.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/udma_demo/udma_demo.c + + + udma_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/udma_demo/udma_demo_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/cpu_usage.c + 1 + SW_ROOT/utils/cpu_usage.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/udma_demo/ccs/Debug/udma_demo.bin b/boards/dk-tm4c129x/udma_demo/ccs/Debug/udma_demo.bin new file mode 100644 index 0000000..5a4d0e2 Binary files /dev/null and b/boards/dk-tm4c129x/udma_demo/ccs/Debug/udma_demo.bin differ diff --git a/boards/dk-tm4c129x/udma_demo/ccs/Debug/udma_demo.out b/boards/dk-tm4c129x/udma_demo/ccs/Debug/udma_demo.out new file mode 100644 index 0000000..861f9b8 Binary files /dev/null and b/boards/dk-tm4c129x/udma_demo/ccs/Debug/udma_demo.out differ diff --git a/boards/dk-tm4c129x/udma_demo/ccs/macros.ini_initial b/boards/dk-tm4c129x/udma_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/udma_demo/ccs/target_config.ccxml b/boards/dk-tm4c129x/udma_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/udma_demo/ewarm/Exe/udma_demo.bin b/boards/dk-tm4c129x/udma_demo/ewarm/Exe/udma_demo.bin new file mode 100644 index 0000000..15c0693 Binary files /dev/null and b/boards/dk-tm4c129x/udma_demo/ewarm/Exe/udma_demo.bin differ diff --git a/boards/dk-tm4c129x/udma_demo/ewarm/Exe/udma_demo.out b/boards/dk-tm4c129x/udma_demo/ewarm/Exe/udma_demo.out new file mode 100644 index 0000000..6a1ef26 Binary files /dev/null and b/boards/dk-tm4c129x/udma_demo/ewarm/Exe/udma_demo.out differ diff --git a/boards/dk-tm4c129x/udma_demo/gcc/udma_demo.axf b/boards/dk-tm4c129x/udma_demo/gcc/udma_demo.axf new file mode 100644 index 0000000..a2f9a0d Binary files /dev/null and b/boards/dk-tm4c129x/udma_demo/gcc/udma_demo.axf differ diff --git a/boards/dk-tm4c129x/udma_demo/gcc/udma_demo.bin b/boards/dk-tm4c129x/udma_demo/gcc/udma_demo.bin new file mode 100644 index 0000000..9ff4e83 Binary files /dev/null and b/boards/dk-tm4c129x/udma_demo/gcc/udma_demo.bin differ diff --git a/boards/dk-tm4c129x/udma_demo/readme.txt b/boards/dk-tm4c129x/udma_demo/readme.txt new file mode 100644 index 0000000..65b5f3d --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/readme.txt @@ -0,0 +1,25 @@ +uDMA + +This example application demonstrates the use of the uDMA controller to +transfer data between memory buffers, and to transfer data to and from a +UART. The test runs for 10 seconds before exiting. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/udma_demo/rvmdk/udma_demo.axf b/boards/dk-tm4c129x/udma_demo/rvmdk/udma_demo.axf new file mode 100644 index 0000000..068386f Binary files /dev/null and b/boards/dk-tm4c129x/udma_demo/rvmdk/udma_demo.axf differ diff --git a/boards/dk-tm4c129x/udma_demo/rvmdk/udma_demo.bin b/boards/dk-tm4c129x/udma_demo/rvmdk/udma_demo.bin new file mode 100644 index 0000000..fe2996c Binary files /dev/null and b/boards/dk-tm4c129x/udma_demo/rvmdk/udma_demo.bin differ diff --git a/boards/dk-tm4c129x/udma_demo/startup_ccs.c b/boards/dk-tm4c129x/udma_demo/startup_ccs.c new file mode 100644 index 0000000..672bdc7 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/startup_ccs.c @@ -0,0 +1,278 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART0IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/udma_demo/startup_ewarm.c b/boards/dk-tm4c129x/udma_demo/startup_ewarm.c new file mode 100644 index 0000000..d0b84b2 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/startup_ewarm.c @@ -0,0 +1,309 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART0IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/udma_demo/startup_gcc.c b/boards/dk-tm4c129x/udma_demo/startup_gcc.c new file mode 100644 index 0000000..e0eaf61 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/startup_gcc.c @@ -0,0 +1,325 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART0IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/udma_demo/startup_rvmdk.S b/boards/dk-tm4c129x/udma_demo/startup_rvmdk.S new file mode 100644 index 0000000..24c63fd --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/startup_rvmdk.S @@ -0,0 +1,334 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN UART0IntHandler + EXTERN uDMAIntHandler + EXTERN uDMAErrorHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UART0IntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD uDMAIntHandler ; uDMA Software Transfer + DCD uDMAErrorHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/udma_demo/udma_demo.c b/boards/dk-tm4c129x/udma_demo/udma_demo.c new file mode 100644 index 0000000..c2293a8 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/udma_demo.c @@ -0,0 +1,924 @@ +//***************************************************************************** +// +// udma_demo.c - uDMA example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_uart.h" +#include "driverlib/gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "utils/cpu_usage.h" +#include "utils/ustdlib.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/frame.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      uDMA (udma_demo)

      +//! +//! This example application demonstrates the use of the uDMA controller to +//! transfer data between memory buffers, and to transfer data to and from a +//! UART. The test runs for 10 seconds before exiting. +// +//***************************************************************************** + + +//***************************************************************************** +// +// The number of SysTick ticks per second used for the SysTick interrupt. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 + +//***************************************************************************** +// +// The size of the memory transfer source and destination buffers (in words). +// +//***************************************************************************** +#define MEM_BUFFER_SIZE 1024 + +//***************************************************************************** +// +// The size of the UART transmit and receive buffers. They do not need to be +// the same size. +// +//***************************************************************************** +#define UART_TXBUF_SIZE 256 +#define UART_RXBUF_SIZE 256 + +//***************************************************************************** +// +// The system clock frequency in Hz. +// +//***************************************************************************** +volatile uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +static tContext g_sContext; + +//***************************************************************************** +// +// The source and destination buffers used for memory transfers. +// +//***************************************************************************** +static uint32_t g_ui32SrcBuf[MEM_BUFFER_SIZE]; +static uint32_t g_ui32DstBuf[MEM_BUFFER_SIZE]; + +//***************************************************************************** +// +// The transmit and receive buffers used for the UART transfers. There is one +// transmit buffer and a pair of recieve ping-pong buffers. +// +//***************************************************************************** +static uint8_t g_ui8TxBuf[UART_TXBUF_SIZE]; +static uint8_t g_ui8RxBufA[UART_RXBUF_SIZE]; +static uint8_t g_ui8RxBufB[UART_RXBUF_SIZE]; + +//***************************************************************************** +// +// The count of uDMA errors. This value is incremented by the uDMA error +// handler. +// +//***************************************************************************** +static volatile uint32_t g_ui32uDMAErrCount = 0; + +//***************************************************************************** +// +// The count of times the uDMA interrupt occurred but the uDMA transfer was not +// complete. This should remain 0. +// +//***************************************************************************** +static volatile uint32_t g_ui32BadISR = 0; + +//***************************************************************************** +// +// The count of UART buffers filled, one for each ping-pong buffer. +// +//***************************************************************************** +static volatile uint32_t g_ui32RxBufACount = 0; +static volatile uint32_t g_ui32RxBufBCount = 0; + +//***************************************************************************** +// +// The count of memory uDMA transfer blocks. This value is incremented by the +// uDMA interrupt handler whenever a memory block transfer is completed. +// +//***************************************************************************** +static volatile uint32_t g_ui32MemXferCount = 0; + +//***************************************************************************** +// +// The CPU usage in percent, in 16.16 fixed point format. +// +//***************************************************************************** +static volatile uint32_t g_ui32CPUUsage; + +//***************************************************************************** +// +// The number of seconds elapsed since the start of the program. This value is +// maintained by the SysTick interrupt handler. +// +//***************************************************************************** +static volatile uint32_t g_ui32Seconds = 0; + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +uint8_t pui8ControlTable[1024]; +#elif defined(ccs) +#pragma DATA_ALIGN(pui8ControlTable, 1024) +uint8_t pui8ControlTable[1024]; +#else +uint8_t pui8ControlTable[1024] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the SysTick timer. This handler will increment a +// seconds counter whenever the appropriate number of ticks has occurred. It +// will also call the CPU usage tick function to find the CPU usage percent. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + static uint32_t ui32TickCount = 0; + + // + // Increment the tick counter. + // + ui32TickCount++; + + // + // If the number of ticks per second has occurred, then increment the + // seconds counter. + // + if(!(ui32TickCount % SYSTICKS_PER_SECOND)) + { + g_ui32Seconds++; + } + + // + // Call the CPU usage tick function. This function will compute the amount + // of cycles used by the CPU since the last call and return the result in + // percent in fixed point 16.16 format. + // + g_ui32CPUUsage = CPUUsageTick(); +} + +//***************************************************************************** +// +// The interrupt handler for uDMA errors. This interrupt will occur if the +// uDMA encounters a bus error while trying to perform a transfer. This +// handler just increments a counter if an error occurs. +// +//***************************************************************************** +void +uDMAErrorHandler(void) +{ + uint32_t ui32Status; + + // + // Check for uDMA error bit + // + ui32Status = ROM_uDMAErrorStatusGet(); + + // + // If there is a uDMA error, then clear the error and increment + // the error counter. + // + if(ui32Status) + { + ROM_uDMAErrorStatusClear(); + g_ui32uDMAErrCount++; + } +} + +//***************************************************************************** +// +// The interrupt handler for uDMA interrupts from the memory channel. This +// interrupt will increment a counter, and then restart another memory +// transfer. +// +//***************************************************************************** +void +uDMAIntHandler(void) +{ + uint32_t ui32Mode; + + // + // Check for the primary control structure to indicate complete. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_SW); + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment the count of completed transfers. + // + g_ui32MemXferCount++; + + // + // Configure it for another transfer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_SW, UDMA_MODE_AUTO, + g_ui32SrcBuf, g_ui32DstBuf, + MEM_BUFFER_SIZE); + + // + // Initiate another transfer. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_SW); + ROM_uDMAChannelRequest(UDMA_CHANNEL_SW); + } + + // + // If the channel is not stopped, then something is wrong. + // + else + { + g_ui32BadISR++; + } +} + +//***************************************************************************** +// +// The interrupt handler for UART0. This interrupt will occur when a DMA +// transfer is complete using the UART0 uDMA channel. It will also be +// triggered if the peripheral signals an error. This interrupt handler will +// switch between receive ping-pong buffers A and B. It will also restart a TX +// uDMA transfer if the prior transfer is complete. This will keep the UART +// running continuously (looping TX data back to RX). +// +//***************************************************************************** +void +UART0IntHandler(void) +{ + uint32_t ui32Status; + uint32_t ui32Mode; + + // + // Read the interrupt status of the UART. + // + ui32Status = ROM_UARTIntStatus(UART0_BASE, 1); + + // + // Clear any pending status, even though there should be none since no UART + // interrupts were enabled. If UART error interrupts were enabled, then + // those interrupts could occur here and should be handled. Since uDMA is + // used for both the RX and TX, then neither of those interrupts should be + // enabled. + // + ROM_UARTIntClear(UART0_BASE, ui32Status); + + // + // Check the DMA control table to see if the ping-pong "A" transfer is + // complete. The "A" transfer uses receive buffer "A", and the primary + // control structure. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT); + + // + // If the primary control structure indicates stop, that means the "A" + // receive buffer is done. The uDMA controller should still be receiving + // data into the "B" buffer. + // + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment a counter to indicate data was received into buffer A. In + // a real application this would be used to signal the main thread that + // data was received so the main thread can process the data. + // + g_ui32RxBufACount++; + + // + // Set up the next transfer for the "A" buffer, using the primary + // control structure. When the ongoing receive into the "B" buffer is + // done, the uDMA controller will switch back to this one. This + // example re-uses buffer A, but a more sophisticated application could + // use a rotating set of buffers to increase the amount of time that + // the main thread has to process the data in the buffer before it is + // reused. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufA, sizeof(g_ui8RxBufA)); + } + + // + // Check the DMA control table to see if the ping-pong "B" transfer is + // complete. The "B" transfer uses receive buffer "B", and the alternate + // control structure. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT); + + // + // If the alternate control structure indicates stop, that means the "B" + // receive buffer is done. The uDMA controller should still be receiving + // data into the "A" buffer. + // + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment a counter to indicate data was received into buffer A. In + // a real application this would be used to signal the main thread that + // data was received so the main thread can process the data. + // + g_ui32RxBufBCount++; + + // + // Set up the next transfer for the "B" buffer, using the alternate + // control structure. When the ongoing receive into the "A" buffer is + // done, the uDMA controller will switch back to this one. This + // example re-uses buffer B, but a more sophisticated application could + // use a rotating set of buffers to increase the amount of time that + // the main thread has to process the data in the buffer before it is + // reused. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufB, sizeof(g_ui8RxBufB)); + } + + // + // If the UART0 DMA TX channel is disabled, that means the TX DMA transfer + // is done. + // + if(!ROM_uDMAChannelIsEnabled(UDMA_CHANNEL_UART0TX)) + { + // + // Start another DMA transfer to UART0 TX. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, g_ui8TxBuf, + (void *)(UART0_BASE + UART_O_DR), + sizeof(g_ui8TxBuf)); + + // + // The uDMA TX channel must be re-enabled. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART0TX); + } +} + +//***************************************************************************** +// +// Initializes the UART0 peripheral and sets up the TX and RX uDMA channels. +// The UART is configured for loopback mode so that any data sent on TX will be +// received on RX. The uDMA channels are configured so that the TX channel +// will copy data from a buffer to the UART TX output. And the uDMA RX channel +// will receive any incoming data into a pair of buffers in ping-pong mode. +// +//***************************************************************************** +void +InitUART0Transfer(void) +{ + uint_fast16_t ui16Idx; + + // + // Fill the TX buffer with a simple data pattern. + // + for(ui16Idx = 0; ui16Idx < UART_TXBUF_SIZE; ui16Idx++) + { + g_ui8TxBuf[ui16Idx] = ui16Idx; + } + + // + // Enable the UART peripheral, and configure it to operate even if the CPU + // is in sleep. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART0); + + // + // Configure the UART communication parameters. + // + ROM_UARTConfigSetExpClk(UART0_BASE, g_ui32SysClock, 115200, + UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | + UART_CONFIG_PAR_NONE); + + // + // Set both the TX and RX trigger thresholds to 4. This will be used by + // the uDMA controller to signal when more data should be transferred. The + // uDMA TX and RX channels will be configured so that it can transfer 4 + // bytes in a burst when the UART is ready to transfer more data. + // + ROM_UARTFIFOLevelSet(UART0_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8); + + // + // Enable the UART for operation, and enable the uDMA interface for both TX + // and RX channels. + // + ROM_UARTEnable(UART0_BASE); + ROM_UARTDMAEnable(UART0_BASE, UART_DMA_RX | UART_DMA_TX); + + // + // This register write will set the UART to operate in loopback mode. Any + // data sent on the TX output will be received on the RX input. + // + HWREG(UART0_BASE + UART_O_CTL) |= UART_CTL_LBE; + + // + // Put the attributes in a known state for the uDMA UART0RX channel. These + // should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0RX, + UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + + // + // Configure the control parameters for the primary control structure for + // the UART RX channel. The primary contol structure is used for the "A" + // part of the ping-pong receive. The transfer data size is 8 bits, the + // source address does not increment since it will be reading from a + // register. The destination address increment is byte 8-bit bytes. The + // arbitration size is set to 4 to match the RX FIFO trigger threshold. + // The uDMA controller will use a 4 byte burst transfer if possible. This + // will be somewhat more effecient that single byte transfers. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | + UDMA_ARB_4); + + // + // Configure the control parameters for the alternate control structure for + // the UART RX channel. The alternate contol structure is used for the "B" + // part of the ping-pong receive. The configuration is identical to the + // primary/A control structure. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | + UDMA_ARB_4); + + // + // Set up the transfer parameters for the UART RX primary control + // structure. The mode is set to ping-pong, the transfer source is the + // UART data register, and the destination is the receive "A" buffer. The + // transfer size is set to match the size of the buffer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufA, sizeof(g_ui8RxBufA)); + + // + // Set up the transfer parameters for the UART RX alternate control + // structure. The mode is set to ping-pong, the transfer source is the + // UART data register, and the destination is the receive "B" buffer. The + // transfer size is set to match the size of the buffer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufB, sizeof(g_ui8RxBufB)); + + // + // Put the attributes in a known state for the uDMA UART0TX channel. These + // should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0TX, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + + // + // Set the USEBURST attribute for the uDMA UART TX channel. This will + // force the controller to always use a burst when transferring data from + // the TX buffer to the UART. This is somewhat more effecient bus usage + // than the default which allows single or burst transfers. + // + ROM_uDMAChannelAttributeEnable(UDMA_CHANNEL_UART0TX, UDMA_ATTR_USEBURST); + + // + // Configure the control parameters for the UART TX. The uDMA UART TX + // channel is used to transfer a block of data from a buffer to the UART. + // The data size is 8 bits. The source address increment is 8-bit bytes + // since the data is coming from a buffer. The destination increment is + // none since the data is to be written to the UART data register. The + // arbitration size is set to 4, which matches the UART TX FIFO trigger + // threshold. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_8 | + UDMA_DST_INC_NONE | + UDMA_ARB_4); + + // + // Set up the transfer parameters for the uDMA UART TX channel. This will + // configure the transfer source and destination and the transfer size. + // Basic mode is used because the peripheral is making the uDMA transfer + // request. The source is the TX buffer and the destination is the UART + // data register. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, g_ui8TxBuf, + (void *)(UART0_BASE + UART_O_DR), + sizeof(g_ui8TxBuf)); + + // + // Now both the uDMA UART TX and RX channels are primed to start a + // transfer. As soon as the channels are enabled, the peripheral will + // issue a transfer request and the data transfers will begin. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART0RX); + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART0TX); + + // + // Enable the UART DMA TX/RX interrupts. + // + ROM_UARTIntEnable(UART0_BASE, UART_INT_DMATX | UART_INT_DMATX); + + // + // Enable the UART peripheral interrupts. + // + ROM_IntEnable(INT_UART0); +} + +//***************************************************************************** +// +// Initializes the uDMA software channel to perform a memory to memory uDMA +// transfer. +// +//***************************************************************************** +void +InitSWTransfer(void) +{ + uint_fast16_t ui16Idx; + + // + // Fill the source memory buffer with a simple incrementing pattern. + // + for(ui16Idx = 0; ui16Idx < MEM_BUFFER_SIZE; ui16Idx++) + { + g_ui32SrcBuf[ui16Idx] = ui16Idx; + } + + // + // Enable interrupts from the uDMA software channel. + // + ROM_IntEnable(INT_UDMA); + + // + // Put the attributes in a known state for the uDMA software channel. + // These should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_SW, + UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT | + (UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK)); + + // + // Configure the control parameters for the SW channel. The SW channel + // will be used to transfer between two memory buffers, 32 bits at a time. + // Therefore the data size is 32 bits, and the address increment is 32 bits + // for both source and destination. The arbitration size will be set to 8, + // which causes the uDMA controller to rearbitrate after 8 items are + // transferred. This keeps this channel from hogging the uDMA controller + // once the transfer is started, and allows other channels cycles if they + // are higher priority. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_SW | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | UDMA_DST_INC_32 | + UDMA_ARB_8); + + // + // Set up the transfer parameters for the software channel. This will + // configure the transfer buffers and the transfer size. Auto mode must be + // used for software transfers. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_SW | UDMA_PRI_SELECT, + UDMA_MODE_AUTO, g_ui32SrcBuf, g_ui32DstBuf, + MEM_BUFFER_SIZE); + + // + // Now the software channel is primed to start a transfer. The channel + // must be enabled. For software based transfers, a request must be + // issued. After this, the uDMA memory transfer begins. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_SW); + ROM_uDMAChannelRequest(UDMA_CHANNEL_SW); +} + +//***************************************************************************** +// +// This example demonstrates how to use the uDMA controller to transfer data +// between memory buffers and to and from a peripheral, in this case a UART. +// The uDMA controller is configured to repeatedly transfer a block of data +// from one memory buffer to another. It is also set up to repeatedly copy a +// block of data from a buffer to the UART output. The UART data is looped +// back so the same data is received, and the uDMA controlled is configured to +// continuously receive the UART data using ping-pong buffers. +// +// The processor is put to sleep when it is not doing anything, and this allows +// collection of CPU usage data to see how much CPU is being used while the +// data transfers are ongoing. +// +//***************************************************************************** +int +main(void) +{ + static uint32_t ui32PrevSeconds; + static uint32_t ui32PrevXferCount; + static uint32_t ui32PrevUARTCount = 0; + static char pcStrBuf[40]; + uint32_t ui32CenterX; + uint32_t ui32XfersCompleted; + uint32_t ui32BytesTransferred; + + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "udma-demo"); + + // + // Enable peripherals to operate when CPU is in sleep. + // + ROM_SysCtlPeripheralClockGating(true); + + // + // Get the center X coordinate of the screen, since it is used a lot. + // + ui32CenterX = GrContextDpyWidthGet(&g_sContext) / 2; + + // + // Show the clock frequency on the display. + // + GrContextFontSet(&g_sContext, g_psFontCmss18b); + usnprintf(pcStrBuf, sizeof(pcStrBuf), "TM4C129X @ %u MHz", + g_ui32SysClock / 1000000); + GrStringDrawCentered(&g_sContext, pcStrBuf, -1, ui32CenterX, 40, 0); + + // + // Show static text and field labels on the display. + // + GrContextFontSet(&g_sContext, g_psFontCmss18b); + GrStringDrawCentered(&g_sContext, "uDMA Mem Transfers", -1, + ui32CenterX, 70, 0); + GrStringDrawCentered(&g_sContext, "uDMA UART Transfers", -1, + ui32CenterX, 124, 0); + + // + // Configure SysTick to occur 100 times per second, to use as a time + // reference. Enable SysTick to generate interrupts. + // + ROM_SysTickPeriodSet(g_ui32SysClock / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Initialize the CPU usage measurement routine. + // + CPUUsageInit(g_ui32SysClock, SYSTICKS_PER_SECOND, 2); + + // + // Enable the uDMA controller at the system level. Enable it to continue + // to run while the processor is in sleep. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UDMA); + + // + // Enable the uDMA controller error interrupt. This interrupt will occur + // if there is a bus error during a transfer. + // + ROM_IntEnable(INT_UDMAERR); + + // + // Enable the uDMA controller. + // + ROM_uDMAEnable(); + + // + // Point at the control table to use for channel control structures. + // + ROM_uDMAControlBaseSet(pui8ControlTable); + + // + // Initialize the uDMA memory to memory transfers. + // + InitSWTransfer(); + + // + // Initialize the uDMA UART transfers. + // + InitUART0Transfer(); + + // + // Remember the current SysTick seconds count. + // + ui32PrevSeconds = g_ui32Seconds; + + // + // Remember the current count of memory buffer transfers. + // + ui32PrevXferCount = g_ui32MemXferCount; + + // + // Loop until 10 seconds have passed. The processor is put to sleep + // in this loop so that CPU utilization can be measured. + // + while(1) + { + // + // Check to see if one second has elapsed. If so, the make some + // updates. + // + if(g_ui32Seconds != ui32PrevSeconds) + { + // + // Print a message to the display showing the CPU usage percent. + // The fractional part of the percent value is ignored. + // + GrContextFontSet(&g_sContext, g_psFontCmss18b); + usnprintf(pcStrBuf, sizeof(pcStrBuf), "CPU utilization %2u%%", + g_ui32CPUUsage >> 16); + GrStringDrawCentered(&g_sContext, pcStrBuf, -1, + ui32CenterX, 180, 1); + + // + // Tell the user how many seconds we have to go before ending. + // + usnprintf(pcStrBuf, sizeof(pcStrBuf), " Test ends in %d seconds ", + 10 - g_ui32Seconds); + GrStringDrawCentered(&g_sContext, pcStrBuf, -1, + ui32CenterX, 220, 1); + + // + // Remember the new seconds count. + // + ui32PrevSeconds = g_ui32Seconds; + + // + // Calculate how many memory transfers have occurred since the last + // second. + // + ui32XfersCompleted = g_ui32MemXferCount - ui32PrevXferCount; + + // + // Remember the new transfer count. + // + ui32PrevXferCount = g_ui32MemXferCount; + + // + // Compute how many bytes were transferred in the memory transfer + // since the last second. + // + ui32BytesTransferred = ui32XfersCompleted * MEM_BUFFER_SIZE * 4; + + // + // Print a message to the display showing the memory transfer rate. + // + GrContextFontSet(&g_sContext, g_psFontCmss16b); + usnprintf(pcStrBuf, sizeof(pcStrBuf), " %8u Bytes/Sec ", + ui32BytesTransferred); + GrStringDrawCentered(&g_sContext, pcStrBuf, -1, + ui32CenterX, 94, 1); + + // + // Calculate how many UART transfers have occurred since the last + // second. This expression is split to prevent a compiler warning + // about undefined order of volatile accesses. + // + ui32XfersCompleted = g_ui32RxBufACount; + ui32XfersCompleted += g_ui32RxBufBCount - ui32PrevUARTCount; + + // + // Remember the new UART transfer count. This expression is split + // to prevent a compiler warning about undefined order of volatile + // accesses. + // + ui32PrevUARTCount = g_ui32RxBufACount; + ui32PrevUARTCount += g_ui32RxBufBCount; + + // + // Compute how many bytes were transferred by the UART. The number + // of bytes received is multiplied by 2 so that the TX bytes + // transferred are also accounted for. + // + ui32BytesTransferred = ui32XfersCompleted * UART_RXBUF_SIZE * 2; + + // + // Print a message to the display showing the UART transfer rate. + // + usnprintf(pcStrBuf, sizeof(pcStrBuf), " %8u Bytes/Sec ", + ui32BytesTransferred); + GrStringDrawCentered(&g_sContext, pcStrBuf, -1, + ui32CenterX, 146, 1); + } + + // + // Put the processor to sleep if there is nothing to do. This allows + // the CPU usage routine to measure the number of free CPU cycles. + // If the processor is sleeping a lot, it can be hard to connect to + // the target with the debugger. + // + ROM_SysCtlSleep(); + + // + // See if we have run long enough and exit the loop if so. + // + if(g_ui32Seconds >= 10) + { + break; + } + } + + // + // Indicate on the display that the example is stopped. + // + GrContextFontSet(&g_sContext, g_psFontCmss18b); + GrContextForegroundSet(&g_sContext, ClrRed); + GrStringDrawCentered(&g_sContext, " Stopped ", -1, + ui32CenterX, 220, 1); + + // + // Disable uDMA and UART interrupts now that the test is complete. + // + ROM_IntDisable(INT_UART0); + ROM_IntDisable(INT_UDMA); + + // + // Loop forever with the CPU not sleeping, so the debugger can connect. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/udma_demo/udma_demo.ewd b/boards/dk-tm4c129x/udma_demo/udma_demo.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/udma_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/udma_demo/udma_demo.ewp b/boards/dk-tm4c129x/udma_demo/udma_demo.ewp new file mode 100644 index 0000000..7b9507d --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/udma_demo.ewp @@ -0,0 +1,804 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\..\..\..\utils\cpu_usage.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\udma_demo.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/udma_demo/udma_demo.icf b/boards/dk-tm4c129x/udma_demo/udma_demo.icf new file mode 100644 index 0000000..486555b --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/udma_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// udma_demo.icf - Linker configuration file for udma_demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/udma_demo/udma_demo.ld b/boards/dk-tm4c129x/udma_demo/udma_demo.ld new file mode 100644 index 0000000..20affeb --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/udma_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * udma_demo.ld - Linker configuration file for udma_demo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/udma_demo/udma_demo.sct b/boards/dk-tm4c129x/udma_demo/udma_demo.sct new file mode 100644 index 0000000..3d7f9bf --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/udma_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; udma_demo.sct - Linker configuration file for udma_demo. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/udma_demo/udma_demo.uvopt b/boards/dk-tm4c129x/udma_demo/udma_demo.uvopt new file mode 100644 index 0000000..4b76900 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/udma_demo.uvopt @@ -0,0 +1,373 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + udma_demo + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\cpu_usage.c + cpu_usage.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\udma_demo.c + udma_demo.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 10 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/udma_demo/udma_demo.uvproj b/boards/dk-tm4c129x/udma_demo/udma_demo.uvproj new file mode 100644 index 0000000..557a037 --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/udma_demo.uvproj @@ -0,0 +1,454 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + udma_demo + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + udma_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\udma_demo.bin .\rvmdk\udma_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + udma_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cpu_usage.c + 1 + ..\..\..\..\utils\cpu_usage.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + udma_demo.c + 1 + .\udma_demo.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/udma_demo/udma_demo_ccs.cmd b/boards/dk-tm4c129x/udma_demo/udma_demo_ccs.cmd new file mode 100644 index 0000000..ad8cc9b --- /dev/null +++ b/boards/dk-tm4c129x/udma_demo/udma_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * udma_demo_ccs.cmd - CCS linker configuration file for udma_demo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/usb_dev_bulk/Makefile b/boards/dk-tm4c129x/usb_dev_bulk/Makefile new file mode 100644 index 0000000..3fcb90d --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/Makefile @@ -0,0 +1,94 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device bulk example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device bulk example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_bulk.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device bulk example. +# +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/frame.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/usb_bulk_structs.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/usb_dev_bulk.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_dev_bulk.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_bulk.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_bulk.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_bulk.axf: usb_dev_bulk.ld +SCATTERgcc_usb_dev_bulk=usb_dev_bulk.ld +ENTRY_usb_dev_bulk=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_dev_bulk/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_dev_bulk/ccs/.ccsimportspec new file mode 100644 index 0000000..6c9f4a0 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_bulk/ccs/.ccsproject b/boards/dk-tm4c129x/usb_dev_bulk/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_bulk/ccs/.cproject b/boards/dk-tm4c129x/usb_dev_bulk/ccs/.cproject new file mode 100644 index 0000000..8c2c9d0 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/ccs/.cproject @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_bulk/ccs/.project b/boards/dk-tm4c129x/usb_dev_bulk/ccs/.project new file mode 100644 index 0000000..8995056 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/ccs/.project @@ -0,0 +1,80 @@ + + + usb_dev_bulk + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_bulk/startup_ccs.c + + + usb_bulk_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_bulk/usb_bulk_structs.c + + + usb_dev_bulk.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.c + + + usb_dev_bulk_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin b/boards/dk-tm4c129x/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin new file mode 100644 index 0000000..55d54b0 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out b/boards/dk-tm4c129x/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out new file mode 100644 index 0000000..ee22e4e Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out differ diff --git a/boards/dk-tm4c129x/usb_dev_bulk/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_dev_bulk/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_dev_bulk/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_dev_bulk/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin b/boards/dk-tm4c129x/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin new file mode 100644 index 0000000..7f80d3d Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out b/boards/dk-tm4c129x/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out new file mode 100644 index 0000000..14f8f8b Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out differ diff --git a/boards/dk-tm4c129x/usb_dev_bulk/gcc/usb_dev_bulk.axf b/boards/dk-tm4c129x/usb_dev_bulk/gcc/usb_dev_bulk.axf new file mode 100644 index 0000000..0ac7241 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_bulk/gcc/usb_dev_bulk.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_bulk/gcc/usb_dev_bulk.bin b/boards/dk-tm4c129x/usb_dev_bulk/gcc/usb_dev_bulk.bin new file mode 100644 index 0000000..179ebab Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_bulk/gcc/usb_dev_bulk.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_bulk/readme.txt b/boards/dk-tm4c129x/usb_dev_bulk/readme.txt new file mode 100644 index 0000000..351243c --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/readme.txt @@ -0,0 +1,43 @@ +USB Generic Bulk Device + +This example provides a generic USB device offering simple bulk data +transfer to and from the host. The device uses a vendor-specific class ID +and supports a single bulk IN endpoint and a single bulk OUT endpoint. +Data received from the host is assumed to be ASCII text and it is +echoed back with the case of all alphabetic characters swapped. + +A Windows INF file for the device is provided on the installation media and +in the C:/ti/TivaWare-C-Series-X.X/windows_drivers directory of TivaWare +releases. This INF contains information required to install the WinUSB +subsystem on WindowsXP and Vista PCs. WinUSB is a Windows subsystem +allowing user mode applications to access the USB device without the need +for a vendor-specific kernel mode driver. + +A sample Windows command-line application, usb_bulk_example, illustrating +how to connect to and communicate with the bulk device is also provided. +The application binary is installed as part of the ``Windows-side examples +for USB kits'' package (SW-USB-win) on the installation CD or via download +from http://www.ti.com/tivaware . Project files are included to allow +the examples to be built using Microsoft Visual Studio 2008. Source code +for this application can be found in directory +ti/TivaWare-for-C-Series/tools/usb_bulk_example. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_dev_bulk/rvmdk/usb_dev_bulk.axf b/boards/dk-tm4c129x/usb_dev_bulk/rvmdk/usb_dev_bulk.axf new file mode 100644 index 0000000..807c85e Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_bulk/rvmdk/usb_dev_bulk.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_bulk/rvmdk/usb_dev_bulk.bin b/boards/dk-tm4c129x/usb_dev_bulk/rvmdk/usb_dev_bulk.bin new file mode 100644 index 0000000..f9d9b2f Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_bulk/rvmdk/usb_dev_bulk.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_bulk/startup_ccs.c b/boards/dk-tm4c129x/usb_dev_bulk/startup_ccs.c new file mode 100644 index 0000000..511f849 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_bulk/startup_ewarm.c b/boards/dk-tm4c129x/usb_dev_bulk/startup_ewarm.c new file mode 100644 index 0000000..a2a01fe --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_bulk/startup_gcc.c b/boards/dk-tm4c129x/usb_dev_bulk/startup_gcc.c new file mode 100644 index 0000000..a514361 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_bulk/startup_rvmdk.S b/boards/dk-tm4c129x/usb_dev_bulk/startup_rvmdk.S new file mode 100644 index 0000000..e2bf0c1 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN UARTStdioIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTStdioIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_dev_bulk/usb_bulk_structs.c b/boards/dk-tm4c129x/usb_dev_bulk/usb_bulk_structs.c new file mode 100644 index 0000000..fac11df --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/usb_bulk_structs.c @@ -0,0 +1,199 @@ +//***************************************************************************** +// +// usb_bulk_structs.c - Data structures defining this bulk USB device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdbulk.h" +#include "usb_bulk_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'G', 0, 'e', 0, 'n', 0, 'e', 0, 'r', 0, 'i', 0, 'c', 0, ' ', 0, 'B', 0, + 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, + 'e', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The data interface description string. +// +//***************************************************************************** +const uint8_t g_pui8DataInterfaceString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, + 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (23 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, 'i', 0, 'g', 0, + 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t *const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8DataInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The bulk device initialization and customization structures. In this case, +// we are using USBBuffers between the bulk device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the bulk channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our bulk instance structure. +// +//***************************************************************************** +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; + +tUSBDBulkDevice g_sBulkDevice = +{ + USB_VID_TI_1CBE, + USB_PID_BULK, + 500, + USB_CONF_ATTR_SELF_PWR, + USBBufferEventCallback, + (void *)&g_sRxBuffer, + USBBufferEventCallback, + (void *)&g_sTxBuffer, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; + +//***************************************************************************** +// +// Receive buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBRxBuffer[BULK_BUFFER_SIZE]; +uint8_t g_pui8RxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sRxBuffer = +{ + false, // This is a receive buffer. + RxHandler, // pfnCallback + (void *)&g_sBulkDevice, // Callback data is our device pointer. + USBDBulkPacketRead, // pfnTransfer + USBDBulkRxPacketAvailable, // pfnAvailable + (void *)&g_sBulkDevice, // pvHandle + g_pui8USBRxBuffer, // pi8Buffer + BULK_BUFFER_SIZE, // ui32BufferSize + g_pui8RxBufferWorkspace // pvWorkspace +}; + +//***************************************************************************** +// +// Transmit buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBTxBuffer[BULK_BUFFER_SIZE]; +uint8_t g_pui8TxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sTxBuffer = +{ + true, // This is a transmit buffer. + TxHandler, // pfnCallback + (void *)&g_sBulkDevice, // Callback data is our device pointer. + USBDBulkPacketWrite, // pfnTransfer + USBDBulkTxPacketAvailable, // pfnAvailable + (void *)&g_sBulkDevice, // pvHandle + g_pui8USBTxBuffer, // pi8Buffer + BULK_BUFFER_SIZE, // ui32BufferSize + g_pui8TxBufferWorkspace // pvWorkspace +}; diff --git a/boards/dk-tm4c129x/usb_dev_bulk/usb_bulk_structs.h b/boards/dk-tm4c129x/usb_dev_bulk/usb_bulk_structs.h new file mode 100644 index 0000000..3249890 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/usb_bulk_structs.h @@ -0,0 +1,48 @@ +//***************************************************************************** +// +// usb_bulk_structs.h - Data structures defining this bulk USB device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_BULK_STRUCTS_H_ +#define _USB_BULK_STRUCTS_H_ + +//***************************************************************************** +// +// The size of the transmit and receive buffers used. 256 is chosen pretty +// much at random though the buffer should be at least twice the size of +// a maximum-sized USB packet. +// +//***************************************************************************** +#define BULK_BUFFER_SIZE 256 + +extern uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +extern uint32_t TxHandler(void *pvi32CBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; +extern tUSBDBulkDevice g_sBulkDevice; +extern uint8_t g_pui8USBTxBuffer[]; +extern uint8_t g_pui8USBRxBuffer[]; + +#endif diff --git a/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.c b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.c new file mode 100644 index 0000000..3c08376 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.c @@ -0,0 +1,655 @@ +//***************************************************************************** +// +// usb_dev_bulk.c - Main routines for the generic bulk device example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdbulk.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "usb_bulk_structs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Generic Bulk Device (usb_dev_bulk)

      +//! +//! This example provides a generic USB device offering simple bulk data +//! transfer to and from the host. The device uses a vendor-specific class ID +//! and supports a single bulk IN endpoint and a single bulk OUT endpoint. +//! Data received from the host is assumed to be ASCII text and it is +//! echoed back with the case of all alphabetic characters swapped. +//! +//! A Windows INF file for the device is provided on the installation media and +//! in the C:/ti/TivaWare-C-Series-X.X/windows_drivers directory of TivaWare +//! releases. This INF contains information required to install the WinUSB +//! subsystem on WindowsXP and Vista PCs. WinUSB is a Windows subsystem +//! allowing user mode applications to access the USB device without the need +//! for a vendor-specific kernel mode driver. +//! +//! A sample Windows command-line application, usb_bulk_example, illustrating +//! how to connect to and communicate with the bulk device is also provided. +//! The application binary is installed as part of the ``Windows-side examples +//! for USB kits'' package (SW-USB-win) on the installation CD or via download +//! from http://www.ti.com/tivaware . Project files are included to allow +//! the examples to be built using Microsoft Visual Studio 2008. Source code +//! for this application can be found in directory +//! ti/TivaWare-for-C-Series/tools/usb_bulk_example. +// +//***************************************************************************** + + +//***************************************************************************** +// +// The system tick rate expressed both as ticks per second and a millisecond +// period. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 +#define SYSTICK_PERIOD_MS (1000 / SYSTICKS_PER_SECOND) + +//***************************************************************************** +// +// The global system tick counter. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount = 0; + +//***************************************************************************** +// +// Variables tracking transmit and receive counts. +// +//***************************************************************************** +volatile uint32_t g_ui32TxCount = 0; +volatile uint32_t g_ui32RxCount = 0; +#ifdef DEBUG +uint32_t g_ui32UARTRxErrors = 0; +#endif + +//***************************************************************************** +// +// Debug-related definitions and declarations. +// +// Debug output is available via UART0 if DEBUG is defined during build. +// +//***************************************************************************** +#ifdef DEBUG +//***************************************************************************** +// +// Map all debug print calls to UARTprintf in debug builds. +// +//***************************************************************************** +#define DEBUG_PRINT UARTprintf + +#else + +//***************************************************************************** +// +// Compile out all debug print calls in release builds. +// +//***************************************************************************** +#define DEBUG_PRINT while(0) ((int32_t (*)(char *, ...))0) +#endif + +//***************************************************************************** +// +// Graphics context used to show text on the color LCD display. +// +//***************************************************************************** +tContext g_sContext; +#define TEXT_FONT g_psFontCmss18b + +//***************************************************************************** +// +// Flags used to pass commands from interrupt context to the main loop. +// +//***************************************************************************** +#define COMMAND_PACKET_RECEIVED 0x00000001 +#define COMMAND_STATUS_UPDATE 0x00000002 + +volatile uint32_t g_ui32Flags = 0; +char *g_pcStatus; + +//***************************************************************************** +// +// Global flag indicating that a USB configuration has been set. +// +//***************************************************************************** +static volatile bool g_bUSBConfigured = false; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + UARTprintf("Error at line %d of %s\n", ui32Line, pcFilename); + while(1) + { + } +} +#endif + +//***************************************************************************** +// +// Interrupt handler for the system tick counter. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Update our system tick counter. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// Receive new data and echo it back to the host. +// +// \param psDevice points to the instance data for the device whose data is to +// be processed. +// \param pi8Data points to the newly received data in the USB receive buffer. +// \param ui32NumBytes is the number of bytes of data available to be processed. +// +// This function is called whenever we receive a notification that data is +// available from the host. We read the data, byte-by-byte and swap the case +// of any alphabetical characters found then write it back out to be +// transmitted back to the host. +// +// \return Returns the number of bytes of data processed. +// +//***************************************************************************** +static uint32_t +EchoNewDataToHost(tUSBDBulkDevice *psDevice, uint8_t *pi8Data, + uint_fast32_t ui32NumBytes) +{ + uint_fast32_t ui32Loop, ui32Space, ui32Count; + uint_fast32_t ui32ReadIndex; + uint_fast32_t ui32WriteIndex; + tUSBRingBufObject sTxRing; + + // + // Get the current buffer information to allow us to write directly to + // the transmit buffer (we already have enough information from the + // parameters to access the receive buffer directly). + // + USBBufferInfoGet(&g_sTxBuffer, &sTxRing); + + // + // How much space is there in the transmit buffer? + // + ui32Space = USBBufferSpaceAvailable(&g_sTxBuffer); + + // + // How many characters can we process this time round? + // + ui32Loop = (ui32Space < ui32NumBytes) ? ui32Space : ui32NumBytes; + ui32Count = ui32Loop; + + // + // Update our receive counter. + // + g_ui32RxCount += ui32NumBytes; + + // + // Dump a debug message. + // + DEBUG_PRINT("Received %d bytes\n", ui32NumBytes); + + // + // Set up to process the characters by directly accessing the USB buffers. + // + ui32ReadIndex = (uint32_t)(pi8Data - g_pui8USBRxBuffer); + ui32WriteIndex = sTxRing.ui32WriteIndex; + + while(ui32Loop) + { + // + // Copy from the receive buffer to the transmit buffer converting + // character case on the way. + // + + // + // Is this a lower case character? + // + if((g_pui8USBRxBuffer[ui32ReadIndex] >= 'a') && + (g_pui8USBRxBuffer[ui32ReadIndex] <= 'z')) + { + // + // Convert to upper case and write to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + (g_pui8USBRxBuffer[ui32ReadIndex] - 'a') + 'A'; + } + else + { + // + // Is this an upper case character? + // + if((g_pui8USBRxBuffer[ui32ReadIndex] >= 'A') && + (g_pui8USBRxBuffer[ui32ReadIndex] <= 'Z')) + { + // + // Convert to lower case and write to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + (g_pui8USBRxBuffer[ui32ReadIndex] - 'Z') + 'z'; + } + else + { + // + // Copy the received character to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + g_pui8USBRxBuffer[ui32ReadIndex]; + } + } + + // + // Move to the next character taking care to adjust the pointer for + // the buffer wrap if necessary. + // + ui32WriteIndex++; + ui32WriteIndex = + (ui32WriteIndex == BULK_BUFFER_SIZE) ? 0 : ui32WriteIndex; + + ui32ReadIndex++; + ui32ReadIndex = (ui32ReadIndex == BULK_BUFFER_SIZE) ? 0 : ui32ReadIndex; + + ui32Loop--; + } + + // + // We've processed the data in place so now send the processed data + // back to the host. + // + USBBufferDataWritten(&g_sTxBuffer, ui32Count); + + DEBUG_PRINT("Wrote %d bytes\n", ui32Count); + + // + // We processed as much data as we can directly from the receive buffer so + // we need to return the number of bytes to allow the lower layer to + // update its read pointer appropriately. + // + return(ui32Count); +} + +//***************************************************************************** +// +// Shows the status string on the display. +// +// \param psContext is a pointer to the graphics context representing the +// display. +// \param pi8Status is a pointer to the string to be shown. +// +//***************************************************************************** +void +DisplayStatus(tContext *psContext, char *pcStatus) +{ + tRectangle sRectLine; + int32_t i32Y; + + // + // Calculate the Y coordinate of the top left of the character cell + // for our line of text. + // + i32Y = (GrContextDpyHeightGet(psContext) / 4) - + (GrFontHeightGet(TEXT_FONT) / 2); + + // + // Determine the bounding rectangle for this line of text. We add 4 pixels + // to the height just to ensure that we clear a couple of pixels above and + // below the line of text. + // + sRectLine.i16XMin = 0; + sRectLine.i16XMax = GrContextDpyWidthGet(psContext) - 1; + sRectLine.i16YMin = i32Y; + sRectLine.i16YMax = i32Y + GrFontHeightGet(TEXT_FONT) + 3; + + // + // Clear the line with black. + // + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(psContext, &sRectLine); + + // + // Draw the new status string + // + DEBUG_PRINT("%s\n", pcStatus); + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(psContext, pcStatus, -1, + GrContextDpyWidthGet(psContext) / 2, + GrContextDpyHeightGet(psContext) / 4 , false); +} + +//***************************************************************************** +// +// Handles bulk driver notifications related to the transmit channel (data to +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ulEvent identifies the event we are being notified about. +// \param ulMsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // We are not required to do anything in response to any transmit event + // in this example. All we do is update our transmit counter. + // + if(ui32Event == USB_EVENT_TX_COMPLETE) + { + g_ui32TxCount += ui32MsgValue; + } + + // + // Dump a debug message. + // + DEBUG_PRINT("TX complete %d\n", ui32MsgValue); + + return(0); +} + +//***************************************************************************** +// +// Handles bulk driver notifications related to the receive channel (data from +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event are we being sent? + // + switch(ui32Event) + { + // + // We are connected to a host and communication is now possible. + // + case USB_EVENT_CONNECTED: + { + g_bUSBConfigured = true; + g_pcStatus = "Host connected."; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + + // + // Flush our buffers. + // + USBBufferFlush(&g_sTxBuffer); + USBBufferFlush(&g_sRxBuffer); + + break; + } + + // + // The host has disconnected. + // + case USB_EVENT_DISCONNECTED: + { + g_bUSBConfigured = false; + g_pcStatus = "Host disconnected."; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + break; + } + + // + // A new packet has been received. + // + case USB_EVENT_RX_AVAILABLE: + { + tUSBDBulkDevice *psDevice; + + // + // Get a pointer to our instance data from the callback data + // parameter. + // + psDevice = (tUSBDBulkDevice *)pvCBData; + + // + // Read the new packet and echo it back to the host. + // + return(EchoNewDataToHost(psDevice, pvMsgData, ui32MsgValue)); + } + + // + // Ignore SUSPEND and RESUME for now. + // + case USB_EVENT_SUSPEND: + case USB_EVENT_RESUME: + break; + + // + // Ignore all other events and return 0. + // + default: + break; + } + + return(0); +} + +//***************************************************************************** +// +// This is the main application entry function. +// +//***************************************************************************** +int +main(void) +{ + uint_fast32_t ui32TxCount; + uint_fast32_t ui32RxCount; + char pcBuffer[16]; + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-dev-bulk"); + +#ifdef DEBUG + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, ui32SysClock); +#endif + + // + // Not configured initially. + // + g_bUSBConfigured = false; + + // + // Show the various static text elements on the color STN display. + // + GrContextFontSet(&g_sContext, TEXT_FONT); + GrStringDraw(&g_sContext, "Tx bytes:", -1, 110, 100, false); + GrStringDraw(&g_sContext, "Rx bytes:", -1, 110, 130, false); + + // + // Enable the system tick. + // + ROM_SysTickPeriodSet(ui32SysClock / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Show the application name on the display and UART output. + // + DEBUG_PRINT("\nTiva C Series USB bulk device example\n"); + DEBUG_PRINT("---------------------------------\n\n"); + + // + // Tell the user what we are up to. + // + DisplayStatus(&g_sContext, " Configuring USB... "); + + // + // Initialize the transmit and receive buffers. + // + USBBufferInit(&g_sTxBuffer); + USBBufferInit(&g_sRxBuffer); + + // + // Initialize the USB stack for device mode. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Pass our device information to the USB library and place the device + // on the bus. + // + USBDBulkInit(0, &g_sBulkDevice); + + // + // Wait for initial configuration to complete. + // + DisplayStatus(&g_sContext, "Waiting for host..."); + + // + // Clear our local byte counters. + // + ui32RxCount = 0; + ui32TxCount = 0; + + // + // Main application loop. + // + while(1) + { + + // + // Have we been asked to update the status display? + // + if(g_ui32Flags & COMMAND_STATUS_UPDATE) + { + // + // Clear the command flag + // + g_ui32Flags &= ~COMMAND_STATUS_UPDATE; + DisplayStatus(&g_sContext, g_pcStatus); + } + + // + // Has there been any transmit traffic since we last checked? + // + if(ui32TxCount != g_ui32TxCount) + { + // + // Take a snapshot of the latest transmit count. + // + ui32TxCount = g_ui32TxCount; + + // + // Update the display of bytes transmitted by the UART. + // + usnprintf(pcBuffer, 16, " %d ", ui32TxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 190, 100, true); + } + + // + // Has there been any receive traffic since we last checked? + // + if(ui32RxCount != g_ui32RxCount) + { + // + // Take a snapshot of the latest receive count. + // + ui32RxCount = g_ui32RxCount; + + // + // Update the display of bytes received by the UART. + // + usnprintf(pcBuffer, 16, " %d ", ui32RxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 190, 130, true); + } + } +} diff --git a/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ewd b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ewp b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ewp new file mode 100644 index 0000000..41dce5d --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ewp @@ -0,0 +1,811 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_bulk_structs.c + + + $PROJ_DIR$\usb_dev_bulk.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.icf b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.icf new file mode 100644 index 0000000..4097f05 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_bulk.icf - Linker configuration file for usb_dev_bulk. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ld b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ld new file mode 100644 index 0000000..3694939 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_bulk.ld - Linker configuration file for usb_dev_bulk. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.sct b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.sct new file mode 100644 index 0000000..8b0f720 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_bulk.sct - Linker configuration file for usb_dev_bulk. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.uvopt b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.uvopt new file mode 100644 index 0000000..dda4eee --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.uvopt @@ -0,0 +1,401 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_bulk + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_bulk_structs.c + usb_bulk_structs.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_bulk.c + usb_dev_bulk.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 12 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.uvproj b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.uvproj new file mode 100644 index 0000000..4e0d7e4 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk.uvproj @@ -0,0 +1,464 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_bulk + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_bulk + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_bulk.bin .\rvmdk\usb_dev_bulk.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_bulk.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_bulk_structs.c + 1 + .\usb_bulk_structs.c + + + usb_dev_bulk.c + 1 + .\usb_dev_bulk.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk_ccs.cmd b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk_ccs.cmd new file mode 100644 index 0000000..f0821ed --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_bulk/usb_dev_bulk_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_bulk_ccs.cmd - CCS linker configuration file for usb_dev_bulk. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/usb_dev_chid/Makefile b/boards/dk-tm4c129x/usb_dev_chid/Makefile new file mode 100644 index 0000000..35b1455 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/Makefile @@ -0,0 +1,96 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB composite device keyboard mouse example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB composite device keyboard mouse example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_chid.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB composite device keyboard mouse example. +# +${COMPILER}/usb_dev_chid.axf: ${COMPILER}/frame.o +${COMPILER}/usb_dev_chid.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_dev_chid.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_dev_chid.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_chid.axf: ${COMPILER}/touch.o +${COMPILER}/usb_dev_chid.axf: ${COMPILER}/ui.o +${COMPILER}/usb_dev_chid.axf: ${COMPILER}/usb_dev_chid.o +${COMPILER}/usb_dev_chid.axf: ${COMPILER}/usb_keyboard.o +${COMPILER}/usb_dev_chid.axf: ${COMPILER}/usb_mouse.o +${COMPILER}/usb_dev_chid.axf: ${COMPILER}/usb_structs.o +${COMPILER}/usb_dev_chid.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_chid.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_chid.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_chid.axf: usb_dev_chid.ld +SCATTERgcc_usb_dev_chid=usb_dev_chid.ld +ENTRY_usb_dev_chid=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_dev_chid/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_dev_chid/ccs/.ccsimportspec new file mode 100644 index 0000000..ad87d37 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/ccs/.ccsimportspec @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_chid/ccs/.ccsproject b/boards/dk-tm4c129x/usb_dev_chid/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_chid/ccs/.cproject b/boards/dk-tm4c129x/usb_dev_chid/ccs/.cproject new file mode 100644 index 0000000..c5939e5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/ccs/.cproject @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_chid/ccs/.project b/boards/dk-tm4c129x/usb_dev_chid/ccs/.project new file mode 100644 index 0000000..ff9589b --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/ccs/.project @@ -0,0 +1,90 @@ + + + usb_dev_chid + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_chid/startup_ccs.c + + + ui.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_chid/ui.c + + + usb_dev_chid.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.c + + + usb_dev_chid_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid_ccs.cmd + + + usb_keyboard.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_chid/usb_keyboard.c + + + usb_mouse.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_chid/usb_mouse.c + + + usb_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_chid/usb_structs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_dev_chid/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_dev_chid/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_dev_chid/ccs/Debug/usb_dev_chid.bin b/boards/dk-tm4c129x/usb_dev_chid/ccs/Debug/usb_dev_chid.bin new file mode 100644 index 0000000..1afab23 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_chid/ccs/Debug/usb_dev_chid.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_chid/ccs/Debug/usb_dev_chid.out b/boards/dk-tm4c129x/usb_dev_chid/ccs/Debug/usb_dev_chid.out new file mode 100644 index 0000000..f7f89a6 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_chid/ccs/Debug/usb_dev_chid.out differ diff --git a/boards/dk-tm4c129x/usb_dev_chid/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_dev_chid/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_dev_chid/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_dev_chid/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_chid/ewarm/Exe/usb_dev_chid.bin b/boards/dk-tm4c129x/usb_dev_chid/ewarm/Exe/usb_dev_chid.bin new file mode 100644 index 0000000..e81065d Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_chid/ewarm/Exe/usb_dev_chid.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_chid/ewarm/Exe/usb_dev_chid.out b/boards/dk-tm4c129x/usb_dev_chid/ewarm/Exe/usb_dev_chid.out new file mode 100644 index 0000000..59834a2 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_chid/ewarm/Exe/usb_dev_chid.out differ diff --git a/boards/dk-tm4c129x/usb_dev_chid/gcc/usb_dev_chid.axf b/boards/dk-tm4c129x/usb_dev_chid/gcc/usb_dev_chid.axf new file mode 100644 index 0000000..45ac7d9 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_chid/gcc/usb_dev_chid.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_chid/gcc/usb_dev_chid.bin b/boards/dk-tm4c129x/usb_dev_chid/gcc/usb_dev_chid.bin new file mode 100644 index 0000000..2adbee4 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_chid/gcc/usb_dev_chid.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_chid/readme.txt b/boards/dk-tm4c129x/usb_dev_chid/readme.txt new file mode 100644 index 0000000..1360d27 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/readme.txt @@ -0,0 +1,31 @@ +USB Composite HID Keyboard Mouse Device + +This example application turns the evaluation board into a composite USB +keyboard and mouse example using the Human Interface Device class. The +color LCD displays a blank area which acts as a mouse touchpad. The button +on the bottom of the screen acts as a toggle between keyboard and mouse +mode. Pressing it toggles the screen to keyboard mode and allows keys +to be sent to the USB host. The board status LED is used to indicate the +current Caps Lock state and is updated in response to pressing the ``Caps'' +key on the virtual keyboard or any other keyboard attached to the same USB +host system. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_dev_chid/rvmdk/usb_dev_chid.axf b/boards/dk-tm4c129x/usb_dev_chid/rvmdk/usb_dev_chid.axf new file mode 100644 index 0000000..9513e58 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_chid/rvmdk/usb_dev_chid.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_chid/rvmdk/usb_dev_chid.bin b/boards/dk-tm4c129x/usb_dev_chid/rvmdk/usb_dev_chid.bin new file mode 100644 index 0000000..dd96634 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_chid/rvmdk/usb_dev_chid.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_chid/startup_ccs.c b/boards/dk-tm4c129x/usb_dev_chid/startup_ccs.c new file mode 100644 index 0000000..df1d903 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_chid/startup_ewarm.c b/boards/dk-tm4c129x/usb_dev_chid/startup_ewarm.c new file mode 100644 index 0000000..cab0d61 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_chid/startup_gcc.c b/boards/dk-tm4c129x/usb_dev_chid/startup_gcc.c new file mode 100644 index 0000000..3967484 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_chid/startup_rvmdk.S b/boards/dk-tm4c129x/usb_dev_chid/startup_rvmdk.S new file mode 100644 index 0000000..aa300ff --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SysTickIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_dev_chid/ui.c b/boards/dk-tm4c129x/usb_dev_chid/ui.c new file mode 100644 index 0000000..688b6a1 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/ui.c @@ -0,0 +1,718 @@ +//***************************************************************************** +// +// ui.c - User interface code for the USB composite HID keyboard/mouse example. +// This file seperates out the USB library accesses and the general hardware +// access and solely handles the user interface. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/keyboard.h" +#include "grlib/pushbutton.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "ui.h" + +//***************************************************************************** +// +// Global graphics context. +// +//***************************************************************************** +static tContext g_sContext; + +static void ToggleMode(tWidget *psWidget); +static void Status1(tWidget *psWidget); +static void Status2(tWidget *psWidget); +static void Status3(tWidget *psWidget); + +//***************************************************************************** +// +// Defines for the basic screen area used by the application. +// +//***************************************************************************** +#define STATUS_HEIGHT 40 +#define BG_MIN_X 7 +#define BG_MAX_X (320 - 8) +#define BG_MIN_Y 24 +#define BG_MAX_Y (240 - 8) +#define BUTTON_HEIGHT (STATUS_HEIGHT - 8) +#define BG_COLOR_SETTINGS ClrGray +#define BG_COLOR_MAIN ClrBlack + +//***************************************************************************** +// +// The global UI state. +// +//***************************************************************************** +static struct +{ + uint32_t ui32Indicators; +} +g_sUIState; + +//***************************************************************************** +// +// The defined values used with ui32Indicators. +// +//***************************************************************************** +#define UI_STATUS_MS_RIGHT 0x00000001 +#define UI_STATUS_MS_MIDDLE 0x00000002 +#define UI_STATUS_MS_LEFT 0x00000004 + +#define UI_STATUS_KEY_CAPS 0x00000001 +#define UI_STATUS_KEY_SCROLL 0x00000002 +#define UI_STATUS_KEY_NUM 0x00000004 + +#define UI_STATUS_UPDATE 0x80000000 +#define UI_STATUS_KEYBOARD 0x00000008 +#define UI_STATUS_MOUSE 0x00000000 + +//***************************************************************************** +// +// The graphical widgets that are used by this example. +// +//***************************************************************************** +extern tCanvasWidget g_sBackground; +extern tCanvasWidget g_sStatusPanel; + +// +// The keyboard widget used by the application. +// +Keyboard(g_sKeyboard, &g_sBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, BG_MIN_X + 2, BG_MIN_Y + 4, 300, 160, + KEYBOARD_STYLE_FILL | KEYBOARD_STYLE_AUTO_REPEAT | + KEYBOARD_STYLE_PRESS_NOTIFY | KEYBOARD_STYLE_RELEASE_NOTIFY | + KEYBOARD_STYLE_BG, + ClrBlack, ClrGray, ClrDarkGray, ClrGray, ClrBlack, g_psFontCmtt14, + 100, 100, NUM_KEYBOARD_US_ENGLISH, g_psKeyboardUSEnglish, UIKeyEvent); + +// +// The full background for the application. +// +Canvas(g_sBackground, WIDGET_ROOT, 0, &g_sStatusPanel, + &g_sKentec320x240x16_SSD2119, BG_MIN_X, BG_MIN_Y, + BG_MAX_X - BG_MIN_X, BG_MAX_Y - BG_MIN_Y - STATUS_HEIGHT, + CANVAS_STYLE_FILL, ClrBlack, ClrWhite, ClrWhite, 0, 0, 0 ,0 ); + + +// +// Right button in mouse mode and Num Lock in keyboard mode. +// +RectangularButton(g_sStatus3, &g_sStatusPanel, 0, 0, + &g_sKentec320x240x16_SSD2119, BG_MIN_X + 250, + BG_MAX_Y - STATUS_HEIGHT + 4, 50, BUTTON_HEIGHT, + PB_STYLE_FILL | PB_STYLE_TEXT | + PB_STYLE_RELEASE_NOTIFY, ClrLightGrey, ClrDarkGray, 0, + ClrBlack, g_psFontCmss16, "Right", 0, 0, 0 ,0 , Status3); + +// +// Middle button in mouse mode and Scroll Lock in keyboard mode. +// +RectangularButton(g_sStatus2, &g_sStatusPanel, &g_sStatus3, 0, + &g_sKentec320x240x16_SSD2119, BG_MIN_X + 196, + BG_MAX_Y - STATUS_HEIGHT + 4, 50, BUTTON_HEIGHT, + PB_STYLE_FILL | PB_STYLE_TEXT | + PB_STYLE_RELEASE_NOTIFY, ClrLightGrey, ClrDarkGray, 0, + ClrBlack, g_psFontCmss16, "Middle", 0, 0, 0 ,0 , Status2); + +// +// Left button in mouse mode and Caps Lock in keyboard mode. +// +RectangularButton(g_sStatus1, &g_sStatusPanel, &g_sStatus2, 0, + &g_sKentec320x240x16_SSD2119, BG_MIN_X + 142, + BG_MAX_Y - STATUS_HEIGHT + 4, 50, BUTTON_HEIGHT, + PB_STYLE_FILL | PB_STYLE_TEXT | + PB_STYLE_RELEASE_NOTIFY, ClrLightGrey, ClrDarkGray, 0, + ClrBlack, g_psFontCmss16, "Left", 0, 0, 0 ,0 , Status1); + +// +// The mode toggle button. +// +RectangularButton(g_sToggle, &g_sStatusPanel, &g_sStatus1, 0, + &g_sKentec320x240x16_SSD2119, BG_MIN_X + 4, + BG_MAX_Y - STATUS_HEIGHT + 4, 80, BUTTON_HEIGHT, + PB_STYLE_FILL | PB_STYLE_TEXT | PB_STYLE_RELEASE_NOTIFY, ClrLightGrey, + ClrDarkGray, 0, ClrBlack, g_psFontCmss16, "Mouse", 0, 0, 0 ,0 , + ToggleMode); + +// +// Background of the status area behind the buttons. +// +Canvas(g_sStatusPanel, &g_sBackground, 0, &g_sToggle, + &g_sKentec320x240x16_SSD2119, BG_MIN_X, BG_MAX_Y - STATUS_HEIGHT, + BG_MAX_X - BG_MIN_X, STATUS_HEIGHT, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT_RIGHT | + CANVAS_STYLE_TEXT_TOP, ClrGray, ClrWhite, ClrBlack, 0, + 0, 0, 0); + +tUIState g_eState; + +//**************************************************************************** +// +// This is the callback from the graphical keyboard that is defined above as +// g_sKeyboard global. +// +//**************************************************************************** +void +UIKeyEvent(tWidget *psWidget, uint32_t ui32Key, uint32_t ui32Event) +{ + if(ui32Event == KEYBOARD_EVENT_PRESS) + { + USBKeyboardUpdate(0, ui32Key, true); + + } + else if(ui32Event == KEYBOARD_EVENT_RELEASE) + { + USBKeyboardUpdate(0, ui32Key, false); + } +} + +//**************************************************************************** +// +// Handles updating the Caps Lock status when in keyboard mode. +// +//**************************************************************************** +void +UIUpdateCapsLock(void) +{ + if(g_sUIState.ui32Indicators & UI_STATUS_KEY_CAPS) + { + PushButtonTextSet(&g_sStatus1, "CAPS"); + PushButtonTextColorSet(&g_sStatus1, ClrRed); + } + else + { + PushButtonTextSet(&g_sStatus1, "caps"); + PushButtonTextColorSet(&g_sStatus1, ClrBlack); + } + + WidgetPaint((tWidget *)&g_sStatus1); +} + +void +UICapsLock(bool bEnable) +{ + if(bEnable) + { + // + // Enable caps lock. + // + g_sUIState.ui32Indicators |= UI_STATUS_KEY_CAPS; + } + else + { + // + // Disable caps lock. + // + g_sUIState.ui32Indicators &= ~UI_STATUS_KEY_CAPS; + } + + if(g_sUIState.ui32Indicators & UI_STATUS_KEYBOARD) + { + UIUpdateCapsLock(); + } +} + +//**************************************************************************** +// +// Handles updating the Scroll Lock status when in keyboard mode. +// +//**************************************************************************** +void +UIUpdateScrollLock(void) +{ + if(g_sUIState.ui32Indicators & UI_STATUS_KEY_SCROLL) + { + PushButtonTextSet(&g_sStatus2, "SCROLL"); + PushButtonTextColorSet(&g_sStatus2, ClrRed); + } + else + { + PushButtonTextSet(&g_sStatus2, "scroll"); + PushButtonTextColorSet(&g_sStatus2, ClrBlack); + } + + WidgetPaint((tWidget *)&g_sStatus2); +} + +void +UIScrollLock(bool bEnable) +{ + if(bEnable) + { + // + // Enable caps lock. + // + g_sUIState.ui32Indicators |= UI_STATUS_KEY_SCROLL; + } + else + { + // + // Disable caps lock. + // + g_sUIState.ui32Indicators &= ~UI_STATUS_KEY_SCROLL; + } + + if(g_sUIState.ui32Indicators & UI_STATUS_KEYBOARD) + { + UIUpdateScrollLock(); + } +} + +//**************************************************************************** +// +// Handles updating the Num Lock status when in keyboard mode. +// +//**************************************************************************** +void +UIUpdateNumLock(void) +{ + if(g_sUIState.ui32Indicators & UI_STATUS_KEY_NUM) + { + PushButtonTextSet(&g_sStatus3, "NUM"); + PushButtonTextColorSet(&g_sStatus3, ClrRed); + } + else + { + PushButtonTextSet(&g_sStatus3, "num"); + PushButtonTextColorSet(&g_sStatus3, ClrBlack); + } + + WidgetPaint((tWidget *)&g_sStatus3); +} + +void +UINumLock(bool bEnable) +{ + if(bEnable) + { + // + // Enable caps lock. + // + g_sUIState.ui32Indicators |= UI_STATUS_KEY_NUM; + } + else + { + // + // Disable caps lock. + // + g_sUIState.ui32Indicators &= ~UI_STATUS_KEY_NUM; + } + + if(g_sUIState.ui32Indicators & UI_STATUS_KEYBOARD) + { + UIUpdateNumLock(); + } +} + +//**************************************************************************** +// +// Handles updates to the current status. +// +//**************************************************************************** +void +UIUpdateStatus(uint32_t ui32Indicators) +{ + if(g_eState == UI_NOT_CONNECTED) + { + PushButtonTextSet(&g_sToggle, "---"); + + PushButtonTextColorSet(&g_sStatus1, ClrBlack); + PushButtonTextSet(&g_sStatus1, "---"); + + PushButtonTextColorSet(&g_sStatus2, ClrBlack); + PushButtonTextSet(&g_sStatus2, "---"); + + PushButtonTextColorSet(&g_sStatus3, ClrBlack); + PushButtonTextSet(&g_sStatus3, "---"); + + if(ui32Indicators & UI_STATUS_KEYBOARD) + { + WidgetRemove((tWidget *)&g_sKeyboard); + } + + WidgetPaint((tWidget *)&g_sBackground); + + return; + } + + // + // See if there is a change to update. + // + if(ui32Indicators == g_sUIState.ui32Indicators) + { + return; + } + + // + // Was there a global change in the keyboard/mouse state. + // + if(((ui32Indicators ^ g_sUIState.ui32Indicators) & UI_STATUS_KEYBOARD) || + (ui32Indicators & UI_STATUS_UPDATE)) + { + // + // Update to keyboard mode or mouse mode for the UI. + // + if(ui32Indicators & UI_STATUS_KEYBOARD) + { + PushButtonTextSet(&g_sToggle, "Keyboard"); + WidgetPaint((tWidget *)&g_sToggle); + UIUpdateCapsLock(); + UIUpdateScrollLock(); + UIUpdateNumLock(); + + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sKeyboard); + + WidgetPaint((tWidget *)&g_sKeyboard); + } + else + { + // + // Switch back to a mouse UI. + // + PushButtonTextSet(&g_sToggle, "Mouse"); + + PushButtonTextColorSet(&g_sStatus1, ClrBlack); + PushButtonTextSet(&g_sStatus1, "Left"); + + PushButtonTextColorSet(&g_sStatus2, ClrBlack); + PushButtonTextSet(&g_sStatus2, "Middle"); + + PushButtonTextColorSet(&g_sStatus3, ClrBlack); + PushButtonTextSet(&g_sStatus3, "Right"); + + WidgetRemove((tWidget *)&g_sKeyboard); + + WidgetPaint((tWidget *)&g_sBackground); + } + } + + // + // Update the new state of the indicators. + // + g_sUIState.ui32Indicators = ui32Indicators & ~UI_STATUS_UPDATE; +} + + +//**************************************************************************** +// +// Called by the mode toggle button in the g_sToggle variable. +// +//**************************************************************************** +static void +ToggleMode(tWidget *psWidget) +{ + if(g_eState == UI_CONNECTED) + { + UIUpdateStatus(g_sUIState.ui32Indicators ^ UI_STATUS_KEYBOARD); + } +} + +void +UIMode(tUIState eState) +{ + if(g_eState != UI_CONNECTED) + { + if(eState == UI_CONNECTED) + { + UIUpdateStatus(g_sUIState.ui32Indicators | UI_STATUS_UPDATE); + } + } + else if(g_eState == UI_CONNECTED) + { + if(eState == UI_NOT_CONNECTED) + { + UIUpdateStatus(g_sUIState.ui32Indicators & ~UI_STATUS_UPDATE); + } + } + + g_eState = eState; + UIUpdateStatus(g_sUIState.ui32Indicators); +} + +//**************************************************************************** +// +// Called by the button code controlled by the g_sStatus1 variable. +// +//**************************************************************************** +static void +Status1(tWidget *psWidget) +{ + if(g_eState == UI_CONNECTED) + { + // + // Toggle the state of the first status button. + // + if(g_sUIState.ui32Indicators & UI_STATUS_KEYBOARD) + { + // + // Toggle the state of the caps lock. + // + g_sUIState.ui32Indicators ^= UI_STATUS_KEY_CAPS; + + UIUpdateCapsLock(); + + USBKeyboardUpdate(0, UI_CAPS_LOCK, true); + } + else + { + USBMouseUpdate(0, 0, 0x01); + } + } +} + +//**************************************************************************** +// +// Called by the button code controlled by the g_sStatus2 variable. +// +//**************************************************************************** +static void +Status2(tWidget *psWidget) +{ + if(g_eState == UI_CONNECTED) + { + // + // Toggle the state of the first status button. + // + if(g_sUIState.ui32Indicators & UI_STATUS_KEYBOARD) + { + // + // Toggle the state of the caps lock. + // + g_sUIState.ui32Indicators ^= UI_STATUS_KEY_SCROLL; + + UIUpdateScrollLock(); + + USBKeyboardUpdate(0, UI_SCROLL_LOCK, true); + } + else + { + USBMouseUpdate(0, 0, 0x04); + } + } +} + +//**************************************************************************** +// +// Called by the button code controlled by the g_sStatus3 variable. +// +//**************************************************************************** +static void +Status3(tWidget *psWidget) +{ + if(g_eState == UI_CONNECTED) + { + // + // Toggle the state of the first status button. + // + if(g_sUIState.ui32Indicators & UI_STATUS_KEYBOARD) + { + // + // Toggle the state of the caps lock. + // + g_sUIState.ui32Indicators ^= UI_STATUS_KEY_NUM; + + UIUpdateNumLock(); + USBKeyboardUpdate(0, UI_NUM_LOCK, true); + } + else + { + USBMouseUpdate(0, 0, 0x02); + } + } +} + +static struct +{ + int32_t i32XLast; + int32_t i32YLast; + int8_t i8Buttons; + bool bPressed; +} +sMouseState; + +volatile uint32_t ui32PressCount; + +//***************************************************************************** +// +// The callback function that is called by the touch screen driver to indicate +// activity on the touch screen. +// +//***************************************************************************** +int32_t +UITouchCallback(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + int32_t i32XDiff, i32YDiff; + + if(((g_sUIState.ui32Indicators & UI_STATUS_KEYBOARD) == 0) && + ((i32Y > BG_MIN_Y) && (i32Y < (BG_MAX_Y - STATUS_HEIGHT)))) + { + + switch(ui32Message) + { + // + // . + // + case WIDGET_MSG_PTR_DOWN: + { + sMouseState.i32XLast = i32X; + sMouseState.i32YLast = i32Y; + + sMouseState.bPressed = true; + + ui32PressCount = g_ui32SysTickCount; + break; + } + + + // The touchscreen is no longer being pressed. + // + case WIDGET_MSG_PTR_UP: + { + sMouseState.bPressed = false; + + if(ui32PressCount > g_ui32SysTickCount) + { + ui32PressCount = ui32PressCount - g_ui32SysTickCount; + } + else + { + ui32PressCount = g_ui32SysTickCount - ui32PressCount; + } + + if(ui32PressCount < 20) + { + // + // Ensure that all buttons are not pressed. + // + sMouseState.i8Buttons = 0x01; + } + else + { + // + // Ensure that all buttons are not pressed. + // + sMouseState.i8Buttons = 0x00; + } + + // + // Send the report back to the host. + // + USBMouseUpdate(0, 0, sMouseState.i8Buttons); + + break; + } + + // + // The touch position has moved. + // + case WIDGET_MSG_PTR_MOVE: + { + // + // Send the difference not the absolute value. + // + i32XDiff = i32X - sMouseState.i32XLast; + i32YDiff = i32Y - sMouseState.i32YLast; + + // + // Send the report back to the host. + // + USBMouseUpdate(i32XDiff, i32YDiff, 0); + + // + // Save these values to calculate the next move. + // + sMouseState.i32XLast = i32X; + sMouseState.i32YLast = i32Y; + + break; + } + default: + { + break; + } + } + } + else + { + WidgetPointerMessage(ui32Message, i32X, i32Y); + } + + return(0); +} + + +//**************************************************************************** +// +// Application calls this once to initialize the UI. +// +//**************************************************************************** +void +UIInit(void) +{ + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-dev-chid"); + + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sBackground); + WidgetPaint((tWidget *)&g_sBackground); + + // + // Initially not connected. + // + g_eState = UI_NOT_CONNECTED; + + // + // Not initialized. + // + UIUpdateStatus(UI_STATUS_UPDATE); + +} + +//**************************************************************************** +// +// Application should periodically call this function. +// +//**************************************************************************** +void +UIMain(void) +{ + WidgetMessageQueueProcess(); + + if(g_sUIState.ui32Indicators & UI_STATUS_KEYBOARD) + { + + } + else + { + USBMouseMain(); + } +} diff --git a/boards/dk-tm4c129x/usb_dev_chid/ui.h b/boards/dk-tm4c129x/usb_dev_chid/ui.h new file mode 100644 index 0000000..c8bf2ad --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/ui.h @@ -0,0 +1,85 @@ +//***************************************************************************** +// +// ui.c - User interface code for the USB composite HID keyboard/mouse example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __UI_H__ +#define __UI_H__ + +//***************************************************************************** +// +// The three special lock keys. +// +//***************************************************************************** +#define UI_CAPS_LOCK 0x00000001 +#define UI_SCROLL_LOCK 0x00000002 +#define UI_NUM_LOCK 0x00000003 + +//***************************************************************************** +// +// The state of the UI in terms of USB. +// +//***************************************************************************** +typedef enum +{ + UI_CONNECTED, + UI_NOT_CONNECTED, + UI_SUSPENDED +} +tUIState; + +extern volatile uint32_t g_ui32SysTickCount; + +//***************************************************************************** +// +// UI function prototypes. +// +//***************************************************************************** +void UIKeyEvent(tWidget *psWidget, uint32_t ui32Key, uint32_t ui32Event); +void UIInit(void); +void UIMain(void); +void UICapsLock(bool bEnable); +void UIScrollLock(bool bEnable); +void UINumLock(bool bEnable); +void UIMode(tUIState eState); +int32_t UITouchCallback(uint32_t ui32Message, int32_t i32X, int32_t i32Y); + +//***************************************************************************** +// +// USB mouse function prototypes. +// +//***************************************************************************** +void USBMouseInit(void); +void USBMouseMain(void); +void USBMouseUpdate(int32_t i32X, int32_t i32Y, uint8_t ui8Buttons); + +//***************************************************************************** +// +// USB keyboard prototypes. +// +//***************************************************************************** +void USBKeyboardInit(void); +void USBKeyboardMain(void); +void USBKeyboardUpdate(uint8_t ui8Modifiers, uint8_t ui8UsageCode, + bool bPressed); + +#endif diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.c b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.c new file mode 100644 index 0000000..8402f8a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.c @@ -0,0 +1,209 @@ + //***************************************************************************** +// +// usb_dev_chid.c - Main routines for the composite keyboard mouse example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcomp.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidmouse.h" +#include "usblib/device/usbdhidkeyb.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" +#include "usb_structs.h" +#include "ui.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Composite HID Keyboard Mouse Device (usb_dev_chid)

      +//! +//! This example application turns the evaluation board into a composite USB +//! keyboard and mouse example using the Human Interface Device class. The +//! color LCD displays a blank area which acts as a mouse touchpad. The button +//! on the bottom of the screen acts as a toggle between keyboard and mouse +//! mode. Pressing it toggles the screen to keyboard mode and allows keys +//! to be sent to the USB host. The board status LED is used to indicate the +//! current Caps Lock state and is updated in response to pressing the ``Caps'' +//! key on the virtual keyboard or any other keyboard attached to the same USB +//! host system. +// +//***************************************************************************** + +//***************************************************************************** +// +// The system tick timer period. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 + +//***************************************************************************** +// +// The current system tick count. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount; + +//***************************************************************************** +// +// This is the interrupt handler for the SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// Handles all of the generic USB events. +// +//***************************************************************************** +uint32_t +USBEventHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgParam, + void *pvMsgData) +{ + // + // Infor the UI code of the state change. + // + if(ui32Event == USB_EVENT_CONNECTED) + { + UIMode(UI_CONNECTED); + } + else if(ui32Event == USB_EVENT_DISCONNECTED) + { + UIMode(UI_NOT_CONNECTED); + } + else if(ui32Event == USB_EVENT_SUSPEND) + { + UIMode(UI_SUSPENDED); + } + else if(ui32Event == USB_EVENT_RESUME) + { + UIMode(UI_CONNECTED); + } + return(0); +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(UITouchCallback); + + // + // Set the system tick to fire 100 times per second. + // + ROM_SysTickPeriodSet(ui32SysClock / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Initialize the USB stack for device mode. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Initialize the USB keyboard interface. + // + USBKeyboardInit(); + + // + // Initialize the USB mouse interface. + // + USBMouseInit(); + + // + // Call the composite device initialization for both the mouse and + // keyboard. + // + USBDHIDMouseCompositeInit(0, &g_sMouseDevice, &g_psCompDevices[0]); + USBDHIDKeyboardCompositeInit(0, &g_sKeyboardDevice, &g_psCompDevices[1]); + + // + // Pass the device information to the USB library and place the device + // on the bus. + // + USBDCompositeInit(0, &g_sCompDevice, DESCRIPTOR_DATA_SIZE, + g_pui8DescriptorData); + + // + // Initialize the user interface. + // + UIInit(); + + while(1) + { + // + // Run the main loop for the user interface. + // + UIMain(); + } +} diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ewd b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ewp b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ewp new file mode 100644 index 0000000..aafa6e9 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ewp @@ -0,0 +1,817 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\ui.c + + + $PROJ_DIR$\usb_dev_chid.c + + + $PROJ_DIR$\usb_keyboard.c + + + $PROJ_DIR$\usb_mouse.c + + + $PROJ_DIR$\usb_structs.c + + + diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.icf b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.icf new file mode 100644 index 0000000..336ada8 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_chid.icf - Linker configuration file for usb_dev_chid. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ld b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ld new file mode 100644 index 0000000..ce8769b --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_chid.ld - Linker configuration file for usb_dev_chid. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.sct b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.sct new file mode 100644 index 0000000..dacce46 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_chid.sct - Linker configuration file for usb_dev_chid. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.uvopt b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.uvopt new file mode 100644 index 0000000..fe47128 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.uvopt @@ -0,0 +1,429 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_chid + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\ui.c + ui.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_chid.c + usb_dev_chid.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_keyboard.c + usb_keyboard.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_mouse.c + usb_mouse.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_structs.c + usb_structs.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 12 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 14 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.uvproj b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.uvproj new file mode 100644 index 0000000..2dd784b --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid.uvproj @@ -0,0 +1,474 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_chid + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_chid + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_chid.bin .\rvmdk\usb_dev_chid.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_chid.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + ui.c + 1 + .\ui.c + + + usb_dev_chid.c + 1 + .\usb_dev_chid.c + + + usb_keyboard.c + 1 + .\usb_keyboard.c + + + usb_mouse.c + 1 + .\usb_mouse.c + + + usb_structs.c + 1 + .\usb_structs.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid_ccs.cmd b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid_ccs.cmd new file mode 100644 index 0000000..87c55e3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_dev_chid_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_chid_ccs.cmd - CCS linker configuration file for usb_dev_chid. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_keyboard.c b/boards/dk-tm4c129x/usb_dev_chid/usb_keyboard.c new file mode 100644 index 0000000..bb8bf46 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_keyboard.c @@ -0,0 +1,314 @@ +//***************************************************************************** +// +// usb_dev_keyboard.c - Main routines for the keyboard portion of the composite +// device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/gpio.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/keyboard.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcomp.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidmouse.h" +#include "usblib/device/usbdhidkeyb.h" +#include "usb_structs.h" +#include "ui.h" + +//**************************************************************************** +// +// Global USB keyboard state. +// +//**************************************************************************** +struct +{ + // + // Holds a pending special key press for the Caps Lock, Scroll Lock, or + // Num Lock keys. + // + uint8_t ui8Special; +} +g_sKeyboardState; + +//**************************************************************************** +// +// The look up table entries for usage codes. +// +//**************************************************************************** +typedef struct +{ + char cChar; + char cUsage; +} +sUsageEntry; + +//**************************************************************************** +// +// The un-shifted HID usage codes used by the graphical keyboard. +// +//**************************************************************************** +static const sUsageEntry g_pcUsageCodes[] = +{ + {'q', HID_KEYB_USAGE_Q}, {'w', HID_KEYB_USAGE_W}, + {'e', HID_KEYB_USAGE_E}, {'r', HID_KEYB_USAGE_R}, + {'t', HID_KEYB_USAGE_T}, {'y', HID_KEYB_USAGE_Y}, + {'u', HID_KEYB_USAGE_U}, {'i', HID_KEYB_USAGE_I}, + {'o', HID_KEYB_USAGE_O}, {'p', HID_KEYB_USAGE_P}, + {'a', HID_KEYB_USAGE_A}, {'s', HID_KEYB_USAGE_S}, + {'d', HID_KEYB_USAGE_D}, {'f', HID_KEYB_USAGE_F}, + {'g', HID_KEYB_USAGE_G}, {'h', HID_KEYB_USAGE_H}, + {'j', HID_KEYB_USAGE_J}, {'k', HID_KEYB_USAGE_K}, + {'l', HID_KEYB_USAGE_L}, {'z', HID_KEYB_USAGE_Z}, + {'x', HID_KEYB_USAGE_X}, {'c', HID_KEYB_USAGE_C}, + {'v', HID_KEYB_USAGE_V}, {'b', HID_KEYB_USAGE_B}, + {'n', HID_KEYB_USAGE_N}, {'m', HID_KEYB_USAGE_M}, + {'0', HID_KEYB_USAGE_0}, {'1', HID_KEYB_USAGE_1}, + {'2', HID_KEYB_USAGE_2}, {'3', HID_KEYB_USAGE_3}, + {'4', HID_KEYB_USAGE_4}, {'5', HID_KEYB_USAGE_5}, + {'6', HID_KEYB_USAGE_6}, {'7', HID_KEYB_USAGE_7}, + {'8', HID_KEYB_USAGE_8}, {'9', HID_KEYB_USAGE_9}, + {'-', HID_KEYB_USAGE_MINUS}, {'=', HID_KEYB_USAGE_EQUAL}, + {'\'', HID_KEYB_USAGE_FQUOTE}, {'[', HID_KEYB_USAGE_LBRACKET}, + {']', HID_KEYB_USAGE_RBRACKET}, {';', HID_KEYB_USAGE_SEMICOLON}, + {' ', HID_KEYB_USAGE_SPACE}, {'/', HID_KEYB_USAGE_FSLASH}, + {'\\', HID_KEYB_USAGE_BSLASH}, {'.', HID_KEYB_USAGE_PERIOD}, + {',', HID_KEYB_USAGE_COMMA}, + {UI_CAPS_LOCK, HID_KEYB_USAGE_CAPSLOCK}, + {UI_SCROLL_LOCK, HID_KEYB_USAGE_SCROLLOCK}, + {UI_NUM_LOCK, HID_KEYB_USAGE_NUMLOCK}, + {UNICODE_BACKSPACE, HID_KEYB_USAGE_BACKSPACE}, + {UNICODE_RETURN, HID_KEYB_USAGE_ENTER}, +}; + +static const uint32_t ui32NumUsageCodes = + sizeof(g_pcUsageCodes)/sizeof(sUsageEntry); + +//**************************************************************************** +// +// The shifted HID usage codes that are used by the graphical keyboard. +// +//**************************************************************************** +static const sUsageEntry g_pcUsageCodesShift[] = +{ + {')', HID_KEYB_USAGE_0}, {'!', HID_KEYB_USAGE_1}, + {'@', HID_KEYB_USAGE_2}, {'#', HID_KEYB_USAGE_3}, + {'$', HID_KEYB_USAGE_4}, {'%', HID_KEYB_USAGE_5}, + {'^', HID_KEYB_USAGE_6}, {'&', HID_KEYB_USAGE_7}, + {'*', HID_KEYB_USAGE_8}, {'(', HID_KEYB_USAGE_9}, + {'?', HID_KEYB_USAGE_FSLASH}, {'+', HID_KEYB_USAGE_EQUAL}, + {':', HID_KEYB_USAGE_SEMICOLON}, {'_', HID_KEYB_USAGE_MINUS}, + {'~', HID_KEYB_USAGE_BQUOTE}, {'|', HID_KEYB_USAGE_BSLASH}, + {'\"', HID_KEYB_USAGE_FQUOTE}, +}; + +static const uint32_t ui32NumUsageCodesShift = + sizeof(g_pcUsageCodes)/sizeof(sUsageEntry); + +//**************************************************************************** +// +// Handle basic initialization of the USB keyboard. +// +//**************************************************************************** +void +USBKeyboardInit(void) +{ + // + // Clear out the special key variable. + // + g_sKeyboardState.ui8Special = 0; +} + +//**************************************************************************** +// +// Returns the Usage code for a ASCII character. +// +// \param cKey is the ASCII character to look up. +// \param bShifted determines if the look up is for the shifted value or not. +// +// This function is used to look up the USB HID usage code for a given +// ASCII character. The \e bShifted value indicates if the key should be +// resported as shifted. +// +// \return Returns the usage code for the ASCII character or 0 if none found. +// +//**************************************************************************** +static uint8_t +GetUsageCode(char cKey, bool bShifted) +{ + int32_t i32Idx, i32Entries; + const sUsageEntry *pUsageTable; + + if(bShifted) + { + i32Entries = ui32NumUsageCodesShift; + pUsageTable = g_pcUsageCodesShift; + } + else + { + i32Entries = ui32NumUsageCodes; + pUsageTable = g_pcUsageCodes; + } + + for(i32Idx = 0; i32Idx < i32Entries; i32Idx++) + { + if(pUsageTable[i32Idx].cChar == cKey) + { + return(pUsageTable[i32Idx].cUsage); + } + } + return(0); +} + +//**************************************************************************** +// +// Called by the UI interface to update the USB keyboard. +// +// \param ui8Modifiers is the set of key modifiers. +// \param ui8Key is ASCII character to look up. +// \param bPressed indicates if this is a press or release event. +// +// This function is used to update a key that has been pressed based on the +// ASCII character that is passed in the \e ui8Key parameter. The \e bPressed +// parameter is \b true if the key was pressed and \b false if the key was +// released. +// +// \return None. +// +//**************************************************************************** +void +USBKeyboardUpdate(uint8_t ui8Modifiers, uint8_t ui8Key, bool bPressed) +{ + uint8_t ui8Usage; + + // + // Move these to a-z because USB HID does not recognize unshifted values, + // it uses the SHIFT modifier to change the case. + // + if((ui8Key >= 'A') && (ui8Key <= 'Z')) + { + ui8Key |= 0x20; + + if(bPressed) + { + ui8Modifiers |= HID_KEYB_LEFT_SHIFT; + } + } + + // + // Get the usage code for this character. + // + ui8Usage = GetUsageCode(ui8Key, false); + + // + // Check if this was a "special" key because USB HID handles these + // separately. + // + if((ui8Usage == HID_KEYB_USAGE_CAPSLOCK) || + (ui8Usage == HID_KEYB_USAGE_SCROLLOCK) || + (ui8Usage == HID_KEYB_USAGE_NUMLOCK)) + { + // + // If there was already a special key pressed, then force it to be + // released. + // + if(g_sKeyboardState.ui8Special) + { + USBDHIDKeyboardKeyStateChange(&g_sKeyboardDevice, ui8Modifiers, + g_sKeyboardState.ui8Special, false); + } + + // + // Save the new special key. + // + g_sKeyboardState.ui8Special = ui8Usage; + } + + // + // If there was not an unshifted value for this character then look for + // a shifted version of the character. + // + if(ui8Usage == 0) + { + // + // Get the shifted value and set the shift modifier. + // + ui8Usage = GetUsageCode(ui8Key, true); + + if(bPressed) + { + ui8Modifiers |= HID_KEYB_LEFT_SHIFT; + } + } + + // + // If a valid usage code was found then pass the key along to the + // USB library. + // + if(ui8Usage) + { + USBDHIDKeyboardKeyStateChange(&g_sKeyboardDevice, ui8Modifiers, + ui8Usage, bPressed); + } +} + +//**************************************************************************** +// +// Handle the callbacks from the USB library's HID keyboard layer. +// +//**************************************************************************** +uint32_t +USBKeyboardHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgParam, + void *pvMsgData) +{ + // + // Handle LED set requests. These are the various lock key requests. + // + if(ui32Event == USBD_HID_KEYB_EVENT_SET_LEDS) + { + // + // Set the state of the lock keys in the UI. + // + UICapsLock(ui32MsgParam & HID_KEYB_CAPS_LOCK); + UIScrollLock(ui32MsgParam & HID_KEYB_SCROLL_LOCK); + UINumLock(ui32MsgParam & HID_KEYB_NUM_LOCK); + } + else if(ui32Event == USB_EVENT_TX_COMPLETE) + { + // + // Any time a report is sent and there is a pending special key + // pressed send a key release. + // + if(g_sKeyboardState.ui8Special) + { + USBDHIDKeyboardKeyStateChange(&g_sKeyboardDevice, 0, + g_sKeyboardState.ui8Special, false); + g_sKeyboardState.ui8Special = 0; + } + + } + return(0); +} diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_mouse.c b/boards/dk-tm4c129x/usb_dev_chid/usb_mouse.c new file mode 100644 index 0000000..fa46f3f --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_mouse.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// usb_dev_mouse.c - Main routines for the mouse portion of the composite +// device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcomp.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidmouse.h" +#include "usblib/device/usbdhidkeyb.h" +#include "usb_structs.h" + +//***************************************************************************** +// +// The global state of the mouse. +// +//***************************************************************************** +static volatile struct +{ + int32_t i32X; + int32_t i32Y; + uint8_t ui8Buttons; + + enum + { + // + // No pending or reports being sent. + // + MOUSE_IDLE, + + // + // Sending a report with none pending. + // + MOUSE_SENDING, + + // + // Sending a report and have one pending. + // + MOUSE_SENDING_PEND, + + // + // Pending report but none currently sending. + // + MOUSE_PENDING, + + // + // Disconnect occurred. + // + MOUSE_DISCONNECT + } + eState; +} +sMouseState; + +//***************************************************************************** +// +// Initialize the global state of the mouse. +// +//***************************************************************************** +void +USBMouseInit(void) +{ + // + // Initialize the mouse state.. + // + sMouseState.i32X = 0; + sMouseState.i32Y = 0; + sMouseState.eState = MOUSE_IDLE; + sMouseState.ui8Buttons = 0; +} + +//***************************************************************************** +// +// This function is called by the UI to update the mouse movement and buttons. +// +// \param i32X is the delta in X movement for the mouse. +// \param i32Y is the delta in Y movement for the mouse. +// \param ui8Buttons is the bit mapped value for the buttons. +// +// \return None. +// +//***************************************************************************** +void +USBMouseUpdate(int32_t i32X, int32_t i32Y, uint8_t ui8Buttons) +{ + switch(sMouseState.eState) + { + case MOUSE_SENDING: + { + // + // Go to the pending while sending state because there is a + // transmit already being sent. This + // + sMouseState.eState = MOUSE_SENDING_PEND; + } + case MOUSE_SENDING_PEND: + case MOUSE_PENDING: + { + // + // Accumulate changes in mouse position if there is already a + // report being sent. + // + sMouseState.i32X += i32X; + if(sMouseState.i32X > 127) + { + sMouseState.i32X = 127; + } + else if(sMouseState.i32X < -128) + { + sMouseState.i32X = -128; + } + + sMouseState.i32Y += i32Y; + if(sMouseState.i32X > 127) + { + sMouseState.i32X = 127; + } + else if(sMouseState.i32X < -128) + { + sMouseState.i32X = -128; + } + sMouseState.ui8Buttons |= ui8Buttons; + + break; + } + case MOUSE_IDLE: + default: + { + // + // If idle then just send the update. + // + sMouseState.i32X = i32X; + sMouseState.i32Y = i32Y; + + sMouseState.ui8Buttons |= ui8Buttons; + + sMouseState.eState = MOUSE_PENDING; + + break; + } + } +} + +//***************************************************************************** +// +// Event handler for the USB HID mouse callbacks. This was passed into the +// USB library as the callback for USB HID mouse events. +// +//***************************************************************************** +uint32_t +USBMouseHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgParam, + void *pvMsgData) +{ + // + // The only event that is monitored is the transmit complete to know + // that it safe to send another report. + // + if(ui32Event == USB_EVENT_TX_COMPLETE) + { + switch(sMouseState.eState) + { + // + // Done sending return to idle. + // + case MOUSE_SENDING: + { + // + // Clear the previous X,Y accumulated values. + // + sMouseState.i32X = 0; + sMouseState.i32Y = 0; + + // + // If done with sending then always send out a button update + // if buttons were pressed. + // + if(sMouseState.ui8Buttons) + { + sMouseState.ui8Buttons = 0; + sMouseState.eState = MOUSE_PENDING; + } + else + { + sMouseState.eState = MOUSE_IDLE; + } + break; + } + + // + // While sending more data was ready to be sent so switch to the + // pending state again. + // + case MOUSE_SENDING_PEND: + { + sMouseState.eState = MOUSE_PENDING; + break; + } + + // + // Should not get here, but included for completeness. + // + case MOUSE_PENDING: + case MOUSE_IDLE: + default: + { + break; + } + } + } + else if(ui32Event == USB_EVENT_DISCONNECTED) + { + // + // Stay in the disconnected state. + // + sMouseState.eState = MOUSE_DISCONNECT; + } + else if(ui32Event == USB_EVENT_CONNECTED) + { + // + // This received even if the mouse is not active, but reset the state + // in all cases. + // + sMouseState.i32X = 0; + sMouseState.i32Y = 0; + sMouseState.ui8Buttons = 0; + sMouseState.eState = MOUSE_IDLE; + } + return(0); +} + +//***************************************************************************** +// +// Main routine for the mouse. +// +//***************************************************************************** +void +USBMouseMain(void) +{ + // + // Disable interrupts while changing the variables below. + // + IntMasterDisable(); + + switch(sMouseState.eState) + { + case MOUSE_PENDING: + { + // + // Send the report since there is one pending. + // + USBDHIDMouseStateChange((void *)&g_sMouseDevice, + (uint8_t)sMouseState.i32X, + (uint8_t)sMouseState.i32Y, + sMouseState.ui8Buttons); + // + // Clear out the report data so that pending data does not + // continually accumulate. + // + sMouseState.i32X = 0; + sMouseState.i32Y = 0; + + if(sMouseState.ui8Buttons) + { + // + // Need to always send out that all buttons are released. + // + sMouseState.ui8Buttons = 0; + sMouseState.eState = MOUSE_SENDING_PEND; + } + else + { + // + // Switch to sending state and wait for the transmit to be + // complete. + // + sMouseState.eState = MOUSE_SENDING; + } + + break; + } + case MOUSE_DISCONNECT: + case MOUSE_SENDING: + case MOUSE_SENDING_PEND: + case MOUSE_IDLE: + default: + { + break; + } + } + + // + // Enable interrupts now that the main loop is complete. + // + IntMasterEnable(); +} diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_structs.c b/boards/dk-tm4c129x/usb_dev_chid/usb_structs.c new file mode 100644 index 0000000..892f527 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_structs.c @@ -0,0 +1,255 @@ +//***************************************************************************** +// +// usb_structs.c - Data structures defining the USB keyboard and mouse device. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcomp.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidmouse.h" +#include "usblib/device/usbdhidkeyb.h" +#include "usb_structs.h" + +//***************************************************************************** +// +// Flags for Keyboard and Mouse shared states. +// +//***************************************************************************** +volatile uint32_t g_ui32USBFlags; + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (13 + 1) * 2, + USB_DTYPE_STRING, + 'M', 0, 'o', 0, 'u', 0, 's', 0, 'e', 0, ' ', 0, 'E', 0, 'x', 0, 'a', 0, + 'm', 0, 'p', 0, 'l', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_pui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_pui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//**************************************************************************** +// +// The HID mouse device initialization and customization structures. +// +//**************************************************************************** +tUSBDHIDMouseDevice g_sMouseDevice = +{ + // + // Tiva VID. + // + USB_VID_TI_1CBE, + + // + // Tiva HID Mouse PID. + // + USB_PID_MOUSE, + + // + // This is in 2mA increments so 500mA. + // + 250, + + // + // Bus powered device. + // + USB_CONF_ATTR_BUS_PWR, + + // + // The Mouse handler function. + // + USBMouseHandler, + + // + // Point to the mouse device structure. + // + (void *)&g_sMouseDevice, + + // + // The composite device does not use the strings from the class. + // + 0, + 0, +}; + +//***************************************************************************** +// +// The HID keyboard device initialization and customization structures. +// +//***************************************************************************** +tUSBDHIDKeyboardDevice g_sKeyboardDevice = +{ + // + // Tiva VID. + // + USB_VID_TI_1CBE, + + // + // Tiva HID Mouse PID. + // + USB_PID_KEYBOARD, + + // + // This is in 2mA increments so 500mA. + // + 250, + + // + // Bus powered device. + // + USB_CONF_ATTR_BUS_PWR, + + // + // The Mouse handler function. + // + USBKeyboardHandler, + + // + // Point to the mouse device structure. + // + (void *)&g_sKeyboardDevice, + + // + // The composite device does not use the strings from the class. + // + 0, + 0, +}; + +//**************************************************************************** +// +// The array of devices supported by this composite device. +// +//**************************************************************************** +tCompositeEntry g_psCompDevices[NUM_DEVICES]; + +//**************************************************************************** +// +// The memory allocation for the composite USB device descriptors. +// +//**************************************************************************** +uint8_t g_pui8DescriptorData[DESCRIPTOR_DATA_SIZE]; + +//**************************************************************************** +// +// Allocate the Device Data for the top level composite device class. +// +//**************************************************************************** +tUSBDCompositeDevice g_sCompDevice = +{ + // + // Tiva VID. + // + USB_VID_TI_1CBE, + + // + // Tiva PID for composite HID and HID. + // + USB_PID_COMP_HID_HID, + + // + // This is in 2mA increments so 500mA. + // + 250, + + // + // Bus powered device. + // + USB_CONF_ATTR_BUS_PWR, + + // + // There is no need for a default composite event handler. + // + USBEventHandler, + + // + // The string table. + // + g_pui8StringDescriptors, + NUM_STRING_DESCRIPTORS, + + // + // The Composite device array. + // + NUM_DEVICES, + g_psCompDevices, +}; diff --git a/boards/dk-tm4c129x/usb_dev_chid/usb_structs.h b/boards/dk-tm4c129x/usb_dev_chid/usb_structs.h new file mode 100644 index 0000000..df0082a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_chid/usb_structs.h @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// usb_structs.h - Data structures defining the composite mouse and keyboard +// USB device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __USB_STRUCTS_H__ +#define __USB_STRUCTS_H__ + +//**************************************************************************** +// +// Globals used by both classes. +// +//**************************************************************************** +extern volatile uint32_t g_ui32USBFlags; +extern volatile uint32_t g_ui32SysTickCount; +extern volatile uint8_t g_ui8Buttons; + +//**************************************************************************** +// +// The number of individual device class instances comprising this composite +// device. +// +//**************************************************************************** +#define NUM_DEVICES 2 + +//***************************************************************************** +// +// Keyboard Device Instance. +// +//***************************************************************************** +extern tUSBDHIDKeyboardDevice g_sKeyboardDevice; + +//***************************************************************************** +// +// Mouse Device instance +// +//***************************************************************************** +extern tUSBDHIDMouseDevice g_sMouseDevice; + +//***************************************************************************** +// +// Array of all composite devices. +// +//***************************************************************************** +extern tCompositeEntry g_psCompDevices[NUM_DEVICES]; + +//***************************************************************************** +// +// the root composite device. +// +//***************************************************************************** +extern tUSBDCompositeDevice g_sCompDevice; + +//***************************************************************************** +// +// The memory allocated to hold the composite descriptor that is created by +// the call to USBDCompositeInit(). +// +//***************************************************************************** +#define DESCRIPTOR_DATA_SIZE (COMPOSITE_DHID_SIZE + COMPOSITE_DHID_SIZE) +extern uint8_t g_pui8DescriptorData[DESCRIPTOR_DATA_SIZE]; + +//**************************************************************************** +// +// The flags used by this application for the g_ulFlags value. +// +//**************************************************************************** +#define FLAG_MOVE_UPDATE 0 +#define FLAG_CONNECTED 1 +#define FLAG_LED_ACTIVITY 2 +#define FLAG_MOVE_MOUSE 3 +#define FLAG_COMMAND_RECEIVED 4 +#define FLAG_SUSPENDED 5 + +//**************************************************************************** +// +// The size of the transmit and receive buffers used for the redirected UART. +// This number should be a power of 2 for best performance. 256 is chosen +// pretty much at random though the buffer should be at least twice the size +// of a maximum-sized USB packet. +// +//**************************************************************************** + +extern void USBMouseMoveHandler(void); +extern void USBKeyboardMain(void); + +//**************************************************************************** +// +// CDC device callback function prototypes. +// +//**************************************************************************** +extern uint32_t USBEventHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +extern uint32_t USBMouseHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgData, void *pvMsgData); +extern uint32_t USBKeyboardHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgData, void *pvMsgData); +#endif diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/Makefile b/boards/dk-tm4c129x/usb_dev_gamepad/Makefile new file mode 100644 index 0000000..68e1edc --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/Makefile @@ -0,0 +1,94 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device gamepad example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device gamepad example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_gamepad.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device gamepad example. +# +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/buttons.o +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/frame.o +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/touch.o +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/usb_dev_gamepad.o +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/usb_gamepad_structs.o +${COMPILER}/usb_dev_gamepad.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_gamepad.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_gamepad.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_gamepad.axf: usb_dev_gamepad.ld +SCATTERgcc_usb_dev_gamepad=usb_dev_gamepad.ld +ENTRY_usb_dev_gamepad=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.ccsimportspec new file mode 100644 index 0000000..0228898 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.ccsproject b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.cproject b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.cproject new file mode 100644 index 0000000..50ef429 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.cproject @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.project b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.project new file mode 100644 index 0000000..84a943a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.project @@ -0,0 +1,80 @@ + + + usb_dev_gamepad + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_gamepad/startup_ccs.c + + + usb_dev_gamepad.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.c + + + usb_dev_gamepad_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad_ccs.cmd + + + usb_gamepad_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_gamepad/usb_gamepad_structs.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/buttons.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.bin b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.bin new file mode 100644 index 0000000..40ca182 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.out b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.out new file mode 100644 index 0000000..fafab9e Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.out differ diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.bin b/boards/dk-tm4c129x/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.bin new file mode 100644 index 0000000..2a05e7c Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.out b/boards/dk-tm4c129x/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.out new file mode 100644 index 0000000..5d954a4 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.out differ diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/gcc/usb_dev_gamepad.axf b/boards/dk-tm4c129x/usb_dev_gamepad/gcc/usb_dev_gamepad.axf new file mode 100644 index 0000000..2adea80 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_gamepad/gcc/usb_dev_gamepad.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/gcc/usb_dev_gamepad.bin b/boards/dk-tm4c129x/usb_dev_gamepad/gcc/usb_dev_gamepad.bin new file mode 100644 index 0000000..c154b5a Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_gamepad/gcc/usb_dev_gamepad.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/readme.txt b/boards/dk-tm4c129x/usb_dev_gamepad/readme.txt new file mode 100644 index 0000000..3b945f1 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/readme.txt @@ -0,0 +1,28 @@ +USB HID Gamepad Device + +This example application turns the evaluation board into USB game pad +device using the Human Interface Device gamepad class. The buttons on the +board are reported as buttons 1, 2, and 3. The X and Y coordinates are +reported using the touch screen input. This example also demonstrates how +to use a custom HID report descriptor which is specified in the +usb_game_structs.c in the g_pui8GameReportDescriptor structure. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/rvmdk/usb_dev_gamepad.axf b/boards/dk-tm4c129x/usb_dev_gamepad/rvmdk/usb_dev_gamepad.axf new file mode 100644 index 0000000..67cb194 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_gamepad/rvmdk/usb_dev_gamepad.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/rvmdk/usb_dev_gamepad.bin b/boards/dk-tm4c129x/usb_dev_gamepad/rvmdk/usb_dev_gamepad.bin new file mode 100644 index 0000000..c690f32 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_gamepad/rvmdk/usb_dev_gamepad.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/startup_ccs.c b/boards/dk-tm4c129x/usb_dev_gamepad/startup_ccs.c new file mode 100644 index 0000000..fa95ff6 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/startup_ewarm.c b/boards/dk-tm4c129x/usb_dev_gamepad/startup_ewarm.c new file mode 100644 index 0000000..ac0de91 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/startup_gcc.c b/boards/dk-tm4c129x/usb_dev_gamepad/startup_gcc.c new file mode 100644 index 0000000..3ca97aa --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/startup_rvmdk.S b/boards/dk-tm4c129x/usb_dev_gamepad/startup_rvmdk.S new file mode 100644 index 0000000..31024c1 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.c b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.c new file mode 100644 index 0000000..03bfd18 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.c @@ -0,0 +1,507 @@ +//***************************************************************************** +// +// usb_dev_gamepad.c - Main routines for the gamepad example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_gpio.h" +#include "inc/hw_sysctl.h" +#include "driverlib/adc.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidgamepad.h" +#include "usb_gamepad_structs.h" +#include "drivers/buttons.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB HID Gamepad Device (usb_dev_gamepad)

      +//! +//! This example application turns the evaluation board into USB game pad +//! device using the Human Interface Device gamepad class. The buttons on the +//! board are reported as buttons 1, 2, and 3. The X and Y coordinates are +//! reported using the touch screen input. This example also demonstrates how +//! to use a custom HID report descriptor which is specified in the +//! usb_game_structs.c in the g_pui8GameReportDescriptor structure. +// +//***************************************************************************** + +//***************************************************************************** +// +// Graphics context used to show text on the color LCD display. +// +//***************************************************************************** +static tContext g_sContext; +#define TEXT_FONT g_psFontCmss18b + +//***************************************************************************** +// +// The HID custom gamepad report that is returned to the host. +// +//***************************************************************************** +static tCustomReport g_sReport; + +//***************************************************************************** +// +// Global holding if there is an update to send to the host. +// +//***************************************************************************** +static volatile bool g_bUpdate; + +//***************************************************************************** +// +// This enumeration holds the various states that the gamepad can be in during +// normal operation. +// +//***************************************************************************** +volatile enum +{ + // + // Not yet configured. + // + eStateNotConfigured, + + // + // Connected and not waiting on data to be sent. + // + eStateIdle, + + // + // Suspended. + // + eStateSuspend, + + // + // Connected and waiting on data to be sent out. + // + eStateSending +} +g_iGamepadState; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Shows the status string on the display. +// +// \param psContext is a pointer to the graphics context representing the +// display. +// \param pcStatus is a pointer to the string to be shown. +// +//***************************************************************************** +void +DisplayStatus(tContext *psContext, char *pcStatus) +{ + tRectangle sRectLine; + int32_t i32Y; + + // + // Calculate the Y coordinate of the top left of the character cell + // for our line of text. + // + i32Y = GrContextDpyHeightGet(psContext) - GrFontHeightGet(TEXT_FONT) - 10; + + // + // Determine the bounding rectangle for this line of text. We add 4 pixels + // to the height just to ensure that we clear a couple of pixels above and + // below the line of text. + // + sRectLine.i16XMin = 0; + sRectLine.i16XMax = GrContextDpyWidthGet(psContext) - 1; + sRectLine.i16YMin = i32Y - GrFontHeightGet(TEXT_FONT); + sRectLine.i16YMax = i32Y + GrFontHeightGet(TEXT_FONT) + 3; + + // + // Clear the line with black. + // + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(psContext, &sRectLine); + + // + // Draw the new status string + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(psContext, pcStatus, -1, + GrContextDpyWidthGet(psContext) / 2, + i32Y, false); +} + +//***************************************************************************** +// +// The interrupt-context handler for touch screen events from the touch screen +// driver. This function constantly overwrites the current report until the +// main loop can handle the new data. +// +//***************************************************************************** +int32_t +TSHandler(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + // + // See which event is being sent from the touch screen driver. + // + switch(ui32Message) + { + // + // The pen has just been placed down. + // + case WIDGET_MSG_PTR_DOWN: + case WIDGET_MSG_PTR_MOVE: + { + // + // Let the main loop know that there is an update. + // + g_bUpdate = true; + + // + // Scale and save the current position. + // + g_sReport.i8XPos = (int8_t)(((i32X - 160) * 255)/320); + g_sReport.i8YPos = (int8_t)(((i32Y - 120) * 255)/240); + + // + // This event has been handled. + // + break; + } + + // + // The pen has just been picked up. + // + case WIDGET_MSG_PTR_UP: + { + // + // Let the main loop know that there is an update. + // + g_bUpdate = true; + + // + // Reset to the center position. + // + g_sReport.i8XPos = 0; + g_sReport.i8YPos = 0; + + // + // This event has been handled. + // + break; + } + } + + + // + // Tell the touch handler that everything is fine. + // + return(1); +} + +//***************************************************************************** +// +// Handles asynchronous events from the HID gamepad driver. +// +// \param pvCBData is the event callback pointer provided during +// USBDHIDGamepadInit(). This is a pointer to our gamepad device structure +// (&g_sGamepadDevice). +// \param ui32Event identifies the event we are being called back for. +// \param ui32MsgData is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the HID gamepad driver to inform the application +// of particular asynchronous events related to operation of the gamepad HID +// device. +// +// \return Returns 0 in all cases. +// +//***************************************************************************** +uint32_t +GamepadHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgData, + void *pvMsgData) +{ + switch (ui32Event) + { + // + // The host has connected to us and configured the device. + // + case USB_EVENT_CONNECTED: + { + g_iGamepadState = eStateIdle; + + DisplayStatus(&g_sContext, "Connected"); + break; + } + + // + // The host has disconnected from us. + // + case USB_EVENT_DISCONNECTED: + { + g_iGamepadState = eStateNotConfigured; + + DisplayStatus(&g_sContext, "Disconnected"); + break; + } + + // + // This event occurs every time the host acknowledges transmission + // of a report. It is to return to the idle state so that a new report + // can be sent to the host. + // + case USB_EVENT_TX_COMPLETE: + { + // + // Enter the idle state since we finished sending something. + // + g_iGamepadState = eStateIdle; + + break; + } + + // + // This event indicates that the host has suspended the USB bus. + // + case USB_EVENT_SUSPEND: + { + // + // Go to the suspended state. + // + g_iGamepadState = eStateSuspend; + + DisplayStatus(&g_sContext, "Suspended"); + break; + } + + // + // This event signals that the host has resumed signaling on the bus. + // + case USB_EVENT_RESUME: + { + // + // Go back to the idle state. + // + g_iGamepadState = eStateIdle; + + DisplayStatus(&g_sContext, "Connected"); + break; + } + + // + // Return the pointer to the current report. This call is + // rarely if ever made, but is required by the USB HID + // specification. + // + case USBD_HID_EVENT_GET_REPORT: + { + *(void **)pvMsgData = (void *)&g_sReport; + + break; + } + + // + // We ignore all other events. + // + default: + { + break; + } + } + + return(0); +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + uint8_t ui8ButtonsChanged, ui8Buttons; + uint32_t ui32SysClock; + + // + // Set the clocking to run from the PLL at 120MHz + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_25MHZ | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Configure the buttons driver. + // + ButtonsInit(ALL_BUTTONS); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-dev-gamepad"); + + // + // Default status is disconnected. + // + DisplayStatus(&g_sContext, "Disconnected"); + + // + // Not configured initially. + // + g_iGamepadState = eStateNotConfigured; + + // + // Initialize the USB stack for device mode. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Pass the device information to the USB library and place the device + // on the bus. + // + USBDHIDGamepadInit(0, &g_sGamepadDevice); + + // + // Zero out the initial report. + // + g_sReport.ui8Buttons = 0; + g_sReport.i8XPos = 0; + g_sReport.i8YPos = 0; + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(TSHandler); + + // + // The main loop starts here. We begin by waiting for a host connection + // then drop into the main gamepad handling section. If the host + // disconnects, we return to the top and wait for a new connection. + // + while(1) + { + // + // Wait here until USB device is connected to a host. + // + if(g_iGamepadState == eStateIdle) + { + // + // See if the buttons updated. + // + ButtonsPoll(&ui8ButtonsChanged, &ui8Buttons); + + g_sReport.ui8Buttons = 0; + + // + // Set button 1 if up button pressed. + // + if(ui8Buttons & UP_BUTTON) + { + g_sReport.ui8Buttons |= 0x01; + } + + // + // Set button 2 if down button pressed. + // + if(ui8Buttons & DOWN_BUTTON) + { + g_sReport.ui8Buttons |= 0x02; + } + + // + // Set button 3 if select button pressed. + // + if(ui8Buttons & SELECT_BUTTON) + { + g_sReport.ui8Buttons |= 0x04; + } + + if(ui8ButtonsChanged) + { + g_bUpdate = true; + } + + // + // Send the report if there was an update. + // + if(g_bUpdate) + { + g_bUpdate = false; + + USBDHIDGamepadSendReport(&g_sGamepadDevice, &g_sReport, + sizeof(g_sReport)); + + // + // Now sending data but protect this from an interrupt since + // it can change in interrupt context as well. + // + IntMasterDisable(); + g_iGamepadState = eStateSending; + IntMasterEnable(); + } + } + } +} diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ewd b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ewp b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ewp new file mode 100644 index 0000000..1e50581 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ewp @@ -0,0 +1,810 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\usb_dev_gamepad.c + + + $PROJ_DIR$\usb_gamepad_structs.c + + + diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.icf b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.icf new file mode 100644 index 0000000..4f6fd19 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_gamepad.icf - Linker configuration file for usb_dev_gamepad. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ld b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ld new file mode 100644 index 0000000..72abf82 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_gamepad.ld - Linker configuration file for usb_dev_gamepad. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.sct b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.sct new file mode 100644 index 0000000..9d53b08 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_gamepad.sct - Linker configuration file for usb_dev_gamepad. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.uvopt b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.uvopt new file mode 100644 index 0000000..e34964a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.uvopt @@ -0,0 +1,401 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_gamepad + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_gamepad.c + usb_dev_gamepad.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_gamepad_structs.c + usb_gamepad_structs.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 12 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.uvproj b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.uvproj new file mode 100644 index 0000000..b0391d0 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad.uvproj @@ -0,0 +1,464 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_gamepad + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_gamepad + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_gamepad.bin .\rvmdk\usb_dev_gamepad.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_gamepad.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + usb_dev_gamepad.c + 1 + .\usb_dev_gamepad.c + + + usb_gamepad_structs.c + 1 + .\usb_gamepad_structs.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad_ccs.cmd b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad_ccs.cmd new file mode 100644 index 0000000..e6fae80 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/usb_dev_gamepad_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_gamepad_ccs.cmd - CCS linker configuration file for usb_dev_gamepad. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/usb_gamepad_structs.c b/boards/dk-tm4c129x/usb_dev_gamepad/usb_gamepad_structs.c new file mode 100644 index 0000000..42a55fd --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/usb_gamepad_structs.c @@ -0,0 +1,221 @@ +//***************************************************************************** +// +// usb_gamepad_structs.c - Data structures defining the USB gamepad device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcomp.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidgamepad.h" +#include "usb_gamepad_structs.h" + +//**************************************************************************** +// +// The languages supported by this device. +// +//**************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//**************************************************************************** +// +// The manufacturer string. +// +//**************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//**************************************************************************** +// +// The product string. +// +//**************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'E', 0, 'x', 0, 'a', 0, 'm', 0, 'p', 0, 'l', 0, 'e', 0, ' ', 0, + 'G', 0, 'a', 0, 'm', 0, 'e', 0, ' ', 0, 'P', 0, 'a', 0, 'd', 0, ' ', 0, +}; + +//**************************************************************************** +// +// The serial number string. +// +//**************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The interface description string. +// +//***************************************************************************** +const uint8_t g_pui8HIDInterfaceString[] = +{ + (21 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'G', 0, 'a', 0, 'm', 0, 'e', 0, + 'p', 0, 'a', 0, 'd', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, + 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (25 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'G', 0, 'a', 0, 'm', 0, 'e', 0, + 'p', 0, 'a', 0, 'd', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, + 'i', 0, 'g', 0, 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, + 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8HIDInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The following is the custom HID report structure definition that is passed +// back to the host. This structure shows the basics of overriding the default +// HID gamepad descriptor provided by the USB library. Every entry in this +// report descriptor is mapped into the tCustomReport structure. +// +//***************************************************************************** +static const uint8_t g_pui8GameReportDescriptor[] = +{ + UsagePage(USB_HID_GENERIC_DESKTOP), + Usage(USB_HID_JOYSTICK), + Collection(USB_HID_APPLICATION), + + // + // The axis for the controller. + // + UsagePage(USB_HID_GENERIC_DESKTOP), + Usage (USB_HID_POINTER), + Collection (USB_HID_PHYSICAL), + + // + // 8-bit absolute X value (tCustomReport.i8XPos). + // + Usage (USB_HID_X), + ReportSize(8), + ReportCount(1), + Input(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE | + USB_HID_INPUT_ABS), + + // + // 8-bit absolute Y value (tCustomReport.i8YPos). + // + Usage (USB_HID_Y), + ReportSize(8), + ReportCount(1), + Input(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE | + USB_HID_INPUT_ABS), + + // + // The 3 buttons (tCustomReport.i8Buttons bits 0-2). + // + UsagePage(USB_HID_BUTTONS), + UsageMinimum(1), + UsageMaximum(3), + LogicalMinimum(0), + LogicalMaximum(1), + PhysicalMinimum(0), + PhysicalMaximum(1), + + // + // 3 - 1 bit values for the buttons. + // + ReportSize(1), + ReportCount(3), + Input(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE | + USB_HID_INPUT_ABS), + + // + // 5 - 1 bit constant values for padding + // (tCustomReport.i8Buttons bits 3-7). + // + ReportCount(1), + ReportSize(5), + Input(USB_HID_INPUT_CONSTANT), + + EndCollection, + EndCollection +}; + +//***************************************************************************** +// +// The HID game pad device initialization and customization structures. +// +//***************************************************************************** +tUSBDHIDGamepadDevice g_sGamepadDevice = +{ + USB_VID_TI_1CBE, + USB_PID_GAMEPAD, + 0, + USB_CONF_ATTR_SELF_PWR, + GamepadHandler, + (void *)&g_sGamepadDevice, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS, + g_pui8GameReportDescriptor, + sizeof(g_pui8GameReportDescriptor) +}; diff --git a/boards/dk-tm4c129x/usb_dev_gamepad/usb_gamepad_structs.h b/boards/dk-tm4c129x/usb_dev_gamepad/usb_gamepad_structs.h new file mode 100644 index 0000000..0b5a72c --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_gamepad/usb_gamepad_structs.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// usb_gamepad_structs.h - Data structures defining the gamepad USB device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_GAMEPAD_STRUCTS_H_ +#define _USB_GAMEPAD_STRUCTS_H_ + +//***************************************************************************** +// +//! The custom HID report that is sent back to the host. +// +//***************************************************************************** +typedef struct +{ + // + //! The current 8-bit signed X position. + // + int8_t i8XPos; + + // + //! The current 8-bit signed Y position. + // + int8_t i8YPos; + + // + //! The current button state, only the bits 0-2 are valid. + // + uint8_t ui8Buttons; +} tCustomReport; + +extern tUSBDHIDGamepadDevice g_sGamepadDevice; + +extern uint32_t GamepadHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgData, void *pvMsgData); + +#endif diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/Makefile b/boards/dk-tm4c129x/usb_dev_keyboard/Makefile new file mode 100644 index 0000000..b64db29 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/Makefile @@ -0,0 +1,94 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device keyboard example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device keyboard example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_keyboard.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device keyboard example. +# +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/frame.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/touch.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/usb_dev_keyboard.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/usb_keyb_structs.o +${COMPILER}/usb_dev_keyboard.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_keyboard.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_keyboard.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_keyboard.axf: usb_dev_keyboard.ld +SCATTERgcc_usb_dev_keyboard=usb_dev_keyboard.ld +ENTRY_usb_dev_keyboard=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.ccsimportspec new file mode 100644 index 0000000..4a82f9a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.ccsproject b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.cproject b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.cproject new file mode 100644 index 0000000..dcbef63 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.cproject @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.project b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.project new file mode 100644 index 0000000..6d19cd3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.project @@ -0,0 +1,80 @@ + + + usb_dev_keyboard + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_keyboard/startup_ccs.c + + + usb_dev_keyboard.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.c + + + usb_dev_keyboard_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd + + + usb_keyb_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_keyboard/usb_keyb_structs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin new file mode 100644 index 0000000..cd1bef1 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out new file mode 100644 index 0000000..b0e1e7c Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out differ diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin b/boards/dk-tm4c129x/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin new file mode 100644 index 0000000..eb2c92c Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out b/boards/dk-tm4c129x/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out new file mode 100644 index 0000000..da4b1fd Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out differ diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/gcc/usb_dev_keyboard.axf b/boards/dk-tm4c129x/usb_dev_keyboard/gcc/usb_dev_keyboard.axf new file mode 100644 index 0000000..ed0e0f3 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_keyboard/gcc/usb_dev_keyboard.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/gcc/usb_dev_keyboard.bin b/boards/dk-tm4c129x/usb_dev_keyboard/gcc/usb_dev_keyboard.bin new file mode 100644 index 0000000..950df49 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_keyboard/gcc/usb_dev_keyboard.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/readme.txt b/boards/dk-tm4c129x/usb_dev_keyboard/readme.txt new file mode 100644 index 0000000..5ed683d --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/readme.txt @@ -0,0 +1,36 @@ +USB HID Keyboard Device + +This example application turns the evaluation board into a USB keyboard +supporting the Human Interface Device class. The color LCD display shows a +virtual keyboard and taps on the touchscreen will send appropriate key +usage codes back to the USB host. Modifier keys (Shift, Ctrl and Alt) are +``sticky'' and tapping them toggles their state. The board status LED is +used to indicate the current Caps Lock state and is updated in response to +pressing the ``Caps'' key on the virtual keyboard or any other keyboard +attached to the same USB host system. + +The device implemented by this application also supports USB remote wakeup +allowing it to request the host to reactivate a suspended bus. If the bus +is suspended (as indicated on the application display), touching the +display will request a remote wakeup assuming the host has not +specifically disabled such requests. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf b/boards/dk-tm4c129x/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf new file mode 100644 index 0000000..efad965 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin b/boards/dk-tm4c129x/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin new file mode 100644 index 0000000..709b9ca Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/startup_ccs.c b/boards/dk-tm4c129x/usb_dev_keyboard/startup_ccs.c new file mode 100644 index 0000000..61959bb --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/startup_ccs.c @@ -0,0 +1,278 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/startup_ewarm.c b/boards/dk-tm4c129x/usb_dev_keyboard/startup_ewarm.c new file mode 100644 index 0000000..1bb30c3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/startup_ewarm.c @@ -0,0 +1,309 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/startup_gcc.c b/boards/dk-tm4c129x/usb_dev_keyboard/startup_gcc.c new file mode 100644 index 0000000..984aeed --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/startup_gcc.c @@ -0,0 +1,325 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/startup_rvmdk.S b/boards/dk-tm4c129x/usb_dev_keyboard/startup_rvmdk.S new file mode 100644 index 0000000..69a068c --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/startup_rvmdk.S @@ -0,0 +1,334 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SysTickIntHandler + EXTERN UARTStdioIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTStdioIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.c b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.c new file mode 100644 index 0000000..9157ea9 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.c @@ -0,0 +1,2355 @@ +//***************************************************************************** +// +// usb_dev_keyboard.c - Main routines for the keyboard example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/usb.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidkeyb.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" +#include "usb_keyb_structs.h" +#ifdef DEBUG +#include "utils/uartstdio.h" +#endif + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB HID Keyboard Device (usb_dev_keyboard)

      +//! +//! This example application turns the evaluation board into a USB keyboard +//! supporting the Human Interface Device class. The color LCD display shows a +//! virtual keyboard and taps on the touchscreen will send appropriate key +//! usage codes back to the USB host. Modifier keys (Shift, Ctrl and Alt) are +//! ``sticky'' and tapping them toggles their state. The board status LED is +//! used to indicate the current Caps Lock state and is updated in response to +//! pressing the ``Caps'' key on the virtual keyboard or any other keyboard +//! attached to the same USB host system. +//! +//! The device implemented by this application also supports USB remote wakeup +//! allowing it to request the host to reactivate a suspended bus. If the bus +//! is suspended (as indicated on the application display), touching the +//! display will request a remote wakeup assuming the host has not +//! specifically disabled such requests. +// +//***************************************************************************** + +//***************************************************************************** +// +// Notes about the virtual keyboard definition +// +// The virtual keyboard is defined in terms of rows of keys. Each row of +// keys may be either a normal alphanumeric row in which all keys are the +// same size and handled in exactly the say way, or a row of "special keys" +// which may have different widths and which have a handler function defined +// for each key. In the definition used here, g_psKeyboard[] contains 6 rows +// and defines the keyboard at the top level. +// +// The keyboard can be in 1 of 4 states defined by the current shift and +// caps lock state. For alphanumeric rows, the row definition (tAlphaKeys) +// contain strings representing the key cap characters for each of the keys +// in each of the four states. Function DrawVirtualKeyboard uses these +// strings and the current state to display the correct key caps. +// +//***************************************************************************** + +//***************************************************************************** +// +// Hardware resources related to the LED we use to show the CAPSLOCK state. +// +//***************************************************************************** +#define CAPSLOCK_GPIO_BASE GPIO_PORTQ_BASE +#define CAPSLOCK_GPIO_PIN GPIO_PIN_4 +#define CAPSLOCK_ACTIVE CAPSLOCK_GPIO_PIN +#define CAPSLOCK_INACTIVE 0 + +//***************************************************************************** +// +// The system tick timer period. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 +#define SYSTICK_PERIOD_MS (1000 / SYSTICKS_PER_SECOND) + +//***************************************************************************** +// +// A structure describing special keys which are not handled the same way as +// all the alphanumeric keys. +// +//***************************************************************************** +typedef struct +{ + // + // The label string for the key. + // + const char *pcLabel; + + // + // The width of the displayed key in pixels. + // + int16_t i16Width; + + // + // The usage code (if any) associated with this key. + // + char cUsageCode; + + // + // A function to be called when the user presses or releases this key. + // + uint32_t (*pfnPressHandler)(int16_t i16Row, int16_t i16Col, bool bPress); + + // + // A function to be called to redraw the special key. If NULL, the + // default redraw handler is used. + // + void (*pfnRedrawHandler)(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder); +} tSpecialKey; + +//***************************************************************************** +// +// A list of the states that the keyboard can be in. +// +//***************************************************************************** +typedef enum +{ + // + // Neither shift nor caps lock is active. + // + KEY_STATE_NORMAL, + + // + // Shift is active, caps lock is not. + // + KEY_STATE_SHIFT, + + // + // Shift is not active, caps lock is active. + // + KEY_STATE_CAPS, + + // + // Both shift and caps lock are active. + // + KEY_STATE_BOTH, + + // + // State counter member. + // + NUM_KEY_STATES +} tKeyState; + +tKeyState g_eVirtualKeyState = KEY_STATE_NORMAL; + +//***************************************************************************** +// +// A structure describing typical alphanumeric keys. +// +//***************************************************************************** +typedef struct +{ + // + // Strings containing the unshifted, shifted and caps representations of + // each of the keys in the row. + // + const char *pcKey[NUM_KEY_STATES]; + const char *pcUsageCodes; +} tAlphaKeys; + +//***************************************************************************** +// +// A structure describing a single row of the virtual keyboard. +// +//***************************************************************************** +typedef struct +{ + // + // Does this row consist of alphanumeric keys or special keys? + // + bool bSpecial; + + // + // Pointer to data describing this row of keys. If bSpecial is true, + // this points to an array of tSpecialKey structures. If bSpecial is + // false, it points to a single tAlphaKeys structure. + // + void *pvKeys; + + // + // The number of keys in the row. + // + int16_t i16NumKeys; + + // + // The horizontal offset to apply when drawing the characters in this + // row to the screen. This allows us to offset the rows slightly as they + // would look on a normal keyboard. + // + int16_t i16LeftOffset; +} tRow; + +//***************************************************************************** +// +// Labels defining the layout of the virtual keyboard on the display. +// +//***************************************************************************** +#define NUM_KEYBOARD_ROWS 6 +#define KEYBOARD_TOP 60 +#define KEYBOARD_KEY_WIDTH 26 +#define KEYBOARD_KEY_HEIGHT 24 +#define KEYBOARD_COL_SPACING 2 +#define KEYBOARD_ROW_SPACING 4 + +#define KEYBOARD_CELL_WIDTH (KEYBOARD_KEY_WIDTH + KEYBOARD_COL_SPACING) +#define KEYBOARD_CELL_HEIGHT (KEYBOARD_KEY_HEIGHT + KEYBOARD_ROW_SPACING) + +//***************************************************************************** +// +// Colors used to draw various parts of the virtual keyboard. +// +//***************************************************************************** +#define FOCUS_COLOR ClrRed +#define BACKGROUND_COLOR ClrBlack +#define HIGHLIGHT_COLOR ClrWhite +#define SHADOW_COLOR ClrGray +#define KEY_COLOR 0x00E0E0E0 +#define KEY_BRIGHT_COLOR 0x00E0E000 +#define HIGHLIGHT_BRIGHT_COLOR ClrYellow +#define SHADOW_BRIGHT_COLOR 0x00808000 +#define KEY_TEXT_COLOR ClrBlack + +//***************************************************************************** +// +// Keys on the top row of the virtual keyboard. Strings are defined showing +// the keycaps in unshifted, shifted and caps states. +// +//***************************************************************************** +#define NUM_ROW0_KEYS 10 + +const char g_pcRow0UsageCodes[NUM_ROW0_KEYS] = +{ + HID_KEYB_USAGE_1, HID_KEYB_USAGE_2, HID_KEYB_USAGE_3, HID_KEYB_USAGE_4, + HID_KEYB_USAGE_5, HID_KEYB_USAGE_6, HID_KEYB_USAGE_7, HID_KEYB_USAGE_8, + HID_KEYB_USAGE_9, HID_KEYB_USAGE_0 +}; + +const tAlphaKeys g_sRow0 = +{ + {"1234567890", // Normal + "!@#$%^&*()", // Shift + "1234567890", // Caps + "!@#$%^&*()"}, // Shift + Caps + g_pcRow0UsageCodes +}; + +//***************************************************************************** +// +// Keys on the second row of the virtual keyboard. Strings are defined showing +// the keycaps in unshifted, shifted and caps states. +// +//***************************************************************************** +#define NUM_ROW1_KEYS 10 + +const char g_pcRow1UsageCodes[NUM_ROW1_KEYS] = +{ + HID_KEYB_USAGE_Q, HID_KEYB_USAGE_W, HID_KEYB_USAGE_E, HID_KEYB_USAGE_R, + HID_KEYB_USAGE_T, HID_KEYB_USAGE_Y, HID_KEYB_USAGE_U, HID_KEYB_USAGE_I, + HID_KEYB_USAGE_O, HID_KEYB_USAGE_P +}; + +const tAlphaKeys g_sRow1 = +{ + {"qwertyuiop", // Normal + "QWERTYUIOP", // Shift + "QWERTYUIOP", // Caps + "qwertyuiop"}, // Shift + Caps + g_pcRow1UsageCodes +}; + +//***************************************************************************** +// +// Keys on the third row of the virtual keyboard. Strings are defined showing +// the keycaps in unshifted, shifted and caps states. +// +//***************************************************************************** +#define NUM_ROW2_KEYS 10 + +const char g_pcRow2UsageCodes[NUM_ROW2_KEYS] = +{ + HID_KEYB_USAGE_A, HID_KEYB_USAGE_S, HID_KEYB_USAGE_D, HID_KEYB_USAGE_F, + HID_KEYB_USAGE_G, HID_KEYB_USAGE_H, HID_KEYB_USAGE_J, HID_KEYB_USAGE_K, + HID_KEYB_USAGE_L, HID_KEYB_USAGE_SEMICOLON +}; + +const tAlphaKeys g_sRow2 = +{ + {"asdfghjkl;", // Normal + "ASDFGHJKL:", // Shift + "ASDFGHJKL;", // Caps + "asdfghjkl;"}, // Shift + Caps + g_pcRow2UsageCodes +}; + +//***************************************************************************** +// +// Keys on the fourth row of the virtual keyboard. Strings are defined showing +// the keycaps in unshifted, shifted and caps states. +// +//***************************************************************************** +#define NUM_ROW3_KEYS 10 + +const char g_pcRow3UsageCodes[NUM_ROW3_KEYS] = +{ + HID_KEYB_USAGE_Z, HID_KEYB_USAGE_X, HID_KEYB_USAGE_C, HID_KEYB_USAGE_V, + HID_KEYB_USAGE_B, HID_KEYB_USAGE_N, HID_KEYB_USAGE_M, HID_KEYB_USAGE_COMMA, + HID_KEYB_USAGE_PERIOD, HID_KEYB_USAGE_FSLASH +}; + +const tAlphaKeys g_sRow3 = +{ + {"zxcvbnm,./", // Normal + "ZXCVBNM<>?", // Shift + "ZXCVBNM,./", // Caps + "zxcvbnm<>?"}, // Shift + Caps + g_pcRow3UsageCodes +}; + +//***************************************************************************** +// +// Prototypes for special key handlers +// +//***************************************************************************** +uint32_t CapsLockHandler(int16_t i16Col, int16_t i16Row, bool bPress); +uint32_t ShiftLockHandler(int16_t i16Col, int16_t i16Row, bool bPress); +uint32_t CtrlHandler(int16_t i16Col, int16_t i16Row, bool bPress); +uint32_t AltHandler(int16_t i16Col, int16_t i16Row, bool bPress); +uint32_t GUIHandler(int16_t i16Col, int16_t i16Row, bool bPress); +uint32_t DefaultSpecialHandler(int16_t i16Col, int16_t i16Row, bool bPress); +void CapsLockRedrawHandler(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder); +void ShiftLockRedrawHandler(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder); +void CtrlRedrawHandler(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder); +void AltRedrawHandler(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder); +void GUIRedrawHandler(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder); + +//***************************************************************************** +// +// The bottom 2 rows of the virtual keyboard contains special keys which are +// handled differently from the basic, alphanumeric keys. +// +//***************************************************************************** +const tSpecialKey g_psRow4[] = +{ + {"Cap", 38, HID_KEYB_USAGE_CAPSLOCK, CapsLockHandler, + CapsLockRedrawHandler}, + {"Shift", 54 , 0, ShiftLockHandler, ShiftLockRedrawHandler}, + {" ", 80, HID_KEYB_USAGE_SPACE, DefaultSpecialHandler, 0}, + {"Ent", 54, HID_KEYB_USAGE_ENTER, DefaultSpecialHandler, 0}, + {"BS", 38, HID_KEYB_USAGE_BACKSPACE, DefaultSpecialHandler, 0} +}; + +#define NUM_ROW4_KEYS (sizeof(g_psRow4) / sizeof(tSpecialKey)) + +//***************************************************************************** +// +// Keys on the fifth row of the virtual keyboard. Strings are defined showing +// the keycaps in unshifted, shifted and caps states. This row contains only +// cursor keys so the key caps are the same for each state. +// +//***************************************************************************** +const tSpecialKey g_psRow5[] = +{ + {"Alt", 54, 0, AltHandler, AltRedrawHandler}, + {"Ctrl", 54, 0, CtrlHandler, CtrlRedrawHandler}, + {"GUI", 36, 0, GUIHandler, GUIRedrawHandler}, + {"<", 26, HID_KEYB_USAGE_LEFT_ARROW, DefaultSpecialHandler, 0}, + {">", 26, HID_KEYB_USAGE_RIGHT_ARROW, DefaultSpecialHandler, 0}, + {"^", 26, HID_KEYB_USAGE_UP_ARROW, DefaultSpecialHandler, 0}, + {"v", 26, HID_KEYB_USAGE_DOWN_ARROW, DefaultSpecialHandler, 0}, +}; + +#define NUM_ROW5_KEYS (sizeof(g_psRow5) / sizeof(tSpecialKey)) + +//***************************************************************************** +// +// Define the rows of the virtual keyboard. +// +//***************************************************************************** +const tRow g_psKeyboard[NUM_KEYBOARD_ROWS] = +{ + {false, (void *)&g_sRow0, NUM_ROW0_KEYS, 10}, + {false, (void *)&g_sRow1, NUM_ROW1_KEYS, 10 + (KEYBOARD_CELL_WIDTH / 3)}, + {false, (void *)&g_sRow2, NUM_ROW2_KEYS, 10 + + ((2 * KEYBOARD_CELL_WIDTH) / 3)}, + {false, (void *)&g_sRow3, NUM_ROW3_KEYS, 20}, + {true, (void *)g_psRow4, NUM_ROW4_KEYS, 20}, + {true, (void *)g_psRow5, NUM_ROW5_KEYS, 20 + (KEYBOARD_CELL_WIDTH / 4)} +}; + +//***************************************************************************** +// +// The current active key in the virtual keyboard. +// +//***************************************************************************** +int16_t g_i16FocusRow = 0; +int16_t g_i16FocusCol = 0; + +//***************************************************************************** +// +// The coordinates of the last touchscreen press. +// +//***************************************************************************** +int16_t g_i16XPress = 0; +int16_t g_i16YPress = 0; + +//***************************************************************************** +// +// Flags used to indicate events requiring attention from the main loop. +// +//***************************************************************************** +uint32_t g_ui32Command = 0; + +//***************************************************************************** +// +// Values ORed into g_ui32Command to indicate screen press and release events. +// +//***************************************************************************** +#define COMMAND_PRESS 0x01 +#define COMMAND_RELEASE 0x02 + +//***************************************************************************** +// +// SysCtlDelay takes 3 clock cycles so calculate the number of loops +// per millisecond. +// +// = ((120000000 cycles/sec) / (1000 ms/sec)) / 3 cycles/loop +// +// = (120000000 / (1000 * 3)) loops +// +//***************************************************************************** +#define SYSDELAY_1_MS (120000000 / (1000 * 3)) + +//***************************************************************************** +// +// This global indicates whether or not we are connected to a USB host. +// +//***************************************************************************** +volatile bool g_bConnected = false; + +//***************************************************************************** +// +// This global indicates whether or not the USB bus is currently in the suspend +// state. +// +//***************************************************************************** +volatile bool g_bSuspended = false; + +//***************************************************************************** +// +// Global system tick counter holds elapsed time since the application started +// expressed in 100ths of a second. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount; + +//***************************************************************************** +// +// The number of system ticks to wait for each USB packet to be sent before +// we assume the host has disconnected. The value 50 equates to half a second. +// +//***************************************************************************** +#define MAX_SEND_DELAY 50 + +//***************************************************************************** +// +// This global is set to true if the host sends a request to set or clear +// any keyboard LED. +// +//***************************************************************************** +volatile bool g_bDisplayUpdateRequired; + +//***************************************************************************** +// +// This global holds the current state of the keyboard LEDs as sent by the +// host. +// +//***************************************************************************** +volatile uint8_t g_ui8LEDStates; + +//***************************************************************************** +// +// This global is set by the USB data handler if the host reports a change in +// the keyboard LED states. The main loop uses it to update the virtual +// keyboard state. +// +//***************************************************************************** +volatile bool g_bLEDStateChanged; + +//***************************************************************************** +// +// This enumeration holds the various states that the keyboard can be in during +// normal operation. +// +//***************************************************************************** +volatile enum +{ + // + // Unconfigured. + // + STATE_UNCONFIGURED, + + // + // No keys to send and not waiting on data. + // + STATE_IDLE, + + // + // Waiting on data to be sent out. + // + STATE_SENDING +} g_eKeyboardState = STATE_UNCONFIGURED; + +//***************************************************************************** +// +// The current state of the modifier key flags which form the first byte of +// the report to the host. This indicates the state of the shift, control, +// alt and GUI keys on the keyboard. +// +//***************************************************************************** +static uint8_t g_ui8Modifiers = 0; + +//***************************************************************************** +// +// Graphics context used to show text on the color STN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Debug-related definitions and declarations. +// +// Debug output is available via UART0 if DEBUG is defined during build. +// +//***************************************************************************** +#ifdef DEBUG +//***************************************************************************** +// +// Map all debug print calls to UARTprintf in debug builds. +// +//***************************************************************************** +#define DEBUG_PRINT UARTprintf + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + while(1) + { + } +} +#else + +//***************************************************************************** +// +// Compile out all debug print calls in release builds. +// +//***************************************************************************** +#define DEBUG_PRINT while(0) ((int (*)(char *, ...))0) + +#endif + +//***************************************************************************** +// +// This function is called by the touchscreen driver whenever there is a +// change in press state or position. +// +//***************************************************************************** +static int32_t +KeyboardTouchHandler(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + switch(ui32Message) + { + // + // The touchscreen has been pressed. Remember the coordinates and + // set the flag indicating that the main loop should process some new + // input. + // + case WIDGET_MSG_PTR_DOWN: + g_i16XPress = (int16_t)i32X; + g_i16YPress = (int16_t)i32Y; + g_ui32Command |= COMMAND_PRESS; + break; + + // + // The touchscreen is no longer being pressed. Release any key which + // was previously pressed. + // + case WIDGET_MSG_PTR_UP: + g_ui32Command |= COMMAND_RELEASE; + break; + + // + // We have nothing to do on pointer move events. + // + case WIDGET_MSG_PTR_MOVE: + break; + } + + return(0); +} + +//***************************************************************************** +// +// Handles asynchronous events from the HID keyboard driver. +// +// \param pvCBData is the event callback pointer provided during +// USBDHIDKeyboardInit(). This is a pointer to our keyboard device structure +// (&g_sKeyboardDevice). +// \param ui32Event identifies the event we are being called back for. +// \param ui32MsgData is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the HID keyboard driver to inform the application +// of particular asynchronous events related to operation of the keyboard HID +// device. +// +// \return Returns 0 in all cases. +// +//***************************************************************************** +uint32_t +KeyboardHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgData, + void *pvMsgData) +{ + switch (ui32Event) + { + // + // The host has connected to us and configured the device. + // + case USB_EVENT_CONNECTED: + { + g_bConnected = true; + g_bSuspended = false; + break; + } + + // + // The host has disconnected from us. + // + case USB_EVENT_DISCONNECTED: + { + g_bConnected = false; + break; + } + + // + // We receive this event every time the host acknowledges transmission + // of a report. It is used here purely as a way of determining whether + // the host is still talking to us or not. + // + case USB_EVENT_TX_COMPLETE: + { + // + // Enter the idle state since we finished sending something. + // + g_eKeyboardState = STATE_IDLE; + break; + } + + // + // This event indicates that the host has suspended the USB bus. + // + case USB_EVENT_SUSPEND: + { + g_bSuspended = true; + break; + } + + // + // This event signals that the host has resumed signaling on the bus. + // + case USB_EVENT_RESUME: + { + g_bSuspended = false; + break; + } + + // + // This event indicates that the host has sent us an Output or + // Feature report and that the report is now in the buffer we provided + // on the previous USBD_HID_EVENT_GET_REPORT_BUFFER callback. + // + case USBD_HID_KEYB_EVENT_SET_LEDS: + { + + // + // Remember the new LED state. + // + g_ui8LEDStates = (uint8_t)(ui32MsgData & 0xFF); + + // + // Set a flag to tell the main loop that the LED state changed. + // + g_bLEDStateChanged = true; + + break; + } + + // + // We ignore all other events. + // + default: + { + break; + } + } + return (0); +} + +//*************************************************************************** +// +// Wait for a period of time for the state to become idle. +// +// \param ulTimeoutTick is the number of system ticks to wait before +// declaring a timeout and returning \b false. +// +// This function polls the current keyboard state for ui32TimeoutTicks system +// ticks waiting for it to become idle. If the state becomes idle, the +// function returns true. If it ui32TimeoutTicks occur prior to the state +// becoming idle, false is returned to indicate a timeout. +// +// \return Returns \b true on success or \b false on timeout. +// +//*************************************************************************** +bool WaitForSendIdle(uint_fast32_t ui32TimeoutTicks) +{ + uint32_t ui32Start; + uint32_t ui32Now; + uint32_t ui32Elapsed; + + ui32Start = g_ui32SysTickCount; + ui32Elapsed = 0; + + while (ui32Elapsed < ui32TimeoutTicks) + { + // + // Is the keyboard is idle, return immediately. + // + if (g_eKeyboardState == STATE_IDLE) + { + return (true); + } + + // + // Determine how much time has elapsed since we started waiting. This + // should be safe across a wrap of g_ui32SysTickCount. I suspect you + // won't likely leave the app running for the 497.1 days it will take + // for this to occur but you never know... + // + ui32Now = g_ui32SysTickCount; + ui32Elapsed = (ui32Start < ui32Now) ? (ui32Now - ui32Start) : + (((uint32_t)0xFFFFFFFF - ui32Start) + ui32Now + 1); + } + + // + // If we get here, we timed out so return a bad return code to let the + // caller know. + // + return (false); +} + +//*************************************************************************** +// +// Determine the X position on the screen for a given key in the virtual +// keyboard. +// +// \param i16Col is the column number of the key whose position is being +// queried. +// \param i16Row is the row number of the key whose position is being queried. +// +// \return Returns the horizontal pixel coordinate of the left edge of the +// key. Note that this is 1 greater than you would expect since we allow +// space for the focus border round the character. +// +//*************************************************************************** +int16_t GetVirtualKeyX(int16_t i16Col, int16_t i16Row) +{ + int16_t i16X; + int16_t i16Count; + tSpecialKey *psKey; + + // + // Is this a row of special keys? + // + if (g_psKeyboard[i16Row].bSpecial) + { + // + // Yes - we need to walk along the row of keys since the widths can + // vary by key. + // + i16X = g_psKeyboard[i16Row].i16LeftOffset; + psKey = (tSpecialKey *)(g_psKeyboard[i16Row].pvKeys); + + for (i16Count = 0; i16Count < i16Col; i16Count++) + { + i16X += (psKey[i16Count].i16Width + KEYBOARD_COL_SPACING); + } + + // + // Return the calculated X position for the key. + // + return (i16X + 1); + } + else + { + // + // This is a normal alphanumeric row so the keys are all the same + // width. + // + return (g_psKeyboard[i16Row].i16LeftOffset + + (i16Col * KEYBOARD_CELL_WIDTH) + 1); + } +} + +//*************************************************************************** +// +// Find a key on one row closest the a key on another row. +// +// \param i16FromCol +// \param i16FromRow +// \param i16ToRow +// +// This function is called during processing of the up and down keys while +// navigating the virtual keyboard. It finds the key in row i16ToRow that +// sits closest to key index i16FromCol in row i16FromRow. +// +// \return Returns the index (column number) of the closest key in row +// i16ToRow. +// +//*************************************************************************** +int16_t VirtualKeyboardFindClosestKey(int16_t i16FromCol, int16_t i16FromRow, + int16_t i16ToRow) +{ + int16_t i16Index; + int16_t i16X; + + // + // If moving between 2 alphanumeric rows, just move to the same key + // index in the new row (taking care to pass back a valid key index). + // + if (!g_psKeyboard[i16FromRow].bSpecial && + !g_psKeyboard[i16ToRow].bSpecial) + { + i16Index = i16FromCol; + if (i16Index > g_psKeyboard[i16ToRow].i16NumKeys) + { + i16Index = g_psKeyboard[i16ToRow].i16NumKeys - 1; + } + + return (i16Index); + } + + // + // Determine the x position of the key we are moving from. + // + i16X = GetVirtualKeyX(i16FromCol, i16FromRow); + + // + // Check for cases where the supplied x coordinate is at or to the left of + // any key in this row. In this case, we always pass back index 0. + // + if (i16X <= g_psKeyboard[i16ToRow].i16LeftOffset) + { + return (0); + } + + // + // The x coordinate is not to the left of any key so we need to determine + // which particular key it relates to. The position is associated with a + // key if it falls within the width of the key and the following space. + // + if (g_psKeyboard[i16ToRow].bSpecial) + { + // + // This is a special key so the keys on this row can all have different + // widths. We walk through them looking for a hit. + // + for (i16Index = 1; i16Index < g_psKeyboard[i16ToRow].i16NumKeys; + i16Index++) + { + // + // If the passed coordinate is less than the leftmost position of + // this key, we've overshot. Drop out since we've found our + // answer. + // + if (i16X < GetVirtualKeyX(i16Index, i16ToRow)) + { + break; + } + } + + // + // Return the index of the key one before the one we last looked at + // since this is the key which contains the supplied x coordinate. + // Since we end the loop above on the last key this handles cases + // where the x coordinate passed is further right than any key on the + // row. + // + return (i16Index - 1); + } + else + { + // + // This is an alphanumeric row so we determine the index based on + // the fixed character cell width. + // + i16Index = (i16X - g_psKeyboard[i16ToRow].i16LeftOffset) / + KEYBOARD_CELL_WIDTH; + + // + // If we calculated an index higher than the number of keys on the + // row, return the largest index supported. + // + if (i16Index >= g_psKeyboard[i16ToRow].i16NumKeys) + { + i16Index = g_psKeyboard[i16ToRow].i16NumKeys - 1; + } + } + + // + // Return the column index we calculated. + // + return (i16Index); +} + +//*************************************************************************** +// +// Draw a single key of the virtual keyboard. +// +// \param i16Col contains the column number for the key to be drawn. +// \param i16Row contains the row number for the key to be drawn. +// \param bFocus is \b true if the red focus border is to be drawn around this +// key or \b false if the border is to be erased. +// \param bPressed is \b true of the key is to be drawn in the pressed state +// or \b false if it is to be drawn in the released state. +// \param bBorder is \b true if the whole key is to be redrawn or \b false +// if only the key cap text is to be redrawn. +// \param bBright is \b true if the key is to be drawn in the bright (yellow) +// color or \b false if drawn in the normal (grey) color. +// +// This function draws a single key, varying the look depending upon whether +// the key is pressed or released and whether it has the input focus or not. +// If the bBorder parameter is false, only the key label is refreshed. If +// true, the whole key is redrawn. +// +// This is the lowest level function used to refresh the display of both +// alphanumeric and special keys. +// +// \return None. +// +//*************************************************************************** +void DrawKey(int16_t i16Col, int16_t i16Row, bool bFocus, bool bPressed, + bool bBorder, bool bBright) +{ + tRectangle sRectOutline; + tRectangle sFocusBorder; + tSpecialKey *psSpecial; + tAlphaKeys *psAlpha; + int16_t i16X; + int16_t i16Y; + int16_t i16Width; + char pcBuffer[2]; + char *pcLabel; + uint32_t ui32Highlight; + uint32_t ui32Shadow; + + // + // Determine the position, width and text label for this key. + // + i16X = GetVirtualKeyX(i16Col, i16Row); + i16Y = KEYBOARD_TOP + (i16Row * KEYBOARD_CELL_HEIGHT); + if (g_psKeyboard[i16Row].bSpecial) + { + psSpecial = (tSpecialKey *)g_psKeyboard[i16Row].pvKeys; + i16Width = psSpecial[i16Col].i16Width; + pcLabel = (char *)psSpecial[i16Col].pcLabel; + } + else + { + i16Width = KEYBOARD_KEY_WIDTH; + + psAlpha = (tAlphaKeys *)g_psKeyboard[i16Row].pvKeys; + pcBuffer[1] = (char)0; + pcBuffer[0] = (psAlpha->pcKey[g_eVirtualKeyState])[i16Col]; + pcLabel = pcBuffer; + } + + // + // Determine the bounding rectangle for the key. This rectangle is the + // area containing the key background color and label text. It excludes + // the 1 line border. + // + sRectOutline.i16XMin = i16X + 1; + sRectOutline.i16YMin = i16Y + 1; + sRectOutline.i16XMax = (i16X + i16Width) - 2; + sRectOutline.i16YMax = (i16Y + KEYBOARD_KEY_HEIGHT) - 2; + + // + // If the key has focus, we will draw a 1 pixel red line around it + // outside the actual key cell. Set up the rectangle for this here. + // + sFocusBorder.i16XMin = i16X - 1; + sFocusBorder.i16YMin = i16Y - 1; + sFocusBorder.i16XMax = i16X + i16Width; + sFocusBorder.i16YMax = i16Y + KEYBOARD_KEY_HEIGHT; + + // + // Pick the relevant highlight and shadow colors depending upon the button + // state. + // + if (!bBright) + { + // + // The key is not bright so just pick the normal (grey) + // + ui32Highlight = bPressed ? SHADOW_COLOR : HIGHLIGHT_COLOR; + ui32Shadow = bPressed ? HIGHLIGHT_COLOR : SHADOW_COLOR; + } + else + { + ui32Highlight = bPressed ? SHADOW_BRIGHT_COLOR : + HIGHLIGHT_BRIGHT_COLOR; + ui32Shadow = bPressed ? HIGHLIGHT_BRIGHT_COLOR : SHADOW_BRIGHT_COLOR; + } + + // + // Are we drawing the whole key or merely updating the label? + // + if (bBorder) + { + // + // Draw the focus border in the relevant color. + // + GrContextForegroundSet(&g_sContext, bFocus ? FOCUS_COLOR + : BACKGROUND_COLOR); + GrRectDraw(&g_sContext, &sFocusBorder); + + // + // Draw the key border. + // + GrContextForegroundSet(&g_sContext, ui32Highlight); + GrLineDrawH(&g_sContext, i16X, i16X + i16Width - 1, i16Y); + GrLineDrawV(&g_sContext, i16X, i16Y, i16Y + KEYBOARD_KEY_HEIGHT - 1); + GrContextForegroundSet(&g_sContext, ui32Shadow); + GrLineDrawH(&g_sContext, i16X + 1, i16X + i16Width - 1, i16Y + + KEYBOARD_KEY_HEIGHT - 1); + GrLineDrawV(&g_sContext, i16X + i16Width - 1, i16Y + 1, i16Y + + KEYBOARD_KEY_HEIGHT - 1); + } + + // + // Fill the button with the main button color + // + GrContextForegroundSet(&g_sContext, bBright ? KEY_BRIGHT_COLOR : + KEY_COLOR); + GrRectFill(&g_sContext, &sRectOutline); + + // + // Update the key label. We center the text in the key, moving it one + // pixel down and to the right if the key is in the pressed state. + // + GrContextForegroundSet(&g_sContext, KEY_TEXT_COLOR); + GrContextBackgroundSet(&g_sContext, bBright ? KEY_BRIGHT_COLOR : + KEY_COLOR); + GrContextClipRegionSet(&g_sContext, &sRectOutline); + GrStringDrawCentered(&g_sContext, pcLabel, -1, (bPressed ? 1 : 0) + + ((sRectOutline.i16XMax + sRectOutline.i16XMin) / 2), + (bPressed ? 1 : 0) + ((sRectOutline.i16YMax + + sRectOutline.i16YMin) / 2), true); + + // + // Revert to the previous clipping region. + // + sRectOutline.i16XMin = 0; + sRectOutline.i16YMin = 0; + sRectOutline.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRectOutline.i16YMax = GrContextDpyHeightGet(&g_sContext) - 1; + GrContextClipRegionSet(&g_sContext, &sRectOutline); + + // + // Revert to the usual background and foreground colors. + // + GrContextBackgroundSet(&g_sContext, BACKGROUND_COLOR); + GrContextForegroundSet(&g_sContext, ClrWhite); +} + +//*************************************************************************** +// +// Call the appropriate handler to draw a single key on the virtual +// keyboard. This top level function handles both alphanumeric and special +// keys. +// +// \param i16Col contains the column number for the key to be drawn. +// \param i16Row contains the row number for the key to be drawn. +// \param bFocus is \b true if the red focus border is to be drawn around this +// key or \b false if the border is to be erased. +// \param bPressed is \b true of the key is to be drawn in the pressed state +// or \b false if it is to be drawn in the released state. +// \param bBorder is \b true if the whole key is to be redrawn or \b false +// if only the key cap text is to be redrawn. +// +// This function draws a single key on the keyboard, varying the look depending +// upon whether the key is pressed or released and whether it has the input +// focus or not. If the bBorder parameter is \b false, only the key label is +// refreshed. If \b true, the whole key is redrawn. +// +// If the specific key is a special key with a redraw handler set, the +// handler function is called to update the display. If not, the basic +// DrawKey() function is used. +// +// \return None. +// +//*************************************************************************** +void DrawVirtualKey(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder) +{ + tSpecialKey *psSpecial; + + // + // Get a pointer to the array of special keys for this row (even though + // we are not yet sure if this is a special row). + // + psSpecial = (tSpecialKey *)g_psKeyboard[i16Row].pvKeys; + + // + // Is this a special row and, if so, does the current key have a redraw + // handler installed? + // + if (g_psKeyboard[i16Row].bSpecial && psSpecial[i16Col].pfnRedrawHandler) + { + // + // Yes - call the special handler for this key. + // + psSpecial[i16Col].pfnRedrawHandler(i16Col, i16Row, bFocus, bPressed, + bBorder); + } + else + { + // + // The key has no redraw handler so just treat it as a normal + // key. + // + DrawKey(i16Col, i16Row, bFocus, bPressed, bBorder, false); + } +} + +//*************************************************************************** +// +// Draw or update the virtual keyboard on the display. +// +// \param bBorder is \b true if the whole virtual keyboard is to be drawn or +// \b false if only the key caps have to be updated. +// +// Draw the virtual keyboard on the display. The bBorder parameter controls +// whether the whole keyboard is drawn (true) or whether only the key labels +// are replaced (false). +// +// \return None. +// +//*************************************************************************** +void DrawVirtualKeyboard(bool bBorder) +{ + int16_t i16Col; + int16_t i16Row; + + // + // Select the font we use for the keycaps. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Loop through each row, drawing each to the display + // + for (i16Row = 0; i16Row < NUM_KEYBOARD_ROWS; i16Row++) + { + // + // Loop through each key on this row of the keyboard. + // + for (i16Col = 0; i16Col < g_psKeyboard[i16Row].i16NumKeys; i16Col++) + { + // + // Draw a single key. + // + DrawVirtualKey(i16Col, i16Row, false, false, bBorder); + } + } +} + +//**************************************************************************** +// +// This function is called by the main loop if it receives a signal from the +// USB data handler telling it that the host has changed the state of the +// keyboard LEDs. We update the state and display accordingly. +// +//**************************************************************************** +void KeyboardLEDsChanged(void) +{ + bool bCapsOn; + + // + // Clear the flag indicating a state change occurred. + // + g_bLEDStateChanged = false; + + // + // Is CAPSLOCK on or off? + // + bCapsOn = (g_ui8LEDStates & HID_KEYB_CAPS_LOCK) ? true : false; + + // + // Update the state to ensure that the communicated CAPSLOCK state is + // incorporated. + // + switch (g_eVirtualKeyState) + { + // + // Are we in an unshifted state? + // + case KEY_STATE_NORMAL: + case KEY_STATE_CAPS: + { + if (bCapsOn) + { + g_eVirtualKeyState = KEY_STATE_CAPS; + } + else + { + g_eVirtualKeyState = KEY_STATE_NORMAL; + } + break; + } + + // + // Are we in a shifted state? + // + case KEY_STATE_SHIFT: + case KEY_STATE_BOTH: + { + if (bCapsOn) + { + g_eVirtualKeyState = KEY_STATE_BOTH; + } + else + { + g_eVirtualKeyState = KEY_STATE_SHIFT; + } + break; + } + + default: + { + // + // Do nothing. This default case merely prevents a compiler + // warning related to the NUM_KEY_STATES enum member not having + // a handler. + // + break; + } + } + + // + // Redraw the virtual keyboard keycaps with the appropriate characters. + // + DrawVirtualKeyboard(false); + + // + // Set the CAPSLOCK LED appropriately. + // + ROM_GPIOPinWrite(CAPSLOCK_GPIO_BASE, CAPSLOCK_GPIO_PIN, + bCapsOn ? CAPSLOCK_ACTIVE : CAPSLOCK_INACTIVE); +} + +//*************************************************************************** +// +// Special key handler for the Caps virtual key. +// +// \param i16Col is the column number of the key which has been pressed. +// \param i16Row is the row number of the key which has been pressed. +// \param bPress is \b true if the key has been pressed or \b false if it has +// been released. +// +// This function is called whenever the user presses the "Select" button +// when the CapsLock key on the virtual keyboard has input focus. +// +// \returns Returns \b KEYB_SUCCESS on success or a non-zero value to +// indicate failure. +// +//*************************************************************************** +uint32_t +CapsLockHandler(int16_t i16Col, int16_t i16Row, bool bPress) +{ + uint32_t ui32Retcode; + + // + // Note that we don't set the state or redraw the keyboard here since the + // host is expected to send us an update telling is that the CAPSLOCK + // state changed. We trigger the keyboard redrawing and LED setting off + // this message instead. In this function, we only redraw the CAPSLOCK + // key itself to provide user feedback. + // + DrawKey(i16Col, i16Row, bPress ? true : false, bPress, true, + (g_ui8LEDStates & HID_KEYB_CAPS_LOCK) ? true : false); + + // + // Send the CAPSLOCK key code back to the host. + // + g_eKeyboardState = STATE_SENDING; + ui32Retcode = USBDHIDKeyboardKeyStateChange((void *)&g_sKeyboardDevice, + g_ui8Modifiers, + HID_KEYB_USAGE_CAPSLOCK, + bPress); + + return (ui32Retcode); +} + +//*************************************************************************** +// +// Special key handler for the Ctrl virtual key. +// +// \param i16Col is the column number of the key which has been pressed. +// \param i16Row is the row number of the key which has been pressed. +// \param bPress is \b true if the key has been pressed or \b false if it has +// been released. +// +// This function is called whenever the user presses the "Select" button +// when the Ctrl key on the virtual keyboard has input focus. +// +// \returns Returns \b KEYB_SUCCESS on success or a non-zero value to +// indicate failure. +// +//*************************************************************************** +uint32_t +CtrlHandler(int16_t i16Col, int16_t i16Row, bool bPress) +{ + uint32_t ui32Retcode; + + // + // Ignore key release messages. + // + if(bPress) + { + // + // Toggle the modifier bit for the left control key. + // + g_ui8Modifiers ^= HID_KEYB_LEFT_CTRL; + + // + // Update the host with the new modifier state. Sending usage code + // HID_KEYB_USAGE_RESERVED indicates no key press so this changes only + // the modifiers. + // + g_eKeyboardState = STATE_SENDING; + ui32Retcode = USBDHIDKeyboardKeyStateChange((void *)&g_sKeyboardDevice, + g_ui8Modifiers, + HID_KEYB_USAGE_RESERVED, + true); + } + else + { + // + // We are ignoring key release but tell the caller that all is well. + // + ui32Retcode = KEYB_SUCCESS; + } + + // + // Redraw the key in the appropriate state. + // + DrawKey(i16Col, i16Row, bPress ? true : false, bPress, true, + (g_ui8Modifiers & HID_KEYB_LEFT_CTRL) ? true : false); + + return(ui32Retcode); +} + +//*************************************************************************** +// +// Special key handler for the Alt virtual key. +// +// \param i16Col is the column number of the key which has been pressed. +// \param i16Row is the row number of the key which has been pressed. +// \param bPress is \b true if the key has been pressed or \b false if it has +// been released. +// +// This function is called whenever the user presses the "Select" button +// when the Alt key on the virtual keyboard has input focus. +// +// \returns Returns \b KEYB_SUCCESS on success or a non-zero value to +// indicate failure. +// +//*************************************************************************** +uint32_t +AltHandler(int16_t i16Col, int16_t i16Row, bool bPress) +{ + uint32_t ui32Retcode; + + // + // Ignore key release messages. + // + if(bPress) + { + // + // Toggle the modifier bit for the left ALT key. + // + g_ui8Modifiers ^= HID_KEYB_LEFT_ALT; + + // + // Update the host with the new modifier state. Sending usage code + // HID_KEYB_USAGE_RESERVED indicates no key press so this changes only + // the modifiers. + // + g_eKeyboardState = STATE_SENDING; + ui32Retcode = USBDHIDKeyboardKeyStateChange((void *)&g_sKeyboardDevice, + g_ui8Modifiers, + HID_KEYB_USAGE_RESERVED, + true); + } + else + { + // + // We are ignoring key release but tell the caller that all is well. + // + ui32Retcode = KEYB_SUCCESS; + } + + // + // Redraw the key in the appropriate state. + // + DrawKey(i16Col, i16Row, bPress ? true : false, bPress, true, + (g_ui8Modifiers & HID_KEYB_LEFT_ALT) ? true : false); + + return(ui32Retcode); +} + +//*************************************************************************** +// +// Special key handler for the GUI virtual key. +// +// \param i16Col is the column number of the key which has been pressed. +// \param i16Row is the row number of the key which has been pressed. +// \param bPress is \b true if the key has been pressed or \b false if it has +// been released. +// +// This function is called whenever the user presses the "Select" button +// when the GUI key on the virtual keyboard has input focus. +// +// \returns Returns \b KEYB_SUCCESS on success or a non-zero value to +// indicate failure. +// +//*************************************************************************** +uint32_t +GUIHandler(int16_t i16Col, int16_t i16Row, bool bPress) +{ + uint32_t ui32Retcode; + + // + // Ignore key release messages. + // + if(bPress) + { + // + // Toggle the modifier bit for the left GUI key. + // + g_ui8Modifiers ^= HID_KEYB_LEFT_GUI; + + // + // Update the host with the new modifier state. Sending usage code + // HID_KEYB_USAGE_RESERVED indicates no key press so this changes only + // the modifiers. + // + g_eKeyboardState = STATE_SENDING; + ui32Retcode = USBDHIDKeyboardKeyStateChange((void *)&g_sKeyboardDevice, + g_ui8Modifiers, + HID_KEYB_USAGE_RESERVED, + true); + } + else + { + // + // We are ignoring key release but tell the caller that all is well. + // + ui32Retcode = KEYB_SUCCESS; + } + + // + // Redraw the key in the appropriate state. + // + DrawKey(i16Col, i16Row, bPress ? true : false, bPress, true, + (g_ui8Modifiers & HID_KEYB_LEFT_GUI) ? true : false); + + return(ui32Retcode); +} + +//*************************************************************************** +// +// Special key handler for the Shift virtual key. +// +// \param i16Col is the column number of the key which has been pressed. +// \param i16Row is the row number of the key which has been pressed. +// \param bPress is \b true if the key has been pressed or \b false if it has +// been released. +// +// This function is called whenever the user presses the "Select" button +// when the ShiftLock key on the virtual keyboard has input focus. +// +// \returns Returns \b true on success or \b false on failure. +// +//*************************************************************************** +uint32_t +ShiftLockHandler(int16_t i16Col, int16_t i16Row, bool bPress) +{ + // + // We ignore key release for the shift lock. + // + if(bPress) + { + // + // Set the new state by toggling the shift component. + // + switch(g_eVirtualKeyState) + { + case KEY_STATE_NORMAL: + { + g_eVirtualKeyState = KEY_STATE_SHIFT; + g_ui8Modifiers |= HID_KEYB_LEFT_SHIFT; + break; + } + + case KEY_STATE_SHIFT: + { + g_eVirtualKeyState = KEY_STATE_NORMAL; + g_ui8Modifiers &= ~HID_KEYB_LEFT_SHIFT; + break; + } + + case KEY_STATE_CAPS: + { + g_eVirtualKeyState = KEY_STATE_BOTH; + g_ui8Modifiers |= HID_KEYB_LEFT_SHIFT; + break; + } + + case KEY_STATE_BOTH: + { + g_eVirtualKeyState = KEY_STATE_CAPS; + g_ui8Modifiers &= ~HID_KEYB_LEFT_SHIFT; + break; + } + + default: + { + // + // Do nothing. This default case merely prevents a compiler + // warning related to the NUM_KEY_STATES enum member not having + // a handler. + // + break; + } + } + + // + // Redraw the keycaps to show the shifted characters. + // + DrawVirtualKeyboard(false); + } + + // + // Redraw the SHIFT key in the appropriate state. + // + DrawKey(i16Col, i16Row, bPress ? true : false, bPress, true, + (g_ui8Modifiers & HID_KEYB_LEFT_SHIFT) ? true : false); + + return(KEYB_SUCCESS); +} + +//*************************************************************************** +// +// Redraw the caps lock key. This is a thin layer over the usual DrawKey +// function which merely sets the key into bright or normal mode depending +// upon the current caps lock state. +// +//*************************************************************************** +void +CapsLockRedrawHandler(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder) +{ + // + // Draw the key in either normal color if the CAPS lock is not active + // or in the bright color if it is. + // + DrawKey(i16Col, i16Row, bFocus, bPressed, bBorder, + ((g_eVirtualKeyState == KEY_STATE_BOTH) || + (g_eVirtualKeyState == KEY_STATE_CAPS)) ? true : false); +} + +//*************************************************************************** +// +// Redraw the Shift lock key. This is a thin layer over the usual DrawKey +// function which merely sets the key into bright or normal mode depending +// upon the current shift state. +// +//*************************************************************************** +void +ShiftLockRedrawHandler(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder) +{ + // + // Draw the key in either normal color if the shift lock is not active + // or in the bright color if it is. + // + DrawKey(i16Col, i16Row, bFocus, bPressed, bBorder, + (g_ui8Modifiers & HID_KEYB_LEFT_SHIFT) ? true : false); +} + +//*************************************************************************** +// +// Redraw the Ctrl sticky key. This is a thin layer over the usual DrawKey +// function which merely sets the key into bright or normal mode depending +// upon the current key state. +// +//*************************************************************************** +void +CtrlRedrawHandler(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder) +{ + // + // Draw the key in either normal color if CTRL is not active + // or in the bright color if it is. + // + DrawKey(i16Col, i16Row, bFocus, bPressed, bBorder, + (g_ui8Modifiers & HID_KEYB_LEFT_CTRL) ? true : false); +} + +//*************************************************************************** +// +// Redraw the Alt sticky key. This is a thin layer over the usual DrawKey +// function which merely sets the key into bright or normal mode depending +// upon the current key state. +// +//*************************************************************************** +void +AltRedrawHandler(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder) +{ + // + // Draw the key in either normal color if CTRL is not active + // or in the bright color if it is. + // + DrawKey(i16Col, i16Row, bFocus, bPressed, bBorder, + (g_ui8Modifiers & HID_KEYB_LEFT_ALT) ? true : false); +} + +//*************************************************************************** +// +// Redraw the GUI sticky key. This is a thin layer over the usual DrawKey +// function which merely sets the key into bright or normal mode depending +// upon the current key state. +// +//*************************************************************************** +void +GUIRedrawHandler(int16_t i16Col, int16_t i16Row, bool bFocus, + bool bPressed, bool bBorder) +{ + // + // Draw the key in either normal color if CTRL is not active + // or in the bright color if it is. + // + DrawKey(i16Col, i16Row, bFocus, bPressed, bBorder, + (g_ui8Modifiers & HID_KEYB_LEFT_GUI) ? true : false); +} + +//*************************************************************************** +// +// Special key handler for the space, enter, backspace and cursor control +// virtual keys. +// +// \param i16Col is the column number of the key which has been pressed. +// \param i16Row is the row number of the key which has been pressed. +// \param bPress is \b true if the key has been pressed or \b false if it has +// been released. +// +// This function is called whenever the user presses the "Select" button +// when the space, backspace, enter or cursor control keys on the virtual +// keyboard have input focus. These keys are like any other alpha key in that +// they merely send a single usage code back to the host. We need a special +// handler for them, however, since they are on the bottom row of the virtual +// keyboard and this row contains other special keys. +// +// \returns Returns \b true on success or \b false on failure. +// +//*************************************************************************** +uint32_t +DefaultSpecialHandler(int16_t i16Col, int16_t i16Row, bool bPress) +{ + tSpecialKey *psKey; + uint32_t ui32Retcode; + + // + // Get a pointer to the array of keys for this row. + // + psKey = (tSpecialKey *)g_psKeyboard[i16Row].pvKeys; + + // + // Send the usage code for this key back to the USB host. + // + g_eKeyboardState = STATE_SENDING; + ui32Retcode = USBDHIDKeyboardKeyStateChange((void *)&g_sKeyboardDevice, + g_ui8Modifiers, + psKey[i16Col].cUsageCode, + bPress); + + // + // Redraw the key in the appropriate state. + // + DrawKey(i16Col, i16Row, bPress ? true : false, bPress, true, false); + + return(ui32Retcode); +} + +//***************************************************************************** +// +// Processes a single key press on the virtual keyboard. +// +// \param i16Col is the column number of the key which has been pressed. +// \param i16Row is the row number of the key which has been pressed. +// \param bPress is \b true if the key has been pressed or \b false if it has +// been released. +// +// This function is called whenever the "Select" button is pressed or released. +// Depending upon the specific key, this will either call a special key handler +// function or send a report back to the USB host indicating the change of +// state. +// +// \return Returns \b true on success or \b false on failure. +// +//***************************************************************************** +bool +VirtualKeyboardKeyPress(int16_t i16Col, int16_t i16Row, bool bPress) +{ + tSpecialKey *psKey; + tAlphaKeys *psAlphaKeys; + uint32_t ui32Retcode; + bool bSuccess; + + // + // Are we dealing with a special key? + // + if(g_psKeyboard[i16Row].bSpecial) + { + // + // Yes - call the handler for this special key. + // + psKey = (tSpecialKey *)g_psKeyboard[i16Row].pvKeys; + ui32Retcode = psKey[i16Col].pfnPressHandler(i16Col, i16Row, bPress); + + DEBUG_PRINT("Key \"%s\" %s\n", psKey[i16Col].pcLabel, + (bPress ? "pressed" : "released")); + } + else + { + // + // Normal key - add or remove this key from the list of keys currently + // pressed and pass the latest report back to the host. + // + psAlphaKeys = (tAlphaKeys *)g_psKeyboard[i16Row].pvKeys; + g_eKeyboardState = STATE_SENDING; + ui32Retcode = USBDHIDKeyboardKeyStateChange( + (void *)&g_sKeyboardDevice, + g_ui8Modifiers, + psAlphaKeys->pcUsageCodes[i16Col], + bPress); + DEBUG_PRINT("Key \"%c\" %s\n", + psAlphaKeys->pcKey[g_eVirtualKeyState][i16Col], + (bPress ? "pressed" : "released")); + + // + // Redraw the key in the appropriate state. + // + DrawKey(i16Col, i16Row, bPress ? true : false, bPress, true, false); + } + + // + // Did we schedule the report for transmission? + // + if(ui32Retcode == KEYB_SUCCESS) + { + // + // Wait for the host to acknowledge the transmission if all went well. + // + bSuccess = WaitForSendIdle(MAX_SEND_DELAY); + + // + // Did we time out waiting for the packet to be sent? + // + if (!bSuccess) + { + // + // Yes - assume the host disconnected and go back to + // waiting for a new connection. + // + g_bConnected = 0; + } + } + else + { + // + // An error was reported when trying to send the character. + // + bSuccess = false; + } + return(bSuccess); +} + +//***************************************************************************** +// +// Map a screen coordinate to the column and row of a virtual key. +// +// \param i16X is the screen X coordinate that is to be mapped. +// \param i16Y is the screen Y coordinate that is to be mapped. +// \param pusCol is a pointer to the variable which will be written with the +// column number of the virtual key at screen position (i16X, i16Y). +// \param pusRow is a pointer to the variable which will be written with the +// row number of the virtual key at screen position (i16X, i16Y). +// +// \return Returns \b true if a virtual key exists at the position provided or +// \b false otherwise. If \b false is returned, pointers \e pusCol and \e +// pusRow will not be written. +// +//***************************************************************************** +static bool +FindVirtualKey(int16_t i16X, int16_t i16Y, int16_t *psCol, int16_t *psRow) +{ + uint32_t ui32Row, ui32Col, ui32NumKeys; + int16_t i16KeyX, i16KeyWidth; + tSpecialKey *psKey; + + // + // Initialize the column value. + // + ui32Col = 0; + + // + // Determine which row the coordinates occur in. + // + for(ui32Row = 0; ui32Row < NUM_KEYBOARD_ROWS; ui32Row++) + { + if((i16Y > (KEYBOARD_TOP + (ui32Row * KEYBOARD_CELL_HEIGHT))) && + (i16Y < (KEYBOARD_TOP + (ui32Row * KEYBOARD_CELL_HEIGHT) + + KEYBOARD_KEY_HEIGHT))) + { + // + // If this is a standard alphanumeric row, we can determine the + // mapping arithmetically since all the keys are the same width. + if(!g_psKeyboard[ui32Row].bSpecial) + { + // + // First check to make sure that the press is not to the left + // of the first key in the row. + // + if(i16X < g_psKeyboard[ui32Row].i16LeftOffset) + { + return(false); + } + + // + // This includes presses that occur in the space between + // keys but, given that the touchscreen is not hugely accurate + // and that fingers or styli will likely cover more than a + // couple of pixels, this is probably perfectly fine. + // + ui32Col = ((i16X - g_psKeyboard[ui32Row].i16LeftOffset) / + KEYBOARD_CELL_WIDTH); + + // + // If we calculated an out of range column, this means no key + // exists under the press position so return false to indicate + // this. + // + if(ui32Col >= g_psKeyboard[ui32Row].i16NumKeys) + { + return(false); + } + } + else + { + // + // The touch is somewhere within this row of keys. How many keys + // are in this row? + // + ui32NumKeys = g_psKeyboard[ui32Row].i16NumKeys; + i16KeyX = g_psKeyboard[ui32Row].i16LeftOffset; + + // + // Walk through the keys in this row. + // + for(ui32Col = 0; ui32Col < ui32NumKeys; ui32Col++) + { + i16KeyX = GetVirtualKeyX(ui32Col, ui32Row); + psKey = (tSpecialKey *)(g_psKeyboard[ui32Row].pvKeys); + i16KeyWidth = psKey[ui32Col].i16Width + KEYBOARD_COL_SPACING; + + if((i16X >= i16KeyX) && (i16X < (i16KeyX + i16KeyWidth))) + { + // + // We found a matching key so drop out of the loop. + // + break; + } + } + + // + // If we get here and ui32Col has reached ui32NumKeys, we didn't + // find a key under the press position. + // + if(ui32Col == ui32NumKeys) + { + return(false); + } + } + break; + } + } + + // + // If we end up here and the row number is equal to the number of rows in + // the keyboard, the press was not in any keyboard row so return false. + // + if(ui32Row == NUM_KEYBOARD_ROWS) + { + return(false); + } + + // + // At this point, we found a key beneath the press so we return the + // information to the caller. + // + *psCol = (int16_t)ui32Col; + *psRow = (int16_t)ui32Row; + return(true); +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + int32_t int32CenterX; + uint32_t ui32LastTickCount, ui32Processing; + bool bRetcode, bLastSuspend, bKeyPressed; + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-dev-keyboard"); + + + // + // Configure GPIO pin which controls the CAPSLOCK LED and turn it off + // initially. Note that PinoutSet() already enabled the GPIO peripheral + // containing this pin + // + ROM_GPIOPinTypeGPIOOutput(CAPSLOCK_GPIO_BASE, CAPSLOCK_GPIO_PIN); + ROM_GPIOPinWrite(CAPSLOCK_GPIO_BASE, CAPSLOCK_GPIO_PIN, CAPSLOCK_INACTIVE); + +#ifdef DEBUG + // + // Open UART0 for debug output. + // + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, ui32SysClock); +#endif + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(KeyboardTouchHandler); + + // + // Set the system tick to fire 100 times per second. + // + ROM_SysTickPeriodSet(ui32SysClock / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Not configured initially. + // + g_bConnected = false; + g_bSuspended = false; + bLastSuspend = false; + + // + // Initialize the USB stack for device mode. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Pass our device information to the USB HID device class driver, + // initialize the USB + // controller and connect the device to the bus. + // + USBDHIDKeyboardInit(0, &g_sKeyboardDevice); + + // + // find the middle X coordinate. + // + int32CenterX = GrContextDpyWidthGet(&g_sContext) / 2; + + // + // The main loop starts here. We begin by waiting for a host connection + // then drop into the main keyboard handling section. If the host + // disconnects, we return to the top and wait for a new connection. + // + while(1) + { + // + // Fill all but the top 24 rows of the screen with black to erase the + // keyboard. + // + sRect.i16XMin = 10; + sRect.i16YMin = 24; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 10; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - 10; + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(&g_sContext, &sRect); + + // + // Tell the user what we are doing and provide some basic instructions. + // + GrContextFontSet(&g_sContext, g_psFontCmss20b); + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(&g_sContext, " Waiting for host... ", -1, + int32CenterX, 40, true); + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + DEBUG_PRINT("Waiting for host connection...\n"); + + // + // Wait for USB configuration to complete. Even in this state, we look + // for key presses and, if any occur while the bus is suspended, we + // issue a remote wakeup request. + // + while(!g_bConnected) + { + // + // Remember the current time. + // + ui32LastTickCount = g_ui32SysTickCount; + + // + // Has the suspend state changed since last time we checked? + // + if(bLastSuspend != g_bSuspended) + { + // + // Yes - the state changed so update the display. + // + bLastSuspend = g_bSuspended; + GrContextFontSet(&g_sContext, g_psFontCmss20b); + GrStringDrawCentered(&g_sContext, + (bLastSuspend ? " Bus suspended... ": + " Waiting for host... "), + -1, int32CenterX, 40, true); + DEBUG_PRINT(bLastSuspend ? "Bus suspended.\n" : + "Bus resumed.\n"); + + } + + // + // Wait for at least 1 system tick to have gone by before we poll + // the buttons again. + // + while(g_ui32SysTickCount == ui32LastTickCount) + { + // + // Hang around doing nothing. + // + } + } + + // + // Update the status. + // + GrContextFontSet(&g_sContext, g_psFontCmss20b); + GrStringDrawCentered(&g_sContext, " Host connected... ", -1, + int32CenterX, 40, true); + DEBUG_PRINT("Host connected.\n"); + + // + // Enter the idle state. + // + g_eKeyboardState = STATE_IDLE; + + // + // Draw the keyboard on the display. + // + DrawVirtualKeyboard(true); + + // + // Assume that the bus is not currently suspended if we have just been + // configured. + // + bLastSuspend = false; + + // + // Start with the assumption that no keys are pressed. + // + bKeyPressed = false; + + // + // Keep transfering characters from the UART to the USB host for as + // long as we are connected to the host. + // + while(g_bConnected) + { + // + // Remember the current time. + // + ui32LastTickCount = g_ui32SysTickCount; + + // + // Has the suspend state changed since last time we checked? + // + if(bLastSuspend != g_bSuspended) + { + // + // Yes - the state changed so update the display. + // + bLastSuspend = g_bSuspended; + GrContextFontSet(&g_sContext, g_psFontCmss20b); + GrStringDrawCentered(&g_sContext, + (bLastSuspend ? " Bus suspended... ": + " Host connected... "), + -1, int32CenterX, 40, true); + DEBUG_PRINT(bLastSuspend ? "Bus suspended.\n" : + "Bus resumed.\n"); + } + + // + // Do we have any touchscreen input to process? + // + if(g_ui32Command) + { + // + // Take a snapshot of the commands we were sent then clear + // the global command flags. + // + ui32Processing = g_ui32Command; + g_ui32Command = 0; + + // + // Is the bus currently suspended? + // + if(g_bSuspended) + { + // + // We are suspended so request a remote wakeup. + // + USBDHIDKeyboardRemoteWakeupRequest( + (void *)&g_sKeyboardDevice); + } + + // + // Process the command unless we got simultaneous press and + // release commands in which case we ignore them. + // + if(!((ui32Processing & (COMMAND_PRESS | COMMAND_RELEASE)) == + (COMMAND_PRESS | COMMAND_RELEASE))) + { + // + // Was the touchscreen pressed? + // + if(ui32Processing & COMMAND_PRESS) + { + // + // Map the touchscreen press to an actual key in the + // virtual keyboard. + // + bRetcode = FindVirtualKey(g_i16XPress, g_i16YPress, + &g_i16FocusCol, &g_i16FocusRow); + if(!bRetcode) + { + // + // The press was outside any key on the virtual + // keyboard so just go back and wait for something + // else to happen. + // + continue; + } + + // + // A key is pressed. + // + bKeyPressed = true; + } + + // + // Pass information on the press or release to the host, + // making sure we only send a message if we really saw a + // change of state. + // + if(bKeyPressed) + { + bRetcode = VirtualKeyboardKeyPress(g_i16FocusCol, g_i16FocusRow, + ((ui32Processing == COMMAND_PRESS) ? + true : false)); + } + else + { + bRetcode = true; + } + + // + // Remember that no key is currently pressed. + // + if(ui32Processing & COMMAND_RELEASE) + { + bKeyPressed = false; + } + + // + // If the key press generated an error, this likely + // indicates that the host has disconnected so drop out of + // the loop and go back to looking for a new connection. + // + if(!bRetcode) + { + break; + } + } + } + + // + // Update the state if the host set the LEDs since we last looked. + // + if(g_bLEDStateChanged) + { + KeyboardLEDsChanged(); + } + + // + // Wait for at least 1 system tick to have gone by before we poll + // the buttons again. + // + while(g_ui32SysTickCount == ui32LastTickCount) + { + // + // Hang around doing nothing. + // + } + } + + // + // Dropping out of the previous loop indicates that the host has + // disconnected so go back and wait for reconnection. + // + DEBUG_PRINT("Host disconnected.\n"); + } +} + +//***************************************************************************** +// +// This is the interrupt handler for the SysTick interrupt. It is used to +// update our local tick count which, in turn, is used to check for transmit +// timeouts. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + g_ui32SysTickCount++; +} diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ewd b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ewp b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ewp new file mode 100644 index 0000000..2acbfc1 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ewp @@ -0,0 +1,811 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_dev_keyboard.c + + + $PROJ_DIR$\usb_keyb_structs.c + + + diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.icf b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.icf new file mode 100644 index 0000000..018a437 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_keyboard.icf - Linker configuration file for usb_dev_keyboard. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ld b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ld new file mode 100644 index 0000000..fd8090c --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_keyboard.ld - Linker configuration file for usb_dev_keyboard. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.sct b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.sct new file mode 100644 index 0000000..139076a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_keyboard.sct - Linker configuration file for usb_dev_keyboard. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.uvopt b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.uvopt new file mode 100644 index 0000000..b8391f7 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.uvopt @@ -0,0 +1,401 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_keyboard + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_keyboard.c + usb_dev_keyboard.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_keyb_structs.c + usb_keyb_structs.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 12 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.uvproj b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.uvproj new file mode 100644 index 0000000..19e74d6 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard.uvproj @@ -0,0 +1,464 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_keyboard + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_keyboard + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_keyboard.bin .\rvmdk\usb_dev_keyboard.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_keyboard.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_dev_keyboard.c + 1 + .\usb_dev_keyboard.c + + + usb_keyb_structs.c + 1 + .\usb_keyb_structs.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd new file mode 100644 index 0000000..c18cd99 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_keyboard_ccs.cmd - CCS linker configuration file for usb_dev_keyboard. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/usb_keyb_structs.c b/boards/dk-tm4c129x/usb_dev_keyboard/usb_keyb_structs.c new file mode 100644 index 0000000..94e2e21 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/usb_keyb_structs.c @@ -0,0 +1,148 @@ +//***************************************************************************** +// +// usb_keyb_structs.c - Data structures defining the USB keyboard device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidkeyb.h" +#include "usb_keyb_structs.h" + +//**************************************************************************** +// +// The languages supported by this device. +// +//**************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//**************************************************************************** +// +// The manufacturer string. +// +//**************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//**************************************************************************** +// +// The product string. +// +//**************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (16 + 1) * 2, + USB_DTYPE_STRING, + 'K', 0, 'e', 0, 'y', 0, 'b', 0, 'o', 0, 'a', 0, 'r', 0, 'd', 0, ' ', 0, + 'E', 0, 'x', 0, 'a', 0, 'm', 0, 'p', 0, 'l', 0, 'e', 0 +}; + +//**************************************************************************** +// +// The serial number string. +// +//**************************************************************************** +const uint8_t g_pui8SeriailNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The interface description string. +// +//***************************************************************************** +const uint8_t g_pui8HIDInterfaceString[] = +{ + (22 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'K', 0, 'e', 0, 'y', 0, 'b', 0, + 'o', 0, 'a', 0, 'r', 0, 'd', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, + 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (26 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'K', 0, 'e', 0, 'y', 0, 'b', 0, + 'o', 0, 'a', 0, 'r', 0, 'd', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, + 'f', 0, 'i', 0, 'g', 0, 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, + 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SeriailNumberString, + g_pui8HIDInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The HID keyboard device initialization and customization structures. +// +//***************************************************************************** +tUSBDHIDKeyboardDevice g_sKeyboardDevice = +{ + USB_VID_TI_1CBE, + USB_PID_KEYBOARD, + 500, + USB_CONF_ATTR_SELF_PWR | USB_CONF_ATTR_RWAKE, + KeyboardHandler, + (void *)&g_sKeyboardDevice, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; diff --git a/boards/dk-tm4c129x/usb_dev_keyboard/usb_keyb_structs.h b/boards/dk-tm4c129x/usb_dev_keyboard/usb_keyb_structs.h new file mode 100644 index 0000000..21af08c --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_keyboard/usb_keyb_structs.h @@ -0,0 +1,35 @@ +//***************************************************************************** +// +// usb_keyb_structs.h - Data structures defining the keyboard USB device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_KEYB_STRUCTS_H_ +#define _USB_KEYB_STRUCTS_H_ + +extern uint32_t KeyboardHandler(void *pvCBData, + uint32_t ui32Event, + uint32_t ui32MsgData, + void *pvMsgData); + +extern tUSBDHIDKeyboardDevice g_sKeyboardDevice; + +#endif diff --git a/boards/dk-tm4c129x/usb_dev_msc/Makefile b/boards/dk-tm4c129x/usb_dev_msc/Makefile new file mode 100644 index 0000000..a244274 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/Makefile @@ -0,0 +1,98 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Mass Storage Class example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the Mass Storage Class example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_msc.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Mass Storage Class example. +# +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/frame.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/mmc-dk-tm4c129x.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/mx66l51235f.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/usb_dev_msc.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/usb_msc_structs.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/usbdspiflash.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_dev_msc.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_msc.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_msc.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_msc.axf: usb_dev_msc.ld +SCATTERgcc_usb_dev_msc=usb_dev_msc.ld +ENTRY_usb_dev_msc=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_dev_msc/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_dev_msc/ccs/.ccsimportspec new file mode 100644 index 0000000..0742128 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/ccs/.ccsimportspec @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_msc/ccs/.ccsproject b/boards/dk-tm4c129x/usb_dev_msc/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_msc/ccs/.cproject b/boards/dk-tm4c129x/usb_dev_msc/ccs/.cproject new file mode 100644 index 0000000..fcd0504 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/ccs/.cproject @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_msc/ccs/.project b/boards/dk-tm4c129x/usb_dev_msc/ccs/.project new file mode 100644 index 0000000..34a4a8e --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/ccs/.project @@ -0,0 +1,90 @@ + + + usb_dev_msc + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_msc/startup_ccs.c + + + usb_dev_msc.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.c + + + usb_dev_msc_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc_ccs.cmd + + + usb_msc_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_msc/usb_msc_structs.c + + + usbdspiflash.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_msc/usbdspiflash.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/mx66l51235f.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/mx66l51235f.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/fatfs/port/mmc-dk-tm4c129x.c + 1 + SW_ROOT/third_party/fatfs/port/mmc-dk-tm4c129x.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_dev_msc/ccs/Debug/usb_dev_msc.bin b/boards/dk-tm4c129x/usb_dev_msc/ccs/Debug/usb_dev_msc.bin new file mode 100644 index 0000000..be46b33 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_msc/ccs/Debug/usb_dev_msc.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_msc/ccs/Debug/usb_dev_msc.out b/boards/dk-tm4c129x/usb_dev_msc/ccs/Debug/usb_dev_msc.out new file mode 100644 index 0000000..a78f74f Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_msc/ccs/Debug/usb_dev_msc.out differ diff --git a/boards/dk-tm4c129x/usb_dev_msc/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_dev_msc/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_dev_msc/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_dev_msc/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin b/boards/dk-tm4c129x/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin new file mode 100644 index 0000000..260eafb Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_msc/ewarm/Exe/usb_dev_msc.out b/boards/dk-tm4c129x/usb_dev_msc/ewarm/Exe/usb_dev_msc.out new file mode 100644 index 0000000..7100957 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_msc/ewarm/Exe/usb_dev_msc.out differ diff --git a/boards/dk-tm4c129x/usb_dev_msc/gcc/usb_dev_msc.axf b/boards/dk-tm4c129x/usb_dev_msc/gcc/usb_dev_msc.axf new file mode 100644 index 0000000..b9d1be1 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_msc/gcc/usb_dev_msc.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_msc/gcc/usb_dev_msc.bin b/boards/dk-tm4c129x/usb_dev_msc/gcc/usb_dev_msc.bin new file mode 100644 index 0000000..0d8b44a Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_msc/gcc/usb_dev_msc.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_msc/readme.txt b/boards/dk-tm4c129x/usb_dev_msc/readme.txt new file mode 100644 index 0000000..6ec2e08 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/readme.txt @@ -0,0 +1,27 @@ +USB MSC Device + +This example application turns the evaluation board into a USB mass storage +class device. The application will use the onboard flash memory for the +storage media for the mass storage device. The screen will display the +current action occurring on the device ranging from disconnected, reading, +writing and idle. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_dev_msc/rvmdk/usb_dev_msc.axf b/boards/dk-tm4c129x/usb_dev_msc/rvmdk/usb_dev_msc.axf new file mode 100644 index 0000000..1779039 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_msc/rvmdk/usb_dev_msc.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_msc/rvmdk/usb_dev_msc.bin b/boards/dk-tm4c129x/usb_dev_msc/rvmdk/usb_dev_msc.bin new file mode 100644 index 0000000..662fac5 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_msc/rvmdk/usb_dev_msc.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_msc/startup_ccs.c b/boards/dk-tm4c129x/usb_dev_msc/startup_ccs.c new file mode 100644 index 0000000..ae3b438 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_msc/startup_ewarm.c b/boards/dk-tm4c129x/usb_dev_msc/startup_ewarm.c new file mode 100644 index 0000000..717a316 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_msc/startup_gcc.c b/boards/dk-tm4c129x/usb_dev_msc/startup_gcc.c new file mode 100644 index 0000000..db2ed7c --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_msc/startup_rvmdk.S b/boards/dk-tm4c129x/usb_dev_msc/startup_rvmdk.S new file mode 100644 index 0000000..78417bb --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.c b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.c new file mode 100644 index 0000000..f74c8b2 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.c @@ -0,0 +1,616 @@ +//***************************************************************************** +// +// usb_dev_msc.c - Main routines for the device mass storage class example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdmsc.h" +#include "utils/ustdlib.h" +#include "fatfs/src/diskio.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/mx66l51235f.h" +#include "drivers/pinout.h" +#include "usbdspiflash.h" +#include "usb_msc_structs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB MSC Device (usb_dev_msc)

      +//! +//! This example application turns the evaluation board into a USB mass storage +//! class device. The application will use the onboard flash memory for the +//! storage media for the mass storage device. The screen will display the +//! current action occurring on the device ranging from disconnected, reading, +//! writing and idle. +// +//***************************************************************************** + +//***************************************************************************** +// +// The number of ticks to wait before falling back to the idle state. Since +// the tick rate is 100Hz this is approximately 1 second. +// +//***************************************************************************** +#define USBMSC_ACTIVITY_TIMEOUT 100 + +//***************************************************************************** +// +// This enumeration holds the various states that the device can be in during +// normal operation. +// +//***************************************************************************** +volatile enum +{ + // + // Unconfigured. + // + MSC_DEV_DISCONNECTED, + + // + // Connected and fully enumerated but not currently handling a command. + // + MSC_DEV_IDLE, + + // + // Currently reading the device. + // + MSC_DEV_READ, + + // + // Currently writing the device. + // + MSC_DEV_WRITE, +} +g_eMSCState; + +//***************************************************************************** +// +// The Flags that handle updates to the status area to avoid drawing when no +// updates are required.. +// +//***************************************************************************** +#define FLAG_UPDATE_STATUS 1 +static uint32_t g_ui32Flags; +static uint32_t g_ui32IdleTimeout; + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//****************************************************************************** +// +// The DMA control structure table. +// +//****************************************************************************** +#ifdef ewarm +#pragma data_alignment=1024 +tDMAControlTable psDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(psDMAControlTable, 1024) +tDMAControlTable psDMAControlTable[64]; +#else +tDMAControlTable psDMAControlTable[64] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// A buffer used for updating the read/write counts. +// +//***************************************************************************** +static char g_pcBuffer[32]; + +//***************************************************************************** +// +// The system clock frequency in Hz. +// +//***************************************************************************** +uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Handles bulk driver notifications related to the receive channel (data from +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + return(0); +} + +//***************************************************************************** +// +// Handles bulk driver notifications related to the transmit channel (data to +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + return(0); +} + +//***************************************************************************** +// +// This function updates the status area of the screen. It uses the current +// state of the application to print the status area. +// +//***************************************************************************** +void +UpdateStatus(char *pcString) +{ + // + // Write the current state to the bottom of screen. + // + GrStringDrawCentered(&g_sContext, pcString, -1, 160, 78, true); +} + +//***************************************************************************** +// +// This function updates the read/write count area of the screen. +// +//***************************************************************************** +void +UpdateCount(uint32_t ui32Count, uint32_t ui32Y) +{ + // + // See if the count is at least a billion. + // + if(ui32Count > 999999999) + { + // + // Format the value with commas separating the billions, millions, + // thousands, and ones. + // + usnprintf(g_pcBuffer, sizeof(g_pcBuffer), " %d,%03d,%03d,%03d ", + ui32Count / 1000000000, (ui32Count / 1000000) % 1000, + (ui32Count / 1000) % 1000, ui32Count % 1000); + } + + // + // See if the count is at least a million. + // + else if(ui32Count > 999999) + { + // + // Format the value with commas separating the millions, thousands, and + // ones. + // + usnprintf(g_pcBuffer, sizeof(g_pcBuffer), " %d,%03d,%03d ", + (ui32Count / 1000000) % 1000, (ui32Count / 1000) % 1000, + ui32Count % 1000); + } + + // + // See if the count is at least a thousand. + // + else if(ui32Count > 999) + { + // + // Format the value with a comma separating the thousands and ones. + // + usnprintf(g_pcBuffer, sizeof(g_pcBuffer), " %d,%03d ", + (ui32Count / 1000) % 1000, ui32Count % 1000); + } + + // + // Otherwise the value is less than a thousand. + // + else + { + // + // Simply print the value. This will occur in two cases: at startup + // when the count is 0 and after the 32-bit count has rolled-over. In + // the later case, a large number of spaces are needed before and after + // the actual value in order to erase the text from the large value + // that preceeded the roll-over. + // + usnprintf(g_pcBuffer, sizeof(g_pcBuffer), " %d ", + ui32Count); + } + + // + // Draw the formatted string. + // + GrStringDrawCentered(&g_sContext, g_pcBuffer, -1, 160, ui32Y, true); +} + +//***************************************************************************** +// +// This function is the call back notification function provided to the USB +// library's mass storage class. +// +//***************************************************************************** +uint32_t +USBDMSCEventCallback(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgParam, + void *pvMsgData) +{ + // + // Reset the time out every time an event occurs. + // + g_ui32IdleTimeout = USBMSC_ACTIVITY_TIMEOUT; + + switch(ui32Event) + { + // + // Writing to the device. + // + case USBD_MSC_EVENT_WRITING: + { + // + // Only update if this is a change. + // + if(g_eMSCState != MSC_DEV_WRITE) + { + // + // Go to the write state. + // + g_eMSCState = MSC_DEV_WRITE; + + // + // Cause the main loop to update the screen. + // + g_ui32Flags |= FLAG_UPDATE_STATUS; + } + + break; + } + + // + // Reading from the device. + // + case USBD_MSC_EVENT_READING: + { + // + // Only update if this is a change. + // + if(g_eMSCState != MSC_DEV_READ) + { + // + // Go to the read state. + // + g_eMSCState = MSC_DEV_READ; + + // + // Cause the main loop to update the screen. + // + g_ui32Flags |= FLAG_UPDATE_STATUS; + } + + break; + } + + // + // The USB host has disconnected from the device. + // + case USB_EVENT_DISCONNECTED: + { + // + // Go to the disconnected state. + // + g_eMSCState = MSC_DEV_DISCONNECTED; + + // + // Cause the main loop to update the screen. + // + g_ui32Flags |= FLAG_UPDATE_STATUS; + + break; + } + + // + // The USB host has connected to the device. + // + case USB_EVENT_CONNECTED: + { + // + // Go to the idle state to wait for read/writes. + // + g_eMSCState = MSC_DEV_IDLE; + + break; + } + + case USBD_MSC_EVENT_IDLE: + default: + { + break; + } + } + + return(0); +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. This is to detect idle +// state for the SPI flash. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + if(g_ui32IdleTimeout != 0) + { + g_ui32IdleTimeout--; + } +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Read, ui32Write; + + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-dev-msc"); + + // + // Place the static status text on the display. + // + GrStringDrawCentered(&g_sContext, "Status", -1, 160, 58, false); + GrStringDrawCentered(&g_sContext, "Bytes Read", -1, 160, 118, false); + GrStringDrawCentered(&g_sContext, "Bytes Written", -1, 160, 178, false); + GrContextForegroundSet(&g_sContext, ClrGray); + UpdateCount(0, 138); + UpdateCount(0, 198); + + // + // Configure SysTick for a 100Hz interrupt. This is to detect idle state + // every 10ms after a state change. + // + ROM_SysTickPeriodSet(g_ui32SysClock / 100); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Configure and enable uDMA + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + SysCtlDelay(10); + ROM_uDMAControlBaseSet(&psDMAControlTable[0]); + ROM_uDMAEnable(); + + // + // Initialize the idle timeout and reset all flags. + // + g_ui32IdleTimeout = 0; + g_ui32Flags = 0; + + // + // Initialize the state to idle. + // + g_eMSCState = MSC_DEV_DISCONNECTED; + + // + // Draw the status bar and set it to idle. + // + UpdateStatus("Disconnected"); + + // + // Enable the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Enable the SSI3 used by SPI flash. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI3); + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_SSI3); + + // + // Set the USB stack mode to Device mode with VBUS monitoring. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Pass our device information to the USB library and place the device + // on the bus. + // + USBDMSCInit(0, (tUSBDMSCDevice*)&g_sMSCDevice); + + // + // Initialize the SD card, if present. This prevents it from interfering + // with accesses to the SPI flash. + // + disk_initialize(0); + + // + // Initialize MX66L51235F Flash memory. + // + MX66L51235FInit(g_ui32SysClock); + + // + // Drop into the main loop. + // + ui32Read = g_ui32ReadCount; + ui32Write = g_ui32WriteCount; + while(1) + { + switch(g_eMSCState) + { + case MSC_DEV_READ: + { + // + // Update the screen if necessary. + // + if(g_ui32Flags & FLAG_UPDATE_STATUS) + { + UpdateStatus(" Reading "); + g_ui32Flags &= ~FLAG_UPDATE_STATUS; + } + + // + // If there is no activity then return to the idle state. + // + if(g_ui32IdleTimeout == 0) + { + UpdateStatus(" Idle "); + g_eMSCState = MSC_DEV_IDLE; + } + + break; + } + + case MSC_DEV_WRITE: + { + // + // Update the screen if necessary. + // + if(g_ui32Flags & FLAG_UPDATE_STATUS) + { + UpdateStatus(" Writing "); + g_ui32Flags &= ~FLAG_UPDATE_STATUS; + } + + // + // If there is no activity then return to the idle state. + // + if(g_ui32IdleTimeout == 0) + { + UpdateStatus(" Idle "); + g_eMSCState = MSC_DEV_IDLE; + } + break; + } + + case MSC_DEV_DISCONNECTED: + { + // + // Update the screen if necessary. + // + if(g_ui32Flags & FLAG_UPDATE_STATUS) + { + UpdateStatus(" Disconnected "); + g_ui32Flags &= ~FLAG_UPDATE_STATUS; + } + break; + } + + case MSC_DEV_IDLE: + { + break; + } + + default: + { + break; + } + } + + // + // Update the read count if it has changed. + // + if(g_ui32ReadCount != ui32Read) + { + ui32Read = g_ui32ReadCount; + UpdateCount(ui32Read, 138); + } + + // + // Update the write count if it has changed. + // + if(g_ui32WriteCount != ui32Write) + { + ui32Write = g_ui32WriteCount; + UpdateCount(ui32Write, 198); + } + } +} diff --git a/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ewd b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ewp b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ewp new file mode 100644 index 0000000..578cce1 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ewp @@ -0,0 +1,818 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + + + $PROJ_DIR$\..\drivers\mx66l51235f.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_dev_msc.c + + + $PROJ_DIR$\usb_msc_structs.c + + + $PROJ_DIR$\usbdspiflash.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.icf b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.icf new file mode 100644 index 0000000..1334e92 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_msc.icf - Linker configuration file for usb_dev_msc. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ld b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ld new file mode 100644 index 0000000..351f499 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_msc.ld - Linker configuration file for usb_dev_msc. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.sct b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.sct new file mode 100644 index 0000000..e6f5cd5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_msc.sct - Linker configuration file for usb_dev_msc. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.uvopt b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.uvopt new file mode 100644 index 0000000..461345c --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.uvopt @@ -0,0 +1,429 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_msc + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + mmc-dk-tm4c129x.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\mx66l51235f.c + mx66l51235f.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_msc.c + usb_dev_msc.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_msc_structs.c + usb_msc_structs.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usbdspiflash.c + usbdspiflash.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 12 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 14 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.uvproj b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.uvproj new file mode 100644 index 0000000..45667a7 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc.uvproj @@ -0,0 +1,474 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_msc + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_msc + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_msc.bin .\rvmdk\usb_dev_msc.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_msc.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + mmc-dk-tm4c129x.c + 1 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + + + mx66l51235f.c + 1 + ..\drivers\mx66l51235f.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_dev_msc.c + 1 + .\usb_dev_msc.c + + + usb_msc_structs.c + 1 + .\usb_msc_structs.c + + + usbdspiflash.c + 1 + .\usbdspiflash.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc_ccs.cmd b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc_ccs.cmd new file mode 100644 index 0000000..e3e7e08 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usb_dev_msc_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_msc_ccs.cmd - CCS linker configuration file for usb_dev_msc. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/usb_dev_msc/usb_msc_structs.c b/boards/dk-tm4c129x/usb_dev_msc/usb_msc_structs.c new file mode 100644 index 0000000..268b905 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usb_msc_structs.c @@ -0,0 +1,184 @@ +//***************************************************************************** +// +// usb_bulk_structs.c - Data structures defining the mass storage USB device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdmsc.h" +#include "usb_msc_structs.h" +#include "usbdspiflash.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'M', 0, 'a', 0, 's', 0, 's', 0, ' ', 0, 'S', 0, 't', 0, 'o', 0, 'r', 0, + 'a', 0, 'g', 0, 'e', 0, ' ', 0, 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, + 'e', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The data interface description string. +// +//***************************************************************************** +const uint8_t g_pui8DataInterfaceString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, + 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (23 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, 'i', 0, 'g', 0, + 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8DataInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The bulk device initialization and customization structures. In this case, +// we are using USBBuffers between the bulk device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the bulk channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our bulk instance structure. +// +//***************************************************************************** +tUSBDMSCDevice g_sMSCDevice = +{ + // + // Vendor ID. + // + USB_VID_TI_1CBE, + + // + // Product ID. + // + USB_PID_MSC, + + // + // Vendor Information. + // + "TI ", + + // + // Product Identification. + // + "Mass Storage ", + + // + // Revision. + // + "1.00", + 500, + USB_CONF_ATTR_SELF_PWR, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS, + { + USBDMSCStorageOpen, + USBDMSCStorageClose, + USBDMSCStorageRead, + USBDMSCStorageWrite, + USBDMSCStorageNumBlocks, + USBDMSCStorageBlockSize + }, + USBDMSCEventCallback +}; diff --git a/boards/dk-tm4c129x/usb_dev_msc/usb_msc_structs.h b/boards/dk-tm4c129x/usb_dev_msc/usb_msc_structs.h new file mode 100644 index 0000000..3d272ab --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usb_msc_structs.h @@ -0,0 +1,46 @@ +//***************************************************************************** +// +// usb_msc_structs.h - Data structures defining the mass storage USB device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __USB_MSC_STRUCTS_H__ +#define __USB_MSC_STRUCTS_H__ + +//***************************************************************************** +// +// The mass storage class device structure. +// +//***************************************************************************** +extern tUSBDMSCDevice g_sMSCDevice; + +//***************************************************************************** +// +// The externally provided mass storage class event call back function. +// +//***************************************************************************** +extern uint32_t USBDMSCEventCallback(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgParam, + void *pvMsgData); + + + +#endif diff --git a/boards/dk-tm4c129x/usb_dev_msc/usbdspiflash.c b/boards/dk-tm4c129x/usb_dev_msc/usbdspiflash.c new file mode 100644 index 0000000..e186e13 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usbdspiflash.c @@ -0,0 +1,259 @@ +//***************************************************************************** +// +// usbdspiflash.c - Routines supplied for use by the mass storage class device +// class. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/debug.h" +#include "driverlib/sysctl.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/systick.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdmsc.h" +#include "usb_msc_structs.h" +#include "drivers/mx66l51235f.h" + +#define SPIFLASH_IN_USE 0x00000001 + +struct +{ + uint32_t ulFlags; +} +g_sDriveInformation; + +//***************************************************************************** +// +// The number of bytes that have been read from the SPI flash. +// +//***************************************************************************** +uint32_t g_ui32ReadCount; + +//***************************************************************************** +// +// The number of bytes that have been written to the SPI flash. +// +//***************************************************************************** +uint32_t g_ui32WriteCount; + +//***************************************************************************** +// +// This function opens the drive number and prepares it for use by the Mass +// storage class device. +// +// \param ulDrive is the driver number to open. +// +// This function is used to initialize and open the physical drive number +// associated with the parameter \e ulDrive. The function will return zero if +// the drive has already been opened. +// +// \return Returns a pointer to data that should be passed to other APIs or it +// will return 0 if no drive was found. +// +//***************************************************************************** +void * +USBDMSCStorageOpen(uint32_t ulDrive) +{ + ASSERT(ulDrive == 0); + + // + // Return if already in use. + // + if(g_sDriveInformation.ulFlags & SPIFLASH_IN_USE) + { + return(0); + } + + // + // Flash is in use. + // + g_sDriveInformation.ulFlags = SPIFLASH_IN_USE; + + return((void *)&g_sDriveInformation); +} + +//***************************************************************************** +// +// This function close the drive number in use by the mass storage class device. +// +// \param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// +// This function is used to close the physical drive number associated with the +// parameter \e pvDrive. This function will return 0 if the drive was closed +// successfully and any other value will indicate a failure. +// +// \return Returns 0 if the drive was successfully closed or non-zero for a +// failure. +// +//***************************************************************************** +void +USBDMSCStorageClose(void *pvDrive) +{ + ASSERT(pvDrive != 0); + + // + // Clear all flags. + // + g_sDriveInformation.ulFlags = 0; + +} + +//***************************************************************************** +// +// This function will read a block from a device opened by the +// USBDMSCStorageOpen() call. +// +// \param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// \param pucData is the buffer that data will be written into. +// \param ui32NumBlocks is the number of blocks to read. +// +// This function is use to read blocks from a physical device and return them +// in the \e pucData buffer. The data area pointed to by \e pucData should be +// at least \e ui32NumBlocks * Block Size bytes to prevent overwriting data. +// +// \return Returns the number of bytes that were read from the device. +// +//***************************************************************************** +uint32_t +USBDMSCStorageRead(void *pvDrive, uint8_t *pui8Data, uint32_t ui32Sector, + uint32_t ui32NumBlocks) +{ + ASSERT(pvDrive != 0); + + g_ui32ReadCount += ui32NumBlocks * MX66L51235F_BLOCK_SIZE; + + MX66L51235FRead(ui32Sector * MX66L51235F_BLOCK_SIZE, pui8Data, + ui32NumBlocks * MX66L51235F_BLOCK_SIZE); + + return(ui32NumBlocks * MX66L51235F_BLOCK_SIZE); +} + +//***************************************************************************** +// +// This function will write a block to a device opened by the +// USBDMSCStorageOpen() call. +// +// \param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// \param pucData is the buffer that data will be used for writing. +// \param ui32NumBlocks is the number of blocks to write. +// +// This function is use to write blocks to a physical device from the buffer +// pointed to by the \e pucData buffer. If the number of blocks is greater +// than one then the block address will increment and write to the next block +// until \e ui32NumBlocks * Block Size bytes have been written. +// +// \return Returns the number of bytes that were written to the device. +// +//***************************************************************************** +uint32_t +USBDMSCStorageWrite(void *pvDrive, uint8_t *pui8Data, uint32_t ui32Sector, + uint32_t ui32NumBlocks) +{ + uint32_t ui32Idx, ui32BlockAddr; + uint32_t ui32PageIdx; + + ASSERT(pvDrive != 0); + + g_ui32WriteCount += ui32NumBlocks * MX66L51235F_BLOCK_SIZE; + + for(ui32Idx = 0; ui32Idx < ui32NumBlocks; ui32Idx++) + { + // + // each block is 4K(0x1000) bytes + // + ui32BlockAddr = (ui32Sector + ui32Idx) * MX66L51235F_BLOCK_SIZE; + + // + // erase the block + // + MX66L51235FSectorErase(ui32BlockAddr); + + // + // program the block one page(256 bytes) a time + // + for(ui32PageIdx = 0; ui32PageIdx < (MX66L51235F_BLOCK_SIZE / 256); + ui32PageIdx++) + { + MX66L51235FPageProgram((ui32BlockAddr + (ui32PageIdx * 256)), + (pui8Data + + (ui32Idx * MX66L51235F_BLOCK_SIZE) + + (ui32PageIdx * 256)), 256); + } + } + + return(ui32NumBlocks * MX66L51235F_BLOCK_SIZE); +} + +//***************************************************************************** +// +// This function will return the number of blocks present on a device. +// +// \param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// +// This function is used to return the total number of blocks on a physical +// device based on the \e pvDrive parameter. +// +// \return Returns the number of blocks that are present in a device. +// +//***************************************************************************** +uint32_t +USBDMSCStorageNumBlocks(void *pvDrive) +{ + // + // return number of blocks. + // + return(MX66L51235F_MEMORY_SIZE / MX66L51235F_BLOCK_SIZE); +} + +//***************************************************************************** +// +// This function will return the block size on a device. +// +// \param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// +// This function is used to return the block size on a physical +// device based on the \e pvDrive parameter. +// +// \return Returns the block size for a device. +// +//***************************************************************************** +uint32_t +USBDMSCStorageBlockSize(void *pvDrive) +{ + // + // return block size. + // + return(MX66L51235F_BLOCK_SIZE); +} diff --git a/boards/dk-tm4c129x/usb_dev_msc/usbdspiflash.h b/boards/dk-tm4c129x/usb_dev_msc/usbdspiflash.h new file mode 100644 index 0000000..4c04dce --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_msc/usbdspiflash.h @@ -0,0 +1,47 @@ +//***************************************************************************** +// +// usbdspiflash.h - Prototypes for functions supplied for use by the mass +// storage class device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __USBDSPIFLASH_H__ +#define __USBDSPIFLASH_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern uint32_t g_ui32ReadCount; +extern uint32_t g_ui32WriteCount; +extern void *USBDMSCStorageOpen(uint32_t ui32Drive); +extern void USBDMSCStorageClose(void *pvDrive); +extern uint32_t USBDMSCStorageRead(void *pvDrive, uint8_t *pui8Data, + uint32_t ui32Sector, + uint32_t ui32NumBlocks); +extern uint32_t USBDMSCStorageWrite(void *pvDrive, uint8_t *pui8Data, + uint32_t ui32Sector, + uint32_t ui32NumBlocks); +uint32_t USBDMSCStorageNumBlocks(void *pvDrive); +uint32_t USBDMSCStorageBlockSize(void *pvDrive); + +#endif // __USBDSPIFLASH_H__ diff --git a/boards/dk-tm4c129x/usb_dev_serial/Makefile b/boards/dk-tm4c129x/usb_dev_serial/Makefile new file mode 100644 index 0000000..785ef74 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/Makefile @@ -0,0 +1,93 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device serial example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device serial example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_serial.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device serial example. +# +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/frame.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/usb_dev_serial.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/usb_serial_structs.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_dev_serial.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_serial.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_serial.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_serial.axf: usb_dev_serial.ld +SCATTERgcc_usb_dev_serial=usb_dev_serial.ld +ENTRY_usb_dev_serial=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_dev_serial/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_dev_serial/ccs/.ccsimportspec new file mode 100644 index 0000000..c5ecbbf --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_serial/ccs/.ccsproject b/boards/dk-tm4c129x/usb_dev_serial/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_serial/ccs/.cproject b/boards/dk-tm4c129x/usb_dev_serial/ccs/.cproject new file mode 100644 index 0000000..9188475 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/ccs/.cproject @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_serial/ccs/.project b/boards/dk-tm4c129x/usb_dev_serial/ccs/.project new file mode 100644 index 0000000..c78f782 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/ccs/.project @@ -0,0 +1,75 @@ + + + usb_dev_serial + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_serial/startup_ccs.c + + + usb_dev_serial.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.c + + + usb_dev_serial_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial_ccs.cmd + + + usb_serial_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_dev_serial/usb_serial_structs.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_dev_serial/ccs/Debug/usb_dev_serial.bin b/boards/dk-tm4c129x/usb_dev_serial/ccs/Debug/usb_dev_serial.bin new file mode 100644 index 0000000..129e069 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_serial/ccs/Debug/usb_dev_serial.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_serial/ccs/Debug/usb_dev_serial.out b/boards/dk-tm4c129x/usb_dev_serial/ccs/Debug/usb_dev_serial.out new file mode 100644 index 0000000..d4bbe87 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_serial/ccs/Debug/usb_dev_serial.out differ diff --git a/boards/dk-tm4c129x/usb_dev_serial/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_dev_serial/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_dev_serial/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_dev_serial/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin b/boards/dk-tm4c129x/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin new file mode 100644 index 0000000..c08c90f Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_serial/ewarm/Exe/usb_dev_serial.out b/boards/dk-tm4c129x/usb_dev_serial/ewarm/Exe/usb_dev_serial.out new file mode 100644 index 0000000..2974c9a Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_serial/ewarm/Exe/usb_dev_serial.out differ diff --git a/boards/dk-tm4c129x/usb_dev_serial/gcc/usb_dev_serial.axf b/boards/dk-tm4c129x/usb_dev_serial/gcc/usb_dev_serial.axf new file mode 100644 index 0000000..5b6534b Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_serial/gcc/usb_dev_serial.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_serial/gcc/usb_dev_serial.bin b/boards/dk-tm4c129x/usb_dev_serial/gcc/usb_dev_serial.bin new file mode 100644 index 0000000..4e4a7b3 Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_serial/gcc/usb_dev_serial.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_serial/readme.txt b/boards/dk-tm4c129x/usb_dev_serial/readme.txt new file mode 100644 index 0000000..eb3c4f8 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/readme.txt @@ -0,0 +1,39 @@ +USB Serial Device + +This example application turns the development kit into a virtual serial +port when connected to the USB host system. The application supports the +USB Communication Device Class, Abstract Control Model to redirect UART0 +traffic to and from the USB host system. + +The application can be recompiled to run using and external USB phy to +implement a high speed device using an external USB phy. To use the +external phy the application must be built with \b USE_ULPI defined. This +disables the internal phy and the connector on the DK-TM4C129X board and +enables the connections to the external ULPI phy pins on the DK-TM4C129X +board. + +Assuming you installed TivaWare in the default directory, a +driver information (INF) file for use with Windows XP, Windows Vista and +Windows7 can be found in C:/ti/TivaWare-for-C-Series/windows_drivers. +For Windows 2000, the required INF file is in +C:/ti/TivaWare-for-C-Series/windows_drivers/win2K. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_dev_serial/rvmdk/usb_dev_serial.axf b/boards/dk-tm4c129x/usb_dev_serial/rvmdk/usb_dev_serial.axf new file mode 100644 index 0000000..003d03c Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_serial/rvmdk/usb_dev_serial.axf differ diff --git a/boards/dk-tm4c129x/usb_dev_serial/rvmdk/usb_dev_serial.bin b/boards/dk-tm4c129x/usb_dev_serial/rvmdk/usb_dev_serial.bin new file mode 100644 index 0000000..f9ea72c Binary files /dev/null and b/boards/dk-tm4c129x/usb_dev_serial/rvmdk/usb_dev_serial.bin differ diff --git a/boards/dk-tm4c129x/usb_dev_serial/startup_ccs.c b/boards/dk-tm4c129x/usb_dev_serial/startup_ccs.c new file mode 100644 index 0000000..ae6ce33 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_serial/startup_ewarm.c b/boards/dk-tm4c129x/usb_dev_serial/startup_ewarm.c new file mode 100644 index 0000000..1f8b909 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_serial/startup_gcc.c b/boards/dk-tm4c129x/usb_dev_serial/startup_gcc.c new file mode 100644 index 0000000..750c565 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_dev_serial/startup_rvmdk.S b/boards/dk-tm4c129x/usb_dev_serial/startup_rvmdk.S new file mode 100644 index 0000000..408be55 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN USBUARTIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD USBUARTIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.c b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.c new file mode 100644 index 0000000..a31e163 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.c @@ -0,0 +1,1455 @@ +//***************************************************************************** +// +// usb_dev_serial.c - Main routines for the USB CDC serial example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_uart.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/timer.h" +#include "driverlib/uart.h" +#include "driverlib/usb.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "utils/ustdlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "usb_serial_structs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Serial Device (usb_dev_serial)

      +//! +//! This example application turns the development kit into a virtual serial +//! port when connected to the USB host system. The application supports the +//! USB Communication Device Class, Abstract Control Model to redirect UART0 +//! traffic to and from the USB host system. +//! +//! The application can be recompiled to run using and external USB phy to +//! implement a high speed device using an external USB phy. To use the +//! external phy the application must be built with \b USE_ULPI defined. This +//! disables the internal phy and the connector on the DK-TM4C129X board and +//! enables the connections to the external ULPI phy pins on the DK-TM4C129X +//! board. +//! +//! Assuming you installed TivaWare in the default directory, a +//! driver information (INF) file for use with Windows XP, Windows Vista and +//! Windows7 can be found in C:/ti/TivaWare-for-C-Series/windows_drivers. +//! For Windows 2000, the required INF file is in +//! C:/ti/TivaWare-for-C-Series/windows_drivers/win2K. +// +//***************************************************************************** + +//***************************************************************************** +// +// Note: +// +// This example is intended to run on Tiva C Series evaluation kit hardware +// where the UARTs are wired solely for TX and RX, and do not have GPIOs +// connected to act as handshake signals. As a result, this example mimics +// the case where communication is always possible. It reports DSR, DCD +// and CTS as high to ensure that the USB host recognizes that data can be +// sent and merely ignores the host's requested DTR and RTS states. "TODO" +// comments in the code indicate where code would be required to add support +// for real handshakes. +// +//***************************************************************************** + + +//***************************************************************************** +// +// Configuration and tuning parameters. +// +//***************************************************************************** + +//***************************************************************************** +// +// The system tick rate expressed both as ticks per second and a millisecond +// period. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 + +//***************************************************************************** +// +// The UART peripheral clock rate. +// +//***************************************************************************** +#define UART_CLOCK 16000000 + +//***************************************************************************** +// +// Variables tracking transmit and receive counts. +// +//***************************************************************************** +static volatile uint32_t g_ui32UARTTxCount; +static volatile uint32_t g_ui32UARTRxCount; +#ifdef DEBUG +uint32_t g_ui32UARTRxErrors; +#endif + +//***************************************************************************** +// +// The base address, peripheral ID and interrupt ID of the UART that is to +// be redirected. +// +//***************************************************************************** + +//***************************************************************************** +// +// Default line coding settings for the redirected UART. +// +//***************************************************************************** +#define DEFAULT_BIT_RATE 115200 +#define DEFAULT_UART_CONFIG (UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | \ + UART_CONFIG_STOP_ONE) + +//***************************************************************************** +// +// Global system tick counter +// +//***************************************************************************** +static volatile uint32_t g_ui32SysTickCount = 0; + +//***************************************************************************** +// +// Graphics context used to show text on the color STN display. +// +//***************************************************************************** +static tContext g_sContext; +#define TEXT_FONT g_psFontCmss22b +#define TEXT_HEIGHT (GrFontHeightGet(TEXT_FONT)) +#define BUFFER_METER_HEIGHT TEXT_HEIGHT +#define BUFFER_METER_WIDTH 150 + +//***************************************************************************** +// +// Flags used to pass commands from interrupt context to the main loop. +// +//***************************************************************************** +#define FLAG_STATUS_UPDATE 0 +#define FLAG_USB_CONFIGURED 1 +#define FLAG_SENDING_BREAK 2 +static volatile uint32_t g_ui32Flags; + +//***************************************************************************** +// +// Global pointer to the current status string. +// +//***************************************************************************** +static char *g_pcStatus; + +//***************************************************************************** +// +// Internal function prototypes. +// +//***************************************************************************** +static void USBUARTPrimeTransmit(uint32_t ui32Base); +static void CheckForSerialStateChange(const tUSBDCDCDevice *psDevice, + uint32_t ui32Errors); +static void SetControlLineState(uint16_t ui16State); +static bool SetLineCoding(tLineCoding *psLineCoding, uint32_t ui32UARTClock); +static void GetLineCoding(tLineCoding *psLineCoding, uint32_t ui32UARTClock); +static void SendBreak(bool bSend); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + while(1) + { + } +} +#endif + +//***************************************************************************** +// +// This function is called whenever serial data is received from the UART. +// It is passed the accumulated error flags from each character received in +// this interrupt and determines from them whether or not an interrupt +// notification to the host is required. +// +// If a notification is required and the control interrupt endpoint is idle, +// we send the notification immediately. If the endpoint is not idle, we +// accumulate the errors in a global variable which will be checked on +// completion of the previous notification and used to send a second one +// if necessary. +// +//***************************************************************************** +static void +CheckForSerialStateChange(const tUSBDCDCDevice *psDevice, uint32_t ui32Errors) +{ + uint16_t ui16SerialState; + + // + // Clear our USB serial state. Since we are faking the handshakes, always + // set the TXCARRIER (DSR) and RXCARRIER (DCD) bits. + // + ui16SerialState = USB_CDC_SERIAL_STATE_TXCARRIER | + USB_CDC_SERIAL_STATE_RXCARRIER; + + // + // Are any error bits set? + // + if(ui32Errors) + { + // + // At least one error is being notified so translate from our hardware + // error bits into the correct state markers for the USB notification. + // + if(ui32Errors & UART_DR_OE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_OVERRUN; + } + + if(ui32Errors & UART_DR_PE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_PARITY; + } + + if(ui32Errors & UART_DR_FE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_FRAMING; + } + + if(ui32Errors & UART_DR_BE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_BREAK; + } + + // + // Call the CDC driver to notify the state change. + // + USBDCDCSerialStateChange((void *)psDevice, ui16SerialState); + } +} + +//***************************************************************************** +// +// Read as many characters from the UART FIFO as we can and move them into +// the CDC transmit buffer. +// +// \return Returns UART error flags read during data reception. +// +//***************************************************************************** +static uint32_t +ReadUARTData(void) +{ + int32_t i32Char; + int8_t ui8Char; + uint32_t ui32Space, ui32Errors; + + // + // Clear our error indicator. + // + ui32Errors = 0; + + // + // How much space do we have in the buffer? + // + ui32Space = USBBufferSpaceAvailable((tUSBBuffer *)&g_sTxBuffer); + + // + // Read data from the UART FIFO until there is none left or we run + // out of space in our receive buffer. + // + while(ui32Space && UARTCharsAvail(UART0_BASE)) + { + // + // Read a character from the UART FIFO into the ring buffer if no + // errors are reported. + // + i32Char = UARTCharGetNonBlocking(UART0_BASE); + + // + // If the character did not contain any error notifications, + // copy it to the output buffer. + // + if(!(i32Char & ~0xFF)) + { + ui8Char = (unsigned char)(i32Char & 0xFF); + USBBufferWrite((tUSBBuffer *)&g_sTxBuffer, + (unsigned char *)&ui8Char, 1); + + // + // Decrement the number of bytes we know the buffer can accept. + // + ui32Space--; + } + else + { +#ifdef DEBUG + // + // Increment our receive error counter. + // + g_ui32UARTRxErrors++; +#endif + // + // Update our error accumulator. + // + ui32Errors |= i32Char; + } + + // + // Update our count of bytes received via the UART. + // + g_ui32UARTRxCount++; + } + + // + // Pass back the accumulated error indicators. + // + return(ui32Errors); +} + +//***************************************************************************** +// +// Take as many bytes from the transmit buffer as we have space for and move +// them into the USB UART's transmit FIFO. +// +//***************************************************************************** +static void +USBUARTPrimeTransmit(uint32_t ui32Base) +{ + uint32_t ui32Read; + uint8_t ui8Char; + + // + // If we are currently sending a break condition, don't receive any + // more data. We will resume transmission once the break is turned off. + // + if(HWREGBITW(&g_ui32Flags, FLAG_SENDING_BREAK)) + { + return; + } + + // + // If there is space in the UART FIFO, try to read some characters + // from the receive buffer to fill it again. + // + while(UARTSpaceAvail(ui32Base)) + { + // + // Get a character from the buffer. + // + ui32Read = USBBufferRead((tUSBBuffer *)&g_sRxBuffer, &ui8Char, 1); + + // + // Did we get a character? + // + if(ui32Read) + { + // + // Place the character in the UART transmit FIFO. + // + ROM_UARTCharPutNonBlocking(ui32Base, ui8Char); + + // + // Update our count of bytes transmitted via the UART. + // + g_ui32UARTTxCount++; + } + else + { + // + // We ran out of characters so exit the function. + // + return; + } + } +} + +//***************************************************************************** +// +// Interrupt handler for the system tick counter. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Update our system time. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// Interrupt handler for the UART which we are redirecting via USB. +// +//***************************************************************************** +void +USBUARTIntHandler(void) +{ + uint32_t ui32Ints, ui32Errors; + + // + // Get and clear the current interrupt source(s) + // + ui32Ints = ROM_UARTIntStatus(UART0_BASE, true); + ROM_UARTIntClear(UART0_BASE, ui32Ints); + + // + // Are we being interrupted because the TX FIFO has space available? + // + if(ui32Ints & UART_INT_TX) + { + // + // Move as many bytes as we can into the transmit FIFO. + // + USBUARTPrimeTransmit(UART0_BASE); + + // + // If the output buffer is empty, turn off the transmit interrupt. + // + if(!USBBufferDataAvailable(&g_sRxBuffer)) + { + ROM_UARTIntDisable(UART0_BASE, UART_INT_TX); + } + } + + // + // Handle receive interrupts. + // + if(ui32Ints & (UART_INT_RX | UART_INT_RT)) + { + // + // Read the UART's characters into the buffer. + // + ui32Errors = ReadUARTData(); + + // + // Check to see if we need to notify the host of any errors we just + // detected. + // + CheckForSerialStateChange(&g_sCDCDevice, ui32Errors); + } +} + +//***************************************************************************** +// +// Set the state of the RS232 RTS and DTR signals. +// +//***************************************************************************** +static void +SetControlLineState(uint16_t ui16State) +{ + // + // TODO: If configured with GPIOs controlling the handshake lines, + // set them appropriately depending upon the flags passed in the wValue + // field of the request structure passed. + // +} + +//***************************************************************************** +// +// Set the communication parameters to use on the UART. +// +//***************************************************************************** +static bool +SetLineCoding(tLineCoding *psLineCoding, uint32_t ui32UARTClock) +{ + uint32_t ui32Config; + bool bRetcode; + + // + // Assume everything is OK until we detect any problem. + // + bRetcode = true; + + // + // Word length. For invalid values, the default is to set 8 bits per + // character and return an error. + // + switch(psLineCoding->ui8Databits) + { + case 5: + { + ui32Config = UART_CONFIG_WLEN_5; + break; + } + + case 6: + { + ui32Config = UART_CONFIG_WLEN_6; + break; + } + + case 7: + { + ui32Config = UART_CONFIG_WLEN_7; + break; + } + + case 8: + { + ui32Config = UART_CONFIG_WLEN_8; + break; + } + + default: + { + ui32Config = UART_CONFIG_WLEN_8; + bRetcode = false; + break; + } + } + + // + // Parity. For any invalid values, we set no parity and return an error. + // + switch(psLineCoding->ui8Parity) + { + case USB_CDC_PARITY_NONE: + { + ui32Config |= UART_CONFIG_PAR_NONE; + break; + } + + case USB_CDC_PARITY_ODD: + { + ui32Config |= UART_CONFIG_PAR_ODD; + break; + } + + case USB_CDC_PARITY_EVEN: + { + ui32Config |= UART_CONFIG_PAR_EVEN; + break; + } + + case USB_CDC_PARITY_MARK: + { + ui32Config |= UART_CONFIG_PAR_ONE; + break; + } + + case USB_CDC_PARITY_SPACE: + { + ui32Config |= UART_CONFIG_PAR_ZERO; + break; + } + + default: + { + ui32Config |= UART_CONFIG_PAR_NONE; + bRetcode = false; + break; + } + } + + // + // Stop bits. Our hardware only supports 1 or 2 stop bits whereas CDC + // allows the host to select 1.5 stop bits. If passed 1.5 (or any other + // invalid or unsupported value of ucStop, we set up for 1 stop bit but + // return an error in case the caller needs to Stall or otherwise report + // this back to the host. + // + switch(psLineCoding->ui8Stop) + { + // + // One stop bit requested. + // + case USB_CDC_STOP_BITS_1: + { + ui32Config |= UART_CONFIG_STOP_ONE; + break; + } + + // + // Two stop bits requested. + // + case USB_CDC_STOP_BITS_2: + { + ui32Config |= UART_CONFIG_STOP_TWO; + break; + } + + // + // Other cases are either invalid values of ucStop or values that we + // cannot support so set 1 stop bit but return an error. + // + default: + { + ui32Config = UART_CONFIG_STOP_ONE; + bRetcode |= false; + break; + } + } + + // + // Set the UART mode appropriately. + // + ROM_UARTConfigSetExpClk(UART0_BASE, ui32UARTClock, + psLineCoding->ui32Rate, ui32Config); + + // + // Let the caller know if we had a problem or not. + // + return(bRetcode); +} + +//***************************************************************************** +// +// Get the communication parameters in use on the UART. +// +//***************************************************************************** +static void +GetLineCoding(tLineCoding *psLineCoding, uint32_t ui32UARTClock) +{ + uint32_t ui32Config, ui32Rate; + + // + // Get the current line coding set in the UART. + // + ROM_UARTConfigGetExpClk(UART0_BASE, ui32UARTClock, &ui32Rate, + &ui32Config); + psLineCoding->ui32Rate = ui32Rate; + + // + // Translate the configuration word length field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_WLEN_MASK) + { + case UART_CONFIG_WLEN_8: + { + psLineCoding->ui8Databits = 8; + break; + } + + case UART_CONFIG_WLEN_7: + { + psLineCoding->ui8Databits = 7; + break; + } + + case UART_CONFIG_WLEN_6: + { + psLineCoding->ui8Databits = 6; + break; + } + + case UART_CONFIG_WLEN_5: + { + psLineCoding->ui8Databits = 5; + break; + } + } + + // + // Translate the configuration parity field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_PAR_MASK) + { + case UART_CONFIG_PAR_NONE: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_NONE; + break; + } + + case UART_CONFIG_PAR_ODD: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_ODD; + break; + } + + case UART_CONFIG_PAR_EVEN: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_EVEN; + break; + } + + case UART_CONFIG_PAR_ONE: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_MARK; + break; + } + + case UART_CONFIG_PAR_ZERO: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_SPACE; + break; + } + } + + // + // Translate the configuration stop bits field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_STOP_MASK) + { + case UART_CONFIG_STOP_ONE: + { + psLineCoding->ui8Stop = USB_CDC_STOP_BITS_1; + break; + } + + case UART_CONFIG_STOP_TWO: + { + psLineCoding->ui8Stop = USB_CDC_STOP_BITS_2; + break; + } + } +} + +//***************************************************************************** +// +// This function sets or clears a break condition on the redirected UART RX +// line. A break is started when the function is called with \e bSend set to +// \b true and persists until the function is called again with \e bSend set +// to \b false. +// +//***************************************************************************** +static void +SendBreak(bool bSend) +{ + // + // Are we being asked to start or stop the break condition? + // + if(!bSend) + { + // + // Remove the break condition on the line. + // + ROM_UARTBreakCtl(UART0_BASE, false); + HWREGBITW(&g_ui32Flags, FLAG_SENDING_BREAK) = 0; + } + else + { + // + // Start sending a break condition on the line. + // + ROM_UARTBreakCtl(UART0_BASE, true); + HWREGBITW(&g_ui32Flags, FLAG_SENDING_BREAK) = 1; + } +} + +//***************************************************************************** +// +// Shows the status string on the color STN display. +// +// \param psContext is a pointer to the graphics context representing the +// display. +// \param pcStatus is a pointer to the string to be shown. +// +//***************************************************************************** +void +DisplayStatus(tContext *psContext, char *pcStatus) +{ + tRectangle rectLine; + int32_t i32Y; + + // + // Calculate the Y coordinate of the top left of the character cell + // for our line of text. + // + i32Y = (GrContextDpyHeightGet(psContext) / 4) - + (GrFontHeightGet(TEXT_FONT) / 2); + + // + // Determine the bounding rectangle for this line of text. We add 4 pixels + // to the height just to ensure that we clear a couple of pixels above and + // below the line of text. + // + rectLine.i16XMin = 0; + rectLine.i16XMax = GrContextDpyWidthGet(psContext) - 1; + rectLine.i16YMin = i32Y; + rectLine.i16YMax = i32Y + GrFontHeightGet(TEXT_FONT) + 3; + + // + // Clear the line with black. + // + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(psContext, &rectLine); + + // + // Draw the new status string + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(psContext, pcStatus, -1, + GrContextDpyWidthGet(psContext) / 2, + GrContextDpyHeightGet(psContext) / 4 , false); +} + +//***************************************************************************** +// +// Draw a horizontal meter at a given position on the display and fill it +// with green. +// +//***************************************************************************** +void +DrawBufferMeter(tContext *psContext, int32_t i32X, int32_t i32Y) +{ + tRectangle sRect; + int32_t i32CorrectedY; + + // + // Correct the Y coordinate so that the meter is centered on the same line + // as the text caption to its left. + // + i32CorrectedY = i32Y - ((BUFFER_METER_HEIGHT - TEXT_HEIGHT) / 2); + + // + // Determine the bounding rectangle of the meter. + // + sRect.i16XMin = i32X; + sRect.i16XMax = i32X + BUFFER_METER_WIDTH - 1; + sRect.i16YMin = i32CorrectedY; + sRect.i16YMax = i32CorrectedY + BUFFER_METER_HEIGHT - 1; + + // + // Fill the meter with green to indicate empty + // + GrContextForegroundSet(psContext, ClrGreen); + GrRectFill(psContext, &sRect); + + // + // Put a white box around the meter. + // + GrContextForegroundSet(psContext, ClrWhite); + GrRectDraw(psContext, &sRect); +} + +//***************************************************************************** +// +// Draw green and red blocks within a graphical meter on the display to +// indicate percentage fullness of some quantity (transmit and receive buffers +// in this case). +// +//***************************************************************************** +void +UpdateBufferMeter(tContext *psContext, uint32_t ui32FullPercent, int32_t i32X, + int32_t i32Y) +{ + tRectangle sRect; + int32_t i32CorrectedY, i32XBreak; + + // + // Correct the Y coordinate so that the meter is centered on the same line + // as the text caption to its left and so that we avoid the meter's 1 pixel + // white border. + // + i32CorrectedY = i32Y - ((BUFFER_METER_HEIGHT - TEXT_HEIGHT) / 2) + 1; + + // + // Determine where the break point between full (red) and empty (green) + // sections occurs. + // + i32XBreak = (i32X + 1) + (ui32FullPercent * (BUFFER_METER_WIDTH - 2)) / + 100; + + // + // Determine the bounding rectangle of the full section. + // + sRect.i16XMin = i32X + 1; + sRect.i16XMax = i32XBreak; + sRect.i16YMin = i32CorrectedY; + sRect.i16YMax = i32CorrectedY + BUFFER_METER_HEIGHT - 3; + + // + // Fill the full section with red (if there is anything to draw) + // + if(ui32FullPercent) + { + GrContextForegroundSet(psContext, ClrRed); + GrRectFill(psContext, &sRect); + } + + // + // Fill the empty section with green. + // + sRect.i16XMin = i32XBreak; + sRect.i16XMax = i32X + BUFFER_METER_WIDTH - 2; + if(sRect.i16XMax > sRect.i16XMin) + { + GrContextForegroundSet(psContext, ClrGreen); + GrRectFill(psContext, &sRect); + } + + // + // Revert to white for text drawing which may occur later. + // + GrContextForegroundSet(psContext, ClrWhite); + +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to control and setup of the device. +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ulEvent identifies the event we are being notified about. +// \param ulMsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to perform control-related +// operations on behalf of the USB host. These functions include setting +// and querying the serial communication parameters, setting handshake line +// states and sending break conditions. +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +ControlHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event are we being asked to process? + // + switch(ui32Event) + { + // + // We are connected to a host and communication is now possible. + // + case USB_EVENT_CONNECTED: + { + // + // Now connected and ready for normal operation. + // + HWREGBITW(&g_ui32Flags, FLAG_USB_CONFIGURED) = 1; + + // + // Flush our buffers. + // + USBBufferFlush(&g_sTxBuffer); + USBBufferFlush(&g_sRxBuffer); + + // + // Tell the main loop to update the display. + // + g_pcStatus = "Host connected."; + + // + // Set the command status update flag. + // + HWREGBITW(&g_ui32Flags, FLAG_STATUS_UPDATE) = 1; + + break; + } + + // + // The host has disconnected. + // + case USB_EVENT_DISCONNECTED: + { + // + // No longer connected. + // + HWREGBITW(&g_ui32Flags, FLAG_USB_CONFIGURED) = 0; + + g_pcStatus = "Host disconnected."; + + // + // Set the command status update flag. + // + HWREGBITW(&g_ui32Flags, FLAG_STATUS_UPDATE) = 1; + + break; + } + + // + // Return the current serial communication parameters. + // + case USBD_CDC_EVENT_GET_LINE_CODING: + { + GetLineCoding(pvMsgData, UART_CLOCK); + break; + } + + // + // Set the current serial communication parameters. + // + case USBD_CDC_EVENT_SET_LINE_CODING: + { + SetLineCoding(pvMsgData, UART_CLOCK); + break; + } + + // + // Set the current serial communication parameters. + // + case USBD_CDC_EVENT_SET_CONTROL_LINE_STATE: + { + SetControlLineState((uint16_t)ui32MsgValue); + break; + } + + // + // Send a break condition on the serial line. + // + case USBD_CDC_EVENT_SEND_BREAK: + { + SendBreak(true); + break; + } + + // + // Clear the break condition on the serial line. + // + case USBD_CDC_EVENT_CLEAR_BREAK: + { + SendBreak(false); + break; + } + + // + // Ignore SUSPEND and RESUME for now. + // + case USB_EVENT_SUSPEND: + case USB_EVENT_RESUME: + { + break; + } + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: + { +#ifdef DEBUG + while(1); +#else + break; +#endif + } + + } + + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the transmit channel (data to +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event have we been sent? + // + switch(ui32Event) + { + case USB_EVENT_TX_COMPLETE: + { + // + // Since we are using the USBBuffer, we don't need to do anything + // here. + // + break; + } + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: + { +#ifdef DEBUG + while(1); +#else + break; +#endif + } + } + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the receive channel (data from +// the USB host). +// +// \param pvCBData is the client-supplied callback data value for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + uint32_t ui32Count; + + // + // Which event are we being sent? + // + switch(ui32Event) + { + // + // A new packet has been received. + // + case USB_EVENT_RX_AVAILABLE: + { + // + // Feed some characters into the UART TX FIFO and enable the + // interrupt so we are told when there is more space. + // + USBUARTPrimeTransmit(UART0_BASE); + ROM_UARTIntEnable(UART0_BASE, UART_INT_TX); + break; + } + + // + // We are being asked how much unprocessed data we have still to + // process. We return 0 if the UART is currently idle or 1 if it is + // in the process of transmitting something. The actual number of + // bytes in the UART FIFO is not important here, merely whether or + // not everything previously sent to us has been transmitted. + // + case USB_EVENT_DATA_REMAINING: + { + // + // Get the number of bytes in the buffer and add 1 if some data + // still has to clear the transmitter. + // + ui32Count = UARTBusy(UART0_BASE) ? 1 : 0; + return(ui32Count); + } + + // + // We are being asked to provide a buffer into which the next packet + // can be read. We do not support this mode of receiving data so let + // the driver know by returning 0. The CDC driver should not be sending + // this message but this is included just for illustration and + // completeness. + // + case USB_EVENT_REQUEST_BUFFER: + { + return(0); + } + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: +#ifdef DEBUG + while(1); +#else + break; +#endif + } + + return(0); +} + +//***************************************************************************** +// +// This is the main application entry function. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32TxCount, ui32RxCount, ui32Fullness, ui32SysClock, ui32PLLRate; + tRectangle sRect; + char pcBuffer[16]; +#ifdef USE_ULPI + uint32_t ui32Setting; +#endif + + // + // Set the system clock to run at 120MHz from the PLL. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + +#ifdef USE_ULPI + // + // Switch the USB ULPI Pins over. + // + USBULPIPinoutSet(); + + // + // Enable USB ULPI with high speed support. + // + ui32Setting = USBLIB_FEATURE_ULPI_HS; + USBOTGFeatureSet(0, USBLIB_FEATURE_USBULPI, &ui32Setting); + + // + // Setting the PLL frequency to zero tells the USB library to use the + // external USB clock. + // + ui32PLLRate = 0; +#else + // + // Save the PLL rate used by this application. + // + ui32PLLRate = 480000000; +#endif + + // + // Enable the system tick. + // + ROM_SysTickPeriodSet(ui32SysClock / TICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Not configured initially. + // + g_ui32Flags = 0; + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-dev-serial"); + + // + // Fill the top 15 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 23; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Show the various static text elements on the color STN display. + // + GrContextFontSet(&g_sContext, TEXT_FONT); + GrStringDraw(&g_sContext, "Tx bytes:", -1, 8, 80, false); + GrStringDraw(&g_sContext, "Tx buffer:", -1, 8, 105, false); + GrStringDraw(&g_sContext, "Rx bytes:", -1, 8, 160, false); + GrStringDraw(&g_sContext, "Rx buffer:", -1, 8, 185, false); + DrawBufferMeter(&g_sContext, 150, 105); + DrawBufferMeter(&g_sContext, 150, 185); + + // + // Enable the UART that we will be redirecting. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Change the UART clock to the 16 MHz PIOSC. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Set the default UART configuration. + // + ROM_UARTConfigSetExpClk(UART0_BASE, UART_CLOCK, + DEFAULT_BIT_RATE, DEFAULT_UART_CONFIG); + ROM_UARTFIFOLevelSet(UART0_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8); + + // + // Configure and enable UART interrupts. + // + ROM_UARTIntClear(UART0_BASE, ROM_UARTIntStatus(UART0_BASE, false)); + ROM_UARTIntEnable(UART0_BASE, (UART_INT_OE | UART_INT_BE | UART_INT_PE | + UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX)); + + // + // Tell the user what we are up to. + // + DisplayStatus(&g_sContext, " Configuring USB... "); + + // + // Initialize the transmit and receive buffers. + // + USBBufferInit(&g_sTxBuffer); + USBBufferInit(&g_sRxBuffer); + + // + // Set the USB stack mode to Device mode with VBUS monitoring. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Tell the USB library the CPU clock and the PLL frequency. This is a + // new requirement for TM4C129 devices. + // + USBDCDFeatureSet(0, USBLIB_FEATURE_CPUCLK, &ui32SysClock); + USBDCDFeatureSet(0, USBLIB_FEATURE_USBPLL, &ui32PLLRate); + + // + // Pass our device information to the USB library and place the device + // on the bus. + // + USBDCDCInit(0, (tUSBDCDCDevice *)&g_sCDCDevice); + + // + // Wait for initial configuration to complete. + // + DisplayStatus(&g_sContext, " Waiting for host... "); + + // + // Clear our local byte counters. + // + ui32RxCount = 0; + ui32TxCount = 0; + g_ui32UARTTxCount = 0; + g_ui32UARTRxCount = 0; +#ifdef DEBUG + g_ui32UARTRxErrors = 0; +#endif + + // + // Enable interrupts now that the application is ready to start. + // + ROM_IntEnable(INT_UART0); + + // + // Main application loop. + // + while(1) + { + // + // Have we been asked to update the status display? + // + if(HWREGBITW(&g_ui32Flags, FLAG_STATUS_UPDATE)) + { + // + // Clear the command flag + // + HWREGBITW(&g_ui32Flags, FLAG_STATUS_UPDATE) = 0; + + DisplayStatus(&g_sContext, g_pcStatus); + } + + // + // Has there been any transmit traffic since we last checked? + // + if(ui32TxCount != g_ui32UARTTxCount) + { + // + // Take a snapshot of the latest transmit count. + // + ui32TxCount = g_ui32UARTTxCount; + + // + // Update the display of bytes transmitted by the UART. + // + usnprintf(pcBuffer, 16, "%d ", ui32TxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 150, 80, true); + + // + // Update the RX buffer fullness. Remember that the buffers are + // named relative to the USB whereas the status display is from + // the UART's perspective. The USB's receive buffer is the UART's + // transmit buffer. + // + ui32Fullness = ((USBBufferDataAvailable(&g_sRxBuffer) * 100) / + UART_BUFFER_SIZE); + + UpdateBufferMeter(&g_sContext, ui32Fullness, 150, 105); + } + + // + // Has there been any receive traffic since we last checked? + // + if(ui32RxCount != g_ui32UARTRxCount) + { + // + // Take a snapshot of the latest receive count. + // + ui32RxCount = g_ui32UARTRxCount; + + // + // Update the display of bytes received by the UART. + // + usnprintf(pcBuffer, 16, "%d ", ui32RxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 150, 160, true); + + // + // Update the TX buffer fullness. Remember that the buffers are + // named relative to the USB whereas the status display is from + // the UART's perspective. The USB's transmit buffer is the UART's + // receive buffer. + // + ui32Fullness = ((USBBufferDataAvailable(&g_sTxBuffer) * 100) / + UART_BUFFER_SIZE); + + UpdateBufferMeter(&g_sContext, ui32Fullness, 150, 185); + } + } +} diff --git a/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ewd b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ewp b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ewp new file mode 100644 index 0000000..773234b --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ewp @@ -0,0 +1,807 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_dev_serial.c + + + $PROJ_DIR$\usb_serial_structs.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.icf b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.icf new file mode 100644 index 0000000..1410483 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_serial.icf - Linker configuration file for usb_dev_serial. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ld b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ld new file mode 100644 index 0000000..a384044 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_serial.ld - Linker configuration file for usb_dev_serial. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.sct b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.sct new file mode 100644 index 0000000..b764196 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_serial.sct - Linker configuration file for usb_dev_serial. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.uvopt b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.uvopt new file mode 100644 index 0000000..8439fbf --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_serial + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_serial.c + usb_dev_serial.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_serial_structs.c + usb_serial_structs.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.uvproj b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.uvproj new file mode 100644 index 0000000..b728459 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_serial + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_serial + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_serial.bin .\rvmdk\usb_dev_serial.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_serial.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_dev_serial.c + 1 + .\usb_dev_serial.c + + + usb_serial_structs.c + 1 + .\usb_serial_structs.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial_ccs.cmd b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial_ccs.cmd new file mode 100644 index 0000000..a4e0293 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/usb_dev_serial_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_serial_ccs.cmd - CCS linker configuration file for usb_dev_serial. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/usb_dev_serial/usb_serial_structs.c b/boards/dk-tm4c129x/usb_dev_serial/usb_serial_structs.c new file mode 100644 index 0000000..30a1bd4 --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/usb_serial_structs.c @@ -0,0 +1,217 @@ +//***************************************************************************** +// +// usb_serial_structs.c - Data structures defining this CDC USB device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "usb_serial_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + 2 + (16 * 2), + USB_DTYPE_STRING, + 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, 'a', 0, 'l', 0, ' ', 0, + 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, 'o', 0, 'r', 0, 't', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + 2 + (8 * 2), + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The control interface description string. +// +//***************************************************************************** +const uint8_t g_pui8ControlInterfaceString[] = +{ + 2 + (21 * 2), + USB_DTYPE_STRING, + 'A', 0, 'C', 0, 'M', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 't', 0, + 'r', 0, 'o', 0, 'l', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, + 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + 2 + (26 * 2), + USB_DTYPE_STRING, + 'S', 0, 'e', 0, 'l', 0, 'f', 0, ' ', 0, 'P', 0, 'o', 0, 'w', 0, + 'e', 0, 'r', 0, 'e', 0, 'd', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, + 'f', 0, 'i', 0, 'g', 0, 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, + 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_pui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8ControlInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_pui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// CDC device callback function prototypes. +// +//***************************************************************************** +uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData); +uint32_t TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData); +uint32_t ControlHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +//***************************************************************************** +// +// The CDC device initialization and customization structures. In this case, +// we are using USBBuffers between the CDC device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the CDC channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our CDC instance structure. +// +//***************************************************************************** +tCDCSerInstance g_sCDCInstance; + +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; + +tUSBDCDCDevice g_sCDCDevice = +{ + USB_VID_TI_1CBE, + USB_PID_SERIAL, + 0, + USB_CONF_ATTR_SELF_PWR, + ControlHandler, + (void *)&g_sCDCDevice, + USBBufferEventCallback, + (void *)&g_sRxBuffer, + USBBufferEventCallback, + (void *)&g_sTxBuffer, + g_pui8StringDescriptors, + NUM_STRING_DESCRIPTORS, +}; + +//***************************************************************************** +// +// Receive buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBRxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8RxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sRxBuffer = +{ + false, // This is a receive buffer. + RxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device pointer. + USBDCDCPacketRead, // pfnTransfer + USBDCDCRxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pui8USBRxBuffer, // pui8Buffer + UART_BUFFER_SIZE, // ui32BufferSize + g_pui8RxBufferWorkspace // pvWorkspace +}; + +//***************************************************************************** +// +// Transmit buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBTxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8TxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sTxBuffer = +{ + true, // This is a transmit buffer. + TxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device pointer. + USBDCDCPacketWrite, // pfnTransfer + USBDCDCTxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pui8USBTxBuffer, // pcBuffer + UART_BUFFER_SIZE, // ulBufferSize + g_pui8TxBufferWorkspace // pvWorkspace +}; diff --git a/boards/dk-tm4c129x/usb_dev_serial/usb_serial_structs.h b/boards/dk-tm4c129x/usb_dev_serial/usb_serial_structs.h new file mode 100644 index 0000000..4015bed --- /dev/null +++ b/boards/dk-tm4c129x/usb_dev_serial/usb_serial_structs.h @@ -0,0 +1,49 @@ +//***************************************************************************** +// +// usb_serial_structs.h - Data structures defining this USB CDC device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_SERIAL_STRUCTS_H_ +#define _USB_SERIAL_STRUCTS_H_ + +//***************************************************************************** +// +// The size of the transmit and receive buffers used for the redirected UART. +// This number should be a power of 2 for best performance. 256 is chosen +// pretty much at random though the buffer should be at least twice the size of +// a maximum-sized USB packet. +// +//***************************************************************************** +#define UART_BUFFER_SIZE 256 + +extern uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +extern uint32_t TxHandler(void *pvlCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; +extern tUSBDCDCDevice g_sCDCDevice; +extern uint8_t g_pui8USBTxBuffer[]; +extern uint8_t g_pui8USBRxBuffer[]; + +#endif diff --git a/boards/dk-tm4c129x/usb_host_audio/Makefile b/boards/dk-tm4c129x/usb_host_audio/Makefile new file mode 100644 index 0000000..fb9a35d --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/Makefile @@ -0,0 +1,102 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host audio example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party +IPATH+=../../../../utils + +# +# The default rule, which causes the USB host audio example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_audio.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host audio example. +# +${COMPILER}/usb_host_audio.axf: ${COMPILER}/buttons.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/ff.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/frame.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/mmc-dk-tm4c129x.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/touch.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/usb_host_audio.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/usb_sound.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/wavfile.o +${COMPILER}/usb_host_audio.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_audio.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_audio.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_audio.axf: usb_host_audio.ld +SCATTERgcc_usb_host_audio=usb_host_audio.ld +ENTRY_usb_host_audio=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_host_audio/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_host_audio/ccs/.ccsimportspec new file mode 100644 index 0000000..fbf85a1 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_audio/ccs/.ccsproject b/boards/dk-tm4c129x/usb_host_audio/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_audio/ccs/.cproject b/boards/dk-tm4c129x/usb_host_audio/ccs/.cproject new file mode 100644 index 0000000..ce10e9d --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/ccs/.cproject @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_audio/ccs/.project b/boards/dk-tm4c129x/usb_host_audio/ccs/.project new file mode 100644 index 0000000..52d2783 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/ccs/.project @@ -0,0 +1,100 @@ + + + usb_host_audio + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_audio/startup_ccs.c + + + usb_host_audio.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.c + + + usb_host_audio_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_audio/usb_host_audio_ccs.cmd + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/buttons.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + drivers/usb_sound.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/usb_sound.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + utils/wavfile.c + 1 + SW_ROOT/utils/wavfile.c + + + third_party/fatfs/port/mmc-dk-tm4c129x.c + 1 + SW_ROOT/third_party/fatfs/port/mmc-dk-tm4c129x.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_host_audio/ccs/Debug/usb_host_audio.bin b/boards/dk-tm4c129x/usb_host_audio/ccs/Debug/usb_host_audio.bin new file mode 100644 index 0000000..7bdbd53 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio/ccs/Debug/usb_host_audio.bin differ diff --git a/boards/dk-tm4c129x/usb_host_audio/ccs/Debug/usb_host_audio.out b/boards/dk-tm4c129x/usb_host_audio/ccs/Debug/usb_host_audio.out new file mode 100644 index 0000000..b77c709 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio/ccs/Debug/usb_host_audio.out differ diff --git a/boards/dk-tm4c129x/usb_host_audio/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_host_audio/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_host_audio/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_host_audio/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_audio/ewarm/Exe/usb_host_audio.bin b/boards/dk-tm4c129x/usb_host_audio/ewarm/Exe/usb_host_audio.bin new file mode 100644 index 0000000..057570a Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio/ewarm/Exe/usb_host_audio.bin differ diff --git a/boards/dk-tm4c129x/usb_host_audio/ewarm/Exe/usb_host_audio.out b/boards/dk-tm4c129x/usb_host_audio/ewarm/Exe/usb_host_audio.out new file mode 100644 index 0000000..4d54294 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio/ewarm/Exe/usb_host_audio.out differ diff --git a/boards/dk-tm4c129x/usb_host_audio/gcc/usb_host_audio.axf b/boards/dk-tm4c129x/usb_host_audio/gcc/usb_host_audio.axf new file mode 100644 index 0000000..72a455d Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio/gcc/usb_host_audio.axf differ diff --git a/boards/dk-tm4c129x/usb_host_audio/gcc/usb_host_audio.bin b/boards/dk-tm4c129x/usb_host_audio/gcc/usb_host_audio.bin new file mode 100644 index 0000000..397de3a Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio/gcc/usb_host_audio.bin differ diff --git a/boards/dk-tm4c129x/usb_host_audio/readme.txt b/boards/dk-tm4c129x/usb_host_audio/readme.txt new file mode 100644 index 0000000..d4ffd1d --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/readme.txt @@ -0,0 +1,38 @@ +USB host audio example application using SD Card FAT file system + + +This example application demonstrates playing .wav files from an SD card +that is formatted with a FAT file system using USB host audio class. The +application can browse the file system on the SD card and displays +all files that are found. Files can be selected to show their format and +then played if the application determines that they are a valid .wav file. +Only PCM format (uncompressed) files may be played. + +For additional details about FatFs, see the following site: +http://elm-chan.org/fsw/ff/00index_e.html + +The application can be recompiled to run using and external USB phy to +implement a high speed host using an external USB phy. To use the external +phy the application must be built with \b USE_ULPI defined. This disables +the internal phy and the connector on the DK-TM4C129X board and enables the +connections to the external ULPI phy pins on the DK-TM4C129X board. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_host_audio/rvmdk/usb_host_audio.axf b/boards/dk-tm4c129x/usb_host_audio/rvmdk/usb_host_audio.axf new file mode 100644 index 0000000..cc13300 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio/rvmdk/usb_host_audio.axf differ diff --git a/boards/dk-tm4c129x/usb_host_audio/rvmdk/usb_host_audio.bin b/boards/dk-tm4c129x/usb_host_audio/rvmdk/usb_host_audio.bin new file mode 100644 index 0000000..ee00144 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio/rvmdk/usb_host_audio.bin differ diff --git a/boards/dk-tm4c129x/usb_host_audio/startup_ccs.c b/boards/dk-tm4c129x/usb_host_audio/startup_ccs.c new file mode 100644 index 0000000..5bf38b3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_audio/startup_ewarm.c b/boards/dk-tm4c129x/usb_host_audio/startup_ewarm.c new file mode 100644 index 0000000..cad5a03 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_audio/startup_gcc.c b/boards/dk-tm4c129x/usb_host_audio/startup_gcc.c new file mode 100644 index 0000000..ae0bddc --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_audio/startup_rvmdk.S b/boards/dk-tm4c129x/usb_host_audio/startup_rvmdk.S new file mode 100644 index 0000000..80a2337 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SysTickHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.c b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.c new file mode 100644 index 0000000..d2bee89 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.c @@ -0,0 +1,1554 @@ +//***************************************************************************** +// +// usb_host_audio.c - Main routine for the USB host audio example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_ints.h" +#include "driverlib/flash.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "driverlib/systick.h" +#include "driverlib/pin_map.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/listbox.h" +#include "grlib/pushbutton.h" +#include "utils/ustdlib.h" +#include "third_party/fatfs/src/ff.h" +#include "third_party/fatfs/src/diskio.h" +#include "drivers/usb_sound.h" +#include "utils/wavfile.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/frame.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" +#include "usblib/usblib.h" +#include "usblib/host/usbhost.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB host audio example application using SD Card FAT file system +//! (usb_host_audio)

      +//! +//! This example application demonstrates playing .wav files from an SD card +//! that is formatted with a FAT file system using USB host audio class. The +//! application can browse the file system on the SD card and displays +//! all files that are found. Files can be selected to show their format and +//! then played if the application determines that they are a valid .wav file. +//! Only PCM format (uncompressed) files may be played. +//! +//! For additional details about FatFs, see the following site: +//! http://elm-chan.org/fsw/ff/00index_e.html +//! +//! The application can be recompiled to run using and external USB phy to +//! implement a high speed host using an external USB phy. To use the external +//! phy the application must be built with \b USE_ULPI defined. This disables +//! the internal phy and the connector on the DK-TM4C129X board and enables the +//! connections to the external ULPI phy pins on the DK-TM4C129X board. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} + +#endif + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Global needed by the FAT driver to know the processor speed of the system. +// +//***************************************************************************** +uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// Defines for the basic screen area used by the application. +// +//***************************************************************************** +#define STATUS_HEIGHT 40 +#define BG_MIN_X 7 +#define BG_MAX_X (320 - 8) +#define BG_MIN_Y 24 +#define BG_MAX_Y (240 - 8) +#define BUTTON_HEIGHT (STATUS_HEIGHT - 8) + +//***************************************************************************** +// +// Forward declarations for functions called by the widgets used in the user +// interface. +// +//***************************************************************************** +void OnListBoxChange(tWidget *psWidget, int16_t i16Selected); +static void PlayPause(tWidget *psWidget); +static void Stop(tWidget *psWidget); + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static DIR g_sDirObject; +static FILINFO g_sFileInfo; + +//***************************************************************************** +// +// Define a pair of buffers that are used for holding path information. +// The buffer size must be large enough to hold the longest expected +// full path name, including the file name, and a trailing null character. +// The initial path is set to root "/". +// +//***************************************************************************** +#define PATH_BUF_SIZE 80 +static char g_pcCwdBuf[PATH_BUF_SIZE] = "/"; +static char g_pcTmpBuf[PATH_BUF_SIZE]; + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / TICKS_PER_SECOND) + +//***************************************************************************** +// +// Audio buffering definitions, these are optimized to deal with USB audio. +// AUDIO_TRANSFER_SIZE define one frame of audio at 48000 Stereo 16 bit +// and AUDIO_BUFFERS declares 16 frames(16ms) of audio buffering. +// +//***************************************************************************** +#define AUDIO_TRANSFER_SIZE (192) +#define AUDIO_BUFFERS (64) +#define AUDIO_BUFFER_SIZE (AUDIO_TRANSFER_SIZE * AUDIO_BUFFERS) +uint32_t g_ui32TransferSize; +uint32_t g_ui32BufferSize; + +//***************************************************************************** +// +// The main audio buffer and it's pointers. +// +//***************************************************************************** +uint8_t g_pui8AudioBuffer[AUDIO_BUFFER_SIZE]; +volatile uint8_t *g_pui8Read; +volatile uint8_t *g_pui8Write; +volatile uint32_t g_ui32ValidBytes; + +//***************************************************************************** +// +// Holds global flags for the system. +// +//***************************************************************************** +uint32_t g_ui32Flags; + +// +// The last transfer has competed so a new one can be started. +// +#define FLAGS_TX_COMPLETE 1 + +// +// New audio device present. +// +#define FLAGS_DEVICE_CONNECT 2 + +//***************************************************************************** +// +// The global playback state for the application. +// +//***************************************************************************** +volatile enum +{ + AUDIO_PLAYING, + AUDIO_PAUSED, + AUDIO_STOPPED, + AUDIO_NONE +} +g_ePlayState; + +//***************************************************************************** +// +// These are the global .wav file states used by the application. +// +//***************************************************************************** +tWavFile g_sWavFile; +tWavHeader g_sWavHeader; + +//***************************************************************************** +// +// Widget definitions +// +//***************************************************************************** + +//***************************************************************************** +// +// Storage for the filename listbox widget string table. +// +//***************************************************************************** +#define NUM_LIST_STRINGS 48 +const char *g_ppcDirListStrings[NUM_LIST_STRINGS]; + +//***************************************************************************** +// +// Storage for the names of the files in the current directory. Filenames +// are stored in format "(D) filename.ext" for directories or "(F) filename.ext" +// for files. +// +//***************************************************************************** +#define MAX_FILENAME_STRING_LEN (4 + 8 + 1 + 3 + 1) +char g_pcFilenames[NUM_LIST_STRINGS][MAX_FILENAME_STRING_LEN]; + +//***************************************************************************** +// +// The canvas widgets for the wav file information. +// +//***************************************************************************** +extern tCanvasWidget g_sWaveInfoBackground; + +char g_pcTime[16] = ""; +Canvas(g_sWaveInfoTime, &g_sWaveInfoBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, BG_MAX_X - 166, BG_MIN_Y + 28, 158, 10, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_RIGHT | + CANVAS_STYLE_TEXT_OPAQUE, ClrBlack, ClrWhite, ClrWhite, + g_psFontFixed6x8, g_pcTime, 0, 0); + +char g_pcFormat[24] = ""; +Canvas(g_sWaveInfoSample, &g_sWaveInfoBackground, &g_sWaveInfoTime, 0, + &g_sKentec320x240x16_SSD2119, BG_MAX_X - 166, BG_MIN_Y + 18, 158, 10, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_RIGHT | + CANVAS_STYLE_TEXT_OPAQUE, ClrBlack, ClrWhite, ClrWhite, + g_psFontFixed6x8, g_pcFormat, 0, 0); + +Canvas(g_sWaveInfoFileName, &g_sWaveInfoBackground, &g_sWaveInfoSample, 0, + &g_sKentec320x240x16_SSD2119, BG_MAX_X - 166, BG_MIN_Y + 8, 158, 10, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_RIGHT | + CANVAS_STYLE_TEXT_OPAQUE, ClrBlack, ClrWhite, ClrWhite, + g_psFontFixed6x8, "", 0, 0); + +//***************************************************************************** +// +// The canvas widget acting as the background for the wav file information. +// +//***************************************************************************** +Canvas(g_sWaveInfoBackground, WIDGET_ROOT, 0, + &g_sWaveInfoFileName, &g_sKentec320x240x16_SSD2119, + BG_MAX_X - 170, BG_MIN_Y + 4, 166, 80, + CANVAS_STYLE_FILL, ClrBlack, ClrWhite, ClrWhite, + g_psFontFixed6x8, 0, 0, 0); + +extern tCanvasWidget g_sStatusPanel; + +// +// Status text area. +// +Canvas(g_sStatusText, &g_sStatusPanel, 0, 0, &g_sKentec320x240x16_SSD2119, + BG_MIN_X + 112, BG_MAX_Y - STATUS_HEIGHT + 4, 189, BUTTON_HEIGHT, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_RIGHT | + CANVAS_STYLE_TEXT_OPAQUE, ClrLightGrey, ClrDarkGray, ClrBlack, + g_psFontCmss16, "", 0, 0); + +// +// Stop button. +// +RectangularButton(g_sStop, &g_sStatusPanel, &g_sStatusText, 0, + &g_sKentec320x240x16_SSD2119, BG_MIN_X + 58, + BG_MAX_Y - STATUS_HEIGHT + 4, 50, BUTTON_HEIGHT, + PB_STYLE_FILL | PB_STYLE_TEXT | + PB_STYLE_RELEASE_NOTIFY, ClrLightGrey, ClrDarkGray, 0, + ClrBlack, g_psFontCmss16, "Stop", 0, 0, 0 ,0 , Stop); + +// +// Play/Pause button. +// +RectangularButton(g_sPlayPause, &g_sStatusPanel, &g_sStop, 0, + &g_sKentec320x240x16_SSD2119, BG_MIN_X + 4, + BG_MAX_Y - STATUS_HEIGHT + 4, 50, BUTTON_HEIGHT, + PB_STYLE_FILL | PB_STYLE_TEXT | + PB_STYLE_RELEASE_NOTIFY, ClrLightGrey, ClrDarkGray, 0, + ClrBlack, g_psFontCmss16, "Play", 0, 0, 0 ,0 , PlayPause); + +// +// Background of the status area behind the buttons. +// +Canvas(g_sStatusPanel, WIDGET_ROOT, 0, &g_sPlayPause, + &g_sKentec320x240x16_SSD2119, BG_MIN_X, BG_MAX_Y - STATUS_HEIGHT, + BG_MAX_X - BG_MIN_X, STATUS_HEIGHT, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT_RIGHT | + CANVAS_STYLE_TEXT_TOP, ClrGray, ClrWhite, ClrBlack, 0, + 0, 0, 0); + +// +// The file list box. +// +ListBox(g_sDirList, WIDGET_ROOT, 0, 0, + &g_sKentec320x240x16_SSD2119, + BG_MIN_X + 4, BG_MIN_Y + 4, 120, + BG_MAX_Y - BG_MIN_Y - STATUS_HEIGHT - 8, + LISTBOX_STYLE_OUTLINE, ClrBlack, ClrDarkBlue, ClrSilver, ClrWhite, + ClrWhite, g_psFontCmss12, g_ppcDirListStrings, + NUM_LIST_STRINGS, 0, OnListBoxChange); + +//***************************************************************************** +// +// State information for keep track of time. +// +//***************************************************************************** +static uint32_t g_ui32BytesPlayed; +static uint32_t g_ui32NextUpdate; + +//***************************************************************************** +// +// Globals used to track play back position. +// +//***************************************************************************** +static uint16_t g_ui16Minutes; +static uint16_t g_ui16Seconds; + +//***************************************************************************** +// +// Static constant strings used by the application. +// +//***************************************************************************** +static const char g_pcPlay[] = "Play"; +static const char g_pcPause[] = "Pause"; +static const char g_pcNoDevice[] ="No USB Device "; +static const char g_pcUnknownDevice[] ="Unknown Device "; +static const char g_pcDirError[] ="Directory Read Error "; + +//***************************************************************************** +// +// This function is used to tell when to update the play back times for a file. +// It will only update the screen at 1 second intervals but can be called more +// often with no result. +// +//***************************************************************************** +static void +DisplayTime(uint32_t ui32ForceUpdate) +{ + uint32_t ui32Seconds; + uint32_t ui32Minutes; + + // + // Only display on the screen once per second. + // + if((g_ui32BytesPlayed >= g_ui32NextUpdate) || (ui32ForceUpdate != 0)) + { + // + // Set the next update time to one second later. + // + g_ui32NextUpdate = g_ui32BytesPlayed + g_sWavHeader.ui32AvgByteRate; + + // + // Calculate the integer number of minutes and seconds. + // + ui32Seconds = g_ui32BytesPlayed / g_sWavHeader.ui32AvgByteRate; + ui32Minutes = ui32Seconds / 60; + ui32Seconds -= ui32Minutes * 60; + + // + // Print the time string in the format mm.ss/mm.ss + // + usprintf(g_pcTime, "%2d:%02d/%d:%02d\0", ui32Minutes,ui32Seconds, + g_ui16Minutes, g_ui16Seconds); + + // + // Display the updated time on the screen. + // + WidgetPaint((tWidget *)&g_sWaveInfoTime); + } +} + +//***************************************************************************** +// +// This function will handle stopping the play back of audio. It will not do +// this immediately but will defer stopping audio at a later time. This allows +// this function to be called from an interrupt handler. +// +//***************************************************************************** +static void +WaveStop(void) +{ + uint32_t ui32Idx; + uint32_t *pui32Buffer; + + // + // Stop playing audio. + // + g_ePlayState = AUDIO_STOPPED; + + // + // Do unsigned long accesses to clear out the buffer. + // + pui32Buffer = (uint32_t *)g_pui8AudioBuffer; + + // + // Zero out the buffer. + // + for(ui32Idx = 0; ui32Idx < (AUDIO_BUFFER_SIZE >> 2); ui32Idx++) + { + pui32Buffer[ui32Idx] = 0; + } + + // + // Reset the number of bytes played and for a time update on the screen. + // + g_ui32BytesPlayed = 0; + g_ui32NextUpdate = 0; + DisplayTime(1); + + // + // Change the play/pause button to say play. + // + PushButtonTextSet(&g_sPlayPause, g_pcPlay); + WidgetPaint((tWidget *)&g_sPlayPause); +} + +//***************************************************************************** +// +// This function is used to change to a new directory in the file system. +// It takes a parameter that specifies the directory to make the current +// working directory. +// Path separators must use a forward slash "/". The directory parameter +// can be one of the following: +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so dont try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory +// to make sure it exists. If the new path is opened successfully, then +// the current working directory (cwd) is changed to the new path. +// +// In cases of error, the pui32Reason parameter will be written with one of +// the following values: +// +// NAME_TOO_LONG_ERROR - combination of paths are too long for the buffer +// OPENDIR_ERROR - there is some problem opening the new directory +// +//***************************************************************************** +static FRESULT +ChangeToDirectory(char *pcDirectory) +{ + uint32_t ui32Idx; + FRESULT fresult; + + // + // Copy the current working path into a temporary buffer so + // it can be manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If the first character is /, then this is a fully specified + // path, and it should just be used as-is. + // + if(pcDirectory[0] == '/') + { + // + // Make sure the new path is not bigger than the cwd buffer. + // + if(strlen(pcDirectory) + 1 > sizeof(g_pcCwdBuf)) + { + return(FR_OK); + } + + // + // If the new path name (in argv[1]) is not too long, then + // copy it into the temporary buffer so it can be checked. + // + else + { + strncpy(g_pcTmpBuf, pcDirectory, sizeof(g_pcTmpBuf)); + } + } + + // + // If the argument is .. then attempt to remove the lowest level + // on the CWD. + // + else if(!strcmp(pcDirectory, "..")) + { + // + // Get the index to the last character in the current path. + // + ui32Idx = strlen(g_pcTmpBuf) - 1; + + // + // Back up from the end of the path name until a separator (/) + // is found, or until we bump up to the start of the path. + // + while((g_pcTmpBuf[ui32Idx] != '/') && (ui32Idx > 1)) + { + // + // Back up one character. + // + ui32Idx--; + } + + // + // Now we are either at the lowest level separator in the + // current path, or at the beginning of the string (root). + // So set the new end of string here, effectively removing + // that last part of the path. + // + g_pcTmpBuf[ui32Idx] = 0; + } + + // + // Otherwise this is just a normal path name from the current + // directory, and it needs to be appended to the current path. + // + else + { + // + // Test to make sure that when the new additional path is + // added on to the current path, there is room in the buffer + // for the full new path. It needs to include a new separator, + // and a trailing null character. + // + if(strlen(g_pcTmpBuf) + strlen(pcDirectory) + 2 > sizeof(g_pcCwdBuf)) + { + return(FR_INVALID_OBJECT); + } + + // + // The new path is okay, so add the separator and then append + // the new directory to the path. + // + else + { + // + // If not already at the root level, then append a / + // + if(strcmp(g_pcTmpBuf, "/")) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Append the new directory to the path. + // + strcat(g_pcTmpBuf, pcDirectory); + } + } + + // + // At this point, a candidate new directory path is in g_pcTmpBuf. + // Try to open it to make sure it is valid. + // + fresult = f_opendir(&g_sDirObject, g_pcTmpBuf); + + // + // This was a valid path, so copy it into the CWD. + // + if(fresult == FR_OK) + { + strncpy(g_pcCwdBuf, g_pcTmpBuf, sizeof(g_pcCwdBuf)); + } + + // + // Return success. + // + return(fresult); +} + +//***************************************************************************** +// +// Fill the audio buffer with data from the open file. +// +//***************************************************************************** +static void +FillAudioBuffer(void) +{ + uint32_t ui32Count, ui32Size; + uint8_t *pui8Read; + + // + // If already full return. + // + if(g_ui32ValidBytes == g_ui32BufferSize) + { + return; + } + + // + // Snap shot the read pointer since it might change while we are filling + // the buffer. If the read pointer moved due to an interrupt we will + // get the update on the next call to this function. + // + pui8Read = (uint8_t *)g_pui8Read; + + // + // If write is ahead of read then fill to the end of the buffer if + // possible. + // + if(pui8Read <= g_pui8Write) + { + // + // Calculate the amount of space we have. + // + ui32Size = g_ui32BufferSize - + (uint32_t)(g_pui8Write - g_pui8AudioBuffer); + ui32Count = WavRead(&g_sWavFile, (uint8_t *)g_pui8Write, ui32Size); + + g_pui8Write += ui32Count; + IntMasterDisable(); + g_ui32ValidBytes += ui32Count; + IntMasterEnable(); + + if(g_pui8Write == (g_pui8AudioBuffer + g_ui32BufferSize)) + { + g_pui8Write = g_pui8AudioBuffer; + } + + ui32Size = pui8Read - g_pui8AudioBuffer; + + if(ui32Size) + { + ui32Count = WavRead(&g_sWavFile, (uint8_t *)g_pui8Write, ui32Size); + g_pui8Write += ui32Count; + IntMasterDisable(); + g_ui32ValidBytes += ui32Count; + IntMasterEnable(); + } + } + + // + // If read is now ahead of write then fill to the read pointer. + // + if(pui8Read > g_pui8Write) + { + // + // Calculate the amount of space we have. + // + ui32Size = (uint32_t)(pui8Read - g_pui8Write); + ui32Count = WavRead(&g_sWavFile, (uint8_t *)g_pui8Write, ui32Size); + + g_pui8Write += ui32Count; + + IntMasterDisable(); + g_ui32ValidBytes += ui32Count; + IntMasterEnable(); + } +} + +//***************************************************************************** +// +// This function handles the callback from the USB audio device when a buffer +// has been played or a new buffer has been received. +// +//***************************************************************************** +static void +USBAudioOutCallback(void *pvBuffer, uint32_t ui32Event, uint32_t ui32Value) +{ + // + // If a buffer has been played then schedule a new one to play. + // + if((ui32Event == USB_EVENT_TX_COMPLETE) && (g_ePlayState == AUDIO_PLAYING)) + { + // + // Indicate that a transfer was complete so that the non-interrupt + // code can read in more data from the file. + // + HWREGBITW(&g_ui32Flags, FLAGS_TX_COMPLETE) = 1; + + // + // Increment the read pointer. + // + g_pui8Read += g_ui32TransferSize; + + // + // Remove the specified number of bytes from the buffer. + // + if(g_ui32ValidBytes > g_ui32TransferSize) + { + g_ui32ValidBytes -= g_ui32TransferSize; + } + else + { + g_ui32ValidBytes = 0; + } + + // + // Wrap the read pointer if necessary. + // + if(g_pui8Read >= (g_pui8AudioBuffer + g_ui32BufferSize)) + { + g_pui8Read = g_pui8AudioBuffer; + } + + // + // Increment the number of bytes that have been played. + // + g_ui32BytesPlayed += g_ui32TransferSize; + + // + // Schedule a new USB audio buffer to be transmitted to the USB + // audio device. + // + USBSoundBufferOut((uint8_t *)g_pui8Read, g_ui32TransferSize, + USBAudioOutCallback); + } +} + +//***************************************************************************** +// +// This is the callback for the play/pause button. +// +//***************************************************************************** +static void +PlayPause(tWidget *psWidget) +{ + int16_t i16Select; + + // + // If we are stopped, then start playing. + // + if(g_ePlayState == AUDIO_STOPPED) + { + // + // Get the current selection from the list box. + // + i16Select = ListBoxSelectionGet(&g_sDirList); + + // + // See if this is a valid .wav file that can be opened. + // + if(WavOpen(g_pcFilenames[i16Select], &g_sWavFile) == 0) + { + // + // Initialize the read and write pointers. + // + g_pui8Read = g_pui8AudioBuffer; + g_pui8Write = g_pui8AudioBuffer; + g_ui32ValidBytes = 0; + + // + // Fill the audio buffer from the file. + // + FillAudioBuffer(); + + // + // Start the audio playback. + // + USBSoundBufferOut((uint8_t *)g_pui8Read, g_ui32TransferSize, + USBAudioOutCallback); + // + // Indicate that wave play back should start. + // + g_ePlayState = AUDIO_PLAYING; + + // + // Change the button to indicate pause. + // + PushButtonTextSet(&g_sPlayPause, g_pcPause); + WidgetPaint((tWidget *)&g_sPlayPause); + } + else + { + // + // Play was pressed on an invalid file. + // + CanvasTextSet(&g_sStatusText, "Invalid wav format "); + WidgetPaint((tWidget *)&g_sPlayPause); + + return; + } + + // + // Initialize the read and write pointers. + // + g_pui8Read = g_pui8AudioBuffer; + g_pui8Write = g_pui8AudioBuffer; + g_ui32ValidBytes = 0; + + // + // Fill the audio buffer from the file. + // + FillAudioBuffer(); + + // + // Start the audio playback. + // + USBSoundBufferOut((uint8_t *)g_pui8Read, g_ui32TransferSize, + USBAudioOutCallback); + } + else if(g_ePlayState == AUDIO_PLAYING) + { + // + // Now switching to a paused state, so change the button to say play. + // + PushButtonTextSet(&g_sPlayPause, g_pcPlay); + WidgetPaint((tWidget *)&g_sPlayPause); + + g_ePlayState = AUDIO_PAUSED; + } + else if(g_ePlayState == AUDIO_PAUSED) + { + // + // Fill the audio buffer from the file. + // + FillAudioBuffer(); + + // + // Start the audio playback. + // + USBSoundBufferOut((uint8_t *)g_pui8Read, g_ui32TransferSize, + USBAudioOutCallback); + + // + // Now switching to a play state, so change the button to say paused. + // + PushButtonTextSet(&g_sPlayPause, g_pcPause); + WidgetPaint((tWidget *)&g_sPlayPause); + + g_ePlayState = AUDIO_PLAYING; + } +} + +//***************************************************************************** +// +// Stopped pressed so stop the wav playback. +// +//***************************************************************************** +static void +Stop(tWidget *psWidget) +{ + // + // Stop play back if we are playing. + // + if((g_ePlayState == AUDIO_PLAYING) || (g_ePlayState == AUDIO_PAUSED)) + { + WaveStop(); + } +} + +//***************************************************************************** +// +// This function is called to read the contents of the current directory on +// the SD card and fill the listbox containing the names of all files and +// directories. +// +//***************************************************************************** +static int +PopulateFileListBox(bool bRepaint) +{ + uint32_t ui32ItemCount; + FRESULT iFResult; + + // + // Empty the list box on the display. + // + ListBoxClear(&g_sDirList); + + // + // Make sure the list box will be redrawn next time the message queue + // is processed. + // + if(bRepaint) + { + WidgetPaint((tWidget *)&g_sDirList); + } + + // + // Open the current directory for access. + // + iFResult = f_opendir(&g_sDirObject, g_pcCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + // + // Change the text to reflect the change. + // + CanvasTextSet(&g_sStatusText, g_pcDirError); + WidgetPaint((tWidget *)&g_sStatusText); + return(iFResult); + } + + // + // If not at the root then add the ".." entry. + // + if(g_pcCwdBuf[1] != 0) + { + g_pcFilenames[0][0] = '.'; + g_pcFilenames[0][1] = '.'; + g_pcFilenames[0][2] = 0; + ListBoxTextAdd(&g_sDirList, g_pcFilenames[0]); + ui32ItemCount = 1; + } + else + { + ui32ItemCount = 0; + } + + // + // Enter loop to enumerate through all directory entries. + // + for(;;) + { + // + // Read an entry from the directory. + // + iFResult = f_readdir(&g_sDirObject, &g_sFileInfo); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + // + // Change the text to reflect the change. + // + CanvasTextSet(&g_sStatusText, g_pcDirError); + WidgetPaint((tWidget *)&g_sStatusText); + return(iFResult); + } + + // + // If the file name is blank, then this is the end of the + // listing. + // + if(!g_sFileInfo.fname[0]) + { + break; + } + + // + // Add the information as a line in the listbox widget. + // + if(ui32ItemCount < NUM_LIST_STRINGS) + { + if(g_sFileInfo.fattrib & AM_DIR) + { + usnprintf(g_pcFilenames[ui32ItemCount], + MAX_FILENAME_STRING_LEN, "+ %s", g_sFileInfo.fname); + } + else + { + ustrncpy(g_pcFilenames[ui32ItemCount], g_sFileInfo.fname, + MAX_FILENAME_STRING_LEN); + } + ListBoxTextAdd(&g_sDirList, g_pcFilenames[ui32ItemCount]); + } + + // + // Move to the next entry in the item array we use to populate the + // list box. + // + ui32ItemCount++; + } + + // + // Made it to here, return with no errors. + // + return(0); +} + +//***************************************************************************** +// +// The listbox widget callback function. +// +// This function is called whenever someone changes the selected entry in the +// listbox containing the files and directories found in the current directory. +// +//***************************************************************************** +void OnListBoxChange(tWidget *psWidget, int16_t i16Selected) +{ + int16_t i16Sel; + + // + // Get the current selection from the list box. + // + i16Sel = ListBoxSelectionGet(&g_sDirList); + + // + // Is there any selection? + // + if(i16Sel == -1) + { + return; + } + else + { + // + // Is the selection a directory name. + // + if(g_pcFilenames[i16Sel][0] == '+') + { + if((g_ePlayState != AUDIO_PLAYING) && + (g_ePlayState != AUDIO_PAUSED)) + { + CanvasTextSet(&g_sWaveInfoFileName, ""); + CanvasTextSet(&g_sWaveInfoSample, ""); + g_pcTime[0] = 0; + } + + if(ChangeToDirectory(&g_pcFilenames[i16Sel][2]) == FR_OK) + { + PopulateFileListBox(true); + } + } + else if((g_pcFilenames[i16Sel][0] == '.') && + (g_pcFilenames[i16Sel][1] == '.')) + { + // + // If this was the .. selection then move up a directory. + // + if(ChangeToDirectory("..") == FR_OK) + { + PopulateFileListBox(true); + } + + if((g_ePlayState != AUDIO_PLAYING) && + (g_ePlayState != AUDIO_PAUSED)) + { + CanvasTextSet(&g_sWaveInfoFileName, ""); + CanvasTextSet(&g_sWaveInfoSample, ""); + g_pcTime[0] = 0; + } + } + else + { + // + // This was a normal file selections so see if it is a wav file. + // + CanvasTextSet(&g_sWaveInfoFileName, g_pcFilenames[i16Sel]); + + if((g_ePlayState == AUDIO_PLAYING) || + (g_ePlayState == AUDIO_PAUSED)) + { + WaveStop(); + } + + if(WavOpen(g_pcFilenames[i16Sel], &g_sWavFile) == 0) + { + // + // Read the .wav file format. + // + WavGetFormat(&g_sWavFile, &g_sWavHeader); + + // + // Print the formatted string so that it can be + // displayed. + // + usprintf(g_pcFormat, "%d Hz %d bit ", + g_sWavHeader.ui32SampleRate, + g_sWavHeader.ui16BitsPerSample); + + // + // Concatenate the number of channels. + // + if(g_sWavHeader.ui16NumChannels == 1) + { + strcat(g_pcFormat, "Mono"); + } + else + { + strcat(g_pcFormat, "Stereo"); + } + + CanvasTextSet(&g_sWaveInfoSample, g_pcFormat); + + // + // Calculate the minutes and seconds in the file. + // + g_ui16Seconds = g_sWavHeader.ui32DataSize / + g_sWavHeader.ui32AvgByteRate; + g_ui16Minutes = g_ui16Seconds / 60; + g_ui16Seconds -= g_ui16Minutes * 60; + + // + // Close the file, it will be re-opened on play. + // + WavClose(&g_sWavFile); + + // + // Update the file time information. + // + DisplayTime(1); + + // + // Close the file, it will be re-opened on play. + // + WavClose(&g_sWavFile); + } + else + { + CanvasTextSet(&g_sWaveInfoSample, ""); + g_pcTime[0] = 0; + WidgetPaint((tWidget *)&g_sWaveInfoTime); + } + } + + // + // Update the file name and wav file information + // + WidgetPaint((tWidget *)&g_sWaveInfoFileName); + WidgetPaint((tWidget *)&g_sWaveInfoSample); + WidgetPaint((tWidget *)&g_sWaveInfoTime); + } +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. FatFs requires a +// timer tick every 10ms for internal timing purposes. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Call the FatFs tick timer. + // + disk_timerproc(); +} + +//***************************************************************************** +// +// Initializes the file system module. +// +// \param None. +// +// This function initializes the third party FAT implementation. +// +// \return Returns \e true on success or \e false on failure. +// +//***************************************************************************** +static bool +FileInit(void) +{ + // + // Mount the file system, using logical disk 0. + // + if(f_mount(0, &g_sFatFs) != FR_OK) + { + return(false); + } + return(true); +} + +//***************************************************************************** +// +// This function handled global level events for the USB host audio. This +// function was passed into the USBSoundInit() function. +// +//***************************************************************************** +static void +AudioEvent(uint32_t ui32Event, uint32_t ui32Param) +{ + switch(ui32Event) + { + case SOUND_EVENT_READY: + { + // + // Flag that a new audio device is present. + // + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 1; + + // + // Change the text to reflect the change. + // + CanvasTextSet(&g_sStatusText, "Ready "); + WidgetPaint((tWidget *)&g_sStatusText); + + break; + } + case SOUND_EVENT_DISCONNECT: + { + // + // If playing return the button text to play. + // + if(g_ePlayState == AUDIO_PLAYING) + { + PushButtonTextSet(&g_sPlayPause, g_pcPlay); + WidgetPaint((tWidget *)&g_sPlayPause); + + WaveStop(); + } + + // + // Device is no longer present. + // + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 0; + g_ePlayState = AUDIO_NONE; + + // + // Change the text to reflect the change. + // + CanvasTextSet(&g_sStatusText, g_pcNoDevice); + WidgetPaint((tWidget *)&g_sStatusText); + + break; + } + case SOUND_EVENT_UNKNOWN_DEV: + { + if(ui32Param == 1) + { + // + // . + // + CanvasTextSet(&g_sStatusText, g_pcUnknownDevice); + } + else + { + // + // Unknown device disconnected. + // + CanvasTextSet(&g_sStatusText, g_pcNoDevice); + } + WidgetPaint((tWidget *)&g_sStatusText); + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// The program main function. It performs initialization, then handles wav +// file playback. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Temp; + uint32_t ui32Retcode, ui32PLLRate; +#ifdef USE_ULPI + uint32_t ui32Setting; +#endif + + // + // Set the system clock to run at 120MHz from the PLL. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + +#ifdef USE_ULPI + // + // Switch the USB ULPI Pins over. + // + USBULPIPinoutSet(); + + // + // Enable USB ULPI with high speed support. + // + ui32Setting = USBLIB_FEATURE_ULPI_HS; + USBOTGFeatureSet(0, USBLIB_FEATURE_USBULPI, &ui32Setting); + + // + // Setting the PLL frequency to zero tells the USB library to use the + // external USB clock. + // + ui32PLLRate = 0; +#else + // + // Save the PLL rate used by this application. + // + ui32PLLRate = 480000000; +#endif + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(g_ui32SysClock / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-host-audio"); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(g_ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(WidgetPointerMessage); + + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sDirList); + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sStatusPanel); + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sWaveInfoBackground); + + // + // Issue the initial paint request to the widgets then immediately call + // the widget manager to process the paint message. This ensures that the + // display is drawn as quickly as possible and saves the delay we would + // otherwise experience if we processed the paint message after mounting + // and reading the SD card. + // + WidgetPaint(WIDGET_ROOT); + WidgetMessageQueueProcess(); + + // + // Determine whether or not an SD Card is installed. If not, print a + // warning and have the user install one and restart. + // + ui32Retcode = disk_initialize(0); + + if(ui32Retcode != RES_OK) + { + CanvasTextSet(&g_sStatusText, "File system error! "); + WidgetPaint((tWidget *)&g_sStatusText); + while(1); + } + else + { + // + // Mount the file system, using logical disk 0. + // + f_mount(0, &g_sFatFs); + + if(!FileInit()) + { + CanvasTextSet(&g_sStatusText, "File system error! "); + WidgetPaint((tWidget *)&g_sStatusText); + while(1); + } + } + + // + // Not playing anything right now. + // + g_ui32Flags = 0; + g_ePlayState = AUDIO_NONE; + + PopulateFileListBox(true); + + // + // Tell the USB library the CPU clock and the PLL frequency. This is a + // new requirement for TM4C129 devices. + // + USBHCDFeatureSet(0, USBLIB_FEATURE_CPUCLK, &g_ui32SysClock); + USBHCDFeatureSet(0, USBLIB_FEATURE_USBPLL, &ui32PLLRate); + + // + // Configure the USB host output. + // + USBSoundInit(0, AudioEvent); + + // + // Enter an (almost) infinite loop for reading and processing commands from + // the user. + // + while(1) + { + // + // On connect change the device state to ready. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT)) + { + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 0; + + // + // Getting here means the device is ready. + // Reset the CWD to the root directory. + // + g_pcCwdBuf[0] = '/'; + g_pcCwdBuf[1] = 0; + + // + // Initiate a directory change to the root. This will + // populate a menu structure representing the root directory. + // + if(ChangeToDirectory("/") == FR_OK) + { + // + // Request a repaint so the file menu will be shown + // + WidgetPaint(WIDGET_ROOT); + } + else + { + CanvasTextSet(&g_sStatusText, + "Error accessing root directory "); + WidgetPaint((tWidget *)&g_sStatusText); + while(1); + } + + // + // Attempt to set the audio format to 44100 16 bit stereo by + // default otherwise try 48000 16 bit stereo. + // + if(USBSoundOutputFormatSet(44100, 16, 2) == 0) + { + ui32Temp = 44100; + } + else if(USBSoundOutputFormatSet(48000, 16, 2) == 0) + { + ui32Temp = 48000; + } + else + { + ui32Temp = 0; + } + + // + // If the audio device was support put the sample rate in the + // status line. + // + if(ui32Temp != 0) + { + // + // Calculate the number of bytes per USB frame. + // + g_ui32TransferSize = (ui32Temp * 4) / 1000; + + // + // Calculate the size of the audio buffer. + // + g_ui32BufferSize = AUDIO_BUFFERS * g_ui32TransferSize; + + // + // Print the time string in the format mm.ss/mm.ss + // + if(ui32Temp == 44100) + { + CanvasTextSet(&g_sStatusText, "44.1 kHz Ready "); + } + else if(ui32Temp == 48000) + { + CanvasTextSet(&g_sStatusText, "48 kHz Ready "); + } + + g_ePlayState = AUDIO_STOPPED; + } + else + { + CanvasTextSet(&g_sStatusText, "Unsupported Audio Device "); + g_ePlayState = AUDIO_NONE; + } + WidgetPaint((tWidget *)&g_sStatusText); + } + + // + // Handle the case when the wave file is playing. + // + if(g_ePlayState == AUDIO_PLAYING) + { + // + // Handle the transmit complete event. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_TX_COMPLETE)) + { + // + // Clear the transmit complete flag. + // + HWREGBITW(&g_ui32Flags, FLAGS_TX_COMPLETE) = 0; + + // + // If there is space available then fill the buffer. + // + FillAudioBuffer(); + + // + // If we run out of valid bytes then stop the playback. + // + if(g_ui32ValidBytes == 0) + { + // + // No more data or error so stop playing. + // + WaveStop(); + } + + // + // Update the real display time. + // + DisplayTime(0); + } + } + + // + // Need to periodically call the USBSoundMain() routine so that + // non-interrupt gets a chance to run. + // + USBSoundMain(); + + // + // Process any messages in the widget message queue. + // + WidgetMessageQueueProcess(); + } +} + diff --git a/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ewd b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ewp b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ewp new file mode 100644 index 0000000..eccc4bc --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ewp @@ -0,0 +1,826 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\usb_host_audio.c + + + $PROJ_DIR$\..\drivers\usb_sound.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + $PROJ_DIR$\..\..\..\..\utils\wavfile.c + + + diff --git a/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.icf b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.icf new file mode 100644 index 0000000..446697f --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_audio.icf - Linker configuration file for usb_host_audio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ld b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ld new file mode 100644 index 0000000..fe5586f --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_audio.ld - Linker configuration file for usb_host_audio. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.sct b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.sct new file mode 100644 index 0000000..5ef103b --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_audio.sct - Linker configuration file for usb_host_audio. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.uvopt b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.uvopt new file mode 100644 index 0000000..db2729f --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.uvopt @@ -0,0 +1,457 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_audio + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + mmc-dk-tm4c129x.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 7 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_audio.c + usb_host_audio.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\usb_sound.c + usb_sound.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\wavfile.c + wavfile.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 14 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 15 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 16 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.uvproj b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.uvproj new file mode 100644 index 0000000..b082e1b --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio.uvproj @@ -0,0 +1,484 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_host_audio + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_audio + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_audio.bin .\rvmdk\usb_host_audio.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..;..\..\..\..\third_party;..\..\..\..\utils; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_audio.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + mmc-dk-tm4c129x.c + 1 + ..\..\..\..\third_party\fatfs\port\mmc-dk-tm4c129x.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + usb_host_audio.c + 1 + .\usb_host_audio.c + + + usb_sound.c + 1 + ..\drivers\usb_sound.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + wavfile.c + 1 + ..\..\..\..\utils\wavfile.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_audio/usb_host_audio_ccs.cmd b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio_ccs.cmd new file mode 100644 index 0000000..508557d --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio/usb_host_audio_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_audio_ccs.cmd - CCS linker configuration file for usb_host_audio. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/dk-tm4c129x/usb_host_audio_in/Makefile b/boards/dk-tm4c129x/usb_host_audio_in/Makefile new file mode 100644 index 0000000..09db7fa --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/Makefile @@ -0,0 +1,95 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host audio input example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB host audio input example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_audio_in.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host audio input example. +# +${COMPILER}/usb_host_audio_in.axf: ${COMPILER}/frame.o +${COMPILER}/usb_host_audio_in.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_host_audio_in.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_host_audio_in.axf: ${COMPILER}/sound.o +${COMPILER}/usb_host_audio_in.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_audio_in.axf: ${COMPILER}/touch.o +${COMPILER}/usb_host_audio_in.axf: ${COMPILER}/usb_host_audio_in.o +${COMPILER}/usb_host_audio_in.axf: ${COMPILER}/usb_sound.o +${COMPILER}/usb_host_audio_in.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_host_audio_in.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_audio_in.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_audio_in.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_audio_in.axf: usb_host_audio_in.ld +SCATTERgcc_usb_host_audio_in=usb_host_audio_in.ld +ENTRY_usb_host_audio_in=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_host_audio_in/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_host_audio_in/ccs/.ccsimportspec new file mode 100644 index 0000000..ec2571f --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_audio_in/ccs/.ccsproject b/boards/dk-tm4c129x/usb_host_audio_in/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_audio_in/ccs/.cproject b/boards/dk-tm4c129x/usb_host_audio_in/ccs/.cproject new file mode 100644 index 0000000..b590189 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/ccs/.cproject @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_audio_in/ccs/.project b/boards/dk-tm4c129x/usb_host_audio_in/ccs/.project new file mode 100644 index 0000000..49209cc --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/ccs/.project @@ -0,0 +1,85 @@ + + + usb_host_audio_in + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_audio_in/startup_ccs.c + + + usb_host_audio_in.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.c + + + usb_host_audio_in_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/sound.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/sound.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + drivers/usb_sound.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/usb_sound.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_host_audio_in/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_host_audio_in/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_host_audio_in/ccs/Debug/usb_host_audio_in.bin b/boards/dk-tm4c129x/usb_host_audio_in/ccs/Debug/usb_host_audio_in.bin new file mode 100644 index 0000000..70ad370 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio_in/ccs/Debug/usb_host_audio_in.bin differ diff --git a/boards/dk-tm4c129x/usb_host_audio_in/ccs/Debug/usb_host_audio_in.out b/boards/dk-tm4c129x/usb_host_audio_in/ccs/Debug/usb_host_audio_in.out new file mode 100644 index 0000000..b092b0d Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio_in/ccs/Debug/usb_host_audio_in.out differ diff --git a/boards/dk-tm4c129x/usb_host_audio_in/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_host_audio_in/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_host_audio_in/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_host_audio_in/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_audio_in/ewarm/Exe/usb_host_audio_in.bin b/boards/dk-tm4c129x/usb_host_audio_in/ewarm/Exe/usb_host_audio_in.bin new file mode 100644 index 0000000..51a9556 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio_in/ewarm/Exe/usb_host_audio_in.bin differ diff --git a/boards/dk-tm4c129x/usb_host_audio_in/ewarm/Exe/usb_host_audio_in.out b/boards/dk-tm4c129x/usb_host_audio_in/ewarm/Exe/usb_host_audio_in.out new file mode 100644 index 0000000..ea12dcb Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio_in/ewarm/Exe/usb_host_audio_in.out differ diff --git a/boards/dk-tm4c129x/usb_host_audio_in/gcc/usb_host_audio_in.axf b/boards/dk-tm4c129x/usb_host_audio_in/gcc/usb_host_audio_in.axf new file mode 100644 index 0000000..123fe2e Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio_in/gcc/usb_host_audio_in.axf differ diff --git a/boards/dk-tm4c129x/usb_host_audio_in/gcc/usb_host_audio_in.bin b/boards/dk-tm4c129x/usb_host_audio_in/gcc/usb_host_audio_in.bin new file mode 100644 index 0000000..9068841 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio_in/gcc/usb_host_audio_in.bin differ diff --git a/boards/dk-tm4c129x/usb_host_audio_in/readme.txt b/boards/dk-tm4c129x/usb_host_audio_in/readme.txt new file mode 100644 index 0000000..76c5886 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/readme.txt @@ -0,0 +1,35 @@ +USB host audio example application using a USB audio device for input +and PWM audio to the on board speaker for output. + +This example application demonstrates streaming audio from a USB audio +device that supports recording an audio source at 48000 16 bit stereo. +The application starts recording audio from the USB audio device when +the "Record" button is pressed and stream it to the speaker on the board. +Because some audio devices require more power, you may need to use an +external 5 volt supply to provide enough power to the USB audio device. + +The application can be recompiled to run using and external USB phy to +implement a high speed host using an external USB phy. To use the external +phy the application must be built with \b USE_ULPI defined. This disables +the internal phy and the connector on the DK-TM4C129X board and enables the +connections to the external ULPI phy pins on the DK-TM4C129X board. + +------------------------------------------------------------------------------- + +Copyright (c) 2010-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_host_audio_in/rvmdk/usb_host_audio_in.axf b/boards/dk-tm4c129x/usb_host_audio_in/rvmdk/usb_host_audio_in.axf new file mode 100644 index 0000000..0af42df Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio_in/rvmdk/usb_host_audio_in.axf differ diff --git a/boards/dk-tm4c129x/usb_host_audio_in/rvmdk/usb_host_audio_in.bin b/boards/dk-tm4c129x/usb_host_audio_in/rvmdk/usb_host_audio_in.bin new file mode 100644 index 0000000..e676494 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_audio_in/rvmdk/usb_host_audio_in.bin differ diff --git a/boards/dk-tm4c129x/usb_host_audio_in/startup_ccs.c b/boards/dk-tm4c129x/usb_host_audio_in/startup_ccs.c new file mode 100644 index 0000000..7e2f713 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SoundIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + SoundIntHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_audio_in/startup_ewarm.c b/boards/dk-tm4c129x/usb_host_audio_in/startup_ewarm.c new file mode 100644 index 0000000..4aa9b90 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SoundIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + SoundIntHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_audio_in/startup_gcc.c b/boards/dk-tm4c129x/usb_host_audio_in/startup_gcc.c new file mode 100644 index 0000000..e8e3ffb --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SoundIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + SoundIntHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_audio_in/startup_rvmdk.S b/boards/dk-tm4c129x/usb_host_audio_in/startup_rvmdk.S new file mode 100644 index 0000000..17ac79f --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SoundIntHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD SoundIntHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.c b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.c new file mode 100644 index 0000000..b2ee667 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.c @@ -0,0 +1,791 @@ +//***************************************************************************** +// +// usb_host_audioin.c - Main routine for the USB host audio input example. +// +// Copyright (c) 2010-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_ints.h" +#include "inc/hw_sysctl.h" +#include "driverlib/flash.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/slider.h" +#include "grlib/listbox.h" +#include "grlib/pushbutton.h" +#include "utils/ustdlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/usb_sound.h" +#include "drivers/sound.h" +#include "drivers/touch.h" +#include "drivers/pinout.h" +#include "drivers/usb_sound.h" +#include "usblib/usblib.h" +#include "usblib/host/usbhost.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB host audio example application using a USB audio device for input +//! and PWM audio to the on board speaker for output. (usb_host_audioin)

      +//! +//! This example application demonstrates streaming audio from a USB audio +//! device that supports recording an audio source at 48000 16 bit stereo. +//! The application starts recording audio from the USB audio device when +//! the "Record" button is pressed and stream it to the speaker on the board. +//! Because some audio devices require more power, you may need to use an +//! external 5 volt supply to provide enough power to the USB audio device. +//! +//! The application can be recompiled to run using and external USB phy to +//! implement a high speed host using an external USB phy. To use the external +//! phy the application must be built with \b USE_ULPI defined. This disables +//! the internal phy and the connector on the DK-TM4C129X board and enables the +//! connections to the external ULPI phy pins on the DK-TM4C129X board. +// +//***************************************************************************** + +//***************************************************************************** +// +// Interrupt priority definitions. The top 3 bits of these values are +// significant with lower values indicating higher priority interrupts. +// +//***************************************************************************** +#define AUDIO_INT_PRIORITY 0x00 +#define ADC3_INT_PRIORITY 0x80 + +//***************************************************************************** +// +// Forward declarations for functions called by the widgets used in the user +// interface. +// +//***************************************************************************** +static void OnRecord(tWidget *pWidget); + +//***************************************************************************** +// +// Audio buffering definitions, these are optimized to deal with USB audio. +// +//***************************************************************************** +#define USB_TRANSFER_SIZE (192) +#define USB_BUFFERS (18) +#define USB_AUDIO_BUFFER_SIZE (USB_TRANSFER_SIZE * USB_BUFFERS) +#define PWM_AUDIO_BUFFER_SIZE (USB_AUDIO_BUFFER_SIZE / (2 * 3 * 2)) +#define AUDIO_MIN_DIFF (USB_TRANSFER_SIZE * ((USB_BUFFERS >> 1) - 1)) +#define AUDIO_NOMINAL_DIFF (USB_TRANSFER_SIZE * (USB_BUFFERS >> 1)) +#define AUDIO_MAX_DIFF (USB_TRANSFER_SIZE * ((USB_BUFFERS >> 1) + 1)) +uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// The USB audio buffer and it's pointers. +// +//***************************************************************************** +static uint8_t g_pui8USBAudioBuffer[USB_AUDIO_BUFFER_SIZE]; +static uint8_t *g_pui8USBWrite; +static volatile uint32_t g_ui32USBCount; + +//***************************************************************************** +// +// The PWM audio buffer and it's pointers. +// +//***************************************************************************** +static int16_t g_pi16PWMAudioBuffer[PWM_AUDIO_BUFFER_SIZE]; +static int32_t i32PWMAudioIdx; + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +static tContext g_sContext; + +//***************************************************************************** +// +// Variable status string for the application. +// +//***************************************************************************** +#define STATUS_SIZE 40 +static char g_pcStatusText[STATUS_SIZE]; + +//***************************************************************************** +// +// Holds global flags for the system. +// +//***************************************************************************** +static uint32_t g_ui32Flags; + +// +// Currently streaming audio to the USB device. +// +#define FLAGS_STREAMING 1 + +// +// New audio device present. +// +#define FLAGS_DEVICE_CONNECT 2 + +// +// New audio device present. +// +#define FLAGS_DEVICE_READY 3 + +//***************************************************************************** +// +// Widget definitions +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines for the basic screen area used by the application. +// +//***************************************************************************** +#define STATUS_HEIGHT 40 +#define BG_MIN_X 7 +#define BG_MAX_X (320 - 8) +#define BG_MIN_Y 24 +#define BG_MAX_Y (240 - 8) +#define BUTTON_HEIGHT (STATUS_HEIGHT - 8) + +//***************************************************************************** +// +// The list box used to display directory contents. +// +//***************************************************************************** +tCanvasWidget g_sStatusPanel; + +// +// Status text area. +// +Canvas(g_sStatusText, &g_sStatusPanel, 0, 0, &g_sKentec320x240x16_SSD2119, + BG_MIN_X + 112, BG_MAX_Y - STATUS_HEIGHT + 4, 189, BUTTON_HEIGHT, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_RIGHT | + CANVAS_STYLE_TEXT_OPAQUE, ClrLightGrey, ClrDarkGray, ClrBlack, + g_psFontCmss16, "", 0, 0); + +// +// Record button. +// +RectangularButton(g_sRecord, &g_sStatusPanel, &g_sStatusText, 0, + &g_sKentec320x240x16_SSD2119, BG_MIN_X + 4, + BG_MAX_Y - STATUS_HEIGHT + 4, 50, BUTTON_HEIGHT, + PB_STYLE_FILL | PB_STYLE_TEXT | + PB_STYLE_RELEASE_NOTIFY, ClrLightGrey, ClrDarkGray, 0, + ClrBlack, g_psFontCmss16, "Record", 0, 0, 0 ,0 , OnRecord); + +// +// Background of the status area behind the buttons. +// +Canvas(g_sStatusPanel, WIDGET_ROOT, 0, &g_sRecord, + &g_sKentec320x240x16_SSD2119, BG_MIN_X, BG_MAX_Y - STATUS_HEIGHT, + BG_MAX_X - BG_MIN_X, STATUS_HEIGHT, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT_RIGHT | + CANVAS_STYLE_TEXT_TOP, ClrGray, ClrWhite, ClrBlack, 0, + 0, 0, 0); + +//***************************************************************************** +// +// The PWM audio callback from the sound driver for the dk-tm4c129x board. +// +//***************************************************************************** +void +PWMAudioCallback(uint32_t ui32Half) +{ + int32_t i32Current, i32PeriodAdj; + + // + // Initial sound period adjustment is 0. + // + i32PeriodAdj = 0; + + // + // Calculate the number of buffers that we are from ideal. + // + i32Current = ((int32_t)g_pui8USBAudioBuffer - (int32_t)g_pui8USBWrite + + (USB_AUDIO_BUFFER_SIZE / 2)) / (int32_t)(USB_TRANSFER_SIZE); + + // + // Make sample rate adjustments based on being in the top half of the + // ping-pong buffer. + // + if(ui32Half) + { + // + // USB is faster than the PWM audio. + // + if(g_ui32USBCount > (USB_BUFFERS / 2)) + { + // + // PWM audio is running slow so speed it up and handle the sign + // properly. + // + if(i32Current < 0) + { + i32PeriodAdj = i32Current; + } + else + { + i32PeriodAdj = -i32Current; + } + } + else if(g_ui32USBCount < (USB_BUFFERS / 2)) + { + // + // PWM audio is running fast so slow it down and handle the sign + // properly. + // + if(i32Current < 0) + { + i32PeriodAdj = -i32Current; + } + else + { + i32PeriodAdj = i32Current; + } + } + } + else + { + // + // The measurements are reversed when in the bottom half. + // + i32Current = -i32Current; + + // + // USB is faster than the PWM audio. + // + if(g_ui32USBCount > (USB_BUFFERS / 2)) + { + // + // PWM audio is running slow so speed it up and handle the sign + // properly. + // + if(i32Current < 0) + { + i32PeriodAdj = i32Current; + } + else + { + i32PeriodAdj = -i32Current; + } + } + else if(g_ui32USBCount < (USB_BUFFERS / 2)) + { + // + // PWM audio is running fast so slow it down and handle the sign + // properly. + // + if(i32Current < 0) + { + i32PeriodAdj = -i32Current; + } + else + { + i32PeriodAdj = i32Current; + } + } + } + + // + // Was there an adjustment to make? + // + if(i32PeriodAdj != 0) + { + SoundPeriodAdjust(i32PeriodAdj); + } + + // + // Reset the USB audio buffer count. + // + g_ui32USBCount = 0; +} + + +//***************************************************************************** +// +// Schedules new USB Isochronous input from the USB audio device when a +// previous transfer has completed. +// +//***************************************************************************** +static void +USBAudioInCallback(void *pvBuffer, uint32_t ui32Event, uint32_t ui32Value) +{ + int32_t i32Idx; + int16_t *pi16Buffer; + + // + // Increase the number of USB audio buffers received. + // + g_ui32USBCount++; + + // + // Create a 16-bit pointer to the data. + // + pi16Buffer = (int16_t *)g_pui8USBWrite; + + // + // If a buffer has been played then schedule a new one to play. + // + if((ui32Event == USB_EVENT_RX_AVAILABLE) && + (HWREGBITW(&g_ui32Flags, FLAGS_STREAMING))) + { + // + // Increment the read pointer. + // + g_pui8USBWrite += USB_TRANSFER_SIZE; + + // + // Wrap the read pointer if necessary. + // + if(g_pui8USBWrite >= (g_pui8USBAudioBuffer + USB_AUDIO_BUFFER_SIZE)) + { + g_pui8USBWrite = g_pui8USBAudioBuffer; + } + + // + // Schedule a new USB audio buffer to be transmitted to the USB + // audio device. + // + USBSoundBufferIn(g_pui8USBWrite, USB_TRANSFER_SIZE, USBAudioInCallback); + + // + // This copy throws away 2 out of 3 samples to match the basic + // sample rate difference of 48kHz versus 16kHz. + // + for(i32Idx = 0; i32Idx < (ui32Value >> 1); i32Idx+=6) + { + // + // Basic stereo mix to mono. + // + g_pi16PWMAudioBuffer[i32PWMAudioIdx] = pi16Buffer[i32Idx] + + pi16Buffer[i32Idx + 1]; + + i32PWMAudioIdx++; + + if(i32PWMAudioIdx >= PWM_AUDIO_BUFFER_SIZE) + { + i32PWMAudioIdx = 0; + } + } + } +} + +//***************************************************************************** +// +// This function starts up the audio streaming from the USB audio device. The +// PWM audio is started later when enough audio has been received to start +// transferring buffers to the PWM audio interface. +// +//***************************************************************************** +static void +StartStreaming(void) +{ + int i; + + // + // Change the text on the button to Stop. + // + PushButtonTextSet(&g_sRecord, "Stop"); + WidgetPaint((tWidget *)&g_sRecord); + + // + // Zero out the PWM audio buffer. + // + for(i=0; i< PWM_AUDIO_BUFFER_SIZE; i++) + { + g_pi16PWMAudioBuffer[i] = 0; + } + + // + // Initialize the USB audio write pointer to the middle of the buffer. + // + g_pui8USBWrite = g_pui8USBAudioBuffer + (USB_AUDIO_BUFFER_SIZE / 2); + + // + // Initialize the fill position of the PWM audio buffer to the middle of + // its buffer. + // + i32PWMAudioIdx = PWM_AUDIO_BUFFER_SIZE/2; + + // + // Initialize the USB audio count. + // + g_ui32USBCount = 0; + + // + // Initialize the PWM audio and start playing. + // + SoundInit(g_ui32SysClock); + SoundStart((int16_t *)g_pi16PWMAudioBuffer, PWM_AUDIO_BUFFER_SIZE, 16000, + PWMAudioCallback); + + // + // Request and audio buffer from the USB device. + // + USBSoundBufferIn(g_pui8USBWrite, USB_TRANSFER_SIZE, USBAudioInCallback); +} + +//***************************************************************************** +// +// Stops audio streaming for the application. +// +//***************************************************************************** +static void +StopAudio(void) +{ + int32_t i32Idx; + uint32_t *pui32Buffer; + + // + // Stop playing audio. + // + HWREGBITW(&g_ui32Flags, FLAGS_STREAMING) = 0; + + // + // Do 32-bit accesses to clear out the buffer. + // + pui32Buffer = (uint32_t *)g_pui8USBAudioBuffer; + + // + // Zero out the buffer. + // + for(i32Idx = 0; i32Idx < (USB_AUDIO_BUFFER_SIZE >> 2); i32Idx++) + { + pui32Buffer[i32Idx] = 0; + } + + // + // Initialize the read and write pointers. + // + g_pui8USBWrite = g_pui8USBAudioBuffer + (USB_AUDIO_BUFFER_SIZE / 2); + + // + // Change the text on the button to Stop. + // + PushButtonTextSet(&g_sRecord, "Record"); + WidgetPaint((tWidget *)&g_sRecord); + + SoundStop(); +} + +//***************************************************************************** +// +// The "Play/Stop" button widget call back function. +// +// This function is called whenever someone presses the "Play/Stop" button. +// +//***************************************************************************** +static void +OnRecord(tWidget *pWidget) +{ + // + // Nothing to do if not ready yet. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_READY)) + { + // + // Determine if this was a Play or Stop command. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_STREAMING)) + { + // + // If already playing then this was a press to stop play back. + // + StopAudio(); + } + else + { + // + // Indicate that audio streaming should start. + // + HWREGBITW(&g_ui32Flags, FLAGS_STREAMING) = 1; + StartStreaming(); + } + } +} + +//***************************************************************************** +// +// This function handled global level events for the USB host audio. This +// function was passed into the USBSoundInit() function. +// +//***************************************************************************** +static void +AudioEvent(uint32_t ui32Event, uint32_t ui32Param) +{ + switch(ui32Event) + { + case SOUND_EVENT_READY: + { + // + // Flag that a new audio device is present. + // + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 1; + + break; + } + case SOUND_EVENT_DISCONNECT: + { + // + // Device is no longer present. + // + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_READY) = 0; + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 0; + + // + // Stop streaming audio. + // + StopAudio(); + + // + // Change the text to reflect the change. + // + CanvasTextSet(&g_sStatusText, "No Device"); + WidgetPaint((tWidget *)&g_sStatusText); + + break; + } + case SOUND_EVENT_UNKNOWN_DEV: + { + if(ui32Param == 1) + { + // + // Unknown device connected. + // + CanvasTextSet(&g_sStatusText, "Unknown Device"); + WidgetPaint((tWidget *)&g_sStatusText); + } + else + { + // + // Unknown device disconnected. + // + CanvasTextSet(&g_sStatusText, "No Device"); + WidgetPaint((tWidget *)&g_sStatusText); + } + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The program main function. It performs initialization, then handles wav +// file playback. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Temp, ui32PLLRate; + + // + // Set the system clock to run at 120MHz from the PLL. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Set the device pinout appropriately for this board. + // + PinoutSet(); + // + // Save the PLL rate used by this application. + // + ui32PLLRate = 480000000; + + // + // Set the interrupt priorities to give USB and timer higher priority + // than the ADC. While playing the touch screen should have lower priority + // to reduce audio drop out. + // + ROM_IntPriorityGroupingSet(4); + ROM_IntPrioritySet(INT_USB0, AUDIO_INT_PRIORITY); + ROM_IntPrioritySet(INT_TIMER5A, AUDIO_INT_PRIORITY); + ROM_IntPrioritySet(INT_ADC0SS3, ADC3_INT_PRIORITY); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-host-audio-in"); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(g_ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(WidgetPointerMessage); + + // + // Issue the initial paint request to the widgets then immediately call + // the widget manager to process the paint message. This ensures that the + // display is drawn as quickly as possible and saves the delay we would + // otherwise experience if we processed the paint message after mounting + // and reading the SD card. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sStatusPanel); + WidgetPaint(WIDGET_ROOT); + WidgetMessageQueueProcess(); + + // + // Not playing anything right now. + // + g_ui32Flags = 0; + + // + // Tell the USB library the CPU clock and the PLL frequency. This is a + // new requirement for TM4C129 devices. + // + USBHCDFeatureSet(0, USBLIB_FEATURE_CPUCLK, &g_ui32SysClock); + USBHCDFeatureSet(0, USBLIB_FEATURE_USBPLL, &ui32PLLRate); + + // + // Configure the USB host audio. + // + USBSoundInit(0, AudioEvent); + + // + // Initialize audio streaming to stopped state. + // + StopAudio(); + SoundInit(g_ui32SysClock); + SoundVolumeSet(255); + + while(1) + { + // + // On connect change the device state to ready. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT)) + { + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 0; + + // + // Attempt to set the audio format to 48000 16 bit stereo. + // + if(USBSoundInputFormatSet(48000, 16, 2) == 0) + { + ui32Temp = 48000; + } + else + { + ui32Temp = 0; + } + + // + // Try to set the output format to match the input and fail if it + // cannot be set. + // + if((ui32Temp != 0) && + (USBSoundOutputFormatSet(ui32Temp, 16, 2) != 0)) + { + ui32Temp = 0; + } + + // + // If the audio device was support put the sample rate in the + // status line. + // + if(ui32Temp != 0) + { + // + // Print the time string in the format mm.ss/mm.ss + // + usprintf(g_pcStatusText, "Ready %dHz 16 bit Stereo", + ui32Temp); + + // + // USB device is ready for operation. + // + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_READY) = 1; + } + else + { + strcpy(g_pcStatusText, "Unsupported Audio Device"); + } + + // + // Update the status line. + // + CanvasTextSet(&g_sStatusText, g_pcStatusText); + WidgetPaint((tWidget *)&g_sStatusText); + } + + // + // Allow the USB non-interrupt code to run. + // + USBSoundMain(); + + // + // Process any messages in the widget message queue. + // + WidgetMessageQueueProcess(); + } +} diff --git a/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ewd b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ewp b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ewp new file mode 100644 index 0000000..fea56aa --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ewp @@ -0,0 +1,813 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\..\drivers\sound.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\usb_host_audio_in.c + + + $PROJ_DIR$\..\drivers\usb_sound.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.icf b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.icf new file mode 100644 index 0000000..9feacdf --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_audio_in.icf - Linker configuration file for usb_host_audio_in. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ld b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ld new file mode 100644 index 0000000..e7ea443 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_audio_in.ld - Linker configuration file for usb_host_audio_in. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.sct b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.sct new file mode 100644 index 0000000..9686268 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_audio_in.sct - Linker configuration file for usb_host_audio_in. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.uvopt b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.uvopt new file mode 100644 index 0000000..43459c7 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.uvopt @@ -0,0 +1,415 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_audio_in + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\sound.c + sound.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_audio_in.c + usb_host_audio_in.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\usb_sound.c + usb_sound.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 12 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 13 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.uvproj b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.uvproj new file mode 100644 index 0000000..36e60c8 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in.uvproj @@ -0,0 +1,469 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_host_audio_in + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_audio_in + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_audio_in.bin .\rvmdk\usb_host_audio_in.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_audio_in.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + sound.c + 1 + ..\drivers\sound.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + usb_host_audio_in.c + 1 + .\usb_host_audio_in.c + + + usb_sound.c + 1 + ..\drivers\usb_sound.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in_ccs.cmd b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in_ccs.cmd new file mode 100644 index 0000000..f5279da --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_audio_in/usb_host_audio_in_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_audio_in_ccs.cmd - CCS linker configuration file for usb_host_audio_in. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/dk-tm4c129x/usb_host_hub/Makefile b/boards/dk-tm4c129x/usb_host_hub/Makefile new file mode 100644 index 0000000..64416dc --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/Makefile @@ -0,0 +1,100 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host Hub keyboard/msc example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the USB host Hub keyboard/msc example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_hub.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host Hub keyboard/msc example. +# +${COMPILER}/usb_host_hub.axf: ${COMPILER}/cmdline.o +${COMPILER}/usb_host_hub.axf: ${COMPILER}/fat_usbmsc.o +${COMPILER}/usb_host_hub.axf: ${COMPILER}/ff.o +${COMPILER}/usb_host_hub.axf: ${COMPILER}/frame.o +${COMPILER}/usb_host_hub.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_host_hub.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_host_hub.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_hub.axf: ${COMPILER}/usb_host_hub.o +${COMPILER}/usb_host_hub.axf: ${COMPILER}/usb_host_keyboard.o +${COMPILER}/usb_host_hub.axf: ${COMPILER}/usb_host_msc.o +${COMPILER}/usb_host_hub.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_host_hub.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_hub.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_hub.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_hub.axf: usb_host_hub.ld +SCATTERgcc_usb_host_hub=usb_host_hub.ld +ENTRY_usb_host_hub=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_host_hub/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_host_hub/ccs/.ccsimportspec new file mode 100644 index 0000000..11379e2 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/ccs/.ccsimportspec @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_hub/ccs/.ccsproject b/boards/dk-tm4c129x/usb_host_hub/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_hub/ccs/.cproject b/boards/dk-tm4c129x/usb_host_hub/ccs/.cproject new file mode 100644 index 0000000..fee8fd0 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/ccs/.cproject @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_hub/ccs/.project b/boards/dk-tm4c129x/usb_host_hub/ccs/.project new file mode 100644 index 0000000..395cab9 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/ccs/.project @@ -0,0 +1,95 @@ + + + usb_host_hub + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_hub/startup_ccs.c + + + usb_host_hub.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.c + + + usb_host_hub_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_hub/usb_host_hub_ccs.cmd + + + usb_host_keyboard.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_hub/usb_host_keyboard.c + + + usb_host_msc.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_hub/usb_host_msc.c + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/cmdline.c + 1 + SW_ROOT/utils/cmdline.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/fatfs/port/fat_usbmsc.c + 1 + SW_ROOT/third_party/fatfs/port/fat_usbmsc.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_host_hub/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_host_hub/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_host_hub/ccs/Debug/usb_host_hub.bin b/boards/dk-tm4c129x/usb_host_hub/ccs/Debug/usb_host_hub.bin new file mode 100644 index 0000000..e36089b Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_hub/ccs/Debug/usb_host_hub.bin differ diff --git a/boards/dk-tm4c129x/usb_host_hub/ccs/Debug/usb_host_hub.out b/boards/dk-tm4c129x/usb_host_hub/ccs/Debug/usb_host_hub.out new file mode 100644 index 0000000..9330c59 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_hub/ccs/Debug/usb_host_hub.out differ diff --git a/boards/dk-tm4c129x/usb_host_hub/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_host_hub/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_host_hub/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_host_hub/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_hub/ewarm/Exe/usb_host_hub.bin b/boards/dk-tm4c129x/usb_host_hub/ewarm/Exe/usb_host_hub.bin new file mode 100644 index 0000000..c89bd8f Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_hub/ewarm/Exe/usb_host_hub.bin differ diff --git a/boards/dk-tm4c129x/usb_host_hub/ewarm/Exe/usb_host_hub.out b/boards/dk-tm4c129x/usb_host_hub/ewarm/Exe/usb_host_hub.out new file mode 100644 index 0000000..155af65 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_hub/ewarm/Exe/usb_host_hub.out differ diff --git a/boards/dk-tm4c129x/usb_host_hub/gcc/usb_host_hub.axf b/boards/dk-tm4c129x/usb_host_hub/gcc/usb_host_hub.axf new file mode 100644 index 0000000..97e8e4b Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_hub/gcc/usb_host_hub.axf differ diff --git a/boards/dk-tm4c129x/usb_host_hub/gcc/usb_host_hub.bin b/boards/dk-tm4c129x/usb_host_hub/gcc/usb_host_hub.bin new file mode 100644 index 0000000..19ca975 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_hub/gcc/usb_host_hub.bin differ diff --git a/boards/dk-tm4c129x/usb_host_hub/readme.txt b/boards/dk-tm4c129x/usb_host_hub/readme.txt new file mode 100644 index 0000000..bc99e7a --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/readme.txt @@ -0,0 +1,44 @@ +USB HUB Host example(usb_host_hub) + +This example application demonstrates how to support a USB keyboard +and a USB mass storage with a USB Hub. The application emulates a very +simple console with the USB keyboard used for input. The application +requires that the mass storage device is also inserted or the console will +generate errors when accessing the file system. The console supports the +following commands: "ls", "cat", "pwd", "cd" and "help". The "ls" command +will provide a listing of the files in the current directory. The "cat" +command can be used to print the contents of a file to the screen. The +"pwd" command displays the current working directory. The "cd" command +allows the application to move to a new directory. The cd command is +simplified and only supports "cd .." but not directory changes like +"cd ../somedir". The "help" command has other aliases that are displayed +when the "help" command is issued. + +Any keyboard that supports the USB HID BIOS protocol should work with this +demo application. + +The application can be recompiled to run using and external USB phy to +implement a high speed host using an external USB phy. To use the external +phy the application must be built with \b USE_ULPI defined. This disables +the internal phy and the connector on the DK-TM4C129X board and enables the +connections to the external ULPI phy pins on the DK-TM4C129X board. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_host_hub/rvmdk/usb_host_hub.axf b/boards/dk-tm4c129x/usb_host_hub/rvmdk/usb_host_hub.axf new file mode 100644 index 0000000..a0a0f86 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_hub/rvmdk/usb_host_hub.axf differ diff --git a/boards/dk-tm4c129x/usb_host_hub/rvmdk/usb_host_hub.bin b/boards/dk-tm4c129x/usb_host_hub/rvmdk/usb_host_hub.bin new file mode 100644 index 0000000..a8eab88 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_hub/rvmdk/usb_host_hub.bin differ diff --git a/boards/dk-tm4c129x/usb_host_hub/startup_ccs.c b/boards/dk-tm4c129x/usb_host_hub/startup_ccs.c new file mode 100644 index 0000000..b58a80a --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_hub/startup_ewarm.c b/boards/dk-tm4c129x/usb_host_hub/startup_ewarm.c new file mode 100644 index 0000000..c7be392 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_hub/startup_gcc.c b/boards/dk-tm4c129x/usb_host_hub/startup_gcc.c new file mode 100644 index 0000000..401f526 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_hub/startup_rvmdk.S b/boards/dk-tm4c129x/usb_host_hub/startup_rvmdk.S new file mode 100644 index 0000000..812126e --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.c b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.c new file mode 100644 index 0000000..6753cbb --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.c @@ -0,0 +1,1133 @@ +//***************************************************************************** +// +// usb_host_hub.c - An example using that supports a USB Hub, USB keyboard, and +// a USB mass storage device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhhid.h" +#include "usblib/host/usbhhub.h" +#include "usblib/host/usbhhidkeyboard.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "third_party/fatfs/src/ff.h" +#include "utils/cmdline.h" +#include "utils/ustdlib.h" +#include "usb_host_hub.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB HUB Host example(usb_host_hub)

      +//! +//! This example application demonstrates how to support a USB keyboard +//! and a USB mass storage with a USB Hub. The application emulates a very +//! simple console with the USB keyboard used for input. The application +//! requires that the mass storage device is also inserted or the console will +//! generate errors when accessing the file system. The console supports the +//! following commands: "ls", "cat", "pwd", "cd" and "help". The "ls" command +//! will provide a listing of the files in the current directory. The "cat" +//! command can be used to print the contents of a file to the screen. The +//! "pwd" command displays the current working directory. The "cd" command +//! allows the application to move to a new directory. The cd command is +//! simplified and only supports "cd .." but not directory changes like +//! "cd ../somedir". The "help" command has other aliases that are displayed +//! when the "help" command is issued. +//! +//! Any keyboard that supports the USB HID BIOS protocol should work with this +//! demo application. +//! +//! The application can be recompiled to run using and external USB phy to +//! implement a high speed host using an external USB phy. To use the external +//! phy the application must be built with \b USE_ULPI defined. This disables +//! the internal phy and the connector on the DK-TM4C129X board and enables the +//! connections to the external ULPI phy pins on the DK-TM4C129X board. +// +//***************************************************************************** + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE * MAX_USB_DEVICES]; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the Keyboard class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostMSCClassDriver, + &g_sUSBHIDClassDriver, + &g_sUSBHubClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / TICKS_PER_SECOND) + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The global flags for this application. The only flag defined is the +// FLAG_CMD_READY which indicates that a command has been entered and is ready +// to be processed. +// +//***************************************************************************** +static uint32_t g_ui32Flags; + +#define FLAG_CMD_READY 0x00000001 + +//***************************************************************************** +// +// These defines are used to define the screen constraints to the application. +// +//***************************************************************************** +#define DISPLAY_BANNER_HEIGHT 18 +#define DISPLAY_TEXT_BORDER 8 +#define DISPLAY_TEXT_BORDER_H 8 +#define BUTTON_WIDTH ((320 - (2 * DISPLAY_TEXT_BORDER_H)) / \ + NUM_HUB_STATUS) +#define BUTTON_HEIGHT 18 + +//***************************************************************************** +// +// This is the number of characters that will fit on a line in the text area. +// +//***************************************************************************** +uint32_t g_ui32CharsPerLine; + +//***************************************************************************** +// +// This is the number of lines that will fit in the text area. +// +//***************************************************************************** +uint32_t g_ui32LinesPerScreen; + +//***************************************************************************** +// +// This is the current line for printing in the text area. +// +//***************************************************************************** +uint32_t g_ui32Line; + +//***************************************************************************** +// +// This is the current column for printing in the text area. +// +//***************************************************************************** +uint32_t g_ui32Column; + +//***************************************************************************** +// +// File system variables. +// +//***************************************************************************** +const char * StringFromFresult(FRESULT fresult); + +//***************************************************************************** +// +// Defines the size of the buffer that holds the command line. +// +//***************************************************************************** +#define CMD_BUF_SIZE 64 + +//***************************************************************************** +// +// Define the maximum number of lines and columns in the command windows. +// +//***************************************************************************** +#define MAX_LINES 23 +#define MAX_COLUMNS 60 + +//***************************************************************************** +// +// The buffer that holds the command line. +// +//***************************************************************************** +static char g_pcCmdBuf[CMD_BUF_SIZE]; + +//***************************************************************************** +// +// The variables that are used to allow the screen to scroll. +// +//***************************************************************************** +static uint32_t g_ui32CmdIdx; +static char g_pcLines[MAX_LINES * MAX_COLUMNS]; +static uint32_t g_ui32CurrentLine; + +//***************************************************************************** +// +// Status bar boxes for hub ports. +// +//***************************************************************************** +#define NUM_HUB_STATUS 4 +struct +{ + // + // Holds if there is a device connected to this port. + // + bool bConnected; + + // + // The instance data for the device if bConnected is true. + // + uint32_t ui32Instance; +} +g_psHubStatus[NUM_HUB_STATUS]; + +//***************************************************************************** +// +// Print a string to the screen and save it to the screen buffer. +// +//***************************************************************************** +void +WriteString(const char *pcString) +{ + uint32_t ui32Size, ui32StrSize; + char *pcCurLine; + int32_t i32Idx; + + ui32StrSize = ustrlen(pcString); + + // + // Check if the string requires scrolling the text in order to print. + // + if((g_ui32Line >= MAX_LINES) && (g_ui32Column == 0)) + { + // + // Start redrawing at line 0. + // + g_ui32Line = 0; + + // + // Print lines from the current position down first. + // + for(i32Idx = g_ui32CurrentLine + 1; i32Idx < MAX_LINES; i32Idx++) + { + GrStringDraw(&g_sContext, g_pcLines + (MAX_COLUMNS * i32Idx), + ustrlen(g_pcLines + (MAX_COLUMNS * i32Idx)), + DISPLAY_TEXT_BORDER_H, + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (g_ui32Line * GrFontHeightGet(g_psFontFixed6x8)), 1); + + g_ui32Line++; + } + + // + // If not already at the top then print the lines starting at the + // top of the buffer. + // + if(g_ui32CurrentLine != 0) + { + for(i32Idx = 0; i32Idx < g_ui32CurrentLine; i32Idx++) + { + GrStringDraw(&g_sContext, g_pcLines + (MAX_COLUMNS * i32Idx), + ustrlen(g_pcLines + (MAX_COLUMNS * i32Idx)), + DISPLAY_TEXT_BORDER_H, + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (g_ui32Line * GrFontHeightGet(g_psFontFixed6x8)), + 1); + + g_ui32Line++; + } + } + } + + // + // Save the current line pointer to use in references below. + // + pcCurLine = g_pcLines + (MAX_COLUMNS * g_ui32CurrentLine); + + if(g_ui32Column + ui32StrSize >= MAX_COLUMNS - 1) + { + ui32Size = MAX_COLUMNS - g_ui32Column - 1; + } + else + { + ui32Size = ui32StrSize; + } + + // + // Handle the case where the string has a new line at the end. + // + if(pcString[ui32StrSize-1] == '\n') + { + // + // Make sure that this is not a single new line. + // + if(ui32Size > 0 ) + { + // + // Copy the string into the screen buffer. + // + ustrncpy(pcCurLine + g_ui32Column, pcString, ui32Size - 1); + } + + // + // If this is the start of a new line then clear out the rest of the + // line by writing spaces to the end of the line. + // + if(g_ui32Column == 0) + { + // + // Clear out the string with spaces to overwrite any existing + // characters with spaces. + // + for(i32Idx = ui32Size - 1; i32Idx < MAX_COLUMNS; i32Idx++) + { + pcCurLine[i32Idx] = ' '; + } + } + + // + // Null terminate the string. + // + pcCurLine[g_ui32Column + MAX_COLUMNS - 1] = 0; + + // + // Draw the new string. + // + GrStringDraw(&g_sContext, pcCurLine + g_ui32Column, ui32Size - 1, + DISPLAY_TEXT_BORDER_H + + (GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column), + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (g_ui32Line * GrFontHeightGet(g_psFontFixed6x8)), 1); + + // + // Increment the line values and reset the column to 0. + // + g_ui32Line++; + g_ui32CurrentLine++; + + if(g_ui32CurrentLine >= MAX_LINES) + { + g_ui32CurrentLine = 0; + } + g_ui32Column = 0; + } + else + { + // + // Copy the string into the screen buffer. + // + ustrncpy(pcCurLine + g_ui32Column, pcString, ui32Size); + + // + // See if this was the first string draw on this line. + // + if(g_ui32Column == 0) + { + // + // Pad the rest of the string with spaces to overwrite any existing + // characters with spaces. + // + for(i32Idx = ui32Size; i32Idx < MAX_COLUMNS - 1; i32Idx++) + { + pcCurLine[i32Idx] = ' '; + } + + // + // Draw the new string. + // + GrStringDraw(&g_sContext, + pcCurLine + g_ui32Column, MAX_COLUMNS - 1, + DISPLAY_TEXT_BORDER_H + + (GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column), + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (g_ui32Line * GrFontHeightGet(g_psFontFixed6x8)), 1); + } + else + { + // + // Draw the new string. + // + GrStringDraw(&g_sContext, pcCurLine + g_ui32Column, + g_ui32Column + ui32Size, + DISPLAY_TEXT_BORDER_H + + (GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column), + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (g_ui32Line * GrFontHeightGet(g_psFontFixed6x8)), 1); + } + + // + // Update the current column. + // + g_ui32Column += ui32Size; + } +} + +//***************************************************************************** +// +// This function prints the character out the screen and into the command +// buffer. +// +// ucChar is the character to print out. +// +// This function handles all of the detail of printing a character to the +// screen and into the command line buffer. +// +// No return value. +// +//***************************************************************************** +void +PrintChar(const char cChar) +{ + int32_t i32Char; + char *pcCurLine; + + GrContextForegroundSet(&g_sContext, ClrWhite); + + pcCurLine = g_pcLines + (MAX_COLUMNS * g_ui32CurrentLine); + + // + // Allow new lines to cause the column to go back to zero. + // + if(cChar != '\n') + { + // + // Handle when receiving a backspace character. + // + if(cChar != ASCII_BACKSPACE) + { + // + // This is not a backspace so print the character to the screen. + // + GrStringDraw(&g_sContext, &cChar, 1, + DISPLAY_TEXT_BORDER_H + + (GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column), + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (g_ui32Line * GrFontHeightGet(g_psFontFixed6x8)), 1); + + pcCurLine[g_ui32Column] = cChar; + } + else + { + // + // We got a backspace. If we are at the top left of the screen, + // return since we don't need to do anything. + // + if(g_ui32Column || g_ui32Line) + { + // + // Adjust the cursor position to erase the last character. + // + if(g_ui32Column > 2) + { + g_ui32Column--; + g_ui32CmdIdx--; + } + + // + // Print a space at this position then return without fixing up + // the cursor again. + // + GrStringDraw(&g_sContext, " ", 1, + DISPLAY_TEXT_BORDER_H + + (GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column), + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (g_ui32Line * GrFontHeightGet(g_psFontFixed6x8)), + true); + + pcCurLine[g_ui32Column] = ' '; + } + return; + } + } + else + { + for(i32Char = g_ui32Column; i32Char < MAX_COLUMNS - 1; i32Char++) + { + pcCurLine[i32Char] = ' '; + } + + // + // Null terminate the string when enter is pressed. + // + pcCurLine[MAX_COLUMNS - 1] = 0; + + g_ui32CurrentLine++; + if(g_ui32CurrentLine >= MAX_LINES) + { + g_ui32CurrentLine = 0; + } + + + // + // This will allow the code below to properly handle the new line. + // + g_ui32Column = g_ui32CharsPerLine; + + g_ui32Flags |= FLAG_CMD_READY; + + g_pcCmdBuf[g_ui32CmdIdx++] = ' '; + } + + // + // Update the text row and column that the next character will use. + // + if(g_ui32Column < g_ui32CharsPerLine) + { + // + // No line wrap yet so move one column over. + // + g_ui32Column++; + } + else + { + // + // Line wrapped so go back to the first column and update the line. + // + g_ui32Column = 0; + g_ui32Line++; + + // + // The line has gone past the end so go back to the first line. + // + if(g_ui32Line >= g_ui32LinesPerScreen) + { + g_ui32Line = g_ui32LinesPerScreen - 1; + } + } + + // + // Save the new character in the buffer. + // + g_pcCmdBuf[g_ui32CmdIdx++] = cChar; +} + +//***************************************************************************** +// +// This function implements the "help" command. It prints a simple list +// of the available commands with a brief description. +// +//***************************************************************************** +int +Cmd_help(int argc, char *argv[]) +{ + tCmdLineEntry *psEntry; + + // + // Print some header text. + // + WriteString("Available commands\n"); + WriteString("------------------\n"); + + // + // Point at the beginning of the command table. + // + psEntry = &g_psCmdTable[0]; + + // + // Enter a loop to read each entry from the command table. The + // end of the table has been reached when the command name is NULL. + // + while(psEntry->pcCmd) + { + // + // Print the command name and the brief description. + // + WriteString(psEntry->pcCmd); + WriteString(psEntry->pcHelp); + WriteString("\n"); + + // + // Advance to the next entry in the table. + // + psEntry++; + } + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This is the table that holds the command names, implementing functions, +// and brief description. +// +//***************************************************************************** +tCmdLineEntry g_psCmdTable[] = +{ + { "help", Cmd_help, " : Display list of commands" }, + { "h", Cmd_help, " : alias for help" }, + { "?", Cmd_help, " : alias for help" }, + { "ls", Cmd_ls, " : Display list of files" }, + { "chdir", Cmd_cd, ": Change directory" }, + { "cd", Cmd_cd, " : alias for chdir" }, + { "pwd", Cmd_pwd, " : Show current working directory" }, + { "cat", Cmd_cat, " : Show contents of a text file" }, + { 0, 0, 0 } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Update one of the status boxes at the bottom of the screen. +// +//***************************************************************************** +static void +UpdateStatusBox(tRectangle *psRect, const char *pcString, bool bActive) +{ + uint32_t ui32TextColor; + + // + // Change the status box to green for active devices. + // + if(bActive) + { + GrContextForegroundSet(&g_sContext, ClrOrange); + ui32TextColor = ClrBlack; + } + else + { + GrContextForegroundSet(&g_sContext, ClrBlack); + ui32TextColor = ClrWhite; + } + + // + // Draw the background box. + // + GrRectFill(&g_sContext, psRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Draw the box border. + // + GrRectDraw(&g_sContext, psRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ui32TextColor); + + // + // Unknown device is currently connected. + // + GrStringDrawCentered(&g_sContext, pcString, -1, + psRect->i16XMin + (BUTTON_WIDTH / 2), + psRect->i16YMin + 8, false); + +} + +//***************************************************************************** +// +// This function updates the status area of the screen. It uses the current +// state of the application to print the status bar. +// +//***************************************************************************** +void +UpdateStatus(int32_t i32Port) +{ + tRectangle sRect; + uint8_t ui8DevClass, ui8DevProtocol; + + // + // Calculate the box size based on the lPort value to update one of the + // status boxes. The first and last boxes will draw slightly off screen + // to make the status area have no borders on the sides and bottom. + // + sRect.i16XMin = DISPLAY_TEXT_BORDER_H + (BUTTON_WIDTH * i32Port); + sRect.i16XMax = sRect.i16XMin + BUTTON_WIDTH; + sRect.i16YMin = 240 - 10 - BUTTON_HEIGHT; + sRect.i16YMax = sRect.i16YMin + BUTTON_HEIGHT; + + // + // Slightly adjust the first box to draw it off screen properly. + // + if(i32Port == (NUM_HUB_STATUS - 1)) + { + sRect.i16XMax -= 2; + } + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + if(g_psHubStatus[i32Port].bConnected) + { + ui8DevClass = USBHCDDevClass(g_psHubStatus[i32Port].ui32Instance, 0); + ui8DevProtocol = USBHCDDevProtocol( + g_psHubStatus[i32Port].ui32Instance, 0); + + if(ui8DevClass == USB_CLASS_HID) + { + if(ui8DevProtocol == USB_HID_PROTOCOL_MOUSE) + { + // + // Mouse is currently connected. + // + UpdateStatusBox(&sRect, "Mouse", true); + } + else if(ui8DevProtocol == USB_HID_PROTOCOL_KEYB) + { + // + // Keyboard is currently connected. + // + UpdateStatusBox(&sRect, "Keyboard", true); + } + else + { + // + // Unknown device is currently connected. + // + UpdateStatusBox(&sRect, "Unknown", true); + } + } + else if(ui8DevClass == USB_CLASS_MASS_STORAGE) + { + // + // MSC device is currently connected. + // + UpdateStatusBox(&sRect, "Mass Storage", true); + } + else if(ui8DevClass == USB_CLASS_HUB) + { + // + // MSC device is currently connected. + // + UpdateStatusBox(&sRect, "Hub", true); + } + else + { + // + // Unknown device is currently connected. + // + UpdateStatusBox(&sRect, "Unknown", true); + } + } + else + { + // + // Unknown device is currently connected. + // + UpdateStatusBox(&sRect, "No Device", false); + } +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the keyboard device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *pEventInfo; + uint8_t ui8Port; + + // + // Cast this pointer to its actual type. + // + pEventInfo = (tEventInfo *)pvData; + + // + // Get the hub port number that the device is connected to. + // + ui8Port = USBHCDDevHubPort(pEventInfo->ui32Instance); + + switch(pEventInfo->ui32Event) + { + case USB_EVENT_UNKNOWN_CONNECTED: + case USB_EVENT_CONNECTED: + { + // + // If this is the hub then ignore this connection. + // + if(USBHCDDevClass(pEventInfo->ui32Instance, 0) == USB_CLASS_HUB) + { + break; + } + + // + // If this is not a direct connection, then the hub is on + // port 0 so the index should be moved down from 1-4 to 0-3. + // + if(ui8Port > 0) + { + ui8Port--; + } + + // + // Save the device instance data. + // + g_psHubStatus[ui8Port].ui32Instance = pEventInfo->ui32Instance; + g_psHubStatus[ui8Port].bConnected = true; + + // + // Update the port status for the new device. + // + UpdateStatus(ui8Port); + + break; + } + // + // A device has been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // If this is not a direct connection, then the hub is on + // port 0 so the index should be moved down from 1-4 to 0-3. + // + if(ui8Port > 0) + { + ui8Port--; + } + + // + // Device is no longer connected. + // + g_psHubStatus[ui8Port].bConnected = false; + + // + // Update the port status for the new device. + // + UpdateStatus(ui8Port); + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This is the callback from the USB HUB mouse handler. +// +// pvCBData is ignored by this function. +// ui32Event is one of the valid events for a mouse device. +// ui32MsgParam is defined by the event that occurs. +// pvMsgData is a pointer to data that is defined by the event that occurs. +// +// This function will be called to inform the application when a mouse has +// been plugged in or removed and any time mouse movement or button pressed +// is detected. +// +// This function will return 0. +// +//***************************************************************************** +void +HubCallback(tHubInstance *psHubInstance, uint32_t ui32Event, + uint32_t ui32MsgParam, void *pvMsgData) +{ +} + +//***************************************************************************** +// +// The main application loop. +// +//***************************************************************************** +int +main(void) +{ + int32_t i32Status, i32Idx; + uint32_t ui32SysClock, ui32PLLRate; +#ifdef USE_ULPI + uint32_t ui32Setting; +#endif + + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Set the part pin out appropriately for this device. + // + PinoutSet(); + +#ifdef USE_ULPI + // + // Switch the USB ULPI Pins over. + // + USBULPIPinoutSet(); + + // + // Enable USB ULPI with high speed support. + // + ui32Setting = USBLIB_FEATURE_ULPI_HS; + USBOTGFeatureSet(0, USBLIB_FEATURE_USBULPI, &ui32Setting); + + // + // Setting the PLL frequency to zero tells the USB library to use the + // external USB clock. + // + ui32PLLRate = 0; +#else + // + // Save the PLL rate used by this application. + // + ui32PLLRate = 480000000; +#endif + + // + // Initialize the hub port status. + // + for(i32Idx = 0; i32Idx < NUM_HUB_STATUS; i32Idx++) + { + g_psHubStatus[i32Idx].bConnected = false; + } + + // + // Enable Clocking to the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the USB stack mode and pass in a mode callback. + // + USBStackModeSet(0, eUSBModeHost, 0); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open the Keyboard interface. + // + KeyboardOpen(); + MSCOpen(ui32SysClock); + + // + // Open a hub instance and provide it with the memory required to hold + // configuration descriptors for each attached device. + // + USBHHubOpen(HubCallback); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Tell the USB library the CPU clock and the PLL frequency. + // + USBOTGFeatureSet(0, USBLIB_FEATURE_CPUCLK, &ui32SysClock); + USBOTGFeatureSet(0, USBLIB_FEATURE_USBPLL, &ui32PLLRate); + + // + // Initialize the USB controller for Host mode. + // + USBHCDInit(0, g_pui8HCDPool, sizeof(g_pui8HCDPool)); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-host-hub"); + + // + // Calculate the number of characters that will fit on a line. + // Make sure to leave a small border for the text box. + // + g_ui32CharsPerLine = (GrContextDpyWidthGet(&g_sContext) - 16) / + GrFontMaxWidthGet(g_psFontFixed6x8); + + // + // Calculate the number of lines per usable text screen. This requires + // taking off space for the top and bottom banners and adding a small bit + // for a border. + // + g_ui32LinesPerScreen = (GrContextDpyHeightGet(&g_sContext) - + (2*(DISPLAY_BANNER_HEIGHT + 1)))/ + GrFontHeightGet(g_psFontFixed6x8); + + // + // Initial update of the screen. + // + UpdateStatus(0); + UpdateStatus(1); + UpdateStatus(2); + UpdateStatus(3); + + g_ui32CmdIdx = 0; + g_ui32CurrentLine = 0; + + // + // Initialize the file system. + // + FileInit(); + + // + // The main loop for the application. + // + while(1) + { + // + // Print a prompt to the console. Show the CWD. + // + WriteString("> "); + + // + // Is there a command waiting to be processed? + // + while((g_ui32Flags & FLAG_CMD_READY) == 0) + { + // + // Call the YSB library to let non-interrupt code run. + // + USBHCDMain(); + + // + // Call the keyboard and mass storage main routines. + // + KeyboardMain(); + MSCMain(); + } + + // + // Pass the line from the user to the command processor. + // It will be parsed and valid commands executed. + // + i32Status = CmdLineProcess(g_pcCmdBuf); + + // + // Handle the case of bad command. + // + if(i32Status == CMDLINE_BAD_CMD) + { + WriteString("Bad command!\n"); + } + // + // Handle the case of too many arguments. + // + else if(i32Status == CMDLINE_TOO_MANY_ARGS) + { + WriteString("Too many arguments for command processor!\n"); + } + // + // Otherwise the command was executed. Print the error + // code if one was returned. + // + else if(i32Status != 0) + { + WriteString("Command returned error code\n"); + WriteString((char *)StringFromFresult((FRESULT)i32Status)); + WriteString("\n"); + } + + // + // Reset the command flag and the command index. + // + g_ui32Flags &= ~FLAG_CMD_READY; + g_ui32CmdIdx = 0; + } +} diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ewd b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ewp b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ewp new file mode 100644 index 0000000..e8d7a6e --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ewp @@ -0,0 +1,821 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\..\..\..\utils\cmdline.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_host_hub.c + + + $PROJ_DIR$\usb_host_keyboard.c + + + $PROJ_DIR$\usb_host_msc.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.h b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.h new file mode 100644 index 0000000..dfe12b1 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.h @@ -0,0 +1,50 @@ +//***************************************************************************** +// +// usb_host_hub.h - The common definitions for the usb_host_hub application. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __USB_HOST_HUB_H__ +#define __USB_HOST_HUB_H__ + +//***************************************************************************** +// +// The ASCII code for a backspace character. +// +//***************************************************************************** +#define ASCII_BACKSPACE 0x08 + +void KeyboardOpen(void); +void KeyboardMain(void); +void MSCOpen(uint32_t ui32Clock); +void MSCMain(void); +void UpdateStatus(int32_t i32Port); +void PrintChar(const char cChar); +void WriteString(const char *pcString); + +bool FileInit(void); + +int Cmd_ls(int argc, char *argv[]); +int Cmd_cd(int argc, char *argv[]); +int Cmd_pwd(int argc, char *argv[]); +int Cmd_cat(int argc, char *argv[]); + +#endif diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.icf b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.icf new file mode 100644 index 0000000..604a13e --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_hub.icf - Linker configuration file for usb_host_hub. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ld b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ld new file mode 100644 index 0000000..8851b5f --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_hub.ld - Linker configuration file for usb_host_hub. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.sct b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.sct new file mode 100644 index 0000000..05bb783 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_hub.sct - Linker configuration file for usb_host_hub. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.uvopt b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.uvopt new file mode 100644 index 0000000..49d227e --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.uvopt @@ -0,0 +1,443 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_hub + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\cmdline.c + cmdline.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + fat_usbmsc.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 7 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_hub.c + usb_host_hub.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_keyboard.c + usb_host_keyboard.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_msc.c + usb_host_msc.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 12 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 14 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 15 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.uvproj b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.uvproj new file mode 100644 index 0000000..0ccafd8 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_host_hub + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_hub + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_hub.bin .\rvmdk\usb_host_hub.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_hub.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cmdline.c + 1 + ..\..\..\..\utils\cmdline.c + + + fat_usbmsc.c + 1 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_host_hub.c + 1 + .\usb_host_hub.c + + + usb_host_keyboard.c + 1 + .\usb_host_keyboard.c + + + usb_host_msc.c + 1 + .\usb_host_msc.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_hub_ccs.cmd b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub_ccs.cmd new file mode 100644 index 0000000..f3a9810 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_hub_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_hub_ccs.cmd - CCS linker configuration file for usb_host_hub. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_keyboard.c b/boards/dk-tm4c129x/usb_host_hub/usb_host_keyboard.c new file mode 100644 index 0000000..64955a1 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_keyboard.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// usb_host_keyboard.c - The USB keyboard handling routines. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhhid.h" +#include "usblib/host/usbhhidkeyboard.h" +#include "usb_host_hub.h" + +//***************************************************************************** +// +// The size of the keyboard device interface's memory pool in bytes. +// +//***************************************************************************** +#define KEYBOARD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the keyboard device. +// +//***************************************************************************** +uint8_t g_pui8Buffer[KEYBOARD_MEMORY_SIZE]; + +//***************************************************************************** +// +// The global value used to store the keyboard instance value. +// +//***************************************************************************** +static tUSBHKeyboard * g_psKeyboardInstance; + +extern const tHIDKeyboardUsageTable g_sUSKeyboardMap; + +//***************************************************************************** +// +// This enumerated type is used to hold the states of the keyboard. +// +//***************************************************************************** +enum +{ + // + // No device is present. + // + eStateNoDevice, + + // + // Keyboard has been detected and needs to be initialized in the main + // loop. + // + eStateKeyboardInit, + + // + // Keyboard is connected and waiting for events. + // + eStateKeyboardConnected, + + // + // Keyboard has received a key press that requires updating the keyboard + // in the main loop. + // + eStateKeyboardUpdate, +} +g_iKeyboardState; + +//***************************************************************************** +// +// This variable holds the current status of the modifiers keys. +// +//***************************************************************************** +uint32_t g_ui32Modifiers; + +//***************************************************************************** +// +// This is the callback from the USB HID keyboard handler. +// +// pvCBData is ignored by this function. +// ui32Event is one of the valid events for a keyboard device. +// ui32MsgParam is defined by the event that occurs. +// pvMsgData is a pointer to data that is defined by the event that +// occurs. +// +// This function will be called to inform the application when a keyboard has +// been plugged in or removed and any time a key is pressed or released. +// +// This function will return 0. +// +//***************************************************************************** +void +KeyboardCallback(tUSBHKeyboard *psKbInstance, uint32_t ui32Event, + uint32_t ui32MsgParam, void *pvMsgData) +{ + char cChar; + + switch(ui32Event) + { + // + // New keyboard detected. + // + case USB_EVENT_CONNECTED: + { + // + // Proceed to the STATE_KEYBOARD_INIT state so that the main loop + // can finish initialized the mouse since USBHKeyboardInit() cannot + // be called from within a callback. + // + g_iKeyboardState = eStateKeyboardInit; + + break; + } + + // + // Keyboard has been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Change the state so that the main loop knows that the keyboard + // is no longer present. + // + g_iKeyboardState = eStateNoDevice; + + break; + } + + // + // New Key press detected. + // + case USBH_EVENT_HID_KB_PRESS: + { + // + // If this was a Caps Lock key then update the Caps Lock state. + // + if(ui32MsgParam == HID_KEYB_USAGE_CAPSLOCK) + { + // + // The main loop needs to update the keyboard's Caps Lock + // state. + // + g_iKeyboardState = eStateKeyboardUpdate; + + // + // Toggle the current Caps Lock state. + // + g_ui32Modifiers ^= HID_KEYB_CAPS_LOCK; + } + else if(ui32MsgParam == HID_KEYB_USAGE_SCROLLOCK) + { + // + // The main loop needs to update the keyboard's Scroll Lock + // state. + // + g_iKeyboardState = eStateKeyboardUpdate; + + // + // Toggle the current Scroll Lock state. + // + g_ui32Modifiers ^= HID_KEYB_SCROLL_LOCK; + } + else if(ui32MsgParam == HID_KEYB_USAGE_NUMLOCK) + { + // + // The main loop needs to update the keyboard's Scroll Lock + // state. + // + g_iKeyboardState = eStateKeyboardUpdate; + + // + // Toggle the current Num Lock state. + // + g_ui32Modifiers ^= HID_KEYB_NUM_LOCK; + } + else + { + // + // Was this the backspace key? + // + if((uint8_t)ui32MsgParam == HID_KEYB_USAGE_BACKSPACE) + { + // + // Yes - set the ASCII code for a backspace key. This is + // not returned by USBHKeyboardUsageToChar since this only + // returns printable characters. + // + cChar = ASCII_BACKSPACE; + } + else + { + // + // This is not backspace so try to map the usage code to a + // printable ASCII character. + // + cChar = (char) + USBHKeyboardUsageToChar(g_psKeyboardInstance, + &g_sUSKeyboardMap, + (uint8_t)ui32MsgParam); + } + + // + // A zero value indicates there was no textual mapping of this + // usage code. + // + if(cChar != 0) + { + PrintChar(cChar); + } + } + break; + } + case USBH_EVENT_HID_KB_MOD: + { + // + // This application ignores the state of the shift or control + // and other special keys. + // + break; + } + case USBH_EVENT_HID_KB_REL: + { + // + // This applications ignores the release of keys as well. + // + break; + } + } +} + +//***************************************************************************** +// +// The main routine for handling the USB keyboard. +// +//***************************************************************************** +void +KeyboardMain(void) +{ + switch(g_iKeyboardState) + { + // + // This state is entered when they keyboard is first detected. + // + case eStateKeyboardInit: + { + // + // Initialized the newly connected keyboard. + // + USBHKeyboardInit(g_psKeyboardInstance); + + // + // Proceed to the keyboard connected state. + // + g_iKeyboardState = eStateKeyboardConnected; + + // + // Set the current state of the modifiers. + // + USBHKeyboardModifierSet(g_psKeyboardInstance, g_ui32Modifiers); + + break; + } + case eStateKeyboardUpdate: + { + // + // If the application detected a change that required an + // update to be sent to the keyboard to change the modifier + // state then call it and return to the connected state. + // + g_iKeyboardState = eStateKeyboardConnected; + + USBHKeyboardModifierSet(g_psKeyboardInstance, g_ui32Modifiers); + + // + // Set the USER LED based on the Caps Lock. + // + if(g_ui32Modifiers & HID_KEYB_CAPS_LOCK) + { +// ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3); + } + else + { +// ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0); + } + + break; + } + case eStateKeyboardConnected: + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +void +KeyboardOpen(void) +{ + // + // Open an instance of the keyboard driver. The keyboard does not need + // to be present at this time, this just save a place for it and allows + // the applications to be notified when a keyboard is present. + // + g_psKeyboardInstance = USBHKeyboardOpen(KeyboardCallback, g_pui8Buffer, + KEYBOARD_MEMORY_SIZE); + +// // +// // Enable the peripheral used by the USER LED. +// // +// ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + + g_ui32Modifiers = 0; + + // + // Set GPIO F3 to and output so that the LED can be controlled with GPIO + // Port F pin 3. + // +// ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3); +// ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0); +} + diff --git a/boards/dk-tm4c129x/usb_host_hub/usb_host_msc.c b/boards/dk-tm4c129x/usb_host_hub/usb_host_msc.c new file mode 100644 index 0000000..e7b9a7c --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_hub/usb_host_msc.c @@ -0,0 +1,946 @@ +//***************************************************************************** +// +// usb_host_msc.c - The USB Mass storage handling routines. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/sysctl.h" +#include "utils/ustdlib.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhmsc.h" +#include "third_party/fatfs/src/ff.h" +#include "third_party/fatfs/src/diskio.h" +#include "usb_host_hub.h" + +//***************************************************************************** +// +// A structure that holds a mapping between an FRESULT numerical code, +// and a string representation. FRESULT codes are returned from the FatFs +// FAT file system driver. +// +//***************************************************************************** +typedef struct +{ + FRESULT iResult; + char *pcResultStr; +} +tFresultString; + +//***************************************************************************** +// +// A macro to make it easy to add result codes to the table. +// +//***************************************************************************** +#define FRESULT_ENTRY(f) { (f), (#f) } + +//***************************************************************************** +// +// A table that holds a mapping between the numerical FRESULT code and +// it's name as a string. This is used for looking up error codes for +// printing to the console. +// +//***************************************************************************** +tFresultString g_sFresultStrings[] = +{ + FRESULT_ENTRY(FR_OK), + FRESULT_ENTRY(FR_NOT_READY), + FRESULT_ENTRY(FR_NO_FILE), + FRESULT_ENTRY(FR_NO_PATH), + FRESULT_ENTRY(FR_INVALID_NAME), + FRESULT_ENTRY(FR_INVALID_DRIVE), + FRESULT_ENTRY(FR_DENIED), + FRESULT_ENTRY(FR_EXIST), + FRESULT_ENTRY(FR_INVALID_OBJECT), + FRESULT_ENTRY(FR_WRITE_PROTECTED), + FRESULT_ENTRY(FR_NOT_ENABLED), + FRESULT_ENTRY(FR_NO_FILESYSTEM), + FRESULT_ENTRY(FR_INVALID_OBJECT), + FRESULT_ENTRY(FR_MKFS_ABORTED) +}; + +//***************************************************************************** +// +// A macro that holds the number of result codes. +// +//***************************************************************************** +#define NUM_FRESULT_CODES (sizeof(g_sFresultStrings) / sizeof(tFresultString)) + +//***************************************************************************** +// +// Defines the size of the buffers that hold the path, or temporary +// data from the USB disk. There are two buffers allocated of this size. +// The buffer size must be large enough to hold the longest expected +// full path name, including the file name, and a trailing null character. +// +//***************************************************************************** +#define PATH_BUF_SIZE 80 + +//***************************************************************************** +// +// This buffer holds the full path to the current working directory. +// Initially it is root ("/"). +// +//***************************************************************************** +static char g_pcCwdBuf[PATH_BUF_SIZE] = "/"; + +//***************************************************************************** +// +// A temporary data buffer used when manipulating file paths, or reading data +// from the SD card. +// +//***************************************************************************** +static char g_pcTmpBuf[PATH_BUF_SIZE]; + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static DIR g_sDirObject; +static FILINFO g_sFileInfo; +static FIL g_sFileObject; +static uint32_t g_ui32Clock; + +//***************************************************************************** +// +// Error reasons returned by ChangeDirectory(). +// +//***************************************************************************** +#define NAME_TOO_LONG_ERROR 1 +#define OPENDIR_ERROR 2 + +//***************************************************************************** +// +// Hold the current state for the application. +// +//***************************************************************************** +volatile enum +{ + // + // No device is present. + // + eStateNoDevice, + + // + // Mass storage device is being enumerated. + // + eStateDeviceEnum, + + // + // Mass storage device is ready. + // + eStateDeviceReady, + + // + // A mass storage device was connected but failed to ever report ready. + // + eStateDeviceTimeout, +} +g_iState; + +//***************************************************************************** +// +// The instance data for the MSC driver. +// +//***************************************************************************** +tUSBHMSCInstance *g_psMSCInstance; + +//***************************************************************************** +// +// The instance data for the MSC driver. +// +//***************************************************************************** +uint32_t g_ui32DriveTimeout; + +//***************************************************************************** +// +// This function initializes the third party FAT implementation. +// +// Returns true on success or false on failure. +// +//***************************************************************************** +bool +FileInit(void) +{ + // + // Mount the file system, using logical disk 0. + // + if(f_mount(0, &g_sFatFs) != FR_OK) + { + return(false); + } + return(true); +} + +//***************************************************************************** +// +// This function returns a string representation of an error code +// that was returned from a function call to FatFs. It can be used +// for printing human readable error messages. +// +//***************************************************************************** +const char * +StringFromFresult(FRESULT iResult) +{ + uint32_t ui32Idx; + + // + // Enter a loop to search the error code table for a matching + // error code. + // + for(ui32Idx = 0; ui32Idx < NUM_FRESULT_CODES; ui32Idx++) + { + // + // If a match is found, then return the string name of the + // error code. + // + if(g_sFresultStrings[ui32Idx].iResult == iResult) + { + return(g_sFresultStrings[ui32Idx].pcResultStr); + } + } + + // + // At this point no matching code was found, so return a + // string indicating unknown error. + // + return("UNKNOWN ERROR CODE"); +} + +//***************************************************************************** +// +// This function implements the "ls" command. It opens the current +// directory and enumerates through the contents, and prints a line for +// each item it finds. It shows details such as file attributes, time and +// date, and the file size, along with the name. It shows a summary of +// file sizes at the end along with free space. +// +//***************************************************************************** +int +Cmd_ls(int argc, char *argv[]) +{ + uint32_t ui32TotalSize, ui32ItemCount, ui32FileCount, ui32DirCount; + FRESULT iResult; + FATFS *psFatFs; + + // + // Open the current directory for access. + // + iResult = f_opendir(&g_sDirObject, g_pcCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(iResult != FR_OK) + { + // + // Ensure that the error is reported. + // + WriteString("Error from file system:"); + WriteString(StringFromFresult(iResult)); + WriteString("\n"); + return(iResult); + } + + ui32TotalSize = 0; + ui32FileCount = 0; + ui32DirCount = 0; + ui32ItemCount = 0; + + // + // Enter loop to enumerate through all directory entries. + // + for(;;) + { + // + // Read an entry from the directory. + // + iResult = f_readdir(&g_sDirObject, &g_sFileInfo); + + // + // Check for error and return if there is a problem. + // + if(iResult != FR_OK) + { + return(iResult); + } + + // + // If the file name is blank, then this is the end of the + // listing. + // + if(!g_sFileInfo.fname[0]) + { + break; + } + + // + // Print the entry information on a single line with formatting + // to show the attributes, date, time, size, and name. + // + usprintf(g_pcTmpBuf, "%c%c%c%c%c %u/%02u/%02u %02u:%02u %9u %s\n", + (g_sFileInfo.fattrib & AM_DIR) ? 'D' : '-', + (g_sFileInfo.fattrib & AM_RDO) ? 'R' : '-', + (g_sFileInfo.fattrib & AM_HID) ? 'H' : '-', + (g_sFileInfo.fattrib & AM_SYS) ? 'S' : '-', + (g_sFileInfo.fattrib & AM_ARC) ? 'A' : '-', + (g_sFileInfo.fdate >> 9) + 1980, + (g_sFileInfo.fdate >> 5) & 15, + g_sFileInfo.fdate & 31, + (g_sFileInfo.ftime >> 11), + (g_sFileInfo.ftime >> 5) & 63, + g_sFileInfo.fsize, + g_sFileInfo.fname); + + WriteString(g_pcTmpBuf); + + // + // If the attribute is directory, then increment the directory count. + // + if(g_sFileInfo.fattrib & AM_DIR) + { + ui32DirCount++; + } + + // + // Otherwise, it is a file. Increment the file count, and + // add in the file size to the total. + // + else + { + ui32FileCount++; + ui32TotalSize += g_sFileInfo.fsize; + } + + // + // Move to the next entry in the item array we use to populate the + // list box. + // + ui32ItemCount++; + } + + // + // Print summary lines showing the file, dir, and size totals. + // + usprintf(g_pcTmpBuf, "\n%4u File(s),%10u bytes total\n", ui32FileCount, + ui32TotalSize); + + WriteString(g_pcTmpBuf); + + // + // Get the free space. + // + iResult = f_getfree("/", (DWORD *)&ui32TotalSize, &psFatFs); + + // + // Check for error and return if there is a problem. + // + if(iResult != FR_OK) + { + return(iResult); + } + + // + // Made it to here, return with no errors. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "cd" command. It takes an argument +// that specifies the directory to make the current working directory. +// Path separators must use a forward slash "/". The argument to cd +// can be one of the following: +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so do not try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory +// to make sure it exists. If the new path is opened successfully, then +// the current working directory (cwd) is changed to the new path. +// +// In cases of error, the pui32Reason parameter will be written with one of +// the following values: +// +//***************************************************************************** +static FRESULT +ChangeToDirectory(char *pcDirectory, uint32_t *pui32Reason) +{ + uint32_t ui32Idx; + FRESULT iResult; + + // + // Copy the current working path into a temporary buffer so + // it can be manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If the first character is /, then this is a fully specified + // path, and it should just be used as-is. + // + if(pcDirectory[0] == '/') + { + // + // Make sure the new path is not bigger than the cwd buffer. + // + if(strlen(pcDirectory) + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_OK); + } + + // + // If the new path name (in argv[1]) is not too long, then + // copy it into the temporary buffer so it can be checked. + // + else + { + strncpy(g_pcTmpBuf, pcDirectory, sizeof(g_pcTmpBuf)); + } + } + + // + // If the argument is .. then attempt to remove the lowest level + // on the CWD. + // + else if(!strcmp(pcDirectory, "..")) + { + // + // Get the index to the last character in the current path. + // + ui32Idx = strlen(g_pcTmpBuf) - 1; + + // + // Back up from the end of the path name until a separator (/) + // is found, or until we bump up to the start of the path. + // + while((g_pcTmpBuf[ui32Idx] != '/') && (ui32Idx > 1)) + { + // + // Back up one character. + // + ui32Idx--; + } + + // + // Now we are either at the lowest level separator in the + // current path, or at the beginning of the string (root). + // So set the new end of string here, effectively removing + // that last part of the path. + // + g_pcTmpBuf[ui32Idx] = 0; + } + + // + // Otherwise this is just a normal path name from the current + // directory, and it needs to be appended to the current path. + // + else + { + // + // Test to make sure that when the new additional path is + // added on to the current path, there is room in the buffer + // for the full new path. It needs to include a new separator, + // and a trailing null character. + // + if(strlen(g_pcTmpBuf) + strlen(pcDirectory) + 1 + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_INVALID_OBJECT); + } + + // + // The new path is okay, so add the separator and then append + // the new directory to the path. + // + else + { + // + // If not already at the root level, then append a / + // + if(strcmp(g_pcTmpBuf, "/")) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Append the new directory to the path. + // + strcat(g_pcTmpBuf, pcDirectory); + } + } + + // + // At this point, a candidate new directory path is in chTmpBuf. + // Try to open it to make sure it is valid. + // + iResult = f_opendir(&g_sDirObject, g_pcTmpBuf); + + // + // If it cannot be opened, then it is a bad path. Inform + // user and return. + // + if(iResult != FR_OK) + { + *pui32Reason = OPENDIR_ERROR; + return(iResult); + } + + // + // Otherwise, it is a valid new path, so copy it into the CWD and update + // the screen. + // + else + { + strncpy(g_pcCwdBuf, g_pcTmpBuf, sizeof(g_pcCwdBuf)); + } + + // + // Return success. + // + return(FR_OK); +} + +//***************************************************************************** +// +// This function implements the "cd" command. It takes an argument +// that specifies the directory to make the current working directory. +// Path separators must use a forward slash "/". The argument to cd +// can be one of the following: +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so don't try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory +// to make sure it exists. If the new path is opened successfully, then +// the current working directory (cwd) is changed to the new path. +// +//***************************************************************************** +int +Cmd_cd(int argc, char *argv[]) +{ + uint32_t ui32Reason; + FRESULT iResult; + + // + // Try to change to the directory provided on the command line. + // + iResult = ChangeToDirectory(argv[1], &ui32Reason); + + // + // If an error was reported, try to offer some helpful information. + // + if(iResult != FR_OK) + { + switch(ui32Reason) + { + case OPENDIR_ERROR: + WriteString("Error opening new directory.\n"); + break; + + case NAME_TOO_LONG_ERROR: + WriteString("Resulting path name is too long.\n"); + break; + + default: + WriteString("An unrecognized error was reported.\n"); + break; + } + } + else + { + // + // Tell the user what happened. + // + WriteString("Changed to "); + WriteString(g_pcCwdBuf); + WriteString("\n"); + } + + // + // Return the appropriate error code. + // + return(iResult); +} + +//***************************************************************************** +// +// This function implements the "pwd" command. It simply prints the +// current working directory. +// +//***************************************************************************** +int +Cmd_pwd(int argc, char *argv[]) +{ + // + // Print the CWD to the console. + // + WriteString(g_pcCwdBuf); + WriteString("\n"); + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "cat" command. It reads the contents of +// a file and prints it to the console. This should only be used on +// text files. If it is used on a binary file, then a bunch of garbage +// is likely to printed on the console. +// +//***************************************************************************** +int +Cmd_cat(int argc, char *argv[]) +{ + FRESULT iResult; + uint32_t ui32BytesRead; + int iIdx; + char *pcCurrent; + + // + // First, check to make sure that the current path (CWD), plus + // the file name, plus a separator and trailing null, will all + // fit in the temporary buffer that will be used to hold the + // file name. The file name must be fully specified, with path, + // to FatFs. + // + if(strlen(g_pcCwdBuf) + strlen(argv[1]) + 1 + 1 > sizeof(g_pcTmpBuf)) + { + WriteString("Resulting path name is too long\n"); + return(0); + } + + // + // Copy the current path to the temporary buffer so it can be manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If not already at the root level, then append a separator. + // + if(strcmp("/", g_pcCwdBuf)) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Now finally, append the file name to result in a fully specified file. + // + strcat(g_pcTmpBuf, argv[1]); + + // + // Open the file for reading. + // + iResult = f_open(&g_sFileObject, g_pcTmpBuf, FA_READ); + + // + // If there was some problem opening the file, then return + // an error. + // + if(iResult != FR_OK) + { + return(iResult); + } + + // + // Enter a loop to repeatedly read data from the file and display it, + // until the end of the file is reached. + // + do + { + // + // Read a block of data from the file. Read as much as can fit + // in the temporary buffer, including a space for the trailing null. + // + iResult = f_read(&g_sFileObject, g_pcTmpBuf, sizeof(g_pcTmpBuf) - 1, + (UINT *)&ui32BytesRead); + + // + // If there was an error reading, then print a newline and + // return the error to the user. + // + if(iResult != FR_OK) + { + WriteString("\n"); + return(iResult); + } + + // + // Null terminate the last block that was read to make it a + // null terminated string that can be used with printing. + // + g_pcTmpBuf[ui32BytesRead] = 0; + + pcCurrent = g_pcTmpBuf; + + for(iIdx = 0; iIdx < ui32BytesRead; iIdx++) + { + if(g_pcTmpBuf[iIdx] == '\r') + { + // + // Ignore carriage return. + // + g_pcTmpBuf[iIdx] = 0; + } + else if(g_pcTmpBuf[iIdx] == '\n') + { + g_pcTmpBuf[iIdx] = 0; + + // + // Print the current line in the file. + // + WriteString(pcCurrent); + WriteString("\n"); + + // + // Move the pointer up to the next line. + // + pcCurrent = g_pcTmpBuf + iIdx + 1; + } + else if(g_pcTmpBuf[iIdx] == 0) + { + // + // Print the current string and move past the null. + // + WriteString(pcCurrent); + pcCurrent = g_pcTmpBuf + iIdx + 1; + } + } + + if(pcCurrent < g_pcTmpBuf + ui32BytesRead) + { + // + // Null terminate the line. + // + g_pcTmpBuf[ui32BytesRead] = 0; + + // + // Print any remaining characters before reading a new line. + // + WriteString(pcCurrent); + } + } + while(ui32BytesRead == sizeof(g_pcTmpBuf) - 1); + + WriteString("\n"); + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This is the callback from the MSC driver. +// +// ulInstance is the driver instance which is needed when communicating with +// the driver. +// ulEvent is one of the events defined by the driver. +// pvData is a pointer to data passed into the initial call to register +// the callback. +// +// This function handles callback events from the MSC driver. The only events +// currently handled are the MSC_EVENT_OPEN and MSC_EVENT_CLOSE. This allows +// the main routine to know when an MSC device has been detected and +// enumerated and when an MSC device has been removed from the system. +// +// This function returns no values. +// +//***************************************************************************** +void +MSCCallback(tUSBHMSCInstance *psMSCInstance, uint32_t ui32Event, void *pvData) +{ + // + // Determine the event. + // + switch(ui32Event) + { + // + // Called when the device driver has successfully enumerated an MSC + // device. + // + case MSC_EVENT_OPEN: + { + // + // Proceed to the enumeration state. + // + g_iState = eStateDeviceEnum; + + break; + } + + // + // Called when the device driver has been unloaded due to error or + // the device is no longer present. + // + case MSC_EVENT_CLOSE: + { + // + // Go back to the "no device" state and wait for a new connection. + // + g_iState = eStateNoDevice; + + // + // Re-initialize the file system. + // + FileInit(); + + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// Prepares an instance of the USB MSC class to handle a USB flash drive. +// +//***************************************************************************** +void +MSCOpen(uint32_t ui32Clock) +{ + // + // Save the processor clock. + // + g_ui32Clock = ui32Clock; + + // + // Open an instance of the mass storage class driver. + // + g_psMSCInstance = USBHMSCDriveOpen(0, MSCCallback); +} + +//***************************************************************************** +// +// The main routine for handling the USB mass storage device. +// +//***************************************************************************** +void +MSCMain(void) +{ + FRESULT iResult; + + switch(g_iState) + { + case eStateDeviceEnum: + { + // + // Take it easy on the Mass storage device if it is slow to + // start up after connecting. + // + if(USBHMSCDriveReady(g_psMSCInstance) != 0) + { + // + // Wait about 500ms before attempting to check if the + // device is ready again. + // + SysCtlDelay(g_ui32Clock/(3*2)); + + // + // Decrement the retry count. + // + g_ui32DriveTimeout--; + + // + // If the timeout is hit then go to the + // eStateDeviceTimeout state. + // + if(g_ui32DriveTimeout == 0) + { + g_iState = eStateDeviceTimeout; + } + + break; + } + + // + // Reset the root directory. + // + g_pcCwdBuf[0] = '/'; + g_pcCwdBuf[1] = 0; + + // + // Open the current directory for access. + // + iResult = f_opendir(&g_sDirObject, g_pcCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(iResult != FR_OK) + { + // + // Ensure that the error is reported. + // + WriteString("Error from USB disk:"); + WriteString((char *)StringFromFresult(iResult)); + WriteString("\n"); + return; + } + + g_iState = eStateDeviceReady; + + break; + } + + // + // The connected mass storage device is not reporting ready. + // + case eStateDeviceTimeout: + { + WriteString("\n"); + WriteString("Device Timeout.\n"); + break; + } + case eStateNoDevice: + case eStateDeviceReady: + default: + { + break; + } + } +} diff --git a/boards/dk-tm4c129x/usb_host_keyboard/Makefile b/boards/dk-tm4c129x/usb_host_keyboard/Makefile new file mode 100644 index 0000000..2d4d4f4 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host keyboard example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB host keyboard example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_keyboard.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host keyboard example. +# +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/frame.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/keyboard_ui.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/touch.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/usb_host_keyboard.o +${COMPILER}/usb_host_keyboard.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_keyboard.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_keyboard.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_keyboard.axf: usb_host_keyboard.ld +SCATTERgcc_usb_host_keyboard=usb_host_keyboard.ld +ENTRY_usb_host_keyboard=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_host_keyboard/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_host_keyboard/ccs/.ccsimportspec new file mode 100644 index 0000000..29d7898 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_keyboard/ccs/.ccsproject b/boards/dk-tm4c129x/usb_host_keyboard/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_keyboard/ccs/.cproject b/boards/dk-tm4c129x/usb_host_keyboard/ccs/.cproject new file mode 100644 index 0000000..b909c55 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/ccs/.cproject @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_keyboard/ccs/.project b/boards/dk-tm4c129x/usb_host_keyboard/ccs/.project new file mode 100644 index 0000000..2d8f252 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/ccs/.project @@ -0,0 +1,75 @@ + + + usb_host_keyboard + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + keyboard_ui.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_keyboard/keyboard_ui.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_keyboard/startup_ccs.c + + + usb_host_keyboard.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.c + + + usb_host_keyboard_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin b/boards/dk-tm4c129x/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin new file mode 100644 index 0000000..5b5ec03 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin differ diff --git a/boards/dk-tm4c129x/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out b/boards/dk-tm4c129x/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out new file mode 100644 index 0000000..e6a3d4b Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out differ diff --git a/boards/dk-tm4c129x/usb_host_keyboard/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_host_keyboard/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_host_keyboard/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_host_keyboard/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin b/boards/dk-tm4c129x/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin new file mode 100644 index 0000000..6d96248 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin differ diff --git a/boards/dk-tm4c129x/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out b/boards/dk-tm4c129x/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out new file mode 100644 index 0000000..9899f6c Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out differ diff --git a/boards/dk-tm4c129x/usb_host_keyboard/gcc/usb_host_keyboard.axf b/boards/dk-tm4c129x/usb_host_keyboard/gcc/usb_host_keyboard.axf new file mode 100644 index 0000000..3d8a582 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_keyboard/gcc/usb_host_keyboard.axf differ diff --git a/boards/dk-tm4c129x/usb_host_keyboard/gcc/usb_host_keyboard.bin b/boards/dk-tm4c129x/usb_host_keyboard/gcc/usb_host_keyboard.bin new file mode 100644 index 0000000..f05d591 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_keyboard/gcc/usb_host_keyboard.bin differ diff --git a/boards/dk-tm4c129x/usb_host_keyboard/keyboard_ui.c b/boards/dk-tm4c129x/usb_host_keyboard/keyboard_ui.c new file mode 100644 index 0000000..780c4e2 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/keyboard_ui.c @@ -0,0 +1,578 @@ +//***************************************************************************** +// +// keyboard_ui.c - The DK-TM4C129X USB keyboard application UI. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +#include +#include +#include +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/host/usbhost.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "keyboard_ui.h" + +//***************************************************************************** +// +// These defines are used to define the screen constraints to the application. +// +//***************************************************************************** +#define DISPLAY_BANNER_HEIGHT 18 +#define DISPLAY_TEXT_BORDER 8 +#define DISPLAY_TEXT_BORDER_H 8 +#define BUTTON_HEIGHT 18 + +//***************************************************************************** +// +// This is the number of characters that will fit on a line in the text area. +// +//***************************************************************************** +uint32_t g_ui32CharsPerLine; + +//***************************************************************************** +// +// This is the number of lines that will fit in the text area. +// +//***************************************************************************** +uint32_t g_ui32LinesPerScreen; + +//***************************************************************************** +// +// This is the current column for printing in the text area. +// +//***************************************************************************** +uint32_t g_ui32Column; + +//***************************************************************************** +// +// Define the maximum number of lines and columns in the command windows. +// +//***************************************************************************** +#define MAX_LINES 23 +#define MAX_COLUMNS 60 + +//***************************************************************************** +// +// The variables that are used to allow the screen to scroll. +// +//***************************************************************************** +static char g_ppcLines[MAX_LINES][MAX_COLUMNS]; +static uint32_t g_ui32CurrentLine; +uint32_t g_ui32EntryLine; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Draws the prompt for each new line. +// +//***************************************************************************** +static void +DrawPrompt(void) +{ + int32_t i32Idx; + + g_ppcLines[g_ui32CurrentLine][0] = '>'; + + for(i32Idx = 1; i32Idx < MAX_COLUMNS - 1; i32Idx++) + { + g_ppcLines[g_ui32CurrentLine][i32Idx] = ' '; + } + g_ppcLines[g_ui32CurrentLine][i32Idx] = 0; + + GrStringDraw(&g_sContext, g_ppcLines[g_ui32CurrentLine], MAX_COLUMNS, + DISPLAY_TEXT_BORDER_H + + (GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column), + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (g_ui32EntryLine * GrFontHeightGet(g_psFontFixed6x8)), + true); + + g_ui32Column = 2; +} + +//***************************************************************************** +// +// Initialize the application interface. +// +//***************************************************************************** +void +UIInit(uint32_t ui32SysClock) +{ + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-host-keyboard"); + + // + // Set the font for the application. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Calculate the number of characters that will fit on a line. + // Make sure to leave a small border for the text box. + // + g_ui32CharsPerLine = (GrContextDpyWidthGet(&g_sContext) - 16) / + GrFontMaxWidthGet(g_psFontFixed6x8); + + // + // Calculate the number of lines per usable text screen. This requires + // taking off space for the top and bottom banners and adding a small bit + // for a border. + // + g_ui32LinesPerScreen = (GrContextDpyHeightGet(&g_sContext) - + (2*(DISPLAY_BANNER_HEIGHT + 1)) - + BUTTON_HEIGHT) / GrFontHeightGet(g_psFontFixed6x8); + + // + // Set up the text scrolling variables. + // + g_ui32CurrentLine = 0; + g_ui32EntryLine = 0; + + // + // Draw the initial prompt on the screen. + // + DrawPrompt(); + + // + // Initial update of the screen. + // + UIUpdateStatus(); +} + +//***************************************************************************** +// +// Handles scrolling the text on the screen. +// +//***************************************************************************** +static void +ScrollText(void) +{ + int32_t i32Idx; + uint32_t ui32Line, ui32Start; + + ui32Line = 0; + + // + // Skip the oldest entry in the circular list. + // + if(g_ui32CurrentLine == (MAX_LINES - 1)) + { + // + // If at the end of the list wrap to entry 1. + // + ui32Start = 1; + } + else + { + // + // The oldest is 1 in front of the most recent. + // + ui32Start = g_ui32CurrentLine + 2; + } + + // + // Print lines from the current position down first. + // + for(i32Idx = ui32Start; i32Idx < MAX_LINES; i32Idx++) + { + GrStringDraw(&g_sContext, g_ppcLines[i32Idx], + strlen(g_ppcLines[i32Idx]), DISPLAY_TEXT_BORDER_H, + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (ui32Line * GrFontHeightGet(g_psFontFixed6x8)), 1); + + ui32Line++; + } + + // + // If not the special case of the last line where everything has already + // printed, print the remaining lines. + // + if(g_ui32CurrentLine != (MAX_LINES - 1)) + { + for(i32Idx = 0; i32Idx <= g_ui32CurrentLine; i32Idx++) + { + GrStringDraw(&g_sContext, g_ppcLines[i32Idx], + strlen(g_ppcLines[i32Idx]), + DISPLAY_TEXT_BORDER_H, + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (ui32Line * GrFontHeightGet(g_psFontFixed6x8)), 1); + + ui32Line++; + } + } + + // + // Reset the column to zero. + // + g_ui32Column = 0; +} + +//***************************************************************************** +// +// This function prints the character out the screen and into the command +// buffer. +// +// ucChar is the character to print out. +// +// This function handles all of the detail of printing a character to the +// screen and into the command line buffer. +// +// No return value. +// +//***************************************************************************** +void +UIPrintChar(const char cChar) +{ + bool bNewLine; + int32_t i32Idx; + + GrContextForegroundSet(&g_sContext, ClrWhite); + + bNewLine = true; + + // + // Allow new lines to cause the column to go back to zero. + // + if(cChar != '\n') + { + // + // Handle when receiving a backspace character. + // + if(cChar != ASCII_BACKSPACE) + { + // + // This is not a backspace so print the character to the screen. + // + GrStringDraw(&g_sContext, &cChar, 1, + DISPLAY_TEXT_BORDER_H + + (GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column), + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (g_ui32EntryLine * GrFontHeightGet(g_psFontFixed6x8)), + 1); + + g_ppcLines[g_ui32CurrentLine][g_ui32Column] = cChar; + + if(g_ui32Column < g_ui32CharsPerLine) + { + // + // No line wrap yet so move one column over. + // + g_ui32Column++; + + bNewLine = false; + } + } + else + { + // + // We got a backspace. If we are at the top left of the screen, + // return since we don't need to do anything. + // + if(g_ui32Column || g_ui32EntryLine) + { + // + // Adjust the cursor position to erase the last character. + // + if(g_ui32Column > 2) + { + g_ui32Column--; + } + + // + // Print a space at this position then return without fixing up + // the cursor again. + // + GrStringDraw(&g_sContext, " ", 1, + DISPLAY_TEXT_BORDER_H + + (GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column), + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (g_ui32EntryLine * GrFontHeightGet(g_psFontFixed6x8)), + true); + + g_ppcLines[g_ui32CurrentLine][g_ui32Column] = ' '; + } + + bNewLine = false; + } + } + + // + // . + // + if(bNewLine) + { + g_ui32Column = 0; + + if(g_ui32EntryLine < (MAX_LINES - 1)) + { + g_ui32EntryLine++; + } + else + { + ScrollText(); + } + + g_ui32CurrentLine++; + + // + // The line has gone past the end so go back to the first line. + // + if(g_ui32CurrentLine >= MAX_LINES) + { + g_ui32CurrentLine = 0; + } + + // + // Add a prompt to the new line. + // + if(cChar == '\n') + { + DrawPrompt(); + } + else + { + // + // Clear out the current line. + // + for(i32Idx = 0; i32Idx < MAX_COLUMNS - 1; i32Idx++) + { + g_ppcLines[g_ui32CurrentLine][i32Idx] = ' '; + } + g_ppcLines[g_ui32CurrentLine][i32Idx] = 0; + + GrStringDraw(&g_sContext, g_ppcLines[g_ui32CurrentLine], + strlen(g_ppcLines[g_ui32CurrentLine]), + DISPLAY_TEXT_BORDER_H, + DISPLAY_BANNER_HEIGHT + DISPLAY_TEXT_BORDER + + (g_ui32EntryLine * GrFontHeightGet(g_psFontFixed6x8)), + 1); + } + } +} + +//***************************************************************************** +// +// Update one of the status boxes at the bottom of the screen. +// +//***************************************************************************** +static void +UpdateStatusBox(const tRectangle *psRect, const char *pcString, bool bActive) +{ + uint32_t ui32TextColor; + + // + // Change the status box to green for active devices. + // + if(bActive) + { + GrContextForegroundSet(&g_sContext, ClrOrange); + ui32TextColor = ClrBlack; + } + else + { + GrContextForegroundSet(&g_sContext, ClrBlack); + ui32TextColor = ClrWhite; + } + + // + // Draw the background box. + // + GrRectFill(&g_sContext, psRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Draw the box border. + // + GrRectDraw(&g_sContext, psRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ui32TextColor); + + // + // Unknown device is currently connected. + // + GrStringDrawCentered(&g_sContext, pcString, -1, + psRect->i16XMin + ((psRect->i16XMax - psRect->i16XMin) / 2), + psRect->i16YMin + (BUTTON_HEIGHT / 2), false); + +} + +//***************************************************************************** +// +// This function updates the status area of the screen. It uses the current +// state of the application to print the status bar. +// +//***************************************************************************** +void +UIUpdateStatus(void) +{ + uint8_t ui8DevClass, ui8DevProtocol; + static const tRectangle psRect[4] = + { + { + DISPLAY_TEXT_BORDER_H, 240 - 10 - BUTTON_HEIGHT, + DISPLAY_TEXT_BORDER_H + 124, 240 - 10 + }, + { + DISPLAY_TEXT_BORDER_H + 124, 240 - 10 - BUTTON_HEIGHT, + DISPLAY_TEXT_BORDER_H + 184, 240 - 10 + }, + { + DISPLAY_TEXT_BORDER_H + 184, 240 - 10 - BUTTON_HEIGHT, + DISPLAY_TEXT_BORDER_H + 244, 240 - 10 + }, + { + DISPLAY_TEXT_BORDER_H + 244, 240 - 10 - BUTTON_HEIGHT, + DISPLAY_TEXT_BORDER_H + 303, 240 - 10 + }, + }; + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Default the protocol to none so that non-HID devices do not update + // the keyboard modifiers. + // + ui8DevProtocol = USB_HID_PROTOCOL_NONE; + + if(g_sStatus.bConnected) + { + ui8DevClass = USBHCDDevClass(g_sStatus.ui32Instance, 0); + ui8DevProtocol = USBHCDDevProtocol(g_sStatus.ui32Instance, 0); + + if(ui8DevClass == USB_CLASS_HID) + { + if(ui8DevProtocol == USB_HID_PROTOCOL_MOUSE) + { + // + // Mouse is currently connected. + // + UpdateStatusBox(&psRect[0], "Mouse", true); + } + else if(ui8DevProtocol == USB_HID_PROTOCOL_KEYB) + { + // + // Keyboard is currently connected. + // + UpdateStatusBox(&psRect[0], "Keyboard", true); + } + else + { + // + // Unknown device is currently connected. + // + UpdateStatusBox(&psRect[0], "Unknown", true); + } + } + else if(ui8DevClass == USB_CLASS_MASS_STORAGE) + { + // + // MSC device is currently connected. + // + UpdateStatusBox(&psRect[0], "Mass Storage", true); + } + else if(ui8DevClass == USB_CLASS_HUB) + { + // + // MSC device is currently connected. + // + UpdateStatusBox(&psRect[0], "Hub", true); + } + else + { + // + // Unknown device is currently connected. + // + UpdateStatusBox(&psRect[0], "Unknown", true); + } + } + else + { + // + // Unknown device is currently connected. + // + UpdateStatusBox(&psRect[0], "No Device", false); + } + + if(ui8DevProtocol == USB_HID_PROTOCOL_KEYB) + { + if(g_sStatus.ui32Modifiers & HID_KEYB_CAPS_LOCK) + { + UpdateStatusBox(&psRect[1], "CAPS", true); + } + else + { + UpdateStatusBox(&psRect[1], "caps", false); + } + + if(g_sStatus.ui32Modifiers & HID_KEYB_SCROLL_LOCK) + { + UpdateStatusBox(&psRect[2], "SCROLL", true); + } + else + { + UpdateStatusBox(&psRect[2], "scroll", false); + } + + if(g_sStatus.ui32Modifiers & HID_KEYB_NUM_LOCK) + { + UpdateStatusBox(&psRect[3], "NUM", true); + } + else + { + UpdateStatusBox(&psRect[3], "num", false); + } + } + else + { + UpdateStatusBox(&psRect[1], "caps", false); + UpdateStatusBox(&psRect[2], "scroll", false); + UpdateStatusBox(&psRect[3], "num", false); + } +} diff --git a/boards/dk-tm4c129x/usb_host_keyboard/keyboard_ui.h b/boards/dk-tm4c129x/usb_host_keyboard/keyboard_ui.h new file mode 100644 index 0000000..e944440 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/keyboard_ui.h @@ -0,0 +1,71 @@ +//***************************************************************************** +// +// keyboard_ui.h - Header for the DK-TM4C129X USB keyboard application UI. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __KEYBOARD_UI_H__ +#define __KEYBOARD_UI_H__ + +//***************************************************************************** +// +// Status of the device. +// +//***************************************************************************** +typedef struct +{ + // + // Holds if there is a device connected to this port. + // + bool bConnected; + + // + // Move to a new line. + // + bool bNewLine; + + // + // The instance data for the device if bConnected is true. + // + uint32_t ui32Instance; + + // + // The keyboard modifier flags. + // + uint32_t ui32Modifiers; +} +tKeyboardStatus; + +extern tKeyboardStatus g_sStatus; + + +//***************************************************************************** +// +// The ASCII code for a backspace character. +// +//***************************************************************************** +#define ASCII_BACKSPACE 0x08 + +void UIInit(uint32_t ui32SysClock); +void UIPrintChar(const char cChar); +void UIUpdateStatus(void); + +#endif diff --git a/boards/dk-tm4c129x/usb_host_keyboard/readme.txt b/boards/dk-tm4c129x/usb_host_keyboard/readme.txt new file mode 100644 index 0000000..3703e24 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/readme.txt @@ -0,0 +1,37 @@ +USB Host keyboard example(usb_host_keyboard) + +This example application demonstrates how to support a USB keyboard using +the DK-TM4C129X development board. This application supports only a +standard keyboard HID device, but can report on the types of other devices +that are connected without having the ability to access them. Key presses +are shown on the display as well as the caps-lock, scroll-lock, and +num-lock states of the keyboard. The bottom left status bar reports the +type of device attached. The user interface for the application is +handled in the keyboard_ui.c file while the usb_host_keyboard.c file +handles start up and the USB interface. + +The application can be recompiled to run using and external USB phy to +implement a high speed host using an external USB phy. To use the external +phy the application must be built with \b USE_ULPI defined. This disables +the internal phy and the connector on the DK-TM4C129X board and enables the +connections to the external ULPI phy pins on the DK-TM4C129X board. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_host_keyboard/rvmdk/usb_host_keyboard.axf b/boards/dk-tm4c129x/usb_host_keyboard/rvmdk/usb_host_keyboard.axf new file mode 100644 index 0000000..e2a3d16 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_keyboard/rvmdk/usb_host_keyboard.axf differ diff --git a/boards/dk-tm4c129x/usb_host_keyboard/rvmdk/usb_host_keyboard.bin b/boards/dk-tm4c129x/usb_host_keyboard/rvmdk/usb_host_keyboard.bin new file mode 100644 index 0000000..fcb1bda Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_keyboard/rvmdk/usb_host_keyboard.bin differ diff --git a/boards/dk-tm4c129x/usb_host_keyboard/startup_ccs.c b/boards/dk-tm4c129x/usb_host_keyboard/startup_ccs.c new file mode 100644 index 0000000..f9c8ded --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_keyboard/startup_ewarm.c b/boards/dk-tm4c129x/usb_host_keyboard/startup_ewarm.c new file mode 100644 index 0000000..5a63952 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_keyboard/startup_gcc.c b/boards/dk-tm4c129x/usb_host_keyboard/startup_gcc.c new file mode 100644 index 0000000..78235b0 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_keyboard/startup_rvmdk.S b/boards/dk-tm4c129x/usb_host_keyboard/startup_rvmdk.S new file mode 100644 index 0000000..0920130 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN USB0HostIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0HostIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.c b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.c new file mode 100644 index 0000000..fe2b253 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.c @@ -0,0 +1,561 @@ +//***************************************************************************** +// +// usb_host_keyboard.c - An example using that supports a keyboard. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhhid.h" +#include "usblib/host/usbhhidkeyboard.h" +#include "drivers/pinout.h" +#include "keyboard_ui.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Host keyboard example(usb_host_keyboard)

      +//! +//! This example application demonstrates how to support a USB keyboard using +//! the DK-TM4C129X development board. This application supports only a +//! standard keyboard HID device, but can report on the types of other devices +//! that are connected without having the ability to access them. Key presses +//! are shown on the display as well as the caps-lock, scroll-lock, and +//! num-lock states of the keyboard. The bottom left status bar reports the +//! type of device attached. The user interface for the application is +//! handled in the keyboard_ui.c file while the usb_host_keyboard.c file +//! handles start up and the USB interface. +//! +//! The application can be recompiled to run using and external USB phy to +//! implement a high speed host using an external USB phy. To use the external +//! phy the application must be built with \b USE_ULPI defined. This disables +//! the internal phy and the connector on the DK-TM4C129X board and enables the +//! connections to the external ULPI phy pins on the DK-TM4C129X board. +// +//***************************************************************************** + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The global keyboard status structure. +// +//***************************************************************************** +tKeyboardStatus g_sStatus; + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE * MAX_USB_DEVICES]; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the Keyboard class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHIDClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The global value used to store the keyboard instance value. +// +//***************************************************************************** +static tUSBHKeyboard *g_psKeyboard; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This enumerated type is used to hold the states of the keyboard. +// +//***************************************************************************** +enum +{ + // + // No device is present. + // + eStateNoDevice, + + // + // Keyboard has been detected and needs to be initialized in the main + // loop. + // + eStateKeyboardInit, + + // + // Keyboard is connected and waiting for events. + // + eStateKeyboardConnected, + + // + // Keyboard has received a key press that requires updating the keyboard + // in the main loop. + // + eStateKeyboardUpdate, +} +g_iKeyboardState; + +//***************************************************************************** +// +// This is the callback from the USB HID keyboard handler. +// +// pvCBData is ignored by this function. +// ui32Event is one of the valid events for a keyboard device. +// ui32MsgParam is defined by the event that occurs. +// pvMsgData is a pointer to data that is defined by the event that +// occurs. +// +// This function will be called to inform the application when a keyboard has +// been plugged in or removed and any time a key is pressed or released. +// +// This function will return 0. +// +//***************************************************************************** +void +KeyboardCallback(tUSBHKeyboard *psKbInstance, uint32_t ui32Event, + uint32_t ui32MsgParam, void *pvMsgData) +{ + char cChar; + + switch(ui32Event) + { + // + // New keyboard detected. + // + case USB_EVENT_CONNECTED: + { + // + // Proceed to the STATE_KEYBOARD_INIT state so that the main loop + // can finish initialized the mouse since USBHKeyboardInit() cannot + // be called from within a callback. + // + g_iKeyboardState = eStateKeyboardInit; + + break; + } + + // + // Keyboard has been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Change the state so that the main loop knows that a device is no + // longer present. + // + g_iKeyboardState = eStateNoDevice; + + break; + } + + // + // New Key press detected. + // + case USBH_EVENT_HID_KB_PRESS: + { + if(ui32MsgParam == HID_KEYB_USAGE_CAPSLOCK) + { + // + // The main loop needs to update the device state. + // + g_iKeyboardState = eStateKeyboardUpdate; + + // + // Toggle the current Caps Lock state. + // + g_sStatus.ui32Modifiers ^= HID_KEYB_CAPS_LOCK; + } + else if(ui32MsgParam == HID_KEYB_USAGE_SCROLLOCK) + { + // + // The main loop needs to update the device state. + // + g_iKeyboardState = eStateKeyboardUpdate; + + // + // Toggle the current Scroll Lock state. + // + g_sStatus.ui32Modifiers ^= HID_KEYB_SCROLL_LOCK; + } + else if(ui32MsgParam == HID_KEYB_USAGE_NUMLOCK) + { + // + // The main loop needs to update the device state. + // + g_iKeyboardState = eStateKeyboardUpdate; + + // + // Toggle the current Num Lock state. + // + g_sStatus.ui32Modifiers ^= HID_KEYB_NUM_LOCK; + } + else + { + // + // Was this the backspace key? + // + if((uint8_t)ui32MsgParam == HID_KEYB_USAGE_BACKSPACE) + { + // + // Yes - set the ASCII code for a backspace key. This is + // not returned by USBHKeyboardUsageToChar since this only + // returns printable characters. + // + cChar = ASCII_BACKSPACE; + } + else + { + // + // This is not backspace so try to map the usage code to a + // printable ASCII character. + // + cChar = (char)USBHKeyboardUsageToChar(g_psKeyboard, + &g_sUSKeyboardMap, + (uint8_t)ui32MsgParam); + } + + // + // A zero value indicates there was no textual mapping of this + // usage code. + // + if(cChar != 0) + { + UIPrintChar(cChar); + } + } + break; + } + case USBH_EVENT_HID_KB_MOD: + { + // + // This application ignores the state of the shift or control + // and other special keys. + // + break; + } + case USBH_EVENT_HID_KB_REL: + { + // + // This applications ignores the release of keys as well. + // + break; + } + } +} + +//***************************************************************************** +// +// The main routine for handling the USB keyboard. +// +//***************************************************************************** +void +KeyboardMain(void) +{ + switch(g_iKeyboardState) + { + // + // This state is entered when they keyboard is first detected. + // + case eStateKeyboardInit: + { + // + // Initialized the newly connected keyboard. + // + USBHKeyboardInit(g_psKeyboard); + + // + // Proceed to the keyboard connected state. + // + g_iKeyboardState = eStateKeyboardConnected; + + // + // Set the current state of the modifiers. + // + USBHKeyboardModifierSet(g_psKeyboard, g_sStatus.ui32Modifiers); + + break; + } + case eStateKeyboardUpdate: + { + // + // If the application detected a change that required an + // update to be sent to the keyboard to change the modifier + // state then call it and return to the connected state. + // + g_iKeyboardState = eStateKeyboardConnected; + + USBHKeyboardModifierSet(g_psKeyboard, g_sStatus.ui32Modifiers); + + // + // Update the modifier status. + // + UIUpdateStatus(); + + break; + } + case eStateKeyboardConnected: + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the keyboard device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *pEventInfo; + + // + // Cast this pointer to its actual type. + // + pEventInfo = (tEventInfo *)pvData; + + switch(pEventInfo->ui32Event) + { + case USB_EVENT_UNKNOWN_CONNECTED: + case USB_EVENT_CONNECTED: + { + // + // Save the device instance data. + // + g_sStatus.ui32Instance = pEventInfo->ui32Instance; + g_sStatus.bConnected = true; + + // + // Update the port status for the new device. + // + UIUpdateStatus(); + + break; + } + // + // A device has been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Device is no longer connected. + // + g_sStatus.bConnected = false; + + // + // Update the port status for the new device. + // + UIUpdateStatus(); + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// The main application loop. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock, ui32PLLRate; +#ifdef USE_ULPI + uint32_t ui32Setting; +#endif + + // + // Set the application to run at 120 MHz with a PLL frequency of 480 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Set the part pin out appropriately for this device. + // + PinoutSet(); + +#ifdef USE_ULPI + // + // Switch the USB ULPI Pins over. + // + USBULPIPinoutSet(); + + // + // Enable USB ULPI with high speed support. + // + ui32Setting = USBLIB_FEATURE_ULPI_HS; + USBOTGFeatureSet(0, USBLIB_FEATURE_USBULPI, &ui32Setting); + + // + // Setting the PLL frequency to zero tells the USB library to use the + // external USB clock. + // + ui32PLLRate = 0; +#else + // + // Save the PLL rate used by this application. + // + ui32PLLRate = 480000000; +#endif + + // + // Initialize the connection status. + // + g_sStatus.bConnected = false; + + // + // Initially there are no modifiers set. + // + g_sStatus.ui32Modifiers = 0; + + // + // Enable Clocking to the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the USB stack mode and pass in a mode callback. + // + USBStackModeSet(0, eUSBModeHost, 0); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the keyboard driver. The keyboard does not need + // to be present at this time, this just save a place for it and allows + // the applications to be notified when a keyboard is present. + // + g_psKeyboard = USBHKeyboardOpen(KeyboardCallback, 0, 0); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Tell the USB library the CPU clock and the PLL frequency. This is a + // new requirement for TM4C129 devices. + // + USBHCDFeatureSet(0, USBLIB_FEATURE_CPUCLK, &ui32SysClock); + USBHCDFeatureSet(0, USBLIB_FEATURE_USBPLL, &ui32PLLRate); + + // + // Initialize the USB controller for Host mode. + // + USBHCDInit(0, g_pui8HCDPool, sizeof(g_pui8HCDPool)); + + // + // Initialize the GUI elements. + // + UIInit(ui32SysClock); + + // + // The main loop for the application. + // + while(1) + { + // + // Call the USB library to let non-interrupt code run. + // + USBHCDMain(); + + // + // Call the keyboard and mass storage main routines. + // + KeyboardMain(); + } +} diff --git a/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ewd b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ewp b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ewp new file mode 100644 index 0000000..40f752e --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ewp @@ -0,0 +1,807 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\keyboard_ui.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\usb_host_keyboard.c + + + diff --git a/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.icf b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.icf new file mode 100644 index 0000000..32882e4 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_keyboard.icf - Linker configuration file for usb_host_keyboard. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ld b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ld new file mode 100644 index 0000000..ba8518c --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_keyboard.ld - Linker configuration file for usb_host_keyboard. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.sct b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.sct new file mode 100644 index 0000000..a9c6309 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_keyboard.sct - Linker configuration file for usb_host_keyboard. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.uvopt b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.uvopt new file mode 100644 index 0000000..2e1d709 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_keyboard + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\keyboard_ui.c + keyboard_ui.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_keyboard.c + usb_host_keyboard.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.uvproj b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.uvproj new file mode 100644 index 0000000..8ecbaa9 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_host_keyboard + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_keyboard + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_keyboard.bin .\rvmdk\usb_host_keyboard.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_keyboard.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + keyboard_ui.c + 1 + .\keyboard_ui.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + usb_host_keyboard.c + 1 + .\usb_host_keyboard.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard_ccs.cmd b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard_ccs.cmd new file mode 100644 index 0000000..657a4d5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_keyboard/usb_host_keyboard_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_keyboard_ccs.cmd - CCS linker configuration file for usb_host_keyboard. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/dk-tm4c129x/usb_host_mouse/Makefile b/boards/dk-tm4c129x/usb_host_mouse/Makefile new file mode 100644 index 0000000..a3ce9d3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/Makefile @@ -0,0 +1,93 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host mouse example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB host mouse example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_mouse.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host mouse example. +# +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/frame.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/mouse_ui.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/usb_host_mouse.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_host_mouse.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_mouse.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_mouse.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_mouse.axf: usb_host_mouse.ld +SCATTERgcc_usb_host_mouse=usb_host_mouse.ld +ENTRY_usb_host_mouse=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_host_mouse/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_host_mouse/ccs/.ccsimportspec new file mode 100644 index 0000000..427cc34 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_mouse/ccs/.ccsproject b/boards/dk-tm4c129x/usb_host_mouse/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_mouse/ccs/.cproject b/boards/dk-tm4c129x/usb_host_mouse/ccs/.cproject new file mode 100644 index 0000000..696bc2e --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/ccs/.cproject @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_mouse/ccs/.project b/boards/dk-tm4c129x/usb_host_mouse/ccs/.project new file mode 100644 index 0000000..e5d3842 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/ccs/.project @@ -0,0 +1,75 @@ + + + usb_host_mouse + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + mouse_ui.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_mouse/mouse_ui.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_mouse/startup_ccs.c + + + usb_host_mouse.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.c + + + usb_host_mouse_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_host_mouse/ccs/Debug/usb_host_mouse.bin b/boards/dk-tm4c129x/usb_host_mouse/ccs/Debug/usb_host_mouse.bin new file mode 100644 index 0000000..8b266e4 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_mouse/ccs/Debug/usb_host_mouse.bin differ diff --git a/boards/dk-tm4c129x/usb_host_mouse/ccs/Debug/usb_host_mouse.out b/boards/dk-tm4c129x/usb_host_mouse/ccs/Debug/usb_host_mouse.out new file mode 100644 index 0000000..e85d862 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_mouse/ccs/Debug/usb_host_mouse.out differ diff --git a/boards/dk-tm4c129x/usb_host_mouse/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_host_mouse/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_host_mouse/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_host_mouse/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin b/boards/dk-tm4c129x/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin new file mode 100644 index 0000000..3fa3aa2 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin differ diff --git a/boards/dk-tm4c129x/usb_host_mouse/ewarm/Exe/usb_host_mouse.out b/boards/dk-tm4c129x/usb_host_mouse/ewarm/Exe/usb_host_mouse.out new file mode 100644 index 0000000..7afbdce Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_mouse/ewarm/Exe/usb_host_mouse.out differ diff --git a/boards/dk-tm4c129x/usb_host_mouse/gcc/usb_host_mouse.axf b/boards/dk-tm4c129x/usb_host_mouse/gcc/usb_host_mouse.axf new file mode 100644 index 0000000..3c63a96 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_mouse/gcc/usb_host_mouse.axf differ diff --git a/boards/dk-tm4c129x/usb_host_mouse/gcc/usb_host_mouse.bin b/boards/dk-tm4c129x/usb_host_mouse/gcc/usb_host_mouse.bin new file mode 100644 index 0000000..44647df Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_mouse/gcc/usb_host_mouse.bin differ diff --git a/boards/dk-tm4c129x/usb_host_mouse/mouse_ui.c b/boards/dk-tm4c129x/usb_host_mouse/mouse_ui.c new file mode 100644 index 0000000..344ca0b --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/mouse_ui.c @@ -0,0 +1,429 @@ +//***************************************************************************** +// +// mouse_ui.h - The DK-TM4C129X USB mouse application UI. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** +#include +#include +#include +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/host/usbhost.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "mouse_ui.h" +#include "utils/ustdlib.h" + +//***************************************************************************** +// +// These defines are used to define the screen constraints to the application. +// +//***************************************************************************** +#define DISPLAY_BANNER_HEIGHT 18 +#define DISPLAY_TEXT_BORDER 8 +#define DISPLAY_TEXT_BORDER_H 8 +#define BUTTON_HEIGHT 18 +#define BUTTON_WIDTH 30 +#define STATUS_MIN_Y (240 - 10 - BUTTON_HEIGHT) +#define STATUS_MIDDLE_X 140 +#define BUTTON_MIN_X (MOUSE_MAX_X - (BUTTON_WIDTH * 3) - 1) + +//***************************************************************************** +// +// The cursor rectangle. +// +//***************************************************************************** +tRectangle g_sCursor; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Used to remember if the UI has updated the connection status yet. +// +//***************************************************************************** +bool g_bTypeUpdated; + +//***************************************************************************** +// +// Initialize the application interface. +// +//***************************************************************************** +void +UIInit(uint32_t ui32SysClock) +{ + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-host-mouse"); + + // + // Set the font for the application. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Default to device type not yet updated. + // + g_bTypeUpdated = false; + + // + // Initial update of the screen. + // + UIUpdateStatus(); +} + +//***************************************************************************** +// +// Update one of the status boxes at the bottom of the screen. +// +//***************************************************************************** +static void +UpdateStatusBox(const tRectangle *psRect, const char *pcString, bool bActive) +{ + uint32_t ui32TextColor; + + // + // Change the status box to green for active devices. + // + if(bActive) + { + GrContextForegroundSet(&g_sContext, ClrOrange); + ui32TextColor = ClrBlack; + } + else + { + GrContextForegroundSet(&g_sContext, ClrBlack); + ui32TextColor = ClrWhite; + } + + // + // Draw the background box. + // + GrRectFill(&g_sContext, psRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Draw the box border. + // + GrRectDraw(&g_sContext, psRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ui32TextColor); + + // + // Unknown device is currently connected. + // + GrStringDrawCentered(&g_sContext, pcString, -1, + psRect->i16XMin + ((psRect->i16XMax - psRect->i16XMin) / 2), + psRect->i16YMin + (BUTTON_HEIGHT / 2), false); + +} + +//***************************************************************************** +// +// This function updates the cursor position based on the current state +// information in the g_sStatus structure. This function takes the inputs and +// forces them to be constrained to the display area of the screen. If the +// left mouse button is pressed then the mouse will draw on the screen and if +// it is not it will move around normally. A side effect of not being able to +// read the current state of the screen is that the cursor will erase anything +// it moves over even while the left mouse button is not pressed. +// +// \return None. +// +//***************************************************************************** +static void +UpdateCursor(void) +{ + // + // If the left button is not pressed then erase the previous cursor + // position. + // + if((g_sStatus.ui32Buttons & 1) == 0) + { + // + // Erase the previous cursor. + // + GrContextForegroundSet(&g_sContext, DISPLAY_MOUSE_BG); + GrRectFill(&g_sContext, &g_sCursor); + } + + // + // Update the X position. + // + if(g_sStatus.ui32XPos >= (MOUSE_MAX_X - DISPLAY_MOUSE_SIZE)) + { + g_sCursor.i16XMin = MOUSE_MAX_X - DISPLAY_MOUSE_SIZE - 1; + } + else if(g_sStatus.ui32XPos < MOUSE_MIN_X) + { + g_sCursor.i16XMin = MOUSE_MIN_X; + } + else + { + g_sCursor.i16XMin = g_sStatus.ui32XPos; + } + + g_sCursor.i16XMax = g_sCursor.i16XMin + DISPLAY_MOUSE_SIZE; + + // + // Update the Y position. + // + if(g_sStatus.ui32YPos >= (MOUSE_MAX_Y - DISPLAY_MOUSE_SIZE)) + { + g_sCursor.i16YMin = MOUSE_MAX_Y - DISPLAY_MOUSE_SIZE - 1; + } + else if(g_sStatus.ui32YPos < MOUSE_MIN_Y) + { + g_sCursor.i16YMin = MOUSE_MIN_Y; + } + else + { + g_sCursor.i16YMin = g_sStatus.ui32YPos; + } + + g_sCursor.i16YMax = g_sCursor.i16YMin + DISPLAY_MOUSE_SIZE; + + // + // Draw the cursor at the new position. + // + GrContextForegroundSet(&g_sContext, DISPLAY_MOUSE_FG); + GrRectFill(&g_sContext, &g_sCursor); +} + +//***************************************************************************** +// +// This function will update the mouse button indicators in the status +// bar area of the screen. +// +//***************************************************************************** +static void +UpdateButtons(void) +{ + tRectangle sRect, sRectInner; + int iButton; + + // + // Initialize the button indicator position. + // + sRect.i16XMin = BUTTON_MIN_X; + sRect.i16YMin = STATUS_MIN_Y; + sRect.i16XMax = sRect.i16XMin + BUTTON_WIDTH; + sRect.i16YMax = sRect.i16YMin + BUTTON_HEIGHT ; + sRectInner.i16XMin = sRect.i16XMin + 1; + sRectInner.i16YMin = sRect.i16YMin + 1; + sRectInner.i16XMax = sRect.i16XMax - 1; + sRectInner.i16YMax = sRect.i16YMax - 1; + + // + // Check all three buttons. + // + for(iButton = 0; iButton < 3; iButton++) + { + // + // Draw the button indicator red if pressed and black if not pressed. + // + if(g_sStatus.ui32Buttons & (1 << iButton)) + { + GrContextForegroundSet(&g_sContext, ClrRed); + } + else + { + GrContextForegroundSet(&g_sContext, ClrBlack); + } + + // + // Draw the back of the button indicator. + // + GrRectFill(&g_sContext, &sRectInner); + + // + // Draw the border on the button indicator. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Move to the next button indicator position. + // + sRect.i16XMin += BUTTON_WIDTH; + sRect.i16XMax += BUTTON_WIDTH; + sRectInner.i16XMin += BUTTON_WIDTH; + sRectInner.i16XMax += BUTTON_WIDTH; + } +} + +//***************************************************************************** +// +// This function updates the status area of the screen. It uses the current +// state of the application to print the status bar. +// +//***************************************************************************** +void +UIUpdateStatus(void) +{ + uint8_t ui8DevClass, ui8DevProtocol; + static const char pcNoPos[] = "---,---"; + static const tRectangle psRect[2] = + { + { + DISPLAY_TEXT_BORDER_H, + STATUS_MIN_Y, + DISPLAY_TEXT_BORDER_H + STATUS_MIDDLE_X, + STATUS_MIN_Y + BUTTON_HEIGHT + }, + { + DISPLAY_TEXT_BORDER_H + STATUS_MIDDLE_X, + STATUS_MIN_Y, + BUTTON_MIN_X, + STATUS_MIN_Y + BUTTON_HEIGHT + }, + }; + + char pcPos[8]; + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Default the protocol to none. + // + ui8DevProtocol = USB_HID_PROTOCOL_NONE; + + if(g_sStatus.bConnected) + { + ui8DevClass = USBHCDDevClass(g_sStatus.ui32Instance, 0); + ui8DevProtocol = USBHCDDevProtocol(g_sStatus.ui32Instance, 0); + + // + // If the class has not yet been recognized then print out the new + // class of device that has been connected. + // + if(g_bTypeUpdated == false) + { + // + // Now the class has been updated so do not update it again. + // + g_bTypeUpdated = true; + + if(ui8DevClass == USB_CLASS_HID) + { + if(ui8DevProtocol == USB_HID_PROTOCOL_MOUSE) + { + // + // Mouse is currently connected. + // + UpdateStatusBox(&psRect[0], "Mouse", true); + } + else if(ui8DevProtocol == USB_HID_PROTOCOL_KEYB) + { + // + // Keyboard is currently connected. + // + UpdateStatusBox(&psRect[0], "Keyboard", true); + } + else + { + // + // Unknown device is currently connected. + // + UpdateStatusBox(&psRect[0], "Unknown", true); + } + } + else if(ui8DevClass == USB_CLASS_MASS_STORAGE) + { + // + // MSC device is currently connected. + // + UpdateStatusBox(&psRect[0], "Mass Storage", true); + } + else if(ui8DevClass == USB_CLASS_HUB) + { + // + // MSC device is currently connected. + // + UpdateStatusBox(&psRect[0], "Hub", true); + } + else + { + // + // Unknown device is currently connected. + // + UpdateStatusBox(&psRect[0], "Unknown", true); + } + } + } + else + { + // + // Unknown device is currently connected. + // + UpdateStatusBox(&psRect[0], "No Device", false); + + // + // No device is present so allow the class to update when a new device + // is connected. + // + g_bTypeUpdated = false; + } + + if(ui8DevProtocol == USB_HID_PROTOCOL_MOUSE) + { + // + // Update the current cursor position. + // + UpdateCursor(); + + usprintf(pcPos, "%3d,%3d", g_sCursor.i16XMin, g_sCursor.i16YMin); + UpdateStatusBox(&psRect[1], pcPos, false); + } + else + { + UpdateStatusBox(&psRect[1], pcNoPos, false); + } + + UpdateButtons(); +} diff --git a/boards/dk-tm4c129x/usb_host_mouse/mouse_ui.h b/boards/dk-tm4c129x/usb_host_mouse/mouse_ui.h new file mode 100644 index 0000000..da29d30 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/mouse_ui.h @@ -0,0 +1,94 @@ +//***************************************************************************** +// +// mouse_ui.h - Header for the DK-TM4C129X USB keyboard application UI. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef _MOUSE_UI_H__ +#define _MOUSE_UI_H__ + +//***************************************************************************** +// +// The extents of the drawing area. +// +//***************************************************************************** +#define MOUSE_MIN_X 8 +#define MOUSE_MAX_X 312 +#define MOUSE_MIN_Y 25 +#define MOUSE_MAX_Y 210 + +//***************************************************************************** +// +// The mouse colors and size. +// +//***************************************************************************** +#define DISPLAY_MOUSE_BG ClrBlack +#define DISPLAY_MOUSE_FG ClrWhite +#define DISPLAY_MOUSE_SIZE 2 + +//***************************************************************************** +// +// Status of the device. +// +//***************************************************************************** +typedef struct +{ + // + // Holds if there is a device connected to this port. + // + bool bConnected; + + // + // Holds if the mouse state has been updated. + // + bool bUpdate; + + // + // The instance data for the device if bConnected is true. + // + uint32_t ui32Instance; + + // + // The mouse button state. + // + uint32_t ui32Buttons; + + // + // The mouse X position. + // + uint32_t ui32XPos; + + // + // The mouse Y position. + // + uint32_t ui32YPos; +} +tMouseStatus; + +// +// Global status information for this application. +// +extern tMouseStatus g_sStatus; + +void UIInit(uint32_t ui32SysClock); +void UIUpdateStatus(void); + +#endif diff --git a/boards/dk-tm4c129x/usb_host_mouse/readme.txt b/boards/dk-tm4c129x/usb_host_mouse/readme.txt new file mode 100644 index 0000000..7d69ef4 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/readme.txt @@ -0,0 +1,36 @@ +USB Host mouse example(usb_host_mouse) + +This example application demonstrates how to support a USB mouse using +the DK-TM4C129X development board. This application supports only a +standard mouse HID device, but can report on the types of other devices +that are connected without having the ability to access them. +The bottom left status bar reports the +type of device attached. The user interface for the application is +handled in the mouse_ui.c file while the usb_host_mouse.c file +handles start up and the USB interface. + +The application can be recompiled to run using and external USB phy to +implement a high speed host using an external USB phy. To use the external +phy the application must be built with \b USE_ULPI defined. This disables +the internal phy and the connector on the DK-TM4C129X board and enables the +connections to the external ULPI phy pins on the DK-TM4C129X board. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_host_mouse/rvmdk/usb_host_mouse.axf b/boards/dk-tm4c129x/usb_host_mouse/rvmdk/usb_host_mouse.axf new file mode 100644 index 0000000..7e86dd8 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_mouse/rvmdk/usb_host_mouse.axf differ diff --git a/boards/dk-tm4c129x/usb_host_mouse/rvmdk/usb_host_mouse.bin b/boards/dk-tm4c129x/usb_host_mouse/rvmdk/usb_host_mouse.bin new file mode 100644 index 0000000..405c55b Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_mouse/rvmdk/usb_host_mouse.bin differ diff --git a/boards/dk-tm4c129x/usb_host_mouse/startup_ccs.c b/boards/dk-tm4c129x/usb_host_mouse/startup_ccs.c new file mode 100644 index 0000000..241fab2 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/startup_ccs.c @@ -0,0 +1,275 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_mouse/startup_ewarm.c b/boards/dk-tm4c129x/usb_host_mouse/startup_ewarm.c new file mode 100644 index 0000000..76a7c18 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/startup_ewarm.c @@ -0,0 +1,306 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_mouse/startup_gcc.c b/boards/dk-tm4c129x/usb_host_mouse/startup_gcc.c new file mode 100644 index 0000000..73b7020 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/startup_gcc.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_mouse/startup_rvmdk.S b/boards/dk-tm4c129x/usb_host_mouse/startup_rvmdk.S new file mode 100644 index 0000000..28288a3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/startup_rvmdk.S @@ -0,0 +1,331 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN USB0HostIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0HostIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.c b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.c new file mode 100644 index 0000000..268ba51 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.c @@ -0,0 +1,553 @@ +//***************************************************************************** +// +// usb_host_mouse.c - An example using that supports a mouse. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhhid.h" +#include "usblib/host/usbhhidmouse.h" +#include "drivers/pinout.h" +#include "mouse_ui.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Host mouse example(usb_host_mouse)

      +//! +//! This example application demonstrates how to support a USB mouse using +//! the DK-TM4C129X development board. This application supports only a +//! standard mouse HID device, but can report on the types of other devices +//! that are connected without having the ability to access them. +//! The bottom left status bar reports the +//! type of device attached. The user interface for the application is +//! handled in the mouse_ui.c file while the usb_host_mouse.c file +//! handles start up and the USB interface. +//! +//! The application can be recompiled to run using and external USB phy to +//! implement a high speed host using an external USB phy. To use the external +//! phy the application must be built with \b USE_ULPI defined. This disables +//! the internal phy and the connector on the DK-TM4C129X board and enables the +//! connections to the external ULPI phy pins on the DK-TM4C129X board. +// +//***************************************************************************** + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The global application status structure. +// +//***************************************************************************** +tMouseStatus g_sStatus; + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE * MAX_USB_DEVICES]; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the HID class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHIDClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The global value used to store the mouse instance value. +// +//***************************************************************************** +static tUSBHMouse *g_psMouse; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This enumerated type is used to hold the states of the mouse. +// +//***************************************************************************** +enum +{ + // + // No device is present. + // + eStateNoDevice, + + // + // Mouse has been detected and needs to be initialized in the main loop. + // + eStateMouseInit, + + // + // Mouse is connected and waiting for events. + // + eStateMouseConnected, +} +g_iMouseState; + +//***************************************************************************** +// +// This is the callback from the USB HID mouse handler. +// +// pvCBData is ignored by this function. +// ui32Event is one of the valid events for a mouse device. +// ui32MsgParam is defined by the event that occurs. +// pvMsgData is a pointer to data that is defined by the event that +// occurs. +// +// This function will be called to inform the application when a mouse has +// been plugged in or removed and any time a mouse movement or button pressed +// has occurred. +// +// This function will return 0. +// +//***************************************************************************** +void +MouseCallback(tUSBHMouse *psMouse, uint32_t ui32Event, uint32_t ui32MsgParam, + void *pvMsgData) +{ + int32_t i32Pos; + + switch(ui32Event) + { + // + // New mouse detected. + // + case USB_EVENT_CONNECTED: + { + // + // Proceed to the eStateMouseInit state so that the main loop + // can finish initializing the mouse since USBHMouseInit() cannot + // be called from within a callback. + // + g_iMouseState = eStateMouseInit; + + break; + } + + // + // Mouse has been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Change the state so that the main loop knows that a device is no + // longer present. + // + g_iMouseState = eStateNoDevice; + + // + // Need to clear out any held buttons. + // + g_sStatus.ui32Buttons = 0; + + g_sStatus.bUpdate = true; + + break; + } + + // + // New button press detected. + // + case USBH_EVENT_HID_MS_PRESS: + { + // + // Save the new button that was pressed. + // + g_sStatus.ui32Buttons |= ui32MsgParam; + + g_sStatus.bUpdate = true; + + break; + } + + // + // A button was released on a HID mouse. + // + case USBH_EVENT_HID_MS_REL: + { + // + // Remove the button from the pressed state. + // + g_sStatus.ui32Buttons &= ~ui32MsgParam; + + g_sStatus.bUpdate = true; + + break; + } + + // + // The HID mouse detected movement in the X direction. + // + case USBH_EVENT_HID_MS_X: + { + // + // Update the cursor X position. + // This has to be calculated as an intermediate signed value + // because the position can go negative with fast movements. + // + i32Pos = g_sStatus.ui32XPos + (int8_t)ui32MsgParam; + + if(i32Pos < 0) + { + g_sStatus.ui32XPos = MOUSE_MIN_X; + } + else + { + g_sStatus.ui32XPos = (uint32_t)i32Pos; + } + + if(g_sStatus.ui32XPos < MOUSE_MIN_X) + { + g_sStatus.ui32XPos = MOUSE_MIN_X; + } + + if(g_sStatus.ui32XPos > MOUSE_MAX_X) + { + g_sStatus.ui32XPos = MOUSE_MAX_X; + } + + g_sStatus.bUpdate = true; + + break; + } + + // + // The HID mouse detected movement in the Y direction. + // + case USBH_EVENT_HID_MS_Y: + { + // + // Update the cursor Y position. + // This has to be calculated as an intermediate signed value + // because the position can go negative with fast movements. + // + i32Pos = (int32_t)g_sStatus.ui32YPos + (int8_t)ui32MsgParam; + + if(i32Pos < 0) + { + g_sStatus.ui32YPos = MOUSE_MIN_Y; + } + else + { + g_sStatus.ui32YPos = (uint32_t)i32Pos; + } + + if(g_sStatus.ui32YPos < MOUSE_MIN_Y) + { + g_sStatus.ui32YPos = MOUSE_MIN_Y; + } + + if(g_sStatus.ui32YPos > MOUSE_MAX_Y) + { + g_sStatus.ui32YPos = MOUSE_MAX_Y; + } + + g_sStatus.bUpdate = true; + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// The main routine for handling the USB mouse. +// +//***************************************************************************** +void +MouseMain(void) +{ + switch(g_iMouseState) + { + // + // This state is entered when they mouse is first detected. + // + case eStateMouseInit: + { + // + // Initialized the newly connected mouse. + // + USBHMouseInit(g_psMouse); + + // + // Proceed to the mouse connected state. + // + g_iMouseState = eStateMouseConnected; + + break; + } + case eStateMouseConnected: + default: + { + if(g_sStatus.bUpdate == true) + { + g_sStatus.bUpdate = false; + + UIUpdateStatus(); + } + break; + } + } +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the mouse device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *pEventInfo; + + // + // Cast this pointer to its actual type. + // + pEventInfo = (tEventInfo *)pvData; + + switch(pEventInfo->ui32Event) + { + case USB_EVENT_UNKNOWN_CONNECTED: + case USB_EVENT_CONNECTED: + { + // + // Save the device instance data. + // + g_sStatus.ui32Instance = pEventInfo->ui32Instance; + g_sStatus.bConnected = true; + + // + // Update the port status for the new device. + // + UIUpdateStatus(); + + break; + } + // + // A device has been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Device is no longer connected. + // + g_sStatus.bConnected = false; + + // + // Update the port status for the new device. + // + UIUpdateStatus(); + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// The main application loop. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock, ui32PLLRate; +#ifdef USE_ULPI + uint32_t ui32Setting; +#endif + + // + // Set the application to run at 120 MHz with a PLL frequency of 480 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Set the part pin out appropriately for this device. + // + PinoutSet(); + +#ifdef USE_ULPI + // + // Switch the USB ULPI Pins over. + // + USBULPIPinoutSet(); + + // + // Enable USB ULPI with high speed support. + // + ui32Setting = USBLIB_FEATURE_ULPI_HS; + USBOTGFeatureSet(0, USBLIB_FEATURE_USBULPI, &ui32Setting); + + // + // Setting the PLL frequency to zero tells the USB library to use the + // external USB clock. + // + ui32PLLRate = 0; +#else + // + // Save the PLL rate used by this application. + // + ui32PLLRate = 480000000; +#endif + + // + // Initialize the connection status. + // + g_sStatus.bConnected = false; + g_sStatus.ui32Buttons = 0; + + // + // Enable Clocking to the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the USB stack mode and pass in a mode callback. + // + USBStackModeSet(0, eUSBModeHost, 0); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the mouse driver. The mouse does not need + // to be present at this time, this just save a place for it and allows + // the applications to be notified when a mouse is present. + // + g_psMouse = USBHMouseOpen(MouseCallback, 0, 0); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Tell the USB library the CPU clock and the PLL frequency. This is a + // new requirement for TM4C129 devices. + // + USBHCDFeatureSet(0, USBLIB_FEATURE_CPUCLK, &ui32SysClock); + USBHCDFeatureSet(0, USBLIB_FEATURE_USBPLL, &ui32PLLRate); + + // + // Initialize the USB controller for Host mode. + // + USBHCDInit(0, g_pui8HCDPool, sizeof(g_pui8HCDPool)); + + // + // Initialize the UI elements. + // + UIInit(ui32SysClock); + + // + // The main loop for the application. + // + while(1) + { + // + // Call the USB library to let non-interrupt code run. + // + USBHCDMain(); + + // + // Call the mouse and mass storage main routines. + // + MouseMain(); + } +} diff --git a/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ewd b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ewp b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ewp new file mode 100644 index 0000000..e6e3efb --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ewp @@ -0,0 +1,807 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\mouse_ui.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_host_mouse.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.icf b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.icf new file mode 100644 index 0000000..da51a4f --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_mouse.icf - Linker configuration file for usb_host_mouse. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ld b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ld new file mode 100644 index 0000000..e889167 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_mouse.ld - Linker configuration file for usb_host_mouse. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.sct b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.sct new file mode 100644 index 0000000..84044ff --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_mouse.sct - Linker configuration file for usb_host_mouse. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.uvopt b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.uvopt new file mode 100644 index 0000000..f4f2ddb --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_mouse + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\mouse_ui.c + mouse_ui.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 5 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_mouse.c + usb_host_mouse.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.uvproj b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.uvproj new file mode 100644 index 0000000..270017c --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_host_mouse + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_mouse + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_mouse.bin .\rvmdk\usb_host_mouse.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_mouse.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + mouse_ui.c + 1 + .\mouse_ui.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_host_mouse.c + 1 + .\usb_host_mouse.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse_ccs.cmd b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse_ccs.cmd new file mode 100644 index 0000000..9ec800f --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_mouse/usb_host_mouse_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_mouse_ccs.cmd - CCS linker configuration file for usb_host_mouse. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/dk-tm4c129x/usb_host_msc/Makefile b/boards/dk-tm4c129x/usb_host_msc/Makefile new file mode 100644 index 0000000..02c02dd --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/Makefile @@ -0,0 +1,98 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host mass storage example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the USB host mass storage example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_msc.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host mass storage example. +# +${COMPILER}/usb_host_msc.axf: ${COMPILER}/fat_usbmsc.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/ff.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/frame.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/touch.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/usb_host_msc.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_host_msc.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_msc.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_msc.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_msc.axf: usb_host_msc.ld +SCATTERgcc_usb_host_msc=usb_host_msc.ld +ENTRY_usb_host_msc=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_host_msc/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_host_msc/ccs/.ccsimportspec new file mode 100644 index 0000000..252e9bb --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_msc/ccs/.ccsproject b/boards/dk-tm4c129x/usb_host_msc/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_msc/ccs/.cproject b/boards/dk-tm4c129x/usb_host_msc/ccs/.cproject new file mode 100644 index 0000000..05e2a09 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/ccs/.cproject @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_msc/ccs/.project b/boards/dk-tm4c129x/usb_host_msc/ccs/.project new file mode 100644 index 0000000..192a5e8 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/ccs/.project @@ -0,0 +1,85 @@ + + + usb_host_msc + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_msc/startup_ccs.c + + + usb_host_msc.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.c + + + usb_host_msc_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_host_msc/usb_host_msc_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/fatfs/port/fat_usbmsc.c + 1 + SW_ROOT/third_party/fatfs/port/fat_usbmsc.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_host_msc/ccs/Debug/usb_host_msc.bin b/boards/dk-tm4c129x/usb_host_msc/ccs/Debug/usb_host_msc.bin new file mode 100644 index 0000000..5ab4eda Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_msc/ccs/Debug/usb_host_msc.bin differ diff --git a/boards/dk-tm4c129x/usb_host_msc/ccs/Debug/usb_host_msc.out b/boards/dk-tm4c129x/usb_host_msc/ccs/Debug/usb_host_msc.out new file mode 100644 index 0000000..d19d86e Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_msc/ccs/Debug/usb_host_msc.out differ diff --git a/boards/dk-tm4c129x/usb_host_msc/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_host_msc/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_host_msc/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_host_msc/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_host_msc/ewarm/Exe/usb_host_msc.bin b/boards/dk-tm4c129x/usb_host_msc/ewarm/Exe/usb_host_msc.bin new file mode 100644 index 0000000..125f699 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_msc/ewarm/Exe/usb_host_msc.bin differ diff --git a/boards/dk-tm4c129x/usb_host_msc/ewarm/Exe/usb_host_msc.out b/boards/dk-tm4c129x/usb_host_msc/ewarm/Exe/usb_host_msc.out new file mode 100644 index 0000000..6f63440 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_msc/ewarm/Exe/usb_host_msc.out differ diff --git a/boards/dk-tm4c129x/usb_host_msc/gcc/usb_host_msc.axf b/boards/dk-tm4c129x/usb_host_msc/gcc/usb_host_msc.axf new file mode 100644 index 0000000..5d05e07 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_msc/gcc/usb_host_msc.axf differ diff --git a/boards/dk-tm4c129x/usb_host_msc/gcc/usb_host_msc.bin b/boards/dk-tm4c129x/usb_host_msc/gcc/usb_host_msc.bin new file mode 100644 index 0000000..d0ef3b2 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_msc/gcc/usb_host_msc.bin differ diff --git a/boards/dk-tm4c129x/usb_host_msc/readme.txt b/boards/dk-tm4c129x/usb_host_msc/readme.txt new file mode 100644 index 0000000..b77aca9 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/readme.txt @@ -0,0 +1,35 @@ +USB Mass Storage Class Host Example + +This example application demonstrates reading a file system from +a USB flash disk. It makes use of FatFs, a FAT file system driver. It +provides a simple widget-based interface on the display for viewing and +navigating the file system on the flash disk. + +For additional details about FatFs, see the following site: +http://elm-chan.org/fsw/ff/00index_e.html + +The application can be recompiled to run using and external USB phy to +implement a high speed host using an external USB phy. To use the external +phy the application must be built with \b USE_ULPI defined. This disables +the internal phy and the connector on the DK-TM4C129X board and enables the +connections to the external ULPI phy pins on the DK-TM4C129X board. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_host_msc/rvmdk/usb_host_msc.axf b/boards/dk-tm4c129x/usb_host_msc/rvmdk/usb_host_msc.axf new file mode 100644 index 0000000..618f93b Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_msc/rvmdk/usb_host_msc.axf differ diff --git a/boards/dk-tm4c129x/usb_host_msc/rvmdk/usb_host_msc.bin b/boards/dk-tm4c129x/usb_host_msc/rvmdk/usb_host_msc.bin new file mode 100644 index 0000000..dc08ad5 Binary files /dev/null and b/boards/dk-tm4c129x/usb_host_msc/rvmdk/usb_host_msc.bin differ diff --git a/boards/dk-tm4c129x/usb_host_msc/startup_ccs.c b/boards/dk-tm4c129x/usb_host_msc/startup_ccs.c new file mode 100644 index 0000000..5bf38b3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_msc/startup_ewarm.c b/boards/dk-tm4c129x/usb_host_msc/startup_ewarm.c new file mode 100644 index 0000000..cad5a03 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_msc/startup_gcc.c b/boards/dk-tm4c129x/usb_host_msc/startup_gcc.c new file mode 100644 index 0000000..ae0bddc --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_host_msc/startup_rvmdk.S b/boards/dk-tm4c129x/usb_host_msc/startup_rvmdk.S new file mode 100644 index 0000000..80a2337 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SysTickHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.c b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.c new file mode 100644 index 0000000..2f65dd3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.c @@ -0,0 +1,1591 @@ +//***************************************************************************** +// +// usb_host_msc.c - Example program for reading files from a USB flash drive. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/udma.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/listbox.h" +#include "grlib/pushbutton.h" +#include "usblib/usblib.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhmsc.h" +#include "utils/ustdlib.h" +#include "third_party/fatfs/src/ff.h" +#include "third_party/fatfs/src/diskio.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Mass Storage Class Host Example (usb_host_msc)

      +//! +//! This example application demonstrates reading a file system from +//! a USB flash disk. It makes use of FatFs, a FAT file system driver. It +//! provides a simple widget-based interface on the display for viewing and +//! navigating the file system on the flash disk. +//! +//! For additional details about FatFs, see the following site: +//! http://elm-chan.org/fsw/ff/00index_e.html +//! +//! The application can be recompiled to run using and external USB phy to +//! implement a high speed host using an external USB phy. To use the external +//! phy the application must be built with \b USE_ULPI defined. This disables +//! the internal phy and the connector on the DK-TM4C129X board and enables the +//! connections to the external ULPI phy pins on the DK-TM4C129X board. +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines the size of the buffers that hold the path, or temporary +// data from the USB disk. There are two buffers allocated of this size. +// The buffer size must be large enough to hold the int32_test expected +// full path name, including the file name, and a trailing null character. +// +//***************************************************************************** +#define PATH_BUF_SIZE 80 + +//***************************************************************************** +// +// Defines the size of the buffer that holds the command line. +// +//***************************************************************************** +#define CMD_BUF_SIZE 64 + +//***************************************************************************** +// +// Defines the number of times to call to check if the attached device is +// ready. +// +//***************************************************************************** +#define USBMSC_DRIVE_RETRY 4 + +//***************************************************************************** +// +// This buffer holds the full path to the current working directory. +// Initially it is root ("/"). +// +//***************************************************************************** +static char g_cCwdBuf[PATH_BUF_SIZE] = "/"; + +//***************************************************************************** +// +// A temporary data buffer used when manipulating file paths, or reading data +// from the SD card. +// +//***************************************************************************** +static char g_cTmpBuf[PATH_BUF_SIZE]; + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static DIR g_sDirObject; +static FILINFO g_sFileInfo; + +//***************************************************************************** +// +// A structure that holds a mapping between an FRESULT numerical code, +// and a string representation. FRESULT codes are returned from the FatFs +// FAT file system driver. +// +//***************************************************************************** +typedef struct +{ + FRESULT fresult; + char *pcResultStr; +} +tFresultString; + +//***************************************************************************** +// +// A macro to make it easy to add result codes to the table. +// +//***************************************************************************** +#define FRESULT_ENTRY(f) { (f), (#f) } + +//***************************************************************************** +// +// A table that holds a mapping between the numerical FRESULT code and +// it's name as a string. This is used for looking up error codes for +// printing to the screen. +// +//***************************************************************************** +tFresultString g_cFresultStrings[] = +{ + FRESULT_ENTRY(FR_OK), + FRESULT_ENTRY(FR_DISK_ERR), + FRESULT_ENTRY(FR_INT_ERR), + FRESULT_ENTRY(FR_NOT_READY), + FRESULT_ENTRY(FR_NO_FILE), + FRESULT_ENTRY(FR_NO_PATH), + FRESULT_ENTRY(FR_INVALID_NAME), + FRESULT_ENTRY(FR_DENIED), + FRESULT_ENTRY(FR_EXIST), + FRESULT_ENTRY(FR_INVALID_OBJECT), + FRESULT_ENTRY(FR_WRITE_PROTECTED), + FRESULT_ENTRY(FR_INVALID_DRIVE), + FRESULT_ENTRY(FR_NOT_ENABLED), + FRESULT_ENTRY(FR_NO_FILESYSTEM), + FRESULT_ENTRY(FR_MKFS_ABORTED), + FRESULT_ENTRY(FR_TIMEOUT), + FRESULT_ENTRY(FR_LOCKED), + FRESULT_ENTRY(FR_NOT_ENOUGH_CORE), + FRESULT_ENTRY(FR_TOO_MANY_OPEN_FILES), + FRESULT_ENTRY(FR_INVALID_PARAMETER), +}; + +//***************************************************************************** +// +// Error reasons returned by ChangeDirectory(). +// +//***************************************************************************** +#define NAME_TOO_LONG_ERROR 1 +#define OPENDIR_ERROR 2 + +//***************************************************************************** +// +// A macro that holds the number of result codes. +// +//***************************************************************************** +#define NUM_FRESULT_CODES (sizeof(g_cFresultStrings) / sizeof(tFresultString)) + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / TICKS_PER_SECOND) + +//***************************************************************************** +// +// Our running system tick counter and a global used to determine the time +// elapsed since last call to GetTickms(). +// +//***************************************************************************** +uint32_t g_ui32SysTickCount; +uint32_t g_ui32LastTick; + +//***************************************************************************** +// +// Storage for the filename listbox widget string table. +// +//***************************************************************************** +#define NUM_LIST_STRINGS 48 +const char *g_ppcDirListStrings[NUM_LIST_STRINGS]; + +//***************************************************************************** +// +// Storage for the names of the files in the current directory. Filenames +// are stored in format "(D) filename.ext" for directories or "(F) filename.ext" +// for files. +// +//***************************************************************************** +#define MAX_FILENAME_STRING_LEN (4 + 8 + 1 + 3 + 1) +char g_pcFilenames[NUM_LIST_STRINGS][MAX_FILENAME_STRING_LEN]; + +//***************************************************************************** +// +// Storage for the strings which appear in the status box at the bottom of the +// display. +// +//**************************************************************************** +#define NUM_STATUS_STRINGS 6 +#define MAX_STATUS_STRING_LEN (36 + 1) +char g_pcStatus[NUM_STATUS_STRINGS][MAX_STATUS_STRING_LEN]; + +//***************************************************************************** +// +// Holds global flags for the system. +// +//***************************************************************************** +uint32_t g_ui32Flags = 0; + +//***************************************************************************** +// +// Flag indicating that some USB device is connected. +// +//***************************************************************************** +#define FLAGS_DEVICE_PRESENT 0x00000001 + +//***************************************************************************** +// +// Hold the current state for the application. +// +//***************************************************************************** +volatile enum +{ + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Mass storage device is being enumerated. + // + STATE_DEVICE_ENUM, + + // + // Mass storage device is ready. + // + STATE_DEVICE_READY, + + // + // An unsupported device has been attached. + // + STATE_UNKNOWN_DEVICE, + + // + // A mass storage device was connected but failed to ever report ready. + // + STATE_TIMEOUT_DEVICE, + + // + // A power fault has occurred. + // + STATE_POWER_FAULT +} +g_eState; + +//***************************************************************************** +// +// The current USB operating mode - Host, Device or unknown. +// +//***************************************************************************** +tUSBMode g_eCurrentUSBMode; + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pHCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// The instance data for the MSC driver. +// +//***************************************************************************** +tUSBHMSCInstance *g_psMSCInstance = 0; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the MSC class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostMSCClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. In this application uDMA is only used for USB, +// so only the first 6 channels are needed. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_sDMAControlTable[6]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_sDMAControlTable, 1024) +tDMAControlTable g_sDMAControlTable[6]; +#else +tDMAControlTable g_sDMAControlTable[6] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// Storage for the status listbox widget string table. +// +//***************************************************************************** +const char *g_ppcStatusStrings[NUM_STATUS_STRINGS] = +{ + g_pcStatus[0], + g_pcStatus[1], + g_pcStatus[2], + g_pcStatus[3], + g_pcStatus[4], + g_pcStatus[5] +}; +uint32_t g_ui32StatusStringIndex = 0; + +//***************************************************************************** +// +// Forward declarations for functions called by the widgets used in the user +// interface. +// +//***************************************************************************** +void OnListBoxChange(tWidget *pWidget, int16_t ui16Selected); +void OnBtnCD(tWidget *pWidget); +void OnBtnUp(tWidget *pWidget); +static int PopulateFileListBox(bool bRedraw); +static FRESULT ChangeToDirectory(char *pcDirectory, uint32_t *pui32Reason); +static int PrintfStatus(char *pcFormat, ...); +static const char *StringFromFresult(FRESULT fresult); + +//***************************************************************************** +// +// Widget definitions +// +//***************************************************************************** + +//***************************************************************************** +// +// The listbox used to display directory contents. +// +//***************************************************************************** +extern tCanvasWidget g_sBackground; +extern tCanvasWidget g_sUpBackground; +extern tCanvasWidget g_sCDBackground; + +ListBox(g_sStatusList, &g_sBackground, 0, 0, &g_sKentec320x240x16_SSD2119, + 40, 170, 220, 52, (LISTBOX_STYLE_OUTLINE | LISTBOX_STYLE_LOCKED | + LISTBOX_STYLE_WRAP), ClrBlack, ClrBlack, ClrSilver, ClrSilver, ClrWhite, + &g_sFontFixed6x8, g_ppcStatusStrings, NUM_STATUS_STRINGS, + NUM_STATUS_STRINGS, 0); + +ListBox(g_sDirList, &g_sBackground, &g_sStatusList, 0, + &g_sKentec320x240x16_SSD2119, + 40, 60, 120, 100, LISTBOX_STYLE_OUTLINE, ClrBlack, ClrDarkBlue, + ClrSilver, ClrWhite, ClrWhite, &g_sFontCmss12, g_ppcDirListStrings, + NUM_LIST_STRINGS, 0, OnListBoxChange); + +//***************************************************************************** +// +// The canvas widget used to show the current directory. +// +//***************************************************************************** +Canvas(g_sPWDTitle, &g_sBackground, &g_sDirList, 0, + &g_sKentec320x240x16_SSD2119, 10, 35, 40, 20, CANVAS_STYLE_TEXT, + ClrBlack, 0, ClrWhite, &g_sFontCmss12, "PWD:", 0, 0); + +//***************************************************************************** +// +// The canvas widget used to show the current directory. +// +//***************************************************************************** +Canvas(g_sPWD, &g_sBackground, &g_sPWDTitle, 0, &g_sKentec320x240x16_SSD2119, + 50, 35, 260, 20, (CANVAS_STYLE_TEXT | CANVAS_STYLE_FILL | + CANVAS_STYLE_TEXT_LEFT), ClrBlack, 0, ClrWhite, &g_sFontCmss12, + g_cCwdBuf, 0, 0); + +//***************************************************************************** +// +// The button used to change to the selected directory directory. +// +//***************************************************************************** +RectangularButton(g_sCDBtn, &g_sCDBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, 170, 75, 90, 30, + (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_RELEASE_NOTIFY), + ClrBlack, ClrBlue, ClrWhite, ClrWhite, + &g_sFontCm20, "CD", 0, 0, 0, 0, OnBtnCD); + +//***************************************************************************** +// +// The canvas widget acting as the background to the CD button. +// +//***************************************************************************** +Canvas(g_sCDBackground, WIDGET_ROOT, 0, 0, + &g_sKentec320x240x16_SSD2119, 170, 75, 90, 30, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The button used to change to the next higher directory. +// +//***************************************************************************** +RectangularButton(g_sUpBtn, &g_sUpBackground, 0, 0, + &g_sKentec320x240x16_SSD2119, 170, 115, 90, 30, + (PB_STYLE_OUTLINE | PB_STYLE_TEXT_OPAQUE | PB_STYLE_TEXT | + PB_STYLE_FILL | PB_STYLE_RELEASE_NOTIFY), + ClrBlack, ClrBlue, ClrWhite, ClrWhite, + &g_sFontCm20, "Up", 0, 0, 0, 0, OnBtnUp); + +//***************************************************************************** +// +// The canvas widget acting as the background to the UP button. +// +//***************************************************************************** +Canvas(g_sUpBackground, WIDGET_ROOT, &g_sCDBackground, 0, + &g_sKentec320x240x16_SSD2119, 170, 115, 90, 30, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The canvas widget acting as the background to the left portion of the +// display. +// +//***************************************************************************** +Canvas(g_sBackground, WIDGET_ROOT, &g_sUpBackground, &g_sPWD, + &g_sKentec320x240x16_SSD2119, 10, 60, 120, 170, + CANVAS_STYLE_FILL, ClrBlack, 0, 0, 0, 0, 0, 0); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(int8_t *pi8Filename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The listbox widget callback function. +// +// This function is called whenever someone changes the selected entry in the +// listbox containing the files and directories found in the current directory. +// +//***************************************************************************** +void +OnListBoxChange(tWidget *pWidget, int16_t ui16Selected) +{ + int16_t i16Selected; + + // + // If no USB drive is present, just ignore this. + // + if(g_eState != STATE_DEVICE_READY) + { + return; + } + + // + // Get the current selection from the list box. + // + i16Selected = ListBoxSelectionGet(&g_sDirList); + + // + // Is there any selection? + // + if(i16Selected == -1) + { + return; + } + else + { + // + // Is the selection a directory name? + // + if(g_pcFilenames[i16Selected][1] == 'D') + { + // + // Enable the "CD" button. + // + WidgetAdd((tWidget *)&g_sCDBackground, (tWidget *)&g_sCDBtn); + } + else + { + // + // Hide the "CD" button. + // + WidgetRemove((tWidget *)&g_sCDBtn); + } + + // + // Make sure the CD button (or its background) is drawn correctly). + // + WidgetPaint((tWidget *)&g_sCDBackground); + } + + // + // Update the status display to say what we've done. + // + PrintfStatus("Selected %s %s\n", + (g_pcFilenames[i16Selected][1] == 'D') ? "dir" : "file", + &g_pcFilenames[i16Selected][4]); +} + +//***************************************************************************** +// +// The "CD" button widget callback function. +// +// This function is called whenever someone presses the "CD" button. +// +//***************************************************************************** +void +OnBtnCD(tWidget *pWidget) +{ + int16_t i16Selected; + uint32_t ui32Reason; + FRESULT fresult; + // + // Get the current selection from the list box. + // + i16Selected = ListBoxSelectionGet(&g_sDirList); + + // + // Is there any selection? + // + if(i16Selected == -1) + { + return; + } + else + { + // + // Is the selection a directory name? + // + if(g_pcFilenames[i16Selected][1] == 'D') + { + // + // Yes - change to the new directory. + // + fresult = ChangeToDirectory(&g_pcFilenames[i16Selected][4], + &ui32Reason); + + if(fresult != FR_OK) + { + // + // Update the status display to show the error. + // + PrintfStatus("Error changing directory."); + PrintfStatus((char *)StringFromFresult(fresult)); + } + else + { + // + // Tell the user what happened. + // + PrintfStatus("Changed to %s", g_cCwdBuf); + + // + // Update the directory name and the list box contents. + // + PopulateFileListBox(true); + WidgetPaint((tWidget *)&g_sPWD); + + // + // Enable the "Up" button and disable the "CD" button. + // + WidgetAdd((tWidget *)&g_sUpBackground, (tWidget *)&g_sUpBtn); + WidgetRemove((tWidget *)&g_sCDBtn); + + // + // Make sure the buttons are repainted correctly. + // + WidgetPaint((tWidget *)&g_sUpBtn); + WidgetPaint((tWidget *)&g_sCDBackground); + } + } + } +} + +//***************************************************************************** +// +// The "Up" button widget callback function. +// +// This function is called whenever someone presses the "Up" button. +// +//***************************************************************************** +void +OnBtnUp(tWidget *pWidget) +{ + uint32_t ui32Reason; + FRESULT fresult; + + // + // Change up one directory. + // + fresult = ChangeToDirectory("..", &ui32Reason); + + if(fresult != FR_OK) + { + // + // Update the status display to show the error. + // + PrintfStatus("Error changing directory."); + PrintfStatus((char *)StringFromFresult(fresult)); + } + else + { + // + // Update the directory name and the list box contents. + // + WidgetPaint((tWidget *)&g_sPWD); + PopulateFileListBox(true); + + // + // If we are now in the root directory, hide the "Up" button. + // + if((strlen(g_cCwdBuf) == 1) && (g_cCwdBuf[0] == '/')) + { + WidgetRemove((tWidget *)&g_sUpBtn); + } + else + { + WidgetAdd((tWidget *)&g_sUpBackground, (tWidget *)&g_sUpBtn); + } + + // + // Disable the CD button since re-populating the list removes the + // selection. + // + WidgetRemove((tWidget *)&g_sCDBtn); + + // + // Tell the user what happened. + // + PrintfStatus("Changed to %s", g_cCwdBuf); + + // + // Repaint the buttons. + // + WidgetPaint((tWidget *)&g_sUpBackground); + WidgetPaint((tWidget *)&g_sCDBackground); + } +} + +//***************************************************************************** +// +// This function is used to add a new string to the status list box at the +// bottom of the display. +// +//***************************************************************************** +static int +PrintfStatus(char *pi8Format, ...) +{ + int iRet; + va_list vaArgP; + + // + // Start the varargs processing. + // + va_start(vaArgP, pi8Format); + + // + // Call vsnprintf to perform the conversion. + // + iRet = uvsnprintf(g_pcStatus[g_ui32StatusStringIndex], + MAX_STATUS_STRING_LEN, pi8Format, vaArgP); + + // + // End the varargs processing. + // + va_end(vaArgP); + + // + // Add the new string to the status listbox. + // + ListBoxTextAdd(&g_sStatusList, g_pcStatus[g_ui32StatusStringIndex]); + + // + // Update our string index. + // + g_ui32StatusStringIndex++; + if(g_ui32StatusStringIndex == NUM_STATUS_STRINGS) + { + g_ui32StatusStringIndex = 0; + } + + // + // Repaint the status listbox. + // + WidgetPaint((tWidget *)&g_sStatusList); + + // + // Return the conversion count. + // + return(iRet); + +} + +//***************************************************************************** +// +// This function returns a string representation of an error code +// that was returned from a function call to FatFs. It can be used +// for printing human readable error messages. +// +//***************************************************************************** +static const char * +StringFromFresult(FRESULT fresult) +{ + unsigned int uIdx; + + // + // Enter a loop to search the error code table for a matching + // error code. + // + for(uIdx = 0; uIdx < NUM_FRESULT_CODES; uIdx++) + { + // + // If a match is found, then return the string name of the + // error code. + // + if(g_cFresultStrings[uIdx].fresult == fresult) + { + return(g_cFresultStrings[uIdx].pcResultStr); + } + } + + // + // At this point no matching code was found, so return a + // string indicating unknown error. + // + return("UNKNOWN ERROR CODE"); +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. FatFs requires a +// timer tick every 10 ms for internal timing purposes. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Update our tick counter. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// Initializes the file system module. +// +// \param None. +// +// This function initializes the third party FAT implementation. +// +// \return Returns \e true on success or \e false on failure. +// +//***************************************************************************** +static bool +FileInit(void) +{ + // + // Mount the file system, using logical disk 0. + // + if(f_mount(0, &g_sFatFs) != FR_OK) + { + return(false); + } + return(true); +} + +//***************************************************************************** +// +// This is the callback from the MSC driver. +// +// \param ps32Instance is the driver instance which is needed when communicating +// with the driver. +// \param ui32Event is one of the events defined by the driver. +// \param pvData is a pointer to data passed into the initial call to register +// the callback. +// +// This function handles callback events from the MSC driver. The only events +// currently handled are the MSC_EVENT_OPEN and MSC_EVENT_CLOSE. This allows +// the main routine to know when an MSC device has been detected and +// enumerated and when an MSC device has been removed from the system. +// +// \return None +// +//***************************************************************************** +static void +MSCCallback(tUSBHMSCInstance *ps32Instance, uint32_t ui32Event, void *pvData) +{ + // + // Determine the event. + // + switch(ui32Event) + { + // + // Called when the device driver has successfully enumerated an MSC + // device. + // + case MSC_EVENT_OPEN: + { + // + // Proceed to the enumeration state. + // + g_eState = STATE_DEVICE_ENUM; + + break; + } + + // + // Called when the device driver has been unloaded due to error or + // the device is no int32_ter present. + // + case MSC_EVENT_CLOSE: + { + // + // Go back to the "no device" state and wait for a new connection. + // + g_eState = STATE_NO_DEVICE; + + // + // Re-initialize the file system. + // + FileInit(); + + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// \param pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the mass storage device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenerii8EventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +// \return None. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *pEventInfo; + + // + // Cast this pointer to its actual type. + // + pEventInfo = (tEventInfo *)pvData; + + switch(pEventInfo->ui32Event) + { + // + // An unknown device has been connected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + // + // An unknown device was detected. + // + g_eState = STATE_UNKNOWN_DEVICE; + + break; + } + + // + // The unknown device has been been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Unknown device has been removed. + // + g_eState = STATE_NO_DEVICE; + + break; + } + + // + // A bus power fault was detected. + // + case USB_EVENT_POWER_FAULT: + { + // + // No power means no device is present. + // + g_eState = STATE_POWER_FAULT; + + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This function is called to read the contents of the current directory on +// the SD card and fill the listbox containing the names of all files and +// directories. +// +//***************************************************************************** +static int +PopulateFileListBox(bool bRepaint) +{ + uint32_t ui32ItemCount; + FRESULT fresult; + + // + // Empty the list box on the display. + // + ListBoxClear(&g_sDirList); + + // + // Make sure the list box will be redrawn next time the message queue + // is processed. + // + if(bRepaint) + { + WidgetPaint((tWidget *)&g_sDirList); + } + + // + // Open the current directory for access. + // + fresult = f_opendir(&g_sDirObject, g_cCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(fresult != FR_OK) + { + // + // Ensure that the error is reported. + // + PrintfStatus("Error from USB disk:"); + PrintfStatus((char *)StringFromFresult(fresult)); + return(fresult); + } + + ui32ItemCount = 0; + + // + // Enter loop to enumerate through all directory entries. + // + for(;;) + { + // + // Read an entry from the directory. + // + fresult = f_readdir(&g_sDirObject, &g_sFileInfo); + + // + // Check for error and return if there is a problem. + // + if(fresult != FR_OK) + { + PrintfStatus("Error from USB disk:"); + PrintfStatus((char *)StringFromFresult(fresult)); + return(fresult); + } + + // + // If the file name is blank, then this is the end of the + // listing. + // + if(!g_sFileInfo.fname[0]) + { + break; + } + + // + // Add the information as a line in the listbox widget. + // + if(ui32ItemCount < NUM_LIST_STRINGS) + { + usnprintf(g_pcFilenames[ui32ItemCount], MAX_FILENAME_STRING_LEN, + "(%c) %s", (g_sFileInfo.fattrib & AM_DIR) ? 'D' : 'F', + g_sFileInfo.fname); + ListBoxTextAdd(&g_sDirList, g_pcFilenames[ui32ItemCount]); + } + + // + // Move to the next entry in the item array we use to populate the + // list box. + // + ui32ItemCount++; + } + + // + // Made it to here, return with no errors. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "cd" command. It takes an argument +// that specifies the directory to make the current working directory. +// Path separators must use a forward slash "/". The argument to cd +// can be one of the following: +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so dont try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory +// to make sure it exists. If the new path is opened successfully, then +// the current working directory (cwd) is changed to the new path. +// +// In cases of error, the pui32Reason parameter will be written with one of +// the following values: +// +//***************************************************************************** +static FRESULT +ChangeToDirectory(char *pi8Directory, uint32_t *pui32Reason) +{ + unsigned int uIdx; + FRESULT fresult; + + // + // Copy the current working path into a temporary buffer so + // it can be manipulated. + // + strcpy(g_cTmpBuf, g_cCwdBuf); + + // + // If the first character is /, then this is a fully specified + // path, and it should just be used as-is. + // + if(pi8Directory[0] == '/') + { + // + // Make sure the new path is not bigger than the cwd buffer. + // + if(strlen(pi8Directory) + 1 > sizeof(g_cCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_OK); + } + + // + // If the new path name (in argv[1]) is not too int32_t, then + // copy it into the temporary buffer so it can be checked. + // + else + { + strncpy(g_cTmpBuf, pi8Directory, sizeof(g_cTmpBuf)); + } + } + + // + // If the argument is .. then attempt to remove the lowest level + // on the CWD. + // + else if(!strcmp(pi8Directory, "..")) + { + // + // Get the index to the last character in the current path. + // + uIdx = strlen(g_cTmpBuf) - 1; + + // + // Back up from the end of the path name until a separator (/) + // is found, or until we bump up to the start of the path. + // + while((g_cTmpBuf[uIdx] != '/') && (uIdx > 1)) + { + // + // Back up one character. + // + uIdx--; + } + + // + // Now we are either at the lowest level separator in the + // current path, or at the beginning of the string (root). + // So set the new end of string here, effectively removing + // that last part of the path. + // + g_cTmpBuf[uIdx] = 0; + } + + // + // Otherwise this is just a normal path name from the current + // directory, and it needs to be appended to the current path. + // + else + { + // + // Test to make sure that when the new additional path is + // added on to the current path, there is room in the buffer + // for the full new path. It needs to include a new separator, + // and a trailing null character. + // + if(strlen(g_cTmpBuf) + strlen(pi8Directory) + 1 + 1 > sizeof(g_cCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_INVALID_OBJECT); + } + + // + // The new path is okay, so add the separator and then append + // the new directory to the path. + // + else + { + // + // If not already at the root level, then append a / + // + if(strcmp(g_cTmpBuf, "/")) + { + strcat(g_cTmpBuf, "/"); + } + + // + // Append the new directory to the path. + // + strcat(g_cTmpBuf, pi8Directory); + } + } + + // + // At this point, a candidate new directory path is in chTmpBuf. + // Try to open it to make sure it is valid. + // + fresult = f_opendir(&g_sDirObject, g_cTmpBuf); + + // + // If it cant be opened, then it is a bad path. Inform + // user and return. + // + if(fresult != FR_OK) + { + *pui32Reason = OPENDIR_ERROR; + return(fresult); + } + + // + // Otherwise, it is a valid new path, so copy it into the CWD and update + // the screen. + // + else + { + strncpy(g_cCwdBuf, g_cTmpBuf, sizeof(g_cCwdBuf)); + } + + // + // Return success. + // + return(FR_OK); +} + +//***************************************************************************** +// +// This function returns the number of ticks since the last time this function +// was called. +// +//***************************************************************************** +uint32_t +GetTickms(void) +{ + uint32_t ui32RetVal; + uint32_t ui32Saved; + + ui32RetVal = g_ui32SysTickCount; + ui32Saved = ui32RetVal; + + if(ui32Saved > g_ui32LastTick) + { + ui32RetVal = ui32Saved - g_ui32LastTick; + } + else + { + ui32RetVal = g_ui32LastTick - ui32Saved; + } + + // + // This could miss a few milliseconds but the timings here are on a + // much larger scale. + // + g_ui32LastTick = ui32Saved; + + // + // Return the number of milliseconds since the last time this was called. + // + return(ui32RetVal * MS_PER_SYSTICK); +} + +//***************************************************************************** +// +// The program main function. It performs initialization, then handles the +// user interaction via the touch screen graphical interface. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32DriveTimeout, ui32SysClock, ui32PLLRate; +#ifdef USE_ULPI + uint32_t ui32Setting; +#endif + tContext sContext; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + +#ifdef USE_ULPI + // + // Switch the USB ULPI Pins over. + // + USBULPIPinoutSet(); + + // + // Enable USB ULPI with high speed support. + // + ui32Setting = USBLIB_FEATURE_ULPI_HS; + USBOTGFeatureSet(0, USBLIB_FEATURE_USBULPI, &ui32Setting); + + // + // Setting the PLL frequency to zero tells the USB library to use the + // external USB clock. + // + ui32PLLRate = 0; +#else + // + // Save the PLL rate used by this application. + // + ui32PLLRate = 480000000; +#endif + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&sContext, "usb-host-msc"); + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(ui32SysClock / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable the uDMA controller and set up the control table base. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_sDMAControlTable); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + + // + // Set the touch screen event handler. + // + TouchScreenCallbackSet(WidgetPointerMessage); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sBackground); + + // + // Set some initial strings. + // + ListBoxTextAdd(&g_sDirList, "Waiting for device..."); + + // + // Issue the initial paint request to the widgets then immediately call + // the widget manager to process the paint message. This ensures that the + // display is drawn as quickly as possible and saves the delay we would + // otherwise experience if we processed the paint message after mounting + // and reading the SD card. + // + WidgetPaint(WIDGET_ROOT); + WidgetMessageQueueProcess(); + + // + // Initially wait for device connection. + // + g_eState = STATE_NO_DEVICE; + + // + // Initialize the USB stack for host mode. + // + USBStackModeSet(0, eUSBModeHost, 0); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the mass storage class driver. + // + g_psMSCInstance = USBHMSCDriveOpen(0, MSCCallback); + + // + // Initialize the drive timeout. + // + ui32DriveTimeout = USBMSC_DRIVE_RETRY; + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Tell the USB library the CPU clock and the PLL frequency. This is a + // new requirement for TM4C129 devices. + // + USBHCDFeatureSet(0, USBLIB_FEATURE_CPUCLK, &ui32SysClock); + USBHCDFeatureSet(0, USBLIB_FEATURE_USBPLL, &ui32PLLRate); + + // + // Initialize the USB controller for host operation. + // + USBHCDInit(0, g_pHCDPool, HCD_MEMORY_SIZE); + + // + // Initialize the file system. + // + FileInit(); + + // + // Enter an (almost) infinite loop for reading and processing commands from + // the user. + // + while(1) + { + // + // Call the USB stack to keep it running. + // + USBHCDMain(); + + // + // Process any messages in the widget message queue. This keeps the + // display UI running. + // + WidgetMessageQueueProcess(); + + switch(g_eState) + { + case STATE_DEVICE_ENUM: + { + // + // Take it easy on the Mass storage device if it is slow to + // start up after connecting. + // + if(USBHMSCDriveReady(g_psMSCInstance) != 0) + { + // + // Wait about 500ms before attempting to check if the + // device is ready again. + // + ROM_SysCtlDelay(ui32SysClock / (3 * 2)); + + // + // Decrement the retry count. + // + ui32DriveTimeout--; + + // + // If the timeout is hit then go to the + // STATE_TIMEOUT_DEVICE state. + // + if(ui32DriveTimeout == 0) + { + g_eState = STATE_TIMEOUT_DEVICE; + } + break; + } + + // + // Getting here means the device is ready. + // Reset the CWD to the root directory. + // + g_cCwdBuf[0] = '/'; + g_cCwdBuf[1] = 0; + + // + // Fill the list box with the files and directories found. + // + if(!PopulateFileListBox(true)) + { + // + // If there were no errors reported, we are ready for + // MSC operation. + // + g_eState = STATE_DEVICE_READY; + } + + // + // Set the Device Present flag. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + break; + } + + // + // If there is no device then just wait for one. + // + case STATE_NO_DEVICE: + { + if(g_ui32Flags == FLAGS_DEVICE_PRESENT) + { + // + // Empty the list box on the display. + // + ListBoxClear(&g_sDirList); + ListBoxTextAdd(&g_sDirList, "Waiting for device..."); + WidgetPaint((tWidget *)&g_sDirList); + + // + // Clear the Device Present flag. + // + g_ui32Flags &= ~FLAGS_DEVICE_PRESENT; + } + break; + } + + // + // An unknown device was connected. + // + case STATE_UNKNOWN_DEVICE: + { + // + // If this is a new device then change the status. + // + if((g_ui32Flags & FLAGS_DEVICE_PRESENT) == 0) + { + // + // Clear the screen and indicate that an unknown device + // is present. + // + ListBoxClear(&g_sDirList); + ListBoxTextAdd(&g_sDirList, "Unknown device."); + WidgetPaint((tWidget *)&g_sDirList); + } + // + // Set the Device Present flag. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + break; + } + + // + // The connected mass storage device is not reporting ready. + // + case STATE_TIMEOUT_DEVICE: + { + // + // If this is the first time in this state then print a + // message. + // + if((g_ui32Flags & FLAGS_DEVICE_PRESENT) == 0) + { + // + // Clear the screen and indicate that an unknown device + // is present. + // + ListBoxClear(&g_sDirList); + ListBoxTextAdd(&g_sDirList, "Device Timeout."); + WidgetPaint((tWidget *)&g_sDirList); + } + + // + // Set the Device Present flag. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + break; + } + + // + // Something has caused a power fault. + // + case STATE_POWER_FAULT: + { + break; + } + default: + { + break; + } + } + } +} diff --git a/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ewd b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ewp b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ewp new file mode 100644 index 0000000..e751d97 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ewp @@ -0,0 +1,815 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\usb_host_msc.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.icf b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.icf new file mode 100644 index 0000000..1d4d691 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_msc.icf - Linker configuration file for usb_host_msc. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ld b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ld new file mode 100644 index 0000000..1a2c564 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_msc.ld - Linker configuration file for usb_host_msc. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.sct b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.sct new file mode 100644 index 0000000..615572d --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_msc.sct - Linker configuration file for usb_host_msc. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.uvopt b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.uvopt new file mode 100644 index 0000000..c5e3a8f --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.uvopt @@ -0,0 +1,415 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_msc + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + fat_usbmsc.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_msc.c + usb_host_msc.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 12 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 13 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.uvproj b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.uvproj new file mode 100644 index 0000000..1041e88 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc.uvproj @@ -0,0 +1,469 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_host_msc + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_msc + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_msc.bin .\rvmdk\usb_host_msc.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_msc.sct + + + --entry Reset_Handler + + + + + + + + Source + + + fat_usbmsc.c + 1 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + usb_host_msc.c + 1 + .\usb_host_msc.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_host_msc/usb_host_msc_ccs.cmd b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc_ccs.cmd new file mode 100644 index 0000000..0d7d179 --- /dev/null +++ b/boards/dk-tm4c129x/usb_host_msc/usb_host_msc_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_msc_ccs.cmd - CCS linker configuration file for usb_host_msc. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/dk-tm4c129x/usb_otg_mouse/Makefile b/boards/dk-tm4c129x/usb_otg_mouse/Makefile new file mode 100644 index 0000000..438beff --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/Makefile @@ -0,0 +1,99 @@ +#****************************************************************************** +# +# Makefile - Rules for building the OTG Mouse. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=. +VPATH+= +VPATH+=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. + +# +# The default rule, which causes the OTG Mouse to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_otg_mouse.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the OTG Mouse. +# +${COMPILER}/usb_otg_mouse.axf: ${COMPILER}/frame.o +${COMPILER}/usb_otg_mouse.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_otg_mouse.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_otg_mouse.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_otg_mouse.axf: ${COMPILER}/touch.o +${COMPILER}/usb_otg_mouse.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_otg_mouse.axf: ${COMPILER}/usb_dev_mouse.o +${COMPILER}/usb_otg_mouse.axf: ${COMPILER}/usb_host_mouse.o +${COMPILER}/usb_otg_mouse.axf: ${COMPILER}/usb_mouse_structs.o +${COMPILER}/usb_otg_mouse.axf: ${COMPILER}/usb_otg_mouse.o +${COMPILER}/usb_otg_mouse.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_otg_mouse.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_otg_mouse.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_otg_mouse.axf: usb_otg_mouse.ld +SCATTERgcc_usb_otg_mouse=usb_otg_mouse.ld +ENTRY_usb_otg_mouse=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_otg_mouse/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_otg_mouse/ccs/.ccsimportspec new file mode 100644 index 0000000..df0b48e --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/ccs/.ccsimportspec @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_otg_mouse/ccs/.ccsproject b/boards/dk-tm4c129x/usb_otg_mouse/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_otg_mouse/ccs/.cproject b/boards/dk-tm4c129x/usb_otg_mouse/ccs/.cproject new file mode 100644 index 0000000..43a0ef4 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/ccs/.cproject @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_otg_mouse/ccs/.project b/boards/dk-tm4c129x/usb_otg_mouse/ccs/.project new file mode 100644 index 0000000..d1a43bd --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/ccs/.project @@ -0,0 +1,90 @@ + + + usb_otg_mouse + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_otg_mouse/startup_ccs.c + + + usb_dev_mouse.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_otg_mouse/usb_dev_mouse.c + + + usb_host_mouse.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_otg_mouse/usb_host_mouse.c + + + usb_mouse_structs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_otg_mouse/usb_mouse_structs.c + + + usb_otg_mouse.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.c + + + usb_otg_mouse_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_otg_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_otg_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_otg_mouse/ccs/Debug/usb_otg_mouse.bin b/boards/dk-tm4c129x/usb_otg_mouse/ccs/Debug/usb_otg_mouse.bin new file mode 100644 index 0000000..68fff38 Binary files /dev/null and b/boards/dk-tm4c129x/usb_otg_mouse/ccs/Debug/usb_otg_mouse.bin differ diff --git a/boards/dk-tm4c129x/usb_otg_mouse/ccs/Debug/usb_otg_mouse.out b/boards/dk-tm4c129x/usb_otg_mouse/ccs/Debug/usb_otg_mouse.out new file mode 100644 index 0000000..961d5ea Binary files /dev/null and b/boards/dk-tm4c129x/usb_otg_mouse/ccs/Debug/usb_otg_mouse.out differ diff --git a/boards/dk-tm4c129x/usb_otg_mouse/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_otg_mouse/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_otg_mouse/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_otg_mouse/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_otg_mouse/ewarm/Exe/usb_otg_mouse.bin b/boards/dk-tm4c129x/usb_otg_mouse/ewarm/Exe/usb_otg_mouse.bin new file mode 100644 index 0000000..eee3454 Binary files /dev/null and b/boards/dk-tm4c129x/usb_otg_mouse/ewarm/Exe/usb_otg_mouse.bin differ diff --git a/boards/dk-tm4c129x/usb_otg_mouse/ewarm/Exe/usb_otg_mouse.out b/boards/dk-tm4c129x/usb_otg_mouse/ewarm/Exe/usb_otg_mouse.out new file mode 100644 index 0000000..4c20367 Binary files /dev/null and b/boards/dk-tm4c129x/usb_otg_mouse/ewarm/Exe/usb_otg_mouse.out differ diff --git a/boards/dk-tm4c129x/usb_otg_mouse/gcc/usb_otg_mouse.axf b/boards/dk-tm4c129x/usb_otg_mouse/gcc/usb_otg_mouse.axf new file mode 100644 index 0000000..4f5bb32 Binary files /dev/null and b/boards/dk-tm4c129x/usb_otg_mouse/gcc/usb_otg_mouse.axf differ diff --git a/boards/dk-tm4c129x/usb_otg_mouse/gcc/usb_otg_mouse.bin b/boards/dk-tm4c129x/usb_otg_mouse/gcc/usb_otg_mouse.bin new file mode 100644 index 0000000..921aec0 Binary files /dev/null and b/boards/dk-tm4c129x/usb_otg_mouse/gcc/usb_otg_mouse.bin differ diff --git a/boards/dk-tm4c129x/usb_otg_mouse/readme.txt b/boards/dk-tm4c129x/usb_otg_mouse/readme.txt new file mode 100644 index 0000000..ab67d23 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/readme.txt @@ -0,0 +1,34 @@ +USB OTG HID Mouse Example + +This example application demonstrates the use of USB On-The-Go (OTG) to +offer both USB host and device operation. When the DK board is connected +to a USB host, it acts as a BIOS-compatible USB mouse. The select button +on the board (on the bottom right corner) acts as mouse button 1 and +the mouse pointer may be moved by dragging your finger or a stylus across +the touchscreen in the desired direction. + +If a USB mouse is connected to the USB OTG port, the board operates as a +USB host and draws dots on the display to track the mouse movement. The +states of up to three mouse buttons are shown at the bottom right of the +display. + + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_otg_mouse/rvmdk/usb_otg_mouse.axf b/boards/dk-tm4c129x/usb_otg_mouse/rvmdk/usb_otg_mouse.axf new file mode 100644 index 0000000..e979b07 Binary files /dev/null and b/boards/dk-tm4c129x/usb_otg_mouse/rvmdk/usb_otg_mouse.axf differ diff --git a/boards/dk-tm4c129x/usb_otg_mouse/rvmdk/usb_otg_mouse.bin b/boards/dk-tm4c129x/usb_otg_mouse/rvmdk/usb_otg_mouse.bin new file mode 100644 index 0000000..db1ae8f Binary files /dev/null and b/boards/dk-tm4c129x/usb_otg_mouse/rvmdk/usb_otg_mouse.bin differ diff --git a/boards/dk-tm4c129x/usb_otg_mouse/startup_ccs.c b/boards/dk-tm4c129x/usb_otg_mouse/startup_ccs.c new file mode 100644 index 0000000..5bf38b3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/startup_ccs.c @@ -0,0 +1,277 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_otg_mouse/startup_ewarm.c b/boards/dk-tm4c129x/usb_otg_mouse/startup_ewarm.c new file mode 100644 index 0000000..eb5ec25 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/startup_ewarm.c @@ -0,0 +1,308 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_otg_mouse/startup_gcc.c b/boards/dk-tm4c129x/usb_otg_mouse/startup_gcc.c new file mode 100644 index 0000000..1a66105 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/startup_gcc.c @@ -0,0 +1,324 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_otg_mouse/startup_rvmdk.S b/boards/dk-tm4c129x/usb_otg_mouse/startup_rvmdk.S new file mode 100644 index 0000000..ebb3292 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/startup_rvmdk.S @@ -0,0 +1,333 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN SysTickHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_dev_mouse.c b/boards/dk-tm4c129x/usb_otg_mouse/usb_dev_mouse.c new file mode 100644 index 0000000..9390d8c --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_dev_mouse.c @@ -0,0 +1,556 @@ +//***************************************************************************** +// +// usb_dev_mouse.c - Main routines for the mouse device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/systick.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidmouse.h" +#include "utils/uartstdio.h" +#include "usb_mouse_structs.h" +#include "drivers/touch.h" +#include "usb_otg_mouse.h" + +//***************************************************************************** +// +// The GPIO pin which is connected to the select button. +// +//***************************************************************************** +#define SEL_BTN_PORT GPIO_PORTP_BASE +#define SEL_BTN_PIN GPIO_PIN_1 + +//***************************************************************************** +// +// The defines used with the g_ui32Commands variable. +// +//***************************************************************************** +#define UPDATE_TICK_EVENT 0x80000000 + +//***************************************************************************** +// +// The incremental update for the mouse. +// +//***************************************************************************** +#define MOUSE_MOVE_INC ((char)4) +#define MOUSE_MOVE_DEC ((char)-4) + +//***************************************************************************** +// +// The HID mouse report offsets for this mouse application. +// +//***************************************************************************** +#define HID_REPORT_BUTTONS 0 +#define HID_REPORT_X 1 +#define HID_REPORT_Y 2 + +//***************************************************************************** +// +// Holds command bits used to signal the main loop to perform various tasks. +// +//***************************************************************************** +volatile uint32_t g_ui32Commands; + +//***************************************************************************** +// +// Holds the current state of the touchscreen - pressed or not. +// +//***************************************************************************** +volatile bool g_bScreenPressed; + +//***************************************************************************** +// +// Holds the current state of the user button - pressed or not. +// +//***************************************************************************** +volatile bool g_bButtonPressed; + + +//***************************************************************************** +// +// A flag used to indicate whether or not we are currently connected to the USB +// host. +// +//***************************************************************************** +volatile bool g_bConnected; + +//***************************************************************************** +// +// Holds the previous press position for the touchscreen. +// +//***************************************************************************** +volatile int32_t g_i32ScreenStartX; +volatile int32_t g_i32ScreenStartY; + +//***************************************************************************** +// +// Holds the current press position for the touchscreen. +// +//***************************************************************************** +volatile int32_t g_i32ScreenX; +volatile int32_t g_i32ScreenY; + +//***************************************************************************** +// +// The system tick timer rate. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / SYSTICKS_PER_SECOND) + +//***************************************************************************** +// +// Global system tick counter holds elapsed time since the application started +// expressed in 100ths of a second. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount; + +//***************************************************************************** +// +// Global system tick counter hold the g_ui32SysTickCount the last time +// GetTickms() was called. +// +//***************************************************************************** +static uint32_t g_ui32LastTick; + +//***************************************************************************** +// +// The number of system ticks to wait for each USB packet to be sent before +// we assume the host has disconnected. The value 50 equates to half a second. +// +//***************************************************************************** +#define MAX_SEND_DELAY 50 + +//***************************************************************************** +// +// This enumeration holds the various states that the mouse can be in during +// normal operation. +// +//***************************************************************************** +volatile enum +{ + // + // Unconfigured. + // + eMouseStateUnconfigured, + + // + // No keys to send and not waiting on data. + // + eMouseStateIdle, + + // + // Waiting on data to be sent out. + // + eMouseStateSend +} +g_iMouseState = eMouseStateUnconfigured; + + +uint32_t +MouseHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgData, + void *pvMsgData) +{ + switch(ui32Event) + { + // + // The USB host has connected to and configured the device. + // + case USB_EVENT_CONNECTED: + { + UARTprintf("Host connected.\n"); + g_iMouseState = eMouseStateIdle; + g_bConnected = true; + break; + } + + // + // The USB host has disconnected from the device. + // + case USB_EVENT_DISCONNECTED: + { + UARTprintf("Host disconnected.\n"); + g_bConnected = false; + g_iMouseState = eMouseStateUnconfigured; + break; + } + + // + // A report was sent to the host. We are now free to send another. + // + case USB_EVENT_TX_COMPLETE: + { + g_iMouseState = eMouseStateIdle; + break; + } + } + return(0); +} + +//*************************************************************************** +// +// Wait for a period of time for the state to become idle or unconfigured. +// +// \param ui32TimeoutTick is the number of system ticks to wait before +// declaring a timeout and returning \b false. +// +// This function polls the current mouse state for ui32TimeoutTicks system +// ticks waiting for it to either become idle or unconfigured. If the state +// becomes one of these, the function returns true. If ui32TimeoutTicks +// occur prior to the state becoming idle or unconfigured, false is returned +// to indicate a timeout. +// +// \return Returns \b true on success or \b false on timeout. +// +//*************************************************************************** +bool +WaitForSendIdle(uint32_t ui32TimeoutTicks) +{ + uint32_t ui32Start, ui32Now, ui32Elapsed; + + ui32Start = g_ui32SysTickCount; + ui32Elapsed = 0; + + while(ui32Elapsed < ui32TimeoutTicks) + { + // + // Is the mouse is idle or we have disconnected, return immediately. + // + if((g_iMouseState == eMouseStateIdle) || + (g_iMouseState == eMouseStateUnconfigured)) + { + return(true); + } + + // + // Determine how much time has elapsed since we started waiting. This + // should be safe across a wrap of g_ui32SysTickCount. I suspect you + // won't likely leave the app running for the 497.1 days it will take + // for this to occur but you never know... + // + ui32Now = g_ui32SysTickCount; + ui32Elapsed = (ui32Start < ui32Now) ? (ui32Now - ui32Start) : + (((uint32_t)0xFFFFFFFF - ui32Start) + ui32Now + 1); + } + + // + // If we get here, we timed out so return a bad return code to let the + // caller know. + // + return(false); +} + +//***************************************************************************** +// +// This is the interrupt handler for the SysTick interrupt. It is called +// periodically and updates a global tick counter then sets a flag to tell the +// main loop to check to see if a new HID report should be sent to the host. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + g_ui32SysTickCount++; + g_ui32Commands |= UPDATE_TICK_EVENT; +} + +//***************************************************************************** +// +// This function handles updates due to the touchscreen and buttons. +// +// This function is called from the main loop each time the touchscreen state +// needs to be checked. If it detects an update it will schedule an transfer +// to the host. +// +// Returns Returns \b true on success or \b false if an error is detected. +// +//***************************************************************************** +bool +TouchEventHandler(void) +{ + uint32_t ui32Retcode; + int32_t i32DeltaX, i32DeltaY; + bool bSuccess; + bool bBtnPressed; + + // + // Assume all is well until we determine otherwise. + // + bSuccess = true; + + // + // Get the current state of the select button. + // + bBtnPressed = (ROM_GPIOPinRead(SEL_BTN_PORT, SEL_BTN_PIN) & SEL_BTN_PIN) ? + false : true; + + // + // Is someone pressing the screen or has the button changed state? If so, + // we determine how far they have dragged their finger/stylus and use this + // to calculate mouse position changes to send to the host. + // + if(g_bScreenPressed || (bBtnPressed != g_bButtonPressed)) + { + // + // Calculate how far we moved since the last time we checked. This + // rather odd layout prevents a compiler warning about undefined order + // of volatile accesses. + // + i32DeltaX = g_i32ScreenX; + i32DeltaX -= g_i32ScreenStartX; + i32DeltaY = g_i32ScreenY; + i32DeltaY -= g_i32ScreenStartY; + + // + // Reset our start position. + // + g_i32ScreenStartX = g_i32ScreenX; + g_i32ScreenStartY = g_i32ScreenY; + + // + // Was there any movement or change in button state? + // + if(i32DeltaX || i32DeltaY || (bBtnPressed != g_bButtonPressed)) + { + // + // Yes - send a report back to the host after clipping the deltas + // to the maximum we can support. + // + i32DeltaX = (i32DeltaX > 127) ? 127 : i32DeltaX; + i32DeltaX = (i32DeltaX < -128) ? -128 : i32DeltaX; + i32DeltaY = (i32DeltaY > 127) ? 127 : i32DeltaY; + i32DeltaY = (i32DeltaY < -128) ? -128 : i32DeltaY; + + // + // Remember the current button state. + // + g_bButtonPressed = bBtnPressed; + + // + // Send the report back to the host. + // + g_iMouseState = eMouseStateSend; + ui32Retcode = USBDHIDMouseStateChange((void *)&g_sMouseDevice, + (char)i32DeltaX, (char)i32DeltaY, + (bBtnPressed ? + MOUSE_REPORT_BUTTON_1 : 0)); + + // + // Did we schedule the report for transmission? + // + if(ui32Retcode == MOUSE_SUCCESS) + { + // + // Wait for the host to acknowledge the transmission if all went + // well. + // + bSuccess = WaitForSendIdle(MAX_SEND_DELAY); + + // + // Did we time out waiting for the packet to be sent? + // + if (!bSuccess) + { + // + // Yes - assume the host disconnected and go back to + // waiting for a new connection. + // + UARTprintf("Send timed out!\n"); + g_bConnected = 0; + } + } + else + { + // + // An error was reported when trying to send the report. This + // may be due to host disconnection but could also be due to a + // clash between our attempt to send a report and the driver + // sending the last report in response to an idle timer timeout + // so we don't jump to the conclusion that we were disconnected + // in this case. + // + UARTprintf("Can't send report.\n"); + bSuccess = false; + } + } + } + + return(bSuccess); +} + +//***************************************************************************** +// +// This function is called by the touchscreen driver whenever there is a +// change in press state or position. +// +//***************************************************************************** +int32_t +DeviceMouseTouchCallback(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + switch(ui32Message) + { + // + // The touchscreen has been pressed. Remember where we are so that + // we can determine how far the pointer moves later. + // + case WIDGET_MSG_PTR_DOWN: + g_i32ScreenStartX = i32X; + g_i32ScreenStartY = i32Y; + g_i32ScreenX = i32X; + g_i32ScreenY = i32Y; + g_bScreenPressed = true; + break; + + // + // The touchscreen is no longer being pressed. + // + case WIDGET_MSG_PTR_UP: + g_bScreenPressed = false; + break; + + // + // The user is dragging his/her finger/stylus over the touchscreen. + // + case WIDGET_MSG_PTR_MOVE: + g_i32ScreenX = i32X; + g_i32ScreenY = i32Y; + break; + } + + // + // Tell the mouse driver we handled the message. + // + return(1); +} + +//***************************************************************************** +// +// This function initializes the mouse in device mode. +// +//***************************************************************************** +void +DeviceInit(void) +{ + // + // Initialize the touchscreen driver and install our event handler. + // + TouchScreenInit(g_ui32SysClock); + TouchScreenCallbackSet(DeviceMouseTouchCallback); + + // + // Set the system tick to fire 100 times per second. + // + ROM_SysTickPeriodSet(g_ui32SysClock / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Pass the USB library our device information, initialize the USB + // controller and connect the device to the bus. + // + USBDHIDMouseInit(0, (tUSBDHIDMouseDevice *)&g_sMouseDevice); +} + +//***************************************************************************** +// +// This is the main loop that runs the mouse device application. +// +//***************************************************************************** +void +DeviceMain(void) +{ + bool bRetcode; + + if(g_iMouseState == eMouseStateUnconfigured) + { + return; + } + + // + // If it is time to check the touchscreen state then do so. + // + if(g_ui32Commands & UPDATE_TICK_EVENT) + { + g_ui32Commands &= ~UPDATE_TICK_EVENT; + TouchEventHandler(); + + // + // Wait for the last data to go out before sending more data. Also + // ensure that we drop out if the device is disconnected. + // + bRetcode = WaitForSendIdle(MAX_SEND_DELAY); + + // + // If we timed out, assume the host disconnected and start looking + // for a new connection. + // + if(!bRetcode) + { + g_iMouseState = eMouseStateUnconfigured; + } + } +} + +//***************************************************************************** +// +// This function returns the number of ticks since the last time this function +// was called. +// +//***************************************************************************** +uint32_t +GetTickms(void) +{ + uint32_t ui32RetVal, ui32Saved; + + ui32RetVal = g_ui32SysTickCount; + ui32Saved = ui32RetVal; + + if(ui32Saved > g_ui32LastTick) + { + ui32RetVal = ui32Saved - g_ui32LastTick; + } + else + { + ui32RetVal = g_ui32LastTick - ui32Saved; + } + + // + // This could miss a few milliseconds but the timings here are on a + // much larger scale. + // + g_ui32LastTick = ui32Saved; + + // + // Return the number of milliseconds since the last time this was called. + // + return(ui32RetVal * MS_PER_SYSTICK); +} diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_host_mouse.c b/boards/dk-tm4c129x/usb_otg_mouse/usb_host_mouse.c new file mode 100644 index 0000000..c2b0de6 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_host_mouse.c @@ -0,0 +1,740 @@ +//***************************************************************************** +// +// usb_host_mouse.c - main application code for the host mouse example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhhid.h" +#include "usblib/host/usbhhidmouse.h" +#include "utils/uartstdio.h" +#include "usb_otg_mouse.h" + +//***************************************************************************** +// +// The size of the mouse device interface's memory pool in bytes. +// +//***************************************************************************** +#define MOUSE_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the mouse device. +// +//***************************************************************************** +uint8_t g_pui8Buffer[MOUSE_MEMORY_SIZE]; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the Mouse class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHIDClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The global value used to store the mouse instance value. +// +//***************************************************************************** +static tUSBHMouse *g_psMouseInstance; + +//***************************************************************************** +// +// The global values used to store the mouse state. +// +//***************************************************************************** +static uint32_t g_ui32Buttons; +static tRectangle g_sCursor; + +//***************************************************************************** +// +// This enumerated type is used to hold the states of the mouse. +// +//***************************************************************************** +enum +{ + // + // No device is present. + // + eStateNoDevice, + + // + // Mouse has been detected and needs to be initialized in the main + // loop. + // + eStateMouseInit, + + // + // Mouse is connected and waiting for events. + // + eStateMouseConnected, + + // + // An unsupported device has been attached. + // + eStateUnknownDevice, + + // + // A power fault has occurred. + // + eStatePowerFault +} +iUSBState; + +//***************************************************************************** +// +// These defines are used to define the screen constraints to the application. +// +//***************************************************************************** +#define DISPLAY_BANNER_HEIGHT 20 +#define DISPLAY_BANNER_BG ClrDarkBlue +#define DISPLAY_BANNER_FG ClrWhite +#define DISPLAY_MOUSE_BG ClrBlack +#define DISPLAY_MOUSE_FG ClrWhite +#define DISPLAY_MOUSE_SIZE 2 + +//***************************************************************************** +// +// This function clears the main application screen area. +// +//***************************************************************************** +void +ClearMainWindow(void) +{ + tRectangle sRect; + + // + // Initialize the button indicator. + // + sRect.i16XMin = 0; + sRect.i16YMin = DISPLAY_BANNER_HEIGHT + 1; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - DISPLAY_BANNER_HEIGHT; + + GrContextForegroundSet(&g_sContext, DISPLAY_MOUSE_BG); + GrRectFill(&g_sContext, &sRect); + GrContextForegroundSet(&g_sContext, DISPLAY_MOUSE_FG); +} + +//***************************************************************************** +// +// This function updates the cursor position based on deltas received from +// the mouse device. +// +// \param i32XDelta is the signed movement in the X direction. +// \param i32YDelta is the signed movement in the Y direction. +// +// This function is called by the mouse handler code when it detects a change +// in the position of the mouse. It will take the inputs and force them +// to be constrained to the display area of the screen. If the left mouse +// button is pressed then the mouse will draw on the screen and if it is not +// it will move around normally. A side effect of not being able to read the +// current state of the screen is that the cursor will erase anything it moves +// over while the left mouse button is not pressed. +// +// \return None. +// +//***************************************************************************** +void +UpdateCursor(int32_t i32XDelta, int32_t i32YDelta) +{ + int32_t i32Temp; + + // + // If the left button is not pressed then erase the previous cursor + // position. + // + if((g_ui32Buttons & 1) == 0) + { + // + // Erase the previous cursor. + // + GrContextForegroundSet(&g_sContext, DISPLAY_MOUSE_BG); + GrRectFill(&g_sContext, &g_sCursor); + } + + // + // Need to do signed math so use the temporary signed value. + // + i32Temp = g_sCursor.i16XMin; + + // + // Update the X position without going off the screen. + // + if(((int)g_sCursor.i16XMin + i32XDelta + DISPLAY_MOUSE_SIZE) < + GrContextDpyWidthGet(&g_sContext)) + { + // + // Update the X cursor position. + // + i32Temp += i32XDelta; + + // + // Don't let the cursor go off the left of the screen either. + // + if(i32Temp < 0) + { + i32Temp = 0; + } + } + + // + // Update the X position. + // + g_sCursor.i16XMin = i32Temp; + g_sCursor.i16XMax = i32Temp + DISPLAY_MOUSE_SIZE; + + // + // Need to do signed math so use the temporary signed value. + // + i32Temp = g_sCursor.i16YMin; + + // + // Update the Y position without going off the screen. + // + if(((int)g_sCursor.i16YMin + i32YDelta) < + (GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT - DISPLAY_MOUSE_SIZE - 1)) + { + // + // Update the Y cursor position. + // + i32Temp += i32YDelta; + + // + // Don't let the cursor overwrite the status area of the screen. + // + if(i32Temp < DISPLAY_BANNER_HEIGHT + 1) + { + i32Temp = DISPLAY_BANNER_HEIGHT + 1; + } + } + + // + // Update the Y position. + // + g_sCursor.i16YMin = i32Temp; + g_sCursor.i16YMax = i32Temp + DISPLAY_MOUSE_SIZE; + + // + // Draw the new cursor. + // + GrContextForegroundSet(&g_sContext, DISPLAY_MOUSE_FG); + GrRectFill(&g_sContext, &g_sCursor); +} + +//***************************************************************************** +// +// This function will update the small mouse button indicators in the status +// bar area of the screen. This can be called on its own or it will be called +// whenever UpdateStatus() is called as well. +// +//***************************************************************************** +void +UpdateButtons(void) +{ + tRectangle sRect, sRectInner; + int iButton; + + // + // Initialize the button indicator position. + // + sRect.i16XMin = GrContextDpyWidthGet(&g_sContext) - 36; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - 18; + sRect.i16XMax = sRect.i16XMin + 6; + sRect.i16YMax = sRect.i16YMin + 8; + sRectInner.i16XMin = sRect.i16XMin + 1; + sRectInner.i16YMin = sRect.i16YMin + 1; + sRectInner.i16XMax = sRect.i16XMax - 1; + sRectInner.i16YMax = sRect.i16YMax - 1; + + // + // Check all three buttons. + // + for(iButton = 0; iButton < 3; iButton++) + { + // + // Draw the button indicator red if pressed and black if not pressed. + // + if(g_ui32Buttons & (1 << iButton)) + { + GrContextForegroundSet(&g_sContext, ClrRed); + } + else + { + GrContextForegroundSet(&g_sContext, ClrBlack); + } + + // + // Draw the back of the button indicator. + // + GrRectFill(&g_sContext, &sRectInner); + + // + // Draw the border on the button indicator. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Move to the next button indicator position. + // + sRect.i16XMin += 8; + sRect.i16XMax += 8; + sRectInner.i16XMin += 8; + sRectInner.i16XMax += 8; + } +} + +//***************************************************************************** +// +// This function updates the status area of the screen. It uses the current +// state of the application to print the status bar. +// +//***************************************************************************** +void +UpdateStatus(char *pcString, uint32_t ui32Buttons, bool bClrBackground) +{ + tRectangle sRect; + + // + // Fill the bottom rows of the screen with blue to create the status area. + // + sRect.i16XMin = 0; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT - 1; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = sRect.i16YMin + DISPLAY_BANNER_HEIGHT; + + // + // Were we asked to clear the background of the status area? + // + GrContextBackgroundSet(&g_sContext, DISPLAY_BANNER_BG); + + if(bClrBackground) + { + // + // Draw the background of the banner. + // + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_FG); + GrRectDraw(&g_sContext, &sRect); + } + + // + // Write the current state to the left of the status area. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Update the status on the screen. + // + if(pcString != 0) + { + UARTprintf(pcString); + UARTprintf("\n"); + GrStringDraw(&g_sContext, pcString, -1, 10, sRect.i16YMin + 4, 1); + + g_ui32Buttons = ui32Buttons; + } + else if(iUSBState == eStateNoDevice) + { + // + // Mouse is currently disconnected. + // + UARTprintf("no device\n"); + GrStringDraw(&g_sContext, "no device ", -1, 10, sRect.i16YMin + 4, + 1); + } + else if(iUSBState == eStateMouseConnected) + { + // + // Mouse is connected. + // + UARTprintf("connected\n"); + GrStringDraw(&g_sContext, "connected ", -1, 10, sRect.i16YMin + 4, + 1); + } + else if(iUSBState == eStateUnknownDevice) + { + // + // Some other (unknown) device is connected. + // + UARTprintf("unknown device\n"); + GrStringDraw(&g_sContext, "unknown device", -1, 10, sRect.i16YMin + 4, + 1); + } + else if(iUSBState == eStatePowerFault) + { + // + // Power fault. + // + UARTprintf("power fault\n"); + GrStringDraw(&g_sContext, "power fault ", -1, 10, sRect.i16YMin + 4, + 1); + } + + UpdateButtons(); +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// \param pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the mouse device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +// \return None. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *psEventInfo; + + // + // Cast this pointer to its actual type. + // + psEventInfo = (tEventInfo *)pvData; + + switch(psEventInfo->ui32Event) + { + // + // New mouse detected. + // + case USB_EVENT_CONNECTED: + { + // + // See if this is a HID Keyboard. + // + if((USBHCDDevClass(psEventInfo->ui32Instance, 0) == + USB_CLASS_HID) && + (USBHCDDevProtocol(psEventInfo->ui32Instance, 0) == + USB_HID_PROTOCOL_MOUSE)) + { + // + // Indicate that the mouse has been detected. + // + UARTprintf("Mouse Connected\n"); + + // + // Proceed to the eStateMouseInit state so that the main loop + // can finish initialized the mouse since USBHMouseInit() + // cannot be called from within a callback. + // + iUSBState = eStateMouseInit; + } + + break; + } + // + // Unsupported device detected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + UARTprintf("Unsupported Device Connected\n"); + + // + // An unknown device was detected. + // + iUSBState = eStateUnknownDevice; + + break; + } + // + // Device has been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Indicate that the mouse has been disconnected. + // + UARTprintf("Device Disconnected\n"); + + // + // Change the state so that the main loop knows that the mouse is + // no longer present. + // + iUSBState = eStateNoDevice; + + // + // Reset the button state. + // + g_ui32Buttons = 0; + + break; + } + // + // Power Fault. + // + case USB_EVENT_POWER_FAULT: + { + UARTprintf("Power Fault\n"); + + // + // No power means no device is present. + // + iUSBState = eStatePowerFault; + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This is the callback from the USB HID mouse handler. +// +// \param pvCBData is ignored by this function. +// \param ui32Event is one of the valid events for a mouse device. +// \param ui32MsgParam is defined by the event that occurs. +// \param pvMsgData is a pointer to data that is defined by the event that +// occurs. +// +// This function will be called to inform the application when a mouse has +// been plugged in or removed and any time mouse movement or button pressed +// is detected. +// +// \return None. +// +//***************************************************************************** +void +MouseCallback(tUSBHMouse *psMsInstance, uint32_t ui32Event, + uint32_t ui32MsgParam, void *pvMsgData) +{ + switch(ui32Event) + { + // + // Mouse button press detected. + // + case USBH_EVENT_HID_MS_PRESS: + { + UARTprintf("Button Pressed %02x\n", ui32MsgParam); + + // + // Save the new button that was pressed. + // + g_ui32Buttons |= ui32MsgParam; + + break; + } + + // + // Mouse button release detected. + // + case USBH_EVENT_HID_MS_REL: + { + UARTprintf("Button Released %02x\n", ui32MsgParam); + + // + // Remove the button from the pressed state. + // + g_ui32Buttons &= ~ui32MsgParam; + + break; + } + + // + // Mouse X movement detected. + // + case USBH_EVENT_HID_MS_X: + { + UARTprintf("X:%02d.\n", (signed char)ui32MsgParam); + + // + // Update the cursor on the screen. + // + UpdateCursor((signed char)ui32MsgParam, 0); + + break; + } + + // + // Mouse Y movement detected. + // + case USBH_EVENT_HID_MS_Y: + { + UARTprintf("Y:%02d.\n", (signed char)ui32MsgParam); + + // + // Update the cursor on the screen. + // + UpdateCursor(0, (signed char)ui32MsgParam); + + break; + } + } + + // + // Update the status area of the screen. + // + UpdateStatus(0, 0, false); +} + +//***************************************************************************** +// +// Initialize the host mode stack. +// +//***************************************************************************** +void +HostInit(void) +{ + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Initialize the button states. + // + g_ui32Buttons = 0; + + // + // Update the status on the screen. + // + UpdateStatus(0, 0, true); + + // + // Open an instance of the mouse driver. The mouse does not need + // to be present at this time, this just saves a place for it and allows + // the applications to be notified when a mouse is present. + // + g_psMouseInstance = + USBHMouseOpen(MouseCallback, g_pui8Buffer, MOUSE_MEMORY_SIZE); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Call the main loop for the Host controller driver. + // + iUSBState = eStateNoDevice; +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +void +HostMain(void) +{ + switch(iUSBState) + { + // + // This state is entered when the mouse is first detected. + // + case eStateMouseInit: + { + // + // Initialize the newly connected mouse. + // + USBHMouseInit(g_psMouseInstance); + + // + // Proceed to the mouse connected state. + // + iUSBState = eStateMouseConnected; + + // + // Update the status on the screen. + // + UpdateStatus(0, 0, true); + + // + // Update the cursor on the screen. + // + UpdateCursor(GrContextDpyWidthGet(&g_sContext) / 2, + GrContextDpyHeightGet(&g_sContext)/ 2); + + break; + } + case eStateMouseConnected: + { + // + // Nothing is currently done in the main loop when the mouse + // is connected. + // + break; + } + case eStateNoDevice: + { + // + // The mouse is not connected so nothing needs to be done here. + // + break; + } + default: + { + break; + } + } + + // + // Periodically call the main loop for the Host controller driver. + // + USBHCDMain(); +} diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_mouse_structs.c b/boards/dk-tm4c129x/usb_otg_mouse/usb_mouse_structs.c new file mode 100644 index 0000000..1be2ae3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_mouse_structs.c @@ -0,0 +1,147 @@ +//***************************************************************************** +// +// usb_mouse_structs.c - Data structures defining the USB mouse device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidmouse.h" +#include "usb_mouse_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (13 + 1) * 2, + USB_DTYPE_STRING, + 'M', 0, 'o', 0, 'u', 0, 's', 0, 'e', 0, ' ', 0, 'E', 0, 'x', 0, 'a', 0, + 'm', 0, 'p', 0, 'l', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The interface description string. +// +//***************************************************************************** +const uint8_t g_pui8HIDInterfaceString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'M', 0, 'o', 0, 'u', 0, 's', 0, + 'e', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, + 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (23 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'M', 0, 'o', 0, 'u', 0, 's', 0, + 'e', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, 'i', 0, 'g', 0, + 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8HIDInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The HID mouse device initialization and customization structures. +// +//***************************************************************************** +tUSBDHIDMouseDevice g_sMouseDevice = +{ + USB_VID_TI_1CBE, + USB_PID_MOUSE, + 500, + USB_CONF_ATTR_SELF_PWR, + MouseHandler, + (void *)&g_sMouseDevice, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_mouse_structs.h b/boards/dk-tm4c129x/usb_otg_mouse/usb_mouse_structs.h new file mode 100644 index 0000000..a89debf --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_mouse_structs.h @@ -0,0 +1,33 @@ +//***************************************************************************** +// +// usb_mouse_structs.h - Data structures defining the mouse USB device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_MOUSE_STRUCTS_H_ +#define _USB_MOUSE_STRUCTS_H_ + +extern uint32_t MouseHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgData, void *pvMsgData); + +extern tUSBDHIDMouseDevice g_sMouseDevice; + +#endif diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.c b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.c new file mode 100644 index 0000000..50bebd9 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.c @@ -0,0 +1,322 @@ +//***************************************************************************** +// +// usb_otg_mouse.c - USB OTG Mouse (combined host and device mouse). +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_usb.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/device/usbdevice.h" +#include "usblib/host/usbhost.h" +#include "utils/uartstdio.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "usb_otg_mouse.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB OTG HID Mouse Example (usb_otg_mouse)

      +//! +//! This example application demonstrates the use of USB On-The-Go (OTG) to +//! offer both USB host and device operation. When the DK board is connected +//! to a USB host, it acts as a BIOS-compatible USB mouse. The select button +//! on the board (on the bottom right corner) acts as mouse button 1 and +//! the mouse pointer may be moved by dragging your finger or a stylus across +//! the touchscreen in the desired direction. +//! +//! If a USB mouse is connected to the USB OTG port, the board operates as a +//! USB host and draws dots on the display to track the mouse movement. The +//! states of up to three mouse buttons are shown at the bottom right of the +//! display. +//! +//***************************************************************************** + +//***************************************************************************** +// +// The current state of the USB in the system based on the detected mode. +// +//***************************************************************************** +volatile tUSBMode g_iCurrentMode = eUSBModeNone; + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// This global is used to indicate to the main that a mode change has +// occurred. +// +//***************************************************************************** +uint32_t g_ui32NewState; + +//***************************************************************************** +// +// The system clock frequency in Hz. +// +//***************************************************************************** +uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// The graphics context for the screen. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// A function which returns the number of milliseconds since it was last +// called. This can be found in usb_dev_mouse.c. +// +//***************************************************************************** +extern uint32_t GetTickms(void); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Callback function for mode changes. +// +//***************************************************************************** +void +ModeCallback(uint32_t ui32Index, tUSBMode iMode) +{ + // + // Save the new mode. + // + g_iCurrentMode = iMode; + + switch(iMode) + { + case eUSBModeHost: + { + break; + } + case eUSBModeDevice: + { + break; + } + case eUSBModeNone: + { + break; + } + default: + { + break; + } + } + g_ui32NewState = 1; +} + +//***************************************************************************** +// +// Initialize the USB for OTG mode on the platform. +// +//***************************************************************************** +void +USBOTGInit(uint32_t ui32ClockRate, tUSBModeCallback pfnModeCallback) +{ + uint32_t ui32PLLRate; + + // + // Enable USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Set the current processor speed to provide more accurate timing + // information to the USB library. + // + ui32PLLRate = 480000000; + USBOTGFeatureSet(0, USBLIB_FEATURE_CPUCLK, &ui32ClockRate); + USBOTGFeatureSet(0, USBLIB_FEATURE_USBPLL, &ui32PLLRate); + + // + // Initialize the USB OTG mode and pass in a mode callback. + // + USBStackModeSet(0, eUSBModeOTG, pfnModeCallback); +} + +//***************************************************************************** +// +// main routine. +// +//***************************************************************************** +int +main(void) +{ + tLPMFeature sLPMFeature; + + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Configure the UART. + // + UARTStdioConfig(0, 115200, g_ui32SysClock); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(g_ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "usb-otg-mouse"); + + // + // Configure USB for OTG operation. + // + USBOTGInit(g_ui32SysClock, ModeCallback); + + sLPMFeature.ui32HIRD = 500; + sLPMFeature.ui32Features = USBLIB_FEATURE_LPM_EN | + USBLIB_FEATURE_LPM_RMT_WAKE; + USBHCDFeatureSet(0, USBLIB_FEATURE_LPM, &sLPMFeature); + + // + // Initialize the host stack. + // + HostInit(); + + // + // Initialize the device stack. + // + DeviceInit(); + + // + // Initialize the USB controller for dual mode operation with a 2ms polling + // rate. + // + USBOTGModeInit(0, 2000, g_pui8HCDPool, HCD_MEMORY_SIZE); + + // + // Set the new state so that the screen updates on the first + // pass. + // + g_ui32NewState = 1; + + // + // Loop forever. + // + while(1) + { + // + // Tell the OTG library code how much time has passed in milliseconds + // since the last call. + // + USBOTGMain(GetTickms()); + + // + // Handle deferred state change. + // + if(g_ui32NewState) + { + g_ui32NewState =0; + + // + // Update the status area of the screen. + // + ClearMainWindow(); + + // + // Update the status bar with the new mode. + // + switch(g_iCurrentMode) + { + case eUSBModeHost: + { + UpdateStatus("Host Mode", 0, true); + break; + } + case eUSBModeDevice: + { + UpdateStatus("Device Mode", 0, true); + break; + } + case eUSBModeNone: + { + UpdateStatus("Idle Mode\n", 0, true); + break; + } + default: + { + break; + } + } + } + + if(g_iCurrentMode == eUSBModeDevice) + { + DeviceMain(); + } + else if(g_iCurrentMode == eUSBModeHost) + { + HostMain(); + } + } +} diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ewd b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ewp b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ewp new file mode 100644 index 0000000..f73c2f4 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ewp @@ -0,0 +1,818 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_dev_mouse.c + + + $PROJ_DIR$\usb_host_mouse.c + + + $PROJ_DIR$\usb_mouse_structs.c + + + $PROJ_DIR$\usb_otg_mouse.c + + + diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.h b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.h new file mode 100644 index 0000000..ed90da9 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.h @@ -0,0 +1,49 @@ +//***************************************************************************** +// +// usb_otg_mouse.h - The otg example application common definitions. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __USB_OTG_MOUSE_H__ +#define __USB_OTG_MOUSE_H__ + +void HostInit(void); +void HostMain(void); +void DeviceInit(void); +void DeviceMain(void); +void UpdateStatus(char *pcString, uint32_t ui32Buttons, bool bClrGBg); +void ClearMainWindow(void); + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +extern tContext g_sContext; + +//***************************************************************************** +// +// The system clock frequency in Hz. +// +//***************************************************************************** +extern uint32_t g_ui32SysClock; + +#endif diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.icf b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.icf new file mode 100644 index 0000000..7ba5d52 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_otg_mouse.icf - Linker configuration file for usb_otg_mouse. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ld b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ld new file mode 100644 index 0000000..03d922d --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_otg_mouse.ld - Linker configuration file for usb_otg_mouse. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.sct b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.sct new file mode 100644 index 0000000..cec7e8f --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_otg_mouse.sct - Linker configuration file for usb_otg_mouse. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.uvopt b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.uvopt new file mode 100644 index 0000000..4e7c593 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.uvopt @@ -0,0 +1,429 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_otg_mouse + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_mouse.c + usb_dev_mouse.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_mouse.c + usb_host_mouse.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_mouse_structs.c + usb_mouse_structs.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_otg_mouse.c + usb_otg_mouse.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 12 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 14 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.uvproj b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.uvproj new file mode 100644 index 0000000..19c10e3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse.uvproj @@ -0,0 +1,474 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_otg_mouse + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_otg_mouse + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_otg_mouse.bin .\rvmdk\usb_otg_mouse.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + .;..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_otg_mouse.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_dev_mouse.c + 1 + .\usb_dev_mouse.c + + + usb_host_mouse.c + 1 + .\usb_host_mouse.c + + + usb_mouse_structs.c + 1 + .\usb_mouse_structs.c + + + usb_otg_mouse.c + 1 + .\usb_otg_mouse.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse_ccs.cmd b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse_ccs.cmd new file mode 100644 index 0000000..f1c94b9 --- /dev/null +++ b/boards/dk-tm4c129x/usb_otg_mouse/usb_otg_mouse_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_otg_mouse_ccs.cmd - CCS linker configuration file for usb_otg_mouse. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/usb_stick_demo/Makefile b/boards/dk-tm4c129x/usb_stick_demo/Makefile new file mode 100644 index 0000000..769c69e --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/Makefile @@ -0,0 +1,90 @@ +#****************************************************************************** +# +# Makefile - Rules for building the usb_stick_demo example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the usb_stick_demo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_stick_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the usb_stick_demo example. +# +${COMPILER}/usb_stick_demo.axf: ${COMPILER}/frame.o +${COMPILER}/usb_stick_demo.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/usb_stick_demo.axf: ${COMPILER}/pinout.o +${COMPILER}/usb_stick_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_stick_demo.axf: ${COMPILER}/usb_stick_demo.o +${COMPILER}/usb_stick_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_stick_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_stick_demo.axf: usb_stick_demo.ld +SCATTERgcc_usb_stick_demo=usb_stick_demo.ld +ENTRY_usb_stick_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_stick_demo/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_stick_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..64f9068 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_stick_demo/ccs/.ccsproject b/boards/dk-tm4c129x/usb_stick_demo/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_stick_demo/ccs/.cproject b/boards/dk-tm4c129x/usb_stick_demo/ccs/.cproject new file mode 100644 index 0000000..6d68498 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_stick_demo/ccs/.project b/boards/dk-tm4c129x/usb_stick_demo/ccs/.project new file mode 100644 index 0000000..b425daa --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/ccs/.project @@ -0,0 +1,65 @@ + + + usb_stick_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_stick_demo/startup_ccs.c + + + usb_stick_demo.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.c + + + usb_stick_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_stick_demo/ccs/Debug/usb_stick_demo.bin b/boards/dk-tm4c129x/usb_stick_demo/ccs/Debug/usb_stick_demo.bin new file mode 100644 index 0000000..0cf2163 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_demo/ccs/Debug/usb_stick_demo.bin differ diff --git a/boards/dk-tm4c129x/usb_stick_demo/ccs/Debug/usb_stick_demo.out b/boards/dk-tm4c129x/usb_stick_demo/ccs/Debug/usb_stick_demo.out new file mode 100644 index 0000000..ec7f7c7 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_demo/ccs/Debug/usb_stick_demo.out differ diff --git a/boards/dk-tm4c129x/usb_stick_demo/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_stick_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_stick_demo/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_stick_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin b/boards/dk-tm4c129x/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin new file mode 100644 index 0000000..ef21b81 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin differ diff --git a/boards/dk-tm4c129x/usb_stick_demo/ewarm/Exe/usb_stick_demo.out b/boards/dk-tm4c129x/usb_stick_demo/ewarm/Exe/usb_stick_demo.out new file mode 100644 index 0000000..d29377a Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_demo/ewarm/Exe/usb_stick_demo.out differ diff --git a/boards/dk-tm4c129x/usb_stick_demo/gcc/usb_stick_demo.axf b/boards/dk-tm4c129x/usb_stick_demo/gcc/usb_stick_demo.axf new file mode 100644 index 0000000..f5307f4 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_demo/gcc/usb_stick_demo.axf differ diff --git a/boards/dk-tm4c129x/usb_stick_demo/gcc/usb_stick_demo.bin b/boards/dk-tm4c129x/usb_stick_demo/gcc/usb_stick_demo.bin new file mode 100644 index 0000000..0e76b2b Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_demo/gcc/usb_stick_demo.bin differ diff --git a/boards/dk-tm4c129x/usb_stick_demo/readme.txt b/boards/dk-tm4c129x/usb_stick_demo/readme.txt new file mode 100644 index 0000000..8690968 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/readme.txt @@ -0,0 +1,39 @@ +USB Stick Update Demo + +An example to demonstrate the use of the flash-based USB stick update +program. This example is meant to be loaded into flash memory from a USB +memory stick, using the USB stick update program (usb_stick_update), +running on the microcontroller. + +After this program is built, the binary file (usb_stick_demo.bin), should +be renamed to the filename expected by usb_stick_update ("FIRMWARE.BIN" by +default) and copied to the root directory of a USB memory stick. Then, +when the memory stick is plugged into the eval board that is running the +usb_stick_update program, this example program will be loaded into flash +and then run on the microcontroller. + +This program simply displays a message on the screen and prompts the user +to press the select button. Once the button is pressed, control is passed +back to the usb_stick_update program which is still is flash, and it will +attempt to load another program from the memory stick. This shows how +a user application can force a new firmware update from the memory stick. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_stick_demo/rvmdk/usb_stick_demo.axf b/boards/dk-tm4c129x/usb_stick_demo/rvmdk/usb_stick_demo.axf new file mode 100644 index 0000000..a57bb7c Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_demo/rvmdk/usb_stick_demo.axf differ diff --git a/boards/dk-tm4c129x/usb_stick_demo/rvmdk/usb_stick_demo.bin b/boards/dk-tm4c129x/usb_stick_demo/rvmdk/usb_stick_demo.bin new file mode 100644 index 0000000..2eba7d9 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_demo/rvmdk/usb_stick_demo.bin differ diff --git a/boards/dk-tm4c129x/usb_stick_demo/startup_ccs.c b/boards/dk-tm4c129x/usb_stick_demo/startup_ccs.c new file mode 100644 index 0000000..a769216 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/startup_ccs.c @@ -0,0 +1,268 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_stick_demo/startup_ewarm.c b/boards/dk-tm4c129x/usb_stick_demo/startup_ewarm.c new file mode 100644 index 0000000..cf3864b --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/startup_ewarm.c @@ -0,0 +1,299 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_stick_demo/startup_gcc.c b/boards/dk-tm4c129x/usb_stick_demo/startup_gcc.c new file mode 100644 index 0000000..00771a6 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/startup_gcc.c @@ -0,0 +1,315 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_stick_demo/startup_rvmdk.S b/boards/dk-tm4c129x/usb_stick_demo/startup_rvmdk.S new file mode 100644 index 0000000..f07ac83 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/startup_rvmdk.S @@ -0,0 +1,324 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.c b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.c new file mode 100644 index 0000000..80f6e41 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.c @@ -0,0 +1,261 @@ +//***************************************************************************** +// +// usb_stick_demo.c - USB stick update demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Stick Update Demo (usb_stick_demo)

      +//! +//! An example to demonstrate the use of the flash-based USB stick update +//! program. This example is meant to be loaded into flash memory from a USB +//! memory stick, using the USB stick update program (usb_stick_update), +//! running on the microcontroller. +//! +//! After this program is built, the binary file (usb_stick_demo.bin), should +//! be renamed to the filename expected by usb_stick_update ("FIRMWARE.BIN" by +//! default) and copied to the root directory of a USB memory stick. Then, +//! when the memory stick is plugged into the eval board that is running the +//! usb_stick_update program, this example program will be loaded into flash +//! and then run on the microcontroller. +//! +//! This program simply displays a message on the screen and prompts the user +//! to press the select button. Once the button is pressed, control is passed +//! back to the usb_stick_update program which is still is flash, and it will +//! attempt to load another program from the memory stick. This shows how +//! a user application can force a new firmware update from the memory stick. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Demonstrate the use of the USB stick update example. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Count; + uint32_t ui32SysClock; + tContext i16Context; + tRectangle i16Rect; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&i16Context, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&i16Context, "usb-stick-demo"); + + // + // Fill the top 24 rows of the screen with blue to create the banner. + // + i16Rect.i16XMin = 0; + i16Rect.i16YMin = 0; + i16Rect.i16XMax = GrContextDpyWidthGet(&i16Context) - 1; + i16Rect.i16YMax = 23; + GrContextForegroundSet(&i16Context, ClrDarkBlue); + GrRectFill(&i16Context, &i16Rect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&i16Context, ClrWhite); + GrRectDraw(&i16Context, &i16Rect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&i16Context, g_psFontCm20); + GrStringDrawCentered(&i16Context, "usb-stick-demo", -1, + GrContextDpyWidthGet(&i16Context) / 2, 10, 0); + + // + // Indicate what is happening. + // + GrContextFontSet(&i16Context, g_psFontCm24); + GrStringDrawCentered(&i16Context, "Press the SEL button to", -1, + GrContextDpyWidthGet(&i16Context) / 2, 60, 0); + GrStringDrawCentered(&i16Context, "start the USB stick updater", -1, + GrContextDpyWidthGet(&i16Context) / 2, 84, 0); + + // + // Flush any cached drawing operations. + // + GrFlush(&i16Context); + + // + // Wait for the pullup to take effect or the next loop will exist too soon. + // + ROM_SysCtlDelay(1000); + + // + // Wait until the select button has been pressed for ~40ms (in order to + // debounce the press). + // + ui32Count = 0; + while(1) + { + // + // See if the button is pressed. + // + if(ROM_GPIOPinRead(GPIO_PORTP_BASE, GPIO_PIN_1) == 0) + { + // + // Increment the count since the button is pressed. + // + ui32Count++; + + // + // If the count has reached 4, then the button has been debounced + // as being pressed. + // + if(ui32Count == 4) + { + break; + } + } + else + { + // + // Reset the count since the button is not pressed. + // + ui32Count = 0; + } + + // + // Delay for approximately 10ms. + // + ROM_SysCtlDelay(120000000 / (3 * 100)); + } + + // + // Wait until the select button has been released for ~40ms (in order to + // debounce the release). + // + ui32Count = 0; + while(1) + { + // + // See if the button is pressed. + // + if(ROM_GPIOPinRead(GPIO_PORTP_BASE, GPIO_PIN_1) != 0) + { + // + // Increment the count since the button is released. + // + ui32Count++; + + // + // If the count has reached 4, then the button has been debounced + // as being released. + // + if(ui32Count == 4) + { + break; + } + } + else + { + // + // Reset the count since the button is pressed. + // + ui32Count = 0; + } + + // + // Delay for approximately 10ms. + // + ROM_SysCtlDelay(120000000 / (3 * 100)); + } + + // + // Indicate that the updater is being called. + // + GrStringDrawCentered(&i16Context, "The USB stick updater is now", -1, + GrContextDpyWidthGet(&i16Context) / 2, 140, 0); + GrStringDrawCentered(&i16Context, "waiting for a USB stick", -1, + GrContextDpyWidthGet(&i16Context) / 2, 164, 0); + + // + // Flush any cached drawing operations. + // + GrFlush(&i16Context); + + // + // Call the updater so that it will search for an update on a memory stick. + // + (*((void (*)(void))(*(uint32_t *)0x2c)))(); + + // + // The updater should take control, so this should never be reached. + // Just in case, loop forever. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ewd b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ewp b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ewp new file mode 100644 index 0000000..224e575 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ewp @@ -0,0 +1,798 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_stick_demo.c + + + diff --git a/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.icf b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.icf new file mode 100644 index 0000000..6e4fa72 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_stick_demo.icf - Linker configuration file for usb_stick_demo. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00008000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ld b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ld new file mode 100644 index 0000000..e0d7496 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_stick_demo.ld - Linker configuration file for usb_stick_demo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00008000, LENGTH = 0x000f8000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.sct b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.sct new file mode 100644 index 0000000..a0a4d80 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_stick_demo.sct - Linker configuration file for usb_stick_demo. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00008000 0x000f8000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00008000 0x000f8000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.uvopt b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.uvopt new file mode 100644 index 0000000..2167088 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_stick_demo + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_stick_demo.c + usb_stick_demo.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.uvproj b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.uvproj new file mode 100644 index 0000000..1dfd884 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_stick_demo + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_stick_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_stick_demo.bin .\rvmdk\usb_stick_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_stick_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_stick_demo.c + 1 + .\usb_stick_demo.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo_ccs.cmd b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo_ccs.cmd new file mode 100644 index 0000000..e785079 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_demo/usb_stick_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_stick_demo_ccs.cmd - CCS linker configuration file for usb_stick_demo. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00008000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x000f8000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/dk-tm4c129x/usb_stick_update/Makefile b/boards/dk-tm4c129x/usb_stick_update/Makefile new file mode 100644 index 0000000..b1aed62 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB memory stick updater example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB memory stick updater example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_stick_update.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB memory stick updater example. +# +${COMPILER}/usb_stick_update.axf: ${COMPILER}/simple_fs.o +${COMPILER}/usb_stick_update.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_stick_update.axf: ${COMPILER}/usb_stick_update.o +${COMPILER}/usb_stick_update.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_stick_update.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_stick_update.axf: usb_stick_update.ld +SCATTERgcc_usb_stick_update=usb_stick_update.ld +ENTRY_usb_stick_update=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/usb_stick_update/ccs/.ccsimportspec b/boards/dk-tm4c129x/usb_stick_update/ccs/.ccsimportspec new file mode 100644 index 0000000..d225a1d --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_stick_update/ccs/.ccsproject b/boards/dk-tm4c129x/usb_stick_update/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_stick_update/ccs/.cproject b/boards/dk-tm4c129x/usb_stick_update/ccs/.cproject new file mode 100644 index 0000000..ebaa41e --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_stick_update/ccs/.project b/boards/dk-tm4c129x/usb_stick_update/ccs/.project new file mode 100644 index 0000000..0fe4424 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/ccs/.project @@ -0,0 +1,55 @@ + + + usb_stick_update + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + simple_fs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_stick_update/simple_fs.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_stick_update/startup_ccs.c + + + usb_stick_update.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.c + + + usb_stick_update_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/usb_stick_update/usb_stick_update_ccs.cmd + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/usb_stick_update/ccs/Debug/usb_stick_update.bin b/boards/dk-tm4c129x/usb_stick_update/ccs/Debug/usb_stick_update.bin new file mode 100644 index 0000000..c173ab1 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_update/ccs/Debug/usb_stick_update.bin differ diff --git a/boards/dk-tm4c129x/usb_stick_update/ccs/Debug/usb_stick_update.out b/boards/dk-tm4c129x/usb_stick_update/ccs/Debug/usb_stick_update.out new file mode 100644 index 0000000..8ab0bc2 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_update/ccs/Debug/usb_stick_update.out differ diff --git a/boards/dk-tm4c129x/usb_stick_update/ccs/macros.ini_initial b/boards/dk-tm4c129x/usb_stick_update/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/usb_stick_update/ccs/target_config.ccxml b/boards/dk-tm4c129x/usb_stick_update/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/usb_stick_update/ewarm/Exe/usb_stick_update.bin b/boards/dk-tm4c129x/usb_stick_update/ewarm/Exe/usb_stick_update.bin new file mode 100644 index 0000000..dfb1e56 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_update/ewarm/Exe/usb_stick_update.bin differ diff --git a/boards/dk-tm4c129x/usb_stick_update/ewarm/Exe/usb_stick_update.out b/boards/dk-tm4c129x/usb_stick_update/ewarm/Exe/usb_stick_update.out new file mode 100644 index 0000000..0e91253 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_update/ewarm/Exe/usb_stick_update.out differ diff --git a/boards/dk-tm4c129x/usb_stick_update/gcc/usb_stick_update.axf b/boards/dk-tm4c129x/usb_stick_update/gcc/usb_stick_update.axf new file mode 100644 index 0000000..99cb6a0 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_update/gcc/usb_stick_update.axf differ diff --git a/boards/dk-tm4c129x/usb_stick_update/gcc/usb_stick_update.bin b/boards/dk-tm4c129x/usb_stick_update/gcc/usb_stick_update.bin new file mode 100644 index 0000000..0c58747 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_update/gcc/usb_stick_update.bin differ diff --git a/boards/dk-tm4c129x/usb_stick_update/readme.txt b/boards/dk-tm4c129x/usb_stick_update/readme.txt new file mode 100644 index 0000000..8f0167b --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/readme.txt @@ -0,0 +1,49 @@ +USB Memory Stick Updater + +This example application behaves the same way as a boot loader. It resides +at the beginning of flash, and will read a binary file from a USB memory +stick and program it into another location in flash. Once the user +application has been programmed into flash, this program will always start +the user application until requested to load a new application. + +When this application starts, if there is a user application already in +flash (at \b APP_START_ADDRESS), then it will just run the user application. +It will attempt to load a new application from a USB memory stick under +the following conditions: + +- no user application is present at \b APP_START_ADDRESS +- the user application has requested an update by transferring control +to the updater +- the user holds down the eval board push button when the board is reset + +When this application is attempting to perform an update, it will wait +forever for a USB memory stick to be plugged in. Once a USB memory stick +is found, it will search the root directory for a specific file name, which +is \e FIRMWARE.BIN by default. This file must be a binary image of the +program you want to load (the .bin file), linked to run from the correct +address, at \b APP_START_ADDRESS. + +The USB memory stick must be formatted as a FAT16 or FAT32 file system +(the normal case), and the binary file must be located in the root +directory. Other files can exist on the memory stick but they will be +ignored. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/usb_stick_update/rvmdk/usb_stick_update.axf b/boards/dk-tm4c129x/usb_stick_update/rvmdk/usb_stick_update.axf new file mode 100644 index 0000000..6d3534c Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_update/rvmdk/usb_stick_update.axf differ diff --git a/boards/dk-tm4c129x/usb_stick_update/rvmdk/usb_stick_update.bin b/boards/dk-tm4c129x/usb_stick_update/rvmdk/usb_stick_update.bin new file mode 100644 index 0000000..5ad8a57 Binary files /dev/null and b/boards/dk-tm4c129x/usb_stick_update/rvmdk/usb_stick_update.bin differ diff --git a/boards/dk-tm4c129x/usb_stick_update/simple_fs.c b/boards/dk-tm4c129x/usb_stick_update/simple_fs.c new file mode 100644 index 0000000..2fdc17f --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/simple_fs.c @@ -0,0 +1,865 @@ +//***************************************************************************** +// +// simple_fs.c - Functions for simple FAT file system support +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "simple_fs.h" + +//***************************************************************************** +// +// \addtogroup simple_fs_api +// @{ +// +// This file system API should be used as follows: +// - Initialize it by calling SimpleFsInit(). You must supply a pointer to a +// 512 byte buffer that will be used for storing device sector data. +// - "Open" a file by calling SimpleFsOpen() and passing the 8.3-style filename +// as an 11-character string. +// - Read successive sectors from the file by using the convenience macro +// SimpleFsReadFileSector(). +// +// This API does not use any file handles so there is no way to open more than +// one file at a time. There is also no random access into the file, each +// sector must be read in sequence. +// +// The client of this API supplies a 512-byte buffer for storage of data read +// from the device. But this file also maintains an additional, internal +// 512-byte buffer used for caching FAT sectors. This minimizes the amount +// of device reads required to fetch cluster chain entries from the FAT. +// +// The application code (the client) must also provide a function used for +// reading sectors from the storage device, whatever it may be. This allows +// the code in this file to be independent of the type of device used for +// storing the file system. The name of the function is +// SimpleFsReadMediaSector(). +// +//***************************************************************************** + +//***************************************************************************** +// +// Setup a macro for handling packed data structures. +// +//***************************************************************************** +#if defined(ccs) || \ + defined(codered) || \ + defined(gcc) || \ + defined(rvmdk) || \ + defined(__ARMCC_VERSION) || \ + defined(sourcerygxx) +#define PACKED __attribute__((packed)) +#elif defined(ewarm) +#define PACKED +#else +#error "Unrecognized COMPILER!" +#endif + +//***************************************************************************** +// +// Instruct the IAR compiler to pack the following structures. +// +//***************************************************************************** +#ifdef ewarm +#pragma pack(1) +#endif + +//***************************************************************************** +// +// Structures for mapping FAT file system +// +//***************************************************************************** + +//***************************************************************************** +// +// The FAT16 boot sector extension +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8DriveNumber; + uint8_t ui8Reserved; + uint8_t ui8ExtSig; + uint32_t ui32Serial; + char pcVolumeLabel[11]; + char pcFsType[8]; + uint8_t ui8BootCode[448]; + uint16_t ui16Sig; +} +PACKED tBootExt16; + +//***************************************************************************** +// +// The FAT32 boot sector extension +// +//***************************************************************************** +typedef struct +{ + uint32_t ui32SectorsPerFAT; + uint16_t ui16Flags; + uint16_t ui16Version; + uint32_t ui32RootCluster; + uint16_t ui16InfoSector; + uint16_t ui16BootCopy; + uint8_t ui8Reserved[12]; + uint8_t ui8DriveNumber; + uint8_t ui8Reserved1; + uint8_t ui8ExtSig; + uint32_t ui32Serial; + char pcVolumeLabel[11]; + char pcFsType[8]; + uint8_t ui8BootCode[420]; + uint16_t ui16Sig; +} +PACKED tBootExt32; + +//***************************************************************************** +// +// The FAT16/32 boot sector main section +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8Jump[3]; + uint8_t i8OEMName[8]; + uint16_t ui16BytesPerSector; + uint8_t ui8SectorsPerCluster; + uint16_t ui16ReservedSectors; + uint8_t ui8NumFATs; + uint16_t ui16NumRootEntries; + uint16_t ui16TotalSectorsSmall; + uint8_t ui8MediaDescriptor; + uint16_t ui16SectorsPerFAT; + uint16_t ui16SectorsPerTrack; + uint16_t ui16NumberHeads; + uint32_t ui32HiddenSectors; + uint32_t ui32TotalSectorsBig; + union + { + tBootExt16 sExt16; + tBootExt32 sExt32; + } + PACKED ext; +} +PACKED tBootSector; + +//***************************************************************************** +// +// The partition table +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8Status; + uint8_t ui8CHSFirst[3]; + uint8_t ui8Type; + uint8_t ui8CHSLast[3]; + uint32_t ui32FirstSector; + uint32_t ui32NumBlocks; +} +PACKED tPartitionTable; + +//***************************************************************************** +// +// The master boot record (MBR) +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8CodeArea[440]; + uint8_t ui8DiskSignature[4]; + uint8_t ui8Nulls[2]; + tPartitionTable sPartTable[4]; + uint16_t ui16Sig; +} +PACKED tMasterBootRecord; + +//***************************************************************************** +// +// The structure for a single directory entry +// +//***************************************************************************** +typedef struct +{ + char pcFileName[11]; + uint8_t ui8Attr; + uint8_t ui8Reserved; + uint8_t ui8CreateTime[5]; + uint8_t ui8LastDate[2]; + uint16_t ui16ClusterHi; + uint8_t ui8LastModified[4]; + uint16_t ui16Cluster; + uint32_t ui32FileSize; +} +PACKED tDirEntry; + +//***************************************************************************** +// +// Tell the IAR compiler that the remaining structures do not need to be +// packed. +// +//***************************************************************************** +#ifdef ewarm +#pragma pack() +#endif + +//***************************************************************************** +// +// This structure holds information about the layout of the file system +// +//***************************************************************************** +typedef struct +{ + uint32_t ui32FirstSector; + uint32_t ui32NumBlocks; + uint16_t ui16SectorsPerCluster; + uint16_t ui16MaxRootEntries; + uint32_t ui32SectorsPerFAT; + uint32_t ui32FirstFATSector; + uint32_t ui32LastFATSector; + uint32_t ui32FirstDataSector; + uint32_t ui32Type; + uint32_t ui32StartRootDir; +} +tPartitionInfo; + +static tPartitionInfo sPartInfo; + +//***************************************************************************** +// +// A pointer to the client provided sector buffer. +// +//***************************************************************************** +static uint8_t *g_pui8SectorBuf; + +//***************************************************************************** +// +// Initializes the simple file system +// +// \param pui8SectorBuf is a pointer to a caller supplied 512-byte buffer +// that will be used for holding sectors that are loaded from the media +// storage device. +// +// Reads the MBR, partition table, and boot record to find the logical +// structure of the file system. This function stores the file system +// structural data internally so that the remaining functions of the API +// can read the file system. +// +// To read data from the storage device, the function SimpleFsReadMediaSector() +// will be called. This function is not implemented here but must be +// implemented by the user of this simple file system. +// +// This file system support is extremely simple-minded. It will only +// find the first partition of a FAT16 or FAT32 formatted mass storage +// device. Only very minimal error checking is performed in order to save +// code space. +// +// \return Zero if successful, non-zero if there was an error. +// +//***************************************************************************** +uint32_t +SimpleFsInit(uint8_t *pui8SectorBuf) +{ + tMasterBootRecord *pMBR; + tPartitionTable *pPart; + tBootSector *pBoot; + + // + // Save the sector buffer pointer. The input parameter is assumed + // to be good. + // + g_pui8SectorBuf = pui8SectorBuf; + + // + // Get the MBR + // + if(SimpleFsReadMediaSector(0, pui8SectorBuf)) + { + return(1); + } + + // + // Verify MBR signature - bare minimum validation of MBR. + // + pMBR = (tMasterBootRecord *)pui8SectorBuf; + if(pMBR->ui16Sig != 0xAA55) + { + return(1); + } + + // + // See if this is a MBR or a boot sector. + // + pBoot = (tBootSector *)pui8SectorBuf; + if((strncmp(pBoot->ext.sExt16.pcFsType, "FAT", 3) != 0) && + (strncmp(pBoot->ext.sExt32.pcFsType, "FAT32", 5) != 0)) + { + // + // Get the first partition table + // + pPart = &(pMBR->sPartTable[0]); + + // + // Could optionally check partition type here ... + // + + // + // Get the partition location and size + // + sPartInfo.ui32FirstSector = pPart->ui32FirstSector; + sPartInfo.ui32NumBlocks = pPart->ui32NumBlocks; + + // + // Read the boot sector from the partition + // + if(SimpleFsReadMediaSector(sPartInfo.ui32FirstSector, pui8SectorBuf)) + { + return(1); + } + } + else + { + // + // Extract the number of sectors from the boot sector. + // + sPartInfo.ui32FirstSector = 0; + if(pBoot->ui16TotalSectorsSmall == 0) + { + sPartInfo.ui32NumBlocks = pBoot->ui32TotalSectorsBig; + } + else + { + sPartInfo.ui32NumBlocks = pBoot->ui16TotalSectorsSmall; + } + } + + // + // Get pointer to the boot sector + // + if(pBoot->ext.sExt16.ui16Sig != 0xAA55) + { + return(1); + } + + // + // Verify the sector size is 512. We can't deal with anything else + // + if(pBoot->ui16BytesPerSector != 512) + { + return(1); + } + + // + // Extract some info from the boot record + // + sPartInfo.ui16SectorsPerCluster = pBoot->ui8SectorsPerCluster; + sPartInfo.ui16MaxRootEntries = pBoot->ui16NumRootEntries; + + // + // Decide if we are dealing with FAT16 or FAT32. + // If number of root entries is 0, that suggests FAT32 + // + if(sPartInfo.ui16MaxRootEntries == 0) + { + // + // Confirm FAT 32 signature in the expected place + // + if(!strncmp(pBoot->ext.sExt32.pcFsType, "FAT32 ", 8)) + { + sPartInfo.ui32Type = 32; + } + else + { + return(1); + } + } + // + // Root entries is non-zero, suggests FAT16 + // + else + { + // + // Confirm FAT16 signature + // + if(!strncmp(pBoot->ext.sExt16.pcFsType, "FAT16 ", 8)) + { + sPartInfo.ui32Type = 16; + } + else + { + return(1); + } + } + + // + // Find the beginning of the FAT, in absolute sectors + // + sPartInfo.ui32FirstFATSector = sPartInfo.ui32FirstSector + + pBoot->ui16ReservedSectors; + + // + // Find the end of the FAT in absolute sectors. FAT16 and 32 + // are handled differently. + // + sPartInfo.ui32SectorsPerFAT = (sPartInfo.ui32Type == 16) ? + pBoot->ui16SectorsPerFAT : + pBoot->ext.sExt32.ui32SectorsPerFAT; + sPartInfo.ui32LastFATSector = sPartInfo.ui32FirstFATSector + + sPartInfo.ui32SectorsPerFAT - 1; + + // + // Find the start of the root directory and the data area. + // For FAT16, the root will be stored as an absolute sector number + // For FAT32, the root will be stored as the starting cluster of the root + // The data area start is the absolute first sector of the data area. + // + if(sPartInfo.ui32Type == 16) + { + sPartInfo.ui32StartRootDir = sPartInfo.ui32FirstFATSector + + (sPartInfo.ui32SectorsPerFAT * + pBoot->ui8NumFATs); + sPartInfo.ui32FirstDataSector = sPartInfo.ui32StartRootDir + + (sPartInfo.ui16MaxRootEntries / 16); + } + else + { + sPartInfo.ui32StartRootDir = pBoot->ext.sExt32.ui32RootCluster; + sPartInfo.ui32FirstDataSector = sPartInfo.ui32FirstFATSector + + (sPartInfo.ui32SectorsPerFAT * pBoot->ui8NumFATs); + } + + // + // At this point the file system has been initialized, so return + // success to the caller. + // + return(0); +} + +//***************************************************************************** +// +// Find the next cluster in a FAT chain +// +// \param ui32ThisCluster is the current cluster in the chain +// +// Reads the File Allocation Table (FAT) of the file system to find the +// next cluster in a chain of clusters. The current cluster is passed in +// and the next cluster in the chain will be returned. +// +// This function reads sectors from the storage device as needed in order +// to parse the FAT tables. Error handling is minimal since there is not +// much that can be done if an error is encountered. If any error is +// encountered, or if this is the last cluster in the chain, then 0 is +// returned. This signals the caller to stop traversing the chain (either +// due to error or end of chain). +// +// The function maintains a cache of a single sector from the FAT. It only +// reads in a new FAT sector if the requested cluster is not in the +// currently cached sector. +// +// \return Next cluster number if successful, 0 if this is the last cluster +// or any error is found. +// +//***************************************************************************** +static uint32_t +SimpleFsGetNextCluster(uint_fast32_t ui32ThisCluster) +{ + static uint8_t ui8FATCache[512]; + static uint_fast32_t ui32CachedFATSector = (uint32_t)-1; + uint_fast32_t ui32ClustersPerFATSector; + uint_fast32_t ui32ClusterIdx; + uint_fast32_t ui32FATSector; + uint_fast32_t ui32NextCluster; + uint_fast32_t ui32MaxCluster; + + // + // Compute the maximum possible reasonable cluster number + // + ui32MaxCluster = sPartInfo.ui32NumBlocks / sPartInfo.ui16SectorsPerCluster; + + // + // Make sure cluster input number is reasonable. If not then return + // 0 indicating error. + // + if((ui32ThisCluster < 2) || (ui32ThisCluster > ui32MaxCluster)) + { + return(0); + } + + // + // Compute the index of the requested cluster within the sector. + // Also compute the sector number within the FAT that contains the + // entry for the requested cluster. + // + ui32ClustersPerFATSector = (sPartInfo.ui32Type == 16) ? 256 : 128; + ui32ClusterIdx = ui32ThisCluster % ui32ClustersPerFATSector; + ui32FATSector = ui32ThisCluster / ui32ClustersPerFATSector; + + // + // Check to see if the FAT sector we need is already cached + // + if(ui32FATSector != ui32CachedFATSector) + { + // + // FAT sector we need is not cached, so read it in + // + if(SimpleFsReadMediaSector(sPartInfo.ui32FirstFATSector + ui32FATSector, + ui8FATCache) != 0) + { + // + // There was an error so mark cache as unavailable and return + // an error. + // + ui32CachedFATSector = (uint32_t)-1; + return(0); + } + + // + // Remember which FAT sector was just loaded into the cache. + // + ui32CachedFATSector = ui32FATSector; + } + + // + // Now look up the next cluster value from the cached sector, using this + // requested cluster as an index. It needs to be indexed as 16 or 32 + // bit values depending on whether it is FAT16 or 32 + // If the cluster value means last cluster, then return 0 + // + if(sPartInfo.ui32Type == 16) + { + ui32NextCluster = ((uint16_t *)ui8FATCache)[ui32ClusterIdx]; + if(ui32NextCluster >= 0xFFF8) + { + return(0); + } + } + else + { + ui32NextCluster = ((uint32_t *)ui8FATCache)[ui32ClusterIdx]; + if(ui32NextCluster >= 0x0FFFFFF8) + { + return(0); + } + } + + // + // Check new cluster value to make sure it is reasonable. If not then + // return 0 to indicate an error. + // + if((ui32NextCluster >= 2) && (ui32NextCluster <= ui32MaxCluster)) + { + return(ui32NextCluster); + } + else + { + return(0); + } +} + +//***************************************************************************** +// +// Read a single sector from a file into the sector buffer +// +// \param ui32StartCluster is the first cluster of the file, used to +// initialize the file read. Use 0 for successive sectors. +// +// Reads sectors in sequence from a file and stores the data in the sector +// buffer that was passed in the initial call to SimpleFsInit(). The function +// is initialized with the file to read by passing the starting cluster of +// the file. The function will initialize some static data and return. It +// does not read any file data when passed a starting cluster (and +// returns 0 - this is normal). +// +// Once the function has been initialized with the file's starting cluster, +// then successive calls should be made, passing a value of 0 for the +// cluster number. This tells the function to read the next sector from the +// file and store it in the sector buffer. The function remembers the last +// sector that was read, and each time it is called with a cluster value of +// 0, it will read the next sector. The function will traverse the FAT +// chain as needed to read all the sectors. When a sector has been +// successfully read from a file, the function will return non-zero. When +// there are no more sectors to read, or any error is encountered, the +// function will return 0. +// +// Note that the function always reads a whole sector, even if the end of +// a file does not fill the last sector. It is the responsibility of the +// caller to track the file size and to deal with a partially full last +// sector. +// +// \return Non-zero if a sector was read into the sector buffer, or +// 0 if there are no more sectors or if any error occurred. +// +//***************************************************************************** +uint32_t +SimpleFsGetNextFileSector(uint_fast32_t ui32StartCluster) +{ + static uint_fast32_t ui32WorkingCluster = 0; + static uint_fast32_t ui32WorkingSector; + uint_fast32_t ui32ReadSector; + + // + // If user specified starting cluster, then init the working cluster + // and sector values + // + if(ui32StartCluster) + { + ui32WorkingCluster = ui32StartCluster; + ui32WorkingSector = 0; + return(0); + } + + // + // Otherwise, make sure there is a valid working cluster already + // + else if(ui32WorkingCluster == 0) + { + return(0); + } + + // + // If the current working sector is the same as sectors per cluster, + // then that means that the next cluster needs to be loaded. + // + if(ui32WorkingSector == sPartInfo.ui16SectorsPerCluster) + { + // + // Get the next cluster in the chain for this file. + // + ui32WorkingCluster = SimpleFsGetNextCluster(ui32WorkingCluster); + + // + // If the next cluster is valid, then reset the working sector + // + if(ui32WorkingCluster) + { + ui32WorkingSector = 0; + } + + // + // Next cluster is not valid, or this was the end of the chain. + // Clear the working cluster and return an indication that no new + // sector data was loaded. + // + else + { + ui32WorkingCluster = 0; + return(0); + } + } + + // + // Calculate the sector to read from. It is the sector of the start + // of the working cluster, plus the working sector (the sector within + // the cluster), plus the offset to the start of the data area. + // Note that the cluster needs to be reduced by 2 in order to index + // properly into the data area. That is a feature of FAT file system. + // + ui32ReadSector = (ui32WorkingCluster - 2) * sPartInfo.ui16SectorsPerCluster; + ui32ReadSector += ui32WorkingSector; + ui32ReadSector += sPartInfo.ui32FirstDataSector; + + // + // Attempt to read the next sector from the cluster. If not successful, + // then clear the working cluster and return a non-success indication. + // + if(SimpleFsReadMediaSector(ui32ReadSector, g_pui8SectorBuf) != 0) + { + ui32WorkingCluster = 0; + return(0); + } + else + { + // + // Read was successful. Increment to the next sector of the cluster + // and return a success indication. + // + ui32WorkingSector++; + return(1); + } +} + +//***************************************************************************** +// +// Find a file in the root directory of the file system and open it for +// reading. +// +// \param pcName83 is an 11-character string that represents the 8.3 file +// name of the file to open. +// +// This function traverses the root directory of the file system to find +// the file name specified by the caller. Note that the file name must be +// an 8.3 file name that is 11 characters int32_t. The first 8 characters are +// the base name and the last 3 characters are the extension. If there are +// fewer characters in the base name or extension, the name should be padded +// with spaces. For example "myfile.bn" has fewer than 11 characters, and +// should be passed with padding like this: "myfile bn ". Note the extra +// spaces, and that the dot ('.') is not part of the string that is passed +// to this function. +// +// If the file is found, then it initializes the file for reading, and returns +// the file length. The file can be read by making successive calls to +// SimpleFsReadFileSector(). +// +// The function only searches the root directory and ignores any +// subdirectories. It also ignores any int32_t file name entries, looking only +// at the 8.3 file name for a match. +// +// \return The size of the file if it is found, or 0 if the file could not +// be found. +// +//***************************************************************************** +uint32_t +SimpleFsOpen(char *pcName83) +{ + tDirEntry *pDirEntry; + uint_fast32_t ui32DirSector; + uint_fast32_t ui32FirstCluster; + + // + // Find starting root dir sector, only used for FAT16 + // If FAT32 then this is the first cluster of root dir + // + ui32DirSector = sPartInfo.ui32StartRootDir; + + // + // For FAT32, root dir is like a file, so init a file read of the root dir + // + if(sPartInfo.ui32Type == 32) + { + SimpleFsGetNextFileSector(ui32DirSector); + } + + // + // Search the root directory entry for the firmware file + // + while(1) + { + // + // Read in a directory block. + // + if(sPartInfo.ui32Type == 16) + { + // + // For FAT16, read in a sector of the root directory + // + if(SimpleFsReadMediaSector(ui32DirSector, g_pui8SectorBuf)) + { + return(0); + } + } + else + { + // + // For FAT32, the root directory is treated like a file. + // The root directory sector will be loaded into the sector buf + // + if(SimpleFsGetNextFileSector(0) == 0) + { + return(0); + } + } + + // + // Initialize the directory entry pointer to the first entry of + // this sector. + // + pDirEntry = (tDirEntry *)g_pui8SectorBuf; + + // + // Iterate through all the directory entries in this sector + // + while((uint8_t *)pDirEntry < &g_pui8SectorBuf[512]) + { + // + // If the 8.3 filename of this entry matches the firmware + // file name, then we have a match, so return a pointer to + // this entry. + // + if(!strncmp(pDirEntry->pcFileName, pcName83, 11)) + { + // + // Compute the starting cluster of the file + // + ui32FirstCluster = pDirEntry->ui16Cluster; + if(sPartInfo.ui32Type == 32) + { + // + // For FAT32, add in the upper word of the + // starting cluster number + // + ui32FirstCluster += pDirEntry->ui16ClusterHi << 16; + } + + // + // Initialize the start of the file + // + SimpleFsGetNextFileSector(ui32FirstCluster); + return(pDirEntry->ui32FileSize); + } + + // + // Advance to the next entry in this sector. + // + pDirEntry++; + } + + // + // Need to get the next sector in the directory. Handled + // differently depending on if this is FAT16 or 32 + // + if(sPartInfo.ui32Type == 16) + { + // + // FAT16: advance sectors as int32_t as there are more possible + // entries. + // + sPartInfo.ui16MaxRootEntries -= 512 / 32; + if(sPartInfo.ui16MaxRootEntries) + { + ui32DirSector++; + } + else + { + // + // Ran out of directory entries and didn't find the file, + // so return a null. + // + return(0); + } + } + else + { + // + // FAT32: there is nothing to compute here. The next root + // dir sector will be fetched at the top of the loop + // + } + } +} + +//***************************************************************************** +// +// Close the Doxygen group. +// @} +// +//***************************************************************************** diff --git a/boards/dk-tm4c129x/usb_stick_update/simple_fs.h b/boards/dk-tm4c129x/usb_stick_update/simple_fs.h new file mode 100644 index 0000000..86fff46 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/simple_fs.h @@ -0,0 +1,105 @@ +//***************************************************************************** +// +// simple_fs.h - Header for simple FAT file system support +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __SIMPLE_FS_H__ +#define __SIMPLE_FS_H__ + +//***************************************************************************** +// +// \addtogroup simple_fs_api +// @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Macro to read a single sector from a file that was opened with +// SimpleFsOpen() +// +// This convenience macro maps to the function SimpleFsGetNextFileSector() +// called with a parameter of 0. It should be used to read successive +// sectors from a file after the file has been opened with SimpleFsOpen(). +// +// When a sector is read, it is loaded into the sector buffer that was passed +// when SimpleFsInit() was called. +// +// A non-zero value will be returned to the caller as int32_t as successive +// sectors are successfully read into the sector buffer. At the end of the +// file, or if there is any error, then a value of 0 is returned. +// +// Note that the a whole sector is always loaded, even if the end of +// a file does not fill the last sector. It is the responsibility of the +// caller to track the file size and to deal with a partially full last +// sector. +// +// \return Non-zero if a sector was read into the sector buffer, or +// 0 if there are no more sectors or if any error occurred. +// +//***************************************************************************** +#define SimpleFsReadFileSector() SimpleFsGetNextFileSector(0) + +//***************************************************************************** +// +// Read a single sector from the application-specific storage device into +// the sector buffer. +// +// \param ui32Sector is the absolute sector number to read from the storage +// device +// \param pui8SectorBuf is a pointer to a 512 byte buffer where the sector +// data should be written +// +// This function is used by the simple file system functions to read a sector +// of data from a storage device. It must be implemented as part of the +// application specific code. For example, it could be used to read sectors +// from a USB mass storage device, or from an SD card, or any device that can +// be used to store a FAT file system. Note that the sector size is always +// assumed to be 512 bytes. +// +// \return Zero value if a sector of data was successfully read from the +// device and stored in the sector buffer, non-zero if not successful. +// +//***************************************************************************** +// +// This function to be supplied by the client +// +extern uint32_t SimpleFsReadMediaSector(uint_fast32_t ui32Sector, + uint8_t *pui8SectorBuf); + +//***************************************************************************** +// +// Close the Doxygen group. +// @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Functions to help with accessing the FAT file system on a storage device +// +//**************************************************************************** +extern uint32_t SimpleFsInit(uint8_t *pui8SectorBuf); +extern uint32_t SimpleFsOpen(char *pcName83); +extern uint32_t SimpleFsGetNextFileSector(uint_fast32_t ui32StartCluster); + +#endif // __SIMPLE_FS_H__ diff --git a/boards/dk-tm4c129x/usb_stick_update/startup_ccs.c b/boards/dk-tm4c129x/usb_stick_update/startup_ccs.c new file mode 100644 index 0000000..2ac9b8b --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void AppForceUpdate(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + AppForceUpdate, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_stick_update/startup_ewarm.c b/boards/dk-tm4c129x/usb_stick_update/startup_ewarm.c new file mode 100644 index 0000000..55e3cf3 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void AppForceUpdate(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + AppForceUpdate, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_stick_update/startup_gcc.c b/boards/dk-tm4c129x/usb_stick_update/startup_gcc.c new file mode 100644 index 0000000..6e9a465 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void AppForceUpdate(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + AppForceUpdate, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/usb_stick_update/startup_rvmdk.S b/boards/dk-tm4c129x/usb_stick_update/startup_rvmdk.S new file mode 100644 index 0000000..7d18e70 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN AppForceUpdate + EXTERN USB0HostIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD AppForceUpdate ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD USB0HostIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.c b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.c new file mode 100644 index 0000000..8281c2c --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.c @@ -0,0 +1,942 @@ +//***************************************************************************** +// +// usb_stick_update.c - Example to update flash from a USB memory stick. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_flash.h" +#include "inc/hw_gpio.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhmsc.h" +#include "simple_fs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Memory Stick Updater (usb_stick_update)

      +//! +//! This example application behaves the same way as a boot loader. It resides +//! at the beginning of flash, and will read a binary file from a USB memory +//! stick and program it into another location in flash. Once the user +//! application has been programmed into flash, this program will always start +//! the user application until requested to load a new application. +//! +//! When this application starts, if there is a user application already in +//! flash (at \b APP_START_ADDRESS), then it will just run the user application. +//! It will attempt to load a new application from a USB memory stick under +//! the following conditions: +//! +//! - no user application is present at \b APP_START_ADDRESS +//! - the user application has requested an update by transferring control +//! to the updater +//! - the user holds down the eval board push button when the board is reset +//! +//! When this application is attempting to perform an update, it will wait +//! forever for a USB memory stick to be plugged in. Once a USB memory stick +//! is found, it will search the root directory for a specific file name, which +//! is \e FIRMWARE.BIN by default. This file must be a binary image of the +//! program you want to load (the .bin file), linked to run from the correct +//! address, at \b APP_START_ADDRESS. +//! +//! The USB memory stick must be formatted as a FAT16 or FAT32 file system +//! (the normal case), and the binary file must be located in the root +//! directory. Other files can exist on the memory stick but they will be +//! ignored. +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines the number of times to call to check if the attached device is +// ready. +// +//***************************************************************************** +#define USBMSC_DRIVE_RETRY 4 + +//***************************************************************************** +// +// The name of the binary firmware file on the USB stick. This is the user +// application that will be searched for and loaded into flash if it is found. +// Note that the name of the file must be 11 characters total, 8 for the base +// name and 3 for the extension. If the actual file name has fewer characters +// then it must be padded with spaces. This macro should not contain the dot +// "." for the extension. +// +// Examples: firmware.bin --> "FIRMWAREBIN" +// myfile.bn --> "MYFILE BN " +// +//***************************************************************************** +#define USB_UPDATE_FILENAME "FIRMWAREBIN" + +//***************************************************************************** +// +// The size of the flash for this microcontroller. +// +//***************************************************************************** +#define FLASH_SIZE (1 * 1024 * 1024) + +//***************************************************************************** +// +// The starting address for the application that will be loaded into flash +// memory from the USB stick. This address must be high enough to be above +// the USB stick updater, and must be on a 1K boundary. +// Note that the application that will be loaded must also be linked to run +// from this address. +// +//***************************************************************************** +#define APP_START_ADDRESS 0x8000 + +//***************************************************************************** +// +// A memory location and value that is used to indicate that the application +// wants to force an update. +// +//***************************************************************************** +#define FORCE_UPDATE_ADDR 0x20004000 +#define FORCE_UPDATE_VALUE 0x1234cdef + +//***************************************************************************** +// +// The prototype for the function that is used to call the user application. +// +//***************************************************************************** +void CallApplication(uint_fast32_t ui32StartAddr); + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. In this application uDMA is only used for USB, +// so only the first 6 channels are needed. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_sDMAControlTable[6]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_sDMAControlTable, 1024) +tDMAControlTable g_sDMAControlTable[6]; +#else +tDMAControlTable g_sDMAControlTable[6] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the MSC class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostMSCClassDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +#define NUM_CLASS_DRIVERS (sizeof(g_ppHostClassDrivers) / \ + sizeof(g_ppHostClassDrivers[0])) + +//***************************************************************************** +// +// Hold the current state for the application. +// +//***************************************************************************** +volatile enum +{ + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Mass storage device is being enumerated. + // + STATE_DEVICE_ENUM, +} +g_eState; + +//***************************************************************************** +// +// The instance data for the MSC driver. +// +//***************************************************************************** +tUSBHMSCInstance *g_psMSCInstance = 0; + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pHCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// A buffer for holding sectors read from the storage device +// +//***************************************************************************** +static uint8_t g_ui8SectorBuf[512]; + +//***************************************************************************** +// +// Global to hold the clock rate. Set once read many. +// +//***************************************************************************** +uint32_t g_ui32SysClock; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Read a sector from the USB mass storage device. +// +// \param ui32Sector is the sector to read from the connected USB mass storage +// device (memory stick) +// \param pui8Buf is a pointer to the buffer where the sector data should be +// stored +// +// This is the application-specific implementation of a function to read +// sectors from a storage device, in this case a USB mass storage device. +// This function is called from the \e simple_fs.c file when it needs to read +// data from the storage device. +// +// \return Non-zero if data was read from the device, 0 if no data was read. +// +//***************************************************************************** +uint32_t +SimpleFsReadMediaSector(uint_fast32_t ui32Sector, uint8_t *pui8Buf) +{ + // + // Return the requested sector from the connected USB mass storage + // device. + // + return(USBHMSCBlockRead(g_psMSCInstance, ui32Sector, pui8Buf, 1)); +} + +//***************************************************************************** +// +// This is the callback from the MSC driver. +// +// \param ui32Instance is the driver instance which is needed when communicating +// with the driver. +// \param ui32Event is one of the events defined by the driver. +// \param pvData is a pointer to data passed into the initial call to register +// the callback. +// +// This function handles callback events from the MSC driver. The only events +// currently handled are the \b MSC_EVENT_OPEN and \b MSC_EVENT_CLOSE. This +// allows the main routine to know when an MSC device has been detected and +// enumerated and when an MSC device has been removed from the system. +// +// \return Returns \e true on success or \e false on failure. +// +//***************************************************************************** +static void +MSCCallback(tUSBHMSCInstance *psMSCInstance, uint32_t ui32Event, void *pvData) +{ + // + // Determine the event. + // + switch(ui32Event) + { + // + // Called when the device driver has successfully enumerated an MSC + // device. + // + case MSC_EVENT_OPEN: + { + // + // Proceed to the enumeration state. + // + g_eState = STATE_DEVICE_ENUM; + break; + } + + // + // Called when the device driver has been unloaded due to error or + // the device is no longer present. + // + case MSC_EVENT_CLOSE: + { + // + // Go back to the "no device" state and wait for a new connection. + // + g_eState = STATE_NO_DEVICE; + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// Read the application image from the file system and program it into flash. +// +// This function will attempt to open and read the firmware image file from +// the mass storage device. If the file is found it will be programmed into +// flash. The name of the file to be read is configured by the macro +// \b USB_UPDATE_FILENAME. It will be programmed into flash starting at the +// address specified by APP_START_ADDRESS. +// +// \return Zero if successful or non-zero if the file cannot be read or +// programmed. +// +//***************************************************************************** +uint32_t +ReadAppAndProgram(void) +{ + uint_fast32_t ui32FlashEnd; + uint_fast32_t ui32FileSize; + uint_fast32_t ui32DataSize; + uint_fast32_t ui32Remaining; + uint_fast32_t ui32ProgAddr; + uint_fast32_t ui32SavedRegs[2]; + volatile uint_fast32_t ui32Idx; + uint_fast32_t ui32DriveTimeout; + + // + // Initialize the drive timeout. + // + ui32DriveTimeout = USBMSC_DRIVE_RETRY; + + // + // Check to see if the mass storage device is ready. Some large drives + // take a while to be ready, so retry until they are ready. + // + while(USBHMSCDriveReady(g_psMSCInstance)) + { + // + // Wait about 500ms before attempting to check if the + // device is ready again. + // + SysCtlDelay(g_ui32SysClock/(3*2)); + + // + // Decrement the retry count. + // + ui32DriveTimeout--; + + // + // If the timeout is hit then return with a failure. + // + if(ui32DriveTimeout == 0) + { + return(1); + } + } + + // + // Initialize the file system and return if error. + // + if(SimpleFsInit(g_ui8SectorBuf)) + { + return(1); + } + + // + // Attempt to open the firmware file, retrieving the file/image size. + // A file size of error means the file was not there, or there was an + // error. + // + ui32FileSize = SimpleFsOpen(USB_UPDATE_FILENAME); + if(ui32FileSize == 0) + { + return(1); + } + + // + // Get the size of flash. This is the ending address of the flash. + // If reserved space is configured, then the ending address is reduced + // by the amount of the reserved block. + // + ui32FlashEnd = FLASH_SIZE; +#ifdef FLASH_RSVD_SPACE + ui32FlashEnd -= FLASH_RSVD_SPACE; +#endif + + // + // If flash code protection is not used, then change the ending address + // to be the ending of the application image. This will be the highest + // flash page that will be erased and so only the necessary pages will + // be erased. If flash code protection is enabled, then all of the + // application area pages will be erased. + // +#ifndef FLASH_CODE_PROTECTION + ui32FlashEnd = ui32FileSize + APP_START_ADDRESS; +#endif + + // + // Check to make sure the file size is not too large to fit in the flash. + // If it is too large, then return an error. + // + if((ui32FileSize + APP_START_ADDRESS) > ui32FlashEnd) + { + return(1); + } + + // + // Enter a loop to erase all the requested flash pages beginning at the + // application start address (above the USB stick updater). + // + for(ui32Idx = APP_START_ADDRESS; ui32Idx < ui32FlashEnd; ui32Idx += 1024) + { + ROM_FlashErase(ui32Idx); + } + + // + // Enter a loop to read sectors from the application image file and + // program into flash. Start at the user app start address (above the USB + // stick updater). + // + ui32ProgAddr = APP_START_ADDRESS; + ui32Remaining = ui32FileSize; + while(SimpleFsReadFileSector()) + { + // + // Compute how much data was read from this sector and adjust the + // remaining amount. + // + ui32DataSize = ui32Remaining >= 512 ? 512 : ui32Remaining; + ui32Remaining -= ui32DataSize; + + // + // Special handling for the first block of the application. + // This block contains as the first two location the application's + // initial stack pointer and instruction pointer. The USB updater + // relied on the values in these locations to determine if a valid + // application is present. When there is a valid application the + // updater runs the user application. Otherwise the updater attempts + // to load a new application. + // In order to prevent a partially programmed imaged (due to some + // error occurring while programming), the first two locations are + // not programmed until all of the rest of the image has been + // successfully loaded into the flash. This way if there is some error, + // the updater will detect that a user application is not present and + // will not attempt to run it. + // + // For the first block, do not program the first two word locations + // (8 bytes). These two words will be programmed later, after + // everything else. + // + if(ui32ProgAddr == APP_START_ADDRESS) + { + uint32_t *pui32Temp; + + pui32Temp = (uint32_t *)g_ui8SectorBuf; + ui32SavedRegs[0] = pui32Temp[0]; + ui32SavedRegs[1] = pui32Temp[1]; + + // + // Call the function to program a block of flash. Skip the first + // two words (8 bytes) since these contain the initial SP and PC. + // + ROM_FlashProgram((uint32_t *)&g_ui8SectorBuf[8], + ui32ProgAddr + 8, + ((ui32DataSize - 8) + 3) & ~3); + } + + // + // All other blocks except the first block + // + else + { + // + // Call the function to program a block of flash. The length of the + // block passed to the flash function must be divisible by 4. + // + ROM_FlashProgram((uint32_t *)g_ui8SectorBuf, ui32ProgAddr, + (ui32DataSize + 3) & ~3); + } + + // + // If there is more image to program, then update the programming + // address. Progress will continue to the next iteration of + // the while loop. + // + if(ui32Remaining) + { + ui32ProgAddr += ui32DataSize; + } + + // + // Otherwise we are done programming so perform final steps. + // Program the first two words of the image that were saved earlier, + // and return a success indication. + // + else + { + ROM_FlashProgram((uint32_t *)ui32SavedRegs, APP_START_ADDRESS, + 8); + + return(0); + } + } + + // + // If we make it here, that means that an attempt to read a sector of + // data from the device was not successful. That means that the complete + // user app has not been programmed into flash, so just return an error + // indication. + // + return(1); +} + +//***************************************************************************** +// +// This is the main routine for performing an update from a mass storage +// device. +// +// This function forms the main loop of the USB stick updater. It polls for +// a USB mass storage device to be connected, Once a device is connected +// it will attempt to read a firmware image from the device and load it into +// flash. +// +// \return None. +// +//***************************************************************************** +void +UpdaterUSB(void) +{ + // + // Loop forever, running the USB host driver. + // + while(1) + { + USBHCDMain(); + + // + // Check for a state change from the USB driver. + // + switch(g_eState) + { + // + // This state means that a mass storage device has been + // plugged in and enumerated. + // + case STATE_DEVICE_ENUM: + { + // + // Attempt to read the application image from the storage + // device and load it into flash memory. + // + if(ReadAppAndProgram()) + { + // + // There was some error reading or programming the app, + // so reset the state to no device which will cause a + // wait for a new device to be plugged in. + // + g_eState = STATE_NO_DEVICE; + } + else + { + // + // User app load and programming was successful, so reboot + // the micro. Perform a software reset request. This + // will cause the microcontroller to reset; no further + // code will be executed. + // + HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | + NVIC_APINT_SYSRESETREQ; + + // + // The microcontroller should have reset, so this should + // never be reached. Just in case, loop forever. + // + while(1) + { + } + } + break; + } + + // + // This state means that there is no device present, so just + // do nothing until something is plugged in. + // + case STATE_NO_DEVICE: + { + break; + } + } + } +} + +//***************************************************************************** +// +// Configure the USB controller and power the bus. +// +// This function configures the USB controller for host operation. +// It is assumed that the main system clock has been configured at this point. +// +// \return None. +// +//***************************************************************************** +void +ConfigureUSBInterface(void) +{ + // + // Enable the uDMA controller and set up the control table base. + // This is required by usblib. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + SysCtlDelay(80); + uDMAEnable(); + uDMAControlBaseSet(g_sDMAControlTable); + + // + // Enable the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Set the USB pins to be controlled by the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); + ROM_GPIOPinConfigure(GPIO_PD6_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTD_BASE, GPIO_PIN_6); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Register the host class driver + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, NUM_CLASS_DRIVERS); + + // + // Open an instance of the mass storage class driver. + // + g_psMSCInstance = USBHMSCDriveOpen(0, MSCCallback); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Force the USB mode to host with no callback on mode changes since + // there should not be any. + // + USBStackModeSet(0, eUSBModeForceHost, 0); + + // + // Wait 10ms for the pin to go low. + // + SysCtlDelay(g_ui32SysClock/100); + + // + // Initialize the host controller. + // + USBHCDInit(0, g_pHCDPool, HCD_MEMORY_SIZE); +} + +//***************************************************************************** +// +// Generic configuration is handled in this function. +// +// This function is called by the start up code to perform any configuration +// necessary before calling the update routine. It is responsible for setting +// the system clock to the expected rate and setting flash programming +// parameters prior to calling ConfigureUSBInterface() to set up the USB +// hardware. +// +// \return None. +// +//***************************************************************************** +void +UpdaterMain(void) +{ + // + // Make sure NVIC points at the correct vector table. + // + HWREG(NVIC_VTABLE) = 0; + + // + // Run from the PLL at 120 MHz. + // + g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Configure the USB interface and power the bus. + // + ConfigureUSBInterface(); + + // + // Call the updater function. This will attempt to load a new image + // into flash from a USB memory stick. + // + UpdaterUSB(); +} + +//***************************************************************************** +// +// Main entry point for the USB stick update example. +// +// This function will check to see if a flash update should be performed from +// the USB memory stick, or if the user application should just be run without +// any update. +// +// The following checks are made, any of which mean that an update should be +// performed: +// - the PC and SP for the user app do not appear to be valid +// - a memory location contains a certain value, meaning the user app wants +// to force an update +// - the user button on the eval board is being pressed, meaning the user wants +// to force an update even if there is a valid user app in memory +// +// If any of the above checks are true, then that means that an update should +// be attempted. The USB stick updater will then wait for a USB stick to be +// plugged in, and once it is look for a firmware update file. +// +// If none of the above checks are true, then the user application that is +// already in flash is run and no update is performed. +// +// \return None. +// +//***************************************************************************** +int +main(void) +{ + uint32_t *pui32App; + + // + // See if the first location is 0xfffffffff or something that does not + // look like a stack pointer, or if the second location is 0xffffffff or + // something that does not look like a reset vector. + // + pui32App = (uint32_t *)APP_START_ADDRESS; + if((pui32App[0] == 0xffffffff) || + ((pui32App[0] & 0xfff00000) != 0x20000000) || + (pui32App[1] == 0xffffffff) || + ((pui32App[1] & 0xfff00001) != 0x00000001)) + { + // + // App starting stack pointer or PC is not valid, so force an update. + // + UpdaterMain(); + } + + // + // Check to see if the application has requested an update + // + if(HWREG(FORCE_UPDATE_ADDR) == FORCE_UPDATE_VALUE) + { + HWREG(FORCE_UPDATE_ADDR) = 0; + UpdaterMain(); + } + + // + // Enable the GPIO input for the SEL button. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP); + ROM_GPIODirModeSet(GPIO_PORTP_BASE, GPIO_PIN_1, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(GPIO_PORTP_BASE, GPIO_PIN_1, GPIO_STRENGTH_2MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Check if the button is pressed, if so then force an update. + // + if(ROM_GPIOPinRead(GPIO_PORTP_BASE, GPIO_PIN_1) == 0) + { + UpdaterMain(); + } + + // + // If we get to here that means that none of the conditions that should + // cause an update are true. Therefore, call the application. + // + CallApplication(APP_START_ADDRESS); +} + +//***************************************************************************** +// +// This function is called from the application to request an update. The +// address of this function is stored in the SVC vector at offset 0x2C, so +// the user application can call it by using a statement like this: +// +// (*((void (*)(void))(*(uint32_t *)0x2c)))(); +// +//***************************************************************************** +void +AppForceUpdate(void) +{ + // + // Set a value in a memory location to indicate that the app requests + // an update. Then cause the processor to reset. + // + HWREG(FORCE_UPDATE_ADDR) = FORCE_UPDATE_VALUE; + HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ; +} + +//***************************************************************************** +// +// This function is used to call the user application. It will set the NVIC +// to point at the user app's vector table, load up the user app's stack +// pointer, and then jump to the application. +// +// This function must be programmed in assembly since it needs to directly +// manipulate the value in the stack pointer, and because it needs to perform +// a direct branch to the user app and not a function call (bl). +// +//***************************************************************************** +#if defined(codered) || defined(gcc) || defined(sourcerygxx) +void __attribute__((naked)) +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table to the beginning of the app in flash. + // + HWREG(NVIC_VTABLE) = ui32StartAddr; + + // + // Load the stack pointer from the application's vector table. + // + __asm(" ldr r1, [r0]\n" + " mov sp, r1"); + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + __asm(" ldr r0, [r0, #4]\n" + " bx r0\n"); +} +#elif defined(ewarm) +void +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table to the beginning of the app in flash. + // + HWREG(NVIC_VTABLE) = ui32StartAddr; + + // + // Load the stack pointer from the application's vector table. + // + __asm(" ldr r1, [r0]\n" + " mov sp, r1"); + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + __asm(" ldr r0, [r0, #4]\n" + " bx r0\n"); +} +#elif defined(rvmdk) || defined(__ARMCC_VERSION) +__asm void +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table address to the beginning of the application. + // + ldr r1, =0xe000ed08 + str r0, [r1] + + // + // Load the stack pointer from the application's vector table. + // + ldr r1, [r0] + mov sp, r1 + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + ldr r0, [r0, #4] + bx r0 +} +#elif defined(ccs) +void +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table to the beginning of the app in flash. + // + HWREG(NVIC_VTABLE) = ui32StartAddr; + + // + // Load the stack pointer from the application's vector table. + // + __asm(" ldr r1, [r0]\n" + " mov sp, r1\n"); + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + __asm(" ldr r0, [r0, #4]\n" + " bx r0\n"); +} +#else +#error Undefined compiler! +#endif + diff --git a/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ewd b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ewp b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ewp new file mode 100644 index 0000000..b835ac4 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\simple_fs.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_stick_update.c + + + diff --git a/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.icf b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.icf new file mode 100644 index 0000000..c269e21 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_stick_update.icf - Linker configuration file for usb_stick_update. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ld b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ld new file mode 100644 index 0000000..1d0be8a --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_stick_update.ld - Linker configuration file for usb_stick_update. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.sct b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.sct new file mode 100644 index 0000000..29b9fe6 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_stick_update.sct - Linker configuration file for usb_stick_update. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.uvopt b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.uvopt new file mode 100644 index 0000000..6508277 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_stick_update + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\simple_fs.c + simple_fs.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_stick_update.c + usb_stick_update.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.uvproj b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.uvproj new file mode 100644 index 0000000..e4ef4a1 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_stick_update + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_stick_update + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_stick_update.bin .\rvmdk\usb_stick_update.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_stick_update.sct + + + --entry Reset_Handler + + + + + + + + Source + + + simple_fs.c + 1 + .\simple_fs.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_stick_update.c + 1 + .\usb_stick_update.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/usb_stick_update/usb_stick_update_ccs.cmd b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update_ccs.cmd new file mode 100644 index 0000000..3198798 --- /dev/null +++ b/boards/dk-tm4c129x/usb_stick_update/usb_stick_update_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_stick_update_ccs.cmd - CCS linker configuration file for usb_stick_update. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/dk-tm4c129x/watchdog/Makefile b/boards/dk-tm4c129x/watchdog/Makefile new file mode 100644 index 0000000..c4959a8 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the watchdog example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the watchdog example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/watchdog.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the watchdog example. +# +${COMPILER}/watchdog.axf: ${COMPILER}/frame.o +${COMPILER}/watchdog.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/watchdog.axf: ${COMPILER}/pinout.o +${COMPILER}/watchdog.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/watchdog.axf: ${COMPILER}/touch.o +${COMPILER}/watchdog.axf: ${COMPILER}/ustdlib.o +${COMPILER}/watchdog.axf: ${COMPILER}/watchdog.o +${COMPILER}/watchdog.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/watchdog.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/watchdog.axf: watchdog.ld +SCATTERgcc_watchdog=watchdog.ld +ENTRY_watchdog=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/watchdog/ccs/.ccsimportspec b/boards/dk-tm4c129x/watchdog/ccs/.ccsimportspec new file mode 100644 index 0000000..6379126 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/dk-tm4c129x/watchdog/ccs/.ccsproject b/boards/dk-tm4c129x/watchdog/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/watchdog/ccs/.cproject b/boards/dk-tm4c129x/watchdog/ccs/.cproject new file mode 100644 index 0000000..200a16f --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/ccs/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/watchdog/ccs/.project b/boards/dk-tm4c129x/watchdog/ccs/.project new file mode 100644 index 0000000..2ae56c7 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/ccs/.project @@ -0,0 +1,75 @@ + + + watchdog + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/watchdog/startup_ccs.c + + + watchdog.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/watchdog/watchdog.c + + + watchdog_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/watchdog/watchdog_ccs.cmd + + + drivers/frame.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/frame.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + drivers/touch.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/touch.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/watchdog/ccs/Debug/watchdog.bin b/boards/dk-tm4c129x/watchdog/ccs/Debug/watchdog.bin new file mode 100644 index 0000000..f8ec1b7 Binary files /dev/null and b/boards/dk-tm4c129x/watchdog/ccs/Debug/watchdog.bin differ diff --git a/boards/dk-tm4c129x/watchdog/ccs/Debug/watchdog.out b/boards/dk-tm4c129x/watchdog/ccs/Debug/watchdog.out new file mode 100644 index 0000000..ffc87e3 Binary files /dev/null and b/boards/dk-tm4c129x/watchdog/ccs/Debug/watchdog.out differ diff --git a/boards/dk-tm4c129x/watchdog/ccs/macros.ini_initial b/boards/dk-tm4c129x/watchdog/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/watchdog/ccs/target_config.ccxml b/boards/dk-tm4c129x/watchdog/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/watchdog/ewarm/Exe/watchdog.bin b/boards/dk-tm4c129x/watchdog/ewarm/Exe/watchdog.bin new file mode 100644 index 0000000..dd7d4ca Binary files /dev/null and b/boards/dk-tm4c129x/watchdog/ewarm/Exe/watchdog.bin differ diff --git a/boards/dk-tm4c129x/watchdog/ewarm/Exe/watchdog.out b/boards/dk-tm4c129x/watchdog/ewarm/Exe/watchdog.out new file mode 100644 index 0000000..31afaae Binary files /dev/null and b/boards/dk-tm4c129x/watchdog/ewarm/Exe/watchdog.out differ diff --git a/boards/dk-tm4c129x/watchdog/gcc/watchdog.axf b/boards/dk-tm4c129x/watchdog/gcc/watchdog.axf new file mode 100644 index 0000000..a36eb46 Binary files /dev/null and b/boards/dk-tm4c129x/watchdog/gcc/watchdog.axf differ diff --git a/boards/dk-tm4c129x/watchdog/gcc/watchdog.bin b/boards/dk-tm4c129x/watchdog/gcc/watchdog.bin new file mode 100644 index 0000000..c2b91fb Binary files /dev/null and b/boards/dk-tm4c129x/watchdog/gcc/watchdog.bin differ diff --git a/boards/dk-tm4c129x/watchdog/readme.txt b/boards/dk-tm4c129x/watchdog/readme.txt new file mode 100644 index 0000000..d5e98c8 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/readme.txt @@ -0,0 +1,33 @@ +Watchdog + +This example application demonstrates the use of the watchdog as a simple +heartbeat for the system. If a watchdog is not periodically fed, it will +reset the system. The GREEN LED will blink once every second to show +every time watchdog 0 is being fed, the Amber LED will blink once every +second to indicate watchdog 1 is being fed. To stop the watchdog being fed +and, hence, cause a system reset, tap the left screen to starve the +watchdog 0, and right screen to starve the watchdog 1. + +The counters on the screen show the number of interrupts that each watchdog +served; the count wraps at 255. Since the two watchdogs run in different +clock domains, the counters will get out of sync over time. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. diff --git a/boards/dk-tm4c129x/watchdog/rvmdk/watchdog.axf b/boards/dk-tm4c129x/watchdog/rvmdk/watchdog.axf new file mode 100644 index 0000000..f83a617 Binary files /dev/null and b/boards/dk-tm4c129x/watchdog/rvmdk/watchdog.axf differ diff --git a/boards/dk-tm4c129x/watchdog/rvmdk/watchdog.bin b/boards/dk-tm4c129x/watchdog/rvmdk/watchdog.bin new file mode 100644 index 0000000..954a188 Binary files /dev/null and b/boards/dk-tm4c129x/watchdog/rvmdk/watchdog.bin differ diff --git a/boards/dk-tm4c129x/watchdog/startup_ccs.c b/boards/dk-tm4c129x/watchdog/startup_ccs.c new file mode 100644 index 0000000..c9a4c47 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/startup_ccs.c @@ -0,0 +1,276 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void WatchdogIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + WatchdogIntHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/watchdog/startup_ewarm.c b/boards/dk-tm4c129x/watchdog/startup_ewarm.c new file mode 100644 index 0000000..fc6102e --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/startup_ewarm.c @@ -0,0 +1,307 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void WatchdogIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + WatchdogIntHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/watchdog/startup_gcc.c b/boards/dk-tm4c129x/watchdog/startup_gcc.c new file mode 100644 index 0000000..50defe3 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/startup_gcc.c @@ -0,0 +1,323 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void TouchScreenIntHandler(void); +extern void WatchdogIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + TouchScreenIntHandler, // ADC Sequence 3 + WatchdogIntHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + IntDefaultHandler, // External Bus Interface 0 + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + 0, // Reserved + IntDefaultHandler, // Tamper + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // SHA/MD5 0 + IntDefaultHandler, // AES 0 + IntDefaultHandler, // DES3DES 0 + IntDefaultHandler, // LCD Controller 0 + IntDefaultHandler, // Timer 6 subtimer A + IntDefaultHandler, // Timer 6 subtimer B + IntDefaultHandler, // Timer 7 subtimer A + IntDefaultHandler, // Timer 7 subtimer B + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // I2C8 Master and Slave + IntDefaultHandler, // I2C9 Master and Slave + IntDefaultHandler // GPIO Port T +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/watchdog/startup_rvmdk.S b/boards/dk-tm4c129x/watchdog/startup_rvmdk.S new file mode 100644 index 0000000..51816fb --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/startup_rvmdk.S @@ -0,0 +1,332 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN TouchScreenIntHandler + EXTERN WatchdogIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD TouchScreenIntHandler ; ADC Sequence 3 + DCD WatchdogIntHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD IntDefaultHandler ; External Bus Interface 0 + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD 0 ; Reserved + DCD IntDefaultHandler ; Tamper + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; SHA/MD5 0 + DCD IntDefaultHandler ; AES 0 + DCD IntDefaultHandler ; DES3DES 0 + DCD IntDefaultHandler ; LCD Controller 0 + DCD IntDefaultHandler ; Timer 6 subtimer A + DCD IntDefaultHandler ; Timer 6 subtimer B + DCD IntDefaultHandler ; Timer 7 subtimer A + DCD IntDefaultHandler ; Timer 7 subtimer B + DCD IntDefaultHandler ; I2C6 Master and Slave + DCD IntDefaultHandler ; I2C7 Master and Slave + DCD IntDefaultHandler ; HIM Scan Matrix Keyboard 0 + DCD IntDefaultHandler ; One Wire 0 + DCD IntDefaultHandler ; HIM PS/2 0 + DCD IntDefaultHandler ; HIM LED Sequencer 0 + DCD IntDefaultHandler ; HIM Consumer IR 0 + DCD IntDefaultHandler ; I2C8 Master and Slave + DCD IntDefaultHandler ; I2C9 Master and Slave + DCD IntDefaultHandler ; GPIO Port T + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/dk-tm4c129x/watchdog/watchdog.c b/boards/dk-tm4c129x/watchdog/watchdog.c new file mode 100644 index 0000000..6743375 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/watchdog.c @@ -0,0 +1,356 @@ +//***************************************************************************** +// +// watchdog.c - Watchdog timer example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/watchdog.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "drivers/frame.h" +#include "drivers/kentec320x240x16_ssd2119.h" +#include "drivers/pinout.h" +#include "drivers/touch.h" +#include "utils/ustdlib.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Watchdog (watchdog)

      +//! +//! This example application demonstrates the use of the watchdog as a simple +//! heartbeat for the system. If a watchdog is not periodically fed, it will +//! reset the system. The GREEN LED will blink once every second to show +//! every time watchdog 0 is being fed, the Amber LED will blink once every +//! second to indicate watchdog 1 is being fed. To stop the watchdog being fed +//! and, hence, cause a system reset, tap the left screen to starve the +//! watchdog 0, and right screen to starve the watchdog 1. +//! +//! The counters on the screen show the number of interrupts that each watchdog +//! served; the count wraps at 255. Since the two watchdogs run in different +//! clock domains, the counters will get out of sync over time. +// +//***************************************************************************** + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Flag to tell the watchdog interrupt handler whether or not to clear the +// interrupt (feed the watchdog). +// +//***************************************************************************** +volatile bool g_bFeedWatchdog0 = true; +volatile bool g_bFeedWatchdog1 = true; + +//***************************************************************************** +// +// counter of the watchdog interrupt being served. +// +//***************************************************************************** +volatile uint8_t g_ui8CounterWatchdog0 = 0; +volatile uint8_t g_ui8CounterWatchdog1 = 0; + +//***************************************************************************** +// +// LED pin definations. We use GREEN LED and AMBER LED +// +//***************************************************************************** +#define LED_GREEN_GPIO_PORTBASE GPIO_PORTQ_BASE +#define LED_GREEN_GPIO_PIN GPIO_PIN_7 +#define LED_AMBER_GPIO_PORTBASE GPIO_PORTF_BASE +#define LED_AMBER_GPIO_PIN GPIO_PIN_1 + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the watchdog. This feeds the dog (so that the +// processor does not get reset) and winks the corresponding LED. +// +//***************************************************************************** +void +WatchdogIntHandler(void) +{ + char pcBuf[8]; + + // + // See if watchdog 0 generated an interrupt. + // + if(ROM_WatchdogIntStatus(WATCHDOG0_BASE, true)) + { + // + // If we have been told to stop feeding the watchdog, return immediately + // without clearing the interrupt. This will cause the system to reset + // next time the watchdog interrupt fires. + // + if(g_bFeedWatchdog0) + { + // + // Clear the watchdog interrupt. + // + ROM_WatchdogIntClear(WATCHDOG0_BASE); + + // + // Increment the counter and display it on the screen. + // + g_ui8CounterWatchdog0++; + GrContextFontSet(&g_sContext, g_psFontCmss20); + usprintf(pcBuf, " %03d ", g_ui8CounterWatchdog0); + GrStringDrawCentered(&g_sContext, pcBuf, -1, 80, 100, 1); + + // + // Invert the GREEN LED value. + // + ROM_GPIOPinWrite(LED_GREEN_GPIO_PORTBASE, LED_GREEN_GPIO_PIN, + (ROM_GPIOPinRead(LED_GREEN_GPIO_PORTBASE, + LED_GREEN_GPIO_PIN) ^ + LED_GREEN_GPIO_PIN)); + } + } + + // + // See if watchdog 1 generated an interrupt. + // + if(ROM_WatchdogIntStatus(WATCHDOG1_BASE, true)) + { + // + // If we have been told to stop feeding the watchdog, return immediately + // without clearing the interrupt. This will cause the system to reset + // next time the watchdog interrupt fires. + // + if(g_bFeedWatchdog1) + { + // + // Clear the watchdog interrupt. + // + ROM_WatchdogIntClear(WATCHDOG1_BASE); + + // + // Increment the counter and display it on the screen. + // + g_ui8CounterWatchdog1++; + GrContextFontSet(&g_sContext, g_psFontCmss20); + usprintf(pcBuf, " %03d ", g_ui8CounterWatchdog1); + GrStringDrawCentered(&g_sContext, pcBuf, -1, 240, 100, 1); + + // + // Invert the AMBER LED value. + // + ROM_GPIOPinWrite(LED_AMBER_GPIO_PORTBASE, LED_AMBER_GPIO_PIN, + (ROM_GPIOPinRead(LED_AMBER_GPIO_PORTBASE, + LED_AMBER_GPIO_PIN) ^ + LED_AMBER_GPIO_PIN)); + } + } +} + +//***************************************************************************** +// +// The touch screen driver calls this function to report all state changes. +// +//***************************************************************************** +static int32_t +WatchdogTouchCallback(uint32_t ui32Message, int32_t i32X, int32_t i32Y) +{ + // + // If the screen is tapped, we will receive a PTR_DOWN then a PTR_UP + // message. Use PTR_UP as the trigger to stop feeding the watchdog. + // + if(ui32Message == WIDGET_MSG_PTR_UP) + { + // + // See if the left or right side of the screen was touched. + // + if(i32X <= (GrContextDpyWidthGet(&g_sContext) / 2)) + { + // + // Let the user know that the tap has been registered and that the + // watchdog0 is being starved. + // + GrContextFontSet(&g_sContext, g_psFontCmss20); + GrContextForegroundSet(&g_sContext, ClrRed); + GrStringDrawCentered(&g_sContext, + "Watchdog 0 starved, reset shortly", -1, + GrContextDpyWidthGet(&g_sContext) / 2 , + (GrContextDpyHeightGet(&g_sContext) / 2) + 40, + 1); + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Set the flag that tells the interrupt handler not to clear the + // watchdog0 interrupt. + // + g_bFeedWatchdog0 = false; + } + else + { + // + // Let the user know that the tap has been registered and that the + // watchdog1 is being starved. + // + GrContextFontSet(&g_sContext, g_psFontCmss20); + GrContextForegroundSet(&g_sContext, ClrRed); + GrStringDrawCentered(&g_sContext, + "Watchdog 1 starved, reset shortly", -1, + GrContextDpyWidthGet(&g_sContext) / 2 , + (GrContextDpyHeightGet(&g_sContext) / 2) + 60, + 1); + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Set the flag that tells the interrupt handler not to clear the + // watchdog1 interrupt. + // + g_bFeedWatchdog1 = false; + } + } + + return(0); +} + +//***************************************************************************** +// +// This example demonstrates the use of both watchdog timers. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32SysClock; + + // + // Run from the PLL at 120 MHz. + // + ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + // + // Configure the device pins. + // + PinoutSet(); + + // + // Initialize the display driver. + // + Kentec320x240x16_SSD2119Init(ui32SysClock); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sKentec320x240x16_SSD2119); + + // + // Draw the application frame. + // + FrameDraw(&g_sContext, "watchdog"); + + // + // Initialize the touch screen driver. + // + TouchScreenInit(ui32SysClock); + TouchScreenCallbackSet(WatchdogTouchCallback); + + // + // Reconfigure PF1 as a GPIO output so that it can be directly driven + // (instead of being an Ethernet LED). + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1); + ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0); + + // + // Show the state and offer some instructions to the user. + // + GrContextFontSet(&g_sContext, g_psFontCmss20); + GrStringDrawCentered(&g_sContext, "Watchdog 0:", -1, 80, 80, 0); + GrStringDrawCentered(&g_sContext, "Watchdog 1:", -1, 240, 80, 0); + GrContextFontSet(&g_sContext, g_psFontCmss14); + GrStringDrawCentered(&g_sContext, + "Tap the left screen to starve the watchdog 0", + -1, GrContextDpyWidthGet(&g_sContext) / 2 , + (GrContextDpyHeightGet(&g_sContext) / 2) + 40, 1); + GrStringDrawCentered(&g_sContext, + "Tap the right screen to starve the watchdog 1", + -1, GrContextDpyWidthGet(&g_sContext) / 2 , + (GrContextDpyHeightGet(&g_sContext) / 2) + 60, 1); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_WDOG0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_WDOG1); + + // + // Enable the watchdog interrupt. + // + ROM_IntEnable(INT_WATCHDOG); + + // + // Set the period of the watchdog timer. + // + ROM_WatchdogReloadSet(WATCHDOG0_BASE, ui32SysClock); + ROM_WatchdogReloadSet(WATCHDOG1_BASE, 16000000); + + // + // Enable reset generation from the watchdog timer. + // + ROM_WatchdogResetEnable(WATCHDOG0_BASE); + ROM_WatchdogResetEnable(WATCHDOG1_BASE); + + // + // Enable the watchdog timer. + // + ROM_WatchdogEnable(WATCHDOG0_BASE); + ROM_WatchdogEnable(WATCHDOG1_BASE); + + // + // Loop forever while the LED winks as watchdog interrupts are handled. + // + while(1) + { + } +} diff --git a/boards/dk-tm4c129x/watchdog/watchdog.ewd b/boards/dk-tm4c129x/watchdog/watchdog.ewd new file mode 100644 index 0000000..484e41a --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/watchdog.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/dk-tm4c129x/watchdog/watchdog.ewp b/boards/dk-tm4c129x/watchdog/watchdog.ewp new file mode 100644 index 0000000..6b6a6ca --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/watchdog.ewp @@ -0,0 +1,804 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\frame.c + + + $PROJ_DIR$\..\drivers\kentec320x240x16_ssd2119.c + + + $PROJ_DIR$\..\drivers\pinout.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\touch.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + $PROJ_DIR$\watchdog.c + + + diff --git a/boards/dk-tm4c129x/watchdog/watchdog.icf b/boards/dk-tm4c129x/watchdog/watchdog.icf new file mode 100644 index 0000000..e2d2e8f --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/watchdog.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// watchdog.icf - Linker configuration file for watchdog. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x000fffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2003ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/dk-tm4c129x/watchdog/watchdog.ld b/boards/dk-tm4c129x/watchdog/watchdog.ld new file mode 100644 index 0000000..5d9c836 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/watchdog.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * watchdog.ld - Linker configuration file for watchdog. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/dk-tm4c129x/watchdog/watchdog.sct b/boards/dk-tm4c129x/watchdog/watchdog.sct new file mode 100644 index 0000000..1b76adf --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/watchdog.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; watchdog.sct - Linker configuration file for watchdog. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00100000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00100000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00040000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/dk-tm4c129x/watchdog/watchdog.uvopt b/boards/dk-tm4c129x/watchdog/watchdog.uvopt new file mode 100644 index 0000000..d1bb0fc --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/watchdog.uvopt @@ -0,0 +1,373 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + watchdog + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C129XNCZAD.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S1 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\frame.c + frame.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\kentec320x240x16_ssd2119.c + kentec320x240x16_ssd2119.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\pinout.c + pinout.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\touch.c + touch.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\watchdog.c + watchdog.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 10 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/dk-tm4c129x/watchdog/watchdog.uvproj b/boards/dk-tm4c129x/watchdog/watchdog.uvproj new file mode 100644 index 0000000..a7f4a11 --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/watchdog.uvproj @@ -0,0 +1,454 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + watchdog + 0x4 + ARM-ADS + + + TM4C129XNCZAD + Texas Instruments + IRAM(0x20000000-0x2003FFFF) IROM(0-0xFFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_1024 -FS00 -FL0100000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + watchdog + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\watchdog.bin .\rvmdk\watchdog.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C129XNCZAD TARGET_IS_TM4C129_RA0 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + watchdog.sct + + + --entry Reset_Handler + + + + + + + + Source + + + frame.c + 1 + ..\drivers\frame.c + + + kentec320x240x16_ssd2119.c + 1 + ..\drivers\kentec320x240x16_ssd2119.c + + + pinout.c + 1 + ..\drivers\pinout.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + touch.c + 1 + ..\drivers\touch.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + watchdog.c + 1 + .\watchdog.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/dk-tm4c129x/watchdog/watchdog_ccs.cmd b/boards/dk-tm4c129x/watchdog/watchdog_ccs.cmd new file mode 100644 index 0000000..dd1e3df --- /dev/null +++ b/boards/dk-tm4c129x/watchdog/watchdog_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * watchdog_ccs.cmd - CCS linker configuration file for watchdog. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00100000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00040000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-lm4f232/Makefile b/boards/ek-lm4f232/Makefile new file mode 100644 index 0000000..f4da8b4 --- /dev/null +++ b/boards/ek-lm4f232/Makefile @@ -0,0 +1,74 @@ +#****************************************************************************** +# +# Makefile - Rules for building the ek-lm4f232 examples. +# +# Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# A list of the directories containing the examples. +# +DIRS=bitband \ + blinky \ + boot_demo1 \ + boot_demo2 \ + boot_serial \ + boot_usb \ + hello \ + hibernate \ + interrupts \ + mpu_fault \ + qs-logger \ + sd_card \ + sine_demo \ + softuart_echo \ + timers \ + uart_echo \ + udma_demo \ + usb_dev_bulk \ + usb_dev_keyboard \ + usb_dev_msc \ + usb_dev_serial \ + usb_host_audio \ + usb_host_msc \ + usb_host_keyboard \ + usb_host_mouse \ + usb_stick_demo \ + usb_stick_update \ + watchdog + +# +# The default rule, which causes the examples to be built. +# +all: + @for i in ${DIRS}; \ + do \ + make -C $${i} || exit $$?; \ + done + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${wildcard *~} __dummy__ + @-for i in ${DIRS}; \ + do \ + make -C $${i} clean; \ + done diff --git a/boards/ek-lm4f232/bitband/Makefile b/boards/ek-lm4f232/bitband/Makefile new file mode 100644 index 0000000..d520026 --- /dev/null +++ b/boards/ek-lm4f232/bitband/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the bitband example. +# +# Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the bitband example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/bitband.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the bitband example. +# +${COMPILER}/bitband.axf: ${COMPILER}/bitband.o +${COMPILER}/bitband.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/bitband.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/bitband.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/bitband.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/bitband.axf: bitband.ld +SCATTERgcc_bitband=bitband.ld +ENTRY_bitband=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/bitband/bitband.c b/boards/ek-lm4f232/bitband/bitband.c new file mode 100644 index 0000000..f550ba0 --- /dev/null +++ b/boards/ek-lm4f232/bitband/bitband.c @@ -0,0 +1,292 @@ +//***************************************************************************** +// +// bitband.c - Bit-band manipulation example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/fpu.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Bit-Banding (bitband)

      +//! +//! This example application demonstrates the use of the bit-banding +//! capabilities of the Cortex-M3 microprocessor. All of SRAM and all of the +//! peripherals reside within bit-band regions, meaning that bit-banding +//! operations can be applied to any of them. In this example, a variable in +//! SRAM is set to a particular value one bit at a time using bit-banding +//! operations (it would be more efficient to do a single non-bit-banded write; +//! this simply demonstrates the operation of bit-banding). +// +//***************************************************************************** + +//***************************************************************************** +// +// A map of hex nibbles to ASCII characters. +// +//***************************************************************************** +static const char * const pcHex = "0123456789ABCDEF"; + +//***************************************************************************** +// +// The value that is to be modified via bit-banding. +// +//***************************************************************************** +static volatile uint32_t g_ui32Value; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Delay for the specified number of seconds. Depending upon the current +// SysTick value, the delay will be between N-1 and N seconds (i.e. N-1 full +// seconds are guaranteed, aint32_t with the remainder of the current second). +// +//***************************************************************************** +void +Delay(uint32_t ui32Seconds) +{ + // + // Loop while there are more seconds to wait. + // + while(ui32Seconds--) + { + // + // Wait until the SysTick value is less than 1000. + // + while(ROM_SysTickValueGet() > 1000) + { + } + + // + // Wait until the SysTick value is greater than 1000. + // + while(ROM_SysTickValueGet() < 1000) + { + } + } +} + +//***************************************************************************** +// +// Print the given value as a hexadecimal string on the CSTN. +// +//***************************************************************************** +void +PrintValue(uint32_t ui32Value) +{ + char pcBuffer[9]; + + pcBuffer[0] = pcHex[(ui32Value >> 28) & 15]; + pcBuffer[1] = pcHex[(ui32Value >> 24) & 15]; + pcBuffer[2] = pcHex[(ui32Value >> 20) & 15]; + pcBuffer[3] = pcHex[(ui32Value >> 16) & 15]; + pcBuffer[4] = pcHex[(ui32Value >> 12) & 15]; + pcBuffer[5] = pcHex[(ui32Value >> 8) & 15]; + pcBuffer[6] = pcHex[(ui32Value >> 4) & 15]; + pcBuffer[7] = pcHex[(ui32Value >> 0) & 15]; + pcBuffer[8] = '\0'; + + GrStringDrawCentered(&g_sContext, pcBuffer, -1, + GrContextDpyWidthGet(&g_sContext) / 2, 28, 1); +} + +//***************************************************************************** +// +// This example demonstrates the use of bit-banding to set individual bits +// within a word of SRAM. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + uint32_t ui32Errors, ui32Idx; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "bitband", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Set up and enable the SysTick timer. It will be used as a reference + // for delay loops. The SysTick timer period will be set up for one + // second. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet()); + ROM_SysTickEnable(); + + // + // Set the value and error count to zero. + // + g_ui32Value = 0; + ui32Errors = 0; + + // + // Print the initial value to the CSTN. + // + PrintValue(g_ui32Value); + + // + // Delay for 1 second. + // + Delay(1); + + // + // Set the value to 0xdecafbad using bit band accesses to each individual + // bit. + // + for(ui32Idx = 0; ui32Idx < 32; ui32Idx++) + { + // + // Set this bit. + // + HWREGBITW(&g_ui32Value, 31 - ui32Idx) = + (0xdecafbad >> (31 - ui32Idx)) & 1; + + // + // Print the current value to the CSTN. + // + PrintValue(g_ui32Value); + + // + // Delay for 1 second. + // + Delay(1); + } + + // + // Make sure that the value is 0xdecafbad. + // + if(g_ui32Value != 0xdecafbad) + { + ui32Errors++; + } + + // + // Make sure that the individual bits read back correctly. + // + for(ui32Idx = 0; ui32Idx < 32; ui32Idx++) + { + if(HWREGBITW(&g_ui32Value, ui32Idx) != ((0xdecafbad >> ui32Idx) & 1)) + { + ui32Errors++; + } + } + + // + // Delay for 2 seconds. + // + Delay(2); + + // + // Print out the result. + // + if(ui32Errors) + { + GrStringDrawCentered(&g_sContext, "Errors!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 48, 0); + } + else + { + GrStringDrawCentered(&g_sContext, "Success!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 48, 0); + } + + // + // Flush any cached drawing operations. + // + GrFlush(&g_sContext); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/bitband/bitband.ewd b/boards/ek-lm4f232/bitband/bitband.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/bitband/bitband.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/bitband/bitband.ewp b/boards/ek-lm4f232/bitband/bitband.ewp new file mode 100644 index 0000000..507ca0a --- /dev/null +++ b/boards/ek-lm4f232/bitband/bitband.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\bitband.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/ek-lm4f232/bitband/bitband.icf b/boards/ek-lm4f232/bitband/bitband.icf new file mode 100644 index 0000000..2f818eb --- /dev/null +++ b/boards/ek-lm4f232/bitband/bitband.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// bitband.icf - Linker configuration file for bitband. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/bitband/bitband.ld b/boards/ek-lm4f232/bitband/bitband.ld new file mode 100644 index 0000000..0cfe7b6 --- /dev/null +++ b/boards/ek-lm4f232/bitband/bitband.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * bitband.ld - Linker configuration file for bitband. + * + * Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/bitband/bitband.sct b/boards/ek-lm4f232/bitband/bitband.sct new file mode 100644 index 0000000..ebff872 --- /dev/null +++ b/boards/ek-lm4f232/bitband/bitband.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; bitband.sct - Linker configuration file for bitband. +; +; Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/bitband/bitband.uvopt b/boards/ek-lm4f232/bitband/bitband.uvopt new file mode 100644 index 0000000..938f782 --- /dev/null +++ b/boards/ek-lm4f232/bitband/bitband.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + bitband + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\bitband.c + bitband.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/bitband/bitband.uvproj b/boards/ek-lm4f232/bitband/bitband.uvproj new file mode 100644 index 0000000..e1510ce --- /dev/null +++ b/boards/ek-lm4f232/bitband/bitband.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + bitband + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + bitband + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\bitband.bin .\rvmdk\bitband.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + bitband.sct + + + --entry Reset_Handler + + + + + + + + Source + + + bitband.c + 1 + .\bitband.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/bitband/bitband_ccs.cmd b/boards/ek-lm4f232/bitband/bitband_ccs.cmd new file mode 100644 index 0000000..dc70d20 --- /dev/null +++ b/boards/ek-lm4f232/bitband/bitband_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * bitband_ccs.cmd - CCS linker configuration file for bitband. + * + * Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-lm4f232/bitband/ccs/.ccsimportspec b/boards/ek-lm4f232/bitband/ccs/.ccsimportspec new file mode 100644 index 0000000..9748e3c --- /dev/null +++ b/boards/ek-lm4f232/bitband/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/bitband/ccs/.ccsproject b/boards/ek-lm4f232/bitband/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/bitband/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/bitband/ccs/.cproject b/boards/ek-lm4f232/bitband/ccs/.cproject new file mode 100644 index 0000000..e627102 --- /dev/null +++ b/boards/ek-lm4f232/bitband/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/bitband/ccs/.project b/boards/ek-lm4f232/bitband/ccs/.project new file mode 100644 index 0000000..e93d575 --- /dev/null +++ b/boards/ek-lm4f232/bitband/ccs/.project @@ -0,0 +1,55 @@ + + + bitband + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + bitband.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/bitband/bitband.c + + + bitband_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/bitband/bitband_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/bitband/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/bitband/ccs/Debug/bitband.bin b/boards/ek-lm4f232/bitband/ccs/Debug/bitband.bin new file mode 100644 index 0000000..ee066fd Binary files /dev/null and b/boards/ek-lm4f232/bitband/ccs/Debug/bitband.bin differ diff --git a/boards/ek-lm4f232/bitband/ccs/Debug/bitband.out b/boards/ek-lm4f232/bitband/ccs/Debug/bitband.out new file mode 100644 index 0000000..a0f3cf4 Binary files /dev/null and b/boards/ek-lm4f232/bitband/ccs/Debug/bitband.out differ diff --git a/boards/ek-lm4f232/bitband/ccs/macros.ini_initial b/boards/ek-lm4f232/bitband/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/bitband/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/bitband/ccs/target_config.ccxml b/boards/ek-lm4f232/bitband/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/bitband/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/bitband/ewarm/Exe/bitband.bin b/boards/ek-lm4f232/bitband/ewarm/Exe/bitband.bin new file mode 100644 index 0000000..10aae13 Binary files /dev/null and b/boards/ek-lm4f232/bitband/ewarm/Exe/bitband.bin differ diff --git a/boards/ek-lm4f232/bitband/ewarm/Exe/bitband.out b/boards/ek-lm4f232/bitband/ewarm/Exe/bitband.out new file mode 100644 index 0000000..759d7e3 Binary files /dev/null and b/boards/ek-lm4f232/bitband/ewarm/Exe/bitband.out differ diff --git a/boards/ek-lm4f232/bitband/gcc/bitband.axf b/boards/ek-lm4f232/bitband/gcc/bitband.axf new file mode 100644 index 0000000..02828d9 Binary files /dev/null and b/boards/ek-lm4f232/bitband/gcc/bitband.axf differ diff --git a/boards/ek-lm4f232/bitband/gcc/bitband.bin b/boards/ek-lm4f232/bitband/gcc/bitband.bin new file mode 100644 index 0000000..55d76f3 Binary files /dev/null and b/boards/ek-lm4f232/bitband/gcc/bitband.bin differ diff --git a/boards/ek-lm4f232/bitband/readme.txt b/boards/ek-lm4f232/bitband/readme.txt new file mode 100644 index 0000000..5b65d59 --- /dev/null +++ b/boards/ek-lm4f232/bitband/readme.txt @@ -0,0 +1,29 @@ +Bit-Banding + +This example application demonstrates the use of the bit-banding +capabilities of the Cortex-M3 microprocessor. All of SRAM and all of the +peripherals reside within bit-band regions, meaning that bit-banding +operations can be applied to any of them. In this example, a variable in +SRAM is set to a particular value one bit at a time using bit-banding +operations (it would be more efficient to do a single non-bit-banded write; +this simply demonstrates the operation of bit-banding). + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/bitband/rvmdk/bitband.axf b/boards/ek-lm4f232/bitband/rvmdk/bitband.axf new file mode 100644 index 0000000..c9021fa Binary files /dev/null and b/boards/ek-lm4f232/bitband/rvmdk/bitband.axf differ diff --git a/boards/ek-lm4f232/bitband/rvmdk/bitband.bin b/boards/ek-lm4f232/bitband/rvmdk/bitband.bin new file mode 100644 index 0000000..4059a83 Binary files /dev/null and b/boards/ek-lm4f232/bitband/rvmdk/bitband.bin differ diff --git a/boards/ek-lm4f232/bitband/startup_ccs.c b/boards/ek-lm4f232/bitband/startup_ccs.c new file mode 100644 index 0000000..063065a --- /dev/null +++ b/boards/ek-lm4f232/bitband/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/bitband/startup_ewarm.c b/boards/ek-lm4f232/bitband/startup_ewarm.c new file mode 100644 index 0000000..0bf6eb8 --- /dev/null +++ b/boards/ek-lm4f232/bitband/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/bitband/startup_gcc.c b/boards/ek-lm4f232/bitband/startup_gcc.c new file mode 100644 index 0000000..3e91d30 --- /dev/null +++ b/boards/ek-lm4f232/bitband/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/bitband/startup_rvmdk.S b/boards/ek-lm4f232/bitband/startup_rvmdk.S new file mode 100644 index 0000000..0f99997 --- /dev/null +++ b/boards/ek-lm4f232/bitband/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/blinky/Makefile b/boards/ek-lm4f232/blinky/Makefile new file mode 100644 index 0000000..d2e0838 --- /dev/null +++ b/boards/ek-lm4f232/blinky/Makefile @@ -0,0 +1,77 @@ +#****************************************************************************** +# +# Makefile - Rules for building the blinky example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the blinky example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/blinky.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the blinky example. +# +${COMPILER}/blinky.axf: ${COMPILER}/blinky.o +${COMPILER}/blinky.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/blinky.axf: blinky.ld +SCATTERgcc_blinky=blinky.ld +ENTRY_blinky=ResetISR + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/blinky/blinky.c b/boards/ek-lm4f232/blinky/blinky.c new file mode 100644 index 0000000..ef69c80 --- /dev/null +++ b/boards/ek-lm4f232/blinky/blinky.c @@ -0,0 +1,93 @@ +//***************************************************************************** +// +// blinky.c - Simple example to blink the on-board LED. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/tm4c123gh6pge.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Blinky (blinky)

      +//! +//! A very simple example that blinks the on-board LED. +// +//***************************************************************************** + +//***************************************************************************** +// +// Blink the on-board LED. +// +//***************************************************************************** +int +main(void) +{ + volatile uint32_t ui32Loop; + + // + // Enable the GPIO port that is used for the on-board LED. + // + SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOG; + + // + // Do a dummy read to insert a few cycles after enabling the peripheral. + // + ui32Loop = SYSCTL_RCGC2_R; + + // + // Enable the GPIO pin for the LED (PG2). Set the direction as output, and + // enable the GPIO pin for digital function. + // + GPIO_PORTG_DIR_R = 0x04; + GPIO_PORTG_DEN_R = 0x04; + + // + // Loop forever. + // + while(1) + { + // + // Turn on the LED. + // + GPIO_PORTG_DATA_R |= 0x04; + + // + // Delay for a bit. + // + for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++) + { + } + + // + // Turn off the LED. + // + GPIO_PORTG_DATA_R &= ~(0x04); + + // + // Delay for a bit. + // + for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++) + { + } + } +} diff --git a/boards/ek-lm4f232/blinky/blinky.ewd b/boards/ek-lm4f232/blinky/blinky.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/blinky/blinky.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/blinky/blinky.ewp b/boards/ek-lm4f232/blinky/blinky.ewp new file mode 100644 index 0000000..44d8705 --- /dev/null +++ b/boards/ek-lm4f232/blinky/blinky.ewp @@ -0,0 +1,777 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Source + + $PROJ_DIR$\blinky.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/ek-lm4f232/blinky/blinky.icf b/boards/ek-lm4f232/blinky/blinky.icf new file mode 100644 index 0000000..79202e7 --- /dev/null +++ b/boards/ek-lm4f232/blinky/blinky.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// blinky.icf - Linker configuration file for blinky. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/blinky/blinky.ld b/boards/ek-lm4f232/blinky/blinky.ld new file mode 100644 index 0000000..5880d90 --- /dev/null +++ b/boards/ek-lm4f232/blinky/blinky.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * blinky.ld - Linker configuration file for blinky. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/blinky/blinky.sct b/boards/ek-lm4f232/blinky/blinky.sct new file mode 100644 index 0000000..aec544e --- /dev/null +++ b/boards/ek-lm4f232/blinky/blinky.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; blinky.sct - Linker configuration file for blinky. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/blinky/blinky.uvopt b/boards/ek-lm4f232/blinky/blinky.uvopt new file mode 100644 index 0000000..f88b9bd --- /dev/null +++ b/boards/ek-lm4f232/blinky/blinky.uvopt @@ -0,0 +1,268 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + blinky + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\blinky.c + blinky.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Documentation + 1 + 0 + 0 + + 2 + 3 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/blinky/blinky.uvproj b/boards/ek-lm4f232/blinky/blinky.uvproj new file mode 100644 index 0000000..8c62c70 --- /dev/null +++ b/boards/ek-lm4f232/blinky/blinky.uvproj @@ -0,0 +1,414 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + blinky + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + blinky + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\blinky.bin .\rvmdk\blinky.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + blinky.sct + + + --entry Reset_Handler + + + + + + + + Source + + + blinky.c + 1 + .\blinky.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/blinky/blinky_ccs.cmd b/boards/ek-lm4f232/blinky/blinky_ccs.cmd new file mode 100644 index 0000000..db4bc75 --- /dev/null +++ b/boards/ek-lm4f232/blinky/blinky_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * blinky_ccs.cmd - CCS linker configuration file for blinky. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 256; diff --git a/boards/ek-lm4f232/blinky/ccs/.ccsimportspec b/boards/ek-lm4f232/blinky/ccs/.ccsimportspec new file mode 100644 index 0000000..60cba3f --- /dev/null +++ b/boards/ek-lm4f232/blinky/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/blinky/ccs/.ccsproject b/boards/ek-lm4f232/blinky/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/blinky/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/blinky/ccs/.cproject b/boards/ek-lm4f232/blinky/ccs/.cproject new file mode 100644 index 0000000..7668b94 --- /dev/null +++ b/boards/ek-lm4f232/blinky/ccs/.cproject @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/blinky/ccs/.project b/boards/ek-lm4f232/blinky/ccs/.project new file mode 100644 index 0000000..add88b4 --- /dev/null +++ b/boards/ek-lm4f232/blinky/ccs/.project @@ -0,0 +1,50 @@ + + + blinky + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + blinky.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/blinky/blinky.c + + + blinky_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/blinky/blinky_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/blinky/startup_ccs.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/blinky/ccs/Debug/blinky.bin b/boards/ek-lm4f232/blinky/ccs/Debug/blinky.bin new file mode 100644 index 0000000..640cec2 Binary files /dev/null and b/boards/ek-lm4f232/blinky/ccs/Debug/blinky.bin differ diff --git a/boards/ek-lm4f232/blinky/ccs/Debug/blinky.out b/boards/ek-lm4f232/blinky/ccs/Debug/blinky.out new file mode 100644 index 0000000..f1436f4 Binary files /dev/null and b/boards/ek-lm4f232/blinky/ccs/Debug/blinky.out differ diff --git a/boards/ek-lm4f232/blinky/ccs/macros.ini_initial b/boards/ek-lm4f232/blinky/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/blinky/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/blinky/ccs/target_config.ccxml b/boards/ek-lm4f232/blinky/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/blinky/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/blinky/ewarm/Exe/blinky.bin b/boards/ek-lm4f232/blinky/ewarm/Exe/blinky.bin new file mode 100644 index 0000000..42ee325 Binary files /dev/null and b/boards/ek-lm4f232/blinky/ewarm/Exe/blinky.bin differ diff --git a/boards/ek-lm4f232/blinky/ewarm/Exe/blinky.out b/boards/ek-lm4f232/blinky/ewarm/Exe/blinky.out new file mode 100644 index 0000000..4ad7cb3 Binary files /dev/null and b/boards/ek-lm4f232/blinky/ewarm/Exe/blinky.out differ diff --git a/boards/ek-lm4f232/blinky/gcc/blinky.axf b/boards/ek-lm4f232/blinky/gcc/blinky.axf new file mode 100644 index 0000000..fb271f8 Binary files /dev/null and b/boards/ek-lm4f232/blinky/gcc/blinky.axf differ diff --git a/boards/ek-lm4f232/blinky/gcc/blinky.bin b/boards/ek-lm4f232/blinky/gcc/blinky.bin new file mode 100644 index 0000000..9c52458 Binary files /dev/null and b/boards/ek-lm4f232/blinky/gcc/blinky.bin differ diff --git a/boards/ek-lm4f232/blinky/readme.txt b/boards/ek-lm4f232/blinky/readme.txt new file mode 100644 index 0000000..bdc1513 --- /dev/null +++ b/boards/ek-lm4f232/blinky/readme.txt @@ -0,0 +1,23 @@ +Blinky + +A very simple example that blinks the on-board LED. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/blinky/rvmdk/blinky.axf b/boards/ek-lm4f232/blinky/rvmdk/blinky.axf new file mode 100644 index 0000000..115f5de Binary files /dev/null and b/boards/ek-lm4f232/blinky/rvmdk/blinky.axf differ diff --git a/boards/ek-lm4f232/blinky/rvmdk/blinky.bin b/boards/ek-lm4f232/blinky/rvmdk/blinky.bin new file mode 100644 index 0000000..a8e61b4 Binary files /dev/null and b/boards/ek-lm4f232/blinky/rvmdk/blinky.bin differ diff --git a/boards/ek-lm4f232/blinky/startup_ccs.c b/boards/ek-lm4f232/blinky/startup_ccs.c new file mode 100644 index 0000000..f21c31c --- /dev/null +++ b/boards/ek-lm4f232/blinky/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/blinky/startup_ewarm.c b/boards/ek-lm4f232/blinky/startup_ewarm.c new file mode 100644 index 0000000..926333e --- /dev/null +++ b/boards/ek-lm4f232/blinky/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/blinky/startup_gcc.c b/boards/ek-lm4f232/blinky/startup_gcc.c new file mode 100644 index 0000000..b2f963b --- /dev/null +++ b/boards/ek-lm4f232/blinky/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/blinky/startup_rvmdk.S b/boards/ek-lm4f232/blinky/startup_rvmdk.S new file mode 100644 index 0000000..ff7cf16 --- /dev/null +++ b/boards/ek-lm4f232/blinky/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000100 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/boot_demo1/Makefile b/boards/ek-lm4f232/boot_demo1/Makefile new file mode 100644 index 0000000..52bab0b --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the boot_demo1 example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/bget +IPATH+=../../../../third_party + +# +# The default rule, which causes the boot_demo1 example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_demo1.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the boot_demo1 example. +# +${COMPILER}/boot_demo1.axf: ${COMPILER}/boot_demo1.o +${COMPILER}/boot_demo1.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/boot_demo1.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/boot_demo1.axf: ${COMPILER}/ustdlib.o +${COMPILER}/boot_demo1.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/boot_demo1.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/boot_demo1.axf: boot_demo1.ld +SCATTERgcc_boot_demo1=boot_demo1.ld +ENTRY_boot_demo1=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/boot_demo1/boot_demo1.c b/boards/ek-lm4f232/boot_demo1/boot_demo1.c new file mode 100644 index 0000000..ca64f94 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/boot_demo1.c @@ -0,0 +1,267 @@ +//***************************************************************************** +// +// boot_demo1.c - First boot loader example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_flash.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_gpio.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/pin_map.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/flash.h" +#include "driverlib/uart.h" +#include "driverlib/rom.h" +#include "utils/ustdlib.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Boot Loader Demo 1 (boot_demo1)

      +//! +//! An example to demonstrate the use of a flash-based boot loader. At +//! startup, the application will configure the UART and USB peripherals, +//! and then branch to the boot loader to await the start of an +//! update. If using the serial boot loader (boot_serial), the UART will +//! always be configured at 115,200 baud and does not require the use of +//! auto-bauding. +//! +//! This application is intended for use with any of the three flash-based boot +//! loader flavors (boot_serial or boot_usb) included in the software +//! release. To accommodate the largest of these (boot_usb), the link address +//! is set to 0x2800. If you are using serial, you may change this +//! address to a 1KB boundary higher than the last address occupied +//! by the boot loader binary as long as you also rebuild the boot +//! loader itself after modifying its bl_config.h file to set APP_START_ADDRESS +//! to the same value. +//! +//! The boot_demo2 application can be used along with this application to +//! easily demonstrate that the boot loader is actually updating the on-chip +//! flash. +//! +//! Note that the LM4F232 and other Blizzard-class devices also +//! support the serial and USB boot loaders in ROM. To make use of this +//! function, link your application to run at address 0x0000 in flash and enter +//! the bootloader using the ROM_UpdateSerial and ROM_UpdateUSB functions +//! (defined in rom.h). This mechanism is used in the utils/swupdate.c +//! module when built specifically targeting a suitable Blizzard-class device. +// +//***************************************************************************** + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Passes control to the bootloader and initiates a remote software update. +// +// This function passes control to the bootloader and initiates an update of +// the main application firmware image via UART0 or USB depending +// upon the specific boot loader binary in use. +// +// \return Never returns. +// +//***************************************************************************** +void +JumpToBootLoader(void) +{ + // + // Disable all processor interrupts. Instead of disabling them + // one at a time, a direct write to NVIC is done to disable all + // peripheral interrupts. + // + HWREG(NVIC_DIS0) = 0xffffffff; + HWREG(NVIC_DIS1) = 0xffffffff; + + // + // Return control to the boot loader. This is a call to the SVC + // handler in the boot loader. + // + (*((void (*)(void))(*(uint32_t *)0x2c)))(); +} + +//***************************************************************************** +// +// Initialize UART0 and set the appropriate communication parameters. +// +//***************************************************************************** +void +SetupForUART(void) +{ + // + // We need to make sure that UART0 and its associated GPIO port are + // enabled before we pass control to the boot loader. The serial boot + // loader does not enable or configure these peripherals for us if we + // enter it via its SVC vector. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Set GPIO A0 and A1 as UART. + // + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure the UART for 115200, n, 8, 1 + // + ROM_UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, + (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | + UART_CONFIG_WLEN_8)); + + // + // Enable the UART operation. + // + ROM_UARTEnable(UART0_BASE); +} + +//***************************************************************************** +// +// Enable the USB controller +// +//***************************************************************************** +void +SetupForUSB(void) +{ + // + // The USB boot loader takes care of all required USB initialization so, + // if the application itself doesn't need to use the USB controller, we + // don't actually need to enable it here. The only requirement imposed by + // the USB boot loader is that the system clock is running from the PLL + // when the boot loader is entered. + // +} + +//***************************************************************************** +// +// Demonstrate the use of the boot loader. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + tContext sContext; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Initialize the peripherals that each of the boot loader flavors + // supports. Since this example is intended for use with any of the + // boot loaders and we don't know which is actually in use, we cover all + // bases and initialize for serial and USB use here. + // + SetupForUART(); + SetupForUSB(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "boot-demo1", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Indicate what is happening. + // + GrStringDrawCentered(&sContext, "The boot loader", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, false); + GrStringDrawCentered(&sContext, "is now running", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, false); + GrStringDrawCentered(&sContext, "and awaiting", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, false); + GrStringDrawCentered(&sContext, "an update.", -1, + GrContextDpyWidthGet(&sContext) / 2, 50, false); + + // + // Pass control to whichever flavor of boot loader the board is configured + // with. + // + JumpToBootLoader(); + + // + // The previous function never returns but we need to stick in a return + // code here to keep the compiler from generating a warning. + // + return(0); +} diff --git a/boards/ek-lm4f232/boot_demo1/boot_demo1.ewd b/boards/ek-lm4f232/boot_demo1/boot_demo1.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/boot_demo1.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/boot_demo1/boot_demo1.ewp b/boards/ek-lm4f232/boot_demo1/boot_demo1.ewp new file mode 100644 index 0000000..d7e27a5 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/boot_demo1.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\boot_demo1.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-lm4f232/boot_demo1/boot_demo1.icf b/boards/ek-lm4f232/boot_demo1/boot_demo1.icf new file mode 100644 index 0000000..5b8a42a --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/boot_demo1.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// boot_demo1.icf - Linker configuration file for boot_demo1. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00002800 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/boot_demo1/boot_demo1.ld b/boards/ek-lm4f232/boot_demo1/boot_demo1.ld new file mode 100644 index 0000000..5a24669 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/boot_demo1.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * boot_demo1.ld - Linker configuration file for boot_demo1. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00002800, LENGTH = 0x0003d800 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/boot_demo1/boot_demo1.sct b/boards/ek-lm4f232/boot_demo1/boot_demo1.sct new file mode 100644 index 0000000..6277771 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/boot_demo1.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; boot_demo1.sct - Linker configuration file for boot_demo1. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00002800 0x0003d800 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00002800 0x0003d800 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/boot_demo1/boot_demo1.uvopt b/boards/ek-lm4f232/boot_demo1/boot_demo1.uvopt new file mode 100644 index 0000000..e89f13c --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/boot_demo1.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_demo1 + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\boot_demo1.c + boot_demo1.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/boot_demo1/boot_demo1.uvproj b/boards/ek-lm4f232/boot_demo1/boot_demo1.uvproj new file mode 100644 index 0000000..9bd4480 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/boot_demo1.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + boot_demo1 + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_demo1 + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_demo1.bin .\rvmdk\boot_demo1.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + .;..;..\..\..\..;..\..\..\..\third_party\bget;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + boot_demo1.sct + + + --entry Reset_Handler + + + + + + + + Source + + + boot_demo1.c + 1 + .\boot_demo1.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/boot_demo1/boot_demo1_ccs.cmd b/boards/ek-lm4f232/boot_demo1/boot_demo1_ccs.cmd new file mode 100644 index 0000000..d7fe250 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/boot_demo1_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * boot_demo1_ccs.cmd - CCS linker configuration file for boot_demo1. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00002800 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x0003d800 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/boot_demo1/ccs/.ccsimportspec b/boards/ek-lm4f232/boot_demo1/ccs/.ccsimportspec new file mode 100644 index 0000000..fe6aa3d --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/boot_demo1/ccs/.ccsproject b/boards/ek-lm4f232/boot_demo1/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_demo1/ccs/.cproject b/boards/ek-lm4f232/boot_demo1/ccs/.cproject new file mode 100644 index 0000000..58b061d --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/ccs/.cproject @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_demo1/ccs/.project b/boards/ek-lm4f232/boot_demo1/ccs/.project new file mode 100644 index 0000000..0920ec1 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/ccs/.project @@ -0,0 +1,60 @@ + + + boot_demo1 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_demo1.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/boot_demo1/boot_demo1.c + + + boot_demo1_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/boot_demo1/boot_demo1_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/boot_demo1/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/boot_demo1/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/boot_demo1/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/boot_demo1/ccs/Debug/boot_demo1.bin b/boards/ek-lm4f232/boot_demo1/ccs/Debug/boot_demo1.bin new file mode 100644 index 0000000..1b0d788 Binary files /dev/null and b/boards/ek-lm4f232/boot_demo1/ccs/Debug/boot_demo1.bin differ diff --git a/boards/ek-lm4f232/boot_demo1/ccs/Debug/boot_demo1.out b/boards/ek-lm4f232/boot_demo1/ccs/Debug/boot_demo1.out new file mode 100644 index 0000000..45cbe1e Binary files /dev/null and b/boards/ek-lm4f232/boot_demo1/ccs/Debug/boot_demo1.out differ diff --git a/boards/ek-lm4f232/boot_demo1/ccs/macros.ini_initial b/boards/ek-lm4f232/boot_demo1/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/boot_demo1/ccs/target_config.ccxml b/boards/ek-lm4f232/boot_demo1/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_demo1/ewarm/Exe/boot_demo1.bin b/boards/ek-lm4f232/boot_demo1/ewarm/Exe/boot_demo1.bin new file mode 100644 index 0000000..c21d2b5 Binary files /dev/null and b/boards/ek-lm4f232/boot_demo1/ewarm/Exe/boot_demo1.bin differ diff --git a/boards/ek-lm4f232/boot_demo1/ewarm/Exe/boot_demo1.out b/boards/ek-lm4f232/boot_demo1/ewarm/Exe/boot_demo1.out new file mode 100644 index 0000000..dfd0998 Binary files /dev/null and b/boards/ek-lm4f232/boot_demo1/ewarm/Exe/boot_demo1.out differ diff --git a/boards/ek-lm4f232/boot_demo1/gcc/boot_demo1.axf b/boards/ek-lm4f232/boot_demo1/gcc/boot_demo1.axf new file mode 100644 index 0000000..ca939c6 Binary files /dev/null and b/boards/ek-lm4f232/boot_demo1/gcc/boot_demo1.axf differ diff --git a/boards/ek-lm4f232/boot_demo1/gcc/boot_demo1.bin b/boards/ek-lm4f232/boot_demo1/gcc/boot_demo1.bin new file mode 100644 index 0000000..363e0b0 Binary files /dev/null and b/boards/ek-lm4f232/boot_demo1/gcc/boot_demo1.bin differ diff --git a/boards/ek-lm4f232/boot_demo1/readme.txt b/boards/ek-lm4f232/boot_demo1/readme.txt new file mode 100644 index 0000000..2150228 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/readme.txt @@ -0,0 +1,48 @@ +Boot Loader Demo 1 + +An example to demonstrate the use of a flash-based boot loader. At +startup, the application will configure the UART and USB peripherals, +and then branch to the boot loader to await the start of an +update. If using the serial boot loader (boot_serial), the UART will +always be configured at 115,200 baud and does not require the use of +auto-bauding. + +This application is intended for use with any of the three flash-based boot +loader flavors (boot_serial or boot_usb) included in the software +release. To accommodate the largest of these (boot_usb), the link address +is set to 0x2800. If you are using serial, you may change this +address to a 1KB boundary higher than the last address occupied +by the boot loader binary as long as you also rebuild the boot +loader itself after modifying its bl_config.h file to set APP_START_ADDRESS +to the same value. + +The boot_demo2 application can be used along with this application to +easily demonstrate that the boot loader is actually updating the on-chip +flash. + +Note that the LM4F232 and other Blizzard-class devices also +support the serial and USB boot loaders in ROM. To make use of this +function, link your application to run at address 0x0000 in flash and enter +the bootloader using the ROM_UpdateSerial and ROM_UpdateUSB functions +(defined in rom.h). This mechanism is used in the utils/swupdate.c +module when built specifically targeting a suitable Blizzard-class device. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/boot_demo1/rvmdk/boot_demo1.axf b/boards/ek-lm4f232/boot_demo1/rvmdk/boot_demo1.axf new file mode 100644 index 0000000..17b69dc Binary files /dev/null and b/boards/ek-lm4f232/boot_demo1/rvmdk/boot_demo1.axf differ diff --git a/boards/ek-lm4f232/boot_demo1/rvmdk/boot_demo1.bin b/boards/ek-lm4f232/boot_demo1/rvmdk/boot_demo1.bin new file mode 100644 index 0000000..65dde5d Binary files /dev/null and b/boards/ek-lm4f232/boot_demo1/rvmdk/boot_demo1.bin differ diff --git a/boards/ek-lm4f232/boot_demo1/startup_ccs.c b/boards/ek-lm4f232/boot_demo1/startup_ccs.c new file mode 100644 index 0000000..cc78bf4 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/startup_ccs.c @@ -0,0 +1,364 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/boot_demo1/startup_ewarm.c b/boards/ek-lm4f232/boot_demo1/startup_ewarm.c new file mode 100644 index 0000000..08bc6bc --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/startup_ewarm.c @@ -0,0 +1,395 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/boot_demo1/startup_gcc.c b/boards/ek-lm4f232/boot_demo1/startup_gcc.c new file mode 100644 index 0000000..f3c14cf --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/startup_gcc.c @@ -0,0 +1,411 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/boot_demo1/startup_rvmdk.S b/boards/ek-lm4f232/boot_demo1/startup_rvmdk.S new file mode 100644 index 0000000..729d4ec --- /dev/null +++ b/boards/ek-lm4f232/boot_demo1/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + DCD 0xFF01FF02 ; HEADER PREFIX 0 + DCD 0xFF03FF04 ; HEADER PREFIX 1 + DCD 0xFFFFFFFF ; HEADER IMAGE LEN + DCD 0xFFFFFFFF ; HEADER CRC32 + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/boot_demo2/Makefile b/boards/ek-lm4f232/boot_demo2/Makefile new file mode 100644 index 0000000..3c86cfa --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/Makefile @@ -0,0 +1,93 @@ +#****************************************************************************** +# +# Makefile - Rules for building the boot_demo2 example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/bget +IPATH+=../../../../third_party + +# +# The default rule, which causes the boot_demo2 example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_demo2.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the boot_demo2 example. +# +${COMPILER}/boot_demo2.axf: ${COMPILER}/boot_demo2.o +${COMPILER}/boot_demo2.axf: ${COMPILER}/buttons.o +${COMPILER}/boot_demo2.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/boot_demo2.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/boot_demo2.axf: ${COMPILER}/ustdlib.o +${COMPILER}/boot_demo2.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/boot_demo2.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/boot_demo2.axf: boot_demo2.ld +SCATTERgcc_boot_demo2=boot_demo2.ld +ENTRY_boot_demo2=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/boot_demo2/boot_demo2.c b/boards/ek-lm4f232/boot_demo2/boot_demo2.c new file mode 100644 index 0000000..35d333c --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/boot_demo2.c @@ -0,0 +1,311 @@ +//***************************************************************************** +// +// boot_demo2.c - Second boot loader example. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/flash.h" +#include "driverlib/uart.h" +#include "driverlib/uart.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/pin_map.h" +#include "utils/ustdlib.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Boot Loader Demo 2 (boot_demo2)

      +//! +//! An example to demonstrate the use of a flash-based boot loader. At startup, +//! the application will configure the UART, USB and Ethernet peripherals, wait +//! for a widget on the screen to be pressed, and then branch to the boot +//! loader to await the start of an update. If using the serial boot loader +//! (boot_serial), the UART will always be configured at 115,200 baud and does +//! not require the use of auto-bauding. +//! +//! This application is intended for use with any of the three flash-based boot +//! loader flavors (boot_eth, boot_serial or boot_usb) included in the software +//! release. To accommodate the largest of these (boot_usb), the link address +//! is set to 0x2800. If you are using serial or Ethernet boot loader, you +//! may change this address to a 1KB boundary higher than the last address +//! occupied by the boot loader binary as long as you also rebuild the boot +//! loader itself after modifying its bl_config.h file to set APP_START_ADDRESS +//! to the same value. +//! +//! The boot_demo1 application can be used along with this application to +//! easily demonstrate that the boot loader is actually updating the on-chip +//! flash. +//! +//! Note that the LM4F232 and other Blizzard-class devices also the +//! support serial and USB boot loaders in ROM. To make use of this +//! function, link your application to run at address 0x0000 in flash and enter +//! the bootloader using either the ROM_UpdateUSB or ROM_UpdateSerial +//! functions (defined in rom.h). This mechanism is used in the +//! utils/swupdate.c module when built specifically targeting a suitable +//! Blizzard-class device. +// +//***************************************************************************** + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 + +//***************************************************************************** +// +// A global we use to keep track of when the user presses the "Update now" +// button. +// +//***************************************************************************** +volatile bool g_bFirmwareUpdate = false; + +//***************************************************************************** +// +// Buffers used to hold the Ethernet MAC and IP addresses for the board. +// +//***************************************************************************** +#define SIZE_MAC_ADDR_BUFFER 32 +#define SIZE_IP_ADDR_BUFFER 32 +int8_t g_pi8MACAddr[SIZE_MAC_ADDR_BUFFER]; +int8_t g_pi8IPAddr[SIZE_IP_ADDR_BUFFER]; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Passes control to the bootloader and initiates a remote software update. +// +// This function passes control to the bootloader and initiates an update of +// the main application firmware image via UART0, Ethernet or USB depending +// upon the specific boot loader binary in use. +// +// \return Never returns. +// +//***************************************************************************** +void +JumpToBootLoader(void) +{ + // + // We must make sure we turn off SysTick and its interrupt before entering + // the boot loader! + // + ROM_SysTickIntDisable(); + ROM_SysTickDisable(); + + // + // Disable all processor interrupts. Instead of disabling them + // one at a time, a direct write to NVIC is done to disable all + // peripheral interrupts. + // + HWREG(NVIC_DIS0) = 0xffffffff; + HWREG(NVIC_DIS1) = 0xffffffff; + + // + // Return control to the boot loader. This is a call to the SVC + // handler in the boot loader. + // + (*((void (*)(void))(*(uint32_t *)0x2c)))(); +} + +//***************************************************************************** +// +// Initialize UART0 and set the appropriate communication parameters. +// +//***************************************************************************** +void +SetupForUART(void) +{ + // + // We need to make sure that UART0 and its associated GPIO port are + // enabled before we pass control to the boot loader. The serial boot + // loader does not enable or configure these peripherals for us if we + // enter it via its SVC vector. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Set GPIO A0 and A1 as UART. + // + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure the UART for 115200, n, 8, 1 + // + ROM_UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, + (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | + UART_CONFIG_WLEN_8)); + + // + // Enable the UART operation. + // + ROM_UARTEnable(UART0_BASE); +} + +//***************************************************************************** +// +// Enable the USB controller +// +//***************************************************************************** +void +SetupForUSB(void) +{ + // + // The USB boot loader takes care of all required USB initialization so, + // if the application itself doesn't need to use the USB controller, we + // don't actually need to enable it here. The only requirement imposed by + // the USB boot loader is that the system clock is running from the PLL + // when the boot loader is entered. + // +} + +//***************************************************************************** +// +// A simple application demonstrating use of the boot loader, +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + tContext sContext; + uint32_t ui32SysClock; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + ui32SysClock = ROM_SysCtlClockGet(); + + // + // Initialize the peripherals that each of the boot loader flavors + // supports. Since this example is intended for use with any of the + // boot loaders and we don't know which is actually in use, we cover all + // bases and initialize for serial, Ethernet and USB use here. + // + SetupForUART(); + SetupForUSB(); + + // + // Initialize the buttons driver. + // + ButtonsInit(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "boot-demo2", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + GrStringDrawCentered(&sContext, "Press select", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, false); + GrStringDrawCentered(&sContext, "button to", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, false); + GrStringDrawCentered(&sContext, "update.", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, false); + + // + // Wait for select button to be pressed. + // + while ((ButtonsPoll(0, 0) & SELECT_BUTTON) == 0) + { + ROM_SysCtlDelay(ui32SysClock / 1000); + } + + GrStringDrawCentered(&sContext, " ", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, true); + GrStringDrawCentered(&sContext, " Updating... ", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, true); + GrStringDrawCentered(&sContext, " ", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, true); + + // + // Transfer control to the boot loader. + // + JumpToBootLoader(); + + // + // The previous function never returns but we need to stick in a return + // code here to keep the compiler from generating a warning. + // + return(0); +} diff --git a/boards/ek-lm4f232/boot_demo2/boot_demo2.ewd b/boards/ek-lm4f232/boot_demo2/boot_demo2.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/boot_demo2.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/boot_demo2/boot_demo2.ewp b/boards/ek-lm4f232/boot_demo2/boot_demo2.ewp new file mode 100644 index 0000000..cd1a6bc --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/boot_demo2.ewp @@ -0,0 +1,804 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\boot_demo2.c + + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-lm4f232/boot_demo2/boot_demo2.icf b/boards/ek-lm4f232/boot_demo2/boot_demo2.icf new file mode 100644 index 0000000..3c185e5 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/boot_demo2.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// boot_demo2.icf - Linker configuration file for boot_demo2. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00002800 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/boot_demo2/boot_demo2.ld b/boards/ek-lm4f232/boot_demo2/boot_demo2.ld new file mode 100644 index 0000000..1c62c76 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/boot_demo2.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * boot_demo2.ld - Linker configuration file for boot_demo2. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00002800, LENGTH = 0x0003d800 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/boot_demo2/boot_demo2.sct b/boards/ek-lm4f232/boot_demo2/boot_demo2.sct new file mode 100644 index 0000000..97a10ac --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/boot_demo2.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; boot_demo2.sct - Linker configuration file for boot_demo2. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00002800 0x0003d800 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00002800 0x0003d800 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/boot_demo2/boot_demo2.uvopt b/boards/ek-lm4f232/boot_demo2/boot_demo2.uvopt new file mode 100644 index 0000000..5be2dfe --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/boot_demo2.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_demo2 + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\boot_demo2.c + boot_demo2.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/boot_demo2/boot_demo2.uvproj b/boards/ek-lm4f232/boot_demo2/boot_demo2.uvproj new file mode 100644 index 0000000..314333a --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/boot_demo2.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + boot_demo2 + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_demo2 + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_demo2.bin .\rvmdk\boot_demo2.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + .;..;..\..\..\..;..\..\..\..\third_party\bget;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + boot_demo2.sct + + + --entry Reset_Handler + + + + + + + + Source + + + boot_demo2.c + 1 + .\boot_demo2.c + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/boot_demo2/boot_demo2_ccs.cmd b/boards/ek-lm4f232/boot_demo2/boot_demo2_ccs.cmd new file mode 100644 index 0000000..1a171c2 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/boot_demo2_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * boot_demo2_ccs.cmd - CCS linker configuration file for boot_demo2. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00002800 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x0003d800 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/boot_demo2/ccs/.ccsimportspec b/boards/ek-lm4f232/boot_demo2/ccs/.ccsimportspec new file mode 100644 index 0000000..1a6970a --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/boot_demo2/ccs/.ccsproject b/boards/ek-lm4f232/boot_demo2/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_demo2/ccs/.cproject b/boards/ek-lm4f232/boot_demo2/ccs/.cproject new file mode 100644 index 0000000..94735ea --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/ccs/.cproject @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_demo2/ccs/.project b/boards/ek-lm4f232/boot_demo2/ccs/.project new file mode 100644 index 0000000..7a5dfb3 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/ccs/.project @@ -0,0 +1,65 @@ + + + boot_demo2 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_demo2.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/boot_demo2/boot_demo2.c + + + boot_demo2_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/boot_demo2/boot_demo2_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/boot_demo2/startup_ccs.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/boot_demo2/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/boot_demo2/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/boot_demo2/ccs/Debug/boot_demo2.bin b/boards/ek-lm4f232/boot_demo2/ccs/Debug/boot_demo2.bin new file mode 100644 index 0000000..b490c71 Binary files /dev/null and b/boards/ek-lm4f232/boot_demo2/ccs/Debug/boot_demo2.bin differ diff --git a/boards/ek-lm4f232/boot_demo2/ccs/Debug/boot_demo2.out b/boards/ek-lm4f232/boot_demo2/ccs/Debug/boot_demo2.out new file mode 100644 index 0000000..52e3aad Binary files /dev/null and b/boards/ek-lm4f232/boot_demo2/ccs/Debug/boot_demo2.out differ diff --git a/boards/ek-lm4f232/boot_demo2/ccs/macros.ini_initial b/boards/ek-lm4f232/boot_demo2/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/boot_demo2/ccs/target_config.ccxml b/boards/ek-lm4f232/boot_demo2/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_demo2/ewarm/Exe/boot_demo2.bin b/boards/ek-lm4f232/boot_demo2/ewarm/Exe/boot_demo2.bin new file mode 100644 index 0000000..cfef7da Binary files /dev/null and b/boards/ek-lm4f232/boot_demo2/ewarm/Exe/boot_demo2.bin differ diff --git a/boards/ek-lm4f232/boot_demo2/ewarm/Exe/boot_demo2.out b/boards/ek-lm4f232/boot_demo2/ewarm/Exe/boot_demo2.out new file mode 100644 index 0000000..47deab8 Binary files /dev/null and b/boards/ek-lm4f232/boot_demo2/ewarm/Exe/boot_demo2.out differ diff --git a/boards/ek-lm4f232/boot_demo2/gcc/boot_demo2.axf b/boards/ek-lm4f232/boot_demo2/gcc/boot_demo2.axf new file mode 100644 index 0000000..b60b464 Binary files /dev/null and b/boards/ek-lm4f232/boot_demo2/gcc/boot_demo2.axf differ diff --git a/boards/ek-lm4f232/boot_demo2/gcc/boot_demo2.bin b/boards/ek-lm4f232/boot_demo2/gcc/boot_demo2.bin new file mode 100644 index 0000000..6203bab Binary files /dev/null and b/boards/ek-lm4f232/boot_demo2/gcc/boot_demo2.bin differ diff --git a/boards/ek-lm4f232/boot_demo2/readme.txt b/boards/ek-lm4f232/boot_demo2/readme.txt new file mode 100644 index 0000000..22d00e7 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/readme.txt @@ -0,0 +1,49 @@ +Boot Loader Demo 2 + +An example to demonstrate the use of a flash-based boot loader. At startup, +the application will configure the UART, USB and Ethernet peripherals, wait +for a widget on the screen to be pressed, and then branch to the boot +loader to await the start of an update. If using the serial boot loader +(boot_serial), the UART will always be configured at 115,200 baud and does +not require the use of auto-bauding. + +This application is intended for use with any of the three flash-based boot +loader flavors (boot_eth, boot_serial or boot_usb) included in the software +release. To accommodate the largest of these (boot_usb), the link address +is set to 0x2800. If you are using serial or Ethernet boot loader, you +may change this address to a 1KB boundary higher than the last address +occupied by the boot loader binary as long as you also rebuild the boot +loader itself after modifying its bl_config.h file to set APP_START_ADDRESS +to the same value. + +The boot_demo1 application can be used along with this application to +easily demonstrate that the boot loader is actually updating the on-chip +flash. + +Note that the LM4F232 and other Blizzard-class devices also the +support serial and USB boot loaders in ROM. To make use of this +function, link your application to run at address 0x0000 in flash and enter +the bootloader using either the ROM_UpdateUSB or ROM_UpdateSerial +functions (defined in rom.h). This mechanism is used in the +utils/swupdate.c module when built specifically targeting a suitable +Blizzard-class device. + +------------------------------------------------------------------------------- + +Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/boot_demo2/rvmdk/boot_demo2.axf b/boards/ek-lm4f232/boot_demo2/rvmdk/boot_demo2.axf new file mode 100644 index 0000000..13ff729 Binary files /dev/null and b/boards/ek-lm4f232/boot_demo2/rvmdk/boot_demo2.axf differ diff --git a/boards/ek-lm4f232/boot_demo2/rvmdk/boot_demo2.bin b/boards/ek-lm4f232/boot_demo2/rvmdk/boot_demo2.bin new file mode 100644 index 0000000..514baf5 Binary files /dev/null and b/boards/ek-lm4f232/boot_demo2/rvmdk/boot_demo2.bin differ diff --git a/boards/ek-lm4f232/boot_demo2/startup_ccs.c b/boards/ek-lm4f232/boot_demo2/startup_ccs.c new file mode 100644 index 0000000..cc78bf4 --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/startup_ccs.c @@ -0,0 +1,364 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/boot_demo2/startup_ewarm.c b/boards/ek-lm4f232/boot_demo2/startup_ewarm.c new file mode 100644 index 0000000..08bc6bc --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/startup_ewarm.c @@ -0,0 +1,395 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/boot_demo2/startup_gcc.c b/boards/ek-lm4f232/boot_demo2/startup_gcc.c new file mode 100644 index 0000000..f3c14cf --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/startup_gcc.c @@ -0,0 +1,411 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler, // PWM 1 Fault + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C6 Master and Slave + IntDefaultHandler, // I2C7 Master and Slave + IntDefaultHandler, // HIM Scan Matrix Keyboard 0 + IntDefaultHandler, // One Wire 0 + IntDefaultHandler, // Remote Temperature Sensor 0 + IntDefaultHandler, // HIM PS/2 0 + IntDefaultHandler, // HIM LED Sequencer 0 + IntDefaultHandler, // HIM Consumer IR 0 + IntDefaultHandler, // Power Regulator Bus 0 + (void (*)(void))0xFF01FF02, // HEADER PREFIX 0 + (void (*)(void))0xFF03FF04, // HEADER PREFIX 1 + (void (*)(void))0xFFFFFFFF, // HEADER IMAGE LEN + (void (*)(void))0xFFFFFFFF, // HEADER CRC32 + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF, // HEADER Reserved + (void (*)(void))0xFFFFFFFF // HEADER Reserved +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/boot_demo2/startup_rvmdk.S b/boards/ek-lm4f232/boot_demo2/startup_rvmdk.S new file mode 100644 index 0000000..729d4ec --- /dev/null +++ b/boards/ek-lm4f232/boot_demo2/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + DCD 0xFF01FF02 ; HEADER PREFIX 0 + DCD 0xFF03FF04 ; HEADER PREFIX 1 + DCD 0xFFFFFFFF ; HEADER IMAGE LEN + DCD 0xFFFFFFFF ; HEADER CRC32 + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + DCD 0xFFFFFFFF ; HEADER Reserved + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/boot_serial/Makefile b/boards/ek-lm4f232/boot_serial/Makefile new file mode 100644 index 0000000..926dc31 --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/Makefile @@ -0,0 +1,98 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Serial Port Boot Loader. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../boot_loader + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=../../../.. +IPATH+=../../../../boot_loader + +# +# The default rule, which causes the Serial Port Boot Loader to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_serial.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Serial Port Boot Loader. +# +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_autobaud.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_can.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_check.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_crc32.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_decrypt.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_emac.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_flash.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_i2c.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_main.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_packet.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_ssi.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_startup_${COMPILER}.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_uart.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_usb.o +${COMPILER}/boot_serial.axf: ${COMPILER}/bl_usbfuncs.o +${COMPILER}/boot_serial.axf: ../../../../boot_loader/bl_link.ld +SCATTERgcc_boot_serial=../../../../boot_loader/bl_link.ld +ENTRY_boot_serial=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/boot_serial/bl_config.h b/boards/ek-lm4f232/boot_serial/bl_config.h new file mode 100644 index 0000000..fb98252 --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/bl_config.h @@ -0,0 +1,1137 @@ +//***************************************************************************** +// +// bl_config.h - The configurable parameters of the boot loader. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __BL_CONFIG_H__ +#define __BL_CONFIG_H__ + +//***************************************************************************** +// +// The following defines are used to configure the operation of the boot +// loader. For each define, its interactions with other defines are described. +// First is the dependencies (in other words, the defines that must also be +// defined if it is defined), next are the exclusives (in other words, the +// defines that can not be defined if it is defined), and finally are the +// requirements (in other words, the defines that must be defined if it is +// defined). +// +// The following defines must be defined in order for the boot loader to +// operate: +// +// One of CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, UART_ENABLE_UPDATE, or USB_ENABLE_UPDATE +// APP_START_ADDRESS +// VTABLE_START_ADDRESS +// FLASH_PAGE_SIZE +// STACK_SIZE +// +//***************************************************************************** + +//***************************************************************************** +// +// The frequency of the crystal used to clock the microcontroller. +// +// This defines the crystal frequency used by the microcontroller running the +// boot loader. If this is unknown at the time of production, then use the +// UART_AUTOBAUD feature to properly configure the UART. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define CRYSTAL_FREQ 16000000 + +//***************************************************************************** +// +// The starting address of the application. This must be a multiple of 1024 +// bytes (making it aligned to a page boundary). A vector table is expected at +// this location, and the perceived validity of the vector table (stack located +// in SRAM, reset vector located in flash) is used as an indication of the +// validity of the application image. +// +// The flash image of the boot loader must not be larger than this value. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define APP_START_ADDRESS 0x2800 + +//***************************************************************************** +// +// The address at which the application locates its exception vector table. +// This must be a multiple of 1024 bytes (making it aligned to a page +// boundary). Typically, an application will start with its vector table and +// this value should be set to APP_START_ADDRESS. This option is provided to +// cater for applications which run from external memory which may not be +// accessible by the NVIC (the vector table offset register is only 30 bits +// long). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define VTABLE_START_ADDRESS 0x2800 + +//***************************************************************************** +// +// The size of a single, erasable page in the flash. This must be a power +// of 2. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define FLASH_PAGE_SIZE 0x00000400 + +//***************************************************************************** +// +// The amount of space at the end of flash to reserved. This must be a +// multiple of 1024 bytes (making it aligned to a page boundary). This +// reserved space is not erased when the application is updated, providing +// non-volatile storage that can be used for parameters. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define FLASH_RSVD_SPACE 0x00000800 + +//***************************************************************************** +// +// The number of words of stack space to reserve for the boot loader. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define STACK_SIZE 48 + +//***************************************************************************** +// +// The number of words in the data buffer used for receiving packets. This +// value must be at least 3. If using auto-baud on the UART, this must be at +// least 20. The maximum usable value is 65 (larger values will result in +// unused space in the buffer). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define BUFFER_SIZE 20 + +//***************************************************************************** +// +// Enables updates to the boot loader. Updating the boot loader is an unsafe +// operation since it is not fully fault tolerant (losing power to the device +// part way though could result in the boot loader no longer being present in +// flash). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_BL_UPDATE + +//***************************************************************************** +// +// Enables runtime and download CRC32 checking of the main firmware image. +// If this is defined, the boot loader will scan the main firmware image for +// an image information header (stored immediately above the vector table and +// marked by the words 0xFF01FF02 and 0xFF03FF04). If the header is found and +// the CRC32 value it contains matches that calculated for the image, the +// firmware is run. If the CRC32 does not match or the image information +// is not found, the boot loader retains control and waits for a new download. +// To aid debugging, if this option is used without ENFORCE_CRC being set, the +// image will also be booted if the header is present but the length field is +// set to 0xFFFFFFFF, typically indicating that the firmware file has not been +// run through the post-processing tool which inserts the length and CRC values. +// +// Note that firmware images intended for use with CRC checking must have been +// built with an 8 word image header appended to the top of the vector table +// and the binary must have been processed by a tool such as tools/binpack.exe +// to ensure that the required length (3rd word) and CRC32 (4th word) fields +// are populated in the header. +// +// Depends on: ENFORCE_CRC +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CHECK_CRC + +//***************************************************************************** +// +// This definition may be used alongside CHECK_CRC to remove the debug behavior +// which will allow an image with an uninitialized header to be run. With +// ENFORCE_CRC defined firmware images will only be booted if they contain a +// valid image information header and if the embedded CRC32 in that header +// matches the calculated value. +// +// Depends on: None +// Exclusive of: None +// Requires: CHECK_CRC +// +//***************************************************************************** +//#define ENFORCE_CRC + +//***************************************************************************** +// +// This definition will cause the the boot loader to erase the entire flash on +// updates to the boot loader or to erase the entire application area when the +// application is updated. This erases any unused sections in the flash before +// the firmware is updated. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define FLASH_CODE_PROTECTION + +//***************************************************************************** +// +// Enables the call to decrypt the downloaded data before writing it into +// flash. The decryption routine is empty in the reference boot loader source, +// which simply provides a placeholder for adding an actual decryption +// algorithm. Although this option is retained for backwards compatibility, it +// is recommended that a decryption function be specified using the newer hook +// function mechanism and BL_DECRYPT_FN_HOOK instead. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_DECRYPTION + +//***************************************************************************** +// +// Enables support for the MOSCFAIL handler in the NMI interrupt. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_MOSCFAIL_HANDLER + +//***************************************************************************** +// +// Enables the pin-based forced update check. When enabled, the boot loader +// will go into update mode instead of calling the application if a pin is read +// at a particular polarity, forcing an update operation. In either case, the +// application is still able to return control to the boot loader in order to +// start an update. For applications which need to perform more complex +// checking than is possible using a single GPIO, a hook function may be +// provided using BL_CHECK_UPDATE_FN_HOOK instead. +// +// Depends on: None +// Exclusive of: None +// Requires: FORCED_UPDATE_PERIPH, FORCED_UPDATE_PORT, FORCED_UPDATE_PIN, +// FORCED_UPDATE_POLARITY +// +//***************************************************************************** +//#define ENABLE_UPDATE_CHECK + +//***************************************************************************** +// +// The GPIO module to enable in order to check for a forced update. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// FORCED_UPDATE_PORT. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PERIPH SYSCTL_RCGC2_GPIOB + +//***************************************************************************** +// +// The GPIO port to check for a forced update. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for +// FORCED_UPDATE_PERIPH. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// The pin to check for a forced update. This is a value between 0 and 7. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PIN 4 + +//***************************************************************************** +// +// The polarity of the GPIO pin that results in a forced update. This value +// should be 0 if the pin should be low and 1 if the pin should be high. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_POLARITY 0 + +//***************************************************************************** +// +// This enables a weak pull-up or pull-down for the GPIO pin used in a forced +// update. Only one of FORCED_UPDATE_WPU or FORCED_UPDATE_WPD should be +// defined, or neither if a weak pull-up or pull-down is not required. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_WPU +//#define FORCED_UPDATE_WPD + +//***************************************************************************** +// +// This enables the use of the GPIO_LOCK mechanism for configuration of +// protected GPIO pins (for example JTAG pins). If this value is not defined, +// the locking mechanism will not be used. The only legal values for this +// feature are GPIO_LOCK_KEY for Fury devices and GPIO_LOCK_KEY_DD for all +// other devices except Sandstorm devices, which do not support this feature. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_KEY GPIO_LOCK_KEY +//#define FORCED_UPDATE_KEY GPIO_LOCK_KEY_DD + +//***************************************************************************** +// +// Selects the UART as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: UART_AUTOBAUD or UART_FIXED_BAUDRATE, BUFFER_SIZE +// +//***************************************************************************** +#define UART_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables automatic baud rate detection. This can be used if the crystal +// frequency is unknown, or if operation at different baud rates is desired. +// +// Depends on: UART_ENABLE_UPDATE +// Exclusive of: UART_FIXED_BAUDRATE +// Requires: None +// +//***************************************************************************** +//#define UART_AUTOBAUD + +//***************************************************************************** +// +// Selects the baud rate to be used for the UART. +// +// Depends on: UART_ENABLE_UPDATE, CRYSTAL_FREQ +// Exclusive of: UART_AUTOBAUD +// Requires: None +// +//***************************************************************************** +#define UART_FIXED_BAUDRATE 115200 + +//***************************************************************************** +// +// Selects the SSI port as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: BUFFER_SIZE +// +//***************************************************************************** +//#define SSI_ENABLE_UPDATE + +//***************************************************************************** +// +// Selects the I2C port as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: I2C_SLAVE_ADDR, BUFFER_SIZE +// +//***************************************************************************** +//#define I2C_ENABLE_UPDATE + +//***************************************************************************** +// +// Specifies the I2C address of the boot loader. +// +// Depends on: I2C_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define I2C_SLAVE_ADDR 0x42 + +//***************************************************************************** +// +// Selects Ethernet update via the BOOTP/TFTP protocol. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, I2C_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: CRYSTAL_FREQ +// +//***************************************************************************** +//#define ENET_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables the use of the Ethernet status LED outputs to indicate traffic and +// connection status. +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_ENABLE_LEDS + +//***************************************************************************** +// +// Specifies the hard coded MAC address for the Ethernet interface. There are +// six individual values (ENET_MAC_ADDR0 through ENET_MAC_ADDR5) that provide +// the six bytes of the MAC address, where ENET_MAC_ADDR0 though ENET_MAC_ADDR2 +// provide the organizationally unique identifier (OUI) and ENET_MAC_ADDR3 +// through ENET_MAC_ADDR5 provide the extension identifier. If these values +// are not provided, the MAC address will be extracted from the user registers. +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_MAC_ADDR0 0x00 +//#define ENET_MAC_ADDR1 0x00 +//#define ENET_MAC_ADDR2 0x00 +//#define ENET_MAC_ADDR3 0x00 +//#define ENET_MAC_ADDR4 0x00 +//#define ENET_MAC_ADDR5 0x00 + +//***************************************************************************** +// +// Specifies the name of the BOOTP server from which to request information. +// The use of this specifier allows a board-specific BOOTP server to co-exist +// on a network with the DHCP server that may be part of the network +// infrastructure. The BOOTP server provided by Texas Instruments requires +// that this be set to "stellaris". +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_BOOTP_SERVER "stellaris" + +//***************************************************************************** +// +// Selects USB update via Device Firmware Update class. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, UART_ENABLE_UPDATE, +// Requires: CRYSTAL_FREQ, USB_VENDOR_ID, USB_PRODUCT_ID, USB_DEVICE_ID, +// USB_MAX_POWER +// +//***************************************************************************** +//#define USB_ENABLE_UPDATE + +//***************************************************************************** +// +// The USB vendor ID published by the DFU device. This value is the TI +// Tiva vendor ID. Change this to the vendor ID you have been assigned by the +// USB-IF. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VENDOR_ID 0x1cbe + +//***************************************************************************** +// +// The USB device ID published by the DFU device. If you are using your own +// vendor ID, chose a device ID that is different from the ID you use in +// non-update operation. If you have sublicensed TI's vendor ID, you must +// use an assigned product ID here. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_PRODUCT_ID 0x00ff + +//***************************************************************************** +// +// Selects the BCD USB device release number published in the device +// descriptor. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DEVICE_ID 0x0001 + +//***************************************************************************** +// +// Sets the maximum power consumption that the DFU device will report to the +// USB host in the configuration descriptor. Units are milliamps. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MAX_POWER 150 + +//***************************************************************************** +// +// Specifies whether the DFU device reports to the host that it is self-powered +// (defined as 0) or bus-powered (defined as 1). +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_BUS_POWERED 1 + +//***************************************************************************** +// +// Specifies whether the target board uses a multiplexer to select between USB +// host and device modes. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_MUX_PERIPH, USB_MUX_PORT, USB_MUX_PIN, USB_MUX_DEVICE +// +//***************************************************************************** +//#define USB_HAS_MUX + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used to select +// between USB host and device modes. The value is of the form +// SYSCTL_RCGC2_GPIOx, where GPIOx represents the required GPIO port. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PERIPH SYSCTL_RCGC2_GPIOH + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used to select between +// USB host and device modes. The value is of the form GPIO_PORTx_BASE, where +// PORTx represents the required GPIO port. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PORT GPIO_PORTH_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used to select between USB host and device +// modes. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PIN 2 + +//***************************************************************************** +// +// Specifies the state of the GPIO pin required to select USB device-mode +// operation. Valid values are 0 (low) or 1 (high). +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_DEVICE 1 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for VBUS. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_VBUS_PERIPH, USB_VBUS_PORT, USB_VBUS_PIN +// +//***************************************************************************** +//#define USB_VBUS_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for VBUS. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VBUS_PERIPH SYSCTL_RCGCGPIO_R1 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for VBUS. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VBUS_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for VBUS. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_VBUS_PIN 1 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for ID. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_ID_PERIPH, USB_ID_PORT, USB_ID_PIN +// +//***************************************************************************** +//#define USB_ID_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for ID. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_ID_PERIPH SYSCTL_RCGCGPIO_R1 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for ID. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_ID_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for ID. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_ID_PIN 0 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for DP. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_DP_PERIPH, USB_DP_PORT, USB_DP_PIN +// +//***************************************************************************** +//#define USB_DP_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for DP. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DP_PERIPH SYSCTL_RCGCGPIO_R10 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for DP. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DP_PORT GPIO_PORTL_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for DP. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DP_PIN 6 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for DM. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_DM_PERIPH, USB_DM_PORT, USB_DM_PIN +// +//***************************************************************************** +//#define USB_DM_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for DM. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DM_PERIPH SYSCTL_RCGCGPIO_R10 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for DM. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DM_PORT GPIO_PORTL_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for DM. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_DM_PIN 7 + +//***************************************************************************** +// +// Selects an update via the CAN port. +// +// Depends on: None +// Exclusive of: ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: CAN_RX_PERIPH, CAN_RX_PORT, CAN_RX_PIN, CAN_TX_PERIPH, +// CAN_TX_PORT, CAN_TX_PIN, CAN_BIT_RATE, CRYSTAL_FREQ. +// +//***************************************************************************** +//#define CAN_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables the UART to CAN bridging for use when the CAN port is selected for +// communicating with the boot loader. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_UART_BRIDGE + +//***************************************************************************** +// +// The GPIO module to enable in order to configure the CAN0 Rx pin. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// CAN_RX_PORT. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PERIPH SYSCTL_RCGC2_GPIOA + +//***************************************************************************** +// +// The GPIO port used to configure the CAN0 Rx pin. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for CAN_RX_PERIPH. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PORT GPIO_PORTA_BASE + +//***************************************************************************** +// +// The GPIO pin that is shared with the CAN0 Rx pin. This is a value between 0 +// and 7. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PIN 4 + +//***************************************************************************** +// +// The GPIO module to enable in order to configure the CAN0 Tx pin. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// CAN_TX_PORT. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PERIPH SYSCTL_RCGC2_GPIOA + +//***************************************************************************** +// +// The GPIO port used to configure the CAN0 Tx pin. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for CAN_TX_PERIPH. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PORT GPIO_PORTA_BASE + +//***************************************************************************** +// +// The GPIO pin that is shared with the CAN0 Tx pin. This is a value between 0 +// and 7. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PIN 5 + +//***************************************************************************** +// +// The bit rate used on the CAN bus. This must be one of 20000, 50000, 125000, +// 250000, 500000, or 1000000. The CAN bit rate must be less than or equal to +// the crystal frequency divided by 8 (CRYSTAL_FREQ / 8). +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_BIT_RATE 1000000 + +//***************************************************************************** +// +// Performs application-specific low level hardware initialization on system +// reset. If hooked, this function will be called immediately after the boot +// loader code relocation completes. An application may perform any required +// low-level hardware initialization during this function. Note that the +// system clock has not been set when this function is called. Initialization +// that assumes the system clock is set may be performed in the BL_INIT_FN_HOOK +// function instead. +// +// void MyHwInitFunc(void); +// +//***************************************************************************** +//#define BL_HW_INIT_FN_HOOK MyHwInitFunc + +//***************************************************************************** +// +// Performs application-specific initialization on system reset. If hooked, +// this function will be called during boot loader initialization to perform +// any board- or application-specific initialization which is required. The +// function is called following a reset immediately after the selected boot +// loader peripheral has been configured and the system clock has been set. +// +// void MyInitFunc(void); +// +//***************************************************************************** +//#define BL_INIT_FN_HOOK MyInitFunc + +//***************************************************************************** +// +// Performs application-specific reinitialization on boot loader entry via SVC. +// If hooked, this function will be called during boot loader reinitialization +// to perform any board- or application-specific initialization which is +// required. The function is called following boot loader entry from an +// application, after any system clock rate adjustments have been made. +// +// void MyReinitFunc(void); +// +//***************************************************************************** +//#define BL_REINIT_FN_HOOK MyReinitFunc + +//***************************************************************************** +// +// Informs an application that a download is starting. If hooked, this +// function will be called when a firmware download is about to begin. The +// function is called after the first data packet of the download is received +// but before it has been written to flash. +// +// void MyStartFunc(void); +// +//***************************************************************************** +//#define BL_START_FN_HOOK MyStartFunc + +//***************************************************************************** +// +// Informs an application of download progress. If hooked, this function will +// be called periodically during a firmware download to provide progress +// information. The function is called after each data packet is received from +// the host. Parameters provide the number of bytes of data received and, in +// cases other than Ethernet update, the expected total number of bytes in the +// download (the TFTP protocol used by the Ethernet boot loader does not send +// the final image size before the download starts so in this case the ulTotal +// parameter is set to 0 to indicate that the size is unknown). +// +// void MyProgressFunc(unsigned long ulCompleted, unsigned long ulTotal); +// +//***************************************************************************** +//#define BL_PROGRESS_FN_HOOK MyProgressFunc + +//***************************************************************************** +// +// Informs an application that a download has completed. If hooked, this +// function will be called when a firmware download has just completed. The +// function is called after the final data packet of the download has been +// written to flash. +// +// void MyEndFunc(void); +// +//***************************************************************************** +//#define BL_END_FN_HOOK MyEndFunc + +//***************************************************************************** +// +// Allows an application to perform in-place data decryption during download. +// If hooked, this function will be called to perform in-place decryption of +// each data packet received during a firmware download. +// +// void MyDecryptionFunc(unsigned char *pucBuffer, unsigned long ulSize); +// +// This value takes precedence over ENABLE_DECRYPTION. If both are defined, +// the hook function defined using BL_DECRYPT_FN_HOOK is called rather than the +// previously-defined DecryptData() stub function. +// +//***************************************************************************** +//#define BL_DECRYPT_FN_HOOK MyDecryptionFunc + +//***************************************************************************** +// +// Allows an application to force a new firmware download. If hooked, this +// function will be called during boot loader initialization to determine +// whether a firmware update should be performed regardless of whether a valid +// main code image is already present. If the function returns 0, the existing +// main code image is booted (if present), otherwise the boot loader will wait +// for a new firmware image to be downloaded. +// +// unsigned long MyCheckUpdateFunc(void); +// +// This value takes precedence over ENABLE_UPDATE_CHECK} if both are defined. +// If you wish to perform a GPIO check in addition to any other update check +// processing required, the GPIO code must be included within the hook function +// itself. +// +//***************************************************************************** +//#define BL_CHECK_UPDATE_FN_HOOK MyCheckUpdateFunc + +//***************************************************************************** +// +// Allows an application to replace the flash block erase function. If hooked, +// this function will be called whenever a block of flash is to be erased. The +// function must erase the block and wait until the operation has completed. +// The size of the block which will be erased is defined by FLASH_BLOCK_SIZE. +// +// void MyFlashEraseFunc(unsigned long ulBlockAddr); +// +//***************************************************************************** +//#define BL_FLASH_ERASE_FN_HOOK MyFlashEraseFunc + +//***************************************************************************** +// +// Allows an application to replace the flash programming function. If hooked, +// this function will be called to program the flash with firmware image data +// received during download operations. The function must program the supplied +// data and wait until the operation has completed. +// +// void MyFlashProgramFunc(unsigned long ulDstAddr, +// unsigned char *pucSrcData, +// unsigned long ulLength); +// +//***************************************************************************** +//#define BL_FLASH_PROGRAM_FN_HOOK MyFlashProgramFunc + +//***************************************************************************** +// +// Allows an application to replace the flash error clear function. If hooked, +// this function must clear any flash error indicators and prepare to detect +// access violations that may occur in a future erase or program operations. +// +// void MyFlashClearErrorFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_CL_ERR_FN_HOOK MyFlashClearErrorFunc + +//***************************************************************************** +// +// Reports whether or not a flash access violation error has occurred. If +// hooked, this function will be called after flash erase or program +// operations. The return code indicates whether or not an access violation +// error occurred since the last call to the function defined by +// BL_FLASH_CL_ERR_FN_HOOK, with 0 indicating no errors and non-zero indicating +// an error. +// +// unsigned long MyFlashErrorFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_ERROR_FN_HOOK MyFlashErrorFunc + +//***************************************************************************** +// +// Reports the total size of the device flash. If hooked, this function will +// be called to determine the size of the supported flash device. The return +// code is the number of bytes of flash in the device. Note that this does not +// take into account any reserved space defined via the FLASH_RSVD_SPACE value. +// +// unsigned long MyFlashSizeFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_SIZE_FN_HOOK MyFlashSizeFunc + +//***************************************************************************** +// +// Reports the address of the first byte after the end of the device flash. If +// hooked, this function will be called to determine the address of the end of +// valid flash. Note that this does not take into account any reserved space +// defined via the FLASH_RSVD_SPACE value. +// +// unsigned long MyFlashEndFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_END_FN_HOOK MyFlashEndFunc + +//***************************************************************************** +// +// Checks whether the start address and size of an image are valid. If hooked, +// this function will be called when a new firmware download is about to start. +// Parameters provided are the requested start address for the new download +// and, when using protocols which transmit the image length in advance, the +// size of the image that is to be downloaded. The return code will be +// non-zero to indicate that the start address is valid and the image will fit +// in the available space, or 0 if either the address is invalid or the image +// is too large for the device. +// +// unsigned long MyFlashAddrCheckFunc(unsigned long ulAddr, +// unsigned long ulSize); +// +//***************************************************************************** +//#define BL_FLASH_AD_CHECK_FN_HOOK MyFlashAddrCheckFunc + +#endif // __BL_CONFIG_H__ diff --git a/boards/ek-lm4f232/boot_serial/boot_serial.ewd b/boards/ek-lm4f232/boot_serial/boot_serial.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/boot_serial.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/boot_serial/boot_serial.ewp b/boards/ek-lm4f232/boot_serial/boot_serial.ewp new file mode 100644 index 0000000..419b347 --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/boot_serial.ewp @@ -0,0 +1,821 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Source + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_autobaud.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_can.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_check.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_crc32.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_decrypt.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_emac.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_flash.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_i2c.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_main.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_packet.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_ssi.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_startup_ewarm.S + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_uart.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_usb.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_usbfuncs.c + + + diff --git a/boards/ek-lm4f232/boot_serial/boot_serial.uvopt b/boards/ek-lm4f232/boot_serial/boot_serial.uvopt new file mode 100644 index 0000000..aa8da10 --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/boot_serial.uvopt @@ -0,0 +1,450 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_serial + 0x4 + ARM-ADS + + 16000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S2 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_autobaud.c + bl_autobaud.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_can.c + bl_can.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_check.c + bl_check.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_crc32.c + bl_crc32.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_decrypt.c + bl_decrypt.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_emac.c + bl_emac.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_flash.c + bl_flash.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_i2c.c + bl_i2c.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_main.c + bl_main.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_packet.c + bl_packet.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_ssi.c + bl_ssi.c + + + 1 + 12 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_startup_rvmdk.S + bl_startup_rvmdk.S + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_uart.c + bl_uart.c + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_usb.c + bl_usb.c + + + 1 + 15 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_usbfuncs.c + bl_usbfuncs.c + + + + + Documentation + 1 + 0 + 0 + + 2 + 16 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + ..\..\..\..\boot_loader\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + ..\..\..\..\boot_loader\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/boot_serial/boot_serial.uvproj b/boards/ek-lm4f232/boot_serial/boot_serial.uvproj new file mode 100644 index 0000000..b131ea3 --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/boot_serial.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + boot_serial + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(16000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_serial + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + armcc --device DLM -I . -E -o bl_config.inc ..\..\..\..\boot_loader\bl_config.c + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_serial.bin .\rvmdk\boot_serial.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + .;..\..\..\..;..\..\..\..\boot_loader; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + ..\..\..\..\boot_loader\bl_link.sct + + + --entry Reset_Handler + + + + + + + + Source + + + bl_autobaud.c + 1 + ..\..\..\..\boot_loader\bl_autobaud.c + + + bl_can.c + 1 + ..\..\..\..\boot_loader\bl_can.c + + + bl_check.c + 1 + ..\..\..\..\boot_loader\bl_check.c + + + bl_crc32.c + 1 + ..\..\..\..\boot_loader\bl_crc32.c + + + bl_decrypt.c + 1 + ..\..\..\..\boot_loader\bl_decrypt.c + + + bl_emac.c + 1 + ..\..\..\..\boot_loader\bl_emac.c + + + bl_flash.c + 1 + ..\..\..\..\boot_loader\bl_flash.c + + + bl_i2c.c + 1 + ..\..\..\..\boot_loader\bl_i2c.c + + + bl_main.c + 1 + ..\..\..\..\boot_loader\bl_main.c + + + bl_packet.c + 1 + ..\..\..\..\boot_loader\bl_packet.c + + + bl_ssi.c + 1 + ..\..\..\..\boot_loader\bl_ssi.c + + + bl_startup_rvmdk.S + 2 + ..\..\..\..\boot_loader\bl_startup_rvmdk.S + + + bl_uart.c + 1 + ..\..\..\..\boot_loader\bl_uart.c + + + bl_usb.c + 1 + ..\..\..\..\boot_loader\bl_usb.c + + + bl_usbfuncs.c + 1 + ..\..\..\..\boot_loader\bl_usbfuncs.c + + + + + Documentation + + + readme.txt + 5 + ..\..\..\..\boot_loader\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/boot_serial/ccs/.ccsimportspec b/boards/ek-lm4f232/boot_serial/ccs/.ccsimportspec new file mode 100644 index 0000000..34afca1 --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/ccs/.ccsimportspec @@ -0,0 +1,6 @@ + + + + + + diff --git a/boards/ek-lm4f232/boot_serial/ccs/.ccsproject b/boards/ek-lm4f232/boot_serial/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_serial/ccs/.cproject b/boards/ek-lm4f232/boot_serial/ccs/.cproject new file mode 100644 index 0000000..26adde6 --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_serial/ccs/.project b/boards/ek-lm4f232/boot_serial/ccs/.project new file mode 100644 index 0000000..6f5cb26 --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/ccs/.project @@ -0,0 +1,115 @@ + + + boot_serial + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_loader/bl_autobaud.c + 1 + SW_ROOT/boot_loader/bl_autobaud.c + + + boot_loader/bl_can.c + 1 + SW_ROOT/boot_loader/bl_can.c + + + boot_loader/bl_check.c + 1 + SW_ROOT/boot_loader/bl_check.c + + + boot_loader/bl_crc32.c + 1 + SW_ROOT/boot_loader/bl_crc32.c + + + boot_loader/bl_decrypt.c + 1 + SW_ROOT/boot_loader/bl_decrypt.c + + + boot_loader/bl_emac.c + 1 + SW_ROOT/boot_loader/bl_emac.c + + + boot_loader/bl_flash.c + 1 + SW_ROOT/boot_loader/bl_flash.c + + + boot_loader/bl_i2c.c + 1 + SW_ROOT/boot_loader/bl_i2c.c + + + boot_loader/bl_link_ccs.cmd + 1 + SW_ROOT/boot_loader/bl_link_ccs.cmd + + + boot_loader/bl_main.c + 1 + SW_ROOT/boot_loader/bl_main.c + + + boot_loader/bl_packet.c + 1 + SW_ROOT/boot_loader/bl_packet.c + + + boot_loader/bl_ssi.c + 1 + SW_ROOT/boot_loader/bl_ssi.c + + + boot_loader/bl_startup_ccs.s + 1 + SW_ROOT/boot_loader/bl_startup_ccs.s + + + boot_loader/bl_uart.c + 1 + SW_ROOT/boot_loader/bl_uart.c + + + boot_loader/bl_usb.c + 1 + SW_ROOT/boot_loader/bl_usb.c + + + boot_loader/bl_usbfuncs.c + 1 + SW_ROOT/boot_loader/bl_usbfuncs.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/boot_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/boot_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/boot_serial/ccs/Debug/boot_serial.bin b/boards/ek-lm4f232/boot_serial/ccs/Debug/boot_serial.bin new file mode 100644 index 0000000..4e706c3 Binary files /dev/null and b/boards/ek-lm4f232/boot_serial/ccs/Debug/boot_serial.bin differ diff --git a/boards/ek-lm4f232/boot_serial/ccs/Debug/boot_serial.out b/boards/ek-lm4f232/boot_serial/ccs/Debug/boot_serial.out new file mode 100644 index 0000000..38b8037 Binary files /dev/null and b/boards/ek-lm4f232/boot_serial/ccs/Debug/boot_serial.out differ diff --git a/boards/ek-lm4f232/boot_serial/ccs/macros.ini_initial b/boards/ek-lm4f232/boot_serial/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/boot_serial/ccs/target_config.ccxml b/boards/ek-lm4f232/boot_serial/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/boot_serial/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_serial/ewarm/Exe/boot_serial.bin b/boards/ek-lm4f232/boot_serial/ewarm/Exe/boot_serial.bin new file mode 100644 index 0000000..2b9857b Binary files /dev/null and b/boards/ek-lm4f232/boot_serial/ewarm/Exe/boot_serial.bin differ diff --git a/boards/ek-lm4f232/boot_serial/ewarm/Exe/boot_serial.out b/boards/ek-lm4f232/boot_serial/ewarm/Exe/boot_serial.out new file mode 100644 index 0000000..d406865 Binary files /dev/null and b/boards/ek-lm4f232/boot_serial/ewarm/Exe/boot_serial.out differ diff --git a/boards/ek-lm4f232/boot_serial/gcc/boot_serial.axf b/boards/ek-lm4f232/boot_serial/gcc/boot_serial.axf new file mode 100644 index 0000000..4f0b22d Binary files /dev/null and b/boards/ek-lm4f232/boot_serial/gcc/boot_serial.axf differ diff --git a/boards/ek-lm4f232/boot_serial/gcc/boot_serial.bin b/boards/ek-lm4f232/boot_serial/gcc/boot_serial.bin new file mode 100644 index 0000000..43f1b3e Binary files /dev/null and b/boards/ek-lm4f232/boot_serial/gcc/boot_serial.bin differ diff --git a/boards/ek-lm4f232/boot_serial/rvmdk/boot_serial.axf b/boards/ek-lm4f232/boot_serial/rvmdk/boot_serial.axf new file mode 100644 index 0000000..831cabd Binary files /dev/null and b/boards/ek-lm4f232/boot_serial/rvmdk/boot_serial.axf differ diff --git a/boards/ek-lm4f232/boot_serial/rvmdk/boot_serial.bin b/boards/ek-lm4f232/boot_serial/rvmdk/boot_serial.bin new file mode 100644 index 0000000..16b8bae Binary files /dev/null and b/boards/ek-lm4f232/boot_serial/rvmdk/boot_serial.bin differ diff --git a/boards/ek-lm4f232/boot_usb/Makefile b/boards/ek-lm4f232/boot_usb/Makefile new file mode 100644 index 0000000..f5491e9 --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/Makefile @@ -0,0 +1,98 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB Boot Loader. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../boot_loader + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=../../../.. +IPATH+=../../../../boot_loader + +# +# The default rule, which causes the USB Boot Loader to be built. +# +all: ${COMPILER} +all: ${COMPILER}/boot_usb.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB Boot Loader. +# +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_autobaud.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_can.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_check.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_crc32.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_decrypt.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_emac.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_flash.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_i2c.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_main.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_packet.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_ssi.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_startup_${COMPILER}.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_uart.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_usb.o +${COMPILER}/boot_usb.axf: ${COMPILER}/bl_usbfuncs.o +${COMPILER}/boot_usb.axf: ../../../../boot_loader/bl_link.ld +SCATTERgcc_boot_usb=../../../../boot_loader/bl_link.ld +ENTRY_boot_usb=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/boot_usb/bl_config.h b/boards/ek-lm4f232/boot_usb/bl_config.h new file mode 100644 index 0000000..d9155f5 --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/bl_config.h @@ -0,0 +1,1137 @@ +//***************************************************************************** +// +// bl_config.h - The configurable parameters of the boot loader. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __BL_CONFIG_H__ +#define __BL_CONFIG_H__ + +//***************************************************************************** +// +// The following defines are used to configure the operation of the boot +// loader. For each define, its interactions with other defines are described. +// First is the dependencies (in other words, the defines that must also be +// defined if it is defined), next are the exclusives (in other words, the +// defines that can not be defined if it is defined), and finally are the +// requirements (in other words, the defines that must be defined if it is +// defined). +// +// The following defines must be defined in order for the boot loader to +// operate: +// +// One of CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, UART_ENABLE_UPDATE, or USB_ENABLE_UPDATE +// APP_START_ADDRESS +// VTABLE_START_ADDRESS +// FLASH_PAGE_SIZE +// STACK_SIZE +// +//***************************************************************************** + +//***************************************************************************** +// +// The frequency of the crystal used to clock the microcontroller. +// +// This defines the crystal frequency used by the microcontroller running the +// boot loader. If this is unknown at the time of production, then use the +// UART_AUTOBAUD feature to properly configure the UART. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define CRYSTAL_FREQ 16000000 + +//***************************************************************************** +// +// The starting address of the application. This must be a multiple of 1024 +// bytes (making it aligned to a page boundary). A vector table is expected at +// this location, and the perceived validity of the vector table (stack located +// in SRAM, reset vector located in flash) is used as an indication of the +// validity of the application image. +// +// The flash image of the boot loader must not be larger than this value. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define APP_START_ADDRESS 0x2800 + +//***************************************************************************** +// +// The address at which the application locates its exception vector table. +// This must be a multiple of 1024 bytes (making it aligned to a page +// boundary). Typically, an application will start with its vector table and +// this value should be set to APP_START_ADDRESS. This option is provided to +// cater for applications which run from external memory which may not be +// accessible by the NVIC (the vector table offset register is only 30 bits +// long). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define VTABLE_START_ADDRESS 0x2800 + +//***************************************************************************** +// +// The size of a single, erasable page in the flash. This must be a power +// of 2. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define FLASH_PAGE_SIZE 0x00000400 + +//***************************************************************************** +// +// The amount of space at the end of flash to reserved. This must be a +// multiple of 1024 bytes (making it aligned to a page boundary). This +// reserved space is not erased when the application is updated, providing +// non-volatile storage that can be used for parameters. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define FLASH_RSVD_SPACE 0x00000800 + +//***************************************************************************** +// +// The number of words of stack space to reserve for the boot loader. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define STACK_SIZE 128 + +//***************************************************************************** +// +// The number of words in the data buffer used for receiving packets. This +// value must be at least 3. If using auto-baud on the UART, this must be at +// least 20. The maximum usable value is 65 (larger values will result in +// unused space in the buffer). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define BUFFER_SIZE 20 + +//***************************************************************************** +// +// Enables updates to the boot loader. Updating the boot loader is an unsafe +// operation since it is not fully fault tolerant (losing power to the device +// part way though could result in the boot loader no longer being present in +// flash). +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_BL_UPDATE + +//***************************************************************************** +// +// Enables runtime and download CRC32 checking of the main firmware image. +// If this is defined, the boot loader will scan the main firmware image for +// an image information header (stored immediately above the vector table and +// marked by the words 0xFF01FF02 and 0xFF03FF04). If the header is found and +// the CRC32 value it contains matches that calculated for the image, the +// firmware is run. If the CRC32 does not match or the image information +// is not found, the boot loader retains control and waits for a new download. +// To aid debugging, if this option is used without ENFORCE_CRC being set, the +// image will also be booted if the header is present but the length field is +// set to 0xFFFFFFFF, typically indicating that the firmware file has not been +// run through the post-processing tool which inserts the length and CRC values. +// +// Note that firmware images intended for use with CRC checking must have been +// built with an 8 word image header appended to the top of the vector table +// and the binary must have been processed by a tool such as tools/binpack.exe +// to ensure that the required length (3rd word) and CRC32 (4th word) fields +// are populated in the header. +// +// Depends on: ENFORCE_CRC +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CHECK_CRC + +//***************************************************************************** +// +// This definition may be used alongside CHECK_CRC to remove the debug behavior +// which will allow an image with an uninitialized header to be run. With +// ENFORCE_CRC defined firmware images will only be booted if they contain a +// valid image information header and if the embedded CRC32 in that header +// matches the calculated value. +// +// Depends on: None +// Exclusive of: None +// Requires: CHECK_CRC +// +//***************************************************************************** +//#define ENFORCE_CRC + +//***************************************************************************** +// +// This definition will cause the the boot loader to erase the entire flash on +// updates to the boot loader or to erase the entire application area when the +// application is updated. This erases any unused sections in the flash before +// the firmware is updated. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define FLASH_CODE_PROTECTION + +//***************************************************************************** +// +// Enables the call to decrypt the downloaded data before writing it into +// flash. The decryption routine is empty in the reference boot loader source, +// which simply provides a placeholder for adding an actual decryption +// algorithm. Although this option is retained for backwards compatibility, it +// is recommended that a decryption function be specified using the newer hook +// function mechanism and BL_DECRYPT_FN_HOOK instead. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_DECRYPTION + +//***************************************************************************** +// +// Enables support for the MOSCFAIL handler in the NMI interrupt. +// +// Depends on: None +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENABLE_MOSCFAIL_HANDLER + +//***************************************************************************** +// +// Enables the pin-based forced update check. When enabled, the boot loader +// will go into update mode instead of calling the application if a pin is read +// at a particular polarity, forcing an update operation. In either case, the +// application is still able to return control to the boot loader in order to +// start an update. For applications which need to perform more complex +// checking than is possible using a single GPIO, a hook function may be +// provided using BL_CHECK_UPDATE_FN_HOOK instead. +// +// Depends on: None +// Exclusive of: None +// Requires: FORCED_UPDATE_PERIPH, FORCED_UPDATE_PORT, FORCED_UPDATE_PIN, +// FORCED_UPDATE_POLARITY +// +//***************************************************************************** +//#define ENABLE_UPDATE_CHECK + +//***************************************************************************** +// +// The GPIO module to enable in order to check for a forced update. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// FORCED_UPDATE_PORT. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PERIPH SYSCTL_RCGC2_GPIOB + +//***************************************************************************** +// +// The GPIO port to check for a forced update. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for +// FORCED_UPDATE_PERIPH. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// The pin to check for a forced update. This is a value between 0 and 7. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_PIN 4 + +//***************************************************************************** +// +// The polarity of the GPIO pin that results in a forced update. This value +// should be 0 if the pin should be low and 1 if the pin should be high. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_POLARITY 0 + +//***************************************************************************** +// +// This enables a weak pull-up or pull-down for the GPIO pin used in a forced +// update. Only one of FORCED_UPDATE_WPU or FORCED_UPDATE_WPD should be +// defined, or neither if a weak pull-up or pull-down is not required. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_WPU +//#define FORCED_UPDATE_WPD + +//***************************************************************************** +// +// This enables the use of the GPIO_LOCK mechanism for configuration of +// protected GPIO pins (for example JTAG pins). If this value is not defined, +// the locking mechanism will not be used. The only legal values for this +// feature are GPIO_LOCK_KEY for Fury devices and GPIO_LOCK_KEY_DD for all +// other devices except Sandstorm devices, which do not support this feature. +// +// Depends on: ENABLE_UPDATE_CHECK +// Exclusive of: None +// Requries: None +// +//***************************************************************************** +//#define FORCED_UPDATE_KEY GPIO_LOCK_KEY +//#define FORCED_UPDATE_KEY GPIO_LOCK_KEY_DD + +//***************************************************************************** +// +// Selects the UART as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: UART_AUTOBAUD or UART_FIXED_BAUDRATE, BUFFER_SIZE +// +//***************************************************************************** +//#define UART_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables automatic baud rate detection. This can be used if the crystal +// frequency is unknown, or if operation at different baud rates is desired. +// +// Depends on: UART_ENABLE_UPDATE +// Exclusive of: UART_FIXED_BAUDRATE +// Requires: None +// +//***************************************************************************** +//#define UART_AUTOBAUD + +//***************************************************************************** +// +// Selects the baud rate to be used for the UART. +// +// Depends on: UART_ENABLE_UPDATE, CRYSTAL_FREQ +// Exclusive of: UART_AUTOBAUD +// Requires: None +// +//***************************************************************************** +//#define UART_FIXED_BAUDRATE 115200 + +//***************************************************************************** +// +// Selects the SSI port as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: BUFFER_SIZE +// +//***************************************************************************** +//#define SSI_ENABLE_UPDATE + +//***************************************************************************** +// +// Selects the I2C port as the port for communicating with the boot loader. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: I2C_SLAVE_ADDR, BUFFER_SIZE +// +//***************************************************************************** +//#define I2C_ENABLE_UPDATE + +//***************************************************************************** +// +// Specifies the I2C address of the boot loader. +// +// Depends on: I2C_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define I2C_SLAVE_ADDR 0x42 + +//***************************************************************************** +// +// Selects Ethernet update via the BOOTP/TFTP protocol. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, I2C_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: CRYSTAL_FREQ +// +//***************************************************************************** +//#define ENET_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables the use of the Ethernet status LED outputs to indicate traffic and +// connection status. +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_ENABLE_LEDS + +//***************************************************************************** +// +// Specifies the hard coded MAC address for the Ethernet interface. There are +// six individual values (ENET_MAC_ADDR0 through ENET_MAC_ADDR5) that provide +// the six bytes of the MAC address, where ENET_MAC_ADDR0 though ENET_MAC_ADDR2 +// provide the organizationally unique identifier (OUI) and ENET_MAC_ADDR3 +// through ENET_MAC_ADDR5 provide the extension identifier. If these values +// are not provided, the MAC address will be extracted from the user registers. +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_MAC_ADDR0 0x00 +//#define ENET_MAC_ADDR1 0x00 +//#define ENET_MAC_ADDR2 0x00 +//#define ENET_MAC_ADDR3 0x00 +//#define ENET_MAC_ADDR4 0x00 +//#define ENET_MAC_ADDR5 0x00 + +//***************************************************************************** +// +// Specifies the name of the BOOTP server from which to request information. +// The use of this specifier allows a board-specific BOOTP server to co-exist +// on a network with the DHCP server that may be part of the network +// infrastructure. The BOOTP server provided by Texas Instruments requires +// that this be set to "stellaris". +// +// Depends on: ENET_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define ENET_BOOTP_SERVER "stellaris" + +//***************************************************************************** +// +// Selects USB update via Device Firmware Update class. +// +// Depends on: None +// Exclusive of: CAN_ENABLE_UPDATE, ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, +// SSI_ENABLE_UPDATE, UART_ENABLE_UPDATE, +// Requires: CRYSTAL_FREQ, USB_VENDOR_ID, USB_PRODUCT_ID, USB_DEVICE_ID, +// USB_MAX_POWER +// +//***************************************************************************** +#define USB_ENABLE_UPDATE + +//***************************************************************************** +// +// The USB vendor ID published by the DFU device. This value is the TI +// Tiva vendor ID. Change this to the vendor ID you have been assigned by the +// USB-IF. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_VENDOR_ID 0x1cbe + +//***************************************************************************** +// +// The USB device ID published by the DFU device. If you are using your own +// vendor ID, chose a device ID that is different from the ID you use in +// non-update operation. If you have sublicensed TI's vendor ID, you must +// use an assigned product ID here. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_PRODUCT_ID 0x00FF + +//***************************************************************************** +// +// Selects the BCD USB device release number published in the device +// descriptor. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DEVICE_ID 0x0001 + +//***************************************************************************** +// +// Sets the maximum power consumption that the DFU device will report to the +// USB host in the configuration descriptor. Units are milliamps. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_MAX_POWER 150 + +//***************************************************************************** +// +// Specifies whether the DFU device reports to the host that it is self-powered +// (defined as 0) or bus-powered (defined as 1). +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_BUS_POWERED 1 + +//***************************************************************************** +// +// Specifies whether the target board uses a multiplexer to select between USB +// host and device modes. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_MUX_PERIPH, USB_MUX_PORT, USB_MUX_PIN, USB_MUX_DEVICE +// +//***************************************************************************** +//#define USB_HAS_MUX + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used to select +// between USB host and device modes. The value is of the form +// SYSCTL_RCGC2_GPIOx, where GPIOx represents the required GPIO port. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PERIPH SYSCTL_RCGC2_GPIOH + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used to select between +// USB host and device modes. The value is of the form GPIO_PORTx_BASE, where +// PORTx represents the required GPIO port. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PORT GPIO_PORTH_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used to select between USB host and device +// modes. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_PIN 2 + +//***************************************************************************** +// +// Specifies the state of the GPIO pin required to select USB device-mode +// operation. Valid values are 0 (low) or 1 (high). +// +// Depends on: USB_ENABLE_UPDATE, USB_HAS_MUX +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define USB_MUX_DEVICE 1 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for VBUS. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_VBUS_PERIPH, USB_VBUS_PORT, USB_VBUS_PIN +// +//***************************************************************************** +#define USB_VBUS_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for VBUS. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_VBUS_PERIPH SYSCTL_RCGCGPIO_R1 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for VBUS. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_VBUS_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for VBUS. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_VBUS_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_VBUS_PIN 1 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for ID. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_ID_PERIPH, USB_ID_PORT, USB_ID_PIN +// +//***************************************************************************** +#define USB_ID_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for ID. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_ID_PERIPH SYSCTL_RCGCGPIO_R1 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for ID. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_ID_PORT GPIO_PORTB_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for ID. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_ID_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_ID_PIN 0 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for DP. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_DP_PERIPH, USB_DP_PORT, USB_DP_PIN +// +//***************************************************************************** +#define USB_DP_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for DP. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DP_PERIPH SYSCTL_RCGCGPIO_R10 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for DP. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DP_PORT GPIO_PORTL_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for DP. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_DP_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DP_PIN 6 + +//***************************************************************************** +// +// Specifies whether the target board requires configuration of the pin used +// for DM. This applies to Blizzard class and later devices. +// +// Depends on: USB_ENABLE_UPDATE +// Exclusive of: None +// Requires: USB_DM_PERIPH, USB_DM_PORT, USB_DM_PIN +// +//***************************************************************************** +#define USB_DM_CONFIG + +//***************************************************************************** +// +// Specifies the GPIO peripheral containing the pin which is used for DM. +// The value is of the form SYSCTL_RCGCGPIO_Rx, where the Rx represents +// the required GPIO port. This applies to Blizzard class and later +// devices. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DM_PERIPH SYSCTL_RCGCGPIO_R10 + +//***************************************************************************** +// +// Specifies the GPIO port containing the pin which is used for DM. The value +// is of the form GPIO_PORTx_BASE, where PORTx represents the required GPIO +// port. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DM_PORT GPIO_PORTL_BASE + +//***************************************************************************** +// +// Specifies the GPIO pin number used for DM. Valid values are 0 through 7. +// +// Depends on: USB_ENABLE_UPDATE, USB_DM_CONFIG +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +#define USB_DM_PIN 7 + +//***************************************************************************** +// +// Selects an update via the CAN port. +// +// Depends on: None +// Exclusive of: ENET_ENABLE_UPDATE, I2C_ENABLE_UPDATE, SSI_ENABLE_UPDATE, +// UART_ENABLE_UPDATE, USB_ENABLE_UPDATE +// Requires: CAN_RX_PERIPH, CAN_RX_PORT, CAN_RX_PIN, CAN_TX_PERIPH, +// CAN_TX_PORT, CAN_TX_PIN, CAN_BIT_RATE, CRYSTAL_FREQ. +// +//***************************************************************************** +//#define CAN_ENABLE_UPDATE + +//***************************************************************************** +// +// Enables the UART to CAN bridging for use when the CAN port is selected for +// communicating with the boot loader. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_UART_BRIDGE + +//***************************************************************************** +// +// The GPIO module to enable in order to configure the CAN0 Rx pin. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// CAN_RX_PORT. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PERIPH SYSCTL_RCGC2_GPIOA + +//***************************************************************************** +// +// The GPIO port used to configure the CAN0 Rx pin. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for CAN_RX_PERIPH. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PORT GPIO_PORTA_BASE + +//***************************************************************************** +// +// The GPIO pin that is shared with the CAN0 Rx pin. This is a value between 0 +// and 7. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_RX_PIN 4 + +//***************************************************************************** +// +// The GPIO module to enable in order to configure the CAN0 Tx pin. This will +// be one of the SYSCTL_RCGC2_GPIOx values, where "x" is replaced with the port +// name (such as B). The value of "x" should match the value of "x" for +// CAN_TX_PORT. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PERIPH SYSCTL_RCGC2_GPIOA + +//***************************************************************************** +// +// The GPIO port used to configure the CAN0 Tx pin. This will be one of the +// GPIO_PORTx_BASE values, where "x" is replaced with the port name (such as +// B). The value of "x" should match the value of "x" for CAN_TX_PERIPH. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PORT GPIO_PORTA_BASE + +//***************************************************************************** +// +// The GPIO pin that is shared with the CAN0 Tx pin. This is a value between 0 +// and 7. +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_TX_PIN 5 + +//***************************************************************************** +// +// The bit rate used on the CAN bus. This must be one of 20000, 50000, 125000, +// 250000, 500000, or 1000000. The CAN bit rate must be less than or equal to +// the crystal frequency divided by 8 (CRYSTAL_FREQ / 8). +// +// Depends on: CAN_ENABLE_UPDATE +// Exclusive of: None +// Requires: None +// +//***************************************************************************** +//#define CAN_BIT_RATE 1000000 + +//***************************************************************************** +// +// Performs application-specific low level hardware initialization on system +// reset. If hooked, this function will be called immediately after the boot +// loader code relocation completes. An application may perform any required +// low-level hardware initialization during this function. Note that the +// system clock has not been set when this function is called. Initialization +// that assumes the system clock is set may be performed in the BL_INIT_FN_HOOK +// function instead. +// +// void MyHwInitFunc(void); +// +//***************************************************************************** +//#define BL_HW_INIT_FN_HOOK MyHwInitFunc + +//***************************************************************************** +// +// Performs application-specific initialization on system reset. If hooked, +// this function will be called during boot loader initialization to perform +// any board- or application-specific initialization which is required. The +// function is called following a reset immediately after the selected boot +// loader peripheral has been configured and the system clock has been set. +// +// void MyInitFunc(void); +// +//***************************************************************************** +//#define BL_INIT_FN_HOOK MyInitFunc + +//***************************************************************************** +// +// Performs application-specific reinitialization on boot loader entry via SVC. +// If hooked, this function will be called during boot loader reinitialization +// to perform any board- or application-specific initialization which is +// required. The function is called following boot loader entry from an +// application, after any system clock rate adjustments have been made. +// +// void MyReinitFunc(void); +// +//***************************************************************************** +//#define BL_REINIT_FN_HOOK MyReinitFunc + +//***************************************************************************** +// +// Informs an application that a download is starting. If hooked, this +// function will be called when a firmware download is about to begin. The +// function is called after the first data packet of the download is received +// but before it has been written to flash. +// +// void MyStartFunc(void); +// +//***************************************************************************** +//#define BL_START_FN_HOOK MyStartFunc + +//***************************************************************************** +// +// Informs an application of download progress. If hooked, this function will +// be called periodically during a firmware download to provide progress +// information. The function is called after each data packet is received from +// the host. Parameters provide the number of bytes of data received and, in +// cases other than Ethernet update, the expected total number of bytes in the +// download (the TFTP protocol used by the Ethernet boot loader does not send +// the final image size before the download starts so in this case the ulTotal +// parameter is set to 0 to indicate that the size is unknown). +// +// void MyProgressFunc(unsigned long ulCompleted, unsigned long ulTotal); +// +//***************************************************************************** +//#define BL_PROGRESS_FN_HOOK MyProgressFunc + +//***************************************************************************** +// +// Informs an application that a download has completed. If hooked, this +// function will be called when a firmware download has just completed. The +// function is called after the final data packet of the download has been +// written to flash. +// +// void MyEndFunc(void); +// +//***************************************************************************** +//#define BL_END_FN_HOOK MyEndFunc + +//***************************************************************************** +// +// Allows an application to perform in-place data decryption during download. +// If hooked, this function will be called to perform in-place decryption of +// each data packet received during a firmware download. +// +// void MyDecryptionFunc(unsigned char *pucBuffer, unsigned long ulSize); +// +// This value takes precedence over ENABLE_DECRYPTION. If both are defined, +// the hook function defined using BL_DECRYPT_FN_HOOK is called rather than the +// previously-defined DecryptData() stub function. +// +//***************************************************************************** +//#define BL_DECRYPT_FN_HOOK MyDecryptionFunc + +//***************************************************************************** +// +// Allows an application to force a new firmware download. If hooked, this +// function will be called during boot loader initialization to determine +// whether a firmware update should be performed regardless of whether a valid +// main code image is already present. If the function returns 0, the existing +// main code image is booted (if present), otherwise the boot loader will wait +// for a new firmware image to be downloaded. +// +// unsigned long MyCheckUpdateFunc(void); +// +// This value takes precedence over ENABLE_UPDATE_CHECK} if both are defined. +// If you wish to perform a GPIO check in addition to any other update check +// processing required, the GPIO code must be included within the hook function +// itself. +// +//***************************************************************************** +//#define BL_CHECK_UPDATE_FN_HOOK MyCheckUpdateFunc + +//***************************************************************************** +// +// Allows an application to replace the flash block erase function. If hooked, +// this function will be called whenever a block of flash is to be erased. The +// function must erase the block and wait until the operation has completed. +// The size of the block which will be erased is defined by FLASH_BLOCK_SIZE. +// +// void MyFlashEraseFunc(unsigned long ulBlockAddr); +// +//***************************************************************************** +//#define BL_FLASH_ERASE_FN_HOOK MyFlashEraseFunc + +//***************************************************************************** +// +// Allows an application to replace the flash programming function. If hooked, +// this function will be called to program the flash with firmware image data +// received during download operations. The function must program the supplied +// data and wait until the operation has completed. +// +// void MyFlashProgramFunc(unsigned long ulDstAddr, +// unsigned char *pucSrcData, +// unsigned long ulLength); +// +//***************************************************************************** +//#define BL_FLASH_PROGRAM_FN_HOOK MyFlashProgramFunc + +//***************************************************************************** +// +// Allows an application to replace the flash error clear function. If hooked, +// this function must clear any flash error indicators and prepare to detect +// access violations that may occur in a future erase or program operations. +// +// void MyFlashClearErrorFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_CL_ERR_FN_HOOK MyFlashClearErrorFunc + +//***************************************************************************** +// +// Reports whether or not a flash access violation error has occurred. If +// hooked, this function will be called after flash erase or program +// operations. The return code indicates whether or not an access violation +// error occurred since the last call to the function defined by +// BL_FLASH_CL_ERR_FN_HOOK, with 0 indicating no errors and non-zero indicating +// an error. +// +// unsigned long MyFlashErrorFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_ERROR_FN_HOOK MyFlashErrorFunc + +//***************************************************************************** +// +// Reports the total size of the device flash. If hooked, this function will +// be called to determine the size of the supported flash device. The return +// code is the number of bytes of flash in the device. Note that this does not +// take into account any reserved space defined via the FLASH_RSVD_SPACE value. +// +// unsigned long MyFlashSizeFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_SIZE_FN_HOOK MyFlashSizeFunc + +//***************************************************************************** +// +// Reports the address of the first byte after the end of the device flash. If +// hooked, this function will be called to determine the address of the end of +// valid flash. Note that this does not take into account any reserved space +// defined via the FLASH_RSVD_SPACE value. +// +// unsigned long MyFlashEndFunc(void); +// +//***************************************************************************** +//#define BL_FLASH_END_FN_HOOK MyFlashEndFunc + +//***************************************************************************** +// +// Checks whether the start address and size of an image are valid. If hooked, +// this function will be called when a new firmware download is about to start. +// Parameters provided are the requested start address for the new download +// and, when using protocols which transmit the image length in advance, the +// size of the image that is to be downloaded. The return code will be +// non-zero to indicate that the start address is valid and the image will fit +// in the available space, or 0 if either the address is invalid or the image +// is too large for the device. +// +// unsigned long MyFlashAddrCheckFunc(unsigned long ulAddr, +// unsigned long ulSize); +// +//***************************************************************************** +//#define BL_FLASH_AD_CHECK_FN_HOOK MyFlashAddrCheckFunc + +#endif // __BL_CONFIG_H__ diff --git a/boards/ek-lm4f232/boot_usb/boot_usb.ewd b/boards/ek-lm4f232/boot_usb/boot_usb.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/boot_usb.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/boot_usb/boot_usb.ewp b/boards/ek-lm4f232/boot_usb/boot_usb.ewp new file mode 100644 index 0000000..37c0aa7 --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/boot_usb.ewp @@ -0,0 +1,821 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Source + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_autobaud.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_can.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_check.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_crc32.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_decrypt.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_emac.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_flash.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_i2c.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_main.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_packet.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_ssi.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_startup_ewarm.S + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_uart.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_usb.c + + + $PROJ_DIR$\..\..\..\..\boot_loader\bl_usbfuncs.c + + + diff --git a/boards/ek-lm4f232/boot_usb/boot_usb.uvopt b/boards/ek-lm4f232/boot_usb/boot_usb.uvopt new file mode 100644 index 0000000..565fa51 --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/boot_usb.uvopt @@ -0,0 +1,450 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + boot_usb + 0x4 + ARM-ADS + + 16000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S2 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_autobaud.c + bl_autobaud.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_can.c + bl_can.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_check.c + bl_check.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_crc32.c + bl_crc32.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_decrypt.c + bl_decrypt.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_emac.c + bl_emac.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_flash.c + bl_flash.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_i2c.c + bl_i2c.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_main.c + bl_main.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_packet.c + bl_packet.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_ssi.c + bl_ssi.c + + + 1 + 12 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_startup_rvmdk.S + bl_startup_rvmdk.S + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_uart.c + bl_uart.c + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_usb.c + bl_usb.c + + + 1 + 15 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\boot_loader\bl_usbfuncs.c + bl_usbfuncs.c + + + + + Documentation + 1 + 0 + 0 + + 2 + 16 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + ..\..\..\..\boot_loader\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + ..\..\..\..\boot_loader\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/boot_usb/boot_usb.uvproj b/boards/ek-lm4f232/boot_usb/boot_usb.uvproj new file mode 100644 index 0000000..2b7c93b --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/boot_usb.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + boot_usb + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(16000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + boot_usb + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + armcc --device DLM -I . -E -o bl_config.inc ..\..\..\..\boot_loader\bl_config.c + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\boot_usb.bin .\rvmdk\boot_usb.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + .;..\..\..\..;..\..\..\..\boot_loader; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + ..\..\..\..\boot_loader\bl_link.sct + + + --entry Reset_Handler + + + + + + + + Source + + + bl_autobaud.c + 1 + ..\..\..\..\boot_loader\bl_autobaud.c + + + bl_can.c + 1 + ..\..\..\..\boot_loader\bl_can.c + + + bl_check.c + 1 + ..\..\..\..\boot_loader\bl_check.c + + + bl_crc32.c + 1 + ..\..\..\..\boot_loader\bl_crc32.c + + + bl_decrypt.c + 1 + ..\..\..\..\boot_loader\bl_decrypt.c + + + bl_emac.c + 1 + ..\..\..\..\boot_loader\bl_emac.c + + + bl_flash.c + 1 + ..\..\..\..\boot_loader\bl_flash.c + + + bl_i2c.c + 1 + ..\..\..\..\boot_loader\bl_i2c.c + + + bl_main.c + 1 + ..\..\..\..\boot_loader\bl_main.c + + + bl_packet.c + 1 + ..\..\..\..\boot_loader\bl_packet.c + + + bl_ssi.c + 1 + ..\..\..\..\boot_loader\bl_ssi.c + + + bl_startup_rvmdk.S + 2 + ..\..\..\..\boot_loader\bl_startup_rvmdk.S + + + bl_uart.c + 1 + ..\..\..\..\boot_loader\bl_uart.c + + + bl_usb.c + 1 + ..\..\..\..\boot_loader\bl_usb.c + + + bl_usbfuncs.c + 1 + ..\..\..\..\boot_loader\bl_usbfuncs.c + + + + + Documentation + + + readme.txt + 5 + ..\..\..\..\boot_loader\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/boot_usb/ccs/.ccsimportspec b/boards/ek-lm4f232/boot_usb/ccs/.ccsimportspec new file mode 100644 index 0000000..34afca1 --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/ccs/.ccsimportspec @@ -0,0 +1,6 @@ + + + + + + diff --git a/boards/ek-lm4f232/boot_usb/ccs/.ccsproject b/boards/ek-lm4f232/boot_usb/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_usb/ccs/.cproject b/boards/ek-lm4f232/boot_usb/ccs/.cproject new file mode 100644 index 0000000..88dfbcb --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_usb/ccs/.project b/boards/ek-lm4f232/boot_usb/ccs/.project new file mode 100644 index 0000000..94250c3 --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/ccs/.project @@ -0,0 +1,115 @@ + + + boot_usb + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + boot_loader/bl_autobaud.c + 1 + SW_ROOT/boot_loader/bl_autobaud.c + + + boot_loader/bl_can.c + 1 + SW_ROOT/boot_loader/bl_can.c + + + boot_loader/bl_check.c + 1 + SW_ROOT/boot_loader/bl_check.c + + + boot_loader/bl_crc32.c + 1 + SW_ROOT/boot_loader/bl_crc32.c + + + boot_loader/bl_decrypt.c + 1 + SW_ROOT/boot_loader/bl_decrypt.c + + + boot_loader/bl_emac.c + 1 + SW_ROOT/boot_loader/bl_emac.c + + + boot_loader/bl_flash.c + 1 + SW_ROOT/boot_loader/bl_flash.c + + + boot_loader/bl_i2c.c + 1 + SW_ROOT/boot_loader/bl_i2c.c + + + boot_loader/bl_link_ccs.cmd + 1 + SW_ROOT/boot_loader/bl_link_ccs.cmd + + + boot_loader/bl_main.c + 1 + SW_ROOT/boot_loader/bl_main.c + + + boot_loader/bl_packet.c + 1 + SW_ROOT/boot_loader/bl_packet.c + + + boot_loader/bl_ssi.c + 1 + SW_ROOT/boot_loader/bl_ssi.c + + + boot_loader/bl_startup_ccs.s + 1 + SW_ROOT/boot_loader/bl_startup_ccs.s + + + boot_loader/bl_uart.c + 1 + SW_ROOT/boot_loader/bl_uart.c + + + boot_loader/bl_usb.c + 1 + SW_ROOT/boot_loader/bl_usb.c + + + boot_loader/bl_usbfuncs.c + 1 + SW_ROOT/boot_loader/bl_usbfuncs.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/boot_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/boot_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/boot_usb/ccs/Debug/boot_usb.bin b/boards/ek-lm4f232/boot_usb/ccs/Debug/boot_usb.bin new file mode 100644 index 0000000..304fed8 Binary files /dev/null and b/boards/ek-lm4f232/boot_usb/ccs/Debug/boot_usb.bin differ diff --git a/boards/ek-lm4f232/boot_usb/ccs/Debug/boot_usb.out b/boards/ek-lm4f232/boot_usb/ccs/Debug/boot_usb.out new file mode 100644 index 0000000..67814bf Binary files /dev/null and b/boards/ek-lm4f232/boot_usb/ccs/Debug/boot_usb.out differ diff --git a/boards/ek-lm4f232/boot_usb/ccs/macros.ini_initial b/boards/ek-lm4f232/boot_usb/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/boot_usb/ccs/target_config.ccxml b/boards/ek-lm4f232/boot_usb/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/boot_usb/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/boot_usb/ewarm/Exe/boot_usb.bin b/boards/ek-lm4f232/boot_usb/ewarm/Exe/boot_usb.bin new file mode 100644 index 0000000..dd07b1d Binary files /dev/null and b/boards/ek-lm4f232/boot_usb/ewarm/Exe/boot_usb.bin differ diff --git a/boards/ek-lm4f232/boot_usb/ewarm/Exe/boot_usb.out b/boards/ek-lm4f232/boot_usb/ewarm/Exe/boot_usb.out new file mode 100644 index 0000000..a81534e Binary files /dev/null and b/boards/ek-lm4f232/boot_usb/ewarm/Exe/boot_usb.out differ diff --git a/boards/ek-lm4f232/boot_usb/gcc/boot_usb.axf b/boards/ek-lm4f232/boot_usb/gcc/boot_usb.axf new file mode 100644 index 0000000..accdbe2 Binary files /dev/null and b/boards/ek-lm4f232/boot_usb/gcc/boot_usb.axf differ diff --git a/boards/ek-lm4f232/boot_usb/gcc/boot_usb.bin b/boards/ek-lm4f232/boot_usb/gcc/boot_usb.bin new file mode 100644 index 0000000..ed269be Binary files /dev/null and b/boards/ek-lm4f232/boot_usb/gcc/boot_usb.bin differ diff --git a/boards/ek-lm4f232/boot_usb/rvmdk/boot_usb.axf b/boards/ek-lm4f232/boot_usb/rvmdk/boot_usb.axf new file mode 100644 index 0000000..3cb27d4 Binary files /dev/null and b/boards/ek-lm4f232/boot_usb/rvmdk/boot_usb.axf differ diff --git a/boards/ek-lm4f232/boot_usb/rvmdk/boot_usb.bin b/boards/ek-lm4f232/boot_usb/rvmdk/boot_usb.bin new file mode 100644 index 0000000..1175813 Binary files /dev/null and b/boards/ek-lm4f232/boot_usb/rvmdk/boot_usb.bin differ diff --git a/boards/ek-lm4f232/drivers/buttons.c b/boards/ek-lm4f232/drivers/buttons.c new file mode 100644 index 0000000..9dc9ce9 --- /dev/null +++ b/boards/ek-lm4f232/drivers/buttons.c @@ -0,0 +1,186 @@ +//***************************************************************************** +// +// buttons.c - Evaluation board driver for push buttons. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "buttons.h" + +//***************************************************************************** +// +//! \addtogroup buttons_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Holds the current, debounced state of each button. A 0 in a bit indicates +// that that button is currently pressed, otherwise it is released. +// We assume that we start with all the buttons released (though if one is +// pressed when the application starts, this will be detected). +// +//***************************************************************************** +static uint8_t g_ui8ButtonStates = ALL_BUTTONS; + +//***************************************************************************** +// +//! Polls the current state of the buttons and determines which have changed. +//! +//! \param pui8Delta points to a character that will be written to indicate +//! which button states changed since the last time this function was called. +//! This value is derived from the debounced state of the buttons. +//! \param pui8RawState points to a location where the raw button state will +//! be stored. +//! +//! This function should be called periodically by the application to poll the +//! pushbuttons. It determines both the current debounced state of the buttons +//! and also which buttons have changed state since the last time the function +//! was called. +//! +//! In order for button debouncing to work properly, this function should be +//! caled at a regular interval, even if the state of the buttons is not needed +//! that often. +//! +//! If button debouncing is not required, the the caller can pass a pointer +//! for the \e pui8RawState parameter in order to get the raw state of the +//! buttons. The value returned in \e pui8RawState will be a bit mask where +//! a 1 indicates the buttons is pressed. +//! +//! \return Returns the current debounced state of the buttons where a 1 in the +//! button ID's position indicates that the button is pressed and a 0 +//! indicates that it is released. +// +//***************************************************************************** +uint8_t +ButtonsPoll(uint8_t *pui8Delta, uint8_t *pui8RawState) +{ + uint32_t ui32Delta; + uint32_t ui32Data; + static uint8_t ui8SwitchClockA = 0; + static uint8_t ui8SwitchClockB = 0; + + // + // Read the raw state of the push buttons. Save the raw state + // (inverting the bit sense) if the caller supplied storage for the + // raw value. + // + ui32Data = (MAP_GPIOPinRead(BUTTONS_GPIO_BASE, ALL_BUTTONS)); + if(pui8RawState) + { + *pui8RawState = (uint8_t)~ui32Data; + } + + // + // Determine the switches that are at a different state than the debounced + // state. + // + ui32Delta = ui32Data ^ g_ui8ButtonStates; + + // + // Increment the clocks by one. + // + ui8SwitchClockA ^= ui8SwitchClockB; + ui8SwitchClockB = ~ui8SwitchClockB; + + // + // Reset the clocks corresponding to switches that have not changed state. + // + ui8SwitchClockA &= ui32Delta; + ui8SwitchClockB &= ui32Delta; + + // + // Get the new debounced switch state. + // + g_ui8ButtonStates &= ui8SwitchClockA | ui8SwitchClockB; + g_ui8ButtonStates |= (~(ui8SwitchClockA | ui8SwitchClockB)) & ui32Data; + + // + // Determine the switches that just changed debounced state. + // + ui32Delta ^= (ui8SwitchClockA | ui8SwitchClockB); + + // + // Store the bit mask for the buttons that have changed for return to + // caller. + // + if(pui8Delta) + { + *pui8Delta = (uint8_t)ui32Delta; + } + + // + // Return the debounced buttons states to the caller. Invert the bit + // sense so that a '1' indicates the button is pressed, which is a + // sensible way to interpret the return value. + // + return(~g_ui8ButtonStates); +} + +//***************************************************************************** +// +//! Initializes the GPIO pins used by the board pushbuttons. +//! +//! This function must be called during application initialization to +//! configure the GPIO pins to which the pushbuttons are attached. It enables +//! the port used by the buttons and configures each button GPIO as an input +//! with a weak pull-up. +//! +//! \return None. +// +//***************************************************************************** +void +ButtonsInit(void) +{ + // + // Enable the GPIO port to which the pushbuttons are connected. + // + MAP_SysCtlPeripheralEnable(BUTTONS_GPIO_PERIPH); + + // + // Set each of the button GPIO pins as an input with a pull-up. + // + MAP_GPIODirModeSet(BUTTONS_GPIO_BASE, ALL_BUTTONS, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(BUTTONS_GPIO_BASE, ALL_BUTTONS, + GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); + + // + // Initialize the debounced button state with the current state read from + // the GPIO bank. + // + g_ui8ButtonStates = MAP_GPIOPinRead(BUTTONS_GPIO_BASE, ALL_BUTTONS); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/ek-lm4f232/drivers/buttons.h b/boards/ek-lm4f232/drivers/buttons.h new file mode 100644 index 0000000..fa52fa4 --- /dev/null +++ b/boards/ek-lm4f232/drivers/buttons.h @@ -0,0 +1,103 @@ +//***************************************************************************** +// +// buttons.h - Prototypes for the evaluation board buttons driver. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __BUTTONS_H__ +#define __BUTTONS_H__ + +//***************************************************************************** +// +// Defines for the hardware resources used by the pushbuttons. +// +// The switches are on the following ports/pins: +// +// PM0 - Up +// PM1 - Down +// PM2 - Left +// PM3 - Right +// PM4 - Select/Wake +// +// The switches tie the GPIO to ground, so the GPIOs need to be configured +// with pull-ups, and a value of 0 means the switch is pressed. +// +//***************************************************************************** +#define BUTTONS_GPIO_PERIPH SYSCTL_PERIPH_GPIOM +#define BUTTONS_GPIO_BASE GPIO_PORTM_BASE + +#define NUM_BUTTONS 5 +#define UP_BUTTON GPIO_PIN_0 +#define DOWN_BUTTON GPIO_PIN_1 +#define LEFT_BUTTON GPIO_PIN_2 +#define RIGHT_BUTTON GPIO_PIN_3 +#define SELECT_BUTTON GPIO_PIN_4 + +#define ALL_BUTTONS (LEFT_BUTTON | RIGHT_BUTTON | UP_BUTTON | \ + DOWN_BUTTON | SELECT_BUTTON) + +//***************************************************************************** +// +// Useful macros for detecting button events. +// +//***************************************************************************** +#define BUTTON_PRESSED(button, buttons, changed) \ + (((button) & (changed)) && ((button) & (buttons))) + +#define BUTTON_RELEASED(button, buttons, changed) \ + (((button) & (changed)) && !((button) & (buttons))) + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Functions exported from buttons.c +// +//***************************************************************************** +extern void ButtonsInit(void); +extern uint8_t ButtonsPoll(uint8_t *pui8Delta, + uint8_t *pui8Raw); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** + +#endif // __BUTTONS_H__ diff --git a/boards/ek-lm4f232/drivers/cfal96x64x16.c b/boards/ek-lm4f232/drivers/cfal96x64x16.c new file mode 100644 index 0000000..1036643 --- /dev/null +++ b/boards/ek-lm4f232/drivers/cfal96x64x16.c @@ -0,0 +1,816 @@ +//***************************************************************************** +// +// cfal96x64x16.c - Display driver for the Crystalfontz CFAL9664-F-B1 OLED +// display with an SSD1332. This version uses an SSI +// interface to the display controller. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup display_api +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/gpio.h" +#include "driverlib/ssi.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/pin_map.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +// Defines the SSI and GPIO peripherals that are used for this display. +// +//***************************************************************************** +#define DISPLAY_SSI_PERIPH SYSCTL_PERIPH_SSI2 +#define DISPLAY_SSI_GPIO_PERIPH SYSCTL_PERIPH_GPIOH +#define DISPLAY_RST_GPIO_PERIPH SYSCTL_PERIPH_GPIOG + +//***************************************************************************** +// +// Defines the GPIO pin configuration macros for the pins that are used for +// the SSI function. +// +//***************************************************************************** +#define DISPLAY_PINCFG_SSICLK GPIO_PH4_SSI2CLK +#define DISPLAY_PINCFG_SSIFSS GPIO_PH5_SSI2FSS +#define DISPLAY_PINCFG_SSITX GPIO_PH7_SSI2TX + +//***************************************************************************** +// +// Defines the port and pins for the SSI peripheral. +// +//***************************************************************************** +#define DISPLAY_SSI_PORT GPIO_PORTH_BASE +#define DISPLAY_SSI_PINS (GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7) + +//***************************************************************************** +// +// Defines the port and pins for the display voltage enable signal. +// +//***************************************************************************** +#define DISPLAY_ENV_PORT GPIO_PORTG_BASE +#define DISPLAY_ENV_PIN GPIO_PIN_0 + +//***************************************************************************** +// +// Defines the port and pins for the display reset signal. +// +//***************************************************************************** +#define DISPLAY_RST_PORT GPIO_PORTG_BASE +#define DISPLAY_RST_PIN GPIO_PIN_1 + +//***************************************************************************** +// +// Defines the port and pins for the display Data/Command (D/C) signal. +// +//***************************************************************************** +#define DISPLAY_D_C_PORT GPIO_PORTH_BASE +#define DISPLAY_D_C_PIN GPIO_PIN_6 + +//***************************************************************************** +// +// Defines the SSI peripheral used and the data speed. +// +//***************************************************************************** +#define DISPLAY_SSI_BASE SSI2_BASE // SSI2 +#define DISPLAY_SSI_CLOCK 4000000 + +//***************************************************************************** +// +// An array that holds a set of commands that are sent to the display when +// it is initialized. +// +//***************************************************************************** +static +uint8_t g_ui8DisplayInitCommands[] = +{ +// 0xAE, // display off + 0x87, 0x07, // master control current 7/16 + 0x81, 0xA0, // contrast A control + 0x82, 0x60, // contrast B control + 0x83, 0xB0, // contrast C control + 0xA0, 0x20,//00 // remap and data format - use 8-bit color mode + 0xBB, 0x1F, // Vpa + 0xBC, 0x1F, // Vpb + 0xBD, 0x1F, // Vpc +// 0xAD, 0x8E, // internal Vp, external supply + 0x26, 0x01, // rectangle fill enabled + 0xAF // display on +}; +#define NUM_INIT_BYTES sizeof(g_ui8DisplayInitCommands) + +//***************************************************************************** +// +// Translates a 24-bit RGB color to a display driver-specific color. +// +// \param c is the 24-bit RGB color. The least-significant byte is the blue +// channel, the next byte is the green channel, and the third byte is the red +// channel. +// +// This macro translates a 24-bit RGB color into a value that can be written +// into the display's frame buffer in order to reproduce that color, or the +// closest possible approximation of that color. +// +// \return Returns the display-driver specific color. +// +// 24-bit format: XXXX XXXX RRRR RRRR GGGG GGGG BBBB BBBB +// 16-bit format: ---- ---- ---- ---- RRRR RGGG GGGB BBBB +// 8-bit format: ---- ---- ---- ---- ---- ---- RRRG GGBB +// +// +//***************************************************************************** +#define DPYCOLORTRANSLATE16(c) ((((c) & 0x00f80000) >> 8) | \ + (((c) & 0x0000fc00) >> 5) | \ + (((c) & 0x000000f8) >> 3)) +#define DPYCOLORTRANSLATE8(c) ((((c) & 0x00e00000) >> 16) | \ + (((c) & 0x0000e000) >> 11) | \ + (((c) & 0x000000c0) >> 6)) +#define DPYCOLORTRANSLATE DPYCOLORTRANSLATE8 + +//***************************************************************************** +// +//! Write a set of command bytes to the display controller. +// +//! \param pi8Cmd is a pointer to a set of command bytes. +//! \param ui32Count is the count of command bytes. +//! +//! This function provides a way to send multiple command bytes to the display +//! controller. It can be used for single commands, or multiple commands +//! chained together in a buffer. It will wait for any previous operation to +//! finish, and then copy all the command bytes to the controller. It will +//! not return until the last command byte has been written to the SSI FIFO, +//! but data could still be shifting out to the display controller when this +//! function returns. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16WriteCommand(const uint8_t *pi8Cmd, uint32_t ui32Count) +{ + // + // Wait for any previous SSI operation to finish. + // + while(ROM_SSIBusy(DISPLAY_SSI_BASE)) + { + } + + // + // Set the D/C pin low to indicate command + // + ROM_GPIOPinWrite(DISPLAY_D_C_PORT, DISPLAY_D_C_PIN, 0); + + // + // Send all the command bytes to the display + // + while(ui32Count--) + { + ROM_SSIDataPut(DISPLAY_SSI_BASE, *pi8Cmd); + pi8Cmd++; + } +} + +//***************************************************************************** +// +//! Write a set of data bytes to the display controller. +// +//! \param pi8Data is a pointer to a set of data bytes, containing pixel data. +//! \param ui32Count is the count of command bytes. +//! +//! This function provides a way to send a set of pixel data to the display. +//! The data will draw pixels according to whatever the most recent col, row +//! settings are for the display. It will wait for any previous operation to +//! finish, and then copy all the data bytes to the controller. It will +//! not return until the last data byte has been written to the SSI FIFO, +//! but data could still be shifting out to the display controller when this +//! function returns. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16WriteData(const uint8_t *pi8Data, uint32_t ui32Count) +{ + // + // Wait for any previous SSI operation to finish. + // + while(ROM_SSIBusy(DISPLAY_SSI_BASE)) + { + } + + // + // Set the D/C pin high to indicate data + // + ROM_GPIOPinWrite(DISPLAY_D_C_PORT, DISPLAY_D_C_PIN, DISPLAY_D_C_PIN); + + // + // Send all the data bytes to the display + // + while(ui32Count--) + { + ROM_SSIDataPut(DISPLAY_SSI_BASE, *pi8Data); + pi8Data++; + } +} + +//***************************************************************************** +// +//! Draws a pixel on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X is the X coordinate of the pixel. +//! \param i32Y is the Y coordinate of the pixel. +//! \param ui32Value is the color of the pixel. +//! +//! This function sets the given pixel to a particular color. The coordinates +//! of the pixel are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16PixelDraw(void *pvDisplayData, int32_t i32X, int32_t i32Y, + uint32_t ui32Value) +{ + uint8_t ui8Cmd[8]; + + // + // Load column command, start and end column + // + ui8Cmd[0] = 0x15; + ui8Cmd[1] = (uint8_t)i32X; + ui8Cmd[2] = (uint8_t)i32X; + + // + // Load row command, start and end row + // + ui8Cmd[3] = 0x75; + ui8Cmd[4] = (uint8_t)i32Y; + ui8Cmd[5] = (uint8_t)i32Y; + + // + // Send the column, row commands to the display + // + CFAL96x64x16WriteCommand(ui8Cmd, 6); + + // + // Send the data value representing the pixel to the display + // + CFAL96x64x16WriteData((uint8_t *)&ui32Value, 1); +} + +//***************************************************************************** +// +//! Draws a horizontal sequence of pixels on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X is the X coordinate of the first pixel. +//! \param i32Y is the Y coordinate of the first pixel. +//! \param i32X0 is sub-pixel offset within the pixel data, which is valid for 1 +//! or 4 bit per pixel formats. +//! \param i32Count is the number of pixels to draw. +//! \param i32BPP is the number of bits per pixel; must be 1, 4, or 8 optionally +//! ORed with various flags unused by this driver. +//! \param pui8Data is a pointer to the pixel data. For 1 and 4 bit per pixel +//! formats, the most significant bit(s) represent the left-most pixel. +//! \param pui8Palette is a pointer to the palette used to draw the pixels. +//! +//! This function draws a horizontal sequence of pixels on the screen, using +//! the supplied palette. For 1 bit per pixel format, the palette contains +//! pre-translated colors; for 4 and 8 bit per pixel formats, the palette +//! contains 24-bit RGB values that must be translated before being written to +//! the display. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16PixelDrawMultiple(void *pvDisplayData, int32_t i32X, int32_t i32Y, int32_t i32X0, + int32_t i32Count, int32_t i32BPP, + const uint8_t *pui8Data, + const uint8_t *pui8Palette) +{ + uint32_t ui32Byte; + uint8_t ui8Cmd[8]; + + // + // Load column command. Use the specified X for the start and just set + // the end to the rightmost column since we dont know where the data ends. + // + ui8Cmd[0] = 0x15; + ui8Cmd[1] = (uint8_t)i32X; + ui8Cmd[2] = 95; + + // + // Load row command. Use the specified Y for the start row and just set + // the end row to the bottom row since we dont know where the data ends. + // + ui8Cmd[3] = 0x75; + ui8Cmd[4] = (uint8_t)i32Y; + ui8Cmd[5] = 63; + + // + // Send the column, row commands to the display + // + CFAL96x64x16WriteCommand(ui8Cmd, 6); + + // + // Determine how to interpret the pixel data based on the number of bits + // per pixel. + // + switch(i32BPP & 0xFF) + { + // + // The pixel data is in 1 bit per pixel format. + // + case 1: + { + // + // Loop while there are more pixels to draw. + // + while(i32Count) + { + // + // Get the next byte of image data. + // + ui32Byte = *pui8Data++; + + // + // Loop through the pixels in this byte of image data. + // + for(; (i32X0 < 8) && i32Count; i32X0++, i32Count--) + { + // + // Draw this pixel in the appropriate color. + // + uint8_t ui8BPP = ((uint32_t *)pui8Palette) + [(ui32Byte >> (7 - i32X0)) & 1]; + CFAL96x64x16WriteData(&ui8BPP, 1); + } + + // + // Start at the beginning of the next byte of image data. + // + i32X0 = 0; + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 4 bit per pixel format. + // + case 4: + { + // + // Loop while there are more pixels to draw. "Duff's device" is + // used to jump into the middle of the loop if the first nibble of + // the pixel data should not be used. Duff's device makes use of + // the fact that a case statement is legal anywhere within a + // sub-block of a switch statement. See + // http://en.wikipedia.org/wiki/Duff's_device for detailed + // information about Duff's device. + // + switch(i32X0 & 1) + { + case 0: + while(i32Count) + { + uint8_t ui8Color; + + // + // Get the upper nibble of the next byte of pixel data + // and extract the corresponding entry from the + // palette. + // + ui32Byte = (*pui8Data >> 4) * 3; + ui32Byte = (*(uint32_t *)(pui8Palette + ui32Byte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + ui8Color = DPYCOLORTRANSLATE(ui32Byte); + CFAL96x64x16WriteData(&ui8Color, 1); + + // + // Decrement the count of pixels to draw. + // + i32Count--; + + // + // See if there is another pixel to draw. + // + if(i32Count) + { + case 1: + // + // Get the lower nibble of the next byte of pixel + // data and extract the corresponding entry from + // the palette. + // + ui32Byte = (*pui8Data++ & 15) * 3; + ui32Byte = (*(uint32_t *)(pui8Palette + ui32Byte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + ui8Color = DPYCOLORTRANSLATE(ui32Byte); + CFAL96x64x16WriteData(&ui8Color, 1); + + // + // Decrement the count of pixels to draw. + // + i32Count--; + } + } + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 8 bit per pixel format. + // + case 8: + { + // + // Loop while there are more pixels to draw. + // + while(i32Count--) + { + uint8_t ui8Color; + + // + // Get the next byte of pixel data and extract the + // corresponding entry from the palette. + // + ui32Byte = *pui8Data++ * 3; + ui32Byte = *(uint32_t *)(pui8Palette + ui32Byte) & 0x00ffffff; + + // + // Translate this palette entry and write it to the screen. + // + ui8Color = DPYCOLORTRANSLATE(ui32Byte); + CFAL96x64x16WriteData(&ui8Color, 1); + } + + // + // The image data has been drawn. + // + break; + } + } +} + +//***************************************************************************** +// +//! Draws a horizontal line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X1 is the X coordinate of the start of the line. +//! \param i32X2 is the X coordinate of the end of the line. +//! \param i32Y is the Y coordinate of the line. +//! \param ui32Value is the color of the line. +//! +//! This function draws a horizontal line on the display. The coordinates of +//! the line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16LineDrawH(void *pvDisplayData, int32_t i32X1, int32_t i32X2, int32_t i32Y, + uint32_t ui32Value) +{ + uint8_t ui8LineBuf[16]; + unsigned int uIdx; + + // + // Send command for starting row and column + // + ui8LineBuf[0] = 0x15; + ui8LineBuf[1] = i32X1 < i32X2 ? i32X1 : i32X2; + ui8LineBuf[2] = 95; + ui8LineBuf[3] = 0x75; + ui8LineBuf[4] = i32Y; + ui8LineBuf[5] = 63; + CFAL96x64x16WriteCommand(ui8LineBuf, 6); + + // + // Use buffer of pixels to draw line, so multiple bytes can be sent at + // one time. Fill the buffer with the line color. + // + for(uIdx = 0; uIdx < sizeof(ui8LineBuf); uIdx++) + { + ui8LineBuf[uIdx] = ui32Value; + } + + uIdx = (i32X1 < i32X2) ? (i32X2 - i32X1) : (i32X1 - i32X2); + uIdx += 1; + while(uIdx) + { + CFAL96x64x16WriteData(ui8LineBuf, (uIdx < 16) ? uIdx : 16); + uIdx -= (uIdx < 16) ? uIdx : 16; + } +} + +//***************************************************************************** +// +//! Draws a vertical line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param i32X is the X coordinate of the line. +//! \param i32Y1 is the Y coordinate of the start of the line. +//! \param i32Y2 is the Y coordinate of the end of the line. +//! \param ui32Value is the color of the line. +//! +//! This function draws a vertical line on the display. The coordinates of the +//! line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16LineDrawV(void *pvDisplayData, int32_t i32X, int32_t i32Y1, int32_t i32Y2, + uint32_t ui32Value) +{ + uint8_t ui8LineBuf[16]; + unsigned int uIdx; + + // + // Send command for starting row and column. Also, set vertical + // address increment. + // + ui8LineBuf[0] = 0x15; + ui8LineBuf[1] = i32X; + ui8LineBuf[2] = 95; + ui8LineBuf[3] = 0x75; + ui8LineBuf[4] = i32Y1 < i32Y2 ? i32Y1 : i32Y2; + ui8LineBuf[5] = 63; + ui8LineBuf[6] = 0xA0; + ui8LineBuf[7] = 0x21; + CFAL96x64x16WriteCommand(ui8LineBuf, 8); + + // + // Use buffer of pixels to draw line, so multiple bytes can be sent at + // one time. Fill the buffer with the line color. + // + for(uIdx = 0; uIdx < sizeof(ui8LineBuf); uIdx++) + { + ui8LineBuf[uIdx] = ui32Value; + } + + uIdx = (i32Y1 < i32Y2) ? (i32Y2 - i32Y1) : (i32Y1 - i32Y2); + uIdx += 1; + while(uIdx) + { + CFAL96x64x16WriteData(ui8LineBuf, (uIdx < 16) ? uIdx : 16); + uIdx -= (uIdx < 16) ? uIdx : 16; + } + + // + // Restore horizontal address increment + // + ui8LineBuf[0] = 0xA0; + ui8LineBuf[1] = 0x20; + CFAL96x64x16WriteCommand(ui8LineBuf, 2); +} + +//***************************************************************************** +// +//! Fills a rectangle. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param pRect is a pointer to the structure describing the rectangle. +//! \param ui32Value is the color of the rectangle. +//! +//! This function fills a rectangle on the display. The coordinates of the +//! rectangle are assumed to be within the extents of the display, and the +//! rectangle specification is fully inclusive (in other words, both i16XMin and +//! i16XMax are drawn, aint32_t with i16YMin and i16YMax). +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16RectFill(void *pvDisplayData, const tRectangle *pRect, + uint32_t ui32Value) +{ + unsigned int uY; + + for(uY = pRect->i16YMin; uY <= pRect->i16YMax; uY++) + { + CFAL96x64x16LineDrawH(0, pRect->i16XMin, pRect->i16XMax, uY, ui32Value); + } +} + +//***************************************************************************** +// +//! Translates a 24-bit RGB color to a display driver-specific color. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param ui32Value is the 24-bit RGB color. The least-significant byte is the +//! blue channel, the next byte is the green channel, and the third byte is the +//! red channel. +//! +//! This function translates a 24-bit RGB color into a value that can be +//! written into the display's frame buffer in order to reproduce that color, +//! or the closest possible approximation of that color. +//! +//! \return Returns the display-driver specific color. +// +//***************************************************************************** +static uint32_t +CFAL96x64x16ColorTranslate(void *pvDisplayData, uint32_t ui32Value) +{ + // + // Translate from a 24-bit RGB color to a 3-3-2 RGB color. + // + return(DPYCOLORTRANSLATE(ui32Value)); +} + +//***************************************************************************** +// +//! Flushes any cached drawing operations. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! +//! This functions flushes any cached drawing operations to the display. This +//! is useful when a local frame buffer is used for drawing operations, and the +//! flush would copy the local frame buffer to the display. Since no memory +//! based frame buffer is used for this driver, the flush is a no operation. +//! +//! \return None. +// +//***************************************************************************** +static void +CFAL96x64x16Flush(void *pvDisplayData) +{ + // + // There is nothing to be done. + // +} + +//***************************************************************************** +// +//! The display structure that describes the driver for the Crystalfontz +//! CFAL9664-F-B1 OLED panel with SSD 1332 controller. +// +//***************************************************************************** +const tDisplay g_sCFAL96x64x16 = +{ + sizeof(tDisplay), + 0, + 96, + 64, + CFAL96x64x16PixelDraw, + CFAL96x64x16PixelDrawMultiple, + CFAL96x64x16LineDrawH, + CFAL96x64x16LineDrawV, + CFAL96x64x16RectFill, + CFAL96x64x16ColorTranslate, + CFAL96x64x16Flush +}; + +//***************************************************************************** +// +//! Initializes the display driver. +//! +//! This function initializes the SSD1332 display controller on the panel, +//! preparing it to display data. +//! +//! \return None. +// +//***************************************************************************** +void +CFAL96x64x16Init(void) +{ + tRectangle sRect; + + // + // Enable the peripherals used by this driver + // + ROM_SysCtlPeripheralEnable(DISPLAY_SSI_PERIPH); + ROM_SysCtlPeripheralEnable(DISPLAY_SSI_GPIO_PERIPH); + ROM_SysCtlPeripheralEnable(DISPLAY_RST_GPIO_PERIPH); + + // + // Select the SSI function for the appropriate pins + // + ROM_GPIOPinConfigure(DISPLAY_PINCFG_SSICLK); + ROM_GPIOPinConfigure(DISPLAY_PINCFG_SSIFSS); + ROM_GPIOPinConfigure(DISPLAY_PINCFG_SSITX); + + + // + // Configure the pins for the SSI function + // + ROM_GPIOPinTypeSSI(DISPLAY_SSI_PORT, DISPLAY_SSI_PINS); + + // + // Configure display control pins as GPIO output + // + ROM_GPIOPinTypeGPIOOutput(DISPLAY_RST_PORT, DISPLAY_RST_PIN); + ROM_GPIOPinTypeGPIOOutput(DISPLAY_ENV_PORT, DISPLAY_ENV_PIN); + ROM_GPIOPinTypeGPIOOutput(DISPLAY_D_C_PORT, DISPLAY_D_C_PIN); + + // + // Reset pin high, power off + // + ROM_GPIOPinWrite(DISPLAY_RST_PORT, DISPLAY_RST_PIN, DISPLAY_RST_PIN); + ROM_GPIOPinWrite(DISPLAY_ENV_PORT, DISPLAY_ENV_PIN, 0); + ROM_SysCtlDelay(1000); + + // + // Drive the reset pin low while we do other stuff + // + ROM_GPIOPinWrite(DISPLAY_RST_PORT, DISPLAY_RST_PIN, 0); + + // + // Configure the SSI port + // + ROM_SSIDisable(DISPLAY_SSI_BASE); + ROM_SSIConfigSetExpClk(DISPLAY_SSI_BASE, ROM_SysCtlClockGet(), + SSI_FRF_MOTO_MODE_3, SSI_MODE_MASTER, + DISPLAY_SSI_CLOCK, 8); + ROM_SSIEnable(DISPLAY_SSI_BASE); + + // + // Take the display out of reset + // + ROM_SysCtlDelay(1000); + ROM_GPIOPinWrite(DISPLAY_RST_PORT, DISPLAY_RST_PIN, DISPLAY_RST_PIN); + ROM_SysCtlDelay(1000); + + // + // Enable display power supply + // + ROM_GPIOPinWrite(DISPLAY_ENV_PORT, DISPLAY_ENV_PIN, DISPLAY_ENV_PIN); + ROM_SysCtlDelay(1000); + + // + // Send the initial configuration command bytes to the display + // + CFAL96x64x16WriteCommand(g_ui8DisplayInitCommands, + sizeof(g_ui8DisplayInitCommands)); + ROM_SysCtlDelay(1000); + + // + // Fill the entire display with a black rectangle, to clear it. + // + sRect.i16XMin = 0; + sRect.i16XMax = 95; + sRect.i16YMin = 0; + sRect.i16YMax = 63; + CFAL96x64x16RectFill(0, &sRect, 0); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/ek-lm4f232/drivers/cfal96x64x16.h b/boards/ek-lm4f232/drivers/cfal96x64x16.h new file mode 100644 index 0000000..880be00 --- /dev/null +++ b/boards/ek-lm4f232/drivers/cfal96x64x16.h @@ -0,0 +1,37 @@ +//***************************************************************************** +// +// cfal96x64x16.h - Prototypes for the Crystalfontz CFAL9664-F-B1 OLED display +// with an SSD1332 controller. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __CFAL96X64X16_H__ +#define __CFAL96X64X16_H__ + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** +extern void CFAL96x64x16Init(void); +extern const tDisplay g_sCFAL96x64x16; + +#endif // __CFAL96X64X16_H__ diff --git a/boards/ek-lm4f232/drivers/slidemenuwidget.c b/boards/ek-lm4f232/drivers/slidemenuwidget.c new file mode 100644 index 0000000..805b77b --- /dev/null +++ b/boards/ek-lm4f232/drivers/slidemenuwidget.c @@ -0,0 +1,1424 @@ +//***************************************************************************** +// +// slidemenuwidget.c - A sliding menu drawing widget. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "utils/uartstdio.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "slidemenuwidget.h" + +//***************************************************************************** +// +//! \addtogroup slidemenuwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// This is a custom widget for drawing a menu system on the display. The +// widget presents the menus using a "sliding" animation. The menu items +// are shown in a vertical list, and as the user scrolls through the list +// of menu items, the menu slides up and down the display. When a menu item +// is selected to descend in the menu tree, the widget slides the old menu +// off the to left while the new menu slides in from the right. Likewise, +// going up in the menu tree, the higher level menu slides back onto the +// screen from the left. +// +// Additional structures are provided to implement a menu, and menu items. +// Each menu contains menu items, and each menu item can have a child menu. +// These structures can be used to build a menu tree. The menu widget will +// show one menu at any given time, the menu that is displayed on the screen. +// +// In addition to child menus, any menu item can have instead a child widget. +// If this is used, then when the user selects a menu item, a new widget can +// be activated to perform some function. When the function of the child +// widget completes, then the widget slides back off the screen (to the right) +// and the parent menu is displayed again. +// +// A given menu can have menu items that are individually selectable or +// multiple-selectable. For individually selectable menu items, the item +// is selected by leaving the menu with the focus on the selected item. For +// example navigating down to a submenu with choices A, B and C, and then +// navigating until the focus is on item B will cause item B to be selected. +// The menu will remember that item B was selected even when navigating away +// from that menu. +// +// If a menu is configured to be multiple-selectable, then each menu item has +// a check box that is checked by pressing the select button. When the item +// is selected the box will show an X. Any or all or none can be selected in +// this way. When a menu is configured to be multi-selectable, the menu items +// cannot have any child menus or widgets. +// +// The menu widget provides some visual clues to the user about how to +// navigate the menu tree. Whenever a menu item has a child menu or child +// widget, then a small right arrow is shown on the right side of the menu +// item that has the focus. This tells the user to press the "right" button +// to descend to the next menu or widget. When it is possible to go up a +// level in the menu tree (when showing a child menu), a small left arrow +// will be shown on the menu item with the focus. This is an indication to the +// user that they should press the "left" button. +// +// This widget is meant to work with key/button presses. It expects there +// to be up/down/left/right and select buttons. The widget will need to be +// modified in order to work with a pointer input. +// +// In order to perform the sliding animation, the menu widget requires that +// it be provided with two off-screen displays. The menu widget renders the +// two menus (the old and the new) into the two buffers, and then repeatedly +// paints both to the physical display while adjusting the coordinates as +// appropriate. This will cause the menus to appear animated and move across +// the display. When the menus are being animated, the menu widget is taking +// all the non-interrupt processor time in order to draw the buffers to the +// display. This operation occurs in response to the widget processing of the +// key/button events and will occur in the thread that calls +// WidgetMessageQueueProcess(). The programmer should be aware of this +// processing burden when designing an application that uses the sliding +// menu widget. +// +//***************************************************************************** + +//***************************************************************************** +// +// A graphics image of a small right arrow icon. +// +//***************************************************************************** +const uint8_t g_ui8RtArrow[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 4, 0, + 8, 0, + + 0x80, + 0xC0, + 0xE0, + 0xF0, + 0xE0, + 0xC0, + 0x80, + 0 +}; + +//***************************************************************************** +// +// A graphics image of a small left arrow icon. +// +//***************************************************************************** +const uint8_t g_ui8LtArrow[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 4, 0, + 8, 0, + + 0x10, + 0x30, + 0x70, + 0xF0, + 0x70, + 0x30, + 0x10, + 0 +}; + +//***************************************************************************** +// +// A graphics image of a small unchecked box icon. +// +//***************************************************************************** +const uint8_t g_ui8Unchecked[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 7, 0, + 8, 0, + + 0xFE, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0xFE, + 0 +}; + +//***************************************************************************** +// +// A graphics image of a small checked box icon. +// +//***************************************************************************** +const uint8_t g_ui8Checked[] = +{ + IMAGE_FMT_1BPP_UNCOMP, + 7, 0, + 8, 0, + + 0xFE, + 0xC6, + 0xAA, + 0x92, + 0xAA, + 0xC6, + 0xFE, + 0 +}; + +//***************************************************************************** +// +//! Draws the current menu into a drawing context, off-screen buffer. +//! +//! \param psMenuWidget points at the SlideMenuWidget being processed. +//! \param psContext points to the context where all drawing should be done. +//! \param i32OffsetY is the Y offset for drawing the menu. +//! +//! This function renders a menu (set of menu items), into a drawing context. +//! It assumes that the drawing context is an off-screen buffer, and that +//! the entire buffer belongs to this widget. The vertical position of the +//! menu can be adjusted by using the parameter i32OffsetY. This value can be +//! positive or negative and can cause the menu to be rendered above or below +//! the normal position in the display. +//! +//! \return None. +// +//***************************************************************************** +void +SlideMenuDraw(tSlideMenuWidget *psMenuWidget, tContext *psContext, + int32_t i32OffsetY) +{ + tSlideMenu *psMenu; + uint32_t ui32Idx; + tRectangle sRect; + + // + // Check the arguments + // + ASSERT(psMenuWidget); + ASSERT(psContext); + + // + // Set the foreground color for the rectangle fill to match what we want + // as the menu background. + // + GrContextForegroundSet(psContext, psMenuWidget->ui32ColorBackground); + GrRectFill(psContext, &psContext->sClipRegion); + + // + // Get the current menu that is being displayed + // + psMenu = psMenuWidget->psSlideMenu; + + // + // Set the foreground to the color we want for the menu item boundaries + // and text color, text font. + // + GrContextForegroundSet(psContext, psMenuWidget->ui32ColorForeground); + GrContextFontSet(psContext, psMenuWidget->psFont); + + // + // Set the rectangle bounds for the first menu item. + // The starting Y value is calculated based on which menu item is currently + // centered. Y coordinates are subtracted to find the Y start location + // of the first menu item, which could even be off the display. + // + // Set the X coords of the menu item to the extents of the display + // + sRect.i16XMin = 0; + sRect.i16XMax = psContext->sClipRegion.i16XMax; + + // + // Find the Y coordinate of the centered menu item + // + sRect.i16YMin = (psContext->psDisplay->ui16Height / 2) - + (psMenuWidget->ui32MenuItemHeight / 2); + + // + // Adjust to find Y coordinate of first menu item + // + sRect.i16YMin -= psMenu->ui32CenterIndex * psMenuWidget->ui32MenuItemHeight; + + // + // Now adjust for the offset that was passed in by caller. This allows + // for drawing menu items above or below the main display. + // + sRect.i16YMin += i32OffsetY; + + // + // Find the ending Y coordinate of first menu item + // + sRect.i16YMax = sRect.i16YMin + psMenuWidget->ui32MenuItemHeight - 1; + + // + // Start the index at the first menu item. It is possible that this + // menu item is off the display. + // + ui32Idx = 0; + + // + // Loop through all menu items, drawing on the display. Note that some + // may not be on the screen, but they will be clipped. + // + while(ui32Idx < psMenu->ui32Items) + { + // + // If this index is the one that is highlighted, then change the + // background + // + if(ui32Idx == psMenu->ui32FocusIndex) + { + // + // Set the foreground to the highlight color, and fill the + // rectangle of the background of this menu item. + // + GrContextForegroundSet(psContext, psMenuWidget->ui32ColorHighlight); + GrRectFill(psContext, &sRect); + + // + // Set the new foreground to the normal foreground color, and + // set the background to the highlight color. This is so + // remaining drawing operations will have the correct background + // and foreground colors for this highlighted menu item cell. + // + GrContextForegroundSet(psContext, psMenuWidget->ui32ColorForeground); + GrContextBackgroundSet(psContext, psMenuWidget->ui32ColorHighlight); + + // + // If this menu has a parent, then draw a left arrow icon on the + // focused menu item. + // + if(psMenu->psParent) + { + GrImageDraw(psContext, g_ui8LtArrow, sRect.i16XMin + 4, + sRect.i16YMin + + (psMenuWidget->ui32MenuItemHeight / 2) - 4); + } + + // + // If this menu has a child menu or child widget, then draw a + // right arrow icon on the focused menu item. + // + if(psMenu->psSlideMenuItems[ui32Idx].psChildMenu || + psMenu->psSlideMenuItems[ui32Idx].psChildWidget) + { + GrImageDraw(psContext, g_ui8RtArrow, sRect.i16XMax - 8, + sRect.i16YMin + + (psMenuWidget->ui32MenuItemHeight / 2) - 4); + } + } + + // + // Otherwise this is a normal, non-highlighted menu item cell, + // so set the normal background color. + // + else + { + GrContextBackgroundSet(psContext, psMenuWidget->ui32ColorBackground); + } + + // + // If the current menu is multi-selectable, then draw a checkbox on + // the menu item. Draw a checked or unchecked box depending on whether + // the item has been selected. + // + if(psMenu->bMultiSelectable) + { + if(psMenu->ui32SelectedFlags & (1 << ui32Idx)) + { + GrImageDraw(psContext, g_ui8Checked, sRect.i16XMax - 12, + sRect.i16YMin + + (psMenuWidget->ui32MenuItemHeight / 2) - 4); + } + else + { + GrImageDraw(psContext, g_ui8Unchecked, sRect.i16XMax - 12, + sRect.i16YMin + + (psMenuWidget->ui32MenuItemHeight / 2) - 4); + } + + } + + // + // Draw the rectangle representing the menu item + // + GrRectDraw(psContext, &sRect); + + // + // Draw the text for this menu item in the middle of the menu item + // rectangle (cell). + // + GrStringDrawCentered(psContext, + psMenu->psSlideMenuItems[ui32Idx].pcText, + -1, + psMenuWidget->sBase.psDisplay->ui16Width / 2, + sRect.i16YMin + \ + (psMenuWidget->ui32MenuItemHeight / 2) - 1, 0); + + // + // Advance to the next menu item, and update the menu item rectangle + // bounds to the next position + // + ui32Idx++; + sRect.i16YMin += psMenuWidget->ui32MenuItemHeight; + sRect.i16YMax += psMenuWidget->ui32MenuItemHeight; + + // + // Note that this may attempt to render menu items that run off the + // bottom of the drawing area, but these will just be clipped and a + // little bit of processing time is wasted. + // + } +} + +//***************************************************************************** +// +//! Paints a menu, menu items on a display. +//! +//! \param psWidget is a pointer to the slide menu widget to be drawn. +//! +//! This function draws the contents of a slide menu on the display. This is +//! called in response to a \b WIDGET_MSG_PAINT message. +//! +//! \return None. +// +//***************************************************************************** +static void +SlideMenuPaint(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tContext sContext; + + // + // Check the arguments. + // + ASSERT(psWidget); + + // + // If this widget has a child widget, that means that the menu has + // slid off the screen and the child widget is in control. Therefore + // there is nothing to paint here. Just exit and the child widget will + // be painted. + // + if(psWidget->psChild) + { + return; + } + + // + // Convert the generic widget pointer into a slide menu widget pointer, + // and get a pointer to its context. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Render the menu into the off-screen buffer, using normal vertical + // position. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Now copy the rendered menu into the physical display. This will show + // the menu on the display. + // + GrImageDraw(&sContext, psMenuWidget->psDisplayA->pvDisplayData, + psWidget->sPosition.i16XMin, psWidget->sPosition.i16YMin); +} + +//***************************************************************************** +// +//! Performs the sliding menu operation, in response to the "down" button. +//! +//! \param psWidget is a pointer to the slide menu widget to move down. +//! +//! This function will respond to the "down" key/button event. The down +//! button is used to select the next menu item down the list, and the effect +//! is that the menu itself slides up, leaving the highlighted menu item +//! in the middle of the screen. +//! +//! This function repeatedly draws the menu onto the display until the sliding +//! animation is finished and will not return to the caller until then. This +//! function is usually called from the thread context of +//! WidgetMessageQueueProcess(). +//! +//! \return Returns a non-zero value if the menu was moved or was not moved +//! because it is already at the last position. If a child widget is active +//! then this function does nothing and returns a 0. +// +//***************************************************************************** +static int32_t +SlideMenuDown(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tSlideMenu *psMenu; + tContext sContext; + uint32_t ui32MenuHeight; + uint32_t ui32Y; + + // + // If this menu widget has a child widget, that means the child widget + // is in control of the display, and there is nothing to do here. + // + if(psWidget->psChild) + { + return(0); + } + + // + // Get handy pointers to the menu widget, and the menu that is currently + // displayed. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + psMenu = psMenuWidget->psSlideMenu; + + // + // If we are already at the end of the list of menu items, then there + // is nothing else to do. + // + if(psMenu->ui32FocusIndex >= (psMenu->ui32Items - 1)) + { + return(1); + } + + // + // Increment focus menu item. This has the effect of selecting the next + // menu item in the list. + // + psMenu->ui32FocusIndex++; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Render the menu into the off-screen buffer. This will be the same + // menu appearance as before, except the highlighted item has changed + // to the next menu item down. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Draw a continuation of this menu in the second offscreen buffer. + // This is the part of the menu that would be drawn if the display were + // twice as tall. We are effectively creating a virtual display that is + // twice as tall as the physical display. + // + GrContextInit(&sContext, psMenuWidget->psDisplayB); + SlideMenuDraw(psMenuWidget, &sContext, -1 * + (psMenuWidget->sBase.sPosition.i16YMax - + psMenuWidget->sBase.sPosition.i16YMin)); + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Get the height of the displayed part of the menu. + // + ui32MenuHeight = psMenuWidget->psDisplayA->ui16Height; + + // + // Now copy the rendered menu into the physical display + // + // Iterate over the Y displacement of one menu item cell. This loop + // will repeatedly draw both off screen buffers to the physical display, + // adjusting the position of each by one pixel each time it is drawn. Each + // time the offset is changed so that both buffers are drawn one higher + // than the previous time. This will have the effect of "sliding" the + // entire menu up by the height of one menu item cell. + // The speed of the animation is controlled entirely by the speed of the + // processor and the speed of the interface to the physical display. + // + for(ui32Y = 0; ui32Y <= psMenuWidget->ui32MenuItemHeight; ui32Y++) + { + GrImageDraw(&sContext, psMenuWidget->psDisplayA->pvDisplayData, + psWidget->sPosition.i16XMin, + psWidget->sPosition.i16YMin - ui32Y); + GrImageDraw(&sContext, psMenuWidget->psDisplayB->pvDisplayData, + psWidget->sPosition.i16XMin, + psWidget->sPosition.i16YMin + ui32MenuHeight - ui32Y); + } + + // + // Increment centered menu item. This will now match the menu item with + // the focus. When the menu is repainted again, the newly selected + // menu item will be centered and highlighted. + // + psMenu->ui32CenterIndex = psMenu->ui32FocusIndex; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Render the menu into the off-screen buffer. This will be the same + // menu appearance as before, except the highlighted item has changed + // to the next menu item down. Now when a repaint occurs the menu + // will be redrawn with the newly highlighted menu item. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Return indication that we handled the key event. + // + return(1); +} + +//***************************************************************************** +// +//! Performs the sliding menu operation, in response to the "up" button. +//! +//! \param psWidget is a pointer to the slide menu widget to move up. +//! +//! This function will respond to the "up" key/button event. The up +//! button is used to select the previous menu item down the list, and the +//! effect is that the menu itself slides down, leaving the highlighted menu +//! item in the middle of the screen. +//! +//! This function repeatedly draws the menu onto the display until the sliding +//! animation is finished and will not return to the caller until then. This +//! function is usually called from the thread context of +//! WidgetMessageQueueProcess(). +//! +//! \return Returns a non-zero value if the menu was moved or was not moved +//! because it is already at the first position. If a child widget is active +//! then this function does nothing and returns a 0. +// +//***************************************************************************** +static int32_t +SlideMenuUp(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tSlideMenu *psMenu; + tContext sContext; + uint32_t ui32MenuHeight; + uint32_t ui32Y; + + // + // If this menu widget has a child widget, that means the child widget + // is in control of the display, and there is nothing to do here. + // + if(psWidget->psChild) + { + return(0); + } + + // + // Get handy pointers to the menu widget, and the menu that is currently + // displayed. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + psMenu = psMenuWidget->psSlideMenu; + + // + // If we are already at the start of the list of menu items, then there + // is nothing else to do. + // + if(psMenu->ui32FocusIndex == 0) + { + return(1); + } + + // + // Decrement the focus menu item. This has the effect of selecting the + // previous menu item in the list. + // + psMenu->ui32FocusIndex--; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Render the menu into the off-screen buffer. This will be the same + // menu appearance as before, except the highlighted item has changed + // to the previous menu item up. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Draw a continuation of this menu in the second offscreen buffer. + // This is the part of the menu that would be drawn above this menu if the + // display were twice as tall. We are effectively creating a virtual + // display that is twice as tall as the physical display. + // + GrContextInit(&sContext, psMenuWidget->psDisplayB); + SlideMenuDraw(psMenuWidget, &sContext, + (psMenuWidget->sBase.sPosition.i16YMax - + psMenuWidget->sBase.sPosition.i16YMin)); + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Get the height of the displayed part of the menu. + // + ui32MenuHeight = psMenuWidget->psDisplayA->ui16Height; + + // + // Now copy the rendered menu into the physical display + // + // Iterate over the Y displacement of one menu item cell. This loop + // will repeatedly draw both off screen buffers to the physical display, + // adjusting the position of each by one pixel each time it is drawn. Each + // time the offset is changed so that both buffers are drawn one lower + // than the previous time. This will have the effect of "sliding" the + // entire menu down by the height of one menu item cell. + // The speed of the animation is controlled entirely by the speed of the + // processor and the speed of the interface to the physical display. + // + for(ui32Y = 0; ui32Y <= psMenuWidget->ui32MenuItemHeight; ui32Y++) + { + GrImageDraw(&sContext, psMenuWidget->psDisplayB->pvDisplayData, + psWidget->sPosition.i16XMin, + psWidget->sPosition.i16YMin + ui32Y - ui32MenuHeight); + GrImageDraw(&sContext, psMenuWidget->psDisplayA->pvDisplayData, + psWidget->sPosition.i16XMin, + psWidget->sPosition.i16YMin + ui32Y); + } + + // + // Decrement the centered menu item. This will now match the menu item + // with the focus. When the menu is repainted again, the newly selected + // menu item will be centered and highlighted. + // + psMenu->ui32CenterIndex = psMenu->ui32FocusIndex; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Render the menu into the off-screen buffer. This will be the same + // menu appearance as before, except the highlighted item has changed + // to the next menu item up. Now when a repaint occurs the menu + // will be redrawn with the newly highlighted menu item. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Return indication that we handled the key event. + // + return(1); +} + +//***************************************************************************** +// +//! Performs the sliding menu operation, in response to the "right" button. +//! +//! \param psWidget is a pointer to the slide menu widget to move to the right. +//! +//! This function will respond to the "right" key/button event. The right +//! button is used to select the next menu level below the current menu item, +//! or a widget that is activated by the menu item. The effect is that the +//! menu itself slides off to the left, and the new menu or widget slides in +//! from the right. +//! +//! This function repeatedly draws the menu onto the display until the sliding +//! animation is finished and will not return to the caller until then. This +//! function is usually called from the thread context of +//! WidgetMessageQueueProcess(). +//! +//! \return Returns a non-zero value if the menu was moved or was not moved +//! because it is already at the last position. If a child widget is active +//! then this function does nothing and returns a 0. +// +//***************************************************************************** +static int32_t +SlideMenuRight(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tSlideMenu *psMenu; + tSlideMenu *psChildMenu; + tContext sContext; + tWidget *psChildWidget; + uint32_t ui32X; + uint32_t ui32MenuWidth; + + // + // If this menu widget has a child widget, that means the child widget + // is in control of the display, and there is nothing to do here. + // + if(psWidget->psChild) + { + return(0); + } + + // + // Get handy pointers to the menu widget, and the current menu, and the + // child menu and widget if they exist. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + psMenu = psMenuWidget->psSlideMenu; + psChildMenu = psMenu->psSlideMenuItems[psMenu->ui32FocusIndex].psChildMenu; + psChildWidget = psMenu->psSlideMenuItems[psMenu->ui32FocusIndex].psChildWidget; + + // + // Initialize a context for the secondary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayB); + + // + // Render the current menu into off-screen buffer B. This + // will be the same menu appearance as is already being shown. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Now set up context for drawing into off-screen buffer A + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + + // + // Process child menu of this menu item + // + if(psChildMenu) + { + // + // Switch the active menu for this SlideMenuWidget to be the child + // menu + // + psMenuWidget->psSlideMenu = psChildMenu; + + // + // Draw the new (child) menu into off-screen buffer A + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + } + + // + // Process child widget of this menu item. This only happens if there + // is no child menu. + // + else if(psChildWidget) + { + // + // Call the widget activated callback function. This will notify + // the application that a child widget has been activated by the + // menu system. + // + if(psMenuWidget->pfnActive) + { + psMenuWidget->pfnActive(psChildWidget, + &psMenu->psSlideMenuItems[psMenu->ui32FocusIndex], + 1); + } + + // + // Link the new child widget into this SlideMenuWidget so + // it appears as a child to this widget. Normally the menu widget + // has no child widget. + // + psWidget->psChild = psChildWidget; + psChildWidget->psParent = psWidget; + + // + // Fill a rectangle with the new child widget background color. + // This is done in off-screen buffer A. When the menu slides off, + // it will be replaced by a blank background that will then be + // controlled by the new child widget. + // + GrContextForegroundSet( + &sContext, + psMenu->psSlideMenuItems[psMenu->ui32FocusIndex].ui32ChildWidgetColor); + GrRectFill(&sContext, &sContext.sClipRegion); + + // + // Request a repaint for the child widget so it can draw itself once + // the menu slide is done. + // + WidgetPaint(psChildWidget); + } + + // + // There is no child menu or child widget, so there is nothing to change + // on the display. + // + else + { + return(1); + } + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Get the width of the menu widget which is used in calculations below + // + ui32MenuWidth = psMenuWidget->psDisplayA->ui16Width; + + // + // The following loop draws the two off-screen buffers onto the physical + // display using a right-to-left-wipe. This will provide an appearance + // of sliding to the left. The new child menu, or child widget background + // will slide in from the right. The "old" menu is being held in + // off-screen buffer B and the new one is in buffer A. So when we are + // done, the correct image will be in buffer A. + // + for(ui32X = 0; ui32X <= ui32MenuWidth; ui32X += 8) + { + GrImageDraw(&sContext, psMenuWidget->psDisplayB->pvDisplayData, + psWidget->sPosition.i16XMin - ui32X, + psWidget->sPosition.i16YMin); + GrImageDraw(&sContext, psMenuWidget->psDisplayA->pvDisplayData, + psWidget->sPosition.i16XMin + ui32MenuWidth - ui32X, + psWidget->sPosition.i16YMin); + } + + // + // Return indication that we handled the key event. + // + return(1); +} + +//***************************************************************************** +// +//! Performs the sliding menu operation, in response to the "left" button. +//! +//! \param psWidget is a pointer to the slide menu widget to move to the left. +//! +//! This function will respond to the "left" key/button event. The left +//! button is used to ascend to the next menu up in the menu tree. The effect +//! is that the current menu, or active widget, slides off to the right, while +//! the parent menu slides in from the left. +//! +//! This function repeatedly draws the menu onto the display until the sliding +//! animation is finished and will not return to the caller until then. This +//! function is usually called from the thread context of +//! WidgetMessageQueueProcess(). +//! +//! \return Returns a non-zero value if the menu was moved or was not moved +//! because it is already at the last position. If a child widget is active +//! then this function does nothing and returns a 0. +// +//***************************************************************************** +static int32_t +SlideMenuLeft(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tSlideMenu *psMenu; + tSlideMenu *psParentMenu; + tContext sContext; + uint32_t ui32X; + uint32_t ui32MenuWidth; + + // + // Get handy pointers to the menu widget and active menu, and the parent + // menu if there is one. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + psMenu = psMenuWidget->psSlideMenu; + psParentMenu = psMenu->psParent; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + GrContextInit(&sContext, psMenuWidget->psDisplayB); + + // + // If this widget has a child, that means that the child widget is in + // control, and we are requested to go back to the previous menu item. + // Process the child widget. + // + if(psWidget->psChild) + { + // + // Call the widget de-activated callback function. This notifies the + // application that the widget is being deactivated. + // + if(psMenuWidget->pfnActive) + { + psMenuWidget->pfnActive(psWidget->psChild, + &psMenu->psSlideMenuItems[psMenu->ui32FocusIndex], + 0); + } + + // + // Unlink the child widget from the slide menu widget. The menu + // widget will now no longer have a child widget. + // + psWidget->psChild->psParent = 0; + psWidget->psChild = 0; + + // + // Fill a rectangle with the child widget background color. This will + // erase everything else that is shown on the widget but leave the + // background, which will make the change visually less jarring. + // This is done in off-screen buffer B, which is the buffer that is + // going to be slid off the screen. + // + GrContextForegroundSet( + &sContext, + psMenu->psSlideMenuItems[psMenu->ui32FocusIndex].ui32ChildWidgetColor); + GrRectFill(&sContext, &sContext.sClipRegion); + } + + // + // Otherwise there is not a child widget in control, so process the parent + // menu, if there is one. + // + else if(psParentMenu) + { + // + // Render the current menu into the off-screen buffer B. This will be + // the same menu appearance that is currently on the display. + // + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Now switch the widget to the parent menu + // + psMenuWidget->psSlideMenu = psParentMenu; + } + + // + // Otherwise, we are already at the top level menu and there is nothing + // else to do. + // + else + { + return(1); + } + + // + // Draw the new menu in the second offscreen buffer. This is the menu + // that will be on the display when the animation is over. + // + GrContextInit(&sContext, psMenuWidget->psDisplayA); + SlideMenuDraw(psMenuWidget, &sContext, 0); + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Get the width of the menu widget. + // + ui32MenuWidth = psMenuWidget->psDisplayA->ui16Width; + + // + // The following loop draws the two off-screen buffers onto the physical + // display using a left-to-right. This will provide an appearance + // of sliding to the right. The parent menu will slide in from the left. + // The "old" child menu is being held in off-screen buffer B and the new + // one is in buffer A. So when we are done, the correct image will be in + // buffer A. + // + for(ui32X = 0; ui32X <= ui32MenuWidth; ui32X += 8) + { + GrImageDraw(&sContext, psMenuWidget->psDisplayB->pvDisplayData, + psWidget->sPosition.i16XMin + ui32X, + psWidget->sPosition.i16YMin); + GrImageDraw(&sContext, psMenuWidget->psDisplayA->pvDisplayData, + psWidget->sPosition.i16XMin + ui32X - ui32MenuWidth, + psWidget->sPosition.i16YMin); + } + + // + // Return indication that we handled the key event. + // + return(1); +} + +//***************************************************************************** +// +//! Handles menu selection, in response to the "select" button. +//! +//! \param psWidget is a pointer to the slide menu widget to use for a +//! select operation. +//! +//! This function will allow for checking or unchecking multi-selectable +//! menu items. If the menu does not allow multiple selection, then it +//! treats it as a "right" button press. +//! +//! \return Returns a non-zero value if the key was handled. Returns 0 if the +//! key was not handled. +// +//***************************************************************************** +static int32_t +SlideMenuClick(tWidget *psWidget) +{ + tSlideMenuWidget *psMenuWidget; + tSlideMenu *psMenu; + + // + // If a child widget is in control then there is nothing to do. + // + if(psWidget->psChild) + { + return(0); + } + + // + // Get handy pointers to the menu widget and current menu. + // + psMenuWidget = (tSlideMenuWidget *)psWidget; + psMenu = psMenuWidget->psSlideMenu; + + // + // Check to see if this menu allows multiple selection. + // + if(psMenu->bMultiSelectable) + { + // + // Toggle the selection status of the currently highlighted menu + // item, and then repaint it. + // + psMenu->ui32SelectedFlags ^= 1 << psMenu->ui32FocusIndex; + SlideMenuPaint(psWidget); + + // + // We are done so return indication that we handled the key event. + // + return(1); + } + + // + // Otherwise, treat the select button the same as a right button. + // + return(SlideMenuRight(psWidget)); +} + +//***************************************************************************** +// +//! Process key/button event to decide how to move the sliding menu. +//! +//! \param psWidget is a pointer to the slide menu widget to process. +//! \param ui32Msg is the message containing the key event. +//! +//! This function is used to specifically handle key events destined for the +//! slide menu widget. It decides which menu movement function should be +//! called for each key event. +//! +//! \return Returns an indication if the key was handled. Non-zero if the +//! key event was handled or else 0. +// +//***************************************************************************** +static int32_t +SlideMenuMove(tWidget *psWidget, uint32_t ui32Msg) +{ + // + // Process the key event. + // + switch(ui32Msg) + { + // + // User presses select button. + // + case WIDGET_MSG_KEY_SELECT: + { + return(SlideMenuClick(psWidget)); + } + + // + // User presses up button. + // + case WIDGET_MSG_KEY_UP: + { + return(SlideMenuUp(psWidget)); + } + + // + // User presses down button. + // + case WIDGET_MSG_KEY_DOWN: + { + return(SlideMenuDown(psWidget)); + } + + // + // User presses left button. + // + case WIDGET_MSG_KEY_LEFT: + { + return(SlideMenuLeft(psWidget)); + } + + // + // User presses right button. + // + case WIDGET_MSG_KEY_RIGHT: + { + return(SlideMenuRight(psWidget)); + } + + // + // This is an unexpected event. Return an indication that the event + // was not handled. + // + default: + { + return(0); + } + } +} + +//***************************************************************************** +// +//! Handles messages for a slide menu widget. +//! +//! \param psWidget is a pointer to the slide menu widget. +//! \param ui32Msg is the message. +//! \param ui32Param1 is the first parameter to the message. +//! \param ui32Param2 is the second parameter to the message. +//! +//! This function receives messages intended for this slide menu widget and +//! processes them accordingly. The processing of the message varies based on +//! the message in question. +//! +//! Unrecognized messages are handled by calling WidgetDefaultMsgProc(). +//! +//! \return Returns a value appropriate to the supplied message. +// +//***************************************************************************** +int32_t +SlideMenuMsgProc(tWidget *psWidget, uint32_t ui32Msg, uint32_t ui32Param1, + uint32_t ui32Param2) +{ + // + // Check the arguments. + // + ASSERT(psWidget); + + // + // Determine which message is being sent. + // + switch(ui32Msg) + { + // + // The widget paint request has been sent. + // + case WIDGET_MSG_PAINT: + { + // + // Handle the widget paint request. + // + SlideMenuPaint(psWidget); + + // + // Return one to indicate that the message was successfully + // processed. + // + return(1); + } + + // + // A key event has been received. By convention, this widget will + // process the key events if ui32Param1 is set to this widget. + // Otherwise a different widget has the "focus" for key events. + // + case WIDGET_MSG_KEY_SELECT: + case WIDGET_MSG_KEY_UP: + case WIDGET_MSG_KEY_DOWN: + case WIDGET_MSG_KEY_LEFT: + case WIDGET_MSG_KEY_RIGHT: + { + // + // If this key event is for us, then process the event. + // + if((tWidget *)ui32Param1 == psWidget) + { + return(SlideMenuMove(psWidget, ui32Msg)); + } + } + + // + // An unknown request has been sent. This widget does not handle + // pointer events, so they get dumped here if they occur. + // + default: + { + // + // Let the default message handler process this message. + // + return(WidgetDefaultMsgProc(psWidget, ui32Msg, ui32Param1, + ui32Param2)); + } + } +} + +//***************************************************************************** +// +//! Initializes a slide menu widget. +//! +//! \param psWidget is a pointer to the slide menu widget to initialize. +//! \param psDisplay is a pointer to the display on which to draw the menu. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param psDisplayOffA is one of two off-screen displays used for rendering. +//! \param psDisplayOffB is one of two off-screen displays used for rendering. +//! \param ui32ItemHeight is the height of a menu item +//! \param ui32Foreground is the foreground color used for menu item boundaries +//! and text. +//! \param ui32Background is the background color of a menu item. +//! \param ui32Highlight is the color of a highlighted menu item. +//! \param psFont is a pointer to the font that should be used for text. +//! \param psMenu is the initial menu to display +//! +//! This function initializes the caller provided slide menu widget. +//! +//! \return None. +// +//***************************************************************************** +void +SlideMenuInit(tSlideMenuWidget *psWidget, const tDisplay *psDisplay, + int32_t i32X, int32_t i32Y, int32_t i32Width, int32_t i32Height, + tDisplay *psDisplayOffA, tDisplay *psDisplayOffB, + uint32_t ui32ItemHeight, uint32_t ui32Foreground, + uint32_t ui32Background, uint32_t ui32Highlight, + tFont *psFont, tSlideMenu *psMenu) +{ + uint32_t ui32Idx; + + // + // Check the arguments. + // + ASSERT(psWidget); + ASSERT(psDisplay); + ASSERT(psDisplayOffA); + ASSERT(psDisplayOffB); + ASSERT(psFont); + ASSERT(psMenu); + + // + // Clear out the widget structure. + // + for(ui32Idx = 0; ui32Idx < sizeof(tSlideMenuWidget); ui32Idx += 4) + { + ((uint32_t *)psWidget)[ui32Idx / 4] = 0; + } + + // + // Set the size of the widget structure. + // + psWidget->sBase.i32Size = sizeof(tSlideMenuWidget); + + // + // Mark this widget as fully disconnected. + // + psWidget->sBase.psParent = 0; + psWidget->sBase.psNext = 0; + psWidget->sBase.psChild = 0; + + // + // Save the display pointer. + // + psWidget->sBase.psDisplay = psDisplay; + + // + // Set the extents of the display area. + // + psWidget->sBase.sPosition.i16XMin = i32X; + psWidget->sBase.sPosition.i16YMin = i32Y; + psWidget->sBase.sPosition.i16XMax = i32X + i32Width - 1; + psWidget->sBase.sPosition.i16YMax = i32Y + i32Height - 1; + + // + // Initialize the widget fields + // + psWidget->psDisplayA = psDisplayOffA; + psWidget->psDisplayB = psDisplayOffB; + psWidget->ui32MenuItemHeight = ui32ItemHeight; + psWidget->ui32ColorForeground = ui32Foreground; + psWidget->ui32ColorBackground = ui32Background; + psWidget->ui32ColorHighlight = ui32Highlight; + psWidget->psFont = psFont; + psWidget->psSlideMenu = psMenu; + + // + // Use the slide menu message handler to process messages to this widget. + // + psWidget->sBase.pfnMsgProc = SlideMenuMsgProc; +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/ek-lm4f232/drivers/slidemenuwidget.h b/boards/ek-lm4f232/drivers/slidemenuwidget.h new file mode 100644 index 0000000..c7a1647 --- /dev/null +++ b/boards/ek-lm4f232/drivers/slidemenuwidget.h @@ -0,0 +1,457 @@ +//***************************************************************************** +// +// slidemenuwidget.h - Prototypes for a sliding menu widget. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __SLIDEMENUWIDGET_H__ +#define __SLIDEMENUWIDGET_H__ + +//***************************************************************************** +// +//! \addtogroup slidemenuwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! The structure that describes a menu item in the menu tree. +// +//***************************************************************************** +typedef struct _SlideMenuItem +{ + // + //! A pointer to text to be rendered within the node. + // + char *pcText; + + // + //! A child menu that is activated by this menu item, if any. Can be NULL. + // + struct _SlideMenu *psChildMenu; + + // + //! A child widget that is activated by this menu item, if any. Can be + //! NULL. If both child menu and child widget are specified, the child + //! menu will be used. + // + tWidget *psChildWidget; + + // + //! A color that is used when a child widget is activated. This is the + //! color that is used as a background when the menu slides off to make + //! the screen available for the child widget. By choosing this color to + //! match the background that is used in the child widget, the sliding + //! animation and widget painting appears smoother. + // + uint32_t ui32ChildWidgetColor; +} +tSlideMenuItem; + +//***************************************************************************** +// +//! The structure that describes a menu. +// +//***************************************************************************** +typedef struct _SlideMenu +{ + // + //! The parent menu of this menu. + // + struct _SlideMenu *psParent; + + // + //! The total number of items in this menu. + // + uint32_t ui32Items; + + // + //! A pointer to the array of menu item structures. + // + tSlideMenuItem *psSlideMenuItems; + + // + //! The menu item index of the item shown on the center of the screen. + //! Normally this is the same as the menu item that has the focus, but + //! can be different during the time when the menu is "sliding". When this + //! is 0, the first menu item is shown in the center of the screen and the + //! successive items are shown below it. When non-zero, then this menu + //! item is shown in the center, with preceding menu items shown above + //! and successive items shown below. + // + uint32_t ui32CenterIndex; + + // + //! The menu item index that has the focus. + // + uint32_t ui32FocusIndex; + + // + //! A flag to indicate if more than one menu item is selectable. + // + bool bMultiSelectable; + + // + //! A set of bit flags to indicate which menu items are selected. + // + uint32_t ui32SelectedFlags; +} tSlideMenu; + +//***************************************************************************** +// +//! The structure that describes a slide menu widget. +// +//***************************************************************************** +typedef struct +{ + // + //! The generic widget information. + // + tWidget sBase; + + // + //! A pointer to an off-screen display that is used for rendering the + //! menus prior to showing on the widget's area of the screen. There + //! are two off-screen displays. Each should be the size of the widget + //! area. The palette should include any colors that are used by this + //! widget. + // + tDisplay *psDisplayA; + + // + //! A pointer to a second off-screen display. + // + tDisplay *psDisplayB; + + // + //! The height, in pixels, of a single menu item (a cell). + // + uint32_t ui32MenuItemHeight; + + // + //! The color used for drawing menu item cell boundaries and text. + // + uint32_t ui32ColorForeground; + + // + //! The background color of menu item cells. + // + uint32_t ui32ColorBackground; + + // + //! The color of a highlighted menu item. + // + uint32_t ui32ColorHighlight; + + // + //! The font to use for menu text. + // + const tFont *psFont; + + // + //! The current menu to display. + // + tSlideMenu *psSlideMenu; + + // + // A function to call when a child widget becomes active or inactive + // + void (*pfnActive)(tWidget *psWidget, tSlideMenuItem *psMenuItem, + bool bActivated); +} +tSlideMenuWidget; + +//***************************************************************************** +// +//! Declares an initialized slide menu widget data structure. +//! +//! \param pParent is a pointer to the parent widget. +//! \param pNext is a pointer to the sibling widget. +//! \param pChild is a pointer to the first child widget. +//! \param pDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param psDisplayA is one of two off-screen displays for rendering menus. +//! \param psDisplayB is one of two off-screen displays for rendering menus. +//! \param ui32MenuItemHeight is the height of a menu item. +//! \param ui32Foreground is the foreground color for menu item boundaries and +//! text. +//! \param ui32Background is the background color of the menu items. +//! \param ui32Highlight is the color of a highlighted menu item. +//! \param psFont is the font to use for the menu text. +//! \param psMenu is the initial menu to display. +//! \param pfnWidgetActive is a pointer to a function that will be called when +//! a child widget is activated or deactivated. +//! +//! This macro provides an initialized slide menu widget data structure, which +//! can be used to construct the widget tree at compile time in global variables +//! (as opposed to run-time via function calls). This must be assigned to a +//! variable, such as: +//! +//! \verbatim +//! tSlideMenuWidget g_i16SlideMenu = SlideMenuStruct(...); +//! \endverbatim +//! +//! Or, in an array of variables: +//! +//! \verbatim +//! tSlideMenuWidget g_pi16SlideMenu[] = +//! { +//! SlideMenuStruct(...), +//! SlideMenuStruct(...) +//! }; +//! \endverbatim +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define SlideMenuStruct(pParent, pNext, pChild, pDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + psDisplayA, psDisplayB, \ + ui32MenuItemHeight, ui32Foreground, ui32Background, \ + ui32Highlight, psFont, psMenu, pfnWidgetActive) \ + { \ + { \ + sizeof(tSlideMenuWidget), \ + (tWidget *)(pParent), \ + (tWidget *)(pNext), \ + (tWidget *)(pChild), \ + pDisplay, \ + { \ + i32X, \ + i32Y, \ + (i32X) + (i32Width) - 1, \ + (i32Y) + (i32Height) - 1 \ + }, \ + SlideMenuMsgProc \ + }, \ + psDisplayA, \ + psDisplayB, \ + ui32MenuItemHeight, \ + ui32Foreground, \ + ui32Background, \ + ui32Highlight, \ + psFont, \ + psMenu, \ + pfnWidgetActive \ + } + +//***************************************************************************** +// +//! Declares an initialized variable containing a slide menu widget data +//! structure. +//! +//! \param i16Name is the name of the variable to be declared. +//! \param pParent is a pointer to the parent widget. +//! \param pNext is a pointer to the sibling widget. +//! \param pChild is a pointer to the first child widget. +//! \param pDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param psDisplayA is one of two off-screen displays for rendering menus. +//! \param psDisplayB is one of two off-screen displays for rendering menus. +//! \param ui32MenuItemHeight is the height of a menu item. +//! \param ui32Foreground is the foreground color for menu item boundaries and +//! text. +//! \param ui32Background is the background color of the menu items. +//! \param ui32Highlight is the color of a highlighted menu item. +//! \param psFont is the font to use for the menu text. +//! \param psMenu is the initial menu to display. +//! \param pfnWidgetActive is a pointer to a function that will be called when +//! a child widget is activated or deactivated. +//! +//! This macro declares a variable containing an initialized slide menu widget +//! data structure, which can be used to construct the widget tree at compile +//! time in global variables (as opposed to run-time via function calls). +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define SlideMenu(i16Name, pParent, pNext, pChild, pDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + psDisplayA, psDisplayB, \ + ui32MenuItemHeight, ui32Foreground, ui32Background, \ + ui32Highlight, psFont, psMenu, pfnWidgetActive) \ + tSlideMenuWidget i16Name = \ + SlideMenuStruct(pParent, pNext, pChild, pDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + psDisplayA, psDisplayB, \ + ui32MenuItemHeight, ui32Foreground, ui32Background,\ + ui32Highlight, psFont, psMenu, pfnWidgetActive) + +//***************************************************************************** +// +//! Sets the active menu of the slide menu widget. +//! +//! \param psSlideMenuWidget is a pointer to the slide menu widget to modify. +//! \param psMenu is the new slide menu to make active. +//! +//! This function sets the active menu for the widget. +//! +//! \return None. +// +//***************************************************************************** +#define SlideMenuMenuSet(psSlideMenuWidget, psMenu) \ + do \ + { \ + (psSlideMenuWidget)->psSlideMenu = (psMenu); \ + } while(0) + +//***************************************************************************** +// +//! Sets the active callback function for a slide menu widget. +//! +//! \param psSlideMenuWidget is a pointer to the slide menu widget to modify. +//! \param pfnActivated is a function pointer to the function that should +//! be called when the menu system activates or deactivates a child widget. +//! +//! This function sets the child widget active callback function. +//! +//! \return None. +// +//***************************************************************************** +#define SlideMenuActiveCallbackSet(psSlideMenuWidget, pfnActivated) \ + do \ + { \ + (psSlideMenuWidget)->pfnActive = (pfnActivated); \ + } while(0) + +//***************************************************************************** +// +//! Gets the index of the menu item that has the focus. +//! +//! \param psSlideMenu is a pointer to the menu to query for item index. +//! +//! This function returns the index of the menu item that has the focus for +//! the specified menu. +//! +//! \return Index of the menu item that has the focus. +// +//***************************************************************************** +#define SlideMenuFocusItemGet(psSlideMenu) \ + ((psSlideMenu)->ui32FocusIndex) + +//***************************************************************************** +// +//! Gets the selected items mask for a menu. +//! +//! \param psSlideMenu is a pointer to the menu to query for selected items. +//! +//! This function returns a value that is a bit mask of any menu items that +//! are selected in the current menu. This is meant to work when a menu is +//! configured to be selectable. Then multiple menu items can be selected and +//! the selection mask indicates which are selected. +//! +//! \return Selection bit mask of selected menu items. +// +//***************************************************************************** +#define SlideMenuSelectedGet(psSlideMenu) \ + ((psSlideMenu)->ui32SelectedFlags) + +//***************************************************************************** +// +//! Sets the focus item index for a menu. +//! +//! \param psSlideMenu is a pointer to the menu to set the focus item. +//! \param ui32Focus is the index of the menu item that should have the focus. +//! +//! This function is used to specify which menu item should have the focus. +//! +//! \return None. +// +//***************************************************************************** +#define SlideMenuFocusItemSet(psSlideMenu, ui32Focus) \ + do \ + { \ + (psSlideMenu)->ui32FocusIndex = (ui32Focus); \ + (psSlideMenu)->ui32CenterIndex = (ui32Focus); \ + } while(0) + +//***************************************************************************** +// +//! Sets the selected items bit mask for a menu. +//! +//! \param psSlideMenu is a pointer to the menu to set the selection mask. +//! \param ui32Selected is a bit mask indicating which menu items should be +//! marked as selected. +//! +//! This function is used to specify which menu items are pre-selected. +//! +//! \return None. +// +//***************************************************************************** +#define SlideMenuSelectedSet(psSlideMenu, ui32Selected) \ + do \ + { \ + (psSlideMenu)->ui32SelectedFlags = (ui32Selected); \ + } while(0) + +//***************************************************************************** +// +// Prototypes for the slide menu widget APIs. +// +//***************************************************************************** +extern int32_t SlideMenuMsgProc(tWidget *psWidget, uint32_t ui32Msg, + uint32_t ui32Param1, uint32_t ui32Param2); +void SlideMenuDraw(tSlideMenuWidget *psMenuWidget, tContext *pContext, + int32_t i32OffsetY); +extern void SlideMenuInit(tSlideMenuWidget *psWidget, const tDisplay *pDisplay, + int32_t i32X, int32_t i32Y, int32_t i32Width, int32_t i32Height, + tDisplay *pDisplayOffA, tDisplay *pDisplayOffB, + uint32_t ui32ItemHeight, + uint32_t ui32Foreground, + uint32_t ui32Background, + uint32_t ui32Highlight, + tFont *psFont, tSlideMenu *psMenu); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#endif // __SLIDEMENUWIDGET_H__ diff --git a/boards/ek-lm4f232/drivers/stripchartwidget.c b/boards/ek-lm4f232/drivers/stripchartwidget.c new file mode 100644 index 0000000..60d9d37 --- /dev/null +++ b/boards/ek-lm4f232/drivers/stripchartwidget.c @@ -0,0 +1,672 @@ +//***************************************************************************** +// +// stripchartwidget.c - A simple strip chart widget. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/debug.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "stripchartwidget.h" + +//***************************************************************************** +// +//! \addtogroup stripchartwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// This is a custom widget for drawing a simple strip chart. The strip +// chart can be configured with an X/Y grid, and data series can be added +// to and displayed on the strip chart. The strip chart can be "advanced" +// so that the grid lines will move on the display. Before advancing +// the chart, the application must update the series data in the buffers. +// The strip chart will only display whatever is in the series buffers, the +// application must scroll the data in the series data buffers. By adjusting +// the data in the series data buffers, advancing the strip chart, and +// repainting, the strip chart can be made to scroll the data across the +// display. +// +//***************************************************************************** + +//***************************************************************************** +// +//! Draws the strip chart into a drawing context, off-screen buffer. +//! +//! \param psChartWidget points at the StripsChartWidget being processed. +//! \param psContext points to the context where all drawing should be done. +//! +//! This function renders a strip chart into a drawing context. +//! It assumes that the drawing context is an off-screen buffer, and that +//! the entire buffer belongs to this widget. +//! +//! \return None. +// +//***************************************************************************** +void +StripChartDraw(tStripChartWidget *psChartWidget, tContext *psContext) +{ + tStripChartAxis *psAxisY; + int32_t i32Y; + int32_t i32Ygrid; + int32_t i32X; + int32_t i32GridRange; + int32_t i32DispRange; + int32_t i32GridMin; + int32_t i32DispMax; + tStripChartSeries *psSeries; + + // + // Check the parameters + // + ASSERT(psChartWidget); + ASSERT(psContext); + ASSERT(psChartWidget->psAxisY); + + // + // Get handy pointer to Y axis + // + psAxisY = psChartWidget->psAxisY; + + // + // Find the range of Y axis in Y axis units + // + i32GridRange = psAxisY->i32Max - psAxisY->i32Min; + + // + // Find the range of the Y axis in display units (pixels) + // + i32DispRange = (psContext->sClipRegion.i16YMax - + psContext->sClipRegion.i16YMin); + + // + // Find the minimum Y units value to be shown, and the maximum of the + // clipping region. + // + i32GridMin = psAxisY->i32Min; + i32DispMax = psContext->sClipRegion.i16YMax; + + // + // Set the fg color for the rectangle fill to match what we want as the + // chart background. + // + GrContextForegroundSet(psContext, psChartWidget->ui32BackgroundColor); + GrRectFill(psContext, &psContext->sClipRegion); + + // + // Draw vertical grid lines + // + GrContextForegroundSet(psContext, psChartWidget->ui32GridColor); + for(i32X = psChartWidget->i32GridX; i32X < psContext->sClipRegion.i16XMax; + i32X += psChartWidget->psAxisX->i32GridInterval) + { + GrLineDrawV(psContext, psContext->sClipRegion.i16XMax - i32X, + psContext->sClipRegion.i16YMin, + psContext->sClipRegion.i16YMax); + } + + // + // Draw horizontal grid lines + // + for(i32Ygrid = psAxisY->i32Min; i32Ygrid < psAxisY->i32Max; + i32Ygrid += psAxisY->i32GridInterval) + { + i32Y = ((i32Ygrid - i32GridMin) * i32DispRange) / i32GridRange; + i32Y = i32DispMax - i32Y; + GrLineDrawH(psContext, psContext->sClipRegion.i16XMin, + psContext->sClipRegion.i16XMax, i32Y); + } + + // + // Compute location of Y=0 line, and draw it + // + i32Y = ((-i32GridMin) * i32DispRange) / i32GridRange; + i32Y = i32DispMax - i32Y; + GrLineDrawH(psContext, psContext->sClipRegion.i16XMin, + psContext->sClipRegion.i16XMax, i32Y); + + // + // Iterate through each series to draw it + // + psSeries = psChartWidget->psSeries; + while(psSeries) + { + int idx = 0; + + // + // Find the starting X position on the display for this series. + // If the series has less data points than can fit on the display + // then starting X can be somewhere in the middle of the screen. + // + i32X = 1 + psContext->sClipRegion.i16XMax - psSeries->ui16NumItems; + + // + // If the starting X is off the left side of the screen, then the + // staring index (idx) for reading data needs to be adjusted to the + // first value in the series that will be visible on the screen + // + if(i32X < psContext->sClipRegion.i16XMin) + { + idx = psContext->sClipRegion.i16XMin - i32X; + i32X = psContext->sClipRegion.i16XMin; + } + + // + // Set the drawing color for this series + // + GrContextForegroundSet(psContext, psSeries->ui32Color); + + // + // Scan through all possible X values, find the Y value, and draw the + // pixel. + // + for(; i32X <= psContext->sClipRegion.i16XMax; i32X++) + { + // + // Find the Y value at each position in the data series. Take into + // account the data size and the stride + // + if(psSeries->ui8DataTypeSize == 1) + { + i32Y = + ((int8_t *)psSeries->pvData)[idx * psSeries->ui8Stride]; + } + else if(psSeries->ui8DataTypeSize == 2) + { + i32Y = + ((int16_t *)psSeries->pvData)[idx * psSeries->ui8Stride]; + } + else if(psSeries->ui8DataTypeSize == 4) + { + i32Y = + ((int32_t *)psSeries->pvData)[idx * psSeries->ui8Stride]; + } + else + { + // + // If there is an invalid data size, then just force Y value + // to be off the display + // + i32Y = i32DispMax + 1; + break; + } + + // + // Advance to the next position in the data series. + // + idx++; + + // + // Now scale the Y value according to the axis scaling + // + i32Y = ((i32Y - i32GridMin) * i32DispRange) / i32GridRange; + i32Y = i32DispMax - i32Y; + + // + // Draw the pixel on the display + // + GrPixelDraw(psContext, i32X, i32Y); + } + + // + // Advance to the next series until there are no more. + // + psSeries = psSeries->psNextSeries; + } + + // + // Draw a frame around the entire chart. + // + GrContextForegroundSet(psContext, psChartWidget->ui32Y0Color); + GrRectDraw(psContext, &psContext->sClipRegion); + + // + // Draw titles + // + GrContextForegroundSet(psContext, psChartWidget->ui32TextColor); + GrContextFontSet(psContext, psChartWidget->psFont); + + // + // Draw the chart title, if there is one + // + if(psChartWidget->pcTitle) + { + GrStringDrawCentered(psContext, psChartWidget->pcTitle, -1, + psContext->sClipRegion.i16XMax / 2, + GrFontHeightGet(psChartWidget->psFont), 0); + } + + // + // Draw the Y axis max label, if there is one + // + if(psChartWidget->psAxisY->pcMaxLabel) + { + GrStringDraw(psContext, psChartWidget->psAxisY->pcMaxLabel, -1, + psContext->sClipRegion.i16XMin + + GrFontMaxWidthGet(psChartWidget->psFont) / 2, + GrFontHeightGet(psChartWidget->psFont) / 2, 0); + } + + // + // Draw the Y axis min label, if there is one + // + if(psChartWidget->psAxisY->pcMinLabel) + { + GrStringDraw(psContext, psChartWidget->psAxisY->pcMinLabel, -1, + psContext->sClipRegion.i16XMin + + GrFontMaxWidthGet(psChartWidget->psFont) / 2, + psContext->sClipRegion.i16YMax - + (GrFontHeightGet(psChartWidget->psFont) + + (GrFontHeightGet(psChartWidget->psFont) / 2)), + 0); + } + + // + // Draw a label for the name of the Y axis, if there is one + // + if(psChartWidget->psAxisY->pcName) + { + GrStringDraw(psContext, psChartWidget->psAxisY->pcName, -1, + psContext->sClipRegion.i16XMin + 1, + (psContext->sClipRegion.i16YMax / 2) - + (GrFontHeightGet(psChartWidget->psFont) / 2), + 1); + } +} + +//***************************************************************************** +// +//! Paints the strip chart on the display. +//! +//! \param psWidget is a pointer to the strip chart widget to be drawn. +//! +//! This function draws the contents of a strip chart on the display. This is +//! called in response to a \b WIDGET_MSG_PAINT message. +//! +//! \return None. +// +//***************************************************************************** +static void +StripChartPaint(tWidget *psWidget) +{ + tStripChartWidget *psChartWidget; + tContext sContext; + + // + // Check the arguments. + // + ASSERT(psWidget); + ASSERT(psWidget->psDisplay); + + // + // Convert the generic widget pointer into a strip chart widget pointer. + // + psChartWidget = (tStripChartWidget *)psWidget; + + // + // Initialize a context for the primary off-screen drawing buffer. + // Clip region is set to entire display by default, which is what we want. + // + ASSERT(psChartWidget->psOffscreenDisplay); + GrContextInit(&sContext, psChartWidget->psOffscreenDisplay); + + // + // Render the strip chart into the off-screen buffer + // + StripChartDraw(psChartWidget, &sContext); + + // + // Initialize a drawing context for the display where the widget is to be + // drawn. This is the physical display, not an off-screen buffer. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region on the physical display, based on the + // extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Now copy the rendered strip chart into the physical display + // + GrImageDraw(&sContext, psChartWidget->psOffscreenDisplay->pvDisplayData, + psWidget->sPosition.i16XMin, psWidget->sPosition.i16YMin); +} + +//***************************************************************************** +// +//! Advances the strip chart X grid by a certain number of pixels. +//! +//! \param psChartWidget is a pointer to the strip chart widget to be advanced. +//! \param i32Count is the number of positions to advance the grid. +//! +//! This function advances the X grid of the strip chart by the specified +//! number of positions. By using this function to advance the grid in +//! combination with updating the data in the series data buffers, the strip +//! chart can be made to appear to scroll across the display. +//! +//! \return None. +// +//***************************************************************************** +void +StripChartAdvance(tStripChartWidget *psChartWidget, int32_t i32Count) +{ + // + // Adjust the starting point of the X-grid + // + psChartWidget->i32GridX += i32Count; + psChartWidget->i32GridX %= psChartWidget->psAxisX->i32GridInterval; +} + +//***************************************************************************** +// +//! Adds a data series to the strip chart. +//! +//! \param psWidget is a pointer to the strip chart widget to be modified. +//! \param psNewSeries is a strip chart data series to be added to the strip +//! chart. +//! +//! This function will add a data series to the strip chart. This function +//! just links the series into the strip chart. It is up to the application +//! to make sure that the data series is initialized correctly. +//! +//! \return None. +// +//***************************************************************************** +void +StripChartSeriesAdd(tStripChartWidget *psWidget, + tStripChartSeries *psNewSeries) +{ + // + // If there is already at least one series in this chart, then link + // in to the existing chain. + // + if(psWidget->psSeries) + { + tStripChartSeries *psSeries = psWidget->psSeries; + while(psSeries->psNextSeries) + { + psSeries = psSeries->psNextSeries; + } + psSeries->psNextSeries = psNewSeries; + } + + // + // Otherwise, there is not already a series in this chart, so set this + // new series as the first series for the chart. + // + else + { + psWidget->psSeries = psNewSeries; + } + psNewSeries->psNextSeries = 0; +} + +//***************************************************************************** +// +//! Removes a data series from the strip chart. +//! +//! \param psWidget is a pointer to the strip chart widget to be modified. +//! \param psOldSeries is a strip chart data series that is to be removed +//! from the strip chart. +//! +//! This function will remove an existing data series from a strip chart. It +//! will search the list of data series for the specified series, and if +//! found it will be unlinked from the chain of data series for this strip +//! chart. +//! +//! \return None. +// +//***************************************************************************** +void +StripChartSeriesRemove(tStripChartWidget *psWidget, + tStripChartSeries *psOldSeries) +{ + // + // If the series to be removed is the first one, then find the next + // series in the chain and set it to be first. + // + if(psWidget->psSeries == psOldSeries) + { + psWidget->psSeries = psOldSeries->psNextSeries; + } + + // + // Otherwise, scan through the chain to find the old series + // + else + { + tStripChartSeries *psSeries = psWidget->psSeries; + while(psSeries->psNextSeries) + { + // + // If the old series is found, unlink it from the chain + // + if(psSeries->psNextSeries == psOldSeries) + { + psSeries->psNextSeries = psOldSeries->psNextSeries; + break; + } + else + { + psSeries = psSeries->psNextSeries; + } + } + } + + // + // Finally, set the "next" pointer of the old series to null so that + // there will not be any confusing chain fragments if this series is + // reused. + // + psOldSeries->psNextSeries = 0; +} + +//***************************************************************************** +// +//! Handles messages for a strip chart widget. +//! +//! \param psWidget is a pointer to the strip chart widget. +//! \param ui32Msg is the message. +//! \param ui32Param1 is the first parameter to the message. +//! \param ui32Param2 is the second parameter to the message. +//! +//! This function receives messages intended for this strip chart widget and +//! processes them accordingly. The processing of the message varies based on +//! the message in question. +//! +//! Unrecognized messages are handled by calling WidgetDefaultMsgProc(). +//! +//! \return Returns a value appropriate to the supplied message. +// +//***************************************************************************** +int32_t +StripChartMsgProc(tWidget *psWidget, uint32_t ui32Msg, uint32_t ui32Param1, + uint32_t ui32Param2) +{ + // + // Check the arguments. + // + ASSERT(psWidget); + + // + // Determine which message is being sent. + // + switch(ui32Msg) + { + // + // The widget paint request has been sent. + // + case WIDGET_MSG_PAINT: + { + // + // Handle the widget paint request. + // + StripChartPaint(psWidget); + + // + // Return one to indicate that the message was successfully + // processed. + // + return(1); + } + + // + // Deliberately ignore all button press messages. They may be handled + // by another widget. + // + case WIDGET_MSG_KEY_SELECT: + case WIDGET_MSG_KEY_UP: + case WIDGET_MSG_KEY_DOWN: + case WIDGET_MSG_KEY_LEFT: + case WIDGET_MSG_KEY_RIGHT: + { + return(0); + } + + // + // An unknown request has been sent. + // + default: + { + // + // Let the default message handler process this message. + // + return(WidgetDefaultMsgProc(psWidget, ui32Msg, ui32Param1, + ui32Param2)); + } + } +} + +//***************************************************************************** +// +//! Initializes a strip chart widget. +//! +//! \param psWidget is a pointer to the strip chart widget to initialize. +//! \param psDisplay is a pointer to the display on which to draw the chart. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param pcTitle is the label text for the strip chart +//! \param psFont is the font to use for drawing text on the chart. +//! \param ui32BackgroundColor is the colr of the background for the chart. +//! \param ui32TextColor is the color used for drawing text. +//! \param ui32Y0Color is the color used for drawing the Y=0 line and the frame +//! around the chart. +//! \param ui32GridColor is the color of the X/Y grid +//! \param psAxisX is a pointer to the X-axis object +//! \param psAxisY is a pointer to the Y-axis object +//! \param psOffscreenDisplay is a pointer to an offscreen display that will +//! be used for rendering the strip chart prior to drawing it on the +//! physical display. +//! +//! This function initializes the caller provided strip chart widget. +//! +//! \return None. +// +//***************************************************************************** +void +StripChartInit(tStripChartWidget *psWidget, const tDisplay *psDisplay, + int32_t i32X, int32_t i32Y, int32_t i32Width, int32_t i32Height, + char * pcTitle, tFont *psFont, + uint32_t ui32BackgroundColor, + uint32_t ui32TextColor, + uint32_t ui32Y0Color, + uint32_t ui32GridColor, + tStripChartAxis *psAxisX, tStripChartAxis *psAxisY, + tDisplay *psOffscreenDisplay) +{ + uint32_t ui32Idx; + + // + // Check the arguments. + // + ASSERT(psWidget); + ASSERT(psDisplay); + ASSERT(psAxisX); + ASSERT(psAxisY); + ASSERT(psOffscreenDisplay); + + // + // Clear out the widget structure. + // + for(ui32Idx = 0; ui32Idx < sizeof(tStripChartWidget); ui32Idx += 4) + { + ((uint32_t *)psWidget)[ui32Idx / 4] = 0; + } + + // + // Set the size of the widget structure. + // + psWidget->sBase.i32Size = sizeof(tStripChartWidget); + + // + // Mark this widget as fully disconnected. + // + psWidget->sBase.psParent = 0; + psWidget->sBase.psNext = 0; + psWidget->sBase.psChild = 0; + + // + // Save the display pointer. + // + psWidget->sBase.psDisplay = psDisplay; + + // + // Set the extents of the display area. + // + psWidget->sBase.sPosition.i16XMin = i32X; + psWidget->sBase.sPosition.i16YMin = i32Y; + psWidget->sBase.sPosition.i16XMax = i32X + i32Width - 1; + psWidget->sBase.sPosition.i16YMax = i32Y + i32Height - 1; + + // + // Initialize the widget fields + // + psWidget->pcTitle = pcTitle; + psWidget->psFont = psFont; + psWidget->ui32BackgroundColor = ui32BackgroundColor; + psWidget->ui32TextColor = ui32TextColor; + psWidget->ui32Y0Color = ui32Y0Color; + psWidget->ui32GridColor = ui32GridColor; + psWidget->psAxisX = psAxisX; + psWidget->psAxisY = psAxisY; + psWidget->psOffscreenDisplay = psOffscreenDisplay; + + // + // Use the strip chart message handler to process messages to this widget. + // + psWidget->sBase.pfnMsgProc = StripChartMsgProc; +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + diff --git a/boards/ek-lm4f232/drivers/stripchartwidget.h b/boards/ek-lm4f232/drivers/stripchartwidget.h new file mode 100644 index 0000000..2c64f6a --- /dev/null +++ b/boards/ek-lm4f232/drivers/stripchartwidget.h @@ -0,0 +1,392 @@ +//***************************************************************************** +// +// stripchartwidget.h - Prototypes for a strip chart widget. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __STRIPCHARTWIDGET_H__ +#define __STRIPCHARTWIDGET_H__ + +//***************************************************************************** +// +//! \addtogroup stripchartwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! A structure that represents a data series to be shown on the strip chart. +// +//***************************************************************************** +typedef struct _StripChartSeries +{ + // + //! A pointer to the next series in the chart. + // + struct _StripChartSeries *psNextSeries; + + // + //! A pointer to the brief name of the data set + // + char *pcName; + + // + //! The color of the data series. + // + uint32_t ui32Color; + + // + //! The number of bytes of the data type (1, 2, or 4) + // + uint8_t ui8DataTypeSize; + + // + //! The stride of the data. This can be used when this data set is + //! part of a larger set of samples that appear in a large array + //! interleaved at a regular interval. Use a value of 1 if the data set + //! is not interleaved. + // + uint8_t ui8Stride; + + // + //! The number of items in the data set + // + uint16_t ui16NumItems; + + // + //! A pointer to the first data item. + // + void *pvData; +} +tStripChartSeries; + +//***************************************************************************** +// +//! A structure that represents an axis of the strip chart. +// +//***************************************************************************** +typedef struct _StripChartAxis +{ + // + //! A brief name for the axis. Leave null for no name to be shown. + // + char *pcName; + + // + //! Label for the minimum extent of the axis. Leave null for no label. + // + char *pcMinLabel; + + // + //! Label for the max extent of the axis. Leave null for no label. + // + char *pcMaxLabel; + + // + //! The minimum units value for the axis. + // + int32_t i32Min; + + // + //! The maximum units value for the axis + // + int32_t i32Max; + + // + //! The grid interval for the axis. Use 0 for no grid. + // + int32_t i32GridInterval; +} tStripChartAxis; + +//***************************************************************************** +// +//! A structure that represents a strip chart widget. +// +//***************************************************************************** +typedef struct _StripChartWidget +{ + // + //! The generic widget information. + // + tWidget sBase; + + // + //! The title for the strip chart. Leave null for no title. + // + char *pcTitle; + + // + //! The font to use for drawing text on the chart. + // + const tFont *psFont; + + // + //! The background color of the chart. + // + uint32_t ui32BackgroundColor; + + // + //! The color for text that is drawn on the chart (titles, etc). + // + uint32_t ui32TextColor; + + // + //! The color of the Y-axis 0-crossing line. + // + uint32_t ui32Y0Color; + + // + //! The color of the grid lines. + // + uint32_t ui32GridColor; + + // + //! The X axis + // + tStripChartAxis *psAxisX; + + // + //! The Y axis + // + tStripChartAxis *psAxisY; + + // + //! A pointer to the first data series for the strip chart. + // + tStripChartSeries *psSeries; + + // + //! A pointer to an off-screen display to be used for rendering the chart. + // + const tDisplay *psOffscreenDisplay; + + // + //! The current X-grid alignment. This value changes in order to give the + //! appearance of the grid moving as the strip chart advances. + // + int32_t i32GridX; +} tStripChartWidget; + +//***************************************************************************** +// +//! Declares an initialized strip chart widget data structure. +//! +//! \param psParent is a pointer to the parent widget. +//! \param psNext is a pointer to the sibling widget. +//! \param psChild is a pointer to the first child widget. +//! \param psDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param pcTitle is a string for the chart title, NULL for no title. +//! \param psFont is the font used for rendering text on the chart. +//! \param ui32BackgroundColor is the background color for the chart. +//! \param ui32TextColor is the color of text (titles, labels, etc.) +//! \param ui32Y0Color is the color of the Y-axis gridline at Y=0 +//! \param ui32GridColor is the color of grid lines. +//! \param psAxisX is a pointer to the axis structure for the X-axis. +//! \param psAxisY is a pointer to the axis structure for the Y-axis. +//! \param psOffscreenDisplay is a buffer for rendering the chart before +//! showing on the physical display. The dimensions of the off-screen display +//! should match the drawing area of psDisplay. +//! +//! This macro provides an initialized strip chart widget data structure, which +//! can be used to construct the widget tree at compile time in global +//! variables (as opposed to run-time via function calls). This must be +//! assigned to a variable, such as: +//! +//! \verbatim +//! tStripChartWidget g_sStripChart = StripChartStruct(...); +//! \endverbatim +//! +//! Or, in an array of variables: +//! +//! \verbatim +//! tStripChartWidget g_psStripChart[] = +//! { +//! StripChartStruct(...), +//! StripChartStruct(...) +//! }; +//! \endverbatim +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define StripChartStruct(psParent, psNext, psChild, psDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + pcTitle, psFont, ui32BackgroundColor, ui32TextColor, \ + ui32Y0Color, ui32GridColor, psAxisX, psAxisY, \ + psOffscreenDisplay) \ + { \ + { \ + sizeof(tStripChartWidget), \ + (tWidget *)(psParent), \ + (tWidget *)(psNext), \ + (tWidget *)(psChild), \ + psDisplay, \ + { \ + i32X, \ + i32Y, \ + (i32X) + (i32Width) - 1, \ + (i32Y) + (i32Height) - 1 \ + }, \ + StripChartMsgProc \ + }, \ + pcTitle, psFont, ui32BackgroundColor, ui32TextColor, ui32Y0Color, \ + ui32GridColor, psAxisX, psAxisY, 0, psOffscreenDisplay, 0 \ + } + +//***************************************************************************** +// +//! Declares an initialized variable containing a strip chart widget data +//! structure. +//! +//! \param sName is the name of the variable to be declared. +//! \param psParent is a pointer to the parent widget. +//! \param psNext is a pointer to the sibling widget. +//! \param psChild is a pointer to the first child widget. +//! \param psDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param pcTitle is a string for the chart title, NULL for no title. +//! \param psFont is the font used for rendering text on the chart. +//! \param ui32BackgroundColor is the background color for the chart. +//! \param ui32TextColor is the color of text (titles, labels, etc.) +//! \param ui32Y0Color is the color of the Y-axis gridline at Y=0 +//! \param ui32GridColor is the color of grid lines. +//! \param psAxisX is a pointer to the axis structure for the X-axis. +//! \param psAxisY is a pointer to the axis structure for the Y-axis. +//! \param psOffscreenDisplay is a buffer for rendering the chart before +//! showing on the physical display. The dimensions of the off-screen display +//! should match the drawing area of psDisplay. +//! +//! This macro declares a variable containing an initialized strip chart widget +//! data structure, which can be used to construct the widget tree at compile +//! time in global variables (as opposed to run-time via function calls). +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define StripChart(sName, psParent, psNext, psChild, psDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + pcTitle, psFont, ui32BackgroundColor, ui32TextColor, \ + ui32Y0Color, ui32GridColor, psAxisX, psAxisY, \ + psOffscreenDisplay) \ + tStripChartWidget sName = \ + StripChartStruct(psParent, psNext, psChild, psDisplay, \ + i32X, i32Y, i32Width, i32Height, \ + pcTitle, psFont, ui32BackgroundColor, \ + ui32TextColor, ui32Y0Color, ui32GridColor, \ + psAxisX, psAxisY, psOffscreenDisplay) + +//***************************************************************************** +// +//! Sets the X-axis of the strip chart. +//! +//! \param psStripChartWidget is a pointer to the strip chart widget to modify. +//! \param psAxis is the new X-axis structure for the strip chart. +//! +//! This function sets the X-axis for the widget. +//! +//! \return None. +// +//***************************************************************************** +#define StripChartXAxisSet(psStripChartWidget, psAxis) \ + do \ + { \ + (psStripChartWidget)->psAxisX = psAxis; \ + } while(0) + +//***************************************************************************** +// +//! Sets the Y-axis of the strip chart. +//! +//! \param psStripChartWidget is a pointer to the strip chart widget to modify. +//! \param psAxis is the new Y-axis structure for the strip chart. +//! +//! This function sets the Y-axis for the widget. +//! +//! \return None. +// +//***************************************************************************** +#define StripChartYAxisSet(psStripChartWidget, psAxis) \ + do \ + { \ + (psStripChartWidget)->psAxisY = psAxis; \ + } while(0) + +//***************************************************************************** +// +// Prototypes for the strip chart widget APIs. +// +//***************************************************************************** +extern int32_t StripChartMsgProc(tWidget *psWidget, uint32_t ui32Msg, + uint32_t ui32Param1, uint32_t ui32Param2); +extern void StripChartInit(tStripChartWidget *psWidget, + const tDisplay *psDisplay, + int32_t i32X, int32_t i32Y, + int32_t i32Width, int32_t i32Height, + char * pcTitle, tFont *psFont, + uint32_t ui32BackgroundColor, + uint32_t ui32TextColor, + uint32_t ui32Y0Color, + uint32_t ui32GridColor, + tStripChartAxis *psAxisX, tStripChartAxis *psAxisY, + tDisplay *psOffscreenDisplay); +extern void StripChartSeriesAdd(tStripChartWidget *psWidget, + tStripChartSeries *psSeries); +extern void StripChartSeriesRemove(tStripChartWidget *psWidget, + tStripChartSeries *psSeries); +extern void StripChartAdvance(tStripChartWidget *psChartWidget, + int32_t i32Count); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#endif // __STRIPCHARTWIDGET_H__ diff --git a/boards/ek-lm4f232/drivers/usb_sound.c b/boards/ek-lm4f232/drivers/usb_sound.c new file mode 100644 index 0000000..332f556 --- /dev/null +++ b/boards/ek-lm4f232/drivers/usb_sound.c @@ -0,0 +1,804 @@ +//***************************************************************************** +// +// usb_sound.c - USB host audio handling functions. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "drivers/usb_sound.h" +#include "driverlib/gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhaudio.h" + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 768 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pHCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// The instance data for the USB host audio driver. +// +//***************************************************************************** +tUSBHostAudioInstance *g_psAudioInstance = 0; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// This structure holds the state information for the USB audio device. +// +//***************************************************************************** +static struct +{ + // + // Save the application provided callback function. + // + tUSBBufferCallback pfnCallbackOut; + + // + // Save the application provided callback function. + // + tUSBBufferCallback pfnCallbackIn; + + // + // The event callback for the application. + // + tEventCallback pfnCallbackEvent; + + // + // Volume control multipliers calculated from the information received + // from the audio device. + // + uint32_t pui32Steps[3]; + + // + // The currently pending audio device events. + // + uint32_t ui32EventFlags; + + // + // The current state for the audio device. + // + volatile enum + { + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Audio device is ready. + // + STATE_DEVICE_READY, + + // + // An unsupported device has been attached. + // + STATE_UNKNOWN_DEVICE, + + // + // A power fault has occurred. + // + STATE_POWER_FAULT + } eState; + +} g_sAudioState; + +//***************************************************************************** +// +// These defines are used with the ui32EventFlags in the g_sAudioState structure. +// +//***************************************************************************** +#define EVENT_OPEN 0x00000001 +#define EVENT_CLOSE 0x00000002 + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the host audio class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostAudioClassDriver + ,&g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. In this application uDMA is only used for USB, +// so only the first 6 channels are needed. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_sDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_sDMAControlTable, 1024) +tDMAControlTable g_sDMAControlTable[64]; +#else +tDMAControlTable g_sDMAControlTable[64] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// This function was the callback function registered with the USB host audio +// class driver. The only two events that are handled at this point are the +// USBH_AUDIO_EVENT_OPEN and USBH_AUDIO_EVENT_CLOSE which indicate that a new +// audio device has been found or that an existing audio device has been +// disconnected. +// +//***************************************************************************** +static void +AudioCallback(tUSBHostAudioInstance *psAudioInstance, + uint32_t ui32Event, + uint32_t ui32MsgParam, + void *pvBuffer) +{ + switch(ui32Event) + { + // + // New USB audio device has been enabled. + // + case USBH_AUDIO_EVENT_OPEN: + { + // + // Set the EVENT_OPEN flag and let the main routine handle it. + // + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_OPEN) = 1; + + break; + } + + // + // USB audio device has been removed. + // + case USBH_AUDIO_EVENT_CLOSE: + { + // + // Set the EVENT_CLOSE flag and let the main routine handle it. + // + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_CLOSE) = 1; + + break; + } + default: + { + } + } +} + +//***************************************************************************** +// +// Initializes the sound output. +// +// \param ui32Flags is unused as this point but is included for future +// functionality. +// \param pfnCallback is the event callback function for audio devices. +// +// This function prepares the sound driver to enumerate an audio device and +// prepares to play audio once a valid audio device is detected. The +// \e pfnCallback function can be used to receive callbacks when there are +// changes related to the audio device. The ui32Event parameter to the callback +// will be one of the SOUND_EVENT_* values. +// +// \return None +// +//***************************************************************************** +void +USBSoundInit(uint32_t ui32Flags, tEventCallback pfnCallback) +{ + // + // Enable the peripherals used by this example. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Set the USB power pins to be controlled by the USB controller. + // + GPIOPinTypeUSBDigital(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7); + + // + // Enable the uDMA controller and set up the control table base. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + uDMAEnable(); + uDMAControlBaseSet(g_sDMAControlTable); + + // + // Initialize the USB stack mode to OTG. + // + USBStackModeSet(0, eUSBModeOTG, 0); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the audio class driver. + // + g_psAudioInstance = USBHostAudioOpen(0, AudioCallback); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Initialize the USB controller for OTG operation with a 2ms polling + // rate. + // + USBOTGModeInit(0, 2000, g_pHCDPool, HCD_MEMORY_SIZE); + + // + // Save the event callback function. + // + g_sAudioState.pfnCallbackEvent = pfnCallback; +} + +//***************************************************************************** +// +// Sets the volume of the audio device. +// +// \param ui32Percent is the volume percentage, which must be between 0% +// (silence) and 100% (full volume), inclusive. +// +// This function sets the volume of the sound output to a value between +// silence (0%) and full volume (100%). +// +// \return None. +// +//***************************************************************************** +void +USBSoundVolumeSet(uint32_t ui32Percent) +{ + uint32_t ui32Value; + + // + // Ignore volume changes if there is no device present. + // + if(g_sAudioState.eState == STATE_DEVICE_READY) + { + // + // Scale the voltage percentage to the decibel range provided by the + // USB audio device. + // + ui32Value = (g_sAudioState.pui32Steps[1] * ui32Percent) / 100; + USBHostAudioVolumeSet(g_psAudioInstance, 0, 1, ui32Value); + + ui32Value = (g_sAudioState.pui32Steps[2] * ui32Percent) / 100; + USBHostAudioVolumeSet(g_psAudioInstance, 0, 2, ui32Value); + } +} + +//***************************************************************************** +// +// Returns the current volume level. +// +// \param ui32Channel is the 0 based channel number to query. +// +// This function returns the current volume, specified as a percentage between +// 0% (silence) and 100% (full volume), inclusive. The \e ui32Channel value +// starts with 0 which is the master audio volume control interface. The +// remaining \e ui32Channel values provide access to various other audio +// channels, with 1 and 2 being left and right audio channels. +// +// \return Returns the current volume. +// +//***************************************************************************** +uint32_t +USBSoundVolumeGet(uint32_t ui32Channel) +{ + uint32_t ui32Volume; + + // + // Initialize the return value in case there is no USB device present. + // + ui32Volume = 0xffffffff; + + // + // Ignore volume request if there is no device present. + // + if(g_sAudioState.eState == STATE_DEVICE_READY) + { + ui32Volume = USBHostAudioVolumeGet(g_psAudioInstance, 0, ui32Channel); + } + + return(ui32Volume); +} + +//***************************************************************************** +// +// This will set the current output audio format of the USB audio device. +// +// \param ui32SampleRate is the sample rate. +// \param ui32BitsPerSample is the number of bits per sample. +// \param ui32Channels is the number of channels. +// +// This sets the current audio format for the USB device that is currently +// connected. If there is no USB device connected or the format is not +// supported then the function will return a non-zero value. The function +// will return zero if the USB audio device was successfully configured to the +// requested audio format. +// +// \return Returns zero if the format was successfully set or returns an +// non-zero value if the format was not able to be set. +// +//***************************************************************************** +uint32_t +USBSoundOutputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32BitsPerSample, uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(1); + } + + // + // Call the USB Host Audio function to set the format. + // + return(USBHostAudioFormatSet(g_psAudioInstance, ui32SampleRate, + ui32BitsPerSample, ui32Channels, + USBH_AUDIO_FORMAT_OUT)); +} + +//***************************************************************************** +// +// This will set the current input audio format of the USB audio device +// +// \param ui32SampleRate is the sample rate. +// \param ui32BitsPerSample is the number of bits per sample. +// \param ui32Channels is the number of channels. +// +// This sets the current format for the USB device that is currently connect. +// If there is no USB device connected or the format is not supported then the +// function will return 0. The function will return 1 if the USB audio device +// was successfully configured to the requested format. +// +// \return Returns 1 if the format was successfully set or returns 0 if the +// format was not changed. +// +//***************************************************************************** +uint32_t +USBSoundInputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32BitsPerSample, uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(0); + } + + return(USBHostAudioFormatSet(g_psAudioInstance, ui32SampleRate, + ui32BitsPerSample, ui32Channels, + USBH_AUDIO_FORMAT_IN)); +} + +//***************************************************************************** +// +// Returns the current sample rate. +// +// This function returns the sample rate that was set by a call to +// USBSoundSetFormat(). This is needed to retrieve the exact sample rate that is +// in use in case the requested rate could not be matched exactly. +// +// \return The current sample rate in samples/second. +// +//***************************************************************************** +uint32_t +USBSoundOutputFormatGet(uint32_t ui32SampleRate, uint32_t ui32Bits, + uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(0); + } + + return(USBHostAudioFormatGet(g_psAudioInstance, ui32SampleRate, ui32Bits, + ui32Channels, USBH_AUDIO_FORMAT_OUT)); +} + +//***************************************************************************** +// +// Returns the current sample rate. +// +// This function returns the sample rate that was set by a call to +// USBSoundSetFormat(). This is needed to retrieve the exact sample rate that is +// in use in case the requested rate could not be matched exactly. +// +// \return The current sample rate in samples/second. +// +//***************************************************************************** +uint32_t +USBSoundInputFormatGet(uint32_t ui32SampleRate, uint32_t ui32Bits, + uint32_t ui32Channels) +{ + // + // Just return if there is no device at this time. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(0); + } + + return(USBHostAudioFormatGet(g_psAudioInstance, ui32SampleRate, ui32Bits, + ui32Channels, USBH_AUDIO_FORMAT_IN)); +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// \param pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the audio device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenerii8EventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +// \return None. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *psEventInfo; + + // + // Cast this pointer to its actual type. + // + psEventInfo = (tEventInfo *)pvData; + + switch(psEventInfo->ui32Event) + { + // + // Unknown device detected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + // + // An unknown device was detected. + // + g_sAudioState.eState = STATE_UNKNOWN_DEVICE; + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_UNKNOWN_DEV, 1); + } + + break; + } + + // + // Device unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Handle the case where an unknown device is disconnected. + // + if(g_sAudioState.eState == STATE_UNKNOWN_DEVICE) + { + g_sAudioState.eState = STATE_NO_DEVICE; + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_UNKNOWN_DEV, 0); + } + } + else + { + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_DISCONNECT, 0); + } + } + + break; + } + + // + // A power fault has occurred. + // + case USB_EVENT_POWER_FAULT: + { + // + // No power means no device is present. + // + g_sAudioState.eState = STATE_POWER_FAULT; + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This function passes along a buffer callback from the USB host audio driver +// so that the application can process or release the buffers. +// +//***************************************************************************** +void +USBHostAudioCallback(tUSBHostAudioInstance *psAudioInstance, + uint32_t ui32Event, uint32_t ui32Param, void *pvBuffer) +{ + // + // Only call the callback if it is actually present. + // + if(g_sAudioState.pfnCallbackOut) + { + g_sAudioState.pfnCallbackOut(pvBuffer, ui32Event); + } + + // + // Only call the callback if it is actually present. + // + if(g_sAudioState.pfnCallbackIn) + { + g_sAudioState.pfnCallbackIn(pvBuffer, ui32Event); + } +} + +//***************************************************************************** +// +// Starts output of a block of PCM audio samples. +// +// \param pvBuffer is a pointer to the audio data to play. +// \param ui32Size is the length of the data in bytes. +// \param pfnCallback is a function to call when this buffer has be played. +// +// This function starts the output of a block of PCM audio samples. +// +// \return This function returns a non-zero value if the buffer was accepted, +// and returns zero if the buffer was not accepted. +// +//***************************************************************************** +uint32_t +USBSoundBufferOut(const void *pvBuffer, uint32_t ui32Size, + tUSBBufferCallback pfnCallback) +{ + // + // If there is no device present or there is a pending buffer then just + // return with a failure. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(0); + } + + // + // Save this buffer callback. + // + g_sAudioState.pfnCallbackOut = pfnCallback; + + // + // Pass the buffer aint32_t to the USB host audio driver for playback. + // + return(USBHostAudioPlay(g_psAudioInstance, (void *)pvBuffer, ui32Size, + USBHostAudioCallback)); +} + +//***************************************************************************** +// +// Requests a new block of PCM audio samples from a USB audio device. +// +// \param pvBuffer is a pointer to a location to store the audio data. +// \param ui32Size is the size of the pvData buffer in bytes. +// \param pfnCallback is a function to call when this buffer has new data. +// +// This function request a new block of PCM audio samples from a USB audio +// device. +// +// \return This function returns a non-zero value if the buffer was accepted, +// and returns zero if the buffer was not accepted. +// +//***************************************************************************** +uint32_t +USBSoundBufferIn(const void *pvBuffer, uint32_t ui32Size, + tUSBBufferCallback pfnCallback) +{ + // + // If there is no device present or there is a pending buffer then just + // return with a failure. + // + if(g_sAudioState.eState != STATE_DEVICE_READY) + { + return(0); + } + + // + // Save this buffer callback. + // + g_sAudioState.pfnCallbackIn = pfnCallback; + + // + // Pass the buffer aint32_t to the USB host audio driver for input. + // + return(USBHostAudioRecord(g_psAudioInstance, (void *)pvBuffer, ui32Size, + USBHostAudioCallback)); +} + +//***************************************************************************** +// +// This function reads the audio volume settings for the USB audio device and +// saves them so that the volume can be scaled correctly. +// +//***************************************************************************** +static void +GetVolumeParameters(void) +{ + uint32_t ui32Max, ui32Min, ui32Res, ui32Channel; + + for(ui32Channel = 0; ui32Channel < 3; ui32Channel++) + { + ui32Max = USBHostAudioVolumeMaxGet(g_psAudioInstance, 0, ui32Channel); + ui32Min = USBHostAudioVolumeMinGet(g_psAudioInstance, 0, ui32Channel); + ui32Res = USBHostAudioVolumeResGet(g_psAudioInstance, 0, ui32Channel); + + g_sAudioState.pui32Steps[ui32Channel] = (ui32Max - ui32Min) / ui32Res; + } +} + +//***************************************************************************** +// +// The main routine for handling USB audio, this should be called periodically +// by the main program and pass in the amount of time in milliseconds that has +// elapsed since the last call. +// +//***************************************************************************** +void +USBMain(uint32_t ui32Ticks) +{ + // + // Tell the OTG library code how much time has passed in + // milliseconds since the last call. + // + USBOTGMain(ui32Ticks); + + switch(g_sAudioState.eState) + { + // + // This is the running state where buttons are checked and the + // screen is updated. + // + case STATE_DEVICE_READY: + { + if(HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_CLOSE)) + { + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_CLOSE) = 0; + g_sAudioState.eState = STATE_NO_DEVICE; + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_DISCONNECT, 0); + } + } + break; + } + + // + // If there is no device then just wait for one. + // + case STATE_NO_DEVICE: + { + if(HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_OPEN)) + { + g_sAudioState.eState = STATE_DEVICE_READY; + + HWREGBITW(&g_sAudioState.ui32EventFlags, EVENT_OPEN) = 0; + + GetVolumeParameters(); + + // + // Call the general event handler if present. + // + if(g_sAudioState.pfnCallbackEvent) + { + g_sAudioState.pfnCallbackEvent(SOUND_EVENT_READY, 0); + } + } + break; + } + + // + // An unknown device was connected. + // + case STATE_UNKNOWN_DEVICE: + { + break; + } + + // + // Something has caused a power fault. + // + case STATE_POWER_FAULT: + { + break; + } + + default: + { + break; + } + } +} diff --git a/boards/ek-lm4f232/drivers/usb_sound.h b/boards/ek-lm4f232/drivers/usb_sound.h new file mode 100644 index 0000000..04bf459 --- /dev/null +++ b/boards/ek-lm4f232/drivers/usb_sound.h @@ -0,0 +1,81 @@ +//***************************************************************************** +// +// usb_sound.h - USB host audio handling header definitions. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef USB_SOUND_H_ +#define USB_SOUND_H_ + +//***************************************************************************** +// +// The following are defines for the ui32Event value that is returned with the +// tEventCallback function provided to the USBSoundInit() function. +// +//***************************************************************************** + +// +// A USB audio device has been connected. +// +#define SOUND_EVENT_READY 0x00000001 + +// +// A USB device has been disconnected. +// +#define SOUND_EVENT_DISCONNECT 0x00000002 + +// +// An unknown device has been connected. +// +#define SOUND_EVENT_UNKNOWN_DEV 0x00000003 + +typedef void (* tUSBBufferCallback)(void *pvBuffer, uint32_t ui32Event); +typedef void (* tEventCallback)(uint32_t ui32Event, uint32_t ui32Param); + +extern void USBMain(uint32_t ui32Ticks); + +extern void USBSoundInit(uint32_t ui32EnableReceive, + tEventCallback pfnCallback); +extern void USBSoundVolumeSet(uint32_t ui32Percent); +extern uint32_t USBSoundVolumeGet(uint32_t ui32Channel); + +extern uint32_t USBSoundOutputFormatGet(uint32_t ui32SampleRate, + uint32_t ui32Bits, + uint32_t ui32Channels); +extern uint32_t USBSoundOutputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32Bits, + uint32_t ui32Channels); +extern uint32_t USBSoundInputFormatGet(uint32_t ui32SampleRate, + uint32_t ui32BitsPerSample, + uint32_t ui32Channels); +extern uint32_t USBSoundInputFormatSet(uint32_t ui32SampleRate, + uint32_t ui32Bits, + uint32_t ui32Channels); + +extern uint32_t USBSoundBufferOut(const void *pvData, + uint32_t ui32Length, + tUSBBufferCallback pfnCallback); + +extern uint32_t USBSoundBufferIn(const void *pvData, + uint32_t ui32Length, + tUSBBufferCallback pfnCallback); + +#endif diff --git a/boards/ek-lm4f232/ek-lm4f232.eww b/boards/ek-lm4f232/ek-lm4f232.eww new file mode 100644 index 0000000..7b0fa7b --- /dev/null +++ b/boards/ek-lm4f232/ek-lm4f232.eww @@ -0,0 +1,226 @@ + + + + + $WS_DIR$\..\..\..\driverlib\driverlib.ewp + + + $WS_DIR$\..\..\..\grlib\grlib.ewp + + + $WS_DIR$\..\..\..\usblib\usblib.ewp + + + $WS_DIR$\bitband\bitband.ewp + + + $WS_DIR$\blinky\blinky.ewp + + + $WS_DIR$\boot_demo1\boot_demo1.ewp + + + $WS_DIR$\boot_demo2\boot_demo2.ewp + + + $WS_DIR$\boot_serial\boot_serial.ewp + + + $WS_DIR$\boot_usb\boot_usb.ewp + + + $WS_DIR$\hello\hello.ewp + + + $WS_DIR$\hibernate\hibernate.ewp + + + $WS_DIR$\interrupts\interrupts.ewp + + + $WS_DIR$\mpu_fault\mpu_fault.ewp + + + $WS_DIR$\qs-logger\qs-logger.ewp + + + $WS_DIR$\sd_card\sd_card.ewp + + + $WS_DIR$\sine_demo\sine_demo.ewp + + + $WS_DIR$\softuart_echo\softuart_echo.ewp + + + $WS_DIR$\timers\timers.ewp + + + $WS_DIR$\uart_echo\uart_echo.ewp + + + $WS_DIR$\udma_demo\udma_demo.ewp + + + $WS_DIR$\usb_dev_bulk\usb_dev_bulk.ewp + + + $WS_DIR$\usb_dev_keyboard\usb_dev_keyboard.ewp + + + $WS_DIR$\usb_dev_msc\usb_dev_msc.ewp + + + $WS_DIR$\usb_dev_serial\usb_dev_serial.ewp + + + $WS_DIR$\usb_host_audio\usb_host_audio.ewp + + + $WS_DIR$\usb_host_msc\usb_host_msc.ewp + + + $WS_DIR$\usb_host_keyboard\usb_host_keyboard.ewp + + + $WS_DIR$\usb_host_mouse\usb_host_mouse.ewp + + + $WS_DIR$\usb_stick_demo\usb_stick_demo.ewp + + + $WS_DIR$\usb_stick_update\usb_stick_update.ewp + + + $WS_DIR$\watchdog\watchdog.ewp + + + + All Examples + + driverlib + Debug + + + grlib + Debug + + + usblib + Debug + + + bitband + Debug + + + blinky + Debug + + + boot_demo1 + Debug + + + boot_demo2 + Debug + + + boot_serial + Debug + + + boot_usb + Debug + + + hello + Debug + + + hibernate + Debug + + + interrupts + Debug + + + mpu_fault + Debug + + + qs-logger + Debug + + + sd_card + Debug + + + sine_demo + Debug + + + softuart_echo + Debug + + + timers + Debug + + + uart_echo + Debug + + + udma_demo + Debug + + + usb_dev_bulk + Debug + + + usb_dev_keyboard + Debug + + + usb_dev_msc + Debug + + + usb_dev_serial + Debug + + + usb_host_audio + Debug + + + usb_host_msc + Debug + + + usb_host_keyboard + Debug + + + usb_host_mouse + Debug + + + usb_stick_demo + Debug + + + usb_stick_update + Debug + + + watchdog + Debug + + + + diff --git a/boards/ek-lm4f232/ek-lm4f232.uvmpw b/boards/ek-lm4f232/ek-lm4f232.uvmpw new file mode 100644 index 0000000..4fbf00f --- /dev/null +++ b/boards/ek-lm4f232/ek-lm4f232.uvmpw @@ -0,0 +1,165 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + ek-lm4f232 + + + ..\..\..\driverlib\driverlib.uvproj + 1 + + + + ..\..\..\grlib\grlib.uvproj + 1 + + + + ..\..\..\usblib\usblib.uvproj + 1 + + + + .\bitband\bitband.uvproj + 1 + + + + .\blinky\blinky.uvproj + 1 + + + + .\boot_demo1\boot_demo1.uvproj + 1 + + + + .\boot_demo2\boot_demo2.uvproj + 1 + + + + .\boot_serial\boot_serial.uvproj + 1 + + + + .\boot_usb\boot_usb.uvproj + 1 + + + + .\hello\hello.uvproj + 1 + + + + .\hibernate\hibernate.uvproj + 1 + + + + .\interrupts\interrupts.uvproj + 1 + + + + .\mpu_fault\mpu_fault.uvproj + 1 + + + + .\qs-logger\qs-logger.uvproj + 1 + + + + .\sd_card\sd_card.uvproj + 1 + + + + .\sine_demo\sine_demo.uvproj + 1 + + + + .\softuart_echo\softuart_echo.uvproj + 1 + + + + .\timers\timers.uvproj + 1 + + + + .\uart_echo\uart_echo.uvproj + 1 + + + + .\udma_demo\udma_demo.uvproj + 1 + + + + .\usb_dev_bulk\usb_dev_bulk.uvproj + 1 + + + + .\usb_dev_keyboard\usb_dev_keyboard.uvproj + 1 + + + + .\usb_dev_msc\usb_dev_msc.uvproj + 1 + + + + .\usb_dev_serial\usb_dev_serial.uvproj + 1 + + + + .\usb_host_audio\usb_host_audio.uvproj + 1 + + + + .\usb_host_msc\usb_host_msc.uvproj + 1 + + + + .\usb_host_keyboard\usb_host_keyboard.uvproj + 1 + + + + .\usb_host_mouse\usb_host_mouse.uvproj + 1 + + + + .\usb_stick_demo\usb_stick_demo.uvproj + 1 + + + + .\usb_stick_update\usb_stick_update.uvproj + 1 + + + + .\watchdog\watchdog.uvproj + 1 + + +
      diff --git a/boards/ek-lm4f232/hello/Makefile b/boards/ek-lm4f232/hello/Makefile new file mode 100644 index 0000000..a8bd98b --- /dev/null +++ b/boards/ek-lm4f232/hello/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the hello example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the hello example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/hello.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the hello example. +# +${COMPILER}/hello.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/hello.axf: ${COMPILER}/hello.o +${COMPILER}/hello.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/hello.axf: ${COMPILER}/uartstdio.o +${COMPILER}/hello.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/hello.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/hello.axf: hello.ld +SCATTERgcc_hello=hello.ld +ENTRY_hello=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/hello/ccs/.ccsimportspec b/boards/ek-lm4f232/hello/ccs/.ccsimportspec new file mode 100644 index 0000000..77b03f5 --- /dev/null +++ b/boards/ek-lm4f232/hello/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/hello/ccs/.ccsproject b/boards/ek-lm4f232/hello/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/hello/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/hello/ccs/.cproject b/boards/ek-lm4f232/hello/ccs/.cproject new file mode 100644 index 0000000..a0a9331 --- /dev/null +++ b/boards/ek-lm4f232/hello/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/hello/ccs/.project b/boards/ek-lm4f232/hello/ccs/.project new file mode 100644 index 0000000..155d942 --- /dev/null +++ b/boards/ek-lm4f232/hello/ccs/.project @@ -0,0 +1,60 @@ + + + hello + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + hello.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/hello/hello.c + + + hello_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/hello/hello_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/hello/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/hello/ccs/Debug/hello.bin b/boards/ek-lm4f232/hello/ccs/Debug/hello.bin new file mode 100644 index 0000000..012beb3 Binary files /dev/null and b/boards/ek-lm4f232/hello/ccs/Debug/hello.bin differ diff --git a/boards/ek-lm4f232/hello/ccs/Debug/hello.out b/boards/ek-lm4f232/hello/ccs/Debug/hello.out new file mode 100644 index 0000000..0a43e53 Binary files /dev/null and b/boards/ek-lm4f232/hello/ccs/Debug/hello.out differ diff --git a/boards/ek-lm4f232/hello/ccs/macros.ini_initial b/boards/ek-lm4f232/hello/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/hello/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/hello/ccs/target_config.ccxml b/boards/ek-lm4f232/hello/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/hello/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/hello/ewarm/Exe/hello.bin b/boards/ek-lm4f232/hello/ewarm/Exe/hello.bin new file mode 100644 index 0000000..304947c Binary files /dev/null and b/boards/ek-lm4f232/hello/ewarm/Exe/hello.bin differ diff --git a/boards/ek-lm4f232/hello/ewarm/Exe/hello.out b/boards/ek-lm4f232/hello/ewarm/Exe/hello.out new file mode 100644 index 0000000..96392e7 Binary files /dev/null and b/boards/ek-lm4f232/hello/ewarm/Exe/hello.out differ diff --git a/boards/ek-lm4f232/hello/gcc/hello.axf b/boards/ek-lm4f232/hello/gcc/hello.axf new file mode 100644 index 0000000..0921cf4 Binary files /dev/null and b/boards/ek-lm4f232/hello/gcc/hello.axf differ diff --git a/boards/ek-lm4f232/hello/gcc/hello.bin b/boards/ek-lm4f232/hello/gcc/hello.bin new file mode 100644 index 0000000..02f0f9d Binary files /dev/null and b/boards/ek-lm4f232/hello/gcc/hello.bin differ diff --git a/boards/ek-lm4f232/hello/hello.c b/boards/ek-lm4f232/hello/hello.c new file mode 100644 index 0000000..f0709d5 --- /dev/null +++ b/boards/ek-lm4f232/hello/hello.c @@ -0,0 +1,183 @@ +//***************************************************************************** +// +// hello.c - Simple hello world example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/fpu.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/pin_map.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" +#include "utils/uartstdio.h" +#include "driverlib/gpio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Hello World (hello)

      +//! +//! A very simple ``hello world'' example. It simply displays ``Hello World!'' +//! on the display and is a starting point for more complicated applications. +//! This example uses calls to the TivaWare Graphics Library graphics +//! primitives functions to update the display. For a similar example using +//! widgets, please see ``hello_widget''. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// Print "Hello World!" to the display. +// +//***************************************************************************** +int +main(void) +{ + tContext sContext; + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Initialize the UART. + // + ConfigureUART(); + + UARTprintf("Hello, world!\n"); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top 24 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 23; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&sContext, ClrWhite); + GrRectDraw(&sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontCm12); + GrStringDrawCentered(&sContext, "hello", -1, + GrContextDpyWidthGet(&sContext) / 2, 10, 0); + + // + // Say hello using the Computer Modern 40 point font. + // + GrContextFontSet(&sContext, g_psFontCm12/*g_psFontFixed6x8*/); + GrStringDrawCentered(&sContext, "Hello World!", -1, + GrContextDpyWidthGet(&sContext) / 2, + ((GrContextDpyHeightGet(&sContext) - 24) / 2) + 24, + 0); + + // + // Flush any cached drawing operations. + // + GrFlush(&sContext); + + // + // We are finished. Hang around doing nothing. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/hello/hello.ewd b/boards/ek-lm4f232/hello/hello.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/hello/hello.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/hello/hello.ewp b/boards/ek-lm4f232/hello/hello.ewp new file mode 100644 index 0000000..5c79ccf --- /dev/null +++ b/boards/ek-lm4f232/hello/hello.ewp @@ -0,0 +1,795 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\hello.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/ek-lm4f232/hello/hello.icf b/boards/ek-lm4f232/hello/hello.icf new file mode 100644 index 0000000..08e54a7 --- /dev/null +++ b/boards/ek-lm4f232/hello/hello.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// hello.icf - Linker configuration file for hello. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/hello/hello.ld b/boards/ek-lm4f232/hello/hello.ld new file mode 100644 index 0000000..80b6a0f --- /dev/null +++ b/boards/ek-lm4f232/hello/hello.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * hello.ld - Linker configuration file for hello. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/hello/hello.sct b/boards/ek-lm4f232/hello/hello.sct new file mode 100644 index 0000000..0a7c102 --- /dev/null +++ b/boards/ek-lm4f232/hello/hello.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; hello.sct - Linker configuration file for hello. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/hello/hello.uvopt b/boards/ek-lm4f232/hello/hello.uvopt new file mode 100644 index 0000000..9c0c424 --- /dev/null +++ b/boards/ek-lm4f232/hello/hello.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + hello + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\hello.c + hello.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/hello/hello.uvproj b/boards/ek-lm4f232/hello/hello.uvproj new file mode 100644 index 0000000..70ef07e --- /dev/null +++ b/boards/ek-lm4f232/hello/hello.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + hello + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + hello + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\hello.bin .\rvmdk\hello.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + hello.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + hello.c + 1 + .\hello.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/hello/hello_ccs.cmd b/boards/ek-lm4f232/hello/hello_ccs.cmd new file mode 100644 index 0000000..11fc3be --- /dev/null +++ b/boards/ek-lm4f232/hello/hello_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * hello_ccs.cmd - CCS linker configuration file for hello. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-lm4f232/hello/readme.txt b/boards/ek-lm4f232/hello/readme.txt new file mode 100644 index 0000000..51b90ab --- /dev/null +++ b/boards/ek-lm4f232/hello/readme.txt @@ -0,0 +1,27 @@ +Hello World + +A very simple ``hello world'' example. It simply displays ``Hello World!'' +on the display and is a starting point for more complicated applications. +This example uses calls to the TivaWare Graphics Library graphics +primitives functions to update the display. For a similar example using +widgets, please see ``hello_widget''. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/hello/rvmdk/hello.axf b/boards/ek-lm4f232/hello/rvmdk/hello.axf new file mode 100644 index 0000000..410e121 Binary files /dev/null and b/boards/ek-lm4f232/hello/rvmdk/hello.axf differ diff --git a/boards/ek-lm4f232/hello/rvmdk/hello.bin b/boards/ek-lm4f232/hello/rvmdk/hello.bin new file mode 100644 index 0000000..d9ea5ab Binary files /dev/null and b/boards/ek-lm4f232/hello/rvmdk/hello.bin differ diff --git a/boards/ek-lm4f232/hello/startup_ccs.c b/boards/ek-lm4f232/hello/startup_ccs.c new file mode 100644 index 0000000..f21c31c --- /dev/null +++ b/boards/ek-lm4f232/hello/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/hello/startup_ewarm.c b/boards/ek-lm4f232/hello/startup_ewarm.c new file mode 100644 index 0000000..68689bf --- /dev/null +++ b/boards/ek-lm4f232/hello/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/hello/startup_gcc.c b/boards/ek-lm4f232/hello/startup_gcc.c new file mode 100644 index 0000000..2f64c5e --- /dev/null +++ b/boards/ek-lm4f232/hello/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/hello/startup_rvmdk.S b/boards/ek-lm4f232/hello/startup_rvmdk.S new file mode 100644 index 0000000..f256163 --- /dev/null +++ b/boards/ek-lm4f232/hello/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/hibernate/Makefile b/boards/ek-lm4f232/hibernate/Makefile new file mode 100644 index 0000000..50b7139 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the hibernation example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the hibernation example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/hibernate.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the hibernation example. +# +${COMPILER}/hibernate.axf: ${COMPILER}/buttons.o +${COMPILER}/hibernate.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/hibernate.axf: ${COMPILER}/hibernate.o +${COMPILER}/hibernate.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/hibernate.axf: ${COMPILER}/uartstdio.o +${COMPILER}/hibernate.axf: ${COMPILER}/ustdlib.o +${COMPILER}/hibernate.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/hibernate.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/hibernate.axf: hibernate.ld +SCATTERgcc_hibernate=hibernate.ld +ENTRY_hibernate=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/hibernate/ccs/.ccsimportspec b/boards/ek-lm4f232/hibernate/ccs/.ccsimportspec new file mode 100644 index 0000000..160e565 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/hibernate/ccs/.ccsproject b/boards/ek-lm4f232/hibernate/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/hibernate/ccs/.cproject b/boards/ek-lm4f232/hibernate/ccs/.cproject new file mode 100644 index 0000000..6a6d539 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/hibernate/ccs/.project b/boards/ek-lm4f232/hibernate/ccs/.project new file mode 100644 index 0000000..d1f410d --- /dev/null +++ b/boards/ek-lm4f232/hibernate/ccs/.project @@ -0,0 +1,70 @@ + + + hibernate + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + hibernate.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/hibernate/hibernate.c + + + hibernate_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/hibernate/hibernate_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/hibernate/startup_ccs.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/hibernate/ccs/Debug/hibernate.bin b/boards/ek-lm4f232/hibernate/ccs/Debug/hibernate.bin new file mode 100644 index 0000000..bcaa829 Binary files /dev/null and b/boards/ek-lm4f232/hibernate/ccs/Debug/hibernate.bin differ diff --git a/boards/ek-lm4f232/hibernate/ccs/Debug/hibernate.out b/boards/ek-lm4f232/hibernate/ccs/Debug/hibernate.out new file mode 100644 index 0000000..4421ce7 Binary files /dev/null and b/boards/ek-lm4f232/hibernate/ccs/Debug/hibernate.out differ diff --git a/boards/ek-lm4f232/hibernate/ccs/macros.ini_initial b/boards/ek-lm4f232/hibernate/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/hibernate/ccs/target_config.ccxml b/boards/ek-lm4f232/hibernate/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/hibernate/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/hibernate/ewarm/Exe/hibernate.bin b/boards/ek-lm4f232/hibernate/ewarm/Exe/hibernate.bin new file mode 100644 index 0000000..cd07400 Binary files /dev/null and b/boards/ek-lm4f232/hibernate/ewarm/Exe/hibernate.bin differ diff --git a/boards/ek-lm4f232/hibernate/ewarm/Exe/hibernate.out b/boards/ek-lm4f232/hibernate/ewarm/Exe/hibernate.out new file mode 100644 index 0000000..22e3629 Binary files /dev/null and b/boards/ek-lm4f232/hibernate/ewarm/Exe/hibernate.out differ diff --git a/boards/ek-lm4f232/hibernate/gcc/hibernate.axf b/boards/ek-lm4f232/hibernate/gcc/hibernate.axf new file mode 100644 index 0000000..51128e9 Binary files /dev/null and b/boards/ek-lm4f232/hibernate/gcc/hibernate.axf differ diff --git a/boards/ek-lm4f232/hibernate/gcc/hibernate.bin b/boards/ek-lm4f232/hibernate/gcc/hibernate.bin new file mode 100644 index 0000000..88b442e Binary files /dev/null and b/boards/ek-lm4f232/hibernate/gcc/hibernate.bin differ diff --git a/boards/ek-lm4f232/hibernate/hibernate.c b/boards/ek-lm4f232/hibernate/hibernate.c new file mode 100644 index 0000000..396b0aa --- /dev/null +++ b/boards/ek-lm4f232/hibernate/hibernate.c @@ -0,0 +1,545 @@ +//***************************************************************************** +// +// hibernate.c - Hibernation example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/hibernate.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/rom.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" +#include "inc/hw_hibernate.h" +#include "driverlib/pin_map.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Hibernate Example (hibernate)

      +//! +//! An example to demonstrate the use of the Hibernation module. The user +//! can put the microcontroller in hibernation by pressing the select +//! button. The microcontroller will then wake on its own after 5 seconds, +//! or immediately if the user presses the select button again. The program +//! keeps a count of the number of times it has entered hibernation. The +//! value of the counter is stored in the battery backed memory of the +//! Hibernation module so that it can be retrieved when the microcontroller +//! wakes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Macros to convert character based display rows and columns into the pixel +// based X and Y coordinates needed for display drawing functions. +// +//***************************************************************************** +#define Col(c) ((c) * 6) +#define Row(r) ((r) * 8) + +//***************************************************************************** +// +// A counter that counts the number of ticks of the SysTick interrupt. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount = 0; + +//***************************************************************************** +// +// A buffer to hold character strings that will be printed to the display. +// +//***************************************************************************** +static char g_pcBuf[40]; + +//***************************************************************************** +// +// Text that will be displayed if there is an error. +// +//***************************************************************************** +static char *g_pcErrorText[] = +{ + "The controller", + "did not enter", + "hibernate mode.", + "---------------------", + " PRESS BUTTON", + " TO RESTART", + 0 +}; + +//***************************************************************************** +// +// A flag to indicate the select button was pressed. +// +//***************************************************************************** +static volatile bool bSelectPressed = 0; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Delay a certain number of SysTick timer ticks. +// +//***************************************************************************** +void +SysTickWait(uint32_t ui32Ticks) +{ + ui32Ticks += g_ui32SysTickCount; + while(g_ui32SysTickCount <= ui32Ticks) + { + } +} + +//***************************************************************************** +// +// The SysTick handler. Increments a tick counter and debounces the push +// button. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + uint8_t ui8Data, ui8Delta; + + // + // Increment the tick counter. + // + g_ui32SysTickCount++; + + // + // Get buttons status using button debouncer driver + // + ui8Data = ButtonsPoll(&ui8Delta, 0); + + // + // See if the select button was just pressed. + // + if(BUTTON_PRESSED(SELECT_BUTTON, ui8Data, ui8Delta)) + { + // + // Set a flag to indicate that the select button was just pressed. + // + bSelectPressed = 1; + } + + // + // Else, see if the select button was just released. + // + if(BUTTON_RELEASED(SELECT_BUTTON, ui8Data, ui8Delta)) + { + // + // Clear the button pressed flag. + // + bSelectPressed = 0; + } +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// Run the hibernate example. Use a loop to put the microcontroller into +// hibernate mode, and to wake up based on time. Also allow the user to cause +// it to hibernate and/or wake up based on button presses. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Idx; + uint32_t ui32Status = 0; + uint32_t ui32HibernateCount = 0; + tContext sContext; + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the UART. + // + ConfigureUART(); + + // + // Initialize the OLED display + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top 24 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "hibernate", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Initialize the buttons driver + // + ButtonsInit(); + + // + // Set up systick to generate interrupts at 100 Hz. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / 100); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Enable the Hibernation module. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); + + // + // Print wake cause message on display. + // + GrStringDrawCentered(&sContext, "Wake due to:", -1, + GrContextDpyWidthGet(&sContext) / 2, Row(2) + 4, + true); + + // + // Check to see if Hibernation module is already active, which could mean + // that the processor is waking from a hibernation. + // + if(HibernateIsActive()) + { + // + // Read the status bits to see what caused the wake. + // + ui32Status = HibernateIntStatus(0); + HibernateIntClear(ui32Status); + + // + // Wake was due to the push button. + // + if(ui32Status & HIBERNATE_INT_PIN_WAKE) + { + GrStringDrawCentered(&sContext, "BUTTON", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(3) + 4, true); + } + + // + // Wake was due to RTC match + // + else if(ui32Status & HIBERNATE_INT_RTC_MATCH_0) + { + GrStringDrawCentered(&sContext, "TIMEOUT", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(3) + 4, true); + } + + // + // Wake is due to neither button nor RTC, so it must have been a hard + // reset. + // + else + { + GrStringDrawCentered(&sContext, "RESET", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(3) + 4, true); + } + + // + // If the wake is due to button or RTC, then read the first location + // from the battery backed memory, as the hibernation count. + // + if(ui32Status & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0)) + { + HibernateDataGet(&ui32HibernateCount, 1); + } + } + + // + // Enable the Hibernation module. This should always be called, even if + // the module was already enabled, because this function also initializes + // some timing parameters. + // + HibernateEnableExpClk(ROM_SysCtlClockGet()); + + // + // If the wake was not due to button or RTC match, then it was a reset. + // + if(!(ui32Status & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0))) + { + // + // Configure the module clock source. + // + HibernateClockConfig(HIBERNATE_OSC_LOWDRIVE); + + // + // Finish the wake cause message. + // + GrStringDrawCentered(&sContext, "RESET", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(3) + 4, true); + + // + // Wait a couple of seconds in case we need to break in with the + // debugger. + // + SysTickWait(3 * 100); + + // + // Allow time for the crystal to power up. This line is separated from + // the above to make it clear this is still needed, even if the above + // delay is removed. + // + SysTickWait(15); + } + + // + // Print the count of times that hibernate has occurred. + // + usnprintf(g_pcBuf, sizeof(g_pcBuf), "Hib count=%4u", ui32HibernateCount); + GrStringDrawCentered(&sContext, g_pcBuf, -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(1) + 4, true); + + // + // Print messages on the screen about hibernation. + // + GrStringDrawCentered(&sContext, "Select to Hib", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(4) + 4, true); + GrStringDrawCentered(&sContext, "Wake in 5 s,", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(5) + 4, true); + GrStringDrawCentered(&sContext, "or press Select", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(6) + 4, true); + GrStringDrawCentered(&sContext, "for immed. wake.", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(7) + 4, true); + + // + // Clear the button pressed flag, in case it was held down at the + // beginning. + // + bSelectPressed = 0; + + // + // Wait for user to press the button. + // + while(!bSelectPressed) + { + // + // Wait a bit before looping again. + // + SysTickWait(10); + } + + // + // Tell user to release the button. + // + GrStringDrawCentered(&sContext, " ", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(4) + 4, true); + GrStringDrawCentered(&sContext, " ", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(5) + 4, true); + GrStringDrawCentered(&sContext, " ", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(6) + 4, true); + GrStringDrawCentered(&sContext, " ", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(7) + 4, true); + GrStringDrawCentered(&sContext, "Release the", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(5) + 4, true); + GrStringDrawCentered(&sContext, "button.", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(6) + 4, true); + GrStringDrawCentered(&sContext, " ", -1, + GrContextDpyWidthGet(&sContext) / 2, + Row(7) + 4, true); + + // + // Wait for user to release the button. + // + while(bSelectPressed) + { + } + + // + // If hibernation count is very large, it may be that there was already + // a value in the hibernate memory, so reset the count. + // + ui32HibernateCount = (ui32HibernateCount > 10000) ? 0 : ui32HibernateCount; + + // + // Increment the hibernation count, and store it in the battery backed + // memory. + // + ui32HibernateCount++; + HibernateDataSet(&ui32HibernateCount, 1); + + // + // Clear and enable the RTC and set the match registers to 5 seconds in the + // future. Set both to same, though they could be set differently, the + // first to match will cause a wake. + // + HibernateRTCSet(0); + HibernateRTCEnable(); + HibernateRTCMatchSet(0, 5); + + // + // Set wake condition on pin or RTC match. Board will wake when 5 seconds + // elapses, or when the button is pressed. + // + HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC); + + // + // Request hibernation. + // + HibernateRequest(); + + // + // Give it time to activate, it should never get past this wait. + // + SysTickWait(100); + + // + // Should not have got here, something is wrong. Print an error message to + // the user. + // + sRect.i16XMin = 0; + sRect.i16XMax = 95; + sRect.i16YMin = 0; + sRect.i16YMax = 63; + GrContextForegroundSet(&sContext, ClrBlack); + GrRectFill(&sContext, &sRect); + GrContextForegroundSet(&sContext, ClrWhite); + ui32Idx = 0; + while(g_pcErrorText[ui32Idx]) + { + GrStringDraw(&sContext, g_pcErrorText[ui32Idx], -1, Col(0), + Row(ui32Idx), true); + ui32Idx++; + } + + // + // Wait for the user to press the button, then restart the app. + // + bSelectPressed = 0; + while(!bSelectPressed) + { + } + + // + // Reset the processor. + // + ROM_SysCtlReset(); + + // + // Finished. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/hibernate/hibernate.ewd b/boards/ek-lm4f232/hibernate/hibernate.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/hibernate/hibernate.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/hibernate/hibernate.ewp b/boards/ek-lm4f232/hibernate/hibernate.ewp new file mode 100644 index 0000000..01b58c9 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/hibernate.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\hibernate.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-lm4f232/hibernate/hibernate.icf b/boards/ek-lm4f232/hibernate/hibernate.icf new file mode 100644 index 0000000..4d5e0a6 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/hibernate.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// hibernate.icf - Linker configuration file for hibernate. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/hibernate/hibernate.ld b/boards/ek-lm4f232/hibernate/hibernate.ld new file mode 100644 index 0000000..0616e2f --- /dev/null +++ b/boards/ek-lm4f232/hibernate/hibernate.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * hibernate.ld - Linker configuration file for hibernate. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/hibernate/hibernate.sct b/boards/ek-lm4f232/hibernate/hibernate.sct new file mode 100644 index 0000000..6c48662 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/hibernate.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; hibernate.sct - Linker configuration file for hibernate. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/hibernate/hibernate.uvopt b/boards/ek-lm4f232/hibernate/hibernate.uvopt new file mode 100644 index 0000000..1674e39 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/hibernate.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + hibernate + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\hibernate.c + hibernate.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/hibernate/hibernate.uvproj b/boards/ek-lm4f232/hibernate/hibernate.uvproj new file mode 100644 index 0000000..3bc630f --- /dev/null +++ b/boards/ek-lm4f232/hibernate/hibernate.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + hibernate + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + hibernate + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\hibernate.bin .\rvmdk\hibernate.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + hibernate.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + hibernate.c + 1 + .\hibernate.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/hibernate/hibernate_ccs.cmd b/boards/ek-lm4f232/hibernate/hibernate_ccs.cmd new file mode 100644 index 0000000..31c9968 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/hibernate_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * hibernate_ccs.cmd - CCS linker configuration file for hibernate. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-lm4f232/hibernate/readme.txt b/boards/ek-lm4f232/hibernate/readme.txt new file mode 100644 index 0000000..d40c5d7 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/readme.txt @@ -0,0 +1,30 @@ +Hibernate Example + +An example to demonstrate the use of the Hibernation module. The user +can put the microcontroller in hibernation by pressing the select +button. The microcontroller will then wake on its own after 5 seconds, +or immediately if the user presses the select button again. The program +keeps a count of the number of times it has entered hibernation. The +value of the counter is stored in the battery backed memory of the +Hibernation module so that it can be retrieved when the microcontroller +wakes. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/hibernate/rvmdk/hibernate.axf b/boards/ek-lm4f232/hibernate/rvmdk/hibernate.axf new file mode 100644 index 0000000..f12b691 Binary files /dev/null and b/boards/ek-lm4f232/hibernate/rvmdk/hibernate.axf differ diff --git a/boards/ek-lm4f232/hibernate/rvmdk/hibernate.bin b/boards/ek-lm4f232/hibernate/rvmdk/hibernate.bin new file mode 100644 index 0000000..debe05c Binary files /dev/null and b/boards/ek-lm4f232/hibernate/rvmdk/hibernate.bin differ diff --git a/boards/ek-lm4f232/hibernate/startup_ccs.c b/boards/ek-lm4f232/hibernate/startup_ccs.c new file mode 100644 index 0000000..a8afdf3 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/hibernate/startup_ewarm.c b/boards/ek-lm4f232/hibernate/startup_ewarm.c new file mode 100644 index 0000000..9ca8ec2 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/hibernate/startup_gcc.c b/boards/ek-lm4f232/hibernate/startup_gcc.c new file mode 100644 index 0000000..d645b5c --- /dev/null +++ b/boards/ek-lm4f232/hibernate/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/hibernate/startup_rvmdk.S b/boards/ek-lm4f232/hibernate/startup_rvmdk.S new file mode 100644 index 0000000..92e9792 --- /dev/null +++ b/boards/ek-lm4f232/hibernate/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/interrupts/Makefile b/boards/ek-lm4f232/interrupts/Makefile new file mode 100644 index 0000000..309d7f6 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the interrupts example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the interrupts example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/interrupts.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the interrupts example. +# +${COMPILER}/interrupts.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/interrupts.axf: ${COMPILER}/interrupts.o +${COMPILER}/interrupts.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/interrupts.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/interrupts.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/interrupts.axf: interrupts.ld +SCATTERgcc_interrupts=interrupts.ld +ENTRY_interrupts=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/interrupts/ccs/.ccsimportspec b/boards/ek-lm4f232/interrupts/ccs/.ccsimportspec new file mode 100644 index 0000000..9033256 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/interrupts/ccs/.ccsproject b/boards/ek-lm4f232/interrupts/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/interrupts/ccs/.cproject b/boards/ek-lm4f232/interrupts/ccs/.cproject new file mode 100644 index 0000000..0d7ec51 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/interrupts/ccs/.project b/boards/ek-lm4f232/interrupts/ccs/.project new file mode 100644 index 0000000..3b84e41 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/ccs/.project @@ -0,0 +1,55 @@ + + + interrupts + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + interrupts.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/interrupts/interrupts.c + + + interrupts_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/interrupts/interrupts_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/interrupts/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/interrupts/ccs/Debug/interrupts.bin b/boards/ek-lm4f232/interrupts/ccs/Debug/interrupts.bin new file mode 100644 index 0000000..8dce1f5 Binary files /dev/null and b/boards/ek-lm4f232/interrupts/ccs/Debug/interrupts.bin differ diff --git a/boards/ek-lm4f232/interrupts/ccs/Debug/interrupts.out b/boards/ek-lm4f232/interrupts/ccs/Debug/interrupts.out new file mode 100644 index 0000000..8e38403 Binary files /dev/null and b/boards/ek-lm4f232/interrupts/ccs/Debug/interrupts.out differ diff --git a/boards/ek-lm4f232/interrupts/ccs/macros.ini_initial b/boards/ek-lm4f232/interrupts/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/interrupts/ccs/target_config.ccxml b/boards/ek-lm4f232/interrupts/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/interrupts/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/interrupts/ewarm/Exe/interrupts.bin b/boards/ek-lm4f232/interrupts/ewarm/Exe/interrupts.bin new file mode 100644 index 0000000..3ede8df Binary files /dev/null and b/boards/ek-lm4f232/interrupts/ewarm/Exe/interrupts.bin differ diff --git a/boards/ek-lm4f232/interrupts/ewarm/Exe/interrupts.out b/boards/ek-lm4f232/interrupts/ewarm/Exe/interrupts.out new file mode 100644 index 0000000..6805f74 Binary files /dev/null and b/boards/ek-lm4f232/interrupts/ewarm/Exe/interrupts.out differ diff --git a/boards/ek-lm4f232/interrupts/gcc/interrupts.axf b/boards/ek-lm4f232/interrupts/gcc/interrupts.axf new file mode 100644 index 0000000..d6b412a Binary files /dev/null and b/boards/ek-lm4f232/interrupts/gcc/interrupts.axf differ diff --git a/boards/ek-lm4f232/interrupts/gcc/interrupts.bin b/boards/ek-lm4f232/interrupts/gcc/interrupts.bin new file mode 100644 index 0000000..034d8f2 Binary files /dev/null and b/boards/ek-lm4f232/interrupts/gcc/interrupts.bin differ diff --git a/boards/ek-lm4f232/interrupts/interrupts.c b/boards/ek-lm4f232/interrupts/interrupts.c new file mode 100644 index 0000000..7c340f4 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/interrupts.c @@ -0,0 +1,592 @@ +//***************************************************************************** +// +// interrupts.c - Interrupt preemption and tail-chaining example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/systick.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Interrupts (interrupts)

      +//! +//! This example application demonstrates the interrupt preemption and +//! tail-chaining capabilities of Cortex-M4 microprocessor and NVIC. Nested +//! interrupts are synthesized when the interrupts have the same priority, +//! increasing priorities, and decreasing priorities. With increasing +//! priorities, preemption will occur; in the other two cases tail-chaining +//! will occur. The currently pending interrupts and the currently executing +//! interrupt will be displayed on the display; GPIO pins D0, D1 and D2 will +//! be asserted upon interrupt handler entry and de-asserted before interrupt +//! handler exit so that the off-to-on time can be observed with a scope or +//! logic analyzer to see the speed of tail-chaining (for the two cases where +//! tail-chaining is occurring). +// +//***************************************************************************** + +//***************************************************************************** +// +// The count of interrupts received. This is incremented as each interrupt +// handler runs, and its value saved into interrupt handler specific values to +// determine the order in which the interrupt handlers were executed. +// +//***************************************************************************** +volatile uint32_t g_ui32Index; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOA interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOa; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOB interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOb; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOC interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOc; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Delay for the specified number of seconds. Depending upon the current +// SysTick value, the delay will be between N-1 and N seconds (i.e. N-1 full +// seconds are guaranteed, along with the remainder of the current second). +// +//***************************************************************************** +void +Delay(uint32_t ui32Seconds) +{ + // + // Loop while there are more seconds to wait. + // + while(ui32Seconds--) + { + // + // Wait until the SysTick value is less than 1000. + // + while(ROM_SysTickValueGet() > 1000) + { + } + + // + // Wait until the SysTick value is greater than 1000. + // + while(ROM_SysTickValueGet() < 1000) + { + } + } +} + +//***************************************************************************** +// +// Display the interrupt state on the CSTN. The currently active and pending +// interrupts are displayed. +// +//***************************************************************************** +void +DisplayIntStatus(void) +{ + uint32_t ui32Temp; + char pcBuffer[6]; + + // + // Display the currently active interrupts. + // + ui32Temp = HWREG(NVIC_ACTIVE0); + pcBuffer[0] = ' '; + pcBuffer[1] = (ui32Temp & 1) ? '1' : ' '; + pcBuffer[2] = (ui32Temp & 2) ? '2' : ' '; + pcBuffer[3] = (ui32Temp & 4) ? '3' : ' '; + pcBuffer[4] = ' '; + pcBuffer[5] = '\0'; + GrStringDraw(&g_sContext, pcBuffer, -1, 48, 32, 1); + + // + // Display the currently pending interrupts. + // + ui32Temp = HWREG(NVIC_PEND0); + pcBuffer[1] = (ui32Temp & 1) ? '1' : ' '; + pcBuffer[2] = (ui32Temp & 2) ? '2' : ' '; + pcBuffer[3] = (ui32Temp & 4) ? '3' : ' '; + GrStringDraw(&g_sContext, pcBuffer, -1, 48, 44, 1); + + // + // Flush the display. + // + GrFlush(&g_sContext); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOA. It simply saves the interrupt sequence +// number. +// +//***************************************************************************** +void +IntGPIOa(void) +{ + // + // Set PB3 high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, GPIO_PIN_0); + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOa = g_ui32Index++; + + // + // Set PB3 low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 0); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOB. It triggers INT_GPIOA and saves the +// interrupt sequence number. +// +//***************************************************************************** +void +IntGPIOb(void) +{ + // + // Set PF2 high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1, GPIO_PIN_1); + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Trigger the INT_GPIOA interrupt. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOA - 16; + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOb = g_ui32Index++; + + // + // Set PDF2 low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1, 0); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOC. It triggers INT_GPIOB and saves the +// interrupt sequence number. +// +//***************************************************************************** +void +IntGPIOc(void) +{ + // + // Set PF3 high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_2, GPIO_PIN_2); + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Trigger the INT_GPIOB interrupt. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOB - 16; + + // + // Put the current interrupt state on the display. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOc = g_ui32Index++; + + // + // Set PF3 low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_2, 0); +} + +//***************************************************************************** +// +// This is the main example program. It checks to see that the interrupts are +// processed in the correct order when they have identical priorities, +// increasing priorities, and decreasing priorities. This exercises interrupt +// preemption and tail chaining. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + uint_fast8_t ui8Error; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "interrupts", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Put the status header text on the display. + // + GrStringDraw(&g_sContext, "Active:", -1, 6, 32, 0); + GrStringDraw(&g_sContext, "Pending:", -1, 0, 44, 0); + + // + // Configure the PB0-PB2 to be outputs to indicate entry/exit of one + // of the interrupt handlers. + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | + GPIO_PIN_3); + ROM_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, 0); + + // + // Set up and enable the SysTick timer. It will be used as a reference + // for delay loops in the interrupt handlers. The SysTick timer period + // will be set up for one second. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet()); + ROM_SysTickEnable(); + + // + // Reset the error indicator. + // + ui8Error = 0; + + // + // Enable interrupts to the processor. + // + ROM_IntMasterEnable(); + + // + // Enable the interrupts. + // + ROM_IntEnable(INT_GPIOA); + ROM_IntEnable(INT_GPIOB); + ROM_IntEnable(INT_GPIOC); + + // + // Indicate that the equal interrupt priority test is beginning. + // + GrStringDrawCentered(&g_sContext, "Equal Pri", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 20, 1); + + // + // Set the interrupt priorities so they are all equal. + // + ROM_IntPrioritySet(INT_GPIOA, 0x00); + ROM_IntPrioritySet(INT_GPIOB, 0x00); + ROM_IntPrioritySet(INT_GPIOC, 0x00); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the LCD. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 3) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 1)) + { + ui8Error |= 1; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Indicate that the decreasing interrupt priority test is beginning. + // + GrStringDrawCentered(&g_sContext, " Decreasing Pri ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 20, 1); + + // + // Set the interrupt priorities so that they are decreasing (i.e. C > B > + // A). + // + ROM_IntPrioritySet(INT_GPIOA, 0x80); + ROM_IntPrioritySet(INT_GPIOB, 0x40); + ROM_IntPrioritySet(INT_GPIOC, 0x00); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the CSTN. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 3) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 1)) + { + ui8Error |= 2; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Indicate that the increasing interrupt priority test is beginning. + // + GrStringDrawCentered(&g_sContext, " Increasing Pri ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 20, 1); + + // + // Set the interrupt priorities so that they are increasing (i.e. C < B < + // A). + // + ROM_IntPrioritySet(INT_GPIOA, 0x00); + ROM_IntPrioritySet(INT_GPIOB, 0x40); + ROM_IntPrioritySet(INT_GPIOC, 0x80); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the CSTN. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 1) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 3)) + { + ui8Error |= 4; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Disable the interrupts. + // + ROM_IntDisable(INT_GPIOA); + ROM_IntDisable(INT_GPIOB); + ROM_IntDisable(INT_GPIOC); + + // + // Disable interrupts to the processor. + // + ROM_IntMasterDisable(); + + // + // Print out results if error occurred. + // + if(ui8Error) + { + GrStringDraw(&g_sContext, "Equal: P ", -1, 0, 32, 1); + GrStringDraw(&g_sContext, " Inc: P ", -1, 0, 44, 1); + GrStringDraw(&g_sContext, " Dec: P ", -1, 0, 56, 1); + if(ui8Error & 1) + { + GrStringDraw(&g_sContext, "F ", -1, 42, 32, 1); + } + if(ui8Error & 2) + { + GrStringDraw(&g_sContext, "F ", -1, 42, 44, 1); + } + if(ui8Error & 4) + { + GrStringDraw(&g_sContext, "F ", -1, 42, 56, 1); + } + } + else + { + GrStringDrawCentered(&g_sContext, " Success! ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 20, 1); + } + + // + // Flush the display. + // + GrFlush(&g_sContext); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/interrupts/interrupts.ewd b/boards/ek-lm4f232/interrupts/interrupts.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/interrupts/interrupts.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/interrupts/interrupts.ewp b/boards/ek-lm4f232/interrupts/interrupts.ewp new file mode 100644 index 0000000..249a1a6 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/interrupts.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\interrupts.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/ek-lm4f232/interrupts/interrupts.icf b/boards/ek-lm4f232/interrupts/interrupts.icf new file mode 100644 index 0000000..e2f1200 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/interrupts.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// interrupts.icf - Linker configuration file for interrupts. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/interrupts/interrupts.ld b/boards/ek-lm4f232/interrupts/interrupts.ld new file mode 100644 index 0000000..5ce7cad --- /dev/null +++ b/boards/ek-lm4f232/interrupts/interrupts.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * interrupts.ld - Linker configuration file for interrupts. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/interrupts/interrupts.sct b/boards/ek-lm4f232/interrupts/interrupts.sct new file mode 100644 index 0000000..4950f23 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/interrupts.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; interrupts.sct - Linker configuration file for interrupts. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/interrupts/interrupts.uvopt b/boards/ek-lm4f232/interrupts/interrupts.uvopt new file mode 100644 index 0000000..9742887 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/interrupts.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + interrupts + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\interrupts.c + interrupts.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/interrupts/interrupts.uvproj b/boards/ek-lm4f232/interrupts/interrupts.uvproj new file mode 100644 index 0000000..c645e5b --- /dev/null +++ b/boards/ek-lm4f232/interrupts/interrupts.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + interrupts + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + interrupts + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\interrupts.bin .\rvmdk\interrupts.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + interrupts.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + interrupts.c + 1 + .\interrupts.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/interrupts/interrupts_ccs.cmd b/boards/ek-lm4f232/interrupts/interrupts_ccs.cmd new file mode 100644 index 0000000..1cb0583 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/interrupts_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * interrupts_ccs.cmd - CCS linker configuration file for interrupts. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/interrupts/readme.txt b/boards/ek-lm4f232/interrupts/readme.txt new file mode 100644 index 0000000..98658da --- /dev/null +++ b/boards/ek-lm4f232/interrupts/readme.txt @@ -0,0 +1,33 @@ +Interrupts + +This example application demonstrates the interrupt preemption and +tail-chaining capabilities of Cortex-M4 microprocessor and NVIC. Nested +interrupts are synthesized when the interrupts have the same priority, +increasing priorities, and decreasing priorities. With increasing +priorities, preemption will occur; in the other two cases tail-chaining +will occur. The currently pending interrupts and the currently executing +interrupt will be displayed on the display; GPIO pins D0, D1 and D2 will +be asserted upon interrupt handler entry and de-asserted before interrupt +handler exit so that the off-to-on time can be observed with a scope or +logic analyzer to see the speed of tail-chaining (for the two cases where +tail-chaining is occurring). + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/interrupts/rvmdk/interrupts.axf b/boards/ek-lm4f232/interrupts/rvmdk/interrupts.axf new file mode 100644 index 0000000..8c8789b Binary files /dev/null and b/boards/ek-lm4f232/interrupts/rvmdk/interrupts.axf differ diff --git a/boards/ek-lm4f232/interrupts/rvmdk/interrupts.bin b/boards/ek-lm4f232/interrupts/rvmdk/interrupts.bin new file mode 100644 index 0000000..72077ec Binary files /dev/null and b/boards/ek-lm4f232/interrupts/rvmdk/interrupts.bin differ diff --git a/boards/ek-lm4f232/interrupts/startup_ccs.c b/boards/ek-lm4f232/interrupts/startup_ccs.c new file mode 100644 index 0000000..284673a --- /dev/null +++ b/boards/ek-lm4f232/interrupts/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/interrupts/startup_ewarm.c b/boards/ek-lm4f232/interrupts/startup_ewarm.c new file mode 100644 index 0000000..88d0875 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/interrupts/startup_gcc.c b/boards/ek-lm4f232/interrupts/startup_gcc.c new file mode 100644 index 0000000..7e22222 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/interrupts/startup_rvmdk.S b/boards/ek-lm4f232/interrupts/startup_rvmdk.S new file mode 100644 index 0000000..77598e3 --- /dev/null +++ b/boards/ek-lm4f232/interrupts/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN IntGPIOa + EXTERN IntGPIOb + EXTERN IntGPIOc + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntGPIOa ; GPIO Port A + DCD IntGPIOb ; GPIO Port B + DCD IntGPIOc ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/mpu_fault/Makefile b/boards/ek-lm4f232/mpu_fault/Makefile new file mode 100644 index 0000000..e759592 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the MPU example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the MPU example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/mpu_fault.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the MPU example. +# +${COMPILER}/mpu_fault.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/mpu_fault.axf: ${COMPILER}/mpu_fault.o +${COMPILER}/mpu_fault.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/mpu_fault.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/mpu_fault.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/mpu_fault.axf: mpu_fault.ld +SCATTERgcc_mpu_fault=mpu_fault.ld +ENTRY_mpu_fault=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/mpu_fault/ccs/.ccsimportspec b/boards/ek-lm4f232/mpu_fault/ccs/.ccsimportspec new file mode 100644 index 0000000..2bef69c --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/mpu_fault/ccs/.ccsproject b/boards/ek-lm4f232/mpu_fault/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/mpu_fault/ccs/.cproject b/boards/ek-lm4f232/mpu_fault/ccs/.cproject new file mode 100644 index 0000000..75abdc9 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/mpu_fault/ccs/.project b/boards/ek-lm4f232/mpu_fault/ccs/.project new file mode 100644 index 0000000..a189b55 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/ccs/.project @@ -0,0 +1,55 @@ + + + mpu_fault + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + mpu_fault.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/mpu_fault/mpu_fault.c + + + mpu_fault_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/mpu_fault/mpu_fault_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/mpu_fault/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/mpu_fault/ccs/Debug/mpu_fault.bin b/boards/ek-lm4f232/mpu_fault/ccs/Debug/mpu_fault.bin new file mode 100644 index 0000000..0e2182e Binary files /dev/null and b/boards/ek-lm4f232/mpu_fault/ccs/Debug/mpu_fault.bin differ diff --git a/boards/ek-lm4f232/mpu_fault/ccs/Debug/mpu_fault.out b/boards/ek-lm4f232/mpu_fault/ccs/Debug/mpu_fault.out new file mode 100644 index 0000000..490b355 Binary files /dev/null and b/boards/ek-lm4f232/mpu_fault/ccs/Debug/mpu_fault.out differ diff --git a/boards/ek-lm4f232/mpu_fault/ccs/macros.ini_initial b/boards/ek-lm4f232/mpu_fault/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/mpu_fault/ccs/target_config.ccxml b/boards/ek-lm4f232/mpu_fault/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/mpu_fault/ewarm/Exe/mpu_fault.bin b/boards/ek-lm4f232/mpu_fault/ewarm/Exe/mpu_fault.bin new file mode 100644 index 0000000..30c867e Binary files /dev/null and b/boards/ek-lm4f232/mpu_fault/ewarm/Exe/mpu_fault.bin differ diff --git a/boards/ek-lm4f232/mpu_fault/ewarm/Exe/mpu_fault.out b/boards/ek-lm4f232/mpu_fault/ewarm/Exe/mpu_fault.out new file mode 100644 index 0000000..688af96 Binary files /dev/null and b/boards/ek-lm4f232/mpu_fault/ewarm/Exe/mpu_fault.out differ diff --git a/boards/ek-lm4f232/mpu_fault/gcc/mpu_fault.axf b/boards/ek-lm4f232/mpu_fault/gcc/mpu_fault.axf new file mode 100644 index 0000000..31fed82 Binary files /dev/null and b/boards/ek-lm4f232/mpu_fault/gcc/mpu_fault.axf differ diff --git a/boards/ek-lm4f232/mpu_fault/gcc/mpu_fault.bin b/boards/ek-lm4f232/mpu_fault/gcc/mpu_fault.bin new file mode 100644 index 0000000..4104af0 Binary files /dev/null and b/boards/ek-lm4f232/mpu_fault/gcc/mpu_fault.bin differ diff --git a/boards/ek-lm4f232/mpu_fault/mpu_fault.c b/boards/ek-lm4f232/mpu_fault/mpu_fault.c new file mode 100644 index 0000000..88e2f24 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/mpu_fault.c @@ -0,0 +1,413 @@ +//***************************************************************************** +// +// mpu_fault.c - MPU example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/interrupt.h" +#include "driverlib/mpu.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      MPU (mpu_fault)

      +//! +//! This example application demonstrates the use of the MPU to protect a +//! region of memory from access, and to generate a memory management fault +//! when there is an access violation. +// +//***************************************************************************** + +//***************************************************************************** +// +// Variables to hold the state of the fault status when the fault occurs and +// the faulting address. +// +//***************************************************************************** +static volatile uint32_t g_ui32MMAR; +static volatile uint32_t g_ui32FaultStatus; + +//***************************************************************************** +// +// A counter to track the number of times the fault handler has been entered. +// +//***************************************************************************** +static volatile uint32_t g_ui32MPUFaultCount; + +//***************************************************************************** +// +// A location for storing data read from various addresses. Volatile forces +// the compiler to use it and not optimize the access away. +// +//***************************************************************************** +static volatile uint32_t g_ui32Value; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The exception handler for memory management faults, which are caused by MPU +// access violations. This handler will verify the cause of the fault and +// clear the NVIC fault status register. +// +//***************************************************************************** +void +MPUFaultHandler(void) +{ + // + // Preserve the value of the MMAR (the address causing the fault). + // Preserve the fault status register value, then clear it. + // + g_ui32MMAR = HWREG(NVIC_MM_ADDR); + g_ui32FaultStatus = HWREG(NVIC_FAULT_STAT); + HWREG(NVIC_FAULT_STAT) = g_ui32FaultStatus; + + // + // Increment a counter to indicate the fault occurred. + // + g_ui32MPUFaultCount++; + + // + // Disable the MPU so that this handler can return and cause no more + // faults. The actual instruction that faulted will be re-executed. + // + ROM_MPUDisable(); +} + +//***************************************************************************** +// +// This example demonstrates how to configure MPU regions for different levels +// of memory protection. The following memory map is set up: +// +// 0000.0000 - 0000.1C00 - rgn 0: executable read-only, flash +// 0000.1C00 - 0000.2000 - rgn 0: no access, flash (disabled sub-region 7) +// 2000.0000 - 2000.4000 - rgn 1: read-write, RAM +// 2000.4000 - 2000.6000 - rgn 2: read-only, RAM (disabled sub-rgn 4 of rgn 1) +// 2000.6000 - 2000.7FFF - rgn 1: read-write, RAM +// 4000.0000 - 4001.0000 - rgn 3: read-write, peripherals +// 4001.0000 - 4002.0000 - rgn 3: no access (disabled sub-region 1) +// 4002.0000 - 4006.0000 - rgn 3: read-write, peripherals +// 4006.0000 - 4008.0000 - rgn 3: no access (disabled sub-region 6, 7) +// E000.E000 - E000.F000 - rgn 4: read-write, NVIC +// 0100.0000 - 0100.FFFF - rgn 5: executable read-only, ROM +// +// The example code will attempt to perform the following operations and check +// the faulting behavior: +// +// - write to flash (should fault) +// - read from the disabled area of flash (should fault) +// - read from the read-only area of RAM (should not fault) +// - write to the read-only section of RAM (should fault) +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + unsigned int bFail = 0; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "mpu-fault", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Configure an executable, read-only MPU region for flash. It is a 16 KB + // region with the last 2 KB disabled to result in a 14 KB executable + // region. This region is needed so that the program can execute from + // flash. + // + ROM_MPURegionSet(0, FLASH_BASE, + MPU_RGN_SIZE_16K | MPU_RGN_PERM_EXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_SUB_RGN_DISABLE_7 | + MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for RAM. It is a 32 KB region. There + // is a 4 KB sub-region in the middle that is disabled in order to open up + // a hole in which different permissions can be applied. + // + ROM_MPURegionSet(1, SRAM_BASE, + MPU_RGN_SIZE_32K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_SUB_RGN_DISABLE_4 | + MPU_RGN_ENABLE); + + // + // Configure a read-only MPU region for the 4 KB of RAM that is disabled in + // the previous region. This region is used for demonstrating read-only + // permissions. + // + ROM_MPURegionSet(2, SRAM_BASE + 0x4000, + MPU_RGN_SIZE_2K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for peripherals. The region is 512 KB + // total size, with several sub-regions disabled to prevent access to areas + // where there are no peripherals. This region is needed because the + // program needs access to some peripherals. + // + ROM_MPURegionSet(3, 0x40000000, + MPU_RGN_SIZE_512K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_SUB_RGN_DISABLE_1 | + MPU_SUB_RGN_DISABLE_6 | MPU_SUB_RGN_DISABLE_7 | + MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for access to the NVIC. The region is + // 4 KB in size. This region is needed because NVIC registers are needed + // in order to control the MPU. + // + ROM_MPURegionSet(4, NVIC_BASE, + MPU_RGN_SIZE_4K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_RGN_ENABLE); + + // + // Configure an executable, read-only MPU region for ROM. It is a 64 KB + // region. This region is needed so that ROM library calls work. + // + ROM_MPURegionSet(5, (uint32_t)ROM_APITABLE & 0xFFFF0000, + MPU_RGN_SIZE_64K | MPU_RGN_PERM_EXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_RGN_ENABLE); + + // + // Need to clear the NVIC fault status register to make sure there is no + // status hanging around from a previous program. + // + g_ui32FaultStatus = HWREG(NVIC_FAULT_STAT); + HWREG(NVIC_FAULT_STAT) = g_ui32FaultStatus; + + // + // Enable the MPU fault. + // + ROM_IntEnable(FAULT_MPU); + + // + // Enable the MPU. This will begin to enforce the memory protection + // regions. The MPU is configured so that when in the hard fault or NMI + // exceptions, a default map will be used. Neither of these should occur + // in this example program. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to write to the flash. This should cause a protection fault due + // to the fact that this region is read-only. + // + GrStringDraw(&g_sContext, "Flash write", -1, 0, 12, 0); + g_ui32MPUFaultCount = 0; + HWREG(0x100) = 0x12345678; + + // + // Verify that the fault occurred, at the expected address. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x100)) + { + GrStringDraw(&g_sContext, " OK", -1, 72, 12, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 72, 12, 0); + } + + // + // The MPU was disabled when the previous fault occurred, so it needs to be + // re-enabled. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to read from the disabled section of flash, the upper 2 KB of + // the 16 KB region. + // + GrStringDraw(&g_sContext, "Flash read", -1, 0, 22, 0); + g_ui32MPUFaultCount = 0; + g_ui32Value = HWREG(0x3820); + + // + // Verify that the fault occurred, at the expected address. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x3820)) + { + GrStringDraw(&g_sContext, " OK", -1, 72, 22, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 72, 22, 0); + } + + // + // The MPU was disabled when the previous fault occurred, so it needs to be + // re-enabled. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to read from the read-only area of RAM, the middle 4 KB of the + // 32 KB region. + // + GrStringDraw(&g_sContext, "RAM read", -1, 0, 32, 0); + g_ui32MPUFaultCount = 0; + g_ui32Value = HWREG(0x20004440); + + // + // Verify that the RAM read did not cause a fault. + // + if(g_ui32MPUFaultCount == 0) + { + GrStringDraw(&g_sContext, " OK", -1, 72, 32, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 72, 32, 0); + } + + // + // The MPU should not have been disabled since the last access was not + // supposed to cause a fault. But if it did cause a fault, then the MPU + // will be disabled, so re-enable it here anyway, just in case. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to write to the read-only area of RAM, the middle 4 KB of the + // 32 KB region. + // + GrStringDraw(&g_sContext, "RAM write", -1, 0, 42, 0); + g_ui32MPUFaultCount = 0; + HWREG(0x20004460) = 0xabcdef00; + + // + // Verify that the RAM write caused a fault. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x20004460)) + { + GrStringDraw(&g_sContext, " OK", -1, 72, 42, 0); + } + else + { + bFail = 1; + GrStringDraw(&g_sContext, "NOK", -1, 72, 42, 0); + } + + // + // Display the results of the example program. + // + if(bFail) + { + GrStringDrawCentered(&g_sContext, "Failure!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 56, 0); + } + else + { + GrStringDrawCentered(&g_sContext, "Success!", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 56, 0); + } + + // + // Disable the MPU, so there are no lingering side effects if another + // program is run. + // + ROM_MPUDisable(); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/mpu_fault/mpu_fault.ewd b/boards/ek-lm4f232/mpu_fault/mpu_fault.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/mpu_fault.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/mpu_fault/mpu_fault.ewp b/boards/ek-lm4f232/mpu_fault/mpu_fault.ewp new file mode 100644 index 0000000..4b4c9cf --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/mpu_fault.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\mpu_fault.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/ek-lm4f232/mpu_fault/mpu_fault.icf b/boards/ek-lm4f232/mpu_fault/mpu_fault.icf new file mode 100644 index 0000000..b0677f6 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/mpu_fault.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// mpu_fault.icf - Linker configuration file for mpu_fault. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/mpu_fault/mpu_fault.ld b/boards/ek-lm4f232/mpu_fault/mpu_fault.ld new file mode 100644 index 0000000..43449ef --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/mpu_fault.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * mpu_fault.ld - Linker configuration file for mpu_fault. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/mpu_fault/mpu_fault.sct b/boards/ek-lm4f232/mpu_fault/mpu_fault.sct new file mode 100644 index 0000000..cbf4f70 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/mpu_fault.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; mpu_fault.sct - Linker configuration file for mpu_fault. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/mpu_fault/mpu_fault.uvopt b/boards/ek-lm4f232/mpu_fault/mpu_fault.uvopt new file mode 100644 index 0000000..dd39fad --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/mpu_fault.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + mpu_fault + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\mpu_fault.c + mpu_fault.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/mpu_fault/mpu_fault.uvproj b/boards/ek-lm4f232/mpu_fault/mpu_fault.uvproj new file mode 100644 index 0000000..a9570e2 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/mpu_fault.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + mpu_fault + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + mpu_fault + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\mpu_fault.bin .\rvmdk\mpu_fault.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + mpu_fault.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + mpu_fault.c + 1 + .\mpu_fault.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/mpu_fault/mpu_fault_ccs.cmd b/boards/ek-lm4f232/mpu_fault/mpu_fault_ccs.cmd new file mode 100644 index 0000000..c5939c3 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/mpu_fault_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * mpu_fault_ccs.cmd - CCS linker configuration file for mpu_fault. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-lm4f232/mpu_fault/readme.txt b/boards/ek-lm4f232/mpu_fault/readme.txt new file mode 100644 index 0000000..b8c0a0b --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/readme.txt @@ -0,0 +1,25 @@ +MPU + +This example application demonstrates the use of the MPU to protect a +region of memory from access, and to generate a memory management fault +when there is an access violation. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/mpu_fault/rvmdk/mpu_fault.axf b/boards/ek-lm4f232/mpu_fault/rvmdk/mpu_fault.axf new file mode 100644 index 0000000..b3ad37a Binary files /dev/null and b/boards/ek-lm4f232/mpu_fault/rvmdk/mpu_fault.axf differ diff --git a/boards/ek-lm4f232/mpu_fault/rvmdk/mpu_fault.bin b/boards/ek-lm4f232/mpu_fault/rvmdk/mpu_fault.bin new file mode 100644 index 0000000..cad0bc6 Binary files /dev/null and b/boards/ek-lm4f232/mpu_fault/rvmdk/mpu_fault.bin differ diff --git a/boards/ek-lm4f232/mpu_fault/startup_ccs.c b/boards/ek-lm4f232/mpu_fault/startup_ccs.c new file mode 100644 index 0000000..9c4fb48 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/mpu_fault/startup_ewarm.c b/boards/ek-lm4f232/mpu_fault/startup_ewarm.c new file mode 100644 index 0000000..ba2e3c4 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/mpu_fault/startup_gcc.c b/boards/ek-lm4f232/mpu_fault/startup_gcc.c new file mode 100644 index 0000000..1eb8c18 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/mpu_fault/startup_rvmdk.S b/boards/ek-lm4f232/mpu_fault/startup_rvmdk.S new file mode 100644 index 0000000..4d13ad2 --- /dev/null +++ b/boards/ek-lm4f232/mpu_fault/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN MPUFaultHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD MPUFaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/qs-logger/Makefile b/boards/ek-lm4f232/qs-logger/Makefile new file mode 100644 index 0000000..5d3f5d9 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/Makefile @@ -0,0 +1,108 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Data logger quickstart example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the Data logger quickstart example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/qs-logger.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Data logger quickstart example. +# +${COMPILER}/qs-logger.axf: ${COMPILER}/acquire.o +${COMPILER}/qs-logger.axf: ${COMPILER}/buttons.o +${COMPILER}/qs-logger.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/qs-logger.axf: ${COMPILER}/clocksetwidget.o +${COMPILER}/qs-logger.axf: ${COMPILER}/fat_usbmsc.o +${COMPILER}/qs-logger.axf: ${COMPILER}/ff.o +${COMPILER}/qs-logger.axf: ${COMPILER}/flashstore.o +${COMPILER}/qs-logger.axf: ${COMPILER}/images.o +${COMPILER}/qs-logger.axf: ${COMPILER}/menus.o +${COMPILER}/qs-logger.axf: ${COMPILER}/qs-logger.o +${COMPILER}/qs-logger.axf: ${COMPILER}/slidemenuwidget.o +${COMPILER}/qs-logger.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/qs-logger.axf: ${COMPILER}/stripchartmanager.o +${COMPILER}/qs-logger.axf: ${COMPILER}/stripchartwidget.o +${COMPILER}/qs-logger.axf: ${COMPILER}/uartstdio.o +${COMPILER}/qs-logger.axf: ${COMPILER}/usb_serial_structs.o +${COMPILER}/qs-logger.axf: ${COMPILER}/usbserial.o +${COMPILER}/qs-logger.axf: ${COMPILER}/usbstick.o +${COMPILER}/qs-logger.axf: ${COMPILER}/ustdlib.o +${COMPILER}/qs-logger.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/qs-logger.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/qs-logger.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/qs-logger.axf: qs-logger.ld +SCATTERgcc_qs-logger=qs-logger.ld +ENTRY_qs-logger=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/qs-logger/acquire.c b/boards/ek-lm4f232/qs-logger/acquire.c new file mode 100644 index 0000000..52b530f --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/acquire.c @@ -0,0 +1,965 @@ +//***************************************************************************** +// +// acquire.c - Data acquisition module for data logger application. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include +#include "driverlib/debug.h" +#include "driverlib/adc.h" +#include "driverlib/gpio.h" +#include "driverlib/hibernate.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_ints.h" +#include "inc/hw_gpio.h" +#include "utils/ustdlib.h" +#include "drivers/slidemenuwidget.h" +#include "drivers/stripchartwidget.h" +#include "stripchartmanager.h" +#include "clocksetwidget.h" +#include "qs-logger.h" +#include "usbstick.h" +#include "usbserial.h" +#include "flashstore.h" +#include "menus.h" +#include "acquire.h" + +//***************************************************************************** +// +// This is the data acquisition module. It performs acquisition of data from +// selected channels, starting and stopping data logging, storing acquired +// data, and running the strip chart display. +// +//***************************************************************************** + +//***************************************************************************** +// +// The following defines which ADC channel control should be used for each +// kind of data item. Basically it maps how the ADC channels are connected +// on the board. This is a hardware configuration. +// +//***************************************************************************** +#define CHAN_USER0 ADC_CTL_CH0 +#define CHAN_USER1 ADC_CTL_CH1 +#define CHAN_USER2 ADC_CTL_CH2 +#define CHAN_USER3 ADC_CTL_CH3 +#define CHAN_ACCELX ADC_CTL_CH8 +#define CHAN_ACCELY ADC_CTL_CH9 +#define CHAN_ACCELZ ADC_CTL_CH21 +#define CHAN_EXTTEMP ADC_CTL_CH20 +#define CHAN_CURRENT ADC_CTL_CH23 +#define CHAN_INTTEMP ADC_CTL_TS + +//***************************************************************************** +// +// The following maps the order that items are acquired and stored by the +// ADC sequencers. Note that 16 samples are specified, using 2 of the +// 8 sample sequencers. The current is sampled multiple times deliberately +// because that value tends to bounce around. It is sampled multiple +// times and will be averaged. +// +//***************************************************************************** +uint32_t g_pui32ADCSeq[] = +{ + CHAN_USER0, CHAN_USER1, CHAN_USER2, CHAN_USER3, CHAN_ACCELX, CHAN_ACCELY, + CHAN_ACCELZ, CHAN_EXTTEMP, CHAN_INTTEMP, CHAN_CURRENT, CHAN_CURRENT, + CHAN_CURRENT, CHAN_CURRENT, CHAN_CURRENT, CHAN_CURRENT, CHAN_CURRENT, +}; +#define NUM_ADC_CHANNELS (sizeof(g_pui32ADCSeq) / \ + sizeof(g_pui32ADCSeq[0])) +#define NUM_CURRENT_SAMPLES 7 + +//***************************************************************************** +// +// A buffer to hold one set of ADC data that is acquired per sample time. +// +//***************************************************************************** +static uint32_t g_pui32ADCData[NUM_ADC_CHANNELS]; + +//***************************************************************************** +// +// The following variables hold the current time stamp, the next match time +// for sampling, and the period of time between samples. All are stored in +// a 32.15 second.subsecond format. +// +//***************************************************************************** +static volatile uint32_t g_pui32TimeStamp[2]; +static volatile uint32_t g_pui32NextMatch[2]; +static uint32_t g_pui32MatchPeriod[2]; + +//***************************************************************************** +// +// The number of data items that are selected for acquisition. +// +//***************************************************************************** +static uint32_t g_ui32NumItems; + +//***************************************************************************** +// +// A counter for the ADC interrupt handler. It is used to track when new +// ADC data is acquired. +// +//***************************************************************************** +static volatile uint32_t g_ui32ADCCount; +static uint32_t g_ui32LastADCCount = 0; + +//***************************************************************************** +// +// A counter for the RTC interrupt handler. +// +//***************************************************************************** +static volatile uint32_t g_pui32RTCInts; + +//***************************************************************************** +// +// A flag to indicate that a keep alive packet is needed (when logging to host +// PC). +// +//***************************************************************************** +static volatile bool g_bNeedKeepAlive = false; + +//***************************************************************************** +// +// Storage for a single record of acquired data. This needs to be large +// enough to hold the time stamp and item mask (defined in the structure +// above) and as many possible data items that can be collected. Force the +// buffer to be a multiple of 32-bits. +// +//***************************************************************************** +#define RECORD_SIZE (sizeof(tLogRecord) + (NUM_LOG_ITEMS * 2)) +static union +{ + uint32_t g_pui32RecordBuf[(RECORD_SIZE + 3) / sizeof(uint32_t)]; + tLogRecord sRecord; +} +g_sRecordBuf; + +//***************************************************************************** +// +// Holds a pointer to the current configuration state, that is determined by +// the user's menu selections. +// +//***************************************************************************** +static tConfigState *g_psConfigState; + +//***************************************************************************** +// +// This function is called when in VIEW mode. The acquired data is written +// as text strings which will appear on the eval board display. +// +//***************************************************************************** +static void +UpdateViewerData(const tLogRecord *psRecord) +{ + static char pcViewerBuf[24]; + uint32_t ui32Idx, pui32RTC; + struct tm sTime; + + // + // Loop through the analog channels and update the text display strings. + // + for(ui32Idx = LOG_ITEM_USER0; ui32Idx <= LOG_ITEM_USER3; ui32Idx++) + { + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " CH%u: %u.%03u V ", + ui32Idx - LOG_ITEM_USER0, psRecord->pi16Items[ui32Idx] / 1000, + psRecord->pi16Items[ui32Idx] % 1000); + MenuUpdateText(ui32Idx, pcViewerBuf); + } + + // + // Loop through the accel channels and update the text display strings. + // + for(ui32Idx = LOG_ITEM_ACCELX; ui32Idx <= LOG_ITEM_ACCELZ; ui32Idx++) + { + int16_t i16Accel = psRecord->pi16Items[ui32Idx]; + i16Accel *= (i16Accel < 0) ? -1 : 1; + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " %c: %c%d.%02u g ", + (ui32Idx - LOG_ITEM_ACCELX) + 'X', + psRecord->pi16Items[ui32Idx] < 0 ? '-' : '+', + i16Accel / 100, i16Accel % 100); + MenuUpdateText(ui32Idx, pcViewerBuf); + } + + // + // Update the display string for internal temperature. + // + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " INT: %d.%01u C ", + psRecord->pi16Items[LOG_ITEM_INTTEMP] / 10, + psRecord->pi16Items[LOG_ITEM_INTTEMP] % 10); + MenuUpdateText(LOG_ITEM_INTTEMP, pcViewerBuf); + + // + // Update the display string for external temperature. + // + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " EXT: %d.%01u C ", + psRecord->pi16Items[LOG_ITEM_EXTTEMP] / 10, + psRecord->pi16Items[LOG_ITEM_EXTTEMP] % 10); + MenuUpdateText(LOG_ITEM_EXTTEMP, pcViewerBuf); + + // + // Update the display string for processor current. + // + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), " %u.%01u mA ", + psRecord->pi16Items[LOG_ITEM_CURRENT] / 10, + psRecord->pi16Items[LOG_ITEM_CURRENT] % 10); + MenuUpdateText(LOG_ITEM_CURRENT, pcViewerBuf); + + // + // Update the display strings for time and data. + // + pui32RTC = HibernateRTCGet(); + ulocaltime(pui32RTC, &sTime); + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), "%4u/%02u/%02u", + sTime.tm_year+1900, sTime.tm_mon + 1, sTime.tm_mday); + MenuUpdateText(TEXT_ITEM_DATE, pcViewerBuf); + usnprintf(pcViewerBuf, sizeof(pcViewerBuf), "%02u:%02u:%02u", + sTime.tm_hour, sTime.tm_min, sTime.tm_sec); + MenuUpdateText(TEXT_ITEM_TIME, pcViewerBuf); +} + +//***************************************************************************** +// +// This function is called from the AcquireRun() function and should be in +// context of the main thread. It pulls data items from the ADC data buffer, +// converts units as needed, and stores the results in a log record that is +// pointed at by the function parameter. +// +//***************************************************************************** +static void +ProcessDataItems(tLogRecord *psRecord) +{ + int32_t i32Accel, i32TempC; + uint32_t ui32SelectedMask, ui32Millivolts, ui32Current; + uint_fast8_t ui8Idx, ui8ItemIdx; + + + // + // Initialize locals. + // + ui8ItemIdx = 0; + ui32SelectedMask = g_psConfigState->ui16SelectedMask; + ui32Current = 0; + + // + // Save the time stamp that was saved when the ADC data was acquired. + // Also save into the record the bit mask of the selected data items. + // + psRecord->ui32Seconds = g_pui32TimeStamp[0]; + psRecord->ui16Subseconds = (uint16_t)g_pui32TimeStamp[1]; + psRecord->ui16ItemMask = (uint16_t)ui32SelectedMask; + + // + // Process the user analog input channels. These will be converted and + // stored as millivolts. + // + for(ui8Idx = LOG_ITEM_USER0; ui8Idx <= LOG_ITEM_USER3; ui8Idx++) + { + // + // Check to see if this item should be logged + // + if((1 << ui8Idx) & ui32SelectedMask) + { + ui32Millivolts = (g_pui32ADCData[ui8Idx] * 4100) / 819; + psRecord->pi16Items[ui8ItemIdx++] = (int16_t)ui32Millivolts; + } + } + + // + // Process the accelerometers. These will be processed and stored in + // units of 1/100 g. + // + for(ui8Idx = LOG_ITEM_ACCELX; ui8Idx <= LOG_ITEM_ACCELZ; ui8Idx++) + { + // + // Check to see if this item should be logged + // + if((1 << ui8Idx) & ui32SelectedMask) + { + i32Accel = (((int32_t)g_pui32ADCData[ui8Idx] - 2047L) * 1000L) / + 4095L; + psRecord->pi16Items[ui8ItemIdx++] = (int16_t)i32Accel; + } + } + + // + // Process the external temperature. The temperature is stored in units + // of 1/10 C. + // + if((1 << LOG_ITEM_EXTTEMP) & ui32SelectedMask) + { + i32TempC = (1866300 - ((200000 * g_pui32ADCData[LOG_ITEM_EXTTEMP]) / + 273)) / 1169; + psRecord->pi16Items[ui8ItemIdx++] = (int16_t)i32TempC; + } + + // + // Process the internal temperature. The temperature is stored in units + // of 1/10 C. + // + if((1 << LOG_ITEM_INTTEMP) & ui32SelectedMask) + { + i32TempC = 1475 - ((2250 * g_pui32ADCData[LOG_ITEM_INTTEMP]) / 4095); + psRecord->pi16Items[ui8ItemIdx++] = (int16_t)i32TempC; + } + + // + // Process the current. The current is stored in units of 100 uA, + // (or 1/10000 A). Multiple current samples were taken in order + // to average and smooth the data. + // + if((1 << LOG_ITEM_CURRENT) & ui32SelectedMask) + { + // + // Average all the current samples that are available in the ADC + // buffer. + // + for(ui8Idx = LOG_ITEM_CURRENT; + ui8Idx < (LOG_ITEM_CURRENT + NUM_CURRENT_SAMPLES); ui8Idx++) + { + ui32Current += g_pui32ADCData[ui8Idx]; + } + ui32Current /= NUM_CURRENT_SAMPLES; + + // + // Convert the averaged current into units + // + ui32Current = (ui32Current * 200) / 273; + psRecord->pi16Items[ui8ItemIdx++] = (int16_t)ui32Current; + } +} + +//***************************************************************************** +// +// This is the handler for the ADC interrupt. Even though more than one +// sequencer is used, they are configured so that this one runs last. +// Therefore when this ADC sequencer interrupt occurs, we know all of the ADC +// data has been acquired. +// +//***************************************************************************** +void +ADC0SS0Handler(void) +{ + // + // Clear the interrupts for all ADC sequencers that are used. + // + MAP_ADCIntClear(ADC0_BASE, 0); + MAP_ADCIntClear(ADC1_BASE, 0); + + // + // Retrieve the data from all ADC sequencers + // + MAP_ADCSequenceDataGet(ADC0_BASE, 0, &g_pui32ADCData[0]); + MAP_ADCSequenceDataGet(ADC1_BASE, 0, &g_pui32ADCData[8]); + + // + // Set the time stamp, assume it is what was set for the last match + // value. This will be close to the actual time that the samples were + // acquired, within a few microseconds. + // + g_pui32TimeStamp[0] = g_pui32NextMatch[0]; + g_pui32TimeStamp[1] = g_pui32NextMatch[1]; + + // + // Increment the ADC interrupt count + // + g_ui32ADCCount++; +} + +//***************************************************************************** +// +// This is the handler for the RTC interrupt from the hibernate peripheral. +// It occurs on RTC match. This handler will initiate an ADC acquisition, +// which will run all of the ADC sequencers. Then it computes the next +// match value and sets it in the RTC. +// +//***************************************************************************** +void +RTCHandler(void) +{ + uint32_t ui32Status, ui32Seconds; + + // + // Increment RTC interrupt counter + // + g_pui32RTCInts++; + + // + // Clear the RTC interrupts (this can be slow for hib module) + // + ui32Status = HibernateIntStatus(1); + HibernateIntClear(ui32Status); + + // + // Read and save the current value of the seconds counter. + // + ui32Seconds = HibernateRTCGet(); + + // + // If we are sleep logging, then there will be no remembered value for + // the next match value, which is also used as the time stamp when + // data is collected. In this case we will just use the current + // RTC seconds. This is safe because if sleep-logging is used, it + // is only with periods of whole seconds, 1 second or longer. + // + if(g_psConfigState->ui32SleepLogging) + { + g_pui32NextMatch[0] = ui32Seconds; + g_pui32NextMatch[1] = 0; + } + + // + // If we are logging data to PC and using a period greater than one + // second, then use special handling. For PC logging, if no data is + // collected, then we must send a keep-alive packet once per second. + // + if((g_psConfigState->ui8Storage == CONFIG_STORAGE_HOSTPC) && + (g_pui32MatchPeriod[0] > 1)) + { + // + // If the current seconds count is less than the match value, that + // means we got the interrupt due to one-second keep alive for the + // host PC. + // + if(ui32Seconds < g_pui32NextMatch[0]) + { + // + // Set the next match for one second ahead (next keep-alive) + // + HibernateRTCMatchSet(0, ui32Seconds + 1); + + // + // Set flag to indicate that a keep alive packet is needed + // + g_bNeedKeepAlive = true; + + // + // Nothing else to do except wait for next keep alive or match + // + return; + } + + // + // Else, this is a real match so proceed to below to do a normal + // acquisition. + // + } + + // + // Kick off the next ADC acquisition. When these are done they will + // cause an ADC interrupt. + // + MAP_ADCProcessorTrigger(ADC1_BASE, 0); + MAP_ADCProcessorTrigger(ADC0_BASE, 0); + + // + // Set the next RTC match. Add the match period to the previous match + // value. We are making an assumption here that there is enough time from + // when the match interrupt occurred, to this point in the code, that we + // are still setting the match time in the future. If the period is too + // long, then we could miss a match and never get another RTC interrupt. + // + g_pui32NextMatch[0] += g_pui32MatchPeriod[0]; + g_pui32NextMatch[1] += g_pui32MatchPeriod[1]; + if(g_pui32NextMatch[1] > 32767) + { + // + // Handle subseconds rollover + // + g_pui32NextMatch[1] &= 32767; + g_pui32NextMatch[0]++; + } + + // + // If logging to host PC at greater than 1 second period, then set the + // next RTC wakeup for 1 second from now. This will cause a keep alive + // packet to be sent to the PC + // + if((g_psConfigState->ui8Storage == CONFIG_STORAGE_HOSTPC) && + (g_pui32MatchPeriod[0] > 1)) + { + HibernateRTCMatchSet(0, ui32Seconds + 1); + } + else + { + // + // Otherwise this is a normal match and the next match should also be a + // normal match, so set the next wakeup to the calculated match time. + // + HibernateRTCMatchSet(0, g_pui32NextMatch[0]); + HibernateRTCSSMatchSet(0, g_pui32NextMatch[1]); + } + + // + // Toggle the LED on the board so the user can see that the acquisition + // is running. + // + MAP_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, + ~MAP_GPIOPinRead(GPIO_PORTG_BASE, GPIO_PIN_2)); + + // + // Now exit the int handler. The ADC will trigger an interrupt when + // it is finished, and the RTC is set up for the next match. + // +} + +//***************************************************************************** +// +// This function is called from the application main loop to keep the +// acquisition running. It checks to see if there is any new ADC data, and +// if so it processes the new ADC data. +// +// The function returns non-zero if data was acquired, 0 if no data was +// acquired. +// +//***************************************************************************** +int32_t +AcquireRun(void) +{ + tLogRecord *psRecord = &g_sRecordBuf.sRecord; + + // + // Make sure we are properly configured to run + // + if(!g_psConfigState) + { + return(0); + } + + // + // Check to see if new ADC data is available + // + if(g_ui32ADCCount != g_ui32LastADCCount) + { + g_ui32LastADCCount = g_ui32ADCCount; + + // + // Process the ADC data and store it in the record buffer. + // + ProcessDataItems(psRecord); + + // + // Add the newly processed data to the strip chart. Do not add to + // strip start if sleep-logging. + // + if((g_psConfigState->ui8Storage != CONFIG_STORAGE_VIEWER) && + !g_psConfigState->ui32SleepLogging) + { + StripChartMgrAddItems(psRecord->pi16Items); + } + + // + // If USB stick is used, write the record to the USB stick + // + if(g_psConfigState->ui8Storage == CONFIG_STORAGE_USB) + { + USBStickWriteRecord(psRecord); + } + + // + // If host PC is used, write data to USB serial port + // + if(g_psConfigState->ui8Storage == CONFIG_STORAGE_HOSTPC) + { + USBSerialWriteRecord(psRecord); + } + + // + // If flash storage is used, write data to the flash + // + if(g_psConfigState->ui8Storage == CONFIG_STORAGE_FLASH) + { + FlashStoreWriteRecord(psRecord); + + // + // If we are sleep logging, then save the storage address for + // use in the next cycle. + // + if(g_psConfigState->ui32SleepLogging) + { + g_psConfigState->ui32FlashStore = FlashStoreGetAddr(); + } + } + else if(g_psConfigState->ui8Storage == CONFIG_STORAGE_VIEWER) + { + // + // If in viewer mode, then update the viewer text strings. + // + UpdateViewerData(psRecord); + } + + // + // Return indication to caller that data was processed. + // + return(1); + } + else if((g_psConfigState->ui8Storage == CONFIG_STORAGE_HOSTPC) && + (g_bNeedKeepAlive == true)) + { + // + // Else there is no new data to process, but check to see if we are + // logging to PC and a keep alive packet is needed. + // + // Clear keep-alive needed flag + // + g_bNeedKeepAlive = false; + + // + // Make a keep alive packet by creating a record with timestamp of 0. + // + psRecord->ui32Seconds = 0; + psRecord->ui16Subseconds = 0; + psRecord->ui16ItemMask = 0; + + // + // Transmit the dummy record to host PC. + // + USBSerialWriteRecord(psRecord); + } + + // + // Return indication that data was not processed. + // + return(0); +} + +//***************************************************************************** +// +// This function is called to start an acquisition running. It determines +// which channels are to be logged, enables the ADC sequencers, and computes +// the first RTC match value. This will start the acquisition running. +// +//***************************************************************************** +void +AcquireStart(tConfigState *psConfig) +{ + uint32_t ui32Idx, pui32RTC[2], ui32SelectedMask; + + // + // Check the parameters + // + ASSERT(psConfig); + if(!psConfig) + { + return; + } + + // + // Update the config state pointer, save the selected item mask + // + g_psConfigState = psConfig; + ui32SelectedMask = psConfig->ui16SelectedMask; + + // + // Get the logging period from the logger configuration. Split the + // period into seconds and subseconds pieces and save for later use in + // generating RTC match values. + // + g_pui32MatchPeriod[0] = psConfig->ui32Period >> 8; + g_pui32MatchPeriod[1] = (psConfig->ui32Period & 0xFF) << 8; + + // + // Determine how many channels are to be logged + // + ui32Idx = ui32SelectedMask; + g_ui32NumItems = 0; + while(ui32Idx) + { + if(ui32Idx & 1) + { + g_ui32NumItems++; + } + ui32Idx >>= 1; + } + + // + // Initialize the strip chart manager for a new run. Don't bother with + // the strip chart if we are using viewer mode, or sleep-logging. + // + if((psConfig->ui8Storage != CONFIG_STORAGE_VIEWER) && + !psConfig->ui32SleepLogging) + { + StripChartMgrInit(); + StripChartMgrConfigure(ui32SelectedMask); + } + + // + // Configure USB for memory stick if USB storage is chosen + // + if(psConfig->ui8Storage == CONFIG_STORAGE_USB) + { + USBStickOpenLogFile(0); + } + else if(psConfig->ui8Storage == CONFIG_STORAGE_FLASH) + { + + // + // Flash storage is to be used, prepare the flash storage module. + // If already sleep-logging, then pass in the saved flash address + // so it does not need to be searched. + // + if(psConfig->ui32SleepLogging) + { + FlashStoreOpenLogFile(psConfig->ui32FlashStore); + } + else + { + // + // Otherwise not sleep logging, so just initialize the flash store, + // this will cause it to search for the starting storage address. + // + FlashStoreOpenLogFile(0); + } + } + + // + // Enable the ADC sequencers + // + MAP_ADCSequenceEnable(ADC0_BASE, 0); + MAP_ADCSequenceEnable(ADC1_BASE, 0); + + // + // Flush the ADC sequencers to be sure there is no lingering data. + // + MAP_ADCSequenceDataGet(ADC0_BASE, 0, g_pui32ADCData); + MAP_ADCSequenceDataGet(ADC1_BASE, 0, g_pui32ADCData); + + // + // Enable ADC interrupts + // + MAP_ADCIntClear(ADC0_BASE, 0); + MAP_ADCIntClear(ADC1_BASE, 0); + MAP_ADCIntEnable(ADC0_BASE, 0); + MAP_IntEnable(INT_ADC0SS0); + + // + // If we are not already sleep-logging, then initialize the RTC match. + // If we are sleep logging then this does not need to be set up. + // + if(!psConfig->ui32SleepLogging) + { + // + // Get the current RTC value + // + do + { + pui32RTC[0] = HibernateRTCGet(); + pui32RTC[1] = HibernateRTCSSGet(); + } + while(pui32RTC[0] != HibernateRTCGet()); + + // + // Set an initial next match value. Start with the subseconds always + // 0 so the first match value will always be an even multiple of the + // subsecond match. Add 2 seconds to the current RTC just to be clear + // of an imminent rollover. This means that the first match will occur + // between 1 and 2 seconds from now. + // + g_pui32NextMatch[0] = pui32RTC[0] + 2; + g_pui32NextMatch[1] = 0; + + // + // Now set the match value + // + HibernateRTCMatchSet(0, g_pui32NextMatch[0]); + HibernateRTCSSMatchSet(0, g_pui32NextMatch[1]); + } + + // + // If we are configured to sleep, but not sleeping yet, then enter sleep + // logging mode if allowed. + // + if(psConfig->bSleep && !psConfig->ui32SleepLogging) + { + // + // Allow sleep logging if storing to flash at a period of 1 second + // or greater. + // + if((psConfig->ui8Storage == CONFIG_STORAGE_FLASH) && + (psConfig->ui32Period >= 0x100)) + { + psConfig->ui32SleepLogging = 1; + } + } + + // + // Enable the RTC interrupts from the hibernate module + // + HibernateIntClear(HibernateIntStatus(0)); + HibernateIntEnable(HIBERNATE_INT_RTC_MATCH_0 | HIBERNATE_INT_PIN_WAKE); + MAP_IntEnable(INT_HIBERNATE); + + // + // Logging data should now start running + // +} + +//***************************************************************************** +// +// This function is called to stop an acquisition running. It disables the +// ADC sequencers and the RTC match interrupt. +// +//***************************************************************************** +void +AcquireStop(void) +{ + // + // Disable RTC interrupts + // + MAP_IntDisable(INT_HIBERNATE); + + // + // Disable ADC interrupts + // + MAP_IntDisable(INT_ADC0SS0); + MAP_IntDisable(INT_ADC1SS0); + + // + // Disable ADC sequencers + // + MAP_ADCSequenceDisable(ADC0_BASE, 0); + MAP_ADCSequenceDisable(ADC1_BASE, 0); + + // + // If USB stick is being used, then close the file so it will flush + // the buffers to the USB stick. + // + if(g_psConfigState->ui8Storage == CONFIG_STORAGE_USB) + { + USBStickCloseFile(); + } + + // + // Disable the configuration pointer, which acts as a flag to indicate + // if we are properly configured for data acquisition. + // + g_psConfigState = 0; +} + +//***************************************************************************** +// +// This function initializes the ADC hardware in preparation for data +// acquisition. +// +//***************************************************************************** +void +AcquireInit(void) +{ + uint32_t ui32Chan, ui32Base, ui32Seq, ui32ChCtl; + + + // + // Enable the ADC peripherals and the associated GPIO port + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP); + + // + // Enabled LED GPIO + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + MAP_GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE, GPIO_PIN_2); + + // + // Configure the pins to be used as analog inputs. + // + MAP_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | + GPIO_PIN_7 | GPIO_PIN_3); + MAP_GPIOPinTypeADC(GPIO_PORTP_BASE, GPIO_PIN_0); + + // + // Select the external reference for greatest accuracy. + // + MAP_ADCReferenceSet(ADC0_BASE, ADC_REF_EXT_3V); + MAP_ADCReferenceSet(ADC1_BASE, ADC_REF_EXT_3V); + + // + // Apply workaround for erratum 6.1, in order to use the + // external reference. + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + HWREG(GPIO_PORTB_BASE + GPIO_O_AMSEL) |= GPIO_PIN_6; + + // + // Initialize both ADC peripherals using sequencer 0 and processor trigger. + // + MAP_ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); + MAP_ADCSequenceConfigure(ADC1_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); + + // + // Enter loop to configure all of the ADC sequencer steps needed to + // acquire the data for the data logger. Multiple ADC and sequencers + // will be used in order to acquire all the channels. + // + for(ui32Chan = 0; ui32Chan < NUM_ADC_CHANNELS; ui32Chan++) + { + // + // If this is the first ADC then set the base for ADC0 + // + if(ui32Chan < 8) + { + ui32Base = ADC0_BASE; + ui32Seq = 0; + } + else if(ui32Chan < 16) + { + // + // Second ADC, set the base for ADC1 + // + ui32Base = ADC1_BASE; + ui32Seq = 0; + } + + // + // Get the channel control for each channel. Test to see if it is the + // last channel for the sequencer, and if so then also set the + // interrupt and "end" flags. + // + ui32ChCtl = g_pui32ADCSeq[ui32Chan]; + if((ui32Chan == 7) || (ui32Chan == 15) || + (ui32Chan == (NUM_ADC_CHANNELS - 1))) + { + ui32ChCtl |= ADC_CTL_IE | ADC_CTL_END; + } + + // + // Configure the sequence step + // + MAP_ADCSequenceStepConfigure(ui32Base, ui32Seq, ui32Chan % 8, + ui32ChCtl); + } + + // + // Erase the configuration in case there was a prior configuration. + // + g_psConfigState = 0; +} diff --git a/boards/ek-lm4f232/qs-logger/acquire.h b/boards/ek-lm4f232/qs-logger/acquire.h new file mode 100644 index 0000000..7a96936 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/acquire.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// acquire.h - Prototypes and definitions for data acquisition module. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** +#ifndef __ACQUIRE_H__ +#define __ACQUIRE_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Module function prototypes. +// +//***************************************************************************** +extern void AcquireInit(void); +extern void AcquireStart(tConfigState *psConfig); +extern void AcquireStop(void); +extern int32_t AcquireRun(void); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif diff --git a/boards/ek-lm4f232/qs-logger/ccs/.ccsimportspec b/boards/ek-lm4f232/qs-logger/ccs/.ccsimportspec new file mode 100644 index 0000000..4afea22 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/ccs/.ccsimportspec @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/qs-logger/ccs/.ccsproject b/boards/ek-lm4f232/qs-logger/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/qs-logger/ccs/.cproject b/boards/ek-lm4f232/qs-logger/ccs/.cproject new file mode 100644 index 0000000..c94b602 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/ccs/.cproject @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/qs-logger/ccs/.project b/boards/ek-lm4f232/qs-logger/ccs/.project new file mode 100644 index 0000000..9fe61a4 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/ccs/.project @@ -0,0 +1,135 @@ + + + qs-logger + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + acquire.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/acquire.c + + + clocksetwidget.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/clocksetwidget.c + + + flashstore.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/flashstore.c + + + images.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/images.c + + + menus.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/menus.c + + + qs-logger.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/qs-logger.c + + + qs-logger_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/qs-logger_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/startup_ccs.c + + + stripchartmanager.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/stripchartmanager.c + + + usb_serial_structs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/usb_serial_structs.c + + + usbserial.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/usbserial.c + + + usbstick.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/qs-logger/usbstick.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + drivers/slidemenuwidget.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/slidemenuwidget.c + + + drivers/stripchartwidget.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/stripchartwidget.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/fatfs/port/fat_usbmsc.c + 1 + SW_ROOT/third_party/fatfs/port/fat_usbmsc.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/qs-logger/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/qs-logger/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/qs-logger/ccs/Debug/qs-logger.bin b/boards/ek-lm4f232/qs-logger/ccs/Debug/qs-logger.bin new file mode 100644 index 0000000..1b33316 Binary files /dev/null and b/boards/ek-lm4f232/qs-logger/ccs/Debug/qs-logger.bin differ diff --git a/boards/ek-lm4f232/qs-logger/ccs/Debug/qs-logger.out b/boards/ek-lm4f232/qs-logger/ccs/Debug/qs-logger.out new file mode 100644 index 0000000..51e150b Binary files /dev/null and b/boards/ek-lm4f232/qs-logger/ccs/Debug/qs-logger.out differ diff --git a/boards/ek-lm4f232/qs-logger/ccs/macros.ini_initial b/boards/ek-lm4f232/qs-logger/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/qs-logger/ccs/target_config.ccxml b/boards/ek-lm4f232/qs-logger/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/qs-logger/clocksetwidget.c b/boards/ek-lm4f232/qs-logger/clocksetwidget.c new file mode 100644 index 0000000..449ee55 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/clocksetwidget.c @@ -0,0 +1,1031 @@ +//***************************************************************************** +// +// clocksetwidget.c - A widget for setting clock date/time. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "utils/uartstdio.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "utils/ustdlib.h" +#include "clocksetwidget.h" + +//***************************************************************************** +// +//! \addtogroup clocksetwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// This is a custom widget for setting the date/time of a clock. The widget +// will display the year, month, day, hour and minute on the display. The +// user can highlight the fields with the left/right keys, and can change the +// value of each with the up/down keys. When finished the user highlights +// the OK field on the screen and presses the select button. +// +//***************************************************************************** + +//***************************************************************************** +// +// Define indices for each of the fields used for date and time. +// +//***************************************************************************** +#define FIELD_YEAR 0 +#define FIELD_MONTH 1 +#define FIELD_DAY 2 +#define FIELD_HOUR 3 +#define FIELD_MINUTE 4 +#define FIELD_OK 5 +#define FIELD_CANCEL 6 +#define FIELD_LAST 6 +#define NUM_FIELDS 7 + +//***************************************************************************** +// +//! Paints the clock set widget on the display. +//! +//! \param psWidget is a pointer to the clock setting widget to be drawn. +//! +//! This function draws the date and time fields of the clock setting widget +//! onto the display. One of the fields can be highlighted. This is +//! called in response to a \b WIDGET_MSG_PAINT message. +//! +//! \return None. +// +//***************************************************************************** +static void +ClockSetPaint(tWidget *psWidget) +{ + tClockSetWidget *psClockWidget; + tContext sContext; + tRectangle sRect, sRectSel; + struct tm *psTime; + char pcBuf[8]; + int32_t i32X, i32Y, i32Width, i32Height; + uint32_t ui32Idx, ui32FontHeight, ui32FontWidth, ui32SelWidth; + + // + // Check the arguments. + // + ASSERT(psWidget); + ASSERT(psWidget->psDisplay); + + // + // Convert the generic widget pointer into a clock set widget pointer. + // + psClockWidget = (tClockSetWidget *)psWidget; + ASSERT(psClockWidget->psTime); + + // + // Get pointer to the time structure + // + psTime = psClockWidget->psTime; + + // + // Initialize a drawing context. + // + GrContextInit(&sContext, psWidget->psDisplay); + + // + // Initialize the clipping region based on the extents of this widget. + // + GrContextClipRegionSet(&sContext, &(psWidget->sPosition)); + + // + // Set the font for the context, and get font height and width - they + // are used a lot later. + // + GrContextFontSet(&sContext, psClockWidget->psFont); + ui32FontHeight = GrFontHeightGet(psClockWidget->psFont); + ui32FontWidth = GrFontMaxWidthGet(psClockWidget->psFont); + + // + // Fill the widget with the background color. + // + GrContextForegroundSet(&sContext, psClockWidget->ui32BackgroundColor); + GrRectFill(&sContext, &sContext.sClipRegion); + + // + // Draw a border around the widget + // + GrContextForegroundSet(&sContext, psClockWidget->ui32ForegroundColor); + GrContextBackgroundSet(&sContext, psClockWidget->ui32BackgroundColor); + GrRectDraw(&sContext, &sContext.sClipRegion); + + // + // Compute a rectangle for the screen title. Put it at the top of + // the widget display, and sized to be the height of the font, plus + // a few pixels of space. + // + sRect.i16XMin = sContext.sClipRegion.i16XMin; + sRect.i16XMax = sContext.sClipRegion.i16XMax; + sRect.i16YMin = sContext.sClipRegion.i16YMin; + sRect.i16YMax = ui32FontHeight * 2; + GrRectDraw(&sContext, &sRect); + + // + // Print a title for the widget + // + GrContextFontSet(&sContext, psClockWidget->psFont); + GrStringDrawCentered(&sContext, "CLOCK SET", -1, + (1 + sRect.i16XMax - sRect.i16XMin) / 2, + (1 + sRect.i16YMax - sRect.i16YMin) / 2, 1); + + // + // Reset the rectangle to cover the non-title area of the display + // + sRect.i16YMin = sRect.i16YMax + 1; + sRect.i16YMax = sContext.sClipRegion.i16YMax; + + // + // Compute the width and height of the area remaining for showing the + // clock fields. + // + i32Width = 1 + (sRect.i16XMax - sRect.i16XMin); + i32Height = 1 + (sRect.i16YMax - sRect.i16YMin); + + // + // Compute the X and Y starting point for the row that will show the + // date. + // + i32X = sRect.i16XMin + (i32Width - (ui32FontWidth * 10)) / 2; + i32Y = sRect.i16YMin + ((i32Height * 1) / 6) - (ui32FontHeight / 2); + + // + // Draw the date field separators on the date row. + // + GrStringDraw(&sContext, "/", -1, i32X + (ui32FontWidth * 4), i32Y, 0); + GrStringDraw(&sContext, "/", -1, i32X + (ui32FontWidth * 7), i32Y, 0); + + // + // Compute the X and Y starting point for the row that will show the + // time. + // + i32X = sRect.i16XMin + (i32Width - (ui32FontWidth * 5)) / 2; + i32Y = sRect.i16YMin + ((i32Height * 3) / 6) - (ui32FontHeight / 2); + + // + // Draw the time field separators on the time row. + // + GrStringDraw(&sContext, ":", -1, i32X + (ui32FontWidth * 2), i32Y, 0); + + // + // Process each of the fields to be shown on the widget + // + for(ui32Idx = 0; ui32Idx < NUM_FIELDS; ui32Idx++) + { + // + // Compute the X and Y for the text for each field, and print the + // text into a buffer. + // + switch(ui32Idx) + { + // + // Year + // + case FIELD_YEAR: + { + usnprintf(pcBuf, sizeof(pcBuf), "%4u", psTime->tm_year+1900); + i32X = sRect.i16XMin + (i32Width - (ui32FontWidth * 10)) / 2; + i32Y = sRect.i16YMin + ((i32Height * 1) / 6) - + (ui32FontHeight / 2); + ui32SelWidth = 4; + break; + } + + // + // Month + // + case FIELD_MONTH: + { + usnprintf(pcBuf, sizeof(pcBuf), "%02u", psTime->tm_mon + 1); + i32X += ui32FontWidth * 5; + ui32SelWidth = 2; + break; + } + + // + // Day + // + case FIELD_DAY: + { + usnprintf(pcBuf, sizeof(pcBuf), "%02u", psTime->tm_mday); + i32X += ui32FontWidth * 3; + ui32SelWidth = 2; + break; + } + + // + // Hour + // + case FIELD_HOUR: + { + usnprintf(pcBuf, sizeof(pcBuf), "%02u", psTime->tm_hour); + i32X = sRect.i16XMin + (i32Width - (ui32FontWidth * 5)) / 2; + i32Y = sRect.i16YMin + ((i32Height * 3) / 6) - + (ui32FontHeight / 2); + ui32SelWidth = 2; + break; + } + + // + // Minute + // + case FIELD_MINUTE: + { + usnprintf(pcBuf, sizeof(pcBuf), "%02u", psTime->tm_min); + i32X += ui32FontWidth * 3; + ui32SelWidth = 2; + break; + } + + // + // OK + // + case FIELD_OK: + { + usnprintf(pcBuf, sizeof(pcBuf), "OK"); + i32X = (i32Width - (ui32FontWidth * 9)) / 2; + i32X += sRect.i16XMin; + i32Y = ((i32Height * 5) / 6) - (ui32FontHeight / 2); + i32Y += sRect.i16YMin; + ui32SelWidth = 2; + break; + } + + // + // CANCEL (default case is purely to keep the compiler from + // issuing a warning that ui32SelWidth may be used ininitialized). + // + case FIELD_CANCEL: + default: + { + usnprintf(pcBuf, sizeof(pcBuf), "CANCEL"); + i32X += ui32FontWidth * 3; + ui32SelWidth = 6; + break; + } + } + + + // + // If the current field index is the highlighted field, then this + // text field will be drawn with highlighting. + // + if(ui32Idx == psClockWidget->ui32Highlight) + { + // + // Compute a rectangle for the highlight area. + // + sRectSel.i16XMin = i32X; + sRectSel.i16XMax = (ui32SelWidth * ui32FontWidth) + i32X; + sRectSel.i16YMin = i32Y - 2; + sRectSel.i16YMax = ui32FontHeight + i32Y + 2; + + // + // Set the foreground color to the text color, and then fill the + // highlight rectangle. The text field will be highlighted by + // inverting the normal colors. + // Then draw the highlighting rectangle. + // + GrContextForegroundSet(&sContext, + psClockWidget->ui32ForegroundColor); + GrRectFill(&sContext, &sRectSel); + + // + // Change the foreground color to the normal background color. + // This will be used for drawing the text for the highlighted + // field, which has the colors inverted (FG <--> BG) + // + GrContextForegroundSet(&sContext, + psClockWidget->ui32BackgroundColor); + } + else + { + // + // This text field is not highlighted so just set the normal + // foreground color. + // + GrContextForegroundSet(&sContext, + psClockWidget->ui32ForegroundColor); + } + + // + // Print the text from the buffer to the display at the computed + // location. + // + GrStringDraw(&sContext, pcBuf, -1, i32X, i32Y, 0); + } +} + +//***************************************************************************** +// +//! Determine the number of days in a month. +//! +//! \param tm_mon is the month number to use for determining the number of +//! days. The month begins with 0 meaning January and 11 meaning December. +//! +//! This function returns the highest day number for the specified month. +//! It does not account for leap year, so February always returns 28 days. +//! +//! \return Returns the highest day number for the month. +// +//***************************************************************************** +static uint8_t +MaxDayOfMonth(uint8_t tm_mon) +{ + // + // Process the month + // + switch(tm_mon) + { + // + // February returns 28 days + // + case 1: + { + return(28); + } + + // + // April, June, September and November return 30 + // + case 3: + case 5: + case 8: + case 10: + { + return(30); + } + + // + // Remaining months have 31 days. + // + default: + { + return(31); + } + } +} + +//***************************************************************************** +// +//! Handle the UP button event. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! +//! This function handles the event when the user has pressed the up button. +//! It will increment the currently highlighted date/time field if it is not +//! already at the maximum value. If the month or day of the month is being +//! changed then it enforces the maximum number of days for the month. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeyUp(tClockSetWidget *psWidget) +{ + // + // Get pointer to the time structure to be modified. + // + struct tm *psTime = psWidget->psTime; + + // + // Determine which field is highlighted. + // + switch(psWidget->ui32Highlight) + { + // + // Increment the year. Cap it at 2037 to keep things simple. + // + case FIELD_YEAR: + { + if(psTime->tm_year+1900 < 2037) + { + psTime->tm_year++; + } + break; + } + + // + // Increment the month. Adjust the day of the month if needed. + // + case FIELD_MONTH: + { + if(psTime->tm_mon < 11) + { + psTime->tm_mon++; + } + if(psTime->tm_mday > MaxDayOfMonth(psTime->tm_mon)) + { + psTime->tm_mday = MaxDayOfMonth(psTime->tm_mon); + } + break; + } + + // + // Increment the day. Cap it at the max number of days for the + // current value of month. + // + case FIELD_DAY: + { + if(psTime->tm_mday < MaxDayOfMonth(psTime->tm_mon)) + { + psTime->tm_mday++; + } + break; + } + + // + // Increment the hour. + // + case FIELD_HOUR: + { + if(psTime->tm_hour < 23) + { + psTime->tm_hour++; + } + break; + } + + // + // Increment the minute. + // + case FIELD_MINUTE: + { + if(psTime->tm_min < 59) + { + psTime->tm_min++; + } + break; + } + + // + // Bad value for field index - ignore. + // + default: + { + break; + } + } + + // + // Since something may have been changed in the clock value, request + // a repaint of the widget. + // + WidgetPaint(&psWidget->sBase); + + // + // Return indication that the button event was handled. + // + return(1); +} + +//***************************************************************************** +// +//! Handle the DOWN button event. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! +//! This function handles the event when the user has pressed the down button. +//! It will decrement the currently highlighted date/time field if it is not +//! already at the minimum value. If the month is being changed then it +//! enforces the maximum number of days for the month. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeyDown(tClockSetWidget *psWidget) +{ + // + // Get pointer to the time structure to be modified. + // + struct tm *psTime = psWidget->psTime; + + // + // Determine which field is highlighted. + // + switch(psWidget->ui32Highlight) + { + // + // Decrement the year. Minimum year is 1970. + // + case FIELD_YEAR: + { + if(psTime->tm_year+1900 > 1970) + { + psTime->tm_year--; + } + break; + } + + // + // Decrement the month. If the month has changed, check that the + // day is valid for this month, and enforce the maximum day number + // for this month. + // + case FIELD_MONTH: + { + if(psTime->tm_mon > 0) + { + psTime->tm_mon--; + } + if(psTime->tm_mday > MaxDayOfMonth(psTime->tm_mon)) + { + psTime->tm_mday = MaxDayOfMonth(psTime->tm_mon); + } + break; + } + + // + // Decrement the day + // + case FIELD_DAY: + { + if(psTime->tm_mday > 1) + { + psTime->tm_mday--; + } + break; + } + + // + // Decrement the hour + // + case FIELD_HOUR: + { + if(psTime->tm_hour > 0) + { + psTime->tm_hour--; + } + break; + } + + // + // Decrement the minute + // + case FIELD_MINUTE: + { + if(psTime->tm_min > 0) + { + psTime->tm_min--; + } + break; + } + + // + // Bad value for field index - ignore. + // + default: + { + break; + } + } + + // + // Since something may have been changed in the clock value, request + // a repaint of the widget. + // + WidgetPaint(&psWidget->sBase); + + // + // Return indication that the button event was handled. + // + return(1); +} + +//***************************************************************************** +// +//! Handle the LEFT button event. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! +//! This function handles the event when the user has pressed the left button. +//! It will change the highlighted field to the previous field. If it is +//! at the first field in the display, it will wrap around to the last. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeyLeft(tClockSetWidget *psWidget) +{ + // + // If not already at the minimum, decrement the highlighted field index. + // + if(psWidget->ui32Highlight) + { + psWidget->ui32Highlight--; + } + else + { + // + // Already at the first field, so reset to the last field. + // + psWidget->ui32Highlight = FIELD_LAST; + } + + // + // The highlighted field changed, so request a repaint of the widget. + // + WidgetPaint(&psWidget->sBase); + + // + // Return indication that the button event was handled. + // + return(1); +} + +//***************************************************************************** +// +//! Handle the RIGHT button event. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! +//! This function handles the event when the user has pressed the right button. +//! It will change the highlighted field to the next field. If it is already +//! at the last field in the display, it will wrap around to the first. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeyRight(tClockSetWidget *psWidget) +{ + // + // If not already at the last field, increment the highlighted field index. + // + if(psWidget->ui32Highlight < FIELD_LAST) + { + psWidget->ui32Highlight++; + } + else + { + // + // Already at the last field, so reset to the first field. + // + psWidget->ui32Highlight = 0; + } + + // + // The highlighted field changed, so request a repaint of the widget. + // + WidgetPaint(&psWidget->sBase); + + // + // Return indication that the button event was handled. + // + return(1); +} + +//***************************************************************************** +// +//! Handle the select button event. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! +//! This function handles the event when the user has pressed the select +//! button. If either the OK or CANCEL fields is highlighted, then the +//! function will call the callback function to notify the application that +//! an action has been taken and the widget should be dismissed. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeySelect(tClockSetWidget *psWidget) +{ + bool bOk; + + // + // Determine if the OK text field is highlighted and set a flag. + // + bOk = (psWidget->ui32Highlight == FIELD_OK) ? true : false; + + // + // If there is a callback function installed, and either the OK or CANCEL + // fields is highlighted, then take action. + // + if(psWidget->pfnOnOkClick && ((psWidget->ui32Highlight == FIELD_OK) || + (psWidget->ui32Highlight == FIELD_CANCEL))) + { + // + // Call the callback function and pass the flag to indicate if OK + // was selected (otherwise it was CANCEL). + // + psWidget->pfnOnOkClick(&psWidget->sBase, bOk); + + // + // Set the default highlighted field. This is the field that will + // be highlighted the next time this widget is activated. + // + psWidget->ui32Highlight = FIELD_CANCEL; + + // + // Return to caller, indicating the button event was handled. + // + return(1); + } + else + { + // + // There is no callback function, or neither the OK or CANCEL fields is + // highlighted. In this case ingore the button event. + // + return(0); + } +} + +//***************************************************************************** +// +//! Dispatch button events destined for this widget. +//! +//! \param psWidget is a pointer to the clock setting widget on which to +//! operate. +//! \param ui32Msg is the widget message to process. +//! +//! This function receives button/key event messages that are meant for +//! this widget. It then calls the appropriate function to handle the +//! button event. +//! +//! \return Returns non-zero if the button event was handled, and 0 if the +//! button event was not handled. +// +//***************************************************************************** +static int32_t +ClockSetKeyHandler(tWidget *psWidget, uint32_t ui32Msg) +{ + tClockSetWidget *psClockWidget; + + ASSERT(psWidget); + + // + // Get pointer to the clock setting widget. + // + psClockWidget = (tClockSetWidget *)psWidget; + + // + // Process the key event + // + switch(ui32Msg) + { + // + // Select key + // + case WIDGET_MSG_KEY_SELECT: + { + return(ClockSetKeySelect(psClockWidget)); + } + + // + // Up button + // + case WIDGET_MSG_KEY_UP: + { + return(ClockSetKeyUp(psClockWidget)); + } + + // + // Down button + // + case WIDGET_MSG_KEY_DOWN: + { + return(ClockSetKeyDown(psClockWidget)); + } + + // + // Left button + // + case WIDGET_MSG_KEY_LEFT: + { + return(ClockSetKeyLeft(psClockWidget)); + } + + // + // Right button + // + case WIDGET_MSG_KEY_RIGHT: + { + return(ClockSetKeyRight(psClockWidget)); + } + + // + // This is an unexpected event. Return an indication that the event + // was not handled. + // + default: + { + return(0); + } + } +} + +//***************************************************************************** +// +//! Handles messages for a clock setting widget. +//! +//! \param psWidget is a pointer to the clock set widget. +//! \param ui32Msg is the message. +//! \param ui32Param1 is the first parameter to the message. +//! \param ui32Param2 is the second parameter to the message. +//! +//! This function receives messages intended for this clock set widget and +//! processes them accordingly. The processing of the message varies based on +//! the message in question. +//! +//! Unrecognized messages are handled by calling WidgetDefaultMsgProc(). +//! +//! \return Returns a value appropriate to the supplied message. +// +//***************************************************************************** +int32_t +ClockSetMsgProc(tWidget *psWidget, uint32_t ui32Msg, uint32_t ui32Param1, + uint32_t ui32Param2) +{ + // + // Check the arguments. + // + ASSERT(psWidget); + + // + // Determine which message is being sent. + // + switch(ui32Msg) + { + // + // The widget paint request has been sent. + // + case WIDGET_MSG_PAINT: + { + // + // Handle the widget paint request. + // + ClockSetPaint(psWidget); + + // + // Return one to indicate that the message was successfully + // processed. + // + return(1); + } + + // + // Process any button/key event messages. + // + case WIDGET_MSG_KEY_SELECT: + case WIDGET_MSG_KEY_UP: + case WIDGET_MSG_KEY_DOWN: + case WIDGET_MSG_KEY_LEFT: + case WIDGET_MSG_KEY_RIGHT: + { + // + // If the key event is for this widget, then process the key event + // + if((tWidget *)ui32Param1 == psWidget) + { + return(ClockSetKeyHandler(psWidget, ui32Msg)); + } + } + + // + // An unknown request has been sent. + // + default: + { + // + // Let the default message handler process this message. + // + return(WidgetDefaultMsgProc(psWidget, ui32Msg, ui32Param1, + ui32Param2)); + } + } +} + +//***************************************************************************** +// +//! Initializes a clock setting widget. +//! +//! \param psWidget is a pointer to the clock set widget to initialize. +//! \param psDisplay is a pointer to the display on which to draw the widget. +//! \param i32X is the X coordinate of the upper left corner of the widget. +//! \param i32Y is the Y coordinate of the upper left corner of the widget. +//! \param i32Width is the width of the widget. +//! \param i32Height is the height of the widget. +//! \param psFont is the font to use for drawing text on the widget. +//! \param ui32ForegroundColor is the color of the text and lines on the +//! widget. +//! \param ui32BackgroundColor is the color of the widget background. +//! \param psTime is a pointer to the time structure to use for clock fields. +//! \param pfnOnOkClick is a callback function that is called when the user +//! selects the OK field on the display. +//! +//! This function initializes the caller provided clock setting widget. +//! +//! \return None. +// +//***************************************************************************** +void +ClockSetInit(tClockSetWidget *psWidget, const tDisplay *psDisplay, + int32_t i32X, int32_t i32Y, int32_t i32Width, int32_t i32Height, + tFont *psFont, uint32_t ui32ForegroundColor, + uint32_t ui32BackgroundColor, struct tm *psTime, + void (*pfnOnOkClick)(tWidget *psWidget, bool bOk)) +{ + uint32_t ui32Idx; + + // + // Check the arguments. + // + ASSERT(psWidget); + ASSERT(psDisplay); + + // + // Clear out the widget structure. + // + for(ui32Idx = 0; ui32Idx < sizeof(tClockSetWidget); ui32Idx += 4) + { + ((uint32_t *)psWidget)[ui32Idx / 4] = 0; + } + + // + // Set the size of the widget structure. + // + psWidget->sBase.i32Size = sizeof(tClockSetWidget); + + // + // Mark this widget as fully disconnected. + // + psWidget->sBase.psParent = 0; + psWidget->sBase.psNext = 0; + psWidget->sBase.psChild = 0; + + // + // Save the display pointer. + // + psWidget->sBase.psDisplay = psDisplay; + + // + // Set the extents of the display area. + // + psWidget->sBase.sPosition.i16XMin = i32X; + psWidget->sBase.sPosition.i16YMin = i32Y; + psWidget->sBase.sPosition.i16XMax = i32X + i32Width - 1; + psWidget->sBase.sPosition.i16YMax = i32Y + i32Height - 1; + + // + // Initialize the widget fields + // + psWidget->psFont = psFont; + psWidget->ui32ForegroundColor = ui32ForegroundColor; + psWidget->ui32BackgroundColor = ui32BackgroundColor; + psWidget->psTime = psTime; + psWidget->pfnOnOkClick = pfnOnOkClick; + + // + // Use the clock set message handler to process messages to this widget. + // + psWidget->sBase.pfnMsgProc = ClockSetMsgProc; +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + diff --git a/boards/ek-lm4f232/qs-logger/clocksetwidget.h b/boards/ek-lm4f232/qs-logger/clocksetwidget.h new file mode 100644 index 0000000..56134df --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/clocksetwidget.h @@ -0,0 +1,273 @@ +//***************************************************************************** +// +// clocksetwidget.h - Prototypes for a widget to set a clock date/time. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __CLOCKSETWIDGET_H__ +#define __CLOCKSETWIDGET_H__ + +//***************************************************************************** +// +//! \addtogroup clocksetwidget_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! A structure that represents a clock setting widget. +// +//***************************************************************************** +typedef struct _ClockSetWidget +{ + // + //! The generic widget information. + // + tWidget sBase; + + // + //! The font to use for drawing text on the widget. + // + const tFont *psFont; + + // + //! The foreground color of the widget. This is the color that will be + //! used for drawing text and lines, and will also be used as the highlight + //! color for a selected field on the widget. + // + uint32_t ui32ForegroundColor; + + // + //! The background color of the widget. + // + uint32_t ui32BackgroundColor; + + // + //! An index for the date/time field that is highlighted + // + uint32_t ui32Highlight; + + // + //! A pointer to a time structure that is used for showing and editing + //! the date and time. The application should supply the storage for this + //! structure, and this widget will modify it as the user changes the + //! date/time. + // + struct tm *psTime; + + // + //! A pointer to the function to be called when the OK or cancel button is + //! selected. The OK button is used to indicate the user is done setting + //! the time. The CANCEL button is used to indicate that the user does + //! not want to update the time. The flag bOk is true if the OK button + //! was selected, false otherwise. The callback function can be used by + //! the application to detect when the clock setting widget can be removed + //! from the screen and whether or not to update the time. + // + void (*pfnOnOkClick)(tWidget *psWidget, bool bOk); +} tClockSetWidget; + +//***************************************************************************** +// +//! Declares an initialized strip chart widget data structure. +//! +//! \param psParent is a pointer to the parent widget. +//! \param psNext is a pointer to the sibling widget. +//! \param psChild is a pointer to the first child widget. +//! \param psDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param psFont is the font used for rendering text on the widget. +//! \param ui32ForegroundColor is the foreground color for the widget. +//! \param ui32BackgroundColor is the background color for the chart. +//! \param psTime is a pointer to storage for the time structure that the +//! widget will modify. +//! \param pfnOnOkClick is a callback function that is called when the user +//! selects the OK or CANCEL button on the widget. +//! +//! This macro provides an initialized clock setting widget data structure, +//! which can be used to construct the widget tree at compile time in global +//! variables (as opposed to run-time via function calls). This must be +//! assigned to a variable, such as: +//! +//! \verbatim +//! tClockSetWidget g_sClockSetter = ClockSetStruct(...); +//! \endverbatim +//! +//! Or, in an array of variables: +//! +//! \verbatim +//! tClockSetWidget g_psClockSetters[] = +//! { +//! ClockSetStruct(...), +//! ClockSetStruct(...) +//! }; +//! \endverbatim +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define ClockSetStruct(psParent, psNext, psChild, psDisplay, i32X, i32Y, \ + i32Width, i32Height, psFont, ui32ForegroundColor, \ + ui32BackgroundColor, psTime, pfnOnOkClick) \ + { \ + { \ + sizeof(tClockSetWidget), \ + (tWidget *)(psParent), \ + (tWidget *)(psNext), \ + (tWidget *)(psChild), \ + psDisplay, \ + { \ + i32X, \ + i32Y, \ + (i32X) + (i32Width) - 1, \ + (i32Y) + (i32Height) - 1 \ + }, \ + ClockSetMsgProc \ + }, \ + psFont, ui32ForegroundColor, ui32BackgroundColor, 6, psTime, \ + pfnOnOkClick \ + } + +//***************************************************************************** +// +//! Declares an initialized variable containing a clock setting widget data +//! structure. +//! +//! \param sName is the name of the variable to be declared. +//! \param psParent is a pointer to the parent widget. +//! \param psNext is a pointer to the sibling widget. +//! \param psChild is a pointer to the first child widget. +//! \param psDisplay is a pointer to the off-screen display on which to draw. +//! \param i32X is the X coordinate of the upper left corner of the canvas. +//! \param i32Y is the Y coordinate of the upper left corner of the canvas. +//! \param i32Width is the width of the canvas. +//! \param i32Height is the height of the canvas. +//! \param psFont is the font used for rendering text on the widget. +//! \param ui32ForegroundColor is the foreground color for the widget. +//! \param ui32BackgroundColor is the background color for the chart. +//! \param psTime is a pointer to storage for the time structure that the +//! widget will modify. +//! \param pfnOnOkClick is a callback function that is called when the user +//! selects the OK or CANCEL button on the widget. +//! +//! This macro declares a variable containing an initialized clock setting +//! widget data structure, which can be used to construct the widget tree at +//! compile time in global variables (as opposed to run-time via function +//! calls). +//! +//! \return Nothing; this is not a function. +// +//***************************************************************************** +#define ClockSet(sName, psParent, psNext, psChild, psDisplay, i32X, i32Y, \ + i32Width, i32Height, psFont, ui32ForegroundColor, \ + ui32BackgroundColor, psTime, pfnOnOkClick) \ + tClockSetWidget sName = ClockSetStruct(psParent, psNext, psChild, \ + psDisplay, i32X, i32Y, \ + i32Width, i32Height, psFont, \ + ui32ForegroundColor, \ + ui32BackgroundColor, psTime, \ + pfnOnOkClick) + +//***************************************************************************** +// +//! Sets the pointer to the time structure for the clock set widget. +//! +//! \param psClockSetWidget is a pointer to the clock set widget to modify. +//! \param psTime is a pointer to the a time structure to use for clock +//! setting. +//! +//! This function sets the time structure used by the widget. +//! +//! \return None. +// +//***************************************************************************** +#define ClockSetTimePtrSet(psClockSetWidget, psTime) \ + do \ + { \ + (pClockSetWidget)->psTime = (psTime); \ + } \ + while(0) + +//***************************************************************************** +// +//! Sets the callback function to be used when OK or CANCEL is selected. +//! +//! \param pClockSetWidget is a pointer to the clock set widget to modify. +//! \param pfnCB is a pointer to function to call when OK is selected by the +//! user. +//! +//! This function sets the OK click callback function used by the widget. +//! +//! \return None. +// +//***************************************************************************** +#define ClockSetCallbackSet(pClockSetWidget, pfnCB) \ + do \ + { \ + (pClockSetWidget)->pfnOnOkClick = (pfnCB); \ + } while(0) + +//***************************************************************************** +// +// Prototypes for the clock set widget APIs. +// +//***************************************************************************** +extern void ClockSetInit(tClockSetWidget *psWidget, const tDisplay *psDisplay, + int32_t i32X, int32_t i32Y, int32_t i32Width, + int32_t i32Height, tFont *psFont, + uint32_t ui32ForegroundColor, + uint32_t ui32BackgroundColor, struct tm *psTime, + void (*pfnOnOkClick)(tWidget *psWidget, bool bOk)); +extern int32_t ClockSetMsgProc(tWidget *psWidget, uint32_t ui32Msg, + uint32_t ui32Param1, uint32_t ui32Param2); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#endif // __CLOCKSETWIDGET_H__ diff --git a/boards/ek-lm4f232/qs-logger/ewarm/Exe/qs-logger.bin b/boards/ek-lm4f232/qs-logger/ewarm/Exe/qs-logger.bin new file mode 100644 index 0000000..d7e5596 Binary files /dev/null and b/boards/ek-lm4f232/qs-logger/ewarm/Exe/qs-logger.bin differ diff --git a/boards/ek-lm4f232/qs-logger/ewarm/Exe/qs-logger.out b/boards/ek-lm4f232/qs-logger/ewarm/Exe/qs-logger.out new file mode 100644 index 0000000..20ce755 Binary files /dev/null and b/boards/ek-lm4f232/qs-logger/ewarm/Exe/qs-logger.out differ diff --git a/boards/ek-lm4f232/qs-logger/flashstore.c b/boards/ek-lm4f232/qs-logger/flashstore.c new file mode 100644 index 0000000..30cbcea --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/flashstore.c @@ -0,0 +1,625 @@ +//***************************************************************************** +// +// flashstore.c - Data logger module to handle storage in flash. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/flash.h" +#include "utils/ustdlib.h" +#include "qs-logger.h" +#include "usbstick.h" +#include "flashstore.h" + +//***************************************************************************** +// +// This module manages the storage of data logger data into flash memory. +// +//***************************************************************************** + +//***************************************************************************** +// +// Define the beginning and end of the flash storage area. You must make sure +// that this area is well clear of any space occupied by the application +// binary, and that this space is not used for any other purpose. +// The start and end addresses must be 1K aligned. The end address is +// exclusive - it is 1 value greater than the last valid location used for +// storage. +// +//***************************************************************************** +#define FLASH_STORE_START_ADDR 0x20000 +#define FLASH_STORE_END_ADDR 0x40000 + +//***************************************************************************** +// +// The next address in flash, that will be used for storing a data record. +// +//***************************************************************************** +static uint32_t g_ui32StoreAddr; + +//***************************************************************************** +// +// A buffer used to assemble a complete record of data prior to storing it +// in the flash. +// +//***************************************************************************** +static uint32_t g_pui32RecordBuf[32]; + +//***************************************************************************** +// +// Initializes the flash storage. This is a stub because there is nothing +// special to do. +// +//***************************************************************************** +void +FlashStoreInit(void) +{ +} + +//***************************************************************************** +// +// Saves data records that are stored in the flash to an externally connected +// USB memory storage device (USB stick). +// The flash memory is scanned for the presence of store data records. When +// records are found they are written in CSV format to the USB stick. This +// function assumes a non-corrupted storage area, and that any records, once +// found, are contiguous with all stored records. It will find the oldest +// record and start with that when storing. +// +//***************************************************************************** +int32_t +FlashStoreSave(void) +{ + uint32_t ui32Addr, ui32OldestRecord, ui32OldestSeconds, ui32Count, + ui32PartialCount; + tLogRecord *psRecord; + + // + // Initialize locals. + // + ui32OldestRecord = FLASH_STORE_START_ADDR; + ui32OldestSeconds = 0xFFFFFFFF; + + // + // Show a message to the user. + // + SetStatusText("SAVE", "SCANNING", "FLASH", 0); + + // + // Start at beginning of flash storage area + // + ui32Addr = FLASH_STORE_START_ADDR; + + // + // Search all of flash area checking every stored record. + // + while(ui32Addr < FLASH_STORE_END_ADDR) + { + // + // If a record signature is found, check for oldest record, then + // increment to the next record + // + if((HWREG(ui32Addr) & 0xFFFFFF00) == 0x53554100) + { + // + // Get a pointer to the data record (account for flash header word) + // + psRecord = (tLogRecord *)(ui32Addr + 4); + + // + // If the seconds in this record are older than any found so far + // then save the seconds value, and the address of this record + // + if(psRecord->ui32Seconds < ui32OldestSeconds) + { + ui32OldestSeconds = psRecord->ui32Seconds; + ui32OldestRecord = ui32Addr; + } + + // + // Advance the address to the next record. + // + ui32Addr += HWREG(ui32Addr) & 0xFF; + } + else + { + // + // A record was not found so just advance to the next location in + // flash + // + ui32Addr += 4; + } + } + + // + // If no "oldest" seconds was found, then there is no valid data stored + // + if(ui32OldestSeconds == 0xFFFFFFFF) + { + SetStatusText("SAVE", "NO RECORDS", "FOUND", "PRESS <"); + return(1); + } + + // + // Open the output file on the USB stick. It will return NULL if there + // was any problem. + // + if(!USBStickOpenLogFile(0)) + { + SetStatusText("SAVE", 0, "USB ERROR", "PRESS <"); + return(1); + } + + // + // Notify user we are saving data to USB + // + SetStatusText("SAVE", "SAVING", "TO USB", 0); + + // + // Start reading records from flash, start at the address of the oldest + // record, as found above. We scan through records, assuming the flash + // store is not corrupted. Continue scanning until a blank space is + // found which should indicate the end of recorded data, or until we + // have read all the records. + // + ui32Addr = ui32OldestRecord; + while(HWREG(ui32Addr) != 0xFFFFFFFF) + { + // + // If a record signature is found (which it should be), extract the + // record data and send it to USB stick. + // + if((HWREG(ui32Addr) & 0xFFFFFF00) == 0x53554100) + { + // + // Get byte count for this record + // + ui32Count = HWREG(ui32Addr) & 0xFF; + + // + // Adjust the count and the address to remove the flash header + // + ui32Count -= 4; + ui32Addr += 4; + + // + // Adjust for memory wrap + // + if(ui32Addr >= FLASH_STORE_END_ADDR) + { + ui32Addr = FLASH_STORE_START_ADDR; + } + + // + // If the contents of this record go past the end of the memory + // storage area, then perform a partial copy first. + // + ui32PartialCount = 0; + if((ui32Addr + ui32Count) >= FLASH_STORE_END_ADDR) + { + // + // Find how many bytes are left on this page + // + ui32PartialCount = FLASH_STORE_END_ADDR - ui32Addr; + + // + // Copy the portion until the end of memory store, adjust + // remaining count and address + // + memcpy(g_pui32RecordBuf, (void *)ui32Addr, ui32PartialCount); + ui32Count -= ui32PartialCount; + ui32Addr = FLASH_STORE_START_ADDR; + } + + // + // Copy entire record (or remaining part of record if memory wrap) + // into record buffer + // + memcpy(&g_pui32RecordBuf[ui32PartialCount / 4], (void *)ui32Addr, + ui32Count); + + // + // Update address pointer to next record + // + ui32Addr += ui32Count; + + // + // Now we have an entire data logger record copied from flash + // storage into a local (contiguous) memory buffer. Pass it + // to the USB file writing function to write the record to the + // USB stick. + // + USBStickWriteRecord((tLogRecord *)g_pui32RecordBuf); + } + else + { + // + // This should not happen, but it means we ended up in a non-blank + // location that is not the start of a record. In this case just + // advance through memory until either a blank location or another + // record is found. + // + // Increment to next word in flash, adjust for memory wrap. + // + ui32Addr += 4; + if(ui32Addr >= FLASH_STORE_END_ADDR) + { + ui32Addr = FLASH_STORE_START_ADDR; + } + } + } + + // + // Close the USB stick file so that any buffers will be flushed. + // + USBStickCloseFile(); + + // + // Inform user that save is complete. + // + SetStatusText("SAVE", "USB SAVE", "COMPLETE", "PRESS <"); + + // + // Return success + // + return(0); +} + +//***************************************************************************** +// +// This is called at the start of logging to prepare space in flash for +// storage of logged data. It searches for the first blank area in the +// flash storage to be used for storing records. +// +// If a starting address is specified then the search is skipped and it goes +// directly to the new address. If the starting address is 0, then it performs +// the search. +// +//***************************************************************************** +int32_t +FlashStoreOpenLogFile(uint32_t ui32StartAddr) +{ + uint32_t ui32Addr; + + // + // If a valid starting address is specified, then just use that and skip + // the search below. + // + if((ui32StartAddr >= FLASH_STORE_START_ADDR) && + (ui32StartAddr < FLASH_STORE_END_ADDR)) + { + g_ui32StoreAddr = ui32StartAddr; + return(0); + } + + // + // Start at beginning of flash storage area + // + ui32Addr = FLASH_STORE_START_ADDR; + + // + // Search until a blank is found or the end of flash storage area + // + while((HWREG(ui32Addr) != 0xFFFFFFFF) && (ui32Addr < FLASH_STORE_END_ADDR)) + { + // + // If a record signature is found, then increment to the next record + // + if((HWREG(ui32Addr) & 0xFFFFFF00) == 0x53554100) + { + ui32Addr += HWREG(ui32Addr) & 0xFF; + } + else + { + // + // Just advance to the next location in flash + // + ui32Addr += 4; + } + } + + // + // If we are at the end of flash that means no blank area was found. + // So reset to the beginning and erase the first page. + // + if(ui32Addr >= FLASH_STORE_END_ADDR) + { + ui32Addr = FLASH_STORE_START_ADDR; + FlashErase(ui32Addr); + } + + // + // When we reach here we either found a blank location, or made a new + // blank location by erasing the first page. + // To keep things simple we are making an assumption that the flash store + // is not corrupted and that the first blank location implies the start + // of a blank area suitable for storing data records. + // + g_ui32StoreAddr = ui32Addr; + + // + // Return success indication to caller + // + return(0); +} + +//***************************************************************************** +// +// This is called each time there is a new data record to log to the flash +// storage area. A simple algorithm is used which rotates programming +// data log records through an area of flash. It is assumed that the current +// page is blank. Records are stored on the current page until a page +// boundary is crossed. If the page boundary is crossed and the new page +// is not blank (testing only the first location), then the new page is +// erased. Finally the entire record is programmed into flash and the +// storage pointers are updated. +// +// While storing and when crossing to a new page, if the flash page is not +// blank it is erased. So this algorithm overwrites old data. +// +// The data is stored in flash as a record, with a flash header prepended, +// and with the record length padded to be a multiple of 4 bytes. The flash +// header is a 3-byte magic number and one byte of record length. +// +//***************************************************************************** +int32_t +FlashStoreWriteRecord(tLogRecord *psRecord) +{ + uint32_t ui32Idx, ui32ItemCount, *pui32Record; + + // + // Check the arguments + // + ASSERT(psRecord); + if(!psRecord) + { + return(1); + } + + // + // Determine how many channels are to be logged + // + ui32Idx = psRecord->ui16ItemMask; + ui32ItemCount = 0; + while(ui32Idx) + { + if(ui32Idx & 1) + { + ui32ItemCount++; + } + ui32Idx >>= 1; + } + + // + // Add 16-bit count equivalent of record header, time stamp, and + // selected items mask. This is the total number of 16 bit words + // of the record. + // + ui32ItemCount += 6; + + // + // Convert the count to bytes, be sure to pad to 32-bit alignment. + // + ui32ItemCount = ((ui32ItemCount * 2) + 3) & ~3; + + // + // Create the flash record header, which is a 3-byte signature and a + // one byte count of bytes in the record. Save it at the beginning + // of the write buffer. + // + ui32Idx = 0x53554100 | (ui32ItemCount & 0xFF); + g_pui32RecordBuf[0] = ui32Idx; + + // + // Copy the rest of the record to the buffer, and get a pointer to + // the buffer. + // + memcpy(&g_pui32RecordBuf[1], psRecord, ui32ItemCount - 4); + pui32Record = g_pui32RecordBuf; + + // + // Check to see if the record is going to cross a page boundary. + // + if(((g_ui32StoreAddr & 0x3FF) + ui32ItemCount) > 0x3FF) + { + // + // Find number of bytes remaining on this page + // + ui32Idx = 0x400 - (g_ui32StoreAddr & 0x3FF); + + // + // Program part of the record on the space remaining on the current + // page + // + FlashProgram(pui32Record, g_ui32StoreAddr, ui32Idx); + + // + // Increment the store address by the amount just written, which + // should make the new store address be at the beginning of the next + // flash page. + // + g_ui32StoreAddr += ui32Idx; + + // + // Adjust the remaining bytes to program, and the pointer to the + // remainder of the record data. + // + ui32ItemCount -= ui32Idx; + pui32Record = &g_pui32RecordBuf[ui32Idx / 4]; + + // + // Check to see if the new page is past the end of store and adjust + // + if(g_ui32StoreAddr >= FLASH_STORE_END_ADDR) + { + g_ui32StoreAddr = FLASH_STORE_START_ADDR; + } + + // + // If new page is not blank, then erase it + // + if(HWREG(g_ui32StoreAddr) != 0xFFFFFFFF) + { + FlashErase(g_ui32StoreAddr); + } + } + + // + // Now program the remaining part of the record (if we crossed a page + // boundary above) or the full record to the current location in flash + // + FlashProgram(pui32Record, g_ui32StoreAddr, ui32ItemCount); + + // + // Increment the storage address to the next location. + // + g_ui32StoreAddr += ui32ItemCount; + + // + // Return success indication to caller. + // + return(0); +} + +//***************************************************************************** +// +// Return the current address being used for storing records. +// +//***************************************************************************** +uint32_t +FlashStoreGetAddr(void) +{ + return(g_ui32StoreAddr); +} + +//***************************************************************************** +// +// Erase the data storage area of flash. +// +//***************************************************************************** +void +FlashStoreErase(void) +{ + uint32_t ui32Addr; + + // + // Inform user we are erasing + // + SetStatusText("ERASE", 0, "ERASING", 0); + + // + // Loop through entire storage area and erase each page. + // + for(ui32Addr = FLASH_STORE_START_ADDR; ui32Addr < FLASH_STORE_END_ADDR; + ui32Addr += 0x400) + { + FlashErase(ui32Addr); + } + + // + // Inform user the erase is done. + // + SetStatusText("SAVE", "ERASE", "COMPLETE", "PRESS <"); +} + +//***************************************************************************** +// +// Determine if the flash block that contains the address is blank. +// +//***************************************************************************** +static int32_t +IsBlockFree(uint32_t ui32BaseAddr) +{ + uint32_t ui32Addr; + + // + // Make sure we start at the beginning of a 1K block + // + ui32BaseAddr &= ~0x3FF; + + // + // Loop through every address in this block and test if it is blank. + // + for(ui32Addr = 0; ui32Addr < 0x400; ui32Addr += 4) + { + if(HWREG(ui32BaseAddr + ui32Addr) != 0xFFFFFFFF) + { + // + // Found a non-blank location, so return indication that block + // is not free. + // + return(0); + } + } + + // + // If we made it to here then every location in this block is erased, + // so return indication that the block is free. + // + return(1); +} + +//***************************************************************************** +// +// Report to the user the amount of free space and used space in the data +// storage area. +// +//***************************************************************************** +void +FlashStoreReport(void) +{ + uint32_t ui32Addr, ui32FreeBlocks, ui32UsedBlocks = 0; + static char pcBufFree[16], pcBufUsed[16]; + + // + // Initialize locals. + // + ui32FreeBlocks = 0; + ui32UsedBlocks = 0; + + // + // Loop through each block of the storage area and count how many blocks + // are free and non-free. + // + for(ui32Addr = FLASH_STORE_START_ADDR; ui32Addr < FLASH_STORE_END_ADDR; + ui32Addr += 0x400) + { + if(IsBlockFree(ui32Addr)) + { + ui32FreeBlocks++; + } + else + { + ui32UsedBlocks++; + } + } + + // + // Report the result to the user via a status display screen. + // + usnprintf(pcBufFree, sizeof(pcBufFree), "FREE: %3uK", ui32FreeBlocks); + usnprintf(pcBufUsed, sizeof(pcBufUsed), "USED: %3uK", ui32UsedBlocks); + SetStatusText("FREE FLASH", pcBufFree, pcBufUsed, "PRESS <"); +} diff --git a/boards/ek-lm4f232/qs-logger/flashstore.h b/boards/ek-lm4f232/qs-logger/flashstore.h new file mode 100644 index 0000000..7b50538 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/flashstore.h @@ -0,0 +1,60 @@ +//***************************************************************************** +// +// flashstore.h - Prototypes and definitions for flash storage module. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** +#ifndef __FLASHSTORE_H__ +#define __FLASHSTORE_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Module function prototypes. +// +//***************************************************************************** +extern void FlashStoreInit(void); +extern int32_t FlashStoreOpenLogFile(uint32_t ui32StartAddr); +extern int32_t FlashStoreWriteRecord(tLogRecord *psRecord); +extern int32_t FlashStoreSave(void); +extern void FlashStoreErase(void); +extern void FlashStoreReport(void); +extern uint32_t FlashStoreGetAddr(void); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __FLASHSTORE_H__ diff --git a/boards/ek-lm4f232/qs-logger/gcc/qs-logger.axf b/boards/ek-lm4f232/qs-logger/gcc/qs-logger.axf new file mode 100644 index 0000000..ecbf290 Binary files /dev/null and b/boards/ek-lm4f232/qs-logger/gcc/qs-logger.axf differ diff --git a/boards/ek-lm4f232/qs-logger/gcc/qs-logger.bin b/boards/ek-lm4f232/qs-logger/gcc/qs-logger.bin new file mode 100644 index 0000000..cf196f3 Binary files /dev/null and b/boards/ek-lm4f232/qs-logger/gcc/qs-logger.bin differ diff --git a/boards/ek-lm4f232/qs-logger/images.c b/boards/ek-lm4f232/qs-logger/images.c new file mode 100644 index 0000000..ae59b95 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/images.c @@ -0,0 +1,865 @@ +//***************************************************************************** +// +// images.c - Data for images used in the user interface. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// This image contains the TI logo with black background. +// +//***************************************************************************** +const uint8_t g_pui8Image_TI_Black[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x11, 0x11, 0x15, + 0x0d, 0x0a, 0x55, + 0x2d, 0x2d, 0x2d, + 0x18, 0x13, 0xa1, + 0x4c, 0x4c, 0x4c, + 0x23, 0x1c, 0xea, + 0x6b, 0x6b, 0x6b, + 0x87, 0x87, 0x87, + 0x9b, 0x9b, 0x9b, + 0xa8, 0xa8, 0xa8, + 0xb9, 0xb9, 0xb9, + 0xc8, 0xc8, 0xc8, + 0xd7, 0xd7, 0xd7, + 0xe6, 0xe6, 0xe6, + 0xfe, 0xfe, 0xfe, + + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x8f, 0x03, 0x44, 0x44, 0x20, 0x07, + 0x07, 0x77, 0x2f, 0x83, 0x07, 0x66, 0x66, 0x20, 0x02, 0x10, 0x07, 0x07, + 0xe0, 0x77, 0x2f, 0x05, 0x66, 0x66, 0x20, 0x26, 0x20, 0xf8, 0x07, 0x07, + 0x77, 0x2f, 0x05, 0x66, 0x66, 0x20, 0x2f, 0x24, 0x10, 0x03, 0x01, 0x07, + 0x07, 0x77, 0x2f, 0x00, 0x00, 0x66, 0x66, 0x62, 0x24, 0x14, 0x44, 0x20, + 0x07, 0x00, 0x7d, 0xbc, 0xcb, 0xc1, 0x07, 0x07, 0x77, 0x80, 0x2f, 0x66, + 0x66, 0x62, 0x64, 0x26, 0x66, 0x40, 0x00, 0x00, 0x75, 0x3f, 0xc3, 0x85, + 0x33, 0x01, 0x31, 0x01, 0x00, 0x31, 0x00, 0x10, 0x00, 0x05, 0x10, 0x07, + 0xc0, 0xbf, 0x76, 0x66, 0x66, 0x22, 0x64, 0x14, 0x66, 0x00, 0x20, 0x00, + 0x00, 0x0f, 0x90, 0x7e, 0xaa, 0x95, 0x00, 0xfd, 0x08, 0xe3, 0x0a, 0xf1, + 0x03, 0xba, 0xc8, 0xe0, 0x07, 0xbf, 0x73, 0x22, 0x22, 0x22, 0x66, 0x62, + 0x00, 0x02, 0x62, 0x02, 0x66, 0x40, 0x00, 0x00, 0x0f, 0x00, 0x90, 0x8f, + 0x00, 0x50, 0x7f, 0x5a, 0x30, 0x3c, 0x0e, 0xf9, 0x0c, 0xf0, 0x05, 0x05, + 0xcd, 0x97, 0x46, 0x00, 0x66, 0x66, 0x66, 0x64, 0x12, 0x62, 0x24, 0x66, + 0x00, 0x62, 0x00, 0x00, 0x0f, 0x90, 0x7f, 0x8a, 0x70, 0x00, 0x0a, 0xf3, + 0x00, 0x85, 0x5f, 0x05, 0xff, 0xb3, 0xe0, 0x05, 0xcd, 0x97, 0x02, 0x66, + 0x66, 0x66, 0x66, 0x00, 0x24, 0x62, 0x66, 0x66, 0x64, 0x00, 0x00, 0x0f, + 0x00, 0x90, 0x8f, 0x57, 0x30, 0x08, 0xf9, 0x00, 0xd8, 0x07, 0x8f, 0x50, + 0x18, 0xdf, 0x30, 0x04, 0xd4, 0xa7, 0x00, 0x00, 0x00, 0x26, 0x66, 0x66, + 0x66, 0x26, 0x42, 0x00, 0x66, 0x66, 0x64, 0x00, 0x00, 0x0f, 0xa0, 0x8f, + 0x00, 0x00, 0x31, 0x88, 0x3f, 0x73, 0xc7, 0x7e, 0xc7, 0x1c, 0x50, 0x1f, + 0x50, 0x05, 0xcd, 0x97, 0x04, 0x66, 0x00, 0x66, 0x66, 0x26, 0x22, 0x66, + 0x66, 0x64, 0x00, 0x00, 0x00, 0x3d, 0x90, 0x8e, 0xaa, 0xb7, 0xd3, 0x0c, + 0x03, 0xdc, 0x80, 0x09, 0xe9, 0xca, 0xc8, 0x06, 0xc6, 0x80, 0x86, 0x02, + 0x66, 0x22, 0x66, 0x00, 0x00, 0x26, 0x00, 0x64, 0x21, 0x00, 0x00, 0x31, + 0x31, 0x10, 0x33, 0x00, 0x01, 0x10, 0x00, 0x11, 0x00, 0x00, 0x10, 0x03, + 0x70, 0x10, 0x06, 0xc6, 0x87, 0x22, 0x00, 0x46, 0x10, 0x13, 0x00, 0x46, + 0x20, 0x01, 0x3d, 0xa1, 0x07, 0x07, 0xc0, 0x77, 0x2f, 0x00, 0x00, 0x06, + 0x66, 0x66, 0x62, 0x80, 0x02, 0x0f, 0x90, 0x30, 0x01, 0x31, 0x03, 0x51, + 0x00, 0x03, 0x51, 0x53, 0x13, 0x35, 0x00, 0x33, 0x30, 0x00, 0x13, 0x33, + 0x10, 0x00, 0x03, 0x33, 0x15, 0x51, 0x00, 0x13, 0x00, 0x13, 0x13, 0x31, + 0x53, 0x01, 0x53, 0x18, 0x00, 0x00, 0x00, 0xe9, 0xd1, 0x04, 0x66, 0x66, + 0x40, 0x20, 0x9a, 0x0f, 0x81, 0xfd, 0x00, 0xe7, 0x7b, 0x00, 0xab, 0x8a, + 0xbf, 0xa9, 0x7f, 0xba, 0xe5, 0x5f, 0x00, 0x70, 0x3e, 0x39, 0xf3, 0x00, + 0xef, 0x3a, 0xf9, 0x08, 0xb8, 0x5f, 0xb0, 0x1d, 0x69, 0x5b, 0x9c, 0x93, + 0x10, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x01, 0x66, 0x40, 0x66, 0xab, + 0x0f, 0x90, 0xaf, 0xc0, 0x87, 0xf7, 0x00, 0x01, 0x50, 0x3f, 0x01, 0x5f, + 0x30, 0xef, 0x1f, 0x00, 0x30, 0x0b, 0x07, 0xfc, 0x05, 0xfe, 0x09, 0xf0, + 0x00, 0x03, 0x3c, 0xf8, 0x09, 0x70, 0x5f, 0x01, 0xee, 0x06, 0x00, 0x33, + 0x00, 0x00, 0x00, 0xe9, 0xd1, 0x26, 0x20, 0x66, 0x20, 0xa2, 0x0f, 0x90, + 0x95, 0xf9, 0x85, 0x00, 0x8f, 0xf8, 0x00, 0x5f, 0x10, 0x1f, 0x97, 0xc7, + 0x00, 0x1f, 0x30, 0x0b, 0x17, 0xaf, 0x37, 0xbe, 0x08, 0x00, 0xf8, 0xb3, + 0x08, 0x5f, 0x89, 0x10, 0x7f, 0x00, 0x03, 0x3f, 0xfc, 0x30, 0x00, 0x00, + 0x00, 0xe9, 0xd1, 0x10, 0x02, 0x44, 0x20, 0xa2, 0x0f, 0x90, 0xb0, 0x3f, + 0x00, 0xf3, 0x03, 0x8f, 0xc0, 0x5f, 0x10, 0x3f, 0x8b, 0x00, 0xe0, 0x1f, + 0x30, 0x0b, 0x18, 0x5a, 0xf5, 0x5f, 0x00, 0x08, 0xe3, 0x51, 0x1b, 0x07, + 0xfd, 0x00, 0x7f, 0x01, 0x10, 0x00, 0x7b, 0xfb, 0x00, 0x00, 0x00, 0xe9, + 0xc0, 0xd4, 0xa2, 0x0f, 0xa0, 0xc3, 0x07, 0xf7, 0x81, 0x00, 0x0c, 0xe0, + 0x5f, 0x10, 0x3f, 0x10, 0xfb, 0x0f, 0x00, 0x80, 0x5e, 0x09, 0x53, 0xf0, + 0x7f, 0x0a, 0xf0, 0x00, 0x05, 0x7b, 0x00, 0x9f, 0x10, 0x7f, 0x00, 0x87, + 0x07, 0x03, 0xfd, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa2, 0x00, 0x3d, 0x93, + 0xc5, 0x00, 0x75, 0x8b, 0xab, 0x30, 0x00, 0x7e, 0x50, 0x5e, 0x70, 0x5f, + 0x75, 0xc9, 0xb5, 0x00, 0x0c, 0x70, 0x70, 0x9d, 0x38, 0xd9, 0xa9, 0x7c, + 0x00, 0x30, 0x08, 0x30, 0x8e, 0x50, 0x5c, 0xac, 0x73, 0x1f, 0x00, 0x00, + 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xc0, 0x07, 0x07, +}; + +//***************************************************************************** +// +// This image contains a splash screen image. +// +//***************************************************************************** +const uint8_t g_pui8Image_Splash1[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x28, 0x28, 0x28, + 0x41, 0x41, 0x41, + 0x55, 0x55, 0x55, + 0x67, 0x67, 0x67, + 0x77, 0x77, 0x77, + 0x86, 0x86, 0x86, + 0x96, 0x96, 0x96, + 0xa7, 0xa7, 0xa7, + 0xb7, 0xb7, 0xb7, + 0xc6, 0xc6, 0xc6, + 0xd8, 0xd8, 0xd8, + 0xe6, 0xe6, 0xe6, + 0xf0, 0xf0, 0xf0, + 0xf9, 0xf9, 0xf9, + 0xff, 0xff, 0xff, + + 0x1f, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xdf, 0x07, 0x06, 0x76, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0x0f, 0xff, 0xff, 0x20, 0x5f, 0x07, 0x07, 0x77, 0x2f, + 0x8f, 0x07, 0xff, 0x36, 0x05, 0x07, 0x07, 0x77, 0x2f, 0x87, 0x07, 0xff, + 0x27, 0xe0, 0x9f, 0x07, 0x07, 0x77, 0xc4, 0x2f, 0x07, 0x26, 0xf6, 0x1f, + 0x03, 0xf8, 0x5f, 0xe8, 0x07, 0x07, 0x77, 0xcd, 0x27, 0xff, 0x36, 0xff, + 0x4e, 0x15, 0x03, 0x70, 0x1c, 0x07, 0x1f, 0x3b, 0xfe, 0x00, 0x42, 0x24, + 0x42, 0x22, 0x35, 0x45, 0xbf, 0xea, 0x00, 0x88, 0x99, 0xab, 0xcf, 0xff, + 0xff, 0x35, 0xff, 0x47, 0x81, 0x02, 0xb2, 0x29, 0x3d, 0x05, 0xcd, 0x97, + 0x00, 0x50, 0x3a, 0xb0, 0x1a, 0xfb, 0x02, 0x63, 0x01, 0x00, 0x11, 0x22, + 0x21, 0x21, 0x11, 0x24, 0x8f, 0x63, 0x00, 0xff, 0xf1, 0x7f, 0xff, 0xff, + 0xf9, 0x06, 0xf9, 0x70, 0x2f, 0x05, 0xcd, 0x96, 0x90, 0x41, 0x7f, 0xf1, + 0x00, 0x8f, 0xf7, 0x1f, 0xff, 0x62, 0xaf, 0xff, 0xff, 0x00, 0xee, 0xc9, + 0x53, 0x22, 0x11, 0xff, 0xf3, 0x3f, 0x8e, 0x51, 0x9f, 0xf6, 0x2f, 0x04, + 0xd4, 0xa6, 0xfa, 0x00, 0x52, 0x08, 0xf5, 0x2f, 0xf1, 0x6f, 0xf3, 0x2f, + 0x40, 0xeb, 0x15, 0xfd, 0x60, 0xaf, 0xf6, 0x1f, 0xff, 0x07, 0xff, 0x16, + 0xff, 0xf2, 0x5f, 0x75, 0x3d, 0x03, 0x00, 0xc5, 0x12, 0x63, 0x1f, 0xf9, + 0x1f, 0xf2, 0x5f, 0x10, 0xf2, 0x4f, 0x63, 0x16, 0xf5, 0x2f, 0xfa, 0x1d, + 0x03, 0xff, 0xf7, 0x1f, 0xff, 0x91, 0xdf, 0x76, 0x36, 0x00, 0xff, 0xff, + 0xb3, 0x12, 0x9f, 0xfd, 0x19, 0xfc, 0x02, 0x1b, 0xf3, 0x4f, 0xf1, 0x6f, + 0x18, 0x17, 0x18, 0x01, 0xff, 0x11, 0x7f, 0xf1, 0x5f, 0xff, 0x15, 0x7f, + 0x80, 0x37, 0xb2, 0x04, 0xcf, 0xff, 0xff, 0x34, 0xff, 0x02, 0x19, 0xf4, + 0x4f, 0xf1, 0xab, 0x1f, 0x0f, 0x71, 0x03, 0xff, 0x32, 0x32, 0x81, 0xef, + 0xf2, 0x7f, 0x3f, 0x10, 0xf4, 0x04, 0xdf, 0x0b, 0x25, 0xf5, 0x3f, 0xe1, + 0x20, 0xc6, 0x3f, 0x0f, 0xf2, 0x4f, 0x62, 0xf9, 0x06, 0x31, 0xfd, 0x12, + 0x87, 0x3e, 0xfb, 0x01, 0xcf, 0x02, 0x00, 0xd1, 0xbf, 0x53, 0xf7, 0x2f, + 0xb1, 0xe3, 0x6f, 0x80, 0x07, 0xfc, 0x0b, 0xf1, 0x14, 0x1f, 0xe0, 0x4f, + 0xc8, 0x87, 0x3e, 0x90, 0x5f, 0x03, 0xf2, 0x5f, 0x92, 0x04, 0xfa, 0x2f, + 0xa2, 0xd1, 0xaf, 0x07, 0xff, 0x43, 0x0c, 0xfb, 0x67, 0xef, 0x15, 0x8f, + 0x46, 0xfb, 0x07, 0x80, 0x04, 0xf5, 0x3f, 0xd1, 0xcd, 0x1f, 0xa2, 0xb1, + 0x50, 0xdf, 0x01, 0xee, 0x04, 0x81, 0xff, 0xff, 0xfd, 0x72, 0x1a, 0x1c, + 0x7c, 0x4b, 0xf0, 0x5f, 0x14, 0xfb, 0x02, 0x1d, 0xf2, 0x7f, 0x1d, 0x93, + 0xa1, 0x02, 0x5a, 0xa7, 0x04, 0x16, 0x01, 0x70, 0xdf, 0x14, 0x74, 0x1a, + 0x40, 0x32, 0x7e, 0x26, 0xf3, 0x4f, 0x1a, 0x94, 0x91, 0xa4, 0x0a, 0xce, + 0x03, 0xf4, 0x2f, 0x01, 0xf1, 0x3f, 0xc8, 0x0e, 0xc5, 0xf9, 0x0c, 0x7e, + 0x52, 0xf6, 0x2f, 0x11, 0x28, 0x85, 0x72, 0x0f, 0xff, 0xc1, 0xaf, 0x01, + 0x32, 0xfe, 0x08, 0x7f, 0x34, 0xf2, 0x3f, 0x06, 0xb1, 0x04, 0xfb, 0x1f, + 0x45, 0x85, 0x72, 0x0d, 0x87, 0xff, 0x2c, 0xff, 0x52, 0x03, 0x61, 0x0e, + 0x3d, 0xc1, 0xbf, 0x81, 0x7e, 0xf2, 0x8f, 0x2d, 0x84, 0x86, 0x72, 0x0d, + 0x04, 0xaa, 0xff, 0xff, 0x22, 0xef, 0x02, 0xf1, 0x4f, 0xd0, 0x06, 0x34, + 0x41, 0x8f, 0xf5, 0x3f, 0x38, 0xa3, 0x24, 0x66, 0x72, 0x12, 0xf7, 0xaf, + 0x01, 0xf9, 0x12, 0x4d, 0xcf, 0x02, 0xf8, 0x1f, 0x06, 0xc4, 0x15, 0x8c, + 0x00, 0xfe, 0xbe, 0xff, 0xfa, 0x1f, 0x55, 0xc3, 0x56, 0x01, 0x82, 0xff, + 0xf7, 0x8f, 0xff, 0xf6, 0xaf, 0x01, 0x00, 0xf3, 0x04, 0xdf, 0xff, 0xff, + 0xfb, 0xbf, 0xff, 0x60, 0x57, 0x03, 0xda, 0xb7, 0xcf, 0xff, 0xff, 0xfe, + 0x40, 0x19, 0x8c, 0xfc, 0x6e, 0xff, 0xff, 0x1b, 0xa2, 0x06, 0xd4, 0x46, + 0x82, 0xff, 0xfb, 0x51, 0x02, 0xf2, 0x00, 0x33, 0xbf, 0xff, 0xff, 0x51, + 0x5c, 0xff, 0x93, 0xc0, 0x8c, 0x59, 0x60, 0x2f, 0xff, 0xff, 0xfc, 0x1a, + 0x90, 0x12, 0xfd, 0x6d, 0x5a, 0x36, 0xf2, 0xb4, 0x37, 0x40, 0xa1, 0x17, + 0xf3, 0x44, 0x9f, 0xff, 0xff, 0x6a, 0x08, 0xff, 0xff, 0xf2, 0xbf, 0x6e, + 0xb1, 0x05, 0xff, 0x00, 0xff, 0xfc, 0x1b, 0xff, 0xff, 0x76, 0xff, 0xfd, + 0x41, 0x9e, 0x62, 0x73, 0xf2, 0x95, 0x36, 0xb1, 0x1e, 0x00, 0xff, 0xf7, + 0x13, 0x5f, 0xff, 0xff, 0xf4, 0x0a, 0x10, 0xff, 0xf3, 0x8f, 0x6e, 0xf3, + 0x22, 0xbf, 0xff, 0x04, 0xfc, 0x1b, 0xff, 0xff, 0xaa, 0x7d, 0xc2, 0xf3, + 0x00, 0x76, 0x35, 0xd1, 0xdf, 0xff, 0xfa, 0xcf, 0xff, 0x00, 0xff, 0xf8, + 0xbf, 0xff, 0xfa, 0x11, 0x0e, 0xff, 0x02, 0xff, 0xf2, 0x03, 0x9f, 0xf3, + 0x6f, 0x0d, 0xff, 0x02, 0xf6, 0x10, 0x6f, 0xff, 0xfd, 0x19, 0x96, 0xc5, + 0x00, 0xef, 0xf1, 0xb6, 0x57, 0x35, 0xf1, 0xbf, 0xff, 0x00, 0xf6, 0xaf, + 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xfc, 0x00, 0x00, 0x02, 0xef, 0xff, 0x78, + 0x91, 0x7f, 0xf5, 0x40, 0x4f, 0x04, 0xff, 0xff, 0xfb, 0x15, 0x2f, 0xff, + 0x20, 0xff, 0x16, 0x91, 0xfc, 0xef, 0xff, 0xfc, 0xbf, 0x00, 0xc8, 0xff, + 0xf3, 0x79, 0x56, 0x34, 0xf1, 0x9f, 0x80, 0x16, 0xfd, 0x13, 0x10, 0x08, + 0xff, 0x72, 0x47, 0x10, 0xff, 0xf8, 0x3f, 0x76, 0xff, 0x26, 0x1b, 0xff, + 0x20, 0xff, 0x43, 0x01, 0xa4, 0xff, 0xff, 0xf8, 0x6f, 0x00, 0xff, 0xff, + 0xf5, 0x4c, 0x45, 0x44, 0xf2, 0x7f, 0x80, 0x14, 0xda, 0xef, 0xfb, 0x2f, + 0x60, 0x00, 0x2d, 0x06, 0xfd, 0xcf, 0xff, 0xfb, 0x3e, 0x74, 0x41, 0x15, + 0x00, 0x17, 0xff, 0xff, 0x91, 0xff, 0xfb, 0xbf, 0xdd, 0x10, 0xff, 0xff, + 0xfe, 0x59, 0xf8, 0x2c, 0x55, 0x43, 0x20, 0xb6, 0x4f, 0x12, 0xfb, 0xdf, + 0xd8, 0xef, 0xf9, 0x05, 0x3b, 0x1b, 0x23, 0x50, 0x9f, 0x49, 0x39, 0x72, + 0x80, 0x52, 0xff, 0x17, 0x15, 0xff, 0xff, 0xf2, 0x4f, 0x20, 0xf7, 0x8f, + 0x7c, 0xc9, 0xfb, 0x2b, 0x43, 0x55, 0x24, 0x89, 0x2f, 0x12, 0xf6, 0xbf, + 0xe1, 0x10, 0x6f, 0x16, 0x35, 0xf8, 0x09, 0x29, 0x44, 0x0c, 0x41, 0x25, + 0x04, 0x33, 0xff, 0xff, 0xfb, 0x0a, 0x8e, 0xa5, 0xff, 0x04, 0x2a, 0x43, + 0x66, 0x4f, 0x1b, 0x16, 0xf2, 0x07, 0x00, 0xf8, 0x0f, 0xff, 0x80, 0xaf, + 0xff, 0xff, 0xa1, 0x8c, 0x76, 0xff, 0x29, 0x61, 0x19, 0x69, 0xb4, 0xff, + 0x00, 0xf7, 0x6f, 0xf8, 0x8f, 0xff, 0xff, 0x44, 0x43, 0x10, 0x26, 0x26, + 0x24, 0x16, 0x10, 0xff, 0xb0, 0x8f, 0x01, 0xff, 0xf6, 0x0f, 0xff, 0xff, + 0xf3, 0x5f, 0x6e, 0x00, 0x50, 0x41, 0xbf, 0xff, 0xff, 0xf8, 0x0a, 0xff, + 0x00, 0xc8, 0xff, 0xfb, 0xbf, 0xf8, 0x8f, 0xff, 0xff, 0x01, 0x23, 0xdd, + 0xab, 0xb7, 0xe1, 0x07, 0xcf, 0x0b, 0x08, 0xb0, 0x26, 0x4b, 0x04, 0xb9, + 0x23, 0xff, 0xff, 0x31, 0xfb, 0x0b, 0x7b, 0x51, 0x81, 0xf1, 0x1f, 0x21, + 0x20, 0xc0, 0x6f, 0x85, 0xf1, 0x2f, 0xff, 0xff, 0xd8, 0x00, 0x23, 0x84, + 0x22, 0x34, 0x6a, 0xcb, 0xb9, 0x63, 0x0a, 0x16, 0xff, 0x40, 0xaf, 0x19, + 0xb0, 0xd9, 0x51, 0x84, 0x05, 0xff, 0xf2, 0x26, 0x12, 0x69, 0x81, 0x01, + 0x80, 0x3a, 0xff, 0xff, 0xf9, 0x00, 0x46, 0x44, 0x33, 0x00, 0x33, 0x7f, + 0xff, 0xd8, 0x53, 0x41, 0x01, 0x00, 0x04, 0x00, 0xbf, 0xff, 0xf5, 0x3f, + 0x19, 0xf5, 0x1f, 0x0c, 0xff, 0xff, 0xf1, 0x5f, 0x03, 0x9a, 0xf2, 0x03, + 0x00, 0x89, 0x51, 0x0f, 0xa0, 0x00, 0x4b, 0xff, 0xff, 0x01, 0xfc, 0x94, + 0x00, 0x9f, 0x97, 0x78, 0x9c, 0x33, 0x00, 0xf2, 0x35, 0xc5, 0x25, 0x0c, + 0xff, 0xff, 0x13, 0x83, 0x9a, 0x11, 0xff, 0xff, 0xfa, 0x1a, 0x53, 0x29, + 0x00, 0x22, 0xf4, 0x4b, 0x20, 0xa9, 0x3c, 0x40, 0x00, 0x02, 0x52, 0x01, + 0x22, 0x10, 0x00, 0x03, 0x56, 0xff, 0x00, 0x33, 0xcb, 0xf8, 0x1f, 0x41, + 0xff, 0xff, 0xe1, 0x41, 0xaf, 0x71, 0xf1, 0x1c, 0xff, 0xff, 0x44, 0x36, + 0x00, 0xf2, 0x10, 0x8f, 0x63, 0xf3, 0x00, 0x02, 0x08, 0x01, 0xff, 0x81, + 0x00, 0x00, 0x02, 0xc0, 0x4f, 0x4d, 0x00, 0xfa, 0x0b, 0x8c, 0xf6, 0x2f, + 0xf1, 0x6f, 0xff, 0x21, 0xf5, 0x3f, 0x7a, 0x40, 0x36, 0xab, 0x14, 0x3d, + 0x00, 0xff, 0xff, 0x93, 0x00, 0x00, 0x00, 0x02, 0x8b, 0x00, 0x2c, 0xfe, + 0xd6, 0x03, 0x90, 0x1c, 0xa9, 0x12, 0x20, 0x88, 0xdf, 0x3c, 0x24, 0xff, + 0xf6, 0x1f, 0xf3, 0x08, 0x0b, 0xff, 0xfa, 0x1f, 0x8a, 0xfd, 0x74, 0x33, + 0x60, 0x5f, 0x4c, 0x1a, 0xc7, 0x44, 0x59, 0xef, 0xf3, 0x00, 0x3f, 0xf4, + 0x04, 0x9f, 0xf0, 0x2b, 0xef, 0xc2, 0x10, 0x32, 0x13, 0xcf, 0x33, 0x61, + 0xff, 0xff, 0x34, 0x07, 0xdf, 0x24, 0xff, 0x65, 0x4a, 0x93, 0x6b, 0xb7, + 0x00, 0xff, 0xff, 0xfb, 0x31, 0xdf, 0xf2, 0x4f, 0xff, 0x01, 0xfa, 0x20, + 0x8f, 0xff, 0xfc, 0x20, 0x2f, 0x03, 0x00, 0xd0, 0x7f, 0xed, 0x74, 0x1a, + 0x83, 0x54, 0x70, 0x70, 0x3b, 0x03, 0x6b, 0xb7, 0xff, 0xfa, 0x13, 0x2a, + 0x00, 0xff, 0xf1, 0x9f, 0xff, 0xff, 0xc3, 0x1a, 0xff, 0x10, 0x90, 0x12, + 0x06, 0x6c, 0x0b, 0x44, 0x23, 0x30, 0x0e, 0x36, 0x22, 0x50, 0x0c, 0x93, + 0x6b, 0xb7, 0xff, 0x04, 0xf4, 0x0b, 0xff, 0xff, 0x51, 0x3a, 0x80, 0x6f, + 0x10, 0xb2, 0x02, 0xbb, 0x04, 0x61, 0x80, 0x11, 0xae, 0x0e, 0x70, 0x21, + 0x15, 0x8f, 0x94, 0x64, 0xa5, 0xfc, 0x04, 0x10, 0x12, 0xb5, 0xa9, 0x0a, + 0x3a, 0xfb, 0x22, 0x20, 0x35, 0x59, 0x05, 0xf5, 0x03, 0x53, 0xef, 0xa1, + 0x38, 0x91, 0x5f, 0x95, 0x5d, 0x24, 0xfa, 0x12, 0x00, 0x12, 0x10, 0x20, + 0x9f, 0x33, 0xf8, 0x7f, 0x06, 0xfe, 0x78, 0x9d, 0xda, 0x96, 0x56, 0x15, + 0x66, 0x82, 0x3c, 0xff, 0x37, 0x07, 0x77, 0x2f, 0x07, 0x07, 0x07, 0x07, + 0xc0, 0x07, 0x07, +}; + +const uint8_t g_pui8Image_Splash2[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x28, 0x28, 0x28, + 0x42, 0x42, 0x42, + 0x55, 0x55, 0x55, + 0x65, 0x65, 0x65, + 0x78, 0x78, 0x78, + 0x86, 0x86, 0x86, + 0x96, 0x96, 0x96, + 0xa6, 0xa6, 0xa6, + 0xbb, 0xbb, 0xbb, + 0xcf, 0xcf, 0xcf, + 0xe0, 0xe0, 0xe0, + 0xea, 0xea, 0xea, + 0xf2, 0xf2, 0xf2, + 0xf9, 0xf9, 0xf9, + 0xff, 0xff, 0xff, + + 0x1f, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xfe, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0xff, 0x1f, 0xff, 0xa5, 0xdf, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0x17, 0xff, 0x60, 0x8f, 0x03, 0xbb, 0x07, 0x07, 0x77, 0xcb, 0x2f, 0x02, + 0x52, 0x27, 0x03, 0x21, 0x07, 0x07, 0xe2, 0x77, 0x2f, 0x02, 0x54, 0xf1, + 0x7f, 0x01, 0xf8, 0x3e, 0x03, 0xef, 0x07, 0x07, 0x77, 0x2f, 0x01, 0x62, + 0x23, 0xfa, 0x1b, 0x01, 0xe1, 0x85, 0xaf, 0x07, 0x07, 0x80, 0x75, 0xc6, + 0x67, 0xd7, 0x34, 0x77, 0x69, 0xff, 0x08, 0xff, 0xa9, 0xaa, 0xcf, 0x01, + 0x72, 0xff, 0x62, 0x8e, 0x01, 0x24, 0xf3, 0x9f, 0x07, 0xbf, 0x74, 0xa4, + 0x00, 0x14, 0x63, 0x03, 0x88, 0x14, 0x64, 0x47, 0x41, 0x00, 0x23, 0x33, + 0x22, 0x57, 0x9b, 0xff, 0x92, 0xff, 0x01, 0xf2, 0x7f, 0xff, 0xf8, 0x1f, + 0xf3, 0x9f, 0x06, 0xc0, 0xc6, 0x85, 0xb1, 0x21, 0x9f, 0xfd, 0xae, 0xf6, + 0x00, 0x3f, 0xff, 0x30, 0x49, 0xff, 0xff, 0xf9, 0x43, 0x00, 0x33, 0x34, + 0x41, 0xdf, 0xf8, 0x3f, 0xff, 0xf2, 0x1c, 0x7f, 0xd2, 0xbf, 0x05, 0xcd, + 0x96, 0xb8, 0x05, 0x00, 0xf5, 0x5f, 0xf7, 0xbf, 0xf3, 0x5f, 0xf8, 0x1e, + 0x80, 0x85, 0x51, 0x8f, 0xfc, 0x2c, 0xff, 0xb2, 0xef, 0x70, 0x82, 0x05, + 0xcd, 0x95, 0xf9, 0x43, 0x33, 0x7f, 0x00, 0xf7, 0x2f, 0xf1, 0x8f, 0xf2, + 0x8f, 0xf3, 0x8f, 0x80, 0x05, 0xf8, 0x1f, 0xff, 0x29, 0xff, 0x83, 0xff, + 0x70, 0x34, 0x8d, 0x55, 0x1c, 0xf7, 0x23, 0x6a, 0xfd, 0x00, 0x6f, 0xff, + 0x2a, 0xf2, 0x6f, 0xf2, 0x9f, 0xba, 0x80, 0x07, 0x26, 0xff, 0x31, 0xbf, + 0x73, 0xfb, 0x1b, 0xc2, 0x87, 0x3f, 0xff, 0xfb, 0x21, 0x9f, 0x0a, 0x35, + 0x04, 0xf3, 0x4f, 0xf2, 0xaf, 0x2a, 0x07, 0xa1, 0xef, 0x06, 0x61, 0x2a, + 0x73, 0xf3, 0x3f, 0x87, 0x3f, 0xff, 0x20, 0x70, 0x6f, 0x01, 0x53, 0xff, + 0x82, 0xf7, 0x2f, 0x20, 0xf3, 0xd9, 0x07, 0xff, 0xf3, 0x4f, 0x84, 0xf6, + 0x19, 0x08, 0xf1, 0xaf, 0x87, 0x3f, 0xc3, 0x1a, 0x02, 0x00, 0xa1, 0xef, + 0xb1, 0xfa, 0x1f, 0xf2, 0xf5, 0x3f, 0x81, 0x07, 0xfa, 0x2e, 0xf3, 0x57, + 0x1f, 0x73, 0x8f, 0x90, 0x47, 0xfa, 0x05, 0x03, 0xf3, 0x8f, 0xf2, 0x9f, + 0x08, 0x1d, 0xe2, 0xf3, 0x5f, 0x07, 0xff, 0x45, 0xfe, 0x19, 0x78, 0xcf, + 0x46, 0x8f, 0x47, 0x90, 0x9f, 0x03, 0x00, 0xf6, 0x3f, 0xf4, 0x5f, 0x2a, + 0xd3, 0xf3, 0x8f, 0x15, 0xff, 0xff, 0x99, 0x05, 0x92, 0x01, 0x65, 0xa5, + 0xc8, 0x6d, 0x31, 0xfa, 0x09, 0xc5, 0x2d, 0xf7, 0x3f, 0x01, 0x38, 0xd2, + 0xf2, 0x9f, 0xff, 0xff, 0x89, 0x05, 0x4c, 0x52, 0x01, 0xc2, 0xbf, 0x9d, + 0x65, 0xff, 0xff, 0x20, 0xf1, 0x7f, 0x0d, 0x28, 0xfa, 0x2f, 0x47, 0xd3, + 0x42, 0xe2, 0x06, 0xba, 0xff, 0xfa, 0x1c, 0x01, 0xf3, 0x62, 0x3f, 0x15, + 0x4d, 0xff, 0xff, 0x62, 0x7e, 0x64, 0x00, 0xfe, 0x1f, 0x56, 0xd3, 0xd2, + 0xcf, 0xfa, 0x8f, 0x84, 0x03, 0xa7, 0xff, 0xf2, 0x5f, 0x01, 0xfe, 0x19, + 0xc2, 0x0e, 0x53, 0xba, 0xff, 0xff, 0x1a, 0x7e, 0xa2, 0x00, 0xff, 0x2a, + 0x75, 0xd4, 0xc2, 0xcf, 0xfa, 0x8f, 0xac, 0x05, 0x71, 0x3b, 0x52, 0x0e, + 0x53, 0x60, 0xaf, 0x20, 0xf8, 0x3f, 0x7e, 0xf3, 0x7f, 0x47, 0x94, 0xc4, + 0x00, 0xb2, 0xef, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0x97, 0x93, 0x01, 0x30, + 0x7f, 0x32, 0xf2, 0x9f, 0x06, 0x92, 0x08, 0x80, 0x3f, 0xf5, 0x6f, 0x86, + 0xf5, 0x3f, 0x75, 0x10, 0xb2, 0xb4, 0xb2, 0x11, 0xfc, 0x7e, 0xff, 0xcb, + 0x04, 0xff, 0xa9, 0xf8, 0x37, 0x9f, 0x32, 0xf7, 0x1f, 0xc2, 0x06, 0x92, + 0xa0, 0x2f, 0xf3, 0xaf, 0x86, 0xfa, 0x04, 0x2f, 0x94, 0xd3, 0x84, 0xb3, + 0x16, 0xa8, 0xf4, 0x2c, 0x6f, 0xbf, 0x33, 0x18, 0x06, 0x32, 0x91, 0x2e, + 0x40, 0x92, 0x8f, 0xff, 0x7e, 0xb3, 0xd3, 0x66, 0xa3, 0x80, 0x17, 0xf3, + 0xa5, 0x5f, 0xff, 0xff, 0xf8, 0x49, 0x31, 0xff, 0x82, 0x07, 0x29, 0x70, + 0x1f, 0x54, 0x8f, 0x02, 0xff, 0x95, 0xf3, 0xc4, 0x46, 0xb3, 0x17, 0xf4, + 0x00, 0x77, 0x4f, 0xff, 0xff, 0x22, 0x99, 0xff, 0xf2, 0x41, 0x9f, 0x6f, + 0xff, 0xff, 0x41, 0x1f, 0x46, 0x05, 0x00, 0xf7, 0xbf, 0xff, 0xa2, 0xf3, + 0x95, 0x36, 0xf2, 0x40, 0xcf, 0x12, 0xa9, 0xff, 0xff, 0xba, 0xf7, 0x02, + 0x00, 0x4f, 0xff, 0xfb, 0x49, 0x7e, 0xff, 0xf3, 0x6f, 0xc2, 0x03, 0xdb, + 0xff, 0x12, 0x4f, 0x36, 0x01, 0xf9, 0x00, 0xaf, 0xfb, 0x9f, 0xf8, 0xcc, + 0xbf, 0xf2, 0xb5, 0x00, 0x86, 0x45, 0xf3, 0xaf, 0xff, 0xff, 0x8b, 0xff, + 0x00, 0x87, 0xff, 0xff, 0xa7, 0xf9, 0x00, 0x1f, 0xff, 0x00, 0xff, 0xf2, + 0x09, 0xff, 0xf5, 0x3f, 0xff, 0xff, 0x61, 0xff, 0xe9, 0xd2, 0xf9, 0x21, + 0x3f, 0x36, 0xca, 0x00, 0xaf, 0xfb, 0x7f, 0xff, 0xf8, 0x8f, 0xf4, 0x86, + 0x01, 0x88, 0x25, 0xf3, 0x8f, 0xff, 0xff, 0x9b, 0x03, 0x00, 0xfb, 0x00, + 0x04, 0xff, 0xff, 0xfa, 0xa3, 0x6f, 0x30, 0xf8, 0x2f, 0x8b, 0x63, 0xf7, + 0x12, 0x5f, 0x44, 0x80, 0x94, 0xfd, 0xdf, 0xac, 0xff, 0xf6, 0x77, 0x6a, + 0x10, 0x34, 0xf5, 0x6f, 0x16, 0xfd, 0x46, 0x00, 0x1a, 0x02, 0xff, 0x59, + 0xb0, 0xaf, 0xfc, 0x2c, 0x76, 0xff, 0x00, 0xff, 0xf5, 0x10, 0x9f, 0x63, + 0xff, 0xff, 0xd9, 0x00, 0xff, 0xfb, 0xaf, 0xf7, 0x8f, 0x59, 0xff, 0xf9, + 0x00, 0x46, 0x5b, 0x34, 0xd8, 0x5f, 0xff, 0xf8, 0xaf, 0x10, 0xff, 0xff, + 0xbb, 0x01, 0x3d, 0x90, 0x00, 0x4f, 0x07, 0x82, 0x29, 0xff, 0xff, 0x28, + 0xa1, 0x89, 0xd2, 0x00, 0xf5, 0x21, 0x9f, 0xc2, 0xbf, 0xff, 0xd9, 0xff, + 0x00, 0xfa, 0x8f, 0xfe, 0xdf, 0xff, 0xff, 0xfb, 0x46, 0x02, 0x5b, 0x44, + 0x9c, 0x6f, 0xff, 0xfb, 0xa9, 0x98, 0x00, 0xf9, 0x9f, 0xff, 0x2c, 0x42, + 0x32, 0x21, 0xff, 0x0c, 0xff, 0xff, 0xff, 0x35, 0xda, 0xba, 0xff, 0xff, + 0x05, 0xf7, 0x00, 0x7f, 0xf4, 0x4f, 0xbb, 0xaf, 0x32, 0x04, 0x44, 0x5b, + 0x64, 0x5f, 0x3f, 0x14, 0xf8, 0x9f, 0x02, 0xfa, 0x44, 0x1f, 0x73, 0xf2, + 0x1f, 0x19, 0x53, 0xc0, 0x74, 0x42, 0xf7, 0x35, 0x3f, 0xfc, 0x19, 0xff, + 0x00, 0xfe, 0xef, 0xff, 0xfc, 0xcf, 0x99, 0xfb, 0xaf, 0x00, 0xff, 0x34, + 0x8f, 0xf7, 0x2f, 0x27, 0xff, 0xfc, 0x10, 0x8e, 0xff, 0xab, 0x01, 0xf3, + 0x03, 0xbf, 0x17, 0x2e, 0xff, 0x12, 0xb9, 0x91, 0x99, 0x81, 0xd2, 0xfa, + 0x00, 0x22, 0x1f, 0xff, 0x70, 0xcf, 0xf8, 0x9f, 0xff, 0x00, 0xbc, 0xee, + 0xbb, 0xf9, 0x8f, 0xff, 0x88, 0xa7, 0x00, 0x7b, 0x18, 0x72, 0xff, 0xfd, + 0xaf, 0xff, 0x89, 0x80, 0x01, 0x90, 0x13, 0xe6, 0x1f, 0xff, 0xf1, 0x3f, + 0x0e, 0xff, 0xff, 0xf2, 0x9f, 0x91, 0x79, 0x61, 0xfc, 0x00, 0x04, 0x19, + 0xff, 0xf5, 0x0c, 0xfe, 0xef, 0xff, 0x00, 0x9a, 0x99, 0xf9, 0xdf, 0xff, + 0xff, 0x62, 0x45, 0x08, 0x46, 0xa5, 0xc3, 0x0c, 0x14, 0xf5, 0x00, 0x06, + 0x05, 0x50, 0xbf, 0xff, 0xfd, 0x09, 0xb1, 0x3f, 0x74, 0x81, 0x42, 0x38, + 0x90, 0xdf, 0xff, 0x71, 0xef, 0x02, 0x00, 0xe7, 0xbf, 0xff, 0xf7, 0x0c, + 0xff, 0xff, 0xf9, 0x00, 0x23, 0x61, 0x59, 0xbb, 0xce, 0xcd, 0xfe, 0x74, + 0x0a, 0x20, 0x00, 0x00, 0x2f, 0x41, 0x81, 0x19, 0x17, 0xc0, 0x02, 0xe2, + 0xff, 0xff, 0x90, 0x55, 0x0b, 0xff, 0x20, 0x90, 0x07, 0x85, 0x50, 0x35, + 0x43, 0x32, 0x12, 0x00, 0x8f, 0xfd, 0x64, 0x65, 0x54, 0x45, 0x34, 0x34, + 0x00, 0x94, 0x03, 0x69, 0x13, 0x7c, 0xff, 0xff, 0xf2, 0x06, 0x2f, 0xff, + 0xff, 0xa1, 0xcf, 0x04, 0xd1, 0xf1, 0x00, 0x0f, 0x80, 0x51, 0x45, 0x00, + 0x17, 0xbe, 0xef, 0x00, 0xff, 0xfd, 0xa7, 0x61, 0x0c, 0xf8, 0x66, 0x78, + 0x40, 0xdf, 0x2a, 0xfc, 0xff, 0x17, 0xff, 0xf2, 0x3c, 0x04, 0x4a, 0xb5, + 0x32, 0x4a, 0xff, 0xb1, 0xff, 0xf4, 0x60, 0x2f, 0x5a, 0x3a, 0xff, 0xfc, + 0x00, 0x34, 0xc2, 0x00, 0x67, 0x00, 0x00, 0x10, 0x11, 0x22, 0x33, 0x24, + 0x40, 0x23, 0x57, 0xff, 0xff, 0x26, 0xff, 0xf2, 0x01, 0x00, 0xb8, 0xcf, + 0xff, 0x10, 0x9f, 0xff, 0x90, 0xaf, 0x10, 0xff, 0xff, 0x19, 0x37, 0xff, + 0xb0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x3f, 0x67, + 0x80, 0x1a, 0x43, 0xff, 0xf2, 0x75, 0x15, 0xdf, 0xb8, 0x06, 0x70, 0x0a, + 0xff, 0xf8, 0x08, 0x92, 0x1f, 0xfd, 0x00, 0x52, 0x11, 0x41, 0x00, 0x02, + 0x33, 0xe8, 0xab, 0x40, 0x06, 0x67, 0xff, 0xff, 0xfe, 0xff, 0x71, 0xff, + 0x00, 0xf3, 0x2f, 0xa2, 0x23, 0xa4, 0x31, 0x0b, 0xff, 0x06, 0xff, 0x91, + 0x26, 0xa5, 0x19, 0x27, 0x02, 0xf1, 0x01, 0x04, 0x24, 0x91, 0xff, 0xff, + 0xa0, 0x8f, 0x5f, 0x00, 0xff, 0xfe, 0xff, 0xb1, 0xaf, 0xff, 0x12, 0xcf, + 0x08, 0xf6, 0x13, 0x00, 0x7f, 0x01, 0x93, 0x23, 0xbf, 0xc0, 0x2f, 0x02, + 0x60, 0xbf, 0x38, 0xf2, 0x0d, 0xff, 0x30, 0xf9, 0x09, 0x5f, 0x11, 0xf2, + 0x3f, 0xff, 0xe2, 0x0c, 0x12, 0x9f, 0xb3, 0x5f, 0x67, 0x1f, 0xff, 0xff, + 0x00, 0x14, 0xf8, 0x3f, 0xff, 0x50, 0x8f, 0xff, 0x61, 0x20, 0x11, 0x2a, + 0x17, 0xff, 0xfb, 0x1a, 0xfa, 0x9c, 0x38, 0x44, 0x07, 0x87, 0x3f, 0x01, + 0xf9, 0x1f, 0xf1, 0x00, 0x2f, 0xff, 0xfa, 0x06, 0xff, 0xfc, 0x30, 0x0a, + 0x80, 0x07, 0xff, 0xff, 0x50, 0xae, 0x25, 0x30, 0x19, 0xe0, 0x87, 0x3f, + 0x01, 0xfa, 0x0b, 0xa2, 0x10, 0x9f, 0x02, 0xff, 0x90, 0x9f, 0xf8, 0x12, + 0x05, 0x07, 0xff, 0x03, 0xff, 0xf8, 0x33, 0x30, 0x56, 0xcf, 0x87, 0x3f, + 0x80, 0x02, 0x06, 0xf2, 0x40, 0x1f, 0xff, 0xf7, 0x06, 0x19, 0x3b, 0x90, + 0x2e, 0x07, 0x01, 0xfc, 0x89, 0x97, 0xc0, 0x4f, 0x04, 0x70, 0x96, 0x10, + 0x2f, 0xff, 0xff, 0x0f, 0x60, 0x01, 0x71, 0x5f, 0x07, 0x07, 0x77, 0x2f, + 0x00, 0xff, 0xff, 0xf9, 0x36, 0x42, 0xaf, 0xff, 0xff, 0x1e, 0xfa, 0xce, + 0x89, 0x07, 0x07, 0x77, 0x2f, +}; + +const uint8_t g_pui8Image_Splash3[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x2a, 0x2a, 0x2a, + 0x44, 0x44, 0x44, + 0x56, 0x56, 0x56, + 0x67, 0x67, 0x67, + 0x76, 0x76, 0x76, + 0x87, 0x87, 0x87, + 0x97, 0x97, 0x97, + 0xa5, 0xa5, 0xa5, + 0xb7, 0xb7, 0xb7, + 0xc8, 0xc8, 0xc8, + 0xd6, 0xd6, 0xd6, + 0xe2, 0xe2, 0xe2, + 0xec, 0xec, 0xec, + 0xf7, 0xf7, 0xf7, + 0xff, 0xff, 0xff, + + 0x1f, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x02, 0x3e, 0xfb, 0x4e, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xff, + 0x3e, 0xf9, 0x05, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xff, 0x1f, 0xf5, 0x11, + 0xbf, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x1f, 0xf1, 0x84, 0x3f, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0x1e, 0xf1, 0xba, 0x1e, 0x07, 0x07, 0x77, 0x29, 0xdc, + 0x08, 0xd9, 0x77, 0xca, 0x8c, 0x07, 0xff, 0xc1, 0xdf, 0x4e, 0x18, 0x02, + 0xfe, 0xcf, 0x6f, 0x27, 0x03, 0x61, 0x00, 0x31, 0x03, 0x34, 0x01, 0x32, + 0x27, 0xf9, 0x33, 0x08, 0x33, 0x33, 0x12, 0x4b, 0x01, 0xa1, 0xff, 0x24, + 0x8e, 0x01, 0xfa, 0x41, 0x1f, 0x05, 0xcd, 0x95, 0xfe, 0x00, 0x61, 0x08, + 0xf8, 0x1f, 0xff, 0x08, 0xff, 0xa1, 0x00, 0x01, 0x59, 0xab, 0x96, 0x65, + 0x20, 0x13, 0x7f, 0x00, 0xff, 0x92, 0xff, 0x51, 0xff, 0xff, 0xfb, 0x11, + 0x38, 0x72, 0x3f, 0x03, 0xdb, 0xb7, 0xfd, 0x75, 0x31, 0x00, 0x27, 0x9f, + 0xfc, 0x8f, 0xfa, 0x2d, 0xff, 0xa1, 0x40, 0x5f, 0x0a, 0xfe, 0x94, 0x11, + 0x3e, 0xc2, 0xef, 0x01, 0x61, 0xff, 0xff, 0x80, 0x5f, 0xe1, 0xaf, 0x7a, + 0xc0, 0x5a, 0xc6, 0xff, 0xff, 0xe6, 0x22, 0x25, 0x14, 0x00, 0xfe, 0xcf, + 0xf9, 0x6f, 0xfe, 0xef, 0xfa, 0x09, 0x80, 0x15, 0xf9, 0x20, 0x32, 0xdf, + 0x51, 0xff, 0xf8, 0x1c, 0x09, 0xff, 0x22, 0x7d, 0x45, 0x0a, 0xc3, 0x02, + 0x00, 0x7d, 0xff, 0xbc, 0xfe, 0x18, 0xf9, 0x1f, 0xf6, 0x10, 0x8f, 0xfb, + 0xaf, 0x0e, 0xfc, 0x10, 0xcf, 0x33, 0x06, 0xff, 0xa0, 0x9f, 0xf7, 0x0e, + 0x7e, 0x3e, 0xff, 0x00, 0xf4, 0x02, 0xbf, 0xff, 0xfe, 0x1a, 0xff, 0x32, + 0x08, 0xfb, 0x1b, 0xf3, 0x6f, 0x1f, 0xff, 0xff, 0xf2, 0x01, 0x7f, 0x24, + 0xff, 0x14, 0xff, 0x90, 0x9f, 0x6f, 0x88, 0x25, 0xfa, 0x01, 0xcf, 0x01, + 0x41, 0xff, 0x81, 0x08, 0xff, 0x17, 0xf2, 0x7f, 0x1f, 0xff, 0xff, 0xf4, + 0x03, 0x2f, 0x30, 0xda, 0x0f, 0xf6, 0x07, 0x77, 0x2e, 0x20, 0x60, 0x7f, + 0x02, 0xe1, 0x8f, 0xd1, 0xbf, 0x34, 0x20, 0xf1, 0x8f, 0x17, 0xff, 0xff, + 0xfb, 0x1f, 0x60, 0x0c, 0x00, 0x9f, 0x10, 0xaf, 0x77, 0x2d, 0xf5, 0x0b, + 0x81, 0x03, 0xf3, 0x2f, 0xf2, 0x6f, 0x44, 0xf1, 0x17, 0x83, 0x02, 0x34, + 0xf5, 0x37, 0xf1, 0x2f, 0x7f, 0x36, 0x20, 0x50, 0xcf, 0x03, 0xfa, 0x1c, + 0xf4, 0x3f, 0x53, 0x02, 0xf1, 0xbf, 0x39, 0xff, 0xfb, 0x8f, 0x05, 0xfe, + 0x0e, 0x05, 0xff, 0xff, 0x51, 0xa5, 0x6d, 0x31, 0xfa, 0x40, 0x0a, 0x0d, + 0x24, 0xf8, 0x1f, 0x73, 0xd1, 0xed, 0x08, 0x1c, 0xff, 0xfb, 0x7f, 0x05, + 0xf1, 0x1f, 0xff, 0x1d, 0xff, 0xb0, 0xaf, 0x15, 0x65, 0x51, 0x5f, 0x0d, + 0x01, 0x71, 0xfc, 0x1e, 0xa2, 0xb1, 0xf8, 0x1f, 0x05, 0x0b, 0xee, 0xff, + 0xff, 0x21, 0x01, 0xf4, 0x86, 0x4d, 0x10, 0xff, 0xff, 0x61, 0x7e, 0xe1, + 0x9f, 0x19, 0xe1, 0x04, 0x92, 0xf6, 0x2f, 0xe8, 0xef, 0x02, 0xfe, 0x4b, + 0x16, 0xff, 0xf8, 0x0d, 0x02, 0x07, 0x0e, 0xc6, 0x18, 0xa0, 0x0a, 0xb6, + 0x29, 0xf3, 0x4f, 0x26, 0xf2, 0x71, 0x00, 0xf4, 0x3f, 0xd8, 0xef, 0xff, + 0xf5, 0x9f, 0xff, 0x04, 0xfe, 0xcf, 0xff, 0xf1, 0x7f, 0x02, 0x90, 0xef, + 0xe4, 0x02, 0xb2, 0xc4, 0xf9, 0x1e, 0x52, 0xdc, 0xff, 0x00, 0xfc, 0xaf, + 0xf8, 0x2f, 0x53, 0xf2, 0x52, 0xf4, 0x4a, 0x5f, 0x09, 0xfa, 0xdf, 0x02, + 0x81, 0x03, 0xf1, 0x72, 0x4f, 0xcb, 0xa3, 0x52, 0xf4, 0x2f, 0x84, 0xf9, + 0x00, 0x7f, 0xfe, 0x1c, 0x92, 0xf2, 0x52, 0xf3, 0x6f, 0xa6, 0x0f, 0x22, + 0x03, 0xf8, 0x1e, 0x7f, 0x33, 0xf1, 0x10, 0x7f, 0xff, 0x69, 0x75, 0x25, + 0xe2, 0xf3, 0x22, 0x27, 0xf3, 0x7f, 0x0f, 0x16, 0xaf, 0xcc, 0x7f, 0x33, + 0x08, 0xa1, 0xdf, 0xff, 0xbd, 0x75, 0x62, 0xf2, 0xf4, 0x00, 0x13, 0xf2, + 0x7f, 0xff, 0xfc, 0xdf, 0xff, 0xfa, 0x00, 0xaf, 0xff, 0xff, 0xfc, 0x29, + 0x4f, 0xff, 0xff, 0x0d, 0xfe, 0xbe, 0xff, 0x51, 0x15, 0xcd, 0x71, 0x8a, + 0x40, 0xa5, 0x63, 0xb1, 0xe2, 0xb6, 0x13, 0xd2, 0x8f, 0x00, 0xff, 0xf7, + 0x9f, 0xff, 0xf9, 0x8f, 0xfe, 0x6c, 0x00, 0xfa, 0x2a, 0x3f, 0xff, 0xff, + 0x91, 0x14, 0xff, 0x3a, 0xa1, 0xcf, 0x1b, 0xdb, 0xb1, 0x61, 0x92, 0xdb, + 0x00, 0xff, 0xff, 0xd6, 0xef, 0xff, 0xf2, 0xb4, 0x87, 0x10, 0x23, 0xd2, + 0x7f, 0x14, 0xfe, 0xad, 0xfa, 0x2c, 0x00, 0x1b, 0xff, 0xff, 0x45, 0xfb, + 0xef, 0xf1, 0x6f, 0xc1, 0x74, 0x44, 0xff, 0x52, 0xff, 0xff, 0xda, 0x7a, + 0x82, 0xd9, 0xf3, 0x86, 0x68, 0x13, 0xe3, 0x17, 0xfd, 0x00, 0x17, 0x36, + 0xff, 0xff, 0xf7, 0x17, 0xff, 0xf4, 0x61, 0x2f, 0x76, 0x33, 0x32, 0xff, + 0xe9, 0xa7, 0x7d, 0x02, 0xf5, 0x58, 0x47, 0x23, 0xc4, 0x4f, 0x17, 0x10, + 0x00, 0x42, 0xef, 0xff, 0xb9, 0xf9, 0x5f, 0xf8, 0x1f, 0xc2, 0x77, 0x2a, + 0x32, 0xff, 0xd6, 0xef, 0x01, 0x66, 0x00, 0xff, 0xda, 0xef, 0xf9, 0x28, + 0x46, 0x44, 0x97, 0x40, 0x2f, 0x11, 0xfd, 0xdf, 0xff, 0xfc, 0x6e, 0xff, + 0x00, 0x20, 0x21, 0x1f, 0xff, 0x82, 0x60, 0x4f, 0xfc, 0x72, 0x1a, 0x09, + 0x59, 0xd4, 0xff, 0x91, 0x01, 0xfe, 0x00, 0xff, 0xff, 0xcc, 0xff, 0xb6, + 0xff, 0xfd, 0x26, 0x08, 0x47, 0x45, 0x79, 0x1f, 0x11, 0xf8, 0x9f, 0xff, + 0x00, 0xfc, 0x7f, 0xff, 0x22, 0x10, 0x00, 0x8f, 0xf9, 0x0d, 0x5a, 0xff, + 0xff, 0x17, 0x71, 0x59, 0xba, 0xcc, 0x04, 0xd1, 0xaf, 0xff, 0xff, 0xa6, + 0x74, 0xff, 0x26, 0x00, 0x47, 0x56, 0x4d, 0x1c, 0xff, 0xfe, 0x7d, 0xff, + 0x20, 0xff, 0xbd, 0x19, 0x18, 0x40, 0x11, 0x13, 0xdf, 0xa4, 0x31, 0x23, + 0x14, 0x50, 0x9f, 0xc3, 0xf2, 0x3f, 0x10, 0xff, 0xff, 0xed, 0x74, 0xff, + 0x26, 0x44, 0x5a, 0x00, 0x2f, 0x18, 0xff, 0xff, 0xbf, 0xda, 0xff, 0x79, + 0x00, 0xff, 0xff, 0xfd, 0x28, 0x14, 0x94, 0xf5, 0x09, 0xa0, 0x31, 0x61, + 0x14, 0xa0, 0x05, 0xba, 0xb8, 0x9f, 0x10, 0xff, 0xff, 0xfb, 0x6a, 0xf8, + 0x7f, 0xfe, 0x9e, 0x82, 0x31, 0x25, 0x45, 0x8f, 0x5d, 0x53, 0x11, 0xb7, + 0x80, 0x02, 0xf6, 0x39, 0x08, 0x56, 0xff, 0x60, 0xcf, 0x08, 0xff, 0xff, + 0xb1, 0xbf, 0x8a, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x02, 0x51, 0x9f, 0xff, + 0xff, 0x50, 0xff, 0x02, 0xff, 0x87, 0xfc, 0xcf, 0xfd, 0x6e, 0x59, 0x79, + 0x04, 0xfb, 0x8f, 0x52, 0x80, 0xcf, 0x13, 0xff, 0xff, 0x01, 0xf1, 0x10, + 0x24, 0x2f, 0xff, 0xf5, 0x0f, 0xb9, 0x40, 0x5f, 0x74, 0xb7, 0x56, 0x12, + 0x72, 0x04, 0xff, 0x04, 0xff, 0xf2, 0x2f, 0xff, 0xaa, 0x7c, 0xff, 0xb4, + 0x04, 0x22, 0x02, 0x44, 0x71, 0x09, 0x9d, 0x40, 0x00, 0x00, 0x22, 0xdf, + 0xff, 0xff, 0x13, 0xff, 0xff, 0xfa, 0x40, 0x0c, 0x0d, 0xff, 0xf9, 0x01, + 0xf1, 0x3f, 0xff, 0x20, 0xf9, 0x04, 0x8e, 0xfa, 0x07, 0xbe, 0xfd, 0xab, + 0x08, 0x32, 0x41, 0x24, 0xaf, 0x01, 0xfe, 0x81, 0x00, 0x2a, 0x00, 0x3d, + 0x39, 0xb1, 0x99, 0x22, 0x05, 0xff, 0x00, 0xff, 0xf2, 0x37, 0x04, 0xfb, + 0x30, 0x61, 0x1b, 0x80, 0x85, 0xf1, 0x05, 0x66, 0x43, 0x11, 0x4e, 0xff, + 0x00, 0xa5, 0x22, 0x24, 0x46, 0x75, 0x30, 0x00, 0x01, 0x20, 0xa3, 0x5f, + 0x41, 0xf4, 0x1f, 0xff, 0xff, 0xd1, 0x60, 0x9f, 0x04, 0x89, 0x20, 0x43, + 0x11, 0x72, 0x31, 0x20, 0x00, 0x3a, 0x83, 0xd6, 0x02, 0xe6, 0x43, 0x35, + 0x40, 0xaf, 0x29, 0xfa, 0x54, 0x41, 0x00, 0x02, 0x10, 0x10, 0x2f, 0xfb, + 0x1c, 0x4a, 0x06, 0xff, 0xff, 0xf5, 0x60, 0x1f, 0x03, 0x92, 0xf5, 0x01, + 0x01, 0x30, 0x00, 0x00, 0x3c, 0x10, 0x12, 0x22, 0x12, 0x11, 0x32, 0x22, + 0x40, 0x8f, 0x4f, 0xf5, 0x00, 0x7f, 0x35, 0x3d, 0xff, 0x41, 0x23, 0x82, + 0xb0, 0x9f, 0xff, 0xff, 0x18, 0x3f, 0x00, 0xff, 0xa2, 0x00, 0x00, 0x28, + 0xf9, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x09, 0xdf, 0x57, 0xff, 0xe1, + 0x00, 0x05, 0xf9, 0x1f, 0x61, 0xff, 0xe1, 0x14, 0x6c, 0x01, 0xff, 0xff, + 0xf7, 0x0d, 0xff, 0xff, 0x62, 0x37, 0x80, 0x03, 0xf3, 0x03, 0x10, 0x00, + 0x9f, 0xff, 0x15, 0x80, 0x5f, 0xff, 0xfd, 0x00, 0x7f, 0xf1, 0x6f, 0xf1, + 0x00, 0x7f, 0xfc, 0x67, 0x21, 0x4f, 0xff, 0xff, 0x71, 0x18, 0x58, 0x74, + 0x12, 0x2f, 0x03, 0x20, 0x7f, 0xf0, 0x04, 0x59, 0x16, 0xff, 0xc0, 0x9f, + 0x57, 0xf2, 0x3f, 0x00, 0xff, 0x12, 0xff, 0xfb, 0x08, 0xff, 0xfd, 0x30, + 0x01, 0x1e, 0xff, 0xff, 0xfa, 0x43, 0x44, 0x8f, 0x37, 0x90, 0x02, 0xe1, + 0x06, 0x11, 0xc0, 0x3f, 0xf7, 0x04, 0x40, 0xef, 0x4e, 0xb1, 0xdf, 0xe1, + 0x0c, 0xff, 0xff, 0x07, 0xa1, 0x25, 0x51, 0x00, 0x3f, 0x6e, 0x2e, 0x01, + 0x00, 0x14, 0xff, 0xf0, 0x2f, 0xff, 0xfc, 0x09, 0xff, 0x20, 0x80, 0x06, + 0x1e, 0x80, 0x25, 0x00, 0x8f, 0xff, 0x03, 0xff, 0xfd, 0x77, 0x65, 0x06, + 0xdf, 0x6e, 0x2e, 0x02, 0xff, 0xff, 0xfe, 0x1b, 0xb4, 0x05, 0x51, 0x60, + 0x08, 0x9f, 0x80, 0x01, 0xef, 0x15, 0x50, 0x00, 0x18, 0xb8, 0x04, 0xed, + 0x7d, 0x45, 0x0c, 0x41, 0x21, 0x07, 0x84, 0x11, 0xf8, 0x02, 0x10, 0x0a, + 0x16, 0xed, 0x8d, 0xe1, 0x07, 0xbf, 0x77, 0xff, 0xb0, 0x00, 0x05, 0x0a, + 0x1e, 0xf6, 0x22, 0xcf, 0x07, 0x07, 0x77, 0x2f, 0xff, 0x0f, 0xff, 0xf9, + 0x45, 0xbf, 0x07, 0x07, 0x77, 0x2f, 0xfc, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, +}; + +const uint8_t g_pui8Image_Splash4[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x29, 0x29, 0x29, + 0x42, 0x42, 0x42, + 0x55, 0x55, 0x55, + 0x66, 0x66, 0x66, + 0x77, 0x77, 0x77, + 0x88, 0x88, 0x88, + 0x98, 0x98, 0x98, + 0xa5, 0xa5, 0xa5, + 0xb4, 0xb4, 0xb4, + 0xc6, 0xc6, 0xc6, + 0xd8, 0xd8, 0xd8, + 0xe6, 0xe6, 0xe6, + 0xf1, 0xf1, 0xf1, + 0xfa, 0xfa, 0xfa, + 0xff, 0xff, 0xff, + + 0x1f, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xe7, 0x07, 0x07, 0x01, 0xfc, 0xaf, + 0x07, 0x07, 0x77, 0xc7, 0x2f, 0x07, 0xff, 0xf3, 0x0d, 0x07, 0x07, 0x77, + 0xc7, 0x2f, 0x07, 0xff, 0xa1, 0x17, 0x07, 0x07, 0x77, 0xc7, 0x2f, 0x07, + 0xff, 0x45, 0x72, 0x07, 0x07, 0x77, 0xc7, 0x2f, 0x07, 0xff, 0x28, 0xb1, + 0x07, 0x07, 0x77, 0x88, 0x2a, 0xed, 0xff, 0xef, 0x07, 0xff, 0xff, 0xfc, + 0x1c, 0x1b, 0xe1, 0xbf, 0x07, 0x47, 0x07, 0xfd, 0x55, 0x00, 0x42, 0x12, + 0x22, 0x11, 0x18, 0xff, 0xfc, 0xab, 0x21, 0x9a, 0xce, 0x03, 0xf7, 0x1f, + 0xd1, 0xaf, 0x01, 0x70, 0xa8, 0x05, 0xcd, 0x96, 0xb6, 0x50, 0x24, 0x05, + 0x00, 0xcf, 0x51, 0xca, 0x51, 0x54, 0x12, 0x23, 0x33, 0x10, 0x33, 0x33, + 0x5b, 0x01, 0xf4, 0x2f, 0xe1, 0xaf, 0x0e, 0xff, 0xff, 0x83, 0x01, 0x04, + 0xd4, 0xa7, 0xd2, 0x00, 0x03, 0x59, 0xff, 0x6b, 0xff, 0x6a, 0xff, 0xff, + 0x00, 0x10, 0x6e, 0xff, 0xff, 0xdc, 0xb7, 0x31, 0x19, 0x00, 0xff, 0xff, + 0xf2, 0x4f, 0xd1, 0xaf, 0xff, 0xa0, 0x38, 0x1a, 0x25, 0x03, 0xdb, 0xb6, + 0xfb, 0x53, 0x42, 0x00, 0x02, 0xcf, 0xbc, 0xff, 0xff, 0xfc, 0x1b, 0xff, + 0x20, 0xe1, 0x1e, 0x0b, 0xfc, 0x52, 0x14, 0xbf, 0xf2, 0x01, 0x6f, 0xc1, + 0xaf, 0xf6, 0x05, 0xfb, 0x1d, 0x7b, 0xc0, 0x53, 0xb5, 0xf6, 0x11, 0x47, + 0x86, 0x2b, 0xff, 0x01, 0x41, 0xff, 0xff, 0xfa, 0x1f, 0xff, 0x02, 0x16, + 0x00, 0xb4, 0x04, 0xf2, 0x8f, 0x91, 0xdf, 0x50, 0xbf, 0x30, 0xf2, 0x5f, + 0x76, 0x36, 0xfa, 0x11, 0x7f, 0xff, 0x00, 0xff, 0xcc, 0xff, 0xa1, 0xef, + 0x4b, 0xf9, 0x1f, 0x20, 0xfa, 0x2e, 0x17, 0xd2, 0x11, 0x8f, 0x52, 0xf6, + 0x19, 0x0b, 0xff, 0x50, 0x7f, 0x36, 0x30, 0x7f, 0x01, 0x01, 0xf2, 0x8f, + 0xf2, 0x7f, 0x19, 0xf7, 0x2f, 0x1f, 0x80, 0x01, 0x60, 0x8f, 0x27, 0xc0, + 0xaf, 0xf7, 0x0b, 0xc8, 0x6f, 0x25, 0xc0, 0x1d, 0x02, 0xf4, 0x1f, 0xf4, + 0x0c, 0x3f, 0x17, 0xf6, 0x2f, 0x1f, 0x6a, 0x3f, 0x2b, 0x0c, 0x25, 0xff, + 0x30, 0xaf, 0x6f, 0x24, 0xf9, 0x05, 0x80, 0x03, 0xfe, 0x18, 0xf9, 0x1f, + 0x34, 0xf5, 0x2f, 0xc0, 0x1f, 0x01, 0xfa, 0x1d, 0x20, 0x2f, 0xc0, 0x1c, + 0xc8, 0x77, 0x2d, 0xa0, 0x6f, 0x04, 0x32, 0xfd, 0x1d, 0x18, 0x52, 0xf3, + 0x3f, 0x17, 0x01, 0xf7, 0x0f, 0xb4, 0x32, 0xcb, 0x04, 0x7f, 0x35, 0xfb, + 0x07, 0x05, 0x90, 0x06, 0xff, 0x19, 0x92, 0xf2, 0x4f, 0x0f, 0x01, 0x70, + 0x0c, 0x9f, 0xff, 0xf0, 0x7f, 0x7f, 0x35, 0xf1, 0x3f, 0x81, 0xbe, 0x8f, + 0x26, 0xb1, 0xf3, 0x4f, 0x2c, 0x07, 0x01, 0xff, 0xf5, 0x0a, 0xff, 0xff, + 0xf2, 0x5f, 0x87, 0xa0, 0x3d, 0x51, 0x06, 0xf4, 0x3f, 0x53, 0xc1, 0xf4, + 0x20, 0x5b, 0x1f, 0x07, 0xff, 0x70, 0xaf, 0xff, 0xff, 0x34, 0xfa, 0x1b, + 0x87, 0x3d, 0x06, 0x06, 0xf9, 0x1f, 0x04, 0x82, 0xd1, 0xf5, 0x47, 0x2f, + 0x07, 0xfb, 0x08, 0xb2, 0x02, 0x32, 0x87, 0x3c, 0xf9, 0x0e, 0x7f, 0x19, + 0x04, 0xc2, 0xd2, 0xd6, 0x44, 0x3f, 0x01, 0xfd, 0x5c, 0xa3, 0x02, 0xf2, + 0xaa, 0xff, 0xd0, 0x9f, 0x07, 0xbb, 0x90, 0x54, 0xff, 0x6b, 0x21, 0x33, + 0xf1, 0xd2, 0xb8, 0x00, 0x33, 0x6f, 0xd6, 0xdf, 0xff, 0xfe, 0xae, 0xff, + 0x04, 0xfd, 0xef, 0xff, 0xa1, 0xcf, 0x02, 0xf6, 0x2f, 0xe5, 0x03, 0xdb, + 0x82, 0xb0, 0xaf, 0x83, 0xbd, 0x21, 0x00, 0x71, 0xf2, 0xb3, 0xa9, 0x12, + 0x8f, 0xd9, 0xdf, 0x42, 0xf8, 0x69, 0xf5, 0xbf, 0xff, 0x32, 0x03, 0xfd, + 0x74, 0x1a, 0x03, 0xa3, 0x7a, 0x51, 0x8d, 0xf9, 0xbf, 0x00, 0xff, 0xd1, + 0xc3, 0xa4, 0x89, 0x12, 0xaf, 0xff, 0x20, 0xff, 0xf7, 0xe1, 0xfd, 0xef, + 0xff, 0x16, 0xdf, 0xb1, 0x2b, 0x33, 0x04, 0xd4, 0xff, 0xff, 0x32, 0x5b, + 0x00, 0xef, 0xf6, 0x8a, 0xcb, 0x9f, 0xf2, 0x94, 0x85, 0x00, 0x69, 0x02, + 0xcf, 0xfe, 0xef, 0xff, 0xff, 0xf7, 0x02, 0x9f, 0xff, 0xff, 0xfd, 0x18, + 0x2d, 0x01, 0x79, 0x3a, 0xff, 0x81, 0x02, 0xe2, 0xc4, 0x23, 0x31, 0xbf, + 0x00, 0xf6, 0x7f, 0xfb, 0xcf, 0xfb, 0x9f, 0xf4, 0x56, 0x00, 0x76, 0x58, + 0x03, 0xff, 0xe4, 0xbf, 0xff, 0xff, 0x00, 0xf9, 0xaf, 0xf7, 0xbf, 0xfb, + 0x1a, 0x2b, 0xff, 0x00, 0xff, 0xf2, 0x43, 0x5f, 0xf1, 0x9f, 0xff, 0xff, + 0x60, 0xff, 0xe9, 0xd4, 0xff, 0x15, 0xff, 0xff, 0xfa, 0x10, 0x4f, 0xfc, + 0xcf, 0x62, 0xf8, 0x45, 0x68, 0x49, 0x04, 0x03, 0xff, 0xfc, 0xfa, 0x7f, + 0x01, 0xf6, 0xbf, 0x00, 0xfd, 0x06, 0x38, 0xff, 0xff, 0xb1, 0x78, 0xaf, + 0x30, 0xf3, 0x5f, 0x22, 0x02, 0xff, 0xff, 0xeb, 0xad, 0x08, 0xff, 0x16, + 0xff, 0xf9, 0x02, 0xaa, 0xff, 0xfc, 0x00, 0xdf, 0xfc, 0x24, 0x59, 0x3a, + 0x02, 0xff, 0xff, 0x22, 0xfc, 0xaf, 0x03, 0xfd, 0x01, 0x35, 0x41, 0x01, + 0x18, 0xff, 0xf6, 0x3f, 0x8b, 0x62, 0xf7, 0x10, 0x00, 0x08, 0x3f, 0x24, + 0xff, 0xfb, 0x02, 0x87, 0xff, 0xf6, 0x01, 0xaf, 0xff, 0x24, 0x48, 0x39, + 0x12, 0xcf, 0x12, 0x20, 0xfe, 0x7d, 0xe1, 0x10, 0x01, 0xdf, 0xff, 0xe4, + 0x0c, 0x79, 0x3d, 0xfa, 0x1e, 0x72, 0x52, 0xff, 0x20, 0x08, 0x10, 0x00, + 0x11, 0x14, 0x01, 0xfb, 0x7f, 0xa9, 0x80, 0x63, 0x24, 0x49, 0x39, 0x11, + 0xaf, 0xff, 0x89, 0x08, 0xff, 0xff, 0xfe, 0x7c, 0x01, 0x10, 0x00, 0x2d, + 0x03, 0xff, 0xf4, 0x30, 0x3f, 0xff, 0x19, 0x23, 0x01, 0x02, 0xf5, 0x23, + 0x02, 0xa4, 0x02, 0x02, 0x31, 0xfb, 0x08, 0x8f, 0x98, 0xff, 0xfe, 0x51, + 0x25, 0x39, 0x29, 0x00, 0x31, 0x5f, 0xff, 0xbb, 0xff, 0x49, 0xff, 0xff, + 0x00, 0xe7, 0xcf, 0xff, 0x24, 0x20, 0x00, 0x5f, 0xff, 0x0c, 0x71, 0xaf, + 0xff, 0x34, 0x31, 0x19, 0xff, 0xff, 0x00, 0xf2, 0x00, 0x4f, 0xff, 0x11, + 0x30, 0xaf, 0xff, 0x40, 0xfe, 0x7a, 0xf8, 0x9f, 0xff, 0xff, 0x25, 0x9a, + 0x10, 0x2a, 0x42, 0x3f, 0x11, 0xab, 0xff, 0xff, 0xf9, 0x01, 0xcf, 0xfe, + 0x19, 0xf2, 0x01, 0x01, 0xcf, 0x29, 0x60, 0x52, 0x0a, 0xe2, 0xf2, 0x40, + 0x89, 0xdf, 0x30, 0x08, 0x22, 0x4f, 0xff, 0xb5, 0x7a, 0xfd, 0xdf, 0xff, + 0x02, 0xff, 0x25, 0xff, 0xcf, 0x36, 0x2b, 0x12, 0xf6, 0x00, 0xaf, 0xff, + 0xff, 0xfb, 0x1d, 0x80, 0x42, 0xe3, 0x58, 0x0b, 0x29, 0x81, 0x0a, 0x52, + 0xf1, 0x31, 0x50, 0x00, 0x44, 0x12, 0x4c, 0x09, 0xff, 0xdc, 0xff, 0xb6, + 0x80, 0x49, 0xf9, 0xaf, 0xff, 0x33, 0x8b, 0xaf, 0xef, 0x00, 0x44, 0xff, + 0xfc, 0x7e, 0xff, 0xf9, 0xbf, 0xff, 0x01, 0xff, 0xf6, 0x1f, 0x11, 0x35, + 0xff, 0x60, 0xb9, 0x30, 0xd1, 0xaf, 0x11, 0xe9, 0xff, 0xf1, 0x11, 0x83, + 0x00, 0x00, 0x00, 0xcf, 0x50, 0xdf, 0xff, 0xff, 0xdc, 0x00, 0xff, 0xcb, + 0xfe, 0xdc, 0xdf, 0xff, 0x22, 0x16, 0x02, 0x17, 0x56, 0x80, 0x7d, 0xfc, + 0x7e, 0x14, 0x75, 0x00, 0x41, 0x0b, 0xff, 0xf4, 0x0f, 0xff, 0xff, 0xf3, + 0x60, 0x5f, 0x83, 0xb9, 0x21, 0x4f, 0x75, 0x8d, 0xff, 0x20, 0xf5, 0x0d, + 0x0a, 0x96, 0xfc, 0x7f, 0xff, 0xfc, 0x01, 0x12, 0x66, 0x86, 0x72, 0x00, + 0x11, 0x2a, 0x0b, 0x00, 0xfd, 0x21, 0x21, 0xab, 0x52, 0xcf, 0xff, 0x13, + 0x08, 0xff, 0xff, 0xf8, 0x1f, 0x7b, 0xff, 0xff, 0xf7, 0x22, 0x2f, 0x15, + 0x29, 0xf2, 0x12, 0xaf, 0x83, 0xef, 0x00, 0xff, 0xf4, 0x02, 0x65, 0x65, + 0x43, 0x4b, 0xfb, 0x00, 0x31, 0x24, 0x67, 0x8a, 0xcb, 0xa8, 0x50, 0x00, + 0x00, 0x01, 0x2b, 0xf2, 0x4f, 0xff, 0xb0, 0x8f, 0xff, 0x30, 0xff, 0x09, + 0x03, 0xd9, 0x22, 0x43, 0x36, 0x78, 0x02, 0x62, 0x07, 0xf0, 0x02, 0x8b, + 0xef, 0x72, 0xfe, 0x04, 0x10, 0xb9, 0x76, 0x58, 0xae, 0x21, 0x94, 0x33, + 0x00, 0x31, 0x00, 0x00, 0x00, 0x21, 0x22, 0x07, 0xf2, 0x01, 0x5f, 0xff, + 0xf7, 0x0c, 0xff, 0xff, 0x42, 0x12, 0x80, 0xe2, 0x90, 0x38, 0x02, 0x40, + 0x2a, 0x22, 0x10, 0x00, 0x12, 0x00, 0x01, 0x34, 0x43, 0x24, 0x46, 0x61, + 0x40, 0x1c, 0x46, 0xff, 0xf9, 0x05, 0x79, 0x12, 0xff, 0x00, 0xff, 0x61, + 0xf1, 0x6f, 0xff, 0xff, 0x21, 0xff, 0x10, 0xff, 0xc1, 0xaf, 0x3d, 0xfd, + 0x20, 0x00, 0x10, 0x00, 0x13, 0x00, 0x04, 0x82, 0xc9, 0x50, 0x00, 0x04, + 0x18, 0x10, 0x00, 0x0b, 0x55, 0x19, 0xfa, 0x1d, 0xff, 0x00, 0x35, 0xff, + 0xff, 0xd1, 0x00, 0xaf, 0xff, 0xff, 0x04, 0xd0, 0x4f, 0xff, 0xf4, 0x2f, + 0x36, 0xfb, 0x94, 0x00, 0x22, 0x10, 0x24, 0xaf, 0x71, 0xff, 0xf5, 0x03, + 0x08, 0x6b, 0xff, 0xf7, 0x02, 0x56, 0xff, 0xff, 0xf8, 0x01, 0x1f, 0xff, + 0x18, 0xff, 0xff, 0xd0, 0x01, 0x71, 0x06, 0xfb, 0x01, 0xcf, 0xfe, 0x19, + 0x37, 0x03, 0xf0, 0x03, 0x3f, 0xfe, 0x10, 0x01, 0x47, 0xc4, 0x12, 0x3d, + 0x00, 0xf7, 0x1f, 0xff, 0x21, 0xbf, 0xff, 0xfa, 0x6c, 0x86, 0x02, 0xe3, + 0x01, 0x57, 0x16, 0x37, 0x03, 0xfe, 0x01, 0x03, 0xff, 0xa4, 0x10, 0x02, + 0x10, 0x1a, 0x57, 0x01, 0xff, 0xf8, 0x1f, 0xff, 0xf5, 0x02, 0xcf, 0x05, + 0x18, 0xc5, 0x22, 0x5e, 0x37, 0x04, 0xf1, 0x18, 0xdf, 0x08, 0x70, 0x1f, + 0xc5, 0xbf, 0x57, 0xff, 0xff, 0x21, 0x1c, 0xef, 0xb6, 0x10, 0x87, 0x47, + 0x06, 0xfb, 0x23, 0x18, 0x21, 0x00, 0x6f, 0x17, 0x02, 0xf2, 0x07, 0x70, + 0x71, 0x05, 0x7f, 0x37, 0x07, 0xff, 0xc6, 0x29, 0x17, 0x8f, 0x04, 0xa2, + 0x32, 0x7f, 0x77, 0x2f, 0x77, 0x2f, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xe0, 0x07, 0x07, 0x07, +}; + +const uint8_t g_pui8Image_Splash5[] = +{ + IMAGE_FMT_4BPP_COMP, + 96, 0, + 64, 0, + + 15, + 0x00, 0x00, 0x00, + 0x29, 0x29, 0x29, + 0x43, 0x43, 0x43, + 0x57, 0x57, 0x57, + 0x67, 0x67, 0x67, + 0x77, 0x77, 0x77, + 0x86, 0x86, 0x86, + 0x98, 0x98, 0x98, + 0xa9, 0xa9, 0xa9, + 0xba, 0xba, 0xba, + 0xca, 0xca, 0xca, + 0xd8, 0xd8, 0xd8, + 0xe7, 0xe7, 0xe7, + 0xf4, 0xf4, 0xf4, + 0xfb, 0xfb, 0xfb, + 0xff, 0xff, 0xff, + + 0x1f, 0xff, 0xff, 0xff, 0xe9, 0xd4, 0xa7, 0x5f, 0x12, 0x3e, 0xfe, 0x06, + 0x07, 0x07, 0x77, 0x2f, 0x07, 0xff, 0x27, 0xf7, 0x02, 0x03, 0xf6, 0x4f, + 0x07, 0x07, 0x77, 0xc4, 0x2f, 0x01, 0xf2, 0x42, 0x9f, 0x02, 0x30, 0x3f, + 0xf8, 0x07, 0x07, 0x77, 0x2f, 0x01, 0xf1, 0xa5, 0x4f, 0x9f, 0x01, 0xe1, + 0x58, 0xd2, 0x07, 0xa7, 0x5f, 0x17, 0x11, 0xb1, 0xf9, 0x1f, 0x01, 0x22, + 0xf7, 0x3f, 0x07, 0xe0, 0x07, 0x77, 0x2a, 0xb8, 0x64, 0x43, 0x46, 0xac, + 0x00, 0x99, 0xdf, 0xff, 0x91, 0xff, 0x17, 0xff, 0xff, 0x0e, 0xf5, 0x1f, + 0xf5, 0x4f, 0x07, 0xbf, 0x77, 0xff, 0x00, 0xff, 0x94, 0x22, 0x11, 0x23, + 0x44, 0x32, 0x11, 0x00, 0x01, 0x13, 0xaf, 0x72, 0xff, 0x33, 0xff, 0xff, + 0x0e, 0xe0, 0x8f, 0xf3, 0x7f, 0x07, 0xbf, 0x77, 0xf9, 0x08, 0x30, 0x13, + 0x6a, 0xdf, 0x01, 0xfa, 0xaf, 0xc4, 0x00, 0x14, 0x72, 0xff, 0x71, 0xff, + 0xff, 0x43, 0xff, 0x38, 0xb2, 0xef, 0x07, 0xbf, 0x73, 0xd9, 0x53, 0x43, + 0x10, 0x33, 0x20, 0x28, 0x1f, 0xd2, 0x02, 0xff, 0xb1, 0x07, 0xef, 0xfe, + 0x08, 0xff, 0x43, 0x77, 0x2f, 0x03, 0x02, 0x92, 0x12, 0x36, 0x77, 0x76, + 0x7d, 0x1f, 0xff, 0x00, 0xff, 0x60, 0xcf, 0xb1, 0xdf, 0xf4, 0x1f, 0xfe, + 0x70, 0x1a, 0x6f, 0x27, 0x01, 0xfc, 0x42, 0x03, 0xbf, 0xc0, 0x3f, 0x03, + 0xb8, 0xf1, 0x3f, 0xb1, 0xdf, 0xc1, 0x1c, 0x8f, 0xf5, 0x3f, 0x4f, 0x07, + 0x01, 0x90, 0x28, 0x02, 0xef, 0xff, 0xff, 0xb5, 0xff, 0x68, 0x1f, 0xf9, + 0x00, 0x03, 0xfb, 0x1f, 0x71, 0xff, 0x21, 0xff, 0x90, 0x61, 0xbf, 0x6f, + 0x27, 0xff, 0xfe, 0x94, 0x06, 0x52, 0x10, 0xb2, 0xef, 0x26, 0x1f, 0xb0, + 0x6f, 0xfe, 0x1d, 0x06, 0x70, 0x62, 0x0c, 0xf9, 0x07, 0x77, 0x2f, 0xff, + 0x00, 0xfa, 0x21, 0x24, 0xaf, 0xff, 0x87, 0xff, 0x58, 0x10, 0xf2, 0xcf, + 0x17, 0x17, 0x13, 0xff, 0xff, 0x6c, 0x06, 0xe9, 0x53, 0xcf, 0x60, 0x8f, + 0x77, 0x2f, 0xff, 0x20, 0x40, 0x4b, 0x59, 0x71, 0xff, 0x53, 0xf2, 0x9f, + 0x49, 0xad, 0x16, 0xf9, 0x0d, 0x03, 0xf6, 0x0a, 0x7e, 0xc8, 0x3e, 0x01, + 0xd1, 0x1c, 0x22, 0xf1, 0x6f, 0xa2, 0x08, 0xf3, 0x7f, 0xd9, 0xef, 0x01, + 0xc9, 0xff, 0xeb, 0x13, 0xef, 0xf2, 0x2f, 0x03, 0xf3, 0x8f, 0xcb, 0xa3, + 0x90, 0xb6, 0xfa, 0x02, 0x2a, 0xfb, 0xb8, 0x2f, 0xf2, 0x10, 0xc4, 0x6f, + 0x80, 0x0a, 0xa6, 0xff, 0xc6, 0xdf, 0x2e, 0xf0, 0x9f, 0x03, 0xf3, 0xcc, + 0xa3, 0xb6, 0x60, 0x40, 0x7f, 0x2a, 0xfa, 0x0c, 0x37, 0xf2, 0x87, 0x5f, + 0x45, 0x71, 0x0e, 0x91, 0xdf, 0x49, 0x02, 0xf3, 0x23, 0xc8, 0x5e, 0x1b, + 0xf3, 0x0a, 0x6c, 0x25, 0x82, 0xf5, 0x11, 0x59, 0x3f, 0x71, 0x0e, 0x61, + 0xfd, 0x19, 0x02, 0x32, 0xf4, 0x6f, 0x7e, 0x3e, 0xff, 0x20, 0x75, 0xb1, + 0x01, 0x72, 0xfa, 0x38, 0x3f, 0x80, 0xff, 0x98, 0x04, 0x13, 0x71, 0xfa, + 0x1d, 0x02, 0xf5, 0x3f, 0x15, 0xcd, 0xa0, 0x71, 0x0d, 0x75, 0xf2, 0x54, + 0x7f, 0x37, 0x3f, 0x02, 0x81, 0xff, 0x87, 0xff, 0xf7, 0x9f, 0x01, 0x90, + 0x26, 0xfa, 0x1f, 0x02, 0xf7, 0x2f, 0x15, 0xcd, 0xff, 0x10, 0xff, 0xa0, + 0xaf, 0x75, 0xf9, 0x26, 0x2f, 0x45, 0x00, 0x4b, 0xb0, 0xef, 0xff, 0xff, + 0xfb, 0xcf, 0xff, 0x04, 0x89, 0xff, 0x91, 0xfb, 0x1e, 0x02, 0xfa, 0x2f, + 0xc4, 0x15, 0xcd, 0xff, 0xff, 0x13, 0x7c, 0xdf, 0xff, 0x01, 0xff, 0x26, + 0x3d, 0x84, 0x48, 0xd1, 0xcf, 0x03, 0x00, 0x68, 0xff, 0xa1, 0xcf, 0x1b, + 0xff, 0xfa, 0x7c, 0x1c, 0xff, 0xfb, 0x1d, 0x0c, 0xd4, 0x21, 0xf6, 0x0f, + 0x80, 0x7b, 0xf8, 0x6f, 0xff, 0xff, 0x43, 0x56, 0xd3, 0x01, 0x45, 0xe0, + 0xcf, 0xff, 0xff, 0xfc, 0x9f, 0x01, 0x00, 0xf1, 0x8f, 0x17, 0xff, 0x72, + 0x66, 0xff, 0xfb, 0x72, 0x2d, 0x0b, 0xdb, 0xb3, 0xf1, 0x5f, 0x7b, 0xfd, + 0x00, 0xcf, 0xff, 0xff, 0x92, 0x74, 0xf3, 0x25, 0xf1, 0x08, 0xbf, 0xff, + 0xff, 0xf9, 0x6a, 0xf2, 0x1f, 0x52, 0x03, 0xff, 0xb7, 0x9f, 0xff, 0xfa, + 0x1f, 0x0b, 0xdb, 0x90, 0xb3, 0xa0, 0xcf, 0x7f, 0xf1, 0x73, 0xf5, 0x25, + 0x08, 0xe1, 0x9f, 0xff, 0xac, 0x03, 0xf4, 0x04, 0xa1, 0x03, 0xfd, 0x92, + 0x07, 0x8f, 0xf8, 0x2f, 0x0f, 0xbc, 0x40, 0x52, 0x85, 0xfd, 0x5c, 0xff, + 0xf3, 0x64, 0x98, 0x04, 0x25, 0xd1, 0x7f, 0xff, 0x49, 0x03, 0xf5, 0x21, + 0x01, 0x94, 0x8f, 0x23, 0x51, 0x9f, 0xf5, 0x2f, 0x05, 0x90, 0xcd, 0xff, + 0x24, 0x85, 0xfe, 0x9d, 0xff, 0xf6, 0x04, 0x36, 0x6a, 0x34, 0xd2, 0x5f, + 0x03, 0xf8, 0x7f, 0x00, 0xf7, 0x2a, 0x11, 0x6f, 0xb6, 0x57, 0xff, 0xf2, + 0x64, 0x6f, 0x05, 0xcd, 0xff, 0x17, 0x02, 0xf7, 0x8f, 0x81, 0x52, 0xf9, + 0x27, 0x4b, 0x43, 0xb5, 0x2f, 0x03, 0x02, 0xf9, 0x7f, 0xf9, 0x1f, 0xa0, + 0x3f, 0x01, 0xc1, 0x74, 0xbf, 0x83, 0x5b, 0x33, 0x18, 0x02, 0xfb, 0xcb, + 0x40, 0xaf, 0x21, 0xfd, 0x18, 0x4a, 0x53, 0x8b, 0x1f, 0xa2, 0x01, 0x96, + 0x01, 0xfc, 0x1c, 0xd0, 0xaa, 0x42, 0xe0, 0x0a, 0xe2, 0xc5, 0xfd, 0x19, + 0xff, 0xff, 0xfa, 0x08, 0x7f, 0xff, 0xf8, 0x7f, 0x42, 0x17, 0x59, 0x53, + 0x40, 0x4f, 0x81, 0xff, 0xaa, 0xf7, 0xdf, 0xff, 0xfb, 0x17, 0x1e, 0x91, + 0x1d, 0x01, 0x18, 0x42, 0x22, 0xc6, 0x06, 0x17, 0xff, 0xff, 0xfb, 0x8f, + 0x39, 0xda, 0x27, 0x00, 0x68, 0x54, 0x3f, 0x23, 0xff, 0xfb, 0x5f, 0xff, + 0x00, 0xc6, 0xef, 0xff, 0xf9, 0x0f, 0x52, 0x2e, 0xff, 0x17, 0xff, 0xf6, + 0x1f, 0x29, 0xef, 0x09, 0xc9, 0xd4, 0x40, 0x34, 0x9c, 0xfa, 0xcc, 0x7f, + 0xff, 0xff, 0x45, 0x01, 0x68, 0x54, 0x4f, 0x71, 0xff, 0xfc, 0x9f, 0x02, + 0x00, 0xf4, 0x2e, 0x38, 0x1f, 0xff, 0xff, 0xf2, 0x4f, 0xe9, 0x0c, 0xd4, + 0x42, 0x91, 0x7c, 0xf7, 0x8f, 0x39, 0x02, 0x64, 0x89, 0xba, 0xff, 0x90, + 0xbf, 0x04, 0x30, 0x01, 0xf3, 0x78, 0x1f, 0xff, 0xff, 0xf1, 0x9f, 0x0c, + 0xca, 0x64, 0x32, 0xf1, 0x8f, 0x01, 0x9a, 0x54, 0x62, 0x04, 0xff, 0xa8, + 0xf1, 0x20, 0x6f, 0x02, 0xfa, 0x30, 0x01, 0x13, 0x23, 0xe0, 0x1f, 0xff, + 0xff, 0x91, 0x3c, 0xd0, 0x0c, 0xa3, 0xf3, 0x51, 0xff, 0x68, 0xff, 0xff, + 0x00, 0xc7, 0xdf, 0xff, 0xff, 0x72, 0x2c, 0x80, 0x23, 0x00, 0x20, 0x10, + 0x45, 0x45, 0x56, 0x41, 0x12, 0x38, 0x01, 0xf7, 0x03, 0x42, 0x2e, 0xff, + 0xff, 0x63, 0x19, 0xe4, 0x01, 0xd4, 0xa3, 0xfe, 0x17, 0x6c, 0xc5, 0xef, + 0x00, 0xff, 0xff, 0x50, 0x26, 0x36, 0x85, 0x18, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x04, 0x8f, 0xf8, 0x22, 0x07, 0x1f, 0x1a, 0xff, 0xff, 0x35, + 0x1c, 0xd4, 0xa4, 0x20, 0x80, 0x9f, 0x66, 0xfa, 0x01, 0x75, 0x23, 0x11, + 0x00, 0xaf, 0xfb, 0x20, 0x16, 0x79, 0xcf, 0x70, 0x1f, 0x01, 0xfb, 0x1f, + 0x26, 0x46, 0xff, 0xff, 0x26, 0x26, 0x84, 0xc6, 0xff, 0xff, 0x36, 0x16, + 0x66, 0x80, 0x36, 0x00, 0x43, 0x46, 0xbf, 0xff, 0xff, 0xfb, 0x44, 0x54, + 0x01, 0x42, 0x42, 0x2f, 0xfa, 0x1f, 0xb2, 0x53, 0x19, 0xc0, 0x26, 0xc6, + 0xff, 0xf6, 0x2f, 0x50, 0x12, 0x7d, 0x01, 0xfe, 0xff, 0xff, 0xec, 0xb8, + 0x31, 0x19, 0x1e, 0x00, 0xc8, 0x8b, 0xf6, 0x1f, 0xf6, 0x2f, 0xf4, 0x72, + 0x1a, 0x8f, 0xff, 0x35, 0x6e, 0x2a, 0xfe, 0x02, 0xf5, 0x00, 0x06, 0x20, + 0x87, 0x43, 0x03, 0x33, 0x23, 0x34, 0x20, 0x00, 0x4b, 0x27, 0xff, 0xff, + 0xc0, 0x9f, 0xf2, 0x03, 0x3f, 0xf4, 0x8a, 0x0b, 0xff, 0x35, 0x67, 0x1e, + 0x00, 0xf3, 0x38, 0x02, 0xff, 0xf1, 0x1c, 0xc6, 0x09, 0x08, 0xad, 0xe7, + 0x43, 0x3a, 0x1f, 0xff, 0xa0, 0x4f, 0x01, 0xf0, 0x2f, 0xf3, 0x8f, 0x80, + 0x4a, 0x17, 0x6f, 0x80, 0x26, 0xf4, 0x5a, 0x04, 0xff, 0x41, 0xff, 0xfa, + 0x02, 0x13, 0x43, 0x4a, 0xba, 0x42, 0x6f, 0x17, 0xf5, 0x00, 0x01, 0x10, + 0x4f, 0xf3, 0x9f, 0xfb, 0x21, 0x3f, 0xc0, 0x77, 0x2e, 0xf8, 0x01, 0x05, + 0xff, 0x90, 0x8f, 0x01, 0xff, 0xdd, 0xdd, 0x70, 0x2f, 0xf7, 0x07, 0x17, + 0x03, 0xfc, 0x40, 0x35, 0x2f, 0xa1, 0xdf, 0x8f, 0x47, 0x80, 0x31, 0x14, + 0x03, 0xff, 0xf9, 0x11, 0xaf, 0xff, 0x04, 0xff, 0x90, 0x0b, 0xb0, 0x08, + 0x07, 0xff, 0xfb, 0x1c, 0xf3, 0x0d, 0x81, 0x97, 0x4f, 0x02, 0x27, 0x30, + 0x00, 0xcf, 0xff, 0xf5, 0x12, 0x32, 0x33, 0x10, 0x12, 0x20, 0x00, 0x4e, + 0x07, 0xff, 0xff, 0xc0, 0x00, 0x08, 0xe0, 0x97, 0x4f, 0x02, 0x82, 0x60, + 0x8f, 0xff, 0xff, 0x03, 0xe9, 0x9a, 0xa9, 0x86, 0x8d, 0x9b, 0x07, 0x01, + 0x1c, 0xf8, 0x73, 0x5f, 0x8f, 0x47, 0x02, 0xf1, 0x21, 0x7c, 0x2f, 0x3f, + 0x07, 0x77, 0x2f, 0x07, 0xf3, 0x68, 0x7c, 0x0f, 0x07, 0x07, 0x77, 0x2f, + 0x07, 0xf6, 0x4c, 0x7c, 0x1e, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xf9, 0x02, + 0x7c, 0x1f, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xf8, 0x24, 0x7c, 0x1f, 0x07, + 0x07, 0x77, 0x2f, 0x07, 0xf4, 0x56, 0x7c, 0x3f, 0x07, 0x07, 0x77, 0x2f, + 0x07, 0xf1, 0x62, 0x7c, 0xaf, 0x07, 0x07, 0x77, 0x2f, 0x07, 0x71, 0x03, + 0xf8, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xfa, 0x12, 0x0c, 0xf8, 0x07, 0x07, + 0x77, 0x2f, 0x04, 0xfe, 0xff, 0xff, 0x1f, 0x50, 0x01, 0xbf, 0x07, 0x07, + 0x77, 0x2f, 0x06, 0x1f, 0xf5, 0x00, 0x2c, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0x3e, 0xf1, 0x05, 0x07, 0x07, 0x77, 0x2f, 0x07, 0xff, 0x3f, 0xf8, 0x6f, + 0x07, 0x07, 0x77, 0x2f, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xff, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0xf0, 0x07, 0x07, 0x07, 0x07, +}; + +const uint8_t *g_ppui8Image_Splash[] = +{ + g_pui8Image_Splash1, g_pui8Image_Splash2, g_pui8Image_Splash3, + g_pui8Image_Splash4, g_pui8Image_Splash5 +}; diff --git a/boards/ek-lm4f232/qs-logger/images.h b/boards/ek-lm4f232/qs-logger/images.h new file mode 100644 index 0000000..b100571 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/images.h @@ -0,0 +1,37 @@ +//***************************************************************************** +// +// images.h - Header file for graphics images. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __IMAGES_H__ +#define __IMAGES_H__ + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** +extern const uint8_t g_pui8Image_TI_Black[]; +extern const uint8_t *g_ppui8Image_Splash[]; + +#endif // __IMAGES_H__ + diff --git a/boards/ek-lm4f232/qs-logger/menus.c b/boards/ek-lm4f232/qs-logger/menus.c new file mode 100644 index 0000000..1cf790e --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/menus.c @@ -0,0 +1,704 @@ +//***************************************************************************** +// +// menus.c - Application menus definition and supporting functions. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** +#include +#include +#include +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/slidemenuwidget.h" +#include "drivers/stripchartwidget.h" +#include "utils/ustdlib.h" +#include "stripchartmanager.h" +#include "clocksetwidget.h" +#include "qs-logger.h" +#include "acquire.h" +#include "menus.h" + +//***************************************************************************** +// +// This is the menus module of the data logger example application. It +// contains the definitions of all the menus that are used by the application +// and provides some helper functions. +// +//***************************************************************************** + +//***************************************************************************** +// +// Define two offscreen buffers and display structures. These are used for +// off-screen drawing for animation effects. Only limited colors are needed +// so 4bpp buffers are used to save memory. +// +//***************************************************************************** +#define OFFSCREEN_BUF_SIZE GrOffScreen4BPPSize(96, 64) +uint8_t g_pui8OffscreenBufA[OFFSCREEN_BUF_SIZE]; +uint8_t g_pui8OffscreenBufB[OFFSCREEN_BUF_SIZE]; +tDisplay g_sOffscreenDisplayA; +tDisplay g_sOffscreenDisplayB; + +//***************************************************************************** +// +// Create a palette that is used by the on-screen menus and anything else that +// uses the (above) off-screen buffers. This palette should contain any +// colors that are used by any widget using the offscreen buffers. There can +// be up to 16 colors in this palette. +// The numerical values of colors in the list below were selected as colors +// that produced good results on the display and did not already have named +// values. +// +//***************************************************************************** +uint32_t g_pui32Palette[] = +{ + ClrBlack, + ClrWhite, + ClrDarkBlue, + ClrLightBlue, + ClrRed, + ClrDarkGreen, + ClrYellow, + ClrBlue, + ClrGreen, + 0x000040, + ClrLime, + ClrAqua, + 0x004000, + ClrFuchsia, + 0xC00040, + 0x60E080, +}; +#define NUM_PALETTE_ENTRIES (sizeof(g_pui32Palette) / sizeof(uint32_t)) + +//***************************************************************************** +// +// Define the length of text strings used for holding data values. +// +//***************************************************************************** +#define TEXT_FIELD_LENGTH 20 + +//***************************************************************************** +// +// Defines a set of text fields that are used by various widgets for dynamic +// updating of text. +// +//***************************************************************************** +static char g_pcTextFields[NUM_TEXT_ITEMS][TEXT_FIELD_LENGTH]; + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the temperature +// on a simple screen with an outline and a title. +// +//***************************************************************************** +tCanvasWidget g_sTempContainerCanvas; +Canvas(g_sTempExtValueCanvas, &g_sTempContainerCanvas, 0, 0, + &g_sCFAL96x64x16, 0, 44, 96, 20, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_EXTTEMP], 0, 0); +Canvas(g_sTempIntValueCanvas, &g_sTempContainerCanvas, &g_sTempExtValueCanvas, + 0, &g_sCFAL96x64x16, 0, 24, 96, 20, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_INTTEMP], 0, 0); +Canvas(g_sTempTitleCanvas, &g_sTempContainerCanvas, &g_sTempIntValueCanvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 24, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, "TEMPERATURE", 0, 0); +Canvas(g_sTempContainerCanvas, 0, 0, &g_sTempTitleCanvas, &g_sCFAL96x64x16, 0, + 0, 96, 64, 0, ClrDarkBlue, ClrWhite, ClrWhite, 0, 0, 0, 0); + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the accelerometer +// data on a simple screen with an outline and a title. +// +//***************************************************************************** +tCanvasWidget g_sAccelContainerCanvas; +Canvas(g_sAccelZCanvas, &g_sAccelContainerCanvas, 0, 0, &g_sCFAL96x64x16, 0, + 48, 96, 16, (CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_ACCELZ], 0, 0); +Canvas(g_sAccelYCanvas, &g_sAccelContainerCanvas, &g_sAccelZCanvas, 0, + &g_sCFAL96x64x16, 0, 32, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_ACCELY], 0, 0); +Canvas(g_sAccelXCanvas, &g_sAccelContainerCanvas, &g_sAccelYCanvas, 0, + &g_sCFAL96x64x16, 0, 16, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_ACCELX], 0, 0); +Canvas(g_sAccelTitleCanvas, &g_sAccelContainerCanvas, &g_sAccelXCanvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 16, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, "ACCEL", 0, 0); +Canvas(g_sAccelContainerCanvas, 0, 0, &g_sAccelTitleCanvas, &g_sCFAL96x64x16, + 0, 0, 96, 64, 0, ClrDarkBlue, ClrWhite, ClrWhite, 0, 0, 0, 0); + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the analog input +// data on a simple screen with no decorations. +// +//***************************************************************************** +tCanvasWidget g_sAINContainerCanvas; +Canvas(g_sAIN3Canvas, &g_sAINContainerCanvas, 0, 0, &g_sCFAL96x64x16, 0, 48, + 96, 16, (CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | CANVAS_STYLE_TEXT_VCENTER), + ClrDarkGreen, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_USER3], 0, 0); +Canvas(g_sAIN2Canvas, &g_sAINContainerCanvas, &g_sAIN3Canvas, 0, + &g_sCFAL96x64x16, 0, 32, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkGreen, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_USER2], 0, 0); +Canvas(g_sAIN1Canvas, &g_sAINContainerCanvas, &g_sAIN2Canvas, 0, + &g_sCFAL96x64x16, 0, 16, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkGreen, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_USER1], 0, 0); +Canvas(g_sAIN0Canvas, &g_sAINContainerCanvas, &g_sAIN1Canvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkGreen, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_USER0], 0, 0); +Canvas(g_sAINContainerCanvas, 0, 0, &g_sAIN0Canvas, &g_sCFAL96x64x16, 0, 0, 96, + 64, 0, ClrDarkGreen, ClrWhite, ClrWhite, 0, 0, 0, 0); + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the current +// on a simple screen with an outline and a title. +// +//***************************************************************************** +tCanvasWidget g_sCurrentContainerCanvas; +Canvas(g_sCurrentValueCanvas, &g_sCurrentContainerCanvas, 0, 0, + &g_sCFAL96x64x16, 0, 24, 96, 40, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrBlack, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[LOG_ITEM_CURRENT], 0, 0); +Canvas(g_sCurrentTitleCanvas, &g_sCurrentContainerCanvas, + &g_sCurrentValueCanvas, 0, &g_sCFAL96x64x16, 0, 0, 96, 24, + (CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | CANVAS_STYLE_TEXT_VCENTER), + ClrBlack, ClrWhite, ClrWhite, &g_sFontFixed6x8, "CURRENT", 0, 0); +Canvas(g_sCurrentContainerCanvas, 0, 0, &g_sCurrentTitleCanvas, + &g_sCFAL96x64x16, 0, 0, 96, 64, 0, ClrBlack, ClrWhite, ClrWhite, 0, 0, + 0, 0); + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing the clock date +// and time. +// +//***************************************************************************** +tCanvasWidget g_sClockContainerCanvas; +Canvas(g_sClockTimeCanvas, &g_sClockContainerCanvas, 0, 0, &g_sCFAL96x64x16, 0, + 38, 96, 16, (CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_TIME], 0, 0); +Canvas(g_sClockDateCanvas, &g_sClockContainerCanvas, &g_sClockTimeCanvas, + 0, &g_sCFAL96x64x16, 0, 22, 96, 16, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_DATE], 0, 0); +Canvas(g_sClockTitleCanvas, &g_sClockContainerCanvas, &g_sClockDateCanvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 16, (CANVAS_STYLE_OUTLINE | + CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrDarkBlue, ClrWhite, ClrWhite, &g_sFontFixed6x8, "CLOCK", 0, 0); +Canvas(g_sClockContainerCanvas, 0, 0, &g_sClockTitleCanvas, &g_sCFAL96x64x16, + 0, 0, 96, 64, CANVAS_STYLE_OUTLINE, ClrDarkBlue, ClrWhite, ClrWhite, 0, + 0, 0, 0); + +//***************************************************************************** +// +// Defines a set of canvas widgets that are used for showing a status +// screen. It is a simple canvas container that can show a title and 3 +// lines of text. +// +//***************************************************************************** +tCanvasWidget g_sStatusContainerCanvas; +Canvas(g_sStatus3Canvas, &g_sStatusContainerCanvas, 0, 0, &g_sCFAL96x64x16, 1, + 48, 94, 12, (CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrRed, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_STATUS3], 0, 0); +Canvas(g_sStatus2Canvas, &g_sStatusContainerCanvas, &g_sStatus3Canvas, 0, + &g_sCFAL96x64x16, 1, 30, 94, 12, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_FILL | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrRed, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_STATUS2], 0, 0); +Canvas(g_sStatus1Canvas, &g_sStatusContainerCanvas, &g_sStatus2Canvas, 0, + &g_sCFAL96x64x16, 1, 18, 94, 12, (CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_FILL | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrRed, ClrWhite, ClrWhite, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_STATUS1], 0, 0); +Canvas(g_sStatusTitleCanvas, &g_sStatusContainerCanvas, &g_sStatus1Canvas, 0, + &g_sCFAL96x64x16, 0, 0, 96, 16, (CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE | + CANVAS_STYLE_TEXT_HCENTER | + CANVAS_STYLE_TEXT_VCENTER), + ClrWhite, ClrWhite, ClrBlack, &g_sFontFixed6x8, + g_pcTextFields[TEXT_ITEM_STATUS_TITLE], 0, 0); +Canvas(g_sStatusContainerCanvas, 0, 0, &g_sStatusTitleCanvas, &g_sCFAL96x64x16, + 0, 0, 96, 64, CANVAS_STYLE_OUTLINE, ClrRed, ClrWhite, ClrWhite, 0, 0, 0, + 0); + +//***************************************************************************** +// +// Allocate space for a time structure that is used with the clock setting +// widget. +// +//***************************************************************************** +struct tm g_sTimeClock; + +//***************************************************************************** +// +// Define a clock setting widget. It is used to allow the user to set the +// RTC (real time clock). +// +//***************************************************************************** +ClockSet(g_sClockSetter, 0, 0, 0, &g_sCFAL96x64x16, 0, 0, 96, 64, + g_psFontFixed6x8, ClrWhite, ClrDarkGreen, &g_sTimeClock, 0); + +//***************************************************************************** +// +// Define the main (root) menu. +// +//***************************************************************************** +tSlideMenu g_sConfigMenu; +tSlideMenu g_sViewMenu; +tSlideMenu g_sConfirmMenu; +tSlideMenuItem g_psMainMenuItems[] = +{ + {"CONFIG", &g_sConfigMenu, 0, 0}, + {"START", 0, &g_sStripChart.sBase, ClrBlack}, + {"VIEW", &g_sViewMenu, 0, 0}, + {"SAVE", 0, &g_sStatusContainerCanvas.sBase, ClrRed}, + {"ERASE", &g_sConfirmMenu, 0, 0} +}; +tSlideMenu g_psMainMenu = +{ + 0, (sizeof(g_psMainMenuItems) / sizeof(tSlideMenuItem)), g_psMainMenuItems, + 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the configuration (CONFIG) sub-menu. +// +// (root)-->CONFIG +// +//***************************************************************************** +tSlideMenu g_sChannelsMenu; +tSlideMenu g_sPeriodMenu; +tSlideMenu g_sStorageMenu; +tSlideMenu g_sSleepMenu; +tSlideMenuItem g_psConfigMenuItems[] = +{ + {"CHANNELS", &g_sChannelsMenu, 0, 0}, {"PERIOD", &g_sPeriodMenu, 0, 0}, + {"STORAGE", &g_sStorageMenu, 0, 0}, {"SLEEP", &g_sSleepMenu, 0, 0}, + {"CLOCK", 0, &g_sClockSetter.sBase, ClrDarkGreen} +}; +tSlideMenu g_sConfigMenu = +{ + &g_psMainMenu, (sizeof(g_psConfigMenuItems) / sizeof(tSlideMenuItem)), + g_psConfigMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the channel selection sub-menu. +// +// (root)-->CONFIG-->CHANNELS +// +//***************************************************************************** +tSlideMenuItem g_psChannelsMenuItems[] = +{ + {"CHAN 0", 0, 0, 0}, {"CHAN 1", 0, 0, 0}, {"CHAN 2", 0, 0, 0}, + {"CHAN 3", 0, 0, 0}, {"ACCEL X", 0, 0, 0}, {"ACCEL Y", 0, 0, 0}, + {"ACCEL Z", 0, 0, 0}, {"EXT TEMP", 0, 0, 0}, {"INT TEMP", 0, 0, 0}, + {"CURRENT", 0, 0, 0}, +}; +tSlideMenu g_sChannelsMenu = +{ + &g_sConfigMenu, (sizeof(g_psChannelsMenuItems) / sizeof(tSlideMenuItem)), + g_psChannelsMenuItems, 0, 0, 1, 0 +}; + +//***************************************************************************** +// +// Define the logging period sub-menu. +// +// (root)-->CONFIG-->PERIOD +// +//***************************************************************************** +#define MENU_CONFIG_PERIOD_DEFAULT 3 +tSlideMenuItem g_psPeriodMenuItems[] = +{ + {"1/32 sec", 0, 0, 0}, {"1/16 sec", 0, 0, 0}, {"1/8 sec", 0, 0, 0}, + {"1/4 sec", 0, 0, 0}, {"1/2 sec", 0, 0, 0}, {"1 sec", 0, 0, 0}, + {"5 sec", 0, 0, 0}, {"10 sec", 0, 0, 0}, {"1 min", 0, 0, 0}, + {"5 min", 0, 0, 0}, {"10 min", 0, 0, 0}, {"1 hour", 0, 0, 0}, + {"5 hour", 0, 0, 0}, {"10 hour", 0, 0, 0}, {"1 day", 0, 0, 0}, +}; +tSlideMenu g_sPeriodMenu = +{ + &g_sConfigMenu, (sizeof(g_psPeriodMenuItems) / sizeof(tSlideMenuItem)), + g_psPeriodMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Maps items from the period menu to match values for RTC. Lower 8 bits +// is subsecond value, upper 24 bits is seconds. The lower 8 bits represent +// subseconds in 7 bits, right-justififed. So 0x01 is 1/128 of a second. +// The order of the values here needs to match what appears in the PERIOD +// menu in menus.c. +// +//***************************************************************************** +static uint32_t g_pui32LogPeriod[] = +{ + 0x00000004, // 1/32 + 0x00000008, // 1/16 + 0x00000010, // 1/8 + 0x00000020, // 1/4 + 0x00000040, // 1/2 + 0x00000100, // 1s + 0x00000500, // 5s + 0x00000A00, // 10s + 0x00003C00, // 1m - 60s + 0x00012C00, // 5m - 300s + 0x00025800, // 10m - 600s + 0x000E1000, // 1hr - 3600s + 0x00465000, // 5hr - 18000s + 0x008CA000, // 10hr - 36000s + 0x01518000, // 1d - 86400s +}; + +//***************************************************************************** +// +// Define the storage options sub-menu. +// +// (root)-->CONFIG-->STORAGE +// +//***************************************************************************** +tSlideMenuItem g_psStorageMenuItems[] = +{ + {"NONE", 0, 0, 0}, {"USB", 0, 0, 0}, {"HOST PC", 0, 0, 0}, + {"FLASH", 0, 0, 0}, +}; +tSlideMenu g_sStorageMenu = +{ + &g_sConfigMenu, (sizeof(g_psStorageMenuItems) / sizeof(tSlideMenuItem)), + g_psStorageMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the sleep option sub-menu. +// +// (root)-->CONFIG-->SLEEP +// +//***************************************************************************** +tSlideMenuItem g_psSleepMenuItems[] = +{ + {"NO", 0, 0, 0}, {"YES", 0, 0, 0}, +}; + +tSlideMenu g_sSleepMenu = +{ + &g_sConfigMenu, (sizeof(g_psSleepMenuItems) / sizeof(tSlideMenuItem)), + g_psSleepMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the view options sub-menu. +// +// (root)-->VIEW +// +//***************************************************************************** +tSlideMenuItem g_psViewMenuItems[] = +{ + {"AIN0-3", 0, (tWidget *)&g_sAINContainerCanvas, ClrDarkGreen}, + {"ACCEL", 0, (tWidget *)&g_sAccelContainerCanvas, ClrDarkBlue}, + {"TEMPERATURE", 0, (tWidget *)&g_sTempContainerCanvas, ClrDarkBlue}, + {"CURRENT", 0, (tWidget *)&g_sCurrentContainerCanvas, ClrBlack}, + {"CLOCK", 0, &g_sClockContainerCanvas.sBase, ClrDarkBlue}, + {"FLASH SPACE", 0, &g_sStatusContainerCanvas.sBase, ClrRed}, +}; +tSlideMenu g_sViewMenu = +{ + &g_psMainMenu, (sizeof(g_psViewMenuItems) / sizeof(tSlideMenuItem)), + g_psViewMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the ERASE confirmation menu. +// +// (root)-->ERASE +// +//***************************************************************************** +tSlideMenuItem g_sConfirmMenuItems[] = +{ + {"ERASE DATA?", 0, &g_sStatusContainerCanvas.sBase, ClrRed}, +}; +tSlideMenu g_sConfirmMenu = +{ + &g_psMainMenu, (sizeof(g_sConfirmMenuItems) / sizeof(tSlideMenuItem)), + g_sConfirmMenuItems, 0, 0, 0, 0 +}; + +//***************************************************************************** +// +// Define the slide menu widget. This is the wigdet that controls and +// displays all the above menus. +// +//***************************************************************************** +SlideMenu(g_sMenuWidget, WIDGET_ROOT, 0, 0, &g_sCFAL96x64x16, 0, 0, 96, 64, + &g_sOffscreenDisplayA, &g_sOffscreenDisplayB, 16, ClrWhite, ClrRed, + ClrBlack, &g_sFontFixed6x8, &g_psMainMenu, 0); + +//***************************************************************************** +// +// This function allows dynamic text fields to be updated. +// +//***************************************************************************** +void +MenuUpdateText(uint32_t ui32TextID, const char *pcText) +{ + // + // If the text field ID is valid, then update the string for that text + // field. The next time the associated widget is painted, the new text + // will be shown. + // + if(ui32TextID < NUM_TEXT_ITEMS) + { + usnprintf(g_pcTextFields[ui32TextID], TEXT_FIELD_LENGTH, "%s", pcText); + } +} + +//***************************************************************************** +// +// Get the state defined by the configuration menu items. +// This function will query the configuration menus to determine the current +// choices for channels, period, etc. These will be stored in the structure +// that was passed to the function. +// +//***************************************************************************** +void +MenuGetState(tConfigState *psState) +{ + int32_t ui32Temp; + + // + // Check the arguments + // + ASSERT(psState); + + if(!psState) + { + return; + } + + // + // Read the various configuration menus and store their state + // + if(SlideMenuFocusItemGet(&g_sSleepMenu) > 0) + { + psState->bSleep = true; + } + else + { + psState->bSleep = false; + } + ui32Temp = SlideMenuFocusItemGet(&g_sStorageMenu);; + psState->ui8Storage = (uint8_t)ui32Temp; + ui32Temp = SlideMenuSelectedGet(&g_sChannelsMenu); + psState->ui16SelectedMask = (uint16_t)ui32Temp; + ui32Temp = g_pui32LogPeriod[SlideMenuFocusItemGet(&g_sPeriodMenu)]; + psState->ui32Period = ui32Temp; +} + +//***************************************************************************** +// +// Set the configuration menu state. +// This function is used to set the state of the configuration menus. This +// is used to "remember" a prior setting when the application is restarted +// or wakes from sleep. +// +//***************************************************************************** +void +MenuSetState(tConfigState *psState) +{ + uint32_t ui32Idx; + + // + // Check the parameters + // + ASSERT(psState); + ASSERT(psState->ui8Storage < CONFIG_STORAGE_CHOICES); + ASSERT(psState->ui32Period & (psState->ui32Period < 0x2000000)); + + // + // Update each configuration menu item to match the new state + // + SlideMenuFocusItemSet(&g_sSleepMenu, psState->bSleep); + SlideMenuFocusItemSet(&g_sStorageMenu, psState->ui8Storage); + SlideMenuSelectedSet(&g_sChannelsMenu, psState->ui16SelectedMask); + + // + // For the period, search the values table to find the index + // + for(ui32Idx = 0; ui32Idx < (sizeof(g_pui32LogPeriod) / sizeof(uint32_t)); + ui32Idx++) + { + if(psState->ui32Period == g_pui32LogPeriod[ui32Idx]) + { + SlideMenuFocusItemSet(&g_sPeriodMenu, ui32Idx); + + // + // Everything has been updated now so return to caller + // + return; + } + } + + // + // If we get to this point, that means that there was no match for the + // period. In that case, set it to default value. + // + SlideMenuFocusItemSet(&g_sPeriodMenu, MENU_CONFIG_PERIOD_DEFAULT); + psState->ui32Period = g_pui32LogPeriod[MENU_CONFIG_PERIOD_DEFAULT]; +} + +//***************************************************************************** +// +// Set the default values for the menu configuration. +// This function is used to initialize the application state configuration with +// some default values for the menu settings. +// +//***************************************************************************** +void +MenuGetDefaultState(tConfigState *psState) +{ + // + // Check the parameters. + // + ASSERT(psState); + + // + // Set default values for all the menu items + // + if(psState) + { + psState->bSleep = false; + psState->ui8Storage = CONFIG_STORAGE_NONE; + psState->ui16SelectedMask = 0; + psState->ui32Period = 0x00000100; // 1 second + } +} + +//***************************************************************************** +// +// Initialize the offscreen buffers and the menu structure. This should be +// called before using the application menus. +// The parameter is a function pointer to a callback function whenever the +// menu widget activates or deactivates a child widget. +// +//***************************************************************************** +void +MenuInit(void (*pfnActive)(tWidget *, tSlideMenuItem *, bool)) +{ + uint32_t ui32Idx; + + // + // Initialize two offscreen displays and assign the palette. These + // buffers are used by the slide menu widget and other parts of the + // application to allow for animation effects. + // + GrOffScreen4BPPInit(&g_sOffscreenDisplayA, g_pui8OffscreenBufA, 96, 64); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayA, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + GrOffScreen4BPPInit(&g_sOffscreenDisplayB, g_pui8OffscreenBufB, 96, 64); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayB, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + + // + // Initialize each of the text fields with a "blank" indication. + // + for(ui32Idx = 0; ui32Idx < NUM_LOG_ITEMS; ui32Idx++) + { + usnprintf(g_pcTextFields[ui32Idx], TEXT_FIELD_LENGTH, "----"); + } + + // + // Set the slide menu widget callback function. + // + SlideMenuActiveCallbackSet(&g_sMenuWidget, pfnActive); +} diff --git a/boards/ek-lm4f232/qs-logger/menus.h b/boards/ek-lm4f232/qs-logger/menus.h new file mode 100644 index 0000000..c961462 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/menus.h @@ -0,0 +1,83 @@ +//***************************************************************************** +// +// menus.h - Prototypes and definitions for application menus. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __MENUS_H__ +#define __MENUS_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Declare off-screen displays, buffers and menus for access by the rest of the +// application. +// +//***************************************************************************** +extern uint8_t g_pui8OffscreenBufA[]; +extern uint8_t g_pui8OffscreenBufB[]; +extern tDisplay g_sOffscreenDisplayA; +extern tDisplay g_sOffscreenDisplayB; +extern tSlideMenuWidget g_sMenuWidget; +extern tStripChartWidget g_sStripChart; +extern tSlideMenu g_sChannelsMenu; +extern tSlideMenu g_sPeriodMenu; +extern tCanvasWidget g_sAINContainerCanvas; +extern tCanvasWidget g_sAccelContainerCanvas; +extern tCanvasWidget g_sTempContainerCanvas; +extern tCanvasWidget g_sCurrentContainerCanvas; +extern tCanvasWidget g_sClockContainerCanvas; +extern tCanvasWidget g_sStatusContainerCanvas; +extern tClockSetWidget g_sClockSetter; +extern struct tm g_sTimeClock; + +//***************************************************************************** +// +// Module function prototypes. +// +//***************************************************************************** +extern void MenuInit(void (*pfnActive)(tWidget *, tSlideMenuItem *, bool)); +extern void MenuUpdateText(uint32_t ui32TextID, const char *pcText); +extern void MenuGetState(tConfigState *pState); +extern void MenuSetState(tConfigState *pState); +extern void MenuGetDefaultState(tConfigState *pState); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/boards/ek-lm4f232/qs-logger/qs-logger.c b/boards/ek-lm4f232/qs-logger/qs-logger.c new file mode 100644 index 0000000..e3e7390 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/qs-logger.c @@ -0,0 +1,1260 @@ +//***************************************************************************** +// +// qs-logger.c - Data logger Quickstart application for EK-LM4F232. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include +#include "driverlib/adc.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/hibernate.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "inc/hw_gpio.h" +#include "inc/hw_hibernate.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" +#include "usblib/usblib.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" +#include "drivers/slidemenuwidget.h" +#include "drivers/stripchartwidget.h" +#include "clocksetwidget.h" +#include "qs-logger.h" +#include "images.h" +#include "menus.h" +#include "acquire.h" +#include "usbstick.h" +#include "usbserial.h" +#include "flashstore.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Data Logger (qs-logger)

      +//! +//! This example application is a data logger. It can be configured to collect +//! data from up to 10 data sources. The possible data sources are: +//! - 4 analog inputs, 0-20V +//! - 3-axis accelerometer +//! - internal and external temperature sensors +//! - processor current consumption +//! +//! The data logger provides a menu navigation that is operated by the buttons +//! on the EK-LM4F232 board (up, down, left, right, select). The data logger +//! can be configured by using the menus. The following items can be +//! configured: +//! - data sources to be logged +//! - sample rate +//! - storage location +//! - sleep modes +//! - clock +//! +//! Using the data logger: +//! +//! Use the CONFIG menu to configure the data logger. The following choices +//! are provided: +//! +//! - CHANNELS - enable specific channels of data that will be logged +//! - PERIOD - select the sample period +//! - STORAGE - select where the collected data will be stored: +//! - FLASH - stored in the internal flash memory +//! - USB - stored on a connected USB memory stick +//! - HOST PC - transmitted to a host PC via USB OTG virtual serial port +//! - NONE - the data will only be displayed and not stored +//! - SLEEP - select whether or not the board sleeps between samples. Sleep +//! mode is allowed when storing to flash at with a period of 1 second or +//! longer. +//! - CLOCK - allows setting of internal time-of-day clock that is used for +//! time stamping of the sampled data +//! +//! Use the START menu to start the data logger running. It will begin +//! collecting and storing the data. It will continue to collect data until +//! stopped by pressing the left button or select button. +//! +//! While the data logger is collecting data and it is not configured to +//! sleep, a simple strip chart showing the collected data will appear on the +//! display. If the data logger is configured to sleep, then no strip chart +//! will be shown. +//! +//! If the data logger is storing to internal flash memory, it will overwrite +//! the oldest data. If storing to a USB memory device it will store data +//! until the device is full. +//! +//! The VIEW menu allows viewing the values of the data sources in numerical +//! format. When viewed this way the data is not stored. +//! +//! The SAVE menu allows saving data that was stored in internal flash memory +//! to a USB stick. The data will be saved in a text file in CSV format. +//! +//! The ERASE menu is used to erase the internal memory so more data can be +//! saved. +//! +//! When the EK-LM4F232 board running qs-logger is connected to a host PC via +//! the USB OTG connection for the first time, Windows will prompt for a device +//! driver for the board. +//! This can be found in /ti/TivaWare_C_Series-x.x/windows_drivers +//! assuming you installed the software in the default folder. +//! +//! A companion Windows application, logger, can be found in the +//! /ti/TivaWare_C_Series-x.x/tools/bin directory. When the data logger's +//! STORAGE option is set to "HOST PC" and the board is connected to a PC +//! via the USB OTG connection, captured data will be transfered back to the PC +//! using the virtual serial port that the EK board offers. When the logger +//! application is run, it will search for the first connected EK-LM4F232 board +//! and display any sample data received. The application also offers the +//! option to log the data to a file on the PC. +// +//***************************************************************************** + +//***************************************************************************** +// +// The clock rate for the SysTick interrupt and a counter of system clock +// ticks. The SysTick interrupt is used for basic timing in the application. +// +//***************************************************************************** +#define CLOCK_RATE 100 +#define MS_PER_SYSTICK (1000 / CLOCK_RATE) +static volatile uint32_t g_ui32TickCount; +uint32_t g_ui32LastTick = 0; + +//***************************************************************************** +// +// A widget handle of the widget that should receive the focus of any button +// events. +// +//***************************************************************************** +static uint32_t g_ui32KeyFocusWidgetHandle; + +//***************************************************************************** +// +// Tracks the data logging state. +// +//***************************************************************************** +typedef enum +{ + eSTATE_IDLE, + eSTATE_LOGGING, + eSTATE_VIEWING, + eSTATE_SAVING, + eSTATE_ERASING, + eSTATE_FREEFLASH, + eSTATE_CLOCKSET, + eSTATE_CLOCKEXIT, +} tLoggerState; +static tLoggerState g_iLoggerState = eSTATE_IDLE; + +//***************************************************************************** +// +// The configuration of the application. This holds the information that +// will need to be saved if sleeping is used. +// +//***************************************************************************** +static tConfigState g_sConfigState; + +//***************************************************************************** +// +// The current state of USB OTG in the system based on the detected mode. +// +//***************************************************************************** +volatile tUSBMode g_iCurrentUSBMode = eUSBModeNone; + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// Forward declaration of callback function used for clock setter widget. +// +//***************************************************************************** +static void ClockSetOkCallback(tWidget *pWidget, bool bOk); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Provide a simple function so other parts of the application can update +// a status display. +// +//***************************************************************************** +void +SetStatusText(const char *pcTitle, const char *pcLine1, const char *pcLine2, + const char *pcLine3) +{ + static const char pcBlankLine[] = " "; + + // + // Check to see if each parameter was passed, and if so then update its + // text field on the status dislay. + // + pcTitle = pcTitle ? pcTitle : pcBlankLine; + MenuUpdateText(TEXT_ITEM_STATUS_TITLE, pcTitle); + pcLine1 = pcLine1 ? pcLine1 : pcBlankLine; + MenuUpdateText(TEXT_ITEM_STATUS1, pcLine1); + pcLine2 = pcLine2 ? pcLine2 : pcBlankLine; + MenuUpdateText(TEXT_ITEM_STATUS2, pcLine2); + pcLine3 = pcLine3 ? pcLine3 : pcBlankLine; + MenuUpdateText(TEXT_ITEM_STATUS3, pcLine3); + + // + // Force a repaint after all the status text fields have been updated. + // + WidgetPaint(WIDGET_ROOT); + WidgetMessageQueueProcess(); +} +//***************************************************************************** +// +// Handles the SysTick timeout interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Increment the tick count. + // + g_ui32TickCount++; +} + +//***************************************************************************** +// +// This function returns the number of ticks since the last time this function +// was called. +// +//***************************************************************************** +uint32_t +GetTickms(void) +{ + uint32_t ui32RetVal, ui32Saved; + + ui32RetVal = g_ui32TickCount; + ui32Saved = ui32RetVal; + + if(ui32Saved > g_ui32LastTick) + { + ui32RetVal = ui32Saved - g_ui32LastTick; + } + else + { + ui32RetVal = g_ui32LastTick - ui32Saved; + } + + // + // This could miss a few milliseconds but the timings here are on a + // much larger scale. + // + g_ui32LastTick = ui32Saved; + + // + // Return the number of milliseconds since the last time this was called. + // + return(ui32RetVal * MS_PER_SYSTICK); +} + +//***************************************************************************** +// +// Callback function for USB OTG mode changes. +// +//***************************************************************************** +static void +ModeCallback(uint32_t ui32Index, tUSBMode iMode) +{ + // + // Save the new mode. + // + g_iCurrentUSBMode = iMode; + + // + // Mode-specific handling code could go here. + // + switch(iMode) + { + case eUSBModeHost: + { + break; + } + case eUSBModeDevice: + { + break; + } + case eUSBModeNone: + { + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// Gets the logger configuration from battery backed memory. +// The configuration is read from the memory in the Hibernate module. +// It is checked for validity. If found to be valid the function returns a +// 0. If not valid, then it returns non-zero. +// +//***************************************************************************** +static int32_t +GetSavedState(tConfigState *psState) +{ + uint32_t ui32StateLen; + uint16_t ui16Crc16; + + // + // Check the arguments + // + ASSERT(psState); + if(!psState) + { + return(1); + } + + // + // Initialize locals. + // + ui32StateLen = sizeof(tConfigState) / 4; + + // + // Read a block from hibernation memory into the application state + // structure. + // + HibernateDataGet((uint32_t *)psState, ui32StateLen); + + // + // Check first to see if the "cookie" value is correct. + // + if(psState->ui32Cookie != STATE_COOKIE) + { + return(1); + } + + // + // Find the 16-bit CRC of the block. The CRC is stored in the last + // location, so subtract 1 word from the count. + // + ui16Crc16 = ROM_Crc16Array(ui32StateLen - 1, (const uint32_t *)psState); + + // + // If the CRC does not match, then the block is not good. + // + if(psState->ui32Crc16 != (uint32_t)ui16Crc16) + { + return(1); + } + + // + // At this point the state structure that was retrieved from the + // battery backed memory has been validated, so return it as a valid + // logger state configuration. + // + return(0); +} + +//***************************************************************************** +// +// Stores the logger configuration to battery backed memory in the +// Hibernation module. The configuration is saved with a cookie value and +// a CRC in order to ensure validity. +// +//***************************************************************************** +static void +SetSavedState(tConfigState *psState) +{ + uint32_t ui32StateLen; + uint16_t ui16Crc16; + + // + // Check the arguments. + // + ASSERT(psState); + + // + // Initialize locals. + // + ui32StateLen = sizeof(tConfigState) / 4; + + if(psState) + { + // + // Write the cookie value to the block + // + psState->ui32Cookie = STATE_COOKIE; + + // + // Find the 16-bit CRC of the block. The CRC is stored in the last + // location, so subtract 1 word from the count. + // + ui16Crc16 = ROM_Crc16Array(ui32StateLen - 1, + (const uint32_t *)psState); + + // + // Save the computed CRC into the structure. + // + psState->ui32Crc16 = (uint32_t)ui16Crc16; + + // + // Now write the entire block to the Hibernate memory. + // + HibernateDataSet((uint32_t *)psState, ui32StateLen); + } +} + +//***************************************************************************** +// +// Populate the application configuration with default values. +// +//***************************************************************************** +static void +GetDefaultState(tConfigState *psState) +{ + // + // Check the arguments + // + ASSERT(psState); + if(psState) + { + // + // get the default values from the menu system + // + MenuGetDefaultState(psState); + + // + // Set the filename to a null string + // + psState->pcFilename[0] = 0; + + // + // Set bogus address for flash storage + // + psState->ui32FlashStore = 0; + + // + // Turn off sleep logging + // + psState->ui32SleepLogging = 0; + } +} + +//***************************************************************************** +// +// Sends a button press message to whichever widget has the button focus. +// +//***************************************************************************** +static void +SendWidgetKeyMessage(uint32_t ui32Msg) +{ + WidgetMessageQueueAdd(WIDGET_ROOT, ui32Msg, g_ui32KeyFocusWidgetHandle, 0, + 1, 1); +} + +//***************************************************************************** +// +// Callback function from the menu widget. This function is called whenever +// the menu is used to activate a child widget that is associated with the +// menu. It is also called when the widget is deactivated and control is +// returned to the menu widget. It can be used to trigger different actions +// depending on which menus are chosen, and to track the state of the +// application and control focus for the user interface. +// +// This function is called in the context of widget tree message processing +// so care should be taken if doing any operation that affects the display +// or widget tree. +// +//***************************************************************************** +static void +WidgetActivated(tWidget *psWidget, tSlideMenuItem *psMenuItem, bool bActivated) +{ + char *pcMenuText; + uint32_t ui32RTC; + + // + // Handle the activation or deactivation of the strip chart. The strip + // chart widget is activated when the user selects the START menu. + // + if(psWidget == &g_sStripChart.sBase) + { + // + // If the strip chart is activated, start the logger running. + // + if(bActivated) + { + // + // Get the current state of the menus + // + MenuGetState(&g_sConfigState); + + // + // Save the state in battery backed memory + // + SetSavedState(&g_sConfigState); + + // + // Start logger and update the logger state + // + AcquireStart(&g_sConfigState); + g_iLoggerState = eSTATE_LOGGING; + } + else + { + // + // If the strip chart is deactivated, stop the logger. + // + AcquireStop(); + g_iLoggerState = eSTATE_IDLE; + } + } + else if((psWidget == &g_sAINContainerCanvas.sBase) || + (psWidget == &g_sAccelContainerCanvas.sBase) || + (psWidget == &g_sCurrentContainerCanvas.sBase) || + (psWidget == &g_sClockContainerCanvas.sBase) || + (psWidget == &g_sTempContainerCanvas.sBase)) + { + // + // Handle the activation or deactivation of any of the container + // canvas that is used for showing the acquired data as a numerical + // display. This happens when the VIEW menu is used. + // + // A viewer has been activated. + // + if(bActivated) + { + static tConfigState sLocalState; + + // + // Get the current menu configuration state and save it in a local + // storage. + // + MenuGetState(&sLocalState); + + // + // Modify the state to set values that are suitable for using + // with the viewer. The acquisition rate is set to 1/2 second + // and all channels are selected. The storage medium is set to + // "viewer" so the acquistion module will write the value of + // acquired data to the appropriate viewing canvas. + // + sLocalState.ui8Storage = CONFIG_STORAGE_VIEWER; + sLocalState.ui32Period = 0x00000040; + sLocalState.ui16SelectedMask = 0x3ff; + + // + // Start the acquisition module running. + // + AcquireStart(&sLocalState); + g_iLoggerState = eSTATE_VIEWING; + } + else + { + // + // The viewer has been deactivated so turn off the acquisition + // module. + // + AcquireStop(); + g_iLoggerState = eSTATE_IDLE; + } + } + else if(psWidget == &g_sStatusContainerCanvas.sBase) + { + // + // Handle the case when a status display has been activated. This can + // occur when any of several menu items are selected. + // + // Get pointer to the text of the current menu item. + // + if(psMenuItem) + { + pcMenuText = psMenuItem->pcText; + } + else + { + return; + } + + // + // If activated from the SAVE menu, then the flash data needs to be + // saved to USB stick. Enter the saving state. + // + if(!strcmp(pcMenuText, "SAVE")) + { + if(bActivated) + { + g_iLoggerState = eSTATE_SAVING; + } + else + { + g_iLoggerState = eSTATE_IDLE; + } + } + else if(!strcmp(pcMenuText, "ERASE DATA?")) + { + // + // If activated from the ERASE menu, then the flash data needs to + // be erased. Enter the erasing state. + // + if(bActivated) + { + g_iLoggerState = eSTATE_ERASING; + } + else + { + g_iLoggerState = eSTATE_IDLE; + } + } + else if(!strcmp(pcMenuText, "FLASH SPACE")) + { + // + // If activated from the FLASH SPACE menu, then the user will be + // shown a report on the amount of free space in flash. Enter the + // reporting state. + // + if(bActivated) + { + g_iLoggerState = eSTATE_FREEFLASH; + } + else + { + g_iLoggerState = eSTATE_IDLE; + } + } + } + else if(psWidget == &g_sClockSetter.sBase) + { + // + // Handle the activation of the clock setting widget. Deactivation is + // handled through a separate callback. + // + // If the clock setter is activated, load the time structure fields. + // + if(bActivated) + { + // + // Get the current time in seconds from the RTC. + // + ui32RTC = HibernateRTCGet(); + + // + // Convert the RTC time to a time structure. + // + ulocaltime(ui32RTC, &g_sTimeClock); + + // + // Set the callback that will be called when the clock setting + // widget is deactivated. Since the clock setting widget needs + // to take over the focus for button events, it uses a separate + // callback when it is finsihed. + // + ClockSetCallbackSet((tClockSetWidget *)psWidget, + ClockSetOkCallback); + + // + // Give the clock setter widget focus for the button events + // + g_ui32KeyFocusWidgetHandle = (uint32_t)psWidget; + g_iLoggerState = eSTATE_CLOCKSET; + } + } +} + +//***************************************************************************** +// +// This function is called when the user clicks OK or CANCEL in the clock +// setting widget. +// +//***************************************************************************** +static void +ClockSetOkCallback(tWidget *psWidget, bool bOk) +{ + uint32_t ui32RTC; + + // + // Only update the RTC if the OK button was selected. + // + if(bOk) + { + // + // Convert the time structure that was altered by the clock setting + // widget into seconds. + // + ui32RTC = umktime(&g_sTimeClock); + + // + // If the conversion was valid, then write the updated clock to the + // Hibernate RTC. + // + if(ui32RTC != (uint32_t)(-1)) + { + HibernateRTCSet(ui32RTC); + } + } + + // + // Set the state to clock exit so some cleanup can be done from the + // main loop. + // + g_iLoggerState = eSTATE_CLOCKEXIT; +} + +//***************************************************************************** +// +// Initialize and operate the data logger. +// +//***************************************************************************** +int +main(void) +{ + tContext sDisplayContext, sBufferContext; + uint32_t ui32HibIntStatus, ui32SysClock, ui32LastTickCount; + bool bSkipSplash; + uint8_t ui8ButtonState, ui8ButtonChanged; + uint_fast8_t ui8X, ui8Y; + + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + MAP_FPULazyStackingEnable(); + + // + // Set the clocking to run at 50 MHz. + // + MAP_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + ui32SysClock = MAP_SysCtlClockGet(); + + // + // Initialize locals. + // + bSkipSplash = false; + ui32LastTickCount = 0; + + // + // Initialize the data acquisition module. This initializes the ADC + // hardware. + // + AcquireInit(); + + // + // Enable access to the hibernate peripheral. If the hibernate peripheral + // was already running then this will have no effect. + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); + + // + // Check to see if the hiberate module is already active and if so then + // read the saved configuration state. If both are okay, then proceed + // to check and see if we are logging data using sleep mode. + // + if(HibernateIsActive() && !GetSavedState(&g_sConfigState)) + { + // + // Read the status of the hibernate module. + // + ui32HibIntStatus = HibernateIntStatus(1); + + // + // If this is a pin wake, that means the user pressed the select + // button and we should terminate the sleep logging. In this case + // we will fall out of this conditional section, and go through the + // normal startup below, but skipping the splash screen so the user + // gets immediate response. + // + if(ui32HibIntStatus & HIBERNATE_INT_PIN_WAKE) + { + // + // Clear the interrupt flag so it is not seen again until another + // wake. + // + HibernateIntClear(HIBERNATE_INT_PIN_WAKE); + bSkipSplash = true; + } + + // + // Otherwise if we are waking from hibernate and it was not a pin + // wake, then it must be from RTC match. Check to see if we are + // sleep logging and if so then go through an abbreviated startup + // in order to collect the data and go back to sleep. + // + else if(g_sConfigState.ui32SleepLogging && + (ui32HibIntStatus & HIBERNATE_INT_RTC_MATCH_0)) + { + // + // Start logger and pass the configuration. The logger should + // configure itself to take one sample. + // + AcquireStart(&g_sConfigState); + g_iLoggerState = eSTATE_LOGGING; + + // + // Enter a forever loop to run the acquisition. This will run + // until a new sample has been taken and stored. + // + while(!AcquireRun()) + { + } + + // + // Getting here means that a data acquisition was performed and we + // can now go back to sleep. Save the configuration and then + // activate the hibernate. + // + SetSavedState(&g_sConfigState); + + // + // Set wake condition on pin-wake or RTC match. Then put the + // processor in hibernation. + // + HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC); + HibernateRequest(); + + // + // Hibernating takes a finite amount of time to occur, so wait + // here forever until hibernate activates and the processor + // power is removed. + // + for(;;) + { + } + } + + // + // Otherwise, this was not a pin wake, and we were not sleep logging, + // so just fall out of this conditional and go through the normal + // startup below. + // + } + else + { + // + // In this case, either the hibernate module was not already active, or + // the saved configuration was not valid. Initialize the configuration + // to the default state and then go through the normal startup below. + // + GetDefaultState(&g_sConfigState); + } + + // + // Enable the Hibernate module to run. + // + HibernateEnableExpClk(SysCtlClockGet()); + + // + // The hibernate peripheral trim register must be set per silicon + // erratum 2.1 + // + HibernateRTCTrimSet(0x7FFF); + + // + // Start the RTC running. If it was already running then this will have + // no effect. + // + HibernateRTCEnable(); + + // + // In case we were sleep logging and are now finished (due to user + // pressing select button), then disable sleep logging so it doesnt + // try to start up again. + // + g_sConfigState.ui32SleepLogging = 0; + SetSavedState(&g_sConfigState); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the buttons driver. + // + ButtonsInit(); + + // + // Pass the restored state to the menu system. + // + MenuSetState(&g_sConfigState); + + // + // Enable the USB peripheral + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Configure the required pins for USB operation. + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + MAP_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + MAP_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + MAP_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + MAP_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Erratum workaround for silicon revision A1. VBUS must have pull-down. + // + if(CLASS_IS_TM4C123 && REVISION_IS_A1) + { + HWREG(GPIO_PORTB_BASE + GPIO_O_PDR) |= GPIO_PIN_1; + } + + // + // Initialize the USB stack mode and pass in a mode callback. + // + USBStackModeSet(0, eUSBModeOTG, ModeCallback); + + // + // Initialize the stack to be used with USB stick. + // + USBStickInit(); + + // + // Initialize the stack to be used as a serial device. + // + USBSerialInit(); + + // + // Initialize the USB controller for dual mode operation with a 2ms polling + // rate. + // + USBOTGModeInit(0, 2000, g_pui8HCDPool, HCD_MEMORY_SIZE); + + // + // Initialize the menus module. This module will control the user + // interface menuing system. + // + MenuInit(WidgetActivated); + + // + // Configure SysTick to periodically interrupt. + // + g_ui32TickCount = 0; + MAP_SysTickPeriodSet(ui32SysClock / CLOCK_RATE); + MAP_SysTickIntEnable(); + MAP_SysTickEnable(); + + // + // Initialize the display context and another context that is used + // as an offscreen drawing buffer for display animation effect + // + GrContextInit(&sDisplayContext, &g_sCFAL96x64x16); + GrContextInit(&sBufferContext, &g_sOffscreenDisplayA); + + // + // Show the splash screen if we are not skipping it. The only reason to + // skip it is if the application was in sleep-logging mode and the user + // just waked it up with the select button. + // + if(!bSkipSplash) + { + const uint8_t *pui8SplashLogo = g_pui8Image_TI_Black; + + // + // Draw the TI logo on the display. Use an animation effect where the + // logo will "slide" onto the screen. Allow select button to break + // out of animation. + // + for(ui8X = 0; ui8X < 96; ui8X++) + { + if(ButtonsPoll(0, 0) & SELECT_BUTTON) + { + break; + } + GrImageDraw(&sDisplayContext, pui8SplashLogo, 95 - ui8X, 0); + } + + // + // Leave the logo on the screen for a long duration. Monitor the + // buttons so that if the user presses the select button, the logo + // display is terminated and the application starts immediately. + // + while(g_ui32TickCount < 400) + { + if(ButtonsPoll(0, 0) & SELECT_BUTTON) + { + break; + } + } + + // + // Extended splash sequence + // + if(ButtonsPoll(0, 0) & UP_BUTTON) + { + for(ui8X = 0; ui8X < 96; ui8X += 4) + { + GrImageDraw(&sDisplayContext, + g_ppui8Image_Splash[(ui8X / 4) & 3], + (int32_t)ui8X - 96L, 0); + GrImageDraw(&sDisplayContext, pui8SplashLogo, ui8X, 0); + MAP_SysCtlDelay(ui32SysClock / 12); + } + MAP_SysCtlDelay(ui32SysClock / 3); + pui8SplashLogo = g_ppui8Image_Splash[4]; + GrImageDraw(&sDisplayContext, pui8SplashLogo, 0, 0); + MAP_SysCtlDelay(ui32SysClock / 12); + } + + // + // Draw the initial menu into the offscreen buffer. + // + SlideMenuDraw(&g_sMenuWidget, &sBufferContext, 0); + + // + // Now, draw both the TI logo splash screen (from above) and the initial + // menu on the screen at the same time, moving the coordinates so that + // the logo "slides" off the display and the menu "slides" onto the + // display. + // + for(ui8Y = 0; ui8Y < 64; ui8Y++) + { + GrImageDraw(&sDisplayContext, pui8SplashLogo, 0, -ui8Y); + GrImageDraw(&sDisplayContext, g_pui8OffscreenBufA, 0, 63 - ui8Y); + } + } + + // + // Add the menu widget to the widget tree and send an initial paint + // request. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sMenuWidget); + WidgetPaint(WIDGET_ROOT); + + // + // Set the focus handle to the menu widget. Any button events will be + // sent to this widget + // + g_ui32KeyFocusWidgetHandle = (uint32_t)&g_sMenuWidget; + + // + // Forever loop to run the application + // + while(1) + { + + // + // Each time the timer tick occurs, process any button events. + // + if(g_ui32TickCount != ui32LastTickCount) + { + // + // Remember last tick count + // + ui32LastTickCount = g_ui32TickCount; + + // + // Read the debounced state of the buttons. + // + ui8ButtonState = ButtonsPoll(&ui8ButtonChanged, 0); + + // + // Pass any button presses through to the widget message + // processing mechanism. The widget that has the button event + // focus (probably the menu widget) will catch these button events. + // + if(BUTTON_PRESSED(SELECT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_SELECT); + } + if(BUTTON_PRESSED(UP_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_UP); + } + if(BUTTON_PRESSED(DOWN_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_DOWN); + } + if(BUTTON_PRESSED(LEFT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_LEFT); + } + if(BUTTON_PRESSED(RIGHT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_RIGHT); + } + } + + // + // Tell the OTG library code how much time has passed in milliseconds + // since the last call. + // + USBOTGMain(GetTickms()); + + // + // Call functions as needed to keep the host or device mode running. + // + if(g_iCurrentUSBMode == eUSBModeDevice) + { + USBSerialRun(); + } + else if(g_iCurrentUSBMode == eUSBModeHost) + { + USBStickRun(); + } + + // + // If in the logging state, then call the logger run function. This + // keeps the data acquisition running. + // + if((g_iLoggerState == eSTATE_LOGGING) || + (g_iLoggerState == eSTATE_VIEWING)) + { + if(AcquireRun() && g_sConfigState.ui32SleepLogging) + { + // + // If sleep logging is enabled, then at this point we have + // stored the first data item, now save the state and start + // hibernation. Wait for the power to be cut. + // + SetSavedState(&g_sConfigState); + HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC); + HibernateRequest(); + for(;;) + { + } + } + + // + // If viewing instead of logging then request a repaint to keep + // the viewing window updated. + // + if(g_iLoggerState == eSTATE_VIEWING) + { + WidgetPaint(WIDGET_ROOT); + } + } + + // + // If in the saving state, then save data from flash storage to + // USB stick. + // + if(g_iLoggerState == eSTATE_SAVING) + { + // + // Save data from flash to USB + // + FlashStoreSave(); + + // + // Return to idle state + // + g_iLoggerState = eSTATE_IDLE; + } + + // + // If in the erasing state, then erase the data stored in flash. + // + if(g_iLoggerState == eSTATE_ERASING) + { + // + // Save data from flash to USB + // + FlashStoreErase(); + + // + // Return to idle state + // + g_iLoggerState = eSTATE_IDLE; + } + + // + // If in the flash reporting state, then show the report of the amount + // of used and free flash memory. + // + if(g_iLoggerState == eSTATE_FREEFLASH) + { + // + // Report free flash space + // + FlashStoreReport(); + + // + // Return to idle state + // + g_iLoggerState = eSTATE_IDLE; + } + + // + // If we are exiting the clock setting widget, that means that control + // needs to be given back to the menu system. + // + if(g_iLoggerState == eSTATE_CLOCKEXIT) + { + // + // Give the button event focus back to the menu system + // + g_ui32KeyFocusWidgetHandle = (uint32_t)&g_sMenuWidget; + + // + // Send a button event to the menu widget that means the left + // key was pressed. This signals the menu widget to deactivate + // the current child widget (which was the clock setting wigdet). + // This will cause the menu widget to slide the clock set widget + // off the screen and resume control of the display. + // + SendWidgetKeyMessage(WIDGET_MSG_KEY_LEFT); + g_iLoggerState = eSTATE_IDLE; + } + + // + // Process any new messages that are in the widget queue. This keeps + // the user interface running. + // + WidgetMessageQueueProcess(); + } +} diff --git a/boards/ek-lm4f232/qs-logger/qs-logger.ewd b/boards/ek-lm4f232/qs-logger/qs-logger.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/qs-logger.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/qs-logger/qs-logger.ewp b/boards/ek-lm4f232/qs-logger/qs-logger.ewp new file mode 100644 index 0000000..7250522 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/qs-logger.ewp @@ -0,0 +1,845 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\acquire.c + + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\clocksetwidget.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\flashstore.c + + + $PROJ_DIR$\images.c + + + $PROJ_DIR$\menus.c + + + $PROJ_DIR$\qs-logger.c + + + $PROJ_DIR$\..\drivers\slidemenuwidget.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\stripchartmanager.c + + + $PROJ_DIR$\..\drivers\stripchartwidget.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_serial_structs.c + + + $PROJ_DIR$\usbserial.c + + + $PROJ_DIR$\usbstick.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-lm4f232/qs-logger/qs-logger.h b/boards/ek-lm4f232/qs-logger/qs-logger.h new file mode 100644 index 0000000..a8d7878 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/qs-logger.h @@ -0,0 +1,180 @@ +//***************************************************************************** +// +// qs-logger.h - Defines data types used in the data logger application. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __QS_LOGGER_H__ +#define __QS_LOGGER_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines the order of data items to log. It must match the +// order that they appear in the "CHANNELS" menu (see menus.c), and also +// the order they are stored in the ADC data buffer (see acquire.c). +// +//***************************************************************************** +#define LOG_ITEM_USER0 0 +#define LOG_ITEM_USER1 1 +#define LOG_ITEM_USER2 2 +#define LOG_ITEM_USER3 3 +#define LOG_ITEM_ACCELX 4 +#define LOG_ITEM_ACCELY 5 +#define LOG_ITEM_ACCELZ 6 +#define LOG_ITEM_EXTTEMP 7 +#define LOG_ITEM_INTTEMP 8 +#define LOG_ITEM_CURRENT 9 +#define NUM_LOG_ITEMS 10 + +//***************************************************************************** +// +// These are additional definitions of items that may be displayed on the +// screen that are not acquired data. These are used for updating dynamic +// text screens on the display. +// +//***************************************************************************** +#define TEXT_ITEM_STATUS1 10 +#define TEXT_ITEM_STATUS2 11 +#define TEXT_ITEM_STATUS3 12 +#define TEXT_ITEM_STATUS_TITLE 13 +#define TEXT_ITEM_DATE 14 +#define TEXT_ITEM_TIME 15 +#define NUM_TEXT_ITEMS 16 + +//***************************************************************************** +// +// A structure that defines a data record. This is the binary format of the +// acquired data that will be stored. +// +//***************************************************************************** +typedef struct +{ + uint32_t ui32Seconds; // 32 bits of seconds + uint16_t ui16Subseconds; // 15 bits of subseconds + uint16_t ui16ItemMask; // 16 bits means maximum 16 items + int16_t pi16Items[]; +} +tLogRecord; + +//***************************************************************************** +// +// This structure defines a container to hold the state of all the +// configuration items. It is used both for passing configuration +// between modules and for persistent storage of the configuration. +// +//***************************************************************************** +typedef struct +{ + // + // A value used to identify this structure + // + uint32_t ui32Cookie; + + // + // A flag to indicate if the data logger is current logging data + // using the sleep mode. The data logger uses this to determine if + // it needs to continue taking samples once it wakes from hibernate. + // This is a 32-bit type just to keep the entire struct 32-bit aligned. + // + uint32_t ui32SleepLogging; + + // + // The period for sampling data. It is stored as a 24.8 seconds.frac + // format. The lower 8 bits represent power-of-2 fractional seconds + // with a resolution of 1/128 seconds (only lower 7 bits are used). + // + uint32_t ui32Period; + + // + // Saved location for writing records to flash. + // + uint32_t ui32FlashStore; + + // + // The name of the USB file currently opened for logging + // + char pcFilename[8]; + + // + // The bit mask of the channels selected for logging. + // + uint16_t ui16SelectedMask; + + // + // A flag indicating whether the data logger should sleep between samples. + // + bool bSleep; + + // + // A value that is used to select the storage medium. + // + uint8_t ui8Storage; + + // + // A checksum for the structure + // + uint32_t ui32Crc16; +} +tConfigState; + +#define STATE_COOKIE 0x0355AAC0 + +//***************************************************************************** +// +// The values indicating which storage medium is to be used for logging data. +// +//***************************************************************************** +#define CONFIG_STORAGE_NONE 0 +#define CONFIG_STORAGE_USB 1 +#define CONFIG_STORAGE_HOSTPC 2 +#define CONFIG_STORAGE_FLASH 3 +#define CONFIG_STORAGE_VIEWER 4 +#define CONFIG_STORAGE_CHOICES 5 + +//***************************************************************************** +// +// Function prototypes. +// +//***************************************************************************** +extern void SetStatusText(const char *pcTitle, const char *pcLine1, + const char *pcLine2, const char *pcLine3); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __QS_LOGGER_H__ diff --git a/boards/ek-lm4f232/qs-logger/qs-logger.icf b/boards/ek-lm4f232/qs-logger/qs-logger.icf new file mode 100644 index 0000000..50dc88b --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/qs-logger.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// qs-logger.icf - Linker configuration file for qs-logger. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/qs-logger/qs-logger.ld b/boards/ek-lm4f232/qs-logger/qs-logger.ld new file mode 100644 index 0000000..d76e251 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/qs-logger.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * qs-logger.ld - Linker configuration file for qs-logger. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/qs-logger/qs-logger.sct b/boards/ek-lm4f232/qs-logger/qs-logger.sct new file mode 100644 index 0000000..198f208 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/qs-logger.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; qs-logger.sct - Linker configuration file for qs-logger. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/qs-logger/qs-logger.uvopt b/boards/ek-lm4f232/qs-logger/qs-logger.uvopt new file mode 100644 index 0000000..e848d39 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/qs-logger.uvopt @@ -0,0 +1,555 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + qs-logger + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\acquire.c + acquire.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\clocksetwidget.c + clocksetwidget.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + fat_usbmsc.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\flashstore.c + flashstore.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\images.c + images.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\menus.c + menus.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\qs-logger.c + qs-logger.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\slidemenuwidget.c + slidemenuwidget.c + + + 1 + 12 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\stripchartmanager.c + stripchartmanager.c + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\stripchartwidget.c + stripchartwidget.c + + + 1 + 15 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 16 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_serial_structs.c + usb_serial_structs.c + + + 1 + 17 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usbserial.c + usbserial.c + + + 1 + 18 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usbstick.c + usbstick.c + + + 1 + 19 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 20 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 21 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 22 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 23 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/qs-logger/qs-logger.uvproj b/boards/ek-lm4f232/qs-logger/qs-logger.uvproj new file mode 100644 index 0000000..a3150d8 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/qs-logger.uvproj @@ -0,0 +1,519 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + qs-logger + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + qs-logger + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\qs-logger.bin .\rvmdk\qs-logger.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + qs-logger.sct + + + --entry Reset_Handler + + + + + + + + Source + + + acquire.c + 1 + .\acquire.c + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + clocksetwidget.c + 1 + .\clocksetwidget.c + + + fat_usbmsc.c + 1 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + flashstore.c + 1 + .\flashstore.c + + + images.c + 1 + .\images.c + + + menus.c + 1 + .\menus.c + + + qs-logger.c + 1 + .\qs-logger.c + + + slidemenuwidget.c + 1 + ..\drivers\slidemenuwidget.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + stripchartmanager.c + 1 + .\stripchartmanager.c + + + stripchartwidget.c + 1 + ..\drivers\stripchartwidget.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_serial_structs.c + 1 + .\usb_serial_structs.c + + + usbserial.c + 1 + .\usbserial.c + + + usbstick.c + 1 + .\usbstick.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/qs-logger/qs-logger_ccs.cmd b/boards/ek-lm4f232/qs-logger/qs-logger_ccs.cmd new file mode 100644 index 0000000..f64402c --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/qs-logger_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * qs-logger_ccs.cmd - CCS linker configuration file for qs-logger. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/qs-logger/readme.txt b/boards/ek-lm4f232/qs-logger/readme.txt new file mode 100644 index 0000000..1877536 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/readme.txt @@ -0,0 +1,93 @@ +Data Logger + +This example application is a data logger. It can be configured to collect +data from up to 10 data sources. The possible data sources are: +- 4 analog inputs, 0-20V +- 3-axis accelerometer +- internal and external temperature sensors +- processor current consumption + +The data logger provides a menu navigation that is operated by the buttons +on the EK-LM4F232 board (up, down, left, right, select). The data logger +can be configured by using the menus. The following items can be +configured: +- data sources to be logged +- sample rate +- storage location +- sleep modes +- clock + +Using the data logger: + +Use the CONFIG menu to configure the data logger. The following choices +are provided: + +- CHANNELS - enable specific channels of data that will be logged +- PERIOD - select the sample period +- STORAGE - select where the collected data will be stored: + - FLASH - stored in the internal flash memory + - USB - stored on a connected USB memory stick + - HOST PC - transmitted to a host PC via USB OTG virtual serial port + - NONE - the data will only be displayed and not stored +- SLEEP - select whether or not the board sleeps between samples. Sleep +mode is allowed when storing to flash at with a period of 1 second or +longer. +- CLOCK - allows setting of internal time-of-day clock that is used for +time stamping of the sampled data + +Use the START menu to start the data logger running. It will begin +collecting and storing the data. It will continue to collect data until +stopped by pressing the left button or select button. + +While the data logger is collecting data and it is not configured to +sleep, a simple strip chart showing the collected data will appear on the +display. If the data logger is configured to sleep, then no strip chart +will be shown. + +If the data logger is storing to internal flash memory, it will overwrite +the oldest data. If storing to a USB memory device it will store data +until the device is full. + +The VIEW menu allows viewing the values of the data sources in numerical +format. When viewed this way the data is not stored. + +The SAVE menu allows saving data that was stored in internal flash memory +to a USB stick. The data will be saved in a text file in CSV format. + +The ERASE menu is used to erase the internal memory so more data can be +saved. + +When the EK-LM4F232 board running qs-logger is connected to a host PC via +the USB OTG connection for the first time, Windows will prompt for a device +driver for the board. +This can be found in /ti/TivaWare_C_Series-x.x/windows_drivers +assuming you installed the software in the default folder. + +A companion Windows application, logger, can be found in the +/ti/TivaWare_C_Series-x.x/tools/bin directory. When the data logger's + STORAGE option is set to "HOST PC" and the board is connected to a PC +via the USB OTG connection, captured data will be transfered back to the PC +using the virtual serial port that the EK board offers. When the logger +application is run, it will search for the first connected EK-LM4F232 board +and display any sample data received. The application also offers the +option to log the data to a file on the PC. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/qs-logger/rvmdk/qs-logger.axf b/boards/ek-lm4f232/qs-logger/rvmdk/qs-logger.axf new file mode 100644 index 0000000..975cc12 Binary files /dev/null and b/boards/ek-lm4f232/qs-logger/rvmdk/qs-logger.axf differ diff --git a/boards/ek-lm4f232/qs-logger/rvmdk/qs-logger.bin b/boards/ek-lm4f232/qs-logger/rvmdk/qs-logger.bin new file mode 100644 index 0000000..7c7687b Binary files /dev/null and b/boards/ek-lm4f232/qs-logger/rvmdk/qs-logger.bin differ diff --git a/boards/ek-lm4f232/qs-logger/startup_ccs.c b/boards/ek-lm4f232/qs-logger/startup_ccs.c new file mode 100644 index 0000000..ae2a97c --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/startup_ccs.c @@ -0,0 +1,305 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void ADC0SS0Handler(void); +extern void RTCHandler(void); +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + ADC0SS0Handler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + RTCHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/qs-logger/startup_ewarm.c b/boards/ek-lm4f232/qs-logger/startup_ewarm.c new file mode 100644 index 0000000..d95fb5e --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/startup_ewarm.c @@ -0,0 +1,336 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void ADC0SS0Handler(void); +extern void RTCHandler(void); +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + ADC0SS0Handler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + RTCHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/qs-logger/startup_gcc.c b/boards/ek-lm4f232/qs-logger/startup_gcc.c new file mode 100644 index 0000000..ca5b4d7 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/startup_gcc.c @@ -0,0 +1,352 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void ADC0SS0Handler(void); +extern void RTCHandler(void); +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + ADC0SS0Handler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + RTCHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/qs-logger/startup_rvmdk.S b/boards/ek-lm4f232/qs-logger/startup_rvmdk.S new file mode 100644 index 0000000..25f6000 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/startup_rvmdk.S @@ -0,0 +1,361 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN ADC0SS0Handler + EXTERN RTCHandler + EXTERN SysTickIntHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD ADC0SS0Handler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD RTCHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/qs-logger/stripchartmanager.c b/boards/ek-lm4f232/qs-logger/stripchartmanager.c new file mode 100644 index 0000000..bab6d94 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/stripchartmanager.c @@ -0,0 +1,445 @@ +//***************************************************************************** +// +// stripchartmanager.c - Manages a strip chart widget for the data logger. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_types.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/slidemenuwidget.h" +#include "drivers/stripchartwidget.h" +#include "stripchartmanager.h" +#include "clocksetwidget.h" +#include "qs-logger.h" +#include "menus.h" +#include "utils/ustdlib.h" + +//***************************************************************************** +// +// This module manages a strip chart widget for the data logger application. +// It provides functions to make it easy to configure a strip chart for the +// user-selected data series, and to add new data to the strip chart. The +// functions in this module maintain buffers that hold the data for each data +// series that is selected for display on the strip chart. +// +//***************************************************************************** + +//***************************************************************************** +// +// Define a scaling range for each data series. Since multiple kinds of data +// will be shown on the strip chart, no one particular set of units can be +// selected. Instead the strip chart Y axis will just be maintained in units +// of pixels, and the table below maps the Y axis range to min and max values +// for each data series. +// +//***************************************************************************** +typedef struct +{ + int16_t i16Min; + int16_t i16Max; +} tDisplayScaling; + +tDisplayScaling g_psScaling[] = +{ + { 0, 20000 }, // analog channel inputs, + { 0, 20000 }, // 0-20V (20000 mV) + { 0, 20000 }, + { 0, 20000 }, + { -200, 200 }, // accelerometer axes, -2 - 2g + { -200, 200 }, // (units of 1/100g) + { -200, 200 }, + { 0, 500 }, // temperature, 0 - 50C (units of + { 0, 500 }, // 1/10C) + { 0, 400 }, // current, 0 - 40mA (units of + // 100uA) +}; + +//***************************************************************************** +// +// Defines the maximum number of items that are stored in a data series. This +// matches the width of the strip chart in pixels. +// +//***************************************************************************** +#define SERIES_LENGTH 96 + +//***************************************************************************** +// +// Create an array of strip chart data series, one for each channel of data +// that the data logger can acquire. Fields that are unchanging, such as +// the name of each series, are pre-populated here, while other fields that +// may change are updated by functions. These are the data series that get +// added to the strip chart for each item that is selected for logging. +// +//***************************************************************************** +static tStripChartSeries g_psSeries[] = +{ + { 0, "CH0", 0x000040, 1, 1, 0, 0 }, + { 0, "CH1", ClrLime, 1, 1, 0, 0 }, + { 0, "CH2", ClrAqua, 1, 1, 0, 0 }, + { 0, "CH3", ClrRed, 1, 1, 0, 0 }, + { 0, "ACCELX", ClrBlue, 1, 1, 0, 0 }, + { 0, "ACCELY", 0x00A000, 1, 1, 0, 0 }, + { 0, "ACCELZ", ClrFuchsia, 1, 1, 0, 0 }, + { 0, "CURRENT", ClrYellow, 1, 1, 0, 0 }, + { 0, "EXT TEMP", 0xC00040, 1, 1, 0, 0 }, + { 0, "INT TEMP", 0x60E080, 1, 1, 0, 0 }, +}; +#define MAX_NUM_SERIES (sizeof(g_psSeries) / \ + sizeof(tStripChartSeries)) + +//***************************************************************************** +// +// Defines the X-axis for the strip chart. +// +//***************************************************************************** +static tStripChartAxis g_sAxisX = +{ + "X-AXIS", // title of axis + 0, // label for minimum of axis + 0, // label for maximum of axis + 0, // minimum value for the axis + 95, // maximum value for the axis + 10 // grid interval for the axis +}; + +//***************************************************************************** +// +// Defines the Y-axis for the strip chart. +// +//***************************************************************************** +static tStripChartAxis g_sAxisY = +{ + 0, // title of the axis + 0, // label for minimum of axis + 0, // label for maximum of axis + 0, // minimum value for the axis + 63, // maximum value for the axis + 16 // grid interval for the axis +}; + +//***************************************************************************** +// +// Defines the strip chart widget. This structure must be fully initialized +// by calling the function StripChartMgrInit(). +// +//***************************************************************************** +StripChart(g_sStripChart, 0, 0, 0, 0, 0, 0, 96, 64, 0, g_psFontFixed6x8, + ClrBlack, ClrWhite, ClrWhite, ClrDarkGreen, &g_sAxisX, + &g_sAxisY, 0); + +//***************************************************************************** +// +// Creates a buffer space for the values in the data series. The buffer +// must be large enough to hold all of the data for the maximum possible +// number of data items that are selected. If less than the maximum number +// are selected then some of the buffer space will be unused. +// +//***************************************************************************** +static uint8_t g_pui8SeriesData[MAX_NUM_SERIES * SERIES_LENGTH]; + +//***************************************************************************** +// +// The count of data series that are selected for showing on the strip chart. +// This value is set when the client calls the function StripChartConfigure(). +// +//***************************************************************************** +static uint32_t g_ui32SelectedCount; + +//***************************************************************************** +// +// The number of items (per series) that have been added to the strip chart. +// +//***************************************************************************** +static uint32_t g_ui32ItemCount; + +//***************************************************************************** +// +// A bit mask of the specific data items that have been selected for logging. +// +//***************************************************************************** +static uint32_t g_ui32SelectedMask; + +//***************************************************************************** +// +// Configure the strip chart for a selected set of data series. The selected +// series is passed in as a bit mask. Each bit that is set in the bit mask +// represents a selected series. This function will go through the possible +// set of data series and for each that is selected it will be initialized +// and added to the strip chart. +// +//***************************************************************************** +void +StripChartMgrConfigure(uint32_t ui32SelectedMask) +{ + uint32_t ui32Idx, ui32ItemIdx; + tStripChartSeries *psSeries; + + // + // Save the channel mask for later use + // + g_ui32SelectedMask = ui32SelectedMask; + + // + // Determine how many series are to appear in the strip chart. + // + g_ui32SelectedCount = 0; + ui32Idx = ui32SelectedMask; + while(ui32Idx) + { + if(ui32Idx & 1) + { + g_ui32SelectedCount++; + } + ui32Idx >>= 1; + } + + // + // Reset the number of items that have been stored in the series buffers. + // + g_ui32ItemCount = 0; + + // + // Remove any series that were already added to the strip chart. + // + g_sStripChart.psSeries = 0; + + // + // Loop through all series, and configure the selected series and add + // them to the strip chart. + // + ui32ItemIdx = 0; + for(ui32Idx = 0; ui32Idx < MAX_NUM_SERIES; ui32Idx++) + { + // + // Check to see if this series is selected + // + if((1 << ui32Idx) & ui32SelectedMask) + { + // + // Get a pointer to this series. + // + psSeries = &g_psSeries[ui32Idx]; + + // + // Set the stride for this series. It will be the same as the + // number of enabled data items. + // + psSeries->ui8Stride = g_ui32SelectedCount; + + // + // Set the series data pointer to start at the first location + // in the series buffer where this data item will appear. + // + psSeries->pvData = &g_pui8SeriesData[ui32ItemIdx]; + + // + // Add the series to the strip chart. + // + StripChartSeriesAdd(&g_sStripChart, psSeries); + + // + // Increment the index of selected series. + // + ui32ItemIdx++; + } + } +} + +//***************************************************************************** +// +// Scales the input data value to a Y pixel range according to the scaling +// table at the top of this file. +// +//***************************************************************************** +static uint8_t +ScaleDataToPixelY(int16_t i16Data, int16_t i16Min, int16_t i16Max) +{ + int32_t i32Y; + int16_t i16Range; + + // + // Adjust the input value so that the min will be the bottom of display. + // + i16Data -= i16Min; + + // + // Compute the range of the input that will appear on the display + // + i16Range = i16Max - i16Min; + + // + // Scale the input to the Y pixel range of the display + // + i32Y = (int32_t)i16Data * 63L; + + // + // Add in half of divisor to get proper rounding + // + i32Y += (int32_t)i16Range / 2L; + + // + // Apply final divisor to get Y pixel value on display + // + i32Y /= (int32_t)i16Range; + + // + // If the Y coordinate is out of the range of the display, force the + // value to be just off the display, in order to avoid aliasing to a + // bogus Y pixel value when the return value is converted to a smaller + // data type. + // + if((i32Y < 0) || (i32Y > 63)) + { + i32Y = 64; + } + + // + // Return the Y pixel value + // + return((uint8_t)i32Y); +} + +//***************************************************************************** +// +// Add data items to the strip chart and advance the strip chart position. +// This function will add the items pointed to by the parameter to the data +// series buffer and the strip chart will be updated to reflect the newly +// added data items. +// This function will assume that the number of items passed by the pointer +// is the same as was selected by the function StripChartMgrConfigure(). +// up to the caller to ensure that the amount of data passed matches the +// number of items that were selected when the strip chart was configured. +// +//***************************************************************************** +void +StripChartMgrAddItems(int16_t *pi16DataItems) +{ + uint32_t ui32Idx, ui32SelectedMask = g_ui32SelectedMask; + uint8_t *pui8NewData; + + // + // Check for valid input data pointer + // + if(!pi16DataItems) + { + return; + } + + // + // If the number count of items in the strip chart is at the maximum, then + // the items need to "slide down" and new data added to the end of the + // buffer. + // + if(g_ui32ItemCount == SERIES_LENGTH) + { + memmove(&g_pui8SeriesData[0], &g_pui8SeriesData[g_ui32SelectedCount], + SERIES_LENGTH * g_ui32SelectedCount); + + // + // Set the pointer for newly added data to be the end of the series + // buffer. + // + pui8NewData = &g_pui8SeriesData[(SERIES_LENGTH - 1) * + g_ui32SelectedCount]; + } + else + { + + // + // Otherwise, the series data buffer is less than full so compute the + // correct location in the buffer for the new data to be added. + // + pui8NewData = &g_pui8SeriesData[g_ui32ItemCount * + g_ui32SelectedCount]; + + // + // Increment the number of items that have been added to the strip + // chart series data buffer. + // + g_ui32ItemCount++; + + // + // Since the count of data items has changed, it must be updated for + // each series. + // + for(ui32Idx = 0; ui32Idx < MAX_NUM_SERIES; ui32Idx++) + { + g_psSeries[ui32Idx].ui16NumItems = g_ui32ItemCount; + } + } + + // + // Convert each of the input data items being added to the strip chart + // to a scaled Y pixel value. + // + ui32Idx = 0; + while(ui32SelectedMask) + { + // + // Is this data item being added to the chart? + // + if(ui32SelectedMask & 1) + { + // + // Scale the data item and add it to the series buffer + // + *pui8NewData = ScaleDataToPixelY(*pi16DataItems, + g_psScaling[ui32Idx].i16Min, + g_psScaling[ui32Idx].i16Max); + + // + // Increment the from/to pointers + // + pui8NewData++; + pi16DataItems++; + } + ui32Idx++; + ui32SelectedMask >>= 1; + } + + // + // Now that data has been added to the strip chart series buffers, either + // at the end or in the middle, advance the strip chart position by 1. + // Add a request for painting the strip chart widget. + // + StripChartAdvance(&g_sStripChart, 1); + WidgetPaint(WIDGET_ROOT); +} + +//***************************************************************************** +// +// Initializes the strip chart manager. The strip chart needs an on-screen +// and off-screen display for drawing. These are passed using the init +// function. +// +//***************************************************************************** +void +StripChartMgrInit(void) +{ + g_sStripChart.sBase.psDisplay = &g_sCFAL96x64x16; + g_sStripChart.psOffscreenDisplay = &g_sOffscreenDisplayA; +} diff --git a/boards/ek-lm4f232/qs-logger/stripchartmanager.h b/boards/ek-lm4f232/qs-logger/stripchartmanager.h new file mode 100644 index 0000000..11a1c16 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/stripchartmanager.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// stripchartmanager.h - Header for data logger strip chart manager. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** +#ifndef __STRIPCHARTMANAGER_H__ +#define __STRIPCHARTMANAGER_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Public data. +// +//***************************************************************************** +extern tStripChartWidget g_sStripChart; + +//***************************************************************************** +// +// Function prototypes. +// +//***************************************************************************** +extern void StripChartMgrConfigure(uint32_t ui32SelectedMask); +extern void StripChartMgrAddItems(int16_t *pi16DataItems); +extern void StripChartMgrInit(void); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __STRIPCHARTMANAGER_H__ diff --git a/boards/ek-lm4f232/qs-logger/usb_serial_structs.c b/boards/ek-lm4f232/qs-logger/usb_serial_structs.c new file mode 100644 index 0000000..f899ce1 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/usb_serial_structs.c @@ -0,0 +1,217 @@ +//***************************************************************************** +// +// usb_serial_structs.c - Data structures defining this CDC USB device. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "usb_serial_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + 2 + (30 * 2), + USB_DTYPE_STRING, + 'S', 0, 't', 0, 'e', 0, 'l', 0, 'l', 0, 'a', 0, 'r', 0, 'i', 0, + 's', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, 'a', 0, ' ', 0, 'L', 0, + 'o', 0, 'g', 0, 'g', 0, 'e', 0, 'r', 0, ' ', 0, 'C', 0, 'O', 0, + 'M', 0, ' ', 0, 'P', 0, 'o', 0, 'r', 0, 't', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + 2 + (8 * 2), + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The control interface description string. +// +//***************************************************************************** +const uint8_t g_pui8ControlInterfaceString[] = +{ + 2 + (21 * 2), + USB_DTYPE_STRING, + 'A', 0, 'C', 0, 'M', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 't', 0, + 'r', 0, 'o', 0, 'l', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, + 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + 2 + (26 * 2), + USB_DTYPE_STRING, + 'S', 0, 'e', 0, 'l', 0, 'f', 0, ' ', 0, 'P', 0, 'o', 0, 'w', 0, + 'e', 0, 'r', 0, 'e', 0, 'd', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, + 'f', 0, 'i', 0, 'g', 0, 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, + 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_pui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8ControlInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_pui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// CDC device callback function prototypes. +// +//***************************************************************************** +uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData); +uint32_t TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData); +uint32_t ControlHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +//***************************************************************************** +// +// The CDC device initialization and customization structures. In this case, +// we are using USBBuffers between the CDC device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the CDC channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our CDC instance structure. +// +//***************************************************************************** +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; + +tUSBDCDCDevice g_sCDCDevice = +{ + USB_VID_TI_1CBE, + USB_PID_DATA_LOGGER, + 0, + USB_CONF_ATTR_SELF_PWR, + ControlHandler, + (void *)&g_sCDCDevice, + USBBufferEventCallback, + (void *)&g_sRxBuffer, + USBBufferEventCallback, + (void *)&g_sTxBuffer, + g_pui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; + +//***************************************************************************** +// +// Receive buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBRxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8RxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sRxBuffer = +{ + false, // This is a receive buffer. + RxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device ptr. + USBDCDCPacketRead, // pfnTransfer + USBDCDCRxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pui8USBRxBuffer, // pui8Buffer + UART_BUFFER_SIZE, // ui32BufferSize + g_pui8RxBufferWorkspace // pvWorkspace +}; + +//***************************************************************************** +// +// Transmit buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBTxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8TxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sTxBuffer = +{ + true, // This is a transmit buffer. + TxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device ptr. + USBDCDCPacketWrite, // pfnTransfer + USBDCDCTxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pui8USBTxBuffer, // pi8Buffer + UART_BUFFER_SIZE, // ui32BufferSize + g_pui8TxBufferWorkspace // pvWorkspace +}; diff --git a/boards/ek-lm4f232/qs-logger/usb_serial_structs.h b/boards/ek-lm4f232/qs-logger/usb_serial_structs.h new file mode 100644 index 0000000..6960a45 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/usb_serial_structs.h @@ -0,0 +1,49 @@ +//***************************************************************************** +// +// usb_serial_structs.h - Data structures defining this USB CDC device. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_SERIAL_STRUCTS_H_ +#define _USB_SERIAL_STRUCTS_H_ + +//***************************************************************************** +// +// The size of the transmit and receive buffers used for the redirected UART. +// This number should be a power of 2 for best performance. 256 is chosen +// pretty much at random though the buffer should be at least twice the size of +// a maxmum-sized USB packet. +// +//***************************************************************************** +#define UART_BUFFER_SIZE 256 + +extern uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +extern uint32_t TxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; +extern tUSBDCDCDevice g_sCDCDevice; +extern uint8_t g_pui8USBTxBuffer[]; +extern uint8_t g_pui8USBRxBuffer[]; + +#endif diff --git a/boards/ek-lm4f232/qs-logger/usbserial.c b/boards/ek-lm4f232/qs-logger/usbserial.c new file mode 100644 index 0000000..9125626 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/usbserial.c @@ -0,0 +1,459 @@ +//***************************************************************************** +// +// usbserial.c - Data logger module to handle serial device functions. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "driverlib/debug.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "usb_serial_structs.h" +#include "qs-logger.h" + +//***************************************************************************** +// +// This module manages the USB serial device function. It is used when the +// eval board is connected to a host PC as a serial device, and can transmit +// data log records to the host PC through a virtual serial port. +// +//***************************************************************************** + +//***************************************************************************** +// +// Global flag indicating that a USB device configuration is made. +// +//***************************************************************************** +static volatile bool g_bUSBDevConnected = false; + +//***************************************************************************** +// +// The line coding parameters for the virtual serial port. Since there is +// no physical port this does not have any real effect, but we have a default +// set of values to report if asked, and will remember whatever the host +// configures. +// +//***************************************************************************** +static tLineCoding g_sLineCoding = +{ + 115200, USB_CDC_STOP_BITS_1, USB_CDC_PARITY_NONE, 8 +}; + +//***************************************************************************** +// +// Set the communication parameters for the virtual serial port. +// +//***************************************************************************** +static bool +SetLineCoding(tLineCoding *psLineCoding) +{ + // + // Copy whatever the host passes into our copy of line parameters. + // + memcpy(&g_sLineCoding, psLineCoding, sizeof(tLineCoding)); + + // + // ALways return success + // + return(true); +} + +//***************************************************************************** +// +// Get the communication parameters in use on the UART. +// +//***************************************************************************** +static void +GetLineCoding(tLineCoding *psLineCoding) +{ + // + // Copy whatever we have stored as the line parameter to the host. + // + memcpy(psLineCoding, &g_sLineCoding, sizeof(tLineCoding)); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to control and setup of the device. +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to perform control-related +// operations on behalf of the USB host. These functions include setting +// and querying the serial communication parameters, setting handshake line +// states and sending break conditions. +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +ControlHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData) +{ + // + // Which event are we being asked to process? + // + switch(ui32Event) + { + // + // We are connected to a host and communication is now possible. + // + case USB_EVENT_CONNECTED: + { + g_bUSBDevConnected = true; + + // + // Flush our buffers. + // + USBBufferFlush(&g_sTxBuffer); + USBBufferFlush(&g_sRxBuffer); + break; + } + + // + // The host has disconnected. + // + case USB_EVENT_DISCONNECTED: + { + g_bUSBDevConnected = false; + break; + } + + // + // Return the current serial communication parameters. + // + case USBD_CDC_EVENT_GET_LINE_CODING: + { + GetLineCoding(pvMsgData); + break; + } + + // + // Set the current serial communication parameters. + // + case USBD_CDC_EVENT_SET_LINE_CODING: + { + SetLineCoding(pvMsgData); + break; + } + + // + // The following line control events can be ignored because there is + // no physical serial port to manage. + // + case USBD_CDC_EVENT_SET_CONTROL_LINE_STATE: + case USBD_CDC_EVENT_SEND_BREAK: + case USBD_CDC_EVENT_CLEAR_BREAK: + { + break; + } + + // + // Ignore SUSPEND and RESUME for now. + // + case USB_EVENT_SUSPEND: + case USB_EVENT_RESUME: + { + break; + } + + // + // An unknown event occurred. + // + default: + { + break; + } + } + + // + // Return control to USB stack + // + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the transmit channel (data to +// the USB host). +// +// \param ui32CBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event have we been sent? + // + switch(ui32Event) + { + case USB_EVENT_TX_COMPLETE: + { + // + // Since we are using the USBBuffer, we don't need to do anything + // here. + // + break; + } + + // + // We don't expect to receive any other events. + // + default: + { + break; + } + } + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the receive channel (data from +// the USB host). +// +// \param ui32CBData is the client-supplied callback data value for this +// channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event are we being sent? + // + switch(ui32Event) + { + // + // A new packet has been received. + // + case USB_EVENT_RX_AVAILABLE: + { + // + // We do not ever expect to receive serial data, so just flush + // the RX buffer if any data actually comes in. + // + USBBufferFlush(&g_sRxBuffer); + break; + } + + // + // We are being asked how much unprocessed data we have still to + // process. Since there is no actual serial port and we are not + // processing any RX data, just return 0. + // + case USB_EVENT_DATA_REMAINING: + { + return(0); + } + + // + // We are being asked to provide a buffer into which the next packet + // can be read. We do not support this mode of receiving data so let + // the driver know by returning 0. The CDC driver should not be sending + // this message but this is included just for illustration and + // completeness. + // + case USB_EVENT_REQUEST_BUFFER: + { + return(0); + } + + // + // We don't expect to receive any other events. + // + default: + { + break; + } + } + return(0); +} + +//***************************************************************************** +// +// Initializes the USB serial device. +// +//***************************************************************************** +void +USBSerialInit(void) +{ + // + // Initialize the transmit and receive buffers. + // + USBBufferInit((tUSBBuffer *)&g_sTxBuffer); + USBBufferInit((tUSBBuffer *)&g_sRxBuffer); + + // + // Initialize the USB library CDC device function. + // + USBDCDCInit(0, (tUSBDCDCDevice *)&g_sCDCDevice); +} + +//***************************************************************************** +// +// This is called by the application main loop to perform regular processing. +// This is just a stub here because everything is event or interrupt driven. +// +//***************************************************************************** +void +USBSerialRun(void) +{ +} + +//***************************************************************************** +// +// Write a data record to the serial port. An acquired data record is passed +// in and is composed into a binary packet and sent on the serial port. The +// host PC, if connected will receive this packet via the virtual serial port, +// and can decode and display the data. +// +// The binary packet has the following format: +// - 16-bit header, value 0x5351 +// - 32-bit seconds time stamp +// - 16-bit fractional seconds time stamp (1/32768 resolution) +// - 16-bit data item selection mask (which items are included in the record) +// - multiple 16-bit data item values, per selection mask +// - 16-bit checksum which when added to the 16-bit sum of the entire packet +// will result in 0. +// +// The entire packet is transmitted bytewise over the virtual serial port, +// little-endian format. +// +//***************************************************************************** +int32_t +USBSerialWriteRecord(tLogRecord *psRecord) +{ + uint32_t ui32Idx; + uint16_t ui16Checksum; + uint32_t ui32ItemCount; + uint16_t *pui16Buf; + + // + // Check the arguments + // + ASSERT(psRecord); + if(!psRecord) + { + return(1); + } + + // + // Check state for ready device + // + if(!g_bUSBDevConnected) + { + return(1); + } + + // + // Determine how many channels are to be logged + // + ui32Idx = psRecord->ui16ItemMask; + ui32ItemCount = 0; + while(ui32Idx) + { + if(ui32Idx & 1) + { + ui32ItemCount++; + } + ui32Idx >>= 1; + } + + // + // Add to item count the equivalent number of 16-bit words for timestamp + // and selection mask. + // + ui32ItemCount += 4; + + // + // Put the header word in the USB buffer + // + ui16Checksum = 0x5351; + USBBufferWrite((tUSBBuffer *)&g_sTxBuffer, (uint8_t *)&ui16Checksum, 2); + + // + // Compute the checksum over the entire record + // + pui16Buf = (uint16_t *)psRecord; + for(ui32Idx = 0; ui32Idx < ui32ItemCount; ui32Idx++) + { + ui16Checksum += pui16Buf[ui32Idx]; + } + + // + // Convert item count to bytes. This now represents the entire record + // size in bytes, not including the checksum. The header has already + // been sent + // + ui32ItemCount *= 2; + + // + // Transmit the record, which includes the time stamp, selection mask + // and all selected data item, to the USB buffer + // + USBBufferWrite((tUSBBuffer *)&g_sTxBuffer, (uint8_t *)pui16Buf, + ui32ItemCount); + + // + // Adjust the checksum so that when added (as uint16_t) to the sum of the + // rest of the packet, the result will be 0 + // + ui16Checksum = (uint16_t)(0x10000L - (uint32_t)ui16Checksum); + + // + // Transmit the checksum which is the end of the packet + // + USBBufferWrite((tUSBBuffer *)&g_sTxBuffer, (uint8_t *)&ui16Checksum, 2); + + // + // Return success to the caller + // + return(0); +} diff --git a/boards/ek-lm4f232/qs-logger/usbserial.h b/boards/ek-lm4f232/qs-logger/usbserial.h new file mode 100644 index 0000000..8db33e4 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/usbserial.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// usbserial.h - Prototypes and definitions for USB serial module. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** +#ifndef __USBSERIAL_H__ +#define __USBSERIAL_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Module function prototypes. +// +//***************************************************************************** +extern void USBSerialInit(void); +extern void USBSerialRun(void); +extern int USBSerialWriteRecord(tLogRecord *psRecord); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __USBSERIAL_H__ diff --git a/boards/ek-lm4f232/qs-logger/usbstick.c b/boards/ek-lm4f232/qs-logger/usbstick.c new file mode 100644 index 0000000..c0c4427 --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/usbstick.c @@ -0,0 +1,814 @@ +//***************************************************************************** +// +// usbstick.c - Data logger module to handle USB mass storage. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "driverlib/debug.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhmsc.h" +#include "utils/ustdlib.h" +#include "third_party/fatfs/src/ff.h" +#include "qs-logger.h" +#include "usbstick.h" + +//***************************************************************************** +// +// This module manages the USB host mass storage function. It is used when +// there is a USB memory stick attached to the evaluation board. It manages +// the USB connection and stores data log records to the attached mass +// storage device. +// +//***************************************************************************** + +//***************************************************************************** +// +// A line of text that is written to the start of a CSV file, to provide +// column headings. +// +//***************************************************************************** +static const char g_pcCSVHeaderLine[] = + "Time(s),Frac. seconds," \ + "CH0(mV),CH1(mV),CH2(mV),CH3(mV)," \ + "AccelX(.01g),AccelY(.01g),AccelZ(.01g)," \ + "Ext. Temp(.1C),Int. Temp(.1C),Current(100uA)\r\n"; + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static FIL g_sFileObject; + +//***************************************************************************** +// +// Holds global flags for the system. +// +//***************************************************************************** +static volatile uint32_t g_ui32Flags = 0; + +//***************************************************************************** +// +// Flag indicating that some USB device is connected. +// +//***************************************************************************** +#define FLAGS_DEVICE_PRESENT 0x00000001 +#define FLAGS_FILE_OPENED 0x00000002 + +//***************************************************************************** +// +// Hold the current state for the application. +// +//***************************************************************************** +volatile enum +{ + // + // No device is present. + // + eSTATE_NO_DEVICE, + + // + // Mass storage device is being enumerated. + // + eSTATE_DEVICE_ENUM, + + // + // Mass storage device is ready. + // + eSTATE_DEVICE_READY, + + // + // An unsupported device has been attached. + // + eSTATE_UNKNOWN_DEVICE, + + // + // A power fault has occurred. + // + eSTATE_POWER_FAULT +} +g_iState; + +//***************************************************************************** +// +// The instance data for the MSC driver. +// +//***************************************************************************** +tUSBHMSCInstance *g_psMSCInstance = 0; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the MSC class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostMSCClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. In this application uDMA is only used for USB, +// so only the first 6 channels are needed. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[6]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[6]; +#else +tDMAControlTable g_psDMAControlTable[6] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// Initializes the file system module. +// +// \param None. +// +// This function initializes the third party FAT implementation. +// +// \return Returns \e true on success or \e false on failure. +// +//***************************************************************************** +static bool +FileInit(void) +{ + // + // Mount the file system, using logical disk 0. + // + if(f_mount(0, &g_sFatFs) != FR_OK) + { + return(false); + } + return(true); +} + +//***************************************************************************** +// +// This is the callback from the MSC driver. +// +// \param ui32Instance is the driver instance which is needed when +// communicating with the driver. +// \param ui32Event is one of the events defined by the driver. +// \param pvData is a pointer to data passed into the initial call to register +// the callback. +// +// This function handles callback events from the MSC driver. The only events +// currently handled are the MSC_EVENT_OPEN and MSC_EVENT_CLOSE. This allows +// the main routine to know when an MSC device has been detected and +// enumerated and when an MSC device has been removed from the system. +// +// \return None +// +//***************************************************************************** +static void +MSCCallback(tUSBHMSCInstance *psMSCInstance, uint32_t ui32Event, void *pvData) +{ + // + // Determine the event. + // + switch(ui32Event) + { + // + // Called when the device driver has successfully enumerated an MSC + // device. + // + case MSC_EVENT_OPEN: + { + // + // Proceed to the enumeration state. + // + g_iState = eSTATE_DEVICE_ENUM; + + break; + } + + // + // Called when the device driver has been unloaded due to error or + // the device is no longer present. + // + case MSC_EVENT_CLOSE: + { + // + // Go back to the "no device" state and wait for a new connection. + // + g_iState = eSTATE_NO_DEVICE; + + // + // Re-initialize the file system. + // + FileInit(); + + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the mass storage device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *psEventInfo; + + // + // Cast this pointer to its actual type. + // + psEventInfo = (tEventInfo *)pvData; + + // + // Process each kind of event + // + switch(psEventInfo->ui32Event) + { + // + // An unknown device has been connected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + // + // An unknown device was detected. + // + g_iState = eSTATE_UNKNOWN_DEVICE; + break; + } + + // + // The unknown device has been been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Unknown device has been removed. + // + g_iState = eSTATE_NO_DEVICE; + break; + } + + // + // A bus power fault was detected. + // + case USB_EVENT_POWER_FAULT: + { + // + // No power means no device is present. + // + g_iState = eSTATE_POWER_FAULT; + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// Initializes the USB stack for mass storage. +// +//***************************************************************************** +void +USBStickInit(void) +{ + // + // Enable the uDMA controller and set up the control table base. + // The uDMA controller is used by the USB library. + // + MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + MAP_uDMAEnable(); + MAP_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Initially wait for device connection. + // + g_iState = eSTATE_NO_DEVICE; + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the mass storage class driver. + // + g_psMSCInstance = USBHMSCDriveOpen(0, MSCCallback); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Run initial pass through USB host stack. + // + USBHCDMain(); + + // + // Initialize the file system. + // + FileInit(); +} + +//***************************************************************************** +// +// This is called by the application main loop to perform regular processing. +// It keeps the USB host stack running and tracks the state of the attached +// device. +// +//***************************************************************************** +void +USBStickRun(void) +{ + // + // Call the USB stack to keep it running. + // + USBHCDMain(); + + // + // Take action based on the application state. + // + switch(g_iState) + { + // + // A device has enumerated. + // + case eSTATE_DEVICE_ENUM: + { + // + // Check to see if the device is ready. If not then stay + // in this state and we will check it again on the next pass. + // + if(USBHMSCDriveReady(g_psMSCInstance) != 0) + { + // + // Wait about 500ms before attempting to check if the + // device is ready again. + // + MAP_SysCtlDelay(MAP_SysCtlClockGet()/3); + break; + } + + // + // If there were no errors reported, we are ready for + // MSC operation. + // + g_iState = eSTATE_DEVICE_READY; + + // + // Set the Device Present flag. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + + break; + } + + // + // If there is no device then just wait for one. + // + case eSTATE_NO_DEVICE: + { + if(g_ui32Flags == FLAGS_DEVICE_PRESENT) + { + // + // Clear the Device Present flag. + // + g_ui32Flags &= ~(FLAGS_DEVICE_PRESENT | FLAGS_FILE_OPENED); + } + break; + } + + // + // An unknown device was connected. + // + case eSTATE_UNKNOWN_DEVICE: + { + // + // If this is a new device then change the status. + // + if((g_ui32Flags & FLAGS_DEVICE_PRESENT) == 0) + { + // + // Unknown device is present + // + } + + // + // Set the Device Present flag even though the unknown device + // is not useful to us. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + break; + } + + // + // The device is ready and in use. + // + case eSTATE_DEVICE_READY: + { + break; + } + + // + // Something has caused a power fault. + // + case eSTATE_POWER_FAULT: + { + break; + } + + // + // Unexpected USB state. Set back to default. + // + default: + { + g_iState = eSTATE_NO_DEVICE; + g_ui32Flags &= ~(FLAGS_DEVICE_PRESENT | FLAGS_FILE_OPENED); + break; + } + } +} + +//***************************************************************************** +// +// This is called when the data logging is stopped. It performs a sync +// to the file system which should flush any buffered data to the storage +// device. +// +//***************************************************************************** +void +USBStickCloseFile(void) +{ + f_close(&g_sFileObject); + g_ui32Flags &= ~FLAGS_FILE_OPENED; +} + +//***************************************************************************** +// +// Create a file name for the file to be saved on the memory stick. +// This function uses an incrementing numerical search scheme to determine +// an available file name. It tries opening file names in succession until +// it finds a file that does not yet exist. +// The file name will be of the form LOGnnnn.CSV. +// The caller supplies storage for the file name through the pcFilename +// parameter. +// The function will return 0 if successful and non-zero if a file name could +// not be found. +// +//***************************************************************************** +static int32_t +CreateFileName(char *pcFilename, uint32_t ui32Len) +{ + FRESULT iFResult; + uint32_t ui32FileNum = 0; + + // + // Enter loop to search for available file name + // + do + { + // + // Prepare a numerical based file name and attempt to open it + // + usnprintf(pcFilename, ui32Len, "LOG%04d.CSV", ui32FileNum); + iFResult = f_open(&g_sFileObject, pcFilename, FA_OPEN_EXISTING); + + // + // If file does not exist, then we have found a useable file name + // + if(iFResult == FR_NO_FILE) + { + // + // Return to caller, indicating that a file name has been found. + // + return(0); + } + + // + // Otherwise, advance to the next number in the file name sequence. + // + ui32FileNum++; + + } while(ui32FileNum < 1000); + + // + // If we reach this point, it means that no useable file name was found + // after attempting 10000 file names. + // + return(1); +} + +//***************************************************************************** +// +// This is called at the start of logging to open a file on the storage +// device in preparation for saving data. If no file name is specified, then +// a new file will be created. +// +// If a file name is specified, then that will be used instead of searching +// for an available file. The file name that is passed in must be a maximum +// of 8 characters (9 including trailing 0) and represents the first part of +// the file name not including the extension. +// +// The function returns a pointer to the first part of the file name +// (without file extension). It can be up to 8 characters (9 including the +// trailing 0). If there is any error then a NULL pointer is returned. +// +//***************************************************************************** +char * +USBStickOpenLogFile(char *pcFilename8) +{ + FRESULT iFResult; + uint32_t ui32BytesWritten; + static char pcFilename[16]; + uint32_t ui32Len; + + // + // Check state for ready device + // + g_ui32Flags &= ~FLAGS_FILE_OPENED; + if(g_iState == eSTATE_DEVICE_READY) + { + // + // If a file name is specified then open that file + // + if(pcFilename8 && pcFilename8[0]) + { + // + // Copy the filename into local storage and cap at 8 characters + // length. + // + memcpy(pcFilename, pcFilename8, 8); + pcFilename[8] = 0; + + // + // Find the actual length of the string (8 chars or less) so we + // know where to add the extension. + // + ui32Len = strlen(pcFilename); + + // + // Add the extension to the file name. + // + usnprintf(&pcFilename[ui32Len], 5, ".CSV"); + } + + // + // Otherwise no file name was specified so create a new one. + // + else + { + if(CreateFileName(pcFilename, sizeof(pcFilename))) + { + // + // There was a problem creating a file name so return an error + // + return(0); + } + } + + // + // Open the file by name that was determined above. If the file exists + // it will be opened, and if not it will be created. + // + iFResult = f_open(&g_sFileObject, pcFilename, (FA_OPEN_ALWAYS | + FA_WRITE)); + if(iFResult != FR_OK) + { + return(0); + } + + // + // Since it is possible that the file already existed when opened, + // seek to the end of the file so new data will be appended. If this + // is a new file then this will just be the beginning of the file. + // + iFResult = f_lseek(&g_sFileObject, g_sFileObject.fsize); + if(iFResult != FR_OK) + { + return(0); + } + + // + // Set flag to indicate file is now opened. + // + g_ui32Flags |= FLAGS_FILE_OPENED; + + // + // If no file name was specified, then this is a new file so write a + // header line with column titles to the CSV file. + // + if(!pcFilename8 || !pcFilename8[0]) + { + // + // Write a header line to the CSV file + // + iFResult = f_write(&g_sFileObject, g_pcCSVHeaderLine, + sizeof(g_pcCSVHeaderLine), &ui32BytesWritten); + if(iFResult != FR_OK) + { + g_ui32Flags &= ~FLAGS_FILE_OPENED; + return(0); + } + + // + // Since no file name was specified that means a file name was + // created. Terminate the new file name at the '.' separator + // and return it to the caller. We know that created file names + // are always 7 characters. Return the newly created file name + // (the part before the '.') + // + pcFilename[7] = 0; + return(pcFilename); + } + + // + // Otherwise, a file name was specified, so no need to write a + // header row. The caller's file name is unchanged so return the + // same value back. + // + else + { + return(pcFilename8); + } + } + + else + { + // + // Device not ready so return NULL. + // + return(0); + } +} + +//***************************************************************************** +// +// This is called each time there is a new data record to log to the storage +// device. A line of text in CSV format will be written to the file. +// +//***************************************************************************** +int32_t +USBStickWriteRecord(tLogRecord *psRecord) +{ + static char pcBuf[256]; + uint32_t ui32Idx, ui32BufIdx = 0, ui32RecordIdx, ui32Selected; + FRESULT iFResult; + uint32_t ui32BytesWritten; + + // + // Check the arguments + // + ASSERT(psRecord); + if(!psRecord) + { + return(1); + } + + // + // Check state for ready device and opened file + // + if((g_iState != eSTATE_DEVICE_READY) || !(g_ui32Flags & FLAGS_FILE_OPENED)) + { + return(1); + } + + // + // Print time stamp columns + // + ui32BufIdx += usnprintf(&pcBuf[ui32BufIdx], sizeof(pcBuf) - ui32BufIdx, + "%u,%u", psRecord->ui32Seconds, + psRecord->ui16Subseconds); + + // + // Iterate through selected data items and print to CSV buffer + // + ui32RecordIdx = 0; + ui32Selected = psRecord->ui16ItemMask; + for(ui32Idx = 0; ui32Idx < NUM_LOG_ITEMS; ui32Idx++) + { + // + // If this data item is selected, then print a value to the CSV buffer + // + if(ui32Selected & 1) + { + ui32BufIdx += usnprintf(&pcBuf[ui32BufIdx], + (sizeof(pcBuf) - ui32BufIdx), ",%d", + psRecord->pi16Items[ui32RecordIdx]); + ui32RecordIdx++; + } + else + { + // + // Otherwise, this column of data is not selected so emit just a + // comma + // + ui32BufIdx += usnprintf(&pcBuf[ui32BufIdx], + (sizeof(pcBuf) - ui32BufIdx), ","); + } + + // + // Next selected item ... + // + ui32Selected >>= 1; + } + + // + // Append a CRLF to the end + // + ui32BufIdx += usnprintf(&pcBuf[ui32BufIdx], (sizeof(pcBuf) - ui32BufIdx), + "\r\n"); + + // + // Now write the entire buffer to the USB stick file + // + iFResult = f_write(&g_sFileObject, pcBuf, ui32BufIdx, &ui32BytesWritten); + + // + // Check for errors + // + if((iFResult != FR_OK) || (ui32BytesWritten != ui32BufIdx)) + { + // + // Some error occurred + // + g_ui32Flags &= ~FLAGS_FILE_OPENED; + return(1); + } + else + { + // + // No errors occurred, return success + // + return(0); + } +} diff --git a/boards/ek-lm4f232/qs-logger/usbstick.h b/boards/ek-lm4f232/qs-logger/usbstick.h new file mode 100644 index 0000000..d05459a --- /dev/null +++ b/boards/ek-lm4f232/qs-logger/usbstick.h @@ -0,0 +1,58 @@ +//***************************************************************************** +// +// usbstick.h - Prototypes and definitions for USB mass storage module. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** +#ifndef __USBSTICK_H__ +#define __USBSTICK_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Module function prototypes. +// +//***************************************************************************** +extern void USBStickInit(void); +extern void USBStickRun(void); +extern void USBStickCloseFile(void); +extern char *USBStickOpenLogFile(char *pcFilename); +extern int32_t USBStickWriteRecord(tLogRecord *psRecord); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // __USBSTICK_H__ diff --git a/boards/ek-lm4f232/sd_card/Makefile b/boards/ek-lm4f232/sd_card/Makefile new file mode 100644 index 0000000..e178347 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/Makefile @@ -0,0 +1,97 @@ +#****************************************************************************** +# +# Makefile - Rules for building the SD card example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/src/option +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the SD card example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/sd_card.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the SD card example. +# +${COMPILER}/sd_card.axf: ${COMPILER}/cc932.o +${COMPILER}/sd_card.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/sd_card.axf: ${COMPILER}/cmdline.o +${COMPILER}/sd_card.axf: ${COMPILER}/ff.o +${COMPILER}/sd_card.axf: ${COMPILER}/mmc-ek-lm4f232.o +${COMPILER}/sd_card.axf: ${COMPILER}/sd_card.o +${COMPILER}/sd_card.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/sd_card.axf: ${COMPILER}/uartstdio.o +${COMPILER}/sd_card.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/sd_card.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/sd_card.axf: sd_card.ld +SCATTERgcc_sd_card=sd_card.ld +ENTRY_sd_card=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 -DENABLE_LFN + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/sd_card/ccs/.ccsimportspec b/boards/ek-lm4f232/sd_card/ccs/.ccsimportspec new file mode 100644 index 0000000..67417bd --- /dev/null +++ b/boards/ek-lm4f232/sd_card/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/sd_card/ccs/.ccsproject b/boards/ek-lm4f232/sd_card/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/sd_card/ccs/.cproject b/boards/ek-lm4f232/sd_card/ccs/.cproject new file mode 100644 index 0000000..857982b --- /dev/null +++ b/boards/ek-lm4f232/sd_card/ccs/.cproject @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/sd_card/ccs/.project b/boards/ek-lm4f232/sd_card/ccs/.project new file mode 100644 index 0000000..a9e260b --- /dev/null +++ b/boards/ek-lm4f232/sd_card/ccs/.project @@ -0,0 +1,80 @@ + + + sd_card + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + sd_card.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/sd_card/sd_card.c + + + sd_card_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/sd_card/sd_card_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/sd_card/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/cmdline.c + 1 + SW_ROOT/utils/cmdline.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + third_party/fatfs/port/mmc-ek-lm4f232.c + 1 + SW_ROOT/third_party/fatfs/port/mmc-ek-lm4f232.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + third_party/fatfs/src/option/cc932.c + 1 + SW_ROOT/third_party/fatfs/src/option/cc932.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/sd_card/ccs/Debug/sd_card.bin b/boards/ek-lm4f232/sd_card/ccs/Debug/sd_card.bin new file mode 100644 index 0000000..9cd26be Binary files /dev/null and b/boards/ek-lm4f232/sd_card/ccs/Debug/sd_card.bin differ diff --git a/boards/ek-lm4f232/sd_card/ccs/Debug/sd_card.out b/boards/ek-lm4f232/sd_card/ccs/Debug/sd_card.out new file mode 100644 index 0000000..e62e155 Binary files /dev/null and b/boards/ek-lm4f232/sd_card/ccs/Debug/sd_card.out differ diff --git a/boards/ek-lm4f232/sd_card/ccs/macros.ini_initial b/boards/ek-lm4f232/sd_card/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/sd_card/ccs/target_config.ccxml b/boards/ek-lm4f232/sd_card/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/sd_card/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/sd_card/ewarm/Exe/sd_card.bin b/boards/ek-lm4f232/sd_card/ewarm/Exe/sd_card.bin new file mode 100644 index 0000000..7d63e1e Binary files /dev/null and b/boards/ek-lm4f232/sd_card/ewarm/Exe/sd_card.bin differ diff --git a/boards/ek-lm4f232/sd_card/ewarm/Exe/sd_card.out b/boards/ek-lm4f232/sd_card/ewarm/Exe/sd_card.out new file mode 100644 index 0000000..e8ceff5 Binary files /dev/null and b/boards/ek-lm4f232/sd_card/ewarm/Exe/sd_card.out differ diff --git a/boards/ek-lm4f232/sd_card/gcc/sd_card.axf b/boards/ek-lm4f232/sd_card/gcc/sd_card.axf new file mode 100644 index 0000000..3f12774 Binary files /dev/null and b/boards/ek-lm4f232/sd_card/gcc/sd_card.axf differ diff --git a/boards/ek-lm4f232/sd_card/gcc/sd_card.bin b/boards/ek-lm4f232/sd_card/gcc/sd_card.bin new file mode 100644 index 0000000..18422e2 Binary files /dev/null and b/boards/ek-lm4f232/sd_card/gcc/sd_card.bin differ diff --git a/boards/ek-lm4f232/sd_card/readme.txt b/boards/ek-lm4f232/sd_card/readme.txt new file mode 100644 index 0000000..a672140 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/readme.txt @@ -0,0 +1,34 @@ +SD card using FAT file system + +This example application demonstrates reading a file system from an SD +card. It makes use of FatFs, a FAT file system driver. It provides a +simple command console via a serial port for issuing commands to view and +navigate the file system on the SD card. + +The first UART, which is connected to the USB debug virtual serial port on +the evaluation board, is configured for 115,200 bits per second, and 8-N-1 +mode. When the program is started a message will be printed to the +terminal. Type ``help'' for command help. + +For additional details about FatFs, see the following site: +http://elm-chan.org/fsw/ff/00index_e.html + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/sd_card/rvmdk/sd_card.axf b/boards/ek-lm4f232/sd_card/rvmdk/sd_card.axf new file mode 100644 index 0000000..f85bc5b Binary files /dev/null and b/boards/ek-lm4f232/sd_card/rvmdk/sd_card.axf differ diff --git a/boards/ek-lm4f232/sd_card/rvmdk/sd_card.bin b/boards/ek-lm4f232/sd_card/rvmdk/sd_card.bin new file mode 100644 index 0000000..c17ea46 Binary files /dev/null and b/boards/ek-lm4f232/sd_card/rvmdk/sd_card.bin differ diff --git a/boards/ek-lm4f232/sd_card/sd_card.c b/boards/ek-lm4f232/sd_card/sd_card.c new file mode 100644 index 0000000..7c67934 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/sd_card.c @@ -0,0 +1,915 @@ +//***************************************************************************** +// +// sd_card.c - Example program for reading files from an SD card. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "utils/cmdline.h" +#include "utils/uartstdio.h" +#include "fatfs/src/ff.h" +#include "fatfs/src/diskio.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      SD card using FAT file system (sd_card)

      +//! +//! This example application demonstrates reading a file system from an SD +//! card. It makes use of FatFs, a FAT file system driver. It provides a +//! simple command console via a serial port for issuing commands to view and +//! navigate the file system on the SD card. +//! +//! The first UART, which is connected to the USB debug virtual serial port on +//! the evaluation board, is configured for 115,200 bits per second, and 8-N-1 +//! mode. When the program is started a message will be printed to the +//! terminal. Type ``help'' for command help. +//! +//! For additional details about FatFs, see the following site: +//! http://elm-chan.org/fsw/ff/00index_e.html +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines the size of the buffers that hold the path, or temporary data from +// the SD card. There are two buffers allocated of this size. The buffer size +// must be large enough to hold the longest expected full path name, including +// the file name, and a trailing null character. +// +//***************************************************************************** +#define PATH_BUF_SIZE 80 + +//***************************************************************************** +// +// Defines the size of the buffer that holds the command line. +// +//***************************************************************************** +#define CMD_BUF_SIZE 64 + +//***************************************************************************** +// +// This buffer holds the full path to the current working directory. Initially +// it is root ("/"). +// +//***************************************************************************** +static char g_pcCwdBuf[PATH_BUF_SIZE] = "/"; + +//***************************************************************************** +// +// A temporary data buffer used when manipulating file paths, or reading data +// from the SD card. +// +//***************************************************************************** +static char g_pcTmpBuf[PATH_BUF_SIZE]; + +//***************************************************************************** +// +// The buffer that holds the command line. +// +//***************************************************************************** +static char g_pcCmdBuf[CMD_BUF_SIZE]; + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static DIR g_sDirObject; +static FILINFO g_sFileInfo; +static FIL g_sFileObject; + +//***************************************************************************** +// +// A structure that holds a mapping between an FRESULT numerical code, and a +// string representation. FRESULT codes are returned from the FatFs FAT file +// system driver. +// +//***************************************************************************** +typedef struct +{ + FRESULT iFResult; + char *pcResultStr; +} +tFResultString; + +//***************************************************************************** +// +// A macro to make it easy to add result codes to the table. +// +//***************************************************************************** +#define FRESULT_ENTRY(f) { (f), (#f) } + +//***************************************************************************** +// +// A table that holds a mapping between the numerical FRESULT code and it's +// name as a string. This is used for looking up error codes for printing to +// the console. +// +//***************************************************************************** +tFResultString g_psFResultStrings[] = +{ + FRESULT_ENTRY(FR_OK), + FRESULT_ENTRY(FR_DISK_ERR), + FRESULT_ENTRY(FR_INT_ERR), + FRESULT_ENTRY(FR_NOT_READY), + FRESULT_ENTRY(FR_NO_FILE), + FRESULT_ENTRY(FR_NO_PATH), + FRESULT_ENTRY(FR_INVALID_NAME), + FRESULT_ENTRY(FR_DENIED), + FRESULT_ENTRY(FR_EXIST), + FRESULT_ENTRY(FR_INVALID_OBJECT), + FRESULT_ENTRY(FR_WRITE_PROTECTED), + FRESULT_ENTRY(FR_INVALID_DRIVE), + FRESULT_ENTRY(FR_NOT_ENABLED), + FRESULT_ENTRY(FR_NO_FILESYSTEM), + FRESULT_ENTRY(FR_MKFS_ABORTED), + FRESULT_ENTRY(FR_TIMEOUT), + FRESULT_ENTRY(FR_LOCKED), + FRESULT_ENTRY(FR_NOT_ENOUGH_CORE), + FRESULT_ENTRY(FR_TOO_MANY_OPEN_FILES), + FRESULT_ENTRY(FR_INVALID_PARAMETER), +}; + +//***************************************************************************** +// +// A macro that holds the number of result codes. +// +//***************************************************************************** +#define NUM_FRESULT_CODES (sizeof(g_psFResultStrings) / \ + sizeof(tFResultString)) + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// This function returns a string representation of an error code that was +// returned from a function call to FatFs. It can be used for printing human +// readable error messages. +// +//***************************************************************************** +const char * +StringFromFResult(FRESULT iFResult) +{ + uint_fast8_t ui8Idx; + + // + // Enter a loop to search the error code table for a matching error code. + // + for(ui8Idx = 0; ui8Idx < NUM_FRESULT_CODES; ui8Idx++) + { + // + // If a match is found, then return the string name of the error code. + // + if(g_psFResultStrings[ui8Idx].iFResult == iFResult) + { + return(g_psFResultStrings[ui8Idx].pcResultStr); + } + } + + // + // At this point no matching code was found, so return a string indicating + // an unknown error. + // + return("UNKNOWN ERROR CODE"); +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. FatFs requires a timer tick +// every 10 ms for internal timing purposes. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Call the FatFs tick timer. + // + disk_timerproc(); +} + +//***************************************************************************** +// +// This function implements the "ls" command. It opens the current directory +// and enumerates through the contents, and prints a line for each item it +// finds. It shows details such as file attributes, time and date, and the +// file size, along with the name. It shows a summary of file sizes at the end +// along with free space. +// +//***************************************************************************** +int +Cmd_ls(int argc, char *argv[]) +{ + uint32_t ui32TotalSize; + uint32_t ui32FileCount; + uint32_t ui32DirCount; + FRESULT iFResult; + FATFS *psFatFs; + char *pcFileName; +#if _USE_LFN + char pucLfn[_MAX_LFN + 1]; + g_sFileInfo.lfname = pucLfn; + g_sFileInfo.lfsize = sizeof(pucLfn); +#endif + + + // + // Open the current directory for access. + // + iFResult = f_opendir(&g_sDirObject, g_pcCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + return((int)iFResult); + } + + ui32TotalSize = 0; + ui32FileCount = 0; + ui32DirCount = 0; + + // + // Give an extra blank line before the listing. + // + UARTprintf("\n"); + + // + // Enter loop to enumerate through all directory entries. + // + for(;;) + { + // + // Read an entry from the directory. + // + iFResult = f_readdir(&g_sDirObject, &g_sFileInfo); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + return((int)iFResult); + } + + // + // If the file name is blank, then this is the end of the listing. + // + if(!g_sFileInfo.fname[0]) + { + break; + } + + // + // If the attribue is directory, then increment the directory count. + // + if(g_sFileInfo.fattrib & AM_DIR) + { + ui32DirCount++; + } + + // + // Otherwise, it is a file. Increment the file count, and add in the + // file size to the total. + // + else + { + ui32FileCount++; + ui32TotalSize += g_sFileInfo.fsize; + } + +#if _USE_LFN + pcFileName = ((*g_sFileInfo.lfname)?g_sFileInfo.lfname:g_sFileInfo.fname); +#else + pcFileName = g_sFileInfo.fname; +#endif + // + // Print the entry information on a single line with formatting to show + // the attributes, date, time, size, and name. + // + UARTprintf("%c%c%c%c%c %u/%02u/%02u %02u:%02u %9u %s\n", + (g_sFileInfo.fattrib & AM_DIR) ? 'D' : '-', + (g_sFileInfo.fattrib & AM_RDO) ? 'R' : '-', + (g_sFileInfo.fattrib & AM_HID) ? 'H' : '-', + (g_sFileInfo.fattrib & AM_SYS) ? 'S' : '-', + (g_sFileInfo.fattrib & AM_ARC) ? 'A' : '-', + (g_sFileInfo.fdate >> 9) + 1980, + (g_sFileInfo.fdate >> 5) & 15, + g_sFileInfo.fdate & 31, + (g_sFileInfo.ftime >> 11), + (g_sFileInfo.ftime >> 5) & 63, + g_sFileInfo.fsize, + pcFileName); + } + + // + // Print summary lines showing the file, dir, and size totals. + // + UARTprintf("\n%4u File(s),%10u bytes total\n%4u Dir(s)", + ui32FileCount, ui32TotalSize, ui32DirCount); + + // + // Get the free space. + // + iFResult = f_getfree("/", (DWORD *)&ui32TotalSize, &psFatFs); + + // + // Check for error and return if there is a problem. + // + if(iFResult != FR_OK) + { + return((int)iFResult); + } + + // + // Display the amount of free space that was calculated. + // + UARTprintf(", %10uK bytes free\n", (ui32TotalSize * + psFatFs->free_clust / 2)); + + // + // Made it to here, return with no errors. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "cd" command. It takes an argument that +// specifies the directory to make the current working directory. Path +// separators must use a forward slash "/". The argument to cd can be one of +// the following: +// +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so dont try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory to +// make sure it exists. If the new path is opened successfully, then the +// current working directory (cwd) is changed to the new path. +// +//***************************************************************************** +int +Cmd_cd(int argc, char *argv[]) +{ + uint_fast8_t ui8Idx; + FRESULT iFResult; + + // + // Copy the current working path into a temporary buffer so it can be + // manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If the first character is /, then this is a fully specified path, and it + // should just be used as-is. + // + if(argv[1][0] == '/') + { + // + // Make sure the new path is not bigger than the cwd buffer. + // + if(strlen(argv[1]) + 1 > sizeof(g_pcCwdBuf)) + { + UARTprintf("Resulting path name is too long\n"); + return(0); + } + + // + // If the new path name (in argv[1]) is not too long, then copy it + // into the temporary buffer so it can be checked. + // + else + { + strncpy(g_pcTmpBuf, argv[1], sizeof(g_pcTmpBuf)); + } + } + + // + // If the argument is .. then attempt to remove the lowest level on the + // CWD. + // + else if(!strcmp(argv[1], "..")) + { + // + // Get the index to the last character in the current path. + // + ui8Idx = strlen(g_pcTmpBuf) - 1; + + // + // Back up from the end of the path name until a separator (/) is + // found, or until we bump up to the start of the path. + // + while((g_pcTmpBuf[ui8Idx] != '/') && (ui8Idx > 1)) + { + // + // Back up one character. + // + ui8Idx--; + } + + // + // Now we are either at the lowest level separator in the current path, + // or at the beginning of the string (root). So set the new end of + // string here, effectively removing that last part of the path. + // + g_pcTmpBuf[ui8Idx] = 0; + } + + // + // Otherwise this is just a normal path name from the current directory, + // and it needs to be appended to the current path. + // + else + { + // + // Test to make sure that when the new additional path is added on to + // the current path, there is room in the buffer for the full new path. + // It needs to include a new separator, and a trailing null character. + // + if(strlen(g_pcTmpBuf) + strlen(argv[1]) + 1 + 1 > sizeof(g_pcCwdBuf)) + { + UARTprintf("Resulting path name is too long\n"); + return(0); + } + + // + // The new path is okay, so add the separator and then append the new + // directory to the path. + // + else + { + // + // If not already at the root level, then append a / + // + if(strcmp(g_pcTmpBuf, "/")) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Append the new directory to the path. + // + strcat(g_pcTmpBuf, argv[1]); + } + } + + // + // At this point, a candidate new directory path is in chTmpBuf. Try to + // open it to make sure it is valid. + // + iFResult = f_opendir(&g_sDirObject, g_pcTmpBuf); + + // + // If it can't be opened, then it is a bad path. Inform the user and + // return. + // + if(iFResult != FR_OK) + { + UARTprintf("cd: %s\n", g_pcTmpBuf); + return((int)iFResult); + } + + // + // Otherwise, it is a valid new path, so copy it into the CWD. + // + else + { + strncpy(g_pcCwdBuf, g_pcTmpBuf, sizeof(g_pcCwdBuf)); + } + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "pwd" command. It simply prints the current +// working directory. +// +//***************************************************************************** +int +Cmd_pwd(int argc, char *argv[]) +{ + // + // Print the CWD to the console. + // + UARTprintf("%s\n", g_pcCwdBuf); + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "cat" command. It reads the contents of a file +// and prints it to the console. This should only be used on text files. If +// it is used on a binary file, then a bunch of garbage is likely to printed on +// the console. +// +//***************************************************************************** +int +Cmd_cat(int argc, char *argv[]) +{ + FRESULT iFResult; + uint32_t ui32BytesRead; + + // + // First, check to make sure that the current path (CWD), plus the file + // name, plus a separator and trailing null, will all fit in the temporary + // buffer that will be used to hold the file name. The file name must be + // fully specified, with path, to FatFs. + // + if(strlen(g_pcCwdBuf) + strlen(argv[1]) + 1 + 1 > sizeof(g_pcTmpBuf)) + { + UARTprintf("Resulting path name is too long\n"); + return(0); + } + + // + // Copy the current path to the temporary buffer so it can be manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If not already at the root level, then append a separator. + // + if(strcmp("/", g_pcCwdBuf)) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Now finally, append the file name to result in a fully specified file. + // + strcat(g_pcTmpBuf, argv[1]); + + // + // Open the file for reading. + // + iFResult = f_open(&g_sFileObject, g_pcTmpBuf, FA_READ); + + // + // If there was some problem opening the file, then return an error. + // + if(iFResult != FR_OK) + { + return((int)iFResult); + } + + // + // Enter a loop to repeatedly read data from the file and display it, until + // the end of the file is reached. + // + do + { + // + // Read a block of data from the file. Read as much as can fit in the + // temporary buffer, including a space for the trailing null. + // + iFResult = f_read(&g_sFileObject, g_pcTmpBuf, sizeof(g_pcTmpBuf) - 1, + (UINT *)&ui32BytesRead); + + // + // If there was an error reading, then print a newline and return the + // error to the user. + // + if(iFResult != FR_OK) + { + UARTprintf("\n"); + return((int)iFResult); + } + + // + // Null terminate the last block that was read to make it a null + // terminated string that can be used with printf. + // + g_pcTmpBuf[ui32BytesRead] = 0; + + // + // Print the last chunk of the file that was received. + // + UARTprintf("%s", g_pcTmpBuf); + } + while(ui32BytesRead == sizeof(g_pcTmpBuf) - 1); + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This function implements the "help" command. It prints a simple list of the +// available commands with a brief description. +// +//***************************************************************************** +int +Cmd_help(int argc, char *argv[]) +{ + tCmdLineEntry *psEntry; + + // + // Print some header text. + // + UARTprintf("\nAvailable commands\n"); + UARTprintf("------------------\n"); + + // + // Point at the beginning of the command table. + // + psEntry = &g_psCmdTable[0]; + + // + // Enter a loop to read each entry from the command table. The end of the + // table has been reached when the command name is NULL. + // + while(psEntry->pcCmd) + { + // + // Print the command name and the brief description. + // + UARTprintf("%6s: %s\n", psEntry->pcCmd, psEntry->pcHelp); + + // + // Advance to the next entry in the table. + // + psEntry++; + } + + // + // Return success. + // + return(0); +} + +//***************************************************************************** +// +// This is the table that holds the command names, implementing functions, and +// brief description. +// +//***************************************************************************** +tCmdLineEntry g_psCmdTable[] = +{ + { "help", Cmd_help, "Display list of commands" }, + { "h", Cmd_help, "alias for help" }, + { "?", Cmd_help, "alias for help" }, + { "ls", Cmd_ls, "Display list of files" }, + { "chdir", Cmd_cd, "Change directory" }, + { "cd", Cmd_cd, "alias for chdir" }, + { "pwd", Cmd_pwd, "Show current working directory" }, + { "cat", Cmd_cat, "Show contents of a text file" }, + { 0, 0, 0 } +}; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, ROM_SysCtlClockGet()); +} + +//***************************************************************************** +// +// The program main function. It performs initialization, then runs a command +// processing loop to read commands from the console. +// +//***************************************************************************** +int +main(void) +{ + int nStatus; + FRESULT iFResult; + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + + // + // Configure SysTick for a 100Hz interrupt. The FatFs driver wants a 10 ms + // tick. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / 100); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the UART as a console for text I/O. + // + ConfigureUART(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "sd_card", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + + // + // Show some instructions on the display + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "Connect a", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 20, false); + GrStringDrawCentered(&g_sContext, "terminal", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 30, false); + GrStringDrawCentered(&g_sContext, "to UART0.", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 40, false); + GrStringDrawCentered(&g_sContext, "115000,N,8,1", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 50, false); + + // + // Print hello message to user. + // + UARTprintf("\n\nSD Card Example Program\n"); + UARTprintf("Type \'help\' for help.\n"); + + // + // Mount the file system, using logical disk 0. + // + iFResult = f_mount(0, &g_sFatFs); + if(iFResult != FR_OK) + { + UARTprintf("f_mount error: %s\n", StringFromFResult(iFResult)); + return(1); + } + + // + // Enter an infinite loop for reading and processing commands from the + // user. + // + while(1) + { + // + // Print a prompt to the console. Show the CWD. + // + UARTprintf("\n%s> ", g_pcCwdBuf); + + // + // Get a line of text from the user. + // + UARTgets(g_pcCmdBuf, sizeof(g_pcCmdBuf)); + + // + // Pass the line from the user to the command processor. It will be + // parsed and valid commands executed. + // + nStatus = CmdLineProcess(g_pcCmdBuf); + + // + // Handle the case of bad command. + // + if(nStatus == CMDLINE_BAD_CMD) + { + UARTprintf("Bad command!\n"); + } + + // + // Handle the case of too many arguments. + // + else if(nStatus == CMDLINE_TOO_MANY_ARGS) + { + UARTprintf("Too many arguments for command processor!\n"); + } + + // + // Otherwise the command was executed. Print the error code if one was + // returned. + // + else if(nStatus != 0) + { + UARTprintf("Command returned error code %s\n", + StringFromFResult((FRESULT)nStatus)); + } + } +} diff --git a/boards/ek-lm4f232/sd_card/sd_card.ewd b/boards/ek-lm4f232/sd_card/sd_card.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/sd_card/sd_card.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/sd_card/sd_card.ewp b/boards/ek-lm4f232/sd_card/sd_card.ewp new file mode 100644 index 0000000..0691074 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/sd_card.ewp @@ -0,0 +1,810 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\option\cc932.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\utils\cmdline.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\mmc-ek-lm4f232.c + + + $PROJ_DIR$\sd_card.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/ek-lm4f232/sd_card/sd_card.icf b/boards/ek-lm4f232/sd_card/sd_card.icf new file mode 100644 index 0000000..7dd2cc5 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/sd_card.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// sd_card.icf - Linker configuration file for sd_card. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/sd_card/sd_card.ld b/boards/ek-lm4f232/sd_card/sd_card.ld new file mode 100644 index 0000000..184f7bd --- /dev/null +++ b/boards/ek-lm4f232/sd_card/sd_card.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * sd_card.ld - Linker configuration file for sd_card. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/sd_card/sd_card.sct b/boards/ek-lm4f232/sd_card/sd_card.sct new file mode 100644 index 0000000..3a64d15 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/sd_card.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; sd_card.sct - Linker configuration file for sd_card. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/sd_card/sd_card.uvopt b/boards/ek-lm4f232/sd_card/sd_card.uvopt new file mode 100644 index 0000000..1fd0949 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/sd_card.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + sd_card + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\option\cc932.c + cc932.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\cmdline.c + cmdline.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\mmc-ek-lm4f232.c + mmc-ek-lm4f232.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\sd_card.c + sd_card.c + + + 1 + 7 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/sd_card/sd_card.uvproj b/boards/ek-lm4f232/sd_card/sd_card.uvproj new file mode 100644 index 0000000..53114e6 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/sd_card.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + sd_card + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + sd_card + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\sd_card.bin .\rvmdk\sd_card.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 ENABLE_LFN + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + sd_card.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cc932.c + 1 + ..\..\..\..\third_party\fatfs\src\option\cc932.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + cmdline.c + 1 + ..\..\..\..\utils\cmdline.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + mmc-ek-lm4f232.c + 1 + ..\..\..\..\third_party\fatfs\port\mmc-ek-lm4f232.c + + + sd_card.c + 1 + .\sd_card.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/sd_card/sd_card_ccs.cmd b/boards/ek-lm4f232/sd_card/sd_card_ccs.cmd new file mode 100644 index 0000000..9987cc4 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/sd_card_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * sd_card_ccs.cmd - CCS linker configuration file for sd_card. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/sd_card/startup_ccs.c b/boards/ek-lm4f232/sd_card/startup_ccs.c new file mode 100644 index 0000000..a8afdf3 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/sd_card/startup_ewarm.c b/boards/ek-lm4f232/sd_card/startup_ewarm.c new file mode 100644 index 0000000..73304d6 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/sd_card/startup_gcc.c b/boards/ek-lm4f232/sd_card/startup_gcc.c new file mode 100644 index 0000000..301bae0 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/sd_card/startup_rvmdk.S b/boards/ek-lm4f232/sd_card/startup_rvmdk.S new file mode 100644 index 0000000..fa6f713 --- /dev/null +++ b/boards/ek-lm4f232/sd_card/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/sine_demo/Makefile b/boards/ek-lm4f232/sine_demo/Makefile new file mode 100644 index 0000000..5a605e5 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/Makefile @@ -0,0 +1,88 @@ +#****************************************************************************** +# +# Makefile - Rules for building the sine_demo example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the sine_demo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/sine_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the sine_demo example. +# +${COMPILER}/sine_demo.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/sine_demo.axf: ${COMPILER}/sine_demo.o +${COMPILER}/sine_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/sine_demo.axf: ${COMPILER}/stripchartwidget.o +${COMPILER}/sine_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/sine_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/sine_demo.axf: sine_demo.ld +SCATTERgcc_sine_demo=sine_demo.ld +ENTRY_sine_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/sine_demo/ccs/.ccsimportspec b/boards/ek-lm4f232/sine_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..ca635fe --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/sine_demo/ccs/.ccsproject b/boards/ek-lm4f232/sine_demo/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/sine_demo/ccs/.cproject b/boards/ek-lm4f232/sine_demo/ccs/.cproject new file mode 100644 index 0000000..ed9c022 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/sine_demo/ccs/.project b/boards/ek-lm4f232/sine_demo/ccs/.project new file mode 100644 index 0000000..a53ff56 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/ccs/.project @@ -0,0 +1,60 @@ + + + sine_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + sine_demo.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/sine_demo/sine_demo.c + + + sine_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/sine_demo/sine_demo_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/sine_demo/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + drivers/stripchartwidget.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/stripchartwidget.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/sine_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/sine_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/sine_demo/ccs/Debug/sine_demo.bin b/boards/ek-lm4f232/sine_demo/ccs/Debug/sine_demo.bin new file mode 100644 index 0000000..aee3ebd Binary files /dev/null and b/boards/ek-lm4f232/sine_demo/ccs/Debug/sine_demo.bin differ diff --git a/boards/ek-lm4f232/sine_demo/ccs/Debug/sine_demo.out b/boards/ek-lm4f232/sine_demo/ccs/Debug/sine_demo.out new file mode 100644 index 0000000..6486150 Binary files /dev/null and b/boards/ek-lm4f232/sine_demo/ccs/Debug/sine_demo.out differ diff --git a/boards/ek-lm4f232/sine_demo/ccs/macros.ini_initial b/boards/ek-lm4f232/sine_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/sine_demo/ccs/target_config.ccxml b/boards/ek-lm4f232/sine_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/sine_demo/ewarm/Exe/sine_demo.bin b/boards/ek-lm4f232/sine_demo/ewarm/Exe/sine_demo.bin new file mode 100644 index 0000000..6205355 Binary files /dev/null and b/boards/ek-lm4f232/sine_demo/ewarm/Exe/sine_demo.bin differ diff --git a/boards/ek-lm4f232/sine_demo/ewarm/Exe/sine_demo.out b/boards/ek-lm4f232/sine_demo/ewarm/Exe/sine_demo.out new file mode 100644 index 0000000..9563c9b Binary files /dev/null and b/boards/ek-lm4f232/sine_demo/ewarm/Exe/sine_demo.out differ diff --git a/boards/ek-lm4f232/sine_demo/gcc/sine_demo.axf b/boards/ek-lm4f232/sine_demo/gcc/sine_demo.axf new file mode 100644 index 0000000..b00bd8e Binary files /dev/null and b/boards/ek-lm4f232/sine_demo/gcc/sine_demo.axf differ diff --git a/boards/ek-lm4f232/sine_demo/gcc/sine_demo.bin b/boards/ek-lm4f232/sine_demo/gcc/sine_demo.bin new file mode 100644 index 0000000..04c6797 Binary files /dev/null and b/boards/ek-lm4f232/sine_demo/gcc/sine_demo.bin differ diff --git a/boards/ek-lm4f232/sine_demo/readme.txt b/boards/ek-lm4f232/sine_demo/readme.txt new file mode 100644 index 0000000..66990cd --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/readme.txt @@ -0,0 +1,24 @@ +Sine Demo + +This example uses the floating point capabilities of the Tiva C Series +processor to compute a sine wave and show it on the display. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/sine_demo/rvmdk/sine_demo.axf b/boards/ek-lm4f232/sine_demo/rvmdk/sine_demo.axf new file mode 100644 index 0000000..1ceb0e3 Binary files /dev/null and b/boards/ek-lm4f232/sine_demo/rvmdk/sine_demo.axf differ diff --git a/boards/ek-lm4f232/sine_demo/rvmdk/sine_demo.bin b/boards/ek-lm4f232/sine_demo/rvmdk/sine_demo.bin new file mode 100644 index 0000000..51c7b5b Binary files /dev/null and b/boards/ek-lm4f232/sine_demo/rvmdk/sine_demo.bin differ diff --git a/boards/ek-lm4f232/sine_demo/sine_demo.c b/boards/ek-lm4f232/sine_demo/sine_demo.c new file mode 100644 index 0000000..cea2f7d --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/sine_demo.c @@ -0,0 +1,332 @@ +//***************************************************************************** +// +// sine_demo.c - Computes a sine wave and displays it on the screen. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include +#include "driverlib/fpu.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/stripchartwidget.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Sine Demo (sine_demo)

      +//! +//! This example uses the floating point capabilities of the Tiva C Series +//! processor to compute a sine wave and show it on the display. +// +//***************************************************************************** + +//***************************************************************************** +// +// Provide a definition for M_PI, if it was not provided by math.h. +// +//***************************************************************************** +#ifndef M_PI +#define M_PI 3.14159265358979323846F +#endif + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 20 +#define FSECONDS_PER_TICK (1.0F / (float)TICKS_PER_SECOND) + +//***************************************************************************** +// +// A counter for system clock ticks, used for tracking time. +// +//***************************************************************************** +static volatile uint32_t g_ui32TickCount; + +//***************************************************************************** +// +// Define an off-screen buffer and display structure. This is used by the +// strip chart widget for drawing a scrolling display. +// +//***************************************************************************** +#define OFFSCREEN_BUF_SIZE GrOffScreen4BPPSize(96, 64) +uint8_t g_pui8OffscreenBuf[OFFSCREEN_BUF_SIZE]; +tDisplay g_sOffscreenDisplay; + +//***************************************************************************** +// +// Create a palette for the off-screen buffer that is used by the strip chart. +// +//***************************************************************************** +uint32_t g_pui32Palette[] = +{ + ClrBlack, + ClrWhite, + ClrRed, + ClrDarkGreen, +}; +#define NUM_PALETTE_ENTRIES (sizeof(g_pui32Palette) / sizeof(uint32_t)) + +//***************************************************************************** +// +// Define the series for the strip chart. The SERIES_LENGTH is the maximum +// number of points that will be shown on the chart. +// +//***************************************************************************** +#define SERIES_LENGTH 96 +static tStripChartSeries g_sSeries = +{ + 0, "SINE", ClrRed, 1, 1, 0, 0 +}; + +//***************************************************************************** +// +// Defines the X-axis for the strip chart +// +//***************************************************************************** +static tStripChartAxis i16Axis16X = +{ + "TIME", // title of axis + 0, // label for minimum of axis + 0, // label for maximum of axis + 0, // minimum value for the axis + 95, // maximum value for the axis + TICKS_PER_SECOND // grid interval for the axis +}; + +//***************************************************************************** +// +// Defines the Y-axis for the strip chart. +// +//***************************************************************************** +static tStripChartAxis i16Axis16Y = +{ + "SIN(2pi*t/4)*0.5", // title of the axis + "-1", // label for minimum of axis + "+1", // label for maximum of axis + -32, // minimum value for the axis + 31, // maximum value for the axis + 16 // grid interval for the axis +}; + +//***************************************************************************** +// +// Defines the strip chart widget. This structure requires additional +// run-time initialization. +// +//***************************************************************************** +StripChart(g_sStripChart, WIDGET_ROOT, 0, 0, &g_sCFAL96x64x16, 0, 0, 96, 64, + 0, g_psFontFixed6x8, ClrBlack, ClrWhite, ClrWhite, ClrDarkGreen, + &i16Axis16X, &i16Axis16Y, &g_sOffscreenDisplay); + +//***************************************************************************** +// +// Creates a buffer for holding the values of the data series. It must be +// large enough to hold the maximum number of data points in the series that +// will be shown on the strip chart. +// +//***************************************************************************** +static int8_t g_i8SeriesData[SERIES_LENGTH]; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. It simply increments a +// counter that is used for timing. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Update our tick counter. + // + g_ui32TickCount++; +} + +//***************************************************************************** +// +// Compute and display a sine wave. +// +//***************************************************************************** +int +main(void) +{ + uint_fast16_t ui16ItemCount = 0; + uint32_t ui32LastTickCount = 0; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly at 50 MHz. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Configure SysTick to generate a periodic time tick interrupt. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize an offscreen display and assign the palette. This offscreen + // buffer is needed by the strip chart widget. + // + GrOffScreen4BPPInit(&g_sOffscreenDisplay, g_pui8OffscreenBuf, 96, 64); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplay, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + + // + // Set the data series buffer pointer to point at the storage where the + // series data points will be stored. + // + g_sSeries.pvData = g_i8SeriesData; + + // + // Add the series to the strip chart + // + StripChartSeriesAdd(&g_sStripChart, &g_sSeries); + + // + // Add the strip chart to the widget tree. + // + WidgetAdd(WIDGET_ROOT, &g_sStripChart.sBase); + + // + // Enter a loop to continuously calculate a sine wave. + // + while(1) + { + float fElapsedTime; + float fRadians; + float fSine; + + // + // Wait for the next timer tick. + // + while(ui32LastTickCount == g_ui32TickCount) + { + } + ui32LastTickCount = g_ui32TickCount; + + // + // Preparing to add a new data point to the strip chart ... + // If the number count of items in the strip chart has reached the + // maximum value, then the data points need to "slide down" in the + // buffer so new data can be added at the end. + // + if(ui16ItemCount == SERIES_LENGTH) + { + memmove(&g_i8SeriesData[0], &g_i8SeriesData[1], SERIES_LENGTH - 1); + } + + // + // Otherwise, the series data buffer is less than full so just + // increment the count of data points. + // + else + { + // + // Increment the number of items that have been added to the strip + // chart series data buffer. + // + ui16ItemCount++; + + // + // Since the count of data items has changed, it must be updated in + // the data series. + // + g_sSeries.ui16NumItems = ui16ItemCount; + } + + // + // Compute the elapsed time in decimal seconds, in floating point + // format. + // + fElapsedTime = (float)g_ui32TickCount * FSECONDS_PER_TICK; + + // + // Convert the time to radians. + // + fRadians = fElapsedTime * 2.0 * (float)M_PI; + + // + // Adjust the period of the wave. This will give us a wave period + // of 4 seconds, or 0.25 Hz. This number was chosen arbitrarily to + // provide a nice looking wave on the display. + // + fRadians /= 4.0; + + // + // Compute the sine. Multiply by 0.5 to reduce the amplitude. + // + fSine = sinf(fRadians) * 0.5; + + // + // Finally, save the sine value into the last location in the series + // data point buffer. Convert the sine amplitude to display pixels. + // (Amplitude 1 = 32 pixels) + // + g_i8SeriesData[ui16ItemCount - 1] = (int8_t)(fSine * 32.0); + + // + // Now that a new data point has been added to the series, advance + // the strip chart. + // + StripChartAdvance(&g_sStripChart, 1); + + // + // Request a repaint and run the widget processing queue. + // + WidgetPaint(WIDGET_ROOT); + WidgetMessageQueueProcess(); + } +} diff --git a/boards/ek-lm4f232/sine_demo/sine_demo.ewd b/boards/ek-lm4f232/sine_demo/sine_demo.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/sine_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/sine_demo/sine_demo.ewp b/boards/ek-lm4f232/sine_demo/sine_demo.ewp new file mode 100644 index 0000000..2914c9a --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/sine_demo.ewp @@ -0,0 +1,795 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\sine_demo.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\drivers\stripchartwidget.c + + + diff --git a/boards/ek-lm4f232/sine_demo/sine_demo.icf b/boards/ek-lm4f232/sine_demo/sine_demo.icf new file mode 100644 index 0000000..c8f6fda --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/sine_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// sine_demo.icf - Linker configuration file for sine_demo. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/sine_demo/sine_demo.ld b/boards/ek-lm4f232/sine_demo/sine_demo.ld new file mode 100644 index 0000000..d9c4a58 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/sine_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * sine_demo.ld - Linker configuration file for sine_demo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/sine_demo/sine_demo.sct b/boards/ek-lm4f232/sine_demo/sine_demo.sct new file mode 100644 index 0000000..a994555 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/sine_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; sine_demo.sct - Linker configuration file for sine_demo. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/sine_demo/sine_demo.uvopt b/boards/ek-lm4f232/sine_demo/sine_demo.uvopt new file mode 100644 index 0000000..999661b --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/sine_demo.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + sine_demo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\sine_demo.c + sine_demo.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\stripchartwidget.c + stripchartwidget.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/sine_demo/sine_demo.uvproj b/boards/ek-lm4f232/sine_demo/sine_demo.uvproj new file mode 100644 index 0000000..3073c84 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/sine_demo.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + sine_demo + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + sine_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\sine_demo.bin .\rvmdk\sine_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + sine_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + sine_demo.c + 1 + .\sine_demo.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + stripchartwidget.c + 1 + ..\drivers\stripchartwidget.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/sine_demo/sine_demo_ccs.cmd b/boards/ek-lm4f232/sine_demo/sine_demo_ccs.cmd new file mode 100644 index 0000000..837e829 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/sine_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * sine_demo_ccs.cmd - CCS linker configuration file for sine_demo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/sine_demo/startup_ccs.c b/boards/ek-lm4f232/sine_demo/startup_ccs.c new file mode 100644 index 0000000..a8afdf3 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/sine_demo/startup_ewarm.c b/boards/ek-lm4f232/sine_demo/startup_ewarm.c new file mode 100644 index 0000000..73304d6 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/sine_demo/startup_gcc.c b/boards/ek-lm4f232/sine_demo/startup_gcc.c new file mode 100644 index 0000000..301bae0 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/sine_demo/startup_rvmdk.S b/boards/ek-lm4f232/sine_demo/startup_rvmdk.S new file mode 100644 index 0000000..fa6f713 --- /dev/null +++ b/boards/ek-lm4f232/sine_demo/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/softuart_echo/Makefile b/boards/ek-lm4f232/softuart_echo/Makefile new file mode 100644 index 0000000..b44c14c --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the softuart_echo example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the softuart_echo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/softuart_echo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the softuart_echo example. +# +${COMPILER}/softuart_echo.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/softuart_echo.axf: ${COMPILER}/softuart.o +${COMPILER}/softuart_echo.axf: ${COMPILER}/softuart_echo.o +${COMPILER}/softuart_echo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/softuart_echo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/softuart_echo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/softuart_echo.axf: softuart_echo.ld +SCATTERgcc_softuart_echo=softuart_echo.ld +ENTRY_softuart_echo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/softuart_echo/ccs/.ccsimportspec b/boards/ek-lm4f232/softuart_echo/ccs/.ccsimportspec new file mode 100644 index 0000000..d6f1e4d --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/softuart_echo/ccs/.ccsproject b/boards/ek-lm4f232/softuart_echo/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/softuart_echo/ccs/.cproject b/boards/ek-lm4f232/softuart_echo/ccs/.cproject new file mode 100644 index 0000000..033cc86 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/softuart_echo/ccs/.project b/boards/ek-lm4f232/softuart_echo/ccs/.project new file mode 100644 index 0000000..2f371ab --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/ccs/.project @@ -0,0 +1,60 @@ + + + softuart_echo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + softuart_echo.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/softuart_echo/softuart_echo.c + + + softuart_echo_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/softuart_echo/softuart_echo_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/softuart_echo/startup_ccs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/softuart.c + 1 + SW_ROOT/utils/softuart.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/softuart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/softuart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/softuart_echo/ccs/Debug/softuart_echo.bin b/boards/ek-lm4f232/softuart_echo/ccs/Debug/softuart_echo.bin new file mode 100644 index 0000000..343b1e3 Binary files /dev/null and b/boards/ek-lm4f232/softuart_echo/ccs/Debug/softuart_echo.bin differ diff --git a/boards/ek-lm4f232/softuart_echo/ccs/Debug/softuart_echo.out b/boards/ek-lm4f232/softuart_echo/ccs/Debug/softuart_echo.out new file mode 100644 index 0000000..79e5e17 Binary files /dev/null and b/boards/ek-lm4f232/softuart_echo/ccs/Debug/softuart_echo.out differ diff --git a/boards/ek-lm4f232/softuart_echo/ccs/macros.ini_initial b/boards/ek-lm4f232/softuart_echo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/softuart_echo/ccs/target_config.ccxml b/boards/ek-lm4f232/softuart_echo/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/softuart_echo/ewarm/Exe/softuart_echo.bin b/boards/ek-lm4f232/softuart_echo/ewarm/Exe/softuart_echo.bin new file mode 100644 index 0000000..2c3aca4 Binary files /dev/null and b/boards/ek-lm4f232/softuart_echo/ewarm/Exe/softuart_echo.bin differ diff --git a/boards/ek-lm4f232/softuart_echo/ewarm/Exe/softuart_echo.out b/boards/ek-lm4f232/softuart_echo/ewarm/Exe/softuart_echo.out new file mode 100644 index 0000000..f8c7655 Binary files /dev/null and b/boards/ek-lm4f232/softuart_echo/ewarm/Exe/softuart_echo.out differ diff --git a/boards/ek-lm4f232/softuart_echo/gcc/softuart_echo.axf b/boards/ek-lm4f232/softuart_echo/gcc/softuart_echo.axf new file mode 100644 index 0000000..abb646f Binary files /dev/null and b/boards/ek-lm4f232/softuart_echo/gcc/softuart_echo.axf differ diff --git a/boards/ek-lm4f232/softuart_echo/gcc/softuart_echo.bin b/boards/ek-lm4f232/softuart_echo/gcc/softuart_echo.bin new file mode 100644 index 0000000..cddbacf Binary files /dev/null and b/boards/ek-lm4f232/softuart_echo/gcc/softuart_echo.bin differ diff --git a/boards/ek-lm4f232/softuart_echo/readme.txt b/boards/ek-lm4f232/softuart_echo/readme.txt new file mode 100644 index 0000000..1f1aca0 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/readme.txt @@ -0,0 +1,27 @@ +SoftUART Echo + +This example application utilizes the SoftUART to echo text. The SoftUART +is configured to use the same pins as the first UART (connected to the FTDI +virtual serial port on the evaluation board), at 115,200 baud, 8-n-1 mode. +All characters received on the SoftUART are transmitted back to the +SoftUART. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/softuart_echo/rvmdk/softuart_echo.axf b/boards/ek-lm4f232/softuart_echo/rvmdk/softuart_echo.axf new file mode 100644 index 0000000..39e5863 Binary files /dev/null and b/boards/ek-lm4f232/softuart_echo/rvmdk/softuart_echo.axf differ diff --git a/boards/ek-lm4f232/softuart_echo/rvmdk/softuart_echo.bin b/boards/ek-lm4f232/softuart_echo/rvmdk/softuart_echo.bin new file mode 100644 index 0000000..6ea4936 Binary files /dev/null and b/boards/ek-lm4f232/softuart_echo/rvmdk/softuart_echo.bin differ diff --git a/boards/ek-lm4f232/softuart_echo/softuart_echo.c b/boards/ek-lm4f232/softuart_echo/softuart_echo.c new file mode 100644 index 0000000..25192a7 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/softuart_echo.c @@ -0,0 +1,368 @@ +//***************************************************************************** +// +// softuart_echo.c - Example for reading data from and writing data to the +// SoftUART. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" +#include "utils/softuart.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      SoftUART Echo (softuart_echo)

      +//! +//! This example application utilizes the SoftUART to echo text. The SoftUART +//! is configured to use the same pins as the first UART (connected to the FTDI +//! virtual serial port on the evaluation board), at 115,200 baud, 8-n-1 mode. +//! All characters received on the SoftUART are transmitted back to the +//! SoftUART. +// +//***************************************************************************** + +//***************************************************************************** +// +// The instance data for the SoftUART module. +// +//***************************************************************************** +static tSoftUART g_sUART; + +//***************************************************************************** +// +// The buffer to be used for the SoftUART transmit buffer. +// +//***************************************************************************** +static uint8_t g_pui8TxBuffer[64]; + +//***************************************************************************** +// +// The buffer to be used for the SoftUART receive buffer. +// +//***************************************************************************** +static uint16_t g_pui16RxBuffer[64]; + +//***************************************************************************** +// +// The number of processor clocks in the time period of a single bit on the +// SoftUART interface. +// +//***************************************************************************** +static uint32_t g_ui32BitTime; + +//***************************************************************************** +// +// A flag that is set in the SoftUART "interrupt" handler when there are +// characters in the receive buffer that need to be read. +// +//***************************************************************************** +static volatile uint32_t g_ui32Flag = 0; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the SoftUART transmit timer interrupt. +// +//***************************************************************************** +void +Timer0AIntHandler(void) +{ + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); + + // + // Call the SoftUART transmit timer tick function. + // + SoftUARTTxTimerTick(&g_sUART); +} + +//***************************************************************************** +// +// The interrupt handler for the SoftUART receive timer interrupt. +// +//***************************************************************************** +void +Timer0BIntHandler(void) +{ + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMB_TIMEOUT); + + // + // Call the SoftUART receive timer tick function, and see if the timer + // should be disabled. + // + if(SoftUARTRxTick(&g_sUART, false) == SOFTUART_RXTIMER_END) + { + // + // Disable the timer interrupt since the SoftUART doesn't need it any + // longer. + // + ROM_TimerDisable(TIMER0_BASE, TIMER_B); + } +} + +//***************************************************************************** +// +// The interrupt handler for the SoftUART GPIO edge interrupt. +// +//***************************************************************************** +void +GPIOAIntHandler(void) +{ + // + // Configure the SoftUART receive timer so that it will sample at the + // mid-bit time of this character. + // + ROM_TimerDisable(TIMER0_BASE, TIMER_B); + ROM_TimerLoadSet(TIMER0_BASE, TIMER_B, g_ui32BitTime); + ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMB_TIMEOUT); + ROM_TimerEnable(TIMER0_BASE, TIMER_B); + + // + // Call the SoftUART receive timer tick function. + // + SoftUARTRxTick(&g_sUART, true); +} + +//***************************************************************************** +// +// The SoftUART "interrupt" handler. +// +//***************************************************************************** +void +SoftUARTIntHandler(void) +{ + uint32_t ui32Status; + + // + // Get the interrrupt status. + // + ui32Status = SoftUARTIntStatus(&g_sUART, true); + + // + // Clear the asserted interrupts. + // + SoftUARTIntClear(&g_sUART, ui32Status); + + // + // Set the flag indicating that there are characters to be read from the + // receive buffer. This is done instead of reading the characters here in + // order to minimize the amount of time spent in the "interrupt" handler + // (which is important at higher baud rates). + // + g_ui32Flag = 1; +} + +//***************************************************************************** +// +// Send a string to the UART. +// +//***************************************************************************** +void +UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count) +{ + // + // Loop while there are more characters to send. + // + while(ui32Count--) + { + // + // Write the next character to the UART. + // + SoftUARTCharPut(&g_sUART, *pui8Buffer++); + } +} + +//***************************************************************************** +// +// This example demonstrates how to send a string of data to the UART. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + tContext sContext; + + // + // Set the clocking to run at 50 MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "softuart-echo", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Initialize the display and write some instructions. + // + GrStringDrawCentered(&sContext, "Connect a", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, false); + GrStringDrawCentered(&sContext, "terminal", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, false); + GrStringDrawCentered(&sContext, "to UART0.", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, false); + GrStringDrawCentered(&sContext, "115000,N,8,1", -1, + GrContextDpyWidthGet(&sContext) / 2, 50, false); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); + + // + // Compute the bit time for 115,200 baud. + // + g_ui32BitTime = (ROM_SysCtlClockGet() / 115200) - 1; + + // + // Configure the SoftUART for 8-N-1 operation. + // + SoftUARTInit(&g_sUART); + SoftUARTRxGPIOSet(&g_sUART, GPIO_PORTA_BASE, GPIO_PIN_0); + SoftUARTTxGPIOSet(&g_sUART, GPIO_PORTA_BASE, GPIO_PIN_1); + SoftUARTRxBufferSet(&g_sUART, g_pui16RxBuffer, + sizeof(g_pui16RxBuffer) / sizeof(g_pui16RxBuffer[0])); + SoftUARTTxBufferSet(&g_sUART, g_pui8TxBuffer, sizeof(g_pui8TxBuffer)); + SoftUARTCallbackSet(&g_sUART, SoftUARTIntHandler); + SoftUARTConfigSet(&g_sUART, + (SOFTUART_CONFIG_WLEN_8 | SOFTUART_CONFIG_STOP_ONE | + SOFTUART_CONFIG_PAR_NONE)); + + // + // Configure the timer for the SoftUART transmitter. + // + ROM_TimerConfigure(TIMER0_BASE, + (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODIC | + TIMER_CFG_B_PERIODIC)); + ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, g_ui32BitTime); + ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT | TIMER_TIMB_TIMEOUT); + ROM_TimerEnable(TIMER0_BASE, TIMER_A); + + // + // Set the priorities of the interrupts associated with the SoftUART. The + // receiver is higher priority than the transmitter, and the receiver edge + // interrupt is higher priority than the receiver timer interrupt. + // + ROM_IntPrioritySet(INT_GPIOA, 0x00); + ROM_IntPrioritySet(INT_TIMER0B, 0x40); + ROM_IntPrioritySet(INT_TIMER0A, 0x80); + + // + // Enable the interrupts associated with the SoftUART. + // + ROM_IntEnable(INT_TIMER0A); + ROM_IntEnable(INT_TIMER0B); + ROM_IntEnable(INT_GPIOA); + + // + // Prompt for text to be entered. + // + UARTSend((uint8_t *)"\033[2JEnter text: ", 16); + + // + // Enable the SoftUART interrupt. + // + SoftUARTIntEnable(&g_sUART, SOFTUART_INT_RX | SOFTUART_INT_RT); + + // + // Loop forever echoing data through the UART. + // + while(1) + { + // + // Wait until there are characters available in the receive buffer. + // + while(g_ui32Flag == 0) + { + } + g_ui32Flag = 0; + + // + // Loop while there are characters in the receive buffer. + // + while(SoftUARTCharsAvail(&g_sUART)) + { + // + // Read the next character from the UART and write it back to the + // UART. + // + SoftUARTCharPutNonBlocking(&g_sUART, + SoftUARTCharGetNonBlocking(&g_sUART)); + } + } +} diff --git a/boards/ek-lm4f232/softuart_echo/softuart_echo.ewd b/boards/ek-lm4f232/softuart_echo/softuart_echo.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/softuart_echo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/softuart_echo/softuart_echo.ewp b/boards/ek-lm4f232/softuart_echo/softuart_echo.ewp new file mode 100644 index 0000000..977191a --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/softuart_echo.ewp @@ -0,0 +1,795 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\utils\softuart.c + + + $PROJ_DIR$\softuart_echo.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/ek-lm4f232/softuart_echo/softuart_echo.icf b/boards/ek-lm4f232/softuart_echo/softuart_echo.icf new file mode 100644 index 0000000..1eb5dd1 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/softuart_echo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// softuart_echo.icf - Linker configuration file for softuart_echo. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/softuart_echo/softuart_echo.ld b/boards/ek-lm4f232/softuart_echo/softuart_echo.ld new file mode 100644 index 0000000..bb5e1fb --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/softuart_echo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * softuart_echo.ld - Linker configuration file for softuart_echo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/softuart_echo/softuart_echo.sct b/boards/ek-lm4f232/softuart_echo/softuart_echo.sct new file mode 100644 index 0000000..0f3ccc5 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/softuart_echo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; softuart_echo.sct - Linker configuration file for softuart_echo. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/softuart_echo/softuart_echo.uvopt b/boards/ek-lm4f232/softuart_echo/softuart_echo.uvopt new file mode 100644 index 0000000..469d637 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/softuart_echo.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + softuart_echo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\softuart.c + softuart.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\softuart_echo.c + softuart_echo.c + + + 1 + 4 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/softuart_echo/softuart_echo.uvproj b/boards/ek-lm4f232/softuart_echo/softuart_echo.uvproj new file mode 100644 index 0000000..88f3806 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/softuart_echo.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + softuart_echo + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + softuart_echo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\softuart_echo.bin .\rvmdk\softuart_echo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + softuart_echo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + softuart.c + 1 + ..\..\..\..\utils\softuart.c + + + softuart_echo.c + 1 + .\softuart_echo.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/softuart_echo/softuart_echo_ccs.cmd b/boards/ek-lm4f232/softuart_echo/softuart_echo_ccs.cmd new file mode 100644 index 0000000..c8bf4bd --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/softuart_echo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * softuart_echo_ccs.cmd - CCS linker configuration file for softuart_echo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-lm4f232/softuart_echo/startup_ccs.c b/boards/ek-lm4f232/softuart_echo/startup_ccs.c new file mode 100644 index 0000000..23b6c06 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void GPIOAIntHandler(void); +extern void Timer0AIntHandler(void); +extern void Timer0BIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + GPIOAIntHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0AIntHandler, // Timer 0 subtimer A + Timer0BIntHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/softuart_echo/startup_ewarm.c b/boards/ek-lm4f232/softuart_echo/startup_ewarm.c new file mode 100644 index 0000000..56f8a74 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void GPIOAIntHandler(void); +extern void Timer0AIntHandler(void); +extern void Timer0BIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + GPIOAIntHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0AIntHandler, // Timer 0 subtimer A + Timer0BIntHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/softuart_echo/startup_gcc.c b/boards/ek-lm4f232/softuart_echo/startup_gcc.c new file mode 100644 index 0000000..e5f3327 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void GPIOAIntHandler(void); +extern void Timer0AIntHandler(void); +extern void Timer0BIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + GPIOAIntHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0AIntHandler, // Timer 0 subtimer A + Timer0BIntHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/softuart_echo/startup_rvmdk.S b/boards/ek-lm4f232/softuart_echo/startup_rvmdk.S new file mode 100644 index 0000000..488f1a6 --- /dev/null +++ b/boards/ek-lm4f232/softuart_echo/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN GPIOAIntHandler + EXTERN Timer0AIntHandler + EXTERN Timer0BIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD GPIOAIntHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD Timer0AIntHandler ; Timer 0 subtimer A + DCD Timer0BIntHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/timers/Makefile b/boards/ek-lm4f232/timers/Makefile new file mode 100644 index 0000000..3d0d9b6 --- /dev/null +++ b/boards/ek-lm4f232/timers/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the timers example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the timers example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/timers.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the timers example. +# +${COMPILER}/timers.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/timers.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/timers.axf: ${COMPILER}/timers.o +${COMPILER}/timers.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/timers.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/timers.axf: timers.ld +SCATTERgcc_timers=timers.ld +ENTRY_timers=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/timers/ccs/.ccsimportspec b/boards/ek-lm4f232/timers/ccs/.ccsimportspec new file mode 100644 index 0000000..e61983c --- /dev/null +++ b/boards/ek-lm4f232/timers/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/timers/ccs/.ccsproject b/boards/ek-lm4f232/timers/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/timers/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/timers/ccs/.cproject b/boards/ek-lm4f232/timers/ccs/.cproject new file mode 100644 index 0000000..e743744 --- /dev/null +++ b/boards/ek-lm4f232/timers/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/timers/ccs/.project b/boards/ek-lm4f232/timers/ccs/.project new file mode 100644 index 0000000..a9fe743 --- /dev/null +++ b/boards/ek-lm4f232/timers/ccs/.project @@ -0,0 +1,55 @@ + + + timers + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/timers/startup_ccs.c + + + timers.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/timers/timers.c + + + timers_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/timers/timers_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/timers/ccs/Debug/timers.bin b/boards/ek-lm4f232/timers/ccs/Debug/timers.bin new file mode 100644 index 0000000..e16aed5 Binary files /dev/null and b/boards/ek-lm4f232/timers/ccs/Debug/timers.bin differ diff --git a/boards/ek-lm4f232/timers/ccs/Debug/timers.out b/boards/ek-lm4f232/timers/ccs/Debug/timers.out new file mode 100644 index 0000000..665163c Binary files /dev/null and b/boards/ek-lm4f232/timers/ccs/Debug/timers.out differ diff --git a/boards/ek-lm4f232/timers/ccs/macros.ini_initial b/boards/ek-lm4f232/timers/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/timers/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/timers/ccs/target_config.ccxml b/boards/ek-lm4f232/timers/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/timers/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/timers/ewarm/Exe/timers.bin b/boards/ek-lm4f232/timers/ewarm/Exe/timers.bin new file mode 100644 index 0000000..33de757 Binary files /dev/null and b/boards/ek-lm4f232/timers/ewarm/Exe/timers.bin differ diff --git a/boards/ek-lm4f232/timers/ewarm/Exe/timers.out b/boards/ek-lm4f232/timers/ewarm/Exe/timers.out new file mode 100644 index 0000000..0fb5e38 Binary files /dev/null and b/boards/ek-lm4f232/timers/ewarm/Exe/timers.out differ diff --git a/boards/ek-lm4f232/timers/gcc/timers.axf b/boards/ek-lm4f232/timers/gcc/timers.axf new file mode 100644 index 0000000..fe81ee2 Binary files /dev/null and b/boards/ek-lm4f232/timers/gcc/timers.axf differ diff --git a/boards/ek-lm4f232/timers/gcc/timers.bin b/boards/ek-lm4f232/timers/gcc/timers.bin new file mode 100644 index 0000000..9705675 Binary files /dev/null and b/boards/ek-lm4f232/timers/gcc/timers.bin differ diff --git a/boards/ek-lm4f232/timers/readme.txt b/boards/ek-lm4f232/timers/readme.txt new file mode 100644 index 0000000..5ca01a2 --- /dev/null +++ b/boards/ek-lm4f232/timers/readme.txt @@ -0,0 +1,26 @@ +Timer + +This example application demonstrates the use of the timers to generate +periodic interrupts. One timer is set up to interrupt once per second and +the other to interrupt twice per second; each interrupt handler will toggle +its own indicator on the display. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/timers/rvmdk/timers.axf b/boards/ek-lm4f232/timers/rvmdk/timers.axf new file mode 100644 index 0000000..5728bd9 Binary files /dev/null and b/boards/ek-lm4f232/timers/rvmdk/timers.axf differ diff --git a/boards/ek-lm4f232/timers/rvmdk/timers.bin b/boards/ek-lm4f232/timers/rvmdk/timers.bin new file mode 100644 index 0000000..d15d0cc Binary files /dev/null and b/boards/ek-lm4f232/timers/rvmdk/timers.bin differ diff --git a/boards/ek-lm4f232/timers/startup_ccs.c b/boards/ek-lm4f232/timers/startup_ccs.c new file mode 100644 index 0000000..f5f23e1 --- /dev/null +++ b/boards/ek-lm4f232/timers/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/timers/startup_ewarm.c b/boards/ek-lm4f232/timers/startup_ewarm.c new file mode 100644 index 0000000..58e9648 --- /dev/null +++ b/boards/ek-lm4f232/timers/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/timers/startup_gcc.c b/boards/ek-lm4f232/timers/startup_gcc.c new file mode 100644 index 0000000..3237b94 --- /dev/null +++ b/boards/ek-lm4f232/timers/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/timers/startup_rvmdk.S b/boards/ek-lm4f232/timers/startup_rvmdk.S new file mode 100644 index 0000000..94cd075 --- /dev/null +++ b/boards/ek-lm4f232/timers/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN Timer0IntHandler + EXTERN Timer1IntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD Timer0IntHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD Timer1IntHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/timers/timers.c b/boards/ek-lm4f232/timers/timers.c new file mode 100644 index 0000000..15c0f58 --- /dev/null +++ b/boards/ek-lm4f232/timers/timers.c @@ -0,0 +1,234 @@ +//***************************************************************************** +// +// timers.c - Timers example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Timer (timers)

      +//! +//! This example application demonstrates the use of the timers to generate +//! periodic interrupts. One timer is set up to interrupt once per second and +//! the other to interrupt twice per second; each interrupt handler will toggle +//! its own indicator on the display. +// +//***************************************************************************** + +//***************************************************************************** +// +// Flags that contain the current value of the interrupt indicator as displayed +// on the CSTN display. +// +//***************************************************************************** +uint32_t g_ui32Flags; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the first timer interrupt. +// +//***************************************************************************** +void +Timer0IntHandler(void) +{ + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); + + // + // Toggle the flag for the first timer. + // + HWREGBITW(&g_ui32Flags, 0) ^= 1; + + // + // Update the interrupt status on the display. + // + ROM_IntMasterDisable(); + GrStringDraw(&g_sContext, (HWREGBITW(&g_ui32Flags, 0) ? "1" : "0"), -1, 68, + 26, 1); + ROM_IntMasterEnable(); +} + +//***************************************************************************** +// +// The interrupt handler for the second timer interrupt. +// +//***************************************************************************** +void +Timer1IntHandler(void) +{ + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); + + // + // Toggle the flag for the second timer. + // + HWREGBITW(&g_ui32Flags, 1) ^= 1; + + // + // Update the interrupt status on the display. + // + ROM_IntMasterDisable(); + GrStringDraw(&g_sContext, (HWREGBITW(&g_ui32Flags, 1) ? "1" : "0"), -1, 68, + 36, 1); + ROM_IntMasterEnable(); +} + +//***************************************************************************** +// +// This example application demonstrates the use of the timers to generate +// periodic interrupts. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "timers", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + + // + // Initialize timer status display. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDraw(&g_sContext, "Timer 0:", -1, 16, 26, 0); + GrStringDraw(&g_sContext, "Timer 1:", -1, 16, 36, 0); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); + + // + // Enable processor interrupts. + // + ROM_IntMasterEnable(); + + // + // Configure the two 32-bit periodic timers. + // + ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); + ROM_TimerConfigure(TIMER1_BASE, TIMER_CFG_PERIODIC); + ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ROM_SysCtlClockGet()); + ROM_TimerLoadSet(TIMER1_BASE, TIMER_A, ROM_SysCtlClockGet() / 2); + + // + // Setup the interrupts for the timer timeouts. + // + ROM_IntEnable(INT_TIMER0A); + ROM_IntEnable(INT_TIMER1A); + ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); + ROM_TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); + + // + // Enable the timers. + // + ROM_TimerEnable(TIMER0_BASE, TIMER_A); + ROM_TimerEnable(TIMER1_BASE, TIMER_A); + + // + // Loop forever while the timers run. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/timers/timers.ewd b/boards/ek-lm4f232/timers/timers.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/timers/timers.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/timers/timers.ewp b/boards/ek-lm4f232/timers/timers.ewp new file mode 100644 index 0000000..edbbbc2 --- /dev/null +++ b/boards/ek-lm4f232/timers/timers.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\timers.c + + + diff --git a/boards/ek-lm4f232/timers/timers.icf b/boards/ek-lm4f232/timers/timers.icf new file mode 100644 index 0000000..1d5a75f --- /dev/null +++ b/boards/ek-lm4f232/timers/timers.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// timers.icf - Linker configuration file for timers. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/timers/timers.ld b/boards/ek-lm4f232/timers/timers.ld new file mode 100644 index 0000000..be7699c --- /dev/null +++ b/boards/ek-lm4f232/timers/timers.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * timers.ld - Linker configuration file for timers. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/timers/timers.sct b/boards/ek-lm4f232/timers/timers.sct new file mode 100644 index 0000000..2e5c1d9 --- /dev/null +++ b/boards/ek-lm4f232/timers/timers.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; timers.sct - Linker configuration file for timers. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/timers/timers.uvopt b/boards/ek-lm4f232/timers/timers.uvopt new file mode 100644 index 0000000..6f4178e --- /dev/null +++ b/boards/ek-lm4f232/timers/timers.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + timers + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\timers.c + timers.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/timers/timers.uvproj b/boards/ek-lm4f232/timers/timers.uvproj new file mode 100644 index 0000000..880ed60 --- /dev/null +++ b/boards/ek-lm4f232/timers/timers.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + timers + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + timers + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\timers.bin .\rvmdk\timers.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + timers.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + timers.c + 1 + .\timers.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/timers/timers_ccs.cmd b/boards/ek-lm4f232/timers/timers_ccs.cmd new file mode 100644 index 0000000..be987c1 --- /dev/null +++ b/boards/ek-lm4f232/timers/timers_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * timers_ccs.cmd - CCS linker configuration file for timers. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/uart_echo/Makefile b/boards/ek-lm4f232/uart_echo/Makefile new file mode 100644 index 0000000..ecaebab --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the uart_echo example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the uart_echo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/uart_echo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the uart_echo example. +# +${COMPILER}/uart_echo.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/uart_echo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/uart_echo.axf: ${COMPILER}/uart_echo.o +${COMPILER}/uart_echo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/uart_echo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/uart_echo.axf: uart_echo.ld +SCATTERgcc_uart_echo=uart_echo.ld +ENTRY_uart_echo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/uart_echo/ccs/.ccsimportspec b/boards/ek-lm4f232/uart_echo/ccs/.ccsimportspec new file mode 100644 index 0000000..9a02fa9 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/uart_echo/ccs/.ccsproject b/boards/ek-lm4f232/uart_echo/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/uart_echo/ccs/.cproject b/boards/ek-lm4f232/uart_echo/ccs/.cproject new file mode 100644 index 0000000..62209c1 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/uart_echo/ccs/.project b/boards/ek-lm4f232/uart_echo/ccs/.project new file mode 100644 index 0000000..199fcf9 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/ccs/.project @@ -0,0 +1,55 @@ + + + uart_echo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/uart_echo/startup_ccs.c + + + uart_echo.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/uart_echo/uart_echo.c + + + uart_echo_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/uart_echo/uart_echo_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/uart_echo/ccs/Debug/uart_echo.bin b/boards/ek-lm4f232/uart_echo/ccs/Debug/uart_echo.bin new file mode 100644 index 0000000..a2161a8 Binary files /dev/null and b/boards/ek-lm4f232/uart_echo/ccs/Debug/uart_echo.bin differ diff --git a/boards/ek-lm4f232/uart_echo/ccs/Debug/uart_echo.out b/boards/ek-lm4f232/uart_echo/ccs/Debug/uart_echo.out new file mode 100644 index 0000000..b1010e2 Binary files /dev/null and b/boards/ek-lm4f232/uart_echo/ccs/Debug/uart_echo.out differ diff --git a/boards/ek-lm4f232/uart_echo/ccs/macros.ini_initial b/boards/ek-lm4f232/uart_echo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/uart_echo/ccs/target_config.ccxml b/boards/ek-lm4f232/uart_echo/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/uart_echo/ewarm/Exe/uart_echo.bin b/boards/ek-lm4f232/uart_echo/ewarm/Exe/uart_echo.bin new file mode 100644 index 0000000..b6d467d Binary files /dev/null and b/boards/ek-lm4f232/uart_echo/ewarm/Exe/uart_echo.bin differ diff --git a/boards/ek-lm4f232/uart_echo/ewarm/Exe/uart_echo.out b/boards/ek-lm4f232/uart_echo/ewarm/Exe/uart_echo.out new file mode 100644 index 0000000..4f5dab7 Binary files /dev/null and b/boards/ek-lm4f232/uart_echo/ewarm/Exe/uart_echo.out differ diff --git a/boards/ek-lm4f232/uart_echo/gcc/uart_echo.axf b/boards/ek-lm4f232/uart_echo/gcc/uart_echo.axf new file mode 100644 index 0000000..7364fec Binary files /dev/null and b/boards/ek-lm4f232/uart_echo/gcc/uart_echo.axf differ diff --git a/boards/ek-lm4f232/uart_echo/gcc/uart_echo.bin b/boards/ek-lm4f232/uart_echo/gcc/uart_echo.bin new file mode 100644 index 0000000..168e164 Binary files /dev/null and b/boards/ek-lm4f232/uart_echo/gcc/uart_echo.bin differ diff --git a/boards/ek-lm4f232/uart_echo/readme.txt b/boards/ek-lm4f232/uart_echo/readme.txt new file mode 100644 index 0000000..a134456 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/readme.txt @@ -0,0 +1,26 @@ +UART Echo + +This example application utilizes the UART to echo text. The first UART +(connected to the USB debug virtual serial port on the evaluation board) +will be configured in 115,200 baud, 8-n-1 mode. All characters received on +the UART are transmitted back to the UART. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/uart_echo/rvmdk/uart_echo.axf b/boards/ek-lm4f232/uart_echo/rvmdk/uart_echo.axf new file mode 100644 index 0000000..3a3328b Binary files /dev/null and b/boards/ek-lm4f232/uart_echo/rvmdk/uart_echo.axf differ diff --git a/boards/ek-lm4f232/uart_echo/rvmdk/uart_echo.bin b/boards/ek-lm4f232/uart_echo/rvmdk/uart_echo.bin new file mode 100644 index 0000000..994d35f Binary files /dev/null and b/boards/ek-lm4f232/uart_echo/rvmdk/uart_echo.bin differ diff --git a/boards/ek-lm4f232/uart_echo/startup_ccs.c b/boards/ek-lm4f232/uart_echo/startup_ccs.c new file mode 100644 index 0000000..b19b529 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/uart_echo/startup_ewarm.c b/boards/ek-lm4f232/uart_echo/startup_ewarm.c new file mode 100644 index 0000000..fcb4026 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/uart_echo/startup_gcc.c b/boards/ek-lm4f232/uart_echo/startup_gcc.c new file mode 100644 index 0000000..228abab --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/uart_echo/startup_rvmdk.S b/boards/ek-lm4f232/uart_echo/startup_rvmdk.S new file mode 100644 index 0000000..790e74f --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN UARTIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/uart_echo/uart_echo.c b/boards/ek-lm4f232/uart_echo/uart_echo.c new file mode 100644 index 0000000..97a641e --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/uart_echo.c @@ -0,0 +1,226 @@ +//***************************************************************************** +// +// uart_echo.c - Example for reading data from and writing data to the UART in +// an interrupt driven fashion. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +//#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      UART Echo (uart_echo)

      +//! +//! This example application utilizes the UART to echo text. The first UART +//! (connected to the USB debug virtual serial port on the evaluation board) +//! will be configured in 115,200 baud, 8-n-1 mode. All characters received on +//! the UART are transmitted back to the UART. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The UART interrupt handler. +// +//***************************************************************************** +void +UARTIntHandler(void) +{ + uint32_t ui32Status; + + // + // Get the interrrupt status. + // + ui32Status = ROM_UARTIntStatus(UART0_BASE, true); + + // + // Clear the asserted interrupts. + // + ROM_UARTIntClear(UART0_BASE, ui32Status); + + // + // Loop while there are characters in the receive FIFO. + // + while(ROM_UARTCharsAvail(UART0_BASE)) + { + // + // Read the next character from the UART and write it back to the UART. + // + ROM_UARTCharPutNonBlocking(UART0_BASE, + ROM_UARTCharGetNonBlocking(UART0_BASE)); + } +} + +//***************************************************************************** +// +// Send a string to the UART. +// +//***************************************************************************** +void +UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count) +{ + // + // Loop while there are more characters to send. + // + while(ui32Count--) + { + // + // Write the next character to the UART. + // + ROM_UARTCharPutNonBlocking(UART0_BASE, *pui8Buffer++); + } +} + +//***************************************************************************** +// +// This example demonstrates how to send a string of data to the UART. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + tContext sContext; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "uart-echo", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Initialize the display and write some instructions. + // + GrStringDrawCentered(&sContext, "Connect a", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, false); + GrStringDrawCentered(&sContext, "terminal", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, false); + GrStringDrawCentered(&sContext, "to UART0.", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, false); + GrStringDrawCentered(&sContext, "115000,N,8,1", -1, + GrContextDpyWidthGet(&sContext) / 2, 50, false); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Enable processor interrupts. + // + ROM_IntMasterEnable(); + + // + // Set GPIO A0 and A1 as UART pins. + // + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure the UART for 115,200, 8-N-1 operation. + // + ROM_UARTConfigSetExpClk(UART0_BASE, ROM_SysCtlClockGet(), 115200, + (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | + UART_CONFIG_PAR_NONE)); + + // + // Enable the UART interrupt. + // + ROM_IntEnable(INT_UART0); + ROM_UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT); + + // + // Prompt for text to be entered. + // + UARTSend((uint8_t *)"Enter text: ", 12); + + // + // Loop forever echoing data through the UART. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/uart_echo/uart_echo.ewd b/boards/ek-lm4f232/uart_echo/uart_echo.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/uart_echo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/uart_echo/uart_echo.ewp b/boards/ek-lm4f232/uart_echo/uart_echo.ewp new file mode 100644 index 0000000..4216345 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/uart_echo.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\uart_echo.c + + + diff --git a/boards/ek-lm4f232/uart_echo/uart_echo.icf b/boards/ek-lm4f232/uart_echo/uart_echo.icf new file mode 100644 index 0000000..a451eb3 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/uart_echo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// uart_echo.icf - Linker configuration file for uart_echo. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/uart_echo/uart_echo.ld b/boards/ek-lm4f232/uart_echo/uart_echo.ld new file mode 100644 index 0000000..3560828 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/uart_echo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * uart_echo.ld - Linker configuration file for uart_echo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/uart_echo/uart_echo.sct b/boards/ek-lm4f232/uart_echo/uart_echo.sct new file mode 100644 index 0000000..33901a8 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/uart_echo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; uart_echo.sct - Linker configuration file for uart_echo. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/uart_echo/uart_echo.uvopt b/boards/ek-lm4f232/uart_echo/uart_echo.uvopt new file mode 100644 index 0000000..ad57975 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/uart_echo.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + uart_echo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\uart_echo.c + uart_echo.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/uart_echo/uart_echo.uvproj b/boards/ek-lm4f232/uart_echo/uart_echo.uvproj new file mode 100644 index 0000000..f961c97 --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/uart_echo.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + uart_echo + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + uart_echo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\uart_echo.bin .\rvmdk\uart_echo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + uart_echo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uart_echo.c + 1 + .\uart_echo.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/uart_echo/uart_echo_ccs.cmd b/boards/ek-lm4f232/uart_echo/uart_echo_ccs.cmd new file mode 100644 index 0000000..dfd4e9c --- /dev/null +++ b/boards/ek-lm4f232/uart_echo/uart_echo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * uart_echo_ccs.cmd - CCS linker configuration file for uart_echo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-lm4f232/udma_demo/Makefile b/boards/ek-lm4f232/udma_demo/Makefile new file mode 100644 index 0000000..234fd7b --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/Makefile @@ -0,0 +1,90 @@ +#****************************************************************************** +# +# Makefile - Rules for building the uDMA example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the uDMA example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/udma_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the uDMA example. +# +${COMPILER}/udma_demo.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/udma_demo.axf: ${COMPILER}/cpu_usage.o +${COMPILER}/udma_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/udma_demo.axf: ${COMPILER}/udma_demo.o +${COMPILER}/udma_demo.axf: ${COMPILER}/ustdlib.o +${COMPILER}/udma_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/udma_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/udma_demo.axf: udma_demo.ld +SCATTERgcc_udma_demo=udma_demo.ld +ENTRY_udma_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/udma_demo/ccs/.ccsimportspec b/boards/ek-lm4f232/udma_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..aea8941 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/udma_demo/ccs/.ccsproject b/boards/ek-lm4f232/udma_demo/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/udma_demo/ccs/.cproject b/boards/ek-lm4f232/udma_demo/ccs/.cproject new file mode 100644 index 0000000..ac845e4 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/udma_demo/ccs/.project b/boards/ek-lm4f232/udma_demo/ccs/.project new file mode 100644 index 0000000..57d9244 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/ccs/.project @@ -0,0 +1,65 @@ + + + udma_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/udma_demo/startup_ccs.c + + + udma_demo.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/udma_demo/udma_demo.c + + + udma_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/udma_demo/udma_demo_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/cpu_usage.c + 1 + SW_ROOT/utils/cpu_usage.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/udma_demo/ccs/Debug/udma_demo.bin b/boards/ek-lm4f232/udma_demo/ccs/Debug/udma_demo.bin new file mode 100644 index 0000000..92f7302 Binary files /dev/null and b/boards/ek-lm4f232/udma_demo/ccs/Debug/udma_demo.bin differ diff --git a/boards/ek-lm4f232/udma_demo/ccs/Debug/udma_demo.out b/boards/ek-lm4f232/udma_demo/ccs/Debug/udma_demo.out new file mode 100644 index 0000000..e8c82c9 Binary files /dev/null and b/boards/ek-lm4f232/udma_demo/ccs/Debug/udma_demo.out differ diff --git a/boards/ek-lm4f232/udma_demo/ccs/macros.ini_initial b/boards/ek-lm4f232/udma_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/udma_demo/ccs/target_config.ccxml b/boards/ek-lm4f232/udma_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/udma_demo/ewarm/Exe/udma_demo.bin b/boards/ek-lm4f232/udma_demo/ewarm/Exe/udma_demo.bin new file mode 100644 index 0000000..1393334 Binary files /dev/null and b/boards/ek-lm4f232/udma_demo/ewarm/Exe/udma_demo.bin differ diff --git a/boards/ek-lm4f232/udma_demo/ewarm/Exe/udma_demo.out b/boards/ek-lm4f232/udma_demo/ewarm/Exe/udma_demo.out new file mode 100644 index 0000000..8c33180 Binary files /dev/null and b/boards/ek-lm4f232/udma_demo/ewarm/Exe/udma_demo.out differ diff --git a/boards/ek-lm4f232/udma_demo/gcc/udma_demo.axf b/boards/ek-lm4f232/udma_demo/gcc/udma_demo.axf new file mode 100644 index 0000000..1a7fe58 Binary files /dev/null and b/boards/ek-lm4f232/udma_demo/gcc/udma_demo.axf differ diff --git a/boards/ek-lm4f232/udma_demo/gcc/udma_demo.bin b/boards/ek-lm4f232/udma_demo/gcc/udma_demo.bin new file mode 100644 index 0000000..393a4f2 Binary files /dev/null and b/boards/ek-lm4f232/udma_demo/gcc/udma_demo.bin differ diff --git a/boards/ek-lm4f232/udma_demo/readme.txt b/boards/ek-lm4f232/udma_demo/readme.txt new file mode 100644 index 0000000..afc3b34 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/readme.txt @@ -0,0 +1,25 @@ +uDMA + +This example application demonstrates the use of the uDMA controller to +transfer data between memory buffers, and to transfer data to and from a +UART. The test runs for 10 seconds before exiting. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/udma_demo/rvmdk/udma_demo.axf b/boards/ek-lm4f232/udma_demo/rvmdk/udma_demo.axf new file mode 100644 index 0000000..71df423 Binary files /dev/null and b/boards/ek-lm4f232/udma_demo/rvmdk/udma_demo.axf differ diff --git a/boards/ek-lm4f232/udma_demo/rvmdk/udma_demo.bin b/boards/ek-lm4f232/udma_demo/rvmdk/udma_demo.bin new file mode 100644 index 0000000..731dd23 Binary files /dev/null and b/boards/ek-lm4f232/udma_demo/rvmdk/udma_demo.bin differ diff --git a/boards/ek-lm4f232/udma_demo/startup_ccs.c b/boards/ek-lm4f232/udma_demo/startup_ccs.c new file mode 100644 index 0000000..8f96b8e --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/startup_ccs.c @@ -0,0 +1,305 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART0IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/udma_demo/startup_ewarm.c b/boards/ek-lm4f232/udma_demo/startup_ewarm.c new file mode 100644 index 0000000..420cdcd --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/startup_ewarm.c @@ -0,0 +1,336 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART0IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/udma_demo/startup_gcc.c b/boards/ek-lm4f232/udma_demo/startup_gcc.c new file mode 100644 index 0000000..6ce8b25 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/startup_gcc.c @@ -0,0 +1,352 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART0IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UART0IntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/udma_demo/startup_rvmdk.S b/boards/ek-lm4f232/udma_demo/startup_rvmdk.S new file mode 100644 index 0000000..ea4d1a3 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/startup_rvmdk.S @@ -0,0 +1,361 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN UART0IntHandler + EXTERN uDMAIntHandler + EXTERN uDMAErrorHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UART0IntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD uDMAIntHandler ; uDMA Software Transfer + DCD uDMAErrorHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/udma_demo/udma_demo.c b/boards/ek-lm4f232/udma_demo/udma_demo.c new file mode 100644 index 0000000..9e25a4f --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/udma_demo.c @@ -0,0 +1,916 @@ +//***************************************************************************** +// +// udma_demo.c - uDMA example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_uart.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "utils/cpu_usage.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      uDMA (udma_demo)

      +//! +//! This example application demonstrates the use of the uDMA controller to +//! transfer data between memory buffers, and to transfer data to and from a +//! UART. The test runs for 10 seconds before exiting. +// +//***************************************************************************** + +//***************************************************************************** +// +// The number of SysTick ticks per second used for the SysTick interrupt. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 + +//***************************************************************************** +// +// The size of the memory transfer source and destination buffers (in words). +// +//***************************************************************************** +#define MEM_BUFFER_SIZE 1024 + +//***************************************************************************** +// +// The size of the UART transmit and receive buffers. They do not need to be +// the same size. +// +//***************************************************************************** +#define UART_TXBUF_SIZE 256 +#define UART_RXBUF_SIZE 256 + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +static tContext g_sContext; + +//***************************************************************************** +// +// The source and destination buffers used for memory transfers. +// +//***************************************************************************** +static uint32_t g_ui32SrcBuf[MEM_BUFFER_SIZE]; +static uint32_t g_ui32DstBuf[MEM_BUFFER_SIZE]; + +//***************************************************************************** +// +// The transmit and receive buffers used for the UART transfers. There is one +// transmit buffer and a pair of recieve ping-pong buffers. +// +//***************************************************************************** +static uint8_t g_ui8TxBuf[UART_TXBUF_SIZE]; +static uint8_t g_ui8RxBufA[UART_RXBUF_SIZE]; +static uint8_t g_ui8RxBufB[UART_RXBUF_SIZE]; + +//***************************************************************************** +// +// The count of uDMA errors. This value is incremented by the uDMA error +// handler. +// +//***************************************************************************** +static uint32_t g_ui32uDMAErrCount = 0; + +//***************************************************************************** +// +// The count of times the uDMA interrupt occurred but the uDMA transfer was not +// complete. This should remain 0. +// +//***************************************************************************** +static uint32_t g_ui32BadISR = 0; + +//***************************************************************************** +// +// The count of UART buffers filled, one for each ping-pong buffer. +// +//***************************************************************************** +static uint32_t g_ui32RxBufACount = 0; +static uint32_t g_ui32RxBufBCount = 0; + +//***************************************************************************** +// +// The count of memory uDMA transfer blocks. This value is incremented by the +// uDMA interrupt handler whenever a memory block transfer is completed. +// +//***************************************************************************** +static uint32_t g_ui32MemXferCount = 0; + +//***************************************************************************** +// +// The CPU usage in percent, in 16.16 fixed point format. +// +//***************************************************************************** +static uint32_t g_ui32CPUUsage; + +//***************************************************************************** +// +// The number of seconds elapsed since the start of the program. This value is +// maintained by the SysTick interrupt handler. +// +//***************************************************************************** +static uint32_t g_ui32Seconds = 0; + +//***************************************************************************** +// +// The number of ticks elapsed since the start of the program. This value is +// maintained by the SysTick interrupt handler. +// +//***************************************************************************** +static uint32_t g_ui32TickCount = 0; + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +uint8_t ui8ControlTable[1024]; +#elif defined(ccs) +#pragma DATA_ALIGN(ui8ControlTable, 1024) +uint8_t ui8ControlTable[1024]; +#else +uint8_t ui8ControlTable[1024] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the SysTick timer. This handler will increment a +// seconds counter whenever the appropriate number of ticks has occurred. It +// will also call the CPU usage tick function to find the CPU usage percent. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Increment the tick counter. + // + g_ui32TickCount++; + + // + // If the number of ticks per second has occurred, then increment the + // seconds counter. + // + if(!(g_ui32TickCount % SYSTICKS_PER_SECOND)) + { + g_ui32Seconds++; + } + + // + // Call the CPU usage tick function. This function will compute the amount + // of cycles used by the CPU since the last call and return the result in + // percent in fixed point 16.16 format. + // + g_ui32CPUUsage = CPUUsageTick(); +} + +//***************************************************************************** +// +// The interrupt handler for uDMA errors. This interrupt will occur if the +// uDMA encounters a bus error while trying to perform a transfer. This +// handler just increments a counter if an error occurs. +// +//***************************************************************************** +void +uDMAErrorHandler(void) +{ + uint32_t ui32Status; + + // + // Check for uDMA error bit + // + ui32Status = ROM_uDMAErrorStatusGet(); + + // + // If there is a uDMA error, then clear the error and increment + // the error counter. + // + if(ui32Status) + { + ROM_uDMAErrorStatusClear(); + g_ui32uDMAErrCount++; + } +} + +//***************************************************************************** +// +// The interrupt handler for uDMA interrupts from the memory channel. This +// interrupt will increment a counter, and then restart another memory +// transfer. +// +//***************************************************************************** +void +uDMAIntHandler(void) +{ + uint32_t ui32Mode; + + // + // Check for the primary control structure to indicate complete. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_SW); + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment the count of completed transfers. + // + g_ui32MemXferCount++; + + // + // Configure it for another transfer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_SW, UDMA_MODE_AUTO, + g_ui32SrcBuf, g_ui32DstBuf, + MEM_BUFFER_SIZE); + + // + // Initiate another transfer. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_SW); + ROM_uDMAChannelRequest(UDMA_CHANNEL_SW); + } + + // + // If the channel is not stopped, then something is wrong. + // + else + { + g_ui32BadISR++; + } +} + +//***************************************************************************** +// +// The interrupt handler for UART0. This interrupt will occur when a DMA +// transfer is complete using the UART0 uDMA channel. It will also be +// triggered if the peripheral signals an error. This interrupt handler will +// switch between receive ping-pong buffers A and B. It will also restart a TX +// uDMA transfer if the prior transfer is complete. This will keep the UART +// running continuously (looping TX data back to RX). +// +//***************************************************************************** +void +UART0IntHandler(void) +{ + uint32_t ui32Status; + uint32_t ui32Mode; + + // + // Read the interrupt status of the UART. + // + ui32Status = ROM_UARTIntStatus(UART0_BASE, 1); + + // + // Clear any pending status, even though there should be none since no UART + // interrupts were enabled. If UART error interrupts were enabled, then + // those interrupts could occur here and should be handled. Since uDMA is + // used for both the RX and TX, then neither of those interrupts should be + // enabled. + // + ROM_UARTIntClear(UART0_BASE, ui32Status); + + // + // Check the DMA control table to see if the ping-pong "A" transfer is + // complete. The "A" transfer uses receive buffer "A", and the primary + // control structure. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT); + + // + // If the primary control structure indicates stop, that means the "A" + // receive buffer is done. The uDMA controller should still be receiving + // data into the "B" buffer. + // + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment a counter to indicate data was received into buffer A. In + // a real application this would be used to signal the main thread that + // data was received so the main thread can process the data. + // + g_ui32RxBufACount++; + + // + // Set up the next transfer for the "A" buffer, using the primary + // control structure. When the ongoing receive into the "B" buffer is + // done, the uDMA controller will switch back to this one. This + // example re-uses buffer A, but a more sophisticated application could + // use a rotating set of buffers to increase the amount of time that + // the main thread has to process the data in the buffer before it is + // reused. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufA, sizeof(g_ui8RxBufA)); + } + + // + // Check the DMA control table to see if the ping-pong "B" transfer is + // complete. The "B" transfer uses receive buffer "B", and the alternate + // control structure. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT); + + // + // If the alternate control structure indicates stop, that means the "B" + // receive buffer is done. The uDMA controller should still be receiving + // data into the "A" buffer. + // + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment a counter to indicate data was received into buffer A. In + // a real application this would be used to signal the main thread that + // data was received so the main thread can process the data. + // + g_ui32RxBufBCount++; + + // + // Set up the next transfer for the "B" buffer, using the alternate + // control structure. When the ongoing receive into the "A" buffer is + // done, the uDMA controller will switch back to this one. This + // example re-uses buffer B, but a more sophisticated application could + // use a rotating set of buffers to increase the amount of time that + // the main thread has to process the data in the buffer before it is + // reused. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufB, sizeof(g_ui8RxBufB)); + } + + // + // If the UART0 DMA TX channel is disabled, that means the TX DMA transfer + // is done. + // + if(!ROM_uDMAChannelIsEnabled(UDMA_CHANNEL_UART0TX)) + { + // + // Start another DMA transfer to UART0 TX. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, g_ui8TxBuf, + (void *)(UART0_BASE + UART_O_DR), + sizeof(g_ui8TxBuf)); + + // + // The uDMA TX channel must be re-enabled. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART0TX); + } +} + +//***************************************************************************** +// +// Initializes the UART0 peripheral and sets up the TX and RX uDMA channels. +// The UART is configured for loopback mode so that any data sent on TX will be +// received on RX. The uDMA channels are configured so that the TX channel +// will copy data from a buffer to the UART TX output. And the uDMA RX channel +// will receive any incoming data into a pair of buffers in ping-pong mode. +// +//***************************************************************************** +void +InitUART0Transfer(void) +{ + uint_fast16_t ui16Idx; + + // + // Fill the TX buffer with a simple data pattern. + // + for(ui16Idx = 0; ui16Idx < UART_TXBUF_SIZE; ui16Idx++) + { + g_ui8TxBuf[ui16Idx] = ui16Idx; + } + + // + // Enable the UART peripheral, and configure it to operate even if the CPU + // is in sleep. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART0); + + // + // Configure the UART communication parameters. + // + ROM_UARTConfigSetExpClk(UART0_BASE, ROM_SysCtlClockGet(), 115200, + UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | + UART_CONFIG_PAR_NONE); + + // + // Set both the TX and RX trigger thresholds to 4. This will be used by + // the uDMA controller to signal when more data should be transferred. The + // uDMA TX and RX channels will be configured so that it can transfer 4 + // bytes in a burst when the UART is ready to transfer more data. + // + ROM_UARTFIFOLevelSet(UART0_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8); + + // + // Enable the UART for operation, and enable the uDMA interface for both TX + // and RX channels. + // + ROM_UARTEnable(UART0_BASE); + ROM_UARTDMAEnable(UART0_BASE, UART_DMA_RX | UART_DMA_TX); + + // + // This register write will set the UART to operate in loopback mode. Any + // data sent on the TX output will be received on the RX input. + // + HWREG(UART0_BASE + UART_O_CTL) |= UART_CTL_LBE; + + // + // Enable the UART peripheral interrupts. Note that no UART interrupts + // were enabled, but the uDMA controller will cause an interrupt on the + // UART interrupt signal when a uDMA transfer is complete. + // + ROM_IntEnable(INT_UART0); + + // + // Put the attributes in a known state for the uDMA UART0RX channel. These + // should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0RX, + UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + + // + // Configure the control parameters for the primary control structure for + // the UART RX channel. The primary contol structure is used for the "A" + // part of the ping-pong receive. The transfer data size is 8 bits, the + // source address does not increment since it will be reading from a + // register. The destination address increment is byte 8-bit bytes. The + // arbitration size is set to 4 to match the RX FIFO trigger threshold. + // The uDMA controller will use a 4 byte burst transfer if possible. This + // will be somewhat more effecient that single byte transfers. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | + UDMA_ARB_4); + + // + // Configure the control parameters for the alternate control structure for + // the UART RX channel. The alternate contol structure is used for the "B" + // part of the ping-pong receive. The configuration is identical to the + // primary/A control structure. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | + UDMA_ARB_4); + + // + // Set up the transfer parameters for the UART RX primary control + // structure. The mode is set to ping-pong, the transfer source is the + // UART data register, and the destination is the receive "A" buffer. The + // transfer size is set to match the size of the buffer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufA, sizeof(g_ui8RxBufA)); + + // + // Set up the transfer parameters for the UART RX alternate control + // structure. The mode is set to ping-pong, the transfer source is the + // UART data register, and the destination is the receive "B" buffer. The + // transfer size is set to match the size of the buffer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART0_BASE + UART_O_DR), + g_ui8RxBufB, sizeof(g_ui8RxBufB)); + + // + // Put the attributes in a known state for the uDMA UART0TX channel. These + // should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0TX, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + + // + // Set the USEBURST attribute for the uDMA UART TX channel. This will + // force the controller to always use a burst when transferring data from + // the TX buffer to the UART. This is somewhat more effecient bus usage + // than the default which allows single or burst transfers. + // + ROM_uDMAChannelAttributeEnable(UDMA_CHANNEL_UART0TX, UDMA_ATTR_USEBURST); + + // + // Configure the control parameters for the UART TX. The uDMA UART TX + // channel is used to transfer a block of data from a buffer to the UART. + // The data size is 8 bits. The source address increment is 8-bit bytes + // since the data is coming from a buffer. The destination increment is + // none since the data is to be written to the UART data register. The + // arbitration size is set to 4, which matches the UART TX FIFO trigger + // threshold. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | + UDMA_ARB_4); + + // + // Set up the transfer parameters for the uDMA UART TX channel. This will + // configure the transfer source and destination and the transfer size. + // Basic mode is used because the peripheral is making the uDMA transfer + // request. The source is the TX buffer and the destination is the UART + // data register. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, g_ui8TxBuf, + (void *)(UART0_BASE + UART_O_DR), + sizeof(g_ui8TxBuf)); + + // + // Now both the uDMA UART TX and RX channels are primed to start a + // transfer. As soon as the channels are enabled, the peripheral will + // issue a transfer request and the data transfers will begin. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART0RX); + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART0TX); +} + +//***************************************************************************** +// +// Initializes the uDMA software channel to perform a memory to memory uDMA +// transfer. +// +//***************************************************************************** +void +InitSWTransfer(void) +{ + uint_fast16_t ui16Idx; + + // + // Fill the source memory buffer with a simple incrementing pattern. + // + for(ui16Idx = 0; ui16Idx < MEM_BUFFER_SIZE; ui16Idx++) + { + g_ui32SrcBuf[ui16Idx] = ui16Idx; + } + + // + // Enable interrupts from the uDMA software channel. + // + ROM_IntEnable(INT_UDMA); + + // + // Put the attributes in a known state for the uDMA software channel. + // These should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_SW, + UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT | + (UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK)); + + // + // Configure the control parameters for the SW channel. The SW channel + // will be used to transfer between two memory buffers, 32 bits at a time. + // Therefore the data size is 32 bits, and the address increment is 32 bits + // for both source and destination. The arbitration size will be set to 8, + // which causes the uDMA controller to rearbitrate after 8 items are + // transferred. This keeps this channel from hogging the uDMA controller + // once the transfer is started, and allows other channels cycles if they + // are higher priority. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_SW | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | UDMA_DST_INC_32 | + UDMA_ARB_8); + + // + // Set up the transfer parameters for the software channel. This will + // configure the transfer buffers and the transfer size. Auto mode must be + // used for software transfers. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_SW | UDMA_PRI_SELECT, + UDMA_MODE_AUTO, g_ui32SrcBuf, g_ui32DstBuf, + MEM_BUFFER_SIZE); + + // + // Now the software channel is primed to start a transfer. The channel + // must be enabled. For software based transfers, a request must be + // issued. After this, the uDMA memory transfer begins. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_SW); + ROM_uDMAChannelRequest(UDMA_CHANNEL_SW); +} + +//***************************************************************************** +// +// This example demonstrates how to use the uDMA controller to transfer data +// between memory buffers and to and from a peripheral, in this case a UART. +// The uDMA controller is configured to repeatedly transfer a block of data +// from one memory buffer to another. It is also set up to repeatedly copy a +// block of data from a buffer to the UART output. The UART data is looped +// back so the same data is received, and the uDMA controlled is configured to +// continuously receive the UART data using ping-pong buffers. +// +// The processor is put to sleep when it is not doing anything, and this allows +// collection of CPU usage data to see how much CPU is being used while the +// data transfers are ongoing. +// +//***************************************************************************** +int +main(void) +{ + static uint32_t ui32PrevSeconds; + static uint32_t ui32PrevXferCount; + static uint32_t ui32PrevUARTCount = 0; + static char pcStrBuf[40]; + tRectangle sRect; + uint32_t ui32CenterX; + uint32_t ui32XfersCompleted; + uint32_t ui32BytesTransferred; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL at 50 MHz. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Enable peripherals to operate when CPU is in sleep. + // + ROM_SysCtlPeripheralClockGating(true); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Get the center X coordinate of the screen, since it is used a lot. + // + ui32CenterX = GrContextDpyWidthGet(&g_sContext) / 2; + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "udma-demo", -1, ui32CenterX, 4, 0); + + // + // Show the clock frequency on the display. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + usnprintf(pcStrBuf, sizeof(pcStrBuf), "%u MHz", + ROM_SysCtlClockGet() / 1000000); + GrStringDrawCentered(&g_sContext, pcStrBuf, -1, ui32CenterX, 14, 0); + + // + // Show static text and field labels on the display. + // + GrStringDraw(&g_sContext, "Mem", -1, 0, 22, 0); + GrStringDraw(&g_sContext, "UART", -1, 0, 32, 0); + + // + // Configure SysTick to occur 100 times per second, to use as a time + // reference. Enable SysTick to generate interrupts. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Initialize the CPU usage measurement routine. + // + CPUUsageInit(ROM_SysCtlClockGet(), SYSTICKS_PER_SECOND, 2); + + // + // Enable the uDMA controller at the system level. Enable it to continue + // to run while the processor is in sleep. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UDMA); + + // + // Enable the uDMA controller error interrupt. This interrupt will occur + // if there is a bus error during a transfer. + // + ROM_IntEnable(INT_UDMAERR); + + // + // Enable the uDMA controller. + // + ROM_uDMAEnable(); + + // + // Point at the control table to use for channel control structures. + // + ROM_uDMAControlBaseSet(ui8ControlTable); + + // + // Initialize the uDMA memory to memory transfers. + // + InitSWTransfer(); + + // + // Initialize the uDMA UART transfers. + // + InitUART0Transfer(); + + // + // Remember the current SysTick seconds count. + // + ui32PrevSeconds = g_ui32Seconds; + + // + // Remember the current count of memory buffer transfers. + // + ui32PrevXferCount = g_ui32MemXferCount; + + // + // Loop until the button is pressed. The processor is put to sleep + // in this loop so that CPU utilization can be measured. + // + while(1) + { + // + // Check to see if one second has elapsed. If so, the make some + // updates. + // + if(g_ui32Seconds != ui32PrevSeconds) + { + // + // Print a message to the display showing the CPU usage percent. + // The fractional part of the percent value is ignored. + // + usnprintf(pcStrBuf, sizeof(pcStrBuf), "CPU %2u%%", + g_ui32CPUUsage >> 16); + GrStringDrawCentered(&g_sContext, pcStrBuf, -1, ui32CenterX, 44, + 1); + + // + // Tell the user how many seconds we have to go before ending. + // + usnprintf(pcStrBuf, sizeof(pcStrBuf), " %d seconds ", + 10 - g_ui32Seconds); + GrStringDrawCentered(&g_sContext, pcStrBuf, -1, ui32CenterX, 54, + 1); + + // + // Remember the new seconds count. + // + ui32PrevSeconds = g_ui32Seconds; + + // + // Calculate how many memory transfers have occurred since the last + // second. + // + ui32XfersCompleted = g_ui32MemXferCount - ui32PrevXferCount; + + // + // Remember the new transfer count. + // + ui32PrevXferCount = g_ui32MemXferCount; + + // + // Compute how many bytes were transferred in the memory transfer + // since the last second. + // + ui32BytesTransferred = ui32XfersCompleted * MEM_BUFFER_SIZE * 4; + + // + // Print a message to the display showing the memory transfer rate. + // + usnprintf(pcStrBuf, sizeof(pcStrBuf), "%8u B/s ", + ui32BytesTransferred); + GrStringDraw(&g_sContext, pcStrBuf, -1, 24, 22, 1); + + // + // Calculate how many UART transfers have occurred since the last + // second. + // + ui32XfersCompleted = (g_ui32RxBufACount + g_ui32RxBufBCount - + ui32PrevUARTCount); + + // + // Remember the new UART transfer count. + // + ui32PrevUARTCount = g_ui32RxBufACount + g_ui32RxBufBCount; + + // + // Compute how many bytes were transferred by the UART. The number + // of bytes received is multiplied by 2 so that the TX bytes + // transferred are also accounted for. + // + ui32BytesTransferred = ui32XfersCompleted * UART_RXBUF_SIZE * 2; + + // + // Print a message to the display showing the UART transfer rate. + // + usnprintf(pcStrBuf, sizeof(pcStrBuf), "%7u B/s ", + ui32BytesTransferred); + GrStringDraw(&g_sContext, pcStrBuf, -1, 30, 32, 1); + } + + // + // Put the processor to sleep if there is nothing to do. This allows + // the CPU usage routine to measure the number of free CPU cycles. + // If the processor is sleeping a lot, it can be hard to connect to + // the target with the debugger. + // + ROM_SysCtlSleep(); + + // + // See if we have run int32_t enough and exit the loop if so. + // + if(g_ui32Seconds >= 10) + { + break; + } + } + + // + // Indicate on the display that the example is stopped. + // + GrContextForegroundSet(&g_sContext, ClrRed); + GrStringDrawCentered(&g_sContext, " Stopped ", -1, + ui32CenterX, 54, 1); + + // + // Loop forever with the CPU not sleeping, so the debugger can connect. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/udma_demo/udma_demo.ewd b/boards/ek-lm4f232/udma_demo/udma_demo.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/udma_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/udma_demo/udma_demo.ewp b/boards/ek-lm4f232/udma_demo/udma_demo.ewp new file mode 100644 index 0000000..1595159 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/udma_demo.ewp @@ -0,0 +1,798 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\utils\cpu_usage.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\udma_demo.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-lm4f232/udma_demo/udma_demo.icf b/boards/ek-lm4f232/udma_demo/udma_demo.icf new file mode 100644 index 0000000..6ea3260 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/udma_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// udma_demo.icf - Linker configuration file for udma_demo. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/udma_demo/udma_demo.ld b/boards/ek-lm4f232/udma_demo/udma_demo.ld new file mode 100644 index 0000000..93bcb43 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/udma_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * udma_demo.ld - Linker configuration file for udma_demo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/udma_demo/udma_demo.sct b/boards/ek-lm4f232/udma_demo/udma_demo.sct new file mode 100644 index 0000000..371a107 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/udma_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; udma_demo.sct - Linker configuration file for udma_demo. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/udma_demo/udma_demo.uvopt b/boards/ek-lm4f232/udma_demo/udma_demo.uvopt new file mode 100644 index 0000000..4d26a8e --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/udma_demo.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + udma_demo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\cpu_usage.c + cpu_usage.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\udma_demo.c + udma_demo.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/udma_demo/udma_demo.uvproj b/boards/ek-lm4f232/udma_demo/udma_demo.uvproj new file mode 100644 index 0000000..c7efe63 --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/udma_demo.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + udma_demo + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + udma_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\udma_demo.bin .\rvmdk\udma_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + udma_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + cpu_usage.c + 1 + ..\..\..\..\utils\cpu_usage.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + udma_demo.c + 1 + .\udma_demo.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/udma_demo/udma_demo_ccs.cmd b/boards/ek-lm4f232/udma_demo/udma_demo_ccs.cmd new file mode 100644 index 0000000..e97d4da --- /dev/null +++ b/boards/ek-lm4f232/udma_demo/udma_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * udma_demo_ccs.cmd - CCS linker configuration file for udma_demo. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/usb_dev_bulk/Makefile b/boards/ek-lm4f232/usb_dev_bulk/Makefile new file mode 100644 index 0000000..282bf5d --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device bulk example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device bulk example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_bulk.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device bulk example. +# +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/usb_bulk_structs.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/usb_dev_bulk.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_dev_bulk.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_bulk.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_bulk.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_bulk.axf: usb_dev_bulk.ld +SCATTERgcc_usb_dev_bulk=usb_dev_bulk.ld +ENTRY_usb_dev_bulk=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/usb_dev_bulk/ccs/.ccsimportspec b/boards/ek-lm4f232/usb_dev_bulk/ccs/.ccsimportspec new file mode 100644 index 0000000..6c9f4a0 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_bulk/ccs/.ccsproject b/boards/ek-lm4f232/usb_dev_bulk/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_bulk/ccs/.cproject b/boards/ek-lm4f232/usb_dev_bulk/ccs/.cproject new file mode 100644 index 0000000..7e870bb --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/ccs/.cproject @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_bulk/ccs/.project b/boards/ek-lm4f232/usb_dev_bulk/ccs/.project new file mode 100644 index 0000000..208ff61 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/ccs/.project @@ -0,0 +1,70 @@ + + + usb_dev_bulk + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_bulk/startup_ccs.c + + + usb_bulk_structs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_bulk/usb_bulk_structs.c + + + usb_dev_bulk.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.c + + + usb_dev_bulk_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin b/boards/ek-lm4f232/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin new file mode 100644 index 0000000..1999e22 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin differ diff --git a/boards/ek-lm4f232/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out b/boards/ek-lm4f232/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out new file mode 100644 index 0000000..923c8e2 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out differ diff --git a/boards/ek-lm4f232/usb_dev_bulk/ccs/macros.ini_initial b/boards/ek-lm4f232/usb_dev_bulk/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/usb_dev_bulk/ccs/target_config.ccxml b/boards/ek-lm4f232/usb_dev_bulk/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin b/boards/ek-lm4f232/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin new file mode 100644 index 0000000..ec05afb Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin differ diff --git a/boards/ek-lm4f232/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out b/boards/ek-lm4f232/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out new file mode 100644 index 0000000..fdaaaf8 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out differ diff --git a/boards/ek-lm4f232/usb_dev_bulk/gcc/usb_dev_bulk.axf b/boards/ek-lm4f232/usb_dev_bulk/gcc/usb_dev_bulk.axf new file mode 100644 index 0000000..429b118 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_bulk/gcc/usb_dev_bulk.axf differ diff --git a/boards/ek-lm4f232/usb_dev_bulk/gcc/usb_dev_bulk.bin b/boards/ek-lm4f232/usb_dev_bulk/gcc/usb_dev_bulk.bin new file mode 100644 index 0000000..9216d9f Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_bulk/gcc/usb_dev_bulk.bin differ diff --git a/boards/ek-lm4f232/usb_dev_bulk/readme.txt b/boards/ek-lm4f232/usb_dev_bulk/readme.txt new file mode 100644 index 0000000..13a804f --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/readme.txt @@ -0,0 +1,43 @@ +USB Generic Bulk Device + +This example provides a generic USB device offering simple bulk data +transfer to and from the host. The device uses a vendor-specific class ID +and supports a single bulk IN endpoint and a single bulk OUT endpoint. +Data received from the host is assumed to be ASCII text and it is +echoed back with the case of all alphabetic characters swapped. + +A Windows INF file for the device is provided on the installation CD and +in the C:/ti/TivaWare_C_Series-x.x/windows_drivers directory of TivaWare +releases. This INF contains information required to install the WinUSB +subsystem on WindowsXP and Vista PCs. WinUSB is a Windows subsystem +allowing user mode applications to access the USB device without the need +for a vendor-specific kernel mode driver. + +A sample Windows command-line application, usb_bulk_example, illustrating +how to connect to and communicate with the bulk device is also provided. +The application binary is installed as part of the ``TivaWare for C Series +PC Companion Utilities'' package (SW-TM4C-USB-WIN) on the installation CD +or via download from http://www.ti.com/tivaware . Project files are +included to allow the examples to be built using +Microsoft Visual Studio 2008. Source code for this application can be +found in directory ti/TivaWare_C_Series-x.x/tools/usb_bulk_example. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/usb_dev_bulk/rvmdk/usb_dev_bulk.axf b/boards/ek-lm4f232/usb_dev_bulk/rvmdk/usb_dev_bulk.axf new file mode 100644 index 0000000..93ad4b6 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_bulk/rvmdk/usb_dev_bulk.axf differ diff --git a/boards/ek-lm4f232/usb_dev_bulk/rvmdk/usb_dev_bulk.bin b/boards/ek-lm4f232/usb_dev_bulk/rvmdk/usb_dev_bulk.bin new file mode 100644 index 0000000..a77766b Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_bulk/rvmdk/usb_dev_bulk.bin differ diff --git a/boards/ek-lm4f232/usb_dev_bulk/startup_ccs.c b/boards/ek-lm4f232/usb_dev_bulk/startup_ccs.c new file mode 100644 index 0000000..f1bf41e --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_bulk/startup_ewarm.c b/boards/ek-lm4f232/usb_dev_bulk/startup_ewarm.c new file mode 100644 index 0000000..b803406 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_bulk/startup_gcc.c b/boards/ek-lm4f232/usb_dev_bulk/startup_gcc.c new file mode 100644 index 0000000..0e5df70 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_bulk/startup_rvmdk.S b/boards/ek-lm4f232/usb_dev_bulk/startup_rvmdk.S new file mode 100644 index 0000000..36b47aa --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN UARTStdioIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTStdioIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/usb_dev_bulk/usb_bulk_structs.c b/boards/ek-lm4f232/usb_dev_bulk/usb_bulk_structs.c new file mode 100644 index 0000000..30677fb --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/usb_bulk_structs.c @@ -0,0 +1,200 @@ +//***************************************************************************** +// +// usb_bulk_structs.c - Data structures defining this bulk USB device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdbulk.h" +#include "usb_bulk_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'G', 0, 'e', 0, 'n', 0, 'e', 0, 'r', 0, 'i', 0, 'c', 0, ' ', 0, 'B', 0, + 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, + 'e', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The data interface description string. +// +//***************************************************************************** +const uint8_t g_pui8DataInterfaceString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, + 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (23 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, 'i', 0, 'g', 0, + 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t *const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8DataInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The bulk device initialization and customization structures. In this case, +// we are using USBBuffers between the bulk device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the bulk channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our bulk instance structure. +// +//***************************************************************************** +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; + +tUSBDBulkDevice g_sBulkDevice = +{ + USB_VID_TI_1CBE, + USB_PID_BULK, + 500, + USB_CONF_ATTR_SELF_PWR, + USBBufferEventCallback, + (void *)&g_sRxBuffer, + USBBufferEventCallback, + (void *)&g_sTxBuffer, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; + +//***************************************************************************** +// +// Receive buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBRxBuffer[BULK_BUFFER_SIZE]; +uint8_t g_pui8RxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sRxBuffer = +{ + false, // This is a receive buffer. + RxHandler, // pfnCallback + (void *)&g_sBulkDevice, // Callback data is our device pointer. + USBDBulkPacketRead, // pfnTransfer + USBDBulkRxPacketAvailable, // pfnAvailable + (void *)&g_sBulkDevice, // pvHandle + g_pui8USBRxBuffer, // pi8Buffer + BULK_BUFFER_SIZE, // ui32BufferSize + g_pui8RxBufferWorkspace // pvWorkspace +}; + +//***************************************************************************** +// +// Transmit buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBTxBuffer[BULK_BUFFER_SIZE]; +uint8_t g_pui8TxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sTxBuffer = +{ + true, // This is a transmit buffer. + TxHandler, // pfnCallback + (void *)&g_sBulkDevice, // Callback data is our device pointer. + USBDBulkPacketWrite, // pfnTransfer + USBDBulkTxPacketAvailable, // pfnAvailable + (void *)&g_sBulkDevice, // pvHandle + g_pui8USBTxBuffer, // pi8Buffer + BULK_BUFFER_SIZE, // ui32BufferSize + g_pui8TxBufferWorkspace // pvWorkspace +}; diff --git a/boards/ek-lm4f232/usb_dev_bulk/usb_bulk_structs.h b/boards/ek-lm4f232/usb_dev_bulk/usb_bulk_structs.h new file mode 100644 index 0000000..e7d41b6 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/usb_bulk_structs.h @@ -0,0 +1,48 @@ +//***************************************************************************** +// +// usb_bulk_structs.h - Data structures defining this bulk USB device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_BULK_STRUCTS_H_ +#define _USB_BULK_STRUCTS_H_ + +//***************************************************************************** +// +// The size of the transmit and receive buffers used. 256 is chosen pretty +// much at random though the buffer should be at least twice the size of +// a maximum-sized USB packet. +// +//***************************************************************************** +#define BULK_BUFFER_SIZE 256 + +extern uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +extern uint32_t TxHandler(void *pvi32CBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; +extern tUSBDBulkDevice g_sBulkDevice; +extern uint8_t g_pui8USBTxBuffer[]; +extern uint8_t g_pui8USBRxBuffer[]; + +#endif diff --git a/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.c b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.c new file mode 100644 index 0000000..93f32f3 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.c @@ -0,0 +1,709 @@ +//***************************************************************************** +// +// usb_dev_bulk.c - Main routines for the generic bulk device example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_gpio.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_sysctl.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/timer.h" +#include "driverlib/uart.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdbulk.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" +#include "usb_bulk_structs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Generic Bulk Device (usb_dev_bulk)

      +//! +//! This example provides a generic USB device offering simple bulk data +//! transfer to and from the host. The device uses a vendor-specific class ID +//! and supports a single bulk IN endpoint and a single bulk OUT endpoint. +//! Data received from the host is assumed to be ASCII text and it is +//! echoed back with the case of all alphabetic characters swapped. +//! +//! A Windows INF file for the device is provided on the installation CD and +//! in the C:/ti/TivaWare_C_Series-x.x/windows_drivers directory of TivaWare +//! releases. This INF contains information required to install the WinUSB +//! subsystem on WindowsXP and Vista PCs. WinUSB is a Windows subsystem +//! allowing user mode applications to access the USB device without the need +//! for a vendor-specific kernel mode driver. +//! +//! A sample Windows command-line application, usb_bulk_example, illustrating +//! how to connect to and communicate with the bulk device is also provided. +//! The application binary is installed as part of the ``TivaWare for C Series +//! PC Companion Utilities'' package (SW-TM4C-USB-WIN) on the installation CD +//! or via download from http://www.ti.com/tivaware . Project files are +//! included to allow the examples to be built using +//! Microsoft Visual Studio 2008. Source code for this application can be +//! found in directory ti/TivaWare_C_Series-x.x/tools/usb_bulk_example. +// +//***************************************************************************** + +//***************************************************************************** +// +// The system tick rate expressed both as ticks per second and a millisecond +// period. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 +#define SYSTICK_PERIOD_MS (1000 / SYSTICKS_PER_SECOND) + +//***************************************************************************** +// +// The global system tick counter. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount = 0; + +//***************************************************************************** +// +// Variables tracking transmit and receive counts. +// +//***************************************************************************** +volatile uint32_t g_ui32TxCount = 0; +volatile uint32_t g_ui32RxCount = 0; +#ifdef DEBUG +uint32_t g_ui32UARTRxErrors = 0; +#endif + +//***************************************************************************** +// +// Debug-related definitions and declarations. +// +// Debug output is available via UART0 if DEBUG is defined during build. +// +//***************************************************************************** +#ifdef DEBUG +//***************************************************************************** +// +// Map all debug print calls to UARTprintf in debug builds. +// +//***************************************************************************** +#define DEBUG_PRINT UARTprintf + +#else + +//***************************************************************************** +// +// Compile out all debug print calls in release builds. +// +//***************************************************************************** +#define DEBUG_PRINT while(0) ((int32_t (*)(char *, ...))0) +#endif + +//***************************************************************************** +// +// Graphics context used to show text on the color LCD display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Flags used to pass commands from interrupt context to the main loop. +// +//***************************************************************************** +#define COMMAND_PACKET_RECEIVED 0x00000001 +#define COMMAND_STATUS_UPDATE 0x00000002 + +volatile uint32_t g_ui32Flags = 0; +char *g_pcStatus; + +//***************************************************************************** +// +// Global flag indicating that a USB configuration has been set. +// +//***************************************************************************** +static volatile bool g_bUSBConfigured = false; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + UARTprintf("Error at line %d of %s\n", ui32Line, pcFilename); + while(1) + { + } +} +#endif + +//***************************************************************************** +// +// Interrupt handler for the system tick counter. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Update our system tick counter. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// Receive new data and echo it back to the host. +// +// \param psDevice points to the instance data for the device whose data is to +// be processed. +// \param pi8Data points to the newly received data in the USB receive buffer. +// \param ui32NumBytes is the number of bytes of data available to be processed. +// +// This function is called whenever we receive a notification that data is +// available from the host. We read the data, byte-by-byte and swap the case +// of any alphabetical characters found then write it back out to be +// transmitted back to the host. +// +// \return Returns the number of bytes of data processed. +// +//***************************************************************************** +static uint32_t +EchoNewDataToHost(tUSBDBulkDevice *psDevice, uint8_t *pi8Data, + uint_fast32_t ui32NumBytes) +{ + uint_fast32_t ui32Loop, ui32Space, ui32Count; + uint_fast32_t ui32ReadIndex; + uint_fast32_t ui32WriteIndex; + tUSBRingBufObject sTxRing; + + // + // Get the current buffer information to allow us to write directly to + // the transmit buffer (we already have enough information from the + // parameters to access the receive buffer directly). + // + USBBufferInfoGet(&g_sTxBuffer, &sTxRing); + + // + // How much space is there in the transmit buffer? + // + ui32Space = USBBufferSpaceAvailable(&g_sTxBuffer); + + // + // How many characters can we process this time round? + // + ui32Loop = (ui32Space < ui32NumBytes) ? ui32Space : ui32NumBytes; + ui32Count = ui32Loop; + + // + // Update our receive counter. + // + g_ui32RxCount += ui32NumBytes; + + // + // Dump a debug message. + // + DEBUG_PRINT("Received %d bytes\n", ui32NumBytes); + + // + // Set up to process the characters by directly accessing the USB buffers. + // + ui32ReadIndex = (uint32_t)(pi8Data - g_pui8USBRxBuffer); + ui32WriteIndex = sTxRing.ui32WriteIndex; + + while(ui32Loop) + { + // + // Copy from the receive buffer to the transmit buffer converting + // character case on the way. + // + + // + // Is this a lower case character? + // + if((g_pui8USBRxBuffer[ui32ReadIndex] >= 'a') && + (g_pui8USBRxBuffer[ui32ReadIndex] <= 'z')) + { + // + // Convert to upper case and write to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + (g_pui8USBRxBuffer[ui32ReadIndex] - 'a') + 'A'; + } + else + { + // + // Is this an upper case character? + // + if((g_pui8USBRxBuffer[ui32ReadIndex] >= 'A') && + (g_pui8USBRxBuffer[ui32ReadIndex] <= 'Z')) + { + // + // Convert to lower case and write to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + (g_pui8USBRxBuffer[ui32ReadIndex] - 'Z') + 'z'; + } + else + { + // + // Copy the received character to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + g_pui8USBRxBuffer[ui32ReadIndex]; + } + } + + // + // Move to the next character taking care to adjust the pointer for + // the buffer wrap if necessary. + // + ui32WriteIndex++; + ui32WriteIndex = + (ui32WriteIndex == BULK_BUFFER_SIZE) ? 0 : ui32WriteIndex; + + ui32ReadIndex++; + ui32ReadIndex = (ui32ReadIndex == BULK_BUFFER_SIZE) ? 0 : ui32ReadIndex; + + ui32Loop--; + } + + // + // We've processed the data in place so now send the processed data + // back to the host. + // + USBBufferDataWritten(&g_sTxBuffer, ui32Count); + + DEBUG_PRINT("Wrote %d bytes\n", ui32Count); + + // + // We processed as much data as we can directly from the receive buffer so + // we need to return the number of bytes to allow the lower layer to + // update its read pointer appropriately. + // + return(ui32Count); +} + +//***************************************************************************** +// +// Shows the status string on the display. +// +// \param psContext is a pointer to the graphics context representing the +// display. +// \param pi8Status is a pointer to the string to be shown. +// +//***************************************************************************** +void +DisplayStatus(tContext *psContext, char *pcStatus) +{ + // + // Clear the line with black. + // + GrContextForegroundSet(&g_sContext, ClrBlack); + GrStringDrawCentered(psContext, " ", -1, + GrContextDpyWidthGet(psContext) / 2, 16, true); + + // + // Draw the new status string + // + DEBUG_PRINT("%s\n", pcStatus); + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(psContext, pcStatus, -1, + GrContextDpyWidthGet(psContext) / 2, 16, true); +} + +//***************************************************************************** +// +// Handles bulk driver notifications related to the transmit channel (data to +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // We are not required to do anything in response to any transmit event + // in this example. All we do is update our transmit counter. + // + if(ui32Event == USB_EVENT_TX_COMPLETE) + { + g_ui32TxCount += ui32MsgValue; + } + + // + // Dump a debug message. + // + DEBUG_PRINT("TX complete %d\n", ui32MsgValue); + + return(0); +} + +//***************************************************************************** +// +// Handles bulk driver notifications related to the receive channel (data from +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event are we being sent? + // + switch(ui32Event) + { + // + // We are connected to a host and communication is now possible. + // + case USB_EVENT_CONNECTED: + { + g_bUSBConfigured = true; + g_pcStatus = "Host connected."; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + + // + // Flush our buffers. + // + USBBufferFlush(&g_sTxBuffer); + USBBufferFlush(&g_sRxBuffer); + + break; + } + + // + // The host has disconnected. + // + case USB_EVENT_DISCONNECTED: + { + g_bUSBConfigured = false; + g_pcStatus = "Host disconn."; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + break; + } + + // + // A new packet has been received. + // + case USB_EVENT_RX_AVAILABLE: + { + tUSBDBulkDevice *psDevice; + + // + // Get a pointer to our instance data from the callback data + // parameter. + // + psDevice = (tUSBDBulkDevice *)pvCBData; + + // + // Read the new packet and echo it back to the host. + // + return(EchoNewDataToHost(psDevice, pvMsgData, ui32MsgValue)); + } + + // + // Ignore SUSPEND and RESUME for now. + // + case USB_EVENT_SUSPEND: + case USB_EVENT_RESUME: + break; + + // + // Ignore all other events and return 0. + // + default: + break; + } + + return(0); +} + +#ifdef DEBUG +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); + // + UARTStdioConfig(0, 115200, 16000000); +} +#endif + +//***************************************************************************** +// +// This is the main application entry function. +// +//***************************************************************************** +int +main(void) +{ + uint_fast32_t ui32TxCount; + uint_fast32_t ui32RxCount; + tRectangle sRect; + char pcBuffer[16]; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL at 50MHz + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + +#ifdef DEBUG + // + // Configure the UART for debug output. + // + ConfigureUART(); +#endif + + // + // Not configured initially. + // + g_bUSBConfigured = false; + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "usb-dev-bulk", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + + // + // Show the various static text elements on the color STN display. + // + GrStringDraw(&g_sContext, "Tx bytes:", -1, 0, 32, false); + GrStringDraw(&g_sContext, "Rx bytes:", -1, 0, 42, false); + + // + // Enable the GPIO peripheral used for USB, and configure the USB + // pins. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + + // + // Erratum workaround for silicon revision A1. VBUS must have pull-down. + // + if(CLASS_IS_TM4C123 && REVISION_IS_A1) + { + HWREG(GPIO_PORTB_BASE + GPIO_O_PDR) |= GPIO_PIN_1; + } + + // + // Enable the system tick. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Show the application name on the display and UART output. + // + DEBUG_PRINT("\nTiva C Series USB bulk device example\n"); + DEBUG_PRINT("---------------------------------\n\n"); + + // + // Tell the user what we are up to. + // + DisplayStatus(&g_sContext, "Configuring USB"); + + // + // Initialize the transmit and receive buffers. + // + USBBufferInit(&g_sTxBuffer); + USBBufferInit(&g_sRxBuffer); + + // + // Initialize the USB stack for device mode. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Pass our device information to the USB library and place the device + // on the bus. + // + USBDBulkInit(0, &g_sBulkDevice); + + // + // Wait for initial configuration to complete. + // + DisplayStatus(&g_sContext, "Waiting for host"); + + // + // Clear our local byte counters. + // + ui32RxCount = 0; + ui32TxCount = 0; + + // + // Main application loop. + // + while(1) + { + + // + // Have we been asked to update the status display? + // + if(g_ui32Flags & COMMAND_STATUS_UPDATE) + { + // + // Clear the command flag + // + g_ui32Flags &= ~COMMAND_STATUS_UPDATE; + DisplayStatus(&g_sContext, g_pcStatus); + } + + // + // Has there been any transmit traffic since we last checked? + // + if(ui32TxCount != g_ui32TxCount) + { + // + // Take a snapshot of the latest transmit count. + // + ui32TxCount = g_ui32TxCount; + + // + // Update the display of bytes transmitted by the UART. + // + usnprintf(pcBuffer, 16, " %d ", ui32TxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 48, 32, true); + } + + // + // Has there been any receive traffic since we last checked? + // + if(ui32RxCount != g_ui32RxCount) + { + // + // Take a snapshot of the latest receive count. + // + ui32RxCount = g_ui32RxCount; + + // + // Update the display of bytes received by the UART. + // + usnprintf(pcBuffer, 16, " %d ", ui32RxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 48, 42, true); + } + } +} diff --git a/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ewd b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ewp b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ewp new file mode 100644 index 0000000..b2c5947 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ewp @@ -0,0 +1,805 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_bulk_structs.c + + + $PROJ_DIR$\usb_dev_bulk.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.icf b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.icf new file mode 100644 index 0000000..8e7cd11 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_bulk.icf - Linker configuration file for usb_dev_bulk. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ld b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ld new file mode 100644 index 0000000..bc6970f --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_bulk.ld - Linker configuration file for usb_dev_bulk. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.sct b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.sct new file mode 100644 index 0000000..ee76b8c --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_bulk.sct - Linker configuration file for usb_dev_bulk. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.uvopt b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.uvopt new file mode 100644 index 0000000..4ddda85 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.uvopt @@ -0,0 +1,373 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_bulk + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_bulk_structs.c + usb_bulk_structs.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_bulk.c + usb_dev_bulk.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 10 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.uvproj b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.uvproj new file mode 100644 index 0000000..ca87e99 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk.uvproj @@ -0,0 +1,454 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_bulk + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_bulk + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_bulk.bin .\rvmdk\usb_dev_bulk.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_bulk.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_bulk_structs.c + 1 + .\usb_bulk_structs.c + + + usb_dev_bulk.c + 1 + .\usb_dev_bulk.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk_ccs.cmd b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk_ccs.cmd new file mode 100644 index 0000000..7acff4d --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_bulk/usb_dev_bulk_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_bulk_ccs.cmd - CCS linker configuration file for usb_dev_bulk. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/usb_dev_keyboard/Makefile b/boards/ek-lm4f232/usb_dev_keyboard/Makefile new file mode 100644 index 0000000..48ddedf --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device keyboard example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device keyboard example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_keyboard.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device keyboard example. +# +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/buttons.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/usb_dev_keyboard.o +${COMPILER}/usb_dev_keyboard.axf: ${COMPILER}/usb_keyb_structs.o +${COMPILER}/usb_dev_keyboard.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_keyboard.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_keyboard.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_keyboard.axf: usb_dev_keyboard.ld +SCATTERgcc_usb_dev_keyboard=usb_dev_keyboard.ld +ENTRY_usb_dev_keyboard=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/usb_dev_keyboard/ccs/.ccsimportspec b/boards/ek-lm4f232/usb_dev_keyboard/ccs/.ccsimportspec new file mode 100644 index 0000000..4a82f9a --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_keyboard/ccs/.ccsproject b/boards/ek-lm4f232/usb_dev_keyboard/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_keyboard/ccs/.cproject b/boards/ek-lm4f232/usb_dev_keyboard/ccs/.cproject new file mode 100644 index 0000000..176715b --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/ccs/.cproject @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_keyboard/ccs/.project b/boards/ek-lm4f232/usb_dev_keyboard/ccs/.project new file mode 100644 index 0000000..232d061 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/ccs/.project @@ -0,0 +1,70 @@ + + + usb_dev_keyboard + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_keyboard/startup_ccs.c + + + usb_dev_keyboard.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.c + + + usb_dev_keyboard_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd + + + usb_keyb_structs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_keyboard/usb_keyb_structs.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin b/boards/ek-lm4f232/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin new file mode 100644 index 0000000..8277ca3 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.bin differ diff --git a/boards/ek-lm4f232/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out b/boards/ek-lm4f232/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out new file mode 100644 index 0000000..2b09d35 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_keyboard/ccs/Debug/usb_dev_keyboard.out differ diff --git a/boards/ek-lm4f232/usb_dev_keyboard/ccs/macros.ini_initial b/boards/ek-lm4f232/usb_dev_keyboard/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/usb_dev_keyboard/ccs/target_config.ccxml b/boards/ek-lm4f232/usb_dev_keyboard/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin b/boards/ek-lm4f232/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin new file mode 100644 index 0000000..11d274a Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.bin differ diff --git a/boards/ek-lm4f232/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out b/boards/ek-lm4f232/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out new file mode 100644 index 0000000..880b42d Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_keyboard/ewarm/Exe/usb_dev_keyboard.out differ diff --git a/boards/ek-lm4f232/usb_dev_keyboard/gcc/usb_dev_keyboard.axf b/boards/ek-lm4f232/usb_dev_keyboard/gcc/usb_dev_keyboard.axf new file mode 100644 index 0000000..892a54a Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_keyboard/gcc/usb_dev_keyboard.axf differ diff --git a/boards/ek-lm4f232/usb_dev_keyboard/gcc/usb_dev_keyboard.bin b/boards/ek-lm4f232/usb_dev_keyboard/gcc/usb_dev_keyboard.bin new file mode 100644 index 0000000..92c6679 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_keyboard/gcc/usb_dev_keyboard.bin differ diff --git a/boards/ek-lm4f232/usb_dev_keyboard/readme.txt b/boards/ek-lm4f232/usb_dev_keyboard/readme.txt new file mode 100644 index 0000000..65948ca --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/readme.txt @@ -0,0 +1,37 @@ +USB HID Keyboard Device + +This example application turns the evaluation board into a USB keyboard +supporting the Human Interface Device class. When the push button is +pressed, a sequence of key presses is simulated to type a string. Care +should be taken to ensure that the active window can safely receive the +text; enter is not pressed at any point so no actions are attempted by the +host if a terminal window is used (for example). The status LED is used to +indicate the current Caps Lock state and is updated in response to any +other keyboard attached to the same USB host system. + +The device implemented by this application also supports USB remote wakeup +allowing it to request the host to reactivate a suspended bus. If the bus +is suspended (as indicated on the application display), pressing the +push button will request a remote wakeup assuming the host has not +specifically disabled such requests. + + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf b/boards/ek-lm4f232/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf new file mode 100644 index 0000000..7db3f8f Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_keyboard/rvmdk/usb_dev_keyboard.axf differ diff --git a/boards/ek-lm4f232/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin b/boards/ek-lm4f232/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin new file mode 100644 index 0000000..34b3140 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_keyboard/rvmdk/usb_dev_keyboard.bin differ diff --git a/boards/ek-lm4f232/usb_dev_keyboard/startup_ccs.c b/boards/ek-lm4f232/usb_dev_keyboard/startup_ccs.c new file mode 100644 index 0000000..f1bf41e --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_keyboard/startup_ewarm.c b/boards/ek-lm4f232/usb_dev_keyboard/startup_ewarm.c new file mode 100644 index 0000000..b803406 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_keyboard/startup_gcc.c b/boards/ek-lm4f232/usb_dev_keyboard/startup_gcc.c new file mode 100644 index 0000000..0e5df70 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_keyboard/startup_rvmdk.S b/boards/ek-lm4f232/usb_dev_keyboard/startup_rvmdk.S new file mode 100644 index 0000000..36b47aa --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN UARTStdioIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTStdioIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.c b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.c new file mode 100644 index 0000000..028e97c --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.c @@ -0,0 +1,731 @@ +//***************************************************************************** +// +// usb_dev_keyboard.c - Main routines for the keyboard example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_gpio.h" +#include "inc/hw_sysctl.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidkeyb.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" +#include "usb_keyb_structs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB HID Keyboard Device (usb_dev_keyboard)

      +//! +//! This example application turns the evaluation board into a USB keyboard +//! supporting the Human Interface Device class. When the push button is +//! pressed, a sequence of key presses is simulated to type a string. Care +//! should be taken to ensure that the active window can safely receive the +//! text; enter is not pressed at any point so no actions are attempted by the +//! host if a terminal window is used (for example). The status LED is used to +//! indicate the current Caps Lock state and is updated in response to any +//! other keyboard attached to the same USB host system. +//! +//! The device implemented by this application also supports USB remote wakeup +//! allowing it to request the host to reactivate a suspended bus. If the bus +//! is suspended (as indicated on the application display), pressing the +//! push button will request a remote wakeup assuming the host has not +//! specifically disabled such requests. +//! +// +//***************************************************************************** + +//***************************************************************************** +// +// The system tick timer period. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 + +//***************************************************************************** +// +// A mapping from the ASCII value received from the UART to the corresponding +// USB HID usage code. +// +//***************************************************************************** +static const int8_t g_ppi8KeyUsageCodes[][2] = +{ + { 0, HID_KEYB_USAGE_SPACE }, // 0x20 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_1 }, // ! 0x21 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_FQUOTE }, // " 0x22 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_3 }, // # 0x23 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_4 }, // $ 0x24 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_5 }, // % 0x25 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_7 }, // & 0x26 + { 0, HID_KEYB_USAGE_FQUOTE }, // ' 0x27 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_9 }, // ( 0x28 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_0 }, // ) 0x29 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_8 }, // * 0x2a + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_EQUAL }, // + 0x2b + { 0, HID_KEYB_USAGE_COMMA }, // , 0x2c + { 0, HID_KEYB_USAGE_MINUS }, // - 0x2d + { 0, HID_KEYB_USAGE_PERIOD }, // . 0x2e + { 0, HID_KEYB_USAGE_FSLASH }, // / 0x2f + { 0, HID_KEYB_USAGE_0 }, // 0 0x30 + { 0, HID_KEYB_USAGE_1 }, // 1 0x31 + { 0, HID_KEYB_USAGE_2 }, // 2 0x32 + { 0, HID_KEYB_USAGE_3 }, // 3 0x33 + { 0, HID_KEYB_USAGE_4 }, // 4 0x34 + { 0, HID_KEYB_USAGE_5 }, // 5 0x35 + { 0, HID_KEYB_USAGE_6 }, // 6 0x36 + { 0, HID_KEYB_USAGE_7 }, // 7 0x37 + { 0, HID_KEYB_USAGE_8 }, // 8 0x38 + { 0, HID_KEYB_USAGE_9 }, // 9 0x39 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_SEMICOLON }, // : 0x3a + { 0, HID_KEYB_USAGE_SEMICOLON }, // ; 0x3b + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_COMMA }, // < 0x3c + { 0, HID_KEYB_USAGE_EQUAL }, // = 0x3d + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_PERIOD }, // > 0x3e + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_FSLASH }, // ? 0x3f + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_2 }, // @ 0x40 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_A }, // A 0x41 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_B }, // B 0x42 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_C }, // C 0x43 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_D }, // D 0x44 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_E }, // E 0x45 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_F }, // F 0x46 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_G }, // G 0x47 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_H }, // H 0x48 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_I }, // I 0x49 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_J }, // J 0x4a + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_K }, // K 0x4b + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_L }, // L 0x4c + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_M }, // M 0x4d + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_N }, // N 0x4e + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_O }, // O 0x4f + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_P }, // P 0x50 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_Q }, // Q 0x51 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_R }, // R 0x52 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_S }, // S 0x53 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_T }, // T 0x54 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_U }, // U 0x55 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_V }, // V 0x56 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_W }, // W 0x57 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_X }, // X 0x58 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_Y }, // Y 0x59 + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_Z }, // Z 0x5a + { 0, HID_KEYB_USAGE_LBRACKET }, // [ 0x5b + { 0, HID_KEYB_USAGE_BSLASH }, // \ 0x5c + { 0, HID_KEYB_USAGE_RBRACKET }, // ] 0x5d + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_6 }, // ^ 0x5e + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_MINUS }, // _ 0x5f + { 0, HID_KEYB_USAGE_BQUOTE }, // ` 0x60 + { 0, HID_KEYB_USAGE_A }, // a 0x61 + { 0, HID_KEYB_USAGE_B }, // b 0x62 + { 0, HID_KEYB_USAGE_C }, // c 0x63 + { 0, HID_KEYB_USAGE_D }, // d 0x64 + { 0, HID_KEYB_USAGE_E }, // e 0x65 + { 0, HID_KEYB_USAGE_F }, // f 0x66 + { 0, HID_KEYB_USAGE_G }, // g 0x67 + { 0, HID_KEYB_USAGE_H }, // h 0x68 + { 0, HID_KEYB_USAGE_I }, // i 0x69 + { 0, HID_KEYB_USAGE_J }, // j 0x6a + { 0, HID_KEYB_USAGE_K }, // k 0x6b + { 0, HID_KEYB_USAGE_L }, // l 0x6c + { 0, HID_KEYB_USAGE_M }, // m 0x6d + { 0, HID_KEYB_USAGE_N }, // n 0x6e + { 0, HID_KEYB_USAGE_O }, // o 0x6f + { 0, HID_KEYB_USAGE_P }, // p 0x70 + { 0, HID_KEYB_USAGE_Q }, // q 0x71 + { 0, HID_KEYB_USAGE_R }, // r 0x72 + { 0, HID_KEYB_USAGE_S }, // s 0x73 + { 0, HID_KEYB_USAGE_T }, // t 0x74 + { 0, HID_KEYB_USAGE_U }, // u 0x75 + { 0, HID_KEYB_USAGE_V }, // v 0x76 + { 0, HID_KEYB_USAGE_W }, // w 0x77 + { 0, HID_KEYB_USAGE_X }, // x 0x78 + { 0, HID_KEYB_USAGE_Y }, // y 0x79 + { 0, HID_KEYB_USAGE_Z }, // z 0x7a + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_LBRACKET }, // { 0x7b + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_BSLASH }, // | 0x7c + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_RBRACKET }, // } 0x7d + { HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_BQUOTE }, // ~ 0x7e +}; + +//***************************************************************************** +// +// This global indicates whether or not we are connected to a USB host. +// +//***************************************************************************** +volatile bool g_bConnected = false; + +//***************************************************************************** +// +// This global indicates whether or not the USB bus is currently in the suspend +// state. +// +//***************************************************************************** +volatile bool g_bSuspended = false; + +//***************************************************************************** +// +// Global system tick counter holds elapsed time since the application started +// expressed in 100ths of a second. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount; + +//***************************************************************************** +// +// The number of system ticks to wait for each USB packet to be sent before +// we assume the host has disconnected. The value 50 equates to half a second. +// +//***************************************************************************** +#define MAX_SEND_DELAY 50 + +//***************************************************************************** +// +// This global is set to true if the host sends a request to set or clear +// any keyboard LED. +// +//***************************************************************************** +volatile bool g_bDisplayUpdateRequired; + +//***************************************************************************** +// +// This enumeration holds the various states that the keyboard can be in during +// normal operation. +// +//***************************************************************************** +volatile enum +{ + // + // Unconfigured. + // + STATE_UNCONFIGURED, + + // + // No keys to send and not waiting on data. + // + STATE_IDLE, + + // + // Waiting on data to be sent out. + // + STATE_SENDING +} +g_eKeyboardState = STATE_UNCONFIGURED; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Handles asynchronous events from the HID keyboard driver. +// +// \param pvCBData is the event callback pointer provided during +// USBDHIDKeyboardInit(). This is a pointer to our keyboard device structure +// (&g_sKeyboardDevice). +// \param ui32Event identifies the event we are being called back for. +// \param ui32MsgData is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the HID keyboard driver to inform the application +// of particular asynchronous events related to operation of the keyboard HID +// device. +// +// \return Returns 0 in all cases. +// +//***************************************************************************** +uint32_t +KeyboardHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgData, + void *pvMsgData) +{ + switch (ui32Event) + { + // + // The host has connected to us and configured the device. + // + case USB_EVENT_CONNECTED: + { + g_bConnected = true; + g_bSuspended = false; + break; + } + + // + // The host has disconnected from us. + // + case USB_EVENT_DISCONNECTED: + { + g_bConnected = false; + break; + } + + // + // We receive this event every time the host acknowledges transmission + // of a report. It is used here purely as a way of determining whether + // the host is still talking to us or not. + // + case USB_EVENT_TX_COMPLETE: + { + // + // Enter the idle state since we finished sending something. + // + g_eKeyboardState = STATE_IDLE; + break; + } + + // + // This event indicates that the host has suspended the USB bus. + // + case USB_EVENT_SUSPEND: + { + g_bSuspended = true; + break; + } + + // + // This event signals that the host has resumed signalling on the bus. + // + case USB_EVENT_RESUME: + { + g_bSuspended = false; + break; + } + + // + // This event indicates that the host has sent us an Output or + // Feature report and that the report is now in the buffer we provided + // on the previous USBD_HID_EVENT_GET_REPORT_BUFFER callback. + // + case USBD_HID_KEYB_EVENT_SET_LEDS: + { + // + // Set the LED to match the current state of the caps lock LED. + // + ROM_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, + (ui32MsgData & HID_KEYB_CAPS_LOCK) ? GPIO_PIN_2 : + 0); + + break; + } + + // + // We ignore all other events. + // + default: + { + break; + } + } + + return(0); +} + +//*************************************************************************** +// +// Wait for a period of time for the state to become idle. +// +// \param ui32TimeoutTick is the number of system ticks to wait before +// declaring a timeout and returning \b false. +// +// This function polls the current keyboard state for ui32TimeoutTicks system +// ticks waiting for it to become idle. If the state becomes idle, the +// function returns true. If it ui32TimeoutTicks occur prior to the state +// becoming idle, false is returned to indicate a timeout. +// +// \return Returns \b true on success or \b false on timeout. +// +//*************************************************************************** +bool +WaitForSendIdle(uint_fast32_t ui32TimeoutTicks) +{ + uint32_t ui32Start; + uint32_t ui32Now; + uint32_t ui32Elapsed; + + ui32Start = g_ui32SysTickCount; + ui32Elapsed = 0; + + while(ui32Elapsed < ui32TimeoutTicks) + { + // + // Is the keyboard is idle, return immediately. + // + if(g_eKeyboardState == STATE_IDLE) + { + return(true); + } + + // + // Determine how much time has elapsed since we started waiting. This + // should be safe across a wrap of g_ui32SysTickCount. + // + ui32Now = g_ui32SysTickCount; + ui32Elapsed = ((ui32Start < ui32Now) ? (ui32Now - ui32Start) : + (((uint32_t)0xFFFFFFFF - ui32Start) + ui32Now + 1)); + } + + // + // If we get here, we timed out so return a bad return code to let the + // caller know. + // + return(false); +} + +//***************************************************************************** +// +// Sends a string of characters via the USB HID keyboard interface. +// +//***************************************************************************** +void +SendString(char *pcStr) +{ + uint32_t ui32Char; + + // + // Loop while there are more characters in the string. + // + while(*pcStr) + { + // + // Get the next character from the string. + // + ui32Char = *pcStr++; + + // + // Skip this character if it is a non-printable character. + // + if((ui32Char < ' ') || (ui32Char > '~')) + { + continue; + } + + // + // Convert the character into an index into the keyboard usage code + // table. + // + ui32Char -= ' '; + + // + // Send the key press message. + // + g_eKeyboardState = STATE_SENDING; + if(USBDHIDKeyboardKeyStateChange((void *)&g_sKeyboardDevice, + g_ppi8KeyUsageCodes[ui32Char][0], + g_ppi8KeyUsageCodes[ui32Char][1], + true) != KEYB_SUCCESS) + { + return; + } + + // + // Wait until the key press message has been sent. + // + if(!WaitForSendIdle(MAX_SEND_DELAY)) + { + g_bConnected = 0; + return; + } + + // + // Send the key release message. + // + g_eKeyboardState = STATE_SENDING; + if(USBDHIDKeyboardKeyStateChange((void *)&g_sKeyboardDevice, + 0, g_ppi8KeyUsageCodes[ui32Char][1], + false) != KEYB_SUCCESS) + { + return; + } + + // + // Wait until the key release message has been sent. + // + if(!WaitForSendIdle(MAX_SEND_DELAY)) + { + g_bConnected = 0; + return; + } + } +} + +//***************************************************************************** +// +// This is the interrupt handler for the SysTick interrupt. It is used to +// update our local tick count which, in turn, is used to check for transmit +// timeouts. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + uint_fast32_t ui32LastTickCount; + bool bLastSuspend; + tRectangle sRect; + tContext sContext; + int_fast32_t i32CenterX; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL at 50MHz. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Erratum workaround for silicon revision A1. VBUS must have pull-down. + // + if(CLASS_IS_TM4C123 && REVISION_IS_A1) + { + HWREG(GPIO_PORTB_BASE + GPIO_O_PDR) |= GPIO_PIN_1; + } + + // + // Enable the GPIO that is used for the on-board LED. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE, GPIO_PIN_2); + ROM_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, 0); + + // + // Initialize the buttons driver + // + ButtonsInit(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + i32CenterX = GrContextDpyWidthGet(&sContext) / 2; + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "usb-dev-keyboard", -1, i32CenterX, 4, 0); + + // + // Not configured initially. + // + g_bConnected = false; + g_bSuspended = false; + bLastSuspend = false; + + // + // Initialize the USB stack for device mode. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Pass our device information to the USB HID device class driver, + // initialize the USB + // controller and connect the device to the bus. + // + USBDHIDKeyboardInit(0, &g_sKeyboardDevice); + + // + // Set the system tick to fire 100 times per second. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // The main loop starts here. We begin by waiting for a host connection + // then drop into the main keyboard handling section. If the host + // disconnects, we return to the top and wait for a new connection. + // + while(1) + { + uint8_t ui8Buttons; + uint8_t ui8ButtonsChanged; + + // + // Tell the user what we are doing and provide some basic instructions. + // + GrStringDrawCentered(&sContext, " Waiting ", + -1, i32CenterX, 22, 1); + GrStringDrawCentered(&sContext, " for host ... ", -1, + i32CenterX, 32, 1); + + // + // Wait here until USB device is connected to a host. + // + while(!g_bConnected) + { + } + + // + // Update the status. + // + GrStringDrawCentered(&sContext, " Host ", + -1, i32CenterX, 22, 1); + GrStringDrawCentered(&sContext, " connected ... ", + -1, i32CenterX, 32, 1); + + // + // Enter the idle state. + // + g_eKeyboardState = STATE_IDLE; + + // + // Assume that the bus is not currently suspended if we have just been + // configured. + // + bLastSuspend = false; + + // + // Keep transferring characters from the UART to the USB host for as + // long as we are connected to the host. + // + while(g_bConnected) + { + // + // Remember the current time. + // + ui32LastTickCount = g_ui32SysTickCount; + + // + // Has the suspend state changed since last time we checked? + // + if(bLastSuspend != g_bSuspended) + { + // + // Yes - the state changed so update the display. + // + bLastSuspend = g_bSuspended; + if(bLastSuspend) + { + GrStringDrawCentered(&sContext, " Bus ", -1, + i32CenterX, 22, 1); + GrStringDrawCentered(&sContext, " suspended ... ", -1, + i32CenterX, 32, 1); + } + else + { + GrStringDrawCentered(&sContext, " Host ", -1, + i32CenterX, 22, 1); + GrStringDrawCentered(&sContext, " connected ... ", + -1, i32CenterX, 32, 1); + } + } + + // + // See if the button was just pressed. + // + ui8Buttons = ButtonsPoll(&ui8ButtonsChanged, 0); + if(BUTTON_PRESSED(SELECT_BUTTON, ui8Buttons, ui8ButtonsChanged)) + { + // + // If the bus is suspended then resume it. Otherwise, type + // some "random" characters. + // + if(g_bSuspended) + { + USBDHIDKeyboardRemoteWakeupRequest( + (void *)&g_sKeyboardDevice); + } + else + { + SendString("Make the Switch to TI Microcontrollers!"); + } + } + + // + // Wait for at least 1 system tick to have gone by before we poll + // the buttons again. + // + while(g_ui32SysTickCount == ui32LastTickCount) + { + } + } + } +} diff --git a/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ewd b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ewp b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ewp new file mode 100644 index 0000000..f8c0038 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ewp @@ -0,0 +1,805 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_dev_keyboard.c + + + $PROJ_DIR$\usb_keyb_structs.c + + + diff --git a/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.icf b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.icf new file mode 100644 index 0000000..fe2f11e --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_keyboard.icf - Linker configuration file for usb_dev_keyboard. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ld b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ld new file mode 100644 index 0000000..3b6f6fc --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_keyboard.ld - Linker configuration file for usb_dev_keyboard. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.sct b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.sct new file mode 100644 index 0000000..de7ce34 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_keyboard.sct - Linker configuration file for usb_dev_keyboard. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.uvopt b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.uvopt new file mode 100644 index 0000000..76a34a0 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.uvopt @@ -0,0 +1,373 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_keyboard + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_keyboard.c + usb_dev_keyboard.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_keyb_structs.c + usb_keyb_structs.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 10 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.uvproj b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.uvproj new file mode 100644 index 0000000..accad7a --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard.uvproj @@ -0,0 +1,454 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_keyboard + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_keyboard + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_keyboard.bin .\rvmdk\usb_dev_keyboard.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_keyboard.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_dev_keyboard.c + 1 + .\usb_dev_keyboard.c + + + usb_keyb_structs.c + 1 + .\usb_keyb_structs.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd new file mode 100644 index 0000000..08585db --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/usb_dev_keyboard_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_keyboard_ccs.cmd - CCS linker configuration file for usb_dev_keyboard. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/usb_dev_keyboard/usb_keyb_structs.c b/boards/ek-lm4f232/usb_dev_keyboard/usb_keyb_structs.c new file mode 100644 index 0000000..36bbf63 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/usb_keyb_structs.c @@ -0,0 +1,149 @@ +//***************************************************************************** +// +// usb_keyb_structs.c - Data structures defining the USB keyboard device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidkeyb.h" +#include "usb_keyb_structs.h" + +//**************************************************************************** +// +// The languages supported by this device. +// +//**************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//**************************************************************************** +// +// The manufacturer string. +// +//**************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//**************************************************************************** +// +// The product string. +// +//**************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (16 + 1) * 2, + USB_DTYPE_STRING, + 'K', 0, 'e', 0, 'y', 0, 'b', 0, 'o', 0, 'a', 0, 'r', 0, 'd', 0, ' ', 0, + 'E', 0, 'x', 0, 'a', 0, 'm', 0, 'p', 0, 'l', 0, 'e', 0 +}; + +//**************************************************************************** +// +// The serial number string. +// +//**************************************************************************** +const uint8_t g_pui8SeriailNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The interface description string. +// +//***************************************************************************** +const uint8_t g_pui8HIDInterfaceString[] = +{ + (22 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'K', 0, 'e', 0, 'y', 0, 'b', 0, + 'o', 0, 'a', 0, 'r', 0, 'd', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, + 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (26 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'K', 0, 'e', 0, 'y', 0, 'b', 0, + 'o', 0, 'a', 0, 'r', 0, 'd', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, + 'f', 0, 'i', 0, 'g', 0, 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, + 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SeriailNumberString, + g_pui8HIDInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The HID keyboard device initialization and customization structures. +// +//***************************************************************************** +tUSBDHIDKeyboardDevice g_sKeyboardDevice = +{ + USB_VID_TI_1CBE, + USB_PID_KEYBOARD, + 500, + USB_CONF_ATTR_SELF_PWR | USB_CONF_ATTR_RWAKE, + KeyboardHandler, + (void *)&g_sKeyboardDevice, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; diff --git a/boards/ek-lm4f232/usb_dev_keyboard/usb_keyb_structs.h b/boards/ek-lm4f232/usb_dev_keyboard/usb_keyb_structs.h new file mode 100644 index 0000000..de89c2c --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_keyboard/usb_keyb_structs.h @@ -0,0 +1,35 @@ +//***************************************************************************** +// +// usb_keyb_structs.h - Data structures defining the keyboard USB device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_KEYB_STRUCTS_H_ +#define _USB_KEYB_STRUCTS_H_ + +extern uint32_t KeyboardHandler(void *pvCBData, + uint32_t ui32Event, + uint32_t ui32MsgData, + void *pvMsgData); + +extern tUSBDHIDKeyboardDevice g_sKeyboardDevice; + +#endif diff --git a/boards/ek-lm4f232/usb_dev_msc/Makefile b/boards/ek-lm4f232/usb_dev_msc/Makefile new file mode 100644 index 0000000..c807c1e --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/Makefile @@ -0,0 +1,96 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Mass Storage Class example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the Mass Storage Class example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_msc.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Mass Storage Class example. +# +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/mmc-ek-lm4f232.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/usb_dev_msc.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/usb_msc_structs.o +${COMPILER}/usb_dev_msc.axf: ${COMPILER}/usbdsdcard.o +${COMPILER}/usb_dev_msc.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_msc.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_msc.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_msc.axf: usb_dev_msc.ld +SCATTERgcc_usb_dev_msc=usb_dev_msc.ld +ENTRY_usb_dev_msc=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/usb_dev_msc/ccs/.ccsimportspec b/boards/ek-lm4f232/usb_dev_msc/ccs/.ccsimportspec new file mode 100644 index 0000000..e530bf9 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/ccs/.ccsimportspec @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_msc/ccs/.ccsproject b/boards/ek-lm4f232/usb_dev_msc/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_msc/ccs/.cproject b/boards/ek-lm4f232/usb_dev_msc/ccs/.cproject new file mode 100644 index 0000000..2472d4a --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/ccs/.cproject @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_msc/ccs/.project b/boards/ek-lm4f232/usb_dev_msc/ccs/.project new file mode 100644 index 0000000..4e19231 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/ccs/.project @@ -0,0 +1,75 @@ + + + usb_dev_msc + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_msc/startup_ccs.c + + + usb_dev_msc.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.c + + + usb_dev_msc_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc_ccs.cmd + + + usb_msc_structs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_msc/usb_msc_structs.c + + + usbdsdcard.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_msc/usbdsdcard.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + third_party/fatfs/port/mmc-ek-lm4f232.c + 1 + SW_ROOT/third_party/fatfs/port/mmc-ek-lm4f232.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/usb_dev_msc/ccs/Debug/usb_dev_msc.bin b/boards/ek-lm4f232/usb_dev_msc/ccs/Debug/usb_dev_msc.bin new file mode 100644 index 0000000..348f6ff Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_msc/ccs/Debug/usb_dev_msc.bin differ diff --git a/boards/ek-lm4f232/usb_dev_msc/ccs/Debug/usb_dev_msc.out b/boards/ek-lm4f232/usb_dev_msc/ccs/Debug/usb_dev_msc.out new file mode 100644 index 0000000..bb42f02 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_msc/ccs/Debug/usb_dev_msc.out differ diff --git a/boards/ek-lm4f232/usb_dev_msc/ccs/macros.ini_initial b/boards/ek-lm4f232/usb_dev_msc/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/usb_dev_msc/ccs/target_config.ccxml b/boards/ek-lm4f232/usb_dev_msc/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin b/boards/ek-lm4f232/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin new file mode 100644 index 0000000..70add2c Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_msc/ewarm/Exe/usb_dev_msc.bin differ diff --git a/boards/ek-lm4f232/usb_dev_msc/ewarm/Exe/usb_dev_msc.out b/boards/ek-lm4f232/usb_dev_msc/ewarm/Exe/usb_dev_msc.out new file mode 100644 index 0000000..111dd3f Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_msc/ewarm/Exe/usb_dev_msc.out differ diff --git a/boards/ek-lm4f232/usb_dev_msc/gcc/usb_dev_msc.axf b/boards/ek-lm4f232/usb_dev_msc/gcc/usb_dev_msc.axf new file mode 100644 index 0000000..0e1ab9d Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_msc/gcc/usb_dev_msc.axf differ diff --git a/boards/ek-lm4f232/usb_dev_msc/gcc/usb_dev_msc.bin b/boards/ek-lm4f232/usb_dev_msc/gcc/usb_dev_msc.bin new file mode 100644 index 0000000..ff5e834 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_msc/gcc/usb_dev_msc.bin differ diff --git a/boards/ek-lm4f232/usb_dev_msc/readme.txt b/boards/ek-lm4f232/usb_dev_msc/readme.txt new file mode 100644 index 0000000..38c4c38 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/readme.txt @@ -0,0 +1,27 @@ +USB MSC Device + +This example application turns the evaluation board into a USB mass storage +class device. The application will use the microSD card for the storage +media for the mass storage device. The screen will display the current +action occurring on the device ranging from disconnected, no media, reading, +writing and idle. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/usb_dev_msc/rvmdk/usb_dev_msc.axf b/boards/ek-lm4f232/usb_dev_msc/rvmdk/usb_dev_msc.axf new file mode 100644 index 0000000..c15d5e8 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_msc/rvmdk/usb_dev_msc.axf differ diff --git a/boards/ek-lm4f232/usb_dev_msc/rvmdk/usb_dev_msc.bin b/boards/ek-lm4f232/usb_dev_msc/rvmdk/usb_dev_msc.bin new file mode 100644 index 0000000..b5ea132 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_msc/rvmdk/usb_dev_msc.bin differ diff --git a/boards/ek-lm4f232/usb_dev_msc/startup_ccs.c b/boards/ek-lm4f232/usb_dev_msc/startup_ccs.c new file mode 100644 index 0000000..02f7ee1 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_msc/startup_ewarm.c b/boards/ek-lm4f232/usb_dev_msc/startup_ewarm.c new file mode 100644 index 0000000..4a89955 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_msc/startup_gcc.c b/boards/ek-lm4f232/usb_dev_msc/startup_gcc.c new file mode 100644 index 0000000..d4c8869 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_msc/startup_rvmdk.S b/boards/ek-lm4f232/usb_dev_msc/startup_rvmdk.S new file mode 100644 index 0000000..8b59f43 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.c b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.c new file mode 100644 index 0000000..764e4ff --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.c @@ -0,0 +1,617 @@ +//***************************************************************************** +// +// usb_dev_msc.c - Main routines for the device mass storage class example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/systick.h" +#include "driverlib/usb.h" +#include "driverlib/gpio.h" +#include "driverlib/udma.h" +#include "driverlib/pin_map.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdmsc.h" +#include "drivers/cfal96x64x16.h" +#include "usb_msc_structs.h" +#include "third_party/fatfs/src/diskio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB MSC Device (usb_dev_msc)

      +//! +//! This example application turns the evaluation board into a USB mass storage +//! class device. The application will use the microSD card for the storage +//! media for the mass storage device. The screen will display the current +//! action occurring on the device ranging from disconnected, no media, reading, +//! writing and idle. +// +//***************************************************************************** + +//***************************************************************************** +// +// These defines are used to define the screen constraints to the application. +// +//***************************************************************************** +#define DISPLAY_BANNER_HEIGHT 11 +#define DISPLAY_BANNER_BG ClrDarkBlue +#define DISPLAY_BANNER_FG ClrWhite + +//***************************************************************************** +// +// The number of ticks to wait before falling back to the idle state. Since +// the tick rate is 100Hz this is approximately 3 seconds. +// +//***************************************************************************** +#define USBMSC_ACTIVITY_TIMEOUT 300 + +//***************************************************************************** +// +// This enumeration holds the various states that the device can be in during +// normal operation. +// +//***************************************************************************** +volatile enum +{ + // + // Unconfigured. + // + MSC_DEV_DISCONNECTED, + + // + // Connected but not yet fully enumerated. + // + MSC_DEV_CONNECTED, + + // + // Connected and fully enumerated but not currently handling a command. + // + MSC_DEV_IDLE, + + // + // Currently reading the SD card. + // + MSC_DEV_READ, + + // + // Currently writing the SD card. + // + MSC_DEV_WRITE, +} +g_eMSCState; + +//***************************************************************************** +// +// The Flags that handle updates to the status area to avoid drawing when no +// updates are required.. +// +//***************************************************************************** +#define FLAG_UPDATE_STATUS 1 +static uint32_t g_ui32Flags; +static uint32_t g_ui32IdleTimeout; + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//****************************************************************************** +// +// The DMA control structure table. +// +//****************************************************************************** +#ifdef ewarm +#pragma data_alignment=1024 +tDMAControlTable sDMAControlTable[64]; +#elif defined(ccs) +#pragma DATA_ALIGN(sDMAControlTable, 1024) +tDMAControlTable sDMAControlTable[64]; +#else +tDMAControlTable sDMAControlTable[64] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// Handles bulk driver notifications related to the receive channel (data from +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint_fast32_t ui32Event, + uint_fast32_t ui32MsgValue, void *pvMsgData) +{ + return(0); +} + +//***************************************************************************** +// +// Handles bulk driver notifications related to the transmit channel (data to +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint_fast32_t ui32Event, uint_fast32_t ui32MsgValue, + void *pvMsgData) +{ + return(0); +} + +//***************************************************************************** +// +// This function updates the status area of the screen. It uses the current +// state of the application to print the status bar. +// +//***************************************************************************** +void +UpdateStatus(char *pcString, bool bClrBackground) +{ + tRectangle sRect; + + // + // + // + GrContextBackgroundSet(&g_sContext, DISPLAY_BANNER_BG); + + if(bClrBackground) + { + // + // Fill the bottom rows of the screen with blue to create the status area. + // + sRect.i16XMin = 0; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = sRect.i16YMin + DISPLAY_BANNER_HEIGHT - 1; + + // + // Draw the background of the banner. + // + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_FG); + GrRectDraw(&g_sContext, &sRect); + } + else + { + // + // Fill the bottom rows of the screen with blue to create the status area. + // + sRect.i16XMin = 1; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT + 1; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 2; + sRect.i16YMax = sRect.i16YMin + DISPLAY_BANNER_HEIGHT - 3; + + // + // Draw the background of the banner. + // + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // White text in the banner. + // + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_FG); + } + + // + // Write the current state to the left of the status area. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Update the status on the screen. + // + if(pcString != 0) + { + GrStringDrawCentered(&g_sContext, pcString, + -1, GrContextDpyWidthGet(&g_sContext) / 2, + 58, 1); + } +} + +//***************************************************************************** +// +// This function is the call back notification function provided to the USB +// library's mass storage class. +// +//***************************************************************************** +uint32_t +USBDMSCEventCallback(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgParam, + void *pvMsgData) +{ + // + // Reset the time out every time an event occurs. + // + g_ui32IdleTimeout = USBMSC_ACTIVITY_TIMEOUT; + + switch(ui32Event) + { + // + // Writing to the device. + // + case USBD_MSC_EVENT_WRITING: + { + // + // Only update if this is a change. + // + if(g_eMSCState != MSC_DEV_WRITE) + { + // + // Go to the write state. + // + g_eMSCState = MSC_DEV_WRITE; + + // + // Cause the main loop to update the screen. + // + g_ui32Flags |= FLAG_UPDATE_STATUS; + } + + break; + } + + // + // Reading from the device. + // + case USBD_MSC_EVENT_READING: + { + // + // Only update if this is a change. + // + if(g_eMSCState != MSC_DEV_READ) + { + // + // Go to the read state. + // + g_eMSCState = MSC_DEV_READ; + + // + // Cause the main loop to update the screen. + // + g_ui32Flags |= FLAG_UPDATE_STATUS; + } + + break; + } + // + // The USB host has disconnected from the device. + // + case USB_EVENT_DISCONNECTED: + { + // + // Go to the disconnected state. + // + g_eMSCState = MSC_DEV_DISCONNECTED; + + // + // Cause the main loop to update the screen. + // + g_ui32Flags |= FLAG_UPDATE_STATUS; + + break; + } + // + // The USB host has connected to the device. + // + case USB_EVENT_CONNECTED: + { + // + // Go to the idle state to wait for read/writes. + // + g_eMSCState = MSC_DEV_IDLE; + + break; + } + case USBD_MSC_EVENT_IDLE: + default: + { + break; + } + } + + return(0); +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. FatFs requires a timer tick +// every 10 ms for internal timing purposes. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Call the FatFs tick timer. + // + disk_timerproc(); + + if(g_ui32IdleTimeout != 0) + { + g_ui32IdleTimeout--; + } +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + uint_fast32_t ui32Retcode; + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure SysTick for a 100Hz interrupt. The FatFs driver wants a 10 ms + // tick. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / 100); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Configure and enable uDMA + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + SysCtlDelay(10); + ROM_uDMAControlBaseSet(&sDMAControlTable[0]); + ROM_uDMAEnable(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top 15 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = DISPLAY_BANNER_HEIGHT - 1; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "usb-dev-msc", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 5, 0); + + // + // Initialize the idle timeout and reset all flags. + // + g_ui32IdleTimeout = 0; + g_ui32Flags = 0; + + // + // Initialize the state to idle. + // + g_eMSCState = MSC_DEV_DISCONNECTED; + + // + // Draw the status bar and set it to idle. + // + UpdateStatus("Disconnected", 1); + + // + // Enable the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Set the USB pins to be controlled by the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Set the USB stack mode to Device mode with VBUS monitoring. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Pass our device information to the USB library and place the device + // on the bus. + // + USBDMSCInit(0, &g_sMSCDevice); + + // + // Determine whether or not an SDCard is installed. If not, print a + // warning and have the user install one and restart. + // + ui32Retcode = disk_initialize(0); + + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + if(ui32Retcode != RES_OK) + { + GrStringDrawCentered(&g_sContext, "No SDCard Found", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 16, 0); + GrStringDrawCentered(&g_sContext, "Please insert", + -1, GrContextDpyWidthGet(&g_sContext) / 2, 26, 0); + GrStringDrawCentered(&g_sContext, "a card and", + -1, GrContextDpyWidthGet(&g_sContext) / 2, 36, 0); + GrStringDrawCentered(&g_sContext, "reset the board.", + -1, GrContextDpyWidthGet(&g_sContext) / 2, 46, 0); + } + else + { + GrStringDrawCentered(&g_sContext, "SDCard Found", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 30, 0); + } + + // + // Drop into the main loop. + // + while(1) + { + switch(g_eMSCState) + { + case MSC_DEV_READ: + { + // + // Update the screen if necessary. + // + if(g_ui32Flags & FLAG_UPDATE_STATUS) + { + UpdateStatus("Reading", 0); + g_ui32Flags &= ~FLAG_UPDATE_STATUS; + } + + // + // If there is no activity then return to the idle state. + // + if(g_ui32IdleTimeout == 0) + { + UpdateStatus("Idle", 0); + g_eMSCState = MSC_DEV_IDLE; + } + + break; + } + case MSC_DEV_WRITE: + { + // + // Update the screen if necessary. + // + if(g_ui32Flags & FLAG_UPDATE_STATUS) + { + UpdateStatus("Writing", 0); + g_ui32Flags &= ~FLAG_UPDATE_STATUS; + } + + // + // If there is no activity then return to the idle state. + // + if(g_ui32IdleTimeout == 0) + { + UpdateStatus("Idle", 0); + g_eMSCState = MSC_DEV_IDLE; + } + break; + } + case MSC_DEV_DISCONNECTED: + { + // + // Update the screen if necessary. + // + if(g_ui32Flags & FLAG_UPDATE_STATUS) + { + UpdateStatus("Disconnected", 0); + g_ui32Flags &= ~FLAG_UPDATE_STATUS; + } + break; + } + case MSC_DEV_IDLE: + { + break; + } + default: + { + break; + } + } + } +} + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + while(1) + { + // + // Hang on runtime error. + // + } +} +#endif + diff --git a/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ewd b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ewp b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ewp new file mode 100644 index 0000000..5b307a6 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ewp @@ -0,0 +1,809 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\mmc-ek-lm4f232.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_dev_msc.c + + + $PROJ_DIR$\usb_msc_structs.c + + + $PROJ_DIR$\usbdsdcard.c + + + diff --git a/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.icf b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.icf new file mode 100644 index 0000000..7d63f60 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_msc.icf - Linker configuration file for usb_dev_msc. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ld b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ld new file mode 100644 index 0000000..eb6119b --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_msc.ld - Linker configuration file for usb_dev_msc. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.sct b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.sct new file mode 100644 index 0000000..668a52c --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_msc.sct - Linker configuration file for usb_dev_msc. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.uvopt b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.uvopt new file mode 100644 index 0000000..dd3871d --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_msc + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\mmc-ek-lm4f232.c + mmc-ek-lm4f232.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_msc.c + usb_dev_msc.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_msc_structs.c + usb_msc_structs.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usbdsdcard.c + usbdsdcard.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.uvproj b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.uvproj new file mode 100644 index 0000000..7fe5428 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_msc + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_msc + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_msc.bin .\rvmdk\usb_dev_msc.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_msc.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + mmc-ek-lm4f232.c + 1 + ..\..\..\..\third_party\fatfs\port\mmc-ek-lm4f232.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_dev_msc.c + 1 + .\usb_dev_msc.c + + + usb_msc_structs.c + 1 + .\usb_msc_structs.c + + + usbdsdcard.c + 1 + .\usbdsdcard.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc_ccs.cmd b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc_ccs.cmd new file mode 100644 index 0000000..ca737d4 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usb_dev_msc_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_msc_ccs.cmd - CCS linker configuration file for usb_dev_msc. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/usb_dev_msc/usb_msc_structs.c b/boards/ek-lm4f232/usb_dev_msc/usb_msc_structs.c new file mode 100644 index 0000000..7978c07 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usb_msc_structs.c @@ -0,0 +1,191 @@ +//***************************************************************************** +// +// usb_bulk_structs.c - Data structures defining the mass storage USB device. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdmsc.h" +#include "usb_msc_structs.h" +#include "usbdsdcard.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'M', 0, 'a', 0, 's', 0, 's', 0, ' ', 0, 'S', 0, 't', 0, 'o', 0, 'r', 0, + 'a', 0, 'g', 0, 'e', 0, ' ', 0, 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, + 'e', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The data interface description string. +// +//***************************************************************************** +const uint8_t g_pui8DataInterfaceString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, + 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (23 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, 'i', 0, 'g', 0, + 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8DataInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The bulk device initialization and customization structures. In this case, +// we are using USBBuffers between the bulk device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the bulk channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our bulk instance structure. +// +//***************************************************************************** +tUSBDMSCDevice g_sMSCDevice = +{ + // + // Vendor ID. + // + USB_VID_TI_1CBE, + + // + // Product ID. + // + USB_PID_MSC, + + // + // Vendor Information. + // + "TI ", + + // + // Product Identification. + // + "Mass Storage ", + + // + // Revision. + // + "1.00", + 500, + USB_CONF_ATTR_SELF_PWR, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS, + { + USBDMSCStorageOpen, + USBDMSCStorageClose, + USBDMSCStorageRead, + USBDMSCStorageWrite, + USBDMSCStorageNumBlocks, + 0 + }, + USBDMSCEventCallback +}; + +//***************************************************************************** +// +// The size of the transmit and receive buffers used. +// +//***************************************************************************** +#define MSC_BUFFER_SIZE 512 diff --git a/boards/ek-lm4f232/usb_dev_msc/usb_msc_structs.h b/boards/ek-lm4f232/usb_dev_msc/usb_msc_structs.h new file mode 100644 index 0000000..55073c6 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usb_msc_structs.h @@ -0,0 +1,43 @@ +//***************************************************************************** +// +// usb_msc_structs.h - Data structures defining the mass storage USB device. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __USB_MSC_STRUCTS_H__ +#define __USB_MSC_STRUCTS_H__ + +//***************************************************************************** +// +// The mass storage class device structure. +// +//***************************************************************************** +extern tUSBDMSCDevice g_sMSCDevice; + +//***************************************************************************** +// +// The externally provided mass storage class event call back function. +// +//***************************************************************************** +extern uint32_t USBDMSCEventCallback(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgParam, void *pvMsgData); + +#endif diff --git a/boards/ek-lm4f232/usb_dev_msc/usbdsdcard.c b/boards/ek-lm4f232/usb_dev_msc/usbdsdcard.c new file mode 100644 index 0000000..1c716bc --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usbdsdcard.c @@ -0,0 +1,257 @@ +//***************************************************************************** +// +// usbdsdcard.c - Routines supplied for use by the mass storage class device +// class. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/sysctl.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/systick.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdmsc.h" +#include "usb_msc_structs.h" +#include "third_party/fatfs/src/diskio.h" +#include "drivers/cfal96x64x16.h" + +#define SDCARD_PRESENT 0x00000001 +#define SDCARD_IN_USE 0x00000002 +struct +{ + uint32_t ui32Flags; +} +g_sDriveInformation; + +//***************************************************************************** +// +// This function opens the drive number and prepares it for use by the Mass +// storage class device. +// +// /param ui32Drive is the driver number to open. +// +// This function is used to initialize and open the physical drive number +// associated with the parameter /e ui32Drive. The function will return zero if +// the drive could not be opened for some reason. In the case of removable +// device like an SD card this function should return zero if the SD card is +// not present. +// +// /return Returns a pointer to data that should be passed to other APIs or it +// will return 0 if no drive was found. +// +//***************************************************************************** +void * +USBDMSCStorageOpen(uint_fast32_t ui32Drive) +{ + uint_fast32_t ui32Temp; + + ASSERT(ui32Drive == 0); + + // + // Return if already in use. + // + if(g_sDriveInformation.ui32Flags & SDCARD_IN_USE) + { + return(0); + } + + // + // Initialize the drive if it is present. + // + ui32Temp = disk_initialize(0); + + if(ui32Temp == RES_OK) + { + // + // Card is present and in use. + // + g_sDriveInformation.ui32Flags = SDCARD_PRESENT | SDCARD_IN_USE; + } + else if(ui32Temp == STA_NODISK) + { + // + // Allocate the card but it is not present. + // + g_sDriveInformation.ui32Flags = SDCARD_IN_USE; + } + else + { + return(0); + } + + return((void *)&g_sDriveInformation); +} + +//***************************************************************************** +// +// This function close the drive number in use by the mass storage class device. +// +// /param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// +// This function is used to close the physical drive number associated with the +// parameter /e pvDrive. This function will return 0 if the drive was closed +// successfully and any other value will indicate a failure. +// +// /return Returns 0 if the drive was successfully closed or non-zero for a +// failure. +// +//***************************************************************************** +void +USBDMSCStorageClose(void * pvDrive) +{ + uint_fast8_t ui8Power; + + ASSERT(pvDrive != 0); + + // + // Clear all flags. + // + g_sDriveInformation.ui32Flags = 0; + + // + // Power up the card. + // + ui8Power = 0; + + // + // Turn off the power to the card. + // + disk_ioctl(0, CTRL_POWER, &ui8Power); +} + +//***************************************************************************** +// +// This function will read a block from a device opened by the +// USBDMSCStorageOpen() call. +// +// /param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// /param pui8Data is the buffer that data will be written into. +// /param ui32NumBlocks is the number of blocks to read. +// +// This function is use to read blocks from a physical device and return them +// in the /e pui8Data buffer. The data area pointed to by /e pui8Data should be +// at least /e ui32NumBlocks * Block Size bytes to prevent overwriting data. +// +// /return Returns the number of bytes that were read from the device. +// +//***************************************************************************** +uint32_t USBDMSCStorageRead(void * pvDrive, + uint8_t *pui8Data, + uint_fast32_t ui32Sector, + uint_fast32_t ui32NumBlocks) +{ + ASSERT(pvDrive != 0); + + if(disk_read (0, pui8Data, ui32Sector, ui32NumBlocks) == RES_OK) + { + // TODO remove fixed 512 + return(ui32NumBlocks * 512); + } + return(0); +} + +//***************************************************************************** +// +// This function will write a block to a device opened by the +// USBDMSCStorageOpen() call. +// +// /param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// /param pui8Data is the buffer that data will be used for writing. +// /param ui32NumBlocks is the number of blocks to write. +// +// This function is use to write blocks to a physical device from the buffer +// pointed to by the /e pui8Data buffer. If the number of blocks is greater than +// one then the block address will increment and write to the next block until +// /e ui32NumBlocks * Block Size bytes have been written. +// +// /return Returns the number of bytes that were written to the device. +// +//***************************************************************************** +uint32_t USBDMSCStorageWrite(void * pvDrive, + uint8_t *pui8Data, + uint_fast32_t ui32Sector, + uint_fast32_t ui32NumBlocks) +{ + ASSERT(pvDrive != 0); + + if(disk_write(0, pui8Data, ui32Sector, ui32NumBlocks) == RES_OK) + { + return(ui32NumBlocks * 512); + } + return(0); +} + +//***************************************************************************** +// +// This function will return the number of blocks present on a device. +// +// /param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// +// This function is used to return the total number of blocks on a physical +// device based on the /e pvDrive parameter. +// +// /return Returns the number of blocks that are present in a device. +// +//***************************************************************************** +uint32_t +USBDMSCStorageNumBlocks(void * pvDrive) +{ + uint_fast32_t ui32SectorCount; + + // + // Read the number of sectors. + // + disk_ioctl(0, GET_SECTOR_COUNT, &ui32SectorCount); + + return(ui32SectorCount); +} + +//***************************************************************************** +// +// This function will return the current status of a device. +// +// /param pvDrive is the pointer that was returned from a call to +// USBDMSCStorageOpen(). +// +// This function is used to return the current status of the device indicated by +// the /e pvDrive parameter. This can be used to see if the device is busy, +// or if it is present. +// +// /return Returns the size in bytes of blocks that in a device. +// +//***************************************************************************** +#define USBDMSC_IDLE 0x00000000 +#define USBDMSC_NOT_PRESENT 0x00000001 +uint32_t USBDMSCStorageStatus(void * pvDrive); diff --git a/boards/ek-lm4f232/usb_dev_msc/usbdsdcard.h b/boards/ek-lm4f232/usb_dev_msc/usbdsdcard.h new file mode 100644 index 0000000..17a4a62 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_msc/usbdsdcard.h @@ -0,0 +1,43 @@ +//***************************************************************************** +// +// usbdsdcard.h - Prototypes for functions supplied for use by the mass storage +// class device. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __USBDSDCARD_H__ +#define __USBDSDCARD_H__ + +//***************************************************************************** +// +// +//***************************************************************************** +extern void * USBDMSCStorageOpen(uint32_t ui32Drive); +extern void USBDMSCStorageClose(void * pvDrive); +extern uint32_t USBDMSCStorageRead(void * pvDrive, uint8_t *pui8Data, + uint32_t ui32Sector, + uint32_t ui32NumBlocks); +extern uint32_t USBDMSCStorageWrite(void * pvDrive, uint8_t *pui8Data, + uint32_t ui32Sector, + uint32_t ui32NumBlocks); +uint32_t USBDMSCStorageNumBlocks(void * pvDrive); + +#endif diff --git a/boards/ek-lm4f232/usb_dev_serial/Makefile b/boards/ek-lm4f232/usb_dev_serial/Makefile new file mode 100644 index 0000000..a66b530 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/Makefile @@ -0,0 +1,92 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device serial example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device serial example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_serial.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device serial example. +# +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/usb_dev_serial.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/usb_serial_structs.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_dev_serial.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_serial.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_dev_serial.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_serial.axf: usb_dev_serial.ld +SCATTERgcc_usb_dev_serial=usb_dev_serial.ld +ENTRY_usb_dev_serial=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/usb_dev_serial/ccs/.ccsimportspec b/boards/ek-lm4f232/usb_dev_serial/ccs/.ccsimportspec new file mode 100644 index 0000000..c5ecbbf --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_serial/ccs/.ccsproject b/boards/ek-lm4f232/usb_dev_serial/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_serial/ccs/.cproject b/boards/ek-lm4f232/usb_dev_serial/ccs/.cproject new file mode 100644 index 0000000..da9340c --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/ccs/.cproject @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_serial/ccs/.project b/boards/ek-lm4f232/usb_dev_serial/ccs/.project new file mode 100644 index 0000000..ddf1b3a --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/ccs/.project @@ -0,0 +1,70 @@ + + + usb_dev_serial + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_serial/startup_ccs.c + + + usb_dev_serial.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.c + + + usb_dev_serial_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial_ccs.cmd + + + usb_serial_structs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_dev_serial/usb_serial_structs.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/usb_dev_serial/ccs/Debug/usb_dev_serial.bin b/boards/ek-lm4f232/usb_dev_serial/ccs/Debug/usb_dev_serial.bin new file mode 100644 index 0000000..7b46059 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_serial/ccs/Debug/usb_dev_serial.bin differ diff --git a/boards/ek-lm4f232/usb_dev_serial/ccs/Debug/usb_dev_serial.out b/boards/ek-lm4f232/usb_dev_serial/ccs/Debug/usb_dev_serial.out new file mode 100644 index 0000000..c405af2 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_serial/ccs/Debug/usb_dev_serial.out differ diff --git a/boards/ek-lm4f232/usb_dev_serial/ccs/macros.ini_initial b/boards/ek-lm4f232/usb_dev_serial/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/usb_dev_serial/ccs/target_config.ccxml b/boards/ek-lm4f232/usb_dev_serial/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin b/boards/ek-lm4f232/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin new file mode 100644 index 0000000..66f4d1a Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin differ diff --git a/boards/ek-lm4f232/usb_dev_serial/ewarm/Exe/usb_dev_serial.out b/boards/ek-lm4f232/usb_dev_serial/ewarm/Exe/usb_dev_serial.out new file mode 100644 index 0000000..3bb46b0 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_serial/ewarm/Exe/usb_dev_serial.out differ diff --git a/boards/ek-lm4f232/usb_dev_serial/gcc/usb_dev_serial.axf b/boards/ek-lm4f232/usb_dev_serial/gcc/usb_dev_serial.axf new file mode 100644 index 0000000..0389315 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_serial/gcc/usb_dev_serial.axf differ diff --git a/boards/ek-lm4f232/usb_dev_serial/gcc/usb_dev_serial.bin b/boards/ek-lm4f232/usb_dev_serial/gcc/usb_dev_serial.bin new file mode 100644 index 0000000..ff555b4 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_serial/gcc/usb_dev_serial.bin differ diff --git a/boards/ek-lm4f232/usb_dev_serial/readme.txt b/boards/ek-lm4f232/usb_dev_serial/readme.txt new file mode 100644 index 0000000..b9c1ca2 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/readme.txt @@ -0,0 +1,32 @@ +USB Serial Device + +This example application turns the evaluation kit into a virtual serial +port when connected to the USB host system. The application supports the +USB Communication Device Class, Abstract Control Model to redirect UART0 +traffic to and from the USB host system. + +Assuming you installed TivaWare in the default directory, a +driver information (INF) file for use with Windows XP, Windows Vista and +Windows7 can be found in C:/ti/TivaWare_C_Series-x.x/windows_drivers. +For Windows 2000, the required INF file is in +C:/ti/TivaWare_C_Series-x.x/windows_drivers/win2K. + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/usb_dev_serial/rvmdk/usb_dev_serial.axf b/boards/ek-lm4f232/usb_dev_serial/rvmdk/usb_dev_serial.axf new file mode 100644 index 0000000..c0b7915 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_serial/rvmdk/usb_dev_serial.axf differ diff --git a/boards/ek-lm4f232/usb_dev_serial/rvmdk/usb_dev_serial.bin b/boards/ek-lm4f232/usb_dev_serial/rvmdk/usb_dev_serial.bin new file mode 100644 index 0000000..66c86f8 Binary files /dev/null and b/boards/ek-lm4f232/usb_dev_serial/rvmdk/usb_dev_serial.bin differ diff --git a/boards/ek-lm4f232/usb_dev_serial/startup_ccs.c b/boards/ek-lm4f232/usb_dev_serial/startup_ccs.c new file mode 100644 index 0000000..27d76ef --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_serial/startup_ewarm.c b/boards/ek-lm4f232/usb_dev_serial/startup_ewarm.c new file mode 100644 index 0000000..c0c44e6 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_serial/startup_gcc.c b/boards/ek-lm4f232/usb_dev_serial/startup_gcc.c new file mode 100644 index 0000000..1042858 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_dev_serial/startup_rvmdk.S b/boards/ek-lm4f232/usb_dev_serial/startup_rvmdk.S new file mode 100644 index 0000000..c1d213d --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN USBUARTIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD USBUARTIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.c b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.c new file mode 100644 index 0000000..e770cbb --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.c @@ -0,0 +1,1441 @@ +//***************************************************************************** +// +// usb_dev_serial.c - Main routines for the USB CDC serial example. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_gpio.h" +#include "inc/hw_uart.h" +#include "inc/hw_sysctl.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/timer.h" +#include "driverlib/uart.h" +#include "driverlib/usb.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" +#include "usb_serial_structs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Serial Device (usb_dev_serial)

      +//! +//! This example application turns the evaluation kit into a virtual serial +//! port when connected to the USB host system. The application supports the +//! USB Communication Device Class, Abstract Control Model to redirect UART0 +//! traffic to and from the USB host system. +//! +//! Assuming you installed TivaWare in the default directory, a +//! driver information (INF) file for use with Windows XP, Windows Vista and +//! Windows7 can be found in C:/ti/TivaWare_C_Series-x.x/windows_drivers. +//! For Windows 2000, the required INF file is in +//! C:/ti/TivaWare_C_Series-x.x/windows_drivers/win2K. +// +//***************************************************************************** + +//***************************************************************************** +// +// Note: +// +// This example is intended to run on Tiva C Series evaluation kit hardware +// where the UARTs are wired solely for TX and RX, and do not have GPIOs +// connected to act as handshake signals. As a result, this example mimics +// the case where communication is always possible. It reports DSR, DCD +// and CTS as high to ensure that the USB host recognizes that data can be +// sent and merely ignores the host's requested DTR and RTS states. "TODO" +// comments in the code indicate where code would be required to add support +// for real handshakes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration and tuning parameters. +// +//***************************************************************************** + +//***************************************************************************** +// +// The system tick rate expressed both as ticks per second and a millisecond +// period. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 +#define SYSTICK_PERIOD_MS (1000 / SYSTICKS_PER_SECOND) + +//***************************************************************************** +// +// Variables tracking transmit and receive counts. +// +//***************************************************************************** +volatile uint32_t g_ui32UARTTxCount = 0; +volatile uint32_t g_ui32UARTRxCount = 0; +#ifdef DEBUG +uint32_t g_ui32UARTRxErrors = 0; +#endif + +//***************************************************************************** +// +// The base address, peripheral ID and interrupt ID of the UART that is to +// be redirected. +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines required to redirect UART0 via USB. +// +//***************************************************************************** +#define USB_UART_BASE UART0_BASE +#define USB_UART_PERIPH SYSCTL_PERIPH_UART0 +#define USB_UART_INT INT_UART0 + +//***************************************************************************** +// +// Default line coding settings for the redirected UART. +// +//***************************************************************************** +#define DEFAULT_BIT_RATE 115200 +#define DEFAULT_UART_CONFIG (UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | \ + UART_CONFIG_STOP_ONE) + +//***************************************************************************** +// +// GPIO peripherals and pins muxed with the redirected UART. These will depend +// upon the IC in use and the UART selected in USB_UART_BASE. Be careful that +// these settings all agree with the hardware you are using. +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines required to redirect UART0 via USB. +// +//***************************************************************************** +#define TX_GPIO_BASE GPIO_PORTA_BASE +#define TX_GPIO_PERIPH SYSCTL_PERIPH_GPIOA +#define TX_GPIO_PIN GPIO_PIN_1 + +#define RX_GPIO_BASE GPIO_PORTA_BASE +#define RX_GPIO_PERIPH SYSCTL_PERIPH_GPIOA +#define RX_GPIO_PIN GPIO_PIN_0 + +//***************************************************************************** +// +// Flag indicating whether or not we are currently sending a Break condition. +// +//***************************************************************************** +static bool g_bSendingBreak = false; + +//***************************************************************************** +// +// Global system tick counter +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount = 0; + +//***************************************************************************** +// +// Graphics context used to show text on the color STN display. +// +//***************************************************************************** +tContext g_sContext; +#define TEXT_FONT g_psFontFixed6x8 +#define TEXT_HEIGHT (GrFontHeightGet(TEXT_FONT)) +#define BUFFER_METER_HEIGHT TEXT_HEIGHT +#define BUFFER_METER_WIDTH 56 + +//***************************************************************************** +// +// Flags used to pass commands from interrupt context to the main loop. +// +//***************************************************************************** +#define COMMAND_PACKET_RECEIVED 0x00000001 +#define COMMAND_STATUS_UPDATE 0x00000002 + +volatile uint32_t g_ui32Flags = 0; +char *g_pcStatus; + +//***************************************************************************** +// +// Global flag indicating that a USB configuration has been set. +// +//***************************************************************************** +static volatile bool g_bUSBConfigured = false; + +//***************************************************************************** +// +// Internal function prototypes. +// +//***************************************************************************** +static void USBUARTPrimeTransmit(uint32_t ui32Base); +static void CheckForSerialStateChange(const tUSBDCDCDevice *psDevice, + int32_t i32Errors); +static void SetControlLineState(uint16_t ui16State); +static bool SetLineCoding(tLineCoding *psLineCoding); +static void GetLineCoding(tLineCoding *psLineCoding); +static void SendBreak(bool bSend); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + while(1) + { + } +} +#endif + +//***************************************************************************** +// +// This function is called whenever serial data is received from the UART. +// It is passed the accumulated error flags from each character received in +// this interrupt and determines from them whether or not an interrupt +// notification to the host is required. +// +// If a notification is required and the control interrupt endpoint is idle, +// we send the notification immediately. If the endpoint is not idle, we +// accumulate the errors in a global variable which will be checked on +// completion of the previous notification and used to send a second one +// if necessary. +// +//***************************************************************************** +static void +CheckForSerialStateChange(const tUSBDCDCDevice *psDevice, int32_t i32Errors) +{ + uint16_t ui16SerialState; + + // + // Clear our USB serial state. Since we are faking the handshakes, always + // set the TXCARRIER (DSR) and RXCARRIER (DCD) bits. + // + ui16SerialState = USB_CDC_SERIAL_STATE_TXCARRIER | + USB_CDC_SERIAL_STATE_RXCARRIER; + + // + // Are any error bits set? + // + if(i32Errors) + { + // + // At least one error is being notified so translate from our hardware + // error bits into the correct state markers for the USB notification. + // + if(i32Errors & UART_DR_OE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_OVERRUN; + } + + if(i32Errors & UART_DR_PE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_PARITY; + } + + if(i32Errors & UART_DR_FE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_FRAMING; + } + + if(i32Errors & UART_DR_BE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_BREAK; + } + + // Call the CDC driver to notify the state change. + USBDCDCSerialStateChange((void *)psDevice, ui16SerialState); + } +} + +//***************************************************************************** +// +// Read as many characters from the UART FIFO as we can and move them into +// the CDC transmit buffer. +// +// \return Returns UART error flags read during data reception. +// +//***************************************************************************** +static int32_t +ReadUARTData(void) +{ + int32_t i32Char, i32Errors; + uint8_t ui8Char; + uint32_t ui32Space; + + // + // Clear our error indicator. + // + i32Errors = 0; + + // + // How much space do we have in the buffer? + // + ui32Space = USBBufferSpaceAvailable((tUSBBuffer *)&g_sTxBuffer); + + // + // Read data from the UART FIFO until there is none left or we run + // out of space in our receive buffer. + // + while(ui32Space && ROM_UARTCharsAvail(USB_UART_BASE)) + { + // + // Read a character from the UART FIFO into the ring buffer if no + // errors are reported. + // + i32Char = ROM_UARTCharGetNonBlocking(USB_UART_BASE); + + // + // If the character did not contain any error notifications, + // copy it to the output buffer. + // + if(!(i32Char & ~0xFF)) + { + ui8Char = (uint8_t)(i32Char & 0xFF); + USBBufferWrite((tUSBBuffer *)&g_sTxBuffer, + (uint8_t *)&ui8Char, 1); + + // + // Decrement the number of bytes we know the buffer can accept. + // + ui32Space--; + } + else + { +#ifdef DEBUG + // + // Increment our receive error counter. + // + g_ui32UARTRxErrors++; +#endif + // + // Update our error accumulator. + // + i32Errors |= i32Char; + } + + // + // Update our count of bytes received via the UART. + // + g_ui32UARTRxCount++; + } + + // + // Pass back the accumulated error indicators. + // + return(i32Errors); +} + +//***************************************************************************** +// +// Take as many bytes from the transmit buffer as we have space for and move +// them into the USB UART's transmit FIFO. +// +//***************************************************************************** +static void +USBUARTPrimeTransmit(uint32_t ui32Base) +{ + uint32_t ui32Read; + uint8_t ui8Char; + + // + // If we are currently sending a break condition, don't receive any + // more data. We will resume transmission once the break is turned off. + // + if(g_bSendingBreak) + { + return; + } + + // + // If there is space in the UART FIFO, try to read some characters + // from the receive buffer to fill it again. + // + while(ROM_UARTSpaceAvail(ui32Base)) + { + // + // Get a character from the buffer. + // + ui32Read = USBBufferRead((tUSBBuffer *)&g_sRxBuffer, &ui8Char, 1); + + // + // Did we get a character? + // + if(ui32Read) + { + // + // Place the character in the UART transmit FIFO. + // + ROM_UARTCharPutNonBlocking(ui32Base, ui8Char); + + // + // Update our count of bytes transmitted via the UART. + // + g_ui32UARTTxCount++; + } + else + { + // + // We ran out of characters so exit the function. + // + return; + } + } +} + +//***************************************************************************** +// +// Interrupt handler for the system tick counter. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Update our system time. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// Interrupt handler for the UART which we are redirecting via USB. +// +//***************************************************************************** +void +USBUARTIntHandler(void) +{ + uint32_t ui32Ints; + int32_t i32Errors; + + // + // Get and clear the current interrupt source(s) + // + ui32Ints = ROM_UARTIntStatus(USB_UART_BASE, true); + ROM_UARTIntClear(USB_UART_BASE, ui32Ints); + + // + // Are we being interrupted because the TX FIFO has space available? + // + if(ui32Ints & UART_INT_TX) + { + // + // Move as many bytes as we can into the transmit FIFO. + // + USBUARTPrimeTransmit(USB_UART_BASE); + + // + // If the output buffer is empty, turn off the transmit interrupt. + // + if(!USBBufferDataAvailable(&g_sRxBuffer)) + { + ROM_UARTIntDisable(USB_UART_BASE, UART_INT_TX); + } + } + + // + // Handle receive interrupts. + // + if(ui32Ints & (UART_INT_RX | UART_INT_RT)) + { + // + // Read the UART's characters into the buffer. + // + i32Errors = ReadUARTData(); + + // + // Check to see if we need to notify the host of any errors we just + // detected. + // + CheckForSerialStateChange(&g_sCDCDevice, i32Errors); + } +} + +//***************************************************************************** +// +// Set the state of the RS232 RTS and DTR signals. +// +//***************************************************************************** +static void +SetControlLineState(uint16_t ui16State) +{ + // + // TODO: If configured with GPIOs controlling the handshake lines, + // set them appropriately depending upon the flags passed in the wValue + // field of the request structure passed. + // +} + +//***************************************************************************** +// +// Set the communication parameters to use on the UART. +// +//***************************************************************************** +static bool +SetLineCoding(tLineCoding *psLineCoding) +{ + uint32_t ui32Config; + bool bRetcode; + + // + // Assume everything is OK until we detect any problem. + // + bRetcode = true; + + // + // Word length. For invalid values, the default is to set 8 bits per + // character and return an error. + // + switch(psLineCoding->ui8Databits) + { + case 5: + { + ui32Config = UART_CONFIG_WLEN_5; + break; + } + + case 6: + { + ui32Config = UART_CONFIG_WLEN_6; + break; + } + + case 7: + { + ui32Config = UART_CONFIG_WLEN_7; + break; + } + + case 8: + { + ui32Config = UART_CONFIG_WLEN_8; + break; + } + + default: + { + ui32Config = UART_CONFIG_WLEN_8; + bRetcode = false; + break; + } + } + + // + // Parity. For any invalid values, we set no parity and return an error. + // + switch(psLineCoding->ui8Parity) + { + case USB_CDC_PARITY_NONE: + { + ui32Config |= UART_CONFIG_PAR_NONE; + break; + } + + case USB_CDC_PARITY_ODD: + { + ui32Config |= UART_CONFIG_PAR_ODD; + break; + } + + case USB_CDC_PARITY_EVEN: + { + ui32Config |= UART_CONFIG_PAR_EVEN; + break; + } + + case USB_CDC_PARITY_MARK: + { + ui32Config |= UART_CONFIG_PAR_ONE; + break; + } + + case USB_CDC_PARITY_SPACE: + { + ui32Config |= UART_CONFIG_PAR_ZERO; + break; + } + + default: + { + ui32Config |= UART_CONFIG_PAR_NONE; + bRetcode = false; + break; + } + } + + // + // Stop bits. Our hardware only supports 1 or 2 stop bits whereas CDC + // allows the host to select 1.5 stop bits. If passed 1.5 (or any other + // invalid or unsupported value of ui8Stop, we set up for 1 stop bit but + // return an error in case the caller needs to Stall or otherwise report + // this back to the host. + // + switch(psLineCoding->ui8Stop) + { + // + // One stop bit requested. + // + case USB_CDC_STOP_BITS_1: + { + ui32Config |= UART_CONFIG_STOP_ONE; + break; + } + + // + // Two stop bits requested. + // + case USB_CDC_STOP_BITS_2: + { + ui32Config |= UART_CONFIG_STOP_TWO; + break; + } + + // + // Other cases are either invalid values of ui8Stop or values that we + // cannot support so set 1 stop bit but return an error. + // + default: + { + ui32Config = UART_CONFIG_STOP_ONE; + bRetcode |= false; + break; + } + } + + // + // Set the UART mode appropriately. + // + ROM_UARTConfigSetExpClk(USB_UART_BASE, ROM_SysCtlClockGet(), + psLineCoding->ui32Rate, ui32Config); + + // + // Let the caller know if we had a problem or not. + // + return(bRetcode); +} + +//***************************************************************************** +// +// Get the communication parameters in use on the UART. +// +//***************************************************************************** +static void +GetLineCoding(tLineCoding *psLineCoding) +{ + uint32_t ui32Config; + uint32_t ui32Rate; + + // + // Get the current line coding set in the UART. + // + ROM_UARTConfigGetExpClk(USB_UART_BASE, ROM_SysCtlClockGet(), &ui32Rate, + &ui32Config); + psLineCoding->ui32Rate = ui32Rate; + + // + // Translate the configuration word length field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_WLEN_MASK) + { + case UART_CONFIG_WLEN_8: + { + psLineCoding->ui8Databits = 8; + break; + } + + case UART_CONFIG_WLEN_7: + { + psLineCoding->ui8Databits = 7; + break; + } + + case UART_CONFIG_WLEN_6: + { + psLineCoding->ui8Databits = 6; + break; + } + + case UART_CONFIG_WLEN_5: + { + psLineCoding->ui8Databits = 5; + break; + } + } + + // + // Translate the configuration parity field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_PAR_MASK) + { + case UART_CONFIG_PAR_NONE: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_NONE; + break; + } + + case UART_CONFIG_PAR_ODD: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_ODD; + break; + } + + case UART_CONFIG_PAR_EVEN: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_EVEN; + break; + } + + case UART_CONFIG_PAR_ONE: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_MARK; + break; + } + + case UART_CONFIG_PAR_ZERO: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_SPACE; + break; + } + } + + // + // Translate the configuration stop bits field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_STOP_MASK) + { + case UART_CONFIG_STOP_ONE: + { + psLineCoding->ui8Stop = USB_CDC_STOP_BITS_1; + break; + } + + case UART_CONFIG_STOP_TWO: + { + psLineCoding->ui8Stop = USB_CDC_STOP_BITS_2; + break; + } + } +} + +//***************************************************************************** +// +// This function sets or clears a break condition on the redirected UART RX +// line. A break is started when the function is called with \e bSend set to +// \b true and persists until the function is called again with \e bSend set +// to \b false. +// +//***************************************************************************** +static void +SendBreak(bool bSend) +{ + // + // Are we being asked to start or stop the break condition? + // + if(!bSend) + { + // + // Remove the break condition on the line. + // + ROM_UARTBreakCtl(USB_UART_BASE, false); + g_bSendingBreak = false; + } + else + { + // + // Start sending a break condition on the line. + // + ROM_UARTBreakCtl(USB_UART_BASE, true); + g_bSendingBreak = true; + } +} + +//***************************************************************************** +// +// Shows the status string on the color STN display. +// +// \param psContext is a pointer to the graphics context representing the +// display. +// \param pcStatus is a pointer to the string to be shown. +// +// This implementation assumes we are using a 6 pixel wide font, giving us +// space for 16 characters across the display. +// +//***************************************************************************** +void +DisplayStatus(tContext *psContext, char *pcStatus) +{ + tRectangle sRectLine; + + // + // Determine the bounding rectangle for this line of text. + // + sRectLine.i16XMin = 0; + sRectLine.i16XMax = GrContextDpyWidthGet(psContext) - 1; + sRectLine.i16YMin = GrContextDpyHeightGet(psContext) - (TEXT_HEIGHT + 2); + sRectLine.i16YMax = sRectLine.i16YMin + GrFontHeightGet(TEXT_FONT) + 1; + + // + // Clear the line with black. + // + GrContextForegroundSet(&g_sContext, ClrBlack); + GrRectFill(psContext, &sRectLine); + + // + // Draw the new status string + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrStringDrawCentered(psContext, pcStatus, -1, + GrContextDpyWidthGet(psContext) / 2, + sRectLine.i16YMin + (TEXT_HEIGHT / 2), false); +} + +//***************************************************************************** +// +// Draw a horizontal meter at a given position on the display and fill it +// with green. +// +//***************************************************************************** +void +DrawBufferMeter(tContext *psContext, int32_t i32X, int32_t i32Y) +{ + tRectangle sRect; + int32_t i32CorrectedY; + + // + // Correct the Y coordinate so that the meter is centered on the same line + // as the text caption to its left. + // + i32CorrectedY = i32Y - ((BUFFER_METER_HEIGHT - TEXT_HEIGHT) / 2); + + // + // Determine the bounding rectangle of the meter. + // + sRect.i16XMin = i32X; + sRect.i16XMax = i32X + BUFFER_METER_WIDTH - 1; + sRect.i16YMin = i32CorrectedY; + sRect.i16YMax = i32CorrectedY + BUFFER_METER_HEIGHT - 1; + + // + // Fill the meter with green to indicate empty + // + GrContextForegroundSet(psContext, ClrGreen); + GrRectFill(psContext, &sRect); + + // + // Put a white box around the meter. + // + GrContextForegroundSet(psContext, ClrWhite); + GrRectDraw(psContext, &sRect); +} + +//***************************************************************************** +// +// Draw green and red blocks within a graphical meter on the display to +// indicate percentage fullness of some quantity (transmit and receive buffers +// in this case). +// +//***************************************************************************** +void +UpdateBufferMeter(tContext *psContext, uint32_t ui32FullPercent, int32_t i32X, + int32_t i32Y) +{ + tRectangle sRect; + int32_t i32CorrectedY; + int32_t i32XBreak; + + // + // Correct the Y coordinate so that the meter is centered on the same line + // as the text caption to its left and so that we avoid the meter's 1 pixel + // white border. + // + i32CorrectedY = i32Y - ((BUFFER_METER_HEIGHT - TEXT_HEIGHT) / 2) + 1; + + // + // Determine where the break point between full (red) and empty (green) + // sections occurs. + // + i32XBreak = (i32X + 1) + (ui32FullPercent * (BUFFER_METER_WIDTH - 2)) / 100; + + // + // Determine the bounding rectangle of the full section. + // + sRect.i16XMin = i32X + 1; + sRect.i16XMax = i32XBreak; + sRect.i16YMin = i32CorrectedY; + sRect.i16YMax = i32CorrectedY + BUFFER_METER_HEIGHT - 3; + + // + // Fill the full section with red (if there is anything to draw) + // + if(ui32FullPercent) + { + GrContextForegroundSet(psContext, ClrRed); + GrRectFill(psContext, &sRect); + } + + // + // Fill the empty section with green. + // + sRect.i16XMin = i32XBreak; + sRect.i16XMax = i32X + BUFFER_METER_WIDTH - 2; + if(sRect.i16XMax > sRect.i16XMin) + { + GrContextForegroundSet(psContext, ClrGreen); + GrRectFill(psContext, &sRect); + } + + // + // Revert to white for text drawing which may occur later. + // + GrContextForegroundSet(psContext, ClrWhite); + +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to control and setup of the device. +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to perform control-related +// operations on behalf of the USB host. These functions include setting +// and querying the serial communication parameters, setting handshake line +// states and sending break conditions. +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +ControlHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData) +{ + uint32_t ui32IntsOff; + + // + // Which event are we being asked to process? + // + switch(ui32Event) + { + // + // We are connected to a host and communication is now possible. + // + case USB_EVENT_CONNECTED: + g_bUSBConfigured = true; + + // + // Flush our buffers. + // + USBBufferFlush(&g_sTxBuffer); + USBBufferFlush(&g_sRxBuffer); + + // + // Tell the main loop to update the display. + // + ui32IntsOff = ROM_IntMasterDisable(); + g_pcStatus = "Connected"; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + if(!ui32IntsOff) + { + ROM_IntMasterEnable(); + } + break; + + // + // The host has disconnected. + // + case USB_EVENT_DISCONNECTED: + g_bUSBConfigured = false; + ui32IntsOff = ROM_IntMasterDisable(); + g_pcStatus = "Disconnected"; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + if(!ui32IntsOff) + { + ROM_IntMasterEnable(); + } + break; + + // + // Return the current serial communication parameters. + // + case USBD_CDC_EVENT_GET_LINE_CODING: + GetLineCoding(pvMsgData); + break; + + // + // Set the current serial communication parameters. + // + case USBD_CDC_EVENT_SET_LINE_CODING: + SetLineCoding(pvMsgData); + break; + + // + // Set the current serial communication parameters. + // + case USBD_CDC_EVENT_SET_CONTROL_LINE_STATE: + SetControlLineState((uint16_t)ui32MsgValue); + break; + + // + // Send a break condition on the serial line. + // + case USBD_CDC_EVENT_SEND_BREAK: + SendBreak(true); + break; + + // + // Clear the break condition on the serial line. + // + case USBD_CDC_EVENT_CLEAR_BREAK: + SendBreak(false); + break; + + // + // Ignore SUSPEND and RESUME for now. + // + case USB_EVENT_SUSPEND: + case USB_EVENT_RESUME: + break; + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: +#ifdef DEBUG + while(1); +#else + break; +#endif + + } + + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the transmit channel (data to +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event have we been sent? + // + switch(ui32Event) + { + case USB_EVENT_TX_COMPLETE: + // + // Since we are using the USBBuffer, we don't need to do anything + // here. + // + break; + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: +#ifdef DEBUG + while(1); +#else + break; +#endif + + } + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the receive channel (data from +// the USB host). +// +// \param pvCBData is the client-supplied callback data value for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + uint32_t ui32Count; + + // + // Which event are we being sent? + // + switch(ui32Event) + { + // + // A new packet has been received. + // + case USB_EVENT_RX_AVAILABLE: + { + // + // Feed some characters into the UART TX FIFO and enable the + // interrupt so we are told when there is more space. + // + USBUARTPrimeTransmit(USB_UART_BASE); + ROM_UARTIntEnable(USB_UART_BASE, UART_INT_TX); + break; + } + + // + // We are being asked how much unprocessed data we have still to + // process. We return 0 if the UART is currently idle or 1 if it is + // in the process of transmitting something. The actual number of + // bytes in the UART FIFO is not important here, merely whether or + // not everything previously sent to us has been transmitted. + // + case USB_EVENT_DATA_REMAINING: + { + // + // Get the number of bytes in the buffer and add 1 if some data + // still has to clear the transmitter. + // + ui32Count = ROM_UARTBusy(USB_UART_BASE) ? 1 : 0; + return(ui32Count); + } + + // + // We are being asked to provide a buffer into which the next packet + // can be read. We do not support this mode of receiving data so let + // the driver know by returning 0. The CDC driver should not be sending + // this message but this is included just for illustration and + // completeness. + // + case USB_EVENT_REQUEST_BUFFER: + { + return(0); + } + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: +#ifdef DEBUG + while(1); +#else + break; +#endif + } + + return(0); +} + +//***************************************************************************** +// +// This is the main application entry function. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32TxCount; + uint32_t ui32RxCount; + tRectangle sRect; + char pcBuffer[16]; + uint32_t ui32Fullness; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL at 50MHz + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Erratum workaround for silicon revision A1. VBUS must have pull-down. + // + if(CLASS_IS_TM4C123 && REVISION_IS_A1) + { + HWREG(GPIO_PORTB_BASE + GPIO_O_PDR) |= GPIO_PIN_1; + } + + // + // Not configured initially. + // + g_bUSBConfigured = false; + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top 15 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "usb-dev-serial", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + + // + // Show the various static text elements on the color STN display. + // + GrStringDraw(&g_sContext, "Tx #",-1, 0, 12, false); + GrStringDraw(&g_sContext, "Tx buf", -1, 0, 22, false); + GrStringDraw(&g_sContext, "Rx #", -1, 0, 32, false); + GrStringDraw(&g_sContext, "Rx buf", -1, 0, 42, false); + DrawBufferMeter(&g_sContext, 40, 22); + DrawBufferMeter(&g_sContext, 40, 42); + + // + // Enable the UART that we will be redirecting. + // + ROM_SysCtlPeripheralEnable(USB_UART_PERIPH); + + // + // Enable and configure the UART RX and TX pins + // + ROM_SysCtlPeripheralEnable(TX_GPIO_PERIPH); + ROM_SysCtlPeripheralEnable(RX_GPIO_PERIPH); + ROM_GPIOPinTypeUART(TX_GPIO_BASE, TX_GPIO_PIN); + ROM_GPIOPinTypeUART(RX_GPIO_BASE, RX_GPIO_PIN); + + // + // TODO: Add code to configure handshake GPIOs if required. + // + + // + // Set the default UART configuration. + // + ROM_UARTConfigSetExpClk(USB_UART_BASE, ROM_SysCtlClockGet(), + DEFAULT_BIT_RATE, DEFAULT_UART_CONFIG); + ROM_UARTFIFOLevelSet(USB_UART_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8); + + // + // Configure and enable UART interrupts. + // + ROM_UARTIntClear(USB_UART_BASE, ROM_UARTIntStatus(USB_UART_BASE, false)); + ROM_UARTIntEnable(USB_UART_BASE, (UART_INT_OE | UART_INT_BE | UART_INT_PE | + UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX)); + + // + // Enable the system tick. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Tell the user what we are up to. + // + DisplayStatus(&g_sContext, " Configuring... "); + + // + // Initialize the transmit and receive buffers. + // + USBBufferInit(&g_sTxBuffer); + USBBufferInit(&g_sRxBuffer); + + // + // Set the USB stack mode to Device mode with VBUS monitoring. + // + USBStackModeSet(0, eUSBModeDevice, 0); + + // + // Pass our device information to the USB library and place the device + // on the bus. + // + USBDCDCInit(0, &g_sCDCDevice); + + // + // Wait for initial configuration to complete. + // + DisplayStatus(&g_sContext, "Waiting for host"); + + // + // Clear our local byte counters. + // + ui32RxCount = 0; + ui32TxCount = 0; + + // + // Enable interrupts now that the application is ready to start. + // + ROM_IntEnable(USB_UART_INT); + + // + // Main application loop. + // + while(1) + { + + // + // Have we been asked to update the status display? + // + if(g_ui32Flags & COMMAND_STATUS_UPDATE) + { + // + // Clear the command flag + // + ROM_IntMasterDisable(); + g_ui32Flags &= ~COMMAND_STATUS_UPDATE; + ROM_IntMasterEnable(); + + DisplayStatus(&g_sContext, g_pcStatus); + } + + // + // Has there been any transmit traffic since we last checked? + // + if(ui32TxCount != g_ui32UARTTxCount) + { + // + // Take a snapshot of the latest transmit count. + // + ui32TxCount = g_ui32UARTTxCount; + + // + // Update the display of bytes transmitted by the UART. + // + usnprintf(pcBuffer, 16, "%d ", ui32TxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 40, 12, true); + + // + // Update the RX buffer fullness. Remember that the buffers are + // named relative to the USB whereas the status display is from + // the UART's perspective. The USB's receive buffer is the UART's + // transmit buffer. + // + ui32Fullness = ((USBBufferDataAvailable(&g_sRxBuffer) * 100) / + UART_BUFFER_SIZE); + + UpdateBufferMeter(&g_sContext, ui32Fullness, 40, 22); + } + + // + // Has there been any receive traffic since we last checked? + // + if(ui32RxCount != g_ui32UARTRxCount) + { + // + // Take a snapshot of the latest receive count. + // + ui32RxCount = g_ui32UARTRxCount; + + // + // Update the display of bytes received by the UART. + // + usnprintf(pcBuffer, 16, "%d ", ui32RxCount); + GrStringDraw(&g_sContext, pcBuffer, -1, 40, 32, true); + + // + // Update the TX buffer fullness. Remember that the buffers are + // named relative to the USB whereas the status display is from + // the UART's perspective. The USB's transmit buffer is the UART's + // receive buffer. + // + ui32Fullness = ((USBBufferDataAvailable(&g_sTxBuffer) * 100) / + UART_BUFFER_SIZE); + + UpdateBufferMeter(&g_sContext, ui32Fullness, 40, 42); + } + } +} diff --git a/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ewd b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ewp b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ewp new file mode 100644 index 0000000..c3a5d25 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ewp @@ -0,0 +1,805 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_dev_serial.c + + + $PROJ_DIR$\usb_serial_structs.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.icf b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.icf new file mode 100644 index 0000000..273b33d --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_serial.icf - Linker configuration file for usb_dev_serial. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ld b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ld new file mode 100644 index 0000000..a81bd04 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_serial.ld - Linker configuration file for usb_dev_serial. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.sct b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.sct new file mode 100644 index 0000000..7383330 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_serial.sct - Linker configuration file for usb_dev_serial. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.uvopt b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.uvopt new file mode 100644 index 0000000..75fd78c --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.uvopt @@ -0,0 +1,373 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_serial + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_serial.c + usb_dev_serial.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_serial_structs.c + usb_serial_structs.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 10 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.uvproj b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.uvproj new file mode 100644 index 0000000..f0937ec --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial.uvproj @@ -0,0 +1,454 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_serial + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_serial + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_serial.bin .\rvmdk\usb_dev_serial.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_serial.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_dev_serial.c + 1 + .\usb_dev_serial.c + + + usb_serial_structs.c + 1 + .\usb_serial_structs.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial_ccs.cmd b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial_ccs.cmd new file mode 100644 index 0000000..8eed689 --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/usb_dev_serial_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_serial_ccs.cmd - CCS linker configuration file for usb_dev_serial. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/usb_dev_serial/usb_serial_structs.c b/boards/ek-lm4f232/usb_dev_serial/usb_serial_structs.c new file mode 100644 index 0000000..cd1761e --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/usb_serial_structs.c @@ -0,0 +1,215 @@ +//***************************************************************************** +// +// usb_serial_structs.c - Data structures defining this CDC USB device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "usb_serial_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProdectString[] = +{ + 2 + (16 * 2), + USB_DTYPE_STRING, + 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, 'a', 0, 'l', 0, ' ', 0, + 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, 'o', 0, 'r', 0, 't', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + 2 + (8 * 2), + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The control interface description string. +// +//***************************************************************************** +const uint8_t g_pui8ControlInterfaceString[] = +{ + 2 + (21 * 2), + USB_DTYPE_STRING, + 'A', 0, 'C', 0, 'M', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 't', 0, + 'r', 0, 'o', 0, 'l', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, + 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + 2 + (26 * 2), + USB_DTYPE_STRING, + 'S', 0, 'e', 0, 'l', 0, 'f', 0, ' ', 0, 'P', 0, 'o', 0, 'w', 0, + 'e', 0, 'r', 0, 'e', 0, 'd', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, + 'f', 0, 'i', 0, 'g', 0, 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, + 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_pui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProdectString, + g_pui8SerialNumberString, + g_pui8ControlInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_pui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// CDC device callback function prototypes. +// +//***************************************************************************** +uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +uint32_t TxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +uint32_t ControlHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +//***************************************************************************** +// +// The CDC device initialization and customization structures. In this case, +// we are using USBBuffers between the CDC device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the CDC channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our CDC instance structure. +// +//***************************************************************************** +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; + +tUSBDCDCDevice g_sCDCDevice = +{ + USB_VID_TI_1CBE, + USB_PID_SERIAL, + 0, + USB_CONF_ATTR_SELF_PWR, + ControlHandler, + (void *)&g_sCDCDevice, + USBBufferEventCallback, + (void *)&g_sRxBuffer, + USBBufferEventCallback, + (void *)&g_sTxBuffer, + g_pui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; + +//***************************************************************************** +// +// Receive buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pi8USBRxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8RxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sRxBuffer = +{ + false, // This is a receive buffer. + RxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device pointer. + USBDCDCPacketRead, // pfnTransfer + USBDCDCRxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pi8USBRxBuffer, // pi8Buffer + UART_BUFFER_SIZE, // ui32BufferSize + g_pui8RxBufferWorkspace // pvWorkspace +}; + +//***************************************************************************** +// +// Transmit buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pi8USBTxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8TxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sTxBuffer = +{ + true, // This is a transmit buffer. + TxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device pointer. + USBDCDCPacketWrite, // pfnTransfer + USBDCDCTxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pi8USBTxBuffer, // pi8Buffer + UART_BUFFER_SIZE, // ui32BufferSize + g_pui8TxBufferWorkspace // pvWorkspace +}; diff --git a/boards/ek-lm4f232/usb_dev_serial/usb_serial_structs.h b/boards/ek-lm4f232/usb_dev_serial/usb_serial_structs.h new file mode 100644 index 0000000..d8c617a --- /dev/null +++ b/boards/ek-lm4f232/usb_dev_serial/usb_serial_structs.h @@ -0,0 +1,49 @@ +//***************************************************************************** +// +// usb_serial_structs.h - Data structures defining this USB CDC device. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_SERIAL_STRUCTS_H_ +#define _USB_SERIAL_STRUCTS_H_ + +//***************************************************************************** +// +// The size of the transmit and receive buffers used for the redirected UART. +// This number should be a power of 2 for best performance. 256 is chosen +// pretty much at random though the buffer should be at least twice the size of +// a maxmum-sized USB packet. +// +//***************************************************************************** +#define UART_BUFFER_SIZE 256 + +extern uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +extern uint32_t TxHandler(void *pvi32CBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; +extern tUSBDCDCDevice g_sCDCDevice; +extern uint8_t g_pui8USBTxBuffer[]; +extern uint8_t g_pui8USBRxBuffer[]; + +#endif diff --git a/boards/ek-lm4f232/usb_host_audio/Makefile b/boards/ek-lm4f232/usb_host_audio/Makefile new file mode 100644 index 0000000..894d383 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/Makefile @@ -0,0 +1,100 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host audio example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party +IPATH+=../../../../utils + +# +# The default rule, which causes the USB host audio example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_audio.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host audio example. +# +${COMPILER}/usb_host_audio.axf: ${COMPILER}/buttons.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/ff.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/mmc-ek-lm4f232.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/slidemenuwidget.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/usb_host_audio.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/usb_sound.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_host_audio.axf: ${COMPILER}/wavfile.o +${COMPILER}/usb_host_audio.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_audio.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_audio.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_audio.axf: usb_host_audio.ld +SCATTERgcc_usb_host_audio=usb_host_audio.ld +ENTRY_usb_host_audio=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/usb_host_audio/ccs/.ccsimportspec b/boards/ek-lm4f232/usb_host_audio/ccs/.ccsimportspec new file mode 100644 index 0000000..fbf85a1 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_audio/ccs/.ccsproject b/boards/ek-lm4f232/usb_host_audio/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_audio/ccs/.cproject b/boards/ek-lm4f232/usb_host_audio/ccs/.cproject new file mode 100644 index 0000000..9a5cbf7 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/ccs/.cproject @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_audio/ccs/.project b/boards/ek-lm4f232/usb_host_audio/ccs/.project new file mode 100644 index 0000000..ae92495 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/ccs/.project @@ -0,0 +1,90 @@ + + + usb_host_audio + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_audio/startup_ccs.c + + + usb_host_audio.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_audio/usb_host_audio.c + + + usb_host_audio_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_audio/usb_host_audio_ccs.cmd + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + drivers/slidemenuwidget.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/slidemenuwidget.c + + + drivers/usb_sound.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/usb_sound.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + utils/wavfile.c + 1 + SW_ROOT/utils/wavfile.c + + + third_party/fatfs/port/mmc-ek-lm4f232.c + 1 + SW_ROOT/third_party/fatfs/port/mmc-ek-lm4f232.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/usb_host_audio/ccs/Debug/usb_host_audio.bin b/boards/ek-lm4f232/usb_host_audio/ccs/Debug/usb_host_audio.bin new file mode 100644 index 0000000..a5ca953 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_audio/ccs/Debug/usb_host_audio.bin differ diff --git a/boards/ek-lm4f232/usb_host_audio/ccs/Debug/usb_host_audio.out b/boards/ek-lm4f232/usb_host_audio/ccs/Debug/usb_host_audio.out new file mode 100644 index 0000000..209e4fe Binary files /dev/null and b/boards/ek-lm4f232/usb_host_audio/ccs/Debug/usb_host_audio.out differ diff --git a/boards/ek-lm4f232/usb_host_audio/ccs/macros.ini_initial b/boards/ek-lm4f232/usb_host_audio/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/usb_host_audio/ccs/target_config.ccxml b/boards/ek-lm4f232/usb_host_audio/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_audio/ewarm/Exe/usb_host_audio.bin b/boards/ek-lm4f232/usb_host_audio/ewarm/Exe/usb_host_audio.bin new file mode 100644 index 0000000..b71bde8 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_audio/ewarm/Exe/usb_host_audio.bin differ diff --git a/boards/ek-lm4f232/usb_host_audio/ewarm/Exe/usb_host_audio.out b/boards/ek-lm4f232/usb_host_audio/ewarm/Exe/usb_host_audio.out new file mode 100644 index 0000000..dc84279 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_audio/ewarm/Exe/usb_host_audio.out differ diff --git a/boards/ek-lm4f232/usb_host_audio/gcc/usb_host_audio.axf b/boards/ek-lm4f232/usb_host_audio/gcc/usb_host_audio.axf new file mode 100644 index 0000000..7816db2 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_audio/gcc/usb_host_audio.axf differ diff --git a/boards/ek-lm4f232/usb_host_audio/gcc/usb_host_audio.bin b/boards/ek-lm4f232/usb_host_audio/gcc/usb_host_audio.bin new file mode 100644 index 0000000..0e8e4bf Binary files /dev/null and b/boards/ek-lm4f232/usb_host_audio/gcc/usb_host_audio.bin differ diff --git a/boards/ek-lm4f232/usb_host_audio/readme.txt b/boards/ek-lm4f232/usb_host_audio/readme.txt new file mode 100644 index 0000000..408d3b6 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/readme.txt @@ -0,0 +1,32 @@ +USB host audio example application using SD Card FAT file system + + +This example application demonstrates playing .wav files from an SD card +that is formatted with a FAT file system using USB host audio class. The +application will only look in the root directory of the SD card and display +all files that are found. Files can be selected to show their format and +then played if the application determines that they are a valid .wav file. +Only PCM format (uncompressed) files may be played. + +For additional details about FatFs, see the following site: +http://elm-chan.org/fsw/ff/00index_e.html + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/usb_host_audio/rvmdk/usb_host_audio.axf b/boards/ek-lm4f232/usb_host_audio/rvmdk/usb_host_audio.axf new file mode 100644 index 0000000..4b3d1de Binary files /dev/null and b/boards/ek-lm4f232/usb_host_audio/rvmdk/usb_host_audio.axf differ diff --git a/boards/ek-lm4f232/usb_host_audio/rvmdk/usb_host_audio.bin b/boards/ek-lm4f232/usb_host_audio/rvmdk/usb_host_audio.bin new file mode 100644 index 0000000..37e5857 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_audio/rvmdk/usb_host_audio.bin differ diff --git a/boards/ek-lm4f232/usb_host_audio/startup_ccs.c b/boards/ek-lm4f232/usb_host_audio/startup_ccs.c new file mode 100644 index 0000000..df90457 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_audio/startup_ewarm.c b/boards/ek-lm4f232/usb_host_audio/startup_ewarm.c new file mode 100644 index 0000000..511a2a8 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_audio/startup_gcc.c b/boards/ek-lm4f232/usb_host_audio/startup_gcc.c new file mode 100644 index 0000000..f4fcc5e --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_audio/startup_rvmdk.S b/boards/ek-lm4f232/usb_host_audio/startup_rvmdk.S new file mode 100644 index 0000000..daba879 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/usb_host_audio/usb_host_audio.c b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.c new file mode 100644 index 0000000..a54ad8c --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.c @@ -0,0 +1,1987 @@ +//***************************************************************************** +// +// usb_host_audio.c - Main routine for the USB host audio example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_ints.h" +#include "driverlib/flash.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "driverlib/systick.h" +#include "driverlib/pin_map.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "grlib/canvas.h" +#include "grlib/slider.h" +#include "grlib/listbox.h" +#include "grlib/pushbutton.h" +#include "utils/ustdlib.h" +#include "third_party/fatfs/src/ff.h" +#include "third_party/fatfs/src/diskio.h" +#include "drivers/usb_sound.h" +#include "utils/wavfile.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" +#include "drivers/slidemenuwidget.h" +#include "usblib/usblib.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB host audio example application using SD Card FAT file system +//! (usb_host_audio)

      +//! +//! This example application demonstrates playing .wav files from an SD card +//! that is formatted with a FAT file system using USB host audio class. The +//! application will only look in the root directory of the SD card and display +//! all files that are found. Files can be selected to show their format and +//! then played if the application determines that they are a valid .wav file. +//! Only PCM format (uncompressed) files may be played. +//! +//! For additional details about FatFs, see the following site: +//! http://elm-chan.org/fsw/ff/00index_e.html +// +//***************************************************************************** + +//***************************************************************************** +// +// Our running system tick counter and a global used to determine the time +// elapsed since last call to GetTickms(). +// +//***************************************************************************** +static uint32_t g_ui32SysTickCount; +static uint32_t g_ui32LastTick; +static uint32_t GetTickms(void); + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static DIR g_sDirObject; +static FILINFO g_sFileInfo; + +//***************************************************************************** +// +// A structure that holds a mapping between an FRESULT numerical code, +// and a string representation. FRESULT codes are returned from the FatFs +// FAT file system driver. +// +//***************************************************************************** +typedef struct +{ + FRESULT fresult; + char *pcResultStr; +} +tFresultString; + +//***************************************************************************** +// +// A macro to make it easy to add result codes to the table. +// +//***************************************************************************** +#define FRESULT_ENTRY(f) { (f), (#f) } + +//***************************************************************************** +// +// A table that holds a mapping between the numerical FRESULT code and +// it's name as a string. This is used for looking up error codes and +// providing a human-readable string. +// +//***************************************************************************** +tFresultString g_sFresultStrings[] = +{ + FRESULT_ENTRY(FR_OK), + FRESULT_ENTRY(FR_DISK_ERR), + FRESULT_ENTRY(FR_INT_ERR), + FRESULT_ENTRY(FR_NOT_READY), + FRESULT_ENTRY(FR_NO_FILE), + FRESULT_ENTRY(FR_NO_PATH), + FRESULT_ENTRY(FR_INVALID_NAME), + FRESULT_ENTRY(FR_DENIED), + FRESULT_ENTRY(FR_EXIST), + FRESULT_ENTRY(FR_INVALID_OBJECT), + FRESULT_ENTRY(FR_WRITE_PROTECTED), + FRESULT_ENTRY(FR_INVALID_DRIVE), + FRESULT_ENTRY(FR_NOT_ENABLED), + FRESULT_ENTRY(FR_NO_FILESYSTEM), + FRESULT_ENTRY(FR_MKFS_ABORTED), + FRESULT_ENTRY(FR_TIMEOUT), + FRESULT_ENTRY(FR_LOCKED), + FRESULT_ENTRY(FR_NOT_ENOUGH_CORE), + FRESULT_ENTRY(FR_TOO_MANY_OPEN_FILES), + FRESULT_ENTRY(FR_INVALID_PARAMETER), +}; + +//***************************************************************************** +// +// A macro that holds the number of result codes. +// +//***************************************************************************** +#define NUM_FRESULT_CODES (sizeof(g_sFresultStrings) / sizeof(tFresultString)) + +//***************************************************************************** +// +// Error reasons returned by ChangeToDirectory(). +// +//***************************************************************************** +#define NAME_TOO_LONG_ERROR 1 +#define OPENDIR_ERROR 2 + +//***************************************************************************** +// +// Define a pair of buffers that are used for holding path information. +// The buffer size must be large enough to hold the longest expected +// full path name, including the file name, and a trailing null character. +// The initial path is set to root "/". +// +//***************************************************************************** +#define PATH_BUF_SIZE 80 +static char g_pcCwdBuf[PATH_BUF_SIZE] = "/"; +static char g_pcTmpBuf[PATH_BUF_SIZE]; + +//***************************************************************************** +// +// A set of string pointers that are used for showing status on the display. +// Five lines of text are accommodated, which is the reasonable limit for +// this display. +// +//***************************************************************************** +static char *g_pcStatusLines[5]; + +//***************************************************************************** +// +// A variable to track the current level in the directory tree. The root +// level is level 0. +// +//***************************************************************************** +static uint32_t g_ui32Level; + +//***************************************************************************** +// +// A variable to track the current level in the directory tree. The root +// level is level 0. +// +//***************************************************************************** +static uint32_t g_ui32Level; + +//***************************************************************************** +// +// Declare a pair of off-screen buffers and associated display structures. +// These are used by the slide menu widget for animated menu effects. +// +//***************************************************************************** +#define OFFSCREEN_BUF_SIZE GrOffScreen4BPPSize(96, 40) +static uint8_t g_pui8OffscreenBufA[OFFSCREEN_BUF_SIZE]; +static uint8_t g_pui8OffscreenBufB[OFFSCREEN_BUF_SIZE]; +static tDisplay g_sOffscreenDisplayA; +static tDisplay g_sOffscreenDisplayB; + +//***************************************************************************** +// +// Create a palette that is used by the on-screen menus and anything else that +// uses the (above) off-screen buffers. This palette should contain any +// colors that are used by any widget using the offscreen buffers. There can +// be up to 16 colors in this palette. +// +//***************************************************************************** +static uint32_t g_pui32Palette[] = +{ + ClrBlack, + ClrWhite, + ClrDarkBlue, + ClrLightBlue, + ClrRed, + ClrDarkGreen, + ClrYellow, + ClrBlue +}; +#define NUM_PALETTE_ENTRIES (sizeof(g_pui32Palette) / sizeof(uint32_t)) + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / TICKS_PER_SECOND) + +//***************************************************************************** +// +// Audio buffering definitions, these are optimized to deal with USB audio. +// AUDIO_TRANSFER_SIZE define one frame of audio at 48000 Stereo 16 bit +// and AUDIO_BUFFERS declares 16 frames(16ms) of audio buffering. +// +//***************************************************************************** +#define AUDIO_TRANSFER_SIZE (192) +#define AUDIO_BUFFERS (16) +#define AUDIO_BUFFER_SIZE (AUDIO_TRANSFER_SIZE * AUDIO_BUFFERS) +uint32_t g_ui32TransferSize; +uint32_t g_ui32BufferSize; + +//***************************************************************************** +// +// The main audio buffer and it's pointers. +// +//***************************************************************************** +uint8_t g_pui8AudioBuffer[AUDIO_BUFFER_SIZE]; +uint8_t *g_pui8Read; +uint8_t *g_pui8Write; +uint32_t g_ui32ValidBytes; + +//***************************************************************************** +// +// Holds global flags for the system. +// +//***************************************************************************** +uint32_t g_ui32Flags = 0; + +// +// Currently streaming audio to the USB device. +// +#define FLAGS_PLAYING 1 + +// +// The last transfer has competed so a new one can be started. +// +#define FLAGS_TX_COMPLETE 2 + +// +// New audio device present. +// +#define FLAGS_DEVICE_CONNECT 3 + +// +// New audio device present. +// +#define FLAGS_DEVICE_READY 4 + +// +// Play Screen is being displayed +// +#define FLAGS_PLAY_SCREEN 5 + +//***************************************************************************** +// +// These are the global .wav file states used by the application. +// +//***************************************************************************** +tWavFile g_sWavFile; +tWavHeader g_sWavHeader; + +//***************************************************************************** +// +// Define the maximum number of files that can appear at any directory level. +// This is used for allocating space for holding the file information. +// Define the maximum depth of subdirectories, also used to allocating space +// for directory structures. +// Define the maximum number of characters allowed to be stored for a file +// name. +// +//***************************************************************************** +#define MAX_FILES_PER_MENU 64 +#define MAX_SUBDIR_DEPTH 32 +#define MAX_FILENAME_STRING_LEN 16 + +//***************************************************************************** +// +// Widget definitions +// +//***************************************************************************** + +//***************************************************************************** +// +// Declare a set of menu items and matching strings that are used to hold +// file information. There are two alternating sets. Two are needed because +// the file information must be retained for the current directory, and the +// new directory (up or down the tree). +// +//***************************************************************************** +static char g_pcFileNames[2][MAX_FILES_PER_MENU][MAX_FILENAME_STRING_LEN]; +static tSlideMenuItem g_psFileMenuItems[2][MAX_FILES_PER_MENU]; + +//***************************************************************************** +// +// Declare a set of menus, one for each level of directory. +// +//***************************************************************************** +static tSlideMenu g_psFileMenus[MAX_SUBDIR_DEPTH]; + +//***************************************************************************** +// +// Define the slide menu widget. This is the wigdet that is used for +// displaying the file information. +// +//***************************************************************************** +SlideMenu(g_sFileMenuWidget, WIDGET_ROOT, 0, 0, &g_sCFAL96x64x16, 0, 12, 96, 40, + &g_sOffscreenDisplayA, &g_sOffscreenDisplayB, 16, + ClrWhite, ClrRed, ClrBlack, &g_sFontFixed6x8, &g_psFileMenus[0], + 0); + +//***************************************************************************** +// +// The canvas widgets for the wav file information. +// +//***************************************************************************** +extern tCanvasWidget g_sWaveInfoBackground; + +char g_pcVolume[16] = ""; +Canvas(g_sWaveInfoVolume, &g_sWaveInfoBackground, 0, 0, + &g_sCFAL96x64x16, 0, 42, 96, 10, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE, ClrRed, ClrWhite, ClrWhite, g_psFontFixed6x8, + g_pcVolume, 0, 0); + +char g_pcTime[16] = ""; +Canvas(g_sWaveInfoTime, &g_sWaveInfoBackground, &g_sWaveInfoVolume, 0, + &g_sCFAL96x64x16, 0, 32, 96, 10, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE, ClrRed, ClrWhite, ClrWhite, g_psFontFixed6x8, + g_pcTime, 0, 0); + +char g_pcFormat[16] = ""; +Canvas(g_sWaveInfoSample, &g_sWaveInfoBackground, &g_sWaveInfoTime, 0, + &g_sCFAL96x64x16, 0, 22, 96, 10, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | + CANVAS_STYLE_TEXT_OPAQUE, ClrRed, ClrWhite, ClrWhite, g_psFontFixed6x8, + g_pcFormat, 0, 0); + +char g_pcFileName[16] = ""; +Canvas(g_sWaveInfoFileName, &g_sWaveInfoBackground, &g_sWaveInfoSample, 0, + &g_sCFAL96x64x16, 0, 12, 96, 10, + CANVAS_STYLE_FILL | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_OPAQUE, + ClrRed, ClrWhite, ClrWhite, g_psFontFixed6x8, + g_pcFileName, 0, 0); + +#define INITIAL_VOLUME_PERCENT 20 +uint32_t g_ui32CurrentVolume; + +//***************************************************************************** +// +// The canvas widget acting as the background for the wav file information. +// +//***************************************************************************** +Canvas(g_sWaveInfoBackground, WIDGET_ROOT, 0, + &g_sWaveInfoFileName, &g_sCFAL96x64x16, 0, 12, 96, 40, + CANVAS_STYLE_OUTLINE | CANVAS_STYLE_FILL, ClrBlack, ClrWhite, ClrWhite, + g_psFontFixed6x8, 0, 0, 0); + +//***************************************************************************** +// +// The status line. +// +//***************************************************************************** +#define STATUS_TEXT_SIZE 40 +char g_pcStatusText[STATUS_TEXT_SIZE] = ""; +Canvas(g_sStatus, WIDGET_ROOT, 0, 0, + &g_sCFAL96x64x16, 0, 64 - 12, 96, 12, + (CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT), + ClrDarkBlue, ClrWhite, ClrWhite, g_psFontFixed6x8, g_pcStatusText, 0, 0); + +//***************************************************************************** +// +// The heading containing the application title. +// +//***************************************************************************** +Canvas(g_sHeading, WIDGET_ROOT, 0, 0, + &g_sCFAL96x64x16, 0, 0, 96, 12, + (CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT), + ClrDarkBlue, ClrWhite, ClrWhite, g_psFontFixed6x8, "usb-host-audio", 0, 0); + +//***************************************************************************** +// +// State information for keep track of time. +// +//***************************************************************************** +static uint32_t g_ui32BytesPlayed; +static uint32_t g_ui32NextUpdate; + +//***************************************************************************** +// +// Globals used to track play back position. +// +//***************************************************************************** +static uint16_t g_ui16Minutes; +static uint16_t g_ui16Seconds; + +//***************************************************************************** +// +// Fill the audio buffer with data from the open file. +// +//***************************************************************************** +void +FillAudioBuffer(void) +{ + uint32_t ui32Count, ui32Size; + uint8_t *pui8Read; + + // + // If already full return. + // + if(g_ui32ValidBytes == g_ui32BufferSize) + { + return; + } + + // + // Snap shot the read pointer since it might change while we are filling + // the buffer. If the read pointer moved due to an interrupt we will + // get the update on the next call to this function. + // + pui8Read = g_pui8Read; + + // + // If write is ahead of read then fill to the end of the buffer if + // possible. + // + if(pui8Read <= g_pui8Write) + { + // + // Calculate the amount of space we have. + // + ui32Size = g_ui32BufferSize - + (uint32_t)(g_pui8Write - g_pui8AudioBuffer); + ui32Count = WavRead(&g_sWavFile, g_pui8Write, ui32Size); + + g_pui8Write += ui32Count; + g_ui32ValidBytes += ui32Count; + + if(g_pui8Write == (g_pui8AudioBuffer + g_ui32BufferSize)) + { + g_pui8Write = g_pui8AudioBuffer; + } + } + + // + // If read is now ahead of write then fill to the read pointer. + // + if(pui8Read > g_pui8Write) + { + // + // Calculate the amount of space we have. + // + ui32Size = (uint32_t)(pui8Read - g_pui8Write); + ui32Count = WavRead(&g_sWavFile, g_pui8Write, ui32Size); + + g_pui8Write += ui32Count; + g_ui32ValidBytes += ui32Count; + } +} + +//***************************************************************************** +// +// This function handles the callback from the USB audio device when a buffer +// has been played or a new buffer has been received. +// +//***************************************************************************** +static void +USBAudioOutCallback(void *pvBuffer, uint32_t ui32Event) +{ + // + // If a buffer has been played then schedule a new one to play. + // + if((ui32Event == USB_EVENT_TX_COMPLETE) && + (HWREGBITW(&g_ui32Flags, FLAGS_PLAYING))) + { + // + // Indicate that a transfer was complete so that the non-interrupt + // code can read in more data from the file. + // + HWREGBITW(&g_ui32Flags, FLAGS_TX_COMPLETE) = 1; + + // + // Increment the read pointer. + // + g_pui8Read += g_ui32TransferSize; + + // + // Remove the specified number of bytes from the buffer. + // + if(g_ui32ValidBytes > g_ui32TransferSize) + { + g_ui32ValidBytes -= g_ui32TransferSize; + } + else + { + g_ui32ValidBytes = 0; + } + + // + // Wrap the read pointer if necessary. + // + if(g_pui8Read >= (g_pui8AudioBuffer + g_ui32BufferSize)) + { + g_pui8Read = g_pui8AudioBuffer; + } + + // + // Increment the number of bytes that have been played. + // + g_ui32BytesPlayed += g_ui32TransferSize; + + // + // Schedule a new USB audio buffer to be transmitted to the USB + // audio device. + // + USBSoundBufferOut(g_pui8Read, g_ui32TransferSize, USBAudioOutCallback); + } +} + +//***************************************************************************** +// +// This function is used to update the current volume being using for play +// back. +// +//***************************************************************************** +static void +DisplayVolume(void) +{ + // + // Print the volume string in the format Volume dd% + // + usprintf(g_pcVolume, "Volume %0d%%", g_ui32CurrentVolume); + + // + // Display the updated time on the screen. + // + WidgetPaint((tWidget *)&g_sWaveInfoVolume); +} + +//***************************************************************************** +// +// This function is used to tell when to update the play back times for a file. +// It will only update the screen at 1 second intervals but can be called more +// often with no result. +// +//***************************************************************************** +static void +DisplayTime(uint32_t ui32ForceUpdate) +{ + uint32_t ui32Seconds; + uint32_t ui32Minutes; + + // + // Only display on the screen once per second. + // + if((g_ui32BytesPlayed >= g_ui32NextUpdate) || (ui32ForceUpdate != 0)) + { + // + // Set the next update time to one second later. + // + g_ui32NextUpdate = g_ui32BytesPlayed + g_sWavHeader.ui32AvgByteRate; + + // + // Calculate the integer number of minutes and seconds. + // + ui32Seconds = g_ui32BytesPlayed / g_sWavHeader.ui32AvgByteRate; + ui32Minutes = ui32Seconds / 60; + ui32Seconds -= ui32Minutes * 60; + + // + // Print the time string in the format mm.ss/mm.ss + // + usprintf(g_pcTime, "%2d:%02d/%d:%02d", ui32Minutes,ui32Seconds, + g_ui16Minutes, g_ui16Seconds); + + // + // Display the updated time on the screen. + // + WidgetPaint((tWidget *)&g_sWaveInfoTime); + } +} + +//***************************************************************************** +// +// This function will handle stopping the play back of audio. It will not do +// this immediately but will defer stopping audio at a later time. This allows +// this function to be called from an interrupt handler. +// +//***************************************************************************** +static void +WaveStop(void) +{ + uint32_t ui32Idx; + uint32_t *pui32Buffer; + + // + // Stop playing audio. + // + HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) = 0; + + // + // Do unsigned long accesses to clear out the buffer. + // + pui32Buffer = (uint32_t *)g_pui8AudioBuffer; + + // + // Zero out the buffer. + // + for(ui32Idx = 0; ui32Idx < (AUDIO_BUFFER_SIZE >> 2); ui32Idx++) + { + pui32Buffer[ui32Idx] = 0; + } + + // + // Reset the number of bytes played and for a time update on the screen. + // + g_ui32BytesPlayed = 0; + DisplayTime(1); + + // + // Change the status text on the button to Stopped. + // + strcpy(g_pcStatusText, "Stopped"); + WidgetPaint((tWidget *)&g_sStatus); +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. FatFs requires a +// timer tick every 10ms for internal timing purposes. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Increment the system tick count. + // + g_ui32SysTickCount++; + + // + // Call the FatFs tick timer. + // + disk_timerproc(); +} + +//***************************************************************************** +// +// This function returns the number of ticks since the last time this function +// was called. +// +//***************************************************************************** +static uint32_t +GetTickms(void) +{ + uint32_t ui32RetVal; + uint32_t ui32Saved; + + ui32RetVal = g_ui32SysTickCount; + ui32Saved = ui32RetVal; + + if(ui32Saved > g_ui32LastTick) + { + ui32RetVal = ui32Saved - g_ui32LastTick; + } + else + { + ui32RetVal = g_ui32LastTick - ui32Saved; + } + + // + // This could miss a few milliseconds but the timings here are on a + // much larger scale. + // + g_ui32LastTick = ui32Saved; + + // + // Return the number of milliseconds since the last time this was called. + // + return(ui32RetVal * MS_PER_SYSTICK); +} + +//***************************************************************************** +// +// This function returns a string representation of an error code +// that was returned from a function call to FatFs. It can be used +// for printing human readable error messages. +// +//***************************************************************************** +static const char * +StringFromFresult(FRESULT fresult) +{ + uint32_t ui32Idx; + + // + // Enter a loop to search the error code table for a matching + // error code. + // + for(ui32Idx = 0; ui32Idx < NUM_FRESULT_CODES; ui32Idx++) + { + // + // If a match is found, then return the string name of the + // error code. + // + if(g_sFresultStrings[ui32Idx].fresult == fresult) + { + return(g_sFresultStrings[ui32Idx].pcResultStr); + } + } + + // + // At this point no matching code was found, so return a + // string indicating unknown error. + // + return("UNKNOWN ERR"); +} + +//***************************************************************************** +// +// This function shows a status screen. It draws a banner at the top of the +// screen with the name of the application, and then up to 5 lines of text +// in the remaining screen area. The caller specifies a pointer to a set of +// strings, and the count of number of lines of text (up to 5). This +// function attempts to vertically center the strings on the display. +// +//***************************************************************************** +static void +ShowStatusScreen(char *pcStatus[], uint32_t ui32Count) +{ + tContext sContext; + tRectangle sRect; + uint32_t ui32Idx; + int32_t i32Y; + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the rest of the display with black, to clear whatever was there + // before. + // + sRect.i16XMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMin = 12; + sRect.i16YMax = 63 - 12; + GrContextForegroundSet(&sContext, ClrBlack); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Cap the max number of status lines to 4 + // + ui32Count = (ui32Count > 4) ? 4 : ui32Count; + + // + // Compute the starting Y coordinate based on the number of lines. + // + i32Y = 36 - (ui32Count * 5); + + // + // Display the status lines + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + for(ui32Idx = 0; ui32Idx < ui32Count; ui32Idx++) + { + GrStringDrawCentered(&sContext, pcStatus[ui32Idx], -1, + GrContextDpyWidthGet(&sContext) / 2, i32Y, 0); + i32Y += 10; + } +} + +//***************************************************************************** +// +// Initializes the file system module. +// +// \param None. +// +// This function initializes the third party FAT implementation. +// +// \return Returns \e true on success or \e false on failure. +// +//***************************************************************************** +static bool +FileInit(void) +{ + // + // Mount the file system, using logical disk 0. + // + if(f_mount(0, &g_sFatFs) != FR_OK) + { + return(false); + } + return(true); +} + +//***************************************************************************** +// +// This function handled global level events for the USB host audio. This +// function was passed into the USBSoundInit() function. +// +//***************************************************************************** +static void +AudioEvent(uint32_t ui32Event, uint32_t ui32Param) +{ + switch(ui32Event) + { + case SOUND_EVENT_READY: + { + // + // Flag that a new audio device is present. + // + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 1; + + // + // Change the text to reflect the change. + // + strcpy(g_pcStatusText, "Ready"); + WidgetPaint((tWidget *)&g_sStatus); + + break; + } + case SOUND_EVENT_DISCONNECT: + { + // + // Device is no longer present. + // + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_READY) = 0; + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 0; + HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) = 0; + HWREGBITW(&g_ui32Flags, FLAGS_PLAY_SCREEN) = 0; + + // + // Change the text to reflect the change. + // + strcpy(g_pcStatusText, "No Device"); + WidgetPaint((tWidget *)&g_sStatus); + + // + // Display the SD card found message again. This + // should replace the slide menu. + // + g_pcStatusLines[0] = "SD Card Found"; + ShowStatusScreen(g_pcStatusLines, 1); + + break; + } + case SOUND_EVENT_UNKNOWN_DEV: + { + if(ui32Param == 1) + { + // + // Unknown device connected. + // + strcpy(g_pcStatusText, "Unknown Device"); + WidgetPaint((tWidget *)&g_sStatus); + } + else + { + // + // Unknown device disconnected. + // + strcpy(g_pcStatusText, "No Device"); + WidgetPaint((tWidget *)&g_sStatus); + } + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} + +#endif + +//***************************************************************************** +// +// This function is called to read the contents of the current directory from +// the USB stick and populate a set of menu items, one for each file in the +// directory. A subdirectory within the directory counts as a file item. +// +// This function returns the number of file items that were found, or 0 if +// there is any error detected. +// +//***************************************************************************** +static uint32_t +PopulateFileList(uint32_t ui32Level) +{ + uint32_t ui32ItemCount; + FRESULT fresult; + + // + // Open the current directory for access. + // + fresult = f_opendir(&g_sDirObject, g_pcCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(fresult != FR_OK) + { + // + // Ensure that the error is reported. + // + g_pcStatusLines[0] = "Error from"; + g_pcStatusLines[1] = "SD Card"; + g_pcStatusLines[2] = (char *)StringFromFresult(fresult); + ShowStatusScreen(g_pcStatusLines, 3); + return(0); + } + + // + // Initialize the count of files in this directory + // + ui32ItemCount = 0; + + // + // Enter loop to enumerate through all directory entries. + // + for(;;) + { + // + // Read an entry from the directory. + // + fresult = f_readdir(&g_sDirObject, &g_sFileInfo); + + // + // Check for error and return if there is a problem. + // + if(fresult != FR_OK) + { + g_pcStatusLines[0] = "Error from"; + g_pcStatusLines[1] = "USB disk"; + g_pcStatusLines[2] = (char *)StringFromFresult(fresult); + ShowStatusScreen(g_pcStatusLines, 3); + return(0); + } + + // + // If the file name is blank, then this is the end of the + // listing. + // + if(!g_sFileInfo.fname[0]) + { + break; + } + + // + // Add the information to a menu item + // + if(ui32ItemCount < MAX_FILES_PER_MENU) + { + tSlideMenuItem *psMenuItem; + + // + // Get a pointer to the current menu item. Use the directory + // level to determine which of the two sets of menu items to use. + // (ui32Level & 1]. This lets us alternate between the current + // set of menu items and the new set (up or down the tree). + // + psMenuItem = &g_psFileMenuItems[ui32Level & 1][ui32ItemCount]; + + // + // Add the file name to the menu item + // + usnprintf(g_pcFileNames[ui32Level & 1][ui32ItemCount], + MAX_FILENAME_STRING_LEN, "%s", g_sFileInfo.fname); + psMenuItem->pcText = g_pcFileNames[ui32Level & 1][ui32ItemCount]; + + // + // If this is a directory, then add the next level menu so that + // when displayed it will be showed with a submenu option + // (next level down in directory tree). Otherwise it is a file + // so clear the child menu so that there is no submenu option + // shown. + // + psMenuItem->psChildMenu = (g_sFileInfo.fattrib & AM_DIR) ? + &g_psFileMenus[ui32Level + 1] : 0; + + // + // Move to the next entry in the item array we use to populate the + // list box. + // + ui32ItemCount++; + } + } + + // + // Made it to here, return the count of files that were populated. + // + return(ui32ItemCount); +} + +//***************************************************************************** +// +// This function is used to change to a new directory in the file system. +// It takes a parameter that specifies the directory to make the current +// working directory. +// Path separators must use a forward slash "/". The directory parameter +// can be one of the following: +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so dont try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory +// to make sure it exists. If the new path is opened successfully, then +// the current working directory (cwd) is changed to the new path. +// +// In cases of error, the pui32Reason parameter will be written with one of +// the following values: +// +// NAME_TOO_LONG_ERROR - combination of paths are too long for the buffer +// OPENDIR_ERROR - there is some problem opening the new directory +// +//***************************************************************************** +static FRESULT +ChangeToDirectory(char *pcDirectory, uint32_t *pui32Reason) +{ + uint32_t ui32Idx; + FRESULT fresult; + + // + // Copy the current working path into a temporary buffer so + // it can be manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If the first character is /, then this is a fully specified + // path, and it should just be used as-is. + // + if(pcDirectory[0] == '/') + { + // + // Make sure the new path is not bigger than the cwd buffer. + // + if(strlen(pcDirectory) + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_OK); + } + + // + // If the new path name (in argv[1]) is not too long, then + // copy it into the temporary buffer so it can be checked. + // + else + { + strncpy(g_pcTmpBuf, pcDirectory, sizeof(g_pcTmpBuf)); + } + } + + // + // If the argument is .. then attempt to remove the lowest level + // on the CWD. + // + else if(!strcmp(pcDirectory, "..")) + { + // + // Get the index to the last character in the current path. + // + ui32Idx = strlen(g_pcTmpBuf) - 1; + + // + // Back up from the end of the path name until a separator (/) + // is found, or until we bump up to the start of the path. + // + while((g_pcTmpBuf[ui32Idx] != '/') && (ui32Idx > 1)) + { + // + // Back up one character. + // + ui32Idx--; + } + + // + // Now we are either at the lowest level separator in the + // current path, or at the beginning of the string (root). + // So set the new end of string here, effectively removing + // that last part of the path. + // + g_pcTmpBuf[ui32Idx] = 0; + } + + // + // Otherwise this is just a normal path name from the current + // directory, and it needs to be appended to the current path. + // + else + { + // + // Test to make sure that when the new additional path is + // added on to the current path, there is room in the buffer + // for the full new path. It needs to include a new separator, + // and a trailing null character. + // + if(strlen(g_pcTmpBuf) + strlen(pcDirectory) + 1 + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_INVALID_OBJECT); + } + + // + // The new path is okay, so add the separator and then append + // the new directory to the path. + // + else + { + // + // If not already at the root level, then append a / + // + if(strcmp(g_pcTmpBuf, "/")) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Append the new directory to the path. + // + strcat(g_pcTmpBuf, pcDirectory); + } + } + + // + // At this point, a candidate new directory path is in g_pcTmpBuf. + // Try to open it to make sure it is valid. + // + fresult = f_opendir(&g_sDirObject, g_pcTmpBuf); + + // + // If it can't be opened, then it is a bad path. Return an error. + // + if(fresult != FR_OK) + { + *pui32Reason = OPENDIR_ERROR; + return(fresult); + } + + // + // Otherwise, it is a valid new path, so copy it into the CWD. + // + else + { + strncpy(g_pcCwdBuf, g_pcTmpBuf, sizeof(g_pcCwdBuf)); + } + + // + // Return success. + // + return(FR_OK); +} + +//***************************************************************************** +// +// Sends a button/key press message to the slide menu widget that is showing +// files. +// +//***************************************************************************** +static void +SendWidgetKeyMessage(uint32_t ui32Msg) +{ + WidgetMessageQueueAdd(WIDGET_ROOT, + ui32Msg, (uint32_t)&g_sFileMenuWidget, 0, 1, 1); +} + +//***************************************************************************** +// +// This function performs actions that are common whenever the directory +// level is changed up or down. It populates the correct menu structure with +// the list of files in the directory. +// +//***************************************************************************** +static bool +ProcessDirChange(char *pcDir, uint32_t ui32Level) +{ + FRESULT fresult; + uint32_t ui32Reason; + uint32_t ui32FileCount; + + // + // Attempt to change to the new directory. + // + fresult = ChangeToDirectory(pcDir, &ui32Reason); + + // + // If the directory change was successful, populate the + // list of files for the new subdirectory. + // + if((fresult == FR_OK) && (ui32Level < MAX_SUBDIR_DEPTH)) + { + // + // Get a pointer to the current menu for this CWD. + // + tSlideMenu *psMenu = &g_psFileMenus[ui32Level]; + + // + // Populate the menu items with the file list for the new CWD. + // + ui32FileCount = PopulateFileList(ui32Level); + + // + // Initialize the file menu with the list of menu items, + // which are just files and dirs in the root directory + // + psMenu->psSlideMenuItems = g_psFileMenuItems[ui32Level & 1]; + psMenu->ui32Items = ui32FileCount; + + // + // Set the parent directory, if there is one. If at level 0 + // (CWD is root), then there is no parent directory. + // + if(ui32Level) + { + psMenu->psParent = &g_psFileMenus[ui32Level - 1]; + } + else + { + psMenu->psParent = 0; + } + + // + // If we are descending into a new subdir, then initialize the other + // menu item fields to default values. + // + if(ui32Level > g_ui32Level) + { + psMenu->ui32CenterIndex = 0; + psMenu->ui32FocusIndex = 0; + psMenu->bMultiSelectable = 0; + } + + // + // Return a success indication + // + return(true); + } + + // + // Directory change was not successful + // + else + { + // + // Return failure indication + // + return(false); + } +} + +//***************************************************************************** +// +// The program main function. It performs initialization, then handles wav +// file playback. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Temp; + uint32_t ui32Retcode; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(SysCtlClockGet() / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the buttons driver. + // + ButtonsInit(); + + // + // Initialize two offscreen displays and assign the palette. These + // buffers are used by the slide menu widget to allow animation effects. + // + GrOffScreen4BPPInit(&g_sOffscreenDisplayA, g_pui8OffscreenBufA, 96, 40); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayA, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + GrOffScreen4BPPInit(&g_sOffscreenDisplayB, g_pui8OffscreenBufB, 96, 40); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayB, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sHeading); + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sStatus); + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sFileMenuWidget); + + // + // Initialize the status text. + // + strcpy(g_pcStatusText, "No Device"); + + // + // Issue the initial paint request to the widgets then immediately call + // the widget manager to process the paint message. This ensures that the + // display is drawn as quickly as possible and saves the delay we would + // otherwise experience if we processed the paint message after mounting + // and reading the SD card. + // + WidgetPaint(WIDGET_ROOT); + WidgetMessageQueueProcess(); + + // + // Determine whether or not an SD Card is installed. If not, print a + // warning and have the user install one and restart. + // + ui32Retcode = disk_initialize(0); + + if(ui32Retcode != RES_OK) + { + g_pcStatusLines[0] = "No SD Card Found"; + g_pcStatusLines[1] = "Please insert"; + g_pcStatusLines[2] = "a card and"; + g_pcStatusLines[3] = "reset the board."; + ShowStatusScreen(g_pcStatusLines, 4); + return (1); + } + else + { + g_pcStatusLines[0] = "SD Card Found"; + ShowStatusScreen(g_pcStatusLines, 1); + + // + // Mount the file system, using logical disk 0. + // + f_mount(0, &g_sFatFs); + if(!FileInit()) + { + return(1); + } + } + + // + // Not playing anything right now. + // + g_ui32Flags = 0; + g_ui32SysTickCount = 0; + g_ui32LastTick = 0; + g_ui32CurrentVolume = INITIAL_VOLUME_PERCENT; + + // + // Configure the USB host output. + // + USBSoundInit(0, AudioEvent); + + // + // Enter an (almost) infinite loop for reading and processing commands from + // the user. + // + while(1) + { + uint32_t ui32LastTickCount = 0; + + // + // On connect change the device state to ready. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT)) + { + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_CONNECT) = 0; + + // + // Getting here means the device is ready. + // Reset the CWD to the root directory. + // + g_pcCwdBuf[0] = '/'; + g_pcCwdBuf[1] = 0; + + // + // Set the initial directory level to the root + // + g_ui32Level = 0; + + // + // We need to reset the indexes of the root menu to 0, so that + // it will start at the top of the file list, and reset the + // slide menu widget to start with the root menu. + // + g_psFileMenus[g_ui32Level].ui32CenterIndex = 0; + g_psFileMenus[g_ui32Level].ui32FocusIndex = 0; + SlideMenuMenuSet(&g_sFileMenuWidget, &g_psFileMenus[g_ui32Level]); + + // + // Initiate a directory change to the root. This will + // populate a menu structure representing the root directory. + // + if(ProcessDirChange("/", g_ui32Level)) + { + // + // Request a repaint so the file menu will be shown + // + WidgetPaint(WIDGET_ROOT); + } + else + { + g_pcStatusLines[0] = "ERROR"; + g_pcStatusLines[1] = "Unable to change"; + g_pcStatusLines[2] = "directory."; + ShowStatusScreen(g_pcStatusLines, 3); + return(1); + } + + // + // Attempt to set the audio format to 44100 16 bit stereo by + // default otherwise try 48000 16 bit stereo. + // + if(USBSoundOutputFormatSet(44100, 16, 2) == 0) + { + ui32Temp = 44100; + } + else if(USBSoundOutputFormatSet(48000, 16, 2) == 0) + { + ui32Temp = 48000; + } + else + { + ui32Temp = 0; + } + + // + // If the audio device was support put the sample rate in the + // status line. + // + if(ui32Temp != 0) + { + // + // Calculate the number of bytes per USB frame. + // + g_ui32TransferSize = (ui32Temp * 4) / 1000; + + // + // Calculate the size of the audio buffer. + // + g_ui32BufferSize = AUDIO_BUFFERS * g_ui32TransferSize; + + // + // Print the time string in the format mm.ss/mm.ss + // + + if(ui32Temp == 44100) + { + usprintf(g_pcStatusText, "44.1 kHz Ready"); + } + else if(ui32Temp == 48000) + { + usprintf(g_pcStatusText, "48 kHz Ready"); + } + + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_READY) = 1; + } + else + { + strcpy(g_pcStatusText, "Not Supported"); + return (1); + } + + // + // Set initial volume. + // + USBSoundVolumeSet(g_ui32CurrentVolume); + + // + // Update the status line. + // + WidgetPaint((tWidget *)&g_sStatus); + } + + // + // Process occurrence of timer tick. Check for user input + // once each tick. + // + if((g_ui32SysTickCount != ui32LastTickCount) && + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_READY) && + (HWREGBITW(&g_ui32Flags, FLAGS_PLAY_SCREEN) == 0)) + { + uint8_t ui8ButtonState; + uint8_t ui8ButtonChanged; + + ui32LastTickCount = g_ui32SysTickCount; + + // + // Get the current debounced state of the buttons. + // + ui8ButtonState = ButtonsPoll(&ui8ButtonChanged, 0); + + // + // If select button or right button is pressed, then we + // are trying to descend into another directory + // + if(BUTTON_PRESSED(SELECT_BUTTON, + ui8ButtonState, ui8ButtonChanged) || + BUTTON_PRESSED(RIGHT_BUTTON, + ui8ButtonState, ui8ButtonChanged)) + { + uint32_t ui32NewLevel; + uint32_t ui32ItemIdx; + char *pcItemName; + + // + // Get a pointer to the current menu for this CWD. + // + tSlideMenu *psMenu = &g_psFileMenus[g_ui32Level]; + + // + // Get the highlighted index in the current file list. + // This is the currently highlighted file or dir + // on the display. Then get the name of the file at + // this index. + // + ui32ItemIdx = SlideMenuFocusItemGet(psMenu); + pcItemName = psMenu->psSlideMenuItems[ui32ItemIdx].pcText; + + // + // Make sure we are not yet past the maximum tree + // depth. + // + if(g_ui32Level < MAX_SUBDIR_DEPTH) + { + // + // Potential new level is one greater than the + // current level. + // + ui32NewLevel = g_ui32Level + 1; + + // + // Process the directory change to the new + // directory. This function will populate a menu + // structure with the files and subdirs in the new + // directory. + // + if(ProcessDirChange(pcItemName, ui32NewLevel)) + { + // + // If the change was successful, then update + // the level. + // + g_ui32Level = ui32NewLevel; + + // + // Now that all the prep is done, send the + // KEY_RIGHT message to the widget and it will + // "slide" from the previous file list to the + // new file list of the CWD. + // + SendWidgetKeyMessage(WIDGET_MSG_KEY_RIGHT); + + } + + // + // We have selected a file to play. Display + // the file information and if it is a valid + // wav file, allow playback. + // + else + { + + // + // Update the file name information. + // + strncpy(g_pcFileName, pcItemName, 16); + + if(WavOpen(g_pcFileName, &g_sWavFile) == 0) + { + // + // Read the .wav file format. + // + WavGetFormat(&g_sWavFile, &g_sWavHeader); + + // + // Print the formatted string so that it can be + // displayed. + // + usprintf(g_pcFormat, "%d Hz %d bit ", + g_sWavHeader.ui32SampleRate / 1000, + g_sWavHeader.ui16BitsPerSample); + + // + // Concatenate the number of channels. + // + if(g_sWavHeader.ui16NumChannels == 1) + { + strcat(g_pcFormat, "Mo"); + } + else + { + strcat(g_pcFormat, "St"); + } + + // + // Calculate the minutes and seconds in the file. + // + g_ui16Seconds = g_sWavHeader.ui32DataSize / + g_sWavHeader.ui32AvgByteRate; + g_ui16Minutes = g_ui16Seconds / 60; + g_ui16Seconds -= g_ui16Minutes * 60; + + // + // Close the file, it will be re-opened on play. + // + WavClose(&g_sWavFile); + + // + // Update the file time information. + // + DisplayTime(1); + + // + // Update the volume information + // + DisplayVolume(); + } + else + { + // + // Set the time and volume strings to null strings. + // + g_pcTime[0] = 0; + g_pcVolume[0] = 0; + + // + // Print message about invalid wav format + // + usprintf(g_pcFormat, "Invalid Wav"); + } + + // + // Update the file name line. + // + WidgetPaint((tWidget *)&g_sWaveInfoBackground); + + // + // Set a flag to change the button functions. + // + HWREGBITW(&g_ui32Flags, FLAGS_PLAY_SCREEN) = 1; + } + } + } + + // + // If the UP button is pressed, just pass it to the widget + // which will handle scrolling the list of files. + // + if(BUTTON_PRESSED(UP_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_UP); + } + + // + // If the DOWN button is pressed, just pass it to the widget + // which will handle scrolling the list of files. + // + if(BUTTON_PRESSED(DOWN_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_DOWN); + } + + // + // If the LEFT button is pressed, then we are attempting + // to go up a level in the file system. + // + if(BUTTON_PRESSED(LEFT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + uint32_t ui32NewLevel; + + // + // Make sure we are not already at the top of the + // directory tree (at root). + // + if(g_ui32Level) + { + // + // Potential new level is one less than the + // current level. + // + ui32NewLevel = g_ui32Level - 1; + + // + // Process the directory change to the new + // directory. This function will populate a menu + // structure with the files and subdirs in the new + // directory. + // + if(ProcessDirChange("..", ui32NewLevel)) + { + // + // If the change was successful, then update + // the level. + // + g_ui32Level = ui32NewLevel; + + // + // Now that all the prep is done, send the + // KEY_LEFT message to the widget and it will + // "slide" from the previous file list to the + // new file list of the CWD. + // + SendWidgetKeyMessage(WIDGET_MSG_KEY_LEFT); + } + } + } + } + + // + // If we are in the play back screen, change the function of the + // buttons. + // + if((g_ui32SysTickCount != ui32LastTickCount) && + HWREGBITW(&g_ui32Flags, FLAGS_DEVICE_READY) && + (HWREGBITW(&g_ui32Flags, FLAGS_PLAY_SCREEN))) + { + uint8_t ui8ButtonState; + uint8_t ui8ButtonChanged; + + ui32LastTickCount = g_ui32SysTickCount; + + // + // Get the current debounced state of the buttons. + // + ui8ButtonState = ButtonsPoll(&ui8ButtonChanged, 0); + + // + // If the left button is pressed, we need to return to + // the file menu. + // + if(BUTTON_PRESSED(LEFT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + // + // It is possible we have already started playback. + // + WaveStop(); + + // + // Redraw the menu over the play screen. + // + HWREGBITW(&g_ui32Flags, FLAGS_PLAY_SCREEN) = 0; + WidgetPaint(WIDGET_ROOT); + } + + // + // If the select or right button is pressed, we will + // start play back of the wav file. + // + if(BUTTON_PRESSED(SELECT_BUTTON, + ui8ButtonState, ui8ButtonChanged) || + BUTTON_PRESSED(RIGHT_BUTTON, + ui8ButtonState, ui8ButtonChanged)) + { + // + // If we are stopped, then start playing. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) == 0) + { + HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) = 1; + // + // Don't play anything but 16 bit audio since most USB + // devices do not support 8 bit formats. + // + if(g_sWavHeader.ui16BitsPerSample != 16) + { + return(1); + } + + // + // See if this is a valid .wav file that can be opened. + // + if(WavOpen(g_pcFileName, &g_sWavFile) == 0) + { + // + // Change the text on the button to playing. + // + strcpy(g_pcStatusText, "Playing"); + WidgetPaint((tWidget *)&g_sStatus); + + // + // Indicate that wave play back should start. + // + HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) = 1; + } + else + { + HWREGBITW(&g_ui32Flags, FLAGS_PLAYING) = 0; + return(1); + } + + // + // Initialize the read and write pointers. + // + g_pui8Read = g_pui8AudioBuffer; + g_pui8Write = g_pui8AudioBuffer; + g_ui32ValidBytes = 0; + + // + // Fill the audio buffer from the file. + // + FillAudioBuffer(); + + // + // Start the audio playback. + // + USBSoundBufferOut(g_pui8Read, g_ui32TransferSize, + USBAudioOutCallback); + } + + // + // Stop play back if we are playing. + // + else + { + WaveStop(); + } + } + + // + // If the UP button is pressed, increase the volume by 5%. + // + if(BUTTON_PRESSED(UP_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + if(g_ui32CurrentVolume < 100) + { + g_ui32CurrentVolume += 5; + USBSoundVolumeSet(g_ui32CurrentVolume); + DisplayVolume(); + } + } + + // + // If the DOWN button is pressed, decrease the volume by 5%. + // + if(BUTTON_PRESSED(DOWN_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + if((g_ui32CurrentVolume <= 100) && (g_ui32CurrentVolume > 0)) + { + g_ui32CurrentVolume -= 5; + USBSoundVolumeSet(g_ui32CurrentVolume); + DisplayVolume(); + } + } + } + + // + // Handle the case when the wave file is playing. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_PLAYING)) + { + // + // Handle the transmit complete event. + // + if(HWREGBITW(&g_ui32Flags, FLAGS_TX_COMPLETE)) + { + // + // Clear the transmit complete flag. + // + HWREGBITW(&g_ui32Flags, FLAGS_TX_COMPLETE) = 0; + + // + // If there is space available then fill the buffer. + // + FillAudioBuffer(); + + // + // If we run out of valid bytes then stop the playback. + // + if(g_ui32ValidBytes == 0) + { + // + // No more data or error so stop playing. + // + WaveStop(); + } + + // + // Update the real display time. + // + DisplayTime(0); + } + } + + // + // Need to periodically call the USBMain() routine so that + // non-interrupt gets a chance to run. + // + USBMain(GetTickms()); + + // + // Process any messages in the widget message queue. + // + WidgetMessageQueueProcess(); + } +} + diff --git a/boards/ek-lm4f232/usb_host_audio/usb_host_audio.ewd b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/usb_host_audio/usb_host_audio.ewp b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.ewp new file mode 100644 index 0000000..3394ff6 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.ewp @@ -0,0 +1,820 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\mmc-ek-lm4f232.c + + + $PROJ_DIR$\..\drivers\slidemenuwidget.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_host_audio.c + + + $PROJ_DIR$\..\drivers\usb_sound.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + $PROJ_DIR$\..\..\..\..\utils\wavfile.c + + + diff --git a/boards/ek-lm4f232/usb_host_audio/usb_host_audio.icf b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.icf new file mode 100644 index 0000000..f668415 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_audio.icf - Linker configuration file for usb_host_audio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/usb_host_audio/usb_host_audio.ld b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.ld new file mode 100644 index 0000000..28a44ca --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_audio.ld - Linker configuration file for usb_host_audio. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/usb_host_audio/usb_host_audio.sct b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.sct new file mode 100644 index 0000000..4071bfc --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_audio.sct - Linker configuration file for usb_host_audio. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/usb_host_audio/usb_host_audio.uvopt b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.uvopt new file mode 100644 index 0000000..859e739 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.uvopt @@ -0,0 +1,429 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_audio + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\mmc-ek-lm4f232.c + mmc-ek-lm4f232.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\slidemenuwidget.c + slidemenuwidget.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_audio.c + usb_host_audio.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\usb_sound.c + usb_sound.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\wavfile.c + wavfile.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 12 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 13 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 14 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/usb_host_audio/usb_host_audio.uvproj b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.uvproj new file mode 100644 index 0000000..bfe740f --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/usb_host_audio.uvproj @@ -0,0 +1,474 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_host_audio + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_audio + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_audio.bin .\rvmdk\usb_host_audio.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..;..\..\..\..\third_party;..\..\..\..\utils; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_audio.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + mmc-ek-lm4f232.c + 1 + ..\..\..\..\third_party\fatfs\port\mmc-ek-lm4f232.c + + + slidemenuwidget.c + 1 + ..\drivers\slidemenuwidget.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_host_audio.c + 1 + .\usb_host_audio.c + + + usb_sound.c + 1 + ..\drivers\usb_sound.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + wavfile.c + 1 + ..\..\..\..\utils\wavfile.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/usb_host_audio/usb_host_audio_ccs.cmd b/boards/ek-lm4f232/usb_host_audio/usb_host_audio_ccs.cmd new file mode 100644 index 0000000..5419fd5 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_audio/usb_host_audio_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_audio_ccs.cmd - CCS linker configuration file for usb_host_audio. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/ek-lm4f232/usb_host_keyboard/Makefile b/boards/ek-lm4f232/usb_host_keyboard/Makefile new file mode 100644 index 0000000..7aa4ee0 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/Makefile @@ -0,0 +1,90 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host keyboard example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB host keyboard example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_keyboard.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host keyboard example. +# +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_host_keyboard.axf: ${COMPILER}/usb_host_keyboard.o +${COMPILER}/usb_host_keyboard.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_keyboard.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_keyboard.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_keyboard.axf: usb_host_keyboard.ld +SCATTERgcc_usb_host_keyboard=usb_host_keyboard.ld +ENTRY_usb_host_keyboard=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/usb_host_keyboard/ccs/.ccsimportspec b/boards/ek-lm4f232/usb_host_keyboard/ccs/.ccsimportspec new file mode 100644 index 0000000..daa301e --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_keyboard/ccs/.ccsproject b/boards/ek-lm4f232/usb_host_keyboard/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_keyboard/ccs/.cproject b/boards/ek-lm4f232/usb_host_keyboard/ccs/.cproject new file mode 100644 index 0000000..9348458 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/ccs/.cproject @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_keyboard/ccs/.project b/boards/ek-lm4f232/usb_host_keyboard/ccs/.project new file mode 100644 index 0000000..c41f744 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/ccs/.project @@ -0,0 +1,60 @@ + + + usb_host_keyboard + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_keyboard/startup_ccs.c + + + usb_host_keyboard.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.c + + + usb_host_keyboard_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin b/boards/ek-lm4f232/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin new file mode 100644 index 0000000..d369fd1 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_keyboard/ccs/Debug/usb_host_keyboard.bin differ diff --git a/boards/ek-lm4f232/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out b/boards/ek-lm4f232/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out new file mode 100644 index 0000000..564400d Binary files /dev/null and b/boards/ek-lm4f232/usb_host_keyboard/ccs/Debug/usb_host_keyboard.out differ diff --git a/boards/ek-lm4f232/usb_host_keyboard/ccs/macros.ini_initial b/boards/ek-lm4f232/usb_host_keyboard/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/usb_host_keyboard/ccs/target_config.ccxml b/boards/ek-lm4f232/usb_host_keyboard/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin b/boards/ek-lm4f232/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin new file mode 100644 index 0000000..497d42b Binary files /dev/null and b/boards/ek-lm4f232/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.bin differ diff --git a/boards/ek-lm4f232/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out b/boards/ek-lm4f232/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out new file mode 100644 index 0000000..8c52e92 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_keyboard/ewarm/Exe/usb_host_keyboard.out differ diff --git a/boards/ek-lm4f232/usb_host_keyboard/gcc/usb_host_keyboard.axf b/boards/ek-lm4f232/usb_host_keyboard/gcc/usb_host_keyboard.axf new file mode 100644 index 0000000..ec1b6dd Binary files /dev/null and b/boards/ek-lm4f232/usb_host_keyboard/gcc/usb_host_keyboard.axf differ diff --git a/boards/ek-lm4f232/usb_host_keyboard/gcc/usb_host_keyboard.bin b/boards/ek-lm4f232/usb_host_keyboard/gcc/usb_host_keyboard.bin new file mode 100644 index 0000000..46bdb39 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_keyboard/gcc/usb_host_keyboard.bin differ diff --git a/boards/ek-lm4f232/usb_host_keyboard/readme.txt b/boards/ek-lm4f232/usb_host_keyboard/readme.txt new file mode 100644 index 0000000..a2a8af9 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/readme.txt @@ -0,0 +1,30 @@ +USB HID Keyboard Host + +This example application demonstrates how to support a USB keyboard +attached to the evaluation kit board. The display will show if a keyboard +is currently connected and the current state of the Caps Lock key on the +keyboard that is connected on the bottom status area of the screen. +Pressing any keys on the keyboard will cause them to be printed on the +screen and to be sent out the UART at 115200 baud with no parity, 8 bits +and 1 stop bit. Any keyboard that supports the USB HID BIOS protocol +should work with this demo application. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/usb_host_keyboard/rvmdk/usb_host_keyboard.axf b/boards/ek-lm4f232/usb_host_keyboard/rvmdk/usb_host_keyboard.axf new file mode 100644 index 0000000..50100a9 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_keyboard/rvmdk/usb_host_keyboard.axf differ diff --git a/boards/ek-lm4f232/usb_host_keyboard/rvmdk/usb_host_keyboard.bin b/boards/ek-lm4f232/usb_host_keyboard/rvmdk/usb_host_keyboard.bin new file mode 100644 index 0000000..4a4b124 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_keyboard/rvmdk/usb_host_keyboard.bin differ diff --git a/boards/ek-lm4f232/usb_host_keyboard/startup_ccs.c b/boards/ek-lm4f232/usb_host_keyboard/startup_ccs.c new file mode 100644 index 0000000..5dfcc4e --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_keyboard/startup_ewarm.c b/boards/ek-lm4f232/usb_host_keyboard/startup_ewarm.c new file mode 100644 index 0000000..9fc3087 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_keyboard/startup_gcc.c b/boards/ek-lm4f232/usb_host_keyboard/startup_gcc.c new file mode 100644 index 0000000..fc4e734 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_keyboard/startup_rvmdk.S b/boards/ek-lm4f232/usb_host_keyboard/startup_rvmdk.S new file mode 100644 index 0000000..679bc9b --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.c b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.c new file mode 100644 index 0000000..9c0ffca --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.c @@ -0,0 +1,1143 @@ +//***************************************************************************** +// +// usb_host_keyboard.c - main application code for the host keyboard example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/rom.h" +#include "driverlib/uart.h" +#include "grlib/grlib.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhhid.h" +#include "usblib/host/usbhhidkeyboard.h" +#include "utils/uartstdio.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB HID Keyboard Host (usb_host_keyboard)

      +//! +//! This example application demonstrates how to support a USB keyboard +//! attached to the evaluation kit board. The display will show if a keyboard +//! is currently connected and the current state of the Caps Lock key on the +//! keyboard that is connected on the bottom status area of the screen. +//! Pressing any keys on the keyboard will cause them to be printed on the +//! screen and to be sent out the UART at 115200 baud with no parity, 8 bits +//! and 1 stop bit. Any keyboard that supports the USB HID BIOS protocol +//! should work with this demo application. +// +//***************************************************************************** + +//***************************************************************************** +// +// The ASCII code for a backspace character. +// +//***************************************************************************** +#define ASCII_BACKSPACE 0x08 + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// The size of the keyboard device interface's memory pool in bytes. +// +//***************************************************************************** +#define KEYBOARD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the keyboard device. +// +//***************************************************************************** +uint8_t g_pui8Buffer[KEYBOARD_MEMORY_SIZE]; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the Keyboard class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHIDClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / TICKS_PER_SECOND) + +//***************************************************************************** +// +// Our running system tick counter and a global used to determine the time +// elapsed since last call to GetTickms(). +// +//***************************************************************************** +uint32_t g_ui32SysTickCount; +uint32_t g_ui32LastTick; + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// The global value used to store the keyboard instance value. +// +//***************************************************************************** +static tUSBHKeyboard *g_psKeyboardInstance; + +//***************************************************************************** +// +// This enumerated type is used to hold the states of the keyboard. +// +//***************************************************************************** +enum +{ + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Keyboard has been detected and needs to be initialized in the main + // loop. + // + STATE_KEYBOARD_INIT, + + // + // Keyboard is connected and waiting for events. + // + STATE_KEYBOARD_CONNECTED, + + // + // Keyboard has received a key press that requires updating the keyboard + // in the main loop. + // + STATE_KEYBOARD_UPDATE, + + // + // An unsupported device has been attached. + // + STATE_UNKNOWN_DEVICE, + + // + // A power fault has occurred. + // + STATE_POWER_FAULT +} +g_eUSBState; + +extern const tHIDKeyboardUsageTable g_sUSKeyboardMap; + +//***************************************************************************** +// +// The current USB operating mode - Host, Device or unknown. +// +//***************************************************************************** +tUSBMode g_eCurrentUSBMode; + +//***************************************************************************** +// +// These defines are used to define the screen constraints to the application. +// +//***************************************************************************** +#define DISPLAY_BANNER_HEIGHT 10 +#define DISPLAY_BANNER_BG ClrDarkBlue +#define DISPLAY_TEXT_BORDER 2 +#define DISPLAY_TEXT_FG ClrWhite +#define DISPLAY_TEXT_BG ClrBlack + +//***************************************************************************** +// +// This variable holds the current status of the modifiers keys. +// +//***************************************************************************** +uint32_t g_ui32Modifiers = 0; + +//***************************************************************************** +// +// This is the number of characters that will fit on a line in the text area. +// +//***************************************************************************** +uint32_t g_ui32CharsPerLine; + +//***************************************************************************** +// +// This is the number of lines that will fit in the text area. +// +//***************************************************************************** +uint32_t g_ui32LinesPerScreen; + +//***************************************************************************** +// +// This is the current line for printing in the text area. +// +//***************************************************************************** +uint32_t g_ui32Line = 0; + +//***************************************************************************** +// +// This is the current column for printing in the text area. +// +//***************************************************************************** +uint32_t g_ui32Column = 0; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Update our tick counter. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// This function prints the character out the UART and into the text area of +// the screen. +// +// \param cChar is the character to print out. +// +// This function handles all of the detail of printing a character to both the +// UART and to the text area of the screen on the evaluation board. The text +// area of the screen will be cleared any time the text goes beyond the end +// of the text area. +// +// \return None. +// +//***************************************************************************** +void +PrintChar(const char cChar) +{ + tRectangle sRect; + + // + // If both the line and column have gone to zero then clear the screen. + // + if((g_ui32Line == 0) && (g_ui32Column == 0)) + { + // + // Form the rectangle that makes up the text box. + // + sRect.i16XMin = 0; + sRect.i16YMin = (2 * DISPLAY_BANNER_HEIGHT) + DISPLAY_TEXT_BORDER; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - DISPLAY_TEXT_BORDER; + sRect.i16YMax = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT - DISPLAY_TEXT_BORDER; + + // + // Change the foreground color to black and draw black rectangle to + // clear the screen. + // + GrContextForegroundSet(&g_sContext, DISPLAY_TEXT_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Reset the foreground color to the text color. + // + GrContextForegroundSet(&g_sContext, DISPLAY_TEXT_FG); + } + + // + // Send the character to the UART. + // + UARTprintf("%c", cChar); + + // + // Allow new lines to cause the column to go back to zero. + // + if(cChar != '\n') + { + // + // Did we get a backspace character? + // + if(cChar != ASCII_BACKSPACE) + { + // + // This is not a backspace so print the character to the screen. + // + GrStringDraw(&g_sContext, &cChar, 1, + GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column, + (2 * DISPLAY_BANNER_HEIGHT) + DISPLAY_TEXT_BORDER + + (g_ui32Line * GrFontHeightGet(g_psFontFixed6x8)), 0); + } + else + { + // + // We got a backspace. If we are at the top left of the screen, + // return since we don't need to do anything. + // + if(g_ui32Column || g_ui32Line) + { + // + // Adjust the cursor position to erase the last character. + // + if(g_ui32Column) + { + g_ui32Column--; + } + else + { + g_ui32Column = g_ui32CharsPerLine; + g_ui32Line--; + } + + // + // Print a space at this position then return without fixing up + // the cursor again. + // + GrStringDraw(&g_sContext, " ", 1, + GrFontMaxWidthGet(g_psFontFixed6x8) * g_ui32Column, + (2 * DISPLAY_BANNER_HEIGHT) + DISPLAY_TEXT_BORDER + + (g_ui32Line * GrFontHeightGet(g_psFontFixed6x8)), + true); + } + return; + } + } + else + { + // + // This will allow the code below to properly handle the new line. + // + g_ui32Column = g_ui32CharsPerLine; + } + + // + // Update the text row and column that the next character will use. + // + if(g_ui32Column < g_ui32CharsPerLine) + { + // + // No line wrap yet so move one column over. + // + g_ui32Column++; + } + else + { + // + // Line wrapped so go back to the first column and update the line. + // + g_ui32Column = 0; + g_ui32Line++; + + // + // The line has gone past the end so go back to the first line. + // + if(g_ui32Line >= g_ui32LinesPerScreen) + { + g_ui32Line = 0; + } + } +} + +//***************************************************************************** +// +// This function updates the status area of the screen. It uses the current +// state of the application to print the status bar. +// +//***************************************************************************** +void +UpdateStatus(void) +{ + tRectangle sRect; + + // + // Fill the bottom rows of the screen with blue to create the status area. + // + sRect.i16XMin = 0; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT - 1; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = sRect.i16YMin + DISPLAY_BANNER_HEIGHT; + + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Update the status on the screen. + // + if(g_eUSBState == STATE_NO_DEVICE) + { + // + // Keyboard is currently disconnected. + // + GrStringDrawCentered(&g_sContext, "no device", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + } + else if(g_eUSBState == STATE_UNKNOWN_DEVICE) + { + // + // Unknown device is currently connected. + // + GrStringDrawCentered(&g_sContext, "unknown device", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + } + else if(g_eUSBState == STATE_POWER_FAULT) + { + // + // Something caused a power fault. + // + GrStringDrawCentered(&g_sContext, "power fault", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + } + else if((g_eUSBState == STATE_KEYBOARD_CONNECTED) || + (g_eUSBState == STATE_KEYBOARD_UPDATE)) + { + // + // Keyboard is connected. + // + GrStringDrawCentered(&g_sContext, "connected", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + + // + // Update the CAPS Lock status. + // + if(g_ui32Modifiers & HID_KEYB_CAPS_LOCK) + { + GrStringDrawCentered(&g_sContext, "C", + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16XMax - 10, + sRect.i16YMin + 5, 0); + } + } +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the keyboard device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *pEventInfo; + + // + // Cast this pointer to its actual type. + // + pEventInfo = (tEventInfo *)pvData; + + switch(pEventInfo->ui32Event) + { + // + // New keyboard detected. + // + case USB_EVENT_CONNECTED: + { + // + // See if this is a HID Keyboard. + // + if((USBHCDDevClass(pEventInfo->ui32Instance, 0) == USB_CLASS_HID) && + (USBHCDDevProtocol(pEventInfo->ui32Instance, 0) == + USB_HID_PROTOCOL_KEYB)) + { + // + // Indicate that the keyboard has been detected. + // + UARTprintf("Keyboard Connected\n"); + + // + // Proceed to the STATE_KEYBOARD_INIT state so that the main + // loop can finish initialized the mouse since + // USBHKeyboardInit() cannot be called from within a callback. + // + g_eUSBState = STATE_KEYBOARD_INIT; + } + + break; + } + // + // Unsupported device detected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + UARTprintf("Unsupported Device Class (0x%02x) Connected.\n", + pEventInfo->ui32Instance); + + // + // An unknown device was detected. + // + g_eUSBState = STATE_UNKNOWN_DEVICE; + + UpdateStatus(); + + break; + } + // + // Device has been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Indicate that the device has been disconnected. + // + UARTprintf("Device Disconnected\n"); + + // + // Change the state so that the main loop knows that the device + // is no longer present. + // + g_eUSBState = STATE_NO_DEVICE; + + // + // Update the screen. + // + UpdateStatus(); + + break; + } + // + // Power Fault occurred. + // + case USB_EVENT_POWER_FAULT: + { + UARTprintf("Power Fault\n"); + + // + // No power means no device is present. + // + g_eUSBState = STATE_POWER_FAULT; + + UpdateStatus(); + + break; + } + default: + { + break; + } + } +} + +//***************************************************************************** +// +// USB Mode callback +// +// \param ui32Index is the zero-based index of the USB controller making the +// callback. +// \param eMode indicates the new operating mode. +// +// This function is called by the USB library whenever an OTG mode change +// occurs and, if a connection has been made, informs us of whether we are to +// operate as a host or device. +// +// \return None. +// +//***************************************************************************** +void +ModeCallback(uint32_t ui32Index, tUSBMode eMode) +{ + // + // Save the new mode. + // + g_eCurrentUSBMode = eMode; + + switch(eMode) + { + case eUSBModeHost: + { + UARTprintf("\nHost Mode.\n"); + break; + } + case eUSBModeDevice: + { + UARTprintf("\nDevice Mode.\n"); + break; + } + case eUSBModeNone: + { + UARTprintf("\nIdle Mode.\n"); + break; + } + default: + { + UARTprintf("ERROR: Bad Mode!\n"); + break; + } + } +} + +//***************************************************************************** +// +// This is the callback from the USB HID keyboard handler. +// +// \param psKbInstance is ignored by this function. +// \param ui32Event is one of the valid events for a keyboard device. +// \param ui32MsgParam is defined by the event that occurs. +// \param pvMsgData is a pointer to data that is defined by the event that +// occurs. +// +// This function will be called to inform the application when a keyboard has +// been plugged in or removed and any time a key is pressed or released. +// +// \return None. +// +//***************************************************************************** +void +KeyboardCallback(tUSBHKeyboard *psKbInstance, uint32_t ui32Event, + uint32_t ui32MsgParam, void *pvMsgData) +{ + char cChar; + + switch(ui32Event) + { + // + // New Key press detected. + // + case USBH_EVENT_HID_KB_PRESS: + { + // + // If this was a Caps Lock key then update the Caps Lock state. + // + if(ui32MsgParam == HID_KEYB_USAGE_CAPSLOCK) + { + // + // The main loop needs to update the keyboard's Caps Lock + // state. + // + g_eUSBState = STATE_KEYBOARD_UPDATE; + + // + // Toggle the current Caps Lock state. + // + g_ui32Modifiers ^= HID_KEYB_CAPS_LOCK; + + // + // Update the screen based on the Caps Lock status. + // + UpdateStatus(); + } + else if(ui32MsgParam == HID_KEYB_USAGE_SCROLLOCK) + { + // + // The main loop needs to update the keyboard's Scroll Lock + // state. + // + g_eUSBState = STATE_KEYBOARD_UPDATE; + + // + // Toggle the current Scroll Lock state. + // + g_ui32Modifiers ^= HID_KEYB_SCROLL_LOCK; + } + else if(ui32MsgParam == HID_KEYB_USAGE_NUMLOCK) + { + // + // The main loop needs to update the keyboard's Scroll Lock + // state. + // + g_eUSBState = STATE_KEYBOARD_UPDATE; + + // + // Toggle the current Num Lock state. + // + g_ui32Modifiers ^= HID_KEYB_NUM_LOCK; + } + else + { + // + // Was this the backspace key? + // + if((uint8_t)ui32MsgParam == HID_KEYB_USAGE_BACKSPACE) + { + // + // Yes - set the ASCII code for a backspace key. This is + // not returned by USBHKeyboardUsageToChar since this only + // returns printable characters. + // + cChar = ASCII_BACKSPACE; + } + else + { + // + // This is not backspace so try to map the usage code to a + // printable ASCII character. + // + cChar = (char) + USBHKeyboardUsageToChar(g_psKeyboardInstance, + &g_sUSKeyboardMap, + (uint8_t)ui32MsgParam); + } + + // + // A zero value indicates there was no textual mapping of this + // usage code. + // + if(cChar != 0) + { + PrintChar(cChar); + } + } + break; + } + case USBH_EVENT_HID_KB_MOD: + { + // + // This application ignores the state of the shift or control + // and other special keys. + // + break; + } + case USBH_EVENT_HID_KB_REL: + { + // + // This applications ignores the release of keys as well. + // + break; + } + } +} + +//***************************************************************************** +// +// This function returns the number of ticks since the last time this function +// was called. +// +//***************************************************************************** +uint32_t +GetTickms(void) +{ + uint32_t ui32RetVal; + uint32_t ui32Saved; + + ui32RetVal = g_ui32SysTickCount; + ui32Saved = ui32RetVal; + + if(ui32Saved > g_ui32LastTick) + { + ui32RetVal = ui32Saved - g_ui32LastTick; + } + else + { + ui32RetVal = g_ui32LastTick - ui32Saved; + } + + // + // This could miss a few milliseconds but the timings here are on a + // much larger scale. + // + g_ui32LastTick = ui32Saved; + + // + // Return the number of milliseconds since the last time this was called. + // + return(ui32RetVal * MS_PER_SYSTICK); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + tUSBMode eLastMode; + char *pcString; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initially wait for device connection. + // + g_eUSBState = STATE_NO_DEVICE; + eLastMode = eUSBModeOTG; + g_eCurrentUSBMode = eUSBModeOTG; + + // + // Enable Clocking to the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Configure UART0 for debug output. + // + ConfigureUART(); + + // + // Initialize the USB stack mode and pass in a mode callback. + // + USBStackModeSet(0, eUSBModeOTG, ModeCallback); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the keyboard driver. The keyboard does not need + // to be present at this time, this just save a place for it and allows + // the applications to be notified when a keyboard is present. + // + g_psKeyboardInstance = USBHKeyboardOpen(KeyboardCallback, g_pui8Buffer, + KEYBOARD_MEMORY_SIZE); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Initialize the USB controller for OTG operation with a 2ms polling + // rate. + // + USBOTGModeInit(0, 2000, g_pui8HCDPool, HCD_MEMORY_SIZE); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = (2 * DISPLAY_BANNER_HEIGHT) - 1; + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, DISPLAY_TEXT_FG); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "usb-host-", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + GrStringDrawCentered(&g_sContext, "keyboard", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 14, 0); + + + // + // Calculate the number of characters that will fit on a line. + // Make sure to leave a small border for the text box. + // + g_ui32CharsPerLine = (GrContextDpyWidthGet(&g_sContext) - 4) / + GrFontMaxWidthGet(g_psFontFixed6x8); + + // + // Calculate the number of lines per usable text screen. This requires + // taking off space for the top and bottom banners and adding a small bit + // for a border. + // + g_ui32LinesPerScreen = (GrContextDpyHeightGet(&g_sContext) - + (3*(DISPLAY_BANNER_HEIGHT + 1)))/ + GrFontHeightGet(g_psFontFixed6x8); + + // + // Open and instance of the keyboard class driver. + // + UARTprintf("Host Keyboard Application\n"); + + // + // Initial update of the screen. + // + UpdateStatus(); + + // + // The main loop for the application. + // + while(1) + { + // + // Tell the OTG library code how much time has passed in + // milliseconds since the last call. + // + USBOTGMain(GetTickms()); + + // + // Has the USB mode changed since last time we checked? + // + if(g_eCurrentUSBMode != eLastMode) + { + // + // Remember the new mode. + // + eLastMode = g_eCurrentUSBMode; + + switch(eLastMode) + { + case eUSBModeHost: + pcString = "HOST"; + break; + + case eUSBModeDevice: + pcString = "DEVICE"; + break; + + case eUSBModeNone: + pcString = "NONE"; + break; + + default: + pcString = "UNKNOWN"; + break; + } + + UARTprintf("USB mode changed to %s\n", pcString); + } + + switch(g_eUSBState) + { + // + // This state is entered when they keyboard is first detected. + // + case STATE_KEYBOARD_INIT: + { + // + // Initialized the newly connected keyboard. + // + USBHKeyboardInit(g_psKeyboardInstance); + + // + // Proceed to the keyboard connected state. + // + g_eUSBState = STATE_KEYBOARD_CONNECTED; + + // + // Update the screen now that the keyboard has been + // initialized. + // + UpdateStatus(); + + USBHKeyboardModifierSet(g_psKeyboardInstance, g_ui32Modifiers); + + break; + } + case STATE_KEYBOARD_UPDATE: + { + // + // If the application detected a change that required an + // update to be sent to the keyboard to change the modifier + // state then call it and return to the connected state. + // + g_eUSBState = STATE_KEYBOARD_CONNECTED; + + USBHKeyboardModifierSet(g_psKeyboardInstance, g_ui32Modifiers); + + break; + } + case STATE_KEYBOARD_CONNECTED: + { + // + // Nothing is currently done in the main loop when the keyboard + // is connected. + // + break; + } + + case STATE_UNKNOWN_DEVICE: + { + // + // Nothing to do as the device is unknown. + // + break; + } + + case STATE_NO_DEVICE: + { + // + // Nothing is currently done in the main loop when the keyboard + // is not connected. + // + break; + } + default: + { + break; + } + } + } +} diff --git a/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ewd b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ewp b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ewp new file mode 100644 index 0000000..1502b89 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ewp @@ -0,0 +1,798 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_host_keyboard.c + + + diff --git a/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.icf b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.icf new file mode 100644 index 0000000..502cc1b --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_keyboard.icf - Linker configuration file for usb_host_keyboard. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ld b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ld new file mode 100644 index 0000000..cf67207 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_keyboard.ld - Linker configuration file for usb_host_keyboard. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.sct b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.sct new file mode 100644 index 0000000..ad0c39b --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_keyboard.sct - Linker configuration file for usb_host_keyboard. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.uvopt b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.uvopt new file mode 100644 index 0000000..9487f5d --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_keyboard + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_keyboard.c + usb_host_keyboard.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.uvproj b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.uvproj new file mode 100644 index 0000000..6746b89 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_host_keyboard + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_keyboard + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_keyboard.bin .\rvmdk\usb_host_keyboard.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_keyboard.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_host_keyboard.c + 1 + .\usb_host_keyboard.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard_ccs.cmd b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard_ccs.cmd new file mode 100644 index 0000000..23775c7 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_keyboard/usb_host_keyboard_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_keyboard_ccs.cmd - CCS linker configuration file for usb_host_keyboard. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/usb_host_mouse/Makefile b/boards/ek-lm4f232/usb_host_mouse/Makefile new file mode 100644 index 0000000..f67d0a0 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host mouse example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../ +IPATH+=../../../.. + +# +# The default rule, which causes the USB host mouse example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_mouse.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host mouse example. +# +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/usb_host_mouse.o +${COMPILER}/usb_host_mouse.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_host_mouse.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_mouse.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_mouse.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_mouse.axf: usb_host_mouse.ld +SCATTERgcc_usb_host_mouse=usb_host_mouse.ld +ENTRY_usb_host_mouse=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/usb_host_mouse/ccs/.ccsimportspec b/boards/ek-lm4f232/usb_host_mouse/ccs/.ccsimportspec new file mode 100644 index 0000000..fab5ea4 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_mouse/ccs/.ccsproject b/boards/ek-lm4f232/usb_host_mouse/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_mouse/ccs/.cproject b/boards/ek-lm4f232/usb_host_mouse/ccs/.cproject new file mode 100644 index 0000000..1510fab --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/ccs/.cproject @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_mouse/ccs/.project b/boards/ek-lm4f232/usb_host_mouse/ccs/.project new file mode 100644 index 0000000..efed34e --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/ccs/.project @@ -0,0 +1,65 @@ + + + usb_host_mouse + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_mouse/startup_ccs.c + + + usb_host_mouse.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.c + + + usb_host_mouse_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/usb_host_mouse/ccs/Debug/usb_host_mouse.bin b/boards/ek-lm4f232/usb_host_mouse/ccs/Debug/usb_host_mouse.bin new file mode 100644 index 0000000..76dfa0b Binary files /dev/null and b/boards/ek-lm4f232/usb_host_mouse/ccs/Debug/usb_host_mouse.bin differ diff --git a/boards/ek-lm4f232/usb_host_mouse/ccs/Debug/usb_host_mouse.out b/boards/ek-lm4f232/usb_host_mouse/ccs/Debug/usb_host_mouse.out new file mode 100644 index 0000000..8763904 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_mouse/ccs/Debug/usb_host_mouse.out differ diff --git a/boards/ek-lm4f232/usb_host_mouse/ccs/macros.ini_initial b/boards/ek-lm4f232/usb_host_mouse/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/usb_host_mouse/ccs/target_config.ccxml b/boards/ek-lm4f232/usb_host_mouse/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin b/boards/ek-lm4f232/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin new file mode 100644 index 0000000..268c5d3 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_mouse/ewarm/Exe/usb_host_mouse.bin differ diff --git a/boards/ek-lm4f232/usb_host_mouse/ewarm/Exe/usb_host_mouse.out b/boards/ek-lm4f232/usb_host_mouse/ewarm/Exe/usb_host_mouse.out new file mode 100644 index 0000000..b38334c Binary files /dev/null and b/boards/ek-lm4f232/usb_host_mouse/ewarm/Exe/usb_host_mouse.out differ diff --git a/boards/ek-lm4f232/usb_host_mouse/gcc/usb_host_mouse.axf b/boards/ek-lm4f232/usb_host_mouse/gcc/usb_host_mouse.axf new file mode 100644 index 0000000..beae157 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_mouse/gcc/usb_host_mouse.axf differ diff --git a/boards/ek-lm4f232/usb_host_mouse/gcc/usb_host_mouse.bin b/boards/ek-lm4f232/usb_host_mouse/gcc/usb_host_mouse.bin new file mode 100644 index 0000000..75ead31 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_mouse/gcc/usb_host_mouse.bin differ diff --git a/boards/ek-lm4f232/usb_host_mouse/readme.txt b/boards/ek-lm4f232/usb_host_mouse/readme.txt new file mode 100644 index 0000000..c6194c4 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/readme.txt @@ -0,0 +1,25 @@ +USB HID Mouse Host + +This application demonstrates the handling of a USB mouse attached to the +evaluation kit. Once attached, the position of the mouse pointer and the +state of the mouse buttons are output to the display. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/usb_host_mouse/rvmdk/usb_host_mouse.axf b/boards/ek-lm4f232/usb_host_mouse/rvmdk/usb_host_mouse.axf new file mode 100644 index 0000000..546a9d3 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_mouse/rvmdk/usb_host_mouse.axf differ diff --git a/boards/ek-lm4f232/usb_host_mouse/rvmdk/usb_host_mouse.bin b/boards/ek-lm4f232/usb_host_mouse/rvmdk/usb_host_mouse.bin new file mode 100644 index 0000000..194c1be Binary files /dev/null and b/boards/ek-lm4f232/usb_host_mouse/rvmdk/usb_host_mouse.bin differ diff --git a/boards/ek-lm4f232/usb_host_mouse/startup_ccs.c b/boards/ek-lm4f232/usb_host_mouse/startup_ccs.c new file mode 100644 index 0000000..5dfcc4e --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_mouse/startup_ewarm.c b/boards/ek-lm4f232/usb_host_mouse/startup_ewarm.c new file mode 100644 index 0000000..9fc3087 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_mouse/startup_gcc.c b/boards/ek-lm4f232/usb_host_mouse/startup_gcc.c new file mode 100644 index 0000000..fc4e734 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_mouse/startup_rvmdk.S b/boards/ek-lm4f232/usb_host_mouse/startup_rvmdk.S new file mode 100644 index 0000000..679bc9b --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.c b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.c new file mode 100644 index 0000000..8ef61ef --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.c @@ -0,0 +1,803 @@ +//***************************************************************************** +// +// usb_host_mouse.c - main application code for the host mouse example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "grlib/grlib.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhhid.h" +#include "usblib/host/usbhhidmouse.h" +#include "utils/ustdlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB HID Mouse Host (usb_host_mouse)

      +//! +//! This application demonstrates the handling of a USB mouse attached to the +//! evaluation kit. Once attached, the position of the mouse pointer and the +//! state of the mouse buttons are output to the display. +// +//***************************************************************************** + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / TICKS_PER_SECOND) + +//***************************************************************************** +// +// Graphics context used to show text on the CSTN display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Our running system tick counter and a global used to determine the time +// elapsed since last call to GetTickms(). +// +//***************************************************************************** +uint32_t g_ui32SysTickCount; +uint32_t g_ui32LastTick; + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// The size of the mouse device interface's memory pool in bytes. +// +//***************************************************************************** +#define MOUSE_MEMORY_SIZE 128 + +//***************************************************************************** +// +// These defines are used to define the screen constraints to the application. +// +//***************************************************************************** +#define DISPLAY_BANNER_HEIGHT 10 +#define DISPLAY_BANNER_BG ClrDarkBlue +#define DISPLAY_TEXT_BORDER 2 +#define DISPLAY_TEXT_FG ClrWhite +#define DISPLAY_TEXT_BG ClrBlack + +//***************************************************************************** +// +// The memory pool to provide to the mouse device. +// +//***************************************************************************** +uint8_t g_pui8Buffer[MOUSE_MEMORY_SIZE]; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the Mouse class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHIDClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The global value used to store the mouse instance value. +// +//***************************************************************************** +static tUSBHMouse *g_psMouseInstance; + +//***************************************************************************** +// +// The global values used to store the mouse state. +// +//***************************************************************************** +static uint32_t g_ui32Buttons; +static int32_t g_i32CursorX; +static int32_t g_i32CursorY; + +//***************************************************************************** +// +// The current USB operating mode - Host, Device or unknown. +// +//***************************************************************************** +tUSBMode g_eCurrentUSBMode; + +//***************************************************************************** +// +// This enumerated type is used to hold the states of the mouse. +// +//***************************************************************************** +enum +{ + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Mouse has been detected and needs to be initialized in the main + // loop. + // + STATE_MOUSE_INIT, + + // + // Mouse is connected and waiting for events. + // + STATE_MOUSE_CONNECTED, + + // + // An unsupported device has been attached. + // + STATE_UNKNOWN_DEVICE, + + // + // A power fault has occured. + // + STATE_POWER_FAULT +} +g_eUSBState; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the mouse device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *pEventInfo; + tRectangle sRect; + + // + // Fill the bottom rows of the screen with blue to create the status area. + // + sRect.i16XMin = 0; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT - 1; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = sRect.i16YMin + DISPLAY_BANNER_HEIGHT; + + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Set the font for the status message + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + + // + // Cast this pointer to its actual type. + // + pEventInfo = (tEventInfo *)pvData; + + switch(pEventInfo->ui32Event) + { + // + // New mouse detected. + // + case USB_EVENT_CONNECTED: + { + // + // See if this is a HID Mouse. + // + if((USBHCDDevClass(pEventInfo->ui32Instance, 0) == USB_CLASS_HID) && + (USBHCDDevProtocol(pEventInfo->ui32Instance, 0) == + USB_HID_PROTOCOL_MOUSE)) + { + // + // Indicate that the mouse has been detected. + // + GrStringDrawCentered(&g_sContext, "Mouse Connected", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + + // + // Set initial mouse information. + // + GrStringDrawCentered(&g_sContext, "0,0", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 26, 1); + GrStringDrawCentered(&g_sContext, "000", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 46, 1); + + // + // Proceed to the STATE_MOUSE_INIT state so that the main loop + // can finish initialized the mouse since USBHMouseInit() + // cannot be called from within a callback. + // + g_eUSBState = STATE_MOUSE_INIT; + } + + break; + } + // + // Unsupported device detected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + GrStringDrawCentered(&g_sContext, "Unknown Device", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + // + // An unknown device was detected. + // + g_eUSBState = STATE_UNKNOWN_DEVICE; + + break; + } + // + // Device has been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Indicate that the device has been disconnected. + // + GrStringDrawCentered(&g_sContext, "No Device", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + + // + // Reset the mouse information. + // + GrStringDrawCentered(&g_sContext, " -,- ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 26, 1); + GrStringDrawCentered(&g_sContext, "---", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 46, 1); + + // + // Change the state so that the main loop knows that the device is + // no longer present. + // + g_eUSBState = STATE_NO_DEVICE; + + // + // Reset the button state. + // + g_ui32Buttons = 0; + + break; + } + // + // Power Fault has occurred. + // + case USB_EVENT_POWER_FAULT: + { + // + // Indicate that there has been a power fault. + // + GrStringDrawCentered(&g_sContext, "Power Fault", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + + // + // Reset the mouse information. + // + GrStringDrawCentered(&g_sContext, " -,- ", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 26, 1); + GrStringDrawCentered(&g_sContext, "---", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 46, 1); + + // + // No power means no device is present. + // + g_eUSBState = STATE_POWER_FAULT; + + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Update our tick counter. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// This function returns the number of ticks since the last time this function +// was called. +// +//***************************************************************************** +uint32_t +GetTickms(void) +{ + uint32_t ui32RetVal; + uint32_t ui32Saved; + + ui32RetVal = g_ui32SysTickCount; + ui32Saved = ui32RetVal; + + if(ui32Saved > g_ui32LastTick) + { + ui32RetVal = ui32Saved - g_ui32LastTick; + } + else + { + ui32RetVal = g_ui32LastTick - ui32Saved; + } + + // + // This could miss a few milliseconds but the timings here are on a + // much larger scale. + // + g_ui32LastTick = ui32Saved; + + // + // Return the number of milliseconds since the last time this was called. + // + return(ui32RetVal * MS_PER_SYSTICK); +} + +//***************************************************************************** +// +// USB Mode callback +// +// \param ui32Index is the zero-based index of the USB controller making the +// callback. +// \param eMode indicates the new operating mode. +// +// This function is called by the USB library whenever an OTG mode change +// occurs and, if a connection has been made, informs us of whether we are to +// operate as a host or device. +// +// \return None. +// +//***************************************************************************** +void +ModeCallback(uint32_t ui32Index, tUSBMode eMode) +{ + // + // Save the new mode. + // + g_eCurrentUSBMode = eMode; +} + +//***************************************************************************** +// +// This is the callback from the USB HID mouse handler. +// +// \param psMsInstance is ignored by this function. +// \param ui32Event is one of the valid events for a mouse device. +// \param ui32MsgParam is defined by the event that occurs. +// \param pvMsgData is a pointer to data that is defined by the event that +// occurs. +// +// This function will be called to inform the application when a mouse has +// been plugged in or removed and any time mouse movement or button pressed +// is detected. +// +// \return None. +// +//***************************************************************************** +void +MouseCallback(tUSBHMouse *psMsInstance, uint32_t ui32Event, + uint32_t ui32MsgParam, void *pvMsgData) +{ + int32_t i32DoUpdate; + char pcBuffer[20]; + + // + // Do an update unless there is no reason to. + // + i32DoUpdate = 1; + + switch(ui32Event) + { + // + // Mouse button press detected. + // + case USBH_EVENT_HID_MS_PRESS: + { + // + // Save the new button that was pressed. + // + g_ui32Buttons |= ui32MsgParam; + + break; + } + + // + // Mouse button release detected. + // + case USBH_EVENT_HID_MS_REL: + { + // + // Remove the button from the pressed state. + // + g_ui32Buttons &= ~ui32MsgParam; + + break; + } + + // + // Mouse X movement detected. + // + case USBH_EVENT_HID_MS_X: + { + // + // Update the cursor X position. + // + g_i32CursorX += (int8_t)ui32MsgParam; + + // + // Cap the value to not cause an overflow. + // + if(g_i32CursorX > 9999) + { + g_i32CursorX = 9999; + } + + if(g_i32CursorX < -9999) + { + g_i32CursorX = -9999; + } + + break; + } + + // + // Mouse Y movement detected. + // + case USBH_EVENT_HID_MS_Y: + { + // + // Update the cursor Y position. + // + g_i32CursorY += (int8_t)ui32MsgParam; + + // + // Cap the value to not cause an overflow. + // + if(g_i32CursorY > 9999) + { + g_i32CursorY = 9999; + } + + if(g_i32CursorY < -9999) + { + g_i32CursorY = -9999; + } + + break; + } + default: + { + // + // No reason to update. + // + i32DoUpdate = 0; + + break; + } + } + + // + // Display the current mouse position and button state if there was an + // update. + // + if(i32DoUpdate) + { + GrStringDrawCentered(&g_sContext, "Position:", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 16, 0); + usprintf(pcBuffer, " %d,%d ", g_i32CursorX, g_i32CursorY); + GrStringDrawCentered(&g_sContext, pcBuffer, -1, + GrContextDpyWidthGet(&g_sContext) / 2, 26, 1); + GrStringDrawCentered(&g_sContext, "Buttons:", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 36, 0); + usprintf(pcBuffer, "%d%d%d", g_ui32Buttons & 1, (g_ui32Buttons & 2) >> 1, + (g_ui32Buttons & 4) >> 2); + GrStringDrawCentered(&g_sContext, pcBuffer, -1, + GrContextDpyWidthGet(&g_sContext) / 2, 46, 1); + } +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + tRectangle sRect; + + // + // Set the clocking to run from the PLL at 50MHz. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = (DISPLAY_BANNER_HEIGHT) - 1; + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, DISPLAY_TEXT_FG); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "usb-host-mouse", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 4, 0); + + // + // Display default information about the mouse + // + GrStringDrawCentered(&g_sContext, "Position:", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 16, 0); + GrStringDrawCentered(&g_sContext, "-,-", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 26, 1); + GrStringDrawCentered(&g_sContext, "Buttons:", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 36, 0); + GrStringDrawCentered(&g_sContext, "---", -1, + GrContextDpyWidthGet(&g_sContext) / 2, 46, 1); + + // + // Fill the bottom rows of the screen with blue to create the status area. + // + sRect.i16XMin = 0; + sRect.i16YMin = GrContextDpyHeightGet(&g_sContext) - + DISPLAY_BANNER_HEIGHT - 1; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = sRect.i16YMin + DISPLAY_BANNER_HEIGHT; + + GrContextForegroundSet(&g_sContext, DISPLAY_BANNER_BG); + GrRectFill(&g_sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + GrRectDraw(&g_sContext, &sRect); + + // + // Print a no device message a placeholder for the message printed + // during an event. + // + GrStringDrawCentered(&g_sContext, "No Device", -1, + GrContextDpyWidthGet(&g_sContext) / 2, + sRect.i16YMin + 5, 0); + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable Clocking to the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Initially wait for device connection. + // + g_eUSBState = STATE_NO_DEVICE; + + // + // Initialize the USB stack mode and pass in a mode callback. + // + USBStackModeSet(0, eUSBModeOTG, ModeCallback); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Initialized the cursor. + // + g_ui32Buttons = 0; + g_i32CursorX = 0; + g_i32CursorY = 0; + + // + // Open an instance of the mouse driver. The mouse does not need + // to be present at this time, this just saves a place for it and allows + // the applications to be notified when a mouse is present. + // + g_psMouseInstance = + USBHMouseOpen(MouseCallback, g_pui8Buffer, MOUSE_MEMORY_SIZE); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Initialize the USB controller for OTG operation with a 2ms polling + // rate. + // + USBOTGModeInit(0, 2000, g_pui8HCDPool, HCD_MEMORY_SIZE); + + // + // The main loop for the application. + // + while(1) + { + // + // Tell the OTG state machine how much time has passed in + // milliseconds since the last call. + // + USBOTGMain(GetTickms()); + + switch(g_eUSBState) + { + // + // This state is entered when the mouse is first detected. + // + case STATE_MOUSE_INIT: + { + // + // Initialize the newly connected mouse. + // + USBHMouseInit(g_psMouseInstance); + + // + // Proceed to the mouse connected state. + // + g_eUSBState = STATE_MOUSE_CONNECTED; + + break; + } + + case STATE_MOUSE_CONNECTED: + { + // + // Nothing is currently done in the main loop when the mouse + // is connected. + // + break; + } + + case STATE_NO_DEVICE: + { + // + // The mouse is not connected so nothing needs to be done here. + // + break; + } + + default: + { + break; + } + } + } +} diff --git a/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ewd b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ewp b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ewp new file mode 100644 index 0000000..90a929a --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ewp @@ -0,0 +1,801 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_host_mouse.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.icf b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.icf new file mode 100644 index 0000000..9a53879 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_mouse.icf - Linker configuration file for usb_host_mouse. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ld b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ld new file mode 100644 index 0000000..100f187 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_mouse.ld - Linker configuration file for usb_host_mouse. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.sct b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.sct new file mode 100644 index 0000000..f00d4fa --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_mouse.sct - Linker configuration file for usb_host_mouse. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.uvopt b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.uvopt new file mode 100644 index 0000000..0f0fa7b --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.uvopt @@ -0,0 +1,359 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_mouse + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_mouse.c + usb_host_mouse.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 8 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 9 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.uvproj b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.uvproj new file mode 100644 index 0000000..c2a1d91 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse.uvproj @@ -0,0 +1,449 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_host_mouse + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_mouse + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_mouse.bin .\rvmdk\usb_host_mouse.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..\;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_mouse.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_host_mouse.c + 1 + .\usb_host_mouse.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse_ccs.cmd b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse_ccs.cmd new file mode 100644 index 0000000..6090768 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_mouse/usb_host_mouse_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_mouse_ccs.cmd - CCS linker configuration file for usb_host_mouse. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/usb_host_msc/Makefile b/boards/ek-lm4f232/usb_host_msc/Makefile new file mode 100644 index 0000000..db3fb3b --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/Makefile @@ -0,0 +1,98 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB host mass storage example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../third_party/fatfs/port +VPATH+=../../../../third_party/fatfs/src +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. +IPATH+=../../../../third_party + +# +# The default rule, which causes the USB host mass storage example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_host_msc.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB host mass storage example. +# +${COMPILER}/usb_host_msc.axf: ${COMPILER}/buttons.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/fat_usbmsc.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/ff.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/slidemenuwidget.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/usb_host_msc.o +${COMPILER}/usb_host_msc.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_host_msc.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_host_msc.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_host_msc.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_host_msc.axf: usb_host_msc.ld +SCATTERgcc_usb_host_msc=usb_host_msc.ld +ENTRY_usb_host_msc=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/usb_host_msc/ccs/.ccsimportspec b/boards/ek-lm4f232/usb_host_msc/ccs/.ccsimportspec new file mode 100644 index 0000000..252e9bb --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_msc/ccs/.ccsproject b/boards/ek-lm4f232/usb_host_msc/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_msc/ccs/.cproject b/boards/ek-lm4f232/usb_host_msc/ccs/.cproject new file mode 100644 index 0000000..14b0357 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/ccs/.cproject @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_msc/ccs/.project b/boards/ek-lm4f232/usb_host_msc/ccs/.project new file mode 100644 index 0000000..b2c50c4 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/ccs/.project @@ -0,0 +1,85 @@ + + + usb_host_msc + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_msc/startup_ccs.c + + + usb_host_msc.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_msc/usb_host_msc.c + + + usb_host_msc_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_host_msc/usb_host_msc_ccs.cmd + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + drivers/slidemenuwidget.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/slidemenuwidget.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/fatfs/port/fat_usbmsc.c + 1 + SW_ROOT/third_party/fatfs/port/fat_usbmsc.c + + + third_party/fatfs/src/ff.c + 1 + SW_ROOT/third_party/fatfs/src/ff.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/usb_host_msc/ccs/Debug/usb_host_msc.bin b/boards/ek-lm4f232/usb_host_msc/ccs/Debug/usb_host_msc.bin new file mode 100644 index 0000000..21027db Binary files /dev/null and b/boards/ek-lm4f232/usb_host_msc/ccs/Debug/usb_host_msc.bin differ diff --git a/boards/ek-lm4f232/usb_host_msc/ccs/Debug/usb_host_msc.out b/boards/ek-lm4f232/usb_host_msc/ccs/Debug/usb_host_msc.out new file mode 100644 index 0000000..4163025 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_msc/ccs/Debug/usb_host_msc.out differ diff --git a/boards/ek-lm4f232/usb_host_msc/ccs/macros.ini_initial b/boards/ek-lm4f232/usb_host_msc/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/usb_host_msc/ccs/target_config.ccxml b/boards/ek-lm4f232/usb_host_msc/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_host_msc/ewarm/Exe/usb_host_msc.bin b/boards/ek-lm4f232/usb_host_msc/ewarm/Exe/usb_host_msc.bin new file mode 100644 index 0000000..55e182d Binary files /dev/null and b/boards/ek-lm4f232/usb_host_msc/ewarm/Exe/usb_host_msc.bin differ diff --git a/boards/ek-lm4f232/usb_host_msc/ewarm/Exe/usb_host_msc.out b/boards/ek-lm4f232/usb_host_msc/ewarm/Exe/usb_host_msc.out new file mode 100644 index 0000000..3930fd5 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_msc/ewarm/Exe/usb_host_msc.out differ diff --git a/boards/ek-lm4f232/usb_host_msc/gcc/usb_host_msc.axf b/boards/ek-lm4f232/usb_host_msc/gcc/usb_host_msc.axf new file mode 100644 index 0000000..55bb898 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_msc/gcc/usb_host_msc.axf differ diff --git a/boards/ek-lm4f232/usb_host_msc/gcc/usb_host_msc.bin b/boards/ek-lm4f232/usb_host_msc/gcc/usb_host_msc.bin new file mode 100644 index 0000000..132a5c9 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_msc/gcc/usb_host_msc.bin differ diff --git a/boards/ek-lm4f232/usb_host_msc/readme.txt b/boards/ek-lm4f232/usb_host_msc/readme.txt new file mode 100644 index 0000000..2d6d871 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/readme.txt @@ -0,0 +1,29 @@ +USB Mass Storage Class Host Example + +This example application demonstrates reading a file system from +a USB flash disk. It makes use of FatFs, a FAT file system driver. It +provides a simple widget-based display for showing and navigating the file +system on a USB stick. + +For additional details about FatFs, see the following site: +http://elm-chan.org/fsw/ff/00index_e.html + +------------------------------------------------------------------------------- + +Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/usb_host_msc/rvmdk/usb_host_msc.axf b/boards/ek-lm4f232/usb_host_msc/rvmdk/usb_host_msc.axf new file mode 100644 index 0000000..17ed001 Binary files /dev/null and b/boards/ek-lm4f232/usb_host_msc/rvmdk/usb_host_msc.axf differ diff --git a/boards/ek-lm4f232/usb_host_msc/rvmdk/usb_host_msc.bin b/boards/ek-lm4f232/usb_host_msc/rvmdk/usb_host_msc.bin new file mode 100644 index 0000000..b3ebbca Binary files /dev/null and b/boards/ek-lm4f232/usb_host_msc/rvmdk/usb_host_msc.bin differ diff --git a/boards/ek-lm4f232/usb_host_msc/startup_ccs.c b/boards/ek-lm4f232/usb_host_msc/startup_ccs.c new file mode 100644 index 0000000..1298b8a --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_msc/startup_ewarm.c b/boards/ek-lm4f232/usb_host_msc/startup_ewarm.c new file mode 100644 index 0000000..24b9e87 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_msc/startup_gcc.c b/boards/ek-lm4f232/usb_host_msc/startup_gcc.c new file mode 100644 index 0000000..ab9b746 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void USB0OTGModeIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0OTGModeIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_host_msc/startup_rvmdk.S b/boards/ek-lm4f232/usb_host_msc/startup_rvmdk.S new file mode 100644 index 0000000..41abc68 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN USB0OTGModeIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0OTGModeIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/usb_host_msc/usb_host_msc.c b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.c new file mode 100644 index 0000000..50858a5 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.c @@ -0,0 +1,1549 @@ +//***************************************************************************** +// +// usb_host_msc.c - Example program for reading files from a USB flash drive. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/udma.h" +#include "driverlib/rom.h" +#include "driverlib/pin_map.h" +#include "grlib/grlib.h" +#include "grlib/widget.h" +#include "utils/ustdlib.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhmsc.h" +#include "third_party/fatfs/src/ff.h" +#include "third_party/fatfs/src/diskio.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" +#include "drivers/slidemenuwidget.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Mass Storage Class Host Example (usb_host_msc)

      +//! +//! This example application demonstrates reading a file system from +//! a USB flash disk. It makes use of FatFs, a FAT file system driver. It +//! provides a simple widget-based display for showing and navigating the file +//! system on a USB stick. +//! +//! For additional details about FatFs, see the following site: +//! http://elm-chan.org/fsw/ff/00index_e.html +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines the number of times to call to check if the attached device is +// ready. +// +//***************************************************************************** +#define USBMSC_DRIVE_RETRY 4 + +//***************************************************************************** +// +// The following are data structures used by FatFs. +// +//***************************************************************************** +static FATFS g_sFatFs; +static DIR g_sDirObject; +static FILINFO g_sFileInfo; + +//***************************************************************************** +// +// A structure that holds a mapping between an FRESULT numerical code, +// and a string representation. FRESULT codes are returned from the FatFs +// FAT file system driver. +// +//***************************************************************************** +typedef struct +{ + FRESULT fresult; + char *pcResultStr; +} +tFresultString; + +//***************************************************************************** +// +// A macro to make it easy to add result codes to the table. +// +//***************************************************************************** +#define FRESULT_ENTRY(f) { (f), (#f) } + +//***************************************************************************** +// +// A table that holds a mapping between the numerical FRESULT code and +// it's name as a string. This is used for looking up error codes and +// providing a human-readable string. +// +//***************************************************************************** +tFresultString g_sFresultStrings[] = +{ + FRESULT_ENTRY(FR_OK), + FRESULT_ENTRY(FR_DISK_ERR), + FRESULT_ENTRY(FR_INT_ERR), + FRESULT_ENTRY(FR_NOT_READY), + FRESULT_ENTRY(FR_NO_FILE), + FRESULT_ENTRY(FR_NO_PATH), + FRESULT_ENTRY(FR_INVALID_NAME), + FRESULT_ENTRY(FR_DENIED), + FRESULT_ENTRY(FR_EXIST), + FRESULT_ENTRY(FR_INVALID_OBJECT), + FRESULT_ENTRY(FR_WRITE_PROTECTED), + FRESULT_ENTRY(FR_INVALID_DRIVE), + FRESULT_ENTRY(FR_NOT_ENABLED), + FRESULT_ENTRY(FR_NO_FILESYSTEM), + FRESULT_ENTRY(FR_MKFS_ABORTED), + FRESULT_ENTRY(FR_TIMEOUT), + FRESULT_ENTRY(FR_LOCKED), + FRESULT_ENTRY(FR_NOT_ENOUGH_CORE), + FRESULT_ENTRY(FR_TOO_MANY_OPEN_FILES), + FRESULT_ENTRY(FR_INVALID_PARAMETER), +}; + +//***************************************************************************** +// +// A macro that holds the number of result codes. +// +//***************************************************************************** +#define NUM_FRESULT_CODES (sizeof(g_sFresultStrings) / sizeof(tFresultString)) + +//***************************************************************************** +// +// Error reasons returned by ChangeToDirectory(). +// +//***************************************************************************** +#define NAME_TOO_LONG_ERROR 1 +#define OPENDIR_ERROR 2 + +//***************************************************************************** +// +// The number of SysTick ticks per second. +// +//***************************************************************************** +#define TICKS_PER_SECOND 100 +#define MS_PER_SYSTICK (1000 / TICKS_PER_SECOND) + +//***************************************************************************** +// +// A counter for system clock ticks, used for simple timing. +// +//***************************************************************************** +static uint32_t g_ui32SysTickCount; + +//***************************************************************************** +// +// Holds global flags for the system. +// +//***************************************************************************** +static uint32_t g_ui32Flags = 0; + +//***************************************************************************** +// +// Flag indicating that some USB device is connected. +// +//***************************************************************************** +#define FLAGS_DEVICE_PRESENT 0x00000001 + +//***************************************************************************** +// +// Hold the current state for the application. +// +//***************************************************************************** +volatile enum +{ + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Mass storage device is being enumerated. + // + STATE_DEVICE_ENUM, + + // + // Mass storage device is ready. + // + STATE_DEVICE_READY, + + // + // An unsupported device has been attached. + // + STATE_UNKNOWN_DEVICE, + + // + // A mass storage device was connected but failed to ever report ready. + // + STATE_TIMEOUT_DEVICE, + + // + // A power fault has occurred. + // + STATE_POWER_FAULT +} +g_eState; + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pui8HCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// The instance data for the MSC driver. +// +//***************************************************************************** +tUSBHMSCInstance *g_psMSCInstance = 0; + +//***************************************************************************** +// +// Declare the USB Events driver interface. +// +//***************************************************************************** +DECLARE_EVENT_DRIVER(g_sUSBEventDriver, 0, 0, USBHCDEvents); + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the MSC class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostMSCClassDriver, + &g_sUSBEventDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +static const uint32_t g_ui32NumHostClassDrivers = + sizeof(g_ppHostClassDrivers) / sizeof(tUSBHostClassDriver *); + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. In this application uDMA is only used for USB, +// so only the first 6 channels are needed. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_psDMAControlTable[6]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_psDMAControlTable, 1024) +tDMAControlTable g_psDMAControlTable[6]; +#else +tDMAControlTable g_psDMAControlTable[6] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// Define a pair of buffers that are used for holding path information. +// The buffer size must be large enough to hold the longest expected +// full path name, including the file name, and a trailing null character. +// The initial path is set to root "/". +// +//***************************************************************************** +#define PATH_BUF_SIZE 80 +static char g_pcCwdBuf[PATH_BUF_SIZE] = "/"; +static char g_pcTmpBuf[PATH_BUF_SIZE]; + +//***************************************************************************** +// +// A set of string pointers that are used for showing status on the display. +// Five lines of text are accommodated, which is the reasonable limit for +// this display. +// +//***************************************************************************** +static char *g_pcStatusLines[5]; + +//***************************************************************************** +// +// A variable to track the current level in the directory tree. The root +// level is level 0. +// +//***************************************************************************** +static uint32_t g_ui32Level; + +//***************************************************************************** +// +// Declare a pair of off-screen buffers and associated display structures. +// These are used by the slide menu widget for animated menu effects. +// +//***************************************************************************** +#define OFFSCREEN_BUF_SIZE GrOffScreen4BPPSize(96, 64) +static uint8_t g_pui8OffscreenBufA[OFFSCREEN_BUF_SIZE]; +static uint8_t g_pui8OffscreenBufB[OFFSCREEN_BUF_SIZE]; +static tDisplay g_sOffscreenDisplayA; +static tDisplay g_sOffscreenDisplayB; + +//***************************************************************************** +// +// Create a palette that is used by the on-screen menus and anything else that +// uses the (above) off-screen buffers. This palette should contain any +// colors that are used by any widget using the offscreen buffers. There can +// be up to 16 colors in this palette. +// +//***************************************************************************** +static uint32_t g_pui32Palette[] = +{ + ClrBlack, + ClrWhite, + ClrDarkBlue, + ClrLightBlue, + ClrRed, + ClrDarkGreen, + ClrYellow, + ClrBlue +}; +#define NUM_PALETTE_ENTRIES (sizeof(g_pui32Palette) / sizeof(uint32_t)) + +//***************************************************************************** +// +// Define the maximum number of files that can appear at any directory level. +// This is used for allocating space for holding the file information. +// Define the maximum depth of subdirectories, also used to allocating space +// for directory structures. +// Define the maximum number of characters allowed to be stored for a file +// name. +// +//***************************************************************************** +#define MAX_FILES_PER_MENU 64 +#define MAX_SUBDIR_DEPTH 32 +#define MAX_FILENAME_STRING_LEN 16 + +//***************************************************************************** +// +// Declare a set of menu items and matching strings that are used to hold +// file information. There are two alternating sets. Two are needed because +// the file information must be retained for the current directory, and the +// new directory (up or down the tree). +// +//***************************************************************************** +static char g_pcFileNames[2][MAX_FILES_PER_MENU][MAX_FILENAME_STRING_LEN]; +static tSlideMenuItem g_psFileMenuItems[2][MAX_FILES_PER_MENU]; + +//***************************************************************************** +// +// Declare a set of menus, one for each level of directory. +// +//***************************************************************************** +static tSlideMenu g_psFileMenus[MAX_SUBDIR_DEPTH]; + +//***************************************************************************** +// +// Define the slide menu widget. This is the wigdet that is used for +// displaying the file information. +// +//***************************************************************************** +SlideMenu(g_sFileMenuWidget, WIDGET_ROOT, 0, 0, &g_sCFAL96x64x16, 0, 0, 96, 64, + &g_sOffscreenDisplayA, &g_sOffscreenDisplayB, 16, + ClrWhite, ClrDarkGreen, ClrBlack, &g_sFontFixed6x8, &g_psFileMenus[0], + 0); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// This is the handler for this SysTick interrupt. It simply increments a +// counter that is used for timing. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + // + // Update our tick counter. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// This function returns a string representation of an error code +// that was returned from a function call to FatFs. It can be used +// for printing human readable error messages. +// +//***************************************************************************** +static const char * +StringFromFresult(FRESULT fresult) +{ + uint32_t ui32Idx; + + // + // Enter a loop to search the error code table for a matching + // error code. + // + for(ui32Idx = 0; ui32Idx < NUM_FRESULT_CODES; ui32Idx++) + { + // + // If a match is found, then return the string name of the + // error code. + // + if(g_sFresultStrings[ui32Idx].fresult == fresult) + { + return(g_sFresultStrings[ui32Idx].pcResultStr); + } + } + + // + // At this point no matching code was found, so return a + // string indicating unknown error. + // + return("UNKNOWN ERR"); +} + +//***************************************************************************** +// +// Initializes the file system module. +// +// \param None. +// +// This function initializes the third party FAT implementation. +// +// \return Returns \e true on success or \e false on failure. +// +//***************************************************************************** +static bool +FileInit(void) +{ + // + // Mount the file system, using logical disk 0. + // + if(f_mount(0, &g_sFatFs) != FR_OK) + { + return(false); + } + return(true); +} + +//***************************************************************************** +// +// This is the callback from the MSC driver. +// +// \param ui32Instance is the driver instance which is needed when communicating +// with the driver. +// \param ui32Event is one of the events defined by the driver. +// \param pvData is a pointer to data passed into the initial call to register +// the callback. +// +// This function handles callback events from the MSC driver. The only events +// currently handled are the MSC_EVENT_OPEN and MSC_EVENT_CLOSE. This allows +// the main routine to know when an MSC device has been detected and +// enumerated and when an MSC device has been removed from the system. +// +// \return None +// +//***************************************************************************** +static void +MSCCallback(tUSBHMSCInstance *ps32Instance, uint32_t ui32Event, void *pvData) +{ + // + // Determine the event. + // + switch(ui32Event) + { + // + // Called when the device driver has successfully enumerated an MSC + // device. + // + case MSC_EVENT_OPEN: + { + // + // Proceed to the enumeration state. + // + g_eState = STATE_DEVICE_ENUM; + + break; + } + + // + // Called when the device driver has been unloaded due to error or + // the device is no longer present. + // + case MSC_EVENT_CLOSE: + { + // + // Go back to the "no device" state and wait for a new connection. + // + g_eState = STATE_NO_DEVICE; + + // + // Re-initialize the file system. + // + FileInit(); + + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This is the generic callback from host stack. +// +// pvData is actually a pointer to a tEventInfo structure. +// +// This function will be called to inform the application when a USB event has +// occurred that is outside those related to the mass storage device. At this +// point this is used to detect unsupported devices being inserted and removed. +// It is also used to inform the application when a power fault has occurred. +// This function is required when the g_USBGenericEventDriver is included in +// the host controller driver array that is passed in to the +// USBHCDRegisterDrivers() function. +// +//***************************************************************************** +void +USBHCDEvents(void *pvData) +{ + tEventInfo *pEventInfo; + + // + // Cast this pointer to its actual type. + // + pEventInfo = (tEventInfo *)pvData; + + // + // Process each kind of event + // + switch(pEventInfo->ui32Event) + { + // + // An unknown device has been connected. + // + case USB_EVENT_UNKNOWN_CONNECTED: + { + // + // An unknown device was detected. + // + g_eState = STATE_UNKNOWN_DEVICE; + break; + } + + // + // The unknown device has been been unplugged. + // + case USB_EVENT_DISCONNECTED: + { + // + // Unknown device has been removed. + // + g_eState = STATE_NO_DEVICE; + break; + } + + // + // A bus power fault was detected. + // + case USB_EVENT_POWER_FAULT: + { + // + // No power means no device is present. + // + g_eState = STATE_POWER_FAULT; + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// This function shows a status screen. It draws a banner at the top of the +// screen with the name of the application, and then up to 5 lines of text +// in the remaining screen area. The caller specifies a pointer to a set of +// strings, and the count of number of lines of text (up to 5). This +// function attempts to vertically center the strings on the display. +// +//***************************************************************************** +static void +ShowStatusScreen(char *pcStatus[], uint32_t ui32Count) +{ + tContext sContext; + tRectangle sRect; + uint32_t ui32Idx; + int32_t i32Y; + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Fill the rest of the display with black, to clear whatever was there + // before. + // + sRect.i16YMin = 10; + sRect.i16YMax = 63; + GrContextForegroundSet(&sContext, ClrBlack); + GrRectFill(&sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "usb-host-msc", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Cap the max number of status lines to 5 + // + ui32Count = (ui32Count > 5) ? 5 : ui32Count; + + // + // Compute the starting Y coordinate based on the number of lines. + // + i32Y = 40 - (ui32Count * 5); + + // + // Display the status lines + // + for(ui32Idx = 0; ui32Idx < ui32Count; ui32Idx++) + { + GrStringDrawCentered(&sContext, pcStatus[ui32Idx], -1, + GrContextDpyWidthGet(&sContext) / 2, i32Y, 0); + i32Y += 10; + } +} + +//***************************************************************************** +// +// This function is called to read the contents of the current directory from +// the USB stick and populate a set of menu items, one for each file in the +// directory. A subdirectory within the directory counts as a file item. +// +// This function returns the number of file items that were found, or 0 if +// there is any error detected. +// +//***************************************************************************** +static uint32_t +PopulateFileList(uint32_t ui32Level) +{ + uint32_t ui32ItemCount; + FRESULT fresult; + + // + // Open the current directory for access. + // + fresult = f_opendir(&g_sDirObject, g_pcCwdBuf); + + // + // Check for error and return if there is a problem. + // + if(fresult != FR_OK) + { + // + // Ensure that the error is reported. + // + g_pcStatusLines[0] = "Error from"; + g_pcStatusLines[1] = "USB disk"; + g_pcStatusLines[2] = (char *)StringFromFresult(fresult); + ShowStatusScreen(g_pcStatusLines, 3); + return(0); + } + + // + // Initialize the count of files in this directory + // + ui32ItemCount = 0; + + // + // Enter loop to enumerate through all directory entries. + // + for(;;) + { + // + // Read an entry from the directory. + // + fresult = f_readdir(&g_sDirObject, &g_sFileInfo); + + // + // Check for error and return if there is a problem. + // + if(fresult != FR_OK) + { + g_pcStatusLines[0] = "Error from"; + g_pcStatusLines[1] = "USB disk"; + g_pcStatusLines[2] = (char *)StringFromFresult(fresult); + ShowStatusScreen(g_pcStatusLines, 3); + return(0); + } + + // + // If the file name is blank, then this is the end of the + // listing. + // + if(!g_sFileInfo.fname[0]) + { + break; + } + + // + // Add the information to a menu item + // + if(ui32ItemCount < MAX_FILES_PER_MENU) + { + tSlideMenuItem *pMenuItem; + + // + // Get a pointer to the current menu item. Use the directory + // level to determine which of the two sets of menu items to use. + // (ui32Level & 1]. This lets us alternate between the current + // set of menu items and the new set (up or down the tree). + // + pMenuItem = &g_psFileMenuItems[ui32Level & 1][ui32ItemCount]; + + // + // Add the file name to the menu item + // + usnprintf(g_pcFileNames[ui32Level & 1][ui32ItemCount], + MAX_FILENAME_STRING_LEN, "%s", g_sFileInfo.fname); + pMenuItem->pcText = g_pcFileNames[ui32Level & 1][ui32ItemCount]; + + // + // If this is a directory, then add the next level menu so that + // when displayed it will be showed with a submenu option + // (next level down in directory tree). Otherwise it is a file + // so clear the child menu so that there is no submenu option + // shown. + // + pMenuItem->psChildMenu = (g_sFileInfo.fattrib & AM_DIR) ? + &g_psFileMenus[ui32Level + 1] : 0; + + // + // Move to the next entry in the item array we use to populate the + // list box. + // + ui32ItemCount++; + } + } + + // + // Made it to here, return the count of files that were populated. + // + return(ui32ItemCount); +} + +//***************************************************************************** +// +// This function is used to change to a new directory in the file system. +// It takes a parameter that specifies the directory to make the current +// working directory. +// Path separators must use a forward slash "/". The directory parameter +// can be one of the following: +// * root ("/") +// * a fully specified path ("/my/path/to/mydir") +// * a single directory name that is in the current directory ("mydir") +// * parent directory ("..") +// +// It does not understand relative paths, so dont try something like this: +// ("../my/new/path") +// +// Once the new directory is specified, it attempts to open the directory +// to make sure it exists. If the new path is opened successfully, then +// the current working directory (cwd) is changed to the new path. +// +// In cases of error, the pui32Reason parameter will be written with one of +// the following values: +// +// NAME_TOO_LONG_ERROR - combination of paths are too long for the buffer +// OPENDIR_ERROR - there is some problem opening the new directory +// +//***************************************************************************** +static FRESULT +ChangeToDirectory(char *pcDirectory, uint32_t *pui32Reason) +{ + uint32_t ui32Idx; + FRESULT fresult; + + // + // Copy the current working path into a temporary buffer so + // it can be manipulated. + // + strcpy(g_pcTmpBuf, g_pcCwdBuf); + + // + // If the first character is /, then this is a fully specified + // path, and it should just be used as-is. + // + if(pcDirectory[0] == '/') + { + // + // Make sure the new path is not bigger than the cwd buffer. + // + if(strlen(pcDirectory) + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_OK); + } + + // + // If the new path name (in argv[1]) is not too long, then + // copy it into the temporary buffer so it can be checked. + // + else + { + strncpy(g_pcTmpBuf, pcDirectory, sizeof(g_pcTmpBuf)); + } + } + + // + // If the argument is .. then attempt to remove the lowest level + // on the CWD. + // + else if(!strcmp(pcDirectory, "..")) + { + // + // Get the index to the last character in the current path. + // + ui32Idx = strlen(g_pcTmpBuf) - 1; + + // + // Back up from the end of the path name until a separator (/) + // is found, or until we bump up to the start of the path. + // + while((g_pcTmpBuf[ui32Idx] != '/') && (ui32Idx > 1)) + { + // + // Back up one character. + // + ui32Idx--; + } + + // + // Now we are either at the lowest level separator in the + // current path, or at the beginning of the string (root). + // So set the new end of string here, effectively removing + // that last part of the path. + // + g_pcTmpBuf[ui32Idx] = 0; + } + + // + // Otherwise this is just a normal path name from the current + // directory, and it needs to be appended to the current path. + // + else + { + // + // Test to make sure that when the new additional path is + // added on to the current path, there is room in the buffer + // for the full new path. It needs to include a new separator, + // and a trailing null character. + // + if(strlen(g_pcTmpBuf) + strlen(pcDirectory) + 1 + 1 > sizeof(g_pcCwdBuf)) + { + *pui32Reason = NAME_TOO_LONG_ERROR; + return(FR_INVALID_OBJECT); + } + + // + // The new path is okay, so add the separator and then append + // the new directory to the path. + // + else + { + // + // If not already at the root level, then append a / + // + if(strcmp(g_pcTmpBuf, "/")) + { + strcat(g_pcTmpBuf, "/"); + } + + // + // Append the new directory to the path. + // + strcat(g_pcTmpBuf, pcDirectory); + } + } + + // + // At this point, a candidate new directory path is in g_pcTmpBuf. + // Try to open it to make sure it is valid. + // + fresult = f_opendir(&g_sDirObject, g_pcTmpBuf); + + // + // If it can't be opened, then it is a bad path. Return an error. + // + if(fresult != FR_OK) + { + *pui32Reason = OPENDIR_ERROR; + return(fresult); + } + + // + // Otherwise, it is a valid new path, so copy it into the CWD. + // + else + { + strncpy(g_pcCwdBuf, g_pcTmpBuf, sizeof(g_pcCwdBuf)); + } + + // + // Return success. + // + return(FR_OK); +} + +//***************************************************************************** +// +// Sends a button/key press message to the slide menu widget that is showing +// files. +// +//***************************************************************************** +static void +SendWidgetKeyMessage(uint32_t ui32Msg) +{ + WidgetMessageQueueAdd(WIDGET_ROOT, + ui32Msg, (uint32_t)&g_sFileMenuWidget, 0, 1, 1); +} + +//***************************************************************************** +// +// This function performs actions that are common whenever the directory +// level is changed up or down. It populates the correct menu structure with +// the list of files in the directory. +// +//***************************************************************************** +static bool +ProcessDirChange(char *pcDir, uint32_t ui32Level) +{ + FRESULT fresult; + uint32_t ui32Reason; + uint32_t ui32FileCount; + + // + // Attempt to change to the new directory. + // + fresult = ChangeToDirectory(pcDir, &ui32Reason); + + // + // If the directory change was successful, populate the + // list of files for the new subdirectory. + // + if((fresult == FR_OK) && (ui32Level < MAX_SUBDIR_DEPTH)) + { + // + // Get a pointer to the current menu for this CWD. + // + tSlideMenu *psMenu = &g_psFileMenus[ui32Level]; + + // + // Populate the menu items with the file list for the new CWD. + // + ui32FileCount = PopulateFileList(ui32Level); + + // + // Initialize the file menu with the list of menu items, + // which are just files and dirs in the root directory + // + psMenu->psSlideMenuItems = g_psFileMenuItems[ui32Level & 1]; + psMenu->ui32Items = ui32FileCount; + + // + // Set the parent directory, if there is one. If at level 0 + // (CWD is root), then there is no parent directory. + // + if(ui32Level) + { + psMenu->psParent = &g_psFileMenus[ui32Level - 1]; + } + else + { + psMenu->psParent = 0; + } + + // + // If we are descending into a new subdir, then initialize the other + // menu item fields to default values. + // + if(ui32Level > g_ui32Level) + { + psMenu->ui32CenterIndex = 0; + psMenu->ui32FocusIndex = 0; + psMenu->bMultiSelectable = 0; + } + + // + // Return a success indication + // + return(true); + } + + // + // Directory change was not successful + // + else + { + // + // Return failure indication + // + return(false); + } +} + +//***************************************************************************** +// +// The program main function. It performs initialization, then runs a loop to +// process USB activities and operate the user interface. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32DriveTimeout; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure SysTick for a 100Hz interrupt. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / TICKS_PER_SECOND); + ROM_SysTickEnable(); + ROM_SysTickIntEnable(); + + // + // Enable the uDMA controller and set up the control table base. + // The uDMA controller is used by the USB library. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + ROM_uDMAEnable(); + ROM_uDMAControlBaseSet(g_psDMAControlTable); + + // + // Enable Interrupts + // + ROM_IntMasterEnable(); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the buttons driver. + // + ButtonsInit(); + + // + // Initialize two offscreen displays and assign the palette. These + // buffers are used by the slide menu widget to allow animation effects. + // + GrOffScreen4BPPInit(&g_sOffscreenDisplayA, g_pui8OffscreenBufA, 96, 64); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayA, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + GrOffScreen4BPPInit(&g_sOffscreenDisplayB, g_pui8OffscreenBufB, 96, 64); + GrOffScreen4BPPPaletteSet(&g_sOffscreenDisplayB, g_pui32Palette, 0, + NUM_PALETTE_ENTRIES); + + // + // Show an initial status screen + // + g_pcStatusLines[0] = "Waiting"; + g_pcStatusLines[1] = "for device"; + ShowStatusScreen(g_pcStatusLines, 2); + + // + // Add the compile-time defined widgets to the widget tree. + // + WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sFileMenuWidget); + + // + // Initially wait for device connection. + // + g_eState = STATE_NO_DEVICE; + + // + // Initialize the USB stack for host mode. + // + USBStackModeSet(0, eUSBModeHost, 0); + + // + // Register the host class drivers. + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers); + + // + // Open an instance of the mass storage class driver. + // + g_psMSCInstance = USBHMSCDriveOpen(0, MSCCallback); + + // + // Initialize the drive timeout. + // + ui32DriveTimeout = USBMSC_DRIVE_RETRY; + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Initialize the USB controller for host operation. + // + USBHCDInit(0, g_pui8HCDPool, HCD_MEMORY_SIZE); + + // + // Initialize the file system. + // + FileInit(); + + // + // Enter an infinite loop to run the user interface and process USB + // events. + // + while(1) + { + uint32_t ui32LastTickCount = 0; + + // + // Call the USB stack to keep it running. + // + USBHCDMain(); + + // + // Process any messages in the widget message queue. This keeps the + // display UI running. + // + WidgetMessageQueueProcess(); + + // + // Take action based on the application state. + // + switch(g_eState) + { + // + // A device has enumerated. + // + case STATE_DEVICE_ENUM: + { + // + // Check to see if the device is ready. If not then stay + // in this state and we will check it again on the next pass. + // + if(USBHMSCDriveReady(g_psMSCInstance) != 0) + { + // + // Wait about 500ms before attempting to check if the + // device is ready again. + // + ROM_SysCtlDelay(ROM_SysCtlClockGet()/(3)); + + // + // Decrement the retry count. + // + ui32DriveTimeout--; + + // + // If the timeout is hit then go to the + // STATE_TIMEOUT_DEVICE state. + // + if(ui32DriveTimeout == 0) + { + g_eState = STATE_TIMEOUT_DEVICE; + } + + break; + } + + // + // Getting here means the device is ready. + // Reset the CWD to the root directory. + // + g_pcCwdBuf[0] = '/'; + g_pcCwdBuf[1] = 0; + + // + // Set the initial directory level to the root + // + g_ui32Level = 0; + + // + // We need to reset the indexes of the root menu to 0, so that + // it will start at the top of the file list, and reset the + // slide menu widget to start with the root menu. + // + g_psFileMenus[g_ui32Level].ui32CenterIndex = 0; + g_psFileMenus[g_ui32Level].ui32FocusIndex = 0; + SlideMenuMenuSet(&g_sFileMenuWidget, &g_psFileMenus[g_ui32Level]); + + // + // Initiate a directory change to the root. This will + // populate a menu structure representing the root directory. + // + if(ProcessDirChange("/", g_ui32Level)) + { + // + // If there were no errors reported, we are ready for + // MSC operation. + // + g_eState = STATE_DEVICE_READY; + + // + // Set the Device Present flag. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + + // + // Request a repaint so the file menu will be shown + // + WidgetPaint(WIDGET_ROOT); + } + + break; + } + + // + // If there is no device then just wait for one. + // + case STATE_NO_DEVICE: + { + if(g_ui32Flags == FLAGS_DEVICE_PRESENT) + { + // + // Show waiting message on screen + // + g_pcStatusLines[0] = "Waiting"; + g_pcStatusLines[1] = "for device"; + ShowStatusScreen(g_pcStatusLines, 2); + + // + // Clear the Device Present flag. + // + g_ui32Flags &= ~FLAGS_DEVICE_PRESENT; + } + break; + } + + // + // An unknown device was connected. + // + case STATE_UNKNOWN_DEVICE: + { + // + // If this is a new device then change the status. + // + if((g_ui32Flags & FLAGS_DEVICE_PRESENT) == 0) + { + // + // Clear the screen and indicate that an unknown device + // is present. + // + g_pcStatusLines[0] = "Unknown"; + g_pcStatusLines[1] = "device"; + ShowStatusScreen(g_pcStatusLines, 2); + } + + // + // Set the Device Present flag. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + + break; + } + + // + // The connected mass storage device is not reporting ready. + // + case STATE_TIMEOUT_DEVICE: + { + // + // If this is the first time in this state then print a + // message. + // + if((g_ui32Flags & FLAGS_DEVICE_PRESENT) == 0) + { + // + // + // Clear the screen and indicate that an unknown device + // is present. + // + g_pcStatusLines[0] = "Device"; + g_pcStatusLines[1] = "Timeout"; + ShowStatusScreen(g_pcStatusLines, 2); + } + + // + // Set the Device Present flag. + // + g_ui32Flags = FLAGS_DEVICE_PRESENT; + + break; + } + + // + // The device is ready and in use. + // + case STATE_DEVICE_READY: + { + // + // Process occurrence of timer tick. Check for user input + // once each tick. + // + if(g_ui32SysTickCount != ui32LastTickCount) + { + uint8_t ui8ButtonState; + uint8_t ui8ButtonChanged; + + ui32LastTickCount = g_ui32SysTickCount; + + // + // Get the current debounced state of the buttons. + // + ui8ButtonState = ButtonsPoll(&ui8ButtonChanged, 0); + + // + // If select button or right button is pressed, then we + // are trying to descend into another directory + // + if(BUTTON_PRESSED(SELECT_BUTTON, + ui8ButtonState, ui8ButtonChanged) || + BUTTON_PRESSED(RIGHT_BUTTON, + ui8ButtonState, ui8ButtonChanged)) + { + uint32_t ui32NewLevel; + uint32_t ui32ItemIdx; + char *pcItemName; + + // + // Get a pointer to the current menu for this CWD. + // + tSlideMenu *psMenu = &g_psFileMenus[g_ui32Level]; + + // + // Get the highlighted index in the current file list. + // This is the currently highlighted file or dir + // on the display. Then get the name of the file at + // this index. + // + ui32ItemIdx = SlideMenuFocusItemGet(psMenu); + pcItemName = psMenu->psSlideMenuItems[ui32ItemIdx].pcText; + + // + // Make sure we are not yet past the maximum tree + // depth. + // + if(g_ui32Level < MAX_SUBDIR_DEPTH) + { + // + // Potential new level is one greater than the + // current level. + // + ui32NewLevel = g_ui32Level + 1; + + // + // Process the directory change to the new + // directory. This function will populate a menu + // structure with the files and subdirs in the new + // directory. + // + if(ProcessDirChange(pcItemName, ui32NewLevel)) + { + // + // If the change was successful, then update + // the level. + // + g_ui32Level = ui32NewLevel; + + // + // Now that all the prep is done, send the + // KEY_RIGHT message to the widget and it will + // "slide" from the previous file list to the + // new file list of the CWD. + // + SendWidgetKeyMessage(WIDGET_MSG_KEY_RIGHT); + + } + } + } + + // + // If the UP button is pressed, just pass it to the widget + // which will handle scrolling the list of files. + // + if(BUTTON_PRESSED(UP_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_UP); + } + + // + // If the DOWN button is pressed, just pass it to the widget + // which will handle scrolling the list of files. + // + if(BUTTON_PRESSED(DOWN_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + SendWidgetKeyMessage(WIDGET_MSG_KEY_DOWN); + } + + // + // If the LEFT button is pressed, then we are attempting + // to go up a level in the file system. + // + if(BUTTON_PRESSED(LEFT_BUTTON, ui8ButtonState, ui8ButtonChanged)) + { + uint32_t ui32NewLevel; + + // + // Make sure we are not already at the top of the + // directory tree (at root). + // + if(g_ui32Level) + { + // + // Potential new level is one less than the + // current level. + // + ui32NewLevel = g_ui32Level - 1; + + // + // Process the directory change to the new + // directory. This function will populate a menu + // structure with the files and subdirs in the new + // directory. + // + if(ProcessDirChange("..", ui32NewLevel)) + { + // + // If the change was successful, then update + // the level. + // + g_ui32Level = ui32NewLevel; + + // + // Now that all the prep is done, send the + // KEY_LEFT message to the widget and it will + // "slide" from the previous file list to the + // new file list of the CWD. + // + SendWidgetKeyMessage(WIDGET_MSG_KEY_LEFT); + } + } + } + } + break; + } + // + // Something has caused a power fault. + // + case STATE_POWER_FAULT: + { + // + // Clear the screen and show a power fault indication. + // + g_pcStatusLines[0] = "Power"; + g_pcStatusLines[1] = "fault"; + ShowStatusScreen(g_pcStatusLines, 2); + break; + } + + default: + { + break; + } + } + } +} diff --git a/boards/ek-lm4f232/usb_host_msc/usb_host_msc.ewd b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/usb_host_msc/usb_host_msc.ewp b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.ewp new file mode 100644 index 0000000..7ccde98 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.ewp @@ -0,0 +1,815 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + $PROJ_DIR$\..\drivers\slidemenuwidget.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_host_msc.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-lm4f232/usb_host_msc/usb_host_msc.icf b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.icf new file mode 100644 index 0000000..935059d --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_host_msc.icf - Linker configuration file for usb_host_msc. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/usb_host_msc/usb_host_msc.ld b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.ld new file mode 100644 index 0000000..53a79c2 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_host_msc.ld - Linker configuration file for usb_host_msc. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/usb_host_msc/usb_host_msc.sct b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.sct new file mode 100644 index 0000000..db79891 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_host_msc.sct - Linker configuration file for usb_host_msc. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/usb_host_msc/usb_host_msc.uvopt b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.uvopt new file mode 100644 index 0000000..6fd19dc --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.uvopt @@ -0,0 +1,415 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_host_msc + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + fat_usbmsc.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\fatfs\src\ff.c + ff.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\slidemenuwidget.c + slidemenuwidget.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_host_msc.c + usb_host_msc.c + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 11 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + 2 + 12 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 13 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/usb_host_msc/usb_host_msc.uvproj b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.uvproj new file mode 100644 index 0000000..76a6021 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/usb_host_msc.uvproj @@ -0,0 +1,469 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_host_msc + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_host_msc + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_host_msc.bin .\rvmdk\usb_host_msc.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_host_msc.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + fat_usbmsc.c + 1 + ..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + ff.c + 1 + ..\..\..\..\third_party\fatfs\src\ff.c + + + slidemenuwidget.c + 1 + ..\drivers\slidemenuwidget.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_host_msc.c + 1 + .\usb_host_msc.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/usb_host_msc/usb_host_msc_ccs.cmd b/boards/ek-lm4f232/usb_host_msc/usb_host_msc_ccs.cmd new file mode 100644 index 0000000..ffb2797 --- /dev/null +++ b/boards/ek-lm4f232/usb_host_msc/usb_host_msc_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_host_msc_ccs.cmd - CCS linker configuration file for usb_host_msc. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/ek-lm4f232/usb_stick_demo/Makefile b/boards/ek-lm4f232/usb_stick_demo/Makefile new file mode 100644 index 0000000..edba6bd --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the usb_stick_demo example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the usb_stick_demo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_stick_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the usb_stick_demo example. +# +${COMPILER}/usb_stick_demo.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/usb_stick_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_stick_demo.axf: ${COMPILER}/usb_stick_demo.o +${COMPILER}/usb_stick_demo.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/usb_stick_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_stick_demo.axf: usb_stick_demo.ld +SCATTERgcc_usb_stick_demo=usb_stick_demo.ld +ENTRY_usb_stick_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/usb_stick_demo/ccs/.ccsimportspec b/boards/ek-lm4f232/usb_stick_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..64f9068 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/usb_stick_demo/ccs/.ccsproject b/boards/ek-lm4f232/usb_stick_demo/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_stick_demo/ccs/.cproject b/boards/ek-lm4f232/usb_stick_demo/ccs/.cproject new file mode 100644 index 0000000..17ab136 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_stick_demo/ccs/.project b/boards/ek-lm4f232/usb_stick_demo/ccs/.project new file mode 100644 index 0000000..a993fdf --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/ccs/.project @@ -0,0 +1,55 @@ + + + usb_stick_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_stick_demo/startup_ccs.c + + + usb_stick_demo.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.c + + + usb_stick_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo_ccs.cmd + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/usb_stick_demo/ccs/Debug/usb_stick_demo.bin b/boards/ek-lm4f232/usb_stick_demo/ccs/Debug/usb_stick_demo.bin new file mode 100644 index 0000000..afa3138 Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_demo/ccs/Debug/usb_stick_demo.bin differ diff --git a/boards/ek-lm4f232/usb_stick_demo/ccs/Debug/usb_stick_demo.out b/boards/ek-lm4f232/usb_stick_demo/ccs/Debug/usb_stick_demo.out new file mode 100644 index 0000000..a24de16 Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_demo/ccs/Debug/usb_stick_demo.out differ diff --git a/boards/ek-lm4f232/usb_stick_demo/ccs/macros.ini_initial b/boards/ek-lm4f232/usb_stick_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/usb_stick_demo/ccs/target_config.ccxml b/boards/ek-lm4f232/usb_stick_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin b/boards/ek-lm4f232/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin new file mode 100644 index 0000000..f07fa85 Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_demo/ewarm/Exe/usb_stick_demo.bin differ diff --git a/boards/ek-lm4f232/usb_stick_demo/ewarm/Exe/usb_stick_demo.out b/boards/ek-lm4f232/usb_stick_demo/ewarm/Exe/usb_stick_demo.out new file mode 100644 index 0000000..6e1213a Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_demo/ewarm/Exe/usb_stick_demo.out differ diff --git a/boards/ek-lm4f232/usb_stick_demo/gcc/usb_stick_demo.axf b/boards/ek-lm4f232/usb_stick_demo/gcc/usb_stick_demo.axf new file mode 100644 index 0000000..5374b25 Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_demo/gcc/usb_stick_demo.axf differ diff --git a/boards/ek-lm4f232/usb_stick_demo/gcc/usb_stick_demo.bin b/boards/ek-lm4f232/usb_stick_demo/gcc/usb_stick_demo.bin new file mode 100644 index 0000000..aa9065e Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_demo/gcc/usb_stick_demo.bin differ diff --git a/boards/ek-lm4f232/usb_stick_demo/readme.txt b/boards/ek-lm4f232/usb_stick_demo/readme.txt new file mode 100644 index 0000000..a0ead70 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/readme.txt @@ -0,0 +1,39 @@ +USB Stick Update Demo + +An example to demonstrate the use of the flash-based USB stick update +program. This example is meant to be loaded into flash memory from a USB +memory stick, using the USB stick update program (usb_stick_update), +running on the microcontroller. + +After this program is built, the binary file (usb_stick_demo.bin), should +be renamed to the filename expected by usb_stick_update ("FIRMWARE.BIN" by +default) and copied to the root directory of a USB memory stick. Then, +when the memory stick is plugged into the eval board that is running the +usb_stick_update program, this example program will be loaded into flash +and then run on the microcontroller. + +This program simply displays a message on the screen and prompts the user +to press the select button. Once the button is pressed, control is passed +back to the usb_stick_update program which is still is flash, and it will +attempt to load another program from the memory stick. This shows how +a user application can force a new firmware update from the memory stick. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/usb_stick_demo/rvmdk/usb_stick_demo.axf b/boards/ek-lm4f232/usb_stick_demo/rvmdk/usb_stick_demo.axf new file mode 100644 index 0000000..6fb1ffb Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_demo/rvmdk/usb_stick_demo.axf differ diff --git a/boards/ek-lm4f232/usb_stick_demo/rvmdk/usb_stick_demo.bin b/boards/ek-lm4f232/usb_stick_demo/rvmdk/usb_stick_demo.bin new file mode 100644 index 0000000..9dcb832 Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_demo/rvmdk/usb_stick_demo.bin differ diff --git a/boards/ek-lm4f232/usb_stick_demo/startup_ccs.c b/boards/ek-lm4f232/usb_stick_demo/startup_ccs.c new file mode 100644 index 0000000..6364a26 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_stick_demo/startup_ewarm.c b/boards/ek-lm4f232/usb_stick_demo/startup_ewarm.c new file mode 100644 index 0000000..dfa868d --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_stick_demo/startup_gcc.c b/boards/ek-lm4f232/usb_stick_demo/startup_gcc.c new file mode 100644 index 0000000..5618b79 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_stick_demo/startup_rvmdk.S b/boards/ek-lm4f232/usb_stick_demo/startup_rvmdk.S new file mode 100644 index 0000000..9018fc2 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.c b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.c new file mode 100644 index 0000000..ee6fa6d --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.c @@ -0,0 +1,274 @@ +//***************************************************************************** +// +// usb_stick_demo.c - USB stick update demo. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/gpio.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Stick Update Demo (usb_stick_demo)

      +//! +//! An example to demonstrate the use of the flash-based USB stick update +//! program. This example is meant to be loaded into flash memory from a USB +//! memory stick, using the USB stick update program (usb_stick_update), +//! running on the microcontroller. +//! +//! After this program is built, the binary file (usb_stick_demo.bin), should +//! be renamed to the filename expected by usb_stick_update ("FIRMWARE.BIN" by +//! default) and copied to the root directory of a USB memory stick. Then, +//! when the memory stick is plugged into the eval board that is running the +//! usb_stick_update program, this example program will be loaded into flash +//! and then run on the microcontroller. +//! +//! This program simply displays a message on the screen and prompts the user +//! to press the select button. Once the button is pressed, control is passed +//! back to the usb_stick_update program which is still is flash, and it will +//! attempt to load another program from the memory stick. This shows how +//! a user application can force a new firmware update from the memory stick. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Demonstrate the use of the USB stick update example. +// +//***************************************************************************** +int +main(void) +{ + uint_fast32_t ui32Count; + tContext sContext; + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display driver. + // + CFAL96x64x16Init(); + + // + // Initialize the graphics context. + // + GrContextInit(&sContext, &g_sCFAL96x64x16); + + // + // Fill the top 24 rows of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&sContext, ClrDarkBlue); + GrRectFill(&sContext, &sRect); + + // + // Put a white box around the banner. + // + GrContextForegroundSet(&sContext, ClrWhite); + GrRectDraw(&sContext, &sRect); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&sContext, g_psFontFixed6x8); + GrStringDrawCentered(&sContext, "usb-stick-demo", -1, + GrContextDpyWidthGet(&sContext) / 2, 4, 0); + + // + // Indicate what is happening. + // + GrStringDrawCentered(&sContext, "Press the", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, 0); + GrStringDrawCentered(&sContext, "select button to", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, 0); + GrStringDrawCentered(&sContext, "start the USB", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, 0); + GrStringDrawCentered(&sContext, "stick updater.", -1, + GrContextDpyWidthGet(&sContext) / 2, 50, 0); + + // + // Flush any cached drawing operations. + // + GrFlush(&sContext); + + // + // Enable the GPIO module which the select button is attached to. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM); + + // + // Enable the GPIO pin to read the user button. + // + ROM_GPIODirModeSet(GPIO_PORTM_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(GPIO_PORTM_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Wait for the pullup to take effect or the next loop will exist too soon. + // + SysCtlDelay(1000); + + // + // Wait until the select button has been pressed for ~40ms (in order to + // debounce the press). + // + ui32Count = 0; + while(1) + { + // + // See if the button is pressed. + // + if(ROM_GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_4) == 0) + { + // + // Increment the count since the button is pressed. + // + ui32Count++; + + // + // If the count has reached 4, then the button has been debounced + // as being pressed. + // + if(ui32Count == 4) + { + break; + } + } + else + { + // + // Reset the count since the button is not pressed. + // + ui32Count = 0; + } + + // + // Delay for approximately 10ms. + // + SysCtlDelay(16000000 / (3 * 100)); + } + + // + // Wait until the select button has been released for ~40ms (in order to + // debounce the release). + // + ui32Count = 0; + while(1) + { + // + // See if the button is pressed. + // + if(ROM_GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_4) != 0) + { + // + // Increment the count since the button is released. + // + ui32Count++; + + // + // If the count has reached 4, then the button has been debounced + // as being released. + // + if(ui32Count == 4) + { + break; + } + } + else + { + // + // Reset the count since the button is pressed. + // + ui32Count = 0; + } + + // + // Delay for approximately 10ms. + // + SysCtlDelay(16000000 / (3 * 100)); + } + + // + // Indicate that the updater is being called. + // + GrStringDrawCentered(&sContext, "The USB stick", -1, + GrContextDpyWidthGet(&sContext) / 2, 20, true); + GrStringDrawCentered(&sContext, "updater is now", -1, + GrContextDpyWidthGet(&sContext) / 2, 30, true); + GrStringDrawCentered(&sContext, "waiting for a", -1, + GrContextDpyWidthGet(&sContext) / 2, 40, true); + GrStringDrawCentered(&sContext, "USB stick.", -1, + GrContextDpyWidthGet(&sContext) / 2, 50, true); + + // + // Flush any cached drawing operations. + // + GrFlush(&sContext); + + // + // Call the updater so that it will search for an update on a memory stick. + // + (*((void (*)(void))(*(uint32_t *)0x2c)))(); + + // + // The updater should take control, so this should never be reached. + // Just in case, loop forever. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ewd b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ewp b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ewp new file mode 100644 index 0000000..830853d --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_stick_demo.c + + + diff --git a/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.icf b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.icf new file mode 100644 index 0000000..f68d397 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_stick_demo.icf - Linker configuration file for usb_stick_demo. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00004800 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ld b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ld new file mode 100644 index 0000000..eec0139 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_stick_demo.ld - Linker configuration file for usb_stick_demo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00004800, LENGTH = 0x0003b800 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.sct b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.sct new file mode 100644 index 0000000..459f057 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_stick_demo.sct - Linker configuration file for usb_stick_demo. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00004800 0x0003b800 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00004800 0x0003b800 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.uvopt b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.uvopt new file mode 100644 index 0000000..816c607 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_stick_demo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_stick_demo.c + usb_stick_demo.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.uvproj b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.uvproj new file mode 100644 index 0000000..b28a48b --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_stick_demo + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_stick_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_stick_demo.bin .\rvmdk\usb_stick_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_stick_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_stick_demo.c + 1 + .\usb_stick_demo.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo_ccs.cmd b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo_ccs.cmd new file mode 100644 index 0000000..02e7574 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_demo/usb_stick_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_stick_demo_ccs.cmd - CCS linker configuration file for usb_stick_demo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00004800 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x0003b800 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-lm4f232/usb_stick_update/Makefile b/boards/ek-lm4f232/usb_stick_update/Makefile new file mode 100644 index 0000000..1ee3993 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/Makefile @@ -0,0 +1,86 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB memory stick updater example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the USB memory stick updater example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_stick_update.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB memory stick updater example. +# +${COMPILER}/usb_stick_update.axf: ${COMPILER}/simple_fs.o +${COMPILER}/usb_stick_update.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_stick_update.axf: ${COMPILER}/usb_stick_update.o +${COMPILER}/usb_stick_update.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_stick_update.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_stick_update.axf: usb_stick_update.ld +SCATTERgcc_usb_stick_update=usb_stick_update.ld +ENTRY_usb_stick_update=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/usb_stick_update/ccs/.ccsimportspec b/boards/ek-lm4f232/usb_stick_update/ccs/.ccsimportspec new file mode 100644 index 0000000..d225a1d --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_stick_update/ccs/.ccsproject b/boards/ek-lm4f232/usb_stick_update/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_stick_update/ccs/.cproject b/boards/ek-lm4f232/usb_stick_update/ccs/.cproject new file mode 100644 index 0000000..e625362 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/ccs/.cproject @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_stick_update/ccs/.project b/boards/ek-lm4f232/usb_stick_update/ccs/.project new file mode 100644 index 0000000..5c47659 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/ccs/.project @@ -0,0 +1,55 @@ + + + usb_stick_update + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + simple_fs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_stick_update/simple_fs.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_stick_update/startup_ccs.c + + + usb_stick_update.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_stick_update/usb_stick_update.c + + + usb_stick_update_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/usb_stick_update/usb_stick_update_ccs.cmd + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/usb_stick_update/ccs/Debug/usb_stick_update.bin b/boards/ek-lm4f232/usb_stick_update/ccs/Debug/usb_stick_update.bin new file mode 100644 index 0000000..1207e5a Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_update/ccs/Debug/usb_stick_update.bin differ diff --git a/boards/ek-lm4f232/usb_stick_update/ccs/Debug/usb_stick_update.out b/boards/ek-lm4f232/usb_stick_update/ccs/Debug/usb_stick_update.out new file mode 100644 index 0000000..844c734 Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_update/ccs/Debug/usb_stick_update.out differ diff --git a/boards/ek-lm4f232/usb_stick_update/ccs/macros.ini_initial b/boards/ek-lm4f232/usb_stick_update/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/usb_stick_update/ccs/target_config.ccxml b/boards/ek-lm4f232/usb_stick_update/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/usb_stick_update/ewarm/Exe/usb_stick_update.bin b/boards/ek-lm4f232/usb_stick_update/ewarm/Exe/usb_stick_update.bin new file mode 100644 index 0000000..b60df80 Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_update/ewarm/Exe/usb_stick_update.bin differ diff --git a/boards/ek-lm4f232/usb_stick_update/ewarm/Exe/usb_stick_update.out b/boards/ek-lm4f232/usb_stick_update/ewarm/Exe/usb_stick_update.out new file mode 100644 index 0000000..313ffa0 Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_update/ewarm/Exe/usb_stick_update.out differ diff --git a/boards/ek-lm4f232/usb_stick_update/gcc/usb_stick_update.axf b/boards/ek-lm4f232/usb_stick_update/gcc/usb_stick_update.axf new file mode 100644 index 0000000..67e17c8 Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_update/gcc/usb_stick_update.axf differ diff --git a/boards/ek-lm4f232/usb_stick_update/gcc/usb_stick_update.bin b/boards/ek-lm4f232/usb_stick_update/gcc/usb_stick_update.bin new file mode 100644 index 0000000..bd8ee8f Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_update/gcc/usb_stick_update.bin differ diff --git a/boards/ek-lm4f232/usb_stick_update/readme.txt b/boards/ek-lm4f232/usb_stick_update/readme.txt new file mode 100644 index 0000000..613808e --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/readme.txt @@ -0,0 +1,49 @@ +USB Memory Stick Updater + +This example application behaves the same way as a boot loader. It resides +at the beginning of flash, and will read a binary file from a USB memory +stick and program it into another location in flash. Once the user +application has been programmed into flash, this program will always start +the user application until requested to load a new application. + +When this application starts, if there is a user application already in +flash (at \b APP_START_ADDRESS), then it will just run the user application. +It will attempt to load a new application from a USB memory stick under +the following conditions: + +- no user application is present at \b APP_START_ADDRESS +- the user application has requested an update by transferring control +to the updater +- the user holds down the eval board push button when the board is reset + +When this application is attempting to perform an update, it will wait +forever for a USB memory stick to be plugged in. Once a USB memory stick +is found, it will search the root directory for a specific file name, which +is \e FIRMWARE.BIN by default. This file must be a binary image of the +program you want to load (the .bin file), linked to run from the correct +address, at \b APP_START_ADDRESS. + +The USB memory stick must be formatted as a FAT16 or FAT32 file system +(the normal case), and the binary file must be located in the root +directory. Other files can exist on the memory stick but they will be +ignored. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/usb_stick_update/rvmdk/usb_stick_update.axf b/boards/ek-lm4f232/usb_stick_update/rvmdk/usb_stick_update.axf new file mode 100644 index 0000000..2473347 Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_update/rvmdk/usb_stick_update.axf differ diff --git a/boards/ek-lm4f232/usb_stick_update/rvmdk/usb_stick_update.bin b/boards/ek-lm4f232/usb_stick_update/rvmdk/usb_stick_update.bin new file mode 100644 index 0000000..5b9101b Binary files /dev/null and b/boards/ek-lm4f232/usb_stick_update/rvmdk/usb_stick_update.bin differ diff --git a/boards/ek-lm4f232/usb_stick_update/simple_fs.c b/boards/ek-lm4f232/usb_stick_update/simple_fs.c new file mode 100644 index 0000000..9a0394f --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/simple_fs.c @@ -0,0 +1,865 @@ +//***************************************************************************** +// +// simple_fs.c - Functions for simple FAT file system support +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "simple_fs.h" + +//***************************************************************************** +// +// \addtogroup simple_fs_api +// @{ +// +// This file system API should be used as follows: +// - Initialize it by calling SimpleFsInit(). You must supply a pointer to a +// 512 byte buffer that will be used for storing device sector data. +// - "Open" a file by calling SimpleFsOpen() and passing the 8.3-style filename +// as an 11-character string. +// - Read successive sectors from the file by using the convenience macro +// SimpleFsReadFileSector(). +// +// This API does not use any file handles so there is no way to open more than +// one file at a time. There is also no random access into the file, each +// sector must be read in sequence. +// +// The client of this API supplies a 512-byte buffer for storage of data read +// from the device. But this file also maintains an additional, internal +// 512-byte buffer used for caching FAT sectors. This minimizes the amount +// of device reads required to fetch cluster chain entries from the FAT. +// +// The application code (the client) must also provide a function used for +// reading sectors from the storage device, whatever it may be. This allows +// the code in this file to be independent of the type of device used for +// storing the file system. The name of the function is +// SimpleFsReadMediaSector(). +// +//***************************************************************************** + +//***************************************************************************** +// +// Setup a macro for handling packed data structures. +// +//***************************************************************************** +#if defined(ccs) || \ + defined(codered) || \ + defined(gcc) || \ + defined(rvmdk) || \ + defined(__ARMCC_VERSION) || \ + defined(sourcerygxx) +#define PACKED __attribute__((packed)) +#elif defined(ewarm) +#define PACKED +#else +#error "Unrecognized COMPILER!" +#endif + +//***************************************************************************** +// +// Instruct the IAR compiler to pack the following structures. +// +//***************************************************************************** +#ifdef ewarm +#pragma pack(1) +#endif + +//***************************************************************************** +// +// Structures for mapping FAT file system +// +//***************************************************************************** + +//***************************************************************************** +// +// The FAT16 boot sector extension +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8DriveNumber; + uint8_t ui8Reserved; + uint8_t ui8ExtSig; + uint32_t ui32Serial; + char pcVolumeLabel[11]; + char pcFsType[8]; + uint8_t ui8BootCode[448]; + uint16_t ui16Sig; +} +PACKED tBootExt16; + +//***************************************************************************** +// +// The FAT32 boot sector extension +// +//***************************************************************************** +typedef struct +{ + uint32_t ui32SectorsPerFAT; + uint16_t ui16Flags; + uint16_t ui16Version; + uint32_t ui32RootCluster; + uint16_t ui16InfoSector; + uint16_t ui16BootCopy; + uint8_t ui8Reserved[12]; + uint8_t ui8DriveNumber; + uint8_t ui8Reserved1; + uint8_t ui8ExtSig; + uint32_t ui32Serial; + char pcVolumeLabel[11]; + char pcFsType[8]; + uint8_t ui8BootCode[420]; + uint16_t ui16Sig; +} +PACKED tBootExt32; + +//***************************************************************************** +// +// The FAT16/32 boot sector main section +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8Jump[3]; + uint8_t i8OEMName[8]; + uint16_t ui16BytesPerSector; + uint8_t ui8SectorsPerCluster; + uint16_t ui16ReservedSectors; + uint8_t ui8NumFATs; + uint16_t ui16NumRootEntries; + uint16_t ui16TotalSectorsSmall; + uint8_t ui8MediaDescriptor; + uint16_t ui16SectorsPerFAT; + uint16_t ui16SectorsPerTrack; + uint16_t ui16NumberHeads; + uint32_t ui32HiddenSectors; + uint32_t ui32TotalSectorsBig; + union + { + tBootExt16 sExt16; + tBootExt32 sExt32; + } + PACKED ext; +} +PACKED tBootSector; + +//***************************************************************************** +// +// The partition table +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8Status; + uint8_t ui8CHSFirst[3]; + uint8_t ui8Type; + uint8_t ui8CHSLast[3]; + uint32_t ui32FirstSector; + uint32_t ui32NumBlocks; +} +PACKED tPartitionTable; + +//***************************************************************************** +// +// The master boot record (MBR) +// +//***************************************************************************** +typedef struct +{ + uint8_t ui8CodeArea[440]; + uint8_t ui8DiskSignature[4]; + uint8_t ui8Nulls[2]; + tPartitionTable sPartTable[4]; + uint16_t ui16Sig; +} +PACKED tMasterBootRecord; + +//***************************************************************************** +// +// The structure for a single directory entry +// +//***************************************************************************** +typedef struct +{ + char pcFileName[11]; + uint8_t ui8Attr; + uint8_t ui8Reserved; + uint8_t ui8CreateTime[5]; + uint8_t ui8LastDate[2]; + uint16_t ui16ClusterHi; + uint8_t ui8LastModified[4]; + uint16_t ui16Cluster; + uint32_t ui32FileSize; +} +PACKED tDirEntry; + +//***************************************************************************** +// +// Tell the IAR compiler that the remaining structures do not need to be +// packed. +// +//***************************************************************************** +#ifdef ewarm +#pragma pack() +#endif + +//***************************************************************************** +// +// This structure holds information about the layout of the file system +// +//***************************************************************************** +typedef struct +{ + uint32_t ui32FirstSector; + uint32_t ui32NumBlocks; + uint16_t ui16SectorsPerCluster; + uint16_t ui16MaxRootEntries; + uint32_t ui32SectorsPerFAT; + uint32_t ui32FirstFATSector; + uint32_t ui32LastFATSector; + uint32_t ui32FirstDataSector; + uint32_t ui32Type; + uint32_t ui32StartRootDir; +} +tPartitionInfo; + +static tPartitionInfo sPartInfo; + +//***************************************************************************** +// +// A pointer to the client provided sector buffer. +// +//***************************************************************************** +static uint8_t *g_pui8SectorBuf; + +//***************************************************************************** +// +// Initializes the simple file system +// +// \param pui8SectorBuf is a pointer to a caller supplied 512-byte buffer +// that will be used for holding sectors that are loaded from the media +// storage device. +// +// Reads the MBR, partition table, and boot record to find the logical +// structure of the file system. This function stores the file system +// structural data internally so that the remaining functions of the API +// can read the file system. +// +// To read data from the storage device, the function SimpleFsReadMediaSector() +// will be called. This function is not implemented here but must be +// implemented by the user of this simple file system. +// +// This file system support is extremely simple-minded. It will only +// find the first partition of a FAT16 or FAT32 formatted mass storage +// device. Only very minimal error checking is performed in order to save +// code space. +// +// \return Zero if successful, non-zero if there was an error. +// +//***************************************************************************** +uint32_t +SimpleFsInit(uint8_t *pui8SectorBuf) +{ + tMasterBootRecord *pMBR; + tPartitionTable *pPart; + tBootSector *pBoot; + + // + // Save the sector buffer pointer. The input parameter is assumed + // to be good. + // + g_pui8SectorBuf = pui8SectorBuf; + + // + // Get the MBR + // + if(SimpleFsReadMediaSector(0, pui8SectorBuf)) + { + return(1); + } + + // + // Verify MBR signature - bare minimum validation of MBR. + // + pMBR = (tMasterBootRecord *)pui8SectorBuf; + if(pMBR->ui16Sig != 0xAA55) + { + return(1); + } + + // + // See if this is a MBR or a boot sector. + // + pBoot = (tBootSector *)pui8SectorBuf; + if((strncmp(pBoot->ext.sExt16.pcFsType, "FAT", 3) != 0) && + (strncmp(pBoot->ext.sExt32.pcFsType, "FAT32", 5) != 0)) + { + // + // Get the first partition table + // + pPart = &(pMBR->sPartTable[0]); + + // + // Could optionally check partition type here ... + // + + // + // Get the partition location and size + // + sPartInfo.ui32FirstSector = pPart->ui32FirstSector; + sPartInfo.ui32NumBlocks = pPart->ui32NumBlocks; + + // + // Read the boot sector from the partition + // + if(SimpleFsReadMediaSector(sPartInfo.ui32FirstSector, pui8SectorBuf)) + { + return(1); + } + } + else + { + // + // Extract the number of sectors from the boot sector. + // + sPartInfo.ui32FirstSector = 0; + if(pBoot->ui16TotalSectorsSmall == 0) + { + sPartInfo.ui32NumBlocks = pBoot->ui32TotalSectorsBig; + } + else + { + sPartInfo.ui32NumBlocks = pBoot->ui16TotalSectorsSmall; + } + } + + // + // Get pointer to the boot sector + // + if(pBoot->ext.sExt16.ui16Sig != 0xAA55) + { + return(1); + } + + // + // Verify the sector size is 512. We can't deal with anything else + // + if(pBoot->ui16BytesPerSector != 512) + { + return(1); + } + + // + // Extract some info from the boot record + // + sPartInfo.ui16SectorsPerCluster = pBoot->ui8SectorsPerCluster; + sPartInfo.ui16MaxRootEntries = pBoot->ui16NumRootEntries; + + // + // Decide if we are dealing with FAT16 or FAT32. + // If number of root entries is 0, that suggests FAT32 + // + if(sPartInfo.ui16MaxRootEntries == 0) + { + // + // Confirm FAT 32 signature in the expected place + // + if(!strncmp(pBoot->ext.sExt32.pcFsType, "FAT32 ", 8)) + { + sPartInfo.ui32Type = 32; + } + else + { + return(1); + } + } + // + // Root entries is non-zero, suggests FAT16 + // + else + { + // + // Confirm FAT16 signature + // + if(!strncmp(pBoot->ext.sExt16.pcFsType, "FAT16 ", 8)) + { + sPartInfo.ui32Type = 16; + } + else + { + return(1); + } + } + + // + // Find the beginning of the FAT, in absolute sectors + // + sPartInfo.ui32FirstFATSector = sPartInfo.ui32FirstSector + + pBoot->ui16ReservedSectors; + + // + // Find the end of the FAT in absolute sectors. FAT16 and 32 + // are handled differently. + // + sPartInfo.ui32SectorsPerFAT = (sPartInfo.ui32Type == 16) ? + pBoot->ui16SectorsPerFAT : + pBoot->ext.sExt32.ui32SectorsPerFAT; + sPartInfo.ui32LastFATSector = sPartInfo.ui32FirstFATSector + + sPartInfo.ui32SectorsPerFAT - 1; + + // + // Find the start of the root directory and the data area. + // For FAT16, the root will be stored as an absolute sector number + // For FAT32, the root will be stored as the starting cluster of the root + // The data area start is the absolute first sector of the data area. + // + if(sPartInfo.ui32Type == 16) + { + sPartInfo.ui32StartRootDir = sPartInfo.ui32FirstFATSector + + (sPartInfo.ui32SectorsPerFAT * + pBoot->ui8NumFATs); + sPartInfo.ui32FirstDataSector = sPartInfo.ui32StartRootDir + + (sPartInfo.ui16MaxRootEntries / 16); + } + else + { + sPartInfo.ui32StartRootDir = pBoot->ext.sExt32.ui32RootCluster; + sPartInfo.ui32FirstDataSector = sPartInfo.ui32FirstFATSector + + (sPartInfo.ui32SectorsPerFAT * pBoot->ui8NumFATs); + } + + // + // At this point the file system has been initialized, so return + // success to the caller. + // + return(0); +} + +//***************************************************************************** +// +// Find the next cluster in a FAT chain +// +// \param ui32ThisCluster is the current cluster in the chain +// +// Reads the File Allocation Table (FAT) of the file system to find the +// next cluster in a chain of clusters. The current cluster is passed in +// and the next cluster in the chain will be returned. +// +// This function reads sectors from the storage device as needed in order +// to parse the FAT tables. Error handling is minimal since there is not +// much that can be done if an error is encountered. If any error is +// encountered, or if this is the last cluster in the chain, then 0 is +// returned. This signals the caller to stop traversing the chain (either +// due to error or end of chain). +// +// The function maintains a cache of a single sector from the FAT. It only +// reads in a new FAT sector if the requested cluster is not in the +// currently cached sector. +// +// \return Next cluster number if successful, 0 if this is the last cluster +// or any error is found. +// +//***************************************************************************** +static uint32_t +SimpleFsGetNextCluster(uint_fast32_t ui32ThisCluster) +{ + static uint8_t ui8FATCache[512]; + static uint_fast32_t ui32CachedFATSector = (uint32_t)-1; + uint_fast32_t ui32ClustersPerFATSector; + uint_fast32_t ui32ClusterIdx; + uint_fast32_t ui32FATSector; + uint_fast32_t ui32NextCluster; + uint_fast32_t ui32MaxCluster; + + // + // Compute the maximum possible reasonable cluster number + // + ui32MaxCluster = sPartInfo.ui32NumBlocks / sPartInfo.ui16SectorsPerCluster; + + // + // Make sure cluster input number is reasonable. If not then return + // 0 indicating error. + // + if((ui32ThisCluster < 2) || (ui32ThisCluster > ui32MaxCluster)) + { + return(0); + } + + // + // Compute the index of the requested cluster within the sector. + // Also compute the sector number within the FAT that contains the + // entry for the requested cluster. + // + ui32ClustersPerFATSector = (sPartInfo.ui32Type == 16) ? 256 : 128; + ui32ClusterIdx = ui32ThisCluster % ui32ClustersPerFATSector; + ui32FATSector = ui32ThisCluster / ui32ClustersPerFATSector; + + // + // Check to see if the FAT sector we need is already cached + // + if(ui32FATSector != ui32CachedFATSector) + { + // + // FAT sector we need is not cached, so read it in + // + if(SimpleFsReadMediaSector(sPartInfo.ui32FirstFATSector + ui32FATSector, + ui8FATCache) != 0) + { + // + // There was an error so mark cache as unavailable and return + // an error. + // + ui32CachedFATSector = (uint32_t)-1; + return(0); + } + + // + // Remember which FAT sector was just loaded into the cache. + // + ui32CachedFATSector = ui32FATSector; + } + + // + // Now look up the next cluster value from the cached sector, using this + // requested cluster as an index. It needs to be indexed as 16 or 32 + // bit values depending on whether it is FAT16 or 32 + // If the cluster value means last cluster, then return 0 + // + if(sPartInfo.ui32Type == 16) + { + ui32NextCluster = ((uint16_t *)ui8FATCache)[ui32ClusterIdx]; + if(ui32NextCluster >= 0xFFF8) + { + return(0); + } + } + else + { + ui32NextCluster = ((uint32_t *)ui8FATCache)[ui32ClusterIdx]; + if(ui32NextCluster >= 0x0FFFFFF8) + { + return(0); + } + } + + // + // Check new cluster value to make sure it is reasonable. If not then + // return 0 to indicate an error. + // + if((ui32NextCluster >= 2) && (ui32NextCluster <= ui32MaxCluster)) + { + return(ui32NextCluster); + } + else + { + return(0); + } +} + +//***************************************************************************** +// +// Read a single sector from a file into the sector buffer +// +// \param ui32StartCluster is the first cluster of the file, used to +// initialize the file read. Use 0 for successive sectors. +// +// Reads sectors in sequence from a file and stores the data in the sector +// buffer that was passed in the initial call to SimpleFsInit(). The function +// is initialized with the file to read by passing the starting cluster of +// the file. The function will initialize some static data and return. It +// does not read any file data when passed a starting cluster (and +// returns 0 - this is normal). +// +// Once the function has been initialized with the file's starting cluster, +// then successive calls should be made, passing a value of 0 for the +// cluster number. This tells the function to read the next sector from the +// file and store it in the sector buffer. The function remembers the last +// sector that was read, and each time it is called with a cluster value of +// 0, it will read the next sector. The function will traverse the FAT +// chain as needed to read all the sectors. When a sector has been +// successfully read from a file, the function will return non-zero. When +// there are no more sectors to read, or any error is encountered, the +// function will return 0. +// +// Note that the function always reads a whole sector, even if the end of +// a file does not fill the last sector. It is the responsibility of the +// caller to track the file size and to deal with a partially full last +// sector. +// +// \return Non-zero if a sector was read into the sector buffer, or +// 0 if there are no more sectors or if any error occurred. +// +//***************************************************************************** +uint32_t +SimpleFsGetNextFileSector(uint_fast32_t ui32StartCluster) +{ + static uint_fast32_t ui32WorkingCluster = 0; + static uint_fast32_t ui32WorkingSector; + uint_fast32_t ui32ReadSector; + + // + // If user specified starting cluster, then init the working cluster + // and sector values + // + if(ui32StartCluster) + { + ui32WorkingCluster = ui32StartCluster; + ui32WorkingSector = 0; + return(0); + } + + // + // Otherwise, make sure there is a valid working cluster already + // + else if(ui32WorkingCluster == 0) + { + return(0); + } + + // + // If the current working sector is the same as sectors per cluster, + // then that means that the next cluster needs to be loaded. + // + if(ui32WorkingSector == sPartInfo.ui16SectorsPerCluster) + { + // + // Get the next cluster in the chain for this file. + // + ui32WorkingCluster = SimpleFsGetNextCluster(ui32WorkingCluster); + + // + // If the next cluster is valid, then reset the working sector + // + if(ui32WorkingCluster) + { + ui32WorkingSector = 0; + } + + // + // Next cluster is not valid, or this was the end of the chain. + // Clear the working cluster and return an indication that no new + // sector data was loaded. + // + else + { + ui32WorkingCluster = 0; + return(0); + } + } + + // + // Calculate the sector to read from. It is the sector of the start + // of the working cluster, plus the working sector (the sector within + // the cluster), plus the offset to the start of the data area. + // Note that the cluster needs to be reduced by 2 in order to index + // properly into the data area. That is a feature of FAT file system. + // + ui32ReadSector = (ui32WorkingCluster - 2) * sPartInfo.ui16SectorsPerCluster; + ui32ReadSector += ui32WorkingSector; + ui32ReadSector += sPartInfo.ui32FirstDataSector; + + // + // Attempt to read the next sector from the cluster. If not successful, + // then clear the working cluster and return a non-success indication. + // + if(SimpleFsReadMediaSector(ui32ReadSector, g_pui8SectorBuf) != 0) + { + ui32WorkingCluster = 0; + return(0); + } + else + { + // + // Read was successful. Increment to the next sector of the cluster + // and return a success indication. + // + ui32WorkingSector++; + return(1); + } +} + +//***************************************************************************** +// +// Find a file in the root directory of the file system and open it for +// reading. +// +// \param pcName83 is an 11-character string that represents the 8.3 file +// name of the file to open. +// +// This function traverses the root directory of the file system to find +// the file name specified by the caller. Note that the file name must be +// an 8.3 file name that is 11 characters int32_t. The first 8 characters are +// the base name and the last 3 characters are the extension. If there are +// fewer characters in the base name or extension, the name should be padded +// with spaces. For example "myfile.bn" has fewer than 11 characters, and +// should be passed with padding like this: "myfile bn ". Note the extra +// spaces, and that the dot ('.') is not part of the string that is passed +// to this function. +// +// If the file is found, then it initializes the file for reading, and returns +// the file length. The file can be read by making successive calls to +// SimpleFsReadFileSector(). +// +// The function only searches the root directory and ignores any +// subdirectories. It also ignores any int32_t file name entries, looking only +// at the 8.3 file name for a match. +// +// \return The size of the file if it is found, or 0 if the file could not +// be found. +// +//***************************************************************************** +uint32_t +SimpleFsOpen(char *pcName83) +{ + tDirEntry *pDirEntry; + uint_fast32_t ui32DirSector; + uint_fast32_t ui32FirstCluster; + + // + // Find starting root dir sector, only used for FAT16 + // If FAT32 then this is the first cluster of root dir + // + ui32DirSector = sPartInfo.ui32StartRootDir; + + // + // For FAT32, root dir is like a file, so init a file read of the root dir + // + if(sPartInfo.ui32Type == 32) + { + SimpleFsGetNextFileSector(ui32DirSector); + } + + // + // Search the root directory entry for the firmware file + // + while(1) + { + // + // Read in a directory block. + // + if(sPartInfo.ui32Type == 16) + { + // + // For FAT16, read in a sector of the root directory + // + if(SimpleFsReadMediaSector(ui32DirSector, g_pui8SectorBuf)) + { + return(0); + } + } + else + { + // + // For FAT32, the root directory is treated like a file. + // The root directory sector will be loaded into the sector buf + // + if(SimpleFsGetNextFileSector(0) == 0) + { + return(0); + } + } + + // + // Initialize the directory entry pointer to the first entry of + // this sector. + // + pDirEntry = (tDirEntry *)g_pui8SectorBuf; + + // + // Iterate through all the directory entries in this sector + // + while((uint8_t *)pDirEntry < &g_pui8SectorBuf[512]) + { + // + // If the 8.3 filename of this entry matches the firmware + // file name, then we have a match, so return a pointer to + // this entry. + // + if(!strncmp(pDirEntry->pcFileName, pcName83, 11)) + { + // + // Compute the starting cluster of the file + // + ui32FirstCluster = pDirEntry->ui16Cluster; + if(sPartInfo.ui32Type == 32) + { + // + // For FAT32, add in the upper word of the + // starting cluster number + // + ui32FirstCluster += pDirEntry->ui16ClusterHi << 16; + } + + // + // Initialize the start of the file + // + SimpleFsGetNextFileSector(ui32FirstCluster); + return(pDirEntry->ui32FileSize); + } + + // + // Advance to the next entry in this sector. + // + pDirEntry++; + } + + // + // Need to get the next sector in the directory. Handled + // differently depending on if this is FAT16 or 32 + // + if(sPartInfo.ui32Type == 16) + { + // + // FAT16: advance sectors as int32_t as there are more possible + // entries. + // + sPartInfo.ui16MaxRootEntries -= 512 / 32; + if(sPartInfo.ui16MaxRootEntries) + { + ui32DirSector++; + } + else + { + // + // Ran out of directory entries and didn't find the file, + // so return a null. + // + return(0); + } + } + else + { + // + // FAT32: there is nothing to compute here. The next root + // dir sector will be fetched at the top of the loop + // + } + } +} + +//***************************************************************************** +// +// Close the Doxygen group. +// @} +// +//***************************************************************************** diff --git a/boards/ek-lm4f232/usb_stick_update/simple_fs.h b/boards/ek-lm4f232/usb_stick_update/simple_fs.h new file mode 100644 index 0000000..08f7894 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/simple_fs.h @@ -0,0 +1,105 @@ +//***************************************************************************** +// +// simple_fs.h - Header for simple FAT file system support +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#ifndef __SIMPLE_FS_H__ +#define __SIMPLE_FS_H__ + +//***************************************************************************** +// +// \addtogroup simple_fs_api +// @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Macro to read a single sector from a file that was opened with +// SimpleFsOpen() +// +// This convenience macro maps to the function SimpleFsGetNextFileSector() +// called with a parameter of 0. It should be used to read successive +// sectors from a file after the file has been opened with SimpleFsOpen(). +// +// When a sector is read, it is loaded into the sector buffer that was passed +// when SimpleFsInit() was called. +// +// A non-zero value will be returned to the caller as int32_t as successive +// sectors are successfully read into the sector buffer. At the end of the +// file, or if there is any error, then a value of 0 is returned. +// +// Note that the a whole sector is always loaded, even if the end of +// a file does not fill the last sector. It is the responsibility of the +// caller to track the file size and to deal with a partially full last +// sector. +// +// \return Non-zero if a sector was read into the sector buffer, or +// 0 if there are no more sectors or if any error occurred. +// +//***************************************************************************** +#define SimpleFsReadFileSector() SimpleFsGetNextFileSector(0) + +//***************************************************************************** +// +// Read a single sector from the application-specific storage device into +// the sector buffer. +// +// \param ui32Sector is the absolute sector number to read from the storage +// device +// \param pui8SectorBuf is a pointer to a 512 byte buffer where the sector +// data should be written +// +// This function is used by the simple file system functions to read a sector +// of data from a storage device. It must be implemented as part of the +// application specific code. For example, it could be used to read sectors +// from a USB mass storage device, or from an SD card, or any device that can +// be used to store a FAT file system. Note that the sector size is always +// assumed to be 512 bytes. +// +// \return Zero value if a sector of data was successfully read from the +// device and stored in the sector buffer, non-zero if not successful. +// +//***************************************************************************** +// +// This function to be supplied by the client +// +extern uint32_t SimpleFsReadMediaSector(uint_fast32_t ui32Sector, + uint8_t *pui8SectorBuf); + +//***************************************************************************** +// +// Close the Doxygen group. +// @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Functions to help with accessing the FAT file system on a storage device +// +//**************************************************************************** +extern uint32_t SimpleFsInit(uint8_t *pui8SectorBuf); +extern uint32_t SimpleFsOpen(char *pcName83); +extern uint32_t SimpleFsGetNextFileSector(uint_fast32_t ui32StartCluster); + +#endif // __SIMPLE_FS_H__ diff --git a/boards/ek-lm4f232/usb_stick_update/startup_ccs.c b/boards/ek-lm4f232/usb_stick_update/startup_ccs.c new file mode 100644 index 0000000..49bc1f5 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void AppForceUpdate(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + AppForceUpdate, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_stick_update/startup_ewarm.c b/boards/ek-lm4f232/usb_stick_update/startup_ewarm.c new file mode 100644 index 0000000..9eb457b --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void AppForceUpdate(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + AppForceUpdate, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_stick_update/startup_gcc.c b/boards/ek-lm4f232/usb_stick_update/startup_gcc.c new file mode 100644 index 0000000..5784463 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void AppForceUpdate(void); +extern void USB0HostIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + AppForceUpdate, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0HostIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/usb_stick_update/startup_rvmdk.S b/boards/ek-lm4f232/usb_stick_update/startup_rvmdk.S new file mode 100644 index 0000000..3b73160 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN AppForceUpdate + EXTERN USB0HostIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD AppForceUpdate ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0HostIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/usb_stick_update/usb_stick_update.c b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.c new file mode 100644 index 0000000..971d315 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.c @@ -0,0 +1,929 @@ +//***************************************************************************** +// +// usb_stick_update.c - Example to update flash from a USB memory stick. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include "inc/hw_flash.h" +#include "inc/hw_gpio.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/udma.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhmsc.h" +#include "simple_fs.h" + +//***************************************************************************** +// +// Defines the number of times to call to check if the attached device is +// ready. +// +//***************************************************************************** +#define USBMSC_DRIVE_RETRY 4 + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Memory Stick Updater (usb_stick_update)

      +//! +//! This example application behaves the same way as a boot loader. It resides +//! at the beginning of flash, and will read a binary file from a USB memory +//! stick and program it into another location in flash. Once the user +//! application has been programmed into flash, this program will always start +//! the user application until requested to load a new application. +//! +//! When this application starts, if there is a user application already in +//! flash (at \b APP_START_ADDRESS), then it will just run the user application. +//! It will attempt to load a new application from a USB memory stick under +//! the following conditions: +//! +//! - no user application is present at \b APP_START_ADDRESS +//! - the user application has requested an update by transferring control +//! to the updater +//! - the user holds down the eval board push button when the board is reset +//! +//! When this application is attempting to perform an update, it will wait +//! forever for a USB memory stick to be plugged in. Once a USB memory stick +//! is found, it will search the root directory for a specific file name, which +//! is \e FIRMWARE.BIN by default. This file must be a binary image of the +//! program you want to load (the .bin file), linked to run from the correct +//! address, at \b APP_START_ADDRESS. +//! +//! The USB memory stick must be formatted as a FAT16 or FAT32 file system +//! (the normal case), and the binary file must be located in the root +//! directory. Other files can exist on the memory stick but they will be +//! ignored. +// +//***************************************************************************** + +//***************************************************************************** +// +// The name of the binary firmware file on the USB stick. This is the user +// application that will be searched for and loaded into flash if it is found. +// Note that the name of the file must be 11 characters total, 8 for the base +// name and 3 for the extension. If the actual file name has fewer characters +// then it must be padded with spaces. This macro should not contain the dot +// "." for the extension. +// +// Examples: firmware.bin --> "FIRMWAREBIN" +// myfile.bn --> "MYFILE BN " +// +//***************************************************************************** +#define USB_UPDATE_FILENAME "FIRMWAREBIN" + +//***************************************************************************** +// +// The size of the flash for this microcontroller. +// +//***************************************************************************** +#define FLASH_SIZE (256 * 1024) + +//***************************************************************************** +// +// The starting address for the application that will be loaded into flash +// memory from the USB stick. This address must be high enough to be above +// the USB stick updater, and must be on a 1K boundary. +// Note that the application that will be loaded must also be linked to run +// from this address. +// +//***************************************************************************** +#define APP_START_ADDRESS 0x4800 + +//***************************************************************************** +// +// A memory location and value that is used to indicate that the application +// wants to force an update. +// +//***************************************************************************** +#define FORCE_UPDATE_ADDR 0x20004000 +#define FORCE_UPDATE_VALUE 0x1234cdef + +//***************************************************************************** +// +// The prototype for the function that is used to call the user application. +// +//***************************************************************************** +void CallApplication(uint_fast32_t ui32StartAddr); + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. In this application uDMA is only used for USB, +// so only the first 6 channels are needed. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +tDMAControlTable g_sDMAControlTable[6]; +#elif defined(ccs) +#pragma DATA_ALIGN(g_sDMAControlTable, 1024) +tDMAControlTable g_sDMAControlTable[6]; +#else +tDMAControlTable g_sDMAControlTable[6] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// The global that holds all of the host drivers in use in the application. +// In this case, only the MSC class is loaded. +// +//***************************************************************************** +static tUSBHostClassDriver const * const g_ppHostClassDrivers[] = +{ + &g_sUSBHostMSCClassDriver +}; + +//***************************************************************************** +// +// This global holds the number of class drivers in the g_ppHostClassDrivers +// list. +// +//***************************************************************************** +#define NUM_CLASS_DRIVERS (sizeof(g_ppHostClassDrivers) / \ + sizeof(g_ppHostClassDrivers[0])) + +//***************************************************************************** +// +// Hold the current state for the application. +// +//***************************************************************************** +volatile enum +{ + // + // No device is present. + // + STATE_NO_DEVICE, + + // + // Mass storage device is being enumerated. + // + STATE_DEVICE_ENUM, +} +g_eState; + +//***************************************************************************** +// +// The instance data for the MSC driver. +// +//***************************************************************************** +tUSBHMSCInstance *g_psMSCInstance = 0; + +//***************************************************************************** +// +// The size of the host controller's memory pool in bytes. +// +//***************************************************************************** +#define HCD_MEMORY_SIZE 128 + +//***************************************************************************** +// +// The memory pool to provide to the Host controller driver. +// +//***************************************************************************** +uint8_t g_pHCDPool[HCD_MEMORY_SIZE]; + +//***************************************************************************** +// +// A buffer for holding sectors read from the storage device +// +//***************************************************************************** +static uint8_t g_ui8SectorBuf[512]; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + for(;;) + { + } +} +#endif + +//***************************************************************************** +// +// Read a sector from the USB mass storage device. +// +// \param ui32Sector is the sector to read from the connected USB mass storage +// device (memory stick) +// \param pui8Buf is a pointer to the buffer where the sector data should be +// stored +// +// This is the application-specific implementation of a function to read +// sectors from a storage device, in this case a USB mass storage device. +// This function is called from the \e simple_fs.c file when it needs to read +// data from the storage device. +// +// \return Non-zero if data was read from the device, 0 if no data was read. +// +//***************************************************************************** +uint32_t +SimpleFsReadMediaSector(uint_fast32_t ui32Sector, uint8_t *pui8Buf) +{ + // + // Return the requested sector from the connected USB mass storage + // device. + // + return(USBHMSCBlockRead(g_psMSCInstance, ui32Sector, pui8Buf, 1)); +} + +//***************************************************************************** +// +// This is the callback from the MSC driver. +// +// \param ui32Instance is the driver instance which is needed when communicating +// with the driver. +// \param ui32Event is one of the events defined by the driver. +// \param pvData is a pointer to data passed into the initial call to register +// the callback. +// +// This function handles callback events from the MSC driver. The only events +// currently handled are the \b MSC_EVENT_OPEN and \b MSC_EVENT_CLOSE. This +// allows the main routine to know when an MSC device has been detected and +// enumerated and when an MSC device has been removed from the system. +// +// \return Returns \e true on success or \e false on failure. +// +//***************************************************************************** +static void +MSCCallback(tUSBHMSCInstance *psMSCInstance, uint32_t ui32Event, void *pvData) +{ + // + // Determine the event. + // + switch(ui32Event) + { + // + // Called when the device driver has successfully enumerated an MSC + // device. + // + case MSC_EVENT_OPEN: + { + // + // Proceed to the enumeration state. + // + g_eState = STATE_DEVICE_ENUM; + break; + } + + // + // Called when the device driver has been unloaded due to error or + // the device is no longer present. + // + case MSC_EVENT_CLOSE: + { + // + // Go back to the "no device" state and wait for a new connection. + // + g_eState = STATE_NO_DEVICE; + break; + } + + default: + { + break; + } + } +} + +//***************************************************************************** +// +// Read the application image from the file system and program it into flash. +// +// This function will attempt to open and read the firmware image file from +// the mass storage device. If the file is found it will be programmed into +// flash. The name of the file to be read is configured by the macro +// \b USB_UPDATE_FILENAME. It will be programmed into flash starting at the +// address specified by APP_START_ADDRESS. +// +// \return Zero if successful or non-zero if the file cannot be read or +// programmed. +// +//***************************************************************************** +uint32_t +ReadAppAndProgram(void) +{ + uint_fast32_t ui32FlashEnd; + uint_fast32_t ui32FileSize; + uint_fast32_t ui32DataSize; + uint_fast32_t ui32Remaining; + uint_fast32_t ui32ProgAddr; + uint_fast32_t ui32SavedRegs[2]; + volatile uint_fast32_t ui32Idx; + uint_fast32_t ui32DriveTimeout; + + // + // Initialize the drive timeout. + // + ui32DriveTimeout = USBMSC_DRIVE_RETRY; + + // + // Check to see if the mass storage device is ready. Some large drives + // take a while to be ready, so retry until they are ready. + // + while(USBHMSCDriveReady(g_psMSCInstance)) + { + // + // Wait about 500ms before attempting to check if the + // device is ready again. + // + SysCtlDelay(SysCtlClockGet()/(3*2)); + + // + // Decrement the retry count. + // + ui32DriveTimeout--; + + // + // If the timeout is hit then return with a failure. + // + if(ui32DriveTimeout == 0) + { + return(1); + } + } + + // + // Initialize the file system and return if error. + // + if(SimpleFsInit(g_ui8SectorBuf)) + { + return(1); + } + + // + // Attempt to open the firmware file, retrieving the file/image size. + // A file size of error means the file was not there, or there was an + // error. + // + ui32FileSize = SimpleFsOpen(USB_UPDATE_FILENAME); + if(ui32FileSize == 0) + { + return(1); + } + + // + // Get the size of flash. This is the ending address of the flash. + // If reserved space is configured, then the ending address is reduced + // by the amount of the reserved block. + // + ui32FlashEnd = FLASH_SIZE; +#ifdef FLASH_RSVD_SPACE + ui32FlashEnd -= FLASH_RSVD_SPACE; +#endif + + // + // If flash code protection is not used, then change the ending address + // to be the ending of the application image. This will be the highest + // flash page that will be erased and so only the necessary pages will + // be erased. If flash code protection is enabled, then all of the + // application area pages will be erased. + // +#ifndef FLASH_CODE_PROTECTION + ui32FlashEnd = ui32FileSize + APP_START_ADDRESS; +#endif + + // + // Check to make sure the file size is not too large to fit in the flash. + // If it is too large, then return an error. + // + if((ui32FileSize + APP_START_ADDRESS) > ui32FlashEnd) + { + return(1); + } + + // + // Enter a loop to erase all the requested flash pages beginning at the + // application start address (above the USB stick updater). + // + for(ui32Idx = APP_START_ADDRESS; ui32Idx < ui32FlashEnd; ui32Idx += 1024) + { + ROM_FlashErase(ui32Idx); + } + + // + // Enter a loop to read sectors from the application image file and + // program into flash. Start at the user app start address (above the USB + // stick updater). + // + ui32ProgAddr = APP_START_ADDRESS; + ui32Remaining = ui32FileSize; + while(SimpleFsReadFileSector()) + { + // + // Compute how much data was read from this sector and adjust the + // remaining amount. + // + ui32DataSize = ui32Remaining >= 512 ? 512 : ui32Remaining; + ui32Remaining -= ui32DataSize; + + // + // Special handling for the first block of the application. + // This block contains as the first two location the application's + // initial stack pointer and instruction pointer. The USB updater + // relied on the values in these locations to determine if a valid + // application is present. When there is a valid application the + // updater runs the user application. Otherwise the updater attempts + // to load a new application. + // In order to prevent a partially programmed imaged (due to some + // error occurring while programming), the first two locations are + // not programmed until all of the rest of the image has been + // successfully loaded into the flash. This way if there is some error, + // the updater will detect that a user application is not present and + // will not attempt to run it. + // + // For the first block, do not program the first two word locations + // (8 bytes). These two words will be programmed later, after + // everything else. + // + if(ui32ProgAddr == APP_START_ADDRESS) + { + uint32_t *pui32Temp; + + pui32Temp = (uint32_t *)g_ui8SectorBuf; + ui32SavedRegs[0] = pui32Temp[0]; + ui32SavedRegs[1] = pui32Temp[1]; + + // + // Call the function to program a block of flash. Skip the first + // two words (8 bytes) since these contain the initial SP and PC. + // + ROM_FlashProgram((uint32_t *)&g_ui8SectorBuf[8], + ui32ProgAddr + 8, + ((ui32DataSize - 8) + 3) & ~3); + } + + // + // All other blocks except the first block + // + else + { + // + // Call the function to program a block of flash. The length of the + // block passed to the flash function must be divisible by 4. + // + ROM_FlashProgram((uint32_t *)g_ui8SectorBuf, ui32ProgAddr, + (ui32DataSize + 3) & ~3); + } + + // + // If there is more image to program, then update the programming + // address. Progress will continue to the next iteration of + // the while loop. + // + if(ui32Remaining) + { + ui32ProgAddr += ui32DataSize; + } + + // + // Otherwise we are done programming so perform final steps. + // Program the first two words of the image that were saved earlier, + // and return a success indication. + // + else + { + ROM_FlashProgram((uint32_t *)ui32SavedRegs, APP_START_ADDRESS, + 8); + + return(0); + } + } + + // + // If we make it here, that means that an attempt to read a sector of + // data from the device was not successful. That means that the complete + // user app has not been programmed into flash, so just return an error + // indication. + // + return(1); +} + +//***************************************************************************** +// +// This is the main routine for performing an update from a mass storage +// device. +// +// This function forms the main loop of the USB stick updater. It polls for +// a USB mass storage device to be connected, Once a device is connected +// it will attempt to read a firmware image from the device and load it into +// flash. +// +// \return None. +// +//***************************************************************************** +void +UpdaterUSB(void) +{ + // + // Loop forever, running the USB host driver. + // + while(1) + { + USBHCDMain(); + + // + // Check for a state change from the USB driver. + // + switch(g_eState) + { + // + // This state means that a mass storage device has been + // plugged in and enumerated. + // + case STATE_DEVICE_ENUM: + { + // + // Attempt to read the application image from the storage + // device and load it into flash memory. + // + if(ReadAppAndProgram()) + { + // + // There was some error reading or programming the app, + // so reset the state to no device which will cause a + // wait for a new device to be plugged in. + // + g_eState = STATE_NO_DEVICE; + } + else + { + // + // User app load and programming was successful, so reboot + // the micro. Perform a software reset request. This + // will cause the microcontroller to reset; no further + // code will be executed. + // + HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | + NVIC_APINT_SYSRESETREQ; + + // + // The microcontroller should have reset, so this should + // never be reached. Just in case, loop forever. + // + while(1) + { + } + } + break; + } + + // + // This state means that there is no device present, so just + // do nothing until something is plugged in. + // + case STATE_NO_DEVICE: + { + break; + } + } + } +} + +//***************************************************************************** +// +// Configure the USB controller and power the bus. +// +// This function configures the USB controller for host operation. +// It is assumed that the main system clock has been configured at this point. +// +// \return None. +// +//***************************************************************************** +void +ConfigureUSBInterface(void) +{ + // + // Enable the uDMA controller and set up the control table base. + // This is required by usblib. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + uDMAEnable(); + uDMAControlBaseSet(g_sDMAControlTable); + + // + // Enable the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + + // + // Set the USB pins to be controlled by the USB controller. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + ROM_GPIOPinConfigure(GPIO_PG4_USB0EPEN); + ROM_GPIOPinTypeUSBDigital(GPIO_PORTG_BASE, GPIO_PIN_4); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Register the host class driver + // + USBHCDRegisterDrivers(0, g_ppHostClassDrivers, NUM_CLASS_DRIVERS); + + // + // Open an instance of the mass storage class driver. + // + g_psMSCInstance = USBHMSCDriveOpen(0, MSCCallback); + + // + // Initialize the power configuration. This sets the power enable signal + // to be active high and does not enable the power fault. + // + USBHCDPowerConfigInit(0, USBHCD_VBUS_AUTO_HIGH | USBHCD_VBUS_FILTER); + + // + // Force the USB mode to host with no callback on mode changes since + // there should not be any. + // + USBStackModeSet(0, eUSBModeForceHost, 0); + + // + // Wait 10ms for the pin to go low. + // + SysCtlDelay(SysCtlClockGet()/100); + + // + // Initialize the host controller. + // + USBHCDInit(0, g_pHCDPool, HCD_MEMORY_SIZE); +} + +//***************************************************************************** +// +// Generic configuration is handled in this function. +// +// This function is called by the start up code to perform any configuration +// necessary before calling the update routine. It is responsible for setting +// the system clock to the expected rate and setting flash programming +// parameters prior to calling ConfigureUSBInterface() to set up the USB +// hardware. +// +// \return None. +// +//***************************************************************************** +void +UpdaterMain(void) +{ + // + // Make sure NVIC points at the correct vector table. + // + HWREG(NVIC_VTABLE) = 0; + + // + // Set the system clock to run at 50MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure the USB interface and power the bus. + // + ConfigureUSBInterface(); + + // + // Call the updater function. This will attempt to load a new image + // into flash from a USB memory stick. + // + UpdaterUSB(); +} + +//***************************************************************************** +// +// Main entry point for the USB stick update example. +// +// This function will check to see if a flash update should be performed from +// the USB memory stick, or if the user application should just be run without +// any update. +// +// The following checks are made, any of which mean that an update should be +// performed: +// - the PC and SP for the user app do not appear to be valid +// - a memory location contains a certain value, meaning the user app wants +// to force an update +// - the user button on the eval board is being pressed, meaning the user wants +// to force an update even if there is a valid user app in memory +// +// If any of the above checks are true, then that means that an update should +// be attempted. The USB stick updater will then wait for a USB stick to be +// plugged in, and once it is look for a firmware update file. +// +// If none of the above checks are true, then the user application that is +// already in flash is run and no update is performed. +// +// \return None. +// +//***************************************************************************** +int +main(void) +{ + uint32_t *pui32App; + + // + // See if the first location is 0xfffffffff or something that does not + // look like a stack pointer, or if the second location is 0xffffffff or + // something that does not look like a reset vector. + // + pui32App = (uint32_t *)APP_START_ADDRESS; + if((pui32App[0] == 0xffffffff) || + ((pui32App[0] & 0xfff00000) != 0x20000000) || + (pui32App[1] == 0xffffffff) || + ((pui32App[1] & 0xfff00001) != 0x00000001)) + { + // + // App starting stack pointer or PC is not valid, so force an update. + // + UpdaterMain(); + } + + // + // Check to see if the application has requested an update + // + if(HWREG(FORCE_UPDATE_ADDR) == FORCE_UPDATE_VALUE) + { + HWREG(FORCE_UPDATE_ADDR) = 0; + UpdaterMain(); + } + + // + // Enable the GPIO input for the user button. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM); + ROM_GPIODirModeSet(GPIO_PORTM_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(GPIO_PORTM_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Check if the button is pressed, if so then force an update. + // + if(ROM_GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_4) == 0) + { + UpdaterMain(); + } + + // + // If we get to here that means that none of the conditions that should + // cause an update are true. Therefore, call the application. + // + CallApplication(APP_START_ADDRESS); +} + +//***************************************************************************** +// +// This function is called from the application to request an update. The +// address of this function is stored in the SVC vector at offset 0x2C, so +// the user application can call it by using a statement like this: +// +// (*((void (*)(void))(*(uint32_t *)0x2c)))(); +// +//***************************************************************************** +void +AppForceUpdate(void) +{ + // + // Set a value in a memory location to indicate that the app requests + // an update. Then cause the processor to reset. + // + HWREG(FORCE_UPDATE_ADDR) = FORCE_UPDATE_VALUE; + HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ; +} + +//***************************************************************************** +// +// This function is used to call the user application. It will set the NVIC +// to point at the user app's vector table, load up the user app's stack +// pointer, and then jump to the application. +// +// This function must be programmed in assembly since it needs to directly +// manipulate the value in the stack pointer, and because it needs to perform +// a direct branch to the user app and not a function call (bl). +// +//***************************************************************************** +#if defined(codered) || defined(gcc) || defined(sourcerygxx) +void __attribute__((naked)) +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table to the beginning of the app in flash. + // + HWREG(NVIC_VTABLE) = ui32StartAddr; + + // + // Load the stack pointer from the application's vector table. + // + __asm(" ldr r1, [r0]\n" + " mov sp, r1"); + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + __asm(" ldr r0, [r0, #4]\n" + " bx r0\n"); +} +#elif defined(ewarm) +void +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table to the beginning of the app in flash. + // + HWREG(NVIC_VTABLE) = ui32StartAddr; + + // + // Load the stack pointer from the application's vector table. + // + __asm(" ldr r1, [r0]\n" + " mov sp, r1"); + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + __asm(" ldr r0, [r0, #4]\n" + " bx r0\n"); +} +#elif defined(rvmdk) || defined(__ARMCC_VERSION) +__asm void +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table address to the beginning of the application. + // + ldr r1, =0xe000ed08 + str r0, [r1] + + // + // Load the stack pointer from the application's vector table. + // + ldr r1, [r0] + mov sp, r1 + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + ldr r0, [r0, #4] + bx r0 +} +#elif defined(ccs) +void +CallApplication(uint_fast32_t ui32StartAddr) +{ + // + // Set the vector table to the beginning of the app in flash. + // + HWREG(NVIC_VTABLE) = ui32StartAddr; + + // + // Load the stack pointer from the application's vector table. + // + __asm(" ldr r1, [r0]\n" + " mov sp, r1\n"); + + // + // Load the initial PC from the application's vector table and branch to + // the application's entry point. + // + __asm(" ldr r0, [r0, #4]\n" + " bx r0\n"); +} +#else +#error Undefined compiler! +#endif + diff --git a/boards/ek-lm4f232/usb_stick_update/usb_stick_update.ewd b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/usb_stick_update/usb_stick_update.ewp b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.ewp new file mode 100644 index 0000000..13ba7fc --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.ewp @@ -0,0 +1,790 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\simple_fs.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\usb_stick_update.c + + + diff --git a/boards/ek-lm4f232/usb_stick_update/usb_stick_update.icf b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.icf new file mode 100644 index 0000000..38dc4e1 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_stick_update.icf - Linker configuration file for usb_stick_update. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/usb_stick_update/usb_stick_update.ld b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.ld new file mode 100644 index 0000000..8f08b67 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_stick_update.ld - Linker configuration file for usb_stick_update. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/usb_stick_update/usb_stick_update.sct b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.sct new file mode 100644 index 0000000..20ec96d --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_stick_update.sct - Linker configuration file for usb_stick_update. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/usb_stick_update/usb_stick_update.uvopt b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.uvopt new file mode 100644 index 0000000..493928a --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_stick_update + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + simple_fs.c + simple_fs.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_stick_update.c + usb_stick_update.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/usb_stick_update/usb_stick_update.uvproj b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.uvproj new file mode 100644 index 0000000..ac7cace --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/usb_stick_update.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_stick_update + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_stick_update + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_stick_update.bin .\rvmdk\usb_stick_update.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_stick_update.sct + + + --entry Reset_Handler + + + + + + + + Source + + + simple_fs.c + 1 + simple_fs.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + usb_stick_update.c + 1 + .\usb_stick_update.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/usb_stick_update/usb_stick_update_ccs.cmd b/boards/ek-lm4f232/usb_stick_update/usb_stick_update_ccs.cmd new file mode 100644 index 0000000..009f676 --- /dev/null +++ b/boards/ek-lm4f232/usb_stick_update/usb_stick_update_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_stick_update_ccs.cmd - CCS linker configuration file for usb_stick_update. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-lm4f232/watchdog/Makefile b/boards/ek-lm4f232/watchdog/Makefile new file mode 100644 index 0000000..6dab20a --- /dev/null +++ b/boards/ek-lm4f232/watchdog/Makefile @@ -0,0 +1,88 @@ +#****************************************************************************** +# +# Makefile - Rules for building the watchdog example. +# +# Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PGE + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the watchdog example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/watchdog.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the watchdog example. +# +${COMPILER}/watchdog.axf: ${COMPILER}/buttons.o +${COMPILER}/watchdog.axf: ${COMPILER}/cfal96x64x16.o +${COMPILER}/watchdog.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/watchdog.axf: ${COMPILER}/watchdog.o +${COMPILER}/watchdog.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/watchdog.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/watchdog.axf: watchdog.ld +SCATTERgcc_watchdog=watchdog.ld +ENTRY_watchdog=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-lm4f232/watchdog/ccs/.ccsimportspec b/boards/ek-lm4f232/watchdog/ccs/.ccsimportspec new file mode 100644 index 0000000..6379126 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-lm4f232/watchdog/ccs/.ccsproject b/boards/ek-lm4f232/watchdog/ccs/.ccsproject new file mode 100644 index 0000000..e423367 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-lm4f232/watchdog/ccs/.cproject b/boards/ek-lm4f232/watchdog/ccs/.cproject new file mode 100644 index 0000000..c509d44 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/watchdog/ccs/.project b/boards/ek-lm4f232/watchdog/ccs/.project new file mode 100644 index 0000000..349a44f --- /dev/null +++ b/boards/ek-lm4f232/watchdog/ccs/.project @@ -0,0 +1,60 @@ + + + watchdog + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/watchdog/startup_ccs.c + + + watchdog.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/watchdog/watchdog.c + + + watchdog_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-lm4f232/watchdog/watchdog_ccs.cmd + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/buttons.c + + + drivers/cfal96x64x16.c + 1 + SW_ROOT/examples/boards/ek-lm4f232/drivers/cfal96x64x16.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-lm4f232/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-lm4f232/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-lm4f232/watchdog/ccs/Debug/watchdog.bin b/boards/ek-lm4f232/watchdog/ccs/Debug/watchdog.bin new file mode 100644 index 0000000..7b6da9b Binary files /dev/null and b/boards/ek-lm4f232/watchdog/ccs/Debug/watchdog.bin differ diff --git a/boards/ek-lm4f232/watchdog/ccs/Debug/watchdog.out b/boards/ek-lm4f232/watchdog/ccs/Debug/watchdog.out new file mode 100644 index 0000000..d2702e7 Binary files /dev/null and b/boards/ek-lm4f232/watchdog/ccs/Debug/watchdog.out differ diff --git a/boards/ek-lm4f232/watchdog/ccs/macros.ini_initial b/boards/ek-lm4f232/watchdog/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-lm4f232/watchdog/ccs/target_config.ccxml b/boards/ek-lm4f232/watchdog/ccs/target_config.ccxml new file mode 100644 index 0000000..c8d43ba --- /dev/null +++ b/boards/ek-lm4f232/watchdog/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-lm4f232/watchdog/ewarm/Exe/watchdog.bin b/boards/ek-lm4f232/watchdog/ewarm/Exe/watchdog.bin new file mode 100644 index 0000000..13d896c Binary files /dev/null and b/boards/ek-lm4f232/watchdog/ewarm/Exe/watchdog.bin differ diff --git a/boards/ek-lm4f232/watchdog/ewarm/Exe/watchdog.out b/boards/ek-lm4f232/watchdog/ewarm/Exe/watchdog.out new file mode 100644 index 0000000..6464c6c Binary files /dev/null and b/boards/ek-lm4f232/watchdog/ewarm/Exe/watchdog.out differ diff --git a/boards/ek-lm4f232/watchdog/gcc/watchdog.axf b/boards/ek-lm4f232/watchdog/gcc/watchdog.axf new file mode 100644 index 0000000..2f759ac Binary files /dev/null and b/boards/ek-lm4f232/watchdog/gcc/watchdog.axf differ diff --git a/boards/ek-lm4f232/watchdog/gcc/watchdog.bin b/boards/ek-lm4f232/watchdog/gcc/watchdog.bin new file mode 100644 index 0000000..a30fc8e Binary files /dev/null and b/boards/ek-lm4f232/watchdog/gcc/watchdog.bin differ diff --git a/boards/ek-lm4f232/watchdog/readme.txt b/boards/ek-lm4f232/watchdog/readme.txt new file mode 100644 index 0000000..bc3dbeb --- /dev/null +++ b/boards/ek-lm4f232/watchdog/readme.txt @@ -0,0 +1,28 @@ +Watchdog + +This example application demonstrates the use of the watchdog as a simple +heartbeat for the system. If the watchdog is not periodically fed, it will +reset the system. Each time the watchdog is fed, the LED is inverted so +that it is easy to see that it is being fed, which occurs once every +second. To stop the watchdog being fed and, hence, cause a system reset, +press the select button. + +------------------------------------------------------------------------------- + +Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. diff --git a/boards/ek-lm4f232/watchdog/rvmdk/watchdog.axf b/boards/ek-lm4f232/watchdog/rvmdk/watchdog.axf new file mode 100644 index 0000000..daa69b3 Binary files /dev/null and b/boards/ek-lm4f232/watchdog/rvmdk/watchdog.axf differ diff --git a/boards/ek-lm4f232/watchdog/rvmdk/watchdog.bin b/boards/ek-lm4f232/watchdog/rvmdk/watchdog.bin new file mode 100644 index 0000000..e51e150 Binary files /dev/null and b/boards/ek-lm4f232/watchdog/rvmdk/watchdog.bin differ diff --git a/boards/ek-lm4f232/watchdog/startup_ccs.c b/boards/ek-lm4f232/watchdog/startup_ccs.c new file mode 100644 index 0000000..0a8d385 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void WatchdogIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + WatchdogIntHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/watchdog/startup_ewarm.c b/boards/ek-lm4f232/watchdog/startup_ewarm.c new file mode 100644 index 0000000..2d4de17 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void WatchdogIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + WatchdogIntHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/watchdog/startup_gcc.c b/boards/ek-lm4f232/watchdog/startup_gcc.c new file mode 100644 index 0000000..50ea731 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void WatchdogIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + WatchdogIntHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-lm4f232/watchdog/startup_rvmdk.S b/boards/ek-lm4f232/watchdog/startup_rvmdk.S new file mode 100644 index 0000000..1dfb47a --- /dev/null +++ b/boards/ek-lm4f232/watchdog/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN WatchdogIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD WatchdogIntHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-lm4f232/watchdog/watchdog.c b/boards/ek-lm4f232/watchdog/watchdog.c new file mode 100644 index 0000000..7f4fc75 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/watchdog.c @@ -0,0 +1,268 @@ +//***************************************************************************** +// +// watchdog.c - Watchdog timer example. +// +// Copyright (c) 2008-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/watchdog.h" +#include "driverlib/rom.h" +#include "grlib/grlib.h" +#include "drivers/cfal96x64x16.h" +#include "drivers/buttons.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Watchdog (watchdog)

      +//! +//! This example application demonstrates the use of the watchdog as a simple +//! heartbeat for the system. If the watchdog is not periodically fed, it will +//! reset the system. Each time the watchdog is fed, the LED is inverted so +//! that it is easy to see that it is being fed, which occurs once every +//! second. To stop the watchdog being fed and, hence, cause a system reset, +//! press the select button. +// +//***************************************************************************** + +//***************************************************************************** +// +// Graphics context used to show text on the display. +// +//***************************************************************************** +tContext g_sContext; + +//***************************************************************************** +// +// Flag to tell the watchdog interrupt handler whether or not to clear the +// interrupt (feed the watchdog). +// +//***************************************************************************** +volatile bool g_bFeedWatchdog = true; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the watchdog. This feeds the dog (so that the +// processor does not get reset) and winks the LED connected to GPIO B3. +// +//***************************************************************************** +void +WatchdogIntHandler(void) +{ + // + // If we have been told to stop feeding the watchdog, return immediately + // without clearing the interrupt. This will cause the system to reset + // next time the watchdog interrupt fires. + // + if(!g_bFeedWatchdog) + { + return; + } + + // + // Clear the watchdog interrupt. + // + ROM_WatchdogIntClear(WATCHDOG0_BASE); + + // + // Invert the GPIO PF3 value. + // + ROM_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, + (ROM_GPIOPinRead(GPIO_PORTG_BASE, GPIO_PIN_2) ^ + GPIO_PIN_2)); +} + +//***************************************************************************** +// +// This function is called when the select button is pressed. +// +//***************************************************************************** +static int32_t +SelectButtonPressed(void) +{ + // + // Find the X center of the display + // + int32_t i32CenterX = GrContextDpyWidthGet(&g_sContext) / 2; + + // + // Let the user know that the button has been pressed and that the + // watchdog is being starved. + // + GrStringDrawCentered(&g_sContext, "Starving", -1, i32CenterX, 14, 1); + GrStringDrawCentered(&g_sContext, "Watchdog", -1, i32CenterX, 24, 1); + GrStringDrawCentered(&g_sContext, "System", -1, i32CenterX, 36, 1); + GrStringDrawCentered(&g_sContext, " will ", -1, i32CenterX, 46, 1); + GrStringDrawCentered(&g_sContext, "reset ...", -1, i32CenterX, 56, 1); + + // + // Set the flag that tells the interrupt handler not to clear the + // watchdog interrupt. + // + g_bFeedWatchdog = false; + + return(0); +} + +//***************************************************************************** +// +// This example demonstrates the use of the watchdog timer. +// +//***************************************************************************** +int +main(void) +{ + int_fast32_t i32CenterX; + tRectangle sRect; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the display and buttons drivers. + // + CFAL96x64x16Init(); + ButtonsInit(); + + // + // Initialize the graphics context and find the middle X coordinate. + // + GrContextInit(&g_sContext, &g_sCFAL96x64x16); + i32CenterX = GrContextDpyWidthGet(&g_sContext) / 2; + + // + // Fill the top part of the screen with blue to create the banner. + // + sRect.i16XMin = 0; + sRect.i16YMin = 0; + sRect.i16XMax = GrContextDpyWidthGet(&g_sContext) - 1; + sRect.i16YMax = 9; + GrContextForegroundSet(&g_sContext, ClrDarkBlue); + GrRectFill(&g_sContext, &sRect); + + // + // Change foreground for white text. + // + GrContextForegroundSet(&g_sContext, ClrWhite); + + // + // Put the application name in the middle of the banner. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "watchdog", -1, i32CenterX, 4, 0); + + // + // Show the state and offer some instructions to the user. + // + GrContextFontSet(&g_sContext, g_psFontFixed6x8); + GrStringDrawCentered(&g_sContext, "Feeding", -1, i32CenterX, 14, 1); + GrStringDrawCentered(&g_sContext, "Watchdog", -1, i32CenterX, 24, 1); + GrStringDrawCentered(&g_sContext, "Press", -1, i32CenterX, 36, 1); + GrStringDrawCentered(&g_sContext, "Select", -1, i32CenterX, 46, 1); + GrStringDrawCentered(&g_sContext, "to stop", -1, i32CenterX, 56, 1); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_WDOG0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + + // + // Enable processor interrupts. + // + ROM_IntMasterEnable(); + + // + // Set GPIO PG2 as an output. This drives an LED on the board that will + // toggle when a watchdog interrupt is processed. + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE, GPIO_PIN_2); + ROM_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, 0); + + // + // Enable the watchdog interrupt. + // + ROM_IntEnable(INT_WATCHDOG); + + // + // Set the period of the watchdog timer. + // + ROM_WatchdogReloadSet(WATCHDOG0_BASE, ROM_SysCtlClockGet()); + + // + // Enable reset generation from the watchdog timer. + // + ROM_WatchdogResetEnable(WATCHDOG0_BASE); + + // + // Enable the watchdog timer. + // + ROM_WatchdogEnable(WATCHDOG0_BASE); + + // + // Loop forever while the LED winks as watchdog interrupts are handled. + // + while(1) + { + // + // Poll for the select button pressed + // + uint8_t ui8Buttons = ButtonsPoll(0, 0); + if(ui8Buttons & SELECT_BUTTON) + { + SelectButtonPressed(); + while(1) + { + } + } + } +} diff --git a/boards/ek-lm4f232/watchdog/watchdog.ewd b/boards/ek-lm4f232/watchdog/watchdog.ewd new file mode 100644 index 0000000..5e62dcd --- /dev/null +++ b/boards/ek-lm4f232/watchdog/watchdog.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-lm4f232/watchdog/watchdog.ewp b/boards/ek-lm4f232/watchdog/watchdog.ewp new file mode 100644 index 0000000..4bc3563 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/watchdog.ewp @@ -0,0 +1,795 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\grlib\ewarm\Exe\grlib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\watchdog.c + + + diff --git a/boards/ek-lm4f232/watchdog/watchdog.icf b/boards/ek-lm4f232/watchdog/watchdog.icf new file mode 100644 index 0000000..95f0ae1 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/watchdog.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// watchdog.icf - Linker configuration file for watchdog. +// +// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-lm4f232/watchdog/watchdog.ld b/boards/ek-lm4f232/watchdog/watchdog.ld new file mode 100644 index 0000000..fc9793b --- /dev/null +++ b/boards/ek-lm4f232/watchdog/watchdog.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * watchdog.ld - Linker configuration file for watchdog. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-lm4f232/watchdog/watchdog.sct b/boards/ek-lm4f232/watchdog/watchdog.sct new file mode 100644 index 0000000..e8ebf8f --- /dev/null +++ b/boards/ek-lm4f232/watchdog/watchdog.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; watchdog.sct - Linker configuration file for watchdog. +; +; Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-lm4f232/watchdog/watchdog.uvopt b/boards/ek-lm4f232/watchdog/watchdog.uvopt new file mode 100644 index 0000000..ec58b6b --- /dev/null +++ b/boards/ek-lm4f232/watchdog/watchdog.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + watchdog + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PGE.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\cfal96x64x16.c + cfal96x64x16.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\watchdog.c + watchdog.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\grlib\rvmdk\grlib.lib + grlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-lm4f232/watchdog/watchdog.uvproj b/boards/ek-lm4f232/watchdog/watchdog.uvproj new file mode 100644 index 0000000..55e2d1e --- /dev/null +++ b/boards/ek-lm4f232/watchdog/watchdog.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + watchdog + 0x4 + ARM-ADS + + + TM4C123GH6PGE + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + watchdog + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\watchdog.bin .\rvmdk\watchdog.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PGE TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + watchdog.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + cfal96x64x16.c + 1 + ..\drivers\cfal96x64x16.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + watchdog.c + 1 + .\watchdog.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + grlib.lib + 4 + ..\..\..\..\grlib\rvmdk\grlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-lm4f232/watchdog/watchdog_ccs.cmd b/boards/ek-lm4f232/watchdog/watchdog_ccs.cmd new file mode 100644 index 0000000..fada4f0 --- /dev/null +++ b/boards/ek-lm4f232/watchdog/watchdog_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * watchdog_ccs.cmd - CCS linker configuration file for watchdog. + * + * Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-LM4F232 Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-tm4c123gxl/Makefile b/boards/ek-tm4c123gxl/Makefile new file mode 100644 index 0000000..162b209 --- /dev/null +++ b/boards/ek-tm4c123gxl/Makefile @@ -0,0 +1,61 @@ +#****************************************************************************** +# +# Makefile - Rules for building the ek-tm4c123gxl examples. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# A list of the directories containing the examples. +# +DIRS=bitband \ + blinky \ + freertos_demo \ + gpio_jtag \ + hello \ + interrupts \ + mpu_fault \ + project0 \ + qs-rgb \ + timers \ + uart_echo \ + udma_demo \ + usb_dev_bulk \ + usb_dev_gamepad \ + usb_dev_serial + +# +# The default rule, which causes the examples to be built. +# +all: + @for i in ${DIRS}; \ + do \ + make -C $${i} || exit $$?; \ + done + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${wildcard *~} __dummy__ + @-for i in ${DIRS}; \ + do \ + make -C $${i} clean; \ + done diff --git a/boards/ek-tm4c123gxl/bitband/Makefile b/boards/ek-tm4c123gxl/bitband/Makefile new file mode 100644 index 0000000..77b33d7 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/Makefile @@ -0,0 +1,86 @@ +#****************************************************************************** +# +# Makefile - Rules for building the bitband example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the bitband example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/bitband.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the bitband example. +# +${COMPILER}/bitband.axf: ${COMPILER}/bitband.o +${COMPILER}/bitband.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/bitband.axf: ${COMPILER}/uartstdio.o +${COMPILER}/bitband.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/bitband.axf: bitband.ld +SCATTERgcc_bitband=bitband.ld +ENTRY_bitband=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/bitband/bitband.c b/boards/ek-tm4c123gxl/bitband/bitband.c new file mode 100644 index 0000000..1b1d20e --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/bitband.c @@ -0,0 +1,262 @@ +//***************************************************************************** +// +// bitband.c - Bit-band manipulation example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/fpu.h" +#include "driverlib/pin_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/rom.h" +#include "driverlib/uart.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Bit-Banding (bitband)

      +//! +//! This example application demonstrates the use of the bit-banding +//! capabilities of the Cortex-M4F microprocessor. All of SRAM and all of the +//! peripherals reside within bit-band regions, meaning that bit-banding +//! operations can be applied to any of them. In this example, a variable in +//! SRAM is set to a particular value one bit at a time using bit-banding +//! operations (it would be more efficient to do a single non-bit-banded write; +//! this simply demonstrates the operation of bit-banding). +// +//***************************************************************************** + + +//***************************************************************************** +// +// The value that is to be modified via bit-banding. +// +//***************************************************************************** +static volatile uint32_t g_ui32Value; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + while(1) + { + // + // Hang on runtime error. + // + } +} +#endif + +//***************************************************************************** +// +// Delay for the specified number of seconds. Depending upon the current +// SysTick value, the delay will be between N-1 and N seconds (i.e. N-1 full +// seconds are guaranteed, along with the remainder of the current second). +// +//***************************************************************************** +void +Delay(uint32_t ui32Seconds) +{ + // + // Loop while there are more seconds to wait. + // + while(ui32Seconds--) + { + // + // Wait until the SysTick value is less than 1000. + // + while(ROM_SysTickValueGet() > 1000) + { + } + + // + // Wait until the SysTick value is greater than 1000. + // + while(ROM_SysTickValueGet() < 1000) + { + } + } +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example demonstrates the use of bit-banding to set individual bits +// within a word of SRAM. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Errors, ui32Idx; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the UART interface. + // + ConfigureUART(); + + UARTprintf("\033[2JBit banding...\n"); + + // + // Set up and enable the SysTick timer. It will be used as a reference + // for delay loops. The SysTick timer period will be set up for one + // second. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet()); + ROM_SysTickEnable(); + + // + // Set the value and error count to zero. + // + g_ui32Value = 0; + ui32Errors = 0; + + // + // Print the initial value to the UART. + // + UARTprintf("\r%08x", g_ui32Value); + + // + // Delay for 1 second. + // + Delay(1); + + // + // Set the value to 0xdecafbad using bit band accesses to each individual + // bit. + // + for(ui32Idx = 0; ui32Idx < 32; ui32Idx++) + { + // + // Set this bit. + // + HWREGBITW(&g_ui32Value, 31 - ui32Idx) = (0xdecafbad >> + (31 - ui32Idx)) & 1; + + // + // Print the current value to the UART. + // + UARTprintf("\r%08x", g_ui32Value); + + // + // Delay for 1 second. + // + Delay(1); + } + + // + // Make sure that the value is 0xdecafbad. + // + if(g_ui32Value != 0xdecafbad) + { + ui32Errors++; + } + + // + // Make sure that the individual bits read back correctly. + // + for(ui32Idx = 0; ui32Idx < 32; ui32Idx++) + { + if(HWREGBITW(&g_ui32Value, ui32Idx) != ((0xdecafbad >> ui32Idx) & 1)) + { + ui32Errors++; + } + } + + // + // Print out the result. + // + if(ui32Errors) + { + UARTprintf("\nErrors!\n"); + } + else + { + UARTprintf("\nSuccess!\n"); + } + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/bitband/bitband.ewd b/boards/ek-tm4c123gxl/bitband/bitband.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/bitband.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/bitband/bitband.ewp b/boards/ek-tm4c123gxl/bitband/bitband.ewp new file mode 100644 index 0000000..452f429 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/bitband.ewp @@ -0,0 +1,789 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + + Source + + $PROJ_DIR$\bitband.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/ek-tm4c123gxl/bitband/bitband.icf b/boards/ek-tm4c123gxl/bitband/bitband.icf new file mode 100644 index 0000000..a1eee89 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/bitband.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// bitband.icf - Linker configuration file for bitband. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/bitband/bitband.ld b/boards/ek-tm4c123gxl/bitband/bitband.ld new file mode 100644 index 0000000..9620427 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/bitband.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * bitband.ld - Linker configuration file for bitband. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/bitband/bitband.sct b/boards/ek-tm4c123gxl/bitband/bitband.sct new file mode 100644 index 0000000..cb075b8 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/bitband.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; bitband.sct - Linker configuration file for bitband. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/bitband/bitband.uvopt b/boards/ek-tm4c123gxl/bitband/bitband.uvopt new file mode 100644 index 0000000..630c6e2 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/bitband.uvopt @@ -0,0 +1,303 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + bitband + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\bitband.c + bitband.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 5 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/bitband/bitband.uvproj b/boards/ek-tm4c123gxl/bitband/bitband.uvproj new file mode 100644 index 0000000..50ed088 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/bitband.uvproj @@ -0,0 +1,429 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + bitband + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + bitband + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\bitband.bin .\rvmdk\bitband.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RA1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + bitband.sct + + + --entry Reset_Handler + + + + + + + + Source + + + bitband.c + 1 + .\bitband.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/bitband/bitband_ccs.cmd b/boards/ek-tm4c123gxl/bitband/bitband_ccs.cmd new file mode 100644 index 0000000..75c8982 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/bitband_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * bitband_ccs.cmd - CCS linker configuration file for bitband. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-tm4c123gxl/bitband/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/bitband/ccs/.ccsimportspec new file mode 100644 index 0000000..9748e3c --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-tm4c123gxl/bitband/ccs/.ccsproject b/boards/ek-tm4c123gxl/bitband/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/bitband/ccs/.cproject b/boards/ek-tm4c123gxl/bitband/ccs/.cproject new file mode 100644 index 0000000..8ab6b79 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/ccs/.cproject @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/bitband/ccs/.project b/boards/ek-tm4c123gxl/bitband/ccs/.project new file mode 100644 index 0000000..da36bff --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/ccs/.project @@ -0,0 +1,55 @@ + + + bitband + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + bitband.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/bitband/bitband.c + + + bitband_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/bitband/bitband_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/bitband/startup_ccs.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/bitband/ccs/Debug/bitband.bin b/boards/ek-tm4c123gxl/bitband/ccs/Debug/bitband.bin new file mode 100644 index 0000000..1b71231 Binary files /dev/null and b/boards/ek-tm4c123gxl/bitband/ccs/Debug/bitband.bin differ diff --git a/boards/ek-tm4c123gxl/bitband/ccs/Debug/bitband.out b/boards/ek-tm4c123gxl/bitband/ccs/Debug/bitband.out new file mode 100644 index 0000000..eefa250 Binary files /dev/null and b/boards/ek-tm4c123gxl/bitband/ccs/Debug/bitband.out differ diff --git a/boards/ek-tm4c123gxl/bitband/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/bitband/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/bitband/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/bitband/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/bitband/ewarm/Exe/bitband.bin b/boards/ek-tm4c123gxl/bitband/ewarm/Exe/bitband.bin new file mode 100644 index 0000000..4af9f67 Binary files /dev/null and b/boards/ek-tm4c123gxl/bitband/ewarm/Exe/bitband.bin differ diff --git a/boards/ek-tm4c123gxl/bitband/ewarm/Exe/bitband.out b/boards/ek-tm4c123gxl/bitband/ewarm/Exe/bitband.out new file mode 100644 index 0000000..9a0e84c Binary files /dev/null and b/boards/ek-tm4c123gxl/bitband/ewarm/Exe/bitband.out differ diff --git a/boards/ek-tm4c123gxl/bitband/gcc/bitband.axf b/boards/ek-tm4c123gxl/bitband/gcc/bitband.axf new file mode 100644 index 0000000..3142595 Binary files /dev/null and b/boards/ek-tm4c123gxl/bitband/gcc/bitband.axf differ diff --git a/boards/ek-tm4c123gxl/bitband/gcc/bitband.bin b/boards/ek-tm4c123gxl/bitband/gcc/bitband.bin new file mode 100644 index 0000000..1f3be4b Binary files /dev/null and b/boards/ek-tm4c123gxl/bitband/gcc/bitband.bin differ diff --git a/boards/ek-tm4c123gxl/bitband/readme.txt b/boards/ek-tm4c123gxl/bitband/readme.txt new file mode 100644 index 0000000..95c70ae --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/readme.txt @@ -0,0 +1,29 @@ +Bit-Banding + +This example application demonstrates the use of the bit-banding +capabilities of the Cortex-M4F microprocessor. All of SRAM and all of the +peripherals reside within bit-band regions, meaning that bit-banding +operations can be applied to any of them. In this example, a variable in +SRAM is set to a particular value one bit at a time using bit-banding +operations (it would be more efficient to do a single non-bit-banded write; +this simply demonstrates the operation of bit-banding). + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/bitband/rvmdk/bitband.axf b/boards/ek-tm4c123gxl/bitband/rvmdk/bitband.axf new file mode 100644 index 0000000..b191a91 Binary files /dev/null and b/boards/ek-tm4c123gxl/bitband/rvmdk/bitband.axf differ diff --git a/boards/ek-tm4c123gxl/bitband/rvmdk/bitband.bin b/boards/ek-tm4c123gxl/bitband/rvmdk/bitband.bin new file mode 100644 index 0000000..56a7f13 Binary files /dev/null and b/boards/ek-tm4c123gxl/bitband/rvmdk/bitband.bin differ diff --git a/boards/ek-tm4c123gxl/bitband/startup_ccs.c b/boards/ek-tm4c123gxl/bitband/startup_ccs.c new file mode 100644 index 0000000..ca18035 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/bitband/startup_ewarm.c b/boards/ek-tm4c123gxl/bitband/startup_ewarm.c new file mode 100644 index 0000000..8d8e1a9 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/bitband/startup_gcc.c b/boards/ek-tm4c123gxl/bitband/startup_gcc.c new file mode 100644 index 0000000..d164864 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/bitband/startup_rvmdk.S b/boards/ek-tm4c123gxl/bitband/startup_rvmdk.S new file mode 100644 index 0000000..37cd427 --- /dev/null +++ b/boards/ek-tm4c123gxl/bitband/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/blinky/Makefile b/boards/ek-tm4c123gxl/blinky/Makefile new file mode 100644 index 0000000..3310806 --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/Makefile @@ -0,0 +1,77 @@ +#****************************************************************************** +# +# Makefile - Rules for building the blinky example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the blinky example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/blinky.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the blinky example. +# +${COMPILER}/blinky.axf: ${COMPILER}/blinky.o +${COMPILER}/blinky.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/blinky.axf: blinky.ld +SCATTERgcc_blinky=blinky.ld +ENTRY_blinky=ResetISR + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/blinky/blinky.c b/boards/ek-tm4c123gxl/blinky/blinky.c new file mode 100644 index 0000000..192fb54 --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/blinky.c @@ -0,0 +1,94 @@ +//***************************************************************************** +// +// blinky.c - Simple example to blink the on-board LED. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/tm4c123gh6pm.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Blinky (blinky)

      +//! +//! A very simple example that blinks the on-board LED using direct register +//! access. +// +//***************************************************************************** + +//***************************************************************************** +// +// Blink the on-board LED. +// +//***************************************************************************** +int +main(void) +{ + volatile uint32_t ui32Loop; + + // + // Enable the GPIO port that is used for the on-board LED. + // + SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF; + + // + // Do a dummy read to insert a few cycles after enabling the peripheral. + // + ui32Loop = SYSCTL_RCGC2_R; + + // + // Enable the GPIO pin for the LED (PF3). Set the direction as output, and + // enable the GPIO pin for digital function. + // + GPIO_PORTF_DIR_R = 0x08; + GPIO_PORTF_DEN_R = 0x08; + + // + // Loop forever. + // + while(1) + { + // + // Turn on the LED. + // + GPIO_PORTF_DATA_R |= 0x08; + + // + // Delay for a bit. + // + for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++) + { + } + + // + // Turn off the LED. + // + GPIO_PORTF_DATA_R &= ~(0x08); + + // + // Delay for a bit. + // + for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++) + { + } + } +} diff --git a/boards/ek-tm4c123gxl/blinky/blinky.ewd b/boards/ek-tm4c123gxl/blinky/blinky.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/blinky.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/blinky/blinky.ewp b/boards/ek-tm4c123gxl/blinky/blinky.ewp new file mode 100644 index 0000000..5950d61 --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/blinky.ewp @@ -0,0 +1,777 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Source + + $PROJ_DIR$\blinky.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/ek-tm4c123gxl/blinky/blinky.icf b/boards/ek-tm4c123gxl/blinky/blinky.icf new file mode 100644 index 0000000..7bd52bf --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/blinky.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// blinky.icf - Linker configuration file for blinky. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/blinky/blinky.ld b/boards/ek-tm4c123gxl/blinky/blinky.ld new file mode 100644 index 0000000..fce9ac0 --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/blinky.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * blinky.ld - Linker configuration file for blinky. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/blinky/blinky.sct b/boards/ek-tm4c123gxl/blinky/blinky.sct new file mode 100644 index 0000000..82aef6f --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/blinky.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; blinky.sct - Linker configuration file for blinky. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/blinky/blinky.uvopt b/boards/ek-tm4c123gxl/blinky/blinky.uvopt new file mode 100644 index 0000000..f9ea768 --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/blinky.uvopt @@ -0,0 +1,268 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + blinky + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\blinky.c + blinky.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Documentation + 1 + 0 + 0 + + 2 + 3 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/blinky/blinky.uvproj b/boards/ek-tm4c123gxl/blinky/blinky.uvproj new file mode 100644 index 0000000..954764a --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/blinky.uvproj @@ -0,0 +1,414 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + blinky + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + blinky + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\blinky.bin .\rvmdk\blinky.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + blinky.sct + + + --entry Reset_Handler + + + + + + + + Source + + + blinky.c + 1 + .\blinky.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/blinky/blinky_ccs.cmd b/boards/ek-tm4c123gxl/blinky/blinky_ccs.cmd new file mode 100644 index 0000000..39c77aa --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/blinky_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * blinky_ccs.cmd - CCS linker configuration file for blinky. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 256; diff --git a/boards/ek-tm4c123gxl/blinky/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/blinky/ccs/.ccsimportspec new file mode 100644 index 0000000..60cba3f --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-tm4c123gxl/blinky/ccs/.ccsproject b/boards/ek-tm4c123gxl/blinky/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/blinky/ccs/.cproject b/boards/ek-tm4c123gxl/blinky/ccs/.cproject new file mode 100644 index 0000000..08a0d0c --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/ccs/.cproject @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/blinky/ccs/.project b/boards/ek-tm4c123gxl/blinky/ccs/.project new file mode 100644 index 0000000..842c8b3 --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/ccs/.project @@ -0,0 +1,50 @@ + + + blinky + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + blinky.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/blinky/blinky.c + + + blinky_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/blinky/blinky_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/blinky/startup_ccs.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/blinky/ccs/Debug/blinky.bin b/boards/ek-tm4c123gxl/blinky/ccs/Debug/blinky.bin new file mode 100644 index 0000000..50bcc47 Binary files /dev/null and b/boards/ek-tm4c123gxl/blinky/ccs/Debug/blinky.bin differ diff --git a/boards/ek-tm4c123gxl/blinky/ccs/Debug/blinky.out b/boards/ek-tm4c123gxl/blinky/ccs/Debug/blinky.out new file mode 100644 index 0000000..4a60213 Binary files /dev/null and b/boards/ek-tm4c123gxl/blinky/ccs/Debug/blinky.out differ diff --git a/boards/ek-tm4c123gxl/blinky/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/blinky/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/blinky/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/blinky/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/blinky/ewarm/Exe/blinky.bin b/boards/ek-tm4c123gxl/blinky/ewarm/Exe/blinky.bin new file mode 100644 index 0000000..4161ba8 Binary files /dev/null and b/boards/ek-tm4c123gxl/blinky/ewarm/Exe/blinky.bin differ diff --git a/boards/ek-tm4c123gxl/blinky/ewarm/Exe/blinky.out b/boards/ek-tm4c123gxl/blinky/ewarm/Exe/blinky.out new file mode 100644 index 0000000..61a4672 Binary files /dev/null and b/boards/ek-tm4c123gxl/blinky/ewarm/Exe/blinky.out differ diff --git a/boards/ek-tm4c123gxl/blinky/gcc/blinky.axf b/boards/ek-tm4c123gxl/blinky/gcc/blinky.axf new file mode 100644 index 0000000..8c5fd7f Binary files /dev/null and b/boards/ek-tm4c123gxl/blinky/gcc/blinky.axf differ diff --git a/boards/ek-tm4c123gxl/blinky/gcc/blinky.bin b/boards/ek-tm4c123gxl/blinky/gcc/blinky.bin new file mode 100644 index 0000000..9716b0c Binary files /dev/null and b/boards/ek-tm4c123gxl/blinky/gcc/blinky.bin differ diff --git a/boards/ek-tm4c123gxl/blinky/readme.txt b/boards/ek-tm4c123gxl/blinky/readme.txt new file mode 100644 index 0000000..2a1436b --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/readme.txt @@ -0,0 +1,24 @@ +Blinky + +A very simple example that blinks the on-board LED using direct register +access. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/blinky/rvmdk/blinky.axf b/boards/ek-tm4c123gxl/blinky/rvmdk/blinky.axf new file mode 100644 index 0000000..cc6ad3a Binary files /dev/null and b/boards/ek-tm4c123gxl/blinky/rvmdk/blinky.axf differ diff --git a/boards/ek-tm4c123gxl/blinky/rvmdk/blinky.bin b/boards/ek-tm4c123gxl/blinky/rvmdk/blinky.bin new file mode 100644 index 0000000..1c231be Binary files /dev/null and b/boards/ek-tm4c123gxl/blinky/rvmdk/blinky.bin differ diff --git a/boards/ek-tm4c123gxl/blinky/startup_ccs.c b/boards/ek-tm4c123gxl/blinky/startup_ccs.c new file mode 100644 index 0000000..ca18035 --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/blinky/startup_ewarm.c b/boards/ek-tm4c123gxl/blinky/startup_ewarm.c new file mode 100644 index 0000000..ed44e2d --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/blinky/startup_gcc.c b/boards/ek-tm4c123gxl/blinky/startup_gcc.c new file mode 100644 index 0000000..c20136c --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/blinky/startup_rvmdk.S b/boards/ek-tm4c123gxl/blinky/startup_rvmdk.S new file mode 100644 index 0000000..c688cea --- /dev/null +++ b/boards/ek-tm4c123gxl/blinky/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000100 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/drivers/buttons.c b/boards/ek-tm4c123gxl/drivers/buttons.c new file mode 100644 index 0000000..2621ea2 --- /dev/null +++ b/boards/ek-tm4c123gxl/drivers/buttons.c @@ -0,0 +1,196 @@ +//***************************************************************************** +// +// buttons.c - Evaluation board driver for push buttons. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/pin_map.h" +#include "driverlib/gpio.h" +#include "drivers/buttons.h" + +//***************************************************************************** +// +//! \addtogroup buttons_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Holds the current, debounced state of each button. A 0 in a bit indicates +// that that button is currently pressed, otherwise it is released. +// We assume that we start with all the buttons released (though if one is +// pressed when the application starts, this will be detected). +// +//***************************************************************************** +static uint8_t g_ui8ButtonStates = ALL_BUTTONS; + +//***************************************************************************** +// +//! Polls the current state of the buttons and determines which have changed. +//! +//! \param pui8Delta points to a character that will be written to indicate +//! which button states changed since the last time this function was called. +//! This value is derived from the debounced state of the buttons. +//! \param pui8RawState points to a location where the raw button state will +//! be stored. +//! +//! This function should be called periodically by the application to poll the +//! pushbuttons. It determines both the current debounced state of the buttons +//! and also which buttons have changed state since the last time the function +//! was called. +//! +//! In order for button debouncing to work properly, this function should be +//! caled at a regular interval, even if the state of the buttons is not needed +//! that often. +//! +//! If button debouncing is not required, the the caller can pass a pointer +//! for the \e pui8RawState parameter in order to get the raw state of the +//! buttons. The value returned in \e pui8RawState will be a bit mask where +//! a 1 indicates the buttons is pressed. +//! +//! \return Returns the current debounced state of the buttons where a 1 in the +//! button ID's position indicates that the button is pressed and a 0 +//! indicates that it is released. +// +//***************************************************************************** +uint8_t +ButtonsPoll(uint8_t *pui8Delta, uint8_t *pui8RawState) +{ + uint32_t ui32Delta; + uint32_t ui32Data; + static uint8_t ui8SwitchClockA = 0; + static uint8_t ui8SwitchClockB = 0; + + // + // Read the raw state of the push buttons. Save the raw state + // (inverting the bit sense) if the caller supplied storage for the + // raw value. + // + ui32Data = (ROM_GPIOPinRead(BUTTONS_GPIO_BASE, ALL_BUTTONS)); + if(pui8RawState) + { + *pui8RawState = (uint8_t)~ui32Data; + } + + // + // Determine the switches that are at a different state than the debounced + // state. + // + ui32Delta = ui32Data ^ g_ui8ButtonStates; + + // + // Increment the clocks by one. + // + ui8SwitchClockA ^= ui8SwitchClockB; + ui8SwitchClockB = ~ui8SwitchClockB; + + // + // Reset the clocks corresponding to switches that have not changed state. + // + ui8SwitchClockA &= ui32Delta; + ui8SwitchClockB &= ui32Delta; + + // + // Get the new debounced switch state. + // + g_ui8ButtonStates &= ui8SwitchClockA | ui8SwitchClockB; + g_ui8ButtonStates |= (~(ui8SwitchClockA | ui8SwitchClockB)) & ui32Data; + + // + // Determine the switches that just changed debounced state. + // + ui32Delta ^= (ui8SwitchClockA | ui8SwitchClockB); + + // + // Store the bit mask for the buttons that have changed for return to + // caller. + // + if(pui8Delta) + { + *pui8Delta = (uint8_t)ui32Delta; + } + + // + // Return the debounced buttons states to the caller. Invert the bit + // sense so that a '1' indicates the button is pressed, which is a + // sensible way to interpret the return value. + // + return(~g_ui8ButtonStates); +} + +//***************************************************************************** +// +//! Initializes the GPIO pins used by the board pushbuttons. +//! +//! This function must be called during application initialization to +//! configure the GPIO pins to which the pushbuttons are attached. It enables +//! the port used by the buttons and configures each button GPIO as an input +//! with a weak pull-up. +//! +//! \return None. +// +//***************************************************************************** +void +ButtonsInit(void) +{ + // + // Enable the GPIO port to which the pushbuttons are connected. + // + ROM_SysCtlPeripheralEnable(BUTTONS_GPIO_PERIPH); + + // + // Unlock PF0 so we can change it to a GPIO input + // Once we have enabled (unlocked) the commit register then re-lock it + // to prevent further changes. PF0 is muxed with NMI thus a special case. + // + HWREG(BUTTONS_GPIO_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(BUTTONS_GPIO_BASE + GPIO_O_CR) |= 0x01; + HWREG(BUTTONS_GPIO_BASE + GPIO_O_LOCK) = 0; + + // + // Set each of the button GPIO pins as an input with a pull-up. + // + ROM_GPIODirModeSet(BUTTONS_GPIO_BASE, ALL_BUTTONS, GPIO_DIR_MODE_IN); + MAP_GPIOPadConfigSet(BUTTONS_GPIO_BASE, ALL_BUTTONS, + GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); + + // + // Initialize the debounced button state with the current state read from + // the GPIO bank. + // + g_ui8ButtonStates = ROM_GPIOPinRead(BUTTONS_GPIO_BASE, ALL_BUTTONS); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/ek-tm4c123gxl/drivers/buttons.h b/boards/ek-tm4c123gxl/drivers/buttons.h new file mode 100644 index 0000000..99ee799 --- /dev/null +++ b/boards/ek-tm4c123gxl/drivers/buttons.h @@ -0,0 +1,107 @@ +//***************************************************************************** +// +// buttons.h - Prototypes for the evaluation board buttons driver. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#ifndef __BUTTONS_H__ +#define __BUTTONS_H__ + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the hardware resources used by the pushbuttons. +// +// The switches are on the following ports/pins: +// +// PF4 - Left Button +// PF0 - Right Button +// +// The switches tie the GPIO to ground, so the GPIOs need to be configured +// with pull-ups, and a value of 0 means the switch is pressed. +// +//***************************************************************************** +#define BUTTONS_GPIO_PERIPH SYSCTL_PERIPH_GPIOF +#define BUTTONS_GPIO_BASE GPIO_PORTF_BASE + +#define NUM_BUTTONS 2 +#define LEFT_BUTTON GPIO_PIN_4 +#define RIGHT_BUTTON GPIO_PIN_0 + +#define ALL_BUTTONS (LEFT_BUTTON | RIGHT_BUTTON) + +//***************************************************************************** +// +// Useful macros for detecting button events. +// +//***************************************************************************** +#define BUTTON_PRESSED(button, buttons, changed) \ + (((button) & (changed)) && ((button) & (buttons))) + +#define BUTTON_RELEASED(button, buttons, changed) \ + (((button) & (changed)) && !((button) & (buttons))) + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Functions exported from buttons.c +// +//***************************************************************************** +extern void ButtonsInit(void); +extern uint8_t ButtonsPoll(uint8_t *pui8Delta, + uint8_t *pui8Raw); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** + +#endif // __BUTTONS_H__ diff --git a/boards/ek-tm4c123gxl/drivers/rgb.c b/boards/ek-tm4c123gxl/drivers/rgb.c new file mode 100644 index 0000000..40a2c4d --- /dev/null +++ b/boards/ek-tm4c123gxl/drivers/rgb.c @@ -0,0 +1,404 @@ +//***************************************************************************** +// +// rgb.c - Evaluation board driver for RGB LED. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_timer.h" +#include "inc/hw_ints.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/pin_map.h" +#include "driverlib/timer.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "rgb.h" + +//***************************************************************************** +// +//! \addtogroup rgb_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// This is a custom driver that allows the easy manipulation of the RGB LED. +// +// The driver uses the general purpose timers to govern the brightness of the +// LED through simple PWM output mode of the GP Timers. +// +// A global array contains the current relative color of each of the three +// LEDs. A global float variable controls intensity of the overall mixed color. +// +// This implementation consumes the following hardware resources +// - Wide Timer 5B for blinking the entire RGB unit. +// - Timer 0B intensity of an RGB element +// - Timer 1A intensity of an RGB element +// - Timer 1B intensity of an RGB element +// +//***************************************************************************** +static uint32_t g_ui32Colors[3]; +static float g_fIntensity = 0.3f; + +//***************************************************************************** +// +//! Wide Timer interrupt to handle blinking effect of the RGB +//! +//! This function is called by the hardware interrupt controller on a timeout +//! of the wide timer. This function must be in the NVIC table in the startup +//! file. When called will toggle the enable flag to turn on or off the entire +//! RGB unit. This creates a blinking effect. A wide timer is used since the +//! blink is intended to be visible to the human eye and thus is expected to +//! have a frequency between 15 and 0.1 hz. Currently blink duty is fixed at +//! 50%. +//! +//! \return None. +// +//***************************************************************************** +void +RGBBlinkIntHandler(void) +{ + static unsigned long ulFlags; + + + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(WTIMER5_BASE, TIMER_TIMB_TIMEOUT); + + // + // Toggle the flag for the blink timer. + // + ulFlags ^= 1; + + if(ulFlags) + { + RGBEnable(); + } + else + { + RGBDisable(); + } + +} + +//***************************************************************************** +// +//! Initializes the Timer and GPIO functionality associated with the RGB LED +//! +//! \param ui32Enable enables RGB immediately if set. +//! +//! This function must be called during application initialization to +//! configure the GPIO pins to which the LEDs are attached. It enables +//! the port used by the LEDs and configures each color's Timer. It optionally +//! enables the RGB LED by configuring the GPIO pins and starting the timers. +//! +//! \return None. +// +//***************************************************************************** +void +RGBInit(uint32_t ui32Enable) +{ + // + // Enable the GPIO Port and Timer for each LED + // + ROM_SysCtlPeripheralEnable(RED_GPIO_PERIPH); + ROM_SysCtlPeripheralEnable(RED_TIMER_PERIPH); + + ROM_SysCtlPeripheralEnable(GREEN_GPIO_PERIPH); + ROM_SysCtlPeripheralEnable(GREEN_TIMER_PERIPH); + + ROM_SysCtlPeripheralEnable(BLUE_GPIO_PERIPH); + ROM_SysCtlPeripheralEnable(BLUE_TIMER_PERIPH); + + // + // Configure each timer for output mode + // + HWREG(GREEN_TIMER_BASE + TIMER_O_CFG) = 0x04; + HWREG(GREEN_TIMER_BASE + TIMER_O_TAMR) = 0x0A; + HWREG(GREEN_TIMER_BASE + TIMER_O_TAILR) = 0xFFFF; + + HWREG(BLUE_TIMER_BASE + TIMER_O_CFG) = 0x04; + HWREG(BLUE_TIMER_BASE + TIMER_O_TBMR) = 0x0A; + HWREG(BLUE_TIMER_BASE + TIMER_O_TBILR) = 0xFFFF; + + HWREG(RED_TIMER_BASE + TIMER_O_CFG) = 0x04; + HWREG(RED_TIMER_BASE + TIMER_O_TBMR) = 0x0A; + HWREG(RED_TIMER_BASE + TIMER_O_TBILR) = 0xFFFF; + + // + // Invert the output signals. + // + HWREG(RED_TIMER_BASE + TIMER_O_CTL) |= 0x4000; + HWREG(GREEN_TIMER_BASE + TIMER_O_CTL) |= 0x40; + HWREG(BLUE_TIMER_BASE + TIMER_O_CTL) |= 0x4000; + + if(ui32Enable) + { + RGBEnable(); + } + + // + // Setup the blink functionality + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_WTIMER5); + ROM_TimerConfigure(WTIMER5_BASE, TIMER_CFG_B_PERIODIC | TIMER_CFG_SPLIT_PAIR); + ROM_TimerLoadSet64(WTIMER5_BASE, 0xFFFFFFFFFFFFFFFF); + ROM_IntEnable(INT_WTIMER5B); + ROM_TimerIntEnable(WTIMER5_BASE, TIMER_TIMB_TIMEOUT); + + +} + +//***************************************************************************** +// +//! Enable the RGB LED with already configured timer settings +//! +//! This function or RGBDisable should be called during application +//! initialization to configure the GPIO pins to which the LEDs are attached. +//! This function enables the timers and configures the GPIO pins as timer +//! outputs. +//! +//! \return None. +// +//***************************************************************************** +void +RGBEnable(void) +{ + + // + // Enable timers to begin counting + // + ROM_TimerEnable(RED_TIMER_BASE, TIMER_BOTH); + ROM_TimerEnable(GREEN_TIMER_BASE, TIMER_BOTH); + ROM_TimerEnable(BLUE_TIMER_BASE, TIMER_BOTH); + + // + // Reconfigure each LED's GPIO pad for timer control + // + ROM_GPIOPinConfigure(GREEN_GPIO_PIN_CFG); + ROM_GPIOPinTypeTimer(GREEN_GPIO_BASE, GREEN_GPIO_PIN); + MAP_GPIOPadConfigSet(GREEN_GPIO_BASE, GREEN_GPIO_PIN, GPIO_STRENGTH_8MA_SC, + GPIO_PIN_TYPE_STD); + + ROM_GPIOPinConfigure(BLUE_GPIO_PIN_CFG); + ROM_GPIOPinTypeTimer(BLUE_GPIO_BASE, BLUE_GPIO_PIN); + MAP_GPIOPadConfigSet(BLUE_GPIO_BASE, BLUE_GPIO_PIN, GPIO_STRENGTH_8MA_SC, + GPIO_PIN_TYPE_STD); + + ROM_GPIOPinConfigure(RED_GPIO_PIN_CFG); + ROM_GPIOPinTypeTimer(RED_GPIO_BASE, RED_GPIO_PIN); + MAP_GPIOPadConfigSet(RED_GPIO_BASE, RED_GPIO_PIN, GPIO_STRENGTH_8MA_SC, + GPIO_PIN_TYPE_STD); +} + +//***************************************************************************** +// +//! Disable the RGB LED by configuring the GPIO's as inputs. +//! +//! This function or RGBEnable should be called during application +//! initialization to configure the GPIO pins to which the LEDs are attached. +//! This function disables the timers and configures the GPIO pins as inputs +//! for minimum current draw. +//! +//! \return None. +// +//***************************************************************************** +void +RGBDisable(void) +{ + // + // Configure the GPIO pads as general purpose inputs. + // + ROM_GPIOPinTypeGPIOInput(RED_GPIO_BASE, RED_GPIO_PIN); + ROM_GPIOPinTypeGPIOInput(GREEN_GPIO_BASE, GREEN_GPIO_PIN); + ROM_GPIOPinTypeGPIOInput(BLUE_GPIO_BASE, BLUE_GPIO_PIN); + + // + // Stop the timer counting. + // + ROM_TimerDisable(RED_TIMER_BASE, TIMER_BOTH); + ROM_TimerDisable(GREEN_TIMER_BASE, TIMER_BOTH); + ROM_TimerDisable(BLUE_TIMER_BASE, TIMER_BOTH); +} + +//***************************************************************************** +// +//! Set the output color and intensity. +//! +//! \param pui32RGBColor points to a three element array representing the +//! relative intensity of each color. Red is element 0, Green is element 1, +//! Blue is element 2. 0x0000 is off. 0xFFFF is fully on. +//! +//! \param fIntensity is used to scale the intensity of all three colors by +//! the same amount. fIntensity should be between 0.0 and 1.0. This scale +//! factor is applied to all three colors. +//! +//! This function should be called by the application to set the color and +//! intensity of the RGB LED. +//! +//! \return None. +// +//***************************************************************************** +void +RGBSet(volatile uint32_t * pui32RGBColor, float fIntensity) +{ + RGBColorSet(pui32RGBColor); + RGBIntensitySet(fIntensity); +} + +//***************************************************************************** +// +//! Set the output color. +//! +//! \param pui32RGBColor points to a three element array representing the +//! relative intensity of each color. Red is element 0, Green is element 1, +//! Blue is element 2. 0x0000 is off. 0xFFFF is fully on. +//! +//! This function should be called by the application to set the color +//! of the RGB LED. +//! +//! \return None. +// +//***************************************************************************** +void +RGBColorSet(volatile uint32_t * pui32RGBColor) +{ + uint32_t ui32Color[3]; + uint32_t ui32Index; + + for(ui32Index=0; ui32Index < 3; ui32Index++) + { + g_ui32Colors[ui32Index] = pui32RGBColor[ui32Index]; + ui32Color[ui32Index] = (uint32_t) (((float) pui32RGBColor[ui32Index]) * + g_fIntensity + 0.5f); + + if(ui32Color[ui32Index] > 0xFFFF) + { + ui32Color[ui32Index] = 0xFFFF; + } + } + + ROM_TimerMatchSet(RED_TIMER_BASE, RED_TIMER, ui32Color[RED]); + ROM_TimerMatchSet(GREEN_TIMER_BASE, GREEN_TIMER, ui32Color[GREEN]); + ROM_TimerMatchSet(BLUE_TIMER_BASE, BLUE_TIMER, ui32Color[BLUE]); +} + +//***************************************************************************** +// +//! Set the current output intensity. +//! +//! \param fIntensity is used to scale the intensity of all three colors by +//! the same amount. fIntensity should be between 0.0 and 1.0. This scale +//! factor is applied individually to all three colors. +//! +//! This function should be called by the application to set the intensity +//! of the RGB LED. +//! +//! \return None. +// +//***************************************************************************** +void +RGBIntensitySet(float fIntensity) +{ + g_fIntensity = fIntensity; + RGBColorSet(g_ui32Colors); +} + +//***************************************************************************** +// +//! Sets the blink rate of the RGB Led +//! +//! \param fRate is the blink rate in hertz. +//! +//! This function controls the blink rate of the RGB LED in auto blink mode. +//! to enable blinking pass a non-zero floating pointer number. To disable +//! pass 0.0f as the argument. Calling this function will override the current +//! RGBDisable or RGBEnable status. +//! +//! \return None. +// +//***************************************************************************** +void +RGBBlinkRateSet(float fRate) +{ + uint64_t ui64Load; + + if(fRate == 0.0f) + { + // + // Disable the timer and enable the RGB. If blink rate is zero we + // assume we want the RGB to be enabled. To disable call RGBDisable + // + ROM_TimerDisable(WTIMER5_BASE, TIMER_B); + RGBEnable(); + } + else + { + // + // Keep the math in floating pointing until the end so that we keep as + // much precision as we can. + // + ui64Load = (uint64_t) (((float)SysCtlClockGet()) / (fRate * 2.0f)); + ROM_TimerLoadSet(WTIMER5_BASE, TIMER_B, ui64Load); + ROM_TimerEnable(WTIMER5_BASE, TIMER_B); + } + +} + +//***************************************************************************** +// +//! Get the output color. +//! +//! \param pui32RGBColor points to a three element array representing the +//! relative intensity of each color. Red is element 0, Green is element 1, +//! Blue is element 2. 0x0000 is off. 0xFFFF is fully on. Caller must allocate +//! and pass a pointer to a three element array of uint32_ts. +//! +//! This function should be called by the application to get the current color +//! of the RGB LED. +//! +//! \return None. +// +//***************************************************************************** +void +RGBColorGet(uint32_t * pui32RGBColor) +{ + uint32_t ui32Index; + + for(ui32Index=0; ui32Index < 3; ui32Index++) + { + pui32RGBColor[ui32Index] = g_ui32Colors[ui32Index]; + } +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/boards/ek-tm4c123gxl/drivers/rgb.h b/boards/ek-tm4c123gxl/drivers/rgb.h new file mode 100644 index 0000000..1a23717 --- /dev/null +++ b/boards/ek-tm4c123gxl/drivers/rgb.h @@ -0,0 +1,142 @@ +//***************************************************************************** +// +// rgb.h - Prototypes for the evaluation board RGB LED driver. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#ifndef __RGBLED_H__ +#define __RGBLED_H__ + +//***************************************************************************** +// +// Defines for the hardware resources used by the pushbuttons. +// +// The switches are on the following ports/pins: +// +// PF1 - RED (632 nanometer) +// PF2 - GREEN (518 nanometer) +// PF3 - BLUE (465 nanometer) + +// +// The RGB LED is tied up to 5V but since the lowest Vf is 1.75 we can still +// use a General Purpose Timer in pulse out mode. +// +//***************************************************************************** + +// +// Indexes into the array of colors +// +#define RED 0 +#define GREEN 1 +#define BLUE 2 + +// +// Ratio for percent of full on that should be "true" white. +// +#define RED_WHITE_BALANCE 0.497f +#define GREEN_WHITE_BALANCE 0.6f +#define BLUE_WHITE_BALANCE 1.0f + +// +// GPIO, Timer, Peripheral, and Pin assignments for the colors +// +#define RED_GPIO_PERIPH SYSCTL_PERIPH_GPIOF +#define RED_TIMER_PERIPH SYSCTL_PERIPH_TIMER0 +#define BLUE_GPIO_PERIPH SYSCTL_PERIPH_GPIOF +#define BLUE_TIMER_PERIPH SYSCTL_PERIPH_TIMER1 +#define GREEN_GPIO_PERIPH SYSCTL_PERIPH_GPIOF +#define GREEN_TIMER_PERIPH SYSCTL_PERIPH_TIMER1 + + +#define RED_GPIO_BASE GPIO_PORTF_BASE +#define RED_TIMER_BASE TIMER0_BASE +#define BLUE_GPIO_BASE GPIO_PORTF_BASE +#define BLUE_TIMER_BASE TIMER1_BASE +#define GREEN_GPIO_BASE GPIO_PORTF_BASE +#define GREEN_TIMER_BASE TIMER1_BASE + +#define RED_GPIO_PIN GPIO_PIN_1 +#define BLUE_GPIO_PIN GPIO_PIN_2 +#define GREEN_GPIO_PIN GPIO_PIN_3 + + +#define RED_GPIO_PIN_CFG GPIO_PF1_T0CCP1 +#define BLUE_GPIO_PIN_CFG GPIO_PF2_T1CCP0 +#define GREEN_GPIO_PIN_CFG GPIO_PF3_T1CCP1 + +#define RED_TIMER_CFG TIMER_CFG_B_PWM +#define BLUE_TIMER_CFG TIMER_CFG_A_PWM +#define GREEN_TIMER_CFG TIMER_CFG_B_PWM + +#define RED_TIMER TIMER_B +#define BLUE_TIMER TIMER_A +#define GREEN_TIMER TIMER_B + + +//***************************************************************************** +// +// Useful macros +// +//***************************************************************************** + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Functions exported from rgb.c +// +//***************************************************************************** +extern void RGBInit(uint32_t ui32Enable); + +extern void RGBEnable(void); +extern void RGBDisable(void); +extern void RGBSet(volatile uint32_t * pui32RGBColor, float fIntensity); +extern void RGBColorSet(volatile uint32_t * pui32RGBColor); + +extern void RGBIntensitySet(float fIntensity); +extern void RGBBlinkRateSet(float fRate); +extern void RGBGet(uint32_t * pui32RGBColor, float * pfIntensity); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** + +#endif // __RGBLED_H__ diff --git a/boards/ek-tm4c123gxl/ek-tm4c123gxl.eww b/boards/ek-tm4c123gxl/ek-tm4c123gxl.eww new file mode 100644 index 0000000..b4e504a --- /dev/null +++ b/boards/ek-tm4c123gxl/ek-tm4c123gxl.eww @@ -0,0 +1,128 @@ + + + + + $WS_DIR$\..\..\..\driverlib\driverlib.ewp + + + $WS_DIR$\..\..\..\usblib\usblib.ewp + + + $WS_DIR$\bitband\bitband.ewp + + + $WS_DIR$\blinky\blinky.ewp + + + $WS_DIR$\freertos_demo\freertos_demo.ewp + + + $WS_DIR$\gpio_jtag\gpio_jtag.ewp + + + $WS_DIR$\hello\hello.ewp + + + $WS_DIR$\interrupts\interrupts.ewp + + + $WS_DIR$\mpu_fault\mpu_fault.ewp + + + $WS_DIR$\project0\project0.ewp + + + $WS_DIR$\qs-rgb\qs-rgb.ewp + + + $WS_DIR$\timers\timers.ewp + + + $WS_DIR$\uart_echo\uart_echo.ewp + + + $WS_DIR$\udma_demo\udma_demo.ewp + + + $WS_DIR$\usb_dev_bulk\usb_dev_bulk.ewp + + + $WS_DIR$\usb_dev_gamepad\usb_dev_gamepad.ewp + + + $WS_DIR$\usb_dev_serial\usb_dev_serial.ewp + + + + All Examples + + driverlib + Debug + + + usblib + Debug + + + bitband + Debug + + + blinky + Debug + + + freertos_demo + Debug + + + gpio_jtag + Debug + + + hello + Debug + + + interrupts + Debug + + + mpu_fault + Debug + + + project0 + Debug + + + qs-rgb + Debug + + + timers + Debug + + + uart_echo + Debug + + + udma_demo + Debug + + + usb_dev_bulk + Debug + + + usb_dev_gamepad + Debug + + + usb_dev_serial + Debug + + + + diff --git a/boards/ek-tm4c123gxl/ek-tm4c123gxl.uvmpw b/boards/ek-tm4c123gxl/ek-tm4c123gxl.uvmpw new file mode 100644 index 0000000..9365d0d --- /dev/null +++ b/boards/ek-tm4c123gxl/ek-tm4c123gxl.uvmpw @@ -0,0 +1,95 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + ek-tm4c123gxl + + + ..\..\..\driverlib\driverlib.uvproj + 1 + + + + ..\..\..\usblib\usblib.uvproj + 1 + + + + .\bitband\bitband.uvproj + 1 + + + + .\blinky\blinky.uvproj + 1 + + + + .\freertos_demo\freertos_demo.uvproj + 1 + + + + .\gpio_jtag\gpio_jtag.uvproj + 1 + + + + .\hello\hello.uvproj + 1 + + + + .\interrupts\interrupts.uvproj + 1 + + + + .\mpu_fault\mpu_fault.uvproj + 1 + + + + .\project0\project0.uvproj + 1 + + + + .\qs-rgb\qs-rgb.uvproj + 1 + + + + .\timers\timers.uvproj + 1 + + + + .\uart_echo\uart_echo.uvproj + 1 + + + + .\udma_demo\udma_demo.uvproj + 1 + + + + .\usb_dev_bulk\usb_dev_bulk.uvproj + 1 + + + + .\usb_dev_gamepad\usb_dev_gamepad.uvproj + 1 + + + + .\usb_dev_serial\usb_dev_serial.uvproj + 1 + + +
      diff --git a/boards/ek-tm4c123gxl/freertos_demo/FreeRTOSConfig.h b/boards/ek-tm4c123gxl/freertos_demo/FreeRTOSConfig.h new file mode 100644 index 0000000..4e858c2 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/FreeRTOSConfig.h @@ -0,0 +1,107 @@ +/* + FreeRTOS V7.0.2 - Copyright (C) 2011 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 50000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 200 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30000 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configCHECK_FOR_STACK_OVERFLOW 2 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 16 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) +#define configQUEUE_REGISTRY_SIZE 10 + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 + +/* Be ENORMOUSLY careful if you want to modify these two values and make sure + * you read http://www.freertos.org/a00110.html#kernel_priority first! + */ +#define configKERNEL_INTERRUPT_PRIORITY ( 7 << 5 ) /* Priority 7, or 0xE0 as only the top three bits are implemented. This is the lowest priority. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 5 << 5 ) /* Priority 5, or 0xA0 as only the top three bits are implemented. */ + +#endif /* FREERTOS_CONFIG_H */ diff --git a/boards/ek-tm4c123gxl/freertos_demo/Makefile b/boards/ek-tm4c123gxl/freertos_demo/Makefile new file mode 100644 index 0000000..229f028 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/Makefile @@ -0,0 +1,105 @@ +#****************************************************************************** +# +# Makefile - Rules for building the FreeRTOS example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F +VPATH+=../../../../third_party/FreeRTOS/Source/portable/MemMang/ +VPATH+=../../../../third_party/FreeRTOS/Source +VPATH+=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=. +IPATH+=.. +IPATH+=../../../.. +IPATH+=../../../../third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F +IPATH+=../../../../third_party/FreeRTOS +IPATH+=../../../../third_party/FreeRTOS/Source/include +IPATH+=../../../../third_party + +# +# The default rule, which causes the FreeRTOS example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/freertos_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the FreeRTOS example. +# +${COMPILER}/freertos_demo.axf: ${COMPILER}/buttons.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/freertos_demo.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/heap_2.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/led_task.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/list.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/port.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/queue.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/rgb.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/switch_task.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/tasks.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/uartstdio.o +${COMPILER}/freertos_demo.axf: ${COMPILER}/ustdlib.o +${COMPILER}/freertos_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/freertos_demo.axf: freertos_demo.ld +SCATTERgcc_freertos_demo=freertos_demo.ld +ENTRY_freertos_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/freertos_demo/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/freertos_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..ef4631a --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/ccs/.ccsimportspec @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/freertos_demo/ccs/.ccsproject b/boards/ek-tm4c123gxl/freertos_demo/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/freertos_demo/ccs/.cproject b/boards/ek-tm4c123gxl/freertos_demo/ccs/.cproject new file mode 100644 index 0000000..d56095a --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/ccs/.cproject @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/freertos_demo/ccs/.project b/boards/ek-tm4c123gxl/freertos_demo/ccs/.project new file mode 100644 index 0000000..db7b286 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/ccs/.project @@ -0,0 +1,110 @@ + + + freertos_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + freertos_demo.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.c + + + freertos_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/freertos_demo/freertos_demo_ccs.cmd + + + led_task.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/freertos_demo/led_task.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/freertos_demo/startup_ccs.c + + + switch_task.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/freertos_demo/switch_task.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/drivers/buttons.c + + + drivers/rgb.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/drivers/rgb.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + third_party/FreeRTOS/Source/list.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/list.c + + + third_party/FreeRTOS/Source/queue.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/queue.c + + + third_party/FreeRTOS/Source/tasks.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/tasks.c + + + third_party/FreeRTOS/Source/portable/MemMang/heap_2.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/portable/MemMang/heap_2.c + + + third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c + 1 + SW_ROOT/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c + + + third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm + 1 + SW_ROOT/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/freertos_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/freertos_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/freertos_demo/ccs/Debug/freertos_demo.bin b/boards/ek-tm4c123gxl/freertos_demo/ccs/Debug/freertos_demo.bin new file mode 100644 index 0000000..d6451e1 Binary files /dev/null and b/boards/ek-tm4c123gxl/freertos_demo/ccs/Debug/freertos_demo.bin differ diff --git a/boards/ek-tm4c123gxl/freertos_demo/ccs/Debug/freertos_demo.out b/boards/ek-tm4c123gxl/freertos_demo/ccs/Debug/freertos_demo.out new file mode 100644 index 0000000..f573a2d Binary files /dev/null and b/boards/ek-tm4c123gxl/freertos_demo/ccs/Debug/freertos_demo.out differ diff --git a/boards/ek-tm4c123gxl/freertos_demo/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/freertos_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/freertos_demo/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/freertos_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/freertos_demo/ewarm/Exe/freertos_demo.bin b/boards/ek-tm4c123gxl/freertos_demo/ewarm/Exe/freertos_demo.bin new file mode 100644 index 0000000..efe2391 Binary files /dev/null and b/boards/ek-tm4c123gxl/freertos_demo/ewarm/Exe/freertos_demo.bin differ diff --git a/boards/ek-tm4c123gxl/freertos_demo/ewarm/Exe/freertos_demo.out b/boards/ek-tm4c123gxl/freertos_demo/ewarm/Exe/freertos_demo.out new file mode 100644 index 0000000..f31c765 Binary files /dev/null and b/boards/ek-tm4c123gxl/freertos_demo/ewarm/Exe/freertos_demo.out differ diff --git a/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.c b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.c new file mode 100644 index 0000000..acfc793 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.c @@ -0,0 +1,218 @@ +//***************************************************************************** +// +// freertos_demo.c - Simple FreeRTOS example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "utils/uartstdio.h" +#include "led_task.h" +#include "switch_task.h" +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      FreeRTOS Example (freertos_demo)

      +//! +//! This application demonstrates the use of FreeRTOS on Launchpad. +//! +//! The application blinks the user-selected LED at a user-selected frequency. +//! To select the LED press the left button and to select the frequency press +//! the right button. The UART outputs the application status at 115,200 baud, +//! 8-n-1 mode. +//! +//! This application utilizes FreeRTOS to perform the tasks in a concurrent +//! fashion. The following tasks are created: +//! +//! - An LED task, which blinks the user-selected on-board LED at a +//! user-selected rate (changed via the buttons). +//! +//! - A Switch task, which monitors the buttons pressed and passes the +//! information to LED task. +//! +//! In addition to the tasks, this application also uses the following FreeRTOS +//! resources: +//! +//! - A Queue to enable information transfer between tasks. +//! +//! - A Semaphore to guard the resource, UART, from access by multiple tasks at +//! the same time. +//! +//! - A non-blocking FreeRTOS Delay to put the tasks in blocked state when they +//! have nothing to do. +//! +//! For additional details on FreeRTOS, refer to the FreeRTOS web page at: +//! http://www.freertos.org/ +// +//***************************************************************************** + + +//***************************************************************************** +// +// The mutex that protects concurrent access of UART from multiple tasks. +// +//***************************************************************************** +xSemaphoreHandle g_pUARTSemaphore; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} + +#endif + +//***************************************************************************** +// +// This hook is called by FreeRTOS when an stack overflow error is detected. +// +//***************************************************************************** +void +vApplicationStackOverflowHook(xTaskHandle *pxTask, char *pcTaskName) +{ + // + // This function can not return, so loop forever. Interrupts are disabled + // on entry to this function, so no processor interrupts will interrupt + // this loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// Initialize FreeRTOS and start the initial set of tasks. +// +//***************************************************************************** +int +main(void) +{ + // + // Set the clocking to run at 50 MHz from the PLL. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Initialize the UART and configure it for 115,200, 8-N-1 operation. + // + ConfigureUART(); + + // + // Print demo introduction. + // + UARTprintf("\n\nWelcome to the EK-TM4C123GXL FreeRTOS Demo!\n"); + + // + // Create a mutex to guard the UART. + // + g_pUARTSemaphore = xSemaphoreCreateMutex(); + + // + // Create the LED task. + // + if(LEDTaskInit() != 0) + { + + while(1) + { + } + } + + // + // Create the switch task. + // + if(SwitchTaskInit() != 0) + { + + while(1) + { + } + } + + // + // Start the scheduler. This should not return. + // + vTaskStartScheduler(); + + // + // In case the scheduler returns for some reason, print an error and loop + // forever. + // + + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ewd b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ewp b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ewp new file mode 100644 index 0000000..46382e1 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ewp @@ -0,0 +1,832 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\freertos_demo.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\portable\MemMang\heap_2.c + + + $PROJ_DIR$\led_task.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\list.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\portable\IAR\ARM_CM4F\port.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\portable\IAR\ARM_CM4F\portasm.S + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\queue.c + + + $PROJ_DIR$\..\drivers\rgb.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\switch_task.c + + + $PROJ_DIR$\..\..\..\..\third_party\FreeRTOS\Source\tasks.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.icf b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.icf new file mode 100644 index 0000000..59de3bd --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// freertos_demo.icf - Linker configuration file for freertos_demo. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ld b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ld new file mode 100644 index 0000000..a7b6717 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * freertos_demo.ld - Linker configuration file for freertos_demo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.sct b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.sct new file mode 100644 index 0000000..746dc51 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; freertos_demo.sct - Linker configuration file for freertos_demo. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.uvopt b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.uvopt new file mode 100644 index 0000000..1256086 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.uvopt @@ -0,0 +1,443 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + freertos_demo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\freertos_demo.c + freertos_demo.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\portable\MemMang\heap_2.c + heap_2.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\led_task.c + led_task.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\list.c + list.c + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c + port.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\queue.c + queue.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\rgb.c + rgb.c + + + 1 + 9 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\switch_task.c + switch_task.c + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\third_party\FreeRTOS\Source\tasks.c + tasks.c + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 14 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 15 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.uvproj b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.uvproj new file mode 100644 index 0000000..9074a5f --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo.uvproj @@ -0,0 +1,479 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + freertos_demo + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + freertos_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\freertos_demo.bin .\rvmdk\freertos_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 + + .;..;..\..\..\..;..\..\..\..\third_party\FreeRTOS\Source\portable\RVDS\ARM_CM4F;..\..\..\..\third_party\FreeRTOS;..\..\..\..\third_party\FreeRTOS\Source\include;..\..\..\..\third_party; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + freertos_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + freertos_demo.c + 1 + .\freertos_demo.c + + + heap_2.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\portable\MemMang\heap_2.c + + + led_task.c + 1 + .\led_task.c + + + list.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\list.c + + + port.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c + + + queue.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\queue.c + + + rgb.c + 1 + ..\drivers\rgb.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + switch_task.c + 1 + .\switch_task.c + + + tasks.c + 1 + ..\..\..\..\third_party\FreeRTOS\Source\tasks.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/freertos_demo/freertos_demo_ccs.cmd b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo_ccs.cmd new file mode 100644 index 0000000..27daec2 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/freertos_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * freertos_demo_ccs.cmd - CCS linker configuration file for freertos_demo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-tm4c123gxl/freertos_demo/gcc/freertos_demo.axf b/boards/ek-tm4c123gxl/freertos_demo/gcc/freertos_demo.axf new file mode 100644 index 0000000..d9c7473 Binary files /dev/null and b/boards/ek-tm4c123gxl/freertos_demo/gcc/freertos_demo.axf differ diff --git a/boards/ek-tm4c123gxl/freertos_demo/gcc/freertos_demo.bin b/boards/ek-tm4c123gxl/freertos_demo/gcc/freertos_demo.bin new file mode 100644 index 0000000..93fca3f Binary files /dev/null and b/boards/ek-tm4c123gxl/freertos_demo/gcc/freertos_demo.bin differ diff --git a/boards/ek-tm4c123gxl/freertos_demo/led_task.c b/boards/ek-tm4c123gxl/freertos_demo/led_task.c new file mode 100644 index 0000000..bfb50af --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/led_task.c @@ -0,0 +1,237 @@ +//***************************************************************************** +// +// led_task.c - A simple flashing LED task. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "drivers/rgb.h" +#include "drivers/buttons.h" +#include "utils/uartstdio.h" +#include "led_task.h" +#include "priorities.h" +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +//***************************************************************************** +// +// The stack size for the LED toggle task. +// +//***************************************************************************** +#define LEDTASKSTACKSIZE 128 // Stack size in words + +//***************************************************************************** +// +// The item size and queue size for the LED message queue. +// +//***************************************************************************** +#define LED_ITEM_SIZE sizeof(uint8_t) +#define LED_QUEUE_SIZE 5 + +//***************************************************************************** +// +// Default LED toggle delay value. LED toggling frequency is twice this number. +// +//***************************************************************************** +#define LED_TOGGLE_DELAY 250 + +//***************************************************************************** +// +// The queue that holds messages sent to the LED task. +// +//***************************************************************************** +xQueueHandle g_pLEDQueue; + +// +// [G, R, B] range is 0 to 0xFFFF per color. +// +static uint32_t g_pui32Colors[3] = { 0x0000, 0x0000, 0x0000 }; +static uint8_t g_ui8ColorsIndx; + +extern xSemaphoreHandle g_pUARTSemaphore; + +//***************************************************************************** +// +// This task toggles the user selected LED at a user selected frequency. User +// can make the selections by pressing the left and right buttons. +// +//***************************************************************************** +static void +LEDTask(void *pvParameters) +{ + portTickType ui32WakeTime; + uint32_t ui32LEDToggleDelay; + uint8_t i8Message; + + // + // Initialize the LED Toggle Delay to default value. + // + ui32LEDToggleDelay = LED_TOGGLE_DELAY; + + // + // Get the current tick count. + // + ui32WakeTime = xTaskGetTickCount(); + + // + // Loop forever. + // + while(1) + { + // + // Read the next message, if available on queue. + // + if(xQueueReceive(g_pLEDQueue, &i8Message, 0) == pdPASS) + { + // + // If left button, update to next LED. + // + if(i8Message == LEFT_BUTTON) + { + // + // Update the LED buffer to turn off the currently working. + // + g_pui32Colors[g_ui8ColorsIndx] = 0x0000; + + // + // Update the index to next LED + g_ui8ColorsIndx++; + if(g_ui8ColorsIndx > 2) + { + g_ui8ColorsIndx = 0; + } + + // + // Update the LED buffer to turn on the newly selected LED. + // + g_pui32Colors[g_ui8ColorsIndx] = 0x8000; + + // + // Configure the new LED settings. + // + RGBColorSet(g_pui32Colors); + + // + // Guard UART from concurrent access. Print the currently + // blinking LED. + // + xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY); + UARTprintf("Led %d is blinking. [R, G, B]\n", g_ui8ColorsIndx); + xSemaphoreGive(g_pUARTSemaphore); + } + + // + // If right button, update delay time between toggles of led. + // + if(i8Message == RIGHT_BUTTON) + { + ui32LEDToggleDelay *= 2; + if(ui32LEDToggleDelay > 1000) + { + ui32LEDToggleDelay = LED_TOGGLE_DELAY / 2; + } + + // + // Guard UART from concurrent access. Print the currently + // blinking frequency. + // + xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY); + UARTprintf("Led blinking frequency is %d ms.\n", + (ui32LEDToggleDelay * 2)); + xSemaphoreGive(g_pUARTSemaphore); + } + } + + // + // Turn on the LED. + // + RGBEnable(); + + // + // Wait for the required amount of time. + // + vTaskDelayUntil(&ui32WakeTime, ui32LEDToggleDelay / portTICK_RATE_MS); + + // + // Turn off the LED. + // + RGBDisable(); + + // + // Wait for the required amount of time. + // + vTaskDelayUntil(&ui32WakeTime, ui32LEDToggleDelay / portTICK_RATE_MS); + } +} + +//***************************************************************************** +// +// Initializes the LED task. +// +//***************************************************************************** +uint32_t +LEDTaskInit(void) +{ + // + // Initialize the GPIOs and Timers that drive the three LEDs. + // + RGBInit(1); + RGBIntensitySet(0.3f); + + // + // Turn on the Green LED + // + g_ui8ColorsIndx = 0; + g_pui32Colors[g_ui8ColorsIndx] = 0x8000; + RGBColorSet(g_pui32Colors); + + // + // Print the current loggling LED and frequency. + // + UARTprintf("\nLed %d is blinking. [R, G, B]\n", g_ui8ColorsIndx); + UARTprintf("Led blinking frequency is %d ms.\n", (LED_TOGGLE_DELAY * 2)); + + // + // Create a queue for sending messages to the LED task. + // + g_pLEDQueue = xQueueCreate(LED_QUEUE_SIZE, LED_ITEM_SIZE); + + // + // Create the LED task. + // + if(xTaskCreate(LEDTask, (signed portCHAR *)"LED", LEDTASKSTACKSIZE, NULL, + tskIDLE_PRIORITY + PRIORITY_LED_TASK, NULL) != pdTRUE) + { + return(1); + } + + // + // Success. + // + return(0); +} diff --git a/boards/ek-tm4c123gxl/freertos_demo/led_task.h b/boards/ek-tm4c123gxl/freertos_demo/led_task.h new file mode 100644 index 0000000..b99f689 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/led_task.h @@ -0,0 +1,35 @@ +//***************************************************************************** +// +// led_task.h - Prototypes for the LED task. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#ifndef __LED_TASK_H__ +#define __LED_TASK_H__ + +//***************************************************************************** +// +// Prototypes for the LED task. +// +//***************************************************************************** +extern uint32_t LEDTaskInit(void); + +#endif // __LED_TASK_H__ diff --git a/boards/ek-tm4c123gxl/freertos_demo/priorities.h b/boards/ek-tm4c123gxl/freertos_demo/priorities.h new file mode 100644 index 0000000..e003e1d --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/priorities.h @@ -0,0 +1,37 @@ +//***************************************************************************** +// +// priorities.h - Priorities for the various FreeRTOS tasks. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#ifndef __PRIORITIES_H__ +#define __PRIORITIES_H__ + +//***************************************************************************** +// +// The priorities of the various tasks. +// +//***************************************************************************** +#define PRIORITY_SWITCH_TASK 2 +#define PRIORITY_LED_TASK 1 + + +#endif // __PRIORITIES_H__ diff --git a/boards/ek-tm4c123gxl/freertos_demo/readme.txt b/boards/ek-tm4c123gxl/freertos_demo/readme.txt new file mode 100644 index 0000000..008bf40 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/readme.txt @@ -0,0 +1,51 @@ +FreeRTOS Example + +This application demonstrates the use of FreeRTOS on Launchpad. + +The application blinks the user-selected LED at a user-selected frequency. +To select the LED press the left button and to select the frequency press +the right button. The UART outputs the application status at 115,200 baud, +8-n-1 mode. + +This application utilizes FreeRTOS to perform the tasks in a concurrent +fashion. The following tasks are created: + +- An LED task, which blinks the user-selected on-board LED at a + user-selected rate (changed via the buttons). + +- A Switch task, which monitors the buttons pressed and passes the + information to LED task. + +In addition to the tasks, this application also uses the following FreeRTOS +resources: + +- A Queue to enable information transfer between tasks. + +- A Semaphore to guard the resource, UART, from access by multiple tasks at + the same time. + +- A non-blocking FreeRTOS Delay to put the tasks in blocked state when they + have nothing to do. + +For additional details on FreeRTOS, refer to the FreeRTOS web page at: +http://www.freertos.org/ + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/freertos_demo/rvmdk/freertos_demo.axf b/boards/ek-tm4c123gxl/freertos_demo/rvmdk/freertos_demo.axf new file mode 100644 index 0000000..fe751d4 Binary files /dev/null and b/boards/ek-tm4c123gxl/freertos_demo/rvmdk/freertos_demo.axf differ diff --git a/boards/ek-tm4c123gxl/freertos_demo/rvmdk/freertos_demo.bin b/boards/ek-tm4c123gxl/freertos_demo/rvmdk/freertos_demo.bin new file mode 100644 index 0000000..67e20cf Binary files /dev/null and b/boards/ek-tm4c123gxl/freertos_demo/rvmdk/freertos_demo.bin differ diff --git a/boards/ek-tm4c123gxl/freertos_demo/startup_ccs.c b/boards/ek-tm4c123gxl/freertos_demo/startup_ccs.c new file mode 100644 index 0000000..a11b60b --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void xPortPendSVHandler(void); +extern void vPortSVCHandler(void); +extern void xPortSysTickHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/freertos_demo/startup_ewarm.c b/boards/ek-tm4c123gxl/freertos_demo/startup_ewarm.c new file mode 100644 index 0000000..3e2ddfc --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void xPortPendSVHandler(void); +extern void vPortSVCHandler(void); +extern void xPortSysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/freertos_demo/startup_gcc.c b/boards/ek-tm4c123gxl/freertos_demo/startup_gcc.c new file mode 100644 index 0000000..6506a37 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void xPortPendSVHandler(void); +extern void vPortSVCHandler(void); +extern void xPortSysTickHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/freertos_demo/startup_rvmdk.S b/boards/ek-tm4c123gxl/freertos_demo/startup_rvmdk.S new file mode 100644 index 0000000..40c49b1 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN xPortPendSVHandler + EXTERN vPortSVCHandler + EXTERN xPortSysTickHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD vPortSVCHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD xPortPendSVHandler ; The PendSV handler + DCD xPortSysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/freertos_demo/switch_task.c b/boards/ek-tm4c123gxl/freertos_demo/switch_task.c new file mode 100644 index 0000000..cc90b73 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/switch_task.c @@ -0,0 +1,177 @@ +//***************************************************************************** +// +// switch_task.c - A simple switch task to process the buttons. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "drivers/buttons.h" +#include "utils/uartstdio.h" +#include "switch_task.h" +#include "led_task.h" +#include "priorities.h" +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +//***************************************************************************** +// +// The stack size for the display task. +// +//***************************************************************************** +#define SWITCHTASKSTACKSIZE 128 // Stack size in words + +extern xQueueHandle g_pLEDQueue; +extern xSemaphoreHandle g_pUARTSemaphore; + +//***************************************************************************** +// +// This task reads the buttons' state and passes this information to LEDTask. +// +//***************************************************************************** +static void +SwitchTask(void *pvParameters) +{ + portTickType ui16LastTime; + uint32_t ui32SwitchDelay = 25; + uint8_t ui8CurButtonState, ui8PrevButtonState; + uint8_t ui8Message; + + ui8CurButtonState = ui8PrevButtonState = 0; + + // + // Get the current tick count. + // + ui16LastTime = xTaskGetTickCount(); + + // + // Loop forever. + // + while(1) + { + // + // Poll the debounced state of the buttons. + // + ui8CurButtonState = ButtonsPoll(0, 0); + + // + // Check if previous debounced state is equal to the current state. + // + if(ui8CurButtonState != ui8PrevButtonState) + { + ui8PrevButtonState = ui8CurButtonState; + + // + // Check to make sure the change in state is due to button press + // and not due to button release. + // + if((ui8CurButtonState & ALL_BUTTONS) != 0) + { + if((ui8CurButtonState & ALL_BUTTONS) == LEFT_BUTTON) + { + ui8Message = LEFT_BUTTON; + + // + // Guard UART from concurrent access. + // + xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY); + UARTprintf("Left Button is pressed.\n"); + xSemaphoreGive(g_pUARTSemaphore); + } + else if((ui8CurButtonState & ALL_BUTTONS) == RIGHT_BUTTON) + { + ui8Message = RIGHT_BUTTON; + + // + // Guard UART from concurrent access. + // + xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY); + UARTprintf("Right Button is pressed.\n"); + xSemaphoreGive(g_pUARTSemaphore); + } + + // + // Pass the value of the button pressed to LEDTask. + // + if(xQueueSend(g_pLEDQueue, &ui8Message, portMAX_DELAY) != + pdPASS) + { + // + // Error. The queue should never be full. If so print the + // error message on UART and wait for ever. + // + UARTprintf("\nQueue full. This should never happen.\n"); + while(1) + { + } + } + } + } + + // + // Wait for the required amount of time to check back. + // + vTaskDelayUntil(&ui16LastTime, ui32SwitchDelay / portTICK_RATE_MS); + } +} + +//***************************************************************************** +// +// Initializes the switch task. +// +//***************************************************************************** +uint32_t +SwitchTaskInit(void) +{ + // + // Unlock the GPIO LOCK register for Right button to work. + // + HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0xFF; + + // + // Initialize the buttons + // + ButtonsInit(); + + // + // Create the switch task. + // + if(xTaskCreate(SwitchTask, (signed portCHAR *)"Switch", + SWITCHTASKSTACKSIZE, NULL, tskIDLE_PRIORITY + + PRIORITY_SWITCH_TASK, NULL) != pdTRUE) + { + return(1); + } + + // + // Success. + // + return(0); +} diff --git a/boards/ek-tm4c123gxl/freertos_demo/switch_task.h b/boards/ek-tm4c123gxl/freertos_demo/switch_task.h new file mode 100644 index 0000000..89957b8 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/switch_task.h @@ -0,0 +1,35 @@ +//***************************************************************************** +// +// switch_task.h - Prototypes for the switch task. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#ifndef __SWITCH_TASK_H__ +#define __SWITCH_TASK_H__ + +//***************************************************************************** +// +// Prototypes for the switch task. +// +//***************************************************************************** +extern uint32_t SwitchTaskInit(void); + +#endif // __SWITCH_TASK_H__ diff --git a/boards/ek-tm4c123gxl/gpio_jtag/Makefile b/boards/ek-tm4c123gxl/gpio_jtag/Makefile new file mode 100644 index 0000000..1c0d29e --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/Makefile @@ -0,0 +1,88 @@ +#****************************************************************************** +# +# Makefile - Rules for building the gpio_jtag example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the gpio_jtag example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/gpio_jtag.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the gpio_jtag example. +# +${COMPILER}/gpio_jtag.axf: ${COMPILER}/buttons.o +${COMPILER}/gpio_jtag.axf: ${COMPILER}/gpio_jtag.o +${COMPILER}/gpio_jtag.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/gpio_jtag.axf: ${COMPILER}/uartstdio.o +${COMPILER}/gpio_jtag.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/gpio_jtag.axf: gpio_jtag.ld +SCATTERgcc_gpio_jtag=gpio_jtag.ld +ENTRY_gpio_jtag=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/gpio_jtag/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/gpio_jtag/ccs/.ccsimportspec new file mode 100644 index 0000000..005f812 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-tm4c123gxl/gpio_jtag/ccs/.ccsproject b/boards/ek-tm4c123gxl/gpio_jtag/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/gpio_jtag/ccs/.cproject b/boards/ek-tm4c123gxl/gpio_jtag/ccs/.cproject new file mode 100644 index 0000000..3d146a4 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/ccs/.cproject @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/gpio_jtag/ccs/.project b/boards/ek-tm4c123gxl/gpio_jtag/ccs/.project new file mode 100644 index 0000000..20946c3 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/ccs/.project @@ -0,0 +1,60 @@ + + + gpio_jtag + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + gpio_jtag.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.c + + + gpio_jtag_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/gpio_jtag/startup_ccs.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/drivers/buttons.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/gpio_jtag/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/gpio_jtag/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/gpio_jtag/ccs/Debug/gpio_jtag.bin b/boards/ek-tm4c123gxl/gpio_jtag/ccs/Debug/gpio_jtag.bin new file mode 100644 index 0000000..c367b45 Binary files /dev/null and b/boards/ek-tm4c123gxl/gpio_jtag/ccs/Debug/gpio_jtag.bin differ diff --git a/boards/ek-tm4c123gxl/gpio_jtag/ccs/Debug/gpio_jtag.out b/boards/ek-tm4c123gxl/gpio_jtag/ccs/Debug/gpio_jtag.out new file mode 100644 index 0000000..9902a8f Binary files /dev/null and b/boards/ek-tm4c123gxl/gpio_jtag/ccs/Debug/gpio_jtag.out differ diff --git a/boards/ek-tm4c123gxl/gpio_jtag/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/gpio_jtag/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/gpio_jtag/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/gpio_jtag/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/gpio_jtag/ewarm/Exe/gpio_jtag.bin b/boards/ek-tm4c123gxl/gpio_jtag/ewarm/Exe/gpio_jtag.bin new file mode 100644 index 0000000..1b07f0f Binary files /dev/null and b/boards/ek-tm4c123gxl/gpio_jtag/ewarm/Exe/gpio_jtag.bin differ diff --git a/boards/ek-tm4c123gxl/gpio_jtag/ewarm/Exe/gpio_jtag.out b/boards/ek-tm4c123gxl/gpio_jtag/ewarm/Exe/gpio_jtag.out new file mode 100644 index 0000000..79229bd Binary files /dev/null and b/boards/ek-tm4c123gxl/gpio_jtag/ewarm/Exe/gpio_jtag.out differ diff --git a/boards/ek-tm4c123gxl/gpio_jtag/gcc/gpio_jtag.axf b/boards/ek-tm4c123gxl/gpio_jtag/gcc/gpio_jtag.axf new file mode 100644 index 0000000..d5d9900 Binary files /dev/null and b/boards/ek-tm4c123gxl/gpio_jtag/gcc/gpio_jtag.axf differ diff --git a/boards/ek-tm4c123gxl/gpio_jtag/gcc/gpio_jtag.bin b/boards/ek-tm4c123gxl/gpio_jtag/gcc/gpio_jtag.bin new file mode 100644 index 0000000..635ac80 Binary files /dev/null and b/boards/ek-tm4c123gxl/gpio_jtag/gcc/gpio_jtag.bin differ diff --git a/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.c b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.c new file mode 100644 index 0000000..966307f --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.c @@ -0,0 +1,316 @@ +//***************************************************************************** +// +// gpio_jtag.c - Example to demonstrate recovering the JTAG interface. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_gpio.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "utils/uartstdio.h" +#include "drivers/buttons.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      GPIO JTAG Recovery (gpio_jtag)

      +//! +//! This example demonstrates changing the JTAG pins into GPIOs, aint32_t with a +//! mechanism to revert them to JTAG pins. When first run, the pins remain in +//! JTAG mode. Pressing the left button will toggle the pins between JTAG mode +//! and GPIO mode. Because there is no debouncing of the push button (either +//! in hardware or software), a button press will occasionally result in more +//! than one mode change. +//! +//! In this example, four pins (PC0, PC1, PC2, and PC3) are switched. +//! +//! UART0, connected to the ICDI virtual COM port and running at 115,200, +//! 8-N-1, is used to display messages from this application. +// +//***************************************************************************** + + +//***************************************************************************** +// +// The current mode of pins PC0, PC1, PC2, and PC3. When zero, the pins +// are in JTAG mode; when non-zero, the pins are in GPIO mode. +// +//***************************************************************************** +volatile uint32_t g_ui32Mode; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the PB4 pin interrupt. When triggered, this will +// toggle the JTAG pins between JTAG and GPIO mode. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + uint8_t ui8Buttons; + uint8_t ui8ButtonsChanged; + + // + // Grab the current, debounced state of the buttons. + // + ui8Buttons = ButtonsPoll(&ui8ButtonsChanged, 0); + + // + // If the left button has been pressed, and was previously not pressed, + // start the process of changing the behavior of the JTAG pins. + // + if(BUTTON_PRESSED(LEFT_BUTTON, ui8Buttons, ui8ButtonsChanged)) + { + // + // Toggle the pin mode. + // + g_ui32Mode ^= 1; + + // + // See if the pins should be in JTAG or GPIO mode. + // + if(g_ui32Mode == 0) + { + // + // Change PC0-3 into hardware (i.e. JTAG) pins. + // + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x01; + HWREG(GPIO_PORTC_BASE + GPIO_O_AFSEL) |= 0x01; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x02; + HWREG(GPIO_PORTC_BASE + GPIO_O_AFSEL) |= 0x02; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x04; + HWREG(GPIO_PORTC_BASE + GPIO_O_AFSEL) |= 0x04; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x08; + HWREG(GPIO_PORTC_BASE + GPIO_O_AFSEL) |= 0x08; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x00; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = 0; + + // + // Turn on the LED to indicate that the pins are in JTAG mode. + // + ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3 | GPIO_PIN_1, + GPIO_PIN_3); + } + else + { + // + // Change PC0-3 into GPIO inputs. + // + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x01; + HWREG(GPIO_PORTC_BASE + GPIO_O_AFSEL) &= 0xfe; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x02; + HWREG(GPIO_PORTC_BASE + GPIO_O_AFSEL) &= 0xfd; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x04; + HWREG(GPIO_PORTC_BASE + GPIO_O_AFSEL) &= 0xfb; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x08; + HWREG(GPIO_PORTC_BASE + GPIO_O_AFSEL) &= 0xf7; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x00; + HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = 0; + ROM_GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, (GPIO_PIN_0 | GPIO_PIN_1 | + GPIO_PIN_2 | GPIO_PIN_3)); + + // + // Turn off the LED to indicate that the pins are in GPIO mode. + // + ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3 | GPIO_PIN_1, + GPIO_PIN_1); + } + } +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// Toggle the JTAG pins between JTAG and GPIO mode with a push button selecting +// between the two. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Mode; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Enable the peripherals used by this application. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + + // + // Initialize the button driver. + // + ButtonsInit(); + + // + // Set up a SysTick Interrupt to handle polling and debouncing for our + // buttons. + // + SysTickPeriodSet(SysCtlClockGet() / 100); + SysTickIntEnable(); + SysTickEnable(); + + IntMasterEnable(); + + // + // Configure the LED as an output and turn it on. + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3 | GPIO_PIN_1); + ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3 | GPIO_PIN_1, GPIO_PIN_3); + + // + // Set the global and local indicator of pin mode to zero, meaning JTAG. + // + g_ui32Mode = 0; + ui32Mode = 0; + + // + // Initialize the UART. + // + ConfigureUART(); + + UARTprintf("\033[2JGPIO <-> JTAG\n"); + + // + // Indicate that the pins start out as JTAG. + // + UARTprintf("Pins are JTAG\n"); + + // + // Loop forever. This loop simply exists to display on the UART the + // current state of PC0-3; the handling of changing the JTAG pins to and + // from GPIO mode is done in GPIO Interrupt Handler. + // + while(1) + { + // + // Wait until the pin mode changes. + // + while(g_ui32Mode == ui32Mode) + { + } + + // + // Save the new mode locally so that a subsequent pin mode change can + // be detected. + // + ui32Mode = g_ui32Mode; + + // + // See what the new pin mode was changed to. + // + if(ui32Mode == 0) + { + // + // Indicate that PC0-3 are currently JTAG pins. + // + UARTprintf("Pins are JTAG\n"); + } + else + { + // + // Indicate that PC0-3 are currently GPIO pins. + // + UARTprintf("Pins are GPIO\n"); + } + } +} diff --git a/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ewd b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ewp b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ewp new file mode 100644 index 0000000..3871352 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ewp @@ -0,0 +1,792 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\gpio_jtag.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.icf b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.icf new file mode 100644 index 0000000..7d26d1e --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// gpio_jtag.icf - Linker configuration file for gpio_jtag. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ld b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ld new file mode 100644 index 0000000..e95c1db --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * gpio_jtag.ld - Linker configuration file for gpio_jtag. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.sct b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.sct new file mode 100644 index 0000000..126215b --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; gpio_jtag.sct - Linker configuration file for gpio_jtag. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.uvopt b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.uvopt new file mode 100644 index 0000000..b1f4bb5 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.uvopt @@ -0,0 +1,317 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + gpio_jtag + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\gpio_jtag.c + gpio_jtag.c + + + 1 + 3 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 5 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 6 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.uvproj b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.uvproj new file mode 100644 index 0000000..4c0e8e0 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag.uvproj @@ -0,0 +1,434 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + gpio_jtag + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + gpio_jtag + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\gpio_jtag.bin .\rvmdk\gpio_jtag.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + gpio_jtag.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + gpio_jtag.c + 1 + .\gpio_jtag.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag_ccs.cmd b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag_ccs.cmd new file mode 100644 index 0000000..13d49d9 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/gpio_jtag_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * gpio_jtag_ccs.cmd - CCS linker configuration file for gpio_jtag. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 256; diff --git a/boards/ek-tm4c123gxl/gpio_jtag/readme.txt b/boards/ek-tm4c123gxl/gpio_jtag/readme.txt new file mode 100644 index 0000000..fa5fa5a --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/readme.txt @@ -0,0 +1,33 @@ +GPIO JTAG Recovery + +This example demonstrates changing the JTAG pins into GPIOs, aint32_t with a +mechanism to revert them to JTAG pins. When first run, the pins remain in +JTAG mode. Pressing the left button will toggle the pins between JTAG mode +and GPIO mode. Because there is no debouncing of the push button (either +in hardware or software), a button press will occasionally result in more +than one mode change. + +In this example, four pins (PC0, PC1, PC2, and PC3) are switched. + +UART0, connected to the ICDI virtual COM port and running at 115,200, +8-N-1, is used to display messages from this application. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/gpio_jtag/rvmdk/gpio_jtag.axf b/boards/ek-tm4c123gxl/gpio_jtag/rvmdk/gpio_jtag.axf new file mode 100644 index 0000000..73ded3f Binary files /dev/null and b/boards/ek-tm4c123gxl/gpio_jtag/rvmdk/gpio_jtag.axf differ diff --git a/boards/ek-tm4c123gxl/gpio_jtag/rvmdk/gpio_jtag.bin b/boards/ek-tm4c123gxl/gpio_jtag/rvmdk/gpio_jtag.bin new file mode 100644 index 0000000..fda4449 Binary files /dev/null and b/boards/ek-tm4c123gxl/gpio_jtag/rvmdk/gpio_jtag.bin differ diff --git a/boards/ek-tm4c123gxl/gpio_jtag/startup_ccs.c b/boards/ek-tm4c123gxl/gpio_jtag/startup_ccs.c new file mode 100644 index 0000000..ff2d64c --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/gpio_jtag/startup_ewarm.c b/boards/ek-tm4c123gxl/gpio_jtag/startup_ewarm.c new file mode 100644 index 0000000..9ca4ef2 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/gpio_jtag/startup_gcc.c b/boards/ek-tm4c123gxl/gpio_jtag/startup_gcc.c new file mode 100644 index 0000000..e63cdb5 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/gpio_jtag/startup_rvmdk.S b/boards/ek-tm4c123gxl/gpio_jtag/startup_rvmdk.S new file mode 100644 index 0000000..7d46f86 --- /dev/null +++ b/boards/ek-tm4c123gxl/gpio_jtag/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000100 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/hello/Makefile b/boards/ek-tm4c123gxl/hello/Makefile new file mode 100644 index 0000000..865cd2e --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/Makefile @@ -0,0 +1,85 @@ +#****************************************************************************** +# +# Makefile - Rules for building the hello example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the hello example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/hello.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the hello example. +# +${COMPILER}/hello.axf: ${COMPILER}/hello.o +${COMPILER}/hello.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/hello.axf: ${COMPILER}/uartstdio.o +${COMPILER}/hello.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/hello.axf: hello.ld +SCATTERgcc_hello=hello.ld +ENTRY_hello=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/hello/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/hello/ccs/.ccsimportspec new file mode 100644 index 0000000..77b03f5 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-tm4c123gxl/hello/ccs/.ccsproject b/boards/ek-tm4c123gxl/hello/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/hello/ccs/.cproject b/boards/ek-tm4c123gxl/hello/ccs/.cproject new file mode 100644 index 0000000..8bac62a --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/ccs/.cproject @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/hello/ccs/.project b/boards/ek-tm4c123gxl/hello/ccs/.project new file mode 100644 index 0000000..340d14c --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/ccs/.project @@ -0,0 +1,55 @@ + + + hello + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + hello.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/hello/hello.c + + + hello_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/hello/hello_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/hello/startup_ccs.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/hello/ccs/Debug/hello.bin b/boards/ek-tm4c123gxl/hello/ccs/Debug/hello.bin new file mode 100644 index 0000000..d8ddaee Binary files /dev/null and b/boards/ek-tm4c123gxl/hello/ccs/Debug/hello.bin differ diff --git a/boards/ek-tm4c123gxl/hello/ccs/Debug/hello.out b/boards/ek-tm4c123gxl/hello/ccs/Debug/hello.out new file mode 100644 index 0000000..ea90fa5 Binary files /dev/null and b/boards/ek-tm4c123gxl/hello/ccs/Debug/hello.out differ diff --git a/boards/ek-tm4c123gxl/hello/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/hello/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/hello/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/hello/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/hello/ewarm/Exe/hello.bin b/boards/ek-tm4c123gxl/hello/ewarm/Exe/hello.bin new file mode 100644 index 0000000..7d3b7bb Binary files /dev/null and b/boards/ek-tm4c123gxl/hello/ewarm/Exe/hello.bin differ diff --git a/boards/ek-tm4c123gxl/hello/ewarm/Exe/hello.out b/boards/ek-tm4c123gxl/hello/ewarm/Exe/hello.out new file mode 100644 index 0000000..0b8323d Binary files /dev/null and b/boards/ek-tm4c123gxl/hello/ewarm/Exe/hello.out differ diff --git a/boards/ek-tm4c123gxl/hello/gcc/hello.axf b/boards/ek-tm4c123gxl/hello/gcc/hello.axf new file mode 100644 index 0000000..b01bdc8 Binary files /dev/null and b/boards/ek-tm4c123gxl/hello/gcc/hello.axf differ diff --git a/boards/ek-tm4c123gxl/hello/gcc/hello.bin b/boards/ek-tm4c123gxl/hello/gcc/hello.bin new file mode 100644 index 0000000..10fdf66 Binary files /dev/null and b/boards/ek-tm4c123gxl/hello/gcc/hello.bin differ diff --git a/boards/ek-tm4c123gxl/hello/hello.c b/boards/ek-tm4c123gxl/hello/hello.c new file mode 100644 index 0000000..7001b82 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/hello.c @@ -0,0 +1,167 @@ +//***************************************************************************** +// +// hello.c - Simple hello world example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Hello World (hello)

      +//! +//! A very simple ``hello world'' example. It simply displays ``Hello World!'' +//! on the UART and is a starting point for more complicated applications. +//! +//! UART0, connected to the Virtual Serial Port and running at +//! 115,200, 8-N-1, is used to display messages from this application. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// Print "Hello World!" to the UART on the evaluation board. +// +//***************************************************************************** +int +main(void) +{ + //volatile uint32_t ui32Loop; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Enable the GPIO port that is used for the on-board LED. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + + // + // Enable the GPIO pins for the LED (PF2 & PF3). + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2); + + // + // Initialize the UART. + // + ConfigureUART(); + + // + // Hello! + // + UARTprintf("Hello, world!\n"); + + // + // We are finished. Hang around doing nothing. + // + while(1) + { + // + // Turn on the BLUE LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); + + // + // Delay for a bit. + // + SysCtlDelay(SysCtlClockGet() / 10 / 3); + + // + // Turn off the BLUE LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); + + // + // Delay for a bit. + // + SysCtlDelay(SysCtlClockGet() / 10 / 3); + } +} diff --git a/boards/ek-tm4c123gxl/hello/hello.ewd b/boards/ek-tm4c123gxl/hello/hello.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/hello.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/hello/hello.ewp b/boards/ek-tm4c123gxl/hello/hello.ewp new file mode 100644 index 0000000..7bae963 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/hello.ewp @@ -0,0 +1,787 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + + Source + + $PROJ_DIR$\hello.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/ek-tm4c123gxl/hello/hello.icf b/boards/ek-tm4c123gxl/hello/hello.icf new file mode 100644 index 0000000..5a8a3d8 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/hello.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// hello.icf - Linker configuration file for hello. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/hello/hello.ld b/boards/ek-tm4c123gxl/hello/hello.ld new file mode 100644 index 0000000..914ca07 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/hello.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * hello.ld - Linker configuration file for hello. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/hello/hello.sct b/boards/ek-tm4c123gxl/hello/hello.sct new file mode 100644 index 0000000..605e6c8 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/hello.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; hello.sct - Linker configuration file for hello. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/hello/hello.uvopt b/boards/ek-tm4c123gxl/hello/hello.uvopt new file mode 100644 index 0000000..4b32fc4 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/hello.uvopt @@ -0,0 +1,303 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + hello + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\hello.c + hello.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 5 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/hello/hello.uvproj b/boards/ek-tm4c123gxl/hello/hello.uvproj new file mode 100644 index 0000000..cf58f75 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/hello.uvproj @@ -0,0 +1,429 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + hello + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + hello + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\hello.bin .\rvmdk\hello.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + hello.sct + + + --entry Reset_Handler + + + + + + + + Source + + + hello.c + 1 + .\hello.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/hello/hello_ccs.cmd b/boards/ek-tm4c123gxl/hello/hello_ccs.cmd new file mode 100644 index 0000000..e18cbb7 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/hello_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * hello_ccs.cmd - CCS linker configuration file for hello. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-tm4c123gxl/hello/readme.txt b/boards/ek-tm4c123gxl/hello/readme.txt new file mode 100644 index 0000000..043789d --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/readme.txt @@ -0,0 +1,27 @@ +Hello World + +A very simple ``hello world'' example. It simply displays ``Hello World!'' +on the UART and is a starting point for more complicated applications. + +UART0, connected to the Virtual Serial Port and running at +115,200, 8-N-1, is used to display messages from this application. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/hello/rvmdk/hello.axf b/boards/ek-tm4c123gxl/hello/rvmdk/hello.axf new file mode 100644 index 0000000..e27a601 Binary files /dev/null and b/boards/ek-tm4c123gxl/hello/rvmdk/hello.axf differ diff --git a/boards/ek-tm4c123gxl/hello/rvmdk/hello.bin b/boards/ek-tm4c123gxl/hello/rvmdk/hello.bin new file mode 100644 index 0000000..e689012 Binary files /dev/null and b/boards/ek-tm4c123gxl/hello/rvmdk/hello.bin differ diff --git a/boards/ek-tm4c123gxl/hello/startup_ccs.c b/boards/ek-tm4c123gxl/hello/startup_ccs.c new file mode 100644 index 0000000..ca18035 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/hello/startup_ewarm.c b/boards/ek-tm4c123gxl/hello/startup_ewarm.c new file mode 100644 index 0000000..8d8e1a9 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/hello/startup_gcc.c b/boards/ek-tm4c123gxl/hello/startup_gcc.c new file mode 100644 index 0000000..d164864 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/hello/startup_rvmdk.S b/boards/ek-tm4c123gxl/hello/startup_rvmdk.S new file mode 100644 index 0000000..37cd427 --- /dev/null +++ b/boards/ek-tm4c123gxl/hello/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/interrupts/Makefile b/boards/ek-tm4c123gxl/interrupts/Makefile new file mode 100644 index 0000000..23f5ef6 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/Makefile @@ -0,0 +1,85 @@ +#****************************************************************************** +# +# Makefile - Rules for building the interrupts example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the interrupts example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/interrupts.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the interrupts example. +# +${COMPILER}/interrupts.axf: ${COMPILER}/interrupts.o +${COMPILER}/interrupts.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/interrupts.axf: ${COMPILER}/uartstdio.o +${COMPILER}/interrupts.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/interrupts.axf: interrupts.ld +SCATTERgcc_interrupts=interrupts.ld +ENTRY_interrupts=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/interrupts/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/interrupts/ccs/.ccsimportspec new file mode 100644 index 0000000..9033256 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-tm4c123gxl/interrupts/ccs/.ccsproject b/boards/ek-tm4c123gxl/interrupts/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/interrupts/ccs/.cproject b/boards/ek-tm4c123gxl/interrupts/ccs/.cproject new file mode 100644 index 0000000..9c75177 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/ccs/.cproject @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/interrupts/ccs/.project b/boards/ek-tm4c123gxl/interrupts/ccs/.project new file mode 100644 index 0000000..918ff96 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/ccs/.project @@ -0,0 +1,55 @@ + + + interrupts + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + interrupts.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/interrupts/interrupts.c + + + interrupts_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/interrupts/interrupts_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/interrupts/startup_ccs.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/interrupts/ccs/Debug/interrupts.bin b/boards/ek-tm4c123gxl/interrupts/ccs/Debug/interrupts.bin new file mode 100644 index 0000000..17a5db5 Binary files /dev/null and b/boards/ek-tm4c123gxl/interrupts/ccs/Debug/interrupts.bin differ diff --git a/boards/ek-tm4c123gxl/interrupts/ccs/Debug/interrupts.out b/boards/ek-tm4c123gxl/interrupts/ccs/Debug/interrupts.out new file mode 100644 index 0000000..77cc4c1 Binary files /dev/null and b/boards/ek-tm4c123gxl/interrupts/ccs/Debug/interrupts.out differ diff --git a/boards/ek-tm4c123gxl/interrupts/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/interrupts/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/interrupts/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/interrupts/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/interrupts/ewarm/Exe/interrupts.bin b/boards/ek-tm4c123gxl/interrupts/ewarm/Exe/interrupts.bin new file mode 100644 index 0000000..4d5ed08 Binary files /dev/null and b/boards/ek-tm4c123gxl/interrupts/ewarm/Exe/interrupts.bin differ diff --git a/boards/ek-tm4c123gxl/interrupts/ewarm/Exe/interrupts.out b/boards/ek-tm4c123gxl/interrupts/ewarm/Exe/interrupts.out new file mode 100644 index 0000000..577c878 Binary files /dev/null and b/boards/ek-tm4c123gxl/interrupts/ewarm/Exe/interrupts.out differ diff --git a/boards/ek-tm4c123gxl/interrupts/gcc/interrupts.axf b/boards/ek-tm4c123gxl/interrupts/gcc/interrupts.axf new file mode 100644 index 0000000..0401895 Binary files /dev/null and b/boards/ek-tm4c123gxl/interrupts/gcc/interrupts.axf differ diff --git a/boards/ek-tm4c123gxl/interrupts/gcc/interrupts.bin b/boards/ek-tm4c123gxl/interrupts/gcc/interrupts.bin new file mode 100644 index 0000000..a27d272 Binary files /dev/null and b/boards/ek-tm4c123gxl/interrupts/gcc/interrupts.bin differ diff --git a/boards/ek-tm4c123gxl/interrupts/interrupts.c b/boards/ek-tm4c123gxl/interrupts/interrupts.c new file mode 100644 index 0000000..6731232 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/interrupts.c @@ -0,0 +1,549 @@ +//***************************************************************************** +// +// interrupts.c - Interrupt preemption and tail-chaining example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Interrupts (interrupts)

      +//! +//! This example application demonstrates the interrupt preemption and +//! tail-chaining capabilities of Cortex-M4 microprocessor and NVIC. Nested +//! interrupts are synthesized when the interrupts have the same priority, +//! increasing priorities, and decreasing priorities. With increasing +//! priorities, preemption will occur; in the other two cases tail-chaining +//! will occur. The currently pending interrupts and the currently executing +//! interrupt will be displayed on the display; GPIO pins E1, E2 and E3 will +//! be asserted upon interrupt handler entry and de-asserted before interrupt +//! handler exit so that the off-to-on time can be observed with a scope or +//! logic analyzer to see the speed of tail-chaining (for the two cases where +//! tail-chaining is occurring). +// +//***************************************************************************** + +//***************************************************************************** +// +// The count of interrupts received. This is incremented as each interrupt +// handler runs, and its value saved into interrupt handler specific values to +// determine the order in which the interrupt handlers were executed. +// +//***************************************************************************** +volatile uint32_t g_ui32Index; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOA interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOa; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOB interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOb; + +//***************************************************************************** +// +// The value of g_ui32Index when the INT_GPIOC interrupt was processed. +// +//***************************************************************************** +volatile uint32_t g_ui32GPIOc; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Delay for the specified number of seconds. Depending upon the current +// SysTick value, the delay will be between N-1 and N seconds (i.e. N-1 full +// seconds are guaranteed, aint32_t with the remainder of the current second). +// +//***************************************************************************** +void +Delay(uint32_t ui32Seconds) +{ + // + // Loop while there are more seconds to wait. + // + while(ui32Seconds--) + { + // + // Wait until the SysTick value is less than 1000. + // + while(ROM_SysTickValueGet() > 1000) + { + } + + // + // Wait until the SysTick value is greater than 1000. + // + while(ROM_SysTickValueGet() < 1000) + { + } + } +} + +//***************************************************************************** +// +// Display the interrupt state on the UART. The currently active and pending +// interrupts are displayed. +// +//***************************************************************************** +void +DisplayIntStatus(void) +{ + uint32_t ui32Temp; + + // + // Display the currently active interrupts. + // + ui32Temp = HWREG(NVIC_ACTIVE0); + UARTprintf("\rActive: %c%c%c ", (ui32Temp & 1) ? '1' : ' ', + (ui32Temp & 2) ? '2' : ' ', (ui32Temp & 4) ? '3' : ' '); + + // + // Display the currently pending interrupts. + // + ui32Temp = HWREG(NVIC_PEND0); + UARTprintf("Pending: %c%c%c", (ui32Temp & 1) ? '1' : ' ', + (ui32Temp & 2) ? '2' : ' ', (ui32Temp & 4) ? '3' : ' '); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOA. It simply saves the interrupt sequence +// number. +// +//***************************************************************************** +void +IntGPIOa(void) +{ + // + // Set PE1 high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1, GPIO_PIN_1); + + // + // Put the current interrupt state on the UART. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOa = g_ui32Index++; + + // + // Set PE1 low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1, 0); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOB. It triggers INT_GPIOA and saves the +// interrupt sequence number. +// +//***************************************************************************** +void +IntGPIOb(void) +{ + // + // Set PE2 high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_2, GPIO_PIN_2); + + // + // Put the current interrupt state on the UART. + // + DisplayIntStatus(); + + // + // Trigger the INT_GPIOA interrupt. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOA - 16; + + // + // Put the current interrupt state on the UART. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOb = g_ui32Index++; + + // + // Set PE2 low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_2, 0); +} + +//***************************************************************************** +// +// This is the handler for INT_GPIOC. It triggers INT_GPIOB and saves the +// interrupt sequence number. +// +//***************************************************************************** +void +IntGPIOc(void) +{ + // + // Set PE3 high to indicate entry to this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_3, GPIO_PIN_3); + + // + // Put the current interrupt state on the UART. + // + DisplayIntStatus(); + + // + // Trigger the INT_GPIOB interrupt. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOB - 16; + + // + // Put the current interrupt state on the UART. + // + DisplayIntStatus(); + + // + // Wait two seconds. + // + Delay(2); + + // + // Save and increment the interrupt sequence number. + // + g_ui32GPIOc = g_ui32Index++; + + // + // Set PE3 low to indicate exit from this interrupt handler. + // + ROM_GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_3, 0); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This is the main example program. It checks to see that the interrupts are +// processed in the correct order when they have identical priorities, +// increasing priorities, and decreasing priorities. This exercises interrupt +// preemption and tail chaining. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Error; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); + + // + // Initialize the UART. + // + ConfigureUART(); + + UARTprintf("\033[2JInterrupts\n"); + + // + // Configure the PB0-PB2 to be outputs to indicate entry/exit of one + // of the interrupt handlers. + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_1 | GPIO_PIN_2 | + GPIO_PIN_3); + ROM_GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, 0); + + // + // Set up and enable the SysTick timer. It will be used as a reference + // for delay loops in the interrupt handlers. The SysTick timer period + // will be set up for one second. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet()); + ROM_SysTickEnable(); + + // + // Reset the error indicator. + // + ui32Error = 0; + + // + // Enable interrupts to the processor. + // + ROM_IntMasterEnable(); + + // + // Enable the interrupts. + // + ROM_IntEnable(INT_GPIOA); + ROM_IntEnable(INT_GPIOB); + ROM_IntEnable(INT_GPIOC); + + // + // Indicate that the equal interrupt priority test is beginning. + // + UARTprintf("\nEqual Priority\n"); + + // + // Set the interrupt priorities so they are all equal. + // + ROM_IntPrioritySet(INT_GPIOA, 0x00); + ROM_IntPrioritySet(INT_GPIOB, 0x00); + ROM_IntPrioritySet(INT_GPIOC, 0x00); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the LCD. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 3) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 1)) + { + ui32Error |= 1; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Indicate that the decreasing interrupt priority test is beginning. + // + UARTprintf("\nDecreasing Priority\n"); + + // + // Set the interrupt priorities so that they are decreasing (i.e. C > B > + // A). + // + ROM_IntPrioritySet(INT_GPIOA, 0x80); + ROM_IntPrioritySet(INT_GPIOB, 0x40); + ROM_IntPrioritySet(INT_GPIOC, 0x00); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the UART. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 3) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 1)) + { + ui32Error |= 2; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Indicate that the increasing interrupt priority test is beginning. + // + UARTprintf("\nIncreasing Priority\n"); + + // + // Set the interrupt priorities so that they are increasing (i.e. C < B < + // A). + // + ROM_IntPrioritySet(INT_GPIOA, 0x00); + ROM_IntPrioritySet(INT_GPIOB, 0x40); + ROM_IntPrioritySet(INT_GPIOC, 0x80); + + // + // Reset the interrupt flags. + // + g_ui32GPIOa = 0; + g_ui32GPIOb = 0; + g_ui32GPIOc = 0; + g_ui32Index = 1; + + // + // Trigger the interrupt for GPIO C. + // + HWREG(NVIC_SW_TRIG) = INT_GPIOC - 16; + + // + // Put the current interrupt state on the UART. + // + DisplayIntStatus(); + + // + // Verify that the interrupts were processed in the correct order. + // + if((g_ui32GPIOa != 1) || (g_ui32GPIOb != 2) || (g_ui32GPIOc != 3)) + { + ui32Error |= 4; + } + + // + // Wait two seconds. + // + Delay(2); + + // + // Disable the interrupts. + // + ROM_IntDisable(INT_GPIOA); + ROM_IntDisable(INT_GPIOB); + ROM_IntDisable(INT_GPIOC); + + // + // Disable interrupts to the processor. + // + ROM_IntMasterDisable(); + + // + // Print out the test results. + // + UARTprintf("\nInterrupt Priority =: %s >: %s <: %s\n", + (ui32Error & 1) ? "Fail" : "Pass", + (ui32Error & 2) ? "Fail" : "Pass", + (ui32Error & 4) ? "Fail" : "Pass"); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/interrupts/interrupts.ewd b/boards/ek-tm4c123gxl/interrupts/interrupts.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/interrupts.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/interrupts/interrupts.ewp b/boards/ek-tm4c123gxl/interrupts/interrupts.ewp new file mode 100644 index 0000000..1b5721c --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/interrupts.ewp @@ -0,0 +1,787 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + + Source + + $PROJ_DIR$\interrupts.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/ek-tm4c123gxl/interrupts/interrupts.icf b/boards/ek-tm4c123gxl/interrupts/interrupts.icf new file mode 100644 index 0000000..14d291c --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/interrupts.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// interrupts.icf - Linker configuration file for interrupts. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/interrupts/interrupts.ld b/boards/ek-tm4c123gxl/interrupts/interrupts.ld new file mode 100644 index 0000000..68b0844 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/interrupts.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * interrupts.ld - Linker configuration file for interrupts. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/interrupts/interrupts.sct b/boards/ek-tm4c123gxl/interrupts/interrupts.sct new file mode 100644 index 0000000..4608d4e --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/interrupts.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; interrupts.sct - Linker configuration file for interrupts. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/interrupts/interrupts.uvopt b/boards/ek-tm4c123gxl/interrupts/interrupts.uvopt new file mode 100644 index 0000000..51aca39 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/interrupts.uvopt @@ -0,0 +1,303 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + interrupts + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\interrupts.c + interrupts.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 5 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/interrupts/interrupts.uvproj b/boards/ek-tm4c123gxl/interrupts/interrupts.uvproj new file mode 100644 index 0000000..0a02893 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/interrupts.uvproj @@ -0,0 +1,429 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + interrupts + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + interrupts + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\interrupts.bin .\rvmdk\interrupts.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + interrupts.sct + + + --entry Reset_Handler + + + + + + + + Source + + + interrupts.c + 1 + .\interrupts.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/interrupts/interrupts_ccs.cmd b/boards/ek-tm4c123gxl/interrupts/interrupts_ccs.cmd new file mode 100644 index 0000000..09913c9 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/interrupts_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * interrupts_ccs.cmd - CCS linker configuration file for interrupts. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 512; diff --git a/boards/ek-tm4c123gxl/interrupts/readme.txt b/boards/ek-tm4c123gxl/interrupts/readme.txt new file mode 100644 index 0000000..37fb525 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/readme.txt @@ -0,0 +1,33 @@ +Interrupts + +This example application demonstrates the interrupt preemption and +tail-chaining capabilities of Cortex-M4 microprocessor and NVIC. Nested +interrupts are synthesized when the interrupts have the same priority, +increasing priorities, and decreasing priorities. With increasing +priorities, preemption will occur; in the other two cases tail-chaining +will occur. The currently pending interrupts and the currently executing +interrupt will be displayed on the display; GPIO pins E1, E2 and E3 will +be asserted upon interrupt handler entry and de-asserted before interrupt +handler exit so that the off-to-on time can be observed with a scope or +logic analyzer to see the speed of tail-chaining (for the two cases where +tail-chaining is occurring). + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/interrupts/rvmdk/interrupts.axf b/boards/ek-tm4c123gxl/interrupts/rvmdk/interrupts.axf new file mode 100644 index 0000000..d550625 Binary files /dev/null and b/boards/ek-tm4c123gxl/interrupts/rvmdk/interrupts.axf differ diff --git a/boards/ek-tm4c123gxl/interrupts/rvmdk/interrupts.bin b/boards/ek-tm4c123gxl/interrupts/rvmdk/interrupts.bin new file mode 100644 index 0000000..f51533a Binary files /dev/null and b/boards/ek-tm4c123gxl/interrupts/rvmdk/interrupts.bin differ diff --git a/boards/ek-tm4c123gxl/interrupts/startup_ccs.c b/boards/ek-tm4c123gxl/interrupts/startup_ccs.c new file mode 100644 index 0000000..e21b5ec --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/interrupts/startup_ewarm.c b/boards/ek-tm4c123gxl/interrupts/startup_ewarm.c new file mode 100644 index 0000000..c69916f --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/interrupts/startup_gcc.c b/boards/ek-tm4c123gxl/interrupts/startup_gcc.c new file mode 100644 index 0000000..fcba4da --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void IntGPIOa(void); +extern void IntGPIOb(void); +extern void IntGPIOc(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[128]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntGPIOa, // GPIO Port A + IntGPIOb, // GPIO Port B + IntGPIOc, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/interrupts/startup_rvmdk.S b/boards/ek-tm4c123gxl/interrupts/startup_rvmdk.S new file mode 100644 index 0000000..c731354 --- /dev/null +++ b/boards/ek-tm4c123gxl/interrupts/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000200 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN IntGPIOa + EXTERN IntGPIOb + EXTERN IntGPIOc + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntGPIOa ; GPIO Port A + DCD IntGPIOb ; GPIO Port B + DCD IntGPIOc ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/mpu_fault/Makefile b/boards/ek-tm4c123gxl/mpu_fault/Makefile new file mode 100644 index 0000000..bf2ea94 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/Makefile @@ -0,0 +1,86 @@ +#****************************************************************************** +# +# Makefile - Rules for building the MPU example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. +IPATH+=../../../.. + +# +# The default rule, which causes the MPU example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/mpu_fault.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the MPU example. +# +${COMPILER}/mpu_fault.axf: ${COMPILER}/mpu_fault.o +${COMPILER}/mpu_fault.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/mpu_fault.axf: ${COMPILER}/uartstdio.o +${COMPILER}/mpu_fault.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/mpu_fault.axf: mpu_fault.ld +SCATTERgcc_mpu_fault=mpu_fault.ld +ENTRY_mpu_fault=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/mpu_fault/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/mpu_fault/ccs/.ccsimportspec new file mode 100644 index 0000000..2bef69c --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-tm4c123gxl/mpu_fault/ccs/.ccsproject b/boards/ek-tm4c123gxl/mpu_fault/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/mpu_fault/ccs/.cproject b/boards/ek-tm4c123gxl/mpu_fault/ccs/.cproject new file mode 100644 index 0000000..09fa8de --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/ccs/.cproject @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/mpu_fault/ccs/.project b/boards/ek-tm4c123gxl/mpu_fault/ccs/.project new file mode 100644 index 0000000..8b43d01 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/ccs/.project @@ -0,0 +1,55 @@ + + + mpu_fault + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + mpu_fault.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.c + + + mpu_fault_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/mpu_fault/mpu_fault_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/mpu_fault/startup_ccs.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/mpu_fault/ccs/Debug/mpu_fault.bin b/boards/ek-tm4c123gxl/mpu_fault/ccs/Debug/mpu_fault.bin new file mode 100644 index 0000000..dbda8bc Binary files /dev/null and b/boards/ek-tm4c123gxl/mpu_fault/ccs/Debug/mpu_fault.bin differ diff --git a/boards/ek-tm4c123gxl/mpu_fault/ccs/Debug/mpu_fault.out b/boards/ek-tm4c123gxl/mpu_fault/ccs/Debug/mpu_fault.out new file mode 100644 index 0000000..0c8703b Binary files /dev/null and b/boards/ek-tm4c123gxl/mpu_fault/ccs/Debug/mpu_fault.out differ diff --git a/boards/ek-tm4c123gxl/mpu_fault/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/mpu_fault/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/mpu_fault/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/mpu_fault/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/mpu_fault/ewarm/Exe/mpu_fault.bin b/boards/ek-tm4c123gxl/mpu_fault/ewarm/Exe/mpu_fault.bin new file mode 100644 index 0000000..a566aca Binary files /dev/null and b/boards/ek-tm4c123gxl/mpu_fault/ewarm/Exe/mpu_fault.bin differ diff --git a/boards/ek-tm4c123gxl/mpu_fault/ewarm/Exe/mpu_fault.out b/boards/ek-tm4c123gxl/mpu_fault/ewarm/Exe/mpu_fault.out new file mode 100644 index 0000000..ac129b7 Binary files /dev/null and b/boards/ek-tm4c123gxl/mpu_fault/ewarm/Exe/mpu_fault.out differ diff --git a/boards/ek-tm4c123gxl/mpu_fault/gcc/mpu_fault.axf b/boards/ek-tm4c123gxl/mpu_fault/gcc/mpu_fault.axf new file mode 100644 index 0000000..2dd1454 Binary files /dev/null and b/boards/ek-tm4c123gxl/mpu_fault/gcc/mpu_fault.axf differ diff --git a/boards/ek-tm4c123gxl/mpu_fault/gcc/mpu_fault.bin b/boards/ek-tm4c123gxl/mpu_fault/gcc/mpu_fault.bin new file mode 100644 index 0000000..8a3ec62 Binary files /dev/null and b/boards/ek-tm4c123gxl/mpu_fault/gcc/mpu_fault.bin differ diff --git a/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.c b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.c new file mode 100644 index 0000000..f63938b --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.c @@ -0,0 +1,419 @@ +//***************************************************************************** +// +// mpu_fault.c - MPU example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/mpu.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      MPU (mpu_fault)

      +//! +//! This example application demonstrates the use of the MPU to protect a +//! region of memory from access, and to generate a memory management fault +//! when there is an access violation. +//! +//! UART0, connected to the virtual serial port and running at 115,200, 8-N-1, +//! is used to display messages from this application. +// +//***************************************************************************** + + +//***************************************************************************** +// +// Variables to hold the state of the fault status when the fault occurs and +// the faulting address. +// +//***************************************************************************** +static volatile uint32_t g_ui32MMAR; +static volatile uint32_t g_ui32FaultStatus; + +//***************************************************************************** +// +// A counter to track the number of times the fault handler has been entered. +// +//***************************************************************************** +static volatile uint32_t g_ui32MPUFaultCount; + +//***************************************************************************** +// +// A location for storing data read from various addresses. Volatile forces +// the compiler to use it and not optimize the access away. +// +//***************************************************************************** +static volatile uint32_t g_ui32Value; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The exception handler for memory management faults, which are caused by MPU +// access violations. This handler will verify the cause of the fault and +// clear the NVIC fault status register. +// +//***************************************************************************** +void +MPUFaultHandler(void) +{ + // + // Preserve the value of the MMAR (the address causing the fault). + // Preserve the fault status register value, then clear it. + // + g_ui32MMAR = HWREG(NVIC_MM_ADDR); + g_ui32FaultStatus = HWREG(NVIC_FAULT_STAT); + HWREG(NVIC_FAULT_STAT) = g_ui32FaultStatus; + + // + // Increment a counter to indicate the fault occurred. + // + g_ui32MPUFaultCount++; + + // + // Disable the MPU so that this handler can return and cause no more + // faults. The actual instruction that faulted will be re-executed. + // + ROM_MPUDisable(); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example demonstrates how to configure MPU regions for different levels +// of memory protection. The following memory map is set up: +// +// 0000.0000 - 0000.1C00 - rgn 0: executable read-only, flash +// 0000.1C00 - 0000.2000 - rgn 0: no access, flash (disabled sub-region 7) +// 2000.0000 - 2000.4000 - rgn 1: read-write, RAM +// 2000.4000 - 2000.6000 - rgn 2: read-only, RAM (disabled sub-rgn 4 of rgn 1) +// 2000.6000 - 2000.7FFF - rgn 1: read-write, RAM +// 4000.0000 - 4001.0000 - rgn 3: read-write, peripherals +// 4001.0000 - 4002.0000 - rgn 3: no access (disabled sub-region 1) +// 4002.0000 - 4006.0000 - rgn 3: read-write, peripherals +// 4006.0000 - 4008.0000 - rgn 3: no access (disabled sub-region 6, 7) +// E000.E000 - E000.F000 - rgn 4: read-write, NVIC +// 0100.0000 - 0100.FFFF - rgn 5: executable read-only, ROM +// +// The example code will attempt to perform the following operations and check +// the faulting behavior: +// +// - write to flash (should fault) +// - read from the disabled area of flash (should fault) +// - read from the read-only area of RAM (should not fault) +// - write to the read-only section of RAM (should fault) +// +//***************************************************************************** +int +main(void) +{ + unsigned int bFail = 0; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the UART and write status. + // + ConfigureUART(); + + UARTprintf("\033[2JMPU example\n"); + + // + // Configure an executable, read-only MPU region for flash. It is a 16 KB + // region with the last 2 KB disabled to result in a 14 KB executable + // region. This region is needed so that the program can execute from + // flash. + // + ROM_MPURegionSet(0, FLASH_BASE, + MPU_RGN_SIZE_16K | MPU_RGN_PERM_EXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_SUB_RGN_DISABLE_7 | + MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for RAM. It is a 32 KB region. There + // is a 4 KB sub-region in the middle that is disabled in order to open up + // a hole in which different permissions can be applied. + // + ROM_MPURegionSet(1, SRAM_BASE, + MPU_RGN_SIZE_32K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_SUB_RGN_DISABLE_4 | + MPU_RGN_ENABLE); + + // + // Configure a read-only MPU region for the 4 KB of RAM that is disabled in + // the previous region. This region is used for demonstrating read-only + // permissions. + // + ROM_MPURegionSet(2, SRAM_BASE + 0x4000, + MPU_RGN_SIZE_2K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for peripherals. The region is 512 KB + // total size, with several sub-regions disabled to prevent access to areas + // where there are no peripherals. This region is needed because the + // program needs access to some peripherals. + // + ROM_MPURegionSet(3, 0x40000000, + MPU_RGN_SIZE_512K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_SUB_RGN_DISABLE_1 | + MPU_SUB_RGN_DISABLE_6 | MPU_SUB_RGN_DISABLE_7 | + MPU_RGN_ENABLE); + + // + // Configure a read-write MPU region for access to the NVIC. The region is + // 4 KB in size. This region is needed because NVIC registers are needed + // in order to control the MPU. + // + ROM_MPURegionSet(4, NVIC_BASE, + MPU_RGN_SIZE_4K | MPU_RGN_PERM_NOEXEC | + MPU_RGN_PERM_PRV_RW_USR_RW | MPU_RGN_ENABLE); + + // + // Configure an executable, read-only MPU region for ROM. It is a 64 KB + // region. This region is needed so that ROM library calls work. + // + ROM_MPURegionSet(5, (uint32_t)ROM_APITABLE & 0xFFFF0000, + MPU_RGN_SIZE_64K | MPU_RGN_PERM_EXEC | + MPU_RGN_PERM_PRV_RO_USR_RO | MPU_RGN_ENABLE); + + // + // Need to clear the NVIC fault status register to make sure there is no + // status hanging around from a previous program. + // + g_ui32FaultStatus = HWREG(NVIC_FAULT_STAT); + HWREG(NVIC_FAULT_STAT) = g_ui32FaultStatus; + + // + // Enable the MPU fault. + // + ROM_IntEnable(FAULT_MPU); + + // + // Enable the MPU. This will begin to enforce the memory protection + // regions. The MPU is configured so that when in the hard fault or NMI + // exceptions, a default map will be used. Neither of these should occur + // in this example program. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to write to the flash. This should cause a protection fault due + // to the fact that this region is read-only. + // + UARTprintf("Flash write... "); + g_ui32MPUFaultCount = 0; + HWREG(0x100) = 0x12345678; + + // + // Verify that the fault occurred, at the expected address. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x100)) + { + UARTprintf(" OK\n"); + } + else + { + bFail = 1; + UARTprintf("NOK\n"); + } + + // + // The MPU was disabled when the previous fault occurred, so it needs to be + // re-enabled. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to read from the disabled section of flash, the upper 2 KB of + // the 16 KB region. + // + UARTprintf("Flash read... "); + g_ui32MPUFaultCount = 0; + g_ui32Value = HWREG(0x3820); + + // + // Verify that the fault occurred, at the expected address. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x3820)) + { + UARTprintf(" OK\n"); + } + else + { + bFail = 1; + UARTprintf("NOK\n"); + } + + // + // The MPU was disabled when the previous fault occurred, so it needs to be + // re-enabled. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to read from the read-only area of RAM, the middle 4 KB of the + // 32 KB region. + // + UARTprintf("RAM read... "); + g_ui32MPUFaultCount = 0; + g_ui32Value = HWREG(0x20004440); + + // + // Verify that the RAM read did not cause a fault. + // + if(g_ui32MPUFaultCount == 0) + { + UARTprintf(" OK\n"); + } + else + { + bFail = 1; + UARTprintf("NOK\n"); + } + + // + // The MPU should not have been disabled since the last access was not + // supposed to cause a fault. But if it did cause a fault, then the MPU + // will be disabled, so re-enable it here anyway, just in case. + // + ROM_MPUEnable(MPU_CONFIG_HARDFLT_NMI); + + // + // Attempt to write to the read-only area of RAM, the middle 4 KB of the + // 32 KB region. + // + UARTprintf("RAM write... "); + g_ui32MPUFaultCount = 0; + HWREG(0x20004460) = 0xabcdef00; + + // + // Verify that the RAM write caused a fault. + // + if((g_ui32MPUFaultCount == 1) && (g_ui32FaultStatus == 0x82) && + (g_ui32MMAR == 0x20004460)) + { + UARTprintf(" OK\n"); + } + else + { + bFail = 1; + UARTprintf("NOK\n"); + } + + // + // Display the results of the example program. + // + if(bFail) + { + UARTprintf("Failure!\n"); + } + else + { + UARTprintf("Success!\n"); + } + + // + // Disable the MPU, so there are no lingering side effects if another + // program is run. + // + ROM_MPUDisable(); + + // + // Loop forever. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ewd b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ewp b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ewp new file mode 100644 index 0000000..4931769 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ewp @@ -0,0 +1,789 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + + Source + + $PROJ_DIR$\mpu_fault.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.icf b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.icf new file mode 100644 index 0000000..700c34a --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// mpu_fault.icf - Linker configuration file for mpu_fault. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ld b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ld new file mode 100644 index 0000000..d035d54 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * mpu_fault.ld - Linker configuration file for mpu_fault. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.sct b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.sct new file mode 100644 index 0000000..9a45245 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; mpu_fault.sct - Linker configuration file for mpu_fault. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.uvopt b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.uvopt new file mode 100644 index 0000000..d3d06ca --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.uvopt @@ -0,0 +1,303 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + mpu_fault + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\mpu_fault.c + mpu_fault.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 5 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.uvproj b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.uvproj new file mode 100644 index 0000000..663abcc --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault.uvproj @@ -0,0 +1,429 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + mpu_fault + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + mpu_fault + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\mpu_fault.bin .\rvmdk\mpu_fault.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 + + ..\..\..\..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + mpu_fault.sct + + + --entry Reset_Handler + + + + + + + + Source + + + mpu_fault.c + 1 + .\mpu_fault.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/mpu_fault/mpu_fault_ccs.cmd b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault_ccs.cmd new file mode 100644 index 0000000..e431841 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/mpu_fault_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * mpu_fault_ccs.cmd - CCS linker configuration file for mpu_fault. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 256; diff --git a/boards/ek-tm4c123gxl/mpu_fault/readme.txt b/boards/ek-tm4c123gxl/mpu_fault/readme.txt new file mode 100644 index 0000000..00f417b --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/readme.txt @@ -0,0 +1,28 @@ +MPU + +This example application demonstrates the use of the MPU to protect a +region of memory from access, and to generate a memory management fault +when there is an access violation. + +UART0, connected to the virtual serial port and running at 115,200, 8-N-1, +is used to display messages from this application. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/mpu_fault/rvmdk/mpu_fault.axf b/boards/ek-tm4c123gxl/mpu_fault/rvmdk/mpu_fault.axf new file mode 100644 index 0000000..f529b46 Binary files /dev/null and b/boards/ek-tm4c123gxl/mpu_fault/rvmdk/mpu_fault.axf differ diff --git a/boards/ek-tm4c123gxl/mpu_fault/rvmdk/mpu_fault.bin b/boards/ek-tm4c123gxl/mpu_fault/rvmdk/mpu_fault.bin new file mode 100644 index 0000000..7ce9823 Binary files /dev/null and b/boards/ek-tm4c123gxl/mpu_fault/rvmdk/mpu_fault.bin differ diff --git a/boards/ek-tm4c123gxl/mpu_fault/startup_ccs.c b/boards/ek-tm4c123gxl/mpu_fault/startup_ccs.c new file mode 100644 index 0000000..47c1c31 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/mpu_fault/startup_ewarm.c b/boards/ek-tm4c123gxl/mpu_fault/startup_ewarm.c new file mode 100644 index 0000000..bcf9e37 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/mpu_fault/startup_gcc.c b/boards/ek-tm4c123gxl/mpu_fault/startup_gcc.c new file mode 100644 index 0000000..6d88c8a --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void MPUFaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + MPUFaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/mpu_fault/startup_rvmdk.S b/boards/ek-tm4c123gxl/mpu_fault/startup_rvmdk.S new file mode 100644 index 0000000..73e9ce9 --- /dev/null +++ b/boards/ek-tm4c123gxl/mpu_fault/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000100 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN MPUFaultHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD MPUFaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/project0/Makefile b/boards/ek-tm4c123gxl/project0/Makefile new file mode 100644 index 0000000..2a65343 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/Makefile @@ -0,0 +1,86 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Project Zero Example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the Project Zero Example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/project0.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Project Zero Example. +# +${COMPILER}/project0.axf: ${COMPILER}/project0.o +${COMPILER}/project0.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/project0.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/project0.axf: project0.ld +SCATTERgcc_project0=project0.ld +ENTRY_project0=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/project0/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/project0/ccs/.ccsimportspec new file mode 100644 index 0000000..a3940d4 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-tm4c123gxl/project0/ccs/.ccsproject b/boards/ek-tm4c123gxl/project0/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/project0/ccs/.cproject b/boards/ek-tm4c123gxl/project0/ccs/.cproject new file mode 100644 index 0000000..1fffa62 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/ccs/.cproject @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/project0/ccs/.project b/boards/ek-tm4c123gxl/project0/ccs/.project new file mode 100644 index 0000000..9254989 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/ccs/.project @@ -0,0 +1,50 @@ + + + project0 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + project0.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/project0/project0.c + + + project0_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/project0/project0_ccs.cmd + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/project0/startup_ccs.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/project0/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/project0/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/project0/ccs/Debug/project0.bin b/boards/ek-tm4c123gxl/project0/ccs/Debug/project0.bin new file mode 100644 index 0000000..5130530 Binary files /dev/null and b/boards/ek-tm4c123gxl/project0/ccs/Debug/project0.bin differ diff --git a/boards/ek-tm4c123gxl/project0/ccs/Debug/project0.out b/boards/ek-tm4c123gxl/project0/ccs/Debug/project0.out new file mode 100644 index 0000000..1e7add1 Binary files /dev/null and b/boards/ek-tm4c123gxl/project0/ccs/Debug/project0.out differ diff --git a/boards/ek-tm4c123gxl/project0/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/project0/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/project0/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/project0/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/project0/ewarm/Exe/project0.bin b/boards/ek-tm4c123gxl/project0/ewarm/Exe/project0.bin new file mode 100644 index 0000000..b87fd7c Binary files /dev/null and b/boards/ek-tm4c123gxl/project0/ewarm/Exe/project0.bin differ diff --git a/boards/ek-tm4c123gxl/project0/ewarm/Exe/project0.out b/boards/ek-tm4c123gxl/project0/ewarm/Exe/project0.out new file mode 100644 index 0000000..85974cc Binary files /dev/null and b/boards/ek-tm4c123gxl/project0/ewarm/Exe/project0.out differ diff --git a/boards/ek-tm4c123gxl/project0/gcc/project0.axf b/boards/ek-tm4c123gxl/project0/gcc/project0.axf new file mode 100644 index 0000000..32f8f1b Binary files /dev/null and b/boards/ek-tm4c123gxl/project0/gcc/project0.axf differ diff --git a/boards/ek-tm4c123gxl/project0/gcc/project0.bin b/boards/ek-tm4c123gxl/project0/gcc/project0.bin new file mode 100644 index 0000000..e55f653 Binary files /dev/null and b/boards/ek-tm4c123gxl/project0/gcc/project0.bin differ diff --git a/boards/ek-tm4c123gxl/project0/project0.c b/boards/ek-tm4c123gxl/project0/project0.c new file mode 100644 index 0000000..a0484c0 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/project0.c @@ -0,0 +1,114 @@ +//***************************************************************************** +// +// project0.c - Example to demonstrate minimal TivaWare setup +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "driverlib/sysctl.h" +#include "driverlib/gpio.h" + +//***************************************************************************** +// +// Define pin to LED color mapping. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Project Zero (project0)

      +//! +//! This example demonstrates the use of TivaWare to setup the clocks and +//! toggle GPIO pins to make the LED's blink. This is a good place to start +//! understanding your launchpad and the tools that can be used to program it. +//! See http://www.ti.com/tm4c123g-launchpad/project0 for more information and +//! tutorial videos. +// +//***************************************************************************** + +#define RED_LED GPIO_PIN_1 +#define BLUE_LED GPIO_PIN_2 +#define GREEN_LED GPIO_PIN_3 + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Main 'C' Language entry point. Toggle an LED using TivaWare. +// See http://www.ti.com/tm4c123g-launchpad/project0 for more information and +// tutorial videos. +// +//***************************************************************************** +int +main(void) +{ + // + // Setup the system clock to run at 50 Mhz from PLL with crystal reference + // + SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ| + SYSCTL_OSC_MAIN); + + // + // Enable and configure the GPIO port for the LED operation. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, RED_LED|BLUE_LED|GREEN_LED); + + // + // Loop Forever + // + while(1) + { + // + // Turn on the LED + // + GPIOPinWrite(GPIO_PORTF_BASE, RED_LED|BLUE_LED|GREEN_LED, RED_LED); + + // + // Delay for a bit + // + SysCtlDelay(2000000); + + // + // Turn on the LED + // + GPIOPinWrite(GPIO_PORTF_BASE, RED_LED|BLUE_LED|GREEN_LED, BLUE_LED); + + // + // Delay for a bit + // + SysCtlDelay(2000000); + } +} diff --git a/boards/ek-tm4c123gxl/project0/project0.ewd b/boards/ek-tm4c123gxl/project0/project0.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/project0.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/project0/project0.ewp b/boards/ek-tm4c123gxl/project0/project0.ewp new file mode 100644 index 0000000..71a4800 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/project0.ewp @@ -0,0 +1,786 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + + Source + + $PROJ_DIR$\project0.c + + + $PROJ_DIR$\startup_ewarm.c + + + diff --git a/boards/ek-tm4c123gxl/project0/project0.icf b/boards/ek-tm4c123gxl/project0/project0.icf new file mode 100644 index 0000000..8ee0e1d --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/project0.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// project0.icf - Linker configuration file for project0. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/project0/project0.ld b/boards/ek-tm4c123gxl/project0/project0.ld new file mode 100644 index 0000000..9063248 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/project0.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * project0.ld - Linker configuration file for project0. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/project0/project0.sct b/boards/ek-tm4c123gxl/project0/project0.sct new file mode 100644 index 0000000..b742201 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/project0.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; project0.sct - Linker configuration file for project0. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/project0/project0.uvopt b/boards/ek-tm4c123gxl/project0/project0.uvopt new file mode 100644 index 0000000..cfc26a8 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/project0.uvopt @@ -0,0 +1,289 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + project0 + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\project0.c + project0.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + + + Libraries + 1 + 0 + 0 + + 2 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 4 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/project0/project0.uvproj b/boards/ek-tm4c123gxl/project0/project0.uvproj new file mode 100644 index 0000000..ed7b4d9 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/project0.uvproj @@ -0,0 +1,424 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + project0 + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + project0 + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\project0.bin .\rvmdk\project0.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + project0.sct + + + --entry Reset_Handler + + + + + + + + Source + + + project0.c + 1 + .\project0.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/project0/project0_ccs.cmd b/boards/ek-tm4c123gxl/project0/project0_ccs.cmd new file mode 100644 index 0000000..1635d17 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/project0_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * project0_ccs.cmd - CCS linker configuration file for project0. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 256; diff --git a/boards/ek-tm4c123gxl/project0/readme.txt b/boards/ek-tm4c123gxl/project0/readme.txt new file mode 100644 index 0000000..63d9870 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/readme.txt @@ -0,0 +1,27 @@ +Project Zero + +This example demonstrates the use of TivaWare to setup the clocks and +toggle GPIO pins to make the LED's blink. This is a good place to start +understanding your launchpad and the tools that can be used to program it. +See http://www.ti.com/tm4c123g-launchpad/project0 for more information and +tutorial videos. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/project0/rvmdk/project0.axf b/boards/ek-tm4c123gxl/project0/rvmdk/project0.axf new file mode 100644 index 0000000..25ee206 Binary files /dev/null and b/boards/ek-tm4c123gxl/project0/rvmdk/project0.axf differ diff --git a/boards/ek-tm4c123gxl/project0/rvmdk/project0.bin b/boards/ek-tm4c123gxl/project0/rvmdk/project0.bin new file mode 100644 index 0000000..ab12a0a Binary files /dev/null and b/boards/ek-tm4c123gxl/project0/rvmdk/project0.bin differ diff --git a/boards/ek-tm4c123gxl/project0/startup_ccs.c b/boards/ek-tm4c123gxl/project0/startup_ccs.c new file mode 100644 index 0000000..ca18035 --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/startup_ccs.c @@ -0,0 +1,295 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/project0/startup_ewarm.c b/boards/ek-tm4c123gxl/project0/startup_ewarm.c new file mode 100644 index 0000000..ed44e2d --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/startup_ewarm.c @@ -0,0 +1,326 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/project0/startup_gcc.c b/boards/ek-tm4c123gxl/project0/startup_gcc.c new file mode 100644 index 0000000..c20136c --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/startup_gcc.c @@ -0,0 +1,342 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/project0/startup_rvmdk.S b/boards/ek-tm4c123gxl/project0/startup_rvmdk.S new file mode 100644 index 0000000..c688cea --- /dev/null +++ b/boards/ek-tm4c123gxl/project0/startup_rvmdk.S @@ -0,0 +1,351 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000100 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/qs-rgb/Makefile b/boards/ek-tm4c123gxl/qs-rgb/Makefile new file mode 100644 index 0000000..1b963f7 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/Makefile @@ -0,0 +1,93 @@ +#****************************************************************************** +# +# Makefile - Rules for building the Quickstart RGB. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the Quickstart RGB to be built. +# +all: ${COMPILER} +all: ${COMPILER}/qs-rgb.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the Quickstart RGB. +# +${COMPILER}/qs-rgb.axf: ${COMPILER}/buttons.o +${COMPILER}/qs-rgb.axf: ${COMPILER}/cmdline.o +${COMPILER}/qs-rgb.axf: ${COMPILER}/qs-rgb.o +${COMPILER}/qs-rgb.axf: ${COMPILER}/rgb.o +${COMPILER}/qs-rgb.axf: ${COMPILER}/rgb_commands.o +${COMPILER}/qs-rgb.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/qs-rgb.axf: ${COMPILER}/uartstdio.o +${COMPILER}/qs-rgb.axf: ${COMPILER}/ustdlib.o +${COMPILER}/qs-rgb.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/qs-rgb.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/qs-rgb.axf: qs-rgb.ld +SCATTERgcc_qs-rgb=qs-rgb.ld +ENTRY_qs-rgb=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/qs-rgb/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/qs-rgb/ccs/.ccsimportspec new file mode 100644 index 0000000..f2960bb --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/ccs/.ccsimportspec @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/qs-rgb/ccs/.ccsproject b/boards/ek-tm4c123gxl/qs-rgb/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/qs-rgb/ccs/.cproject b/boards/ek-tm4c123gxl/qs-rgb/ccs/.cproject new file mode 100644 index 0000000..727570a --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/ccs/.cproject @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/qs-rgb/ccs/.project b/boards/ek-tm4c123gxl/qs-rgb/ccs/.project new file mode 100644 index 0000000..c3894a7 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/ccs/.project @@ -0,0 +1,80 @@ + + + qs-rgb + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + qs-rgb.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.c + + + qs-rgb_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/qs-rgb/qs-rgb_ccs.cmd + + + rgb_commands.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/qs-rgb/rgb_commands.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/qs-rgb/startup_ccs.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/drivers/buttons.c + + + drivers/rgb.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/drivers/rgb.c + + + utils/cmdline.c + 1 + SW_ROOT/utils/cmdline.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/qs-rgb/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/qs-rgb/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/qs-rgb/ccs/Debug/qs-rgb.bin b/boards/ek-tm4c123gxl/qs-rgb/ccs/Debug/qs-rgb.bin new file mode 100644 index 0000000..329a400 Binary files /dev/null and b/boards/ek-tm4c123gxl/qs-rgb/ccs/Debug/qs-rgb.bin differ diff --git a/boards/ek-tm4c123gxl/qs-rgb/ccs/Debug/qs-rgb.out b/boards/ek-tm4c123gxl/qs-rgb/ccs/Debug/qs-rgb.out new file mode 100644 index 0000000..d5ac3df Binary files /dev/null and b/boards/ek-tm4c123gxl/qs-rgb/ccs/Debug/qs-rgb.out differ diff --git a/boards/ek-tm4c123gxl/qs-rgb/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/qs-rgb/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/qs-rgb/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/qs-rgb/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/qs-rgb/ewarm/Exe/qs-rgb.bin b/boards/ek-tm4c123gxl/qs-rgb/ewarm/Exe/qs-rgb.bin new file mode 100644 index 0000000..0f965ff Binary files /dev/null and b/boards/ek-tm4c123gxl/qs-rgb/ewarm/Exe/qs-rgb.bin differ diff --git a/boards/ek-tm4c123gxl/qs-rgb/ewarm/Exe/qs-rgb.out b/boards/ek-tm4c123gxl/qs-rgb/ewarm/Exe/qs-rgb.out new file mode 100644 index 0000000..d480c4e Binary files /dev/null and b/boards/ek-tm4c123gxl/qs-rgb/ewarm/Exe/qs-rgb.out differ diff --git a/boards/ek-tm4c123gxl/qs-rgb/gcc/qs-rgb.axf b/boards/ek-tm4c123gxl/qs-rgb/gcc/qs-rgb.axf new file mode 100644 index 0000000..c2e1249 Binary files /dev/null and b/boards/ek-tm4c123gxl/qs-rgb/gcc/qs-rgb.axf differ diff --git a/boards/ek-tm4c123gxl/qs-rgb/gcc/qs-rgb.bin b/boards/ek-tm4c123gxl/qs-rgb/gcc/qs-rgb.bin new file mode 100644 index 0000000..2ec0c27 Binary files /dev/null and b/boards/ek-tm4c123gxl/qs-rgb/gcc/qs-rgb.bin differ diff --git a/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.c b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.c new file mode 100644 index 0000000..070b927 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.c @@ -0,0 +1,714 @@ +//***************************************************************************** +// +// qs-rgb.c - Quickstart for the EK-TM4C123GXL. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_hibernate.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/hibernate.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "utils/uartstdio.h" +#include "utils/cmdline.h" +#include "drivers/rgb.h" +#include "drivers/buttons.h" +#include "rgb_commands.h" +#include "qs-rgb.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      EK-TM4C123GXL Quickstart Application (qs-rgb)

      +//! +//! A demonstration of the Tiva C Series LaunchPad (EK-TM4C123GXL) +//! capabilities. +//! +//! Press and/or hold the left button to traverse towards the red end of the +//! ROYGBIV color spectrum. Press and/or hold the right button to traverse +//! toward the violet end of the ROYGBIV color spectrum. +//! +//! If no input is received for 5 seconds, the application will start +//! automatically changing the color displayed. +//! +//! Press and hold both left and right buttons for 3 seconds to enter +//! hibernation. During hibernation, the last color displayed will blink +//! for 0.5 seconds every 3 seconds. +//! +//! The system can also be controlled via a command line provided via the UART. +//! Configure your host terminal emulator for 115200, 8-N-1 to access this +//! feature. +//! +//! - Command 'help' generates a list of commands and helpful information. +//! - Command 'hib' will place the device into hibernation mode. +//! - Command 'rand' will initiate the pseudo-random color sequence. +//! - Command 'intensity' followed by a number between 0 and 100 will set the +//! brightness of the LED as a percentage of maximum brightness. +//! - Command 'rgb' followed by a six character hex value will set the color. +//! For example 'rgb FF0000' will produce a red color. +// +//***************************************************************************** + +//***************************************************************************** +// +// Entry counter to track how int32_t to stay in certain staging states before +// making transition into hibernate. +// +//***************************************************************************** +static volatile uint32_t ui32HibModeEntryCount; + +//***************************************************************************** +// +// Array of pre-defined colors for use when buttons cause manual color steps. +// +//***************************************************************************** +static float fManualColors[7] = {0.0f, .214f, .428f, .642f, .856f, 1.07f, + 1.284f}; + +//***************************************************************************** +// +// Input buffer for the command line interpreter. +// +//***************************************************************************** +static char g_cInput[APP_INPUT_BUF_SIZE]; + +//***************************************************************************** +// +// Application state structure. Gets stored to hibernate memory for +// preservation across hibernate events. +// +//***************************************************************************** +volatile tAppState g_sAppState; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + + +//***************************************************************************** +// +// Handler to manage the button press events and state machine transitions +// that result from those button events. +// +// This function is called by the SysTickIntHandler if a button event is +// detected. Function will determine which button was pressed and tweak various +// elements of the global state structure accordingly. +// +//***************************************************************************** +void +AppButtonHandler(void) +{ + static uint32_t ui32TickCounter; + + ui32TickCounter++; + + // + // Switch statement to adjust the color wheel position based on buttons + // + switch(g_sAppState.ui32Buttons & ALL_BUTTONS) + { + + case LEFT_BUTTON: + + // + // Check if the button has been held int32_t enough to peform another + // color wheel increment. + // + if((ui32TickCounter % APP_BUTTON_POLL_DIVIDER) == 0) + { + // + // Perform the increment and index wrap around. + // + g_sAppState.ui32ManualIndex++; + if(g_sAppState.ui32ManualIndex >= APP_NUM_MANUAL_COLORS) + { + g_sAppState.ui32ManualIndex = 0; + } + g_sAppState.fColorWheelPos = APP_PI * + fManualColors[g_sAppState.ui32ManualIndex]; + } + + // + // Reset some state counts and system mode so that we know the user + // is present and actively engaging with the application. + // + ui32HibModeEntryCount = 0; + g_sAppState.ui32ModeTimer = 0; + g_sAppState.ui32Mode = APP_MODE_NORMAL; + break; + + case RIGHT_BUTTON: + + // + // Check if the button has been held int32_t enough to perform another + // color wheel decrement. + // + if((ui32TickCounter % APP_BUTTON_POLL_DIVIDER) == 0) + { + // + // Perform the decrement and index wrap around. + // + if(g_sAppState.ui32ManualIndex == 0) + { + // + // set to one greater than the last color so that we decrement + // back into range with next instruction. + // + g_sAppState.ui32ManualIndex = APP_NUM_MANUAL_COLORS; + } + g_sAppState.ui32ManualIndex--; + g_sAppState.fColorWheelPos = APP_PI * + fManualColors[g_sAppState.ui32ManualIndex]; + } + // + // Reset some state counts and system mode so that we know the user + // is present and actively engaging with the application. + // + ui32HibModeEntryCount = 0; + g_sAppState.ui32ModeTimer = 0; + g_sAppState.ui32Mode = APP_MODE_NORMAL; + break; + + case ALL_BUTTONS: + + // + // Both buttons for longer than debounce time will cause hibernation + // + if(ui32HibModeEntryCount < APP_HIB_BUTTON_DEBOUNCE) + { + ui32HibModeEntryCount++; + g_sAppState.ui32Mode = APP_MODE_NORMAL; + } + else + { + g_sAppState.ui32Mode = APP_MODE_HIB; + } + g_sAppState.ui32ModeTimer = 0; + break; + + default: + if(g_sAppState.ui32Mode == APP_MODE_HIB_FLASH) + { + // + // Waking from hibernate RTC just do a quick flash then back to + // hibernation. + // + if(ui32HibModeEntryCount < APP_HIB_FLASH_DURATION) + { + ui32HibModeEntryCount++; + } + else + { + g_sAppState.ui32Mode = APP_MODE_HIB; + } + } + else + { + // + // Normal or remote mode and no user action will cause transition + // to automatic scrolling mode. + // + ui32HibModeEntryCount = 0; + if(g_sAppState.ui32ModeTimer < APP_AUTO_MODE_TIMEOUT) + { + g_sAppState.ui32ModeTimer++; + } + else + { + g_sAppState.ui32Mode = APP_MODE_AUTO; + } + + // + // reset the tick counter when no buttons are pressed + // this makes the first button reaction speed quicker + // + ui32TickCounter = APP_BUTTON_POLL_DIVIDER - 1; + } + break; + } +} + +//***************************************************************************** +// +// Uses the fColorWheelPos variable to update the color mix shown on the RGB +// +// ui32ForceUpdate when set forces a color update even if a color change +// has not been detected. Used primarily at startup to init the color after +// a hibernate. +// +// This function is called by the SysTickIntHandler to update the colors on +// the RGB LED whenever a button or timeout event has changed the color wheel +// position. Color is determined by a series of sine functions and conditions +// +//***************************************************************************** +void +AppRainbow(uint32_t ui32ForceUpdate) +{ + static float fPrevPos; + float fCurPos; + float fTemp; + volatile uint32_t * pui32Colors; + + pui32Colors = g_sAppState.ui32Colors; + fCurPos = g_sAppState.fColorWheelPos; + + + if((fCurPos != fPrevPos) || ui32ForceUpdate) + { + // + // Preserve the new color wheel position + // + fPrevPos = fCurPos; + + // + // Adjust the BLUE value based on the control state + // + fTemp = 65535.0f * sinf(fCurPos); + if(fTemp < 0) + { + pui32Colors[GREEN] = 0; + } + else + { + pui32Colors[GREEN] = (uint32_t) fTemp; + } + + + // + // Adjust the RED value based on the control state + // + fTemp = 65535.0f * sinf(fCurPos - APP_PI / 2.0f); + if(fTemp < 0) + { + pui32Colors[BLUE] = 0; + } + else + { + pui32Colors[BLUE] = (uint32_t) fTemp; + } + + + // + // Adjust the GREEN value based on the control state + // + if(fCurPos < APP_PI) + { + fTemp = 65535.0f * sinf(fCurPos + APP_PI * 0.5f); + } + else + { + fTemp = 65535.0f * sinf(fCurPos + APP_PI); + } + if(fTemp < 0) + { + pui32Colors[RED] = 0; + } + else + { + pui32Colors[RED] = (uint32_t) fTemp; + } + + // + // Update the actual LED state + // + RGBColorSet(pui32Colors); + } + +} + +//***************************************************************************** +// +// Called by the NVIC as a result of SysTick Timer rollover interrupt flag +// +// Checks buttons and calls AppButtonHandler to manage button events. +// Tracks time and auto mode color stepping. Calls AppRainbow to implement +// RGB color changes. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + + static float x; + + g_sAppState.ui32Buttons = ButtonsPoll(0,0); + AppButtonHandler(); + + // + // Auto increment the color wheel if in the AUTO mode. AUTO mode is when + // device is active but user interaction has timed out. + // + if(g_sAppState.ui32Mode == APP_MODE_AUTO) + { + g_sAppState.fColorWheelPos += APP_AUTO_COLOR_STEP; + } + + // + // Provide wrap around of the control variable from 0 to 1.5 times PI + // + if(g_sAppState.fColorWheelPos > (APP_PI * 1.5f)) + { + g_sAppState.fColorWheelPos = 0.0f; + } + if(x < 0.0f) + { + g_sAppState.fColorWheelPos = APP_PI * 1.5f; + } + + // + // Set the RGB Color based on current control variable value. + // + AppRainbow(0); + + +} + +//***************************************************************************** +// +// Uses the fColorWheelPos variable to update the color mix shown on the RGB +// +// This function is called when system has decided it is time to enter +// Hibernate. This will prepare the hibernate peripheral, save the system +// state and then enter hibernate mode. +// +//***************************************************************************** +void +AppHibernateEnter(void) +{ + // + // Alert UART command line users that we are going to hibernate + // + UARTprintf("Entering Hibernate...\n"); + + // + // Prepare Hibernation Module + // + HibernateGPIORetentionEnable(); + HibernateRTCSet(0); + HibernateRTCEnable(); + HibernateRTCMatchSet(0, 5); + HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC); + + // + // Store state information to battery backed memory + // since sizeof returns number of bytes we convert to words and force + // a rounding up to next whole word. + // + HibernateDataSet((uint32_t*)&g_sAppState, sizeof(tAppState)/4+1); + + // + // Disable the LED for 100 milliseconds to let user know we are + // ready for hibernate and will hibernate on relase of buttons + // + RGBDisable(); + SysCtlDelay(SysCtlClockGet()/3/10); + RGBEnable(); + + // + // Wait for wake button to be released prior to going into hibernate + // + while(g_sAppState.ui32Buttons & RIGHT_BUTTON) + { + // + //Delay for about 300 clock ticks to allow time for interrupts to + //sense that button is released + // + SysCtlDelay(100); + } + + // + // Disable the LED for power savings and go to hibernate mode + // + RGBDisable(); + HibernateRequest(); + + +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// Main function performs init and manages system. +// +// Called automatically after the system and compiler pre-init sequences. +// Performs system init calls, restores state from hibernate if needed and +// then manages the application context duties of the system. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32Status; + uint32_t ui32ResetCause; + int32_t i32CommandStatus; + + // + // Enable stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUEnable(); + ROM_FPUStackingEnable(); + + // + // Set the system clock to run at 40Mhz off PLL with external crystal as + // reference. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Enable the hibernate module + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); + + // + // Enable and Initialize the UART. + // + ConfigureUART(); + + UARTprintf("Welcome to the Tiva C Series TM4C123G LaunchPad!\n"); + UARTprintf("Type 'help' for a list of commands\n"); + UARTprintf("> "); + + // + // Determine why system reset occurred and respond accordingly. + // + ui32ResetCause = SysCtlResetCauseGet(); + SysCtlResetCauseClear(ui32ResetCause); + if(ui32ResetCause == SYSCTL_CAUSE_POR) + { + if(HibernateIsActive()) + { + // + // Read the status bits to see what caused the wake. + // + ui32Status = HibernateIntStatus(0); + HibernateIntClear(ui32Status); + + // + // Wake was due to the push button. + // + if(ui32Status & HIBERNATE_INT_PIN_WAKE) + { + UARTprintf("Hibernate Wake Pin Wake Event\n"); + UARTprintf("> "); + + // + // Recover the application state variables from battery backed + // hibernate memory. Set ui32Mode to normal. + // + HibernateDataGet((uint32_t*) &g_sAppState, + sizeof(tAppState) / 4 + 1); + g_sAppState.ui32Mode = APP_MODE_NORMAL; + } + + // + // Wake was due to RTC match + // + else if(ui32Status & HIBERNATE_INT_RTC_MATCH_0) + { + UARTprintf("Hibernate RTC Wake Event\n"); + UARTprintf("> "); + // + // Recover the application state variables from battery backed + // hibernate memory. Set ui32Mode to briefly flash the RGB. + // + HibernateDataGet((uint32_t*) &g_sAppState, + sizeof(tAppState) / 4 + 1); + g_sAppState.ui32Mode = APP_MODE_HIB_FLASH; + } + } + + else + { + // + // Reset was do to a cold first time power up. + // + UARTprintf("Power on reset. Hibernate not active.\n"); + UARTprintf("> "); + + g_sAppState.ui32Mode = APP_MODE_NORMAL; + g_sAppState.fColorWheelPos = 0; + g_sAppState.fIntensity = APP_INTENSITY_DEFAULT; + g_sAppState.ui32Buttons = 0; + } + } + else + { + // + // External Pin reset or other reset event occured. + // + UARTprintf("External or other reset\n"); + UARTprintf("> "); + + // + // Treat this as a cold power up reset without restore from hibernate. + // + g_sAppState.ui32Mode = APP_MODE_NORMAL; + g_sAppState.fColorWheelPos = APP_PI; + g_sAppState.fIntensity = APP_INTENSITY_DEFAULT; + g_sAppState.ui32Buttons = 0; + + // + // colors get a default initialization later when we call AppRainbow. + // + } + + // + // Initialize clocking for the Hibernate module + // + HibernateEnableExpClk(SysCtlClockGet()); + + // + // Initialize the RGB LED. AppRainbow typically only called from interrupt + // context. Safe to call here to force initial color update because + // interrupts are not yet enabled. + // + RGBInit(0); + RGBIntensitySet(g_sAppState.fIntensity); + AppRainbow(1); + RGBEnable(); + + // + // Initialize the buttons + // + ButtonsInit(); + + // + // Initialize the SysTick interrupt to process colors and buttons. + // + SysTickPeriodSet(SysCtlClockGet() / APP_SYSTICKS_PER_SEC); + SysTickEnable(); + SysTickIntEnable(); + IntMasterEnable(); + + // + // spin forever and wait for carriage returns or state changes. + // + while(1) + { + + UARTprintf("\n>"); + + + // + // Peek to see if a full command is ready for processing + // + while(UARTPeek('\r') == -1) + { + // + // millisecond delay. A SysCtlSleep() here would also be OK. + // + SysCtlDelay(SysCtlClockGet() / (1000 / 3)); + + // + // Check for change of mode and enter hibernate if requested. + // all other mode changes handled in interrupt context. + // + if(g_sAppState.ui32Mode == APP_MODE_HIB) + { + AppHibernateEnter(); + } + } + + // + // a '\r' was detected get the line of text from the user. + // + UARTgets(g_cInput,sizeof(g_cInput)); + + // + // Pass the line from the user to the command processor. + // It will be parsed and valid commands executed. + // + i32CommandStatus = CmdLineProcess(g_cInput); + + // + // Handle the case of bad command. + // + if(i32CommandStatus == CMDLINE_BAD_CMD) + { + UARTprintf("Bad command!\n"); + } + + // + // Handle the case of too many arguments. + // + else if(i32CommandStatus == CMDLINE_TOO_MANY_ARGS) + { + UARTprintf("Too many arguments for command processor!\n"); + } + } +} diff --git a/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ewd b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ewp b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ewp new file mode 100644 index 0000000..180e3d7 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ewp @@ -0,0 +1,808 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\..\..\..\..\utils\cmdline.c + + + $PROJ_DIR$\qs-rgb.c + + + $PROJ_DIR$\..\drivers\rgb.c + + + $PROJ_DIR$\rgb_commands.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.h b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.h new file mode 100644 index 0000000..a14bc39 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.h @@ -0,0 +1,90 @@ +//***************************************************************************** +// +// qs-rgb.h - EK-TM4C123GXL Quick Start Application +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + + + +//***************************************************************************** +// +// Globally defined constants +// +//***************************************************************************** +#define APP_SYSTICKS_PER_SEC 32 +#define APP_BUTTON_POLL_DIVIDER 8 +#define APP_NUM_MANUAL_COLORS 7 +#define APP_PI 3.1415926535897932384626433832795f +#define APP_AUTO_COLOR_STEP (APP_PI/ 48.0f) +#define APP_INTENSITY_DEFAULT 0.3f +#define APP_AUTO_MODE_TIMEOUT (APP_SYSTICKS_PER_SEC * 3) +#define APP_HIB_BUTTON_DEBOUNCE (APP_SYSTICKS_PER_SEC * 3) +#define APP_HIB_FLASH_DURATION 2 + +#define APP_MODE_NORMAL 0 +#define APP_MODE_HIB 1 +#define APP_MODE_HIB_FLASH 2 +#define APP_MODE_AUTO 3 +#define APP_MODE_REMOTE 4 + +#define APP_INPUT_BUF_SIZE 128 + +//***************************************************************************** +// +// Structure typedef to make storing application state data to and from the +// hibernate battery backed memory simpler. +// ui32Colors: [R, G, B] range is 0 to 0xFFFF per color. +// ui32Mode: The current application mode, system state variable. +// ui32Buttons: bit map representation of buttons being pressed +// ui32ManualIndex: Control variable for manual color increment/decrement +// fColorWheelPos: Control variable to govern color mixing +// fIntensity: Control variable to govern overall brightness of LED +// +//***************************************************************************** +typedef struct +{ + uint32_t ui32Colors[3]; + uint32_t ui32Mode; + uint32_t ui32Buttons; + uint32_t ui32ManualIndex; + uint32_t ui32ModeTimer; + float fColorWheelPos; + float fIntensity; + +}tAppState; + +//***************************************************************************** +// +// Global variables originally defined in qs-rgb.c that are made available to +// functions in other files. +// +//***************************************************************************** +extern volatile tAppState g_sAppState; + +//***************************************************************************** +// +// Functions defined in qs-rgb.c that are made available to other files. +// +//***************************************************************************** +extern void AppButtonHandler(void); +extern void AppRainbow(uint32_t ui32ForceUpdate); +extern void AppHibernateEnter(void); + diff --git a/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.icf b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.icf new file mode 100644 index 0000000..e012436 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// qs-rgb.icf - Linker configuration file for qs-rgb. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ld b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ld new file mode 100644 index 0000000..1de41dd --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * qs-rgb.ld - Linker configuration file for qs-rgb. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.sct b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.sct new file mode 100644 index 0000000..7dd5ab3 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; qs-rgb.sct - Linker configuration file for qs-rgb. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.uvopt b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.uvopt new file mode 100644 index 0000000..05f3396 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.uvopt @@ -0,0 +1,387 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + qs-rgb + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\cmdline.c + cmdline.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\qs-rgb.c + qs-rgb.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\rgb.c + rgb.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\rgb_commands.c + rgb_commands.c + + + 1 + 6 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 9 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 10 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 11 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.uvproj b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.uvproj new file mode 100644 index 0000000..8d5dd73 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb.uvproj @@ -0,0 +1,459 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + qs-rgb + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + qs-rgb + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\qs-rgb.bin .\rvmdk\qs-rgb.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + qs-rgb.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + cmdline.c + 1 + ..\..\..\..\utils\cmdline.c + + + qs-rgb.c + 1 + .\qs-rgb.c + + + rgb.c + 1 + ..\drivers\rgb.c + + + rgb_commands.c + 1 + .\rgb_commands.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/qs-rgb/qs-rgb_ccs.cmd b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb_ccs.cmd new file mode 100644 index 0000000..1e0d912 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/qs-rgb_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * qs-rgb_ccs.cmd - CCS linker configuration file for qs-rgb. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 2048; diff --git a/boards/ek-tm4c123gxl/qs-rgb/readme.txt b/boards/ek-tm4c123gxl/qs-rgb/readme.txt new file mode 100644 index 0000000..1bf22e9 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/readme.txt @@ -0,0 +1,47 @@ +EK-TM4C123GXL Quickstart Application + +A demonstration of the Tiva C Series LaunchPad (EK-TM4C123GXL) +capabilities. + +Press and/or hold the left button to traverse towards the red end of the +ROYGBIV color spectrum. Press and/or hold the right button to traverse +toward the violet end of the ROYGBIV color spectrum. + +If no input is received for 5 seconds, the application will start +automatically changing the color displayed. + +Press and hold both left and right buttons for 3 seconds to enter +hibernation. During hibernation, the last color displayed will blink +for 0.5 seconds every 3 seconds. + +The system can also be controlled via a command line provided via the UART. +Configure your host terminal emulator for 115200, 8-N-1 to access this +feature. + +- Command 'help' generates a list of commands and helpful information. +- Command 'hib' will place the device into hibernation mode. +- Command 'rand' will initiate the pseudo-random color sequence. +- Command 'intensity' followed by a number between 0 and 100 will set the +brightness of the LED as a percentage of maximum brightness. +- Command 'rgb' followed by a six character hex value will set the color. +For example 'rgb FF0000' will produce a red color. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/qs-rgb/rgb_commands.c b/boards/ek-tm4c123gxl/qs-rgb/rgb_commands.c new file mode 100644 index 0000000..2285f63 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/rgb_commands.c @@ -0,0 +1,223 @@ +//***************************************************************************** +// +// rgb_commands.c - Command line functionality implementation +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "qs-rgb.h" +#include "drivers/rgb.h" +#include "inc/hw_types.h" +#include "utils/ustdlib.h" +#include "utils/uartstdio.h" +#include "utils/cmdline.h" +#include "rgb_commands.h" + +//***************************************************************************** +// +// Table of valid command strings, callback functions and help messages. This +// is used by the cmdline module. +// +//***************************************************************************** +tCmdLineEntry g_psCmdTable[] = +{ + {"help", CMD_help, " : Display list of commands" }, + {"hib", CMD_hib, " : Place system into hibernate mode"}, + {"rand", CMD_rand, " : Start automatic color sequencing"}, + {"intensity",CMD_intensity, " : Adjust brightness 0 to 100 percent"}, + {"rgb", CMD_rgb, " : Adjust color 000000-FFFFFF HTML notation"}, + { 0, 0, 0 } +}; + +//***************************************************************************** +// +// Command: help +// +// Print the help strings for all commands. +// +//***************************************************************************** +int +CMD_help(int argc, char **argv) +{ + int32_t i32Index; + + (void)argc; + (void)argv; + + // + // Start at the beginning of the command table + // + i32Index = 0; + + // + // Get to the start of a clean line on the serial output. + // + UARTprintf("\nAvailable Commands\n------------------\n\n"); + + // + // Display strings until we run out of them. + // + while(g_psCmdTable[i32Index].pcCmd) + { + UARTprintf("%17s %s\n", g_psCmdTable[i32Index].pcCmd, + g_psCmdTable[i32Index].pcHelp); + i32Index++; + } + + // + // Leave a blank line after the help strings. + // + UARTprintf("\n"); + + return (0); +} + +//***************************************************************************** +// +// Command: hib +// +// Force the device into hibernate mode now. +// +//***************************************************************************** +int +CMD_hib(int argc, char **argv) +{ + // + // Keep the compiler happy. + // + (void)argc; + (void)argv; + + // + // Enter hibernate state. + // + AppHibernateEnter(); + + return (0); +} + +//***************************************************************************** +// +// Command: rand +// +// Starts the automatic light sequence immediately. +// +//***************************************************************************** +int +CMD_rand(int argc, char **argv) +{ + // + // Keep the compiler happy. + // + (void)argc; + (void)argv; + + // + // Turn on automatic mode. + // + g_sAppState.ui32Mode = APP_MODE_AUTO; + + return (0); +} + +//***************************************************************************** +// +// Command: intensity +// +// Takes a single argument that is between zero and one hundred. The argument +// must be an integer. This is interpreted as the percentage of maximum +// brightness with which to display the current color. +// +//***************************************************************************** +int +CMD_intensity(int argc, char **argv) +{ + uint32_t ui32Intensity; + + // + // This command requires one parameter. + // + if(argc == 2) + { + // + // Extract the intensity from the command line parameter. + // + ui32Intensity = ustrtoul(argv[1], 0, 10); + + // + // Convert the value to a fractional floating point value. + // + g_sAppState.fIntensity = ((float) ui32Intensity) / 100.0f; + + // + // Set the intensity of the RGB LED. + // + RGBIntensitySet(g_sAppState.fIntensity); + } + + return(0); + +} + +//***************************************************************************** +// +// Command: rgb +// +// Takes a single argument that is a string between 000000 and FFFFFF. +// This is the HTML color code that should be used to set the RGB LED color. +// +// http://www.w3schools.com/html/html_colors.asp +// +//***************************************************************************** +int +CMD_rgb(int argc, char **argv) +{ + uint32_t ui32HTMLColor; + + // + // This command requires one parameter. + // + if(argc == 2) + { + // + // Extract the required color from the command line parameter. + // + ui32HTMLColor = ustrtoul(argv[1], 0, 16); + + // + // Decompose teh color into red, green and blue components. + // + g_sAppState.ui32Colors[RED] = (ui32HTMLColor & 0xFF0000) >> 8; + g_sAppState.ui32Colors[GREEN] = (ui32HTMLColor & 0x00FF00); + g_sAppState.ui32Colors[BLUE] = (ui32HTMLColor & 0x0000FF) << 8; + + // + // Turn off automatic mode and set the desired LED color. + // + g_sAppState.ui32Mode = APP_MODE_REMOTE; + g_sAppState.ui32ModeTimer = 0; + RGBColorSet(g_sAppState.ui32Colors); + } + + return (0); + +} diff --git a/boards/ek-tm4c123gxl/qs-rgb/rgb_commands.h b/boards/ek-tm4c123gxl/qs-rgb/rgb_commands.h new file mode 100644 index 0000000..3e9764d --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/rgb_commands.h @@ -0,0 +1,51 @@ +//***************************************************************************** +// +// rgb_commands.h - Prototypes for the evaluation board command line utils. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#ifndef __RGB_COMMANDS_H__ +#define __RGB_COMMANDS_H__ + +//***************************************************************************** +// +// Defines for the command line argument parser provided as a standard part of +// TivaWare. qs-rgb application uses the command line parser to extend +// functionality to the serial port. +// +//***************************************************************************** + +#define CMDLINE_MAX_ARGS 3 + +//***************************************************************************** +// +// Declaration for the callback functions that will implement the command line +// functionality. These functions get called by the command line interpreter +// when the corresponding command is typed into the command line. +// +//***************************************************************************** +extern int CMD_help (int argc, char **argv); +extern int CMD_hib (int argc, char **argv); +extern int CMD_rand (int argc, char **argv); +extern int CMD_intensity (int argc, char **argv); +extern int CMD_rgb (int argc, char **argv); + +#endif //__RGB_COMMANDS_H__ diff --git a/boards/ek-tm4c123gxl/qs-rgb/rvmdk/qs-rgb.axf b/boards/ek-tm4c123gxl/qs-rgb/rvmdk/qs-rgb.axf new file mode 100644 index 0000000..f455c32 Binary files /dev/null and b/boards/ek-tm4c123gxl/qs-rgb/rvmdk/qs-rgb.axf differ diff --git a/boards/ek-tm4c123gxl/qs-rgb/rvmdk/qs-rgb.bin b/boards/ek-tm4c123gxl/qs-rgb/rvmdk/qs-rgb.bin new file mode 100644 index 0000000..14c4792 Binary files /dev/null and b/boards/ek-tm4c123gxl/qs-rgb/rvmdk/qs-rgb.bin differ diff --git a/boards/ek-tm4c123gxl/qs-rgb/startup_ccs.c b/boards/ek-tm4c123gxl/qs-rgb/startup_ccs.c new file mode 100644 index 0000000..12e237b --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/qs-rgb/startup_ewarm.c b/boards/ek-tm4c123gxl/qs-rgb/startup_ewarm.c new file mode 100644 index 0000000..edd6cb5 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/qs-rgb/startup_gcc.c b/boards/ek-tm4c123gxl/qs-rgb/startup_gcc.c new file mode 100644 index 0000000..cf343d5 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[512]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/qs-rgb/startup_rvmdk.S b/boards/ek-tm4c123gxl/qs-rgb/startup_rvmdk.S new file mode 100644 index 0000000..f7ba113 --- /dev/null +++ b/boards/ek-tm4c123gxl/qs-rgb/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN UARTStdioIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTStdioIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/timers/Makefile b/boards/ek-tm4c123gxl/timers/Makefile new file mode 100644 index 0000000..c076d9f --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/Makefile @@ -0,0 +1,85 @@ +#****************************************************************************** +# +# Makefile - Rules for building the timers example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the timers example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/timers.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the timers example. +# +${COMPILER}/timers.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/timers.axf: ${COMPILER}/timers.o +${COMPILER}/timers.axf: ${COMPILER}/uartstdio.o +${COMPILER}/timers.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/timers.axf: timers.ld +SCATTERgcc_timers=timers.ld +ENTRY_timers=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/timers/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/timers/ccs/.ccsimportspec new file mode 100644 index 0000000..e61983c --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-tm4c123gxl/timers/ccs/.ccsproject b/boards/ek-tm4c123gxl/timers/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/timers/ccs/.cproject b/boards/ek-tm4c123gxl/timers/ccs/.cproject new file mode 100644 index 0000000..425134e --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/ccs/.cproject @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/timers/ccs/.project b/boards/ek-tm4c123gxl/timers/ccs/.project new file mode 100644 index 0000000..4cfa87c --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/ccs/.project @@ -0,0 +1,55 @@ + + + timers + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/timers/startup_ccs.c + + + timers.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/timers/timers.c + + + timers_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/timers/timers_ccs.cmd + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/timers/ccs/Debug/timers.bin b/boards/ek-tm4c123gxl/timers/ccs/Debug/timers.bin new file mode 100644 index 0000000..c729099 Binary files /dev/null and b/boards/ek-tm4c123gxl/timers/ccs/Debug/timers.bin differ diff --git a/boards/ek-tm4c123gxl/timers/ccs/Debug/timers.out b/boards/ek-tm4c123gxl/timers/ccs/Debug/timers.out new file mode 100644 index 0000000..aefc296 Binary files /dev/null and b/boards/ek-tm4c123gxl/timers/ccs/Debug/timers.out differ diff --git a/boards/ek-tm4c123gxl/timers/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/timers/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/timers/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/timers/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/timers/ewarm/Exe/timers.bin b/boards/ek-tm4c123gxl/timers/ewarm/Exe/timers.bin new file mode 100644 index 0000000..af65930 Binary files /dev/null and b/boards/ek-tm4c123gxl/timers/ewarm/Exe/timers.bin differ diff --git a/boards/ek-tm4c123gxl/timers/ewarm/Exe/timers.out b/boards/ek-tm4c123gxl/timers/ewarm/Exe/timers.out new file mode 100644 index 0000000..4b4fbf3 Binary files /dev/null and b/boards/ek-tm4c123gxl/timers/ewarm/Exe/timers.out differ diff --git a/boards/ek-tm4c123gxl/timers/gcc/timers.axf b/boards/ek-tm4c123gxl/timers/gcc/timers.axf new file mode 100644 index 0000000..9b30d8d Binary files /dev/null and b/boards/ek-tm4c123gxl/timers/gcc/timers.axf differ diff --git a/boards/ek-tm4c123gxl/timers/gcc/timers.bin b/boards/ek-tm4c123gxl/timers/gcc/timers.bin new file mode 100644 index 0000000..d1a9080 Binary files /dev/null and b/boards/ek-tm4c123gxl/timers/gcc/timers.bin differ diff --git a/boards/ek-tm4c123gxl/timers/readme.txt b/boards/ek-tm4c123gxl/timers/readme.txt new file mode 100644 index 0000000..ff60685 --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/readme.txt @@ -0,0 +1,29 @@ +Timer + +This example application demonstrates the use of the timers to generate +periodic interrupts. One timer is set up to interrupt once per second and +the other to interrupt twice per second; each interrupt handler will toggle +its own indicator on the display. + +UART0, connected to the Virtual Serial Port and running at 115,200, 8-N-1, +is used to display messages from this application. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/timers/rvmdk/timers.axf b/boards/ek-tm4c123gxl/timers/rvmdk/timers.axf new file mode 100644 index 0000000..3ee2e53 Binary files /dev/null and b/boards/ek-tm4c123gxl/timers/rvmdk/timers.axf differ diff --git a/boards/ek-tm4c123gxl/timers/rvmdk/timers.bin b/boards/ek-tm4c123gxl/timers/rvmdk/timers.bin new file mode 100644 index 0000000..bd94e63 Binary files /dev/null and b/boards/ek-tm4c123gxl/timers/rvmdk/timers.bin differ diff --git a/boards/ek-tm4c123gxl/timers/startup_ccs.c b/boards/ek-tm4c123gxl/timers/startup_ccs.c new file mode 100644 index 0000000..bf0cb67 --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/timers/startup_ewarm.c b/boards/ek-tm4c123gxl/timers/startup_ewarm.c new file mode 100644 index 0000000..581781d --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/timers/startup_gcc.c b/boards/ek-tm4c123gxl/timers/startup_gcc.c new file mode 100644 index 0000000..a7b92cb --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void Timer0IntHandler(void); +extern void Timer1IntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + Timer1IntHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/timers/startup_rvmdk.S b/boards/ek-tm4c123gxl/timers/startup_rvmdk.S new file mode 100644 index 0000000..7b6beb8 --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000100 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN Timer0IntHandler + EXTERN Timer1IntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD Timer0IntHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD Timer1IntHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/timers/timers.c b/boards/ek-tm4c123gxl/timers/timers.c new file mode 100644 index 0000000..4c8e4ce --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/timers.c @@ -0,0 +1,262 @@ +//***************************************************************************** +// +// timers.c - Timers example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" +#include "driverlib/uart.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      Timer (timers)

      +//! +//! This example application demonstrates the use of the timers to generate +//! periodic interrupts. One timer is set up to interrupt once per second and +//! the other to interrupt twice per second; each interrupt handler will toggle +//! its own indicator on the display. +//! +//! UART0, connected to the Virtual Serial Port and running at 115,200, 8-N-1, +//! is used to display messages from this application. +// +//***************************************************************************** + +//***************************************************************************** +// +// Flags that contain the current value of the interrupt indicator as displayed +// on the UART. +// +//***************************************************************************** +uint32_t g_ui32Flags; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the first timer interrupt. +// +//***************************************************************************** +void +Timer0IntHandler(void) +{ + char cOne, cTwo; + + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); + + // + // Toggle the flag for the first timer. + // + HWREGBITW(&g_ui32Flags, 0) ^= 1; + + // + // Use the flags to Toggle the LED for this timer + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, g_ui32Flags << 1); + + // + // Update the interrupt status on the display. + // + ROM_IntMasterDisable(); + cOne = HWREGBITW(&g_ui32Flags, 0) ? '1' : '0'; + cTwo = HWREGBITW(&g_ui32Flags, 1) ? '1' : '0'; + UARTprintf("\rT1: %c T2: %c", cOne, cTwo); + ROM_IntMasterEnable(); +} + +//***************************************************************************** +// +// The interrupt handler for the second timer interrupt. +// +//***************************************************************************** +void +Timer1IntHandler(void) +{ + char cOne, cTwo; + + // + // Clear the timer interrupt. + // + ROM_TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); + + // + // Toggle the flag for the second timer. + // + HWREGBITW(&g_ui32Flags, 1) ^= 1; + + // + // Use the flags to Toggle the LED for this timer + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, g_ui32Flags << 1); + + // + // Update the interrupt status on the display. + // + ROM_IntMasterDisable(); + cOne = HWREGBITW(&g_ui32Flags, 0) ? '1' : '0'; + cTwo = HWREGBITW(&g_ui32Flags, 1) ? '1' : '0'; + UARTprintf("\rT1: %c T2: %c", cOne, cTwo); + ROM_IntMasterEnable(); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example application demonstrates the use of the timers to generate +// periodic interrupts. +// +//***************************************************************************** +int +main(void) +{ + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Initialize the UART and write status. + // + ConfigureUART(); + + UARTprintf("\033[2JTimers example\n"); + UARTprintf("T1: 0 T2: 0"); + + // + // Enable the GPIO port that is used for the on-board LED. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + + // + // Enable the GPIO pins for the LED (PF1 & PF2). + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_1); + + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); + + // + // Enable processor interrupts. + // + ROM_IntMasterEnable(); + + // + // Configure the two 32-bit periodic timers. + // + ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); + ROM_TimerConfigure(TIMER1_BASE, TIMER_CFG_PERIODIC); + ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ROM_SysCtlClockGet()); + ROM_TimerLoadSet(TIMER1_BASE, TIMER_A, ROM_SysCtlClockGet() / 2); + + // + // Setup the interrupts for the timer timeouts. + // + ROM_IntEnable(INT_TIMER0A); + ROM_IntEnable(INT_TIMER1A); + ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); + ROM_TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); + + // + // Enable the timers. + // + ROM_TimerEnable(TIMER0_BASE, TIMER_A); + ROM_TimerEnable(TIMER1_BASE, TIMER_A); + + // + // Loop forever while the timers run. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/timers/timers.ewd b/boards/ek-tm4c123gxl/timers/timers.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/timers.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/timers/timers.ewp b/boards/ek-tm4c123gxl/timers/timers.ewp new file mode 100644 index 0000000..f3cc550 --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/timers.ewp @@ -0,0 +1,787 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + + Source + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\timers.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + diff --git a/boards/ek-tm4c123gxl/timers/timers.icf b/boards/ek-tm4c123gxl/timers/timers.icf new file mode 100644 index 0000000..eaf2160 --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/timers.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// timers.icf - Linker configuration file for timers. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/timers/timers.ld b/boards/ek-tm4c123gxl/timers/timers.ld new file mode 100644 index 0000000..9e716ed --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/timers.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * timers.ld - Linker configuration file for timers. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/timers/timers.sct b/boards/ek-tm4c123gxl/timers/timers.sct new file mode 100644 index 0000000..67eee9e --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/timers.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; timers.sct - Linker configuration file for timers. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/timers/timers.uvopt b/boards/ek-tm4c123gxl/timers/timers.uvopt new file mode 100644 index 0000000..f75a29e --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/timers.uvopt @@ -0,0 +1,303 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + timers + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\timers.c + timers.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 5 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/timers/timers.uvproj b/boards/ek-tm4c123gxl/timers/timers.uvproj new file mode 100644 index 0000000..082aebf --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/timers.uvproj @@ -0,0 +1,429 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + timers + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + timers + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\timers.bin .\rvmdk\timers.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + timers.sct + + + --entry Reset_Handler + + + + + + + + Source + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + timers.c + 1 + .\timers.c + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/timers/timers_ccs.cmd b/boards/ek-tm4c123gxl/timers/timers_ccs.cmd new file mode 100644 index 0000000..ebadc78 --- /dev/null +++ b/boards/ek-tm4c123gxl/timers/timers_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * timers_ccs.cmd - CCS linker configuration file for timers. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 256; diff --git a/boards/ek-tm4c123gxl/uart_echo/Makefile b/boards/ek-tm4c123gxl/uart_echo/Makefile new file mode 100644 index 0000000..7bcd0d4 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/Makefile @@ -0,0 +1,79 @@ +#****************************************************************************** +# +# Makefile - Rules for building the uart_echo example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the uart_echo example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/uart_echo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the uart_echo example. +# +${COMPILER}/uart_echo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/uart_echo.axf: ${COMPILER}/uart_echo.o +${COMPILER}/uart_echo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/uart_echo.axf: uart_echo.ld +SCATTERgcc_uart_echo=uart_echo.ld +ENTRY_uart_echo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/uart_echo/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/uart_echo/ccs/.ccsimportspec new file mode 100644 index 0000000..9a02fa9 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-tm4c123gxl/uart_echo/ccs/.ccsproject b/boards/ek-tm4c123gxl/uart_echo/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/uart_echo/ccs/.cproject b/boards/ek-tm4c123gxl/uart_echo/ccs/.cproject new file mode 100644 index 0000000..9030268 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/ccs/.cproject @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/uart_echo/ccs/.project b/boards/ek-tm4c123gxl/uart_echo/ccs/.project new file mode 100644 index 0000000..f87737d --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/ccs/.project @@ -0,0 +1,50 @@ + + + uart_echo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/uart_echo/startup_ccs.c + + + uart_echo.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/uart_echo/uart_echo.c + + + uart_echo_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/uart_echo/uart_echo_ccs.cmd + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/uart_echo/ccs/Debug/uart_echo.bin b/boards/ek-tm4c123gxl/uart_echo/ccs/Debug/uart_echo.bin new file mode 100644 index 0000000..c2cf780 Binary files /dev/null and b/boards/ek-tm4c123gxl/uart_echo/ccs/Debug/uart_echo.bin differ diff --git a/boards/ek-tm4c123gxl/uart_echo/ccs/Debug/uart_echo.out b/boards/ek-tm4c123gxl/uart_echo/ccs/Debug/uart_echo.out new file mode 100644 index 0000000..a9dc628 Binary files /dev/null and b/boards/ek-tm4c123gxl/uart_echo/ccs/Debug/uart_echo.out differ diff --git a/boards/ek-tm4c123gxl/uart_echo/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/uart_echo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/uart_echo/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/uart_echo/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/uart_echo/ewarm/Exe/uart_echo.bin b/boards/ek-tm4c123gxl/uart_echo/ewarm/Exe/uart_echo.bin new file mode 100644 index 0000000..4ae467b Binary files /dev/null and b/boards/ek-tm4c123gxl/uart_echo/ewarm/Exe/uart_echo.bin differ diff --git a/boards/ek-tm4c123gxl/uart_echo/ewarm/Exe/uart_echo.out b/boards/ek-tm4c123gxl/uart_echo/ewarm/Exe/uart_echo.out new file mode 100644 index 0000000..1e36cc7 Binary files /dev/null and b/boards/ek-tm4c123gxl/uart_echo/ewarm/Exe/uart_echo.out differ diff --git a/boards/ek-tm4c123gxl/uart_echo/gcc/uart_echo.axf b/boards/ek-tm4c123gxl/uart_echo/gcc/uart_echo.axf new file mode 100644 index 0000000..c37fd88 Binary files /dev/null and b/boards/ek-tm4c123gxl/uart_echo/gcc/uart_echo.axf differ diff --git a/boards/ek-tm4c123gxl/uart_echo/gcc/uart_echo.bin b/boards/ek-tm4c123gxl/uart_echo/gcc/uart_echo.bin new file mode 100644 index 0000000..0822d57 Binary files /dev/null and b/boards/ek-tm4c123gxl/uart_echo/gcc/uart_echo.bin differ diff --git a/boards/ek-tm4c123gxl/uart_echo/readme.txt b/boards/ek-tm4c123gxl/uart_echo/readme.txt new file mode 100644 index 0000000..97d4d4a --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/readme.txt @@ -0,0 +1,26 @@ +UART Echo + +This example application utilizes the UART to echo text. The first UART +(connected to the USB debug virtual serial port on the evaluation board) +will be configured in 115,200 baud, 8-n-1 mode. All characters received on +the UART are transmitted back to the UART. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/uart_echo/rvmdk/uart_echo.axf b/boards/ek-tm4c123gxl/uart_echo/rvmdk/uart_echo.axf new file mode 100644 index 0000000..696b287 Binary files /dev/null and b/boards/ek-tm4c123gxl/uart_echo/rvmdk/uart_echo.axf differ diff --git a/boards/ek-tm4c123gxl/uart_echo/rvmdk/uart_echo.bin b/boards/ek-tm4c123gxl/uart_echo/rvmdk/uart_echo.bin new file mode 100644 index 0000000..bddc20c Binary files /dev/null and b/boards/ek-tm4c123gxl/uart_echo/rvmdk/uart_echo.bin differ diff --git a/boards/ek-tm4c123gxl/uart_echo/startup_ccs.c b/boards/ek-tm4c123gxl/uart_echo/startup_ccs.c new file mode 100644 index 0000000..ff58c3e --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/startup_ccs.c @@ -0,0 +1,302 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/uart_echo/startup_ewarm.c b/boards/ek-tm4c123gxl/uart_echo/startup_ewarm.c new file mode 100644 index 0000000..90e1797 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/startup_ewarm.c @@ -0,0 +1,333 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/uart_echo/startup_gcc.c b/boards/ek-tm4c123gxl/uart_echo/startup_gcc.c new file mode 100644 index 0000000..9b46bed --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/startup_gcc.c @@ -0,0 +1,349 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void UARTIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[64]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/uart_echo/startup_rvmdk.S b/boards/ek-tm4c123gxl/uart_echo/startup_rvmdk.S new file mode 100644 index 0000000..55fd402 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/startup_rvmdk.S @@ -0,0 +1,358 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000100 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declaration for the interrupt handler used by the application. +; +;****************************************************************************** + EXTERN UARTIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/uart_echo/uart_echo.c b/boards/ek-tm4c123gxl/uart_echo/uart_echo.c new file mode 100644 index 0000000..6a81b65 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/uart_echo.c @@ -0,0 +1,206 @@ +//***************************************************************************** +// +// uart_echo.c - Example for reading data from and writing data to the UART in +// an interrupt driven fashion. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      UART Echo (uart_echo)

      +//! +//! This example application utilizes the UART to echo text. The first UART +//! (connected to the USB debug virtual serial port on the evaluation board) +//! will be configured in 115,200 baud, 8-n-1 mode. All characters received on +//! the UART are transmitted back to the UART. +// +//***************************************************************************** + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// The UART interrupt handler. +// +//***************************************************************************** +void +UARTIntHandler(void) +{ + uint32_t ui32Status; + + // + // Get the interrrupt status. + // + ui32Status = ROM_UARTIntStatus(UART0_BASE, true); + + // + // Clear the asserted interrupts. + // + ROM_UARTIntClear(UART0_BASE, ui32Status); + + // + // Loop while there are characters in the receive FIFO. + // + while(ROM_UARTCharsAvail(UART0_BASE)) + { + // + // Read the next character from the UART and write it back to the UART. + // + ROM_UARTCharPutNonBlocking(UART0_BASE, + ROM_UARTCharGetNonBlocking(UART0_BASE)); + + // + // Blink the LED to show a character transfer is occuring. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); + + // + // Delay for 1 millisecond. Each SysCtlDelay is about 3 clocks. + // + SysCtlDelay(SysCtlClockGet() / (1000 * 3)); + + // + // Turn off the LED + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); + + } +} + +//***************************************************************************** +// +// Send a string to the UART. +// +//***************************************************************************** +void +UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count) +{ + // + // Loop while there are more characters to send. + // + while(ui32Count--) + { + // + // Write the next character to the UART. + // + ROM_UARTCharPutNonBlocking(UART0_BASE, *pui8Buffer++); + } +} + +//***************************************************************************** +// +// This example demonstrates how to send a string of data to the UART. +// +//***************************************************************************** +int +main(void) +{ + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUEnable(); + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Enable the GPIO port that is used for the on-board LED. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + + // + // Enable the GPIO pins for the LED (PF2). + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2); + + // + // Enable the peripherals used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable processor interrupts. + // + ROM_IntMasterEnable(); + + // + // Set GPIO A0 and A1 as UART pins. + // + GPIOPinConfigure(GPIO_PA0_U0RX); + GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Configure the UART for 115,200, 8-N-1 operation. + // + ROM_UARTConfigSetExpClk(UART0_BASE, ROM_SysCtlClockGet(), 115200, + (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | + UART_CONFIG_PAR_NONE)); + + // + // Enable the UART interrupt. + // + ROM_IntEnable(INT_UART0); + ROM_UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT); + + // + // Prompt for text to be entered. + // + UARTSend((uint8_t *)"\033[2JEnter text: ", 16); + + // + // Loop forever echoing data through the UART. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/uart_echo/uart_echo.ewd b/boards/ek-tm4c123gxl/uart_echo/uart_echo.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/uart_echo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/uart_echo/uart_echo.ewp b/boards/ek-tm4c123gxl/uart_echo/uart_echo.ewp new file mode 100644 index 0000000..7000f6d --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/uart_echo.ewp @@ -0,0 +1,784 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + + Source + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\uart_echo.c + + + diff --git a/boards/ek-tm4c123gxl/uart_echo/uart_echo.icf b/boards/ek-tm4c123gxl/uart_echo/uart_echo.icf new file mode 100644 index 0000000..7316c6b --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/uart_echo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// uart_echo.icf - Linker configuration file for uart_echo. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/uart_echo/uart_echo.ld b/boards/ek-tm4c123gxl/uart_echo/uart_echo.ld new file mode 100644 index 0000000..10bd8f0 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/uart_echo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * uart_echo.ld - Linker configuration file for uart_echo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/uart_echo/uart_echo.sct b/boards/ek-tm4c123gxl/uart_echo/uart_echo.sct new file mode 100644 index 0000000..278fa25 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/uart_echo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; uart_echo.sct - Linker configuration file for uart_echo. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/uart_echo/uart_echo.uvopt b/boards/ek-tm4c123gxl/uart_echo/uart_echo.uvopt new file mode 100644 index 0000000..4d6e088 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/uart_echo.uvopt @@ -0,0 +1,289 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + uart_echo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\uart_echo.c + uart_echo.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 4 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/uart_echo/uart_echo.uvproj b/boards/ek-tm4c123gxl/uart_echo/uart_echo.uvproj new file mode 100644 index 0000000..b78e09f --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/uart_echo.uvproj @@ -0,0 +1,424 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + uart_echo + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + uart_echo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\uart_echo.bin .\rvmdk\uart_echo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + uart_echo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uart_echo.c + 1 + .\uart_echo.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/uart_echo/uart_echo_ccs.cmd b/boards/ek-tm4c123gxl/uart_echo/uart_echo_ccs.cmd new file mode 100644 index 0000000..a2860f1 --- /dev/null +++ b/boards/ek-tm4c123gxl/uart_echo/uart_echo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * uart_echo_ccs.cmd - CCS linker configuration file for uart_echo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 256; diff --git a/boards/ek-tm4c123gxl/udma_demo/Makefile b/boards/ek-tm4c123gxl/udma_demo/Makefile new file mode 100644 index 0000000..ba7ea5a --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/Makefile @@ -0,0 +1,87 @@ +#****************************************************************************** +# +# Makefile - Rules for building the uDMA example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the uDMA example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/udma_demo.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the uDMA example. +# +${COMPILER}/udma_demo.axf: ${COMPILER}/cpu_usage.o +${COMPILER}/udma_demo.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/udma_demo.axf: ${COMPILER}/uartstdio.o +${COMPILER}/udma_demo.axf: ${COMPILER}/udma_demo.o +${COMPILER}/udma_demo.axf: ${COMPILER}/ustdlib.o +${COMPILER}/udma_demo.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/udma_demo.axf: udma_demo.ld +SCATTERgcc_udma_demo=udma_demo.ld +ENTRY_udma_demo=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/udma_demo/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/udma_demo/ccs/.ccsimportspec new file mode 100644 index 0000000..aea8941 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/ccs/.ccsimportspec @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/boards/ek-tm4c123gxl/udma_demo/ccs/.ccsproject b/boards/ek-tm4c123gxl/udma_demo/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/udma_demo/ccs/.cproject b/boards/ek-tm4c123gxl/udma_demo/ccs/.cproject new file mode 100644 index 0000000..5dbb724 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/ccs/.cproject @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/udma_demo/ccs/.project b/boards/ek-tm4c123gxl/udma_demo/ccs/.project new file mode 100644 index 0000000..f8e3d81 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/ccs/.project @@ -0,0 +1,65 @@ + + + udma_demo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/udma_demo/startup_ccs.c + + + udma_demo.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/udma_demo/udma_demo.c + + + udma_demo_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/udma_demo/udma_demo_ccs.cmd + + + utils/cpu_usage.c + 1 + SW_ROOT/utils/cpu_usage.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/udma_demo/ccs/Debug/udma_demo.bin b/boards/ek-tm4c123gxl/udma_demo/ccs/Debug/udma_demo.bin new file mode 100644 index 0000000..af6dd16 Binary files /dev/null and b/boards/ek-tm4c123gxl/udma_demo/ccs/Debug/udma_demo.bin differ diff --git a/boards/ek-tm4c123gxl/udma_demo/ccs/Debug/udma_demo.out b/boards/ek-tm4c123gxl/udma_demo/ccs/Debug/udma_demo.out new file mode 100644 index 0000000..2f91b7a Binary files /dev/null and b/boards/ek-tm4c123gxl/udma_demo/ccs/Debug/udma_demo.out differ diff --git a/boards/ek-tm4c123gxl/udma_demo/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/udma_demo/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/udma_demo/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/udma_demo/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/udma_demo/ewarm/Exe/udma_demo.bin b/boards/ek-tm4c123gxl/udma_demo/ewarm/Exe/udma_demo.bin new file mode 100644 index 0000000..677acc2 Binary files /dev/null and b/boards/ek-tm4c123gxl/udma_demo/ewarm/Exe/udma_demo.bin differ diff --git a/boards/ek-tm4c123gxl/udma_demo/ewarm/Exe/udma_demo.out b/boards/ek-tm4c123gxl/udma_demo/ewarm/Exe/udma_demo.out new file mode 100644 index 0000000..3f5e734 Binary files /dev/null and b/boards/ek-tm4c123gxl/udma_demo/ewarm/Exe/udma_demo.out differ diff --git a/boards/ek-tm4c123gxl/udma_demo/gcc/udma_demo.axf b/boards/ek-tm4c123gxl/udma_demo/gcc/udma_demo.axf new file mode 100644 index 0000000..250b390 Binary files /dev/null and b/boards/ek-tm4c123gxl/udma_demo/gcc/udma_demo.axf differ diff --git a/boards/ek-tm4c123gxl/udma_demo/gcc/udma_demo.bin b/boards/ek-tm4c123gxl/udma_demo/gcc/udma_demo.bin new file mode 100644 index 0000000..1390d51 Binary files /dev/null and b/boards/ek-tm4c123gxl/udma_demo/gcc/udma_demo.bin differ diff --git a/boards/ek-tm4c123gxl/udma_demo/readme.txt b/boards/ek-tm4c123gxl/udma_demo/readme.txt new file mode 100644 index 0000000..1f2c39f --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/readme.txt @@ -0,0 +1,28 @@ +uDMA + +This example application demonstrates the use of the uDMA controller to +transfer data between memory buffers, and to transfer data to and from a +UART. The test runs for 10 seconds before exiting. + +UART0, connected to the FTDI virtual COM port and running at 115,200, +8-N-1, is used to display messages from this application. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/udma_demo/rvmdk/udma_demo.axf b/boards/ek-tm4c123gxl/udma_demo/rvmdk/udma_demo.axf new file mode 100644 index 0000000..d2fc369 Binary files /dev/null and b/boards/ek-tm4c123gxl/udma_demo/rvmdk/udma_demo.axf differ diff --git a/boards/ek-tm4c123gxl/udma_demo/rvmdk/udma_demo.bin b/boards/ek-tm4c123gxl/udma_demo/rvmdk/udma_demo.bin new file mode 100644 index 0000000..972f626 Binary files /dev/null and b/boards/ek-tm4c123gxl/udma_demo/rvmdk/udma_demo.bin differ diff --git a/boards/ek-tm4c123gxl/udma_demo/startup_ccs.c b/boards/ek-tm4c123gxl/udma_demo/startup_ccs.c new file mode 100644 index 0000000..ca4321f --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/startup_ccs.c @@ -0,0 +1,305 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART1IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + UART1IntHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/udma_demo/startup_ewarm.c b/boards/ek-tm4c123gxl/udma_demo/startup_ewarm.c new file mode 100644 index 0000000..ab0adc3 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/startup_ewarm.c @@ -0,0 +1,336 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART1IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + UART1IntHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/udma_demo/startup_gcc.c b/boards/ek-tm4c123gxl/udma_demo/startup_gcc.c new file mode 100644 index 0000000..0ef8a3d --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/startup_gcc.c @@ -0,0 +1,352 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickHandler(void); +extern void UART1IntHandler(void); +extern void uDMAIntHandler(void); +extern void uDMAErrorHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + UART1IntHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + uDMAIntHandler, // uDMA Software Transfer + uDMAErrorHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/udma_demo/startup_rvmdk.S b/boards/ek-tm4c123gxl/udma_demo/startup_rvmdk.S new file mode 100644 index 0000000..94c7ba1 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/startup_rvmdk.S @@ -0,0 +1,361 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickHandler + EXTERN UART1IntHandler + EXTERN uDMAIntHandler + EXTERN uDMAErrorHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 Rx and Tx + DCD UART1IntHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD IntDefaultHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD uDMAIntHandler ; uDMA Software Transfer + DCD uDMAErrorHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/udma_demo/udma_demo.c b/boards/ek-tm4c123gxl/udma_demo/udma_demo.c new file mode 100644 index 0000000..0466c2e --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/udma_demo.c @@ -0,0 +1,1012 @@ +//***************************************************************************** +// +// udma_demo.c - uDMA example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_uart.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/uart.h" +#include "driverlib/udma.h" +#include "utils/cpu_usage.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      uDMA (udma_demo)

      +//! +//! This example application demonstrates the use of the uDMA controller to +//! transfer data between memory buffers, and to transfer data to and from a +//! UART. The test runs for 10 seconds before exiting. +//! +//! UART0, connected to the FTDI virtual COM port and running at 115,200, +//! 8-N-1, is used to display messages from this application. +// +//***************************************************************************** + +//***************************************************************************** +// +// The number of SysTick ticks per second used for the SysTick interrupt. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 + +//***************************************************************************** +// +// The size of the memory transfer source and destination buffers (in words). +// +//***************************************************************************** +#define MEM_BUFFER_SIZE 1024 + +//***************************************************************************** +// +// The size of the UART transmit and receive buffers. They do not need to be +// the same size. +// +//***************************************************************************** +#define UART_TXBUF_SIZE 256 +#define UART_RXBUF_SIZE 256 + +//***************************************************************************** +// +// The source and destination buffers used for memory transfers. +// +//***************************************************************************** +static uint32_t g_ui32SrcBuf[MEM_BUFFER_SIZE]; +static uint32_t g_ui32DstBuf[MEM_BUFFER_SIZE]; + +//***************************************************************************** +// +// The transmit and receive buffers used for the UART transfers. There is one +// transmit buffer and a pair of recieve ping-pong buffers. +// +//***************************************************************************** +static uint8_t g_ui8TxBuf[UART_TXBUF_SIZE]; +static uint8_t g_ui8RxBufA[UART_RXBUF_SIZE]; +static uint8_t g_ui8RxBufB[UART_RXBUF_SIZE]; + +//***************************************************************************** +// +// The count of uDMA errors. This value is incremented by the uDMA error +// handler. +// +//***************************************************************************** +static uint32_t g_ui32uDMAErrCount = 0; + +//***************************************************************************** +// +// The count of times the uDMA interrupt occurred but the uDMA transfer was not +// complete. This should remain 0. +// +//***************************************************************************** +static uint32_t g_ui32BadISR = 0; + +//***************************************************************************** +// +// The count of UART buffers filled, one for each ping-pong buffer. +// +//***************************************************************************** +static uint32_t g_ui32RxBufACount = 0; +static uint32_t g_ui32RxBufBCount = 0; + +//***************************************************************************** +// +// The count of memory uDMA transfer blocks. This value is incremented by the +// uDMA interrupt handler whenever a memory block transfer is completed. +// +//***************************************************************************** +static uint32_t g_ui32MemXferCount = 0; + +//***************************************************************************** +// +// The CPU usage in percent, in 16.16 fixed point format. +// +//***************************************************************************** +static uint32_t g_ui32CPUUsage; + +//***************************************************************************** +// +// The number of seconds elapsed since the start of the program. This value is +// maintained by the SysTick interrupt handler. +// +//***************************************************************************** +static uint32_t g_ui32Seconds = 0; + +//***************************************************************************** +// +// The control table used by the uDMA controller. This table must be aligned +// to a 1024 byte boundary. +// +//***************************************************************************** +#if defined(ewarm) +#pragma data_alignment=1024 +uint8_t ui8ControlTable[1024]; +#elif defined(ccs) +#pragma DATA_ALIGN(ui8ControlTable, 1024) +uint8_t ui8ControlTable[1024]; +#else +uint8_t ui8ControlTable[1024] __attribute__ ((aligned(1024))); +#endif + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + while(1) + { + // + // Hang on runtime error. + // + } +} +#endif + +//***************************************************************************** +// +// The interrupt handler for the SysTick timer. This handler will increment a +// seconds counter whenever the appropriate number of ticks has occurred. It +// will also call the CPU usage tick function to find the CPU usage percent. +// +//***************************************************************************** +void +SysTickHandler(void) +{ + static uint32_t ui32TickCount = 0; + + // + // Increment the tick counter. + // + ui32TickCount++; + + // + // If the number of ticks per second has occurred, then increment the + // seconds counter. + // + if(!(ui32TickCount % SYSTICKS_PER_SECOND)) + { + g_ui32Seconds++; + } + + // + // Call the CPU usage tick function. This function will compute the amount + // of cycles used by the CPU since the last call and return the result in + // percent in fixed point 16.16 format. + // + g_ui32CPUUsage = CPUUsageTick(); +} + +//***************************************************************************** +// +// The interrupt handler for uDMA errors. This interrupt will occur if the +// uDMA encounters a bus error while trying to perform a transfer. This +// handler just increments a counter if an error occurs. +// +//***************************************************************************** +void +uDMAErrorHandler(void) +{ + uint32_t ui32Status; + + // + // Check for uDMA error bit + // + ui32Status = ROM_uDMAErrorStatusGet(); + + // + // If there is a uDMA error, then clear the error and increment + // the error counter. + // + if(ui32Status) + { + ROM_uDMAErrorStatusClear(); + g_ui32uDMAErrCount++; + } +} + +//***************************************************************************** +// +// The interrupt handler for uDMA interrupts from the memory channel. This +// interrupt will increment a counter, and then restart another memory +// transfer. +// +//***************************************************************************** +void +uDMAIntHandler(void) +{ + uint32_t ui32Mode; + + // + // Check for the primary control structure to indicate complete. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_SW); + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment the count of completed transfers. + // + g_ui32MemXferCount++; + + // + // Configure it for another transfer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_SW, UDMA_MODE_AUTO, + g_ui32SrcBuf, g_ui32DstBuf, + MEM_BUFFER_SIZE); + + // + // Initiate another transfer. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_SW); + ROM_uDMAChannelRequest(UDMA_CHANNEL_SW); + } + + // + // If the channel is not stopped, then something is wrong. + // + else + { + g_ui32BadISR++; + } +} + +//***************************************************************************** +// +// The interrupt handler for UART1. This interrupt will occur when a DMA +// transfer is complete using the UART1 uDMA channel. It will also be +// triggered if the peripheral signals an error. This interrupt handler will +// switch between receive ping-pong buffers A and B. It will also restart a TX +// uDMA transfer if the prior transfer is complete. This will keep the UART +// running continuously (looping TX data back to RX). +// +//***************************************************************************** +void +UART1IntHandler(void) +{ + uint32_t ui32Status; + uint32_t ui32Mode; + + // + // Read the interrupt status of the UART. + // + ui32Status = ROM_UARTIntStatus(UART1_BASE, 1); + + // + // Clear any pending status, even though there should be none since no UART + // interrupts were enabled. If UART error interrupts were enabled, then + // those interrupts could occur here and should be handled. Since uDMA is + // used for both the RX and TX, then neither of those interrupts should be + // enabled. + // + ROM_UARTIntClear(UART1_BASE, ui32Status); + + // + // Check the DMA control table to see if the ping-pong "A" transfer is + // complete. The "A" transfer uses receive buffer "A", and the primary + // control structure. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_UART1RX | UDMA_PRI_SELECT); + + // + // If the primary control structure indicates stop, that means the "A" + // receive buffer is done. The uDMA controller should still be receiving + // data into the "B" buffer. + // + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment a counter to indicate data was received into buffer A. In + // a real application this would be used to signal the main thread that + // data was received so the main thread can process the data. + // + g_ui32RxBufACount++; + + // + // Set up the next transfer for the "A" buffer, using the primary + // control structure. When the ongoing receive into the "B" buffer is + // done, the uDMA controller will switch back to this one. This + // example re-uses buffer A, but a more sophisticated application could + // use a rotating set of buffers to increase the amount of time that + // the main thread has to process the data in the buffer before it is + // reused. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART1RX | UDMA_PRI_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART1_BASE + UART_O_DR), + g_ui8RxBufA, sizeof(g_ui8RxBufA)); + } + + // + // Check the DMA control table to see if the ping-pong "B" transfer is + // complete. The "B" transfer uses receive buffer "B", and the alternate + // control structure. + // + ui32Mode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_UART1RX | UDMA_ALT_SELECT); + + // + // If the alternate control structure indicates stop, that means the "B" + // receive buffer is done. The uDMA controller should still be receiving + // data into the "A" buffer. + // + if(ui32Mode == UDMA_MODE_STOP) + { + // + // Increment a counter to indicate data was received into buffer A. In + // a real application this would be used to signal the main thread that + // data was received so the main thread can process the data. + // + g_ui32RxBufBCount++; + + // + // Set up the next transfer for the "B" buffer, using the alternate + // control structure. When the ongoing receive into the "A" buffer is + // done, the uDMA controller will switch back to this one. This + // example re-uses buffer B, but a more sophisticated application could + // use a rotating set of buffers to increase the amount of time that + // the main thread has to process the data in the buffer before it is + // reused. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART1RX | UDMA_ALT_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART1_BASE + UART_O_DR), + g_ui8RxBufB, sizeof(g_ui8RxBufB)); + } + + // + // If the UART1 DMA TX channel is disabled, that means the TX DMA transfer + // is done. + // + if(!ROM_uDMAChannelIsEnabled(UDMA_CHANNEL_UART1TX)) + { + // + // Start another DMA transfer to UART1 TX. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART1TX | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, g_ui8TxBuf, + (void *)(UART1_BASE + UART_O_DR), + sizeof(g_ui8TxBuf)); + + // + // The uDMA TX channel must be re-enabled. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART1TX); + } +} + +//***************************************************************************** +// +// Initializes the UART1 peripheral and sets up the TX and RX uDMA channels. +// The UART is configured for loopback mode so that any data sent on TX will be +// received on RX. The uDMA channels are configured so that the TX channel +// will copy data from a buffer to the UART TX output. And the uDMA RX channel +// will receive any incoming data into a pair of buffers in ping-pong mode. +// +//***************************************************************************** +void +InitUART1Transfer(void) +{ + unsigned int uIdx; + + // + // Fill the TX buffer with a simple data pattern. + // + for(uIdx = 0; uIdx < UART_TXBUF_SIZE; uIdx++) + { + g_ui8TxBuf[uIdx] = uIdx; + } + + // + // Enable the UART peripheral, and configure it to operate even if the CPU + // is in sleep. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1); + ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART1); + + // + // Configure the UART communication parameters. + // + ROM_UARTConfigSetExpClk(UART1_BASE, ROM_SysCtlClockGet(), 115200, + UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | + UART_CONFIG_PAR_NONE); + + // + // Set both the TX and RX trigger thresholds to 4. This will be used by + // the uDMA controller to signal when more data should be transferred. The + // uDMA TX and RX channels will be configured so that it can transfer 4 + // bytes in a burst when the UART is ready to transfer more data. + // + ROM_UARTFIFOLevelSet(UART1_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8); + + // + // Enable the UART for operation, and enable the uDMA interface for both TX + // and RX channels. + // + ROM_UARTEnable(UART1_BASE); + ROM_UARTDMAEnable(UART1_BASE, UART_DMA_RX | UART_DMA_TX); + + // + // This register write will set the UART to operate in loopback mode. Any + // data sent on the TX output will be received on the RX input. + // + HWREG(UART1_BASE + UART_O_CTL) |= UART_CTL_LBE; + + // + // Enable the UART peripheral interrupts. Note that no UART interrupts + // were enabled, but the uDMA controller will cause an interrupt on the + // UART interrupt signal when a uDMA transfer is complete. + // + ROM_IntEnable(INT_UART1); + + // + // Put the attributes in a known state for the uDMA UART1RX channel. These + // should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_UART1RX, + UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + + // + // Configure the control parameters for the primary control structure for + // the UART RX channel. The primary contol structure is used for the "A" + // part of the ping-pong receive. The transfer data size is 8 bits, the + // source address does not increment since it will be reading from a + // register. The destination address increment is byte 8-bit bytes. The + // arbitration size is set to 4 to match the RX FIFO trigger threshold. + // The uDMA controller will use a 4 byte burst transfer if possible. This + // will be somewhat more effecient that single byte transfers. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART1RX | UDMA_PRI_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | + UDMA_ARB_4); + + // + // Configure the control parameters for the alternate control structure for + // the UART RX channel. The alternate contol structure is used for the "B" + // part of the ping-pong receive. The configuration is identical to the + // primary/A control structure. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART1RX | UDMA_ALT_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | + UDMA_ARB_4); + + // + // Set up the transfer parameters for the UART RX primary control + // structure. The mode is set to ping-pong, the transfer source is the + // UART data register, and the destination is the receive "A" buffer. The + // transfer size is set to match the size of the buffer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART1RX | UDMA_PRI_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART1_BASE + UART_O_DR), + g_ui8RxBufA, sizeof(g_ui8RxBufA)); + + // + // Set up the transfer parameters for the UART RX alternate control + // structure. The mode is set to ping-pong, the transfer source is the + // UART data register, and the destination is the receive "B" buffer. The + // transfer size is set to match the size of the buffer. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART1RX | UDMA_ALT_SELECT, + UDMA_MODE_PINGPONG, + (void *)(UART1_BASE + UART_O_DR), + g_ui8RxBufB, sizeof(g_ui8RxBufB)); + + // + // Put the attributes in a known state for the uDMA UART1TX channel. These + // should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_UART1TX, + UDMA_ATTR_ALTSELECT | + UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK); + + // + // Set the USEBURST attribute for the uDMA UART TX channel. This will + // force the controller to always use a burst when transferring data from + // the TX buffer to the UART. This is somewhat more effecient bus usage + // than the default which allows single or burst transfers. + // + ROM_uDMAChannelAttributeEnable(UDMA_CHANNEL_UART1TX, UDMA_ATTR_USEBURST); + + // + // Configure the control parameters for the UART TX. The uDMA UART TX + // channel is used to transfer a block of data from a buffer to the UART. + // The data size is 8 bits. The source address increment is 8-bit bytes + // since the data is coming from a buffer. The destination increment is + // none since the data is to be written to the UART data register. The + // arbitration size is set to 4, which matches the UART TX FIFO trigger + // threshold. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART1TX | UDMA_PRI_SELECT, + UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | + UDMA_ARB_4); + + // + // Set up the transfer parameters for the uDMA UART TX channel. This will + // configure the transfer source and destination and the transfer size. + // Basic mode is used because the peripheral is making the uDMA transfer + // request. The source is the TX buffer and the destination is the UART + // data register. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART1TX | UDMA_PRI_SELECT, + UDMA_MODE_BASIC, g_ui8TxBuf, + (void *)(UART1_BASE + UART_O_DR), + sizeof(g_ui8TxBuf)); + + // + // Now both the uDMA UART TX and RX channels are primed to start a + // transfer. As soon as the channels are enabled, the peripheral will + // issue a transfer request and the data transfers will begin. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART1RX); + ROM_uDMAChannelEnable(UDMA_CHANNEL_UART1TX); +} + +//***************************************************************************** +// +// Initializes the uDMA software channel to perform a memory to memory uDMA +// transfer. +// +//***************************************************************************** +void +InitSWTransfer(void) +{ + unsigned int uIdx; + + // + // Fill the source memory buffer with a simple incrementing pattern. + // + for(uIdx = 0; uIdx < MEM_BUFFER_SIZE; uIdx++) + { + g_ui32SrcBuf[uIdx] = uIdx; + } + + // + // Enable interrupts from the uDMA software channel. + // + ROM_IntEnable(INT_UDMA); + + // + // Put the attributes in a known state for the uDMA software channel. + // These should already be disabled by default. + // + ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_SW, + UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT | + (UDMA_ATTR_HIGH_PRIORITY | + UDMA_ATTR_REQMASK)); + + // + // Configure the control parameters for the SW channel. The SW channel + // will be used to transfer between two memory buffers, 32 bits at a time. + // Therefore the data size is 32 bits, and the address increment is 32 bits + // for both source and destination. The arbitration size will be set to 8, + // which causes the uDMA controller to rearbitrate after 8 items are + // transferred. This keeps this channel from hogging the uDMA controller + // once the transfer is started, and allows other channels cycles if they + // are higher priority. + // + ROM_uDMAChannelControlSet(UDMA_CHANNEL_SW | UDMA_PRI_SELECT, + UDMA_SIZE_32 | UDMA_SRC_INC_32 | UDMA_DST_INC_32 | + UDMA_ARB_8); + + // + // Set up the transfer parameters for the software channel. This will + // configure the transfer buffers and the transfer size. Auto mode must be + // used for software transfers. + // + ROM_uDMAChannelTransferSet(UDMA_CHANNEL_SW | UDMA_PRI_SELECT, + UDMA_MODE_AUTO, g_ui32SrcBuf, g_ui32DstBuf, + MEM_BUFFER_SIZE); + + // + // Now the software channel is primed to start a transfer. The channel + // must be enabled. For software based transfers, a request must be + // issued. After this, the uDMA memory transfer begins. + // + ROM_uDMAChannelEnable(UDMA_CHANNEL_SW); + ROM_uDMAChannelRequest(UDMA_CHANNEL_SW); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This example demonstrates how to use the uDMA controller to transfer data +// between memory buffers and to and from a peripheral, in this case a UART. +// The uDMA controller is configured to repeatedly transfer a block of data +// from one memory buffer to another. It is also set up to repeatedly copy a +// block of data from a buffer to the UART output. The UART data is looped +// back so the same data is received, and the uDMA controlled is configured to +// continuously receive the UART data using ping-pong buffers. +// +// The processor is put to sleep when it is not doing anything, and this allows +// collection of CPU usage data to see how much CPU is being used while the +// data transfers are ongoing. +// +//***************************************************************************** +int +main(void) +{ + static uint32_t ui32PrevSeconds; + static uint32_t ui32PrevXferCount; + static uint32_t ui32PrevUARTCount = 0; + uint32_t ui32XfersCompleted; + uint32_t ui32BytesTransferred; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL at 50 MHz. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Enable peripherals to operate when CPU is in sleep. + // + ROM_SysCtlPeripheralClockGating(true); + + // + // Enable the GPIO port that is used for the on-board LED. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + + // + // Enable the GPIO pins for the LED (PF2). + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2); + + // + // Initialize the UART. + // + ConfigureUART(); + + UARTprintf("\033[2JuDMA Example\n"); + + // + // Show the clock frequency on the display. + // + UARTprintf("Tiva C Series @ %u MHz\n\n", ROM_SysCtlClockGet() / 1000000); + + // + // Show statistics headings. + // + UARTprintf("CPU Memory UART Remaining\n"); + UARTprintf("Usage Transfers Transfers Time\n"); + + // + // Configure SysTick to occur 100 times per second, to use as a time + // reference. Enable SysTick to generate interrupts. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Initialize the CPU usage measurement routine. + // + CPUUsageInit(ROM_SysCtlClockGet(), SYSTICKS_PER_SECOND, 2); + + // + // Enable the uDMA controller at the system level. Enable it to continue + // to run while the processor is in sleep. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); + ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UDMA); + + // + // Enable the uDMA controller error interrupt. This interrupt will occur + // if there is a bus error during a transfer. + // + ROM_IntEnable(INT_UDMAERR); + + // + // Enable the uDMA controller. + // + ROM_uDMAEnable(); + + // + // Point at the control table to use for channel control structures. + // + ROM_uDMAControlBaseSet(ui8ControlTable); + + // + // Initialize the uDMA memory to memory transfers. + // + InitSWTransfer(); + + // + // Initialize the uDMA UART transfers. + // + InitUART1Transfer(); + + // + // Remember the current SysTick seconds count. + // + ui32PrevSeconds = g_ui32Seconds; + + // + // Remember the current count of memory buffer transfers. + // + ui32PrevXferCount = g_ui32MemXferCount; + + // + // Loop until the button is pressed. The processor is put to sleep + // in this loop so that CPU utilization can be measured. + // + while(1) + { + // + // Check to see if one second has elapsed. If so, the make some + // updates. + // + if(g_ui32Seconds != ui32PrevSeconds) + { + // + // Turn on the LED as a heartbeat + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); + + // + // Print a message to the display showing the CPU usage percent. + // The fractional part of the percent value is ignored. + // + UARTprintf("\r%3d%% ", g_ui32CPUUsage >> 16); + + // + // Remember the new seconds count. + // + ui32PrevSeconds = g_ui32Seconds; + + // + // Calculate how many memory transfers have occurred since the last + // second. + // + ui32XfersCompleted = g_ui32MemXferCount - ui32PrevXferCount; + + // + // Remember the new transfer count. + // + ui32PrevXferCount = g_ui32MemXferCount; + + // + // Compute how many bytes were transferred in the memory transfer + // since the last second. + // + ui32BytesTransferred = ui32XfersCompleted * MEM_BUFFER_SIZE * 4; + + // + // Print a message showing the memory transfer rate. + // + if(ui32BytesTransferred >= 100000000) + { + UARTprintf("%3d MB/s ", ui32BytesTransferred / 1000000); + } + else if(ui32BytesTransferred >= 10000000) + { + UARTprintf("%2d.%01d MB/s ", ui32BytesTransferred / 1000000, + (ui32BytesTransferred % 1000000) / 100000); + } + else if(ui32BytesTransferred >= 1000000) + { + UARTprintf("%1d.%02d MB/s ", ui32BytesTransferred / 1000000, + (ui32BytesTransferred % 1000000) / 10000); + } + else if(ui32BytesTransferred >= 100000) + { + UARTprintf("%3d KB/s ", ui32BytesTransferred / 1000); + } + else if(ui32BytesTransferred >= 10000) + { + UARTprintf("%2d.%01d KB/s ", ui32BytesTransferred / 1000, + (ui32BytesTransferred % 1000) / 100); + } + else if(ui32BytesTransferred >= 1000) + { + UARTprintf("%1d.%02d KB/s ", ui32BytesTransferred / 1000, + (ui32BytesTransferred % 1000) / 10); + } + else if(ui32BytesTransferred >= 100) + { + UARTprintf("%3d B/s ", ui32BytesTransferred); + } + else if(ui32BytesTransferred >= 10) + { + UARTprintf("%2d B/s ", ui32BytesTransferred); + } + else + { + UARTprintf("%1d B/s ", ui32BytesTransferred); + } + + // + // Calculate how many UART transfers have occurred since the last + // second. + // + ui32XfersCompleted = (g_ui32RxBufACount + g_ui32RxBufBCount - + ui32PrevUARTCount); + + // + // Remember the new UART transfer count. + // + ui32PrevUARTCount = g_ui32RxBufACount + g_ui32RxBufBCount; + + // + // Compute how many bytes were transferred by the UART. The number + // of bytes received is multiplied by 2 so that the TX bytes + // transferred are also accounted for. + // + ui32BytesTransferred = ui32XfersCompleted * UART_RXBUF_SIZE * 2; + + // + // Print a message showing the UART transfer rate. + // + if(ui32BytesTransferred >= 1000000) + { + UARTprintf("%1d.%02d MB/s ", ui32BytesTransferred / 1000000, + (ui32BytesTransferred % 1000000) / 10000); + } + else if(ui32BytesTransferred >= 100000) + { + UARTprintf("%3d KB/s ", ui32BytesTransferred / 1000); + } + else if(ui32BytesTransferred >= 10000) + { + UARTprintf("%2d.%01d KB/s ", ui32BytesTransferred / 1000, + (ui32BytesTransferred % 1000) / 100); + } + else if(ui32BytesTransferred >= 1000) + { + UARTprintf("%1d.%02d KB/s ", ui32BytesTransferred / 1000, + (ui32BytesTransferred % 1000) / 10); + } + else if(ui32BytesTransferred >= 100) + { + UARTprintf("%3d B/s ", ui32BytesTransferred); + } + else if(ui32BytesTransferred >= 10) + { + UARTprintf("%2d B/s ", ui32BytesTransferred); + } + else + { + UARTprintf("%1d B/s ", ui32BytesTransferred); + } + + // + // Print a spinning line to make it more apparent that there is + // something happening. + // + UARTprintf("%2ds", 10 - ui32PrevSeconds); + + // + // Turn off the LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); + } + + // + // Put the processor to sleep if there is nothing to do. This allows + // the CPU usage routine to measure the number of free CPU cycles. + // If the processor is sleeping a lot, it can be hard to connect to + // the target with the debugger. + // + ROM_SysCtlSleep(); + + // + // See if we have run int32_t enough and exit the loop if so. + // + if(g_ui32Seconds >= 10) + { + break; + } + } + + // + // Indicate on the display that the example is stopped. + // + UARTprintf("\nStopped\n"); + + // + // Loop forever with the CPU not sleeping, so the debugger can connect. + // + while(1) + { + // + // Turn on the GREEN LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); + + // + // Delay for a bit. + // + SysCtlDelay(SysCtlClockGet() / 20 / 3); + + // + // Turn off the GREEN LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); + + // + // Delay for a bit. + // + SysCtlDelay(SysCtlClockGet() / 20 / 3); + + } +} diff --git a/boards/ek-tm4c123gxl/udma_demo/udma_demo.ewd b/boards/ek-tm4c123gxl/udma_demo/udma_demo.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/udma_demo.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/udma_demo/udma_demo.ewp b/boards/ek-tm4c123gxl/udma_demo/udma_demo.ewp new file mode 100644 index 0000000..211faf1 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/udma_demo.ewp @@ -0,0 +1,793 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + + Source + + $PROJ_DIR$\..\..\..\..\utils\cpu_usage.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\udma_demo.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-tm4c123gxl/udma_demo/udma_demo.icf b/boards/ek-tm4c123gxl/udma_demo/udma_demo.icf new file mode 100644 index 0000000..b694105 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/udma_demo.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// udma_demo.icf - Linker configuration file for udma_demo. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/udma_demo/udma_demo.ld b/boards/ek-tm4c123gxl/udma_demo/udma_demo.ld new file mode 100644 index 0000000..7090a23 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/udma_demo.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * udma_demo.ld - Linker configuration file for udma_demo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/udma_demo/udma_demo.sct b/boards/ek-tm4c123gxl/udma_demo/udma_demo.sct new file mode 100644 index 0000000..d20b9de --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/udma_demo.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; udma_demo.sct - Linker configuration file for udma_demo. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/udma_demo/udma_demo.uvopt b/boards/ek-tm4c123gxl/udma_demo/udma_demo.uvopt new file mode 100644 index 0000000..5947cc1 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/udma_demo.uvopt @@ -0,0 +1,331 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + udma_demo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\cpu_usage.c + cpu_usage.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\udma_demo.c + udma_demo.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 7 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/udma_demo/udma_demo.uvproj b/boards/ek-tm4c123gxl/udma_demo/udma_demo.uvproj new file mode 100644 index 0000000..afe2469 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/udma_demo.uvproj @@ -0,0 +1,439 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + udma_demo + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + udma_demo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\udma_demo.bin .\rvmdk\udma_demo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + udma_demo.sct + + + --entry Reset_Handler + + + + + + + + Source + + + cpu_usage.c + 1 + ..\..\..\..\utils\cpu_usage.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + udma_demo.c + 1 + .\udma_demo.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/udma_demo/udma_demo_ccs.cmd b/boards/ek-tm4c123gxl/udma_demo/udma_demo_ccs.cmd new file mode 100644 index 0000000..33ec7a8 --- /dev/null +++ b/boards/ek-tm4c123gxl/udma_demo/udma_demo_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * udma_demo_ccs.cmd - CCS linker configuration file for udma_demo. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/Makefile b/boards/ek-tm4c123gxl/usb_dev_bulk/Makefile new file mode 100644 index 0000000..93eb252 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/Makefile @@ -0,0 +1,89 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device bulk example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH= +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=../../../.. + +# +# The default rule, which causes the USB device bulk example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_bulk.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device bulk example. +# +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/usb_bulk_structs.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/usb_dev_bulk.o +${COMPILER}/usb_dev_bulk.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_dev_bulk.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_bulk.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_bulk.axf: usb_dev_bulk.ld +SCATTERgcc_usb_dev_bulk=usb_dev_bulk.ld +ENTRY_usb_dev_bulk=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.ccsimportspec new file mode 100644 index 0000000..6c9f4a0 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.ccsproject b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.cproject b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.cproject new file mode 100644 index 0000000..2784dba --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.project b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.project new file mode 100644 index 0000000..cdb8cce --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.project @@ -0,0 +1,65 @@ + + + usb_dev_bulk + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_bulk/startup_ccs.c + + + usb_bulk_structs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_bulk/usb_bulk_structs.c + + + usb_dev_bulk.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.c + + + usb_dev_bulk_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk_ccs.cmd + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin new file mode 100644 index 0000000..9bb4536 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/Debug/usb_dev_bulk.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out new file mode 100644 index 0000000..0c7274b Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/Debug/usb_dev_bulk.out differ diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin b/boards/ek-tm4c123gxl/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin new file mode 100644 index 0000000..f3d4e3b Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out b/boards/ek-tm4c123gxl/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out new file mode 100644 index 0000000..75bdd35 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_bulk/ewarm/Exe/usb_dev_bulk.out differ diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/gcc/usb_dev_bulk.axf b/boards/ek-tm4c123gxl/usb_dev_bulk/gcc/usb_dev_bulk.axf new file mode 100644 index 0000000..cef67c2 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_bulk/gcc/usb_dev_bulk.axf differ diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/gcc/usb_dev_bulk.bin b/boards/ek-tm4c123gxl/usb_dev_bulk/gcc/usb_dev_bulk.bin new file mode 100644 index 0000000..f81c2bc Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_bulk/gcc/usb_dev_bulk.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/readme.txt b/boards/ek-tm4c123gxl/usb_dev_bulk/readme.txt new file mode 100644 index 0000000..70eaf78 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/readme.txt @@ -0,0 +1,43 @@ +USB Generic Bulk Device + +This example provides a generic USB device offering simple bulk data +transfer to and from the host. The device uses a vendor-specific class ID +and supports a single bulk IN endpoint and a single bulk OUT endpoint. +Data received from the host is assumed to be ASCII text and it is +echoed back with the case of all alphabetic characters swapped. + +A Windows INF file for the device is provided on the installation CD and +in the C:/ti/TivaWare-for-C-Series/windows_drivers directory of TivaWare C +series releases. This INF contains information required to install the +WinUSB subsystem on Windowi16XP and Vista PCs. WinUSB is a Windows +subsystem allowing user mode applications to access the USB device without +the need for a vendor-specific kernel mode driver. + +A sample Windows command-line application, usb_bulk_example, illustrating +how to connect to and communicate with the bulk device is also provided. +The application binary is installed as part of the ''Windows-side examples +for USB kits'' package (SW-USB-win) on the installation CD or via download +from http://www.ti.com/tivaware . Project files are included to allow +the examples to be built using Microsoft VisualStudio 2008. Source code +for this application can be found in directory +TivaWare-for-C-Series/tools/usb_bulk_example. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/rvmdk/usb_dev_bulk.axf b/boards/ek-tm4c123gxl/usb_dev_bulk/rvmdk/usb_dev_bulk.axf new file mode 100644 index 0000000..43a7993 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_bulk/rvmdk/usb_dev_bulk.axf differ diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/rvmdk/usb_dev_bulk.bin b/boards/ek-tm4c123gxl/usb_dev_bulk/rvmdk/usb_dev_bulk.bin new file mode 100644 index 0000000..01e0587 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_bulk/rvmdk/usb_dev_bulk.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/startup_ccs.c b/boards/ek-tm4c123gxl/usb_dev_bulk/startup_ccs.c new file mode 100644 index 0000000..3f144d9 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/startup_ewarm.c b/boards/ek-tm4c123gxl/usb_dev_bulk/startup_ewarm.c new file mode 100644 index 0000000..ca74b82 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/startup_gcc.c b/boards/ek-tm4c123gxl/usb_dev_bulk/startup_gcc.c new file mode 100644 index 0000000..76cbf3d --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/startup_rvmdk.S b/boards/ek-tm4c123gxl/usb_dev_bulk/startup_rvmdk.S new file mode 100644 index 0000000..64b5f90 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN UARTStdioIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTStdioIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/usb_bulk_structs.c b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_bulk_structs.c new file mode 100644 index 0000000..2498297 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_bulk_structs.c @@ -0,0 +1,200 @@ +//***************************************************************************** +// +// usb_bulk_structs.c - Data structures defining this bulk USB device. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdbulk.h" +#include "usb_bulk_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'G', 0, 'e', 0, 'n', 0, 'e', 0, 'r', 0, 'i', 0, 'c', 0, ' ', 0, 'B', 0, + 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, + 'e', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The data interface description string. +// +//***************************************************************************** +const uint8_t g_pui8DataInterfaceString[] = +{ + (19 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, + 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (23 + 1) * 2, + USB_DTYPE_STRING, + 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0, + 'a', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, 'i', 0, 'g', 0, + 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8DataInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The bulk device initialization and customization structures. In this case, +// we are using USBBuffers between the bulk device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the bulk channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our bulk instance structure. +// +//***************************************************************************** +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; + +tUSBDBulkDevice g_sBulkDevice = +{ + USB_VID_TI_1CBE, + USB_PID_BULK, + 500, + USB_CONF_ATTR_SELF_PWR, + USBBufferEventCallback, + (void *)&g_sRxBuffer, + USBBufferEventCallback, + (void *)&g_sTxBuffer, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; + +//***************************************************************************** +// +// Receive buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBRxBuffer[BULK_BUFFER_SIZE]; +uint8_t g_pui8RxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sRxBuffer = +{ + false, // This is a receive buffer. + RxHandler, // pfnCallback + (void *)&g_sBulkDevice, // Callback data is our device pointer. + USBDBulkPacketRead, // pfnTransfer + USBDBulkRxPacketAvailable, // pfnAvailable + (void *)&g_sBulkDevice, // pvHandle + g_pui8USBRxBuffer, // pi8Buffer + BULK_BUFFER_SIZE, // ui32BufferSize + g_pui8RxBufferWorkspace // pvWorkspace +}; + +//***************************************************************************** +// +// Transmit buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBTxBuffer[BULK_BUFFER_SIZE]; +uint8_t g_pui8TxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sTxBuffer = +{ + true, // This is a transmit buffer. + TxHandler, // pfnCallback + (void *)&g_sBulkDevice, // Callback data is our device pointer. + USBDBulkPacketWrite, // pfnTransfer + USBDBulkTxPacketAvailable, // pfnAvailable + (void *)&g_sBulkDevice, // pvHandle + g_pui8USBTxBuffer, // pi8Buffer + BULK_BUFFER_SIZE, // ui32BufferSize + g_pui8TxBufferWorkspace // pvWorkspace +}; diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/usb_bulk_structs.h b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_bulk_structs.h new file mode 100644 index 0000000..db5b1f6 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_bulk_structs.h @@ -0,0 +1,48 @@ +//***************************************************************************** +// +// usb_bulk_structs.h - Data structures defining this bulk USB device. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_BULK_STRUCTS_H_ +#define _USB_BULK_STRUCTS_H_ + +//***************************************************************************** +// +// The size of the transmit and receive buffers used. 256 is chosen pretty +// much at random though the buffer should be at least twice the size of +// a maximum-sized USB packet. +// +//***************************************************************************** +#define BULK_BUFFER_SIZE 256 + +extern uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +extern uint32_t TxHandler(void *pvi32CBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; +extern tUSBDBulkDevice g_sBulkDevice; +extern uint8_t g_pui8USBTxBuffer[]; +extern uint8_t g_pui8USBRxBuffer[]; + +#endif diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.c b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.c new file mode 100644 index 0000000..e532888 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.c @@ -0,0 +1,644 @@ +//***************************************************************************** +// +// usb_dev_bulk.c - Main routines for the generic bulk device example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/timer.h" +#include "driverlib/uart.h" +#include "driverlib/rom.h" +#include "usblib/usblib.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdbulk.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "usb_bulk_structs.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Generic Bulk Device (usb_dev_bulk)

      +//! +//! This example provides a generic USB device offering simple bulk data +//! transfer to and from the host. The device uses a vendor-specific class ID +//! and supports a single bulk IN endpoint and a single bulk OUT endpoint. +//! Data received from the host is assumed to be ASCII text and it is +//! echoed back with the case of all alphabetic characters swapped. +//! +//! A Windows INF file for the device is provided on the installation CD and +//! in the C:/ti/TivaWare-for-C-Series/windows_drivers directory of TivaWare C +//! series releases. This INF contains information required to install the +//! WinUSB subsystem on Windowi16XP and Vista PCs. WinUSB is a Windows +//! subsystem allowing user mode applications to access the USB device without +//! the need for a vendor-specific kernel mode driver. +//! +//! A sample Windows command-line application, usb_bulk_example, illustrating +//! how to connect to and communicate with the bulk device is also provided. +//! The application binary is installed as part of the ''Windows-side examples +//! for USB kits'' package (SW-USB-win) on the installation CD or via download +//! from http://www.ti.com/tivaware . Project files are included to allow +//! the examples to be built using Microsoft VisualStudio 2008. Source code +//! for this application can be found in directory +//! TivaWare-for-C-Series/tools/usb_bulk_example. +// +//***************************************************************************** + +//***************************************************************************** +// +// The system tick rate expressed both as ticks per second and a millisecond +// period. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 +#define SYSTICK_PERIOD_MS (1000 / SYSTICKS_PER_SECOND) + +//***************************************************************************** +// +// The global system tick counter. +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount = 0; + +//***************************************************************************** +// +// Variables tracking transmit and receive counts. +// +//***************************************************************************** +volatile uint32_t g_ui32TxCount = 0; +volatile uint32_t g_ui32RxCount = 0; +#ifdef DEBUG +uint32_t g_ui32UARTRxErrors = 0; +#endif + +//***************************************************************************** +// +// Debug-related definitions and declarations. +// +// Debug output is available via UART0 if DEBUG is defined during build. +// +//***************************************************************************** +#ifdef DEBUG +//***************************************************************************** +// +// Map all debug print calls to UARTprintf in debug builds. +// +//***************************************************************************** +#define DEBUG_PRINT UARTprintf + +#else + +//***************************************************************************** +// +// Compile out all debug print calls in release builds. +// +//***************************************************************************** +#define DEBUG_PRINT while(0) ((int (*)(char *, ...))0) +#endif + +//***************************************************************************** +// +// Flags used to pass commands from interrupt context to the main loop. +// +//***************************************************************************** +#define COMMAND_PACKET_RECEIVED 0x00000001 +#define COMMAND_STATUS_UPDATE 0x00000002 + +volatile uint32_t g_ui32Flags = 0; + +//***************************************************************************** +// +// Global flag indicating that a USB configuration has been set. +// +//***************************************************************************** +static volatile bool g_bUSBConfigured = false; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + UARTprintf("Error at line %d of %s\n", ui32Line, pcFilename); + while(1) + { + } +} +#endif + +//***************************************************************************** +// +// Interrupt handler for the system tick counter. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Update our system tick counter. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// Receive new data and echo it back to the host. +// +// \param psDevice points to the instance data for the device whose data is to +// be processed. +// \param pui8Data points to the newly received data in the USB receive buffer. +// \param ui32NumBytes is the number of bytes of data available to be processed. +// +// This function is called whenever we receive a notification that data is +// available from the host. We read the data, byte-by-byte and swap the case +// of any alphabetical characters found then write it back out to be +// transmitted back to the host. +// +// \return Returns the number of bytes of data processed. +// +//***************************************************************************** +static uint32_t +EchoNewDataToHost(tUSBDBulkDevice *psDevice, uint8_t *pui8Data, + uint32_t ui32NumBytes) +{ + uint32_t ui32Loop, ui32Space, ui32Count; + uint32_t ui32ReadIndex; + uint32_t ui32WriteIndex; + tUSBRingBufObject sTxRing; + + // + // Get the current buffer information to allow us to write directly to + // the transmit buffer (we already have enough information from the + // parameters to access the receive buffer directly). + // + USBBufferInfoGet(&g_sTxBuffer, &sTxRing); + + // + // How much space is there in the transmit buffer? + // + ui32Space = USBBufferSpaceAvailable(&g_sTxBuffer); + + // + // How many characters can we process this time round? + // + ui32Loop = (ui32Space < ui32NumBytes) ? ui32Space : ui32NumBytes; + ui32Count = ui32Loop; + + // + // Update our receive counter. + // + g_ui32RxCount += ui32NumBytes; + + // + // Dump a debug message. + // + DEBUG_PRINT("Received %d bytes\n", ui32NumBytes); + + // + // Set up to process the characters by directly accessing the USB buffers. + // + ui32ReadIndex = (uint32_t)(pui8Data - g_pui8USBRxBuffer); + ui32WriteIndex = sTxRing.ui32WriteIndex; + + while(ui32Loop) + { + // + // Copy from the receive buffer to the transmit buffer converting + // character case on the way. + // + + // + // Is this a lower case character? + // + if((g_pui8USBRxBuffer[ui32ReadIndex] >= 'a') && + (g_pui8USBRxBuffer[ui32ReadIndex] <= 'z')) + { + // + // Convert to upper case and write to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + (g_pui8USBRxBuffer[ui32ReadIndex] - 'a') + 'A'; + } + else + { + // + // Is this an upper case character? + // + if((g_pui8USBRxBuffer[ui32ReadIndex] >= 'A') && + (g_pui8USBRxBuffer[ui32ReadIndex] <= 'Z')) + { + // + // Convert to lower case and write to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + (g_pui8USBRxBuffer[ui32ReadIndex] - 'Z') + 'z'; + } + else + { + // + // Copy the received character to the transmit buffer. + // + g_pui8USBTxBuffer[ui32WriteIndex] = + g_pui8USBRxBuffer[ui32ReadIndex]; + } + } + + // + // Move to the next character taking care to adjust the pointer for + // the buffer wrap if necessary. + // + ui32WriteIndex++; + ui32WriteIndex = (ui32WriteIndex == BULK_BUFFER_SIZE) ? + 0 : ui32WriteIndex; + + ui32ReadIndex++; + ui32ReadIndex = (ui32ReadIndex == BULK_BUFFER_SIZE) ? + 0 : ui32ReadIndex; + + ui32Loop--; + } + + // + // We've processed the data in place so now send the processed data + // back to the host. + // + USBBufferDataWritten(&g_sTxBuffer, ui32Count); + + DEBUG_PRINT("Wrote %d bytes\n", ui32Count); + + // + // We processed as much data as we can directly from the receive buffer so + // we need to return the number of bytes to allow the lower layer to + // update its read pointer appropriately. + // + return(ui32Count); +} + +//***************************************************************************** +// +// Handles bulk driver notifications related to the transmit channel (data to +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // We are not required to do anything in response to any transmit event + // in this example. All we do is update our transmit counter. + // + if(ui32Event == USB_EVENT_TX_COMPLETE) + { + g_ui32TxCount += ui32MsgValue; + } + + // + // Dump a debug message. + // + DEBUG_PRINT("TX complete %d\n", ui32MsgValue); + + return(0); +} + +//***************************************************************************** +// +// Handles bulk driver notifications related to the receive channel (data from +// the USB host). +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the bulk driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData) +{ + // + // Which event are we being sent? + // + switch(ui32Event) + { + // + // We are connected to a host and communication is now possible. + // + case USB_EVENT_CONNECTED: + { + g_bUSBConfigured = true; + UARTprintf("Host connected.\n"); + + // + // Flush our buffers. + // + USBBufferFlush(&g_sTxBuffer); + USBBufferFlush(&g_sRxBuffer); + + break; + } + + // + // The host has disconnected. + // + case USB_EVENT_DISCONNECTED: + { + g_bUSBConfigured = false; + UARTprintf("Host disconnected.\n"); + break; + } + + // + // A new packet has been received. + // + case USB_EVENT_RX_AVAILABLE: + { + tUSBDBulkDevice *psDevice; + + // + // Get a pointer to our instance data from the callback data + // parameter. + // + psDevice = (tUSBDBulkDevice *)pvCBData; + + // + // Read the new packet and echo it back to the host. + // + return(EchoNewDataToHost(psDevice, pvMsgData, ui32MsgValue)); + } + + // + // Ignore SUSPEND and RESUME for now. + // + case USB_EVENT_SUSPEND: + case USB_EVENT_RESUME: + { + break; + } + + // + // Ignore all other events and return 0. + // + default: + { + break; + } + } + + return(0); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// This is the main application entry function. +// +//***************************************************************************** +int +main(void) +{ + volatile uint32_t ui32Loop; + uint32_t ui32TxCount; + uint32_t ui32RxCount; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL at 50MHz + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Enable the GPIO port that is used for the on-board LED. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + + // + // Enable the GPIO pins for the LED (PF2 & PF3). + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3 | GPIO_PIN_2); + + // + // Open UART0 and show the application name on the UART. + // + ConfigureUART(); + + UARTprintf("\033[2JTiva C Series USB bulk device example\n"); + UARTprintf("---------------------------------\n\n"); + + // + // Not configured initially. + // + g_bUSBConfigured = false; + + // + // Enable the GPIO peripheral used for USB, and configure the USB + // pins. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5); + + // + // Enable the system tick. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Tell the user what we are up to. + // + UARTprintf("Configuring USB\n"); + + // + // Initialize the transmit and receive buffers. + // + USBBufferInit(&g_sTxBuffer); + USBBufferInit(&g_sRxBuffer); + + // + // Set the USB stack mode to Device mode with VBUS monitoring. + // + USBStackModeSet(0, eUSBModeForceDevice, 0); + + // + // Pass our device information to the USB library and place the device + // on the bus. + // + USBDBulkInit(0, &g_sBulkDevice); + + // + // Wait for initial configuration to complete. + // + UARTprintf("Waiting for host...\n"); + + // + // Clear our local byte counters. + // + ui32RxCount = 0; + ui32TxCount = 0; + + // + // Main application loop. + // + while(1) + { + // + // See if any data has been transferred. + // + if((ui32TxCount != g_ui32TxCount) || (ui32RxCount != g_ui32RxCount)) + { + // + // Has there been any transmit traffic since we last checked? + // + if(ui32TxCount != g_ui32TxCount) + { + // + // Turn on the Green LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3); + + // + // Delay for a bit. + // + for(ui32Loop = 0; ui32Loop < 150000; ui32Loop++) + { + } + + // + // Turn off the Green LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0); + + // + // Take a snapshot of the latest transmit count. + // + ui32TxCount = g_ui32TxCount; + } + + // + // Has there been any receive traffic since we last checked? + // + if(ui32RxCount != g_ui32RxCount) + { + // + // Turn on the Blue LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); + + // + // Delay for a bit. + // + for(ui32Loop = 0; ui32Loop < 150000; ui32Loop++) + { + } + + // + // Turn off the Blue LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); + + // + // Take a snapshot of the latest receive count. + // + ui32RxCount = g_ui32RxCount; + } + + // + // Update the display of bytes transferred. + // + UARTprintf("\rTx: %d Rx: %d", ui32TxCount, ui32RxCount); + } + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ewd b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ewp b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ewp new file mode 100644 index 0000000..883eeaf --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ewp @@ -0,0 +1,797 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_bulk_structs.c + + + $PROJ_DIR$\usb_dev_bulk.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.icf b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.icf new file mode 100644 index 0000000..0630e78 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_bulk.icf - Linker configuration file for usb_dev_bulk. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ld b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ld new file mode 100644 index 0000000..28e8466 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_bulk.ld - Linker configuration file for usb_dev_bulk. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.sct b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.sct new file mode 100644 index 0000000..1bc1896 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_bulk.sct - Linker configuration file for usb_dev_bulk. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.uvopt b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.uvopt new file mode 100644 index 0000000..abc827b --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_bulk + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_bulk_structs.c + usb_bulk_structs.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_bulk.c + usb_dev_bulk.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.uvproj b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.uvproj new file mode 100644 index 0000000..721e894 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_bulk + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_bulk + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_bulk.bin .\rvmdk\usb_dev_bulk.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 UART_BUFFERED + + ..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_bulk.sct + + + --entry Reset_Handler + + + + + + + + Source + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_bulk_structs.c + 1 + .\usb_bulk_structs.c + + + usb_dev_bulk.c + 1 + .\usb_dev_bulk.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk_ccs.cmd b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk_ccs.cmd new file mode 100644 index 0000000..f0ba0c7 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_bulk/usb_dev_bulk_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_bulk_ccs.cmd - CCS linker configuration file for usb_dev_bulk. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/Makefile b/boards/ek-tm4c123gxl/usb_dev_gamepad/Makefile new file mode 100644 index 0000000..000763b --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/Makefile @@ -0,0 +1,90 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device gamepad example. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device gamepad example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_gamepad.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device gamepad example. +# +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/buttons.o +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/usb_dev_gamepad.o +${COMPILER}/usb_dev_gamepad.axf: ${COMPILER}/usb_gamepad_structs.o +${COMPILER}/usb_dev_gamepad.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_gamepad.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_gamepad.axf: usb_dev_gamepad.ld +SCATTERgcc_usb_dev_gamepad=usb_dev_gamepad.ld +ENTRY_usb_dev_gamepad=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RA1 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.ccsimportspec new file mode 100644 index 0000000..0228898 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.ccsproject b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.cproject b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.cproject new file mode 100644 index 0000000..d93aed1 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.cproject @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.project b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.project new file mode 100644 index 0000000..483ee7c --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.project @@ -0,0 +1,65 @@ + + + usb_dev_gamepad + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_ccs.c + + + usb_dev_gamepad.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.c + + + usb_dev_gamepad_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad_ccs.cmd + + + usb_gamepad_structs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_gamepad_structs.c + + + drivers/buttons.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/drivers/buttons.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.bin b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.bin new file mode 100644 index 0000000..33658d5 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.out b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.out new file mode 100644 index 0000000..86a83fc Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/Debug/usb_dev_gamepad.out differ diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.bin b/boards/ek-tm4c123gxl/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.bin new file mode 100644 index 0000000..893ad9c Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.out b/boards/ek-tm4c123gxl/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.out new file mode 100644 index 0000000..3e97194 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_gamepad/ewarm/Exe/usb_dev_gamepad.out differ diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/gcc/usb_dev_gamepad.axf b/boards/ek-tm4c123gxl/usb_dev_gamepad/gcc/usb_dev_gamepad.axf new file mode 100644 index 0000000..0b02e94 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_gamepad/gcc/usb_dev_gamepad.axf differ diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/gcc/usb_dev_gamepad.bin b/boards/ek-tm4c123gxl/usb_dev_gamepad/gcc/usb_dev_gamepad.bin new file mode 100644 index 0000000..ae9ea06 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_gamepad/gcc/usb_dev_gamepad.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/readme.txt b/boards/ek-tm4c123gxl/usb_dev_gamepad/readme.txt new file mode 100644 index 0000000..dd35e88 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/readme.txt @@ -0,0 +1,31 @@ +USB HID Gamepad Device + +This example application turns the evaluation board into USB game pad +device using the Human Interface Device gamepad class. The buttons on the +board are reported as buttons 1 and 2. The X, Y, and Z coordinates are +reported using the ADC input on GPIO port E pins 1, 2, and 3. The X input +is on PE3, the Y input is on PE2 and the Z input is on PE1. These are +not connected to any real input so the values simply read whatever is on +the pins. To get valid values the pins should have voltage that range +from VDDA(3V) to 0V. The blue LED on PF5 is used to indicate gamepad +activity to the host and blinks when there is USB bus activity. + +------------------------------------------------------------------------------- + +Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/rvmdk/usb_dev_gamepad.axf b/boards/ek-tm4c123gxl/usb_dev_gamepad/rvmdk/usb_dev_gamepad.axf new file mode 100644 index 0000000..ccb05d1 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_gamepad/rvmdk/usb_dev_gamepad.axf differ diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/rvmdk/usb_dev_gamepad.bin b/boards/ek-tm4c123gxl/usb_dev_gamepad/rvmdk/usb_dev_gamepad.bin new file mode 100644 index 0000000..d082e40 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_gamepad/rvmdk/usb_dev_gamepad.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_ccs.c b/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_ccs.c new file mode 100644 index 0000000..68a8758 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_ccs.c @@ -0,0 +1,303 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_ewarm.c b/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_ewarm.c new file mode 100644 index 0000000..7bb738f --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_ewarm.c @@ -0,0 +1,334 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_gcc.c b/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_gcc.c new file mode 100644 index 0000000..a3e1d59 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_gcc.c @@ -0,0 +1,350 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void UARTStdioIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + IntDefaultHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + UARTStdioIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_rvmdk.S b/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_rvmdk.S new file mode 100644 index 0000000..56c7f44 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/startup_rvmdk.S @@ -0,0 +1,359 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN UARTStdioIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD IntDefaultHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD UARTStdioIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.c b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.c new file mode 100644 index 0000000..ff90f51 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.c @@ -0,0 +1,552 @@ +//***************************************************************************** +// +// usb_dev_gamepad.c - Main routines for the gamepad example. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_gpio.h" +#include "inc/hw_sysctl.h" +#include "driverlib/adc.h" +#include "driverlib/debug.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/uart.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidgamepad.h" +#include "usb_gamepad_structs.h" +#include "drivers/buttons.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB HID Gamepad Device (usb_dev_gamepad)

      +//! +//! This example application turns the evaluation board into USB game pad +//! device using the Human Interface Device gamepad class. The buttons on the +//! board are reported as buttons 1 and 2. The X, Y, and Z coordinates are +//! reported using the ADC input on GPIO port E pins 1, 2, and 3. The X input +//! is on PE3, the Y input is on PE2 and the Z input is on PE1. These are +//! not connected to any real input so the values simply read whatever is on +//! the pins. To get valid values the pins should have voltage that range +//! from VDDA(3V) to 0V. The blue LED on PF5 is used to indicate gamepad +//! activity to the host and blinks when there is USB bus activity. +// +//***************************************************************************** + +//***************************************************************************** +// +// The HID gamepad report that is returned to the host. +// +//***************************************************************************** +static tGamepadReport sReport; + +//***************************************************************************** +// +// The HID gamepad polled ADC data for the X/Y/Z coordinates. +// +//***************************************************************************** +static uint32_t g_pui32ADCData[3]; + +//***************************************************************************** +// +// An activity counter to slow the LED blink down to a visible rate. +// +//***************************************************************************** +static uint32_t g_ui32Updates; + +//***************************************************************************** +// +// This enumeration holds the various states that the gamepad can be in during +// normal operation. +// +//***************************************************************************** +volatile enum +{ + // + // Not yet configured. + // + eStateNotConfigured, + + // + // Connected and not waiting on data to be sent. + // + eStateIdle, + + // + // Suspended. + // + eStateSuspend, + + // + // Connected and waiting on data to be sent out. + // + eStateSending +} +g_iGamepadState; + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ +} +#endif + +//***************************************************************************** +// +// Macro used to convert the 12-bit unsigned values to an eight bit signed +// value returned in the HID report. This maps the values from the ADC that +// range from 0 to 2047 over to 127 to -128. +// +//***************************************************************************** +#define Convert8Bit(ui32Value) ((int8_t)((0x7ff - ui32Value) >> 4)) + +//***************************************************************************** +// +// Handles asynchronous events from the HID gamepad driver. +// +// \param pvCBData is the event callback pointer provided during +// USBDHIDGamepadInit(). This is a pointer to our gamepad device structure +// (&g_sGamepadDevice). +// \param ui32Event identifies the event we are being called back for. +// \param ui32MsgData is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the HID gamepad driver to inform the application +// of particular asynchronous events related to operation of the gamepad HID +// device. +// +// \return Returns 0 in all cases. +// +//***************************************************************************** +uint32_t +GamepadHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgData, + void *pvMsgData) +{ + switch (ui32Event) + { + // + // The host has connected to us and configured the device. + // + case USB_EVENT_CONNECTED: + { + g_iGamepadState = eStateIdle; + + // + // Update the status. + // + UARTprintf("\nHost Connected...\n"); + + break; + } + + // + // The host has disconnected from us. + // + case USB_EVENT_DISCONNECTED: + { + g_iGamepadState = eStateNotConfigured; + + // + // Update the status. + // + UARTprintf("\nHost Disconnected...\n"); + + break; + } + + // + // This event occurs every time the host acknowledges transmission + // of a report. It is to return to the idle state so that a new report + // can be sent to the host. + // + case USB_EVENT_TX_COMPLETE: + { + // + // Enter the idle state since we finished sending something. + // + g_iGamepadState = eStateIdle; + + ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); + + break; + } + + // + // This event indicates that the host has suspended the USB bus. + // + case USB_EVENT_SUSPEND: + { + // + // Go to the suspended state. + // + g_iGamepadState = eStateSuspend; + + // + // Suspended. + // + UARTprintf("\nBus Suspended\n"); + + ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); + + break; + } + + // + // This event signals that the host has resumed signaling on the bus. + // + case USB_EVENT_RESUME: + { + // + // Go back to the idle state. + // + g_iGamepadState = eStateIdle; + + // + // Resume signaled. + // + UARTprintf("\nBus Resume\n"); + + break; + } + + // + // Return the pointer to the current report. This call is + // rarely if ever made, but is required by the USB HID + // specification. + // + case USBD_HID_EVENT_GET_REPORT: + { + *(void **)pvMsgData = (void *)&sReport; + + break; + } + + // + // We ignore all other events. + // + default: + { + break; + } + } + + return(0); +} + +//***************************************************************************** +// +// Configure the UART and its pins. This must be called before UARTprintf(). +// +//***************************************************************************** +void +ConfigureUART(void) +{ + // + // Enable the GPIO Peripheral used by the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Enable UART0 + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + // + // Configure GPIO Pins for UART mode. + // + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + // + // Use the internal 16MHz oscillator as the UART clock source. + // + UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); + + // + // Initialize the UART for console I/O. + // + UARTStdioConfig(0, 115200, 16000000); +} + +//***************************************************************************** +// +// Initialize the ADC inputs used by the game pad device. This example uses +// the ADC pins on Port E pins 1, 2, and 3(AIN0-2). +// +//***************************************************************************** +void +ADCInit(void) +{ + int32_t ui32Chan; + + // + // Enable the GPIOs and the ADC used by this example. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); + SysCtlGPIOAHBEnable(SYSCTL_PERIPH_GPIOE); + + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); + ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_ADC0); + + // + // Select the external reference for greatest accuracy. + // + ROM_ADCReferenceSet(ADC0_BASE, ADC_REF_EXT_3V); + + // + // Configure the pins which are used as analog inputs. + // + ROM_GPIOPinTypeADC(GPIO_PORTE_AHB_BASE, GPIO_PIN_3 | GPIO_PIN_2 | + GPIO_PIN_1); + + // + // Configure the sequencer for 3 steps. + // + for(ui32Chan = 0; ui32Chan < 2; ui32Chan++) + { + // + // Configure the sequence step + // + ROM_ADCSequenceStepConfigure(ADC0_BASE, 0, ui32Chan, ui32Chan); + } + + ROM_ADCSequenceStepConfigure(ADC0_BASE, 0, 2, ADC_CTL_CH2 | ADC_CTL_IE | + ADC_CTL_END); + // + // Enable the sequence but do not start it yet. + // + ROM_ADCSequenceEnable(ADC0_BASE, 0); +} + +//***************************************************************************** +// +// This is the main loop that runs the application. +// +//***************************************************************************** +int +main(void) +{ + uint8_t ui8ButtonsChanged, ui8Buttons; + bool bUpdate; + + // + // Set the clocking to run from the PLL at 50MHz + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Enable the GPIO port that is used for the on-board LED. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + + // + // Enable the GPIO pin for the Blue LED (PF2). + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2); + + // + // Open UART0 and show the application name on the UART. + // + ConfigureUART(); + + UARTprintf("\033[2JTiva C Series USB gamepad device example\n"); + UARTprintf("---------------------------------\n\n"); + + // + // Not configured initially. + // + g_iGamepadState = eStateNotConfigured; + + // + // Enable the GPIO peripheral used for USB, and configure the USB + // pins. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); + SysCtlGPIOAHBEnable(SYSCTL_PERIPH_GPIOD); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTD_AHB_BASE, GPIO_PIN_4 | GPIO_PIN_5); + + // + // Configure the GPIOS for the buttons. + // + ButtonsInit(); + + // + // Initialize the ADC channels. + // + ADCInit(); + + // + // Tell the user what we are up to. + // + UARTprintf("Configuring USB\n"); + + // + // Set the USB stack mode to Device mode. + // + USBStackModeSet(0, eUSBModeForceDevice, 0); + + // + // Pass the device information to the USB library and place the device + // on the bus. + // + USBDHIDGamepadInit(0, &g_sGamepadDevice); + + // + // Zero out the initial report. + // + sReport.ui8Buttons = 0; + sReport.i8XPos = 0; + sReport.i8YPos = 0; + sReport.i8ZPos = 0; + + // + // Tell the user what we are doing and provide some basic instructions. + // + UARTprintf("\nWaiting For Host...\n"); + + // + // Trigger an initial ADC sequence. + // + ADCProcessorTrigger(ADC0_BASE, 0); + + // + // The main loop starts here. We begin by waiting for a host connection + // then drop into the main gamepad handling section. If the host + // disconnects, we return to the top and wait for a new connection. + // + while(1) + { + // + // Wait here until USB device is connected to a host. + // + if(g_iGamepadState == eStateIdle) + { + // + // No update by default. + // + bUpdate = false; + + // + // See if the buttons updated. + // + ButtonsPoll(&ui8ButtonsChanged, &ui8Buttons); + + sReport.ui8Buttons = 0; + + // + // Set button 1 if left pressed. + // + if(ui8Buttons & LEFT_BUTTON) + { + sReport.ui8Buttons |= 0x01; + } + + // + // Set button 2 if right pressed. + // + if(ui8Buttons & RIGHT_BUTTON) + { + sReport.ui8Buttons |= 0x02; + } + + if(ui8ButtonsChanged) + { + bUpdate = true; + } + + // + // See if the ADC updated. + // + if(ADCIntStatus(ADC0_BASE, 0, false) != 0) + { + // + // Clear the ADC interrupt. + // + ADCIntClear(ADC0_BASE, 0); + + // + // Read the data and trigger a new sample request. + // + ADCSequenceDataGet(ADC0_BASE, 0, &g_pui32ADCData[0]); + ADCProcessorTrigger(ADC0_BASE, 0); + + // + // Update the report. + // + sReport.i8XPos = Convert8Bit(g_pui32ADCData[0]); + sReport.i8YPos = Convert8Bit(g_pui32ADCData[1]); + sReport.i8ZPos = Convert8Bit(g_pui32ADCData[2]); + bUpdate = true; + } + + // + // Send the report if there was an update. + // + if(bUpdate) + { + USBDHIDGamepadSendReport(&g_sGamepadDevice, &sReport, + sizeof(sReport)); + + // + // Now sending data but protect this from an interrupt since + // it can change in interrupt context as well. + // + IntMasterDisable(); + g_iGamepadState = eStateSending; + IntMasterEnable(); + + // + // Limit the blink rate of the LED. + // + if(g_ui32Updates++ == 40) + { + // + // Turn on the blue LED. + // + ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); + + // + // Reset the update count. + // + g_ui32Updates = 0; + } + } + } + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ewd b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ewp b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ewp new file mode 100644 index 0000000..b2b007c --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ewp @@ -0,0 +1,799 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\..\drivers\buttons.c + + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_dev_gamepad.c + + + $PROJ_DIR$\usb_gamepad_structs.c + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.icf b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.icf new file mode 100644 index 0000000..92355c7 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_gamepad.icf - Linker configuration file for usb_dev_gamepad. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ld b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ld new file mode 100644 index 0000000..e05806b --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_gamepad.ld - Linker configuration file for usb_dev_gamepad. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.sct b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.sct new file mode 100644 index 0000000..f296ccb --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_gamepad.sct - Linker configuration file for usb_dev_gamepad. +; +; Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.uvopt b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.uvopt new file mode 100644 index 0000000..078db4e --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_gamepad + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\drivers\buttons.c + buttons.c + + + 1 + 2 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_gamepad.c + usb_dev_gamepad.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_gamepad_structs.c + usb_gamepad_structs.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.uvproj b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.uvproj new file mode 100644 index 0000000..537d0bd --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_gamepad + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_gamepad + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_gamepad.bin .\rvmdk\usb_dev_gamepad.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RA1 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_gamepad.sct + + + --entry Reset_Handler + + + + + + + + Source + + + buttons.c + 1 + ..\drivers\buttons.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_dev_gamepad.c + 1 + .\usb_dev_gamepad.c + + + usb_gamepad_structs.c + 1 + .\usb_gamepad_structs.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad_ccs.cmd b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad_ccs.cmd new file mode 100644 index 0000000..25d1a9d --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_dev_gamepad_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_gamepad_ccs.cmd - CCS linker configuration file for usb_dev_gamepad. + * + * Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_gamepad_structs.c b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_gamepad_structs.c new file mode 100644 index 0000000..69eaa95 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_gamepad_structs.c @@ -0,0 +1,151 @@ +//***************************************************************************** +// +// usb_gamepad_structs.c - Data structures defining the USB gamepad device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "usblib/usblib.h" +#include "usblib/usbhid.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcomp.h" +#include "usblib/device/usbdhid.h" +#include "usblib/device/usbdhidgamepad.h" +#include "usb_gamepad_structs.h" + +//**************************************************************************** +// +// The languages supported by this device. +// +//**************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//**************************************************************************** +// +// The manufacturer string. +// +//**************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//**************************************************************************** +// +// The product string. +// +//**************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'E', 0, 'x', 0, 'a', 0, 'm', 0, 'p', 0, 'l', 0, 'e', 0, ' ', 0, + 'G', 0, 'a', 0, 'm', 0, 'e', 0, ' ', 0, 'P', 0, 'a', 0, 'd', 0, ' ', 0, +}; + +//**************************************************************************** +// +// The serial number string. +// +//**************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + (8 + 1) * 2, + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The interface description string. +// +//***************************************************************************** +const uint8_t g_pui8HIDInterfaceString[] = +{ + (21 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'G', 0, 'a', 0, 'm', 0, 'e', 0, + 'p', 0, 'a', 0, 'd', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, + 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + (25 + 1) * 2, + USB_DTYPE_STRING, + 'H', 0, 'I', 0, 'D', 0, ' ', 0, 'G', 0, 'a', 0, 'm', 0, 'e', 0, + 'p', 0, 'a', 0, 'd', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, + 'i', 0, 'g', 0, 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, + 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8HIDInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// The HID game pad device initialization and customization structures. +// +//***************************************************************************** +tUSBDHIDGamepadDevice g_sGamepadDevice = +{ + USB_VID_TI_1CBE, + USB_PID_GAMEPAD, + 0, + USB_CONF_ATTR_SELF_PWR, + GamepadHandler, + (void *)&g_sGamepadDevice, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS, + 0, + 0 +}; diff --git a/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_gamepad_structs.h b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_gamepad_structs.h new file mode 100644 index 0000000..a45eb92 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_gamepad/usb_gamepad_structs.h @@ -0,0 +1,33 @@ +//***************************************************************************** +// +// usb_gamepad_structs.h - Data structures defining the gamepad USB device. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_GAMEPAD_STRUCTS_H_ +#define _USB_GAMEPAD_STRUCTS_H_ + +extern uint32_t GamepadHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgData, void *pvMsgData); + +extern tUSBDHIDGamepadDevice g_sGamepadDevice; + +#endif diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/Makefile b/boards/ek-tm4c123gxl/usb_dev_serial/Makefile new file mode 100644 index 0000000..dc53270 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/Makefile @@ -0,0 +1,90 @@ +#****************************************************************************** +# +# Makefile - Rules for building the USB device serial example. +# +# Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C123GH6PM + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the USB device serial example to be built. +# +all: ${COMPILER} +all: ${COMPILER}/usb_dev_serial.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the USB device serial example. +# +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/uartstdio.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/usb_dev_serial.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/usb_serial_structs.o +${COMPILER}/usb_dev_serial.axf: ${COMPILER}/ustdlib.o +${COMPILER}/usb_dev_serial.axf: ${ROOT}/usblib/${COMPILER}/libusb.a +${COMPILER}/usb_dev_serial.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/usb_dev_serial.axf: usb_dev_serial.ld +SCATTERgcc_usb_dev_serial=usb_dev_serial.ld +ENTRY_usb_dev_serial=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C123_RB1 -DUART_BUFFERED + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.ccsimportspec b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.ccsimportspec new file mode 100644 index 0000000..c5ecbbf --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.ccsimportspec @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.ccsproject b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.ccsproject new file mode 100644 index 0000000..75fb50e --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.cproject b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.cproject new file mode 100644 index 0000000..bd5243c --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.cproject @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.project b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.project new file mode 100644 index 0000000..ee822e9 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.project @@ -0,0 +1,65 @@ + + + usb_dev_serial + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_serial/startup_ccs.c + + + usb_dev_serial.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.c + + + usb_dev_serial_ccs.cmd + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial_ccs.cmd + + + usb_serial_structs.c + 1 + SW_ROOT/examples/boards/ek-tm4c123gxl/usb_dev_serial/usb_serial_structs.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/ccs/Debug/usb_dev_serial.bin b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/Debug/usb_dev_serial.bin new file mode 100644 index 0000000..d1351d8 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/Debug/usb_dev_serial.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/ccs/Debug/usb_dev_serial.out b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/Debug/usb_dev_serial.out new file mode 100644 index 0000000..8ecfac2 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/Debug/usb_dev_serial.out differ diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/ccs/macros.ini_initial b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/ccs/target_config.ccxml b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/target_config.ccxml new file mode 100644 index 0000000..be4342a --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin b/boards/ek-tm4c123gxl/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin new file mode 100644 index 0000000..5ba8fdb Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_serial/ewarm/Exe/usb_dev_serial.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/ewarm/Exe/usb_dev_serial.out b/boards/ek-tm4c123gxl/usb_dev_serial/ewarm/Exe/usb_dev_serial.out new file mode 100644 index 0000000..72c74e3 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_serial/ewarm/Exe/usb_dev_serial.out differ diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/gcc/usb_dev_serial.axf b/boards/ek-tm4c123gxl/usb_dev_serial/gcc/usb_dev_serial.axf new file mode 100644 index 0000000..a9dac91 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_serial/gcc/usb_dev_serial.axf differ diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/gcc/usb_dev_serial.bin b/boards/ek-tm4c123gxl/usb_dev_serial/gcc/usb_dev_serial.bin new file mode 100644 index 0000000..9f81a00 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_serial/gcc/usb_dev_serial.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/readme.txt b/boards/ek-tm4c123gxl/usb_dev_serial/readme.txt new file mode 100644 index 0000000..8d9f718 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/readme.txt @@ -0,0 +1,32 @@ +USB Serial Device + +This example application turns the evaluation kit into a virtual serial +port when connected to the USB host system. The application supports the +USB Communication Device Class, Abstract Control Model to redirect UART0 +traffic to and from the USB host system. + +Assuming you installed TivaWare C Series in the default directory, a +driver information (INF) file for use with Windows XP, Windows Vista and +Windows7 can be found in C:/ti/TivaWare-for-C-Series/windows_drivers. For +Windows 2000, the required INF file is in +C:/ti/TivaWare-for-C-Series/windows_drivers/win2K. + +------------------------------------------------------------------------------- + +Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +Software License Agreement + +Texas Instruments (TI) is supplying this software for use solely and +exclusively on TI's microcontroller products. The software is owned by +TI and/or its suppliers, and is protected under applicable copyright +laws. You may not combine this software with "viral" open-source +software in order to form a larger program. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, FOR ANY REASON WHATSOEVER. + +This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/rvmdk/usb_dev_serial.axf b/boards/ek-tm4c123gxl/usb_dev_serial/rvmdk/usb_dev_serial.axf new file mode 100644 index 0000000..72643dc Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_serial/rvmdk/usb_dev_serial.axf differ diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/rvmdk/usb_dev_serial.bin b/boards/ek-tm4c123gxl/usb_dev_serial/rvmdk/usb_dev_serial.bin new file mode 100644 index 0000000..e350998 Binary files /dev/null and b/boards/ek-tm4c123gxl/usb_dev_serial/rvmdk/usb_dev_serial.bin differ diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/startup_ccs.c b/boards/ek-tm4c123gxl/usb_dev_serial/startup_ccs.c new file mode 100644 index 0000000..2f33bf7 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/startup_ccs.c @@ -0,0 +1,304 @@ +//***************************************************************************** +// +// startup_ccs.c - Startup code for use with TI's Code Composer Studio. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the reset handler that is to be called when the +// processor is started +// +//***************************************************************************** +extern void _c_int00(void); + +//***************************************************************************** +// +// Linker variable that marks the top of the stack. +// +//***************************************************************************** +extern uint32_t __STACK_TOP; + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000 or at the start of +// the program if located at a start address other than 0. +// +//***************************************************************************** +#pragma DATA_SECTION(g_pfnVectors, ".intvecs") +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)&__STACK_TOP), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Jump to the CCS C initialization routine. This will enable the + // floating-point unit as well, so that does not need to be done here. + // + __asm(" .global _c_int00\n" + " b.w _c_int00"); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/startup_ewarm.c b/boards/ek-tm4c123gxl/usb_dev_serial/startup_ewarm.c new file mode 100644 index 0000000..5ddce10 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/startup_ewarm.c @@ -0,0 +1,335 @@ +//***************************************************************************** +// +// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench, +// version 5. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application startup code. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + uint32_t ui32Ptr; +} +uVectorEntry; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + __iar_program_start(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/startup_gcc.c b/boards/ek-tm4c123gxl/usb_dev_serial/startup_gcc.c new file mode 100644 index 0000000..01e4550 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/startup_gcc.c @@ -0,0 +1,351 @@ +//***************************************************************************** +// +// startup_gcc.c - Startup code for use with GNU tools. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_nvic.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declarations for the interrupt handlers used by the application. +// +//***************************************************************************** +extern void SysTickIntHandler(void); +extern void USBUARTIntHandler(void); +extern void USB0DeviceIntHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +static uint32_t pui32Stack[256]; + +//***************************************************************************** +// +// The vector table. Note that the proper constructs must be placed on this to +// ensure that it ends up at physical address 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + IntDefaultHandler, // The PendSV handler + SysTickIntHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + USBUARTIntHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI0 Rx and Tx + IntDefaultHandler, // I2C0 Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder 0 + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + IntDefaultHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Hibernate + USB0DeviceIntHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler, // uDMA Error + IntDefaultHandler, // ADC1 Sequence 0 + IntDefaultHandler, // ADC1 Sequence 1 + IntDefaultHandler, // ADC1 Sequence 2 + IntDefaultHandler, // ADC1 Sequence 3 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port J + IntDefaultHandler, // GPIO Port K + IntDefaultHandler, // GPIO Port L + IntDefaultHandler, // SSI2 Rx and Tx + IntDefaultHandler, // SSI3 Rx and Tx + IntDefaultHandler, // UART3 Rx and Tx + IntDefaultHandler, // UART4 Rx and Tx + IntDefaultHandler, // UART5 Rx and Tx + IntDefaultHandler, // UART6 Rx and Tx + IntDefaultHandler, // UART7 Rx and Tx + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C2 Master and Slave + IntDefaultHandler, // I2C3 Master and Slave + IntDefaultHandler, // Timer 4 subtimer A + IntDefaultHandler, // Timer 4 subtimer B + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // Timer 5 subtimer A + IntDefaultHandler, // Timer 5 subtimer B + IntDefaultHandler, // Wide Timer 0 subtimer A + IntDefaultHandler, // Wide Timer 0 subtimer B + IntDefaultHandler, // Wide Timer 1 subtimer A + IntDefaultHandler, // Wide Timer 1 subtimer B + IntDefaultHandler, // Wide Timer 2 subtimer A + IntDefaultHandler, // Wide Timer 2 subtimer B + IntDefaultHandler, // Wide Timer 3 subtimer A + IntDefaultHandler, // Wide Timer 3 subtimer B + IntDefaultHandler, // Wide Timer 4 subtimer A + IntDefaultHandler, // Wide Timer 4 subtimer B + IntDefaultHandler, // Wide Timer 5 subtimer A + IntDefaultHandler, // Wide Timer 5 subtimer B + IntDefaultHandler, // FPU + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // I2C4 Master and Slave + IntDefaultHandler, // I2C5 Master and Slave + IntDefaultHandler, // GPIO Port M + IntDefaultHandler, // GPIO Port N + IntDefaultHandler, // Quadrature Encoder 2 + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // GPIO Port P (Summary or P0) + IntDefaultHandler, // GPIO Port P1 + IntDefaultHandler, // GPIO Port P2 + IntDefaultHandler, // GPIO Port P3 + IntDefaultHandler, // GPIO Port P4 + IntDefaultHandler, // GPIO Port P5 + IntDefaultHandler, // GPIO Port P6 + IntDefaultHandler, // GPIO Port P7 + IntDefaultHandler, // GPIO Port Q (Summary or Q0) + IntDefaultHandler, // GPIO Port Q1 + IntDefaultHandler, // GPIO Port Q2 + IntDefaultHandler, // GPIO Port Q3 + IntDefaultHandler, // GPIO Port Q4 + IntDefaultHandler, // GPIO Port Q5 + IntDefaultHandler, // GPIO Port Q6 + IntDefaultHandler, // GPIO Port Q7 + IntDefaultHandler, // GPIO Port R + IntDefaultHandler, // GPIO Port S + IntDefaultHandler, // PWM 1 Generator 0 + IntDefaultHandler, // PWM 1 Generator 1 + IntDefaultHandler, // PWM 1 Generator 2 + IntDefaultHandler, // PWM 1 Generator 3 + IntDefaultHandler // PWM 1 Fault +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern uint32_t _etext; +extern uint32_t _data; +extern uint32_t _edata; +extern uint32_t _bss; +extern uint32_t _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + uint32_t *pui32Src, *pui32Dest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pui32Src = &_etext; + for(pui32Dest = &_data; pui32Dest < &_edata; ) + { + *pui32Dest++ = *pui32Src++; + } + + // + // Zero fill the bss segment. + // + __asm(" ldr r0, =_bss\n" + " ldr r1, =_ebss\n" + " mov r2, #0\n" + " .thumb_func\n" + "zero_loop:\n" + " cmp r0, r1\n" + " it lt\n" + " strlt r2, [r0], #4\n" + " blt zero_loop"); + + // + // Enable the floating-point unit. This must be done here to handle the + // case where main() uses floating-point and the function prologue saves + // floating-point registers (which will fault if floating-point is not + // enabled). Any configuration of the floating-point unit using DriverLib + // APIs must be done here prior to the floating-point unit being enabled. + // + // Note that this does not use DriverLib since it might not be included in + // this project. + // + HWREG(NVIC_CPAC) = ((HWREG(NVIC_CPAC) & + ~(NVIC_CPAC_CP10_M | NVIC_CPAC_CP11_M)) | + NVIC_CPAC_CP10_FULL | NVIC_CPAC_CP11_FULL); + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/startup_rvmdk.S b/boards/ek-tm4c123gxl/usb_dev_serial/startup_rvmdk.S new file mode 100644 index 0000000..1a9624c --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/startup_rvmdk.S @@ -0,0 +1,360 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000400 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; External declarations for the interrupt handlers used by the application. +; +;****************************************************************************** + EXTERN SysTickIntHandler + EXTERN USBUARTIntHandler + EXTERN USB0DeviceIntHandler + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; The MPU fault handler + DCD IntDefaultHandler ; The bus fault handler + DCD IntDefaultHandler ; The usage fault handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; SVCall handler + DCD IntDefaultHandler ; Debug monitor handler + DCD 0 ; Reserved + DCD IntDefaultHandler ; The PendSV handler + DCD SysTickIntHandler ; The SysTick handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD USBUARTIntHandler ; UART0 Rx and Tx + DCD IntDefaultHandler ; UART1 Rx and Tx + DCD IntDefaultHandler ; SSI0 Rx and Tx + DCD IntDefaultHandler ; I2C0 Master and Slave + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder 0 + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog timer + DCD IntDefaultHandler ; Timer 0 subtimer A + DCD IntDefaultHandler ; Timer 0 subtimer B + DCD IntDefaultHandler ; Timer 1 subtimer A + DCD IntDefaultHandler ; Timer 1 subtimer B + DCD IntDefaultHandler ; Timer 2 subtimer A + DCD IntDefaultHandler ; Timer 2 subtimer B + DCD IntDefaultHandler ; Analog Comparator 0 + DCD IntDefaultHandler ; Analog Comparator 1 + DCD IntDefaultHandler ; Analog Comparator 2 + DCD IntDefaultHandler ; System Control (PLL, OSC, BO) + DCD IntDefaultHandler ; FLASH Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + DCD IntDefaultHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Hibernate + DCD USB0DeviceIntHandler ; USB0 + DCD IntDefaultHandler ; PWM Generator 3 + DCD IntDefaultHandler ; uDMA Software Transfer + DCD IntDefaultHandler ; uDMA Error + DCD IntDefaultHandler ; ADC1 Sequence 0 + DCD IntDefaultHandler ; ADC1 Sequence 1 + DCD IntDefaultHandler ; ADC1 Sequence 2 + DCD IntDefaultHandler ; ADC1 Sequence 3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port J + DCD IntDefaultHandler ; GPIO Port K + DCD IntDefaultHandler ; GPIO Port L + DCD IntDefaultHandler ; SSI2 Rx and Tx + DCD IntDefaultHandler ; SSI3 Rx and Tx + DCD IntDefaultHandler ; UART3 Rx and Tx + DCD IntDefaultHandler ; UART4 Rx and Tx + DCD IntDefaultHandler ; UART5 Rx and Tx + DCD IntDefaultHandler ; UART6 Rx and Tx + DCD IntDefaultHandler ; UART7 Rx and Tx + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C2 Master and Slave + DCD IntDefaultHandler ; I2C3 Master and Slave + DCD IntDefaultHandler ; Timer 4 subtimer A + DCD IntDefaultHandler ; Timer 4 subtimer B + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; Timer 5 subtimer A + DCD IntDefaultHandler ; Timer 5 subtimer B + DCD IntDefaultHandler ; Wide Timer 0 subtimer A + DCD IntDefaultHandler ; Wide Timer 0 subtimer B + DCD IntDefaultHandler ; Wide Timer 1 subtimer A + DCD IntDefaultHandler ; Wide Timer 1 subtimer B + DCD IntDefaultHandler ; Wide Timer 2 subtimer A + DCD IntDefaultHandler ; Wide Timer 2 subtimer B + DCD IntDefaultHandler ; Wide Timer 3 subtimer A + DCD IntDefaultHandler ; Wide Timer 3 subtimer B + DCD IntDefaultHandler ; Wide Timer 4 subtimer A + DCD IntDefaultHandler ; Wide Timer 4 subtimer B + DCD IntDefaultHandler ; Wide Timer 5 subtimer A + DCD IntDefaultHandler ; Wide Timer 5 subtimer B + DCD IntDefaultHandler ; FPU + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; I2C4 Master and Slave + DCD IntDefaultHandler ; I2C5 Master and Slave + DCD IntDefaultHandler ; GPIO Port M + DCD IntDefaultHandler ; GPIO Port N + DCD IntDefaultHandler ; Quadrature Encoder 2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD IntDefaultHandler ; GPIO Port P (Summary or P0) + DCD IntDefaultHandler ; GPIO Port P1 + DCD IntDefaultHandler ; GPIO Port P2 + DCD IntDefaultHandler ; GPIO Port P3 + DCD IntDefaultHandler ; GPIO Port P4 + DCD IntDefaultHandler ; GPIO Port P5 + DCD IntDefaultHandler ; GPIO Port P6 + DCD IntDefaultHandler ; GPIO Port P7 + DCD IntDefaultHandler ; GPIO Port Q (Summary or Q0) + DCD IntDefaultHandler ; GPIO Port Q1 + DCD IntDefaultHandler ; GPIO Port Q2 + DCD IntDefaultHandler ; GPIO Port Q3 + DCD IntDefaultHandler ; GPIO Port Q4 + DCD IntDefaultHandler ; GPIO Port Q5 + DCD IntDefaultHandler ; GPIO Port Q6 + DCD IntDefaultHandler ; GPIO Port Q7 + DCD IntDefaultHandler ; GPIO Port R + DCD IntDefaultHandler ; GPIO Port S + DCD IntDefaultHandler ; PWM 1 Generator 0 + DCD IntDefaultHandler ; PWM 1 Generator 1 + DCD IntDefaultHandler ; PWM 1 Generator 2 + DCD IntDefaultHandler ; PWM 1 Generator 3 + DCD IntDefaultHandler ; PWM 1 Fault + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Enable the floating-point unit. This must be done here to handle the + ; case where main() uses floating-point and the function prologue saves + ; floating-point registers (which will fault if floating-point is not + ; enabled). Any configuration of the floating-point unit using + ; DriverLib APIs must be done here prior to the floating-point unit + ; being enabled. + ; + ; Note that this does not use DriverLib since it might not be included + ; in this project. + ; + MOVW R0, #0xED88 + MOVT R0, #0xE000 + LDR R1, [R0] + ORR R1, #0x00F00000 + STR R1, [R0] + + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.c b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.c new file mode 100644 index 0000000..75dffab --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.c @@ -0,0 +1,1222 @@ +//***************************************************************************** +// +// usb_dev_serial.c - Main routines for the USB CDC serial example. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_gpio.h" +#include "inc/hw_uart.h" +#include "inc/hw_sysctl.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "driverlib/timer.h" +#include "driverlib/uart.h" +#include "driverlib/usb.h" +#include "driverlib/rom.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "utils/ustdlib.h" +#include "usb_serial_structs.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

      USB Serial Device (usb_dev_serial)

      +//! +//! This example application turns the evaluation kit into a virtual serial +//! port when connected to the USB host system. The application supports the +//! USB Communication Device Class, Abstract Control Model to redirect UART0 +//! traffic to and from the USB host system. +//! +//! Assuming you installed TivaWare C Series in the default directory, a +//! driver information (INF) file for use with Windows XP, Windows Vista and +//! Windows7 can be found in C:/ti/TivaWare-for-C-Series/windows_drivers. For +//! Windows 2000, the required INF file is in +//! C:/ti/TivaWare-for-C-Series/windows_drivers/win2K. +// +//***************************************************************************** + +//***************************************************************************** +// +// Note: +// +// This example is intended to run on Tiva C Series evaluation kit hardware +// where the UARTs are wired solely for TX and RX, and do not have GPIOs +// connected to act as handshake signals. As a result, this example mimics +// the case where communication is always possible. It reports DSR, DCD +// and CTS as high to ensure that the USB host recognizes that data can be +// sent and merely ignores the host's requested DTR and RTS states. "TODO" +// comments in the code indicate where code would be required to add support +// for real handshakes. +// +//***************************************************************************** + +//***************************************************************************** +// +// Configuration and tuning parameters. +// +//***************************************************************************** + +//***************************************************************************** +// +// The system tick rate expressed both as ticks per second and a millisecond +// period. +// +//***************************************************************************** +#define SYSTICKS_PER_SECOND 100 +#define SYSTICK_PERIOD_MS (1000 / SYSTICKS_PER_SECOND) + +//***************************************************************************** +// +// Variables tracking transmit and receive counts. +// +//***************************************************************************** +volatile uint32_t g_ui32UARTTxCount = 0; +volatile uint32_t g_ui32UARTRxCount = 0; +#ifdef DEBUG +uint32_t g_ui32UARTRxErrors = 0; +#endif + +//***************************************************************************** +// +// The base address, peripheral ID and interrupt ID of the UART that is to +// be redirected. +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines required to redirect UART0 via USB. +// +//***************************************************************************** +#define USB_UART_BASE UART0_BASE +#define USB_UART_PERIPH SYSCTL_PERIPH_UART0 +#define USB_UART_INT INT_UART0 + +//***************************************************************************** +// +// Default line coding settings for the redirected UART. +// +//***************************************************************************** +#define DEFAULT_BIT_RATE 115200 +#define DEFAULT_UART_CONFIG (UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | \ + UART_CONFIG_STOP_ONE) + +//***************************************************************************** +// +// GPIO peripherals and pins muxed with the redirected UART. These will depend +// upon the IC in use and the UART selected in USB_UART_BASE. Be careful that +// these settings all agree with the hardware you are using. +// +//***************************************************************************** + +//***************************************************************************** +// +// Defines required to redirect UART0 via USB. +// +//***************************************************************************** +#define TX_GPIO_BASE GPIO_PORTA_BASE +#define TX_GPIO_PERIPH SYSCTL_PERIPH_GPIOA +#define TX_GPIO_PIN GPIO_PIN_1 + +#define RX_GPIO_BASE GPIO_PORTA_BASE +#define RX_GPIO_PERIPH SYSCTL_PERIPH_GPIOA +#define RX_GPIO_PIN GPIO_PIN_0 + +//***************************************************************************** +// +// Flag indicating whether or not we are currently sending a Break condition. +// +//***************************************************************************** +static bool g_bSendingBreak = false; + +//***************************************************************************** +// +// Global system tick counter +// +//***************************************************************************** +volatile uint32_t g_ui32SysTickCount = 0; + +//***************************************************************************** +// +// Flags used to pass commands from interrupt context to the main loop. +// +//***************************************************************************** +#define COMMAND_PACKET_RECEIVED 0x00000001 +#define COMMAND_STATUS_UPDATE 0x00000002 + +volatile uint32_t g_ui32Flags = 0; +char *g_pcStatus; + +//***************************************************************************** +// +// Global flag indicating that a USB configuration has been set. +// +//***************************************************************************** +static volatile bool g_bUSBConfigured = false; + +//***************************************************************************** +// +// Internal function prototypes. +// +//***************************************************************************** +static void USBUARTPrimeTransmit(uint32_t ui32Base); +static void CheckForSerialStateChange(const tUSBDCDCDevice *psDevice, + int32_t i32Errors); +static void SetControlLineState(uint16_t ui16State); +static bool SetLineCoding(tLineCoding *psLineCoding); +static void GetLineCoding(tLineCoding *psLineCoding); +static void SendBreak(bool bSend); + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, uint32_t ui32Line) +{ + while(1) + { + } +} +#endif + +//***************************************************************************** +// +// This function is called whenever serial data is received from the UART. +// It is passed the accumulated error flags from each character received in +// this interrupt and determines from them whether or not an interrupt +// notification to the host is required. +// +// If a notification is required and the control interrupt endpoint is idle, +// we send the notification immediately. If the endpoint is not idle, we +// accumulate the errors in a global variable which will be checked on +// completion of the previous notification and used to send a second one +// if necessary. +// +//***************************************************************************** +static void +CheckForSerialStateChange(const tUSBDCDCDevice *psDevice, int32_t i32Errors) +{ + uint16_t ui16SerialState; + + // + // Clear our USB serial state. Since we are faking the handshakes, always + // set the TXCARRIER (DSR) and RXCARRIER (DCD) bits. + // + ui16SerialState = USB_CDC_SERIAL_STATE_TXCARRIER | + USB_CDC_SERIAL_STATE_RXCARRIER; + + // + // Are any error bits set? + // + if(i32Errors) + { + // + // At least one error is being notified so translate from our hardware + // error bits into the correct state markers for the USB notification. + // + if(i32Errors & UART_DR_OE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_OVERRUN; + } + + if(i32Errors & UART_DR_PE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_PARITY; + } + + if(i32Errors & UART_DR_FE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_FRAMING; + } + + if(i32Errors & UART_DR_BE) + { + ui16SerialState |= USB_CDC_SERIAL_STATE_BREAK; + } + + // Call the CDC driver to notify the state change. + USBDCDCSerialStateChange((void *)psDevice, ui16SerialState); + } +} + +//***************************************************************************** +// +// Read as many characters from the UART FIFO as we can and move them into +// the CDC transmit buffer. +// +// \return Returns UART error flags read during data reception. +// +//***************************************************************************** +static int32_t +ReadUARTData(void) +{ + int32_t i32Char, i32Errors; + uint8_t ui8Char; + uint32_t ui32Space; + + // + // Clear our error indicator. + // + i32Errors = 0; + + // + // How much space do we have in the buffer? + // + ui32Space = USBBufferSpaceAvailable((tUSBBuffer *)&g_sTxBuffer); + + // + // Read data from the UART FIFO until there is none left or we run + // out of space in our receive buffer. + // + while(ui32Space && ROM_UARTCharsAvail(USB_UART_BASE)) + { + // + // Read a character from the UART FIFO into the ring buffer if no + // errors are reported. + // + i32Char = ROM_UARTCharGetNonBlocking(USB_UART_BASE); + + // + // If the character did not contain any error notifications, + // copy it to the output buffer. + // + if(!(i32Char & ~0xFF)) + { + ui8Char = (uint8_t)(i32Char & 0xFF); + USBBufferWrite((tUSBBuffer *)&g_sTxBuffer, + (uint8_t *)&ui8Char, 1); + + // + // Decrement the number of bytes we know the buffer can accept. + // + ui32Space--; + } + else + { +#ifdef DEBUG + // + // Increment our receive error counter. + // + g_ui32UARTRxErrors++; +#endif + // + // Update our error accumulator. + // + i32Errors |= i32Char; + } + + // + // Update our count of bytes received via the UART. + // + g_ui32UARTRxCount++; + } + + // + // Pass back the accumulated error indicators. + // + return(i32Errors); +} + +//***************************************************************************** +// +// Take as many bytes from the transmit buffer as we have space for and move +// them into the USB UART's transmit FIFO. +// +//***************************************************************************** +static void +USBUARTPrimeTransmit(uint32_t ui32Base) +{ + uint32_t ui32Read; + uint8_t ui8Char; + + // + // If we are currently sending a break condition, don't receive any + // more data. We will resume transmission once the break is turned off. + // + if(g_bSendingBreak) + { + return; + } + + // + // If there is space in the UART FIFO, try to read some characters + // from the receive buffer to fill it again. + // + while(ROM_UARTSpaceAvail(ui32Base)) + { + // + // Get a character from the buffer. + // + ui32Read = USBBufferRead((tUSBBuffer *)&g_sRxBuffer, &ui8Char, 1); + + // + // Did we get a character? + // + if(ui32Read) + { + // + // Place the character in the UART transmit FIFO. + // + ROM_UARTCharPutNonBlocking(ui32Base, ui8Char); + + // + // Update our count of bytes transmitted via the UART. + // + g_ui32UARTTxCount++; + } + else + { + // + // We ran out of characters so exit the function. + // + return; + } + } +} + +//***************************************************************************** +// +// Interrupt handler for the system tick counter. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + // + // Update our system time. + // + g_ui32SysTickCount++; +} + +//***************************************************************************** +// +// Interrupt handler for the UART which we are redirecting via USB. +// +//***************************************************************************** +void +USBUARTIntHandler(void) +{ + uint32_t ui32Ints; + int32_t i32Errors; + + // + // Get and clear the current interrupt source(s) + // + ui32Ints = ROM_UARTIntStatus(USB_UART_BASE, true); + ROM_UARTIntClear(USB_UART_BASE, ui32Ints); + + // + // Are we being interrupted because the TX FIFO has space available? + // + if(ui32Ints & UART_INT_TX) + { + // + // Move as many bytes as we can into the transmit FIFO. + // + USBUARTPrimeTransmit(USB_UART_BASE); + + // + // If the output buffer is empty, turn off the transmit interrupt. + // + if(!USBBufferDataAvailable(&g_sRxBuffer)) + { + ROM_UARTIntDisable(USB_UART_BASE, UART_INT_TX); + } + } + + // + // Handle receive interrupts. + // + if(ui32Ints & (UART_INT_RX | UART_INT_RT)) + { + // + // Read the UART's characters into the buffer. + // + i32Errors = ReadUARTData(); + + // + // Check to see if we need to notify the host of any errors we just + // detected. + // + CheckForSerialStateChange(&g_sCDCDevice, i32Errors); + } +} + +//***************************************************************************** +// +// Set the state of the RS232 RTS and DTR signals. +// +//***************************************************************************** +static void +SetControlLineState(uint16_t ui16State) +{ + // + // TODO: If configured with GPIOs controlling the handshake lines, + // set them appropriately depending upon the flags passed in the wValue + // field of the request structure passed. + // +} + +//***************************************************************************** +// +// Set the communication parameters to use on the UART. +// +//***************************************************************************** +static bool +SetLineCoding(tLineCoding *psLineCoding) +{ + uint32_t ui32Config; + bool bRetcode; + + // + // Assume everything is OK until we detect any problem. + // + bRetcode = true; + + // + // Word length. For invalid values, the default is to set 8 bits per + // character and return an error. + // + switch(psLineCoding->ui8Databits) + { + case 5: + { + ui32Config = UART_CONFIG_WLEN_5; + break; + } + + case 6: + { + ui32Config = UART_CONFIG_WLEN_6; + break; + } + + case 7: + { + ui32Config = UART_CONFIG_WLEN_7; + break; + } + + case 8: + { + ui32Config = UART_CONFIG_WLEN_8; + break; + } + + default: + { + ui32Config = UART_CONFIG_WLEN_8; + bRetcode = false; + break; + } + } + + // + // Parity. For any invalid values, we set no parity and return an error. + // + switch(psLineCoding->ui8Parity) + { + case USB_CDC_PARITY_NONE: + { + ui32Config |= UART_CONFIG_PAR_NONE; + break; + } + + case USB_CDC_PARITY_ODD: + { + ui32Config |= UART_CONFIG_PAR_ODD; + break; + } + + case USB_CDC_PARITY_EVEN: + { + ui32Config |= UART_CONFIG_PAR_EVEN; + break; + } + + case USB_CDC_PARITY_MARK: + { + ui32Config |= UART_CONFIG_PAR_ONE; + break; + } + + case USB_CDC_PARITY_SPACE: + { + ui32Config |= UART_CONFIG_PAR_ZERO; + break; + } + + default: + { + ui32Config |= UART_CONFIG_PAR_NONE; + bRetcode = false; + break; + } + } + + // + // Stop bits. Our hardware only supports 1 or 2 stop bits whereas CDC + // allows the host to select 1.5 stop bits. If passed 1.5 (or any other + // invalid or unsupported value of ui8Stop, we set up for 1 stop bit but + // return an error in case the caller needs to Stall or otherwise report + // this back to the host. + // + switch(psLineCoding->ui8Stop) + { + // + // One stop bit requested. + // + case USB_CDC_STOP_BITS_1: + { + ui32Config |= UART_CONFIG_STOP_ONE; + break; + } + + // + // Two stop bits requested. + // + case USB_CDC_STOP_BITS_2: + { + ui32Config |= UART_CONFIG_STOP_TWO; + break; + } + + // + // Other cases are either invalid values of ui8Stop or values that we + // cannot support so set 1 stop bit but return an error. + // + default: + { + ui32Config |= UART_CONFIG_STOP_ONE; + bRetcode = false; + break; + } + } + + // + // Set the UART mode appropriately. + // + ROM_UARTConfigSetExpClk(USB_UART_BASE, ROM_SysCtlClockGet(), + psLineCoding->ui32Rate, ui32Config); + + // + // Let the caller know if we had a problem or not. + // + return(bRetcode); +} + +//***************************************************************************** +// +// Get the communication parameters in use on the UART. +// +//***************************************************************************** +static void +GetLineCoding(tLineCoding *psLineCoding) +{ + uint32_t ui32Config; + uint32_t ui32Rate; + + // + // Get the current line coding set in the UART. + // + ROM_UARTConfigGetExpClk(USB_UART_BASE, ROM_SysCtlClockGet(), &ui32Rate, + &ui32Config); + psLineCoding->ui32Rate = ui32Rate; + + // + // Translate the configuration word length field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_WLEN_MASK) + { + case UART_CONFIG_WLEN_8: + { + psLineCoding->ui8Databits = 8; + break; + } + + case UART_CONFIG_WLEN_7: + { + psLineCoding->ui8Databits = 7; + break; + } + + case UART_CONFIG_WLEN_6: + { + psLineCoding->ui8Databits = 6; + break; + } + + case UART_CONFIG_WLEN_5: + { + psLineCoding->ui8Databits = 5; + break; + } + } + + // + // Translate the configuration parity field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_PAR_MASK) + { + case UART_CONFIG_PAR_NONE: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_NONE; + break; + } + + case UART_CONFIG_PAR_ODD: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_ODD; + break; + } + + case UART_CONFIG_PAR_EVEN: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_EVEN; + break; + } + + case UART_CONFIG_PAR_ONE: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_MARK; + break; + } + + case UART_CONFIG_PAR_ZERO: + { + psLineCoding->ui8Parity = USB_CDC_PARITY_SPACE; + break; + } + } + + // + // Translate the configuration stop bits field into the format expected + // by the host. + // + switch(ui32Config & UART_CONFIG_STOP_MASK) + { + case UART_CONFIG_STOP_ONE: + { + psLineCoding->ui8Stop = USB_CDC_STOP_BITS_1; + break; + } + + case UART_CONFIG_STOP_TWO: + { + psLineCoding->ui8Stop = USB_CDC_STOP_BITS_2; + break; + } + } +} + +//***************************************************************************** +// +// This function sets or clears a break condition on the redirected UART RX +// line. A break is started when the function is called with \e bSend set to +// \b true and persists until the function is called again with \e bSend set +// to \b false. +// +//***************************************************************************** +static void +SendBreak(bool bSend) +{ + // + // Are we being asked to start or stop the break condition? + // + if(!bSend) + { + // + // Remove the break condition on the line. + // + ROM_UARTBreakCtl(USB_UART_BASE, false); + g_bSendingBreak = false; + } + else + { + // + // Start sending a break condition on the line. + // + ROM_UARTBreakCtl(USB_UART_BASE, true); + g_bSendingBreak = true; + } +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to control and setup of the device. +// +// \param pvCBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to perform control-related +// operations on behalf of the USB host. These functions include setting +// and querying the serial communication parameters, setting handshake line +// states and sending break conditions. +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +ControlHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData) +{ + uint32_t ui32IntsOff; + + // + // Which event are we being asked to process? + // + switch(ui32Event) + { + // + // We are connected to a host and communication is now possible. + // + case USB_EVENT_CONNECTED: + g_bUSBConfigured = true; + + // + // Flush our buffers. + // + USBBufferFlush(&g_sTxBuffer); + USBBufferFlush(&g_sRxBuffer); + + // + // Tell the main loop to update the display. + // + ui32IntsOff = ROM_IntMasterDisable(); + g_pcStatus = "Connected"; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + if(!ui32IntsOff) + { + ROM_IntMasterEnable(); + } + break; + + // + // The host has disconnected. + // + case USB_EVENT_DISCONNECTED: + g_bUSBConfigured = false; + ui32IntsOff = ROM_IntMasterDisable(); + g_pcStatus = "Disconnected"; + g_ui32Flags |= COMMAND_STATUS_UPDATE; + if(!ui32IntsOff) + { + ROM_IntMasterEnable(); + } + break; + + // + // Return the current serial communication parameters. + // + case USBD_CDC_EVENT_GET_LINE_CODING: + GetLineCoding(pvMsgData); + break; + + // + // Set the current serial communication parameters. + // + case USBD_CDC_EVENT_SET_LINE_CODING: + SetLineCoding(pvMsgData); + break; + + // + // Set the current serial communication parameters. + // + case USBD_CDC_EVENT_SET_CONTROL_LINE_STATE: + SetControlLineState((uint16_t)ui32MsgValue); + break; + + // + // Send a break condition on the serial line. + // + case USBD_CDC_EVENT_SEND_BREAK: + SendBreak(true); + break; + + // + // Clear the break condition on the serial line. + // + case USBD_CDC_EVENT_CLEAR_BREAK: + SendBreak(false); + break; + + // + // Ignore SUSPEND and RESUME for now. + // + case USB_EVENT_SUSPEND: + case USB_EVENT_RESUME: + break; + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: +#ifdef DEBUG + while(1); +#else + break; +#endif + + } + + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the transmit channel (data to +// the USB host). +// +// \param ui32CBData is the client-supplied callback pointer for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the transmit data channel (the IN channel carrying +// data to the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +TxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + // + // Which event have we been sent? + // + switch(ui32Event) + { + case USB_EVENT_TX_COMPLETE: + // + // Since we are using the USBBuffer, we don't need to do anything + // here. + // + break; + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: +#ifdef DEBUG + while(1); +#else + break; +#endif + + } + return(0); +} + +//***************************************************************************** +// +// Handles CDC driver notifications related to the receive channel (data from +// the USB host). +// +// \param ui32CBData is the client-supplied callback data value for this channel. +// \param ui32Event identifies the event we are being notified about. +// \param ui32MsgValue is an event-specific value. +// \param pvMsgData is an event-specific pointer. +// +// This function is called by the CDC driver to notify us of any events +// related to operation of the receive data channel (the OUT channel carrying +// data from the USB host). +// +// \return The return value is event-specific. +// +//***************************************************************************** +uint32_t +RxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, + void *pvMsgData) +{ + uint32_t ui32Count; + + // + // Which event are we being sent? + // + switch(ui32Event) + { + // + // A new packet has been received. + // + case USB_EVENT_RX_AVAILABLE: + { + // + // Feed some characters into the UART TX FIFO and enable the + // interrupt so we are told when there is more space. + // + USBUARTPrimeTransmit(USB_UART_BASE); + ROM_UARTIntEnable(USB_UART_BASE, UART_INT_TX); + break; + } + + // + // We are being asked how much unprocessed data we have still to + // process. We return 0 if the UART is currently idle or 1 if it is + // in the process of transmitting something. The actual number of + // bytes in the UART FIFO is not important here, merely whether or + // not everything previously sent to us has been transmitted. + // + case USB_EVENT_DATA_REMAINING: + { + // + // Get the number of bytes in the buffer and add 1 if some data + // still has to clear the transmitter. + // + ui32Count = ROM_UARTBusy(USB_UART_BASE) ? 1 : 0; + return(ui32Count); + } + + // + // We are being asked to provide a buffer into which the next packet + // can be read. We do not support this mode of receiving data so let + // the driver know by returning 0. The CDC driver should not be sending + // this message but this is included just for illustration and + // completeness. + // + case USB_EVENT_REQUEST_BUFFER: + { + return(0); + } + + // + // We don't expect to receive any other events. Ignore any that show + // up in a release build or hang in a debug build. + // + default: +#ifdef DEBUG + while(1); +#else + break; +#endif + } + + return(0); +} + +//***************************************************************************** +// +// This is the main application entry function. +// +//***************************************************************************** +int +main(void) +{ + uint32_t ui32TxCount; + uint32_t ui32RxCount; + + // + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run from the PLL at 50MHz + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | + SYSCTL_XTAL_16MHZ); + + // + // Configure the required pins for USB operation. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); + ROM_GPIOPinTypeUSBAnalog(GPIO_PORTD_BASE, GPIO_PIN_5 | GPIO_PIN_4); + + // + // Enable the GPIO port that is used for the on-board LED. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + + // + // Enable the GPIO pins for the LED (PF2 & PF3). + // + ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3|GPIO_PIN_2); + + // + // Not configured initially. + // + g_bUSBConfigured = false; + + // + // Enable the UART that we will be redirecting. + // + ROM_SysCtlPeripheralEnable(USB_UART_PERIPH); + + // + // Enable and configure the UART RX and TX pins + // + ROM_SysCtlPeripheralEnable(TX_GPIO_PERIPH); + ROM_SysCtlPeripheralEnable(RX_GPIO_PERIPH); + ROM_GPIOPinTypeUART(TX_GPIO_BASE, TX_GPIO_PIN); + ROM_GPIOPinTypeUART(RX_GPIO_BASE, RX_GPIO_PIN); + + // + // TODO: Add code to configure handshake GPIOs if required. + // + + // + // Set the default UART configuration. + // + ROM_UARTConfigSetExpClk(USB_UART_BASE, ROM_SysCtlClockGet(), + DEFAULT_BIT_RATE, DEFAULT_UART_CONFIG); + ROM_UARTFIFOLevelSet(USB_UART_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8); + + // + // Configure and enable UART interrupts. + // + ROM_UARTIntClear(USB_UART_BASE, ROM_UARTIntStatus(USB_UART_BASE, false)); + ROM_UARTIntEnable(USB_UART_BASE, (UART_INT_OE | UART_INT_BE | UART_INT_PE | + UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX)); + + // + // Enable the system tick. + // + ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICKS_PER_SECOND); + ROM_SysTickIntEnable(); + ROM_SysTickEnable(); + + // + // Initialize the transmit and receive buffers. + // + USBBufferInit(&g_sTxBuffer); + USBBufferInit(&g_sRxBuffer); + + // + // Set the USB stack mode to Device mode with VBUS monitoring. + // + USBStackModeSet(0, eUSBModeForceDevice, 0); + + // + // Pass our device information to the USB library and place the device + // on the bus. + // + USBDCDCInit(0, &g_sCDCDevice); + + // + // Clear our local byte counters. + // + ui32RxCount = 0; + ui32TxCount = 0; + + // + // Enable interrupts now that the application is ready to start. + // + ROM_IntEnable(USB_UART_INT); + + // + // Main application loop. + // + while(1) + { + // + // Have we been asked to update the status display? + // + if(g_ui32Flags & COMMAND_STATUS_UPDATE) + { + // + // Clear the command flag + // + ROM_IntMasterDisable(); + g_ui32Flags &= ~COMMAND_STATUS_UPDATE; + ROM_IntMasterEnable(); + } + + // + // Has there been any transmit traffic since we last checked? + // + if(ui32TxCount != g_ui32UARTTxCount) + { + // + // Turn on the Green LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3); + + // + // Delay for a bit. + // + SysCtlDelay(ROM_SysCtlClockGet() / 3 / 20); + + // + // Turn off the Green LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0); + + // + // Take a snapshot of the latest transmit count. + // + ui32TxCount = g_ui32UARTTxCount; + } + + // + // Has there been any receive traffic since we last checked? + // + if(ui32RxCount != g_ui32UARTRxCount) + { + // + // Turn on the Blue LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); + + // + // Delay for a bit. + // + SysCtlDelay(ROM_SysCtlClockGet() / 3 / 20); + + // + // Turn off the Blue LED. + // + GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); + + // + // Take a snapshot of the latest receive count. + // + ui32RxCount = g_ui32UARTRxCount; + + } + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ewd b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ewd new file mode 100644 index 0000000..7a32408 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ewd @@ -0,0 +1,614 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ewp b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ewp new file mode 100644 index 0000000..d86effb --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ewp @@ -0,0 +1,799 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 3 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 19 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Libraries + + $PROJ_DIR$\..\..\..\..\driverlib\ewarm\Exe\driverlib.a + + + $PROJ_DIR$\..\..\..\..\usblib\ewarm\Exe\usblib.a + + + + Source + + $PROJ_DIR$\startup_ewarm.c + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + $PROJ_DIR$\usb_dev_serial.c + + + $PROJ_DIR$\usb_serial_structs.c + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.icf b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.icf new file mode 100644 index 0000000..23f7f32 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.icf @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// usb_dev_serial.icf - Linker configuration file for usb_dev_serial. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20007fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Indicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place the RAM vector table at the start of SRAM. +// +place at start of SRAM { section VTABLE }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ld b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ld new file mode 100644 index 0000000..fc9d874 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.ld @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * usb_dev_serial.ld - Linker configuration file for usb_dev_serial. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.sct b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.sct new file mode 100644 index 0000000..e495e63 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.sct @@ -0,0 +1,47 @@ +;****************************************************************************** +; +; usb_dev_serial.sct - Linker configuration file for usb_dev_serial. +; +; Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +; Software License Agreement +; +; Texas Instruments (TI) is supplying this software for use solely and +; exclusively on TI's microcontroller products. The software is owned by +; TI and/or its suppliers, and is protected under applicable copyright +; laws. You may not combine this software with "viral" open-source +; software in order to form a larger program. +; +; THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +; NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +; NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +; CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +; DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +; +;****************************************************************************** + +LR_IROM 0x00000000 0x00040000 +{ + ; + ; Specify the Execution Address of the code and the size. + ; + ER_IROM 0x00000000 0x00040000 + { + *.o (RESET, +First) + * (InRoot$$Sections, +RO) + } + + ; + ; Specify the Execution Address of the data area. + ; + RW_IRAM 0x20000000 0x00008000 + { + ; + ; Uncomment the following line in order to use IntRegister(). + ; + ;* (vtable, +First) + * (+RW, +ZI) + } +} diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.uvopt b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.uvopt new file mode 100644 index 0000000..3a620da --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.uvopt @@ -0,0 +1,345 @@ + + + + 1.0 + +
      ### uVision Project, (C) Keil Software
      + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + usb_dev_serial + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\TM4C123GH6PM.PDF + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + lmidk-agdi + -O4614 -S3 -FO29 + + + 0 + DLGTARM + + + + 0 + ARMDBGFLAGS + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Source + 1 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\uartstdio.c + uartstdio.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_dev_serial.c + usb_dev_serial.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\usb_serial_structs.c + usb_serial_structs.c + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\utils\ustdlib.c + ustdlib.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 6 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + driverlib.lib + + + 2 + 7 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\..\usblib\rvmdk\usblib.lib + usblib.lib + + + + + Documentation + 1 + 0 + 0 + + 3 + 8 + 5 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + .\readme.txt + readme.txt + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 0 + 0 + 729 + 300 + + + + + + + 1 + 0 + + 100 + 0 + + + .\readme.txt + 0 + 1 + 1 + + + + + +
      diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.uvproj b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.uvproj new file mode 100644 index 0000000..1a8a322 --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial.uvproj @@ -0,0 +1,444 @@ + + + + 1.1 + +
      ### uVision Project, (C) Keil Software
      + + + + usb_dev_serial + 0x4 + ARM-ADS + + + TM4C123GH6PM + Texas Instruments + IRAM(0x20000000-0x20007FFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M4") FPU2 + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM4F_256 -FS00 -FL040000) + 5919 + LM4Fxxxx.H + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + usb_dev_serial + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\usb_dev_serial.bin .\rvmdk\usb_dev_serial.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x8000 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + + --c99 + rvmdk PART_TM4C123GH6PM TARGET_IS_TM4C123_RB1 UART_BUFFERED + + ..;..\..\..\..; + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + usb_dev_serial.sct + + + --entry Reset_Handler + + + + + + + + Source + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + uartstdio.c + 1 + ..\..\..\..\utils\uartstdio.c + + + usb_dev_serial.c + 1 + .\usb_dev_serial.c + + + usb_serial_structs.c + 1 + .\usb_serial_structs.c + + + ustdlib.c + 1 + ..\..\..\..\utils\ustdlib.c + + + + + Libraries + + + driverlib.lib + 4 + ..\..\..\..\driverlib\rvmdk\driverlib.lib + + + usblib.lib + 4 + ..\..\..\..\usblib\rvmdk\usblib.lib + + + + + Documentation + + + readme.txt + 5 + .\readme.txt + + + + + + + +
      diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial_ccs.cmd b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial_ccs.cmd new file mode 100644 index 0000000..48ce7eb --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/usb_dev_serial_ccs.cmd @@ -0,0 +1,70 @@ +/****************************************************************************** + * + * usb_dev_serial_ccs.cmd - CCS linker configuration file for usb_dev_serial. + * + * Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. + * Software License Agreement + * + * Texas Instruments (TI) is supplying this software for use solely and + * exclusively on TI's microcontroller products. The software is owned by + * TI and/or its suppliers, and is protected under applicable copyright + * laws. You may not combine this software with "viral" open-source + * software in order to form a larger program. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. + * NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT + * NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY + * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. + * + *****************************************************************************/ + +--retain=g_pfnVectors + +/* The following command line options are set as part of the CCS project. */ +/* If you are building using the command line, or for some reason want to */ +/* define them here, you can uncomment and modify these lines as needed. */ +/* If you are using CCS for building, it is probably better to make any such */ +/* modifications in your CCS project and leave this file alone. */ +/* */ +/* --heap_size=0 */ +/* --stack_size=256 */ +/* --library=rtsv7M3_T_le_eabi.lib */ + +/* The starting address of the application. Normally the interrupt vectors */ +/* must be located at the beginning of the application. */ +#define APP_BASE 0x00000000 +#define RAM_BASE 0x20000000 + +/* System memory map */ + +MEMORY +{ + /* Application stored in and executes from internal flash */ + FLASH (RX) : origin = APP_BASE, length = 0x00040000 + /* Application uses internal RAM for data */ + SRAM (RWX) : origin = 0x20000000, length = 0x00008000 +} + +/* Section allocation in memory */ + +SECTIONS +{ + .intvecs: > APP_BASE + .text : > FLASH + .const : > FLASH + .cinit : > FLASH + .pinit : > FLASH + .init_array : > FLASH + + .vtable : > RAM_BASE + .data : > SRAM + .bss : > SRAM + .sysmem : > SRAM + .stack : > SRAM +} + +__STACK_TOP = __stack + 1024; diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/usb_serial_structs.c b/boards/ek-tm4c123gxl/usb_dev_serial/usb_serial_structs.c new file mode 100644 index 0000000..bf0256f --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/usb_serial_structs.c @@ -0,0 +1,215 @@ +//***************************************************************************** +// +// usb_serial_structs.c - Data structures defining this CDC USB device. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "driverlib/usb.h" +#include "usblib/usblib.h" +#include "usblib/usbcdc.h" +#include "usblib/usb-ids.h" +#include "usblib/device/usbdevice.h" +#include "usblib/device/usbdcdc.h" +#include "usb_serial_structs.h" + +//***************************************************************************** +// +// The languages supported by this device. +// +//***************************************************************************** +const uint8_t g_pui8LangDescriptor[] = +{ + 4, + USB_DTYPE_STRING, + USBShort(USB_LANG_EN_US) +}; + +//***************************************************************************** +// +// The manufacturer string. +// +//***************************************************************************** +const uint8_t g_pui8ManufacturerString[] = +{ + (17 + 1) * 2, + USB_DTYPE_STRING, + 'T', 0, 'e', 0, 'x', 0, 'a', 0, 's', 0, ' ', 0, 'I', 0, 'n', 0, 's', 0, + 't', 0, 'r', 0, 'u', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, 's', 0, +}; + +//***************************************************************************** +// +// The product string. +// +//***************************************************************************** +const uint8_t g_pui8ProductString[] = +{ + 2 + (16 * 2), + USB_DTYPE_STRING, + 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, 'a', 0, 'l', 0, ' ', 0, + 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, 'o', 0, 'r', 0, 't', 0 +}; + +//***************************************************************************** +// +// The serial number string. +// +//***************************************************************************** +const uint8_t g_pui8SerialNumberString[] = +{ + 2 + (8 * 2), + USB_DTYPE_STRING, + '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0 +}; + +//***************************************************************************** +// +// The control interface description string. +// +//***************************************************************************** +const uint8_t g_pui8ControlInterfaceString[] = +{ + 2 + (21 * 2), + USB_DTYPE_STRING, + 'A', 0, 'C', 0, 'M', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 't', 0, + 'r', 0, 'o', 0, 'l', 0, ' ', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0, + 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0 +}; + +//***************************************************************************** +// +// The configuration description string. +// +//***************************************************************************** +const uint8_t g_pui8ConfigString[] = +{ + 2 + (26 * 2), + USB_DTYPE_STRING, + 'S', 0, 'e', 0, 'l', 0, 'f', 0, ' ', 0, 'P', 0, 'o', 0, 'w', 0, + 'e', 0, 'r', 0, 'e', 0, 'd', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, + 'f', 0, 'i', 0, 'g', 0, 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, + 'o', 0, 'n', 0 +}; + +//***************************************************************************** +// +// The descriptor string table. +// +//***************************************************************************** +const uint8_t * const g_ppui8StringDescriptors[] = +{ + g_pui8LangDescriptor, + g_pui8ManufacturerString, + g_pui8ProductString, + g_pui8SerialNumberString, + g_pui8ControlInterfaceString, + g_pui8ConfigString +}; + +#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \ + sizeof(uint8_t *)) + +//***************************************************************************** +// +// CDC device callback function prototypes. +// +//***************************************************************************** +uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +uint32_t TxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +uint32_t ControlHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +//***************************************************************************** +// +// The CDC device initialization and customization structures. In this case, +// we are using USBBuffers between the CDC device class driver and the +// application code. The function pointers and callback data values are set +// to insert a buffer in each of the data channels, transmit and receive. +// +// With the buffer in place, the CDC channel callback is set to the relevant +// channel function and the callback data is set to point to the channel +// instance data. The buffer, in turn, has its callback set to the application +// function and the callback data set to our CDC instance structure. +// +//***************************************************************************** +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; + +tUSBDCDCDevice g_sCDCDevice = +{ + USB_VID_TI_1CBE, + USB_PID_SERIAL, + 0, + USB_CONF_ATTR_SELF_PWR, + ControlHandler, + (void *)&g_sCDCDevice, + USBBufferEventCallback, + (void *)&g_sRxBuffer, + USBBufferEventCallback, + (void *)&g_sTxBuffer, + g_ppui8StringDescriptors, + NUM_STRING_DESCRIPTORS +}; + +//***************************************************************************** +// +// Receive buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBRxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8RxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sRxBuffer = +{ + false, // This is a receive buffer. + RxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device pointer. + USBDCDCPacketRead, // pfnTransfer + USBDCDCRxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pui8USBRxBuffer, // pui8Buffer + UART_BUFFER_SIZE, // ui32BufferSize + g_pui8RxBufferWorkspace // pvWorkspace +}; + +//***************************************************************************** +// +// Transmit buffer (from the USB perspective). +// +//***************************************************************************** +uint8_t g_pui8USBTxBuffer[UART_BUFFER_SIZE]; +uint8_t g_pui8TxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE]; +const tUSBBuffer g_sTxBuffer = +{ + true, // This is a transmit buffer. + TxHandler, // pfnCallback + (void *)&g_sCDCDevice, // Callback data is our device pointer. + USBDCDCPacketWrite, // pfnTransfer + USBDCDCTxPacketAvailable, // pfnAvailable + (void *)&g_sCDCDevice, // pvHandle + g_pui8USBTxBuffer, // pui8Buffer + UART_BUFFER_SIZE, // ui32BufferSize + g_pui8TxBufferWorkspace // pvWorkspace +}; diff --git a/boards/ek-tm4c123gxl/usb_dev_serial/usb_serial_structs.h b/boards/ek-tm4c123gxl/usb_dev_serial/usb_serial_structs.h new file mode 100644 index 0000000..46cebcc --- /dev/null +++ b/boards/ek-tm4c123gxl/usb_dev_serial/usb_serial_structs.h @@ -0,0 +1,49 @@ +//***************************************************************************** +// +// usb_serial_structs.h - Data structures defining this USB CDC device. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#ifndef _USB_SERIAL_STRUCTS_H_ +#define _USB_SERIAL_STRUCTS_H_ + +//***************************************************************************** +// +// The size of the transmit and receive buffers used for the redirected UART. +// This number should be a power of 2 for best performance. 256 is chosen +// pretty much at random though the buffer should be at least twice the size of +// a maxmum-sized USB packet. +// +//***************************************************************************** +#define UART_BUFFER_SIZE 256 + +extern uint32_t RxHandler(void *pvCBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); +extern uint32_t TxHandler(void *pvi32CBData, uint32_t ui32Event, + uint32_t ui32MsgValue, void *pvMsgData); + +extern const tUSBBuffer g_sTxBuffer; +extern const tUSBBuffer g_sRxBuffer; +extern tUSBDCDCDevice g_sCDCDevice; +extern uint8_t g_pui8USBTxBuffer[]; +extern uint8_t g_pui8USBRxBuffer[]; + +#endif -- cgit v1.3.1